ZGlmZiAtLWdpdCBhL0NSRURJVFMgYi9DUkVESVRTCmluZGV4IDFkZWIzMzEuLjA3ZTMyYTg3IDEwMDY0NAotLS0gYS9DUkVESVRTCisrKyBiL0NSRURJVFMKQEAgLTUwNCw3ICs1MDQsNyBAQAogRTogbGludXhAYnJvZG8uZGUKIFc6IGh0dHA6Ly93d3cuYnJvZG8uZGUvCiBQOiAxMDI0RC83MjVCMzdDNiAgMTkwRiAzRTc3IDlDODkgM0I2RCBCRUNEICA0NkVFIDY3QzMgMDMwOCA3MjVCIDM3QzYKLUQ6IHBhcnRzIG9mIENQVUZyZXEgY29kZSwgQUNQSSBidWdmaXhlcworRDogcGFydHMgb2YgQ1BVRnJlcSBjb2RlLCBBQ1BJIGJ1Z2ZpeGVzLCBQQ01DSUEgcmV3cml0ZSwgY3B1ZnJlcXV0aWxzCiBTOiBUdWViaW5nZW4sIEdlcm1hbnkKIAogTjogQW5kcmllcyBCcm91d2VyCkBAIC04NTcsNiArODU3LDEwIEBACiBTOiBSb3VuZCBSb2NrLCBUWCAgNzg2ODIKIFM6IFVTQQogCitOOiBNYXR0aWEgRG9uZ2lsaQorRTogbWFsYXR0aWFAZ21haWwuY29tCitEOiBjcHVmcmVxdXRpbHMgKHByZWN1cnNvciB0byBjcHVwb3dlcnV0aWxzKQorCiBOOiBCZW4gRG9va3MKIEU6IGJlbi1saW51eEBmbHVmZi5vcmcKIEU6IGJlbkBzaW10ZWMuY28udWsKQEAgLTE4ODMsNiArMTg4NywxMSBAQAogUzogMTA5OCBWQSBBbXN0ZXJkYW0gCiBTOiBUaGUgTmV0aGVybGFuZHMKIAorTjogR29yYW4gS29ydWdhCitFOiBrb3J1Z2FnQHNpb2wubmV0CitEOiBjcHVmcmVxdXRpbHMgKHByZWN1cnNvciB0byBjcHVwb3dlcnV0aWxzKQorUzogU2xvdmVuaWEKKwogTjogSmlyaSBLb3NpbmEKIEU6IGppa29zQGppa29zLmN6CiBFOiBqa29zaW5hQHN1c2UuY3oKQEAgLTI5MTYsNiArMjkyNSwxMiBAQAogUzogNzkwOTggRnJlaWJ1cmcKIFM6IEdlcm1hbnkKIAorTjogVGhvbWFzIFJlbm5pbmdlcgorRTogdHJlbm5Ac3VzZS5kZQorRDogY3B1cG93ZXJ1dGlscworUzogU1VTRSBMaW51eCBHbWJICitTOiBHZXJtYW55CisKIE46IEpvZXJnIFJldXRlcgogRToganJldXRlckB5YWluYS5kZQogVzogaHR0cDovL3lhaW5hLmRlL2pyZXV0ZXIvCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3BzdG9yZSBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvcHN0b3JlCmluZGV4IGRkZjQ1MWUuLmZmMWRmNGUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvcHN0b3JlCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3RpbmcvcHN0b3JlCkBAIC0zOSwzICszOSw5IEBACiAJCW11bHRpcGxlKSBmaWxlcyBiYXNlZCBvbiB0aGUgcmVjb3JkIHNpemUgb2YgdGhlIHVuZGVybHlpbmcKIAkJcGVyc2lzdGVudCBzdG9yYWdlIHVudGlsIGF0IGxlYXN0IHRoaXMgYW1vdW50IGlzIHJlYWNoZWQuCiAJCURlZmF1bHQgaXMgMTAgS2J5dGVzLgorCisJCVBzdG9yZSBvbmx5IHN1cHBvcnRzIG9uZSBiYWNrZW5kIGF0IGEgdGltZS4gSWYgbXVsdGlwbGUKKwkJYmFja2VuZHMgYXJlIGF2YWlsYWJsZSwgdGhlIHByZWZlcnJlZCBiYWNrZW5kIG1heSBiZQorCQlzZXQgYnkgcGFzc2luZyB0aGUgcHN0b3JlLmJhY2tlbmQ9IGFyZ3VtZW50IHRvIHRoZSBrZXJuZWwgYXQKKwkJYm9vdCB0aW1lLgorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svLmdpdGlnbm9yZSBiL0RvY3VtZW50YXRpb24vRG9jQm9vay8uZ2l0aWdub3JlCmluZGV4IDY3OTAzNGMuLjcyMGYyNDUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay8uZ2l0aWdub3JlCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay8uZ2l0aWdub3JlCkBAIC04LDQgKzgsNyBAQAogKi5kdmkKICoubG9nCiAqLm91dAotbWVkaWEvCisqLnBuZworKi5naWYKK21lZGlhLWluZGljZXMudG1wbAorbWVkaWEtZW50aXRpZXMudG1wbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL01ha2VmaWxlIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL01ha2VmaWxlCmluZGV4IDNjZWJmYTAuLjY2NzI1YTMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9NYWtlZmlsZQorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svTWFrZWZpbGUKQEAgLTE0LDcgKzE0LDkgQEAKIAkgICAgZ2VuZXJpY2lycS54bWwgczM5MC1kcml2ZXJzLnhtbCB1aW8taG93dG8ueG1sIHNjc2kueG1sIFwKIAkgICAgODAyMTEueG1sIGRlYnVnb2JqZWN0cy54bWwgc2gueG1sIHJlZ3VsYXRvci54bWwgXAogCSAgICBhbHNhLWRyaXZlci1hcGkueG1sIHdyaXRpbmctYW4tYWxzYS1kcml2ZXIueG1sIFwKLQkgICAgdHJhY2Vwb2ludC54bWwgbWVkaWEueG1sIGRybS54bWwKKwkgICAgdHJhY2Vwb2ludC54bWwgZHJtLnhtbCBtZWRpYV9hcGkueG1sCisKK2luY2x1ZGUgJChzcmN0cmVlKS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvTWFrZWZpbGUKIAogIyMjCiAjIFRoZSBidWlsZCBwcm9jZXNzIGlzIGFzIGZvbGxvd3MgKHRhcmdldHMpOgpAQCAtMzIsNyArMzQsNyBAQAogCiAjIyMKICMgVGhlIHRhcmdldHMgdGhhdCBtYXkgYmUgdXNlZC4KLVBIT05ZICs9IHhtbGRvY3Mgc2dtbGRvY3MgcHNkb2NzIHBkZmRvY3MgaHRtbGRvY3MgbWFuZG9jcyBpbnN0YWxsbWFuZG9jcyBjbGVhbmRvY3MgeG1sZG9jbGlua3MKK1BIT05ZICs9IHhtbGRvY3Mgc2dtbGRvY3MgcHNkb2NzIHBkZmRvY3MgaHRtbGRvY3MgbWFuZG9jcyBpbnN0YWxsbWFuZG9jcyBjbGVhbmRvY3MKIAogQk9PS1MgOj0gJChhZGRwcmVmaXggJChvYmopLywkKERPQ0JPT0tTKSkKIHhtbGRvY3M6ICQoQk9PS1MpCkBAIC00NSwyNyArNDcsMTQgQEAKIHBkZmRvY3M6ICQoUERGKQogCiBIVE1MIDo9ICQoc29ydCAkKHBhdHN1YnN0ICUueG1sLCAlLmh0bWwsICQoQk9PS1MpKSkKLWh0bWxkb2NzOiAkKEhUTUwpIHhtbGRvY2xpbmtzCitodG1sZG9jczogJChIVE1MKQogCSQoY2FsbCBidWlsZF9tYWluX2luZGV4KQogCSQoY2FsbCBidWlsZF9pbWFnZXMpCisJJChjYWxsIGluc3RhbGxfbWVkaWFfaW1hZ2VzKQogCiBNQU4gOj0gJChwYXRzdWJzdCAlLnhtbCwgJS45LCAkKEJPT0tTKSkKIG1hbmRvY3M6ICQoTUFOKQogCi1idWlsZF9pbWFnZXMgPSBta2RpciAtcCAkKG9ianRyZWUpL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS8gJiYgXAotCSAgICAgICBjcCAkKHNyY3RyZWUpL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvKi5wbmcgXAotCSAgICAgICAgICAkKHNyY3RyZWUpL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvKi5naWYgXAotCQkgICQob2JqdHJlZSkvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhLwotCi14bWxkb2NsaW5rczoKLWlmbmVxICgkKG9ianRyZWUpLCQoc3JjdHJlZSkpCi0JZm9yIGRlcCBpbiBkdmIgbWVkaWEtZW50aXRpZXMudG1wbCBtZWRpYS1pbmRpY2VzLnRtcGwgdjRsOyBkbyBcCi0JCXJtIC1mICQob2JqdHJlZSkvRG9jdW1lbnRhdGlvbi9Eb2NCb29rLyQkZGVwIFwKLQkJJiYgbG4gLXMgJChzcmN0cmVlKS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svJCRkZXAgJChvYmp0cmVlKS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svIFwKLQkJfHwgZXhpdDsgXAotCWRvbmUKLWVuZGlmCi0KIGluc3RhbGxtYW5kb2NzOiBtYW5kb2NzCiAJbWtkaXIgLXAgL3Vzci9sb2NhbC9tYW4vbWFuOS8KIAlpbnN0YWxsIERvY3VtZW50YXRpb24vRG9jQm9vay9tYW4vKi45Lmd6IC91c3IvbG9jYWwvbWFuL21hbjkvCkBAIC05NywxMSArODYsMTEgQEAKICAgICAgICAgKSA+ICQoZGlyICRAKS4kKG5vdGRpciAkQCkuY21kCiBlbmRlZgogCi0lLnhtbDogJS50bXBsIHhtbGRvY2xpbmtzIEZPUkNFCislLnhtbDogJS50bXBsIEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWRfcnVsZSxkb2Nwcm9jKQogCiAjIyMKLSNSZWFkIGluIGFsbCBzYXZlZCBkZXBlbmRlbmN5IGZpbGVzIAorI1JlYWQgaW4gYWxsIHNhdmVkIGRlcGVuZGVuY3kgZmlsZXMKIGNtZF9maWxlcyA6PSAkKHdpbGRjYXJkICQoZm9yZWFjaCBmLCQoQk9PS1MpLCQoZGlyICQoZikpLiQobm90ZGlyICQoZikpLmNtZCkpCiAKIGlmbmVxICgkKGNtZF9maWxlcyksKQpAQCAtMTUwLDcgKzEzOSw3IEBACiAKIGluZGV4ID0gaW5kZXguaHRtbAogbWFpbl9pZHggPSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svJChpbmRleCkKLWJ1aWxkX21haW5faW5kZXggPSBybSAtcmYgJChtYWluX2lkeCkgJiYgXAorYnVpbGRfbWFpbl9pbmRleCA9IHJtIC1yZiAkKG1haW5faWR4KTsgXAogCQkgICBlY2hvICc8aDE+TGludXggS2VybmVsIEhUTUwgRG9jdW1lbnRhdGlvbjwvaDE+JyA+PiAkKG1haW5faWR4KSAmJiBcCiAJCSAgIGVjaG8gJzxoMj5LZXJuZWwgVmVyc2lvbjogJChLRVJORUxWRVJTSU9OKTwvaDI+JyA+PiAkKG1haW5faWR4KSAmJiBcCiAJCSAgIGNhdCAkKEhUTUwpID4+ICQobWFpbl9pZHgpCkBAIC0yNDIsNyArMjMxLDcgQEAKIAogY2xlYW4tZGlycyA6PSAkKHBhdHN1YnN0ICUueG1sLCUsJChET0NCT09LUykpIG1hbgogCi1jbGVhbmRvY3M6CitjbGVhbmRvY3M6IGNsZWFubWVkaWFkb2NzCiAJJChRKXJtIC1mICQoY2FsbCBvYmplY3RpZnksICQoY2xlYW4tZmlsZXMpKQogCSQoUSlybSAtcmYgJChjYWxsIG9iamVjdGlmeSwgJChjbGVhbi1kaXJzKSkKIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9kdmJwcm9wZXJ0eS54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2R2YnByb3BlcnR5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUzNjVmNi4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2R2YnByb3BlcnR5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU5MCArMCwwIEBACi08c2VjdGlvbiBpZD0iRkVfR0VUX1NFVF9QUk9QRVJUWSI+Ci08dGl0bGU+RkVfR0VUX1BST1BFUlRZL0ZFX1NFVF9QUk9QRVJUWTwvdGl0bGU+Ci0KLTxwcm9ncmFtbGlzdGluZz4KLS8qIFJlc2VydmVkIGZpZWxkcyBzaG91bGQgYmUgc2V0IHRvIDAgKi8KLXN0cnVjdCBkdHZfcHJvcGVydHkgewotCV9fdTMyIGNtZDsKLQl1bmlvbiB7Ci0JCV9fdTMyIGRhdGE7Ci0JCXN0cnVjdCB7Ci0JCQlfX3U4IGRhdGFbMzJdOwotCQkJX191MzIgbGVuOwotCQkJX191MzIgcmVzZXJ2ZWQxWzNdOwotCQkJdm9pZCAqcmVzZXJ2ZWQyOwotCQl9IGJ1ZmZlcjsKLQl9IHU7Ci0JaW50IHJlc3VsdDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKiBudW0gb2YgcHJvcGVydGllcyBjYW5ub3QgZXhjZWVkIERUVl9JT0NUTF9NQVhfTVNHUyBwZXIgaW9jdGwgKi8KLSNkZWZpbmUgRFRWX0lPQ1RMX01BWF9NU0dTIDY0Ci0KLXN0cnVjdCBkdHZfcHJvcGVydGllcyB7Ci0JX191MzIgbnVtOwotCXN0cnVjdCBkdHZfcHJvcGVydHkgKnByb3BzOwotfTsKLTwvcHJvZ3JhbWxpc3Rpbmc+Ci0KLTxzZWN0aW9uIGlkPSJGRV9HRVRfUFJPUEVSVFkiPgotPHRpdGxlPkZFX0dFVF9QUk9QRVJUWTwvdGl0bGU+Ci08cGFyYT5ERVNDUklQVElPTgotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIxIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5UaGlzIGlvY3RsIGNhbGwgcmV0dXJucyBvbmUgb3IgbW9yZSBmcm9udGVuZCBwcm9wZXJ0aWVzLiBUaGlzIGNhbGwgb25seQotIHJlcXVpcmVzIHJlYWQtb25seSBhY2Nlc3MgdG8gdGhlIGRldmljZS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+U1lOT1BTSVMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMSI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+aW50IGlvY3RsKGludCBmZCwgaW50IHJlcXVlc3QgPSA8bGluayBsaW5rZW5kPSJGRV9HRVRfUFJPUEVSVFkiPkZFX0dFVF9QUk9QRVJUWTwvbGluaz4sCi0gZHR2X3Byb3BlcnRpZXMgJiN4MjJDNjtwcm9wcyk7PC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPlBBUkFNRVRFUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5IGFsaWduPSJjaGFyIj4KLTxwYXJhPmludCBmZDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RmlsZSBkZXNjcmlwdG9yIHJldHVybmVkIGJ5IGEgcHJldmlvdXMgY2FsbCB0byBvcGVuKCkuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmludCBudW08L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVxdWFscyA8bGluayBsaW5rZW5kPSJGRV9HRVRfUFJPUEVSVFkiPkZFX0dFVF9QUk9QRVJUWTwvbGluaz4gZm9yIHRoaXMgY29tbWFuZC48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+c3RydWN0IGR0dl9wcm9wZXJ0eSAqcHJvcHM8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPlBvaW50cyB0byB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGZyb250LWVuZCBwcm9wZXJ0eSBjb21tYW5kcyBhcmUgc3RvcmVkLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlM8L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PgotICA8ZW50cnkgYWxpZ249ImNoYXIiPjxwYXJhPkVJTlZBTDwvcGFyYT48L2VudHJ5PgotICA8ZW50cnkgYWxpZ249ImNoYXIiPjxwYXJhPkludmFsaWQgcGFyYW1ldGVyKHMpIHJlY2VpdmVkIG9yIG51bWJlciBvZiBwYXJhbWV0ZXJzIG91dCBvZiB0aGUgcmFuZ2UuPC9wYXJhPjwvZW50cnk+Ci0gPC9yb3c+PHJvdz4KLSAgPGVudHJ5IGFsaWduPSJjaGFyIj48cGFyYT5FTk9NRU08L3BhcmE+PC9lbnRyeT4KLSAgPGVudHJ5IGFsaWduPSJjaGFyIj48cGFyYT5PdXQgb2YgbWVtb3J5LjwvcGFyYT48L2VudHJ5PgotIDwvcm93Pjxyb3c+Ci0gIDxlbnRyeSBhbGlnbj0iY2hhciI+PHBhcmE+RUZBVUxUPC9wYXJhPjwvZW50cnk+Ci0gIDxlbnRyeSBhbGlnbj0iY2hhciI+PHBhcmE+RmFpbHVyZSB3aGlsZSBjb3B5aW5nIGRhdGEgZnJvbS90byB1c2Vyc3BhY2UuPC9wYXJhPjwvZW50cnk+Ci0gPC9yb3c+PHJvdz4KLSAgPGVudHJ5IGFsaWduPSJjaGFyIj48cGFyYT5FT1BOT1RTVVBQPC9wYXJhPjwvZW50cnk+Ci0gIDxlbnRyeSBhbGlnbj0iY2hhciI+PHBhcmE+UHJvcGVydHkgdHlwZSBub3Qgc3VwcG9ydGVkLjwvcGFyYT48L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPC9zZWN0aW9uPgotCi08c2VjdGlvbiBpZD0iRkVfU0VUX1BST1BFUlRZIj4KLTx0aXRsZT5GRV9TRVRfUFJPUEVSVFk8L3RpdGxlPgotPHBhcmE+REVTQ1JJUFRJT04KLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMSI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+VGhpcyBpb2N0bCBjYWxsIHNldHMgb25lIG9yIG1vcmUgZnJvbnRlbmQgcHJvcGVydGllcy4gVGhpcyBjYWxsIG9ubHkKLSByZXF1aXJlcyByZWFkLW9ubHkgYWNjZXNzIHRvIHRoZSBkZXZpY2UuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPlNZTk9QU0lTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjEiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmludCBpb2N0bChpbnQgZmQsIGludCByZXF1ZXN0ID0gPGxpbmsgbGlua2VuZD0iRkVfU0VUX1BST1BFUlRZIj5GRV9TRVRfUFJPUEVSVFk8L2xpbms+LAotIGR0dl9wcm9wZXJ0aWVzICYjeDIyQzY7cHJvcHMpOzwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5QQVJBTUVURVJTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeSBhbGlnbj0iY2hhciI+Ci08cGFyYT5pbnQgZmQ8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkZpbGUgZGVzY3JpcHRvciByZXR1cm5lZCBieSBhIHByZXZpb3VzIGNhbGwgdG8gb3BlbigpLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5pbnQgbnVtPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FcXVhbHMgPGxpbmsgbGlua2VuZD0iRkVfU0VUX1BST1BFUlRZIj5GRV9TRVRfUFJPUEVSVFk8L2xpbms+IGZvciB0aGlzIGNvbW1hbmQuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPnN0cnVjdCBkdHZfcHJvcGVydHkgKnByb3BzPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5Qb2ludHMgdG8gdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBmcm9udC1lbmQgcHJvcGVydHkgY29tbWFuZHMgYXJlIHN0b3JlZC48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PgotICA8ZW50cnkgYWxpZ249ImNoYXIiPjxwYXJhPkVJTlZBTDwvcGFyYT48L2VudHJ5PgotICA8ZW50cnkgYWxpZ249ImNoYXIiPjxwYXJhPkludmFsaWQgcGFyYW1ldGVyKHMpIHJlY2VpdmVkIG9yIG51bWJlciBvZiBwYXJhbWV0ZXJzIG91dCBvZiB0aGUgcmFuZ2UuPC9wYXJhPjwvZW50cnk+Ci0gPC9yb3c+PHJvdz4KLSAgPGVudHJ5IGFsaWduPSJjaGFyIj48cGFyYT5FTk9NRU08L3BhcmE+PC9lbnRyeT4KLSAgPGVudHJ5IGFsaWduPSJjaGFyIj48cGFyYT5PdXQgb2YgbWVtb3J5LjwvcGFyYT48L2VudHJ5PgotIDwvcm93Pjxyb3c+Ci0gIDxlbnRyeSBhbGlnbj0iY2hhciI+PHBhcmE+RUZBVUxUPC9wYXJhPjwvZW50cnk+Ci0gIDxlbnRyeSBhbGlnbj0iY2hhciI+PHBhcmE+RmFpbHVyZSB3aGlsZSBjb3B5aW5nIGRhdGEgZnJvbS90byB1c2Vyc3BhY2UuPC9wYXJhPjwvZW50cnk+Ci0gPC9yb3c+PHJvdz4KLSAgPGVudHJ5IGFsaWduPSJjaGFyIj48cGFyYT5FT1BOT1RTVVBQPC9wYXJhPjwvZW50cnk+Ci0gIDxlbnRyeSBhbGlnbj0iY2hhciI+PHBhcmE+UHJvcGVydHkgdHlwZSBub3Qgc3VwcG9ydGVkLjwvcGFyYT48L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPC9zZWN0aW9uPgotCi08c2VjdGlvbj4KLQk8dGl0bGU+UHJvcGVydHkgdHlwZXM8L3RpdGxlPgotPHBhcmE+Ci1PbiA8bGluayBsaW5rZW5kPSJGRV9HRVRfUFJPUEVSVFkiPkZFX0dFVF9QUk9QRVJUWTwvbGluaz4vPGxpbmsgbGlua2VuZD0iRkVfU0VUX1BST1BFUlRZIj5GRV9TRVRfUFJPUEVSVFk8L2xpbms+LAotdGhlIGFjdHVhbCBhY3Rpb24gaXMgZGV0ZXJtaW5lZCBieSB0aGUgZHR2X3Byb3BlcnR5IGNtZC9kYXRhIHBhaXJzLiBXaXRoIG9uZSBzaW5nbGUgaW9jdGwsIGlzIHBvc3NpYmxlIHRvCi1nZXQvc2V0IHVwIHRvIDY0IHByb3BlcnRpZXMuIFRoZSBhY3R1YWwgbWVhbmluZyBvZiBlYWNoIHByb3BlcnR5IGlzIGRlc2NyaWJlZCBvbiB0aGUgbmV4dCBzZWN0aW9ucy4KLTwvcGFyYT4KLQotPHBhcmE+VGhlIGF2YWlsYWJsZSBmcm9udGVuZCBwcm9wZXJ0eSB0eXBlcyBhcmU6PC9wYXJhPgotPHByb2dyYW1saXN0aW5nPgotI2RlZmluZSBEVFZfVU5ERUZJTkVECQkwCi0jZGVmaW5lIERUVl9UVU5FCQkxCi0jZGVmaW5lIERUVl9DTEVBUgkJMgotI2RlZmluZSBEVFZfRlJFUVVFTkNZCQkzCi0jZGVmaW5lIERUVl9NT0RVTEFUSU9OCQk0Ci0jZGVmaW5lIERUVl9CQU5EV0lEVEhfSFoJNQotI2RlZmluZSBEVFZfSU5WRVJTSU9OCQk2Ci0jZGVmaW5lIERUVl9ESVNFUUNfTUFTVEVSCTcKLSNkZWZpbmUgRFRWX1NZTUJPTF9SQVRFCQk4Ci0jZGVmaW5lIERUVl9JTk5FUl9GRUMJCTkKLSNkZWZpbmUgRFRWX1ZPTFRBR0UJCTEwCi0jZGVmaW5lIERUVl9UT05FCQkxMQotI2RlZmluZSBEVFZfUElMT1QJCTEyCi0jZGVmaW5lIERUVl9ST0xMT0ZGCQkxMwotI2RlZmluZSBEVFZfRElTRVFDX1NMQVZFX1JFUExZCTE0Ci0jZGVmaW5lIERUVl9GRV9DQVBBQklMSVRZX0NPVU5UCTE1Ci0jZGVmaW5lIERUVl9GRV9DQVBBQklMSVRZCTE2Ci0jZGVmaW5lIERUVl9ERUxJVkVSWV9TWVNURU0JMTcKLSNkZWZpbmUgRFRWX0lTREJUX1BBUlRJQUxfUkVDRVBUSU9OCTE4Ci0jZGVmaW5lIERUVl9JU0RCVF9TT1VORF9CUk9BRENBU1RJTkcJMTkKLSNkZWZpbmUgRFRWX0lTREJUX1NCX1NVQkNIQU5ORUxfSUQJMjAKLSNkZWZpbmUgRFRWX0lTREJUX1NCX1NFR01FTlRfSURYCTIxCi0jZGVmaW5lIERUVl9JU0RCVF9TQl9TRUdNRU5UX0NPVU5UCTIyCi0jZGVmaW5lIERUVl9JU0RCVF9MQVlFUkFfRkVDCQkJMjMKLSNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQV9NT0RVTEFUSU9OCQkyNAotI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJBX1NFR01FTlRfQ09VTlQJCTI1Ci0jZGVmaW5lIERUVl9JU0RCVF9MQVlFUkFfVElNRV9JTlRFUkxFQVZJTkcJMjYKLSNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQl9GRUMJCQkyNwotI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJCX01PRFVMQVRJT04JCTI4Ci0jZGVmaW5lIERUVl9JU0RCVF9MQVlFUkJfU0VHTUVOVF9DT1VOVAkJMjkKLSNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQl9USU1FX0lOVEVSTEVBVklORwkzMAotI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJDX0ZFQwkJCTMxCi0jZGVmaW5lIERUVl9JU0RCVF9MQVlFUkNfTU9EVUxBVElPTgkJMzIKLSNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQ19TRUdNRU5UX0NPVU5UCQkzMwotI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJDX1RJTUVfSU5URVJMRUFWSU5HCTM0Ci0jZGVmaW5lIERUVl9BUElfVkVSU0lPTgkJMzUKLSNkZWZpbmUgRFRWX0NPREVfUkFURV9IUAkzNgotI2RlZmluZSBEVFZfQ09ERV9SQVRFX0xQCTM3Ci0jZGVmaW5lIERUVl9HVUFSRF9JTlRFUlZBTAkzOAotI2RlZmluZSBEVFZfVFJBTlNNSVNTSU9OX01PREUJMzkKLSNkZWZpbmUgRFRWX0hJRVJBUkNIWQkJNDAKLSNkZWZpbmUgRFRWX0lTREJUX0xBWUVSX0VOQUJMRUQJNDEKLSNkZWZpbmUgRFRWX0lTREJTX1RTX0lECQk0MgotPC9wcm9ncmFtbGlzdGluZz4KLTwvc2VjdGlvbj4KLQotPHNlY3Rpb24gaWQ9ImZlX3Byb3BlcnR5X2NvbW1vbiI+Ci0JPHRpdGxlPlBhcmFtZXRlcnMgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCBEaWdpdGFsIFRWIHN0YW5kYXJkczwvdGl0bGU+Ci0JPHNlY3Rpb24gaWQ9IkRUVl9GUkVRVUVOQ1kiPgotCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9GUkVRVUVOQ1k8L2NvbnN0YW50PjwvdGl0bGU+Ci0KLQkJPHBhcmE+Q2VudHJhbCBmcmVxdWVuY3kgb2YgdGhlIGNoYW5uZWwsIGluIEhaLjwvcGFyYT4KLQotCQk8cGFyYT5Ob3Rlczo8L3BhcmE+Ci0JCTxwYXJhPjEpRm9yIElTREItVCwgdGhlIGNoYW5uZWxzIGFyZSB1c3VhbGx5IHRyYW5zbWl0dGVkIHdpdGggYW4gb2Zmc2V0IG9mIDE0M2tIei4KLQkJCUUuZy4gYSB2YWxpZCBmcmVxdW5jeSBjb3VsZCBiZSA0NzQxNDMga0h6LiBUaGUgc3RlcHBpbmcgaXMgYm91bmQgdG8gdGhlIGJhbmR3aWR0aCBvZgotCQkJdGhlIGNoYW5uZWwgd2hpY2ggaXMgNk1Iei48L3BhcmE+Ci0KLQkJPHBhcmE+MilBcyBpbiBJU0RCLVRzYiB0aGUgY2hhbm5lbCBjb25zaXN0cyBvZiBvbmx5IG9uZSBvciB0aHJlZSBzZWdtZW50cyB0aGUKLQkJCWZyZXF1ZW5jeSBzdGVwIGlzIDQyOWtIeiwgMyo0MjkgcmVzcGVjdGl2ZWx5LiBBcyBmb3IgSVNEQi1UIHRoZQotCQkJY2VudHJhbCBmcmVxdWVuY3kgb2YgdGhlIGNoYW5uZWwgaXMgZXhwZWN0ZWQuPC9wYXJhPgotCTwvc2VjdGlvbj4KLQotCTxzZWN0aW9uIGlkPSJEVFZfQkFORFdJRFRIX0haIj4KLQkJPHRpdGxlPjxjb25zdGFudD5EVFZfQkFORFdJRFRIX0haPC9jb25zdGFudD48L3RpdGxlPgotCi0JCTxwYXJhPkJhbmR3aWR0aCBmb3IgdGhlIGNoYW5uZWwsIGluIEhaLjwvcGFyYT4KLQotCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6Ci0JCQk8Y29uc3RhbnQ+MTcxMjAwMDwvY29uc3RhbnQ+LAotCQkJPGNvbnN0YW50PjUwMDAwMDA8L2NvbnN0YW50PiwKLQkJCTxjb25zdGFudD42MDAwMDAwPC9jb25zdGFudD4sCi0JCQk8Y29uc3RhbnQ+NzAwMDAwMDwvY29uc3RhbnQ+LAotCQkJPGNvbnN0YW50PjgwMDAwMDA8L2NvbnN0YW50PiwKLQkJCTxjb25zdGFudD4xMDAwMDAwMDwvY29uc3RhbnQ+LgotCQk8L3BhcmE+Ci0KLQkJPHBhcmE+Tm90ZXM6PC9wYXJhPgotCi0JCTxwYXJhPjEpIEZvciBJU0RCLVQgaXQgc2hvdWxkIGJlIGFsd2F5cyA2MDAwMDAwSHogKDZNSHopPC9wYXJhPgotCQk8cGFyYT4yKSBGb3IgSVNEQi1Uc2IgaXQgY2FuIHZhcnkgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgY29ubmVjdGVkIHNlZ21lbnRzPC9wYXJhPgotCQk8cGFyYT4zKSBCYW5kd2lkdGggZG9lc24ndCBhcHBseSBmb3IgRFZCLUMgdHJhbnNtaXNzaW9ucywgYXMgdGhlIGJhbmR3aWR0aAotCQkJIGZvciBEVkItQyBkZXBlbmRzIG9uIHRoZSBzeW1ib2wgcmF0ZTwvcGFyYT4KLQkJPHBhcmE+NCkgQmFuZHdpZHRoIGluIElTREItVCBpcyBmaXhlZCAoNk1Ieikgb3IgY2FuIGJlIGVhc2lseSBkZXJpdmVkIGZyb20KLQkJCW90aGVyIHBhcmFtZXRlcnMgKERUVl9JU0RCVF9TQl9TRUdNRU5UX0lEWCwKLQkJCURUVl9JU0RCVF9TQl9TRUdNRU5UX0NPVU5UKS48L3BhcmE+Ci0JCTxwYXJhPjUpIERWQi1UIHN1cHBvcnRzIDYsIDcgYW5kIDhNSHouPC9wYXJhPgotCQk8cGFyYT42KSBJbiBhZGRpdGlvbiwgRFZCLVQyIHN1cHBvcnRzIDEuMTcyLCA1IGFuZCAxME1Iei48L3BhcmE+Ci0JPC9zZWN0aW9uPgotCi0JPHNlY3Rpb24gaWQ9IkRUVl9ERUxJVkVSWV9TWVNURU0iPgotCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9ERUxJVkVSWV9TWVNURU08L2NvbnN0YW50PjwvdGl0bGU+Ci0KLQkJPHBhcmE+U3BlY2lmaWVzIHRoZSB0eXBlIG9mIERlbGl2ZXJ5IHN5c3RlbTwvcGFyYT4KLQotCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6IDwvcGFyYT4KLTxwcm9ncmFtbGlzdGluZz4KLXR5cGVkZWYgZW51bSBmZV9kZWxpdmVyeV9zeXN0ZW0gewotCVNZU19VTkRFRklORUQsCi0JU1lTX0RWQkNfQU5ORVhfQUMsCi0JU1lTX0RWQkNfQU5ORVhfQiwKLQlTWVNfRFZCVCwKLQlTWVNfRFNTLAotCVNZU19EVkJTLAotCVNZU19EVkJTMiwKLQlTWVNfRFZCSCwKLQlTWVNfSVNEQlQsCi0JU1lTX0lTREJTLAotCVNZU19JU0RCQywKLQlTWVNfQVRTQywKLQlTWVNfQVRTQ01ILAotCVNZU19ETUJUSCwKLQlTWVNfQ01NQiwKLQlTWVNfREFCLAotCVNZU19EVkJUMiwKLX0gZmVfZGVsaXZlcnlfc3lzdGVtX3Q7Ci08L3Byb2dyYW1saXN0aW5nPgotCi0JPC9zZWN0aW9uPgotCi0JPHNlY3Rpb24gaWQ9IkRUVl9UUkFOU01JU1NJT05fTU9ERSI+Ci0JCTx0aXRsZT48Y29uc3RhbnQ+RFRWX1RSQU5TTUlTU0lPTl9NT0RFPC9jb25zdGFudD48L3RpdGxlPgotCi0JCTxwYXJhPlNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNhcnJpZXJzIHVzZWQgYnkgdGhlIHN0YW5kYXJkPC9wYXJhPgotCi0JCTxwYXJhPlBvc3NpYmxlIHZhbHVlcyBhcmU6PC9wYXJhPgotPHByb2dyYW1saXN0aW5nPgotdHlwZWRlZiBlbnVtIGZlX3RyYW5zbWl0X21vZGUgewotCVRSQU5TTUlTU0lPTl9NT0RFXzJLLAotCVRSQU5TTUlTU0lPTl9NT0RFXzhLLAotCVRSQU5TTUlTU0lPTl9NT0RFX0FVVE8sCi0JVFJBTlNNSVNTSU9OX01PREVfNEssCi0JVFJBTlNNSVNTSU9OX01PREVfMUssCi0JVFJBTlNNSVNTSU9OX01PREVfMTZLLAotCVRSQU5TTUlTU0lPTl9NT0RFXzMySywKLX0gZmVfdHJhbnNtaXRfbW9kZV90OwotPC9wcm9ncmFtbGlzdGluZz4KLQotCQk8cGFyYT5Ob3Rlczo8L3BhcmE+Ci0JCTxwYXJhPjEpIElTREItVCBzdXBwb3J0cyB0aHJlZSBjYXJyaWVyL3N5bWJvbC1zaXplOiA4SywgNEssIDJLLiBJdCBpcyBjYWxsZWQKLQkJCSdtb2RlJyBpbiB0aGUgc3RhbmRhcmQ6IE1vZGUgMSBpcyAySywgbW9kZSAyIGlzIDRLLCBtb2RlIDMgaXMgOEs8L3BhcmE+Ci0KLQkJPHBhcmE+MikgSWYgPGNvbnN0YW50PkRUVl9UUkFOU01JU1NJT05fTU9ERTwvY29uc3RhbnQ+IGlzIHNldCB0aGUgPGNvbnN0YW50PlRSQU5TTUlTU0lPTl9NT0RFX0FVVE88L2NvbnN0YW50PiB0aGUKLQkJCWhhcmR3YXJlIHdpbGwgdHJ5IHRvIGZpbmQgdGhlIGNvcnJlY3QgRkZULXNpemUgKGlmIGNhcGFibGUpIGFuZCB3aWxsCi0JCQl1c2UgVE1DQyB0byBmaWxsIGluIHRoZSBtaXNzaW5nIHBhcmFtZXRlcnMuPC9wYXJhPgotCQk8cGFyYT4zKSBEVkItVCBzcGVjaWZpZXMgMksgYW5kIDhLIGFzIHZhbGlkIHNpemVzLjwvcGFyYT4KLQkJPHBhcmE+NCkgRFZCLVQyIHNwZWNpZmllcyAxSywgMkssIDRLLCA4SywgMTZLIGFuZCAzMksuPC9wYXJhPgotCTwvc2VjdGlvbj4KLQotCTxzZWN0aW9uIGlkPSJEVFZfR1VBUkRfSU5URVJWQUwiPgotCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9HVUFSRF9JTlRFUlZBTDwvY29uc3RhbnQ+PC90aXRsZT4KLQotCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXMgYXJlOjwvcGFyYT4KLTxwcm9ncmFtbGlzdGluZz4KLXR5cGVkZWYgZW51bSBmZV9ndWFyZF9pbnRlcnZhbCB7Ci0JR1VBUkRfSU5URVJWQUxfMV8zMiwKLQlHVUFSRF9JTlRFUlZBTF8xXzE2LAotCUdVQVJEX0lOVEVSVkFMXzFfOCwKLQlHVUFSRF9JTlRFUlZBTF8xXzQsCi0JR1VBUkRfSU5URVJWQUxfQVVUTywKLQlHVUFSRF9JTlRFUlZBTF8xXzEyOCwKLQlHVUFSRF9JTlRFUlZBTF8xOV8xMjgsCi0JR1VBUkRfSU5URVJWQUxfMTlfMjU2LAotfSBmZV9ndWFyZF9pbnRlcnZhbF90OwotPC9wcm9ncmFtbGlzdGluZz4KLQotCQk8cGFyYT5Ob3Rlczo8L3BhcmE+Ci0JCTxwYXJhPjEpIElmIDxjb25zdGFudD5EVFZfR1VBUkRfSU5URVJWQUw8L2NvbnN0YW50PiBpcyBzZXQgdGhlIDxjb25zdGFudD5HVUFSRF9JTlRFUlZBTF9BVVRPPC9jb25zdGFudD4gdGhlIGhhcmR3YXJlIHdpbGwKLQkJCXRyeSB0byBmaW5kIHRoZSBjb3JyZWN0IGd1YXJkIGludGVydmFsIChpZiBjYXBhYmxlKSBhbmQgd2lsbCB1c2UgVE1DQyB0byBmaWxsCi0JCQlpbiB0aGUgbWlzc2luZyBwYXJhbWV0ZXJzLjwvcGFyYT4KLQkJPHBhcmE+MikgSW50ZXJ2YWxzIDEvMTI4LCAxOS8xMjggYW5kIDE5LzI1NiBhcmUgdXNlZCBvbmx5IGZvciBEVkItVDIgYXQgcHJlc2VudDwvcGFyYT4KLQk8L3NlY3Rpb24+Ci08L3NlY3Rpb24+Ci0KLTxzZWN0aW9uIGlkPSJpc2RidCI+Ci0JPHRpdGxlPklTREItVCBmcm9udGVuZDwvdGl0bGU+Ci0JPHBhcmE+VGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBzaG9ydGx5IHdoYXQgYXJlIHRoZSBwb3NzaWJsZSBwYXJhbWV0ZXJzIGluIHRoZSBMaW51eAotCQlEVkItQVBJIGNhbGxlZCAiUzJBUEkiIGFuZCBub3cgRFZCIEFQSSA1IGluIG9yZGVyIHRvIHR1bmUgYW4gSVNEQi1UL0lTREItVHNiCi0JCWRlbW9kdWxhdG9yOjwvcGFyYT4KLQotCTxwYXJhPlRoaXMgSVNEQi1UL0lTREItVHNiIEFQSSBleHRlbnNpb24gc2hvdWxkIHJlZmxlY3QgYWxsIGluZm9ybWF0aW9uCi0JCW5lZWRlZCB0byB0dW5lIGFueSBJU0RCLVQvSVNEQi1Uc2IgaGFyZHdhcmUuIE9mIGNvdXJzZSBpdCBpcyBwb3NzaWJsZQotCQl0aGF0IHNvbWUgdmVyeSBzb3BoaXN0aWNhdGVkIGRldmljZXMgd29uJ3QgbmVlZCBjZXJ0YWluIHBhcmFtZXRlcnMgdG8KLQkJdHVuZS48L3BhcmE+Ci0KLQk8cGFyYT5UaGUgaW5mb3JtYXRpb24gZ2l2ZW4gaGVyZSBzaG91bGQgaGVscCBhcHBsaWNhdGlvbiB3cml0ZXJzIHRvIGtub3cgaG93Ci0JCXRvIGhhbmRsZSBJU0RCLVQgYW5kIElTREItVHNiIGhhcmR3YXJlIHVzaW5nIHRoZSBMaW51eCBEVkItQVBJLjwvcGFyYT4KLQotCTxwYXJhPlRoZSBkZXRhaWxzIGdpdmVuIGhlcmUgYWJvdXQgSVNEQi1UIGFuZCBJU0RCLVRzYiBhcmUganVzdCBlbm91Z2ggdG8KLQkJYmFzaWNhbGx5IHNob3cgdGhlIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHRoZSBuZWVkZWQgcGFyYW1ldGVyIHZhbHVlcywKLQkJYnV0IHN1cmVseSBzb21lIGluZm9ybWF0aW9uIGlzIGxlZnQgb3V0LiBGb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbgotCQlzZWUgdGhlIGZvbGxvd2luZyBkb2N1bWVudHM6PC9wYXJhPgotCi0JPHBhcmE+QVJJQiBTVEQtQjMxIC0gIlRyYW5zbWlzc2lvbiBTeXN0ZW0gZm9yIERpZ2l0YWwgVGVycmVzdHJpYWwKLQkJVGVsZXZpc2lvbiBCcm9hZGNhc3RpbmciIGFuZDwvcGFyYT4KLQk8cGFyYT5BUklCIFRSLUIxNCAtICJPcGVyYXRpb25hbCBHdWlkZWxpbmVzIGZvciBEaWdpdGFsIFRlcnJlc3RyaWFsCi0JCVRlbGV2aXNpb24gQnJvYWRjYXN0aW5nIi48L3BhcmE+Ci0KLQk8cGFyYT5JbiBvcmRlciB0byByZWFkIHRoaXMgZG9jdW1lbnQgb25lIGhhcyB0byBoYXZlIHNvbWUga25vd2xlZGdlIHRoZQotCQljaGFubmVsIHN0cnVjdHVyZSBpbiBJU0RCLVQgYW5kIElTREItVHNiLiBJLmUuIGl0IGhhcyB0byBiZSBrbm93biB0bwotCQl0aGUgcmVhZGVyIHRoYXQgYW4gSVNEQi1UIGNoYW5uZWwgY29uc2lzdHMgb2YgMTMgc2VnbWVudHMsIHRoYXQgaXQgY2FuCi0JCWhhdmUgdXAgdG8gMyBsYXllciBzaGFyaW5nIHRob3NlIHNlZ21lbnRzLCBhbmQgdGhpbmdzIGxpa2UgdGhhdC48L3BhcmE+Ci0KLQk8cGFyYT5QYXJhbWV0ZXJzIHVzZWQgYnkgSVNEQi1UIGFuZCBJU0RCLVRzYi48L3BhcmE+Ci0KLQk8c2VjdGlvbiBpZD0iaXNkYnQtbmV3LXBhcm1zIj4KLQkJPHRpdGxlPklTREItVCBvbmx5IHBhcmFtZXRlcnM8L3RpdGxlPgotCi0JCTxzZWN0aW9uIGlkPSJpc2RidC1wYXJ0LXJlYyI+Ci0JCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9JU0RCVF9QQVJUSUFMX1JFQ0VQVElPTjwvY29uc3RhbnQ+PC90aXRsZT4KLQotCQkJPHBhcmE+PGNvbnN0YW50PklmIERUVl9JU0RCVF9TT1VORF9CUk9BRENBU1RJTkc8L2NvbnN0YW50PiBpcyAnMCcgdGhpcyBiaXQtZmllbGQgcmVwcmVzZW50cyB3aGV0aGVyCi0JCQkJdGhlIGNoYW5uZWwgaXMgaW4gcGFydGlhbCByZWNlcHRpb24gbW9kZSBvciBub3QuPC9wYXJhPgotCi0JCQk8cGFyYT5JZiAnMScgPGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUkFfKjwvY29uc3RhbnQ+IHZhbHVlcyBhcmUgYXNzaWduZWQgdG8gdGhlIGNlbnRlciBzZWdtZW50IGFuZAotCQkJCTxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVJBX1NFR01FTlRfQ09VTlQ8L2NvbnN0YW50PiBoYXMgdG8gYmUgJzEnLjwvcGFyYT4KLQotCQkJPHBhcmE+SWYgaW4gYWRkaXRpb24gPGNvbnN0YW50PkRUVl9JU0RCVF9TT1VORF9CUk9BRENBU1RJTkc8L2NvbnN0YW50PiBpcyAnMScKLQkJCQk8Y29uc3RhbnQ+RFRWX0lTREJUX1BBUlRJQUxfUkVDRVBUSU9OPC9jb25zdGFudD4gcmVwcmVzZW50cyB3aGV0aGVyIHRoaXMgSVNEQi1Uc2IgY2hhbm5lbAotCQkJCWlzIGNvbnNpc3Rpbmcgb2Ygb25lIHNlZ21lbnQgYW5kIGxheWVyIG9yIHRocmVlIHNlZ21lbnRzIGFuZCB0d28gbGF5ZXJzLjwvcGFyYT4KLQotCQkJPHBhcmE+UG9zc2libGUgdmFsdWVzOiAwLCAxLCAtMSAoQVVUTyk8L3BhcmE+Ci0JCTwvc2VjdGlvbj4KLQotCQk8c2VjdGlvbiBpZD0iaXNkYnQtc291bmQtYmNhc3QiPgotCQkJPHRpdGxlPjxjb25zdGFudD5EVFZfSVNEQlRfU09VTkRfQlJPQURDQVNUSU5HPC9jb25zdGFudD48L3RpdGxlPgotCi0JCQk8cGFyYT5UaGlzIGZpZWxkIHJlcHJlc2VudHMgd2hldGhlciB0aGUgb3RoZXIgRFRWX0lTREJUXyotcGFyYW1ldGVycyBhcmUKLQkJCQlyZWZlcnJpbmcgdG8gYW4gSVNEQi1UIGFuZCBhbiBJU0RCLVRzYiBjaGFubmVsLiAoU2VlIGFsc28KLQkJCQk8Y29uc3RhbnQ+RFRWX0lTREJUX1BBUlRJQUxfUkVDRVBUSU9OPC9jb25zdGFudD4pLjwvcGFyYT4KLQotCQkJPHBhcmE+UG9zc2libGUgdmFsdWVzOiAwLCAxLCAtMSAoQVVUTyk8L3BhcmE+Ci0JCTwvc2VjdGlvbj4KLQotCQk8c2VjdGlvbiBpZD0iaXNkYnQtc2ItY2gtaWQiPgotCQkJPHRpdGxlPjxjb25zdGFudD5EVFZfSVNEQlRfU0JfU1VCQ0hBTk5FTF9JRDwvY29uc3RhbnQ+PC90aXRsZT4KLQotCQkJPHBhcmE+VGhpcyBmaWVsZCBvbmx5IGFwcGxpZXMgaWYgPGNvbnN0YW50PkRUVl9JU0RCVF9TT1VORF9CUk9BRENBU1RJTkc8L2NvbnN0YW50PiBpcyAnMScuPC9wYXJhPgotCi0JCQk8cGFyYT4oTm90ZSBvZiB0aGUgYXV0aG9yOiBUaGlzIG1pZ2h0IG5vdCBiZSB0aGUgY29ycmVjdCBkZXNjcmlwdGlvbiBvZiB0aGUKLQkJCQk8Y29uc3RhbnQ+U1VCQ0hBTk5FTC1JRDwvY29uc3RhbnQ+IGluIGFsbCBkZXRhaWxzLCBidXQgaXQgaXMgbXkgdW5kZXJzdGFuZGluZyBvZiB0aGUgdGVjaG5pY2FsCi0JCQkJYmFja2dyb3VuZCBuZWVkZWQgdG8gcHJvZ3JhbSBhIGRldmljZSk8L3BhcmE+Ci0KLQkJCTxwYXJhPkFuIElTREItVHNiIGNoYW5uZWwgKDEgb3IgMyBzZWdtZW50cykgY2FuIGJlIGJyb2FkY2FzdGVkIGFsb25lIG9yIGluIGEKLQkJCQlzZXQgb2YgY29ubmVjdGVkIElTREItVHNiIGNoYW5uZWxzLiBJbiB0aGlzIHNldCBvZiBjaGFubmVscyBldmVyeQotCQkJCWNoYW5uZWwgY2FuIGJlIHJlY2VpdmVkIGluZGVwZW5kZW50bHkuIFRoZSBudW1iZXIgb2YgY29ubmVjdGVkCi0JCQkJSVNEQi1Uc2Igc2VnbWVudCBjYW4gdmFyeSwgZS5nLiBkZXBlbmRpbmcgb24gdGhlIGZyZXF1ZW5jeSBzcGVjdHJ1bQotCQkJCWJhbmR3aWR0aCBhdmFpbGFibGUuPC9wYXJhPgotCi0JCQk8cGFyYT5FeGFtcGxlOiBBc3N1bWUgOCBJU0RCLVRzYiBjb25uZWN0ZWQgc2VnbWVudHMgYXJlIGJyb2FkY2FzdGVkLiBUaGUKLQkJCQlicm9hZGNhc3RlciBoYXMgc2V2ZXJhbCBwb3NzaWJpbGl0aWVzIHRvIHB1dCB0aG9zZSBjaGFubmVscyBpbiB0aGUKLQkJCQlhaXI6IEFzc3VtaW5nIGEgbm9ybWFsIDEzLXNlZ21lbnQgSVNEQi1UIHNwZWN0cnVtIGhlIGNhbiBhbGlnbiB0aGUgOAotCQkJCXNlZ21lbnRzIGZyb20gcG9zaXRpb24gMS04IHRvIDUtMTMgb3IgYW55dGhpbmcgaW4gYmV0d2Vlbi48L3BhcmE+Ci0KLQkJCTxwYXJhPlRoZSB1bmRlcmx5aW5nIGxheWVyIG9mIHNlZ21lbnRzIGFyZSBzdWJjaGFubmVsczogZWFjaCBzZWdtZW50IGlzCi0JCQkJY29uc2lzdGluZyBvZiBzZXZlcmFsIHN1YmNoYW5uZWxzIHdpdGggYSBwcmVkZWZpbmVkIElEcy4gQSBzdWItY2hhbm5lbAotCQkJCWlzIHVzZWQgdG8gaGVscCB0aGUgZGVtb2R1bGF0b3IgdG8gc3luY2hyb25pemUgb24gdGhlIGNoYW5uZWwuPC9wYXJhPgotCi0JCQk8cGFyYT5BbiBJU0RCLVQgY2hhbm5lbCBpcyBhbHdheXMgY2VudGVyZWQgb3ZlciBhbGwgc3ViLWNoYW5uZWxzLiBBcyBmb3IKLQkJCQl0aGUgZXhhbXBsZSBhYm92ZSwgaW4gSVNEQi1Uc2IgaXQgaXMgbm8gbG9uZ2VyIGFzIHNpbXBsZSBhcyB0aGF0LjwvcGFyYT4KLQotCQkJPHBhcmE+PGNvbnN0YW50PlRoZSBEVFZfSVNEQlRfU0JfU1VCQ0hBTk5FTF9JRDwvY29uc3RhbnQ+IHBhcmFtZXRlciBpcyB1c2VkIHRvIGdpdmUgdGhlCi0JCQkJc3ViLWNoYW5uZWwgSUQgb2YgdGhlIHNlZ21lbnQgdG8gYmUgZGVtb2R1bGF0ZWQuPC9wYXJhPgotCi0JCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6IDAgLi4gNDEsIC0xIChBVVRPKTwvcGFyYT4KLQkJPC9zZWN0aW9uPgotCi0JCTxzZWN0aW9uIGlkPSJpc2RidC1zYi1zZWctaWR4Ij4KLQotCQkJPHRpdGxlPjxjb25zdGFudD5EVFZfSVNEQlRfU0JfU0VHTUVOVF9JRFg8L2NvbnN0YW50PjwvdGl0bGU+Ci0KLQkJCTxwYXJhPlRoaXMgZmllbGQgb25seSBhcHBsaWVzIGlmIDxjb25zdGFudD5EVFZfSVNEQlRfU09VTkRfQlJPQURDQVNUSU5HPC9jb25zdGFudD4gaXMgJzEnLjwvcGFyYT4KLQotCQkJPHBhcmE+PGNvbnN0YW50PkRUVl9JU0RCVF9TQl9TRUdNRU5UX0lEWDwvY29uc3RhbnQ+IGdpdmVzIHRoZSBpbmRleCBvZiB0aGUgc2VnbWVudCB0byBiZQotCQkJCWRlbW9kdWxhdGVkIGZvciBhbiBJU0RCLVRzYiBjaGFubmVsIHdoZXJlIHNldmVyYWwgb2YgdGhlbSBhcmUKLQkJCQl0cmFuc21pdHRlZCBpbiB0aGUgY29ubmVjdGVkIG1hbm5lci48L3BhcmE+Ci0KLQkJCTxwYXJhPlBvc3NpYmxlIHZhbHVlczogMCAuLiA8Y29uc3RhbnQ+RFRWX0lTREJUX1NCX1NFR01FTlRfQ09VTlQ8L2NvbnN0YW50PiAtIDE8L3BhcmE+Ci0KLQkJCTxwYXJhPk5vdGU6IFRoaXMgdmFsdWUgY2Fubm90IGJlIGRldGVybWluZWQgYnkgYW4gYXV0b21hdGljIGNoYW5uZWwgc2VhcmNoLjwvcGFyYT4KLQkJPC9zZWN0aW9uPgotCi0JCTxzZWN0aW9uIGlkPSJpc2RidC1zYi1zZWctY250Ij4KLQkJCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0lTREJUX1NCX1NFR01FTlRfQ09VTlQ8L2NvbnN0YW50PjwvdGl0bGU+Ci0KLQkJCTxwYXJhPlRoaXMgZmllbGQgb25seSBhcHBsaWVzIGlmIDxjb25zdGFudD5EVFZfSVNEQlRfU09VTkRfQlJPQURDQVNUSU5HPC9jb25zdGFudD4gaXMgJzEnLjwvcGFyYT4KLQotCQkJPHBhcmE+PGNvbnN0YW50PkRUVl9JU0RCVF9TQl9TRUdNRU5UX0NPVU5UPC9jb25zdGFudD4gZ2l2ZXMgdGhlIHRvdGFsIGNvdW50IG9mIGNvbm5lY3RlZCBJU0RCLVRzYgotCQkJCWNoYW5uZWxzLjwvcGFyYT4KLQotCQkJPHBhcmE+UG9zc2libGUgdmFsdWVzOiAxIC4uIDEzPC9wYXJhPgotCi0JCQk8cGFyYT5Ob3RlOiBUaGlzIHZhbHVlIGNhbm5vdCBiZSBkZXRlcm1pbmVkIGJ5IGFuIGF1dG9tYXRpYyBjaGFubmVsIHNlYXJjaC48L3BhcmE+Ci0JCTwvc2VjdGlvbj4KLQotCQk8c2VjdGlvbiBpZD0iaXNkYi1oaWVycS1sYXllcnMiPgotCQkJPHRpdGxlPkhpZXJhcmNoaWNhbCBsYXllcnM8L3RpdGxlPgotCi0JCQk8cGFyYT5JU0RCLVQgY2hhbm5lbHMgY2FuIGJlIGNvZGVkIGhpZXJhcmNoaWNhbGx5LiBBcyBvcHBvc2VkIHRvIERWQi1UIGluCi0JCQkJSVNEQi1UIGhpZXJhcmNoaWNhbCBsYXllcnMgY2FuIGJlIGRlY29kZWQgc2ltdWx0YW5lb3VzbHkuIEZvciB0aGF0Ci0JCQkJcmVhc29uIGEgSVNEQi1UIGRlbW9kdWxhdG9yIGhhcyAzIHZpdGVyYmkgYW5kIDMgcmVlZC1zb2xvbW9uLWRlY29kZXJzLjwvcGFyYT4KLQotCQkJPHBhcmE+SVNEQi1UIGhhcyAzIGhpZXJhcmNoaWNhbCBsYXllcnMgd2hpY2ggZWFjaCBjYW4gdXNlIGEgcGFydCBvZiB0aGUKLQkJCQlhdmFpbGFibGUgc2VnbWVudHMuIFRoZSB0b3RhbCBudW1iZXIgb2Ygc2VnbWVudHMgb3ZlciBhbGwgbGF5ZXJzIGhhcwotCQkJCXRvIDEzIGluIElTREItVC48L3BhcmE+Ci0KLQkJCTxzZWN0aW9uIGlkPSJpc2RidC1sYXllci1lbmEiPgotCQkJCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSX0VOQUJMRUQ8L2NvbnN0YW50PjwvdGl0bGU+Ci0KLQkJCQk8cGFyYT5IaWVyYXJjaGljYWwgcmVjZXB0aW9uIGluIElTREItVCBpcyBhY2hpZXZlZCBieSBlbmFibGluZyBvciBkaXNhYmxpbmcKLQkJCQkJbGF5ZXJzIGluIHRoZSBkZWNvZGluZyBwcm9jZXNzLiBTZXR0aW5nIGFsbCBiaXRzIG9mCi0JCQkJCTxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVJfRU5BQkxFRDwvY29uc3RhbnQ+IHRvICcxJyBmb3JjZXMgYWxsIGxheWVycyAoaWYgYXBwbGljYWJsZSkgdG8gYmUKLQkJCQkJZGVtb2R1bGF0ZWQuIFRoaXMgaXMgdGhlIGRlZmF1bHQuPC9wYXJhPgotCi0JCQkJPHBhcmE+SWYgdGhlIGNoYW5uZWwgaXMgaW4gdGhlIHBhcnRpYWwgcmVjZXB0aW9uIG1vZGUKLQkJCQkJKDxjb25zdGFudD5EVFZfSVNEQlRfUEFSVElBTF9SRUNFUFRJT048L2NvbnN0YW50PiA9IDEpIHRoZSBjZW50cmFsIHNlZ21lbnQgY2FuIGJlIGRlY29kZWQKLQkJCQkJaW5kZXBlbmRlbnRseSBvZiB0aGUgb3RoZXIgMTIgc2VnbWVudHMuIEluIHRoYXQgbW9kZSBsYXllciBBIGhhcyB0bwotCQkJCQloYXZlIGEgPGNvbnN0YW50PlNFR01FTlRfQ09VTlQ8L2NvbnN0YW50PiBvZiAxLjwvcGFyYT4KLQotCQkJCTxwYXJhPkluIElTREItVHNiIG9ubHkgbGF5ZXIgQSBpcyB1c2VkLCBpdCBjYW4gYmUgMSBvciAzIGluIElTREItVHNiCi0JCQkJCWFjY29yZGluZyB0byA8Y29uc3RhbnQ+RFRWX0lTREJUX1BBUlRJQUxfUkVDRVBUSU9OPC9jb25zdGFudD4uIDxjb25zdGFudD5TRUdNRU5UX0NPVU5UPC9jb25zdGFudD4gbXVzdCBiZSBmaWxsZWQKLQkJCQkJYWNjb3JkaW5nbHkuPC9wYXJhPgotCi0JCQkJPHBhcmE+UG9zc2libGUgdmFsdWVzOiAweDEsIDB4MiwgMHg0ICh8LWFibGUpPC9wYXJhPgotCi0JCQkJPHBhcmE+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUl9FTkFCTEVEWzA6MF08L2NvbnN0YW50PiAtIGxheWVyIEE8L3BhcmE+Ci0JCQkJPHBhcmE+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUl9FTkFCTEVEWzE6MV08L2NvbnN0YW50PiAtIGxheWVyIEI8L3BhcmE+Ci0JCQkJPHBhcmE+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUl9FTkFCTEVEWzI6Ml08L2NvbnN0YW50PiAtIGxheWVyIEM8L3BhcmE+Ci0JCQkJPHBhcmE+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUl9FTkFCTEVEWzMxOjNdPC9jb25zdGFudD4gdW51c2VkPC9wYXJhPgotCQkJPC9zZWN0aW9uPgotCi0JCQk8c2VjdGlvbiBpZD0iaXNkYnQtbGF5ZXItZmVjIj4KLQkJCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUipfRkVDPC9jb25zdGFudD48L3RpdGxlPgotCi0JCQkJPHBhcmE+UG9zc2libGUgdmFsdWVzOiA8Y29uc3RhbnQ+RkVDX0FVVE88L2NvbnN0YW50PiwgPGNvbnN0YW50PkZFQ18xXzI8L2NvbnN0YW50PiwgPGNvbnN0YW50PkZFQ18yXzM8L2NvbnN0YW50PiwgPGNvbnN0YW50PkZFQ18zXzQ8L2NvbnN0YW50PiwgPGNvbnN0YW50PkZFQ181XzY8L2NvbnN0YW50PiwgPGNvbnN0YW50PkZFQ183Xzg8L2NvbnN0YW50PjwvcGFyYT4KLQkJCTwvc2VjdGlvbj4KLQotCQkJPHNlY3Rpb24gaWQ9ImlzZGJ0LWxheWVyLW1vZCI+Ci0JCQkJPHRpdGxlPjxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVIqX01PRFVMQVRJT048L2NvbnN0YW50PjwvdGl0bGU+Ci0KLQkJCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6IDxjb25zdGFudD5RQU1fQVVUTzwvY29uc3RhbnQ+LCBRUDxjb25zdGFudD5TSywgUUFNXzE2PC9jb25zdGFudD4sIDxjb25zdGFudD5RQU1fNjQ8L2NvbnN0YW50PiwgPGNvbnN0YW50PkRRUFNLPC9jb25zdGFudD48L3BhcmE+Ci0KLQkJCQk8cGFyYT5Ob3RlOiBJZiBsYXllciBDIGlzIDxjb25zdGFudD5EUVBTSzwvY29uc3RhbnQ+IGxheWVyIEIgaGFzIHRvIGJlIDxjb25zdGFudD5EUVBTSzwvY29uc3RhbnQ+LiBJZiBsYXllciBCIGlzIDxjb25zdGFudD5EUVBTSzwvY29uc3RhbnQ+Ci0JCQkJCWFuZCA8Y29uc3RhbnQ+RFRWX0lTREJUX1BBUlRJQUxfUkVDRVBUSU9OPC9jb25zdGFudD49MCBsYXllciBoYXMgdG8gYmUgPGNvbnN0YW50PkRRUFNLPC9jb25zdGFudD4uPC9wYXJhPgotCQkJPC9zZWN0aW9uPgotCi0JCQk8c2VjdGlvbiBpZD0iaXNkYnQtbGF5ZXItc2VnLWNudCI+Ci0JCQkJPHRpdGxlPjxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVIqX1NFR01FTlRfQ09VTlQ8L2NvbnN0YW50PjwvdGl0bGU+Ci0KLQkJCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6IDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAtMSAoQVVUTyk8L3BhcmE+Ci0KLQkJCQk8cGFyYT5Ob3RlOiBUcnV0aCB0YWJsZSBmb3IgPGNvbnN0YW50PkRUVl9JU0RCVF9TT1VORF9CUk9BRENBU1RJTkc8L2NvbnN0YW50PiBhbmQKLQkJCQkJPGNvbnN0YW50PkRUVl9JU0RCVF9QQVJUSUFMX1JFQ0VQVElPTjwvY29uc3RhbnQ+IGFuZCA8Y29uc3RhbnQ+TEFZRVI8L2NvbnN0YW50PipfU0VHTUVOVF9DT1VOVDwvcGFyYT4KLQotCQkJCTxpbmZvcm1hbHRhYmxlIGlkPSJpc2RidC1sYXllcl9zZWctY250LXRhYmxlIj4KLQkJCQkJPHRncm91cCBjb2xzPSI2Ij4KLQotCQkJCQkJPHRib2R5PgotCQkJCQkJCTxyb3c+Ci0JCQkJCQkJCTxlbnRyeT5QUjwvZW50cnk+Ci0JCQkJCQkJCTxlbnRyeT5TQjwvZW50cnk+Ci0JCQkJCQkJCTxlbnRyeT5MYXllciBBIHdpZHRoPC9lbnRyeT4KLQkJCQkJCQkJPGVudHJ5PkxheWVyIEIgd2lkdGg8L2VudHJ5PgotCQkJCQkJCQk8ZW50cnk+TGF5ZXIgQyB3aWR0aDwvZW50cnk+Ci0JCQkJCQkJCTxlbnRyeT50b3RhbCB3aWR0aDwvZW50cnk+Ci0JCQkJCQkJPC9yb3c+Ci0KLQkJCQkJCQk8cm93PgotCQkJCQkJCQk8ZW50cnk+MDwvZW50cnk+Ci0JCQkJCQkJCTxlbnRyeT4wPC9lbnRyeT4KLQkJCQkJCQkJPGVudHJ5PjEgLi4gMTM8L2VudHJ5PgotCQkJCQkJCQk8ZW50cnk+MSAuLiAxMzwvZW50cnk+Ci0JCQkJCQkJCTxlbnRyeT4xIC4uIDEzPC9lbnRyeT4KLQkJCQkJCQkJPGVudHJ5PjEzPC9lbnRyeT4KLQkJCQkJCQk8L3Jvdz4KLQotCQkJCQkJCTxyb3c+Ci0JCQkJCQkJCTxlbnRyeT4xPC9lbnRyeT4KLQkJCQkJCQkJPGVudHJ5PjA8L2VudHJ5PgotCQkJCQkJCQk8ZW50cnk+MTwvZW50cnk+Ci0JCQkJCQkJCTxlbnRyeT4xIC4uIDEzPC9lbnRyeT4KLQkJCQkJCQkJPGVudHJ5PjEgLi4gMTM8L2VudHJ5PgotCQkJCQkJCQk8ZW50cnk+MTM8L2VudHJ5PgotCQkJCQkJCTwvcm93PgotCi0JCQkJCQkJPHJvdz4KLQkJCQkJCQkJPGVudHJ5PjA8L2VudHJ5PgotCQkJCQkJCQk8ZW50cnk+MTwvZW50cnk+Ci0JCQkJCQkJCTxlbnRyeT4xPC9lbnRyeT4KLQkJCQkJCQkJPGVudHJ5PjA8L2VudHJ5PgotCQkJCQkJCQk8ZW50cnk+MDwvZW50cnk+Ci0JCQkJCQkJCTxlbnRyeT4xPC9lbnRyeT4KLQkJCQkJCQk8L3Jvdz4KLQotCQkJCQkJCTxyb3c+Ci0JCQkJCQkJCTxlbnRyeT4xPC9lbnRyeT4KLQkJCQkJCQkJPGVudHJ5PjE8L2VudHJ5PgotCQkJCQkJCQk8ZW50cnk+MTwvZW50cnk+Ci0JCQkJCQkJCTxlbnRyeT4yPC9lbnRyeT4KLQkJCQkJCQkJPGVudHJ5PjA8L2VudHJ5PgotCQkJCQkJCQk8ZW50cnk+MTM8L2VudHJ5PgotCQkJCQkJCTwvcm93PgotCQkJCQkJPC90Ym9keT4KLQotCQkJCQk8L3Rncm91cD4KLQkJCQk8L2luZm9ybWFsdGFibGU+Ci0KLQkJCTwvc2VjdGlvbj4KLQotCQkJPHNlY3Rpb24gaWQ9ImlzZGJ0X2xheWVyX3RfaW50ZXJsIj4KLQkJCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUipfVElNRV9JTlRFUkxFQVZJTkc8L2NvbnN0YW50PjwvdGl0bGU+Ci0KLQkJCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6IDAsIDEsIDIsIDMsIC0xIChBVVRPKTwvcGFyYT4KLQotCQkJCTxwYXJhPk5vdGU6IFRoZSByZWFsIGludGVyLWxlYXZlciBkZXB0aC1uYW1lcyBkZXBlbmQgb24gdGhlIG1vZGUgKGZmdC1zaXplKTsgdGhlIHZhbHVlcwotCQkJCQloZXJlIGFyZSByZWZlcnJpbmcgdG8gd2hhdCBjYW4gYmUgZm91bmQgaW4gdGhlIFRNQ0Mtc3RydWN0dXJlIC0KLQkJCQkJaW5kZXBlbmRlbnQgb2YgdGhlIG1vZGUuPC9wYXJhPgotCQkJPC9zZWN0aW9uPgotCQk8L3NlY3Rpb24+Ci0JPC9zZWN0aW9uPgotCTxzZWN0aW9uIGlkPSJkdmJ0Mi1wYXJhbXMiPgotCQk8dGl0bGU+RFZCLVQyIHBhcmFtZXRlcnM8L3RpdGxlPgotCQkKLQkJPHBhcmE+VGhpcyBzZWN0aW9uIGNvdmVycyBwYXJhbWV0ZXJzIHRoYXQgYXBwbHkgb25seSB0byB0aGUgRFZCLVQyIGRlbGl2ZXJ5IG1ldGhvZC4gRFZCLVQyCi0JCQlzdXBwb3J0IGlzIGN1cnJlbnRseSBpbiB0aGUgZWFybHkgc3RhZ2VzIGRldmVsb3BtZW50IHNvIGV4cGVjdCB0aGlzIHNlY3Rpb24gdG8gZ3JvdwotCQkJYW5kIGJlY29tZSBtb3JlIGRldGFpbGVkIHdpdGggdGltZS48L3BhcmE+Ci0KLQkJPHNlY3Rpb24gaWQ9ImR2YnQyLXBscC1pZCI+Ci0JCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9EVkJUMl9QTFBfSUQ8L2NvbnN0YW50PjwvdGl0bGU+Ci0KLQkJCTxwYXJhPkRWQi1UMiBzdXBwb3J0cyBQaHlzaWNhbCBMYXllciBQaXBlcyAoUExQKSB0byBhbGxvdyB0cmFuc21pc3Npb24gb2YKLQkJCQltYW55IGRhdGEgdHlwZXMgdmlhIGEgc2luZ2xlIG11bHRpcGxleC4gVGhlIEFQSSB3aWxsIHNvb24gc3VwcG9ydCB0aGlzCi0JCQkJYXQgd2hpY2ggcG9pbnQgdGhpcyBzZWN0aW9uIHdpbGwgYmUgZXhwYW5kZWQuPC9wYXJhPgotCQk8L3NlY3Rpb24+Ci0JPC9zZWN0aW9uPgotPC9zZWN0aW9uPgotPC9zZWN0aW9uPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9kdmJzdGIucG5nIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9kdmJzdGIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjhmMzcyLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZHZic3RiLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZnJvbnRlbmQuaC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2Zyb250ZW5kLmgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzkyZjc4Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZnJvbnRlbmQuaC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MjggKzAsMCBAQAotPHByb2dyYW1saXN0aW5nPgotLyoKLSAqIGZyb250ZW5kLmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgTWFyY3VzIE1ldHpsZXIgJmx0O21hcmN1c0Bjb252ZXJnZW5jZS5kZSZndDsKLSAqICAgICAgICAgICAgICAgICAgUmFscGggIE1ldHpsZXIgJmx0O3JhbHBoQGNvbnZlcmdlbmNlLmRlJmd0OwotICogICAgICAgICAgICAgICAgICBIb2xnZXIgV2FlY2h0bGVyICZsdDtob2xnZXJAY29udmVyZ2VuY2UuZGUmZ3Q7Ci0gKiAgICAgICAgICAgICAgICAgIEFuZHJlIERyYXN6aWsgJmx0O2FkQGNvbnZlcmdlbmNlLmRlJmd0OwotICogICAgICAgICAgICAgICAgICBmb3IgY29udmVyZ2VuY2UgaW50ZWdyYXRlZCBtZWRpYSBHbWJICi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xCi0gKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqLwotCi0jaWZuZGVmIF9EVkJGUk9OVEVORF9IXwotI2RlZmluZSBfRFZCRlJPTlRFTkRfSF8KLQotI2luY2x1ZGUgJmx0O2xpbnV4L3R5cGVzLmgmZ3Q7Ci0KLXR5cGVkZWYgZW51bSBmZV90eXBlIHsKLSAgICAgICAgRkVfUVBTSywKLSAgICAgICAgRkVfUUFNLAotICAgICAgICBGRV9PRkRNLAotICAgICAgICBGRV9BVFNDCi19IGZlX3R5cGVfdDsKLQotCi10eXBlZGVmIGVudW0gZmVfY2FwcyB7Ci0gICAgICAgIEZFX0lTX1NUVVBJRCAgICAgICAgICAgICAgICAgICAgPSAwLAotICAgICAgICBGRV9DQU5fSU5WRVJTSU9OX0FVVE8gICAgICAgICAgID0gMHgxLAotICAgICAgICBGRV9DQU5fRkVDXzFfMiAgICAgICAgICAgICAgICAgID0gMHgyLAotICAgICAgICBGRV9DQU5fRkVDXzJfMyAgICAgICAgICAgICAgICAgID0gMHg0LAotICAgICAgICBGRV9DQU5fRkVDXzNfNCAgICAgICAgICAgICAgICAgID0gMHg4LAotICAgICAgICBGRV9DQU5fRkVDXzRfNSAgICAgICAgICAgICAgICAgID0gMHgxMCwKLSAgICAgICAgRkVfQ0FOX0ZFQ181XzYgICAgICAgICAgICAgICAgICA9IDB4MjAsCi0gICAgICAgIEZFX0NBTl9GRUNfNl83ICAgICAgICAgICAgICAgICAgPSAweDQwLAotICAgICAgICBGRV9DQU5fRkVDXzdfOCAgICAgICAgICAgICAgICAgID0gMHg4MCwKLSAgICAgICAgRkVfQ0FOX0ZFQ184XzkgICAgICAgICAgICAgICAgICA9IDB4MTAwLAotICAgICAgICBGRV9DQU5fRkVDX0FVVE8gICAgICAgICAgICAgICAgID0gMHgyMDAsCi0gICAgICAgIEZFX0NBTl9RUFNLICAgICAgICAgICAgICAgICAgICAgPSAweDQwMCwKLSAgICAgICAgRkVfQ0FOX1FBTV8xNiAgICAgICAgICAgICAgICAgICA9IDB4ODAwLAotICAgICAgICBGRV9DQU5fUUFNXzMyICAgICAgICAgICAgICAgICAgID0gMHgxMDAwLAotICAgICAgICBGRV9DQU5fUUFNXzY0ICAgICAgICAgICAgICAgICAgID0gMHgyMDAwLAotICAgICAgICBGRV9DQU5fUUFNXzEyOCAgICAgICAgICAgICAgICAgID0gMHg0MDAwLAotICAgICAgICBGRV9DQU5fUUFNXzI1NiAgICAgICAgICAgICAgICAgID0gMHg4MDAwLAotICAgICAgICBGRV9DQU5fUUFNX0FVVE8gICAgICAgICAgICAgICAgID0gMHgxMDAwMCwKLSAgICAgICAgRkVfQ0FOX1RSQU5TTUlTU0lPTl9NT0RFX0FVVE8gICA9IDB4MjAwMDAsCi0gICAgICAgIEZFX0NBTl9CQU5EV0lEVEhfQVVUTyAgICAgICAgICAgPSAweDQwMDAwLAotICAgICAgICBGRV9DQU5fR1VBUkRfSU5URVJWQUxfQVVUTyAgICAgID0gMHg4MDAwMCwKLSAgICAgICAgRkVfQ0FOX0hJRVJBUkNIWV9BVVRPICAgICAgICAgICA9IDB4MTAwMDAwLAotICAgICAgICBGRV9DQU5fOFZTQiAgICAgICAgICAgICAgICAgICAgID0gMHgyMDAwMDAsCi0gICAgICAgIEZFX0NBTl8xNlZTQiAgICAgICAgICAgICAgICAgICAgPSAweDQwMDAwMCwKLSAgICAgICAgRkVfSEFTX0VYVEVOREVEX0NBUFMgICAgICAgICAgICA9IDB4ODAwMDAwLCAgIC8qIFdlIG5lZWQgbW9yZSBiaXRzcGFjZSBmb3IgbmV3ZXIgQVBJcywgaW5kaWNhdGUgdGhpcy4gKi8KLSAgICAgICAgRkVfQ0FOX1RVUkJPX0ZFQyAgICAgICAgICAgICAgICA9IDB4ODAwMDAwMCwgIC8qIGZyb250ZW5kIHN1cHBvcnRzICJ0dXJibyBmZWMgbW9kdWxhdGlvbiIgKi8KLSAgICAgICAgRkVfQ0FOXzJHX01PRFVMQVRJT04gICAgICAgICAgICA9IDB4MTAwMDAwMDAsIC8qIGZyb250ZW5kIHN1cHBvcnRzICIybmQgZ2VuZXJhdGlvbiBtb2R1bGF0aW9uIiAoRFZCLVMyKSAqLwotICAgICAgICBGRV9ORUVEU19CRU5ESU5HICAgICAgICAgICAgICAgID0gMHgyMDAwMDAwMCwgLyogbm90IHN1cHBvcnRlZCBhbnltb3JlLCBkb24ndCB1c2UgKGZyb250ZW5kIHJlcXVpcmVzIGZyZXF1ZW5jeSBiZW5kaW5nKSAqLwotICAgICAgICBGRV9DQU5fUkVDT1ZFUiAgICAgICAgICAgICAgICAgID0gMHg0MDAwMDAwMCwgLyogZnJvbnRlbmQgY2FuIHJlY292ZXIgZnJvbSBhIGNhYmxlIHVucGx1ZyBhdXRvbWF0aWNhbGx5ICovCi0gICAgICAgIEZFX0NBTl9NVVRFX1RTICAgICAgICAgICAgICAgICAgPSAweDgwMDAwMDAwICAvKiBmcm9udGVuZCBjYW4gc3RvcCBzcHVyaW91cyBUUyBkYXRhIG91dHB1dCAqLwotfSBmZV9jYXBzX3Q7Ci0KLQotc3RydWN0IGR2Yl9mcm9udGVuZF9pbmZvIHsKLSAgICAgICAgY2hhciAgICAgICBuYW1lWzEyOF07Ci0gICAgICAgIGZlX3R5cGVfdCAgdHlwZTsKLSAgICAgICAgX191MzIgICAgICBmcmVxdWVuY3lfbWluOwotICAgICAgICBfX3UzMiAgICAgIGZyZXF1ZW5jeV9tYXg7Ci0gICAgICAgIF9fdTMyICAgICAgZnJlcXVlbmN5X3N0ZXBzaXplOwotICAgICAgICBfX3UzMiAgICAgIGZyZXF1ZW5jeV90b2xlcmFuY2U7Ci0gICAgICAgIF9fdTMyICAgICAgc3ltYm9sX3JhdGVfbWluOwotICAgICAgICBfX3UzMiAgICAgIHN5bWJvbF9yYXRlX21heDsKLSAgICAgICAgX191MzIgICAgICBzeW1ib2xfcmF0ZV90b2xlcmFuY2U7ICAgICAgIC8qIHBwbSAqLwotICAgICAgICBfX3UzMiAgICAgIG5vdGlmaWVyX2RlbGF5OyAgICAgICAgICAgICAgLyogREVQUkVDQVRFRCAqLwotICAgICAgICBmZV9jYXBzX3QgIGNhcHM7Ci19OwotCi0KLS8qKgotICogIENoZWNrIG91dCB0aGUgRGlTRXFDIGJ1cyBzcGVjIGF2YWlsYWJsZSBvbiBodHRwOi8vd3d3LmV1dGVsc2F0Lm9yZy8gZm9yCi0gKiAgdGhlIG1lYW5pbmcgb2YgdGhpcyBzdHJ1Y3QuLi4KLSAqLwotc3RydWN0IGR2Yl9kaXNlcWNfbWFzdGVyX2NtZCB7Ci0gICAgICAgIF9fdTggbXNnIFs2XTsgICAvKiAgeyBmcmFtaW5nLCBhZGRyZXNzLCBjb21tYW5kLCBkYXRhIFszXSB9ICovCi0gICAgICAgIF9fdTggbXNnX2xlbjsgICAvKiAgdmFsaWQgdmFsdWVzIGFyZSAzLi4uNiAgKi8KLX07Ci0KLQotc3RydWN0IGR2Yl9kaXNlcWNfc2xhdmVfcmVwbHkgewotICAgICAgICBfX3U4IG1zZyBbNF07ICAgLyogIHsgZnJhbWluZywgZGF0YSBbM10gfSAqLwotICAgICAgICBfX3U4IG1zZ19sZW47ICAgLyogIHZhbGlkIHZhbHVlcyBhcmUgMC4uLjQsIDAgbWVhbnMgbm8gbXNnICAqLwotICAgICAgICBpbnQgIHRpbWVvdXQ7ICAgLyogIHJldHVybiBmcm9tIGlvY3RsIGFmdGVyIHRpbWVvdXQgbXMgd2l0aCAqLwotfTsgICAgICAgICAgICAgICAgICAgICAgLyogIGVycm9yY29kZSB3aGVuIG5vIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkICAqLwotCi0KLXR5cGVkZWYgZW51bSBmZV9zZWNfdm9sdGFnZSB7Ci0gICAgICAgIFNFQ19WT0xUQUdFXzEzLAotICAgICAgICBTRUNfVk9MVEFHRV8xOCwKLSAgICAgICAgU0VDX1ZPTFRBR0VfT0ZGCi19IGZlX3NlY192b2x0YWdlX3Q7Ci0KLQotdHlwZWRlZiBlbnVtIGZlX3NlY190b25lX21vZGUgewotICAgICAgICBTRUNfVE9ORV9PTiwKLSAgICAgICAgU0VDX1RPTkVfT0ZGCi19IGZlX3NlY190b25lX21vZGVfdDsKLQotCi10eXBlZGVmIGVudW0gZmVfc2VjX21pbmlfY21kIHsKLSAgICAgICAgU0VDX01JTklfQSwKLSAgICAgICAgU0VDX01JTklfQgotfSBmZV9zZWNfbWluaV9jbWRfdDsKLQotCi10eXBlZGVmIGVudW0gZmVfc3RhdHVzIHsKLSAgICAgICAgRkVfSEFTX1NJR05BTCAgID0gMHgwMSwgICAvKiBmb3VuZCBzb21ldGhpbmcgYWJvdmUgdGhlIG5vaXNlIGxldmVsICovCi0gICAgICAgIEZFX0hBU19DQVJSSUVSICA9IDB4MDIsICAgLyogZm91bmQgYSBEVkIgc2lnbmFsICAqLwotICAgICAgICBGRV9IQVNfVklURVJCSSAgPSAweDA0LCAgIC8qIEZFQyBpcyBzdGFibGUgICovCi0gICAgICAgIEZFX0hBU19TWU5DICAgICA9IDB4MDgsICAgLyogZm91bmQgc3luYyBieXRlcyAgKi8KLSAgICAgICAgRkVfSEFTX0xPQ0sgICAgID0gMHgxMCwgICAvKiBldmVyeXRoaW5nJ3Mgd29ya2luZy4uLiAqLwotICAgICAgICBGRV9USU1FRE9VVCAgICAgPSAweDIwLCAgIC8qIG5vIGxvY2sgd2l0aGluIHRoZSBsYXN0IH4yIHNlY29uZHMgKi8KLSAgICAgICAgRkVfUkVJTklUICAgICAgID0gMHg0MCAgICAvKiBmcm9udGVuZCB3YXMgcmVpbml0aWFsaXplZCwgICovCi19IGZlX3N0YXR1c190OyAgICAgICAgICAgICAgICAgICAgLyogYXBwbGljYXRpb24gaXMgcmVjb21tZW5kZWQgdG8gcmVzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaVNFcUMsIHRvbmUgYW5kIHBhcmFtZXRlcnMgKi8KLQotdHlwZWRlZiBlbnVtIGZlX3NwZWN0cmFsX2ludmVyc2lvbiB7Ci0gICAgICAgIElOVkVSU0lPTl9PRkYsCi0gICAgICAgIElOVkVSU0lPTl9PTiwKLSAgICAgICAgSU5WRVJTSU9OX0FVVE8KLX0gZmVfc3BlY3RyYWxfaW52ZXJzaW9uX3Q7Ci0KLQotdHlwZWRlZiBlbnVtIGZlX2NvZGVfcmF0ZSB7Ci0gICAgICAgIEZFQ19OT05FID0gMCwKLSAgICAgICAgRkVDXzFfMiwKLSAgICAgICAgRkVDXzJfMywKLSAgICAgICAgRkVDXzNfNCwKLSAgICAgICAgRkVDXzRfNSwKLSAgICAgICAgRkVDXzVfNiwKLSAgICAgICAgRkVDXzZfNywKLSAgICAgICAgRkVDXzdfOCwKLSAgICAgICAgRkVDXzhfOSwKLSAgICAgICAgRkVDX0FVVE8sCi0gICAgICAgIEZFQ18zXzUsCi0gICAgICAgIEZFQ185XzEwLAotfSBmZV9jb2RlX3JhdGVfdDsKLQotCi10eXBlZGVmIGVudW0gZmVfbW9kdWxhdGlvbiB7Ci0gICAgICAgIFFQU0ssCi0gICAgICAgIFFBTV8xNiwKLSAgICAgICAgUUFNXzMyLAotICAgICAgICBRQU1fNjQsCi0gICAgICAgIFFBTV8xMjgsCi0gICAgICAgIFFBTV8yNTYsCi0gICAgICAgIFFBTV9BVVRPLAotICAgICAgICBWU0JfOCwKLSAgICAgICAgVlNCXzE2LAotICAgICAgICBQU0tfOCwKLSAgICAgICAgQVBTS18xNiwKLSAgICAgICAgQVBTS18zMiwKLSAgICAgICAgRFFQU0ssCi19IGZlX21vZHVsYXRpb25fdDsKLQotdHlwZWRlZiBlbnVtIGZlX3RyYW5zbWl0X21vZGUgewotICAgICAgICBUUkFOU01JU1NJT05fTU9ERV8ySywKLSAgICAgICAgVFJBTlNNSVNTSU9OX01PREVfOEssCi0gICAgICAgIFRSQU5TTUlTU0lPTl9NT0RFX0FVVE8sCi0gICAgICAgIFRSQU5TTUlTU0lPTl9NT0RFXzRLLAotICAgICAgICBUUkFOU01JU1NJT05fTU9ERV8xSywKLSAgICAgICAgVFJBTlNNSVNTSU9OX01PREVfMTZLLAotICAgICAgICBUUkFOU01JU1NJT05fTU9ERV8zMkssCi19IGZlX3RyYW5zbWl0X21vZGVfdDsKLQotdHlwZWRlZiBlbnVtIGZlX2JhbmR3aWR0aCB7Ci0gICAgICAgIEJBTkRXSURUSF84X01IWiwKLSAgICAgICAgQkFORFdJRFRIXzdfTUhaLAotICAgICAgICBCQU5EV0lEVEhfNl9NSFosCi0gICAgICAgIEJBTkRXSURUSF9BVVRPLAotICAgICAgICBCQU5EV0lEVEhfNV9NSFosCi0gICAgICAgIEJBTkRXSURUSF8xMF9NSFosCi0gICAgICAgIEJBTkRXSURUSF8xXzcxMl9NSFosCi19IGZlX2JhbmR3aWR0aF90OwotCi0KLXR5cGVkZWYgZW51bSBmZV9ndWFyZF9pbnRlcnZhbCB7Ci0gICAgICAgIEdVQVJEX0lOVEVSVkFMXzFfMzIsCi0gICAgICAgIEdVQVJEX0lOVEVSVkFMXzFfMTYsCi0gICAgICAgIEdVQVJEX0lOVEVSVkFMXzFfOCwKLSAgICAgICAgR1VBUkRfSU5URVJWQUxfMV80LAotICAgICAgICBHVUFSRF9JTlRFUlZBTF9BVVRPLAotICAgICAgICBHVUFSRF9JTlRFUlZBTF8xXzEyOCwKLSAgICAgICAgR1VBUkRfSU5URVJWQUxfMTlfMTI4LAotICAgICAgICBHVUFSRF9JTlRFUlZBTF8xOV8yNTYsCi19IGZlX2d1YXJkX2ludGVydmFsX3Q7Ci0KLQotdHlwZWRlZiBlbnVtIGZlX2hpZXJhcmNoeSB7Ci0gICAgICAgIEhJRVJBUkNIWV9OT05FLAotICAgICAgICBISUVSQVJDSFlfMSwKLSAgICAgICAgSElFUkFSQ0hZXzIsCi0gICAgICAgIEhJRVJBUkNIWV80LAotICAgICAgICBISUVSQVJDSFlfQVVUTwotfSBmZV9oaWVyYXJjaHlfdDsKLQotCi1zdHJ1Y3QgZHZiX3Fwc2tfcGFyYW1ldGVycyB7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICBzeW1ib2xfcmF0ZTsgIC8qIHN5bWJvbCByYXRlIGluIFN5bWJvbHMgcGVyIHNlY29uZCAqLwotICAgICAgICBmZV9jb2RlX3JhdGVfdCAgZmVjX2lubmVyOyAgICAvKiBmb3J3YXJkIGVycm9yIGNvcnJlY3Rpb24gKHNlZSBhYm92ZSkgKi8KLX07Ci0KLXN0cnVjdCBkdmJfcWFtX3BhcmFtZXRlcnMgewotICAgICAgICBfX3UzMiAgICAgICAgICAgc3ltYm9sX3JhdGU7IC8qIHN5bWJvbCByYXRlIGluIFN5bWJvbHMgcGVyIHNlY29uZCAqLwotICAgICAgICBmZV9jb2RlX3JhdGVfdCAgZmVjX2lubmVyOyAgIC8qIGZvcndhcmQgZXJyb3IgY29ycmVjdGlvbiAoc2VlIGFib3ZlKSAqLwotICAgICAgICBmZV9tb2R1bGF0aW9uX3QgbW9kdWxhdGlvbjsgIC8qIG1vZHVsYXRpb24gdHlwZSAoc2VlIGFib3ZlKSAqLwotfTsKLQotc3RydWN0IGR2Yl92c2JfcGFyYW1ldGVycyB7Ci0gICAgICAgIGZlX21vZHVsYXRpb25fdCBtb2R1bGF0aW9uOyAgLyogbW9kdWxhdGlvbiB0eXBlIChzZWUgYWJvdmUpICovCi19OwotCi1zdHJ1Y3QgZHZiX29mZG1fcGFyYW1ldGVycyB7Ci0gICAgICAgIGZlX2JhbmR3aWR0aF90ICAgICAgYmFuZHdpZHRoOwotICAgICAgICBmZV9jb2RlX3JhdGVfdCAgICAgIGNvZGVfcmF0ZV9IUDsgIC8qIGhpZ2ggcHJpb3JpdHkgc3RyZWFtIGNvZGUgcmF0ZSAqLwotICAgICAgICBmZV9jb2RlX3JhdGVfdCAgICAgIGNvZGVfcmF0ZV9MUDsgIC8qIGxvdyBwcmlvcml0eSBzdHJlYW0gY29kZSByYXRlICovCi0gICAgICAgIGZlX21vZHVsYXRpb25fdCAgICAgY29uc3RlbGxhdGlvbjsgLyogbW9kdWxhdGlvbiB0eXBlIChzZWUgYWJvdmUpICovCi0gICAgICAgIGZlX3RyYW5zbWl0X21vZGVfdCAgdHJhbnNtaXNzaW9uX21vZGU7Ci0gICAgICAgIGZlX2d1YXJkX2ludGVydmFsX3QgZ3VhcmRfaW50ZXJ2YWw7Ci0gICAgICAgIGZlX2hpZXJhcmNoeV90ICAgICAgaGllcmFyY2h5X2luZm9ybWF0aW9uOwotfTsKLQotCi1zdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgewotICAgICAgICBfX3UzMiBmcmVxdWVuY3k7ICAgICAvKiAoYWJzb2x1dGUpIGZyZXF1ZW5jeSBpbiBIeiBmb3IgUUFNL09GRE0vQVRTQyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnRlcm1lZGlhdGUgZnJlcXVlbmN5IGluIGtIeiBmb3IgUVBTSyAqLwotICAgICAgICBmZV9zcGVjdHJhbF9pbnZlcnNpb25fdCBpbnZlcnNpb247Ci0gICAgICAgIHVuaW9uIHsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgZHZiX3Fwc2tfcGFyYW1ldGVycyBxcHNrOwotICAgICAgICAgICAgICAgIHN0cnVjdCBkdmJfcWFtX3BhcmFtZXRlcnMgIHFhbTsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgZHZiX29mZG1fcGFyYW1ldGVycyBvZmRtOwotICAgICAgICAgICAgICAgIHN0cnVjdCBkdmJfdnNiX3BhcmFtZXRlcnMgdnNiOwotICAgICAgICB9IHU7Ci19OwotCi0KLXN0cnVjdCBkdmJfZnJvbnRlbmRfZXZlbnQgewotICAgICAgICBmZV9zdGF0dXNfdCBzdGF0dXM7Ci0gICAgICAgIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyBwYXJhbWV0ZXJzOwotfTsKLQotLyogUzJBUEkgQ29tbWFuZHMgKi8KLSNkZWZpbmUgRFRWX1VOREVGSU5FRCAgICAgICAgICAgMAotI2RlZmluZSBEVFZfVFVORSAgICAgICAgICAgICAgICAxCi0jZGVmaW5lIERUVl9DTEVBUiAgICAgICAgICAgICAgIDIKLSNkZWZpbmUgRFRWX0ZSRVFVRU5DWSAgICAgICAgICAgMwotI2RlZmluZSBEVFZfTU9EVUxBVElPTiAgICAgICAgICA0Ci0jZGVmaW5lIERUVl9CQU5EV0lEVEhfSFogICAgICAgIDUKLSNkZWZpbmUgRFRWX0lOVkVSU0lPTiAgICAgICAgICAgNgotI2RlZmluZSBEVFZfRElTRVFDX01BU1RFUiAgICAgICA3Ci0jZGVmaW5lIERUVl9TWU1CT0xfUkFURSAgICAgICAgIDgKLSNkZWZpbmUgRFRWX0lOTkVSX0ZFQyAgICAgICAgICAgOQotI2RlZmluZSBEVFZfVk9MVEFHRSAgICAgICAgICAgICAxMAotI2RlZmluZSBEVFZfVE9ORSAgICAgICAgICAgICAgICAxMQotI2RlZmluZSBEVFZfUElMT1QgICAgICAgICAgICAgICAxMgotI2RlZmluZSBEVFZfUk9MTE9GRiAgICAgICAgICAgICAxMwotI2RlZmluZSBEVFZfRElTRVFDX1NMQVZFX1JFUExZICAxNAotCi0vKiBCYXNpYyBlbnVtZXJhdGlvbiBzZXQgZm9yIHF1ZXJ5aW5nIHVubGltaXRlZCBjYXBhYmlsaXRpZXMgKi8KLSNkZWZpbmUgRFRWX0ZFX0NBUEFCSUxJVFlfQ09VTlQgMTUKLSNkZWZpbmUgRFRWX0ZFX0NBUEFCSUxJVFkgICAgICAgMTYKLSNkZWZpbmUgRFRWX0RFTElWRVJZX1NZU1RFTSAgICAgMTcKLQotLyogSVNEQi1UIGFuZCBJU0RCLVRzYiAqLwotI2RlZmluZSBEVFZfSVNEQlRfUEFSVElBTF9SRUNFUFRJT04gICAgIDE4Ci0jZGVmaW5lIERUVl9JU0RCVF9TT1VORF9CUk9BRENBU1RJTkcgICAgMTkKLQotI2RlZmluZSBEVFZfSVNEQlRfU0JfU1VCQ0hBTk5FTF9JRCAgICAgIDIwCi0jZGVmaW5lIERUVl9JU0RCVF9TQl9TRUdNRU5UX0lEWCAgICAgICAgMjEKLSNkZWZpbmUgRFRWX0lTREJUX1NCX1NFR01FTlRfQ09VTlQgICAgICAyMgotCi0jZGVmaW5lIERUVl9JU0RCVF9MQVlFUkFfRkVDICAgICAgICAgICAgICAgICAgICAyMwotI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJBX01PRFVMQVRJT04gICAgICAgICAgICAgMjQKLSNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQV9TRUdNRU5UX0NPVU5UICAgICAgICAgIDI1Ci0jZGVmaW5lIERUVl9JU0RCVF9MQVlFUkFfVElNRV9JTlRFUkxFQVZJTkcgICAgICAyNgotCi0jZGVmaW5lIERUVl9JU0RCVF9MQVlFUkJfRkVDICAgICAgICAgICAgICAgICAgICAyNwotI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJCX01PRFVMQVRJT04gICAgICAgICAgICAgMjgKLSNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQl9TRUdNRU5UX0NPVU5UICAgICAgICAgIDI5Ci0jZGVmaW5lIERUVl9JU0RCVF9MQVlFUkJfVElNRV9JTlRFUkxFQVZJTkcgICAgICAzMAotCi0jZGVmaW5lIERUVl9JU0RCVF9MQVlFUkNfRkVDICAgICAgICAgICAgICAgICAgICAzMQotI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJDX01PRFVMQVRJT04gICAgICAgICAgICAgMzIKLSNkZWZpbmUgRFRWX0lTREJUX0xBWUVSQ19TRUdNRU5UX0NPVU5UICAgICAgICAgIDMzCi0jZGVmaW5lIERUVl9JU0RCVF9MQVlFUkNfVElNRV9JTlRFUkxFQVZJTkcgICAgICAzNAotCi0jZGVmaW5lIERUVl9BUElfVkVSU0lPTiAgICAgICAgIDM1Ci0KLSNkZWZpbmUgRFRWX0NPREVfUkFURV9IUCAgICAgICAgMzYKLSNkZWZpbmUgRFRWX0NPREVfUkFURV9MUCAgICAgICAgMzcKLSNkZWZpbmUgRFRWX0dVQVJEX0lOVEVSVkFMICAgICAgMzgKLSNkZWZpbmUgRFRWX1RSQU5TTUlTU0lPTl9NT0RFICAgMzkKLSNkZWZpbmUgRFRWX0hJRVJBUkNIWSAgICAgICAgICAgNDAKLQotI2RlZmluZSBEVFZfSVNEQlRfTEFZRVJfRU5BQkxFRCA0MQotCi0jZGVmaW5lIERUVl9JU0RCU19UU19JRCAgICAgICAgIDQyCi0KLSNkZWZpbmUgRFRWX0RWQlQyX1BMUF9JRAk0MwotCi0jZGVmaW5lIERUVl9NQVhfQ09NTUFORCAgICAgICAgICAgICAgICAgICAgICAgICBEVFZfRFZCVDJfUExQX0lECi0KLXR5cGVkZWYgZW51bSBmZV9waWxvdCB7Ci0gICAgICAgIFBJTE9UX09OLAotICAgICAgICBQSUxPVF9PRkYsCi0gICAgICAgIFBJTE9UX0FVVE8sCi19IGZlX3BpbG90X3Q7Ci0KLXR5cGVkZWYgZW51bSBmZV9yb2xsb2ZmIHsKLSAgICAgICAgUk9MTE9GRl8zNSwgLyogSW1wbGllZCB2YWx1ZSBpbiBEVkItUywgZGVmYXVsdCBmb3IgRFZCLVMyICovCi0gICAgICAgIFJPTExPRkZfMjAsCi0gICAgICAgIFJPTExPRkZfMjUsCi0gICAgICAgIFJPTExPRkZfQVVUTywKLX0gZmVfcm9sbG9mZl90OwotCi10eXBlZGVmIGVudW0gZmVfZGVsaXZlcnlfc3lzdGVtIHsKLSAgICAgICAgU1lTX1VOREVGSU5FRCwKLSAgICAgICAgU1lTX0RWQkNfQU5ORVhfQUMsCi0gICAgICAgIFNZU19EVkJDX0FOTkVYX0IsCi0gICAgICAgIFNZU19EVkJULAotICAgICAgICBTWVNfRFNTLAotICAgICAgICBTWVNfRFZCUywKLSAgICAgICAgU1lTX0RWQlMyLAotICAgICAgICBTWVNfRFZCSCwKLSAgICAgICAgU1lTX0lTREJULAotICAgICAgICBTWVNfSVNEQlMsCi0gICAgICAgIFNZU19JU0RCQywKLSAgICAgICAgU1lTX0FUU0MsCi0gICAgICAgIFNZU19BVFNDTUgsCi0gICAgICAgIFNZU19ETUJUSCwKLSAgICAgICAgU1lTX0NNTUIsCi0gICAgICAgIFNZU19EQUIsCi0gICAgICAgIFNZU19EVkJUMiwKLX0gZmVfZGVsaXZlcnlfc3lzdGVtX3Q7Ci0KLXN0cnVjdCBkdHZfY21kc19oIHsKLSAgICAgICAgY2hhciAgICAqbmFtZTsgICAgICAgICAgLyogQSBkaXNwbGF5IG5hbWUgZm9yIGRlYnVnZ2luZyBwdXJwb3NlcyAqLwotCi0gICAgICAgIF9fdTMyICAgY21kOyAgICAgICAgICAgIC8qIEEgdW5pcXVlIElEICovCi0KLSAgICAgICAgLyogRmxhZ3MgKi8KLSAgICAgICAgX191MzIgICBzZXQ6MTsgICAgICAgICAgLyogRWl0aGVyIGEgc2V0IG9yIGdldCBwcm9wZXJ0eSAqLwotICAgICAgICBfX3UzMiAgIGJ1ZmZlcjoxOyAgICAgICAvKiBEb2VzIHRoaXMgcHJvcGVydHkgdXNlIHRoZSBidWZmZXI/ICovCi0gICAgICAgIF9fdTMyICAgcmVzZXJ2ZWQ6MzA7ICAgIC8qIEFsaWduICovCi19OwotCi1zdHJ1Y3QgZHR2X3Byb3BlcnR5IHsKLSAgICAgICAgX191MzIgY21kOwotICAgICAgICBfX3UzMiByZXNlcnZlZFszXTsKLSAgICAgICAgdW5pb24gewotICAgICAgICAgICAgICAgIF9fdTMyIGRhdGE7Ci0gICAgICAgICAgICAgICAgc3RydWN0IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fdTggZGF0YVszMl07Ci0gICAgICAgICAgICAgICAgICAgICAgICBfX3UzMiBsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgICBfX3UzMiByZXNlcnZlZDFbM107Ci0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpyZXNlcnZlZDI7Ci0gICAgICAgICAgICAgICAgfSBidWZmZXI7Ci0gICAgICAgIH0gdTsKLSAgICAgICAgaW50IHJlc3VsdDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKiBudW0gb2YgcHJvcGVydGllcyBjYW5ub3QgZXhjZWVkIERUVl9JT0NUTF9NQVhfTVNHUyBwZXIgaW9jdGwgKi8KLSNkZWZpbmUgRFRWX0lPQ1RMX01BWF9NU0dTIDY0Ci0KLXN0cnVjdCBkdHZfcHJvcGVydGllcyB7Ci0gICAgICAgIF9fdTMyIG51bTsKLSAgICAgICAgc3RydWN0IGR0dl9wcm9wZXJ0eSAqcHJvcHM7Ci19OwotCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IkZFX0dFVF9QUk9QRVJUWSI+RkVfU0VUX1BST1BFUlRZPC9saW5rPiAgICAgICAgICAgIF9JT1coJ28nLCA4Miwgc3RydWN0IGR0dl9wcm9wZXJ0aWVzKQotI2RlZmluZSA8bGluayBsaW5rZW5kPSJGRV9HRVRfUFJPUEVSVFkiPkZFX0dFVF9QUk9QRVJUWTwvbGluaz4gICAgICAgICAgICBfSU9SKCdvJywgODMsIHN0cnVjdCBkdHZfcHJvcGVydGllcykKLQotCi0vKioKLSAqIFdoZW4gc2V0LCB0aGlzIGZsYWcgd2lsbCBkaXNhYmxlIGFueSB6aWd6YWdnaW5nIG9yIG90aGVyICJub3JtYWwiIHR1bmluZwotICogYmVoYXZpb3VyLiBBZGRpdGlvbmFsbHksIHRoZXJlIHdpbGwgYmUgbm8gYXV0b21hdGljIG1vbml0b3Jpbmcgb2YgdGhlIGxvY2sKLSAqIHN0YXR1cywgYW5kIGhlbmNlIG5vIGZyb250ZW5kIGV2ZW50cyB3aWxsIGJlIGdlbmVyYXRlZC4gSWYgYSBmcm9udGVuZCBkZXZpY2UKLSAqIGlzIGNsb3NlZCwgdGhpcyBmbGFnIHdpbGwgYmUgYXV0b21hdGljYWxseSB0dXJuZWQgb2ZmIHdoZW4gdGhlIGRldmljZSBpcwotICogcmVvcGVuZWQgcmVhZC13cml0ZS4KLSAqLwotI2RlZmluZSBGRV9UVU5FX01PREVfT05FU0hPVCAweDAxCi0KLQotI2RlZmluZSA8bGluayBsaW5rZW5kPSJGRV9HRVRfSU5GTyI+RkVfR0VUX0lORk88L2xpbms+ICAgICAgICAgICAgICAgIF9JT1IoJ28nLCA2MSwgc3RydWN0IGR2Yl9mcm9udGVuZF9pbmZvKQotCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IkZFX0RJU0VRQ19SRVNFVF9PVkVSTE9BRCI+RkVfRElTRVFDX1JFU0VUX09WRVJMT0FEPC9saW5rPiAgIF9JTygnbycsIDYyKQotI2RlZmluZSA8bGluayBsaW5rZW5kPSJGRV9ESVNFUUNfU0VORF9NQVNURVJfQ01EIj5GRV9ESVNFUUNfU0VORF9NQVNURVJfQ01EPC9saW5rPiAgX0lPVygnbycsIDYzLCBzdHJ1Y3QgZHZiX2Rpc2VxY19tYXN0ZXJfY21kKQotI2RlZmluZSA8bGluayBsaW5rZW5kPSJGRV9ESVNFUUNfUkVDVl9TTEFWRV9SRVBMWSI+RkVfRElTRVFDX1JFQ1ZfU0xBVkVfUkVQTFk8L2xpbms+IF9JT1IoJ28nLCA2NCwgc3RydWN0IGR2Yl9kaXNlcWNfc2xhdmVfcmVwbHkpCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IkZFX0RJU0VRQ19TRU5EX0JVUlNUIj5GRV9ESVNFUUNfU0VORF9CVVJTVDwvbGluaz4gICAgICAgX0lPKCdvJywgNjUpICAvKiBmZV9zZWNfbWluaV9jbWRfdCAqLwotCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IkZFX1NFVF9UT05FIj5GRV9TRVRfVE9ORTwvbGluaz4gICAgICAgICAgICAgICAgX0lPKCdvJywgNjYpICAvKiBmZV9zZWNfdG9uZV9tb2RlX3QgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iRkVfU0VUX1ZPTFRBR0UiPkZFX1NFVF9WT0xUQUdFPC9saW5rPiAgICAgICAgICAgICBfSU8oJ28nLCA2NykgIC8qIGZlX3NlY192b2x0YWdlX3QgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iRkVfRU5BQkxFX0hJR0hfTE5CX1ZPTFRBR0UiPkZFX0VOQUJMRV9ISUdIX0xOQl9WT0xUQUdFPC9saW5rPiBfSU8oJ28nLCA2OCkgIC8qIGludCAqLwotCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IkZFX1JFQURfU1RBVFVTIj5GRV9SRUFEX1NUQVRVUzwvbGluaz4gICAgICAgICAgICAgX0lPUignbycsIDY5LCBmZV9zdGF0dXNfdCkKLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iRkVfUkVBRF9CRVIiPkZFX1JFQURfQkVSPC9saW5rPiAgICAgICAgICAgICAgICBfSU9SKCdvJywgNzAsIF9fdTMyKQotI2RlZmluZSA8bGluayBsaW5rZW5kPSJGRV9SRUFEX1NJR05BTF9TVFJFTkdUSCI+RkVfUkVBRF9TSUdOQUxfU1RSRU5HVEg8L2xpbms+ICAgIF9JT1IoJ28nLCA3MSwgX191MTYpCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IkZFX1JFQURfU05SIj5GRV9SRUFEX1NOUjwvbGluaz4gICAgICAgICAgICAgICAgX0lPUignbycsIDcyLCBfX3UxNikKLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iRkVfUkVBRF9VTkNPUlJFQ1RFRF9CTE9DS1MiPkZFX1JFQURfVU5DT1JSRUNURURfQkxPQ0tTPC9saW5rPiBfSU9SKCdvJywgNzMsIF9fdTMyKQotCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IkZFX1NFVF9GUk9OVEVORCI+RkVfU0VUX0ZST05URU5EPC9saW5rPiAgICAgICAgICAgIF9JT1coJ28nLCA3Niwgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzKQotI2RlZmluZSA8bGluayBsaW5rZW5kPSJGRV9HRVRfRlJPTlRFTkQiPkZFX0dFVF9GUk9OVEVORDwvbGluaz4gICAgICAgICAgICBfSU9SKCdvJywgNzcsIHN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycykKLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iRkVfU0VUX0ZST05URU5EX1RVTkVfTU9ERSI+RkVfU0VUX0ZST05URU5EX1RVTkVfTU9ERTwvbGluaz4gIF9JTygnbycsIDgxKSAvKiB1bnNpZ25lZCBpbnQgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iRkVfR0VUX0VWRU5UIj5GRV9HRVRfRVZFTlQ8L2xpbms+ICAgICAgICAgICAgICAgX0lPUignbycsIDc4LCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX2V2ZW50KQotCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IkZFX0RJU0hORVRXT1JLX1NFTkRfTEVHQUNZX0NNRCI+RkVfRElTSE5FVFdPUktfU0VORF9MRUdBQ1lfQ01EPC9saW5rPiBfSU8oJ28nLCA4MCkgLyogdW5zaWduZWQgaW50ICovCi0KLSNlbmRpZiAvKl9EVkJGUk9OVEVORF9IXyovCi08L3Byb2dyYW1saXN0aW5nPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9uZXQueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9uZXQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGUzODhkLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvbmV0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTx0aXRsZT5EVkIgTmV0d29yayBBUEk8L3RpdGxlPgotPHBhcmE+VGhlIERWQiBuZXQgZGV2aWNlIGVuYWJsZXMgZmVlZGluZyBvZiBNUEUgKG11bHRpIHByb3RvY29sIGVuY2Fwc3VsYXRpb24pIHBhY2tldHMKLXJlY2VpdmVkIHZpYSBEVkIgaW50byB0aGUgTGludXggbmV0d29yayBwcm90b2NvbCBzdGFjaywgZS5nLiBmb3IgaW50ZXJuZXQgdmlhIHNhdGVsbGl0ZQotYXBwbGljYXRpb25zLiBJdCBjYW4gYmUgYWNjZXNzZWQgdGhyb3VnaCA8ZW1waGFzaXMgcm9sZT0idHQiPi9kZXYvZHZiL2FkYXB0ZXIwL25ldDA8L2VtcGhhc2lzPi4gRGF0YSB0eXBlcyBhbmQKLWFuZCBpb2N0bCBkZWZpbml0aW9ucyBjYW4gYmUgYWNjZXNzZWQgYnkgaW5jbHVkaW5nIDxlbXBoYXNpcyByb2xlPSJ0dCI+bGludXgvZHZiL25ldC5oPC9lbXBoYXNpcz4gaW4geW91cgotYXBwbGljYXRpb24uCi08L3BhcmE+Ci08c2VjdGlvbiBpZD0iZHZiX25ldF90eXBlcyI+Ci08dGl0bGU+RFZCIE5ldCBEYXRhIFR5cGVzPC90aXRsZT4KLTxwYXJhPlRvIGJlIHdyaXR0ZW4mI3gyMDI2OwotPC9wYXJhPgotPC9zZWN0aW9uPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhLWVudGl0aWVzLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEtZW50aXRpZXMudG1wbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVmZTA5NC4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEtZW50aXRpZXMudG1wbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2NCArMCwwIEBACi08IS0tIEdlbmVyYXRlZCBmaWxlISBEbyBub3QgZWRpdC4gLS0+Ci0KLTwhLS0gRnVuY3Rpb25zIC0tPgotPCFFTlRJVFkgZnVuYy1jbG9zZSAiPGxpbmsgbGlua2VuZD0nZnVuYy1jbG9zZSc+PGZ1bmN0aW9uPmNsb3NlKCk8L2Z1bmN0aW9uPjwvbGluaz4iPgotPCFFTlRJVFkgZnVuYy1pb2N0bCAiPGxpbmsgbGlua2VuZD0nZnVuYy1pb2N0bCc+PGZ1bmN0aW9uPmlvY3RsKCk8L2Z1bmN0aW9uPjwvbGluaz4iPgotPCFFTlRJVFkgZnVuYy1tbWFwICI8bGluayBsaW5rZW5kPSdmdW5jLW1tYXAnPjxmdW5jdGlvbj5tbWFwKCk8L2Z1bmN0aW9uPjwvbGluaz4iPgotPCFFTlRJVFkgZnVuYy1tdW5tYXAgIjxsaW5rIGxpbmtlbmQ9J2Z1bmMtbXVubWFwJz48ZnVuY3Rpb24+bXVubWFwKCk8L2Z1bmN0aW9uPjwvbGluaz4iPgotPCFFTlRJVFkgZnVuYy1vcGVuICI8bGluayBsaW5rZW5kPSdmdW5jLW9wZW4nPjxmdW5jdGlvbj5vcGVuKCk8L2Z1bmN0aW9uPjwvbGluaz4iPgotPCFFTlRJVFkgZnVuYy1wb2xsICI8bGluayBsaW5rZW5kPSdmdW5jLXBvbGwnPjxmdW5jdGlvbj5wb2xsKCk8L2Z1bmN0aW9uPjwvbGluaz4iPgotPCFFTlRJVFkgZnVuYy1yZWFkICI8bGluayBsaW5rZW5kPSdmdW5jLXJlYWQnPjxmdW5jdGlvbj5yZWFkKCk8L2Z1bmN0aW9uPjwvbGluaz4iPgotPCFFTlRJVFkgZnVuYy1zZWxlY3QgIjxsaW5rIGxpbmtlbmQ9J2Z1bmMtc2VsZWN0Jz48ZnVuY3Rpb24+c2VsZWN0KCk8L2Z1bmN0aW9uPjwvbGluaz4iPgotPCFFTlRJVFkgZnVuYy13cml0ZSAiPGxpbmsgbGlua2VuZD0nZnVuYy13cml0ZSc+PGZ1bmN0aW9uPndyaXRlKCk8L2Z1bmN0aW9uPjwvbGluaz4iPgotCi08IUVOVElUWSBtZWRpYS1mdW5jLWNsb3NlICI8bGluayBsaW5rZW5kPSdtZWRpYS1mdW5jLWNsb3NlJz48ZnVuY3Rpb24+Y2xvc2UoKTwvZnVuY3Rpb24+PC9saW5rPiI+Ci08IUVOVElUWSBtZWRpYS1mdW5jLWlvY3RsICI8bGluayBsaW5rZW5kPSdtZWRpYS1mdW5jLWlvY3RsJz48ZnVuY3Rpb24+aW9jdGwoKTwvZnVuY3Rpb24+PC9saW5rPiI+Ci08IUVOVElUWSBtZWRpYS1mdW5jLW9wZW4gIjxsaW5rIGxpbmtlbmQ9J21lZGlhLWZ1bmMtb3Blbic+PGZ1bmN0aW9uPm9wZW4oKTwvZnVuY3Rpb24+PC9saW5rPiI+Ci0KLTwhLS0gSW9jdGxzIC0tPgotPCFFTlRJVFkgVklESU9DLUNST1BDQVAgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1jcm9wY2FwJz48Y29uc3RhbnQ+VklESU9DX0NST1BDQVA8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLURCRy1HLUNISVAtSURFTlQgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1kYmctZy1jaGlwLWlkZW50Jz48Y29uc3RhbnQ+VklESU9DX0RCR19HX0NISVBfSURFTlQ8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLURCRy1HLVJFR0lTVEVSICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZGJnLWctcmVnaXN0ZXInPjxjb25zdGFudD5WSURJT0NfREJHX0dfUkVHSVNURVI8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLURCRy1TLVJFR0lTVEVSICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZGJnLWctcmVnaXN0ZXInPjxjb25zdGFudD5WSURJT0NfREJHX1NfUkVHSVNURVI8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLURRQlVGICI8bGluayBsaW5rZW5kPSd2aWRpb2MtcWJ1Zic+PGNvbnN0YW50PlZJRElPQ19EUUJVRjwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtRFFFVkVOVCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWRxZXZlbnQnPjxjb25zdGFudD5WSURJT0NfRFFFVkVOVDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtRU5DT0RFUi1DTUQgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1lbmNvZGVyLWNtZCc+PGNvbnN0YW50PlZJRElPQ19FTkNPREVSX0NNRDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtRU5VTUFVRElPICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZW51bWF1ZGlvJz48Y29uc3RhbnQ+VklESU9DX0VOVU1BVURJTzwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtRU5VTUFVRE9VVCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWVudW1hdWRpb291dCc+PGNvbnN0YW50PlZJRElPQ19FTlVNQVVET1VUPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1FTlVNSU5QVVQgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1lbnVtaW5wdXQnPjxjb25zdGFudD5WSURJT0NfRU5VTUlOUFVUPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1FTlVNT1VUUFVUICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZW51bW91dHB1dCc+PGNvbnN0YW50PlZJRElPQ19FTlVNT1VUUFVUPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1FTlVNU1REICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZW51bXN0ZCc+PGNvbnN0YW50PlZJRElPQ19FTlVNU1REPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1FTlVNLURWLVBSRVNFVFMgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1lbnVtLWR2LXByZXNldHMnPjxjb25zdGFudD5WSURJT0NfRU5VTV9EVl9QUkVTRVRTPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1FTlVNLUZNVCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWVudW0tZm10Jz48Y29uc3RhbnQ+VklESU9DX0VOVU1fRk1UPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1FTlVNLUZSQU1FSU5URVJWQUxTICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZW51bS1mcmFtZWludGVydmFscyc+PGNvbnN0YW50PlZJRElPQ19FTlVNX0ZSQU1FSU5URVJWQUxTPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1FTlVNLUZSQU1FU0laRVMgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1lbnVtLWZyYW1lc2l6ZXMnPjxjb25zdGFudD5WSURJT0NfRU5VTV9GUkFNRVNJWkVTPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1HLUFVRElPICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1hdWRpbyc+PGNvbnN0YW50PlZJRElPQ19HX0FVRElPPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1HLUFVRE9VVCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctYXVkaW9vdXQnPjxjb25zdGFudD5WSURJT0NfR19BVURPVVQ8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctQ1JPUCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctY3JvcCc+PGNvbnN0YW50PlZJRElPQ19HX0NST1A8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctQ1RSTCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctY3RybCc+PGNvbnN0YW50PlZJRElPQ19HX0NUUkw8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctRFYtUFJFU0VUICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1kdi1wcmVzZXQnPjxjb25zdGFudD5WSURJT0NfR19EVl9QUkVTRVQ8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctRFYtVElNSU5HUyAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctZHYtdGltaW5ncyc+PGNvbnN0YW50PlZJRElPQ19HX0RWX1RJTUlOR1M8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctRU5DLUlOREVYICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1lbmMtaW5kZXgnPjxjb25zdGFudD5WSURJT0NfR19FTkNfSU5ERVg8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctRVhULUNUUkxTICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1leHQtY3RybHMnPjxjb25zdGFudD5WSURJT0NfR19FWFRfQ1RSTFM8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctRkJVRiAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctZmJ1Zic+PGNvbnN0YW50PlZJRElPQ19HX0ZCVUY8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctRk1UICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1mbXQnPjxjb25zdGFudD5WSURJT0NfR19GTVQ8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctRlJFUVVFTkNZICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1mcmVxdWVuY3knPjxjb25zdGFudD5WSURJT0NfR19GUkVRVUVOQ1k8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctSU5QVVQgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLWlucHV0Jz48Y29uc3RhbnQ+VklESU9DX0dfSU5QVVQ8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctSlBFR0NPTVAgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLWpwZWdjb21wJz48Y29uc3RhbnQ+VklESU9DX0dfSlBFR0NPTVA8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLUctTVBFR0NPTVAgIjxsaW5rIGxpbmtlbmQ9Jyc+PGNvbnN0YW50PlZJRElPQ19HX01QRUdDT01QPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1HLU1PRFVMQVRPUiAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctbW9kdWxhdG9yJz48Y29uc3RhbnQ+VklESU9DX0dfTU9EVUxBVE9SPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1HLU9VVFBVVCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctb3V0cHV0Jz48Y29uc3RhbnQ+VklESU9DX0dfT1VUUFVUPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1HLVBBUk0gIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLXBhcm0nPjxjb25zdGFudD5WSURJT0NfR19QQVJNPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1HLVBSSU9SSVRZICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1wcmlvcml0eSc+PGNvbnN0YW50PlZJRElPQ19HX1BSSU9SSVRZPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1HLVNMSUNFRC1WQkktQ0FQICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1zbGljZWQtdmJpLWNhcCc+PGNvbnN0YW50PlZJRElPQ19HX1NMSUNFRF9WQklfQ0FQPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1HLVNURCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctc3RkJz48Y29uc3RhbnQ+VklESU9DX0dfU1REPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1HLVRVTkVSICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy10dW5lcic+PGNvbnN0YW50PlZJRElPQ19HX1RVTkVSPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1MT0ctU1RBVFVTICI8bGluayBsaW5rZW5kPSd2aWRpb2MtbG9nLXN0YXR1cyc+PGNvbnN0YW50PlZJRElPQ19MT0dfU1RBVFVTPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1PVkVSTEFZICI8bGluayBsaW5rZW5kPSd2aWRpb2Mtb3ZlcmxheSc+PGNvbnN0YW50PlZJRElPQ19PVkVSTEFZPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1RQlVGICI8bGluayBsaW5rZW5kPSd2aWRpb2MtcWJ1Zic+PGNvbnN0YW50PlZJRElPQ19RQlVGPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1RVUVSWUJVRiAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLXF1ZXJ5YnVmJz48Y29uc3RhbnQ+VklESU9DX1FVRVJZQlVGPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1RVUVSWUNBUCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLXF1ZXJ5Y2FwJz48Y29uc3RhbnQ+VklESU9DX1FVRVJZQ0FQPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1RVUVSWUNUUkwgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1xdWVyeWN0cmwnPjxjb25zdGFudD5WSURJT0NfUVVFUllDVFJMPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1RVUVSWU1FTlUgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1xdWVyeWN0cmwnPjxjb25zdGFudD5WSURJT0NfUVVFUllNRU5VPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1RVUVSWVNURCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLXF1ZXJ5c3RkJz48Y29uc3RhbnQ+VklESU9DX1FVRVJZU1REPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1RVUVSWS1EVi1QUkVTRVQgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1xdWVyeS1kdi1wcmVzZXQnPjxjb25zdGFudD5WSURJT0NfUVVFUllfRFZfUFJFU0VUPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1SRVFCVUZTICI8bGluayBsaW5rZW5kPSd2aWRpb2MtcmVxYnVmcyc+PGNvbnN0YW50PlZJRElPQ19SRVFCVUZTPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1TVFJFQU1PRkYgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1zdHJlYW1vbic+PGNvbnN0YW50PlZJRElPQ19TVFJFQU1PRkY8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVNUUkVBTU9OICI8bGluayBsaW5rZW5kPSd2aWRpb2Mtc3RyZWFtb24nPjxjb25zdGFudD5WSURJT0NfU1RSRUFNT048L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVNVQlNDUklCRS1FVkVOVCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLXN1YnNjcmliZS1ldmVudCc+PGNvbnN0YW50PlZJRElPQ19TVUJTQ1JJQkVfRVZFTlQ8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVMtQVVESU8gIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLWF1ZGlvJz48Y29uc3RhbnQ+VklESU9DX1NfQVVESU88L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVMtQVVET1VUICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1hdWRpb291dCc+PGNvbnN0YW50PlZJRElPQ19TX0FVRE9VVDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1DUk9QICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1jcm9wJz48Y29uc3RhbnQ+VklESU9DX1NfQ1JPUDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1DVFJMICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1jdHJsJz48Y29uc3RhbnQ+VklESU9DX1NfQ1RSTDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1EVi1QUkVTRVQgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLWR2LXByZXNldCc+PGNvbnN0YW50PlZJRElPQ19TX0RWX1BSRVNFVDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1EVi1USU1JTkdTICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1kdi10aW1pbmdzJz48Y29uc3RhbnQ+VklESU9DX1NfRFZfVElNSU5HUzwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1FWFQtQ1RSTFMgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLWV4dC1jdHJscyc+PGNvbnN0YW50PlZJRElPQ19TX0VYVF9DVFJMUzwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1GQlVGICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1mYnVmJz48Y29uc3RhbnQ+VklESU9DX1NfRkJVRjwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1GTVQgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLWZtdCc+PGNvbnN0YW50PlZJRElPQ19TX0ZNVDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1GUkVRVUVOQ1kgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLWZyZXF1ZW5jeSc+PGNvbnN0YW50PlZJRElPQ19TX0ZSRVFVRU5DWTwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1IVy1GUkVRLVNFRUsgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1zLWh3LWZyZXEtc2Vlayc+PGNvbnN0YW50PlZJRElPQ19TX0hXX0ZSRVFfU0VFSzwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1JTlBVVCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctaW5wdXQnPjxjb25zdGFudD5WSURJT0NfU19JTlBVVDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1KUEVHQ09NUCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctanBlZ2NvbXAnPjxjb25zdGFudD5WSURJT0NfU19KUEVHQ09NUDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtUy1NUEVHQ09NUCAiPGxpbmsgbGlua2VuZD0nJz48Y29uc3RhbnQ+VklESU9DX1NfTVBFR0NPTVA8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVMtTU9EVUxBVE9SICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1tb2R1bGF0b3InPjxjb25zdGFudD5WSURJT0NfU19NT0RVTEFUT1I8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVMtT1VUUFVUICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1vdXRwdXQnPjxjb25zdGFudD5WSURJT0NfU19PVVRQVVQ8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVMtUEFSTSAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctcGFybSc+PGNvbnN0YW50PlZJRElPQ19TX1BBUk08L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVMtUFJJT1JJVFkgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLXByaW9yaXR5Jz48Y29uc3RhbnQ+VklESU9DX1NfUFJJT1JJVFk8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVMtU1REICI8bGluayBsaW5rZW5kPSd2aWRpb2MtZy1zdGQnPjxjb25zdGFudD5WSURJT0NfU19TVEQ8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVMtVFVORVIgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLXR1bmVyJz48Y29uc3RhbnQ+VklESU9DX1NfVFVORVI8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVNVQkRFVi1FTlVNLUZSQU1FLVNJWkUgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1zdWJkZXYtZW51bS1mcmFtZS1zaXplJz48Y29uc3RhbnQ+VklESU9DX1NVQkRFVl9FTlVNX0ZSQU1FX1NJWkU8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVNVQkRFVi1FTlVNLU1CVVMtQ09ERSAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLXN1YmRldi1lbnVtLW1idXMtY29kZSc+PGNvbnN0YW50PlZJRElPQ19TVUJERVZfRU5VTV9NQlVTX0NPREU8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVNVQkRFVi1HLUNST1AgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1zdWJkZXYtZy1jcm9wJz48Y29uc3RhbnQ+VklESU9DX1NVQkRFVl9HX0NST1A8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVNVQkRFVi1HLUZNVCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLXN1YmRldi1nLWZtdCc+PGNvbnN0YW50PlZJRElPQ19TVUJERVZfR19GTVQ8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVNVQkRFVi1HLUZSQU1FLUlOVEVSVkFMICI8bGluayBsaW5rZW5kPSd2aWRpb2Mtc3ViZGV2LWctZnJhbWUtaW50ZXJ2YWwnPjxjb25zdGFudD5WSURJT0NfU1VCREVWX0dfRlJBTUVfSU5URVJWQUw8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVNVQkRFVi1TLUNST1AgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1zdWJkZXYtZy1jcm9wJz48Y29uc3RhbnQ+VklESU9DX1NVQkRFVl9TX0NST1A8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVNVQkRFVi1TLUZNVCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLXN1YmRldi1nLWZtdCc+PGNvbnN0YW50PlZJRElPQ19TVUJERVZfU19GTVQ8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVNVQkRFVi1TLUZSQU1FLUlOVEVSVkFMICI8bGluayBsaW5rZW5kPSd2aWRpb2Mtc3ViZGV2LWctZnJhbWUtaW50ZXJ2YWwnPjxjb25zdGFudD5WSURJT0NfU1VCREVWX1NfRlJBTUVfSU5URVJWQUw8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVRSWS1FTkNPREVSLUNNRCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWVuY29kZXItY21kJz48Y29uc3RhbnQ+VklESU9DX1RSWV9FTkNPREVSX0NNRDwvY29uc3RhbnQ+PC9saW5rPiI+Ci08IUVOVElUWSBWSURJT0MtVFJZLUVYVC1DVFJMUyAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLWctZXh0LWN0cmxzJz48Y29uc3RhbnQ+VklESU9DX1RSWV9FWFRfQ1RSTFM8L2NvbnN0YW50PjwvbGluaz4iPgotPCFFTlRJVFkgVklESU9DLVRSWS1GTVQgIjxsaW5rIGxpbmtlbmQ9J3ZpZGlvYy1nLWZtdCc+PGNvbnN0YW50PlZJRElPQ19UUllfRk1UPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIFZJRElPQy1VTlNVQlNDUklCRS1FVkVOVCAiPGxpbmsgbGlua2VuZD0ndmlkaW9jLXN1YnNjcmliZS1ldmVudCc+PGNvbnN0YW50PlZJRElPQ19VTlNVQlNDUklCRV9FVkVOVDwvY29uc3RhbnQ+PC9saW5rPiI+Ci0KLTwhRU5USVRZIE1FRElBLUlPQy1ERVZJQ0UtSU5GTyAiPGxpbmsgbGlua2VuZD0nbWVkaWEtaW9jLWRldmljZS1pbmZvJz48Y29uc3RhbnQ+TUVESUFfSU9DX0RFVklDRV9JTkZPPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIE1FRElBLUlPQy1FTlVNLUVOVElUSUVTICI8bGluayBsaW5rZW5kPSdtZWRpYS1pb2MtZW51bS1lbnRpdGllcyc+PGNvbnN0YW50Pk1FRElBX0lPQ19FTlVNX0VOVElUSUVTPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIE1FRElBLUlPQy1FTlVNLUxJTktTICI8bGluayBsaW5rZW5kPSdtZWRpYS1pb2MtZW51bS1saW5rcyc+PGNvbnN0YW50Pk1FRElBX0lPQ19FTlVNX0xJTktTPC9jb25zdGFudD48L2xpbms+Ij4KLTwhRU5USVRZIE1FRElBLUlPQy1TRVRVUC1MSU5LICI8bGluayBsaW5rZW5kPSdtZWRpYS1pb2Mtc2V0dXAtbGluayc+PGNvbnN0YW50Pk1FRElBX0lPQ19TRVRVUF9MSU5LPC9jb25zdGFudD48L2xpbms+Ij4KLQotPCEtLSBUeXBlcyAtLT4KLTwhRU5USVRZIHY0bDItc3RkLWlkICI8bGluayBsaW5rZW5kPSd2NGwyLXN0ZC1pZCc+djRsMl9zdGRfaWQ8L2xpbms+Ij4KLQotPCEtLSBFbnVtcyAtLT4KLTwhRU5USVRZIHY0bDItYnVmLXR5cGUgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWJ1Zi10eXBlJz52NGwyX2J1Zl90eXBlPC9saW5rPiI+Ci08IUVOVElUWSB2NGwyLWNvbG9yc3BhY2UgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWNvbG9yc3BhY2UnPnY0bDJfY29sb3JzcGFjZTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1jdHJsLXR5cGUgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWN0cmwtdHlwZSc+djRsMl9jdHJsX3R5cGU8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZXhwb3N1cmUtYXV0by10eXBlICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1leHBvc3VyZS1hdXRvLXR5cGUnPnY0bDJfZXhwb3N1cmVfYXV0b190eXBlPC9saW5rPiI+Ci08IUVOVElUWSB2NGwyLWZpZWxkICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1maWVsZCc+djRsMl9maWVsZDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1mcm1pdmFsdHlwZXMgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWZybWl2YWx0eXBlcyc+djRsMl9mcm1pdmFsdHlwZXM8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZnJtc2l6ZXR5cGVzICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1mcm1zaXpldHlwZXMnPnY0bDJfZnJtc2l6ZXR5cGVzPC9saW5rPiI+Ci08IUVOVElUWSB2NGwyLW1idXMtcGl4ZWxjb2RlICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tYnVzLXBpeGVsY29kZSc+djRsMl9tYnVzX3BpeGVsY29kZTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1tZW1vcnkgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1lbW9yeSc+djRsMl9tZW1vcnk8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItbXBlZy1hdWRpby1hYzMtYml0cmF0ZSAiZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1hdWRpby1hYzMtYml0cmF0ZSc+djRsMl9tcGVnX2F1ZGlvX2FjM19iaXRyYXRlPC9saW5rPiI+Ci08IUVOVElUWSB2NGwyLW1wZWctYXVkaW8tY3JjICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLWF1ZGlvLWNyYyc+djRsMl9tcGVnX2F1ZGlvX2NyYzwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1tcGVnLWF1ZGlvLWVtcGhhc2lzICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLWF1ZGlvLWVtcGhhc2lzJz52NGwyX21wZWdfYXVkaW9fZW1waGFzaXM8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItbXBlZy1hdWRpby1lbmNvZGluZyAiZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1hdWRpby1lbmNvZGluZyc+djRsMl9tcGVnX2F1ZGlvX2VuY29kaW5nPC9saW5rPiI+Ci08IUVOVElUWSB2NGwyLW1wZWctYXVkaW8tbDEtYml0cmF0ZSAiZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1hdWRpby1sMS1iaXRyYXRlJz52NGwyX21wZWdfYXVkaW9fbDFfYml0cmF0ZTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1tcGVnLWF1ZGlvLWwyLWJpdHJhdGUgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctYXVkaW8tbDItYml0cmF0ZSc+djRsMl9tcGVnX2F1ZGlvX2wyX2JpdHJhdGU8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItbXBlZy1hdWRpby1sMy1iaXRyYXRlICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLWF1ZGlvLWwzLWJpdHJhdGUnPnY0bDJfbXBlZ19hdWRpb19sM19iaXRyYXRlPC9saW5rPiI+Ci08IUVOVElUWSB2NGwyLW1wZWctYXVkaW8tbW9kZSAiZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1hdWRpby1tb2RlJz52NGwyX21wZWdfYXVkaW9fbW9kZTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1tcGVnLWF1ZGlvLW1vZGUtZXh0ZW5zaW9uICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLWF1ZGlvLW1vZGUtZXh0ZW5zaW9uJz52NGwyX21wZWdfYXVkaW9fbW9kZV9leHRlbnNpb248L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItbXBlZy1hdWRpby1zYW1wbGluZy1mcmVxICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLWF1ZGlvLXNhbXBsaW5nLWZyZXEnPnY0bDJfbXBlZ19hdWRpb19zYW1wbGluZ19mcmVxPC9saW5rPiI+Ci08IUVOVElUWSBjaHJvbWEtc3BhdGlhbC1maWx0ZXItdHlwZSAiZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J2Nocm9tYS1zcGF0aWFsLWZpbHRlci10eXBlJz52NGwyX21wZWdfY3gyMzQxeF92aWRlb19jaHJvbWFfc3BhdGlhbF9maWx0ZXJfdHlwZTwvbGluaz4iPgotPCFFTlRJVFkgbHVtYS1zcGF0aWFsLWZpbHRlci10eXBlICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0nbHVtYS1zcGF0aWFsLWZpbHRlci10eXBlJz52NGwyX21wZWdfY3gyMzQxeF92aWRlb19sdW1hX3NwYXRpYWxfZmlsdGVyX3R5cGU8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItbXBlZy1jeDIzNDF4LXZpZGVvLW1lZGlhbi1maWx0ZXItdHlwZSAiZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1jeDIzNDF4LXZpZGVvLW1lZGlhbi1maWx0ZXItdHlwZSc+djRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fbWVkaWFuX2ZpbHRlcl90eXBlPC9saW5rPiI+Ci08IUVOVElUWSB2NGwyLW1wZWctY3gyMzQxeC12aWRlby1zcGF0aWFsLWZpbHRlci1tb2RlICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLWN4MjM0MXgtdmlkZW8tc3BhdGlhbC1maWx0ZXItbW9kZSc+djRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fc3BhdGlhbF9maWx0ZXJfbW9kZTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1tcGVnLWN4MjM0MXgtdmlkZW8tdGVtcG9yYWwtZmlsdGVyLW1vZGUgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctY3gyMzQxeC12aWRlby10ZW1wb3JhbC1maWx0ZXItbW9kZSc+djRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fdGVtcG9yYWxfZmlsdGVyX21vZGU8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItbXBlZy1zdHJlYW0tdHlwZSAiZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1zdHJlYW0tdHlwZSc+djRsMl9tcGVnX3N0cmVhbV90eXBlPC9saW5rPiI+Ci08IUVOVElUWSB2NGwyLW1wZWctc3RyZWFtLXZiaS1mbXQgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctc3RyZWFtLXZiaS1mbXQnPnY0bDJfbXBlZ19zdHJlYW1fdmJpX2ZtdDwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1tcGVnLXZpZGVvLWFzcGVjdCAiZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy12aWRlby1hc3BlY3QnPnY0bDJfbXBlZ192aWRlb19hc3BlY3Q8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItbXBlZy12aWRlby1iaXRyYXRlLW1vZGUgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctdmlkZW8tYml0cmF0ZS1tb2RlJz52NGwyX21wZWdfdmlkZW9fYml0cmF0ZV9tb2RlPC9saW5rPiI+Ci08IUVOVElUWSB2NGwyLW1wZWctdmlkZW8tZW5jb2RpbmcgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctdmlkZW8tZW5jb2RpbmcnPnY0bDJfbXBlZ192aWRlb19lbmNvZGluZzwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi1wb3dlci1saW5lLWZyZXF1ZW5jeSAiZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItcG93ZXItbGluZS1mcmVxdWVuY3knPnY0bDJfcG93ZXJfbGluZV9mcmVxdWVuY3k8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItcHJpb3JpdHkgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXByaW9yaXR5Jz52NGwyX3ByaW9yaXR5PC9saW5rPiI+Ci08IUVOVElUWSB2NGwyLXN1YmRldi1mb3JtYXQtd2hlbmNlICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1zdWJkZXYtZm9ybWF0LXdoZW5jZSc+djRsMl9zdWJkZXZfZm9ybWF0X3doZW5jZTwvbGluaz4iPgotPCFFTlRJVFkgdjRsMi10dW5lci10eXBlICJlbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi10dW5lci10eXBlJz52NGwyX3R1bmVyX3R5cGU8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItcHJlZW1waGFzaXMgImVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXByZWVtcGhhc2lzJz52NGwyX3ByZWVtcGhhc2lzPC9saW5rPiI+Ci0KLTwhLS0gU3RydWN0dXJlcyAtLT4KLTwhRU5USVRZIHY0bDItYXVkaW8gInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItYXVkaW8nPnY0bDJfYXVkaW88L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItYXVkaW9vdXQgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItYXVkaW9vdXQnPnY0bDJfYXVkaW9vdXQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItYnQtdGltaW5ncyAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1idC10aW1pbmdzJz52NGwyX2J0X3RpbWluZ3M8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItYnVmZmVyICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWJ1ZmZlcic+djRsMl9idWZmZXI8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItcGxhbmUgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItcGxhbmUnPnY0bDJfcGxhbmU8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItY2FwYWJpbGl0eSAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1jYXBhYmlsaXR5Jz52NGwyX2NhcGFiaWxpdHk8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItY2FwdHVyZXBhcm0gInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItY2FwdHVyZXBhcm0nPnY0bDJfY2FwdHVyZXBhcm08L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItY2xpcCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1jbGlwJz52NGwyX2NsaXA8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItY29udHJvbCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1jb250cm9sJz52NGwyX2NvbnRyb2w8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItY3JvcCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1jcm9wJz52NGwyX2Nyb3A8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItY3JvcGNhcCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1jcm9wY2FwJz52NGwyX2Nyb3BjYXA8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZGJnLWNoaXAtaWRlbnQgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZGJnLWNoaXAtaWRlbnQnPnY0bDJfZGJnX2NoaXBfaWRlbnQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZGJnLW1hdGNoICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWRiZy1tYXRjaCc+djRsMl9kYmdfbWF0Y2g8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZGJnLXJlZ2lzdGVyICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWRiZy1yZWdpc3Rlcic+djRsMl9kYmdfcmVnaXN0ZXI8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZHYtZW51bS1wcmVzZXQgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZHYtZW51bS1wcmVzZXQnPnY0bDJfZHZfZW51bV9wcmVzZXQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZHYtcHJlc2V0ICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWR2LXByZXNldCc+djRsMl9kdl9wcmVzZXQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZHYtdGltaW5ncyAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1kdi10aW1pbmdzJz52NGwyX2R2X3RpbWluZ3M8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZW5jLWlkeCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1lbmMtaWR4Jz52NGwyX2VuY19pZHg8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZW5jLWlkeC1lbnRyeSAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1lbmMtaWR4LWVudHJ5Jz52NGwyX2VuY19pZHhfZW50cnk8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZW5jb2Rlci1jbWQgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZW5jb2Rlci1jbWQnPnY0bDJfZW5jb2Rlcl9jbWQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZXZlbnQgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZXZlbnQnPnY0bDJfZXZlbnQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZXZlbnQtc3Vic2NyaXB0aW9uICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWV2ZW50LXN1YnNjcmlwdGlvbic+djRsMl9ldmVudF9zdWJzY3JpcHRpb248L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZXZlbnQtdnN5bmMgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZXZlbnQtdnN5bmMnPnY0bDJfZXZlbnRfdnN5bmM8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZXh0LWNvbnRyb2wgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZXh0LWNvbnRyb2wnPnY0bDJfZXh0X2NvbnRyb2w8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZXh0LWNvbnRyb2xzICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWV4dC1jb250cm9scyc+djRsMl9leHRfY29udHJvbHM8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZm10ZGVzYyAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1mbXRkZXNjJz52NGwyX2ZtdGRlc2M8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZm9ybWF0ICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWZvcm1hdCc+djRsMl9mb3JtYXQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZnJhY3QgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZnJhY3QnPnY0bDJfZnJhY3Q8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZnJhbWVidWZmZXIgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZnJhbWVidWZmZXInPnY0bDJfZnJhbWVidWZmZXI8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZnJlcXVlbmN5ICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWZyZXF1ZW5jeSc+djRsMl9mcmVxdWVuY3k8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZnJtaXZhbC1zdGVwd2lzZSAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1mcm1pdmFsLXN0ZXB3aXNlJz52NGwyX2ZybWl2YWxfc3RlcHdpc2U8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZnJtaXZhbGVudW0gInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZnJtaXZhbGVudW0nPnY0bDJfZnJtaXZhbGVudW08L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZnJtc2l6ZS1kaXNjcmV0ZSAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1mcm1zaXplLWRpc2NyZXRlJz52NGwyX2ZybXNpemVfZGlzY3JldGU8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZnJtc2l6ZS1zdGVwd2lzZSAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1mcm1zaXplLXN0ZXB3aXNlJz52NGwyX2ZybXNpemVfc3RlcHdpc2U8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItZnJtc2l6ZWVudW0gInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZnJtc2l6ZWVudW0nPnY0bDJfZnJtc2l6ZWVudW08L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItaHctZnJlcS1zZWVrICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWh3LWZyZXEtc2Vlayc+djRsMl9od19mcmVxX3NlZWs8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItaW5wdXQgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItaW5wdXQnPnY0bDJfaW5wdXQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItanBlZ2NvbXByZXNzaW9uICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWpwZWdjb21wcmVzc2lvbic+djRsMl9qcGVnY29tcHJlc3Npb248L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItbWJ1cy1mcmFtZWZtdCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tYnVzLWZyYW1lZm10Jz52NGwyX21idXNfZnJhbWVmbXQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItbW9kdWxhdG9yICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1vZHVsYXRvcic+djRsMl9tb2R1bGF0b3I8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItbXBlZy12YmktZm10LWl2dHYgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy12YmktZm10LWl2dHYnPnY0bDJfbXBlZ192YmlfZm10X2l2dHY8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItb3V0cHV0ICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW91dHB1dCc+djRsMl9vdXRwdXQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItb3V0cHV0cGFybSAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1vdXRwdXRwYXJtJz52NGwyX291dHB1dHBhcm08L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItcGl4LWZvcm1hdCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1waXgtZm9ybWF0Jz52NGwyX3BpeF9mb3JtYXQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItcGl4LWZvcm1hdC1tcGxhbmUgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItcGl4LWZvcm1hdC1tcGxhbmUnPnY0bDJfcGl4X2Zvcm1hdF9tcGxhbmU8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItcGxhbmUtcGl4LWZvcm1hdCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1wbGFuZS1waXgtZm9ybWF0Jz52NGwyX3BsYW5lX3BpeF9mb3JtYXQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItcXVlcnljdHJsICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXF1ZXJ5Y3RybCc+djRsMl9xdWVyeWN0cmw8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItcXVlcnltZW51ICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXF1ZXJ5bWVudSc+djRsMl9xdWVyeW1lbnU8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItcmVjdCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1yZWN0Jz52NGwyX3JlY3Q8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItcmVxdWVzdGJ1ZmZlcnMgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItcmVxdWVzdGJ1ZmZlcnMnPnY0bDJfcmVxdWVzdGJ1ZmZlcnM8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItc2xpY2VkLXZiaS1jYXAgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItc2xpY2VkLXZiaS1jYXAnPnY0bDJfc2xpY2VkX3ZiaV9jYXA8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItc2xpY2VkLXZiaS1kYXRhICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXNsaWNlZC12YmktZGF0YSc+djRsMl9zbGljZWRfdmJpX2RhdGE8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItc2xpY2VkLXZiaS1mb3JtYXQgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItc2xpY2VkLXZiaS1mb3JtYXQnPnY0bDJfc2xpY2VkX3ZiaV9mb3JtYXQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItc3ViZGV2LWZyYW1lLWludGVydmFsICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXN1YmRldi1mcmFtZS1pbnRlcnZhbCc+djRsMl9zdWJkZXZfZnJhbWVfaW50ZXJ2YWw8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItc3ViZGV2LWZyYW1lLWludGVydmFsLWVudW0gInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItc3ViZGV2LWZyYW1lLWludGVydmFsLWVudW0nPnY0bDJfc3ViZGV2X2ZyYW1lX2ludGVydmFsX2VudW08L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItc3ViZGV2LWZyYW1lLXNpemUtZW51bSAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1zdWJkZXYtZnJhbWUtc2l6ZS1lbnVtJz52NGwyX3N1YmRldl9mcmFtZV9zaXplX2VudW08L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItc3ViZGV2LWNyb3AgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItc3ViZGV2LWNyb3AnPnY0bDJfc3ViZGV2X2Nyb3A8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItc3ViZGV2LWZvcm1hdCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1zdWJkZXYtZm9ybWF0Jz52NGwyX3N1YmRldl9mb3JtYXQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItc3ViZGV2LW1idXMtY29kZS1lbnVtICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXN1YmRldi1tYnVzLWNvZGUtZW51bSc+djRsMl9zdWJkZXZfbWJ1c19jb2RlX2VudW08L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItc3RhbmRhcmQgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItc3RhbmRhcmQnPnY0bDJfc3RhbmRhcmQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItc3RyZWFtcGFybSAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1zdHJlYW1wYXJtJz52NGwyX3N0cmVhbXBhcm08L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItdGltZWNvZGUgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItdGltZWNvZGUnPnY0bDJfdGltZWNvZGU8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItdHVuZXIgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItdHVuZXInPnY0bDJfdHVuZXI8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItdmJpLWZvcm1hdCAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi12YmktZm9ybWF0Jz52NGwyX3ZiaV9mb3JtYXQ8L2xpbms+Ij4KLTwhRU5USVRZIHY0bDItd2luZG93ICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXdpbmRvdyc+djRsMl93aW5kb3c8L2xpbms+Ij4KLQotPCFFTlRJVFkgbWVkaWEtZGV2aWNlLWluZm8gInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J21lZGlhLWRldmljZS1pbmZvJz5tZWRpYV9kZXZpY2VfaW5mbzwvbGluaz4iPgotPCFFTlRJVFkgbWVkaWEtZW50aXR5LWRlc2MgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J21lZGlhLWVudGl0eS1kZXNjJz5tZWRpYV9lbnRpdHlfZGVzYzwvbGluaz4iPgotPCFFTlRJVFkgbWVkaWEtbGlua3MtZW51bSAic3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0nbWVkaWEtbGlua3MtZW51bSc+bWVkaWFfbGlua3NfZW51bTwvbGluaz4iPgotPCFFTlRJVFkgbWVkaWEtcGFkLWRlc2MgInN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J21lZGlhLXBhZC1kZXNjJz5tZWRpYV9wYWRfZGVzYzwvbGluaz4iPgotPCFFTlRJVFkgbWVkaWEtbGluay1kZXNjICJzdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSdtZWRpYS1saW5rLWRlc2MnPm1lZGlhX2xpbmtfZGVzYzwvbGluaz4iPgotCi08IS0tIEVycm9yIENvZGVzIC0tPgotPCFFTlRJVFkgRUFDQ0VTICI8ZXJyb3Jjb2RlPkVBQ0NFUzwvZXJyb3Jjb2RlPiBlcnJvciBjb2RlIj4KLTwhRU5USVRZIEVBR0FJTiAiPGVycm9yY29kZT5FQUdBSU48L2Vycm9yY29kZT4gZXJyb3IgY29kZSI+Ci08IUVOVElUWSBFQkFERiAiPGVycm9yY29kZT5FQkFERjwvZXJyb3Jjb2RlPiBlcnJvciBjb2RlIj4KLTwhRU5USVRZIEVCVVNZICI8ZXJyb3Jjb2RlPkVCVVNZPC9lcnJvcmNvZGU+IGVycm9yIGNvZGUiPgotPCFFTlRJVFkgRUZBVUxUICI8ZXJyb3Jjb2RlPkVGQVVMVDwvZXJyb3Jjb2RlPiBlcnJvciBjb2RlIj4KLTwhRU5USVRZIEVJTyAiPGVycm9yY29kZT5FSU88L2Vycm9yY29kZT4gZXJyb3IgY29kZSI+Ci08IUVOVElUWSBFSU5UUiAiPGVycm9yY29kZT5FSU5UUjwvZXJyb3Jjb2RlPiBlcnJvciBjb2RlIj4KLTwhRU5USVRZIEVJTlZBTCAiPGVycm9yY29kZT5FSU5WQUw8L2Vycm9yY29kZT4gZXJyb3IgY29kZSI+Ci08IUVOVElUWSBFTkZJTEUgIjxlcnJvcmNvZGU+RU5GSUxFPC9lcnJvcmNvZGU+IGVycm9yIGNvZGUiPgotPCFFTlRJVFkgRU5PTUVNICI8ZXJyb3Jjb2RlPkVOT01FTTwvZXJyb3Jjb2RlPiBlcnJvciBjb2RlIj4KLTwhRU5USVRZIEVOT1NQQyAiPGVycm9yY29kZT5FTk9TUEM8L2Vycm9yY29kZT4gZXJyb3IgY29kZSI+Ci08IUVOVElUWSBFTk9UVFkgIjxlcnJvcmNvZGU+RU5PVFRZPC9lcnJvcmNvZGU+IGVycm9yIGNvZGUiPgotPCFFTlRJVFkgRU5YSU8gIjxlcnJvcmNvZGU+RU5YSU88L2Vycm9yY29kZT4gZXJyb3IgY29kZSI+Ci08IUVOVElUWSBFTUZJTEUgIjxlcnJvcmNvZGU+RU1GSUxFPC9lcnJvcmNvZGU+IGVycm9yIGNvZGUiPgotPCFFTlRJVFkgRVBFUk0gIjxlcnJvcmNvZGU+RVBFUk08L2Vycm9yY29kZT4gZXJyb3IgY29kZSI+Ci08IUVOVElUWSBFUElQRSAiPGVycm9yY29kZT5FUElQRTwvZXJyb3Jjb2RlPiBlcnJvciBjb2RlIj4KLTwhRU5USVRZIEVSQU5HRSAiPGVycm9yY29kZT5FUkFOR0U8L2Vycm9yY29kZT4gZXJyb3IgY29kZSI+Ci0KLTwhLS0gU3Vic2VjdGlvbnMgLS0+Ci08IUVOVElUWSBzdWItYmlibGlvIFNZU1RFTSAidjRsL2JpYmxpby54bWwiPgotPCFFTlRJVFkgc3ViLWNvbW1vbiBTWVNURU0gInY0bC9jb21tb24ueG1sIj4KLTwhRU5USVRZIHN1Yi1wbGFuYXItYXBpcyBTWVNURU0gInY0bC9wbGFuYXItYXBpcy54bWwiPgotPCFFTlRJVFkgc3ViLWNvbXBhdCBTWVNURU0gInY0bC9jb21wYXQueG1sIj4KLTwhRU5USVRZIHN1Yi1jb250cm9scyBTWVNURU0gInY0bC9jb250cm9scy54bWwiPgotPCFFTlRJVFkgc3ViLWRldi1jYXB0dXJlIFNZU1RFTSAidjRsL2Rldi1jYXB0dXJlLnhtbCI+Ci08IUVOVElUWSBzdWItZGV2LWNvZGVjIFNZU1RFTSAidjRsL2Rldi1jb2RlYy54bWwiPgotPCFFTlRJVFkgc3ViLWRldi1ldmVudCBTWVNURU0gInY0bC9kZXYtZXZlbnQueG1sIj4KLTwhRU5USVRZIHN1Yi1kZXYtZWZmZWN0IFNZU1RFTSAidjRsL2Rldi1lZmZlY3QueG1sIj4KLTwhRU5USVRZIHN1Yi1kZXYtb3NkIFNZU1RFTSAidjRsL2Rldi1vc2QueG1sIj4KLTwhRU5USVRZIHN1Yi1kZXYtb3V0cHV0IFNZU1RFTSAidjRsL2Rldi1vdXRwdXQueG1sIj4KLTwhRU5USVRZIHN1Yi1kZXYtb3ZlcmxheSBTWVNURU0gInY0bC9kZXYtb3ZlcmxheS54bWwiPgotPCFFTlRJVFkgc3ViLWRldi1yYWRpbyBTWVNURU0gInY0bC9kZXYtcmFkaW8ueG1sIj4KLTwhRU5USVRZIHN1Yi1kZXYtcmF3LXZiaSBTWVNURU0gInY0bC9kZXYtcmF3LXZiaS54bWwiPgotPCFFTlRJVFkgc3ViLWRldi1yZHMgU1lTVEVNICJ2NGwvZGV2LXJkcy54bWwiPgotPCFFTlRJVFkgc3ViLWRldi1zbGljZWQtdmJpIFNZU1RFTSAidjRsL2Rldi1zbGljZWQtdmJpLnhtbCI+Ci08IUVOVElUWSBzdWItZGV2LXN1YmRldiBTWVNURU0gInY0bC9kZXYtc3ViZGV2LnhtbCI+Ci08IUVOVElUWSBzdWItZGV2LXRlbGV0ZXh0IFNZU1RFTSAidjRsL2Rldi10ZWxldGV4dC54bWwiPgotPCFFTlRJVFkgc3ViLWRyaXZlciBTWVNURU0gInY0bC9kcml2ZXIueG1sIj4KLTwhRU5USVRZIHN1Yi1saWJ2NGwgU1lTVEVNICJ2NGwvbGlidjRsLnhtbCI+Ci08IUVOVElUWSBzdWItbGlyY19kZXZpY2VfaW50ZXJmYWNlIFNZU1RFTSAidjRsL2xpcmNfZGV2aWNlX2ludGVyZmFjZS54bWwiPgotPCFFTlRJVFkgc3ViLXJlbW90ZV9jb250cm9sbGVycyBTWVNURU0gInY0bC9yZW1vdGVfY29udHJvbGxlcnMueG1sIj4KLTwhRU5USVRZIHN1Yi1mZGwtYXBwZW5kaXggU1lTVEVNICJ2NGwvZmRsLWFwcGVuZGl4LnhtbCI+Ci08IUVOVElUWSBzdWItY2xvc2UgU1lTVEVNICJ2NGwvZnVuYy1jbG9zZS54bWwiPgotPCFFTlRJVFkgc3ViLWlvY3RsIFNZU1RFTSAidjRsL2Z1bmMtaW9jdGwueG1sIj4KLTwhRU5USVRZIHN1Yi1tbWFwIFNZU1RFTSAidjRsL2Z1bmMtbW1hcC54bWwiPgotPCFFTlRJVFkgc3ViLW11bm1hcCBTWVNURU0gInY0bC9mdW5jLW11bm1hcC54bWwiPgotPCFFTlRJVFkgc3ViLW9wZW4gU1lTVEVNICJ2NGwvZnVuYy1vcGVuLnhtbCI+Ci08IUVOVElUWSBzdWItcG9sbCBTWVNURU0gInY0bC9mdW5jLXBvbGwueG1sIj4KLTwhRU5USVRZIHN1Yi1yZWFkIFNZU1RFTSAidjRsL2Z1bmMtcmVhZC54bWwiPgotPCFFTlRJVFkgc3ViLXNlbGVjdCBTWVNURU0gInY0bC9mdW5jLXNlbGVjdC54bWwiPgotPCFFTlRJVFkgc3ViLXdyaXRlIFNZU1RFTSAidjRsL2Z1bmMtd3JpdGUueG1sIj4KLTwhRU5USVRZIHN1Yi1pbyBTWVNURU0gInY0bC9pby54bWwiPgotPCFFTlRJVFkgc3ViLWdyZXkgU1lTVEVNICJ2NGwvcGl4Zm10LWdyZXkueG1sIj4KLTwhRU5USVRZIHN1Yi1tNDIwIFNZU1RFTSAidjRsL3BpeGZtdC1tNDIwLnhtbCI+Ci08IUVOVElUWSBzdWItbnYxMiBTWVNURU0gInY0bC9waXhmbXQtbnYxMi54bWwiPgotPCFFTlRJVFkgc3ViLW52MTJtIFNZU1RFTSAidjRsL3BpeGZtdC1udjEybS54bWwiPgotPCFFTlRJVFkgc3ViLW52MTJtdCBTWVNURU0gInY0bC9waXhmbXQtbnYxMm10LnhtbCI+Ci08IUVOVElUWSBzdWItbnYxNiBTWVNURU0gInY0bC9waXhmbXQtbnYxNi54bWwiPgotPCFFTlRJVFkgc3ViLXBhY2tlZC1yZ2IgU1lTVEVNICJ2NGwvcGl4Zm10LXBhY2tlZC1yZ2IueG1sIj4KLTwhRU5USVRZIHN1Yi1wYWNrZWQteXV2IFNZU1RFTSAidjRsL3BpeGZtdC1wYWNrZWQteXV2LnhtbCI+Ci08IUVOVElUWSBzdWItc2JnZ3IxNiBTWVNURU0gInY0bC9waXhmbXQtc2JnZ3IxNi54bWwiPgotPCFFTlRJVFkgc3ViLXNiZ2dyOCBTWVNURU0gInY0bC9waXhmbXQtc2JnZ3I4LnhtbCI+Ci08IUVOVElUWSBzdWItc2dicmc4IFNZU1RFTSAidjRsL3BpeGZtdC1zZ2JyZzgueG1sIj4KLTwhRU5USVRZIHN1Yi1zZ3JiZzggU1lTVEVNICJ2NGwvcGl4Zm10LXNncmJnOC54bWwiPgotPCFFTlRJVFkgc3ViLXV5dnkgU1lTVEVNICJ2NGwvcGl4Zm10LXV5dnkueG1sIj4KLTwhRU5USVRZIHN1Yi12eXV5IFNZU1RFTSAidjRsL3BpeGZtdC12eXV5LnhtbCI+Ci08IUVOVElUWSBzdWIteTE2IFNZU1RFTSAidjRsL3BpeGZtdC15MTYueG1sIj4KLTwhRU5USVRZIHN1Yi15NDFwIFNZU1RFTSAidjRsL3BpeGZtdC15NDFwLnhtbCI+Ci08IUVOVElUWSBzdWIteXV2NDEwIFNZU1RFTSAidjRsL3BpeGZtdC15dXY0MTAueG1sIj4KLTwhRU5USVRZIHN1Yi15dXY0MTFwIFNZU1RFTSAidjRsL3BpeGZtdC15dXY0MTFwLnhtbCI+Ci08IUVOVElUWSBzdWIteXV2NDIwIFNZU1RFTSAidjRsL3BpeGZtdC15dXY0MjAueG1sIj4KLTwhRU5USVRZIHN1Yi15dXY0MjBtIFNZU1RFTSAidjRsL3BpeGZtdC15dXY0MjBtLnhtbCI+Ci08IUVOVElUWSBzdWIteXV2NDIycCBTWVNURU0gInY0bC9waXhmbXQteXV2NDIycC54bWwiPgotPCFFTlRJVFkgc3ViLXl1eXYgU1lTVEVNICJ2NGwvcGl4Zm10LXl1eXYueG1sIj4KLTwhRU5USVRZIHN1Yi15dnl1IFNZU1RFTSAidjRsL3BpeGZtdC15dnl1LnhtbCI+Ci08IUVOVElUWSBzdWItc3JnZ2IxMCBTWVNURU0gInY0bC9waXhmbXQtc3JnZ2IxMC54bWwiPgotPCFFTlRJVFkgc3ViLXNyZ2diMTIgU1lTVEVNICJ2NGwvcGl4Zm10LXNyZ2diMTIueG1sIj4KLTwhRU5USVRZIHN1Yi1zcmdnYjggU1lTVEVNICJ2NGwvcGl4Zm10LXNyZ2diOC54bWwiPgotPCFFTlRJVFkgc3ViLXkxMCBTWVNURU0gInY0bC9waXhmbXQteTEwLnhtbCI+Ci08IUVOVElUWSBzdWIteTEyIFNZU1RFTSAidjRsL3BpeGZtdC15MTIueG1sIj4KLTwhRU5USVRZIHN1Yi15MTBiIFNZU1RFTSAidjRsL3BpeGZtdC15MTBiLnhtbCI+Ci08IUVOVElUWSBzdWItcGl4Zm10IFNZU1RFTSAidjRsL3BpeGZtdC54bWwiPgotPCFFTlRJVFkgc3ViLWNyb3BjYXAgU1lTVEVNICJ2NGwvdmlkaW9jLWNyb3BjYXAueG1sIj4KLTwhRU5USVRZIHN1Yi1kYmctZy1yZWdpc3RlciBTWVNURU0gInY0bC92aWRpb2MtZGJnLWctcmVnaXN0ZXIueG1sIj4KLTwhRU5USVRZIHN1Yi1lbmNvZGVyLWNtZCBTWVNURU0gInY0bC92aWRpb2MtZW5jb2Rlci1jbWQueG1sIj4KLTwhRU5USVRZIHN1Yi1lbnVtLWZtdCBTWVNURU0gInY0bC92aWRpb2MtZW51bS1mbXQueG1sIj4KLTwhRU5USVRZIHN1Yi1lbnVtLWZyYW1laW50ZXJ2YWxzIFNZU1RFTSAidjRsL3ZpZGlvYy1lbnVtLWZyYW1laW50ZXJ2YWxzLnhtbCI+Ci08IUVOVElUWSBzdWItZW51bS1mcmFtZXNpemVzIFNZU1RFTSAidjRsL3ZpZGlvYy1lbnVtLWZyYW1lc2l6ZXMueG1sIj4KLTwhRU5USVRZIHN1Yi1lbnVtYXVkaW8gU1lTVEVNICJ2NGwvdmlkaW9jLWVudW1hdWRpby54bWwiPgotPCFFTlRJVFkgc3ViLWVudW1hdWRpb291dCBTWVNURU0gInY0bC92aWRpb2MtZW51bWF1ZGlvb3V0LnhtbCI+Ci08IUVOVElUWSBzdWItZW51bWlucHV0IFNZU1RFTSAidjRsL3ZpZGlvYy1lbnVtaW5wdXQueG1sIj4KLTwhRU5USVRZIHN1Yi1lbnVtb3V0cHV0IFNZU1RFTSAidjRsL3ZpZGlvYy1lbnVtb3V0cHV0LnhtbCI+Ci08IUVOVElUWSBzdWItZW51bS1kdi1wcmVzZXRzIFNZU1RFTSAidjRsL3ZpZGlvYy1lbnVtLWR2LXByZXNldHMueG1sIj4KLTwhRU5USVRZIHN1Yi1nLWR2LXByZXNldCBTWVNURU0gInY0bC92aWRpb2MtZy1kdi1wcmVzZXQueG1sIj4KLTwhRU5USVRZIHN1Yi1xdWVyeS1kdi1wcmVzZXQgU1lTVEVNICJ2NGwvdmlkaW9jLXF1ZXJ5LWR2LXByZXNldC54bWwiPgotPCFFTlRJVFkgc3ViLWctZHYtdGltaW5ncyBTWVNURU0gInY0bC92aWRpb2MtZy1kdi10aW1pbmdzLnhtbCI+Ci08IUVOVElUWSBzdWItZW51bXN0ZCBTWVNURU0gInY0bC92aWRpb2MtZW51bXN0ZC54bWwiPgotPCFFTlRJVFkgc3ViLWctYXVkaW8gU1lTVEVNICJ2NGwvdmlkaW9jLWctYXVkaW8ueG1sIj4KLTwhRU5USVRZIHN1Yi1nLWF1ZGlvb3V0IFNZU1RFTSAidjRsL3ZpZGlvYy1nLWF1ZGlvb3V0LnhtbCI+Ci08IUVOVElUWSBzdWItZGJnLWctY2hpcC1pZGVudCBTWVNURU0gInY0bC92aWRpb2MtZGJnLWctY2hpcC1pZGVudC54bWwiPgotPCFFTlRJVFkgc3ViLWctY3JvcCBTWVNURU0gInY0bC92aWRpb2MtZy1jcm9wLnhtbCI+Ci08IUVOVElUWSBzdWItZy1jdHJsIFNZU1RFTSAidjRsL3ZpZGlvYy1nLWN0cmwueG1sIj4KLTwhRU5USVRZIHN1Yi1nLWVuYy1pbmRleCBTWVNURU0gInY0bC92aWRpb2MtZy1lbmMtaW5kZXgueG1sIj4KLTwhRU5USVRZIHN1Yi1nLWV4dC1jdHJscyBTWVNURU0gInY0bC92aWRpb2MtZy1leHQtY3RybHMueG1sIj4KLTwhRU5USVRZIHN1Yi1nLWZidWYgU1lTVEVNICJ2NGwvdmlkaW9jLWctZmJ1Zi54bWwiPgotPCFFTlRJVFkgc3ViLWctZm10IFNZU1RFTSAidjRsL3ZpZGlvYy1nLWZtdC54bWwiPgotPCFFTlRJVFkgc3ViLWctZnJlcXVlbmN5IFNZU1RFTSAidjRsL3ZpZGlvYy1nLWZyZXF1ZW5jeS54bWwiPgotPCFFTlRJVFkgc3ViLWctaW5wdXQgU1lTVEVNICJ2NGwvdmlkaW9jLWctaW5wdXQueG1sIj4KLTwhRU5USVRZIHN1Yi1nLWpwZWdjb21wIFNZU1RFTSAidjRsL3ZpZGlvYy1nLWpwZWdjb21wLnhtbCI+Ci08IUVOVElUWSBzdWItZy1tb2R1bGF0b3IgU1lTVEVNICJ2NGwvdmlkaW9jLWctbW9kdWxhdG9yLnhtbCI+Ci08IUVOVElUWSBzdWItZy1vdXRwdXQgU1lTVEVNICJ2NGwvdmlkaW9jLWctb3V0cHV0LnhtbCI+Ci08IUVOVElUWSBzdWItZy1wYXJtIFNZU1RFTSAidjRsL3ZpZGlvYy1nLXBhcm0ueG1sIj4KLTwhRU5USVRZIHN1Yi1nLXByaW9yaXR5IFNZU1RFTSAidjRsL3ZpZGlvYy1nLXByaW9yaXR5LnhtbCI+Ci08IUVOVElUWSBzdWItZy1zbGljZWQtdmJpLWNhcCBTWVNURU0gInY0bC92aWRpb2MtZy1zbGljZWQtdmJpLWNhcC54bWwiPgotPCFFTlRJVFkgc3ViLWctc3RkIFNZU1RFTSAidjRsL3ZpZGlvYy1nLXN0ZC54bWwiPgotPCFFTlRJVFkgc3ViLWctdHVuZXIgU1lTVEVNICJ2NGwvdmlkaW9jLWctdHVuZXIueG1sIj4KLTwhRU5USVRZIHN1Yi1sb2ctc3RhdHVzIFNZU1RFTSAidjRsL3ZpZGlvYy1sb2ctc3RhdHVzLnhtbCI+Ci08IUVOVElUWSBzdWItb3ZlcmxheSBTWVNURU0gInY0bC92aWRpb2Mtb3ZlcmxheS54bWwiPgotPCFFTlRJVFkgc3ViLXFidWYgU1lTVEVNICJ2NGwvdmlkaW9jLXFidWYueG1sIj4KLTwhRU5USVRZIHN1Yi1xdWVyeWJ1ZiBTWVNURU0gInY0bC92aWRpb2MtcXVlcnlidWYueG1sIj4KLTwhRU5USVRZIHN1Yi1xdWVyeWNhcCBTWVNURU0gInY0bC92aWRpb2MtcXVlcnljYXAueG1sIj4KLTwhRU5USVRZIHN1Yi1xdWVyeWN0cmwgU1lTVEVNICJ2NGwvdmlkaW9jLXF1ZXJ5Y3RybC54bWwiPgotPCFFTlRJVFkgc3ViLXF1ZXJ5c3RkIFNZU1RFTSAidjRsL3ZpZGlvYy1xdWVyeXN0ZC54bWwiPgotPCFFTlRJVFkgc3ViLXJlcWJ1ZnMgU1lTVEVNICJ2NGwvdmlkaW9jLXJlcWJ1ZnMueG1sIj4KLTwhRU5USVRZIHN1Yi1zLWh3LWZyZXEtc2VlayBTWVNURU0gInY0bC92aWRpb2Mtcy1ody1mcmVxLXNlZWsueG1sIj4KLTwhRU5USVRZIHN1Yi1zdHJlYW1vbiBTWVNURU0gInY0bC92aWRpb2Mtc3RyZWFtb24ueG1sIj4KLTwhRU5USVRZIHN1Yi1zdWJkZXYtZW51bS1mcmFtZS1pbnRlcnZhbCBTWVNURU0gInY0bC92aWRpb2Mtc3ViZGV2LWVudW0tZnJhbWUtaW50ZXJ2YWwueG1sIj4KLTwhRU5USVRZIHN1Yi1zdWJkZXYtZW51bS1mcmFtZS1zaXplIFNZU1RFTSAidjRsL3ZpZGlvYy1zdWJkZXYtZW51bS1mcmFtZS1zaXplLnhtbCI+Ci08IUVOVElUWSBzdWItc3ViZGV2LWVudW0tbWJ1cy1jb2RlIFNZU1RFTSAidjRsL3ZpZGlvYy1zdWJkZXYtZW51bS1tYnVzLWNvZGUueG1sIj4KLTwhRU5USVRZIHN1Yi1zdWJkZXYtZm9ybWF0cyBTWVNURU0gInY0bC9zdWJkZXYtZm9ybWF0cy54bWwiPgotPCFFTlRJVFkgc3ViLXN1YmRldi1nLWNyb3AgU1lTVEVNICJ2NGwvdmlkaW9jLXN1YmRldi1nLWNyb3AueG1sIj4KLTwhRU5USVRZIHN1Yi1zdWJkZXYtZy1mbXQgU1lTVEVNICJ2NGwvdmlkaW9jLXN1YmRldi1nLWZtdC54bWwiPgotPCFFTlRJVFkgc3ViLXN1YmRldi1nLWZyYW1lLWludGVydmFsIFNZU1RFTSAidjRsL3ZpZGlvYy1zdWJkZXYtZy1mcmFtZS1pbnRlcnZhbC54bWwiPgotPCFFTlRJVFkgc3ViLWNhcHR1cmUtYyBTWVNURU0gInY0bC9jYXB0dXJlLmMueG1sIj4KLTwhRU5USVRZIHN1Yi1rZXl0YWJsZS1jIFNZU1RFTSAidjRsL2tleXRhYmxlLmMueG1sIj4KLTwhRU5USVRZIHN1Yi12NGwyZ3JhYi1jIFNZU1RFTSAidjRsL3Y0bDJncmFiLmMueG1sIj4KLTwhRU5USVRZIHN1Yi12aWRlb2RldjItaCBTWVNURU0gInY0bC92aWRlb2RldjIuaC54bWwiPgotPCFFTlRJVFkgc3ViLXY0bDIgU1lTVEVNICJ2NGwvdjRsMi54bWwiPgotPCFFTlRJVFkgc3ViLWRxZXZlbnQgU1lTVEVNICJ2NGwvdmlkaW9jLWRxZXZlbnQueG1sIj4KLTwhRU5USVRZIHN1Yi1zdWJzY3JpYmUtZXZlbnQgU1lTVEVNICJ2NGwvdmlkaW9jLXN1YnNjcmliZS1ldmVudC54bWwiPgotPCFFTlRJVFkgc3ViLWludHJvIFNZU1RFTSAiZHZiL2ludHJvLnhtbCI+Ci08IUVOVElUWSBzdWItZnJvbnRlbmQgU1lTVEVNICJkdmIvZnJvbnRlbmQueG1sIj4KLTwhRU5USVRZIHN1Yi1kdmJwcm9wZXJ0eSBTWVNURU0gImR2Yi9kdmJwcm9wZXJ0eS54bWwiPgotPCFFTlRJVFkgc3ViLWRlbXV4IFNZU1RFTSAiZHZiL2RlbXV4LnhtbCI+Ci08IUVOVElUWSBzdWItdmlkZW8gU1lTVEVNICJkdmIvdmlkZW8ueG1sIj4KLTwhRU5USVRZIHN1Yi1hdWRpbyBTWVNURU0gImR2Yi9hdWRpby54bWwiPgotPCFFTlRJVFkgc3ViLWNhIFNZU1RFTSAiZHZiL2NhLnhtbCI+Ci08IUVOVElUWSBzdWItbmV0IFNZU1RFTSAiZHZiL25ldC54bWwiPgotPCFFTlRJVFkgc3ViLWtkYXBpIFNZU1RFTSAiZHZiL2tkYXBpLnhtbCI+Ci08IUVOVElUWSBzdWItZXhhbXBsZXMgU1lTVEVNICJkdmIvZXhhbXBsZXMueG1sIj4KLTwhRU5USVRZIHN1Yi1mcm9udGVuZC1oIFNZU1RFTSAiZHZiL2Zyb250ZW5kLmgueG1sIj4KLTwhRU5USVRZIHN1Yi1kdmJhcGkgU1lTVEVNICJkdmIvZHZiYXBpLnhtbCI+Ci08IUVOVElUWSBzdWItbWVkaWEgU1lTVEVNICJtZWRpYS54bWwiPgotPCFFTlRJVFkgc3ViLW1lZGlhLWVudGl0aWVzIFNZU1RFTSAibWVkaWEtZW50aXRpZXMudG1wbCI+Ci08IUVOVElUWSBzdWItbWVkaWEtaW5kaWNlcyBTWVNURU0gIm1lZGlhLWluZGljZXMudG1wbCI+Ci0KLTwhRU5USVRZIHN1Yi1tZWRpYS1jb250cm9sbGVyIFNZU1RFTSAidjRsL21lZGlhLWNvbnRyb2xsZXIueG1sIj4KLTwhRU5USVRZIHN1Yi1tZWRpYS1mdW5jLW9wZW4gU1lTVEVNICJ2NGwvbWVkaWEtZnVuYy1vcGVuLnhtbCI+Ci08IUVOVElUWSBzdWItbWVkaWEtZnVuYy1jbG9zZSBTWVNURU0gInY0bC9tZWRpYS1mdW5jLWNsb3NlLnhtbCI+Ci08IUVOVElUWSBzdWItbWVkaWEtZnVuYy1pb2N0bCBTWVNURU0gInY0bC9tZWRpYS1mdW5jLWlvY3RsLnhtbCI+Ci08IUVOVElUWSBzdWItbWVkaWEtaW9jLWRldmljZS1pbmZvIFNZU1RFTSAidjRsL21lZGlhLWlvYy1kZXZpY2UtaW5mby54bWwiPgotPCFFTlRJVFkgc3ViLW1lZGlhLWlvYy1lbnVtLWVudGl0aWVzIFNZU1RFTSAidjRsL21lZGlhLWlvYy1lbnVtLWVudGl0aWVzLnhtbCI+Ci08IUVOVElUWSBzdWItbWVkaWEtaW9jLWVudW0tbGlua3MgU1lTVEVNICJ2NGwvbWVkaWEtaW9jLWVudW0tbGlua3MueG1sIj4KLTwhRU5USVRZIHN1Yi1tZWRpYS1pb2Mtc2V0dXAtbGluayBTWVNURU0gInY0bC9tZWRpYS1pb2Mtc2V0dXAtbGluay54bWwiPgotCi08IS0tIEZ1bmN0aW9uIFJlZmVyZW5jZSAtLT4KLTwhRU5USVRZIGNsb3NlIFNZU1RFTSAidjRsL2Z1bmMtY2xvc2UueG1sIj4KLTwhRU5USVRZIGlvY3RsIFNZU1RFTSAidjRsL2Z1bmMtaW9jdGwueG1sIj4KLTwhRU5USVRZIG1tYXAgU1lTVEVNICJ2NGwvZnVuYy1tbWFwLnhtbCI+Ci08IUVOVElUWSBtdW5tYXAgU1lTVEVNICJ2NGwvZnVuYy1tdW5tYXAueG1sIj4KLTwhRU5USVRZIG9wZW4gU1lTVEVNICJ2NGwvZnVuYy1vcGVuLnhtbCI+Ci08IUVOVElUWSBwb2xsIFNZU1RFTSAidjRsL2Z1bmMtcG9sbC54bWwiPgotPCFFTlRJVFkgcmVhZCBTWVNURU0gInY0bC9mdW5jLXJlYWQueG1sIj4KLTwhRU5USVRZIHNlbGVjdCBTWVNURU0gInY0bC9mdW5jLXNlbGVjdC54bWwiPgotPCFFTlRJVFkgd3JpdGUgU1lTVEVNICJ2NGwvZnVuYy13cml0ZS54bWwiPgotPCFFTlRJVFkgZ3JleSBTWVNURU0gInY0bC9waXhmbXQtZ3JleS54bWwiPgotPCFFTlRJVFkgbnYxMiBTWVNURU0gInY0bC9waXhmbXQtbnYxMi54bWwiPgotPCFFTlRJVFkgbnYxMm0gU1lTVEVNICJ2NGwvcGl4Zm10LW52MTJtLnhtbCI+Ci08IUVOVElUWSBudjE2IFNZU1RFTSAidjRsL3BpeGZtdC1udjE2LnhtbCI+Ci08IUVOVElUWSBwYWNrZWQtcmdiIFNZU1RFTSAidjRsL3BpeGZtdC1wYWNrZWQtcmdiLnhtbCI+Ci08IUVOVElUWSBwYWNrZWQteXV2IFNZU1RFTSAidjRsL3BpeGZtdC1wYWNrZWQteXV2LnhtbCI+Ci08IUVOVElUWSBzYmdncjE2IFNZU1RFTSAidjRsL3BpeGZtdC1zYmdncjE2LnhtbCI+Ci08IUVOVElUWSBzYmdncjggU1lTVEVNICJ2NGwvcGl4Zm10LXNiZ2dyOC54bWwiPgotPCFFTlRJVFkgc2dicmc4IFNZU1RFTSAidjRsL3BpeGZtdC1zZ2JyZzgueG1sIj4KLTwhRU5USVRZIHNncmJnOCBTWVNURU0gInY0bC9waXhmbXQtc2dyYmc4LnhtbCI+Ci08IUVOVElUWSB1eXZ5IFNZU1RFTSAidjRsL3BpeGZtdC11eXZ5LnhtbCI+Ci08IUVOVElUWSB2eXV5IFNZU1RFTSAidjRsL3BpeGZtdC12eXV5LnhtbCI+Ci08IUVOVElUWSB5MTYgU1lTVEVNICJ2NGwvcGl4Zm10LXkxNi54bWwiPgotPCFFTlRJVFkgeTQxcCBTWVNURU0gInY0bC9waXhmbXQteTQxcC54bWwiPgotPCFFTlRJVFkgeXV2NDEwIFNZU1RFTSAidjRsL3BpeGZtdC15dXY0MTAueG1sIj4KLTwhRU5USVRZIHl1djQxMXAgU1lTVEVNICJ2NGwvcGl4Zm10LXl1djQxMXAueG1sIj4KLTwhRU5USVRZIHl1djQyMCBTWVNURU0gInY0bC9waXhmbXQteXV2NDIwLnhtbCI+Ci08IUVOVElUWSB5dXY0MjBtIFNZU1RFTSAidjRsL3BpeGZtdC15dXY0MjBtLnhtbCI+Ci08IUVOVElUWSB5dXY0MjJwIFNZU1RFTSAidjRsL3BpeGZtdC15dXY0MjJwLnhtbCI+Ci08IUVOVElUWSB5dXl2IFNZU1RFTSAidjRsL3BpeGZtdC15dXl2LnhtbCI+Ci08IUVOVElUWSB5dnl1IFNZU1RFTSAidjRsL3BpeGZtdC15dnl1LnhtbCI+Ci08IUVOVElUWSBzcmdnYjEwIFNZU1RFTSAidjRsL3BpeGZtdC1zcmdnYjEwLnhtbCI+Ci08IUVOVElUWSBzcmdnYjggU1lTVEVNICJ2NGwvcGl4Zm10LXNyZ2diOC54bWwiPgotPCFFTlRJVFkgeTEwIFNZU1RFTSAidjRsL3BpeGZtdC15MTAueG1sIj4KLTwhRU5USVRZIGNyb3BjYXAgU1lTVEVNICJ2NGwvdmlkaW9jLWNyb3BjYXAueG1sIj4KLTwhRU5USVRZIGRiZy1nLXJlZ2lzdGVyIFNZU1RFTSAidjRsL3ZpZGlvYy1kYmctZy1yZWdpc3Rlci54bWwiPgotPCFFTlRJVFkgZW5jb2Rlci1jbWQgU1lTVEVNICJ2NGwvdmlkaW9jLWVuY29kZXItY21kLnhtbCI+Ci08IUVOVElUWSBlbnVtLWZtdCBTWVNURU0gInY0bC92aWRpb2MtZW51bS1mbXQueG1sIj4KLTwhRU5USVRZIGVudW0tZnJhbWVpbnRlcnZhbHMgU1lTVEVNICJ2NGwvdmlkaW9jLWVudW0tZnJhbWVpbnRlcnZhbHMueG1sIj4KLTwhRU5USVRZIGVudW0tZnJhbWVzaXplcyBTWVNURU0gInY0bC92aWRpb2MtZW51bS1mcmFtZXNpemVzLnhtbCI+Ci08IUVOVElUWSBlbnVtYXVkaW8gU1lTVEVNICJ2NGwvdmlkaW9jLWVudW1hdWRpby54bWwiPgotPCFFTlRJVFkgZW51bWF1ZGlvb3V0IFNZU1RFTSAidjRsL3ZpZGlvYy1lbnVtYXVkaW9vdXQueG1sIj4KLTwhRU5USVRZIGVudW1pbnB1dCBTWVNURU0gInY0bC92aWRpb2MtZW51bWlucHV0LnhtbCI+Ci08IUVOVElUWSBlbnVtb3V0cHV0IFNZU1RFTSAidjRsL3ZpZGlvYy1lbnVtb3V0cHV0LnhtbCI+Ci08IUVOVElUWSBlbnVtLWR2LXByZXNldHMgU1lTVEVNICJ2NGwvdmlkaW9jLWVudW0tZHYtcHJlc2V0cy54bWwiPgotPCFFTlRJVFkgZy1kdi1wcmVzZXQgU1lTVEVNICJ2NGwvdmlkaW9jLWctZHYtcHJlc2V0LnhtbCI+Ci08IUVOVElUWSBxdWVyeS1kdi1wcmVzZXQgU1lTVEVNICJ2NGwvdmlkaW9jLXF1ZXJ5LWR2LXByZXNldC54bWwiPgotPCFFTlRJVFkgZy1kdi10aW1pbmdzIFNZU1RFTSAidjRsL3ZpZGlvYy1nLWR2LXRpbWluZ3MueG1sIj4KLTwhRU5USVRZIGVudW1zdGQgU1lTVEVNICJ2NGwvdmlkaW9jLWVudW1zdGQueG1sIj4KLTwhRU5USVRZIGctYXVkaW8gU1lTVEVNICJ2NGwvdmlkaW9jLWctYXVkaW8ueG1sIj4KLTwhRU5USVRZIGctYXVkaW9vdXQgU1lTVEVNICJ2NGwvdmlkaW9jLWctYXVkaW9vdXQueG1sIj4KLTwhRU5USVRZIGRiZy1nLWNoaXAtaWRlbnQgU1lTVEVNICJ2NGwvdmlkaW9jLWRiZy1nLWNoaXAtaWRlbnQueG1sIj4KLTwhRU5USVRZIGctY3JvcCBTWVNURU0gInY0bC92aWRpb2MtZy1jcm9wLnhtbCI+Ci08IUVOVElUWSBnLWN0cmwgU1lTVEVNICJ2NGwvdmlkaW9jLWctY3RybC54bWwiPgotPCFFTlRJVFkgZy1lbmMtaW5kZXggU1lTVEVNICJ2NGwvdmlkaW9jLWctZW5jLWluZGV4LnhtbCI+Ci08IUVOVElUWSBnLWV4dC1jdHJscyBTWVNURU0gInY0bC92aWRpb2MtZy1leHQtY3RybHMueG1sIj4KLTwhRU5USVRZIGctZmJ1ZiBTWVNURU0gInY0bC92aWRpb2MtZy1mYnVmLnhtbCI+Ci08IUVOVElUWSBnLWZtdCBTWVNURU0gInY0bC92aWRpb2MtZy1mbXQueG1sIj4KLTwhRU5USVRZIGctZnJlcXVlbmN5IFNZU1RFTSAidjRsL3ZpZGlvYy1nLWZyZXF1ZW5jeS54bWwiPgotPCFFTlRJVFkgZy1pbnB1dCBTWVNURU0gInY0bC92aWRpb2MtZy1pbnB1dC54bWwiPgotPCFFTlRJVFkgZy1qcGVnY29tcCBTWVNURU0gInY0bC92aWRpb2MtZy1qcGVnY29tcC54bWwiPgotPCFFTlRJVFkgZy1tb2R1bGF0b3IgU1lTVEVNICJ2NGwvdmlkaW9jLWctbW9kdWxhdG9yLnhtbCI+Ci08IUVOVElUWSBnLW91dHB1dCBTWVNURU0gInY0bC92aWRpb2MtZy1vdXRwdXQueG1sIj4KLTwhRU5USVRZIGctcGFybSBTWVNURU0gInY0bC92aWRpb2MtZy1wYXJtLnhtbCI+Ci08IUVOVElUWSBnLXByaW9yaXR5IFNZU1RFTSAidjRsL3ZpZGlvYy1nLXByaW9yaXR5LnhtbCI+Ci08IUVOVElUWSBnLXNsaWNlZC12YmktY2FwIFNZU1RFTSAidjRsL3ZpZGlvYy1nLXNsaWNlZC12YmktY2FwLnhtbCI+Ci08IUVOVElUWSBnLXN0ZCBTWVNURU0gInY0bC92aWRpb2MtZy1zdGQueG1sIj4KLTwhRU5USVRZIGctdHVuZXIgU1lTVEVNICJ2NGwvdmlkaW9jLWctdHVuZXIueG1sIj4KLTwhRU5USVRZIGxvZy1zdGF0dXMgU1lTVEVNICJ2NGwvdmlkaW9jLWxvZy1zdGF0dXMueG1sIj4KLTwhRU5USVRZIG92ZXJsYXkgU1lTVEVNICJ2NGwvdmlkaW9jLW92ZXJsYXkueG1sIj4KLTwhRU5USVRZIHFidWYgU1lTVEVNICJ2NGwvdmlkaW9jLXFidWYueG1sIj4KLTwhRU5USVRZIHF1ZXJ5YnVmIFNZU1RFTSAidjRsL3ZpZGlvYy1xdWVyeWJ1Zi54bWwiPgotPCFFTlRJVFkgcXVlcnljYXAgU1lTVEVNICJ2NGwvdmlkaW9jLXF1ZXJ5Y2FwLnhtbCI+Ci08IUVOVElUWSBxdWVyeWN0cmwgU1lTVEVNICJ2NGwvdmlkaW9jLXF1ZXJ5Y3RybC54bWwiPgotPCFFTlRJVFkgcXVlcnlzdGQgU1lTVEVNICJ2NGwvdmlkaW9jLXF1ZXJ5c3RkLnhtbCI+Ci08IUVOVElUWSByZXFidWZzIFNZU1RFTSAidjRsL3ZpZGlvYy1yZXFidWZzLnhtbCI+Ci08IUVOVElUWSBzLWh3LWZyZXEtc2VlayBTWVNURU0gInY0bC92aWRpb2Mtcy1ody1mcmVxLXNlZWsueG1sIj4KLTwhRU5USVRZIHN0cmVhbW9uIFNZU1RFTSAidjRsL3ZpZGlvYy1zdHJlYW1vbi54bWwiPgotPCFFTlRJVFkgZHFldmVudCBTWVNURU0gInY0bC92aWRpb2MtZHFldmVudC54bWwiPgotPCFFTlRJVFkgc3Vic2NyaWJlX2V2ZW50IFNZU1RFTSAidjRsL3ZpZGlvYy1zdWJzY3JpYmUtZXZlbnQueG1sIj4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS1pbmRpY2VzLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEtaW5kaWNlcy50bXBsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGQ2MDMxLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS1pbmRpY2VzLnRtcGwKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi08IS0tIEdlbmVyYXRlZCBmaWxlISBEbyBub3QgZWRpdC4gLS0+Ci0KLTxpbmRleD48dGl0bGU+TGlzdCBvZiBUeXBlczwvdGl0bGU+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPjxsaW5rIGxpbmtlbmQ9J3Y0bDItc3RkLWlkJz52NGwyX3N0ZF9pZDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPmVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWJ1Zi10eXBlJz52NGwyX2J1Zl90eXBlPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItY29sb3JzcGFjZSc+djRsMl9jb2xvcnNwYWNlPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItY3RybC10eXBlJz52NGwyX2N0cmxfdHlwZTwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPmVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWV4cG9zdXJlLWF1dG8tdHlwZSc+djRsMl9leHBvc3VyZV9hdXRvX3R5cGU8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1maWVsZCc+djRsMl9maWVsZDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPmVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWZybWl2YWx0eXBlcyc+djRsMl9mcm1pdmFsdHlwZXM8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1mcm1zaXpldHlwZXMnPnY0bDJfZnJtc2l6ZXR5cGVzPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbWVtb3J5Jz52NGwyX21lbW9yeTwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPmVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctYXVkaW8tYWMzLWJpdHJhdGUnPnY0bDJfbXBlZ19hdWRpb19hYzNfYml0cmF0ZTwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPmVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctYXVkaW8tY3JjJz52NGwyX21wZWdfYXVkaW9fY3JjPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1hdWRpby1lbXBoYXNpcyc+djRsMl9tcGVnX2F1ZGlvX2VtcGhhc2lzPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1hdWRpby1lbmNvZGluZyc+djRsMl9tcGVnX2F1ZGlvX2VuY29kaW5nPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1hdWRpby1sMS1iaXRyYXRlJz52NGwyX21wZWdfYXVkaW9fbDFfYml0cmF0ZTwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPmVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctYXVkaW8tbDItYml0cmF0ZSc+djRsMl9tcGVnX2F1ZGlvX2wyX2JpdHJhdGU8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLWF1ZGlvLWwzLWJpdHJhdGUnPnY0bDJfbXBlZ19hdWRpb19sM19iaXRyYXRlPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1hdWRpby1tb2RlJz52NGwyX21wZWdfYXVkaW9fbW9kZTwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPmVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctYXVkaW8tbW9kZS1leHRlbnNpb24nPnY0bDJfbXBlZ19hdWRpb19tb2RlX2V4dGVuc2lvbjwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPmVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctYXVkaW8tc2FtcGxpbmctZnJlcSc+djRsMl9tcGVnX2F1ZGlvX3NhbXBsaW5nX2ZyZXE8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0nY2hyb21hLXNwYXRpYWwtZmlsdGVyLXR5cGUnPnY0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX2Nocm9tYV9zcGF0aWFsX2ZpbHRlcl90eXBlPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J2x1bWEtc3BhdGlhbC1maWx0ZXItdHlwZSc+djRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fbHVtYV9zcGF0aWFsX2ZpbHRlcl90eXBlPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1jeDIzNDF4LXZpZGVvLW1lZGlhbi1maWx0ZXItdHlwZSc+djRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fbWVkaWFuX2ZpbHRlcl90eXBlPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1jeDIzNDF4LXZpZGVvLXNwYXRpYWwtZmlsdGVyLW1vZGUnPnY0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX3NwYXRpYWxfZmlsdGVyX21vZGU8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLWN4MjM0MXgtdmlkZW8tdGVtcG9yYWwtZmlsdGVyLW1vZGUnPnY0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX3RlbXBvcmFsX2ZpbHRlcl9tb2RlPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1zdHJlYW0tdHlwZSc+djRsMl9tcGVnX3N0cmVhbV90eXBlPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy1zdHJlYW0tdmJpLWZtdCc+djRsMl9tcGVnX3N0cmVhbV92YmlfZm10PC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItbXBlZy12aWRlby1hc3BlY3QnPnY0bDJfbXBlZ192aWRlb19hc3BlY3Q8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLXZpZGVvLWJpdHJhdGUtbW9kZSc+djRsMl9tcGVnX3ZpZGVvX2JpdHJhdGVfbW9kZTwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPmVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLW1wZWctdmlkZW8tZW5jb2RpbmcnPnY0bDJfbXBlZ192aWRlb19lbmNvZGluZzwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPmVudW0mbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXBvd2VyLWxpbmUtZnJlcXVlbmN5Jz52NGwyX3Bvd2VyX2xpbmVfZnJlcXVlbmN5PC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItcHJpb3JpdHknPnY0bDJfcHJpb3JpdHk8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi10dW5lci10eXBlJz52NGwyX3R1bmVyX3R5cGU8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5lbnVtJm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1wcmVlbXBoYXNpcyc+djRsMl9wcmVlbXBoYXNpczwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItYXVkaW8nPnY0bDJfYXVkaW88L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWF1ZGlvb3V0Jz52NGwyX2F1ZGlvb3V0PC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1idC10aW1pbmdzJz52NGwyX2J0X3RpbWluZ3M8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWJ1ZmZlcic+djRsMl9idWZmZXI8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWNhcGFiaWxpdHknPnY0bDJfY2FwYWJpbGl0eTwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItY2FwdHVyZXBhcm0nPnY0bDJfY2FwdHVyZXBhcm08L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWNsaXAnPnY0bDJfY2xpcDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItY29udHJvbCc+djRsMl9jb250cm9sPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1jcm9wJz52NGwyX2Nyb3A8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWNyb3BjYXAnPnY0bDJfY3JvcGNhcDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZGJnLWNoaXAtaWRlbnQnPnY0bDJfZGJnX2NoaXBfaWRlbnQ8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWRiZy1tYXRjaCc+djRsMl9kYmdfbWF0Y2g8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWRiZy1yZWdpc3Rlcic+djRsMl9kYmdfcmVnaXN0ZXI8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWR2LWVudW0tcHJlc2V0Jz52NGwyX2R2X2VudW1fcHJlc2V0PC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1kdi1wcmVzZXQnPnY0bDJfZHZfcHJlc2V0PC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1kdi10aW1pbmdzJz52NGwyX2R2X3RpbWluZ3M8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWVuYy1pZHgnPnY0bDJfZW5jX2lkeDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZW5jLWlkeC1lbnRyeSc+djRsMl9lbmNfaWR4X2VudHJ5PC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1lbmNvZGVyLWNtZCc+djRsMl9lbmNvZGVyX2NtZDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZXh0LWNvbnRyb2wnPnY0bDJfZXh0X2NvbnRyb2w8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWV4dC1jb250cm9scyc+djRsMl9leHRfY29udHJvbHM8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWZtdGRlc2MnPnY0bDJfZm10ZGVzYzwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZm9ybWF0Jz52NGwyX2Zvcm1hdDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZnJhY3QnPnY0bDJfZnJhY3Q8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWZyYW1lYnVmZmVyJz52NGwyX2ZyYW1lYnVmZmVyPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1mcmVxdWVuY3knPnY0bDJfZnJlcXVlbmN5PC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1mcm1pdmFsLXN0ZXB3aXNlJz52NGwyX2ZybWl2YWxfc3RlcHdpc2U8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWZybWl2YWxlbnVtJz52NGwyX2ZybWl2YWxlbnVtPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1mcm1zaXplLWRpc2NyZXRlJz52NGwyX2ZybXNpemVfZGlzY3JldGU8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWZybXNpemUtc3RlcHdpc2UnPnY0bDJfZnJtc2l6ZV9zdGVwd2lzZTwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItZnJtc2l6ZWVudW0nPnY0bDJfZnJtc2l6ZWVudW08L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWh3LWZyZXEtc2Vlayc+djRsMl9od19mcmVxX3NlZWs8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLWlucHV0Jz52NGwyX2lucHV0PC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1qcGVnY29tcHJlc3Npb24nPnY0bDJfanBlZ2NvbXByZXNzaW9uPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tb2R1bGF0b3InPnY0bDJfbW9kdWxhdG9yPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1tcGVnLXZiaS1mbXQtaXZ0dic+djRsMl9tcGVnX3ZiaV9mbXRfaXZ0djwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItb3V0cHV0Jz52NGwyX291dHB1dDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItb3V0cHV0cGFybSc+djRsMl9vdXRwdXRwYXJtPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1waXgtZm9ybWF0Jz52NGwyX3BpeF9mb3JtYXQ8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXF1ZXJ5Y3RybCc+djRsMl9xdWVyeWN0cmw8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXF1ZXJ5bWVudSc+djRsMl9xdWVyeW1lbnU8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXJlY3QnPnY0bDJfcmVjdDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItcmVxdWVzdGJ1ZmZlcnMnPnY0bDJfcmVxdWVzdGJ1ZmZlcnM8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXNsaWNlZC12YmktY2FwJz52NGwyX3NsaWNlZF92YmlfY2FwPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1zbGljZWQtdmJpLWRhdGEnPnY0bDJfc2xpY2VkX3ZiaV9kYXRhPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi1zbGljZWQtdmJpLWZvcm1hdCc+djRsMl9zbGljZWRfdmJpX2Zvcm1hdDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItc3RhbmRhcmQnPnY0bDJfc3RhbmRhcmQ8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXN0cmVhbXBhcm0nPnY0bDJfc3RyZWFtcGFybTwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+Ci08aW5kZXhlbnRyeT48cHJpbWFyeWllPnN0cnVjdCZuYnNwOzxsaW5rIGxpbmtlbmQ9J3Y0bDItdGltZWNvZGUnPnY0bDJfdGltZWNvZGU8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXR1bmVyJz52NGwyX3R1bmVyPC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4KLTxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsgbGlua2VuZD0ndjRsMi12YmktZm9ybWF0Jz52NGwyX3ZiaV9mb3JtYXQ8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPGluZGV4ZW50cnk+PHByaW1hcnlpZT5zdHJ1Y3QmbmJzcDs8bGluayBsaW5rZW5kPSd2NGwyLXdpbmRvdyc+djRsMl93aW5kb3c8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PgotPC9pbmRleD4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9NYWtlZmlsZSBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjI4YjRiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL01ha2VmaWxlCkBAIC0wLDAgKzEsMzg2IEBACisjIyMKKyMgTWVkaWEgYnVpbGQgcnVsZXMgLSBBdXRvLWdlbmVyYXRlcyBtZWRpYSBjb250ZW50cy9pbmRleGVzIGFuZCAqLmggeG1sJ3MKKyMKKworU0hFTEw9L2Jpbi9iYXNoCisKK01FRElBX09CSl9ESVI9JChvYmp0cmVlKS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svCitNRURJQV9TUkNfRElSPSQoc3JjdHJlZSkvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhCisKK01FRElBX1RFTVAgPSAgbWVkaWEtZW50aXRpZXMudG1wbCBcCisJICAgICAgbWVkaWEtaW5kaWNlcy50bXBsIFwKKwkgICAgICB2aWRlb2RldjIuaC54bWwgXAorCSAgICAgIHY0bDIueG1sIFwKKwkgICAgICBhdWRpby5oLnhtbCBcCisJICAgICAgY2EuaC54bWwgXAorCSAgICAgIGRteC5oLnhtbCBcCisJICAgICAgZnJvbnRlbmQuaC54bWwgXAorCSAgICAgIG5ldC5oLnhtbCBcCisJICAgICAgdmlkZW8uaC54bWwgXAorCitJTUdGSUxFUyA6PSAkKHBhdHN1YnN0ICUuYjY0LCUsICQobm90ZGlyICQoc2hlbGwgbHMgJChNRURJQV9TUkNfRElSKS8qLmI2NCkpKQorT0JKSU1HRklMRVMgOj0gJChhZGRwcmVmaXggJChNRURJQV9PQkpfRElSKS8sICQoSU1HRklMRVMpKQorR0VORklMRVMgOj0gJChhZGRwcmVmaXggJChNRURJQV9PQkpfRElSKS8sICQoTUVESUFfVEVNUCkpCisKK1BIT05ZICs9IGNsZWFubWVkaWFkb2NzCisKK2NsZWFubWVkaWFkb2NzOgorCS1Acm0gYGZpbmQgJChNRURJQV9PQkpfRElSKSAtdHlwZSBsYCAkKEdFTkZJTEVTKSAkKE9CSklNR0ZJTEVTKSAyPi9kZXYvbnVsbAorCiskKG9iaikvbWVkaWFfYXBpLnhtbDogJChHRU5GSUxFUykgRk9SQ0UKKworIyQoTUVESUFfT0JKX0RJUikvbWVkaWFfYXBpLmh0bWw6ICQoTUVESUFfT0JKX0RJUikvbWVkaWFfYXBpLnhtbAorIyQoTUVESUFfT0JKX0RJUikvbWVkaWFfYXBpLnBkZjogJChNRURJQV9PQkpfRElSKS9tZWRpYV9hcGkueG1sCisjJChNRURJQV9PQkpfRElSKS9tZWRpYV9hcGkucHM6ICQoTUVESUFfT0JKX0RJUikvbWVkaWFfYXBpLnhtbAorCitWNExfU0dNTFMgPSBcCisJJChzaGVsbCBscyAkKE1FRElBX1NSQ19ESVIpL3Y0bC8qLnhtbHxwZXJsIC1uZSAncHJpbnQgIiQkMSAiIGlmIChtLC4qLyguKilcbiwpJykgXAorCWNhcHR1cmUuYy54bWwgXAorCWtleXRhYmxlLmMueG1sIFwKKwl2NGwyZ3JhYi5jLnhtbAorCitEVkJfU0dNTFMgPSBcCisJJChzaGVsbCBscyAkKE1FRElBX1NSQ19ESVIpL2R2Yi8qLnhtbHxwZXJsIC1uZSAncHJpbnQgIiQkMSAiIGlmIChtLC4qLyguKilcbiwpJykKKworTUVESUFfU0dNTFMgPSAgJChhZGRwcmVmaXggLi8sJChWNExfU0dNTFMpKSAkKGFkZHByZWZpeCAuLywkKERWQl9TR01MUykpICQoYWRkcHJlZml4IC4vLCQoTUVESUFfVEVNUCkpCisKK0ZVTkNTID0gXAorCWNsb3NlIFwKKwlpb2N0bCBcCisJbW1hcCBcCisJbXVubWFwIFwKKwlvcGVuIFwKKwlwb2xsIFwKKwlyZWFkIFwKKwlzZWxlY3QgXAorCXdyaXRlIFwKKworSU9DVExTID0gXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAvXCNkZWZpbmVccysoW15cc10rKVxzK19JTy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAvXCNkZWZpbmVccysoW15cc10rKVxzK19JTy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9kdmIvYXVkaW8uaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAvXCNkZWZpbmVccysoW15cc10rKVxzK19JTy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9kdmIvY2EuaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAvXCNkZWZpbmVccysoW15cc10rKVxzK19JTy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9kdmIvZG14LmgpIFwKKwkkKHNoZWxsIHBlcmwgLW5lICdwcmludCAiJCQxICIgaWYgL1wjZGVmaW5lXHMrKFteXHNdKylccytfSU8vJyAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvZHZiL2Zyb250ZW5kLmgpIFwKKwkkKHNoZWxsIHBlcmwgLW5lICdwcmludCAiJCQxICIgaWYgL1wjZGVmaW5lXHMrKFtBLVpdW15cc10rKVxzK19JTy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9kdmIvbmV0LmgpIFwKKwkkKHNoZWxsIHBlcmwgLW5lICdwcmludCAiJCQxICIgaWYgL1wjZGVmaW5lXHMrKFteXHNdKylccytfSU8vJyAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvZHZiL3ZpZGVvLmgpIFwKKwkkKHNoZWxsIHBlcmwgLW5lICdwcmludCAiJCQxICIgaWYgL1wjZGVmaW5lXHMrKFteXHNdKylccytfSU8vJyAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvbWVkaWEuaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAvXCNkZWZpbmVccysoW15cc10rKVxzK19JTy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC92NGwyLXN1YmRldi5oKSBcCisJVklESU9DX1NVQkRFVl9HX0ZSQU1FX0lOVEVSVkFMIFwKKwlWSURJT0NfU1VCREVWX1NfRlJBTUVfSU5URVJWQUwgXAorCVZJRElPQ19TVUJERVZfRU5VTV9NQlVTX0NPREUgXAorCVZJRElPQ19TVUJERVZfRU5VTV9GUkFNRV9TSVpFIFwKKwlWSURJT0NfU1VCREVWX0VOVU1fRlJBTUVfSU5URVJWQUwgXAorCitUWVBFUyA9IFwKKwkkKHNoZWxsIHBlcmwgLW5lICdwcmludCAiJCQxICIgaWYgL150eXBlZGVmXHMrW15cc10rXHMrKFteXHNdKylcOy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAvXn1ccysoW2EtejAtOV9dK190KS8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9kdmIvZnJvbnRlbmQuaCkKKworRU5VTVMgPSBcCisJJChzaGVsbCBwZXJsIC1uZSAncHJpbnQgIiQkMSAiIGlmIC9eZW51bVxzKyhbXlxzXSspXHMrLycgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oKSBcCisJJChzaGVsbCBwZXJsIC1uZSAncHJpbnQgIiQkMSAiIGlmIC9eZW51bVxzKyhbXlxzXSspXHMrLycgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L2R2Yi9hdWRpby5oKSBcCisJJChzaGVsbCBwZXJsIC1uZSAncHJpbnQgIiQkMSAiIGlmIC9eZW51bVxzKyhbXlxzXSspXHMrLycgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L2R2Yi9jYS5oKSBcCisJJChzaGVsbCBwZXJsIC1uZSAncHJpbnQgIiQkMSAiIGlmIC9eZW51bVxzKyhbXlxzXSspXHMrLycgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L2R2Yi9kbXguaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAvXmVudW1ccysoW15cc10rKVxzKy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9kdmIvZnJvbnRlbmQuaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAvXmVudW1ccysoW15cc10rKVxzKy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9kdmIvbmV0LmgpIFwKKwkkKHNoZWxsIHBlcmwgLW5lICdwcmludCAiJCQxICIgaWYgL15lbnVtXHMrKFteXHNdKylccysvJyAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvZHZiL3ZpZGVvLmgpIFwKKwkkKHNoZWxsIHBlcmwgLW5lICdwcmludCAiJCQxICIgaWYgL15lbnVtXHMrKFteXHNdKylccysvJyAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvbWVkaWEuaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAvXmVudW1ccysoW15cc10rKVxzKy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC92NGwyLW1lZGlhYnVzLmgpIFwKKwkkKHNoZWxsIHBlcmwgLW5lICdwcmludCAiJCQxICIgaWYgL15lbnVtXHMrKFteXHNdKylccysvJyAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvdjRsMi1zdWJkZXYuaCkKKworU1RSVUNUUyA9IFwKKwkkKHNoZWxsIHBlcmwgLW5lICdwcmludCAiJCQxICIgaWYgL15zdHJ1Y3RccysoW15cc10rKVxzKy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAoL15zdHJ1Y3RccysoW15cc1x7XSspXHMqLyknICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9kdmIvYXVkaW8uaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAoL15zdHJ1Y3RccysoW15cc10rKVxzKy8pJyAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvZHZiL2NhLmgpIFwKKwkkKHNoZWxsIHBlcmwgLW5lICdwcmludCAiJCQxICIgaWYgKC9ec3RydWN0XHMrKFteXHNdKylccysvKScgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L2R2Yi9kbXguaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAoIS9kdHZcX2NtZHNcX2gvICYmIC9ec3RydWN0XHMrKFteXHNdKylccysvKScgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L2R2Yi9mcm9udGVuZC5oKSBcCisJJChzaGVsbCBwZXJsIC1uZSAncHJpbnQgIiQkMSAiIGlmICgvXnN0cnVjdFxzKyhbQS1aXVteXHNdKylccysvKScgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L2R2Yi9uZXQuaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAoL15zdHJ1Y3RccysoW15cc10rKVxzKy8pJyAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvZHZiL3ZpZGVvLmgpIFwKKwkkKHNoZWxsIHBlcmwgLW5lICdwcmludCAiJCQxICIgaWYgL15zdHJ1Y3RccysoW15cc10rKVxzKy8nICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9tZWRpYS5oKSBcCisJJChzaGVsbCBwZXJsIC1uZSAncHJpbnQgIiQkMSAiIGlmIC9ec3RydWN0XHMrKFteXHNdKylccysvJyAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvdjRsMi1zdWJkZXYuaCkgXAorCSQoc2hlbGwgcGVybCAtbmUgJ3ByaW50ICIkJDEgIiBpZiAvXnN0cnVjdFxzKyhbXlxzXSspXHMrLycgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L3Y0bDItbWVkaWFidXMuaCkKKworRVJST1JTID0gXAorCUUyQklHIFwKKwlFQUNDRVMgXAorCUVBR0FJTiBcCisJRUJBREYgXAorCUVCQURGRCBcCisJRUJBRFIgXAorCUVCQURSUUMgXAorCUVCVVNZIFwKKwlFQ0hJTEQgXAorCUVDT05OUkVTRVQgXAorCUVERUFETEsgXAorCUVET00gXAorCUVFWElTVCBcCisJRUZBVUxUIFwKKwlFRkJJRyBcCisJRUlMU0VRIFwKKwlFSU5JVCBcCisJRUlOUFJPR1JFU1MgXAorCUVJTlRSIFwKKwlFSU5WQUwgXAorCUVJTyBcCisJRU1GSUxFIFwKKwlFTkZJTEUgXAorCUVOT0JVRlMgXAorCUVOT0RBVEEgXAorCUVOT0RFViBcCisJRU5PRU5UIFwKKwlFTk9JT0NUTENNRCBcCisJRU5PTUVNIFwKKwlFTk9TUEMgXAorCUVOT1NSIFwKKwlFTk9TWVMgXAorCUVOT1RTVVAgXAorCUVOT1RTVVBQIFwKKwlFTk9UVFkgXAorCUVOWElPIFwKKwlFT1BOT1RTVVBQIFwKKwlFT1ZFUkZMT1cgXAorCUVQRVJNIFwKKwlFUElQRSBcCisJRVBST1RPIFwKKwlFUkFOR0UgXAorCUVSRU1PVEUgXAorCUVSRU1PVEVJTyBcCisJRVJFU1RBUlQgXAorCUVSRVNUQVJUU1lTIFwKKwlFU0hVVERPV04gXAorCUVTUElQRSBcCisJRVRJTUUgXAorCUVUSU1FRE9VVCBcCisJRVVTRVJTIFwKKwlFV09VTERCTE9DSyBcCisJRVhERVYgXAorCitFU0NBUEUgPSBcCisJLWUgInMvJi9cXCZhbXA7L2ciIFwKKwktZSAicy88L1xcJmx0Oy9nIiBcCisJLWUgInMvPi9cXCZndDsvZyIKKworRklMRU5BTUUgPSBcCisJLWUgcywiXlteXC9dKi8iLCwgXAorCS1lIHMvIlxcLnhtbCIvLyBcCisJLWUgcy8iXFwudG1wbCIvLyBcCisJLWUgcy9cXFwuLy0vZyBcCisJLWUgcy8iXmZ1bmMtIi8vIFwKKwktZSBzLyJecGl4Zm10LSIvLyBcCisJLWUgcy8iXnZpZGlvYy0iLy8KKworIyBHZW5lcmF0ZSByZWZlcmVuY2VzIHRvIHRoZXNlIHN0cnVjdHMgaW4gdmlkZW9kZXYyLmgueG1sLgorRE9DVU1FTlRFRCA9IFwKKwktZSAicy9cKGVudW0gKlwpdjRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fXChbYS16XSpfc3BhdGlhbF9maWx0ZXJfdHlwZVwpL1wxPGxpbmsgbGlua2VuZD1cIlwyXCI+djRsMl9tcGVnX2N4MjM0MXhfdmlkZW9fXDI8XC9saW5rPi9nIiBcCisJLWUgInMvXChcKGVudW1cfHN0cnVjdFwpICpcKVwodjRsMl9bYS16QS1aMC05X10qXCkvXDE8bGluayBsaW5rZW5kPVwiXDNcIj5cMzxcL2xpbms+L2ciIFwKKwktZSAicy9cKFY0TDJfUElYX0ZNVF9bQS1aMC05X11cK1wpIC88bGluayBsaW5rZW5kPVwiXDFcIj5cMTxcL2xpbms+IC9nIiBcCisJLWUgIjphO3MvXChsaW5rZW5kPVwiLipcKV9cKC4qXCI+XCkvXDEtXDIvO3RhIiBcCisJLWUgInMvdjRsMlwtbXBlZ1wtdmJpXC1JVFYwL3Y0bDItbXBlZy12YmktaXR2MC0xL2ciCisKK0RWQl9ET0NVTUVOVEVEID0gXAorCS1lICJzL1wobGlua2VuZFw9XCJcKUZFX1NFVF9QUk9QRVJUWS9cMUZFX0dFVF9QUk9QRVJUWS9nIiBcCisJLWUgInMsXChzdHJ1Y3Rcc1wrXClcKFthLXowLTlfXVwrXClcKFxzXCt7XCksXDFcPGxpbmsgbGlua2VuZD1cIlwyXCI+XDJcPFwvbGlua1w+XDMsZyIgXAorCS1lICJzLFwofVxzXCtcKVwoW2EtejAtOV9dXCtfdFwrXCksXDFcPGxpbmsgbGlua2VuZD1cIlwyXCI+XDJcPFwvbGlua1w+LGciIFwKKwktZSAicyxcKGRlZmluZVxzXCtcKVwoRFRWX1tBLVowLTlfXVwrXClcKFxzXCtbMC05XVwrXCksXDFcPGxpbmsgbGlua2VuZD1cIlwyXCI+XDJcPFwvbGlua1w+XDMsZyIgXAorCS1lICJzLDxsaW5rXHNcK2xpbmtlbmQ9XCIuKlwiPlwoRFRWX0lPQ1RMX01BWF9NU0dTXHxkdHZfY21kc19oXHxfXy4qX29sZFwpPFwvbGluaz4sXDEsZyIgXAorCS1lICI6YTtzL1wobGlua2VuZD1cIi4qXClfXCguKlwiPlwpL1wxLVwyLzt0YSIgXAorCS1lICJzLFwoYXVkaW8tbWl4ZXJcfGF1ZGlvLWthcmFva2VcfGF1ZGlvLXN0YXR1c1x8Y2Etc2xvdC1pbmZvXHxjYS1kZXNjci1pbmZvXHxjYS1jYXBzXHxjYS1tc2dcfGNhLWRlc2NyXHxjYS1waWRcfGRteC1maWx0ZXJcfGRteC1jYXBzXHx2aWRlby1zeXN0ZW1cfHZpZGVvLWhpZ2hsaWdodFx8dmlkZW8tc3B1XHx2aWRlby1zcHUtcGFsZXR0ZVx8dmlkZW8tbmF2aS1wYWNrXCktdCxcMSxnIiBcCisJLWUgInMsRFRWLUlTREJULUxBWUVSW0EtQ10sRFRWLUlTREJULUxBWUVSLGciIFwKKwktZSAicyxcKGRlZmluZVxzXCtcKVwoW0EtWjAtOV9dXCtcKVwoXHNcK19JT1wpLFwxXDxsaW5rIGxpbmtlbmQ9XCJcMlwiPlwyXDxcL2xpbmtcPlwzLGciIFwKKwktZSAicyw8bGlua1xzXCtsaW5rZW5kPVwiLipcIj5cKF9fLipfT0xEXCk8XC9saW5rPixcMSxnIiBcCisKKyMKKyMgTWVkaWEgdGFyZ2V0cyBhbmQgZGVwZW5kZW5jaWVzCisjCisKK2luc3RhbGxfbWVkaWFfaW1hZ2VzID0gXAorCSQoUSljcCAkKE9CSklNR0ZJTEVTKSAkKE1FRElBX09CSl9ESVIpL21lZGlhX2FwaQorCiskKE1FRElBX09CSl9ESVIpLyU6ICQoTUVESUFfU1JDX0RJUikvJS5iNjQKKwkkKFEpYmFzZTY0IC1kICQ8ID4kQAorCiskKE1FRElBX09CSl9ESVIpL3Y0bDIueG1sOiAkKE9CSklNR0ZJTEVTKQorCUAkKCQocXVpZXQpZ2VuX3htbCkKKwlAKGxuIC1zZiAkKE1FRElBX1NSQ19ESVIpL3Y0bC8qeG1sICQoTUVESUFfT0JKX0RJUikvKQorCUAobG4gLXNmICQoTUVESUFfU1JDX0RJUikvZHZiLyp4bWwgJChNRURJQV9PQkpfRElSKS8pCisKKyQoTUVESUFfT0JKX0RJUikvdmlkZW9kZXYyLmgueG1sOiAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmggJChNRURJQV9PQkpfRElSKS92NGwyLnhtbAorCUAkKCQocXVpZXQpZ2VuX3htbCkKKwlAKAkJCQkJXAorCWVjaG8gIjxwcm9ncmFtbGlzdGluZz4iKSA+ICRACisJQCgJCQkJCVwKKwlleHBhbmQgLS10YWJzPTggPCAkPCB8CQkJXAorCSAgc2VkICQoRVNDQVBFKSAkKERPQ1VNRU5URUQpIHwJCVwKKwkgIHNlZCAncy9pXC5lXC4vJmllOy8nKSA+PiAkQAorCUAoCQkJCQlcCisJZWNobyAiPC9wcm9ncmFtbGlzdGluZz4iKSA+PiAkQAorCiskKE1FRElBX09CSl9ESVIpL2F1ZGlvLmgueG1sOiAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvZHZiL2F1ZGlvLmggJChNRURJQV9PQkpfRElSKS92NGwyLnhtbAorCUAkKCQocXVpZXQpZ2VuX3htbCkKKwlAKAkJCQkJXAorCWVjaG8gIjxwcm9ncmFtbGlzdGluZz4iKSA+ICRACisJQCgJCQkJCVwKKwlleHBhbmQgLS10YWJzPTggPCAkPCB8CQkJXAorCSAgc2VkICQoRVNDQVBFKSAkKERWQl9ET0NVTUVOVEVEKSB8CVwKKwkgIHNlZCAncy9pXC5lXC4vJmllOy8nKSA+PiAkQAorCUAoCQkJCQlcCisJZWNobyAiPC9wcm9ncmFtbGlzdGluZz4iKSA+PiAkQAorCiskKE1FRElBX09CSl9ESVIpL2NhLmgueG1sOiAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvZHZiL2NhLmggJChNRURJQV9PQkpfRElSKS92NGwyLnhtbAorCUAkKCQocXVpZXQpZ2VuX3htbCkKKwlAKAkJCQkJXAorCWVjaG8gIjxwcm9ncmFtbGlzdGluZz4iKSA+ICRACisJQCgJCQkJCVwKKwlleHBhbmQgLS10YWJzPTggPCAkPCB8CQkJXAorCSAgc2VkICQoRVNDQVBFKSAkKERWQl9ET0NVTUVOVEVEKSB8CVwKKwkgIHNlZCAncy9pXC5lXC4vJmllOy8nKSA+PiAkQAorCUAoCQkJCQlcCisJZWNobyAiPC9wcm9ncmFtbGlzdGluZz4iKSA+PiAkQAorCiskKE1FRElBX09CSl9ESVIpL2RteC5oLnhtbDogJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L2R2Yi9kbXguaCAkKE1FRElBX09CSl9ESVIpL3Y0bDIueG1sCisJQCQoJChxdWlldClnZW5feG1sKQorCUAoCQkJCQlcCisJZWNobyAiPHByb2dyYW1saXN0aW5nPiIpID4gJEAKKwlAKAkJCQkJXAorCWV4cGFuZCAtLXRhYnM9OCA8ICQ8IHwJCQlcCisJICBzZWQgJChFU0NBUEUpICQoRFZCX0RPQ1VNRU5URUQpIHwJXAorCSAgc2VkICdzL2lcLmVcLi8maWU7LycpID4+ICRACisJQCgJCQkJCVwKKwllY2hvICI8L3Byb2dyYW1saXN0aW5nPiIpID4+ICRACisKKyQoTUVESUFfT0JKX0RJUikvZnJvbnRlbmQuaC54bWw6ICQoc3JjdHJlZSkvaW5jbHVkZS9saW51eC9kdmIvZnJvbnRlbmQuaCAkKE1FRElBX09CSl9ESVIpL3Y0bDIueG1sCisJQCQoJChxdWlldClnZW5feG1sKQorCUAoCQkJCQlcCisJZWNobyAiPHByb2dyYW1saXN0aW5nPiIpID4gJEAKKwlAKAkJCQkJXAorCWV4cGFuZCAtLXRhYnM9OCA8ICQ8IHwJCQlcCisJICBzZWQgJChFU0NBUEUpICQoRFZCX0RPQ1VNRU5URUQpIHwJXAorCSAgc2VkICdzL2lcLmVcLi8maWU7LycpID4+ICRACisJQCgJCQkJCVwKKwllY2hvICI8L3Byb2dyYW1saXN0aW5nPiIpID4+ICRACisKKyQoTUVESUFfT0JKX0RJUikvbmV0LmgueG1sOiAkKHNyY3RyZWUpL2luY2x1ZGUvbGludXgvZHZiL25ldC5oICQoTUVESUFfT0JKX0RJUikvdjRsMi54bWwKKwlAJCgkKHF1aWV0KWdlbl94bWwpCisJQCgJCQkJCVwKKwllY2hvICI8cHJvZ3JhbWxpc3Rpbmc+IikgPiAkQAorCUAoCQkJCQlcCisJZXhwYW5kIC0tdGFicz04IDwgJDwgfAkJCVwKKwkgIHNlZCAkKEVTQ0FQRSkgJChEVkJfRE9DVU1FTlRFRCkgfAlcCisJICBzZWQgJ3MvaVwuZVwuLyZpZTsvJykgPj4gJEAKKwlAKAkJCQkJXAorCWVjaG8gIjwvcHJvZ3JhbWxpc3Rpbmc+IikgPj4gJEAKKworJChNRURJQV9PQkpfRElSKS92aWRlby5oLnhtbDogJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L2R2Yi92aWRlby5oICQoTUVESUFfT0JKX0RJUikvdjRsMi54bWwKKwlAJCgkKHF1aWV0KWdlbl94bWwpCisJQCgJCQkJCVwKKwllY2hvICI8cHJvZ3JhbWxpc3Rpbmc+IikgPiAkQAorCUAoCQkJCQlcCisJZXhwYW5kIC0tdGFicz04IDwgJDwgfAkJCVwKKwkgIHNlZCAkKEVTQ0FQRSkgJChEVkJfRE9DVU1FTlRFRCkgfAlcCisJICBzZWQgJ3MvaVwuZVwuLyZpZTsvJykgPj4gJEAKKwlAKAkJCQkJXAorCWVjaG8gIjwvcHJvZ3JhbWxpc3Rpbmc+IikgPj4gJEAKKworJChNRURJQV9PQkpfRElSKS9tZWRpYS1lbnRpdGllcy50bXBsOiAkKE1FRElBX09CSl9ESVIpL3Y0bDIueG1sCisJQCQoJChxdWlldClnZW5feG1sKQorCUAoCQkJCQkJCQlcCisJZWNobyAiPCEtLSBHZW5lcmF0ZWQgZmlsZSEgRG8gbm90IGVkaXQuIC0tPiIpID4kQAorCUAoCQkJCQkJCQlcCisJZWNobyAtZSAiXG48IS0tIEZ1bmN0aW9ucyAtLT4iKSA+PiRACisJQCgJCQkJCQkJCVwKKwlmb3IgaWRlbnQgaW4gJChGVU5DUykgOyBkbwkJCQkJXAorCSAgZW50aXR5PWBlY2hvICQkaWRlbnQgfCB0ciBfIC1gIDsJCQkJXAorCSAgZWNobyAiPCFFTlRJVFkgZnVuYy0kJGVudGl0eSBcIjxsaW5rIgkJCQlcCisJICAgICJsaW5rZW5kPSdmdW5jLSQkZW50aXR5Jz48ZnVuY3Rpb24+JCRpZGVudCgpPC9mdW5jdGlvbj48L2xpbms+XCI+IiBcCisJICA+PiRAIDsJCQkJCQkJXAorCWRvbmUpCisJQCgJCQkJCQkJCVwKKwllY2hvIC1lICJcbjwhLS0gSW9jdGxzIC0tPiIpID4+JEAKKwlAKAkJCQkJCQkJXAorCWZvciBpZGVudCBpbiAkKElPQ1RMUykgOyBkbwkJCQkJXAorCSAgZW50aXR5PWBlY2hvICQkaWRlbnQgfCB0ciBfIC1gIDsJCQkJXAorCSAgaWQ9YGdyZXAgIjxyZWZuYW1lPiQkaWRlbnQiICQoTUVESUFfT0JKX0RJUikvdmlkaW9jLSoueG1sIHwgc2VkIC1yIHMsIl4uKi8oLiopLnhtbC4qIiwiXDEiLGAgOyBcCisJICBlY2hvICI8IUVOVElUWSAkJGVudGl0eSBcIjxsaW5rIgkJCQlcCisJICAgICJsaW5rZW5kPSckJGlkJz48Y29uc3RhbnQ+JCRpZGVudDwvY29uc3RhbnQ+PC9saW5rPlwiPiIJXAorCSAgPj4kQCA7CQkJCQkJCVwKKwlkb25lKQorCUAoCQkJCQkJCQlcCisJZWNobyAtZSAiXG48IS0tIFR5cGVzIC0tPiIpID4+JEAKKwlAKAkJCQkJCQkJXAorCWZvciBpZGVudCBpbiAkKFRZUEVTKSA7IGRvCQkJCQlcCisJICBlbnRpdHk9YGVjaG8gJCRpZGVudCB8IHRyIF8gLWAgOwkJCQlcCisJICBlY2hvICI8IUVOVElUWSAkJGVudGl0eSBcIjxsaW5rIgkJCQlcCisJICAgICJsaW5rZW5kPSckJGVudGl0eSc+JCRpZGVudDwvbGluaz5cIj4iID4+JEAgOwkJXAorCWRvbmUpCisJQCgJCQkJCQkJCVwKKwllY2hvIC1lICJcbjwhLS0gRW51bXMgLS0+IikgPj4kQAorCUAoCQkJCQkJCQlcCisJZm9yIGlkZW50IGluICQoRU5VTVMpIDsgZG8JCQkJCVwKKwkgIGVudGl0eT1gZWNobyAkJGlkZW50IHwgc2VkIC1lICJzL3Y0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX1woW2Etel0qX3NwYXRpYWxfZmlsdGVyX3R5cGVcKS9cMS8iIHwgdHIgXyAtYCA7IFwKKwkgIGVjaG8gIjwhRU5USVRZICQkZW50aXR5IFwiZW51bSZuYnNwOzxsaW5rIgkJCVwKKwkgICAgImxpbmtlbmQ9JyQkZW50aXR5Jz4kJGlkZW50PC9saW5rPlwiPiIgPj4kQCA7CQlcCisJZG9uZSkKKwlAKAkJCQkJCQkJXAorCWVjaG8gLWUgIlxuPCEtLSBTdHJ1Y3R1cmVzIC0tPiIpID4+JEAKKwlAKAkJCQkJCQkJXAorCWZvciBpZGVudCBpbiAkKFNUUlVDVFMpIDsgZG8JCQkJCVwKKwkgIGVudGl0eT1gZWNobyAkJGlkZW50IHwgdHIgXyAtIHwgc2VkIHMvdjRsMi1tcGVnLXZiaS1JVFYwL3Y0bDItbXBlZy12YmktaXR2MC0xL2dgIDsgXAorCSAgZWNobyAiPCFFTlRJVFkgJCRlbnRpdHkgXCJzdHJ1Y3QmbmJzcDs8bGluayIJCQlcCisJICAgICJsaW5rZW5kPSckJGVudGl0eSc+JCRpZGVudDwvbGluaz5cIj4iID4+JEAgOwkJXAorCWRvbmUpCisJQCgJCQkJCQkJCVwKKwllY2hvIC1lICJcbjwhLS0gRXJyb3IgQ29kZXMgLS0+IikgPj4kQAorCUAoCQkJCQkJCQlcCisJZm9yIGlkZW50IGluICQoRVJST1JTKSA7IGRvCQkJCQlcCisJICBlY2hvICI8IUVOVElUWSAkJGlkZW50IFwiPGVycm9yY29kZT4kJGlkZW50PC9lcnJvcmNvZGU+IglcCisJICAgICJlcnJvciBjb2RlXCI+IiA+PiRAIDsJCQkJCVwKKwlkb25lKQorCUAoCQkJCQkJCQlcCisJZWNobyAtZSAiXG48IS0tIFN1YnNlY3Rpb25zIC0tPiIpID4+JEAKKwlAKAkJCQkJCQkJXAorCWZvciBmaWxlIGluICQoTUVESUFfU0dNTFMpIDsgZG8JCQkJCVwKKwkgIGVudGl0eT1gZWNobyAiJCRmaWxlIiB8IHNlZCAkKEZJTEVOQU1FKSAtZSBzLyJeKFteLV0qKSIvc3ViXDEvYCA7IFwKKwkgIGlmICEgZWNobyAiJCRmaWxlIiB8CQkJCQkJXAorCSAgICBncmVwIC1xIC1FIC1lICdeKGZ1bmN8dmlkaW9jfHBpeGZtdCktJyA7IHRoZW4JCVwKKwkgICAgZWNobyAiPCFFTlRJVFkgc3ViLSQkZW50aXR5IFNZU1RFTSBcIiQkZmlsZVwiPiIgPj4kQCA7CVwKKwkgIGZpIDsJCQkJCQkJCVwKKwlkb25lKQorCUAoCQkJCQkJCQlcCisJZWNobyAtZSAiXG48IS0tIEZ1bmN0aW9uIFJlZmVyZW5jZSAtLT4iKSA+PiRACisJQCgJCQkJCQkJCVwKKwlmb3IgZmlsZSBpbiAkKE1FRElBX1NHTUxTKSA7IGRvCQkJCQlcCisJICBpZiBlY2hvICIkJGZpbGUiIHwJCQkJCQlcCisJICAgIGdyZXAgLXEgLUUgLWUgJyhmdW5jfHZpZGlvY3xwaXhmbXQpLScgOyB0aGVuCQlcCisJICAgIGVudGl0eT1gZWNobyAiJCRmaWxlIiB8c2VkICQoRklMRU5BTUUpYCA7CQkJXAorCSAgICBlY2hvICI8IUVOVElUWSAkJGVudGl0eSBTWVNURU0gXCIkJGZpbGVcIj4iID4+JEAgOwlcCisJICBmaSA7CQkJCQkJCQlcCisJZG9uZSkKKworIyBKYWRlIGNhbiBhdXRvLWdlbmVyYXRlIGEgbGlzdC1vZi10YWJsZXMsIHdoaWNoIGluY2x1ZGVzIGFsbCBzdHJ1Y3RzLAorIyBidXQgd2Ugb25seSB3YW50IGRhdGEgdHlwZXMsIGFsbCB0eXBlcywgYW5kIHNvcnRlZCBwbGVhc2UuCiskKE1FRElBX09CSl9ESVIpL21lZGlhLWluZGljZXMudG1wbDogJChNRURJQV9PQkpfRElSKS92NGwyLnhtbAorCUAkKCQocXVpZXQpZ2VuX3htbCkKKwlAKAkJCQkJCQkJXAorCWVjaG8gIjwhLS0gR2VuZXJhdGVkIGZpbGUhIERvIG5vdCBlZGl0LiAtLT4iKSA+JEAKKwlAKAkJCQkJCQkJXAorCWVjaG8gLWUgIlxuPGluZGV4Pjx0aXRsZT5MaXN0IG9mIFR5cGVzPC90aXRsZT4iKSA+PiRACisJQCgJCQkJCQkJCVwKKwlmb3IgaWRlbnQgaW4gJChUWVBFUykgOyBkbwkJCQkJXAorCSAgaWQ9YGVjaG8gJCRpZGVudCB8IHRyIF8gLWAgOwkJCQkJXAorCSAgZWNobyAiPGluZGV4ZW50cnk+PHByaW1hcnlpZT48bGluayIJCQkJXAorCSAgICAibGlua2VuZD0nJCRpZCc+JCRpZGVudDwvbGluaz48L3ByaW1hcnlpZT48L2luZGV4ZW50cnk+IiA+PiRAIDsgXAorCWRvbmUpCisJQCgJCQkJCQkJCVwKKwlmb3IgaWRlbnQgaW4gJChFTlVNUykgOyBkbwkJCQkJXAorCSAgaWQ9YGVjaG8gJCRpZGVudCB8IHNlZCAtZSAicy92NGwyX21wZWdfY3gyMzQxeF92aWRlb19cKFthLXpdKl9zcGF0aWFsX2ZpbHRlcl90eXBlXCkvXDEvIiB8IHRyIF8gLWA7IFwKKwkgIGVjaG8gIjxpbmRleGVudHJ5PjxwcmltYXJ5aWU+ZW51bSZuYnNwOzxsaW5rIgkJCVwKKwkgICAgImxpbmtlbmQ9JyQkaWQnPiQkaWRlbnQ8L2xpbms+PC9wcmltYXJ5aWU+PC9pbmRleGVudHJ5PiIgPj4kQCA7IFwKKwlkb25lKQorCUAoCQkJCQkJCQlcCisJZm9yIGlkZW50IGluICQoU1RSVUNUUykgOyBkbwkJCQkJXAorCSAgaWQ9YGVjaG8gJCRpZGVudCB8IHRyIF8gLSB8IHNlZCBzL3Y0bDItbXBlZy12YmktSVRWMC92NGwyLW1wZWctdmJpLWl0djAtMS9nYCA7IFwKKwkgIGVjaG8gIjxpbmRleGVudHJ5PjxwcmltYXJ5aWU+c3RydWN0Jm5ic3A7PGxpbmsiCQlcCisJICAgICJsaW5rZW5kPSckJGlkJz4kJGlkZW50PC9saW5rPjwvcHJpbWFyeWllPjwvaW5kZXhlbnRyeT4iID4+JEAgOyBcCisJZG9uZSkKKwlAKAkJCQkJCQkJXAorCWVjaG8gIjwvaW5kZXg+IikgPj4kQAorCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvYmF5ZXIucG5nLmI2NCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9iYXllci5wbmcuYjY0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjZGYyYmMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvYmF5ZXIucG5nLmI2NApAQCAtMCwwICsxLDE3MSBAQAoraVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQWxnQUFBQ3FDQU1BQUFCR2ZjSFZBQUFBQVhOU1IwSUFyczRjNlFBQUF3QlFURlJGQUFJQQorQ0FJQ0FBUVZFUUVCQWdzQUpnRUNBQW9nQXdzVEFRb3BIUVlCTkFFQUFBeE5BUlFBRVJJUUFob0RBQndBQUJaRUhSUUtHUllLUXcwRgorQUNNQkFDVUFFUndwSFI0Y1ZSQUZCUjVyWmhBREFDUjJKaUloQkRBR0FpV0dnUTRBY3hRQUJEWUFDU2VRTVNZbEp5a21FU3hZbFE0QQorUFNZWklTMDVPU3NKSFM1Sk9DOGtBRU1EVUM4U0FEWExORFV6QURiRUFFc0FBRFgvMlJBQkNGSUFBRC9xeEIwQUFELy9CRmdBSzBWcAorV1Q0cjNod0EzUnNUUkVSQUFFZi81Q0lBMmlZQ0NVditXVWd6N2lJQU9rNWczQ2dWU1U1U2lEOHVCMnNBQm04QUUxWC9VMVJRT0Z5TAorNGprZklsei9SVjk4TTFqK0cySC9mVmsyM2p0RDRUMHBYbDlpZUZ0R2NWODk0VUlpWVdKZkFJd0E1MGdPVjJwKzRrc3NPMmorZEdaeAorYkcxcVZtai9PSEgvYUhKemZuQlg1bFE3QjUwQVpuYWhkWGQwQUtVRzVWMUFSbnovNm1FckNxZ0FBS3NBZW50NDZHQklXNEdoQUswQQorQUs4QjQyRnRBTElPaW45L0FMVUFpSU9CQUxrQVZJZi82V3hXZzRlQmk0U0tKckVBbW9WdGRZMmdlb1AvcllWWGhveU9xWVZ1SmJVaAorSXJnV1g1RC9qbzZKN25zelA3Z0FzSTlTNjN4bk43MHpacU8vZlp6Q09iNCtjWnIrNjRkeThvdFluSjZiN0ltRFJjTTU2SXFjV01Fbworb0piL044Wm9UTVJMN1k5L1FjaGNzYU9UbzZlb2hhai83WnFLWHNwWGo2djl4YWwrb0srN2Q3dlRVTStBZmNvNXI3Q3VtTFRWU3RLVgorYnM5dWtiYi85cXgvOXE5bDhxdWVvTHYvZTlSNjZiZUc3ckRJbU5SaGk5YUR3c1BBczhiV3pjSzJjZDY3anRxUDVNV1VvZHlCOGIrMQordE1yL3o4TC9qOStrYk9YV25OMlpzdEQ3eWM3UnpzN0x5OXhiMTgzVXdkRC8rc2kvcWVPbXZ1S0l4OWZqNHRQQ3R1V2lxT3JMK3RTMgoreTl2KytOUEsyZHZadCttMHVlcTgwK1dvM09lU3d1eS95ZXpHK2Q3Zi9lUy96L0RTM3VmLzZPbm80UEM3MU8zOXhQYjAydlBaLytuUgorK09yaTZlMzk5K3Z0K1BHeit1cjY1Zkw1NS9YYjR2Ymg3ZmZYL1BQWTh2UDkrdkx5NlBmMzZmanIvUGZNOHZqci8vZisvdm40OFAzNgorOXZ2Ky92emYrZnY0L2Z2dS8vejcrdjcvL1AvNy92LzgvL1FweEFBQUFBRmlTMGRFQUlnRkhVZ0FBQUFKY0VoWmN3QUFGWThBQUJXVworQVEyVFQ4Y0FBQUFIZEVsTlJRZmFDUlFYR1NsdHdiUFJBQUFnQUVsRVFWUjQydTJkRFh3VTFiWEFad0VKdEVhTkgxbmJoNjhmcG9XSworaUUxYW8yQmdvOVJxSXJFZytCSUZtcUxZTE9sTWNISGxVNkRpUW1ySk0yaktvMFFJQkhnVWpENUVUY1FJbEtxMGdLRG1BK1VqaVJBVAorQkNPQmtHekM1cmUvKys2OTg3RXpzenN6ZHpjN3M5amZQYTJ3Tyt6TVBlZmMvNTU3NXQ2N1o1aEIvMEVrL1c2Njh4Y2tjbVZtUVo1UworQ3ZMbWdzaGw0UUNpWnUrOG50Q09nV2x6VmZybDVaWkZybDZUL1ZZU3Y5eDVLM1BqOXdua2g5ZkZGeFFFNlZjVnFYWSs4UGpnSDVLMAorKy8wYkJ4RGFZY3NOMGkrdkxsVGJ6SDlrakVrbmtFRjN6cHRqTFBQbVhMMlZ3R0Mvbnh5c20rWVJ5YysvUzJiSE5ZVWdtdEprZjVSSQordlNjSDNIRXZpZnowNW1ocUI4RzY4ZDZ4Sk8zZWNTV2hIWFlmWWR2TTk5TEhHRXY2bUVGM3ptRko1R3I0OWU5cVZVaDdPL3dQL3cvOQorZ2Y0RVhuS3dicGpOR1FzNzc5YnZrdGx4elVMZzdUQ1F6dkRBSXRCdnpxTUQ3aGpyTUpheFB4MEN2M09kQnZxRkJSWkpzNDZ4Q0N3aQorTyt4TndOZlNjbG9tNkYyTDRqMUEvVXNHMWhnSTFqeVdVekxFS2YvZ1gwQ3dldkl6c3ZTbEpveWg4SVk1TG1QaEVGaEVoc0NJOWI3TAorb3kvdUkyR0JSYURmUEFUV2FHTzU5NmREQURoaW9KKzdQS3lJNVNCb0Y0TkZaQWNFYTZaanZMN01PZzlNQVd0UHh2NGFIZGxmTTMxNQorVE1IeTdHZzRwaWZONWNVeEJNc1Bpc3ViOWRScnFIYzF4QkNzQzd2SEg2alZsUU9PM2VHQmhjY2M5QityR0lXa1AvQUxCTllFQTN1WAoreHhhc29vTUdiVmFXeGhTczBrcjlOanM4emJFRTYwQzJVYk9UVEFPclI2L1pIakIvWld6QmV0K2d6UjB4Qm11SGZwdHRzUWJMSUVQMgorWnBzR1Zyc0JXTXNwV0JRc0dyRW9XRkVBSzFVVURiQmtRRWtKdStLbytXRHhEUm1BcFdtSCtXQ0YwdS9iQ0ZZSU15SUhLMzBDTDFrWgorWTFKMTd3bzUxc25oVzEvNGQ5QmRvWmxnY1p4N21jZXp6TTF5ZW1CcDIyRTJXQnpMNjZmc0V4VllqbXhCeHNOZWQxZ0hWcmE4WFgydworV0JjMkEvNGREYkNTcDR2LzJQckdiMUwxaGtLblo4c1JORkgzOWNlbDZLMWxReUZidkxjWlhmM1lybVdzTmxnNmRwZ01GbHRjM2RBTgorajMremF6V3JDVmJLQnVuOGx0Y2ZTM0ZZQnBiMEQ3MjFMK3VDeFhvcXhPNVZmRU1pQm1zYTZCTC8rVXhXcWhaWU1GeXRQU1ZkNXlNVQorcUt4SjNqbHViN2Y0RDVmK3htcURwVzJIdVdDeHIwcjY5YjdONm9BVjZKc1RqNlZZQnBhY2lQOUwwUWFMVlhRdjEzZXdVcWVCZGp5UworWk0wL0NmNnVCUmJrYWswM3VMU3JhQkhuV2ZzSkFKL0xFaTJUSXhaczdiUHlaUzZYWnd1MFhFYVdDaXdkTzB3Rmkzc1hnQy9LNFFEaQorcWZoRW9WOFFXTnRUOEZMSytMOTBnZGRIV3dqV2pOR3cxZEcvbWdXNy9qRk5zRmpZdmQvc0tuSzczS2g3UDRvU1dIdzNKT2NEa0pHcQorQlZieEJmRDVJaWRLcXB6T1YvM2diMDVyd0dKZlJYRUFmWU00MW5NS2ZNWHBnYVZoaDVsZ3NWc0FlSnZqOVlPTVhWckU2WUFsdkh3YQorWEpTRkxKUEJPZzhtOFcybHBMd0ZRNVlqTkZnYzZ0NDVPRkN4ME9WZ05SdTFpSVZFQnl6bnUrQXJJVWl4blBNZktHUlpBUmFDU1JwZgorRU54LzR3d2lWZ2c3VEFTTGM1MkNBNGY0QmlvYkNGbWFZRGxTdXNCVUM4R2FHZ0M2Vmdzc0ZuYXZTM1F0Qzd1WGl5SllNUDA5bzVtOAorTzJHZk9zVzhpbDFUdWRvaXNGNEZYOGhHdnkzbGMxeUdZQVhaWVNaWWErUkJpdHZ5OWh5WElWaWo3NDRSV1ArakRSYjh5Z2FDRkxkbQoreDdLb0pPL3R5V2oySnozL0pQaGpzc1k4bG5OTDkxY3ZzTkw4S090azFmTlk1aVR2M0QvQVAyVUpNYXVidkd2WllTSlk4SnYrVDA0KworOGVBeUJDc0ZkdkJYVmc2RjJVSzdrODVvRG9VczdONUZzaXdqU3NrN3Y1Y0trcUhzRDNuRWNtNEJuem54SElOVEVOYWFDVkpwY0JHbgorelhRaWxwWWRab0wxaVRoU0Ira1hCTmJ1OFZPaHpGaHdBSUNYclV6ZUYyUlBuVHBwNnF5L25BRzlZeldTZDVncGZxWmhSbC9Ba3BqWQorUDBIcnJ0QlpEUTQ2OFp1S0hWZ3FYZFlrNzkzQWc0emtsbFh5RFpmcTVGaGFkcGdKVmpNb3haM2czc0hyVjg0WnptTUI4THBqZEN5bQorRzNyL29EWGR3RmFEOTdFWkhHOUZ4UTUzVkhLc2FkT2g1SzgvcTUxalliRHdDL0ZTaXl3Rml4WDcvU2lyazJOcDJHRW1XQTJnSE92bgorRWZlM2FDZnZYaVRBMjdKOWxwVkxPbDdjTHZ5SDJnMlBhVTZRU21DeDRtWGNYRFRBU2thU21weHhFdncxVlhzb2ZCTFB0NzkvOUFnVQorMkRKcjVWRElGaDJyaDlJTTZ2WEEwckREZ3FHUVc0YjFhd0FOK25lRnZ6b0R2cFRQamxxVnZEOE53K1RvRkcyd3hLR1FPM2dVbW5FaworR21BbFMvTS9ZNUtYZzVwa0xiRDQ1RjNJc2RoZ3NFeE8zdkhTNUpNVjJtRHAyR0ZKOG83MUt6WUNLK1ZoU0pZanhYS3c0QTBEZUYwUAorTERGNXh4T1ZYTFFpbHRnMzg0UEFrdGFhbnhTbUcrRDlBa3J0RUZoV0xFS3pyNEp2K0ZzVU5PaXpPL1FqbG9ZZDVrNDM5QzZTVklJRAorZG9QUlBOYlRYZUE5NnlQVzZKUzNBRkNrV01ycEJnL3FYbW1ZY0VjYkxPMkl4VHJmQlJkZmNBcVlPWjFXRFlWb3p2R2YwczJ2a3hBcworNnlJV0dxcy9sOVpzbld0QnN4RllLSGE4Yk9FaXREaVBCUWZoYzQ5cHJoV3lxSHVsaVdoWDFISXN2STFKTDhlQ01KMENGMWV6ZUJ4aworaXoreExNZENTeVlmelJadWdiZDBnQ082T1Zab08weGQwbG5URFQ1N1FkaWt0cVlEdEJuT3ZNUFljYzdDUldocGdoU21XVzlxZ29WVworRUM2dTV1TUdoN3MzS21CTlF6SjkrVW5RcFRuenpqbUxUd0h3UlVWeGNlbVdCbmpudXN1cVJXaTBjdFg1Y1hsUjhkcTlIUUI4czFwdgorU1VmRERsTWpGa3hQUU8vSDVhdUt5L2Uyb2YwWGhtdUZLUTkzZ1RjdEh3cEhPMUNvbEErR3FrVm92bnRYRlFuZEc1V1pkMG02ZnFlOQorYllaemVqNlJQdmpaNnFBSlV0UDJ2TE5ycFAwYzUzYk5ZWFZtM3JYc01IbmJ6RnJKTDcyN1h0Q2JJQTBzcllBL3BWZzMzU0F1NmR4OQorQnB5UTNUZW90ODBvdWpjNkU2VHRXQnByMW1mb2JQUkRVcnpsU0VmSDEwZDNGY0ViQndzMytyblg3bTNvNlBqbTQzSzlqWDQ2ZHBpOAorMFk5ekZlODkxdEhaL0hIRk1vNXpFYXdWL3VvNCtIS3NWV0NkbGkxQysyRjJwN25SaitPSytPN2RVZVJpbzd2blBkVm9heklyMy9SdQorNGRaa2NlMmJJOXZ6bm1yNTFtUmgyd2Q3MmU5NVQ5SGRtaHpLREV0K3BhUDRNUVg5K1JmOWxVNjB3S0kvLzZKZ1ViQW9XSmN6V01SRgorUWVoUVNNRXlKV0pOTTdCM2VZd2oxcmU4S0VobmpNR2FaTlNzYVVWQjB0Y3JaYVBxYlZhTXl4aVZWbGNxUlAyMktMWmxqRXFMbEFwVgorcTk3dWlHMFpvd09PVnpib3lpdG1sVEVDSzZmbHkyVjZmcjdxZlh0TXdUcGFWS3lVVXRYNzR1WVlnZ1ZBczFvOWxYNUYxU0NHWURXQgorbDJiTVZNb3M1ZHNaTDRId3dUSVFGd1lybW1JQ1dORVVNOENLbnBnREZwbUVBVlpRTTI2MytzaHNsMVp4V3ovNkgvb0QvdWtQQzZ4NQorczQyTDZzNG1yRUZxQ2xna1JYOGhXUGVPTlJZendCcE4waTRDaThpT2tHQjVRN3hqYlAyQ1pHRHdvWDYySzI5UXkvVTMzUkI4YkVEUworU0xVa3BmVWxZakUzRU1tVklld0lKVFo3c0g0RmZRSHJxaHV1Vjh0TlFVZHV1SnJwVHlRMjI4aGcvVW9pQnl1WHNOMytBNjRPdGlQRQora2F1WUVQMGJzbHc0YzlNRDl4UElBOWQvNXdjL0pKSCt1V1VsYXVuTDZEaTNQMUd6UHhoTWFNZlY5MjBOMHE4cWN2Vk8yNy8zNC84MAorbGg5L2I4RDlENURJeiszQjdpdlpGemxZdjczK0FhS0c3eDlBYUVkOFliQitJVWRINWhka2RkUi85SDJpT3VYM1hyRTF1am5XM08rUQordFhzZHFSM1BSbmtvL0dVR1FYWDVqTnNZamtpOUI1SklXdldTZzNVcm1WdFk1allTTzlKL1NWN24vZWZ6T0pLc0RZSTFta1N1Z09HcAorN2FpK0hBc0xyTEVFMmFmajN1dkk3Smh6RXdUcmdKR0VBOVp0UlBYbGJ4L3dKTWxOQ0EvV2ZnTnBCLzR3d0NKeXk1UE03VVE1NnUwdworeDJvN1l0Qy9iU2FCMWVaeDZ4Y3FkOVhIRkt5WHBMcG5HdUxZUUJ3VG9nK1dGN3dtbG8zVGtJenA3U0IyWUowMjdGNjNwODBjc09vWAorZFhSM2Frc0hLQzJQS1ZqWkc4QnBQUUV2ellncFdQa3JoZDFrb2FXbkpxTW1obUNkcVhkM2RPcEpkNGU3M2h5d2puZ003QzJ2aUNsWQorTTdZYnRQbktyRmlEcFN1dFdZMHhCY3VvZTRISE5MQzZLVmdtZ3RVWWE3QU04bmNmQll1Q1JjR2lZSDNyd1JKK1VLWUxWb29rVm9MbAorMEd3M0ZGZ2g3VEFack5Sa1FWS053VktYQ0xJSXJOQnVVWUtsWlVaZndPSllkM0ZwZWVtcVphd09XSTRWQ3dTWjZiQXlZazBWMjUwMQorVlZueklCZ3NEVHZNQlN0MSt2TDVXUEtWdFpOQ2dNVzZpcUI2cGNzNDFsS3d0TnlpQUN0MWdtakdOSFdaL0lqQllqMTcrVDBqWCs5YQoreEdxQ05UNXdsWmJYclFNckpVQkViKzBmNUQ5TkR3Skx5dzV6d1VyZUx4NC84MFo2cWc1WXJHdkxNZXlrem5wbFBYaVR3WkxjOG8zSworTFFxd2txWDljbDVWZGJHSXdXTFhYSURHTmpjMGR3QndTZkZMUldYRUFvQi9OTjN4TGdCZXR3NnNEZUMwMEM1VVQvNUxYalZZbW5hWQorRE5ZZTBJb2V5ZGdJZTc1R0J5d08vU0MwdDYyaEFSWHBWNVM3Tmhjc2RvdVdXOVJnZGZGbStFR1hza3graEdDeFcveW9Uam5IY2g2bword3NVWGRNRGkwNTNSazk0Q1FGRmV3bVN3dGdzcDFvSXo0TTJ4bW1CcDIyRTZXQ3R4YXBLK3NodjhNVlVUTE04cDBMdXJDRlZSWGF1cQorQjI4cVdLajJoY3d0aTNUQXFrbE9SUmxXdnJwTWZvUmdlVTZDejRWZnZxTHlEQit4Mm1BNVVDVjYyT1YzdjZWOHhvSHBZT0hDKzZpYworOUNVWjBDcXd0TzB3SGF6MXlXUFNVZmI3R25naldRc3M5bDBVTDRRU1ZLZ2V2RVZnb2ZydHZGdHc5WTFkckE1WXFlbklqdVQ1VXFHeAordm9DRkNuelBGbHR6dmdvK2wxWEFEd1pMNk95L1NIVUlyQUZMZkgwYXpOQUNTOGNPSzhEQ3IxYUNQVnBnc2NYZGdTakZlazcxeW9xSAorbUFrV3J0K3U0WmJnaUtXdVlOY1hzSXJsTmU5ZG50SmxMcGN4V0c4cEMrSllCZGJEaXZyb1NyQjA3TEFBTEZ3OWFjd0gya01oN09EUAorWmZsTjZhcloxa1FzUGJlRUFBdmJzVElhUXlHNzlwUThIWEVwQ255SHpyRlNVSEdKUDhVZ3g0SWo4SW5ITkhJc1BUdE1CMnZqbUl5TQorakt6cGU1UWRvaHdLLzZHc0IyOVI4cTdybGlDd3htUkJNNmF0N3o3em0yaUFCYjdSTFBDdEJtc0ZsbGQyQS9DcGxYZUZ0UXR3dXh2TworQUhteEZEVlkybmFZRHBiVSsyTzB3VG9sUFBtQmN3YlZnemNWTEIyM2FFdzNnSzdmSmZkOXVvRXRCOGY0T3N3N1VMbmMrdnBqSGxZTAorcklEalAxVVcvalVacklDOFBGb1RMQjA3TEFNTDdFL1hCTXNubEJVdjR0VTd1b08xQkt3SzBTMlZRcnNlemhBczBQaTcxS2lCNVhhSwordjZzclpuWG5zYnlnZC90TVZXRm5rOEZxT1lBbnNiNThLVnQ3NWwzUER2TnpyRlMwRTNuQ3ltN0ZXS2dFcXhzVWFkU3JOeFVzeVMxdAord1c0SmNWY0lCVDJWcnlzS0VXdXQveUlmb3NzcjBTTUpPc0VxVmpmSGVsbzlPMnBSanZVVytGSlo5RmM5RkdyYllkRmRZV3J5L0c0ZworRzBYVVF5Rk9vamtQVXEvaWlLeElyN2xEb2RvdFJhekJYV0ZxY3RaSjhOZmtLQ1R2d25Rc1h3NjVRdzhzTkkvRkZ3eFBzUllzOUJ6SAorNDZEM01aMklwV09IVmRNTlkxSnJ3SHdOc0hUcTFac0pGZ2ZkOG9MQ0xZWmd3WmZyRmZOeGtjNWpmU0tmUzJRTndCSUtodi9KNG9pRgorWGt4Q0ZUUzFGNkYxN0xBTXJHUnRzRmhVRHo2ZzdBNkx3Rks1aGJNUUxHNE5XbC9neEpLTUhYbzVGdCt2ZHg5WEZReTNCQ3grRU5aZQoraE5heHd5cXdVdE5QYWtjc3p5azBBODd4NmptclpXWEZ6UVVMQWgxd0M4ejBWaG1DbFpyNlJqVEFRbE4zNE8xbCtIRVQ3alVOUUlhMAorQmxncER3TkZPV21ySmtoaHFPelZXWVRXdHNPYXRjTGs1REd2Z1RPeS9RMnFKWjIxRjhBWHE5Mm91b3E3YUs4ZmZNeGF0RmFvN1paZworc1BqOVdNdjlRSEZiR0NGWW5BczIzZnR4WmNXT2d4M29PZXpHTSs5QlQ4K3dhT1lkRG9hZmFpOUNhOXRoT2xoN2xxK0VzcjRHS0pKZQorMVNJMDNuenhCVlN2R3BXOS91d0ZhNVowVkc2NTlMYk9QRllqTm1QbEhnRCtuaHlWL1ZpY1ZFaTk5Nk5sck01K0xMRzNZUTlmbEcrNgorTXhtczNZRm5Hc3VmSUJtMEgwdkxEcXYyWXdHd1VYYy9WdkZlOFhOZmxMbzR5L1pqYWJwRmN4NXJmM3FVZHBDeXJ1THFnMGNPVnBlNworV2UyTmZvN2FBOUphNFlMYTJwbFdnYlhpK0V2U0l2VDIydDFqZFhhUWF0aGhNbGpyYS9CUGxmZThzVks1alNsb0J5bkxlaXIySHFsSAorNWVCWjYvWmpTVzZwVkx0RkNWYStZTWFlamROVG83M25uVFhZOHg3NnRmbDczaDJ5YmZja2U5N1oyT3g1VHliZDg4N0Zaczg3UzdibgorUFdqVHU5bS8wbkU0WkM4ZGx1MTVkMmkxZTluOFNrZW9uZkZ0LzVWT3VvWWQ5T2RmOU9kZmZRS0wvcTZRZ2tYQm9tQlJzUG9LbG8rQworOWU4TWxsR3pab0ZWNys0RVBtM3BCcVd4QlN0N0EvRHF5V1ZReHFpcnB3ditILzZCUmZ5YkY5QVk0ekpHSHQzdTlZRk9zOEJxVmxmaQorS2xJWFhqc1lVN0JXT0NZcEM2MU5VcjZmNU5oQXJKNFpZSzFQbjZhc3RLWjZteld0TllaZ25mN2FZeWpOUEZpelNlb3dRN0RHa2dpcQorUWRwV2YwUWhSNVZ2NjQrQ2NNQWlhaGVCUldaSHFGS1J1MVVDb2c3V2JRT2NST1d1Y2FuSUQ1UlNzMytQVWxyREtoVko1QlluUTJpSAordlFsOHJlcGV0ZFRqL1pYTXJleVRCTUwrNkViSEhTUnlSWW12NmZRWmxZREk1Wm52RUxVNytqb3lPNXczUFhPKzZZSkt1aU5YcjhsKworKzVoZkdrdjY3Y3lqVGhJMzMyOXZhbXJxVll1NjFUQ0syLzZJekMyUHdvaEZZQWVNV0I4R2QyOUlkWmdCVndiSlZWY0ZIeHRnRzB3awordGlIMklCblpCN0JLQ051OU5wUWR3WWV1Wk9LRDFJdlA3UU5ZU2YwR0JzbWc0RVA5bUJDNlhCM2lXTEI2OXZpSW4zbmdBOCtHYWplVQorTUtSMkJPdG5EMTNuUGJOdUg0SFVqY3dsK3R5K3BNTGd6OVgxQmF5UlpQcGw5c0dPUHVqWE5LU3M3a05qcVN1elY1SG9WMWVZRk9KbworVStSZzVSSzZwY3JlQnp0Q1RnSXdoRi9YdEtWa24wc2lxZlBlUmU2YlFzTEhXdVJPSnJSaklZaW1OTm5KcUt5em55ZjYzTmFrYUdybgorQXprNVpKL3NJcmFEcE02N1Z3Q3JjZjFHWFZuZkRqdGtMZ0FObGRYNmdzQXFBMkMvL3ZYV3YwYWNKUEJndlcvUWJtVWJBRGtRckkwYgorQ2V3b0FKMUdabFNIQXhZY0IrcjFMMWdKNzc3M29XZlFiRGQ0SE5zQkFTd0Q3U29id2dMTGYzeURnV3puN1REcVh0R09BeHNNN2ZCaQorc0hxbVRjaWZyaVA1V2ZrWXJBNlArbmxzS25GVllMQnFNcVpOMTVYMGpXRkZyR3FYZnJQRm5pSWZBbXRsaHE0WmdoM1BnbEozcWJFZAorWVlCVmI2U2ZxeDUzeUFiSHpCbTY0cWlGWVBsQWhVdGZ2eUpQV3poZ2VXZGt6OUp0ZHFaakE3VGpYNGJkeTl0eG9YYjhqQm1HZG1DdworMnJNTUp0emVtSURCYW5ZYkdGUlpqTUhhazJWZ2J6aVA3b1ZnVlJnOThQU1l1d09CWlRSanpkdnhMUEFZUG1HMU9DeXdxb3NNUGxSVQoramNGYXNjRGdjOW03TVZoR2orN3RjRGVFQTlicDhiVUdIMXV3QW9IMXRidUR4STRMQjdLQnNSMDhXQlAyQVA2UmIvNVFBanRrR2crVworMFNOajBiT1VrL2huUW9lOEVOOUdUd1JnNlEvc3h6eWRBbGgrWXp1ZWpmSXpvYXZBKzBaZ3JlTEJlbW1CZmdyZ0pRUXJuR2RDUTdETworWng4d1NJaDRzTm9NQStFcUFTeXlaMElqc1BZYmZOUERCU3VLVDdFbmlsZ1NXQVIyVUxBb1dCUXNDaFlGaTRKRndhSmdmVnZCYWpjQQorYXprRmk0SkZJeFlGaTRKRndhSmdVYkFvV0JRc0NoWk4zaWxZTkdKUnNDaFlGQ3dLVnBoZzVSQ0NWVUFHMXBDUzZBNkZjMGVTZ05VQgorY3U0akJLc2d1bURGRTRJVlR3WldtVDNLWUdXQzAwUmd4Uk9DRlU4TVZpRVpXTGtsWkdEbFZFVTNZcFhsa2tXc3dnSXlzS0FkVVFVcgorczQ0SXJMcE1NckNxTWtGVXdWbzRsekJpWmY3cmF4S3c2aks3U2NFQ1JHQ2hheEdCQlNXcVlFRWhBZ3NLQ1ZqUURtODB3VUpDQWhZUworRXJDUVJBOHNMRVJnNGU1dEk3SmpkMVRCUWp1aWlNRHlnZWdPaGZDQ1pHRDFrRVVzbnplcUVRdlpTd1NXanhBc1g1VEI4aEdDNVNNRQoreXhkdHNDNzdpT1VuQXdzS2pWaVhVOFFLQzZ4b1Jpd0tGZ1dMUml3S0ZnV0xna1hCb21CUnNDaFlGQ3dLRmdXTDNoVlNzQ2hZTkdKUgorc0NoWUZDd0tGZ1dMZ2tYQm9tQmhzR29Jd1RJb1IxSXBnbVdnNFBJd2svZHlndzgwSU1VZ1dPc0p3VEtzTmhObHNJb2xzUFJsa2dCVworcGY3SE9zSUZ5NmpheklvVlJOMHIyTEhic05yTUpCR3NqTmNhYTNTa2NUMWZsNmpCVmQvY29DTnRGWHo1bnowWk5jcnJxYTdlbUI4bQorV01WdERicnRIblIxb0M5ZS9ueGRNeVE3UEpVRzE2c29Ea3UvYW8rdVd4cWFQVHdwSzJZY3I5V1Y4VHhZeGVXNitqVWZjVFdFbzk3cAorOGR2MTJ6MCtjd1hmdlVlSTdOZzl2cmFXd0E0SUZsaVprYVdRYVJNVWJ5ZGs4S0hBVis3V0wrOHQxRzl2bjY2K252SnRGbkVCZkdHaworVzJSUVZod1hTdk5Eb0xOMFJiU2owdVVoc29OVURPdmFDeEdtZHJ4S3BpcmZPbWEwNE0vVkcram5MdmVGcGQ4S2g3S2Q3R3kxSWdlSQordWxld28yV0c2bnJqczBQWndhQ2E0WTJ0amEydGpZM3dML2czZm8zK2o5L2dGOUxvcnBRTzFYdCtqUGFEZG54dW8zQUo4Ykt5TmtqcgorbEl1eHY4MUFoTTgxdGlyc2FOV3lvNDN3ZXBIcXAzN2ZLZVF5TGNkYjlPVDRlU0VIYXpPNFhwanFBZjFtb1ZaOHV6NGp0M1R5WnB3MwordWg2Mmd5RlN6UTh1Zi9IL205anhieUlNZFFFVkNoWVZDaFlWQ2hZVktoUXNLaFFzS2hRc0tsUW9XRlFvV0ZRb1dDRDBnMFY4ZnZVTAorMlNkRGJLRHdtcXF1MXh0UVFkMVNxQ05CcC9XWXJLRGtwUjUva0V0OUJLZjV6RnNjVURUZkUvelNxK2xsWHdUZHE0aFlXd3ZtSWxsYQorOG83ODZNNlN3bWVYYmo2cnVPamhyWVZ6bDVZZEVvNDFGU3ljSzV6NW9kbmZoSmFkSmFnWjZYRzdoVUxMU0JtMFpGTlhvRGdpU2k4NgorYmVubWR0Ty9xWUdHc0d1cWVKZk9YYmkwckpWZlV0b25PSG5wNWg2Vmx4ZXF2UnhscnNva1hUYTNLanB6SFdxNlNkNDA4dkt6b3BlbAorTTVlV0hJcHNLRXhqQklrZmQxTEVjOTN3Qkh4bzJKUnVpZWJEOXd5eG9XT0o0dzdoejlReGt0aW5tTnAzTFl0dnhpM0hEMXNpK0VGcworMkpZNGhmOXl5SFhodTlJTGVoY1BGMC96bXhleTRJVjdCWGZGRFZ2U2pSdktsYW56SWo1U0tCMFk5ZzdROHJJcFlLVXhvWnJlbVpZZworZU91azZKcUFsemVyemhUQUNCZXNUR1prRHBUSnNLbGJlQU5iSG9INDNEYzVKM000dzl3aVh2UDVCQ1lPSFV1ek1RTzNvY2VsMWpIeAorT1ZneVlmODlaT0ozN3ZCUTZKUDdZRHNKak8waFhzTjRKbE5zK1NrY0loaTdxQXNEajNTaDA3NGNKWjNHM0dWYXo2SDlDN0FodStDdQordTg2aVl3Vk1rcUJPQXROdkczSk5DWDlrTWp3dzZKRDh0RXpleTJkTjg1N1F2VGs1c0g4SHZpTjAweE0ySmk1dE12WmZJajdtbGJ5YworaHJ6czU4OU1FOEVnOVo4S3JCTCt4YnFoL1Y3RWNYMGlFN2ZrRVByV3Q2eVRydm1jalpueVlRK09sNk9ZUVRVNFlzVkxFYVYvM0FlbQorOWR5WEk1akV6ZGp4ZFl0dHpPOXhPTEl6VGZ3UTlIeC9yRXNWSXo3YnZPVVJXMktOZU5xU0p2NjBCSGlhZWNQZ0tOalFJZDRQQ2N5RAorUEZqaXM1RVBqN0poMWtxWVRPSEFDUGdSditSbElIajVRYjk1WUpXSXVneTFQY2kvZW82SkV6cHozWEFoZEVCM0RkdmNKSHI1S2NXWgorNndiellJUU5sdmpBOUNlWTN5S2JONkdRSk1oN2d4a2NHRThrMko0U2o1MGJ4VXpod1JMenU5Ny9NcS9uNExXbHFBbnhqc092N2N3KworNFYrSE0xc3hXRWxpc25ucFo3WVhrUlhQTWJkSXVjRW00YlRvQzI0b1VjcE9OL1czSFZLQUJiNjZGa2VvRWlZTktvam8yY1FNQTd5WAorQTZkQkw3OWpIbGlGVWpQTU5UaGxlYzhXSjRGeVlpaXpKTmpMaVNjVlNDSXdJZ2ZMRHhaaVBIcUhNakkrSnlJZHVzQWp6RGkvNkVudworcHUyaHMzS3cvSEpQUnJ2akRnK09Demo5M0lqRUR5U3d2SDZvMkhEYlpnVllYWUk5aDY5Z3RnWGdISkc0emF4dFdTM1hNYkpyVHh5NAorVGVVTy9qdkFnNFh6ZGVZV3JOSjF6SXVCOUdGaTNJc1dnTlhMMk02alVXOFV6RnlrZjMrT2VRcHFqNzNzbGNZSTZPVUFXSDZRUnhvMworUWtlc2N5UDZvYjU0YjhBMXJZRi9QWGNJSml6K2l6L2pVd1crb1VzZm52ZGFGckgrelB3azBBRzlodzk1Z1d3b2hOOTEvRVdUUjZ4NworYkV1RTB3TFNpYXd3Ujk1a2Z0S3RjcGNjckJQWDlqc2tId3JCUkQ0cmhOSGpyUG8wOHlQV29QTllwVUVCaUFEc1RPeXV1NENrUW04bgorOUxJc1luMDVvdDhIRVlHVnU2OEt5cnBSY0xTRHQzKy90ajBsM0hCQ0VXNk90MTh4N0pSMERNKzYrR1U1VmkvTXNmYVkxWEcvWnY0WAorS05UaGM2d1NyUFBpaE1SdFFKRmo5VDVpRy9nQlB1Mi9nMDh6STNWWE5DVDBUYWdjS3cwcnZQVWUyME40VWdKNjJhLzJzZ1U1Rm1wegorUS85eEZ3S2RxZVZsZEdZZUQ4YlF1Q1dFOTJZcXNFUVoxODFyc2pUb2hIWE1mVUdYaG1BVllNazE5YTV3S0JOaUdpVStYdFNabjI2bworWW9iTVJhcms1ZUs3UWk4NjdSMWdnZmpndUxJNTZHZ0JNNUpYSndmZVNndDNoYUxHaVljd2o2RzhiQkpZYWJ3dThJWjBJSjRvZW9aNQorUE9qN0VleGxud3FNU01DeUp5RVpZa1A1RzVxKzRCSDNqZVFsVFlqa1hseENQQWtmUzZyRFlFa1RIUSsxbXVZYU8xT0hvMDNWRUw3bAorUEI2c0pFRm5mR3NNd1pKMGllTWp3UkNtaXNkZlVEZ0grTXpwdUpINDdnR0FKcUdoVEhpc0lEQjNsTWluRUJBc1h1RUVHOHpaL1RJdgorSndXOGJCSlk0cHlmZUxlUUo4YlRORUZsSC9ERnE3eGNnTStVZ3hGNWp0V3liaWlEcG9uRTc1SlBwQWI3NVQ0ZXJDVGg0RDRNVmk2VQorb1RiaFp0c2t1Vm40TG9sem9Ka2liY0pFQng2SnFoZzdWQ1VuSVQ1eHlWbnh0SGVFV01aTG1sbGdwUWtSUzV3dlRzSmdqY3pMemMwYworSEQ5TW5QVVhjeXp2NFh1WVJNWFhWK1psc3lJV2RFMW1mMmJjWmlIdVNCRkxSQTdtcXdsQlhnNE1vaTNyYm1ZZThrY09Ga3p1RXE3NQorQUEyM1M3QUd2cTFRcWdxWklmRDE3c0hqK0J5ckNoM2NhaGZBUWtjK0hZeGFOVyt4NjBaaDlHL0M2dVNJWU8wVGIvWnRQK21SY3F4TgordHJnbHF0U01QeTNYTExBQ09SYnZMb2dVQml1WG55NUtGTzlNQTNlRkowYjBlekhvdEVMSW82azVWdTlFNWhZeFkzOWV6TEZ3WjViRgorSTdEVVhzNVJwUDBRakpvK2dOVURoak5sNkRaSGZsZFloOEU2OGJOQjJ4VEQwNzdBWGVHbUJIVDNhaHBaZjJZZWxDMmVGaXJBUXZkVAorVEwvemdidkM1MUNHaFhWUjNoVnVOUXNzM0pETTlpbzVXTEEzKzIxVGd5Vk1DaWx2SnZlWkNWWWg4c2k1VVdqZVBZQkpJQ1hHRWVzNQorNk9VdW1aZHo1R20vWDVndGpCU3NMaGlmNGZtWFpQTllmdkFoQWd2Tll6MGtXNjVVZ0FXZXQ5bGVOQXNyUHpqY1A2NG04RzZwR3F4ZQoreHRZam0yNllhQk82RXA0bVp1OWVQeWd6RDZ4elYwanpXTENoclhLd3dMa1JhTnhUZ0NWT2NwMlR6Yk1oTDVzTEZwb3pHTXJjY29FUAorc3FPWXB3Sk45MkN3ZHZaUFZIaFpBVmFYbEVoR09CUUtjVWsrbFF6dkI2L0ZsUGZ2OTFSZ2tlVmFPVmorWHZobE9Ha1dXVGlJQjY3KworaEhvb2ZOUDIzWFlaV09ldysvenEweGFiQjVaaWloKzZTdzRXemhPRTVGMVU0TkpFMis5QnNKZUhtRDZQdGNrbThpUmZXZ0dIOGF3cAorZE5kZFNpK0xZSGw1TVBaSEFwWUFac3NqREI1OFlTT0p3bHJoemlkc2FBVUN5TllLZlhXTGI3Ylo2Z0pnZWNHSndiYTd6TnMrRUZqRgorYXRsNWo0MlpySmdnUFR3VWV5c3dRV2pNR1hFQUFBSnFTVVJCVlBwZWYzNjZnVjhyUEN1ZGRwOXBZUEdMa3J5N0hyRXg0K1Jnb1RVbworWWJvaFU1enpzL0ZCTE1qTGZwUEJndEZjWElTZUtLNFZudCszT01FV2gxNTlxdlR5NDRvSjBudElKeHhVWUtVVm9OdTduT0VNanM1ZQorWVhjRE9tSmptSEhDMS9GNUc5cmRrSXRXdjZFS2ZzWE0rM01Nczgwc3JzUjFkM2huQXhXTW05TEtnNVdUaDNUT1RHRFVNKytQTUdnTQorOVByQTRWSDhhZGlLS2EzbTZZZTJVVWp1d2hNdkFiQmdhbk5MSzQ1WVNkakp1WGcvaGg5NytaNFFYallUTERnWTNpWFEvUVFUNk14eAorN3dTOFBGbjA4bG4rZmhJN09lZG1KbzV3VWpEMGZpeG1tTFJzczI0NG5oZXkyY2NKVzNqd2Zxd0Vmci9PeUNVOXd2MjFDTmFsRWN3ZworOHdaRGFhY1FZNTl5aUUvTm1jQldJVHpudDVXeGkyREJBQ0pzUWhIM1kvR25tU2k5NjhTR2tMdThhRDlXanJTTTBoOXZlQWpzeDdMegorODJ6OE5xNzR3R2xtZ1pYR3pCVy9BWnNZS2JrUzkyUEY0eGlCczRxV3hVUGtYdmFGQkNNY3NFcHk4N0FvZDFydUxKbGJ3Ry9IbE8wdworaE1jS2xuNG9aRGROdVhtQlQrZE9ObThYS2NxWWRoYkNsamRMcTJzRnZNb0ZTL21PQkhVNWM2VUFzaTUzc3NpUitqVHpCRGFVdDdTcworU2J3SnpTbVRkSDgrOTNHWVgxVGxDRTR1VXlnRHZaeW45bktVd1NySnFaTGVQWk83dE5zcnRIVVlkVER1VEc5SUwvdGtZQkF2T1JudQorZWZmNlpiMHFTby9PY0FETTNQZnUxVkhXcTNmQXIyZGpsTmxYdWRRWGRDVFlqVjRMNnVDb2RmRUc5N1J3U0w3blhhMnpQd0t3cUZDSgorbWxDd3FGQ3dxRkN3cUZDd3FGQ2hZRkdoWUZHaFlGR2hRc0dpUXNHaVFzR2lRb1dDUllXQ1JZV0NSWVVLQllzS0JZc0tCWXNLRlFvVworRlFvV0ZRb1dGU29VTENxWHEvdy9nYnVkakk2Yk13WUFBQUFBU1VWT1JLNUNZSUk9CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvY3JvcC5naWYuYjY0IGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2Nyb3AuZ2lmLmI2NApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWQ5MzZhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2Nyb3AuZ2lmLmI2NApAQCAtMCwwICsxLDEwNSBAQAorUjBsR09EbGh1UUpHQWVNQUFBQUFBSDkvZndDdkFQOEFBTkVBMGRFQUFLOEFyLy8vL3dDT0FBQUEwUUFBLy8vLy8vLy8vLy8vLy8vLworLy8vLy95d0FBQUFBdVFKR0FRQUUvdkRJU2F1OU9Pdk51LzlnS0k1a2FaNW9xcTVzNjc1d0xNOTBiZDk0cnU5ODcvL0FvSEJJTEJxUAoreUtSeXlXdzZuOUNvZEVxdFdxL1lySGJMN1hxLzRMQjRUQzZieitpMGVzMXV1OS93dUh4T3I5dnYrTHgreisvNy80Q0Jnb09FaFlhSAoraUltS2k0eU5qbytRa1pLVGxKV1dsNWlabXB1Y25aNmZvS0dpbzZTbHBxZW9xYXFycksydXI3Q3hzck8wdGJhM3VMbTZnUUM5dnIvQQord2NMRHhNWEd4OGpKeXN2TXpjN1AwTkhTMDlUVjF0Zll4YnRoMmQzZTMrRFJBZVBrNWVibjZPbmw0ZXp0N3UzcThmTHFBTnRnNy9qNQorK3Mvei9mNEIrd0lLSEFqc244RjA5ZXg1SWNpd29idURFTTFCaTBpeG9zV0xHRE5xckpoUUlaZGsvaHREaWh4SnNpVEppU1pUcWx6SgorTW1OSGoxcSt0Unpuc0tiTm16aHpEb3ozRWlZV21UTjcrdlFKZ09mUW1ONW1BanpLdENnOXBqK1RCb1U2MUNsQ3FsYUF0aFNLVlpkVgorZEZ5N050SEtNcXhZVzEvUG1UMmJoT3pLdFd4bHBaVVlGNHBibFhEcnZwcTdUcStUdStVR0NCNU11TERodzRnVEsxN011TEhqeDVBagorUzU1TXViTGx5NWd6YTk1TW1WeGV2MEVBa3hzZzhqTm9WWE5KMHp5OVJQUTQxUnROc3o2VjJ2UHN0bExUd2RZbyt6YXAycXQ5RzNFZAorWUxkTDRiR0FMMFZPaExoeGpMMlpmMUllWGJvTTU2V3R0Nkt1UFhSdWRNOHZWdStlaVR0NUg5aERqajl2eWZ5SVhyVFc4MGdmTzRPQworKy9qejY5L1B2Ny8vL3dBRy9pamdnQVFXYU9DQkNDYW80SUlNTnVqZ2dSZTRKNEl3QnhCZzRZVVlacWpoaGh4MjZPR0hJSVlvNG9naworbG9paE1CYmkxazA4NFZsa2xnTHNXUUtqQlJKcWdJd0VCSlJ5WTRVcVpzTmlkaGpNR09Na1FsTGduakVSd2tkQmp1VnBrMlFGVEI1QgorSDIvMkRVbEprUk5ZaFdRS1VUS3lKUXBkRmpIbGNVRmFTYVF4bzluR1FwaC9mQ2tEbTBPTUNWMlZaaDdpWnBibndDWWZCbkRLY2VjTworZlhxM29qb3Rja1JublhyOFNRR1dFdFFJcGh1S0VoRW9FSEtLZHlnSENVaVE2UUVKZERyRXBoV0Eyb0dvM1VYYUFhTUhPSHJDcEZtWQorMmdTcjZIMlhKNUFYb0hxQnA1eHl1aW1wUGZDYTZ3ZSs2dVdxQ2FpcWFnS3NUQXhyQmJMei9zbHFUcUVVdldnQnFMdmlTcXF2blhwcQorcmJiWlRwRHR0OXppU3NHM3VuS3JhYWJrbHR1dFdNcStVT3lzd2EzQTdBL3Rmakd2RHBXNmVLbTN2K2E2NjdpMzh2dnZ1UUx6VzdDbQorQUo4NzhML1c5b3V1Ui9YaThPNnphc29yUk1SbzNKdER2b2FXT2UydjRJSWM3TFVJRTR6d3RkMVNtN0M2S1o4TUxzbXpZQnpFeElGVgorcklMR0pzZ2NCODQzY0J6dHZncUhXbkt3dXA1czhycm9WaXZ3d0VjM0RITFIvaktjaXM1SzBKeG12RGV6UUxVZVBOdmdjMFRTQml4MAorMU91RzZuUzU2bm9iN3NzcXAxMzJ3dUlpN2NuV1UxajltczFjaGtEM0lGM1g4RFZFWWU5QXROaTM3TTJGM2NYaC9XZ0ZoalBTTncxLworSHhTNENTOTdNUGpIL3RzNXVRZmllcWJRdUNXUHp4QzVRWlBuY1BuWW9YeitCdWVLWStCbTZKM0FIc1BvLzVUT211cDVzQjV2eExKdgorMHZzTHRQdGpPMVc0RDBLejZyOW5rbndMd2ZjenZGZWFtNklBbW5kam5mY3N5MnZ0Yk0zcUFUMktraGtVTHdqNFNSSVRJYnpMV1l4OQorajlqODJMM0h2eWxqaXZ6ZUcxdEM5cUN6ZjQzNzljRVBpZ0FDQ0FZQUIwakFBaHJ3Z0FoTW9BSVh5TUFHT3ZDQkVJeWdBVk1WREJMbworTG4xWld4OFNtamVQNTIxQ0FFWWlYeXBBR01MMVhIQlBGOEJmSlZUb3VlMWRyWCsxR2dVSlpUSERGSnl3QlN5Y1JBNVB3RUY1ZUZBVAorTllSRkVFOXd3elhSWW9jNWMySDFZR2dCVzMyUUZrTWsxdmtvWnIzRnlRS0pKZWloL2xIODk0a290c0tMRnB3aTl6QjR2U3ZxenhyOAorb3hJWFBRSEdWYlJSQkVWVW54azNxTVRFdlMrR29uampCQkN3eHdNZzRJK2QwQ01JNHBqQk9VcXBqdEFDbS9jNElVaEFTdUNQZlBRagorSTFsQXlETEdBb3NrME9KVDFoaElDMFJTa3BEc295ZzlHVXBBaHRLUHA2UUFKRDlwQjBGK29KSld2T1FacTVGR011RXhGRkhrWXlSMQorT1VwV3FyS1B2SHlrSklYWnl6eTQwZ093WE5VUlowbU5XczZKazVQMEpDaFhLVXhIWHNDWHdRVGxLSWU1aDJPZVNvd3ZSS0VGTU9rSQorY2s0SWtiUnFvZ3l2YVUxdVpwT2QxVVJsTlhlcFNucml3WnNjU09heGxrbkhRZWttblJWd0loQXhnTTA5cnRLWEJyWG5LYWxKekZUZQorQVo4YjBPZjkvdmg1U0grQ0I2Q0xXaWNQRUFvSWlHcEFvaVF3cCtPWU9RMW5XZ3FhVDBUQlFUbDZUVU40dEg3b0V5ZVVLRG9jZE41Ugorblhuc0FVdjk4RkpPMmkra05CV1RUWmtZVUkzU2tKTGdYS0pNbHhUVTVneFZqYmY4SHhTUlNxT1k0ckNwY1hxcUxYR0t5Nm11QUtRagorRU9raXhQb0JUVjRGcFFPZFJVK2ppaWNxa2pHV3NDQ3JCOHdLbGtXbTlLaGZUYW9kMzZwTURWYlVSNFRDNkFRRW1vbTFzcEdxakxPcQorRWYxYVU0dWlENnBjbGFwYUVXc2t4Y3BSbHYwRTdEOXZXdFNjVGphdlZYWHJVaWNnVjBTVWxnTjBWWXRkMDRwWEZZQlZCS2MxUkd4dAorcE5WbnN2V3duM1d0WGp1M1dFTTJWck1YNVd4R1BkdGFHKzYyZGZ0a3JGQWQvdXRXeUhhMnE3azFibWpIT0ZvY1lmVml0VDNwYlRzWgorWFJTOE5nU3pKVVI0WFpkZGZhRzFzRjdWN1hURGVWWGxPcFc1WTNUdWNLRmJYTzhldDRwOTllMXlnZnZZclQ1WHN2VWw0bjM1bWx6OQordnBlL3pmWHZmQUVjQzhQK3Q2M1ViYStCc3dyZkY4cDNzRVp0TUdVaHpON2VZdmF2N1F1c2NERk1YQTJETnJHaWxmQ0hmeHZpelJKMQord1YxTXIzUlJIR0VQeDVXazBqQ3BlYmNielFCTGNiMUtWZkdOTTl2aTRMNll4UFExc1hwcDNPSExEaG5FK3hQeGtTVkFXRXc0dU1jegorcm15S2JmeUs4WllQd2ZGVk1KSVpMTVFOTjhxeWhWenhmb3ZjWDl0R05zYmRGVENROTFwZEhybVh3bUMyc0ppcG5PRXluMWpMTlhaeQorbDNFcy9nNHBYNWpQSmZiemtnSGQ1RFEvbWNWUmR2R2hEMURsUzF6NXJsbm1jSkM1N0FvdjA2aThIZU14cGhXZDZUTnZXZENkSmpSSworSkwxblN2ZjVGWmRHTkpNM2plcFdlSnB4b1A3WmVhMHNZL3ZPbWJlMVpzV3RTNWpuSlU2NjBwYUlOWHIvckdrNkMzblFSSTYwa1kvOQorYWxjbys3c2dHTFlmdE4yb1hDdHkxNWJ1dFp4bjdXeE8yMXJWL0RCMHE1RmRDV1h6bXRtbURyU2pvUTFsTktyYnpRL0dyWTlMZ08wUAorY0pzUC8wNHRYY0NkYkhIL21OekFubmVxbzIxdlZ1TWJ4dnBXY3FsVGhXWkxQbnJOMG02emR0OGNjVkw3R3VISW5laWRzVnRoWTYrNworMmw4ME04VlByZkJ6TTV5Vzk5NTR2cm03N3pEK091UkFIYm1naXIxWC9tb25HdFlxLzJsWXI3dHpOaWY0NFdPR2M4MUgwRzhQL0hzUAorQWZjMjRGYTc3S1hEY2NCMWZqclgwTzBNSFllYTR6U1grTWNaVGV1V0M1dnJ6ZkM2cmtYTldyR1BtK3psRHZZcW9sN3lucC84NTlZTworZXNYaFNtOUlOM3phZDAreXg5L2U3SVJidk84WS83dkdkd3gyTEEvKzRIQTNQTjhYWG0rWU8xem1FQS83NC9tTjlXZFQzdStXQnp6UworWlUxbW9NTjc1ZkkrL09jVEgvckZmMzNtampmOW9ndVA4NkhybkZKU2x4elYzMjMxRURTOUExclBBOTE1bnNpcEU3emRCdWY4emZGYgorWURVZjJPaGhIcjJyOFo3eTB3c2R0a1RIZmQyTHIvdmpVOExkNGJiKzN2UHJmRHhEWDgvU1ovZjNrMjl6a0ROZjVCTW1PZkVGUzNxbAorL3JzZDhyUi9mODdqWC9TTUh4M3pTZGR4c2pkeDF3ZGUyVWN2dVVjNnV4ZCt2VGRJbldkdVovZHl6UlJ6akFkN296YUFZNWQvQkFaLworNVNkLzUyZHk2WWR5ckhCdER5aDNxakI4SDJoM0lVaDlJNmgzTEtkNkxsZDVFM2g1RlpoNXNaZDM0dmVDa3hlRG9EZURvZ2VBOVNlQQorT0RoNzhkWm9NQmlCTWxoU0ZQaDZObmlCUTBpQTQ5ZDhGL2Q4L2hkOVFEaDlnb2VCaEZlRVpYZUVjNGQyektCMjM4WjJWWGQveXVkKworRzdoL0hkaC9pdmQvTlJpQW1xZUYrTWVGY1dkMlh5aUJTa2lEVEFpSE4xaDlSSWg2UnJpRFNOaURlZmlEYnhpRWNmaUVHVWlIa2tkKworVTJoK1ZZaCtWNmgra3lCQmxuaUptSmlKbXJpSmx1aUNxU2VJL25lWWhEbTJoR3ZYZUp6Z0N6RWpRa3hYZ25aNGdtQzRER0pvZkdTNAorQ2NBQUM3WFlmcEZYZTloM2V3aTRmZlNIaGZHamlxdndDMmVZaS9wbmUveW5mZk0zWW9pWU9xaG9pODk0ZGN1WGhzaTRoc3FZZ3R5bgorZ041WEh0MW1pOTNvZTZ6b2hhNkloNk9vaDZWb2dUcFNaKzNSRzcvSEFjR0hCeWdZaVNBNGlkQ1lpc2dVanFBNGpxSllhT1k0aHFZNAorTmVwWUNjSTRjd1dZYlFjWUs3N0lqTUJZajNLeEZ1MjRBZTk0Qi9IWWhsWjRpQXVaSEFGSkNRUDVrQm9Ra1hZd2thM25obnZZakF5Sgora1dCWGtQNTJrRDBnY0gyeGpRQnBqM0NJa2s2bmtzMlNrRk4ya1dpUmtaT2dKQnlaQVI1WkJ5RHBnNjUzamsxWUN3TTVqQURRL3BOOAorUXBNN3dKSWhSNGw3b1pPU29Jb3lDWHhNaVM4SldEc0xhSlJTK1Fnd1FqNVY2WTVYdVRGWktUeGJtWk92SUNSS0VwWVFPWlk0NEpUdgorQjVYeDBaV0tnQ1crRUlVYytJZ2VLSThxU0k5WWNaU2lVQ3hwMFloU2lIaFVTSkdTYUpGeVdUaDBXUWp2MGd1QjZJaUdDWW1JT1krSworR1JlQTJRbkhVeFNFbVplVHVaZVYyWmVYV1JlWnFRbDJBNW5IdUl2SjJJdkxlSk9MdVEybGVRbWNBNWxaNTVZOVU1Yk9jNVpIRVp0WAorY2wrOG1aSzhpSkN0NlhPMzA1aDZjRUsvS1piQnVaSzQyVUc2U1R6R2VRZEZsSncrYVp0ZTA1dys5SngvR1oxMFFFalVPVTdXNlRmWQordVVXektDemNHUWV3OUoya0ZaNlFNNTZiVko1K29aNkUvcUJQNnZtVGRCQ1VoVGlVL29pT3R5R2ZnUUJTMUdtZmM0Q2Y1V2lJSTRtVAorMHVHZmZ2QmF2eW1nY2tDZy9HaWdSTW1IMXFHZ200T1A1R1dWeTFtVHd4bDRRMktoZU5CMG1lbWdPL09LeWhDTDNRZWZ6QUdpZGRDTworUjBtaWNBQ2hxeWFoKzFtVTU4R2ljc0NSd2dpamJ5Q2o2ZGFQc3ZpUE1ZS2pxNE9oWmRVVFBPb0dQdHAxcEZpakZHb21STW9HU3ZtTgorZHJhYXdvbU52L2lhQ1hxZWgyT2s1MVNsMXNpYVdLcVFXbHFoWEpvRlU0cHI3Q2s2N25sV0tncWxaMm9GYVFvbFVaby81QmloK2htaworL0lrb0lmUUhjOHBVRktTWGJCaVNGWG1nWmNvZWRRb0dmN3FlV1JLbmdyQ2thZGVrZW1xamZQb2t4K21sYWtpbHFRQ3AvbUVvcVNrcQorcEpXYW9TR0txZFhZcDV0cW9pRGhxZHI0cHFGcXFpMUtxcXBwcWFiQXFiQ29xbHJwa3EzYXFLODZqYlc1QVlscVdxaUtEQ2k2cXFDYQorcTdRMUI0dHFYUjN3cTRWQXF5ZHFxMmFKcThicXFtNlFyR0NLV280S2xNRjZETU42cTZ3NnJiSXFwYkJxZ0hxVHJRKzZyZFFEcEorNgorcCtDNnJPYnFBOWJhTmN5NmJlaGFETjBhcmQvYXJxS2FCdkdhUkp6Z3JLbXFyc1RLcnZvNlYrK2FBLzNLUXdlYkJnQXJyTkNhbTlKYQorc1B0S0JnbUxBdk1xa2ZWS0RQY0tzZmtxc2NkS3NlTnFrQ3R3c2ZlWnNjT3dzYzRac1I0YlBnc2JBeFU3c2kwYkJnM0xyUStic2gyNworc3I0YXN5M3dzdG9qQ1RPYnJqUTZxVStLcy83cS9nVTh5enc2dXdVL2E2ODFtNTBxUzdRNTJ3Vkg2d0lrdXdaTHE3Rk5TNTdGQ3JWWgorbExURnFJRzkycDRqZGFjem1xZnJTcWxjcTdCb0dyTEFlWjJLY0xVbm03WHZ1YlZwVzdSVk1MVnNDcXhrKzZOQmU3WkRXN2NxVUxVdQoreTdZejJaUmUrd1J3S3d3bzY3UTNDN2psV2plRXE2SE5JbDRtcTdoeTY2WjA2N2dXZTdnd3BZT1NpWldQV3JuQnNMaGFTN0NhRzdpYworZTVKNG1hbk1DUWlKTzdxWFcxZFBlN3BmeWdSNE83bDk4TG9GRWJ1cU5idTBXN3RKY0x1dEMzV2l1N3NDNjYyWis3c3dHN3lScTV3MQordFhWN3k2VEhpNi9KcTd6TGF3VENpM3Z3V0x5L1FMcHphN3JXUzdVNm03M2U4WkhjZTVlOE8zQ05HNzZiT3dUay9vdGRKUnU5a1RxOQorSEZ1OTdJdTBNOU84YmZrRWd2c3E1NHVhOUd1ejludS8rQXV2K3R1UlV0Qy9TcUM3M1p1K0xibStCSXk2UGZDK2g2U2svOHNYaVdtbworRVF5L09rREJkTVFHREl5K0FjeTRBN3pCd0hPZUhvd2JhaERDQU55M0E0dTJKbnliTjVEQ1NxREFRY0RDR0d5WkdoekRUbFVETk53YQorcVF1QjE4aVgyWWk4NE12RGJpc0RQNXdzUVN5T1YwckVXWXJFRlF3RFN6d1dUVnlZbEVtb0dUeWhKQ25GQ09ndUIxeWQzSERGcFhxWQorV3F6RFhJeWdYbHkrbmhpWldOd0ZObXdET095OW1IdkVhMHlXT2ZpSm4vc0ZjVHdEYyt6QVQzbkhRQXlGbnZ2RzkwREd6a3VJQldxMgorTC95M2dxeTljd2lJWFppUGZJeklZcnlQL21VcmttbDhxSThzbmwvTGlMcElybXJReDBJc3BsQk1wcDM4RitOUnhVaEJCWDg4d3FVTAordzZuTXhxOFV4a3Y1QnFTOHg0TXFsSnJzcEYwOHk4OTdqN3pxZVd1UXk2eWJ4YnhjcUpzTXpGRVFtNnhjeVU3d3lpNXN4TExNekZrVgorVWJhY1FuWmd6RzJyeUhqYXkwTDd5OWI4d1Q2MXVtWHNKNmtyell4TXpZNDh6bE5Na09ZY3E5dDh1T29Nem40cnp1NnN3cG5IbGdpOAorQjl4OHk1ak10K3RNdlhhY3p6Mk1pUHg4eWY0Y3MvV3N6TDZzeGdhdHlqaVowQURkQi8vTXFBRXR2ZE5NME5VYzBlU01obUhiSnUvYQorMEZ2ODBKenMwVDh3UFQxQjBkbzhDTnhNMG1oczBpaDlCVE1DUGl3Tm5vV1F5ekF0bWpzODAxUlFKUEJ4L3RNelpTZGN1dE5Gek5IdAorN05OSHdDZ3RQTW02ekF2Y2FkUlJyTlNRKzJsZjBabkhuTlBHS2RXb1ROVlNNREdvaWRYblROUTB3Tld1NmRWZkRVNjlJTmJ5dkFnWAorYTliRWlkWk9nRGlvR2RLT3dLeHc3YUZ5YmJ2SEZZMnRtQWlKbXRjcnVOZE5nSnlsN05iVkpkaCtTZGg4UGN3NHlpd0dNQUdSYlFDVQoralFHUm5RS1h2UVdQZmNGMExMc1F6TmcrWElJZ2lpeVZMUUdVZmRtWlRRR3BiUUtyM2NwUGJjcWhlZFQxVzlDZ2piRGhxS0Jza3RtVAorWGRvSGtOcXRYZHFuTGRtN2ZkcVZUZHk3UGNhR1BNU3hQZFcxemJ6RC9HbkhQTm1tM2R1U1hkMFhJTjNUVGQzYWpkb1Z3TjFpSUorSworUFpyTmpRUVM5WjF3SXQzR1BkMjgvbTBCMkwzZDJlM2R4SjNkWTJEZW5BM0ljVG5lemczU1Vkdk53dTNiMWQzYXF0M2I4UDNlNm0zZAorQUg3SUlwdlI4N3ZSczkzUitEM0Q0OHFiZmJMYXVwM2U3RzNhdkQzZzFHM2M3VzBHRWw3ZnNQeTlEdjdnb2YzYzdwcklvbENhNGQzVAorSk82K2tRdVlzc1BoZ0wwV0s3N01MVTRFRDdtV1E0MEtPZzZvQ3Q2cElWN0hJMzdqZzJ2aTUwUStTVm9HeElqUjNwekpEaDNPRUUzawordG0za1I5NFJTYTdrMFZqak1pM2wrVXZsNWZxTVYwNEdGYVRsVUg3U1hMNkZrbHlIL2hybVorQUxaSDdQVVg3bUphN2ZhMklpZG43bgorZUo3bmVyN25KZ0xpREM3QXRDM25lZXpHOXd1WEcyam1ncjZLWGg3Qmh2NURpVDREMXFxdmphNmQvby8raDBLOXNwUHV1NVV1alhUTwordzVuKzJac09qb3RPd0o5ZXdxR09pMkFyeGFVZTZLZXU2SjBldzZzKzVLM3U2c1pJamRZYjYwazk2MmgrNlI2TDYvaXM2NHVZNW15dAordkw0ZTU4QWU3THd1c2NXTzZNZStYY2xlc012ZTdFcWN6VVFiN2RKT3hkU09zOVorN1M0UTZlMjY3ZHpleGs1TjZtM3EyYVllN3VWYworeUlWZTdyMEw2dWdlay9GTTdPeXV2dWR1ckFVZ0FmZCtBQVd3N3orUTd5Zmc3OTgwNnV0dWszRjl1dnl1Ny9xZTd3Q3ZBd3RQQWczLworVWRtTzZmUCt3UFZ1SmY1KzcvdXU4Qlh3OEJtUDhRclA3eDAvQVIwLzhnbC84Q0tmOGZodThocGY4aDRQOGlIZnVYcE03Z0F3OHdCUQorOHpaLzh6aWY4enJmMmUxZS92RVdqL0FJdi9MNGZnRVhEL1FYWC9SRkwvSkF2L1JMci9KRGIvUXByL1FtRC9FQ3o3NDZmL1ZZai9VOAorVCsrc2ppZ1l6L0pmbi9BWXNQQkM3L1Jrai9KSi8vUmkvL1FyLy9GS3ovSlUvK29tblBWMFgvZGJUL0ZkWHljby8vWkNid0VISC9aLworLy9kcmIvWjlIL2h0ei9ZcHIvRnA3K3p4L3J0MS8vaFhmL2VCN0xoa1AvUWs3L2VDbi9od3Iva2pmL2xCdi9kN3YvbUtqL2Fobis0eAorUC9DUW4vbzV6Tk0yanRJUG53R3Z2d1BlRHE2cVgvdVNmOTlJM1BrZUVQdEU3K0pWSDc2MXIvcTNmK2cremZ0KzcvdHl2OEhCbi9yRAorNytqdkx1ckp6K2pMLy9qTlQrblBiL3FFYnZYVGIvZjJmZWdQOHYzZ0gvN2lQLzdrWC83bS9uLys2RC83MDdyOTNLOGJuUEgrOEIvLworOGovLzlGLy85bi8vK0UvL29lejQ3Si8xU21ISkVIRGtwTlZlblBYbTNYOHdGRWV5Tk04UkNGYTJCVkE0bG1lNnRtOGcxM2UrOS9sVworVURna0ZnT3ZXMUs1WkRhZFQ2aFNWVVJHclZkc2R2bmpkbnRHY0hoWTFaYk5aM1JhM1prU3lXdDRYRjd6MXJ0aXZOaSs1L2Y5ZjhCQQord1VIQ1FzTkR4RVRGSGFPM3VVZklTRGE3dkVyTFM4eE16VTNPVHIxQXoxRFJVZEpTMHlCSFNkWFZ5TDNUVjloWTJkbWpSZHRiM054QgorMmlOVzM5ODVYZUZoNG1MalkrUms1V1VlWU9kbjZHanBhZXBxNjJ2c2JPMXQ3bTd2Yi9CdzhYSHljdk56OUhUMWRmWjI5M2Y0ZVBsNQorK25yN2UveDgvWDMrRzM3L2Y0QUJCUTRrV05EZ1FZUUpGUzVrMk5EaFE0Z1JKZEtMQUFBNwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi8uZ2l0aWdub3JlIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi8uZ2l0aWdub3JlCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiLy5naXRpZ25vcmUKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmIvLmdpdGlnbm9yZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9hdWRpby54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2F1ZGlvLnhtbApzaW1pbGFyaXR5IGluZGV4IDc5JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2F1ZGlvLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9hdWRpby54bWwKaW5kZXggZWViOTZiOC4uZDY0Mzg2MiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9hdWRpby54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9hdWRpby54bWwKQEAgLTE0LDE3ICsxNCwxNyBAQAogYXVkaW8gZGV2aWNlLgogPC9wYXJhPgogCi08c2VjdGlvbiBpZD0iYXVkaW9fc3RyZWFtX3NvdXJjZV90Ij4KKzxzZWN0aW9uIGlkPSJhdWRpby1zdHJlYW0tc291cmNlLXQiPgogPHRpdGxlPmF1ZGlvX3N0cmVhbV9zb3VyY2VfdDwvdGl0bGU+CiA8cGFyYT5UaGUgYXVkaW8gc3RyZWFtIHNvdXJjZSBpcyBzZXQgdGhyb3VnaCB0aGUgQVVESU9fU0VMRUNUX1NPVVJDRSBjYWxsIGFuZCBjYW4gdGFrZQogdGhlIGZvbGxvd2luZyB2YWx1ZXMsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHdlIGFyZSByZXBsYXlpbmcgZnJvbSBhbiBpbnRlcm5hbCAoZGVtdXgpIG9yCiBleHRlcm5hbCAodXNlciB3cml0ZSkgc291cmNlLgogPC9wYXJhPgogPHByb2dyYW1saXN0aW5nPgotIHR5cGVkZWYgZW51bSB7Ci0JIEFVRElPX1NPVVJDRV9ERU1VWCwKLQkgQVVESU9fU09VUkNFX01FTU9SWQotIH0gYXVkaW9fc3RyZWFtX3NvdXJjZV90OwordHlwZWRlZiBlbnVtIHsKKwlBVURJT19TT1VSQ0VfREVNVVgsCisJQVVESU9fU09VUkNFX01FTU9SWQorfSBhdWRpb19zdHJlYW1fc291cmNlX3Q7CiA8L3Byb2dyYW1saXN0aW5nPgogPHBhcmE+QVVESU9fU09VUkNFX0RFTVVYIHNlbGVjdHMgdGhlIGRlbXVsdGlwbGV4ZXIgKGZlZCBlaXRoZXIgYnkgdGhlIGZyb250ZW5kIG9yIHRoZQogRFZSIGRldmljZSkgYXMgdGhlIHNvdXJjZSBvZiB0aGUgdmlkZW8gc3RyZWFtLiBJZiBBVURJT19TT1VSQ0VfTUVNT1JZCkBAIC0zMyw2MSArMzMsNjQgQEAKIDwvcGFyYT4KIAogPC9zZWN0aW9uPgotPHNlY3Rpb24gaWQ9ImF1ZGlvX3BsYXlfc3RhdGVfdCI+Cis8c2VjdGlvbiBpZD0iYXVkaW8tcGxheS1zdGF0ZS10Ij4KIDx0aXRsZT5hdWRpb19wbGF5X3N0YXRlX3Q8L3RpdGxlPgogPHBhcmE+VGhlIGZvbGxvd2luZyB2YWx1ZXMgY2FuIGJlIHJldHVybmVkIGJ5IHRoZSBBVURJT19HRVRfU1RBVFVTIGNhbGwgcmVwcmVzZW50aW5nIHRoZQogc3RhdGUgb2YgYXVkaW8gcGxheWJhY2suCiA8L3BhcmE+CiA8cHJvZ3JhbWxpc3Rpbmc+Ci0gdHlwZWRlZiBlbnVtIHsKLQkgQVVESU9fU1RPUFBFRCwKLQkgQVVESU9fUExBWUlORywKLQkgQVVESU9fUEFVU0VECi0gfSBhdWRpb19wbGF5X3N0YXRlX3Q7Cit0eXBlZGVmIGVudW0geworCUFVRElPX1NUT1BQRUQsCisJQVVESU9fUExBWUlORywKKwlBVURJT19QQVVTRUQKK30gYXVkaW9fcGxheV9zdGF0ZV90OwogPC9wcm9ncmFtbGlzdGluZz4KIAogPC9zZWN0aW9uPgotPHNlY3Rpb24gaWQ9ImF1ZGlvX2NoYW5uZWxfc2VsZWN0X3QiPgorPHNlY3Rpb24gaWQ9ImF1ZGlvLWNoYW5uZWwtc2VsZWN0LXQiPgogPHRpdGxlPmF1ZGlvX2NoYW5uZWxfc2VsZWN0X3Q8L3RpdGxlPgogPHBhcmE+VGhlIGF1ZGlvIGNoYW5uZWwgc2VsZWN0ZWQgdmlhIEFVRElPX0NIQU5ORUxfU0VMRUNUIGlzIGRldGVybWluZWQgYnkgdGhlCiBmb2xsb3dpbmcgdmFsdWVzLgogPC9wYXJhPgogPHByb2dyYW1saXN0aW5nPgotIHR5cGVkZWYgZW51bSB7Ci0JIEFVRElPX1NURVJFTywKLQkgQVVESU9fTU9OT19MRUZULAotCSBBVURJT19NT05PX1JJR0hULAotIH0gYXVkaW9fY2hhbm5lbF9zZWxlY3RfdDsKK3R5cGVkZWYgZW51bSB7CisJQVVESU9fU1RFUkVPLAorCUFVRElPX01PTk9fTEVGVCwKKwlBVURJT19NT05PX1JJR0hULAorCUFVRElPX01PTk8sCisJQVVESU9fU1RFUkVPX1NXQVBQRUQKK30gYXVkaW9fY2hhbm5lbF9zZWxlY3RfdDsKIDwvcHJvZ3JhbWxpc3Rpbmc+CiAKIDwvc2VjdGlvbj4KLTxzZWN0aW9uIGlkPSJzdHJ1Y3RfYXVkaW9fc3RhdHVzIj4KKzxzZWN0aW9uIGlkPSJhdWRpby1zdGF0dXMiPgogPHRpdGxlPnN0cnVjdCBhdWRpb19zdGF0dXM8L3RpdGxlPgogPHBhcmE+VGhlIEFVRElPX0dFVF9TVEFUVVMgY2FsbCByZXR1cm5zIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGluZm9ybWluZyBhYm91dCB2YXJpb3VzCiBzdGF0ZXMgb2YgdGhlIHBsYXliYWNrIG9wZXJhdGlvbi4KIDwvcGFyYT4KIDxwcm9ncmFtbGlzdGluZz4KLSB0eXBlZGVmIHN0cnVjdCBhdWRpb19zdGF0dXMgewotCSBib29sZWFuIEFWX3N5bmNfc3RhdGU7Ci0JIGJvb2xlYW4gbXV0ZV9zdGF0ZTsKLQkgYXVkaW9fcGxheV9zdGF0ZV90IHBsYXlfc3RhdGU7Ci0JIGF1ZGlvX3N0cmVhbV9zb3VyY2VfdCBzdHJlYW1fc291cmNlOwotCSBhdWRpb19jaGFubmVsX3NlbGVjdF90IGNoYW5uZWxfc2VsZWN0OwotCSBib29sZWFuIGJ5cGFzc19tb2RlOwotIH0gYXVkaW9fc3RhdHVzX3Q7Cit0eXBlZGVmIHN0cnVjdCBhdWRpb19zdGF0dXMgeworCWJvb2xlYW4gQVZfc3luY19zdGF0ZTsKKwlib29sZWFuIG11dGVfc3RhdGU7CisJYXVkaW9fcGxheV9zdGF0ZV90IHBsYXlfc3RhdGU7CisJYXVkaW9fc3RyZWFtX3NvdXJjZV90IHN0cmVhbV9zb3VyY2U7CisJYXVkaW9fY2hhbm5lbF9zZWxlY3RfdCBjaGFubmVsX3NlbGVjdDsKKwlib29sZWFuIGJ5cGFzc19tb2RlOworCWF1ZGlvX21peGVyX3QgbWl4ZXJfc3RhdGU7Cit9IGF1ZGlvX3N0YXR1c190OwogPC9wcm9ncmFtbGlzdGluZz4KIAogPC9zZWN0aW9uPgotPHNlY3Rpb24gaWQ9InN0cnVjdF9hdWRpb19taXhlciI+Cis8c2VjdGlvbiBpZD0iYXVkaW8tbWl4ZXIiPgogPHRpdGxlPnN0cnVjdCBhdWRpb19taXhlcjwvdGl0bGU+CiA8cGFyYT5UaGUgZm9sbG93aW5nIHN0cnVjdHVyZSBpcyB1c2VkIGJ5IHRoZSBBVURJT19TRVRfTUlYRVIgY2FsbCB0byBzZXQgdGhlIGF1ZGlvCiB2b2x1bWUuCiA8L3BhcmE+CiA8cHJvZ3JhbWxpc3Rpbmc+Ci0gdHlwZWRlZiBzdHJ1Y3QgYXVkaW9fbWl4ZXIgewotCSB1bnNpZ25lZCBpbnQgdm9sdW1lX2xlZnQ7Ci0JIHVuc2lnbmVkIGludCB2b2x1bWVfcmlnaHQ7Ci0gfSBhdWRpb19taXhlcl90OwordHlwZWRlZiBzdHJ1Y3QgYXVkaW9fbWl4ZXIgeworCXVuc2lnbmVkIGludCB2b2x1bWVfbGVmdDsKKwl1bnNpZ25lZCBpbnQgdm9sdW1lX3JpZ2h0OworfSBhdWRpb19taXhlcl90OwogPC9wcm9ncmFtbGlzdGluZz4KIAogPC9zZWN0aW9uPgpAQCAtMTA5LDE3ICsxMTIsMTcgQEAKIDwvcHJvZ3JhbWxpc3Rpbmc+CiAKIDwvc2VjdGlvbj4KLTxzZWN0aW9uIGlkPSJzdHJ1Y3RfYXVkaW9fa2FyYW9rZSI+Cis8c2VjdGlvbiBpZD0iYXVkaW8ta2FyYW9rZSI+CiA8dGl0bGU+c3RydWN0IGF1ZGlvX2thcmFva2U8L3RpdGxlPgogPHBhcmE+VGhlIGlvY3RsIEFVRElPX1NFVF9LQVJBT0tFIHVzZXMgdGhlIGZvbGxvd2luZyBmb3JtYXQ6CiA8L3BhcmE+CiA8cHJvZ3JhbWxpc3Rpbmc+Ci0gdHlwZWRlZgotIHN0cnVjdCBhdWRpb19rYXJhb2tlewotCSBpbnQgdm9jYWwxOwotCSBpbnQgdm9jYWwyOwotCSBpbnQgbWVsb2R5OwotIH0gYXVkaW9fa2FyYW9rZV90OwordHlwZWRlZgorc3RydWN0IGF1ZGlvX2thcmFva2UgeworCWludCB2b2NhbDE7CisJaW50IHZvY2FsMjsKKwlpbnQgbWVsb2R5OworfSBhdWRpb19rYXJhb2tlX3Q7CiA8L3Byb2dyYW1saXN0aW5nPgogPHBhcmE+SWYgVm9jYWwxIG9yIFZvY2FsMiBhcmUgbm9uLXplcm8sIHRoZXkgZ2V0IG1peGVkIGludG8gbGVmdCBhbmQgcmlnaHQgdCBhdCA3MCUgZWFjaC4gSWYgYm90aCwKIFZvY2FsMSBhbmQgVm9jYWwyIGFyZSBub24temVybywgVm9jYWwxIGdldHMgbWl4ZWQgaW50byB0aGUgbGVmdCBjaGFubmVsIGFuZCBWb2NhbDIgaW50byB0aGUKQEAgLTEyOCw3ICsxMzEsNyBAQAogPC9wYXJhPgogCiA8L3NlY3Rpb24+Ci08c2VjdGlvbiBpZD0iYXVkaW9fYXR0cmlidXRlcyI+Cis8c2VjdGlvbiBpZD0iYXVkaW8tYXR0cmlidXRlcy10Ij4KIDx0aXRsZT5hdWRpbyBhdHRyaWJ1dGVzPC90aXRsZT4KIDxwYXJhPlRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBjYW4gYmUgc2V0IGJ5IGEgY2FsbCB0byBBVURJT19TRVRfQVRUUklCVVRFUzoKIDwvcGFyYT4KQEAgLTIxNyw4ICsyMjAsNyBAQAogPHBhcmE+KGJsb2NraW5nIG1vZGUgaXMgdGhlIGRlZmF1bHQpPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorPHBhcmE+UkVUVVJOIFZBTFVFPC9wYXJhPgogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+CiA8cGFyYT5FTk9ERVY8L3BhcmE+CkBAIC0yMjgsMTMgKzIzMCw2IEBACiA8L2VudHJ5PgogIDwvcm93Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgogPHBhcmE+RUJVU1k8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KQEAgLTI3Niw4ICsyNzEsNyBAQAogPHBhcmE+RmlsZSBkZXNjcmlwdG9yIHJldHVybmVkIGJ5IGEgcHJldmlvdXMgY2FsbCB0byBvcGVuKCkuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorPHBhcmE+UkVUVVJOIFZBTFVFPC9wYXJhPgogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+CiA8cGFyYT5FQkFERjwvcGFyYT4KQEAgLTMzMiw4ICszMjYsNyBAQAogPHBhcmE+U2l6ZSBvZiBidWYuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorPHBhcmE+UkVUVVJOIFZBTFVFPC9wYXJhPgogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+CiA8cGFyYT5FUEVSTTwvcGFyYT4KQEAgLTM1OCw3ICszNTEsNyBAQAogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IkFVRElPX1NUT1AiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+QVVESU9fU1RPUDwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtMzkxLDI1ICszODQsOSBAQAogPHBhcmE+RXF1YWxzIEFVRElPX1NUT1AgZm9yIHRoaXMgY29tbWFuZC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IkFVRElPX1BMQVkiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+QVVESU9fUExBWTwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtNDQzLDI1ICs0MjAsOSBAQAogPHBhcmE+RXF1YWxzIEFVRElPX1BMQVkgZm9yIHRoaXMgY29tbWFuZC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IkFVRElPX1BBVVNFIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPkFVRElPX1BBVVNFPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC01MDMsMjUgKzQ2NCw0OSBAQAogPHBhcmE+RXF1YWxzIEFVRElPX1BBVVNFIGZvciB0aGlzIGNvbW1hbmQuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUworJnJldHVybi12YWx1ZS1kdmI7CisKKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iQVVESU9fQ09OVElOVUUiCityb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+QVVESU9fQ09OVElOVUU8L3RpdGxlPgorPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Cis8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjEiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Cis8cGFyYT5UaGlzIGlvY3RsIHJlc3RhcnRzIHRoZSBkZWNvZGluZyBhbmQgcGxheWluZyBwcm9jZXNzIHByZXZpb3VzbHkgcGF1c2VkCit3aXRoIEFVRElPX1BBVVNFIGNvbW1hbmQuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IuPC9wYXJhPgorPHBhcmE+SXQgb25seSB3b3JrcyBpZiB0aGUgc3RyZWFtIHdlcmUgcHJldmlvdXNseSBzdG9wcGVkIHdpdGggQVVESU9fUEFVU0U8L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorPHBhcmE+U1lOT1BTSVMKKzwvcGFyYT4KKzxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMSI+PHRib2R5Pjxyb3c+PGVudHJ5CisgYWxpZ249ImNoYXIiPgorPHBhcmE+aW50IGlvY3RsKGludCBmZCwgaW50IHJlcXVlc3QgPSBBVURJT19DT05USU5VRSk7PC9wYXJhPgorPC9lbnRyeT4KKyA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKzxwYXJhPlBBUkFNRVRFUlMKKzwvcGFyYT4KKzxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5CisgYWxpZ249ImNoYXIiPgorPHBhcmE+aW50IGZkPC9wYXJhPgorPC9lbnRyeT48ZW50cnkKKyBhbGlnbj0iY2hhciI+Cis8cGFyYT5GaWxlIGRlc2NyaXB0b3IgcmV0dXJuZWQgYnkgYSBwcmV2aW91cyBjYWxsIHRvIG9wZW4oKS48L3BhcmE+Cis8L2VudHJ5PgorIDwvcm93Pjxyb3c+PGVudHJ5CisgYWxpZ249ImNoYXIiPgorPHBhcmE+aW50IHJlcXVlc3Q8L3BhcmE+Cis8L2VudHJ5PjxlbnRyeQorIGFsaWduPSJjaGFyIj4KKzxwYXJhPkVxdWFscyBBVURJT19DT05USU5VRSBmb3IgdGhpcyBjb21tYW5kLjwvcGFyYT4KKzwvZW50cnk+CisgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IkFVRElPX1NFTEVDVF9TT1VSQ0UiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+QVVESU9fU0VMRUNUX1NPVVJDRTwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtNTY3LDMyICs1NTIsOSBAQAogIHN0cmVhbS48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbGxlZ2FsIGlucHV0IHBhcmFtZXRlci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJBVURJT19TRVRfTVVURSIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5BVURJT19TRVRfTVVURTwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtNjQ2LDMyICs2MDgsOSBAQAogPHBhcmE+RkFMU0UgQXVkaW8gVW4tbXV0ZTwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5WQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPklsbGVnYWwgaW5wdXQgcGFyYW1ldGVyLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IkFVRElPX1NFVF9BVl9TWU5DIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPkFVRElPX1NFVF9BVl9TWU5DPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC03MjUsMzIgKzY2NCw5IEBACiA8cGFyYT5GQUxTRSBBVi1zeW5jIE9GRjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5WQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPklsbGVnYWwgaW5wdXQgcGFyYW1ldGVyLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IkFVRElPX1NFVF9CWVBBU1NfTU9ERSIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5BVURJT19TRVRfQllQQVNTX01PREU8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTgwOCwzMiArNzI0LDkgQEAKIDxwYXJhPkZBTFNFIEJ5cGFzcyBpcyBlbmFibGVkPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlZBTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SWxsZWdhbCBpbnB1dCBwYXJhbWV0ZXIuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iQVVESU9fQ0hBTk5FTF9TRUxFQ1QiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+QVVESU9fQ0hBTk5FTF9TRUxFQ1Q8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTg3NywzMiArNzcwLDkgQEAKICBzdGVyZW8pLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5WQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPklsbGVnYWwgaW5wdXQgcGFyYW1ldGVyIGNoLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IkFVRElPX0dFVF9TVEFUVVMiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+QVVESU9fR0VUX1NUQVRVUzwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtOTQ1LDMyICs4MTUsOSBAQAogPHBhcmE+UmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiBBdWRpbyBEZXZpY2UuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVGQVVMVDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+c3RhdHVzIHBvaW50cyB0byBpbnZhbGlkIGFkZHJlc3MuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iQVVESU9fR0VUX0NBUEFCSUxJVElFUyIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5BVURJT19HRVRfQ0FQQUJJTElUSUVTPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xMDEzLDMyICs4NjAsOSBAQAogPHBhcmE+UmV0dXJucyBhIGJpdCBhcnJheSBvZiBzdXBwb3J0ZWQgc291bmQgZm9ybWF0cy48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUZBVUxUPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5jYXAgcG9pbnRzIHRvIGFuIGludmFsaWQgYWRkcmVzcy48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJBVURJT19DTEVBUl9CVUZGRVIiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+QVVESU9fQ0xFQVJfQlVGRkVSPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xMDcyLDI1ICs4OTYsOSBAQAogPHBhcmE+RXF1YWxzIEFVRElPX0NMRUFSX0JVRkZFUiBmb3IgdGhpcyBjb21tYW5kLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IkFVRElPX1NFVF9JRCIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5BVURJT19TRVRfSUQ8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTExMzYsMzIgKzk0NCw5IEBACiA8cGFyYT5hdWRpbyBzdWItc3RyZWFtIGlkPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlZBTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW52YWxpZCBzdWItc3RyZWFtIGlkLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IkFVRElPX1NFVF9NSVhFUiIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5BVURJT19TRVRfTUlYRVI8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTEyMDIsMzIgKzk4Nyw5IEBACiA8cGFyYT5taXhlciBzZXR0aW5ncy48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUZBVUxUPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5taXggcG9pbnRzIHRvIGFuIGludmFsaWQgYWRkcmVzcy48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJBVURJT19TRVRfU1RSRUFNVFlQRSIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5BVURJT19TRVRfU1RSRUFNVFlQRTwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtMTI3MCwxNyArMTAzMiw5IEBACiA8cGFyYT5zdHJlYW0gdHlwZTwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3I8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgogPHBhcmE+RUlOVkFMPC9wYXJhPgogPC9lbnRyeT48ZW50cnkKICBhbGlnbj0iY2hhciI+CkBAIC0xMjg4LDcgKzEwNDIsNyBAQAogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IkFVRElPX1NFVF9FWFRfSUQiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+QVVESU9fU0VUX0VYVF9JRDwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtMTMzMCwxNyArMTA4NCw5IEBACiA8cGFyYT5hdWRpbyBzdWJfc3RyZWFtX2lkPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorJnJldHVybi12YWx1ZS1kdmI7CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+CiA8cGFyYT5FSU5WQUw8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KQEAgLTEzNDgsNyArMTA5NCw3IEBACiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iQVVESU9fU0VUX0FUVFJJQlVURVMiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+QVVESU9fU0VUX0FUVFJJQlVURVM8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTEzOTEsMTcgKzExMzcsOSBAQAogPHBhcmE+YXVkaW8gYXR0cmlidXRlcyBhY2NvcmRpbmcgdG8gc2VjdGlvbiA/PzwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3I8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgogPHBhcmE+RUlOVkFMPC9wYXJhPgogPC9lbnRyeT48ZW50cnkKICBhbGlnbj0iY2hhciI+CkBAIC0xNDA5LDcgKzExNDcsNyBAQAogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IkFVRElPX1NFVF9LQVJBT0tFIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPkFVRElPX1NFVF9LQVJBT0tFPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xNDIyLDcgKzExNjAsNyBAQAogPC9wYXJhPgogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIxIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5pbnQgaW9jdGwoZmQsIGludCByZXF1ZXN0ID0gQVVESU9fU0VUX1NUUkVBTVRZUEUsCis8cGFyYT5pbnQgaW9jdGwoZmQsIGludCByZXF1ZXN0ID0gQVVESU9fU0VUX0tBUkFPS0UsCiAgYXVkaW9fa2FyYW9rZV90ICYjeDIyQzY7a2FyYW9rZSk7PC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KQEAgLTE0NDAsNyArMTE3OCw3IEBACiA8cGFyYT5pbnQgcmVxdWVzdDwvcGFyYT4KIDwvZW50cnk+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RXF1YWxzIEFVRElPX1NFVF9TVFJFQU1UWVBFIGZvciB0aGlzCis8cGFyYT5FcXVhbHMgQVVESU9fU0VUX0tBUkFPS0UgZm9yIHRoaXMKICBjb21tYW5kLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PHJvdz48ZW50cnkKQEAgLTE0NTIsMTcgKzExOTAsOSBAQAogPHBhcmE+a2FyYW9rZSBzZXR0aW5ncyBhY2NvcmRpbmcgdG8gc2VjdGlvbiA/Py48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+CismcmV0dXJuLXZhbHVlLWR2YjsKIDxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVJTlZBTDwvcGFyYT4KIDwvZW50cnk+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9jYS54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2NhLnhtbApzaW1pbGFyaXR5IGluZGV4IDY3JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2NhLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9jYS54bWwKaW5kZXggYjFmMWQyZi4uNWM0YWRiNCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9jYS54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9jYS54bWwKQEAgLTgsNzUgKzgsODUgQEAKIDx0aXRsZT5DQSBEYXRhIFR5cGVzPC90aXRsZT4KIAogCi08c2VjdGlvbiBpZD0iY2Ffc2xvdF9pbmZvX3QiPgorPHNlY3Rpb24gaWQ9ImNhLXNsb3QtaW5mbyI+CiA8dGl0bGU+Y2Ffc2xvdF9pbmZvX3Q8L3RpdGxlPgogIDxwcm9ncmFtbGlzdGluZz4KLSAvJiN4MjJDNjsgc2xvdCBpbnRlcmZhY2UgdHlwZXMgYW5kIGluZm8gJiN4MjJDNjsvCit0eXBlZGVmIHN0cnVjdCBjYV9zbG90X2luZm8geworCWludCBudW07ICAgICAgICAgICAgICAgLyYjeDIyQzY7IHNsb3QgbnVtYmVyICYjeDIyQzY7LwogCi0gdHlwZWRlZiBzdHJ1Y3QgY2Ffc2xvdF9pbmZvX3MgewotCSBpbnQgbnVtOyAgICAgICAgICAgICAgIC8mI3gyMkM2OyBzbG90IG51bWJlciAmI3gyMkM2Oy8KKwlpbnQgdHlwZTsgICAgICAgICAgICAgIC8mI3gyMkM2OyBDQSBpbnRlcmZhY2UgdGhpcyBzbG90IHN1cHBvcnRzICYjeDIyQzY7LworI2RlZmluZSBDQV9DSSAgICAgICAgICAgIDEgICAgIC8mI3gyMkM2OyBDSSBoaWdoIGxldmVsIGludGVyZmFjZSAmI3gyMkM2Oy8KKyNkZWZpbmUgQ0FfQ0lfTElOSyAgICAgICAyICAgICAvJiN4MjJDNjsgQ0kgbGluayBsYXllciBsZXZlbCBpbnRlcmZhY2UgJiN4MjJDNjsvCisjZGVmaW5lIENBX0NJX1BIWVMgICAgICAgNCAgICAgLyYjeDIyQzY7IENJIHBoeXNpY2FsIGxheWVyIGxldmVsIGludGVyZmFjZSAmI3gyMkM2Oy8KKyNkZWZpbmUgQ0FfREVTQ1IgICAgICAgICA4ICAgICAvJiN4MjJDNjsgYnVpbHQtaW4gZGVzY3JhbWJsZXIgJiN4MjJDNjsvCisjZGVmaW5lIENBX1NDICAgICAgICAgIDEyOCAgICAgLyYjeDIyQzY7IHNpbXBsZSBzbWFydCBjYXJkIGludGVyZmFjZSAmI3gyMkM2Oy8KIAotCSBpbnQgdHlwZTsgICAgICAgICAgIC8mI3gyMkM2OyBDQSBpbnRlcmZhY2UgdGhpcyBzbG90IHN1cHBvcnRzICYjeDIyQzY7LwotICNkZWZpbmUgQ0FfQ0kgICAgICAgICAgICAxICAvJiN4MjJDNjsgQ0kgaGlnaCBsZXZlbCBpbnRlcmZhY2UgJiN4MjJDNjsvCi0gI2RlZmluZSBDQV9DSV9MSU5LICAgICAgIDIgIC8mI3gyMkM2OyBDSSBsaW5rIGxheWVyIGxldmVsIGludGVyZmFjZSAmI3gyMkM2Oy8KLSAjZGVmaW5lIENBX0NJX1BIWVMgICAgICAgNCAgLyYjeDIyQzY7IENJIHBoeXNpY2FsIGxheWVyIGxldmVsIGludGVyZmFjZSAmI3gyMkM2Oy8KLSAjZGVmaW5lIENBX1NDICAgICAgICAgIDEyOCAgLyYjeDIyQzY7IHNpbXBsZSBzbWFydCBjYXJkIGludGVyZmFjZSAmI3gyMkM2Oy8KLQotCSB1bnNpZ25lZCBpbnQgZmxhZ3M7Ci0gI2RlZmluZSBDQV9DSV9NT0RVTEVfUFJFU0VOVCAxIC8mI3gyMkM2OyBtb2R1bGUgKG9yIGNhcmQpIGluc2VydGVkICYjeDIyQzY7LwotICNkZWZpbmUgQ0FfQ0lfTU9EVUxFX1JFQURZICAgMgotIH0gY2Ffc2xvdF9pbmZvX3Q7CisJdW5zaWduZWQgaW50IGZsYWdzOworI2RlZmluZSBDQV9DSV9NT0RVTEVfUFJFU0VOVCAxIC8mI3gyMkM2OyBtb2R1bGUgKG9yIGNhcmQpIGluc2VydGVkICYjeDIyQzY7LworI2RlZmluZSBDQV9DSV9NT0RVTEVfUkVBRFkgICAyCit9IGNhX3Nsb3RfaW5mb190OwogPC9wcm9ncmFtbGlzdGluZz4KIAogPC9zZWN0aW9uPgotPHNlY3Rpb24gaWQ9ImNhX2Rlc2NyX2luZm9fdCI+Cis8c2VjdGlvbiBpZD0iY2EtZGVzY3ItaW5mbyI+CiA8dGl0bGU+Y2FfZGVzY3JfaW5mb190PC90aXRsZT4KLSA8cHJvZ3JhbWxpc3Rpbmc+Ci0gdHlwZWRlZiBzdHJ1Y3QgY2FfZGVzY3JfaW5mb19zIHsKLQkgdW5zaWduZWQgaW50IG51bTsgIC8mI3gyMkM2OyBudW1iZXIgb2YgYXZhaWxhYmxlIGRlc2NyYW1ibGVycyAoa2V5cykgJiN4MjJDNjsvCi0JIHVuc2lnbmVkIGludCB0eXBlOyAvJiN4MjJDNjsgdHlwZSBvZiBzdXBwb3J0ZWQgc2NyYW1ibGluZyBzeXN0ZW0gJiN4MjJDNjsvCi0gI2RlZmluZSBDQV9FQ0QgICAgICAgICAgIDEKLSAjZGVmaW5lIENBX05EUyAgICAgICAgICAgMgotICNkZWZpbmUgQ0FfRFNTICAgICAgICAgICA0Ci0gfSBjYV9kZXNjcl9pbmZvX3Q7Cis8cHJvZ3JhbWxpc3Rpbmc+Cit0eXBlZGVmIHN0cnVjdCBjYV9kZXNjcl9pbmZvIHsKKwl1bnNpZ25lZCBpbnQgbnVtOyAgLyYjeDIyQzY7IG51bWJlciBvZiBhdmFpbGFibGUgZGVzY3JhbWJsZXJzIChrZXlzKSAmI3gyMkM2Oy8KKwl1bnNpZ25lZCBpbnQgdHlwZTsgLyYjeDIyQzY7IHR5cGUgb2Ygc3VwcG9ydGVkIHNjcmFtYmxpbmcgc3lzdGVtICYjeDIyQzY7LworI2RlZmluZSBDQV9FQ0QgICAgICAgICAgIDEKKyNkZWZpbmUgQ0FfTkRTICAgICAgICAgICAyCisjZGVmaW5lIENBX0RTUyAgICAgICAgICAgNAorfSBjYV9kZXNjcl9pbmZvX3Q7CiA8L3Byb2dyYW1saXN0aW5nPgogCiA8L3NlY3Rpb24+Ci08c2VjdGlvbiBpZD0iY2FfY2FwX3QiPgotPHRpdGxlPmNhX2NhcF90PC90aXRsZT4KLSA8cHJvZ3JhbWxpc3Rpbmc+Ci0gdHlwZWRlZiBzdHJ1Y3QgY2FfY2FwX3MgewotCSB1bnNpZ25lZCBpbnQgc2xvdF9udW07ICAvJiN4MjJDNjsgdG90YWwgbnVtYmVyIG9mIENBIGNhcmQgYW5kIG1vZHVsZSBzbG90cyAmI3gyMkM2Oy8KLQkgdW5zaWduZWQgaW50IHNsb3RfdHlwZTsgLyYjeDIyQzY7IE9SIG9mIGFsbCBzdXBwb3J0ZWQgdHlwZXMgJiN4MjJDNjsvCi0JIHVuc2lnbmVkIGludCBkZXNjcl9udW07IC8mI3gyMkM2OyB0b3RhbCBudW1iZXIgb2YgZGVzY3JhbWJsZXIgc2xvdHMgKGtleXMpICYjeDIyQzY7LwotCSB1bnNpZ25lZCBpbnQgZGVzY3JfdHlwZTsvJiN4MjJDNjsgT1Igb2YgYWxsIHN1cHBvcnRlZCB0eXBlcyAmI3gyMkM2Oy8KKzxzZWN0aW9uIGlkPSJjYS1jYXBzIj4KKzx0aXRsZT5jYV9jYXBzX3Q8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgordHlwZWRlZiBzdHJ1Y3QgY2FfY2FwcyB7CisJdW5zaWduZWQgaW50IHNsb3RfbnVtOyAgLyYjeDIyQzY7IHRvdGFsIG51bWJlciBvZiBDQSBjYXJkIGFuZCBtb2R1bGUgc2xvdHMgJiN4MjJDNjsvCisJdW5zaWduZWQgaW50IHNsb3RfdHlwZTsgLyYjeDIyQzY7IE9SIG9mIGFsbCBzdXBwb3J0ZWQgdHlwZXMgJiN4MjJDNjsvCisJdW5zaWduZWQgaW50IGRlc2NyX251bTsgLyYjeDIyQzY7IHRvdGFsIG51bWJlciBvZiBkZXNjcmFtYmxlciBzbG90cyAoa2V5cykgJiN4MjJDNjsvCisJdW5zaWduZWQgaW50IGRlc2NyX3R5cGU7LyYjeDIyQzY7IE9SIG9mIGFsbCBzdXBwb3J0ZWQgdHlwZXMgJiN4MjJDNjsvCiAgfSBjYV9jYXBfdDsKIDwvcHJvZ3JhbWxpc3Rpbmc+CiAKIDwvc2VjdGlvbj4KLTxzZWN0aW9uIGlkPSJjYV9tc2dfdCI+Cis8c2VjdGlvbiBpZD0iY2EtbXNnIj4KIDx0aXRsZT5jYV9tc2dfdDwvdGl0bGU+Ci0gPHByb2dyYW1saXN0aW5nPgotIC8mI3gyMkM2OyBhIG1lc3NhZ2UgdG8vZnJvbSBhIENJLUNBTSAmI3gyMkM2Oy8KLSB0eXBlZGVmIHN0cnVjdCBjYV9tc2dfcyB7Ci0JIHVuc2lnbmVkIGludCBpbmRleDsKLQkgdW5zaWduZWQgaW50IHR5cGU7Ci0JIHVuc2lnbmVkIGludCBsZW5ndGg7Ci0JIHVuc2lnbmVkIGNoYXIgbXNnWzI1Nl07Ci0gfSBjYV9tc2dfdDsKKzxwcm9ncmFtbGlzdGluZz4KKy8mI3gyMkM2OyBhIG1lc3NhZ2UgdG8vZnJvbSBhIENJLUNBTSAmI3gyMkM2Oy8KK3R5cGVkZWYgc3RydWN0IGNhX21zZyB7CisJdW5zaWduZWQgaW50IGluZGV4OworCXVuc2lnbmVkIGludCB0eXBlOworCXVuc2lnbmVkIGludCBsZW5ndGg7CisJdW5zaWduZWQgY2hhciBtc2dbMjU2XTsKK30gY2FfbXNnX3Q7CiA8L3Byb2dyYW1saXN0aW5nPgogCiA8L3NlY3Rpb24+Ci08c2VjdGlvbiBpZD0iY2FfZGVzY3JfdCI+Cis8c2VjdGlvbiBpZD0iY2EtZGVzY3IiPgogPHRpdGxlPmNhX2Rlc2NyX3Q8L3RpdGxlPgotIDxwcm9ncmFtbGlzdGluZz4KLSB0eXBlZGVmIHN0cnVjdCBjYV9kZXNjcl9zIHsKLQkgdW5zaWduZWQgaW50IGluZGV4OwotCSB1bnNpZ25lZCBpbnQgcGFyaXR5OwotCSB1bnNpZ25lZCBjaGFyIGN3WzhdOwotIH0gY2FfZGVzY3JfdDsKKzxwcm9ncmFtbGlzdGluZz4KK3R5cGVkZWYgc3RydWN0IGNhX2Rlc2NyIHsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisJdW5zaWduZWQgaW50IHBhcml0eTsKKwl1bnNpZ25lZCBjaGFyIGN3WzhdOworfSBjYV9kZXNjcl90OwogPC9wcm9ncmFtbGlzdGluZz4KLSA8L3NlY3Rpb24+PC9zZWN0aW9uPgorPC9zZWN0aW9uPgorCis8c2VjdGlvbiBpZD0iY2EtcGlkIj4KKzx0aXRsZT5jYS1waWQ8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgordHlwZWRlZiBzdHJ1Y3QgY2FfcGlkIHsKKwl1bnNpZ25lZCBpbnQgcGlkOworCWludCBpbmRleDsJCS8mI3gyMkM2OyAtMSA9PSBkaXNhYmxlJiN4MjJDNjsvCit9IGNhX3BpZF90OworPC9wcm9ncmFtbGlzdGluZz4KKzwvc2VjdGlvbj48L3NlY3Rpb24+CisKIDxzZWN0aW9uIGlkPSJjYV9mdW5jdGlvbl9jYWxscyI+CiA8dGl0bGU+Q0EgRnVuY3Rpb24gQ2FsbHM8L3RpdGxlPgogCkBAIC0xNDgsOCArMTU4LDcgQEAKIDxwYXJhPihibG9ja2luZyBtb2RlIGlzIHRoZSBkZWZhdWx0KTwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KKzxwYXJhPlJFVFVSTiBWQUxVRTwvcGFyYT4KIDxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgogPHBhcmE+RU5PREVWPC9wYXJhPgpAQCAtMjA3LDggKzIxNiw3IEBACiA8cGFyYT5GaWxlIGRlc2NyaXB0b3IgcmV0dXJuZWQgYnkgYSBwcmV2aW91cyBjYWxsIHRvIG9wZW4oKS48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Cis8cGFyYT5SRVRVUk4gVkFMVUU8L3BhcmE+CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVCQURGPC9wYXJhPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9kZW11eC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2RlbXV4LnhtbApzaW1pbGFyaXR5IGluZGV4IDg0JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2RlbXV4LnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9kZW11eC54bWwKaW5kZXggMWI4YzRlOS4uMzdjMTc5MCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9kZW11eC54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9kZW11eC54bWwKQEAgLTcsMTUgKzcsMTkgQEAKIDxzZWN0aW9uIGlkPSJkbXhfdHlwZXMiPgogPHRpdGxlPkRlbXV4IERhdGEgVHlwZXM8L3RpdGxlPgogCi08c2VjdGlvbiBpZD0iZG14X291dHB1dF90Ij4KKzxzZWN0aW9uIGlkPSJkbXgtb3V0cHV0LXQiPgogPHRpdGxlPmRteF9vdXRwdXRfdDwvdGl0bGU+Ci0gPHByb2dyYW1saXN0aW5nPgotIHR5cGVkZWYgZW51bQotIHsKLQkgRE1YX09VVF9ERUNPREVSLAotCSBETVhfT1VUX1RBUCwKLQkgRE1YX09VVF9UU19UQVAKLSB9IGRteF9vdXRwdXRfdDsKKzxwcm9ncmFtbGlzdGluZz4KK3R5cGVkZWYgZW51bQoreworCURNWF9PVVRfREVDT0RFUiwgLyYjeDIyQzY7IFN0cmVhbWluZyBkaXJlY3RseSB0byBkZWNvZGVyLiAmI3gyMkM2Oy8KKwlETVhfT1VUX1RBUCwgICAgIC8mI3gyMkM2OyBPdXRwdXQgZ29pbmcgdG8gYSBtZW1vcnkgYnVmZmVyICYjeDIyQzY7LworCQkJIC8mI3gyMkM2OyAodG8gYmUgcmV0cmlldmVkIHZpYSB0aGUgcmVhZCBjb21tYW5kKS4mI3gyMkM2Oy8KKwlETVhfT1VUX1RTX1RBUCwgIC8mI3gyMkM2OyBPdXRwdXQgbXVsdGlwbGV4ZWQgaW50byBhIG5ldyBUUyAgJiN4MjJDNjsvCisJCQkgLyYjeDIyQzY7ICh0byBiZSByZXRyaWV2ZWQgYnkgcmVhZGluZyBmcm9tIHRoZSAmI3gyMkM2Oy8KKwkJCSAvJiN4MjJDNjsgbG9naWNhbCBEVlIgZGV2aWNlKS4gICAgICAgICAgICAgICAgICYjeDIyQzY7LworCURNWF9PVVRfVFNERU1VWF9UQVAgLyYjeDIyQzY7IExpa2UgVFNfVEFQIGJ1dCByZXRyaWV2ZWQgZnJvbSB0aGUgRE1YIGRldmljZSAmI3gyMkM2Oy8KK30gZG14X291dHB1dF90OwogPC9wcm9ncmFtbGlzdGluZz4KIDxwYXJhPjxlbXBoYXNpcyByb2xlPSJ0dCI+RE1YX09VVF9UQVA8L2VtcGhhc2lzPiBkZWxpdmVycyB0aGUgc3RyZWFtIG91dHB1dCB0byB0aGUgZGVtdXggZGV2aWNlIG9uIHdoaWNoIHRoZSBpb2N0bCBpcwogY2FsbGVkLgpAQCAtMjYsOTYgKzMwLDk1IEBACiA8L3BhcmE+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJkbXhfaW5wdXRfdCI+Cis8c2VjdGlvbiBpZD0iZG14LWlucHV0LXQiPgogPHRpdGxlPmRteF9pbnB1dF90PC90aXRsZT4KLSA8cHJvZ3JhbWxpc3Rpbmc+Ci0gdHlwZWRlZiBlbnVtCi0gewotCSBETVhfSU5fRlJPTlRFTkQsCi0JIERNWF9JTl9EVlIKLSB9IGRteF9pbnB1dF90OworPHByb2dyYW1saXN0aW5nPgordHlwZWRlZiBlbnVtCit7CisJRE1YX0lOX0ZST05URU5ELCAvJiN4MjJDNjsgSW5wdXQgZnJvbSBhIGZyb250LWVuZCBkZXZpY2UuICAmI3gyMkM2Oy8KKwlETVhfSU5fRFZSICAgICAgIC8mI3gyMkM2OyBJbnB1dCBmcm9tIHRoZSBsb2dpY2FsIERWUiBkZXZpY2UuICAmI3gyMkM2Oy8KK30gZG14X2lucHV0X3Q7CiA8L3Byb2dyYW1saXN0aW5nPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0iZG14X3Blc190eXBlX3QiPgorPHNlY3Rpb24gaWQ9ImRteC1wZXMtdHlwZS10Ij4KIDx0aXRsZT5kbXhfcGVzX3R5cGVfdDwvdGl0bGU+Ci0gPHByb2dyYW1saXN0aW5nPgotIHR5cGVkZWYgZW51bQotIHsKLQkgRE1YX1BFU19BVURJTywKLQkgRE1YX1BFU19WSURFTywKLQkgRE1YX1BFU19URUxFVEVYVCwKLQkgRE1YX1BFU19TVUJUSVRMRSwKLQkgRE1YX1BFU19QQ1IsCi0JIERNWF9QRVNfT1RIRVIKLSB9IGRteF9wZXNfdHlwZV90OworPHByb2dyYW1saXN0aW5nPgordHlwZWRlZiBlbnVtCit7CisJRE1YX1BFU19BVURJTzAsCisJRE1YX1BFU19WSURFTzAsCisJRE1YX1BFU19URUxFVEVYVDAsCisJRE1YX1BFU19TVUJUSVRMRTAsCisJRE1YX1BFU19QQ1IwLAorCisJRE1YX1BFU19BVURJTzEsCisJRE1YX1BFU19WSURFTzEsCisJRE1YX1BFU19URUxFVEVYVDEsCisJRE1YX1BFU19TVUJUSVRMRTEsCisJRE1YX1BFU19QQ1IxLAorCisJRE1YX1BFU19BVURJTzIsCisJRE1YX1BFU19WSURFTzIsCisJRE1YX1BFU19URUxFVEVYVDIsCisJRE1YX1BFU19TVUJUSVRMRTIsCisJRE1YX1BFU19QQ1IyLAorCisJRE1YX1BFU19BVURJTzMsCisJRE1YX1BFU19WSURFTzMsCisJRE1YX1BFU19URUxFVEVYVDMsCisJRE1YX1BFU19TVUJUSVRMRTMsCisJRE1YX1BFU19QQ1IzLAorCisJRE1YX1BFU19PVEhFUgorfSBkbXhfcGVzX3R5cGVfdDsKIDwvcHJvZ3JhbWxpc3Rpbmc+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJkbXhfZXZlbnRfdCI+Ci08dGl0bGU+ZG14X2V2ZW50X3Q8L3RpdGxlPgotIDxwcm9ncmFtbGlzdGluZz4KLSB0eXBlZGVmIGVudW0KLSB7Ci0JIERNWF9TQ1JBTUJMSU5HX0VWLAotCSBETVhfRlJPTlRFTkRfRVYKLSB9IGRteF9ldmVudF90OwotPC9wcm9ncmFtbGlzdGluZz4KLTwvc2VjdGlvbj4KLQotPHNlY3Rpb24gaWQ9ImRteF9zY3JhbWJsaW5nX3N0YXR1c190Ij4KLTx0aXRsZT5kbXhfc2NyYW1ibGluZ19zdGF0dXNfdDwvdGl0bGU+Ci0gPHByb2dyYW1saXN0aW5nPgotIHR5cGVkZWYgZW51bQotIHsKLQkgRE1YX1NDUkFNQkxJTkdfT0ZGLAotCSBETVhfU0NSQU1CTElOR19PTgotIH0gZG14X3NjcmFtYmxpbmdfc3RhdHVzX3Q7Ci08L3Byb2dyYW1saXN0aW5nPgotPC9zZWN0aW9uPgotCi08c2VjdGlvbiBpZD0iZG14X2ZpbHRlciI+Cis8c2VjdGlvbiBpZD0iZG14LWZpbHRlciI+CiA8dGl0bGU+c3RydWN0IGRteF9maWx0ZXI8L3RpdGxlPgogIDxwcm9ncmFtbGlzdGluZz4KICB0eXBlZGVmIHN0cnVjdCBkbXhfZmlsdGVyCi0gewotCSB1aW50OF90ICAgICAgICAgZmlsdGVyW0RNWF9GSUxURVJfU0laRV07Ci0JIHVpbnQ4X3QgICAgICAgICBtYXNrW0RNWF9GSUxURVJfU0laRV07Ci0gfSBkbXhfZmlsdGVyX3Q7Cit7CisJX191OCAgZmlsdGVyW0RNWF9GSUxURVJfU0laRV07CisJX191OCAgbWFza1tETVhfRklMVEVSX1NJWkVdOworCV9fdTggIG1vZGVbRE1YX0ZJTFRFUl9TSVpFXTsKK30gZG14X2ZpbHRlcl90OwogPC9wcm9ncmFtbGlzdGluZz4KIDwvc2VjdGlvbj4KIAotPHNlY3Rpb24gaWQ9ImRteF9zY3RfZmlsdGVyX3BhcmFtcyI+Cis8c2VjdGlvbiBpZD0iZG14LXNjdC1maWx0ZXItcGFyYW1zIj4KIDx0aXRsZT5zdHJ1Y3QgZG14X3NjdF9maWx0ZXJfcGFyYW1zPC90aXRsZT4KLSA8cHJvZ3JhbWxpc3Rpbmc+Ci0gc3RydWN0IGRteF9zY3RfZmlsdGVyX3BhcmFtcwotIHsKLQkgdWludDE2X3QgICAgICAgICAgICBwaWQ7Ci0JIGRteF9maWx0ZXJfdCAgICAgICAgZmlsdGVyOwotCSB1aW50MzJfdCAgICAgICAgICAgIHRpbWVvdXQ7Ci0JIHVpbnQzMl90ICAgICAgICAgICAgZmxhZ3M7Ci0gI2RlZmluZSBETVhfQ0hFQ0tfQ1JDICAgICAgIDEKLSAjZGVmaW5lIERNWF9PTkVTSE9UICAgICAgICAgMgotICNkZWZpbmUgRE1YX0lNTUVESUFURV9TVEFSVCA0Ci0gfTsKKzxwcm9ncmFtbGlzdGluZz4KK3N0cnVjdCBkbXhfc2N0X2ZpbHRlcl9wYXJhbXMKK3sKKwlfX3UxNiAgICAgICAgICBwaWQ7CisJZG14X2ZpbHRlcl90ICAgZmlsdGVyOworCV9fdTMyICAgICAgICAgIHRpbWVvdXQ7CisJX191MzIgICAgICAgICAgZmxhZ3M7CisjZGVmaW5lIERNWF9DSEVDS19DUkMgICAgICAgMQorI2RlZmluZSBETVhfT05FU0hPVCAgICAgICAgIDIKKyNkZWZpbmUgRE1YX0lNTUVESUFURV9TVEFSVCA0CisjZGVmaW5lIERNWF9LRVJORUxfQ0xJRU5UICAgMHg4MDAwCit9OwogPC9wcm9ncmFtbGlzdGluZz4KIDwvc2VjdGlvbj4KIAotPHNlY3Rpb24gaWQ9ImRteF9wZXNfZmlsdGVyX3BhcmFtcyI+Cis8c2VjdGlvbiBpZD0iZG14LXBlcy1maWx0ZXItcGFyYW1zIj4KIDx0aXRsZT5zdHJ1Y3QgZG14X3Blc19maWx0ZXJfcGFyYW1zPC90aXRsZT4KLSA8cHJvZ3JhbWxpc3Rpbmc+Ci0gc3RydWN0IGRteF9wZXNfZmlsdGVyX3BhcmFtcwotIHsKLQkgdWludDE2X3QgICAgICAgICAgICBwaWQ7Ci0JIGRteF9pbnB1dF90ICAgICAgICAgaW5wdXQ7Ci0JIGRteF9vdXRwdXRfdCAgICAgICAgb3V0cHV0OwotCSBkbXhfcGVzX3R5cGVfdCAgICAgIHBlc190eXBlOwotCSB1aW50MzJfdCAgICAgICAgICAgIGZsYWdzOwotIH07Cis8cHJvZ3JhbWxpc3Rpbmc+CitzdHJ1Y3QgZG14X3Blc19maWx0ZXJfcGFyYW1zCit7CisJX191MTYgICAgICAgICAgcGlkOworCWRteF9pbnB1dF90ICAgIGlucHV0OworCWRteF9vdXRwdXRfdCAgIG91dHB1dDsKKwlkbXhfcGVzX3R5cGVfdCBwZXNfdHlwZTsKKwlfX3UzMiAgICAgICAgICBmbGFnczsKK307CiA8L3Byb2dyYW1saXN0aW5nPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0iZG14X2V2ZW50Ij4KKzxzZWN0aW9uIGlkPSJkbXgtZXZlbnQiPgogPHRpdGxlPnN0cnVjdCBkbXhfZXZlbnQ8L3RpdGxlPgogIDxwcm9ncmFtbGlzdGluZz4KICBzdHJ1Y3QgZG14X2V2ZW50CkBAIC0xMzAsMTkgKzEzMyw0NCBAQAogPC9wcm9ncmFtbGlzdGluZz4KIDwvc2VjdGlvbj4KIAotPHNlY3Rpb24gaWQ9ImRteF9zdGMiPgorPHNlY3Rpb24gaWQ9ImRteC1zdGMiPgogPHRpdGxlPnN0cnVjdCBkbXhfc3RjPC90aXRsZT4KLSA8cHJvZ3JhbWxpc3Rpbmc+Ci0gc3RydWN0IGRteF9zdGMgewotCSB1bnNpZ25lZCBpbnQgbnVtOyAgICAgICAvJiN4MjJDNjsgaW5wdXQgOiB3aGljaCBTVEM/IDAuLk4gJiN4MjJDNjsvCi0JIHVuc2lnbmVkIGludCBiYXNlOyAgICAgIC8mI3gyMkM2OyBvdXRwdXQ6IGRpdmlzb3IgZm9yIHN0YyB0byBnZXQgOTAga0h6IGNsb2NrICYjeDIyQzY7LwotCSB1aW50NjRfdCBzdGM7ICAgICAgICAgICAvJiN4MjJDNjsgb3V0cHV0OiBzdGMgaW4gJ2Jhc2UnJiN4MjJDNjs5MCBrSHogdW5pdHMgJiN4MjJDNjsvCi0gfTsKKzxwcm9ncmFtbGlzdGluZz4KK3N0cnVjdCBkbXhfc3RjIHsKKwl1bnNpZ25lZCBpbnQgbnVtOwkvJiN4MjJDNjsgaW5wdXQgOiB3aGljaCBTVEM/IDAuLk4gJiN4MjJDNjsvCisJdW5zaWduZWQgaW50IGJhc2U7CS8mI3gyMkM2OyBvdXRwdXQ6IGRpdmlzb3IgZm9yIHN0YyB0byBnZXQgOTAga0h6IGNsb2NrICYjeDIyQzY7LworCV9fdTY0IHN0YzsJCS8mI3gyMkM2OyBvdXRwdXQ6IHN0YyBpbiAnYmFzZScmI3gyMkM2OzkwIGtIeiB1bml0cyAmI3gyMkM2Oy8KK307CiA8L3Byb2dyYW1saXN0aW5nPgotIDwvc2VjdGlvbj4KLQogPC9zZWN0aW9uPgogCis8c2VjdGlvbiBpZD0iZG14LWNhcHMiPgorPHRpdGxlPnN0cnVjdCBkbXhfY2FwczwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CisgdHlwZWRlZiBzdHJ1Y3QgZG14X2NhcHMgeworCV9fdTMyIGNhcHM7CisJaW50IG51bV9kZWNvZGVyczsKK30gZG14X2NhcHNfdDsKKzwvcHJvZ3JhbWxpc3Rpbmc+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIGlkPSJkbXgtc291cmNlLXQiPgorPHRpdGxlPmVudW0gZG14X3NvdXJjZV90PC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK3R5cGVkZWYgZW51bSB7CisJRE1YX1NPVVJDRV9GUk9OVDAgPSAwLAorCURNWF9TT1VSQ0VfRlJPTlQxLAorCURNWF9TT1VSQ0VfRlJPTlQyLAorCURNWF9TT1VSQ0VfRlJPTlQzLAorCURNWF9TT1VSQ0VfRFZSMCAgID0gMTYsCisJRE1YX1NPVVJDRV9EVlIxLAorCURNWF9TT1VSQ0VfRFZSMiwKKwlETVhfU09VUkNFX0RWUjMKK30gZG14X3NvdXJjZV90OworPC9wcm9ncmFtbGlzdGluZz4KKzwvc2VjdGlvbj4KKworPC9zZWN0aW9uPgogPHNlY3Rpb24gaWQ9ImRteF9mY2FsbHMiPgogPHRpdGxlPkRlbXV4IEZ1bmN0aW9uIENhbGxzPC90aXRsZT4KIApAQCAtMjExLDggKzIzOSw3IEBACiA8cGFyYT4oYmxvY2tpbmcgbW9kZSBpcyB0aGUgZGVmYXVsdCk8L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Cis8cGFyYT5SRVRVUk4gVkFMVUU8L3BhcmE+CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVOT0RFVjwvcGFyYT4KQEAgLTI3MSw4ICsyOTgsNyBAQAogPHBhcmE+RmlsZSBkZXNjcmlwdG9yIHJldHVybmVkIGJ5IGEgcHJldmlvdXMgY2FsbCB0byBvcGVuKCkuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorPHBhcmE+UkVUVVJOIFZBTFVFPC9wYXJhPgogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+CiA8cGFyYT5FQkFERjwvcGFyYT4KQEAgLTM1Myw4ICszNzksNyBAQAogPHBhcmE+U2l6ZSBvZiBidWYuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorPHBhcmE+UkVUVVJOIFZBTFVFPC9wYXJhPgogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+CiA8cGFyYT5FV09VTERCTE9DSzwvcGFyYT4KQEAgLTQ1Nyw4ICs0ODIsNyBAQAogPHBhcmE+U2l6ZSBvZiBidWYuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorPHBhcmE+UkVUVVJOIFZBTFVFPC9wYXJhPgogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+CiA8cGFyYT5FV09VTERCTE9DSzwvcGFyYT4KQEAgLTQ5MSw3ICs1MTUsNyBAQAogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0iZG14X3N0YXJ0Ij4KKzxzZWN0aW9uIGlkPSJETVhfU1RBUlQiPgogPHRpdGxlPkRNWF9TVEFSVDwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtNTI1LDE3ICs1NDksOSBAQAogPHBhcmE+RXF1YWxzIERNWF9TVEFSVCBmb3IgdGhpcyBjb21tYW5kLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+CiA8cGFyYT5FSU5WQUw8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KQEAgLTU1Niw3ICs1NzIsNyBAQAogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0iZG14X3N0b3AiPgorPHNlY3Rpb24gaWQ9IkRNWF9TVE9QIj4KIDx0aXRsZT5ETVhfU1RPUDwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtNTkxLDE5ICs2MDcsMTAgQEAKIDxwYXJhPkVxdWFscyBETVhfU1RPUCBmb3IgdGhpcyBjb21tYW5kLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJkbXhfc2V0X2ZpbHRlciI+Cis8c2VjdGlvbiBpZD0iRE1YX1NFVF9GSUxURVIiPgogPHRpdGxlPkRNWF9TRVRfRklMVEVSPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC02NTQsMjYgKzY2MSwxMCBAQAogPHBhcmE+UG9pbnRlciB0byBzdHJ1Y3R1cmUgY29udGFpbmluZyBmaWx0ZXIgcGFyYW1ldGVycy48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlZBTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW52YWxpZCBhcmd1bWVudC48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJkbXhfc2V0X3Blc19maWx0ZXIiPgorPHNlY3Rpb24gaWQ9IkRNWF9TRVRfUEVTX0ZJTFRFUiI+CiA8dGl0bGU+RE1YX1NFVF9QRVNfRklMVEVSPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC03MjcsMjQgKzcxOCw5IEBACiA8cGFyYT5Qb2ludGVyIHRvIHN0cnVjdHVyZSBjb250YWluaW5nIGZpbHRlciBwYXJhbWV0ZXJzLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5WQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludmFsaWQgYXJndW1lbnQuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVCVVNZPC9wYXJhPgogPC9lbnRyeT48ZW50cnkKICBhbGlnbj0iY2hhciI+CkBAIC03NTYsNyArNzMyLDcgQEAKICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIDwvc2VjdGlvbj4KIAotPHNlY3Rpb24gaWQ9ImRtc19zZXRfYnVmZmVyX3NpemUiPgorPHNlY3Rpb24gaWQ9IkRNWF9TRVRfQlVGRkVSX1NJWkUiPgogPHRpdGxlPkRNWF9TRVRfQlVGRkVSX1NJWkU8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTc5OSwyNyArNzc1LDEwIEBACiA8cGFyYT5TaXplIG9mIGNpcmN1bGFyIGJ1ZmZlci48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVOT01FTTwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+VGhlIGRyaXZlciB3YXMgbm90IGFibGUgdG8gYWxsb2NhdGUgYSBidWZmZXIgb2YgdGhlCi0gcmVxdWVzdGVkIHNpemUuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0iZG14X2dldF9ldmVudCI+Cis8c2VjdGlvbiBpZD0iRE1YX0dFVF9FVkVOVCI+CiA8dGl0bGU+RE1YX0dFVF9FVkVOVDwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtODcyLDI0ICs4MzEsOSBAQAogPHBhcmE+UG9pbnRlciB0byB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGV2ZW50IGlzIHRvIGJlIHN0b3JlZC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+CismcmV0dXJuLXZhbHVlLWR2YjsKIDxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUZBVUxUPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5ldiBwb2ludHMgdG8gYW4gaW52YWxpZCBhZGRyZXNzLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+CiA8cGFyYT5FV09VTERCTE9DSzwvcGFyYT4KIDwvZW50cnk+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgpAQCAtODk5LDcgKzg0Myw3IEBACiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJkbXhfZ2V0X3N0YyI+Cis8c2VjdGlvbiBpZD0iRE1YX0dFVF9TVEMiPgogPHRpdGxlPkRNWF9HRVRfU1RDPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC05NDYsMjQgKzg5MCw5IEBACiA8cGFyYT5Qb2ludGVyIHRvIHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgc3RjIGlzIHRvIGJlIHN0b3JlZC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+CismcmV0dXJuLXZhbHVlLWR2YjsKIDxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUZBVUxUPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5zdGMgcG9pbnRzIHRvIGFuIGludmFsaWQgYWRkcmVzcy48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgogPHBhcmE+RUlOVkFMPC9wYXJhPgogPC9lbnRyeT48ZW50cnkKICBhbGlnbj0iY2hhciI+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2R2YmFwaS54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2R2YmFwaS54bWwKc2ltaWxhcml0eSBpbmRleCA4NSUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9kdmJhcGkueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2R2YmFwaS54bWwKaW5kZXggOWZhZDg2Yy4uMmFiNmRkYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9kdmJhcGkueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmIvZHZiYXBpLnhtbApAQCAtMTE0LDggKzExNCwyOCBAQAogICAgICZzdWItZXhhbXBsZXM7CiAgIDwvY2hhcHRlcj4KIDwhLS0gRU5EIE9GIENIQVBURVJTIC0tPgorICA8YXBwZW5kaXggaWQ9ImF1ZGlvX2giPgorICAgIDx0aXRsZT5EVkIgQXVkaW8gSGVhZGVyIEZpbGU8L3RpdGxlPgorICAgICZzdWItYXVkaW8taDsKKyAgPC9hcHBlbmRpeD4KKyAgPGFwcGVuZGl4IGlkPSJjYV9oIj4KKyAgICA8dGl0bGU+RFZCIENvbmRpdGlvbmFsIEFjY2VzcyBIZWFkZXIgRmlsZTwvdGl0bGU+CisgICAgJnN1Yi1jYS1oOworICA8L2FwcGVuZGl4PgorICA8YXBwZW5kaXggaWQ9ImRteF9oIj4KKyAgICA8dGl0bGU+RFZCIERlbXV4IEhlYWRlciBGaWxlPC90aXRsZT4KKyAgICAmc3ViLWRteC1oOworICA8L2FwcGVuZGl4PgogICA8YXBwZW5kaXggaWQ9ImZyb250ZW5kX2giPgogICAgIDx0aXRsZT5EVkIgRnJvbnRlbmQgSGVhZGVyIEZpbGU8L3RpdGxlPgogICAgICZzdWItZnJvbnRlbmQtaDsKICAgPC9hcHBlbmRpeD4KKyAgPGFwcGVuZGl4IGlkPSJuZXRfaCI+CisgICAgPHRpdGxlPkRWQiBOZXR3b3JrIEhlYWRlciBGaWxlPC90aXRsZT4KKyAgICAmc3ViLW5ldC1oOworICA8L2FwcGVuZGl4PgorICA8YXBwZW5kaXggaWQ9InZpZGVvX2giPgorICAgIDx0aXRsZT5EVkIgVmlkZW8gSGVhZGVyIEZpbGU8L3RpdGxlPgorICAgICZzdWItdmlkZW8taDsKKyAgPC9hcHBlbmRpeD4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9kdmJwcm9wZXJ0eS54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2R2YnByb3BlcnR5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDdlMWE1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9kdmJwcm9wZXJ0eS54bWwKQEAgLTAsMCArMSw4NTkgQEAKKzxzZWN0aW9uIGlkPSJGRV9HRVRfU0VUX1BST1BFUlRZIj4KKzx0aXRsZT48Y29uc3RhbnQ+RkVfR0VUX1BST1BFUlRZL0ZFX1NFVF9QUk9QRVJUWTwvY29uc3RhbnQ+PC90aXRsZT4KKzxwYXJhPlRoaXMgc2VjdGlvbiBkZXNjcmliZXMgdGhlIERWQiB2ZXJzaW9uIDUgZXh0ZW50aW9uIG9mIHRoZSBEVkItQVBJLCBhbHNvCitjYWxsZWQgIlMyQVBJIiwgYXMgdGhpcyBBUEkgd2VyZSBhZGRlZCB0byBwcm92aWRlIHN1cHBvcnQgZm9yIERWQi1TMi4gSXQgd2FzCitkZXNpZ25lZCB0byBiZSBhYmxlIHRvIHJlcGxhY2UgdGhlIG9sZCBmcm9udGVuZCBBUEkuIFlldCwgdGhlIERJU0VRQyBhbmQKK3RoZSBjYXBhYmlsaXR5IGlvY3RscyB3ZXJlbid0IGltcGxlbWVudGVkIHlldCB2aWEgdGhlIG5ldyB3YXkuPC9wYXJhPgorPHBhcmE+VGhlIHR5cGljYWwgdXNhZ2UgZm9yIHRoZSA8Y29uc3RhbnQ+RkVfR0VUX1BST1BFUlRZL0ZFX1NFVF9QUk9QRVJUWTwvY29uc3RhbnQ+CitBUEkgaXMgdG8gcmVwbGFjZSB0aGUgaW9jdGwncyB3ZXJlIHRoZSA8bGluayBsaW5rZW5kPSJkdmItZnJvbnRlbmQtcGFyYW1ldGVycyI+CitzdHJ1Y3QgPGNvbnN0YW50PmR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzPC9jb25zdGFudD48L2xpbms+IHdlcmUgdXNlZC48L3BhcmE+Cis8c2VjdGlvbiBpZD0iZHR2LXByb3BlcnR5Ij4KKzx0aXRsZT5EVFYgcHJvcGVydHkgdHlwZTwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CisvKiBSZXNlcnZlZCBmaWVsZHMgc2hvdWxkIGJlIHNldCB0byAwICovCitzdHJ1Y3QgZHR2X3Byb3BlcnR5IHsKKwlfX3UzMiBjbWQ7CisJdW5pb24geworCQlfX3UzMiBkYXRhOworCQlzdHJ1Y3QgeworCQkJX191OCBkYXRhWzMyXTsKKwkJCV9fdTMyIGxlbjsKKwkJCV9fdTMyIHJlc2VydmVkMVszXTsKKwkJCXZvaWQgKnJlc2VydmVkMjsKKwkJfSBidWZmZXI7CisJfSB1OworCWludCByZXN1bHQ7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworLyogbnVtIG9mIHByb3BlcnRpZXMgY2Fubm90IGV4Y2VlZCBEVFZfSU9DVExfTUFYX01TR1MgcGVyIGlvY3RsICovCisjZGVmaW5lIERUVl9JT0NUTF9NQVhfTVNHUyA2NAorPC9wcm9ncmFtbGlzdGluZz4KKzwvc2VjdGlvbj4KKzxzZWN0aW9uIGlkPSJkdHYtcHJvcGVydGllcyI+Cis8dGl0bGU+RFRWIHByb3BlcnRpZXMgdHlwZTwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+CitzdHJ1Y3QgZHR2X3Byb3BlcnRpZXMgeworCV9fdTMyIG51bTsKKwlzdHJ1Y3QgZHR2X3Byb3BlcnR5ICpwcm9wczsKK307Cis8L3Byb2dyYW1saXN0aW5nPgorPC9zZWN0aW9uPgorCis8c2VjdGlvbiBpZD0iRkVfR0VUX1BST1BFUlRZIj4KKzx0aXRsZT5GRV9HRVRfUFJPUEVSVFk8L3RpdGxlPgorPHBhcmE+REVTQ1JJUFRJT04KKzwvcGFyYT4KKzxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMSI+PHRib2R5Pjxyb3c+PGVudHJ5CisgYWxpZ249ImNoYXIiPgorPHBhcmE+VGhpcyBpb2N0bCBjYWxsIHJldHVybnMgb25lIG9yIG1vcmUgZnJvbnRlbmQgcHJvcGVydGllcy4gVGhpcyBjYWxsIG9ubHkKKyByZXF1aXJlcyByZWFkLW9ubHkgYWNjZXNzIHRvIHRoZSBkZXZpY2UuPC9wYXJhPgorPC9lbnRyeT4KKyA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKzxwYXJhPlNZTk9QU0lTCis8L3BhcmE+Cis8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjEiPjx0Ym9keT48cm93PjxlbnRyeQorIGFsaWduPSJjaGFyIj4KKzxwYXJhPmludCBpb2N0bChpbnQgZmQsIGludCByZXF1ZXN0ID0gPGxpbmsgbGlua2VuZD0iRkVfR0VUX1BST1BFUlRZIj5GRV9HRVRfUFJPUEVSVFk8L2xpbms+LAorIGR0dl9wcm9wZXJ0aWVzICYjeDIyQzY7cHJvcHMpOzwvcGFyYT4KKzwvZW50cnk+CisgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Cis8cGFyYT5QQVJBTUVURVJTCis8L3BhcmE+Cis8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeSBhbGlnbj0iY2hhciI+Cis8cGFyYT5pbnQgZmQ8L3BhcmE+Cis8L2VudHJ5PjxlbnRyeQorIGFsaWduPSJjaGFyIj4KKzxwYXJhPkZpbGUgZGVzY3JpcHRvciByZXR1cm5lZCBieSBhIHByZXZpb3VzIGNhbGwgdG8gb3BlbigpLjwvcGFyYT4KKzwvZW50cnk+CisgPC9yb3c+PHJvdz48ZW50cnkKKyBhbGlnbj0iY2hhciI+Cis8cGFyYT5pbnQgbnVtPC9wYXJhPgorPC9lbnRyeT48ZW50cnkKKyBhbGlnbj0iY2hhciI+Cis8cGFyYT5FcXVhbHMgPGxpbmsgbGlua2VuZD0iRkVfR0VUX1BST1BFUlRZIj5GRV9HRVRfUFJPUEVSVFk8L2xpbms+IGZvciB0aGlzIGNvbW1hbmQuPC9wYXJhPgorPC9lbnRyeT4KKyA8L3Jvdz48cm93PjxlbnRyeQorIGFsaWduPSJjaGFyIj4KKzxwYXJhPnN0cnVjdCBkdHZfcHJvcGVydHkgKnByb3BzPC9wYXJhPgorPC9lbnRyeT48ZW50cnkKKyBhbGlnbj0iY2hhciI+Cis8cGFyYT5Qb2ludHMgdG8gdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBmcm9udC1lbmQgcHJvcGVydHkgY29tbWFuZHMgYXJlIHN0b3JlZC48L3BhcmE+Cis8L2VudHJ5PgorIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7Cis8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PgorICA8ZW50cnkgYWxpZ249ImNoYXIiPjxwYXJhPkVPUE5PVFNVUFA8L3BhcmE+PC9lbnRyeT4KKyAgPGVudHJ5IGFsaWduPSJjaGFyIj48cGFyYT5Qcm9wZXJ0eSB0eXBlIG5vdCBzdXBwb3J0ZWQuPC9wYXJhPjwvZW50cnk+CisgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIGlkPSJGRV9TRVRfUFJPUEVSVFkiPgorPHRpdGxlPkZFX1NFVF9QUk9QRVJUWTwvdGl0bGU+Cis8cGFyYT5ERVNDUklQVElPTgorPC9wYXJhPgorPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIxIj48dGJvZHk+PHJvdz48ZW50cnkKKyBhbGlnbj0iY2hhciI+Cis8cGFyYT5UaGlzIGlvY3RsIGNhbGwgc2V0cyBvbmUgb3IgbW9yZSBmcm9udGVuZCBwcm9wZXJ0aWVzLiBUaGlzIGNhbGwgb25seQorIHJlcXVpcmVzIHJlYWQtb25seSBhY2Nlc3MgdG8gdGhlIGRldmljZS48L3BhcmE+Cis8L2VudHJ5PgorIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorPHBhcmE+U1lOT1BTSVMKKzwvcGFyYT4KKzxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMSI+PHRib2R5Pjxyb3c+PGVudHJ5CisgYWxpZ249ImNoYXIiPgorPHBhcmE+aW50IGlvY3RsKGludCBmZCwgaW50IHJlcXVlc3QgPSA8bGluayBsaW5rZW5kPSJGRV9TRVRfUFJPUEVSVFkiPkZFX1NFVF9QUk9QRVJUWTwvbGluaz4sCisgZHR2X3Byb3BlcnRpZXMgJiN4MjJDNjtwcm9wcyk7PC9wYXJhPgorPC9lbnRyeT4KKyA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKzxwYXJhPlBBUkFNRVRFUlMKKzwvcGFyYT4KKzxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5IGFsaWduPSJjaGFyIj4KKzxwYXJhPmludCBmZDwvcGFyYT4KKzwvZW50cnk+PGVudHJ5CisgYWxpZ249ImNoYXIiPgorPHBhcmE+RmlsZSBkZXNjcmlwdG9yIHJldHVybmVkIGJ5IGEgcHJldmlvdXMgY2FsbCB0byBvcGVuKCkuPC9wYXJhPgorPC9lbnRyeT4KKyA8L3Jvdz48cm93PjxlbnRyeQorIGFsaWduPSJjaGFyIj4KKzxwYXJhPmludCBudW08L3BhcmE+Cis8L2VudHJ5PjxlbnRyeQorIGFsaWduPSJjaGFyIj4KKzxwYXJhPkVxdWFscyA8bGluayBsaW5rZW5kPSJGRV9TRVRfUFJPUEVSVFkiPkZFX1NFVF9QUk9QRVJUWTwvbGluaz4gZm9yIHRoaXMgY29tbWFuZC48L3BhcmE+Cis8L2VudHJ5PgorIDwvcm93Pjxyb3c+PGVudHJ5CisgYWxpZ249ImNoYXIiPgorPHBhcmE+c3RydWN0IGR0dl9wcm9wZXJ0eSAqcHJvcHM8L3BhcmE+Cis8L2VudHJ5PjxlbnRyeQorIGFsaWduPSJjaGFyIj4KKzxwYXJhPlBvaW50cyB0byB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGZyb250LWVuZCBwcm9wZXJ0eSBjb21tYW5kcyBhcmUgc3RvcmVkLjwvcGFyYT4KKzwvZW50cnk+CisgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKKzxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+CisgIDxlbnRyeSBhbGlnbj0iY2hhciI+PHBhcmE+RU9QTk9UU1VQUDwvcGFyYT48L2VudHJ5PgorICA8ZW50cnkgYWxpZ249ImNoYXIiPjxwYXJhPlByb3BlcnR5IHR5cGUgbm90IHN1cHBvcnRlZC48L3BhcmE+PC9lbnRyeT4KKyA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKzwvc2VjdGlvbj4KKworPHNlY3Rpb24+CisJPHRpdGxlPlByb3BlcnR5IHR5cGVzPC90aXRsZT4KKzxwYXJhPgorT24gPGxpbmsgbGlua2VuZD0iRkVfR0VUX1BST1BFUlRZIj5GRV9HRVRfUFJPUEVSVFk8L2xpbms+LzxsaW5rIGxpbmtlbmQ9IkZFX1NFVF9QUk9QRVJUWSI+RkVfU0VUX1BST1BFUlRZPC9saW5rPiwKK3RoZSBhY3R1YWwgYWN0aW9uIGlzIGRldGVybWluZWQgYnkgdGhlIGR0dl9wcm9wZXJ0eSBjbWQvZGF0YSBwYWlycy4gV2l0aCBvbmUgc2luZ2xlIGlvY3RsLCBpcyBwb3NzaWJsZSB0bworZ2V0L3NldCB1cCB0byA2NCBwcm9wZXJ0aWVzLiBUaGUgYWN0dWFsIG1lYW5pbmcgb2YgZWFjaCBwcm9wZXJ0eSBpcyBkZXNjcmliZWQgb24gdGhlIG5leHQgc2VjdGlvbnMuCis8L3BhcmE+CisKKzxwYXJhPlRoZSBhdmFpbGFibGUgZnJvbnRlbmQgcHJvcGVydHkgdHlwZXMgYXJlIHNob3duIG9uIHRoZSBuZXh0IHNlY3Rpb24uPC9wYXJhPgorPC9zZWN0aW9uPgorCis8c2VjdGlvbiBpZD0iZmVfcHJvcGVydHlfcGFyYW1ldGVycyI+CisJPHRpdGxlPkRpZ2l0YWwgVFYgcHJvcGVydHkgcGFyYW1ldGVyczwvdGl0bGU+CisJPHNlY3Rpb24gaWQ9IkRUVi1VTkRFRklORUQiPgorCTx0aXRsZT48Y29uc3RhbnQ+RFRWX1VOREVGSU5FRDwvY29uc3RhbnQ+PC90aXRsZT4KKwk8cGFyYT5Vc2VkIGludGVybmFsbHkuIEEgR0VUL1NFVCBvcGVyYXRpb24gZm9yIGl0IHdvbid0IGNoYW5nZSBvciByZXR1cm4gYW55dGhpbmcuPC9wYXJhPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLVRVTkUiPgorCTx0aXRsZT48Y29uc3RhbnQ+RFRWX1RVTkU8L2NvbnN0YW50PjwvdGl0bGU+CisJPHBhcmE+SW50ZXJwcmV0IHRoZSBjYWNoZSBvZiBkYXRhLCBidWlsZCBlaXRoZXIgYSB0cmFkaXRpb25hbCBmcm9udGVuZCB0dW5lcmVxdWVzdCBzbyB3ZSBjYW4gcGFzcyB2YWxpZGF0aW9uIGluIHRoZSA8Y29uc3RhbnQ+RkVfU0VUX0ZST05URU5EPC9jb25zdGFudD4gaW9jdGwuPC9wYXJhPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLUNMRUFSIj4KKwk8dGl0bGU+PGNvbnN0YW50PkRUVl9DTEVBUjwvY29uc3RhbnQ+PC90aXRsZT4KKwk8cGFyYT5SZXNldCBhIGNhY2hlIG9mIGRhdGEgc3BlY2lmaWMgdG8gdGhlIGZyb250ZW5kIGhlcmUuIFRoaXMgZG9lcyBub3QgZWZmZWN0IGhhcmR3YXJlLjwvcGFyYT4KKwk8L3NlY3Rpb24+CisJPHNlY3Rpb24gaWQ9IkRUVi1GUkVRVUVOQ1kiPgorCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9GUkVRVUVOQ1k8L2NvbnN0YW50PjwvdGl0bGU+CisKKwkJPHBhcmE+Q2VudHJhbCBmcmVxdWVuY3kgb2YgdGhlIGNoYW5uZWwsIGluIEhaLjwvcGFyYT4KKworCQk8cGFyYT5Ob3Rlczo8L3BhcmE+CisJCTxwYXJhPjEpRm9yIElTREItVCwgdGhlIGNoYW5uZWxzIGFyZSB1c3VhbGx5IHRyYW5zbWl0dGVkIHdpdGggYW4gb2Zmc2V0IG9mIDE0M2tIei4KKwkJCUUuZy4gYSB2YWxpZCBmcmVxdW5jeSBjb3VsZCBiZSA0NzQxNDMga0h6LiBUaGUgc3RlcHBpbmcgaXMgYm91bmQgdG8gdGhlIGJhbmR3aWR0aCBvZgorCQkJdGhlIGNoYW5uZWwgd2hpY2ggaXMgNk1Iei48L3BhcmE+CisKKwkJPHBhcmE+MilBcyBpbiBJU0RCLVRzYiB0aGUgY2hhbm5lbCBjb25zaXN0cyBvZiBvbmx5IG9uZSBvciB0aHJlZSBzZWdtZW50cyB0aGUKKwkJCWZyZXF1ZW5jeSBzdGVwIGlzIDQyOWtIeiwgMyo0MjkgcmVzcGVjdGl2ZWx5LiBBcyBmb3IgSVNEQi1UIHRoZQorCQkJY2VudHJhbCBmcmVxdWVuY3kgb2YgdGhlIGNoYW5uZWwgaXMgZXhwZWN0ZWQuPC9wYXJhPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLU1PRFVMQVRJT04iPgorCTx0aXRsZT48Y29uc3RhbnQ+RFRWX01PRFVMQVRJT048L2NvbnN0YW50PjwvdGl0bGU+Cis8cGFyYT5TcGVjaWZpZXMgdGhlIGZyb250ZW5kIG1vZHVsYXRpb24gdHlwZSBmb3IgY2FibGUgYW5kIHNhdGVsbGl0ZSB0eXBlcy4gVGhlIG1vZHVsYXRpb24gY2FuIGJlIG9uZSBvZiB0aGUgdHlwZXMgYmVsbG93OjwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KKyB0eXBlZGVmIGVudW0gZmVfbW9kdWxhdGlvbiB7CisJUVBTSywKKwlRQU1fMTYsCisJUUFNXzMyLAorCVFBTV82NCwKKwlRQU1fMTI4LAorCVFBTV8yNTYsCisJUUFNX0FVVE8sCisJVlNCXzgsCisJVlNCXzE2LAorCVBTS184LAorCUFQU0tfMTYsCisJQVBTS18zMiwKKwlEUVBTSywKKyB9IGZlX21vZHVsYXRpb25fdDsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtQkFORFdJRFRILUhaIj4KKwkJPHRpdGxlPjxjb25zdGFudD5EVFZfQkFORFdJRFRIX0haPC9jb25zdGFudD48L3RpdGxlPgorCisJCTxwYXJhPkJhbmR3aWR0aCBmb3IgdGhlIGNoYW5uZWwsIGluIEhaLjwvcGFyYT4KKworCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6CisJCQk8Y29uc3RhbnQ+MTcxMjAwMDwvY29uc3RhbnQ+LAorCQkJPGNvbnN0YW50PjUwMDAwMDA8L2NvbnN0YW50PiwKKwkJCTxjb25zdGFudD42MDAwMDAwPC9jb25zdGFudD4sCisJCQk8Y29uc3RhbnQ+NzAwMDAwMDwvY29uc3RhbnQ+LAorCQkJPGNvbnN0YW50PjgwMDAwMDA8L2NvbnN0YW50PiwKKwkJCTxjb25zdGFudD4xMDAwMDAwMDwvY29uc3RhbnQ+LgorCQk8L3BhcmE+CisKKwkJPHBhcmE+Tm90ZXM6PC9wYXJhPgorCisJCTxwYXJhPjEpIEZvciBJU0RCLVQgaXQgc2hvdWxkIGJlIGFsd2F5cyA2MDAwMDAwSHogKDZNSHopPC9wYXJhPgorCQk8cGFyYT4yKSBGb3IgSVNEQi1Uc2IgaXQgY2FuIHZhcnkgZGVwZW5kaW5nIG9uIHRoZSBudW1iZXIgb2YgY29ubmVjdGVkIHNlZ21lbnRzPC9wYXJhPgorCQk8cGFyYT4zKSBCYW5kd2lkdGggZG9lc24ndCBhcHBseSBmb3IgRFZCLUMgdHJhbnNtaXNzaW9ucywgYXMgdGhlIGJhbmR3aWR0aAorCQkJIGZvciBEVkItQyBkZXBlbmRzIG9uIHRoZSBzeW1ib2wgcmF0ZTwvcGFyYT4KKwkJPHBhcmE+NCkgQmFuZHdpZHRoIGluIElTREItVCBpcyBmaXhlZCAoNk1Ieikgb3IgY2FuIGJlIGVhc2lseSBkZXJpdmVkIGZyb20KKwkJCW90aGVyIHBhcmFtZXRlcnMgKERUVl9JU0RCVF9TQl9TRUdNRU5UX0lEWCwKKwkJCURUVl9JU0RCVF9TQl9TRUdNRU5UX0NPVU5UKS48L3BhcmE+CisJCTxwYXJhPjUpIERWQi1UIHN1cHBvcnRzIDYsIDcgYW5kIDhNSHouPC9wYXJhPgorCQk8cGFyYT42KSBJbiBhZGRpdGlvbiwgRFZCLVQyIHN1cHBvcnRzIDEuMTcyLCA1IGFuZCAxME1Iei48L3BhcmE+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtSU5WRVJTSU9OIj4KKwk8dGl0bGU+PGNvbnN0YW50PkRUVl9JTlZFUlNJT048L2NvbnN0YW50PjwvdGl0bGU+CisJPHBhcmE+VGhlIEludmVyc2lvbiBmaWVsZCBjYW4gdGFrZSBvbmUgb2YgdGhlc2UgdmFsdWVzOgorCTwvcGFyYT4KKwk8cHJvZ3JhbWxpc3Rpbmc+CisJdHlwZWRlZiBlbnVtIGZlX3NwZWN0cmFsX2ludmVyc2lvbiB7CisJCUlOVkVSU0lPTl9PRkYsCisJCUlOVkVSU0lPTl9PTiwKKwkJSU5WRVJTSU9OX0FVVE8KKwl9IGZlX3NwZWN0cmFsX2ludmVyc2lvbl90OworCTwvcHJvZ3JhbWxpc3Rpbmc+CisJPHBhcmE+SXQgaW5kaWNhdGVzIGlmIHNwZWN0cmFsIGludmVyc2lvbiBzaG91bGQgYmUgcHJlc3VtZWQgb3Igbm90LiBJbiB0aGUgYXV0b21hdGljIHNldHRpbmcKKwkoPGNvbnN0YW50PklOVkVSU0lPTl9BVVRPPC9jb25zdGFudD4pIHRoZSBoYXJkd2FyZSB3aWxsIHRyeSB0byBmaWd1cmUgb3V0IHRoZSBjb3JyZWN0IHNldHRpbmcgYnkKKwlpdHNlbGYuCisJPC9wYXJhPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLURJU0VRQy1NQVNURVIiPgorCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0RJU0VRQ19NQVNURVI8L2NvbnN0YW50PjwvdGl0bGU+CisJPHBhcmE+Q3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZC48L3BhcmE+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtU1lNQk9MLVJBVEUiPgorCTx0aXRsZT48Y29uc3RhbnQ+RFRWX1NZTUJPTF9SQVRFPC9jb25zdGFudD48L3RpdGxlPgorCTxwYXJhPkRpZ2l0YWwgVFYgc3ltYm9sIHJhdGUsIGluIGJhdWRzIChzeW1ib2xzL3NlY29uZCkuIFVzZWQgb24gY2FibGUgc3RhbmRhcmRzLjwvcGFyYT4KKwk8L3NlY3Rpb24+CisJPHNlY3Rpb24gaWQ9IkRUVi1JTk5FUi1GRUMiPgorCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0lOTkVSX0ZFQzwvY29uc3RhbnQ+PC90aXRsZT4KKwk8cGFyYT5Vc2VkIGNhYmxlL3NhdGVsbGl0ZSB0cmFuc21pc3Npb25zLiBUaGUgYWNjZXB0YWJsZSB2YWx1ZXMgYXJlOgorCTwvcGFyYT4KKwk8cHJvZ3JhbWxpc3Rpbmc+Cit0eXBlZGVmIGVudW0gZmVfY29kZV9yYXRlIHsKKwlGRUNfTk9ORSA9IDAsCisJRkVDXzFfMiwKKwlGRUNfMl8zLAorCUZFQ18zXzQsCisJRkVDXzRfNSwKKwlGRUNfNV82LAorCUZFQ182XzcsCisJRkVDXzdfOCwKKwlGRUNfOF85LAorCUZFQ19BVVRPLAorCUZFQ18zXzUsCisJRkVDXzlfMTAsCit9IGZlX2NvZGVfcmF0ZV90OworCTwvcHJvZ3JhbWxpc3Rpbmc+CisJPHBhcmE+d2hpY2ggY29ycmVzcG9uZCB0byBlcnJvciBjb3JyZWN0aW9uIHJhdGVzIG9mIDEvMiwgMi8zLCBldGMuLAorCW5vIGVycm9yIGNvcnJlY3Rpb24gb3IgYXV0byBkZXRlY3Rpb24uPC9wYXJhPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLVZPTFRBR0UiPgorCTx0aXRsZT48Y29uc3RhbnQ+RFRWX1ZPTFRBR0U8L2NvbnN0YW50PjwvdGl0bGU+CisJPHBhcmE+VGhlIHZvbHRhZ2UgaXMgdXN1YWxseSB1c2VkIHdpdGggbm9uLURpU0VxQyBjYXBhYmxlIExOQnMgdG8gc3dpdGNoCisJdGhlIHBvbGFyemF0aW9uIChob3Jpem9udGFsL3ZlcnRpY2FsKS4gV2hlbiB1c2luZyBEaVNFcUMgZXB1aXBtZW50IHRoaXMKKwl2b2x0YWdlIGhhcyB0byBiZSBzd2l0Y2hlZCBjb25zaXN0ZW50bHkgdG8gdGhlIERpU0VxQyBjb21tYW5kcyBhcworCWRlc2NyaWJlZCBpbiB0aGUgRGlTRXFDIHNwZWMuPC9wYXJhPgorCTxwcm9ncmFtbGlzdGluZz4KKwkJdHlwZWRlZiBlbnVtIGZlX3NlY192b2x0YWdlIHsKKwkJU0VDX1ZPTFRBR0VfMTMsCisJCVNFQ19WT0xUQUdFXzE4CisJCX0gZmVfc2VjX3ZvbHRhZ2VfdDsKKwk8L3Byb2dyYW1saXN0aW5nPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLVRPTkUiPgorCTx0aXRsZT48Y29uc3RhbnQ+RFRWX1RPTkU8L2NvbnN0YW50PjwvdGl0bGU+CisJPHBhcmE+Q3VycmVudGx5IG5vdCB1c2VkLjwvcGFyYT4KKwk8L3NlY3Rpb24+CisJPHNlY3Rpb24gaWQ9IkRUVi1QSUxPVCI+CisJPHRpdGxlPjxjb25zdGFudD5EVFZfUElMT1Q8L2NvbnN0YW50PjwvdGl0bGU+CisJPHBhcmE+U2V0cyBEVkItUzIgcGlsb3Q8L3BhcmE+CisJPHNlY3Rpb24gaWQ9ImZlLXBpbG90LXQiPgorCQk8dGl0bGU+ZmVfcGlsb3QgdHlwZTwvdGl0bGU+CisJCTxwcm9ncmFtbGlzdGluZz4KK3R5cGVkZWYgZW51bSBmZV9waWxvdCB7CisJUElMT1RfT04sCisJUElMT1RfT0ZGLAorCVBJTE9UX0FVVE8sCit9IGZlX3BpbG90X3Q7CisJCTwvcHJvZ3JhbWxpc3Rpbmc+CisJCTwvc2VjdGlvbj4KKwk8L3NlY3Rpb24+CisJPHNlY3Rpb24gaWQ9IkRUVi1ST0xMT0ZGIj4KKwk8dGl0bGU+PGNvbnN0YW50PkRUVl9ST0xMT0ZGPC9jb25zdGFudD48L3RpdGxlPgorCQk8cGFyYT5TZXRzIERWQi1TMiByb2xsb2ZmPC9wYXJhPgorCisJPHNlY3Rpb24gaWQ9ImZlLXJvbGxvZmYtdCI+CisJCTx0aXRsZT5mZV9yb2xsb2ZmIHR5cGU8L3RpdGxlPgorCQk8cHJvZ3JhbWxpc3Rpbmc+Cit0eXBlZGVmIGVudW0gZmVfcm9sbG9mZiB7CisJUk9MTE9GRl8zNSwgLyogSW1wbGllZCB2YWx1ZSBpbiBEVkItUywgZGVmYXVsdCBmb3IgRFZCLVMyICovCisJUk9MTE9GRl8yMCwKKwlST0xMT0ZGXzI1LAorCVJPTExPRkZfQVVUTywKK30gZmVfcm9sbG9mZl90OworCQk8L3Byb2dyYW1saXN0aW5nPgorCQk8L3NlY3Rpb24+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtRElTRVFDLVNMQVZFLVJFUExZIj4KKwk8dGl0bGU+PGNvbnN0YW50PkRUVl9ESVNFUUNfU0xBVkVfUkVQTFk8L2NvbnN0YW50PjwvdGl0bGU+CisJPHBhcmE+Q3VycmVudGx5IG5vdCBpbXBsZW1lbnRlZC48L3BhcmE+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtRkUtQ0FQQUJJTElUWS1DT1VOVCI+CisJPHRpdGxlPjxjb25zdGFudD5EVFZfRkVfQ0FQQUJJTElUWV9DT1VOVDwvY29uc3RhbnQ+PC90aXRsZT4KKwk8cGFyYT5DdXJyZW50bHkgbm90IGltcGxlbWVudGVkLjwvcGFyYT4KKwk8L3NlY3Rpb24+CisJPHNlY3Rpb24gaWQ9IkRUVi1GRS1DQVBBQklMSVRZIj4KKwk8dGl0bGU+PGNvbnN0YW50PkRUVl9GRV9DQVBBQklMSVRZPC9jb25zdGFudD48L3RpdGxlPgorCTxwYXJhPkN1cnJlbnRseSBub3QgaW1wbGVtZW50ZWQuPC9wYXJhPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLURFTElWRVJZLVNZU1RFTSI+CisJCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0RFTElWRVJZX1NZU1RFTTwvY29uc3RhbnQ+PC90aXRsZT4KKwkJPHBhcmE+U3BlY2lmaWVzIHRoZSB0eXBlIG9mIERlbGl2ZXJ5IHN5c3RlbTwvcGFyYT4KKwkJPHNlY3Rpb24gaWQ9ImZlLWRlbGl2ZXJ5LXN5c3RlbS10Ij4KKwkJPHRpdGxlPmZlX2RlbGl2ZXJ5X3N5c3RlbSB0eXBlPC90aXRsZT4KKwkJPHBhcmE+UG9zc2libGUgdmFsdWVzOiA8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+Cit0eXBlZGVmIGVudW0gZmVfZGVsaXZlcnlfc3lzdGVtIHsKKwlTWVNfVU5ERUZJTkVELAorCVNZU19EVkJDX0FOTkVYX0FDLAorCVNZU19EVkJDX0FOTkVYX0IsCisJU1lTX0RWQlQsCisJU1lTX0RTUywKKwlTWVNfRFZCUywKKwlTWVNfRFZCUzIsCisJU1lTX0RWQkgsCisJU1lTX0lTREJULAorCVNZU19JU0RCUywKKwlTWVNfSVNEQkMsCisJU1lTX0FUU0MsCisJU1lTX0FUU0NNSCwKKwlTWVNfRE1CVEgsCisJU1lTX0NNTUIsCisJU1lTX0RBQiwKKwlTWVNfRFZCVDIsCit9IGZlX2RlbGl2ZXJ5X3N5c3RlbV90OworPC9wcm9ncmFtbGlzdGluZz4KKwkJPC9zZWN0aW9uPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLUlTREJULVBBUlRJQUwtUkVDRVBUSU9OIj4KKwkJPHRpdGxlPjxjb25zdGFudD5EVFZfSVNEQlRfUEFSVElBTF9SRUNFUFRJT048L2NvbnN0YW50PjwvdGl0bGU+CisKKwkJPHBhcmE+SWYgPGNvbnN0YW50PkRUVl9JU0RCVF9TT1VORF9CUk9BRENBU1RJTkc8L2NvbnN0YW50PiBpcyAnMCcgdGhpcyBiaXQtZmllbGQgcmVwcmVzZW50cyB3aGV0aGVyCisJCQl0aGUgY2hhbm5lbCBpcyBpbiBwYXJ0aWFsIHJlY2VwdGlvbiBtb2RlIG9yIG5vdC48L3BhcmE+CisKKwkJPHBhcmE+SWYgJzEnIDxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVJBXyo8L2NvbnN0YW50PiB2YWx1ZXMgYXJlIGFzc2lnbmVkIHRvIHRoZSBjZW50ZXIgc2VnbWVudCBhbmQKKwkJCTxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVJBX1NFR01FTlRfQ09VTlQ8L2NvbnN0YW50PiBoYXMgdG8gYmUgJzEnLjwvcGFyYT4KKworCQk8cGFyYT5JZiBpbiBhZGRpdGlvbiA8Y29uc3RhbnQ+RFRWX0lTREJUX1NPVU5EX0JST0FEQ0FTVElORzwvY29uc3RhbnQ+IGlzICcxJworCQkJPGNvbnN0YW50PkRUVl9JU0RCVF9QQVJUSUFMX1JFQ0VQVElPTjwvY29uc3RhbnQ+IHJlcHJlc2VudHMgd2hldGhlciB0aGlzIElTREItVHNiIGNoYW5uZWwKKwkJCWlzIGNvbnNpc3Rpbmcgb2Ygb25lIHNlZ21lbnQgYW5kIGxheWVyIG9yIHRocmVlIHNlZ21lbnRzIGFuZCB0d28gbGF5ZXJzLjwvcGFyYT4KKworCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6IDAsIDEsIC0xIChBVVRPKTwvcGFyYT4KKwk8L3NlY3Rpb24+CisJPHNlY3Rpb24gaWQ9IkRUVi1JU0RCVC1TT1VORC1CUk9BRENBU1RJTkciPgorCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9JU0RCVF9TT1VORF9CUk9BRENBU1RJTkc8L2NvbnN0YW50PjwvdGl0bGU+CisKKwkJPHBhcmE+VGhpcyBmaWVsZCByZXByZXNlbnRzIHdoZXRoZXIgdGhlIG90aGVyIERUVl9JU0RCVF8qLXBhcmFtZXRlcnMgYXJlCisJCQlyZWZlcnJpbmcgdG8gYW4gSVNEQi1UIGFuZCBhbiBJU0RCLVRzYiBjaGFubmVsLiAoU2VlIGFsc28KKwkJCTxjb25zdGFudD5EVFZfSVNEQlRfUEFSVElBTF9SRUNFUFRJT048L2NvbnN0YW50PikuPC9wYXJhPgorCisJCTxwYXJhPlBvc3NpYmxlIHZhbHVlczogMCwgMSwgLTEgKEFVVE8pPC9wYXJhPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLUlTREJULVNCLVNVQkNIQU5ORUwtSUQiPgorCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9JU0RCVF9TQl9TVUJDSEFOTkVMX0lEPC9jb25zdGFudD48L3RpdGxlPgorCisJCTxwYXJhPlRoaXMgZmllbGQgb25seSBhcHBsaWVzIGlmIDxjb25zdGFudD5EVFZfSVNEQlRfU09VTkRfQlJPQURDQVNUSU5HPC9jb25zdGFudD4gaXMgJzEnLjwvcGFyYT4KKworCQk8cGFyYT4oTm90ZSBvZiB0aGUgYXV0aG9yOiBUaGlzIG1pZ2h0IG5vdCBiZSB0aGUgY29ycmVjdCBkZXNjcmlwdGlvbiBvZiB0aGUKKwkJCTxjb25zdGFudD5TVUJDSEFOTkVMLUlEPC9jb25zdGFudD4gaW4gYWxsIGRldGFpbHMsIGJ1dCBpdCBpcyBteSB1bmRlcnN0YW5kaW5nIG9mIHRoZSB0ZWNobmljYWwKKwkJCWJhY2tncm91bmQgbmVlZGVkIHRvIHByb2dyYW0gYSBkZXZpY2UpPC9wYXJhPgorCisJCTxwYXJhPkFuIElTREItVHNiIGNoYW5uZWwgKDEgb3IgMyBzZWdtZW50cykgY2FuIGJlIGJyb2FkY2FzdGVkIGFsb25lIG9yIGluIGEKKwkJCXNldCBvZiBjb25uZWN0ZWQgSVNEQi1Uc2IgY2hhbm5lbHMuIEluIHRoaXMgc2V0IG9mIGNoYW5uZWxzIGV2ZXJ5CisJCQljaGFubmVsIGNhbiBiZSByZWNlaXZlZCBpbmRlcGVuZGVudGx5LiBUaGUgbnVtYmVyIG9mIGNvbm5lY3RlZAorCQkJSVNEQi1Uc2Igc2VnbWVudCBjYW4gdmFyeSwgZS5nLiBkZXBlbmRpbmcgb24gdGhlIGZyZXF1ZW5jeSBzcGVjdHJ1bQorCQkJYmFuZHdpZHRoIGF2YWlsYWJsZS48L3BhcmE+CisKKwkJPHBhcmE+RXhhbXBsZTogQXNzdW1lIDggSVNEQi1Uc2IgY29ubmVjdGVkIHNlZ21lbnRzIGFyZSBicm9hZGNhc3RlZC4gVGhlCisJCQlicm9hZGNhc3RlciBoYXMgc2V2ZXJhbCBwb3NzaWJpbGl0aWVzIHRvIHB1dCB0aG9zZSBjaGFubmVscyBpbiB0aGUKKwkJCWFpcjogQXNzdW1pbmcgYSBub3JtYWwgMTMtc2VnbWVudCBJU0RCLVQgc3BlY3RydW0gaGUgY2FuIGFsaWduIHRoZSA4CisJCQlzZWdtZW50cyBmcm9tIHBvc2l0aW9uIDEtOCB0byA1LTEzIG9yIGFueXRoaW5nIGluIGJldHdlZW4uPC9wYXJhPgorCisJCTxwYXJhPlRoZSB1bmRlcmx5aW5nIGxheWVyIG9mIHNlZ21lbnRzIGFyZSBzdWJjaGFubmVsczogZWFjaCBzZWdtZW50IGlzCisJCQljb25zaXN0aW5nIG9mIHNldmVyYWwgc3ViY2hhbm5lbHMgd2l0aCBhIHByZWRlZmluZWQgSURzLiBBIHN1Yi1jaGFubmVsCisJCQlpcyB1c2VkIHRvIGhlbHAgdGhlIGRlbW9kdWxhdG9yIHRvIHN5bmNocm9uaXplIG9uIHRoZSBjaGFubmVsLjwvcGFyYT4KKworCQk8cGFyYT5BbiBJU0RCLVQgY2hhbm5lbCBpcyBhbHdheXMgY2VudGVyZWQgb3ZlciBhbGwgc3ViLWNoYW5uZWxzLiBBcyBmb3IKKwkJCXRoZSBleGFtcGxlIGFib3ZlLCBpbiBJU0RCLVRzYiBpdCBpcyBubyBsb25nZXIgYXMgc2ltcGxlIGFzIHRoYXQuPC9wYXJhPgorCisJCTxwYXJhPjxjb25zdGFudD5UaGUgRFRWX0lTREJUX1NCX1NVQkNIQU5ORUxfSUQ8L2NvbnN0YW50PiBwYXJhbWV0ZXIgaXMgdXNlZCB0byBnaXZlIHRoZQorCQkJc3ViLWNoYW5uZWwgSUQgb2YgdGhlIHNlZ21lbnQgdG8gYmUgZGVtb2R1bGF0ZWQuPC9wYXJhPgorCisJCTxwYXJhPlBvc3NpYmxlIHZhbHVlczogMCAuLiA0MSwgLTEgKEFVVE8pPC9wYXJhPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLUlTREJULVNCLVNFR01FTlQtSURYIj4KKwkJPHRpdGxlPjxjb25zdGFudD5EVFZfSVNEQlRfU0JfU0VHTUVOVF9JRFg8L2NvbnN0YW50PjwvdGl0bGU+CisJCTxwYXJhPlRoaXMgZmllbGQgb25seSBhcHBsaWVzIGlmIDxjb25zdGFudD5EVFZfSVNEQlRfU09VTkRfQlJPQURDQVNUSU5HPC9jb25zdGFudD4gaXMgJzEnLjwvcGFyYT4KKwkJPHBhcmE+PGNvbnN0YW50PkRUVl9JU0RCVF9TQl9TRUdNRU5UX0lEWDwvY29uc3RhbnQ+IGdpdmVzIHRoZSBpbmRleCBvZiB0aGUgc2VnbWVudCB0byBiZQorCQkJZGVtb2R1bGF0ZWQgZm9yIGFuIElTREItVHNiIGNoYW5uZWwgd2hlcmUgc2V2ZXJhbCBvZiB0aGVtIGFyZQorCQkJdHJhbnNtaXR0ZWQgaW4gdGhlIGNvbm5lY3RlZCBtYW5uZXIuPC9wYXJhPgorCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6IDAgLi4gPGNvbnN0YW50PkRUVl9JU0RCVF9TQl9TRUdNRU5UX0NPVU5UPC9jb25zdGFudD4gLSAxPC9wYXJhPgorCQk8cGFyYT5Ob3RlOiBUaGlzIHZhbHVlIGNhbm5vdCBiZSBkZXRlcm1pbmVkIGJ5IGFuIGF1dG9tYXRpYyBjaGFubmVsIHNlYXJjaC48L3BhcmE+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtSVNEQlQtU0ItU0VHTUVOVC1DT1VOVCI+CisJCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0lTREJUX1NCX1NFR01FTlRfQ09VTlQ8L2NvbnN0YW50PjwvdGl0bGU+CisJCTxwYXJhPlRoaXMgZmllbGQgb25seSBhcHBsaWVzIGlmIDxjb25zdGFudD5EVFZfSVNEQlRfU09VTkRfQlJPQURDQVNUSU5HPC9jb25zdGFudD4gaXMgJzEnLjwvcGFyYT4KKwkJPHBhcmE+PGNvbnN0YW50PkRUVl9JU0RCVF9TQl9TRUdNRU5UX0NPVU5UPC9jb25zdGFudD4gZ2l2ZXMgdGhlIHRvdGFsIGNvdW50IG9mIGNvbm5lY3RlZCBJU0RCLVRzYgorCQkJY2hhbm5lbHMuPC9wYXJhPgorCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6IDEgLi4gMTM8L3BhcmE+CisJCTxwYXJhPk5vdGU6IFRoaXMgdmFsdWUgY2Fubm90IGJlIGRldGVybWluZWQgYnkgYW4gYXV0b21hdGljIGNoYW5uZWwgc2VhcmNoLjwvcGFyYT4KKwk8L3NlY3Rpb24+CisJPHNlY3Rpb24gaWQ9ImlzZGItaGllcnEtbGF5ZXJzIj4KKwkJPHRpdGxlPjxjb25zdGFudD5EVFYtSVNEQlQtTEFZRVIqPC9jb25zdGFudD4gcGFyYW1ldGVyczwvdGl0bGU+CisJCTxwYXJhPklTREItVCBjaGFubmVscyBjYW4gYmUgY29kZWQgaGllcmFyY2hpY2FsbHkuIEFzIG9wcG9zZWQgdG8gRFZCLVQgaW4KKwkJCUlTREItVCBoaWVyYXJjaGljYWwgbGF5ZXJzIGNhbiBiZSBkZWNvZGVkIHNpbXVsdGFuZW91c2x5LiBGb3IgdGhhdAorCQkJcmVhc29uIGEgSVNEQi1UIGRlbW9kdWxhdG9yIGhhcyAzIHZpdGVyYmkgYW5kIDMgcmVlZC1zb2xvbW9uLWRlY29kZXJzLjwvcGFyYT4KKwkJPHBhcmE+SVNEQi1UIGhhcyAzIGhpZXJhcmNoaWNhbCBsYXllcnMgd2hpY2ggZWFjaCBjYW4gdXNlIGEgcGFydCBvZiB0aGUKKwkJCWF2YWlsYWJsZSBzZWdtZW50cy4gVGhlIHRvdGFsIG51bWJlciBvZiBzZWdtZW50cyBvdmVyIGFsbCBsYXllcnMgaGFzCisJCQl0byAxMyBpbiBJU0RCLVQuPC9wYXJhPgorCQk8cGFyYT5UaGVyZSBhcmUgMyBwYXJhbWV0ZXIgc2V0cywgZm9yIExheWVycyBBLCBCIGFuZCBDLjwvcGFyYT4KKwkJPHNlY3Rpb24gaWQ9IkRUVi1JU0RCVC1MQVlFUi1FTkFCTEVEIj4KKwkJCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSX0VOQUJMRUQ8L2NvbnN0YW50PjwvdGl0bGU+CisJCQk8cGFyYT5IaWVyYXJjaGljYWwgcmVjZXB0aW9uIGluIElTREItVCBpcyBhY2hpZXZlZCBieSBlbmFibGluZyBvciBkaXNhYmxpbmcKKwkJCQlsYXllcnMgaW4gdGhlIGRlY29kaW5nIHByb2Nlc3MuIFNldHRpbmcgYWxsIGJpdHMgb2YKKwkJCQk8Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSX0VOQUJMRUQ8L2NvbnN0YW50PiB0byAnMScgZm9yY2VzIGFsbCBsYXllcnMgKGlmIGFwcGxpY2FibGUpIHRvIGJlCisJCQkJZGVtb2R1bGF0ZWQuIFRoaXMgaXMgdGhlIGRlZmF1bHQuPC9wYXJhPgorCQkJPHBhcmE+SWYgdGhlIGNoYW5uZWwgaXMgaW4gdGhlIHBhcnRpYWwgcmVjZXB0aW9uIG1vZGUKKwkJCQkoPGNvbnN0YW50PkRUVl9JU0RCVF9QQVJUSUFMX1JFQ0VQVElPTjwvY29uc3RhbnQ+ID0gMSkgdGhlIGNlbnRyYWwgc2VnbWVudCBjYW4gYmUgZGVjb2RlZAorCQkJCWluZGVwZW5kZW50bHkgb2YgdGhlIG90aGVyIDEyIHNlZ21lbnRzLiBJbiB0aGF0IG1vZGUgbGF5ZXIgQSBoYXMgdG8KKwkJCQloYXZlIGEgPGNvbnN0YW50PlNFR01FTlRfQ09VTlQ8L2NvbnN0YW50PiBvZiAxLjwvcGFyYT4KKwkJCTxwYXJhPkluIElTREItVHNiIG9ubHkgbGF5ZXIgQSBpcyB1c2VkLCBpdCBjYW4gYmUgMSBvciAzIGluIElTREItVHNiCisJCQkJYWNjb3JkaW5nIHRvIDxjb25zdGFudD5EVFZfSVNEQlRfUEFSVElBTF9SRUNFUFRJT048L2NvbnN0YW50Pi4gPGNvbnN0YW50PlNFR01FTlRfQ09VTlQ8L2NvbnN0YW50PiBtdXN0IGJlIGZpbGxlZAorCQkJCWFjY29yZGluZ2x5LjwvcGFyYT4KKwkJCTxwYXJhPlBvc3NpYmxlIHZhbHVlczogMHgxLCAweDIsIDB4NCAofC1hYmxlKTwvcGFyYT4KKwkJCTxwYXJhPjxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVJfRU5BQkxFRFswOjBdPC9jb25zdGFudD4gLSBsYXllciBBPC9wYXJhPgorCQkJPHBhcmE+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUl9FTkFCTEVEWzE6MV08L2NvbnN0YW50PiAtIGxheWVyIEI8L3BhcmE+CisJCQk8cGFyYT48Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSX0VOQUJMRURbMjoyXTwvY29uc3RhbnQ+IC0gbGF5ZXIgQzwvcGFyYT4KKwkJCTxwYXJhPjxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVJfRU5BQkxFRFszMTozXTwvY29uc3RhbnQ+IHVudXNlZDwvcGFyYT4KKwkJPC9zZWN0aW9uPgorCQk8c2VjdGlvbiBpZD0iRFRWLUlTREJULUxBWUVSLUZFQyI+CisJCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUipfRkVDPC9jb25zdGFudD48L3RpdGxlPgorCQkJPHBhcmE+UG9zc2libGUgdmFsdWVzOiA8Y29uc3RhbnQ+RkVDX0FVVE88L2NvbnN0YW50PiwgPGNvbnN0YW50PkZFQ18xXzI8L2NvbnN0YW50PiwgPGNvbnN0YW50PkZFQ18yXzM8L2NvbnN0YW50PiwgPGNvbnN0YW50PkZFQ18zXzQ8L2NvbnN0YW50PiwgPGNvbnN0YW50PkZFQ181XzY8L2NvbnN0YW50PiwgPGNvbnN0YW50PkZFQ183Xzg8L2NvbnN0YW50PjwvcGFyYT4KKwkJPC9zZWN0aW9uPgorCQk8c2VjdGlvbiBpZD0iRFRWLUlTREJULUxBWUVSLU1PRFVMQVRJT04iPgorCQkJPHRpdGxlPjxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVIqX01PRFVMQVRJT048L2NvbnN0YW50PjwvdGl0bGU+CisJCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6IDxjb25zdGFudD5RQU1fQVVUTzwvY29uc3RhbnQ+LCBRUDxjb25zdGFudD5TSywgUUFNXzE2PC9jb25zdGFudD4sIDxjb25zdGFudD5RQU1fNjQ8L2NvbnN0YW50PiwgPGNvbnN0YW50PkRRUFNLPC9jb25zdGFudD48L3BhcmE+CisJCQk8cGFyYT5Ob3RlOiBJZiBsYXllciBDIGlzIDxjb25zdGFudD5EUVBTSzwvY29uc3RhbnQ+IGxheWVyIEIgaGFzIHRvIGJlIDxjb25zdGFudD5EUVBTSzwvY29uc3RhbnQ+LiBJZiBsYXllciBCIGlzIDxjb25zdGFudD5EUVBTSzwvY29uc3RhbnQ+CisJCQkJYW5kIDxjb25zdGFudD5EVFZfSVNEQlRfUEFSVElBTF9SRUNFUFRJT048L2NvbnN0YW50Pj0wIGxheWVyIGhhcyB0byBiZSA8Y29uc3RhbnQ+RFFQU0s8L2NvbnN0YW50Pi48L3BhcmE+CisJCTwvc2VjdGlvbj4KKwkJPHNlY3Rpb24gaWQ9IkRUVi1JU0RCVC1MQVlFUi1TRUdNRU5ULUNPVU5UIj4KKwkJCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSKl9TRUdNRU5UX0NPVU5UPC9jb25zdGFudD48L3RpdGxlPgorCQkJPHBhcmE+UG9zc2libGUgdmFsdWVzOiAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgLTEgKEFVVE8pPC9wYXJhPgorCQkJPHBhcmE+Tm90ZTogVHJ1dGggdGFibGUgZm9yIDxjb25zdGFudD5EVFZfSVNEQlRfU09VTkRfQlJPQURDQVNUSU5HPC9jb25zdGFudD4gYW5kCisJCQkJPGNvbnN0YW50PkRUVl9JU0RCVF9QQVJUSUFMX1JFQ0VQVElPTjwvY29uc3RhbnQ+IGFuZCA8Y29uc3RhbnQ+TEFZRVI8L2NvbnN0YW50PipfU0VHTUVOVF9DT1VOVDwvcGFyYT4KKwkJCTxpbmZvcm1hbHRhYmxlIGlkPSJpc2RidC1sYXllcl9zZWctY250LXRhYmxlIj4KKwkJCQk8dGdyb3VwIGNvbHM9IjYiPgorCQkJCQk8dGJvZHk+CisJCQkJCQk8cm93PgorCQkJCQkJCTxlbnRyeT5QUjwvZW50cnk+CisJCQkJCQkJPGVudHJ5PlNCPC9lbnRyeT4KKwkJCQkJCQk8ZW50cnk+TGF5ZXIgQSB3aWR0aDwvZW50cnk+CisJCQkJCQkJPGVudHJ5PkxheWVyIEIgd2lkdGg8L2VudHJ5PgorCQkJCQkJCTxlbnRyeT5MYXllciBDIHdpZHRoPC9lbnRyeT4KKwkJCQkJCQk8ZW50cnk+dG90YWwgd2lkdGg8L2VudHJ5PgorCQkJCQkJPC9yb3c+CisJCQkJCQk8cm93PgorCQkJCQkJCTxlbnRyeT4wPC9lbnRyeT4KKwkJCQkJCQk8ZW50cnk+MDwvZW50cnk+CisJCQkJCQkJPGVudHJ5PjEgLi4gMTM8L2VudHJ5PgorCQkJCQkJCTxlbnRyeT4xIC4uIDEzPC9lbnRyeT4KKwkJCQkJCQk8ZW50cnk+MSAuLiAxMzwvZW50cnk+CisJCQkJCQkJPGVudHJ5PjEzPC9lbnRyeT4KKwkJCQkJCTwvcm93PgorCQkJCQkJPHJvdz4KKwkJCQkJCQk8ZW50cnk+MTwvZW50cnk+CisJCQkJCQkJPGVudHJ5PjA8L2VudHJ5PgorCQkJCQkJCTxlbnRyeT4xPC9lbnRyeT4KKwkJCQkJCQk8ZW50cnk+MSAuLiAxMzwvZW50cnk+CisJCQkJCQkJPGVudHJ5PjEgLi4gMTM8L2VudHJ5PgorCQkJCQkJCTxlbnRyeT4xMzwvZW50cnk+CisJCQkJCQk8L3Jvdz4KKwkJCQkJCTxyb3c+CisJCQkJCQkJPGVudHJ5PjA8L2VudHJ5PgorCQkJCQkJCTxlbnRyeT4xPC9lbnRyeT4KKwkJCQkJCQk8ZW50cnk+MTwvZW50cnk+CisJCQkJCQkJPGVudHJ5PjA8L2VudHJ5PgorCQkJCQkJCTxlbnRyeT4wPC9lbnRyeT4KKwkJCQkJCQk8ZW50cnk+MTwvZW50cnk+CisJCQkJCQk8L3Jvdz4KKwkJCQkJCTxyb3c+CisJCQkJCQkJPGVudHJ5PjE8L2VudHJ5PgorCQkJCQkJCTxlbnRyeT4xPC9lbnRyeT4KKwkJCQkJCQk8ZW50cnk+MTwvZW50cnk+CisJCQkJCQkJPGVudHJ5PjI8L2VudHJ5PgorCQkJCQkJCTxlbnRyeT4wPC9lbnRyeT4KKwkJCQkJCQk8ZW50cnk+MTM8L2VudHJ5PgorCQkJCQkJPC9yb3c+CisJCQkJCTwvdGJvZHk+CisJCQkJPC90Z3JvdXA+CisJCQk8L2luZm9ybWFsdGFibGU+CisJCTwvc2VjdGlvbj4KKwkJPHNlY3Rpb24gaWQ9IkRUVi1JU0RCVC1MQVlFUi1USU1FLUlOVEVSTEVBVklORyI+CisJCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUipfVElNRV9JTlRFUkxFQVZJTkc8L2NvbnN0YW50PjwvdGl0bGU+CisJCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXM6IDAsIDEsIDIsIDMsIC0xIChBVVRPKTwvcGFyYT4KKwkJCTxwYXJhPk5vdGU6IFRoZSByZWFsIGludGVyLWxlYXZlciBkZXB0aC1uYW1lcyBkZXBlbmQgb24gdGhlIG1vZGUgKGZmdC1zaXplKTsgdGhlIHZhbHVlcworCQkJCWhlcmUgYXJlIHJlZmVycmluZyB0byB3aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgVE1DQy1zdHJ1Y3R1cmUgLQorCQkJCWluZGVwZW5kZW50IG9mIHRoZSBtb2RlLjwvcGFyYT4KKwkJPC9zZWN0aW9uPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLUFQSS1WRVJTSU9OIj4KKwk8dGl0bGU+PGNvbnN0YW50PkRUVl9BUElfVkVSU0lPTjwvY29uc3RhbnQ+PC90aXRsZT4KKwk8cGFyYT5SZXR1cm5zIHRoZSBtYWpvci9taW5vciB2ZXJzaW9uIG9mIHRoZSBEVkIgQVBJPC9wYXJhPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLUNPREUtUkFURS1IUCI+CisJPHRpdGxlPjxjb25zdGFudD5EVFZfQ09ERV9SQVRFX0hQPC9jb25zdGFudD48L3RpdGxlPgorCTxwYXJhPlVzZWQgb24gdGVycmVzdHJpYWwgdHJhbnNtaXNzaW9ucy4gVGhlIGFjY2VwdGFibGUgdmFsdWVzIGFyZToKKwk8L3BhcmE+CisJPHByb2dyYW1saXN0aW5nPgordHlwZWRlZiBlbnVtIGZlX2NvZGVfcmF0ZSB7CisJRkVDX05PTkUgPSAwLAorCUZFQ18xXzIsCisJRkVDXzJfMywKKwlGRUNfM180LAorCUZFQ180XzUsCisJRkVDXzVfNiwKKwlGRUNfNl83LAorCUZFQ183XzgsCisJRkVDXzhfOSwKKwlGRUNfQVVUTywKKwlGRUNfM181LAorCUZFQ185XzEwLAorfSBmZV9jb2RlX3JhdGVfdDsKKwk8L3Byb2dyYW1saXN0aW5nPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLUNPREUtUkFURS1MUCI+CisJPHRpdGxlPjxjb25zdGFudD5EVFZfQ09ERV9SQVRFX0xQPC9jb25zdGFudD48L3RpdGxlPgorCTxwYXJhPlVzZWQgb24gdGVycmVzdHJpYWwgdHJhbnNtaXNzaW9ucy4gVGhlIGFjY2VwdGFibGUgdmFsdWVzIGFyZToKKwk8L3BhcmE+CisJPHByb2dyYW1saXN0aW5nPgordHlwZWRlZiBlbnVtIGZlX2NvZGVfcmF0ZSB7CisJRkVDX05PTkUgPSAwLAorCUZFQ18xXzIsCisJRkVDXzJfMywKKwlGRUNfM180LAorCUZFQ180XzUsCisJRkVDXzVfNiwKKwlGRUNfNl83LAorCUZFQ183XzgsCisJRkVDXzhfOSwKKwlGRUNfQVVUTywKKwlGRUNfM181LAorCUZFQ185XzEwLAorfSBmZV9jb2RlX3JhdGVfdDsKKwk8L3Byb2dyYW1saXN0aW5nPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLUdVQVJELUlOVEVSVkFMIj4KKwkJPHRpdGxlPjxjb25zdGFudD5EVFZfR1VBUkRfSU5URVJWQUw8L2NvbnN0YW50PjwvdGl0bGU+CisKKwkJPHBhcmE+UG9zc2libGUgdmFsdWVzIGFyZTo8L3BhcmE+Cis8cHJvZ3JhbWxpc3Rpbmc+Cit0eXBlZGVmIGVudW0gZmVfZ3VhcmRfaW50ZXJ2YWwgeworCUdVQVJEX0lOVEVSVkFMXzFfMzIsCisJR1VBUkRfSU5URVJWQUxfMV8xNiwKKwlHVUFSRF9JTlRFUlZBTF8xXzgsCisJR1VBUkRfSU5URVJWQUxfMV80LAorCUdVQVJEX0lOVEVSVkFMX0FVVE8sCisJR1VBUkRfSU5URVJWQUxfMV8xMjgsCisJR1VBUkRfSU5URVJWQUxfMTlfMTI4LAorCUdVQVJEX0lOVEVSVkFMXzE5XzI1NiwKK30gZmVfZ3VhcmRfaW50ZXJ2YWxfdDsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisKKwkJPHBhcmE+Tm90ZXM6PC9wYXJhPgorCQk8cGFyYT4xKSBJZiA8Y29uc3RhbnQ+RFRWX0dVQVJEX0lOVEVSVkFMPC9jb25zdGFudD4gaXMgc2V0IHRoZSA8Y29uc3RhbnQ+R1VBUkRfSU5URVJWQUxfQVVUTzwvY29uc3RhbnQ+IHRoZSBoYXJkd2FyZSB3aWxsCisJCQl0cnkgdG8gZmluZCB0aGUgY29ycmVjdCBndWFyZCBpbnRlcnZhbCAoaWYgY2FwYWJsZSkgYW5kIHdpbGwgdXNlIFRNQ0MgdG8gZmlsbAorCQkJaW4gdGhlIG1pc3NpbmcgcGFyYW1ldGVycy48L3BhcmE+CisJCTxwYXJhPjIpIEludGVydmFscyAxLzEyOCwgMTkvMTI4IGFuZCAxOS8yNTYgYXJlIHVzZWQgb25seSBmb3IgRFZCLVQyIGF0IHByZXNlbnQ8L3BhcmE+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtVFJBTlNNSVNTSU9OLU1PREUiPgorCQk8dGl0bGU+PGNvbnN0YW50PkRUVl9UUkFOU01JU1NJT05fTU9ERTwvY29uc3RhbnQ+PC90aXRsZT4KKworCQk8cGFyYT5TcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjYXJyaWVycyB1c2VkIGJ5IHRoZSBzdGFuZGFyZDwvcGFyYT4KKworCQk8cGFyYT5Qb3NzaWJsZSB2YWx1ZXMgYXJlOjwvcGFyYT4KKzxwcm9ncmFtbGlzdGluZz4KK3R5cGVkZWYgZW51bSBmZV90cmFuc21pdF9tb2RlIHsKKwlUUkFOU01JU1NJT05fTU9ERV8ySywKKwlUUkFOU01JU1NJT05fTU9ERV84SywKKwlUUkFOU01JU1NJT05fTU9ERV9BVVRPLAorCVRSQU5TTUlTU0lPTl9NT0RFXzRLLAorCVRSQU5TTUlTU0lPTl9NT0RFXzFLLAorCVRSQU5TTUlTU0lPTl9NT0RFXzE2SywKKwlUUkFOU01JU1NJT05fTU9ERV8zMkssCit9IGZlX3RyYW5zbWl0X21vZGVfdDsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisJCTxwYXJhPk5vdGVzOjwvcGFyYT4KKwkJPHBhcmE+MSkgSVNEQi1UIHN1cHBvcnRzIHRocmVlIGNhcnJpZXIvc3ltYm9sLXNpemU6IDhLLCA0SywgMksuIEl0IGlzIGNhbGxlZAorCQkJJ21vZGUnIGluIHRoZSBzdGFuZGFyZDogTW9kZSAxIGlzIDJLLCBtb2RlIDIgaXMgNEssIG1vZGUgMyBpcyA4SzwvcGFyYT4KKworCQk8cGFyYT4yKSBJZiA8Y29uc3RhbnQ+RFRWX1RSQU5TTUlTU0lPTl9NT0RFPC9jb25zdGFudD4gaXMgc2V0IHRoZSA8Y29uc3RhbnQ+VFJBTlNNSVNTSU9OX01PREVfQVVUTzwvY29uc3RhbnQ+IHRoZQorCQkJaGFyZHdhcmUgd2lsbCB0cnkgdG8gZmluZCB0aGUgY29ycmVjdCBGRlQtc2l6ZSAoaWYgY2FwYWJsZSkgYW5kIHdpbGwKKwkJCXVzZSBUTUNDIHRvIGZpbGwgaW4gdGhlIG1pc3NpbmcgcGFyYW1ldGVycy48L3BhcmE+CisJCTxwYXJhPjMpIERWQi1UIHNwZWNpZmllcyAySyBhbmQgOEsgYXMgdmFsaWQgc2l6ZXMuPC9wYXJhPgorCQk8cGFyYT40KSBEVkItVDIgc3BlY2lmaWVzIDFLLCAySywgNEssIDhLLCAxNksgYW5kIDMySy48L3BhcmE+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtSElFUkFSQ0hZIj4KKwk8dGl0bGU+PGNvbnN0YW50PkRUVl9ISUVSQVJDSFk8L2NvbnN0YW50PjwvdGl0bGU+CisJPHBhcmE+RnJvbnRlbmQgaGllcmFyY2h5PC9wYXJhPgorCTxwcm9ncmFtbGlzdGluZz4KK3R5cGVkZWYgZW51bSBmZV9oaWVyYXJjaHkgeworCSBISUVSQVJDSFlfTk9ORSwKKwkgSElFUkFSQ0hZXzEsCisJIEhJRVJBUkNIWV8yLAorCSBISUVSQVJDSFlfNCwKKwkgSElFUkFSQ0hZX0FVVE8KKyB9IGZlX2hpZXJhcmNoeV90OworCTwvcHJvZ3JhbWxpc3Rpbmc+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJEVFYtSVNEQlMtVFMtSUQiPgorCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0lTREJTX1RTX0lEPC9jb25zdGFudD48L3RpdGxlPgorCTxwYXJhPkN1cnJlbnRseSB1bnVzZWQuPC9wYXJhPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iRFRWLURWQlQyLVBMUC1JRCI+CisJCTx0aXRsZT48Y29uc3RhbnQ+RFRWX0RWQlQyX1BMUF9JRDwvY29uc3RhbnQ+PC90aXRsZT4KKwkJPHBhcmE+RFZCLVQyIHN1cHBvcnRzIFBoeXNpY2FsIExheWVyIFBpcGVzIChQTFApIHRvIGFsbG93IHRyYW5zbWlzc2lvbiBvZgorCQkJbWFueSBkYXRhIHR5cGVzIHZpYSBhIHNpbmdsZSBtdWx0aXBsZXguIFRoZSBBUEkgd2lsbCBzb29uIHN1cHBvcnQgdGhpcworCQkJYXQgd2hpY2ggcG9pbnQgdGhpcyBzZWN0aW9uIHdpbGwgYmUgZXhwYW5kZWQuPC9wYXJhPgorCTwvc2VjdGlvbj4KKzwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iZnJvbnRlbmQtcHJvcGVydHktdGVycmVzdHJpYWwtc3lzdGVtcyI+CisJPHRpdGxlPlByb3BlcnRpZXMgdXNlZCBvbiB0ZXJyZXN0cmlhbCBkZWxpdmVyeSBzeXN0ZW1zPC90aXRsZT4KKwkJPHNlY3Rpb24gaWQ9ImR2YnQtcGFyYW1zIj4KKwkJCTx0aXRsZT5EVkItVCBkZWxpdmVyeSBzeXN0ZW08L3RpdGxlPgorCQkJPHBhcmE+VGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSB2YWxpZCBmb3IgRFZCLVQ6PC9wYXJhPgorCQkJPGl0ZW1pemVkbGlzdCBtYXJrPSdvcGVuY2lyY2xlJz4KKwkJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUFQSS1WRVJTSU9OIj48Y29uc3RhbnQ+RFRWX0FQSV9WRVJTSU9OPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1ERUxJVkVSWS1TWVNURU0iPjxjb25zdGFudD5EVFZfREVMSVZFUllfU1lTVEVNPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1UVU5FIj48Y29uc3RhbnQ+RFRWX1RVTkU8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUNMRUFSIj48Y29uc3RhbnQ+RFRWX0NMRUFSPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1GUkVRVUVOQ1kiPjxjb25zdGFudD5EVFZfRlJFUVVFTkNZPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1NT0RVTEFUSU9OIj48Y29uc3RhbnQ+RFRWX01PRFVMQVRJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUJBTkRXSURUSC1IWiI+PGNvbnN0YW50PkRUVl9CQU5EV0lEVEhfSFo8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlOVkVSU0lPTiI+PGNvbnN0YW50PkRUVl9JTlZFUlNJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUNPREUtUkFURS1IUCI+PGNvbnN0YW50PkRUVl9DT0RFX1JBVEVfSFA8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUNPREUtUkFURS1MUCI+PGNvbnN0YW50PkRUVl9DT0RFX1JBVEVfTFA8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUdVQVJELUlOVEVSVkFMIj48Y29uc3RhbnQ+RFRWX0dVQVJEX0lOVEVSVkFMPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1UUkFOU01JU1NJT04tTU9ERSI+PGNvbnN0YW50PkRUVl9UUkFOU01JU1NJT05fTU9ERTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSElFUkFSQ0hZIj48Y29uc3RhbnQ+RFRWX0hJRVJBUkNIWTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPC9pdGVtaXplZGxpc3Q+CisJCTwvc2VjdGlvbj4KKwkJPHNlY3Rpb24gaWQ9ImR2YnQyLXBhcmFtcyI+CisJCQk8dGl0bGU+RFZCLVQyIGRlbGl2ZXJ5IHN5c3RlbTwvdGl0bGU+CisJCQk8cGFyYT5EVkItVDIgc3VwcG9ydCBpcyBjdXJyZW50bHkgaW4gdGhlIGVhcmx5IHN0YWdlcworCQkJb2YgZGV2ZWxvcG1lbnQsIHNvIGV4cGVjdCB0aGF0IHRoaXMgc2VjdGlvbiBtYXlncm93IGFuZCBiZWNvbWUKKwkJCW1vcmUgZGV0YWlsZWQgd2l0aCB0aW1lLjwvcGFyYT4KKwkJPHBhcmE+VGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSB2YWxpZCBmb3IgRFZCLVQyOjwvcGFyYT4KKwkJPGl0ZW1pemVkbGlzdCBtYXJrPSdvcGVuY2lyY2xlJz4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQVBJLVZFUlNJT04iPjxjb25zdGFudD5EVFZfQVBJX1ZFUlNJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtREVMSVZFUlktU1lTVEVNIj48Y29uc3RhbnQ+RFRWX0RFTElWRVJZX1NZU1RFTTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1UVU5FIj48Y29uc3RhbnQ+RFRWX1RVTkU8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQ0xFQVIiPjxjb25zdGFudD5EVFZfQ0xFQVI8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtRlJFUVVFTkNZIj48Y29uc3RhbnQ+RFRWX0ZSRVFVRU5DWTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1NT0RVTEFUSU9OIj48Y29uc3RhbnQ+RFRWX01PRFVMQVRJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQkFORFdJRFRILUhaIj48Y29uc3RhbnQ+RFRWX0JBTkRXSURUSF9IWjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1JTlZFUlNJT04iPjxjb25zdGFudD5EVFZfSU5WRVJTSU9OPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUNPREUtUkFURS1IUCI+PGNvbnN0YW50PkRUVl9DT0RFX1JBVEVfSFA8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQ09ERS1SQVRFLUxQIj48Y29uc3RhbnQ+RFRWX0NPREVfUkFURV9MUDwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1HVUFSRC1JTlRFUlZBTCI+PGNvbnN0YW50PkRUVl9HVUFSRF9JTlRFUlZBTDwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1UUkFOU01JU1NJT04tTU9ERSI+PGNvbnN0YW50PkRUVl9UUkFOU01JU1NJT05fTU9ERTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1ISUVSQVJDSFkiPjxjb25zdGFudD5EVFZfSElFUkFSQ0hZPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLURWQlQyLVBMUC1JRCI+PGNvbnN0YW50PkRUVl9EVkJUMl9QTFBfSUQ8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJPC9pdGVtaXplZGxpc3Q+CisJCTwvc2VjdGlvbj4KKwkJPHNlY3Rpb24gaWQ9ImlzZGJ0Ij4KKwkJPHRpdGxlPklTREItVCBkZWxpdmVyeSBzeXN0ZW08L3RpdGxlPgorCQk8cGFyYT5UaGlzIElTREItVC9JU0RCLVRzYiBBUEkgZXh0ZW5zaW9uIHNob3VsZCByZWZsZWN0IGFsbCBpbmZvcm1hdGlvbgorCQkJbmVlZGVkIHRvIHR1bmUgYW55IElTREItVC9JU0RCLVRzYiBoYXJkd2FyZS4gT2YgY291cnNlIGl0IGlzIHBvc3NpYmxlCisJCQl0aGF0IHNvbWUgdmVyeSBzb3BoaXN0aWNhdGVkIGRldmljZXMgd29uJ3QgbmVlZCBjZXJ0YWluIHBhcmFtZXRlcnMgdG8KKwkJCXR1bmUuPC9wYXJhPgorCQk8cGFyYT5UaGUgaW5mb3JtYXRpb24gZ2l2ZW4gaGVyZSBzaG91bGQgaGVscCBhcHBsaWNhdGlvbiB3cml0ZXJzIHRvIGtub3cgaG93CisJCQl0byBoYW5kbGUgSVNEQi1UIGFuZCBJU0RCLVRzYiBoYXJkd2FyZSB1c2luZyB0aGUgTGludXggRFZCLUFQSS48L3BhcmE+CisJCTxwYXJhPlRoZSBkZXRhaWxzIGdpdmVuIGhlcmUgYWJvdXQgSVNEQi1UIGFuZCBJU0RCLVRzYiBhcmUganVzdCBlbm91Z2ggdG8KKwkJCWJhc2ljYWxseSBzaG93IHRoZSBkZXBlbmRlbmNpZXMgYmV0d2VlbiB0aGUgbmVlZGVkIHBhcmFtZXRlciB2YWx1ZXMsCisJCQlidXQgc3VyZWx5IHNvbWUgaW5mb3JtYXRpb24gaXMgbGVmdCBvdXQuIEZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uCisJCQlzZWUgdGhlIGZvbGxvd2luZyBkb2N1bWVudHM6PC9wYXJhPgorCQk8cGFyYT5BUklCIFNURC1CMzEgLSAiVHJhbnNtaXNzaW9uIFN5c3RlbSBmb3IgRGlnaXRhbCBUZXJyZXN0cmlhbAorCQkJVGVsZXZpc2lvbiBCcm9hZGNhc3RpbmciIGFuZDwvcGFyYT4KKwkJPHBhcmE+QVJJQiBUUi1CMTQgLSAiT3BlcmF0aW9uYWwgR3VpZGVsaW5lcyBmb3IgRGlnaXRhbCBUZXJyZXN0cmlhbAorCQkJVGVsZXZpc2lvbiBCcm9hZGNhc3RpbmciLjwvcGFyYT4KKwkJPHBhcmE+SW4gb3JkZXIgdG8gdW5kZXJzdGFuZCB0aGUgSVNEQiBzcGVjaWZpYyBwYXJhbWV0ZXJzLAorCQkJb25lIGhhcyB0byBoYXZlIHNvbWUga25vd2xlZGdlIHRoZSBjaGFubmVsIHN0cnVjdHVyZSBpbgorCQkJSVNEQi1UIGFuZCBJU0RCLVRzYi4gSS5lLiBpdCBoYXMgdG8gYmUga25vd24gdG8KKwkJCXRoZSByZWFkZXIgdGhhdCBhbiBJU0RCLVQgY2hhbm5lbCBjb25zaXN0cyBvZiAxMyBzZWdtZW50cywKKwkJCXRoYXQgaXQgY2FuIGhhdmUgdXAgdG8gMyBsYXllciBzaGFyaW5nIHRob3NlIHNlZ21lbnRzLAorCQkJYW5kIHRoaW5ncyBsaWtlIHRoYXQuPC9wYXJhPgorCQk8cGFyYT5UaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIHZhbGlkIGZvciBJU0RCLVQ6PC9wYXJhPgorCQk8aXRlbWl6ZWRsaXN0IG1hcms9J29wZW5jaXJjbGUnPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1BUEktVkVSU0lPTiI+PGNvbnN0YW50PkRUVl9BUElfVkVSU0lPTjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1ERUxJVkVSWS1TWVNURU0iPjxjb25zdGFudD5EVFZfREVMSVZFUllfU1lTVEVNPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLVRVTkUiPjxjb25zdGFudD5EVFZfVFVORTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1DTEVBUiI+PGNvbnN0YW50PkRUVl9DTEVBUjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1GUkVRVUVOQ1kiPjxjb25zdGFudD5EVFZfRlJFUVVFTkNZPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLU1PRFVMQVRJT04iPjxjb25zdGFudD5EVFZfTU9EVUxBVElPTjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1CQU5EV0lEVEgtSFoiPjxjb25zdGFudD5EVFZfQkFORFdJRFRIX0haPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlOVkVSU0lPTiI+PGNvbnN0YW50PkRUVl9JTlZFUlNJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQ09ERS1SQVRFLUhQIj48Y29uc3RhbnQ+RFRWX0NPREVfUkFURV9IUDwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1DT0RFLVJBVEUtTFAiPjxjb25zdGFudD5EVFZfQ09ERV9SQVRFX0xQPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUdVQVJELUlOVEVSVkFMIj48Y29uc3RhbnQ+RFRWX0dVQVJEX0lOVEVSVkFMPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLVRSQU5TTUlTU0lPTi1NT0RFIj48Y29uc3RhbnQ+RFRWX1RSQU5TTUlTU0lPTl9NT0RFPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUhJRVJBUkNIWSI+PGNvbnN0YW50PkRUVl9ISUVSQVJDSFk8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSVNEQlQtTEFZRVItRU5BQkxFRCI+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUl9FTkFCTEVEPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlTREJULVBBUlRJQUwtUkVDRVBUSU9OIj48Y29uc3RhbnQ+RFRWX0lTREJUX1BBUlRJQUxfUkVDRVBUSU9OPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlTREJULVNPVU5ELUJST0FEQ0FTVElORyI+PGNvbnN0YW50PkRUVl9JU0RCVF9TT1VORF9CUk9BRENBU1RJTkc8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSVNEQlQtU0ItU1VCQ0hBTk5FTC1JRCI+PGNvbnN0YW50PkRUVl9JU0RCVF9TQl9TVUJDSEFOTkVMX0lEPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlTREJULVNCLVNFR01FTlQtSURYIj48Y29uc3RhbnQ+RFRWX0lTREJUX1NCX1NFR01FTlRfSURYPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlTREJULVNCLVNFR01FTlQtQ09VTlQiPjxjb25zdGFudD5EVFZfSVNEQlRfU0JfU0VHTUVOVF9DT1VOVDwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1JU0RCVC1MQVlFUi1GRUMiPjxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVJBX0ZFQzwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1JU0RCVC1MQVlFUi1NT0RVTEFUSU9OIj48Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSQV9NT0RVTEFUSU9OPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlTREJULUxBWUVSLVNFR01FTlQtQ09VTlQiPjxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVJBX1NFR01FTlRfQ09VTlQ8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSVNEQlQtTEFZRVItVElNRS1JTlRFUkxFQVZJTkciPjxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVJBX1RJTUVfSU5URVJMRUFWSU5HPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlTREJULUxBWUVSLUZFQyI+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUkJfRkVDPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlTREJULUxBWUVSLU1PRFVMQVRJT04iPjxjb25zdGFudD5EVFZfSVNEQlRfTEFZRVJCX01PRFVMQVRJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSVNEQlQtTEFZRVItU0VHTUVOVC1DT1VOVCI+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUkJfU0VHTUVOVF9DT1VOVDwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1JU0RCVC1MQVlFUi1USU1FLUlOVEVSTEVBVklORyI+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUkJfVElNRV9JTlRFUkxFQVZJTkc8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSVNEQlQtTEFZRVItRkVDIj48Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSQ19GRUM8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtSVNEQlQtTEFZRVItTU9EVUxBVElPTiI+PGNvbnN0YW50PkRUVl9JU0RCVF9MQVlFUkNfTU9EVUxBVElPTjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1JU0RCVC1MQVlFUi1TRUdNRU5ULUNPVU5UIj48Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSQ19TRUdNRU5UX0NPVU5UPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlTREJULUxBWUVSLVRJTUUtSU5URVJMRUFWSU5HIj48Y29uc3RhbnQ+RFRWX0lTREJUX0xBWUVSQ19USU1FX0lOVEVSTEVBVklORzwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQk8L2l0ZW1pemVkbGlzdD4KKwkJPC9zZWN0aW9uPgorCQk8c2VjdGlvbiBpZD0iYXRzYy1wYXJhbXMiPgorCQkJPHRpdGxlPkFUU0MgZGVsaXZlcnkgc3lzdGVtPC90aXRsZT4KKwkJCTxwYXJhPlRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgdmFsaWQgZm9yIEFUU0M6PC9wYXJhPgorCQkJPGl0ZW1pemVkbGlzdCBtYXJrPSdvcGVuY2lyY2xlJz4KKwkJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUFQSS1WRVJTSU9OIj48Y29uc3RhbnQ+RFRWX0FQSV9WRVJTSU9OPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1ERUxJVkVSWS1TWVNURU0iPjxjb25zdGFudD5EVFZfREVMSVZFUllfU1lTVEVNPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1UVU5FIj48Y29uc3RhbnQ+RFRWX1RVTkU8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUNMRUFSIj48Y29uc3RhbnQ+RFRWX0NMRUFSPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1GUkVRVUVOQ1kiPjxjb25zdGFudD5EVFZfRlJFUVVFTkNZPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1NT0RVTEFUSU9OIj48Y29uc3RhbnQ+RFRWX01PRFVMQVRJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUJBTkRXSURUSC1IWiI+PGNvbnN0YW50PkRUVl9CQU5EV0lEVEhfSFo8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTwvaXRlbWl6ZWRsaXN0PgorCQk8L3NlY3Rpb24+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJmcm9udGVuZC1wcm9wZXJ0eS1jYWJsZS1zeXN0ZW1zIj4KKwk8dGl0bGU+UHJvcGVydGllcyB1c2VkIG9uIGNhYmxlIGRlbGl2ZXJ5IHN5c3RlbXM8L3RpdGxlPgorCTxzZWN0aW9uIGlkPSJkdmJjLXBhcmFtcyI+CisJCTx0aXRsZT5EVkItQyBkZWxpdmVyeSBzeXN0ZW08L3RpdGxlPgorCQk8cGFyYT5UaGUgRFZCLUMgQW5uZXgtQS9DIGlzIHRoZSB3aWRlbHkgdXNlZCBjYWJsZSBzdGFuZGFyZC4gVHJhbnNtaXNzaW9uIHVzZXMgUUFNIG1vZHVsYXRpb24uPC9wYXJhPgorCQk8cGFyYT5UaGUgZm9sbG93aW5nIHBhcmFtZXRlcnMgYXJlIHZhbGlkIGZvciBEVkItQyBBbm5leCBBL0M6PC9wYXJhPgorCQk8aXRlbWl6ZWRsaXN0IG1hcms9J29wZW5jaXJjbGUnPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1BUEktVkVSU0lPTiI+PGNvbnN0YW50PkRUVl9BUElfVkVSU0lPTjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1ERUxJVkVSWS1TWVNURU0iPjxjb25zdGFudD5EVFZfREVMSVZFUllfU1lTVEVNPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLVRVTkUiPjxjb25zdGFudD5EVFZfVFVORTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1DTEVBUiI+PGNvbnN0YW50PkRUVl9DTEVBUjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1GUkVRVUVOQ1kiPjxjb25zdGFudD5EVFZfRlJFUVVFTkNZPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLU1PRFVMQVRJT04iPjxjb25zdGFudD5EVFZfTU9EVUxBVElPTjwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1JTlZFUlNJT04iPjxjb25zdGFudD5EVFZfSU5WRVJTSU9OPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLVNZTUJPTC1SQVRFIj48Y29uc3RhbnQ+RFRWX1NZTUJPTF9SQVRFPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlOTkVSLUZFQyI+PGNvbnN0YW50PkRUVl9JTk5FUl9GRUM8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJPC9pdGVtaXplZGxpc3Q+CisJPC9zZWN0aW9uPgorCTxzZWN0aW9uIGlkPSJkdmJjLWFubmV4LWItcGFyYW1zIj4KKwkJPHRpdGxlPkRWQi1DIEFubmV4IEIgZGVsaXZlcnkgc3lzdGVtPC90aXRsZT4KKwkJPHBhcmE+VGhlIERWQi1DIEFubmV4LUIgaXMgb25seSB1c2VkIG9uIGEgZmV3IENvdW50cmllcyBsaWtlIHRoZSBVbml0ZWQgU3RhdGVzLjwvcGFyYT4KKwkJPHBhcmE+VGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSB2YWxpZCBmb3IgRFZCLUMgQW5uZXggQjo8L3BhcmE+CisJCTxpdGVtaXplZGxpc3QgbWFyaz0nb3BlbmNpcmNsZSc+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUFQSS1WRVJTSU9OIj48Y29uc3RhbnQ+RFRWX0FQSV9WRVJTSU9OPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLURFTElWRVJZLVNZU1RFTSI+PGNvbnN0YW50PkRUVl9ERUxJVkVSWV9TWVNURU08L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtVFVORSI+PGNvbnN0YW50PkRUVl9UVU5FPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUNMRUFSIj48Y29uc3RhbnQ+RFRWX0NMRUFSPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUZSRVFVRU5DWSI+PGNvbnN0YW50PkRUVl9GUkVRVUVOQ1k8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtTU9EVUxBVElPTiI+PGNvbnN0YW50PkRUVl9NT0RVTEFUSU9OPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlOVkVSU0lPTiI+PGNvbnN0YW50PkRUVl9JTlZFUlNJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJPC9pdGVtaXplZGxpc3Q+CisJPC9zZWN0aW9uPgorCTwvc2VjdGlvbj4KKwk8c2VjdGlvbiBpZD0iZnJvbnRlbmQtcHJvcGVydHktc2F0ZWxsaXRhbC1zeXN0ZW1zIj4KKwk8dGl0bGU+UHJvcGVydGllcyB1c2VkIG9uIHNhdGVsbGl0YWwgZGVsaXZlcnkgc3lzdGVtczwvdGl0bGU+CisJPHNlY3Rpb24gaWQ9ImR2YnMtcGFyYW1zIj4KKwkJPHRpdGxlPkRWQi1TIGRlbGl2ZXJ5IHN5c3RlbTwvdGl0bGU+CisJCTxwYXJhPlRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgdmFsaWQgZm9yIERWQi1TOjwvcGFyYT4KKwkJPGl0ZW1pemVkbGlzdCBtYXJrPSdvcGVuY2lyY2xlJz4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQVBJLVZFUlNJT04iPjxjb25zdGFudD5EVFZfQVBJX1ZFUlNJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtREVMSVZFUlktU1lTVEVNIj48Y29uc3RhbnQ+RFRWX0RFTElWRVJZX1NZU1RFTTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1UVU5FIj48Y29uc3RhbnQ+RFRWX1RVTkU8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQ0xFQVIiPjxjb25zdGFudD5EVFZfQ0xFQVI8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtRlJFUVVFTkNZIj48Y29uc3RhbnQ+RFRWX0ZSRVFVRU5DWTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1JTlZFUlNJT04iPjxjb25zdGFudD5EVFZfSU5WRVJTSU9OPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLVNZTUJPTC1SQVRFIj48Y29uc3RhbnQ+RFRWX1NZTUJPTF9SQVRFPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlOTkVSLUZFQyI+PGNvbnN0YW50PkRUVl9JTk5FUl9GRUM8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJPC9pdGVtaXplZGxpc3Q+CisJCTxwYXJhPkZ1dHVyZSBpbXBsZW1lbnRhdGlvbnMgbWlnaHQgYWRkIHRob3NlIHR3byBtaXNzaW5nIHBhcmFtZXRlcnM6PC9wYXJhPgorCQk8aXRlbWl6ZWRsaXN0IG1hcms9J29wZW5jaXJjbGUnPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1ESVNFUUMtTUFTVEVSIj48Y29uc3RhbnQ+RFRWX0RJU0VRQ19NQVNURVI8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtRElTRVFDLVNMQVZFLVJFUExZIj48Y29uc3RhbnQ+RFRWX0RJU0VRQ19TTEFWRV9SRVBMWTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQk8L2l0ZW1pemVkbGlzdD4KKwk8L3NlY3Rpb24+CisJPHNlY3Rpb24gaWQ9ImR2YnMyLXBhcmFtcyI+CisJCTx0aXRsZT5EVkItUzIgZGVsaXZlcnkgc3lzdGVtPC90aXRsZT4KKwkJPHBhcmE+VGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSB2YWxpZCBmb3IgRFZCLVMyOjwvcGFyYT4KKwkJPGl0ZW1pemVkbGlzdCBtYXJrPSdvcGVuY2lyY2xlJz4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQVBJLVZFUlNJT04iPjxjb25zdGFudD5EVFZfQVBJX1ZFUlNJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtREVMSVZFUlktU1lTVEVNIj48Y29uc3RhbnQ+RFRWX0RFTElWRVJZX1NZU1RFTTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1UVU5FIj48Y29uc3RhbnQ+RFRWX1RVTkU8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQ0xFQVIiPjxjb25zdGFudD5EVFZfQ0xFQVI8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtRlJFUVVFTkNZIj48Y29uc3RhbnQ+RFRWX0ZSRVFVRU5DWTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1JTlZFUlNJT04iPjxjb25zdGFudD5EVFZfSU5WRVJTSU9OPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLVNZTUJPTC1SQVRFIj48Y29uc3RhbnQ+RFRWX1NZTUJPTF9SQVRFPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlOTkVSLUZFQyI+PGNvbnN0YW50PkRUVl9JTk5FUl9GRUM8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtVk9MVEFHRSI+PGNvbnN0YW50PkRUVl9WT0xUQUdFPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLVRPTkUiPjxjb25zdGFudD5EVFZfVE9ORTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1QSUxPVCI+PGNvbnN0YW50PkRUVl9QSUxPVDwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1ST0xMT0ZGIj48Y29uc3RhbnQ+RFRWX1JPTExPRkY8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJPC9pdGVtaXplZGxpc3Q+CisJCTxwYXJhPkZ1dHVyZSBpbXBsZW1lbnRhdGlvbnMgbWlnaHQgYWRkIHRob3NlIHR3byBtaXNzaW5nIHBhcmFtZXRlcnM6PC9wYXJhPgorCQk8aXRlbWl6ZWRsaXN0IG1hcms9J29wZW5jaXJjbGUnPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1ESVNFUUMtTUFTVEVSIj48Y29uc3RhbnQ+RFRWX0RJU0VRQ19NQVNURVI8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtRElTRVFDLVNMQVZFLVJFUExZIj48Y29uc3RhbnQ+RFRWX0RJU0VRQ19TTEFWRV9SRVBMWTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQk8L2l0ZW1pemVkbGlzdD4KKwk8L3NlY3Rpb24+CisJPHNlY3Rpb24gaWQ9ImlzZGJzLXBhcmFtcyI+CisJCTx0aXRsZT5JU0RCLVMgZGVsaXZlcnkgc3lzdGVtPC90aXRsZT4KKwkJPHBhcmE+VGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGFyZSB2YWxpZCBmb3IgSVNEQi1TOjwvcGFyYT4KKwkJPGl0ZW1pemVkbGlzdCBtYXJrPSdvcGVuY2lyY2xlJz4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQVBJLVZFUlNJT04iPjxjb25zdGFudD5EVFZfQVBJX1ZFUlNJT048L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtREVMSVZFUlktU1lTVEVNIj48Y29uc3RhbnQ+RFRWX0RFTElWRVJZX1NZU1RFTTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1UVU5FIj48Y29uc3RhbnQ+RFRWX1RVTkU8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtQ0xFQVIiPjxjb25zdGFudD5EVFZfQ0xFQVI8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtRlJFUVVFTkNZIj48Y29uc3RhbnQ+RFRWX0ZSRVFVRU5DWTwvY29uc3RhbnQ+PC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorCQkJPGxpc3RpdGVtPjxwYXJhPjxsaW5rIGxpbmtlbmQ9IkRUVi1JTlZFUlNJT04iPjxjb25zdGFudD5EVFZfSU5WRVJTSU9OPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLVNZTUJPTC1SQVRFIj48Y29uc3RhbnQ+RFRWX1NZTUJPTF9SQVRFPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlOTkVSLUZFQyI+PGNvbnN0YW50PkRUVl9JTk5FUl9GRUM8L2NvbnN0YW50PjwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKwkJCTxsaXN0aXRlbT48cGFyYT48bGluayBsaW5rZW5kPSJEVFYtVk9MVEFHRSI+PGNvbnN0YW50PkRUVl9WT0xUQUdFPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCQk8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgbGlua2VuZD0iRFRWLUlTREJTLVRTLUlEIj48Y29uc3RhbnQ+RFRWX0lTREJTX1RTX0lEPC9jb25zdGFudD48L2xpbms+PC9wYXJhPjwvbGlzdGl0ZW0+CisJCTwvaXRlbWl6ZWRsaXN0PgorCTwvc2VjdGlvbj4KKwk8L3NlY3Rpb24+Cis8L3NlY3Rpb24+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2R2YnN0Yi5wZGYgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2R2YnN0Yi5wZGYKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZHZic3RiLnBkZgpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9kdmJzdGIucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZXhhbXBsZXMueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9leGFtcGxlcy54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay9kdmIvZXhhbXBsZXMueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2V4YW1wbGVzLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9mcm9udGVuZC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2Zyb250ZW5kLnhtbApzaW1pbGFyaXR5IGluZGV4IDc1JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2Zyb250ZW5kLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9mcm9udGVuZC54bWwKaW5kZXggNjBjNjk3Ni4uNjE0MDdlYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9mcm9udGVuZC54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9mcm9udGVuZC54bWwKQEAgLTIwLDIyICsyMCw1MiBAQAogPHNlY3Rpb24gaWQ9ImZyb250ZW5kX3R5cGVzIj4KIDx0aXRsZT5Gcm9udGVuZCBEYXRhIFR5cGVzPC90aXRsZT4KIAotPHNlY3Rpb24gaWQ9ImZyb250ZW5kX3R5cGUiPgotPHRpdGxlPmZyb250ZW5kIHR5cGU8L3RpdGxlPgorPHNlY3Rpb24gaWQ9ImZlLXR5cGUtdCI+Cis8dGl0bGU+RnJvbnRlbmQgdHlwZTwvdGl0bGU+CiAKLTxwYXJhPkZvciBoaXN0b3JpY2FsIHJlYXNvbnMgZnJvbnRlbmQgdHlwZXMgYXJlIG5hbWVkIGFmdGVyIHRoZSB0eXBlIG9mIG1vZHVsYXRpb24gdXNlZCBpbgotdHJhbnNtaXNzaW9uLjwvcGFyYT4KLTxwcm9ncmFtbGlzdGluZz4KLQl0eXBlZGVmIGVudW0gZmVfdHlwZSB7Ci0JRkVfUVBTSywgICAvJiN4MjJDNjsgRFZCLVMgJiN4MjJDNjsvCi0JRkVfUUFNLCAgICAvJiN4MjJDNjsgRFZCLUMgJiN4MjJDNjsvCi0JRkVfT0ZETSAgICAvJiN4MjJDNjsgRFZCLVQgJiN4MjJDNjsvCi0JfSBmZV90eXBlX3Q7Ci08L3Byb2dyYW1saXN0aW5nPgorPHBhcmE+Rm9yIGhpc3RvcmljYWwgcmVhc29ucywgZnJvbnRlbmQgdHlwZXMgYXJlIG5hbWVkIGJ5IHRoZSB0eXBlIG9mIG1vZHVsYXRpb24gdXNlZCBpbgordHJhbnNtaXNzaW9uLiBUaGUgZm9udGVuZCB0eXBlcyBhcmUgZ2l2ZW4gYnkgZmVfdHlwZV90IHR5cGUsIGRlZmluZWQgYXM6PC9wYXJhPgogCis8dGFibGUgcGd3aWRlPSIxIiBmcmFtZT0ibm9uZSIgaWQ9ImZlLXR5cGUiPgorPHRpdGxlPkZyb250ZW5kIHR5cGVzPC90aXRsZT4KKzx0Z3JvdXAgY29scz0iMyI+CisgICAmY3MtZGVmOworICAgPHRoZWFkPgorICAgICA8cm93PgorICAgICAgIDxlbnRyeT5mZV90eXBlPC9lbnRyeT4KKyAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgIDxlbnRyeT48bGluayBsaW5rZW5kPSJEVFYtREVMSVZFUlktU1lTVEVNIj5EVFZfREVMSVZFUllfU1lTVEVNPC9saW5rPiBlcXVpdmFsZW50IHR5cGU8L2VudHJ5PgorICAgICA8L3Jvdz4KKyAgPC90aGVhZD4KKyAgPHRib2R5IHZhbGlnbj0idG9wIj4KKyAgPHJvdz4KKyAgICAgPGVudHJ5IGlkPSJGRV9RUFNLIj48Y29uc3RhbnQ+RkVfUVBTSzwvY29uc3RhbnQ+PC9lbnRyeT4KKyAgICAgPGVudHJ5PkZvciBEVkItUyBzdGFuZGFyZDwvZW50cnk+CisgICAgIDxlbnRyeT48Y29uc3RhbnQ+U1lTX0RWQlM8L2NvbnN0YW50PjwvZW50cnk+CisgIDwvcm93PgorICA8cm93PgorICAgICA8ZW50cnkgaWQ9IkZFX1FBTSI+PGNvbnN0YW50PkZFX1FBTTwvY29uc3RhbnQ+PC9lbnRyeT4KKyAgICAgPGVudHJ5PkZvciBEVkItQyBhbm5leCBBL0Mgc3RhbmRhcmQ8L2VudHJ5PgorICAgICA8ZW50cnk+PGNvbnN0YW50PlNZU19EVkJDX0FOTkVYX0FDPC9jb25zdGFudD48L2VudHJ5PgorICA8L3Jvdz4KKyAgPHJvdz4KKyAgICAgPGVudHJ5IGlkPSJGRV9PRkRNIj48Y29uc3RhbnQ+RkVfT0ZETTwvY29uc3RhbnQ+PC9lbnRyeT4KKyAgICAgPGVudHJ5PkZvciBEVkItVCBzdGFuZGFyZDwvZW50cnk+CisgICAgIDxlbnRyeT48Y29uc3RhbnQ+U1lTX0RWQlQ8L2NvbnN0YW50PjwvZW50cnk+CisgIDwvcm93PgorICA8cm93PgorICAgICA8ZW50cnkgaWQ9IkZFX0FUU0MiPjxjb25zdGFudD5GRV9BVFNDPC9jb25zdGFudD48L2VudHJ5PgorICAgICA8ZW50cnk+Rm9yIEFUU0Mgc3RhbmRhcmQgKHRlcnJlc3RyaWFsKSBvciBmb3IgRFZCLUMgQW5uZXggQiAoY2FibGUpIHVzZWQgaW4gVVMuPC9lbnRyeT4KKyAgICAgPGVudHJ5Pjxjb25zdGFudD5TWVNfQVRTQzwvY29uc3RhbnQ+ICh0ZXJyZXN0cmlhbCkgb3IgPGNvbnN0YW50PlNZU19EVkJDX0FOTkVYX0I8L2NvbnN0YW50PiAoY2FibGUpPC9lbnRyeT4KKyAgPC9yb3c+Cis8L3Rib2R5PjwvdGdyb3VwPjwvdGFibGU+CisKKzxwYXJhPk5ld2VyIGZvcm1hdHMgbGlrZSBEVkItUzIsIElTREItVCwgSVNEQi1TIGFuZCBEVkItVDIgYXJlIG5vdCBkZXNjcmliZWQgYXQgdGhlIGFib3ZlLCBhcyB0aGV5J3JlCitzdXBwb3J0ZWQgdmlhIHRoZSBuZXcgPGxpbmsgbGlua2VuZD0iRkVfR0VUX1NFVF9QUk9QRVJUWSI+RkVfR0VUX1BST1BFUlRZL0ZFX0dFVF9TRVRfUFJPUEVSVFk8L2xpbms+IGlvY3RsJ3MsIHVzaW5nIHRoZSA8bGluayBsaW5rZW5kPSJEVFYtREVMSVZFUlktU1lTVEVNIj5EVFZfREVMSVZFUllfU1lTVEVNPC9saW5rPiBwYXJhbWV0ZXIuCis8L3BhcmE+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJmcm9udGVuZF9jYXBzIj4KKzxzZWN0aW9uIGlkPSJmZS1jYXBzLXQiPgogPHRpdGxlPmZyb250ZW5kIGNhcGFiaWxpdGllczwvdGl0bGU+CiAKIDxwYXJhPkNhcGFiaWxpdGllcyBkZXNjcmliZSB3aGF0IGEgZnJvbnRlbmQgY2FuIGRvLiBTb21lIGNhcGFiaWxpdGllcyBjYW4gb25seSBiZSBzdXBwb3J0ZWQgZm9yCkBAIC03Niw3ICsxMDYsNyBAQAogPC9wcm9ncmFtbGlzdGluZz4KIDwvc2VjdGlvbj4KIAotPHNlY3Rpb24gaWQ9ImZyb250ZW5kX2luZm8iPgorPHNlY3Rpb24gaWQ9ImR2Yi1mcm9udGVuZC1pbmZvIj4KIDx0aXRsZT5mcm9udGVuZCBpbmZvcm1hdGlvbjwvdGl0bGU+CiAKIDxwYXJhPkluZm9ybWF0aW9uIGFib3V0IHRoZSBmcm9udGVuZCBjYSBiZSBxdWVyaWVkIHdpdGgKQEAgLTk5LDcgKzEyOSw3IEBACiA8L3Byb2dyYW1saXN0aW5nPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0iZnJvbnRlbmRfZGlzZXFjIj4KKzxzZWN0aW9uIGlkPSJkdmItZGlzZXFjLW1hc3Rlci1jbWQiPgogPHRpdGxlPmRpc2VxYyBtYXN0ZXIgY29tbWFuZDwvdGl0bGU+CiAKIDxwYXJhPkEgbWVzc2FnZSBzZW50IGZyb20gdGhlIGZyb250ZW5kIHRvIERpU0VxQyBjYXBhYmxlIGVxdWlwbWVudC48L3BhcmE+CkBAIC0xMTAsNyArMTQwLDcgQEAKIAl9OwogPC9wcm9ncmFtbGlzdGluZz4KIDwvc2VjdGlvbj4KLTxzZWN0aW9uIHJvbGU9InN1YnNlY3Rpb24iPgorPHNlY3Rpb24gcm9sZT0ic3Vic2VjdGlvbiIgaWQ9ImR2Yi1kaXNlcWMtc2xhdmUtcmVwbHkiPgogPHRpdGxlPmRpc2VxYyBzbGF2ZSByZXBseTwvdGl0bGU+CiAKIDxwYXJhPkEgcmVwbHkgdG8gdGhlIGZyb250ZW5kIGZyb20gRGlTRXFDIDIuMCBjYXBhYmxlIGVxdWlwbWVudC48L3BhcmE+CkBAIC0xMjMsNyArMTUzLDcgQEAKIDwvcHJvZ3JhbWxpc3Rpbmc+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJmcm9udGVuZF9kaXNlcWNfc2xhdmVfcmVwbHkiPgorPHNlY3Rpb24gaWQ9ImZlLXNlYy12b2x0YWdlLXQiPgogPHRpdGxlPmRpc2VxYyBzbGF2ZSByZXBseTwvdGl0bGU+CiA8cGFyYT5UaGUgdm9sdGFnZSBpcyB1c3VhbGx5IHVzZWQgd2l0aCBub24tRGlTRXFDIGNhcGFibGUgTE5CcyB0byBzd2l0Y2ggdGhlIHBvbGFyemF0aW9uCiAoaG9yaXpvbnRhbC92ZXJ0aWNhbCkuIFdoZW4gdXNpbmcgRGlTRXFDIGVwdWlwbWVudCB0aGlzIHZvbHRhZ2UgaGFzIHRvIGJlIHN3aXRjaGVkCkBAIC0xMzYsNyArMTY2LDcgQEAKIDwvcHJvZ3JhbWxpc3Rpbmc+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJmcm9udGVuZF9zZWNfdG9uZSI+Cis8c2VjdGlvbiBpZD0iZmUtc2VjLXRvbmUtbW9kZS10Ij4KIDx0aXRsZT5TRUMgY29udGludW91cyB0b25lPC90aXRsZT4KIAogPHBhcmE+VGhlIGNvbnRpbnVvdXMgMjJLSHogdG9uZSBpcyB1c3VhbGx5IHVzZWQgd2l0aCBub24tRGlTRXFDIGNhcGFibGUgTE5CcyB0byBzd2l0Y2ggdGhlCkBAIC0xNTEsNyArMTgxLDcgQEAKIDwvcHJvZ3JhbWxpc3Rpbmc+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJmcm9udGVuZF9zZWNfYnVyc3QiPgorPHNlY3Rpb24gaWQ9ImZlLXNlYy1taW5pLWNtZC10Ij4KIDx0aXRsZT5TRUMgdG9uZSBidXJzdDwvdGl0bGU+CiAKIDxwYXJhPlRoZSAyMktIeiB0b25lIGJ1cnN0IGlzIHVzdWFsbHkgdXNlZCB3aXRoIG5vbi1EaVNFcUMgY2FwYWJsZSBzd2l0Y2hlcyB0byBzZWxlY3QKQEAgLTE2OCw3ICsxOTgsNyBAQAogPHBhcmE+PC9wYXJhPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0iZnJvbnRlbmRfc3RhdHVzIj4KKzxzZWN0aW9uIGlkPSJmZS1zdGF0dXMtdCI+CiA8dGl0bGU+ZnJvbnRlbmQgc3RhdHVzPC90aXRsZT4KIDxwYXJhPlNldmVyYWwgZnVuY3Rpb25zIG9mIHRoZSBmcm9udGVuZCBkZXZpY2UgdXNlIHRoZSBmZV9zdGF0dXMgZGF0YSB0eXBlIGRlZmluZWQKIGJ5PC9wYXJhPgpAQCAtMTg4LDMxICsyMTgsNTQgQEAKIAogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0iZnJvbnRlbmRfcGFyYW1zIj4KKzxzZWN0aW9uIGlkPSJkdmItZnJvbnRlbmQtcGFyYW1ldGVycyI+CiA8dGl0bGU+ZnJvbnRlbmQgcGFyYW1ldGVyczwvdGl0bGU+CiA8cGFyYT5UaGUga2luZCBvZiBwYXJhbWV0ZXJzIHBhc3NlZCB0byB0aGUgZnJvbnRlbmQgZGV2aWNlIGZvciB0dW5pbmcgZGVwZW5kIG9uCi10aGUga2luZCBvZiBoYXJkd2FyZSB5b3UgYXJlIHVzaW5nLiBBbGwga2luZHMgb2YgcGFyYW1ldGVycyBhcmUgY29tYmluZWQgYXMgYW4KLXVuaW9uIGluIHRoZSBGcm9udGVuZFBhcmFtZXRlcnMgc3RydWN0dXJlOjwvcGFyYT4KK3RoZSBraW5kIG9mIGhhcmR3YXJlIHlvdSBhcmUgdXNpbmcuPC9wYXJhPgorPHBhcmE+VGhlIHN0cnVjdCA8Y29uc3RhbnQ+ZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnM8L2NvbnN0YW50PiB1c2VzIGFuCit1bmlvbiB3aXRoIHNwZWNpZmljIHBlci1zeXN0ZW0gcGFyYW1ldGVycy4gSG93ZXZlciwgYXMgbmV3ZXIgZGVsaXZlcnkgc3lzdGVtcworcmVxdWlyZWQgbW9yZSBkYXRhLCB0aGUgc3RydWN0dXJlIHNpemUgd2VyZW4ndCBlbm91Z2ggdG8gZml0LCBhbmQganVzdAorZXh0ZW5kaW5nIGl0cyBzaXplIHdvdWxkIGJyZWFrIHRoZSBleGlzdGluZyBhcHBsaWNhdGlvbnMuIFNvLCB0aG9zZSBwYXJhbWV0ZXJzCit3ZXJlIHJlcGxhY2VkIGJ5IHRoZSB1c2FnZSBvZiA8bGluayBsaW5rZW5kPSJGRV9HRVRfU0VUX1BST1BFUlRZIj4KKzxjb25zdGFudD5GRV9HRVRfUFJPUEVSVFkvRkVfU0VUX1BST1BFUlRZPC9jb25zdGFudD48L2xpbms+IGlvY3RsJ3MuIFRoZQorbmV3IEFQSSBpcyBmbGV4aWJsZSBlbm91Z2ggdG8gYWRkIG5ldyBwYXJhbWV0ZXJzIHRvIGV4aXN0aW5nIGRlbGl2ZXJ5IHN5c3RlbXMsCithbmQgdG8gYWRkIG5ld2VyIGRlbGl2ZXJ5IHN5c3RlbXMuPC9wYXJhPgorPHBhcmE+U28sIG5ld2VyIGFwcGxpY2F0aW9ucyBzaG91bGQgdXNlIDxsaW5rIGxpbmtlbmQ9IkZFX0dFVF9TRVRfUFJPUEVSVFkiPgorPGNvbnN0YW50PkZFX0dFVF9QUk9QRVJUWS9GRV9TRVRfUFJPUEVSVFk8L2NvbnN0YW50PjwvbGluaz4gaW5zdGVhZCwgaW4KK29yZGVyIHRvIGJlIGFibGUgdG8gc3VwcG9ydCB0aGUgbmV3ZXIgU3lzdGVtIERlbGl2ZXJ5IGxpa2UgIERWQi1TMiwgRFZCLVQyLAorRFZCLUMyLCBJU0RCLCBldGMuPC9wYXJhPgorPHBhcmE+QWxsIGtpbmRzIG9mIHBhcmFtZXRlcnMgYXJlIGNvbWJpbmVkIGFzIGFuIHVuaW9uIGluIHRoZSBGcm9udGVuZFBhcmFtZXRlcnMgc3RydWN0dXJlOjwvcGFyYT4KIDxwcm9ncmFtbGlzdGluZz4KLSBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgewotCSB1aW50MzJfdCBmcmVxdWVuY3k7ICAgICAgIC8mI3gyMkM2OyAoYWJzb2x1dGUpIGZyZXF1ZW5jeSBpbiBIeiBmb3IgUUFNL09GRE0gJiN4MjJDNjsvCi0JCQkJICAgLyYjeDIyQzY7IGludGVybWVkaWF0ZSBmcmVxdWVuY3kgaW4ga0h6IGZvciBRUFNLICYjeDIyQzY7LwotCSBmZV9zcGVjdHJhbF9pbnZlcnNpb25fdCBpbnZlcnNpb247Ci0JIHVuaW9uIHsKLQkJIHN0cnVjdCBkdmJfcXBza19wYXJhbWV0ZXJzIHFwc2s7Ci0JCSBzdHJ1Y3QgZHZiX3FhbV9wYXJhbWV0ZXJzICBxYW07Ci0JCSBzdHJ1Y3QgZHZiX29mZG1fcGFyYW1ldGVycyBvZmRtOwotCSB9IHU7Ci0gfTsKK3N0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyB7CisJdWludDMyX3QgZnJlcXVlbmN5OyAgICAgLyYjeDIyQzY7IChhYnNvbHV0ZSkgZnJlcXVlbmN5IGluIEh6IGZvciBRQU0vT0ZETSAmI3gyMkM2Oy8KKwkJCQkvJiN4MjJDNjsgaW50ZXJtZWRpYXRlIGZyZXF1ZW5jeSBpbiBrSHogZm9yIFFQU0sgJiN4MjJDNjsvCisJZmVfc3BlY3RyYWxfaW52ZXJzaW9uX3QgaW52ZXJzaW9uOworCXVuaW9uIHsKKwkJc3RydWN0IGR2Yl9xcHNrX3BhcmFtZXRlcnMgcXBzazsKKwkJc3RydWN0IGR2Yl9xYW1fcGFyYW1ldGVycyAgcWFtOworCQlzdHJ1Y3QgZHZiX29mZG1fcGFyYW1ldGVycyBvZmRtOworCQlzdHJ1Y3QgZHZiX3ZzYl9wYXJhbWV0ZXJzICB2c2I7CisJfSB1OworfTsKIDwvcHJvZ3JhbWxpc3Rpbmc+Ci08cGFyYT5Gb3Igc2F0ZWxsaXRlIFFQU0sgZnJvbnRlbmRzIHlvdSBoYXZlIHRvIHVzZSB0aGUgPGNvbnN0YW50PlFQU0tQYXJhbWV0ZXJzPC9jb25zdGFudD4gbWVtYmVyIGRlZmluZWQgYnk8L3BhcmE+Cis8cGFyYT5JbiB0aGUgY2FzZSBvZiBRUFNLIGZyb250ZW5kcyB0aGUgPGNvbnN0YW50PmZyZXF1ZW5jeTwvY29uc3RhbnQ+IGZpZWxkIHNwZWNpZmllcyB0aGUgaW50ZXJtZWRpYXRlCitmcmVxdWVuY3ksIGkuZS4gdGhlIG9mZnNldCB3aGljaCBpcyBlZmZlY3RpdmVseSBhZGRlZCB0byB0aGUgbG9jYWwgb3NjaWxsYXRvciBmcmVxdWVuY3kgKExPRikgb2YKK3RoZSBMTkIuIFRoZSBpbnRlcm1lZGlhdGUgZnJlcXVlbmN5IGhhcyB0byBiZSBzcGVjaWZpZWQgaW4gdW5pdHMgb2Yga0h6LiBGb3IgUUFNIGFuZAorT0ZETSBmcm9udGVuZHMgdGhlIDxjb25zdGFudD5mcmVxdWVuY3k8L2NvbnN0YW50PiBzcGVjaWZpZXMgdGhlIGFic29sdXRlIGZyZXF1ZW5jeSBhbmQgaXMgZ2l2ZW4gaW4gSHouCis8L3BhcmE+Cis8c2VjdGlvbiBpZD0iZHZiLXFwc2stcGFyYW1ldGVycyI+Cis8dGl0bGU+UVBTSyBwYXJhbWV0ZXJzPC90aXRsZT4KKzxwYXJhPkZvciBzYXRlbGxpdGUgUVBTSyBmcm9udGVuZHMgeW91IGhhdmUgdG8gdXNlIHRoZSA8Y29uc3RhbnQ+ZHZiX3Fwc2tfcGFyYW1ldGVyczwvY29uc3RhbnQ+IHN0cnVjdHVyZTo8L3BhcmE+CiA8cHJvZ3JhbWxpc3Rpbmc+CiAgc3RydWN0IGR2Yl9xcHNrX3BhcmFtZXRlcnMgewogCSB1aW50MzJfdCAgICAgICAgc3ltYm9sX3JhdGU7ICAvJiN4MjJDNjsgc3ltYm9sIHJhdGUgaW4gU3ltYm9scyBwZXIgc2Vjb25kICYjeDIyQzY7LwogCSBmZV9jb2RlX3JhdGVfdCAgZmVjX2lubmVyOyAgICAvJiN4MjJDNjsgZm9yd2FyZCBlcnJvciBjb3JyZWN0aW9uIChzZWUgYWJvdmUpICYjeDIyQzY7LwogIH07CiA8L3Byb2dyYW1saXN0aW5nPgotPHBhcmE+Zm9yIGNhYmxlIFFBTSBmcm9udGVuZCB5b3UgdXNlIHRoZSA8Y29uc3RhbnQ+UUFNUGFyYW1ldGVyczwvY29uc3RhbnQ+IHN0cnVjdHVyZTwvcGFyYT4KKzwvc2VjdGlvbj4KKzxzZWN0aW9uIGlkPSJkdmItcWFtLXBhcmFtZXRlcnMiPgorPHRpdGxlPlFBTSBwYXJhbWV0ZXJzPC90aXRsZT4KKzxwYXJhPmZvciBjYWJsZSBRQU0gZnJvbnRlbmQgeW91IHVzZSB0aGUgPGNvbnN0YW50PmR2Yl9xYW1fcGFyYW1ldGVyczwvY29uc3RhbnQ+IHN0cnVjdHVyZTo8L3BhcmE+CiA8cHJvZ3JhbWxpc3Rpbmc+CiAgc3RydWN0IGR2Yl9xYW1fcGFyYW1ldGVycyB7CiAJIHVpbnQzMl90ICAgICAgICAgc3ltYm9sX3JhdGU7IC8mI3gyMkM2OyBzeW1ib2wgcmF0ZSBpbiBTeW1ib2xzIHBlciBzZWNvbmQgJiN4MjJDNjsvCkBAIC0yMjAsOCArMjczLDE5IEBACiAJIGZlX21vZHVsYXRpb25fdCAgbW9kdWxhdGlvbjsgIC8mI3gyMkM2OyBtb2R1bGF0aW9uIHR5cGUgKHNlZSBhYm92ZSkgJiN4MjJDNjsvCiAgfTsKIDwvcHJvZ3JhbWxpc3Rpbmc+Ci08cGFyYT5EVkItVCBmcm9udGVuZHMgYXJlIHN1cHBvcnRlZCBieSB0aGUgPGNvbnN0YW50Pk9GRE1QYXJhbXRlcnM8L2NvbnN0YW50PiBzdHJ1Y3R1cmUKLTwvcGFyYT4KKzwvc2VjdGlvbj4KKzxzZWN0aW9uIGlkPSJkdmItdnNiLXBhcmFtZXRlcnMiPgorPHRpdGxlPlZTQiBwYXJhbWV0ZXJzPC90aXRsZT4KKzxwYXJhPkFUU0MgZnJvbnRlbmRzIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIDxjb25zdGFudD5kdmJfdnNiX3BhcmFtZXRlcnM8L2NvbnN0YW50PiBzdHJ1Y3R1cmU6PC9wYXJhPgorPHByb2dyYW1saXN0aW5nPgorc3RydWN0IGR2Yl92c2JfcGFyYW1ldGVycyB7CisJZmVfbW9kdWxhdGlvbl90IG1vZHVsYXRpb247CS8mI3gyMkM2OyBtb2R1bGF0aW9uIHR5cGUgKHNlZSBhYm92ZSkgJiN4MjJDNjsvCit9OworPC9wcm9ncmFtbGlzdGluZz4KKzwvc2VjdGlvbj4KKzxzZWN0aW9uIGlkPSJkdmItb2ZkbS1wYXJhbWV0ZXJzIj4KKzx0aXRsZT5PRkRNIHBhcmFtZXRlcnM8L3RpdGxlPgorPHBhcmE+RFZCLVQgZnJvbnRlbmRzIGFyZSBzdXBwb3J0ZWQgYnkgdGhlIDxjb25zdGFudD5kdmJfb2ZkbV9wYXJhbWV0ZXJzPC9jb25zdGFudD4gc3RydWN0dXJlOjwvcGFyYT4KIDxwcm9ncmFtbGlzdGluZz4KICBzdHJ1Y3QgZHZiX29mZG1fcGFyYW1ldGVycyB7CiAJIGZlX2JhbmR3aWR0aF90ICAgICAgYmFuZHdpZHRoOwpAQCAtMjMzLDg2ICsyOTcsMTI0IEBACiAJIGZlX2hpZXJhcmNoeV90ICAgICAgaGllcmFyY2h5X2luZm9ybWF0aW9uOwogIH07CiA8L3Byb2dyYW1saXN0aW5nPgotPHBhcmE+SW4gdGhlIGNhc2Ugb2YgUVBTSyBmcm9udGVuZHMgdGhlIDxjb25zdGFudD5GcmVxdWVuY3k8L2NvbnN0YW50PiBmaWVsZCBzcGVjaWZpZXMgdGhlIGludGVybWVkaWF0ZQotZnJlcXVlbmN5LCBpLmUuIHRoZSBvZmZzZXQgd2hpY2ggaXMgZWZmZWN0aXZlbHkgYWRkZWQgdG8gdGhlIGxvY2FsIG9zY2lsbGF0b3IgZnJlcXVlbmN5IChMT0YpIG9mCi10aGUgTE5CLiBUaGUgaW50ZXJtZWRpYXRlIGZyZXF1ZW5jeSBoYXMgdG8gYmUgc3BlY2lmaWVkIGluIHVuaXRzIG9mIGtIei4gRm9yIFFBTSBhbmQKLU9GRE0gZnJvbnRlbmRzIHRoZSBGcmVxdWVuY3kgc3BlY2lmaWVzIHRoZSBhYnNvbHV0ZSBmcmVxdWVuY3kgYW5kIGlzIGdpdmVuIGluCi1Iei4KLTwvcGFyYT4KKzwvc2VjdGlvbj4KKzxzZWN0aW9uIGlkPSJmZS1zcGVjdHJhbC1pbnZlcnNpb24tdCI+Cis8dGl0bGU+ZnJvbnRlbmQgc3BlY3RyYWwgaW52ZXJzaW9uPC90aXRsZT4KIDxwYXJhPlRoZSBJbnZlcnNpb24gZmllbGQgY2FuIHRha2Ugb25lIG9mIHRoZXNlIHZhbHVlczoKIDwvcGFyYT4KIDxwcm9ncmFtbGlzdGluZz4KLSB0eXBlZGVmIGVudW0gZmVfc3BlY3RyYWxfaW52ZXJzaW9uIHsKLQkgSU5WRVJTSU9OX09GRiwKLQkgSU5WRVJTSU9OX09OLAotCSBJTlZFUlNJT05fQVVUTwotIH0gZmVfc3BlY3RyYWxfaW52ZXJzaW9uX3Q7Cit0eXBlZGVmIGVudW0gZmVfc3BlY3RyYWxfaW52ZXJzaW9uIHsKKwlJTlZFUlNJT05fT0ZGLAorCUlOVkVSU0lPTl9PTiwKKwlJTlZFUlNJT05fQVVUTworfSBmZV9zcGVjdHJhbF9pbnZlcnNpb25fdDsKIDwvcHJvZ3JhbWxpc3Rpbmc+CiA8cGFyYT5JdCBpbmRpY2F0ZXMgaWYgc3BlY3RyYWwgaW52ZXJzaW9uIHNob3VsZCBiZSBwcmVzdW1lZCBvciBub3QuIEluIHRoZSBhdXRvbWF0aWMgc2V0dGluZwogKDxjb25zdGFudD5JTlZFUlNJT05fQVVUTzwvY29uc3RhbnQ+KSB0aGUgaGFyZHdhcmUgd2lsbCB0cnkgdG8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBzZXR0aW5nIGJ5CiBpdHNlbGYuCiA8L3BhcmE+Ci08cGFyYT5UaGUgcG9zc2libGUgdmFsdWVzIGZvciB0aGUgPGNvbnN0YW50PkZFQ19pbm5lcjwvY29uc3RhbnQ+IGZpZWxkIGFyZQorPC9zZWN0aW9uPgorPHNlY3Rpb24gaWQ9ImZlLWNvZGUtcmF0ZS10Ij4KKzx0aXRsZT5mcm9udGVuZCBjb2RlIHJhdGU8L3RpdGxlPgorPHBhcmE+VGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIDxjb25zdGFudD5mZWNfaW5uZXI8L2NvbnN0YW50PiBmaWVsZCB1c2VkIG9uCis8bGluayByZWZlbmQ9ImR2Yi1xcHNrLXBhcmFtZXRlcnMiPjxjb25zdGFudD5zdHJ1Y3QgZHZiX3Fwc2tfcGFyYW1ldGVyczwvY29uc3RhbnQ+PC9saW5rPiBhbmQKKzxsaW5rIHJlZmVuZD0iZHZiLXFhbS1wYXJhbWV0ZXJzIj48Y29uc3RhbnQ+c3RydWN0IGR2Yl9xYW1fcGFyYW1ldGVyczwvY29uc3RhbnQ+PC9saW5rPiBhcmU6CiA8L3BhcmE+CiA8cHJvZ3JhbWxpc3Rpbmc+Ci0gdHlwZWRlZiBlbnVtIGZlX2NvZGVfcmF0ZSB7Ci0JIEZFQ19OT05FID0gMCwKLQkgRkVDXzFfMiwKLQkgRkVDXzJfMywKLQkgRkVDXzNfNCwKLQkgRkVDXzRfNSwKLQkgRkVDXzVfNiwKLQkgRkVDXzZfNywKLQkgRkVDXzdfOCwKLQkgRkVDXzhfOSwKLQkgRkVDX0FVVE8KLSB9IGZlX2NvZGVfcmF0ZV90OwordHlwZWRlZiBlbnVtIGZlX2NvZGVfcmF0ZSB7CisJRkVDX05PTkUgPSAwLAorCUZFQ18xXzIsCisJRkVDXzJfMywKKwlGRUNfM180LAorCUZFQ180XzUsCisJRkVDXzVfNiwKKwlGRUNfNl83LAorCUZFQ183XzgsCisJRkVDXzhfOSwKKwlGRUNfQVVUTywKKwlGRUNfM181LAorCUZFQ185XzEwLAorfSBmZV9jb2RlX3JhdGVfdDsKIDwvcHJvZ3JhbWxpc3Rpbmc+CiA8cGFyYT53aGljaCBjb3JyZXNwb25kIHRvIGVycm9yIGNvcnJlY3Rpb24gcmF0ZXMgb2YgMS8yLCAyLzMsIGV0Yy4sIG5vIGVycm9yIGNvcnJlY3Rpb24gb3IgYXV0bwogZGV0ZWN0aW9uLgogPC9wYXJhPgotPHBhcmE+Rm9yIGNhYmxlIGFuZCB0ZXJyZXN0cmlhbCBmcm9udGVuZHMgKFFBTSBhbmQgT0ZETSkgb25lIGFsc28gaGFzIHRvIHNwZWNpZnkgdGhlIHF1YWRyYXR1cmUKLW1vZHVsYXRpb24gbW9kZSB3aGljaCBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Cis8L3NlY3Rpb24+Cis8c2VjdGlvbiBpZD0iZmUtbW9kdWxhdGlvbi10Ij4KKzx0aXRsZT5mcm9udGVuZCBtb2R1bGF0aW9uIHR5cGUgZm9yIFFBTSwgT0ZETSBhbmQgVlNCPC90aXRsZT4KKzxwYXJhPkZvciBjYWJsZSBhbmQgdGVycmVzdHJpYWwgZnJvbnRlbmRzLCBlLiBnLiBmb3IKKzxsaW5rIHJlZmVuZD0iZHZiLXFhbS1wYXJhbWV0ZXJzIj48Y29uc3RhbnQ+c3RydWN0IGR2Yl9xcHNrX3BhcmFtZXRlcnM8L2NvbnN0YW50PjwvbGluaz4sCis8bGluayByZWZlbmQ9ImR2Yi1vZmRtLXBhcmFtZXRlcnMiPjxjb25zdGFudD5zdHJ1Y3QgZHZiX3FhbV9wYXJhbWV0ZXJzPC9jb25zdGFudD48L2xpbms+IGFuZAorPGxpbmsgcmVmZW5kPSJkdmItdnNiLXBhcmFtZXRlcnMiPjxjb25zdGFudD5zdHJ1Y3QgZHZiX3FhbV9wYXJhbWV0ZXJzPC9jb25zdGFudD48L2xpbms+LAoraXQgbmVlZHMgdG8gc3BlY2lmeSB0aGUgcXVhZHJhdHVyZSBtb2R1bGF0aW9uIG1vZGUgd2hpY2ggY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgogPC9wYXJhPgogPHByb2dyYW1saXN0aW5nPgogIHR5cGVkZWYgZW51bSBmZV9tb2R1bGF0aW9uIHsKLSBRUFNLLAotCSBRQU1fMTYsCi0JIFFBTV8zMiwKLQkgUUFNXzY0LAotCSBRQU1fMTI4LAotCSBRQU1fMjU2LAotCSBRQU1fQVVUTworCVFQU0ssCisJUUFNXzE2LAorCVFBTV8zMiwKKwlRQU1fNjQsCisJUUFNXzEyOCwKKwlRQU1fMjU2LAorCVFBTV9BVVRPLAorCVZTQl84LAorCVZTQl8xNiwKKwlQU0tfOCwKKwlBUFNLXzE2LAorCUFQU0tfMzIsCisJRFFQU0ssCiAgfSBmZV9tb2R1bGF0aW9uX3Q7CiA8L3Byb2dyYW1saXN0aW5nPgorPC9zZWN0aW9uPgogPHBhcmE+RmluYWxseSwgdGhlcmUgYXJlIHNldmVyYWwgbW9yZSBwYXJhbWV0ZXJzIGZvciBPRkRNOgogPC9wYXJhPgorPHNlY3Rpb24gaWQ9ImZlLXRyYW5zbWl0LW1vZGUtdCI+Cis8dGl0bGU+TnVtYmVyIG9mIGNhcnJpZXJzIHBlciBjaGFubmVsPC90aXRsZT4KIDxwcm9ncmFtbGlzdGluZz4KLSB0eXBlZGVmIGVudW0gZmVfdHJhbnNtaXRfbW9kZSB7Ci0JIFRSQU5TTUlTU0lPTl9NT0RFXzJLLAotCSBUUkFOU01JU1NJT05fTU9ERV84SywKLQkgVFJBTlNNSVNTSU9OX01PREVfQVVUTwordHlwZWRlZiBlbnVtIGZlX3RyYW5zbWl0X21vZGUgeworCVRSQU5TTUlTU0lPTl9NT0RFXzJLLAorCVRSQU5TTUlTU0lPTl9NT0RFXzhLLAorCVRSQU5TTUlTU0lPTl9NT0RFX0FVVE8sCisJVFJBTlNNSVNTSU9OX01PREVfNEssCisJVFJBTlNNSVNTSU9OX01PREVfMUssCisJVFJBTlNNSVNTSU9OX01PREVfMTZLLAorCVRSQU5TTUlTU0lPTl9NT0RFXzMySywKICB9IGZlX3RyYW5zbWl0X21vZGVfdDsKIDwvcHJvZ3JhbWxpc3Rpbmc+Ci0gPHByb2dyYW1saXN0aW5nPgotIHR5cGVkZWYgZW51bSBmZV9iYW5kd2lkdGggewotCSBCQU5EV0lEVEhfOF9NSFosCi0JIEJBTkRXSURUSF83X01IWiwKLQkgQkFORFdJRFRIXzZfTUhaLAotCSBCQU5EV0lEVEhfQVVUTwotIH0gZmVfYmFuZHdpZHRoX3Q7Cis8L3NlY3Rpb24+Cis8c2VjdGlvbiBpZD0iZmUtYmFuZHdpZHRoLXQiPgorPHRpdGxlPmZyb250ZW5kIGJhbmR3aWR0aDwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+Cit0eXBlZGVmIGVudW0gZmVfYmFuZHdpZHRoIHsKKwlCQU5EV0lEVEhfOF9NSFosCisJQkFORFdJRFRIXzdfTUhaLAorCUJBTkRXSURUSF82X01IWiwKKwlCQU5EV0lEVEhfQVVUTywKKwlCQU5EV0lEVEhfNV9NSFosCisJQkFORFdJRFRIXzEwX01IWiwKKwlCQU5EV0lEVEhfMV83MTJfTUhaLAorfSBmZV9iYW5kd2lkdGhfdDsKIDwvcHJvZ3JhbWxpc3Rpbmc+Ci0gPHByb2dyYW1saXN0aW5nPgotIHR5cGVkZWYgZW51bSBmZV9ndWFyZF9pbnRlcnZhbCB7Ci0JIEdVQVJEX0lOVEVSVkFMXzFfMzIsCi0JIEdVQVJEX0lOVEVSVkFMXzFfMTYsCi0JIEdVQVJEX0lOVEVSVkFMXzFfOCwKLQkgR1VBUkRfSU5URVJWQUxfMV80LAotCSBHVUFSRF9JTlRFUlZBTF9BVVRPCi0gfSBmZV9ndWFyZF9pbnRlcnZhbF90OworPC9zZWN0aW9uPgorPHNlY3Rpb24gaWQ9ImZlLWd1YXJkLWludGVydmFsLXQiPgorPHRpdGxlPmZyb250ZW5kIGd1YXJkIGludmVydmFsPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK3R5cGVkZWYgZW51bSBmZV9ndWFyZF9pbnRlcnZhbCB7CisJR1VBUkRfSU5URVJWQUxfMV8zMiwKKwlHVUFSRF9JTlRFUlZBTF8xXzE2LAorCUdVQVJEX0lOVEVSVkFMXzFfOCwKKwlHVUFSRF9JTlRFUlZBTF8xXzQsCisJR1VBUkRfSU5URVJWQUxfQVVUTywKKwlHVUFSRF9JTlRFUlZBTF8xXzEyOCwKKwlHVUFSRF9JTlRFUlZBTF8xOV8xMjgsCisJR1VBUkRfSU5URVJWQUxfMTlfMjU2LAorfSBmZV9ndWFyZF9pbnRlcnZhbF90OwogPC9wcm9ncmFtbGlzdGluZz4KLSA8cHJvZ3JhbWxpc3Rpbmc+Ci0gdHlwZWRlZiBlbnVtIGZlX2hpZXJhcmNoeSB7Cis8L3NlY3Rpb24+Cis8c2VjdGlvbiBpZD0iZmUtaGllcmFyY2h5LXQiPgorPHRpdGxlPmZyb250ZW5kIGhpZXJhcmNoeTwvdGl0bGU+Cis8cHJvZ3JhbWxpc3Rpbmc+Cit0eXBlZGVmIGVudW0gZmVfaGllcmFyY2h5IHsKIAkgSElFUkFSQ0hZX05PTkUsCiAJIEhJRVJBUkNIWV8xLAogCSBISUVSQVJDSFlfMiwKQEAgLTMyMCwxMCArNDIyLDExIEBACiAJIEhJRVJBUkNIWV9BVVRPCiAgfSBmZV9oaWVyYXJjaHlfdDsKIDwvcHJvZ3JhbWxpc3Rpbmc+Cis8L3NlY3Rpb24+CiAKIDwvc2VjdGlvbj4KIAotPHNlY3Rpb24gaWQ9ImZyb250ZW5kX2V2ZW50cyI+Cis8c2VjdGlvbiBpZD0iZHZiLWZyb250ZW5kLWV2ZW50Ij4KIDx0aXRsZT5mcm9udGVuZCBldmVudHM8L3RpdGxlPgogIDxwcm9ncmFtbGlzdGluZz4KICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX2V2ZW50IHsKQEAgLTQxMiw4ICs1MTUsNyBAQAogPHBhcmE+KGJsb2NraW5nIG1vZGUgaXMgdGhlIGRlZmF1bHQpPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorPHBhcmE+UkVUVVJOIFZBTFVFPC9wYXJhPgogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+CiA8cGFyYT5FTk9ERVY8L3BhcmE+CkBAIC00NzMsOCArNTc1LDcgQEAKIDxwYXJhPkZpbGUgZGVzY3JpcHRvciByZXR1cm5lZCBieSBhIHByZXZpb3VzIGNhbGwgdG8gb3BlbigpLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KKzxwYXJhPlJFVFVSTiBWQUxVRTwvcGFyYT4KIDxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgogPHBhcmE+RUJBREY8L3BhcmE+CkBAIC01MzAsOCArNjMxLDcgQEAKICB0byBiZSBzdG9yZWQuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorPHBhcmE+UkVUVVJOIFZBTFVFPC9wYXJhPgogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+CiA8cGFyYT5FQkFERjwvcGFyYT4KQEAgLTU5MiwzOCArNjkyLDggQEAKIDxwYXJhPlRoZSBiaXQgZXJyb3IgcmF0ZSBpcyBzdG9yZWQgaW50byAqYmVyLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FRkFVTFQ8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmJlciBwb2ludHMgdG8gaW52YWxpZCBhZGRyZXNzLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FTk9TSUdOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPlRoZXJlIGlzIG5vIHNpZ25hbCwgdGh1cyBubyBtZWFuaW5nZnVsIGJpdCBlcnJvciByYXRlLiBBbHNvCi0gcmV0dXJuZWQgaWYgdGhlIGZyb250LWVuZCBpcyBub3QgdHVybmVkIG9uLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FTk9TWVM8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkZ1bmN0aW9uIG5vdCBhdmFpbGFibGUgZm9yIHRoaXMgZGV2aWNlLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CisKKyZyZXR1cm4tdmFsdWUtZHZiOwogPC9zZWN0aW9uPgogCiA8c2VjdGlvbiBpZD0iRkVfUkVBRF9TTlIiPgpAQCAtNjcwLDM4ICs3NDAsNyBAQAogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIAotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUZBVUxUPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5zbnIgcG9pbnRzIHRvIGludmFsaWQgYWRkcmVzcy48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RU5PU0lHTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5UaGVyZSBpcyBubyBzaWduYWwsIHRodXMgbm8gbWVhbmluZ2Z1bCBzaWduYWwgc3RyZW5ndGgKLSB2YWx1ZS4gQWxzbyByZXR1cm5lZCBpZiBmcm9udC1lbmQgaXMgbm90IHR1cm5lZCBvbi48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RU5PU1lTPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5GdW5jdGlvbiBub3QgYXZhaWxhYmxlIGZvciB0aGlzIGRldmljZS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiA8L3NlY3Rpb24+CiAKIDxzZWN0aW9uIGlkPSJGRV9SRUFEX1NJR05BTF9TVFJFTkdUSCI+CkBAIC03NDgsMzggKzc4Nyw4IEBACiA8cGFyYT5UaGUgc2lnbmFsIHN0cmVuZ3RoIHZhbHVlIGlzIHN0b3JlZCBpbnRvICpzdHJlbmd0aC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUZBVUxUPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5zdGF0dXMgcG9pbnRzIHRvIGludmFsaWQgYWRkcmVzcy48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RU5PU0lHTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5UaGVyZSBpcyBubyBzaWduYWwsIHRodXMgbm8gbWVhbmluZ2Z1bCBzaWduYWwgc3RyZW5ndGgKLSB2YWx1ZS4gQWxzbyByZXR1cm5lZCBpZiBmcm9udC1lbmQgaXMgbm90IHR1cm5lZCBvbi48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RU5PU1lTPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5GdW5jdGlvbiBub3QgYXZhaWxhYmxlIGZvciB0aGlzIGRldmljZS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorCismcmV0dXJuLXZhbHVlLWR2YjsKIDwvc2VjdGlvbj4KIAogPHNlY3Rpb24gaWQ9IkZFX1JFQURfVU5DT1JSRUNURURfQkxPQ0tTIj4KQEAgLTgzMywzMCArODQyLDggQEAKICBzbyBmYXIuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVGQVVMVDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+dWJsb2NrcyBwb2ludHMgdG8gaW52YWxpZCBhZGRyZXNzLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FTk9TWVM8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkZ1bmN0aW9uIG5vdCBhdmFpbGFibGUgZm9yIHRoaXMgZGV2aWNlLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CisKKyZyZXR1cm4tdmFsdWUtZHZiOwogPC9zZWN0aW9uPgogCiA8c2VjdGlvbiBpZD0iRkVfU0VUX0ZST05URU5EIj4KQEAgLTkwOSwyNCArODk2LDEwIEBACiA8cGFyYT5Qb2ludHMgdG8gcGFyYW1ldGVycyBmb3IgdHVuaW5nIG9wZXJhdGlvbi48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+CisKKyZyZXR1cm4tdmFsdWUtZHZiOwogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVGQVVMVDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+cCBwb2ludHMgdG8gaW52YWxpZCBhZGRyZXNzLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+CiA8cGFyYT5FSU5WQUw8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KQEAgLTk4MiwyNSArOTU1LDkgQEAKIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiAKLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotCismcmV0dXJuLXZhbHVlLWR2YjsKIDxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FRkFVTFQ8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPnAgcG9pbnRzIHRvIGludmFsaWQgYWRkcmVzcy48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgogPHBhcmE+RUlOVkFMPC9wYXJhPgogPC9lbnRyeT48ZW50cnkKICBhbGlnbj0iY2hhciI+CkBAIC0xMDg0LDI0ICsxMDQxLDkgQEAKIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiAKLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorJnJldHVybi12YWx1ZS1kdmI7CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUZBVUxUPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5ldiBwb2ludHMgdG8gaW52YWxpZCBhZGRyZXNzLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+CiA8cGFyYT5FV09VTERCTE9DSzwvcGFyYT4KIDwvZW50cnk+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgpAQCAtMTExMywxMSArMTA1NSw2IEBACiA8cGFyYT5FT1ZFUkZMT1c8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KIDxwYXJhPk92ZXJmbG93IGluIGV2ZW50IHF1ZXVlIC0gb25lIG9yIG1vcmUgZXZlbnRzIHdlcmUgbG9zdC48L3BhcmE+CiA8L2VudHJ5PgogPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CkBAIC0xMTcwLDIzICsxMTA3LDcgQEAKICB0byBiZSBzdG9yZWQuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVGQVVMVDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+aW5mbyBwb2ludHMgdG8gaW52YWxpZCBhZGRyZXNzLjwvcGFyYT4KLTwvZW50cnk+Ci08L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPC9zZWN0aW9uPgogCiA8c2VjdGlvbiBpZD0iRkVfRElTRVFDX1JFU0VUX09WRVJMT0FEIj4KQEAgLTEyMjksMzAgKzExNTAsNyBAQAogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIAotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVQRVJNPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5QZXJtaXNzaW9uIGRlbmllZCAobmVlZHMgcmVhZC93cml0ZSBhY2Nlc3MpLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yIGluIHRoZSBkZXZpY2UgZHJpdmVyLjwvcGFyYT4KLTwvZW50cnk+Ci08L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPC9zZWN0aW9uPgogCiA8c2VjdGlvbiBpZD0iRkVfRElTRVFDX1NFTkRfTUFTVEVSX0NNRCI+CkBAIC0xMzAyLDQ1ICsxMjAwLDcgQEAKIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiAKLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FRkFVTFQ8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPlNlcSBwb2ludHMgdG8gYW4gaW52YWxpZCBhZGRyZXNzLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5WQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPlRoZSBkYXRhIHN0cnVjdHVyZSByZWZlcnJlZCB0byBieSBzZXEgaXMgaW52YWxpZCBpbiBzb21lCi0gd2F5LjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FUEVSTTwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+UGVybWlzc2lvbiBkZW5pZWQgKG5lZWRzIHJlYWQvd3JpdGUgYWNjZXNzKS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvciBpbiB0aGUgZGV2aWNlIGRyaXZlci48L3BhcmE+Ci08L2VudHJ5PgotPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIDwvc2VjdGlvbj4KIAogPHNlY3Rpb24gaWQ9IkZFX0RJU0VRQ19SRUNWX1NMQVZFX1JFUExZIj4KQEAgLTEzOTAsNDUgKzEyNTAsNyBAQAogPHBhcmE+UG9pbnRlciB0byB0aGUgY29tbWFuZCB0byBiZSByZWNlaXZlZC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVGQVVMVDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+U2VxIHBvaW50cyB0byBhbiBpbnZhbGlkIGFkZHJlc3MuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlZBTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+VGhlIGRhdGEgc3RydWN0dXJlIHJlZmVycmVkIHRvIGJ5IHNlcSBpcyBpbnZhbGlkIGluIHNvbWUKLSB3YXkuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVQRVJNPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5QZXJtaXNzaW9uIGRlbmllZCAobmVlZHMgcmVhZC93cml0ZSBhY2Nlc3MpLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yIGluIHRoZSBkZXZpY2UgZHJpdmVyLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIDwvc2VjdGlvbj4KIAogPHNlY3Rpb24gaWQ9IkZFX0RJU0VRQ19TRU5EX0JVUlNUIj4KQEAgLTE0NzYsNDUgKzEyOTgsNyBAQAogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIAotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVGQVVMVDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+U2VxIHBvaW50cyB0byBhbiBpbnZhbGlkIGFkZHJlc3MuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlZBTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+VGhlIGRhdGEgc3RydWN0dXJlIHJlZmVycmVkIHRvIGJ5IHNlcSBpcyBpbnZhbGlkIGluIHNvbWUKLSB3YXkuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVQRVJNPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5QZXJtaXNzaW9uIGRlbmllZCAobmVlZHMgcmVhZC93cml0ZSBhY2Nlc3MpLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yIGluIHRoZSBkZXZpY2UgZHJpdmVyLjwvcGFyYT4KLTwvZW50cnk+Ci08L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPC9zZWN0aW9uPgogCiA8c2VjdGlvbiBpZD0iRkVfU0VUX1RPTkUiPgpAQCAtMTU2MCw0NCArMTM0NCw3IEBACiA8cGFyYT5UaGUgcmVxdWVzdGVkIHRvbmUgZ2VuZXJhdGlvbiBtb2RlIChvbi9vZmYpLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RU5PREVWPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5EZXZpY2UgZHJpdmVyIG5vdCBsb2FkZWQvYXZhaWxhYmxlLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQlVTWTwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RGV2aWNlIG9yIHJlc291cmNlIGJ1c3kuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlZBTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW52YWxpZCBhcmd1bWVudC48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RVBFUk08L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkZpbGUgbm90IG9wZW5lZCB3aXRoIHJlYWQgcGVybWlzc2lvbnMuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IgaW4gdGhlIGRldmljZSBkcml2ZXIuPC9wYXJhPgotPC9lbnRyeT4KLTwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiA8L3NlY3Rpb24+CiAKIDxzZWN0aW9uIGlkPSJGRV9TRVRfVk9MVEFHRSI+CkBAIC0xNjQ1LDQ0ICsxMzkyLDcgQEAKIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiAKLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FTk9ERVY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkRldmljZSBkcml2ZXIgbm90IGxvYWRlZC9hdmFpbGFibGUuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCVVNZPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5EZXZpY2Ugb3IgcmVzb3VyY2UgYnVzeS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnZhbGlkIGFyZ3VtZW50LjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FUEVSTTwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RmlsZSBub3Qgb3BlbmVkIHdpdGggcmVhZCBwZXJtaXNzaW9ucy48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvciBpbiB0aGUgZGV2aWNlIGRyaXZlci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiA8L3NlY3Rpb24+CiAKIDxzZWN0aW9uIGlkPSJGRV9FTkFCTEVfSElHSF9MTkJfVk9MVEFHRSI+CkBAIC0xNzMxLDQ0ICsxNDQxLDcgQEAKIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiAKLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FTk9ERVY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkRldmljZSBkcml2ZXIgbm90IGxvYWRlZC9hdmFpbGFibGUuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCVVNZPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5EZXZpY2Ugb3IgcmVzb3VyY2UgYnVzeS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnZhbGlkIGFyZ3VtZW50LjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FUEVSTTwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RmlsZSBub3Qgb3BlbmVkIHdpdGggcmVhZCBwZXJtaXNzaW9ucy48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvciBpbiB0aGUgZGV2aWNlIGRyaXZlci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiA8L3NlY3Rpb24+CiAKIDxzZWN0aW9uIGlkPSJGRV9TRVRfRlJPTlRFTkRfVFVORV9NT0RFIj4KQEAgLTE4MDAsMTEgKzE0NzMsNyBAQAogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIAotPHBhcmE+RVJST1JTPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz4KLTxlbnRyeSBhbGlnbj0iY2hhciI+PHBhcmE+RUlOVkFMPC9wYXJhPjwvZW50cnk+Ci08ZW50cnkgYWxpZ249ImNoYXIiPjxwYXJhPkludmFsaWQgYXJndW1lbnQuPC9wYXJhPjwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIDwvc2VjdGlvbj4KIAogPHNlY3Rpb24gaWQ9IkZFX0RJU0hORVRXT1JLX1NFTkRfTEVHQUNZX0NNRCI+CkBAIC0xODM4LDEyICsxNTA3LDcgQEAKIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiAKLTxwYXJhPkVSUk9SUzwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMSI+PHRib2R5Pjxyb3c+Ci08ZW50cnkgYWxpZ249ImNoYXIiPgotCTxwYXJhPlRoZXJlIGFyZSBubyBlcnJvcnMgaW4gdXNlIGZvciB0aGlzIGNhbGw8L3BhcmE+Ci08L2VudHJ5PgotPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIDwvc2VjdGlvbj4KIAogPC9zZWN0aW9uPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9pbnRyby54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL2ludHJvLnhtbApzaW1pbGFyaXR5IGluZGV4IDkyJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2ludHJvLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9pbnRyby54bWwKaW5kZXggMGRjODNmNi4uYzc1ZGM3YyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi9pbnRyby54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9pbnRyby54bWwKQEAgLTE1NCw2ICsxNTQsMTAgQEAKIDwvbGlzdGl0ZW0+CiAgPGxpc3RpdGVtPgogCis8cGFyYT48ZW1waGFzaXMgcm9sZT0idHQiPi9kZXYvZHZiL2FkYXB0ZXJOL2R2ck08L2VtcGhhc2lzPiw8L3BhcmE+Cis8L2xpc3RpdGVtPgorIDxsaXN0aXRlbT4KKwogPHBhcmE+PGVtcGhhc2lzIHJvbGU9InR0Ij4vZGV2L2R2Yi9hZGFwdGVyTi9jYU08L2VtcGhhc2lzPiw8L3BhcmE+PC9saXN0aXRlbT48L2l0ZW1pemVkbGlzdD4KIAogPHBhcmE+d2hlcmUgTiBlbnVtZXJhdGVzIHRoZSBEVkIgUENJIGNhcmRzIGluIGEgc3lzdGVtIHN0YXJ0aW5nCkBAIC0xNzUsMTAgKzE3OSwyNyBAQAogVGhlIERWQiBBUEkgaW5jbHVkZSBmaWxlcyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gYXBwbGljYXRpb24gc291cmNlcyB3aXRoCiBhIHBhcnRpYWwgcGF0aCBsaWtlOjwvcGFyYT4KIAotCis8cHJvZ3JhbWxpc3Rpbmc+CisJI2luY2x1ZGUgJiN4MDAzQztsaW51eC9kdmIvYXVkaW8uaCYjeDAwM0U7Cis8L3Byb2dyYW1saXN0aW5nPgorPHByb2dyYW1saXN0aW5nPgorCSNpbmNsdWRlICYjeDAwM0M7bGludXgvZHZiL2NhLmgmI3gwMDNFOworPC9wcm9ncmFtbGlzdGluZz4KKzxwcm9ncmFtbGlzdGluZz4KKwkjaW5jbHVkZSAmI3gwMDNDO2xpbnV4L2R2Yi9kbXguaCYjeDAwM0U7Cis8L3Byb2dyYW1saXN0aW5nPgogPHByb2dyYW1saXN0aW5nPgogCSNpbmNsdWRlICYjeDAwM0M7bGludXgvZHZiL2Zyb250ZW5kLmgmI3gwMDNFOwogPC9wcm9ncmFtbGlzdGluZz4KKzxwcm9ncmFtbGlzdGluZz4KKwkjaW5jbHVkZSAmI3gwMDNDO2xpbnV4L2R2Yi9uZXQuaCYjeDAwM0U7Cis8L3Byb2dyYW1saXN0aW5nPgorPHByb2dyYW1saXN0aW5nPgorCSNpbmNsdWRlICYjeDAwM0M7bGludXgvZHZiL29zZC5oJiN4MDAzRTsKKzwvcHJvZ3JhbWxpc3Rpbmc+Cis8cHJvZ3JhbWxpc3Rpbmc+CisJI2luY2x1ZGUgJiN4MDAzQztsaW51eC9kdmIvdmlkZW8uaCYjeDAwM0U7Cis8L3Byb2dyYW1saXN0aW5nPgogCiA8cGFyYT5UbyBlbmFibGUgYXBwbGljYXRpb25zIHRvIHN1cHBvcnQgZGlmZmVyZW50IEFQSSB2ZXJzaW9uLCBhbgogYWRkaXRpb25hbCBpbmNsdWRlIGZpbGUgPGVtcGhhc2lzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2tkYXBpLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmIva2RhcGkueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL2tkYXBpLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9rZGFwaS54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmIvbmV0LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmIvbmV0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2QzN2U1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi9uZXQueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzx0aXRsZT5EVkIgTmV0d29yayBBUEk8L3RpdGxlPgorPHBhcmE+VGhlIERWQiBuZXQgZGV2aWNlIGVuYWJsZXMgZmVlZGluZyBvZiBNUEUgKG11bHRpIHByb3RvY29sIGVuY2Fwc3VsYXRpb24pIHBhY2tldHMKK3JlY2VpdmVkIHZpYSBEVkIgaW50byB0aGUgTGludXggbmV0d29yayBwcm90b2NvbCBzdGFjaywgZS5nLiBmb3IgaW50ZXJuZXQgdmlhIHNhdGVsbGl0ZQorYXBwbGljYXRpb25zLiBJdCBjYW4gYmUgYWNjZXNzZWQgdGhyb3VnaCA8ZW1waGFzaXMgcm9sZT0idHQiPi9kZXYvZHZiL2FkYXB0ZXIwL25ldDA8L2VtcGhhc2lzPi4gRGF0YSB0eXBlcyBhbmQKK2FuZCBpb2N0bCBkZWZpbml0aW9ucyBjYW4gYmUgYWNjZXNzZWQgYnkgaW5jbHVkaW5nIDxlbXBoYXNpcyByb2xlPSJ0dCI+bGludXgvZHZiL25ldC5oPC9lbXBoYXNpcz4gaW4geW91cgorYXBwbGljYXRpb24uCis8L3BhcmE+Cis8c2VjdGlvbiBpZD0iZHZiX25ldF90eXBlcyI+Cis8dGl0bGU+RFZCIE5ldCBEYXRhIFR5cGVzPC90aXRsZT4KKworPHNlY3Rpb24gaWQ9ImR2Yi1uZXQtaWYiPgorPHRpdGxlPnN0cnVjdCBkdmJfbmV0X2lmPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZz4KK3N0cnVjdCBkdmJfbmV0X2lmIHsKKwlfX3UxNiBwaWQ7CisJX191MTYgaWZfbnVtOworCV9fdTggIGZlZWR0eXBlOworI2RlZmluZSBEVkJfTkVUX0ZFRURUWVBFX01QRSAwCS8mI3gyMkM2OyBtdWx0aSBwcm90b2NvbCBlbmNhcHN1bGF0aW9uICYjeDIyQzY7LworI2RlZmluZSBEVkJfTkVUX0ZFRURUWVBFX1VMRSAxCS8mI3gyMkM2OyB1bHRyYSBsaWdodHdlaWdodCBlbmNhcHN1bGF0aW9uICYjeDIyQzY7LworfTsKKzwvcHJvZ3JhbWxpc3Rpbmc+Cis8L3NlY3Rpb24+CisKKzwvc2VjdGlvbj4KKzxzZWN0aW9uIGlkPSJuZXRfZmNhbGxzIj4KKzx0aXRsZT5EVkIgbmV0IEZ1bmN0aW9uIENhbGxzPC90aXRsZT4KKzxwYXJhPlRvIGJlIHdyaXR0ZW4mI3gyMDI2OworPC9wYXJhPgorPC9zZWN0aW9uPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi92aWRlby54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvZHZiL3ZpZGVvLnhtbApzaW1pbGFyaXR5IGluZGV4IDgwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svZHZiL3ZpZGVvLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi92aWRlby54bWwKaW5kZXggN2JiMjg3ZS4uMjVmYjgyMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2R2Yi92aWRlby54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2Yi92aWRlby54bWwKQEAgLTE4LDE1ICsxOCwxNiBAQAogPHNlY3Rpb24gaWQ9InZpZGVvX3R5cGVzIj4KIDx0aXRsZT5WaWRlbyBEYXRhIFR5cGVzPC90aXRsZT4KIAotPHNlY3Rpb24gaWQ9InZpZGVvX2Zvcm1hdF90Ij4KKzxzZWN0aW9uIGlkPSJ2aWRlby1mb3JtYXQtdCI+CiA8dGl0bGU+dmlkZW9fZm9ybWF0X3Q8L3RpdGxlPgogPHBhcmE+VGhlIDxlbXBoYXNpcyByb2xlPSJ0dCI+dmlkZW9fZm9ybWF0X3Q8L2VtcGhhc2lzPiBkYXRhIHR5cGUgZGVmaW5lZCBieQogPC9wYXJhPgogPHByb2dyYW1saXN0aW5nPgotIHR5cGVkZWYgZW51bSB7Ci0JIFZJREVPX0ZPUk1BVF80XzMsCi0JIFZJREVPX0ZPUk1BVF8xNl85Ci0gfSB2aWRlb19mb3JtYXRfdDsKK3R5cGVkZWYgZW51bSB7CisJVklERU9fRk9STUFUXzRfMywgICAgIC8mI3gyMkM2OyBTZWxlY3QgNDozIGZvcm1hdCAmI3gyMkM2Oy8KKwlWSURFT19GT1JNQVRfMTZfOSwgICAgLyYjeDIyQzY7IFNlbGVjdCAxNjo5IGZvcm1hdC4gJiN4MjJDNjsvCisJVklERU9fRk9STUFUXzIyMV8xICAgIC8mI3gyMkM2OyAyLjIxOjEgJiN4MjJDNjsvCit9IHZpZGVvX2Zvcm1hdF90OwogPC9wcm9ncmFtbGlzdGluZz4KIDxwYXJhPmlzIHVzZWQgaW4gdGhlIFZJREVPX1NFVF9GT1JNQVQgZnVuY3Rpb24gKD8/KSB0byB0ZWxsIHRoZSBkcml2ZXIgd2hpY2ggYXNwZWN0IHJhdGlvCiB0aGUgb3V0cHV0IGhhcmR3YXJlIChlLmcuIFRWKSBoYXMuIEl0IGlzIGFsc28gdXNlZCBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmVzIHZpZGVvX3N0YXR1cwpAQCAtMzYsMzQgKzM3LDM2IEBACiA8L3BhcmE+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJ2aWRlb19kaXNwbGF5X2Zvcm1hdF90Ij4KLTx0aXRsZT52aWRlb19kaXNwbGF5X2Zvcm1hdF90PC90aXRsZT4KKzxzZWN0aW9uIGlkPSJ2aWRlby1kaXNwbGF5Zm9ybWF0LXQiPgorPHRpdGxlPnZpZGVvX2Rpc3BsYXlmb3JtYXRfdDwvdGl0bGU+CiA8cGFyYT5JbiBjYXNlIHRoZSBkaXNwbGF5IGZvcm1hdCBvZiB0aGUgdmlkZW8gc3RyZWFtIGFuZCBvZiB0aGUgZGlzcGxheSBoYXJkd2FyZSBkaWZmZXIgdGhlCiBhcHBsaWNhdGlvbiBoYXMgdG8gc3BlY2lmeSBob3cgdG8gaGFuZGxlIHRoZSBjcm9wcGluZyBvZiB0aGUgcGljdHVyZS4gVGhpcyBjYW4gYmUgZG9uZSB1c2luZwogdGhlIFZJREVPX1NFVF9ESVNQTEFZX0ZPUk1BVCBjYWxsICg/Pykgd2hpY2ggYWNjZXB0cwogPC9wYXJhPgogPHByb2dyYW1saXN0aW5nPgotIHR5cGVkZWYgZW51bSB7Ci0JIFZJREVPX1BBTl9TQ0FOLAotCSBWSURFT19MRVRURVJfQk9YLAotCSBWSURFT19DRU5URVJfQ1VUX09VVAotIH0gdmlkZW9fZGlzcGxheV9mb3JtYXRfdDsKK3R5cGVkZWYgZW51bSB7CisJVklERU9fUEFOX1NDQU4sICAgICAgIC8mI3gyMkM2OyB1c2UgcGFuIGFuZCBzY2FuIGZvcm1hdCAmI3gyMkM2Oy8KKwlWSURFT19MRVRURVJfQk9YLCAgICAgLyYjeDIyQzY7IHVzZSBsZXR0ZXJib3ggZm9ybWF0ICYjeDIyQzY7LworCVZJREVPX0NFTlRFUl9DVVRfT1VUICAvJiN4MjJDNjsgdXNlIGNlbnRlciBjdXQgb3V0IGZvcm1hdCAmI3gyMkM2Oy8KK30gdmlkZW9fZGlzcGxheWZvcm1hdF90OwogPC9wcm9ncmFtbGlzdGluZz4KIDxwYXJhPmFzIGFyZ3VtZW50LgogPC9wYXJhPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0idmlkZW9fc3RyZWFtX3NvdXJjZSI+Cis8c2VjdGlvbiBpZD0idmlkZW8tc3RyZWFtLXNvdXJjZS10Ij4KIDx0aXRsZT52aWRlbyBzdHJlYW0gc291cmNlPC90aXRsZT4KIDxwYXJhPlRoZSB2aWRlbyBzdHJlYW0gc291cmNlIGlzIHNldCB0aHJvdWdoIHRoZSBWSURFT19TRUxFQ1RfU09VUkNFIGNhbGwgYW5kIGNhbiB0YWtlCiB0aGUgZm9sbG93aW5nIHZhbHVlcywgZGVwZW5kaW5nIG9uIHdoZXRoZXIgd2UgYXJlIHJlcGxheWluZyBmcm9tIGFuIGludGVybmFsIChkZW11eGVyKSBvcgogZXh0ZXJuYWwgKHVzZXIgd3JpdGUpIHNvdXJjZS4KIDwvcGFyYT4KIDxwcm9ncmFtbGlzdGluZz4KLSB0eXBlZGVmIGVudW0gewotCSBWSURFT19TT1VSQ0VfREVNVVgsCi0JIFZJREVPX1NPVVJDRV9NRU1PUlkKLSB9IHZpZGVvX3N0cmVhbV9zb3VyY2VfdDsKK3R5cGVkZWYgZW51bSB7CisJVklERU9fU09VUkNFX0RFTVVYLCAvJiN4MjJDNjsgU2VsZWN0IHRoZSBkZW11eCBhcyB0aGUgbWFpbiBzb3VyY2UgJiN4MjJDNjsvCisJVklERU9fU09VUkNFX01FTU9SWSAvJiN4MjJDNjsgSWYgdGhpcyBzb3VyY2UgaXMgc2VsZWN0ZWQsIHRoZSBzdHJlYW0KKwkJCSAgICAgICBjb21lcyBmcm9tIHRoZSB1c2VyIHRocm91Z2ggdGhlIHdyaXRlCisJCQkgICAgICAgc3lzdGVtIGNhbGwgJiN4MjJDNjsvCit9IHZpZGVvX3N0cmVhbV9zb3VyY2VfdDsKIDwvcHJvZ3JhbWxpc3Rpbmc+CiA8cGFyYT5WSURFT19TT1VSQ0VfREVNVVggc2VsZWN0cyB0aGUgZGVtdWx0aXBsZXhlciAoZmVkIGVpdGhlciBieSB0aGUgZnJvbnRlbmQgb3IgdGhlCiBEVlIgZGV2aWNlKSBhcyB0aGUgc291cmNlIG9mIHRoZSB2aWRlbyBzdHJlYW0uIElmIFZJREVPX1NPVVJDRV9NRU1PUlkKQEAgLTcyLDQ5ICs3NSw5OCBAQAogPC9wYXJhPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0idmlkZW9fcGxheV9zdGF0ZSI+Cis8c2VjdGlvbiBpZD0idmlkZW8tcGxheS1zdGF0ZS10Ij4KIDx0aXRsZT52aWRlbyBwbGF5IHN0YXRlPC90aXRsZT4KIDxwYXJhPlRoZSBmb2xsb3dpbmcgdmFsdWVzIGNhbiBiZSByZXR1cm5lZCBieSB0aGUgVklERU9fR0VUX1NUQVRVUyBjYWxsIHJlcHJlc2VudGluZyB0aGUKIHN0YXRlIG9mIHZpZGVvIHBsYXliYWNrLgogPC9wYXJhPgogPHByb2dyYW1saXN0aW5nPgotIHR5cGVkZWYgZW51bSB7Ci0JIFZJREVPX1NUT1BQRUQsCi0JIFZJREVPX1BMQVlJTkcsCi0JIFZJREVPX0ZSRUVaRUQKLSB9IHZpZGVvX3BsYXlfc3RhdGVfdDsKK3R5cGVkZWYgZW51bSB7CisJVklERU9fU1RPUFBFRCwgLyYjeDIyQzY7IFZpZGVvIGlzIHN0b3BwZWQgJiN4MjJDNjsvCisJVklERU9fUExBWUlORywgLyYjeDIyQzY7IFZpZGVvIGlzIGN1cnJlbnRseSBwbGF5aW5nICYjeDIyQzY7LworCVZJREVPX0ZSRUVaRUQgIC8mI3gyMkM2OyBWaWRlbyBpcyBmcmVlemVkICYjeDIyQzY7LworfSB2aWRlb19wbGF5X3N0YXRlX3Q7CiA8L3Byb2dyYW1saXN0aW5nPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0idmlkZW9fZXZlbnQiPgorPHNlY3Rpb24gaWQ9InZpZGVvLWNvbW1hbmQiPgorPHBhcmE+VGhlIHN0cnVjdHVyZSBtdXN0IGJlIHplcm9lZCBiZWZvcmUgdXNlIGJ5IHRoZSBhcHBsaWNhdGlvbgorVGhpcyBlbnN1cmVzIGl0IGNhbiBiZSBleHRlbmRlZCBzYWZlbHkgaW4gdGhlIGZ1dHVyZS48L3BhcmE+Cis8dGl0bGU+c3RydWN0IHZpZGVvLWNvbW1hbmQ8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgorc3RydWN0IHZpZGVvX2NvbW1hbmQgeworCV9fdTMyIGNtZDsKKwlfX3UzMiBmbGFnczsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlfX3U2NCBwdHM7CisJCX0gc3RvcDsKKworCQlzdHJ1Y3QgeworCQkJLyYjeDIyQzY7IDAgb3IgMTAwMCBzcGVjaWZpZXMgbm9ybWFsIHNwZWVkLAorCQkJICAgMSBzcGVjaWZpZXMgZm9yd2FyZCBzaW5nbGUgc3RlcHBpbmcsCisJCQkgICAtMSBzcGVjaWZpZXMgYmFja3dhcmQgc2luZ2xlIHN0ZXBwaW5nLAorCQkJICAgJmd0Oz4xOiBwbGF5YmFjayBhdCBzcGVlZC8xMDAwIG9mIHRoZSBub3JtYWwgc3BlZWQsCisJCQkgICAmbHQ7LTE6IHJldmVyc2UgcGxheWJhY2sgYXQgKC1zcGVlZC8xMDAwKSBvZiB0aGUgbm9ybWFsIHNwZWVkLiAmI3gyMkM2Oy8KKwkJCV9fczMyIHNwZWVkOworCQkJX191MzIgZm9ybWF0OworCQl9IHBsYXk7CisKKwkJc3RydWN0IHsKKwkJCV9fdTMyIGRhdGFbMTZdOworCQl9IHJhdzsKKwl9OworfTsKKzwvcHJvZ3JhbWxpc3Rpbmc+Cis8L3NlY3Rpb24+CisKKzxzZWN0aW9uIGlkPSJ2aWRlby1zaXplLXQiPgorPHRpdGxlPnN0cnVjdCB2aWRlb19zaXplLXQ8L3RpdGxlPgorPHByb2dyYW1saXN0aW5nPgordHlwZWRlZiBzdHJ1Y3QgeworCWludCB3OworCWludCBoOworCXZpZGVvX2Zvcm1hdF90IGFzcGVjdF9yYXRpbzsKK30gdmlkZW9fc2l6ZV90OworPC9wcm9ncmFtbGlzdGluZz4KKzwvc2VjdGlvbj4KKworCis8c2VjdGlvbiBpZD0idmlkZW8tZXZlbnQiPgogPHRpdGxlPnN0cnVjdCB2aWRlb19ldmVudDwvdGl0bGU+CiA8cGFyYT5UaGUgZm9sbG93aW5nIGlzIHRoZSBzdHJ1Y3R1cmUgb2YgYSB2aWRlbyBldmVudCBhcyBpdCBpcyByZXR1cm5lZCBieSB0aGUgVklERU9fR0VUX0VWRU5UCiBjYWxsLgogPC9wYXJhPgogPHByb2dyYW1saXN0aW5nPgotIHN0cnVjdCB2aWRlb19ldmVudCB7Ci0JIGludDMyX3QgdHlwZTsKLQkgdGltZV90IHRpbWVzdGFtcDsKLQkgdW5pb24gewotCQkgdmlkZW9fZm9ybWF0X3QgdmlkZW9fZm9ybWF0OwotCSB9IHU7Ci0gfTsKK3N0cnVjdCB2aWRlb19ldmVudCB7CisJX19zMzIgdHlwZTsKKyNkZWZpbmUgVklERU9fRVZFTlRfU0laRV9DSEFOR0VECTEKKyNkZWZpbmUgVklERU9fRVZFTlRfRlJBTUVfUkFURV9DSEFOR0VECTIKKyNkZWZpbmUgVklERU9fRVZFTlRfREVDT0RFUl9TVE9QUEVEIAkzCisjZGVmaW5lIFZJREVPX0VWRU5UX1ZTWU5DIAkJNAorCV9fa2VybmVsX3RpbWVfdCB0aW1lc3RhbXA7CisJdW5pb24geworCQl2aWRlb19zaXplX3Qgc2l6ZTsKKwkJdW5zaWduZWQgaW50IGZyYW1lX3JhdGU7CS8mI3gyMkM2OyBpbiBmcmFtZXMgcGVyIDEwMDBzZWMgJiN4MjJDNjsvCisJCXVuc2lnbmVkIGNoYXIgdnN5bmNfZmllbGQ7CS8mI3gyMkM2OyB1bmtub3duL29kZC9ldmVuL3Byb2dyZXNzaXZlICYjeDIyQzY7LworCX0gdTsKK307CiA8L3Byb2dyYW1saXN0aW5nPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0idmlkZW9fc3RhdHVzIj4KKzxzZWN0aW9uIGlkPSJ2aWRlby1zdGF0dXMiPgogPHRpdGxlPnN0cnVjdCB2aWRlb19zdGF0dXM8L3RpdGxlPgogPHBhcmE+VGhlIFZJREVPX0dFVF9TVEFUVVMgY2FsbCByZXR1cm5zIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGluZm9ybWluZyBhYm91dCB2YXJpb3VzCiBzdGF0ZXMgb2YgdGhlIHBsYXliYWNrIG9wZXJhdGlvbi4KIDwvcGFyYT4KIDxwcm9ncmFtbGlzdGluZz4KLSBzdHJ1Y3QgdmlkZW9fc3RhdHVzIHsKLQkgYm9vbGVhbiB2aWRlb19ibGFuazsKLQkgdmlkZW9fcGxheV9zdGF0ZV90IHBsYXlfc3RhdGU7Ci0JIHZpZGVvX3N0cmVhbV9zb3VyY2VfdCBzdHJlYW1fc291cmNlOwotCSB2aWRlb19mb3JtYXRfdCB2aWRlb19mb3JtYXQ7Ci0JIHZpZGVvX2Rpc3BsYXlmb3JtYXRfdCBkaXNwbGF5X2Zvcm1hdDsKLSB9Oworc3RydWN0IHZpZGVvX3N0YXR1cyB7CisJaW50ICAgICAgICAgICAgICAgICAgIHZpZGVvX2JsYW5rOyAgIC8mI3gyMkM2OyBibGFuayB2aWRlbyBvbiBmcmVlemU/ICYjeDIyQzY7LworCXZpZGVvX3BsYXlfc3RhdGVfdCAgICBwbGF5X3N0YXRlOyAgICAvJiN4MjJDNjsgY3VycmVudCBzdGF0ZSBvZiBwbGF5YmFjayAmI3gyMkM2Oy8KKwl2aWRlb19zdHJlYW1fc291cmNlX3Qgc3RyZWFtX3NvdXJjZTsgLyYjeDIyQzY7IGN1cnJlbnQgc291cmNlIChkZW11eC9tZW1vcnkpICYjeDIyQzY7LworCXZpZGVvX2Zvcm1hdF90ICAgICAgICB2aWRlb19mb3JtYXQ7ICAvJiN4MjJDNjsgY3VycmVudCBhc3BlY3QgcmF0aW8gb2Ygc3RyZWFtICYjeDIyQzY7LworCXZpZGVvX2Rpc3BsYXlmb3JtYXRfdCBkaXNwbGF5X2Zvcm1hdDsvJiN4MjJDNjsgc2VsZWN0ZWQgY3JvcHBpbmcgbW9kZSAmI3gyMkM2Oy8KK307CiA8L3Byb2dyYW1saXN0aW5nPgogPHBhcmE+SWYgdmlkZW9fYmxhbmsgaXMgc2V0IHZpZGVvIHdpbGwgYmUgYmxhbmtlZCBvdXQgaWYgdGhlIGNoYW5uZWwgaXMgY2hhbmdlZCBvciBpZiBwbGF5YmFjayBpcwogc3RvcHBlZC4gT3RoZXJ3aXNlLCB0aGUgbGFzdCBwaWN0dXJlIHdpbGwgYmUgZGlzcGxheWVkLiBwbGF5X3N0YXRlIGluZGljYXRlcyBpZiB0aGUgdmlkZW8gaXMKQEAgLTEyNywxNyArMTc5LDE3IEBACiA8L3BhcmE+CiA8L3NlY3Rpb24+CiAKLTxzZWN0aW9uIGlkPSJ2aWRlb19zdGlsbF9waWN0dXJlIj4KKzxzZWN0aW9uIGlkPSJ2aWRlby1zdGlsbC1waWN0dXJlIj4KIDx0aXRsZT5zdHJ1Y3QgdmlkZW9fc3RpbGxfcGljdHVyZTwvdGl0bGU+CiA8cGFyYT5BbiBJLWZyYW1lIGRpc3BsYXllZCB2aWEgdGhlIFZJREVPX1NUSUxMUElDVFVSRSBjYWxsIGlzIHBhc3NlZCBvbiB3aXRoaW4gdGhlCiBmb2xsb3dpbmcgc3RydWN0dXJlLgogPC9wYXJhPgogPHByb2dyYW1saXN0aW5nPgotIC8mI3gyMkM2OyBwb2ludGVyIHRvIGFuZCBzaXplIG9mIGEgc2luZ2xlIGlmcmFtZSBpbiBtZW1vcnkgJiN4MjJDNjsvCi0gc3RydWN0IHZpZGVvX3N0aWxsX3BpY3R1cmUgewotCSBjaGFyICYjeDIyQzY7aUZyYW1lOwotCSBpbnQzMl90IHNpemU7Ci0gfTsKKy8mI3gyMkM2OyBwb2ludGVyIHRvIGFuZCBzaXplIG9mIGEgc2luZ2xlIGlmcmFtZSBpbiBtZW1vcnkgJiN4MjJDNjsvCitzdHJ1Y3QgdmlkZW9fc3RpbGxfcGljdHVyZSB7CisJY2hhciAmI3gyMkM2O2lGcmFtZTsgICAgICAgIC8mI3gyMkM2OyBwb2ludGVyIHRvIGEgc2luZ2xlIGlmcmFtZSBpbiBtZW1vcnkgJiN4MjJDNjsvCisJaW50MzJfdCBzaXplOworfTsKIDwvcHJvZ3JhbWxpc3Rpbmc+CiA8L3NlY3Rpb24+CiAKQEAgLTE2NCwyNiArMjE2LDI2IEBACiA8L3Byb2dyYW1saXN0aW5nPgogPC9zZWN0aW9uPgogCi08c2VjdGlvbiBpZD0idmlkZW9fc3lzdGVtIj4KKzxzZWN0aW9uIGlkPSJ2aWRlby1zeXN0ZW0iPgogPHRpdGxlPnZpZGVvIHN5c3RlbTwvdGl0bGU+CiA8cGFyYT5BIGNhbGwgdG8gVklERU9fU0VUX1NZU1RFTSBzZXRzIHRoZSBkZXNpcmVkIHZpZGVvIHN5c3RlbSBmb3IgVFYgb3V0cHV0LiBUaGUKIGZvbGxvd2luZyBzeXN0ZW0gdHlwZXMgY2FuIGJlIHNldDoKIDwvcGFyYT4KIDxwcm9ncmFtbGlzdGluZz4KLSB0eXBlZGVmIGVudW0gewotCSAgVklERU9fU1lTVEVNX1BBTCwKLQkgIFZJREVPX1NZU1RFTV9OVFNDLAotCSAgVklERU9fU1lTVEVNX1BBTE4sCi0JICBWSURFT19TWVNURU1fUEFMTmMsCi0JICBWSURFT19TWVNURU1fUEFMTSwKLQkgIFZJREVPX1NZU1RFTV9OVFNDNjAsCi0JICBWSURFT19TWVNURU1fUEFMNjAsCi0JICBWSURFT19TWVNURU1fUEFMTTYwCi0gfSB2aWRlb19zeXN0ZW1fdDsKK3R5cGVkZWYgZW51bSB7CisJIFZJREVPX1NZU1RFTV9QQUwsCisJIFZJREVPX1NZU1RFTV9OVFNDLAorCSBWSURFT19TWVNURU1fUEFMTiwKKwkgVklERU9fU1lTVEVNX1BBTE5jLAorCSBWSURFT19TWVNURU1fUEFMTSwKKwkgVklERU9fU1lTVEVNX05UU0M2MCwKKwkgVklERU9fU1lTVEVNX1BBTDYwLAorCSBWSURFT19TWVNURU1fUEFMTTYwCit9IHZpZGVvX3N5c3RlbV90OwogPC9wcm9ncmFtbGlzdGluZz4KIDwvc2VjdGlvbj4KIAotPHNlY3Rpb24gaWQ9InZpZGVvX2hpZ2hsaWdodCI+Cis8c2VjdGlvbiBpZD0idmlkZW8taGlnaGxpZ2h0Ij4KIDx0aXRsZT5zdHJ1Y3QgdmlkZW9faGlnaGxpZ2h0PC90aXRsZT4KIDxwYXJhPkNhbGxpbmcgdGhlIGlvY3RsIFZJREVPX1NFVF9ISUdITElHSFRTIHBvc3RzIHRoZSBTUFUgaGlnaGxpZ2h0IGluZm9ybWF0aW9uLiBUaGUKIGNhbGwgZXhwZWN0cyB0aGUgZm9sbG93aW5nIGZvcm1hdCBmb3IgdGhhdCBpbmZvcm1hdGlvbjoKQEAgLTIxMCw3ICsyNjIsNyBAQAogPC9wcm9ncmFtbGlzdGluZz4KIAogPC9zZWN0aW9uPgotPHNlY3Rpb24gaWQ9InZpZGVvX3NwdSI+Cis8c2VjdGlvbiBpZD0idmlkZW8tc3B1Ij4KIDx0aXRsZT52aWRlbyBTUFU8L3RpdGxlPgogPHBhcmE+Q2FsbGluZyBWSURFT19TRVRfU1BVIGRlYWN0aXZhdGVzIG9yIGFjdGl2YXRlcyBTUFUgZGVjb2RpbmcsIGFjY29yZGluZyB0byB0aGUKIGZvbGxvd2luZyBmb3JtYXQ6CkBAIC0yMjQsNyArMjc2LDcgQEAKIDwvcHJvZ3JhbWxpc3Rpbmc+CiAKIDwvc2VjdGlvbj4KLTxzZWN0aW9uIGlkPSJ2aWRlb19zcHVfcGFsZXR0ZSI+Cis8c2VjdGlvbiBpZD0idmlkZW8tc3B1LXBhbGV0dGUiPgogPHRpdGxlPnZpZGVvIFNQVSBwYWxldHRlPC90aXRsZT4KIDxwYXJhPlRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGlzIHVzZWQgdG8gc2V0IHRoZSBTUFUgcGFsZXR0ZSBieSBjYWxsaW5nIFZJREVPX1NQVV9QQUxFVFRFOgogPC9wYXJhPgpAQCAtMjM3LDcgKzI4OSw3IEBACiA8L3Byb2dyYW1saXN0aW5nPgogCiA8L3NlY3Rpb24+Ci08c2VjdGlvbiBpZD0idmlkZW9fbmF2aV9wYWNrIj4KKzxzZWN0aW9uIGlkPSJ2aWRlby1uYXZpLXBhY2siPgogPHRpdGxlPnZpZGVvIE5BVkkgcGFjazwvdGl0bGU+CiA8cGFyYT5JbiBvcmRlciB0byBnZXQgdGhlIG5hdmlnYXRpb25hbCBkYXRhIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGhhcyB0byBiZSBwYXNzZWQgdG8gdGhlIGlvY3RsCiBWSURFT19HRVRfTkFWSToKQEAgLTI1Miw3ICszMDQsNyBAQAogPC9zZWN0aW9uPgogCiAKLTxzZWN0aW9uIGlkPSJ2aWRlb19hdHRyaWJ1dGVzIj4KKzxzZWN0aW9uIGlkPSJ2aWRlby1hdHRyaWJ1dGVzLXQiPgogPHRpdGxlPnZpZGVvIGF0dHJpYnV0ZXM8L3RpdGxlPgogPHBhcmE+VGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGNhbiBiZSBzZXQgYnkgYSBjYWxsIHRvIFZJREVPX1NFVF9BVFRSSUJVVEVTOgogPC9wYXJhPgpAQCAtMzQ3LDggKzM5OSw3IEBACiA8cGFyYT4oYmxvY2tpbmcgbW9kZSBpcyB0aGUgZGVmYXVsdCk8L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Cis8cGFyYT5SRVRVUk4gVkFMVUU8L3BhcmE+CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVOT0RFVjwvcGFyYT4KQEAgLTQwNiw4ICs0NTcsNyBAQAogPHBhcmE+RmlsZSBkZXNjcmlwdG9yIHJldHVybmVkIGJ5IGEgcHJldmlvdXMgY2FsbCB0byBvcGVuKCkuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorPHBhcmE+UkVUVVJOIFZBTFVFPC9wYXJhPgogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+CiA8cGFyYT5FQkFERjwvcGFyYT4KQEAgLTQ2Miw4ICs1MTIsNyBAQAogPHBhcmE+U2l6ZSBvZiBidWYuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorPHBhcmE+UkVUVVJOIFZBTFVFPC9wYXJhPgogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+CiA8cGFyYT5FUEVSTTwvcGFyYT4KQEAgLTQ4OCw3ICs1MzcsNyBAQAogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IlZJREVPX1NUT1AiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+VklERU9fU1RPUDwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtNTQzLDI2ICs1OTIsOSBAQAogPHBhcmE+RkFMU0U6IFNob3cgbGFzdCBkZWNvZGVkIGZyYW1lLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IsIHBvc3NpYmx5IGluIHRoZSBjb21tdW5pY2F0aW9uIHdpdGggdGhlCi0gRFZCIHN1YnN5c3RlbS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJWSURFT19QTEFZIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPlZJREVPX1BMQVk8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTU5NiwyNiArNjI4LDkgQEAKIDxwYXJhPkVxdWFscyBWSURFT19QTEFZIGZvciB0aGlzIGNvbW1hbmQuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3I8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvciwgcG9zc2libHkgaW4gdGhlIGNvbW11bmljYXRpb24gd2l0aCB0aGUKLSBEVkIgc3Vic3lzdGVtLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IlZJREVPX0ZSRUVaRSIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5WSURFT19GUkVFWkU8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTY1MywyNiArNjY4LDkgQEAKIDxwYXJhPkVxdWFscyBWSURFT19GUkVFWkUgZm9yIHRoaXMgY29tbWFuZC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yLCBwb3NzaWJseSBpbiB0aGUgY29tbXVuaWNhdGlvbiB3aXRoIHRoZQotIERWQiBzdWJzeXN0ZW0uPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iVklERU9fQ09OVElOVUUiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+VklERU9fQ09OVElOVUU8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTcwNiwyNiArNzA0LDkgQEAKIDxwYXJhPkVxdWFscyBWSURFT19DT05USU5VRSBmb3IgdGhpcyBjb21tYW5kLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IsIHBvc3NpYmx5IGluIHRoZSBjb21tdW5pY2F0aW9uIHdpdGggdGhlCi0gRFZCIHN1YnN5c3RlbS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJWSURFT19TRUxFQ1RfU09VUkNFIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPlZJREVPX1NFTEVDVF9TT1VSQ0U8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTc2OSwyNiArNzUwLDkgQEAKIDxwYXJhPkluZGljYXRlcyB3aGljaCBzb3VyY2Ugc2hhbGwgYmUgdXNlZCBmb3IgdGhlIFZpZGVvIHN0cmVhbS48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yLCBwb3NzaWJseSBpbiB0aGUgY29tbXVuaWNhdGlvbiB3aXRoIHRoZQotIERWQiBzdWJzeXN0ZW0uPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iVklERU9fU0VUX0JMQU5LIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPlZJREVPX1NFVF9CTEFOSzwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtODM1LDMzICs3OTksOSBAQAogPHBhcmE+RkFMU0U6IFNob3cgbGFzdCBkZWNvZGVkIGZyYW1lLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IsIHBvc3NpYmx5IGluIHRoZSBjb21tdW5pY2F0aW9uIHdpdGggdGhlCi0gRFZCIHN1YnN5c3RlbS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbGxlZ2FsIGlucHV0IHBhcmFtZXRlcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CismcmV0dXJuLXZhbHVlLWR2YjsKIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IlZJREVPX0dFVF9TVEFUVVMiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+VklERU9fR0VUX1NUQVRVUzwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtOTAzLDMzICs4NDMsOSBAQAogPHBhcmE+UmV0dXJucyB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIFZpZGVvIERldmljZS48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+Ci08aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yLCBwb3NzaWJseSBpbiB0aGUgY29tbXVuaWNhdGlvbiB3aXRoIHRoZQotIERWQiBzdWJzeXN0ZW0uPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVGQVVMVDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+c3RhdHVzIHBvaW50cyB0byBpbnZhbGlkIGFkZHJlc3M8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJWSURFT19HRVRfRVZFTlQiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+VklERU9fR0VUX0VWRU5UPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC05ODAsMjQgKzg5Niw5IEBACiAgc3RvcmVkLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3I8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUZBVUxUPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5ldiBwb2ludHMgdG8gaW52YWxpZCBhZGRyZXNzPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVXT1VMREJMT0NLPC9wYXJhPgogPC9lbnRyeT48ZW50cnkKICBhbGlnbj0iY2hhciI+CkBAIC0xMDA5LDE2ICs5MTAsMTEgQEAKIDxwYXJhPkVPVkVSRkxPVzwvcGFyYT4KIDwvZW50cnk+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgogPHBhcmE+T3ZlcmZsb3cgaW4gZXZlbnQgcXVldWUgLSBvbmUgb3IgbW9yZSBldmVudHMgd2VyZSBsb3N0LjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJWSURFT19TRVRfRElTUExBWV9GT1JNQVQiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+VklERU9fU0VUX0RJU1BMQVlfRk9STUFUPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xMDYzLDMyICs5NTksOSBAQAogPHBhcmE+U2VsZWN0cyB0aGUgdmlkZW8gZm9ybWF0IHRvIGJlIHVzZWQuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3I8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbGxlZ2FsIHBhcmFtZXRlciBmb3JtYXQuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iVklERU9fU1RJTExQSUNUVVJFIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPlZJREVPX1NUSUxMUElDVFVSRTwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtMTEzMywzMiArMTAwNiw5IEBACiA8cGFyYT5Qb2ludGVyIHRvIGEgbG9jYXRpb24gd2hlcmUgYW4gSS1mcmFtZSBhbmQgc2l6ZSBpcyBzdG9yZWQuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3I8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUZBVUxUPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5zcCBwb2ludHMgdG8gYW4gaW52YWxpZCBpZnJhbWUuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iVklERU9fRkFTVF9GT1JXQVJEIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPlZJREVPX0ZBU1RfRk9SV0FSRDwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtMTIwMCwzOSArMTA1MCwxNyBAQAogPHBhcmE+VGhlIG51bWJlciBvZiBmcmFtZXMgdG8gc2tpcC48L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+CismcmV0dXJuLXZhbHVlLWR2YjsKIDxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlRFUk5BTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SW50ZXJuYWwgZXJyb3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KIDxwYXJhPkVQRVJNPC9wYXJhPgogPC9lbnRyeT48ZW50cnkKICBhbGlnbj0iY2hhciI+CiA8cGFyYT5Nb2RlIFZJREVPX1NPVVJDRV9NRU1PUlkgbm90IHNlbGVjdGVkLjwvcGFyYT4KIDwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5WQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPklsbGVnYWwgcGFyYW1ldGVyIGZvcm1hdC48L3BhcmE+Ci08L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iVklERU9fU0xPV01PVElPTiIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5WSURFT19TTE9XTU9USU9OPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xMjc0LDM5ICsxMTAyLDE3IEBACiA8cGFyYT5UaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCBlYWNoIGZyYW1lLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3I8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUlOVEVSTkFMPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5JbnRlcm5hbCBlcnJvci48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgogPHBhcmE+RVBFUk08L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KIDxwYXJhPk1vZGUgVklERU9fU09VUkNFX01FTU9SWSBub3Qgc2VsZWN0ZWQuPC9wYXJhPgogPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlZBTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+SWxsZWdhbCBwYXJhbWV0ZXIgZm9ybWF0LjwvcGFyYT4KLTwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJWSURFT19HRVRfQ0FQQUJJTElUSUVTIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPlZJREVPX0dFVF9DQVBBQklMSVRJRVM8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTEzNTAsMjUgKzExNTYsOSBAQAogIGluZm9ybWF0aW9uLjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVGQVVMVDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+Y2FwIHBvaW50cyB0byBhbiBpbnZhbGlkIGlmcmFtZS48L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJWSURFT19TRVRfSUQiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+VklERU9fU0VUX0lEPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xNDEwLDI0ICsxMjAwLDkgQEAKIDxwYXJhPnZpZGVvIHN1Yi1zdHJlYW0gaWQ8L3BhcmE+CiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgotPHBhcmE+RVJST1JTCi08L3BhcmE+CismcmV0dXJuLXZhbHVlLWR2YjsKIDxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5CiAgYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FSU5URVJOQUw8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkludGVybmFsIGVycm9yLjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+CiA8cGFyYT5FSU5WQUw8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KQEAgLTE0MzUsNyArMTIxMCw3IEBACiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iVklERU9fQ0xFQVJfQlVGRkVSIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPlZJREVPX0NMRUFSX0JVRkZFUjwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtMTQ2OCwxOCArMTI0Myw5IEBACiA8cGFyYT5FcXVhbHMgVklERU9fQ0xFQVJfQlVGRkVSIGZvciB0aGlzIGNvbW1hbmQuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3I8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgorJnJldHVybi12YWx1ZS1kdmI7CiAKLTwvc2VjdGlvbj48c2VjdGlvbgorPC9zZWN0aW9uPjxzZWN0aW9uIGlkPSJWSURFT19TRVRfU1RSRUFNVFlQRSIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5WSURFT19TRVRfU1RSRUFNVFlQRTwvdGl0bGU+CiA8cGFyYT5ERVNDUklQVElPTgogPC9wYXJhPgpAQCAtMTUyMiwyNSArMTI4OCw5IEBACiA8cGFyYT5zdHJlYW0gdHlwZTwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KLTxpbmZvcm1hbHRhYmxlPjx0Z3JvdXAgY29scz0iMiI+PHRib2R5Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+RUJBREY8L3BhcmE+Ci08L2VudHJ5PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPmZkIGlzIG5vdCBhIHZhbGlkIG9wZW4gZmlsZSBkZXNjcmlwdG9yPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlZBTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+dHlwZSBpcyBub3QgYSB2YWxpZCBvciBzdXBwb3J0ZWQgc3RyZWFtIHR5cGUuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iVklERU9fU0VUX0ZPUk1BVCIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5WSURFT19TRVRfRk9STUFUPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xNTgzLDE3ICsxMzMzLDkgQEAKIDxwYXJhPnZpZGVvIGZvcm1hdCBvZiBUViBhcyBkZWZpbmVkIGluIHNlY3Rpb24gPz8uPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorJnJldHVybi12YWx1ZS1kdmI7CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+CiA8cGFyYT5FSU5WQUw8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KQEAgLTE2MDEsNyArMTM0Myw3IEBACiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iVklERU9fU0VUX1NZU1RFTSIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5WSURFT19TRVRfU1lTVEVNPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xNjQ1LDE3ICsxMzg3LDkgQEAKIDxwYXJhPnZpZGVvIHN5c3RlbSBvZiBUViBvdXRwdXQuPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorJnJldHVybi12YWx1ZS1kdmI7CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+CiA8cGFyYT5FSU5WQUw8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KQEAgLTE2NjMsNyArMTM5Nyw3IEBACiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iVklERU9fU0VUX0hJR0hMSUdIVCIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5WSURFT19TRVRfSElHSExJR0hUPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xNzA1LDI1ICsxNDM5LDkgQEAKIDxwYXJhPlNQVSBIaWdobGlnaHQgaW5mb3JtYXRpb24gYWNjb3JkaW5nIHRvIHNlY3Rpb24gPz8uPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgotPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3IuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48cm93PjxlbnRyeQotIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVJTlZBTDwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+aW5wdXQgaXMgbm90IGEgdmFsaWQgaGlnaGxpZ2h0IHNldHRpbmcuPC9wYXJhPgotPC9lbnRyeT4KLSA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iVklERU9fU0VUX1NQVSIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5WSURFT19TRVRfU1BVPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xNzY2LDE3ICsxNDg0LDkgQEAKICB0byBzZWN0aW9uID8/LjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3I8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgogPHBhcmE+RUlOVkFMPC9wYXJhPgogPC9lbnRyeT48ZW50cnkKICBhbGlnbj0iY2hhciI+CkBAIC0xNzg1LDcgKzE0OTUsNyBAQAogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IlZJREVPX1NFVF9TUFVfUEFMRVRURSIKIHJvbGU9InN1YnNlY3Rpb24iPjx0aXRsZT5WSURFT19TRVRfU1BVX1BBTEVUVEU8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTE4MjcsMTcgKzE1MzcsOSBAQAogPHBhcmE+U1BVIHBhbGV0dGUgYWNjb3JkaW5nIHRvIHNlY3Rpb24gPz8uPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorJnJldHVybi12YWx1ZS1kdmI7CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+CiA8cGFyYT5FSU5WQUw8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KQEAgLTE4NDUsNyArMTU0Nyw3IEBACiA8L2VudHJ5PgogIDwvcm93PjwvdGJvZHk+PC90Z3JvdXA+PC9pbmZvcm1hbHRhYmxlPgogCi08L3NlY3Rpb24+PHNlY3Rpb24KKzwvc2VjdGlvbj48c2VjdGlvbiBpZD0iVklERU9fR0VUX05BVkkiCiByb2xlPSJzdWJzZWN0aW9uIj48dGl0bGU+VklERU9fR0VUX05BVkk8L3RpdGxlPgogPHBhcmE+REVTQ1JJUFRJT04KIDwvcGFyYT4KQEAgLTE4ODksMTcgKzE1OTEsOSBAQAogID8/LjwvcGFyYT4KIDwvZW50cnk+CiAgPC9yb3c+PC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+Ci08cGFyYT5FUlJPUlMKLTwvcGFyYT4KKyZyZXR1cm4tdmFsdWUtZHZiOwogPGluZm9ybWFsdGFibGU+PHRncm91cCBjb2xzPSIyIj48dGJvZHk+PHJvdz48ZW50cnkKICBhbGlnbj0iY2hhciI+Ci08cGFyYT5FQkFERjwvcGFyYT4KLTwvZW50cnk+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgotPHBhcmE+ZmQgaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlIGRlc2NyaXB0b3I8L3BhcmE+Ci08L2VudHJ5PgotIDwvcm93Pjxyb3c+PGVudHJ5Ci0gYWxpZ249ImNoYXIiPgogPHBhcmE+RUZBVUxUPC9wYXJhPgogPC9lbnRyeT48ZW50cnkKICBhbGlnbj0iY2hhciI+CkBAIC0xOTA3LDcgKzE2MDEsNyBAQAogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KIAotPC9zZWN0aW9uPjxzZWN0aW9uCis8L3NlY3Rpb24+PHNlY3Rpb24gaWQ9IlZJREVPX1NFVF9BVFRSSUJVVEVTIgogcm9sZT0ic3Vic2VjdGlvbiI+PHRpdGxlPlZJREVPX1NFVF9BVFRSSUJVVEVTPC90aXRsZT4KIDxwYXJhPkRFU0NSSVBUSU9OCiA8L3BhcmE+CkBAIC0xOTUxLDE3ICsxNjQ1LDkgQEAKIDxwYXJhPnZpZGVvIGF0dHJpYnV0ZXMgYWNjb3JkaW5nIHRvIHNlY3Rpb24gPz8uPC9wYXJhPgogPC9lbnRyeT4KICA8L3Jvdz48L3Rib2R5PjwvdGdyb3VwPjwvaW5mb3JtYWx0YWJsZT4KLTxwYXJhPkVSUk9SUwotPC9wYXJhPgorJnJldHVybi12YWx1ZS1kdmI7CiA8aW5mb3JtYWx0YWJsZT48dGdyb3VwIGNvbHM9IjIiPjx0Ym9keT48cm93PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KLTxwYXJhPkVCQURGPC9wYXJhPgotPC9lbnRyeT48ZW50cnkKLSBhbGlnbj0iY2hhciI+Ci08cGFyYT5mZCBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvcjwvcGFyYT4KLTwvZW50cnk+Ci0gPC9yb3c+PHJvdz48ZW50cnkKLSBhbGlnbj0iY2hhciI+CiA8cGFyYT5FSU5WQUw8L3BhcmE+CiA8L2VudHJ5PjxlbnRyeQogIGFsaWduPSJjaGFyIj4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmJzdGIucG5nLmI2NCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9kdmJzdGIucG5nLmI2NApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGI1MmZkCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2R2YnN0Yi5wbmcuYjY0CkBAIC0wLDAgKzEsMzk4IEBACitpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBek1BQUFHYUNBWUFBQUE3SngyNUFBQUFCbUpMUjBRQUFBQUFBQUQ1UTd0L0FBQUFDWEJJCitXWE1BQUEzWEFBQU5pUUZtRU91aUFBQWdBRWxFUVZSNDJ1emRkMVJVMThJMjhHZGdLRlpVQkUwc2FGQTBLb3FGRmtFaEtoYkFRbXhKCitiSWtOTkVwTUVVd3NNWmFySk1acnc0S3hSRXhRY3pVcWlsMGpSQkExR0FqR1FxTFlDNFRlbWRuZkg3NmNqM0hvZFlEbnR4YUxtVGxsCit6dXc1N1ptejl6NHlJWVFBa1laemNuSkNTa29LR2pac3lNSWdJaUlpcXVQUzA5UFJvRUVEeUJobXFDYVF5V1JvMDZZTjNudnZQUllHCitFUkVSVVIxMzdOZ3gvUG5ubjVDektLZ21NREF3d0twVnF4aG1pSWlJaUFqMjl2WjQvLzMzb2NXaUlDSWlJaUtpbW9oaGhvaUlpSWlJCitHR2FJaUlpSWlJZ1lab2lJaUlpSWlCaG1pSWlJaUlpSVlZYUlpSWlJaUloaGhvaUlpSWlJaUdHR2lJaUlpSWdZWm9pSWlJaUlpQmhtCitpSWlJaUlpSUdHYUlpSWlJaUlnWVpvaUlpSWlJaUdHR2lJaUlpSWlJWVlhSWlJaUlpSWhoaG9pSWlJaUlHR2FJaUlpSWlJZ1lab2lJCitpSWlJaUJobWlJaUlpSWlJWVlhSWlJaUlpSWhoaG9pSWlJaUlxRkxJV1FSRWxTTXNMQXkydHJabzFLZ1I1SEp1YWxUeEVoSVM4UDMzCiszK1BERHorc001KzViZHUyZVBEZ0FabzJiY29WZ0NwbG0zSjBkTVM1YytmcXpHZisrdXV2c1dUSkVtNVRWQ2xTVTFPUms1T0RCdzhlCitvSFhyMWd3elJEVkpibTR1QUdEUm9rVXdNREJnZ1ZDRm16bHpKckt5c3VyVVozNzI3QmtzTEN6ZzRlSEJGWUFxM0lJRkM1Q1FrRkNuCitQbk5HUmdZQVlOV3FWVndCcU1KRlJVVmg0OGFOVUNxVmxmWWVERE5FbFd6R2pCa01NMVFwTm03Y1dPYytjOHVXTFRGanhnek1tREdECitLd0JWdUx0Mzd5SWtKS1RPZlc1bloyZHVVMVNwWWFZeXNjME1FUkVSRVJIVlNBd3pSRVJFUkVURU1FTkVSRVJFUk1Rd1EwUkVSRVJFCit4REJEUkVSRVJFUU1NMFJFUkVSRVJBd3pSRVJFUkVSRURETkVSRVJFUk1Rd1EwUkVSRVJFeERCRFJFUkVSRVRFTUVORVJFUkVSTVF3CitRMFJFUkVSRURETkVSRVJFUkVRTU0wUkVSRVJFUkF3elJFUkVSRVRFTUVORVJFUkVSTVF3UTBSRVJFUkV4REJEUkVSRVJFUU1NMFJFCitSRVJFUkF3elJFUkVSRVJFRERORVJFUkVSRVFNTTBSRVJFUkV4REJEUkVSRVJFVEVNRU5FUkVSRVJNUXdRMFJFUkVSRURETkVSRVJFCitSRVFNTTBSRVJFUkVSQXd6UkVSRVJFVEVNRU5FUkVSRVJNUXdRMFJFUkVSRVZHbmtMQUtpbXVuQmd3ZElTa29xOC9TR2hvWjQ3YlhYCitXSkNWNk5telp3Z01ETVM1Yytld2QrOWVGZ2lWU1ZaV0ZrSkNRbkQxNmxVOGV2UUlDb1VDaG9hRzZOQ2hBMnhzYk5DeFkwZklaREk4CitlZklFcDA2ZHd1VEprMHM4NzZDZ0lKaVltS0JMbHk0c2FLcTJZNVd1cmk2YU5tMEtRME5EYUdueGQzWmltQ0dxRS83ODgwOEVCZ2JpCitwNTkrUWtKQ2dzb3dMUzB0eUdReTZibFNxWVFRUW1XY2p6LytHR3ZYcm1WQlZvS3RXN2RpKy9idHVIYnRHb1FRTURRMFpLRlFxZjM3Cis3Ny93OGZIQnRtM2JrSkNRZ0NaTm1zRFMwaExHeHNaNDhPQUJ0bS9mamlkUG5zRFUxQlIyZG5ZSUN3dER6NTQ5U3h4bWxFb2w1czZkCitDeHNiRyt6WnM0Y0ZUcFYyckRweDRnUU9IRGlBSjArZXFBelQwOU9EVXFsRVRrNE9BRUJmWHgvZHVuV0R2YjA5M056YzBMZHZYNVZqCitHVkZCR0grSmFxaWhRNGRpMDZaTk9IcjBxTXJybHk1ZGdrS2hRRzV1cnZTblZDcVJsWldGMjdkdlk4bVNKUUNBN094c0ZtSWxtVEZqCitCczZlUGN0ZnU2bk1UcDQ4aVRmZmZCT3JWNitHbnA0ZTl1elpnK2ZQbitQVXFWUHc5L2ZIa1NOSDhQRGhReHc5ZWhSQ0NPemV2UnUzCitidDFDV2xwYXFkNGpKaVlHKy9idHcrUEhqMW5vVkduSHFuWHIxdUhjdVhNcXIrL2Z2eDhaR1JuSXpzNUdTa29LSWlJaThNMDMzMEJICitSd2RyMTY2RnZiMDlldlhxaGRPblQ3TVFpV0dHcURhenNySlNlVjVZMVRGZFhWMTA3TmdSWDMzMUZTWlBuaXo5RWxiVG5EcDFTdU9YCitVU2FUb1hIanh1amV2VHRYVUNxMUgzLzhFY09HRGNQejU4L1J0V3RYUkVSRVlNS0VDZERSMFZFOWdHdHB3Y1hGQmRldVhZT05qUTBBCitJRDA5dmNUdnMySERCZ0JBVGs0T2ZIMTlXZkJVcVRwMTZnUzUvUDlYQ0RJM041ZXV1alJzMkJBV0ZoYjQ2S09QOE50dnYrSElrU05vCiszcnc1cmwrL0RpY25KM3o2NmFkUUtwVXNSR0tZSWFxTmRIUjBTbDNIZU55NGNUWHl5c3lCQXdkcTFFa1g2MzVUYVYyOWVoVlRwa3lCCitVcWxFdzRZTmNmVG9VYlJzMmJMSWFabzBhWUlqUjQ3QXlNaW94RmRtN3R5NWc2Q2dJR2hyYXdNQXRtelpnb3lNREg0QlZHbGtNaGwwCitkWFZMTko2cnF5dkN3c0xRcWxVckFNQjMzMzJIanovK21JVklERE5FdGZrZ1VScU9qbzVZdW5ScGpmcU1kKzdjd2ZUcDAvbGxVNjJsCitWQ294WThZTTZhcnAvUG56MGI1OSt4Sk5hMlJrQkM4dnJ4SmZtZkgxOVlXVmxSVW1USmdBQUlpUGoyY25GYVJSeHlwVFUxTWNPblJJCitDdHdiTm16QTRjT0hXWWpFTUVOVWwrWG01aUloSVFINit2b3dNVEVwY0p6OEhRVUlJZFE2RGlqb0JLeTBDcHBuVWZONTl1d1puSjJkCitTOVY3bXhDaVZNdFcybVdxaVBja3l1L0VpUk9JaUlnQUFHaHJhOFBkM2IxVTAwK2FOQWxaV1ZuRmpwZWFtb3FkTzNkaTl1elptRDE3Cit0dlQ2Zi8vNzMySzNkNktxWkdscGlSa3paa2pQdmJ5OGl0M0hsbVkvWE5oK3Y2anRvQ1RIUlUxUmxtTlNhYzhCR0dhSXFFcGR1WElGCitDeFlzVUhzOU1URVJmbjUrc0xhMnhyVnIxNUNTa29KSmt5WkJYMThmYmRxMFFXUmtwTXJPTFRBd0VNT0hENGVwcVNuYXQyK1B4bzBiCitvMy8vL3ZEejh5dTBMVTV1Ymk3T256OFBEdzhQbUp1YlMrODdkKzVjR0JvYVFpNlh3OExDUXEyeDUrWExsMkZyYTRzN2QrNEFBRUpECitRK0hpNGdJWEZ4Zk1uejlmWmR6czdHejQrdnJDMnRvYSt2cjYwTkhSUWRldVhlSGo0MVBnU1Y1WmwrbFZ4NDRkdzhDQkEvSGFhNitoCitRNGNPNk5tekp3NGNPRkJuMTdPZ29DQzFYb3VvZUQvKytLUDAyTmJXRmtaR1JxV2Ezc2pJQ0R0MzdpeDJQSDkvZjhqbGNvd2RPeGFXCitscGF3dHJZR0FFUkhSK1BzMmJQOElqUlFhR2dvb3FLaTZtVFluRE5uanZUNDFxMWJ1SFRwa3RvNHBkbjNDeUZ3N2RvMWVIdDdvMTI3Citka2hNVElRUUF2NysvckN3c0lCY0xrZlRwazN4OGNjZlM5V3hjM056c1huelp2VHUzUnU2dXJxb1g3OCszbjMzWGJXZVJQZnYzNC94Cis0OGRMeDZqRml4ZEx3NUtTa2pCMzdsd01IejVjR3A2L2hrUnNiQ3ptejU4dkRjdjcrK0tMTDVDYm00dkRodzlqN05peDB1dHo1ODdGCitzMmZQeWxVV1pUa0gwTlRVUnFUeERBd014TjY5ZTJ2VU1nY0hCd3NBSWpFeHNkTGZTMXRiV3dBUUFNVGR1M2NMSFcvaHdvVmk1c3laCiswdk1yVjY2SUVTTkdDRjFkWFduNjMzNzdUZlR2MzEvbzYrdExyeTFZc0VBSUlVUjZlcm9ZUFhxMDBOUFRFN3QzN3hZNU9UbENDQ0Z1CiszNzR0K3ZidEt3Q0lIajE2aU5qWVdKWDNQWFhxbEhCeWNwTG0xNkpGQ3hFZEhTMDZkdXdvSEIwZGhZdUxpNmhmdjc0QUlIUjBkTVFmCitmL3doVGZ2WFgzK0owNmRQQzJOall3RkEyTnJhaXRPblQ0dlRwMCtMOFBCd2FieW5UNStLUG4zNmlPblRwNHZJeUVqeDZORWpjZWpRCitJZEdpUlFzQlFQVHQyMWVrcGFWVnlETGxVU2dVWXZiczJVSXVsNHN0VzdhSTdPeHNJWVFRMGRIUndzTENRalJxMUVnQUVJYUdocFh5Cit2WnVibXd0ZlgxK05XL2Z6eXJSZHUzWmk1c3laSWlBZ1FEeDU4cVJDNXQyMmJWdU4vTXdWb1ZXclZsTFplWHA2VnNwN0tKVkswYlZyCitWK0hsNVNXOTV1L3ZMNzJ2czdOem5UN1dlSHQ3Q3pzN080MWJybW5UcGdrQXdzREFRSXdZTVVLc1g3OWVSRVpHQ3FWU1dTR2Z1YXErCis5d1lOR2tqcjJsOS8vVlhpNmRxM2J5OU50M2p4WXBWaHBkbjNYN3AwU1l3ZVBWckk1WEtWNVJnOGVMQ3dzcklTN3U3dTR1MjMzNWFHCitmZjc1NStMSmt5ZmlyYmZlRW82T2ptTFdyRmxpMUtoUlFrdExTd0FRcnE2dWFzdDY3OTQ5YWY2REJ3OVdHeDRkSFMwZHMxOHRkNlZTCitLWll0V3lhOWYrL2V2VldHcjF5NVV1anE2b3FBZ0lBQ3YvdlNIZ2RMZXc1UUZwR1JrUUtBMm5sQlJRZ01EQlFHQmdhQ1lZWVlabXBaCittRGw0OEtBSURRMlYvaTVkdWlUT25qMHJ2djc2YTZHcnE2c1NadExTMGtSMmRyWjBvQVFnbkp5Y3hLRkRoMFJxYXFxWU9IR2lhTktrCitpVGg5K3JSUUtwVmk3Tml4QWtDQko1TXBLU21pYytmT0FvRG8xS21UU0VsSlVSdG42TkNoQW9EUTE5Y1hscGFXSWlJaVFocjJ4eDkvCitTSjlqeXBRcGF0T2FtSmdJQUdMRWlCRnF3N0t6czBXZlBuM0VxRkdqMUhidysvZnZsejZidDdkM2hTN1Rva1dMQkFDeFpzMGF0V0dQCitIeitXRHR4MUxjdzBhOVpNS25NZEhSM3B3RjRSNGFhMmhwbms1R1NwekFwYnB5ckMyYk5uaFV3bVUvblJJek16VS9xeEFJQzRlZk1tCit3NHlHOGZEd2tFNmd0YlMwaEo2ZVhvV0ZtNW9RWmthT0hDbE5OM3IwNkhMdit4Y3NXQ0FOczdHeFVmbGhUS2xVU3UvWG9FRURZV2xwCitLUzVjdUtBeS9lclZxNlhwWTJKaTFKYlgxTlMwMERDVC8zaFdVTGtybFVveFpNZ1E2YnZPSzZmMDlIVFJzV05IOGQxMzN4VTR6N0tVCitSV25PQVJobWlCaG1xaXpNRlBlWFA4emsrZUdISDZUaFgzMzFWWUh2Y2V6WU1RRkFORzNhVkdSbFpSVTR6cEVqUjZUNWZQSEZGMnJECitQL3JvSTJuNHMyZlAxSWIzNjlkUENrT2xDVE5idDI0VkFNUzVjK2ZVaG1WbVprcS9NRFZ0MmxTNm1sVGVaYnB4NDRiUTF0WVdob2FHCitoWmJIOE9IRDYyU1lNVEl5S25UOUsyKzRxYTFoNXA5Ly9sRXBwNjFidDFiSys0d2FOYXJBWDVQemdqa0FNV3ZXTElZWkRRd3orYThtCis1UDhyYjdpcENXRm14b3daMG5TT2pvN2wzdmR2Mzc1ZG1sOVlXSmphdFB2MjdaT0diOXEwU1czNHpaczNwZUc3ZHUxU0c5NnBVNmNpCit3MHhlMkNtczNPL2Z2eTlkMlhkeWNoSktwVkpNbXpaTk9EZzRDSVZDVWVBMDVUa09sdVFjUUpQRGpKdzFVWWxxbDVzM2I2bzA3aGRDCitJQzB0RFpjdVhjS0hIMzVZNERUNTcxOHhaTWlRQXNmSjZ4TFp5c3FxME80MWh3MGJCbU5qWXp4Ly9oeGJ0MjdGMHFWTFZlNHJrTmNyCitEUUFZR3h1clRaL1hEV2Q4Zkh5cFByT2ZueDhBSUR3OEhOSFIwV3JEbXpWcmhzZVBIeU1oSVFFM2J0eFF1ZjlMV1pkcDNicDFVQ2dVCitHRGh3WUtIbDBhaFJJNjZRcjhqZnB1cmV2WHZZc1dNSHZ2LytlK1RtNXFKZHUzWVlQSGd3SEIwZDBiOS8vMks3Sks3TkZBcEZoYzh6CitOallXaHc4Znh2SGp4OVdHelp3NUV5dFhyb1JDb2NDdVhidXdmUGx5TkczYWxDdHNEWkIzVStTOGRobEhqeDdGaVJNbmtKV1ZCUU1ECitBemc0T0dEQWdBRndjSEJBdDI3ZFN0MzdwU2JJdjh6NWoxZGwzZmZuMys4M2FOQ2cwUDErM2p4ZTFhSkZDK254dzRjUEsvenp0bW5UCitCdDk4OHczYzNkMXg2dFFwVEpvMENZY1BIMFpVVkZTaFhmNlg1emhZa25NQVRjWXdRMVRMNk9ucFFWOWZYK1cxZXZYcVlmanc0Vml3CitZSUhVa0w0dytYZnkrUStXRnk1Y0FBQTBiOTY4eUduNzkrK1BBd2NPSUQ0K0h0SFIwZWpSbzBlSmx6MXZKeTFLMGNnMU9Ua1oxNjVkCitnN2EyZHFHTnpzZU1HYVAySHVWWkppR0UxRVZvNTg2ZHEvVWs1djc5KzdoMjdacEdyWU81dWJsbERqZmZmLzg5dG0vZkRvVkNJWVdiCiszcjE3dzlYVnRWYUhtMWVEUTF4Y1hJVy94NVl0Vy9ER0cyOWcwS0JCQlo2OHVibTU0Y0NCQTBoUFQ4ZjI3ZHZ4K2VlZjE4bDlhRnBhCittc1p0VXk5ZXZDaHp1RGx5NUFpQ2dvS1FuWjJOeG8wYnc5SFJFZjM2OVlPOXZUMzY5T2xUSTc2VGYvLzlWM3I4K3V1dlYvcSt2NkRqCitvTXJKYzc0ZjZTcnIva3pUcDAvSHZuMzdjUDc4ZWZqNysyUGp4bzJGOWtKYWtXVlIzR2RubUNHcVE0UUc5anJ6OXR0djQrN2R1NldlCitMajQrWHJvWlgzRW5xcDA2ZFpJZVAzejRzRlJocGl6dTNyMHJkVCs1WnMyYUt0a1J2M2p4QWsrZlBnVlF2VmRmc3JPenNXclZLcXhhCit0YXJXYkRmNTE2OTc5KzVoNjlhdFVraWZPblZxcFZ5eDBBUk5talNScm1vQ1FFeE1USVhPUHlNakEzNStmbEFvRkNxL3lMNjZuZWZaCitzR0VENXMyYnAzTFNWbGZjdUhHanhwemtsL1JZbE5jclYzSnlNZzRmUGl6OUdPUG82Q2lGQTAxMjY5WXQ2WEh2M3IycmJkOWZsYlMwCit0T0RuNXdkemMzTmtaR1RnMUtsVG1EVnJWb0ZYMW1wN1dURE1FRldERnk5ZVlQbnk1UnEzWEQxNzlzVEdqUnRMUFYzK0U4aThrL2pDCitHQm9hU28rcllvZWFGN0tFRUxoLy8zNkpiekpZSHZsL05jL016S3kyNzFOUFR3L2ZmdnR0b2RVSHE0dVptVm1acnl6bzZla2hLeXNMCitlbnA2c0xTMGhKT1RFL3IzN3c4Ykd4dm82dW9pTURDdzF1NDM3T3pzY1BEZ1FRQXZ1K0t0U0FFQkFVaE5UWVdQajArUnY4cXVXTEVDCitUNTgreFlNSEQzRG8wQ0dWWDNQcmlwNDlleFpZRmE4NmZmYlpaL2poaHg5S2RkVXpqNDZPRHBSS0paUktKVHAwNklDaFE0ZkN3Y0VCCitmZnYyaGJHeE1SWXNXSURFeEVTTlBwNUdSVVZKejExY1hLcHQzMS9WMHRMU3BPUHZrU05Ic0cvZlBvd2ZQMTRqam9NTU0wUzEyTGx6Cis1ekJnd0FCTW5UcTExbnltNXMyYlEwZEhCems1T1lpT2pvWVFvdEI2MS9sdjBQWEdHMjlVK3JMVnIxOWZlaHdTRWxJbE8zRTlQVDNwCis4ZDkvLzExdDM0dE1Ka1A5K3ZVMXJtMURhZXJrNit2ckl6TXpVeVc4T0RvNkZ0azJxN1lhTzNhc0ZHYnUzTG1EcUtnbzZmNUg1U0dFCit3SVlOR3pCbXpCak1uVHUzeUhIajQrUHgxVmRmQVhoNUU4MjZHR2J5N2pPaVNmTHZjNHFqcTZzTGhVSUJwVktKamgwN1lzaVFJWEJ3CitjSUM5dlgyUjFZUTExYzZkTzZXYURpNHVMbWpYcmwyMTdmdXJVbFpXRmlaTW1JQ2xTNWRpNDhhTmVQVG9FZWJNbVlNQkF3YW8zWU9xCit0cGRGY1hqVFRLSUtvbFFxc1h6NWNnd1lNQUFBTUh6NDhGcDFjTSs3c1Y1Y1hCeHUzTGhSNkxoNTlYVmJ0V3FGamgwN1Z2cXltWnFhCitTaWZQZm41K1JWYnZTMDFOeGN5Wk04djlucTFidDVZYVRGNjRjSUYzVFMrRnZQWmNlbnA2c0xPend4ZGZmSUhnNEdBa0p5Y2pPRGdZCitpeFl0Z3AyZFhaMExNZ0RnNXVhbWNoTHkzWGZmVmNoOEwxNjhpSWlJQ0V5ZlByM1ljV2ZPbkNtdDI1Y3VYVUo0ZURoWFdnMm5xNnNMCitiVzF0eUdReW1KbVp3ZDNkSFFjT0hNQ0xGeTl3NjlZdHJGdTNEcU5HamFxUlFlYng0OGRTTlZwZFhWMnNYcjI2V3ZmOUZhVWt4NHlGCitDeGVpY2VQR21EOS9Qalp2M2l3ZGZ6MDlQVFhpT01nd1ExVEx2SGp4QW9NR0RjS1NKVXNBdkx4amNVRTlvRlRXVGpILzFaREtPckgrCis0SU1QcE1jQkFRR0ZqcGQzOHVQdTdsN3FYbk9LV3ZhOGVlWFYvYzdUcUZFaktXZ0ZCd2RqejU0OUJVNmZtNXVMS1ZPbXdNbkpxZHpMCitwS2VuaC83OSt3TjRXVmM1S0Npb3lHbnJXdGpKcS9Md2FuaXh0N2RuZUNtQ2pvNE9ObTNhSkQzZnRXc1hUcDgrWGVMcEV4TVQ0ZXJxCitxblpYOE5XclY4UE16QXoyOXZiRnpxTmx5NVlZUFhxMDlIenQyclhjd1dzQXBWSXBWVGNxYVhqSlgrVzNKcDNFNTBsSVNNRElrU09SCitrSkFBQU5pMGFSTzZkT2xTWmZ2KzhzaXJZcDJlbmw1Z0dhU2twQlE1L2ErLy9vcU5HemZDejg4UFdscGFjSFYxeGJ2dnZnc0ErT21uCituM0QwNk5FcVBRNHl6QkRWY3VmUG4wZlhybDF4OGVKRktKVkthR2xwNGJQUFBxdXk5MDlQVDFjNVFKU2xaNVg4WWFpd090bVRKazJDCitwYVVsQUdEejVzMEYxckcrZmZzMmdvT0RZV1ptaG5uejVxa05MNjd4ZGw3UFZnVWQ4UEtxZmR5K2ZWc2FucDJkamNlUEg2djhValZ0CisyalNzWDc5ZTZzMEhlRmxseDhYRkJkbloyWEJ6YzZ1UVpjci8rVHc4UE5TNjUweE1URVJJU0FpQWw0MXVVMU5UNjh3MmtYY0Fmelc4CitYTHg0a2VHbEdFT0hEc1dhTld1azUyNXViaVZxSnhRYUdncExTMHYwNjlkUHBkdllLMWV1SUNnb0NHUEdqQ254and2dnZmZWU5UGpBCitnUVBWV3BXUy92OEpzQkNpeG9XWFYvZTErZHNZRmhac2hCQTRkZW9VK3ZUcGd5dFhya0JYVnhmYnRtM0R0R25UMU1ZdDY3NC8vekd2CitMTWZFNG41QXpMdkNldm55WmR5K2ZWdWxERmFzV0NIdEl3dTZEVUZ5Y2pJbVQ1Nk1CUXNXNE0wMzM1UmVYN2R1bmZRZHU3dTdxeDJECit5M01jTE1rNUFNTU1VUzJrVkNyeDlkZGZZK0RBZ1lpUGowZHViaTdrY2puR2p4K1B0bTNiVnRseW5EeDVVdVY1WVZjSmlwSy91K2JmCitmLys5d0hIa2Nqa09IVHFFVHAwNklUNCtIaE1tVEZENUJUNGhJUUVUSjA1RW16WnRFQmdZV0dEZi9mbFBpdko2YmNwL1FQanp6ejhCCit2T3hPTkRrNVdXVzRyYTJ0TkkvNTgrZmo0TUdEZU9lZGQvRHZ2LzlpM0xoeEdEZHVuQlErUEQwOTBieDVjL1RvMFFPbXBxWXdNek5ECitVbElTL1AzOTFVN295cnBNdzRZTmc0ZUhCd0RnL3YzNzZOV3JGMWFzV0lIQXdFQnMyN1lOam82T01EQXdrQTRPM2J0M3IzV1g5Z3R6Cis3ZG8xWkdWbE1ieVUwU2VmZklKOSsvYWhXYk5tU0UxTmhhdXJLOXpjM0hEeTVFbVZYM3BUVTFNUkZCU0VkOTU1Qnk0dUxsaTJiSmxLCitkOHFabVptWU5XdVd0UDJXVkY2YmhMeVRyM256NWhWNzhrZVZhOTY4ZVlpTGk2dFI0ZVZWNTgrZlYxbVA5dTNiaDVpWUdQejk5OS80CisvZmZmY2Zqd1lTeGF0QWc5ZXZUQTRNR0RjZS9lUGJpNXVlSDY5ZXVGVnBFczY3NC9mMitCQlFXSzJOaFk2WEZCMWFvZlBIZ2dQWDc4CisrTEhhOEx5YURObloyYkN6czRPWGx4ZTh2YjFoYm00T0lRUWNIQndBQUdGaFlYai8vZmR4N05neDZieGkyclJwVUNxVjhQTHlVcG1uCitrWkdSVlB2ajhlUEhtREpsaWtyd0tNOXhzQ1RuQUpxZTlvazBub0dCZ2RpN2Q2L0dMTStUSjArRWc0T0QyaDJaWlRLWmlJeU1GRUlJCitFUndjTEFDSXhNVEVTbGtHUHo4L01XalFvQUx2Q20xblp5YysvZlRUWXVkeDVzd1o0ZXJxS3JTMHRLUnA5ZlQweEtSSms4VDI3ZHNMCituQ1lwS1VuTW16ZFBOR3JVU0x6Kyt1dGl4b3daNHNNUFB4UW1KaWJDM2QxZHhNWEZxVTBUR2hvcXhvOGZyN0tNWGJwMEVWOSsrYVVRCitRb2lUSjA4S0p5Y25sZUU5ZS9ZVTI3WnRrK1lSR3hzcldyZHVMUTEvL2ZYWHhmbno1NlhoT1RrNVlzbVNKZEpkay9QK0RBd014TUtGCitDMFZHUmthRkw1TkNvUkRmZlBPTmFOcTBxY3A0SmlZbTR0eTVjK0w5OTk4WGhvYUd3c1BEUXdRSEJ4ZDY1K2F5TWpjM0Y3Nit2blZxCitYOUMyYmRzNjg1bmo0dUxFa2lWTFJOdTJiVlgyTVlhR2hxSlpzMllDZ0dqVHBvMVl0R2lSMm5hM2YvOSswYmx6WjJrNnVWd3VSbzBhCitKWTRmUDE3bysvMzExMTlpOHVUSm9sMjdkbXI3bE42OWU0dGZmdm1sMXBlNXQ3ZTNzTE96cTFQYmxMZTNkNkYzb3Erb1k1V1RrNVBRCisxZFZWVzYveS96VnUzRmgwNmRKRmpCMDdWbXphdEVrOGZQaXdSUE12emI3LzExOS9GYk5telJKNmVub3ErMnR2YjI4Ukd4c3Ivdjc3CitiekZ2M2p6UnZIbHphYml1cnE3dzhQQVFGeTVjRUJrWkdlTHp6ejhYN2R1M1Y5bTIzTjNkUldCZ29QUStTcVZTTEYyNlZPWDQzS3haCitNK240NGV6c0xOcTNieSs4dmIxRmFHaW95TTNORmNIQndlTHR0OThXQUlTUmtaSHc4ZkZSK1p6bnpwMFREZzRPS3AvUjF0WldaWnN1Cis3WEd3TE9jQXBSVVpHU2tBaU5qWTJBcGZ0d0lEQTRXQmdZR1FDYlpjcFJxZ1NaTW04UFgxVmFuK1VKMi9MbzBaTXdZcEtTa3E3VGZrCitjamtjSFIxeDZ0UXBBQzk3RkxHM3QwZGlZcUwwQzMxdGtwV1ZoVC8rK0FOeGNYRm8yclFwZXZUb29kS2pTbVZJUzB0RFdGaVkxUE5WCitRVDM4WkdSazRQcjE2MGhJU0lDUmtSRzZkKzllcXA2QXlsb1cxNjlmUjF4Y0hJeU5qZEd6WjAvSTVYTEV4TVRBeE1SRTVlN0tGYWw3Cis5Kzd3OFBDUXJoRFZCU1ltSnZEMjlxNVRuMWtJZ2R1M2IrUFBQLzlFWEZ3Y2xFb2xqSTJOMGJWclYzVHExS2xHM3RGZFV5MVlzQUFoCitJU0VJRGc2dVU1ODVLaXFxeG5kN1hoMzcvdUs4ZVBFQzE2OWZSNzE2OWRDblR4K3BEZUUvLy95RGR1M2FsZm9tempXeExLS2lvdEM5CitlM2ZFeHNaV2VLMlZZOGVPNGYzMzMyZlh6RVFscFZBb3NHelpNaXhidGt5NkhQenE4QysrK0tMT2xJZWVuaDZzckt5cTlEMGJOR2dnCis5UlpYbUhyMTZrbFYwcXF5TFBJYVgrYlhvVU1IYmpoVWJqS1pESjA2ZFZLNUlTMFJWZisrdnpoR1JrWVlOR2lRMnV1VmZkc0NUU3lMCit5c1F3UTFRQ1Q1OCt4Wmd4WXhBV0ZsWmczWEV0TFMxWVdGaEk5V0NKaUlpSXFQS3hBd0NpWXB3NWN3YmR1blZEZUhoNGtiMThMRnk0CitrSVZGUkVSRXhEQkRWUDBVQ2dVV0wxNE1KeWNuSkNRa3FOM2ZKSTlNSm9PSmlRbEdqQmpCUWlNaUlpS3FRcXhtUmxTQVI0OGVZZno0Cis4UWdMQzVQNjl5K010clkydnZqaWkwcHJ5RWRFUkVSRURETkVKWExxMUNrTUhqd1l1cnE2SmJwNWxJR0JBU1pObXNTQ0l5SWlJcXBpCisvQ21aS0I4aEJQYnYzdzhBaFZZcnkwOVhWeGRlWGw2OElTQVJFUkVSd3d4UjlaTEpaTmkrZlR2V3IxOFBMUzJ0WXF1TzZlam9ZTWFNCitHU3c0SWlJaUlvWVpJczB3Wjg0Y25EbHpCbzBhTlNyMGhvZTZ1cnI0NktPUGF1VU5NWW1JaUlnWVpvaHFNRWRIUjRTR2hrSmJXN3ZBCitPMndybFVwNGVucXlvSWlJaUlnWVpvZzB6NnBWcTlDc1dUTzR1TGhBVzF0YmVsMVhWeGVUSjAvR2E2Kzl4a0lpSWlJaVlwZ2gwaXpyCisxcTFEUUVBQS92ZS8vK0h3NGNOWXZudzV0TFMwSUpQSmtKMmREUzh2THhZU0VSRVJFY01Na1dhNWNPRUNQdnZzTS9qNitzTEd4Z1l5CittUXplM3Q0SURBeUVFQUkyTmpibzJMRWpDNHFJaUlpb0d2RStNMFN2dUgvL1BzYU9IWXRwMDZaaDZ0U3BLc09HRGgyS1c3ZHVJU3NyCitpd1ZGUkVSRXhEQkRwRG5TMDlQaDV1WUdNek16ckZ1M3JzQnh6TXpNV0ZCRVJFUkVERE5FbXNYRHd3TlBuejdGMWF0WGVTTk1JaUlpCitJb1lab3BvaHI4SC9yNy8raXBZdFc3SkFpSWlJaUJobWlEUmZYb1AvTFZ1MndNYkdoZ1ZDUkVSRVZBT3dOek9xODRwcThFOUVSRVJFCitERE5FR3Fra0RmNkppSWlJU0RPeG1oblZhV3p3VDBSRVJGUUx3c3ozMzMrUDc3Ly9IZzBhTkdDcFVJVlRLQlRJeWNuQi8vNzNQeGdiCitHMnZFTXJIQlB4RVJFVkV0Q1RNeE1URUlEUTJGbDVjWFM0VXFYRlJVRk02ZlA0L016RXlOV0I0MitDY2lJaUtxUldFR0FKeWRuYkZxCisxU3FXQ2xWS21EbCsvTGhHTEFzYi9CTVJFUkhWRHV3QWdPb1VOdmduSWlJaXFqM1lBUURWS1d6d1QwUkVSTVF3UTFUanNNRS9FUkVSCitFY01NVVkzREJ2OUVSRVJFdFEvYnpGQ3R4d2IvUkVSRVJBd3pSRFVPRy93VEVSRVIxVjZzWmthMUdodjhFeEVSRVRITUVOVTRiUEJQCitSRVJFeERCRFZPT3d3VDhSRVJGUjdjYzJNMVRyc01FL0VSRVJFY01NVVkzREJ2OUVSRVJFZFFlcm1WR3R3Z2IvUkVSRVJBd3pSRFdPCitwamI0WDcxNk5Rd01EUGdGVVlXTGlvcXFjNS81NGNPSFdMMTZOWktUazdrQ1VLWHNyODNOemV2YzV6NTI3QmhXcjE3TkZhQVl5Y25KCit1SC8vUHRxMWE0ZUdEUnV5UURUa09NVXdRN1dDSmpiNGI5aXdJVXhNVEhEaXhBbG9hYkZHSjFXOE5tM2F3TWpJcUU1OVprZEhSOXkvCitmeDhIRGh6Z0NrQVZybDI3ZHVqWnMyZWQrc3l0V3JWQ216WnR1RTI5UXFsVUlpMHRUZVV2SnljSE1wa00rdnI2Nk5LbEN3dXBCTEt6CitzMkZxYWxxcHRXVVlacWpHMDlRRy94WVdGcmgzN3g2L0lLSUtkT2JNR1JZQ1VRWDY2S09QOE5GSEg5WHBNbEFvRklpT2prWjRlRGd1CitYNzZNeTVjdjQ4YU5HeEJDb0hQbnpuQnljb0tWbFJWc2JHd1FGUldGaFFzWDR1clZxMXg1TkFUREROVm9iUEJQUkVSRXBmSG8wU01wCit0RnkrZkJuWHJoT0psVVFBQUNBQVNVUkJWRjFEYW1vcVdyWnNDV3RyYTR3ZlB4NDJOamJvMDZjUEdqZHVyREx0alJzM1dJQU1NMFFWCitodzMraVlpSXFEQ3BxYW00ZXZVcXdzUERFUllXaHZEd2NEeDY5QWoxNjlkSDc5NjlZV1ZsaGRtelo4UGEyaHB0MjdabGdUSE1FRlVkCitUVzN3VDBSRVJGV3Z1T3BpMXRiV1dMaHdJV3hzYk5DdFd6Zkk1VHdOWnBnaHFpYWEyT0NmaUlpSXFrNTVxb3NSd3d4UnRkSFVCdjlFCitSRVJVT1ZoZGpCaG1xRlpnZzM4aUlxTGFqZFhGaUdHR2FpMDIrQ2NpSXFwZFdGMk1HR2FvVGpoeDRnVDI3ZHZIQnY5RVJFUTFGS3VMCitFY01NMVVtNXVibjQ4Y2Nmc1hYclZqYjRKeUlpcWdGWVhZd1lab2p3c3NGL2VubzYzbjc3YlRiNEp5SWkwbENzTGtZTU0wU3Z5R3Z3CityNldsaFVtVEpyRkFpSWlJTkFDcml4SERERkVKZUhoNDRObXpaMmpRb0FFdlB4TVJFVlVEVmhjamhobWlNbGkzYmgwQ0FnTHc2NisvCitZc2lRSVN3UUlpS2lLbENTNm1MVzF0YXd0TFJrZFRGaW1DRXF5SVVMRi9EWlo1OWh5NVl0YlBCUFJFUlVTVmhkakJobWlDclkvZnYzCitNWGJzV0V5Yk5vME4vb21JaUNvSXE0c1J3MHdWQ0FvS2dvbUpDYnAwNmNKdnB3N0thL0J2Wm1hR2RldldzVUNJaUlqS2lOWEZpR0dtCitpaW1WU3N5ZE94YzJOamJZczJjUHY1MDZLSy9CLzVVclY2Q3JxOHNDSVNJaUtnRldGeU9HR1Exdzh1Ukp4TVRFSURZMkZxdFhyOGJyCityNy9PYjZnT3lkL2d2MlhMbGl3UUlpS2lBaWdVQ3R5NGNVUGxxZ3VyaXhIRGpBYllzR0VEQUNBbkp3ZSt2cjVZdm54NWxiNy9xVk9uCis0T1RreExXaUdyREJQeEVSVWNGWVhZeW9Cb1NaTzNmdUlDZ29DTnJhMmxBb0ZOaXlaUXUrL1BKTDFLdFhyMHJlLzhDQkE5aTdkeS9ECitURFZnZzM4aUlxS1hXRjJNcUlhR0dWOWZYMWhaV2VITk45L0U3dDI3RVI4Zmo3MTc5MkxhdEdsVkVxU21UNThPQndjSHJoRlZqQTMrCitpWWlvcm1KMU1jMzI5T2xUaElTRVlQVG8wVVdPRnhNVGczLysrWWMvaU5mbE1KT2Ftb3FkTzNkaS9mcjFVcGdCZ1AvKzk3K1lPblVxCitaREpaaWVjbGhGQWJYNmxVUWt0THE4RHhuejE3Qm1kblp5UWxKWlZxbVlVUUVFSVVPdC95TEZORlRmdnFmQUNVcWl5ckFodjhFeEZSCitYY0hxWWpYTHpaczNNVzdjT01URnhhRnAwNmFGanJkbnp4NGNQWHFVWWFhYWFHbkNRdmo3KzBNdWwyUHMyTEd3dExTRXRiVTFBQ0E2CitPaHBuejU0dGR2cmMzRnljUDM4ZUhoNGVNRGMzQndBa0ppWmk3dHk1TURRMGhGd3VoNFdGQlU2ZlBxMHkzZVhMbDJGcmE0czdkKzRBCitBRUpEUStIaTRnSVhGeGZNbno5ZjdYMnlzN1BoNitzTGEydHI2T3ZyUTBkSEIxMjdkb1dQancreXNySXFaSm5LTzIxK1Y2OWV4Y1NKCitFMkZ2YjQvQmd3ZWpiZHUyNk4yN04zYnMyQ0dGbStxVTErRC93SUVEYlBCUFJFUzFTbXBxS2k1Y3VBQWZIeCs0dWJtaGRldldhTjI2CitOU1pPbklqUTBGRDA2ZE1ITzNic1FHeHNMSjQ4ZVlKZmZ2a0ZYM3p4QlFZTUdNQWdveUZzYkd5Z3E2dUxrSkNRSXNlN2NPRUNIQjBkCitXV0RWUmZ3ZmIyOXY0ZXpzTEtxYVVxa1VYYnQyRlY1ZVh0SnIvdjcrQW9BQVVPd3luVHAxU2pnNU9Vbmp0MmpSUWtSSFI0dU9IVHNLCitSMGRINGVMaUl1clhyeThBQ0IwZEhmSEhIMzlJMC83MTExL2k5T25Ud3RqWVdBQVF0cmEyNHZUcDArTDA2ZE1pUER4YzVYMmVQbjBxCisrdlRwSTZaUG55NGlJeVBGbzBlUHhLRkRoMFNMRmkwRUFORzNiMStSbHBaVzdtVXF6N1Q1YmRxMFNjaGtNdUhwNlNrVUNvVVFRb2kwCit0RFJoWjJjbkFJZ1ZLMVpVNmZjY0dSa3BBSWpZMkZnaGhCRG56NThYY3JsY2JOKyt2VVRUR3hnWWlMMTc5d29pSWlKTms1dWJLeUlqCitJNFdmbjUrWU5tMmFNRGMzRjlyYTJrSkxTMHQwNmRKRmZQREJCMkx6NXMwaUlpSkM1T1Rrc01CcWtINzkrb2xQUHZsRWVyNTM3MTdSCit0bTFiNlhsNmVyclEwOU1UUjQ0Y1lXRlZzY0RBUUdGZ1lDQ3FQY3ljUFh0V3lHUXljZmZ1WGVtMXpNeE1LV0FBRURkdjNpeDJQa09ICitEaFVBaEw2K3ZyQzB0QlFSRVJIU3NELysrRU5vYTJzTEFHTEtsQ2xxMDVxWW1BZ0FZc1NJRVFYT096czdXL1RwMDBlTUdqVktLSlZLCitsV0g3OSsrWGx0UGIyN3ZDbHFrODB6NTQ4RUFhZnVyVUtaVmhBUUVCQW9CbzFLaVJ5TXJLcXBZd0V4c2JLNHlNaklTN3UzdUpwMmVZCitJU0lpVGZIdzRVUHh2Ly85VDh5ZlAxLzA3OTlmTkd6WVVBQVFMVnUyRkNOR2pCQXJWcXdRWjg2Y0VVbEpTU3lzR203eDRzV2laOCtlCitoWWFaOCtmUEMyMXRiWkdRa01EQ3FxWXdVKzNWekRadTNBZ1hGeGUwYTlkT2VrMVBUdzh6Wjg2VW5xOWZ2NzdZK1ppYW1nSUFNak16CitFUmdZQ0FzTEMybFk5KzdkMGJkdlg2a3FXV250M0xrVFY2OWV4Wnc1YzlUYW5Bd2ZQaHo2K3ZvQWdLMWJ0eUkzTjdkQ2xxazgwOTYrCitmUnNLaFFJQUVCY1hwekxNMk5nWUFKQ1Nrb0s3ZCs5VytmZWRrWkhCQnY5RVJNVHFZbFFqT0RvNjRvOC8va0JDUWtLQnc4K2ZQNC91CiszYnVqU1pNbUxLeHFVcTBkQU1UR3h1THc0Y000ZnZ5NDJyQ1pNMmRpNWNxVlVDZ1UyTFZyRjVZdlgxNWs0eXR0YlcyMUUvYjhXclZxCitCUUNJajQ4djlYTDYrZmtCQU1MRHd4RWRIYTAydkZtelpuajgrREVTRWhKdzQ4WU5kTy9ldmR6TFZKNXArL1hyaDA4Ly9SUlpXVmtZCitPWEtreXJEOFlheTBuUjVVaEMrLy9KSU4vb21JU0NPeGR6RjZsWTJORFhSMGRCQVNFZ0pYVjFlMTRXd3ZVOGZEekpZdFcvREdHMjlnCiswS0JCQlo2c3U3bTU0Y0NCQTBoUFQ4ZjI3ZHZ4K2VlZmwvbTk4bnIvRXFWcytKNmNuSXhyMTY1Qlcxc2JUNTQ4S1hDY01XUEdxTDFQCitaUzVUY2RQSzVYSjgrKzIzS3ErbHA2Y2pJQ0FBTzNic2tGNVRLcFZWL3AwZk9YSUVGeTllWklOL0lpS3FkdXhkaklxanI2OFBhMnRyCitYTGh3UVMzTVpHUms0UExseS9qc3M4OVlVSFV4ekdSa1pNRFB6dzhLaFVLNmt2R3EvRmNkTm16WWdIbno1bFg1cnlCMzc5NkZFQUpLCitwUkpyMXF4UnVXSlNFOXk3ZHcvcjE2L0hyVnUzTUhYcVZDeFpzcVJhdXc1Y3NXSUZiR3hzdU9VUkVWR1Y0czBvcWF3Y0hCeHc5T2hSCit0ZGN2WDc2TTNOeGMyTnZiczVEcVlwZ0pDQWhBYW1vcWZIeDhpcnlhc1dMRkNqeDkraFFQSGp6QW9VT0hWSzZDVklXMHREUUFMNitBCiszTDkvSCszYnQ2OFJYMnhhV2hvV0xGZ0FmMzkvK1ByNllzMmFOWkRKWkxodzRVSzFMdGZ0MjdkeC8vNTlIaWlJaUtqU3NMb1lWU1JICitSMGNzWDc0Y2lZbUpLcSt6dlV3ZERqTkNDR3pZc0FGanhvekIzTGx6aXh3M1BqNGVYMzMxRllDWE45R3M2akJUdjM1OTZYRklTRWlOCitDRE5KU1Vsd2RIUkVSRVFFZ29LQ01HVElFSTFadGw2OWVzSEV4QVNUSmsyQ241OGYyODBRRVZHNXNib1lWYWE4ZGpQQndjRXFyN085CitqR2FvbHQ3TUxsNjhpSWlJQ0V5ZlByM1ljV2ZPbkFrZEhSMEF3S1ZMbHhBZUhsNmx5MnBxYWlvMW12Zno4eXV5ZlV0cWFxcEtMMnpWCitaZVhLbFlpSWlJQ0ppWWxHQlJrQWNIWjJCZ0Q4OE1NUGVQUE5OM0hpeEFsdWhVUkVWR0xzWFl5cVd2NTJNM255MnNzNE9EaXdnT3BpCittRm05ZWpYTXpNeEtWTWV3WmN1V0dEMTZ0UFI4N2RxMVpYclBva0pJWGxqSnpzNVdHOWFvVVNOWVcxc0RBSUtEZzdGbno1NEM1NUdiCittNHNwVTZhVXFqMUtXUnIrbDJUYXZON2g5UFQwMUlibDVPUlUrMG9YRlJVRjRHVjdKR2RuWjR3Y09STC8vUE1QdDBZaUlsS2hVQ2dRCitGUldGN2R1M1kvcjA2VktWbmdFREJtRDM3dDFvMHFRSkZpNWNpSWlJQ0NRbEplSGl4WXY0OXR0dk1XYk1HRlpucGdybDRPQ0E4K2ZQCitTOC9Ed3NMWVhxYXVocGtyVjY0Z0tDZ0lZOGFNVWJ0blMySGVlKzg5NmZHQkF3Znc5OTkvRjdqREswcmVTWHhCSVNDdnkrZmJ0MjlMCit3N096cy9INDhXTUFnS2VucHpUdXRHblRzSDc5ZW1SbFpVbXYzYmx6Qnk0dUxzak96b2FibTF1RkxGTjVwczNycGV6T25UdjQ4ODgvCitwZGN6TXpPeGUvZHVsVjhWeWh1cXlxSmJ0Mjc0NUpOUFlHQmdBRjFkWGNURXhLQmJ0Mjc0NnF1dnBHVWlJaUxOZFAzNmRkeTVjNmRTCis1djNvMFNNY1BIZ1FYbDVlY0hCd1FKTW1UZEM5ZTNjc1dyUUlMMTY4d1BqeDQzSHk1RWtrSkNRZ09qb2FPM2JzZ0x1N095d3NMTmp1CitoU3BWM3YxbTB0UFRBYnlzWXRhalJ3KzJsNmxyWVNZek14T3paczBDZ0ZMdGRQTGZVRk9oVUdEZXZIbHEzUXJuRHpqUG56OVhHU2FFCitrRTdxazVLU2tKeWNyRExjMXRaV21zZjgrZk54OE9CQnZQUE9PL2ozMzM4QkFPUEdqY080Y2VPa0VPSHA2WW5telp1alI0OGVNRFUxCitoWm1aR1pLU2t1RHY3NjhTME1xelRPV1pOdS9xa0JBQ2d3WU53c0tGQ3pGNzltejA2TkVEWGJ0MmxjWmJ0V29WbGl4WmdoOSsrS0hLCitWN3dsUzVaQVgxOGZQWHIwd04yN2R6RnIxaXhzM3J3WlhicDB3YUZEaDdobEVoRnBtTjkvL3gwalI0NUVyMTY5RUJBUVVPNzVzYm9ZCisxU1I1N1dadTNyd3BoUmxXTWRNUTR2OTRlM3NMWjJkblVWbjI3OTh2T25mdUxBQUlBRUl1bDR0Um8wYUo0OGVQRnpyTlgzLzlKU1pQCituaXphdFdzblRaZjMxN3QzYi9ITEw3K0kwTkJRTVg3OGVKVmhYYnAwRVY5KythVVFRb2lUSjA4S0p5Y25sZUU5ZS9ZVTI3WnRrOTRuCitOalpXdEc3ZFdocisrdXV2aS9Qbno2c3NTMDVPamxpeVpJbG8xS2lSeXJ3TURBekV3b1VMUlVaR2hqUnVlWmFwSWo1UFVsS1NjSEJ3CitVQm5IMmRsWnhNVEVDSVZDSWN6TnphWFhSNDBhSmRMVDAwVmxpNHlNRkFCRWJHeXM5TnF1WGJ1RXZyNittRHg1c3FoZnY3NDRkT2lRCittRHQzcnBETDVXTElrQ0hpMXExYjByZ0dCZ1ppNzk2OWdvaUlxdGFWSzFlRXE2dXJrTWxrd3NuSlNZU0VoSlI2SHJtNXVTSXlNbEw0CisrZm1KYWRPbUNYTnpjNkd0clMyMHRMUkVseTVkeEFjZmZDQTJiOTRzSWlJaVJFNU9EZ3VkTkZLL2Z2M0VzR0hEUkpzMmJZU2VucDQ0CitjdVFJQzZVYUJRWUdDZ01EQXlFVC8xZkhhTUdDQllpS2lrSmdZR0NkREhWcGFXa0lDd3VEbnA0ZUxDMHRDMnh2QXJ5c21uWDkrblVrCitKQ1RBeU1nSTNidDNMM1RjYWc2cGlJeU14Sk1uVC9EbW0yL0N4TVJFR3BhU2tvTFEwRkEwYjk0Y1BYdjJMSEYxdi9LSWlvcEM5KzdkCitFUnNiSzlWakZrTEEzdDRlVFpvMFFZY09IZURuNTRmRGh3K2pSWXNXbURObkRrSkRRL0hKSjUvZ3l5Ky9ST3ZXcmVIcjY2dFM1WkNJCitpQ3BQZUhnNHZ2NzZheHc3ZGd4RGhnekI0c1dMcFpvTXhTbXVkekVyS3l2MkxrWTF6cElsUytEdjc0L1UxRlRFeDhjakxpNk8xY3lxCiswYkZqeC9EKysrK0RGVXovVDRNR0RUQmd3SUJpeDZ0WHIxNkpkK2JWU1NhVG9VZVBIdWpSbzRmYXNFYU5HbFhyalRQekwrUEdqUnZSCitwMDhmL1BMTEx3Q0FFU05HNFBEaHd6aC8vandDQWdMdzZhZWZ3dC9mWHlNNkxpQWlxZ3ZDd3NMdzlkZGZJeWdvQ01PR0RVTllXSmpVCitFVTVCZUROS3Fpdnk3amZUb0VFRHRwZlJJQXd6Vkswc0xDd3dZOFlNekpzM0Q1R1JrU3FCNXQxMzM0V3JxeXUrL3ZwcmZQUE5OMWkrCitmTGxhdXg4aUlxb1l2LzMyRzc3KyttdWNQbjBhenM3T0NBOFBoNldscGNvNHZCa2wxV1hXMXRhUXkrVklTVWxoZXhtR0dhTC9iOW15CitaZmo1NTUveDdiZmZTbDF2NXdXYWdRTUh3c2ZIQjF1MmJJRmNMb2VGaFFYbXpKbUR4WXNYOHhjUklxSUtFQndjaktWTGwrTGN1WE53CitkWFhGbFN0WDBMdDNid0JGVnhlenNyTGl6U2lwVHFsWHJ4N016YzF4N2RvMWhobUdHYUwvejlEUUVDdFhyb1NucHljbVQ1NWNZS0RSCiswdEtDdDdjMzlQWDFNVy9lUEFRRUJHRDkrdlVxOXlBaUlxS1MrL1hYWDdGMDZWSmN1SEFCSTBlT1JFaElDTEt6czNIMjdGbXNXTEdDCisxY1dJQ3RDOGVYTUE0UDFsR0dhSVZIMzQ0WWZZdW5VclB2MzBVeHc0Y0VBdDBPUnhjM1BEMEtGRHNYTGxTclh1dVltSXFIam56NS9ICiswcVZMRVJ3Y2pGNjllbUhVcUZHNGMrY08rdlhyeCtwaVJNWHc5dmJHaXhjdldEdUVZWVpJbFphV0ZqWnMySUMrZmZ2aTFLbFRjSEp5CitVZ2swK1h0Y3ExZXZIcFl0VzhaQ0l5SXFoYjE3OTJMQ2hBa0FBRzF0YlNpVlNzVEd4c0xJeUFnalI0N0UyclZyV1YyTXFCalcxdFlZCitQSGd3QzRKaGhraWRqWTBOUHZ6d1EzaDZlaUl5TWhJNk9qcFNvRm0vZnIxMG85Q2E0czgvLzhURWlSUFJyRmt6YUdscDhRdW1DdmY4CisrWE1zWDc0Y3JxNnVkZVl6di9QT08zajQ4Q0ZQdUVzaE9Ua1pNVEV4MG8yZ2daY04rUUhneFlzWENBb0tRbEJRRUpZdFd3YVpUQ1pkCitoY243cjZPam8vSmNMcGRESnBOQlcxc2JMVnEwZ0tHaFlhMHBxMy8vL1JkdnZmVVdObXpZVUdmV2orKy8veDdyMTYrSHNiRXhONVlTCit5c3JLd3FCQmcxZ1FKWkNkblkzMDlIUWNPM2FzMHRZeGhoblNLQ3RYcm9TWm1SbldyVnVIeno3N0RES1pER3ZYcnNXV0xWdXdaczBhCit2UDMyMnhnNGNHQ04rQ3lKaVltNGZ2MDYzTjNkWVdCZ3dDK1hLdHpxMWF2eDhPSERPdldaRHg0OGlNYU5HOFBEdzRNclFDazRPanBLCitJU1luSjBmNnIxUXFrWjJkcmZaZkNJR3NyQ3pwZjk0SkhBQmtabVpLLzl1M2I0K09IVHZXcW0wcU96dTdUcTBiTVRFeGlJeU1oSmVYCitGemNVcW5CUlVWRzRlUEdpdE45Z21LRmF6OGpJQ0V1WExzV1hYMzZKZDk5OUY2MWF0WUpNSm9PK3ZqNXNiVzFWT2dXb0tWYXRXc1V3CitRNVhpK1BIamRlNHp0MjNiRnQ3ZTNnd3pWQ2xrTWhsQ1FrTHEzT2QyZG5iR3FsV3J1QUpRcFlTWnlqNVdzZTRMYVp6WnMyZWpRNGNPCittRDkvdnNyckV5Wk13UFRwMHpGaXhBaWNPWE9HQlVWRVJFUlV4ekhNa01iUjF0YkcrdlhyRVJBUWdPRGdZT24xdkNwbkREUkVSRVJFCitCTENhR1drb2UzdDd6Snc1RTgrZVBWTjVQUy9RQUtpUlZjNklpSWlJaUdHRzZnQmZYOThDWDJlZ0lTSWlJaUtHR2FxeEdHaUlpSWlJCitpR0dHR0dpSWlJaUlpR0dHaUlHR2lJaUlpQmhtaUJob2lJaUlpSWhoaGhob2lJaUlpSWhoaG9pQmhvaUlpSWdZWm9nWWFJaUlpSWlJCitZWWFJZ1lhSWlJaUlZWWFJZ1lhSWlJaUlHR2FJR0dpSWlJaUlpR0dHaUlHR2lJaUlpQmhtaUlHR2lJaUlpQmhtaUJob2lJaUlpSWhoCitob2lCaG9pSWlJZ1lab2dZYUlpSWlJZ1lab2dZYUlpSWlJaUlZWWFJZ1lhSWlJaUlHR2FJR0dpSWlJaUlHR2FJR0dpSWlJaUlpR0dHCitpSUdHaUlpSWlCaG1pQmhvaUlpSWlJaGhob2lCaG9pSWlJaGhob2lCaG9pSWlJaXFOY3hjdUhBQlo4NmNZYWxRaFl1S2ltS2dJU0lpCitJcUxLQ3pOcGFXa1lOR2dRUzRYcVBBWWFJaUlpb2hvVVp2N3puLy9nUC8vNUQwdUVpSUdHaUlpSXFHYUZHU0ppb0NtTUVBTGg0ZUU0CitjZUlFbmoxN0JtTmpZMWhhV3VMdHQ5OUd2WHIxa0ppWWlKOS8vaG5UcGsyVHBubnc0QUdTa3BMSy9KNkdob1o0N2JYWGloMHZLeXNMCitJU0VodUhyMUtoNDllZ1NGUWdGRFEwTjA2TkFCTmpZMjZOaXhJMlF5R1o0OGVZSlRwMDVoOHVUSlhMR3BXZ1VGQmNIRXhBUmR1blRSCittR1Y2OXV3WkFnTURjZTdjT2V6ZHUxZGwyTDE3OStEaDRRRURBd05zM2JvVkJnWUcvQktweXRiTEZ5OWVGRHE4YWRPbWFOV3FWWUhICityT2pvNkFLbmFkKytQUm8wYUZCaDYzWlIydzR4ekJBeDBHaUFGeTllWU5La1NUaHg0Z1NhTjI4T1cxdGIzTDkvSDc2K3Zzakt5b0tMCitpd3NlUG53SXVWeXVFbWIrL1BOUEJBWUc0cWVmZmtKQ1FvTEtQTFcwdENDVHlhVG5TcVVTUWdpVmNUNysrR09wM0F2eTc3Ly93c2ZICitCOXUyYlVOQ1FnS2FOR2tDUzB0TEdCc2I0OEdEQjlpK2ZUdWVQSGtDVTFOVDJOblpJU3dzREQxNzltU1lvV3FsVkNveGQrNWMyTmpZCitZTStlUGRXK1BGdTNic1gyN2R0eDdkbzFDQ0ZnYUdpb05zNmFOV3R3NHNRSkFJQ3RyUzA4UFQzNVJWS1YrT2VmZitEbjU0ZGR1M2FwCitIQ002ZGVxRThlUEhvMSsvZm9XR21hQ2dJUHoyMjI4NGZQZ3dBTURBd0FDelpzM0NSeDk5SklXWjhxemJKZGwycUlvSW9ockF3TUJBCis3TjI3dDFxWFFhbFVDazlQVDFHL2ZuMXgrdlRwWXNjUERnNFdBRVJpWW1LTkxmZU1qQXhoWVdFaEFJakpreWVMakl3TWFWaDJkcmJZCit2SG16cUZldm5nQWdPbmZ1WE9BOFFrSkNCQURwTHlRa3BNRHhzckt5eE8zYnQ4V1NKVXNFQURGcjFxeENsK3ZFaVJQQzJOaFlBQkF0CitXN1lVZS9ic0VkbloyU3JqS0JRS2NmVG9VZkhHRzI5STcrM3E2bHFydGd0emMzUGg2K3RicC9ZRmJkdTJyZEdmK2ZqeDR3S0EwTkhSCitFWThlUGFyMjVWRXFsU0lwS1VsMDdkcFZBQkNHaG9acTQyemJ0azBBRURLWlRKdzllN1pXcjEvZTN0N0N6czZ1VG0xVDN0N2V3dG5aCitXYU9YMGNmSFIrVTQ4dE5QUDVWNDJpNWR1Z2dBNHNTSkV4VzZicGRrMnlFaElpTWpCUUFSR3h0YjRmTU9EQXdVQmdZR1FvdHhqcWgwCitWMmltVDUrT0VTTkcxSW1lLzdadDI0YnIxNitqU1pNbTJMeDVNL1QxOWFWaE9qbzZjSGQzeDVreloxQ3ZYajA4ZXZTb3dIbFlXVm1wCitQQy9vVnpRQTBOWFZSY2VPSGZIVlYxOWg4dVRKeU1uSktYQzhIMy84RWNPR0RjUHo1OC9SdFd0WFJFUkVZTUtFQ2REUjBWRzcrdVBpCis0b0pyMTY3QnhzWUdBSkNlbnM0Vm1hclZoZzBiQUFBNU9Ubnc5ZlhWaVAxYTQ4YU4wYjE3OTBMSG1UNTlPaTVmdm95b3FDaTgvZmJiCisvQktweXMyYk53OXZ2dm1tOUR3a0pLU2tQOWdqTGk0T2RuWjJHRHg0Y0lXdTJ5WFpkcWhxTU13UU1kQVU2c2lSSXdBQVUxTlQxS3RYCityOEJ4M25yckxYenp6VGRJU1VsQlNrcUsybkFkSFIxb2FaVnVWek51M0Roa1oyZXJ2WDcxNmxWTW1USUZTcVVTRFJzMnhOR2pSOUd5CitaY3NpNTlXa1NSTWNPWElFUmtaR1NFdEw0MHBNMWViT25Uc0lDZ3FDdHJZMkFHRExsaTNJeU1qUWpKT0JZclpSS3lzcmRPM2FsVjhpCitWUXU1WEk3Rml4ZEx6LzM5L1V1MFB3OFBEOGZ6NTgveDBVY2ZWZHE2WGRyakd6SE1FREhRVktISGp4OUxKMkZGWGRXWVBuMDZXclJvCitJWTFmVUptVmhxT2pJNVl1WGFyeW1sS3B4SXdaTTZRck52UG56MGY3OXUxTE5EOGpJeU40ZVhueHlneFZLMTlmWDFoWldXSENoQWtBCitnUGo0ZURZWUppcWgwYU5IdzhURUJBQ1FsSlNFSFR0MkZEdk45OTkvaitiTm0yUGt5SkVzUUlZWklxcUxnYVpKa3lZQWdPVGtaQ3hZCitzS0RROFhSMWRURnAwaVQ4KysrLzVYN1BGeTllUUY5Zlh6cG81VGx4NGdRaUlpSUFBTnJhMm5CM2R5L1ZmQ2RObW9Tc3JDeXV2RlF0CitVbE5Uc1hQblRzeWVQUnV6WjgrV1h2L3ZmLytyMXZsRlZSQkNRS2xVbG1tNmtpckwvSWtLSTVmTDhmSEhIMHZQMTY1ZEM0VkNVZWo0CitLU2twK1BISEh6RjU4bVRvNmVsVjJMcGQxbTJuUE5OeVcyS1lJV0tnS2FQOE45RmR2MzQ5UHY3NDR3S3Jmd0dBajQ4UGJHMXR5L1YrCitTcVd5MEo3aWZ2enhSK214cmEwdGpJeU1TalZ2SXlNajdOeTVreXN1VlF0L2YzL0k1WEtNSFRzV2xwYVdzTGEyQmdCRVIwZmo3Tm16CitSVTY3Zi85K2pCOC9IaTR1TG5CeGNWR3BicE9VbElTNWMrZGkrUERoMHZCWHIycm1kK3pZTVF3Y09CQ3Z2ZllhT25Ub2dKNDllK0xBCitnUU5Gdm45S1NncCsrT0VIREI0OEdPdldyU3Z5UkMwd01CRERodytIcWFrcDJyZHZqOGFORzZOLy8vN3c4L01ydEIwY1VVbE5uVHBWCis2ajc1N3QyN1VrOWxoUjB6MHRMU01IMzY5SEt2MjJYZGRnQWdPenNidnI2K3NMYTJocjYrUG5SMGROQzFhMWY0K1BnVStnTWJ0NlhTCitwMFFpOW1aV0NiMmMxWWJlek9MaTRzUnJyNzJtMG91TWhZV0ZDQThQTDlWOHRMVzFwZW52M3IxYjZIZ2hJU0hDeE1Ta3dHR3RXcldTCis1dUhwNmNtTmdyMloxUmhLcFZKMDdkcFZlSGw1U2EvNSsvdEw2M05KZXBLNmQrK2VrTXZsQW9BWVBIaXcydkRvNkdocE95dG9mZ3FGCitRc3llUFZ2STVYS3haY3NXcWZlLzZPaG9ZV0ZoSVJvMWFxVFdJMU4wZExRWU8zYXMwTmZYbDViMW0yKytLWEQ1MHRQVHhlalJvNFdlCitucDdZdlh1M3lNbkpFVUlJY2Z2MmJkRzNiMThCUVBUbzBhTlNlalJpYjJhMXZ6ZXovRDcvL0hOcGZlemJ0MitoMjF6UG5qMUZ2Mzc5CitDaHhlbW5XN0xOdE9ucWRQbjRvK2ZmcUk2ZE9uaThqSVNQSG8wU054Nk5BaDBhSkZDMm41MDlMU2F1VzJWSlc5bVRITUVNTk1KUVdhCisyaEJtaEJEaTk5OS9GODJiTjFjSk5BREV4SWtUeGNPSEQwc2RaZzRlUENoQ1EwTlYvbjc5OVZleFpjc1cwYTVkdXdMRFRISnlzc3A3CityMW16aGhzRncweU5jZmJzV1NHVHlWU0NmR1ptcHRTOU9BQng4K2JOWXVkamFtcGFhSmdSUWdnVEU1TkN3OHlpUllzSzNYWWVQMzRzCitHalJvb0haQ2xwcWFLakl6TThYdTNidUxQT0ZUS3BWaTdOaXhBa0NCMzAxS1Nvcm8zTG16QUNBNmRlb2tVbEpTR0dZWVpzcnN3WU1ICitVckFISU1MQ3d0VEd1WExsaWdBZy9QMzlDNXhIU2RmdHNtNDdRcnk4ZlVHZlBuM0VxRkdqaEZLcFZCbTJmLzkrNlgyOXZiMXI1YlpVCitsV0dHMWN5SVdPV3NTRDE3OXNTMWE5ZlV1cTNjczJjUE9uZnVqRzNidHBXcUhyMmJteHRzYlcxVi92cjM3dzkzZDNmY3UzZXZ3R25pCis0dUpVbmpkczJKQXJIZFVZR3pkdWhJdUxDOXExYXllOXBxZW5oNWt6WjZwVTR5eU9YQzR2MC9DLy92b0xLMWV1aEtHaFlZRzlPcjMyCisybXNZTUdDQTJ1c05HalNBbnA0ZTdPM3RpM3pmb0tBZzdOKy9IMDJiTnNYVXFWUFZoamRzMkJBK1BqNEFnRnUzYnVFLy8va1BWd29xCitzOWF0VzJQY3VISFM4KysrKzA1dG5LMWJ0NkpwMDZaNDU1MTNDcHhIU2RmdHNtNDdBTEJ6NTA1Y3ZYb1ZjK2JNVWVzRVovanc0ZEt0CitEclp1M1lyYzNGeHVTK1hBTUVOVVNZSG02dFdydGVhenRXM2JGbWZPbk1HK2Zmdnd4aHR2U0srbnBxWmk1c3laUmQ0WDVsVTNiOTVFCitSa2FHOUplZW5vNmtwQ1JjdlhvVmZmdjJMZEU4aW1yMFNhUkpZbU5qY2Zqd1laVkcvM2xtenB3cGRkTzhhOWN1SkNRa1ZNb3lyRnUzCitEZ3FGQWdNSERvU3VybTZCNHpScTFLalE2Vis5aDlPcjh1NlhZMlZsVmVqOGh3MGJCbU5qWTdXVE42S3krT1NUVDZUSFAvLzhNMkpqCitZNlhueWNuSitPbW5uekJ4NGtTVmU2T1ZaZDB1ejdiajUrY0g0R1gzMEJzM2JsVDU4L1B6UTdObXpRQUFDUWtKdUhIakJyY2xoaGtpCit6UXMwUmZYK1ZWTS8yOWl4WTNIanhnMHNYYnBVNVZmZ1BYdjJZUExreVNXNlFxT25wd2Q5ZlgzcHIxNjllbWpjdURGNjkrNk56WnMzCitGemhOMDZaTlZaNi9lcVdHU0ZOdDJiSUZiN3p4aGtwbkdubGF0V29GTnpjM0FDOXY2THA5Ky9ZS2YzOGhoTlJJdW5QbnpoVStmNlZTCitpUXNYTGdBQW1qZHZYdWg0MnRyYTZOKy9QNENYWFZKSFIwZHo1YUF5NjlXckZ4d2NIS1IxTVArVnpaSTAvSy9zYlNjNU9SblhybDJECit0clkybmp4NWdwaVlHTFcvTVdQR3dOUFRFNTZlbnREUzB1SzJWQTV5YmhKRWxSTm9IajkrWEtLZVRtb2FQVDA5TEY2OEdFT0dETUdJCitFU1B3OU9sVEFNQlBQLzJFVWFOR1ljeVlNV1dlZDdkdTNkQ3FWU3UxMTVzMGFRSmpZMk04Zi80Y0FCQVRFOE1WalRSZVJrWUcvUHo4CitvRkFvQ3IxTGVIeDh2UFI0dzRZTm1EZHZYckhWeVVyanhZc1gwalphMU5XWHNvcVBqNWR1WGxqY0w4U2RPbldTSGo5OCtCQTlldlRnCitTa0psOXVtbm4wb24vMzUrZmxpeVpBa2FOV3FFclZ1M3d0YldGdDI2ZGF1MmJlZnUzYnRTTjh4cjFxeVJyc0FXOTM3Y2xoaG1pRFFxCiswTXlaTTZkR2g1blUxRlEwYU5DZzBCdGVXbGxaSVRnNEdMYTJ0dEtWRWw5ZjMzS0ZHWmxNaHQ5Kys2M0FZWFoyZGpoNDhDQUFJRFEwCitsQ3NaREU5UUp3QUFHQWRKUkVGVWFieUFnQUNrcHFiQ3g4ZW55THVFcjFpeEFrK2ZQc1dEQnc5dzZOQ2hjbTFEcjhwL0ZUTXpNN1BDCitQMlArS3A5NUozNkZNVFEwbEI2WDVPU09xQ2pEaGcxRHAwNmRjT3ZXTGFTa3BHRDc5dTJ3dDdmSDlldlhLNlFiL3ZKc08zbWhSQWlCCisrL2Z2bCtnR3o5eVdHR2FJTkRMUTFHVHU3dTZZTldzVzNucnJyVUxINmRDaEEzeDhmUERoaHg4Q0FQNzQ0NDhLWFlhSER4L0N5TWdJCitlbnA2R0R0MnJCUm03dHk1ZzZpb0tKaWJtM05GSTQwa2hNQ0dEUnN3WnN3WXpKMDd0OGh4NCtQajhkVlhYd0Y0ZVJQTmlnd3orVzhXCisrUGZmZjFmNDUyemV2RGwwZEhTUWs1T0Q2T2hvQ0NFSzNmZmx2L0ZmL3JaM1JHV2hwYVdGVHo3NVJPcElZOTI2ZFlpTWpFVGp4bzByCitaQnNxejdaVHYzNTk2WEZJU0VpSndneTNwWEtzQzl3Y2lLaXdvTEo4K2ZKaXg4dC9vOHlTM0dXNXBKS1NrbUJwYVNsZGJuZHpjMU01CitJQlRVZ3cyUnByaDQ4U0lpSWlKS1ZHOS81c3laVWtQa1M1Y3VJVHc4dk13QjZsV3RXN2VXNW4zaHdvVlM5VHhZRW5LNVhMb0JhRnhjCituTlNRdVNCUG5qd0I4TEt0VU1lT0hibVNVTGxObkRoUmFsOXkvLzU5N042OUd4TW1URUNEQmczS1BlL3liRHVtcHFaU0VQSHo4eXR5CisycnlPZExndE1jd1FVU1dFbWFDZ29DTHZzQXk4YkJlUXg4Ykdwc1FuV2NWWnRHZ1JPbmZ1TEIyVWRIUjBzR25USm1uNHJsMjdjUHIwCis2UkxQTHpFeEVhNnVybmoyN0JtL1hLcDBxMWV2aHBtWldiRmR2d0pBeTVZdE1YcjBhT241MnJWckN4d3ZyenBKZW5wNmdkdFlTa3FLCisydXQ2ZW5wU1krRzdkKzhpS0Npb3lHMjBvRzIxdU8zM2d3OCtrQjRIQkFRVU9sNWVTSE4zZDYveFY2NUpNOVNyVncrelpzMVNlYTAwCitEZitMV3JmTHMrMDBhdFJJQ2liQndjSFlzMmRQZ2RQbTV1Wml5cFFwY0hKeTRyYkVNRU5FbFJGbThuYXVSZjFDbEw5ZFVQN3VNdk5rCitabWFxWEJJdjdzUW9yM3JPaGcwYjFIcUFHanAwS05hc1dTTTlkM056UTJCZ1lMR2ZKVFEwRkphV2x1alhyeDlhdEdqQkw1Y3ExWlVyCitWeEFVRklReFk4YVUrRVRqdmZmZVU5bW1DcXJXa25kbDh2TGx5N2g5KzdiMHVrS2h3SW9WSzZTUWs3OVRBUUNZTjIrZTlOakR3d01QCitIejVVQy9vaElTRUFYdmJDbEpxYXFqSThmN2ZyQlRWTW5qUnBFaXd0TFFFQW16ZHZSbUppb3RvNHQyL2ZSbkJ3TU16TXpGU1doNmk4CitaczJhSmRVSzZOT25EeXdzTEVvOGJYSHJkbm0ySFU5UFQrbnh0R25Uc0g3OWVtUmxaVW12M2JsekJ5NHVMc2pPenBaNk5lUzJ4REJECitSSlVRWmhJU0VtQm5aNGVmZnZwSnBZR2lVcW5FamgwN3BCdDRMVisrdk1CZm9WOE5HenQyN0VCWVdCaGlZbUp3Nzk0OTNMMTdGemR2Ciszc1RGaXhleGFkTW0yTnZiUzIwTUJnNGNxRGEvVHo3NUJQdjI3VU96WnMyUW1wb0tWMWRYdUxtNTRlVEpreXEvV0tlbXBpSW9LQWp2Cit2UE1PWEZ4Y3NHelpNbnorK2VmOFlxbFNaV1ptU3I4VWw2WlhzdnczMUZRb0ZKZzNiNTdLandCNVB5d0FRSFoyTnV6czdPRGw1UVZ2CitiMitZbTV0RENDRjFWUnNXRm9iMzMzOGZ4NDRkQS9DeW9iU0hod2VBbDFWeGV2WHFoUlVyVmlBd01CRGJ0bTJEbzZNakRBd01wQk82Cis3dDI3cTl6UU0vK1BHYmR1M1ZKYmRybGNqa09IRHFGVHAwNklqNC9IaEFrVHBBYlFlZnVRaVJNbm9rMmJOZ2dNREt5UUtrQkVlVnEwCithSUdKRXljQ0FHYk1tRkdxYVl0YnQ4dXo3WXdiTjA2NnVXZE9UZzQ4UFQzUnZIbHo5T2pSQTZhbXBqQXpNME5TVWhMOC9mMmxIejI0CitMWldSSUtvQkRBd014TjY5ZTJ2VU1nY0hCd3NBSWpFeHNVYVd1VktwRkFZR0JtTEpraVhDeTh0TG1KbVppUll0V29naFE0WUlWMWRYCiswYlp0V3dGQW1KcWFpcDkvL2xsdGVqOC9QekZnd0FDaHJhMHRBSlQ2ejhEQVFPVG01aGE2ZkhGeGNXTEpraVhTY2dBUU1wbE1HQm9hCitpbWJObWdrQW9rMmJObUxSb2tVaUxpNnVWbTRYNXVibXd0Zlh0MDd0QzlxMmJhdXhuM24vL3YyaWMrZk8wdm9vbDh2RnFGR2p4UEhqCit4d3VkNXErLy9oS1RKMDhXN2RxMVU5c0dldmZ1TFg3NTVSZVZiWExwMHFWQ0xwZEw0elJyMWt4czI3Wk5DQ0dFczdPemFOKyt2ZkQyCis5aGFob2FFcTI0OUNvUkRmZlBPTmFOcTBxY3A3bUppWWlIUG56b24zMy85LzdkMS9kTlYxL2NEeEY5dmR4Z1p6VG40VkVUL3EyRElDCitBOUVnRWF4T0J4STlrT21SVUE2ZE9xRVFFVCtVTURyUU9YS0M2bVFIUzRxQWxITThtZ2RQSFRNTXpCTjRHSEZVMUNVSnlWa29uRkorCitqRE1Zc3JHTjdkTWZmdG5YeGE4cEc5eTdQUjUvN1c3M2ZuYnYrM012N0xuUGZYMTJlOUt0VzdkazJyUnB5ZWJObTVPR2hvWmswNlpOCit5WXdaTTVMdTNiczNlNDFObkRneGVleXh4MDU1TEVlT0hFbG16NTZkRkJZV0pyMTc5MDZtVHAyYWZPTWIzMGo2OWV1WDNIWFhYUm54CitPcHcvZjM0eWN1VElEdldhbWo5L2ZqSnUzTGlNZmd3N2R1eElDZ3NMazZxcXFoWmQvLzA4dHovSWErZWsrdnI2Wk5HaVJVbGhZZUVwCisvNy85NEFjL1NHcHFhazU3LzlyRGErbWtWMTk5TlltSVpNK2VQYTIrN1QvOTZVOUpVVkZSMGlscDdXbEFhQU9YWG5wcExGKyt2TmxiCitNZEpkYVdscFhIZmRkWEg0OE9HbTM5eGttcWVmZmpwdXVPR0drNy80aUYyN2RrVlpXVmtjT25Rbzh2UHpZOUNnUVRGMDZOQ3pubmIyCitBdnhDSm5idDJoWC8rTWMvb3FLaUlob2JHNk5uejU0eGNPREFLQ2twYWRmdkp4NDhlSEJNbXphdDZUZUhIVUcvZnYxaS92ejVIZW94CisvNitEQnc5R1dWbFo1T2ZueDdCaHc1cit5dm51M2J1amYvLytaMzA5MXRiV1JsbFpXVlJVVkVUUG5qMWp5SkFoa1VxbG9yeThQUHIxCis2M2ZPdjRqZUVyVzF0Zkgzdi84OUtpb3Fvcmk0T0s2ODhzcG1aM2RLWi9mZWUyK1VscGJHNXMyYk84eno2ZDU3NzQzdDI3ZTM2QzI3Cis2ZXpsbDErT29VT0h0dG4yeitlMVUxTlRFMlZsWlZGWldSazlldlNJd1lNSHQraUVPWm44V2pwcCsvYnRNWGp3NE5pelowLzA3ZHUzCitWYmU5YnQyNnVQMzIyNTJhR1Rpemt5RVQ4ZTZwcGt0S1NwcjlzYTUwa0s3M0M5cEtqeDQ5VHBrbmkyalpLVnJ6OHZLYUJwUGY2K1RiCitTbHREWGw1ZVhIUE5OWFlVRjFSYmhzejV2bmJ5OC9PYm5mblRhNmwxbVprQkFBREVEQUFBZ0pnQkFBQVFNd0FBZ0pnQkFBQVFNd0FBCitBR0lHQUFBUU13QUFBR0lHQUFCQXpBQUFBSWdaQUFCQXpBQUFBSWdaQUFBQU1RTUFBSWdaQUFBQU1RTUFBQ0JtQUFBQU1RTUFBQ0JtCitBQUFBeEF3QUFJQ1lBUUFBeEF3QUFJQ1lBUUFBRURNQUFJQ1lBUUFBRURNQUFBQmlCZ0FBRURNQUFBQmlCZ0FBUU13QUFBQ0lHUUFBCitRTXdBQUFDSUdRQUFBREVEQUFDSUdRQUFnRFNUc2dUUXR0YXVYUnRGUlVVV2dsYTNmZnYyRHZlWUt5b3FZdTNhdGRHOWUvY084NWdiCitHaHJpK1BIajBhVkxGMDk2LzE2M2lYWHIxc1hhdFdzOUFWcWd1cm82OHZQem8xT25UaFlqVGY2ZkVqUFFWaSt1MUxzdnI5bXpaMGRPCitUbzRGb1UzazVlVjFxTWRiVkZRVUd6ZHVqTEt5c2c3em1PdnE2cUs2dWpyeTh2S2ljK2ZPZm9ocVE1V1ZsVEY2OU9nTzlaano4L01qCitJdUxPTysvMEJEaUgydHJhcUttcGlZS0Nnc2pOemJVZ0xYRGt5SkdJaU1qS2FyczNnNGtaYUNQRGh3K1BKRWtzQkxTaXQ5NTZxOE05Cis1cnE2dWxpMWFsVXNYYm8wcXFxcVl1Yk1tVEZyMXF3b0xpNzJoT0M4TFZ5NE1CWXVYR2doem1MOSt2VXhkKzdjMkx0M2I5eDMzMzB4CitaODZjcGdqazRqTXpBd0JwTERjM042WlBueDdsNWVYeG94LzlLQjU2NktFWU1HQkFMRnEwS0Nvckt5MFF0Skh5OHZJWVAzNThqQnMzCitMb1lQSHg2N2R1MktCUXNXQ0JreEF3Q0lHa2hQaHc4ZmpydnZ2anNHRGh3WVZWVlZzVzNidGxpOWVuVjgrTU1mdGpoaUJnQVFOWkIrCitUcHc0RWN1WEw0L0xMNzg4MXE1ZEcydldySW1OR3pmR2tDRkRMSTZZQVFCRURhU245ZXZYeDVWWFhobmYrOTczWXRhc1dmSFBmLzR6CitKazZjYUdIRURBQWdhaUE5bVlzUk13Q0FxSUdNWWk1R3pBQUFvZ1l5aXJrWU1RTUFpQnJJT09aaXhBd0FJR29nbzVpTEVUTUFRRHVOCittb1VMRjRvYTJpVnpNV0lHQUdqblVmUHd3dytMR3RvVmN6RmlCZ0FRTlpCeHpNV0lHUUJBMUlnYU1rcDVlWGxNbUREQlhJeVlBUUJFCitqYWdoTTd4M0x1YklrU1BtWXNRTUFDQnFSQTNwelZ3TVlnWUFFRFZrSEhNeGlCa0FRTlNRVWN6RklHWUFBRkZEUmpFWGc1Z0JBRm85CithcFlzV1NKcWFEUG1ZaEF6QUVDYlJjMjBhZE5FRFczQ1hBd3QxU2xKa3NReWtQWlAxRTZkWXZEZ3dURnAwaVNMQVpDR0dob2E0c1VYCitYNHlOR3pkR2JXMXRYSHZ0dFRGeTVFanpETHd2aHc0ZGluWHIxc1hPblR2anFxdXVpakZqeGtSaFlhR0Y0UlRyMXEyTHpaczNpeGt5Cit3elhYWEJOVlZWWFJ0V3RYaXdHUXhwSWtpWXFLaXRpM2IxODBORFJFejU0OW8xZXZYcEdkblcxeE9Hc012LzMyMjNIZ3dJSG8yclZyCis5T25USndvS0Npd01aMVJkWFIxZHUzWVZNd0JBNjZ1cnE0dlZxMWZIa2lWTG9xcXFLbWJPbkJtelo4K080dUppaTBPVEV5ZE94RzkrCis4NXRZdEdoUkZCUVV4STkvL0dOdkorTjlFVE1BZ0tqaGdsdS9mbjNNblRzMzl1N2RHL1BuejQ4NWMrWjRXeUppQmdBUU5hU3Y4dkx5Cit1UHZ1dStPcHA1NktyMy85NjdGNDhXS25XZVlEY3pZekFLRE5PZnNaL2w0TWJjR1JHUURnZ25Pa3B1TXdGNE9ZQVFCRURSbkhYQXhpCitCZ0FRTldRVWN6RmNLR1ptQUlDTHpreE4rMkF1aGd2TmtSa0FJTzA0VXBOWnpNVWdaZ0FBUkUzR01SZURtQUVBRURVWnhWd002Y0RNCitEQUNROXN6VXBBOXpNYVFUUjJZQWdJempTTTJGWnk0R01RTUFJR295anJrWXhBd0FnS2pKS09aaVNIZG1aZ0NBakdlbXBuV1ppeUZUCitPRElEQUxRN2p0UjhNUDg3RjdOMDZkTDQydGUrWm1FUU13QUFvaVo5bVl0QnpBQUFpSnFNWWk2R1RHWm1CZ0JvOTh6VW5NcGNETzJCCitJek1BUUlmVEhvL1V2UG5tbS9IbW0yL0c5ZGRmZjlicm1ZdEJ6QUFBZFBDb09YYnNXRHo3N0xNeGZ2ejRpLzQ0ZHUzYUZTVWxKVTJQCitLU2NuNTdUWE14ZERlK050WmdCQWgzVStiei83NVM5L0dSTW1USWlsUzVkZTFNZXdjK2ZPdVBiYWF5TTdPenV5c3JMaWdRY2VPT1U2Cis1ZVhsTVdIQ2hCZzNibHdNSHo0OGR1M2FGUXNXTEJBeVpEeEhaZ0FBL2s5TGo5UWNPM1lzUHZyUmowWmxaV1ZrWjJmSGxDbFRZc1dLCitGWkZLcFM3by9TMHJLNHN2Zk9FTGNmVG8wVGh4NGtSRVJIVHAwaVhlZU9PTjZOR2pSeHcrZkRnV0wxNGN2L2pGTCtKem4vdGMzSC8vCisvVEZreUJBN0dqRURBTkJSbythblAvMXBMRml3SU9ycjZ5TWlJaWNuSjBhT0hCbC8rTU1mb3FpbzZJTGN4NWRlZWlrKy8vblBSM1YxCitkVFEwTkRSOVBqYzNOeVpObWhSWFgzMjF1UmpFREFDQXFQbi9xTG56emp0ajBLQkJwN3dOTFRjM053WU1HQkRQUFBOTTlPM2J0MDN2CisxNVl0VzJMTW1ERngvUGp4WmlIelhnVUZCZkg5NzMvZlhBeGlCZ0JBMUx3Yk5RY1BIb3o2K3ZyVFJrUk9UazVjY3NrbHNXSERocmpxCitxcXZhNUw1czJyUXB2dnpsTDBkZFhWMDBOamFlOWpwWldWa3haTWlRMkxadG01MkhtQUVBSUtLeXNqTDY5T2tUMWRYVlo3eE9kbloyCitwRktwZVB6eHgxdjlUR2NiTm15SThlUEhSMzE5L1JsRDVyMUI4N3ZmL1M1dXZmVldPNDUyeTluTUFBQmFhTldxVlUxek1tZlMwTkFRCitkWFYxY2ZQTk44ZXlaY3RhN1hzLzlkUlRjZU9OTjU3MWlNeDdKVWtTMy8zdWQrUDQ4ZU4ySEdJR0FLQWpPM2JzV0N4WnN1U2NNWE15CitKQm9iRzJQT25Ebng3VzkvKzR4ekxTMzF4Qk5QeE0wMzN4d25UcHlJbHI2cEprbVNlUHZ0dHkvNnFhTkJ6QUFBWEdUTGxpMkxvMGVQCit2cS9iTkRZMnhzcVZLK09tbTI2S2Q5NTU1d045MzBjZWVTUnV1KzIyOXhWRWVYbDUwYWxUcDRpSWVPMjExOEpVQWUyVm1Sa0FnSE9vCitxYW1KZ29LQ2lIajNyR1YxZFhYdjYvYTV1Ym54aVU5OElqWnMyQkM5ZS9kdThlMVdyMTRkVTZkT2JkRjhUQ3FWaXJxNnVoZ3dZRUJNCittREFoeG80ZEc2TkdqWXJPblR2YmdZZ1pBSUNPYk4rK2ZiRjE2OWJZdW5WclBQZmNjMUZXVmhaMWRYV1JsNWZYb29IOG5KeWNLQzR1CitqbWVmZlRZR0RScDB6dS8zNElNUHhuZSs4NTB6SGxYSnk4dUx1cnE2eU0zTmpTOSs4WXR4MDAwM3hkaXhZNk4vLy81MkZtSUdBSUF6CitxNit2ajVkZmZqbWVmLzc1K052Zi9oYWJObTJLL2Z2M1J5cVZpdXpzN0tpdHJUM2xObGxaV1pHWGx4ZS8vLzN2WSt6WXNXZmM5czkrCis5ck9ZTjI5ZXMwQnk5QVhFREFCQW0vblBmLzRUTDd6d1FtelpzaVUyYmRvVXI3NzZhdFRYMTBmbnpwMmp0cmEyMlZHV1gvM3FWM0hYCitYWGVkc28zNzdyc3ZGaTVjR0JIdm51YTVzYkhSMFJjUU13QUFGMVpkWFYyODhzb3JzWFhyMXRpOGVYT1VscGJHZ1FNSG1yNytwUzk5CitLZGF2WHg5WldlK2VrMm5hdEdueDYxLy9PaUlpK3ZmdkgxLzV5bGNjZlFFeEF3QmNLUHYyN1lzLy92R1BGdUlNRGg4K0hQLzYxNy9pCis2YWVmam9hR2h1amJ0Mi9jY2NjZHNYNzkrdmozdi84ZEgvclFoMkwwNk5IUnJWczNpM1VXSTBlT2pFOTk2bE1XUXN5SUdRQ2c5WlNXCitsc1oxMTEwWHZYcjFpaTVkdWxpUWN6ajVOMm15c3JLYVRxZk0yZTNldlR1V0wxOGUwNlpOc3hnZFhNb1NBQUJ0NGZYWFg0K2lvaUlMCitRYXNiUEhpd1JTQWkvTkZNQUFCQXpBQUFBSWdaQUFBQU1RTUFBSWdaQUFBQU1RTUFBQ0JtQUFBQU1RTUFBQ0JtQUFBQXhBd0FBSUNZCitBUUFBeEF3QUFJQ1lBUUFBRURNQUFJQ1lBUUFBRURNQUFBQmlCZ0FBRURNQUFBQmlCZ0FBUU13QUFBQ0lHUUFBUU13QUFBQ0lHUUFBCitBREVEQUFDSUdRQUFBREVEQUFBZ1pnQUFBREVEQUFBZ1pnQUFBTVFNQUFDQW1BRUFBTnFCbENVQUFEaC9WVlZWc1hmdjN2UDd3U3lWCitpazkrOHBPeGYvLytPSGp3NEJtdlYxeGNIQi81eUVkTytYeVNKUEhhYTYrZDlqWURCZ3lJTGwyNjJGR0lHUUFBbXZ2TFgvNFN0OXh5Cit5M2x0bzJmUG5yRi8vLzdZdlh0M3JGeTVNaDUrK09GSWtxVHA2eVVsSlRGeDRzUVlOV3JVR1dQbXozLytjMnpac2lXZWZQTEppSWdvCitLaXFLNmRPbng0d1pNOFFNWWdZQWdGUFYxTlJFUkVUdjNyMWp3WUlGOGRuUGZqWXV1K3l5U0tWU1VWcGFHcE1tVFlxSWlJOTk3R1B4CiszSFBQUlpJa2NmejQ4WGpycmJmaXlTZWZqR1hMbGpWdFk4U0lFVEZpeElpNDRvb3JZdDY4ZVUzZjQ0Yy8vR0ZNbkRqeGpQY2hLeXNyCis3cm5ubnJqbm5udGk0TUNCc1dQSGpuajg4Y2RqekpneGRoQmlCZ0NBMDZ1dXJvNmNuSno0NjEvL0dpVWxKYzIrMXFOSGo2YVBjM0p5CitvaytmUGsyWEw3Lzg4aGc5ZW5SY2V1bWxzWGp4NG1hM216MTdkanowMEVPeGMrZk9pSWdvTFMwOWE4eWNsQ1JKVkZSVXhNaVJJNFVNCis3Wm9UQUFBQXRJS2FtcG9ZUDM3OEtTSFRVak5teklqR3hzWm9hR2hvK2x3cWxZcUZDeGMyWFg3a2tVZmkyTEZqNTl6V0N5KzhFQWNPCitISWdaTTJiWU1ZZ1pBQURPSFRQanhvMzd3TGUvN0xMTFl0aXdZWEg4K1BGbW43L2xsbHVpWDc5K0VSRng1TWlSK08xdmYzdk9iYTFlCit2VHE2ZCs4ZUV5Wk1zR01RTXdBQW5OMjhlZk5peXBRcDU3V05MVnUyUkVGQlFiUFBwVktwbURWclZ0UGxuLy84NTgyTzN2eXZvMGVQCit4cU9QUGhwVHBreUp2THc4T3dZeEF3REFPWDZveXNxS1RwMDZuZGMyc3JPelQ3dU5iMzd6bTFGVVZCUVJFVys4OFViVG1jcE81OUZICitINDFqeDQ3RnQ3NzFMVHNGTVFNQXdNVlZXRmdZVTZkT2JicDgvLzMzbi9aNlNaTEVpaFVyWXRTb1VSOTRkZ2ZFREFBQXJXcm16Sm1SCitTcjE3SXRvdFc3YkU4ODgvZjhwMVhucnBwWGpsbFZlYWhRK0lHUUFBTHFvK2ZmckViYmZkMW5UNWRFZG5WcXhZRWNYRnhmSFZyMzdWCitnaUZtQUFCSUgzUG16R242K0lrbm5vZzllL1kwWGE2cXFvckhIbnNzSmsrZUhKMDdkN1pZaUJrQUFOTEgwS0ZENC9ycnI0K0lpTWJHCit4bmpnZ1FlYXZtYndIekVEQUVCYW16dDNidFBISzFldWpLcXFxcWJCL3hFalJzU25QLzFwaTRTWUFRQWcvZHh3d3cxTlp5bzdldlJvCityRnExS3JadDJ4WmxaV1VHL3hFekFBQ2s4UTl2V1ZuTlptZVdMVnNXRHo3NFlGeHl5U1Z4NjYyM1dpREVEQUFBNld2eTVNblJ2WHYzCitpSWpZdTNkdnJGbXpKdTY0NDQ3bzBxV0x4VUhNQUFEUWVob2JHMXQxZS9uNStURjkrdlJtbnpQNGo1Z0JBS0RWdmZQT08wMGYxOVRVCit0TW8ycDArZkhubDVlUkVSTVd6WXNQak1aejVqb1JFekFBQzBybWVlZWFicDQ3MTc5OGFPSFR2T2U1dTlldldLeVpNblIwUVkvRWZNCitBQURRZWc0ZE9oUlRwa3lKSVVPR3hJb1ZLNXA5N2VxcnI0NGJiN3d4ZnZLVG41elg5NWd6WjA0VUZoYkd4SWtUTFRnZFVzb1NBQUMwCit2bTdkdXNXYU5XdmE5SHRjY2NVVnNXblRwaWdzTExUZ2RFaU96QUFBWkxDaFE0ZGFCTVFNQUFDQW1BRUFBQkF6QUFBQVlnWUFBQkF6CitBQUFBWWdZQUFFRE1BQUFBWWdZQUFFRE1BQUFBaUJrQUFFRE1BQUFBaUJrQUFBQXhBd0FBSUdZQUFBQXhBd0FBSUdZQUFBREVEQUFBCitJR1lBQUFERURBQUFnSmdCQUFERWpDVUFBQURFREFBQWdKZ0JBQUFRTXdBQWdKZ0JBQUFRTXdBQUFHSUdBQUFRTXdBQUFHSUdBQUJBCit6QUFBQUlnWkFBQkF6QUFBQUlnWkFBQUFNUU1BQUlnWkFBQ0E5SkN5QkFCQVcralZxMWNVRkJSWUNGcGRaV1dsUlNBaUlqb2xTWkpZCitCZ0NndFZSVVZNVEdqUnN0QkcxcTZOQ2g4ZkdQZjl4Q2lCa3hBd0FBWkI0ek13QUFRRVpLdmI3OXhhWUxKWU91dGlJQUFFQkdjR1FHCitBQURJU1A4RnB4Wm5XUzBVMzdjQUFBQUFTVVZPUks1Q1lJST0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9maWVsZHNlcV9idC5naWYuYjY0IGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2ZpZWxkc2VxX2J0LmdpZi5iNjQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjViNTU3YgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9maWVsZHNlcV9idC5naWYuYjY0CkBAIC0wLDAgKzEsNDQ3IEBACitSMGxHT0RsaGN3S2ZBdWNBQUFBQUFFbEpESyt2cjBnU0VsWU1EQzhrRFY1YkVCY0hPd1lHU0VRT0RtRWFHZ29LT0JrVFZDMHRWeUFnCithRGNKQzZPam95czhEQUFZR3FTa3hWOWZGRnRkRUptWm1VQTRFRjB3TUFBQWNBb1RIVFpISjBnWUdBY01Ud2NTTzI5SVNGVUhCMkFWCitGWGQzWUFjSE1SVVZRaUlBR2c0SFQzdDdleXdPSjNkM2R3Y0hTRUVnQUJNdURuZDNPR3BrU1FBQVlsWkdCekVFQkdKbERDc3RDeHdjCitXUWNIU3prUkdXQnRZQzBBQUNBM0FCQUtOaEFRVFRNd0RBMFZRRDRBQUVZVkZWVlZWU1FNSlFVTE9COGZRU2NuWUJnWVJENVZQbVptCitERVpSQjJaaURBb0tTZ0FBVkF3UU9INStsQndjUys3dTdob2FTVDQrWDNkM1dBQ1BBRE16TXlCUklEZ0FBR0JnYzBKQ0VIRUFBRXdOCitEUmt3REFvS09SOGtQWlI3ZXlBMUlBQnBBQmdOUUJBOUVBQlZBQXNMUnd3L0RBd01QZ0JOQUVORENnYzlCOHpNekFVRlFRQkRBRDRNCitEQXdPS2dBQWNRQTVBRXRMRllxS0FBME5UQzhIQnhFUkVRZ2ZDQUFyQUFBcEFDSXFNa2tHQmhvcUtud0FBQXNHUTZxcXFrb0tDZzRPCitNbGtjSEFvWkpDY3JXNlNrcEZRQUFBQUFPQkFPU3dBVkdoMFJPZ01QSFdabUIwMFFFR1VBQUZRYUdqRXlDMnc0T0xlM240cUtpb2lJCitpQkFWTUM0dVhoa1pVR0lBQUhKWVdIZDNBQUFBUGhBUVVRVUdMMEJBSUdnZ0lCZ0FHa0lWRlY5ZkVBd2NKUjhLSkE4TVU5RUFBQWNICitWUm9hWVdob2FEY0FBTHU3QUdabVpuQUFBR1JrWkdRVkZWaHFXRDRLQ2d3T1V6TXpEQUFBbWdrbEJ6RUhCekV4Q2xoWVdCTVRQQVlKCitReThmQ0ZwYUIvLy8vLy8vQUNJU1JFeFVEVVFyREF3TVZoSVNTRVlZR0hkM0lEaGNPRVJFUkVsSkFBa1BOVHNIRjFoWWNrZ0dCajA1CitDRllBQURnNE9DQVZPMGhDRERBd01MdTdpbHBhRFI4cUNEZytFQnhHSE4zZDNSRUdOam85Q0RROERCd1lSR1ptSEZNQUFCUStGQkUrCitFU0lpSWhzK0J4VTBGV1ZlQncwNERZcUtzeEFzRUI4aFFBd3VEQWMyQnd3cURBb3FDZ2NJTDFkTURRQUEwUTBpRFF3aURBY2tCeEFRCitFRHdBQUFBQVUwSkNEQWtKUHJ1N3U1b0FBRGc0YkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNINUJBRUFBTHdBTEFBQUFBQnpBcDhDCitBQWorQUhrSkhFaXdvTUdEQ0JNcVhNaXdvY09IRUNOS25FaXhvc1dMR0ROcTNNaXhvOGVQSUVPS0hFbXlwTW1US0ZPcVhNbXlwY3VYCitNR1BLbkVtenBzMmJPSFBxM01rejV6MEFRSU1DU05IeVowV2pFNUdxTkFaQXFjR21UKzhWWk1vTDZrNnJFcDBLZkVKbDQ4OVZCY0VCCitHR2pCd2s4TEJKc3lGUXFVMTVNVWRRRFVXZlZrNEpOVmNjRVI1WlhDVDgrL2dBTi94RnAwTEVXdER4RWZSS280NHM4bjEvWWVKQ3lRCis4R08rMXhoU2J2d3hSV2FrbEJFaVhvVlc0ODg2Qk5XMEZRamt5ZW02bGFVS2RMcUtTdVpyUUl4dHBiTHFjNTFKYnNIQkZrdzhwWVVUCit3NHVIREsyU00wUG5DcUhQTml6OXVXR0ZvUzFmYjdoNXUwblFzaGYrYXIyRzJpc0FLbjRGcHFCeUhRaXZuOFlrWTNXSzlSb0FOWHgxCitrd1VuY0JWdzVRQ1NkQXNBOGppRFhJQWVFUVlYQU1iZ3AwWUtLUUFGWVZ4RVBiamdYbS9GQlVSbUQxcFF4ejFxc0RmVWRBVmxDTUNHCit2Rmc0bGhwTWdiT0tZWDZJQlk1ZkhYNjQyRkJ4MGNVTGJuS2xVRmRRa2dTMUl4QTkxbVdNQldKUllRRjdkWlEySFZCSXNkaGpiRzRSCitXVWVFNGYzVUZsUU42aFVpVUsxcHVWMVE5M1NwMjRMZ2xOWWxBR21tS0dKcnZCeEo0WVd4aVVrbUx6R3ltWjZVTG5xWEFsZ0M1VG1qCitRUkUycWQrTmt3REtDemlUd0FqY1Q2cmhWMVdXMjgwMTNEMTFVZkhmVnJJdGllQ25IdzBZVklFSGdub1JWdXRsbGdKL1grRjU0aFArCitmalQxRldSNjhXWGJYVjNkVTRjeG1Cb0RuR3BTYVpVcXJ1L05KUlVWclYzRFhySEJBbkNOcnJ3bU45Q3MxN2pJQzIrUVVVRVVZNFpoCitxeXhSNTJYMklsRndGV1NVVVUvOHRtT2JYQnJ6eEJORWh2ZWVZVkNkNXdkNVJEMVJhM2VWemFqR1BlQ29TcTh4NHFKMlpYRGdodmxxCityRkpCQlI2ejgyYUdiTGJlK1RxYmpUOWxOdENxNG5wSFVNYmxxUUVPVXIzTm14K1ZKSklWbDdhU1RvcVFhbi9aeWRiTU5OZHM4ODA0Cis1Nnp6emp6WGJHcEZXQTBxMElkS1dTV3Jzd0loeVV1VEF0bjNMOUlFMmRkc1FVenZlRi9HS1VKdHdWaXJTQVpFQ2xpTHBuVWRxbW5zCitvY2ttbDUwMGFnQ2t4NjI1WXhubHFVQ1Q2TmFVMmxiTCt6RCtBS1hOcFRISzA5THI1TWFDaytoM1dySVozZkRVTG5jOTBOZDRiMTJRCitWWTZ6SnRtaVRub2MrTFYrUVlpVWZ1aXlTNmxCOTZ3SEFLRE1BYTVUWkJDMjd2cnJzTWN1Kyt5MDEyNzc3YmpESGczTjREZ2o3YzhQCitZVFh6UFVVblR2eDFSZ2wvUEZsVWdCTXYyZ01wL3phSmF3VUZ0dWFiVDZmVXVkVEZqZnhZVmsyL3VWRVJDbVgzOHRIclRlL2lUYThDCitUaDFBNE1ldnl5a0NzU3RWOUJ0MWpmdnd5Mjg4bFE1Ylg1elljcjNzcFU4ZzFaTVE0Z2JDSDdIeElsR0xldHA3L3NPWU9qeGhQdGh6CitGWDQwVlJEUHFBNTRJSVNJcUFoa29OK0YwQ0ZCa3hmMEZCZTJzMVhOYVZHNkQ1VzA4c0tyR2NZK1p1UGE1YUIzSTdPQkkzTCtxSGtiCitFUFBYUGJpWnpBS0hTaDhPbTZZZEFLb3dRL1RMbmxVT2hyYndiUWVLaW5OaUZhVlN1WUVza1JlU0k0aU5lTkZGZzFTdEtnblJIOWxZCitOWllVU0VvcFg4TmdXcElEbFZVUkpGYXdTZDBKOTJpUVc1REtoSHprVG5oUzlVQUxGcTlPcDZNVnVXNVZHN1JGNm9GdDQ2R3Rya0VzCitwUmdqV2N2U1ZiQ0locndkVXF0VzN0TFd2T3FDbEZDQ1N6YmlJeEc2MVBVdGx4bkRYZkJxb3N1c0FnUTQyVEdTSHdQQWoyVERTcWJzCitra1Mxck1zdC96ZEx4amtNWXphNkpNV21zaGROUXF4MGZBa1lHYW5qeVc2SjBpaUhVa3E2NURpUVYyYUdXTUZCMFQxRW1iVkFtak1oCitsRHduUlJTME12d2NjbEkvV1pDT1RBUW5wU3dvUGdEK21JUlc2RW5LNnp5QktZWkttb3pRWWsvdnFJaUtQRUtvV05SQUh0UWtkQzlXCitUTm40RFBNbEtrSWxsbGR5WXk2MW1LSzFVQUUvQUkzYVFxMkNKRGJCaFcyb1hKRkgvWWV5ZWttbG9kZVNZVW5iNUJhQUlyRWdrM0NQCitRTmxVbWdpNTVVVk5Nb3hQTndwSmQ5NUhNazVwMU9qc2doZTVsR3dyVGExVjBuU3F6cXBhZFNYVm1ja09yN3JIZEFFeU5iRFJWVStBCitNRGl1bXZXc0hjbHFUTzZ4S2JTZU1BVmxQY2dxV2dNdlJlV2tXbTdOcTE0dG90YTkrdlVqYjJGSUxGL0ZFN1A4OWJDSVRheGlGOHZZCit4anIyc1pDTnJHUW5TOW5LV3ZheW1NMnNaamZMMmM1NjlyT2dEYTFvUjF1U2Z4SHZ0S2hOcldwWHk5cld1dmExc0kzKzdXa0JhVnJaCisydmEydU0wdGJOT28yOTc2OXJlN0ZRMXdoMHZjMy9LMnVNaE5ibkFONGhybE92ZTVwMjFaUXZJeGkrcGE5N3JZemE1MnQ4dmQ3bnIzCit1K0N0YmdaVU9CQlA0T084NkUydmV0ZkwzdmE2OTczd2phOTh6MXVJaEhCREZmak5yMzczeTkvKyt2ZS9BQTZ3Z0FlTVgyNGt4QnBnCitTTENDRjh6Z0JqdjR3UkNPc0lRblRPRUVXeU1oU3dpdmhqZk00UTZEbHdhaVljVjhSMHppRXB0WXZwNWdTRDdjd2VJV3UvakZNSTZ4CitqR2RNNHhyYitNWXNuZ1Y1QmVLSlV2ajR4MEFPc3BDSFRPUWlHL25JU0U2eWp5K1JFR0wwNHNsUWpyS1VwMHpsS2x2NXlsak9zcGFmCitUSXlFVkdFS1lBNnptTWRNNWpLYitjeG9UclArbXRjTTVpb2s1QVU0anJPYzUwem5HenRBTlBoUXNwNzN6T2MrSnpuRkMxbHhuUWROCis2RUxUV01jSTZiR2ZGODNvUmh1WnlRaHg4cFluVGVsS1d6ckxYVWJJbDluTTZVNTcrdE5xZGpOQzRHem9VcHQ2MEhkZVRKNGR6ZXBXCitMeHJRQ2hIMHFXZE42MFB2bUJlS2RyV3VkLzNvSmwvNjE4QU9OcFl6ZlpCTmcvcll5RTcybVVWOUVGTFgrdG5RZGtlcVNiZHFYbHY3CisycVdBZFVMT1lZWnVlL3ZiNEE2M3VNZE43bktiKzl6bzdqWVhJSUFRRGhEZzNmQ090N3puVGU5NjIvdmUrTTYzdnQ5ZGk0VEk0Z2dBCitEN2pBQjA3d2dodjg0QWhQdU1JWERuQlpKT1FkNklpNHhDZE84WXBiL09JWXo3akdOODd4aUw4aklleEl0OGorUjA3eWtxUGJEUWlCCit3Qi8yemZLV3UvemwrdWFBaXFOTmMxb2oraUM1eHJiT1d3M3BnMGhhMkVBUCtxV0piUkJqSy92b1NQODBzdzNpN0pvN25kRFRObGUxCitkMDUxUm1zYkliSit1dGJuZkhPRDVMenFZTjl6enczeWM2R2IvZXhXSm5wQmpKNzB0cnZkekVzdlNOTzNUbmNiUi8xalV3KzczcEY4Cis5WU5rdmU2QWwzSFhDL0wxdlJ0K3lHTXZTTm5Sem5qR3E1MGdiSCs3NU44ZWQ0TE1QZkNZYi9IZHA1WDN3M3YreDMwM3lOOHpuL25CCitFNlR3bi9kODRnbXkrTWE3UHVpUEgwamtKMC83bzFkK0lKY25mZUEzUDV2T3AvN3dvUy9JRU9aQS9PSWIvL2pJVDc3eWw4Lzg1anYvCisrY1VuQkVKK29JWHFXLy82Mk0rKzlyZit6LzN1ZS8vNzRLOCtMQktDaFdtWS8vem9UNy82MTgvKzlydi8vZkNQdi9teGtCQnprT1ArCisrTSsvL3ZmUC8vNzcvLzhBR0lBQ2VIL21rQkQyQUgwSW1JQUt1SURQeHdRSVFRamhGNEVTT0lFVUdINC9NSE82cDN1bVYxNi8xNEdyCitOeEN0OTNvaStHdXhKeEN6VjNzb0NHcTNKeEM1bDRGMHgzdnY0WHNkcUhmQlJ4Q2o1NEowdDRFOE5vT3A5NEVDRVlJakdJU1RWb0s4CitjSUlwZUlSc3RvSzgwSUk0K0hRd2VBOHl5SU5WVjRNRGNZTk4rSFE2aUd0U3FIcStKb1JlV0dsRWFJUklPSWJMOW1aWHVIdDR0b1hBCitoNEZubUlPM2hucHF1SE0reUF0QStJVjJPR1ZoU0laNm1JUm0ySVl2bUlaeFNJTU1BUVV2VUlpR2VJaitpSmlJaXJpSWpOaUlqdmlJCitrRmlJUzhCdUI1RUE4M0NKbUppSm1yaUpuTmlKbnZpSm9CaUtvbmlKT0pBUTJaQUpxSmlLcXJpS3JOaUtydmlLc0JpTHNqaUxxSmdOCitDUkVQYkpDTHVyaUx2TmlMdnZpTHdCaU13amlNeEppTDhaQVFoaENKeXJpTXpOaU1rRGdDS1pjS296aU4xRmlOMWlpS0NjQ0dmb2lGCitieGlJZWplSGRYaUg0dGdMZWJpSDVsaUdvN2FOVy9lRVVlaU52RWFGQW1HRjZsaHJXUWlIN3NocjREaU8rb2lIWG5hTy9raG1Tc2lFCis4emhyN0hpUFU2aU5Bd2x0OVdpUVZKZVArL2lRNU5pUC96aVJVeENRQ1ZsekJjbVFPZ2VQdkVBRUh2YVJJQm1TM3BVQkFvQVFyc0FICitLSm1TS3JtU0xObVNMdm1TTUJuK2t6STVreWpaREFrUkNnU1drenE1a3p3NVlLR1FFR0pRWVVJNWxFUlpsQlFtQmhnbWtrcTVsQ0M1CitDUWdoQUkxQWsxSTVsVlJabFRQcENnelJBRyt3bFZ6WmxWNzVsV0FabG1JNWxtUlpsbWE1bGZSUWtnZWhBQ2ZXbG03NWx2QlZYd2dSCitCM0pRbDNaNWwzaVpsM3E1bDN6WmwzNzVsNEJabDNHUUVPSndCb1o1bUlpWm1JcTVtSXpabUk3NW1KQVptWVlwRGdtaENXZDVtWmlaCittWnBwbGlUd2xDSUdsNkFabW0ycEFBaDVrVGJYalJxSmJRNEprZnBZamhUcGp4WnBtdENXa2FscGJSd3BqN0paYUF0Wm05YTJtcXdwCitqcTc1bXVZWW03bEphN1RKbTdwMm04VkpqNmlKbkxybW03OXBoOEVwbkhwSW5NdHBhc2Zwbkt6K3hwRk9VQVBlK1ozZ0daN2lPWjdrCitXWjdtZVo3b21aN2VxUUtVYUJBREFBTHdHWi95T1ovMFdaLzJlWi80bVovNnVaL3dHUU1KZ1FhN0VLQUNPcUFFV3FBR2VxQUltcUFLCit1cUFNR3FCb2tCRHJrQTRTT3FFVVdxRVdlcUVZbXFFYXVxRWMycUVTdWc0SnNRYnFPYUlrV3FJbW1wNExrSEo2d0o4czJxSXUrcUw3CitPUUNsZVoyRXRwdmF5WE5kR0oxM09KM1VPWWJXU2FPRmxwMDNhblV6Q3FSMFpxTkQybWpRcWFOQ3lLTTllb1EvYXFSMUpxUkoybWZLCitLYVc2Mlp4VnVtaEx5cVFqNktSUGlvSlJpcVZ5UnFWYnFtZFhTcVoxaHFSbnltZGQ2cVd2QjZaaFNudGpxcVoyQm9odGFxVU0wWjBuCisycWQrK3FmbXlaNEk4WjcrTUZxb2hucW8rT21mQ0FHZ0RkcW9qdnFva0xxZ0Q0b1FFZXFobG5xcG1KcXBIQXFpQ0NHaWdQcXBvTnFuCitLWG9RRUxDaWlIcXFxRnFvTWhwb2RycW1XcHFuZXZhbWNOcDRjanFua2xlbnJVcGpaZ3FyUnBhbXVZcGpiTXFyU0NhcnM0cDJ0V3FyCitib2VydnhwanV5cXNRK2FyeTFwandlcXNSVWFzeFdwMng0cXNTYWVzMGVwaXpVcXRRTWFSV3JtWjVGcXU1anFXYVlrUWJDbWE3TnF1CitjWmtRZEJtWThqcXY5RnF2ZnptWUNGR1lrcm12L05xdi9ncVpsSWtRbG5tdUJGdXc1TnFaQnlFQW4rbXVETnV3K0VDYUMrR1JURG14CitGRHVTYW1rUUoybVZHcnV4SEF1VE5va1FPTm1USWp1eUpBdGdQNGtRUVdtVUtydXlMQnYrWVVpSkVCbFdzVEk3czlYbGxBa2JsUjJiCitzenFyc1ZqSnF0MXFZOU1LcmtKbXJkY0tleEtwcldMYWh6K3JxM2dxdEVVR3JVc0xZMEhydEQ5R3RFVXJiTm1LdE1yR3JVdjdyVTRMCit0VkhyWWxOTHRhVmd0VmNMYkZtcnRjakd0VC9ydFVMTGtWSGdBSEk3dDNSYnQzWjd0M2lidDNxN3QzemJ0M0pMQTdlR0FaNHd1SVJiCit1SVo3dUlpYnVJcTd1SXpidUk0N3VLQ1FFSjFBREpSYnVaWjd1WmlidVpxN3VaemJ1Wjc3dVpUYkNRbnhCVlZRdXFaN3VxaWJ1cXE3Cit1cXpidXE3N3VyQmJ1bCtRRUxqZ3Q3Wjd1N2lidTMxN0RxSVJDSS83dThBYnZNTHJ1QmhBV3NaN3ZNaWJ2TXE3dk16YnZNNzd2TkFiCit2ZEk3dmRSYnZkYitlNzNZbTczYXU3M2MyNzNlKzczZ0c3N2lPNzdrVzc3bWU3N29tNzdxeTFWbkJFYmxzUlhObEVHYXdSYTZBUnIwCitLMG56RWhSQ2N4RGx3eFpTY1JkeFlTblJJeFJ3c3I0R2ZNQVBrUUpVeFF0QVlGZERoUmhxUUNTRWhSQ2g4VEJHZE1IdW14NXB0QjNrCitnU0s0VVFjYVl4WEtzc0FJWE1JbVBCQ3FBUnNYcE1GK0VCY1N4VUIwd1JWSk5EbmtaY0ZFZGNQUkpCN2JjVWtGVVV1QUV5c25ITVJCCitURk10N0VWcFVrUlRFVllaVk1FQ2hNRUdaRFYvY3lOMklVT3BvVXRSQk1SQ25NVUhyTUQ5SVJtK2trcUUwa0NUVWNOTmpNTXZIRVZTCitmTVljTmNKYTNNYnFtOEpMSXlsY0RNWjJBUmUzVmhWc2tUSXpzeTBlb3hWNkJEMytpbEV2NXZOVmJsekkzcXNrTVhJeC9hVEdoVVF3CisyRUhHSDRTL1R2RkZEclFWVkl6Q1Z2ekhocnpKM3B0VGxkTy9aSUlZcTNMSEIzVEJURXc2MjJGSDBiSERKT3pEYU16SnNBeSs5dkZECitxSHpHRnlSZENYSEtyeXpKMStFaEdsekpUUU0vdDJFL0lVektzWHpNMTlzOGFTd3p2REl6dVF6SmVKekh6SnkvUUxHL0cxd2lUWFU0CitrWXpNM056TjN2ek40QnpPNGp6T1pwVUNyM1RPcjRUTEg0RkU2UHhLY1VYTzhCelA4anpQOUZ6UDluelArSnpQK3J6UC9OelAvdnpQCitBUDFZdVRQUUJGM1FCbjNRVWV4WHJIUFFETjNRRGszUUNiMVhwZlBRRkYzUkZnMGhqdFV6R3IzUkhOM1JQR1BNWmlVekhqM1NKRjNTCitOd1BTWEFYK3lpYTkwaXhOMGhtOVZYcjFFeWg5VlRLZFdEV05XRU9GMC9LN1Z5T0NXRGQ5V0QvOVYwSHRWemw5V0VXdFdEME4xSm9jCiswa3ZOVlVPOVYwZE4xRHV0VjBudEJaaHcxVmlkMVZxOTFWemQxVjc5MVdBZDFtS04xWUV6MDFiMTB6ZndDbXE5MW16ZDFtNzkxbkFkCisxM0k5MTNSZDEycDlBMldkV0RsOURXUGQxMzc5MTRBOTFsNUFPQy9OZ1dSTFpEMzMxREdORldLb3RsdWIxenJOZVlkTlpMQVcxWWlWCisxUFpJdG9uZDFEVE4ySTVOcDVCdDFNalRqbFJiMlZPZFY1ZzkyWWdYMmtMdDJaOTlxNnd0MVpLdDJrRm0yb1c5ZzdRTlpKdHQxbFgxCiswNDM5MmlvWTIxQTkycmtkcm9UZFdFbk5DS202M015dG44c2czSXNkSHVyK29LblVYZDNXdmFIcUFOMTVsZE9FME56ZS9kM3l5UWpICit6VmlwWGR4THB0MXU1ZHZBVFhub2pWWTVEWVhtN1dPMmpkeVNrZGxVdTlzMjdkcnJ2YTN0ZlZidlRkcGZPOTZMVmQ3bWpkOCtyZC83CitiWHY5WGM3RUhkL3pUZDcxSGQ5bHUrQk9qZUFKbm16TXB0amIzZURtL2VBRExobUVDdDRpbnFxS09pKzhyVTQvWGFuWHZlSXNycW1jCithdUo2ZlIybE91STBmcXFyeWhlbjdWWUVYdHdHcnRUaDhkc1h2bVlaenRsVzlkOFM3dUZJSGVIeDNlT3QvZU5CcnVEYUUrT3ozZUVDCitudVNHWGVBVTN0bE8vdVFZbnVWRnp1SEZqZVNKbGRUcjZyQm1McHB5Q2VNSEhoNzYrcTl1L3VadzNwZ0JxK2FpUFJBS2UrWjREcG9RCitpK1ArdDgwTGpwQUZnQjdvZ2o3b2hGN29objdvaUo3b2lyN29nTzREWHQ3YldPRU5MVHZwbEw2eTN2RG82cFRUQXRBTmpON3BudjdwCitvTDdvamxEbFk2N2tXQjdsYXk1N1hON2xxRjdudlhma3BIN1pwczdqbUg1TzZyM3F4emJrSjM1T1J1N2dzWDVZTzU3YlRPNVh0NDdyCitTbGZyNXRUclZLNGVPWTVXU1QwTWJSRHQwajd0MUY3dDFuN3QySjd0MnI3dDNCN3RkSURzZ2ZUVDhGQUc1Rjd1NW43dTZKN3U2cjd1Cis3Tjd1N3Y3dTVBNFA0TTVIT1EwQkQ5RHQrSjd2K3I3djNENE12LzVYd1U3Ynd5N1JGbTdzZk5qcWY2WHNZZjd2ZmhYd3FqM3cwYTNxCitCdTlwdWk3bHIrN3J6TjduOXUyMEVKOVh4VDd4QjAvbkNRL211UzMrNXJKKzViU084TVJlOENDUFpoVWYyUmUvN0h4TzN3TkJmUlY0Cis4emlmODkwM2ZpcFA4T0ZoZndNWTlFSS85RVFmZ0FYWTgzckYzVHEvOUV5Zjh4ZVk4VFNQMjZjdThpdS81UzB2NVBPK1J3cGY4Z3pQCiswN011N0ZsL1FoOS85UzRmOWlHMDliUnQ4c0QrOVFKdjlpQTA5bVFQZDI0UFBHaXYybW9QOEd6LzhIUC9NM0FmOXdDNTk2WlM5NU45Cis5dzB2R2U0R2M0aWYrSXAvYi8yRzlCNlBGUkRYY1pJLytaUmYrUnYzY1k3dlZ2Vytjb3ZmK1o2UCtESUg5UkNPOG1DZitXalY5MzR2CitaaS92NmpFSTY2TC80YVRmOXFaL1ZxaWYrbTBHK0tBaStJZE4rRjRmKzNvLysweHQ5YmIvOThDZjBpU2Y5bDFQMVpJUkFubmUvRzMrCittZVlhbnQ1WThRMWpVUDNXZi8zWW4vM2F2LzNjMy8zZS8vM2dYLzNmZ1B1Zm91a0w2L3pvTDE4aGtQeW9MUmwvSHVyd0gvL3lqK2lPCitYdnhhUGhDU1h1bjZ2LzhTZHVuMi8rVUF3VXVnZ0c1WkRCNUVtRkRoUW9ZTkhUNkVHTkdnSTRHOFVnQ29tRkhqUm80ZFBYNEVHVkxrCit5SXdBVWxUMFZFcmxTcFl0WGI2RUdWUG1USm8xVlY2cWVBL0FQWkk5ZmY0RTJsTW5UNEZWcGh4Rm1sVHBVcVpOblQ2RkdsWHEwU281Citkd2JGbWxVcnlZczU4ZGtFRzFiczJKcWVLbmJkbWxidDJvb21VWktGRzFmdVRKd0NoN0xGbTNmazNhSlQvZjRGSEZocVZidFg5UjVHCituQkV0cjN0ZjV6NkdETmVzd01XSkxTZDJLekJsWk02ZDZWcitKWHBadEZxK3ZJd0tScDFhOVZQQ2pBMlBocDExY1dQUHRXMnZuR3dSCitZMnplV3pQend1QkorSERpeFkwZlI1NWMrWExtellXREF0MWJ1dERYWDZwY3g1NWQrM2J1M2IxL0J4OWUvUFV2MGFlZkJ6azdrSFAyCis3ZDIvYjQ3aDdHNzA5VUgrdHAvZmRXajk5a3Yzcis4L0FNK3JiRUFDNlRNd1Avd1M3RTFBQm1OejhNSFJJcFR3c2dJckhPMUNER05iCitjRVBMS1BSUUx4QkR4R3RFRXRmUzhNUzhVbFR4TUFCV3VTZEdHV2Vrc1VZYmI4UXhSeDEzNURISFNWNXJVVVFBSnVteFNDT1BSRExKCitHSC9rTDBpOExsSXlTaW1uTkhJVkJKMUVEQUF0dCtTeVN5Ky9CRE5NTWNja3Mwd3ptOFNTTkRQWFpMTk5OOS8wRXMwMHQ3citDRTQ3Cis3OFRUelRrVG83SlBQLytVOFlrOTJYb0NVRU1QUlZMUVFkVzZCbEZISDhWeFVVa25wYlJTU3kvRk5GTk5OK1cwVTA4L0JUVlVVVWNsCit0VlJUVDBVMVZWVlhaYlZWVjErRk5WWlpaNlcxVmx0dnhUVlhYWGZsdGRmRDZyQWdJd3ZxeU9pSmsxekR5a3Rqa09WRldXWXowbWxMCitjUHo0cUVzcVFydG1sVG9BQUNjRlFhUHQ4cFl2ajdXQUNpMnBDRllnYmpXeVVrNWYzNFYzMXhTQXlBaUlWUlRiVGFlTjFBQkNTeUFVCis1UWpJd3RSRlUxK05ET1psV0dvN011d0piUVc5cG81VnJ1RkZEU3FvMEVqZ1p2bGJoWXFGL2FEaTNtWUJVQ09qYmQyTk4yV1ZZMVVECitBRVdmQUdCaFh2ellkbUNOd0ZubGlTZW9XSmJoZ25mKzB4aGhxeFFEeDZQWFlPYkpHSG9yZXFMYmt0Qjh6UUp3QU9ibENXQ2JwZUxZCittYzFGZVdXdnYwWVZuSFJwcnVnYXNmTzlraGRqRkJVNjQ1OEozcWp0WjNtNUJnQ0tBdzdOYXAxSjFtZ1NqTnVDT2pRcUp0a29CWXlICitMRnFnVlpnRXUzSEhVWjFYY2EyTklSTHRqMUpJSE8rNGdYNzc0Q3MxaHJ2cVZhaVZXMmlOWHdzYW81M0FLWm1YT3VydStuSFpaNiswCitaVUhyYUQxeWcrVVd5Tmc2VVBiU1ppOVBLdjF6ZDUwdC91bU5VSDk3cHhST0FubGoycWVuL2xKMC9VajhuanErdFh5alNlb3c1bTZmCitOdzhkMnJTRnJsdDh0eXY2VVEyWVcyZi83L0lCcjJodzd3Ky9SNDJpRjVlK2V2Ly9UOU1rN0hXc09uRXBSbW5EWE96KyttZSsrZG1NCitnV2ZKM1BMNGN4V2xGY3RwOUZ1ZlFJWkZOYXNGNnlxc2U5MENBVGhDRW1Lb2Jxd2ozOXlxeHJlUXBLNkJLbnlXd293V211OEpKR0lUCitxOWpGTXFpOGluVHNZeUdEbStIK0Jyb1NGdEdJOXFGQ0JJZm1HaTRaQTF4Ym1tRUt2OFRFTFMzcmlkT3FGcGVvQUw5c2JhdGJWQk5oCitBOHQxTHNMQnJXVmxKT0lSMWJoR05yYlJqVytFWXh6bE9NZFFwY0FZZDhTak1lQ0hHQXZrRVkvcG9tTWdCVGxJUWhiU2tJZEVaQ0lWCit1VWhHTnRLUmo0UmtKQ1U1U1VwVzBwS1h4R1I5OHJSSlRuWnlTMXBEMVJNOU9VcFNubWxWb2l4bEtsWEpKVmdCd0JqUGcyVXNaVGxMCitXdGJTbHJmRVpTNTFtY3NPbFVvbnE5aGxNSVgrT1V4aUZ2TjU3VHJsaTR5NVRHWTJNNWpHU0p1cWVsbXFhWTdLUktDNjVxZXk2U2tXCituYXFhby9wbXFMYlpxWEZ5cXB5YjZxYXB3aG1xZFdvemphSTZwNmJpbWFsMFVsTnJ5c2hIUHZXNVQzNzIwNS8vQkdoQUJUcFFndW9UCitmdTMwVkdsYzBBS0dOdFNoRDRWb1JDVTZVWXBXMUtJWFphZ0x6Sk9xMGxTaW9COEZhVWhGU3RBb3pLZVZXc3VITzFTNlVwYTIxS1V2CitoV2xNWlRwVG10WlVwYk1JRFVMSitScGk5TUtuUHdWcVVJVTZWS0lXMWFoSFJXcFNmVXFNallieU5TK3dhVlNsT2xXcTF0UUJKbjNWCitiMUphVmE1MjFhc3l4V2xiUUhtcTB2UlVxV2RGYTFyVmlsU21Ga2FCN2d3TlZMODZWN3B5OWFxVWlXYXF0RnIrVjc3MmxhWmhWZGRZCitUVlhXdFJiV3NJYzlhbHYzazh5NCt0V3hqMTNwWFhWejBvcHNGYktYclN0Z215VllYL0lVc1o4RnJXRVZPMDlNbFVhdW1FV3RWeVZiCitUMUw5QmdvdmdHMXNaVHRiMnRiV3RyZkZiVzUxdTF2WUxnRUNZbVZzUld4eERPSVcxN2pIUlc1eWxidGM1amJYdWM4bHJpMmFTdGJYCitHSUszMThWdWRyVzcyeEZnMVZWN1RXMTRxNnBablpyVHM2RkZiM29UTzkzQlBsVzg3NVhxYXZPS0t2REMxNzVnelNsblNVVlk5ZmJYCit2MHRsYjJjYmUxOEN2MVMrbEJXSVpRdThZSGVRVjcvV1BPOS9KUnphMGI1VG5PNWxNSU1QbkZXdEVXRVdId1p4aUVVOFloS1gyTVFuCitSbkdLVmZ6aERBZ0F1S29xVFNoVU1XUCtHdGZZeGpmR2NZNTF2R01lOTlqSE13NUZnUGY3bWlXczJNaEhSbktTVmJ3Sjc3YnFOdzE0CitRNVNsUEdVcVY5bktWOFp5bHJXOFpTNUhtUjR1RG14d0JSSUhPWlRaekdkR2M1clZ2R1kydDluTmI0WnptZU1nWkFpSFJoTmR4bk9lCis5YnhuTHBPZ3lheXFiNFlKN0dBeDg4S3NFMGIwWVN2ODFvUmlXTkFFM3ZCM1Vmcm9BaE1heGhGT2RLYlR1dWhDbjViUzhJMjBreWY5CithZnRhbXFPWTFuU3EyVXBuZURxYTFPSU5OYUMxNW9RYTFOcld0OFoxcm5XOWExNzMydGUvQm5hdFZmRGJNRjg2TkdqWVJiS1Z2V3htCitOOXZaejRaMnRLVTliV29uR3cyc3ZuQm8xaEJzYm5mYjI5OEc5Z0wrdktwQXZ6cTFwblpxYUE2dGFuYitGNVhUeHE2SXA4Mk4ybGlUCitlOVR6UG5kK0M3M3VkdmNicU84KzlZRHhUZTl4Uy9QZUE3OHN1cW1yYm44My9OL1l4cWFyRWY3WWVodThzaFBIck1MYnkzQ0hPeHpnCis2WTQzeGk5YmNiM09HdHduUjNuS2ZUM3NGd2U4SXNpdWRzeGxQbk9hVC92YWJpMzB0bFcrYzU2ZlhOeDRSVEF2RkN6eXZtcGN3QlhoCitkOGZaL2ZHRmg1em9qaVU1ZlEvKzlNenFHOTRDU2JyU1U4MzBqVHVkNm55TnVqZW4vdld2R24zSUhOZDZ1N2wrZElISW0reXFMWGpKCitLd0psUHRmZDduZlA4cGRiRHZJeHg5bnZmd2Q4NE9FOFo1eGZuUmQzeG52aUZWOTNQd09kd3hYeHNKSWxQM25LbjdqRmUyKzZRR1Q4CitZODUzM3ZPZjczR1FDKzl5Z1JUK3VmS25SNzNrbWV4NFNWLzg3WFExZTUyUm52WityLzNzWG44OTNGa3ZhdGZuM3F1eGJ6WGFhYjkxCitpTU1WOTc2dmF0alZPWGJrU3hYNDJaNzk4RlZ0ZTltM3ZmbGRWYjQ5S3pLRVlIVGYrOThIZi9qRlAzN3lsOS84NTBkLzk1VkE3TTBXCitXaFpIZ0gvODVUOS8rdGZmL3ZmSGYvNzF2My80eTZMNGpRNk5FVWkvQVNUQUFqUkE5SE9EdUpPNjNydStxWHEraUJNKzZVczA2Z3UrCis0MnRBbThxKzFtSytDNXlwQnpRK3JKTkE0aHM5dnVNRnQrUEFtY3BBY05yQUU0UXBEd1RBNkF2QkNmeS9uUkk0RnFTcEZCU1ZjclBCCittSEpCR29UQkdKd3dDb1ErNjl2QkcxUkFzZHUrT1ZEQ0pXVENKblRDSjRUQ0tKVENLYVRDS2x6K1FrTEF2SzRUQ0N5WWhpNzB3aThFCit3ekFVd3pFa3d6STB3ek5Fd3k3RWdoazByOUN3Qnl1RXd6aVV3em1zUWlZNHd1Vmp3Q0pzUWFzalBVTURRaGtjd2N3clFUMUV3VHZVCit2Z1FqUlB6S1FyYnp3ejhNUWpiY0ZOTkt4SmpDUVhaYXdVVHN3VGI4UVVmc0x5R0VRQXVjUkpXcVJGRFJ3VkJzTUQ0a3dhempSQXFECitSSG1TT0ZOMGgxSDhsTjlvQW1Xd3hWdkV4VnpVeFYza3hWNzB4VjhFeG1DOFJmRXByMGg4RFJHUWdtUlV4bVZreG1aMHhtZUV4bWlVCit4bW1reG1RVWdWYk1sTklReG0za3htNzBSbUc4QWtQVVFGa3JOQkkweDFOaExSVWtSOE03UnkxTWxYVE13UWRUUjNZVXhIWXNGWGhrCitKM0R3bzMza3gzNzB4My8rQk1pQUZNaUI1TWRpZEVXZUljaUVWTWlGWkVpQzVKcGtRc2lHbE1pSnBFaUJCSWY1T3BXSzFNaU41TWcvCitXaFUxNk1pUUZNbUYzS05UQWNtUlJNbVU3TWRNWXNtV2RNbVhoTW1ZbE1tWnBNbWF0TW1ieE1tYzFNbWQ1TW1lOU1tZkJNcWdGTXFoCitKTXJ6dUpxS0dKWmlPUmJlR1Fua0Fab3VzYUx6NFJJc0FvbVdXWnI1UVNXVFFDWGlzWmFGY2FVSEVvaCtPU2huY1phaU5FdjBpSnlLCitzQmQ4Y2FDSzRCZC9BU01lZWlBWDhoeWtyQU9aNllnNkFSZ2llZzNlRVpvVTJKNlJLYU5uZ1prT0FSSUxPOHZFRkEzYjZaMllxUWlhCis2WjZNd0JtZDRaa29xc3N3Z3FHL1ZLS05BSmFqeE16eThVdmphUlpqQ014bm1RUndPRTMrQ1pKTHhXVE4zaEFiZ1NBYkd6cWJ0aFNJCit0YUhOMVJTZXpnRkx1ckViai9BRGwxbUZxK1RMMEFqTmpLR1luYUNDcFVHWXJLbWJranhNUm12TjZFU1JwUUdtaXFDYzNjRkl6TEhNCit1ZFROSmNJZ2pnak9tWEdaRndMTmFQcExOTW9meHpTWTV1U0ZyTm1oejVUTytNd0x4c1FkeXFBWDdPd0kzd0dlTGhHZUx1SEtGUHBPCit6bHlZT2tEUDhTbU1MdUVKVVRyS3F3RE1RdGtOdnhHSUdsck40WkhQQ3NXTDY4bWV3TVJQN3dFZjlWSE55NlRMM1V5Zmp2aE5MU0xQCitCU3JPSGtvY3d3Z1pnekVYTHNITDU3VFFHYzBMQWFwTzNVQlF1VW1nRnVxY0VQVk9pOWpNSGhJWjhUek80eUZPODBRUWd6R01sdW1LCitFUlVJSUFwUXhLVCswU2tkaVJNcVNXWnBtL2NSQ2JyMFVRZVNJWTZ3R3J3a1VQanNTeVRsenZuQUNNUEpDQW1kSHltbDBqZjlpQ1RpCitDT3hzSWxUYXppV2FJbEdLU21uQlM0MUl5b3pvbUpGaHBlOUVwYWpNaUxxaEZpQXhGMTVBelVOMXpEWU5IamlWMUVtbDFFcTExRXYxCitIenZheHl2Tml6N2FSMERDMUZBVjFWRWwxVkkxMVZORjFWUlYxVlZsMVZaMVZRTnhwbGlWMVZsOUhtZTRCVnJGMVZ6ZEpWUndCbFRRCisxVjhGVmxuaVZWOE4xbUxWMVdFMTFtU2wxVnR3Qm1WMTFsbFZsMVdTMW1tbDFtcTExbXZGMW16VjFtM2wxbTcxMW04TmsyS1RKbWRZCitGVWtBQUVrbzEzTk5WM1JWRldmQVNGRkJDNFBVRkFBZ1YxVXhWM1pObFh0ZDExWCtjVmRXaVZkNXpNRjZ6VmQxdFZlQ0hWaDhSWlYrCitYWlYvZFV0SWNkZysyVXVCVllPSHBkZ29xUWg5dFl1SzFkZ2p1VmlEM2RpUDdaR094VmVRSmRrY3FRaUZyWnFTVlZrYWdSK0dUYkRVCitnOW1ZVGJFTXlDbUI5UVI4d05tYzFkbWQ1ZG1lOWRtZkJkcWdGZHFoeGRsQ0VObUs0QWJRVTlxbFpWb2U0NGFqRlFockFJT3BwZHFxCit0ZHFyeGRxczFkcXQ1ZHF1OWRxcHRRYW81UVhUazlteU5kdFpvSUdUcFk5N1lBV2lkZHUzaGR1NEhkcmNjRm1oZzhXV0lpK2J2WTI5Cis3WXk2NEFXTWJjUlY3RVN4UFkzVk1OekRGWXpXQUZ3VERFWEpRbG5hNE52SW5RdTZCWnBMSk1TOGZRdkoxVnl5OEZ2QVZVWEJSU3pGCitBdHpDUmR6KzBqVmRwMUJjZzJYY1NYVGN0WFdNellWZG02QmNjUjA2V01SY3pZamQzS1dKempYWXp3VmQwU0xjMHhYZTRVV0sxTVhYCisxVTNFMXZVSzNXVmVtSmpkOWhPSWN6Q0Q2YVhlNnJYZTY4WGU3TlhlN2VYZTd2WGU2ZVVDOXFQWGl1QUFBakRmODBYZjlGWGY5V1hmCis5blhmOTRYZitEWGZXaERiOStPLys4WGYvTlZmL2ZNL2dRRGNkMENIQUJiZ0FTYmdBamJnQTBiZ0JGYmdCV2JnQUg0SHNXV0g3NVhnCitDYWJnQ3ZiZUJCUUlsSVdBUDVEZkR2YmdEd2JoK09VQXJDckZVTHhkWHRpTTVsWGhteEJiMy8zZHRSSmRneVZkNHFWaHd6VmVVR3hjCit0VjNlRlY3aDV5M2hTVHpoRk9aaDV1VmRmSFhoRjk2MDRLM2hKVjZOR3liK3dyc1ZSUjIyaTljZFl0MzFZY3ZWd3lDdTR1WXQ0azFFCitZa1ZUWWlZVzQ4Qnc0a0dFNGlqT1lOZmRZdWE5NGp5MDNack4zRFdPM1M0R3dTOEdyUmpHMXhrZTR6MkdpakpHWGtKVTNpbVc0OXh0CitZNEVZQWpwRTVFUldaQ3JFUW5VUjJCL1Fna2lXNUVtbTVFcTI1RXZHNUV6VzVFM201RWlHQmJIbHdqUVU1VkVtNVZJK3d6WDBYNE0xCitCM0pnNVZaMjVWZUc1VmlXNVZtbTVWcTI1VnRtWlhNUTJ6ZGM1RjcyWlVTMnd6U3VDRUxvNUdJMjVtTkc1azcrQVJMRzRpTFU0a0dHCitYVG9PWERzRzQxVE9ZejdHNXFqdzR6TkdZMTU0WENxRzVzZ3RaTHZsNW1jT1o4bVY1aU9tNWxXejVvclE0MnlHWjZvUTJ6L1d3MEJtCitESEQrUHVmYkdPZmFOVVZ6enVlOVRlZDFEdDB3anVlQ25vSnQ1bVo3aHR4LzN0dDk1dVpUYkF1OVpXaUFibUdCcnVhL2xXR0QxbWlFCitQbU9GeHVlSjVveHg1cjRESk9tU051bnlXNytJcm9oaGFJT1dkdW1YaHVtWWx1bVpwdW1hdHVtYnh1bVdwb1A2M2QrZTl1bWZ6ci8rCit4V2g4aFljeU1PcWpSdXFrVnVxbFp1cW1kdXFuaHVxb05tcDRFRnNCUE9tcnhtcVN4bUJ2cGc4SWVJQ2NCdXV3RnV1eHh1bGhZR1kzCis3bWM0eGwyUXRvMkF0dWpDd21OMzFtaUQ1bWdvOW1pMnRnMkhMbWUxUm1HOHJnMjNmbXUxaXV1K21PdDRydXU3dld1LzdneTlQbU4vCitWdXpIQU96QVJxdkJObzNDTnV4NWZ1akVmbXpJR09mSU85dlBUcjMreTNQa2luQUZQakR0MDBidDFGYnQxV2J0MW5idDE0YnQyRGJ0CitaaERield2YTI4WnQwQk85b2E0SU1mamEzd2J1NEJadXJ4VURzU1ZiMEVidXlWczlycTRJQVdnRTJZYnU2SmJ1Nlk1dFZ6aHJnYUM3Cit4ZFB1N2M0N01Hc1dnVlVBdVJYdjhTYnZvRFhhZHU0N3dWUHY5V2J2TmlNODNoWUljVGlEK2FidityYnYrOGJ2L05idi9lYnYvdmJ2CisrUllIc1VVODdpYndBbitEeG1QdWdXamI4bWJ3QmhkdkJiaHVjbTVzdmhiaXpaYUx5SlpzcGFMc2Q3WnNKajVzV05Sc0M1Y0x4b1ppCit4eFp4enEzb0RKOXNndTd3TWY1d1V3enhFeWNMRXI5YkU1ZnhzTUJ3RlY4djlLN3NGdWZqRjg5aFlSYmtHNWVNQ0tlMW5rUHlKRi8rCitPZkVWMkFFQWdTZUg4aWlYOGltbjhpcTM4aXZIOGl6WDhpZVBBYkdGdVpvRDh6QVhjMmk3T2ZqbWhYVkloelJYOHpWbjh6WjM4emVICis4emlYOHptbjh6UmZCN0hWT1NYWDh6MnZnWjlMY0Y2QUFEM1k4a0VuOUVJM2RDMGZnQWpuWnhPbWNDS0hpeHpYY1hkamNSOWZZaUJuCitYU20rWjBlZmNVVi9hQnZYOU0vZ2NYV085RjdZY0VyZlkwdFBYa3hmNkUrWFhVN2ZhNVZlYTFhM0NVZ2ZkYUVxZFZNWFkxUUhaRlgvCithRmwzWGxlZmNGanZhMSt2Q1ZxdjlZZmpjUTdIOWRQVjlYcm1kV0l2aXdndkFqNm5kaVZ2NU8rdUNFWTQ5RzNuOW03SDhtVVEyM29ZCis4M0VuOXpDdkI3RlZoenBYOTNWbjkzYW5jM1hBODJxWDk1Mys4M09VSlFSdngvZDg3M1pHQVBZU2IzUm9CM1V6Ri9WSXYvVmxyK0ZtCitMOElZQjNpWG9QRTNGdllLWC9pV01QWmpCN0JrTi9oS3greUVmdmFJLzNYSCsyRk0vSGVPZDRtSnAvaUN2L2poUmZnZFZIaVJMNFZ4Cit6bTREaDNuRjA3dlJGb2p3ZHZDYngzbnpGbHN5YSsrZTkzbjFmbS9BbGUvL0p2cWlOL3FqNys4QTUvRUJqL21tdHpzRVIxa0JXUENjCitwL3FxeHdjSTkvZ09TKzZ0bHp6UnhuYUJLRzNxRnZ1eEozdlhwbTBldCszY1Z2dTExN0hkQmx6Zkh1NjRsL3U1MzlyaTV2SGo1dnE4CitUN0hsanZybkx2dS9CM3l4dCs2c1IydEdmM2lXSC9rVXAzaWlNdm1UWi9hTTcraU5SM3pjNlBjYUQvbkpMd1dTUC9iR2QveiswazE1CitHMXg1a1cvNHRENTh6R2ZoVUY5OFNiZjR6aGZlejJmQjBPZjRjYTZFN2FMOTJyZjkzRm9Ddmc2RVMrRDkzdmY5M3dmKzRCZis0U2YrCis0amYrNCtkOUt3RGxUR0QrNW5mKzU0Zis2SmYrNmFmKzZyZis2MmQrVkRaekZtQ0Q3dmYrN3dmLzhCZi84U2YvOGpmLzgwZi83bWNCCitzYld1MjNmLzk2ZDlYRkQxUWtEKytyZi8rOGYvNHcrRUNOY3JnVVVWd0FVSVhnSUhFaXhvOENEQ2hBb1hNbXg0VUJJQVNRNG5VcXhvCis4YUpBaUJJeGN1em8wYUV6QUI5SGtpeVpRaVF2QUNsS3NteHBFWUF6bHpKbkl0Ukk4K1pObXpoM3R0VEo4K2ZIa0VDSGVqd3BVQ1hSCitwQmRoS20zcTBLZlRxQThqU3ExcUVLclZxa0t6Y2pYK21uTFZ2YkJpeDVJdGEvWXMyclJxMTdKVkN5QmEyN2h5NTlLdEc3WVZnRloyCis5L0x0R3hldlhyK0NCd3NHVFBndzRyblJBQ1J1N0JqdEtwUUFKbE91YlBreTVzeWFOM1B1N1BrejZOQ2lSNU11YmZvMDZ0U3FWN051Cis3Zm8xN05peVo3OFcrUGcyN3JDU0lPVHVmVmlBSkFHK2gvc0ZMcHc0OHJyR2t6T1hDMEZTOCtoeHVWS3ZidjA2OXV6YXQzUHY3djA3CisrUERpeDVNdmIvNDgrdlRxMTdOdjcvNDkvUGp5NTlPdmIvOCsvdno2OS9QdjcvOC9nQUVLT0NDQkJScDRJSUlKS3JnZ2d3MDYrQ0NFCitFVW80SVlVVlduZ2hoaGxxMk4wVEZ2Qml6RUlnSm1TTU1TbFFvVWFJYW9oSTBJb2ZidmdpakRHaWx3S0lJRjVEaFRIK0p4YlVva0UxCitOc1RqUUMwQ0tTT1JSUnFwMUNRZStySFNrajVhNEFjdjEvQllJb25YdVBqaE5lQ2tvT1UxSnVxWVFnb2U4ckpsbDd4WVFBVVZIb0xvCitCNDdnQ0RUa2tYSEtPYWRIMXdEQnl5clhQT0ZqaTB2dWVBOHY5Nnh5SlorOHFISG5qUitpR0tTTFZEekJDemg3OHVMb0UzWFFlU21tCittVnJrSXhCVyttZ29FQ3Z0eUtpSWhWcFFvbEZUWXFubGx2ZDhDcWVtc2NwNjZTU3JxRWxpSGFjR3VzcWpQUUlxNktTR0ZxckdTaDFlCitTZXFWa3pUNlJLV3pPdnNzbmRjQTBPdWJMcTZDWTRrRmdVbmlvOWVDNmFLSVhrSlphclVnbmtuRlNtdmllT2V4MExyN0xyenh5anN2Cit2UXgxQ1NhWVZ0YTdMNy85K3ZzdndBRUxQREQrd1FVYmZERENDU3U4TU1NTk8vd3d4QkZMUEhGMVZPaHJnYks4R051dVFpU1NxT2FICitIcWZMSW9ub0hsUkh5WXQ2dVpLS3hxQk01Y3RLNGtqRnVJTUt0QXFzQ0lVcGtKMERpWmt6eVNTT3pNdkx4cWhZVU5IVUJ1a3lpU2l1CisvR2JKWWxMMGhKczNMMm9zMEFRVmpXS05JcmZyc2NrR3ZhemptR2l1ZENyVDI4WmNkdGpHMkl4bjF0cUsyYk5BUHp2a2NiWmRlL3gxCit5YUlTMVBMTHZMQ1pJNVFoNTdqbzFGWGp1V2poY1F1MHRZaEZnenhRMGlmbktPcmdOSnVKSzVWTUc4MjJxRzRQaEhORkZ0ZWRzWm5WCisvdWd4eUhoL0N2WGxCcUdOTXBNekZ6NDI0aGROa25HbkF0R29lcFF6NXc1OHVhTXllclBVeDB1NnM1bCtDem4rMEQxQVBQb0VFSzRxCitEbzdqQXgwcVVKSzJvZFNpbDhrVFR5aUx4Z043MElyTVd6QjBzQllCc1NnVkEvM2U0bzJIOXppcXFzZmpLZjZWeTR1NXZ2Nk9wYjUwCitYUzk3QXRrZUw3bzNKbklOQkFobzRwK3E4Z2M4V3lGRVJOR2JYdld1UkxlS3ZFOGc4VFBVOXdoeUQrSGQ3M2dTdk5MNWpCZS9DMm9zCitnOFJMMy84SU9CRHNWV1IzQXVuZEFvRlhQN0tWcjN3blhCRUYwV2NiNmJVUVVDTGE0RVVTUlRXQk5BbDRUNG9Ta0NKb1BCMnlxNGRQCitZTit4bm5jemZVVUpaNnVBa2g5SVY1RklUY3BLMUdQZ3pUeFlRaFAyVUg5d1d0SHpWdlRCaWdBd2pFeWNIMEdlS0tVMUZxK054MEtpCis2cTc0dFFEQzBZZGZGSndZS1VKRzB4SCtDNDNFRW9qaUFnaXVLZjZ4aXNiTDAwQ3VNYWdqV25JaWRiU1pHTUdISWtBT2ttTmE1SmpxCitRSVJKbnIzdGxIRThaQmdOR0R5TlZhMlJUb1RTSGlrNVNUK3VpSlNxVzJVWE5kaEppMWpNVDVKQzQwRDh0S085Z1l0MXBSd2YwWEJsCit4RGE2Y3BscUdCUllaRGttQ3p6aGd5azRHaW9sdGN5bVhhbG9wcFNrRzMwWXRZc3NNUVZRT2lZcUJlYzN5Z210WE00OEpTcGZWb2RwCitwck9mNWJvbW5seGxrVEIxODRiaUJCSXA4Y1kxdytXTmx4VWNuOTdBTVR5SHRCTktrL0FETXBNNXo4ZlZNM0llVzZnL3RaWWpjT1F5CitwSVVrRlVDelNjeHJLRk42R1pWbmo1aXB0NFlTOHFIbnhKMUhkcmNLRlBVT21ZZmFLRVRQcWIrRUNxVCtvTlhVSHpBMUNhTDR4VStiCitoOEpZb0liV29pdW1RR2xCZlNidzNsaFRiUnJrZlIvc0tjZCtLa1FmVXJLWHd4U1JVYW1wVm1ReE5aNExlYXF5VXNEUHFhNkNWM3pjCitaVTE1TnN4ZmNsR1RicVdJVjF0SVBoR3VBcWlsL0NFNnIzU29wTFp5cmNWcnF6WjE2clM1L2kxVVkwV1dRL1ZxVThiKzFTSjIrcURICitjblVzUVZsVmtxOTc0ZWdneUtnQjVqVlFSS1NlUUZOUTJNNG1oQXE5bTkxcE8zalpWUG9SaFcrYkltdTVXaEFMMUJWMnVXb1JhVzJLCisyZFlHVWEyc1JhM3ZZdWdpMldKeElyYTFFbzFjeHI0OWNWR1hwMzFtYzgzMzJnd0tONC9GQlp6UldnUkE1UTQycnltMFl2WEdDeWpvCitick51STZNdWJRL3lXZC9oaW4zK3lkMHRYdWtiM2g2eUVMYjVCZXhHUFVxaWE5WFR1d3hORit2QVpsakorYzVzbVdXaTdWd2tMVS9wCitibzZxSzVvQXpPbmdhRFlOYnl1cDNHNmZkbUNHMUtGd3BCSVpnN1BsWUJPVE9MMTlzOXpIS2h3MitvS3VXaHRlY1VFbTRlRnlldXdFCisyQ1BSWFdjNjArekdUcm1aYTl4SVd0eERFeDlaeHBtbDhOWlFqTFNQQ2k3RHJlMnhoZ0hBWWZjbG1LTUx4aFpRSTRnM2hxS3R5WmQ5CitNalFwSnVjNXkraGUrT291Ui9BRnB2bXFaMzM0NHQ5Ri9Bd21RR2ZGenZuNmlLRlRnT2Z6NkZtdUl4RTA4NjV6ajBhUEpOR0xOaytqCisrZHlSVE5PNTA1NytOS2hETGVwUms3clVwajQxcWxPdDZsV3p1dFd1ZmpXc1k5MXEwZnJNVWdQK0VXU2dVTElVeTREb0hwTGhkYTROCis0bXZLZ01QRkIvRjFycFBIbUdGYlppV1g2YlZsTkpjU1RXdk4xcmRlUlIwQVVJZXFIdVV5M2FZTUR2a0loTjlLSzNkK1l3eEdtRTJaCitZS2ZFMjlNdWlMcUxyUkJrcHdTNUlzRU1pRER6N2NuSW05MWRCY0R3WERVWjNhcDdNcitxVEw4UkVtMUFuZVF5MUpaMVZGSmd5WEVUCit4Q3YwcnV6QVN6c1FkTU5iTWcrL09QUjBiUUVwSXdUWnZxNER0VGgrRkUyclBPUVZSL203RGVLSHliaTRtNzFUZzIxWGZoQ09Qd0hiCitwWDFrTXEyZHdFaDZKZWJYempZUGhhMXJseHVkSUMzMzk4aU4zZkZ1b3c3a0xYKzZ6bjBIYzVEZmVqTHpWQU1BbEhYRnJTK2Q2V1lpCisrYzduMjNPWWV3L2kxZ0grZTYrZUFBQVgreUhiYlM4SU9IalZUVmhobmQ1OUw3dS94eFRKcWZ2YXlsZG4rY2ZMam02czgyTGNGUGRkCitKTUZ1SmNhMzNNb0RtUVMxMGI3amU5Zzk2Nk16bmM5TERuaS9QN3pwZ2Q5U1F2enVzbDVaSGZGcGQvckJEeklKY015ZVJmTk1VK0ROCitMdmlFcUZ6dWZPYTYyNjBDRGpIVlBaUERSd253amNGNndHODg4WjdYL2QxNUptYlI1eHJzaXpvODdKVmVrT2xqWGU1K0dQbEFxSUE2CisyenlLOHBxMndPQlJXVnlOQWJ5b3ROZjEweDM5ZkJHTzN1T3ZwejlCZm54c2orYzg4TmczeU5XaENQQk5pcUsxSC92bGpocFl5UUNDCituUDRCSUo5VkNyVU1ZUEJGSEx2TTFwdGdIdkl4bi95a1gvTnBuK25sWHU0eFhyQWgyKy8rTk4zLzRaLzhaQXpXZ1ovM3pWOEhPaUFLCitadEp2TVpHdG5Zbjh5Qlg4bFo3M1hCb0lrdDc5UVo4SWtoN1lRVW5yWlI4TStvN05BRis1RVdEMFRaMEh2dUFSOXB5eFNlQUVOZ1hjCitFWTNLM0FtOVNlRFk2V0M3VmNiZFhjWktBQi9YQmFGSUlCdlZlTWdKZmlGbGpLRmwwQnJXV1ZianNZc0lQdHZ6Y2QxRm5ReVVBRUhHCitqSkMvaWVESWpWL0hWVWJzc2VGa2lNalRsYUVPK21BS29Gd1JiaHl3R1NKU2dLQ1FjWSt0U1dEQlplRDI2YUFkUWw4VlNrV2ErRUhWCitjTjZqYkNIelRRTEs4S0FMK3FBVHhtQ1VUTi8rc1JzcHJ1SGZFY1FxVk0zVHlaMWxQSXI0RFJlZ21GOGVEZDVlalFtdlRGK2xGT0lICiszZ000Z0lNWDlxRCsvUjJoN2pXZ0UzSWNGWURGMHEwaEZGckE5QUVmRlZnR0xobWdiWGpJQWk2ZE5CcGhBb0VqRlg1aVVrekN1SWxLCit3eEVpOExVS1E5UmlNdFpmeFhGZzIxMWNxTkNpOHpIZDA2RmYxM2tJNm5VZGxBQmprTXdUOVNDRUd1VEtCMldpczFFYjV3bGlMRTVqCis2U1hpMGcza1JISWMyQldkQ1ZhazYzRmRBMWJqbTh5VFpZM2pQZktlNnpXaE9rYUZ0RWlVQjNLZDNFM1VEL3BqUDhaZzFLWGVHZXBhCitwZkRqRTdMYjAxa2VFTnlKelZuSmpYeVFRYTZkMGxnQW9VRUs3VDNoMC9VaVE1RGhNMjVpSzk0azlSbGR3NW5qQjNaazdwa0lRYUNpCis5MHpDbzZDaUFqTGZ4Vm5sRDRLbEo2NWtVMUFCQjVwaVpSaERKcUtrQitwYndVSCtHN0ZKSGVFdDNTVFFvcmN4NE54SklnU0FvNWxNCitpOFpnbTdiWmxTUXVYbVdFbTBFbHhFa3Myc1Y1bThOZEpRcGl4aTlhUnE3bDVieE41YVJjSTh0VlpzdHB5V2EyWVZObVVtQUdTamNDCitBTUdKWVdrQ1FNTHRYR1VrWFRxeXBXM2VKbTdtcG03dVpwNjVEam5oUkp2aHpWSlNTSEE2RTA2MGpPc1lGbnNVWjQ3eHBuTStKM1JHCitwM1JPSjNWV3AzVmVKM1ptcDNadTU0RDRwbmQrSjNpR3AzaU9KM21XcDNuS3BIOGdwM211SjN1MnAzdXlKM3IyQjNPK0ozM1dwMzJTCitwNExBNW4zdUozL3laemMyNDM3NEdyYjBKNEVXcUhuK1o0R2NoSUV1S0lPQ0p6aG9vSUJNNG9ENEdvRHFCNFVXeUlVU0NFY0t5SVlXCitpSVFLU0liK1RxZ0k5a2VJY2lpRTlrZUhFc2lIQmtpSnN1aUk4a2VMQWtpSy9zZU1ScWpmZUFFbTVLaU83aWlQOXFpUC9paVFCcW1RCitEaW1SNm1qSVZXaCtoT2dOdkFLVE5xbVRQaW1VUnFtVVRpbVZWcW1WWGltVDNzQ1JKcWl1WFVPUmZpbVlocW1ZRnFrWHlNK0pBb2lFCitla0lwckNtYnRxbWJ2aW1jeHFtY3ppbWQxcW1kcnVrbGJDbUJoR2dWVElHZi9pbWdCcXFnRGlxaEZxcWhIaXFpSnFxZlZvR2VEa2pSCiszUU0rM0tta1RpcWxWcXFkZW9LWjVxZmZxS21sZHFxbmZ1cWM1cW4zSUNsKzhLbWluaXFxcHFxcUppcWpqaXFYUWsra2dxcXN6bXFuCitZcXJ2bk9sL3BDbXQ3aXF2MXFtbzVocXAzb2VwcmlxeEZxdXhHbXFyQXV2K3E5cEdyUGFxc3o1cktkanFtT0NxZitncXRGN3JydjVxCitqUDdIc0I2cnQzN3JxaWJydHZySG96WXJ0cDZycDBwcmpRYUloTnBBTXJ3cnZNYXJ2TTRydmRhcnZkNHJ2dWFydnI3ckF6UXFpS3JjCitGb1NEd0E0c3dSYXN3UjRzd2lhc3dpNHN3emFzd0c2QnZ3WkkwUkhDdmxhc3hWNHN4dTZyRFdScWdraW9BN2dEeUlhc3lJNHN5WmFzCit5WjRzeXFhc3lxNHN5TDVBeEFKSWlCSkRMOHdzemRhc3pkNHN6dWFzenU0c3ovYXN6ODRzTWJ3c2plcmFQY3dDeXg0dDBpYXQwcTZzCitBM0FzZ25qczBrYXQxRTV0eXJxc3ErNnB5c25zejI0dDEzYXQxL1pzMEY2dG94S3QwVkt0Mlo1dDFEYnRyV3JxUUh3czJyNHQzRmF0CiswUHIrUjh4K3JkM2VMZDd5Yk5ncXE0YVNiZHorTGVDR3JOcE9LOXNLaE5zR0x1S2lyZFh5cllqeW1kYm1MZVJHN3RmdTdiaWlxTjhtCitMdVpTN2VDdUs1cjZEUXFVQU9pR3J1aU9MdW1XcnVtZUx1cW1ydXF1THVoK3d0eVNxTXJSQWh2TUx1M1dydTNlTHU3bXJ1N3VMdS8yCitydS9PTGkyOExuOFVIUVN3cnZFZUwvSW1MK3VpZ05NZWlMV2lLL1JXcXJhK2FJQ3FYSitDSy9abTc2R0tLL1hxUjdsR0wvaE9xcnBTCithMzg4Yi9pZXI1eE9iN0RhUjdkcXIvdStML2V1YjMxOEwvcldMNXlPYitIeUFxZmFMLy9pcWZCV0w1OWQ3L3NPY1BiRzc3SUdpcm4yCitiLzNpYjhkNnJ2SStNQVJIY09xNnJ0aitLNTlSUXc1a3NBWnZNQWYrZDdBSGZ6QUloN0FJanpBSlp6QTEvSy8zNmxyeFNqQUx0ekFFCitNKy9hTm5EYlppNE5SKzNpVmk2TVpxM2s3akFQZ3kwSzU4ZWpsbTBORHpITGJpNzU4Z2ZVRXJFU3kyMEZ1NmpqOWpBVVJ6SE5VbTczCitBdkhsTGpFV2s2d1I1Ky9oWnJFWHU4TU5WM0dwNnJBVWwvRU9VN0g4MGtjUWZ6RWJiN0VNR3k0YmYzRVlwL0Y4MUswWjMzSGVvdkVCCitGMjBjZTdFYlA2M2ZoSUVKRERJaEY3SWhIeklpSjdJaUx6SWpON0lqRDNJZi9QQVk4MW5BT3F3bFh6SW1aekxEUW13VHk2aXVFY0lqCitoN0lvanpJcFAzSVlOSytCbUs4Q282LzZZcWoxRWpBc2c2c0I5eTJzcmpML01qQWdEOFQrMnZMNXRqTFdCbkFzQjdPeHp2TFkxakwrCitMNk12TGp2dnBoNHpLMHV5c0w2eU1FZHpxaEt6aVJvek00TnZNcWZ5TWw4eitQcHk0dzZFQUV1ek9HK3ZNOXNIL1hJejlHYXpoL3JOCitOcENDTzc4elBNZXpQTTh6UGRlelBkOHpQdWV6TzdORE9kZEhpRDZDREFTMFFBODBRUmUwUVI4MFFpZTBRaTgwUXdmMEkvU3pHcXN3CitHZWd6UlZlMFJWOTBQbThES3EvekRQY3hGcyt4S3o4eEhvLzA1RUwwZkt5eFJ5L3hIeXR6UjZjMEVZUDBMdy9FNDVJMFRmdXNIdE95CitiUWl4Uzlmd1NtdHpTKzgwRGNQME53dkVUTmUwVWVmc1RSZHpUZ1AxRVBjMFJ3dkVLY3lDVkU4MVZWZTFWVjgxVm1lMVZtODFWM2UxCitWQytCU2N0SGlGS0FLcFMxV1o4MVdxZTFXcTgxVzdlMVc3LytOVnlYTlFXRWRYd1VuUUJrZ0ZmbnRWN3ZOVjkzOVNsc3RJcjZqU05rCitBV0VYdG1FZk5tSW50bUl2Tm1NM3RtTS9ObUg3QUYzRFI0aUt3eGxjTm1abnRtWnZObWQzdG1kL05taUh0bWhmdGpoTTludllkVGRBCit0bXF2Tm11MzltTTdBbUFQaUNxajg3VjZzd1dEOHpqbk5yS2F0bnVjTTIxanF6b0h0aTcvTnJyYXRoUGp0bTRuZDZCU3M4UVNiUUlUCit0N01HdDJ4dk0zUkRxM0hETERRcnQzWXp0eWRiYzNWSGQyemI2RUNnUUJDVXQzbWZOM3FudDNxdk4zdTN0M3UvTjN5WE53VXo3bTBMCit4QXhFQUg3bnQzN3ZOMy8zdDMvL040QUh1SUFQT0g3UEFHKzNCL0dPUW53dk9JTTN1SVBETnd3VDdodnpRaGN6ZGVJS2RYMys4MEpSCitIeldIVC9HQnN3ZEtXemptT3JWd3c3R0lZeTZHSHpkUmR6aUwxMnhTVi9OU24zamlrdmgwLzdTTS8yMktZN2RJdHppTHYzaHpRNDlPCiszM2pjMHJoNG03aVE0L2lIcjRjZDgzaUgrM2gzeC9pUkQzbDRzNnZmUEVNWVhEbVdaN21XYnptWGQ3bVhmem1ZaDdtWVg3a09KTGw2CitoR2cxL0lLYXJ6bWJ0N21idnptY3g3bWN6em1kMTdtYVY0T1pwOGZFamptZjk3bWYvL21ZUDhPVWQrNXdmL2V6WGplM1pyZDJKemQzCitENjEzRy9xdVNuZVI2eStrT3l1aTA2MmlMM3B1TnpxNU9uZWw5NnFrVTNtaGZ6cXRYanJzQXJPbU0zcWV6NGlua3pxdGhqcWhDOFF1Cit1L3FubW5vT28zcXFiL3FxTTFxcjB6cW93bnF1c2pQK1JnODdzUmY3UGZOekp5YzZud0YwUXplN3N6ODd0Qy8wUXlkN3B3OEVCRXkwCitzV2U3dGcrN1JzZHdMaHQ1bEw5dGppdTdURE41ais4NnBsMXh1S010a1lzNnVLKzcyWTQ3cHUrNHVSdTFrenM2bE1PNzJiWjdyRk80Cit2aXN1dXBmSGt0ZDdUZDk3dGVmN3Ywc3R2d2Y3UUVSMVh6ODh4RWU4Vm9NMXRaLzZRRlJBWEdlOHhtODh4OE4xQlFROGVkZzFYa3M4Cit5WmY4dy8rMXQ3TzBRQXkyYTdlOHk3ODhZMHQyeGQvNlFGajJhTjg4enVlOHpvZDJhYy84ZnFBMnpBZTkwTHM4YktlOFQ4dTZyOHVxCityUU13Y3VmNk9ITzY1VDU2MGxjcXNGY3JkVSs5cFM2OWhXYTYwd3N6MUE5dnIyTTkxUTg2d3lPOTJHYzl5STlIKzNiK3ZkZW52WGo0Cis5dGxMYXRXWHI5LzR3Z0hjUGQ3bnZkN3ZQZC8zdmQvL1BlQUh2dURmUFRhNGZYaUVhRFlnZ2VJdlB1TTN2dU0vUHVSSHZ1UlBQdVZYCit2dUpuZytHREIvRU9QdWQzdnVkLy91RDdBdGxidlkwbi9OTEt1OFd2T01IYmUrWi9SNGliZnRxT1B0MlhQdXdqTGVyVHZPcXZQazBiCitmTlFqZk8wajdjS1QvcnYvL3RIZVB0UG52dTZQTk8rRFBaQVQvOUlHLyt3UHYvT3JyUEZ2UGIwbi94MHYvOCtyKy9RenJld2pzZDhrCitBdWlQUC9tWFArQVh2czliLzBCb2crVzN2L3UvUC94WHZqYTB2bmRNclBuZlAvNlhmeUo4LzM3TWR0ejdLa0R3RW5nUHdEMkJCeEVtCitWTGlRWVVPSER5RkdmRWpRb01BcVV6Qm0xTGora1dOSGp4OUJoaFE1RW1PVmd4UWxwbFM1a21WTGdTa0FuTVJYaW1aTm16ZHg1dFM1CitrMmRQbno5cGVqb0kwMlZSbzBkZEFraHgwQk5RcDAraFJ2MTU2V1JCcEZleFlrVnBrV1JYcjEvQmpqUTUwR3BXczJkVkVoMDRVMnBiCit0Mjk1Q24wWkUyMWR1eENWTW9XN2w2OWJxbVFyM2hWc2R5dXZpMkVSSjFZTWNpeXZ3b01oWjFYcm1HMWZ5NWZqRHFVYm1mUFp2QUlkCitaUkU5bW5ScDA2ZFJwMWE5bW5WcjBUNnFCdTQ4dTJWaGNXZHc1OWE5bTNkdjM3K0JCeGMrSExlNDJMU1JzNXdzb0p0cjU4K2hSMi90CitTSE55NnkwLzh6bzFpM3QzNzkvQmh4Yy9ubng1OCtlNUx6bCtuWDNEd2hWVXhaYy9uMzU5Ky9meDU5ZS9uMy8rL0FycjJ3c1FvZVV5CitRTS9BQXhGTThMeFRxaFBRUVlXeWM4Q2RDU21zME1JTE1jeFF3dzA1N05ERENWOEE4TUgyQ2lPbWx4TlJURkhGRlZsczBjVVhZWXhSCit4aE9KRVhIRTZ5YTdaNVlQZWV6Unh4ODlkS0RCR3grTUVNZ2prVXlTd3hBQkk1TEVzbmd4Y2NZcHFhelN5aGhyYk5KSkhEZlRVY2t2Cit3VVJTeUxtMmRORElNTkZNYzBrYnkreXN4Q3ZoakZOT0dMTjBETW8yWjh0eFJ6WDU3SFBDTVhtWkRFL3JzanZraFVNUlRWVFJSUmx0CisxTkZISVkxVTBrTU5ZWFBRd1FyTEpwTk5PZTNVMDA5QkRWWFVVVWt0MWRSTnM3SDAwcnNtZzJDSlNXR05WZFpaSlQxa3lGVnB5NjRwCit6SGp0bGFhLzdKUU5WOEVLTzJ5eFk1SCtEYXV4eDRabHRjdktmSTJXTDdrQzNheFp6blNWVnR1OWdHWDJXclNLVFZiY2NVVmE5czV2CiswY29SMm0zWmZZcGFRZEVWTE50MjZYV3EyM1BqelNwY2N2bnR0eVJWOHoxSzNYb0o5dWxkYXdPdWE5NkNHY2JwWG1FVFJtcGZmeWxPCisxbHlJSXpacTRJWTVydW5nak8zSzdwa3dTQzdaNUpOUlRsbmxsVmx1MmVXWFNkWUJZSkJYS3F5YVgzRE9XZWVkZWU3WjU1K0JEbHJvCitvWEd1Wm1hYVU1cU1FSmlaYnRycHAyRis1bGFrcnpyVHo2dkRaREpZcW85NmM4NnZ3WWF6VG0rNVRxdkxQYkZPTzBsQTRTMjdLS3ZWCitqdHRIcmNsMk95S3Z3ODViN3hmSHh0ZnVpUFNVVy9BZTJVYjRiNWJnSGx6eERPbjIrM0NIOE41YjhzbisrOGI0OFlZQ1gxeHpEQXUvCitQS21sQkpKdzg5RXBiTnh5enhXS2ZQTFZ3NjRjZGNEUEpsMzJ6bDlYS2JzbWxNbGQ5OTE1NzkzMzM0RVBYdmpoaWRmOTZOb0xFMEdLCis1Wmx2M3Zubm9ZOWUrdW1wcjk3NjVVVTQvdlhKcmluZSsrL0JENy80SnFhdS9hSHN6RitvN3ZTM1psOTl4OWx2MjMweTUzY0kvZnJiCit4MTlML2ZQWFgvNzUvNmUvKzlWdmZla3JvUGtPV0xzQXhzOXcvT01GQU1CaERBbE9rSUlWdE9BRk1aaEJEVzZRZ3gzVUlCWGdaMEFBCitVTUdESlRUaENWR1lRZ21DOEhUcGc0a0tZUmhER1pvUUhBM2szd3h4bUVNZFRsQU5EdVNGR25ZWVJDR2lzSWNPdE1BUWtaakVEUHFRCitpVTEwNGhPaEdFVXBUcEdLVmJUKzRoV3htRVV0YnBHTFhmVGlGOEVZUmpHT2tZeGxOT01aMFpoR05hNlJqVzEwNHh2aEdFYzV6cEdPCitkYlRqSGZHWVJ6M3VrWTk5OU9NZkFSbElRUTZTa0lVMDVDRVJ5UXNnckFJaDF3QkFFVjl5a0JCQ0RnQ1Z0S1NkQkdKSlRXWlNXQVN4CitKRGo4UU1sTUdnTWhCSG1nSml0SlNsUldNcE9hQkNWWkdBS0VSeWJrSHNhb0pCQ0s2RWxOR2tTWEVBd2xRMkN5eW52MDhwVUtVUU1qCit6OWZDaEZobGtpc3B5Qk9NOFlSRVR2TXVmcWdEUWlZQmpnRnQ1bHhQV0VVZFJnakoxQm5PbEEvRTJMbkt5UXNMMU9HWDcydmxKS3FDCitrRHY1RFVvcHFJTTAwNG1RSjFRU2RBSlJBd0RnK1FSNzRyT0I2VnhuT3htU3ozVENSSm9KTVliK09JRjVqWlJZSlFVU3pZcFZMSUJNCithbTdVTE93OENCWDZlUTl3U2xKWXE2Q0NSTC9aMEhHdTFKd0xRYWUxVXFETmhOSUZBTWE0Snl4SktzOXp5c1lxK1R4SU5yT0pFR1AwCitreGRVc0FBbVdmb1NtYnJIV3ZrOGx4cVdlbEZsSnNVZ1Q2aURSVG1hMWFPc0FwbjdMT0lUd0RFSmJnb3JCWUZ4bkUrUlNzOU9Xc3VSCitXS1VsVGU5QkJTRGdsSk02ZFNsUGU0aldvbFowbHJ6d0trTFVJRkc5NXJPdG9veW5KTjBhS05BWnd3STFOQ29JNjNCVXE2Z0JzcUNqCitMRC9yYXBVbnlES3lwRlJEQ3V6NUdXOVdjaFhTSEcwZFlGS1JWY0JUcTYxMWlUVUZZZ0VxREtXc1kyVnFZZzliU3JqZTlhM0x0Rnc1CitDL0xQVURxVnB6c2RDakwrMGVySUhvS1VycjFOYWwyWnFsdmFLc1FZckIwaFN2Tml6NWFpbGhmWHFJTkJxdnREWmhyRUtzWUF3aE9lCitBRUxIMUlHUmZwaWxNVXE3V1ViRzlCcWpyY2drU09sYS9hN0VvMEJnYlZ5UjJ0S0ZySk8xNzl0bFdsR1ozNWY2ZHFaMUhTaHg1Wm5nCitWbW9TZEdpZHhHeDVNWWxyQnZpdHFHeXVnQnRjRlZRZTFhNFAvR1U1VFdrVjl1SzJ1K00xWjJFeFNaQ0dGc1NSRGYwbkx5SXJFRWRXCitSSy83OWZGQ1VsQmFBRWpVcXJ5MExTM0JBWTRXb2hXNHhwWHVRV0RNMHJKUVlSVVF6aW1FQW1PQklYTllJQ0RVWkNpVlc4cWpEcGF0CitXNDV1YnIyNTRTdVhCY1V4c2NvMVZnR09PdUJTblZRQWh5ekptK2QwT2pMQUJla2xLNkgreEdZYi9walEvb3dzaHYrY0YzVFdvY0JuCitmckphbmF2VU01ZmxuNEthcDVQcjZ0TW9VMWtnUTBVSUVKWkM1Z0ZGMVoyNTVYSlpCQTNMT3dtMER2OHNvb3VEYTJaVHBwUEdoZ01ICitpWGM4RURVWG10Y0lTWEtqNlhvdUtnQTd4SS9HTkYwUE91bkFCTFBFMEdWd1RuMmFBZ3dMUk1Oa21ZUTBOU3pZZ200bTJZYWxxemZuCitLbFRyOHBndUtUWUlkd01GRGxkbkdBQ2hkTEY1MGF0ZVdvTTN2cXNnSlgzdCs1TDg5cHJmMWNJdHJUMHN6R0lmZHBYTTlEQXhFU3BsCisyYWozeWhNKzhKM0FFV3BVeHJUUmpqeXhsK2xzcDRscnZKTEY5RGJIYjZuU2x5QXoxWmkwaWg4dzNzUFFEaFdnTG9ZbUJGY1JrM243CitWWllBT085Y2xKTCtnaUw2dDk4OTk3bERya0hxdXR5am9TSkZpbFZGL25PbC83ektnNGs0elRWYUZOQXVuZW9yT2FJRlNTd1lJRnFRCitxRnk3ZWdXejNwSnJkQjB0UUNSdDBsc1M5YXF2bmUxdGQvdmI0UjUzdWMrZDduVzMrOTN4bm5lOUYxS0pmZmQ3MlBHM2RiOFBYb2dRCityWi9nQ1o5NEhFSVJnb3AzUEF3SE9EK0NrUER4bFM4aEMzMDRlY3R2bm9NMVpEelo2eGQ1OXlYd2RhUkhuZWs5dDhEUWczNStvbWNmCis2aThIKzhmSi9uQ3FiejNyM2VkNkVVNjE5TTNzUGU5UlovdmM5MU1TcnpEKzhaR2ZmT1V2bi9uTmQvN3pvUi85NDJOVjl3aUVFaWF3CituMzN0YjUvNzNmZis5OEVmZnZHUFgvdmFPejJVcEo5KzlhK2YvZEsvUWZrY21KMytZbFNNL3NjQ2cxbHh2M3U5ZEt4ajFLTDkzd3FECitEZXB2QUJHak1ZU1BmZVNQQUJYUUsrNVBrdkxQK2dKalYvaXZZZnpQOTg0dk1BUndBVFV3SkF4dzBQQW5BVGN3QkR1aUFUUHBBWkVICitTaVJ3QWd1bUFvSFBjd0pRQkdGUUl6cnc4dzVpL21Jd0JrbndnVXp3OS9aUEJWZlEvRndRU2pMd0JrVndCcDhvTzdxZ0I1UndDWm13CitDWjN3Q2FFd0NxVndDcW13Q3BlUUVCd3c4NkRrQXRxaEM3M3dDOEV3RE1Wd0RNbXdETTN3RE5Hd0N5OEFDR01QU3BEQkN1RXdEdVZ3CitEcXVRRXVDUGY3SWpIMlNIZEdZQi83UXdNS1NFZFFUeGExekhnUXJqQmZad2RHakhpZkl3RVRlbkQ3UFFFS0VrRUFleEVxK2tFUG5uCitFQjFSY3hiK3NZa2FjUk1WQnhKTDhBOFBnaEl0OFJSbkJCUDFSeE5CY1hBNmtZaytzUlhsUmhSMWtCUUZ3aFJSTVJkZFJCWHhoeFZsCitNVzVlMFlleUl3OUVvUmlOOFJpUk1SbVZjUm1ac1JtZDhSbWhzUmdGQVFJaU1ST2hwQUNBSVJ1MWNSdTVzUnU5OFJ2Qk1SekZjUnpKCitNUnNMZ0ExbkQwbzBJQnJac1IzZDhSMmhVUVB1VUlENnlRYUpNQVJ6c1BwT01BSjlrR0ZZMEJaNVlRanZVUU9Oa0JIcmNTRHgwUThsCitrUi83a1dEK2NTRVBRaUFSa2dBTDBoTVBjaUlYTUI5MzhBSjdzQ0hiNVNHdEVRTXhjZ0VyRWhiN2FRT0lJeVZWY2lWWmNqamdRQUNxCitjUldoQkJTa295WnQ4aVpYQXhUUThYQUs0dzVhOGllQk1paUR3empveHlEK0Q2SVNGQ1FwbFhJcHl5TURZSElVSVZJZ0tLQS9xTElxCityZklxK1lNQ2RoSUFvV1FKbVBJcndWSXBHV0FlUDdDZjlQQVg0NFlXOVpFSGIxRVgzWkp2dHRKdWZCRXRzU1lZNDg4czZWSnQxSElqCitneEFRMy9JdlY0UVhDUWhLRURFdjY1SXNWKzhnenRJdy9XUXZBUklYQWRNdEJWUHlDSk14cjhZdThiQ2Z1cUFET0xNelBmTXpRVE0wCitSWE0wU2JNMFRmTTBPVE1YcUJFcVEvSWdlR0FjWURNMlpYTTJhYk0yYmZNMmNUTTNkWE0zWVpNSDR0SnRDb01UVUhNNGliTTRqZk0wCiszUUF4YjY4R1IxSUJOUklnVTlBanR3VWtaVklrbTNNQVMxSVlML0k2NmU4NW81SVhvbE02cFlVNmUxRUl1YlArc3ZNdW1mTThLOFk3CitXMVArSU1KVFBIMkZQQWZUT3RuVFg5SXpNOWZ6UHZ2RlBhdXpJK1V6V3VpVE11MlRQOGtsUCtueElJYmdPQm0wUVIzVU5MR1FOZjlUCitJS0NCTnkzMFFqRTBRM2NUR242emJBb2pGeDQwUkVXMFFabEFPWWRQTVMyek1SWHlQYU1rTWwxME1rZXZNbE9VVHpBelFRVmlNV2NVCitUUnp6T3lIVFJWRVJSbDlQUm5NVVRXcTBMRkYwU0hWMFJTZTBSWDMwTDRGVS93U2lNSkVVVElvME1XOTBTc05rUjFtMFI1dTBFcDhVCitBZzlDU3JGMGJVd1VBZnRwRHlRZ1RkVjBUZG0wVGQzMFRlRTBUdVYwVHVrMFRSRmhOV3Z4TzNWaEJmaTBULzMwVHdFMVVBVjFVQW0xCitVQTMxVVBsVUZ6cVVhd3BERWVyMFVTRTFVaVdWVHVXeEtDMXlQdzMrZEZ6OHN6d1pNa0RIYzFHcDVnVXo5VURMTkgxQWNGVEZaVlByCitFMEE5bFZjR05FWUxGRldQQlVHTlZDRHNVVmJ0VDBrNWxWVmI5VEplTlVoakZWY1RnMWF0bEJmUWRGS1JOVm1WTlU3dk5DWjNWU0QyCitGRkdsZFZxcHRWb05WVkgzWjBrZGRWbTV0VnVSdFZLcmhRYXZkRXlWUkV1WGxFdTdWQkMvZEIvRGxGeVZwRXFYYzF6ZDlVak05Vm1aCitORjF6Y1YzWmtoZkVkRjU5QkY1UFZGNzkxVWZxZFZYYkVsL3pGVlNSWmk0SGxrY0Exa3lQdEdGN3BHQUp0QlFSTm1HejFWNzdWV0k3Cis1R0ZOdFo4V2RFUkZkbVFoMUZrTmxoY3FWRU5WZG1WWkZqYzVOR05QRmtSSmRtWnBsak5MMUZKTkVsT0ZOVEZVdFdMaHMxY0ZWR0grCithVVpVZDFZeGlEVmVlZUZXaXpZc2VoWldlUlZvcDBWb1FZWm9sMVpaU3RWOFRyVnF3YUpwZ2ZWcG9SWXVmaFZLQTFKckMvQnFheWRyCit5YllydUZaczQvTnJ3VlpxTTRacTA1WWtqalpnZWVFY1lpRnY5WFp2K2Jadi9mWnZBVGR3Qlhkd0NUZHZ5UUJQMTVJakJZSUhrcUJ4CitIZmR4SVRkeUpYZHlLYmR5TGZkeU1iZHhmUk5tZlpZWDJLRndRVGQwUlhkMENUYzVjVlk3STVaalBZUmluZlpnTDlZUzlWVngrVlYxCitIZFpzWHljV2FaZERXTGRyWGZkMUJ6RjIrN0pkYzdkamJSZDFjSGQ0TTJSM3hSWmRmVGR2Z0xjTkEyTmprZGRDUEJacit3a3B3eko3Cit0YmNwbnpKUFdYUXFzVEo4eFhkODgwTXJPYmQxZWNFcnQzZitmZG1YTzhieWROVlRJRkJTS09tM2ZuL3lKVTIyYzJrU0ovbTNmMnRTCitKOCtYZDNuQkorMjNnQTE0S0l2WGM5QjJia1ZpYmNIMFo5M1dWK0UyWXVTV2dUa3dnUzluZ1MzNEl4eVlYU0U0Z3ZzaWJCOTRiRGRZCitMREQ0Y1RTNGhEbWlnL2UxYlVGWUtrVFlnMGxZaFJuamhBOW5HT0V4aDNWNGg1MXhHdk1YZmJHeEhJVjRpSW00aU1meEhBTlliTmVSCitoNW00aVhNWVhBL3dZMU4zZWk5RWVVZVllWnNYYko0M0hhT1hpaldrZXM4V0w3MFlRNnhZaHJFNGkrZGtpM2xTU01lNFFzRDRkc1c0CitqU3VralBmMWpORTRUdFNZSzd0WWp0M1lodi9tZU9XWWptWFhqdS80RWljNFlSaFdqdC9ZZURXVERoMzVrU0daQ2lQVWU1ZitsQXZUCis4Skl4T1pNMStRelhNSWxIK0Ewak9aUkYyWkh0RUg3MTAxWnBPQ1JZV0haZCtJV2hJb2IzVlNKVGVTUHFGbUpSZVpZOVlwV0Q5NE5kCisrUzFnV1habEdaZi94WlJ0TkdtRmVRUjE5V1JidVplQjRwZDNlWWFQT1NOcVdZcHZPWm96UXBlaDEydVp1WmtQT1dBcStKaW4yWG9QCitBbTlKdDV6Titad0Q5M0IvV0lBWk4zUGQrWjNoT1o0dmQzUDd4MTQvRjUzeE9aL0wyWFREOVFqam1JL2RRWkNmbVpBTHVVcnlXQzdaCittSThYV1lIL21ZOEZPcHQ3dDZDZHQ1dnpKWkhiZUtFenVLRURPWms3bDZBbE9oVXBPbDRzZW93eEdvWDdhUkRhTjZXMTF5blhXV3dOCitnSHhoT3FiRjF3QkNHbDBLUTMxVk9xZVhjZ2Y4Mkc3K3NtTitEemlvaGZvTThGZEM3WFYvL1RlcGxWbzFBTGllVDVhQWh6cXE3WmNvCisrOWtvcTltYXB3Q2J1VmlidDlsZ2F2cGJ2bG1Zd3ptTWRUYWF0WHFOTzdXcm84S1pJUnFhclhtczRiaXNqL21zOVppcjFYb24ySHFyCitCU0tZeGJxbjNRWUpQU0N3Qlh1d0NidXdEZnV3RVR1eEZYdXhHVnV3RVpjdjI1b1pZR0N5S2J1eUxmdXlNVHV6Tlh1ek9idXpQWHV5CittZUdycjZVd2hLQ3hUZnUwVVR1MUdSc1EvTHBzQUxtTkgxcXY3L1dqVzBlMG0yV2t2YmlrYjFpalladWowZGVqYVp0T2JIdFljSnVLCitkZnVQZVh1TVl4dXRMVGE0YTl1VFpWaDZTYnExdWVhMWxkdTNCUmk0bmJ0RkRobzRFMXFScVp0cXNrTVo4cUc4emZ2K3ZORTd2ZFY3Cit2ZG03dmQzN3ZlSGJ2Q0VwY1ovWkJWcmd2dkU3di9WN3YvbTd2LzM3dndFOHdBWDh2bDFndUhHbE1Db2h2aFY4d1JtOHdlRTdDc0liCithZWlib1FGeVNTMGNmNkpZbkZIM095LzhaUDNIQTR2MWxGbTB3enYzd3hrdmdqZ3Z4VEZvd3RPUjhsVDh4VmZJQW9QUXhXRmN4VDN2CitpV284eHlVSThBNVB4M1BjOE9ZSDhYdzh4ZmV1eUkzOHlKRTh5WlY4eVptOHlaMzh5YUU4eXFWOHlxbTh5cTM4eXJFOHk3Vjh5N204Cit5NzM4eThFOHpNVjh6TW04ek0zOHpORWNJbkxzSU5aSm55b014TzFId29CTHpzbkpsUkl1SVZnTkFOaHJ4bFlKeXI0SmdsSUE3VVRNCitrb0RnR2hLTnhkUDh5MU1nM0FSaWtiYnB3MzcrcU9adWppSHdwY21lQzlrOGlpRk1TcUt1QVFnVURHTzhheFVraXJLbUxhbXVnWVNhCitMZEZWSGJBQW9LSDJxWjJzcWR4c0xiNVFuZEloeHRJanpkUmlxaUdnSk16OHhyejBLYXdHenIxU2ZkV04vZFlFQXJaMDdOWmtuYnFLCitidEFxZmJkeXZibWlMQ0gyL0NTa0NWLytDcHRLL2NtU2ZkOUF6TmlOZmRFRlloWDZxYnJhekNGMjNkWVY3dEpQelhMV2FZUjBydUZNCitEZExwYXV4RVRzYkZIY3ovU1pwYTdTWG1LdDBYZ3RWT3A4OFJqTUs0N04waFI5b0FnT1RvM04zSllzU0tmZDhUM2FqOFFLWkVpcURzCitYY09NZ2NYb0hhZWkvYm1xdlNIY3E0ZTB2YTkrU3VpKzdac21udUxSZkJJV0NYU0NhWmZRS3FhbUt1VERIZEwrODJuZFhTcmY4MndoCitnTDNUN3VIcFNxMjU5TjNsdTl5UjFJMmxmR3JiazZuZHB6M0F1ZzNvTzk2dlRNclpHbW5GMk8ybWloN2NXaDdwemR6T1N1M1BqQ0hSCitlUDNXYWFyUHlSN2tQRzdnLzF6clR3bVZLZ0xPd0ttbWtOM0FDTjNud1g3djlVY05pSTN2QVQvd0JmK09VdUNDZ1B3c3ZvNkNlTHdvCitNR2p3SGYveElUL3lKWC95S2IveUxmL3lNVC96Tlo4elFLdnpQZi96UVQvMFJYLzBTYi8wVGYvMFViK2lmR2pzVXIvMVhmLzFZUi8yCitQZjcxWXIvMmJmLzJZWi94Q203M2ViLzNmZi8zZ1QvNGhWL3V0WEQ0amYvNGtULzVnNzhGTDJmbWxmLzVvVC82ZjE5Y1I5eGVTZHg5CitNcno1NGR4dXIxK0F1OStGdG45N3dwLyttcXZmdzYwZnc4Yy85ZEtmckFWaUFzcmgvZUUvL3VWLy91bS8vdTMvL3ZFLy8vVWYvZzE4CitWUW9qRWdCQ21zQ0JCQXNhUElnd29jS0ZEQnNLak1RcjRqMEE5eUphdklneG84YU5IRHQ2L0FqU1l3b0FGcCtVTzRreXBjcVZMRnU2CitmQWt6cGt5VUV5eU9ESWt6cDg2ZFBEVUNTR0hSd2F5aFJJc2FQWW8wcWRLbFRKczZIYnJFNHNTS1BhdGF2UnB5cWtWdXFycDYvUW8yCityTml4Wk11YVBZdTJLemVwRkxHNmZmdjJwc1FNVCt2YXZZdlhxUU9iSk9INi9WdjFaMUIzaEFzYlBvdzRzZUxGakJzN2ZrejRCVnVxCitnQ3RienFnMUlyRmVuRHQ3L2d3NnRPalJwRXViUHMyWjJPVExyRm5MNVhWdkZ1VFp0R3ZiZnJ3MzR1disxcnd0QzQ3bzRMYnc0Y1FiCitTNWJZdHJkeXQ1bDViVVlOUGJyMDZhWlZJNmU4UER2UDE3R0xlLzgrUERldjNkckw4L3pOS3pqNDlleU5yellQSDJUejU5VHIyNzgvCisyanJzNVBIN2IrUXVXM3NDRGtpWWVPVDVoMkJHNk8xZ1NvTU9QZ2hoaEJKT1NHR0ZGbDZJWVlNSXZKZGdoODNWczB1SUlvNUlZb2ttCitub2hpaWlxdXlHS0k5WERZSVlLdkVaSmhqVGJlaUdPR08vQVZZNDhXb2FjZWdVS0NkOXgrMlBrSTMzejRMY21rZmZvMWh5UjhBQTVKCitwWGNHOWhWbGdrQld5YVZ3UlVLWnBYWktOa2xtbWFVOXlWK1kyazNaWlp1elhha21nbHU2U2FkNzE4VlozcGhtN3NsbkwyZ2VpU2R2CitiTlpKS0dKd0JncmZuSVV1R2huK2pJaTJwbWVma2pMNTU2UEtEY3Bvb1lkYW1oMTZ3dVFJYXFpaVdzaUpvNXhXMXB3c2k2ekthcXV1Cit2Z3ByckxMT1NtdXR0cTRxaTZtbi92VWFCQWlNQ215d29RckQ0NjdLS1pvcG9WK21hZXhma1U0S2JYMlZObHNacHNuU3VTbTFseUY3CityWnZMQXFvdFZzOUdTeTUwMDRZTGw3WGRkcGt0dW45eHV5NlgzN29MMTdqbDNrdmF1ZlJlcFc2OFZMYTdyMXZvblpKWHdRWWZ6RlJVCitkd1o4VlhOeHlBRnh4QkpQVEhIRkZsK01jY1lhYnd4eEhMb3luTk5yQXRDRmNNa21GM3hLc1NBTERGUkVscndCYzh3eXoweHp6VGJmCitqSFBPT3U4TXN5WWZyeXdmZnhTa1JYVFJSaCtORmdVL0F5MFNsZ0xRdzNQVVVrOU45YzZXcU16K2RHQXRwK2V2dDB0bnZaRzkrSTc5CittYjVnZzlSdjF3UUNmRFpPOEtwTjRMeHRaOFVmZldUZlhmYlhjNnZjSGR4VnNyMjNSMi83M1o3Y2dYY2tOdDVqbTMxNFJta1R2aDdnCitqZnUwZFJGbVhJNTU1cHB2em5ubm5uOE9ldWlpWDg2TzNvRTM5MGdBcXEvT2V1dXV2dzU3N0xMUFRudnRxajlpK3Q2OWNqRjY3NzcvCitEcnpvUldBOWVVZURRMDVrN25NbnJ2aTlqQmV2RzVaOUl6K2c1TkQvdUhXUTFCZXVmTnZNTjAvdTg5QS92ajF4MWwvUHkvSGxEMmM0CisrZ3M3QjM3ejRoZFAvdnEzblgrOSt2YmIxcjc3MzhjL3FmbE5ybjc3b3czK29JY2VFc3hoZ1F4c29BTWZDTUVJU25DQ0ZLeWdCUmRvCitqKzZkclRsWW1JWUhQd2ord2hDS2NJUWtMS0VKVDRqQ0ZIb1FDeG9FMjR3dUNNTVl5bkNHRnlRQjhkeDNFZjBWY0RiOVE5Ly9BTmduCitBVGFPZ0R2RXpRMXhHQkVkRnRFeFBiemVENEc0SnlFZWpvaExaTXdCaTZmRUtpNm1pZEI3SWhUTEpNWEFVVkdMaWJuaTVMSklSc1J3CitzWGhlL0dLVHdxZzc2UVVvamJVeFkrUFFBNFZnNkhHUGZPeWpILzhJeUVBS2NwQ0VMS1FlUjlEQ3JLWHFDSXhzcENNZkNjbElTbktTCitsS3lrSlMvSnlGeTlENGU5VW9JaFB3bktVSXF5a0ZBNEloTFJTTWZDckhGeWJYVGprdUE0dHpHbXNrQ214Q0VxWjduS3hyWFNsZmVCCitaZHRrT1VzN0h1NldxY3psNFhiSlMya2xrbW5BVEtVd0F6ZXdrMGx6bWsxUm1KR1ErTDcraDNGc205enNwamMxNXJGTnVrOWtKS09tCitPYzg1aTVSRkQ1c0sydHJMcWdiUGVNb1RaejRUcHcrRmhyUjg2bk9mWmxHYVBhOG5NcWpOYzZBRWhlZlYxc25PSEdadmxyUXg1dW5xCitsc3p3TFJOb3phVGpNL2RHVERvNmRHL0lqS2gwZkhtMmlxYnhvblBMYUJvM3VqeUllalNBRTEyWlNNbEkwcmFoSnhFbXFLbE5iNHJUCituT3AwcHp6dHFVOS9DdFNhbHVxZlhlUVBDOEtCMUtRcWRhbE1iYXBUbndyVnFFcDFxa2hsUVV0QjFxcytCSFdyWE8ycVY0R2FpRnE2CitEejJlS0lWWno0cld0S3Axcld4dHExdmZDdGU0bXZVU1YyVlljNm93aGJ6cWRhOTg3YXRmL3dyWXdBcDJzSVROYXhYcUdqRHU0RU91CitqRzJzWXg4YlYwLytpQlY5WklXc1pTK0wyYmZTbGFoczVBOWVDd3ZhMElwMnRJTTlMR2NIS0wzRlpuYTFyTFdzWkJHYTBDUnVyYXl0CityYTF0Tll2WWZkMlZ0THp0clc4RmE5cHJZbE94dHkydWNjLzYydkZnS2JhVlBhNXphN3RaNFNKeHQ3K3RyblY1RzF3d29ZKzR6KzF1CitacE43SUd5aWh4RWdLSzk1ejR2ZTlLcDN2ZXh0cjN2ZkM5L3lMaU8zOUdxT090S0IzL3pxZDcvODdhOS8vd3ZnQUF0NHdQaFZCMzNkCitOYVA0S25qQkRHNXdmQmt4MmZ6TjFyc1V0bXgwdGV0RXoxNTN3eHd1N1lIUnhkMEtpMWl1NEYxdVFwczc0aFM3OWNMTXVpZGxQdHZoCitHTXQ0Q3RsdE1VQlRxK0ljczdYRXNjV2VSV2lyNHlEUDljUGhvdTZNajN6ZEdvUCthM3c0RnJLUWVkemo5RTNZeVVGbThaSTcrMklrCithN202U21abmlLbXNZaWozR0QwSm1JZVp6NHptTkt0NXpXeHVzNXZmRE9jNG14a0hSTlpXYyt5QWh6enJlYzk4N3JPZi93em9RQXQ2CiswSVRPc3gzcVRLMWVwVUxPakc2MG94OGQ1d1JFR0lGVEJyT0tyY3hPSTI5NTA2THQ4bkNiYk9rVWk1bTVsUTYxaURHTlRVMXpldFVlCitQdTBRUVczcUNvLzZ4S1dPdFhkUlBWME5zM3JYd0VWMHM3NXM2KzdPbXAxa2hyU3hqNDNzTjlQWjFjZmtUenpZQU8xb1MzdmExSzYyCit0YStON1d4cmU5dlFqb2V2amFYb1pJdDczTWVXTkd4Si9lTmdWeGpYT0ZRMXI5K3RWMDhqRWRqcVB1Nnd4VnZyZWh1WDNmN1ROYnovCitiZGh2NzRyKzN2cSs3YjFQbWUrQzI1YmZMcllJakFFT2IzbHpFdFlLTi9pa3Naandpck9XNFJuT01zVC9MZkZ4VWx6anJUMjRMYmRHCitYZ2VyZk9Vc2IrOThtZjFReXFBakRUU3Z1YzF2anZPYzYzem5QTys1ejM5T2MzUUkvRlFKYnJuUmo3NXlDSitiMXVrbStXMDVYbFNQCitmL3pkSWQvdXlKMyszWXVmTWVOWXQvRFFPZVh1cVhPNjZqZVdpbXE3emxxVGo1WHJhSGNzMUxIc2NMRlQvZXVXSW5qYkg2dDJ5ckw5Cis3bko5T3l2OUxmZFZrNTNKWnVkNzFwZE83SzF4Z0FDTWI3empIdy81eUV0KzhwU3Z2T1V2ei9oYTBQMVJ6WGtIT2o0UCt0Q0xmdlNrCitMNzNwVDQvNjFLdis4Ky9ZUEtKNjlRZk15MzcydEsvOTVUbWc5VHZ1M2ZEK3VJVTVSd0VmK0UwUG5uNVg1ejJKY3ovTTNSdWZyWDdYCitKZkNEcitYaG83Ynd5OGM3OHFHcC9PcW50Zm5ObGpyMHR5ejlWMU5mKzR6TnU0UXRvZ0I4cUgvOTdHKy8rOThQLy9qTGYvNzByNy82CitDK0g2UURYSEcyRG92Ly8vRDRBQktJQURTSUFGYUlBSGlJRDk1dzM1aHljaXd3cjJCNEVSS0lFVFdIOEtjSDBZdFRXT2tBVWJ5SUVkCis2SUVmQ0lJaEtJSWpTSUlsYUlJYjZBTU1HQ2ZOSVE1bjRJSXZDSU14S0lNelNJTTFhSU0zaUlNNTZJTGlvSUpxSWpMZGNJSkJLSVJECitTSVFtNkFnWFdGTFpSMzVENW5zcDVYM2ZoMlRoTjBYRnQ0UnJaWDZVMW5SVkNGZmNGM054QjRYZzE0TmhZbmRhbUZaWGlIRlpTSVp0Cit4WVgrdi9lRVh5aGpVaWhHVkppR1ptV0dXMmNSdzlBR2VhaUhlOGlIZmVpSGZ3aUlnU2lJZzBpSWVVZ0hZWmdselFFUFpjQ0lqZWlJCitqd2lKa1NpSmswaUpsV2lKbDhpSThJQ0lVZElyRDFDSW53aUtvU2lLaERnTVNDaFRTcmlFYStpRVh1aUdSd2FIY1RSK2MyaUZwbmcyCitLQ2FMYXFXSzN2TjhyY2hocnhoTGNqaUhkYWg3YUhpTGFKV0xHN1NMdkpoa200Z2tZeWlMd3BoOHhGaU1UQ2hkN1phTXlzaGx6T2dqCit6aGlNdEFnMjZQRUJrQ0NPNDBpTzVXaU81NGlPNmFpTzY4aU83U2lPR0tDTlBkSWNSbEFNOVdpUDk0aVArYWlQKzhpUC9laVAvd2lRCis5V2dFOFJnanI2RUc3b2lRQ2FtUUMrbU9IK0NOV1lNZTFuaGxmemVUa2M1WGtWT1lVT0dGY0psbVkxSEhrUmNaaHhscFlvbjNrU1daCithaDFKZkNJWlplbGpEQ25na2k4Smt6RXBrek5Ka3pWcGt6ZUpremxwazZ1QWtuKzNDam9KbEVFcGxFTkpsQzdKa3lBWlIwV3BsRXZKCitsRUZwRENNcFhnQWdsVk5KbFZWcGxWZUpsVm1wbFZ2SmxWM1psVWlaVWw0cGxtTkpsbVZwbGxVSmxyOTBsbXZKbG0xcGxpc0psM0VwCitsM081TndFQkFEcz0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9maWVsZHNlcV90Yi5naWYuYjY0IGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL2ZpZWxkc2VxX3RiLmdpZi5iNjQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I0YzE3NgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS9maWVsZHNlcV90Yi5naWYuYjY0CkBAIC0wLDAgKzEsNDQ1IEBACitSMGxHT0RsaGRRS2FBdWNBQUFBQUFFbEpESyt2cjFZTURCVVZaQzhrRFFBQVZrWVFFQmNIT3dZR1NDRUpIU0FnYUtPam95czhERE16CitDZ0FZR3ArZm4xOWZGSm1abVFvS08xMHdNQTBWSUFBQWNEc0lDQ3NNREFjTVQxTU1EMlptQUFjU08yOUlTRlVIQnlJQUdvaUlBQTRICitUMHBLREphRmhYZDNkMEVnQUJvYVZHWXlBQzRBS1hkM09EczdCd0FBTjFNQUtRQUFZbFpHQjJKbERCd2NXV0J0WUNBM0FCQVFUUUFBCitaUTBWUUQ0QUFGVlZWVWhqU0NRTUpRQUFmQk1ITWtRZ0lFdExTekF5REQ1VlBtWm1ERVpSQjJGaEVXWmlERm8yRVRrZEN3QUFWRVV0CitHdTd1N2pzN096YzNOM2QzV0FDUEFEVTFOVE16TXlCUklEZ0FBRUpDRUhFQUFFd05EWmVYQUFCcEFFUUZCU01qSXhnTlFEb29DQkE5CitFRWhJYndCVkFBdy9EQXdNUGdCTkFFTkRDZ2M5Qjh6TXpBQkRBRDRNREF3T0tqd0tDa1FXS1VzY0hBQUFjVXRMRlJNVEV3b2hDb3FLCitBQTBOVEJFUkVRZ2ZDQlVxSWdBcEFESUFBQTRVTHpnK0RFRWZIM3dBQUFjSFNhcXFxbGtjSERnTURLU2twRlFBQUJVVlJqRXdDR1ptCitCMDBRRURBd1hTVU1KR1VBQUphV2xoUVVVbng4alZRYUdnY0dMZ2dTR3k4R0JtdzRPR05BTDRxS2lvaUlpR0lBQUVzSEIzSllXSGQzCitBQUFBUGxjdExZUXlBR2dnSUJnQUdrSVZGUXdjSlJnWVNBOE1VOUVBQUFjSFZRQUFMUm9hWWJ1N0FFWTFIMlptWmx4ZEVIQUFBRDgyCitEbGhxV0V4R0hnd09Vek16REFBQW1nQTVLVEVIQjJabVBscGFCLy8vLy8vL0FDSVNSRXhVRFRKUEpVUXJEQXdNVmhJU1NFaElTSGQzCitJQzR4Q2poY09BNE9SRVJFUkJrVlhFbEpBRzVnWUZoWWNudDFaa2dHQmxZQUFBVUZNVGc0T0RvM0JUSnJBRkVTRW1abU1GNWpCd29HCitRMXBhRFVrS0NoeEdITjNkM1J3WVJHWm1IQ2dvS0ZNQUFDWW1KaTRZTGhRK0ZDSWlJaFUwRlQwQUtSNGVIbVZlQncwNERSQXNFQXd1CitEQWMyQndvcUNnQUFQRmRNRFFBQTBXQXFLZ3dpREVnWkdSa1FSQWNrQnhzVFBERXdEQkFRRUR3QUFFSkdEQUFBVTBGQlFFSkNETHU3Cit1MklZR0pvQUFCZ1lSamc0YkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUNINUJBRUFBTEFBTEFBQUFBQjFBcG9DCitBQWorQUdFSkhFaXdvTUdEQ0JNcVhNaXdvY09IRUNOS25FaXhvc1dMR0ROcTNNaXhvOGVQSUVPS0hFbXlwTW1US0ZPcVhNbXlwY3VYCitNR09lbEFlZ3BrMEFKRnJTckxoVHBZUTNBSG9lREZwUXFNQ2ZRUUhJWEVoMG9sR0JZa1p0cEdrVFc1NkIwRVlCZlRNS0NVRUpFcWphCis3RHBRRElBYkJKc09KSEYxcWR1M2NPT3FWS3RUS2NXbkVPbm1sUUFMV2s2RWVwOEM0T3UzWVdDN0pVbEFnOVZVTDBLOHZjUk1SVXdDCitnRmRvWEJkRDYrV0U0QTBrUXFFNWtTcXdzdVdCZXBGZzh5cTN0ZXZYc1BQS2c0bjNZVzJIam5IUFpycDdvT0RlaG9IRHVpMnlzZkRICitpS0ZpNDJpVTZBMjBBNUc4NFNzUXJkRThpS2RQUjMxODFLUFk0TVArTnlTQkM0TDRsSFJKQUkwTVN3d0owKytCNW5TdkhxZEFKUFZ2CitMSGIvVTU0WUp6WDk5UlIrUU9uWDNudEtpZEVMQU5pTVlsY2UyREI0Rlg5dkhNZFlUZklRZU5aKzhkbEhrRmc5UVNpaFFFUXB5S0NECitIOXEwRTRYK0FmaEdUaXI2WmhNc2tXR1RVMzNZOEVXZmZGQzVPQitDT05YM1YxQml4VmdmZTdEZ1dGbEI3NjIxbm1STUFqQmRMd2sxCitCdzBTQUVCWjFtS3c1UEhkZFE5YU5ncDBqQjBuUVdmbnBhbm1EVFZOVTU2YUk2bEZnaE9Ma2JBY1RWSmg5eGwyOHVDSkJEUTJKa2tuCitFcU4wSnM4YnZXVFl5M2RtemZiVW5GY1dPaHhYc3pueG1XaEtIZW9vQU5BY21paHJCaEVGS2FHR0F0QVZvSDl4TjF5bUZhNjZHRkgrCitsdjRKWUVGRTdlUnBoaS8yMWVwaEpEcVJSNmZZMU1scW5sbkNraXRtZlpyYTVWbEk4Rm5tczg5Q211Unk2amtLVkVHTGxrYm50RXdHCitDd3VLeUsyVkUzSGZMaGFhcFFLTnVTeHJqcGtGNTBTZzlTbnZ2UFRXYSsrOStPYXI3Nzc4OWxzdlBEY0JzRTBUcWI2N2tWcFdEVlNoCitVTWJSeEtVRXkyM1hWNVlPRndSTnJja1pTOTNGWWxSczFzTktqWkxxRFNSVW5CQlJFbk5zTXNTMGJ2cnR5REQ2eCtsUkdXUHNxa0NaCitwU1ZjVDRNWnRDUk43TTZXczBBTTcwYlUwVWJQbGpETzh1UTRrQVExNzdhMHNjQTVUV0tWQVE4bVZKRUNVYm5xVFovaDNOWWIzMEhiCitzc0VRRlpuMTJteTM3ZmJiY01jdDk5eHhvNjJSV2xrbnEycittVnNyaGJmZVJ6bUJEWnN1Njh4ZFQzM1RHSERKR1ljNjI5K0pHNzdUCitnamZGSExtcXRpS1dGVFp2M0NBWnI5Q0tjUU9pQzY2cTZ1YWRkNHlZY2MreW5yZGF2NUVZTUhBSVl4MmRWbGp1bkduWnRXRjNFNXE1Cis1V2IzUWZINmEvenh5Q2V2L0x3QUIzeEZFb1VNbnhIQ3V1OU41TXl3L0tTeFFDcmJaUmFVTmhPVU1zVjJYUXp5eTBVMWZ2YjRxai84Cit4dGs3aWV5NCtUVERuMm5qQkpwTnRGMU41V3A2MFFRaEVBQmI5N2lrd1FJYndyRmE5cUltRUFRbVJHS01zWjJNYUVTbWRDbUZCRkNxCit6U2hJczZ4WFdVaDQwZ3RoU3RnRUFIWllTa3NpdElpY3R2V0lONEJtZFVuekU2b0VGYWxTUWFWWWp3REFWUjQxS0VrSnBSZitsNXFWCitwaVlGdU9FVWpFU3pHWlVQVGZXblFFbU9WZFlxSUFWbHhjRE1LZXd2ZHRLZjZhQkZ0cjRzNklXcThwK2RCb2cweHJSRlZDeDBZYldHCitFeUZzbFUxYUxmUkt5YWExR0hETk1VVzNRd3RtRE9TWGEzbHRpd0Y4UTF0dzlwMTJxUytGaUN4Sm9UeVh5T2tCcHo1T2tBd1prMVVmCitzbWdvYkVJNVVtVWVNYUQ4ZUVVb1NGalFsSTRTSWFkbHNuRUFFc01sUDRrVG9KRGxpYVJrRUhXSUVrb3BTZUNQU1B3Zll2SUFvTE5JCitKcFVFd2N6N21nSXhCcW1uUWpEc1VpODlOOGxuaVJJV3dJUWtsS1NKeXlSeFVKb2t5Z21oYk1tL0k2b3RiSDNSaWpGcDVKNEpGa1I3CitCSkZVM3JKWHdVYTZVeVNnZW1kZHhIUEVoWkJMbmlqK0FWUkRWRW0wOTdYbUJ0VEJwMEFIT3J4N3VrVWVaWE9JUVFrNmtsRllxQ0JqCitRZ0lTYnNCQnVPaVRvUmpOYUhnV0NpZU9hclFqaFZuSVJHc0N6cmlFNWFNb1RhbEtWOHJTbHJyMHBUQ05xVXhuU3RPYTJ2U21PTTJwCitUbmZLMDU3NjlLZEFEYXBRaDByVW9ocjFxRWhOcWxLWGlwQVJTT0twVUkycVZLZEsxYXBhOWFwWXphcFdvY29sZ3h3aUdHQU5xMWpICitTdGF5bXZXc2FFMnJXdGNhMW9URTRCUndqYXRjNTByWHV0cjFybmpOcTE3M0N0Y1lKRVFZU3dpc1lBZEwyTUlhOXJDSVRheGlGOHZZCit3QW9qSVZ1TnJHUW5TOW10QWdNaDBHQ3JaamZMMmM2eTlSQU9ZVVFuUmt2YTBwcjJ0S2hOcldwWHk5cld1bmEwOUhqKzZBTElRZHZhCisydmEydU0ydGJuZkwyOTc2OXJlMGJVRkNuc0NFNGhyM3VNaE5ybktYeTl6bU92ZTUwQzN1RXhLU2kxaFk5N3JZemE1MnQ4dmQ3bnIzCit1K0FOcjNWemtSQkl2UGE4NkUydmVsMTdpY2VzQXJqd2phOTg1L3ZiQllSMnZmak5yMzVaRzF1RXpKYStBQTZ3Z0hrclhJUVFON29JCitUckNDRi96YzZTS2t1dUtOc0lRblRHSHdraGNoNXQydmhqZU0zL1llUkI3dkhiQ0lSd3hnK3paRXRCeE9zWXI1SzFzU3UvakZ2aTN3CitRUTdNNEJyYitNYk1kZkJCSUZ6aEh2djR4OTI5OEVFeXZPSWlHN2tUSGpZSWlHSE01Q2JYMXNRTVFmR1JwOHpoL2g3a3YwN09Nb2xsCitiQkFhNC9qTFlGNndqZzNDWXlDYitjd1VGckwrUVloTTVUYm5OOGxGQ2JHVzV5eGdLQy9FRGxQSXM1NzN6T2MrKy9uUGdBNjBvQWROCithRDN6QVNGK2NJT2lGODNvUmp2NjBaQ090S1FuVGVsS0s5b0xDZkZHTnpiTjZVNTcrdE9nRHJXb1IwM3FVcHQ2MDk1SVNCU2F3ZXBXCit1L3JWc0k2MXJHZE42MXJiK3Rhc2prSkN6RkRvWHZ2NjE4QW05QjRRd2dkTEcvdll5RTYycGYxd1h6YzdlNzFXTmdpVzZVeHQrWEs1CitJRjRPczdhM3Zkd3hGNlRNYUE2M3VMbXI1b0t3K2Rub2JpMmNQeVRuYXJ1N3ZzMU90N3hYRysyQ1RQdmQrTmJ0dFFtU2JXNzdtOXZlCitKZ2k0eDAzd2NaZWJJT2VldDhKSnUyN2Z0RHZmRUxldG5SVWk1WVZidkJQMUpzaTlJeDd4ZlErazMvOE8rWmYrQXo2UWdSZjg1R1krCisrRUFTZm5GNU41eG9EK2M0eENlZWtJcTNmTjRaSDhqR1pZNXZqd3NFNUNJUE9vTkpMaENUby96b0ZWYTVRRmgrODJlL2ZEZ3g1L203CithWTRRSGd6ZzZsalB1dGEzenZXdWUvM3JZQSs3MksvdURBWWdwQjVlU0x2YTE4NzJ0cnY5N1hDUHU5em5UdmUwSnlJaDV1aUMzdmZPCis5Nzc3L2UrQUQ3emdCMC80d3V2ZEhBbFJCUkFXei9qR08vN3hrSSs4NUNkUCtjcGJmdkdxU0VncnhzNzV6bnYrODJMSEFFSVlNSUc2CittLzcwcUU4OTNlc1I3NmJMTytjQzJiblVxKzF6V0FCZDZMaVBMdEZoWVhTaysxNjhTb2NGMDEzZjVxY3ZlZll6YnozeG53MTdXTWdlCisrWE91L2UxelQvMGNVL2YzMkU5emVaZis3M0wzUWovZlZEK0l6Ym5mNXVZLy8vdE9sbjcxMTYvNzYyZi8vZUVOL3ZESlgyVGpSeDM5CitXUTYvUWNwQmovNzcvLzhBR0lBQ09JQUVXSUFHZUlBSTJIK2xJQUFJWVFKcDhJQVFHSUVTT0lFVVdJRVdlSUVZbUlFYStJQ1VrQkRaCis4QVVnR0lJaU9JSWtXSUltZUlJb21JSXF1SUlnbUEwSm9RWnRFSU15T0lNMFdJTTJlSU00bUlNNnVJTThHSU5xa0JCOWtJQkNPSVJFCitXSVFJbUF3SUlRRHZzSUZNMklSTytJUWFhQUlPVVFsU1VJVldlSVZZbUlWYXVJVmMySVZlK0lWZ1dJWFV3SUFIQVFxcmNJWm9tSVpxCit1SVpzMkladStJWndHSWR5ZUlaR2tCRFhVQVY0bUlkNnVJZDgySWQrK0llQUdJaUNPSWg0ZUEwSkVRSCtvWkNJaXJpSWpOaUlqdmlJCitrQmlKa2ppSmxKaUlFWkFRTmhDR21yaUpuTmlKWUpnSlNXZ0JjemlLcEZpS3BpaUhvS0I4OURkbDVvZC83cVorN0JlTDF2ZGc4RmVMCiszaVYvcStoczl1ZUsxYVovQlRGK3VWaGtyY2lMZEFhTHNuaU14N1Y3dldlTDhJZUx3VWhsdTBpTWMrYUxCQUdNejVoaXd5aU5XV2FNCit5SWlNeXNpTTRJaGR6bmlOUmhhTjJ1aGsxRGdRYUJBSjdOaU83dmlPOEJpUDhqaVA5RmlQOW5pUDdEZ01abmNRdCtBSi92aVBBQm1RCitBam1RQkZtUUJubVFDSm1RL2xnTUNSRU80UENRRUJtUkVqbVJGRm1SRm5tUkdKbVJHdm1RNFpBUVlQQUtJQm1TSWptU0pGbVNKbm1TCitLSm1TS3JtU0lBa0dDV0VGK0JqK2t6STVrelI1ajhOMkVBeVFBQXE1a3p6Wmt6NlprTGVnaXVSWVpTMTJqdWszWE4yWWxOOFlqdUU0Citqa09wWXVab2xEQ1dqZ0poalUrcFg5a29sUy9HalVrWmkwdkpsTXpvbEZlNVlWR3BsU1JHbGJCZ2xXTUpiVVZwbGk3R2xWMjVmbDhKCitsclVvbG11cFgyWHBsZ09HbG1wNWwraVZsWG81WUhBWmw5UTNsM1Q1Zm5icGwrdVZsNEZaWWc2UkNUVVptWkk1bWZaNGFBY3hBeitaCittWnE1bVFlWkFBbnhEV0VRbXFJNW1xUlptcVo1bXFpWm1xcTVtcXdabXQrUUVDSUFDTEk1bTdSWm03WjVtN2labTdxNW03elptN0lwCitBZ2x4QVpRNW5NUXBtVGRwRUh6QW1jcTVuSnM1QTBLcG1Pa0ZtSTBKWUlOSm1MaG5tSWVKZlluK0NaM294WmpUS1Y5OHlaMVkyWmJmCitTWjFJYVozc2g1M1o2WHZiS1o3czVYM2xHV0RoNlo1czZWL3hHV0RWaVo0aXA1N3JlWFR0U1orcjVaMzM2VnZ6Q2FCL1NaNERDbC81CitxWi8veHAvOWVYTC9hYUNvSmFBSnVsdG9lUTZRa0tFYXVxRWMycUVlK3FFZ0dxSWlPcUlrbXFGOXNJOEd3UXZpc0tJczJxSXUrcUl3CitHcU15T3FNMFdxTTJ1cUtma0JEcE1BWTgycU0rK3FOQUdxUkNPcVJFV3FSR2VxUThtZzRKb1FLVDBLUk8rcVJRR3FWU09xVlVXcVZXCitlcVZZMnFRcWtCQlFVS0plK3FWZ0dxWWsyZ3FqdHdJM2VxWm9tcVpxYXFPODhKd1NtbHJTV2FHOXRhQU1DbkR1OTZDL0Y2RnZXbG9VCitLcWU0VmFCN3ltTDI2YWYrd0VXbmRhcHREb3FuQnJkOWdhcHU4RW1vQk9xbWpVcGFjUXFwdUdXb2h3cG1pYXFvNGFhbmpkcW5sa29PCitGeXFtcEZxcXBpcWlKNG9RS3JxbXJOcXFyanFqT1lvUWNDQUh0RnFydG5xcnVKcXJ1cnFydk5xcnZ2cXJ0QW9IQ2ZFSHYxQ3N4bnFzCit5SnFzeXJxc3pOcXN6dnFzMEZxc2Y4Q2xwMXF0MWxxcVpJcVRadnFxM05xdHJOcW1KemFwZ25wbG9UcW41NW1wUWJlcG5IcG1uaHFvCitvR3FwZ0NxdXAxV3A1UnBjNTRxdUlhZXU2d3BrN2Jxbjd3cXA4U3F2cFVXdjlZcXArR3BqK3JxdlB0YXZiL3F2aEJxd0FndGJDRnF2Cit0bVd3Qnp0MGQ2cXdCTWV3RXVxd2ZvcVdIWEFKSWp1eUpGdXlKbnV5S0p1eUtydXlMTnYrc2lPTFFnUmhEd3N3c3pSYnN6WjdzemliCitzenE3c3p6YnN6NDdzekNRRUxUd0JFUmJ0RVo3dEVpYnRFcTd0RXpidEU3N3RFUkxDd21oRExsUXRWWjd0VmlidFZxN3RWemJ0Vjc3Cit0V0JidGNxUUVIcmdzbVo3dG1pYnRpMUxBUWdoQmovN3RuQWJ0M0w3cy9iQVZIWjd0M2lidDNxN3QzemJ0Mzc3dDRBYnVJSTd1SVJiCit1SVo3dUlpYnVJcTd1SXpidUk3N3VKQWJ1Wkk3dVpSYnVaYjdVaENVUGY1MEh3SnlTSVlSTUZUQ002QUxTREpTRllQa00yc3pHNFN5CitGYTkwSVRaUlVwY2J1N0tMRVNSUVFSUkZFRXRDdWxCQlFyQjdOdW1UUzc4YnZKcDd1aCtXSEh1a0dhUERKVTBoR3UwMHU4Nzd2UHQwCitHckNBSllPVUI5ZitvcnNIMUJWSTRBVFZaRGpCNnhoNFlSUlpwQkJHQVVRRjhSekF1eXpRdTc3c3F4QldZNzFZa1NOMkFSbXNRUnpnCit5ei9IRWI3R2l6M2hjaC9GUWhCbTRSVnFnUjN0VzhBR25DVFFJVDlkdzBuejY3bmNBaGo1aTc5SzFqaXhJMEhZUzBEY2d5NEh2TUhQCitHOERHTWszVzBjQUlJVUFuRXpEN0l6dVZnNzBWM0w4WGZEUTMwUXZ4eE1FeWJMbE9JQUVRMGsrc2RNSUcwVUs5MEZWREVjSHBhMDU0CitoQlg4Vzd6UjhiOWxjUm9nTk1OTUxMbVBRRkZZbERkNE1VWU1jYjlCck1ORFhCckxRYjdKWWI2ZUFSMUwzTVJpM0xnWGd3MHd1MFVECitnc1FLWWNWYXBNS0k4UlBFTzhIQjFEbkkrd2JLKzFCam5NZU1LemhHL0RVMmtTaitXWE15UU95Nk4rSEhOUkc2TnpFMUZud2Y0alEwCitiYXpIa0J6SmtqekpsRnpKbG56Sk5FVUN2YkRKbkl3a0luRkxuYnpKQVlYSnBGektwbnpLcUp6S3FyektyTnpLcnZ6S3NCekxzanpMCit0RnpMdG56TEdoSEt1cnpMdk56THZ2ekx3QnpNd3V6TG84eFNDakxNeUp6TXlyek15M3pHS25YTXpCek4wanpOeVh4VERFTE4ySnpOCisydXdoTGtVVDNLdk40QnpPeUF3Z2VQeFIzaXpPNkp6T3ZOeEdOc1hOTHVYT0xFVVQ1YXhSOGd4VDlmeFN1VnRUOE14Uys2eFM5OXpOCitZWnhSLzl4UytVeFQvYXhTQjQxU0F4M1BBWTFSQzcxU0JUMVQzQ3dNakZEUkZuM1JHSjNSR3IzUkhOM1JIdjNSSUczUlhaWFE1cXdXCitPTEFMS0ozKzBpcTkwaXpkMGk3OTBqQWQwekk5MHlpTkF6SXl6d0t0RmlHOTB6emQwejRkMGgyd0ZnN2NVdHpjbDVNYWJTUk56Mm94CitmUmQ3WXpyMjBQNnNGdk1ucmtrVzBUSlYxQkdMV2toZFQxSGRHMHpkMURYMjFBM05VUDg4MVpOYTFVUE56NmxpMUkyNjFmYTgxR0R0CitiMktOMHc0dDFWbDlXbWh0eld0OTE2YmwxaS8xejE4ZDF3bzIxMi9kRzJiOXFVS3QxK3BZbkl6ZDJQYW9qNmpCMVNuMXoyelFtcFo5CisyWmlkMmF6SkJqZGQyQU1CazQ0ZDJxTE5qc2RwMVRHRjFYeE5xYjJSMURudDFZSzliWVQ5MTNhZDJxT1YxKzI4MTdTTmNhc3QyUW9OCisxNjhkWnJFTjBJYWQyMGlXMkxjOUVHd2RxSDR0M0IvMzI4RGQyYkk5M0xuK2JkdjZuQ3BVNkluWW5kM2EzWVZqR05tZUxSQWZ5SUxpCitQZDdrWGQ0cTZJTDdROWRrclJhWnVOM3UvZDdZRFlxbGtkWXJ4YzM4WjRUNG5kLzZYWUFMNk4zUlBSQmFRSWdDUHVBRVh1Q0RxQVhRCit6ZHdDRVlUNzNlQU9qdDlJT04rS1haWEV2ZHd0QmRqT3Jha0pmdUd6VGR2VWJkQzRUZHNXenRDdW5lRTRGdHdjTHQwZWJ0elZqZHdWCit2dHZmYlhzbWZ1SWJUdUlyUjl3Zkx0R3BncUhYMnVNK2pxb295dHAxM1J1ekNxeEdmdVJJbnVTK0txenBIZU5kK3VOUUh1VVptcTFKCitRdDhJSGVLcFBlSXJoZUV6anJBMXZ1VWRudG81ZnRWWXp0ZGEzdFhOM2VWaC9lVm92blE0enVJZzd1SzVmZWFUN2R0cUxtWnNYdWNxCitMdWIrY0s3amNpN2lNUDdmUDNmbkdOdmtnaTU4Ynk3aHh5MFFlQlpzanY3b2tDNW9sc2tZdkYzU3ZhRnBwNWJwbXI3cG5GNXFxV2JvCitDZzRMdkJicHBGN3FqbDdhVnA1U3FBM28vaDNxZ1Uzb3lJWGlOdTdtMDkzblpQN25XUjdvcmc3cmc1M252YjNuZkQzbXAxM21kMDNuCit2NTdtdk41K29KN2lOMTdyaXQ3aUZEN251czdzZzU3c3lyNHE2azFRWlozb1ZUN2hzTUFEWkJEdTRqN3U1Rjd1NW43dTZKN3U2cjd1Cis3Qjd1WmhEa2xhN1V2WkYzaGxmdjluN3YrRTU0aUxmc3N3NExpOUR1QUIvd0FqL3c3QzU2eng3bjBjN3EyUlRqcjI3dHNnN213SDdYCit3ZzVUcTU3cnJVN3RNbTd0MFBYd2JZN296dDd0aTU2V0wzN3gvZDcrOE1uTzhYcmU3Q3QrOEg0dUVOY04zekFmODl4TmhwUWU0K0Z0CiszamlmOHpwL2d1aU43VEhlM2pJZjlFSXZCZklOOHRBT0MvZjk0RXEvOVB4TjgwSyszcjF4aHdZKzlWUmY5WUJvaVB3TzhRUEI0RXpmCis5VjVQRHhGdTlBZ3Y4dEpPOGxwZjdScnZYQ2gvN0xTKzhtTGY4bVN2OERWLzZDYlA2MnR2NlNyUDV5eC82d2x2OFF0UDkybmZZTDZPCis5MjJ2OTIvUDk5OE9lb3EvK0l3UGRtVm45aDF2RHQ4dytaUmYrWlovK1ppZitacS8rWnpmK1o0LytmdnU4NGUrZVkxZitxYXYrQVovCisrTU9PNjJZKzdTVWYrR28vK1BLZTk4RnU2NnZmOTYwUCtTbVA5ckN2WEhjLys0VmYrM3QvKzNIdjkzTy82NzNmYmJMZjJyUXY4YmIrCitUL0hFbnRYR1R2Z1puL3pKOWZ2TUgvek9QL3pRUHhDUzhOUGdILzdpLzlGYTh2VGFyaFkvUU5QcXYvN3MzLzR6L1FQTFArUURRUUhqCitYLy8yTC83UC8xTG1UMUQ3TDFCUXZmc0FBVXZnUUlJRkRSNUVtRkRoUW9ZTkVjb0RJTS9oUklvVkxWNFVTQUlBUm80ZFBYWUVRT0xqCitTSklsUTVaRW1iSWlSSWtxWGI0OHlCTG16Smt5YWQ1TXFSSG5UcGduZWY0RUtSTG8wSlVSaVI1MWFCUHAwb2RHbVQ0dHFCUHFWSVFBCitlcEhBbWxYclZxNWR2WDRGRzFiczJMQStxVDZGT0lyc1dyWnQzYjdGT3NycFdhWnA0ZDdGbTNkdHI0MTAvUUlBSEZqd1lNS0ZEUjlHCituRmp4WXNaQy9TS0Z5Rmp5Wk1xVkxROXUrZmhvNU11ZFBYLytwcXhaOUdqU3BVMmZScDFhOVdyV3JWMi9oaDFiOW16YXRXM2Z4cDFiCis5MjdldlgzL0JoNWMrSERpeFkwZlI1NWMrWExtelowL2h4NWQrblRxMWExZng1NWQrM2J1Rk45SUlDamhEVUVrUWlGeUpOd0wxbmxZCis2ZGYzSmNnWkFMWThDZ2M3eVF4dDFKdjVKSkM4Sit5R3dvU1N3QW5BbkFCUG9Qa0traXV6N2g2RU1FS0tTTGlCb0J0R0lVZ3E5Z2dTCitRMEFBYnZpdktnY0ZZbSt1Z1RZOEVUN3g2aE5SSUNUMit3K2FOMGFCQmhZeG5IQ2lJQk1WZEhBVUoxak13d2tNMndOQURJTDRHMUZDCitKWmRVVWd3QVFrUUNBQlpoeVlNL0V1RWJDSnRSa0VEQ0NmVmFMS2pFSkZHOE1rTnNFcG9yU29sNnFYQWdKTEJ4ckwwazU1TCtBSnNRCitYZnl1UFNjY0MzSkhKdjhFVkR0c0VxeHlJR2dHN1l0TVdIb0pVZEdCL0JUVElFVlJoQWFBR2c5Szh3MHVpeXpva1J3Zm5UTXpKeDR4CitpSVFjQVhqa1RJRkdlY1RQUUYrRkZUb0tWM1dzbDBmWWMzUWdFbFRGZE15K0lNV3lUSUpjbGRQRlVlcWJGRXMvNXdKV1RteU1oT1dOCitTcE9NdFZwcmozUHl2emVnblJYWFlOMGs0UTFxRlJ4TVdNSkVTbGJIY2QxTEYxU0RtUFZWVHF5b1BIWGNhKy9GdHpjRTgxQlZIazNmCitFN2JUTjNxNUZNejRmbzAzVEN3ckxWamRnVm9WSTBwb0gvNlV4M2RGSmJYVGVzVTRrOVZpOHdVNTVOMGV1VkFvalRCVGRGZDczVlhZCis0cFpmem9qWGk0ZGRzMDBYNGFSNVpvSEV1eE1XSlBMK05PcFphVDhXdVdpalk2djBXVWtURFZiaWhwb2xPc1dsQjFvUnpjd2VHUThXCitHV20wRVVlSHYxNzFSNEdDSE5Jb1V6OGw5bWkxMXg3TkNabWxCakN3WHVRRHpPcXBpU3lYYnZYa284OCt3WnlZV0QvKzRPdzVhcGVwCitOaENBVWQxMU11TzAyWVk4Y3NrbnA3eHl5eS9IUFBOWVNlaWxjODk3bVJnbUNUNzNQRUhOVDBjOWRkVlhaNzExMTErSFBYYlpaNmU5CitkdHR2eHoxMzNYZUhYQjdmZndjK2VPR0hKNzU0NDQ5SFBubmxDMDhPQ2VXZmh6NTY2YWNYbm5ua29LRStlKzIzbjc0NjBMNEhQL3pBCitWaWFPYnZIUFIzOHg4b2M3T1gzMzN5L00rMUc0cDcvKytsdGRYemlJYnJXL2YvK2h4NTl6TlBJL0FoYXdlSEx4WHB6K2xLT1U1VEJ3CitnWThqamxTYUkwSHBtS1dCRUJ5T0E1T2pRZVJRY0RrZWhJNEZINWkvNEhEd09DWTBEZ2lUbzBMbm1FVVFDNEJoREdVNFF4clcwSVkzCit4R0VPZGJoREdOWWdSU1FFamxKUWtRc2lGdEdJUjBSaUVwVzRSQ1kyMFlsUEpDSXFmaWhBK01nREJqekVZaGExdU1VZENrSlgzM3FPCitXUlpBRGpLVzBZeG5SR01hMWJoR05yYlJqVzhrWXd1bTJCeWw1Q0lXZDhSakh2VzRSejcyMFk5L0JHUWdCWG5IWE15Uk9SS1V4eXJnCit1RWhHTnRLUmIxekFGeE00a0RFKzBwS1h4Q1FiNVhnbElQNm1qb01FWlNoRk9VcEJGcEtUVkR5UklqTzVTbFphTXBJWkFXTUxIVlBKCitWdGJTbHBvMDVBVXpZMGRTOXRLWHYveWpLZC8rMDBuZklGS1Z0MFJtTXNueFNsaXdzRGxtTVVFYXBEbE5hbGJUbXRmRVpqYTF1VTF1CitkbE9hbE1qbENBZWloamFVMDV6blJHYzYxYmxPZHJiVG5lK0Vaem5WRU00VndrY0E3L0JtUHZXNVQzNTIwd1NTcEk1WlFMRUtnaGJVCitvQWRGYUVJVnVsQ0dOdFNoRHlXb0VlaUpIS1ZFSUJRWHhXaEdOYnBSam5iVW94OEZhVWhGZXRFSVRQUTRFaFNBQlNDNlVwYTIxS1VQCitCUVZBcHlOR1pkYlVscHNjcG5NK0NVeWU5clNYd2tSaGNZeHBVNkt1a3BuT1pBNU5pN3JVUitJMHFPV2JDeTk5T2xXcUJ0T2tLYXppCitNWm02VlVqS3RJS3o1R3BZM2VoVURPb3ZxbFZGYTFyeENOU3lCbWVvWW9WckdvOGF5MmM2NWhhZXdHdGU5YnIrVjc3MjFhOS9CV3hnCitCVHRZdkJianFzVlJDaGhlc1ZqR050YXhqNFZzWkNVN1djcFcxcktMQmNOaEl3Z2ZCaVNBc0o4RmJXaEZPOWhiZURVNlNvMXJhdU9vCisyUXllVmEydm5TcGJpZG1idDZvMnRYT2RwRUJvYVZ1NGtuVzJ2TmtwYklYN1M5bWlra1JhNVcxWWNSdFFzQ2EzdDZ3MTZ5NkhPOTJmCitRdGV0V1hVdVhKYzcwK1ptbDZ1KzFhbHJxVHZlUVJaM2d0ajFMbGUzKzlXQnpHQzA3NFZ2ZkFPYkFPc0djUzRpQUVSKzlidGYvdmJYCit2LzhGY0lBRlBHQUM1MWNFOWYyTkJQa2dYd1kzT0w0ek1HMEl1NXZlcFlLWGp1SWxiNGI5YU41RG9wZkNTMTN2YVNmOFladGFtRG5CCisxWENLOWNqaEQzcVl4RFlOc1lRcCtlTCtvcHBZbHdPUnFvcDFIQXNXSzZlMk5GWm1qTU00WWlEZjBzYmlGRWlPZDV6aUh0Y3psVVd1CitxWkJsT1JCZWlNUEtWOFp5bHJXOFpTNTMyY3RmQm5PWXJmd0pCUHRHS1NxWVJKclZ2R1kydDluTmI0WnpuT1U4WnpxbldRVmxwaTFuCitWeUJtUHZmWnozOE9NeThpUE9RWlF6bVpSOTRnaHBlczRTWjMwTVdHcnFXVTYxcG9TTjhVejhCVjlLTEoyK2lUUHJyU1JoMzBsSFg3CithVXVmOHNMUzFUU1RMNzJiSDVNNms1Sk9xbU9xREdoYTE5cldYaWF6cVU4OGx6Lzh3dGUvQm5hd2hUMXNZaGZiMk1kR2RySjkvWWRWCis2MGFDRE5qenJhVTliVm9MR3BhNWhjVnVYWTFKUkZNMDA2bWVMcWV4K3VSdGcvcmF6S1YwdVMvWjdSUCtmaHZjd2hXM1VEMnQ3a2JDCitlam1vcFhkVG01MGJGTDg3M1B2R1Rhdnp6VWg3S3dmZkEyY2t1NDNUYjMvREcrQzNFVGpDdTNwdTdyYlh3UmZIdUdEcHErc2JDeVFlCitsd1Y1eUVVK2Nzdkc0K0cyVVhER1ZiNXl2VUtZNHV3ZHRjUWJxWERFdXJ2aGFZMzNac2t0ODBVV1BEa0g1M2tiYVE1VlZOOTh1RGxuCiszN3lEcmthZkl3Zm9TMWZqMEZ0YmRLUERGdW5DaVRqVTBkajA0enhkNjJlVWVuUnhYUFdqbjd3MldmOTZHYmx1SExOc3doWnZoM3ZjCis1VDUzdXRmZDduZkhlOTcxL25iRGNoekpzRkFGRUFRL2VNSVgzdkNIUjN6aUZiOTR4amRlOEtvd08yMmVqWWU5Vjk3eWw4ZTgzamNSCis2a25IUE8xUmoveHNHRTcycWw3Ky9ibzcvL3pXT1IvcmRLZmVqR0V2b2MxSjMxUFRBd2Z0bjE5N2NieWVldGpibCtxekwzM29aWFA3Cit0T2VlT0dKOGFmS1Z2L3lHU3RUdmljNk1ORVk2ZmVwWDMvb2lsWWJ3WTROSWxUTGYrOTlQdnZHSFl4WXhHTkQ4OXRNK2JKUnlmdlp6CitMLzJ2a2FEejJqOS82VTBNcWZkV0lQVEQrOXZkUERYcHo3ay9nOHMvYitNLzNmQS9zVHN2QUtRcjFqdTEvWFBBQkRTdW1ZS2ZDWnpBCitBdVEzQ3NSQTk3SEFnTXZBRGhTZjZ0Q0xFQlRCRWN5S2hsRU9hQ0RCRkZSQnR6REJEVnJCRjRUQnIrQ2RHYVRCR3JUQkc4VEJITlRCCitIZVRCSHZUQkh3VENJQlRDSVNUQ0lqVENJMFRDSkZUQ0plU09QS0dhckhFUjgxakFoV0NYWHhuK2pMMzVGcjZaa29Sd0VwdUpHdk1KCitDZk5CbC90Z0VhczRHQXZoRkhLNVFyeVJHeVowUTlPWWxZRzRrQXhoR29Qb0VNQUFFYnQ1R2FnNXc1MTVneTA4aUpPNUUyS1pDMGRCCitrWEQ1RDhESUdJQnhFY0RJUHhOcHF6ZVV4S2ZJbGthY2tpcXB3NExRRWk3eEVqM3NRejZFbTVoWmlPOXdRc05oR1VhRUdZdXhpbjlCCit4VlJKRlowNW5FbVVSYzBZbExHQndrT1JnRXdrQ0VZSkdGaUVHMURzUllaSmlEeDRrbEd3R1VMTURFTU1Ga3VSRXlkb2t3M1prMG9KCituYWlKeEZtMHhwK0lRN1VZQ0Z2eEZvWFlGVS84eFlUcHcxTTBDR09ra2llSnhaenB4VkJzSnNlUkJ5ZEJscjZRUmxqWUU3QXh4V3ZFCitSNlNveEczSmlBcnB4b1ArS0E5eFFaTnlZY1J6UVVWMnZFZUIrRU9GZEVlRE1SK0pvQnNuTkJ0TllROVBFUWlzc1VlRHpNZU5ISXA5Cis2WmQvK1VlQklSajdTQmhnUEVoaFBBaGkvSnQwUEVWbEpJaFJVQlduRUJMMlNKekEyRUpJM0VDTzFFbU9JQmx0YkNiQzhKMXZVUm1HCitnQnFUUE1TM2Vja2hPY2NhUVVhRTdNVklzWkdRMkFpVXBFZWxwTWFjM01tc3BJaWttVVpHSkJPbkljcVNGTWRRckJxQVhNaUJlQU5TCithY3AxZkVxRSthS05NQldDd0VoeXJFYXR0RXVPY0p1WVlCckJtQnZDQUVkejhVdTlpWnY1QU1Ud2dNS3dZY082YWNrcUpJaEtxUThUCitNUkJZd0laRjFCb3BvVXUvdk12TTFNek41TXpPOUV3ZTVCelNBWjJiR0IzUk5KM1BSTTMrMUZUTjFXVE4xblROMTRUTjJKVE4yYVROCisyandkMGNUTjNOVE4zZVROM3ZUTjMvek5OWmdHNENUTzRqVE80eVJPSlZnREpVRE81blRPNXdSTzVXUk82S1RPNnFSTzZiVE83TlRPCis0cHlHTmRqTzd3UlAzaHdXYkFqUDhqUlBBR0FIODFUUDdhd0dBS2lHOVlUUDZtelA5NHpQK216TytiVFAvRFJPZHJBSy9mVFAzOFFHCitaUmxBcHpNRzUzQUVBSEFFQTBWUUJVM1E1akNHS2RTNVJ4blFyaXZRNWpqUUJtV09DMlZRNTNoUUJSeVdDV1c3Q3MzUUJiVlFFaDFSCitERjJPRG8zQTluQ01FWkNFRjRYUkdKWFJHYVhSR3JYUkc4WFJITlZSR0MwWUFCRFJRd2lHSUJYU0lTWFNJalhTSTBYU0pGWFNKV1ZTCitJUjBJRFJXSUdEaitoU21sMGlxMTBpdkYwaXpWMGkzbDBpNzEwaW1OZ1NjMVVXRllnakkxMHpORjB6UlYwelZsMHpaMTB6ZUYweklWCitCakhGMEIyMTB6dkYwenpkVVdBWUNCWFZtaVlGMUVBVjFFRnQwa1B3S3JOZ2hFNVExRVZsMUVaMTFFZUYxRWlWMUVtbDFFcFZWSHJJCitEQjl0UGRkYkxZR0FVbGg0QWlZUTFWRWwxVkkxMVZORjFWUlYxVlZsMVZZVjFTZWcwN0VEUHB5TFZZR0FCRXZGMVZ6VjFWMnQxRXZvCitVNlZMdmZWQ1ZGNGwxbUkxMWtuRjFFY1JVVzNqVkhMQXFVOE5WVmVWMW1tbDFtcGxWVmoxVkJOVnNsbjFLV0g2MUZzOTFuQVZWMkwxCitWWUh3MDBScTFqTVNWc2RJMUhGMTEzZEYxa3hkMW5SOXZWb0ZWV3ZGMTN6VjExWCt4VlpZK05SdDVWYWU4bFlUQlZkNE5kaUQ3WVJ5CitoWVZ6UmE1bVhkZUJhRmVFbGRoeFRWWUZtVmQ2N1ZSL05kRm8zZGVPOVZocjdkZC9EZGpneTFZTUxkaUpSZGxpVlZpR3hWZ3llbGlCCitzSU1wa05tWnBkbWF0ZG1ieGRtYzFkbWQ1ZG1lblZrK1VOYUI4QU0zSU5xaU5kcWpSZHFrVmRxbFpkcW1kZHFuSlZvdnNGZHY2SWFxCit0ZHFyeGRxczFkcXQ1ZHF1OWRxdkJkdXE5UVo3allKbU1OdXpSZHUwVmR1MVpkdTJkZHUzaGR1NE5kc29zRmN6OE5tN3hkdTgxZHVlCiszWU5mSFFnK2dOckFGZHpCSlZ5bzlZTkRaZGVVVlZ4aXJkajJ1RmlNZmRhTi9kakpwZHhydFZlQUhWbGZHbGlUWGR6T3pkV1ZCVmJjCitRMXlJOWR6KzBxWFV4dFZVejZQWHlNVlFqcTNjMTRYZGtOWFd6STB0ZXoxWjA4VmRSZ1ZkMUV2WGw0V0ZpTTNkNE8wRTFIM2MxYlZYCisxNFhkNVAxWTJjVlF6S1hkVWRyY2diaGQ0VFhkM1QydWxsMm0wUlVJNEtWZTB5WGVUZVZVMWgwSTVGWGU4czFYNXBYVjV3V202TFhWCis3ZzFlNjEyUGh1VlUzK1dCQWJEZis4WGYvTlhmL2VYZi92WGYvd1hnQUxaZloyQ0FvQldJZXZDQ0JGYmdCV2JnQm5iZ0I0YmdDSmJnCitDYWJnQkU0RWV6V0hMdERnRGViZ0R2YmdEd2JoRUJiaEVTYmhFdFpnYzdEWHdITzhGV2JoRm5aaHhvTzhraDJJVmhEZ0dyYmhHOGJoCitBTVlBdnhVSUJwaUFDZ2JpSUJiaUlhYmdldERlMzNYZjNQMWUxVTFYOFJYK0NQSTEzeWllVnZSTk12VVZXTnROWXR5RlgzUnRXZC9sCiszaXhXM0NYT051eDE0bnVWNGpPbVZpcUdCZWUxNHZMQ1lqRDIzQzJXWDlmellqajJYREZtMXZBOVhqVG1ZMWRWWXpadTQwQmlYMWlZCitYanVXV0RuR1h0OHRCM3BnNUVaMjVFZUc1RWlXNUVtbTVFcTI1RXRtNUZJUUFBT0doV2pxcDA4RzVWRFdKbkNTWVlISWhpOUE1VlJXCis1VlZtNVZaMjVWZUc1VmlXNVZsRzVXeXdWM0tLcDF6VzVWM201WGVhcDFLR2hUN0E1R0VtNW1JMjVrdE9CaDZHaFhzUzVXWjJabEQrCitwNWN6aTBxUWdtcTI1bXZHNW16VzVtM201bTcyNW04RzUycW1oazIyMklFWUtQQkQ1M1J1UG51OWhpcHc1M2VHNTNpVzUzbW01M3EyCis1M3YreHVkOGR1ZHJzRmVMdXI1L0J1aUEvcWlTQW1ZYkNPZURSdWlFVm1od3pnUmxUaWwxaHVpSUxxaVlrdWJFTmVRd2xsZndkYjB5CitodUkrOXVoUi9lTkExdHczdm1pVVJlUXVQdUl2TG1tRHhXTXkzdU9QaHVsU0RXbVJKcVZCTHVTVmZ0ZVR4dGc2eG1tSmJlbVc1ZWlZCitGdXBYdlZ5YXJtbVM3bW1EMVdsNnBWOHljT3FuaHVxb2x1cXBwdXFxdHVxcnh1cXNkbW96S09CeUZnaTN5N3l3RnV1eHZydSswMWdNCitOWWR2VU91MVp1dTJkdXUzaHV1NGx1dTVwdXU2Vm1zVUJ1WjFDSUM5NXV1Kzl1dS9CdXpBRnV6Qkp1ekNOdXk5WGdkN1hRU3RadXpHCitkdXpIenVvZE5sZk9vanl5dHV6TER1dk5xMmpTVGVxRC9XbklmZW4rb1licG1UYnFVTExwemo3WXBlN2RsRVp0bHM1b0ptN1dvQmJ0CiswUzdxMGpadHBHNXRjVlZ0aDJYdDNIYlh6elplWU83bzJZNWkwcmJ0VXNKdDN6YlczWjdmM2xidWNBWHVKZzV0NHVaajR6NXVRRHJ0Cis1dzVYNXFiakk4NkVTQUR2OEJidjhTYnY4amJ2ODBidjlGYnY5UTV2b1BWcVdIQXZscFB2aTl1NHN4Nklid2lEL05idi9lYnYvdmJ2Cisvd2J3QUJmd0FTZncvUDRHZThXdkFsUHdCV2Z3Qmgrd0F3UG1DMkR2Q2Fmd0NyZnc5ZTdieWY3YitlYndCbk81bi94UXp0WnVZNDN1CisySjV1Nmo1ajY3N3VEVXZ1RWRkVjdnNVc1M1p4WGkxeFBSWnVGTzlqRlY5eFBzcnVHZWRWR0JmZHpkNWVIMmZjMXg1am9ENXhIRGYrCitYeDNmOFJWcmNTS25WQ0F2UGhtSGNrdXQ4WTFPY2lWWFhpWnY4clY2OGlxUFZDbi9PdDg5QjBndzh6Tkg4elJYOHpWbjh6WjM4emVICis4emczOHo3b2FzZWxNbXJEOHp3SHMxeXpiNEZJaHpFQTlFQVg5RUVuOUVJMzlFTkg5RVJYOUVVSDlIU3dWelNyczBpWDlFbW45RG03CitNMkNHQWpuWDlFM245RTZQODFaUVptalQ4MUVuOVN1ek5oQ1hVQkVIODBxOWN0N0xjaTJQM2RydThqN3E4VldQY21YbTRwMm1jbHVQCisxRmIvUE5tRzlTV1g5Vm5mbzFybjlUREg5VG1PY1NGSDRtT1BWMDdPWXl5LzhXQVhkbUFHNUNZM2RtZDNWREhYT2tVKzVtOEg5M0N2CitaRTNtWkFMUWdYTkg5M1JYOTNWbjkzWjM5M2VIOTNpWDkzUCtOd0I3MVFJdXdQZDgxL2Q5NS9kKzkvZC9CL2lBRi9pQngzY3RzRmNoCitvSUtFVi9pRlovaUdkL2lIaC9pSWwvaUpwL2lFRndKN0ZXWngxL2lOLy9aazFuQ0JFQUFhbVBlUkovbVNOM2w1SjRBanB1YUZadm1XCitkL2x1SG1kT1BtZUpwbm53Yzc0K2g0VjIxdWVkNS9tZTkzbDg1bWRnOW1lQkp2cWl2ejZDeG5tRGZ2bWxaM3FXYitpUFgrYnVxL21wCitYejZLUm5VRnNXaHRoMVJmVHp0Z3AvYms1ZkpaejNhdFgxUnVoenFlSm50SDVmcXY4L3F2ZjkydzcvS3hUM3V6WHpxMFQzdEdYWHV0CithM3UzcDF5NHgvWXYxM3E2RHpyZjdZQkxNUHpEUi96RVYvekZaL3pHZC96SGgveklQL3lKU1YxWXNBY3V3dnpNMS93Y2dnSCtlNldGCitKd0Q5MEJmOTBTZjkwamY5MDBmOTFGZjkxUWQ5V3JCWFpZQ2kySmY5MmFmOUoxSUdlOVVEeWRmOTNlZjkzbzk4Q2xCbU1kajg0U2QrCit6YmVISTA0cUVWMk9UMTErRTIxK0ZGVU9QKzJ3RUc4aDVWY081cjkrNTg5KzZFOE82Vzh4Nm44bTYwOE83QjkvN1M5LzdrY083L2N4CitaYm1LR0hUL0YreVA5NWYvRWV3QkFPaUIrY2QvdmFqLys4Ly8vbitML1FjSUVnSUhFaXhvOENEQ2hBb1hNbXlvRUJzQWh4SW5VcXhvCitjV0F2QUxBMndnTGc4U1BJa0NKSGtpeHA4aVRLbENwWHNtenA4aVhNbURKbjBxeHA4eWJPbkRwMzh1enBVeWZIb0VLSEVpMXE5Q2pTCitwRXFYTW0zcTlDblVxRktuVXExcTlTcldyRnEzY3UzKzZ2VXIyTEJpeDVJdGEvWXMyclJxMTdKdDYvWXQzTGh5NTlLdGEvY3Uzcng2Cis5L0x0Ni9jdjRNQ0NCeE11YlBndzRzU0tGek51N1BneDVNaVNKMU91YlBreTVzeWFOM1B1N1BrejZOQ2lSNU11YmZvMDZ0U3FWN051Cis3Zm8xN05peXl5S1JBS3NYVXR4R2UvVWk0VVJNYmpHNmd3Ni9QZnM0OHVTYlNlREdEYzFKcjk5Q2l3OXRycFE2eCtMWWxYUHY3dDN2CitJOXQ1U01BYWIxMUNIbGpRcVBmbURjMzRiV2pZU015SDVsdTZRTnV3Nk51SEpjR0pFN2JobGdkMDJHeTAzWGNKS3JpZ1d0RGNBTXNvCiswQ0JoWFhIalRTY1BMUEtNQWgrRnNJang0SE8zQVplZGNVNGdBUXMyRThKaUloSnZNUGdpakRHV1pkME43MW5uNFEzKzVFMUhvbTRkCitTdEFiQ1JxeEY5OTg5TWx6STRJeUtya2trMDA5TW9xQXZMM3hZNGFqbkZnZGhocXU2R0dIWXBCWEczdzh3dmRJaVVpMDJDU2FhYXBaCitGRFFBWEhtZ2NhTkExNXRRQXZGMm9wd0NHYWZiZmVuMUNDZHUvemxCM29EUVBSam1tb2txdWlpampUcjZhRm4yRWZRZXBKVmFlaW1tCittV3E2S2FlZGV2b3BxS0dLT2lxcHBacDZLcXFwcXNwV0hodHU1QVJIK2lVNTFCdTgzVmdyYjhBVmgyc3ZiMmJYQzY3QTNhZWpyUUZDCis1UVNsRXBBSkM1aXpUbWVyZ0xmWlNpaHh2QTFLRks3UzdRY2dlY0lCeXh0enVJb0huUk4rdWdxaHMwT1JvSitEc2NKNTNiVHc4U3BjCit0ZEhwR0pTM3VHNDA3SUhXanRnVUVnWnVOTXIraU9raGl0UzhQY2E3cTYyK2NsVHJ0ZnR5NjUrVVFIN2JpMjM4M25idUtPbld5ZTZoCisvcjJibEswWTcxa3lvc1hleTFHK3ZKVkhyc0hGL3N0VXF4ekJ1bEhNVFBFcUw3U0k4dXJ3UmhEclNHQjA2ZjM0TFhNWEN6dnh4aHgxCitUSlhBWXJncWowYUkzcWZmamlRZXJOMUdXaEkxM0xvYlNVRHRxMUE5c215Tis5NjQwWFBSelR3eW9GbVBER1YxRzZrWXRuLzNjdDMxCitEU2NpY2NPUkFxUG9NYjZIaHRkMTFjWGRBQ0RXV211OTk5eU5FOGNSM21QRDErNVRONHg0c3hpSkJ5VVB1VytuRFBmb1ZYNWQ5bjc2CitXUTQzMktvVEtqZzJoTE5zdUg3TXdiMjRzWExIUGJuamRKK2VZZC9NQW41NXlFMUY3V3JuY0lQdWR0MlA2NjcrbTlkWnd5cFA4SDlqCit5RHJscnQ4R3UreEZqWkplMkgvLzZUVHF6NU1PT1lMRGNUM2N6VTZGR0RET3RoZUhubnJZRFRtazQ1anpqZ1RaSTBNZUlVZWcwYkh2CitsZWRwVGtuUml0NGp2cEY1YVNPQ2M5eTdJQmNtL2NsdGZXd3JIbE1zVnpOMHdZMEV3S0VnOXJiR3U0TkZNSVNsRzEwdkNOaXE3am53CitSTWp5a08zQzFFQVVOVTlNSTV3Z0JyVUdRTFp0U0RjZ1hBb0I4V2JBNG5oUVBUbmNHLzc4OXp2YzdGQTk1MExmNUZLWW5oVlNwV1ltCisyZys5U0tnaVd2RW1XckRZMlFuVEI4SG1XRXR5VEVHV2hWUzB0cUJZNkZrdU8xa1hUMGhDWEwwQlExQjBISHQ2SVRVSUhla3A2MExDCit6VHc0dnFEOHNHUzZDcHF0NUNoRzdObitDaHVpVXdyOFNKQ2VSK1Joa0d4Y0dTTHBwTEE0M2xFb0VNT0dqVWJZeVQzdGNSUjlkTW9mCitiOVkzUzE2d09vbUVveVp2dU1qNzhjYVJVTEhpaVNqSnl2aHgwV1M2bVZjWXNSVWRVQ1p4bE0wcDVTbW5Bc29IeVlOc3hlRWZDWUJXCit1aVNHYVpFb3JNclpDQWFMdEswUlI1Zzhud2p6ZDBTN3djcVlUcU9VRTNFRHEzSSs1VVBLeXBBemc0S0VVVmlwaGlVY1l3QnpxRVFiCitUa1Z6c1BvYmg0U2lvVzlPMDN5a2U5ZUhnb25IS0c2Sm5VNXhKNWxJWUVlNHpiT2V1dHVUUVkxWUZOMDBVWUFrZk1veWhSZlF6NDJDCitvRWpNNkhaMDg2R09QbEdVREYzblI1MUNUOXNjclZhSTB0eHVlRWRONkoxTGJwWHJuMVFjZEROYlRhbitPQnFTcGdoMzZqUXpxaTkxCitZdFBiQ0tubk44RGhoZ1FsalNsU25KQzJtcTV0UXVpOHFDWC9aOGFSL1JTckdhUW5sNzZWeGFmbTFIbXk3RnBQdFFiUXNwcXdyRlc5CitLZ3RmbGJha3ZhRi9YdDNvanBRNnNMSENSNnJDbXloVlpwcldXcTAxYjIyOUp6NU4xenpyVlc5NGRkWGVYWUVhbGM3NWFwTzllQVFZCitEUXJNbmYwTXNKUmpXbDZKa3FQQVRrdE80TEluTEFrRkxaVUpNNDdiaXBnSlgxWTA0N1FwbEU5NVJQdmV4U3Y2dlBLR1BNdFZ5WkptCityOGZlbGxoV2VZUEJJaml0MkwzV29NbjlvcTNFVU5wZTZsRml1SldqeHB3REFOODZCYmhaNDVVRXFHcy8xaVl5dWJRMXJXN0xkZEIyCit1a21uMEZMdk4vZUdYdXk2Ykx2K25zeHVmS01MWHRTcVo3eG1YUldDRTV5bXNRMkVzRTVwSmtIc0lxbUJmRFVxRXhaSWhRbkQ0UHhZCitaY040bzh1RlNaRGhwNFI0eElJcHlQV29nbUs3UUhnZ1ZtbXhuaFFzNHhuVHVNWTJ2akdPYzZ6akhmTzR4ejcrTVpDRExPUWhFN25JCitSajR5cDZZVUZBbTRpQ1A4UTV4VVJJSWJxbTFFeWhtcTJ1ZEFnZzBCRDRYS1ZHc2NBT1JCTlpHUXg4cGovb2g4TzVKaVR6Ylp5YU40CitBd0Q2ZXFXUlZCa2thZnZkUm03UTB6Yk43RjVoanNxWlAzTGxPb2VreW11KzhrZTJmQlFxZDhTb0doa0pidWpjRVMwYmpORkR1UUVBCiszbllraitBVTBTREpFcVdORWlTUmlEblVTTVlMQ1lxbjU2QUVDY3BDK1JDbmthcm1MbGZ0endMK3hUSkhMTTFrTG1mNXltOTRrNjBOCitIWlJnNXhyWEpQajFySWVTQjQ5RUY1QnBFNE5XaFQwVVc4OFQyYTllV1I3YURJdEhQTERWMG5Zem5MVkZGRXNYKzl2RFByU3VvV3NVCitSbnRrV1lQbUNMR0pEZThVSC90RTVIYXlSMWJXT1RMeEQ5bjNkclYvMUwxb1hGczZTTEkrdFZzNGF6Y0FSRGZiVmZzM05xd0V5Q1RKCisrOTBWL3plNTZiTnVqVkNOVHVhTzk2SGZQZTlrQzBYUHE5N1hBenYzbm9xVC9EYmZmTVNoQmI2aWU4a0R6aU1QaXB6ZTgyYWtZcnpXCitJVys1eVBmendGdFhHVmhYSWpmSWlaTDBmMjhiRzl3bXpzcU14ZlNNRDUzV3ZiNDV3dXVDRGYxa080QmJmeml1RDNUMHNKL2I2a0FQCitPc0FMYkdJdlp6clRIMS8rODhYRGJ1Q0tJNEhoVExhWnU3dDJJcFlUTzcyd2haQ3I2ajZpZ0QwQ3kvS1dLTmFKcm5pK294dlh2UzBLCit1MEYzS0tURC9lZnhCZzdUQjhYbmhjOU1ETytadXVNTnZQR3JWOW5FV1hkTHFnZW1ONWlEL1NnYUwwcmN6WjMyMmJOODBGU09ZZElUCituM1lTTEt2aWQ2Kzd3V3JQZU5MelVObE4vZy9sSkdyNG55TnU3V1NQdk5JYkw1VGFSNzV6NmFGODJhZE43Nm1SZmZNUll6cmFhYy84Cit0QmVjb0tkL2k4TGZNS0xVTXhyOC9SNi9TRnhONXZEZm0vb2MxMGpBYkpON1FuK0VQSUdPczM1VTNHcHQwNkVJWDBqb0JySGRHeVZoCitTM3Jjd0xLQWpzalZIcFBsM2ExOW1zVWRvT3pWSC9OQlg3MWhIN3hoNEtTQmhJNzhtM24rYlZ1VGdkLy90VjcyUVI3QmlZU0RuUjliCitCRWdlQ0V6TjJac0tDZ1ZvOVlMcG5SMzBLUjd4UGQ2NDNWL1gvTnIrOFNDdWpZTEF5RnZkaFlRTFVhQUVZTWp3eGNyUTZkTitXSW1CCit0UWlvNlY2R1lBTTJqQi85K1Z6MCthRGFzYUMwT1lFcDRWb1JZcDBFR05pL09VRklwTWZtNVpwdGdCNGhpUjRabHB2ZHZCa00wc1VqCis2Sm1Pak5xbi9adVJKRVhzR2FIWm9kem9XVnFPRkdFaHl0K2grZDNDWmN3REFkL1p0WnpIMlEwVmFoZnllVnIvQVYzTlVXQVFtbDBVCis0aUVpM3FHdGRZNjN2VjBZanR5OUFlR0t1TW9sYnBQL2tWM1F2ZDdva1dMNDdXRmJ0SWt0S2Q2OUNaNVNGR0lqa3VLdUpTS1d0UWdqCitoaHk1OVdCMnJNeitEVHlJczczSGM5eE1GRmFicjBpQWczRWhLRnFhdkRrQktJYmk0bG1lOUltTnpJa2l2WG5FQ2xiaTBvV2Rid1FGCithQ0hPSStUU0czd2VMYVlicjRtaHBjMFRGZXJpV2poQjFiM2IvL1ZDQ2hxRk1NWmZRSEtpb2htak96S2lRWVplZW9nRUE3aGRyTlJYCit0Y1daUlkwRUZOcFpoUVZQVVFSSmhuRmpvWkhhSFY0ZFJvYWdvQVZhUXByaW1ybGhPcFlrc2MwSEowYUUwOVZocGJraEFIUmFDczVpCitvdDBqUG9ZRVIvSWpVQWFsVUE0bFVSWWxZQ2lYSVlYRjBaU015WFRIVXBiTUMxNkZ0ekNsK1NIR1UvYU1VV2FsVm00bFYzYWxWMzRsCitXSWFsV0k0bFdaYWxXWjRsV3FhbGN2d0VXL3FFRjJKR0NyYWxYTkxFVzE0R0lNNytKVjdPUkdvQUFKQmNoRi8rSldBMnhDalVubVpRCitUVWtGSm1JbUptSU9abDFhUnBBb0ptUkdaa1ZreEY1V1pXWlFUV05XQm1hS3htYUdSaXFDeG1lV1JrUndKbUZlWm1uQzVXbmFKUzF5CitSbWlTeG1pR1JtZUNSbXgreG14NlJtdDJ4bTJLeG12Q1FnY3dnbS8rSm5BR3AzQU9KM0VXcDNFZUozSW1wMjlTUUxGbEptWEU1Zy9zCitnblJPSjNWV3AzVmVKM1ptcDNadUozZDJwM1QrUUhPS1JpcUtnWEtXcDNtZUozb3Fad2RRem1xR3htNWVRaWZFcDN6T0ozM1dwMzNlCitKMzdtcDM3dUozL0dKeVNFSjJ3RzJ4TXdBWUVXcUlFZUtJSW1xSUl1S0lNMnFJTStLSUUrQVlDQ0pwYkpBejMwSjRabXFJWnVLSDllCitBbnRXSmtmK3dDZUhqaWlKbG1oKy9pZmlPT2RreE9hQVFxaUx2aWlNeHFpRFNtaUtpbWVGWHFpSjVxaU9qcWlIN2t0N2dzWjc3cWlRCitEdWwrb3VpVnFhaGtzS2lNTGltVE5tbUQwdWlSMm1pdTRTaVJWcW1WZGtLUDdzZVBma2FRWHFtWENxbVIxbVpuS0ttVGxxbVpMaW1VCitpaWxyM3VpWHRtbU9abWx1dXVlOVdNTWcxS21kM2ltZTVxbWU3aW1mOXFtZi9pbWcxcWtDVENodEJwc1B2QUNpSnFxaUxpcWpOcXFqCitQaXFrUnFxa1RpcWkrZ0NoMmlhV01ZQUNCQ3FuZHFxbmZpcWdXc09Ib3NadUxnQTVuQ3FxcHFxcXJpcXJ0cXFydmlxc3hxcXNubW9MCitYT3FZQmxzdXhJS3U3aXF2OXFxdi9pcXdCcXV3RGl1eEZxdXU1b0t0cm1uK3JxM0NyRGFyc3o0cnRNcnFBb3pxYVpScXRGNHJ0bVlyCityTlpxalFab2l1V3FzWWFydUk0cnVSSXJzbllyaFM2cnRxNHJ1MkxydFBvb2lHNkVxYllydmRicnRpYnJac1FtdUpZcnYvYXJ2d2JyCit1VWFwWjFZb3M5cXJ3UjdzcWI2cmxzWXJMUGpDS2p3c3hFYXN4RTRzeFZhc3hWNHN4bWFzeGo2c0VlQnJZUVliS1lTQ3lJNHN5WmFzCit5WjRzeXFhc3lxNHN5N2FzeUpLQ3gyWkdLZ3FBQld5c3pkNHN6dWFzeHZvQ3RackdiaUtDRkFTdDBBNHQwUmF0MFI0dDBpYXQwaTR0Ciswd2F0RGNRc2FxWllObndCMVZhdDFWNHQxbWF0MW00dDEzYXQxMzR0MVdZRDFLb21Sd2dBTlRRdDJxYXQycTR0MHlKQ3o0cm12WWlvCittODcrN1lhR2FXcGFCcG1lcWQ3dUxZT202ZDFXUmlwYUtOME9ib2JDNlpaNlJwY1NydUtlNk5qaXJZRHlMZVJHYm9INkxaSkdSdUJTCis2ZUptTG4wYUxzUEtyZVorYmlmWWJlVkNSdDVLcnVtYUtlVkthZGRnTHVobUx1ZVM2cjNJQWdMTUx1M1dydTNlTHU3bXJ1N3VMdS8yCitydS9PN2dRMHJtWUdXeDBFZ2ZFZUwvSW1yL0l1TC9NMnIvTStML1JHci9IV2dmQlNSaW95d085bXIvWnVML2Yrcml5OHJXdmV5N3dpCitMUG0ySzdjS3JHemk2cit1TC92MmE4Q3E2WElRYlBuTzc3b3FiSndDcWZqU3IvNWU2L25DNzhkK2Evc0dzQUNiYS9WT1J1QVc3UDRtCis4S3phNytGMmhyVXFNQVRmSzdvV0tnQVBzQVZmOExFV3NHUWNjQVQrZDNDck1qRERqcThIanpBNTlPL2ZQcWY2WXJBS0IvRDduckFCCit5eThKa3pBSXd5NUh5RzczM2pBTzUvRHVCdThFZTBac0ZxLzBCckVRRHpFUlF5LzE5akJ1WnFvT0x6RVQ1L0Qzd2lzTmI0VG50dTdpCitpaTVwcGxpTG5xNFdOMm5xRHV5VVV2SG52bTYxeGkwWWE2NFZleXRIWlBFV3J6R01kbkc2cm00WnV5NzRqa2JpeHZIZ25uSDZZakViCis3L0dMdXZGblhLNGRLNjRZKyt5OUFDM2JIaklpSjNMU1BpMFNjMFpzVGkzWVJySWtUeklsZTYzWU5uTDhsdTNaS2pJbmQvSWh1eTBVCitqekZIT0t6T2xySXBuL0xGZGl3bS95OUhoS3pMdmpJc3g3SXNzeXpNcnJMTVlobk5vckl1NzdJcDgyd29FekpIaUhBTVI3QUpqKzcrCitZK2pyQ2lmeityYXdNVHNHQncrekI4K3dLTXNyTkh0d01WOHhSK3lyTW0venVES3o2bVlJQWxlekFrc3pNRk96T0VQd05hUHhSbWd6CitON2N6QWRzeVpqenpPU2N3T2NNdFIwUURKK1N6UHU4elAvZXpQLzh6UUFlMFFBODBRZWR6SW1od1pNVG1vVklxUXplMFF6KzBwRm9xCitQSlB0UmpBQUx4UTBSbWUwUm04MFFVZkRIT3NtR1FmeUhTTTA2VDR1SDUvMGs1TDBZd0N5U05QdElOdXpGTGMwM2VJeEJhY3hTdCswCitndm94cG42eFRMdnBTNGR2aVBhMG05SzBENXMwVGg5MWhLcTBNN09wVUgvcFQ5TnhTRGYxbFJMMXJlb3hVaU8xVGljeFQwdTFsVDQxCitTSE9FT21DQldJODFXWmUxV1o4MVdxZTFXcTgxVzdlMVdPLytnRkkzeGcvUEFsM1h0VjNmTlY3bnRWN3ZOVi8zdFYvL05WMGZNZnIrCitNWmJ4Z1ZzZk5tSW50bUs3dFRwOHRKd0c4endyY0RybmNUYTdzMlcvODJEdmROZUVjMlRQYnowRHRUbDNOdjFPZGsydjgyV2ZOckI2CitzeGR2dG1qcjcyZEROV1MzOXZ5U2RsRlhNR3JmZGdaUHRHUENzR3lUNzJ0L2RXajM5c0hTZGxWWE5tN2p0bXEvTVRnTHQyODdOdjV5CitoRFhrZ0hSUE4zVlh0M1ZmTjNabnQzWnZOM2QzdDNSalFsd3pSbXpxUWdPVXQzbWZOM3FudDNxdk4zdTN0M3UvTjN5WHR5NkU5MkpjCityM2ZmTjM3bnQzNTd0NmorTWt6RHdoUnpOWmpTdDJLVTdsV2pkRllyS3h3TGVKVjY5V1BITklNVEtWVTdzbEVmT0lJVGVHTCtzSFNFCitDNm1EUHplRWIvaU9UbmkrVnJpRjgzR0NaL0tDZzdpT2RqaVhGckludnppTUx5MGpaM1p4YndRa1Z6S081N2lPYiswbDA3aUN3NExaCit4cmlRRDduUWd2TENSakVzZ0FJdkx6bVRaNndxKy9pSXAxZ0V6REtWVjdtVnIyd0VZRGhpekd6Tk5ybVhmL25EZ29KenQzaHNNN2ZCCitFamVGMi9aeG4zWnlFN2E2bXJuQi92YUR3NEl3d3ptN29ubVVHL2VhczdtV0g0WTgyM203eXJtSDB6bWcxeXVlczdKcDd6bWY2emJnCis4bmFoMSsrWUkrNjk0RE5IVjdxbFgzcEFIelNqbzNDS0xUUkVmenFvaC9xalNqU1VhOGIxWGpTbXA3cXFWN3BIK3pkb0E3aUtoM2lmCitHNGFCbHpnYm43aXBNM1dzbXlpTFMzcFE3N3FKaWpqK29zT0NHdHY2cmM5NllXZzRzUE5vcER0d1ZDODdod3E3YVZxMXNlOHhydC95CitWa1A3aHZhNnMvKzZ0dGN0c2hOR3JWZjc2VjU3UE92NnR4ZHVzM1BHYnFKRENMdzd2TWU3dk04N3ZkZTd2ZDg3dnVlN3ZyODdNNFQ3CitZTVNtT3l5RHdBODh3UmU4d1I4OHdpZTh3aTg4d3plOHdMdUR2NTlZWWU4N3hWZTh4Vi84dnFQRHVtL0dBei82dWg3NnRPdTVvcnR6CittMnYyY25zOHBMczZiQWMzeXZOdnhBY0dNbys4WlplOFZyTjJ5MmVyb0pNNXk5LzhzNEo4MUlxOHpHOHp6Zis0UEhBMnp6dHJ6dnY2Cit6aC85clByOFpjUjgwSFB6MEtQNHlUUDlzeVo5dDIvRUlId0ExM2U5MTM4OTJJZTkySTg5MlplOTJaODkxNFAzcHEvK2FMREpnTnUvCitQZHpIdmR6UFBkM1h2ZDNmUGQ3blBkeS8vRkZtS3RyL1BlQUh2dUNqL1NCc3ZHYlVjYnIzcDdULy9FWVVPN21YTzkvL2hiSW5mb2NhCitmbVlnUHVYcjUrSS9QWWsvdnVtYU8wVm5DT3RtZm41eU83cy9PK2t6N3RvbmFlZDdmdVNDL201bmUrcmpwK2x6L0wyY0FRdmt2dTd2CitQdS8zdnUvL1B2QUh2L0FQUC9IblBncEV2bDhBUERJc1AvTTN2L00vUC9SSHYvUlBQL1ZYdi9VdlA4U3Z2dVhpc2pZVXYvZC9QL2lICitQL0dmZ2VWanhtNHFPWmluLzVJL3VmK0cvRVpNK1pYSHYveFRlWlpyUDJSd3Vmcm52eTZMdWNvRE42RmJQVUNRRXppUVlFR0JMV0FsCitsQWRBWGtLSER5RkdsRGlSWWtXTEZ6RmFYTmorTUdHdVdCOUJoaFE1a21SSmt5ZFJwbFQ1TVpmRGpSbGh4cFE1azJaQ0VnQmNyaks0CitrMmRQbnorQkJoVTZjSUhEbXpXUkpsV2FGQUFKaHd1R1JwVTZsU3BQaEFvWkx0VzZkZXZMaml2QmhoVTdWbVZMckJ5NXBsVUw4NmhDCituVlhoeHBWcnNLaE5uR3Z4NXMzWTlPbGN2MytuWG9YbFZXL2h2SVE5a2xXOG1QRkpzNE96R3Bhc3R1M2d0NEF4Wjk1WkYxYmx5Wi9YCis4azJJTGtScDA2ZFJwMWE5bW5WcjE2OWhsMmJtTWpKbzJ6VUp1MXUybTNkdjM3K0JCeGMrbkhoeDQ3dmQwVVo3bXpuYnU3RDR4SlkrCituWHIxMk9pTVBtKytmYVpvV0pjNmhSYy9ubng1OCtmUnAxZS9ubjE0U01xNXg2OUkrQWtUKy9meDU5ZS9uMy8rZi8vL0FRelF2aWZnCitrODlBaUNxVGg1NzJHR3pRd1FmWnV5UzdBeW1reUR2d0lNeFF3dzNUZSsrc0NpbWtUOEFSU1N6UnhBQUovQkJFQXhOY2tNTVhZY3hRCitRcnRXckJHV0MyUE1VY2YxUElSc09SdVpFL0hFSVlrczByOFVmUVNTdXhaM2JOSko4V2JzVERzbDVjUHh5U3R6N0pFd0ttMFQwc2d2Cit3VHdSeVMyNS9JeEpMTkhrTUVyUHl0ek9PM1dzaTFQT09WMUxwTUEyUHlOTWwrUDQ3TlBQUDQzVDVVNDhKYXVNQVdib1RGUlJPZFdaCitrRkEzblVvSUtzMG9wVlF3TWg4OXJMYkVHdXZVVTdJZXd6VFR0Uks4ck5KVC9lS016VkVuODI1U1ZHR042OUxhV01VTHNVOXh6VFdsCitVR210bGJMbjVERTExbUdqVW5WS1h3ditjNVhZWmFPYTlVZGt1OXBVMTJtcEJZblhaNkZkcWxSbXVRWEsyR3dsYzNXVmNja3QxOXh6CiswVTFYM1hYWmJkZmRjWTBZRk55bENKTW1sSHZ4elZmZmZmbnQxOTkvQVE1WTRIdWxrWGZlcEJLMDROMkZHVzdZWVhlL1BUZ3Y3OFNRCit4K0tMTWM1WTQ0MDU3dGpqajBFTytXS0RKYWFKTUpGUlRsbmxsVkVtdVdTWktrT0M1Wmxwcmhsa01SeDlPUzN2ZERhNTE1NWpFaFZvCitqSVFlMnFKVmpjWUk2YVJsNHBucGk0cCtPcUtvcFg2STZxcHB4UHFpcGJXdXlPbXVJYm9hYTdHckpsdHFyc0dXTW0yWUFHamI3YmZoCitqbHZ1dWVtdTIrNjc4YzRiMjdVWHl0dnZ2d0VQWEhDNDkwNzdwc0VSVDF6eHdOZk9pSVRISVk5YzhzbitLYS9jOHNzeHoxenp6YUZwCitQQ0pvTmc5ZDlORkpMMzN5emoyMzJ2VFZXVys5OU5SaGoxMzIyV212M2ZiYmNjOWQ5OTE1NzkzMzM0RVBYdmpoaVMvZStPT1JUMTc1Cis1Wmx2M3Zubm9ZOWUrdW1wcjk3NjY3SHZYUXdBVUU5b2xCc2V5Z1AxaFpDSzI2bXMrbjdiS2ZJaGd2dUc3aVZDSHdBSkhtTG9jTUxUCitkN3VoL0FIb0JlY2JzYlU5OEQwRUNhTjRBd0N3RWFrYndhMFhDWEVmL01MMlFQNjFUWUZHZ2VEVWprVVI4ckV2V3JCNFgvWkFtRFFuCitQT0loYjZCZlFyYkhFUTQ2SkE5T2FOc29rR0NoWjhsUElpdDBJRWNLK0lZWVRrUitPblJJYlZab1E2dzRCQWszYUNBQUpYSzRIY0lDCitDVTRZUmVmazhRWVNJakVpa2NuKzRSSWo2QkJvT09HSU41eklGaThDT3BpUVQ0eGMyV0FYUTVqR2tqM0NDU3dFd0JKN0VSa2JRa09LCitzTmdpR3RzM3cvMWxVSWkwNmtVRjh3aVpQLzRRTFVIa28zYlk5ek5ZbU5DRVJrR2pCTERoeFNvdVo1QTExRTRldEtQSXpnQ1NYaG5zCitaRUt3OFQ4MWpoSmMwT0NlVFFiWW1VZkljVXBpNktJUUNUbEp5RmhTbGc2QnBBd2hzNzMvQVJHUmg3UmFKS2tZdmpkK3p5RWpKQ0JICitGRW1yVzlLU2hXalVKRFlhSW9iSFVaQUVCMXpmWGFxSndQOWxFeHYwMitCZEhvRU5CT2FoZ2Y0VFp6Y1Rrb2R6NWdHRmNjVEdLTzR5CitDazZTa3A2ak1pWXNzTUZPV0lnaGtxeXNDQW1BR1Q4OXpoS0R0UndpRC9mWW1TUHkwbXErVEVqK0FaSDVMR0ppY29lYVRPWnlZRWxRCitPNUlBaTRwRXdpa1hNZ3BZWVBJR1NNQ2t4WENTUWxnOG9vSHl3RWJuanZMTmxiNTBwVzI3VVM4Nlo4REJ2R0dQblhOQ1NiY0lUanpXCitrNmlFWXVNKzMxRE1odmhUSWprVVpSWGZ0dEE5RWs2anNhUU5Mc21IQkhReWxEWnd3OHJiUWluSkV1cXpqc0ZzSDl3aVJhdU1UdkNFCitZbTNvUWFuSUVQSnQ3eEZZbkpCTTBaa1FGOTdvaE9TVHAwTnVRSUx0b1U0Q2Q4bG9VUkVMcEkrQ1RxU2RHU0JURWZTR0ozcHRvTERzCis0M0tXS1ZDQ1J2R2poZXdsTTVsNGc4YjJDcE52YXlNczdtbEJzMW8xSVpuTjRrTjF5dHEzYWpReWNyMExPUUhnQkhhSzRRWnY2RVVjCitaMG0rMnNDVGl1U0xvL3IrT01pK3d5YVd1U0M2UVRqMWVkeTNWVFVoTjNEQ1V4RXFTOHNleTQvejlDSUhBOHRWdU03V0psS0Z5Q2dhCitPOUpUQWxTWU1iem9ReXBaMEt2S2RyNGNyQzFLSVlKSk1id2hVaklsWDE1aEFWeC8vdlVocGlTc1lUM1pYQVVmQ0pKSnJhVU44K0RECitpL3lNaHZLdEh3NE5hTmNMYXhRSkIvUXNlVUZNQXZNUzhRMzZURWdkdGZwQmVUZ2hyZGl5WW9ZbndzRUNwbksxUDhTWmZTTkt2bkJDCitrWHQxaEVZY1pZWVQ4Z0cwYzZ2RWlUK2p1RCtlQmhpb2UxM3BVQmNjWmZsOE5MMGJob3o2N3VjMlhBWnlnaTFGNndMZDlrR3NhbWVWCitIKzZxK3FvYXhjN0ZUUUlPZHNnb1RwdERCQ3BRYmc1OG01Z3RlZWVPN2syM3RNMHhUZ3IrMkRaMFFuTE9iK0Nwa0xFcFRoWWZXWVYzCitJWFJla1JCSEV4NXhGRk9VOHFVeGJiUkhlSmNyWXVoZW01ZnloZ3RtbXRTbFJsWVREVU5rTzdKWUtSS29zcWxoamFmZnpucldreEV4CityWCtMM1pmaHV0WkplY1NvdVlLRWJQSlh3ekFyZHF5Um5XeGxMNXZaelhiMnM2RWRiV2xQbTlyVnR2YTFzWjF0YmZPYTI5MzI5cmZCCitIVzV4ajV2Y2JZV2RLOG1kYm5Xdm05M3MxblhqME4xdWVjK2IzdXJXSFFMcm5XOTk3L3RyalZzSUYvY2RjSUduMjRXRkE5dS9CNTV3CitoWGRiblBmbWROcjZ6VGROcHMxc1Q2czQwOUFHdTRpdmJlTUhuN2pIRGQ2MWl5Y3Q0Nm5yT05oT3JyV1JHMjNsUTJzNTBFcnVPZStNCitRQkkxdC9uTmNaNytjNTN2bk9jOTkvblBnVzd6N3FWOGJMV0p3U21Rbm5TbEw1M3BUWGY2MDZFZWRhbFBIZWt4Y0JuRmF4TjByVytkCis2MTBQT2pCeWRqdnZNQ0pOWmM4UVBkQkM5TExWcGo1aGN2dmIvek9tajR1OE5wQXcrOTBidEtZRXgyN3NlUGY3ZXREK3c0ZlRIUzF0CitoL3ZoRWM4RXVZZGM1WFgvKytQUG8zZUhPNFRza0xlOGVBTHZ3TUUzdnZDSjkvemJGejg3d3RqOThwZVhmTzc2WG5yTFovNUdteTk2Cis1ejhmZXlPRlhuYWpWNzNsVDQ4Nzc0akNCYjMzL2UrQkgzemhENS80eFRmKzhaSHZlejRJWHZTMW9RTUhvQjk5NlUrZit0VzMvdld4CituMzN0YngvNmRMZzZ5QjBDaHVTUG4vemxOei95VFJGMjIza25CZFZ5ZjY1Q2tYYisxNjhkTGEvcTF2MEx3cG1YOTR3d2szai8venZsCitNV0t1Y2RnUEFBMVFNZUtQK1dxdk51d1AveHhRLythTzh4ekMvdzZ3QXNGQ0FQZE80eFNvL1N5d0ExRWlBVFd2K2VyUEFVbFFJQ0NRCis4VjV2QWoxd0JVc0NBeWN2SVRpUUJXWHdJMEN3OVVTd0wwcndBYitQOEZSd0JtZlFCVkZQZ1VTaEZvaXdDSTN3Q0pFd0NaVndDWm13CitDWjN3Q1l1UUFSUXdkZ2lqQWpUaENyRXdDN1Z3Qzdtd0M3M3dDOEV3RE1Yd0NpdGdCeVV3SWJJQUN0VndEZG13RFord0FOU3ZkbEx2Cis5djZPOWRST2FyeEU5dlN3UkdpUENoMlBEdjh1OThST2dTb1BFUEhPRHVjUEQ5bHVEeG1SUlBvUWRtelBFUEZPRU5lUEVDWHhFT1h2CitCaFBDOEJyK3NSUDc0eEZUSnhJdnNld29VUTRWcUJLa0lCVlZjUlZac1JWZDhSVmhNUlpsY1JacE1SV3BRUUNtRUJKckl4dStvQmQ5Cis4UmVCTVJpRmNSaUpzUmlOOFJpUnNSZXp3UXhUTUNGc29CYWhNUnFsY1JwcE1SUGlrSGE4UXhrR1podTVzUnU5VVdCQUFCZERjQUhSCit3aEFlNWh6Uk1SM1p4UkNZa2Y0Y1lnTytNUjdsY1I0QkpnS3VjWFlLMEFkbHNBYnYwT0lZTUFkMVVFWDhFQzBvVUI5WEVBaDFid01OCitrZ1g1TVJIOWNRUUI4djVPVUJOaG9TQVgwZ0lSY2hBZElnWXZzZ0lia2lJYk1DS0paU0xKc1FjN3NnSXpzaElkQWhXR29DVmQ4aVZoCitNaVpsY2lacHNpWnQ4aVp4c2lWZlFRckhjU0Fkb2d4U0lTaUZjaWlKc2lqK2pmSW9rVElwbFhJcG1USW95NkFkRlJFdGppRW5xYklxCityZklxY1hJZDdsRjI1bkFVMFFRUktaSVRQWEVzOFFNVVBVY1V2UkpMU2hFYkxURXR2eklUUzNJVHlYSXV5eElxSDlJaFNNOHRyMlF0Cis4YkV0OWZKSndESXVZVUVzNmRJVHpkTGYvdkF2bllRdnVkSXZGWE5IQXRNbjViSXc1L0l3SlE0dDh2SXhkWVF4K1U0SXgrRXpRVE0wCitSWE0wU2JNMFRmTTBVVE0xVlJNMGw2OG5kUkV0NktBR1pITTJhYk0yYmZNMmNUTTNkWE0zZWJNM1pkUDdCUEkxdzI4MWliTTRqZk00CitWVFA5c2lZaE4vSWtMZkFqQlRNa1JUSldTRkl5SzlJNVVYSXJPN001c2RNQW9kTTZwWE02VWFVNmhUTWhMTEk3M1M4bFRaRTcwZlA5Cit2clArUEdFaFBNV3pVc2d6Rkd2alBOdHpXdFNUTGRrelA2bmxQZTBUSXVkeldPcnpMTy9UUDlOVE96WFFJWTZnQkJ6MFFTRTBRaVYwCitRaW0wUWkzMFFqRTBReCtVSjIxUU1CWGhBVUEwUkVWMFJFbTBSRTMwUkZFMFJWVjBSVUZVRWV5U2FRaWpDRFIwUm1tMFJtMDBRK0Z3CitPVFV5SVFwUk0zTWtNdUdUTUNtVEVTMFQ2ekRUUjNlRU14ZVVSNUZVUjRBMFFCMUNTSWRVRDRzVS9CSWlNNXRVVFJUVTVCd3pTemZrCitTUTBVOXFhMEU2dVVCNi9VUzJGRVNiblVJUnJCRXR6MFRlRTBUdVYwVHVtMFR1MzBUdkUwVDkzMEJNU3hRNjB6RGxnaFVBVjFVQW0xCitVQTMxVUJFMVVSVjFVUmsxVU9QZ1JaT0dNRTVBVHltMVVpMzFVdlArbEFpMlZPWVVTQnZwOFZOQk5SN0RNUmVoTkNITVVSMVJOVlhQCitrUjJEczFSaEFSNUROVlpsdFI0M2xRQVZFa0gvRXk3QmMwQkhFbEpaN2tCeFZUOXJsZU51TlZqaFQxZmhVejU1RlRNS0ZERUowbGgxCitaVC83c2oraHRWTUFORXh4Y0ZuSDAxZGREbGlyMVZPa3RURlhraHZJdFZ6TjlWelJOVjNWZFYzWnRWM2Q5VjNKZFJ3NHRCOWh0RGJLCitJQVB3TlYvMWRWLzV0Vi85OVY4Qk5tQUZkbUR4OVNsYkZWc1Q0aGpnZFdFWnRtRWQ5bDMvWUZnaHJrdlJGRUxBMUZtamRFd05rMXVCCitCaTByRmtMVWxGTXA3Mk8vRkZsZFZVbzExdlBLOUF4aEFVdEpOdThrRnVVbzltWGI0Mkl2TTJOVGxrZzVsdjhTazJaaFZrZFZra24rCitmZFpCYk5aSWNUWm5xWFJuZGNaamgzWTlRdFpXeC9WaHBYWnFxWlpkNVpWVUVSWVc3cFZndWJacnZmWnJCZFpnazBRd0ZiWnF6ZlpzCitwVFppZ1hZOVlmQmJQK1ZhTVZaU3RCVldtdlZtemROdHdUVm11eVlmOFpZeDROWnU0M051dC9WZzQvWTYrNVl4d25VNzIvWndGK052CitqVlp1QlpjK2xmWmwrbzl4RnlOeGx4UVdQSFZXT2JkelEyRlVYZE5WVDFWVlNiZDAxNFZWeDlZNllkVnpXVGRVN1hGdCtUTWgyaFJUCithYmQyYmRkTytSUnJDeGRRRzdWM2ZmZDNnWGRSSDVWd0FYZFNiL2Q0a1pkMk5SVjJwMVZvbTdabVRUWnJVUlpwNFc1bG03RmxuNWRCCitucFpZUnpaNzJhTm9yWFF3cVRkcGlmZHhzZGQ3blZadnRhYitLOUgzUE1EWFRNVjNmR1BQZXQzeFROczNQYlozWWgxaUNOMndmLzMzCitmNXR3WGgyeVh0SENDc2Z3Z0JFNGdSVTRETXV3Zk1NM0RRRTRnaVc0ZjNOVWJZS1FXaTBYTEJ3M2ZKVTFjdU9pYnMwWFB6TzRMTlFYCithL2gyaERVNGVndTNnejI0S2tBNGZFVVloUjJqaEt2bWhHVTRKVFlZZmxtNGhhZmloZUUzaG0rWUpEQjNUUmMzaUhGWWhRRjNoM200CitXQ2EzWkNyWGlIZUZocVZtOTVDemlxMzRpbE96TmYwVVBtUFRONzM0aThFNGpIa1RPRk1YUHNFQWk5RTRqYTFZT1MyWU9aMzNmczNqCitmVmwyZXVVWFRPZzNLdkVTanRFamYyVzJlL1c0UE9UNGV1bTRqbWV2aVNXR2FmKzRFL2g0YjJmMmp3TzVmdU9Ya0JIdmp1LyswbjRUCitlVHdXZVgwYldZOGZHWThuVTVJUGo1SUpPSTh2R1pPbCtHbThneVd4Y3BWWnVaVnJjaWQxRjNDQnNpbHB1Wlp0K1phWFVtejNiMmxyCitZeXBkK1plQmVaVzFrbm5GdFlpaDJDUnltR1dWZUltRndvZFpGb2lQbVNWT21XbHNPSnBGSXBtdmQ1bVoyVnNNK1dDZTJKcUZlSnFUCitwcHJCbVFhUjJIeTFlWnQ5d3BtdkY1cWplWWhGTmlFMnQzWHBXUjVCZDR0RjEzVDFlWi9KQlhWM21YSnJZM1hyZWFDNzhYWGJlRWRoCitBUldwY2FFWnVxRmo4UlpqMlh4NU1Sa3B1cUl0K3FLUGNSa2RHSDZmMGFFOStxTVgyaHFKV1hGaG9VZEx1Wk1yT1pKQkdmUzZlVjRRCisrWTh6MllRM0dZNVJlcFEvZWFYZFRwUWp0V2RMT2FiK2EzaW03N2VtZDFwTWNUcE1kUHBYajdTVW9VU2NqV2IzSnZpcG9mb0pCWmdpCitEWGlCcmZxcXNkb0xHN2lNWFJXQ28vcXJ3Ym9XS25nQXVkZVl5eGtrc0JtUzAxbWRlWUtkSWRtZGp4bWVvZGFzenpvVzB0cVRBNWV0Cis1Y0t0OFJxdW9WaXV5eG9XT0xLdTdmcWNPVml2OTdxbHdlV2JDVHNXQUZ0LzZmcXM3enFsMXhxeENZS3ZVOXF2amZpeCt6Z2hsaUFGCitRRHUwUlh1MFNidTBUZnUwVVR1MVZYdTFRMXVVNkhXb0hjSWVaSHUyYWJ1MmJmdTJjVHUzZFh1M2VidTNhVnV4czRVd2xJRzFpYnU0CitqZnU0VjlzVm1IcG9YbnVjQnhpMkJSTStZWWVzSWJ1WXJWTzZYWFc2TTVDSXJSdTdzOWE3RzRlNlVlNlBYS2U4emR2K3ZKdTdXK1hwCit2Tm03dlVVSG5sQnc3ZGJidmVtN3ZpY0h1RkJ2Y2ZSN3YvbWJncHF2dndFOHdBRW52aFZSd0EzOHdPZEcyeFI4d1JtOHdSMzh3U0U4Cit3aVY4d2ltOHdpMzh3akU4d3pWOHd6bTh3ejM4dzBFOHhFVjh4RW04eEUzOHhGRTh4VlY4eFZtOHhWMzh4V0U4c1JySmx0eU1pZnByCit1eTJFZ1FncWJyd01nOXdtbnlwQzJBNUlzaW9xYnJUSWdPYnMyTUFzcXZnSHoyTDh5Wm1EQkdoTXRCNmlMWVNJdDlxbXBMWnN0bjVHCitpRGlvelV3c0l1Q3NjNkRCaU54S2l5U3JjOFRBQ1U2THN1WnIxYUFNeXVXOE1MWm5oejdLeENJTXdTTGluWkNnaWVLOHhoTHBXYnhjCitPOWdydXhMQ2xIQkdrWHFCeHJUSzBneTlxakQrYWM0bC9UUHlLc0swcUp2MEhDSjZZWWNPcTh2dnd0TXR6STVPU1NLSTNDWGM2MWsrCitDcnVPeXMzSGk1d20vZFVMUThxOVI0RjY0UkdVYSs4S1hiTmVDOVJmaTc1b1BMY0V5OWNIM1NMRUMzU1VITmFSSFNucWZKRzJDWHh1CitmU0tFdkhDTWZNZS9iTml0TE1aSXdJVkdTOGV0ZmN2Wkt0bkJuU3VjUUFMVVNTRjg2TmtqNGhGOEM5ak9mTWNGL1ZoV3lNQXdRcjlxCitMTlVoSXB5STNjeVlLTGJDdmQrUjRoRkVLMUt5ckczd0MwR2dhY0xldmQyN3ZUTUNxb3Iyck1hWXpDRjZ3YVVHVDd5b3k5OHhQaU5NCitLYXhleTRic0hlSGxpOWZKQzh3cDRyYzZwNEJPUzVIb2FMSldTY0s4L1RsbUxPTmxQaWFjb09Icmk0RW1hTXYrNTZ2TytNZkxmanpNCitJMExPMHR6T3FNcU9rTHgvQU96Um0vellaNzdwZFVjTUhOM3BwWDdxcVI3Q2J3M1gzazB0SklEYnpFMHB1cTNxd1Q3c3hYN3N5YjdzCit6ZjdzMFQ3dDFYN3QyZjdCN2Z2dDRSNXkyQjFzUUNmdTdaNis1MTdrN243djJmdmVFUHp2LzU3QS9SSHdDVi9BQlIvakNqL3grL3NGCityenU3SGQ5enhCdnhHUis4QVpmeURRZkhzU2J5TlpraUxUOTh0WnQyTkYrbUhhSmliS2IwVFo5bWdCdGFUdWIwV2IvMVF5YjFrU1ZtCitYSC8yYVI5alJDbjBmOW9oTG9FZWVMLzNmZi8zZ1QvNGhYLzRpYi80amYvNGViOFBZTjlYQ09NWnF1RDVvVC82cFgvNnFiLzZyZi82CitzVC83dGYvNW4ySDVheVZCU2dINXhYLysvTW0vL0kvZnA2ZFlnVEJFcVR0QlN5SlFrSXVhcFRkYWE4NkUvZEVmbGRXZi9kM0QrMWtsCitEK08va0FFQ0ZpeDVBT1FKUElnd29jS0ZEQnM2ZkFneDRrTVNBQTdLbzljcG84YU5IRHQ2L0FneXBNaVJKRE5lT2toUm9zcVZMRnU2CitiQWlBeE1GTEpXdmF2SW1USkNTTEJWLzYvQWxVSlVHREFwOHdPWW8wcWRLbFRKczZmUW8xcXRTalQzZ1NEWW8xYTlDVUFpL20vQW8yCityTWlUQXJscVBZdjJaOHlEQnp5NGZRczNydHk1ZE92YXZZczNyOXRGVnRQNi9jdHc2TUZ3NEFvYlBvdzRzZUxGakJzN2ZneTVjTGkrCitnQ3NETnN0Z21ON05uRHQ3em5zQVpVWExwRW12RlVoVHJPclZYM2QyN1ZrNk5sYkJSYWZhdm8wN3Q5VCtxcSt2eXY3dDBxeFgxc1NMCitqeFVOUERuVzA3QlNHMzhPdlpQcmdiQ1ZXNGRJRzVaUjNkeTdlMy9LbTdydjYrUVZDc2NZUFQxeHNyRE1sbi92a0xsejlmVEJUczhPCitIMzcyN2QvNys5Y2RIbjc1bFhkZWZRWit4WjU3QXk0SWkzd0hQbWpUZmRVeGVOMSsvMTJJWVZRQlRraWhjZ1ZDQ09KeFpZM1c0WURNCitCZkpaaWlxdWVOY3dsSldvWEhiZmhFRmpqVGJlaUdPT091N0lZNDgrL2tqak55L0NDSnhaZkxDSVpKSXJCb0lja2ZBNUdHS1VIa2s0CitucE9sV1poaGxscFNOYVNWcFgwb1paZ21OZW5sZFZDS0dTYVZaY3FHNVpadS9yZGhsV3YrQlNhYVVTWkk0cHpBbldsbmlHcnFhVm1iCitidzdhWFp5QVdsWm5ueERpZWVqK25qSUpOQTg5a2s1S2FhV1dYb3BwcHBwdXltbW5rdmJSWmFOblpaZk5GNmFlaW1xcXFxN0thcXV1Cit2Z3BycktabUU2cW9XWmtsUUNtZTdzcHJyNzUyT2crWnRsckczRHgzSEl0c3Nzb3V5Mnl6emo0TGJiVFNIa3RNcmNNQ2xaMFdWV3pMCitiYmZlZmd0dXVPS09TMjY1NW02cmhiWFgrb1FySWRPK0MyKzg4a29iN0lqckV2dG9jNHBHK2VlOXMxWEhINkVDNDJhb3YxZ2x1cStCCitqQnJzRjU4Skc5Z3Z3ejRKT25ERkdxb3JzVVFJUDZ6ZXdobHI1VERINmtYOE1Vc1VXNHd5VXdXWDNOTEdJa1BuTWN0QU1YZEFPemJmCitqSFBPT3UvTWM4OCsvd3gwMERiUGdiSE1nVlVIaHh4S0w4MTAwMDQvRFhYVVVrOU5kZFZLdzFIK3ROSG1rY2dBRkVKL0RYYllZZ2NkCittcjFhcTVYdmZDK25SL0xaRHAyY2N0eGM5dWEyeGlRT3QzYkh3dGE5VXNoNUc5YzIzd3JCTFhmS0t3dk9rTXQvc3hZejRoSDV2VGhyCitnVHRPZDIyRlg4N0U0WlFqcEhqa1lqVytPVXhwZXc3ZDVKUVRqdm5BbW9mZTN0M29rVjRjNkt3cmRLS1N0dCtPbDR1Vno3NDdZWkg5CitEbnp3d2o4MjJlNjhHNGw3OHNyRHhhVFp2RE1FT2V6MlpjMDM2cWtUdW5yb25VdVBrK3pQQ3hROTl6aVo3cmoxMTcrWi9lYmJpMStUCis5OStIejM1TjVDTnUvdmxicGsvNSt2R1A1UDd6OE84L2t2a0pybjcyeXhMK0hLYy9BSUtrZjd4anpqa0dBTUVJU25DQ0ZLeWdCUytJCit3UXhxY0lNUWJBWDE2cGIrSFhOMFlZUWtMS0VKVDRqQ0ZLcHdoU3hzb1F0SGFJNFB1ZzB6enVDZ0RXK0l3eHh1OEJ4Nys5NUIvcWRBCitrQWl3ZWdBcklNb09pTGdFQnJFakRKd2RFSmZZa1NHQ3NJaEdyQmdTQmFkRUtHcWtpYXg3b2hZMUlrVzNFYkNLY0pMaDJiTDRSUzZHCitybGkvYXFNYjM3Z3BVQmx2ZHFTU2xSM3ZpTWM4eG9wV2MyUWRyblFGeDBBS3NvMzFhcDBQRjhJY1JFaGhrWXhzcENNZkNjbElTbktTCitsS3lrSlJkcEF6TnFMVHZYT0pjblB3bktVSnJyR3BvMEdxNm9jY2xVcW5LVnJMUWtJbnA0U0M5K1VUcWxsTmtZeWRpZksvSU5qVnBVCis0K1prK2NVd251Mld1UFNPTHV2R1N5ajZrbkxBMUtJd04wbkZZcUt2bGl4TDVoS1g2VGorQjJwZ205enNwamUvQ2M1d2luT2M1Q3luCitPYmZwd1Q2R0xqdTZhSUE3M3duUGVNcHpudlNzcHozdmljOTh1bE1YMUN3WkRjOEowSUFLZEtEbTVLSHpEdm5EZkMyQUhBeHRxRU1mCitDdEdJU25TaUZLMm9SUy9LMEJiMDgyUFp5VVVzUGdyU2tJcDBwQ1F0cVVsUGl0S1VxdlNqdWRob3hvU3pDb3pLZEtZMHJlbEZGd0JMCitIekpub1RidHFVOS9TbEdOcW5OekhWMnBVWStLMUtTcXRLVkR6ZC9kWWdyVXFFcTFwemc5S0VJYnBOQ3BhbldyRmhXcWVIeFlWS1dLCitkYXhrUFNsVHYvbzltSEoxcld4dGFGVU5lZFdFSG9TbmJhM3JWTDBxSU5hRnRheDg3YXRTejVwWDdUM1Zyb1NONmxzVmhGRG0rTUVOCitqRzJzWXg4TDJjaitTbmF5bEsyc1pTL0xXQys0VkdMWmlVSXpQZ3ZhMElwMnRLUXRyV2xQaTlyVXF2YXpVZGdzdzR5RTJkaktkcmEwCit4YXdmY3ZxK3JCWjJ0emJGSzRmMFdoMlArblc0eEVVcFlIOHJXSXRBbGJmTXhlaGg4M1RWblRaM3VsMTFyY0gyV3R6c2F2ZTRjbExmCitZS2tMM29nK042NXlGUWhkdzR0ZWN2aTJ1NmNMcm5iZm0xM3UrbEN0NlUzdmVNbUwxYm5XTjczckJhdDc0UXZndnNvM3JkL2RMM2p2CitTMTdtOEVJY0RHNndneDhNNFFoTGVNSVVyckNGTDh6Z1QxalhYOWxSd1NRK0RPSVFpM2pFSkM2eGlVK000aFNyK01NcTJQQzlNTE1DCitETXQ0eGpTdThZVjVnVnYvNmRiQTFPM3Y5N0FiNENBbmRjRFBveStQcDR2Z3VFcis5OGpUOWZIemdDemtLQy9WeGVzeU1wTjVtK1RvCis3dmpLdTNVeTc2QXM1VENYbE1qSEt6Q1hDNXZseE9hTEFEcG9zNXZmRE9jNHkzbk9kSzZ6bmUrTTV6WWJnTXJYeW80UXFBRG9RQXQ2CiswSVF1dEtFUGplaEVLM3JSZ0JZQ240ZUZLeHJrZWRLVXJyU2w4VXlBSERjd1g2QlloYWMvRGVwUWkzclVwQzYxcVUrTjZsUjcyZ2lQCit0bFYySWhDS1dNdDYxclN1dGExdmpldGM2M3JYdkk1MUJGb3RLbHhaUU5YRUxyYXhqNTFxVUdqYWlWcytzMTI5VE1mL2lubmFZd1oyCitvNnpzN0xxbU9aYk56alpib1EzY3F3aVgydVFPS1psbmgyMXZyM1hiT3UyMnVyY0s3blZLdTl6bFByY2Z6Znh1cnJJN3R3ZTVoU2YrCitEZkNBQzN6KzRBUXZ1TUVQanZDRUsvemZ4YkQyb2JJRGhsZElmT0lVcjdqRkw0N3hqR3Q4NHh6dnVNVEI0SEJBWVNZQkN5KzV5VStPCitjb1hmWXRsZGRIZStwUnB2b3M2YjN0UzJkM0s3c3R5WGIzWGZPdGF2enJrYTgvYUttK2IwdHJsM2xmdHpmYk44alM1UGVrK0RYcjZaCitFejNNUm5jcTBwMCtWWjV2MnVkWWp5clU2U2YxcVVlNTZnakVkOWVwdXZSZjVzdmZLVys3Mjk5KzhJWTNOZXBYY1FBZzdvNzN2T3Q5Cis3M3p2dTkvL0R2akFDLzd1RGdpNW5rWU85OFFyM3UwcnQ2cWF1WDUybjM1OWdHRVhlNURKbmtTelI1Nm1XbWMyNURkZjA4a1RjZWlXCitGelBtc2FoNTBEczM3Y3hzdXVvckt2b3BrcjcwVWo3OUxsUC8rb3AydnVYK0IrazBzbjhQL09DYm10VnpCL3RWMU5DRzVDdC8rY3h2Cit2dk9mRC8zb1MzLzYxRSsrR2d3L0oyRUxmL3ZjQjc2eUhjL3RnN0Q1MHVRdnYvbnJ2T2ZpVS80cVF1aTErOThQLy9qejJ0SHF2LzFCCitCQ0RwOCt0Ly8rVFBOUGpiL1htNWQxR3hKMGFWUjN2dlpYdkloSHNDS0ZHN3gzUUJ5SUJCaFgxckFtWUhpSUFUV0NicEZvRVQ1WUJxCitCNEViR0ZFRU9Fd0dhSUhGbFlBenRJQWc2RmFzbDAzNVVnOWVBSU14S0lNelNJTTFhSU0zaUlNNXFJTTdDSU9KZ0lGZWtoM3JFQUJECitTSVJGYUlSSGlJUkpxSVJMeUlSTjZJUkR1QTQvYUNXWU1RRThhSVZYaUlWWnVJUDF3SUtJczJRcUtJSDFKM3NITVc0bENHQW5lRVlwCitDSWIrSGRoNkh3aUdEU1dDMERSN1pnaGZhS2cxR3ZpR0svaC8vR1plZVRoUmNXZzBGVWlIdzJXSHBxU0dLc2lHTGVpR2VRaUl0a1NDCitnOGhYaFNnemVPaUhpZWlGK2JJRjlxQ0ptOGlKbmVpSm53aUtvU2lLbzBpS3BhaUpnaUNGVHBJZHJwQUNyZWlLcndpTHNTaUxzMGlMCit0V2lMdDRpTHJlZ0txVWdrWmlFR3BnaU13U2lNdzJpS1c5Q0Znc01jWDRaY01zZGVkRGRmMElWdTBCaCtQN2FNUXVkZnpaaDVoNFJZCiswL2hrMWVpTTFJaU5xS2VOMHFoVHZVQUM1NGlPNmFpTzY4aU83ZWlPN3dpUDhTaVA3emdLM2doMm96Q1ArYWlQKzhpUC9YaU85UmlPCit0K2VQQTBtUUJhbVB2VUNPN3dNQUM4bVFEZW1RRHdtUkVTbVJFMGtva1JWcGtSWVprRk4wa1J2SmtSM3BrUi9wa0JtSmdpQkpraVZwCitraDZKWHltcGtpdkprbTRURUFBNwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL252MTJtdC5naWYuYjY0IGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL252MTJtdC5naWYuYjY0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4M2E3YzgKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvbnYxMm10LmdpZi5iNjQKQEAgLTAsMCArMSwzNyBAQAorUjBsR09EbGhGZ0ZuQU1abkFBQUFBQVlDQWdBQVNBd0ZCUUFBZEVnQUFDUU9Ea2dBU0NvUUVFZ0FkSFFBQURBVEVqVVZGSFFBU0RzWAorRjNRQWRFMGVIVk1oSUFCSVNBQkluRWhJQUlNME1vazJOSTg0Tms5UFQ1bzlPNXhJQUhSSW5GbFpXYXhFUWJoSlJnQjB2NzVMU0xoUQorVGJSVFVjQlJUckJYVmF0Y1dzSldWS2RmWFc5dmI2VmhYMGgwdjhSY1daaHBhSkp1YnBCd2I4WmlYOFppWUk1emM0dDFkWWQ0ZU1obgorWmI5MEFJTjhmSDkvZjhwcmFjcHRhOHR0YXN4emNNNTFkTTUyZE01M2RjOTRka2ljMzlGK2ZOT0VncG1abWRXSmg5ZVBqZGlUa3QrYworU051YW1kMmdudDZsbzNTLy81eS9uT0NxcWVLd3IrUzF0T2E3dXYrL2RPakJ3T3JHeHV6S3llM0t5dXpNeTV6Zi83L2ZuTy9TMGZIWAorMS8vZm5QUGQzZlRlM3ZYajR2Zm82UG51N3IvLy8vdjA5Ti8vLy8zNStmLy92Ly8vMy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL3lIKworRkU1V01USk5WQ0J0WlcxdmNua2diR0Y1YjNWMEFDd0FBQUFBRmdGbkFBQUgvb0JuZ29PRWhZYUhpSW1LaTR5TmpvK1FrWktUbEpXVworbDVpWm1wdWNuWjZmb0tHaW82U2xwcWVvcWFxcnJLMnVyN0N4c3JPMHRiYTN1TG02dTd5OXZyL0F3Y0xEeE1YR21rTTN5c3ZNemM3UAorME5IUzBDalQxdGZZMTlYWjNOM1kyOTdoNHN4RGxRRGo2T0xuNmV6WjYrM3cwdS94OU0wQTVyLzN2dnE5L0x6K2tRRHFFcGlMSUM2RAordHhBeVVsaUxJUzJIc3lES2tuaUlJaXlMcnpDNjB0aUtveUNQcTBDcUVwbUtKQ3FRSmsrbE5MV3lWRXRTS1BQSjNEZHowc3RSTjBYbAorRExVVFZFeWFRUHZWbE5UelUxRlBSenNsNWZSVGFOQi9Rd05HSFRpMUlMNm51NVp1MHFxcEtWU3NWTUUrNHBxSkxDYXpsOUJhOG9xcAorakFJQS9nVENJT1hrVnNBVm81Mk9BQUJnVjZrbU14cjJDZ2JpbDlMTEdoL09JSjZyNlFnQkxBZnVNbTQ4WVl6UFQxc2lGN2E1cVV5RAordTFIaWJ0YVVXZkxvUzU1TlQrYTArRFNrbHFYUHhLNUVKa3VobTdOZFY4cE1ZVzlpM1lKc1Q4cTk5V3FtMk1Rbi9jaWhaUkJ1emFzdgorUmVucmRnbndNOHVGUXpwU09mcnJUY2loVzVLeW9naVlNODlWRjljVVdxN2kzK3NSVFZsQjVMeWo2bmdOZC81OHBuMG1NVW1ZNEVSNgorK1IybkdXQ0VNYlVJR1FFMlFVWWozRm5tM1ZpYklQZ2VKMTc4a0VGejRJbW40RjhhRUpiY1dZMThFY1FMVml6aVZvSVRPdkxTRmdYQQorNVI0aVZ2eGc0NDA0NW9pakJ5QVUwUU1JUUFZcHBKQXdQSGhJRklMeC9xVWVpZURGQ0lCMWlnakJnNDVVNG5oQmxWU2FBRUlRWWlUaQorMkl6WExiVEtGMW1VYWVhWmFKcjVSQWM1YUtlSUZTdHcwUkVyVmVoQVJacDRtcmxBbm1sQ3NjSUxVOHlwM3k1aUlMRUNCSTdBS2FlZworcTNEeFE1Y3VNZ0xnQ2c1dVpCd3VUcGlBaEJnUUtacVJLNDVDS3FZaWZ0WjMwYVcxV0VGREVGNTh4SWlubjRMNmFDTUlhYkhERGh5ZQorT3FndFlnU1Jvbk9Md0JxcnJLSW1nbEFRVWp5RWFsZzB4amxSTEtFdW90YXlGSW9saUxDNndoS3RzVlZGYWkyMjJXbzdLeUxUN2twVQorVmVDR0syNnhoSlRMbWJsWkdaS3V1dXRXMUMydFVjMUxiNzIzM1R1cVU5YzZtOUF0MndKckxiNjhKRUVHUC9yRzR1NGlCYVBucjdTOAorL29oaGdzUm5OT3h3TGdVL0xKVmg5WVI4UXdzbDNIQ09DeUhJSURJOTg2eU1qZ3drektCTXl5NjNnMUxOOEp6QWdza29xNHd6T3pULworM0UwTUlJaVFnZ00yQ0cwenRiVzg4TVVaREFnYzd5NWFGbEhCQ0RzazRlYkE4TnJ5eFFzWmQ3RG9WN29JUWNRS0JweWhSUk0vak9DRQorVlYzWDhrUVJjS1l0Q0Juc05zUUxGSFNMUFFqZWNMK2JpOWx4QXBDRkVqdU0wQVN6dVh3TnRkU01mNXlMbGtRRUFjSU9TbXpOOVM1TworQTZEeHMzSFBvZ1VJT1NCaFJRQVR5MUxFRS9kOHZxKzN0NUJoaEgwWUE2ekxGRUxvNDdxbG9jTkNoaEMvdW5vd0xSWXpETG5ldmJ2eQorZS9EQzI2NUxFcWdQc250SVRDc1B2Q0VlZjRmVjlDVlZ6OHJ5L3ZZT2p6d2gzS3ZrdlNyZ2grOTg1QUdQRGJyZ3ZsOVBidW9STmV2KworNndqSHp6ejI5TDh2Ny9HOGcxOHIwc2N0OFNrckVlWFR5ZmtpZ2FTOXNJZ1JCQ3dnZS9iU2x6Qk5BakFWL0JBQ0FYZ0lHQW1tT3hvOAorbHliSzhBQzVUR2RKaDRpZ0JBdWhPVWFVWVFPV3FRRUlNVkdiMmpWR0FoNmlSQTBOOWlZT0ZtSkU4UkZoSi9DeklQbjlxeERab1lSLworTkxFY0JOQ2xBVXpJSVNXV3c2Rk8rWEFRUU96S0FvY2p4VUtvVUJFSW1ZK3BJQUVZK0doQ0NoMHdUMk9Ba0VWSmtNYzhFdEdZQi9jQworcFJCS2pqVm1US0VSODVmQ0JobHBFUTJjNFNZR0VLQzNYV0lMQ1FoREd5VUJJQk5FNEJHN08wSUd0Wmc4U2tSSUVWK2syQ0pNL29TaQorUjBnU2hXczVRNGFZWTRrYWlLaUxsdkRDQlVqWkNOY1JNWWgzek1TWEZ1RURIR0FKUzFlNjVZMjB4S1ZHdlBKTnVyVFNqVWJRb3g4TgorNlpoQW9zRWYzWklrQUR4UVhzSFUwUVdJNlNOa0lyTklLbEpBSFNrcHdFdklVRUtLNkFLZnhybW5jWmJKVDRCU3hCWlVJSWdUbHNpYworWnlybkUxYlFKa3dzOGd4a2dpZWFJRURQRmthaUJsQ2FwUjIxZHh3bjdVV1FURXJFcENxbENNQlFFSlJyS2RRS25rQWFWRktpVUIyZworYUVFUENrNVlFcFJzaHlnVjdWd1JBVTNsYlJhWlFzSUErcWMra0JMQ1ZyaUtoYW9zMENwY3FJcFZOcHhhTndOWENHVEpvbGRXeUo1QworZmNWRGwzNVVwMGJsS1ZKanlUNmxOdlVnVy9UZlVwKzZqemtoSmhXcUJxeGZKUSs0UHFkNkZYWlhyZXBVdjhySHNXSzFxMmUxcWxuRgorU2xWYnNLV3Q0d3VyVzZPNnNheEtGYTVnWkNuKzVtclhpaWpOWm44RldtRFRFYlRCdXFNU0hERHNPRENnV0hFd3RySGVlQ3hrdWNHQgorWTFqMnNwak5yR1kzeTluT2V2YXpvQTJ0YUVkTDJ0S2E5clNvVGExcVY4dmExcnIydGJDTnJXeG5TOXZhMnZhMnVNM3RMUUlCQURzPQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL252MTJtdF9leGFtcGxlLmdpZi5iNjQgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvbnYxMm10X2V4YW1wbGUuZ2lmLmI2NApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTEyMDc4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL252MTJtdF9leGFtcGxlLmdpZi5iNjQKQEAgLTAsMCArMSwxMjEgQEAKK1IwbEdPRGxob0FIa0FPZTFBQUFBQUFBQVNBQUFkRWdBQUVnQVNFZ0FkQmdZR0hRQUFCb2FHblFBU0hRQWRDMGVIaWdvS0VJbEpFWW0KK0pTNHVMbHNzS3pZMk5nQklTRkl5TVFCSW5FQkFRRWhCUVVoSUFGQkJRVmhDUWtoSVNGNURRMk5EUW1kRFEzTkVRMDVPVG9OR1JIaEoKK1NKeElBSXRIUlk5SFJYUkluSmRJUmxwYVdwcExTYUpKUnFwSlI3QklSYTVLUjJOZlg3SktSMkJnWUd4ZFhXbGVYbVpmWDMxWldYSmMKK1hIcGFXUUIwdjI5ZFhMWktTSGhiV29sWFZwVlVVNUpWVTU1U1VKaFVVcWRRVHJwTFNLOU9US1JSVDZGU1VMUk5TN2hNU3JWTlNyNUwKK1NMOU1TcjFPUzd4UVRzQlJUcnRUVUw1V1U3bFlWc0pXVkVoMHY3ZGVXNHBxYWI1ZFc4UmNXYmRnWHJaalljWmdYbmQzZDhaaVg4WmkKK1lMOWxZN1JvWnNoblpiOTBBTEp1YkxGd2I4cHJhYkJ6Y2NwdGE3OXdic3R0YXF4NmVjeHpjS3Q4ZTRhR2hyOTNkYzEwY3M1MWRNNTIKK2RJbUppYjk3ZWM1M2RjOTRkcWlFaEtlSGhraWMzOUYrZktlS2lhV1BqOU9FZ3FTU2tiNlBqdFdKaDVxYW1xR2FtcUNjbk5lUGpaK2YKK245aVRrcjZhbXRpVWt0bVZrOStjU0w2ZW5kdWFtYitqbzkyZ25yK3BxZDZsbzdPenM3K3dzSFMvLzdXMXRaeS9uT0NxcWJtNXViKzQKK3VPS3dyK1MxdEwrL3Y5Ky9kT2E3dXYrL2RPakJ3T3JHeHV6S3llM0t5dXpNeTV6Zi83L2ZuTy9TMGQvZm5QSFgxK0RnNFAvZm5QUGQKKzNmVGUzdlhqNHZmbzZMLy92Ky92Ny9udTdyLy8vOS8vdi92MDlOLy8zOS8vLy8zNStmLy92Ly8vMy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8veUgrRVVOeVpXRjBaV1FnZDJsMGFDQkgKK1NVMVFBQ3dBQUFBQW9BSGtBQUFJL2dCckNSeElzS0RCZ3dnVEtseklzS0hEaHhBalNweElzYUxGaXhnemF0eklzYVBIanlCRGloeEoKK3NxVEpreWhUcWx6SnNxWExsekJqeXB4SnM2Yk5temh6NnR6SnM2ZlBuMENEQ2gxS3RLalJvMGlUS2wzS3RLblRwMUNqU3AxS3RhcFYKK2g2UWtXZHJLdGF2WHIyRERpaDBybHBGV3NtalRxa1ZyZHEzYnQyN2J3cDFMMTZ2Y3Vuam4zczNMTnkyalZSVS9NS2hBdUxEaHc0Z1QKK0sxN01lREdDd1kwalM1NGMrVEhseTVndlc4N011ZlBoelo1RGN3WXR1clJrQkdrcXZnQUVkUFZQMTY5Wis0UTlXM1pQMmhKeDg5U3QKK2szZHYyN3VCQjQrdFd2aE8zemlSSnplZVUvbE41eldoSzVST2s3cE02OWVaTDIrdC9YbDNodGhqL29aL09aNzg5K2puMFJPbldONWwKK2U1YnY0YWVmR1g5bC9aVHg3K09mbjUzNyt0ci81Y1pmZndBR2VOeUE0aUZvWG5IK0ZlamdjQWIreG1DRXpTbTQ0SU1RM21iaFFQcWgKKzFLRkpINEs0b1h3TmFqZ2hoaEpTdUoySzNwMW9Jb29wdmdqamloT0ZXSktOSStHWTQ0ajI4ZGdqaStENXFKS09JUkZacEpBZUlwa2sKK2tBdlpPTXNCQUFqUXlrZE9IaERBSjFRcVNWQWhBQUJ3cFVjZjBpSkNsMlRTMFpHTm1aRHBTSlljcGVrbGxtZnlhS01YTnRSQ1owYXYKK2pFSlFpSVVJQUFvQmNNYkpVU0VVeEhKa1FhK3dnbEVwZ0dLVUo0ZGExdkxrbW4xT2laRXNvVUM2VVNrRHJKbUpsSUt5Ritrc0NXRDUKK3FhVVd5ZEpGSGFnSWhDT2ovb0Z5RkNLcHNZSXAzQ1pQUkNLTFJYZGV1bXFyczVaYXk2a2F4VEdHbmlFU1MydW9OVVlLYXkzUFpoUUoKK0ZZbkk4bXFqdG01S3dBVmQxcGx0UWFuZ2tZVW5GRVVyTGJVdFJHcW5BS29jc09aR21sRHhSd3lSWnZMbHBNd0txQzJXNW1MRXloNVUKK3pLQXV0TmptZTVHOVdPSnI4RUNlckpxS1JJUWF1dEcvUnNqUmtSY0FGTnJSSzRrVVlRWkhHSHQ1d2JzYjVlZHNvLzFtRkVvUVZyUzYKK0w1c2FFV3VudDdKK04yMjFEeW5jVVE1T3NKclJrMlo2QVdwSE4xUnhiRWM2YTJUeVJzdktqSkFuY1VRdDlkUlVULzNERVVnY29mWFcKK1hIYzlDRU1wSzMweWxtS2FhUkFlYkZTdDl0by9WTEcyMUYwY1FZVW1Ea1hNRU5SdnMxM0YvaEZMWE5IMTMxd3ZncEN5N3Q2ZHQ5cHQKK0wzSEVIMjBBRHJnV3V5cmt0Tmd1WGxUMnpBdWxFc3JtbkhmdWVlYzZLTkVGdVF0NVFvVXBZQmRjODBhWGgxMUxKMlZ3OHZuc3MrZGcKK0IrMmNIM0lFSGc4ekJIUkRtdU5PZXc1bVBERTZSZ2dUWE90QndRdnZlUTVvVURGR3BuZWZ2dENUTkpjc3A3cWNSb21xUnE4UTRuRkQKK3BxTXVPWmx2TG14Ujl3Q1FiSkFwY2J6U2JFS29HRXQ5UTVWKzlJb1BTbEN5RVpkZGNoLzRkc0NFU2ppa2ZBbDVVcmRnTmorZVVPSUoKK2g1QkJlaEI0b1pUQVQzNFI4YzByRHZFRUE4YmtnVHZvZzA5QUtFTHlXYThsUzlOSnczd0dIUXBXMElMeHk2QnhIbmdJREw1a2hhZ3cKK0VrZHdTQjBYa2toVS9qcEJ4UmhJVnd2bitOQTlBNFBJQlNHaUcwejRMQ1pDSkowT3dWY0hLVTd3aEVpczNJRVNjc1FzdG1TSkRwbWkKKytpcFVPaXg2c1lFejZ1SVpXUUxHSURGSlBWdzA0eHBsV0NLQ3FIR09LMm5qZEpKNEtCYmQ4VWRBak5BZlVjaEhpZWdSSVdKY25Zb0cKK09hVHQxYkVXalB3aFRBNXBrRVJxNzVFQ2llUit0QmdqU01xUlBvV2NDQ1gzRk1wdm9VaVRtd3lrZzFBSlNKbU0wbFdsSENPTk12bkoKK0JISHlKdFdDRFN0YjZjb1lIc1NTbFBzSkQveGd4MXJhVXBVNmVjVVRpc2lhWGZLeWx6WWs1UnRuOG9vaTJNYVpTMEptVGphQkIyWmkKK3M1RTNNY1VhZWlmTkdkMWtFME9RelRkUEVwOFRZS0V2OEJ5TEd2UmdDUTFJb1FtSy9vaW5QcitpZ1hmdUU1NklPTUlVM2lDSVNXeWwKK24vOU02RUg5cWRCOXFpRUU3elFFUGhzS1R3M3dvU0lhZ0l4cE5xb1lGbUNnQWc1WVFRWTRTdExFR0VDakpUVU5EbzVBQWhNQUlRVWcKK2FBQktVMXJTazlMMHBpeFlBQU00NElLUjNwU2pCa2lOTm0rU2lpeEEwZ2gzbUNaTDhBQXcxSTBpRWo5SWd2OWt0Sk9pdm1BT3hvUWoKK0duTlNpVCtZamdheWtVVTBXNFFUVEhqMWhDL3d3MWpKMkpPdTFvQUo1cXVGV05tNlZad3c5WFF2c01NaXpyQ0VTR3dSSjBYMUpPcUEKK21SSENYb1NwU0sxRktQYmFWN3JxYXlkUE9NSWU2bkNFS0N6aWZwMjBTUlllVmo3RFhzU3pGWWxzRDZ4d2hETmM5cTkxdGNrb2pqQ0cKK1EzZ2lYVXBsL3NrZlBQalZXQ3B5SjZzZHd3N21FTGtNUFJZbnNnaUVvbUFaMjVWd2syR0pOZWRNZ3FzbzBONnlJYzUxaUN6d1FFUm0KK0ZsY2x5aVRJVytPS1d1QlNsN2pLYlpKdEtUTGQ2bG8zdkREQm1hdXd5bDNIMnFTOG1rSnZRcUs3RVBnV2hMNi8xZEE2czNrVCs0S1gKK3FuU3NpWC9MQ2VBdDdsZEUzalV2ZmdPYzJwY01tTUMraGRDQlNiSmdoRHo0dkFWK1NJVUpjdUg0WnBpdUV4YkpoZ3ZTNFJGRDE1RXkKKzZiQ0hJOXpkRUlQRXhBSlJNWXpGKzl5VXFIakYzWTJ3aTAwWmt4dlBlSTgxUHNtTmNaelpIQXZXSmlZZThvL25pK0tZbGVraFF5YXkKK1FCSWxFVGQ5Q1h6SUdwaVlya3lSUjFXU09jNWtYOFlrZGttTVBJbkxDaHhhL24yL0MyU0VZUFo2VmdyVW1aY1g1RGIvVEFGVFNoNUQKK29pemxXdUJLVnprcmdhRzhvTEdNcUtvT054aFlJU1NnT29rYzJtVjkzcVhyZ21tUlB2MHBVSGZxbFVMNHJCejdNY1RTMkFJMW5ZZXEKK1lUNG16Y0pzUG5GQ3dqV3VLcXRaV2tZUVEyL05uQUJJTkhvaU4rdXRjbGc1NmNKcUtWcE5lN1ZCK0l6aGcyeUNDbnNZcmtMNjFldjgKK01wZ2p6WlpycWxXdGtCV1NreUZpeXA1R1lzQUZLbXhDSTRXZ1E3UWQ4aTl2Ly9jZ3FCU3pBSDJ0a1dnOXE5ZkVMdlpCWkpHSVhNM2EKK0lNeStkWjJaL0JGTm85cThibVJJcmhmaXBrTFhMQlMvdWtncEN0Q0tjVDhFNGF4cVlWWVJVZ2d1VTFyaDJIcTN2cVVOY0g0ekpCVjEKK2FEVkMvdkk5NmdhSE1ZbDJVd2djd25BNHhMbXQ1WEdJMjl6d1ovR253VnhxYllzYTFod0hPTUVaeEF0bW1qVGViajQxdmhHQjUzL3oKK3VVTk9qWkVQdVJ0bEcxODUwZU9RODV0SHRnNXJWUjVCSEg3eWZVTWtmd3M1aGZPR2Q3dXhoMEozdkdzSTB3M1NQTFBiTGhRUFBCNUYKK0ZJZytzNEhMN0orTGV3MU1YYmpiWWh4T3dmNGVRY1NPOTgyOTNleVlvRUlXdm4wUWtwZlo1QlFoTkpsNWpKRDZUVzhocFlDQ1FQUmMKK3NqNFE0Z2xUelFqWEdSSSswTXViVis4QysrUC9McERMK2Z1ejZlRVlGUUE5Y3RXTlB1Q1FsNGlZeHl6TFdteXdndzBSVTVkcW5wSFEKKzFSRGFHNDhJRFRFWUl2WVpmUFVVY2RQdytUVUE3MEhmSUlsUGRrS2svdjhtN2hNLzl6Um0wZkpoMGpBaDVBRW5PSVN3a1lzOGtGR2MKKzRReDZPaWI0dFZvUUowTGFKVkZjY2hTL2ZOMFhGcVFPZEFOS1hrY2dIelpMNitkZTdOZDEvVWRJbUlTQUNVaFc4MWNkNDNWeExPYUEKK0ZnaUJ6bmFBR0ZpQkJxaUJTTlprQmZpQkRkaUJEeWlDcEhhQkppaGZCQmlDOVBkc0hMaUJIdGlDTVNpQkF5aC9Md2lES0ppQ054aCsKK0ttaURPMGlEQ3loSkdWaUNNa2lFUU5pRE1KRkNTT2gvTXlpQVFmaE1URFNCRkdpRVIvaURWZGlFQ09GT0ZQVlBDTFdGOGRTRlhsaFIKK0RCV0dlUUdHWkZpR1kzaUdkR0ZSR0RWVFA3VlJOdldHSkJXSGNnaFVibGlIbmtHSGVGZ2FlcmlIZVNoVUVlaUVMRmlFSkppRFZ4aUYKKy9pT0lnNFlvaUlQSWlDNkloVDRJaVVrb2hleTJoT29uaVV4SWhTdG9oWnVJaUU4SVRwK1lTcGJJZ0NkWWlJcG9panJJaVpGWWFvbVkKK2lwaUlSNXE0aWdvNGlrS29pcFBZaW9SSWJiUUloYkY0aTZISVgwTzRpSjNZaTVrb2pMS29pNDA0ak1ib2k3c0lpb0dvaktjWWpia28KK2pZZklpci9JVHBUWWRObG9FVXZtY2NuNFM5dklqZUZZaXRUb2lLOUlpczk0aks1SWpMQzRqTVdJakxiNGp1VUlqZk9vamp4b0VYTTIKK0VOSm5kOXI0TTNHbWo5TTNoUk9SajV1bkp0YzNrUDlZa09sVGlRZnpaSklDSmNJbWpobXhqd0pCa0F3WmpGL25KOWd5QzNnMkxOK1gKK2poU25rWUFuYUhieWZEVVlrcGRXa1lXamVyQ0hFYUltRUp6aS9pa1JDWklId1pGNTlpV1pwbTBTZVJFMjZaR2Y4SklDT1l1c1Z4QnIKK1I1TzF0enlUYzVJSkFXekNrcFJLZVpTYkJ5ckwwbzlNNHk2QkY1UnoxM2UzZDQrUFdDNjN0cFhlT0pRRGtXMVlHUkhtSWpUdHNtNVAKKzJYallranhGMlpVVkFTc2FWM0p3NlpWd0FwWmhXWmRtZVd1dkJ4RmVkbTdyVXpBRk4zazd1U2lxZ3pFbVdaaFRwbXdRY1piRE56SmQKK0ZuK254eXQxTXBjVmdTbDlGbmswZzVlSUJJS0JXU3NwTnhHUEJwaHhlV3NWUjVmV2FKaUFkd0JCTTVOMTlXZjNsanJMODViMWxYQjgKK29qR1dXUkhHa21YL1kzQ2NDWTVyaVcrcXc1SVVrV3RPZDJ1MG1acERTVGhxbVZxczFuRkxlV3RPQ1JFM0Exc1pBWFpYYVJIeC9qSXYKK1dzS1N2OGwvNU5pWUJTTjVHbEZ1QXROdUdhZDVQbm1SbjdsNVgvS2RsNWhKRHVNUUtZTTkvcklIRlpNUjVObDZJaEEwT2prUkhETSsKK0dMR2ZBd0dmOFNtVTBZYytWN0o3aVNrUks5TXlEVWttVnlKOEMwbVZGdUY5V0FKQTdYT1FBekZ3MjZlZ24wQjMvMGtSUFBORTVWSjkKK1pGSW8zZU9hRTFFMFJ4T1hLTm9sRkhBSklNcWVucWdTUXpkMVY1TTFTTWMxWDRPT0pvRTJVMGMxVmZjMk1oZUFHNUdqTjljMmZPTTMKK1BibzFTb2NSU3RweWliTTRqZk9rUndBNXZJaWdKOUYyaFJjNmNsZHRFMGRoMlFnN3NsTjRuWE40dUlOMjE1WVJYdXAyeFJPbUtQR20KK3pnTTkwdk5tVHpPbWZXU1VLeEUrQWxwRzdlV01KL0ZLL2x4SkVKYUhwMzNLUDZHM0U2OUFRQjVVUFlHS2pjR0pFalFrUVpES2pDaEIKK3FIazVaUnowcUM5QlFpUDBCQ0YwUUhvcVlwNXBFK2tuY1pFcXFKbnFTOG9wRU9OSGZyL1NqWFkwcS9PeFk4RkpxN1d3ZjZSWlRLdksKK3FxMmFkWGxwZnpMQnE3cnFlMVhVcXdXQnE3azZqcVhJckMzNVJhNktlL0VvajBlR3FYcTVqdGRLanlXaHFRZGFqK29JcmMzYWdPSWEKK3JTN2hyY29LcnRqcXErYjRxa1pXcnVaNnJ0UGFtZGNvcWVoV3F2YktwN1VJci9FcXI4S2FtZHBLZ3Z3YW5uWkdWUU9ybUMraHFjZjYKK3JUQjRzUHE2c0FUbXNKUHFFWVFLc2VtNmdSS0xrZFNxRTdta1R2aGFpNU0wcndBN2pUWXhUT3lxcmd4TFRjdmtHaGs3L3JFZk1Vb1cKK081azRVVTNYOUxIQStoQmFxSVowSVFoa1VFOVlJRkg1cExOd1lZWkNLeGFLc0FXTndFOXBXTFJyUWJSTXF4YUNnQUwrQkxSUG14WnMKK1NCRVo1WWVoUVFJZVVBRUdNQUU5cGJWNWVJZGlxeGdiY0FRcU1BSWRZQUdFMFlkbGV4bHUrN2FUUVFJUU1CZzg1Vk55S3hsQjViSWwKK3NWbTFzRjNOT0JLUjlRZDRzQVJua0FnNTRLd2FXeE5aQUFPQTBMTGpXbFZHNVFuSjlZMHFjVmRPQlZWU0ZiaGRtZ1ZYWmJOQW1xMHgKKzBWVzFGV1AveXEwdVlWWVVsRmFuVzQwMzRWWndOUkJ6aFlxRmFoT1ltMWVNNVZmczJMbEhGck1XaTFoSnRWaDhwYnNvTzdJeEVWbVQKK1ZWbW5WYTBvNGJlZHBiaWlLeE9pUlZxbWhhaXUvZ3VQcXNWYXJtV2RscXNTczBWTFlGV3ZJNUZidXhXYnRGdXc3eVZjeHR1dU0zRmMKK21WUzV6R3RqNnV1N3A3cGMwMGEveWJSTUF3RzQzYXNTOW9XL0JNc1NEd2JBT2FGZVJjUmUvWXNTL2tYQWl5dkEwM2F4SklzZWtCdkEKK0RseGREQnk5TnZiQUVIeTlMVExCRFZ6Qjl3VzlOL3JCQ3F6Qkc4eStLK0xCSTJ5L0FIZkJLK3hnSm56Q3FIdUVLc3lsTUZGaUl1eXUKK09nekNtK3FPTDFUREczdkRNZXpDTyt5L01ieStNK3lJUUl5K01BeWRNbHU4TWp3U25KYkROb3lBUzB5dktYYkVUeHl3UVl5UUZyZGwKK3FFbHN5RUZsUzVlUVl0YWdEL0VvSFdLUnRRQkFINWtRZnhtZnJKU1BGT3FRL1pxZ1hXSTJGTGxuV3Z6RTFuc1EvbnRzWmFoWnhGMGMKK0VVQXBFSXVXZkJ4WHhiRDVhU0lKazRvTUVZZVdhQzc1eUlpTXhudVdjQWVxU1lkY29KRmN4UkRSa3dnanltOGNZMzM4eEo1MlBSMDUKK3lpUkpvQWo3d25ZNUVLUmlheVVYYjAvOG5BM3hkSU5NbmJGbXZycTNrY0ppRVI3NnhPbkdseU5Ld21Yc1ByUXB4dDl4Yk5xbmRuMFgKK2xZSkh3Y0FwZWdVVGJwTm15MXNNU2ZPNWJCa1hvODBwRWR4bWJrUEpLTndDQU1mTUVPWEdlRVpVcWlsam9GR2N5N2FYZlBFR0hmUm0KK2I3STVsaUtRenJBTXludDVsd3puT3RxOHpRSXh6TUs1UEtmcGF4QjNmNzhNSjI0WnpST3gwS3FhejF1Q3lSanNFSy9YbDdKN3l1c0wKK2NpS1hFTDB5bUdWWnV4TVJMVUNuZFFZaC9uVkRXcVNIYzZSUVNaUVFiVWM2K25JN2g2VkhFS1dRN05CRG8ybFRlbk5HWjlNM2pYbXEKK2s1ejlQQkdoMmNhWXJOSkwrbkl3ZDNYQ2V0UnRYTXFFVE5JTi9aRG9Bd0Q4S0JDRWg2YWhvS2JPdzZZdlRSQkZTYWU0ODNaeDU4UVUKKy9TeVhJeEJrN1R4NjkydkRhZEVYdlJBc1Nad0ZzZFY0NTlYQ2szaUxGNUxUVE5UWU85VVA4YzZmTE5pSDZzMXc0Z1dweDZKTTVIbW0KKzE1NjEwRHFGalJDbDV6L0hLV2VzNlhjVjRjcXViS01HSVh1MDkzTytxWjZjOThxQ3pSQVk2c203N00rLzU2a0dnYUhPUjVnVllYeXQKK1MzQTF5ajdoekJDeHFoK3BiZGVtYlpZeG1qR2lFTnh5N2MrMWtIMk1XUkFNQ2d0alVxRjNmTm9vSEtzdS9sRis1M2NUNllmRTlwaUwKKzdnZC9TVnpOTTBLc01KRi9WRndRdkpxeUhCeXdBSGplVEx5N0lNdmVXM3ErS0Z6SThOM2QyUjNmWEJ6QlBlekRvWHVPN2EzZi9SM1kKKy92M2VVQ3pnOTYzZStUM2Y5VzNmQnE3Z0RJN0ZuSnV2Q2Z6ZkEzNnp4bzNmOUwydUFVN2dDKzdkRWE3aEc0N2hHUzZLeUp6Z0pGN2kKKzFtcmhKbTdlSDM3aUs5Nk9DQTdpQVA3aUxON2dLZTdpQlg3Z0V5N2k4ZXZoTkE3ajhwM2p3TGpqRkM3ak5yNFFPVnUxYnVHMFNENFcKK1NyN2tZdEhrVHE2MFVhNFdVRDdsWEhHMUU1RzFlWnNaY2J2bGpOSGxYcjRZWUI3bWlESG1aSDRZWm43bWJRdUlJKzdqS0Y3akVuN2oKK0Y2N2lQVDdqYzc3ZjdqM2tQeTduL25BZTV5MWU1SDhlejI0ZTZINWU1M1krNkRqTzU0aHU2SGdlNGtGZTFFQU80VUt1NC96TjR4dysKKzZZK2U1NVN1NlpsZTRZU3U1NHArNkl2ZTV6RkwwSXplNkpFdTZlNWQ2a1RzNktyTzZhL3U2YWR1NlgwTzZtOHU2blIrNTRVKzY3YisKKzZac3U2N3BPNjZNKzdNUU82SWwrNjhiTzY3OU81S2krNThqZTdLR2U3TUhlNnc1K0UzRjhyRjYyWkhHTTNkZ2xtYWIrRXRrKzNzNSsKKzdBMnh4NUV0QWxLOWFacmNJUlI1eHJJTlpiWTZrWGJzeHFzdHU1ck03UitheDNXY3g2SzU3a29TeUFhWkt2R09QQTRweUNPOTNoRkIKK3luQ1N5UFdPRU1hSkpBb1B6d1ZOQlNiTGs2djhKVkFkRWNPc0h3cS9kWk45RUE5dlpoY2ZvaXZKL3RnT01TMFZqNDhqSDVQRFl2TEEKK0RwNGFnUyt6L1BFSllaN3FNaWtTTHhDczBBTk13SGorNkFoVGFSSHJMT2h3NWo0YURSRTJ6eEdUa3AwWHNmTTlYNVdPb0N6Qi9Od3YKK244L1lUUE1LOGFBTS9abnFwalIyY085Y3Z5MExaQkVTelQwRkE4OWEvekpvR2RQYytQVW0rcGtQbmR2UWZla1hjU2NMMTNENjF0TlUKK1d0TllpdE0vcDIwSmJSQjYvelk1MTZSQTdmY0NjU2R4enpCREtqVS9iZE9JLy9jVkxkdURuemRYMHplSHJ4Q2FocGp2bmtrcjdUYUcKK0Qva0kwU3NoRXdDUWFhRnRyaEIyYzlLdTA5YkNBNlpvL1JCUXZYYXVYenQyY05ZWFlUY3lvMm0xVHp0djNadGtSdnRjdlRtd2Y1MGEKKzh6dENNODFzemRXMmcvdVYvbWFTZ0QzdTFWNXBVZ2tsZGVjbzR2TXgxeG1SMGI4UU12QUZqMDM5bHFMVy9Wa1JsZjN0anZ3OUdRK2cKKzJROXVROE9jR3ZIOTRWOFJkajJkcVkvdm81K1lCbHFwU2tLZ2lvM0lBQ0dnVlMyQ0JRMGVSRmlRVWhFd3J4SStoT2lGUXF5Q3RFVFEKK3FWV0t3Q2VJSFd0UmVuTElZYTBYZ0R5ZUpDaVJZc0ZaQnpDaTlBanlrQXlUTUR1cUxKZ3BBRWVOSEcxQ1hOanc1ME9jQjF2YUdBcXgKK1pOS0NTNWthTERVQXdGUUFFd24yZkVyUVU1YzZxRWpXekpwUktsVUtvc1phRGJ1MXpnMndXYU5TclJyckxRQkhUTlY2YmRyMjZkeXAKK0V3c0pERnZyN3RmQVl1SDZwVm8zc0ZxMmhmbFdkWFZnS3RMQ0JKMHl2VnhaczBGVVl6emwvdDBjbXJObndxSXJkLzU4TUxQcHdLaEIKK3N3N3RlalZzemJOdDJxWmRHSGZ1ckx0NVAvWDllMmh3NFQrSkYwZDUvS0Z5NUI2Wk4xK3VGM3JTNTlOVlM3ZCtHM3YyazlVTmV1ZGUKK09yejI4Y08zbDA4SW5ydDY2K3padHorUC9ycDhtTytoMjc4Zm43NWwvUjN4Ti8rdnVBQUY3SSsrQVlVN2tEZjNDalNRUWZRU1ZOREIKKzhpRE1qVUxZRnR5dk93bkhzL0RDRGNQcmtMVVFSY013US84K1hBL0ZGRTFVU3NYc1JneXRSQmJUYzNFNkdHT3NNYjhabzlzUklSbDcKK2ZBMUkvb1Q4TGtjQWpUeVN5Q0dCUXhLNUcydHJra0FseFNQeXljcCtGTkpLM2FKRWtNc0lwNlFTU0N6RjlMTENNczJjVXNzdDAzUlIKK3pjRGM3TzFNMnVCa3NSSk1PakZ6OFFRc0xPR3pUei8vQkRSUVFRY2xkRkFOOWl3MFVVVVhUZlJRUmgrRjlGRkhJNlcwMGo4bnRUUlQKK1NqSFZ0Rk5GTmVBakt6Y2lxS0JVVTA5Rk5WVlZWMlcxVlZZZklOVlZXV2VsVlZaWWE4VTFWMXh2MWJWWFgxSGw5VmRoZXcxMldHTm4KK2ZlQVJNSmRsdGxsbm40VTJXbW1ucGJaYWE2L0ZObHR0dCtXMlcyKy9CVGRjY2NjbHQxeHp6MFUzWFhYWFpiZGRkOStGTjE1NTU2VzMKK1hudnZ4VGRmZmZmbHQxOS8vKzAzSUFBNwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3BpcGVsaW5lLnBuZy5iNjQgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvcGlwZWxpbmUucG5nLmI2NApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2Q5YWMwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3BpcGVsaW5lLnBuZy5iNjQKQEAgLTAsMCArMSwyMTMgQEAKK2lWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFsZ0FBQUVjQ0FNQUFBQXNtVG9KQUFBQUFYTlNSMElBcnM0YzZRQUFBd0JRVEZSRkFBRUEKK0VBRUJBd1VCQ2dNQkNBVUtBZ2tNSFFJREN3WVhGUVlEQmdrVkR3Z0ZDQXNIQ2hBU0p3a0RGQTRORWc0VERoQU5IZ3dIRGc4YUV4QUcKK0RCRWpCQlVaRVJNUUNCTlJEeFUwRXhjWkZSZ1ZGUmNnQ1JrekhCY1VEUmRDTlJFTEl4WVRBeDRtTEJVTUVCd2NFaHNpRHh3aEV4c3UKK0RoOFhKUmtRQnlBdERDTVVIeDRiQUNrMERTc2lHU2NzRkNSY0pTVWlHU1pDRGl3cUdDZzFMeVFiSXljcFZoc1BEeTB3TnlRVkVDeEEKK1BTSWZDUzg0QURKQ0VTdFdSaUlVTFN3cEFEZEhDRGtnRXkxL0Jqb3JFamhBRERoWEN6WnZJVE5QVXlzUUR6czhNakl2Q2owNEJUMU8KK1BERW9RakVoTURVM0x6WTlLVGRGVFRNWU56azJHRDZQQUVwZkVVVmpCRXhGQ0VwUEIxQXJLMEZqS0VWWllUc2NkRFlYRzBkNVNrQTUKK0ZFaUpRVU5BT1VSUEFGaENBMVJwUDBaSlZFTXZZVUF5QkZ0UldrWW5EbFIrUUVsZUFGMWprVG9qSGxWMUFHQjRQbE41WVU4N2NVd3MKK1NWUlhBR2FCV1ZKS1VsUlJSVlpsQUcxUFdGTlNCR3Q1QW1xVkFHK05BSE5wSzE3QldsOWlmRnM5S1dtblNHWjBZR0ZmcDFJdUNuV2oKK0FIdUtiV0JYb1ZOQWRHQlBEbmlXQUh1alRXbUxrMTRyQUgrY2gxOVhYMmFSWDJ0OEFJZUxpV2d2QUllZUFJYXFhMjFyT25laGRXMW0KK0FJbXNwV0pZajJ0TFczQzBBSXl2V1hhTkFvNnhiM1o1ZFhaemVudDRXSUtpUW9qQWVuK0NrWDFwY29TV2NZRE9vSDlmcDRFK1k0dXIKK2hvV0NYSXZHYjRtdXQzeHBxWU5ZbllkVU81ckR5WHhkalk2TFlKcWswSVJHYjVhelhabk1qSkdVZ0pXcXBKQjhsNWFVeUpONGtLSzEKK3JaNklZcXpnZTZYaG82R2RuYVdwZ3F5NnlaOXp2YVIwaHF6TWs2ck41Snh4dzZtRjI2bGJxN0MycExUR3dyQ2JzN093dmIrOHpjR2MKKzhycDQyTDJ4c01iWTNMK2p0TWZzejhXMm5NL3l4OGpIME1mQTdNV1U3OGgvM2NySXlOVG80TkxENmRLMXo5YmMxZGJUM05YT3Y5dnIKKy9PS1N3dXI4KytHdzR1VGgwZWY3OHVQVStPUEwzT2p6KytiR3lmSDM2ZXZvLyszYjZ2VDg4dlB3L2ZldTEvdisvL2JiLy9uSy9QblcKKzVmLysvL3JvK2Z2NDkvNy8vLzM3Ly83MS8vMy8vdi84c1plVG5RQUFBQUZpUzBkRUFJZ0ZIVWdBQUFBSmNFaFpjd0FBRlk0QUFCV08KK0FVVFVCRHNBQUFBSGRFbE5SUWZhQ1JRUEFpSkJFRk1MQUFBZ0FFbEVRVlI0MnUyZEQzd1U1YlgzMDBuV3dzNTBzaEE0bHlUR2lrUkUKK1F5MGFVQ2hLdkpacVRRR0JGTnVyVm8wRldxMlZxaEFxMGhjMHQxckF4dExMcHU2MWNVbDZnV3ROZTN2YjdaOUlLbStYcW4ydGtGaWgKK0dtd0ZBOVh3cHcxcy9VT3lDYzk3enZQTTdML3NiamFiWFRMWlBML1BoekE3TzdNN3M4OTN6am5QbWVjNWs4V2twTktnTFBrVFNFbXcKK3BDUllWbFNqcDVuLzMrM3hHR3NPTkh0MnZ4MXQwNFBOVGJ0UDhhVXVqeEF1SHZONlhqSGU3MjFwYm1xTHNwL0gwMjErY3JQNXdjZTgKK1RhOEV2aSt3S01IS0hLa3dqZi92QStELzc3U3JBS0RlZVRSaU8zL3ZjbnpEb1R6WGd5LytDRUtNYlZkdzVkaDl0TUd1YkFmdXVNamYKK0U3SG5mZ0FmL1g5eUpuNkF1cHF2MjA2Zk5mWWRYSHIvQWxvYzk0NEVLN1BCV2c5UXVyVnhsUTNzNzBWcytGbUFkUTBMQVA2QnkxY0EKK0tDVDJBc0JxWEttZTdtRWZhakJyMjVNYVRJamtTalBBMG1Ic1Zuei9HOGpnenlCbmE0TUdIL1V6ZGdIWXQ5WnJNTm92d2Nwa3NONEUKK2VKcGVIYkxCNVBEdGVsVDRML3dQNEZyKzk1TmlyUWEzNGQ4NWNCMWpYM2VBc0dWaGlQUnVSNjQ0V1BqT2FmeGdIWHc5dUQ4YXhML2sKKzMrZ2ozUDR2TGdKMFNyQXlHYXh6b0ZDc2ZwT2JKaDhhSlZNdHpVU01BM0paVHcvQWI4UktZY0QrUnZ1MmVoc0pKSUJ1OWxsRndkVzMKKzBsOE4xQjBDckRsZ3B6MUs0T2ZJa1JxZ1Q0Y09qTmtrV0JrTEZpTTRlalQ0blhqVnJjSC93YjlHNEJVVXdPY1oreENndGtoNzRDaTkKKzlJdTFKaWcvQmpoRGhtekNHVVR6Y2NhS054OWxBcXdTVUFWWTE3S3Z3N1U3UzJ3TG42ZlhSWEN6bjkwUDJkSVZaaHhZSWx4U2lDRTAKK1crOEYxbCtHWURVMGhHOTlQOS9nVnhpRUt4aUd2WVBNb0NNalQyYThmeHlSUWtRdzlIcEpnM0VCR0Ftc3I0UER6OEVheHo0RitVQmYKKytEanRNWjBXSi85WkJ1OFpEbFp3Zlg3ZmpURzB4OWliUFRGOTNENTJVRWRFTGdEOUxYWXcxOXp0ZUE3b25Nd0xBSHVJNzRTQjlRR0cKK2IzNzJES0F2TFFGNHhOLzdGUGxSLzE3Z2pEM0gvQktzekhXRllSYnI2c2lFQTdzTDRKYmdhNHpHMllkMnNDdXFhb0MxSDYzWVMzd0oKK25TVzNSeUZnc1EwY29RTHNObjRLZEQvM2d0Y2F1RzBIT0NJdFZnWUg3OEVZcTRmSFdPRmFETEE2dE1OSGUzU3QwbTBMMytJeGxuKy8KK0JxUDNpYjB4R3VlMkxSUXN0bXUrdlhqejEzbU1aWVJidWJob0Z3N3lYeVJZbWR3ckhNTjdoUi9mZ1ZHU2Ryb3ZWenZFVXB1WFlQaG4KK3dHOSt3SmNPYVREWjNHY09wVS9maUFDTG1iM0NQNW8wbmNlbUNjYW1RWTRFSytQeldEM3pZYXlOWXZjd1lVajBVaUNsZFRmKzl5WFEKKzJSTmxLbCs2QXcyWUxSQ3RVL0QrdUJaZ3hRRHI5aUlrcmF1SWVvMDY3T091OENmczM4RnhnaTkrWG9LVnlXQ3grd0JLRzV0MXREZlUKKzlNRTgxaGx5YnRraTNVNTl3OVhOdU9WTC9yK0lKYnUvNTh5WHdPZ0dkUGQwYVhBdXdYVTM4NGVBZFQ3WXR6WHFQUE8rSHV5YlBSZEEKKzloblc1WURSMnp6NDFudG5KRmlaREJiYmJuZlF2VUk3T0JhRjViRitaZHdlaEFMQ2orNG4ybjlxTERrSy84enhNZFNOamxBLzNVUDQKK3ZSRnFzZjQreGhHNFY4aDNHMHNCKy80cHRKanpCNWx1eUREVjFvdFVWWGQ5dmJHbXBYRnIwOXRkOTZtWGhhNWtUOVliNHBzZmJLeHYKK0VnTWREalp1RTJNVHpQZnJ1LzllWC84SHNhYldlTWNZM2VCdGFIckwrTGlEalZ0M0I3NXYyMjQvazJDTkZMMytEL2tiU0xDa0pGaFMKK0Vpd3BLUW1XbEFSTFNvSWxKU1hCa3BKZ1NVbXdwS1FrV0ZJU0xDa0pscFNVQkV0S2dpVWx3WktTa21CSlNiQ2tKRmhTVWhJc0tRbVcKK2xlUlAyOGY1MC9INUVpekxTbEhFREM5akN1R3hKNmNydG9VN1RrVmp4SnhrdUd1K1hWdk5wOXQwYlM5U0Z1NFJhMSsvUFR0L2MrUisKK3VGTGJmTUpZdE52TWJSazducTM0SkZpWnJQQjVoWWRzb0txcUE5U2pmYm02MVpoa09BZHdHMUQzSVZkMldoSkZHcDRDQis2WHc4SXEKK2tENmowUWJaUjNEM0YvaGU4Q1BqSFQxczNyMEVLOFBCNnJIQkxBUm1ieTdrUm01MzhpNFFZUDJKYWc0ZG13a09La1U2OWdqYnFjRWIKK3JPZGRnRDFzTDhERG9mdThEL0M0LzlnQ3lQSFRyTlZacDNvWGl4cFpqQ0NWWUkwZ3NIeThUaWhqZjFSdCtMZTdwU1d3MlU0YmpCWmcKK2ZhVUVrUkoxUUVUWnRlOFNoZWZEVDNDeHR1a1YxdFhTUW02eUJYZitkN05jMFQ5bzIvZDRTVWpDeWY4aVRKWmdqVEN3bmcyK0ZWS0cKK2phbnFNbjlvM1VnRExPS215MWc4M05yS1E2enp3YzQ5MysvWUZGRktwb0FxSXVrMDMvNWRtb0NQMWcvMDB4S3NqQWVycElXTFl6TUsKK29EVHc5QUNmcWdZMnc3QThyQ0RwSEVFVHpaYitrUGdDZUlwcUF6N0hPRDBQSTJ5WE1mWXBVY1MyZ0dvc0x3ZjdicThHMXpOdXduN0QKK0pGZ1pEMVpBRkJXZFR4VkJjalpIZXpKRktGaFBBZnlRd0xxRHUwTE9HQ3lzbWk4cUhTMEcrRGc2d1I0cUpIS0NWeTRhald0bjBsZWMKK1N6dmZEemN6Q1ZibWcxVlF4V1ZnczJFNm9hWS9IZ2NzUDNGVkt2QjZwR1VEQ0xDdTUzYU1CK2VFMEU5RTN5OW50eGV0NEdoNmEvUUQKK3EzUWk2MlVZeXlSWUl5emR3UHQvTzIvWGcrWDQrb0pGMWJOaEVWL2sxWWdXQ1ZkSVh2R2ZJdXBDUzZYejkvOCt4UUdRT3dkZG9YaDgKK0FCcXYvOEpOZjkvYTJnb1EwaldRWUdVMldIN1cwY2JKNmRMNmxMWU5zVmkzQW56TldIZnd5WFY3V0RDT1p5STRwN3B0UnZXL1hkVmIKK1Q4L0I0UDFUWnRuUmNjRkNXcW9FYTZSWXJDdlVmSFB0NUpoZ2ZUZVE1dXhvYnoxRFZkN0hFbEgwcklxL2NiNXdBeDN5Q0xURGJmNHoKK0l0MWd4UEVsTUFFN21DUXFGUy9CR2lsZ0lSaVhkZUR5VGtvV3NPN1cxaWhndllraGVDdUpQejduQkR1bVVUYnJWNUQzTnZPZFQyVkkKK2oyTzhoUnVkeHovOFlUOTdFWEw5Zm5TRnovblpxNEZucGJBK3o3eVFZR1Z5akxYY0FYYitNSUZGRVhtc0lGaTVnVTZrdjB0RnM2T0sKK2VHc0JmMWlGOWc5eWhMbk16MHZoK3UvbnBkM1ZOL2o3L0VFQnBXY0NZTW5nUGFPbHFDV2hTYXRkODR0VXRlREdIWkY1TEFLTHYreFIKK1RlR0xRL04xZGNabThmYUdFalYvNFZGMGhDb0hhYWFxbk9JcnRZWGl2dVAyTWxCbkJPdkVxNm9FU3lxK1FvYkM5RVI3dnlkeXE1RXEKK0NaYVVCRXRLZ2lVbHdaSktueXFtbFhSTHNLUlNyaEpsQkk1S2xtQ2xYK1VTTEtsMHFGS0NKWlVPMVVxd3BOS2haa1Z0bDJCSnBWenQKK3F0SXN3WkpLdlJTbFVvSWxsUTZ3RkFtV1ZPcWxLa3EzQkVzcTVhcFd5em9rV0ZJcFY0ZWlWRWl3cE5JU1pIVkxzS1JTcmxwRmFaQmcKK1NhVmVvQ2lkRWl5cGxLdGhaR1ljSkZocFY0RlNQZ0lIWlVtdzBxOEt0RmtkRWl5cFZLc2J3VklhZkJJc3FWU3JoTkNxN1pCZ1NhVTgKK2dpZTJ5dHE2SlZoU3FWV1ZTbFpMYmVpVVlFbWxWcDRDaGV4V2Vic0VTeXExNnF6Z1ptdGFod1JMS2cxbVN5bHZsR0JKcFZvdFFMR1cKK1Q0SWxsWEtycFl5QWpLa0VheWdFbVUrV0JHdElORTNKOUFtSEVxd2hJd3NrV0ZLcFY0bWkxRXV3cEZJdkpiTUhBRXF3aGtyTm1lME0KKys0RGw2K3c0KytyczdFblQrUTNSNlNSeXN4bTdodTNENUhRR0MxWjN4N0tjOFJOblgyWElkczFWYWRYVThlYlM3SWsyVytwSGxmamEKK1orUk1uQmc0Q1Z0NnorWXFXK0NIbXpyUk5yNngzOVBwVUpRQlBRakYxMGFuWTM3SE5laytuWWtYbTQyRHA2TjVPNU1IeTllUXM4THQKK0NxcHVmT2lyTkdqdE5hR3YzUE95V2xPSlZXZVZiVzNZQ1V5c1MrL3BUSFdHbmM1Vk9ZZjdPY0tDZ1NTek9tOGNYeE42QXU3eDZUMGIKKzE1SVZvU3k0THRZT0p3bFdzODBaL3NsbkdTeGFZVXVaMWVxdTdYUDBaeGNzMU5KK1RxZE5VYW9TUFoycXlLTS91MkR4Q3ovZmx3UlkKKzNma3JJei81N0lQbHFydW1LalZjZFVSZUpVTUJscXR1YW0zY28weTRzRU5uMzlNNTYyRFJWM29IREZaN1RsK0loZ0FzbDZzbVB4V0QKK0xGdWlRWFQyd1hLNU50cmluVTVWR2JRbGNqcmVpWDAvZVFqQVFodGNOVUN3V2krT3d0Q1FnT1Z5MmdiUGxXZGV0SzhiQ3JCYzduaDMKK2Jyb1ZwVHlCMDltNnhHVVJzRnhyeXdjRTFvR292L25RZ09WeU9nYWRJVnJpc2d4WVNGYjNJSDFoNDFLWFpjQnliYXdjQUZpKzBWRUoKK0dpS3dYTTZpd1hIVk5zOWxJYkNRck5pSFdwRkE5cjA5K3E4MFJHQzVWdFltRGxaQmRJQ0dDaXpYMm5XRFNqUEUrc1dIQ0N5WHN6cm0KK3NiWXFpcWUvODlGY2xnTExOYThsVWJEcVY3cXNCWlpyOW1BQ2VKdmJZbUM1NW5iRXVXRlkwcy9wRk5WWURDeTNMVUd3ZkJlN3JBYVcKK3N5UjVyZzZzZEZrTkxGZHNaK2lvNktlc1EzdU01aDA2c0Z3MXRZbUI5YURUY21DNVZpUTlSYW83eDJVOXNOWWVpSFc0MC9vYjc2ZTcKK0xBZVc2MkpmUW1ERk1saERDWlp6V3JKZ0hWNXBRYkJpbTZ6R2Z1N3FkQysxSUZnMWlVd3l5dktzdENCWXJxdVNCU3ZmWlVXd2xzUzYKK3h0djdpZDV2ckxFZ1dIVVRFd0dyM0cxRnNOWTJKVG1nWWJ3bHdhcXJqVG9FcHJNZHU0VUZGUVd4eDg5b0xndUM1WnAzSUFHd3BycXMKK0NGWk5lWEpnZGF5d0pGaXVyT2lEa3dPS1pkR1dXQktzdFo0RXdGcGlTYkJjU1NaSm05M1dCQ3ZhTGNQMkVMQmk1Ym5XV2hJczk0UEQKK0Y2ejg1TUNxcXJNbVdCZEdNMG1PQUZleHBsVTBiTFFtV0FuNGs2eWwxZ1JyWW5KZ0xiTW9XSE45MGJ1RWhtTDFER3N0Q3RhbEl3NnMKK2l1RUVGdXMzeEZwblViQXVsR0JaR3F3eWc2dVk0emtrV0JLc1pNRHFOTUR5U0xBa1dLa0VpeGNIaVRkeFZZSWx3VW9LckdZQlZyY0UKK1M0S1ZVckJFK0I3N3hxZ0VTNEtWSEZqMDBBckZLOEdTWUtVWUxGL2NFRXVDSmNGS0Vpd2V2bmRMc0NSWXFRYkxxeWh4NXIxSXNDUlkKK1NZS0Y0WHVyQkV1Q2xYcXdLdU9OVFpaZ1NiQ1NCWXZGZS95cUJFdUNsVFJZdFJJc0NWWTZ3R0lTTEFtV0JFdUNKY0dTWUVtd01oR3MKK0pSSXNsRk0zcGh6ck9zUTU0a2VIQ1ZpejlWRmlJMTFmR2U5MDFraUxsVzZ3d09CSmgvellXMTBFd3dVczBBMndJQTVZbjRBVkVpeEwKK2dBVVpCUmErS2NFNjYyQTVVZVo3eHJJVE4zSTZoeWRZRWFmRC95ZXduQktzc3dxVzh4T0EwamZSbXMvUkl0eE05b28wSE1GNmxCOTUKK3FWTzRjK1BNNXZLVkt5UllhUWVMV3lZT1ZvMHVJSUs3WGE1dkdvc1BEVGV3Nkd3RVdGOFZwNk1qVHVLSzRXUkpzTTRTV0tZUXJFa0EKK1pLd3VJWXdFU3hjdTJUUzhZcXlBVnJyY0FKTngzUmFBQ1VaYzlmMVM4b0V5eGpyYllOVUEzR0VFNjU4bnlBcVhPb2RkOEI0QzFoZjAKK3ZHL1R5cS9pLzI1eWlTdGw4RDQwTVZiSWkwSzYwRW16aG0rdmNLN3hvbzVlM0NBODRiMFNyS0VCeTJtOEdJZC92eGdJcm9ZM1dGdDQKK3dQWG81ZnhzN3BWZ25YMndURmRZUTY2UWErTWx3eGdzZElXYlRGY28zbDVUQUxsMTFnSnI0OXhKK1pmZW0rbnBoZ0lSdkY5RVhVV0EKK3EzSHhXd1pZem1FSVZtandqbDFCS3JsMU9ZeXpGbGlYR0IzWGgxSU9WczBOVUxwcG9HRDU0b0sxWmxMK1RjbUJaWWJ5K3NPOGE4ZzEKK3ppVXlXWW1DTlFscUJncFdkMXl3SHIwOC94cG5VbmtzSTkxQU9RWjNnVmlpMVJUSTV6MlVJRmczd05JMGd2VUZnTTlzcXJrSEQ2d3UKK3hXQlI1a2luZGh3UVdOT1VLbDlNc1A3VnlCMGtsWGtYNlo2UUJPa3NjMjJDWUgwWkJnNFdLTlhkTWNINmFqQmxPL0FFS2NkcEZoM2YKK2xvdDBJOFJ5OFVCK1pXSmczYU9uRTZ5NlBPQ1BxWGxVaDl0U0ROWkZVT3o4TkJTNkJ3b1dLb3l0SUZpSTZ0MTRvTmNsQmxZcUZBb1cKK0laZ0VXS2d3dG9KZ29YbjVURTBCZkRJeHNGS2hVTEMrZ0RTbUV5eGRYTGltcTlFTnIxaW42N3hUWGh4WUM2VjFCdWVvbS9pdU9sNXkKK3Q4VUM2OUZSOEREeXFuODdDYkRDMkFxQzlXOTBPUDhHazRZRUxQU2N5WUlWeGxZUXJHOVNCUDVsWFhjT0FWaG85d3JUQ2haNkY3MTQKK1pSaFhTTmJkQkp6UVZkeWFCVnpIcDQzVnBTNnhTYVFERFlLMWxuNnhMYUgyWlVCZ0Jka0tnblVSWEVneGQyN2RrSUIxdDJzUVlBWFoKK0NvSjFBem0zNyt1d2FVakErb3c3cmE2UW1wNzRtT2NNbXE4dlFLNGJGOUg1MTEwQ1k5MnVGYURqWGwrZGgzMlBGV2k5aGRtNmpiYlcKK0g2cUo2UXJYOHIxQ0RlTEVoZ1FVMGhJR1cwR3dkQUtySmhUbXN6dUNOQnlzMmZVSm5JNGFkanJFVmhDc0t3a3MvQlUzRG9rcmRLVVoKK0xJeGtkZE1lclJGbStmdWo0QTQ4MzZ1SUlLSURhZEp1NFpjVmdqYTVUdGk1YzRtOTBqZ3hsZ25XN0NBRlNqS3E2Z01XV0FPc1M1TTYKK25lb2dXSmNTV083TUJRdmJpaWVpNXhGQmhtNUNhdWE2WElheEt1QzkyZUpOTG1NdElpaU0ydXdFd0pvMU9MQ210VnZWWWlVRlZtWG4KK3lMRll3aU5laEU1dkJlVUh1T2FHZ2VXNmgvZHQ5VzhQRUt3K01WWjN2d3FOc1lncTY4UllmY0NhNjB2Z2RDQ2NLdGJIRlE1UmpKVjIKK3NKYUNrV25DQmZlYVlBOGxIQ3llN2RSaFhvZ3JuRndYb0N4R3IxQWZWSy9Rb0NwYXI3RFlaUkd3QmhTOFYzYjI3UlhxUTlZcjdCK3MKK2pzR0I5WDI2Mnk5dURseFdoL1psRnJiVW82VkxuU0ZnMVdGSEcvZmFNZ3JqOWpWODNHVWdlSThIbGlzditUeFdrS3J3UEJiRXltUHAKK0lTT3YrdE9XZ240M0FTTVptVEt3S2p0aTVySDA4L3JKWTlXSnpPN0ZzZTh1elUwMHV6MFFzTXBhQjUxNU44WWlmdHRNVWdIa2hvSVYKK1NFS1FDN29FOUpCMFExeXdSSmJpTnRmQXdaclczaDA5OC83cFdKbDMzWFRpL1lQbGpIL2JtU3MvcFdCVmRzVEl2Rk9PMHJpYkhCdXMKK3VvdjR1WVdsNlBzbTVWTVBWcjNTT0xnWXk4Q21lRlB3UmJFejNCV0t0WVdiQWdsUy9TWlgvMkFsZDY5d1dqaFZDZDRyMUVPenBta0QKK1M5Y0hESmFqc2lQdXZVSzRxcjk3aFY4UVJJVmI2dFNBcGNjRHE3VnYrYmlCQnUvT2tQa2V3UWtmNW45aGE4T1duVkhtdHd4NmRFTjMKK1VxTWJRc0NxeVo5MHp5VFJGZjNpcFB6Wm5HeTBjbHZtVGlwOWlDK2l6U083OXVpVkJjYVlqbnh3M1RQcHdsdE1kQzljRWd1c0NBZDAKK2RrWTNtUGNJTDlkenVTT25reEszbWRkY1daQS85YUVnV0Z2bUZseTR4RURtMFVtem5QM2RoQTcvN2d2N2xvOVRITjBqZlR4V0tGaW0KK3V6U2NmREYvVzd5NDJvekd6RnZTZk15TUdaL1IzZ1ZtWkdBWnNHN2c4ejhDU1VkeGVEUm1Sb3p1ZzNOTnNJenpYY3ZCbWdSNW13WUoKK1Zqa0ZoKzBTckZDdzlFL3k0VmFGYXlsRFY4eHBLdHhJTVIrYTJSbytrL0RMR0RnNzE1aURTT0dtR2d6ZnJ1VzRYYzlYV3dlc09xTGwKK1FtTzgzRmQxS04xWTh6bGk3VnU2ZnE5ejR5UWFKY1BCd3JkbWJkcDRFUjlJUXhIWmVYV0RCS3VXZHp1YVJ6cFlnVTRoZ2tQakJXcU0KKzd1NzNhYVNNRHZTODNHOXlqSndHVE5meFpicmhMcGI1OEN5QTh3U2IxZ0hMbUVFSUdoNnA4eEorZk00cjUyMXkxWHp4WHBjeE5wbkEKK2NuNkNqMTdFVVA5ZUF1dTgvbU9zL3NCcU5lNThqSFN3ekU1aGpSaHo1VFNHWHJub1J4WWpzcmFFZ2VVVS9ieFAwcDlOWm9yQjJNbFMKK1lHRXdkWkhSd1haSERyWmFjemtZWUxtTitZUno0Ync2Qk92ZXdZTmxQaUd2UkxwQzB4V0dkZjRJS21NdWRCaFloZ3BOeUF5d25CWUUKK2l4ejRGM1hJKzNaWTNRYTZIVUpwQ0FPc1FDcHZWRjNNQWNvREE4dDhRbDdnYVFnU3JPZ1dLeHdzcHlGelBvVlZMZGFhdVd2TlZQWmEKK2Q4ZzA1ODhCeGxoaVhyUnBzY3d6U2hGWXRZRzdCaTBTckFCWUdHTk5Eb214K29KMVhVamVNd1NzcXkwR2xyc0F4dktGYnlGWUdHTk4KK0VJSFVCTU1yZmlzUVkxMGlEdDFJZmFZQ3JOYmdYYzVhQ1pZSkZ2WDdKbStpWG1HaEt4S3N1eCtsMGZQWE83ZDhFZkt2RGdQclg4M08KK29xWFNEWVVyK1FDVVVTN1I5YXVod0FyQnl1V25od3dGZTRXdWU0S1Q3Z2NORmd1NWYxNHV3VExCTWdlN0ZyckN3ZUtCdmxHaHhaeW8KK0U3UlNZdlZ0Vm9xeFBnR0JDVG1CUE5iMTV0TGtBb3pUUlI3TGVDdDNVOHJBS2d1QzFUNVN3UXJlSkt3eEswVGlWVDVKNTVscGZKdlcKK0diVWp0MXl1eithWmQ5Qm1HKzhHdDNHdG1hU1hibkxwVmdyZXQrQjU1TTkrU0J6S2xoc2dWOXhPb0NOZDYvcUVQb0dxU05hSnQvUkwKK0h4S1o5NVNBVlJ2dUNlVk02TlJwWkJlM05ZTXNuNXhpTDhGS0pWZ3MxQTlLc0NSWUtRTUxnNnhwWGtXcGwyQkpzRklLVmkwOUgwOVIKK0NpUllFcXlVZ3RWQncyWXFGYVZqMklKVktjRnlXZlhKRk0ySzRobXVZSFdvRWl6TGd1VXowcVBERWF3eVJZSmxXYkJvR2tMMzhBU3IKK1ExSGFKRmlXQmF2QnZBczk3TUFxRC9ab0pWaldBNnROVWFxSEpWZ2ROT05MZ21YZHg4b3Bpam9zd2FKUit5REJzaTVZWnNKaG1JSFYKK3dXOGJTTENzQzViSG1GTXh6TUNxQ0J2K0tzR3lIbGp0eHBTSzRRV1dNRmhoMDR3a1dOWUN5d3l5aGhkWUZVYlpEQW1XZGNFeWdxeGgKK0JWWm5uMGxHRWl6TGdZVkJsbmU0Z1dVWUxFV1ZZRmtYckhhUnlScE9ZSFVHUmxWTHNLd0xGZ1paWlJZR2EzeDA3MjJvTmRaSkxiTW8KK1dMTXpDNndaL1ZRdEk3Q1dXQk9zL0hnR3l4eXczMWNQdXEwSjF2amt3R3EwS0ZqbDhRNjZtbzlQenBwblRiQ214ek5Zc1cvcXRGblUKK1l1VWtOMjZ4YzYwMXdhcVBkOUJlbmcvS21sMW5SYkJxbHZXdHN1YXBDbFRZajNsVHAzT3BOY0dha1J4WTdCcExnclhDeS9xTjNyTmkKK080K2hCR3RsaktFeHRYalFWWTdZMFh1M3pacGd0U1FKbG01SnNLN3FaUEdqOXdvRXk3dlVpbUNOajhHTjZCRjJ4NDVZS3R4V0JHdWkKK0wwbXdxalphRUN4M2Z2eURCc29IWmJIeGRkWURhMk5GOUVOdURZeDhqVGtPY0s0Rndhb3JZTWxxcWdYQld0RWMvNWdyNmVyUFlvMHIKK3JBZlcxSmhHVnVudjJ0ZmMxZ05yYm1mU1lFMnJzUnhZYmxzL3gxeEwzY0lzeG1MeE0zUmdiVndXMDJDVjlOdVJ1dEp5WUxuTFdmS2EKK2FEbXdsbnI3T2VSbXVxbURZTFhNc3hwWVd1d0lxLzlydjk1cE5iQnMzWU1BcTNhanhjQnlsL1YzeUhqOU54QllySHFsdGNDNnFqMkcKKzd5NVhLaEpvQ3NWdExiRG10clBCU0sreEZGanUvaThUbm0vSTRqT3FhcXdFMW9wdDBZKzNKZTZnNUpDNWJUbHVLNEcxb3BFTlRqWkwKK2dUVzF0ZDhEN3FaOEF3ZUw1VHV0QTliS1pUR3ZnM2dUdjBKN2hxUGQxZ0ZyUmZVZ3VXTCs4UllDNjVyZGlmZ01ESVVGV0t4a28xWEEKK1dyb3VObGVKdGxGblZHODRKR0ROYTJDRGxzOW1GYkRjRjcrU3lBRlRJaXZMek1RdHNRUllkZU85TVFOQ3BYSUFUYkhXRW1DNXg3ZXkKK0ZNaW5iYlFFV0hWS1l1Rml1YUlFd0dJdE9SWUFhNjB0UnBxcWFrQmNvWnI2SHZ6WkIydEZUZ2RMaldvbnVvY2NMUGU4R3hQczNsWXEKK1NuZFc4TEpZTjk0NXBHRFZyYzJLWWE3YW9DRE9VSmtZN3ZER3FlNGhCY3U5SXF1TnBVeWRreUpHQzV4dHNOeExzaEx1M2FJWjZNd0sKK1BmZ20yOVNON3FERy85eWRWbTI4SnVURml2SGoyNkpmRUIwbDJCMVVCdTVUT21welp0ZUVmTVBFOUo2TmU2b3I1TVhTOGVNUHM1U3EKK1k1bnRHdWRaUEowbEs0TExkVXRzbHc0Z2FWS3RLQjFaRVVkL2VPdkNTMDFwbDZaWitlYkMzR1ZON1RGU245NENHaWRUbHR4ZDNJN0QKKzYyNjg4bXlkVHNqbkwvTzJkN0xVcStQQUE1ZWV0ZGFaZEtHNWRPTURMZTBEeXZIU1BaMHNabVY1eThJcnBrb05DOVZiR3F6MmFuU0IKK05MU3ZvRTAyMWZCU2c2SzBXUk9zMXVvQ1k2eG9XVU9IYkNnSlZpclVWbFVnTEJXRzdNMlNxdUVvQzhaWUxXWEd1UFlTcFQ0dDhhL1UKK1dWQ1VYdUhRcWtwVitGT3JvYkhkSjV0bldJUFZhU0d3cXZqc2VhVmFRalhjaFMzcHN3eFliZHdIMXN1Z0tnTlVFWHF2Y0lqbEFhcDcKK0pXMVZScWpFT21CNU1Gd3ZsMWhsaUdpcXVqWEFva0V4SHRrZ21RTldwVFhBNmxRS2xHYlpIcG1panNDWWR3c0VlOVd5UFRKR0xZclMKK2FBbXdPaEtjSlNFMVBOUklqejJ4QWxoVjVZcFhOa2ZtcUlySzIxb0FMRi9jaDVoSURUdUJxTjFnaFM2aGpMQXlTRDVSeG1qb0Q2UTIKKzhMaFhxVXlRbDJKM0s0QlZFTy9oT0ZMRFR0VjhZdkhRZzlXdHFPV3lOVEpJb2pqZTBJUFYyVzh4TmFuaHBMWXkvcFNtb1FmTGZGeVUKK1ZNWjR3aGFyZ0ZVcm15UFRQS0VGd0dxak1sMVNHZFFuckxZR1dMN1dWcGx0eUJ5Vkc3TkFzK1JQSVpWYS95TnVvMGl3cEZLcFNoRzYKK0p3Q1dQNEZQQzI3VE05QUQ2WW0rbTE4MlVVcDB0bjlITkZoR1RmdElzRHlxa1FaWFZQRWtudTN6ZFZXYnNibnZJUis3dlVqVkZ1NGoKK0pqN01Va20wNTRZaU5YL1pVYkZubWE2V3JPNjc0MEdiK0lwRCtNa3pkb2lWRzByVS9EdFBpYldBbjNCNnhDTlJGbXdJVWJuaU5meTkKK0hUT1duWXFHejFQbXhvOU5kemhtUEUxTE84dDByV1ExZ2VYZkgvSkRCL3B1cWlHeUx4dW02OFplMkJCMmJlR0pucVNQMmpSWWZjRUMKKzgzeUErbXBkMDRGbU9RQVVIbzNZOEtBT3FtSUQvUTkwemhxUVZOWTdFeHk0dFVZYjM2L2huaHBjSC9uZHZWT0FQeUgxVlR0azQvdGYKK28xWFQrV2NWY3Vwd1VhUEZrUjRFbXczaEFBN1dCZ2YrTVBqTDVMN1VsNnREWUd5OGdGb0w0QnZNLzR3RGYxM2d2LzUrdnVqNFFkZysKK0toaENEaGFiZXpGMks3YWZUYlJmTW1wV3Bwa0RWZm9CYXc3a1BPOWpQWHR6WUhMRWh0K0ZjU2VZYnc1Y2hzdTd3TmJXaW1JdlF1NFIKKzVsdE01M1BjQnQvenM3MmE0M2ZoKysyZkFoeXNyby9Bb202MjEwYnYveGhtZExMOU52V0hqSDBKaW5GUmd4OUtzTUxBZWdiZ0VldzgKK0h6NGY3SDNzeVU0d3dQcC9HanpQMkZPUWQ1UmRBRGY3MmMrMHZMY1ltd24zK3RrTDJxaTNRdmRwNVZvT0UvenNUUTJldzcyMHZEL2oKK1ZubDdtRzhCM0paa0J6K2tNRkI4c0Y3VGRIR0JZRlAvbEVLenFzRFE5TnVuUDBCWkM4amhrRjBtVmw0QnRQTHZOdnQ3N0VDRmZob04KK2NSYXNZNjlXVmYyWnNXTVBWRzFsYkw0S1l6bFlmOVgwZHhneHRZeDE1ZWh2MExtKzNjbFlOaXpqWDc1TWdoVUcxdmxHWTZPOXZ4ci8KK3E2OEtGczZjRG81Y3NmSDIrZGwrUCt0Vm9ZM1JQOGIvL3ROR2RDRmV2MlFmUEZCRnJiaWhxbExFWG0vcW80NzBzR2ErRjI3N0Nyc0wKK3JzUFZ2OVd5MzBzMjFSQVlBQlVmclArQTg1aUp6RTE4WlVTUy9IOWhIUDQ5Qng3WStXQVRJeXlxeGI3L2JZVGs3K2ZBOTFqdlI4amUKK2ZSWkdZM3lnYU0rM2NiQmFoVU5zaFFsbzNFYXpYZFZiVDlEckwwRXBXak9idEZqaFlQMEpIQ2VFMi9zT2pNS2xTZ2lPQ0ZGSzl3VmYKKzRtLytUdzNlUm91RnJ1OU5zbGkvRUpnc2gyc1ord3JrdmVWL2hsc294bUY3T3JpWERmYWdnL29sbzBVMFhrbW9VVkVjTERaWWp1b3EKK1ZMV0R3UG80UEJJZ2FBS2RROFNRdkpPajRCYkdQckJ4YjEzNEZ2c1l0MWhkV2ZDNHNjSFB3UDRHdDNkUHZ5aHNYcHZmUU9xdm9OUDUKK3ZncGowWGdWTG5BQU9PZ3NqK2ZBd3FycFVDeGpMSEJVOFlZQUF1czdrRzEwOERnMnZDNnhxYmZET1VONnNrK3hGMno2c2dkNTNQU0UKKzJIVVZOV0RYR0RqM1E1M2JQR0daVG9YdTlRNGJBMVRHdlplTTE4RFZHbFlocnk5WUFUV1FCZHBxckJjK0wwSVkydHVQb01PMFFmSHUKK1hXU1cvZ1BHWW4vdVpRME0vbDZ3d1NMR1k4SjhIUzQxRDRDRGhUSFlOL2hGbzdFREFMazdXcGFEZzhoN2lyNDZTb1E2OHNBS0NGdXIKK0lraU9nOENLekI2RmdMVWU0RWNpamdjWWkrQThLTjZyb2diMHY0RFJQMlFiVWRvY3ZxSFFVeHBaTDdzZ0tpbXdPc0xuaHZZRlMyMXQKK1FiVXFrV0NON3ZOUko2ZUEvaXpGYkllcDh1d2hqTk5QNWtCaDFlMDZZR0JGOXZVWkpJNWZFeWZScHVXK0V3WVdHak8wVFdYQXdkSi8KK1luckIrMEhiMFhLZnB2OVVnbVUwQkpidDdoVUFBQXZQU1VSQlZBZnI5Z1RCNm1IM1lWZlFUeGZzMk4wdE15SG5SQmhZZ3JkZmkyM2YKK3RJMDZZdTYxM2dHei9BVFc3bVRCb3NBOWRKUksvQmpyaW9Bci9IRWcyZ3JvMkJTdy96b2tqWkFGbTltaE1RNXd6TG9DQXlzOFdyd0sKK2lrK1pmVWhodWtMQUl1d2dlN00yRGwyaDZ1ZGVNWmNkcyttL1lSVGJUWlpnaGNaWVFWZjROOTdUaXdGV0Q0WlNjSXVmK29mMm94eWoKK080S3VrRGZnbnpRMFdHS24rK0JmVEs3dUVuc1pyckNMd3EyQmNsVVdNYXl1ditEOVhBcUg5akdNbmg2SjVLb0ljdmFGNWR5QTBxZ0gKK1d0cllLUDEzd3JwZWIvd2F4NUFobnZFS0JZc2RhMjA5Y1FCbW9WZmtZQjFBc0E2STl3NkFKc0VLQmV0dkdGbWgvM3FlbmVFUlZFeUwKK3RSeDBIbyt2TXMyVXpRemU3NExQaTNoZEpLeTRKL3lsc1R0eTlYaklxbi9tRERoNDcxU1ZhZUdQa293UDFuNGJ1ZUhQMm0vWnpvUHcKK3NQaHFDb3cxMEo5VGNnc1BtdlRmZFhxZjlOTlNEdjdGYVAwYjVoVXhFd3AxeVBmN1E4SHlObnE0S2ZzYTY4MkIzM0NqZUM2RjlQUTkKK2Y4U1FYb0lWbW02WVFobWRYNmpGZTNYNEFZc0oxbnJJRXgyK0p3Uit5OUZNWWRlS1ROd0Y4SHNSd1k0Rm5kdUREd0o5UDF6NVU5T0kKK2tWbjdIeTE3Z0xlQzJxZ0dZL2NBd01JajFWZWY2TDBQSXo1K1U2ZXEyaHNTSXk2c1JsVlJqMUhmd1k0dFFQZDF5SWJvNDlMWDBCemwKK1FDNjlYKzJoY0VyL0RmWU1idzZ6V04rRi9DTnNseTMzSFQrK243K0g0VS8yRGRhVlE1MUxYRndvd1FvRDYwME5GdTVoTDRNT1k2blIKK0c2cXJvb0NGRzQzbHYzbjd1N253dFZOc3UwN3gxQUlvUFlITlJSN3dYUjF1Um90QWVSL3lsaUxxZlRQWDJLc053eTdIRG5ad1NxQlQKK24zRENYVkdtUlZTQzd3Y3NkcDhHcXVwQSs1bS8yUitheDNyZlpuUlpjUE5ldEsrcUNxT1BVT3hOUzZWK3NqK0dxc2dSTHFMcnduQ0cKK0Fpdy9rcWVyRHBWSGFZdHBFUXI5M0ViUzkya25KRmpodDNSZXR1TVB3Mi9FM0hra0lyOFFlTG5BL00zYktJQ2xyU2tXT2E3VEl2K2gKK01aby9SVmMvWGVML0NkbW5UVWNZdUx1em5wb2J4cDBhMEtGV1JudlFVVmJmSkpjQmxpSnVRci8rV0pHaVBkQXlCZkxlQ00xamVSVlQKKzlHcFhtWksvbVRxeFBUdW5Lek9hNkpvNngzeS9xbXVNTXByV3pGRnM3eG41RGhGaTNXZTMzV2tFb3J1bUs4VTd1UDA5OW1RUkxwNGEKKzZWeXhhY0dHRU1taFk5dkxzbTBMbjcvTFFiNndQSHpLWElWNCtSSHpOOGRlK3NGVmV2YU01M2xPOWRnRzNYWW51Yi8xaWtKNW5LY1UKK0JkM2lnK1pIQlBZaWI3UjNmbmIrNXU2QjNJUnVkU2pSeGdBblBHeG01NTJKZjVjL3VhM2tXSmxFOVBwTVMxMTF2SEpzbEVjOHlJRisKK1VvTlFnd0xvQnFPVllwUmdTU1d0UmlwSURDMVIzNU5nU1NXbjdscFI1enBHNVZnSmxsUXlhcTBVUGJPWVR3K1JZRWtOV0czMTRzRTAKKzFYSG03VW13cEFZa1gzTWxVa1VwQmsvYzh1a1NMS21FMWQ1WWFUN3VyN3EvaDBoS3NLVDZWMmVycDdxaUlKQVRyMjd0LzBtK0VpeXAKK2FHcnhOamQ3R211cnF5ckxTeHppT1g5Q2xjMkpQVWRaZ2lVVlRhQkVDRmVVMTdZay9uQnVDWlpVTkJXRU1GVlFVZTFwYVJ2Z1kwa2wKK1dGSlJYU0VmRnQzVzNwSHNZMjRsV0ZKcGtRUkxTb0lsSmNHU2ttQkpTVW13cENSWVVoSXNLYWswZzlWYWIwendxcTNuUTA1N3ZRMWIKK205Nk91dXZMOVh5U29aKzFORzdiN1JjVE83ejFUZWJFcmRjYnQvV3RBSEF3dVBKZzQ5YW00TFFBMzlaNjJSZ1JxcThYMlVtUDBTWUgKK0d1dTNSUytxOE81V3NRVzJSUU51d3R1Q1dpVjJVOVRXRzJvM1dsRHM1ZS8xMWplZVNBZFlFZk1LdDl0cFRxRmFHdVc3anVYd1NZYisKK1k5TlZBSWUyQjQ5cmZ4NXViZU56dkh1WDIyaS84RnFpWW1YaFcrWWkyQUtWTVJlYjgrNmxBbktBR0VnblNzM3NuMEt6Q3RYUmY0aXkKKzVRTFJhdjY5T3BXREtqN1J3OTZmU2EweW1zOTV2cy9HVjRidEVWSXEwciszaU85MUJGdndOV3BCNWZHMGcvV3lCb3VhbWgrenc4VjkKK2RqdzVFemhZdlJkQS9qYlBkQmo5SGsxTUxXM2FZSE04MjBPZ0ZEWTlhYVBxV1NGYUQ3bGJQVE1oMzArVG94MnJteGVJQ2ZXTVYwS1UKK1lNVUY2MzBkeG0xdGJpd0MrOXRuSWpkY3I0bFd3MjB1Ym1vRUdPZEgxT3liUFVVMFB4Vi9kZnRXWER3M2JIYWR1QXVvUWQ0K0twcUYKK2V4WEJ1Tk8waUMyb09YNmZickN1QUY3MStHVXRMNktTS051WkJ3S3MxMnhVMWVHa0RiN0h2c3RyeFB5V2l2eTlwdUhKc2YrZHNTaDAKK24rTTJlQlpKL0JoODd3ejdHRTJPN3JJWjVSME8yU1JZL1lEMUhiQVRHYjFUcURKZm1GNmJhZFlnL1k1cVAySFU4UnRGayt2ZjFhaGcKKzVCaDRpVE8zTDVxbFErUDBQemFhYS8rdUxXOFBld0pvYXZFR1htUXZyV0JsR3pWbW1wcmJPT1dCUXBGZXNEK2ljckE2VzcxaTgycUUKK1pSMWRObFJSOU1lOHRCOTNmM09VMGFmUnJpbWovWDhGbFZ6amk4VFVPWHlETEY0MG1maytrdnVzQkNzK1dCVkdJU052TTlYa0RKMEoKK3JVRHBqYUxWMmx1YWhadHJZenEwTWxHTjlDL2FxS04rY2lFL1lGMTVDdHF0OS9sZjBsTlUyNVlkTnZlaUdxUVBNZGJ6Rjl1b2Q5SU0KKzFxMlF1L2xFeUJrRUF1emRxOThLSzBpS0p1Y25pT0U2c2RrUDBkVDk4TEVpMjhJOTZQZVBVNm1BbjRIK1VtalpVVnhSZklUdDBrUU4KK204WHcrQUVKVmhTd09vTmcvUXJnem1BRUhscTdZZUh6NGFVY1hnQzBXQXZnc2xPaUVzaC9DaUtwR2hZVjlIdVdpa0tLTnYxd2xCNjAKK1lpOVExZVNQOHpKR0grYmsvU0VOWUJsRHZIaXB5SVBaNktKbXJETk95TlBjR3VhbWcyRDF6aVMvZmdVUHFkQXJia2J6UzFYZXdmNGMKK3Z5NzA1M2dkaXRjMEhsTDlHSEx4c3RnQWRrWFRuaE1CVmlscmsyQkZBY3RzQ3NKbU9qYUZ0c3pvU0h1YlBhRmJob0oxdklqczBNa0YKK29Db3dEc0Y1RExKcDlTcGVrbkVCWkcvWHpLSkY2ME9LNloyY1FudnB5VmYwR3hoWTdPQUM2cnc1dE9laTdCb0VxeGVqOEY5VEtPYlkKK3dVNHVCL1NLMmFBL3ozejNVVWpQdXM3Qmp5aEdKOWg3RHN3NHdmYm1JRVBZbDhUdlVlRk92eCt0WGY1cENWYS9ZUFZ1NEQwNVpYV1UKK0VoY2hZQ0ZYbzQ1UVR3OTNkdUFsN2crVWlxU20vcnVPSDJFNHd0NHh3Y0o5eU5Xb2ZVUlVpd0JyZDdyVERlaUJQYmRuTzBCOUxnNVkKK3ZwbWdQbTNVS2NTektjTFRHV1VhTHlxcnZWOER4MHVVSlRtRVRDbFU4SWhnVzNTS3ZmNFIzT3prbUZ3OHBYWUpWbnhYU0wrejk3RTgKK296UlJUTEFPNlpDTnNmb0hPbXoyVTUyeGw5QmlLVUdMUlVYVzdFZEV6dkczV3JhWkRUcFdKS3ArcHRWaWhZUEZqMkh2K2RINkNTWlkKK3ZpbkM1VkZmY2JveVk4OFY4Ti9vRlkyQzd4UjF2YW9CL0pwLzBMRlZEdTJCVjdRSjlQaUFmL0E0Zmh6YUtzZ200d1ZLaFdRcFRoNUwKKzZQQml5RHNSR3l6a2l0ZnZOQUtyNVJoWWhjUllJcStqRzJEZEJYZVlOT1pCRGpkZUlzYjZJTWs2NzRtRGRXRFZGTkU5MkFXMm1HQ2gKK0ZkVkNlN0pkT1hhelY5aWJSVlZ1dThhZytSMGQ3R2U4Q25NcGpxZXpmUjAwQXN0UXBXUXBObGlQbGYxY09MQjRWWk9QNi9RZ0doYW8KK3diMEtjdGlmZ3IxQ3d4VWFkZFhHbUhZSnZlZTRJMGFhbW5xRmY3TFowOXdyeEw3ZW5jWVh4clpZaXlIWGVLYlBYOHZ6M3FGSWF6TEYKKzZXT1BVb1Z1OVExZWJuS0hxUGYrbFJMNk93YzdrR2l4cU1iNHJUQ1pkWGhJOWVCbzlrcVdZb00xblVwck0rcE94N0ZZUmZCUjRTZC8KK29lbEhlTUQvZVFMbzE0RThsZ2plZVdiOWJ3RzdORjJVbjJRc2tNYzZMOTE1clBzQkNtc2JuNXdPS3NWSUVVOEY1MkNkMmFzWjRYNDEKK0ZSRE4zL2FZM2Y0U3o3eHJXNThjQmJQUVFGRVc5QmxlMWY1RjBGYzN6T2VQblZoTWk3ZHJqaDhaYVdRWnZQY0Qxc3NPeUZtM3JXRzUKK2c5ZDVqS2pvSjhBNlF3OWZFQlg5ZXFmZzFnMFhZQngvaGpMdjZ4cEU1djFuMUNQOGlxaHVhMVJUWm1lZU1mZnlrbk9ac1cyVkkvMloKKzk5NE4yZnhlb2ZaOFJCNHJhTEcrWkRveURLcjJaOVA5UHg1djlTN0hxRW1kZFlyNkhzWGNObzArS2xiYVo1R0I2NkViV0pEOXRQbGgKK0VxeitZcXhkT3ZVS0hhSlhHTDBHNmN4Z0RkSmovRjVoRG0rMzlYUmZneXJ1b3lPOG1TZnZQM29xOENnVThpREIyNFlINmJhaDhqUkwKK1BWaHRua2F4ME9qaFNhdmVsbVpQYzF2WUtsT05uaGIrMXhDOTZQVjZkcHNqRmw1dmJxTDlYdmQ0NkthenI4bERIWTREWWlYcElHNGIKK05Pcm9FQ1ZKa1JlNVIvUUt2VWFiSFBCNm1sNDVGYmJLa1BIU2JBcFBCLytwUGE4WUh1NWdjeE1mdk9EMWVHajMxendlRE5OYWdpMXQKK2lNOUdiZkUwcDJWMGc1UVVrMkJKU2JDa0pGaFNVb1BXL3dmcjV0ajh3Z0UrSHdBQUFBQkpSVTVFcmtKZ2dnPT0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvLmdpdGlnbm9yZSBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvLmdpdGlnbm9yZQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC8uZ2l0aWdub3JlCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsLy5naXRpZ25vcmUKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvYmlibGlvLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvYmlibGlvLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9iaWJsaW8ueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2JpYmxpby54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvY2FwdHVyZS5jLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvY2FwdHVyZS5jLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9jYXB0dXJlLmMueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2NhcHR1cmUuYy54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvY29tbW9uLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvY29tbW9uLnhtbApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2NvbW1vbi54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvY29tbW9uLnhtbAppbmRleCA5MDI4NzIxLi5hODZmN2EwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2NvbW1vbi54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9jb21tb24ueG1sCkBAIC0yMzYsNyArMjM2LDE1IEBACiAgICAgPHBhcmE+VGhlICZWSURJT0MtUVVFUllDQVA7IGlvY3RsIGlzIGF2YWlsYWJsZSB0byBjaGVjayBpZiB0aGUga2VybmVsCiBkZXZpY2UgaXMgY29tcGF0aWJsZSB3aXRoIHRoaXMgc3BlY2lmaWNhdGlvbiwgYW5kIHRvIHF1ZXJ5IHRoZSA8bGluawogbGlua2VuZD0iZGV2aWNlcyI+ZnVuY3Rpb25zPC9saW5rPiBhbmQgPGxpbmsgbGlua2VuZD0iaW8iPkkvTwotbWV0aG9kczwvbGluaz4gc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UuIE90aGVyIGZlYXR1cmVzIGNhbiBiZSBxdWVyaWVkCittZXRob2RzPC9saW5rPiBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZS48L3BhcmE+CisKKyAgICA8cGFyYT5TdGFydGluZyB3aXRoIGtlcm5lbCB2ZXJzaW9uIDMuMSwgVklESU9DLVFVRVJZQ0FQIHdpbGwgcmV0dXJuIHRoZQorVjRMMiBBUEkgdmVyc2lvbiB1c2VkIGJ5IHRoZSBkcml2ZXIsIHdpdGggZ2VuZXJhbGx5IG1hdGNoZXMgdGhlIEtlcm5lbCB2ZXJzaW9uLgorVGhlcmUncyBubyBuZWVkIG9mIHVzaW5nICZWSURJT0MtUVVFUllDQVA7IHRvIGNoZWNrIGlmIGFuIHNwZWNpZmljIGlvY3RsIGlzCitzdXBwb3J0ZWQsIHRoZSBWNEwyIGNvcmUgbm93IHJldHVybnMgRU5PSU9DVExDTUQgaWYgYSBkcml2ZXIgZG9lc24ndCBwcm92aWRlCitzdXBwb3J0IGZvciBhbiBpb2N0bC48L3BhcmE+CisKKyAgICA8cGFyYT5PdGhlciBmZWF0dXJlcyBjYW4gYmUgcXVlcmllZAogYnkgY2FsbGluZyB0aGUgcmVzcGVjdGl2ZSBpb2N0bCwgZm9yIGV4YW1wbGUgJlZJRElPQy1FTlVNSU5QVVQ7CiB0byBsZWFybiBhYm91dCB0aGUgbnVtYmVyLCB0eXBlcyBhbmQgbmFtZXMgb2YgdmlkZW8gY29ubmVjdG9ycyBvbiB0aGUKIGRldmljZS4gQWx0aG91Z2ggYWJzdHJhY3Rpb24gaXMgYSBtYWpvciBvYmplY3RpdmUgb2YgdGhpcyBBUEksIHRoZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9jb21wYXQueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9jb21wYXQueG1sCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvY29tcGF0LnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9jb21wYXQueG1sCmluZGV4IDlmN2NkNGYuLmNlMTAwNGEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvY29tcGF0LnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2NvbXBhdC54bWwKQEAgLTEwLDEyICsxMCwxMCBAQAogICAgIDxwYXJhPlRoZSBWaWRlbyBGb3IgTGludXggQVBJIHdhcyBmaXJzdCBpbnRyb2R1Y2VkIGluIExpbnV4IDIuMSB0bwogdW5pZnkgYW5kIHJlcGxhY2UgdmFyaW91cyBUViBhbmQgcmFkaW8gZGV2aWNlIHJlbGF0ZWQgaW50ZXJmYWNlcywKIGRldmVsb3BlZCBpbmRlcGVuZGVudGx5IGJ5IGRyaXZlciB3cml0ZXJzIGluIHByaW9yIHllYXJzLiBTdGFydGluZwotd2l0aCBMaW51eCAyLjUgdGhlIG11Y2ggaW1wcm92ZWQgVjRMMiBBUEkgcmVwbGFjZXMgdGhlIFY0TCBBUEksCi1hbHRob3VnaCBleGlzdGluZyBkcml2ZXJzIHdpbGwgY29udGludWUgdG8gc3VwcG9ydCBWNEwgYXBwbGljYXRpb25zIGluCi10aGUgZnV0dXJlLCBlaXRoZXIgZGlyZWN0bHkgb3IgdGhyb3VnaCB0aGUgVjRMMiBjb21wYXRpYmlsaXR5IGxheWVyIGluCi10aGUgPGZpbGVuYW1lPnZpZGVvZGV2PC9maWxlbmFtZT4ga2VybmVsIG1vZHVsZSB0cmFuc2xhdGluZyBpb2N0bHMgb24KLXRoZSBmbHkuIEZvciBhIHRyYW5zaXRpb24gcGVyaW9kIG5vdCBhbGwgZHJpdmVycyB3aWxsIHN1cHBvcnQgdGhlIFY0TDIKLUFQSS48L3BhcmE+Cit3aXRoIExpbnV4IDIuNSB0aGUgbXVjaCBpbXByb3ZlZCBWNEwyIEFQSSByZXBsYWNlcyB0aGUgVjRMIEFQSS4KK1RoZSBzdXBwb3J0IGZvciB0aGUgb2xkIFY0TCBjYWxscyB3ZXJlIHJlbW92ZWQgZnJvbSBLZXJuZWwsIGJ1dCB0aGUKK2xpYnJhcnkgPHhyZWYgbGlua2VuZD0ibGlidjRsIiAvPiBzdXBwb3J0cyB0aGUgY29udmVyc2lvbiBvZiBhIFY0TAorQVBJIHN5c3RlbSBjYWxsIGludG8gYSBWNEwyIG9uZS48L3BhcmE+CiAKICAgICA8c2VjdGlvbj4KICAgICAgIDx0aXRsZT5PcGVuaW5nIGFuZCBDbG9zaW5nIERldmljZXM8L3RpdGxlPgpAQCAtODQsMTIgKzgyLDcgQEAKIGRldmljZSBmaWxlLiBWNEwyIGRyaXZlcnMgPGVtcGhhc2lzPm1heTwvZW1waGFzaXM+IHN1cHBvcnQgbXVsdGlwbGUKIG9wZW5zLCBzZWUgPHhyZWYgbGlua2VuZD0ib3BlbiIgLz4gZm9yIGRldGFpbHMgYW5kIGNvbnNlcXVlbmNlcy48L3BhcmE+CiAKLSAgICAgIDxwYXJhPlY0TCBkcml2ZXJzIHJlc3BvbmQgdG8gVjRMMiBpb2N0bHMgd2l0aCBhbiAmRUlOVkFMOy4gVGhlCi1jb21wYXRpYmlsaXR5IGxheWVyIGluIHRoZSBWNEwyIDxmaWxlbmFtZT52aWRlb2RldjwvZmlsZW5hbWU+IG1vZHVsZQotY2FuIHRyYW5zbGF0ZSBWNEwgaW9jdGwgcmVxdWVzdHMgdG8gdGhlaXIgVjRMMiBjb3VudGVycGFydCwgaG93ZXZlciBhCi1WNEwyIGRyaXZlciB1c3VhbGx5IG5lZWRzIG1vcmUgcHJlcGFyYXRpb24gdG8gYmVjb21lIGZ1bGx5IFY0TAotY29tcGF0aWJsZS4gVGhpcyBpcyBjb3ZlcmVkIGluIG1vcmUgZGV0YWlsIGluIDx4cmVmCi0JICBsaW5rZW5kPSJkcml2ZXIiIC8+LjwvcGFyYT4KKyAgICAgIDxwYXJhPlY0TCBkcml2ZXJzIHJlc3BvbmQgdG8gVjRMMiBpb2N0bHMgd2l0aCBhbiAmRUlOVkFMOy48L3BhcmE+CiAgICAgPC9zZWN0aW9uPgogCiAgICAgPHNlY3Rpb24+CkBAIC0yMzY3LDYgKzIzNjAsMTYgQEAKICAgICAgICAgPC9saXN0aXRlbT4KICAgICAgIDwvb3JkZXJlZGxpc3Q+CiAgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uPgorICAgICAgPHRpdGxlPlY0TDIgaW4gTGludXggMy4xPC90aXRsZT4KKyAgICAgIDxvcmRlcmVkbGlzdD4KKyAgICAgICAgPGxpc3RpdGVtPgorCSAgPHBhcmE+VklESU9DX1FVRVJZQ0FQIG5vdyByZXR1cm5zIGEgcGVyLXN1YnN5c3RlbSB2ZXJzaW9uIGluc3RlYWQgb2YgYSBwZXItZHJpdmVyIG9uZS48L3BhcmE+CisJICA8cGFyYT5TdGFuZGFyZGl6ZSBhbiBlcnJvciBjb2RlIGZvciBpbnZhbGlkIGlvY3RsLjwvcGFyYT4KKyAgICAgICAgICA8cGFyYT5BZGRlZCBWNEwyX0NUUkxfVFlQRV9CSVRNQVNLLjwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgIDwvb3JkZXJlZGxpc3Q+CisgICAgPC9zZWN0aW9uPgogCiAgICAgPHNlY3Rpb24gaWQ9Im90aGVyIj4KICAgICAgIDx0aXRsZT5SZWxhdGlvbiBvZiBWNEwyIHRvIG90aGVyIExpbnV4IG11bHRpbWVkaWEgQVBJczwvdGl0bGU+CkBAIC0yNDcyLDYgKzI0NzUsOSBAQAogICAgICAgICA8bGlzdGl0ZW0+CiAJICA8cGFyYT4mVklESU9DLURCRy1HLUNISVAtSURFTlQ7IGlvY3RsLjwvcGFyYT4KICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPGxpc3RpdGVtPgorCSAgPHBhcmE+Rmxhc2ggQVBJLiA8eHJlZiBsaW5rZW5kPSJmbGFzaC1jb250cm9scyIgLz48L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CiAgICAgICA8L2l0ZW1pemVkbGlzdD4KICAgICA8L3NlY3Rpb24+CiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvY29udHJvbHMueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9jb250cm9scy54bWwKc2ltaWxhcml0eSBpbmRleCA2MiUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9jb250cm9scy54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvY29udHJvbHMueG1sCmluZGV4IGE5MjBlZTguLjg1MTY0MDEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvY29udHJvbHMueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvY29udHJvbHMueG1sCkBAIC01MSw2ICs1MSwxMCBAQAogY2FsbGVkLjwvcGFyYT4KICAgICAgIDwvZm9vdG5vdGU+PC9wYXJhPgogCisgICAgPHBhcmE+CisgICAgICBBbGwgY29udHJvbHMgdXNlIG1hY2hpbmUgZW5kaWFubmVzcy4KKyAgICA8L3BhcmE+CisKICAgICA8dGFibGUgcGd3aWRlPSIxIiBmcmFtZT0ibm9uZSIgaWQ9ImNvbnRyb2wtaWQiPgogICAgICAgPHRpdGxlPkNvbnRyb2wgSURzPC90aXRsZT4KICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CkBAIC0zMjUsNiArMzI5LDIyIEBACiA8Y29uc3RhbnQ+VjRMMl9DSURfSUxMVU1JTkFUT1JTXzI8L2NvbnN0YW50PiArIDEpLjwvZW50cnk+CiAJICA8L3Jvdz4KIAkgIDxyb3c+CisJICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9DSURfTUlOX0JVRkZFUlNfRk9SX0NBUFRVUkU8L2NvbnN0YW50PjwvZW50cnk+CisJICAgIDxlbnRyeT5pbnRlZ2VyPC9lbnRyeT4KKwkgICAgPGVudHJ5PlRoaXMgaXMgYSByZWFkLW9ubHkgY29udHJvbCB0aGF0IGNhbiBiZSByZWFkIGJ5IHRoZSBhcHBsaWNhdGlvbgorYW5kIHVzZWQgYXMgYSBoaW50IHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIENBUFRVUkUgYnVmZmVycyB0byBwYXNzIHRvIFJFUUJVRlMuCitUaGUgdmFsdWUgaXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIENBUFRVUkUgYnVmZmVycyB0aGF0IGlzIG5lY2Vzc2FyeSBmb3IgaGFyZHdhcmUKK3RvIHdvcmsuPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX0NJRF9NSU5fQlVGRkVSU19GT1JfT1VUUFVUPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgIDxlbnRyeT5UaGlzIGlzIGEgcmVhZC1vbmx5IGNvbnRyb2wgdGhhdCBjYW4gYmUgcmVhZCBieSB0aGUgYXBwbGljYXRpb24KK2FuZCB1c2VkIGFzIGEgaGludCB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBPVVRQVVQgYnVmZmVycyB0byBwYXNzIHRvIFJFUUJVRlMuCitUaGUgdmFsdWUgaXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIE9VVFBVVCBidWZmZXJzIHRoYXQgaXMgbmVjZXNzYXJ5IGZvciBoYXJkd2FyZQordG8gd29yay48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgogCSAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfQ0lEX1BSSVZBVEVfQkFTRTwvY29uc3RhbnQ+PC9lbnRyeT4KIAkgICAgPGVudHJ5PjwvZW50cnk+CiAJICAgIDxlbnRyeT5JRCBvZiB0aGUgZmlyc3QgY3VzdG9tIChkcml2ZXIgc3BlY2lmaWMpIGNvbnRyb2wuCkBAIC01NDUsNiArNTY1LDEwIEBACiByZXR1cm4gYW4gZXJyb3IpLiBBIGdvb2QgZXhhbXBsZSBpcyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgTVBFRyBhdWRpbwogYml0cmF0ZXMuIFNvbWUgZHJpdmVycyBvbmx5IHN1cHBvcnQgb25lIG9yIHR3byBiaXRyYXRlcywgb3RoZXJzCiBzdXBwb3J0IGEgd2lkZXIgcmFuZ2UuPC9wYXJhPgorCisgICAgICA8cGFyYT4KKwlBbGwgY29udHJvbHMgdXNlIG1hY2hpbmUgZW5kaWFubmVzcy4KKyAgICAgIDwvcGFyYT4KICAgICA8L3NlY3Rpb24+CiAKICAgICA8c2VjdGlvbj4KQEAgLTY3MCw3ICs2OTQsOCBAQAogCSAgICAgIDwvcm93Pjxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+VGhlIE1QRUctMSwgLTIgb3IgLTQKIG91dHB1dCBzdHJlYW0gdHlwZS4gT25lIGNhbm5vdCBhc3N1bWUgYW55dGhpbmcgaGVyZS4gRWFjaCBoYXJkd2FyZQogTVBFRyBlbmNvZGVyIHRlbmRzIHRvIHN1cHBvcnQgZGlmZmVyZW50IHN1YnNldHMgb2YgdGhlIGF2YWlsYWJsZSBNUEVHCi1zdHJlYW0gdHlwZXMuIFRoZSBjdXJyZW50bHkgZGVmaW5lZCBzdHJlYW0gdHlwZXMgYXJlOjwvZW50cnk+CitzdHJlYW0gdHlwZXMuIFRoaXMgY29udHJvbCBpcyBzcGVjaWZpYyB0byBtdWx0aXBsZXhlZCBNUEVHIHN0cmVhbXMuCitUaGUgY3VycmVudGx5IGRlZmluZWQgc3RyZWFtIHR5cGVzIGFyZTo8L2VudHJ5PgogCSAgICAgIDwvcm93PgogCSAgICAgIDxyb3c+CiAJCTxlbnRyeXRibCBzcGFubmFtZT0iZGVzY3IiIGNvbHM9IjIiPgpAQCAtODAwLDYgKzgyNSw3IEBACiAJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX0FVRElPX0VOQ09ESU5HPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgogCQk8ZW50cnk+ZW51bSZuYnNwO3Y0bDJfbXBlZ19hdWRpb19lbmNvZGluZzwvZW50cnk+CiAJICAgICAgPC9yb3c+PHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5NUEVHIEF1ZGlvIGVuY29kaW5nLgorVGhpcyBjb250cm9sIGlzIHNwZWNpZmljIHRvIG11bHRpcGxleGVkIE1QRUcgc3RyZWFtcy4KIFBvc3NpYmxlIHZhbHVlcyBhcmU6PC9lbnRyeT4KIAkgICAgICA8L3Jvdz4KIAkgICAgICA8cm93PgpAQCAtMTI1MCw3ICsxMjc2LDggQEAKIAkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fRU5DT0RJTkc8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CiAJCTxlbnRyeT5lbnVtJm5ic3A7djRsMl9tcGVnX3ZpZGVvX2VuY29kaW5nPC9lbnRyeT4KIAkgICAgICA8L3Jvdz48cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPk1QRUcgVmlkZW8gZW5jb2RpbmcKLW1ldGhvZC4gUG9zc2libGUgdmFsdWVzIGFyZTo8L2VudHJ5PgorbWV0aG9kLiBUaGlzIGNvbnRyb2wgaXMgc3BlY2lmaWMgdG8gbXVsdGlwbGV4ZWQgTVBFRyBzdHJlYW1zLgorUG9zc2libGUgdmFsdWVzIGFyZTo8L2VudHJ5PgogCSAgICAgIDwvcm93PgogCSAgICAgIDxyb3c+CiAJCTxlbnRyeXRibCBzcGFubmFtZT0iZGVzY3IiIGNvbHM9IjIiPgpAQCAtMTQwNiw2ICsxNDMzLDk1OSBAQAogCQkgIDwvdGJvZHk+CiAJCTwvZW50cnl0Ymw+CiAJICAgICAgPC9yb3c+CisKKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fREVDT0RFUl9TTElDRV9JTlRFUkZBQ0U8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5ib29sZWFuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPklmIGVuYWJsZWQgdGhlIGRlY29kZXIgZXhwZWN0cyB0byByZWNlaXZlIGEgc2luZ2xlIHNsaWNlIHBlciBidWZmZXIsIG90aGVyd2lzZQordGhlIGRlY29kZXIgZXhwZWN0cyBhIHNpbmdsZSBmcmFtZSBpbiBwZXIgYnVmZmVyLiBBcHBsaWNhYmxlIHRvIHRoZSBkZWNvZGVyLCBhbGwgY29kZWNzLgorPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0VOQUJMRTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmJvb2xlYW48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+RW5hYmxlIHdyaXRpbmcgc2FtcGxlIGFzcGVjdCByYXRpbyBpbiB0aGUgVmlkZW8gVXNhYmlsaXR5IEluZm9ybWF0aW9uLgorQXBwbGljYWJsZSB0byB0aGUgSDI2NCBlbmNvZGVyLjwvZW50cnk+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JREM8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5lbnVtJm5ic3A7djRsMl9tcGVnX3ZpZGVvX2gyNjRfdnVpX3Nhcl9pZGM8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+VlVJIHNhbXBsZSBhc3BlY3QgcmF0aW8gaW5kaWNhdG9yIGZvciBILjI2NCBlbmNvZGluZy4gVGhlIHZhbHVlCitpcyBkZWZpbmVkIGluIHRoZSB0YWJsZSBFLTEgaW4gdGhlIHN0YW5kYXJkLiBBcHBsaWNhYmxlIHRvIHRoZSBIMjY0IGVuY29kZXIuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnl0Ymwgc3Bhbm5hbWU9ImRlc2NyIiBjb2xzPSIyIj4KKwkJICA8dGJvZHkgdmFsaWduPSJ0b3AiPgorCisJCQk8cm93PgorCQkJICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDX1VOU1BFQ0lGSUVEPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkJICA8ZW50cnk+VW5zcGVjaWZpZWQ8L2VudHJ5PgorCQkJPC9yb3c+CisJCQk8cm93PgorCQkJICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzF4MTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJCSAgPGVudHJ5PjF4MTwvZW50cnk+CisJCQk8L3Jvdz4KKwkJCTxyb3c+CisJCQkgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTJ4MTE8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCQkgIDxlbnRyeT4xMngxMTwvZW50cnk+CisJCQk8L3Jvdz4KKwkJCTxyb3c+CisJCQkgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTB4MTE8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCQkgIDxlbnRyeT4xMHgxMTwvZW50cnk+CisJCQk8L3Jvdz4KKwkJCTxyb3c+CisJCQkgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTZ4MTE8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCQkgIDxlbnRyeT4xNngxMTwvZW50cnk+CisJCQk8L3Jvdz4KKwkJCTxyb3c+CisJCQkgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfNDB4MzM8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCQkgIDxlbnRyeT40MHgzMzwvZW50cnk+CisJCQk8L3Jvdz4KKwkJCTxyb3c+CisJCQkgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMjR4MTE8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCQkgIDxlbnRyeT4yNHgxMTwvZW50cnk+CisJCQk8L3Jvdz4KKwkJCTxyb3c+CisJCQkgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMjB4MTE8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCQkgIDxlbnRyeT4yMHgxMTwvZW50cnk+CisJCQk8L3Jvdz4KKwkJCTxyb3c+CisJCQkgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMzJ4MTE8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCQkgIDxlbnRyeT4zMngxMTwvZW50cnk+CisJCQk8L3Jvdz4KKwkJCTxyb3c+CisJCQkgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfODB4MzM8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCQkgIDxlbnRyeT44MHgzMzwvZW50cnk+CisJCQk8L3Jvdz4KKwkJCTxyb3c+CisJCQkgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTh4MTE8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCQkgIDxlbnRyeT4xOHgxMTwvZW50cnk+CisJCQk8L3Jvdz4KKwkJCTxyb3c+CisJCQkgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTV4MTE8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCQkgIDxlbnRyeT4xNXgxMTwvZW50cnk+CisJCQk8L3Jvdz4KKwkJCTxyb3c+CisJCQkgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfNjR4MzM8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCQkgIDxlbnRyeT42NHgzMzwvZW50cnk+CisJCQk8L3Jvdz4KKwkJCTxyb3c+CisJCQkgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTYweDk5PC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkJICA8ZW50cnk+MTYweDk5PC9lbnRyeT4KKwkJCTwvcm93PgorCQkJPHJvdz4KKwkJCSAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ180eDM8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCQkgIDxlbnRyeT40eDM8L2VudHJ5PgorCQkJPC9yb3c+CisJCQk8cm93PgorCQkJICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzN4MjwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJCSAgPGVudHJ5PjN4MjwvZW50cnk+CisJCQk8L3Jvdz4KKwkJCTxyb3c+CisJCQkgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMngxPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkJICA8ZW50cnk+MngxPC9lbnRyeT4KKwkJCTwvcm93PgorCQkJPHJvdz4KKwkJCSAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ19FWFRFTkRFRDwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJCSAgPGVudHJ5PkV4dGVuZGVkIFNBUjwvZW50cnk+CisJCQk8L3Jvdz4KKwkJICA8L3Rib2R5PgorCQk8L2VudHJ5dGJsPgorCSAgICAgIDwvcm93PgorCisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19WSURFT19IMjY0X1ZVSV9FWFRfU0FSX1dJRFRIPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5FeHRlbmRlZCBzYW1wbGUgYXNwZWN0IHJhdGlvIHdpZHRoIGZvciBILjI2NCBWVUkgZW5jb2RpbmcuCitBcHBsaWNhYmxlIHRvIHRoZSBIMjY0IGVuY29kZXIuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9WVUlfRVhUX1NBUl9IRUlHSFQ8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5pbnRlZ2VyPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPkV4dGVuZGVkIHNhbXBsZSBhc3BlY3QgcmF0aW8gaGVpZ2h0IGZvciBILjI2NCBWVUkgZW5jb2RpbmcuCitBcHBsaWNhYmxlIHRvIHRoZSBIMjY0IGVuY29kZXIuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MRVZFTDwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmVudW0mbmJzcDt2NGwyX21wZWdfdmlkZW9faDI2NF9sZXZlbDwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5UaGUgbGV2ZWwgaW5mb3JtYXRpb24gZm9yIHRoZSBIMjY0IHZpZGVvIGVsZW1lbnRhcnkgc3RyZWFtLgorQXBwbGljYWJsZSB0byB0aGUgSDI2NCBlbmNvZGVyLgorUG9zc2libGUgdmFsdWVzIGFyZTo8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeXRibCBzcGFubmFtZT0iZGVzY3IiIGNvbHM9IjIiPgorCQkgIDx0Ym9keSB2YWxpZ249InRvcCI+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMDwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkxldmVsIDEuMDwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMUI8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5MZXZlbCAxQjwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMV8xPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+TGV2ZWwgMS4xPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8xXzI8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5MZXZlbCAxLjI8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMzwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkxldmVsIDEuMzwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMl8wPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+TGV2ZWwgMi4wPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8yXzE8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5MZXZlbCAyLjE8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzJfMjwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkxldmVsIDIuMjwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfM18wPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+TGV2ZWwgMy4wPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8zXzE8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5MZXZlbCAzLjE8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzNfMjwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkxldmVsIDMuMjwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfNF8wPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+TGV2ZWwgNC4wPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF80XzE8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5MZXZlbCA0LjE8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzRfMjwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkxldmVsIDQuMjwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfNV8wPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+TGV2ZWwgNS4wPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF81XzE8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5MZXZlbCA1LjE8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgPC90Ym9keT4KKwkJPC9lbnRyeXRibD4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfTEVWRUw8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5lbnVtJm5ic3A7djRsMl9tcGVnX3ZpZGVvX21wZWc0X2xldmVsPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPlRoZSBsZXZlbCBpbmZvcm1hdGlvbiBmb3IgdGhlIE1QRUc0IGVsZW1lbnRhcnkgc3RyZWFtLgorQXBwbGljYWJsZSB0byB0aGUgTVBFRzQgZW5jb2Rlci4KK1Bvc3NpYmxlIHZhbHVlcyBhcmU6PC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnl0Ymwgc3Bhbm5hbWU9ImRlc2NyIiBjb2xzPSIyIj4KKwkJICA8dGJvZHkgdmFsaWduPSJ0b3AiPgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fTEVWRUxfMDwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkxldmVsIDA8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19MRVZFTF8wQjwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkxldmVsIDBiPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fTEVWRUxfMTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkxldmVsIDE8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19MRVZFTF8yPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+TGV2ZWwgMjwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0xFVkVMXzM8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5MZXZlbCAzPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fTEVWRUxfM0I8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5MZXZlbCAzYjwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0xFVkVMXzQ8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5MZXZlbCA0PC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fTEVWRUxfNTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkxldmVsIDU8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgPC90Ym9keT4KKwkJPC9lbnRyeXRibD4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9QUk9GSUxFPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+ZW51bSZuYnNwO3Y0bDJfbXBlZ19oMjY0X3Byb2ZpbGU8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+VGhlIHByb2ZpbGUgaW5mb3JtYXRpb24gZm9yIEgyNjQuCitBcHBsaWNhYmxlIHRvIHRoZSBIMjY0IGVuY29kZXIuCitQb3NzaWJsZSB2YWx1ZXMgYXJlOjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5dGJsIHNwYW5uYW1lPSJkZXNjciIgY29scz0iMiI+CisJCSAgPHRib2R5IHZhbGlnbj0idG9wIj4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9CQVNFTElORTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkJhc2VsaW5lIHByb2ZpbGU8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfQ09OU1RSQUlORURfQkFTRUxJTkU8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5Db25zdHJhaW5lZCBCYXNlbGluZSBwcm9maWxlPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX01BSU48L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5NYWluIHByb2ZpbGU8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfRVhURU5ERUQ8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5FeHRlbmRlZCBwcm9maWxlPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0g8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5IaWdoIHByb2ZpbGU8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF8xMDwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkhpZ2ggMTAgcHJvZmlsZTwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIXzQyMjwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkhpZ2ggNDIyIHByb2ZpbGU8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF80NDRfUFJFRElDVElWRTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkhpZ2ggNDQ0IFByZWRpY3RpdmUgcHJvZmlsZTwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIXzEwX0lOVFJBPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+SGlnaCAxMCBJbnRyYSBwcm9maWxlPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0hfNDIyX0lOVFJBPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+SGlnaCA0MjIgSW50cmEgcHJvZmlsZTwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIXzQ0NF9JTlRSQTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkhpZ2ggNDQ0IEludHJhIHByb2ZpbGU8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfQ0FWTENfNDQ0X0lOVFJBPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+Q0FWTEMgNDQ0IEludHJhIHByb2ZpbGU8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfU0NBTEFCTEVfQkFTRUxJTkU8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5TY2FsYWJsZSBCYXNlbGluZSBwcm9maWxlPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX1NDQUxBQkxFX0hJR0g8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5TY2FsYWJsZSBIaWdoIHByb2ZpbGU8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfU0NBTEFCTEVfSElHSF9JTlRSQTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PlNjYWxhYmxlIEhpZ2ggSW50cmEgcHJvZmlsZTwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9TVEVSRU9fSElHSDwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PlN0ZXJlbyBIaWdoIHByb2ZpbGU8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfTVVMVElWSUVXX0hJR0g8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5NdWx0aXZpZXcgSGlnaCBwcm9maWxlPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCisJCSAgPC90Ym9keT4KKwkJPC9lbnRyeXRibD4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfUFJPRklMRTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmVudW0mbmJzcDt2NGwyX21wZWdfbXBlZzRfcHJvZmlsZTwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5UaGUgcHJvZmlsZSBpbmZvcm1hdGlvbiBmb3IgTVBFRzQuCitBcHBsaWNhYmxlIHRvIHRoZSBNUEVHNCBlbmNvZGVyLgorUG9zc2libGUgdmFsdWVzIGFyZTo8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeXRibCBzcGFubmFtZT0iZGVzY3IiIGNvbHM9IjIiPgorCQkgIDx0Ym9keSB2YWxpZ249InRvcCI+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19QUk9GSUxFX1NJTVBMRTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PlNpbXBsZSBwcm9maWxlPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fUFJPRklMRV9BRFZBTkNFRF9TSU1QTEU8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5BZHZhbmNlZCBTaW1wbGUgcHJvZmlsZTwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX1BST0ZJTEVfQ09SRTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkNvcmUgcHJvZmlsZTwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX1BST0ZJTEVfU0lNUExFX1NDQUxBQkxFPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+U2ltcGxlIFNjYWxhYmxlIHByb2ZpbGU8L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19QUk9GSUxFX0FEVkFOQ0VEX0NPRElOR19FRkZJQ0lFTkNZPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+PC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgIDwvdGJvZHk+CisJCTwvZW50cnl0Ymw+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX01BWF9SRUZfUElDPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5UaGUgbWF4aW11bSBudW1iZXIgb2YgcmVmZXJlbmNlIHBpY3R1cmVzIHVzZWQgZm9yIGVuY29kaW5nLgorQXBwbGljYWJsZSB0byB0aGUgZW5jb2Rlci4KKzwvZW50cnk+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX01VTFRJX1NMSUNFX01PREU8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5lbnVtJm5ic3A7djRsMl9tcGVnX211bHRpX3NsaWNlX21vZGU8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+RGV0ZXJtaW5lcyBob3cgdGhlIGVuY29kZXIgc2hvdWxkIGhhbmRsZSBkaXZpc2lvbiBvZiBmcmFtZSBpbnRvIHNsaWNlcy4KK0FwcGxpY2FibGUgdG8gdGhlIGVuY29kZXIuCitQb3NzaWJsZSB2YWx1ZXMgYXJlOjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5dGJsIHNwYW5uYW1lPSJkZXNjciIgY29scz0iMiI+CisJCSAgPHRib2R5IHZhbGlnbj0idG9wIj4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX1ZJREVPX01VTFRJX1NMSUNFX01PREVfU0lOR0xFPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+U2luZ2xlIHNsaWNlIHBlciBmcmFtZS48L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19NVUxUSV9TTElDRV9NT0RFX01BWF9NQjwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5Pk11bHRpcGxlIHNsaWNlcyB3aXRoIHNldCBtYXhpbXVtIG51bWJlciBvZiBtYWNyb2Jsb2NrcyBwZXIgc2xpY2UuPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fTVVMVElfU0xJQ0VfTU9ERV9NQVhfQllURVM8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5NdWx0aXBsZSBzbGljZSB3aXRoIHNldCBtYXhpbXVtIHNpemUgaW4gYnl0ZXMgcGVyIHNsaWNlLjwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICA8L3Rib2R5PgorCQk8L2VudHJ5dGJsPgorCSAgICAgIDwvcm93PgorCisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19WSURFT19NVUxUSV9TTElDRV9NQVhfTUI8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5pbnRlZ2VyPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPlRoZSBtYXhpbXVtIG51bWJlciBvZiBtYWNyb2Jsb2NrcyBpbiBhIHNsaWNlLiBVc2VkIHdoZW4KKzxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX01VTFRJX1NMSUNFX01PREU8L2NvbnN0YW50PiBpcyBzZXQgdG8gPGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19NVUxUSV9TTElDRV9NT0RFX01BWF9NQjwvY29uc3RhbnQ+LgorQXBwbGljYWJsZSB0byB0aGUgZW5jb2Rlci48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19WSURFT19NVUxUSV9TTElDRV9NQVhfQllURVM8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5pbnRlZ2VyPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPlRoZSBtYXhpbXVtIHNpemUgb2YgYSBzbGljZSBpbiBieXRlcy4gVXNlZCB3aGVuCis8Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19WSURFT19NVUxUSV9TTElDRV9NT0RFPC9jb25zdGFudD4gaXMgc2V0IHRvIDxjb25zdGFudD5WNEwyX01QRUdfVklERU9fTVVMVElfU0xJQ0VfTU9ERV9NQVhfQllURVM8L2NvbnN0YW50Pi4KK0FwcGxpY2FibGUgdG8gdGhlIGVuY29kZXIuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9NT0RFPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+ZW51bSZuYnNwO3Y0bDJfbXBlZ19oMjY0X2xvb3BfZmlsdGVyX21vZGU8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+TG9vcCBmaWx0ZXIgbW9kZSBmb3IgSDI2NCBlbmNvZGVyLgorUG9zc2libGUgdmFsdWVzIGFyZTo8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeXRibCBzcGFubmFtZT0iZGVzY3IiIGNvbHM9IjIiPgorCQkgIDx0Ym9keSB2YWxpZ249InRvcCI+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX01PREVfRU5BQkxFRDwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5Pkxvb3AgZmlsdGVyIGlzIGVuYWJsZWQuPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9NT0RFX0RJU0FCTEVEPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+TG9vcCBmaWx0ZXIgaXMgZGlzYWJsZWQuPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9NT0RFX0RJU0FCTEVEX0FUX1NMSUNFX0JPVU5EQVJZPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+TG9vcCBmaWx0ZXIgaXMgZGlzYWJsZWQgYXQgdGhlIHNsaWNlIGJvdW5kYXJ5LjwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICA8L3Rib2R5PgorCQk8L2VudHJ5dGJsPgorCSAgICAgIDwvcm93PgorCisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX0FMUEhBPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5Mb29wIGZpbHRlciBhbHBoYSBjb2VmZmljaWVudCwgZGVmaW5lZCBpbiB0aGUgSDI2NCBzdGFuZGFyZC4KK0FwcGxpY2FibGUgdG8gdGhlIEgyNjQgZW5jb2Rlci48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX0JFVEE8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5pbnRlZ2VyPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPkxvb3AgZmlsdGVyIGJldGEgY29lZmZpY2llbnQsIGRlZmluZWQgaW4gdGhlIEgyNjQgc3RhbmRhcmQuCitBcHBsaWNhYmxlIHRvIHRoZSBIMjY0IGVuY29kZXIuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9FTlRST1BZX01PREU8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5lbnVtJm5ic3A7djRsMl9tcGVnX2gyNjRfc3ltYm9sX21vZGU8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+RW50cm9weSBjb2RpbmcgbW9kZSBmb3IgSDI2NCAtIENBQkFDL0NBVkFMQy4KK0FwcGxpY2FibGUgdG8gdGhlIEgyNjQgZW5jb2Rlci4KK1Bvc3NpYmxlIHZhbHVlcyBhcmU6PC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnl0Ymwgc3Bhbm5hbWU9ImRlc2NyIiBjb2xzPSIyIj4KKwkJICA8dGJvZHkgdmFsaWduPSJ0b3AiPgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fSDI2NF9FTlRST1BZX01PREVfQ0FWTEM8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5Vc2UgQ0FWTEMgZW50cm9weSBjb2RpbmcuPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfVklERU9fSDI2NF9FTlRST1BZX01PREVfQ0FCQUM8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5Vc2UgQ0FCQUMgZW50cm9weSBjb2RpbmcuPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgIDwvdGJvZHk+CisJCTwvZW50cnl0Ymw+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfOFg4X1RSQU5TRk9STTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmJvb2xlYW48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+RW5hYmxlIDhYOCB0cmFuc2Zvcm0gZm9yIEgyNjQuIEFwcGxpY2FibGUgdG8gdGhlIEgyNjQgZW5jb2Rlci48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19WSURFT19DWUNMSUNfSU5UUkFfUkVGUkVTSF9NQjwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmludGVnZXI8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+Q3ljbGljIGludHJhIG1hY3JvYmxvY2sgcmVmcmVzaC4gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGNvbnRpbnVvdXMgbWFjcm9ibG9ja3MKK3JlZnJlc2hlZCBldmVyeSBmcmFtZS4gRWFjaCBmcmFtZSBhIHN1Y2Nlc2l2ZSBzZXQgb2YgbWFjcm9ibG9ja3MgaXMgcmVmcmVzaGVkIHVudGlsIHRoZSBjeWNsZSBjb21wbGV0ZXMgYW5kIHN0YXJ0cyBmcm9tIHRoZQordG9wIG9mIHRoZSBmcmFtZS4gQXBwbGljYWJsZSB0byBIMjY0LCBIMjYzIGFuZCBNUEVHNCBlbmNvZGVyLjwvZW50cnk+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX0ZSQU1FX1JDX0VOQUJMRTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmJvb2xlYW48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+RnJhbWUgbGV2ZWwgcmF0ZSBjb250cm9sIGVuYWJsZS4KK0lmIHRoaXMgY29udHJvbCBpcyBkaXNhYmxlZCB0aGVuIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGZvciBlYWNoIGZyYW1lIHR5cGUgaXMgY29uc3RhbnQgYW5kIHNldCB3aXRoIGFwcHJvcHJpYXRlIGNvbnRyb2xzCisoZS5nLiA8Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19WSURFT19IMjYzX0lfRlJBTUVfUVA8L2NvbnN0YW50PikuCitJZiBmcmFtZSByYXRlIGNvbnRyb2wgaXMgZW5hYmxlZCB0aGVuIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgaXMgYWRqdXN0ZWQgdG8gbWVldCB0aGUgY2hvc2VuIGJpdHJhdGUuIE1pbmltdW0gYW5kIG1heGltdW0gdmFsdWUKK2ZvciB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBjYW4gYmUgc2V0IHdpdGggYXBwcm9wcmlhdGUgY29udHJvbHMgKGUuZy4gPGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19NSU5fUVA8L2NvbnN0YW50PikuCitBcHBsaWNhYmxlIHRvIGVuY29kZXJzLjwvZW50cnk+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX01CX1JDX0VOQUJMRTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmJvb2xlYW48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+TWFjcm9ibG9jayBsZXZlbCByYXRlIGNvbnRyb2wgZW5hYmxlLgorQXBwbGljYWJsZSB0byB0aGUgTVBFRzQgYW5kIEgyNjQgZW5jb2RlcnMuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfUVBFTDwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmJvb2xlYW48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+UXVhcnRlciBwaXhlbCBtb3Rpb24gZXN0aW1hdGlvbiBmb3IgTVBFRzQuIEFwcGxpY2FibGUgdG8gdGhlIE1QRUc0IGVuY29kZXIuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19JX0ZSQU1FX1FQPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5RdWFudGl6YXRpb24gcGFyYW1ldGVyIGZvciBhbiBJIGZyYW1lIGZvciBIMjYzLiBWYWxpZCByYW5nZTogZnJvbSAxIHRvIDMxLjwvZW50cnk+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjNfTUlOX1FQPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5NaW5pbXVtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgZm9yIEgyNjMuIFZhbGlkIHJhbmdlOiBmcm9tIDEgdG8gMzEuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19NQVhfUVA8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5pbnRlZ2VyPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPk1heGltdW0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBmb3IgSDI2My4gVmFsaWQgcmFuZ2U6IGZyb20gMSB0byAzMS48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19WSURFT19IMjYzX1BfRlJBTUVfUVA8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5pbnRlZ2VyPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPlF1YW50aXphdGlvbiBwYXJhbWV0ZXIgZm9yIGFuIFAgZnJhbWUgZm9yIEgyNjMuIFZhbGlkIHJhbmdlOiBmcm9tIDEgdG8gMzEuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19CX0ZSQU1FX1FQPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5RdWFudGl6YXRpb24gcGFyYW1ldGVyIGZvciBhbiBCIGZyYW1lIGZvciBIMjYzLiBWYWxpZCByYW5nZTogZnJvbSAxIHRvIDMxLjwvZW50cnk+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfSV9GUkFNRV9RUDwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmludGVnZXI8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+UXVhbnRpemF0aW9uIHBhcmFtZXRlciBmb3IgYW4gSSBmcmFtZSBmb3IgSDI2NC4gVmFsaWQgcmFuZ2U6IGZyb20gMCB0byA1MS48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19WSURFT19IMjY0X01JTl9RUDwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmludGVnZXI8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+TWluaW11bSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIGZvciBIMjY0LiBWYWxpZCByYW5nZTogZnJvbSAwIHRvIDUxLjwvZW50cnk+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTUFYX1FQPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5NYXhpbXVtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgZm9yIEgyNjQuIFZhbGlkIHJhbmdlOiBmcm9tIDAgdG8gNTEuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9QX0ZSQU1FX1FQPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5RdWFudGl6YXRpb24gcGFyYW1ldGVyIGZvciBhbiBQIGZyYW1lIGZvciBIMjY0LiBWYWxpZCByYW5nZTogZnJvbSAwIHRvIDUxLjwvZW50cnk+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfQl9GUkFNRV9RUDwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmludGVnZXI8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+UXVhbnRpemF0aW9uIHBhcmFtZXRlciBmb3IgYW4gQiBmcmFtZSBmb3IgSDI2NC4gVmFsaWQgcmFuZ2U6IGZyb20gMCB0byA1MS48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9JX0ZSQU1FX1FQPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5RdWFudGl6YXRpb24gcGFyYW1ldGVyIGZvciBhbiBJIGZyYW1lIGZvciBNUEVHNC4gVmFsaWQgcmFuZ2U6IGZyb20gMSB0byAzMS48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9NSU5fUVA8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5pbnRlZ2VyPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPk1pbmltdW0gcXVhbnRpemF0aW9uIHBhcmFtZXRlciBmb3IgTVBFRzQuIFZhbGlkIHJhbmdlOiBmcm9tIDEgdG8gMzEuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfTUFYX1FQPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5NYXhpbXVtIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgZm9yIE1QRUc0LiBWYWxpZCByYW5nZTogZnJvbSAxIHRvIDMxLjwvZW50cnk+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X1BfRlJBTUVfUVA8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5pbnRlZ2VyPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPlF1YW50aXphdGlvbiBwYXJhbWV0ZXIgZm9yIGFuIFAgZnJhbWUgZm9yIE1QRUc0LiBWYWxpZCByYW5nZTogZnJvbSAxIHRvIDMxLjwvZW50cnk+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X0JfRlJBTUVfUVA8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5pbnRlZ2VyPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPlF1YW50aXphdGlvbiBwYXJhbWV0ZXIgZm9yIGFuIEIgZnJhbWUgZm9yIE1QRUc0LiBWYWxpZCByYW5nZTogZnJvbSAxIHRvIDMxLjwvZW50cnk+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX1ZCVl9TSVpFPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5UaGUgVmlkZW8gQnVmZmVyIFZlcmlmaWVyIHNpemUgaW4ga2lsb2J5dGVzLCBpdCBpcyB1c2VkIGFzIGEgbGltaXRhdGlvbiBvZiBmcmFtZSBza2lwLgorVGhlIFZCViBpcyBkZWZpbmVkIGluIHRoZSBzdGFuZGFyZCBhcyBhIG1lYW4gdG8gdmVyaWZ5IHRoYXQgdGhlIHByb2R1Y2VkIHN0cmVhbSB3aWxsIGJlIHN1Y2Nlc2Z1bGx5IGRlY29kZWQuCitUaGUgc3RhbmRhcmQgZGVzY3JpYmVzIGl0IGFzICJQYXJ0IG9mIGEgaHlwb3RoZXRpY2FsIGRlY29kZXIgdGhhdCBpcyBjb25jZXB0dWFsbHkgY29ubmVjdGVkIHRvIHRoZQorb3V0cHV0IG9mIHRoZSBlbmNvZGVyLiBJdHMgcHVycG9zZSBpcyB0byBwcm92aWRlIGEgY29uc3RyYWludCBvbiB0aGUgdmFyaWFiaWxpdHkgb2YgdGhlIGRhdGEgcmF0ZSB0aGF0IGFuCitlbmNvZGVyIG9yIGVkaXRpbmcgcHJvY2VzcyBtYXkgcHJvZHVjZS4iLgorQXBwbGljYWJsZSB0byB0aGUgTVBFRzEsIE1QRUcyLCBNUEVHNCBlbmNvZGVycy48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19WSURFT19IMjY0X0NQQl9TSVpFPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5UaGUgQ29kZWQgUGljdHVyZSBCdWZmZXIgc2l6ZSBpbiBraWxvYnl0ZXMsIGl0IGlzIHVzZWQgYXMgYSBsaW1pdGF0aW9uIG9mIGZyYW1lIHNraXAuCitUaGUgQ1BCIGlzIGRlZmluZWQgaW4gdGhlIEgyNjQgc3RhbmRhcmQgYXMgYSBtZWFuIHRvIHZlcmlmeSB0aGF0IHRoZSBwcm9kdWNlZCBzdHJlYW0gd2lsbCBiZSBzdWNjZXNmdWxseSBkZWNvZGVkLgorQXBwbGljYWJsZSB0byB0aGUgSDI2NCBlbmNvZGVyLjwvZW50cnk+CisJICAgICAgPC9yb3c+CisKKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfSV9QRVJJT0Q8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5pbnRlZ2VyPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPlBlcmlvZCBiZXR3ZWVuIEktZnJhbWVzIGluIHRoZSBvcGVuIEdPUCBmb3IgSDI2NC4gSW4gY2FzZSBvZiBhbiBvcGVuIEdPUAordGhpcyBpcyB0aGUgcGVyaW9kIGJldHdlZW4gdHdvIEktZnJhbWVzLiBUaGUgcGVyaW9kIGJldHdlZW4gSURSIChJbnN0YW50YW5lb3VzIERlY29kaW5nIFJlZnJlc2gpIGZyYW1lcyBpcyB0YWtlbiBmcm9tIHRoZSBHT1BfU0laRSBjb250cm9sLgorQW4gSURSIGZyYW1lLCB3aGljaCBzdGFuZHMgZm9yIEluc3RhbnRhbmVvdXMgRGVjb2RpbmcgUmVmcmVzaCBpcyBhbiBJLWZyYW1lIGFmdGVyIHdoaWNoIG5vIHByaW9yIGZyYW1lcyBhcmUKK3JlZmVyZW5jZWQuIFRoaXMgbWVhbnMgdGhhdCBhIHN0cmVhbSBjYW4gYmUgcmVzdGFydGVkIGZyb20gYW4gSURSIGZyYW1lIHdpdGhvdXQgdGhlIG5lZWQgdG8gc3RvcmUgb3IgZGVjb2RlIGFueQorcHJldmlvdXMgZnJhbWVzLiBBcHBsaWNhYmxlIHRvIHRoZSBIMjY0IGVuY29kZXIuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKworCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fSEVBREVSX01PREU8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5lbnVtJm5ic3A7djRsMl9tcGVnX2hlYWRlcl9tb2RlPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPkRldGVybWluZXMgd2hldGhlciB0aGUgaGVhZGVyIGlzIHJldHVybmVkIGFzIHRoZSBmaXJzdCBidWZmZXIgb3IgaXMKK2l0IHJldHVybmVkIHRvZ2V0aGVyIHdpdGggdGhlIGZpcnN0IGZyYW1lLiBBcHBsaWNhYmxlIHRvIGVuY29kZXJzLgorUG9zc2libGUgdmFsdWVzIGFyZTo8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeXRibCBzcGFubmFtZT0iZGVzY3IiIGNvbHM9IjIiPgorCQkgIDx0Ym9keSB2YWxpZ249InRvcCI+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IRUFERVJfTU9ERV9TRVBBUkFURTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PlRoZSBzdHJlYW0gaGVhZGVyIGlzIHJldHVybmVkIHNlcGFyYXRlbHkgaW4gdGhlIGZpcnN0IGJ1ZmZlci48L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19WSURFT19IRUFERVJfTU9ERV9KT0lORURfV0lUSF8xU1RfRlJBTUU8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5UaGUgc3RyZWFtIGhlYWRlciBpcyByZXR1cm5lZCB0b2dldGhlciB3aXRoIHRoZSBmaXJzdCBlbmNvZGVkIGZyYW1lLjwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICA8L3Rib2R5PgorCQk8L2VudHJ5dGJsPgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fREVDT0RFUl9NUEVHNF9ERUJMT0NLX0ZJTFRFUjwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmJvb2xlYW48L2VudHJ5PgorCSAgICAgIDwvcm93Pjxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+RW5hYmxlZCB0aGUgZGVibG9ja2luZyBwb3N0IHByb2Nlc3NpbmcgZmlsdGVyIGZvciBNUEVHNCBkZWNvZGVyLgorQXBwbGljYWJsZSB0byB0aGUgTVBFRzQgZGVjb2Rlci48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfVk9QX1RJTUVfUkVTPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+PHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj52b3BfdGltZV9pbmNyZW1lbnRfcmVzb2x1dGlvbiB2YWx1ZSBmb3IgTVBFRzQuIEFwcGxpY2FibGUgdG8gdGhlIE1QRUc0IGVuY29kZXIuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X1ZPUF9USU1FX0lOQzwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmludGVnZXI8L2VudHJ5PgorCSAgICAgIDwvcm93Pjxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+dm9wX3RpbWVfaW5jcmVtZW50IHZhbHVlIGZvciBNUEVHNC4gQXBwbGljYWJsZSB0byB0aGUgTVBFRzQgZW5jb2Rlci48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCisJICAgIDwvdGJvZHk+CisJICA8L3Rncm91cD4KKwk8L3RhYmxlPgorICAgICAgPC9zZWN0aW9uPgorCisgICAgICA8c2VjdGlvbj4KKwk8dGl0bGU+TUZDIDUuMSBNUEVHIENvbnRyb2xzPC90aXRsZT4KKworCTxwYXJhPlRoZSBmb2xsb3dpbmcgTVBFRyBjbGFzcyBjb250cm9scyBkZWFsIHdpdGggTVBFRworZGVjb2RpbmcgYW5kIGVuY29kaW5nIHNldHRpbmdzIHRoYXQgYXJlIHNwZWNpZmljIHRvIHRoZSBNdWx0aSBGb3JtYXQgQ29kZWMgNS4xIGRldmljZSBwcmVzZW50CitpbiB0aGUgUzVQIGZhbWlseSBvZiBTb0NzIGJ5IFNhbXN1bmcuCis8L3BhcmE+CisKKwk8dGFibGUgcGd3aWRlPSIxIiBmcmFtZT0ibm9uZSIgaWQ9Im1mYzUxLWNvbnRyb2wtaWQiPgorCSAgPHRpdGxlPk1GQyA1LjEgQ29udHJvbCBJRHM8L3RpdGxlPgorCSAgPHRncm91cCBjb2xzPSI0Ij4KKwkgICAgPGNvbHNwZWMgY29sbmFtZT0iYzEiIGNvbHdpZHRoPSIxKiIgLz4KKwkgICAgPGNvbHNwZWMgY29sbmFtZT0iYzIiIGNvbHdpZHRoPSI2KiIgLz4KKwkgICAgPGNvbHNwZWMgY29sbmFtZT0iYzMiIGNvbHdpZHRoPSIyKiIgLz4KKwkgICAgPGNvbHNwZWMgY29sbmFtZT0iYzQiIGNvbHdpZHRoPSI2KiIgLz4KKwkgICAgPHNwYW5zcGVjIG5hbWVzdD0iYzEiIG5hbWVlbmQ9ImMyIiBzcGFubmFtZT0iaWQiIC8+CisJICAgIDxzcGFuc3BlYyBuYW1lc3Q9ImMyIiBuYW1lZW5kPSJjNCIgc3Bhbm5hbWU9ImRlc2NyIiAvPgorCSAgICA8dGhlYWQ+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCIgYWxpZ249ImxlZnQiPklEPC9lbnRyeT4KKwkJPGVudHJ5IGFsaWduPSJsZWZ0Ij5UeXBlPC9lbnRyeT4KKwkgICAgICA8L3Jvdz48cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiIGFsaWduPSJsZWZ0Ij5EZXNjcmlwdGlvbjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgIDwvdGhlYWQ+CisJICAgIDx0Ym9keSB2YWxpZ249InRvcCI+CisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19ERUNPREVSX0gyNjRfRElTUExBWV9ERUxBWV9FTkFCTEU8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5pbnRlZ2VyPC9lbnRyeT4KKwkgICAgICA8L3Jvdz48cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPklmIHRoZSBkaXNwbGF5IGRlbGF5IGlzIGVuYWJsZWQgdGhlbiB0aGUgZGVjb2RlciBoYXMgdG8gcmV0dXJuIGEKK0NBUFRVUkUgYnVmZmVyIGFmdGVyIHByb2Nlc3NpbmcgYSBjZXJ0YWluIG51bWJlciBvZiBPVVRQVVQgYnVmZmVycy4gSWYgdGhpcyBudW1iZXIgaXMgbG93LCB0aGVuIGl0IG1heSByZXN1bHQgaW4KK2J1ZmZlcnMgbm90IGJlaW5nIGRlcXVldWVkIGluIGRpc3BsYXkgb3JkZXIuIEluIGFkZGl0aW9uIGhhcmR3YXJlIG1heSBzdGlsbCB1c2UgdGhvc2UgYnVmZmVycyBhcyByZWZlcmVuY2UsIHRodXMKK2FwcGxpY2F0aW9uIHNob3VsZCBub3Qgd3JpdGUgdG8gdGhvc2UgYnVmZmVycy4gVGhpcyBmZWF0dXJlIGNhbiBiZSB1c2VkIGZvciBleGFtcGxlIGZvciBnZW5lcmF0aW5nIHRodW1ibmFpbHMgb2YgdmlkZW9zLgorQXBwbGljYWJsZSB0byB0aGUgSDI2NCBkZWNvZGVyLgorCSAgICAgIDwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19ERUNPREVSX0gyNjRfRElTUExBWV9ERUxBWTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmludGVnZXI8L2VudHJ5PgorCSAgICAgIDwvcm93Pjxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+RGlzcGxheSBkZWxheSB2YWx1ZSBmb3IgSDI2NCBkZWNvZGVyLgorVGhlIGRlY29kZXIgaXMgZm9yY2VkIHRvIHJldHVybiBhIGRlY29kZWQgZnJhbWUgYWZ0ZXIgdGhlIHNldCAnZGlzcGxheSBkZWxheScgbnVtYmVyIG9mIGZyYW1lcy4gSWYgdGhpcyBudW1iZXIgaXMKK2xvdyBpdCBtYXkgcmVzdWx0IGluIGZyYW1lcyByZXR1cm5lZCBvdXQgb2YgZGlzcGFseSBvcmRlciwgaW4gYWRkaXRpb24gdGhlIGhhcmR3YXJlIG1heSBzdGlsbCBiZSB1c2luZyB0aGUgcmV0dXJuZWQgYnVmZmVyCithcyBhIHJlZmVyZW5jZSBwaWN0dXJlIGZvciBzdWJzZXF1ZW50IGZyYW1lcy4KKzwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19IMjY0X05VTV9SRUZfUElDX0ZPUl9QPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+PHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5UaGUgbnVtYmVyIG9mIHJlZmVyZW5jZSBwaWN0dXJlcyB1c2VkIGZvciBlbmNvZGluZyBhIFAgcGljdHVyZS4KK0FwcGxpY2FibGUgdG8gdGhlIEgyNjQgZW5jb2Rlci48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fUEFERElORzwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmJvb2xlYW48L2VudHJ5PgorCSAgICAgIDwvcm93Pjxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+UGFkZGluZyBlbmFibGUgaW4gdGhlIGVuY29kZXIgLSB1c2UgYSBjb2xvciBpbnN0ZWFkIG9mIHJlcGVhdGluZyBib3JkZXIgcGl4ZWxzLgorQXBwbGljYWJsZSB0byBlbmNvZGVycy48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fUEFERElOR19ZVVY8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5pbnRlZ2VyPC9lbnRyeT4KKwkgICAgICA8L3Jvdz48cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPlBhZGRpbmcgY29sb3IgaW4gdGhlIGVuY29kZXIuIEFwcGxpY2FibGUgdG8gZW5jb2RlcnMuIFRoZSBzdXBwbGllZCAzMi1iaXQgaW50ZWdlciBpcyBpbnRlcnByZXRlZCBhcyBmb2xsb3dzIChiaXQKKzAgPSBsZWFzdCBzaWduaWZpY2FudCBiaXQpOjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5dGJsIHNwYW5uYW1lPSJkZXNjciIgY29scz0iMiI+CisJCSAgPHRib2R5IHZhbGlnbj0idG9wIj4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT5CaXQgMDo3PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PlYgY2hyb21pbmFuY2UgaW5mb3JtYXRpb248L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+Qml0IDg6MTU8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+VSBjaHJvbWluYW5jZSBpbmZvcm1hdGlvbjwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT5CaXQgMTY6MjM8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+WSBsdW1pbmFuY2UgaW5mb3JtYXRpb248L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+Qml0IDI0OjMxPC9lbnRyeT4KKwkJICAgICAgPGVudHJ5Pk11c3QgYmUgemVyby48L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgPC90Ym9keT4KKwkJPC9lbnRyeXRibD4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX1JDX1JFQUNUSU9OX0NPRUZGPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+PHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5SZWFjdGlvbiBjb2VmZmljaWVudCBmb3IgTUZDIHJhdGUgY29udHJvbC4gQXBwbGljYWJsZSB0byBlbmNvZGVycy4KKzxwYXJhPk5vdGUgMTogVmFsaWQgb25seSB3aGVuIHRoZSBmcmFtZSBsZXZlbCBSQyBpcyBlbmFibGVkLjwvcGFyYT4KKzxwYXJhPk5vdGUgMjogRm9yIHRpZ2h0IENCUiwgdGhpcyBmaWVsZCBtdXN0IGJlIHNtYWxsIChleC4gMiB+IDEwKS4KK0ZvciBWQlIsIHRoaXMgZmllbGQgbXVzdCBiZSBsYXJnZSAoZXguIDEwMCB+IDEwMDApLjwvcGFyYT4KKzxwYXJhPk5vdGUgMzogSXQgaXMgbm90IHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgZ3JlYXRlciBudW1iZXIgdGhhbiBGUkFNRV9SQVRFICogKDEwXjkgLyBCSVRfUkFURSkuPC9wYXJhPgorPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0gyNjRfQURBUFRJVkVfUkNfREFSSzwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmJvb2xlYW48L2VudHJ5PgorCSAgICAgIDwvcm93Pjxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+QWRhcHRpdmUgcmF0ZSBjb250cm9sIGZvciBkYXJrIHJlZ2lvbi4KK1ZhbGlkIG9ubHkgd2hlbiBILjI2NCBhbmQgbWFjcm9ibG9jayBsZXZlbCBSQyBpcyBlbmFibGVkICg8Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19WSURFT19NQl9SQ19FTkFCTEU8L2NvbnN0YW50PikuCitBcHBsaWNhYmxlIHRvIHRoZSBIMjY0IGVuY29kZXIuPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0gyNjRfQURBUFRJVkVfUkNfU01PT1RIPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+Ym9vbGVhbjwvZW50cnk+CisJICAgICAgPC9yb3c+PHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5BZGFwdGl2ZSByYXRlIGNvbnRyb2wgZm9yIHNtb290aCByZWdpb24uCitWYWxpZCBvbmx5IHdoZW4gSC4yNjQgYW5kIG1hY3JvYmxvY2sgbGV2ZWwgUkMgaXMgZW5hYmxlZCAoPGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fTUJfUkNfRU5BQkxFPC9jb25zdGFudD4pLgorQXBwbGljYWJsZSB0byB0aGUgSDI2NCBlbmNvZGVyLjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19IMjY0X0FEQVBUSVZFX1JDX1NUQVRJQzwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmJvb2xlYW48L2VudHJ5PgorCSAgICAgIDwvcm93Pjxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+QWRhcHRpdmUgcmF0ZSBjb250cm9sIGZvciBzdGF0aWMgcmVnaW9uLgorVmFsaWQgb25seSB3aGVuIEguMjY0IGFuZCBtYWNyb2Jsb2NrIGxldmVsIFJDIGlzIGVuYWJsZWQgKDxjb25zdGFudD5WNEwyX0NJRF9NUEVHX1ZJREVPX01CX1JDX0VOQUJMRTwvY29uc3RhbnQ+KS4KK0FwcGxpY2FibGUgdG8gdGhlIEgyNjQgZW5jb2Rlci48L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5PjwvZW50cnk+PC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fSDI2NF9BREFQVElWRV9SQ19BQ1RJVklUWTwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJPGVudHJ5PmJvb2xlYW48L2VudHJ5PgorCSAgICAgIDwvcm93Pjxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+QWRhcHRpdmUgcmF0ZSBjb250cm9sIGZvciBhY3Rpdml0eSByZWdpb24uCitWYWxpZCBvbmx5IHdoZW4gSC4yNjQgYW5kIG1hY3JvYmxvY2sgbGV2ZWwgUkMgaXMgZW5hYmxlZCAoPGNvbnN0YW50PlY0TDJfQ0lEX01QRUdfVklERU9fTUJfUkNfRU5BQkxFPC9jb25zdGFudD4pLgorQXBwbGljYWJsZSB0byB0aGUgSDI2NCBlbmNvZGVyLjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19GUkFNRV9TS0lQX01PREU8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5lbnVtJm5ic3A7djRsMl9tcGVnX21mYzUxX2ZyYW1lX3NraXBfbW9kZTwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj4KK0luZGljYXRlcyBpbiB3aGF0IGNvbmRpdGlvbnMgdGhlIGVuY29kZXIgc2hvdWxkIHNraXAgZnJhbWVzLiBJZiBlbmNvZGluZyBhIGZyYW1lIHdvdWxkIGNhdXNlIHRoZSBlbmNvZGVkIHN0cmVhbSB0byBiZSBsYXJnZXIgdGhlbgorYSBjaG9zZW4gZGF0YSBsaW1pdCB0aGVuIHRoZSBmcmFtZSB3aWxsIGJlIHNraXBwZWQuCitQb3NzaWJsZSB2YWx1ZXMgYXJlOjwvZW50cnk+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz4KKwkJPGVudHJ5dGJsIHNwYW5uYW1lPSJkZXNjciIgY29scz0iMiI+CisJCSAgPHRib2R5IHZhbGlnbj0idG9wIj4KKwkJICAgIDxyb3c+CisJCSAgICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9NUEVHX01GQzUxX0ZSQU1FX1NLSVBfTU9ERV9ESVNBQkxFRDwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkZyYW1lIHNraXAgbW9kZSBpcyBkaXNhYmxlZC48L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19NRkM1MV9GUkFNRV9TS0lQX01PREVfTEVWRUxfTElNSVQ8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCSAgICAgIDxlbnRyeT5GcmFtZSBza2lwIG1vZGUgZW5hYmxlZCBhbmQgYnVmZmVyIGxpbWl0IGlzIHNldCBieSB0aGUgY2hvc2VuIGxldmVsIGFuZCBpcyBkZWZpbmVkIGJ5IHRoZSBzdGFuZGFyZC48L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19NRkM1MV9GUkFNRV9TS0lQX01PREVfQlVGX0xJTUlUPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+RnJhbWUgc2tpcCBtb2RlIGVuYWJsZWQgYW5kIGJ1ZmZlciBsaW1pdCBpcyBzZXQgYnkgdGhlIFZCViAoTVBFRzEvMi80KSBvciBDUEIgKEgyNjQpIGJ1ZmZlciBzaXplIGNvbnRyb2wuPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgIDwvdGJvZHk+CisJCTwvZW50cnl0Ymw+CisJICAgICAgPC9yb3c+CisJICAgICAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwkgICAgICA8cm93PgorCQk8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19SQ19GSVhFRF9UQVJHRVRfQklUPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQk8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICAgICAgPC9yb3c+PHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5FbmFibGUgcmF0ZS1jb250cm9sIHdpdGggZml4ZWQgdGFyZ2V0IGJpdC4KK0lmIHRoaXMgc2V0dGluZyBpcyBlbmFibGVkLCB0aGVuIHRoZSByYXRlIGNvbnRyb2wgbG9naWMgb2YgdGhlIGVuY29kZXIgd2lsbCBjYWxjdWxhdGUgdGhlIGF2ZXJhZ2UgYml0cmF0ZQorZm9yIGEgR09QIGFuZCBrZWVwIGl0IGJlbG93IG9yIGVxdWFsIHRoZSBzZXQgYml0cmF0ZSB0YXJnZXQuIE90aGVyd2lzZSB0aGUgcmF0ZSBjb250cm9sIGxvZ2ljIGNhbGN1bGF0ZXMgdGhlCitvdmVyYWxsIGF2ZXJhZ2UgYml0cmF0ZSBmb3IgdGhlIHN0cmVhbSBhbmQga2VlcHMgaXQgYmVsb3cgb3IgZXF1YWwgdG8gdGhlIHNldCBiaXRyYXRlLiBJbiB0aGUgZmlyc3QgY2FzZQordGhlIGF2ZXJhZ2UgYml0cmF0ZSBmb3IgdGhlIHdob2xlIHN0cmVhbSB3aWxsIGJlIHNtYWxsZXIgdGhlbiB0aGUgc2V0IGJpdHJhdGUuIFRoaXMgaXMgY2F1c2VkIGJlY2F1c2UgdGhlCithdmVyYWdlIGlzIGNhbGN1bGF0ZWQgZm9yIHNtYWxsZXIgbnVtYmVyIG9mIGZyYW1lcywgb24gdGhlIG90aGVyIGhhbmQgZW5hYmxpbmcgdGhpcyBzZXR0aW5nIHdpbGwgZW5zdXJlIHRoYXQKK3RoZSBzdHJlYW0gd2lsbCBtZWV0IHRpZ2h0IGJhbmR3aWR0aCBjb250cmFpbnRzLiBBcHBsaWNhYmxlIHRvIGVuY29kZXJzLgorPC9lbnRyeT4KKwkgICAgICA8L3Jvdz4KKwkgICAgICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0ZPUkNFX0ZSQU1FX1RZUEU8L2NvbnN0YW50PiZuYnNwOzwvZW50cnk+CisJCTxlbnRyeT5lbnVtJm5ic3A7djRsMl9tcGVnX21mYzUxX2ZvcmNlX2ZyYW1lX3R5cGU8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+PGVudHJ5IHNwYW5uYW1lPSJkZXNjciI+Rm9yY2UgYSBmcmFtZSB0eXBlIGZvciB0aGUgbmV4dCBxdWV1ZWQgYnVmZmVyLiBBcHBsaWNhYmxlIHRvIGVuY29kZXJzLgorUG9zc2libGUgdmFsdWVzIGFyZTo8L2VudHJ5PgorCSAgICAgIDwvcm93PgorCSAgICAgIDxyb3c+CisJCTxlbnRyeXRibCBzcGFubmFtZT0iZGVzY3IiIGNvbHM9IjIiPgorCQkgIDx0Ym9keSB2YWxpZ249InRvcCI+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19NRkM1MV9GT1JDRV9GUkFNRV9UWVBFX0RJU0FCTEVEPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+Rm9yY2luZyBhIHNwZWNpZmljIGZyYW1lIHR5cGUgZGlzYWJsZWQuPC9lbnRyeT4KKwkJICAgIDwvcm93PgorCQkgICAgPHJvdz4KKwkJICAgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX01QRUdfTUZDNTFfRk9SQ0VfRlJBTUVfVFlQRV9JX0ZSQU1FPC9jb25zdGFudD4mbmJzcDs8L2VudHJ5PgorCQkgICAgICA8ZW50cnk+Rm9yY2UgYW4gSS1mcmFtZS48L2VudHJ5PgorCQkgICAgPC9yb3c+CisJCSAgICA8cm93PgorCQkgICAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfTVBFR19NRkM1MV9GT1JDRV9GUkFNRV9UWVBFX05PVF9DT0RFRDwvY29uc3RhbnQ+Jm5ic3A7PC9lbnRyeT4KKwkJICAgICAgPGVudHJ5PkZvcmNlIGEgbm9uLWNvZGVkIGZyYW1lLjwvZW50cnk+CisJCSAgICA8L3Jvdz4KKwkJICA8L3Rib2R5PgorCQk8L2VudHJ5dGJsPgorCSAgICAgIDwvcm93PgogCSAgICA8L3Rib2R5PgogCSAgPC90Z3JvdXA+CiAJPC90YWJsZT4KQEAgLTIwOTIsNiArMzA3MiwyODkgQEAKIDxwYXJhPkZvciBtb3JlIGRldGFpbHMgYWJvdXQgUkRTIHNwZWNpZmljYXRpb24sIHJlZmVyIHRvCiA8eHJlZiBsaW5rZW5kPSJlbjUwMDY3IiAvPiBkb2N1bWVudCwgZnJvbSBDRU5FTEVDLjwvcGFyYT4KICAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiBpZD0iZmxhc2gtY29udHJvbHMiPgorICAgICAgPHRpdGxlPkZsYXNoIENvbnRyb2wgUmVmZXJlbmNlPC90aXRsZT4KKworICAgICAgPG5vdGU+CisJPHRpdGxlPkV4cGVyaW1lbnRhbDwvdGl0bGU+CisKKwk8cGFyYT5UaGlzIGlzIGFuIDxsaW5rIGxpbmtlbmQ9ImV4cGVyaW1lbnRhbCI+ZXhwZXJpbWVudGFsPC9saW5rPgoraW50ZXJmYWNlIGFuZCBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUuPC9wYXJhPgorICAgICAgPC9ub3RlPgorCisgICAgICA8cGFyYT4KKwlUaGUgVjRMMiBmbGFzaCBjb250cm9scyBhcmUgaW50ZW5kZWQgdG8gcHJvdmlkZSBnZW5lcmljIGFjY2VzcworCXRvIGZsYXNoIGNvbnRyb2xsZXIgZGV2aWNlcy4gRmxhc2ggY29udHJvbGxlciBkZXZpY2VzIGFyZQorCXR5cGljYWxseSB1c2VkIGluIGRpZ2l0YWwgY2FtZXJhcy4KKyAgICAgIDwvcGFyYT4KKworICAgICAgPHBhcmE+CisJVGhlIGludGVyZmFjZSBjYW4gc3VwcG9ydCBib3RoIExFRCBhbmQgeGVub24gZmxhc2ggZGV2aWNlcy4gQXMKKwlvZiB3cml0aW5nIHRoaXMsIHRoZXJlIGlzIG5vIHhlbm9uIGZsYXNoIGRyaXZlciB1c2luZyB0aGlzCisJaW50ZXJmYWNlLgorICAgICAgPC9wYXJhPgorCisgICAgICA8c2VjdGlvbiBpZD0iZmxhc2gtY29udHJvbHMtdXNlLWNhc2VzIj4KKwk8dGl0bGU+U3VwcG9ydGVkIHVzZSBjYXNlczwvdGl0bGU+CisKKwk8c2VjdGlvbj4KKwkgIDx0aXRsZT5VbnN5bmNocm9uaXNlZCBMRUQgZmxhc2ggKHNvZnR3YXJlIHN0cm9iZSk8L3RpdGxlPgorCisJICA8cGFyYT4KKwkgICAgVW5zeW5jaHJvbmlzZWQgTEVEIGZsYXNoIGlzIGNvbnRyb2xsZWQgZGlyZWN0bHkgYnkgdGhlCisJICAgIGhvc3QgYXMgdGhlIHNlbnNvci4gVGhlIGZsYXNoIG11c3QgYmUgZW5hYmxlZCBieSB0aGUgaG9zdAorCSAgICBiZWZvcmUgdGhlIGV4cG9zdXJlIG9mIHRoZSBpbWFnZSBzdGFydHMgYW5kIGRpc2FibGVkIG9uY2UKKwkgICAgaXQgZW5kcy4gVGhlIGhvc3QgaXMgZnVsbHkgcmVzcG9uc2libGUgZm9yIHRoZSB0aW1pbmcgb2YKKwkgICAgdGhlIGZsYXNoLgorCSAgPC9wYXJhPgorCisJICA8cGFyYT5FeGFtcGxlIG9mIHN1Y2ggZGV2aWNlOiBOb2tpYSBOOTAwLjwvcGFyYT4KKwk8L3NlY3Rpb24+CisKKwk8c2VjdGlvbj4KKwkgIDx0aXRsZT5TeW5jaHJvbmlzZWQgTEVEIGZsYXNoIChoYXJkd2FyZSBzdHJvYmUpPC90aXRsZT4KKworCSAgPHBhcmE+CisJICAgIFRoZSBzeW5jaHJvbmlzZWQgTEVEIGZsYXNoIGlzIHByZS1wcm9ncmFtbWVkIGJ5IHRoZSBob3N0CisJICAgIChwb3dlciBhbmQgdGltZW91dCkgYnV0IGNvbnRyb2xsZWQgYnkgdGhlIHNlbnNvciB0aHJvdWdoIGEKKwkgICAgc3Ryb2JlIHNpZ25hbCBmcm9tIHRoZSBzZW5zb3IgdG8gdGhlIGZsYXNoLgorCSAgPC9wYXJhPgorCisJICA8cGFyYT4KKwkgICAgVGhlIHNlbnNvciBjb250cm9scyB0aGUgZmxhc2ggZHVyYXRpb24gYW5kIHRpbWluZy4gVGhpcworCSAgICBpbmZvcm1hdGlvbiB0eXBpY2FsbHkgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB0byB0aGUKKwkgICAgc2Vuc29yLgorCSAgPC9wYXJhPgorCisJPC9zZWN0aW9uPgorCisJPHNlY3Rpb24+CisJICA8dGl0bGU+TEVEIGZsYXNoIGFzIHRvcmNoPC90aXRsZT4KKworCSAgPHBhcmE+CisJICAgIExFRCBmbGFzaCBtYXkgYmUgdXNlZCBhcyB0b3JjaCBpbiBjb25qdW5jdGlvbiB3aXRoIGFub3RoZXIKKwkgICAgdXNlIGNhc2UgaW52b2x2aW5nIGNhbWVyYSBvciBpbmRpdmlkdWFsbHkuCisJICA8L3BhcmE+CisKKwk8L3NlY3Rpb24+CisKKyAgICAgIDwvc2VjdGlvbj4KKworICAgICAgPHRhYmxlIHBnd2lkZT0iMSIgZnJhbWU9Im5vbmUiIGlkPSJmbGFzaC1jb250cm9sLWlkIj4KKyAgICAgIDx0aXRsZT5GbGFzaCBDb250cm9sIElEczwvdGl0bGU+CisKKyAgICAgIDx0Z3JvdXAgY29scz0iNCI+CisJPGNvbHNwZWMgY29sbmFtZT0iYzEiIGNvbHdpZHRoPSIxKiIgLz4KKwk8Y29sc3BlYyBjb2xuYW1lPSJjMiIgY29sd2lkdGg9IjYqIiAvPgorCTxjb2xzcGVjIGNvbG5hbWU9ImMzIiBjb2x3aWR0aD0iMioiIC8+CisJPGNvbHNwZWMgY29sbmFtZT0iYzQiIGNvbHdpZHRoPSI2KiIgLz4KKwk8c3BhbnNwZWMgbmFtZXN0PSJjMSIgbmFtZWVuZD0iYzIiIHNwYW5uYW1lPSJpZCIgLz4KKwk8c3BhbnNwZWMgbmFtZXN0PSJjMiIgbmFtZWVuZD0iYzQiIHNwYW5uYW1lPSJkZXNjciIgLz4KKwk8dGhlYWQ+CisJICA8cm93PgorCSAgICA8ZW50cnkgc3Bhbm5hbWU9ImlkIiBhbGlnbj0ibGVmdCI+SUQ8L2VudHJ5PgorCSAgICA8ZW50cnkgYWxpZ249ImxlZnQiPlR5cGU8L2VudHJ5PgorCSAgPC9yb3c+PHJvdyByb3dzZXA9IjEiPjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiIGFsaWduPSJsZWZ0Ij5EZXNjcmlwdGlvbjwvZW50cnk+CisJICA8L3Jvdz4KKwk8L3RoZWFkPgorCTx0Ym9keSB2YWxpZ249InRvcCI+CisJICA8cm93PjxlbnRyeT48L2VudHJ5Pjwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX0ZMQVNIX0NMQVNTPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+Y2xhc3M8L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5UaGUgRkxBU0ggY2xhc3MgZGVzY3JpcHRvci48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfRkxBU0hfTEVEX01PREU8L2NvbnN0YW50PjwvZW50cnk+CisJICAgIDxlbnRyeT5tZW51PC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdyBpZD0idjRsMi1mbGFzaC1sZWQtbW9kZSI+CisJICAgIDxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPkRlZmluZXMgdGhlIG1vZGUgb2YgdGhlIGZsYXNoIExFRCwKKwkgICAgdGhlIGhpZ2gtcG93ZXIgd2hpdGUgTEVEIGF0dGFjaGVkIHRvIHRoZSBmbGFzaCBjb250cm9sbGVyLgorCSAgICBTZXR0aW5nIHRoaXMgY29udHJvbCBtYXkgbm90IGJlIHBvc3NpYmxlIGluIHByZXNlbmNlIG9mCisJICAgIHNvbWUgZmF1bHRzLiBTZWUgVjRMMl9DSURfRkxBU0hfRkFVTFQuPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5dGJsIHNwYW5uYW1lPSJkZXNjciIgY29scz0iMiI+CisJICAgICAgPHRib2R5IHZhbGlnbj0idG9wIj4KKwkJPHJvdz4KKwkJICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfRkxBU0hfTEVEX01PREVfTk9ORTwvY29uc3RhbnQ+PC9lbnRyeT4KKwkJICA8ZW50cnk+T2ZmLjwvZW50cnk+CisJCTwvcm93PgorCQk8cm93PgorCQkgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9GTEFTSF9MRURfTU9ERV9GTEFTSDwvY29uc3RhbnQ+PC9lbnRyeT4KKwkJICA8ZW50cnk+Rmxhc2ggbW9kZS48L2VudHJ5PgorCQk8L3Jvdz4KKwkJPHJvdz4KKwkJICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfRkxBU0hfTEVEX01PREVfVE9SQ0g8L2NvbnN0YW50PjwvZW50cnk+CisJCSAgPGVudHJ5PlRvcmNoIG1vZGUuIFNlZSBWNEwyX0NJRF9GTEFTSF9UT1JDSF9JTlRFTlNJVFkuPC9lbnRyeT4KKwkJPC9yb3c+CisJICAgICAgPC90Ym9keT4KKwkgICAgPC9lbnRyeXRibD4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX0ZMQVNIX1NUUk9CRV9TT1VSQ0U8L2NvbnN0YW50PjwvZW50cnk+CisJICAgIDxlbnRyeT5tZW51PC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdyBpZD0idjRsMi1mbGFzaC1zdHJvYmUtc291cmNlIj48ZW50cnkKKwkgIHNwYW5uYW1lPSJkZXNjciI+RGVmaW5lcyB0aGUgc291cmNlIG9mIHRoZSBmbGFzaCBMRUQKKwkgIHN0cm9iZS48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnl0Ymwgc3Bhbm5hbWU9ImRlc2NyIiBjb2xzPSIyIj4KKwkgICAgICA8dGJvZHkgdmFsaWduPSJ0b3AiPgorCQk8cm93PgorCQkgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9GTEFTSF9TVFJPQkVfU09VUkNFX1NPRlRXQVJFPC9jb25zdGFudD48L2VudHJ5PgorCQkgIDxlbnRyeT5UaGUgZmxhc2ggc3Ryb2JlIGlzIHRyaWdnZXJlZCBieSB1c2luZworCQkgIHRoZSBWNEwyX0NJRF9GTEFTSF9TVFJPQkUgY29udHJvbC48L2VudHJ5PgorCQk8L3Jvdz4KKwkJPHJvdz4KKwkJICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfRkxBU0hfU1RST0JFX1NPVVJDRV9FWFRFUk5BTDwvY29uc3RhbnQ+PC9lbnRyeT4KKwkJICA8ZW50cnk+VGhlIGZsYXNoIHN0cm9iZSBpcyB0cmlnZ2VyZWQgYnkgYW4KKwkJICBleHRlcm5hbCBzb3VyY2UuIFR5cGljYWxseSB0aGlzIGlzIGEgc2Vuc29yLAorCQkgIHdoaWNoIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHN5bmNocm9uaXNlcyB0aGUKKwkJICBmbGFzaCBzdHJvYmUgc3RhcnQgdG8gZXhwb3N1cmUgc3RhcnQuPC9lbnRyeT4KKwkJPC9yb3c+CisJICAgICAgPC90Ym9keT4KKwkgICAgPC9lbnRyeXRibD4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX0ZMQVNIX1NUUk9CRTwvY29uc3RhbnQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PmJ1dHRvbjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPlN0cm9iZSBmbGFzaC4gVmFsaWQgd2hlbgorCSAgICBWNEwyX0NJRF9GTEFTSF9MRURfTU9ERSBpcyBzZXQgdG8KKwkgICAgVjRMMl9GTEFTSF9MRURfTU9ERV9GTEFTSCBhbmQgVjRMMl9DSURfRkxBU0hfU1RST0JFX1NPVVJDRQorCSAgICBpcyBzZXQgdG8gVjRMMl9GTEFTSF9TVFJPQkVfU09VUkNFX1NPRlRXQVJFLiBTZXR0aW5nIHRoaXMKKwkgICAgY29udHJvbCBtYXkgbm90IGJlIHBvc3NpYmxlIGluIHByZXNlbmNlIG9mIHNvbWUgZmF1bHRzLgorCSAgICBTZWUgVjRMMl9DSURfRkxBU0hfRkFVTFQuPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX0ZMQVNIX1NUUk9CRV9TVE9QPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+YnV0dG9uPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz48ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5TdG9wIGZsYXNoIHN0cm9iZSBpbW1lZGlhdGVseS48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfRkxBU0hfU1RST0JFX1NUQVRVUzwvY29uc3RhbnQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PmJvb2xlYW48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5TdHJvYmUgc3RhdHVzOiB3aGV0aGVyIHRoZSBmbGFzaAorCSAgICBpcyBzdHJvYmluZyBhdCB0aGUgbW9tZW50IG9yIG5vdC4gVGhpcyBpcyBhIHJlYWQtb25seQorCSAgICBjb250cm9sLjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9GTEFTSF9USU1FT1VUPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPkhhcmR3YXJlIHRpbWVvdXQgZm9yIGZsYXNoLiBUaGUKKwkgICAgZmxhc2ggc3Ryb2JlIGlzIHN0b3BwZWQgYWZ0ZXIgdGhpcyBwZXJpb2Qgb2YgdGltZSBoYXMKKwkgICAgcGFzc2VkIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBzdHJvYmUuPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX0ZMQVNIX0lOVEVOU0lUWTwvY29uc3RhbnQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PmludGVnZXI8L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5JbnRlbnNpdHkgb2YgdGhlIGZsYXNoIHN0cm9iZSB3aGVuCisJICAgIHRoZSBmbGFzaCBMRUQgaXMgaW4gZmxhc2ggbW9kZQorCSAgICAoVjRMMl9GTEFTSF9MRURfTU9ERV9GTEFTSCkuIFRoZSB1bml0IHNob3VsZCBiZSBtaWxsaWFtcHMKKwkgICAgKG1BKSBpZiBwb3NzaWJsZS48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfRkxBU0hfVE9SQ0hfSU5URU5TSVRZPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+aW50ZWdlcjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPkludGVuc2l0eSBvZiB0aGUgZmxhc2ggTEVEIGluCisJICAgIHRvcmNoIG1vZGUgKFY0TDJfRkxBU0hfTEVEX01PREVfVE9SQ0gpLiBUaGUgdW5pdCBzaG91bGQgYmUKKwkgICAgbWlsbGlhbXBzIChtQSkgaWYgcG9zc2libGUuIFNldHRpbmcgdGhpcyBjb250cm9sIG1heSBub3QKKwkgICAgYmUgcG9zc2libGUgaW4gcHJlc2VuY2Ugb2Ygc29tZSBmYXVsdHMuIFNlZQorCSAgICBWNEwyX0NJRF9GTEFTSF9GQVVMVC48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnkgc3Bhbm5hbWU9ImlkIj48Y29uc3RhbnQ+VjRMMl9DSURfRkxBU0hfSU5ESUNBVE9SX0lOVEVOU0lUWTwvY29uc3RhbnQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PmludGVnZXI8L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5JbnRlbnNpdHkgb2YgdGhlIGluZGljYXRvciBMRUQuCisJICAgIFRoZSBpbmRpY2F0b3IgTEVEIG1heSBiZSBmdWxseSBpbmRlcGVuZGVudCBvZiB0aGUgZmxhc2gKKwkgICAgTEVELiBUaGUgdW5pdCBzaG91bGQgYmUgbWljcm9hbXBzICh1QSkgaWYgcG9zc2libGUuPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX0ZMQVNIX0ZBVUxUPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+Yml0bWFzazwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPkZhdWx0cyByZWxhdGVkIHRvIHRoZSBmbGFzaC4gVGhlCisJICAgIGZhdWx0cyB0ZWxsIGFib3V0IHNwZWNpZmljIHByb2JsZW1zIGluIHRoZSBmbGFzaCBjaGlwCisJICAgIGl0c2VsZiBvciB0aGUgTEVEcyBhdHRhY2hlZCB0byBpdC4gRmF1bHRzIG1heSBwcmV2ZW50CisJICAgIGZ1cnRoZXIgdXNlIG9mIHNvbWUgb2YgdGhlIGZsYXNoIGNvbnRyb2xzLiBJbiBwYXJ0aWN1bGFyLAorCSAgICBWNEwyX0NJRF9GTEFTSF9MRURfTU9ERSBpcyBzZXQgdG8gVjRMMl9GTEFTSF9MRURfTU9ERV9OT05FCisJICAgIGlmIHRoZSBmYXVsdCBhZmZlY3RzIHRoZSBmbGFzaCBMRUQuIEV4YWN0bHkgd2hpY2ggZmF1bHRzCisJICAgIGhhdmUgc3VjaCBhbiBlZmZlY3QgaXMgY2hpcCBkZXBlbmRlbnQuIFJlYWRpbmcgdGhlIGZhdWx0cworCSAgICByZXNldHMgdGhlIGNvbnRyb2wgYW5kIHJldHVybnMgdGhlIGNoaXAgdG8gYSB1c2FibGUgc3RhdGUKKwkgICAgaWYgcG9zc2libGUuPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5dGJsIHNwYW5uYW1lPSJkZXNjciIgY29scz0iMiI+CisJICAgICAgPHRib2R5IHZhbGlnbj0idG9wIj4KKwkJPHJvdz4KKwkJICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfRkxBU0hfRkFVTFRfT1ZFUl9WT0xUQUdFPC9jb25zdGFudD48L2VudHJ5PgorCQkgIDxlbnRyeT5GbGFzaCBjb250cm9sbGVyIHZvbHRhZ2UgdG8gdGhlIGZsYXNoIExFRAorCQkgIGhhcyBleGNlZWRlZCB0aGUgbGltaXQgc3BlY2lmaWMgdG8gdGhlIGZsYXNoCisJCSAgY29udHJvbGxlci48L2VudHJ5PgorCQk8L3Jvdz4KKwkJPHJvdz4KKwkJICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfRkxBU0hfRkFVTFRfVElNRU9VVDwvY29uc3RhbnQ+PC9lbnRyeT4KKwkJICA8ZW50cnk+VGhlIGZsYXNoIHN0cm9iZSB3YXMgc3RpbGwgb24gd2hlbgorCQkgIHRoZSB0aW1lb3V0IHNldCBieSB0aGUgdXNlciAtLS0KKwkJICBWNEwyX0NJRF9GTEFTSF9USU1FT1VUIGNvbnRyb2wgLS0tIGhhcyBleHBpcmVkLgorCQkgIE5vdCBhbGwgZmxhc2ggY29udHJvbGxlcnMgbWF5IHNldCB0aGlzIGluIGFsbAorCQkgIHN1Y2ggY29uZGl0aW9ucy48L2VudHJ5PgorCQk8L3Jvdz4KKwkJPHJvdz4KKwkJICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfRkxBU0hfRkFVTFRfT1ZFUl9URU1QRVJBVFVSRTwvY29uc3RhbnQ+PC9lbnRyeT4KKwkJICA8ZW50cnk+VGhlIGZsYXNoIGNvbnRyb2xsZXIgaGFzIG92ZXJoZWF0ZWQuPC9lbnRyeT4KKwkJPC9yb3c+CisJCTxyb3c+CisJCSAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX0ZMQVNIX0ZBVUxUX1NIT1JUX0NJUkNVSVQ8L2NvbnN0YW50PjwvZW50cnk+CisJCSAgPGVudHJ5PlRoZSBzaG9ydCBjaXJjdWl0IHByb3RlY3Rpb24gb2YgdGhlIGZsYXNoCisJCSAgY29udHJvbGxlciBoYXMgYmVlbiB0cmlnZ2VyZWQuPC9lbnRyeT4KKwkJPC9yb3c+CisJICAgICAgPC90Ym9keT4KKwkgICAgPC9lbnRyeXRibD4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5IHNwYW5uYW1lPSJpZCI+PGNvbnN0YW50PlY0TDJfQ0lEX0ZMQVNIX0NIQVJHRTwvY29uc3RhbnQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PmJvb2xlYW48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PjxlbnRyeSBzcGFubmFtZT0iZGVzY3IiPkVuYWJsZSBvciBkaXNhYmxlIGNoYXJnaW5nIG9mIHRoZSB4ZW5vbgorCSAgZmxhc2ggY2FwYWNpdG9yLjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeSBzcGFubmFtZT0iaWQiPjxjb25zdGFudD5WNEwyX0NJRF9GTEFTSF9SRUFEWTwvY29uc3RhbnQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PmJvb2xlYW48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnkgc3Bhbm5hbWU9ImRlc2NyIj5JcyB0aGUgZmxhc2ggcmVhZHkgdG8gc3Ryb2JlPworCSAgICBYZW5vbiBmbGFzaGVzIHJlcXVpcmUgdGhlaXIgY2FwYWNpdG9ycyBjaGFyZ2VkIGJlZm9yZQorCSAgICBzdHJvYmluZy4gTEVEIGZsYXNoZXMgb2Z0ZW4gcmVxdWlyZSBhIGNvb2xkb3duIHBlcmlvZAorCSAgICBhZnRlciBzdHJvYmUgZHVyaW5nIHdoaWNoIGFub3RoZXIgc3Ryb2JlIHdpbGwgbm90IGJlCisJICAgIHBvc3NpYmxlLiBUaGlzIGlzIGEgcmVhZC1vbmx5IGNvbnRyb2wuPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz48ZW50cnk+PC9lbnRyeT48L3Jvdz4KKwk8L3Rib2R5PgorICAgICAgPC90Z3JvdXA+CisgICAgICA8L3RhYmxlPgorCisgICAgPC9zZWN0aW9uPgogPC9zZWN0aW9uPgogCiAgIDwhLS0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvY3JvcC5wZGYgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2Nyb3AucGRmCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Nyb3AucGRmCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2Nyb3AucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvZGV2LWNhcHR1cmUueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kZXYtY2FwdHVyZS54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvZGV2LWNhcHR1cmUueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2Rldi1jYXB0dXJlLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9kZXYtY29kZWMueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kZXYtY29kZWMueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Rldi1jb2RlYy54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZGV2LWNvZGVjLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9kZXYtZWZmZWN0LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZGV2LWVmZmVjdC54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvZGV2LWVmZmVjdC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZGV2LWVmZmVjdC54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZGV2LWV2ZW50LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZGV2LWV2ZW50LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTRhZTNmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kZXYtZXZlbnQueG1sCkBAIC0wLDAgKzEsNTEgQEAKKyAgPHRpdGxlPkV2ZW50IEludGVyZmFjZTwvdGl0bGU+CisKKyAgPHBhcmE+VGhlIFY0TDIgZXZlbnQgaW50ZXJmYWNlIHByb3ZpZGVzIGEgbWVhbnMgZm9yIGEgdXNlciB0byBnZXQKKyAgaW1tZWRpYXRlbHkgbm90aWZpZWQgb24gY2VydGFpbiBjb25kaXRpb25zIHRha2luZyBwbGFjZSBvbiBhIGRldmljZS4KKyAgVGhpcyBtaWdodCBpbmNsdWRlIHN0YXJ0IG9mIGZyYW1lIG9yIGxvc3Mgb2Ygc2lnbmFsIGV2ZW50cywgZm9yCisgIGV4YW1wbGUuIENoYW5nZXMgaW4gdGhlIHZhbHVlIG9yIHN0YXRlIG9mIGEgVjRMMiBjb250cm9sIGNhbiBhbHNvIGJlCisgIHJlcG9ydGVkIHRocm91Z2ggZXZlbnRzLgorICA8L3BhcmE+CisKKyAgPHBhcmE+VG8gcmVjZWl2ZSBldmVudHMsIHRoZSBldmVudHMgdGhlIHVzZXIgaXMgaW50ZXJlc3RlZCBpbiBmaXJzdCBtdXN0CisgIGJlIHN1YnNjcmliZWQgdXNpbmcgdGhlICZWSURJT0MtU1VCU0NSSUJFLUVWRU5UOyBpb2N0bC4gT25jZSBhbiBldmVudCBpcworICBzdWJzY3JpYmVkLCB0aGUgZXZlbnRzIG9mIHN1YnNjcmliZWQgdHlwZXMgYXJlIGRlcXVldWVhYmxlIHVzaW5nIHRoZQorICAmVklESU9DLURRRVZFTlQ7IGlvY3RsLiBFdmVudHMgbWF5IGJlIHVuc3Vic2NyaWJlZCB1c2luZworICBWSURJT0NfVU5TVUJTQ1JJQkVfRVZFTlQgaW9jdGwuIFRoZSBzcGVjaWFsIGV2ZW50IHR5cGUgVjRMMl9FVkVOVF9BTEwgbWF5CisgIGJlIHVzZWQgdG8gdW5zdWJzY3JpYmUgYWxsIHRoZSBldmVudHMgdGhlIGRyaXZlciBzdXBwb3J0cy48L3BhcmE+CisKKyAgPHBhcmE+VGhlIGV2ZW50IHN1YnNjcmlwdGlvbnMgYW5kIGV2ZW50IHF1ZXVlcyBhcmUgc3BlY2lmaWMgdG8gZmlsZQorICBoYW5kbGVzLiBTdWJzY3JpYmluZyBhbiBldmVudCBvbiBvbmUgZmlsZSBoYW5kbGUgZG9lcyBub3QgYWZmZWN0CisgIG90aGVyIGZpbGUgaGFuZGxlcy48L3BhcmE+CisKKyAgPHBhcmE+VGhlIGluZm9ybWF0aW9uIG9uIGRlcXVldWVhYmxlIGV2ZW50cyBpcyBvYnRhaW5lZCBieSB1c2luZyBzZWxlY3Qgb3IKKyAgcG9sbCBzeXN0ZW0gY2FsbHMgb24gdmlkZW8gZGV2aWNlcy4gVGhlIFY0TDIgZXZlbnRzIHVzZSBQT0xMUFJJIGV2ZW50cyBvbgorICBwb2xsIHN5c3RlbSBjYWxsIGFuZCBleGNlcHRpb25zIG9uIHNlbGVjdCBzeXN0ZW0gY2FsbC48L3BhcmE+CisKKyAgPHBhcmE+U3RhcnRpbmcgd2l0aCBrZXJuZWwgMy4xIGNlcnRhaW4gZ3VhcmFudGVlcyBjYW4gYmUgZ2l2ZW4gd2l0aAorICByZWdhcmRzIHRvIGV2ZW50czo8b3JkZXJlZGxpc3Q+CisJPGxpc3RpdGVtPgorCSAgPHBhcmE+RWFjaCBzdWJzY3JpYmVkIGV2ZW50IGhhcyBpdHMgb3duIGludGVybmFsIGRlZGljYXRlZCBldmVudCBxdWV1ZS4KK1RoaXMgbWVhbnMgdGhhdCBmbG9vZGluZyBvZiBvbmUgZXZlbnQgdHlwZSB3aWxsIG5vdCBpbnRlcmZlcmUgd2l0aCBvdGhlcgorZXZlbnQgdHlwZXMuPC9wYXJhPgorCTwvbGlzdGl0ZW0+CisJPGxpc3RpdGVtPgorCSAgPHBhcmE+SWYgdGhlIGludGVybmFsIGV2ZW50IHF1ZXVlIGZvciBhIHBhcnRpY3VsYXIgc3Vic2NyaWJlZCBldmVudAorYmVjb21lcyBmdWxsLCB0aGVuIHRoZSBvbGRlc3QgZXZlbnQgaW4gdGhhdCBxdWV1ZSB3aWxsIGJlIGRyb3BwZWQuPC9wYXJhPgorCTwvbGlzdGl0ZW0+CisJPGxpc3RpdGVtPgorCSAgPHBhcmE+V2hlcmUgYXBwbGljYWJsZSwgY2VydGFpbiBldmVudCB0eXBlcyBjYW4gZW5zdXJlIHRoYXQgdGhlIHBheWxvYWQKK29mIHRoZSBvbGRlc3QgZXZlbnQgdGhhdCBpcyBhYm91dCB0byBiZSBkcm9wcGVkIHdpbGwgYmUgbWVyZ2VkIHdpdGggdGhlIHBheWxvYWQKK29mIHRoZSBuZXh0IG9sZGVzdCBldmVudC4gVGh1cyBlbnN1cmluZyB0aGF0IG5vIGluZm9ybWF0aW9uIGlzIGxvc3QsIGJ1dCBvbmx5IGFuCitpbnRlcm1lZGlhdGUgc3RlcCBsZWFkaW5nIHVwIHRvIHRoYXQgaW5mb3JtYXRpb24uIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlCitldmVudCB5b3Ugd2FudCB0byBzdWJzY3JpYmUgdG8gd2hldGhlciB0aGlzIGlzIGFwcGxpY2FibGUgZm9yIHRoYXQgZXZlbnQgb3Igbm90LjwvcGFyYT4KKwk8L2xpc3RpdGVtPgorICAgICAgPC9vcmRlcmVkbGlzdD48L3BhcmE+CisKKyAgPCEtLQorTG9jYWwgVmFyaWFibGVzOgorbW9kZTogc2dtbAorc2dtbC1wYXJlbnQtZG9jdW1lbnQ6ICJ2NGwyLnNnbWwiCitpbmRlbnQtdGFicy1tb2RlOiBuaWwKK0VuZDoKKyAgLS0+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Rldi1vc2QueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kZXYtb3NkLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9kZXYtb3NkLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kZXYtb3NkLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9kZXYtb3V0cHV0LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZGV2LW91dHB1dC54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvZGV2LW91dHB1dC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZGV2LW91dHB1dC54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvZGV2LW92ZXJsYXkueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kZXYtb3ZlcmxheS54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvZGV2LW92ZXJsYXkueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2Rldi1vdmVybGF5LnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9kZXYtcmFkaW8ueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kZXYtcmFkaW8ueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Rldi1yYWRpby54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZGV2LXJhZGlvLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9kZXYtcmF3LXZiaS54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2Rldi1yYXctdmJpLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9kZXYtcmF3LXZiaS54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZGV2LXJhdy12YmkueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Rldi1yZHMueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kZXYtcmRzLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9kZXYtcmRzLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kZXYtcmRzLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9kZXYtc2xpY2VkLXZiaS54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2Rldi1zbGljZWQtdmJpLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9kZXYtc2xpY2VkLXZiaS54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZGV2LXNsaWNlZC12YmkueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Rldi1zdWJkZXYueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kZXYtc3ViZGV2LnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9kZXYtc3ViZGV2LnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kZXYtc3ViZGV2LnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9kZXYtdGVsZXRleHQueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kZXYtdGVsZXRleHQueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Rldi10ZWxldGV4dC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZGV2LXRlbGV0ZXh0LnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9kcml2ZXIueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9kcml2ZXIueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2RyaXZlci54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZHJpdmVyLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9mZGwtYXBwZW5kaXgueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9mZGwtYXBwZW5kaXgueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2ZkbC1hcHBlbmRpeC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZmRsLWFwcGVuZGl4LnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9maWVsZHNlcV9idC5wZGYgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2ZpZWxkc2VxX2J0LnBkZgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9maWVsZHNlcV9idC5wZGYKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZmllbGRzZXFfYnQucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvZmllbGRzZXFfdGIucGRmIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9maWVsZHNlcV90Yi5wZGYKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvZmllbGRzZXFfdGIucGRmCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2ZpZWxkc2VxX3RiLnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Z1bmMtY2xvc2UueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9mdW5jLWNsb3NlLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9mdW5jLWNsb3NlLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9mdW5jLWNsb3NlLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9mdW5jLWlvY3RsLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZnVuYy1pb2N0bC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRlNjRiZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZnVuYy1pb2N0bC54bWwKQEAgLTAsMCArMSw3OSBAQAorPHJlZmVudHJ5IGlkPSJmdW5jLWlvY3RsIj4KKyAgPHJlZm1ldGE+CisgICAgPHJlZmVudHJ5dGl0bGU+VjRMMiBpb2N0bCgpPC9yZWZlbnRyeXRpdGxlPgorICAgICZtYW52b2w7CisgIDwvcmVmbWV0YT4KKworICA8cmVmbmFtZWRpdj4KKyAgICA8cmVmbmFtZT52NGwyLWlvY3RsPC9yZWZuYW1lPgorICAgIDxyZWZwdXJwb3NlPlByb2dyYW0gYSBWNEwyIGRldmljZTwvcmVmcHVycG9zZT4KKyAgPC9yZWZuYW1lZGl2PgorCisgIDxyZWZzeW5vcHNpc2Rpdj4KKyAgICA8ZnVuY3N5bm9wc2lzPgorICAgICAgPGZ1bmNzeW5vcHNpc2luZm8+I2luY2x1ZGUgJmx0O3N5cy9pb2N0bC5oJmd0OzwvZnVuY3N5bm9wc2lzaW5mbz4KKyAgICAgIDxmdW5jcHJvdG90eXBlPgorCTxmdW5jZGVmPmludCA8ZnVuY3Rpb24+aW9jdGw8L2Z1bmN0aW9uPjwvZnVuY2RlZj4KKwk8cGFyYW1kZWY+aW50IDxwYXJhbWV0ZXI+ZmQ8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgorCTxwYXJhbWRlZj5pbnQgPHBhcmFtZXRlcj5yZXF1ZXN0PC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KKwk8cGFyYW1kZWY+dm9pZCAqPHBhcmFtZXRlcj5hcmdwPC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KKyAgICAgIDwvZnVuY3Byb3RvdHlwZT4KKyAgICA8L2Z1bmNzeW5vcHNpcz4KKyAgPC9yZWZzeW5vcHNpc2Rpdj4KKworICA8cmVmc2VjdDE+CisgICAgPHRpdGxlPkFyZ3VtZW50czwvdGl0bGU+CisKKyAgICA8dmFyaWFibGVsaXN0PgorICAgICAgPHZhcmxpc3RlbnRyeT4KKwk8dGVybT48cGFyYW1ldGVyPmZkPC9wYXJhbWV0ZXI+PC90ZXJtPgorCTxsaXN0aXRlbT4KKwkgIDxwYXJhPiZmZDs8L3BhcmE+CisJPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgPHZhcmxpc3RlbnRyeT4KKwk8dGVybT48cGFyYW1ldGVyPnJlcXVlc3Q8L3BhcmFtZXRlcj48L3Rlcm0+CisJPGxpc3RpdGVtPgorCSAgPHBhcmE+VjRMMiBpb2N0bCByZXF1ZXN0IGNvZGUgYXMgZGVmaW5lZCBpbiB0aGUgPGZpbGVuYW1lPnZpZGVvZGV2Mi5oPC9maWxlbmFtZT4gaGVhZGVyIGZpbGUsIGZvciBleGFtcGxlCitWSURJT0NfUVVFUllDQVAuPC9wYXJhPgorCTwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICAgIDx2YXJsaXN0ZW50cnk+CisJPHRlcm0+PHBhcmFtZXRlcj5hcmdwPC9wYXJhbWV0ZXI+PC90ZXJtPgorCTxsaXN0aXRlbT4KKwkgIDxwYXJhPlBvaW50ZXIgdG8gYSBmdW5jdGlvbiBwYXJhbWV0ZXIsIHVzdWFsbHkgYSBzdHJ1Y3R1cmUuPC9wYXJhPgorCTwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICA8L3ZhcmlhYmxlbGlzdD4KKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDE+CisgICAgPHRpdGxlPkRlc2NyaXB0aW9uPC90aXRsZT4KKworICAgIDxwYXJhPlRoZSA8ZnVuY3Rpb24+aW9jdGwoKTwvZnVuY3Rpb24+IGZ1bmN0aW9uIGlzIHVzZWQgdG8gcHJvZ3JhbQorVjRMMiBkZXZpY2VzLiBUaGUgYXJndW1lbnQgPHBhcmFtZXRlcj5mZDwvcGFyYW1ldGVyPiBtdXN0IGJlIGFuIG9wZW4KK2ZpbGUgZGVzY3JpcHRvci4gQW4gaW9jdGwgPHBhcmFtZXRlcj5yZXF1ZXN0PC9wYXJhbWV0ZXI+IGhhcyBlbmNvZGVkCitpbiBpdCB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhbiBpbnB1dCwgb3V0cHV0IG9yIHJlYWQvd3JpdGUKK3BhcmFtZXRlciwgYW5kIHRoZSBzaXplIG9mIHRoZSBhcmd1bWVudCA8cGFyYW1ldGVyPmFyZ3A8L3BhcmFtZXRlcj4gaW4KK2J5dGVzLiBNYWNyb3MgYW5kIGRlZmluZXMgc3BlY2lmeWluZyBWNEwyIGlvY3RsIHJlcXVlc3RzIGFyZSBsb2NhdGVkCitpbiB0aGUgPGZpbGVuYW1lPnZpZGVvZGV2Mi5oPC9maWxlbmFtZT4gaGVhZGVyIGZpbGUuCitBcHBsaWNhdGlvbnMgc2hvdWxkIHVzZSB0aGVpciBvd24gY29weSwgbm90IGluY2x1ZGUgdGhlIHZlcnNpb24gaW4gdGhlCitrZXJuZWwgc291cmNlcyBvbiB0aGUgc3lzdGVtIHRoZXkgY29tcGlsZSBvbi4gQWxsIFY0TDIgaW9jdGwgcmVxdWVzdHMsCit0aGVpciByZXNwZWN0aXZlIGZ1bmN0aW9uIGFuZCBwYXJhbWV0ZXJzIGFyZSBzcGVjaWZpZWQgaW4gPHhyZWYKKwlsaW5rZW5kPSJ1c2VyLWZ1bmMiIC8+LjwvcGFyYT4KKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDE+CisgICAgJnJldHVybi12YWx1ZTsKKyAgICA8cGFyYT5XaGVuIGFuIGlvY3RsIHRoYXQgdGFrZXMgYW4gb3V0cHV0IG9yIHJlYWQvd3JpdGUgcGFyYW1ldGVyIGZhaWxzLAorICAgIHRoZSBwYXJhbWV0ZXIgcmVtYWlucyB1bm1vZGlmaWVkLjwvcGFyYT4KKyAgPC9yZWZzZWN0MT4KKzwvcmVmZW50cnk+CisKKzwhLS0KK0xvY2FsIFZhcmlhYmxlczoKK21vZGU6IHNnbWwKK3NnbWwtcGFyZW50LWRvY3VtZW50OiAidjRsMi5zZ21sIgoraW5kZW50LXRhYnMtbW9kZTogbmlsCitFbmQ6CistLT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvZnVuYy1tbWFwLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZnVuYy1tbWFwLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9mdW5jLW1tYXAueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2Z1bmMtbW1hcC54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvZnVuYy1tdW5tYXAueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9mdW5jLW11bm1hcC54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvZnVuYy1tdW5tYXAueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2Z1bmMtbXVubWFwLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9mdW5jLW9wZW4ueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9mdW5jLW9wZW4ueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Z1bmMtb3Blbi54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZnVuYy1vcGVuLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9mdW5jLXBvbGwueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9mdW5jLXBvbGwueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Z1bmMtcG9sbC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZnVuYy1wb2xsLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9mdW5jLXJlYWQueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9mdW5jLXJlYWQueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Z1bmMtcmVhZC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZnVuYy1yZWFkLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9mdW5jLXNlbGVjdC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2Z1bmMtc2VsZWN0LnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9mdW5jLXNlbGVjdC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZnVuYy1zZWxlY3QueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Z1bmMtd3JpdGUueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9mdW5jLXdyaXRlLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9mdW5jLXdyaXRlLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9mdW5jLXdyaXRlLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9nZW4tZXJyb3JzLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZ2VuLWVycm9ycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJiZjNjZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvZ2VuLWVycm9ycy54bWwKQEAgLTAsMCArMSw3OCBAQAorPHRpdGxlPkdlbmVyaWMgRXJyb3IgQ29kZXM8L3RpdGxlPgorCis8dGFibGUgZnJhbWU9Im5vbmUiIHBnd2lkZT0iMSIgaWQ9Imdlbi1lcnJvcnMiPgorICA8dGl0bGU+R2VuZXJpYyBlcnJvciBjb2RlczwvdGl0bGU+CisgIDx0Z3JvdXAgY29scz0iMiI+CisgICAgJmNzLXN0cjsKKyAgICA8dGJvZHkgdmFsaWduPSJ0b3AiPgorCTwhLS0gS2VlcCBpdCBvcmRlcmVkIGFscGhhYmV0aWNhbGx5IC0tPgorICAgICAgPHJvdz4KKwk8ZW50cnk+RUJBREY8L2VudHJ5PgorCTxlbnRyeT5UaGUgZmlsZSBkZXNjcmlwdG9yIGlzIG5vdCBhIHZhbGlkLjwvZW50cnk+CisgICAgICA8L3Jvdz4KKyAgICAgIDxyb3c+CisJPGVudHJ5PkVCVVNZPC9lbnRyeT4KKwk8ZW50cnk+VGhlIGlvY3RsIGNhbid0IGJlIGhhbmRsZWQgYmVjYXVzZSB0aGUgZGV2aWNlIGlzIGJ1c3kuIFRoaXMgaXMKKwkgICAgICAgdHlwaWNhbGx5IHJldHVybiB3aGlsZSBkZXZpY2UgaXMgc3RyZWFtaW5nLCBhbmQgYW4gaW9jdGwgdHJpZWQgdG8KKwkgICAgICAgY2hhbmdlIHNvbWV0aGluZyB0aGF0IHdvdWxkIGFmZmVjdCB0aGUgc3RyZWFtLCBvciB3b3VsZCByZXF1aXJlIHRoZQorCSAgICAgICB1c2FnZSBvZiBhIGhhcmR3YXJlIHJlc291cmNlIHRoYXQgd2FzIGFscmVhZHkgYWxsb2NhdGVkLiBUaGUgaW9jdGwKKwkgICAgICAgbXVzdCBub3QgYmUgcmV0cmllZCB3aXRob3V0IHBlcmZvcm1pbmcgYW5vdGhlciBhY3Rpb24gdG8gZml4IHRoZQorCSAgICAgICBwcm9ibGVtIGZpcnN0ICh0eXBpY2FsbHk6IHN0b3AgdGhlIHN0cmVhbSBiZWZvcmUgcmV0cnlpbmcpLjwvZW50cnk+CisgICAgICA8L3Jvdz4KKyAgICAgIDxyb3c+CisJPGVudHJ5PkVGQVVMVDwvZW50cnk+CisJPGVudHJ5PlRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgY29weWluZyBkYXRhIGZyb20vdG8gdXNlcnNwYWNlLAorCSAgICAgICBwcm9iYWJseSBjYXVzZWQgYnkgYW4gaW52YWxpZCBwb2ludGVyIHJlZmVyZW5jZS48L2VudHJ5PgorICAgICAgPC9yb3c+CisgICAgICA8cm93PgorCTxlbnRyeT5FSU5WQUw8L2VudHJ5PgorCTxlbnRyeT5PbmUgb3IgbW9yZSBvZiB0aGUgaW9jdGwgcGFyYW1ldGVycyBhcmUgaW52YWxpZCBvciBvdXQgb2YgdGhlCisJICAgICAgIGFsbG93ZWQgcmFuZ2UuIFRoaXMgaXMgYSB3aWRlbHkgdXNlZCBlcnJvciBjb2RlLiBTZWUgdGhlIGluZGl2aWR1YWwKKwkgICAgICAgaW9jdGwgcmVxdWVzdHMgZm9yIHNwZWNpZmljIGNhdXNlcy48L2VudHJ5PgorICAgICAgPC9yb3c+CisgICAgICA8cm93PgorICAgICAgICA8ZW50cnk+RU5PREVWPC9lbnRyeT4KKwk8ZW50cnk+RGV2aWNlIG5vdCBmb3VuZCBvciB3YXMgcmVtb3ZlZC48L2VudHJ5PgorICAgICAgPC9yb3c+CisgICAgICA8cm93PgorCTxlbnRyeT5FTk9NRU08L2VudHJ5PgorCTxlbnRyeT5UaGVyZSdzIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGhhbmRsZSB0aGUgZGVzaXJlZCBvcGVyYXRpb24uPC9lbnRyeT4KKyAgICAgIDwvcm93PgorICAgICAgPHJvdz4KKwk8ZW50cnk+RU5PVFRZPC9lbnRyeT4KKwk8ZW50cnk+VGhlIGlvY3RsIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGRyaXZlciwgYWN0dWFsbHkgbWVhbmluZyB0aGF0CisJICAgICAgIHRoZSByZXF1aXJlZCBmdW5jdGlvbmFsaXR5IGlzIG5vdCBhdmFpbGFibGUsIG9yIHRoZSBmaWxlCisJICAgICAgIGRlc2NyaXB0b3IgaXMgbm90IGZvciBhIG1lZGlhIGRldmljZS48L2VudHJ5PgorICAgICAgPC9yb3c+CisgICAgICA8cm93PgorCTxlbnRyeT5FTk9TUEM8L2VudHJ5PgorCTxlbnRyeT5PbiBVU0IgZGV2aWNlcywgdGhlIHN0cmVhbSBpb2N0bCdzIGNhbiByZXR1cm4gdGhpcyBlcnJvciwgbWVhbmluZworCSAgICAgICB0aGF0IHRoaXMgcmVxdWVzdCB3b3VsZCBvdmVyY29tbWl0IHRoZSB1c2IgYmFuZHdpZHRoIHJlc2VydmVkCisJICAgICAgIGZvciBwZXJpb2RpYyB0cmFuc2ZlcnMgKHVwIHRvIDgwJSBvZiB0aGUgVVNCIGJhbmR3aWR0aCkuPC9lbnRyeT4KKyAgICAgIDwvcm93PgorICAgICAgPHJvdz4KKwk8ZW50cnk+RU5PU1lTIG9yIEVPUE5PVFNVUFA8L2VudHJ5PgorCTxlbnRyeT5GdW5jdGlvbiBub3QgYXZhaWxhYmxlIGZvciB0aGlzIGRldmljZSAoZHZiIEFQSSBvbmx5LiBXaWxsIGxpa2VseQorCSAgICAgICBiZSByZXBsYWNlZCBhbnl0aW1lIHNvb24gYnkgRU5PVFRZKS48L2VudHJ5PgorICAgICAgPC9yb3c+CisgICAgICA8cm93PgorCTxlbnRyeT5FUEVSTTwvZW50cnk+CisJPGVudHJ5PlBlcm1pc3Npb24gZGVuaWVkLiBDYW4gYmUgcmV0dXJuZWQgaWYgdGhlIGRldmljZSBuZWVkcyB3cml0ZQorCQlwZXJtaXNzaW9uLCBvciBzb21lIHNwZWNpYWwgY2FwYWJpbGl0aWVzIGlzIG5lZWRlZAorCQkoZS4gZy4gcm9vdCk8L2VudHJ5PgorICAgICAgPC9yb3c+CisgICAgICA8cm93PgorCTxlbnRyeT5FV09VTERCTE9DSzwvZW50cnk+CisJPGVudHJ5Pk9wZXJhdGlvbiB3b3VsZCBibG9jay4gVXNlZCB3aGVuIHRoZSBpb2N0bCB3b3VsZCBuZWVkIHRvIHdhaXQKKwkgICAgICAgZm9yIGFuIGV2ZW50LCBidXQgdGhlIGRldmljZSB3YXMgb3BlbmVkIGluIG5vbi1ibG9ja2luZyBtb2RlLjwvZW50cnk+CisgICAgICA8L3Jvdz4KKyAgICA8L3Rib2R5PgorICA8L3Rncm91cD4KKzwvdGFibGU+CisKKzxwYXJhPk5vdGUgMTogaW9jdGxzIG1heSByZXR1cm4gb3RoZXIgZXJyb3IgY29kZXMuIFNpbmNlIGVycm9ycyBtYXkgaGF2ZSBzaWRlCitlZmZlY3RzIHN1Y2ggYXMgYSBkcml2ZXIgcmVzZXQsIGFwcGxpY2F0aW9ucyBzaG91bGQgYWJvcnQgb24gdW5leHBlY3RlZCBlcnJvcnMuCis8L3BhcmE+CisKKzxwYXJhPk5vdGUgMjogUmVxdWVzdC1zcGVjaWZpYyBlcnJvciBjb2RlcyBhcmUgbGlzdGVkIGluIHRoZSBpbmRpdmlkdWFsCityZXF1ZXN0cyBkZXNjcmlwdGlvbnMuPC9wYXJhPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9pby54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2lvLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9pby54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvaW8ueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2tleXRhYmxlLmMueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9rZXl0YWJsZS5jLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9rZXl0YWJsZS5jLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9rZXl0YWJsZS5jLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9saWJ2NGwueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9saWJ2NGwueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2xpYnY0bC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvbGlidjRsLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9saXJjX2RldmljZV9pbnRlcmZhY2UueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9saXJjX2RldmljZV9pbnRlcmZhY2UueG1sCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvbGlyY19kZXZpY2VfaW50ZXJmYWNlLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9saXJjX2RldmljZV9pbnRlcmZhY2UueG1sCmluZGV4IDBlMDQ1M2YuLjhkN2ViNmIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvbGlyY19kZXZpY2VfaW50ZXJmYWNlLnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL2xpcmNfZGV2aWNlX2ludGVyZmFjZS54bWwKQEAgLTI0Niw2ICsyNDYsOCBAQAogICAgIDwvbGlzdGl0ZW0+CiAgIDwvdmFybGlzdGVudHJ5PgogPC92YXJpYWJsZWxpc3Q+Ci0KKzxzZWN0aW9uIGlkPSJsaXJjX2Rldl9lcnJvcnMiPgorICAmcmV0dXJuLXZhbHVlOworPC9zZWN0aW9uPgogPC9zZWN0aW9uPgogPC9zZWN0aW9uPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9tZWRpYS1jb250cm9sbGVyLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvbWVkaWEtY29udHJvbGxlci54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvbWVkaWEtY29udHJvbGxlci54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvbWVkaWEtY29udHJvbGxlci54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvbWVkaWEtZnVuYy1jbG9zZS54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL21lZGlhLWZ1bmMtY2xvc2UueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL21lZGlhLWZ1bmMtY2xvc2UueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL21lZGlhLWZ1bmMtY2xvc2UueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL21lZGlhLWZ1bmMtaW9jdGwueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9tZWRpYS1mdW5jLWlvY3RsLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTQ3OGQwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9tZWRpYS1mdW5jLWlvY3RsLnhtbApAQCAtMCwwICsxLDczIEBACis8cmVmZW50cnkgaWQ9Im1lZGlhLWZ1bmMtaW9jdGwiPgorICA8cmVmbWV0YT4KKyAgICA8cmVmZW50cnl0aXRsZT5tZWRpYSBpb2N0bCgpPC9yZWZlbnRyeXRpdGxlPgorICAgICZtYW52b2w7CisgIDwvcmVmbWV0YT4KKworICA8cmVmbmFtZWRpdj4KKyAgICA8cmVmbmFtZT5tZWRpYS1pb2N0bDwvcmVmbmFtZT4KKyAgICA8cmVmcHVycG9zZT5Db250cm9sIGEgbWVkaWEgZGV2aWNlPC9yZWZwdXJwb3NlPgorICA8L3JlZm5hbWVkaXY+CisKKyAgPHJlZnN5bm9wc2lzZGl2PgorICAgIDxmdW5jc3lub3BzaXM+CisgICAgICA8ZnVuY3N5bm9wc2lzaW5mbz4jaW5jbHVkZSAmbHQ7c3lzL2lvY3RsLmgmZ3Q7PC9mdW5jc3lub3BzaXNpbmZvPgorICAgICAgPGZ1bmNwcm90b3R5cGU+CisJPGZ1bmNkZWY+aW50IDxmdW5jdGlvbj5pb2N0bDwvZnVuY3Rpb24+PC9mdW5jZGVmPgorCTxwYXJhbWRlZj5pbnQgPHBhcmFtZXRlcj5mZDwvcGFyYW1ldGVyPjwvcGFyYW1kZWY+CisJPHBhcmFtZGVmPmludCA8cGFyYW1ldGVyPnJlcXVlc3Q8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgorCTxwYXJhbWRlZj52b2lkICo8cGFyYW1ldGVyPmFyZ3A8L3BhcmFtZXRlcj48L3BhcmFtZGVmPgorICAgICAgPC9mdW5jcHJvdG90eXBlPgorICAgIDwvZnVuY3N5bm9wc2lzPgorICA8L3JlZnN5bm9wc2lzZGl2PgorCisgIDxyZWZzZWN0MT4KKyAgICA8dGl0bGU+QXJndW1lbnRzPC90aXRsZT4KKworICAgIDx2YXJpYWJsZWxpc3Q+CisgICAgICA8dmFybGlzdGVudHJ5PgorCTx0ZXJtPjxwYXJhbWV0ZXI+ZmQ8L3BhcmFtZXRlcj48L3Rlcm0+CisJPGxpc3RpdGVtPgorCSAgPHBhcmE+JmZkOzwvcGFyYT4KKwk8L2xpc3RpdGVtPgorICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICA8dmFybGlzdGVudHJ5PgorCTx0ZXJtPjxwYXJhbWV0ZXI+cmVxdWVzdDwvcGFyYW1ldGVyPjwvdGVybT4KKwk8bGlzdGl0ZW0+CisJICA8cGFyYT5NZWRpYSBpb2N0bCByZXF1ZXN0IGNvZGUgYXMgZGVmaW5lZCBpbiB0aGUgbWVkaWEuaCBoZWFkZXIgZmlsZSwKKwkgIGZvciBleGFtcGxlIE1FRElBX0lPQ19TRVRVUF9MSU5LLjwvcGFyYT4KKwk8L2xpc3RpdGVtPgorICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICA8dmFybGlzdGVudHJ5PgorCTx0ZXJtPjxwYXJhbWV0ZXI+YXJncDwvcGFyYW1ldGVyPjwvdGVybT4KKwk8bGlzdGl0ZW0+CisJICA8cGFyYT5Qb2ludGVyIHRvIGEgcmVxdWVzdC1zcGVjaWZpYyBzdHJ1Y3R1cmUuPC9wYXJhPgorCTwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICA8L3ZhcmlhYmxlbGlzdD4KKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDE+CisgICAgPHRpdGxlPkRlc2NyaXB0aW9uPC90aXRsZT4KKyAgICA8cGFyYT5UaGUgPGZ1bmN0aW9uPmlvY3RsKCk8L2Z1bmN0aW9uPiBmdW5jdGlvbiBtYW5pcHVsYXRlcyBtZWRpYSBkZXZpY2UKKyAgICBwYXJhbWV0ZXJzLiBUaGUgYXJndW1lbnQgPHBhcmFtZXRlcj5mZDwvcGFyYW1ldGVyPiBtdXN0IGJlIGFuIG9wZW4gZmlsZQorICAgIGRlc2NyaXB0b3IuPC9wYXJhPgorICAgIDxwYXJhPlRoZSBpb2N0bCA8cGFyYW1ldGVyPnJlcXVlc3Q8L3BhcmFtZXRlcj4gY29kZSBzcGVjaWZpZXMgdGhlIG1lZGlhCisgICAgZnVuY3Rpb24gdG8gYmUgY2FsbGVkLiBJdCBoYXMgZW5jb2RlZCBpbiBpdCB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhbgorICAgIGlucHV0LCBvdXRwdXQgb3IgcmVhZC93cml0ZSBwYXJhbWV0ZXIsIGFuZCB0aGUgc2l6ZSBvZiB0aGUgYXJndW1lbnQKKyAgICA8cGFyYW1ldGVyPmFyZ3A8L3BhcmFtZXRlcj4gaW4gYnl0ZXMuPC9wYXJhPgorICAgIDxwYXJhPk1hY3JvcyBhbmQgc3RydWN0dXJlcyBkZWZpbml0aW9ucyBzcGVjaWZ5aW5nIG1lZGlhIGlvY3RsIHJlcXVlc3RzIGFuZAorICAgIHRoZWlyIHBhcmFtZXRlcnMgYXJlIGxvY2F0ZWQgaW4gdGhlIG1lZGlhLmggaGVhZGVyIGZpbGUuIEFsbCBtZWRpYSBpb2N0bAorICAgIHJlcXVlc3RzLCB0aGVpciByZXNwZWN0aXZlIGZ1bmN0aW9uIGFuZCBwYXJhbWV0ZXJzIGFyZSBzcGVjaWZpZWQgaW4KKyAgICA8eHJlZiBsaW5rZW5kPSJtZWRpYS11c2VyLWZ1bmMiIC8+LjwvcGFyYT4KKyAgPC9yZWZzZWN0MT4KKworICA8cmVmc2VjdDE+CisgICAgJnJldHVybi12YWx1ZTsKKworICAgIDxwYXJhPlJlcXVlc3Qtc3BlY2lmaWMgZXJyb3IgY29kZXMgYXJlIGxpc3RlZCBpbiB0aGUKKyAgICBpbmRpdmlkdWFsIHJlcXVlc3RzIGRlc2NyaXB0aW9ucy48L3BhcmE+CisgICAgPHBhcmE+V2hlbiBhbiBpb2N0bCB0aGF0IHRha2VzIGFuIG91dHB1dCBvciByZWFkL3dyaXRlIHBhcmFtZXRlciBmYWlscywKKyAgICB0aGUgcGFyYW1ldGVyIHJlbWFpbnMgdW5tb2RpZmllZC48L3BhcmE+CisgIDwvcmVmc2VjdDE+Cis8L3JlZmVudHJ5PgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9tZWRpYS1mdW5jLW9wZW4ueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9tZWRpYS1mdW5jLW9wZW4ueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL21lZGlhLWZ1bmMtb3Blbi54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvbWVkaWEtZnVuYy1vcGVuLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9tZWRpYS1pb2MtZGV2aWNlLWluZm8ueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9tZWRpYS1pb2MtZGV2aWNlLWluZm8ueG1sCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvbWVkaWEtaW9jLWRldmljZS1pbmZvLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9tZWRpYS1pb2MtZGV2aWNlLWluZm8ueG1sCmluZGV4IDFmMzIzNzMuLjJjZTUyMTQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvbWVkaWEtaW9jLWRldmljZS1pbmZvLnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL21lZGlhLWlvYy1kZXZpY2UtaW5mby54bWwKQEAgLTEyNyw3ICsxMjcsNiBAQAogICA8L3JlZnNlY3QxPgogCiAgIDxyZWZzZWN0MT4KLSAgICA8dGl0bGU+UmV0dXJuIHZhbHVlPC90aXRsZT4KLSAgICA8cGFyYT5UaGlzIGZ1bmN0aW9uIGRvZXNuJ3QgcmV0dXJuIHNwZWNpZmljIGVycm9yIGNvZGVzLjwvcGFyYT4KKyAgICAmcmV0dXJuLXZhbHVlOwogICA8L3JlZnNlY3QxPgogPC9yZWZlbnRyeT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvbWVkaWEtaW9jLWVudW0tZW50aXRpZXMueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9tZWRpYS1pb2MtZW51bS1lbnRpdGllcy54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvbWVkaWEtaW9jLWVudW0tZW50aXRpZXMueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL21lZGlhLWlvYy1lbnVtLWVudGl0aWVzLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9tZWRpYS1pb2MtZW51bS1saW5rcy54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL21lZGlhLWlvYy1lbnVtLWxpbmtzLnhtbApzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL21lZGlhLWlvYy1lbnVtLWxpbmtzLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9tZWRpYS1pb2MtZW51bS1saW5rcy54bWwKaW5kZXggZDJmYzczZS4uMzU1ZGY0MyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9tZWRpYS1pb2MtZW51bS1saW5rcy54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9tZWRpYS1pb2MtZW51bS1saW5rcy54bWwKQEAgLTEzOSw3ICsxMzksNyBAQAogICAgIDwvdGFibGU+CiAKICAgICA8dGFibGUgcGd3aWRlPSIxIiBmcmFtZT0ibm9uZSIgaWQ9Im1lZGlhLWxpbmstZGVzYyI+Ci0gICAgICA8dGl0bGU+c3RydWN0IDxzdHJ1Y3RuYW1lPm1lZGlhX2xpbmtzX2Rlc2M8L3N0cnVjdG5hbWU+PC90aXRsZT4KKyAgICAgIDx0aXRsZT5zdHJ1Y3QgPHN0cnVjdG5hbWU+bWVkaWFfbGlua19kZXNjPC9zdHJ1Y3RuYW1lPjwvdGl0bGU+CiAgICAgICA8dGdyb3VwIGNvbHM9IjMiPgogICAgICAgICAmY3Mtc3RyOwogCTx0Ym9keSB2YWxpZ249InRvcCI+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL21lZGlhLWlvYy1zZXR1cC1saW5rLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvbWVkaWEtaW9jLXNldHVwLWxpbmsueG1sCnNpbWlsYXJpdHkgaW5kZXggODclCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvbWVkaWEtaW9jLXNldHVwLWxpbmsueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL21lZGlhLWlvYy1zZXR1cC1saW5rLnhtbAppbmRleCBjZWM5N2FmLi5mYzJlNTIyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL21lZGlhLWlvYy1zZXR1cC1saW5rLnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL21lZGlhLWlvYy1zZXR1cC1saW5rLnhtbApAQCAtNzIsMTUgKzcyLDYgQEAKIAogICAgIDx2YXJpYWJsZWxpc3Q+CiAgICAgICA8dmFybGlzdGVudHJ5PgotCTx0ZXJtPjxlcnJvcmNvZGU+RUJVU1k8L2Vycm9yY29kZT48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+VGhlIGxpbmsgcHJvcGVydGllcyBjYW4ndCBiZSBjaGFuZ2VkIGJlY2F1c2UgdGhlIGxpbmsgaXMKLQkgIGN1cnJlbnRseSBidXN5LiBUaGlzIGNhbiBiZSBjYXVzZWQsIGZvciBpbnN0YW5jZSwgYnkgYW4gYWN0aXZlIG1lZGlhCi0JICBzdHJlYW0gKGF1ZGlvIG9yIHZpZGVvKSBvbiB0aGUgbGluay4gVGhlIGlvY3RsIHNob3VsZG4ndCBiZSByZXRyaWVkIGlmCi0JICBubyBvdGhlciBhY3Rpb24gaXMgcGVyZm9ybWVkIGJlZm9yZSB0byBmaXggdGhlIHByb2JsZW0uPC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICAgIDx2YXJsaXN0ZW50cnk+CiAJPHRlcm0+PGVycm9yY29kZT5FSU5WQUw8L2Vycm9yY29kZT48L3Rlcm0+CiAJPGxpc3RpdGVtPgogCSAgPHBhcmE+VGhlICZtZWRpYS1saW5rLWRlc2M7IHJlZmVyZW5jZXMgYSBub24tZXhpc3RpbmcgbGluaywgb3IgdGhlCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpcGVsaW5lLnBkZiBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGlwZWxpbmUucGRmCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpcGVsaW5lLnBkZgpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXBlbGluZS5wZGYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXhmbXQtZ3JleS54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC1ncmV5LnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXhmbXQtZ3JleS54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LWdyZXkueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC1tNDIwLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LW00MjAueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC1tNDIwLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQtbTQyMC54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LW52MTIueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQtbnYxMi54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LW52MTIueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC1udjEyLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXhmbXQtbnYxMm0ueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQtbnYxMm0ueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC1udjEybS54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LW52MTJtLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXhmbXQtbnYxMm10LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LW52MTJtdC54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LW52MTJtdC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LW52MTJtdC54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LW52MTYueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQtbnYxNi54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LW52MTYueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC1udjE2LnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXhmbXQtcGFja2VkLXJnYi54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC1wYWNrZWQtcmdiLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXhmbXQtcGFja2VkLXJnYi54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXBhY2tlZC1yZ2IueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC1wYWNrZWQteXV2LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXBhY2tlZC15dXYueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC1wYWNrZWQteXV2LnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQtcGFja2VkLXl1di54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXNiZ2dyMTYueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQtc2JnZ3IxNi54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXNiZ2dyMTYueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC1zYmdncjE2LnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXhmbXQtc2JnZ3I4LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXNiZ2dyOC54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXNiZ2dyOC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXNiZ2dyOC54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXNnYnJnOC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC1zZ2JyZzgueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC1zZ2JyZzgueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC1zZ2JyZzgueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC1zZ3JiZzgueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQtc2dyYmc4LnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXhmbXQtc2dyYmc4LnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQtc2dyYmc4LnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXhmbXQtc3JnZ2IxMC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC1zcmdnYjEwLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXhmbXQtc3JnZ2IxMC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXNyZ2diMTAueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC1zcmdnYjEyLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXNyZ2diMTIueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC1zcmdnYjEyLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQtc3JnZ2IxMi54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXNyZ2diOC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC1zcmdnYjgueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC1zcmdnYjgueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC1zcmdnYjgueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC11eXZ5LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXV5dnkueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC11eXZ5LnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQtdXl2eS54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXZ5dXkueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQtdnl1eS54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXZ5dXkueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC12eXV5LnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXhmbXQteTEwLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXkxMC54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXkxMC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXkxMC54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXkxMGIueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQteTEwYi54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXkxMGIueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC15MTBiLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXhmbXQteTEyLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXkxMi54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXkxMi54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXkxMi54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXkxNi54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC15MTYueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC15MTYueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC15MTYueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC15NDFwLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXk0MXAueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC15NDFwLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQteTQxcC54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXl1djQxMC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC15dXY0MTAueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC15dXY0MTAueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC15dXY0MTAueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC15dXY0MTFwLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXl1djQxMXAueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC15dXY0MTFwLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQteXV2NDExcC54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXl1djQyMC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC15dXY0MjAueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC15dXY0MjAueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC15dXY0MjAueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC15dXY0MjBtLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXl1djQyMG0ueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC15dXY0MjBtLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQteXV2NDIwbS54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXl1djQyMnAueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQteXV2NDIycC54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LXl1djQyMnAueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC15dXY0MjJwLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXhmbXQteXV5di54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BpeGZtdC15dXl2LnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXhmbXQteXV5di54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXl1eXYueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC15dnl1LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LXl2eXUueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC15dnl1LnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQteXZ5dS54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGl4Zm10LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LnhtbApzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcGl4Zm10LnhtbAppbmRleCBkZWI2NjAyLi4yZmY2Yjc3IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3BpeGZtdC54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9waXhmbXQueG1sCkBAIC0xMjEsNyArMTIxLDcgQEAKICAgICBhbiBhcnJheSBvZiA8c3RydWN0bmFtZT52NGwyX3BsYW5lX3BpeF9mb3JtYXQ8L3N0cnVjdG5hbWU+IHN0cnVjdHVyZXMsCiAgICAgZGVzY3JpYmluZyBhbGwgcGxhbmVzIG9mIHRoYXQgZm9ybWF0LjwvcGFyYT4KICAgPHRhYmxlIHBnd2lkZT0iMSIgZnJhbWU9Im5vbmUiIGlkPSJ2NGwyLXBsYW5lLXBpeC1mb3JtYXQiPgotICAgIDx0aXRsZT5zdHJ1Y3QgPHN0cnVjdG5hbWU+dmw0Ml9wbGFuZV9waXhfZm9ybWF0PC9zdHJ1Y3RuYW1lPjwvdGl0bGU+CisgICAgPHRpdGxlPnN0cnVjdCA8c3RydWN0bmFtZT52NGwyX3BsYW5lX3BpeF9mb3JtYXQ8L3N0cnVjdG5hbWU+PC90aXRsZT4KICAgICA8dGdyb3VwIGNvbHM9IjMiPgogICAgICAgJmNzLXN0cjsKICAgICAgIDx0Ym9keSB2YWxpZ249InRvcCI+CkBAIC03NDEsMTAgKzc0MSw1NSBAQAogCSAgPHJvdyBpZD0iVjRMMi1QSVgtRk1ULU1QRUciPgogCSAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfUElYX0ZNVF9NUEVHPC9jb25zdGFudD48L2VudHJ5PgogCSAgICA8ZW50cnk+J01QRUcnPC9lbnRyeT4KLQkgICAgPGVudHJ5Pk1QRUcgc3RyZWFtLiBUaGUgYWN0dWFsIGZvcm1hdCBpcyBkZXRlcm1pbmVkIGJ5CisJICAgIDxlbnRyeT5NUEVHIG11bHRpcGxleGVkIHN0cmVhbS4gVGhlIGFjdHVhbCBmb3JtYXQgaXMgZGV0ZXJtaW5lZCBieQogZXh0ZW5kZWQgY29udHJvbCA8Y29uc3RhbnQ+VjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRTwvY29uc3RhbnQ+LCBzZWUKIDx4cmVmIGxpbmtlbmQ9Im1wZWctY29udHJvbC1pZCIgLz4uPC9lbnRyeT4KIAkgIDwvcm93PgorCSAgPHJvdyBpZD0iVjRMMi1QSVgtRk1ULUgyNjQiPgorCQk8ZW50cnk+PGNvbnN0YW50PlY0TDJfUElYX0ZNVF9IMjY0PC9jb25zdGFudD48L2VudHJ5PgorCQk8ZW50cnk+J0gyNjQnPC9lbnRyeT4KKwkJPGVudHJ5PkgyNjQgdmlkZW8gZWxlbWVudGFyeSBzdHJlYW0gd2l0aCBzdGFydCBjb2Rlcy48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93IGlkPSJWNEwyLVBJWC1GTVQtSDI2NC1OTy1TQyI+CisJCTxlbnRyeT48Y29uc3RhbnQ+VjRMMl9QSVhfRk1UX0gyNjRfTk9fU0M8L2NvbnN0YW50PjwvZW50cnk+CisJCTxlbnRyeT4nQVZDMSc8L2VudHJ5PgorCQk8ZW50cnk+SDI2NCB2aWRlbyBlbGVtZW50YXJ5IHN0cmVhbSB3aXRob3V0IHN0YXJ0IGNvZGVzLjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3cgaWQ9IlY0TDItUElYLUZNVC1IMjYzIj4KKwkJPGVudHJ5Pjxjb25zdGFudD5WNEwyX1BJWF9GTVRfSDI2MzwvY29uc3RhbnQ+PC9lbnRyeT4KKwkJPGVudHJ5PidIMjYzJzwvZW50cnk+CisJCTxlbnRyeT5IMjYzIHZpZGVvIGVsZW1lbnRhcnkgc3RyZWFtLjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3cgaWQ9IlY0TDItUElYLUZNVC1NUEVHMSI+CisJCTxlbnRyeT48Y29uc3RhbnQ+VjRMMl9QSVhfRk1UX01QRUcxPC9jb25zdGFudD48L2VudHJ5PgorCQk8ZW50cnk+J01QRzEnPC9lbnRyeT4KKwkJPGVudHJ5Pk1QRUcxIHZpZGVvIGVsZW1lbnRhcnkgc3RyZWFtLjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3cgaWQ9IlY0TDItUElYLUZNVC1NUEVHMiI+CisJCTxlbnRyeT48Y29uc3RhbnQ+VjRMMl9QSVhfRk1UX01QRUcyPC9jb25zdGFudD48L2VudHJ5PgorCQk8ZW50cnk+J01QRzInPC9lbnRyeT4KKwkJPGVudHJ5Pk1QRUcyIHZpZGVvIGVsZW1lbnRhcnkgc3RyZWFtLjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3cgaWQ9IlY0TDItUElYLUZNVC1NUEVHNCI+CisJCTxlbnRyeT48Y29uc3RhbnQ+VjRMMl9QSVhfRk1UX01QRUc0PC9jb25zdGFudD48L2VudHJ5PgorCQk8ZW50cnk+J01QRzQnPC9lbnRyeT4KKwkJPGVudHJ5Pk1QRUc0IHZpZGVvIGVsZW1lbnRhcnkgc3RyZWFtLjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3cgaWQ9IlY0TDItUElYLUZNVC1YVklEIj4KKwkJPGVudHJ5Pjxjb25zdGFudD5WNEwyX1BJWF9GTVRfWFZJRDwvY29uc3RhbnQ+PC9lbnRyeT4KKwkJPGVudHJ5PidYVklEJzwvZW50cnk+CisJCTxlbnRyeT5YdmlkIHZpZGVvIGVsZW1lbnRhcnkgc3RyZWFtLjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3cgaWQ9IlY0TDItUElYLUZNVC1WQzEtQU5ORVgtRyI+CisJCTxlbnRyeT48Y29uc3RhbnQ+VjRMMl9QSVhfRk1UX1ZDMV9BTk5FWF9HPC9jb25zdGFudD48L2VudHJ5PgorCQk8ZW50cnk+J1ZDMUcnPC9lbnRyeT4KKwkJPGVudHJ5PlZDMSwgU01QVEUgNDIxTSBBbm5leCBHIGNvbXBsaWFudCBzdHJlYW0uPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdyBpZD0iVjRMMi1QSVgtRk1ULVZDMS1BTk5FWC1MIj4KKwkJPGVudHJ5Pjxjb25zdGFudD5WNEwyX1BJWF9GTVRfVkMxX0FOTkVYX0w8L2NvbnN0YW50PjwvZW50cnk+CisJCTxlbnRyeT4nVkMxTCc8L2VudHJ5PgorCQk8ZW50cnk+VkMxLCBTTVBURSA0MjFNIEFubmV4IEwgY29tcGxpYW50IHN0cmVhbS48L2VudHJ5PgorCSAgPC9yb3c+CiAJPC90Ym9keT4KICAgICAgIDwvdGdyb3VwPgogICAgIDwvdGFibGU+CkBAIC04MDQsNiArODQ5LDEyIEBACiAJICAgIDxlbnRyeT4nQ1BJQSc8L2VudHJ5PgogCSAgICA8ZW50cnk+WVVWIGZvcm1hdCB1c2VkIGJ5IHRoZSBnc3BjYSBjcGlhMSBkcml2ZXIuPC9lbnRyeT4KIAkgIDwvcm93PgorCSAgPHJvdyBpZD0iVjRMMi1QSVgtRk1ULUpQR0wiPgorCSAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfUElYX0ZNVF9KUEdMPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+J0pQR0wnPC9lbnRyeT4KKwkgICAgPGVudHJ5PkpQRUctTGlnaHQgZm9ybWF0IChQZWdhc3VzIExvc3NsZXNzIEpQRUcpCisJCQl1c2VkIGluIERpdmlvIHdlYmNhbXMgTlcgODB4LjwvZW50cnk+CisJICA8L3Jvdz4KIAkgIDxyb3cgaWQ9IlY0TDItUElYLUZNVC1TUENBNTAxIj4KIAkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX1BJWF9GTVRfU1BDQTUwMTwvY29uc3RhbnQ+PC9lbnRyeT4KIAkgICAgPGVudHJ5PidTNTAxJzwvZW50cnk+CkBAIC04NTQsNiArOTA1LDExIEBACiAJICAgIDxlbnRyeT4nUEpQRyc8L2VudHJ5PgogCSAgICA8ZW50cnk+UGl4YXJ0IDczeHggSlBFRyBmb3JtYXQgdXNlZCBieSB0aGUgZ3NwY2EgZHJpdmVyLjwvZW50cnk+CiAJICA8L3Jvdz4KKwkgIDxyb3cgaWQ9IlY0TDItUElYLUZNVC1TRTQwMSI+CisJICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9QSVhfRk1UX1NFNDAxPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+J1M0MDEnPC9lbnRyeT4KKwkgICAgPGVudHJ5PkNvbXByZXNzZWQgUkdCIGZvcm1hdCB1c2VkIGJ5IHRoZSBnc3BjYSBzZTQwMSBkcml2ZXI8L2VudHJ5PgorCSAgPC9yb3c+CiAJICA8cm93IGlkPSJWNEwyLVBJWC1GTVQtU1E5MDVDIj4KIAkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX1BJWF9GTVRfU1E5MDVDPC9jb25zdGFudD48L2VudHJ5PgogCSAgICA8ZW50cnk+JzkwNUMnPC9lbnRyeT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGxhbmFyLWFwaXMueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9wbGFuYXItYXBpcy54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGxhbmFyLWFwaXMueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3BsYW5hci1hcGlzLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9yZW1vdGVfY29udHJvbGxlcnMueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9yZW1vdGVfY29udHJvbGxlcnMueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3JlbW90ZV9jb250cm9sbGVycy54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvcmVtb3RlX2NvbnRyb2xsZXJzLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9zdWJkZXYtZm9ybWF0cy54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3N1YmRldi1mb3JtYXRzLnhtbApzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3N1YmRldi1mb3JtYXRzLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9zdWJkZXYtZm9ybWF0cy54bWwKaW5kZXggOGQzNDA5ZC4uNDljNTMyZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9zdWJkZXYtZm9ybWF0cy54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC9zdWJkZXYtZm9ybWF0cy54bWwKQEAgLTM4MCw5ICszODAsNiBAQAogCTx0aXRsZT5CYXllciBQYXR0ZXJuczwvdGl0bGU+CiAJPG1lZGlhb2JqZWN0PgogCSAgPGltYWdlb2JqZWN0PgotCSAgICA8aW1hZ2VkYXRhIGZpbGVyZWY9ImJheWVyLnBkZiIgZm9ybWF0PSJQUyIgLz4KLQkgIDwvaW1hZ2VvYmplY3Q+Ci0JICA8aW1hZ2VvYmplY3Q+CiAJICAgIDxpbWFnZWRhdGEgZmlsZXJlZj0iYmF5ZXIucG5nIiBmb3JtYXQ9IlBORyIgLz4KIAkgIDwvaW1hZ2VvYmplY3Q+CiAJICA8dGV4dG9iamVjdD4KQEAgLTI1MjgsNyArMjUyNSw3IEBACiAKICAgICAgIDxwYXJhPlRob3NlIGRhdGEgZm9ybWF0cyBjb25zaXN0IG9mIGFuIG9yZGVyZWQgc2VxdWVuY2Ugb2YgOC1iaXQgYnl0ZXMKIAlvYnRhaW5lZCBmcm9tIEpQRUcgY29tcHJlc3Npb24gcHJvY2Vzcy4gQWRkaXRpb25hbGx5IHRvIHRoZQotCTxjb25zdGFudD5fSlBFRzwvY29uc3RhbnQ+IHByZWZpeCB0aGUgZm9ybWF0IGNvZGUgaXMgbWFkZSBvZgorCTxjb25zdGFudD5fSlBFRzwvY29uc3RhbnQ+IHBvc3RmaXggdGhlIGZvcm1hdCBjb2RlIGlzIG1hZGUgb2YKIAl0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uLgogCTxpdGVtaXplZGxpc3Q+CiAJICA8bGlzdGl0ZW0+PHBhcmE+VGhlIG51bWJlciBvZiBidXMgc2FtcGxlcyBwZXIgZW50cm9weSBlbmNvZGVkIGJ5dGUuPC9wYXJhPjwvbGlzdGl0ZW0+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3Y0bDIueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92NGwyLnhtbApzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3Y0bDIueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3Y0bDIueG1sCmluZGV4IGE3ZmQ3NmQuLjBkMDVlODcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdjRsMi54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92NGwyLnhtbApAQCAtODcsNyArODcsNyBAQAogICAgICAgPC9hdXRob3I+CiAKICAgICAgIDxhdXRob3I+Ci0gICAgICAJPGZpcnN0bmFtZT5QYXdlbDwvZmlyc3RuYW1lPgorCTxmaXJzdG5hbWU+UGF3ZWw8L2ZpcnN0bmFtZT4KIAk8c3VybmFtZT5Pc2NpYWs8L3N1cm5hbWU+CiAJPGNvbnRyaWI+RGVzaWduZWQgYW5kIGRvY3VtZW50ZWQgdGhlIG11bHRpLXBsYW5hciBBUEkuPC9jb250cmliPgogCTxhZmZpbGlhdGlvbj4KQEAgLTEyOCw2ICsxMjgsMTUgQEAKIGFwcGxpY2F0aW9ucy4gLS0+CiAKICAgICAgIDxyZXZpc2lvbj4KKwk8cmV2bnVtYmVyPjMuMTwvcmV2bnVtYmVyPgorCTxkYXRlPjIwMTEtMDYtMjc8L2RhdGU+CisJPGF1dGhvcmluaXRpYWxzPm1jYywgcG8sIGh2PC9hdXRob3Jpbml0aWFscz4KKwk8cmV2cmVtYXJrPkRvY3VtZW50ZWQgdGhhdCBWSURJT0NfUVVFUllDQVAgbm93IHJldHVybnMgYSBwZXItc3Vic3lzdGVtIHZlcnNpb24gaW5zdGVhZCBvZiBhIHBlci1kcml2ZXIgb25lLgorCQkgICBTdGFuZGFyZGl6ZSBhbiBlcnJvciBjb2RlIGZvciBpbnZhbGlkIGlvY3RsLgorCQkgICBBZGRlZCBWNEwyX0NUUkxfVFlQRV9CSVRNQVNLLjwvcmV2cmVtYXJrPgorICAgICAgPC9yZXZpc2lvbj4KKworICAgICAgPHJldmlzaW9uPgogCTxyZXZudW1iZXI+Mi42LjM5PC9yZXZudW1iZXI+CiAJPGRhdGU+MjAxMS0wMy0wMTwvZGF0ZT4KIAk8YXV0aG9yaW5pdGlhbHM+bWNjLCBwbzwvYXV0aG9yaW5pdGlhbHM+CkBAIC00MDEsNyArNDEwLDcgQEAKIDwvcGFydGluZm8+CiAKIDx0aXRsZT5WaWRlbyBmb3IgTGludXggVHdvIEFQSSBTcGVjaWZpY2F0aW9uPC90aXRsZT4KLSA8c3VidGl0bGU+UmV2aXNpb24gMi42LjM5PC9zdWJ0aXRsZT4KKyA8c3VidGl0bGU+UmV2aXNpb24gMy4xPC9zdWJ0aXRsZT4KIAogICA8Y2hhcHRlciBpZD0iY29tbW9uIj4KICAgICAmc3ViLWNvbW1vbjsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdjRsMmdyYWIuYy54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3Y0bDJncmFiLmMueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3Y0bDJncmFiLmMueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3Y0bDJncmFiLmMueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZiaV81MjUucGRmIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92YmlfNTI1LnBkZgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92YmlfNTI1LnBkZgpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92YmlfNTI1LnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZiaV82MjUucGRmIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92YmlfNjI1LnBkZgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92YmlfNjI1LnBkZgpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92YmlfNjI1LnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZiaV9oc3luYy5wZGYgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZiaV9oc3luYy5wZGYKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmJpX2hzeW5jLnBkZgpyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92YmlfaHN5bmMucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWNyb3BjYXAueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtY3JvcGNhcC54bWwKc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtY3JvcGNhcC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWNyb3BjYXAueG1sCmluZGV4IDgxNmU5MGUuLmI0ZjJmMjUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWNyb3BjYXAueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWNyb3BjYXAueG1sCkBAIC0xNTYsMTkgKzE1NiwxMCBAQAogCTx0ZXJtPjxlcnJvcmNvZGU+RUlOVkFMPC9lcnJvcmNvZGU+PC90ZXJtPgogCTxsaXN0aXRlbT4KIAkgIDxwYXJhPlRoZSAmdjRsMi1jcm9wY2FwOyA8c3RydWN0ZmllbGQ+dHlwZTwvc3RydWN0ZmllbGQ+IGlzCi1pbnZhbGlkIG9yIHRoZSBpb2N0bCBpcyBub3Qgc3VwcG9ydGVkLiBUaGlzIGlzIG5vdCBwZXJtaXR0ZWQgZm9yCi12aWRlbyBjYXB0dXJlLCBvdXRwdXQgYW5kIG92ZXJsYXkgZGV2aWNlcywgd2hpY2ggbXVzdCBzdXBwb3J0Ci08Y29uc3RhbnQ+VklESU9DX0NST1BDQVA8L2NvbnN0YW50Pi48L3BhcmE+CitpbnZhbGlkLiBUaGlzIGlzIG5vdCBwZXJtaXR0ZWQgZm9yIHZpZGVvIGNhcHR1cmUsIG91dHB1dCBhbmQgb3ZlcmxheSBkZXZpY2VzLAord2hpY2ggbXVzdCBzdXBwb3J0IDxjb25zdGFudD5WSURJT0NfQ1JPUENBUDwvY29uc3RhbnQ+LjwvcGFyYT4KIAk8L2xpc3RpdGVtPgogICAgICAgPC92YXJsaXN0ZW50cnk+CiAgICAgPC92YXJpYWJsZWxpc3Q+CiAgIDwvcmVmc2VjdDE+CiA8L3JlZmVudHJ5PgotCi08IS0tCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBzZ21sCi1zZ21sLXBhcmVudC1kb2N1bWVudDogInY0bDIuc2dtbCIKLWluZGVudC10YWJzLW1vZGU6IG5pbAotRW5kOgotLS0+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1kYmctZy1jaGlwLWlkZW50LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWRiZy1nLWNoaXAtaWRlbnQueG1sCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWRiZy1nLWNoaXAtaWRlbnQueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1kYmctZy1jaGlwLWlkZW50LnhtbAppbmRleCA0YTA5ZTIwLi40ZWNkOTY2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1kYmctZy1jaGlwLWlkZW50LnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1kYmctZy1jaGlwLWlkZW50LnhtbApAQCAtMjU4LDE4ICsyNTgsOSBAQAogICAgICAgPHZhcmxpc3RlbnRyeT4KIAk8dGVybT48ZXJyb3Jjb2RlPkVJTlZBTDwvZXJyb3Jjb2RlPjwvdGVybT4KIAk8bGlzdGl0ZW0+Ci0JICA8cGFyYT5UaGUgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBpb2N0bCwgb3IgdGhlCi08c3RydWN0ZmllbGQ+bWF0Y2hfdHlwZTwvc3RydWN0ZmllbGQ+IGlzIGludmFsaWQuPC9wYXJhPgorCSAgPHBhcmE+VGhlIDxzdHJ1Y3RmaWVsZD5tYXRjaF90eXBlPC9zdHJ1Y3RmaWVsZD4gaXMgaW52YWxpZC48L3BhcmE+CiAJPC9saXN0aXRlbT4KICAgICAgIDwvdmFybGlzdGVudHJ5PgogICAgICA8L3ZhcmlhYmxlbGlzdD4KICAgPC9yZWZzZWN0MT4KIDwvcmVmZW50cnk+Ci0KLTwhLS0KLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IHNnbWwKLXNnbWwtcGFyZW50LWRvY3VtZW50OiAidjRsMi5zZ21sIgotaW5kZW50LXRhYnMtbW9kZTogbmlsCi1FbmQ6Ci0tLT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWRiZy1nLXJlZ2lzdGVyLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWRiZy1nLXJlZ2lzdGVyLnhtbApzaW1pbGFyaXR5IGluZGV4IDk0JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1kYmctZy1yZWdpc3Rlci54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWRiZy1nLXJlZ2lzdGVyLnhtbAppbmRleCA5ODBjN2YzLi5hNDRhZWJjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1kYmctZy1yZWdpc3Rlci54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZGJnLWctcmVnaXN0ZXIueG1sCkBAIC0yNDcsMTUgKzI0Nyw2IEBACiAKICAgICA8dmFyaWFibGVsaXN0PgogICAgICAgPHZhcmxpc3RlbnRyeT4KLQk8dGVybT48ZXJyb3Jjb2RlPkVJTlZBTDwvZXJyb3Jjb2RlPjwvdGVybT4KLQk8bGlzdGl0ZW0+Ci0JICA8cGFyYT5UaGUgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBpb2N0bCwgb3IgdGhlIGtlcm5lbAotd2FzIG5vdCBjb21waWxlZCB3aXRoIHRoZSA8Y29uc3RhbnQ+Q09ORklHX1ZJREVPX0FEVl9ERUJVRzwvY29uc3RhbnQ+Ci1vcHRpb24sIG9yIHRoZSA8c3RydWN0ZmllbGQ+bWF0Y2hfdHlwZTwvc3RydWN0ZmllbGQ+IGlzIGludmFsaWQsIG9yIHRoZQotc2VsZWN0ZWQgY2hpcCBvciByZWdpc3RlciBkb2VzIG5vdCBleGlzdC48L3BhcmE+Ci0JPC9saXN0aXRlbT4KLSAgICAgIDwvdmFybGlzdGVudHJ5PgotICAgICAgPHZhcmxpc3RlbnRyeT4KIAk8dGVybT48ZXJyb3Jjb2RlPkVQRVJNPC9lcnJvcmNvZGU+PC90ZXJtPgogCTxsaXN0aXRlbT4KIAkgIDxwYXJhPkluc3VmZmljaWVudCBwZXJtaXNzaW9ucy4gUm9vdCBwcml2aWxlZ2VzIGFyZSByZXF1aXJlZApAQCAtMjY1LDExICsyNTYsMyBAQAogICAgIDwvdmFyaWFibGVsaXN0PgogICA8L3JlZnNlY3QxPgogPC9yZWZlbnRyeT4KLQotPCEtLQotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogc2dtbAotc2dtbC1wYXJlbnQtZG9jdW1lbnQ6ICJ2NGwyLnNnbWwiCi1pbmRlbnQtdGFicy1tb2RlOiBuaWwKLUVuZDoKLS0tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZHFldmVudC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1kcWV2ZW50LnhtbApzaW1pbGFyaXR5IGluZGV4IDg0JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1kcWV2ZW50LnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZHFldmVudC54bWwKaW5kZXggNGUwYTdjYy4uNzc2OTY0MiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZHFldmVudC54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZHFldmVudC54bWwKQEAgLTgxLDYgKzgxLDEzIEBACiAJICA8L3Jvdz4KIAkgIDxyb3c+CiAJICAgIDxlbnRyeT48L2VudHJ5PgorCSAgICA8ZW50cnk+JnY0bDItZXZlbnQtY3RybDs8L2VudHJ5PgorICAgICAgICAgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5jdHJsPC9zdHJ1Y3RmaWVsZD48L2VudHJ5PgorCSAgICA8ZW50cnk+RXZlbnQgZGF0YSBmb3IgZXZlbnQgVjRMMl9FVkVOVF9DVFJMLgorICAgICAgICAgICAgPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5PjwvZW50cnk+CiAJICAgIDxlbnRyeT5fX3U4PC9lbnRyeT4KICAgICAgICAgICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+ZGF0YTwvc3RydWN0ZmllbGQ+WzY0XTwvZW50cnk+CiAJICAgIDxlbnRyeT5FdmVudCBkYXRhLiBEZWZpbmVkIGJ5IHRoZSBldmVudCB0eXBlLiBUaGUgdW5pb24KQEAgLTExMCw4ICsxMTcsMTYgQEAKIAkgICAgPGVudHJ5PkV2ZW50IHRpbWVzdGFtcC48L2VudHJ5PgogCSAgPC9yb3c+CiAJICA8cm93PgorCSAgICA8ZW50cnk+dTMyPC9lbnRyeT4KKwkgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5pZDwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KKyAgICAgICAgICAgIDxlbnRyeT48L2VudHJ5PgorCSAgICA8ZW50cnk+VGhlIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXZlbnQgc291cmNlLiBJZiB0aGUgZXZlbnQgZG9lcyBub3QKKwkJaGF2ZSBhbiBhc3NvY2lhdGVkIElEICh0aGlzIGRlcGVuZHMgb24gdGhlIGV2ZW50IHR5cGUpLCB0aGVuIHRoaXMKKwkJaXMgMC48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgogCSAgICA8ZW50cnk+X191MzI8L2VudHJ5PgotCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPnJlc2VydmVkPC9zdHJ1Y3RmaWVsZD5bOV08L2VudHJ5PgorCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPnJlc2VydmVkPC9zdHJ1Y3RmaWVsZD5bOF08L2VudHJ5PgogICAgICAgICAgICAgPGVudHJ5PjwvZW50cnk+CiAJICAgIDxlbnRyeT5SZXNlcnZlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbnMuIERyaXZlcnMgbXVzdCBzZXQKIAkgICAgdGhlIGFycmF5IHRvIHplcm8uPC9lbnRyeT4KQEAgLTEyMSwxMSArMTM2LDcgQEAKICAgICA8L3RhYmxlPgogCiAgIDwvcmVmc2VjdDE+CisgIDxyZWZzZWN0MT4KKyAgICAmcmV0dXJuLXZhbHVlOworICA8L3JlZnNlY3QxPgogPC9yZWZlbnRyeT4KLTwhLS0KLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IHNnbWwKLXNnbWwtcGFyZW50LWRvY3VtZW50OiAidjRsMi5zZ21sIgotaW5kZW50LXRhYnMtbW9kZTogbmlsCi1FbmQ6Ci0tLT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWVuY29kZXItY21kLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWVuY29kZXItY21kLnhtbApzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1lbmNvZGVyLWNtZC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWVuY29kZXItY21kLnhtbAppbmRleCBiMGRkZTk0Li5hZjdmM2YyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1lbmNvZGVyLWNtZC54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZW5jb2Rlci1jbWQueG1sCkBAIC0xODAsOCArMTgwLDcgQEAKICAgICAgIDx2YXJsaXN0ZW50cnk+CiAJPHRlcm0+PGVycm9yY29kZT5FSU5WQUw8L2Vycm9yY29kZT48L3Rlcm0+CiAJPGxpc3RpdGVtPgotCSAgPHBhcmE+VGhlIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgaW9jdGwsIG9yIHRoZQotPHN0cnVjdGZpZWxkPmNtZDwvc3RydWN0ZmllbGQ+IGZpZWxkIGlzIGludmFsaWQuPC9wYXJhPgorCSAgPHBhcmE+VGhlIDxzdHJ1Y3RmaWVsZD5jbWQ8L3N0cnVjdGZpZWxkPiBmaWVsZCBpcyBpbnZhbGlkLjwvcGFyYT4KIAk8L2xpc3RpdGVtPgogICAgICAgPC92YXJsaXN0ZW50cnk+CiAgICAgICA8dmFybGlzdGVudHJ5PgpAQCAtMTk0LDExICsxOTMsMyBAQAogICAgIDwvdmFyaWFibGVsaXN0PgogICA8L3JlZnNlY3QxPgogPC9yZWZlbnRyeT4KLQotPCEtLQotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogc2dtbAotc2dtbC1wYXJlbnQtZG9jdW1lbnQ6ICJ2NGwyLnNnbWwiCi1pbmRlbnQtdGFicy1tb2RlOiBuaWwKLUVuZDoKLS0tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZW51bS1kdi1wcmVzZXRzLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWVudW0tZHYtcHJlc2V0cy54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWVudW0tZHYtcHJlc2V0cy54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWVudW0tZHYtcHJlc2V0cy54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWVudW0tZm10LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWVudW0tZm10LnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZW51bS1mbXQueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1lbnVtLWZtdC54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWVudW0tZnJhbWVpbnRlcnZhbHMueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZW51bS1mcmFtZWludGVydmFscy54bWwKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZW51bS1mcmFtZWludGVydmFscy54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWVudW0tZnJhbWVpbnRlcnZhbHMueG1sCmluZGV4IDNjMjE2ZTEuLjVmZDcyYzQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWVudW0tZnJhbWVpbnRlcnZhbHMueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWVudW0tZnJhbWVpbnRlcnZhbHMueG1sCkBAIC0yNTQsMTcgKzI1NCw2IEBACiAKICAgPHJlZnNlY3QxPgogICAgICZyZXR1cm4tdmFsdWU7Ci0KLSAgICA8cGFyYT5TZWUgdGhlIGRlc2NyaXB0aW9uIHNlY3Rpb24gYWJvdmUgZm9yIGEgbGlzdCBvZiByZXR1cm4KLXZhbHVlcyB0aGF0IDx2YXJuYW1lPmVycm5vPC92YXJuYW1lPiBjYW4gaGF2ZS48L3BhcmE+CiAgIDwvcmVmc2VjdDE+CiAKIDwvcmVmZW50cnk+Ci0KLTwhLS0KLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IHNnbWwKLXNnbWwtcGFyZW50LWRvY3VtZW50OiAidjRsMi5zZ21sIgotaW5kZW50LXRhYnMtbW9kZTogbmlsCi1FbmQ6Ci0tLT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWVudW0tZnJhbWVzaXplcy54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1lbnVtLWZyYW1lc2l6ZXMueG1sCnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWVudW0tZnJhbWVzaXplcy54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWVudW0tZnJhbWVzaXplcy54bWwKaW5kZXggNmFmYTQ1NC4uZjc3YTEzZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZW51bS1mcmFtZXNpemVzLnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1lbnVtLWZyYW1lc2l6ZXMueG1sCkBAIC0yNjcsMTYgKzI2Nyw1IEBACiAKICAgPHJlZnNlY3QxPgogICAgICZyZXR1cm4tdmFsdWU7Ci0KLSAgICA8cGFyYT5TZWUgdGhlIGRlc2NyaXB0aW9uIHNlY3Rpb24gYWJvdmUgZm9yIGEgbGlzdCBvZiByZXR1cm4KLXZhbHVlcyB0aGF0IDx2YXJuYW1lPmVycm5vPC92YXJuYW1lPiBjYW4gaGF2ZS48L3BhcmE+CiAgIDwvcmVmc2VjdDE+CiA8L3JlZmVudHJ5PgotCi08IS0tCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBzZ21sCi1zZ21sLXBhcmVudC1kb2N1bWVudDogInY0bDIuc2dtbCIKLWluZGVudC10YWJzLW1vZGU6IG5pbAotRW5kOgotLS0+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1lbnVtYXVkaW8ueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZW51bWF1ZGlvLnhtbApzaW1pbGFyaXR5IGluZGV4IDg5JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1lbnVtYXVkaW8ueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1lbnVtYXVkaW8ueG1sCmluZGV4IDlhZThmMmQuLmVhODE2YWIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWVudW1hdWRpby54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZW51bWF1ZGlvLnhtbApAQCAtNjgsMTkgKzY4LDkgQEAKICAgICAgIDx2YXJsaXN0ZW50cnk+CiAJPHRlcm0+PGVycm9yY29kZT5FSU5WQUw8L2Vycm9yY29kZT48L3Rlcm0+CiAJPGxpc3RpdGVtPgotCSAgPHBhcmE+VGhlIG51bWJlciBvZiB0aGUgYXVkaW8gaW5wdXQgaXMgb3V0IG9mIGJvdW5kcywgb3IKLXRoZXJlIGFyZSBubyBhdWRpbyBpbnB1dHMgYXQgYWxsIGFuZCB0aGlzIGlvY3RsIGlzIG5vdAotc3VwcG9ydGVkLjwvcGFyYT4KKwkgIDxwYXJhPlRoZSBudW1iZXIgb2YgdGhlIGF1ZGlvIGlucHV0IGlzIG91dCBvZiBib3VuZHMuPC9wYXJhPgogCTwvbGlzdGl0ZW0+CiAgICAgICA8L3Zhcmxpc3RlbnRyeT4KICAgICA8L3ZhcmlhYmxlbGlzdD4KICAgPC9yZWZzZWN0MT4KIDwvcmVmZW50cnk+Ci0KLTwhLS0KLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IHNnbWwKLXNnbWwtcGFyZW50LWRvY3VtZW50OiAidjRsMi5zZ21sIgotaW5kZW50LXRhYnMtbW9kZTogbmlsCi1FbmQ6Ci0tLT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWVudW1hdWRpb291dC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1lbnVtYXVkaW9vdXQueG1sCnNpbWlsYXJpdHkgaW5kZXggOTAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWVudW1hdWRpb291dC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWVudW1hdWRpb291dC54bWwKaW5kZXggZDNkN2MwYS4uMmU4N2NlZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZW51bWF1ZGlvb3V0LnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1lbnVtYXVkaW9vdXQueG1sCkBAIC03MSwxOSArNzEsOSBAQAogICAgICAgPHZhcmxpc3RlbnRyeT4KIAk8dGVybT48ZXJyb3Jjb2RlPkVJTlZBTDwvZXJyb3Jjb2RlPjwvdGVybT4KIAk8bGlzdGl0ZW0+Ci0JICA8cGFyYT5UaGUgbnVtYmVyIG9mIHRoZSBhdWRpbyBvdXRwdXQgaXMgb3V0IG9mIGJvdW5kcywgb3IKLXRoZXJlIGFyZSBubyBhdWRpbyBvdXRwdXRzIGF0IGFsbCBhbmQgdGhpcyBpb2N0bCBpcyBub3QKLXN1cHBvcnRlZC48L3BhcmE+CisJICA8cGFyYT5UaGUgbnVtYmVyIG9mIHRoZSBhdWRpbyBvdXRwdXQgaXMgb3V0IG9mIGJvdW5kcy48L3BhcmE+CiAJPC9saXN0aXRlbT4KICAgICAgIDwvdmFybGlzdGVudHJ5PgogICAgIDwvdmFyaWFibGVsaXN0PgogICA8L3JlZnNlY3QxPgogPC9yZWZlbnRyeT4KLQotPCEtLQotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogc2dtbAotc2dtbC1wYXJlbnQtZG9jdW1lbnQ6ICJ2NGwyLnNnbWwiCi1pbmRlbnQtdGFicy1tb2RlOiBuaWwKLUVuZDoKLS0tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZW51bWlucHV0LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWVudW1pbnB1dC54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWVudW1pbnB1dC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWVudW1pbnB1dC54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWVudW1vdXRwdXQueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZW51bW91dHB1dC54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWVudW1vdXRwdXQueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1lbnVtb3V0cHV0LnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZW51bXN0ZC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1lbnVtc3RkLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZW51bXN0ZC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWVudW1zdGQueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLWF1ZGlvLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctYXVkaW8ueG1sCnNpbWlsYXJpdHkgaW5kZXggOTMlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctYXVkaW8ueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLWF1ZGlvLnhtbAppbmRleCA2NTM2MWE4Li5kN2JiOWIzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLWF1ZGlvLnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLWF1ZGlvLnhtbApAQCAtMTY0LDI1ICsxNjQsOSBAQAogCTxsaXN0aXRlbT4KIAkgIDxwYXJhPk5vIGF1ZGlvIGlucHV0cyBjb21iaW5lIHdpdGggdGhlIGN1cnJlbnQgdmlkZW8gaW5wdXQsCiBvciB0aGUgbnVtYmVyIG9mIHRoZSBzZWxlY3RlZCBhdWRpbyBpbnB1dCBpcyBvdXQgb2YgYm91bmRzIG9yIGl0IGRvZXMKLW5vdCBjb21iaW5lLCBvciB0aGVyZSBhcmUgbm8gYXVkaW8gaW5wdXRzIGF0IGFsbCBhbmQgdGhlIGlvY3RsIGlzIG5vdAotc3VwcG9ydGVkLjwvcGFyYT4KLQk8L2xpc3RpdGVtPgotICAgICAgPC92YXJsaXN0ZW50cnk+Ci0gICAgICA8dmFybGlzdGVudHJ5PgotCTx0ZXJtPjxlcnJvcmNvZGU+RUJVU1k8L2Vycm9yY29kZT48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+SS9PIGlzIGluIHByb2dyZXNzLCB0aGUgaW5wdXQgY2Fubm90IGJlCi1zd2l0Y2hlZC48L3BhcmE+Citub3QgY29tYmluZS48L3BhcmE+CiAJPC9saXN0aXRlbT4KICAgICAgIDwvdmFybGlzdGVudHJ5PgogICAgIDwvdmFyaWFibGVsaXN0PgogICA8L3JlZnNlY3QxPgogPC9yZWZlbnRyeT4KLQotPCEtLQotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogc2dtbAotc2dtbC1wYXJlbnQtZG9jdW1lbnQ6ICJ2NGwyLnNnbWwiCi1pbmRlbnQtdGFicy1tb2RlOiBuaWwKLUVuZDoKLS0tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1hdWRpb291dC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLWF1ZGlvb3V0LnhtbApzaW1pbGFyaXR5IGluZGV4IDkxJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLWF1ZGlvb3V0LnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1hdWRpb291dC54bWwKaW5kZXggMzYzMjczMC4uMjAwYTI3MCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1hdWRpb291dC54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1hdWRpb291dC54bWwKQEAgLTEzMCwyNSArMTMwLDkgQEAKIAk8bGlzdGl0ZW0+CiAJICA8cGFyYT5ObyBhdWRpbyBvdXRwdXRzIGNvbWJpbmUgd2l0aCB0aGUgY3VycmVudCB2aWRlbwogb3V0cHV0LCBvciB0aGUgbnVtYmVyIG9mIHRoZSBzZWxlY3RlZCBhdWRpbyBvdXRwdXQgaXMgb3V0IG9mIGJvdW5kcyBvcgotaXQgZG9lcyBub3QgY29tYmluZSwgb3IgdGhlcmUgYXJlIG5vIGF1ZGlvIG91dHB1dHMgYXQgYWxsIGFuZCB0aGUKLWlvY3RsIGlzIG5vdCBzdXBwb3J0ZWQuPC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICAgIDx2YXJsaXN0ZW50cnk+Ci0JPHRlcm0+PGVycm9yY29kZT5FQlVTWTwvZXJyb3Jjb2RlPjwvdGVybT4KLQk8bGlzdGl0ZW0+Ci0JICA8cGFyYT5JL08gaXMgaW4gcHJvZ3Jlc3MsIHRoZSBvdXRwdXQgY2Fubm90IGJlCi1zd2l0Y2hlZC48L3BhcmE+CitpdCBkb2VzIG5vdCBjb21iaW5lLjwvcGFyYT4KIAk8L2xpc3RpdGVtPgogICAgICAgPC92YXJsaXN0ZW50cnk+CiAgICAgPC92YXJpYWJsZWxpc3Q+CiAgIDwvcmVmc2VjdDE+CiA8L3JlZmVudHJ5PgotCi08IS0tCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBzZ21sCi1zZ21sLXBhcmVudC1kb2N1bWVudDogInY0bDIuc2dtbCIKLWluZGVudC10YWJzLW1vZGU6IG5pbAotRW5kOgotLS0+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLWNyb3AueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1jcm9wLnhtbApzaW1pbGFyaXR5IGluZGV4IDkzJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLWNyb3AueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLWNyb3AueG1sCmluZGV4IGQyMzViMWQuLjAxYTUwNjQwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLWNyb3AueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctY3JvcC54bWwKQEAgLTEyMiwyMiArMTIyLDUgQEAKIAogICA8cmVmc2VjdDE+CiAgICAgJnJldHVybi12YWx1ZTsKLQotICAgIDx2YXJpYWJsZWxpc3Q+Ci0gICAgICA8dmFybGlzdGVudHJ5PgotCTx0ZXJtPjxlcnJvcmNvZGU+RUlOVkFMPC9lcnJvcmNvZGU+PC90ZXJtPgotCTxsaXN0aXRlbT4KLQkgIDxwYXJhPkNyb3BwaW5nIGlzIG5vdCBzdXBwb3J0ZWQuPC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICA8L3ZhcmlhYmxlbGlzdD4KICAgPC9yZWZzZWN0MT4KIDwvcmVmZW50cnk+Ci0KLTwhLS0KLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IHNnbWwKLXNnbWwtcGFyZW50LWRvY3VtZW50OiAidjRsMi5zZ21sIgotaW5kZW50LXRhYnMtbW9kZTogbmlsCi1FbmQ6Ci0tLT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctY3RybC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLWN0cmwueG1sCnNpbWlsYXJpdHkgaW5kZXggOTQlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctY3RybC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctY3RybC54bWwKaW5kZXggOGI1ZTZmZi4uNTE0NmQwMCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1jdHJsLnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLWN0cmwueG1sCkBAIC0xMTcsNiArMTE3LDEzIEBACiB0aGlzIGNvbnRyb2wgYmVsb25ncyB0by48L3BhcmE+CiAJPC9saXN0aXRlbT4KICAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgPHZhcmxpc3RlbnRyeT4KKwk8dGVybT48ZXJyb3Jjb2RlPkVBQ0NFUzwvZXJyb3Jjb2RlPjwvdGVybT4KKwk8bGlzdGl0ZW0+CisJICA8cGFyYT5BdHRlbXB0IHRvIHNldCBhIHJlYWQtb25seSBjb250cm9sIG9yIHRvIGdldCBhCisJICB3cml0ZS1vbmx5IGNvbnRyb2wuPC9wYXJhPgorCTwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KICAgICA8L3ZhcmlhYmxlbGlzdD4KICAgPC9yZWZzZWN0MT4KIDwvcmVmZW50cnk+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLWR2LXByZXNldC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLWR2LXByZXNldC54bWwKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1kdi1wcmVzZXQueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLWR2LXByZXNldC54bWwKaW5kZXggZDczMzcyMS4uNzk0MGMxMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1kdi1wcmVzZXQueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctZHYtcHJlc2V0LnhtbApAQCAtOTcsMTQgKzk3LDggQEAKIAk8L3Rib2R5PgogICAgICAgPC90Z3JvdXA+CiAgICAgPC90YWJsZT4KLQorICA8L3JlZnNlY3QxPgorICA8cmVmc2VjdDE+CisgICAgJnJldHVybi12YWx1ZTsKICAgPC9yZWZzZWN0MT4KIDwvcmVmZW50cnk+Ci0KLTwhLS0KLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IHNnbWwKLXNnbWwtcGFyZW50LWRvY3VtZW50OiAidjRsMi5zZ21sIgotaW5kZW50LXRhYnMtbW9kZTogbmlsCi1FbmQ6Ci0tLT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctZHYtdGltaW5ncy54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLWR2LXRpbWluZ3MueG1sCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctZHYtdGltaW5ncy54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctZHYtdGltaW5ncy54bWwKaW5kZXggZDVlYzZhYi4uNGE4NjQ4YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1kdi10aW1pbmdzLnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLWR2LXRpbWluZ3MueG1sCkBAIC0yMTIsMTIgKzIxMiw3IEBACiAgICAgICA8L3Rncm91cD4KICAgICA8L3RhYmxlPgogICA8L3JlZnNlY3QxPgorICA8cmVmc2VjdDE+CisgICAgJnJldHVybi12YWx1ZTsKKyAgPC9yZWZzZWN0MT4KIDwvcmVmZW50cnk+Ci0KLTwhLS0KLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IHNnbWwKLXNnbWwtcGFyZW50LWRvY3VtZW50OiAidjRsMi5zZ21sIgotaW5kZW50LXRhYnMtbW9kZTogbmlsCi1FbmQ6Ci0tLT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctZW5jLWluZGV4LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctZW5jLWluZGV4LnhtbApzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLWVuYy1pbmRleC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctZW5jLWluZGV4LnhtbAppbmRleCA5ZjI0MmU0Li4yYWVmMDJjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLWVuYy1pbmRleC54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1lbmMtaW5kZXgueG1sCkBAIC0xOTIsMjIgKzE5Miw1IEBACiAKICAgPHJlZnNlY3QxPgogICAgICZyZXR1cm4tdmFsdWU7Ci0KLSAgICA8dmFyaWFibGVsaXN0PgotICAgICAgPHZhcmxpc3RlbnRyeT4KLQk8dGVybT48ZXJyb3Jjb2RlPkVJTlZBTDwvZXJyb3Jjb2RlPjwvdGVybT4KLQk8bGlzdGl0ZW0+Ci0JICA8cGFyYT5UaGUgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBpb2N0bC48L3BhcmE+Ci0JPC9saXN0aXRlbT4KLSAgICAgIDwvdmFybGlzdGVudHJ5PgotICAgIDwvdmFyaWFibGVsaXN0PgogICA8L3JlZnNlY3QxPgogPC9yZWZlbnRyeT4KLQotPCEtLQotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogc2dtbAotc2dtbC1wYXJlbnQtZG9jdW1lbnQ6ICJ2NGwyLnNnbWwiCi1pbmRlbnQtdGFicy1tb2RlOiBuaWwKLUVuZDoKLS0tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1leHQtY3RybHMueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1leHQtY3RybHMueG1sCnNpbWlsYXJpdHkgaW5kZXggOTUlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctZXh0LWN0cmxzLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1leHQtY3RybHMueG1sCmluZGV4IDNhYTdmOGYuLjUxMjJjZTggMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctZXh0LWN0cmxzLnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLWV4dC1jdHJscy54bWwKQEAgLTI1MCw2ICsyNTAsMTMgQEAKIFRoZXNlIGNvbnRyb2xzIGFyZSBkZXNjcmliZWQgaW4gPHhyZWYKIAkJbGlua2VuZD0iZm0tdHgtY29udHJvbHMiIC8+LjwvZW50cnk+CiAJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9DVFJMX0NMQVNTX0ZMQVNIPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+MHg5YzAwMDA8L2VudHJ5PgorCSAgICA8ZW50cnk+VGhlIGNsYXNzIGNvbnRhaW5pbmcgZmxhc2ggZGV2aWNlIGNvbnRyb2xzLgorVGhlc2UgY29udHJvbHMgYXJlIGRlc2NyaWJlZCBpbiA8eHJlZgorCQlsaW5rZW5kPSJmbGFzaC1jb250cm9scyIgLz4uPC9lbnRyeT4KKwkgIDwvcm93PgogCTwvdGJvZHk+CiAgICAgICA8L3Rncm91cD4KICAgICA8L3RhYmxlPgpAQCAtMjk0LDYgKzMwMSwxMyBAQAogdG8gc3RvcmUgdGhlIHBheWxvYWQgYW5kIHRoaXMgZXJyb3IgY29kZSBpcyByZXR1cm5lZC48L3BhcmE+CiAJPC9saXN0aXRlbT4KICAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgPHZhcmxpc3RlbnRyeT4KKwk8dGVybT48ZXJyb3Jjb2RlPkVBQ0NFUzwvZXJyb3Jjb2RlPjwvdGVybT4KKwk8bGlzdGl0ZW0+CisJICA8cGFyYT5BdHRlbXB0IHRvIHRyeSBvciBzZXQgYSByZWFkLW9ubHkgY29udHJvbCBvciB0byBnZXQgYQorCSAgd3JpdGUtb25seSBjb250cm9sLjwvcGFyYT4KKwk8L2xpc3RpdGVtPgorICAgICAgPC92YXJsaXN0ZW50cnk+CiAgICAgPC92YXJpYWJsZWxpc3Q+CiAgIDwvcmVmc2VjdDE+CiA8L3JlZmVudHJ5PgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1mYnVmLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctZmJ1Zi54bWwKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1mYnVmLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1mYnVmLnhtbAppbmRleCBlN2RkYTQ4Li4wNTU3MTgyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLWZidWYueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctZmJ1Zi54bWwKQEAgLTQ0NiwyOCArNDQ2LDExIEBACiAJPC9saXN0aXRlbT4KICAgICAgIDwvdmFybGlzdGVudHJ5PgogICAgICAgPHZhcmxpc3RlbnRyeT4KLQk8dGVybT48ZXJyb3Jjb2RlPkVCVVNZPC9lcnJvcmNvZGU+PC90ZXJtPgotCTxsaXN0aXRlbT4KLQkgIDxwYXJhPlRoZSBmcmFtZWJ1ZmZlciBwYXJhbWV0ZXJzIGNhbm5vdCBiZSBjaGFuZ2VkIGF0IHRoaXMKLXRpbWUgYmVjYXVzZSBvdmVybGF5IGlzIGFscmVhZHkgZW5hYmxlZCwgb3IgY2FwdHVyaW5nIGlzIGVuYWJsZWQKLWFuZCB0aGUgaGFyZHdhcmUgY2Fubm90IGNhcHR1cmUgYW5kIG92ZXJsYXkgc2ltdWx0YW5lb3VzbHkuPC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICAgIDx2YXJsaXN0ZW50cnk+CiAJPHRlcm0+PGVycm9yY29kZT5FSU5WQUw8L2Vycm9yY29kZT48L3Rlcm0+CiAJPGxpc3RpdGVtPgotCSAgPHBhcmE+VGhlIGlvY3RsIGlzIG5vdCBzdXBwb3J0ZWQgb3IgdGhlCi08Y29uc3RhbnQ+VklESU9DX1NfRkJVRjwvY29uc3RhbnQ+IHBhcmFtZXRlcnMgYXJlIHVuc3VpdGFibGUuPC9wYXJhPgorCSAgPHBhcmE+VGhlIDxjb25zdGFudD5WSURJT0NfU19GQlVGPC9jb25zdGFudD4gcGFyYW1ldGVycyBhcmUgdW5zdWl0YWJsZS48L3BhcmE+CiAJPC9saXN0aXRlbT4KICAgICAgIDwvdmFybGlzdGVudHJ5PgogICAgIDwvdmFyaWFibGVsaXN0PgogICA8L3JlZnNlY3QxPgogPC9yZWZlbnRyeT4KLQotPCEtLQotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogc2dtbAotc2dtbC1wYXJlbnQtZG9jdW1lbnQ6ICJ2NGwyLnNnbWwiCi1pbmRlbnQtdGFicy1tb2RlOiBuaWwKLUVuZDoKLS0tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1mbXQueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1mbXQueG1sCnNpbWlsYXJpdHkgaW5kZXggOTMlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctZm10LnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1mbXQueG1sCmluZGV4IGE0YWU1OWIuLjE3ZmJkYTEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctZm10LnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLWZtdC54bWwKQEAgLTE4NCwyOSArMTg0LDEzIEBACiAKICAgICA8dmFyaWFibGVsaXN0PgogICAgICAgPHZhcmxpc3RlbnRyeT4KLQk8dGVybT48ZXJyb3Jjb2RlPkVCVVNZPC9lcnJvcmNvZGU+PC90ZXJtPgotCTxsaXN0aXRlbT4KLQkgIDxwYXJhPlRoZSBkYXRhIGZvcm1hdCBjYW5ub3QgYmUgY2hhbmdlZCBhdCB0aGlzCi10aW1lLCBmb3IgZXhhbXBsZSBiZWNhdXNlIEkvTyBpcyBhbHJlYWR5IGluIHByb2dyZXNzLjwvcGFyYT4KLQk8L2xpc3RpdGVtPgotICAgICAgPC92YXJsaXN0ZW50cnk+Ci0gICAgICA8dmFybGlzdGVudHJ5PgogCTx0ZXJtPjxlcnJvcmNvZGU+RUlOVkFMPC9lcnJvcmNvZGU+PC90ZXJtPgogCTxsaXN0aXRlbT4KIAkgIDxwYXJhPlRoZSAmdjRsMi1mb3JtYXQ7IDxzdHJ1Y3RmaWVsZD50eXBlPC9zdHJ1Y3RmaWVsZD4KLWZpZWxkIGlzIGludmFsaWQsIHRoZSByZXF1ZXN0ZWQgYnVmZmVyIHR5cGUgbm90IHN1cHBvcnRlZCwgb3IKLTxjb25zdGFudD5WSURJT0NfVFJZX0ZNVDwvY29uc3RhbnQ+IHdhcyBjYWxsZWQgYW5kIGlzIG5vdAotc3VwcG9ydGVkIHdpdGggdGhpcyBidWZmZXIgdHlwZS48L3BhcmE+CitmaWVsZCBpcyBpbnZhbGlkLCB0aGUgcmVxdWVzdGVkIGJ1ZmZlciB0eXBlIG5vdCBzdXBwb3J0ZWQsIG9yIHRoZQorZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCB0aGlzIGJ1ZmZlciB0eXBlLjwvcGFyYT4KIAk8L2xpc3RpdGVtPgogICAgICAgPC92YXJsaXN0ZW50cnk+CiAgICAgPC92YXJpYWJsZWxpc3Q+CiAgIDwvcmVmc2VjdDE+CiA8L3JlZmVudHJ5PgotCi08IS0tCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBzZ21sCi1zZ21sLXBhcmVudC1kb2N1bWVudDogInY0bDIuc2dtbCIKLWluZGVudC10YWJzLW1vZGU6IG5pbAotRW5kOgotLS0+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLWZyZXF1ZW5jeS54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLWZyZXF1ZW5jeS54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctZnJlcXVlbmN5LnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1mcmVxdWVuY3kueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLWlucHV0LnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctaW5wdXQueG1sCnNpbWlsYXJpdHkgaW5kZXggODQlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctaW5wdXQueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLWlucHV0LnhtbAppbmRleCBlZDA3NmU5Li4wOGFlODJmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLWlucHV0LnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLWlucHV0LnhtbApAQCAtNzUsMjYgKzc1LDkgQEAKICAgICAgIDx2YXJsaXN0ZW50cnk+CiAJPHRlcm0+PGVycm9yY29kZT5FSU5WQUw8L2Vycm9yY29kZT48L3Rlcm0+CiAJPGxpc3RpdGVtPgotCSAgPHBhcmE+VGhlIG51bWJlciBvZiB0aGUgdmlkZW8gaW5wdXQgaXMgb3V0IG9mIGJvdW5kcywgb3IKLXRoZXJlIGFyZSBubyB2aWRlbyBpbnB1dHMgYXQgYWxsIGFuZCB0aGlzIGlvY3RsIGlzIG5vdAotc3VwcG9ydGVkLjwvcGFyYT4KLQk8L2xpc3RpdGVtPgotICAgICAgPC92YXJsaXN0ZW50cnk+Ci0gICAgICA8dmFybGlzdGVudHJ5PgotCTx0ZXJtPjxlcnJvcmNvZGU+RUJVU1k8L2Vycm9yY29kZT48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+SS9PIGlzIGluIHByb2dyZXNzLCB0aGUgaW5wdXQgY2Fubm90IGJlCi1zd2l0Y2hlZC48L3BhcmE+CisJICA8cGFyYT5UaGUgbnVtYmVyIG9mIHRoZSB2aWRlbyBpbnB1dCBpcyBvdXQgb2YgYm91bmRzLjwvcGFyYT4KIAk8L2xpc3RpdGVtPgogICAgICAgPC92YXJsaXN0ZW50cnk+CiAgICAgPC92YXJpYWJsZWxpc3Q+CiAgIDwvcmVmc2VjdDE+CiA8L3JlZmVudHJ5PgotCi08IS0tCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBzZ21sCi1zZ21sLXBhcmVudC1kb2N1bWVudDogInY0bDIuc2dtbCIKLWluZGVudC10YWJzLW1vZGU6IG5pbAotRW5kOgotLS0+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLWpwZWdjb21wLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctanBlZ2NvbXAueG1sCnNpbWlsYXJpdHkgaW5kZXggOTMlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctanBlZ2NvbXAueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLWpwZWdjb21wLnhtbAppbmRleCA3NzM5NGIyLi4wMWVhMjRiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLWpwZWdjb21wLnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLWpwZWdjb21wLnhtbApAQCAtMTU5LDIyICsxNTksNSBAQAogCiAgIDxyZWZzZWN0MT4KICAgICAmcmV0dXJuLXZhbHVlOwotCi0gICAgPHZhcmlhYmxlbGlzdD4KLSAgICAgIDx2YXJsaXN0ZW50cnk+Ci0JPHRlcm0+PGVycm9yY29kZT5FSU5WQUw8L2Vycm9yY29kZT48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+VGhpcyBpb2N0bCBpcyBub3Qgc3VwcG9ydGVkLjwvcGFyYT4KLQk8L2xpc3RpdGVtPgotICAgICAgPC92YXJsaXN0ZW50cnk+Ci0gICAgPC92YXJpYWJsZWxpc3Q+CiAgIDwvcmVmc2VjdDE+CiA8L3JlZmVudHJ5PgotCi08IS0tCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBzZ21sCi1zZ21sLXBhcmVudC1kb2N1bWVudDogInY0bDIuc2dtbCIKLWluZGVudC10YWJzLW1vZGU6IG5pbAotRW5kOgotLS0+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLW1vZHVsYXRvci54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLW1vZHVsYXRvci54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctbW9kdWxhdG9yLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1tb2R1bGF0b3IueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLW91dHB1dC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLW91dHB1dC54bWwKc2ltaWxhcml0eSBpbmRleCA4NiUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1vdXRwdXQueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLW91dHB1dC54bWwKaW5kZXggM2VhOGMwZS4uZmQ0NWYxYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1vdXRwdXQueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctb3V0cHV0LnhtbApAQCAtNzYsMjUgKzc2LDkgQEAKIAk8dGVybT48ZXJyb3Jjb2RlPkVJTlZBTDwvZXJyb3Jjb2RlPjwvdGVybT4KIAk8bGlzdGl0ZW0+CiAJICA8cGFyYT5UaGUgbnVtYmVyIG9mIHRoZSB2aWRlbyBvdXRwdXQgaXMgb3V0IG9mIGJvdW5kcywgb3IKLXRoZXJlIGFyZSBubyB2aWRlbyBvdXRwdXRzIGF0IGFsbCBhbmQgdGhpcyBpb2N0bCBpcyBub3QKLXN1cHBvcnRlZC48L3BhcmE+Ci0JPC9saXN0aXRlbT4KLSAgICAgIDwvdmFybGlzdGVudHJ5PgotICAgICAgPHZhcmxpc3RlbnRyeT4KLQk8dGVybT48ZXJyb3Jjb2RlPkVCVVNZPC9lcnJvcmNvZGU+PC90ZXJtPgotCTxsaXN0aXRlbT4KLQkgIDxwYXJhPkkvTyBpcyBpbiBwcm9ncmVzcywgdGhlIG91dHB1dCBjYW5ub3QgYmUKLXN3aXRjaGVkLjwvcGFyYT4KK3RoZXJlIGFyZSBubyB2aWRlbyBvdXRwdXRzIGF0IGFsbC48L3BhcmE+CiAJPC9saXN0aXRlbT4KICAgICAgIDwvdmFybGlzdGVudHJ5PgogICAgIDwvdmFyaWFibGVsaXN0PgogICA8L3JlZnNlY3QxPgogPC9yZWZlbnRyeT4KLQotPCEtLQotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogc2dtbAotc2dtbC1wYXJlbnQtZG9jdW1lbnQ6ICJ2NGwyLnNnbWwiCi1pbmRlbnQtdGFicy1tb2RlOiBuaWwKLUVuZDoKLS0tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1wYXJtLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctcGFybS54bWwKc2ltaWxhcml0eSBpbmRleCA5NyUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1wYXJtLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1wYXJtLnhtbAppbmRleCAzOTJhYTllLi4xOWIxZDg1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLXBhcm0ueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctcGFybS54bWwKQEAgLTMxMSwyMiArMzExLDUgQEAKIAogICA8cmVmc2VjdDE+CiAgICAgJnJldHVybi12YWx1ZTsKLQotICAgIDx2YXJpYWJsZWxpc3Q+Ci0gICAgICA8dmFybGlzdGVudHJ5PgotCTx0ZXJtPjxlcnJvcmNvZGU+RUlOVkFMPC9lcnJvcmNvZGU+PC90ZXJtPgotCTxsaXN0aXRlbT4KLQkgIDxwYXJhPlRoaXMgaW9jdGwgaXMgbm90IHN1cHBvcnRlZC48L3BhcmE+Ci0JPC9saXN0aXRlbT4KLSAgICAgIDwvdmFybGlzdGVudHJ5PgotICAgIDwvdmFyaWFibGVsaXN0PgogICA8L3JlZnNlY3QxPgogPC9yZWZlbnRyeT4KLQotPCEtLQotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogc2dtbAotc2dtbC1wYXJlbnQtZG9jdW1lbnQ6ICJ2NGwyLnNnbWwiCi1pbmRlbnQtdGFicy1tb2RlOiBuaWwKLUVuZDoKLS0tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1wcmlvcml0eS54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLXByaW9yaXR5LnhtbApzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLXByaW9yaXR5LnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1wcmlvcml0eS54bWwKaW5kZXggNWZiMDAxOS4uOGY1ZTNkYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1wcmlvcml0eS54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1wcmlvcml0eS54bWwKQEAgLTEyMCw4ICsxMjAsNyBAQAogICAgICAgPHZhcmxpc3RlbnRyeT4KIAk8dGVybT48ZXJyb3Jjb2RlPkVJTlZBTDwvZXJyb3Jjb2RlPjwvdGVybT4KIAk8bGlzdGl0ZW0+Ci0JICA8cGFyYT5UaGUgcmVxdWVzdGVkIHByaW9yaXR5IHZhbHVlIGlzIGludmFsaWQsIG9yIHRoZQotZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgYWNjZXNzIHByaW9yaXRpZXMuPC9wYXJhPgorCSAgPHBhcmE+VGhlIHJlcXVlc3RlZCBwcmlvcml0eSB2YWx1ZSBpcyBpbnZhbGlkLjwvcGFyYT4KIAk8L2xpc3RpdGVtPgogICAgICAgPC92YXJsaXN0ZW50cnk+CiAgICAgICA8dmFybGlzdGVudHJ5PgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1zbGljZWQtdmJpLWNhcC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1nLXNsaWNlZC12YmktY2FwLnhtbApzaW1pbGFyaXR5IGluZGV4IDk2JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLXNsaWNlZC12YmktY2FwLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1zbGljZWQtdmJpLWNhcC54bWwKaW5kZXggMTBlNzIxYi4uNzE3NDFkYSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtZy1zbGljZWQtdmJpLWNhcC54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1zbGljZWQtdmJpLWNhcC54bWwKQEAgLTI0NiwxOSArMjQ2LDEwIEBACiAgICAgICA8dmFybGlzdGVudHJ5PgogCTx0ZXJtPjxlcnJvcmNvZGU+RUlOVkFMPC9lcnJvcmNvZGU+PC90ZXJtPgogCTxsaXN0aXRlbT4KLQkgIDxwYXJhPlRoZSBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBzbGljZWQgVkJJIGNhcHR1cmluZyBvcgotb3V0cHV0LCBvciB0aGUgdmFsdWUgaW4gdGhlIDxzdHJ1Y3RmaWVsZD50eXBlPC9zdHJ1Y3RmaWVsZD4gZmllbGQgaXMKKwkgIDxwYXJhPlRoZSB2YWx1ZSBpbiB0aGUgPHN0cnVjdGZpZWxkPnR5cGU8L3N0cnVjdGZpZWxkPiBmaWVsZCBpcwogd3JvbmcuPC9wYXJhPgogCTwvbGlzdGl0ZW0+CiAgICAgICA8L3Zhcmxpc3RlbnRyeT4KICAgICA8L3ZhcmlhYmxlbGlzdD4KICAgPC9yZWZzZWN0MT4KIDwvcmVmZW50cnk+Ci0KLTwhLS0KLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IHNnbWwKLXNnbWwtcGFyZW50LWRvY3VtZW50OiAidjRsMi5zZ21sIgotaW5kZW50LXRhYnMtbW9kZTogbmlsCi1FbmQ6Ci0tLT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWctc3RkLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctc3RkLnhtbApzaW1pbGFyaXR5IGluZGV4IDkwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLXN0ZC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctc3RkLnhtbAppbmRleCA5MTJmODUxLi4zNzk5NmYyIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLXN0ZC54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy1zdGQueG1sCkBAIC04MiwxNCArODIsNyBAQAogICAgICAgPHZhcmxpc3RlbnRyeT4KIAk8dGVybT48ZXJyb3Jjb2RlPkVJTlZBTDwvZXJyb3Jjb2RlPjwvdGVybT4KIAk8bGlzdGl0ZW0+Ci0JICA8cGFyYT5UaGlzIGlvY3RsIGlzIG5vdCBzdXBwb3J0ZWQsIG9yIHRoZQotPGNvbnN0YW50PlZJRElPQ19TX1NURDwvY29uc3RhbnQ+IHBhcmFtZXRlciB3YXMgdW5zdWl0YWJsZS48L3BhcmE+Ci0JPC9saXN0aXRlbT4KLSAgICAgIDwvdmFybGlzdGVudHJ5PgotICAgICAgPHZhcmxpc3RlbnRyeT4KLQk8dGVybT48ZXJyb3Jjb2RlPkVCVVNZPC9lcnJvcmNvZGU+PC90ZXJtPgotCTxsaXN0aXRlbT4KLQkgIDxwYXJhPlRoZSBkZXZpY2UgaXMgYnVzeSBhbmQgdGhlcmVmb3JlIGNhbiBub3QgY2hhbmdlIHRoZSBzdGFuZGFyZDwvcGFyYT4KKwkgIDxwYXJhPlRoZSA8Y29uc3RhbnQ+VklESU9DX1NfU1REPC9jb25zdGFudD4gcGFyYW1ldGVyIHdhcyB1bnN1aXRhYmxlLjwvcGFyYT4KIAk8L2xpc3RpdGVtPgogICAgICAgPC92YXJsaXN0ZW50cnk+CiAgICAgPC92YXJpYWJsZWxpc3Q+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLXR1bmVyLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWctdHVuZXIueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1nLXR1bmVyLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtZy10dW5lci54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWxvZy1zdGF0dXMueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtbG9nLXN0YXR1cy54bWwKc2ltaWxhcml0eSBpbmRleCA4MCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtbG9nLXN0YXR1cy54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWxvZy1zdGF0dXMueG1sCmluZGV4IDI2MzRiN2MuLjVkZWQ3ZDMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLWxvZy1zdGF0dXMueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLWxvZy1zdGF0dXMueG1sCkBAIC0zNywyMiArMzcsNSBAQAogCiAgIDxyZWZzZWN0MT4KICAgICAmcmV0dXJuLXZhbHVlOwotCi0gICAgPHZhcmlhYmxlbGlzdD4KLSAgICAgIDx2YXJsaXN0ZW50cnk+Ci0JPHRlcm0+PGVycm9yY29kZT5FSU5WQUw8L2Vycm9yY29kZT48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+VGhlIGRyaXZlciBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgaW9jdGwuPC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICA8L3ZhcmlhYmxlbGlzdD4KICAgPC9yZWZzZWN0MT4KIDwvcmVmZW50cnk+Ci0KLTwhLS0KLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IHNnbWwKLXNnbWwtcGFyZW50LWRvY3VtZW50OiAidjRsMi5zZ21sIgotaW5kZW50LXRhYnMtbW9kZTogbmlsCi1FbmQ6Ci0tLT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLW92ZXJsYXkueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2Mtb3ZlcmxheS54bWwKc2ltaWxhcml0eSBpbmRleCA5MCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2Mtb3ZlcmxheS54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLW92ZXJsYXkueG1sCmluZGV4IDEwMzZjNTguLjI1MGE3ZGUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLW92ZXJsYXkueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLW92ZXJsYXkueG1sCkBAIC02NSwxOSArNjUsMTAgQEAKICAgICAgIDx2YXJsaXN0ZW50cnk+CiAJPHRlcm0+PGVycm9yY29kZT5FSU5WQUw8L2Vycm9yY29kZT48L3Rlcm0+CiAJPGxpc3RpdGVtPgotCSAgPHBhcmE+VmlkZW8gb3ZlcmxheSBpcyBub3Qgc3VwcG9ydGVkLCBvciB0aGUKLXBhcmFtZXRlcnMgaGF2ZSBub3QgYmVlbiBzZXQgdXAuIFNlZSA8eHJlZgorCSAgPHBhcmE+VGhlIG92ZXJsYXkgcGFyYW1ldGVycyBoYXZlIG5vdCBiZWVuIHNldCB1cC4gU2VlIDx4cmVmCiBsaW5rZW5kPSJvdmVybGF5IiAvPiBmb3IgdGhlIG5lY2Vzc2FyeSBzdGVwcy48L3BhcmE+CiAJPC9saXN0aXRlbT4KICAgICAgIDwvdmFybGlzdGVudHJ5PgogICAgIDwvdmFyaWFibGVsaXN0PgogICA8L3JlZnNlY3QxPgogPC9yZWZlbnRyeT4KLQotPCEtLQotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogc2dtbAotc2dtbC1wYXJlbnQtZG9jdW1lbnQ6ICJ2NGwyLnNnbWwiCi1pbmRlbnQtdGFicy1tb2RlOiBuaWwKLUVuZDoKLS0tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtcWJ1Zi54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1xYnVmLnhtbApzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1xYnVmLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtcWJ1Zi54bWwKaW5kZXggZjJiMTFmOC4uOWNhYTQ5YSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtcWJ1Zi54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtcWJ1Zi54bWwKQEAgLTE1OCwxNSArMTU4LDYgQEAKIDxzdHJ1Y3RmaWVsZD51c2VycHRyPC9zdHJ1Y3RmaWVsZD4gb3IKIDxzdHJ1Y3RmaWVsZD5sZW5ndGg8L3N0cnVjdGZpZWxkPiBhcmUgaW52YWxpZC48L3BhcmE+CiAJPC9saXN0aXRlbT4KLSAgICAgIDwvdmFybGlzdGVudHJ5PgotICAgICAgPHZhcmxpc3RlbnRyeT4KLQk8dGVybT48ZXJyb3Jjb2RlPkVOT01FTTwvZXJyb3Jjb2RlPjwvdGVybT4KLQk8bGlzdGl0ZW0+Ci0JICA8cGFyYT5Ob3QgZW5vdWdoIHBoeXNpY2FsIG9yIHZpcnR1YWwgbWVtb3J5IHdhcyBhdmFpbGFibGUgdG8KLWVucXVldWUgYSB1c2VyIHBvaW50ZXIgYnVmZmVyLjwvcGFyYT4KLQk8L2xpc3RpdGVtPgotICAgICAgPC92YXJsaXN0ZW50cnk+Ci0gICAgICA8dmFybGlzdGVudHJ5PgogCTx0ZXJtPjxlcnJvcmNvZGU+RUlPPC9lcnJvcmNvZGU+PC90ZXJtPgogCTxsaXN0aXRlbT4KIAkgIDxwYXJhPjxjb25zdGFudD5WSURJT0NfRFFCVUY8L2NvbnN0YW50PiBmYWlsZWQgZHVlIHRvIGFuCkBAIC0xODQsMTEgKzE3NSwzIEBACiAgICAgPC92YXJpYWJsZWxpc3Q+CiAgIDwvcmVmc2VjdDE+CiA8L3JlZmVudHJ5PgotCi08IS0tCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBzZ21sCi1zZ21sLXBhcmVudC1kb2N1bWVudDogInY0bDIuc2dtbCIKLWluZGVudC10YWJzLW1vZGU6IG5pbAotRW5kOgotLS0+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1xdWVyeS1kdi1wcmVzZXQueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtcXVlcnktZHYtcHJlc2V0LnhtbApzaW1pbGFyaXR5IGluZGV4IDc4JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1xdWVyeS1kdi1wcmVzZXQueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1xdWVyeS1kdi1wcmVzZXQueG1sCmluZGV4IGQyNzJmN2EuLjIzYjE3ZjYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXF1ZXJ5LWR2LXByZXNldC54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtcXVlcnktZHYtcHJlc2V0LnhtbApAQCAtNjEsMjcgKzYxLDUgQEAKIAogICA8cmVmc2VjdDE+CiAgICAgJnJldHVybi12YWx1ZTsKLSAgICA8dmFyaWFibGVsaXN0PgotICAgICAgPHZhcmxpc3RlbnRyeT4KLQk8dGVybT48ZXJyb3Jjb2RlPkVJTlZBTDwvZXJyb3Jjb2RlPjwvdGVybT4KLQk8bGlzdGl0ZW0+Ci0JICA8cGFyYT5UaGlzIGlvY3RsIGlzIG5vdCBzdXBwb3J0ZWQuPC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgPC92YXJsaXN0ZW50cnk+Ci0gICAgICA8dmFybGlzdGVudHJ5PgotCTx0ZXJtPjxlcnJvcmNvZGU+RUJVU1k8L2Vycm9yY29kZT48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+VGhlIGRldmljZSBpcyBidXN5IGFuZCB0aGVyZWZvcmUgY2FuIG5vdCBzZW5zZSB0aGUgcHJlc2V0PC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICA8L3ZhcmlhYmxlbGlzdD4KICAgPC9yZWZzZWN0MT4KIDwvcmVmZW50cnk+Ci0KLTwhLS0KLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IHNnbWwKLXNnbWwtcGFyZW50LWRvY3VtZW50OiAidjRsMi5zZ21sIgotaW5kZW50LXRhYnMtbW9kZTogbmlsCi1FbmQ6Ci0tLT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXF1ZXJ5YnVmLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLXF1ZXJ5YnVmLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtcXVlcnlidWYueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1xdWVyeWJ1Zi54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXF1ZXJ5Y2FwLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLXF1ZXJ5Y2FwLnhtbApzaW1pbGFyaXR5IGluZGV4IDkzJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1xdWVyeWNhcC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLXF1ZXJ5Y2FwLnhtbAppbmRleCBmMjlmMWI4Li5lMzY2NGQ2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1xdWVyeWNhcC54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtcXVlcnljYXAueG1sCkBAIC02Nyw5ICs2Nyw4IEBACiAJICAgIDxlbnRyeT48cGFyYT5OYW1lIG9mIHRoZSBkcml2ZXIsIGEgdW5pcXVlIE5VTC10ZXJtaW5hdGVkCiBBU0NJSSBzdHJpbmcuIEZvciBleGFtcGxlOiAiYnR0diIuIERyaXZlciBzcGVjaWZpYyBhcHBsaWNhdGlvbnMgY2FuCiB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byB2ZXJpZnkgdGhlIGRyaXZlciBpZGVudGl0eS4gSXQgaXMgYWxzbyB1c2VmdWwKLXRvIHdvcmsgYXJvdW5kIGtub3duIGJ1Z3MsIG9yIHRvIGlkZW50aWZ5IGRyaXZlcnMgaW4gZXJyb3IgcmVwb3J0cy4KLVRoZSBkcml2ZXIgdmVyc2lvbiBpcyBzdG9yZWQgaW4gdGhlIDxzdHJ1Y3RmaWVsZD52ZXJzaW9uPC9zdHJ1Y3RmaWVsZD4KLWZpZWxkLjwvcGFyYT48cGFyYT5TdG9yaW5nIHN0cmluZ3MgaW4gZml4ZWQgc2l6ZWQgYXJyYXlzIGlzIGJhZAordG8gd29yayBhcm91bmQga25vd24gYnVncywgb3IgdG8gaWRlbnRpZnkgZHJpdmVycyBpbiBlcnJvciByZXBvcnRzLjwvcGFyYT4KKzxwYXJhPlN0b3Jpbmcgc3RyaW5ncyBpbiBmaXhlZCBzaXplZCBhcnJheXMgaXMgYmFkCiBwcmFjdGljZSBidXQgdW5hdm9pZGFibGUgaGVyZS4gRHJpdmVycyBhbmQgYXBwbGljYXRpb25zIHNob3VsZCB0YWtlCiBwcmVjYXV0aW9ucyB0byBuZXZlciByZWFkIG9yIHdyaXRlIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBhcnJheSBhbmQgdG8KIG1ha2Ugc3VyZSB0aGUgc3RyaW5ncyBhcmUgcHJvcGVybHkgTlVMLXRlcm1pbmF0ZWQuPC9wYXJhPjwvZW50cnk+CkBAIC0xMDAsOSArOTksMTMgQEAKIAkgIDxyb3c+CiAJICAgIDxlbnRyeT5fX3UzMjwvZW50cnk+CiAJICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+dmVyc2lvbjwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KLQkgICAgPGVudHJ5PjxwYXJhPlZlcnNpb24gbnVtYmVyIG9mIHRoZSBkcml2ZXIuIFRvZ2V0aGVyIHdpdGgKLXRoZSA8c3RydWN0ZmllbGQ+ZHJpdmVyPC9zdHJ1Y3RmaWVsZD4gZmllbGQgdGhpcyBpZGVudGlmaWVzIGEKLXBhcnRpY3VsYXIgZHJpdmVyLiBUaGUgdmVyc2lvbiBudW1iZXIgaXMgZm9ybWF0dGVkIHVzaW5nIHRoZQorCSAgICA8ZW50cnk+PHBhcmE+VmVyc2lvbiBudW1iZXIgb2YgdGhlIGRyaXZlci48L3BhcmE+Cis8cGFyYT5TdGFydGluZyBvbiBrZXJuZWwgMy4xLCB0aGUgdmVyc2lvbiByZXBvcnRlZCBpcyBwcm92aWRlZCBwZXIKK1Y0TDIgc3Vic3lzdGVtLCBmb2xsb3dpbmcgdGhlIHNhbWUgS2VybmVsIG51bWJlcmF0aW9uIHNjaGVtZS4gSG93ZXZlciwgaXQKK3Nob3VsZCBub3QgYWx3YXlzIHJldHVybiB0aGUgc2FtZSB2ZXJzaW9uIGFzIHRoZSBrZXJuZWwsIGlmLCBmb3IgZXhhbXBsZSwKK2FuIHN0YWJsZSBvciBkaXN0cmlidXRpb24tbW9kaWZpZWQga2VybmVsIHVzZXMgdGhlIFY0TDIgc3RhY2sgZnJvbSBhCituZXdlciBrZXJuZWwuPC9wYXJhPgorPHBhcmE+VGhlIHZlcnNpb24gbnVtYmVyIGlzIGZvcm1hdHRlZCB1c2luZyB0aGUKIDxjb25zdGFudD5LRVJORUxfVkVSU0lPTigpPC9jb25zdGFudD4gbWFjcm86PC9wYXJhPjwvZW50cnk+CiAJICA8L3Jvdz4KIAkgIDxyb3c+CkBAIC0yODAsMjQgKzI4Myw1IEBACiAKICAgPHJlZnNlY3QxPgogICAgICZyZXR1cm4tdmFsdWU7Ci0KLSAgICA8dmFyaWFibGVsaXN0PgotICAgICAgPHZhcmxpc3RlbnRyeT4KLQk8dGVybT48ZXJyb3Jjb2RlPkVJTlZBTDwvZXJyb3Jjb2RlPjwvdGVybT4KLQk8bGlzdGl0ZW0+Ci0JICA8cGFyYT5UaGUgZGV2aWNlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhpcwotc3BlY2lmaWNhdGlvbi48L3BhcmE+Ci0JPC9saXN0aXRlbT4KLSAgICAgIDwvdmFybGlzdGVudHJ5PgotICAgIDwvdmFyaWFibGVsaXN0PgogICA8L3JlZnNlY3QxPgogPC9yZWZlbnRyeT4KLQotPCEtLQotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogc2dtbAotc2dtbC1wYXJlbnQtZG9jdW1lbnQ6ICJ2NGwyLnNnbWwiCi1pbmRlbnQtdGFicy1tb2RlOiBuaWwKLUVuZDoKLS0tPgotCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1xdWVyeWN0cmwueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtcXVlcnljdHJsLnhtbApzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1xdWVyeWN0cmwueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1xdWVyeWN0cmwueG1sCmluZGV4IDBkNWU4MjguLjY3N2VhNjQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXF1ZXJ5Y3RybC54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtcXVlcnljdHJsLnhtbApAQCAtMTU2LDcgKzE1Niw4IEBACiAJICAgIDxlbnRyeT5NYXhpbXVtIHZhbHVlLCBpbmNsdXNpdmUuIFRoaXMgZmllbGQgZ2l2ZXMgYW4gdXBwZXIKIGJvdW5kIGZvciA8Y29uc3RhbnQ+VjRMMl9DVFJMX1RZUEVfSU5URUdFUjwvY29uc3RhbnQ+IGNvbnRyb2xzIGFuZCB0aGUKIGhpZ2hlc3QgdmFsaWQgaW5kZXggZm9yIDxjb25zdGFudD5WNEwyX0NUUkxfVFlQRV9NRU5VPC9jb25zdGFudD4KLWNvbnRyb2xzLgorY29udHJvbHMuIEZvciA8Y29uc3RhbnQ+VjRMMl9DVFJMX1RZUEVfQklUTUFTSzwvY29uc3RhbnQ+IGNvbnRyb2xzIGl0IGlzIHRoZQorc2V0IG9mIHVzYWJsZSBiaXRzLgogRm9yIDxjb25zdGFudD5WNEwyX0NUUkxfVFlQRV9TVFJJTkc8L2NvbnN0YW50PiBjb250cm9scyB0aGUgbWF4aW11bSB2YWx1ZQogZ2l2ZXMgdGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBzdHJpbmcuIFRoaXMgbGVuZ3RoIDxlbXBoYXNpcz5kb2VzIG5vdCBpbmNsdWRlIHRoZSB0ZXJtaW5hdGluZwogemVybzwvZW1waGFzaXM+LiBJdCBtYXkgbm90IGJlIHZhbGlkIGZvciBhbnkgb3RoZXIgdHlwZSBvZiBjb250cm9sLCBpbmNsdWRpbmcKQEAgLTI5MSw2ICsyOTIsMTUgQEAKIDxjb25zdGFudD5WSURJT0NfUVVFUllNRU5VPC9jb25zdGFudD4gaW9jdGwuPC9lbnRyeT4KIAkgIDwvcm93PgogCSAgPHJvdz4KKwkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX0NUUkxfVFlQRV9CSVRNQVNLPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+MDwvZW50cnk+CisJICAgIDxlbnRyeT5uL2E8L2VudHJ5PgorCSAgICA8ZW50cnk+YW55PC9lbnRyeT4KKwkgICAgPGVudHJ5PkEgYml0bWFzayBmaWVsZC4gVGhlIG1heGltdW0gdmFsdWUgaXMgdGhlIHNldCBvZiBiaXRzIHRoYXQgY2FuCitiZSB1c2VkLCBhbGwgb3RoZXIgYml0cyBhcmUgdG8gYmUgMC4gVGhlIG1heGltdW0gdmFsdWUgaXMgaW50ZXJwcmV0ZWQgYXMgYSBfX3UzMiwKK2FsbG93aW5nIHRoZSB1c2Ugb2YgYml0IDMxIGluIHRoZSBiaXRtYXNrLjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CiAJICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9DVFJMX1RZUEVfQlVUVE9OPC9jb25zdGFudD48L2VudHJ5PgogCSAgICA8ZW50cnk+MDwvZW50cnk+CiAJICAgIDxlbnRyeT4wPC9lbnRyeT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXF1ZXJ5c3RkLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLXF1ZXJ5c3RkLnhtbApzaW1pbGFyaXR5IGluZGV4IDc4JQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1xdWVyeXN0ZC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLXF1ZXJ5c3RkLnhtbAppbmRleCAxYTllNjAzLi40Yjc5YzdjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1xdWVyeXN0ZC54bWwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtcXVlcnlzdGQueG1sCkBAIC02MiwyOCArNjIsNSBAQAogCiAgIDxyZWZzZWN0MT4KICAgICAmcmV0dXJuLXZhbHVlOwotCi0gICAgPHZhcmlhYmxlbGlzdD4KLSAgICAgIDx2YXJsaXN0ZW50cnk+Ci0JPHRlcm0+PGVycm9yY29kZT5FSU5WQUw8L2Vycm9yY29kZT48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+VGhpcyBpb2N0bCBpcyBub3Qgc3VwcG9ydGVkLjwvcGFyYT4KLQk8L2xpc3RpdGVtPgotICAgICAgPC92YXJsaXN0ZW50cnk+Ci0gICAgICA8dmFybGlzdGVudHJ5PgotCTx0ZXJtPjxlcnJvcmNvZGU+RUJVU1k8L2Vycm9yY29kZT48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+VGhlIGRldmljZSBpcyBidXN5IGFuZCB0aGVyZWZvcmUgY2FuIG5vdCBkZXRlY3QgdGhlIHN0YW5kYXJkPC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICA8L3ZhcmlhYmxlbGlzdD4KICAgPC9yZWZzZWN0MT4KIDwvcmVmZW50cnk+Ci0KLTwhLS0KLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IHNnbWwKLXNnbWwtcGFyZW50LWRvY3VtZW50OiAidjRsMi5zZ21sIgotaW5kZW50LXRhYnMtbW9kZTogbmlsCi1FbmQ6Ci0tLT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXJlcWJ1ZnMueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2MtcmVxYnVmcy54bWwKc2ltaWxhcml0eSBpbmRleCA5MiUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2MtcmVxYnVmcy54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLXJlcWJ1ZnMueG1sCmluZGV4IDY5ODAwYWUuLjdiZTRiMWQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXJlcWJ1ZnMueG1sCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLXJlcWJ1ZnMueG1sCkBAIC0xMjIsMTQgKzEyMiw2IEBACiAKICAgICA8dmFyaWFibGVsaXN0PgogICAgICAgPHZhcmxpc3RlbnRyeT4KLQk8dGVybT48ZXJyb3Jjb2RlPkVCVVNZPC9lcnJvcmNvZGU+PC90ZXJtPgotCTxsaXN0aXRlbT4KLQkgIDxwYXJhPlRoZSBkcml2ZXIgc3VwcG9ydHMgbXVsdGlwbGUgb3BlbnMgYW5kIEkvTyBpcyBhbHJlYWR5Ci1pbiBwcm9ncmVzcywgb3IgcmVhbGxvY2F0aW9uIG9mIGJ1ZmZlcnMgd2FzIGF0dGVtcHRlZCBhbHRob3VnaCBvbmUgb3IKLW1vcmUgYXJlIHN0aWxsIG1hcHBlZC48L3BhcmE+Ci0JPC9saXN0aXRlbT4KLSAgICAgIDwvdmFybGlzdGVudHJ5PgotICAgICAgPHZhcmxpc3RlbnRyeT4KIAk8dGVybT48ZXJyb3Jjb2RlPkVJTlZBTDwvZXJyb3Jjb2RlPjwvdGVybT4KIAk8bGlzdGl0ZW0+CiAJICA8cGFyYT5UaGUgYnVmZmVyIHR5cGUgKDxzdHJ1Y3RmaWVsZD50eXBlPC9zdHJ1Y3RmaWVsZD4gZmllbGQpIG9yIHRoZQpAQCAtMTQwLDExICsxMzIsMyBAQAogICAgIDwvdmFyaWFibGVsaXN0PgogICA8L3JlZnNlY3QxPgogPC9yZWZlbnRyeT4KLQotPCEtLQotTG9jYWwgVmFyaWFibGVzOgotbW9kZTogc2dtbAotc2dtbC1wYXJlbnQtZG9jdW1lbnQ6ICJ2NGwyLnNnbWwiCi1pbmRlbnQtdGFicy1tb2RlOiBuaWwKLUVuZDoKLS0tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2Mtcy1ody1mcmVxLXNlZWsueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2Mtcy1ody1mcmVxLXNlZWsueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1zLWh3LWZyZXEtc2Vlay54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLXMtaHctZnJlcS1zZWVrLnhtbApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2Mtc3RyZWFtb24ueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2Mtc3RyZWFtb24ueG1sCnNpbWlsYXJpdHkgaW5kZXggOTElCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXN0cmVhbW9uLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2Mtc3RyZWFtb24ueG1sCmluZGV4IDc1ZWQzOWIuLjgxY2NhNDUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXN0cmVhbW9uLnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1zdHJlYW1vbi54bWwKQEAgLTg4LDkgKzg4LDkgQEAKICAgICAgIDx2YXJsaXN0ZW50cnk+CiAJPHRlcm0+PGVycm9yY29kZT5FSU5WQUw8L2Vycm9yY29kZT48L3Rlcm0+CiAJPGxpc3RpdGVtPgotCSAgPHBhcmE+U3RyZWFtaW5nIEkvTyBpcyBub3Qgc3VwcG9ydGVkLCB0aGUgYnVmZmVyCi08c3RydWN0ZmllbGQ+dHlwZTwvc3RydWN0ZmllbGQ+IGlzIG5vdCBzdXBwb3J0ZWQsIG9yIG5vIGJ1ZmZlcnMgaGF2ZQotYmVlbiBhbGxvY2F0ZWQgKG1lbW9yeSBtYXBwaW5nKSBvciBlbnF1ZXVlZCAob3V0cHV0KSB5ZXQuPC9wYXJhPgorCSAgPHBhcmE+VGhlIGJ1ZmZlcjxzdHJ1Y3RmaWVsZD50eXBlPC9zdHJ1Y3RmaWVsZD4gaXMgbm90IHN1cHBvcnRlZCwKKwkgIG9yIG5vIGJ1ZmZlcnMgaGF2ZSBiZWVuIGFsbG9jYXRlZCAobWVtb3J5IG1hcHBpbmcpIG9yIGVucXVldWVkCisJICAob3V0cHV0KSB5ZXQuPC9wYXJhPgogCTwvbGlzdGl0ZW0+CiAgICAgICA8L3Zhcmxpc3RlbnRyeT4KICAgICAgIDx2YXJsaXN0ZW50cnk+CkBAIC0xMDUsMTEgKzEwNSwzIEBACiAgICAgPC92YXJpYWJsZWxpc3Q+CiAgIDwvcmVmc2VjdDE+CiA8L3JlZmVudHJ5PgotCi08IS0tCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBzZ21sCi1zZ21sLXBhcmVudC1kb2N1bWVudDogInY0bDIuc2dtbCIKLWluZGVudC10YWJzLW1vZGU6IG5pbAotRW5kOgotLS0+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1zdWJkZXYtZW51bS1mcmFtZS1pbnRlcnZhbC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1zdWJkZXYtZW51bS1mcmFtZS1pbnRlcnZhbC54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXN1YmRldi1lbnVtLWZyYW1lLWludGVydmFsLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2Mtc3ViZGV2LWVudW0tZnJhbWUtaW50ZXJ2YWwueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1zdWJkZXYtZW51bS1mcmFtZS1zaXplLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLXN1YmRldi1lbnVtLWZyYW1lLXNpemUueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1zdWJkZXYtZW51bS1mcmFtZS1zaXplLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2Mtc3ViZGV2LWVudW0tZnJhbWUtc2l6ZS54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXN1YmRldi1lbnVtLW1idXMtY29kZS54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1zdWJkZXYtZW51bS1tYnVzLWNvZGUueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1zdWJkZXYtZW51bS1tYnVzLWNvZGUueG1sCnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1zdWJkZXYtZW51bS1tYnVzLWNvZGUueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1zdWJkZXYtZy1jcm9wLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLXN1YmRldi1nLWNyb3AueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBEb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1zdWJkZXYtZy1jcm9wLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2Mtc3ViZGV2LWctY3JvcC54bWwKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXN1YmRldi1nLWZtdC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1zdWJkZXYtZy1mbXQueG1sCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXN1YmRldi1nLWZtdC54bWwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92NGwvdmlkaW9jLXN1YmRldi1nLWZtdC54bWwKaW5kZXggZjM2N2M1Ny4uYTY3Y2RlNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92aWRpb2Mtc3ViZGV2LWctZm10LnhtbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1zdWJkZXYtZy1mbXQueG1sCkBAIC0xNzcsNCArMTc3LDcgQEAKICAgICAgIDwvdmFybGlzdGVudHJ5PgogICAgIDwvdmFyaWFibGVsaXN0PgogICA8L3JlZnNlY3QxPgorICA8cmVmc2VjdDE+CisgICAgJnJldHVybi12YWx1ZTsKKyAgPC9yZWZzZWN0MT4KIDwvcmVmZW50cnk+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1zdWJkZXYtZy1mcmFtZS1pbnRlcnZhbC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1zdWJkZXYtZy1mcmFtZS1pbnRlcnZhbC54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXN1YmRldi1nLWZyYW1lLWludGVydmFsLnhtbApyZW5hbWUgdG8gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2Mtc3ViZGV2LWctZnJhbWUtaW50ZXJ2YWwueG1sCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdjRsL3ZpZGlvYy1zdWJzY3JpYmUtZXZlbnQueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2Mtc3Vic2NyaWJlLWV2ZW50LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWMwZDhhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhL3Y0bC92aWRpb2Mtc3Vic2NyaWJlLWV2ZW50LnhtbApAQCAtMCwwICsxLDI5NyBAQAorPHJlZmVudHJ5IGlkPSJ2aWRpb2Mtc3Vic2NyaWJlLWV2ZW50Ij4KKyAgPHJlZm1ldGE+CisgICAgPHJlZmVudHJ5dGl0bGU+aW9jdGwgVklESU9DX1NVQlNDUklCRV9FVkVOVCwgVklESU9DX1VOU1VCU0NSSUJFX0VWRU5UPC9yZWZlbnRyeXRpdGxlPgorICAgICZtYW52b2w7CisgIDwvcmVmbWV0YT4KKworICA8cmVmbmFtZWRpdj4KKyAgICA8cmVmbmFtZT5WSURJT0NfU1VCU0NSSUJFX0VWRU5ULCBWSURJT0NfVU5TVUJTQ1JJQkVfRVZFTlQ8L3JlZm5hbWU+CisgICAgPHJlZnB1cnBvc2U+U3Vic2NyaWJlIG9yIHVuc3Vic2NyaWJlIGV2ZW50PC9yZWZwdXJwb3NlPgorICA8L3JlZm5hbWVkaXY+CisKKyAgPHJlZnN5bm9wc2lzZGl2PgorICAgIDxmdW5jc3lub3BzaXM+CisgICAgICA8ZnVuY3Byb3RvdHlwZT4KKwk8ZnVuY2RlZj5pbnQgPGZ1bmN0aW9uPmlvY3RsPC9mdW5jdGlvbj48L2Z1bmNkZWY+CisJPHBhcmFtZGVmPmludCA8cGFyYW1ldGVyPmZkPC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KKwk8cGFyYW1kZWY+aW50IDxwYXJhbWV0ZXI+cmVxdWVzdDwvcGFyYW1ldGVyPjwvcGFyYW1kZWY+CisJPHBhcmFtZGVmPnN0cnVjdCB2NGwyX2V2ZW50X3N1YnNjcmlwdGlvbgorKjxwYXJhbWV0ZXI+YXJncDwvcGFyYW1ldGVyPjwvcGFyYW1kZWY+CisgICAgICA8L2Z1bmNwcm90b3R5cGU+CisgICAgPC9mdW5jc3lub3BzaXM+CisgIDwvcmVmc3lub3BzaXNkaXY+CisKKyAgPHJlZnNlY3QxPgorICAgIDx0aXRsZT5Bcmd1bWVudHM8L3RpdGxlPgorCisgICAgPHZhcmlhYmxlbGlzdD4KKyAgICAgIDx2YXJsaXN0ZW50cnk+CisJPHRlcm0+PHBhcmFtZXRlcj5mZDwvcGFyYW1ldGVyPjwvdGVybT4KKwk8bGlzdGl0ZW0+CisJICA8cGFyYT4mZmQ7PC9wYXJhPgorCTwvbGlzdGl0ZW0+CisgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICAgIDx2YXJsaXN0ZW50cnk+CisJPHRlcm0+PHBhcmFtZXRlcj5yZXF1ZXN0PC9wYXJhbWV0ZXI+PC90ZXJtPgorCTxsaXN0aXRlbT4KKwkgIDxwYXJhPlZJRElPQ19TVUJTQ1JJQkVfRVZFTlQsIFZJRElPQ19VTlNVQlNDUklCRV9FVkVOVDwvcGFyYT4KKwk8L2xpc3RpdGVtPgorICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICA8dmFybGlzdGVudHJ5PgorCTx0ZXJtPjxwYXJhbWV0ZXI+YXJncDwvcGFyYW1ldGVyPjwvdGVybT4KKwk8bGlzdGl0ZW0+CisJICA8cGFyYT48L3BhcmE+CisJPC9saXN0aXRlbT4KKyAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgIDwvdmFyaWFibGVsaXN0PgorICA8L3JlZnNlY3QxPgorCisgIDxyZWZzZWN0MT4KKyAgICA8dGl0bGU+RGVzY3JpcHRpb248L3RpdGxlPgorCisgICAgPHBhcmE+U3Vic2NyaWJlIG9yIHVuc3Vic2NyaWJlIFY0TDIgZXZlbnQuIFN1YnNjcmliZWQgZXZlbnRzIGFyZQorICAgIGRlcXVldWVkIGJ5IHVzaW5nIHRoZSAmVklESU9DLURRRVZFTlQ7IGlvY3RsLjwvcGFyYT4KKworICAgIDx0YWJsZSBmcmFtZT0ibm9uZSIgcGd3aWRlPSIxIiBpZD0idjRsMi1ldmVudC1zdWJzY3JpcHRpb24iPgorICAgICAgPHRpdGxlPnN0cnVjdCA8c3RydWN0bmFtZT52NGwyX2V2ZW50X3N1YnNjcmlwdGlvbjwvc3RydWN0bmFtZT48L3RpdGxlPgorICAgICAgPHRncm91cCBjb2xzPSIzIj4KKwkmY3Mtc3RyOworCTx0Ym9keSB2YWxpZ249InRvcCI+CisJICA8cm93PgorCSAgICA8ZW50cnk+X191MzI8L2VudHJ5PgorCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPnR5cGU8L3N0cnVjdGZpZWxkPjwvZW50cnk+CisJICAgIDxlbnRyeT5UeXBlIG9mIHRoZSBldmVudC48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnk+X191MzI8L2VudHJ5PgorCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPmlkPC9zdHJ1Y3RmaWVsZD48L2VudHJ5PgorCSAgICA8ZW50cnk+SUQgb2YgdGhlIGV2ZW50IHNvdXJjZS4gSWYgdGhlcmUgaXMgbm8gSUQgYXNzb2NpYXRlZCB3aXRoCisJCXRoZSBldmVudCBzb3VyY2UsIHRoZW4gc2V0IHRoaXMgdG8gMC4gV2hldGhlciBvciBub3QgYW4gZXZlbnQKKwkJbmVlZHMgYW4gSUQgZGVwZW5kcyBvbiB0aGUgZXZlbnQgdHlwZS48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnk+X191MzI8L2VudHJ5PgorCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPmZsYWdzPC9zdHJ1Y3RmaWVsZD48L2VudHJ5PgorCSAgICA8ZW50cnk+RXZlbnQgZmxhZ3MsIHNlZSA8eHJlZiBsaW5rZW5kPSJldmVudC1mbGFncyIgLz4uPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pl9fdTMyPC9lbnRyeT4KKwkgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5yZXNlcnZlZDwvc3RydWN0ZmllbGQ+WzVdPC9lbnRyeT4KKwkgICAgPGVudHJ5PlJlc2VydmVkIGZvciBmdXR1cmUgZXh0ZW5zaW9ucy4gRHJpdmVycyBhbmQgYXBwbGljYXRpb25zCisJICAgIG11c3Qgc2V0IHRoZSBhcnJheSB0byB6ZXJvLjwvZW50cnk+CisJICA8L3Jvdz4KKwk8L3Rib2R5PgorICAgICAgPC90Z3JvdXA+CisgICAgPC90YWJsZT4KKworICAgIDx0YWJsZSBmcmFtZT0ibm9uZSIgcGd3aWRlPSIxIiBpZD0iZXZlbnQtdHlwZSI+CisgICAgICA8dGl0bGU+RXZlbnQgVHlwZXM8L3RpdGxlPgorICAgICAgPHRncm91cCBjb2xzPSIzIj4KKwkmY3MtZGVmOworCTx0Ym9keSB2YWxpZ249InRvcCI+CisJICA8cm93PgorCSAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfRVZFTlRfQUxMPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+MDwvZW50cnk+CisJICAgIDxlbnRyeT5BbGwgZXZlbnRzLiBWNEwyX0VWRU5UX0FMTCBpcyB2YWxpZCBvbmx5IGZvcgorCSAgICBWSURJT0NfVU5TVUJTQ1JJQkVfRVZFTlQgZm9yIHVuc3Vic2NyaWJpbmcgYWxsIGV2ZW50cyBhdCBvbmNlLgorCSAgICA8L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfRVZFTlRfVlNZTkM8L2NvbnN0YW50PjwvZW50cnk+CisJICAgIDxlbnRyeT4xPC9lbnRyeT4KKwkgICAgPGVudHJ5PlRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIG9uIHRoZSB2ZXJ0aWNhbCBzeW5jLgorCSAgICBUaGlzIGV2ZW50IGhhcyBhICZ2NGwyLWV2ZW50LXZzeW5jOyBhc3NvY2lhdGVkIHdpdGggaXQuCisJICAgIDwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9FVkVOVF9FT1M8L2NvbnN0YW50PjwvZW50cnk+CisJICAgIDxlbnRyeT4yPC9lbnRyeT4KKwkgICAgPGVudHJ5PlRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIGVuZCBvZiBhIHN0cmVhbSBpcyByZWFjaGVkLgorCSAgICBUaGlzIGlzIHR5cGljYWxseSB1c2VkIHdpdGggTVBFRyBkZWNvZGVycyB0byByZXBvcnQgdG8gdGhlIGFwcGxpY2F0aW9uCisJICAgIHdoZW4gdGhlIGxhc3Qgb2YgdGhlIE1QRUcgc3RyZWFtIGhhcyBiZWVuIGRlY29kZWQuCisJICAgIDwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9FVkVOVF9DVFJMPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+MzwvZW50cnk+CisJICAgIDxlbnRyeT48cGFyYT5UaGlzIGV2ZW50IHJlcXVpcmVzIHRoYXQgdGhlIDxzdHJ1Y3RmaWVsZD5pZDwvc3RydWN0ZmllbGQ+CisJCW1hdGNoZXMgdGhlIGNvbnRyb2wgSUQgZnJvbSB3aGljaCB5b3Ugd2FudCB0byByZWNlaXZlIGV2ZW50cy4KKwkJVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgaWYgdGhlIGNvbnRyb2wncyB2YWx1ZSBjaGFuZ2VzLCBpZiBhCisJCWJ1dHRvbiBjb250cm9sIGlzIHByZXNzZWQgb3IgaWYgdGhlIGNvbnRyb2wncyBmbGFncyBjaGFuZ2UuCisJICAgIAlUaGlzIGV2ZW50IGhhcyBhICZ2NGwyLWV2ZW50LWN0cmw7IGFzc29jaWF0ZWQgd2l0aCBpdC4gVGhpcyBzdHJ1Y3QKKwkJY29udGFpbnMgbXVjaCBvZiB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyAmdjRsMi1xdWVyeWN0cmw7IGFuZAorCQkmdjRsMi1jb250cm9sOy48L3BhcmE+CisKKwkJPHBhcmE+SWYgdGhlIGV2ZW50IGlzIGdlbmVyYXRlZCBkdWUgdG8gYSBjYWxsIHRvICZWSURJT0MtUy1DVFJMOyBvcgorCQkmVklESU9DLVMtRVhULUNUUkxTOywgdGhlbiB0aGUgZXZlbnQgd2lsbCA8ZW1waGFzaXM+bm90PC9lbXBoYXNpcz4gYmUgc2VudCB0bworCQl0aGUgZmlsZSBoYW5kbGUgdGhhdCBjYWxsZWQgdGhlIGlvY3RsIGZ1bmN0aW9uLiBUaGlzIHByZXZlbnRzCisJCW5hc3R5IGZlZWRiYWNrIGxvb3BzLiBJZiB5b3UgPGVtcGhhc2lzPmRvPC9lbXBoYXNpcz4gd2FudCB0byBnZXQgdGhlCisJCWV2ZW50LCB0aGVuIHNldCB0aGUgPGNvbnN0YW50PlY0TDJfRVZFTlRfU1VCX0ZMX0FMTE9XX0ZFRURCQUNLPC9jb25zdGFudD4KKwkJZmxhZy4KKwkJPC9wYXJhPgorCisJCTxwYXJhPlRoaXMgZXZlbnQgdHlwZSB3aWxsIGVuc3VyZSB0aGF0IG5vIGluZm9ybWF0aW9uIGlzIGxvc3Qgd2hlbgorCQltb3JlIGV2ZW50cyBhcmUgcmFpc2VkIHRoYW4gdGhlcmUgaXMgcm9vbSBpbnRlcm5hbGx5LiBJbiB0aGF0CisJCWNhc2UgdGhlICZ2NGwyLWV2ZW50LWN0cmw7IG9mIHRoZSBzZWNvbmQtb2xkZXN0IGV2ZW50IGlzIGtlcHQsCisJCWJ1dCB0aGUgPHN0cnVjdGZpZWxkPmNoYW5nZXM8L3N0cnVjdGZpZWxkPiBmaWVsZCBvZiB0aGUKKwkJc2Vjb25kLW9sZGVzdCBldmVudCBpcyBPUmVkIHdpdGggdGhlIDxzdHJ1Y3RmaWVsZD5jaGFuZ2VzPC9zdHJ1Y3RmaWVsZD4KKwkJZmllbGQgb2YgdGhlIG9sZGVzdCBldmVudC48L3BhcmE+CisJICAgIDwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9FVkVOVF9QUklWQVRFX1NUQVJUPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+MHgwODAwMDAwMDwvZW50cnk+CisJICAgIDxlbnRyeT5CYXNlIGV2ZW50IG51bWJlciBmb3IgZHJpdmVyLXByaXZhdGUgZXZlbnRzLjwvZW50cnk+CisJICA8L3Jvdz4KKwk8L3Rib2R5PgorICAgICAgPC90Z3JvdXA+CisgICAgPC90YWJsZT4KKworICAgIDx0YWJsZSBwZ3dpZGU9IjEiIGZyYW1lPSJub25lIiBpZD0iZXZlbnQtZmxhZ3MiPgorICAgICAgPHRpdGxlPkV2ZW50IEZsYWdzPC90aXRsZT4KKyAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisJJmNzLWRlZjsKKwk8dGJvZHkgdmFsaWduPSJ0b3AiPgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX0VWRU5UX1NVQl9GTF9TRU5EX0lOSVRJQUw8L2NvbnN0YW50PjwvZW50cnk+CisJICAgIDxlbnRyeT4weDAwMDE8L2VudHJ5PgorCSAgICA8ZW50cnk+V2hlbiB0aGlzIGV2ZW50IGlzIHN1YnNjcmliZWQgYW4gaW5pdGlhbCBldmVudCB3aWxsIGJlIHNlbnQKKwkJY29udGFpbmluZyB0aGUgY3VycmVudCBzdGF0dXMuIFRoaXMgb25seSBtYWtlcyBzZW5zZSBmb3IgZXZlbnRzCisJCXRoYXQgYXJlIHRyaWdnZXJlZCBieSBhIHN0YXR1cyBjaGFuZ2Ugc3VjaCBhcyA8Y29uc3RhbnQ+VjRMMl9FVkVOVF9DVFJMPC9jb25zdGFudD4uCisJCU90aGVyIGV2ZW50cyB3aWxsIGlnbm9yZSB0aGlzIGZsYWcuPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pjxjb25zdGFudD5WNEwyX0VWRU5UX1NVQl9GTF9BTExPV19GRUVEQkFDSzwvY29uc3RhbnQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PjB4MDAwMjwvZW50cnk+CisJICAgIDxlbnRyeT48cGFyYT5JZiBzZXQsIHRoZW4gZXZlbnRzIGRpcmVjdGx5IGNhdXNlZCBieSBhbiBpb2N0bCB3aWxsIGFsc28gYmUgc2VudCB0bworCQl0aGUgZmlsZWhhbmRsZSB0aGF0IGNhbGxlZCB0aGF0IGlvY3RsLiBGb3IgZXhhbXBsZSwgY2hhbmdpbmcgYSBjb250cm9sIHVzaW5nCisJCSZWSURJT0MtUy1DVFJMOyB3aWxsIGNhdXNlIGEgVjRMMl9FVkVOVF9DVFJMIHRvIGJlIHNlbnQgYmFjayB0byB0aGF0IHNhbWUKKwkJZmlsZWhhbmRsZS4gTm9ybWFsbHkgc3VjaCBldmVudHMgYXJlIHN1cHByZXNzZWQgdG8gcHJldmVudCBmZWVkYmFjayBsb29wcworCQl3aGVyZSBhbiBhcHBsaWNhdGlvbiBjaGFuZ2VzIGEgY29udHJvbCB0byBhIG9uZSB2YWx1ZSBhbmQgdGhlbiBhbm90aGVyLCBhbmQKKwkJdGhlbiByZWNlaXZlcyBhbiBldmVudCB0ZWxsaW5nIGl0IHRoYXQgdGhhdCBjb250cm9sIGhhcyBjaGFuZ2VkIHRvIHRoZSBmaXJzdAorCQl2YWx1ZS48L3BhcmE+CisKKwkJPHBhcmE+U2luY2UgaXQgY2FuJ3QgdGVsbCB3aGV0aGVyIHRoYXQgZXZlbnQgd2FzIGNhdXNlZCBieSBhbm90aGVyIGFwcGxpY2F0aW9uCisJCW9yIGJ5IHRoZSAmVklESU9DLVMtQ1RSTDsgY2FsbCBpdCBpcyBoYXJkIHRvIGRlY2lkZSB3aGV0aGVyIHRvIHNldCB0aGUKKwkJY29udHJvbCB0byB0aGUgdmFsdWUgaW4gdGhlIGV2ZW50LCBvciBpZ25vcmUgaXQuPC9wYXJhPgorCisJCTxwYXJhPlRoaW5rIGNhcmVmdWxseSB3aGVuIHlvdSBzZXQgdGhpcyBmbGFnIHNvIHlvdSB3b24ndCBnZXQgaW50byBzaXR1YXRpb25zCisJCWxpa2UgdGhhdC48L3BhcmE+CisJICAgIDwvZW50cnk+CisJICA8L3Jvdz4KKwk8L3Rib2R5PgorICAgICAgPC90Z3JvdXA+CisgICAgPC90YWJsZT4KKworICAgIDx0YWJsZSBmcmFtZT0ibm9uZSIgcGd3aWRlPSIxIiBpZD0idjRsMi1ldmVudC12c3luYyI+CisgICAgICA8dGl0bGU+c3RydWN0IDxzdHJ1Y3RuYW1lPnY0bDJfZXZlbnRfdnN5bmM8L3N0cnVjdG5hbWU+PC90aXRsZT4KKyAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisJJmNzLXN0cjsKKwk8dGJvZHkgdmFsaWduPSJ0b3AiPgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pl9fdTg8L2VudHJ5PgorCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPmZpZWxkPC9zdHJ1Y3RmaWVsZD48L2VudHJ5PgorCSAgICA8ZW50cnk+VGhlIHVwY29taW5nIGZpZWxkLiBTZWUgJnY0bDItZmllbGQ7LjwvZW50cnk+CisJICA8L3Jvdz4KKwk8L3Rib2R5PgorICAgICAgPC90Z3JvdXA+CisgICAgPC90YWJsZT4KKworICAgIDx0YWJsZSBmcmFtZT0ibm9uZSIgcGd3aWRlPSIxIiBpZD0idjRsMi1ldmVudC1jdHJsIj4KKyAgICAgIDx0aXRsZT5zdHJ1Y3QgPHN0cnVjdG5hbWU+djRsMl9ldmVudF9jdHJsPC9zdHJ1Y3RuYW1lPjwvdGl0bGU+CisgICAgICA8dGdyb3VwIGNvbHM9IjQiPgorCSZjcy1zdHI7CisJPHRib2R5IHZhbGlnbj0idG9wIj4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT5fX3UzMjwvZW50cnk+CisJICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+Y2hhbmdlczwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PjwvZW50cnk+CisJICAgIDxlbnRyeT5BIGJpdG1hc2sgdGhhdCB0ZWxscyB3aGF0IGhhcyBjaGFuZ2VkLiBTZWUgPHhyZWYgbGlua2VuZD0iY2hhbmdlcy1mbGFncyIgLz4uPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pl9fdTMyPC9lbnRyeT4KKwkgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD50eXBlPC9zdHJ1Y3RmaWVsZD48L2VudHJ5PgorCSAgICA8ZW50cnk+PC9lbnRyeT4KKwkgICAgPGVudHJ5PlRoZSB0eXBlIG9mIHRoZSBjb250cm9sLiBTZWUgJnY0bDItY3RybC10eXBlOy48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnk+dW5pb24gKGFub255bW91cyk8L2VudHJ5PgorCSAgICA8ZW50cnk+PC9lbnRyeT4KKwkgICAgPGVudHJ5PjwvZW50cnk+CisJICAgIDxlbnRyeT48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnk+PC9lbnRyeT4KKwkgICAgPGVudHJ5Pl9fczMyPC9lbnRyeT4KKwkgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD52YWx1ZTwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PlRoZSAzMi1iaXQgdmFsdWUgb2YgdGhlIGNvbnRyb2wgZm9yIDMyLWJpdCBjb250cm9sIHR5cGVzLgorCQlUaGlzIGlzIDAgZm9yIHN0cmluZyBjb250cm9scyBzaW5jZSB0aGUgdmFsdWUgb2YgYSBzdHJpbmcKKwkJY2Fubm90IGJlIHBhc3NlZCB1c2luZyAmVklESU9DLURRRVZFTlQ7LjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT48L2VudHJ5PgorCSAgICA8ZW50cnk+X19zNjQ8L2VudHJ5PgorCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPnZhbHVlNjQ8L3N0cnVjdGZpZWxkPjwvZW50cnk+CisJICAgIDxlbnRyeT5UaGUgNjQtYml0IHZhbHVlIG9mIHRoZSBjb250cm9sIGZvciA2NC1iaXQgY29udHJvbCB0eXBlcy48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnk+X191MzI8L2VudHJ5PgorCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPmZsYWdzPC9zdHJ1Y3RmaWVsZD48L2VudHJ5PgorCSAgICA8ZW50cnk+PC9lbnRyeT4KKwkgICAgPGVudHJ5PlRoZSBjb250cm9sIGZsYWdzLiBTZWUgPHhyZWYgbGlua2VuZD0iY29udHJvbC1mbGFncyIgLz4uPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pl9fczMyPC9lbnRyeT4KKwkgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5taW5pbXVtPC9zdHJ1Y3RmaWVsZD48L2VudHJ5PgorCSAgICA8ZW50cnk+PC9lbnRyeT4KKwkgICAgPGVudHJ5PlRoZSBtaW5pbXVtIHZhbHVlIG9mIHRoZSBjb250cm9sLiBTZWUgJnY0bDItcXVlcnljdHJsOy48L2VudHJ5PgorCSAgPC9yb3c+CisJICA8cm93PgorCSAgICA8ZW50cnk+X19zMzI8L2VudHJ5PgorCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPm1heGltdW08L3N0cnVjdGZpZWxkPjwvZW50cnk+CisJICAgIDxlbnRyeT48L2VudHJ5PgorCSAgICA8ZW50cnk+VGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIGNvbnRyb2wuIFNlZSAmdjRsMi1xdWVyeWN0cmw7LjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT5fX3MzMjwvZW50cnk+CisJICAgIDxlbnRyeT48c3RydWN0ZmllbGQ+c3RlcDwvc3RydWN0ZmllbGQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PjwvZW50cnk+CisJICAgIDxlbnRyeT5UaGUgc3RlcCB2YWx1ZSBvZiB0aGUgY29udHJvbC4gU2VlICZ2NGwyLXF1ZXJ5Y3RybDsuPC9lbnRyeT4KKwkgIDwvcm93PgorCSAgPHJvdz4KKwkgICAgPGVudHJ5Pl9fczMyPC9lbnRyeT4KKwkgICAgPGVudHJ5PjxzdHJ1Y3RmaWVsZD5kZWZhdWx0X3ZhbHVlPC9zdHJ1Y3RmaWVsZD48L2VudHJ5PgorCSAgICA8ZW50cnk+PC9lbnRyeT4KKwkgICAgPGVudHJ5PlRoZSBkZWZhdWx0IHZhbHVlIHZhbHVlIG9mIHRoZSBjb250cm9sLiBTZWUgJnY0bDItcXVlcnljdHJsOy48L2VudHJ5PgorCSAgPC9yb3c+CisJPC90Ym9keT4KKyAgICAgIDwvdGdyb3VwPgorICAgIDwvdGFibGU+CisKKyAgICA8dGFibGUgcGd3aWRlPSIxIiBmcmFtZT0ibm9uZSIgaWQ9ImNoYW5nZXMtZmxhZ3MiPgorICAgICAgPHRpdGxlPkNoYW5nZXM8L3RpdGxlPgorICAgICAgPHRncm91cCBjb2xzPSIzIj4KKwkmY3MtZGVmOworCTx0Ym9keSB2YWxpZ249InRvcCI+CisJICA8cm93PgorCSAgICA8ZW50cnk+PGNvbnN0YW50PlY0TDJfRVZFTlRfQ1RSTF9DSF9WQUxVRTwvY29uc3RhbnQ+PC9lbnRyeT4KKwkgICAgPGVudHJ5PjB4MDAwMTwvZW50cnk+CisJICAgIDxlbnRyeT5UaGlzIGNvbnRyb2wgZXZlbnQgd2FzIHRyaWdnZXJlZCBiZWNhdXNlIHRoZSB2YWx1ZSBvZiB0aGUgY29udHJvbAorCQljaGFuZ2VkLiBTcGVjaWFsIGNhc2U6IGlmIGEgYnV0dG9uIGNvbnRyb2wgaXMgcHJlc3NlZCwgdGhlbiB0aGlzCisJCWV2ZW50IGlzIHNlbnQgYXMgd2VsbCwgZXZlbiB0aG91Z2ggdGhlcmUgaXMgbm90IGV4cGxpY2l0IHZhbHVlCisJCWFzc29jaWF0ZWQgd2l0aCBhIGJ1dHRvbiBjb250cm9sLjwvZW50cnk+CisJICA8L3Jvdz4KKwkgIDxyb3c+CisJICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9FVkVOVF9DVFJMX0NIX0ZMQUdTPC9jb25zdGFudD48L2VudHJ5PgorCSAgICA8ZW50cnk+MHgwMDAyPC9lbnRyeT4KKwkgICAgPGVudHJ5PlRoaXMgY29udHJvbCBldmVudCB3YXMgdHJpZ2dlcmVkIGJlY2F1c2UgdGhlIGNvbnRyb2wgZmxhZ3MKKwkJY2hhbmdlZC48L2VudHJ5PgorCSAgPC9yb3c+CisJPC90Ym9keT4KKyAgICAgIDwvdGdyb3VwPgorICAgIDwvdGFibGU+CisgIDwvcmVmc2VjdDE+CisgIDxyZWZzZWN0MT4KKyAgICAmcmV0dXJuLXZhbHVlOworICA8L3JlZnNlY3QxPgorPC9yZWZlbnRyeT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92YmlfNTI1LmdpZi5iNjQgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdmJpXzUyNS5naWYuYjY0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZGNmMDYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdmJpXzUyNS5naWYuYjY0CkBAIC0wLDAgKzEsODQgQEAKK1IwbEdPRGxoS2dQSUFJQUFBQUFBQVAvLy95SDVCQUVBQUFFQUxBQUFBQUFxQThnQUFBTCtqSStweSswUG81eTAyb3V6M3J6N0Q0YmkKK1NKYm1pYWJxV2dKczQ3NUxMQ3QwZmR5NG9lTjkvUVB1RUVGWmtYVmNKWlhEWE5QNXBDMFRnR3JNU3JSTWlkaEExL3VOYkI5ajJDWjgKK0tjK3FIRFhEVFQyakszQnVQYXUxM3ZGcGRtYy9wNlVoNVNlWW9YTUh5Rk5vbUVlWWlORVZLQ0ZGeDhXejJFaDU2WVdwMmJmbkdYazEKK09FaGFLbmVtMnJZYTZ2cDNLSXFhQmhVTG1zazRVZmMxS1RicTRyZmJoeGtjT1F4MjJsaW1aNFA4U1RZSDNQc0d1OHBxZTQzOWF3MzYKK2VqaTlxVDFyR0NwcmFmNU1rUXlueUpldUcwYzczaW12TFl6dVVBd0YvUDZXVEs4dkhEZGoyUWlhOGhZTDRiRjJvL0NwbXlkT1hhNkkKK3VxUU5QRmVwbnkvK2QrY00wcXNIOHFOR0NJOE0zZ3ZHN0tHOGlTSkpWb05JcDF3NWgvQytnU1BqZ1dFOWhSMExxbXpwMFJGUGpMVisKK2hvUmtpMlhOUEp5Q1ZteTJVNktuSG02V25ib1JjT1BGa1M1OXhxUXBFS1pScGtESGZpMXJkcWxYZ1RNVktWVkw3aC9jbm1pMXJ0eHEKK3QyN1luMW41eHJ5U1VpODFpWUFsdlIyTU4yM0ZtL25reUh6cDlHOWlTb2YzUHMxcEUzUG15VjJkaGFTTDFKaWVlMy9aakk1TWtobGoKK3hEUFhHbmtDbGduczFweFYwSzZkNHJiWUY3cFJ2NDRDVzdEdG9qdDZmL1l4TzdoeHJybVZKMy9lWkRuZDR0Q2pWdytPUGJ2MjdkeTcKK2UvOE9Qcno0OGVUTG16K1BQcjM2OWV6YnUzOFBQNzc4K2ZUcjI3K1BQNy8rL2Z6Kysvdi9EMkNBQWc1SVlJRUdIb2hnZ2dvdVNORnYKKzFsMkhISVJDQUNlaGd3OWVPSVIwMDAxSTRZVnE4TUpJVlpJdFVwSmlHNTY0R0c3NVZKYVhiNWFWdGh0bGp3blYxbWF1eVhpalZxdEIKK0ZWUm9LN0ZveGkwa05waGFZZGhZTlJVeFFNWkRXWktkOUlYVFFUbW1GbHVVRFFsbjVUY3FCcm5sWUVPaGFHSlhOWnJVcFIyNHNMUE4KK2tDNnVhQkdXTXl3RVJwV0lTZVVaYWNJRTVpWkg4T0FwSjNGcnR2aG5ZNUFkUjFpWlZPdzRwMUJUWmhsamxHTkcxYWlqZmdJS2w0K2YKK2tOWmpvSUwyeVNPYWNYNGtZbHl5ZkRnb29XQlNXbWlrT0gxNW1VNWtzZnFpcVVWcU5zeVNYTjdGcVo1aldkb1RyN3NTcWFPdFRINlkKK0Vhak1OWlgra2JDNTNxb3BERE11eW1ocHJnTGJHYVRVYmdydG04c21DcU9xUVJZYlpyVjU4dmlqdHpaZ05XMlRUSFpFYWc3ckhGdVUKK1BwNGFTcTZzYzlFSmE3amlucFZ1cS9SdXkreFNqOUtpYkwwWXlSWHJYcjdXbEMrMjQycXJETUpzRVlZU1Z2QWlVekdKd2c3YzdCcUkKK0dqeWl1UTVmN1BHLzdqNTdWcWtwcXJ5eXlKMFdEREJ4QzI5eW1yMytZRkV6eVJwTEU1cUc5MXFZWVlWQVI0aGgwQjBXVGJUUlIxTW4KK05CS1REczBoMGxFclRUWFRTeWRkTmRaYWJ3MzExRVQ3bkxEVFRjdDJ0ZGRtbjgyYmMyVjN6YmJZYXpNSWQ5eHl6MDEzM1hiZmpYZmUKK2V1L05kOTkrL3cxNDRJSVBUbmpoaGgrT2VPS0tjemNSMkNZdkRubmtrZ2YrWG9URjJlVUNzOXVUYjg1NTU0TXJWVWptSkdEdXVNdWUKK240NTY2Z0t5eE0rVDJMMzdjTnFxejA1NzdRRzIvaWtwVnhFaWU3TGZsVzU3OE1JUEwxdnJvVmRpZk95M291dGtzY0QvVEh6MDBrK3YKK25lNDZBcFFUNzBvMlpXejFSVDVQZmZqaTJ3NFlXY3FMa3J6dk1oTlQvV2p1dnkvNitQTFBML3cvODU0dnIrdDU4Z1ArdnVmeVNiOEEKK0NuQjhwaEVCbW83bmhESHd6M3ZRR0tBREgwakFUNFVnVkdaUUlMamVCc0VNYW5CNkdxS2dQK2gwdnRGdGNJUWs1S0FKcHFBYS96bkwKK1hjNENYdjlLQ01QMmZNeUE4ZnZERENkWXd6Ymc3SVFid1owSXFlSENHQXJSYmo0VXdndnhnREpTSFhFZklVUVZFcHVJcWlMeWNJaFUKK2pKditGTk8yUkNlSlE0a1B1dUlIVU1pK0tiNHBpRlVzbzRLOHlJUXNZbThjSWxLajlWclFReWlxVUg5bXJPUG0wRGdjTjhZc1hvTFEKK0l4MUhBTVkvQXJLQ2RpeWs1UERZSEQrNnFvMWRsT1BJdElYSUcwWFNrSlQwMnlSNXFFZzJFcXlSSFl5anp5cm55RXFLOG95aFRFZ2oKKzdiRkpvMTNTSTJFd3pDZERoRFA0eVhLV3RLeFlMV1dKc1Z1K0w1ZTZyRmt2NGJlelg5cFNtRGQwWHpkZ1prd2E3U0puRkRNTk1YMzUKK1RGZEdNNWpFNUdVMW80a24xV0R6bVhiZzJUYUZhU1pyZ3ZOa3MreW1PTDlKeTNEZXNHVWlTZDV3bUVoR3Q1U2lIVWlwcCtuYUNaTDcKKzZaT1YrV3lpeE1KaFQxTUtsSitDRkNQMm5tZXhmOXBsQ1paYkpXVCszQ203TUpJeFNmR2NwMFdUZ2xHQzlDdEwrOVJFUnozYVQzcG0KK0ZGZWl1U2hCSGNxTk43NVRvcWprYUJoWHFyOFhKblNQSUMwb0hQMkpVNUZxZEtRMmc1anlMTmVyZmdvMXFEb2xLVGxNbXNxVGxySmEKK0ttMU9BbU9HQ0thKzFLa3N0UkJFVWREUXBVcHFvRWsxS2xGMmVpMmZmdFFvWXlWclNGRVJVSzlhUXA0dFJha21iWHJUcXRiVXBYRDkKK29WdzFkOVVUWkxXaVhPMGpXbm42MVk3eGNhNW1KV3hoaWZwWHNLcjFJV3hWNmtRUGl0YzFHblpPVGNWcUZoUnEwTHhtZHFwNnBhbGIKK0w1dll4UUwwbmtBOXJHblZncWw5RnZXb2l1MnFYOXVxVld4VnRyTlAvZW02bHNkWjJ0NlZiRTlhcDFCOXk5cVM5ald3d1MydXp2RCsKK09kbUZEaldvSUYwdGNaKzdWcVRXRkxqTXBTNVJpNmtyc2FvSnB0Nk0yaEZMSzdiR3VoYTZEQVBzcVNpN1hOU21WNzNORGExeFZTTGUKKzF4TFVxbGFMYlZpV0NGN3ZKdTI3bnMycGU4azcyckNTcTZ6M1hXK0IyMnZlOHJaV3Z1TTlMVy94bTEzTFBvMnE5bVV1ZlNjVTMrZ20KK09NQ2lEUnR1a3l0VkVJY1lzUnVPNDRJMUxOejVSclRDeXRYdmZvL0czd25UTnNPTS9TOThTK3pFRDF2WXdTMFdzV3h4R2tMTWJqWEYKK0RXYnZoVjE4NUNTL0dNbTlreTZLT3l3bUhNL3h4ejdXTVk5N2JGYm4zdmpFTlI3dWxTVk0wNVF1bWNsalhuR01hYnduR3lzWXlsTzIKK3NwRy9UT1VxbzFmTGEzNXZsNGtzWjd1eWVNUm1ycThha2F2KzVPSTUrYzVzRmxSYWV6cGdBL1A1elhER0xaMDViT2MwZTVuUkQvWnoKK21mc2NIV1lpUWROS0FLNm40d2ZBeFNUaTA5d2s1emlwcWN0dW52cWN0MVQxTDhQNWkxR0xMdFRzZE1SQnJCdnJITm9FMThmRUw2ZEgKK0NleGdDM3ZZeEM2MnNZK043R1FyZTluTWJyYXpudzN0YUV0NzJ0U3V0cld2amUxc2EzdmIzTzYydDc4TjduQ0xlOXprTHJlNXo0M3UKK2RLdDczZXh1dDd2ZkRlOTR5M3ZlOUs2M3ZlOXQ3U0JrTmRINDdyZS85UXE2Q0FQNjN3UXZ1R1oybVluZUZvUFdCbSs0dzhWVVdpTUIKKzVJSVByN2pGWDJhL1lDWjh6eGZ2dUxuZjFWQjVRY25qSkRkNFlUS3VjTjN4dXVRc2I3bkxYdzd6bU10ODVqU3Z1YzF2anZQK25PdDgKKzV6enZ1YzkvRHZTZ0MzM29SQys2MFkrTzlLUXJmZWxNYjdyVG53NzFxRXQ5NmxTdnV0V3ZqdldzYTMzclhPKzYxNzhPOXJDTGZleGsKK0w3dlp6NDcyc2NHMHZsbEQyNHJaenJXMjhiYnRjbDg3M04ydU9iVWZxa1F6SkZhSlBBTzlGbTUzVzM0L21jYk8rNy90OWoxa3NmelkKK01pVU8rRGFYRFBDTFQ5VnBLcjh5Wm5wUURNNTBKY21reVRPZE5UNUVueDhteGhBUGF4QXBxL0NVTHhqRlY5UzhrVDl5aFd0czB6TDQKK0pWblg0NHVpZ2wxNDgxQ2Y4S3NJM0tmK0VyNmJpTVhTMTgvK2d5MkpKZkJ6RncvTWMzNVUwTmNYSnhBaCs0QTFFTkM2OXhkb0VSMzgKKzM0TWYrc1p2Ri81T1AzeVErUUtBdDgrMTRaOS8yZEgrSDNkbmg0ZC9BbHM1ZjFNek1jZHNDb2o1U2Z3d3FYVmIvTWNhNnFkOVdCYUEKK1IvSisxcWRkREhlQVVaWnk4NWMrbU9jcC9uZGM1UU1xR3lNYXdyZDVBQ1Z4LzhkWUtyY3NGUWc3REFoRXU2TkFHN2c5cTNjVTNSTjQKK3pCSlY5amR3c1hNL0dRaUNSdVpXTldoN01zaDNRbWFBaG9ZU0l5aGphMUFMYlFKL29iTStMMGlFeHZKcnk4ZDhMcGlBdVBkU043aDkKKzNWT0Qza2RIVzFBVnNPT0F4RWNsVHlTRUlJUU9IVmlGN1hTRlpRZ1VWRmlHajhDQ1lwaUdSK2c4QXhndDI0YzhROWdwdlRKYkhqWmcKK0lqZ3VGSlFWWkNoYkgyaC8yck9ESmpncXhpZURHVGlGZXZneUZLV0dBWU9CajhndFZQRjU2NElwTFJLSmd6aUFnQWoraWVGbmlOeFgKK2ZVbzRMUGNYaG4yWUVxTW5pZitUTVlOSGdLb1dlVFRZVEdvaWZaelhlQXNvaXZwWEoyZjRQYUhIaWs3b01aMW5pNHlJaThmRGliK0kKK2dlbjNnNnBvaEUzNGdNYTRjYk80aXhKa2g4bTRkMEhZaTVMbmlxMVhqTXFvamNxZ2QyQW1OWFZuZDNnM2p1UklZWFQzZG5HWGp1WjQKK2psL3pqYm9WanV2SWp2QjRkL05vVU9pWWQrcVlqL1o0ais2SVFYTlhqL0lvanVBWWtBSzVqL3lvWndWNWtBYTVrQTJaZGc4SmtSRXAKK2tSTkprUlZwa1Q3M1p4d25qQVNwandDSmtJUDBqdjNZa2UzNGtTQVpqd3c1a1BRNGtpU1praXBaa2hPa05pZnBrT1dJa2pRNWt6WkoKK05xeVhpOXVZZUlyWGhvOFRadFRsQ2puRU1mbitaMDdqTjNuM2hJdUMxWk5LZVkySmlENlpzMGdDNWlXemxpYXYrSW52NTF2S3gzd28KK1dJclRWM3VoMklxQzl6alpONVpMMkRCZ1NaVytpSTJHQnBUVDJJd210cGFqcUpTR0lZMjMySlJidVExbXlaWm9LWlpabVR0OHlTVjMKK2dnYXBXRUhSQUpqVTJKYUw2WVZNS1llcE1wZS9HSmxINlpUSTJKZHU2WlJjdVpHUUJKZVBxVENUbVlSRzJYeU82UTUyVWk1UXVKbjcKK3NBNGFtQzJYT1llSkNXdWtXVnVnZVgyeStaZWlHWlNPMFpybmNwZEdXWUt3T1pxMm1WOTRTWHd6RXl5bUNVTElvNHUwaDVydDk1WkQKK3VadXV5UzJ4U0p1TmVaWjNXSmxoQm1SUUJBaENHVnJMbVJmR0NYRjF5VHlnMlRoa1FsWjVlSjNsV1lpcE9aMytVS21kL3VTRHJ3bWYKK2NpU1k3Nmt1YWNtWStIazlsV21Fd3VtSjhCbURTQmw5L3pLZ3BFbUk2Q2tqR2NPTS9NbU4zUWljblJtWDBPQnB1dm1XM0dsRDRqa3IKK1FFbVVGdXFmSFhva1Vqa1BHdG9ZRFNxZCttZWlFK3FNZWhtZjBabVFDb21USHRtU2NTV1RNV3FqSFBtU01QbVBNaHBSR2Vtak1ZbVAKK040bWpNMHFqTUhxakxrbWtMNXFqSVBDakxYcWhMcXFrU1dxU1FYcWtTRnFUTEhtbFZwcWxJcm1rRittbFh3cW1ZU3FtWTdwdWlFaW0KK1p6b2dqNEdFYU1xbUFJSVFtdG1tY1RvZmJ5cWhjcXAwR1NsRDFnQ25kdnB2dXFZbGRTVTNkT3FrZkpwdW4vVkZ0MW1kNXNGUWpPS24KK2hGcHUrZE9iS1ZNWFVuU014NUFmREJYK2FnZnFxSDBxUVF0a0NyTVpmODFncUJ2bm1lbUJUWnRhY3VDeXA5OHlGYnlBRC9OSlNMaUQKK3A0ZEtvU3VIcXU2MnFKSHFscFRZSjVBZ2N2S0JxYmZxY2xyb1VPVVpCeW5vRlAvcEhyTXFySThLTDJDRXJCMVlRUEhCck0wNmJqd0oKK2x4c0RKQ2trcWdEM1dOWjZSbzE2bFQ1Z3EwSkNuQlBHcmZzNVNlckpjYU9LbStCYUgrNEtDNWtrWm9SMm5UVEJyaXhUb0tDRVNUd0sKK3IybXFrYXR5U2kxbHIvdUpyN25GcEo2a29vTVdwZjhLc0hwRXJ3UXJhZWQ2c0lBS0xlejZTUUhyc0hBanI2d1FzU3BHTXp6SXFwMFUKK1pmd0tSOVc2c2Z6UnNhcndzWG5XcllESnJ5dXJvaGpiV1NpYnN2b2hzNU1tYUJJN3NlNDVxUWhMcTVMK1lySWlaTE0zaXg4NWkyZS8KK29STUhKTEplc21mb0FyVlB5V3FsZG5pdk5yVzFoR3F2aGs1WGk3VmNXMDVlaTB1OUpyYktOTGJTOG5pb3lFMWJDN2JBdExZSXQ3WG8KK0JMZm1CTGRXVzdWejIwdnE5RTJtRnJaMXUycWlocmNkUkhxMTlWajVDb2FGVnFJTUMya0FkcS9VNTdLV3FHaDBoV0JKdTJXRzY3UTYKK3kxMUFPNldFcTZPNzFXakloYlJTQmF1YkcxT1Zackg3UjdsQWhMaHlHV21MTzRNSHRtT1Vob0RxaFdhSk83bXJ1MzRZb3JsQkMxbVYKK0ZycjhSbVdmNjFLOXE3dWFSYU81SzFtMjZ4S3pxN3FLYTdDTSs3cXUyN25hZFZhV0M0R25DeFhLUzJIRysxQ1ltN25IRzcxN0ZWbkMKK1N5dWplN21scTBYSUs3RFVPMlQrNkx1d3ZodTk3Z3U3aXlhN3FWdTk3RnU1a2h0WjVqdSsycnU5NHV1OHY2dXgxT2UvQlVHOGVtYTgKK0EreTlUOFpnOXN1WkNHcVpqdHU0cGZtNHdVdS82OHU4RnF6QUZ3YThIN2JCamdaVnlBaSt2RHVvOHh2QUlWeS9GNXkrK0V1N2RaYUkKK3d5bS9zUXZETDZ4YzJJdkJMRnk3QzZ6QkpmeEVDUFY5QklaZStydS9DWnk5NkRmRVdIbS9ERHhHRll5WjFsdXFjZmErRVB5OE1ReTYKK1NzeXFYTGJDUGV0aTVmcTc0Z3E2MkpXdFNNVEZ3YXZGVWd5UEZTaGxLVnhrVjd5OGllbkNrUHZFRWh6QkVrekRTNHpFQmFxK1pYeHAKKytSdG9wRXMxTVFZd0NJekFRSnpFWjF6RkJQcS84ZXZHaU96RVdVYkZSNHpDaFp6RzVidkhrb3orYVdSbXlaUnN3NW1NeFJsOHc1MU0KK3NZY012WXJzWnFGTXdpcTh4cHA4eXB0Y3lhdk15bnc4eVhyY3lxa3N5N2Q3eDVEOHlBNDZ5bVNjeXpLY3lLVWN5U2ZzeVdwTXk1WjIKK3laanN5ckdNek9Cb3hsWWNzclhzeU1ITXVtMjh5S1NzeXo4Y3ViOWN3OEtjemMxTXpLK3N6SGw4ek1YOHpYVmN1Tmg4dUlUOHpKL2MKK3V0VXN2VkhNeXhUc3pBM014T1dNdzhtTXgrQmN4T0ljenNZOHk5czh6T1pzeTlEY3ZPdjh6cnZjeSt6Y2dJMHN6K1JzdWdCZHZQaWMKK3ovWjh6eG1Tb3FOVDBhcTRhMUppSTkyUTBibTJhcWVxdDNjYjBxazIwcTFXMGlZdHRiUjRheDNOMFJzTkJCZE5RMTE0UWpDTlF6TGQKK0FqUnR0RG10MHp2TjB6MXU3ZE0vRGRSQkxkUkRUZFJGYmRSSGpkUkpyZFJMemRSTjdkUlBEZFZSTGRWVFRkVlZiZFZYamRWZlZCa3gKKytBUFNuTlU1YlphYUNzVmZQZFFuUjhUa0p3bG5UZFpBblN3WEpJaWR1dFpCSGJocnFwcW51S3B4L2E5YzNSZHZuZFo0M2RPK3BDU1kKK0U5Z3FGOGJOV2dBQU93PT0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92YmlfNjI1LmdpZi5iNjQgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdmJpXzYyNS5naWYuYjY0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMWY0OWEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdmJpXzYyNS5naWYuYjY0CkBAIC0wLDAgKzEsOTAgQEAKK1IwbEdPRGxoS2dQSUFJQUFBQUFBQVAvLy95SDVCQUVBQUFFQUxBQUFBQUFxQThnQUFBTCtqSStweSswUG81eTAyb3V6M3J6N0Q0YmkKK1NKYm1pYWJxV2dKczQ3NUxMQ3QwZmR5NG9lTjkvUVB1RUVGWmtYVmNKWlhEWE5QNXBDMFRnR3JPQ3FWTWlkaEFWZHFWYkxteDczV2MKK0ZYZk5hYkdGemZiRzNSejBiRE8vMkcxaHpKN284Y2VUNTZkQitHYjRKY2lEMTZmbmgzVkk5N2JtT0NFNHR5aFZVU2JIS09sZzF4bnAKKzZhV0ZLRGZhZWNycVFscksydnFLMmJqSW1QRmFpTHVLdXh2WSsySExxMXRuaUhjTHpGbVd5Nm1uaXR4TWVXczVpYVpvMHhaaFRhaGoKK3JkelhIYTNtNkVvZCtoMStMVzdNWHB4ODNQNzk2MnkranU0Ty8vNW9HcjhQSFV2czM2VmpvQ0JzdWpUc3hwNXQwTUlCMU1aTFliMDcKK0NCdCtRbFdSSHovK1p0bzYyTkxZRCtPdWo3UStabE1qMEo4MGtDcjFpYVNIVDZXbWVBWFBBWE9Wek5zMGh3OGZIQXd6a2VMQVR6OUUKK3hWbzJxQ2EybzdBQTlXejVjbVhJZ0ZBaEt1MlliMnExckZTckRtVVpGZVVnclFhTGRoV3JpRlpLR0t0NkxOVFNsb3BYdGhldnJJVUIKK2Q5clNwNkZHY2JuTHdDUlllMkVMbytWSytDeEV3RjlYa295cGVDdFpuMDVkVGlxbE51cE14bnlXeFhrTDE3T1Z0SHo3bG9NVGRPKzQKK3BHc01zejBkS2JWY3lLN0xYc1dieUtTd2VUQTk1cWF0REhobzRUN1RxcXNkV04xdG9hRmJFeE5NSE1rVHppbWdSMmNTWmZwZ0k5cXQKK1Q4YWVQYno0SVFlYmVMY3NaRHo1NmVjanYyZy85ejM3K2ZUTmQ2K3ZQYi8rL2Z6Kysvdi9EMkNBQWc1SVlJRUdIb2hnZ2dvdXlHQ0QKK0RqNElZWVFTVGtoaGhSWmVpR0dHR203SVlZY2VmZ2hpaUNLT1NHS0pKcDZJWW9vcXJzamlkeXJBaDl5TCtLMm5uZy8zMVdnamp0ek4KK21LT084bEZIeGhsSnhSamtrRVkydGxvV3k1MWsybXhBVm9hUVFrSW1SaVJ1SXlFbUQ1WklvbWVWWU1MSVpoTWtTNnJXbTR2SmVjWmwKK2NXQnNSb21VeitWbHltZzRiV2ZsWW5HV281Rk9HWjAyRnBoUFltYmttSFFtUnhSU2d6SlhwbnRsL1VsbWNJY2E1SXR2aWxKSngyT1MKK1RrclpvNWs2Q2dlbWZCREZLSlBGN1pSVElac01neFVpcDRxS0tGTjVVcm9wU0tENTR4YXNXOXA2YTY1VkJpWW1iL2RjMnFadXdNYUgKK2xhWHZaRWIrRmJLUENLcGttNjhLdXRCb1RzaFpXcE42TVJxdG02SCs4Wm1UdWxhYnFwbGhYaWt1TnRCaGdxcW5NNlNMYTdqRTJuWmQKK3JHeks1Q2VVcU14SnE2bDJZYXZ2VG42eUdWRzd6R243N2FaZ3ZPdnVydXZHZXhuQ25kWExxNVlDQzJWc21nMkxVekdjVFNtOHI3ZmcKKzBwVUt4TWd3ZE9kWS9PNEphTWtGZi9wcXlpdi9KYXU5Q1kvYXNxYXRPbHduenVNNkp2SE1Pc1BzWmFRWi8zenpWME5mZG5TNEhMM2MKK0tzQlpwbklrMDFOQ0hiWFAxbzRNc1NqZ3lBenAweHNkZHpIUkhxT3oyMjg5ZDgzd21iNDZlL2FpYmF1Wk5oWEdNV3V6M0tqTkc2VnoKKytmb29IWS9wOFEwZWpZREw2UGVPOWhYKzQrRFZzUnI0RGpCeVBNTGpFNXYrSUxuVUoxUWU5dCtDYjg1NWo0ZC9qcm5WZlN1T1F1aWkKK04rNTU1NXFyYmpqcnJUdCtZNHV5ejA1NzdiYmZqbnZ1dXUvT2UrKysvdzU4OE1JUFQzenh4aCtQZlBMS0w4Kzg3cldHWUxxSTBUZFAKK2ZmV3dNMjQ5b1hLRGdDL3kwMmNQZnZna2tQSjk3dDEzNzA3NUhLb3ZmdnZ1UTFLWGg5ektKNlYzN0E3UC92djY3MzlPYTBCRm5vUksKK1FHOSsyUGxKTUxEbnUvenhiNEVNeEpQSi9ETEEvc1h2RjBFb2dzZ0c1aFFEa3VwZUNPeWRBaGtJd3ZjZEFZSmVxWWRmeW1PTUN2TEsKK1N3ZTd5S3Fna0xVNGRaQjNBYVJiQ0c4WXdock9FR2F6VWFISk51S2JvcWpRYVJCTVNEcnFCa091NFc5dVRBUWJEcDhJUlNWMmpGdG0KKzJZNyt0aHdJRHl6aTY0VklCS0lNdlFpcCsvR3dpdDVUa3cyamlNYnNHY1ZSUGZ5aEJUZEdxN2dZNm92b0cxVUw2eGltSlN3dFZMalQKK1lSci9tTVpaRmN0SlJaU2dMc3dpUjczZ01XY3NxdzBKeDBhOER3Snlrc0FqNENDalJyN1QyYVNDaVFUaUlpTUdzdmc4VW9yQmt5UWwKK1Q3azdTM2FOWFFKRW0ybFd4Y2w5YlJHRm5XRk0yVEFJeXVPWkVwVXBPcU5ITGhnTVg5YWhYcXEwMnhaVFFyQ2RSUXlXZHBvbHErWWsKK3VUZHFNb0c4Qk9FblpTU3NIWUxSUm11a0ZBbkZHS09BMmF5VnNCamhOa1VnVFZjYWI1ZlZOTkUxRjVmTmszM3duWTJ5MmlPQldiUTIKKzhyRmo5YXhMTkJtWnkzVzJjNEgwdkZ3WGNUbVVlWGF4bUJtVWxmMytMa21TZEpwcm41a2I1MEF2V3J1Q1V1NmczZ0tOUXJ0Wm1ucysKK2RKVVUvV0UvNmJqUmdBSVVveXgxSjBlNTk5STBlTlErSU5YVlBhRUgwWlRlQVp6RTJRSTdXd3JVN0h3MEt6TmRUMDByT2txY2tqU20KKzlqeW5Vdk1KeWFCS1ZYNU1EU0pOOWpIVWorVXpxVENkR3RXY09FQ0p5QW1mOENxU2JXRFR4TFNpVmExTVpBMWI1K2JXdDVJbVpISTEKK0RqMllaZGRnaVN5dmVsMXJYYzN3MTdiU05iQ2lJV3hoRFVzR3d5b1diTmRZckdJVE8xakNKamF0UlhJc1lzL2dWN2JldGJKa2hadE0KK25kcUNoa2FQSjZmWVRkazJnOXB5UVVtVnJKVkpRRFM2UW5hazlwQlgxUnhYeHlmYTJvNExtb0c3TFc2blZkSmpnZmEzaW16Yy9FeisKK0s5dWJLTmRpdVd5dFNKejdYS2JDbGlLenhhcHVFK2ZKM2s1d0hWT29YM0FCNHR2SUFZS254RVVwNFlwN1hqNU9kNkxMdFM1dG1ZdFEKKzhMbzJ1cTVGYm5zNStON1hlaTY4VDgydWZsM0oyL1R5dDc4QnhtNkJTNWZiOUhKMHZYSTU3WDJqY1V2NTBwZTc4NDJ1ZmZPTFgvZisKK3QzVURQbUFTNTlYZDhYNjNNUjMyc0Q5dE8xenhmdGk0eTBwaGNqRU1ZZFYrZHNJU3BuQjlYZnpnVnVTNHhnYmVyazc5UytQZHBoaWQKK0NSYndrRU1MM0twS21NSDZPQzZPWWF4aktHdFZOZERsTVluMWUyRU5aM2pMUWRidUZ4ZTM0Z3JMNjhoZFJhK1J5YXZpUW8wMmc1MUYKK2twTjc0V0FwVjByR0Z1bXkwc1FzM3l4ek9jcGF0ak9ZL2VYK1pib2xzMDZ3Q1hTYnJ3eldQeXQ1dzloZHNIUWZIVk0wTDVQT01mUHoKK21DMDlaajNIV002WFpQVG9GbzNuVDdOdjBGN2UzS2hKK1dOSGE1clBlMDRvcFVrTjRGRGYrY1p3Zm5HZldZM3BINTlhbTJVR2RhNTEKK1BaNWRqN2dsYis0WHA1ZDY2eWwzVk5heC9uVnpIeDNuWk05WnVDaXV0clY3dk45Z1ozdDF4Vzd4anFjdDdZb0syZGxVWm5hc1YrM3EKK1kyY3F3c0wydFkydkxlcnJEZnU2OGVhMnQ0MGRibVMzMm5JemZyZVZrWWJsSitkNzNkOEdPTHhMemVGdEh6emhDMWUwcWdXKzcwNUgKK2ZKcmxKdmV5TGI1c2RJTjc0Z1NuTnNNL0R2SjZOMXprMkg1ZHQxVmxhNDV2OHRXb2ZqYkcrMDFoalV0ODB3Ty9kTWdSWHZMK25Pc2MKK0NITTFRcy9mdzlmaGtFdE1tckJob3ZNVzJNbitWZWwxWmJwY25mNTByN0tONkNNcE9qNkRqb1NmWi8zbzFkRzZFcnorZGE1UGRleGsKK0w3dlp6NDcydEt0OTdXeHZ1OXZmRHZlNHkzM3VkSys3M2UrTzk3enJmZTk4Nzd2Zi93NzR3QXQrOElRdnZPRVBqL2pFSzM3eGpHKzgKKzR4OFArY2hMZnZLVXI3emxMNC81ekd0Kzg1enZ2T2Z4N3NOclhmenpwQzg5Z3lRQjZ6cWJmdldzTDlCaDd4Z3lOYmQrOXJUM3p4d3IKKzNhbHkxbjczdkFjZE13N3J4dDRMZi9pRTQrTFgyckpINGl0LytiTE52U0k3SlhibVMzLzYxSysrOWErUC9leHJmL3ZjNzc3M3Z3LysKKzhJdC8vT1F2di9uUGovNzBxMy85N0crLys5OFAvL2oreTMvKzlLKy8vZStQLy96cmYvLzg3Ny8vL3crQUFTaUFBMGlBQldpQUI0aUEKK0NhaUFDOGlBRGVpQUR3aUJ0b2M0bitZNkZDaHZGWWc2cWFPQkcvZzZITmlCcTNPQkU3Z3VhMUkxRkNkMUpLaHNYa1ZhNGphQ1BSUkQKK1hvT0NLVWcxTU1lQ3RWUVowUmRWWlFWRC8rSTFkekltV3NNVDBBS0RVbWVDUjNJM0hIT0VMWGRTYWhNb1AvZzBuL0dDVWRLRVR2Z24KKzVNTW5KM01ZWDRWRlJRZ29VQ2hJYm9NbXliZFNJSE9GWXFoU2ZRRm9KbFdEUUdPRVlqTUxzMkE1YjdpQzZrUXphQ0o2YXloTFg2Vk4KK0pPTkFnSFZVZFNpSHUyS0ZQb2FIRDVReWtyWkRzWUVxM1ZRU1V6UTVxelV5TW5pRE9UaUdOb2VGR1BFOC9EWmpRamorWHpoSWlYZm0KK2lieW1lZ2VGTEJxa2laRllNNFhvTVhxamlxTkhpc2tTaWtxSUtJWDJpREEzSzltU0o5UWlpWm1BaXEzWWhySUlqQ29Zak9yRmlsUW8KK2RHYW1pYnpvTWx4b1Zpb3pCcmhJZzh5b2pET1lqTTZoaTlYb1haY29oZi93aFZhQldZaTRMWlhRaDdXWWhOc2lpbDlHaTZlSWU0bFkKK0tzUDRVbTZ5ViswNGpLVklWN1U0aWxWSVZLa1lLelhHVUFaSFMzUW9HYkVuaVJ2MGovdFlXcG1vanFUMWgrNXlUQU5aYVk1V2hjOGcKK1E4UUVKL0FJamxyVGkrYUlNa24wTTdsZ0tBdXBQUVRUaldpSWV4ZnBEQlpoaHArNFBRL1pqMlRZVU5wWWg4MUNrUnNKZXpLWVNVdDQKK2hpNnBpREJKa3VPWWtqaTVrczVuU1VBNEpaeit1STFLTXBQSHlCSWplVFZxQnBLdmNZTlJtQ1RSQ0pCTm1ZdFBhWlYyMklwNWNIdjgKK3hwVkVXSlZRaVpSTUtaYWtZWlJTK0hOa3lZUmFxSll0YUlSUzZZMHpHSS96Um1sRUpvSUtGb0llYUlGNm1ZRWc2SmNmK0plTmxwZC8KK1kwcUZHVHNZMkplQ0daaUtDWmlOdVplTytaaU1DWm5uWlppa2cyQ1dhVkNZaVdTYVdWNkk2WEI4bVppUktabWlHWUdsYVpxbmlacXAKK3FacXJ5WnF0Mld1RE9abDR1WmlrS1p1eCtabXpHWnE1V1p1Mm1abWMyWnVlZVptK2FaZkMyVit3eVp1cFpweTBlWnU0dVp6SHVabEUKK09ZVUs4NVVsYUpBNnVKVFN1VFhVNkl2VGVKYndwVXc5Q0RsdUtUWkFXWjNOOFRaaVdaZHVsWjdVYVk5czZaMytOcWlkRGptTm1GaVIKK250QXRLUmlJOXFrbmgrR0Znb2g4NDJpVHF2Q1I3UW1XRG1tSTc5bVQ2aEpLQ2dwVkJrcG01Um1ld1FXT0RScVNQNW1UTVdtaEZMb3cKK1h5T1B6ZEJDQy9WZkJWbUpCcU9TNUJsZklQb21KZXFPR3ZxZDQwbVg3MWdMNTNrbThSUXNjZE9pNnNpUkNIcWlPTXFOREdvdXdDU2kKK1RVS0NTWG1VWUxTZlJ6bUhZWW1lRDNtSzk4bWVJK3FMS2dxaFVicVdCRXFJRHBxaFVPcVM2M21PWGZxa1BKcDZTZ3BnRitSZ1RuTnYKKzZVaWw4TWlPS2NwcjlBaEh6TmdzVWpwaVNaTVJYR3FpZHpxQ1Y3YzJFUnFrVkxxaWNyb1hkRW96YjVxUVpOU2Vpa2ltaVNpUk9FR2sKK1lNaG0rRmlmUFRvNXY3ZFBHTmt5V1RyK3B6SjZvUTZhaHk3NnAxNktxU3k2b1lMcXA2RHFwVEI2cXFVNG9lZUlrQmp6aER2NWlOTVoKK24xTmFwVWxLcS9EcGxPVDRQMSs2cVR3cVhiRW9xcDdscWFrYW81cUtxejY2a2x3cVRGUWtXSkF6VjBaM1YzMUtvc1Q1bXNtcG03dXAKK25NSDVPY0NwcmRhS3JkbjZtOXlxVTVXNXJlSzZtZVVLbXMwNW10ZXFydXdhcnQ3YXJ1NDZybmNacjk5cXIvZmFyZWxhci9tcXIrL0sKK25QdnFyLy9xbWdOTHNBVnJzQWVMc0FsN084YW5zTlAzVTlaakthSGFzSUQwc054VHNjM0RiaTg2c2Z4emFQelJzWk9Vc2U2MnNSOXkKK0hvOEJJK1JVcDFLaGhsTVZzaGM3c2dNU0c4TjBwVUdaaThIRVQyS1JZVXhHU1MzN3NoNjBqTXVDWmdEK1NxZ242VSt4dExMVEpxSVMKKzViSW5Fa0Q3K0xFOXF5QVNRU2hCQ0JYM2cwajY2S0hGWmJSRFMzQ2toa2ZRdExRdTlVcUdLckpRbXlEK3MxTzFNcGNpUnJZbjlvcG0KK3hrclBNa08wVkVWcWU3UU5kRmxtMnlJRnBveHVzYXAxZXpPOGxUV2RGSlZ1MjVVM3FqS3BlREJoV3lJMUJLeDZDeUpKSldsdHlhaFcKK2RDclJnb3dmOWtLSDI2czNxWHJTQWtWK0JMbTA4NkV2S2FZTmlySVpweXFsSzJMc3hibWlpajV4Rzdxakt6d2g5b3hBOGs4ZUNtdGYKK20xMCtwVEZYeXJna0VyeTBHeURkNVEyeWtidG10RTFEdEZOMllVR1kycmFueWp6RHEzZVBpMDVQTzNVK0lFekY2cnNWOGJ5ZzI1bVQKK0JwSlMrMGFyeXFuVGUzM21DMVArV1VWditpWUU2b3RVTXpzczR1dE5wdXU2eUdsTjZhdXhXV3RVTWJGR1daVzhTNkd6YTFoaVhISmcKK3c0bEQxSnQzOEV0Qk5PVy9OTWROK3lzcUJZd3dGRHdYQjF5Y3hDc2dER3hWL2R1Kzdzc2RIQXloRnR3dUpGeS9Jb3k0R3V5eEVqd1EKKzdPdHBNeGZDTEV3bkp2d3lOR3hURDZxaktrd2pMdnkrK1FqQlBWeTJVbVREMHpURVRZWENXcXJEOU1IRE1leHh1TWJFQWR4R0Fad0oKK3NOb0NRT0dIMk10WmpoVlpTV2RacjdkMFc5eDAwY3FzZUFWMlo3Vlh6MnBaWU54MFhSeFhTYWZHWFJ6R1V3akhid1ZaY3h6SHNjZkcKKzM5aEVXV3pIYWxYSDIvc2FZc1dyeFlxU01ueHhBNnh5aG9SdmlUeHB5TXFrVi9aeTkraVBFTWYrditxMmNxYUd3OEJTeEVzR2FaeVIKK2pXc1dabWRteU05MnhMT0d5RDljeWZkV2M3aUJONURzYjY3OGI2Wk15YVdWY3FqY1k2WGNiS2ZNeVNBR2lxTzhpVUZNYUpuY2F4aDgKK3JwdWNib3VjeW94TVhUa3N5YlAyeWdabll6SVhSclhzeExmc3kzV215NUE4d0dINldiaDhhZG1NYU5lc3VzQ01TK0FNdzdSY2F3VUgKK3dnbTVvdHpzY3M4c3krbU16Tlc4Y1NqbXplTm16cmtjYVVyNHlZRkd6aGgwejczOHo0YzgwUGFMY3ZLOHlvMDhudTY4bzg0Y3kvcU0KKzBBZHR5YXk4cmNSY1hzWTh5VzU2YnVLc3B0UFR6d2tYMEM2WHp4MDN6eTFNemNjY25neGRjZkRjYk5FOHl5YXR6aVNkYlNGZHpnWDkKK3l4cWRhUnhkWklwbTBiLytpYVkrUGNnZUpzMlVFVzNLaktlUUdNbVBETTJjSE5ISmJNdjFETktBYk1wWUxOS0oya0gxSTlXNVROV2sKK25OV3dUSEo5TTlTS25OREw3TWdxN1lwZXZkVGEvTkp1VU5SUGpYTnZiV1FLdDNOd1BkYzhuU05oalJkdFRjOXdxdFFPamRaK1BjbE4KK2pjNFRyZEJ5L2RWMGJkY2pwNjJTWk5ZRWR0ZHIzUkY2amRLSDJzNlZMWXFOL2N1Q0RkT0VUZFlYMkc2ZjdkbUdmZGczRjljN2d0ZXgKK0ZkT1h2TkNXclY2c0RaRjNLTkdxYk5UNkZOcUtEV3lpWGRxa1hkZUwvZGlhemRZbkRkWHNmTm11WFdWcTdkdVJEZHpuUE5xSnJkdk0KK3ZkdThYZEc0RFdhbjNieXBUZEZsVGR6bU5tNHVmZHpUYk4yRmJkdkZMTjNPdmR6a0hkN1JGOTNiSmYzYjM5M1pLWjNkU1kzWjJBeloKKzNzM1pBaHpkNTUxbU52M096dzNVNWxIR3BmUGZsM05HQTM1MVJtZmdqNlhIZDd4WVVLZFpDUjUxckdFMnZWSjFFMDRlQVU0NUZsN0YKKzFodE1HdjVMSE43aFhaM0VJUzdpSTA3aUpXN2lKNDdpS2E3aUs4N2lMZTdpTHc3ak1TN2pNMDdqTlc3ak40N2pPYTdqTzg3alBlN2oKK1B3N2tRVjY4RStFUWhxckFRczZhWm1pcnpZemtRQzRhQW1tSXlnSGxUUzdrUDBHM2dSSjhWQjdrQUdDUmJRQjh1cWZsVHU2Q2k0amwKK2Voam1QczdsYWY1OFhCN0ZhdTZEUjU2YUJRQUFPdz09CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdmJpX2hzeW5jLmdpZi5iNjQgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEvdmJpX2hzeW5jLmdpZi5iNjQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RhZmFiZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS92YmlfaHN5bmMuZ2lmLmI2NApAQCAtMCwwICsxLDQzIEBACitSMGxHT0RsaEJ3SEpBT2NBQUFBQUFBRUJBUUlDQWdNREF3UUVCQVVGQlFZR0JnY0hCd2dJQ0FrSkNRb0tDZ3NMQ3d3TURBME5EUTRPCitEZzhQRHhBUUVCRVJFUklTRWhNVEV4UVVGQlVWRlJZV0ZoY1hGeGdZR0JrWkdSb2FHaHNiR3h3Y0hCMGRIUjRlSGg4Zkh5QWdJQ0VoCitJU0lpSWlNakl5UWtKQ1VsSlNZbUppY25KeWdvS0NrcEtTb3FLaXNyS3l3c0xDMHRMUzR1TGk4dkx6QXdNREV4TVRJeU1qTXpNelEwCitORFUxTlRZMk5qYzNOemc0T0RrNU9UbzZPanM3T3p3OFBEMDlQVDQrUGo4L1AwQkFRRUZCUVVKQ1FrTkRRMFJFUkVWRlJVWkdSa2RICitSMGhJU0VsSlNVcEtTa3RMUzB4TVRFMU5UVTVPVGs5UFQxQlFVRkZSVVZKU1VsTlRVMVJVVkZWVlZWWldWbGRYVjFoWVdGbFpXVnBhCitXbHRiVzF4Y1hGMWRYVjVlWGw5ZlgyQmdZR0ZoWVdKaVltTmpZMlJrWkdWbFpXWm1abWRuWjJob2FHbHBhV3BxYW10cmEyeHNiRzF0CitiVzV1Ym05dmIzQndjSEZ4Y1hKeWNuTnpjM1IwZEhWMWRYWjJkbmQzZDNoNGVIbDVlWHA2ZW50N2UzeDhmSDE5Zlg1K2ZuOS9mNENBCitnSUdCZ1lLQ2dvT0RnNFNFaElXRmhZYUdob2VIaDRpSWlJbUppWXFLaW91TGk0eU1qSTJOalk2T2pvK1BqNUNRa0pHUmtaS1NrcE9UCitrNVNVbEpXVmxaYVdscGVYbDVpWW1KbVptWnFhbXB1Ym01eWNuSjJkblo2ZW5wK2ZuNkNnb0tHaG9hS2lvcU9qbzZTa3BLV2xwYWFtCitwcWVucDZpb3FLbXBxYXFxcXF1cnE2eXNySzJ0cmE2dXJxK3ZyN0N3c0xHeHNiS3lzck96czdTMHRMVzF0YmEydHJlM3Q3aTR1TG01Cit1YnE2dXJ1N3U3eTh2TDI5dmI2K3ZyKy92OERBd01IQndjTEN3c1BEdzhURXhNWEZ4Y2JHeHNmSHg4akl5TW5KeWNyS3lzdkx5OHpNCit6TTNOemM3T3pzL1B6OURRME5IUjBkTFMwdFBUMDlUVTFOWFYxZGJXMXRmWDE5alkyTm5aMmRyYTJ0dmIyOXpjM04zZDNkN2UzdC9mCiszK0RnNE9IaDRlTGk0dVBqNCtUazVPWGw1ZWJtNXVmbjUram82T25wNmVycTZ1dnI2K3pzN08zdDdlN3U3dS92Ny9EdzhQSHg4Zkx5Cis4dlB6OC9UMDlQWDE5ZmIyOXZmMzkvajQrUG41K2ZyNit2djcrL3o4L1AzOS9mNysvdi8vL3l3QUFBQUFCd0hKQUFBSS9nRC9DUnhJCitzS0RCZ3dnVEtseklzS0hEaHhBalNweElzYUxGaXhnemF0eklzYVBIanlCRGloeEpzcVRKa3loVHFsekpzcVhMbHpCanlweEpzNmJOCittemh6NnR6SnM2ZlBuMENEQ2gxS3RLalJvMGlUS2wzS3RLblRwMUNqU3AxS3RhclZxeVFCWU4xYVZTdlhyMUM5Z2gyclZPeENzVjRCCittRTJiMEd4RHQyVGp0bldvOWw5ZHUycnJhcjJibCtCYXZRTDNBcFpMZUM1ZHUzajc3ZzJNRi9GQXRJdjFBb1piK0dmZXk1Z3phOTdNCit1YS9CeUo0WEk4YjgrUEhsMFprckU2WHN1Q0RyMXhENWlwN2QybTlwdjZJWnF4WUsrelBDM2cvVDBtYWJHTGRrNFlFSDd3WUszUFpCCit5cXlYU3cvKyszbDEzOU96UzRSK0hidHI3ZUNwL252L2JwMTgrUE1LdVpjZmo3NzkyZlhtNDd1ZnovNTJmZDMwOHp1L1gzdS9mdjNOCisrU2ZnZi9NRmFKOThCTHBuSUg0SUpvamVndjBkNkdCN0VFSTRvWFlWZG5maGd4b095T0NHNFdYSUg0alRpZGdnaVNWMktPR0hLR2EzCitvSVV0cXZhaWlqRXVOeU44TlVwMzQ0ZzVFcVllZjlIMUtOZVBKd1lwSkZsRWVoamhrVDdpdUNLTFRNWmw0b2xSZ2pXbGtsVitkZVdUCitXV3BKNDVKZ2RyblZsbENLT2VhWE1KclpGWnBmcW1rVm1XRzZTUldjUnNvWkZabDEyaGtXbXp4ZW1DZFhlQXI1NTVsT2dqbm9mNGRlCit0U09WRzBLV2FGbDNHVnBvbkg1Mlp1bWxtR2FxNmFhWTBwam1oSnBwbVJxUWJUYUttNmdld2duaW8ydVNPdW1xL2pwTytxbURyRTVGCitwNkF0U1paZVNyZjJXT3RFb1pFbW0yQy9Bc3RubjZDYXBLdGpiQ2xXWmtpOTVsaHNiTGNSdHhtbEhrVmI0N1RCV2N1WWNHdnhlaXlqCitmcDdrR2JPSkVac2NTdHJHeUsxVDdiYjRibFB4b2pndlU0SGl1bHUrdnRvNExwY2szcnZVb2xqQ3VxK25wWnA2Y0tHejB1b3Z3d21YCit1M0NSRVNjN3NaSU5KeWh3V2JKVzdQREZYR1pNNE1aSTFXc3Z5Q0Y3ckRIS1pZcU1LTXVTdm1xd1M1eU95cEhKQWNQMEs4azR6NXhyCitSVHovQzdEUExPMmNyZERQRXIyUzBSMzFyREROUUIvZE1iSVNRMDFSMEZPVCsvVFBWMHZ0cXRaVmMyMXMwd2pMTE9ORkpHOFhOZGtRCit5NXoyVU55K1RXM1hiTjhIbzl4QnhhM3ovdG8zbHowaTNubGpCUGhiZkcrVVpNb3FHNWRiMitLSjlPN2dEREhkOTlkVXN0cHNjc2dSCit4NkN6cUMwTzB1TjcwejA1eFZsSGROcHdndlVIR1dyRmVmNVJwcEdIUGphd05kZHVlM25CNW5ZdWZzS211L3ZyaEwvM2t1UnFxMVRyCis2cGQvRys2SHltR0xkdkM3RGwrNDZjWUQ3YXl3b1NsZVhHT3RqNVJublpBTFAzdng3QmIySi9peWs2KytzdWJUWmFuejJaSjJ0ZTJSCitzdDgrOU5hRkh4L3gxSmZmNUdGejBaOS8rRGMzYzlFblNLNHJ5ZkxHMXo4OUdhWTZBandRQVJ2blFMZkJyMjRYcEZyaXpHU2srdGx2CithT0piWHdVTHhqMy9nVEI2REJ3aENEMm9RTEJ0a0lSNjZtQUVWVGU5QXFxUWhDek1pZ3ZOaHNJYnJuQ0cvbTZaSUFCOStNUHF3ZkNCCitJcnloREkxNFFpUTJrSWlVeXFIM2RxaEJIdG9KZlNaczRndTE2Q1lzR3BDS1lEeWluTHo0UVM1VzhZd2NqRjBXa3hiQ0p4S1JqQzBNCitveG5sbUNVNDZ0QTE5QlBpQ08wNHhaak04SUJxL0dMNjNoaklNbG9OaXRpUzR1dithTVV4Ums1L2loUVhJaE1KU1VhaVVVemdxNlJNCitMRW1oUjVxTGsyTHNvaWVWQmNvNVluS1VDaXdsRzJPSXlxeW9Nb05wUElzbS9UakpSTUt5YTY5OEpZWmlCN2tFTHEyVzZPdmxMVDhICitURjYyTUpmTStSMytsbm5JQUI1ems4ekJIT1prczcvQnFFdVh3WHdtTFMxRHplc3REbm1OdWQ1TXNxbERaUEtHV01relQrOUNCYzMzCis1UEdkOEl5blBPZkp3a2lsTHAzNy9nbmlOOGRaeURnT2NpZW5DYWR1ZG5jNmFuYXZuVDMwcC9TS29rdkg5Zk9PLytSbXF4SUswWVVpCitFb3NCTlZ6MnRublJSOUt6VXh5RllqQXpxcEhlaFpTUWJkeFlFQkVxVWhjVk0wV1RiR2hOWkJvcis3eE5qOFNNYVQ3VEpjMVRnY3VnCitCZjJMTlpubEtPRHAxS1lDYlI2NHVqY1owT0J4ZTVGUjNqQWZxc1NkTml1anVjTW5QbmwzdWF4aXJhTkkzZXAzaHJvODE2MXVOTGJCCitHMDBmTmszYWJHK2FBaVhxY0txbEdHOE95NmhnTGFuZytIblVqRVJ5aUJGVjRWcFppdEthNXJXRWdLSmpsZGdwS3M1ZDlLT1FqZXltCitYa3JTTWRuenBZYXRwV1kzeTFsNk5YR0IzUmxzWjllRHpwN3lkS21uVzFkQWxUbmFROTR6cnVFa1MydFVuZnJhMWlJVWRSdmxIdWV1CitpUzdOMmRhaWMxVm5jRUV6M04vNk1iVnlOVTFUVjB0VWRMM1Z1RjZhS25RaEpkcnBXdmU2Mk0ydWRyZkwzZTU2OTd2Z0RhOTR4MHZlCis4bElrSUFBNwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhLnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWFfYXBpLnRtcGwKc2ltaWxhcml0eSBpbmRleCA4OSUKcmVuYW1lIGZyb20gRG9jdW1lbnRhdGlvbi9Eb2NCb29rL21lZGlhLnRtcGwKcmVuYW1lIHRvIERvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYV9hcGkudG1wbAppbmRleCA4OGYyY2M2Li40ZThlODk4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWEudG1wbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svbWVkaWFfYXBpLnRtcGwKQEAgLTgsNyArOCw4IEBACiA8IUVOVElUWSBpZSAgICAgICAgICAgICAgICAgICAgICJpLiZuYnNwO2UuIj4KIDwhRU5USVRZIGZkICAgICAgICAgICAgICAgICAgICAgIkZpbGUgZGVzY3JpcHRvciByZXR1cm5lZCBieSA8bGluayBsaW5rZW5kPSdmdW5jLW9wZW4nPjxmdW5jdGlvbj5vcGVuKCk8L2Z1bmN0aW9uPjwvbGluaz4uIj4KIDwhRU5USVRZIGkyYyAgICAgICAgICAgICAgICAgICAgIkk8c3VwZXJzY3JpcHQ+Mjwvc3VwZXJzY3JpcHQ+QyI+Ci08IUVOVElUWSByZXR1cm4tdmFsdWUJCSI8dGl0bGU+UmV0dXJuIFZhbHVlPC90aXRsZT48cGFyYT5PbiBzdWNjZXNzIDxyZXR1cm52YWx1ZT4wPC9yZXR1cm52YWx1ZT4gaXMgcmV0dXJuZWQsIG9uIGVycm9yIDxyZXR1cm52YWx1ZT4tMTwvcmV0dXJudmFsdWU+IGFuZCB0aGUgPHZhcm5hbWU+ZXJybm88L3Zhcm5hbWU+IHZhcmlhYmxlIGlzIHNldCBhcHByb3ByaWF0ZWx5OjwvcGFyYT4iPgorPCFFTlRJVFkgcmV0dXJuLXZhbHVlCQkiPHRpdGxlPlJldHVybiBWYWx1ZTwvdGl0bGU+PHBhcmE+T24gc3VjY2VzcyA8cmV0dXJudmFsdWU+MDwvcmV0dXJudmFsdWU+IGlzIHJldHVybmVkLCBvbiBlcnJvciA8cmV0dXJudmFsdWU+LTE8L3JldHVybnZhbHVlPiBhbmQgdGhlIDx2YXJuYW1lPmVycm5vPC92YXJuYW1lPiB2YXJpYWJsZSBpcyBzZXQgYXBwcm9wcmlhdGVseS4gVGhlIGdlbmVyaWMgZXJyb3IgY29kZXMgYXJlIGRlc2NyaWJlZCBhdCB0aGUgPGxpbmsgbGlua2VuZD0nZ2VuLWVycm9ycyc+R2VuZXJpYyBFcnJvciBDb2RlczwvbGluaz4gY2hhcHRlci48L3BhcmE+Ij4KKzwhRU5USVRZIHJldHVybi12YWx1ZS1kdmIJIjxwYXJhPlJFVFVSTiBWQUxVRTwvcGFyYT48cGFyYT5PbiBzdWNjZXNzIDxyZXR1cm52YWx1ZT4wPC9yZXR1cm52YWx1ZT4gaXMgcmV0dXJuZWQsIG9uIGVycm9yIDxyZXR1cm52YWx1ZT4tMTwvcmV0dXJudmFsdWU+IGFuZCB0aGUgPHZhcm5hbWU+ZXJybm88L3Zhcm5hbWU+IHZhcmlhYmxlIGlzIHNldCBhcHByb3ByaWF0ZWx5LiBUaGUgZ2VuZXJpYyBlcnJvciBjb2RlcyBhcmUgZGVzY3JpYmVkIGF0IHRoZSA8bGluayBsaW5rZW5kPSdnZW4tZXJyb3JzJz5HZW5lcmljIEVycm9yIENvZGVzPC9saW5rPiBjaGFwdGVyLjwvcGFyYT4iPgogPCFFTlRJVFkgbWFudm9sICAgICAgICAgICAgICAgICAiPG1hbnZvbG51bT4yPC9tYW52b2xudW0+Ij4KIAogPCEtLSBUYWJsZSB0ZW1wbGF0ZXM6IHN0cnVjdHMsIHN0cnVjdHMgdy91bmlvbiwgZGVmaW5lcy4gLS0+CkBAIC0xMTAsNiArMTExLDExIEBACiAmc3ViLW1lZGlhLWNvbnRyb2xsZXI7CiA8L3BhcnQ+CiAKKzxjaGFwdGVyIGlkPSJnZW5fZXJyb3JzIj4KKyZzdWItZ2VuLWVycm9yczsKKzwvY2hhcHRlcj4KKworCiAmc3ViLWZkbC1hcHBlbmRpeDsKIAogPC9ib29rPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9iYXllci5wZGYgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2JheWVyLnBkZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA1ZTYwZS4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2JheWVyLnBkZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvYmF5ZXIucG5nIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9iYXllci5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliMTVmYjIuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9iYXllci5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Nyb3AuZ2lmIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9jcm9wLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I5ZTdkOC4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Nyb3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9kZXYtZXZlbnQueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9kZXYtZXZlbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTVhOThmLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvZGV2LWV2ZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSAgPHRpdGxlPkV2ZW50IEludGVyZmFjZTwvdGl0bGU+Ci0KLSAgPHBhcmE+VGhlIFY0TDIgZXZlbnQgaW50ZXJmYWNlIHByb3ZpZGVzIG1lYW5zIGZvciB1c2VyIHRvIGdldAotICBpbW1lZGlhdGVseSBub3RpZmllZCBvbiBjZXJ0YWluIGNvbmRpdGlvbnMgdGFraW5nIHBsYWNlIG9uIGEgZGV2aWNlLgotICBUaGlzIG1pZ2h0IGluY2x1ZGUgc3RhcnQgb2YgZnJhbWUgb3IgbG9zcyBvZiBzaWduYWwgZXZlbnRzLCBmb3IKLSAgZXhhbXBsZS4KLSAgPC9wYXJhPgotCi0gIDxwYXJhPlRvIHJlY2VpdmUgZXZlbnRzLCB0aGUgZXZlbnRzIHRoZSB1c2VyIGlzIGludGVyZXN0ZWQgaW4gZmlyc3QgbXVzdAotICBiZSBzdWJzY3JpYmVkIHVzaW5nIHRoZSAmVklESU9DLVNVQlNDUklCRS1FVkVOVDsgaW9jdGwuIE9uY2UgYW4gZXZlbnQgaXMKLSAgc3Vic2NyaWJlZCwgdGhlIGV2ZW50cyBvZiBzdWJzY3JpYmVkIHR5cGVzIGFyZSBkZXF1ZXVlYWJsZSB1c2luZyB0aGUKLSAgJlZJRElPQy1EUUVWRU5UOyBpb2N0bC4gRXZlbnRzIG1heSBiZSB1bnN1YnNjcmliZWQgdXNpbmcKLSAgVklESU9DX1VOU1VCU0NSSUJFX0VWRU5UIGlvY3RsLiBUaGUgc3BlY2lhbCBldmVudCB0eXBlIFY0TDJfRVZFTlRfQUxMIG1heQotICBiZSB1c2VkIHRvIHVuc3Vic2NyaWJlIGFsbCB0aGUgZXZlbnRzIHRoZSBkcml2ZXIgc3VwcG9ydHMuPC9wYXJhPgotCi0gIDxwYXJhPlRoZSBldmVudCBzdWJzY3JpcHRpb25zIGFuZCBldmVudCBxdWV1ZXMgYXJlIHNwZWNpZmljIHRvIGZpbGUKLSAgaGFuZGxlcy4gU3Vic2NyaWJpbmcgYW4gZXZlbnQgb24gb25lIGZpbGUgaGFuZGxlIGRvZXMgbm90IGFmZmVjdAotICBvdGhlciBmaWxlIGhhbmRsZXMuCi0gIDwvcGFyYT4KLQotICA8cGFyYT5UaGUgaW5mb3JtYXRpb24gb24gZGVxdWV1ZWFibGUgZXZlbnRzIGlzIG9idGFpbmVkIGJ5IHVzaW5nIHNlbGVjdCBvcgotICBwb2xsIHN5c3RlbSBjYWxscyBvbiB2aWRlbyBkZXZpY2VzLiBUaGUgVjRMMiBldmVudHMgdXNlIFBPTExQUkkgZXZlbnRzIG9uCi0gIHBvbGwgc3lzdGVtIGNhbGwgYW5kIGV4Y2VwdGlvbnMgb24gc2VsZWN0IHN5c3RlbSBjYWxsLiAgPC9wYXJhPgotCi0gIDwhLS0KLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IHNnbWwKLXNnbWwtcGFyZW50LWRvY3VtZW50OiAidjRsMi5zZ21sIgotaW5kZW50LXRhYnMtbW9kZTogbmlsCi1FbmQ6Ci0gIC0tPgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9maWVsZHNlcV9idC5naWYgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2ZpZWxkc2VxX2J0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBlODU2OS4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2ZpZWxkc2VxX2J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvZmllbGRzZXFfdGIuZ2lmIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9maWVsZHNlcV90Yi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxODQ5MmYuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9maWVsZHNlcV90Yi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Z1bmMtaW9jdGwueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9mdW5jLWlvY3RsLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYwZmQzNy4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL2Z1bmMtaW9jdGwueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLTxyZWZlbnRyeSBpZD0iZnVuYy1pb2N0bCI+Ci0gIDxyZWZtZXRhPgotICAgIDxyZWZlbnRyeXRpdGxlPlY0TDIgaW9jdGwoKTwvcmVmZW50cnl0aXRsZT4KLSAgICAmbWFudm9sOwotICA8L3JlZm1ldGE+Ci0KLSAgPHJlZm5hbWVkaXY+Ci0gICAgPHJlZm5hbWU+djRsMi1pb2N0bDwvcmVmbmFtZT4KLSAgICA8cmVmcHVycG9zZT5Qcm9ncmFtIGEgVjRMMiBkZXZpY2U8L3JlZnB1cnBvc2U+Ci0gIDwvcmVmbmFtZWRpdj4KLQotICA8cmVmc3lub3BzaXNkaXY+Ci0gICAgPGZ1bmNzeW5vcHNpcz4KLSAgICAgIDxmdW5jc3lub3BzaXNpbmZvPiNpbmNsdWRlICZsdDtzeXMvaW9jdGwuaCZndDs8L2Z1bmNzeW5vcHNpc2luZm8+Ci0gICAgICA8ZnVuY3Byb3RvdHlwZT4KLQk8ZnVuY2RlZj5pbnQgPGZ1bmN0aW9uPmlvY3RsPC9mdW5jdGlvbj48L2Z1bmNkZWY+Ci0JPHBhcmFtZGVmPmludCA8cGFyYW1ldGVyPmZkPC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KLQk8cGFyYW1kZWY+aW50IDxwYXJhbWV0ZXI+cmVxdWVzdDwvcGFyYW1ldGVyPjwvcGFyYW1kZWY+Ci0JPHBhcmFtZGVmPnZvaWQgKjxwYXJhbWV0ZXI+YXJncDwvcGFyYW1ldGVyPjwvcGFyYW1kZWY+Ci0gICAgICA8L2Z1bmNwcm90b3R5cGU+Ci0gICAgPC9mdW5jc3lub3BzaXM+Ci0gIDwvcmVmc3lub3BzaXNkaXY+Ci0KLSAgPHJlZnNlY3QxPgotICAgIDx0aXRsZT5Bcmd1bWVudHM8L3RpdGxlPgotCi0gICAgPHZhcmlhYmxlbGlzdD4KLSAgICAgIDx2YXJsaXN0ZW50cnk+Ci0JPHRlcm0+PHBhcmFtZXRlcj5mZDwvcGFyYW1ldGVyPjwvdGVybT4KLQk8bGlzdGl0ZW0+Ci0JICA8cGFyYT4mZmQ7PC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICAgIDx2YXJsaXN0ZW50cnk+Ci0JPHRlcm0+PHBhcmFtZXRlcj5yZXF1ZXN0PC9wYXJhbWV0ZXI+PC90ZXJtPgotCTxsaXN0aXRlbT4KLQkgIDxwYXJhPlY0TDIgaW9jdGwgcmVxdWVzdCBjb2RlIGFzIGRlZmluZWQgaW4gdGhlIDxmaWxlbmFtZT52aWRlb2RldjIuaDwvZmlsZW5hbWU+IGhlYWRlciBmaWxlLCBmb3IgZXhhbXBsZQotVklESU9DX1FVRVJZQ0FQLjwvcGFyYT4KLQk8L2xpc3RpdGVtPgotICAgICAgPC92YXJsaXN0ZW50cnk+Ci0gICAgICA8dmFybGlzdGVudHJ5PgotCTx0ZXJtPjxwYXJhbWV0ZXI+YXJncDwvcGFyYW1ldGVyPjwvdGVybT4KLQk8bGlzdGl0ZW0+Ci0JICA8cGFyYT5Qb2ludGVyIHRvIGEgZnVuY3Rpb24gcGFyYW1ldGVyLCB1c3VhbGx5IGEgc3RydWN0dXJlLjwvcGFyYT4KLQk8L2xpc3RpdGVtPgotICAgICAgPC92YXJsaXN0ZW50cnk+Ci0gICAgPC92YXJpYWJsZWxpc3Q+Ci0gIDwvcmVmc2VjdDE+Ci0KLSAgPHJlZnNlY3QxPgotICAgIDx0aXRsZT5EZXNjcmlwdGlvbjwvdGl0bGU+Ci0KLSAgICA8cGFyYT5UaGUgPGZ1bmN0aW9uPmlvY3RsKCk8L2Z1bmN0aW9uPiBmdW5jdGlvbiBpcyB1c2VkIHRvIHByb2dyYW0KLVY0TDIgZGV2aWNlcy4gVGhlIGFyZ3VtZW50IDxwYXJhbWV0ZXI+ZmQ8L3BhcmFtZXRlcj4gbXVzdCBiZSBhbiBvcGVuCi1maWxlIGRlc2NyaXB0b3IuIEFuIGlvY3RsIDxwYXJhbWV0ZXI+cmVxdWVzdDwvcGFyYW1ldGVyPiBoYXMgZW5jb2RlZAotaW4gaXQgd2hldGhlciB0aGUgYXJndW1lbnQgaXMgYW4gaW5wdXQsIG91dHB1dCBvciByZWFkL3dyaXRlCi1wYXJhbWV0ZXIsIGFuZCB0aGUgc2l6ZSBvZiB0aGUgYXJndW1lbnQgPHBhcmFtZXRlcj5hcmdwPC9wYXJhbWV0ZXI+IGluCi1ieXRlcy4gTWFjcm9zIGFuZCBkZWZpbmVzIHNwZWNpZnlpbmcgVjRMMiBpb2N0bCByZXF1ZXN0cyBhcmUgbG9jYXRlZAotaW4gdGhlIDxmaWxlbmFtZT52aWRlb2RldjIuaDwvZmlsZW5hbWU+IGhlYWRlciBmaWxlLgotQXBwbGljYXRpb25zIHNob3VsZCB1c2UgdGhlaXIgb3duIGNvcHksIG5vdCBpbmNsdWRlIHRoZSB2ZXJzaW9uIGluIHRoZQota2VybmVsIHNvdXJjZXMgb24gdGhlIHN5c3RlbSB0aGV5IGNvbXBpbGUgb24uIEFsbCBWNEwyIGlvY3RsIHJlcXVlc3RzLAotdGhlaXIgcmVzcGVjdGl2ZSBmdW5jdGlvbiBhbmQgcGFyYW1ldGVycyBhcmUgc3BlY2lmaWVkIGluIDx4cmVmCi0JbGlua2VuZD0idXNlci1mdW5jIiAvPi48L3BhcmE+Ci0gIDwvcmVmc2VjdDE+Ci0KLSAgPHJlZnNlY3QxPgotICAgIDx0aXRsZT5SZXR1cm4gVmFsdWU8L3RpdGxlPgotCi0gICAgPHBhcmE+T24gc3VjY2VzcyB0aGUgPGZ1bmN0aW9uPmlvY3RsKCk8L2Z1bmN0aW9uPiBmdW5jdGlvbiByZXR1cm5zCi08cmV0dXJudmFsdWU+MDwvcmV0dXJudmFsdWU+IGFuZCBkb2VzIG5vdCByZXNldCB0aGUKLTx2YXJuYW1lPmVycm5vPC92YXJuYW1lPiB2YXJpYWJsZS4gT24gZmFpbHVyZQotPHJldHVybnZhbHVlPi0xPC9yZXR1cm52YWx1ZT4gaXMgcmV0dXJuZWQsIHdoZW4gdGhlIGlvY3RsIHRha2VzIGFuCi1vdXRwdXQgb3IgcmVhZC93cml0ZSBwYXJhbWV0ZXIgaXQgcmVtYWlucyB1bm1vZGlmaWVkLCBhbmQgdGhlCi08dmFybmFtZT5lcnJubzwvdmFybmFtZT4gdmFyaWFibGUgaXMgc2V0IGFwcHJvcHJpYXRlbHkuIFNlZSBiZWxvdyBmb3IKLXBvc3NpYmxlIGVycm9yIGNvZGVzLiBHZW5lcmljIGVycm9ycyBsaWtlIDxlcnJvcmNvZGU+RUJBREY8L2Vycm9yY29kZT4KLW9yIDxlcnJvcmNvZGU+RUZBVUxUPC9lcnJvcmNvZGU+IGFyZSBub3QgbGlzdGVkIGluIHRoZSBzZWN0aW9ucwotZGlzY3Vzc2luZyBpbmRpdmlkdWFsIGlvY3RsIHJlcXVlc3RzLjwvcGFyYT4KLSAgICA8cGFyYT5Ob3RlIGlvY3RscyBtYXkgcmV0dXJuIHVuZGVmaW5lZCBlcnJvciBjb2Rlcy4gU2luY2UgZXJyb3JzCi1tYXkgaGF2ZSBzaWRlIGVmZmVjdHMgc3VjaCBhcyBhIGRyaXZlciByZXNldCBhcHBsaWNhdGlvbnMgc2hvdWxkCi1hYm9ydCBvbiB1bmV4cGVjdGVkIGVycm9ycy48L3BhcmE+Ci0KLSAgICA8dmFyaWFibGVsaXN0PgotICAgICAgPHZhcmxpc3RlbnRyeT4KLQk8dGVybT48ZXJyb3Jjb2RlPkVCQURGPC9lcnJvcmNvZGU+PC90ZXJtPgotCTxsaXN0aXRlbT4KLQkgIDxwYXJhPjxwYXJhbWV0ZXI+ZmQ8L3BhcmFtZXRlcj4gaXMgbm90IGEgdmFsaWQgb3BlbiBmaWxlCi1kZXNjcmlwdG9yLjwvcGFyYT4KLQk8L2xpc3RpdGVtPgotICAgICAgPC92YXJsaXN0ZW50cnk+Ci0gICAgICA8dmFybGlzdGVudHJ5PgotCTx0ZXJtPjxlcnJvcmNvZGU+RUJVU1k8L2Vycm9yY29kZT48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+VGhlIHByb3BlcnR5IGNhbm5vdCBiZSBjaGFuZ2VkIHJpZ2h0IG5vdy4gVHlwaWNhbGx5Ci10aGlzIGVycm9yIGNvZGUgaXMgcmV0dXJuZWQgd2hlbiBJL08gaXMgaW4gcHJvZ3Jlc3Mgb3IgdGhlIGRyaXZlcgotc3VwcG9ydHMgbXVsdGlwbGUgb3BlbnMgYW5kIGFub3RoZXIgcHJvY2VzcyBsb2NrZWQgdGhlIHByb3BlcnR5LjwvcGFyYT4KLQk8L2xpc3RpdGVtPgotICAgICAgPC92YXJsaXN0ZW50cnk+Ci0gICAgICA8dmFybGlzdGVudHJ5PgotCTx0ZXJtPjxlcnJvcmNvZGU+RUZBVUxUPC9lcnJvcmNvZGU+PC90ZXJtPgotCTxsaXN0aXRlbT4KLQkgIDxwYXJhPjxwYXJhbWV0ZXI+YXJncDwvcGFyYW1ldGVyPiByZWZlcmVuY2VzIGFuIGluYWNjZXNzaWJsZQotbWVtb3J5IGFyZWEuPC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICAgIDx2YXJsaXN0ZW50cnk+Ci0JPHRlcm0+PGVycm9yY29kZT5FTk9UVFk8L2Vycm9yY29kZT48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+PHBhcmFtZXRlcj5mZDwvcGFyYW1ldGVyPiBpcyAgbm90ICBhc3NvY2lhdGVkICB3aXRoICBhCi1jaGFyYWN0ZXIgc3BlY2lhbCBkZXZpY2UuPC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICAgIDx2YXJsaXN0ZW50cnk+Ci0JPHRlcm0+PGVycm9yY29kZT5FSU5WQUw8L2Vycm9yY29kZT48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+VGhlIDxwYXJhbWV0ZXI+cmVxdWVzdDwvcGFyYW1ldGVyPiBvciB0aGUgZGF0YSBwb2ludGVkCi10byBieSA8cGFyYW1ldGVyPmFyZ3A8L3BhcmFtZXRlcj4gaXMgbm90IHZhbGlkLiBUaGlzIGlzIGEgdmVyeSBjb21tb24KLWVycm9yIGNvZGUsIHNlZSB0aGUgaW5kaXZpZHVhbCBpb2N0bCByZXF1ZXN0cyBsaXN0ZWQgaW4gPHhyZWYKLQkgICAgICBsaW5rZW5kPSJ1c2VyLWZ1bmMiIC8+IGZvciBhY3R1YWwgY2F1c2VzLjwvcGFyYT4KLQk8L2xpc3RpdGVtPgotICAgICAgPC92YXJsaXN0ZW50cnk+Ci0gICAgICA8dmFybGlzdGVudHJ5PgotCTx0ZXJtPjxlcnJvcmNvZGU+RU5PTUVNPC9lcnJvcmNvZGU+PC90ZXJtPgotCTxsaXN0aXRlbT4KLQkgIDxwYXJhPk5vdCBlbm91Z2ggcGh5c2ljYWwgb3IgdmlydHVhbCBtZW1vcnkgd2FzIGF2YWlsYWJsZSB0bwotY29tcGxldGUgdGhlIHJlcXVlc3QuPC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICAgIDx2YXJsaXN0ZW50cnk+Ci0JPHRlcm0+PGVycm9yY29kZT5FUkFOR0U8L2Vycm9yY29kZT48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+VGhlIGFwcGxpY2F0aW9uIGF0dGVtcHRlZCB0byBzZXQgYSBjb250cm9sIHdpdGggdGhlCi0mVklESU9DLVMtQ1RSTDsgaW9jdGwgdG8gYSB2YWx1ZSB3aGljaCBpcyBvdXQgb2YgYm91bmRzLjwvcGFyYT4KLQk8L2xpc3RpdGVtPgotICAgICAgPC92YXJsaXN0ZW50cnk+Ci0gICAgPC92YXJpYWJsZWxpc3Q+Ci0gIDwvcmVmc2VjdDE+Ci08L3JlZmVudHJ5PgotCi08IS0tCi1Mb2NhbCBWYXJpYWJsZXM6Ci1tb2RlOiBzZ21sCi1zZ21sLXBhcmVudC1kb2N1bWVudDogInY0bDIuc2dtbCIKLWluZGVudC10YWJzLW1vZGU6IG5pbAotRW5kOgotLS0+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL21lZGlhLWZ1bmMtaW9jdGwueG1sIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9tZWRpYS1mdW5jLWlvY3RsLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRhODYwNC4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL21lZGlhLWZ1bmMtaW9jdGwueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLTxyZWZlbnRyeSBpZD0ibWVkaWEtZnVuYy1pb2N0bCI+Ci0gIDxyZWZtZXRhPgotICAgIDxyZWZlbnRyeXRpdGxlPm1lZGlhIGlvY3RsKCk8L3JlZmVudHJ5dGl0bGU+Ci0gICAgJm1hbnZvbDsKLSAgPC9yZWZtZXRhPgotCi0gIDxyZWZuYW1lZGl2PgotICAgIDxyZWZuYW1lPm1lZGlhLWlvY3RsPC9yZWZuYW1lPgotICAgIDxyZWZwdXJwb3NlPkNvbnRyb2wgYSBtZWRpYSBkZXZpY2U8L3JlZnB1cnBvc2U+Ci0gIDwvcmVmbmFtZWRpdj4KLQotICA8cmVmc3lub3BzaXNkaXY+Ci0gICAgPGZ1bmNzeW5vcHNpcz4KLSAgICAgIDxmdW5jc3lub3BzaXNpbmZvPiNpbmNsdWRlICZsdDtzeXMvaW9jdGwuaCZndDs8L2Z1bmNzeW5vcHNpc2luZm8+Ci0gICAgICA8ZnVuY3Byb3RvdHlwZT4KLQk8ZnVuY2RlZj5pbnQgPGZ1bmN0aW9uPmlvY3RsPC9mdW5jdGlvbj48L2Z1bmNkZWY+Ci0JPHBhcmFtZGVmPmludCA8cGFyYW1ldGVyPmZkPC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KLQk8cGFyYW1kZWY+aW50IDxwYXJhbWV0ZXI+cmVxdWVzdDwvcGFyYW1ldGVyPjwvcGFyYW1kZWY+Ci0JPHBhcmFtZGVmPnZvaWQgKjxwYXJhbWV0ZXI+YXJncDwvcGFyYW1ldGVyPjwvcGFyYW1kZWY+Ci0gICAgICA8L2Z1bmNwcm90b3R5cGU+Ci0gICAgPC9mdW5jc3lub3BzaXM+Ci0gIDwvcmVmc3lub3BzaXNkaXY+Ci0KLSAgPHJlZnNlY3QxPgotICAgIDx0aXRsZT5Bcmd1bWVudHM8L3RpdGxlPgotCi0gICAgPHZhcmlhYmxlbGlzdD4KLSAgICAgIDx2YXJsaXN0ZW50cnk+Ci0JPHRlcm0+PHBhcmFtZXRlcj5mZDwvcGFyYW1ldGVyPjwvdGVybT4KLQk8bGlzdGl0ZW0+Ci0JICA8cGFyYT4mZmQ7PC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICAgIDx2YXJsaXN0ZW50cnk+Ci0JPHRlcm0+PHBhcmFtZXRlcj5yZXF1ZXN0PC9wYXJhbWV0ZXI+PC90ZXJtPgotCTxsaXN0aXRlbT4KLQkgIDxwYXJhPk1lZGlhIGlvY3RsIHJlcXVlc3QgY29kZSBhcyBkZWZpbmVkIGluIHRoZSBtZWRpYS5oIGhlYWRlciBmaWxlLAotCSAgZm9yIGV4YW1wbGUgTUVESUFfSU9DX1NFVFVQX0xJTksuPC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICAgIDx2YXJsaXN0ZW50cnk+Ci0JPHRlcm0+PHBhcmFtZXRlcj5hcmdwPC9wYXJhbWV0ZXI+PC90ZXJtPgotCTxsaXN0aXRlbT4KLQkgIDxwYXJhPlBvaW50ZXIgdG8gYSByZXF1ZXN0LXNwZWNpZmljIHN0cnVjdHVyZS48L3BhcmE+Ci0JPC9saXN0aXRlbT4KLSAgICAgIDwvdmFybGlzdGVudHJ5PgotICAgIDwvdmFyaWFibGVsaXN0PgotICA8L3JlZnNlY3QxPgotCi0gIDxyZWZzZWN0MT4KLSAgICA8dGl0bGU+RGVzY3JpcHRpb248L3RpdGxlPgotICAgIDxwYXJhPlRoZSA8ZnVuY3Rpb24+aW9jdGwoKTwvZnVuY3Rpb24+IGZ1bmN0aW9uIG1hbmlwdWxhdGVzIG1lZGlhIGRldmljZQotICAgIHBhcmFtZXRlcnMuIFRoZSBhcmd1bWVudCA8cGFyYW1ldGVyPmZkPC9wYXJhbWV0ZXI+IG11c3QgYmUgYW4gb3BlbiBmaWxlCi0gICAgZGVzY3JpcHRvci48L3BhcmE+Ci0gICAgPHBhcmE+VGhlIGlvY3RsIDxwYXJhbWV0ZXI+cmVxdWVzdDwvcGFyYW1ldGVyPiBjb2RlIHNwZWNpZmllcyB0aGUgbWVkaWEKLSAgICBmdW5jdGlvbiB0byBiZSBjYWxsZWQuIEl0IGhhcyBlbmNvZGVkIGluIGl0IHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGFuCi0gICAgaW5wdXQsIG91dHB1dCBvciByZWFkL3dyaXRlIHBhcmFtZXRlciwgYW5kIHRoZSBzaXplIG9mIHRoZSBhcmd1bWVudAotICAgIDxwYXJhbWV0ZXI+YXJncDwvcGFyYW1ldGVyPiBpbiBieXRlcy48L3BhcmE+Ci0gICAgPHBhcmE+TWFjcm9zIGFuZCBzdHJ1Y3R1cmVzIGRlZmluaXRpb25zIHNwZWNpZnlpbmcgbWVkaWEgaW9jdGwgcmVxdWVzdHMgYW5kCi0gICAgdGhlaXIgcGFyYW1ldGVycyBhcmUgbG9jYXRlZCBpbiB0aGUgbWVkaWEuaCBoZWFkZXIgZmlsZS4gQWxsIG1lZGlhIGlvY3RsCi0gICAgcmVxdWVzdHMsIHRoZWlyIHJlc3BlY3RpdmUgZnVuY3Rpb24gYW5kIHBhcmFtZXRlcnMgYXJlIHNwZWNpZmllZCBpbgotICAgIDx4cmVmIGxpbmtlbmQ9Im1lZGlhLXVzZXItZnVuYyIgLz4uPC9wYXJhPgotICA8L3JlZnNlY3QxPgotCi0gIDxyZWZzZWN0MT4KLSAgICA8dGl0bGU+UmV0dXJuIFZhbHVlPC90aXRsZT4KLQotICAgIDxwYXJhPjxmdW5jdGlvbj5pb2N0bCgpPC9mdW5jdGlvbj4gcmV0dXJucyA8cmV0dXJudmFsdWU+MDwvcmV0dXJudmFsdWU+IG9uCi0gICAgc3VjY2Vzcy4gT24gZmFpbHVyZSwgPHJldHVybnZhbHVlPi0xPC9yZXR1cm52YWx1ZT4gaXMgcmV0dXJuZWQsIGFuZCB0aGUKLSAgICA8dmFybmFtZT5lcnJubzwvdmFybmFtZT4gdmFyaWFibGUgaXMgc2V0IGFwcHJvcHJpYXRlbHkuIEdlbmVyaWMgZXJyb3IgY29kZXMKLSAgICBhcmUgbGlzdGVkIGJlbG93LCBhbmQgcmVxdWVzdC1zcGVjaWZpYyBlcnJvciBjb2RlcyBhcmUgbGlzdGVkIGluIHRoZQotICAgIGluZGl2aWR1YWwgcmVxdWVzdHMgZGVzY3JpcHRpb25zLjwvcGFyYT4KLSAgICA8cGFyYT5XaGVuIGFuIGlvY3RsIHRoYXQgdGFrZXMgYW4gb3V0cHV0IG9yIHJlYWQvd3JpdGUgcGFyYW1ldGVyIGZhaWxzLAotICAgIHRoZSBwYXJhbWV0ZXIgcmVtYWlucyB1bm1vZGlmaWVkLjwvcGFyYT4KLQotICAgIDx2YXJpYWJsZWxpc3Q+Ci0gICAgICA8dmFybGlzdGVudHJ5PgotCTx0ZXJtPjxlcnJvcmNvZGU+RUJBREY8L2Vycm9yY29kZT48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+PHBhcmFtZXRlcj5mZDwvcGFyYW1ldGVyPiBpcyBub3QgYSB2YWxpZCBvcGVuIGZpbGUgZGVzY3JpcHRvci4KLQkgIDwvcGFyYT4KLQk8L2xpc3RpdGVtPgotICAgICAgPC92YXJsaXN0ZW50cnk+Ci0gICAgICA8dmFybGlzdGVudHJ5PgotCTx0ZXJtPjxlcnJvcmNvZGU+RUZBVUxUPC9lcnJvcmNvZGU+PC90ZXJtPgotCTxsaXN0aXRlbT4KLQkgIDxwYXJhPjxwYXJhbWV0ZXI+YXJncDwvcGFyYW1ldGVyPiByZWZlcmVuY2VzIGFuIGluYWNjZXNzaWJsZSBtZW1vcnkKLQkgIGFyZWEuPC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICAgIDx2YXJsaXN0ZW50cnk+Ci0JPHRlcm0+PGVycm9yY29kZT5FSU5WQUw8L2Vycm9yY29kZT48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+VGhlIDxwYXJhbWV0ZXI+cmVxdWVzdDwvcGFyYW1ldGVyPiBvciB0aGUgZGF0YSBwb2ludGVkIHRvIGJ5Ci0JICA8cGFyYW1ldGVyPmFyZ3A8L3BhcmFtZXRlcj4gaXMgbm90IHZhbGlkLiBUaGlzIGlzIGEgdmVyeSBjb21tb24gZXJyb3IKLQkgIGNvZGUsIHNlZSB0aGUgaW5kaXZpZHVhbCBpb2N0bCByZXF1ZXN0cyBsaXN0ZWQgaW4KLQkgIDx4cmVmIGxpbmtlbmQ9Im1lZGlhLXVzZXItZnVuYyIgLz4gZm9yIGFjdHVhbCBjYXVzZXMuPC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICAgIDx2YXJsaXN0ZW50cnk+Ci0JPHRlcm0+PGVycm9yY29kZT5FTk9NRU08L2Vycm9yY29kZT48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+SW5zdWZmaWNpZW50IGtlcm5lbCBtZW1vcnkgd2FzIGF2YWlsYWJsZSB0byBjb21wbGV0ZSB0aGUKLQkgIHJlcXVlc3QuPC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICAgIDx2YXJsaXN0ZW50cnk+Ci0JPHRlcm0+PGVycm9yY29kZT5FTk9UVFk8L2Vycm9yY29kZT48L3Rlcm0+Ci0JPGxpc3RpdGVtPgotCSAgPHBhcmE+PHBhcmFtZXRlcj5mZDwvcGFyYW1ldGVyPiBpcyAgbm90ICBhc3NvY2lhdGVkICB3aXRoICBhIGNoYXJhY3RlcgotCSAgc3BlY2lhbCBkZXZpY2UuPC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICA8L3ZhcmlhYmxlbGlzdD4KLSAgPC9yZWZzZWN0MT4KLTwvcmVmZW50cnk+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL252MTJtdC5naWYgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL252MTJtdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMmQ0Y2YuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9udjEybXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9udjEybXRfZXhhbXBsZS5naWYgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL252MTJtdF9leGFtcGxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY4MWQ2OC4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL252MTJtdF9leGFtcGxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvcGlwZWxpbmUucG5nIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXBlbGluZS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxOWI4NmMuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC9waXBlbGluZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZiaV81MjUuZ2lmIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92YmlfNTI1LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU4MGI2OS4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZiaV81MjUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92YmlfNjI1LmdpZiBiL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmJpXzYyNS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZTMyNTEuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL3Y0bC92YmlfNjI1LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmJpX2hzeW5jLmdpZiBiL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmJpX2hzeW5jLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAyNDM0ZC4uMDAwMDAwMAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZiaV9oc3luYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGVvZGV2Mi5oLnhtbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkZW9kZXYyLmgueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTA1MzZhLi4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkZW9kZXYyLmgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTk0NiArMCwwIEBACi08cHJvZ3JhbWxpc3Rpbmc+Ci0vKgotICogIFZpZGVvIGZvciBMaW51eCBUd28gaGVhZGVyIGZpbGUKLSAqCi0gKiAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDcgdGhlIGNvbnRyaWJ1dG9ycwotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICoKLSAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqICBBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gcmVkaXN0cmlidXRlIHRoaXMgZmlsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiAgQlNEIGxpY2Vuc2UgYXMgc3RhdGVkIGJlbG93OgotICoKLSAqICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqICBhcmUgbWV0OgotICogIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgIGRpc3RyaWJ1dGlvbi4KLSAqICAzLiBUaGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gKiAgICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuCi0gKiAgICAgcGVybWlzc2lvbi4KLSAqCi0gKiAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiAgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqICBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqICBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQKLSAqICBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCi0gKiAgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgotICogIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi0gKiAgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICogICAgICBIZWFkZXIgZmlsZSBmb3IgdjRsIG9yIFY0TDIgZHJpdmVycyBhbmQgYXBwbGljYXRpb25zCi0gKiB3aXRoIHB1YmxpYyBBUEkuCi0gKiBBbGwga2VybmVsLXNwZWNpZmljIHN0dWZmIHdlcmUgbW92ZWQgdG8gbWVkaWEvdjRsMi1kZXYuaCwgc28KLSAqIG5vICNpZiBfX0tFUk5FTCB0ZXN0cyBhcmUgYWxsb3dlZCBoZXJlCi0gKgotICogICAgICBTZWUgaHR0cDovL2xpbnV4dHYub3JnIGZvciBtb3JlIGluZm8KLSAqCi0gKiAgICAgIEF1dGhvcjogQmlsbCBEaXJrcyAmbHQ7YmlsbEB0aGVkaXJrcy5vcmcmZ3Q7Ci0gKiAgICAgICAgICAgICAgSnVzdGluIFNjaG9lbWFuCi0gKiAgICAgICAgICAgICAgSGFucyBWZXJrdWlsICZsdDtodmVya3VpbEB4czRhbGwubmwmZ3Q7Ci0gKiAgICAgICAgICAgICAgZXQgYWwuCi0gKi8KLSNpZm5kZWYgX19MSU5VWF9WSURFT0RFVjJfSAotI2RlZmluZSBfX0xJTlVYX1ZJREVPREVWMl9ICi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0jaW5jbHVkZSAmbHQ7bGludXgvdGltZS5oJmd0OyAgICAgLyogbmVlZCBzdHJ1Y3QgdGltZXZhbCAqLwotI2Vsc2UKLSNpbmNsdWRlICZsdDtzeXMvdGltZS5oJmd0OwotI2VuZGlmCi0jaW5jbHVkZSAmbHQ7bGludXgvY29tcGlsZXIuaCZndDsKLSNpbmNsdWRlICZsdDtsaW51eC9pb2N0bC5oJmd0OwotI2luY2x1ZGUgJmx0O2xpbnV4L3R5cGVzLmgmZ3Q7Ci0KLS8qCi0gKiBDb21tb24gc3R1ZmYgZm9yIGJvdGggVjRMMSBhbmQgVjRMMgotICogTW92ZWQgZnJvbSB2aWRlb2Rldi5oCi0gKi8KLSNkZWZpbmUgVklERU9fTUFYX0ZSQU1FICAgICAgICAgICAgICAgMzIKLSNkZWZpbmUgVklERU9fTUFYX1BMQU5FUyAgICAgICAgICAgICAgIDgKLQotI2lmbmRlZiBfX0tFUk5FTF9fCi0KLS8qIFRoZXNlIGRlZmluZXMgYXJlIFY0TDEgc3BlY2lmaWMgYW5kIHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIHRoZSBWNEwyIEFQSSEKLSAgIFRoZXkgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhpcyBoZWFkZXIgaW4gdGhlIGZ1dHVyZS4gKi8KLQotI2RlZmluZSBWSURfVFlQRV9DQVBUVVJFICAgICAgICAxICAgICAgIC8qIENhbiBjYXB0dXJlICovCi0jZGVmaW5lIFZJRF9UWVBFX1RVTkVSICAgICAgICAgIDIgICAgICAgLyogQ2FuIHR1bmUgKi8KLSNkZWZpbmUgVklEX1RZUEVfVEVMRVRFWFQgICAgICAgNCAgICAgICAvKiBEb2VzIHRlbGV0ZXh0ICovCi0jZGVmaW5lIFZJRF9UWVBFX09WRVJMQVkgICAgICAgIDggICAgICAgLyogT3ZlcmxheSBvbnRvIGZyYW1lIGJ1ZmZlciAqLwotI2RlZmluZSBWSURfVFlQRV9DSFJPTUFLRVkgICAgICAxNiAgICAgIC8qIE92ZXJsYXkgYnkgY2hyb21ha2V5ICovCi0jZGVmaW5lIFZJRF9UWVBFX0NMSVBQSU5HICAgICAgIDMyICAgICAgLyogQ2FuIGNsaXAgKi8KLSNkZWZpbmUgVklEX1RZUEVfRlJBTUVSQU0gICAgICAgNjQgICAgICAvKiBVc2VzIHRoZSBmcmFtZSBidWZmZXIgbWVtb3J5ICovCi0jZGVmaW5lIFZJRF9UWVBFX1NDQUxFUyAgICAgICAgIDEyOCAgICAgLyogU2NhbGFibGUgKi8KLSNkZWZpbmUgVklEX1RZUEVfTU9OT0NIUk9NRSAgICAgMjU2ICAgICAvKiBNb25vY2hyb21lIG9ubHkgKi8KLSNkZWZpbmUgVklEX1RZUEVfU1VCQ0FQVFVSRSAgICAgNTEyICAgICAvKiBDYW4gY2FwdHVyZSBzdWJhcmVhcyBvZiB0aGUgaW1hZ2UgKi8KLSNkZWZpbmUgVklEX1RZUEVfTVBFR19ERUNPREVSICAgMTAyNCAgICAvKiBDYW4gZGVjb2RlIE1QRUcgc3RyZWFtcyAqLwotI2RlZmluZSBWSURfVFlQRV9NUEVHX0VOQ09ERVIgICAyMDQ4ICAgIC8qIENhbiBlbmNvZGUgTVBFRyBzdHJlYW1zICovCi0jZGVmaW5lIFZJRF9UWVBFX01KUEVHX0RFQ09ERVIgIDQwOTYgICAgLyogQ2FuIGRlY29kZSBNSlBFRyBzdHJlYW1zICovCi0jZGVmaW5lIFZJRF9UWVBFX01KUEVHX0VOQ09ERVIgIDgxOTIgICAgLyogQ2FuIGVuY29kZSBNSlBFRyBzdHJlYW1zICovCi0jZW5kaWYKLQotLyoKLSAqICAgICAgTSBJIFMgQyBFIEwgTCBBIE4gRSBPIFUgUwotICovCi0KLS8qICBGb3VyLWNoYXJhY3Rlci1jb2RlIChGT1VSQ0MpICovCi0jZGVmaW5lIHY0bDJfZm91cmNjKGEsIGIsIGMsIGQpXAotICAgICAgICAoKF9fdTMyKShhKSB8ICgoX191MzIpKGIpICZsdDsmbHQ7IDgpIHwgKChfX3UzMikoYykgJmx0OyZsdDsgMTYpIHwgKChfX3UzMikoZCkgJmx0OyZsdDsgMjQpKQotCi0vKgotICogICAgICBFIE4gVSBNIFMKLSAqLwotZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLWZpZWxkIj52NGwyX2ZpZWxkPC9saW5rPiB7Ci0gICAgICAgIFY0TDJfRklFTERfQU5ZICAgICAgICAgICA9IDAsIC8qIGRyaXZlciBjYW4gY2hvb3NlIGZyb20gbm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wLCBib3R0b20sIGludGVybGFjZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kaW5nIG9uIHdoYXRldmVyIGl0IHRoaW5rcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhcHByb3hpbWF0ZSAuLi4gKi8KLSAgICAgICAgVjRMMl9GSUVMRF9OT05FICAgICAgICAgID0gMSwgLyogdGhpcyBkZXZpY2UgaGFzIG5vIGZpZWxkcyAuLi4gKi8KLSAgICAgICAgVjRMMl9GSUVMRF9UT1AgICAgICAgICAgID0gMiwgLyogdG9wIGZpZWxkIG9ubHkgKi8KLSAgICAgICAgVjRMMl9GSUVMRF9CT1RUT00gICAgICAgID0gMywgLyogYm90dG9tIGZpZWxkIG9ubHkgKi8KLSAgICAgICAgVjRMMl9GSUVMRF9JTlRFUkxBQ0VEICAgID0gNCwgLyogYm90aCBmaWVsZHMgaW50ZXJsYWNlZCAqLwotICAgICAgICBWNEwyX0ZJRUxEX1NFUV9UQiAgICAgICAgPSA1LCAvKiBib3RoIGZpZWxkcyBzZXF1ZW50aWFsIGludG8gb25lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgdG9wLWJvdHRvbSBvcmRlciAqLwotICAgICAgICBWNEwyX0ZJRUxEX1NFUV9CVCAgICAgICAgPSA2LCAvKiBzYW1lIGFzIGFib3ZlICsgYm90dG9tLXRvcCBvcmRlciAqLwotICAgICAgICBWNEwyX0ZJRUxEX0FMVEVSTkFURSAgICAgPSA3LCAvKiBib3RoIGZpZWxkcyBhbHRlcm5hdGluZyBpbnRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRlIGJ1ZmZlcnMgKi8KLSAgICAgICAgVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX1RCID0gOCwgLyogYm90aCBmaWVsZHMgaW50ZXJsYWNlZCwgdG9wIGZpZWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0IGFuZCB0aGUgdG9wIGZpZWxkIGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbWl0dGVkIGZpcnN0ICovCi0gICAgICAgIFY0TDJfRklFTERfSU5URVJMQUNFRF9CVCA9IDksIC8qIGJvdGggZmllbGRzIGludGVybGFjZWQsIHRvcCBmaWVsZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCBhbmQgdGhlIGJvdHRvbSBmaWVsZCBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc21pdHRlZCBmaXJzdCAqLwotfTsKLSNkZWZpbmUgVjRMMl9GSUVMRF9IQVNfVE9QKGZpZWxkKSAgICAgICBcCi0gICAgICAgICgoZmllbGQpID09IFY0TDJfRklFTERfVE9QICAgICAgfHxcCi0gICAgICAgICAoZmllbGQpID09IFY0TDJfRklFTERfSU5URVJMQUNFRCB8fFwKLSAgICAgICAgIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX1RCIHx8XAotICAgICAgICAgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfQlQgfHxcCi0gICAgICAgICAoZmllbGQpID09IFY0TDJfRklFTERfU0VRX1RCICAgfHxcCi0gICAgICAgICAoZmllbGQpID09IFY0TDJfRklFTERfU0VRX0JUKQotI2RlZmluZSBWNEwyX0ZJRUxEX0hBU19CT1RUT00oZmllbGQpICAgIFwKLSAgICAgICAgKChmaWVsZCkgPT0gVjRMMl9GSUVMRF9CT1RUT00gICB8fFwKLSAgICAgICAgIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEIHx8XAotICAgICAgICAgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRURfVEIgfHxcCi0gICAgICAgICAoZmllbGQpID09IFY0TDJfRklFTERfSU5URVJMQUNFRF9CVCB8fFwKLSAgICAgICAgIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9TRVFfVEIgICB8fFwKLSAgICAgICAgIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9TRVFfQlQpCi0jZGVmaW5lIFY0TDJfRklFTERfSEFTX0JPVEgoZmllbGQpICAgICAgXAotICAgICAgICAoKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQgfHxcCi0gICAgICAgICAoZmllbGQpID09IFY0TDJfRklFTERfSU5URVJMQUNFRF9UQiB8fFwKLSAgICAgICAgIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEX0JUIHx8XAotICAgICAgICAgKGZpZWxkKSA9PSBWNEwyX0ZJRUxEX1NFUV9UQiB8fFwKLSAgICAgICAgIChmaWVsZCkgPT0gVjRMMl9GSUVMRF9TRVFfQlQpCi0KLWVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1idWYtdHlwZSI+djRsMl9idWZfdHlwZTwvbGluaz4gewotICAgICAgICBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgICAgICAgID0gMSwKLSAgICAgICAgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQgICAgICAgICA9IDIsCi0gICAgICAgIFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWSAgICAgICAgPSAzLAotICAgICAgICBWNEwyX0JVRl9UWVBFX1ZCSV9DQVBUVVJFICAgICAgICAgID0gNCwKLSAgICAgICAgVjRMMl9CVUZfVFlQRV9WQklfT1VUUFVUICAgICAgICAgICA9IDUsCi0gICAgICAgIFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9DQVBUVVJFICAgPSA2LAotICAgICAgICBWNEwyX0JVRl9UWVBFX1NMSUNFRF9WQklfT1VUUFVUICAgID0gNywKLSNpZiAxCi0gICAgICAgIC8qIEV4cGVyaW1lbnRhbCAqLwotICAgICAgICBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9PVkVSTEFZID0gOCwKLSNlbmRpZgotICAgICAgICBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FID0gOSwKLSAgICAgICAgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FICA9IDEwLAotICAgICAgICBWNEwyX0JVRl9UWVBFX1BSSVZBVEUgICAgICAgICAgICAgID0gMHg4MCwKLX07Ci0KLSNkZWZpbmUgVjRMMl9UWVBFX0lTX01VTFRJUExBTkFSKHR5cGUpICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoKHR5cGUpID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUgICBcCi0gICAgICAgICB8fCAodHlwZSkgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKQotCi0jZGVmaW5lIFY0TDJfVFlQRV9JU19PVVRQVVQodHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAoKHR5cGUpID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIHx8ICh0eXBlKSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUgICAgICAgICBcCi0gICAgICAgICB8fCAodHlwZSkgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVkVSTEFZICAgICAgICAgICAgICAgXAotICAgICAgICAgfHwgKHR5cGUpID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX09WRVJMQVkgICAgICAgIFwKLSAgICAgICAgIHx8ICh0eXBlKSA9PSBWNEwyX0JVRl9UWVBFX1ZCSV9PVVRQVVQgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICB8fCAodHlwZSkgPT0gVjRMMl9CVUZfVFlQRV9TTElDRURfVkJJX09VVFBVVCkKLQotZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLXR1bmVyLXR5cGUiPnY0bDJfdHVuZXJfdHlwZTwvbGluaz4gewotICAgICAgICBWNEwyX1RVTkVSX1JBRElPICAgICAgICAgICAgID0gMSwKLSAgICAgICAgVjRMMl9UVU5FUl9BTkFMT0dfVFYgICAgICAgICA9IDIsCi0gICAgICAgIFY0TDJfVFVORVJfRElHSVRBTF9UViAgICAgICAgPSAzLAotfTsKLQotZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLW1lbW9yeSI+djRsMl9tZW1vcnk8L2xpbms+IHsKLSAgICAgICAgVjRMMl9NRU1PUllfTU1BUCAgICAgICAgICAgICA9IDEsCi0gICAgICAgIFY0TDJfTUVNT1JZX1VTRVJQVFIgICAgICAgICAgPSAyLAotICAgICAgICBWNEwyX01FTU9SWV9PVkVSTEFZICAgICAgICAgID0gMywKLX07Ci0KLS8qIHNlZSBhbHNvIGh0dHA6Ly92ZWt0b3IudGhlb3JlbS5jYS9ncmFwaGljcy95Y2Jjci8gKi8KLWVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1jb2xvcnNwYWNlIj52NGwyX2NvbG9yc3BhY2U8L2xpbms+IHsKLSAgICAgICAgLyogSVRVLVIgNjAxIC0tIGJyb2FkY2FzdCBOVFNDL1BBTCAqLwotICAgICAgICBWNEwyX0NPTE9SU1BBQ0VfU01QVEUxNzBNICAgICA9IDEsCi0KLSAgICAgICAgLyogMTEyNS1MaW5lIChVUykgSERUViAqLwotICAgICAgICBWNEwyX0NPTE9SU1BBQ0VfU01QVEUyNDBNICAgICA9IDIsCi0KLSAgICAgICAgLyogSEQgYW5kIG1vZGVybiBjYXB0dXJlcy4gKi8KLSAgICAgICAgVjRMMl9DT0xPUlNQQUNFX1JFQzcwOSAgICAgICAgPSAzLAotCi0gICAgICAgIC8qIGJyb2tlbiBCVDg3OCBleHRlbnRzICg2MDEsIGx1bWEgcmFuZ2UgMTYtMjUzIGluc3RlYWQgb2YgMTYtMjM1KSAqLwotICAgICAgICBWNEwyX0NPTE9SU1BBQ0VfQlQ4NzggICAgICAgICA9IDQsCi0KLSAgICAgICAgLyogVGhlc2Ugc2hvdWxkIGJlIHVzZWZ1bC4gIEFzc3VtZSA2MDEgZXh0ZW50cy4gKi8KLSAgICAgICAgVjRMMl9DT0xPUlNQQUNFXzQ3MF9TWVNURU1fTSAgPSA1LAotICAgICAgICBWNEwyX0NPTE9SU1BBQ0VfNDcwX1NZU1RFTV9CRyA9IDYsCi0KLSAgICAgICAgLyogSSBrbm93IHRoZXJlIHdpbGwgYmUgY2FtZXJhcyB0aGF0IHNlbmQgdGhpcy4gIFNvLCB0aGlzIGlzCi0gICAgICAgICAqIHVuc3BlY2lmaWVkIGNocm9tYXRpY2l0aWVzIGFuZCBmdWxsIDAtMjU1IG9uIGVhY2ggb2YgdGhlCi0gICAgICAgICAqIFknQ2JDciBjb21wb25lbnRzCi0gICAgICAgICAqLwotICAgICAgICBWNEwyX0NPTE9SU1BBQ0VfSlBFRyAgICAgICAgICA9IDcsCi0KLSAgICAgICAgLyogRm9yIFJHQiBjb2xvdXJzcGFjZXMsIHRoaXMgaXMgcHJvYmFibHkgYSBnb29kIHN0YXJ0LiAqLwotICAgICAgICBWNEwyX0NPTE9SU1BBQ0VfU1JHQiAgICAgICAgICA9IDgsCi19OwotCi1lbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItcHJpb3JpdHkiPnY0bDJfcHJpb3JpdHk8L2xpbms+IHsKLSAgICAgICAgVjRMMl9QUklPUklUWV9VTlNFVCAgICAgICA9IDAsICAvKiBub3QgaW5pdGlhbGl6ZWQgKi8KLSAgICAgICAgVjRMMl9QUklPUklUWV9CQUNLR1JPVU5EICA9IDEsCi0gICAgICAgIFY0TDJfUFJJT1JJVFlfSU5URVJBQ1RJVkUgPSAyLAotICAgICAgICBWNEwyX1BSSU9SSVRZX1JFQ09SRCAgICAgID0gMywKLSAgICAgICAgVjRMMl9QUklPUklUWV9ERUZBVUxUICAgICA9IFY0TDJfUFJJT1JJVFlfSU5URVJBQ1RJVkUsCi19OwotCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1yZWN0Ij52NGwyX3JlY3Q8L2xpbms+IHsKLSAgICAgICAgX19zMzIgICBsZWZ0OwotICAgICAgICBfX3MzMiAgIHRvcDsKLSAgICAgICAgX19zMzIgICB3aWR0aDsKLSAgICAgICAgX19zMzIgICBoZWlnaHQ7Ci19OwotCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1mcmFjdCI+djRsMl9mcmFjdDwvbGluaz4gewotICAgICAgICBfX3UzMiAgIG51bWVyYXRvcjsKLSAgICAgICAgX191MzIgICBkZW5vbWluYXRvcjsKLX07Ci0KLS8qCi0gKiAgICAgIEQgUiBJIFYgRSBSICAgQyBBIFAgQSBCIEkgTCBJIFQgSSBFIFMKLSAqLwotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItY2FwYWJpbGl0eSI+djRsMl9jYXBhYmlsaXR5PC9saW5rPiB7Ci0gICAgICAgIF9fdTggICAgZHJpdmVyWzE2XTsgICAgIC8qIGkuZS5pZTsgImJ0dHYiICovCi0gICAgICAgIF9fdTggICAgY2FyZFszMl07ICAgICAgIC8qIGkuZS5pZTsgIkhhdXBwYXVnZSBXaW5UViIgKi8KLSAgICAgICAgX191OCAgICBidXNfaW5mb1szMl07ICAgLyogIlBDSToiICsgcGNpX25hbWUocGNpX2RldikgKi8KLSAgICAgICAgX191MzIgICB2ZXJzaW9uOyAgICAgICAgLyogc2hvdWxkIHVzZSBLRVJORUxfVkVSU0lPTigpICovCi0gICAgICAgIF9fdTMyICAgY2FwYWJpbGl0aWVzOyAgIC8qIERldmljZSBjYXBhYmlsaXRpZXMgKi8KLSAgICAgICAgX191MzIgICByZXNlcnZlZFs0XTsKLX07Ci0KLS8qIFZhbHVlcyBmb3IgJ2NhcGFiaWxpdGllcycgZmllbGQgKi8KLSNkZWZpbmUgVjRMMl9DQVBfVklERU9fQ0FQVFVSRSAgICAgICAgICAweDAwMDAwMDAxICAvKiBJcyBhIHZpZGVvIGNhcHR1cmUgZGV2aWNlICovCi0jZGVmaW5lIFY0TDJfQ0FQX1ZJREVPX09VVFBVVCAgICAgICAgICAgMHgwMDAwMDAwMiAgLyogSXMgYSB2aWRlbyBvdXRwdXQgZGV2aWNlICovCi0jZGVmaW5lIFY0TDJfQ0FQX1ZJREVPX09WRVJMQVkgICAgICAgICAgMHgwMDAwMDAwNCAgLyogQ2FuIGRvIHZpZGVvIG92ZXJsYXkgKi8KLSNkZWZpbmUgVjRMMl9DQVBfVkJJX0NBUFRVUkUgICAgICAgICAgICAweDAwMDAwMDEwICAvKiBJcyBhIHJhdyBWQkkgY2FwdHVyZSBkZXZpY2UgKi8KLSNkZWZpbmUgVjRMMl9DQVBfVkJJX09VVFBVVCAgICAgICAgICAgICAweDAwMDAwMDIwICAvKiBJcyBhIHJhdyBWQkkgb3V0cHV0IGRldmljZSAqLwotI2RlZmluZSBWNEwyX0NBUF9TTElDRURfVkJJX0NBUFRVUkUgICAgIDB4MDAwMDAwNDAgIC8qIElzIGEgc2xpY2VkIFZCSSBjYXB0dXJlIGRldmljZSAqLwotI2RlZmluZSBWNEwyX0NBUF9TTElDRURfVkJJX09VVFBVVCAgICAgIDB4MDAwMDAwODAgIC8qIElzIGEgc2xpY2VkIFZCSSBvdXRwdXQgZGV2aWNlICovCi0jZGVmaW5lIFY0TDJfQ0FQX1JEU19DQVBUVVJFICAgICAgICAgICAgMHgwMDAwMDEwMCAgLyogUkRTIGRhdGEgY2FwdHVyZSAqLwotI2RlZmluZSBWNEwyX0NBUF9WSURFT19PVVRQVVRfT1ZFUkxBWSAgIDB4MDAwMDAyMDAgIC8qIENhbiBkbyB2aWRlbyBvdXRwdXQgb3ZlcmxheSAqLwotI2RlZmluZSBWNEwyX0NBUF9IV19GUkVRX1NFRUsgICAgICAgICAgIDB4MDAwMDA0MDAgIC8qIENhbiBkbyBoYXJkd2FyZSBmcmVxdWVuY3kgc2VlayAgKi8KLSNkZWZpbmUgVjRMMl9DQVBfUkRTX09VVFBVVCAgICAgICAgICAgICAweDAwMDAwODAwICAvKiBJcyBhbiBSRFMgZW5jb2RlciAqLwotCi0vKiBJcyBhIHZpZGVvIGNhcHR1cmUgZGV2aWNlIHRoYXQgc3VwcG9ydHMgbXVsdGlwbGFuYXIgZm9ybWF0cyAqLwotI2RlZmluZSBWNEwyX0NBUF9WSURFT19DQVBUVVJFX01QTEFORSAgIDB4MDAwMDEwMDAKLS8qIElzIGEgdmlkZW8gb3V0cHV0IGRldmljZSB0aGF0IHN1cHBvcnRzIG11bHRpcGxhbmFyIGZvcm1hdHMgKi8KLSNkZWZpbmUgVjRMMl9DQVBfVklERU9fT1VUUFVUX01QTEFORSAgICAweDAwMDAyMDAwCi0KLSNkZWZpbmUgVjRMMl9DQVBfVFVORVIgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwICAvKiBoYXMgYSB0dW5lciAqLwotI2RlZmluZSBWNEwyX0NBUF9BVURJTyAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAgIC8qIGhhcyBhdWRpbyBzdXBwb3J0ICovCi0jZGVmaW5lIFY0TDJfQ0FQX1JBRElPICAgICAgICAgICAgICAgICAgMHgwMDA0MDAwMCAgLyogaXMgYSByYWRpbyBkZXZpY2UgKi8KLSNkZWZpbmUgVjRMMl9DQVBfTU9EVUxBVE9SICAgICAgICAgICAgICAweDAwMDgwMDAwICAvKiBoYXMgYSBtb2R1bGF0b3IgKi8KLQotI2RlZmluZSBWNEwyX0NBUF9SRUFEV1JJVEUgICAgICAgICAgICAgIDB4MDEwMDAwMDAgIC8qIHJlYWQvd3JpdGUgc3lzdGVtY2FsbHMgKi8KLSNkZWZpbmUgVjRMMl9DQVBfQVNZTkNJTyAgICAgICAgICAgICAgICAweDAyMDAwMDAwICAvKiBhc3luYyBJL08gKi8KLSNkZWZpbmUgVjRMMl9DQVBfU1RSRUFNSU5HICAgICAgICAgICAgICAweDA0MDAwMDAwICAvKiBzdHJlYW1pbmcgSS9PIGlvY3RscyAqLwotCi0vKgotICogICAgICBWIEkgRCBFIE8gICBJIE0gQSBHIEUgICBGIE8gUiBNIEEgVAotICovCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1waXgtZm9ybWF0Ij52NGwyX3BpeF9mb3JtYXQ8L2xpbms+IHsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgd2lkdGg7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIGhlaWdodDsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgcGl4ZWxmb3JtYXQ7Ci0gICAgICAgIGVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1maWVsZCI+djRsMl9maWVsZDwvbGluaz4gICAgICAgICBmaWVsZDsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgYnl0ZXNwZXJsaW5lOyAgIC8qIGZvciBwYWRkaW5nLCB6ZXJvIGlmIHVudXNlZCAqLwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICBzaXplaW1hZ2U7Ci0gICAgICAgIGVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1jb2xvcnNwYWNlIj52NGwyX2NvbG9yc3BhY2U8L2xpbms+ICAgIGNvbG9yc3BhY2U7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIHByaXY7ICAgICAgICAgICAvKiBwcml2YXRlIGRhdGEsIGRlcGVuZHMgb24gcGl4ZWxmb3JtYXQgKi8KLX07Ci0KLS8qICAgICAgUGl4ZWwgZm9ybWF0ICAgICAgICAgRk9VUkNDICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCAgRGVzY3JpcHRpb24gICovCi0KLS8qIFJHQiBmb3JtYXRzICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1SR0IzMzIiPlY0TDJfUElYX0ZNVF9SR0IzMzI8L2xpbms+ICB2NGwyX2ZvdXJjYygnUicsICdHJywgJ0InLCAnMScpIC8qICA4ICBSR0ItMy0zLTIgICAgICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1SR0I0NDQiPlY0TDJfUElYX0ZNVF9SR0I0NDQ8L2xpbms+ICB2NGwyX2ZvdXJjYygnUicsICc0JywgJzQnLCAnNCcpIC8qIDE2ICB4eHh4cnJyciBnZ2dnYmJiYiAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtUkdCNTU1Ij5WNEwyX1BJWF9GTVRfUkdCNTU1PC9saW5rPiAgdjRsMl9mb3VyY2MoJ1InLCAnRycsICdCJywgJ08nKSAvKiAxNiAgUkdCLTUtNS01ICAgICAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtUkdCNTY1Ij5WNEwyX1BJWF9GTVRfUkdCNTY1PC9saW5rPiAgdjRsMl9mb3VyY2MoJ1InLCAnRycsICdCJywgJ1AnKSAvKiAxNiAgUkdCLTUtNi01ICAgICAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtUkdCNTU1WCI+VjRMMl9QSVhfRk1UX1JHQjU1NVg8L2xpbms+IHY0bDJfZm91cmNjKCdSJywgJ0cnLCAnQicsICdRJykgLyogMTYgIFJHQi01LTUtNSBCRSAgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVJHQjU2NVgiPlY0TDJfUElYX0ZNVF9SR0I1NjVYPC9saW5rPiB2NGwyX2ZvdXJjYygnUicsICdHJywgJ0InLCAnUicpIC8qIDE2ICBSR0ItNS02LTUgQkUgICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1CR1I2NjYiPlY0TDJfUElYX0ZNVF9CR1I2NjY8L2xpbms+ICB2NGwyX2ZvdXJjYygnQicsICdHJywgJ1InLCAnSCcpIC8qIDE4ICBCR1ItNi02LTYgICAgICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1CR1IyNCI+VjRMMl9QSVhfRk1UX0JHUjI0PC9saW5rPiAgIHY0bDJfZm91cmNjKCdCJywgJ0cnLCAnUicsICczJykgLyogMjQgIEJHUi04LTgtOCAgICAgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVJHQjI0Ij5WNEwyX1BJWF9GTVRfUkdCMjQ8L2xpbms+ICAgdjRsMl9mb3VyY2MoJ1InLCAnRycsICdCJywgJzMnKSAvKiAyNCAgUkdCLTgtOC04ICAgICAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtQkdSMzIiPlY0TDJfUElYX0ZNVF9CR1IzMjwvbGluaz4gICB2NGwyX2ZvdXJjYygnQicsICdHJywgJ1InLCAnNCcpIC8qIDMyICBCR1ItOC04LTgtOCAgICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1SR0IzMiI+VjRMMl9QSVhfRk1UX1JHQjMyPC9saW5rPiAgIHY0bDJfZm91cmNjKCdSJywgJ0cnLCAnQicsICc0JykgLyogMzIgIFJHQi04LTgtOC04ICAgKi8KLQotLyogR3JleSBmb3JtYXRzICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1HUkVZIj5WNEwyX1BJWF9GTVRfR1JFWTwvbGluaz4gICAgdjRsMl9mb3VyY2MoJ0cnLCAnUicsICdFJywgJ1knKSAvKiAgOCAgR3JleXNjYWxlICAgICAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtWTQiPlY0TDJfUElYX0ZNVF9ZNDwvbGluaz4gICAgICB2NGwyX2ZvdXJjYygnWScsICcwJywgJzQnLCAnICcpIC8qICA0ICBHcmV5c2NhbGUgICAgICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1ZNiI+VjRMMl9QSVhfRk1UX1k2PC9saW5rPiAgICAgIHY0bDJfZm91cmNjKCdZJywgJzAnLCAnNicsICcgJykgLyogIDYgIEdyZXlzY2FsZSAgICAgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVkxMCI+VjRMMl9QSVhfRk1UX1kxMDwvbGluaz4gICAgIHY0bDJfZm91cmNjKCdZJywgJzEnLCAnMCcsICcgJykgLyogMTAgIEdyZXlzY2FsZSAgICAgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVkxNiI+VjRMMl9QSVhfRk1UX1kxNjwvbGluaz4gICAgIHY0bDJfZm91cmNjKCdZJywgJzEnLCAnNicsICcgJykgLyogMTYgIEdyZXlzY2FsZSAgICAgKi8KLQotLyogR3JleSBiaXQtcGFja2VkIGZvcm1hdHMgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVkxMEJQQUNLIj5WNEwyX1BJWF9GTVRfWTEwQlBBQ0s8L2xpbms+ICAgIHY0bDJfZm91cmNjKCdZJywgJzEnLCAnMCcsICdCJykgLyogMTAgIEdyZXlzY2FsZSBiaXQtcGFja2VkICovCi0KLS8qIFBhbGV0dGUgZm9ybWF0cyAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtUEFMOCI+VjRMMl9QSVhfRk1UX1BBTDg8L2xpbms+ICAgIHY0bDJfZm91cmNjKCdQJywgJ0EnLCAnTCcsICc4JykgLyogIDggIDgtYml0IHBhbGV0dGUgKi8KLQotLyogTHVtaW5hbmNlK0Nocm9taW5hbmNlIGZvcm1hdHMgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVlWVTQxMCI+VjRMMl9QSVhfRk1UX1lWVTQxMDwvbGluaz4gIHY0bDJfZm91cmNjKCdZJywgJ1YnLCAnVScsICc5JykgLyogIDkgIFlWVSA0OjE6MCAgICAgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVlWVTQyMCI+VjRMMl9QSVhfRk1UX1lWVTQyMDwvbGluaz4gIHY0bDJfZm91cmNjKCdZJywgJ1YnLCAnMScsICcyJykgLyogMTIgIFlWVSA0OjI6MCAgICAgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVlVWVYiPlY0TDJfUElYX0ZNVF9ZVVlWPC9saW5rPiAgICB2NGwyX2ZvdXJjYygnWScsICdVJywgJ1knLCAnVicpIC8qIDE2ICBZVVYgNDoyOjIgICAgICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1ZWVVWIj5WNEwyX1BJWF9GTVRfWVlVVjwvbGluaz4gICAgdjRsMl9mb3VyY2MoJ1knLCAnWScsICdVJywgJ1YnKSAvKiAxNiAgWVVWIDQ6MjoyICAgICAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtWVZZVSI+VjRMMl9QSVhfRk1UX1lWWVU8L2xpbms+ICAgIHY0bDJfZm91cmNjKCdZJywgJ1YnLCAnWScsICdVJykgLyogMTYgWVZVIDQ6MjoyICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1VWVZZIj5WNEwyX1BJWF9GTVRfVVlWWTwvbGluaz4gICAgdjRsMl9mb3VyY2MoJ1UnLCAnWScsICdWJywgJ1knKSAvKiAxNiAgWVVWIDQ6MjoyICAgICAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtVllVWSI+VjRMMl9QSVhfRk1UX1ZZVVk8L2xpbms+ICAgIHY0bDJfZm91cmNjKCdWJywgJ1knLCAnVScsICdZJykgLyogMTYgIFlVViA0OjI6MiAgICAgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVlVVjQyMlAiPlY0TDJfUElYX0ZNVF9ZVVY0MjJQPC9saW5rPiB2NGwyX2ZvdXJjYygnNCcsICcyJywgJzInLCAnUCcpIC8qIDE2ICBZVlU0MjIgcGxhbmFyICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1ZVVY0MTFQIj5WNEwyX1BJWF9GTVRfWVVWNDExUDwvbGluaz4gdjRsMl9mb3VyY2MoJzQnLCAnMScsICcxJywgJ1AnKSAvKiAxNiAgWVZVNDExIHBsYW5hciAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtWTQxUCI+VjRMMl9QSVhfRk1UX1k0MVA8L2xpbms+ICAgIHY0bDJfZm91cmNjKCdZJywgJzQnLCAnMScsICdQJykgLyogMTIgIFlVViA0OjE6MSAgICAgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVlVVjQ0NCI+VjRMMl9QSVhfRk1UX1lVVjQ0NDwvbGluaz4gIHY0bDJfZm91cmNjKCdZJywgJzQnLCAnNCcsICc0JykgLyogMTYgIHh4eHh5eXl5IHV1dXV2dnZ2ICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1ZVVY1NTUiPlY0TDJfUElYX0ZNVF9ZVVY1NTU8L2xpbms+ICB2NGwyX2ZvdXJjYygnWScsICdVJywgJ1YnLCAnTycpIC8qIDE2ICBZVVYtNS01LTUgICAgICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1ZVVY1NjUiPlY0TDJfUElYX0ZNVF9ZVVY1NjU8L2xpbms+ICB2NGwyX2ZvdXJjYygnWScsICdVJywgJ1YnLCAnUCcpIC8qIDE2ICBZVVYtNS02LTUgICAgICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1ZVVYzMiI+VjRMMl9QSVhfRk1UX1lVVjMyPC9saW5rPiAgIHY0bDJfZm91cmNjKCdZJywgJ1UnLCAnVicsICc0JykgLyogMzIgIFlVVi04LTgtOC04ICAgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVlVVjQxMCI+VjRMMl9QSVhfRk1UX1lVVjQxMDwvbGluaz4gIHY0bDJfZm91cmNjKCdZJywgJ1UnLCAnVicsICc5JykgLyogIDkgIFlVViA0OjE6MCAgICAgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVlVVjQyMCI+VjRMMl9QSVhfRk1UX1lVVjQyMDwvbGluaz4gIHY0bDJfZm91cmNjKCdZJywgJ1UnLCAnMScsICcyJykgLyogMTIgIFlVViA0OjI6MCAgICAgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULUhJMjQwIj5WNEwyX1BJWF9GTVRfSEkyNDA8L2xpbms+ICAgdjRsMl9mb3VyY2MoJ0gnLCAnSScsICcyJywgJzQnKSAvKiAgOCAgOC1iaXQgY29sb3IgICAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtSE0xMiI+VjRMMl9QSVhfRk1UX0hNMTI8L2xpbms+ICAgIHY0bDJfZm91cmNjKCdIJywgJ00nLCAnMScsICcyJykgLyogIDggIFlVViA0OjI6MCAxNngxNiBtYWNyb2Jsb2NrcyAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtTTQyMCI+VjRMMl9QSVhfRk1UX000MjA8L2xpbms+ICAgIHY0bDJfZm91cmNjKCdNJywgJzQnLCAnMicsICcwJykgLyogMTIgIFlVViA0OjI6MCAyIGxpbmVzIHksIDEgbGluZSB1diBpbnRlcmxlYXZlZCAqLwotCi0vKiB0d28gcGxhbmVzIC0tIG9uZSBZLCBvbmUgQ3IgKyBDYiBpbnRlcmxlYXZlZCAgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULU5WMTIiPlY0TDJfUElYX0ZNVF9OVjEyPC9saW5rPiAgICB2NGwyX2ZvdXJjYygnTicsICdWJywgJzEnLCAnMicpIC8qIDEyICBZL0NiQ3IgNDoyOjAgICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1OVjIxIj5WNEwyX1BJWF9GTVRfTlYyMTwvbGluaz4gICAgdjRsMl9mb3VyY2MoJ04nLCAnVicsICcyJywgJzEnKSAvKiAxMiAgWS9DckNiIDQ6MjowICAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtTlYxNiI+VjRMMl9QSVhfRk1UX05WMTY8L2xpbms+ICAgIHY0bDJfZm91cmNjKCdOJywgJ1YnLCAnMScsICc2JykgLyogMTYgIFkvQ2JDciA0OjI6MiAgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULU5WNjEiPlY0TDJfUElYX0ZNVF9OVjYxPC9saW5rPiAgICB2NGwyX2ZvdXJjYygnTicsICdWJywgJzYnLCAnMScpIC8qIDE2ICBZL0NyQ2IgNDoyOjIgICovCi0KLS8qIHR3byBub24gY29udGlndW91cyBwbGFuZXMgLSBvbmUgWSwgb25lIENyICsgQ2IgaW50ZXJsZWF2ZWQgICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1OVjEyTSI+VjRMMl9QSVhfRk1UX05WMTJNPC9saW5rPiAgIHY0bDJfZm91cmNjKCdOJywgJ00nLCAnMScsICcyJykgLyogMTIgIFkvQ2JDciA0OjI6MCAgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULU5WMTJNVCI+VjRMMl9QSVhfRk1UX05WMTJNVDwvbGluaz4gIHY0bDJfZm91cmNjKCdUJywgJ00nLCAnMScsICcyJykgLyogMTIgIFkvQ2JDciA0OjI6MCA2NHgzMiBtYWNyb2Jsb2NrcyAqLwotCi0vKiB0aHJlZSBub24gY29udGlndW91cyBwbGFuZXMgLSBZLCBDYiwgQ3IgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVlVVjQyME0iPlY0TDJfUElYX0ZNVF9ZVVY0MjBNPC9saW5rPiB2NGwyX2ZvdXJjYygnWScsICdNJywgJzEnLCAnMicpIC8qIDEyICBZVVY0MjAgcGxhbmFyICovCi0KLS8qIEJheWVyIGZvcm1hdHMgLSBzZWUgaHR0cDovL3d3dy5zaWxpY29uaW1hZ2luZy5jb20vUkdCJTIwQmF5ZXIuaHRtICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1TQkdHUjgiPlY0TDJfUElYX0ZNVF9TQkdHUjg8L2xpbms+ICB2NGwyX2ZvdXJjYygnQicsICdBJywgJzgnLCAnMScpIC8qICA4ICBCR0JHLi4gR1JHUi4uICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1TR0JSRzgiPlY0TDJfUElYX0ZNVF9TR0JSRzg8L2xpbms+ICB2NGwyX2ZvdXJjYygnRycsICdCJywgJ1InLCAnRycpIC8qICA4ICBHQkdCLi4gUkdSRy4uICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1TR1JCRzgiPlY0TDJfUElYX0ZNVF9TR1JCRzg8L2xpbms+ICB2NGwyX2ZvdXJjYygnRycsICdSJywgJ0InLCAnRycpIC8qICA4ICBHUkdSLi4gQkdCRy4uICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1TUkdHQjgiPlY0TDJfUElYX0ZNVF9TUkdHQjg8L2xpbms+ICB2NGwyX2ZvdXJjYygnUicsICdHJywgJ0cnLCAnQicpIC8qICA4ICBSR1JHLi4gR0JHQi4uICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1TQkdHUjEwIj5WNEwyX1BJWF9GTVRfU0JHR1IxMDwvbGluaz4gdjRsMl9mb3VyY2MoJ0InLCAnRycsICcxJywgJzAnKSAvKiAxMCAgQkdCRy4uIEdSR1IuLiAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtU0dCUkcxMCI+VjRMMl9QSVhfRk1UX1NHQlJHMTA8L2xpbms+IHY0bDJfZm91cmNjKCdHJywgJ0InLCAnMScsICcwJykgLyogMTAgIEdCR0IuLiBSR1JHLi4gKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVNHUkJHMTAiPlY0TDJfUElYX0ZNVF9TR1JCRzEwPC9saW5rPiB2NGwyX2ZvdXJjYygnQicsICdBJywgJzEnLCAnMCcpIC8qIDEwICBHUkdSLi4gQkdCRy4uICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1TUkdHQjEwIj5WNEwyX1BJWF9GTVRfU1JHR0IxMDwvbGluaz4gdjRsMl9mb3VyY2MoJ1InLCAnRycsICcxJywgJzAnKSAvKiAxMCAgUkdSRy4uIEdCR0IuLiAqLwotICAgICAgICAvKiAxMGJpdCByYXcgYmF5ZXIgRFBDTSBjb21wcmVzc2VkIHRvIDggYml0cyAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtU0dSQkcxMERQQ004Ij5WNEwyX1BJWF9GTVRfU0dSQkcxMERQQ004PC9saW5rPiB2NGwyX2ZvdXJjYygnQicsICdEJywgJzEnLCAnMCcpCi0gICAgICAgIC8qCi0gICAgICAgICAqIDEwYml0IHJhdyBiYXllciwgZXhwYW5kZWQgdG8gMTYgYml0cwotICAgICAgICAgKiB4eHh4cnJycnJycnJycnh4eHhnZ2dnZ2dnZ2dnIHh4eHhnZ2dnZ2dnZ2dneHh4eGJiYmJiYmJiYmIuLi4KLSAgICAgICAgICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1TQkdHUjE2Ij5WNEwyX1BJWF9GTVRfU0JHR1IxNjwvbGluaz4gdjRsMl9mb3VyY2MoJ0InLCAnWScsICdSJywgJzInKSAvKiAxNiAgQkdCRy4uIEdSR1IuLiAqLwotCi0vKiBjb21wcmVzc2VkIGZvcm1hdHMgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULU1KUEVHIj5WNEwyX1BJWF9GTVRfTUpQRUc8L2xpbms+ICAgIHY0bDJfZm91cmNjKCdNJywgJ0onLCAnUCcsICdHJykgLyogTW90aW9uLUpQRUcgICAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtSlBFRyI+VjRMMl9QSVhfRk1UX0pQRUc8L2xpbms+ICAgICB2NGwyX2ZvdXJjYygnSicsICdQJywgJ0UnLCAnRycpIC8qIEpGSUYgSlBFRyAgICAgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULURWIj5WNEwyX1BJWF9GTVRfRFY8L2xpbms+ICAgICAgIHY0bDJfZm91cmNjKCdkJywgJ3YnLCAncycsICdkJykgLyogMTM5NCAgICAgICAgICAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtTVBFRyI+VjRMMl9QSVhfRk1UX01QRUc8L2xpbms+ICAgICB2NGwyX2ZvdXJjYygnTScsICdQJywgJ0UnLCAnRycpIC8qIE1QRUctMS8yLzQgICAgKi8KLQotLyogIFZlbmRvci1zcGVjaWZpYyBmb3JtYXRzICAgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULUNQSUExIj5WNEwyX1BJWF9GTVRfQ1BJQTE8L2xpbms+ICAgIHY0bDJfZm91cmNjKCdDJywgJ1AnLCAnSScsICdBJykgLyogY3BpYTEgWVVWICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1XTlZBIj5WNEwyX1BJWF9GTVRfV05WQTwvbGluaz4gICAgIHY0bDJfZm91cmNjKCdXJywgJ04nLCAnVicsICdBJykgLyogV2lubm92IGh3IGNvbXByZXNzICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1TTjlDMTBYIj5WNEwyX1BJWF9GTVRfU045QzEwWDwvbGluaz4gIHY0bDJfZm91cmNjKCdTJywgJzknLCAnMScsICcwJykgLyogU045QzEweCBjb21wcmVzc2lvbiAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtU045QzIwWC1JNDIwIj5WNEwyX1BJWF9GTVRfU045QzIwWF9JNDIwPC9saW5rPiB2NGwyX2ZvdXJjYygnUycsICc5JywgJzInLCAnMCcpIC8qIFNOOUMyMHggWVVWIDQ6MjowICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1QV0MxIj5WNEwyX1BJWF9GTVRfUFdDMTwvbGluaz4gICAgIHY0bDJfZm91cmNjKCdQJywgJ1cnLCAnQycsICcxJykgLyogcHdjIG9sZGVyIHdlYmNhbSAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtUFdDMiI+VjRMMl9QSVhfRk1UX1BXQzI8L2xpbms+ICAgICB2NGwyX2ZvdXJjYygnUCcsICdXJywgJ0MnLCAnMicpIC8qIHB3YyBuZXdlciB3ZWJjYW0gKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULUVUNjFYMjUxIj5WNEwyX1BJWF9GTVRfRVQ2MVgyNTE8L2xpbms+IHY0bDJfZm91cmNjKCdFJywgJzYnLCAnMicsICc1JykgLyogRVQ2MVgyNTEgY29tcHJlc3Npb24gKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVNQQ0E1MDEiPlY0TDJfUElYX0ZNVF9TUENBNTAxPC9saW5rPiAgdjRsMl9mb3VyY2MoJ1MnLCAnNScsICcwJywgJzEnKSAvKiBZVVlWIHBlciBsaW5lICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1TUENBNTA1Ij5WNEwyX1BJWF9GTVRfU1BDQTUwNTwvbGluaz4gIHY0bDJfZm91cmNjKCdTJywgJzUnLCAnMCcsICc1JykgLyogWVlVViBwZXIgbGluZSAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtU1BDQTUwOCI+VjRMMl9QSVhfRk1UX1NQQ0E1MDg8L2xpbms+ICB2NGwyX2ZvdXJjYygnUycsICc1JywgJzAnLCAnOCcpIC8qIFlVVlkgcGVyIGxpbmUgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVNQQ0E1NjEiPlY0TDJfUElYX0ZNVF9TUENBNTYxPC9saW5rPiAgdjRsMl9mb3VyY2MoJ1MnLCAnNScsICc2JywgJzEnKSAvKiBjb21wcmVzc2VkIEdCUkcgYmF5ZXIgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVBBQzIwNyI+VjRMMl9QSVhfRk1UX1BBQzIwNzwvbGluaz4gICB2NGwyX2ZvdXJjYygnUCcsICcyJywgJzAnLCAnNycpIC8qIGNvbXByZXNzZWQgQkdHUiBiYXllciAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtTVI5NzMxMEEiPlY0TDJfUElYX0ZNVF9NUjk3MzEwQTwvbGluaz4gdjRsMl9mb3VyY2MoJ00nLCAnMycsICcxJywgJzAnKSAvKiBjb21wcmVzc2VkIEJHR1IgYmF5ZXIgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVNOOUMyMDI4Ij5WNEwyX1BJWF9GTVRfU045QzIwMjg8L2xpbms+IHY0bDJfZm91cmNjKCdTJywgJ08nLCAnTicsICdYJykgLyogY29tcHJlc3NlZCBHQlJHIGJheWVyICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1TUTkwNUMiPlY0TDJfUElYX0ZNVF9TUTkwNUM8L2xpbms+ICAgdjRsMl9mb3VyY2MoJzknLCAnMCcsICc1JywgJ0MnKSAvKiBjb21wcmVzc2VkIFJHR0IgYmF5ZXIgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVBKUEciPlY0TDJfUElYX0ZNVF9QSlBHPC9saW5rPiAgICAgdjRsMl9mb3VyY2MoJ1AnLCAnSicsICdQJywgJ0cnKSAvKiBQaXhhcnQgNzN4eCBKUEVHICovCi0jZGVmaW5lIDxsaW5rIGxpbmtlbmQ9IlY0TDItUElYLUZNVC1PVjUxMSI+VjRMMl9QSVhfRk1UX09WNTExPC9saW5rPiAgICB2NGwyX2ZvdXJjYygnTycsICc1JywgJzEnLCAnMScpIC8qIG92NTExIEpQRUcgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULU9WNTE4Ij5WNEwyX1BJWF9GTVRfT1Y1MTg8L2xpbms+ICAgIHY0bDJfZm91cmNjKCdPJywgJzUnLCAnMScsICc4JykgLyogb3Y1MTggSlBFRyAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtU1RWMDY4MCI+VjRMMl9QSVhfRk1UX1NUVjA2ODA8L2xpbms+ICB2NGwyX2ZvdXJjYygnUycsICc2JywgJzgnLCAnMCcpIC8qIHN0djA2ODAgYmF5ZXIgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULVRNNjAwMCI+VjRMMl9QSVhfRk1UX1RNNjAwMDwvbGluaz4gICB2NGwyX2ZvdXJjYygnVCcsICdNJywgJzYnLCAnMCcpIC8qIHRtNTYwMC90bTYweDAgKi8KLSNkZWZpbmUgPGxpbmsgbGlua2VuZD0iVjRMMi1QSVgtRk1ULUNJVC1ZWVZZVVkiPlY0TDJfUElYX0ZNVF9DSVRfWVlWWVVZPC9saW5rPiB2NGwyX2ZvdXJjYygnQycsICdJJywgJ1QnLCAnVicpIC8qIG9uZSBsaW5lIG9mIFkgdGhlbiAxIGxpbmUgb2YgVllVWSAqLwotI2RlZmluZSA8bGluayBsaW5rZW5kPSJWNEwyLVBJWC1GTVQtS09OSUNBNDIwIj5WNEwyX1BJWF9GTVRfS09OSUNBNDIwPC9saW5rPiAgdjRsMl9mb3VyY2MoJ0snLCAnTycsICdOJywgJ0knKSAvKiBZVVY0MjAgcGxhbmFyIGluIGJsb2NrcyBvZiAyNTYgcGl4ZWxzICovCi0KLS8qCi0gKiAgICAgIEYgTyBSIE0gQSBUICAgRSBOIFUgTSBFIFIgQSBUIEkgTyBOCi0gKi8KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWZtdGRlc2MiPnY0bDJfZm10ZGVzYzwvbGluaz4gewotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgIGluZGV4OyAgICAgICAgICAgICAvKiBGb3JtYXQgbnVtYmVyICAgICAgKi8KLSAgICAgICAgZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLWJ1Zi10eXBlIj52NGwyX2J1Zl90eXBlPC9saW5rPiAgdHlwZTsgICAgICAgICAgICAgIC8qIGJ1ZmZlciB0eXBlICAgICAgICAqLwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgIGZsYWdzOwotICAgICAgICBfX3U4ICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uWzMyXTsgICAvKiBEZXNjcmlwdGlvbiBzdHJpbmcgKi8KLSAgICAgICAgX191MzIgICAgICAgICAgICAgICBwaXhlbGZvcm1hdDsgICAgICAgLyogRm9ybWF0IGZvdXJjYyAgICAgICovCi0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgcmVzZXJ2ZWRbNF07Ci19OwotCi0jZGVmaW5lIFY0TDJfRk1UX0ZMQUdfQ09NUFJFU1NFRCAweDAwMDEKLSNkZWZpbmUgVjRMMl9GTVRfRkxBR19FTVVMQVRFRCAgIDB4MDAwMgotCi0jaWYgMQotICAgICAgICAvKiBFeHBlcmltZW50YWwgRnJhbWUgU2l6ZSBhbmQgZnJhbWUgcmF0ZSBlbnVtZXJhdGlvbiAqLwotLyoKLSAqICAgICAgRiBSIEEgTSBFICAgUyBJIFogRSAgIEUgTiBVIE0gRSBSIEEgVCBJIE8gTgotICovCi1lbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItZnJtc2l6ZXR5cGVzIj52NGwyX2ZybXNpemV0eXBlczwvbGluaz4gewotICAgICAgICBWNEwyX0ZSTVNJWkVfVFlQRV9ESVNDUkVURSAgICAgID0gMSwKLSAgICAgICAgVjRMMl9GUk1TSVpFX1RZUEVfQ09OVElOVU9VUyAgICA9IDIsCi0gICAgICAgIFY0TDJfRlJNU0laRV9UWVBFX1NURVBXSVNFICAgICAgPSAzLAotfTsKLQotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZnJtc2l6ZS1kaXNjcmV0ZSI+djRsMl9mcm1zaXplX2Rpc2NyZXRlPC9saW5rPiB7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIHdpZHRoOyAgICAgICAgICAvKiBGcmFtZSB3aWR0aCBbcGl4ZWxdICovCi0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIGhlaWdodDsgICAgICAgICAvKiBGcmFtZSBoZWlnaHQgW3BpeGVsXSAqLwotfTsKLQotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZnJtc2l6ZS1zdGVwd2lzZSI+djRsMl9mcm1zaXplX3N0ZXB3aXNlPC9saW5rPiB7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIG1pbl93aWR0aDsgICAgICAvKiBNaW5pbXVtIGZyYW1lIHdpZHRoIFtwaXhlbF0gKi8KLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgbWF4X3dpZHRoOyAgICAgIC8qIE1heGltdW0gZnJhbWUgd2lkdGggW3BpeGVsXSAqLwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICBzdGVwX3dpZHRoOyAgICAgLyogRnJhbWUgd2lkdGggc3RlcCBzaXplIFtwaXhlbF0gKi8KLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgbWluX2hlaWdodDsgICAgIC8qIE1pbmltdW0gZnJhbWUgaGVpZ2h0IFtwaXhlbF0gKi8KLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgbWF4X2hlaWdodDsgICAgIC8qIE1heGltdW0gZnJhbWUgaGVpZ2h0IFtwaXhlbF0gKi8KLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgc3RlcF9oZWlnaHQ7ICAgIC8qIEZyYW1lIGhlaWdodCBzdGVwIHNpemUgW3BpeGVsXSAqLwotfTsKLQotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZnJtc2l6ZWVudW0iPnY0bDJfZnJtc2l6ZWVudW08L2xpbms+IHsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgaW5kZXg7ICAgICAgICAgIC8qIEZyYW1lIHNpemUgbnVtYmVyICovCi0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIHBpeGVsX2Zvcm1hdDsgICAvKiBQaXhlbCBmb3JtYXQgKi8KLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgdHlwZTsgICAgICAgICAgIC8qIEZyYW1lIHNpemUgdHlwZSB0aGUgZGV2aWNlIHN1cHBvcnRzLiAqLwotCi0gICAgICAgIHVuaW9uIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmFtZSBzaXplICovCi0gICAgICAgICAgICAgICAgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZnJtc2l6ZS1kaXNjcmV0ZSI+djRsMl9mcm1zaXplX2Rpc2NyZXRlPC9saW5rPiAgICBkaXNjcmV0ZTsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1mcm1zaXplLXN0ZXB3aXNlIj52NGwyX2ZybXNpemVfc3RlcHdpc2U8L2xpbms+ICAgIHN0ZXB3aXNlOwotICAgICAgICB9OwotCi0gICAgICAgIF9fdTMyICAgcmVzZXJ2ZWRbMl07ICAgICAgICAgICAgICAgICAgICAvKiBSZXNlcnZlZCBzcGFjZSBmb3IgZnV0dXJlIHVzZSAqLwotfTsKLQotLyoKLSAqICAgICAgRiBSIEEgTSBFICAgUiBBIFQgRSAgIEUgTiBVIE0gRSBSIEEgVCBJIE8gTgotICovCi1lbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItZnJtaXZhbHR5cGVzIj52NGwyX2ZybWl2YWx0eXBlczwvbGluaz4gewotICAgICAgICBWNEwyX0ZSTUlWQUxfVFlQRV9ESVNDUkVURSAgICAgID0gMSwKLSAgICAgICAgVjRMMl9GUk1JVkFMX1RZUEVfQ09OVElOVU9VUyAgICA9IDIsCi0gICAgICAgIFY0TDJfRlJNSVZBTF9UWVBFX1NURVBXSVNFICAgICAgPSAzLAotfTsKLQotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZnJtaXZhbC1zdGVwd2lzZSI+djRsMl9mcm1pdmFsX3N0ZXB3aXNlPC9saW5rPiB7Ci0gICAgICAgIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWZyYWN0Ij52NGwyX2ZyYWN0PC9saW5rPiAgICAgICBtaW47ICAgICAgICAgICAgLyogTWluaW11bSBmcmFtZSBpbnRlcnZhbCBbc10gKi8KLSAgICAgICAgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZnJhY3QiPnY0bDJfZnJhY3Q8L2xpbms+ICAgICAgIG1heDsgICAgICAgICAgICAvKiBNYXhpbXVtIGZyYW1lIGludGVydmFsIFtzXSAqLwotICAgICAgICBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1mcmFjdCI+djRsMl9mcmFjdDwvbGluaz4gICAgICAgc3RlcDsgICAgICAgICAgIC8qIEZyYW1lIGludGVydmFsIHN0ZXAgc2l6ZSBbc10gKi8KLX07Ci0KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWZybWl2YWxlbnVtIj52NGwyX2ZybWl2YWxlbnVtPC9saW5rPiB7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIGluZGV4OyAgICAgICAgICAvKiBGcmFtZSBmb3JtYXQgaW5kZXggKi8KLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgcGl4ZWxfZm9ybWF0OyAgIC8qIFBpeGVsIGZvcm1hdCAqLwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICB3aWR0aDsgICAgICAgICAgLyogRnJhbWUgd2lkdGggKi8KLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgaGVpZ2h0OyAgICAgICAgIC8qIEZyYW1lIGhlaWdodCAqLwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICB0eXBlOyAgICAgICAgICAgLyogRnJhbWUgaW50ZXJ2YWwgdHlwZSB0aGUgZGV2aWNlIHN1cHBvcnRzLiAqLwotCi0gICAgICAgIHVuaW9uIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcmFtZSBpbnRlcnZhbCAqLwotICAgICAgICAgICAgICAgIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWZyYWN0Ij52NGwyX2ZyYWN0PC9saW5rPiAgICAgICAgICAgICAgIGRpc2NyZXRlOwotICAgICAgICAgICAgICAgIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWZybWl2YWwtc3RlcHdpc2UiPnY0bDJfZnJtaXZhbF9zdGVwd2lzZTwvbGluaz4gICAgc3RlcHdpc2U7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgX191MzIgICByZXNlcnZlZFsyXTsgICAgICAgICAgICAgICAgICAgIC8qIFJlc2VydmVkIHNwYWNlIGZvciBmdXR1cmUgdXNlICovCi19OwotI2VuZGlmCi0KLS8qCi0gKiAgICAgIFQgSSBNIEUgQyBPIEQgRQotICovCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi10aW1lY29kZSI+djRsMl90aW1lY29kZTwvbGluaz4gewotICAgICAgICBfX3UzMiAgIHR5cGU7Ci0gICAgICAgIF9fdTMyICAgZmxhZ3M7Ci0gICAgICAgIF9fdTggICAgZnJhbWVzOwotICAgICAgICBfX3U4ICAgIHNlY29uZHM7Ci0gICAgICAgIF9fdTggICAgbWludXRlczsKLSAgICAgICAgX191OCAgICBob3VyczsKLSAgICAgICAgX191OCAgICB1c2VyYml0c1s0XTsKLX07Ci0KLS8qICBUeXBlICAqLwotI2RlZmluZSBWNEwyX1RDX1RZUEVfMjRGUFMgICAgICAgICAgICAgIDEKLSNkZWZpbmUgVjRMMl9UQ19UWVBFXzI1RlBTICAgICAgICAgICAgICAyCi0jZGVmaW5lIFY0TDJfVENfVFlQRV8zMEZQUyAgICAgICAgICAgICAgMwotI2RlZmluZSBWNEwyX1RDX1RZUEVfNTBGUFMgICAgICAgICAgICAgIDQKLSNkZWZpbmUgVjRMMl9UQ19UWVBFXzYwRlBTICAgICAgICAgICAgICA1Ci0KLS8qICBGbGFncyAgKi8KLSNkZWZpbmUgVjRMMl9UQ19GTEFHX0RST1BGUkFNRSAgICAgICAgICAweDAwMDEgLyogImRyb3AtZnJhbWUiIG1vZGUgKi8KLSNkZWZpbmUgVjRMMl9UQ19GTEFHX0NPTE9SRlJBTUUgICAgICAgICAweDAwMDIKLSNkZWZpbmUgVjRMMl9UQ19VU0VSQklUU19maWVsZCAgICAgICAgICAweDAwMEMKLSNkZWZpbmUgVjRMMl9UQ19VU0VSQklUU19VU0VSREVGSU5FRCAgICAweDAwMDAKLSNkZWZpbmUgVjRMMl9UQ19VU0VSQklUU184QklUQ0hBUlMgICAgICAweDAwMDgKLS8qIFRoZSBhYm92ZSBpcyBiYXNlZCBvbiBTTVBURSB0aW1lY29kZXMgKi8KLQotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItanBlZ2NvbXByZXNzaW9uIj52NGwyX2pwZWdjb21wcmVzc2lvbjwvbGluaz4gewotICAgICAgICBpbnQgcXVhbGl0eTsKLQotICAgICAgICBpbnQgIEFQUG47ICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgQVBQIHNlZ21lbnQgdG8gYmUgd3JpdHRlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbXVzdCBiZSAwLi4xNSAqLwotICAgICAgICBpbnQgIEFQUF9sZW47ICAgICAgICAgICAvKiBMZW5ndGggb2YgZGF0YSBpbiBKUEVHIEFQUG4gc2VnbWVudCAqLwotICAgICAgICBjaGFyIEFQUF9kYXRhWzYwXTsgICAgICAvKiBEYXRhIGluIHRoZSBKUEVHIEFQUG4gc2VnbWVudC4gKi8KLQotICAgICAgICBpbnQgIENPTV9sZW47ICAgICAgICAgICAvKiBMZW5ndGggb2YgZGF0YSBpbiBKUEVHIENPTSBzZWdtZW50ICovCi0gICAgICAgIGNoYXIgQ09NX2RhdGFbNjBdOyAgICAgIC8qIERhdGEgaW4gSlBFRyBDT00gc2VnbWVudCAqLwotCi0gICAgICAgIF9fdTMyIGpwZWdfbWFya2VyczsgICAgIC8qIFdoaWNoIG1hcmtlcnMgc2hvdWxkIGdvIGludG8gdGhlIEpQRUcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb3V0cHV0LiBVbmxlc3MgeW91IGV4YWN0bHkga25vdyB3aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHlvdSBkbywgbGVhdmUgdGhlbSB1bnRvdWNoZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIElubHVkaW5nIGxlc3MgbWFya2VycyB3aWxsIG1ha2UgdGhlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHJlc3VsdGluZyBjb2RlIHNtYWxsZXIsIGJ1dCB0aGVyZSB3aWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJlIGZld2VyIGFwcGxpY2F0aW9ucyB3aGljaCBjYW4gcmVhZCBpdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVGhlIHByZXNlbmNlIG9mIHRoZSBBUFAgYW5kIENPTSBtYXJrZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaXMgaW5mbHVlbmNlZCBieSBBUFBfbGVuIGFuZCBDT01fbGVuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIE9OTFksIG5vdCBieSB0aGlzIHByb3BlcnR5ISAqLwotCi0jZGVmaW5lIFY0TDJfSlBFR19NQVJLRVJfREhUICgxJmx0OyZsdDszKSAgICAvKiBEZWZpbmUgSHVmZm1hbiBUYWJsZXMgKi8KLSNkZWZpbmUgVjRMMl9KUEVHX01BUktFUl9EUVQgKDEmbHQ7Jmx0OzQpICAgIC8qIERlZmluZSBRdWFudGl6YXRpb24gVGFibGVzICovCi0jZGVmaW5lIFY0TDJfSlBFR19NQVJLRVJfRFJJICgxJmx0OyZsdDs1KSAgICAvKiBEZWZpbmUgUmVzdGFydCBJbnRlcnZhbCAqLwotI2RlZmluZSBWNEwyX0pQRUdfTUFSS0VSX0NPTSAoMSZsdDsmbHQ7NikgICAgLyogQ29tbWVudCBzZWdtZW50ICovCi0jZGVmaW5lIFY0TDJfSlBFR19NQVJLRVJfQVBQICgxJmx0OyZsdDs3KSAgICAvKiBBcHAgc2VnbWVudCwgZHJpdmVyIHdpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFsbHdheXMgdXNlIEFQUDAgKi8KLX07Ci0KLS8qCi0gKiAgICAgIE0gRSBNIE8gUiBZIC0gTSBBIFAgUCBJIE4gRyAgIEIgVSBGIEYgRSBSIFMKLSAqLwotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItcmVxdWVzdGJ1ZmZlcnMiPnY0bDJfcmVxdWVzdGJ1ZmZlcnM8L2xpbms+IHsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgY291bnQ7Ci0gICAgICAgIGVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1idWYtdHlwZSI+djRsMl9idWZfdHlwZTwvbGluaz4gICAgICB0eXBlOwotICAgICAgICBlbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItbWVtb3J5Ij52NGwyX21lbW9yeTwvbGluaz4gICAgICAgIG1lbW9yeTsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWRbMl07Ci19OwotCi0vKioKLSAqIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXBsYW5lIj52NGwyX3BsYW5lPC9saW5rPiAtIHBsYW5lIGluZm8gZm9yIG11bHRpLXBsYW5hciBidWZmZXJzCi0gKiBAYnl0ZXN1c2VkOiAgICAgICAgICBudW1iZXIgb2YgYnl0ZXMgb2NjdXBpZWQgYnkgZGF0YSBpbiB0aGUgcGxhbmUgKHBheWxvYWQpCi0gKiBAbGVuZ3RoOiAgICAgICAgICAgICBzaXplIG9mIHRoaXMgcGxhbmUgKE5PVCB0aGUgcGF5bG9hZCkgaW4gYnl0ZXMKLSAqIEBtZW1fb2Zmc2V0OiAgICAgICAgIHdoZW4gbWVtb3J5IGluIHRoZSBhc3NvY2lhdGVkIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWJ1ZmZlciI+djRsMl9idWZmZXI8L2xpbms+IGlzCi0gKiAgICAgICAgICAgICAgICAgICAgICBWNEwyX01FTU9SWV9NTUFQLCBlcXVhbHMgdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZgotICogICAgICAgICAgICAgICAgICAgICAgdGhlIGRldmljZSBtZW1vcnkgZm9yIHRoaXMgcGxhbmUgKG9yIGlzIGEgImNvb2tpZSIgdGhhdAotICogICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIHBhc3NlZCB0byBtbWFwKCkgY2FsbGVkIG9uIHRoZSB2aWRlbyBub2RlKQotICogQHVzZXJwdHI6ICAgICAgICAgICAgd2hlbiBtZW1vcnkgaXMgVjRMMl9NRU1PUllfVVNFUlBUUiwgYSB1c2Vyc3BhY2UgcG9pbnRlcgotICogICAgICAgICAgICAgICAgICAgICAgcG9pbnRpbmcgdG8gdGhpcyBwbGFuZQotICogQGRhdGFfb2Zmc2V0OiAgICAgICAgb2Zmc2V0IGluIHRoZSBwbGFuZSB0byB0aGUgc3RhcnQgb2YgZGF0YTsgdXN1YWxseSAwLAotICogICAgICAgICAgICAgICAgICAgICAgdW5sZXNzIHRoZXJlIGlzIGEgaGVhZGVyIGluIGZyb250IG9mIHRoZSBkYXRhCi0gKgotICogTXVsdGktcGxhbmFyIGJ1ZmZlcnMgY29uc2lzdCBvZiBvbmUgb3IgbW9yZSBwbGFuZXMsIGUuZy4gYW4gWUNiQ3IgYnVmZmVyCi0gKiB3aXRoIHR3byBwbGFuZXMgY2FuIGhhdmUgb25lIHBsYW5lIGZvciBZLCBhbmQgYW5vdGhlciBmb3IgaW50ZXJsZWF2ZWQgQ2JDcgotICogY29tcG9uZW50cy4gRWFjaCBwbGFuZSBjYW4gcmVzaWRlIGluIGEgc2VwYXJhdGUgbWVtb3J5IGJ1ZmZlciwgb3IgZXZlbiBpbgotICogYSBjb21wbGV0ZWx5IHNlcGFyYXRlIG1lbW9yeSBub2RlIChlLmcuIGluIGVtYmVkZGVkIGRldmljZXMpLgotICovCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1wbGFuZSI+djRsMl9wbGFuZTwvbGluaz4gewotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICBieXRlc3VzZWQ7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLSAgICAgICAgdW5pb24gewotICAgICAgICAgICAgICAgIF9fdTMyICAgICAgICAgICBtZW1fb2Zmc2V0OwotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICB1c2VycHRyOwotICAgICAgICB9IG07Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0OwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICByZXNlcnZlZFsxMV07Ci19OwotCi0vKioKLSAqIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWJ1ZmZlciI+djRsMl9idWZmZXI8L2xpbms+IC0gdmlkZW8gYnVmZmVyIGluZm8KLSAqIEBpbmRleDogICAgICBpZCBudW1iZXIgb2YgdGhlIGJ1ZmZlcgotICogQHR5cGU6ICAgICAgIGJ1ZmZlciB0eXBlICh0eXBlID09ICpfTVBMQU5FIGZvciBtdWx0aXBsYW5hciBidWZmZXJzKQotICogQGJ5dGVzdXNlZDogIG51bWJlciBvZiBieXRlcyBvY2N1cGllZCBieSBkYXRhIGluIHRoZSBidWZmZXIgKHBheWxvYWQpOwotICogICAgICAgICAgICAgIHVudXNlZCAoc2V0IHRvIDApIGZvciBtdWx0aXBsYW5hciBidWZmZXJzCi0gKiBAZmxhZ3M6ICAgICAgYnVmZmVyIGluZm9ybWF0aW9uYWwgZmxhZ3MKLSAqIEBmaWVsZDogICAgICBmaWVsZCBvcmRlciBvZiB0aGUgaW1hZ2UgaW4gdGhlIGJ1ZmZlcgotICogQHRpbWVzdGFtcDogIGZyYW1lIHRpbWVzdGFtcAotICogQHRpbWVjb2RlOiAgIGZyYW1lIHRpbWVjb2RlCi0gKiBAc2VxdWVuY2U6ICAgc2VxdWVuY2UgY291bnQgb2YgdGhpcyBmcmFtZQotICogQG1lbW9yeTogICAgIHRoZSBtZXRob2QsIGluIHdoaWNoIHRoZSBhY3R1YWwgdmlkZW8gZGF0YSBpcyBwYXNzZWQKLSAqIEBvZmZzZXQ6ICAgICBmb3Igbm9uLW11bHRpcGxhbmFyIGJ1ZmZlcnMgd2l0aCBtZW1vcnkgPT0gVjRMMl9NRU1PUllfTU1BUDsKLSAqICAgICAgICAgICAgICBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGRldmljZSBtZW1vcnkgZm9yIHRoaXMgcGxhbmUsCi0gKiAgICAgICAgICAgICAgKG9yIGEgImNvb2tpZSIgdGhhdCBzaG91bGQgYmUgcGFzc2VkIHRvIG1tYXAoKSBhcyBvZmZzZXQpCi0gKiBAdXNlcnB0cjogICAgZm9yIG5vbi1tdWx0aXBsYW5hciBidWZmZXJzIHdpdGggbWVtb3J5ID09IFY0TDJfTUVNT1JZX1VTRVJQVFI7Ci0gKiAgICAgICAgICAgICAgYSB1c2Vyc3BhY2UgcG9pbnRlciBwb2ludGluZyB0byB0aGlzIGJ1ZmZlcgotICogQHBsYW5lczogICAgIGZvciBtdWx0aXBsYW5hciBidWZmZXJzOyB1c2Vyc3BhY2UgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgcGxhbmUKLSAqICAgICAgICAgICAgICBpbmZvIHN0cnVjdHMgZm9yIHRoaXMgYnVmZmVyCi0gKiBAbGVuZ3RoOiAgICAgc2l6ZSBpbiBieXRlcyBvZiB0aGUgYnVmZmVyIChOT1QgaXRzIHBheWxvYWQpIGZvciBzaW5nbGUtcGxhbmUKLSAqICAgICAgICAgICAgICBidWZmZXJzICh3aGVuIHR5cGUgIT0gKl9NUExBTkUpOyBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlCi0gKiAgICAgICAgICAgICAgcGxhbmVzIGFycmF5IGZvciBtdWx0aS1wbGFuZSBidWZmZXJzCi0gKiBAaW5wdXQ6ICAgICAgaW5wdXQgbnVtYmVyIGZyb20gd2hpY2ggdGhlIHZpZGVvIGRhdGEgaGFzIGhhcyBiZWVuIGNhcHR1cmVkCi0gKgotICogQ29udGFpbnMgZGF0YSBleGNoYW5nZWQgYnkgYXBwbGljYXRpb24gYW5kIGRyaXZlciB1c2luZyBvbmUgb2YgdGhlIFN0cmVhbWluZwotICogSS9PIG1ldGhvZHMuCi0gKi8KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWJ1ZmZlciI+djRsMl9idWZmZXI8L2xpbms+IHsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgaW5kZXg7Ci0gICAgICAgIGVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1idWYtdHlwZSI+djRsMl9idWZfdHlwZTwvbGluaz4gICAgICB0eXBlOwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICBieXRlc3VzZWQ7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIGZsYWdzOwotICAgICAgICBlbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItZmllbGQiPnY0bDJfZmllbGQ8L2xpbms+ICAgICAgICAgZmllbGQ7Ci0gICAgICAgIHN0cnVjdCB0aW1ldmFsICAgICAgICAgIHRpbWVzdGFtcDsKLSAgICAgICAgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItdGltZWNvZGUiPnY0bDJfdGltZWNvZGU8L2xpbms+ICAgIHRpbWVjb2RlOwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICBzZXF1ZW5jZTsKLQotICAgICAgICAvKiBtZW1vcnkgbG9jYXRpb24gKi8KLSAgICAgICAgZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLW1lbW9yeSI+djRsMl9tZW1vcnk8L2xpbms+ICAgICAgICBtZW1vcnk7Ci0gICAgICAgIHVuaW9uIHsKLSAgICAgICAgICAgICAgICBfX3UzMiAgICAgICAgICAgb2Zmc2V0OwotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICB1c2VycHRyOwotICAgICAgICAgICAgICAgIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXBsYW5lIj52NGwyX3BsYW5lPC9saW5rPiAqcGxhbmVzOwotICAgICAgICB9IG07Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIGxlbmd0aDsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgaW5wdXQ7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIHJlc2VydmVkOwotfTsKLQotLyogIEZsYWdzIGZvciAnZmxhZ3MnIGZpZWxkICovCi0jZGVmaW5lIFY0TDJfQlVGX0ZMQUdfTUFQUEVEICAgIDB4MDAwMSAgLyogQnVmZmVyIGlzIG1hcHBlZCAoZmxhZykgKi8KLSNkZWZpbmUgVjRMMl9CVUZfRkxBR19RVUVVRUQgICAgMHgwMDAyICAvKiBCdWZmZXIgaXMgcXVldWVkIGZvciBwcm9jZXNzaW5nICovCi0jZGVmaW5lIFY0TDJfQlVGX0ZMQUdfRE9ORSAgICAgIDB4MDAwNCAgLyogQnVmZmVyIGlzIHJlYWR5ICovCi0jZGVmaW5lIFY0TDJfQlVGX0ZMQUdfS0VZRlJBTUUgIDB4MDAwOCAgLyogSW1hZ2UgaXMgYSBrZXlmcmFtZSAoSS1mcmFtZSkgKi8KLSNkZWZpbmUgVjRMMl9CVUZfRkxBR19QRlJBTUUgICAgMHgwMDEwICAvKiBJbWFnZSBpcyBhIFAtZnJhbWUgKi8KLSNkZWZpbmUgVjRMMl9CVUZfRkxBR19CRlJBTUUgICAgMHgwMDIwICAvKiBJbWFnZSBpcyBhIEItZnJhbWUgKi8KLS8qIEJ1ZmZlciBpcyByZWFkeSwgYnV0IHRoZSBkYXRhIGNvbnRhaW5lZCB3aXRoaW4gaXMgY29ycnVwdGVkLiAqLwotI2RlZmluZSBWNEwyX0JVRl9GTEFHX0VSUk9SICAgICAweDAwNDAKLSNkZWZpbmUgVjRMMl9CVUZfRkxBR19USU1FQ09ERSAgMHgwMTAwICAvKiB0aW1lY29kZSBmaWVsZCBpcyB2YWxpZCAqLwotI2RlZmluZSBWNEwyX0JVRl9GTEFHX0lOUFVUICAgICAweDAyMDAgIC8qIGlucHV0IGZpZWxkIGlzIHZhbGlkICovCi0KLS8qCi0gKiAgICAgIE8gViBFIFIgTCBBIFkgICBQIFIgRSBWIEkgRSBXCi0gKi8KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWZyYW1lYnVmZmVyIj52NGwyX2ZyYW1lYnVmZmVyPC9saW5rPiB7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdHk7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIGZsYWdzOwotLyogRklYTUU6IGluIHRoZW9yeSB3ZSBzaG91bGQgcGFzcyBzb21ldGhpbmcgbGlrZSBQQ0kgZGV2aWNlICsgbWVtb3J5Ci0gKiByZWdpb24gKyBvZmZzZXQgaW5zdGVhZCBvZiBzb21lIHBoeXNpY2FsIGFkZHJlc3MgKi8KLSAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKmJhc2U7Ci0gICAgICAgIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXBpeC1mb3JtYXQiPnY0bDJfcGl4X2Zvcm1hdDwvbGluaz4gIGZtdDsKLX07Ci0vKiAgRmxhZ3MgZm9yIHRoZSAnY2FwYWJpbGl0eScgZmllbGQuIFJlYWQgb25seSAqLwotI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX0VYVEVSTk9WRVJMQVkgICAgIDB4MDAwMQotI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX0NIUk9NQUtFWSAgICAgICAgIDB4MDAwMgotI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX0xJU1RfQ0xJUFBJTkcgICAgIDB4MDAwNAotI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX0JJVE1BUF9DTElQUElORyAgIDB4MDAwOAotI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX0xPQ0FMX0FMUEhBICAgICAgIDB4MDAxMAotI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX0dMT0JBTF9BTFBIQSAgICAgIDB4MDAyMAotI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX0xPQ0FMX0lOVl9BTFBIQSAgIDB4MDA0MAotI2RlZmluZSBWNEwyX0ZCVUZfQ0FQX1NSQ19DSFJPTUFLRVkgICAgIDB4MDA4MAotLyogIEZsYWdzIGZvciB0aGUgJ2ZsYWdzJyBmaWVsZC4gKi8KLSNkZWZpbmUgVjRMMl9GQlVGX0ZMQUdfUFJJTUFSWSAgICAgICAgICAweDAwMDEKLSNkZWZpbmUgVjRMMl9GQlVGX0ZMQUdfT1ZFUkxBWSAgICAgICAgICAweDAwMDIKLSNkZWZpbmUgVjRMMl9GQlVGX0ZMQUdfQ0hST01BS0VZICAgICAgICAweDAwMDQKLSNkZWZpbmUgVjRMMl9GQlVGX0ZMQUdfTE9DQUxfQUxQSEEgICAgICAweDAwMDgKLSNkZWZpbmUgVjRMMl9GQlVGX0ZMQUdfR0xPQkFMX0FMUEhBICAgICAweDAwMTAKLSNkZWZpbmUgVjRMMl9GQlVGX0ZMQUdfTE9DQUxfSU5WX0FMUEhBICAweDAwMjAKLSNkZWZpbmUgVjRMMl9GQlVGX0ZMQUdfU1JDX0NIUk9NQUtFWSAgICAweDAwNDAKLQotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItY2xpcCI+djRsMl9jbGlwPC9saW5rPiB7Ci0gICAgICAgIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXJlY3QiPnY0bDJfcmVjdDwvbGluaz4gICAgICAgIGM7Ci0gICAgICAgIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWNsaXAiPnY0bDJfY2xpcDwvbGluaz4gICAgICAgIF9fdXNlciAqbmV4dDsKLX07Ci0KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXdpbmRvdyI+djRsMl93aW5kb3c8L2xpbms+IHsKLSAgICAgICAgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItcmVjdCI+djRsMl9yZWN0PC9saW5rPiAgICAgICAgdzsKLSAgICAgICAgZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLWZpZWxkIj52NGwyX2ZpZWxkPC9saW5rPiAgICAgICAgIGZpZWxkOwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICBjaHJvbWFrZXk7Ci0gICAgICAgIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWNsaXAiPnY0bDJfY2xpcDwvbGluaz4gICAgICAgIF9fdXNlciAqY2xpcHM7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIGNsaXBjb3VudDsKLSAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgX191c2VyICpiaXRtYXA7Ci0gICAgICAgIF9fdTggICAgICAgICAgICAgICAgICAgIGdsb2JhbF9hbHBoYTsKLX07Ci0KLS8qCi0gKiAgICAgIEMgQSBQIFQgVSBSIEUgICBQIEEgUiBBIE0gRSBUIEUgUiBTCi0gKi8KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWNhcHR1cmVwYXJtIj52NGwyX2NhcHR1cmVwYXJtPC9saW5rPiB7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICBjYXBhYmlsaXR5OyAgICAvKiAgU3VwcG9ydGVkIG1vZGVzICovCi0gICAgICAgIF9fdTMyICAgICAgICAgICAgICBjYXB0dXJlbW9kZTsgICAvKiAgQ3VycmVudCBtb2RlICovCi0gICAgICAgIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWZyYWN0Ij52NGwyX2ZyYWN0PC9saW5rPiAgdGltZXBlcmZyYW1lOyAgLyogIFRpbWUgcGVyIGZyYW1lIGluIC4xdXMgdW5pdHMgKi8KLSAgICAgICAgX191MzIgICAgICAgICAgICAgIGV4dGVuZGVkbW9kZTsgIC8qICBEcml2ZXItc3BlY2lmaWMgZXh0ZW5zaW9ucyAqLwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgcmVhZGJ1ZmZlcnM7ICAgLyogICMgb2YgYnVmZmVycyBmb3IgcmVhZCAqLwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgcmVzZXJ2ZWRbNF07Ci19OwotCi0vKiAgRmxhZ3MgZm9yICdjYXBhYmlsaXR5JyBhbmQgJ2NhcHR1cmVtb2RlJyBmaWVsZHMgKi8KLSNkZWZpbmUgVjRMMl9NT0RFX0hJR0hRVUFMSVRZICAgMHgwMDAxICAvKiAgSGlnaCBxdWFsaXR5IGltYWdpbmcgbW9kZSAqLwotI2RlZmluZSBWNEwyX0NBUF9USU1FUEVSRlJBTUUgICAweDEwMDAgIC8qICB0aW1lcGVyZnJhbWUgZmllbGQgaXMgc3VwcG9ydGVkICovCi0KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLW91dHB1dHBhcm0iPnY0bDJfb3V0cHV0cGFybTwvbGluaz4gewotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgY2FwYWJpbGl0eTsgICAvKiAgU3VwcG9ydGVkIG1vZGVzICovCi0gICAgICAgIF9fdTMyICAgICAgICAgICAgICBvdXRwdXRtb2RlOyAgIC8qICBDdXJyZW50IG1vZGUgKi8KLSAgICAgICAgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZnJhY3QiPnY0bDJfZnJhY3Q8L2xpbms+ICB0aW1lcGVyZnJhbWU7IC8qICBUaW1lIHBlciBmcmFtZSBpbiBzZWNvbmRzICovCi0gICAgICAgIF9fdTMyICAgICAgICAgICAgICBleHRlbmRlZG1vZGU7IC8qICBEcml2ZXItc3BlY2lmaWMgZXh0ZW5zaW9ucyAqLwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgd3JpdGVidWZmZXJzOyAvKiAgIyBvZiBidWZmZXJzIGZvciB3cml0ZSAqLwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgcmVzZXJ2ZWRbNF07Ci19OwotCi0vKgotICogICAgICBJIE4gUCBVIFQgICBJIE0gQSBHIEUgICBDIFIgTyBQIFAgSSBOIEcKLSAqLwotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItY3JvcGNhcCI+djRsMl9jcm9wY2FwPC9saW5rPiB7Ci0gICAgICAgIGVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1idWYtdHlwZSI+djRsMl9idWZfdHlwZTwvbGluaz4gICAgICB0eXBlOwotICAgICAgICBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1yZWN0Ij52NGwyX3JlY3Q8L2xpbms+ICAgICAgICBib3VuZHM7Ci0gICAgICAgIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXJlY3QiPnY0bDJfcmVjdDwvbGluaz4gICAgICAgIGRlZnJlY3Q7Ci0gICAgICAgIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWZyYWN0Ij52NGwyX2ZyYWN0PC9saW5rPiAgICAgICBwaXhlbGFzcGVjdDsKLX07Ci0KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWNyb3AiPnY0bDJfY3JvcDwvbGluaz4gewotICAgICAgICBlbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItYnVmLXR5cGUiPnY0bDJfYnVmX3R5cGU8L2xpbms+ICAgICAgdHlwZTsKLSAgICAgICAgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItcmVjdCI+djRsMl9yZWN0PC9saW5rPiAgICAgICAgYzsKLX07Ci0KLS8qCi0gKiAgICAgIEEgTiBBIEwgTyBHICAgViBJIEQgRSBPICAgUyBUIEEgTiBEIEEgUiBECi0gKi8KLQotdHlwZWRlZiBfX3U2NCB2NGwyX3N0ZF9pZDsKLQotLyogb25lIGJpdCBmb3IgZWFjaCAqLwotI2RlZmluZSBWNEwyX1NURF9QQUxfQiAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDAwMDEpCi0jZGVmaW5lIFY0TDJfU1REX1BBTF9CMSAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDAwMikKLSNkZWZpbmUgVjRMMl9TVERfUEFMX0cgICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAwMDA0KQotI2RlZmluZSBWNEwyX1NURF9QQUxfSCAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDAwMDgpCi0jZGVmaW5lIFY0TDJfU1REX1BBTF9JICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDAxMCkKLSNkZWZpbmUgVjRMMl9TVERfUEFMX0QgICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAwMDIwKQotI2RlZmluZSBWNEwyX1NURF9QQUxfRDEgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDAwNDApCi0jZGVmaW5lIFY0TDJfU1REX1BBTF9LICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDA4MCkKLQotI2RlZmluZSBWNEwyX1NURF9QQUxfTSAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDAxMDApCi0jZGVmaW5lIFY0TDJfU1REX1BBTF9OICAgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwMDIwMCkKLSNkZWZpbmUgVjRMMl9TVERfUEFMX05jICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAwNDAwKQotI2RlZmluZSBWNEwyX1NURF9QQUxfNjAgICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDA4MDApCi0KLSNkZWZpbmUgVjRMMl9TVERfTlRTQ19NICAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDAxMDAwKQotI2RlZmluZSBWNEwyX1NURF9OVFNDX01fSlAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwMDIwMDApCi0jZGVmaW5lIFY0TDJfU1REX05UU0NfNDQzICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAwNDAwMCkKLSNkZWZpbmUgVjRMMl9TVERfTlRTQ19NX0tSICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDA4MDAwKQotCi0jZGVmaW5lIFY0TDJfU1REX1NFQ0FNX0IgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDAxMDAwMCkKLSNkZWZpbmUgVjRMMl9TVERfU0VDQU1fRCAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMDIwMDAwKQotI2RlZmluZSBWNEwyX1NURF9TRUNBTV9HICAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAwNDAwMDApCi0jZGVmaW5lIFY0TDJfU1REX1NFQ0FNX0ggICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDA4MDAwMCkKLSNkZWZpbmUgVjRMMl9TVERfU0VDQU1fSyAgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwMTAwMDAwKQotI2RlZmluZSBWNEwyX1NURF9TRUNBTV9LMSAgICAgICAoKHY0bDJfc3RkX2lkKTB4MDAyMDAwMDApCi0jZGVmaW5lIFY0TDJfU1REX1NFQ0FNX0wgICAgICAgICgodjRsMl9zdGRfaWQpMHgwMDQwMDAwMCkKLSNkZWZpbmUgVjRMMl9TVERfU0VDQU1fTEMgICAgICAgKCh2NGwyX3N0ZF9pZCkweDAwODAwMDAwKQotCi0vKiBBVFNDL0hEVFYgKi8KLSNkZWZpbmUgVjRMMl9TVERfQVRTQ184X1ZTQiAgICAgKCh2NGwyX3N0ZF9pZCkweDAxMDAwMDAwKQotI2RlZmluZSBWNEwyX1NURF9BVFNDXzE2X1ZTQiAgICAoKHY0bDJfc3RkX2lkKTB4MDIwMDAwMDApCi0KLS8qIEZJWE1FOgotICAgQWx0aG91Z2ggc3RkX2lkIGlzIDY0IGJpdHMsIHRoZXJlIGlzIGFuIGlzc3VlIG9uIFBQQzMyIGFyY2hpdGVjdHVyZSB0aGF0Ci0gICBtYWtlcyBzd2l0Y2goX191NjQpIHRvIGJyZWFrLiBTbywgdGhlcmUncyBhIGhhY2sgb24gdjRsMi1jb21tb24uYyByb3VuZGluZwotICAgdGhpcyB2YWx1ZSB0byAzMiBiaXRzLgotICAgQXMsIGN1cnJlbnRseSwgdGhlIG1heCB2YWx1ZSBpcyBmb3IgVjRMMl9TVERfQVRTQ18xNl9WU0IgKDMwIGJpdHMgd2lkZSksCi0gICBpdCBzaG91bGQgd29yayBmaW5lLiBIb3dldmVyLCBpZiBuZWVkZWQgdG8gYWRkIG1vcmUgdGhhbiB0d28gc3RhbmRhcmRzLAotICAgdjRsMi1jb21tb24uYyBzaG91bGQgYmUgZml4ZWQuCi0gKi8KLQotLyogc29tZSBtZXJnZWQgc3RhbmRhcmRzICovCi0jZGVmaW5lIFY0TDJfU1REX01OICAgICAoVjRMMl9TVERfUEFMX018VjRMMl9TVERfUEFMX058VjRMMl9TVERfUEFMX05jfFY0TDJfU1REX05UU0MpCi0jZGVmaW5lIFY0TDJfU1REX0IgICAgICAoVjRMMl9TVERfUEFMX0J8VjRMMl9TVERfUEFMX0IxfFY0TDJfU1REX1NFQ0FNX0IpCi0jZGVmaW5lIFY0TDJfU1REX0dIICAgICAoVjRMMl9TVERfUEFMX0d8VjRMMl9TVERfUEFMX0h8VjRMMl9TVERfU0VDQU1fR3xWNEwyX1NURF9TRUNBTV9IKQotI2RlZmluZSBWNEwyX1NURF9ESyAgICAgKFY0TDJfU1REX1BBTF9ES3xWNEwyX1NURF9TRUNBTV9ESykKLQotLyogc29tZSBjb21tb24gbmVlZGVkIHN0dWZmICovCi0jZGVmaW5lIFY0TDJfU1REX1BBTF9CRyAgICAgICAgIChWNEwyX1NURF9QQUxfQiAgICAgICAgIHxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWNEwyX1NURF9QQUxfQjEgICAgICAgIHxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWNEwyX1NURF9QQUxfRykKLSNkZWZpbmUgVjRMMl9TVERfUEFMX0RLICAgICAgICAgKFY0TDJfU1REX1BBTF9EICAgICAgICAgfFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFY0TDJfU1REX1BBTF9EMSAgICAgICAgfFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFY0TDJfU1REX1BBTF9LKQotI2RlZmluZSBWNEwyX1NURF9QQUwgICAgICAgICAgICAoVjRMMl9TVERfUEFMX0JHICAgICAgICB8XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjRMMl9TVERfUEFMX0RLICAgICAgICB8XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjRMMl9TVERfUEFMX0ggICAgICAgICB8XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjRMMl9TVERfUEFMX0kpCi0jZGVmaW5lIFY0TDJfU1REX05UU0MgICAgICAgICAgIChWNEwyX1NURF9OVFNDX00gICAgICAgIHxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWNEwyX1NURF9OVFNDX01fSlAgICAgIHxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWNEwyX1NURF9OVFNDX01fS1IpCi0jZGVmaW5lIFY0TDJfU1REX1NFQ0FNX0RLICAgICAgIChWNEwyX1NURF9TRUNBTV9EICAgICAgIHxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWNEwyX1NURF9TRUNBTV9LICAgICAgIHxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWNEwyX1NURF9TRUNBTV9LMSkKLSNkZWZpbmUgVjRMMl9TVERfU0VDQU0gICAgICAgICAgKFY0TDJfU1REX1NFQ0FNX0IgICAgICAgfFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFY0TDJfU1REX1NFQ0FNX0cgICAgICAgfFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFY0TDJfU1REX1NFQ0FNX0ggICAgICAgfFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFY0TDJfU1REX1NFQ0FNX0RLICAgICAgfFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFY0TDJfU1REX1NFQ0FNX0wgICAgICAgfFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFY0TDJfU1REX1NFQ0FNX0xDKQotCi0jZGVmaW5lIFY0TDJfU1REXzUyNV82MCAgICAgICAgIChWNEwyX1NURF9QQUxfTSAgICAgICAgIHxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWNEwyX1NURF9QQUxfNjAgICAgICAgIHxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWNEwyX1NURF9OVFNDICAgICAgICAgIHxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWNEwyX1NURF9OVFNDXzQ0MykKLSNkZWZpbmUgVjRMMl9TVERfNjI1XzUwICAgICAgICAgKFY0TDJfU1REX1BBTCAgICAgICAgICAgfFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFY0TDJfU1REX1BBTF9OICAgICAgICAgfFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFY0TDJfU1REX1BBTF9OYyAgICAgICAgfFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFY0TDJfU1REX1NFQ0FNKQotI2RlZmluZSBWNEwyX1NURF9BVFNDICAgICAgICAgICAoVjRMMl9TVERfQVRTQ184X1ZTQiAgICB8XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjRMMl9TVERfQVRTQ18xNl9WU0IpCi0KLSNkZWZpbmUgVjRMMl9TVERfVU5LTk9XTiAgICAgICAgMAotI2RlZmluZSBWNEwyX1NURF9BTEwgICAgICAgICAgICAoVjRMMl9TVERfNTI1XzYwICAgICAgICB8XAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjRMMl9TVERfNjI1XzUwKQotCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1zdGFuZGFyZCI+djRsMl9zdGFuZGFyZDwvbGluaz4gewotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICBpbmRleDsKLSAgICAgICAgdjRsMl9zdGRfaWQgICAgICAgICAgaWQ7Ci0gICAgICAgIF9fdTggICAgICAgICAgICAgICAgIG5hbWVbMjRdOwotICAgICAgICBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1mcmFjdCI+djRsMl9mcmFjdDwvbGluaz4gICAgZnJhbWVwZXJpb2Q7IC8qIEZyYW1lcywgbm90IGZpZWxkcyAqLwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICBmcmFtZWxpbmVzOwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICByZXNlcnZlZFs0XTsKLX07Ci0KLS8qCi0gKiAgICAgIFYgSSBEIEUgTyAgICAgICBUIEkgTSBJIE4gRyBTICAgRCBWICAgICBQIFIgRSBTIEUgVAotICovCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1kdi1wcmVzZXQiPnY0bDJfZHZfcHJlc2V0PC9saW5rPiB7Ci0gICAgICAgIF9fdTMyICAgcHJlc2V0OwotICAgICAgICBfX3UzMiAgIHJlc2VydmVkWzRdOwotfTsKLQotLyoKLSAqICAgICAgRCBWICAgICBQIFIgRSBTIEUgVCBTICAgRSBOIFUgTSBFIFIgQSBUIEkgTyBOCi0gKi8KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWR2LWVudW0tcHJlc2V0Ij52NGwyX2R2X2VudW1fcHJlc2V0PC9saW5rPiB7Ci0gICAgICAgIF9fdTMyICAgaW5kZXg7Ci0gICAgICAgIF9fdTMyICAgcHJlc2V0OwotICAgICAgICBfX3U4ICAgIG5hbWVbMzJdOyAvKiBOYW1lIG9mIHRoZSBwcmVzZXQgdGltaW5nICovCi0gICAgICAgIF9fdTMyICAgd2lkdGg7Ci0gICAgICAgIF9fdTMyICAgaGVpZ2h0OwotICAgICAgICBfX3UzMiAgIHJlc2VydmVkWzRdOwotfTsKLQotLyoKLSAqICAgICAgRCBWICAgICBQIFIgRSBTIEUgVCAgICAgViBBIEwgVSBFIFMKLSAqLwotI2RlZmluZSAgICAgICAgIFY0TDJfRFZfSU5WQUxJRCAgICAgICAgIDAKLSNkZWZpbmUgICAgICAgICBWNEwyX0RWXzQ4MFA1OV85NCAgICAgICAxIC8qIEJULjEzNjIgKi8KLSNkZWZpbmUgICAgICAgICBWNEwyX0RWXzU3NlA1MCAgICAgICAgICAyIC8qIEJULjEzNjIgKi8KLSNkZWZpbmUgICAgICAgICBWNEwyX0RWXzcyMFAyNCAgICAgICAgICAzIC8qIFNNUFRFIDI5Nk0gKi8KLSNkZWZpbmUgICAgICAgICBWNEwyX0RWXzcyMFAyNSAgICAgICAgICA0IC8qIFNNUFRFIDI5Nk0gKi8KLSNkZWZpbmUgICAgICAgICBWNEwyX0RWXzcyMFAzMCAgICAgICAgICA1IC8qIFNNUFRFIDI5Nk0gKi8KLSNkZWZpbmUgICAgICAgICBWNEwyX0RWXzcyMFA1MCAgICAgICAgICA2IC8qIFNNUFRFIDI5Nk0gKi8KLSNkZWZpbmUgICAgICAgICBWNEwyX0RWXzcyMFA1OV85NCAgICAgICA3IC8qIFNNUFRFIDI3NE0gKi8KLSNkZWZpbmUgICAgICAgICBWNEwyX0RWXzcyMFA2MCAgICAgICAgICA4IC8qIFNNUFRFIDI3NE0vMjk2TSAqLwotI2RlZmluZSAgICAgICAgIFY0TDJfRFZfMTA4MEkyOV85NyAgICAgIDkgLyogQlQuMTEyMC8gU01QVEUgMjc0TSAqLwotI2RlZmluZSAgICAgICAgIFY0TDJfRFZfMTA4MEkzMCAgICAgICAgIDEwIC8qIEJULjExMjAvIFNNUFRFIDI3NE0gKi8KLSNkZWZpbmUgICAgICAgICBWNEwyX0RWXzEwODBJMjUgICAgICAgICAxMSAvKiBCVC4xMTIwICovCi0jZGVmaW5lICAgICAgICAgVjRMMl9EVl8xMDgwSTUwICAgICAgICAgMTIgLyogU01QVEUgMjk2TSAqLwotI2RlZmluZSAgICAgICAgIFY0TDJfRFZfMTA4MEk2MCAgICAgICAgIDEzIC8qIFNNUFRFIDI5Nk0gKi8KLSNkZWZpbmUgICAgICAgICBWNEwyX0RWXzEwODBQMjQgICAgICAgICAxNCAvKiBTTVBURSAyOTZNICovCi0jZGVmaW5lICAgICAgICAgVjRMMl9EVl8xMDgwUDI1ICAgICAgICAgMTUgLyogU01QVEUgMjk2TSAqLwotI2RlZmluZSAgICAgICAgIFY0TDJfRFZfMTA4MFAzMCAgICAgICAgIDE2IC8qIFNNUFRFIDI5Nk0gKi8KLSNkZWZpbmUgICAgICAgICBWNEwyX0RWXzEwODBQNTAgICAgICAgICAxNyAvKiBCVC4xMTIwICovCi0jZGVmaW5lICAgICAgICAgVjRMMl9EVl8xMDgwUDYwICAgICAgICAgMTggLyogQlQuMTEyMCAqLwotCi0vKgotICogICAgICBEIFYgICAgIEIgVCAgICAgVCBJIE0gSSBOIEcgUwotICovCi0KLS8qIEJULjY1Ni9CVC4xMTIwIHRpbWluZyBkYXRhICovCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1idC10aW1pbmdzIj52NGwyX2J0X3RpbWluZ3M8L2xpbms+IHsKLSAgICAgICAgX191MzIgICB3aWR0aDsgICAgICAgICAgLyogd2lkdGggaW4gcGl4ZWxzICovCi0gICAgICAgIF9fdTMyICAgaGVpZ2h0OyAgICAgICAgIC8qIGhlaWdodCBpbiBsaW5lcyAqLwotICAgICAgICBfX3UzMiAgIGludGVybGFjZWQ7ICAgICAvKiBJbnRlcmxhY2VkIG9yIHByb2dyZXNzaXZlICovCi0gICAgICAgIF9fdTMyICAgcG9sYXJpdGllczsgICAgIC8qIFBvc2l0aXZlIG9yIG5lZ2F0aXZlIHBvbGFyaXR5ICovCi0gICAgICAgIF9fdTY0ICAgcGl4ZWxjbG9jazsgICAgIC8qIFBpeGVsIGNsb2NrIGluIEhaLiBFeC4gNzQuMjVNSHotJmd0Ozc0MjUwMDAwICovCi0gICAgICAgIF9fdTMyICAgaGZyb250cG9yY2g7ICAgIC8qIEhvcml6cG9udGFsIGZyb250IHBvcmNoIGluIHBpeGVscyAqLwotICAgICAgICBfX3UzMiAgIGhzeW5jOyAgICAgICAgICAvKiBIb3Jpem9udGFsIFN5bmMgbGVuZ3RoIGluIHBpeGVscyAqLwotICAgICAgICBfX3UzMiAgIGhiYWNrcG9yY2g7ICAgICAvKiBIb3Jpem9udGFsIGJhY2sgcG9yY2ggaW4gcGl4ZWxzICovCi0gICAgICAgIF9fdTMyICAgdmZyb250cG9yY2g7ICAgIC8qIFZlcnRpY2FsIGZyb250IHBvcmNoIGluIHBpeGVscyAqLwotICAgICAgICBfX3UzMiAgIHZzeW5jOyAgICAgICAgICAvKiBWZXJ0aWNhbCBTeW5jIGxlbmd0aCBpbiBsaW5lcyAqLwotICAgICAgICBfX3UzMiAgIHZiYWNrcG9yY2g7ICAgICAvKiBWZXJ0aWNhbCBiYWNrIHBvcmNoIGluIGxpbmVzICovCi0gICAgICAgIF9fdTMyICAgaWxfdmZyb250cG9yY2g7IC8qIFZlcnRpY2FsIGZyb250IHBvcmNoIGZvciBib3R0b20gZmllbGQgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaW50ZXJsYWNlZCBmaWVsZCBmb3JtYXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICBfX3UzMiAgIGlsX3ZzeW5jOyAgICAgICAvKiBWZXJ0aWNhbCBzeW5jIGxlbmd0aCBmb3IgYm90dG9tIGZpZWxkIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGludGVybGFjZWQgZmllbGQgZm9ybWF0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgX191MzIgICBpbF92YmFja3BvcmNoOyAgLyogVmVydGljYWwgYmFjayBwb3JjaCBmb3IgYm90dG9tIGZpZWxkIG9mCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGludGVybGFjZWQgZmllbGQgZm9ybWF0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgX191MzIgICByZXNlcnZlZFsxNl07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyogSW50ZXJsYWNlZCBvciBwcm9ncmVzc2l2ZSBmb3JtYXQgKi8KLSNkZWZpbmUgVjRMMl9EVl9QUk9HUkVTU0lWRSAgICAgMAotI2RlZmluZSBWNEwyX0RWX0lOVEVSTEFDRUQgICAgICAxCi0KLS8qIFBvbGFyaXRpZXMuIElmIGJpdCBpcyBub3Qgc2V0LCBpdCBpcyBhc3N1bWVkIHRvIGJlIG5lZ2F0aXZlIHBvbGFyaXR5ICovCi0jZGVmaW5lIFY0TDJfRFZfVlNZTkNfUE9TX1BPTCAgIDB4MDAwMDAwMDEKLSNkZWZpbmUgVjRMMl9EVl9IU1lOQ19QT1NfUE9MICAgMHgwMDAwMDAwMgotCi0KLS8qIERWIHRpbWluZ3MgKi8KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWR2LXRpbWluZ3MiPnY0bDJfZHZfdGltaW5nczwvbGluaz4gewotICAgICAgICBfX3UzMiB0eXBlOwotICAgICAgICB1bmlvbiB7Ci0gICAgICAgICAgICAgICAgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItYnQtdGltaW5ncyI+djRsMl9idF90aW1pbmdzPC9saW5rPiAgYnQ7Ci0gICAgICAgICAgICAgICAgX191MzIgICByZXNlcnZlZFszMl07Ci0gICAgICAgIH07Ci19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotLyogVmFsdWVzIGZvciB0aGUgdHlwZSBmaWVsZCAqLwotI2RlZmluZSBWNEwyX0RWX0JUXzY1Nl8xMTIwICAgICAwICAgICAgIC8qIEJULjY1Ni8xMTIwIHRpbWluZyB0eXBlICovCi0KLS8qCi0gKiAgICAgIFYgSSBEIEUgTyAgIEkgTiBQIFUgVCBTCi0gKi8KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWlucHV0Ij52NGwyX2lucHV0PC9saW5rPiB7Ci0gICAgICAgIF9fdTMyICAgICAgICBpbmRleDsgICAgICAgICAgICAgLyogIFdoaWNoIGlucHV0ICovCi0gICAgICAgIF9fdTggICAgICAgICBuYW1lWzMyXTsgICAgICAgICAgLyogIExhYmVsICovCi0gICAgICAgIF9fdTMyICAgICAgICB0eXBlOyAgICAgICAgICAgICAgLyogIFR5cGUgb2YgaW5wdXQgKi8KLSAgICAgICAgX191MzIgICAgICAgIGF1ZGlvc2V0OyAgICAgICAgICAvKiAgQXNzb2NpYXRlZCBhdWRpb3MgKGJpdGZpZWxkKSAqLwotICAgICAgICBfX3UzMiAgICAgICAgdHVuZXI7ICAgICAgICAgICAgIC8qICBBc3NvY2lhdGVkIHR1bmVyICovCi0gICAgICAgIHY0bDJfc3RkX2lkICBzdGQ7Ci0gICAgICAgIF9fdTMyICAgICAgICBzdGF0dXM7Ci0gICAgICAgIF9fdTMyICAgICAgICBjYXBhYmlsaXRpZXM7Ci0gICAgICAgIF9fdTMyICAgICAgICByZXNlcnZlZFszXTsKLX07Ci0KLS8qICBWYWx1ZXMgZm9yIHRoZSAndHlwZScgZmllbGQgKi8KLSNkZWZpbmUgVjRMMl9JTlBVVF9UWVBFX1RVTkVSICAgICAgICAgICAxCi0jZGVmaW5lIFY0TDJfSU5QVVRfVFlQRV9DQU1FUkEgICAgICAgICAgMgotCi0vKiBmaWVsZCAnc3RhdHVzJyAtIGdlbmVyYWwgKi8KLSNkZWZpbmUgVjRMMl9JTl9TVF9OT19QT1dFUiAgICAweDAwMDAwMDAxICAvKiBBdHRhY2hlZCBkZXZpY2UgaXMgb2ZmICovCi0jZGVmaW5lIFY0TDJfSU5fU1RfTk9fU0lHTkFMICAgMHgwMDAwMDAwMgotI2RlZmluZSBWNEwyX0lOX1NUX05PX0NPTE9SICAgIDB4MDAwMDAwMDQKLQotLyogZmllbGQgJ3N0YXR1cycgLSBzZW5zb3Igb3JpZW50YXRpb24gKi8KLS8qIElmIHNlbnNvciBpcyBtb3VudGVkIHVwc2lkZSBkb3duIHNldCBib3RoIGJpdHMgKi8KLSNkZWZpbmUgVjRMMl9JTl9TVF9IRkxJUCAgICAgICAweDAwMDAwMDEwIC8qIEZyYW1lcyBhcmUgZmxpcHBlZCBob3Jpem9udGFsbHkgKi8KLSNkZWZpbmUgVjRMMl9JTl9TVF9WRkxJUCAgICAgICAweDAwMDAwMDIwIC8qIEZyYW1lcyBhcmUgZmxpcHBlZCB2ZXJ0aWNhbGx5ICovCi0KLS8qIGZpZWxkICdzdGF0dXMnIC0gYW5hbG9nICovCi0jZGVmaW5lIFY0TDJfSU5fU1RfTk9fSF9MT0NLICAgMHgwMDAwMDEwMCAgLyogTm8gaG9yaXpvbnRhbCBzeW5jIGxvY2sgKi8KLSNkZWZpbmUgVjRMMl9JTl9TVF9DT0xPUl9LSUxMICAweDAwMDAwMjAwICAvKiBDb2xvciBraWxsZXIgaXMgYWN0aXZlICovCi0KLS8qIGZpZWxkICdzdGF0dXMnIC0gZGlnaXRhbCAqLwotI2RlZmluZSBWNEwyX0lOX1NUX05PX1NZTkMgICAgIDB4MDAwMTAwMDAgIC8qIE5vIHN5bmNocm9uaXphdGlvbiBsb2NrICovCi0jZGVmaW5lIFY0TDJfSU5fU1RfTk9fRVFVICAgICAgMHgwMDAyMDAwMCAgLyogTm8gZXF1YWxpemVyIGxvY2sgKi8KLSNkZWZpbmUgVjRMMl9JTl9TVF9OT19DQVJSSUVSICAweDAwMDQwMDAwICAvKiBDYXJyaWVyIHJlY292ZXJ5IGZhaWxlZCAqLwotCi0vKiBmaWVsZCAnc3RhdHVzJyAtIFZDUiBhbmQgc2V0LXRvcCBib3ggKi8KLSNkZWZpbmUgVjRMMl9JTl9TVF9NQUNST1ZJU0lPTiAweDAxMDAwMDAwICAvKiBNYWNyb3Zpc2lvbiBkZXRlY3RlZCAqLwotI2RlZmluZSBWNEwyX0lOX1NUX05PX0FDQ0VTUyAgIDB4MDIwMDAwMDAgIC8qIENvbmRpdGlvbmFsIGFjY2VzcyBkZW5pZWQgKi8KLSNkZWZpbmUgVjRMMl9JTl9TVF9WVFIgICAgICAgICAweDA0MDAwMDAwICAvKiBWVFIgdGltZSBjb25zdGFudCAqLwotCi0vKiBjYXBhYmlsaXRpZXMgZmxhZ3MgKi8KLSNkZWZpbmUgVjRMMl9JTl9DQVBfUFJFU0VUUyAgICAgICAgICAgICAweDAwMDAwMDAxIC8qIFN1cHBvcnRzIFNfRFZfUFJFU0VUICovCi0jZGVmaW5lIFY0TDJfSU5fQ0FQX0NVU1RPTV9USU1JTkdTICAgICAgMHgwMDAwMDAwMiAvKiBTdXBwb3J0cyBTX0RWX1RJTUlOR1MgKi8KLSNkZWZpbmUgVjRMMl9JTl9DQVBfU1REICAgICAgICAgICAgICAgICAweDAwMDAwMDA0IC8qIFN1cHBvcnRzIFNfU1REICovCi0KLS8qCi0gKiAgICAgIFYgSSBEIEUgTyAgIE8gVSBUIFAgVSBUIFMKLSAqLwotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItb3V0cHV0Ij52NGwyX291dHB1dDwvbGluaz4gewotICAgICAgICBfX3UzMiAgICAgICAgaW5kZXg7ICAgICAgICAgICAgIC8qICBXaGljaCBvdXRwdXQgKi8KLSAgICAgICAgX191OCAgICAgICAgIG5hbWVbMzJdOyAgICAgICAgICAvKiAgTGFiZWwgKi8KLSAgICAgICAgX191MzIgICAgICAgIHR5cGU7ICAgICAgICAgICAgICAvKiAgVHlwZSBvZiBvdXRwdXQgKi8KLSAgICAgICAgX191MzIgICAgICAgIGF1ZGlvc2V0OyAgICAgICAgICAvKiAgQXNzb2NpYXRlZCBhdWRpb3MgKGJpdGZpZWxkKSAqLwotICAgICAgICBfX3UzMiAgICAgICAgbW9kdWxhdG9yOyAgICAgICAgIC8qICBBc3NvY2lhdGVkIG1vZHVsYXRvciAqLwotICAgICAgICB2NGwyX3N0ZF9pZCAgc3RkOwotICAgICAgICBfX3UzMiAgICAgICAgY2FwYWJpbGl0aWVzOwotICAgICAgICBfX3UzMiAgICAgICAgcmVzZXJ2ZWRbM107Ci19OwotLyogIFZhbHVlcyBmb3IgdGhlICd0eXBlJyBmaWVsZCAqLwotI2RlZmluZSBWNEwyX09VVFBVVF9UWVBFX01PRFVMQVRPUiAgICAgICAgICAgICAgMQotI2RlZmluZSBWNEwyX09VVFBVVF9UWVBFX0FOQUxPRyAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBWNEwyX09VVFBVVF9UWVBFX0FOQUxPR1ZHQU9WRVJMQVkgICAgICAgMwotCi0vKiBjYXBhYmlsaXRpZXMgZmxhZ3MgKi8KLSNkZWZpbmUgVjRMMl9PVVRfQ0FQX1BSRVNFVFMgICAgICAgICAgICAweDAwMDAwMDAxIC8qIFN1cHBvcnRzIFNfRFZfUFJFU0VUICovCi0jZGVmaW5lIFY0TDJfT1VUX0NBUF9DVVNUT01fVElNSU5HUyAgICAgMHgwMDAwMDAwMiAvKiBTdXBwb3J0cyBTX0RWX1RJTUlOR1MgKi8KLSNkZWZpbmUgVjRMMl9PVVRfQ0FQX1NURCAgICAgICAgICAgICAgICAweDAwMDAwMDA0IC8qIFN1cHBvcnRzIFNfU1REICovCi0KLS8qCi0gKiAgICAgIEMgTyBOIFQgUiBPIEwgUwotICovCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1jb250cm9sIj52NGwyX2NvbnRyb2w8L2xpbms+IHsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgaWQ7Ci0gICAgICAgIF9fczMyICAgICAgICAgICAgICAgIHZhbHVlOwotfTsKLQotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZXh0LWNvbnRyb2wiPnY0bDJfZXh0X2NvbnRyb2w8L2xpbms+IHsKLSAgICAgICAgX191MzIgaWQ7Ci0gICAgICAgIF9fdTMyIHNpemU7Ci0gICAgICAgIF9fdTMyIHJlc2VydmVkMlsxXTsKLSAgICAgICAgdW5pb24gewotICAgICAgICAgICAgICAgIF9fczMyIHZhbHVlOwotICAgICAgICAgICAgICAgIF9fczY0IHZhbHVlNjQ7Ci0gICAgICAgICAgICAgICAgY2hhciAqc3RyaW5nOwotICAgICAgICB9OwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWV4dC1jb250cm9scyI+djRsMl9leHRfY29udHJvbHM8L2xpbms+IHsKLSAgICAgICAgX191MzIgY3RybF9jbGFzczsKLSAgICAgICAgX191MzIgY291bnQ7Ci0gICAgICAgIF9fdTMyIGVycm9yX2lkeDsKLSAgICAgICAgX191MzIgcmVzZXJ2ZWRbMl07Ci0gICAgICAgIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWV4dC1jb250cm9sIj52NGwyX2V4dF9jb250cm9sPC9saW5rPiAqY29udHJvbHM7Ci19OwotCi0vKiAgVmFsdWVzIGZvciBjdHJsX2NsYXNzIGZpZWxkICovCi0jZGVmaW5lIFY0TDJfQ1RSTF9DTEFTU19VU0VSIDB4MDA5ODAwMDAgLyogT2xkLXN0eWxlICd1c2VyJyBjb250cm9scyAqLwotI2RlZmluZSBWNEwyX0NUUkxfQ0xBU1NfTVBFRyAweDAwOTkwMDAwIC8qIE1QRUctY29tcHJlc3Npb24gY29udHJvbHMgKi8KLSNkZWZpbmUgVjRMMl9DVFJMX0NMQVNTX0NBTUVSQSAweDAwOWEwMDAwICAgICAgIC8qIENhbWVyYSBjbGFzcyBjb250cm9scyAqLwotI2RlZmluZSBWNEwyX0NUUkxfQ0xBU1NfRk1fVFggMHgwMDliMDAwMCAgICAgICAgLyogRk0gTW9kdWxhdG9yIGNvbnRyb2wgY2xhc3MgKi8KLQotI2RlZmluZSBWNEwyX0NUUkxfSURfTUFTSyAgICAgICAgICgweDBmZmZmZmZmKQotI2RlZmluZSBWNEwyX0NUUkxfSUQyQ0xBU1MoaWQpICAgICgoaWQpICZhbXA7IDB4MGZmZjAwMDBVTCkKLSNkZWZpbmUgVjRMMl9DVFJMX0RSSVZFUl9QUklWKGlkKSAoKChpZCkgJmFtcDsgMHhmZmZmKSAmZ3Q7PSAweDEwMDApCi0KLWVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1jdHJsLXR5cGUiPnY0bDJfY3RybF90eXBlPC9saW5rPiB7Ci0gICAgICAgIFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIgICAgICAgPSAxLAotICAgICAgICBWNEwyX0NUUkxfVFlQRV9CT09MRUFOICAgICAgID0gMiwKLSAgICAgICAgVjRMMl9DVFJMX1RZUEVfTUVOVSAgICAgICAgICA9IDMsCi0gICAgICAgIFY0TDJfQ1RSTF9UWVBFX0JVVFRPTiAgICAgICAgPSA0LAotICAgICAgICBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSNjQgICAgID0gNSwKLSAgICAgICAgVjRMMl9DVFJMX1RZUEVfQ1RSTF9DTEFTUyAgICA9IDYsCi0gICAgICAgIFY0TDJfQ1RSTF9UWVBFX1NUUklORyAgICAgICAgPSA3LAotfTsKLQotLyogIFVzZWQgaW4gdGhlIFZJRElPQ19RVUVSWUNUUkwgaW9jdGwgZm9yIHF1ZXJ5aW5nIGNvbnRyb2xzICovCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1xdWVyeWN0cmwiPnY0bDJfcXVlcnljdHJsPC9saW5rPiB7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgIGlkOwotICAgICAgICBlbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItY3RybC10eXBlIj52NGwyX2N0cmxfdHlwZTwvbGluaz4gIHR5cGU7Ci0gICAgICAgIF9fdTggICAgICAgICAgICAgICAgIG5hbWVbMzJdOyAgLyogV2hhdGV2ZXIgKi8KLSAgICAgICAgX19zMzIgICAgICAgICAgICAgICAgbWluaW11bTsgICAvKiBOb3RlIHNpZ25lZG5lc3MgKi8KLSAgICAgICAgX19zMzIgICAgICAgICAgICAgICAgbWF4aW11bTsKLSAgICAgICAgX19zMzIgICAgICAgICAgICAgICAgc3RlcDsKLSAgICAgICAgX19zMzIgICAgICAgICAgICAgICAgZGVmYXVsdF92YWx1ZTsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgZmxhZ3M7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgIHJlc2VydmVkWzJdOwotfTsKLQotLyogIFVzZWQgaW4gdGhlIFZJRElPQ19RVUVSWU1FTlUgaW9jdGwgZm9yIHF1ZXJ5aW5nIG1lbnUgaXRlbXMgKi8KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXF1ZXJ5bWVudSI+djRsMl9xdWVyeW1lbnU8L2xpbms+IHsKLSAgICAgICAgX191MzIgICAgICAgICAgIGlkOwotICAgICAgICBfX3UzMiAgICAgICAgICAgaW5kZXg7Ci0gICAgICAgIF9fdTggICAgICAgICAgICBuYW1lWzMyXTsgICAgICAgLyogV2hhdGV2ZXIgKi8KLSAgICAgICAgX191MzIgICAgICAgICAgIHJlc2VydmVkOwotfTsKLQotLyogIENvbnRyb2wgZmxhZ3MgICovCi0jZGVmaW5lIFY0TDJfQ1RSTF9GTEFHX0RJU0FCTEVEICAgICAgICAgMHgwMDAxCi0jZGVmaW5lIFY0TDJfQ1RSTF9GTEFHX0dSQUJCRUQgICAgICAgICAgMHgwMDAyCi0jZGVmaW5lIFY0TDJfQ1RSTF9GTEFHX1JFQURfT05MWSAgICAgICAgMHgwMDA0Ci0jZGVmaW5lIFY0TDJfQ1RSTF9GTEFHX1VQREFURSAgICAgICAgICAgMHgwMDA4Ci0jZGVmaW5lIFY0TDJfQ1RSTF9GTEFHX0lOQUNUSVZFICAgICAgICAgMHgwMDEwCi0jZGVmaW5lIFY0TDJfQ1RSTF9GTEFHX1NMSURFUiAgICAgICAgICAgMHgwMDIwCi0jZGVmaW5lIFY0TDJfQ1RSTF9GTEFHX1dSSVRFX09OTFkgICAgICAgMHgwMDQwCi0KLS8qICBRdWVyeSBmbGFnLCB0byBiZSBPUmVkIHdpdGggdGhlIGNvbnRyb2wgSUQgKi8KLSNkZWZpbmUgVjRMMl9DVFJMX0ZMQUdfTkVYVF9DVFJMICAgICAgICAweDgwMDAwMDAwCi0KLS8qICBVc2VyLWNsYXNzIGNvbnRyb2wgSURzIGRlZmluZWQgYnkgVjRMMiAqLwotI2RlZmluZSBWNEwyX0NJRF9CQVNFICAgICAgICAgICAgICAgICAgIChWNEwyX0NUUkxfQ0xBU1NfVVNFUiB8IDB4OTAwKQotI2RlZmluZSBWNEwyX0NJRF9VU0VSX0JBU0UgICAgICAgICAgICAgIFY0TDJfQ0lEX0JBU0UKLS8qICBJRHMgcmVzZXJ2ZWQgZm9yIGRyaXZlciBzcGVjaWZpYyBjb250cm9scyAqLwotI2RlZmluZSBWNEwyX0NJRF9QUklWQVRFX0JBU0UgICAgICAgICAgIDB4MDgwMDAwMDAKLQotI2RlZmluZSBWNEwyX0NJRF9VU0VSX0NMQVNTICAgICAgICAgICAgIChWNEwyX0NUUkxfQ0xBU1NfVVNFUiB8IDEpCi0jZGVmaW5lIFY0TDJfQ0lEX0JSSUdIVE5FU1MgICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrMCkKLSNkZWZpbmUgVjRMMl9DSURfQ09OVFJBU1QgICAgICAgICAgICAgICAoVjRMMl9DSURfQkFTRSsxKQotI2RlZmluZSBWNEwyX0NJRF9TQVRVUkFUSU9OICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzIpCi0jZGVmaW5lIFY0TDJfQ0lEX0hVRSAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrMykKLSNkZWZpbmUgVjRMMl9DSURfQVVESU9fVk9MVU1FICAgICAgICAgICAoVjRMMl9DSURfQkFTRSs1KQotI2RlZmluZSBWNEwyX0NJRF9BVURJT19CQUxBTkNFICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzYpCi0jZGVmaW5lIFY0TDJfQ0lEX0FVRElPX0JBU1MgICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrNykKLSNkZWZpbmUgVjRMMl9DSURfQVVESU9fVFJFQkxFICAgICAgICAgICAoVjRMMl9DSURfQkFTRSs4KQotI2RlZmluZSBWNEwyX0NJRF9BVURJT19NVVRFICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzkpCi0jZGVmaW5lIFY0TDJfQ0lEX0FVRElPX0xPVURORVNTICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrMTApCi0jZGVmaW5lIFY0TDJfQ0lEX0JMQUNLX0xFVkVMICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrMTEpIC8qIERlcHJlY2F0ZWQgKi8KLSNkZWZpbmUgVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFICAgICAoVjRMMl9DSURfQkFTRSsxMikKLSNkZWZpbmUgVjRMMl9DSURfRE9fV0hJVEVfQkFMQU5DRSAgICAgICAoVjRMMl9DSURfQkFTRSsxMykKLSNkZWZpbmUgVjRMMl9DSURfUkVEX0JBTEFOQ0UgICAgICAgICAgICAoVjRMMl9DSURfQkFTRSsxNCkKLSNkZWZpbmUgVjRMMl9DSURfQkxVRV9CQUxBTkNFICAgICAgICAgICAoVjRMMl9DSURfQkFTRSsxNSkKLSNkZWZpbmUgVjRMMl9DSURfR0FNTUEgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQkFTRSsxNikKLSNkZWZpbmUgVjRMMl9DSURfV0hJVEVORVNTICAgICAgICAgICAgICAoVjRMMl9DSURfR0FNTUEpIC8qIERlcHJlY2F0ZWQgKi8KLSNkZWZpbmUgVjRMMl9DSURfRVhQT1NVUkUgICAgICAgICAgICAgICAoVjRMMl9DSURfQkFTRSsxNykKLSNkZWZpbmUgVjRMMl9DSURfQVVUT0dBSU4gICAgICAgICAgICAgICAoVjRMMl9DSURfQkFTRSsxOCkKLSNkZWZpbmUgVjRMMl9DSURfR0FJTiAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQkFTRSsxOSkKLSNkZWZpbmUgVjRMMl9DSURfSEZMSVAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQkFTRSsyMCkKLSNkZWZpbmUgVjRMMl9DSURfVkZMSVAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQkFTRSsyMSkKLQotLyogRGVwcmVjYXRlZDsgdXNlIFY0TDJfQ0lEX1BBTl9SRVNFVCBhbmQgVjRMMl9DSURfVElMVF9SRVNFVCAqLwotI2RlZmluZSBWNEwyX0NJRF9IQ0VOVEVSICAgICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzIyKQotI2RlZmluZSBWNEwyX0NJRF9WQ0VOVEVSICAgICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzIzKQotCi0jZGVmaW5lIFY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZICAgKFY0TDJfQ0lEX0JBU0UrMjQpCi1lbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItcG93ZXItbGluZS1mcmVxdWVuY3kiPnY0bDJfcG93ZXJfbGluZV9mcmVxdWVuY3k8L2xpbms+IHsKLSAgICAgICAgVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1lfRElTQUJMRUQgID0gMCwKLSAgICAgICAgVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1lfNTBIWiAgICAgID0gMSwKLSAgICAgICAgVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1lfNjBIWiAgICAgID0gMiwKLX07Ci0jZGVmaW5lIFY0TDJfQ0lEX0hVRV9BVVRPICAgICAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQkFTRSsyNSkKLSNkZWZpbmUgVjRMMl9DSURfV0hJVEVfQkFMQU5DRV9URU1QRVJBVFVSRSAgICAgIChWNEwyX0NJRF9CQVNFKzI2KQotI2RlZmluZSBWNEwyX0NJRF9TSEFSUE5FU1MgICAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrMjcpCi0jZGVmaW5lIFY0TDJfQ0lEX0JBQ0tMSUdIVF9DT01QRU5TQVRJT04gICAgICAgICAoVjRMMl9DSURfQkFTRSsyOCkKLSNkZWZpbmUgVjRMMl9DSURfQ0hST01BX0FHQyAgICAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzI5KQotI2RlZmluZSBWNEwyX0NJRF9DT0xPUl9LSUxMRVIgICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrMzApCi0jZGVmaW5lIFY0TDJfQ0lEX0NPTE9SRlggICAgICAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQkFTRSszMSkKLWVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1jb2xvcmZ4Ij52NGwyX2NvbG9yZng8L2xpbms+IHsKLSAgICAgICAgVjRMMl9DT0xPUkZYX05PTkUgICAgICAgPSAwLAotICAgICAgICBWNEwyX0NPTE9SRlhfQlcgICAgICAgICA9IDEsCi0gICAgICAgIFY0TDJfQ09MT1JGWF9TRVBJQSAgICAgID0gMiwKLSAgICAgICAgVjRMMl9DT0xPUkZYX05FR0FUSVZFID0gMywKLSAgICAgICAgVjRMMl9DT0xPUkZYX0VNQk9TUyA9IDQsCi0gICAgICAgIFY0TDJfQ09MT1JGWF9TS0VUQ0ggPSA1LAotICAgICAgICBWNEwyX0NPTE9SRlhfU0tZX0JMVUUgPSA2LAotICAgICAgICBWNEwyX0NPTE9SRlhfR1JBU1NfR1JFRU4gPSA3LAotICAgICAgICBWNEwyX0NPTE9SRlhfU0tJTl9XSElURU4gPSA4LAotICAgICAgICBWNEwyX0NPTE9SRlhfVklWSUQgPSA5LAotfTsKLSNkZWZpbmUgVjRMMl9DSURfQVVUT0JSSUdIVE5FU1MgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzMyKQotI2RlZmluZSBWNEwyX0NJRF9CQU5EX1NUT1BfRklMVEVSICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrMzMpCi0KLSNkZWZpbmUgVjRMMl9DSURfUk9UQVRFICAgICAgICAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzM0KQotI2RlZmluZSBWNEwyX0NJRF9CR19DT0xPUiAgICAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0JBU0UrMzUpCi0KLSNkZWZpbmUgVjRMMl9DSURfQ0hST01BX0dBSU4gICAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzM2KQotCi0jZGVmaW5lIFY0TDJfQ0lEX0lMTFVNSU5BVE9SU18xICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQkFTRSszNykKLSNkZWZpbmUgVjRMMl9DSURfSUxMVU1JTkFUT1JTXzIgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzM4KQotCi0vKiBsYXN0IENJRCArIDEgKi8KLSNkZWZpbmUgVjRMMl9DSURfTEFTVFAxICAgICAgICAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzM5KQotCi0vKiAgTVBFRy1jbGFzcyBjb250cm9sIElEcyBkZWZpbmVkIGJ5IFY0TDIgKi8KLSNkZWZpbmUgVjRMMl9DSURfTVBFR19CQVNFICAgICAgICAgICAgICAgICAgICAgIChWNEwyX0NUUkxfQ0xBU1NfTVBFRyB8IDB4OTAwKQotI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NMQVNTICAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ1RSTF9DTEFTU19NUEVHIHwgMSkKLQotLyogIE1QRUcgc3RyZWFtcyAqLwotI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9UWVBFICAgICAgICAgICAgICAgKFY0TDJfQ0lEX01QRUdfQkFTRSswKQotZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLW1wZWctc3RyZWFtLXR5cGUiPnY0bDJfbXBlZ19zdHJlYW1fdHlwZTwvbGluaz4gewotICAgICAgICBWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzJfUFMgICA9IDAsIC8qIE1QRUctMiBwcm9ncmFtIHN0cmVhbSAqLwotICAgICAgICBWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzJfVFMgICA9IDEsIC8qIE1QRUctMiB0cmFuc3BvcnQgc3RyZWFtICovCi0gICAgICAgIFY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMV9TUyAgID0gMiwgLyogTVBFRy0xIHN5c3RlbSBzdHJlYW0gKi8KLSAgICAgICAgVjRMMl9NUEVHX1NUUkVBTV9UWVBFX01QRUcyX0RWRCAgPSAzLCAvKiBNUEVHLTIgRFZELWNvbXBhdGlibGUgc3RyZWFtICovCi0gICAgICAgIFY0TDJfTVBFR19TVFJFQU1fVFlQRV9NUEVHMV9WQ0QgID0gNCwgLyogTVBFRy0xIFZDRC1jb21wYXRpYmxlIHN0cmVhbSAqLwotICAgICAgICBWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzJfU1ZDRCA9IDUsIC8qIE1QRUctMiBTVkNELWNvbXBhdGlibGUgc3RyZWFtICovCi19OwotI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfUE1UICAgICAgICAgICAgKFY0TDJfQ0lEX01QRUdfQkFTRSsxKQotI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfQVVESU8gICAgICAgICAgKFY0TDJfQ0lEX01QRUdfQkFTRSsyKQotI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfVklERU8gICAgICAgICAgKFY0TDJfQ0lEX01QRUdfQkFTRSszKQotI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QSURfUENSICAgICAgICAgICAgKFY0TDJfQ0lEX01QRUdfQkFTRSs0KQotI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QRVNfSURfQVVESU8gICAgICAgKFY0TDJfQ0lEX01QRUdfQkFTRSs1KQotI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9QRVNfSURfVklERU8gICAgICAgKFY0TDJfQ0lEX01QRUdfQkFTRSs2KQotI2RlZmluZSBWNEwyX0NJRF9NUEVHX1NUUkVBTV9WQklfRk1UICAgICAgICAgICAgKFY0TDJfQ0lEX01QRUdfQkFTRSs3KQotZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLW1wZWctc3RyZWFtLXZiaS1mbXQiPnY0bDJfbXBlZ19zdHJlYW1fdmJpX2ZtdDwvbGluaz4gewotICAgICAgICBWNEwyX01QRUdfU1RSRUFNX1ZCSV9GTVRfTk9ORSA9IDAsICAvKiBObyBWQkkgaW4gdGhlIE1QRUcgc3RyZWFtICovCi0gICAgICAgIFY0TDJfTVBFR19TVFJFQU1fVkJJX0ZNVF9JVlRWID0gMSwgIC8qIFZCSSBpbiBwcml2YXRlIHBhY2tldHMsIElWVFYgZm9ybWF0ICovCi19OwotCi0vKiAgTVBFRyBhdWRpbyAqLwotI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVEgICAgICAgKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDApCi1lbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItbXBlZy1hdWRpby1zYW1wbGluZy1mcmVxIj52NGwyX21wZWdfYXVkaW9fc2FtcGxpbmdfZnJlcTwvbGluaz4gewotICAgICAgICBWNEwyX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUV80NDEwMCA9IDAsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19TQU1QTElOR19GUkVRXzQ4MDAwID0gMSwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVFfMzIwMDAgPSAyLAotfTsKLSNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19FTkNPRElORyAgICAgICAgICAgIChWNEwyX0NJRF9NUEVHX0JBU0UrMTAxKQotZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLW1wZWctYXVkaW8tZW5jb2RpbmciPnY0bDJfbXBlZ19hdWRpb19lbmNvZGluZzwvbGluaz4gewotICAgICAgICBWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfTEFZRVJfMSA9IDAsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19FTkNPRElOR19MQVlFUl8yID0gMSwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0VOQ09ESU5HX0xBWUVSXzMgPSAyLAotICAgICAgICBWNEwyX01QRUdfQVVESU9fRU5DT0RJTkdfQUFDICAgICA9IDMsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19FTkNPRElOR19BQzMgICAgID0gNCwKLX07Ci0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fTDFfQklUUkFURSAgICAgICAgICAoVjRMMl9DSURfTVBFR19CQVNFKzEwMikKLWVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1tcGVnLWF1ZGlvLWwxLWJpdHJhdGUiPnY0bDJfbXBlZ19hdWRpb19sMV9iaXRyYXRlPC9saW5rPiB7Ci0gICAgICAgIFY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzMySyAgPSAwLAotICAgICAgICBWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV82NEsgID0gMSwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfOTZLICA9IDIsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzEyOEsgPSAzLAotICAgICAgICBWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8xNjBLID0gNCwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMTkySyA9IDUsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzIyNEsgPSA2LAotICAgICAgICBWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8yNTZLID0gNywKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfMjg4SyA9IDgsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzMyMEsgPSA5LAotICAgICAgICBWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV8zNTJLID0gMTAsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19MMV9CSVRSQVRFXzM4NEsgPSAxMSwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0wxX0JJVFJBVEVfNDE2SyA9IDEyLAotICAgICAgICBWNEwyX01QRUdfQVVESU9fTDFfQklUUkFURV80NDhLID0gMTMsCi19OwotI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX0wyX0JJVFJBVEUgICAgICAgICAgKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDMpCi1lbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItbXBlZy1hdWRpby1sMi1iaXRyYXRlIj52NGwyX21wZWdfYXVkaW9fbDJfYml0cmF0ZTwvbGluaz4gewotICAgICAgICBWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8zMksgID0gMCwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfNDhLICA9IDEsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzU2SyAgPSAyLAotICAgICAgICBWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV82NEsgID0gMywKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfODBLICA9IDQsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzk2SyAgPSA1LAotICAgICAgICBWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8xMTJLID0gNiwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMTI4SyA9IDcsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzE2MEsgPSA4LAotICAgICAgICBWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8xOTJLID0gOSwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMjI0SyA9IDEwLAotICAgICAgICBWNEwyX01QRUdfQVVESU9fTDJfQklUUkFURV8yNTZLID0gMTEsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19MMl9CSVRSQVRFXzMyMEsgPSAxMiwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0wyX0JJVFJBVEVfMzg0SyA9IDEzLAotfTsKLSNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19MM19CSVRSQVRFICAgICAgICAgIChWNEwyX0NJRF9NUEVHX0JBU0UrMTA0KQotZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLW1wZWctYXVkaW8tbDMtYml0cmF0ZSI+djRsMl9tcGVnX2F1ZGlvX2wzX2JpdHJhdGU8L2xpbms+IHsKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMzJLICA9IDAsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzQwSyAgPSAxLAotICAgICAgICBWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV80OEsgID0gMiwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfNTZLICA9IDMsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzY0SyAgPSA0LAotICAgICAgICBWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV84MEsgID0gNSwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfOTZLICA9IDYsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzExMksgPSA3LAotICAgICAgICBWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8xMjhLID0gOCwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMTYwSyA9IDksCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzE5MksgPSAxMCwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0wzX0JJVFJBVEVfMjI0SyA9IDExLAotICAgICAgICBWNEwyX01QRUdfQVVESU9fTDNfQklUUkFURV8yNTZLID0gMTIsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19MM19CSVRSQVRFXzMyMEsgPSAxMywKLX07Ci0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fTU9ERSAgICAgICAgICAgICAgICAoVjRMMl9DSURfTVBFR19CQVNFKzEwNSkKLWVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1tcGVnLWF1ZGlvLW1vZGUiPnY0bDJfbXBlZ19hdWRpb19tb2RlPC9saW5rPiB7Ci0gICAgICAgIFY0TDJfTVBFR19BVURJT19NT0RFX1NURVJFTyAgICAgICA9IDAsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19NT0RFX0pPSU5UX1NURVJFTyA9IDEsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19NT0RFX0RVQUwgICAgICAgICA9IDIsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19NT0RFX01PTk8gICAgICAgICA9IDMsCi19OwotI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX01PREVfRVhURU5TSU9OICAgICAgKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDYpCi1lbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItbXBlZy1hdWRpby1tb2RlLWV4dGVuc2lvbiI+djRsMl9tcGVnX2F1ZGlvX21vZGVfZXh0ZW5zaW9uPC9saW5rPiB7Ci0gICAgICAgIFY0TDJfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTl9CT1VORF80ICA9IDAsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTl9CT1VORF84ICA9IDEsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTl9CT1VORF8xMiA9IDIsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19NT0RFX0VYVEVOU0lPTl9CT1VORF8xNiA9IDMsCi19OwotI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX0VNUEhBU0lTICAgICAgICAgICAgKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDcpCi1lbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItbXBlZy1hdWRpby1lbXBoYXNpcyI+djRsMl9tcGVnX2F1ZGlvX2VtcGhhc2lzPC9saW5rPiB7Ci0gICAgICAgIFY0TDJfTVBFR19BVURJT19FTVBIQVNJU19OT05FICAgICAgICAgPSAwLAotICAgICAgICBWNEwyX01QRUdfQVVESU9fRU1QSEFTSVNfNTBfRElWXzE1X3VTID0gMSwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0VNUEhBU0lTX0NDSVRUX0oxNyAgICA9IDIsCi19OwotI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX0NSQyAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDgpCi1lbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItbXBlZy1hdWRpby1jcmMiPnY0bDJfbXBlZ19hdWRpb19jcmM8L2xpbms+IHsKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0NSQ19OT05FICA9IDAsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19DUkNfQ1JDMTYgPSAxLAotfTsKLSNkZWZpbmUgVjRMMl9DSURfTVBFR19BVURJT19NVVRFICAgICAgICAgICAgICAgIChWNEwyX0NJRF9NUEVHX0JBU0UrMTA5KQotI2RlZmluZSBWNEwyX0NJRF9NUEVHX0FVRElPX0FBQ19CSVRSQVRFICAgICAgICAgKFY0TDJfQ0lEX01QRUdfQkFTRSsxMTApCi0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fQUMzX0JJVFJBVEUgICAgICAgICAoVjRMMl9DSURfTVBFR19CQVNFKzExMSkKLWVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1tcGVnLWF1ZGlvLWFjMy1iaXRyYXRlIj52NGwyX21wZWdfYXVkaW9fYWMzX2JpdHJhdGU8L2xpbms+IHsKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzMySyAgPSAwLAotICAgICAgICBWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfNDBLICA9IDEsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV80OEsgID0gMiwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzU2SyAgPSAzLAotICAgICAgICBWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfNjRLICA9IDQsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV84MEsgID0gNSwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzk2SyAgPSA2LAotICAgICAgICBWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfMTEySyA9IDcsCi0gICAgICAgIFY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV8xMjhLID0gOCwKLSAgICAgICAgVjRMMl9NUEVHX0FVRElPX0FDM19CSVRSQVRFXzE2MEsgPSA5LAotICAgICAgICBWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfMTkySyA9IDEwLAotICAgICAgICBWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfMjI0SyA9IDExLAotICAgICAgICBWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfMjU2SyA9IDEyLAotICAgICAgICBWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfMzIwSyA9IDEzLAotICAgICAgICBWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfMzg0SyA9IDE0LAotICAgICAgICBWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfNDQ4SyA9IDE1LAotICAgICAgICBWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfNTEySyA9IDE2LAotICAgICAgICBWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfNTc2SyA9IDE3LAotICAgICAgICBWNEwyX01QRUdfQVVESU9fQUMzX0JJVFJBVEVfNjQwSyA9IDE4LAotfTsKLQotLyogIE1QRUcgdmlkZW8gKi8KLSNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19FTkNPRElORyAgICAgICAgICAgIChWNEwyX0NJRF9NUEVHX0JBU0UrMjAwKQotZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLW1wZWctdmlkZW8tZW5jb2RpbmciPnY0bDJfbXBlZ192aWRlb19lbmNvZGluZzwvbGluaz4gewotICAgICAgICBWNEwyX01QRUdfVklERU9fRU5DT0RJTkdfTVBFR18xICAgICA9IDAsCi0gICAgICAgIFY0TDJfTVBFR19WSURFT19FTkNPRElOR19NUEVHXzIgICAgID0gMSwKLSAgICAgICAgVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfNF9BVkMgPSAyLAotfTsKLSNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19BU1BFQ1QgICAgICAgICAgICAgIChWNEwyX0NJRF9NUEVHX0JBU0UrMjAxKQotZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLW1wZWctdmlkZW8tYXNwZWN0Ij52NGwyX21wZWdfdmlkZW9fYXNwZWN0PC9saW5rPiB7Ci0gICAgICAgIFY0TDJfTVBFR19WSURFT19BU1BFQ1RfMXgxICAgICA9IDAsCi0gICAgICAgIFY0TDJfTVBFR19WSURFT19BU1BFQ1RfNHgzICAgICA9IDEsCi0gICAgICAgIFY0TDJfTVBFR19WSURFT19BU1BFQ1RfMTZ4OSAgICA9IDIsCi0gICAgICAgIFY0TDJfTVBFR19WSURFT19BU1BFQ1RfMjIxeDEwMCA9IDMsCi19OwotI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JfRlJBTUVTICAgICAgICAgICAgKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDIpCi0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fR09QX1NJWkUgICAgICAgICAgICAoVjRMMl9DSURfTVBFR19CQVNFKzIwMykKLSNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19HT1BfQ0xPU1VSRSAgICAgICAgIChWNEwyX0NJRF9NUEVHX0JBU0UrMjA0KQotI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1BVTExET1dOICAgICAgICAgICAgKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDUpCi0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURV9NT0RFICAgICAgICAoVjRMMl9DSURfTVBFR19CQVNFKzIwNikKLWVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1tcGVnLXZpZGVvLWJpdHJhdGUtbW9kZSI+djRsMl9tcGVnX3ZpZGVvX2JpdHJhdGVfbW9kZTwvbGluaz4gewotICAgICAgICBWNEwyX01QRUdfVklERU9fQklUUkFURV9NT0RFX1ZCUiA9IDAsCi0gICAgICAgIFY0TDJfTVBFR19WSURFT19CSVRSQVRFX01PREVfQ0JSID0gMSwKLX07Ci0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fQklUUkFURSAgICAgICAgICAgICAoVjRMMl9DSURfTVBFR19CQVNFKzIwNykKLSNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFX1BFQUsgICAgICAgIChWNEwyX0NJRF9NUEVHX0JBU0UrMjA4KQotI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1RFTVBPUkFMX0RFQ0lNQVRJT04gKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDkpCi0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVVURSAgICAgICAgICAgICAgICAoVjRMMl9DSURfTVBFR19CQVNFKzIxMCkKLSNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NVVRFX1lVViAgICAgICAgICAgIChWNEwyX0NJRF9NUEVHX0JBU0UrMjExKQotCi0vKiAgTVBFRy1jbGFzcyBjb250cm9sIElEcyBzcGVjaWZpYyB0byB0aGUgQ1gyMzQxeCBkcml2ZXIgYXMgZGVmaW5lZCBieSBWNEwyICovCi0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ1RSTF9DTEFTU19NUEVHIHwgMHgxMDAwKQotI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVJfTU9ERSAgICAgICAgIChWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSswKQotZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLW1wZWctY3gyMzQxeC12aWRlby1zcGF0aWFsLWZpbHRlci1tb2RlIj52NGwyX21wZWdfY3gyMzQxeF92aWRlb19zcGF0aWFsX2ZpbHRlcl9tb2RlPC9saW5rPiB7Ci0gICAgICAgIFY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX1NQQVRJQUxfRklMVEVSX01PREVfTUFOVUFMID0gMCwKLSAgICAgICAgVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fU1BBVElBTF9GSUxURVJfTU9ERV9BVVRPICAgPSAxLAotfTsKLSNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1NQQVRJQUxfRklMVEVSICAgICAgICAgICAgICAoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrMSkKLSNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfU1BBVElBTF9GSUxURVJfVFlQRSAgICAoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrMikKLWVudW0gPGxpbmsgbGlua2VuZD0ibHVtYS1zcGF0aWFsLWZpbHRlci10eXBlIj52NGwyX21wZWdfY3gyMzQxeF92aWRlb19sdW1hX3NwYXRpYWxfZmlsdGVyX3R5cGU8L2xpbms+IHsKLSAgICAgICAgVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFX09GRiAgICAgICAgICAgICAgICAgID0gMCwKLSAgICAgICAgVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFXzFEX0hPUiAgICAgICAgICAgICAgID0gMSwKLSAgICAgICAgVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFXzFEX1ZFUlQgICAgICAgICAgICAgID0gMiwKLSAgICAgICAgVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFXzJEX0hWX1NFUEFSQUJMRSAgICAgID0gMywKLSAgICAgICAgVjRMMl9NUEVHX0NYMjM0MVhfVklERU9fTFVNQV9TUEFUSUFMX0ZJTFRFUl9UWVBFXzJEX1NZTV9OT05fU0VQQVJBQkxFID0gNCwKLX07Ci0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfU1BBVElBTF9GSUxURVJfVFlQRSAgKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzMpCi1lbnVtIDxsaW5rIGxpbmtlbmQ9ImNocm9tYS1zcGF0aWFsLWZpbHRlci10eXBlIj52NGwyX21wZWdfY3gyMzQxeF92aWRlb19jaHJvbWFfc3BhdGlhbF9maWx0ZXJfdHlwZTwvbGluaz4gewotICAgICAgICBWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfU1BBVElBTF9GSUxURVJfVFlQRV9PRkYgICAgPSAwLAotICAgICAgICBWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19DSFJPTUFfU1BBVElBTF9GSUxURVJfVFlQRV8xRF9IT1IgPSAxLAotfTsKLSNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX1RFTVBPUkFMX0ZJTFRFUl9NT0RFICAgICAgICAoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrNCkKLWVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1tcGVnLWN4MjM0MXgtdmlkZW8tdGVtcG9yYWwtZmlsdGVyLW1vZGUiPnY0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX3RlbXBvcmFsX2ZpbHRlcl9tb2RlPC9saW5rPiB7Ci0gICAgICAgIFY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX1RFTVBPUkFMX0ZJTFRFUl9NT0RFX01BTlVBTCA9IDAsCi0gICAgICAgIFY0TDJfTVBFR19DWDIzNDFYX1ZJREVPX1RFTVBPUkFMX0ZJTFRFUl9NT0RFX0FVVE8gICA9IDEsCi19OwotI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fVEVNUE9SQUxfRklMVEVSICAgICAgICAgICAgIChWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSs1KQotI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fTUVESUFOX0ZJTFRFUl9UWVBFICAgICAgICAgIChWNEwyX0NJRF9NUEVHX0NYMjM0MVhfQkFTRSs2KQotZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLW1wZWctY3gyMzQxeC12aWRlby1tZWRpYW4tZmlsdGVyLXR5cGUiPnY0bDJfbXBlZ19jeDIzNDF4X3ZpZGVvX21lZGlhbl9maWx0ZXJfdHlwZTwvbGluaz4gewotICAgICAgICBWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19NRURJQU5fRklMVEVSX1RZUEVfT0ZGICAgICAgPSAwLAotICAgICAgICBWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19NRURJQU5fRklMVEVSX1RZUEVfSE9SICAgICAgPSAxLAotICAgICAgICBWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19NRURJQU5fRklMVEVSX1RZUEVfVkVSVCAgICAgPSAyLAotICAgICAgICBWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19NRURJQU5fRklMVEVSX1RZUEVfSE9SX1ZFUlQgPSAzLAotICAgICAgICBWNEwyX01QRUdfQ1gyMzQxWF9WSURFT19NRURJQU5fRklMVEVSX1RZUEVfRElBRyAgICAgPSA0LAotfTsKLSNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfTUVESUFOX0ZJTFRFUl9CT1RUT00gICAoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrNykKLSNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0xVTUFfTUVESUFOX0ZJTFRFUl9UT1AgICAgICAoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrOCkKLSNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0NIUk9NQV9NRURJQU5fRklMVEVSX0JPVFRPTSAoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrOSkKLSNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX1ZJREVPX0NIUk9NQV9NRURJQU5fRklMVEVSX1RPUCAgICAoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrMTApCi0jZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9TVFJFQU1fSU5TRVJUX05BVl9QQUNLRVRTICAgICAgICAgKFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9CQVNFKzExKQotCi0vKiAgQ2FtZXJhIGNsYXNzIGNvbnRyb2wgSURzICovCi0jZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFICAgICAgKFY0TDJfQ1RSTF9DTEFTU19DQU1FUkEgfCAweDkwMCkKLSNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX0NMQVNTICAgICAgICAgICAoVjRMMl9DVFJMX0NMQVNTX0NBTUVSQSB8IDEpCi0KLSNkZWZpbmUgVjRMMl9DSURfRVhQT1NVUkVfQVVUTyAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsxKQotZW51bSAgPGxpbmsgbGlua2VuZD0idjRsMi1leHBvc3VyZS1hdXRvLXR5cGUiPnY0bDJfZXhwb3N1cmVfYXV0b190eXBlPC9saW5rPiB7Ci0gICAgICAgIFY0TDJfRVhQT1NVUkVfQVVUTyA9IDAsCi0gICAgICAgIFY0TDJfRVhQT1NVUkVfTUFOVUFMID0gMSwKLSAgICAgICAgVjRMMl9FWFBPU1VSRV9TSFVUVEVSX1BSSU9SSVRZID0gMiwKLSAgICAgICAgVjRMMl9FWFBPU1VSRV9BUEVSVFVSRV9QUklPUklUWSA9IDMKLX07Ci0jZGVmaW5lIFY0TDJfQ0lEX0VYUE9TVVJFX0FCU09MVVRFICAgICAgICAgICAgICAoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMikKLSNkZWZpbmUgVjRMMl9DSURfRVhQT1NVUkVfQVVUT19QUklPUklUWSAgICAgICAgIChWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSszKQotCi0jZGVmaW5lIFY0TDJfQ0lEX1BBTl9SRUxBVElWRSAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrNCkKLSNkZWZpbmUgVjRMMl9DSURfVElMVF9SRUxBVElWRSAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSs1KQotI2RlZmluZSBWNEwyX0NJRF9QQU5fUkVTRVQgICAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzYpCi0jZGVmaW5lIFY0TDJfQ0lEX1RJTFRfUkVTRVQgICAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrNykKLQotI2RlZmluZSBWNEwyX0NJRF9QQU5fQUJTT0xVVEUgICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzgpCi0jZGVmaW5lIFY0TDJfQ0lEX1RJTFRfQUJTT0xVVEUgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrOSkKLQotI2RlZmluZSBWNEwyX0NJRF9GT0NVU19BQlNPTFVURSAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzEwKQotI2RlZmluZSBWNEwyX0NJRF9GT0NVU19SRUxBVElWRSAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzExKQotI2RlZmluZSBWNEwyX0NJRF9GT0NVU19BVVRPICAgICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzEyKQotCi0jZGVmaW5lIFY0TDJfQ0lEX1pPT01fQUJTT0xVVEUgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMTMpCi0jZGVmaW5lIFY0TDJfQ0lEX1pPT01fUkVMQVRJVkUgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMTQpCi0jZGVmaW5lIFY0TDJfQ0lEX1pPT01fQ09OVElOVU9VUyAgICAgICAgICAgICAgICAoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UrMTUpCi0KLSNkZWZpbmUgVjRMMl9DSURfUFJJVkFDWSAgICAgICAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSsxNikKLQotI2RlZmluZSBWNEwyX0NJRF9JUklTX0FCU09MVVRFICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzE3KQotI2RlZmluZSBWNEwyX0NJRF9JUklTX1JFTEFUSVZFICAgICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFKzE4KQotCi0vKiBGTSBNb2R1bGF0b3IgY2xhc3MgY29udHJvbCBJRHMgKi8KLSNkZWZpbmUgVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSAgICAgICAgICAgICAgIChWNEwyX0NUUkxfQ0xBU1NfRk1fVFggfCAweDkwMCkKLSNkZWZpbmUgVjRMMl9DSURfRk1fVFhfQ0xBU1MgICAgICAgICAgICAgICAgICAgIChWNEwyX0NUUkxfQ0xBU1NfRk1fVFggfCAxKQotCi0jZGVmaW5lIFY0TDJfQ0lEX1JEU19UWF9ERVZJQVRJT04gICAgICAgICAgICAgICAoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDEpCi0jZGVmaW5lIFY0TDJfQ0lEX1JEU19UWF9QSSAgICAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDIpCi0jZGVmaW5lIFY0TDJfQ0lEX1JEU19UWF9QVFkgICAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDMpCi0jZGVmaW5lIFY0TDJfQ0lEX1JEU19UWF9QU19OQU1FICAgICAgICAgICAgICAgICAoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDUpCi0jZGVmaW5lIFY0TDJfQ0lEX1JEU19UWF9SQURJT19URVhUICAgICAgICAgICAgICAoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDYpCi0KLSNkZWZpbmUgVjRMMl9DSURfQVVESU9fTElNSVRFUl9FTkFCTEVEICAgICAgICAgIChWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgNjQpCi0jZGVmaW5lIFY0TDJfQ0lEX0FVRElPX0xJTUlURVJfUkVMRUFTRV9USU1FICAgICAoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDY1KQotI2RlZmluZSBWNEwyX0NJRF9BVURJT19MSU1JVEVSX0RFVklBVElPTiAgICAgICAgKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyA2NikKLQotI2RlZmluZSBWNEwyX0NJRF9BVURJT19DT01QUkVTU0lPTl9FTkFCTEVEICAgICAgKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyA4MCkKLSNkZWZpbmUgVjRMMl9DSURfQVVESU9fQ09NUFJFU1NJT05fR0FJTiAgICAgICAgIChWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgODEpCi0jZGVmaW5lIFY0TDJfQ0lEX0FVRElPX0NPTVBSRVNTSU9OX1RIUkVTSE9MRCAgICAoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDgyKQotI2RlZmluZSBWNEwyX0NJRF9BVURJT19DT01QUkVTU0lPTl9BVFRBQ0tfVElNRSAgKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyA4MykKLSNkZWZpbmUgVjRMMl9DSURfQVVESU9fQ09NUFJFU1NJT05fUkVMRUFTRV9USU1FIChWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgODQpCi0KLSNkZWZpbmUgVjRMMl9DSURfUElMT1RfVE9ORV9FTkFCTEVEICAgICAgICAgICAgIChWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgOTYpCi0jZGVmaW5lIFY0TDJfQ0lEX1BJTE9UX1RPTkVfREVWSUFUSU9OICAgICAgICAgICAoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDk3KQotI2RlZmluZSBWNEwyX0NJRF9QSUxPVF9UT05FX0ZSRVFVRU5DWSAgICAgICAgICAgKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyA5OCkKLQotI2RlZmluZSBWNEwyX0NJRF9UVU5FX1BSRUVNUEhBU0lTICAgICAgICAgICAgICAgKFY0TDJfQ0lEX0ZNX1RYX0NMQVNTX0JBU0UgKyAxMTIpCi1lbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItcHJlZW1waGFzaXMiPnY0bDJfcHJlZW1waGFzaXM8L2xpbms+IHsKLSAgICAgICAgVjRMMl9QUkVFTVBIQVNJU19ESVNBQkxFRCAgICAgICA9IDAsCi0gICAgICAgIFY0TDJfUFJFRU1QSEFTSVNfNTBfdVMgICAgICAgICAgPSAxLAotICAgICAgICBWNEwyX1BSRUVNUEhBU0lTXzc1X3VTICAgICAgICAgID0gMiwKLX07Ci0jZGVmaW5lIFY0TDJfQ0lEX1RVTkVfUE9XRVJfTEVWRUwgICAgICAgICAgICAgICAoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDExMykKLSNkZWZpbmUgVjRMMl9DSURfVFVORV9BTlRFTk5BX0NBUEFDSVRPUiAgICAgICAgIChWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgMTE0KQotCi0vKgotICogICAgICBUIFUgTiBJIE4gRwotICovCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi10dW5lciI+djRsMl90dW5lcjwvbGluaz4gewotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICBpbmRleDsKLSAgICAgICAgX191OCAgICAgICAgICAgICAgICAgICAgbmFtZVszMl07Ci0gICAgICAgIGVudW0gPGxpbmsgbGlua2VuZD0idjRsMi10dW5lci10eXBlIj52NGwyX3R1bmVyX3R5cGU8L2xpbms+ICAgIHR5cGU7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIGNhcGFiaWxpdHk7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIHJhbmdlbG93OwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICByYW5nZWhpZ2g7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIHJ4c3ViY2hhbnM7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIGF1ZG1vZGU7Ci0gICAgICAgIF9fczMyICAgICAgICAgICAgICAgICAgIHNpZ25hbDsKLSAgICAgICAgX19zMzIgICAgICAgICAgICAgICAgICAgYWZjOwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICByZXNlcnZlZFs0XTsKLX07Ci0KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLW1vZHVsYXRvciI+djRsMl9tb2R1bGF0b3I8L2xpbms+IHsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgaW5kZXg7Ci0gICAgICAgIF9fdTggICAgICAgICAgICAgICAgICAgIG5hbWVbMzJdOwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICBjYXBhYmlsaXR5OwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICByYW5nZWxvdzsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgcmFuZ2VoaWdoOwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICB0eHN1YmNoYW5zOwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICByZXNlcnZlZFs0XTsKLX07Ci0KLS8qICBGbGFncyBmb3IgdGhlICdjYXBhYmlsaXR5JyBmaWVsZCAqLwotI2RlZmluZSBWNEwyX1RVTkVSX0NBUF9MT1cgICAgICAgICAgICAgIDB4MDAwMQotI2RlZmluZSBWNEwyX1RVTkVSX0NBUF9OT1JNICAgICAgICAgICAgIDB4MDAwMgotI2RlZmluZSBWNEwyX1RVTkVSX0NBUF9TVEVSRU8gICAgICAgICAgIDB4MDAxMAotI2RlZmluZSBWNEwyX1RVTkVSX0NBUF9MQU5HMiAgICAgICAgICAgIDB4MDAyMAotI2RlZmluZSBWNEwyX1RVTkVSX0NBUF9TQVAgICAgICAgICAgICAgIDB4MDAyMAotI2RlZmluZSBWNEwyX1RVTkVSX0NBUF9MQU5HMSAgICAgICAgICAgIDB4MDA0MAotI2RlZmluZSBWNEwyX1RVTkVSX0NBUF9SRFMgICAgICAgICAgICAgIDB4MDA4MAotI2RlZmluZSBWNEwyX1RVTkVSX0NBUF9SRFNfQkxPQ0tfSU8gICAgIDB4MDEwMAotI2RlZmluZSBWNEwyX1RVTkVSX0NBUF9SRFNfQ09OVFJPTFMgICAgIDB4MDIwMAotCi0vKiAgRmxhZ3MgZm9yIHRoZSAncnhzdWJjaGFucycgZmllbGQgKi8KLSNkZWZpbmUgVjRMMl9UVU5FUl9TVUJfTU9OTyAgICAgICAgICAgICAweDAwMDEKLSNkZWZpbmUgVjRMMl9UVU5FUl9TVUJfU1RFUkVPICAgICAgICAgICAweDAwMDIKLSNkZWZpbmUgVjRMMl9UVU5FUl9TVUJfTEFORzIgICAgICAgICAgICAweDAwMDQKLSNkZWZpbmUgVjRMMl9UVU5FUl9TVUJfU0FQICAgICAgICAgICAgICAweDAwMDQKLSNkZWZpbmUgVjRMMl9UVU5FUl9TVUJfTEFORzEgICAgICAgICAgICAweDAwMDgKLSNkZWZpbmUgVjRMMl9UVU5FUl9TVUJfUkRTICAgICAgICAgICAgICAweDAwMTAKLQotLyogIFZhbHVlcyBmb3IgdGhlICdhdWRtb2RlJyBmaWVsZCAqLwotI2RlZmluZSBWNEwyX1RVTkVSX01PREVfTU9OTyAgICAgICAgICAgIDB4MDAwMAotI2RlZmluZSBWNEwyX1RVTkVSX01PREVfU1RFUkVPICAgICAgICAgIDB4MDAwMQotI2RlZmluZSBWNEwyX1RVTkVSX01PREVfTEFORzIgICAgICAgICAgIDB4MDAwMgotI2RlZmluZSBWNEwyX1RVTkVSX01PREVfU0FQICAgICAgICAgICAgIDB4MDAwMgotI2RlZmluZSBWNEwyX1RVTkVSX01PREVfTEFORzEgICAgICAgICAgIDB4MDAwMwotI2RlZmluZSBWNEwyX1RVTkVSX01PREVfTEFORzFfTEFORzIgICAgIDB4MDAwNAotCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1mcmVxdWVuY3kiPnY0bDJfZnJlcXVlbmN5PC9saW5rPiB7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICB0dW5lcjsKLSAgICAgICAgZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLXR1bmVyLXR5cGUiPnY0bDJfdHVuZXJfdHlwZTwvbGluaz4gIHR5cGU7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICBmcmVxdWVuY3k7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICByZXNlcnZlZFs4XTsKLX07Ci0KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWh3LWZyZXEtc2VlayI+djRsMl9od19mcmVxX3NlZWs8L2xpbms+IHsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgIHR1bmVyOwotICAgICAgICBlbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItdHVuZXItdHlwZSI+djRsMl90dW5lcl90eXBlPC9saW5rPiAgdHlwZTsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgIHNlZWtfdXB3YXJkOwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgd3JhcF9hcm91bmQ7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICBzcGFjaW5nOwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgcmVzZXJ2ZWRbN107Ci19OwotCi0vKgotICogICAgICBSIEQgUwotICovCi0KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXJkcy1kYXRhIj52NGwyX3Jkc19kYXRhPC9saW5rPiB7Ci0gICAgICAgIF9fdTggICAgbHNiOwotICAgICAgICBfX3U4ICAgIG1zYjsKLSAgICAgICAgX191OCAgICBibG9jazsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0jZGVmaW5lIFY0TDJfUkRTX0JMT0NLX01TSyAgICAgICAweDcKLSNkZWZpbmUgVjRMMl9SRFNfQkxPQ0tfQSAgICAgICAgIDAKLSNkZWZpbmUgVjRMMl9SRFNfQkxPQ0tfQiAgICAgICAgIDEKLSNkZWZpbmUgVjRMMl9SRFNfQkxPQ0tfQyAgICAgICAgIDIKLSNkZWZpbmUgVjRMMl9SRFNfQkxPQ0tfRCAgICAgICAgIDMKLSNkZWZpbmUgVjRMMl9SRFNfQkxPQ0tfQ19BTFQgICAgIDQKLSNkZWZpbmUgVjRMMl9SRFNfQkxPQ0tfSU5WQUxJRCAgIDcKLQotI2RlZmluZSBWNEwyX1JEU19CTE9DS19DT1JSRUNURUQgMHg0MAotI2RlZmluZSBWNEwyX1JEU19CTE9DS19FUlJPUiAgICAgMHg4MAotCi0vKgotICogICAgICBBIFUgRCBJIE8KLSAqLwotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItYXVkaW8iPnY0bDJfYXVkaW88L2xpbms+IHsKLSAgICAgICAgX191MzIgICBpbmRleDsKLSAgICAgICAgX191OCAgICBuYW1lWzMyXTsKLSAgICAgICAgX191MzIgICBjYXBhYmlsaXR5OwotICAgICAgICBfX3UzMiAgIG1vZGU7Ci0gICAgICAgIF9fdTMyICAgcmVzZXJ2ZWRbMl07Ci19OwotCi0vKiAgRmxhZ3MgZm9yIHRoZSAnY2FwYWJpbGl0eScgZmllbGQgKi8KLSNkZWZpbmUgVjRMMl9BVURDQVBfU1RFUkVPICAgICAgICAgICAgICAweDAwMDAxCi0jZGVmaW5lIFY0TDJfQVVEQ0FQX0FWTCAgICAgICAgICAgICAgICAgMHgwMDAwMgotCi0vKiAgRmxhZ3MgZm9yIHRoZSAnbW9kZScgZmllbGQgKi8KLSNkZWZpbmUgVjRMMl9BVURNT0RFX0FWTCAgICAgICAgICAgICAgICAweDAwMDAxCi0KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWF1ZGlvb3V0Ij52NGwyX2F1ZGlvb3V0PC9saW5rPiB7Ci0gICAgICAgIF9fdTMyICAgaW5kZXg7Ci0gICAgICAgIF9fdTggICAgbmFtZVszMl07Ci0gICAgICAgIF9fdTMyICAgY2FwYWJpbGl0eTsKLSAgICAgICAgX191MzIgICBtb2RlOwotICAgICAgICBfX3UzMiAgIHJlc2VydmVkWzJdOwotfTsKLQotLyoKLSAqICAgICAgTSBQIEUgRyAgIFMgRSBSIFYgSSBDIEUgUwotICoKLSAqICAgICAgTk9URTogRVhQRVJJTUVOVEFMIEFQSQotICovCi0jaWYgMQotI2RlZmluZSBWNEwyX0VOQ19JRFhfRlJBTUVfSSAgICAoMCkKLSNkZWZpbmUgVjRMMl9FTkNfSURYX0ZSQU1FX1AgICAgKDEpCi0jZGVmaW5lIFY0TDJfRU5DX0lEWF9GUkFNRV9CICAgICgyKQotI2RlZmluZSBWNEwyX0VOQ19JRFhfRlJBTUVfTUFTSyAoMHhmKQotCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1lbmMtaWR4LWVudHJ5Ij52NGwyX2VuY19pZHhfZW50cnk8L2xpbms+IHsKLSAgICAgICAgX191NjQgb2Zmc2V0OwotICAgICAgICBfX3U2NCBwdHM7Ci0gICAgICAgIF9fdTMyIGxlbmd0aDsKLSAgICAgICAgX191MzIgZmxhZ3M7Ci0gICAgICAgIF9fdTMyIHJlc2VydmVkWzJdOwotfTsKLQotI2RlZmluZSBWNEwyX0VOQ19JRFhfRU5UUklFUyAoNjQpCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1lbmMtaWR4Ij52NGwyX2VuY19pZHg8L2xpbms+IHsKLSAgICAgICAgX191MzIgZW50cmllczsKLSAgICAgICAgX191MzIgZW50cmllc19jYXA7Ci0gICAgICAgIF9fdTMyIHJlc2VydmVkWzRdOwotICAgICAgICBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1lbmMtaWR4LWVudHJ5Ij52NGwyX2VuY19pZHhfZW50cnk8L2xpbms+IGVudHJ5W1Y0TDJfRU5DX0lEWF9FTlRSSUVTXTsKLX07Ci0KLQotI2RlZmluZSBWNEwyX0VOQ19DTURfU1RBUlQgICAgICAoMCkKLSNkZWZpbmUgVjRMMl9FTkNfQ01EX1NUT1AgICAgICAgKDEpCi0jZGVmaW5lIFY0TDJfRU5DX0NNRF9QQVVTRSAgICAgICgyKQotI2RlZmluZSBWNEwyX0VOQ19DTURfUkVTVU1FICAgICAoMykKLQotLyogRmxhZ3MgZm9yIFY0TDJfRU5DX0NNRF9TVE9QICovCi0jZGVmaW5lIFY0TDJfRU5DX0NNRF9TVE9QX0FUX0dPUF9FTkQgICAgKDEgJmx0OyZsdDsgMCkKLQotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZW5jb2Rlci1jbWQiPnY0bDJfZW5jb2Rlcl9jbWQ8L2xpbms+IHsKLSAgICAgICAgX191MzIgY21kOwotICAgICAgICBfX3UzMiBmbGFnczsKLSAgICAgICAgdW5pb24gewotICAgICAgICAgICAgICAgIHN0cnVjdCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBfX3UzMiBkYXRhWzhdOwotICAgICAgICAgICAgICAgIH0gcmF3OwotICAgICAgICB9OwotfTsKLQotI2VuZGlmCi0KLQotLyoKLSAqICAgICAgRCBBIFQgQSAgIFMgRSBSIFYgSSBDIEUgUyAgICggViBCIEkgKQotICoKLSAqICAgICAgRGF0YSBzZXJ2aWNlcyBBUEkgYnkgTWljaGFlbCBTY2hpbWVrCi0gKi8KLQotLyogUmF3IFZCSSAqLwotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItdmJpLWZvcm1hdCI+djRsMl92YmlfZm9ybWF0PC9saW5rPiB7Ci0gICAgICAgIF9fdTMyICAgc2FtcGxpbmdfcmF0ZTsgICAgICAgICAgLyogaW4gMSBIeiAqLwotICAgICAgICBfX3UzMiAgIG9mZnNldDsKLSAgICAgICAgX191MzIgICBzYW1wbGVzX3Blcl9saW5lOwotICAgICAgICBfX3UzMiAgIHNhbXBsZV9mb3JtYXQ7ICAgICAgICAgIC8qIFY0TDJfUElYX0ZNVF8qICovCi0gICAgICAgIF9fczMyICAgc3RhcnRbMl07Ci0gICAgICAgIF9fdTMyICAgY291bnRbMl07Ci0gICAgICAgIF9fdTMyICAgZmxhZ3M7ICAgICAgICAgICAgICAgICAgLyogVjRMMl9WQklfKiAqLwotICAgICAgICBfX3UzMiAgIHJlc2VydmVkWzJdOyAgICAgICAgICAgIC8qIG11c3QgYmUgemVybyAqLwotfTsKLQotLyogIFZCSSBmbGFncyAgKi8KLSNkZWZpbmUgVjRMMl9WQklfVU5TWU5DICAgICAgICAgKDEgJmx0OyZsdDsgMCkKLSNkZWZpbmUgVjRMMl9WQklfSU5URVJMQUNFRCAgICAgKDEgJmx0OyZsdDsgMSkKLQotLyogU2xpY2VkIFZCSQotICoKLSAqICAgIFRoaXMgaW1wbGVtZW50cyBpcyBhIHByb3Bvc2FsIFY0TDIgQVBJIHRvIGFsbG93IFNMSUNFRCBWQkkKLSAqIHJlcXVpcmVkIGZvciBzb21lIGhhcmR3YXJlIGVuY29kZXJzLiBJdCBzaG91bGQgY2hhbmdlIHdpdGhvdXQKLSAqIG5vdGljZSBpbiB0aGUgZGVmaW5pdGl2ZSBpbXBsZW1lbnRhdGlvbi4KLSAqLwotCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1zbGljZWQtdmJpLWZvcm1hdCI+djRsMl9zbGljZWRfdmJpX2Zvcm1hdDwvbGluaz4gewotICAgICAgICBfX3UxNiAgIHNlcnZpY2Vfc2V0OwotICAgICAgICAvKiBzZXJ2aWNlX2xpbmVzWzBdWy4uLl0gc3BlY2lmaWVzIGxpbmVzIDAtMjMgKDEtMjMgdXNlZCkgb2YgdGhlIGZpcnN0IGZpZWxkCi0gICAgICAgICAgIHNlcnZpY2VfbGluZXNbMV1bLi4uXSBzcGVjaWZpZXMgbGluZXMgMC0yMyAoMS0yMyB1c2VkKSBvZiB0aGUgc2Vjb25kIGZpZWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXF1YWxzIGZyYW1lIGxpbmVzIDMxMy0zMzYgZm9yIDYyNSBsaW5lIHZpZGVvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmRzLCAyNjMtMjg2IGZvciA1MjUgbGluZSBzdGFuZGFyZHMpICovCi0gICAgICAgIF9fdTE2ICAgc2VydmljZV9saW5lc1syXVsyNF07Ci0gICAgICAgIF9fdTMyICAgaW9fc2l6ZTsKLSAgICAgICAgX191MzIgICByZXNlcnZlZFsyXTsgICAgICAgICAgICAvKiBtdXN0IGJlIHplcm8gKi8KLX07Ci0KLS8qIFRlbGV0ZXh0IFdvcmxkIFN5c3RlbSBUZWxldGV4dAotICAgKFdTVCksIGRlZmluZWQgb24gSVRVLVIgQlQuNjUzLTIgKi8KLSNkZWZpbmUgVjRMMl9TTElDRURfVEVMRVRFWFRfQiAgICAgICAgICAoMHgwMDAxKQotLyogVmlkZW8gUHJvZ3JhbSBTeXN0ZW0sIGRlZmluZWQgb24gRVRTIDMwMCAyMzEqLwotI2RlZmluZSBWNEwyX1NMSUNFRF9WUFMgICAgICAgICAgICAgICAgICgweDA0MDApCi0vKiBDbG9zZWQgQ2FwdGlvbiwgZGVmaW5lZCBvbiBFSUEtNjA4ICovCi0jZGVmaW5lIFY0TDJfU0xJQ0VEX0NBUFRJT05fNTI1ICAgICAgICAgKDB4MTAwMCkKLS8qIFdpZGUgU2NyZWVuIFN5c3RlbSwgZGVmaW5lZCBvbiBJVFUtUiBCVDExMTkuMSAqLwotI2RlZmluZSBWNEwyX1NMSUNFRF9XU1NfNjI1ICAgICAgICAgICAgICgweDQwMDApCi0KLSNkZWZpbmUgVjRMMl9TTElDRURfVkJJXzUyNSAgICAgICAgICAgICAoVjRMMl9TTElDRURfQ0FQVElPTl81MjUpCi0jZGVmaW5lIFY0TDJfU0xJQ0VEX1ZCSV82MjUgICAgICAgICAgICAgKFY0TDJfU0xJQ0VEX1RFTEVURVhUX0IgfCBWNEwyX1NMSUNFRF9WUFMgfCBWNEwyX1NMSUNFRF9XU1NfNjI1KQotCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1zbGljZWQtdmJpLWNhcCI+djRsMl9zbGljZWRfdmJpX2NhcDwvbGluaz4gewotICAgICAgICBfX3UxNiAgIHNlcnZpY2Vfc2V0OwotICAgICAgICAvKiBzZXJ2aWNlX2xpbmVzWzBdWy4uLl0gc3BlY2lmaWVzIGxpbmVzIDAtMjMgKDEtMjMgdXNlZCkgb2YgdGhlIGZpcnN0IGZpZWxkCi0gICAgICAgICAgIHNlcnZpY2VfbGluZXNbMV1bLi4uXSBzcGVjaWZpZXMgbGluZXMgMC0yMyAoMS0yMyB1c2VkKSBvZiB0aGUgc2Vjb25kIGZpZWxkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXF1YWxzIGZyYW1lIGxpbmVzIDMxMy0zMzYgZm9yIDYyNSBsaW5lIHZpZGVvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmRzLCAyNjMtMjg2IGZvciA1MjUgbGluZSBzdGFuZGFyZHMpICovCi0gICAgICAgIF9fdTE2ICAgc2VydmljZV9saW5lc1syXVsyNF07Ci0gICAgICAgIGVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1idWYtdHlwZSI+djRsMl9idWZfdHlwZTwvbGluaz4gdHlwZTsKLSAgICAgICAgX191MzIgICByZXNlcnZlZFszXTsgICAgLyogbXVzdCBiZSAwICovCi19OwotCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1zbGljZWQtdmJpLWRhdGEiPnY0bDJfc2xpY2VkX3ZiaV9kYXRhPC9saW5rPiB7Ci0gICAgICAgIF9fdTMyICAgaWQ7Ci0gICAgICAgIF9fdTMyICAgZmllbGQ7ICAgICAgICAgIC8qIDA6IGZpcnN0IGZpZWxkLCAxOiBzZWNvbmQgZmllbGQgKi8KLSAgICAgICAgX191MzIgICBsaW5lOyAgICAgICAgICAgLyogMS0yMyAqLwotICAgICAgICBfX3UzMiAgIHJlc2VydmVkOyAgICAgICAvKiBtdXN0IGJlIDAgKi8KLSAgICAgICAgX191OCAgICBkYXRhWzQ4XTsKLX07Ci0KLS8qCi0gKiBTbGljZWQgVkJJIGRhdGEgaW5zZXJ0ZWQgaW50byBNUEVHIFN0cmVhbXMKLSAqLwotCi0vKgotICogVjRMMl9NUEVHX1NUUkVBTV9WQklfRk1UX0lWVFY6Ci0gKgotICogU3RydWN0dXJlIG9mIHBheWxvYWQgY29udGFpbmVkIGluIGFuIE1QRUcgMiBQcml2YXRlIFN0cmVhbSAxIFBFUyBQYWNrZXQgaW4gYW4KLSAqIE1QRUctMiBQcm9ncmFtIFBhY2sgdGhhdCBjb250YWlucyBWNEwyX01QRUdfU1RSRUFNX1ZCSV9GTVRfSVZUViBTbGljZWQgVkJJCi0gKiBkYXRhCi0gKgotICogTm90ZSwgdGhlIE1QRUctMiBQcm9ncmFtIFBhY2sgYW5kIFByaXZhdGUgU3RyZWFtIDEgUEVTIHBhY2tldCBoZWFkZXIKLSAqIGRlZmluaXRpb25zIGFyZSBub3QgaW5jbHVkZWQgaGVyZS4gIFNlZSB0aGUgTVBFRy0yIHNwZWNpZmljYXRpb25zIGZvciBkZXRhaWxzCi0gKiBvbiB0aGVzZSBoZWFkZXJzLgotICovCi0KLS8qIExpbmUgdHlwZSBJRHMgKi8KLSNkZWZpbmUgVjRMMl9NUEVHX1ZCSV9JVlRWX1RFTEVURVhUX0IgICAgICgxKQotI2RlZmluZSBWNEwyX01QRUdfVkJJX0lWVFZfQ0FQVElPTl81MjUgICAgKDQpCi0jZGVmaW5lIFY0TDJfTVBFR19WQklfSVZUVl9XU1NfNjI1ICAgICAgICAoNSkKLSNkZWZpbmUgVjRMMl9NUEVHX1ZCSV9JVlRWX1ZQUyAgICAgICAgICAgICg3KQotCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1tcGVnLXZiaS1pdHYwLWxpbmUiPnY0bDJfbXBlZ192YmlfaXR2MF9saW5lPC9saW5rPiB7Ci0gICAgICAgIF9fdTggaWQ7ICAgICAgICAvKiBPbmUgb2YgVjRMMl9NUEVHX1ZCSV9JVlRWXyogYWJvdmUgKi8KLSAgICAgICAgX191OCBkYXRhWzQyXTsgIC8qIFNsaWNlZCBWQkkgZGF0YSBmb3IgdGhlIGxpbmUgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1tcGVnLXZiaS1pdHYwIj52NGwyX21wZWdfdmJpX2l0djA8L2xpbms+IHsKLSAgICAgICAgX19sZTMyIGxpbmVtYXNrWzJdOyAvKiBCaXRtYXNrcyBvZiBWQkkgc2VydmljZSBsaW5lcyBwcmVzZW50ICovCi0gICAgICAgIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLW1wZWctdmJpLWl0djAtbGluZSI+djRsMl9tcGVnX3ZiaV9pdHYwX2xpbmU8L2xpbms+IGxpbmVbMzVdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLW1wZWctdmJpLWl0djAtMSI+djRsMl9tcGVnX3ZiaV9JVFYwPC9saW5rPiB7Ci0gICAgICAgIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLW1wZWctdmJpLWl0djAtbGluZSI+djRsMl9tcGVnX3ZiaV9pdHYwX2xpbmU8L2xpbms+IGxpbmVbMzZdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLSNkZWZpbmUgVjRMMl9NUEVHX1ZCSV9JVlRWX01BR0lDMCAgICAgICAiaXR2MCIKLSNkZWZpbmUgVjRMMl9NUEVHX1ZCSV9JVlRWX01BR0lDMSAgICAgICAiSVRWMCIKLQotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItbXBlZy12YmktZm10LWl2dHYiPnY0bDJfbXBlZ192YmlfZm10X2l2dHY8L2xpbms+IHsKLSAgICAgICAgX191OCBtYWdpY1s0XTsKLSAgICAgICAgdW5pb24gewotICAgICAgICAgICAgICAgIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLW1wZWctdmJpLWl0djAiPnY0bDJfbXBlZ192YmlfaXR2MDwvbGluaz4gaXR2MDsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1tcGVnLXZiaS1pdHYwLTEiPnY0bDJfbXBlZ192YmlfSVRWMDwvbGluaz4gSVRWMDsKLSAgICAgICAgfTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKgotICogICAgICBBIEcgRyBSIEUgRyBBIFQgRSAgIFMgVCBSIFUgQyBUIFUgUiBFIFMKLSAqLwotCi0vKioKLSAqIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXBsYW5lLXBpeC1mb3JtYXQiPnY0bDJfcGxhbmVfcGl4X2Zvcm1hdDwvbGluaz4gLSBhZGRpdGlvbmFsLCBwZXItcGxhbmUgZm9ybWF0IGRlZmluaXRpb24KLSAqIEBzaXplaW1hZ2U6ICAgICAgICAgIG1heGltdW0gc2l6ZSBpbiBieXRlcyByZXF1aXJlZCBmb3IgZGF0YSwgZm9yIHdoaWNoCi0gKiAgICAgICAgICAgICAgICAgICAgICB0aGlzIHBsYW5lIHdpbGwgYmUgdXNlZAotICogQGJ5dGVzcGVybGluZTogICAgICAgZGlzdGFuY2UgaW4gYnl0ZXMgYmV0d2VlbiB0aGUgbGVmdG1vc3QgcGl4ZWxzIGluIHR3bwotICogICAgICAgICAgICAgICAgICAgICAgYWRqYWNlbnQgbGluZXMKLSAqLwotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItcGxhbmUtcGl4LWZvcm1hdCI+djRsMl9wbGFuZV9waXhfZm9ybWF0PC9saW5rPiB7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICBzaXplaW1hZ2U7Ci0gICAgICAgIF9fdTE2ICAgICAgICAgICBieXRlc3BlcmxpbmU7Ci0gICAgICAgIF9fdTE2ICAgICAgICAgICByZXNlcnZlZFs3XTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKioKLSAqIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXBpeC1mb3JtYXQtbXBsYW5lIj52NGwyX3BpeF9mb3JtYXRfbXBsYW5lPC9saW5rPiAtIG11bHRpcGxhbmFyIGZvcm1hdCBkZWZpbml0aW9uCi0gKiBAd2lkdGg6ICAgICAgICAgICAgICBpbWFnZSB3aWR0aCBpbiBwaXhlbHMKLSAqIEBoZWlnaHQ6ICAgICAgICAgICAgIGltYWdlIGhlaWdodCBpbiBwaXhlbHMKLSAqIEBwaXhlbGZvcm1hdDogICAgICAgIGxpdHRsZSBlbmRpYW4gZm91ciBjaGFyYWN0ZXIgY29kZSAoZm91cmNjKQotICogQGZpZWxkOiAgICAgICAgICAgICAgZmllbGQgb3JkZXIgKGZvciBpbnRlcmxhY2VkIHZpZGVvKQotICogQGNvbG9yc3BhY2U6ICAgICAgICAgc3VwcGxlbWVudGFsIHRvIHBpeGVsZm9ybWF0Ci0gKiBAcGxhbmVfZm10OiAgICAgICAgICBwZXItcGxhbmUgaW5mb3JtYXRpb24KLSAqIEBudW1fcGxhbmVzOiAgICAgICAgIG51bWJlciBvZiBwbGFuZXMgZm9yIHRoaXMgZm9ybWF0Ci0gKi8KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXBpeC1mb3JtYXQtbXBsYW5lIj52NGwyX3BpeF9mb3JtYXRfbXBsYW5lPC9saW5rPiB7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg7Ci0gICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsZm9ybWF0OwotICAgICAgICBlbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItZmllbGQiPnY0bDJfZmllbGQ8L2xpbms+ICAgICAgICAgICAgICAgICBmaWVsZDsKLSAgICAgICAgZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLWNvbG9yc3BhY2UiPnY0bDJfY29sb3JzcGFjZTwvbGluaz4gICAgICAgICAgICBjb2xvcnNwYWNlOwotCi0gICAgICAgIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXBsYW5lLXBpeC1mb3JtYXQiPnY0bDJfcGxhbmVfcGl4X2Zvcm1hdDwvbGluaz4gICAgcGxhbmVfZm10W1ZJREVPX01BWF9QTEFORVNdOwotICAgICAgICBfX3U4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9wbGFuZXM7Ci0gICAgICAgIF9fdTggICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXJ2ZWRbMTFdOwotfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7Ci0KLS8qKgotICogc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZm9ybWF0Ij52NGwyX2Zvcm1hdDwvbGluaz4gLSBzdHJlYW0gZGF0YSBmb3JtYXQKLSAqIEB0eXBlOiAgICAgICB0eXBlIG9mIHRoZSBkYXRhIHN0cmVhbQotICogQHBpeDogICAgICAgIGRlZmluaXRpb24gb2YgYW4gaW1hZ2UgZm9ybWF0Ci0gKiBAcGl4X21wOiAgICAgZGVmaW5pdGlvbiBvZiBhIG11bHRpcGxhbmFyIGltYWdlIGZvcm1hdAotICogQHdpbjogICAgICAgIGRlZmluaXRpb24gb2YgYW4gb3ZlcmxhaWQgaW1hZ2UKLSAqIEB2Ymk6ICAgICAgICByYXcgVkJJIGNhcHR1cmUgb3Igb3V0cHV0IHBhcmFtZXRlcnMKLSAqIEBzbGljZWQ6ICAgICBzbGljZWQgVkJJIGNhcHR1cmUgb3Igb3V0cHV0IHBhcmFtZXRlcnMKLSAqIEByYXdfZGF0YTogICBwbGFjZWhvbGRlciBmb3IgZnV0dXJlIGV4dGVuc2lvbnMgYW5kIGN1c3RvbSBmb3JtYXRzCi0gKi8KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWZvcm1hdCI+djRsMl9mb3JtYXQ8L2xpbms+IHsKLSAgICAgICAgZW51bSA8bGluayBsaW5rZW5kPSJ2NGwyLWJ1Zi10eXBlIj52NGwyX2J1Zl90eXBlPC9saW5rPiB0eXBlOwotICAgICAgICB1bmlvbiB7Ci0gICAgICAgICAgICAgICAgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItcGl4LWZvcm1hdCI+djRsMl9waXhfZm9ybWF0PC9saW5rPiAgICAgICAgICBwaXg7ICAgICAvKiBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUgKi8KLSAgICAgICAgICAgICAgICBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1waXgtZm9ybWF0LW1wbGFuZSI+djRsMl9waXhfZm9ybWF0X21wbGFuZTwvbGluaz4gICBwaXhfbXA7ICAvKiBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FICovCi0gICAgICAgICAgICAgICAgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItd2luZG93Ij52NGwyX3dpbmRvdzwvbGluaz4gICAgICAgICAgICAgIHdpbjsgICAgIC8qIFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWSAqLwotICAgICAgICAgICAgICAgIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXZiaS1mb3JtYXQiPnY0bDJfdmJpX2Zvcm1hdDwvbGluaz4gICAgICAgICAgdmJpOyAgICAgLyogVjRMMl9CVUZfVFlQRV9WQklfQ0FQVFVSRSAqLwotICAgICAgICAgICAgICAgIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXNsaWNlZC12YmktZm9ybWF0Ij52NGwyX3NsaWNlZF92YmlfZm9ybWF0PC9saW5rPiAgIHNsaWNlZDsgIC8qIFY0TDJfQlVGX1RZUEVfU0xJQ0VEX1ZCSV9DQVBUVVJFICovCi0gICAgICAgICAgICAgICAgX191OCAgICByYXdfZGF0YVsyMDBdOyAgICAgICAgICAgICAgICAgICAvKiB1c2VyLWRlZmluZWQgKi8KLSAgICAgICAgfSBmbXQ7Ci19OwotCi0vKiAgICAgIFN0cmVhbSB0eXBlLWRlcGVuZGVudCBwYXJhbWV0ZXJzCi0gKi8KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXN0cmVhbXBhcm0iPnY0bDJfc3RyZWFtcGFybTwvbGluaz4gewotICAgICAgICBlbnVtIDxsaW5rIGxpbmtlbmQ9InY0bDItYnVmLXR5cGUiPnY0bDJfYnVmX3R5cGU8L2xpbms+IHR5cGU7Ci0gICAgICAgIHVuaW9uIHsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1jYXB0dXJlcGFybSI+djRsMl9jYXB0dXJlcGFybTwvbGluaz4gY2FwdHVyZTsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1vdXRwdXRwYXJtIj52NGwyX291dHB1dHBhcm08L2xpbms+ICBvdXRwdXQ7Ci0gICAgICAgICAgICAgICAgX191OCAgICByYXdfZGF0YVsyMDBdOyAgLyogdXNlci1kZWZpbmVkICovCi0gICAgICAgIH0gcGFybTsKLX07Ci0KLS8qCi0gKiAgICAgIEUgViBFIE4gVCBTCi0gKi8KLQotI2RlZmluZSBWNEwyX0VWRU5UX0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBWNEwyX0VWRU5UX1ZTWU5DICAgICAgICAgICAgICAgICAgICAgICAgMQotI2RlZmluZSBWNEwyX0VWRU5UX0VPUyAgICAgICAgICAgICAgICAgICAgICAgICAgMgotI2RlZmluZSBWNEwyX0VWRU5UX1BSSVZBVEVfU1RBUlQgICAgICAgICAgICAgICAgMHgwODAwMDAwMAotCi0vKiBQYXlsb2FkIGZvciBWNEwyX0VWRU5UX1ZTWU5DICovCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1ldmVudC12c3luYyI+djRsMl9ldmVudF92c3luYzwvbGluaz4gewotICAgICAgICAvKiBDYW4gYmUgVjRMMl9GSUVMRF9BTlksIF9OT05FLCBfVE9QIG9yIF9CT1RUT00gKi8KLSAgICAgICAgX191OCBmaWVsZDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1ldmVudCI+djRsMl9ldmVudDwvbGluaz4gewotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU7Ci0gICAgICAgIHVuaW9uIHsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1ldmVudC12c3luYyI+djRsMl9ldmVudF92c3luYzwvbGluaz4gdnN5bmM7Ci0gICAgICAgICAgICAgICAgX191OCAgICAgICAgICAgICAgICAgICAgZGF0YVs2NF07Ci0gICAgICAgIH0gdTsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nOwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcXVlbmNlOwotICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNlcnZlZFs5XTsKLX07Ci0KLXN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWV2ZW50LXN1YnNjcmlwdGlvbiI+djRsMl9ldmVudF9zdWJzY3JpcHRpb248L2xpbms+IHsKLSAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOwotICAgICAgICBfX3UzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2VydmVkWzddOwotfTsKLQotLyoKLSAqICAgICAgQSBEIFYgQSBOIEMgRSBEICAgRCBFIEIgVSBHIEcgSSBOIEcKLSAqCi0gKiAgICAgIE5PVEU6IEVYUEVSSU1FTlRBTCBBUEksIE5FVkVSIFJFTFkgT04gVEhJUyBJTiBBUFBMSUNBVElPTlMhCi0gKiAgICAgIEZPUiBERUJVR0dJTkcsIFRFU1RJTkcgQU5EIElOVEVSTkFMIFVTRSBPTkxZIQotICovCi0KLS8qIFZJRElPQ19EQkdfR19SRUdJU1RFUiBhbmQgVklESU9DX0RCR19TX1JFR0lTVEVSICovCi0KLSNkZWZpbmUgVjRMMl9DSElQX01BVENIX0hPU1QgICAgICAgMCAgLyogTWF0Y2ggYWdhaW5zdCBjaGlwIElEIG9uIGhvc3QgKDAgZm9yIHRoZSBob3N0KSAqLwotI2RlZmluZSBWNEwyX0NISVBfTUFUQ0hfSTJDX0RSSVZFUiAxICAvKiBNYXRjaCBhZ2FpbnN0IEkyQyBkcml2ZXIgbmFtZSAqLwotI2RlZmluZSBWNEwyX0NISVBfTUFUQ0hfSTJDX0FERFIgICAyICAvKiBNYXRjaCBhZ2FpbnN0IEkyQyA3LWJpdCBhZGRyZXNzICovCi0jZGVmaW5lIFY0TDJfQ0hJUF9NQVRDSF9BQzk3ICAgICAgIDMgIC8qIE1hdGNoIGFnYWluc3QgYW5jaWxpYXJ5IEFDOTcgY2hpcCAqLwotCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1kYmctbWF0Y2giPnY0bDJfZGJnX21hdGNoPC9saW5rPiB7Ci0gICAgICAgIF9fdTMyIHR5cGU7IC8qIE1hdGNoIHR5cGUgKi8KLSAgICAgICAgdW5pb24geyAgICAgLyogTWF0Y2ggdGhpcyBjaGlwLCBtZWFuaW5nIGRldGVybWluZWQgYnkgdHlwZSAqLwotICAgICAgICAgICAgICAgIF9fdTMyIGFkZHI7Ci0gICAgICAgICAgICAgICAgY2hhciBuYW1lWzMyXTsKLSAgICAgICAgfTsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi1zdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1kYmctcmVnaXN0ZXIiPnY0bDJfZGJnX3JlZ2lzdGVyPC9saW5rPiB7Ci0gICAgICAgIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWRiZy1tYXRjaCI+djRsMl9kYmdfbWF0Y2g8L2xpbms+IG1hdGNoOwotICAgICAgICBfX3UzMiBzaXplOyAgICAgLyogcmVnaXN0ZXIgc2l6ZSBpbiBieXRlcyAqLwotICAgICAgICBfX3U2NCByZWc7Ci0gICAgICAgIF9fdTY0IHZhbDsKLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKiBWSURJT0NfREJHX0dfQ0hJUF9JREVOVCAqLwotc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZGJnLWNoaXAtaWRlbnQiPnY0bDJfZGJnX2NoaXBfaWRlbnQ8L2xpbms+IHsKLSAgICAgICAgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZGJnLW1hdGNoIj52NGwyX2RiZ19tYXRjaDwvbGluaz4gbWF0Y2g7Ci0gICAgICAgIF9fdTMyIGlkZW50OyAgICAgICAvKiBjaGlwIGlkZW50aWZpZXIgYXMgc3BlY2lmaWVkIGluICZsdDttZWRpYS92NGwyLWNoaXAtaWRlbnQuaCZndDsgKi8KLSAgICAgICAgX191MzIgcmV2aXNpb247ICAgIC8qIGNoaXAgcmV2aXNpb24sIGNoaXAgc3BlY2lmaWMgKi8KLX0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwotCi0vKgotICogICAgICBJIE8gQyBUIEwgICBDIE8gRCBFIFMgICBGIE8gUiAgIFYgSSBEIEUgTyAgIEQgRSBWIEkgQyBFIFMKLSAqCi0gKi8KLSNkZWZpbmUgVklESU9DX1FVRVJZQ0FQICAgICAgICAgIF9JT1IoJ1YnLCAgMCwgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItY2FwYWJpbGl0eSI+djRsMl9jYXBhYmlsaXR5PC9saW5rPikKLSNkZWZpbmUgVklESU9DX1JFU0VSVkVEICAgICAgICAgICBfSU8oJ1YnLCAgMSkKLSNkZWZpbmUgVklESU9DX0VOVU1fRk1UICAgICAgICAgX0lPV1IoJ1YnLCAgMiwgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZm10ZGVzYyI+djRsMl9mbXRkZXNjPC9saW5rPikKLSNkZWZpbmUgVklESU9DX0dfRk1UICAgICAgICAgICAgX0lPV1IoJ1YnLCAgNCwgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZm9ybWF0Ij52NGwyX2Zvcm1hdDwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19TX0ZNVCAgICAgICAgICAgIF9JT1dSKCdWJywgIDUsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWZvcm1hdCI+djRsMl9mb3JtYXQ8L2xpbms+KQotI2RlZmluZSBWSURJT0NfUkVRQlVGUyAgICAgICAgICBfSU9XUignVicsICA4LCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1yZXF1ZXN0YnVmZmVycyI+djRsMl9yZXF1ZXN0YnVmZmVyczwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19RVUVSWUJVRiAgICAgICAgIF9JT1dSKCdWJywgIDksIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWJ1ZmZlciI+djRsMl9idWZmZXI8L2xpbms+KQotI2RlZmluZSBWSURJT0NfR19GQlVGICAgICAgICAgICAgX0lPUignVicsIDEwLCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1mcmFtZWJ1ZmZlciI+djRsMl9mcmFtZWJ1ZmZlcjwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19TX0ZCVUYgICAgICAgICAgICBfSU9XKCdWJywgMTEsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWZyYW1lYnVmZmVyIj52NGwyX2ZyYW1lYnVmZmVyPC9saW5rPikKLSNkZWZpbmUgVklESU9DX09WRVJMQVkgICAgICAgICAgIF9JT1coJ1YnLCAxNCwgaW50KQotI2RlZmluZSBWSURJT0NfUUJVRiAgICAgICAgICAgICBfSU9XUignVicsIDE1LCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1idWZmZXIiPnY0bDJfYnVmZmVyPC9saW5rPikKLSNkZWZpbmUgVklESU9DX0RRQlVGICAgICAgICAgICAgX0lPV1IoJ1YnLCAxNywgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItYnVmZmVyIj52NGwyX2J1ZmZlcjwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19TVFJFQU1PTiAgICAgICAgICBfSU9XKCdWJywgMTgsIGludCkKLSNkZWZpbmUgVklESU9DX1NUUkVBTU9GRiAgICAgICAgIF9JT1coJ1YnLCAxOSwgaW50KQotI2RlZmluZSBWSURJT0NfR19QQVJNICAgICAgICAgICBfSU9XUignVicsIDIxLCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1zdHJlYW1wYXJtIj52NGwyX3N0cmVhbXBhcm08L2xpbms+KQotI2RlZmluZSBWSURJT0NfU19QQVJNICAgICAgICAgICBfSU9XUignVicsIDIyLCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1zdHJlYW1wYXJtIj52NGwyX3N0cmVhbXBhcm08L2xpbms+KQotI2RlZmluZSBWSURJT0NfR19TVEQgICAgICAgICAgICAgX0lPUignVicsIDIzLCB2NGwyX3N0ZF9pZCkKLSNkZWZpbmUgVklESU9DX1NfU1REICAgICAgICAgICAgIF9JT1coJ1YnLCAyNCwgdjRsMl9zdGRfaWQpCi0jZGVmaW5lIFZJRElPQ19FTlVNU1REICAgICAgICAgIF9JT1dSKCdWJywgMjUsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXN0YW5kYXJkIj52NGwyX3N0YW5kYXJkPC9saW5rPikKLSNkZWZpbmUgVklESU9DX0VOVU1JTlBVVCAgICAgICAgX0lPV1IoJ1YnLCAyNiwgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItaW5wdXQiPnY0bDJfaW5wdXQ8L2xpbms+KQotI2RlZmluZSBWSURJT0NfR19DVFJMICAgICAgICAgICBfSU9XUignVicsIDI3LCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1jb250cm9sIj52NGwyX2NvbnRyb2w8L2xpbms+KQotI2RlZmluZSBWSURJT0NfU19DVFJMICAgICAgICAgICBfSU9XUignVicsIDI4LCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1jb250cm9sIj52NGwyX2NvbnRyb2w8L2xpbms+KQotI2RlZmluZSBWSURJT0NfR19UVU5FUiAgICAgICAgICBfSU9XUignVicsIDI5LCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi10dW5lciI+djRsMl90dW5lcjwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19TX1RVTkVSICAgICAgICAgICBfSU9XKCdWJywgMzAsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXR1bmVyIj52NGwyX3R1bmVyPC9saW5rPikKLSNkZWZpbmUgVklESU9DX0dfQVVESU8gICAgICAgICAgIF9JT1IoJ1YnLCAzMywgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItYXVkaW8iPnY0bDJfYXVkaW88L2xpbms+KQotI2RlZmluZSBWSURJT0NfU19BVURJTyAgICAgICAgICAgX0lPVygnVicsIDM0LCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1hdWRpbyI+djRsMl9hdWRpbzwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19RVUVSWUNUUkwgICAgICAgIF9JT1dSKCdWJywgMzYsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXF1ZXJ5Y3RybCI+djRsMl9xdWVyeWN0cmw8L2xpbms+KQotI2RlZmluZSBWSURJT0NfUVVFUllNRU5VICAgICAgICBfSU9XUignVicsIDM3LCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1xdWVyeW1lbnUiPnY0bDJfcXVlcnltZW51PC9saW5rPikKLSNkZWZpbmUgVklESU9DX0dfSU5QVVQgICAgICAgICAgIF9JT1IoJ1YnLCAzOCwgaW50KQotI2RlZmluZSBWSURJT0NfU19JTlBVVCAgICAgICAgICBfSU9XUignVicsIDM5LCBpbnQpCi0jZGVmaW5lIFZJRElPQ19HX09VVFBVVCAgICAgICAgICBfSU9SKCdWJywgNDYsIGludCkKLSNkZWZpbmUgVklESU9DX1NfT1VUUFVUICAgICAgICAgX0lPV1IoJ1YnLCA0NywgaW50KQotI2RlZmluZSBWSURJT0NfRU5VTU9VVFBVVCAgICAgICBfSU9XUignVicsIDQ4LCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1vdXRwdXQiPnY0bDJfb3V0cHV0PC9saW5rPikKLSNkZWZpbmUgVklESU9DX0dfQVVET1VUICAgICAgICAgIF9JT1IoJ1YnLCA0OSwgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItYXVkaW9vdXQiPnY0bDJfYXVkaW9vdXQ8L2xpbms+KQotI2RlZmluZSBWSURJT0NfU19BVURPVVQgICAgICAgICAgX0lPVygnVicsIDUwLCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1hdWRpb291dCI+djRsMl9hdWRpb291dDwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19HX01PRFVMQVRPUiAgICAgIF9JT1dSKCdWJywgNTQsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLW1vZHVsYXRvciI+djRsMl9tb2R1bGF0b3I8L2xpbms+KQotI2RlZmluZSBWSURJT0NfU19NT0RVTEFUT1IgICAgICAgX0lPVygnVicsIDU1LCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1tb2R1bGF0b3IiPnY0bDJfbW9kdWxhdG9yPC9saW5rPikKLSNkZWZpbmUgVklESU9DX0dfRlJFUVVFTkNZICAgICAgX0lPV1IoJ1YnLCA1Niwgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZnJlcXVlbmN5Ij52NGwyX2ZyZXF1ZW5jeTwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19TX0ZSRVFVRU5DWSAgICAgICBfSU9XKCdWJywgNTcsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWZyZXF1ZW5jeSI+djRsMl9mcmVxdWVuY3k8L2xpbms+KQotI2RlZmluZSBWSURJT0NfQ1JPUENBUCAgICAgICAgICBfSU9XUignVicsIDU4LCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1jcm9wY2FwIj52NGwyX2Nyb3BjYXA8L2xpbms+KQotI2RlZmluZSBWSURJT0NfR19DUk9QICAgICAgICAgICBfSU9XUignVicsIDU5LCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1jcm9wIj52NGwyX2Nyb3A8L2xpbms+KQotI2RlZmluZSBWSURJT0NfU19DUk9QICAgICAgICAgICAgX0lPVygnVicsIDYwLCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1jcm9wIj52NGwyX2Nyb3A8L2xpbms+KQotI2RlZmluZSBWSURJT0NfR19KUEVHQ09NUCAgICAgICAgX0lPUignVicsIDYxLCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1qcGVnY29tcHJlc3Npb24iPnY0bDJfanBlZ2NvbXByZXNzaW9uPC9saW5rPikKLSNkZWZpbmUgVklESU9DX1NfSlBFR0NPTVAgICAgICAgIF9JT1coJ1YnLCA2Miwgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItanBlZ2NvbXByZXNzaW9uIj52NGwyX2pwZWdjb21wcmVzc2lvbjwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19RVUVSWVNURCAgICAgICAgICBfSU9SKCdWJywgNjMsIHY0bDJfc3RkX2lkKQotI2RlZmluZSBWSURJT0NfVFJZX0ZNVCAgICAgICAgICBfSU9XUignVicsIDY0LCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1mb3JtYXQiPnY0bDJfZm9ybWF0PC9saW5rPikKLSNkZWZpbmUgVklESU9DX0VOVU1BVURJTyAgICAgICAgX0lPV1IoJ1YnLCA2NSwgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItYXVkaW8iPnY0bDJfYXVkaW88L2xpbms+KQotI2RlZmluZSBWSURJT0NfRU5VTUFVRE9VVCAgICAgICBfSU9XUignVicsIDY2LCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1hdWRpb291dCI+djRsMl9hdWRpb291dDwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19HX1BSSU9SSVRZICAgICAgICBfSU9SKCdWJywgNjcsIGVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1wcmlvcml0eSI+djRsMl9wcmlvcml0eTwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19TX1BSSU9SSVRZICAgICAgICBfSU9XKCdWJywgNjgsIGVudW0gPGxpbmsgbGlua2VuZD0idjRsMi1wcmlvcml0eSI+djRsMl9wcmlvcml0eTwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19HX1NMSUNFRF9WQklfQ0FQIF9JT1dSKCdWJywgNjksIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLXNsaWNlZC12YmktY2FwIj52NGwyX3NsaWNlZF92YmlfY2FwPC9saW5rPikKLSNkZWZpbmUgVklESU9DX0xPR19TVEFUVVMgICAgICAgICBfSU8oJ1YnLCA3MCkKLSNkZWZpbmUgVklESU9DX0dfRVhUX0NUUkxTICAgICAgX0lPV1IoJ1YnLCA3MSwgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZXh0LWNvbnRyb2xzIj52NGwyX2V4dF9jb250cm9sczwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19TX0VYVF9DVFJMUyAgICAgIF9JT1dSKCdWJywgNzIsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWV4dC1jb250cm9scyI+djRsMl9leHRfY29udHJvbHM8L2xpbms+KQotI2RlZmluZSBWSURJT0NfVFJZX0VYVF9DVFJMUyAgICBfSU9XUignVicsIDczLCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1leHQtY29udHJvbHMiPnY0bDJfZXh0X2NvbnRyb2xzPC9saW5rPikKLSNpZiAxCi0jZGVmaW5lIFZJRElPQ19FTlVNX0ZSQU1FU0laRVMgIF9JT1dSKCdWJywgNzQsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWZybXNpemVlbnVtIj52NGwyX2ZybXNpemVlbnVtPC9saW5rPikKLSNkZWZpbmUgVklESU9DX0VOVU1fRlJBTUVJTlRFUlZBTFMgX0lPV1IoJ1YnLCA3NSwgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZnJtaXZhbGVudW0iPnY0bDJfZnJtaXZhbGVudW08L2xpbms+KQotI2RlZmluZSBWSURJT0NfR19FTkNfSU5ERVggICAgICAgX0lPUignVicsIDc2LCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1lbmMtaWR4Ij52NGwyX2VuY19pZHg8L2xpbms+KQotI2RlZmluZSBWSURJT0NfRU5DT0RFUl9DTUQgICAgICBfSU9XUignVicsIDc3LCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1lbmNvZGVyLWNtZCI+djRsMl9lbmNvZGVyX2NtZDwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19UUllfRU5DT0RFUl9DTUQgIF9JT1dSKCdWJywgNzgsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWVuY29kZXItY21kIj52NGwyX2VuY29kZXJfY21kPC9saW5rPikKLSNlbmRpZgotCi0jaWYgMQotLyogRXhwZXJpbWVudGFsLCBtZWFudCBmb3IgZGVidWdnaW5nLCB0ZXN0aW5nIGFuZCBpbnRlcm5hbCB1c2UuCi0gICBPbmx5IGltcGxlbWVudGVkIGlmIENPTkZJR19WSURFT19BRFZfREVCVUcgaXMgZGVmaW5lZC4KLSAgIFlvdSBtdXN0IGJlIHJvb3QgdG8gdXNlIHRoZXNlIGlvY3Rscy4gTmV2ZXIgdXNlIHRoZXNlIGluIGFwcGxpY2F0aW9ucyEgKi8KLSNkZWZpbmUgVklESU9DX0RCR19TX1JFR0lTVEVSICAgIF9JT1coJ1YnLCA3OSwgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZGJnLXJlZ2lzdGVyIj52NGwyX2RiZ19yZWdpc3RlcjwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19EQkdfR19SRUdJU1RFUiAgIF9JT1dSKCdWJywgODAsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWRiZy1yZWdpc3RlciI+djRsMl9kYmdfcmVnaXN0ZXI8L2xpbms+KQotCi0vKiBFeHBlcmltZW50YWwsIG1lYW50IGZvciBkZWJ1Z2dpbmcsIHRlc3RpbmcgYW5kIGludGVybmFsIHVzZS4KLSAgIE5ldmVyIHVzZSB0aGlzIGlvY3RsIGluIGFwcGxpY2F0aW9ucyEgKi8KLSNkZWZpbmUgVklESU9DX0RCR19HX0NISVBfSURFTlQgX0lPV1IoJ1YnLCA4MSwgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZGJnLWNoaXAtaWRlbnQiPnY0bDJfZGJnX2NoaXBfaWRlbnQ8L2xpbms+KQotI2VuZGlmCi0KLSNkZWZpbmUgVklESU9DX1NfSFdfRlJFUV9TRUVLICAgIF9JT1coJ1YnLCA4Miwgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItaHctZnJlcS1zZWVrIj52NGwyX2h3X2ZyZXFfc2VlazwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19FTlVNX0RWX1BSRVNFVFMgIF9JT1dSKCdWJywgODMsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWR2LWVudW0tcHJlc2V0Ij52NGwyX2R2X2VudW1fcHJlc2V0PC9saW5rPikKLSNkZWZpbmUgVklESU9DX1NfRFZfUFJFU0VUICAgICAgX0lPV1IoJ1YnLCA4NCwgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZHYtcHJlc2V0Ij52NGwyX2R2X3ByZXNldDwvbGluaz4pCi0jZGVmaW5lIFZJRElPQ19HX0RWX1BSRVNFVCAgICAgIF9JT1dSKCdWJywgODUsIHN0cnVjdCA8bGluayBsaW5rZW5kPSJ2NGwyLWR2LXByZXNldCI+djRsMl9kdl9wcmVzZXQ8L2xpbms+KQotI2RlZmluZSBWSURJT0NfUVVFUllfRFZfUFJFU0VUICBfSU9SKCdWJywgIDg2LCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1kdi1wcmVzZXQiPnY0bDJfZHZfcHJlc2V0PC9saW5rPikKLSNkZWZpbmUgVklESU9DX1NfRFZfVElNSU5HUyAgICAgX0lPV1IoJ1YnLCA4Nywgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZHYtdGltaW5ncyI+djRsMl9kdl90aW1pbmdzPC9saW5rPikKLSNkZWZpbmUgVklESU9DX0dfRFZfVElNSU5HUyAgICAgX0lPV1IoJ1YnLCA4OCwgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZHYtdGltaW5ncyI+djRsMl9kdl90aW1pbmdzPC9saW5rPikKLSNkZWZpbmUgVklESU9DX0RRRVZFTlQgICAgICAgICAgIF9JT1IoJ1YnLCA4OSwgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZXZlbnQiPnY0bDJfZXZlbnQ8L2xpbms+KQotI2RlZmluZSBWSURJT0NfU1VCU0NSSUJFX0VWRU5UICAgX0lPVygnVicsIDkwLCBzdHJ1Y3QgPGxpbmsgbGlua2VuZD0idjRsMi1ldmVudC1zdWJzY3JpcHRpb24iPnY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uPC9saW5rPikKLSNkZWZpbmUgVklESU9DX1VOU1VCU0NSSUJFX0VWRU5UIF9JT1coJ1YnLCA5MSwgc3RydWN0IDxsaW5rIGxpbmtlbmQ9InY0bDItZXZlbnQtc3Vic2NyaXB0aW9uIj52NGwyX2V2ZW50X3N1YnNjcmlwdGlvbjwvbGluaz4pCi0KLS8qIFJlbWluZGVyOiB3aGVuIGFkZGluZyBuZXcgaW9jdGxzIHBsZWFzZSBhZGQgc3VwcG9ydCBmb3IgdGhlbSB0bwotICAgZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWNvbXBhdC1pb2N0bDMyLmMgYXMgd2VsbCEgKi8KLQotI2RlZmluZSBCQVNFX1ZJRElPQ19QUklWQVRFICAgICAxOTIgICAgICAgICAgICAgLyogMTkyLTI1NSBhcmUgcHJpdmF0ZSAqLwotCi0jZW5kaWYgLyogX19MSU5VWF9WSURFT0RFVjJfSCAqLwotPC9wcm9ncmFtbGlzdGluZz4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXN1YnNjcmliZS1ldmVudC54bWwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdjRsL3ZpZGlvYy1zdWJzY3JpYmUtZXZlbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjUwMTc5Li4wMDAwMDAwCi0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay92NGwvdmlkaW9jLXN1YnNjcmliZS1ldmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotPHJlZmVudHJ5IGlkPSJ2aWRpb2Mtc3Vic2NyaWJlLWV2ZW50Ij4KLSAgPHJlZm1ldGE+Ci0gICAgPHJlZmVudHJ5dGl0bGU+aW9jdGwgVklESU9DX1NVQlNDUklCRV9FVkVOVCwgVklESU9DX1VOU1VCU0NSSUJFX0VWRU5UPC9yZWZlbnRyeXRpdGxlPgotICAgICZtYW52b2w7Ci0gIDwvcmVmbWV0YT4KLQotICA8cmVmbmFtZWRpdj4KLSAgICA8cmVmbmFtZT5WSURJT0NfU1VCU0NSSUJFX0VWRU5ULCBWSURJT0NfVU5TVUJTQ1JJQkVfRVZFTlQ8L3JlZm5hbWU+Ci0gICAgPHJlZnB1cnBvc2U+U3Vic2NyaWJlIG9yIHVuc3Vic2NyaWJlIGV2ZW50PC9yZWZwdXJwb3NlPgotICA8L3JlZm5hbWVkaXY+Ci0KLSAgPHJlZnN5bm9wc2lzZGl2PgotICAgIDxmdW5jc3lub3BzaXM+Ci0gICAgICA8ZnVuY3Byb3RvdHlwZT4KLQk8ZnVuY2RlZj5pbnQgPGZ1bmN0aW9uPmlvY3RsPC9mdW5jdGlvbj48L2Z1bmNkZWY+Ci0JPHBhcmFtZGVmPmludCA8cGFyYW1ldGVyPmZkPC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj4KLQk8cGFyYW1kZWY+aW50IDxwYXJhbWV0ZXI+cmVxdWVzdDwvcGFyYW1ldGVyPjwvcGFyYW1kZWY+Ci0JPHBhcmFtZGVmPnN0cnVjdCB2NGwyX2V2ZW50X3N1YnNjcmlwdGlvbgotKjxwYXJhbWV0ZXI+YXJncDwvcGFyYW1ldGVyPjwvcGFyYW1kZWY+Ci0gICAgICA8L2Z1bmNwcm90b3R5cGU+Ci0gICAgPC9mdW5jc3lub3BzaXM+Ci0gIDwvcmVmc3lub3BzaXNkaXY+Ci0KLSAgPHJlZnNlY3QxPgotICAgIDx0aXRsZT5Bcmd1bWVudHM8L3RpdGxlPgotCi0gICAgPHZhcmlhYmxlbGlzdD4KLSAgICAgIDx2YXJsaXN0ZW50cnk+Ci0JPHRlcm0+PHBhcmFtZXRlcj5mZDwvcGFyYW1ldGVyPjwvdGVybT4KLQk8bGlzdGl0ZW0+Ci0JICA8cGFyYT4mZmQ7PC9wYXJhPgotCTwvbGlzdGl0ZW0+Ci0gICAgICA8L3Zhcmxpc3RlbnRyeT4KLSAgICAgIDx2YXJsaXN0ZW50cnk+Ci0JPHRlcm0+PHBhcmFtZXRlcj5yZXF1ZXN0PC9wYXJhbWV0ZXI+PC90ZXJtPgotCTxsaXN0aXRlbT4KLQkgIDxwYXJhPlZJRElPQ19TVUJTQ1JJQkVfRVZFTlQsIFZJRElPQ19VTlNVQlNDUklCRV9FVkVOVDwvcGFyYT4KLQk8L2xpc3RpdGVtPgotICAgICAgPC92YXJsaXN0ZW50cnk+Ci0gICAgICA8dmFybGlzdGVudHJ5PgotCTx0ZXJtPjxwYXJhbWV0ZXI+YXJncDwvcGFyYW1ldGVyPjwvdGVybT4KLQk8bGlzdGl0ZW0+Ci0JICA8cGFyYT48L3BhcmE+Ci0JPC9saXN0aXRlbT4KLSAgICAgIDwvdmFybGlzdGVudHJ5PgotICAgIDwvdmFyaWFibGVsaXN0PgotICA8L3JlZnNlY3QxPgotCi0gIDxyZWZzZWN0MT4KLSAgICA8dGl0bGU+RGVzY3JpcHRpb248L3RpdGxlPgotCi0gICAgPHBhcmE+U3Vic2NyaWJlIG9yIHVuc3Vic2NyaWJlIFY0TDIgZXZlbnQuIFN1YnNjcmliZWQgZXZlbnRzIGFyZQotICAgIGRlcXVldWVkIGJ5IHVzaW5nIHRoZSAmVklESU9DLURRRVZFTlQ7IGlvY3RsLjwvcGFyYT4KLQotICAgIDx0YWJsZSBmcmFtZT0ibm9uZSIgcGd3aWRlPSIxIiBpZD0idjRsMi1ldmVudC1zdWJzY3JpcHRpb24iPgotICAgICAgPHRpdGxlPnN0cnVjdCA8c3RydWN0bmFtZT52NGwyX2V2ZW50X3N1YnNjcmlwdGlvbjwvc3RydWN0bmFtZT48L3RpdGxlPgotICAgICAgPHRncm91cCBjb2xzPSIzIj4KLQkmY3Mtc3RyOwotCTx0Ym9keSB2YWxpZ249InRvcCI+Ci0JICA8cm93PgotCSAgICA8ZW50cnk+X191MzI8L2VudHJ5PgotCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPnR5cGU8L3N0cnVjdGZpZWxkPjwvZW50cnk+Ci0JICAgIDxlbnRyeT5UeXBlIG9mIHRoZSBldmVudC48L2VudHJ5PgotCSAgPC9yb3c+Ci0JICA8cm93PgotCSAgICA8ZW50cnk+X191MzI8L2VudHJ5PgotCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPnJlc2VydmVkPC9zdHJ1Y3RmaWVsZD5bN108L2VudHJ5PgotCSAgICA8ZW50cnk+UmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHRlbnNpb25zLiBEcml2ZXJzIGFuZCBhcHBsaWNhdGlvbnMKLQkgICAgbXVzdCBzZXQgdGhlIGFycmF5IHRvIHplcm8uPC9lbnRyeT4KLQkgIDwvcm93PgotCTwvdGJvZHk+Ci0gICAgICA8L3Rncm91cD4KLSAgICA8L3RhYmxlPgotCi0gICAgPHRhYmxlIGZyYW1lPSJub25lIiBwZ3dpZGU9IjEiIGlkPSJldmVudC10eXBlIj4KLSAgICAgIDx0aXRsZT5FdmVudCBUeXBlczwvdGl0bGU+Ci0gICAgICA8dGdyb3VwIGNvbHM9IjMiPgotCSZjcy1kZWY7Ci0JPHRib2R5IHZhbGlnbj0idG9wIj4KLQkgIDxyb3c+Ci0JICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9FVkVOVF9BTEw8L2NvbnN0YW50PjwvZW50cnk+Ci0JICAgIDxlbnRyeT4wPC9lbnRyeT4KLQkgICAgPGVudHJ5PkFsbCBldmVudHMuIFY0TDJfRVZFTlRfQUxMIGlzIHZhbGlkIG9ubHkgZm9yCi0JICAgIFZJRElPQ19VTlNVQlNDUklCRV9FVkVOVCBmb3IgdW5zdWJzY3JpYmluZyBhbGwgZXZlbnRzIGF0IG9uY2UuCi0JICAgIDwvZW50cnk+Ci0JICA8L3Jvdz4KLQkgIDxyb3c+Ci0JICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9FVkVOVF9WU1lOQzwvY29uc3RhbnQ+PC9lbnRyeT4KLQkgICAgPGVudHJ5PjE8L2VudHJ5PgotCSAgICA8ZW50cnk+VGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgb24gdGhlIHZlcnRpY2FsIHN5bmMuCi0JICAgIFRoaXMgZXZlbnQgaGFzICZ2NGwyLWV2ZW50LXZzeW5jOyBhc3NvY2lhdGVkIHdpdGggaXQuCi0JICAgIDwvZW50cnk+Ci0JICA8L3Jvdz4KLQkgIDxyb3c+Ci0JICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9FVkVOVF9FT1M8L2NvbnN0YW50PjwvZW50cnk+Ci0JICAgIDxlbnRyeT4yPC9lbnRyeT4KLQkgICAgPGVudHJ5PlRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIGVuZCBvZiBhIHN0cmVhbSBpcyByZWFjaGVkLgotCSAgICBUaGlzIGlzIHR5cGljYWxseSB1c2VkIHdpdGggTVBFRyBkZWNvZGVycyB0byByZXBvcnQgdG8gdGhlIGFwcGxpY2F0aW9uCi0JICAgIHdoZW4gdGhlIGxhc3Qgb2YgdGhlIE1QRUcgc3RyZWFtIGhhcyBiZWVuIGRlY29kZWQuCi0JICAgIDwvZW50cnk+Ci0JICA8L3Jvdz4KLQkgIDxyb3c+Ci0JICAgIDxlbnRyeT48Y29uc3RhbnQ+VjRMMl9FVkVOVF9QUklWQVRFX1NUQVJUPC9jb25zdGFudD48L2VudHJ5PgotCSAgICA8ZW50cnk+MHgwODAwMDAwMDwvZW50cnk+Ci0JICAgIDxlbnRyeT5CYXNlIGV2ZW50IG51bWJlciBmb3IgZHJpdmVyLXByaXZhdGUgZXZlbnRzLjwvZW50cnk+Ci0JICA8L3Jvdz4KLQk8L3Rib2R5PgotICAgICAgPC90Z3JvdXA+Ci0gICAgPC90YWJsZT4KLQotICAgIDx0YWJsZSBmcmFtZT0ibm9uZSIgcGd3aWRlPSIxIiBpZD0idjRsMi1ldmVudC12c3luYyI+Ci0gICAgICA8dGl0bGU+c3RydWN0IDxzdHJ1Y3RuYW1lPnY0bDJfZXZlbnRfdnN5bmM8L3N0cnVjdG5hbWU+PC90aXRsZT4KLSAgICAgIDx0Z3JvdXAgY29scz0iMyI+Ci0JJmNzLXN0cjsKLQk8dGJvZHkgdmFsaWduPSJ0b3AiPgotCSAgPHJvdz4KLQkgICAgPGVudHJ5Pl9fdTg8L2VudHJ5PgotCSAgICA8ZW50cnk+PHN0cnVjdGZpZWxkPmZpZWxkPC9zdHJ1Y3RmaWVsZD48L2VudHJ5PgotCSAgICA8ZW50cnk+VGhlIHVwY29taW5nIGZpZWxkLiBTZWUgJnY0bDItZmllbGQ7LjwvZW50cnk+Ci0JICA8L3Jvdz4KLQk8L3Rib2R5PgotICAgICAgPC90Z3JvdXA+Ci0gICAgPC90YWJsZT4KLQotICA8L3JlZnNlY3QxPgotPC9yZWZlbnRyeT4KLTwhLS0KLUxvY2FsIFZhcmlhYmxlczoKLW1vZGU6IHNnbWwKLXNnbWwtcGFyZW50LWRvY3VtZW50OiAidjRsMi5zZ21sIgotaW5kZW50LXRhYnMtbW9kZTogbmlsCi1FbmQ6Ci0tLT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWNwaS9hcGVpL2VpbmoudHh0IGIvRG9jdW1lbnRhdGlvbi9hY3BpL2FwZWkvZWluai50eHQKaW5kZXggZGZhYjcxOC4uNWNjNjk5YiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9hY3BpL2FwZWkvZWluai50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9hY3BpL2FwZWkvZWluai50eHQKQEAgLTQ4LDEyICs0OCwxOSBAQAogLSBwYXJhbTEKICAgVGhpcyBmaWxlIGlzIHVzZWQgdG8gc2V0IHRoZSBmaXJzdCBlcnJvciBwYXJhbWV0ZXIgdmFsdWUuIEVmZmVjdCBvZgogICBwYXJhbWV0ZXIgZGVwZW5kcyBvbiBlcnJvcl90eXBlIHNwZWNpZmllZC4gRm9yIG1lbW9yeSBlcnJvciwgdGhpcyBpcwotICBwaHlzaWNhbCBtZW1vcnkgYWRkcmVzcy4KKyAgcGh5c2ljYWwgbWVtb3J5IGFkZHJlc3MuICBPbmx5IGF2YWlsYWJsZSBpZiBwYXJhbV9leHRlbnNpb24gbW9kdWxlCisgIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQuCiAKIC0gcGFyYW0yCiAgIFRoaXMgZmlsZSBpcyB1c2VkIHRvIHNldCB0aGUgc2Vjb25kIGVycm9yIHBhcmFtZXRlciB2YWx1ZS4gRWZmZWN0IG9mCiAgIHBhcmFtZXRlciBkZXBlbmRzIG9uIGVycm9yX3R5cGUgc3BlY2lmaWVkLiBGb3IgbWVtb3J5IGVycm9yLCB0aGlzIGlzCi0gIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzIG1hc2suCisgIHBoeXNpY2FsIG1lbW9yeSBhZGRyZXNzIG1hc2suICBPbmx5IGF2YWlsYWJsZSBpZiBwYXJhbV9leHRlbnNpb24KKyAgbW9kdWxlIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQuCisKK0luamVjdGluZyBwYXJhbWV0ZXIgc3VwcG9ydCBpcyBhIEJJT1MgdmVyc2lvbiBzcGVjaWZpYyBleHRlbnNpb24sIHRoYXQKK2lzLCBpdCBvbmx5IHdvcmtzIG9uIHNvbWUgQklPUyB2ZXJzaW9uLiAgSWYgeW91IHdhbnQgdG8gdXNlIGl0LCBwbGVhc2UKK21ha2Ugc3VyZSB5b3VyIEJJT1MgdmVyc2lvbiBoYXMgdGhlIHByb3BlciBzdXBwb3J0IGFuZCBzcGVjaWZ5CisicGFyYW1fZXh0ZW5zaW9uPXkiIGluIG1vZHVsZSBwYXJhbWV0ZXIuCiAKIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IEVJTkosIHBsZWFzZSByZWZlciB0byBBQ1BJIHNwZWNpZmljYXRpb24KIHZlcnNpb24gNC4wLCBzZWN0aW9uIDE3LjUuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZS1tYXBwZXIvZG0tY3J5cHQudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2UtbWFwcGVyL2RtLWNyeXB0LnR4dAppbmRleCA2YjVjNDJkLi4yYzY1NmFlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZS1tYXBwZXIvZG0tY3J5cHQudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNlLW1hcHBlci9kbS1jcnlwdC50eHQKQEAgLTQsNyArNCw4IEBACiBEZXZpY2UtTWFwcGVyJ3MgImNyeXB0IiB0YXJnZXQgcHJvdmlkZXMgdHJhbnNwYXJlbnQgZW5jcnlwdGlvbiBvZiBibG9jayBkZXZpY2VzCiB1c2luZyB0aGUga2VybmVsIGNyeXB0byBBUEkuCiAKLVBhcmFtZXRlcnM6IDxjaXBoZXI+IDxrZXk+IDxpdl9vZmZzZXQ+IDxkZXZpY2UgcGF0aD4gPG9mZnNldD4KK1BhcmFtZXRlcnM6IDxjaXBoZXI+IDxrZXk+IDxpdl9vZmZzZXQ+IDxkZXZpY2UgcGF0aD4gXAorCSAgICAgIDxvZmZzZXQ+IFs8I29wdF9wYXJhbXM+IDxvcHRfcGFyYW1zPl0KIAogPGNpcGhlcj4KICAgICBFbmNyeXB0aW9uIGNpcGhlciBhbmQgYW4gb3B0aW9uYWwgSVYgZ2VuZXJhdGlvbiBtb2RlLgpAQCAtMzcsNiArMzgsMjQgQEAKIDxvZmZzZXQ+CiAgICAgU3RhcnRpbmcgc2VjdG9yIHdpdGhpbiB0aGUgZGV2aWNlIHdoZXJlIHRoZSBlbmNyeXB0ZWQgZGF0YSBiZWdpbnMuCiAKKzwjb3B0X3BhcmFtcz4KKyAgICBOdW1iZXIgb2Ygb3B0aW9uYWwgcGFyYW1ldGVycy4gSWYgdGhlcmUgYXJlIG5vIG9wdGlvbmFsIHBhcmFtZXRlcnMsCisgICAgdGhlIG9wdGlvbmFsIHBhcmFtYXRlcnMgc2VjdGlvbiBjYW4gYmUgc2tpcHBlZCBvciAjb3B0X3BhcmFtcyBjYW4gYmUgemVyby4KKyAgICBPdGhlcndpc2UgI29wdF9wYXJhbXMgaXMgdGhlIG51bWJlciBvZiBmb2xsb3dpbmcgYXJndW1lbnRzLgorCisgICAgRXhhbXBsZSBvZiBvcHRpb25hbCBwYXJhbWV0ZXJzIHNlY3Rpb246CisgICAgICAgIDEgYWxsb3dfZGlzY2FyZHMKKworYWxsb3dfZGlzY2FyZHMKKyAgICBCbG9jayBkaXNjYXJkIHJlcXVlc3RzIChhLmsuYS4gVFJJTSkgYXJlIHBhc3NlZCB0aHJvdWdoIHRoZSBjcnlwdCBkZXZpY2UuCisgICAgVGhlIGRlZmF1bHQgaXMgdG8gaWdub3JlIGRpc2NhcmQgcmVxdWVzdHMuCisKKyAgICBXQVJOSU5HOiBBc3Nlc3MgdGhlIHNwZWNpZmljIHNlY3VyaXR5IHJpc2tzIGNhcmVmdWxseSBiZWZvcmUgZW5hYmxpbmcgdGhpcworICAgIG9wdGlvbi4gIEZvciBleGFtcGxlLCBhbGxvd2luZyBkaXNjYXJkcyBvbiBlbmNyeXB0ZWQgZGV2aWNlcyBtYXkgbGVhZCB0bworICAgIHRoZSBsZWFrIG9mIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjaXBoZXJ0ZXh0IGRldmljZSAoZmlsZXN5c3RlbSB0eXBlLAorICAgIHVzZWQgc3BhY2UgZXRjLikgaWYgdGhlIGRpc2NhcmRlZCBibG9ja3MgY2FuIGJlIGxvY2F0ZWQgZWFzaWx5IG9uIHRoZQorICAgIGRldmljZSBsYXRlci4KKwogRXhhbXBsZSBzY3JpcHRzCiA9PT09PT09PT09PT09PT0KIExVS1MgKExpbnV4IFVuaWZpZWQgS2V5IFNldHVwKSBpcyBub3cgdGhlIHByZWZlcnJlZCB3YXkgdG8gc2V0IHVwIGRpc2sKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNlLW1hcHBlci9kbS1mbGFrZXkudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2UtbWFwcGVyL2RtLWZsYWtleS50eHQKaW5kZXggYzhlZmRmZC4uNmZmNWMyMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9kZXZpY2UtbWFwcGVyL2RtLWZsYWtleS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2UtbWFwcGVyL2RtLWZsYWtleS50eHQKQEAgLTEsMTcgKzEsNTMgQEAKIGRtLWZsYWtleQogPT09PT09PT09CiAKLVRoaXMgdGFyZ2V0IGlzIHRoZSBzYW1lIGFzIHRoZSBsaW5lYXIgdGFyZ2V0IGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgSS9PCi1lcnJvcnMgcGVyaW9kaWNhbGx5LiAgSXQncyBiZWVuIGZvdW5kIHVzZWZ1bCBpbiBzaW11bGF0aW5nIGZhaWxpbmcKLWRldmljZXMgZm9yIHRlc3RpbmcgcHVycG9zZXMuCitUaGlzIHRhcmdldCBpcyB0aGUgc2FtZSBhcyB0aGUgbGluZWFyIHRhcmdldCBleGNlcHQgdGhhdCBpdCBleGhpYml0cwordW5yZWxpYWJsZSBiZWhhdmlvdXIgcGVyaW9kaWNhbGx5LiAgSXQncyBiZWVuIGZvdW5kIHVzZWZ1bCBpbiBzaW11bGF0aW5nCitmYWlsaW5nIGRldmljZXMgZm9yIHRlc3RpbmcgcHVycG9zZXMuCiAKIFN0YXJ0aW5nIGZyb20gdGhlIHRpbWUgdGhlIHRhYmxlIGlzIGxvYWRlZCwgdGhlIGRldmljZSBpcyBhdmFpbGFibGUgZm9yCi08dXAgaW50ZXJ2YWw+IHNlY29uZHMsIHRoZW4gcmV0dXJucyBlcnJvcnMgZm9yIDxkb3duIGludGVydmFsPiBzZWNvbmRzLAotYW5kIHRoZW4gdGhpcyBjeWNsZSByZXBlYXRzLgorPHVwIGludGVydmFsPiBzZWNvbmRzLCB0aGVuIGV4aGliaXRzIHVucmVsaWFibGUgYmVoYXZpb3VyIGZvciA8ZG93bgoraW50ZXJ2YWw+IHNlY29uZHMsIGFuZCB0aGVuIHRoaXMgY3ljbGUgcmVwZWF0cy4KIAotUGFyYW1ldGVyczogPGRldiBwYXRoPiA8b2Zmc2V0PiA8dXAgaW50ZXJ2YWw+IDxkb3duIGludGVydmFsPgorQWxzbywgY29uc2lkZXIgdXNpbmcgdGhpcyBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBkbS1kZWxheSB0YXJnZXQgdG9vLAord2hpY2ggY2FuIGRlbGF5IHJlYWRzIGFuZCB3cml0ZXMgYW5kL29yIHNlbmQgdGhlbSB0byBkaWZmZXJlbnQKK3VuZGVybHlpbmcgZGV2aWNlcy4KKworVGFibGUgcGFyYW1ldGVycworLS0tLS0tLS0tLS0tLS0tLQorICA8ZGV2IHBhdGg+IDxvZmZzZXQ+IDx1cCBpbnRlcnZhbD4gPGRvd24gaW50ZXJ2YWw+IFwKKyAgICBbPG51bV9mZWF0dXJlcz4gWzxmZWF0dXJlIGFyZ3VtZW50cz5dXQorCitNYW5kYXRvcnkgcGFyYW1ldGVyczoKICAgICA8ZGV2IHBhdGg+OiBGdWxsIHBhdGhuYW1lIHRvIHRoZSB1bmRlcmx5aW5nIGJsb2NrLWRldmljZSwgb3IgYQogICAgICAgICAgICAgICAgICJtYWpvcjptaW5vciIgZGV2aWNlLW51bWJlci4KICAgICA8b2Zmc2V0PjogU3RhcnRpbmcgc2VjdG9yIHdpdGhpbiB0aGUgZGV2aWNlLgogICAgIDx1cCBpbnRlcnZhbD46IE51bWJlciBvZiBzZWNvbmRzIGRldmljZSBpcyBhdmFpbGFibGUuCiAgICAgPGRvd24gaW50ZXJ2YWw+OiBOdW1iZXIgb2Ygc2Vjb25kcyBkZXZpY2UgcmV0dXJucyBlcnJvcnMuCisKK09wdGlvbmFsIGZlYXR1cmUgcGFyYW1ldGVyczoKKyAgSWYgbm8gZmVhdHVyZSBwYXJhbWV0ZXJzIGFyZSBwcmVzZW50LCBkdXJpbmcgdGhlIHBlcmlvZHMgb2YKKyAgdW5yZWxpYWJpbGl0eSwgYWxsIEkvTyByZXR1cm5zIGVycm9ycy4KKworICBkcm9wX3dyaXRlczoKKwlBbGwgd3JpdGUgSS9PIGlzIHNpbGVudGx5IGlnbm9yZWQuCisJUmVhZCBJL08gaXMgaGFuZGxlZCBjb3JyZWN0bHkuCisKKyAgY29ycnVwdF9iaW9fYnl0ZSA8TnRoX2J5dGU+IDxkaXJlY3Rpb24+IDx2YWx1ZT4gPGZsYWdzPjoKKwlEdXJpbmcgPGRvd24gaW50ZXJ2YWw+LCByZXBsYWNlIDxOdGhfYnl0ZT4gb2YgdGhlIGRhdGEgb2YKKwllYWNoIG1hdGNoaW5nIGJpbyB3aXRoIDx2YWx1ZT4uCisKKyAgICA8TnRoX2J5dGU+OiBUaGUgb2Zmc2V0IG9mIHRoZSBieXRlIHRvIHJlcGxhY2UuCisJCUNvdW50aW5nIHN0YXJ0cyBhdCAxLCB0byByZXBsYWNlIHRoZSBmaXJzdCBieXRlLgorICAgIDxkaXJlY3Rpb24+OiBFaXRoZXIgJ3InIHRvIGNvcnJ1cHQgcmVhZHMgb3IgJ3cnIHRvIGNvcnJ1cHQgd3JpdGVzLgorCQkgJ3cnIGlzIGluY29tcGF0aWJsZSB3aXRoIGRyb3Bfd3JpdGVzLgorICAgIDx2YWx1ZT46IFRoZSB2YWx1ZSAoZnJvbSAwLTI1NSkgdG8gd3JpdGUuCisgICAgPGZsYWdzPjogUGVyZm9ybSB0aGUgcmVwbGFjZW1lbnQgb25seSBpZiBiaW8tPmJpX3J3IGhhcyBhbGwgdGhlCisJICAgICBzZWxlY3RlZCBmbGFncyBzZXQuCisKK0V4YW1wbGVzOgorICBjb3JydXB0X2Jpb19ieXRlIDMyIHIgMSAwCisJLSByZXBsYWNlcyB0aGUgMzJuZCBieXRlIG9mIFJFQUQgYmlvcyB3aXRoIHRoZSB2YWx1ZSAxCisKKyAgY29ycnVwdF9iaW9fYnl0ZSAyMjQgdyAwIDMyCisJLSByZXBsYWNlcyB0aGUgMjI0dGggYnl0ZSBvZiBSRVFfTUVUQSAoPTMyKSBiaW9zIHdpdGggdGhlIHZhbHVlIDAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNlLW1hcHBlci9kbS1yYWlkLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNlLW1hcHBlci9kbS1yYWlkLnR4dAppbmRleCAzM2I2YjcwLi4yYThjMTEzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RldmljZS1tYXBwZXIvZG0tcmFpZC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2UtbWFwcGVyL2RtLXJhaWQudHh0CkBAIC0xLDcwICsxLDEwOCBAQAotRGV2aWNlLW1hcHBlciBSQUlEIChkbS1yYWlkKSBpcyBhIGJyaWRnZSBmcm9tIERNIHRvIE1ELiAgSXQKLXByb3ZpZGVzIGEgd2F5IHRvIHVzZSBkZXZpY2UtbWFwcGVyIGludGVyZmFjZXMgdG8gYWNjZXNzIHRoZSBNRCBSQUlECi1kcml2ZXJzLgorZG0tcmFpZAorLS0tLS0tLQogCi1BcyB3aXRoIGFsbCBkZXZpY2UtbWFwcGVyIHRhcmdldHMsIHRoZSBub21pbmFsIHB1YmxpYyBpbnRlcmZhY2VzIGFyZSB0aGUKLWNvbnN0cnVjdG9yIChDVFIpIHRhYmxlcyBhbmQgdGhlIHN0YXR1cyBvdXRwdXRzIChib3RoIFNUQVRVU1RZUEVfSU5GTwotYW5kIFNUQVRVU1RZUEVfVEFCTEUpLiAgVGhlIENUUiB0YWJsZSBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmc6CitUaGUgZGV2aWNlLW1hcHBlciBSQUlEIChkbS1yYWlkKSB0YXJnZXQgcHJvdmlkZXMgYSBicmlkZ2UgZnJvbSBETSB0byBNRC4KK0l0IGFsbG93cyB0aGUgTUQgUkFJRCBkcml2ZXJzIHRvIGJlIGFjY2Vzc2VkIHVzaW5nIGEgZGV2aWNlLW1hcHBlcgoraW50ZXJmYWNlLgogCi0xOiA8cz4gPGw+IHJhaWQgXAotMjogICAgICA8cmFpZF90eXBlPiA8I3JhaWRfcGFyYW1zPiA8cmFpZF9wYXJhbXM+IFwKLTM6ICAgICAgPCNyYWlkX2RldnM+IDxtZXRhX2RldjE+IDxkZXYxPiAuLiA8bWV0YV9kZXZOPiA8ZGV2Tj4KK1RoZSB0YXJnZXQgaXMgbmFtZWQgInJhaWQiIGFuZCBpdCBhY2NlcHRzIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKIAotTGluZSAxIGNvbnRhaW5zIHRoZSBzdGFuZGFyZCBmaXJzdCB0aHJlZSBhcmd1bWVudHMgdG8gYW55IGRldmljZS1tYXBwZXIKLXRhcmdldCAtIHRoZSBzdGFydCwgbGVuZ3RoLCBhbmQgdGFyZ2V0IHR5cGUgZmllbGRzLiAgVGhlIHRhcmdldCB0eXBlIGluCi10aGlzIGNhc2UgaXMgInJhaWQiLgorICA8cmFpZF90eXBlPiA8I3JhaWRfcGFyYW1zPiA8cmFpZF9wYXJhbXM+IFwKKyAgICA8I3JhaWRfZGV2cz4gPG1ldGFkYXRhX2RldjA+IDxkZXYwPiBbLi4gPG1ldGFkYXRhX2Rldk4+IDxkZXZOPl0KIAotTGluZSAyIGNvbnRhaW5zIHRoZSBhcmd1bWVudHMgdGhhdCBkZWZpbmUgdGhlIHBhcnRpY3VsYXIgcmFpZAotdHlwZS9wZXJzb25hbGl0eS9sZXZlbCwgdGhlIHJlcXVpcmVkIGFyZ3VtZW50cyBmb3IgdGhhdCByYWlkIHR5cGUsIGFuZAotYW55IG9wdGlvbmFsIGFyZ3VtZW50cy4gIFBvc3NpYmxlIHJhaWQgdHlwZXMgaW5jbHVkZTogcmFpZDQsIHJhaWQ1X2xhLAotcmFpZDVfbHMsIHJhaWQ1X3JzLCByYWlkNl96ciwgcmFpZDZfbnIsIGFuZCByYWlkNl9uYy4gIChyYWlkMSBpcwotcGxhbm5lZCBmb3IgdGhlIGZ1dHVyZS4pICBUaGUgbGlzdCBvZiByZXF1aXJlZCBhbmQgb3B0aW9uYWwgcGFyYW1ldGVycwotaXMgdGhlIHNhbWUgZm9yIGFsbCB0aGUgY3VycmVudCByYWlkIHR5cGVzLiAgVGhlIHJlcXVpcmVkIHBhcmFtZXRlcnMgYXJlCi1wb3NpdGlvbmFsLCB3aGlsZSB0aGUgb3B0aW9uYWwgcGFyYW1ldGVycyBhcmUgZ2l2ZW4gYXMga2V5L3ZhbHVlIHBhaXJzLgotVGhlIHBvc3NpYmxlIHBhcmFtZXRlcnMgYXJlIGFzIGZvbGxvd3M6Ci0gPGNodW5rX3NpemU+ICAgICAgICAgICBDaHVuayBzaXplIGluIHNlY3RvcnMuCi0gW1tub11zeW5jXSAgICAgICAgICAgICBGb3JjZS9QcmV2ZW50IFJBSUQgaW5pdGlhbGl6YXRpb24KLSBbcmVidWlsZCA8aWR4Pl0gICAgICAgIFJlYnVpbGQgdGhlIGRyaXZlIGluZGljYXRlZCBieSB0aGUgaW5kZXgKLSBbZGFlbW9uX3NsZWVwIDxtcz5dICAgIFRpbWUgYmV0d2VlbiBiaXRtYXAgZGFlbW9uIHdvcmsgdG8gY2xlYXIgYml0cwotIFttaW5fcmVjb3ZlcnlfcmF0ZSA8a0Ivc2VjL2Rpc2s+XSAgICAgIFRocm90dGxlIFJBSUQgaW5pdGlhbGl6YXRpb24KLSBbbWF4X3JlY292ZXJ5X3JhdGUgPGtCL3NlYy9kaXNrPl0gICAgICBUaHJvdHRsZSBSQUlEIGluaXRpYWxpemF0aW9uCi0gW21heF93cml0ZV9iZWhpbmQgPHNlY3RvcnM+XSAgICAgICAgICAgU2VlICctd3JpdGUtYmVoaW5kPScgKG1hbiBtZGFkbSkKLSBbc3RyaXBlX2NhY2hlIDxzZWN0b3JzPl0gICAgICAgICAgICAgICBTdHJpcGUgY2FjaGUgc2l6ZSBmb3IgaGlnaGVyIFJBSURzCis8cmFpZF90eXBlPjoKKyAgcmFpZDEJCVJBSUQxIG1pcnJvcmluZworICByYWlkNAkJUkFJRDQgZGVkaWNhdGVkIHBhcml0eSBkaXNrCisgIHJhaWQ1X2xhCVJBSUQ1IGxlZnQgYXN5bW1ldHJpYworCQktIHJvdGF0aW5nIHBhcml0eSAwIHdpdGggZGF0YSBjb250aW51YXRpb24KKyAgcmFpZDVfcmEJUkFJRDUgcmlnaHQgYXN5bW1ldHJpYworCQktIHJvdGF0aW5nIHBhcml0eSBOIHdpdGggZGF0YSBjb250aW51YXRpb24KKyAgcmFpZDVfbHMJUkFJRDUgbGVmdCBzeW1tZXRyaWMKKwkJLSByb3RhdGluZyBwYXJpdHkgMCB3aXRoIGRhdGEgcmVzdGFydAorICByYWlkNV9ycyAJUkFJRDUgcmlnaHQgc3ltbWV0cmljCisJCS0gcm90YXRpbmcgcGFyaXR5IE4gd2l0aCBkYXRhIHJlc3RhcnQKKyAgcmFpZDZfenIJUkFJRDYgemVybyByZXN0YXJ0CisJCS0gcm90YXRpbmcgcGFyaXR5IHplcm8gKGxlZnQtdG8tcmlnaHQpIHdpdGggZGF0YSByZXN0YXJ0CisgIHJhaWQ2X25yCVJBSUQ2IE4gcmVzdGFydAorCQktIHJvdGF0aW5nIHBhcml0eSBOIChyaWdodC10by1sZWZ0KSB3aXRoIGRhdGEgcmVzdGFydAorICByYWlkNl9uYwlSQUlENiBOIGNvbnRpbnVlCisJCS0gcm90YXRpbmcgcGFyaXR5IE4gKHJpZ2h0LXRvLWxlZnQpIHdpdGggZGF0YSBjb250aW51YXRpb24KIAotTGluZSAzIGNvbnRhaW5zIHRoZSBsaXN0IG9mIGRldmljZXMgdGhhdCBjb21wb3NlIHRoZSBhcnJheSBpbgotbWV0YWRhdGEvZGF0YSBkZXZpY2UgcGFpcnMuICBJZiB0aGUgbWV0YWRhdGEgaXMgc3RvcmVkIHNlcGFyYXRlbHksIGEgJy0nCi1pcyBnaXZlbiBmb3IgdGhlIG1ldGFkYXRhIGRldmljZSBwb3NpdGlvbi4gIElmIGEgZHJpdmUgaGFzIGZhaWxlZCBvciBpcwotbWlzc2luZyBhdCBjcmVhdGlvbiB0aW1lLCBhICctJyBjYW4gYmUgZ2l2ZW4gZm9yIGJvdGggdGhlIG1ldGFkYXRhIGFuZAotZGF0YSBkcml2ZXMgZm9yIGEgZ2l2ZW4gcG9zaXRpb24uCisgIFJlZmVyZXJlbmNlOiBDaGFwdGVyIDQgb2YKKyAgaHR0cDovL3d3dy5zbmlhLm9yZy9zaXRlcy9kZWZhdWx0L2ZpbGVzL1NOSUFfRERGX1RlY2huaWNhbF9Qb3NpdGlvbl92Mi4wLnBkZgogCi1OQi4gQ3VycmVudGx5IGFsbCBtZXRhZGF0YSBkZXZpY2VzIG11c3QgYmUgc3BlY2lmaWVkIGFzICctJy4KKzwjcmFpZF9wYXJhbXM+OiBUaGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgdGhhdCBmb2xsb3cuCiAKLUV4YW1wbGVzOgotIyBSQUlENCAtIDQgZGF0YSBkcml2ZXMsIDEgcGFyaXR5Cis8cmFpZF9wYXJhbXM+IGNvbnNpc3RzIG9mCisgICAgTWFuZGF0b3J5IHBhcmFtZXRlcnM6CisgICAgICAgIDxjaHVua19zaXplPjogQ2h1bmsgc2l6ZSBpbiBzZWN0b3JzLiAgVGhpcyBwYXJhbWV0ZXIgaXMgb2Z0ZW4ga25vd24gYXMKKwkJICAgICAgInN0cmlwZSBzaXplIi4gIEl0IGlzIHRoZSBvbmx5IG1hbmRhdG9yeSBwYXJhbWV0ZXIgYW5kCisJCSAgICAgIGlzIHBsYWNlZCBmaXJzdC4KKworICAgIGZvbGxvd2VkIGJ5IG9wdGlvbmFsIHBhcmFtZXRlcnMgKGluIGFueSBvcmRlcik6CisJW3N5bmN8bm9zeW5jXSAgIEZvcmNlIG9yIHByZXZlbnQgUkFJRCBpbml0aWFsaXphdGlvbi4KKworCVtyZWJ1aWxkIDxpZHg+XQlSZWJ1aWxkIGRyaXZlIG51bWJlciBpZHggKGZpcnN0IGRyaXZlIGlzIDApLgorCisJW2RhZW1vbl9zbGVlcCA8bXM+XQorCQlJbnRlcnZhbCBiZXR3ZWVuIHJ1bnMgb2YgdGhlIGJpdG1hcCBkYWVtb24gdGhhdAorCQljbGVhciBiaXRzLiAgQSBsb25nZXIgaW50ZXJ2YWwgbWVhbnMgbGVzcyBiaXRtYXAgSS9PIGJ1dAorCQlyZXN5bmNpbmcgYWZ0ZXIgYSBmYWlsdXJlIGlzIGxpa2VseSB0byB0YWtlIGxvbmdlci4KKworCVttaW5fcmVjb3ZlcnlfcmF0ZSA8a0Ivc2VjL2Rpc2s+XSAgVGhyb3R0bGUgUkFJRCBpbml0aWFsaXphdGlvbgorCVttYXhfcmVjb3ZlcnlfcmF0ZSA8a0Ivc2VjL2Rpc2s+XSAgVGhyb3R0bGUgUkFJRCBpbml0aWFsaXphdGlvbgorCVt3cml0ZV9tb3N0bHkgPGlkeD5dCQkgICBEcml2ZSBpbmRleCBpcyB3cml0ZS1tb3N0bHkKKwlbbWF4X3dyaXRlX2JlaGluZCA8c2VjdG9ycz5dICAgICAgIFNlZSAnLXdyaXRlLWJlaGluZD0nIChtYW4gbWRhZG0pCisJW3N0cmlwZV9jYWNoZSA8c2VjdG9ycz5dICAgICAgICAgICBTdHJpcGUgY2FjaGUgc2l6ZSAoaGlnaGVyIFJBSURzIG9ubHkpCisJW3JlZ2lvbl9zaXplIDxzZWN0b3JzPl0KKwkJVGhlIHJlZ2lvbl9zaXplIG11bHRpcGxpZWQgYnkgdGhlIG51bWJlciBvZiByZWdpb25zIGlzIHRoZQorCQlsb2dpY2FsIHNpemUgb2YgdGhlIGFycmF5LiAgVGhlIGJpdG1hcCByZWNvcmRzIHRoZSBkZXZpY2UKKwkJc3luY2hyb25pc2F0aW9uIHN0YXRlIGZvciBlYWNoIHJlZ2lvbi4KKworPCNyYWlkX2RldnM+OiBUaGUgbnVtYmVyIG9mIGRldmljZXMgY29tcG9zaW5nIHRoZSBhcnJheS4KKwlFYWNoIGRldmljZSBjb25zaXN0cyBvZiB0d28gZW50cmllcy4gIFRoZSBmaXJzdCBpcyB0aGUgZGV2aWNlCisJY29udGFpbmluZyB0aGUgbWV0YWRhdGEgKGlmIGFueSk7IHRoZSBzZWNvbmQgaXMgdGhlIG9uZSBjb250YWluaW5nIHRoZQorCWRhdGEuCisKKwlJZiBhIGRyaXZlIGhhcyBmYWlsZWQgb3IgaXMgbWlzc2luZyBhdCBjcmVhdGlvbiB0aW1lLCBhICctJyBjYW4gYmUKKwlnaXZlbiBmb3IgYm90aCB0aGUgbWV0YWRhdGEgYW5kIGRhdGEgZHJpdmVzIGZvciBhIGdpdmVuIHBvc2l0aW9uLgorCisKK0V4YW1wbGUgdGFibGVzCistLS0tLS0tLS0tLS0tLQorIyBSQUlENCAtIDQgZGF0YSBkcml2ZXMsIDEgcGFyaXR5IChubyBtZXRhZGF0YSBkZXZpY2VzKQogIyBObyBtZXRhZGF0YSBkZXZpY2VzIHNwZWNpZmllZCB0byBob2xkIHN1cGVyYmxvY2svYml0bWFwIGluZm8KICMgQ2h1bmsgc2l6ZSBvZiAxTWlCCiAjIChMaW5lcyBzZXBhcmF0ZWQgZm9yIGVhc3kgcmVhZGluZykKKwogMCAxOTYwODkzNjQ4IHJhaWQgXAogICAgICAgICByYWlkNCAxIDIwNDggXAogICAgICAgICA1IC0gODoxNyAtIDg6MzMgLSA4OjQ5IC0gODo2NSAtIDg6ODEKIAotIyBSQUlENCAtIDQgZGF0YSBkcml2ZXMsIDEgcGFyaXR5IChubyBtZXRhZGF0YSBkZXZpY2VzKQorIyBSQUlENCAtIDQgZGF0YSBkcml2ZXMsIDEgcGFyaXR5ICh3aXRoIG1ldGFkYXRhIGRldmljZXMpCiAjIENodW5rIHNpemUgb2YgMU1pQiwgZm9yY2UgUkFJRCBpbml0aWFsaXphdGlvbiwKICMgICAgICAgbWluIHJlY292ZXJ5IHJhdGUgYXQgMjAga2lCL3NlYy9kaXNrCisKIDAgMTk2MDg5MzY0OCByYWlkIFwKLSAgICAgICAgcmFpZDQgNCAyMDQ4IG1pbl9yZWNvdmVyeV9yYXRlIDIwIHN5bmNcCi0gICAgICAgIDUgLSA4OjE3IC0gODozMyAtIDg6NDkgLSA4OjY1IC0gODo4MQorICAgICAgICByYWlkNCA0IDIwNDggc3luYyBtaW5fcmVjb3ZlcnlfcmF0ZSAyMCBcCisgICAgICAgIDUgODoxNyA4OjE4IDg6MzMgODozNCA4OjQ5IDg6NTAgODo2NSA4OjY2IDg6ODEgODo4MgogCi1QZXJmb3JtaW5nIGEgJ2Rtc2V0dXAgdGFibGUnIHNob3VsZCBkaXNwbGF5IHRoZSBDVFIgdGFibGUgdXNlZCB0bwotY29uc3RydWN0IHRoZSBtYXBwaW5nICh3aXRoIHBvc3NpYmxlIHJlb3JkZXJpbmcgb2Ygb3B0aW9uYWwKLXBhcmFtZXRlcnMpLgorJ2Rtc2V0dXAgdGFibGUnIGRpc3BsYXlzIHRoZSB0YWJsZSB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgbWFwcGluZy4KK1RoZSBvcHRpb25hbCBwYXJhbWV0ZXJzIGFyZSBhbHdheXMgcHJpbnRlZCBpbiB0aGUgb3JkZXIgbGlzdGVkCithYm92ZSB3aXRoICJzeW5jIiBvciAibm9zeW5jIiBhbHdheXMgb3V0cHV0IGFoZWFkIG9mIHRoZSBvdGhlcgorYXJndW1lbnRzLCByZWdhcmRsZXNzIG9mIHRoZSBvcmRlciB1c2VkIHdoZW4gb3JpZ2luYWxseSBsb2FkaW5nIHRoZSB0YWJsZS4KK0FyZ3VtZW50cyB0aGF0IGNhbiBiZSByZXBlYXRlZCBhcmUgb3JkZXJlZCBieSB2YWx1ZS4KIAotUGVyZm9ybWluZyBhICdkbXNldHVwIHN0YXR1cycgd2lsbCB5aWVsZCBpbmZvcm1hdGlvbiBvbiB0aGUgc3RhdGUgYW5kCi1oZWFsdGggb2YgdGhlIGFycmF5LiAgVGhlIG91dHB1dCBpcyBhcyBmb2xsb3dzOgorJ2Rtc2V0dXAgc3RhdHVzJyB5aWVsZHMgaW5mb3JtYXRpb24gb24gdGhlIHN0YXRlIGFuZCBoZWFsdGggb2YgdGhlCithcnJheS4KK1RoZSBvdXRwdXQgaXMgYXMgZm9sbG93czoKIDE6IDxzPiA8bD4gcmFpZCBcCiAyOiAgICAgIDxyYWlkX3R5cGU+IDwjZGV2aWNlcz4gPDEgaGVhbHRoIGNoYXIgZm9yIGVhY2ggZGV2PiA8cmVzeW5jX3JhdGlvPgogCi1MaW5lIDEgaXMgc3RhbmRhcmQgRE0gb3V0cHV0LiAgTGluZSAyIGlzIGJlc3Qgc2hvd24gYnkgZXhhbXBsZToKK0xpbmUgMSBpcyB0aGUgc3RhbmRhcmQgb3V0cHV0IHByb2R1Y2VkIGJ5IGRldmljZS1tYXBwZXIuCitMaW5lIDIgaXMgcHJvZHVjZWQgYnkgdGhlIHJhaWQgdGFyZ2V0LCBhbmQgYmVzdCBleHBsYWluZWQgYnkgZXhhbXBsZToKICAgICAgICAgMCAxOTYwODkzNjQ4IHJhaWQgcmFpZDQgNSBBQUFBQSAyLzQ5MDIyMTU2OAogSGVyZSB3ZSBjYW4gc2VlIHRoZSBSQUlEIHR5cGUgaXMgcmFpZDQsIHRoZXJlIGFyZSA1IGRldmljZXMgLSBhbGwgb2YKIHdoaWNoIGFyZSAnQSdsaXZlLCBhbmQgdGhlIGFycmF5IGlzIDIvNDkwMjIxNTY4IGNvbXBsZXRlIHdpdGggcmVjb3ZlcnkuCitGYXVsdHkgb3IgbWlzc2luZyBkZXZpY2VzIGFyZSBtYXJrZWQgJ0QnLiAgRGV2aWNlcyB0aGF0IGFyZSBvdXQtb2Ytc3luYworYXJlIG1hcmtlZCAnYScuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL2FybS1ib2FyZHMgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvYXJtL2FybS1ib2FyZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFmMjYxNAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9hcm0vYXJtLWJvYXJkcwpAQCAtMCwwICsxLDIwIEBACitBUk0gVmVyc2F0aWxlIEFwcGxpY2F0aW9uIGFuZCBQbGF0Zm9ybSBCYXNlYm9hcmRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitBUk0ncyBkZXZlbG9wbWVudCBoYXJkd2FyZSBwbGF0Zm9ybSB3aXRoIGNvbm5lY3RvcnMgZm9yIGN1c3RvbWl6YWJsZQorY29yZSB0aWxlcy4gIFRoZSBoYXJkd2FyZSBjb25maWd1cmF0aW9uIG9mIHRoZSBWZXJzYXRpbGUgYm9hcmRzIGlzCitoaWdobHkgY3VzdG9taXphYmxlLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzIChpbiByb290IG5vZGUpOgorCWNvbXBhdGlibGUgPSAiYXJtLHZlcnNhdGlsZS1hYiI7ICAvKiBBcHBsaWNhdGlvbiBiYXNlYm9hcmQgKi8KKwljb21wYXRpYmxlID0gImFybSx2ZXJzYXRpbGUtcGIiOyAgLyogUGxhdGZvcm0gYmFzZWJvYXJkICovCisKK0ludGVycnVwdCBjb250cm9sbGVyczoKKy0gVklDIHJlcXVpcmVkIHByb3BlcnRpZXM6CisJY29tcGF0aWJsZSA9ICJhcm0sdmVyc2F0aWxlLXZpYyI7CisJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKworLSBTSUMgcmVxdWlyZWQgcHJvcGVydGllczoKKwljb21wYXRpYmxlID0gImFybSx2ZXJzYXRpbGUtc2ljIjsKKwlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2RtYS9mc2wtaW14LXNkbWEudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2RtYS9mc2wtaW14LXNkbWEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZTNmNDQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZG1hL2ZzbC1pbXgtc2RtYS50eHQKQEAgLTAsMCArMSwxNyBAQAorKiBGcmVlc2NhbGUgU21hcnQgRGlyZWN0IE1lbW9yeSBBY2Nlc3MgKFNETUEpIENvbnRyb2xsZXIgZm9yIGkuTVgKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6IFNob3VsZCBiZSAiZnNsLDxjaGlwPi1zZG1hIgorLSByZWcgOiBTaG91bGQgY29udGFpbiBTRE1BIHJlZ2lzdGVycyBsb2NhdGlvbiBhbmQgbGVuZ3RoCistIGludGVycnVwdHMgOiBTaG91bGQgY29udGFpbiBTRE1BIGludGVycnVwdAorLSBmc2wsc2RtYS1yYW0tc2NyaXB0LW5hbWUgOiBTaG91bGQgY29udGFpbiB0aGUgZnVsbCBwYXRoIG9mIFNETUEgUkFNCisgIHNjcmlwdHMgZmlybXdhcmUKKworRXhhbXBsZXM6CisKK3NkbWFAODNmYjAwMDAgeworCWNvbXBhdGlibGUgPSAiZnNsLGlteDUxLXNkbWEiLCAiZnNsLGlteDM1LXNkbWEiOworCXJlZyA9IDwweDgzZmIwMDAwIDB4NDAwMD47CisJaW50ZXJydXB0cyA9IDw2PjsKKwlmc2wsc2RtYS1yYW0tc2NyaXB0LW5hbWUgPSAic2RtYS1pbXg1MS5iaW4iOworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL2dwaW9fa2V5cy50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvZ3Bpby9ncGlvX2tleXMudHh0CmluZGV4IDcxOTBjOTkuLjVjMmMwMjEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9ncGlvL2dwaW9fa2V5cy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2dwaW8vZ3Bpb19rZXlzLnR4dApAQCAtMTAsNyArMTAsNyBAQAogRWFjaCBidXR0b24gKGtleSkgaXMgcmVwcmVzZW50ZWQgYXMgYSBzdWItbm9kZSBvZiAiZ3Bpby1rZXlzIjoKIFN1Ym5vZGUgcHJvcGVydGllczoKIAotCS0gZ3Bpb3M6IE9GIGRldmNpZS10cmVlIGdwaW8gc3BlY2lmaWNhdGluLgorCS0gZ3Bpb3M6IE9GIGRldmljZS10cmVlIGdwaW8gc3BlY2lmaWNhdGlvbi4KIAktIGxhYmVsOiBEZXNjcmlwdGl2ZSBuYW1lIG9mIHRoZSBrZXkuCiAJLSBsaW51eCxjb2RlOiBLZXljb2RlIHRvIGVtaXQuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9pMmMvYXJtLXZlcnNhdGlsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL2FybS12ZXJzYXRpbGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MWQzMWMKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaTJjL2FybS12ZXJzYXRpbGUudHh0CkBAIC0wLDAgKzEsMTAgQEAKK2kyYyBDb250cm9sbGVyIG9uIEFSTSBWZXJzYXRpbGUgcGxhdGZvcm06CisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiBNdXN0IGJlICJhcm0sdmVyc2F0aWxlLWkyYyI7CistIHJlZworLSAjYWRkcmVzcy1jZWxscyA9IDwxPjsKKy0gI3NpemUtY2VsbHMgPSA8MD47CisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIENoaWxkIG5vZGVzIGNvbmZvcm1pbmcgdG8gaTJjIGJ1cyBiaW5kaW5nCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvaW5wdXQvZnNsLW1tYTg0NTAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lucHV0L2ZzbC1tbWE4NDUwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDBjOTRjCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL2lucHV0L2ZzbC1tbWE4NDUwLnR4dApAQCAtMCwwICsxLDExIEBACisqIEZyZWVzY2FsZSBNTUE4NDUwIDMtQXhpcyBBY2NlbGVyb21ldGVyCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiAiZnNsLG1tYTg0NTAiLgorCitFeGFtcGxlOgorCithY2NlbGVyb21ldGVyOiBtbWE4NDUwQDFjIHsKKwljb21wYXRpYmxlID0gImZzbCxtbWE4NDUwIjsKKwlyZWcgPSA8MHgxYz47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL21tYy9mc2wtaW14LWVzZGhjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvZnNsLWlteC1lc2RoYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIyMmZlNgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tbWMvZnNsLWlteC1lc2RoYy50eHQKQEAgLTAsMCArMSwzNCBAQAorKiBGcmVlc2NhbGUgRW5oYW5jZWQgU2VjdXJlIERpZ2l0YWwgSG9zdCBDb250cm9sbGVyIChlU0RIQykgZm9yIGkuTVgKKworVGhlIEVuaGFuY2VkIFNlY3VyZSBEaWdpdGFsIEhvc3QgQ29udHJvbGxlciBvbiBGcmVlc2NhbGUgaS5NWCBmYW1pbHkKK3Byb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgTU1DLCBTRCwgYW5kIFNESU8gdHlwZXMgb2YgbWVtb3J5IGNhcmRzLgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogU2hvdWxkIGJlICJmc2wsPGNoaXA+LWVzZGhjIgorLSByZWcgOiBTaG91bGQgY29udGFpbiBlU0RIQyByZWdpc3RlcnMgbG9jYXRpb24gYW5kIGxlbmd0aAorLSBpbnRlcnJ1cHRzIDogU2hvdWxkIGNvbnRhaW4gZVNESEMgaW50ZXJydXB0CisKK09wdGlvbmFsIHByb3BlcnRpZXM6CistIGZzbCxjYXJkLXdpcmVkIDogSW5kaWNhdGUgdGhlIGNhcmQgaXMgd2lyZWQgdG8gaG9zdCBwZXJtYW5lbnRseQorLSBmc2wsY2QtaW50ZXJuYWwgOiBJbmRpY2F0ZSB0byB1c2UgY29udHJvbGxlciBpbnRlcm5hbCBjYXJkIGRldGVjdGlvbgorLSBmc2wsd3AtaW50ZXJuYWwgOiBJbmRpY2F0ZSB0byB1c2UgY29udHJvbGxlciBpbnRlcm5hbCB3cml0ZSBwcm90ZWN0aW9uCistIGNkLWdwaW9zIDogU3BlY2lmeSBHUElPcyBmb3IgY2FyZCBkZXRlY3Rpb24KKy0gd3AtZ3Bpb3MgOiBTcGVjaWZ5IEdQSU9zIGZvciB3cml0ZSBwcm90ZWN0aW9uCisKK0V4YW1wbGVzOgorCitlc2RoY0A3MDAwNDAwMCB7CisJY29tcGF0aWJsZSA9ICJmc2wsaW14NTEtZXNkaGMiOworCXJlZyA9IDwweDcwMDA0MDAwIDB4NDAwMD47CisJaW50ZXJydXB0cyA9IDwxPjsKKwlmc2wsY2QtaW50ZXJuYWw7CisJZnNsLHdwLWludGVybmFsOworfTsKKworZXNkaGNANzAwMDgwMDAgeworCWNvbXBhdGlibGUgPSAiZnNsLGlteDUxLWVzZGhjIjsKKwlyZWcgPSA8MHg3MDAwODAwMCAweDQwMDA+OworCWludGVycnVwdHMgPSA8Mj47CisJY2QtZ3Bpb3MgPSA8JmdwaW8wIDYgMD47IC8qIEdQSU8xXzYgKi8KKwl3cC1ncGlvcyA9IDwmZ3BpbzAgNSAwPjsgLyogR1BJTzFfNSAqLworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9tdGQvYXJtLXZlcnNhdGlsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbXRkL2FybS12ZXJzYXRpbGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3Njg0NWQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbXRkL2FybS12ZXJzYXRpbGUudHh0CkBAIC0wLDAgKzEsOCBAQAorRmxhc2ggZGV2aWNlIG9uIEFSTSBWZXJzYXRpbGUgYm9hcmQKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6IG11c3QgYmUgImFybSx2ZXJzYXRpbGUtZmxhc2giOworLSBiYW5rLXdpZHRoIDogd2lkdGggaW4gYnl0ZXMgb2YgZmxhc2ggaW50ZXJmYWNlLgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBTdWJub2RlIHBhcnRpdGlvbiBtYXAgZnJvbSBtdGQgZmxhc2ggYmluZGluZwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9mc2wtZmVjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvZnNsLWZlYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU0Mzk1MQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvZnNsLWZlYy50eHQKQEAgLTAsMCArMSwyNCBAQAorKiBGcmVlc2NhbGUgRmFzdCBFdGhlcm5ldCBDb250cm9sbGVyIChGRUMpCisKK1JlcXVpcmVkIHByb3BlcnRpZXM6CistIGNvbXBhdGlibGUgOiBTaG91bGQgYmUgImZzbCw8c29jPi1mZWMiCistIHJlZyA6IEFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlCistIGludGVycnVwdHMgOiBTaG91bGQgY29udGFpbiBmZWMgaW50ZXJydXB0CistIHBoeS1tb2RlIDogU3RyaW5nLCBvcGVyYXRpb24gbW9kZSBvZiB0aGUgUEhZIGludGVyZmFjZS4KKyAgU3VwcG9ydGVkIHZhbHVlcyBhcmU6ICJtaWkiLCAiZ21paSIsICJzZ21paSIsICJ0YmkiLCAicm1paSIsCisgICJyZ21paSIsICJyZ21paS1pZCIsICJyZ21paS1yeGlkIiwgInJnbWlpLXR4aWQiLCAicnRiaSIsICJzbWlpIi4KKy0gcGh5LXJlc2V0LWdwaW9zIDogU2hvdWxkIHNwZWNpZnkgdGhlIGdwaW8gZm9yIHBoeSByZXNldAorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBsb2NhbC1tYWMtYWRkcmVzcyA6IDYgYnl0ZXMsIG1hYyBhZGRyZXNzCisKK0V4YW1wbGU6CisKK2ZlY0A4M2ZlYzAwMCB7CisJY29tcGF0aWJsZSA9ICJmc2wsaW14NTEtZmVjIiwgImZzbCxpbXgyNy1mZWMiOworCXJlZyA9IDwweDgzZmVjMDAwIDB4NDAwMD47CisJaW50ZXJydXB0cyA9IDw4Nz47CisJcGh5LW1vZGUgPSAibWlpIjsKKwlwaHktcmVzZXQtZ3Bpb3MgPSA8JmdwaW8xIDE0IDA+OyAvKiBHUElPMl8xNCAqLworCWxvY2FsLW1hYy1hZGRyZXNzID0gWzAwIDA0IDlGIDAxIDFCIEI5XTsKK307CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L3Ntc2MtbGFuOTFjMTExLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvc21zYy1sYW45MWMxMTEudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MzA0OWIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L3Ntc2MtbGFuOTFjMTExLnR4dApAQCAtMCwwICsxLDEwIEBACitTTVNDIExBTjkxYzExMSBFdGhlcm5ldCBtYWMKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA9ICJzbXNjLGxhbjkxYzExMSI7CistIHJlZyA6IHBoeXNpY2FsIGFkZHJlc3MgYW5kIHNpemUgb2YgcmVnaXN0ZXJzCistIGludGVycnVwdHMgOiBpbnRlcnJ1cHQgY29ubmVjdGlvbgorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBwaHktZGV2aWNlIDogcGhhbmRsZSB0byBFdGhlcm5ldCBwaHkKKy0gbG9jYWwtbWFjLWFkZHJlc3MgOiBFdGhlcm5ldCBtYWMgYWRkcmVzcyB0byB1c2UKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy90dHkvc2VyaWFsL2ZzbC1pbXgtdWFydC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdHR5L3NlcmlhbC9mc2wtaW14LXVhcnQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YzA0MDYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvdHR5L3NlcmlhbC9mc2wtaW14LXVhcnQudHh0CkBAIC0wLDAgKzEsMTkgQEAKKyogRnJlZXNjYWxlIGkuTVggVW5pdmVyc2FsIEFzeW5jaHJvbm91cyBSZWNlaXZlci9UcmFuc21pdHRlciAoVUFSVCkKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6IFNob3VsZCBiZSAiZnNsLDxzb2M+LXVhcnQiCistIHJlZyA6IEFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0aGUgcmVnaXN0ZXIgc2V0IGZvciB0aGUgZGV2aWNlCistIGludGVycnVwdHMgOiBTaG91bGQgY29udGFpbiB1YXJ0IGludGVycnVwdAorCitPcHRpb25hbCBwcm9wZXJ0aWVzOgorLSBmc2wsdWFydC1oYXMtcnRzY3RzIDogSW5kaWNhdGUgdGhlIHVhcnQgaGFzIHJ0cyBhbmQgY3RzCistIGZzbCxpcmRhLW1vZGUgOiBJbmRpY2F0ZSB0aGUgdWFydCBzdXBwb3J0cyBpcmRhIG1vZGUKKworRXhhbXBsZToKKwordWFydEA3M2ZiYzAwMCB7CisJY29tcGF0aWJsZSA9ICJmc2wsaW14NTEtdWFydCIsICJmc2wsaW14MjEtdWFydCI7CisJcmVnID0gPDB4NzNmYmMwMDAgMHg0MDAwPjsKKwlpbnRlcnJ1cHRzID0gPDMxPjsKKwlmc2wsdWFydC1oYXMtcnRzY3RzOworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy93YXRjaGRvZy9mc2wtaW14LXdkdC50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvd2F0Y2hkb2cvZnNsLWlteC13ZHQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNDRhZjEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3Mvd2F0Y2hkb2cvZnNsLWlteC13ZHQudHh0CkBAIC0wLDAgKzEsMTQgQEAKKyogRnJlZXNjYWxlIGkuTVggV2F0Y2hkb2cgVGltZXIgKFdEVCkgQ29udHJvbGxlcgorCitSZXF1aXJlZCBwcm9wZXJ0aWVzOgorLSBjb21wYXRpYmxlIDogU2hvdWxkIGJlICJmc2wsPHNvYz4td2R0IgorLSByZWcgOiBTaG91bGQgY29udGFpbiBXRFQgcmVnaXN0ZXJzIGxvY2F0aW9uIGFuZCBsZW5ndGgKKy0gaW50ZXJydXB0cyA6IFNob3VsZCBjb250YWluIFdEVCBpbnRlcnJ1cHQKKworRXhhbXBsZXM6CisKK3dkdEA3M2Y5ODAwMCB7CisJY29tcGF0aWJsZSA9ICJmc2wsaW14NTEtd2R0IiwgImZzbCxpbXgyMS13ZHQiOworCXJlZyA9IDwweDczZjk4MDAwIDB4NDAwMD47CisJaW50ZXJydXB0cyA9IDw1OD47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL3dhdGNoZG9nL3NhbXN1bmctd2R0LnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy93YXRjaGRvZy9zYW1zdW5nLXdkdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzllYWQ4MgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy93YXRjaGRvZy9zYW1zdW5nLXdkdC50eHQKQEAgLTAsMCArMSwxMSBAQAorKiBTYW1zdW5nJ3MgV2F0Y2hkb2cgVGltZXIgQ29udHJvbGxlcgorCitUaGUgU2Ftc3VuZydzIFdhdGNoZG9nIGNvbnRyb2xsZXIgaXMgdXNlZCBmb3IgcmVzdW1pbmcgc3lzdGVtIG9wZXJhdGlvbgorYWZ0ZXIgYSBwcmVzZXQgYW1vdW50IG9mIHRpbWUgZHVyaW5nIHdoaWNoIHRoZSBXRFQgcmVzZXQgZXZlbnQgaGFzIG5vdAorb2NjdXJlZC4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6IHNob3VsZCBiZSAic2Ftc3VuZyxzM2MyNDEwLXdkdCIKKy0gcmVnIDogYmFzZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBjb250cm9sbGVyIGFuZCBsZW5ndGggb2YgbWVtb3J5IG1hcHBlZAorCXJlZ2lvbi4KKy0gaW50ZXJydXB0cyA6IGludGVycnVwdCBudW1iZXIgdG8gdGhlIGNwdS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZG1hZW5naW5lLnR4dCBiL0RvY3VtZW50YXRpb24vZG1hZW5naW5lLnR4dAppbmRleCA1YTBjYjFlLi45NGI3ZTBmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2RtYWVuZ2luZS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9kbWFlbmdpbmUudHh0CkBAIC0xMCw4NyArMTAsMTgxIEBACiBCZWxvdyBpcyBhIGd1aWRlIHRvIGRldmljZSBkcml2ZXIgd3JpdGVycyBvbiBob3cgdG8gdXNlIHRoZSBTbGF2ZS1ETUEgQVBJIG9mIHRoZQogRE1BIEVuZ2luZS4gVGhpcyBpcyBhcHBsaWNhYmxlIG9ubHkgZm9yIHNsYXZlIERNQSB1c2FnZSBvbmx5LgogCi1UaGUgc2xhdmUgRE1BIHVzYWdlIGNvbnNpc3RzIG9mIGZvbGxvd2luZyBzdGVwcworVGhlIHNsYXZlIERNQSB1c2FnZSBjb25zaXN0cyBvZiBmb2xsb3dpbmcgc3RlcHM6CiAxLiBBbGxvY2F0ZSBhIERNQSBzbGF2ZSBjaGFubmVsCiAyLiBTZXQgc2xhdmUgYW5kIGNvbnRyb2xsZXIgc3BlY2lmaWMgcGFyYW1ldGVycwogMy4gR2V0IGEgZGVzY3JpcHRvciBmb3IgdHJhbnNhY3Rpb24KLTQuIFN1Ym1pdCB0aGUgdHJhbnNhY3Rpb24gYW5kIHdhaXQgZm9yIGNhbGxiYWNrIG5vdGlmaWNhdGlvbgorNC4gU3VibWl0IHRoZSB0cmFuc2FjdGlvbgorNS4gSXNzdWUgcGVuZGluZyByZXF1ZXN0cyBhbmQgd2FpdCBmb3IgY2FsbGJhY2sgbm90aWZpY2F0aW9uCiAKIDEuIEFsbG9jYXRlIGEgRE1BIHNsYXZlIGNoYW5uZWwKLUNoYW5uZWwgYWxsb2NhdGlvbiBpcyBzbGlnaHRseSBkaWZmZXJlbnQgaW4gdGhlIHNsYXZlIERNQSBjb250ZXh0LCBjbGllbnQKLWRyaXZlcnMgdHlwaWNhbGx5IG5lZWQgYSBjaGFubmVsIGZyb20gYSBwYXJ0aWN1bGFyIERNQSBjb250cm9sbGVyIG9ubHkgYW5kIGV2ZW4KLWluIHNvbWUgY2FzZXMgYSBzcGVjaWZpYyBjaGFubmVsIGlzIGRlc2lyZWQuIFRvIHJlcXVlc3QgYSBjaGFubmVsCi1kbWFfcmVxdWVzdF9jaGFubmVsKCkgQVBJIGlzIHVzZWQuCiAKLUludGVyZmFjZToKLXN0cnVjdCBkbWFfY2hhbiAqZG1hX3JlcXVlc3RfY2hhbm5lbChkbWFfY2FwX21hc2tfdCBtYXNrLAotCQlkbWFfZmlsdGVyX2ZuIGZpbHRlcl9mbiwKLQkJdm9pZCAqZmlsdGVyX3BhcmFtKTsKLXdoZXJlIGRtYV9maWx0ZXJfZm4gaXMgZGVmaW5lZCBhczoKLXR5cGVkZWYgYm9vbCAoKmRtYV9maWx0ZXJfZm4pKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgdm9pZCAqZmlsdGVyX3BhcmFtKTsKKyAgIENoYW5uZWwgYWxsb2NhdGlvbiBpcyBzbGlnaHRseSBkaWZmZXJlbnQgaW4gdGhlIHNsYXZlIERNQSBjb250ZXh0LAorICAgY2xpZW50IGRyaXZlcnMgdHlwaWNhbGx5IG5lZWQgYSBjaGFubmVsIGZyb20gYSBwYXJ0aWN1bGFyIERNQQorICAgY29udHJvbGxlciBvbmx5IGFuZCBldmVuIGluIHNvbWUgY2FzZXMgYSBzcGVjaWZpYyBjaGFubmVsIGlzIGRlc2lyZWQuCisgICBUbyByZXF1ZXN0IGEgY2hhbm5lbCBkbWFfcmVxdWVzdF9jaGFubmVsKCkgQVBJIGlzIHVzZWQuCiAKLVdoZW4gdGhlIG9wdGlvbmFsICdmaWx0ZXJfZm4nIHBhcmFtZXRlciBpcyBzZXQgdG8gTlVMTCBkbWFfcmVxdWVzdF9jaGFubmVsCi1zaW1wbHkgcmV0dXJucyB0aGUgZmlyc3QgY2hhbm5lbCB0aGF0IHNhdGlzZmllcyB0aGUgY2FwYWJpbGl0eSBtYXNrLiAgT3RoZXJ3aXNlLAotd2hlbiB0aGUgbWFzayBwYXJhbWV0ZXIgaXMgaW5zdWZmaWNpZW50IGZvciBzcGVjaWZ5aW5nIHRoZSBuZWNlc3NhcnkgY2hhbm5lbCwKLXRoZSBmaWx0ZXJfZm4gcm91dGluZSBjYW4gYmUgdXNlZCB0byBkaXNwb3NpdGlvbiB0aGUgYXZhaWxhYmxlIGNoYW5uZWxzIGluIHRoZQotc3lzdGVtLiBUaGUgZmlsdGVyX2ZuIHJvdXRpbmUgaXMgY2FsbGVkIG9uY2UgZm9yIGVhY2ggZnJlZSBjaGFubmVsIGluIHRoZQotc3lzdGVtLiAgVXBvbiBzZWVpbmcgYSBzdWl0YWJsZSBjaGFubmVsIGZpbHRlcl9mbiByZXR1cm5zIERNQV9BQ0sgd2hpY2ggZmxhZ3MKLXRoYXQgY2hhbm5lbCB0byBiZSB0aGUgcmV0dXJuIHZhbHVlIGZyb20gZG1hX3JlcXVlc3RfY2hhbm5lbC4gIEEgY2hhbm5lbAotYWxsb2NhdGVkIHZpYSB0aGlzIGludGVyZmFjZSBpcyBleGNsdXNpdmUgdG8gdGhlIGNhbGxlciwgdW50aWwKLWRtYV9yZWxlYXNlX2NoYW5uZWwoKSBpcyBjYWxsZWQuCisgICBJbnRlcmZhY2U6CisJc3RydWN0IGRtYV9jaGFuICpkbWFfcmVxdWVzdF9jaGFubmVsKGRtYV9jYXBfbWFza190IG1hc2ssCisJCQlkbWFfZmlsdGVyX2ZuIGZpbHRlcl9mbiwKKwkJCXZvaWQgKmZpbHRlcl9wYXJhbSk7CisgICB3aGVyZSBkbWFfZmlsdGVyX2ZuIGlzIGRlZmluZWQgYXM6CisJdHlwZWRlZiBib29sICgqZG1hX2ZpbHRlcl9mbikoc3RydWN0IGRtYV9jaGFuICpjaGFuLCB2b2lkICpmaWx0ZXJfcGFyYW0pOworCisgICBUaGUgJ2ZpbHRlcl9mbicgcGFyYW1ldGVyIGlzIG9wdGlvbmFsLCBidXQgaGlnaGx5IHJlY29tbWVuZGVkIGZvcgorICAgc2xhdmUgYW5kIGN5Y2xpYyBjaGFubmVscyBhcyB0aGV5IHR5cGljYWxseSBuZWVkIHRvIG9idGFpbiBhIHNwZWNpZmljCisgICBETUEgY2hhbm5lbC4KKworICAgV2hlbiB0aGUgb3B0aW9uYWwgJ2ZpbHRlcl9mbicgcGFyYW1ldGVyIGlzIE5VTEwsIGRtYV9yZXF1ZXN0X2NoYW5uZWwoKQorICAgc2ltcGx5IHJldHVybnMgdGhlIGZpcnN0IGNoYW5uZWwgdGhhdCBzYXRpc2ZpZXMgdGhlIGNhcGFiaWxpdHkgbWFzay4KKworICAgT3RoZXJ3aXNlLCB0aGUgJ2ZpbHRlcl9mbicgcm91dGluZSB3aWxsIGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIGZyZWUKKyAgIGNoYW5uZWwgd2hpY2ggaGFzIGEgY2FwYWJpbGl0eSBpbiAnbWFzaycuICAnZmlsdGVyX2ZuJyBpcyBleHBlY3RlZCB0bworICAgcmV0dXJuICd0cnVlJyB3aGVuIHRoZSBkZXNpcmVkIERNQSBjaGFubmVsIGlzIGZvdW5kLgorCisgICBBIGNoYW5uZWwgYWxsb2NhdGVkIHZpYSB0aGlzIGludGVyZmFjZSBpcyBleGNsdXNpdmUgdG8gdGhlIGNhbGxlciwKKyAgIHVudGlsIGRtYV9yZWxlYXNlX2NoYW5uZWwoKSBpcyBjYWxsZWQuCiAKIDIuIFNldCBzbGF2ZSBhbmQgY29udHJvbGxlciBzcGVjaWZpYyBwYXJhbWV0ZXJzCi1OZXh0IHN0ZXAgaXMgYWx3YXlzIHRvIHBhc3Mgc29tZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiB0byB0aGUgRE1BIGRyaXZlci4gTW9zdCBvZgotdGhlIGdlbmVyaWMgaW5mb3JtYXRpb24gd2hpY2ggYSBzbGF2ZSBETUEgY2FuIHVzZSBpcyBpbiBzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZy4KLUl0IGFsbG93cyB0aGUgY2xpZW50cyB0byBzcGVjaWZ5IERNQSBkaXJlY3Rpb24sIERNQSBhZGRyZXNzZXMsIGJ1cyB3aWR0aHMsIERNQQotYnVyc3QgbGVuZ3RocyBldGMuIElmIHNvbWUgRE1BIGNvbnRyb2xsZXJzIGhhdmUgbW9yZSBwYXJhbWV0ZXJzIHRvIGJlIHNlbnQgdGhlbgotdGhleSBzaG91bGQgdHJ5IHRvIGVtYmVkIHN0cnVjdCBkbWFfc2xhdmVfY29uZmlnIGluIHRoZWlyIGNvbnRyb2xsZXIgc3BlY2lmaWMKLXN0cnVjdHVyZS4gVGhhdCBnaXZlcyBmbGV4aWJpbGl0eSB0byBjbGllbnQgdG8gcGFzcyBtb3JlIHBhcmFtZXRlcnMsIGlmCi1yZXF1aXJlZC4KIAotSW50ZXJmYWNlOgotaW50IGRtYWVuZ2luZV9zbGF2ZV9jb25maWcoc3RydWN0IGRtYV9jaGFuICpjaGFuLAotCQkJCQkgIHN0cnVjdCBkbWFfc2xhdmVfY29uZmlnICpjb25maWcpCisgICBOZXh0IHN0ZXAgaXMgYWx3YXlzIHRvIHBhc3Mgc29tZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiB0byB0aGUgRE1BCisgICBkcml2ZXIuICBNb3N0IG9mIHRoZSBnZW5lcmljIGluZm9ybWF0aW9uIHdoaWNoIGEgc2xhdmUgRE1BIGNhbiB1c2UKKyAgIGlzIGluIHN0cnVjdCBkbWFfc2xhdmVfY29uZmlnLiAgVGhpcyBhbGxvd3MgdGhlIGNsaWVudHMgdG8gc3BlY2lmeQorICAgRE1BIGRpcmVjdGlvbiwgRE1BIGFkZHJlc3NlcywgYnVzIHdpZHRocywgRE1BIGJ1cnN0IGxlbmd0aHMgZXRjCisgICBmb3IgdGhlIHBlcmlwaGVyYWwuCisKKyAgIElmIHNvbWUgRE1BIGNvbnRyb2xsZXJzIGhhdmUgbW9yZSBwYXJhbWV0ZXJzIHRvIGJlIHNlbnQgdGhlbiB0aGV5CisgICBzaG91bGQgdHJ5IHRvIGVtYmVkIHN0cnVjdCBkbWFfc2xhdmVfY29uZmlnIGluIHRoZWlyIGNvbnRyb2xsZXIKKyAgIHNwZWNpZmljIHN0cnVjdHVyZS4gVGhhdCBnaXZlcyBmbGV4aWJpbGl0eSB0byBjbGllbnQgdG8gcGFzcyBtb3JlCisgICBwYXJhbWV0ZXJzLCBpZiByZXF1aXJlZC4KKworICAgSW50ZXJmYWNlOgorCWludCBkbWFlbmdpbmVfc2xhdmVfY29uZmlnKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwKKwkJCQkgIHN0cnVjdCBkbWFfc2xhdmVfY29uZmlnICpjb25maWcpCisKKyAgIFBsZWFzZSBzZWUgdGhlIGRtYV9zbGF2ZV9jb25maWcgc3RydWN0dXJlIGRlZmluaXRpb24gaW4gZG1hZW5naW5lLmgKKyAgIGZvciBhIGRldGFpbGVkIGV4cGxhaW5hdGlvbiBvZiB0aGUgc3RydWN0IG1lbWJlcnMuICBQbGVhc2Ugbm90ZQorICAgdGhhdCB0aGUgJ2RpcmVjdGlvbicgbWVtYmVyIHdpbGwgYmUgZ29pbmcgYXdheSBhcyBpdCBkdXBsaWNhdGVzIHRoZQorICAgZGlyZWN0aW9uIGdpdmVuIGluIHRoZSBwcmVwYXJlIGNhbGwuCiAKIDMuIEdldCBhIGRlc2NyaXB0b3IgZm9yIHRyYW5zYWN0aW9uCi1Gb3Igc2xhdmUgdXNhZ2UgdGhlIHZhcmlvdXMgbW9kZXMgb2Ygc2xhdmUgdHJhbnNmZXJzIHN1cHBvcnRlZCBieSB0aGUKLURNQS1lbmdpbmUgYXJlOgotc2xhdmVfc2cJLSBETUEgYSBsaXN0IG9mIHNjYXR0ZXIgZ2F0aGVyIGJ1ZmZlcnMgZnJvbS90byBhIHBlcmlwaGVyYWwKLWRtYV9jeWNsaWMJLSBQZXJmb3JtIGEgY3ljbGljIERNQSBvcGVyYXRpb24gZnJvbS90byBhIHBlcmlwaGVyYWwgdGlsbCB0aGUKKworICAgRm9yIHNsYXZlIHVzYWdlIHRoZSB2YXJpb3VzIG1vZGVzIG9mIHNsYXZlIHRyYW5zZmVycyBzdXBwb3J0ZWQgYnkgdGhlCisgICBETUEtZW5naW5lIGFyZToKKworICAgc2xhdmVfc2cJLSBETUEgYSBsaXN0IG9mIHNjYXR0ZXIgZ2F0aGVyIGJ1ZmZlcnMgZnJvbS90byBhIHBlcmlwaGVyYWwKKyAgIGRtYV9jeWNsaWMJLSBQZXJmb3JtIGEgY3ljbGljIERNQSBvcGVyYXRpb24gZnJvbS90byBhIHBlcmlwaGVyYWwgdGlsbCB0aGUKIAkJICBvcGVyYXRpb24gaXMgZXhwbGljaXRseSBzdG9wcGVkLgotVGhlIG5vbiBOVUxMIHJldHVybiBvZiB0aGlzIHRyYW5zZmVyIEFQSSByZXByZXNlbnRzIGEgImRlc2NyaXB0b3IiIGZvciB0aGUgZ2l2ZW4KLXRyYW5zYWN0aW9uLgogCi1JbnRlcmZhY2U6Ci1zdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKigqY2hhbi0+ZGV2aWNlLT5kZXZpY2VfcHJlcF9kbWFfc2cpKAotCQlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sCi0JCXN0cnVjdCBzY2F0dGVybGlzdCAqZHN0X3NnLCB1bnNpZ25lZCBpbnQgZHN0X25lbnRzLAotCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyY19zZywgdW5zaWduZWQgaW50IHNyY19uZW50cywKKyAgIEEgbm9uLU5VTEwgcmV0dXJuIG9mIHRoaXMgdHJhbnNmZXIgQVBJIHJlcHJlc2VudHMgYSAiZGVzY3JpcHRvciIgZm9yCisgICB0aGUgZ2l2ZW4gdHJhbnNhY3Rpb24uCisKKyAgIEludGVyZmFjZToKKwlzdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKigqY2hhbi0+ZGV2aWNlLT5kZXZpY2VfcHJlcF9zbGF2ZV9zZykoCisJCXN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsCisJCXVuc2lnbmVkIGludCBzZ19sZW4sIGVudW0gZG1hX2RhdGFfZGlyZWN0aW9uIGRpcmVjdGlvbiwKIAkJdW5zaWduZWQgbG9uZyBmbGFncyk7Ci1zdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKigqY2hhbi0+ZGV2aWNlLT5kZXZpY2VfcHJlcF9kbWFfY3ljbGljKSgKKworCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqKCpjaGFuLT5kZXZpY2UtPmRldmljZV9wcmVwX2RtYV9jeWNsaWMpKAogCQlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIGRtYV9hZGRyX3QgYnVmX2FkZHIsIHNpemVfdCBidWZfbGVuLAogCQlzaXplX3QgcGVyaW9kX2xlbiwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uKTsKIAotNC4gU3VibWl0IHRoZSB0cmFuc2FjdGlvbiBhbmQgd2FpdCBmb3IgY2FsbGJhY2sgbm90aWZpY2F0aW9uCi1UbyBzY2hlZHVsZSB0aGUgdHJhbnNhY3Rpb24gdG8gYmUgc2NoZWR1bGVkIGJ5IGRtYSBkZXZpY2UsIHRoZSAiZGVzY3JpcHRvciIKLXJldHVybmVkIGluIGFib3ZlICgzKSBuZWVkcyB0byBiZSBzdWJtaXR0ZWQuCi1UbyB0ZWxsIHRoZSBkbWEgZHJpdmVyIHRoYXQgYSB0cmFuc2FjdGlvbiBpcyByZWFkeSB0byBiZSBzZXJ2aWNlZCwgdGhlCi1kZXNjcmlwdG9yLT5zdWJtaXQoKSBjYWxsYmFjayBuZWVkcyB0byBiZSBpbnZva2VkLiBUaGlzIGNoYWlucyB0aGUgZGVzY3JpcHRvciB0bwotdGhlIHBlbmRpbmcgcXVldWUuCi1UaGUgdHJhbnNhY3Rpb25zIGluIHRoZSBwZW5kaW5nIHF1ZXVlIGNhbiBiZSBhY3RpdmF0ZWQgYnkgY2FsbGluZyB0aGUKLWlzc3VlX3BlbmRpbmcgQVBJLiBJZiBjaGFubmVsIGlzIGlkbGUgdGhlbiB0aGUgZmlyc3QgdHJhbnNhY3Rpb24gaW4gcXVldWUgaXMKLXN0YXJ0ZWQgYW5kIHN1YnNlcXVlbnQgb25lcyBxdWV1ZWQgdXAuCi1PbiBjb21wbGV0aW9uIG9mIHRoZSBETUEgb3BlcmF0aW9uIHRoZSBuZXh0IGluIHF1ZXVlIGlzIHN1Ym1pdHRlZCBhbmQgYSB0YXNrbGV0Ci10cmlnZ2VyZWQuIFRoZSB0YXNrbGV0IHdvdWxkIHRoZW4gY2FsbCB0aGUgY2xpZW50IGRyaXZlciBjb21wbGV0aW9uIGNhbGxiYWNrCi1yb3V0aW5lIGZvciBub3RpZmljYXRpb24sIGlmIHNldC4KLUludGVyZmFjZToKLXZvaWQgZG1hX2FzeW5jX2lzc3VlX3BlbmRpbmcoc3RydWN0IGRtYV9jaGFuICpjaGFuKTsKKyAgIFRoZSBwZXJpcGhlcmFsIGRyaXZlciBpcyBleHBlY3RlZCB0byBoYXZlIG1hcHBlZCB0aGUgc2NhdHRlcmxpc3QgZm9yCisgICB0aGUgRE1BIG9wZXJhdGlvbiBwcmlvciB0byBjYWxsaW5nIGRldmljZV9wcmVwX3NsYXZlX3NnLCBhbmQgbXVzdAorICAga2VlcCB0aGUgc2NhdHRlcmxpc3QgbWFwcGVkIHVudGlsIHRoZSBETUEgb3BlcmF0aW9uIGhhcyBjb21wbGV0ZWQuCisgICBUaGUgc2NhdHRlcmxpc3QgbXVzdCBiZSBtYXBwZWQgdXNpbmcgdGhlIERNQSBzdHJ1Y3QgZGV2aWNlLiAgU28sCisgICBub3JtYWwgc2V0dXAgc2hvdWxkIGxvb2sgbGlrZSB0aGlzOgogCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlucl9zZyA9IGRtYV9tYXBfc2coY2hhbi0+ZGV2aWNlLT5kZXYsIHNnbCwgc2dfbGVuKTsKKwlpZiAobnJfc2cgPT0gMCkKKwkJLyogZXJyb3IgKi8KIAotQWRkaXRpb25hbCB1c2FnZSBub3RlcyBmb3IgZG1hIGRyaXZlciB3cml0ZXJzCi0xLyBBbHRob3VnaCBETUEgZW5naW5lIHNwZWNpZmllcyB0aGF0IGNvbXBsZXRpb24gY2FsbGJhY2sgcm91dGluZXMgY2Fubm90IHN1Ym1pdAotYW55IG5ldyBvcGVyYXRpb25zLCBidXQgdHlwaWNhbGx5IGZvciBzbGF2ZSBETUEgc3Vic2VxdWVudCB0cmFuc2FjdGlvbiBtYXkgbm90Ci1iZSBhdmFpbGFibGUgZm9yIHN1Ym1pdCBwcmlvciB0byBjYWxsYmFjayByb3V0aW5lIGJlaW5nIGNhbGxlZC4gVGhpcyByZXF1aXJlbWVudAotaXMgbm90IGEgcmVxdWlyZW1lbnQgZm9yIERNQS1zbGF2ZSBkZXZpY2VzLiBCdXQgdGhleSBzaG91bGQgdGFrZSBjYXJlIHRvIGRyb3AKLXRoZSBzcGluLWxvY2sgdGhleSBtaWdodCBiZSBob2xkaW5nIGJlZm9yZSBjYWxsaW5nIHRoZSBjYWxsYmFjayByb3V0aW5lCisJZGVzYyA9IGNoYW4tPmRldmljZS0+ZGV2aWNlX3ByZXBfc2xhdmVfc2coY2hhbiwgc2dsLCBucl9zZywKKwkJCWRpcmVjdGlvbiwgZmxhZ3MpOworCisgICBPbmNlIGEgZGVzY3JpcHRvciBoYXMgYmVlbiBvYnRhaW5lZCwgdGhlIGNhbGxiYWNrIGluZm9ybWF0aW9uIGNhbiBiZQorICAgYWRkZWQgYW5kIHRoZSBkZXNjcmlwdG9yIG11c3QgdGhlbiBiZSBzdWJtaXR0ZWQuICBTb21lIERNQSBlbmdpbmUKKyAgIGRyaXZlcnMgbWF5IGhvbGQgYSBzcGlubG9jayBiZXR3ZWVuIGEgc3VjY2Vzc2Z1bCBwcmVwYXJhdGlvbiBhbmQKKyAgIHN1Ym1pc3Npb24gc28gaXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlc2UgdHdvIG9wZXJhdGlvbnMgYXJlIGNsb3NlbHkKKyAgIHBhaXJlZC4KKworICAgTm90ZToKKwlBbHRob3VnaCB0aGUgYXN5bmNfdHggQVBJIHNwZWNpZmllcyB0aGF0IGNvbXBsZXRpb24gY2FsbGJhY2sKKwlyb3V0aW5lcyBjYW5ub3Qgc3VibWl0IGFueSBuZXcgb3BlcmF0aW9ucywgdGhpcyBpcyBub3QgdGhlCisJY2FzZSBmb3Igc2xhdmUvY3ljbGljIERNQS4KKworCUZvciBzbGF2ZSBETUEsIHRoZSBzdWJzZXF1ZW50IHRyYW5zYWN0aW9uIG1heSBub3QgYmUgYXZhaWxhYmxlCisJZm9yIHN1Ym1pc3Npb24gcHJpb3IgdG8gY2FsbGJhY2sgZnVuY3Rpb24gYmVpbmcgaW52b2tlZCwgc28KKwlzbGF2ZSBETUEgY2FsbGJhY2tzIGFyZSBwZXJtaXR0ZWQgdG8gcHJlcGFyZSBhbmQgc3VibWl0IGEgbmV3CisJdHJhbnNhY3Rpb24uCisKKwlGb3IgY3ljbGljIERNQSwgYSBjYWxsYmFjayBmdW5jdGlvbiBtYXkgd2lzaCB0byB0ZXJtaW5hdGUgdGhlCisJRE1BIHZpYSBkbWFlbmdpbmVfdGVybWluYXRlX2FsbCgpLgorCisJVGhlcmVmb3JlLCBpdCBpcyBpbXBvcnRhbnQgdGhhdCBETUEgZW5naW5lIGRyaXZlcnMgZHJvcCBhbnkKKwlsb2NrcyBiZWZvcmUgY2FsbGluZyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggbWF5IGNhdXNlIGEKKwlkZWFkbG9jay4KKworCU5vdGUgdGhhdCBjYWxsYmFja3Mgd2lsbCBhbHdheXMgYmUgaW52b2tlZCBmcm9tIHRoZSBETUEKKwllbmdpbmVzIHRhc2tsZXQsIG5ldmVyIGZyb20gaW50ZXJydXB0IGNvbnRleHQuCisKKzQuIFN1Ym1pdCB0aGUgdHJhbnNhY3Rpb24KKworICAgT25jZSB0aGUgZGVzY3JpcHRvciBoYXMgYmVlbiBwcmVwYXJlZCBhbmQgdGhlIGNhbGxiYWNrIGluZm9ybWF0aW9uCisgICBhZGRlZCwgaXQgbXVzdCBiZSBwbGFjZWQgb24gdGhlIERNQSBlbmdpbmUgZHJpdmVycyBwZW5kaW5nIHF1ZXVlLgorCisgICBJbnRlcmZhY2U6CisJZG1hX2Nvb2tpZV90IGRtYWVuZ2luZV9zdWJtaXQoc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXNjKQorCisgICBUaGlzIHJldHVybnMgYSBjb29raWUgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhlIHByb2dyZXNzIG9mIERNQSBlbmdpbmUKKyAgIGFjdGl2aXR5IHZpYSBvdGhlciBETUEgZW5naW5lIGNhbGxzIG5vdCBjb3ZlcmVkIGluIHRoaXMgZG9jdW1lbnQuCisKKyAgIGRtYWVuZ2luZV9zdWJtaXQoKSB3aWxsIG5vdCBzdGFydCB0aGUgRE1BIG9wZXJhdGlvbiwgaXQgbWVyZWx5IGFkZHMKKyAgIGl0IHRvIHRoZSBwZW5kaW5nIHF1ZXVlLiAgRm9yIHRoaXMsIHNlZSBzdGVwIDUsIGRtYV9hc3luY19pc3N1ZV9wZW5kaW5nLgorCis1LiBJc3N1ZSBwZW5kaW5nIERNQSByZXF1ZXN0cyBhbmQgd2FpdCBmb3IgY2FsbGJhY2sgbm90aWZpY2F0aW9uCisKKyAgIFRoZSB0cmFuc2FjdGlvbnMgaW4gdGhlIHBlbmRpbmcgcXVldWUgY2FuIGJlIGFjdGl2YXRlZCBieSBjYWxsaW5nIHRoZQorICAgaXNzdWVfcGVuZGluZyBBUEkuIElmIGNoYW5uZWwgaXMgaWRsZSB0aGVuIHRoZSBmaXJzdCB0cmFuc2FjdGlvbiBpbgorICAgcXVldWUgaXMgc3RhcnRlZCBhbmQgc3Vic2VxdWVudCBvbmVzIHF1ZXVlZCB1cC4KKworICAgT24gY29tcGxldGlvbiBvZiBlYWNoIERNQSBvcGVyYXRpb24sIHRoZSBuZXh0IGluIHF1ZXVlIGlzIHN0YXJ0ZWQgYW5kCisgICBhIHRhc2tsZXQgdHJpZ2dlcmVkLiBUaGUgdGFza2xldCB3aWxsIHRoZW4gY2FsbCB0aGUgY2xpZW50IGRyaXZlcgorICAgY29tcGxldGlvbiBjYWxsYmFjayByb3V0aW5lIGZvciBub3RpZmljYXRpb24sIGlmIHNldC4KKworICAgSW50ZXJmYWNlOgorCXZvaWQgZG1hX2FzeW5jX2lzc3VlX3BlbmRpbmcoc3RydWN0IGRtYV9jaGFuICpjaGFuKTsKKworRnVydGhlciBBUElzOgorCisxLiBpbnQgZG1hZW5naW5lX3Rlcm1pbmF0ZV9hbGwoc3RydWN0IGRtYV9jaGFuICpjaGFuKQorCisgICBUaGlzIGNhdXNlcyBhbGwgYWN0aXZpdHkgZm9yIHRoZSBETUEgY2hhbm5lbCB0byBiZSBzdG9wcGVkLCBhbmQgbWF5CisgICBkaXNjYXJkIGRhdGEgaW4gdGhlIERNQSBGSUZPIHdoaWNoIGhhc24ndCBiZWVuIGZ1bGx5IHRyYW5zZmVycmVkLgorICAgTm8gY2FsbGJhY2sgZnVuY3Rpb25zIHdpbGwgYmUgY2FsbGVkIGZvciBhbnkgaW5jb21wbGV0ZSB0cmFuc2ZlcnMuCisKKzIuIGludCBkbWFlbmdpbmVfcGF1c2Uoc3RydWN0IGRtYV9jaGFuICpjaGFuKQorCisgICBUaGlzIHBhdXNlcyBhY3Rpdml0eSBvbiB0aGUgRE1BIGNoYW5uZWwgd2l0aG91dCBkYXRhIGxvc3MuCisKKzMuIGludCBkbWFlbmdpbmVfcmVzdW1lKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKKworICAgUmVzdW1lIGEgcHJldmlvdXNseSBwYXVzZWQgRE1BIGNoYW5uZWwuICBJdCBpcyBpbnZhbGlkIHRvIHJlc3VtZSBhCisgICBjaGFubmVsIHdoaWNoIGlzIG5vdCBjdXJyZW50bHkgcGF1c2VkLgorCis0LiBlbnVtIGRtYV9zdGF0dXMgZG1hX2FzeW5jX2lzX3R4X2NvbXBsZXRlKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwKKyAgICAgICAgZG1hX2Nvb2tpZV90IGNvb2tpZSwgZG1hX2Nvb2tpZV90ICpsYXN0LCBkbWFfY29va2llX3QgKnVzZWQpCisKKyAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgY2hhbm5lbC4gIFBsZWFzZSBzZWUKKyAgIHRoZSBkb2N1bWVudGF0aW9uIGluIGluY2x1ZGUvbGludXgvZG1hZW5naW5lLmggZm9yIGEgbW9yZSBjb21wbGV0ZQorICAgZGVzY3JpcHRpb24gb2YgdGhpcyBBUEkuCisKKyAgIFRoaXMgY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBkbWFfYXN5bmNfaXNfY29tcGxldGUoKSBhbmQKKyAgIHRoZSBjb29raWUgcmV0dXJuZWQgZnJvbSAnZGVzY3JpcHRvci0+c3VibWl0KCknIHRvIGNoZWNrIGZvcgorICAgY29tcGxldGlvbiBvZiBhIHNwZWNpZmljIERNQSB0cmFuc2FjdGlvbi4KKworICAgTm90ZToKKwlOb3QgYWxsIERNQSBlbmdpbmUgZHJpdmVycyBjYW4gcmV0dXJuIHJlbGlhYmxlIGluZm9ybWF0aW9uIGZvcgorCWEgcnVubmluZyBETUEgY2hhbm5lbC4gIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgRE1BIGVuZ2luZSB1c2VycworCXBhdXNlIG9yIHN0b3AgKHZpYSBkbWFlbmdpbmVfdGVybWluYXRlX2FsbCkgdGhlIGNoYW5uZWwgYmVmb3JlCisJdXNpbmcgdGhpcyBBUEkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2R2Yi9nZXRfZHZiX2Zpcm13YXJlIGIvRG9jdW1lbnRhdGlvbi9kdmIvZ2V0X2R2Yl9maXJtd2FyZQpvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDMzNDhkMzEuLmM0NjZmNTgKLS0tIGEvRG9jdW1lbnRhdGlvbi9kdmIvZ2V0X2R2Yl9maXJtd2FyZQorKysgYi9Eb2N1bWVudGF0aW9uL2R2Yi9nZXRfZHZiX2Zpcm13YXJlCkBAIC0yNyw3ICsyNyw3IEBACiAJCSJvcjUxMjExIiwgIm9yNTExMzJfcWFtIiwgIm9yNTExMzJfdnNiIiwgImJsdWViaXJkIiwKIAkJIm9wZXJhMSIsICJjeDIzMXh4IiwgImN4MTgiLCAiY3gyMzg4NSIsICJwdnJ1c2IyIiwgIm1wYzcxOCIsCiAJCSJhZjkwMTUiLCAibmdlbmUiLCAiYXo2MDI3IiwgImxtZTI1MTBfbGciLCAibG1lMjUxMGNfczczOTUiLAotCQkibG1lMjUxMGNfczczOTVfb2xkIik7CisJCSJsbWUyNTEwY19zNzM5NV9vbGQiLCAiZHJ4ayIsICJkcnhrX3RlcnJhdGVjX2g1Iik7CiAKICMgQ2hlY2sgYXJncwogc3ludGF4KCkgaWYgKHNjYWxhcihAQVJHVikgIT0gMSk7CkBAIC02MzQsNiArNjM0LDM3IEBACiAgICAgJG91dGZpbGU7CiB9CiAKK3N1YiBkcnhrIHsKKyAgICBteSAkdXJsID0gImh0dHA6Ly9sNG0tZGF0ZW4uZGUvZmlsZXMvIjsKKyAgICBteSAkemlwZmlsZSA9ICJERFR1bmVyLnppcCI7CisgICAgbXkgJGhhc2ggPSAiZjVhMzdiOWEyMGEzNTM0OTk3OTk3YzBiMTM4MmEzZTUiOworICAgIG15ICR0bXBkaXIgPSB0ZW1wZGlyKERJUiA9PiAiL3RtcCIsIENMRUFOVVAgPT4gMSk7CisgICAgbXkgJGRydmZpbGUgPSAiRERUdW5lci5zeXMiOworICAgIG15ICRmd2ZpbGUgPSAiZHJ4a19hMy5tYyI7CisKKyAgICBjaGVja3N0YW5kYXJkKCk7CisKKyAgICB3Z2V0ZmlsZSgkemlwZmlsZSwgJHVybCAuICR6aXBmaWxlKTsKKyAgICB2ZXJpZnkoJHppcGZpbGUsICRoYXNoKTsKKyAgICB1bnppcCgkemlwZmlsZSwgJHRtcGRpcik7CisgICAgZXh0cmFjdCgiJHRtcGRpci8kZHJ2ZmlsZSIsIDB4MTRkZDgsIDE1NjM0LCAiJGZ3ZmlsZSIpOworCisgICAgIiRmd2ZpbGUiCit9CisKK3N1YiBkcnhrX3RlcnJhdGVjX2g1IHsKKyAgICBteSAkdXJsID0gImh0dHA6Ly93d3cubGludXh0di5vcmcvZG93bmxvYWRzL2Zpcm13YXJlLyI7CisgICAgbXkgJGhhc2ggPSAiMTkwMDBkYWRhOGUyNzQxMTYyY2NjNTBjYzkxZmE3ZjEiOworICAgIG15ICRmd2ZpbGUgPSAiZHZiLXVzYi10ZXJyYXRlYy1oNS1kcnhrLmZ3IjsKKworICAgIGNoZWNrc3RhbmRhcmQoKTsKKworICAgIHdnZXRmaWxlKCRmd2ZpbGUsICR1cmwgLiAkZndmaWxlKTsKKyAgICB2ZXJpZnkoJGZ3ZmlsZSwgJGhhc2gpOworCisgICAgIiRmd2ZpbGUiCit9CisKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIFV0aWxpdGllcwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi9mYXVsdC1pbmplY3Rpb24udHh0IGIvRG9jdW1lbnRhdGlvbi9mYXVsdC1pbmplY3Rpb24vZmF1bHQtaW5qZWN0aW9uLnR4dAppbmRleCA3YmUxNWU0Li44MmE1ZDI1IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2ZhdWx0LWluamVjdGlvbi9mYXVsdC1pbmplY3Rpb24udHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmF1bHQtaW5qZWN0aW9uL2ZhdWx0LWluamVjdGlvbi50eHQKQEAgLTE0Myw4ICsxNDMsNyBAQAogICBmYWlsc2xhYiwgZmFpbF9wYWdlX2FsbG9jLCBhbmQgZmFpbF9tYWtlX3JlcXVlc3QgdXNlIHRoaXMgd2F5LgogICBIZWxwZXIgZnVuY3Rpb25zOgogCi0JaW5pdF9mYXVsdF9hdHRyX2RlbnRyaWVzKGVudHJpZXMsIGF0dHIsIG5hbWUpOwotCXZvaWQgY2xlYW51cF9mYXVsdF9hdHRyX2RlbnRyaWVzKGVudHJpZXMpOworCWZhdWx0X2NyZWF0ZV9kZWJ1Z2ZzX2F0dHIobmFtZSwgcGFyZW50LCBhdHRyKTsKIAogLSBtb2R1bGUgcGFyYW1ldGVycwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKaW5kZXggZGZkNmE5Zi4uNDNmNDgwOSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dApAQCAtMjk2LDE1ICsyOTYsNiBAQAogCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotV2hhdDoJQ09ORklHX1RIRVJNQUxfSFdNT04KLVdoZW46CUphbnVhcnkgMjAwOQotV2h5OglUaGlzIG9wdGlvbiB3YXMgaW50cm9kdWNlZCBqdXN0IHRvIGFsbG93IG9sZGVyIGxtLXNlbnNvcnMgdXNlcnNwYWNlCi0JdG8ga2VlcCB3b3JraW5nIG92ZXIgdGhlIHVwZ3JhZGUgdG8gMi42LjI2LiBBdCB0aGUgc2NoZWR1bGVkIHRpbWUgb2YKLQlyZW1vdmFsIGZpeGVkIGxtLXNlbnNvcnMgKDIueCBvciAzLngpIHNob3VsZCBiZSByZWFkaWx5IGF2YWlsYWJsZS4KLVdobzoJUmVuZSBIZXJtYW4gPHJlbmUuaGVybWFuQGdtYWlsLmNvbT4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KIFdoYXQ6CUNvZGUgdGhhdCBpcyBub3cgdW5kZXIgQ09ORklHX1dJUkVMRVNTX0VYVF9TWVNGUwogCShpbiBuZXQvY29yZS9uZXQtc3lzZnMuYykKIFdoZW46CUFmdGVyIHRoZSBvbmx5IHVzZXIgKGhhbCkgaGFzIHNlZW4gYSByZWxlYXNlIHdpdGggdGhlIHBhdGNoZXMKQEAgLTUyNyw2ICs1MTgsNDEgQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitXaGF0OglTdXBwb3J0IGZvciBkcml2ZXIgc3BlY2lmaWMgaW9jdGxzIGluIHRoZSBwd2MgZHJpdmVyIChldmVyeXRoaW5nCisJZGVmaW5lZCBpbiBtZWRpYS9wd2MtaW9jdGwuaCkKK1doZW46CTMuMworV2h5OglUaGlzIHN0ZW1zIGZyb20gdGhlIHY0bDEgZXJhLCB3aXRoIHY0bDIgZXZlcnl0aGluZyBjYW4gYmUgZG9uZSB3aXRoCisJc3RhbmRhcmRpemVkIHY0bDIgQVBJIGNhbGxzCitXaG86CUhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hhdDoJRHJpdmVyIHNwZWNpZmljIHN5c2ZzIEFQSSBpbiB0aGUgcHdjIGRyaXZlcgorV2hlbjoJMy4zCitXaHk6CVNldHRpbmcgcGFuL3RpbHQgc2hvdWxkIGJlIGRvbmUgd2l0aCB2NGwyIGNvbnRyb2xzLCBsaWtlIHdpdGggb3RoZXIKKwljYW1zLiBUaGUgYnV0dG9uIGlzIGF2YWlsYWJsZSBhcyBhIHN0YW5kYXJkIGlucHV0IGRldmljZQorV2hvOglIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doYXQ6CURyaXZlciBzcGVjaWZpYyB1c2Ugb2YgcGl4Zm10LnByaXYgaW4gdGhlIHB3YyBkcml2ZXIKK1doZW46CTMuMworV2h5OglUaGUgLnByaXYgZmllbGQgbmV2ZXIgd2FzIGludGVuZGVkIGZvciB0aGlzLCBzZXR0aW5nIGEgZnJhbWVyYXRlIGlzCisJc3VwcG9ydCB1c2luZyB0aGUgc3RhbmRhcmRpemVkIFNfUEFSTSBpb2N0bAorV2hvOglIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1doYXQ6CVNvZnR3YXJlIGVtdWxhdGlvbiBvZiBhcmJyaXRhcnkgcmVzb2x1dGlvbnMgaW4gdGhlIHB3YyBkcml2ZXIKK1doZW46CTMuMworV2h5OglUaGUgcHdjIGRyaXZlciBjbGFpbXMgdG8gc3VwcG9ydCBhbnkgcmVzb2x1dGlvbiBiZXR3ZWVuIDE2MHgxMjAKKwlhbmQgNjQweDQ4MCwgYnV0IGVtdWxhdGVzIHRoaXMgYnkgc2ltcGx5IGRyYXdpbmcgYSBibGFjayBib3JkZXIKKwlhcm91bmQgdGhlIGltYWdlLiBVc2Vyc3BhY2UgY2FuIGRyYXcgaXRzIG93biBibGFjayBib3JkZXIgaWYgaXQKKwlyZWFsbHkgd2FudHMgb25lLgorV2hvOglIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIFdoYXQ6CUZvciBWSURJT0NfU19GUkVRVUVOQ1kgdGhlIHR5cGUgZmllbGQgbXVzdCBtYXRjaCB0aGUgZGV2aWNlIG5vZGUncyB0eXBlLgogCUlmIG5vdCwgcmV0dXJuIC1FSU5WQUwuCiBXaGVuOgkzLjIKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZnJ2L2Jvb3RpbmcudHh0IGIvRG9jdW1lbnRhdGlvbi9mcnYvYm9vdGluZy50eHQKaW5kZXggYWNlMjAwYi4uMzdjNGQ4NCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mcnYvYm9vdGluZy50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9mcnYvYm9vdGluZy50eHQKQEAgLTEwNiwxMyArMTA2LDIwIEBACiAgICAgICBUbyB1c2UgdGhlIGZpcnN0IG9uLWNoaXAgc2VyaWFsIHBvcnQgYXQgYmF1ZCByYXRlIDExNTIwMCwgbm8gcGFyaXR5LCA4CiAgICAgICBiaXRzLCBhbmQgbm8gZmxvdyBjb250cm9sLgogCi0gICgqKSByb290PS9kZXYvPHh4eHg+CisgICgqKSByb290PTx4eHh4PgogCi0gICAgICBUaGlzIHNwZWNpZmllcyB0aGUgZGV2aWNlIHVwb24gd2hpY2ggdGhlIHJvb3QgZmlsZXN5c3RlbSByZXNpZGVzLiBGb3IKLSAgICAgIGV4YW1wbGU6CisgICAgICBUaGlzIHNwZWNpZmllcyB0aGUgZGV2aWNlIHVwb24gd2hpY2ggdGhlIHJvb3QgZmlsZXN5c3RlbSByZXNpZGVzLiBJdAorICAgICAgbWF5IGJlIHNwZWNpZmllZCBieSBtYWpvciBhbmQgbWlub3IgbnVtYmVyLCBkZXZpY2UgcGF0aCwgb3IgZXZlbgorICAgICAgcGFydGl0aW9uIHV1aWQsIGlmIHN1cHBvcnRlZC4gIEZvciBleGFtcGxlOgogCiAJL2Rldi9uZnMJTkZTIHJvb3QgZmlsZXN5c3RlbQogCS9kZXYvbXRkYmxvY2szCUZvdXJ0aCBSZWRCb290IHBhcnRpdGlvbiBvbiB0aGUgU3lzdGVtIEZsYXNoCisJUEFSVFVVSUQ9MDAxMTIyMzMtNDQ1NS02Njc3LTg4OTktQUFCQkNDRERFRUZGL1BBUlROUk9GRj0xCisJCWZpcnN0IHBhcnRpdGlvbiBhZnRlciB0aGUgcGFydGl0aW9uIHdpdGggdGhlIGdpdmVuIFVVSUQKKwkyNTM6MAkJRGV2aWNlIHdpdGggbWFqb3IgMjUzIGFuZCBtaW5vciAwCisKKyAgICAgIEF1dGhvcml0YXRpdmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluCisgICAgICAiRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQiLgogCiAgICgqKSBydwogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkbTEyNzUgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2FkbTEyNzUKaW5kZXggNmEzYTY0Ny4uMDk3YjNjYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9hZG0xMjc1CisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vYWRtMTI3NQpAQCAtNDMsOCArNDMsOCBAQAogU3lzZnMgZW50cmllcwogLS0tLS0tLS0tLS0tLQogCi1UaGUgZm9sbG93aW5nIGF0dHJpYnV0ZXMgYXJlIHN1cHBvcnRlZC4gTGltaXRzIGFyZSByZWFkLXdyaXRlOyBhbGwgb3RoZXIKLWF0dHJpYnV0ZXMgYXJlIHJlYWQtb25seS4KK1RoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgc3VwcG9ydGVkLiBMaW1pdHMgYXJlIHJlYWQtd3JpdGUsIGhpc3RvcnkgcmVzZXQKK2F0dHJpYnV0ZXMgYXJlIHdyaXRlLW9ubHksIGFsbCBvdGhlciBhdHRyaWJ1dGVzIGFyZSByZWFkLW9ubHkuCiAKIGluMV9sYWJlbAkJInZpbjEiIG9yICJ2b3V0MSIgZGVwZW5kaW5nIG9uIGNoaXAgdmFyaWFudCBhbmQKIAkJCWNvbmZpZ3VyYXRpb24uCkBAIC01Myw4ICs1MywxMiBAQAogaW4xX21heAkJCU1heGltdW0gdm9sdGFnZS4gRnJvbSBWT1VUX09WX1dBUk5fTElNSVQgcmVnaXN0ZXIuCiBpbjFfbWluX2FsYXJtCQlWb2x0YWdlIGxvdyBhbGFybS4gRnJvbSBWT0xUQUdFX1VWX1dBUk5JTkcgc3RhdHVzLgogaW4xX21heF9hbGFybQkJVm9sdGFnZSBoaWdoIGFsYXJtLiBGcm9tIFZPTFRBR0VfT1ZfV0FSTklORyBzdGF0dXMuCitpbjFfaGlnaGVzdAkJSGlzdG9yaWNhbCBtYXhpbXVtIHZvbHRhZ2UuCitpbjFfcmVzZXRfaGlzdG9yeQlXcml0ZSBhbnkgdmFsdWUgdG8gcmVzZXQgaGlzdG9yeS4KIAogY3VycjFfbGFiZWwJCSJpb3V0MSIKIGN1cnIxX2lucHV0CQlNZWFzdXJlZCBjdXJyZW50LiBGcm9tIFJFQURfSU9VVCByZWdpc3Rlci4KIGN1cnIxX21heAkJTWF4aW11bSBjdXJyZW50LiBGcm9tIElPVVRfT0NfV0FSTl9MSU1JVCByZWdpc3Rlci4KIGN1cnIxX21heF9hbGFybQkJQ3VycmVudCBoaWdoIGFsYXJtLiBGcm9tIElPVVRfT0NfV0FSTl9MSU1JVCByZWdpc3Rlci4KK2N1cnIxX2hpZ2hlc3QJCUhpc3RvcmljYWwgbWF4aW11bSBjdXJyZW50LgorY3VycjFfcmVzZXRfaGlzdG9yeQlXcml0ZSBhbnkgdmFsdWUgdG8gcmVzZXQgaGlzdG9yeS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vY29yZXRlbXAgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2NvcmV0ZW1wCmluZGV4IGY4NWU5MTMuLmZhODc3NmEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vY29yZXRlbXAKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9jb3JldGVtcApAQCAtMzUsNiArMzUsMTMgQEAKIEFsbCBTeXNmcyBlbnRyaWVzIGFyZSBuYW1lZCB3aXRoIHRoZWlyIGNvcmVfaWQgKHJlcHJlc2VudGVkIGhlcmUgYnkgJ1gnKS4KIHRlbXBYX2lucHV0CSAtIENvcmUgdGVtcGVyYXR1cmUgKGluIG1pbGxpZGVncmVlcyBDZWxzaXVzKS4KIHRlbXBYX21heAkgLSBBbGwgY29vbGluZyBkZXZpY2VzIHNob3VsZCBiZSB0dXJuZWQgb24gKG9uIENvcmUyKS4KKwkJICAgSW5pdGlhbGl6ZWQgd2l0aCBJQTMyX1RIRVJNX0lOVEVSUlVQVC4gV2hlbiB0aGUgQ1BVCisJCSAgIHRlbXBlcmF0dXJlIHJlYWNoZXMgdGhpcyB0ZW1wZXJhdHVyZSwgYW4gaW50ZXJydXB0IGlzCisJCSAgIGdlbmVyYXRlZCBhbmQgdGVtcFhfbWF4X2FsYXJtIGlzIHNldC4KK3RlbXBYX21heF9oeXN0ICAgLSBJZiB0aGUgQ1BVIHRlbXBlcmF0dXJlIGZhbGxzIGJlbG93IHRoYW4gdGVtcGVyYXR1cmUsCisJCSAgIGFuIGludGVycnVwdCBpcyBnZW5lcmF0ZWQgYW5kIHRlbXBYX21heF9hbGFybSBpcyByZXNldC4KK3RlbXBYX21heF9hbGFybSAgLSBTZXQgaWYgdGhlIHRlbXBlcmF0dXJlIHJlYWNoZXMgb3IgZXhjZWVkcyB0ZW1wWF9tYXguCisJCSAgIFJlc2V0IGlmIHRoZSB0ZW1wZXJhdHVyZSBkcm9wcyB0byBvciBiZWxvdyB0ZW1wWF9tYXhfaHlzdC4KIHRlbXBYX2NyaXQJIC0gTWF4aW11bSBqdW5jdGlvbiB0ZW1wZXJhdHVyZSAoaW4gbWlsbGlkZWdyZWVzIENlbHNpdXMpLgogdGVtcFhfY3JpdF9hbGFybSAtIFNldCB3aGVuIE91dC1vZi1zcGVjIGJpdCBpcyBzZXQsIG5ldmVyIGNsZWFycy4KIAkJICAgQ29ycmVjdCBDUFUgb3BlcmF0aW9uIGlzIG5vIGxvbmdlciBndWFyYW50ZWVkLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9sbTI1MDY2IGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTI1MDY2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMWRiODEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL2xtMjUwNjYKQEAgLTAsMCArMSw5MCBAQAorS2VybmVsIGRyaXZlciBtYXg4Njg4Cis9PT09PT09PT09PT09PT09PT09PT0KKworU3VwcG9ydGVkIGNoaXBzOgorICAqIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE0yNTA2NgorICAgIFByZWZpeDogJ2xtMjUwNjYnCisgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IC0KKyAgICBEYXRhc2hlZXRzOgorCWh0dHA6Ly93d3cubmF0aW9uYWwuY29tL3BmL0xNL0xNMjUwNjYuaHRtbAorCWh0dHA6Ly93d3cubmF0aW9uYWwuY29tL3BmL0xNL0xNMjUwNjZBLmh0bWwKKyAgKiBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNTA2NAorICAgIFByZWZpeDogJ2xtNTA2NCcKKyAgICBBZGRyZXNzZXMgc2Nhbm5lZDogLQorICAgIERhdGFzaGVldDoKKwlodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS9wZi9MTS9MTTUwNjQuaHRtbAorICAqIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE01MDY2CisgICAgUHJlZml4OiAnbG01MDY2JworICAgIEFkZHJlc3NlcyBzY2FubmVkOiAtCisgICAgRGF0YXNoZWV0OgorCWh0dHA6Ly93d3cubmF0aW9uYWwuY29tL3BmL0xNL0xNNTA2Ni5odG1sCisKK0F1dGhvcjogR3VlbnRlciBSb2VjayA8Z3VlbnRlci5yb2Vja0Blcmljc3Nvbi5jb20+CisKKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK1RoaXMgZHJpdmVyIHN1cHBvcnRzIGhhcmR3YXJlIG1vbnRvcmluZyBmb3IgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTI1MDY2LAorTE01MDY0LCBhbmQgTE01MDY0IFBvd2VyIE1hbmFnZW1lbnQsIE1vbml0b3JpbmcsIENvbnRyb2wsIGFuZCBQcm90ZWN0aW9uIElDcy4KKworVGhlIGRyaXZlciBpcyBhIGNsaWVudCBkcml2ZXIgdG8gdGhlIGNvcmUgUE1CdXMgZHJpdmVyLiBQbGVhc2Ugc2VlCitEb2N1bWVudGF0aW9uL2h3bW9uL3BtYnVzIGZvciBkZXRhaWxzIG9uIFBNQnVzIGNsaWVudCBkcml2ZXJzLgorCisKK1VzYWdlIE5vdGVzCistLS0tLS0tLS0tLQorCitUaGlzIGRyaXZlciBkb2VzIG5vdCBhdXRvLWRldGVjdCBkZXZpY2VzLiBZb3Ugd2lsbCBoYXZlIHRvIGluc3RhbnRpYXRlIHRoZQorZGV2aWNlcyBleHBsaWNpdGx5LiBQbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vaTJjL2luc3RhbnRpYXRpbmctZGV2aWNlcyBmb3IKK2RldGFpbHMuCisKKworUGxhdGZvcm0gZGF0YSBzdXBwb3J0CistLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGRyaXZlciBzdXBwb3J0cyBzdGFuZGFyZCBQTUJ1cyBkcml2ZXIgcGxhdGZvcm0gZGF0YS4KKworCitTeXNmcyBlbnRyaWVzCistLS0tLS0tLS0tLS0tCisKK1RoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhcmUgc3VwcG9ydGVkLiBMaW1pdHMgYXJlIHJlYWQtd3JpdGU7IGFsbCBvdGhlcgorYXR0cmlidXRlcyBhcmUgcmVhZC1vbmx5LgorCitpbjFfbGFiZWwJCSJ2aW4iCitpbjFfaW5wdXQJCU1lYXN1cmVkIGlucHV0IHZvbHRhZ2UuCitpbjFfYXZlcmFnZQkJQXZlcmFnZSBtZWFzdXJlZCBpbnB1dCB2b2x0YWdlLgoraW4xX21pbgkJCU1pbmltdW0gaW5wdXQgdm9sdGFnZS4KK2luMV9tYXgJCQlNYXhpbXVtIGlucHV0IHZvbHRhZ2UuCitpbjFfbWluX2FsYXJtCQlJbnB1dCB2b2x0YWdlIGxvdyBhbGFybS4KK2luMV9tYXhfYWxhcm0JCUlucHV0IHZvbHRhZ2UgaGlnaCBhbGFybS4KKworaW4yX2xhYmVsCQkidm91dDEiCitpbjJfaW5wdXQJCU1lYXN1cmVkIG91dHB1dCB2b2x0YWdlLgoraW4yX2F2ZXJhZ2UJCUF2ZXJhZ2UgbWVhc3VyZWQgb3V0cHV0IHZvbHRhZ2UuCitpbjJfbWluCQkJTWluaW11bSBvdXRwdXQgdm9sdGFnZS4KK2luMl9taW5fYWxhcm0JCU91dHB1dCB2b2x0YWdlIGxvdyBhbGFybS4KKworaW4zX2xhYmVsCQkidm91dDIiCitpbjNfaW5wdXQJCU1lYXN1cmVkIHZvbHRhZ2Ugb24gdmF1eCBwaW4KKworY3VycjFfbGFiZWwJCSJpaW4iCitjdXJyMV9pbnB1dAkJTWVhc3VyZWQgaW5wdXQgY3VycmVudC4KK2N1cnIxX2F2ZXJhZ2UJCUF2ZXJhZ2UgbWVhc3VyZWQgaW5wdXQgY3VycmVudC4KK2N1cnIxX21heAkJTWF4aW11bSBpbnB1dCBjdXJyZW50LgorY3VycjFfbWF4X2FsYXJtCQlJbnB1dCBjdXJyZW50IGhpZ2ggYWxhcm0uCisKK3Bvd2VyMV9sYWJlbAkJInBpbiIKK3Bvd2VyMV9pbnB1dAkJTWVhc3VyZWQgaW5wdXQgcG93ZXIuCitwb3dlcjFfYXZlcmFnZQkJQXZlcmFnZSBtZWFzdXJlZCBpbnB1dCBwb3dlci4KK3Bvd2VyMV9tYXgJCU1heGltdW0gaW5wdXQgcG93ZXIgbGltaXQuCitwb3dlcjFfYWxhcm0JCUlucHV0IHBvd2VyIGFsYXJtCitwb3dlcjFfaW5wdXRfaGlnaGVzdAlIaXN0b3JpY2FsIG1heGltdW0gcG93ZXIuCitwb3dlcjFfcmVzZXRfaGlzdG9yeQlXcml0ZSBhbnkgdmFsdWUgdG8gcmVzZXQgbWF4aW11bSBwb3dlciBoaXN0b3J5LgorCit0ZW1wMV9pbnB1dAkJTWVhc3VyZWQgdGVtcGVyYXR1cmUuCit0ZW1wMV9tYXgJCU1heGltdW0gdGVtcGVyYXR1cmUuCit0ZW1wMV9jcml0CQlDcml0aWNhbCBoaWdoIHRlbXBlcmF0dXJlLgordGVtcDFfbWF4X2FsYXJtCQlDaGlwIHRlbXBlcmF0dXJlIGhpZ2ggYWxhcm0uCit0ZW1wMV9jcml0X2FsYXJtCUNoaXAgdGVtcGVyYXR1cmUgY3JpdGljYWwgaGlnaCBhbGFybS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vbG05MCBiL0RvY3VtZW50YXRpb24vaHdtb24vbG05MAppbmRleCBmM2VmZDE4Li45Y2QxNGNmZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9sbTkwCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vbG05MApAQCAtMTEzLDcgKzExMywxMSBAQAogICAgIFByZWZpeDogJ3c4M2w3NzEnCiAgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IEkyQyAweDRjCiAgICAgRGF0YXNoZWV0OiBOb3QgcHVibGljbHkgYXZhaWxhYmxlLCBjYW4gYmUgcmVxdWVzdGVkIGZyb20gTnV2b3RvbgotCisgICogUGhpbGlwcy9OWFAgU0E1NjAwNFgKKyAgICBQcmVmaXg6ICdzYTU2MDA0JworICAgIEFkZHJlc3NlcyBzY2FubmVkOiBJMkMgMHg0OCB0aHJvdWdoIDB4NEYKKyAgICBEYXRhc2hlZXQ6IFB1YmxpY2x5IGF2YWlsYWJsZSBhdCBOWFAgd2Vic2l0ZQorICAgICAgICAgICAgICAgaHR0cDovL2ljcy5ueHAuY29tL3Byb2R1Y3RzL2ludGVyZmFjZS9kYXRhc2hlZXQvc2E1NjAwNHgucGRmCiAKIEF1dGhvcjogSmVhbiBEZWx2YXJlIDxraGFsaUBsaW51eC1mci5vcmc+CiAKQEAgLTE5Myw2ICsxOTcsOSBAQAogICAqIFRoZSBBV0cgYW5kIEFTRyB2YXJpYW50cyBvbmx5IGRpZmZlciBpbiBwYWNrYWdlIGZvcm1hdC4KICAgKiBEaW9kZSBpZGVhbGl0eSBmYWN0b3IgY29uZmlndXJhdGlvbiAocmVtb3RlIHNlbnNvcikgYXQgMHhFMwogCitTQTU2MDA0WDoKKyAgKiBCZXR0ZXIgbG9jYWwgcmVzb2x1dGlvbgorCiBBbGwgdGVtcGVyYXR1cmUgdmFsdWVzIGFyZSBnaXZlbiBpbiBkZWdyZWVzIENlbHNpdXMuIFJlc29sdXRpb24KIGlzIDEuMCBkZWdyZWUgZm9yIHRoZSBsb2NhbCB0ZW1wZXJhdHVyZSwgMC4xMjUgZGVncmVlIGZvciB0aGUgcmVtb3RlCiB0ZW1wZXJhdHVyZSwgZXhjZXB0IGZvciB0aGUgTUFYNjY1NywgTUFYNjY1OCBhbmQgTUFYNjY1OSB3aGljaCBoYXZlIGEKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vbG05NTI0NSBiL0RvY3VtZW50YXRpb24vaHdtb24vbG05NTI0NQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmQ4YWVhCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9sbTk1MjQ1CkBAIC0wLDAgKzEsMzMgQEAKK0tlcm5lbCBkcml2ZXIgbG05NTI0NQorPT09PT09PT09PT09PT09PT09CisKK1N1cHBvcnRlZCBjaGlwczoKKyAgKiBOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNOTUyNDUKKyAgICBBZGRyZXNzZXMgc2Nhbm5lZDogSTJDIDB4MTgsIDB4MTksIDB4MjksIDB4NGMsIDB4NGQKKyAgICBEYXRhc2hlZXQ6IFB1YmxpY2x5IGF2YWlsYWJsZSBhdCB0aGUgTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciB3ZWJzaXRlCisgICAgICAgICAgICAgICBodHRwOi8vd3d3Lm5hdGlvbmFsLmNvbS9tcGYvTE0vTE05NTI0NS5odG1sCisKKworQXV0aG9yOiBBbGV4YW5kZXIgU3RlaW4gPGFsZXhhbmRlci5zdGVpbkBzeXN0ZWMtZWxlY3Ryb25pYy5jb20+CisKK0Rlc2NyaXB0aW9uCistLS0tLS0tLS0tLQorCitUaGUgTE05NTI0NSBpcyBhbiAxMS1iaXQgZGlnaXRhbCB0ZW1wZXJhdHVyZSBzZW5zb3Igd2l0aCBhIDItd2lyZSBTeXN0ZW0KK01hbmFnZW1lbnQgQnVzIChTTUJ1cykgaW50ZXJmYWNlIGFuZCBUcnVUaGVybSB0ZWNobm9sb2d5IHRoYXQgY2FuIG1vbml0b3IKK3RoZSB0ZW1wZXJhdHVyZSBvZiBhIHJlbW90ZSBkaW9kZSBhcyB3ZWxsIGFzIGl0cyBvd24gdGVtcGVyYXR1cmUuCitUaGUgTE05NTI0NSBjYW4gYmUgdXNlZCB0byB2ZXJ5IGFjY3VyYXRlbHkgbW9uaXRvciB0aGUgdGVtcGVyYXR1cmUgb2YKK2V4dGVybmFsIGRldmljZXMgc3VjaCBhcyBtaWNyb3Byb2Nlc3NvcnMuCisKK0FsbCB0ZW1wZXJhdHVyZSB2YWx1ZXMgYXJlIGdpdmVuIGluIG1pbGxpZGVncmVlcyBDZWxzaXVzLiBMb2NhbCB0ZW1wZXJhdHVyZQoraXMgZ2l2ZW4gd2l0aGluIGEgcmFuZ2Ugb2YgLTEyNyB0byArMTI3Ljg3NSBkZWdyZWVzLiBSZW1vdGUgdGVtcGVyYXR1cmVzIGFyZQorZ2l2ZW4gd2l0aGluIGEgcmFuZ2Ugb2YgLTEyNyB0byArMjU1IGRlZ3JlZXMuIFJlc29sdXRpb24gZGVwZW5kcyBvbgordGVtcGVyYXR1cmUgaW5wdXQgYW5kIHJhbmdlLgorCitFYWNoIHNlbnNvciBoYXMgaXRzIG93biBjcml0aWNhbCBsaW1pdCwgYnV0IHRoZSBoeXN0ZXJlc2lzIGlzIGNvbW1vbiB0byBhbGwKK3R3byBjaGFubmVscy4KKworVGhlIGxtOTUyNDUgZHJpdmVyIGNhbiBjaGFuZ2UgaXRzIHVwZGF0ZSBpbnRlcnZhbCB0byBhIGZpeGVkIHNldCBvZiB2YWx1ZXMuCitJdCB3aWxsIHJvdW5kIHVwIHRvIHRoZSBuZXh0IHNlbGVjdGFibGUgaW50ZXJ2YWwuIFNlZSB0aGUgZGF0YXNoZWV0IGZvciBleGFjdAordmFsdWVzLiBSZWFkaW5nIHNlbnNvciB2YWx1ZXMgbW9yZSBvZnRlbiB3aWxsIGRvIG5vIGhhcm0sIGJ1dCB3aWxsIHJldHVybgorJ29sZCcgdmFsdWVzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9tYXgxNjA2NCBiL0RvY3VtZW50YXRpb24vaHdtb24vbWF4MTYwNjQKaW5kZXggNDE3Mjg5OS4uZjZlOGJjYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9tYXgxNjA2NAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL21heDE2MDY0CkBAIC01MCw2ICs1MCw4IEBACiBpblsxLTRdX21heF9hbGFybQlWb2x0YWdlIGhpZ2ggYWxhcm0uIEZyb20gVk9MVEFHRV9PVl9XQVJOSU5HIHN0YXR1cy4KIGluWzEtNF1fbGNyaXRfYWxhcm0JVm9sdGFnZSBjcml0aWNhbCBsb3cgYWxhcm0uIEZyb20gVk9MVEFHRV9VVl9GQVVMVCBzdGF0dXMuCiBpblsxLTRdX2NyaXRfYWxhcm0JVm9sdGFnZSBjcml0aWNhbCBoaWdoIGFsYXJtLiBGcm9tIFZPTFRBR0VfT1ZfRkFVTFQgc3RhdHVzLgoraW5bMS00XV9oaWdoZXN0CQlIaXN0b3JpY2FsIG1heGltdW0gdm9sdGFnZS4KK2luWzEtNF1fcmVzZXRfaGlzdG9yeQlXcml0ZSBhbnkgdmFsdWUgdG8gcmVzZXQgaGlzdG9yeS4KIAogdGVtcDFfaW5wdXQJCU1lYXN1cmVkIHRlbXBlcmF0dXJlLiBGcm9tIFJFQURfVEVNUEVSQVRVUkVfMSByZWdpc3Rlci4KIHRlbXAxX21heAkJTWF4aW11bSB0ZW1wZXJhdHVyZS4gRnJvbSBPVF9XQVJOX0xJTUlUIHJlZ2lzdGVyLgpAQCAtNjAsMyArNjIsNSBAQAogdGVtcDFfY3JpdF9hbGFybQlDaGlwIHRlbXBlcmF0dXJlIGNyaXRpY2FsIGhpZ2ggYWxhcm0uIFNldCBieSBjb21wYXJpbmcKIAkJCVJFQURfVEVNUEVSQVRVUkVfMSB3aXRoIE9UX0ZBVUxUX0xJTUlUIGlmIFRFTVBfT1RfRkFVTFQKIAkJCXN0YXR1cyBpcyBzZXQuCit0ZW1wMV9oaWdoZXN0CQlIaXN0b3JpY2FsIG1heGltdW0gdGVtcGVyYXR1cmUuCit0ZW1wMV9yZXNldF9oaXN0b3J5CVdyaXRlIGFueSB2YWx1ZSB0byByZXNldCBoaXN0b3J5LgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9od21vbi9tYXgxNjY4IGIvRG9jdW1lbnRhdGlvbi9od21vbi9tYXgxNjY4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MTZlZDkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL21heDE2NjgKQEAgLTAsMCArMSw2MCBAQAorS2VybmVsIGRyaXZlciBtYXgxNjY4Cis9PT09PT09PT09PT09PT09PT09PT0KKworU3VwcG9ydGVkIGNoaXBzOgorICAqIE1heGltIE1BWDE2NjgsIE1BWDE4MDUgYW5kIE1BWDE5ODkKKyAgICBQcmVmaXg6ICdtYXgxNjY4JworICAgIEFkZHJlc3NlcyBzY2FubmVkOiBJMkMgMHgxOCwgMHgxOSwgMHgxYSwgMHgyOSwgMHgyYSwgMHgyYiwgMHg0YywgMHg0ZCwgMHg0ZQorICAgIERhdGFzaGVldDogaHR0cDovL2RhdGFzaGVldHMubWF4aW0taWMuY29tL2VuL2RzL01BWDE2NjgtTUFYMTk4OS5wZGYKKworQXV0aG9yOgorICAgIERhdmlkIEdlb3JnZSA8ZGF2aWQuZ2VvcmdlQHNrYS5hYy56YT4KKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK1RoaXMgZHJpdmVyIGltcGxlbWVudHMgc3VwcG9ydCBmb3IgdGhlIE1heGltIE1BWDE2NjgsIE1BWDE4MDUgYW5kIE1BWDE5ODkKK2NoaXBzLgorCitUaGUgdGhyZWUgZGV2aWNlcyBhcmUgdmVyeSBzaW1pbGFyLCBidXQgdGhlIE1BWDE4MDUgaGFzIGEgcmVkdWNlZCBmZWF0dXJlCitzZXQ7IG9ubHkgdHdvIHJlbW90ZSB0ZW1wZXJhdHVyZSBpbnB1dHMgdnMgdGhlIGZvdXIgYXZhaWJsZSBvbiB0aGUgb3RoZXIKK3R3byBJQ3MuCisKK1RoZSBkcml2ZXIgaXMgYWJsZSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSBkZXZpY2VzIGFuZCBjcmVhdGVzIHN5c2ZzCitlbnRyaWVzIGFzIGZvbGxvd3M6CisKK01BWDE4MDUsIE1BWDE2NjggYW5kIE1BWDE5ODk6CisKK3RlbXAxX2lucHV0ICAgICBybyBsb2NhbCAoYW1iaWVudCkgdGVtcGVyYXR1cmUKK3RlbXAxX21heCAgICAgICBydyBsb2NhbCB0ZW1wZXJhdHVyZSBtYXhpbXVtIHRocmVzaG9sZCBmb3IgYWxhcm0KK3RlbXAxX21heF9hbGFybSBybyBsb2NhbCB0ZW1wZXJhdHVyZSBtYXhpbXVtIHRocmVzaG9sZCBhbGFybQordGVtcDFfbWluICAgICAgIHJ3IGxvY2FsIHRlbXBlcmF0dXJlIG1pbmltdW0gdGhyZXNob2xkIGZvciBhbGFybQordGVtcDFfbWluX2FsYXJtIHJvIGxvY2FsIHRlbXBlcmF0dXJlIG1pbmltdW0gdGhyZXNob2xkIGFsYXJtCit0ZW1wMl9pbnB1dCAgICAgcm8gcmVtb3RlIHRlbXBlcmF0dXJlIDEKK3RlbXAyX21heCAgICAgICBydyByZW1vdGUgdGVtcGVyYXR1cmUgMSBtYXhpbXVtIHRocmVzaG9sZCBmb3IgYWxhcm0KK3RlbXAyX21heF9hbGFybSBybyByZW1vdGUgdGVtcGVyYXR1cmUgMSBtYXhpbXVtIHRocmVzaG9sZCBhbGFybQordGVtcDJfbWluICAgICAgIHJ3IHJlbW90ZSB0ZW1wZXJhdHVyZSAxIG1pbmltdW0gdGhyZXNob2xkIGZvciBhbGFybQordGVtcDJfbWluX2FsYXJtIHJvIHJlbW90ZSB0ZW1wZXJhdHVyZSAxIG1pbmltdW0gdGhyZXNob2xkIGFsYXJtCit0ZW1wM19pbnB1dCAgICAgcm8gcmVtb3RlIHRlbXBlcmF0dXJlIDIKK3RlbXAzX21heCAgICAgICBydyByZW1vdGUgdGVtcGVyYXR1cmUgMiBtYXhpbXVtIHRocmVzaG9sZCBmb3IgYWxhcm0KK3RlbXAzX21heF9hbGFybSBybyByZW1vdGUgdGVtcGVyYXR1cmUgMiBtYXhpbXVtIHRocmVzaG9sZCBhbGFybQordGVtcDNfbWluICAgICAgIHJ3IHJlbW90ZSB0ZW1wZXJhdHVyZSAyIG1pbmltdW0gdGhyZXNob2xkIGZvciBhbGFybQordGVtcDNfbWluX2FsYXJtIHJvIHJlbW90ZSB0ZW1wZXJhdHVyZSAyIG1pbmltdW0gdGhyZXNob2xkIGFsYXJtCisKK01BWDE2NjggYW5kIE1BWDE5ODkgb25seToKK3RlbXA0X2lucHV0ICAgICBybyByZW1vdGUgdGVtcGVyYXR1cmUgMwordGVtcDRfbWF4ICAgICAgIHJ3IHJlbW90ZSB0ZW1wZXJhdHVyZSAzIG1heGltdW0gdGhyZXNob2xkIGZvciBhbGFybQordGVtcDRfbWF4X2FsYXJtIHJvIHJlbW90ZSB0ZW1wZXJhdHVyZSAzIG1heGltdW0gdGhyZXNob2xkIGFsYXJtCit0ZW1wNF9taW4gICAgICAgcncgcmVtb3RlIHRlbXBlcmF0dXJlIDMgbWluaW11bSB0aHJlc2hvbGQgZm9yIGFsYXJtCit0ZW1wNF9taW5fYWxhcm0gcm8gcmVtb3RlIHRlbXBlcmF0dXJlIDMgbWluaW11bSB0aHJlc2hvbGQgYWxhcm0KK3RlbXA1X2lucHV0ICAgICBybyByZW1vdGUgdGVtcGVyYXR1cmUgNAordGVtcDVfbWF4ICAgICAgIHJ3IHJlbW90ZSB0ZW1wZXJhdHVyZSA0IG1heGltdW0gdGhyZXNob2xkIGZvciBhbGFybQordGVtcDVfbWF4X2FsYXJtIHJvIHJlbW90ZSB0ZW1wZXJhdHVyZSA0IG1heGltdW0gdGhyZXNob2xkIGFsYXJtCit0ZW1wNV9taW4gICAgICAgcncgcmVtb3RlIHRlbXBlcmF0dXJlIDQgbWluaW11bSB0aHJlc2hvbGQgZm9yIGFsYXJtCit0ZW1wNV9taW5fYWxhcm0gcm8gcmVtb3RlIHRlbXBlcmF0dXJlIDQgbWluaW11bSB0aHJlc2hvbGQgYWxhcm0KKworTW9kdWxlIFBhcmFtZXRlcnMKKy0tLS0tLS0tLS0tLS0tLS0tCisKKyogcmVhZF9vbmx5OiBpbnQKKyAgU2V0IHRvIG5vbi16ZXJvIGlmIHlvdSB3aXNoIHRvIHByZXZlbnQgd3JpdGUgYWNjZXNzIHRvIGFsYXJtIHRocmVzaG9sZHMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL21heDM0NDQwIGIvRG9jdW1lbnRhdGlvbi9od21vbi9tYXgzNDQ0MAppbmRleCA2YzUyNWRkLi44YWI1MTUzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL21heDM0NDQwCisrKyBiL0RvY3VtZW50YXRpb24vaHdtb24vbWF4MzQ0NDAKQEAgLTU2LDYgKzU2LDggQEAKIGluWzEtNl1fbWF4X2FsYXJtCVZvbHRhZ2UgaGlnaCBhbGFybS4gRnJvbSBWT0xUQUdFX09WX1dBUk5JTkcgc3RhdHVzLgogaW5bMS02XV9sY3JpdF9hbGFybQlWb2x0YWdlIGNyaXRpY2FsIGxvdyBhbGFybS4gRnJvbSBWT0xUQUdFX1VWX0ZBVUxUIHN0YXR1cy4KIGluWzEtNl1fY3JpdF9hbGFybQlWb2x0YWdlIGNyaXRpY2FsIGhpZ2ggYWxhcm0uIEZyb20gVk9MVEFHRV9PVl9GQVVMVCBzdGF0dXMuCitpblsxLTZdX2hpZ2hlc3QJCUhpc3RvcmljYWwgbWF4aW11bSB2b2x0YWdlLgoraW5bMS02XV9yZXNldF9oaXN0b3J5CVdyaXRlIGFueSB2YWx1ZSB0byByZXNldCBoaXN0b3J5LgogCiBjdXJyWzEtNl1fbGFiZWwJCSJpb3V0WzEtNl0iLgogY3VyclsxLTZdX2lucHV0CQlNZWFzdXJlZCBjdXJyZW50LiBGcm9tIFJFQURfSU9VVCByZWdpc3Rlci4KQEAgLTYzLDYgKzY1LDggQEAKIGN1cnJbMS02XV9jcml0CQlDcml0aWNhbCBtYXhpbXVtIGN1cnJlbnQuIEZyb20gSU9VVF9PQ19GQVVMVF9MSU1JVCByZWdpc3Rlci4KIGN1cnJbMS02XV9tYXhfYWxhcm0JQ3VycmVudCBoaWdoIGFsYXJtLiBGcm9tIElPVVRfT0NfV0FSTklORyBzdGF0dXMuCiBjdXJyWzEtNl1fY3JpdF9hbGFybQlDdXJyZW50IGNyaXRpY2FsIGhpZ2ggYWxhcm0uIEZyb20gSU9VVF9PQ19GQVVMVCBzdGF0dXMuCitjdXJyWzEtNl1faGlnaGVzdAlIaXN0b3JpY2FsIG1heGltdW0gY3VycmVudC4KK2N1cnJbMS02XV9yZXNldF9oaXN0b3J5CVdyaXRlIGFueSB2YWx1ZSB0byByZXNldCBoaXN0b3J5LgogCiAJCQlpbjYgYW5kIGN1cnI2IGF0dHJpYnV0ZXMgb25seSBleGlzdCBmb3IgTUFYMzQ0NDAuCiAKQEAgLTc1LDUgKzc5LDcgQEAKIHRlbXBbMS04XV9jcml0CQlDcml0aWNhbCBoaWdoIHRlbXBlcmF0dXJlLiBGcm9tIE9UX0ZBVUxUX0xJTUlUIHJlZ2lzdGVyLgogdGVtcFsxLThdX21heF9hbGFybQlUZW1wZXJhdHVyZSBoaWdoIGFsYXJtLgogdGVtcFsxLThdX2NyaXRfYWxhcm0JVGVtcGVyYXR1cmUgY3JpdGljYWwgaGlnaCBhbGFybS4KK3RlbXBbMS04XV9oaWdoZXN0CUhpc3RvcmljYWwgbWF4aW11bSB0ZW1wZXJhdHVyZS4KK3RlbXBbMS04XV9yZXNldF9oaXN0b3J5CVdyaXRlIGFueSB2YWx1ZSB0byByZXNldCBoaXN0b3J5LgogCiAJCQl0ZW1wNyBhbmQgdGVtcDggYXR0cmlidXRlcyBvbmx5IGV4aXN0IGZvciBNQVgzNDQ0MC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vbWF4ODY4OCBiL0RvY3VtZW50YXRpb24vaHdtb24vbWF4ODY4OAppbmRleCAwZGRkM2E0Li43MWVkMTBhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2h3bW9uL21heDg2ODgKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9tYXg4Njg4CkBAIC01MCw2ICs1MCw4IEBACiBpbjFfbWF4X2FsYXJtCQlWb2x0YWdlIGhpZ2ggYWxhcm0uIEZyb20gVk9MVEFHRV9PVl9XQVJOSU5HIHN0YXR1cy4KIGluMV9sY3JpdF9hbGFybQkJVm9sdGFnZSBjcml0aWNhbCBsb3cgYWxhcm0uIEZyb20gVk9MVEFHRV9VVl9GQVVMVCBzdGF0dXMuCiBpbjFfY3JpdF9hbGFybQkJVm9sdGFnZSBjcml0aWNhbCBoaWdoIGFsYXJtLiBGcm9tIFZPTFRBR0VfT1ZfRkFVTFQgc3RhdHVzLgoraW4xX2hpZ2hlc3QJCUhpc3RvcmljYWwgbWF4aW11bSB2b2x0YWdlLgoraW4xX3Jlc2V0X2hpc3RvcnkJV3JpdGUgYW55IHZhbHVlIHRvIHJlc2V0IGhpc3RvcnkuCiAKIGN1cnIxX2xhYmVsCQkiaW91dDEiCiBjdXJyMV9pbnB1dAkJTWVhc3VyZWQgY3VycmVudC4gRnJvbSBSRUFEX0lPVVQgcmVnaXN0ZXIuCkBAIC01Nyw2ICs1OSw4IEBACiBjdXJyMV9jcml0CQlDcml0aWNhbCBtYXhpbXVtIGN1cnJlbnQuIEZyb20gSU9VVF9PQ19GQVVMVF9MSU1JVCByZWdpc3Rlci4KIGN1cnIxX21heF9hbGFybQkJQ3VycmVudCBoaWdoIGFsYXJtLiBGcm9tIElPVVRfT0NfV0FSTl9MSU1JVCByZWdpc3Rlci4KIGN1cnIxX2NyaXRfYWxhcm0JQ3VycmVudCBjcml0aWNhbCBoaWdoIGFsYXJtLiBGcm9tIElPVVRfT0NfRkFVTFQgc3RhdHVzLgorY3VycjFfaGlnaGVzdAkJSGlzdG9yaWNhbCBtYXhpbXVtIGN1cnJlbnQuCitjdXJyMV9yZXNldF9oaXN0b3J5CVdyaXRlIGFueSB2YWx1ZSB0byByZXNldCBoaXN0b3J5LgogCiB0ZW1wMV9pbnB1dAkJTWVhc3VyZWQgdGVtcGVyYXR1cmUuIEZyb20gUkVBRF9URU1QRVJBVFVSRV8xIHJlZ2lzdGVyLgogdGVtcDFfbWF4CQlNYXhpbXVtIHRlbXBlcmF0dXJlLiBGcm9tIE9UX1dBUk5fTElNSVQgcmVnaXN0ZXIuCkBAIC02NywzICs3MSw1IEBACiB0ZW1wMV9jcml0X2FsYXJtCUNoaXAgdGVtcGVyYXR1cmUgY3JpdGljYWwgaGlnaCBhbGFybS4gU2V0IGJ5IGNvbXBhcmluZwogCQkJUkVBRF9URU1QRVJBVFVSRV8xIHdpdGggT1RfRkFVTFRfTElNSVQgaWYgVEVNUF9PVF9GQVVMVAogCQkJc3RhdHVzIGlzIHNldC4KK3RlbXAxX2hpZ2hlc3QJCUhpc3RvcmljYWwgbWF4aW11bSB0ZW1wZXJhdHVyZS4KK3RlbXAxX3Jlc2V0X2hpc3RvcnkJV3JpdGUgYW55IHZhbHVlIHRvIHJlc2V0IGhpc3RvcnkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2h3bW9uL250Y190aGVybWlzdG9yIGIvRG9jdW1lbnRhdGlvbi9od21vbi9udGNfdGhlcm1pc3RvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmZkYTk0Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9udGNfdGhlcm1pc3RvcgpAQCAtMCwwICsxLDkzIEBACitLZXJuZWwgZHJpdmVyIG50Y190aGVybWlzdG9yCis9PT09PT09PT09PT09PT09PQorCitTdXBwb3J0ZWQgdGhlcm1pc3RvcnM6CisqIE11cmF0YSBOVEMgVGhlcm1pc3RvcnMgTkNQMTVXQjQ3MywgTkNQMThXQjQ3MywgTkNQMjFXQjQ3MywgTkNQMDNXQjQ3MywgTkNQMTVXTDMzMworICBQcmVmaXhlczogJ25jcDE1d2I0NzMnLCAnbmNwMTh3YjQ3MycsICduY3AyMXdiNDczJywgJ25jcDAzd2I0NzMnLCAnbmNwMTV3bDMzMycKKyAgRGF0YXNoZWV0OiBQdWJsaWNseSBhdmFpbGFibGUgYXQgTXVyYXRhCisKK090aGVyIE5UQyB0aGVybWlzdG9ycyBjYW4gYmUgc3VwcG9ydGVkIHNpbXBseSBieSBhZGRpbmcgY29tcGVuc2F0aW9uCit0YWJsZXM7IGUuZy4sIE5DUDE1V0wzMzMgc3VwcG9ydCBpcyBhZGRlZCBieSB0aGUgdGFibGUgbmNwWFh3bDMzMy4KKworQXV0aG9yczoKKwlNeXVuZ0pvbyBIYW0gPG15dW5nam9vLmhhbUBzYW1zdW5nLmNvbT4KKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK1RoZSBOVEMgdGhlcm1pc3RvciBpcyBhIHNpbXBsZSB0aGVybWlzdG9yIHRoYXQgcmVxdWlyZXMgdXNlcnMgdG8gcHJvdmlkZSB0aGUKK3Jlc2lzdGFuY2UgYW5kIGxvb2t1cCB0aGUgY29ycmVzcG9uZGluZyBjb21wZW5zYXRpb24gdGFibGUgdG8gZ2V0IHRoZQordGVtcGVyYXR1cmUgaW5wdXQuCisKK1RoZSBOVEMgZHJpdmVyIHByb3ZpZGVzIGxvb2t1cCB0YWJsZXMgd2l0aCBhIGxpbmVhciBhcHByb3hpbWF0aW9uIGZ1bmN0aW9uCithbmQgZm91ciBjaXJjdWl0IG1vZGVscyB3aXRoIGFuIG9wdGlvbiBub3QgdG8gdXNlIGFueSBvZiB0aGUgZm91ciBtb2RlbHMuCisKK1RoZSBmb3VyIGNpcmN1aXQgbW9kZWxzIHByb3ZpZGVkIGFyZToKKworCSQ6IHJlc2lzdGVyLCBbVEhdOiB0aGUgdGhlcm1pc3RvcgorCisgMS4gY29ubmVjdCA9IE5UQ19DT05ORUNURURfUE9TSVRJVkUsIHB1bGx1cF9vaG0gPiAwCisKKyAgIFtwdWxsdXBfdVZdCisgICAgICAgfCAgICB8CisgICAgICBbVEhdICAkIChwdWxsdXBfb2htKQorICAgICAgIHwgICAgfAorICAgICAgICstLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tW3JlYWRfdVZdCisgICAgICAgfAorICAgICAgICQgKHB1bGxkb3duX29obSkKKyAgICAgICB8CisgICAgICAtLS0gKGdyb3VuZCkKKworIDIuIGNvbm5lY3QgPSBOVENfQ09OTkVDVEVEX1BPU0lUSVZFLCBwdWxsdXBfb2htID0gMCAobm90LWNvbm5lY3RlZCkKKworICAgW3B1bGx1cF91Vl0KKyAgICAgICB8CisgICAgICBbVEhdCisgICAgICAgfAorICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tW3JlYWRfdVZdCisgICAgICAgfAorICAgICAgICQgKHB1bGxkb3duX29obSkKKyAgICAgICB8CisgICAgICAtLS0gKGdyb3VuZCkKKworIDMuIGNvbm5lY3QgPSBOVENfQ09OTkVDVEVEX0dST1VORCwgcHVsbGRvd25fb2htID4gMAorCisgICBbcHVsbHVwX3VWXQorICAgICAgIHwKKyAgICAgICAkIChwdWxsdXBfb2htKQorICAgICAgIHwKKyAgICAgICArLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVtyZWFkX3VWXQorICAgICAgIHwgICAgfAorICAgICAgW1RIXSAgJCAocHVsbGRvd25fb2htKQorICAgICAgIHwgICAgfAorICAgICAgLS0tLS0tLS0gKGdyb3VuZCkKKworIDQuIGNvbm5lY3QgPSBOVENfQ09OTkVDVEVEX0dST1VORCwgcHVsbGRvd25fb2htID0gMCAobm90LWNvbm5lY3RlZCkKKworICAgW3B1bGx1cF91Vl0KKyAgICAgICB8CisgICAgICAgJCAocHVsbHVwX29obSkKKyAgICAgICB8CisgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1bcmVhZF91Vl0KKyAgICAgICB8CisgICAgICBbVEhdCisgICAgICAgfAorICAgICAgLS0tIChncm91bmQpCisKK1doZW4gb25lIG9mIHRoZSBmb3VyIGNpcmN1aXQgbW9kZWxzIGlzIHVzZWQsIHJlYWRfdVYsIHB1bGx1cF91ViwgcHVsbHVwX29obSwKK3B1bGxkb3duX29obSwgYW5kIGNvbm5lY3Qgc2hvdWxkIGJlIHByb3ZpZGVkLiBXaGVuIG5vbmUgb2YgdGhlIGZvdXIgbW9kZWxzCithcmUgc3VpdGFibGUgb3IgdGhlIHVzZXIgY2FuIGdldCB0aGUgcmVzaXN0YW5jZSBkaXJlY3RseSwgdGhlIHVzZXIgc2hvdWxkCitwcm92aWRlIHJlYWRfb2htIGFuZCBfbm90XyBwcm92aWRlIHRoZSBvdGhlcnMuCisKK1N5c2ZzIEludGVyZmFjZQorLS0tLS0tLS0tLS0tLS0tCituYW1lCQl0aGUgbWFuZGF0b3J5IGdsb2JhbCBhdHRyaWJ1dGUsIHRoZSB0aGVybWlzdG9yIG5hbWUuCisKK3RlbXAxX3R5cGUJYWx3YXlzIDQgKHRoZXJtaXN0b3IpCisJCVJPCisKK3RlbXAxX2lucHV0CW1lYXN1cmUgdGhlIHRlbXBlcmF0dXJlIGFuZCBwcm92aWRlIHRoZSBtZWFzdXJlZCB2YWx1ZS4KKwkJKHJlYWRpbmcgdGhpcyBmaWxlIGluaXRpYXRlcyB0aGUgcmVhZGluZyBwcm9jZWR1cmUuKQorCQlSTworCitOb3RlIHRoYXQgZWFjaCBOVEMgdGhlcm1pc3RvciBoYXMgb25seSBfb25lXyB0aGVybWlzdG9yOyB0aHVzLCBvbmx5IHRlbXAxIGV4aXN0cy4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vcG1idXMgYi9Eb2N1bWVudGF0aW9uL2h3bW9uL3BtYnVzCmluZGV4IDVlNDYyZmMuLmMzNmMxYzEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vaHdtb24vcG1idXMKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9wbWJ1cwpAQCAtMTMsNiArMTMsMTMgQEAKICAgICBQcmVmaXg6ICdsdGMyOTc4JwogICAgIEFkZHJlc3NlcyBzY2FubmVkOiAtCiAgICAgRGF0YXNoZWV0OiBodHRwOi8vY2RzLmxpbmVhci5jb20vZG9jcy9EYXRhc2hlZXQvMjk3OGZhLnBkZgorICAqIE9OIFNlbWljb25kdWN0b3IgQURQNDAwMCwgTkNQNDIwMCwgTkNQNDIwOAorICAgIFByZWZpeGVzOiAnYWRwNDAwMCcsICduY3A0MjAwJywgJ25jcDQyMDgnCisgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IC0KKyAgICBEYXRhc2hlZXRzOgorCWh0dHA6Ly93d3cub25zZW1pLmNvbS9wdWJfbGluay9Db2xsYXRlcmFsL0FEUDQwMDAtRC5QREYKKwlodHRwOi8vd3d3Lm9uc2VtaS5jb20vcHViX2xpbmsvQ29sbGF0ZXJhbC9OQ1A0MjAwLUQuUERGCisJaHR0cDovL3d3dy5vbnNlbWkuY29tL3B1Yl9saW5rL0NvbGxhdGVyYWwvSlVORSUyMDIwMDktJTIwUkVWLiUyMDAuUERGCiAgICogR2VuZXJpYyBQTUJ1cyBkZXZpY2VzCiAgICAgUHJlZml4OiAncG1idXMnCiAgICAgQWRkcmVzc2VzIHNjYW5uZWQ6IC0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHdtb24vc3lzZnMtaW50ZXJmYWNlIGIvRG9jdW1lbnRhdGlvbi9od21vbi9zeXNmcy1pbnRlcmZhY2UKaW5kZXggOGY2M2MyNC4uYTRhYThmNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9od21vbi9zeXNmcy1pbnRlcmZhY2UKKysrIGIvRG9jdW1lbnRhdGlvbi9od21vbi9zeXNmcy1pbnRlcmZhY2UKQEAgLTEzOSw2ICsxMzksMjkgQEAKIAkJdGh1bWI6IGRyaXZlcnMgc2hvdWxkIHJlcG9ydCB0aGUgdm9sdGFnZSB2YWx1ZXMgYXQgdGhlCiAJCSJwaW5zIiBvZiB0aGUgY2hpcC4KIAoraW5bMC0qXV9hdmVyYWdlCisJCUF2ZXJhZ2Ugdm9sdGFnZQorCQlVbml0OiBtaWxsaXZvbHQKKwkJUk8KKworaW5bMC0qXV9sb3dlc3QKKwkJSGlzdG9yaWNhbCBtaW5pbXVtIHZvbHRhZ2UKKwkJVW5pdDogbWlsbGl2b2x0CisJCVJPCisKK2luWzAtKl1faGlnaGVzdAorCQlIaXN0b3JpY2FsIG1heGltdW0gdm9sdGFnZQorCQlVbml0OiBtaWxsaXZvbHQKKwkJUk8KKworaW5bMC0qXV9yZXNldF9oaXN0b3J5CisJCVJlc2V0IGluWF9sb3dlc3QgYW5kIGluWF9oaWdoZXN0CisJCVdPCisKK2luX3Jlc2V0X2hpc3RvcnkKKwkJUmVzZXQgaW5YX2xvd2VzdCBhbmQgaW5YX2hpZ2hlc3QgZm9yIGFsbCBzZW5zb3JzCisJCVdPCisKIGluWzAtKl1fbGFiZWwJU3VnZ2VzdGVkIHZvbHRhZ2UgY2hhbm5lbCBsYWJlbC4KIAkJVGV4dCBzdHJpbmcKIAkJU2hvdWxkIG9ubHkgYmUgY3JlYXRlZCBpZiB0aGUgZHJpdmVyIGhhcyBoaW50cyBhYm91dCB3aGF0CkBAIC00MDcsNiArNDMwLDI5IEBACiAJCVVuaXQ6IG1pbGxpYW1wZXJlCiAJCVJPCiAKK2N1cnJbMS0qXV9hdmVyYWdlCisJCUF2ZXJhZ2UgY3VycmVudCB1c2UKKwkJVW5pdDogbWlsbGlhbXBlcmUKKwkJUk8KKworY3VyclsxLSpdX2xvd2VzdAorCQlIaXN0b3JpY2FsIG1pbmltdW0gY3VycmVudAorCQlVbml0OiBtaWxsaWFtcGVyZQorCQlSTworCitjdXJyWzEtKl1faGlnaGVzdAorCQlIaXN0b3JpY2FsIG1heGltdW0gY3VycmVudAorCQlVbml0OiBtaWxsaWFtcGVyZQorCQlSTworCitjdXJyWzEtKl1fcmVzZXRfaGlzdG9yeQorCQlSZXNldCBjdXJyWF9sb3dlc3QgYW5kIGN1cnJYX2hpZ2hlc3QKKwkJV08KKworY3Vycl9yZXNldF9oaXN0b3J5CisJCVJlc2V0IGN1cnJYX2xvd2VzdCBhbmQgY3VyclhfaGlnaGVzdCBmb3IgYWxsIHNlbnNvcnMKKwkJV08KKwogQWxzbyBzZWUgdGhlIEFsYXJtcyBzZWN0aW9uIGZvciBzdGF0dXMgZmxhZ3MgYXNzb2NpYXRlZCB3aXRoIGN1cnJlbnRzLgogCiAqKioqKioqKioKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaW9jdGwvaW9jdGwtbnVtYmVyLnR4dCBiL0RvY3VtZW50YXRpb24vaW9jdGwvaW9jdGwtbnVtYmVyLnR4dAppbmRleCA3MmJhOGQ1Li44NDVhMTkxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2lvY3RsL2lvY3RsLW51bWJlci50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9pb2N0bC9pb2N0bC1udW1iZXIudHh0CkBAIC0yOTIsNiArMjkyLDcgQEAKIAkJCQkJPG1haWx0bzpidWtAYnVrcy5pcG4uZGU+CiAweEEwCWFsbAlsaW51eC9zZHAvc2RwLmgJCUluZHVzdHJpYWwgRGV2aWNlIFByb2plY3QKIAkJCQkJPG1haWx0bzprZW5qaUBiaXRnYXRlLmNvbT4KKzB4QTIJMDAtMEYJYXJjaC90aWxlL2luY2x1ZGUvYXNtL2hhcmR3YWxsLmgKIDB4QTMJODAtOEYJUG9ydCBBQ0wJCWluIGRldmVsb3BtZW50OgogCQkJCQk8bWFpbHRvOnRsZXdpc0BtaW5kc3ByaW5nLmNvbT4KIDB4QTMJOTAtOUYJbGludXgvZHRsay5oCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dCBiL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CmluZGV4IDRjYTkzODkuLmUyNzliNzIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24va2VybmVsLXBhcmFtZXRlcnMudHh0CkBAIC0xNjMsNiArMTYzLDExIEBACiAKIAkJCVNlZSBhbHNvIERvY3VtZW50YXRpb24vcG93ZXIvcG0udHh0LCBwY2k9bm9hY3BpCiAKKwlhY3BpX3JzZHA9CVtBQ1BJLEVGSSxLRVhFQ10KKwkJCVBhc3MgdGhlIFJTRFAgYWRkcmVzcyB0byB0aGUga2VybmVsLCBtb3N0bHkgdXNlZAorCQkJb24gbWFjaGluZXMgcnVubmluZyBFRkkgcnVudGltZSBzZXJ2aWNlIHRvIGJvb3QgdGhlCisJCQlzZWNvbmQga2VybmVsIGZvciBrZHVtcC4KKwogCWFjcGlfYXBpY19pbnN0YW5jZT0JW0FDUEksIElPQVBJQ10KIAkJCUZvcm1hdDogPGludD4KIAkJCTI6IHVzZSAybmQgQVBJQyB0YWJsZSwgaWYgYXZhaWxhYmxlCkBAIC01NDYsNiArNTUxLDkgQEAKIAkJCS9wcm9jLzxwaWQ+L2NvcmVkdW1wX2ZpbHRlci4KIAkJCVNlZSBhbHNvIERvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvcHJvYy50eHQuCiAKKwljcHVpZGxlLm9mZj0xCVtDUFVfSURMRV0KKwkJCWRpc2FibGUgdGhlIGNwdWlkbGUgc3ViLXN5c3RlbQorCiAJY3BjaWhwX2dlbmVyaWM9CVtIVyxQQ0ldIEdlbmVyaWMgcG9ydCBJL08gQ29tcGFjdFBDSSBkcml2ZXIKIAkJCUZvcm1hdDoKIAkJCTxmaXJzdF9zbG90Piw8bGFzdF9zbG90Piw8cG9ydD4sPGVudW1fYml0PlssPGRlYnVnPl0KQEAgLTIxNTMsNiArMjE2MSw4IEBACiAJCQlbSFcsTU9VU0VdIENvbnRyb2xzIExvZ2l0ZWNoIHNtYXJ0c2Nyb2xsIGF1dG9yZXBlYXQuCiAJCQkwID0gZGlzYWJsZWQsIDEgPSBlbmFibGVkIChkZWZhdWx0KS4KIAorCXBzdG9yZS5iYWNrZW5kPQlTcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBwc3RvcmUgYmFja2VuZCB0byB1c2UKKwogCXB0LgkJW1BBUklERV0KIAkJCVNlZSBEb2N1bWVudGF0aW9uL2Jsb2NrZGV2L3BhcmlkZS50eHQuCiAKQEAgLTIyMzgsNiArMjI0OCw3IEBACiAJcm8JCVtLTkxdIE1vdW50IHJvb3QgZGV2aWNlIHJlYWQtb25seSBvbiBib290CiAKIAlyb290PQkJW0tOTF0gUm9vdCBmaWxlc3lzdGVtCisJCQlTZWUgbmFtZV90b19kZXZfdCBjb21tZW50IGluIGluaXQvZG9fbW91bnRzLmMuCiAKIAlyb290ZGVsYXk9CVtLTkxdIERlbGF5IChpbiBzZWNvbmRzKSB0byBwYXVzZSBiZWZvcmUgYXR0ZW1wdGluZyB0bwogCQkJbW91bnQgdGhlIHJvb3QgZmlsZXN5c3RlbQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tNjhrL2tlcm5lbC1vcHRpb25zLnR4dCBiL0RvY3VtZW50YXRpb24vbTY4ay9rZXJuZWwtb3B0aW9ucy50eHQKaW5kZXggYzkzYmVkNi4uOTdkNDVmMiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9tNjhrL2tlcm5lbC1vcHRpb25zLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL202OGsva2VybmVsLW9wdGlvbnMudHh0CkBAIC0xMjksNiArMTI5LDIwIEBACiB0aGUgZmlyc3Qgb2YgdGhlc2UuIFlvdSBjYW4gZmluZCBvdXQgYWxsIHZhbGlkIG1ham9yIG51bWJlcnMgYnkKIGxvb2tpbmcgaW50byBpbmNsdWRlL2xpbnV4L21ham9yLmguCiAKK0luIGFkZGl0aW9uIHRvIG1ham9yIGFuZCBtaW5vciBudW1iZXJzLCBpZiB0aGUgZGV2aWNlIGNvbnRhaW5pbmcgeW91cgorcm9vdCBwYXJ0aXRpb24gdXNlcyBhIHBhcnRpdGlvbiB0YWJsZSBmb3JtYXQgd2l0aCB1bmlxdWUgcGFydGl0aW9uCitpZGVudGlmaWVycywgdGhlbiB5b3UgbWF5IHVzZSB0aGVtLiAgRm9yIGluc3RhbmNlLAorInJvb3Q9UEFSVFVVSUQ9MDAxMTIyMzMtNDQ1NS02Njc3LTg4OTktQUFCQkNDRERFRUZGIi4gIEl0IGlzIGFsc28KK3Bvc3NpYmxlIHRvIHJlZmVyZW5jZSBhbm90aGVyIHBhcnRpdGlvbiBvbiB0aGUgc2FtZSBkZXZpY2UgdXNpbmcgYQora25vd24gcGFydGl0aW9uIFVVSUQgYXMgdGhlIHN0YXJ0aW5nIHBvaW50LiAgRm9yIGV4YW1wbGUsCitpZiBwYXJ0aXRpb24gNSBvZiB0aGUgZGV2aWNlIGhhcyB0aGUgVVVJRCBvZgorMDAxMTIyMzMtNDQ1NS02Njc3LTg4OTktQUFCQkNDRERFRUZGIHRoZW4gcGFydGl0aW9uIDMgbWF5IGJlIGZvdW5kIGFzCitmb2xsb3dzOgorICBQQVJUVVVJRD0wMDExMjIzMy00NDU1LTY2NzctODg5OS1BQUJCQ0NEREVFRkYvUEFSVE5ST0ZGPS0yCisKK0F1dGhvcml0YXRpdmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluCisiRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQiLgorCiAKIDIuMikgcm8sIHJ3CiAtLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9tZWRpYS1mcmFtZXdvcmsudHh0IGIvRG9jdW1lbnRhdGlvbi9tZWRpYS1mcmFtZXdvcmsudHh0CmluZGV4IDc2YTIwODcuLjY2OWI1ZmIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbWVkaWEtZnJhbWV3b3JrLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL21lZGlhLWZyYW1ld29yay50eHQKQEAgLTMxMCw3ICszMTAsNyBAQAogdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gdG8gYmUgYXBwbGllZCBsYXRlci4KIAogTGluayBjb25maWd1cmF0aW9uIG11c3Qgbm90IGhhdmUgYW55IHNpZGUgZWZmZWN0IG9uIG90aGVyIGxpbmtzLiBJZiBhbiBlbmFibGVkCi1saW5rIGF0IGEgc2luayBwYWQgcHJldmVudHMgYW5vdGhlciBsaW5rIGF0IHRoZSBzYW1lIHBhZCBmcm9tIGJlaW5nIGRpc2FibGVkLAorbGluayBhdCBhIHNpbmsgcGFkIHByZXZlbnRzIGFub3RoZXIgbGluayBhdCB0aGUgc2FtZSBwYWQgZnJvbSBiZWluZyBlbmFibGVkLAogdGhlIGxpbmtfc2V0dXAgb3BlcmF0aW9uIG11c3QgcmV0dXJuIC1FQlVTWSBhbmQgY2FuJ3QgaW1wbGljaXRseSBkaXNhYmxlIHRoZQogZmlyc3QgZW5hYmxlZCBsaW5rLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3Njc2kvQ2hhbmdlTG9nLm1lZ2FyYWlkX3NhcyBiL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cubWVnYXJhaWRfc2FzCmluZGV4IDllZDFkOWQuLjFiNmUyN2QgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cubWVnYXJhaWRfc2FzCisrKyBiL0RvY3VtZW50YXRpb24vc2NzaS9DaGFuZ2VMb2cubWVnYXJhaWRfc2FzCkBAIC0xLDMgKzEsMTEgQEAKK1JlbGVhc2UgRGF0ZSAgICA6IFR1ZS4gSnVsIDI2LCAyMDExIDE3OjAwOjAwIFBTVCAyMDEwIC0KKwkJCShlbWFpbGQtaWQ6bWVnYXJhaWRsaW51eEBsc2kuY29tKQorCQkJQWRhbSBSYWRmb3JkCitDdXJyZW50IFZlcnNpb24gOiAwMC4wMC4wNS40MC1yYzEKK09sZCBWZXJzaW9uICAgICA6IDAwLjAwLjA1LjM4LXJjMQorICAgIDEuIEZpeCBGYXN0UGF0aCBJL08gdG8gd29yayB3aXRoIGRlZ3JhZGVkIFJBSUQgMS4KKyAgICAyLiBBZGQgLmNoYW5nZV9xdWV1ZV9kZXB0aCBzdXBwb3J0LgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogUmVsZWFzZSBEYXRlICAgIDogV2VkLiBNYXkgMTEsIDIwMTEgMTc6MDA6MDAgUFNUIDIwMTAgLQogCQkJKGVtYWlsZC1pZDptZWdhcmFpZGxpbnV4QGxzaS5jb20pCiAJCQlBZGFtIFJhZGZvcmQKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQVBJLmh0bWwgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0FQSS5odG1sCmluZGV4IGQ3MmZkMmEuLjI1NmY4ZWYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQVBJLmh0bWwKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9BUEkuaHRtbApAQCAtOSw3ICs5LDcgQEAKICAgPHRhYmxlIGJvcmRlcj0iMCI+CiAgICA8dHI+CiAgICAgPHRkPgotICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmxpbnV4dHYub3JnL2Rvd25sb2Fkcy92aWRlbzRsaW51eC9BUEkvVjRMMV9BUEkuaHRtbCI+VjRMIG9yaWdpbmFsIEFQSTwvYT4KKyAgICAgPGEgaHJlZj0iaHR0cDovL2xpbnV4dHYub3JnL2Rvd25sb2Fkcy9sZWdhY3kvdmlkZW80bGludXgvQVBJL1Y0TDFfQVBJLmh0bWwiPlY0TCBvcmlnaW5hbCBBUEk8L2E+CiAgICAgPC90ZD4KICAgICA8dGQ+CiAgICAgIE9ic29sZXRlZCBieSBWNEwyIEFQSQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5jeDIzODg1IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5jeDIzODg1CmluZGV4IDg3YzQ2MzQuLjg5MTA0NDkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuY3gyMzg4NQorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmN4MjM4ODUKQEAgLTI3LDMgKzI3LDUgQEAKICAyNiAtPiBIYXVwcGF1Z2UgV2luVFYtSFZSMTI5MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAwNzA6ODU1MV0KICAyNyAtPiBNeWdpY2EgWDg1NTggUFJPIERNQi1USCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzE0ZjE6ODU3OF0KICAyOCAtPiBMRUFEVEVLIFdpbkZhc3QgUHhUVjEyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzEwN2Q6NmYyMl0KKyAyOSAtPiBHb1RWaWV3IFg1IDNEIEh5YnJpZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzU2NTQ6MjM5MF0KKyAzMCAtPiBOZXRVUCBEdWFsIERWQi1UL0MtQ0kgUkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzFiNTU6ZTJlNF0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuY3g4OCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QuY3g4OAppbmRleCA0MjUxN2Q5Li5kOWMwZjExIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmN4ODgKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5jeDg4CkBAIC04NCwzICs4NCw0IEBACiAgODMgLT4gUHJvZiA3MzAxIERWQi1TL1MyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtiMDM0OjMwMzRdCiAgODQgLT4gU2Ftc3VuZyBTTVQgNzAyMCBEVkItUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxOGFjOmRjMDAsMThhYzpkY2NkXQogIDg1IC0+IFR3aW5oYW4gVlAtMTAyNyBEVkItUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTgyMjowMDIzXQorIDg2IC0+IFRlVmlpIFM0NjQgRFZCLVMvUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZDQ2NDo5MDIyXQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5lbTI4eHggYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmVtMjh4eAppbmRleCA5YWFlNDQ5Li40YTdiM2RmIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmVtMjh4eAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULmVtMjh4eApAQCAtNzQsMyArNzQsNSBAQAogIDc0IC0+IEFjdGlvbm1hc3Rlci9MaW5YY2VsL0RpZ2l0dXMgVkMyMTFBICAgICAgKGVtMjgwMCkKICA3NSAtPiBEaWtvbSBESzMwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbTI4ODIpCiAgNzYgLT4gS1dvcmxkIFBsdXNUViAzNDBVIG9yIFVCNDM1LVEgKEFUU0MpICAgICAoZW0yODcwKSAgICAgICAgWzFiODA6YTM0MF0KKyA3NyAtPiBFTTI4NzQgTGVhZGVyc2hpcCBJU0RCVCAgICAgICAgICAgICAgICAgIChlbTI4NzQpCisgNzggLT4gUENUViBuYW5vU3RpY2sgVDIgMjkwZSAgICAgICAgICAgICAgICAgICAoZW0yODE3NCkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1Quc2FhNzEzNCBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1Quc2FhNzEzNAppbmRleCA2YjRjNzJkLi43ZWZhZTliIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnNhYTcxMzQKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC5zYWE3MTM0CkBAIC0xODIsMyArMTgyLDcgQEAKIDE4MSAtPiBUZWNob1RyZW5kIFRULWJ1ZGdldCBULTMwMDAgICAgICAgICAgICAgIFsxM2MyOjI4MDRdCiAxODIgLT4gS3dvcmxkIFBDSSBTQlRWRC9JU0RCLVQgRnVsbC1TZWcgSHlicmlkICBbMTdkZTpiMTM2XQogMTgzIC0+IENvbXBybyBWaWRlb01hdGUgVmlzdGEgTTFGICAgICAgICAgICAgICAgWzE4NWI6YzkwMF0KKzE4NCAtPiBFbmNvcmUgRU5MVFYtRk0gMyAgICAgICAgICAgICAgICAgICAgICAgIFsxYTdmOjIxMDhdCisxODUgLT4gTWFnaWNQcm8gUHJvSERUViBQcm8yIERNQi1USC9IeWJyaWQgICAgICBbMTdkZTpkMTM2XQorMTg2IC0+IEJlaG9sZGVyIEJlaG9sZFRWIDUwMSAgICAgICAgICAgICAgICAgICAgWzVhY2U6NTAxMF0KKzE4NyAtPiBCZWhvbGRlciBCZWhvbGRUViA1MDMgRk0gICAgICAgICAgICAgICAgIFs1YWNlOjUwMzBdCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnR1bmVyIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC50dW5lcgppbmRleCBlNjdjMWRiLi42MzIzYjdhIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnR1bmVyCisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvQ0FSRExJU1QudHVuZXIKQEAgLTc4LDggKzc4LDEwIEBACiB0dW5lcj03OCAtIFBoaWxpcHMgRk1EMTIxNk1FWCBNSzMgSHlicmlkIFR1bmVyCiB0dW5lcj03OSAtIFBoaWxpcHMgUEFML1NFQ0FNIG11bHRpIChGTTEyMTYgTUs1KQogdHVuZXI9ODAgLSBQaGlsaXBzIEZRMTIxNkxNRSBNSzMgUEFML1NFQ0FNIHcvYWN0aXZlIGxvb3B0aHJvdWdoCit0dW5lcj04MSAtIFhjZWl2ZSA0MDAwIHR1bmVyCiB0dW5lcj04MSAtIFBhcnRzbmljIChEYWV3b28pIFBUSS01TkYwNQogdHVuZXI9ODIgLSBQaGlsaXBzIENVMTIxNkwKIHR1bmVyPTgzIC0gTlhQIFREQTE4MjcxCiB0dW5lcj04NCAtIFNvbnkgQlRGLVB4bjAxWgogdHVuZXI9ODUgLSBQaGlsaXBzIEZRMTIzNiBNSzUKK3R1bmVyPTg2IC0gVGVuYSBUTkY1MzM3IE1GRApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9DQVJETElTVC51c2J2aXNpb24gYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnVzYnZpc2lvbgppbmRleCAwYjcyZDNmLi42ZmQxYWYzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnVzYnZpc2lvbgorKysgYi9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L0NBUkRMSVNULnVzYnZpc2lvbgpAQCAtNjMsMyArNjMsNSBAQAogIDYyIC0+IFBpbm5hY2xlIFBDVFYgQnVuZ2VlIFVTQiAoUEFMKSBGTSAgICAgICAgICAgICAgICAgICAgICAgIFsyMzA0OjA0MTldCiAgNjMgLT4gSGF1cHBhdWdlIFdpblR2LVVTQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzI0MDA6NDIwMF0KICA2NCAtPiBQaW5uYWNsZSBTdHVkaW8gUENUViBVU0IgKE5UU0MpIEZNIFYzICAgICAgICAgICAgICAgICAgICBbMjMwNDowMTEzXQorIDY1IC0+IE5vZ2F0ZWNoIFVTQiBNaWNyb0NhbSBOVFNDIChOVjMwMDBOKSAgICAgICAgICAgICAgICAgICAgIFswNTczOjMwMDBdCisgNjYgLT4gTm9nYXRlY2ggVVNCIE1pY3JvQ2FtIFBBTCAoTlYzMDAxUCkgICAgICAgICAgICAgICAgICAgICAgWzA1NzM6MzAwMV0KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvUkVBRE1FLmRhdmluY2ktdnBiZSBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvUkVBRE1FLmRhdmluY2ktdnBiZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTQ2MGIwCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC9SRUFETUUuZGF2aW5jaS12cGJlCkBAIC0wLDAgKzEsOTMgQEAKKworICAgICAgICAgICAgICAgIFZQQkUgVjRMMiBkcml2ZXIgZGVzaWduCisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgRmlsZSBwYXJ0aXRpb25pbmcKKyAtLS0tLS0tLS0tLS0tLS0tLQorIFY0TDIgZGlzcGxheSBkZXZpY2UgZHJpdmVyCisgICAgICAgICBkcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBiZV9kaXNwbGF5LmMKKyAgICAgICAgIGRyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlX2Rpc3BsYXkuaAorCisgVlBCRSBkaXNwbGF5IGNvbnRyb2xsZXIKKyAgICAgICAgIGRyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlLmMKKyAgICAgICAgIGRyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlLmgKKworIFZQQkUgdmVuYyBzdWIgZGV2aWNlIGRyaXZlcgorICAgICAgICAgZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfdmVuYy5jCisgICAgICAgICBkcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBiZV92ZW5jLmgKKyAgICAgICAgIGRyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlX3ZlbmNfcmVncy5oCisKKyBWUEJFIG9zZCBkcml2ZXIKKyAgICAgICAgIGRyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlX29zZC5jCisgICAgICAgICBkcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBiZV9vc2QuaAorICAgICAgICAgZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfb3NkX3JlZ3MuaAorCisgRnVuY3Rpb25hbCBwYXJ0aXRpb25pbmcKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgQ29uc2lzdHMgb2YgdGhlIGZvbGxvd2luZyAoaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGxpc3QgdW5kZXIgZmlsZQorIHBhcnRpdGlvbmluZyk6LQorCisgMS4gVjRMMiBkaXNwbGF5IGRyaXZlcgorICAgIEltcGxlbWVudHMgY3JlYXRpb24gb2YgdmlkZW8yIGFuZCB2aWRlbzMgZGV2aWNlIG5vZGVzIGFuZAorICAgIHByb3ZpZGVzIHY0bDIgZGV2aWNlIGludGVyZmFjZSB0byBtYW5hZ2UgVklEMCBhbmQgVklEMSBsYXllcnMuCisKKyAyLiBEaXNwbGF5IGNvbnRyb2xsZXIKKyAgICBMb2FkcyB1cCBWRU5DLCBPU0QgYW5kIGV4dGVybmFsIGVuY29kZXJzIHN1Y2ggYXMgdGhzODIwMC4gSXQgcHJvdmlkZXMKKyAgICBhIHNldCBvZiBBUEkgY2FsbHMgdG8gVjRMMiBkcml2ZXJzIHRvIHNldCB0aGUgb3V0cHV0L3N0YW5kYXJkcworICAgIGluIHRoZSBWRU5DIG9yIGV4dGVybmFsIHN1YiBkZXZpY2VzLiBJdCBhbHNvIHByb3ZpZGVzCisgICAgYSBkZXZpY2Ugb2JqZWN0IHRvIGFjY2VzcyB0aGUgc2VydmljZXMgZnJvbSBPU0Qgc3ViZGV2aWNlCisgICAgdXNpbmcgc3ViIGRldmljZSBvcHMuIFRoZSBjb25uZWN0aW9uIG9mIGV4dGVybmFsIGVuY29kZXJzIHRvIFZFTkMgTENECisgICAgY29udHJvbGxlciBwb3J0IGlzIGRvbmUgYXQgaW5pdCB0aW1lIGJhc2VkIG9uIGRlZmF1bHQgb3V0cHV0IGFuZCBzdGFuZGFyZAorICAgIHNlbGVjdGlvbiBvciBhdCBydW4gdGltZSB3aGVuIGFwcGxpY2F0aW9uIGNoYW5nZSB0aGUgb3V0cHV0IHRocm91Z2gKKyAgICBWNEwyIElPQ1RMcy4KKworICAgIFdoZW4gY29ubmVjdGVkIHRvIGFuIGV4dGVybmFsIGVuY29kZXIsIHZwYmUgY29udHJvbGxlciBpcyBhbHNvIHJlc3BvbnNpYmxlCisgICAgZm9yIHNldHRpbmcgdXAgdGhlIGludGVyZmFjZSBiZXR3ZWVuIFZFTkMgYW5kIGV4dGVybmFsIGVuY29kZXJzIGJhc2VkIG9uCisgICAgYm9hcmQgc3BlY2lmaWMgc2V0dGluZ3MgKHNwZWNpZmllZCBpbiBib2FyZC14eHgtZXZtLmMpLiBUaGlzIGFsbG93cworICAgIGludGVyZmFjaW5nIGV4dGVybmFsIGVuY29kZXJzIHN1Y2ggYXMgdGhzODIwMC4gVGhlIHNldHVwX2lmX2NvbmZpZygpCisgICAgaXMgaW1wbGVtZW50ZWQgZm9yIHRoaXMgYXMgd2VsbCBhcyBjb25maWd1cmVfdmVuYygpIChwYXJ0IG9mIHRoZSBuZXh0IHBhdGNoKQorICAgIEFQSSB0byBzZXQgdGltaW5ncyBpbiBWRU5DIGZvciBhIHNwZWNpZmljIGRpc3BsYXkgcmVzb2x1dGlvbi4gQXMgb2YgdGhpcworICAgIHBhdGNoIHNlcmllcywgdGhlIGludGVyY29ubmVjdGlvbiBhbmQgZW5hYmxpbmcgYW5kIHNldHRpbmcgb2YgdGhlIGV4dGVybmFsCisgICAgZW5jb2RlcnMgaXMgbm90IHByZXNlbnQsIGFuZCB3b3VsZCBiZSBhIHBhcnQgb2YgdGhlIG5leHQgcGF0Y2ggc2VyaWVzLgorCisgMy4gVkVOQyBzdWJkZXZpY2UgbW9kdWxlCisgICAgUmVzcG9uc2libGUgZm9yIHNldHRpbmcgb3V0cHV0cyBwcm92aWRlZCB0aHJvdWdoIGludGVybmFsIERBQ3MgYW5kIGFsc28KKyAgICBzZXR0aW5nIHRpbWluZ3MgYXQgTENEIGNvbnRyb2xsZXIgcG9ydCB3aGVuIGV4dGVybmFsIGVuY29kZXJzIGFyZSBjb25uZWN0ZWQKKyAgICBhdCB0aGUgcG9ydCBvciBMQ0QgcGFuZWwgdGltaW5ncyByZXF1aXJlZC4gV2hlbiBleHRlcm5hbCBlbmNvZGVyL0xDRCBwYW5lbAorICAgIGlzIGNvbm5lY3RlZCwgdGhlIHRpbWluZ3MgZm9yIGEgc3BlY2lmaWMgc3RhbmRhcmQvcHJlc2V0IGlzIHJldHJpZXZlZCBmcm9tCisgICAgdGhlIGJvYXJkIHNwZWNpZmljIHRhYmxlIGFuZCB0aGUgdmFsdWVzIGFyZSB1c2VkIHRvIHNldCB0aGUgdGltaW5ncyBpbgorICAgIHZlbmMgdXNpbmcgbm9uLXN0YW5kYXJkIHRpbWluZyBtb2RlLgorCisgICAgU3VwcG9ydCBMQ0QgUGFuZWwgZGlzcGxheXMgdXNpbmcgdGhlIFZFTkMuIEZvciBleGFtcGxlIHRvIHN1cHBvcnQgYSBMb2dpYworICAgIFBEIGRpc3BsYXksIGl0IHJlcXVpcmVzIHNldHRpbmcgdXAgdGhlIExDRCBjb250cm9sbGVyIHBvcnQgd2l0aCBhIHNldCBvZgorICAgIHRpbWluZ3MgZm9yIHRoZSByZXNvbHV0aW9uIHN1cHBvcnRlZCBhbmQgc2V0dGluZyB0aGUgZG90IGNsb2NrLiBTbyB3ZSBjb3VsZAorICAgIGFkZCB0aGUgYXZhaWxhYmxlIG91dHB1dHMgYXMgYSBib2FyZCBzcGVjaWZpYyBlbnRyeSAoaS5lIGFkZCB0aGUgIkxvZ2ljUEQiCisgICAgb3V0cHV0IG5hbWUgdG8gYm9hcmQteHh4LWV2bS5jKS4gQSB0YWJsZSBvZiB0aW1pbmdzIGZvciB2YXJpb3VzIExDRHMKKyAgICBzdXBwb3J0ZWQgY2FuIGJlIG1haW50YWluZWQgaW4gdGhlIGJvYXJkIHNwZWNpZmljIHNldHVwIGZpbGUgdG8gc3VwcG9ydAorICAgIHZhcmlvdXMgTENEIGRpc3BsYXlzLkFzIG9mIHRoaXMgcGF0Y2ggYSBiYXNpYyBkcml2ZXIgaXMgcHJlc2VudCwgYW5kIHRoaXMKKyAgICBzdXBwb3J0IGZvciBleHRlcm5hbCBlbmNvZGVycyBhbmQgZGlzcGxheXMgZm9ybXMgYSBwYXJ0IG9mIHRoZSBuZXh0CisgICAgcGF0Y2ggc2VyaWVzLgorCisgNC4gT1NEIG1vZHVsZQorICAgIE9TRCBtb2R1bGUgaW1wbGVtZW50cyBhbGwgT1NEIGxheWVyIG1hbmFnZW1lbnQgYW5kIGhhcmR3YXJlIHNwZWNpZmljCisgICAgZmVhdHVyZXMuIFRoZSBWUEJFIG1vZHVsZSBpbnRlcmFjdHMgd2l0aCB0aGUgT1NEIGZvciBlbmFibGluZyBhbmQKKyAgICBkaXNhYmxpbmcgYXBwcm9wcmlhdGUgZmVhdHVyZXMgb2YgdGhlIE9TRC4KKworIEN1cnJlbnQgc3RhdHVzOi0KKworIEEgZnVsbHkgZnVuY3Rpb25hbCB3b3JraW5nIHZlcnNpb24gb2YgdGhlIFY0TDIgZHJpdmVyIGlzIGF2YWlsYWJsZS4gVGhpcworIGRyaXZlciBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBOVFNDIGFuZCBQQUwgc3RhbmRhcmRzIGFuZCBidWZmZXIgc3RyZWFtaW5nLgorCisgRm9sbG93aW5nIGFyZSBUQkRzLgorCisgdnBiZSBkaXNwbGF5IGNvbnRyb2xsZXIKKyAgICAtIEFkZCBzdXBwb3J0IGZvciBleHRlcm5hbCBlbmNvZGVycy4KKyAgICAtIGFkZCBzdXBwb3J0IGZvciBzZWxlY3RpbmcgZXh0ZXJuYWwgZW5jb2RlciBhcyBkZWZhdWx0IGF0IHByb2JlIHRpbWUuCisKKyB2cGJlIHZlbmMgc3ViIGRldmljZQorICAgIC0gYWRkIHRpbWluZ3MgZm9yIHN1cHBvcnRpbmcgdGhzODIwMAorICAgIC0gYWRkIHN1cHBvcnQgZm9yIExvZ2ljUEQgTENELgorCisgRkIgZHJpdmVycworICAgIC0gQWRkIHN1cHBvcnQgZm9yIGZiZGV2IGRyaXZlcnMuLSBSZWFkeSBhbmQgcGFydCBvZiBzdWJzZXF1ZW50IHBhdGNoZXMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3Y0bDItY29udHJvbHMudHh0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC92NGwyLWNvbnRyb2xzLnR4dAppbmRleCA4ODFlN2Y0Li45MzQ2ZmM4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3ZpZGVvNGxpbnV4L3Y0bDItY29udHJvbHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvdjRsMi1jb250cm9scy50eHQKQEAgLTI3NywxNiArMjc3LDEzIEBACiAJewogCQlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJCWNhc2UgVjRMMl9DSURfQlJJR0hUTkVTUzoKLQkJCWN0cmwtPmN1ci52YWwgPSByZWFkX3JlZygweDEyMyk7CisJCQljdHJsLT52YWwgPSByZWFkX3JlZygweDEyMyk7CiAJCQlicmVhazsKIAkJfQogCX0KIAotVGhlICduZXcgdmFsdWUnIHVuaW9uIGlzIG5vdCB1c2VkIGluIGdfdm9sYXRpbGVfY3RybC4gSW4gZ2VuZXJhbCBjb250cm9scwotdGhhdCBuZWVkIHRvIGltcGxlbWVudCBnX3ZvbGF0aWxlX2N0cmwgYXJlIHJlYWQtb25seSBjb250cm9scy4KLQotTm90ZSB0aGF0IGlmIG9uZSBvciBtb3JlIGNvbnRyb2xzIGluIGEgY29udHJvbCBjbHVzdGVyIGFyZSBtYXJrZWQgYXMgdm9sYXRpbGUsCi10aGVuIGFsbCB0aGUgY29udHJvbHMgaW4gdGhlIGNsdXN0ZXIgYXJlIHNlZW4gYXMgdm9sYXRpbGUuCitOb3RlIHRoYXQgeW91IHVzZSB0aGUgJ25ldyB2YWx1ZScgdW5pb24gYXMgd2VsbCBpbiBnX3ZvbGF0aWxlX2N0cmwuIEluIGdlbmVyYWwKK2NvbnRyb2xzIHRoYXQgbmVlZCB0byBpbXBsZW1lbnQgZ192b2xhdGlsZV9jdHJsIGFyZSByZWFkLW9ubHkgY29udHJvbHMuCiAKIFRvIG1hcmsgYSBjb250cm9sIGFzIHZvbGF0aWxlIHlvdSBoYXZlIHRvIHNldCB0aGUgaXNfdm9sYXRpbGUgZmxhZzoKIApAQCAtNDUzLDYgKzQ1MCwyNSBAQAogCWN0cmwgPT0gY3RybC0+Y2x1c3RlcltBVURJT19DTF9WT0xVTUVdID09IHN0YXRlLT5hdWRpb19jbHVzdGVyW0FVRElPX0NMX1ZPTFVNRV0KIAljdHJsLT5jbHVzdGVyW0FVRElPX0NMX01VVEVdID09IHN0YXRlLT5hdWRpb19jbHVzdGVyW0FVRElPX0NMX01VVEVdCiAKK0luIHByYWN0aWNlIHVzaW5nIGNsdXN0ZXIgYXJyYXlzIGxpa2UgdGhpcyBiZWNvbWVzIHZlcnkgdGlyZXNvbWUuIFNvIGluc3RlYWQKK3RoZSBmb2xsb3dpbmcgZXF1aXZhbGVudCBtZXRob2QgaXMgdXNlZDoKKworCXN0cnVjdCB7CisJCS8qIGF1ZGlvIGNsdXN0ZXIgKi8KKwkJc3RydWN0IHY0bDJfY3RybCAqdm9sdW1lOworCQlzdHJ1Y3QgdjRsMl9jdHJsICptdXRlOworCX07CisKK1RoZSBhbm9ueW1vdXMgc3RydWN0IGlzIHVzZWQgdG8gY2xlYXJseSAnY2x1c3RlcicgdGhlc2UgdHdvIGNvbnRyb2wgcG9pbnRlcnMsCitidXQgaXQgc2VydmVzIG5vIG90aGVyIHB1cnBvc2UuIFRoZSBlZmZlY3QgaXMgdGhlIHNhbWUgYXMgY3JlYXRpbmcgYW4KK2FycmF5IHdpdGggdHdvIGNvbnRyb2wgcG9pbnRlcnMuIFNvIHlvdSBjYW4ganVzdCBkbzoKKworCXN0YXRlLT52b2x1bWUgPSB2NGwyX2N0cmxfbmV3X3N0ZCgmc3RhdGUtPmN0cmxfaGFuZGxlciwgLi4uKTsKKwlzdGF0ZS0+bXV0ZSA9IHY0bDJfY3RybF9uZXdfc3RkKCZzdGF0ZS0+Y3RybF9oYW5kbGVyLCAuLi4pOworCXY0bDJfY3RybF9jbHVzdGVyKDIsICZzdGF0ZS0+dm9sdW1lKTsKKworQW5kIGluIGZvb19zX2N0cmwgeW91IGNhbiB1c2UgdGhlc2UgcG9pbnRlcnMgZGlyZWN0bHk6IHN0YXRlLT5tdXRlLT52YWwuCisKIE5vdGUgdGhhdCBjb250cm9scyBpbiBhIGNsdXN0ZXIgbWF5IGJlIE5VTEwuIEZvciBleGFtcGxlLCBpZiBmb3Igc29tZQogcmVhc29uIG11dGUgd2FzIG5ldmVyIGFkZGVkIChiZWNhdXNlIHRoZSBoYXJkd2FyZSBkb2Vzbid0IHN1cHBvcnQgdGhhdAogcGFydGljdWxhciBmZWF0dXJlKSwgdGhlbiBtdXRlIHdpbGwgYmUgTlVMTC4gU28gaW4gdGhhdCBjYXNlIHdlIGhhdmUgYQpAQCAtNDc1LDYgKzQ5MSw0MyBAQAogVGhlICdpc19uZXcnIGZsYWcgaXMgYWx3YXlzIDEgd2hlbiBjYWxsZWQgZnJvbSB2NGwyX2N0cmxfaGFuZGxlcl9zZXR1cCgpLgogCiAKK0hhbmRsaW5nIGF1dG9nYWluL2dhaW4tdHlwZSBDb250cm9scyB3aXRoIEF1dG8gQ2x1c3RlcnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQSBjb21tb24gdHlwZSBvZiBjb250cm9sIGNsdXN0ZXIgaXMgb25lIHRoYXQgaGFuZGxlcyAnYXV0by1mb28vZm9vJy10eXBlCitjb250cm9scy4gVHlwaWNhbCBleGFtcGxlcyBhcmUgYXV0b2dhaW4vZ2FpbiwgYXV0b2V4cG9zdXJlL2V4cG9zdXJlLAorYXV0b3doaXRlYmFsYW5jZS9yZWQgYmFsYW5jZS9ibHVlIGJhbGFuY2UuIEluIGFsbCBjYXNlcyB5b3UgaGF2ZSBvbmUgY29udHJvbHMKK3RoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIGFub3RoZXIgY29udHJvbCBpcyBoYW5kbGVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGhhcmR3YXJlLAorb3Igd2hldGhlciBpdCBpcyB1bmRlciBtYW51YWwgY29udHJvbCBmcm9tIHRoZSB1c2VyLgorCitJZiB0aGUgY2x1c3RlciBpcyBpbiBhdXRvbWF0aWMgbW9kZSwgdGhlbiB0aGUgbWFudWFsIGNvbnRyb2xzIHNob3VsZCBiZQorbWFya2VkIGluYWN0aXZlLiBXaGVuIHRoZSB2b2xhdGlsZSBjb250cm9scyBhcmUgcmVhZCB0aGUgZ192b2xhdGlsZV9jdHJsCitvcGVyYXRpb24gc2hvdWxkIHJldHVybiB0aGUgdmFsdWUgdGhhdCB0aGUgaGFyZHdhcmUncyBhdXRvbWF0aWMgbW9kZSBzZXQgdXAKK2F1dG9tYXRpY2FsbHkuCisKK0lmIHRoZSBjbHVzdGVyIGlzIHB1dCBpbiBtYW51YWwgbW9kZSwgdGhlbiB0aGUgbWFudWFsIGNvbnRyb2xzIHNob3VsZCBiZWNvbWUKK2FjdGl2ZSBhZ2FpbiBhbmQgdGhlIGlzX3ZvbGF0aWxlIGZsYWcgc2hvdWxkIGJlIGlnbm9yZWQgKHNvIGdfdm9sYXRpbGVfY3RybCBpcworbm8gbG9uZ2VyIGNhbGxlZCB3aGlsZSBpbiBtYW51YWwgbW9kZSkuCisKK0ZpbmFsbHkgdGhlIFY0TDJfQ1RSTF9GTEFHX1VQREFURSBzaG91bGQgYmUgc2V0IGZvciB0aGUgYXV0byBjb250cm9sIHNpbmNlCitjaGFuZ2luZyB0aGF0IGNvbnRyb2wgYWZmZWN0cyB0aGUgY29udHJvbCBmbGFncyBvZiB0aGUgbWFudWFsIGNvbnRyb2xzLgorCitJbiBvcmRlciB0byBzaW1wbGlmeSB0aGlzIGEgc3BlY2lhbCB2YXJpYXRpb24gb2YgdjRsMl9jdHJsX2NsdXN0ZXIgd2FzCitpbnRyb2R1Y2VkOgorCit2b2lkIHY0bDJfY3RybF9hdXRvX2NsdXN0ZXIodW5zaWduZWQgbmNvbnRyb2xzLCBzdHJ1Y3QgdjRsMl9jdHJsICoqY29udHJvbHMsCisJCQl1OCBtYW51YWxfdmFsLCBib29sIHNldF92b2xhdGlsZSk7CisKK1RoZSBmaXJzdCB0d28gYXJndW1lbnRzIGFyZSBpZGVudGljYWwgdG8gdjRsMl9jdHJsX2NsdXN0ZXIuIFRoZSB0aGlyZCBhcmd1bWVudAordGVsbHMgdGhlIGZyYW1ld29yayB3aGljaCB2YWx1ZSBzd2l0Y2hlcyB0aGUgY2x1c3RlciBpbnRvIG1hbnVhbCBtb2RlLiBUaGUKK2xhc3QgYXJndW1lbnQgd2lsbCBvcHRpb25hbGx5IHNldCB0aGUgaXNfdm9sYXRpbGUgZmxhZyBmb3IgdGhlIG5vbi1hdXRvIGNvbnRyb2xzLgorCitUaGUgZmlyc3QgY29udHJvbCBvZiB0aGUgY2x1c3RlciBpcyBhc3N1bWVkIHRvIGJlIHRoZSAnYXV0bycgY29udHJvbC4KKworVXNpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIGVuc3VyZSB0aGF0IHlvdSBkb24ndCBuZWVkIHRvIGhhbmRsZSBhbGwgdGhlIGNvbXBsZXgKK2ZsYWcgYW5kIHZvbGF0aWxlIGhhbmRsaW5nLgorCisKIFZJRElPQ19MT0dfU1RBVFVTIFN1cHBvcnQKID09PT09PT09PT09PT09PT09PT09PT09PT0KIApAQCAtNjM2LDkgKzY4OSw3IEBACiAtRUlOVkFMIGFzIHRoZSBzcGVjIHNheXMuCiAKIDUpIFRoZSBzcGVjIGRvZXMgbm90IG1lbnRpb24gd2hhdCBzaG91bGQgaGFwcGVuIHdoZW4geW91IHRyeSB0byBzZXQvZ2V0IGEKLWNvbnRyb2wgY2xhc3MgY29udHJvbHMuIGl2dHYgY3VycmVudGx5IHJldHVybnMgLUVJTlZBTCAoaW5kaWNhdGluZyB0aGF0IHRoZQotY29udHJvbCBJRCBkb2VzIG5vdCBleGlzdCkgd2hpbGUgdGhlIGZyYW1ld29yayB3aWxsIHJldHVybiAtRUFDQ0VTLCB3aGljaAotbWFrZXMgbW9yZSBzZW5zZS4KK2NvbnRyb2wgY2xhc3MgY29udHJvbHMuIFRoZSBmcmFtZXdvcmsgd2lsbCByZXR1cm4gLUVBQ0NFUy4KIAogCiBQcm9wb3NhbHMgZm9yIEV4dGVuc2lvbnMKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdmlkZW80bGludXgvdjRsMi1mcmFtZXdvcmsudHh0IGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC92NGwyLWZyYW1ld29yay50eHQKaW5kZXggY2YyMWY3YS4uZjhkY2FiZiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC92NGwyLWZyYW1ld29yay50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC92NGwyLWZyYW1ld29yay50eHQKQEAgLTgxNywxMSArODE3LDcgQEAKIAogCS4uLgogCi0JcmV0ID0gdjRsMl9maF9pbml0KCZteV9maC0+ZmgsIHZmZCk7Ci0JaWYgKHJldCkgewotCQlrZnJlZShteV9maCk7Ci0JCXJldHVybiByZXQ7Ci0JfQorCXY0bDJfZmhfaW5pdCgmbXlfZmgtPmZoLCB2ZmQpOwogCiAJLi4uCiAKQEAgLTg0NCw3ICs4NDAsNyBAQAogCiBCZWxvdyBpcyBhIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSB2NGwyX2ZoIGZ1bmN0aW9ucyB1c2VkOgogCi1pbnQgdjRsMl9maF9pbml0KHN0cnVjdCB2NGwyX2ZoICpmaCwgc3RydWN0IHZpZGVvX2RldmljZSAqdmRldikKK3ZvaWQgdjRsMl9maF9pbml0KHN0cnVjdCB2NGwyX2ZoICpmaCwgc3RydWN0IHZpZGVvX2RldmljZSAqdmRldikKIAogICBJbml0aWFsaXNlIHRoZSBmaWxlIGhhbmRsZS4gVGhpcyAqTVVTVCogYmUgcGVyZm9ybWVkIGluIHRoZSBkcml2ZXIncwogICB2NGwyX2ZpbGVfb3BlcmF0aW9ucy0+b3BlbigpIGhhbmRsZXIuCkBAIC05MDEsMTUgKzg5NywzOSBAQAogVGhlIFY0TDIgZXZlbnRzIHByb3ZpZGUgYSBnZW5lcmljIHdheSB0byBwYXNzIGV2ZW50cyB0byB1c2VyIHNwYWNlLgogVGhlIGRyaXZlciBtdXN0IHVzZSB2NGwyX2ZoIHRvIGJlIGFibGUgdG8gc3VwcG9ydCBWNEwyIGV2ZW50cy4KIAorRXZlbnRzIGFyZSBkZWZpbmVkIGJ5IGEgdHlwZSBhbmQgYW4gb3B0aW9uYWwgSUQuIFRoZSBJRCBtYXkgcmVmZXIgdG8gYSBWNEwyCitvYmplY3Qgc3VjaCBhcyBhIGNvbnRyb2wgSUQuIElmIHVudXNlZCwgdGhlbiB0aGUgSUQgaXMgMC4KKworV2hlbiB0aGUgdXNlciBzdWJzY3JpYmVzIHRvIGFuIGV2ZW50IHRoZSBkcml2ZXIgd2lsbCBhbGxvY2F0ZSBhIG51bWJlciBvZgora2V2ZW50IHN0cnVjdHMgZm9yIHRoYXQgZXZlbnQuIFNvIGV2ZXJ5ICh0eXBlLCBJRCkgZXZlbnQgdHVwbGUgd2lsbCBoYXZlCitpdHMgb3duIHNldCBvZiBrZXZlbnQgc3RydWN0cy4gVGhpcyBndWFyYW50ZWVzIHRoYXQgaWYgYSBkcml2ZXIgaXMgZ2VuZXJhdGluZworbG90cyBvZiBldmVudHMgb2Ygb25lIHR5cGUgaW4gYSBzaG9ydCB0aW1lLCB0aGVuIHRoYXQgd2lsbCBub3Qgb3ZlcndyaXRlCitldmVudHMgb2YgYW5vdGhlciB0eXBlLgorCitCdXQgaWYgeW91IGdldCBtb3JlIGV2ZW50cyBvZiBvbmUgdHlwZSB0aGFuIHRoZSBudW1iZXIgb2Yga2V2ZW50cyB0aGF0IHdlcmUKK3Jlc2VydmVkLCB0aGVuIHRoZSBvbGRlc3QgZXZlbnQgd2lsbCBiZSBkcm9wcGVkIGFuZCB0aGUgbmV3IG9uZSBhZGRlZC4KKworRnVydGhlcm1vcmUsIHRoZSBpbnRlcm5hbCBzdHJ1Y3QgdjRsMl9zdWJzY3JpYmVkX2V2ZW50IGhhcyBtZXJnZSgpIGFuZAorcmVwbGFjZSgpIGNhbGxiYWNrcyB3aGljaCBkcml2ZXJzIGNhbiBzZXQuIFRoZXNlIGNhbGxiYWNrcyBhcmUgY2FsbGVkIHdoZW4KK2EgbmV3IGV2ZW50IGlzIHJhaXNlZCBhbmQgdGhlcmUgaXMgbm8gbW9yZSByb29tLiBUaGUgcmVwbGFjZSgpIGNhbGxiYWNrCithbGxvd3MgeW91IHRvIHJlcGxhY2UgdGhlIHBheWxvYWQgb2YgdGhlIG9sZCBldmVudCB3aXRoIHRoYXQgb2YgdGhlIG5ldyBldmVudCwKK21lcmdpbmcgYW55IHJlbGV2YW50IGRhdGEgZnJvbSB0aGUgb2xkIHBheWxvYWQgaW50byB0aGUgbmV3IHBheWxvYWQgdGhhdAorcmVwbGFjZXMgaXQuIEl0IGlzIGNhbGxlZCB3aGVuIHRoaXMgZXZlbnQgdHlwZSBoYXMgb25seSBvbmUga2V2ZW50IHN0cnVjdAorYWxsb2NhdGVkLiBUaGUgbWVyZ2UoKSBjYWxsYmFjayBhbGxvd3MgeW91IHRvIG1lcmdlIHRoZSBvbGRlc3QgZXZlbnQgcGF5bG9hZAoraW50byB0aGF0IG9mIHRoZSBzZWNvbmQtb2xkZXN0IGV2ZW50IHBheWxvYWQuIEl0IGlzIGNhbGxlZCB3aGVuIHRoZXJlIGFyZSB0d28KK29yIG1vcmUga2V2ZW50IHN0cnVjdHMgYWxsb2NhdGVkLgorCitUaGlzIHdheSBubyBzdGF0dXMgaW5mb3JtYXRpb24gaXMgbG9zdCwganVzdCB0aGUgaW50ZXJtZWRpYXRlIHN0ZXBzIGxlYWRpbmcKK3VwIHRvIHRoYXQgc3RhdGUuCisKK0EgZ29vZCBleGFtcGxlIG9mIHRoZXNlIHJlcGxhY2UvbWVyZ2UgY2FsbGJhY2tzIGlzIGluIHY0bDItZXZlbnQuYzoKK2N0cmxzX3JlcGxhY2UoKSBhbmQgY3RybHNfbWVyZ2UoKSBjYWxsYmFja3MgZm9yIHRoZSBjb250cm9sIGV2ZW50LgorCitOb3RlOiB0aGVzZSBjYWxsYmFja3MgY2FuIGJlIGNhbGxlZCBmcm9tIGludGVycnVwdCBjb250ZXh0LCBzbyB0aGV5IG11c3QgYmUKK2Zhc3QuCisKIFVzZWZ1bCBmdW5jdGlvbnM6CiAKLS0gdjRsMl9ldmVudF9hbGxvYygpCi0KLSAgVG8gdXNlIGV2ZW50cywgdGhlIGRyaXZlciBtdXN0IGFsbG9jYXRlIGV2ZW50cyBmb3IgdGhlIGZpbGUgaGFuZGxlLiBCeQotICBjYWxsaW5nIHRoZSBmdW5jdGlvbiBtb3JlIHRoYW4gb25jZSwgdGhlIGRyaXZlciBtYXkgYXNzdXJlIHRoYXQgYXQgbGVhc3QgbgotICBldmVudHMgaW4gdG90YWwgaGF2ZSBiZWVuIGFsbG9jYXRlZC4gVGhlIGZ1bmN0aW9uIG1heSBub3QgYmUgY2FsbGVkIGluCi0gIGF0b21pYyBjb250ZXh0LgotCiAtIHY0bDJfZXZlbnRfcXVldWUoKQogCiAgIFF1ZXVlIGV2ZW50cyB0byB2aWRlbyBkZXZpY2UuIFRoZSBkcml2ZXIncyBvbmx5IHJlc3BvbnNpYmlsaXR5IGlzIHRvIGZpbGwKQEAgLTkyMCw3ICs5NDAsOSBAQAogCiAgIFRoZSB2aWRlb19kZXZpY2UtPmlvY3RsX29wcy0+dmlkaW9jX3N1YnNjcmliZV9ldmVudCBtdXN0IGNoZWNrIHRoZSBkcml2ZXIKICAgaXMgYWJsZSB0byBwcm9kdWNlIGV2ZW50cyB3aXRoIHNwZWNpZmllZCBldmVudCBpZC4gVGhlbiBpdCBjYWxscwotICB2NGwyX2V2ZW50X3N1YnNjcmliZSgpIHRvIHN1YnNjcmliZSB0aGUgZXZlbnQuCisgIHY0bDJfZXZlbnRfc3Vic2NyaWJlKCkgdG8gc3Vic2NyaWJlIHRoZSBldmVudC4gVGhlIGxhc3QgYXJndW1lbnQgaXMgdGhlCisgIHNpemUgb2YgdGhlIGV2ZW50IHF1ZXVlIGZvciB0aGlzIGV2ZW50LiBJZiBpdCBpcyAwLCB0aGVuIHRoZSBmcmFtZXdvcmsKKyAgd2lsbCBmaWxsIGluIGEgZGVmYXVsdCB2YWx1ZSAodGhpcyBkZXBlbmRzIG9uIHRoZSBldmVudCB0eXBlKS4KIAogLSB2NGwyX2V2ZW50X3Vuc3Vic2NyaWJlKCkKIApAQCAtOTM1LDE0ICs5NTcsOCBAQAogCiAgIFJldHVybnMgdGhlIG51bWJlciBvZiBwZW5kaW5nIGV2ZW50cy4gVXNlZnVsIHdoZW4gaW1wbGVtZW50aW5nIHBvbGwuCiAKLURyaXZlcnMgZG8gbm90IGluaXRpYWxpc2UgZXZlbnRzIGRpcmVjdGx5LiBUaGUgZXZlbnRzIGFyZSBpbml0aWFsaXNlZAotdGhyb3VnaCB2NGwyX2ZoX2luaXQoKSBpZiB2aWRlb19kZXZpY2UtPmlvY3RsX29wcy0+dmlkaW9jX3N1YnNjcmliZV9ldmVudCBpcwotbm9uLU5VTEwuIFRoaXMgKk1VU1QqIGJlIHBlcmZvcm1lZCBpbiB0aGUgZHJpdmVyJ3MKLXY0bDJfZmlsZV9vcGVyYXRpb25zLT5vcGVuKCkgaGFuZGxlci4KLQogRXZlbnRzIGFyZSBkZWxpdmVyZWQgdG8gdXNlciBzcGFjZSB0aHJvdWdoIHRoZSBwb2xsIHN5c3RlbSBjYWxsLiBUaGUgZHJpdmVyCi1jYW4gdXNlIHY0bDJfZmgtPmV2ZW50cy0+d2FpdCB3YWl0X3F1ZXVlX2hlYWRfdCBhcyB0aGUgYXJndW1lbnQgZm9yCi1wb2xsX3dhaXQoKS4KK2NhbiB1c2UgdjRsMl9maC0+d2FpdCAoYSB3YWl0X3F1ZXVlX2hlYWRfdCkgYXMgdGhlIGFyZ3VtZW50IGZvciBwb2xsX3dhaXQoKS4KIAogVGhlcmUgYXJlIHN0YW5kYXJkIGFuZCBwcml2YXRlIGV2ZW50cy4gTmV3IHN0YW5kYXJkIGV2ZW50cyBtdXN0IHVzZSB0aGUKIHNtYWxsZXN0IGF2YWlsYWJsZSBldmVudCB0eXBlLiBUaGUgZHJpdmVycyBtdXN0IGFsbG9jYXRlIHRoZWlyIGV2ZW50cyBmcm9tCkBAIC05NTIsNSArOTY4LDQgQEAKIGF2YWlsYWJsZSBldmVudCB0eXBlIGlzICdjbGFzcyBiYXNlICsgMScuCiAKIEFuIGV4YW1wbGUgb24gaG93IHRoZSBWNEwyIGV2ZW50cyBtYXkgYmUgdXNlZCBjYW4gYmUgZm91bmQgaW4gdGhlIE9NQVAKLTMgSVNQIGRyaXZlciBhdmFpbGFibGUgYXQgPFVSTDpodHRwOi8vZ2l0b3Jpb3VzLm9yZy9vbWFwM2NhbWVyYT4gYXMgb2YKLXdyaXRpbmcgdGhpcy4KKzMgSVNQIGRyaXZlciAoZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcCkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3dhdGNoZG9nLzAwLUlOREVYIGIvRG9jdW1lbnRhdGlvbi93YXRjaGRvZy8wMC1JTkRFWAppbmRleCBlZTk5NDUxLi5mYzUxMTI4IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3dhdGNoZG9nLzAwLUlOREVYCisrKyBiL0RvY3VtZW50YXRpb24vd2F0Y2hkb2cvMDAtSU5ERVgKQEAgLTgsNiArOCw4IEBACiAJLSBkaXJlY3RvcnkgaG9sZGluZyB3YXRjaGRvZyByZWxhdGVkIGV4YW1wbGUgcHJvZ3JhbXMuCiB3YXRjaGRvZy1hcGkudHh0CiAJLSBkZXNjcmlwdGlvbiBvZiB0aGUgTGludXggV2F0Y2hkb2cgZHJpdmVyIEFQSS4KK3dhdGNoZG9nLWtlcm5lbC1hcGkudHh0CisJLSBkZXNjcmlwdGlvbiBvZiB0aGUgTGludXggV2F0Y2hEb2cgVGltZXIgRHJpdmVyIENvcmUga2VybmVsIEFQSS4KIHdhdGNoZG9nLXBhcmFtZXRlcnMudHh0CiAJLSBpbmZvcm1hdGlvbiBvbiBkcml2ZXIgcGFyYW1ldGVycyAoZm9yIGRyaXZlcnMgb3RoZXIgdGhhbgogCSAgdGhlIG9uZXMgdGhhdCBoYXZlIGRyaXZlci1zcGVjaWZpYyBmaWxlcyBoZXJlKQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi93YXRjaGRvZy93YXRjaGRvZy1rZXJuZWwtYXBpLnR4dCBiL0RvY3VtZW50YXRpb24vd2F0Y2hkb2cvd2F0Y2hkb2cta2VybmVsLWFwaS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY3Yzg5NAotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vd2F0Y2hkb2cvd2F0Y2hkb2cta2VybmVsLWFwaS50eHQKQEAgLTAsMCArMSwxNjIgQEAKK1RoZSBMaW51eCBXYXRjaERvZyBUaW1lciBEcml2ZXIgQ29yZSBrZXJuZWwgQVBJLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0xhc3QgcmV2aWV3ZWQ6IDIyLUp1bC0yMDExCisKK1dpbSBWYW4gU2Vicm9lY2sgPHdpbUBpZ3VhbmEuYmU+CisKK0ludHJvZHVjdGlvbgorLS0tLS0tLS0tLS0tCitUaGlzIGRvY3VtZW50IGRvZXMgbm90IGRlc2NyaWJlIHdoYXQgYSBXYXRjaERvZyBUaW1lciAoV0RUKSBEcml2ZXIgb3IgRGV2aWNlIGlzLgorSXQgYWxzbyBkb2VzIG5vdCBkZXNjcmliZSB0aGUgQVBJIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IHVzZXIgc3BhY2UgdG8gY29tbXVuaWNhdGUKK3dpdGggYSBXYXRjaERvZyBUaW1lci4gSWYgeW91IHdhbnQgdG8ga25vdyB0aGlzIHRoZW4gcGxlYXNlIHJlYWQgdGhlIGZvbGxvd2luZworZmlsZTogRG9jdW1lbnRhdGlvbi93YXRjaGRvZy93YXRjaGRvZy1hcGkudHh0IC4KKworU28gd2hhdCBkb2VzIHRoaXMgZG9jdW1lbnQgZGVzY3JpYmU/IEl0IGRlc2NyaWJlcyB0aGUgQVBJIHRoYXQgY2FuIGJlIHVzZWQgYnkKK1dhdGNoRG9nIFRpbWVyIERyaXZlcnMgdGhhdCB3YW50IHRvIHVzZSB0aGUgV2F0Y2hEb2cgVGltZXIgRHJpdmVyIENvcmUKK0ZyYW1ld29yay4gVGhpcyBmcmFtZXdvcmsgcHJvdmlkZXMgYWxsIGludGVyZmFjaW5nIHRvd2FyZHMgdXNlciBzcGFjZSBzbyB0aGF0Cit0aGUgc2FtZSBjb2RlIGRvZXMgbm90IGhhdmUgdG8gYmUgcmVwcm9kdWNlZCBlYWNoIHRpbWUuIFRoaXMgYWxzbyBtZWFucyB0aGF0CithIHdhdGNoZG9nIHRpbWVyIGRyaXZlciB0aGVuIG9ubHkgbmVlZHMgdG8gcHJvdmlkZSB0aGUgZGlmZmVyZW50IHJvdXRpbmVzCisob3BlcmF0aW9ucykgdGhhdCBjb250cm9sIHRoZSB3YXRjaGRvZyB0aW1lciAoV0RUKS4KKworVGhlIEFQSQorLS0tLS0tLQorRWFjaCB3YXRjaGRvZyB0aW1lciBkcml2ZXIgdGhhdCB3YW50cyB0byB1c2UgdGhlIFdhdGNoRG9nIFRpbWVyIERyaXZlciBDb3JlCittdXN0ICNpbmNsdWRlIDxsaW51eC93YXRjaGRvZy5oPiAoeW91IHdvdWxkIGhhdmUgdG8gZG8gdGhpcyBhbnl3YXkgd2hlbgord3JpdGluZyBhIHdhdGNoZG9nIGRldmljZSBkcml2ZXIpLiBUaGlzIGluY2x1ZGUgZmlsZSBjb250YWlucyBmb2xsb3dpbmcKK3JlZ2lzdGVyL3VucmVnaXN0ZXIgcm91dGluZXM6CisKK2V4dGVybiBpbnQgd2F0Y2hkb2dfcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKik7CitleHRlcm4gdm9pZCB3YXRjaGRvZ191bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICopOworCitUaGUgd2F0Y2hkb2dfcmVnaXN0ZXJfZGV2aWNlIHJvdXRpbmUgcmVnaXN0ZXJzIGEgd2F0Y2hkb2cgdGltZXIgZGV2aWNlLgorVGhlIHBhcmFtZXRlciBvZiB0aGlzIHJvdXRpbmUgaXMgYSBwb2ludGVyIHRvIGEgd2F0Y2hkb2dfZGV2aWNlIHN0cnVjdHVyZS4KK1RoaXMgcm91dGluZSByZXR1cm5zIHplcm8gb24gc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJubyBjb2RlIGZvciBmYWlsdXJlLgorCitUaGUgd2F0Y2hkb2dfdW5yZWdpc3Rlcl9kZXZpY2Ugcm91dGluZSBkZXJlZ2lzdGVycyBhIHJlZ2lzdGVyZWQgd2F0Y2hkb2cgdGltZXIKK2RldmljZS4gVGhlIHBhcmFtZXRlciBvZiB0aGlzIHJvdXRpbmUgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIHJlZ2lzdGVyZWQKK3dhdGNoZG9nX2RldmljZSBzdHJ1Y3R1cmUuCisKK1RoZSB3YXRjaGRvZyBkZXZpY2Ugc3RydWN0dXJlIGxvb2tzIGxpa2UgdGhpczoKKworc3RydWN0IHdhdGNoZG9nX2RldmljZSB7CisJY29uc3Qgc3RydWN0IHdhdGNoZG9nX2luZm8gKmluZm87CisJY29uc3Qgc3RydWN0IHdhdGNoZG9nX29wcyAqb3BzOworCXVuc2lnbmVkIGludCBib290c3RhdHVzOworCXVuc2lnbmVkIGludCB0aW1lb3V0OworCXVuc2lnbmVkIGludCBtaW5fdGltZW91dDsKKwl1bnNpZ25lZCBpbnQgbWF4X3RpbWVvdXQ7CisJdm9pZCAqZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgbG9uZyBzdGF0dXM7Cit9OworCitJdCBjb250YWlucyBmb2xsb3dpbmcgZmllbGRzOgorKiBpbmZvOiBhIHBvaW50ZXIgdG8gYSB3YXRjaGRvZ19pbmZvIHN0cnVjdHVyZS4gVGhpcyBzdHJ1Y3R1cmUgZ2l2ZXMgc29tZQorICBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSB3YXRjaGRvZyB0aW1lciBpdHNlbGYuIChMaWtlIGl0J3MgdW5pcXVlIG5hbWUpCisqIG9wczogYSBwb2ludGVyIHRvIHRoZSBsaXN0IG9mIHdhdGNoZG9nIG9wZXJhdGlvbnMgdGhhdCB0aGUgd2F0Y2hkb2cgc3VwcG9ydHMuCisqIHRpbWVvdXQ6IHRoZSB3YXRjaGRvZyB0aW1lcidzIHRpbWVvdXQgdmFsdWUgKGluIHNlY29uZHMpLgorKiBtaW5fdGltZW91dDogdGhlIHdhdGNoZG9nIHRpbWVyJ3MgbWluaW11bSB0aW1lb3V0IHZhbHVlIChpbiBzZWNvbmRzKS4KKyogbWF4X3RpbWVvdXQ6IHRoZSB3YXRjaGRvZyB0aW1lcidzIG1heGltdW0gdGltZW91dCB2YWx1ZSAoaW4gc2Vjb25kcykuCisqIGJvb3RzdGF0dXM6IHN0YXR1cyBvZiB0aGUgZGV2aWNlIGFmdGVyIGJvb3RpbmcgKHJlcG9ydGVkIHdpdGggd2F0Y2hkb2cKKyAgV0RJT0ZfKiBzdGF0dXMgYml0cykuCisqIGRyaXZlcl9kYXRhOiBhIHBvaW50ZXIgdG8gdGhlIGRyaXZlcnMgcHJpdmF0ZSBkYXRhIG9mIGEgd2F0Y2hkb2cgZGV2aWNlLgorICBUaGlzIGRhdGEgc2hvdWxkIG9ubHkgYmUgYWNjZXNzZWQgdmlhIHRoZSB3YXRjaGRvZ19zZXRfZHJ2YWRhdGEgYW5kCisgIHdhdGNoZG9nX2dldF9kcnZkYXRhIHJvdXRpbmVzLgorKiBzdGF0dXM6IHRoaXMgZmllbGQgY29udGFpbnMgYSBudW1iZXIgb2Ygc3RhdHVzIGJpdHMgdGhhdCBnaXZlIGV4dHJhCisgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIGRldmljZSAoTGlrZTogaXMgdGhlIHdhdGNoZG9nIHRpbWVyCisgIHJ1bm5pbmcvYWN0aXZlLCBpcyB0aGUgbm93YXlvdXQgYml0IHNldCwgaXMgdGhlIGRldmljZSBvcGVuZWQgdmlhCisgIHRoZSAvZGV2L3dhdGNoZG9nIGludGVyZmFjZSBvciBub3QsIC4uLikuCisKK1RoZSBsaXN0IG9mIHdhdGNoZG9nIG9wZXJhdGlvbnMgaXMgZGVmaW5lZCBhczoKKworc3RydWN0IHdhdGNoZG9nX29wcyB7CisJc3RydWN0IG1vZHVsZSAqb3duZXI7CisJLyogbWFuZGF0b3J5IG9wZXJhdGlvbnMgKi8KKwlpbnQgKCpzdGFydCkoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqKTsKKwlpbnQgKCpzdG9wKShzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICopOworCS8qIG9wdGlvbmFsIG9wZXJhdGlvbnMgKi8KKwlpbnQgKCpwaW5nKShzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICopOworCXVuc2lnbmVkIGludCAoKnN0YXR1cykoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqKTsKKwlpbnQgKCpzZXRfdGltZW91dCkoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqLCB1bnNpZ25lZCBpbnQpOworCWxvbmcgKCppb2N0bCkoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOworfTsKKworSXQgaXMgaW1wb3J0YW50IHRoYXQgeW91IGZpcnN0IGRlZmluZSB0aGUgbW9kdWxlIG93bmVyIG9mIHRoZSB3YXRjaGRvZyB0aW1lcgorZHJpdmVyJ3Mgb3BlcmF0aW9ucy4gVGhpcyBtb2R1bGUgb3duZXIgd2lsbCBiZSB1c2VkIHRvIGxvY2sgdGhlIG1vZHVsZSB3aGVuCit0aGUgd2F0Y2hkb2cgaXMgYWN0aXZlLiAoVGhpcyB0byBhdm9pZCBhIHN5c3RlbSBjcmFzaCB3aGVuIHlvdSB1bmxvYWQgdGhlCittb2R1bGUgYW5kIC9kZXYvd2F0Y2hkb2cgaXMgc3RpbGwgb3BlbikuCitTb21lIG9wZXJhdGlvbnMgYXJlIG1hbmRhdG9yeSBhbmQgc29tZSBhcmUgb3B0aW9uYWwuIFRoZSBtYW5kYXRvcnkgb3BlcmF0aW9ucworYXJlOgorKiBzdGFydDogdGhpcyBpcyBhIHBvaW50ZXIgdG8gdGhlIHJvdXRpbmUgdGhhdCBzdGFydHMgdGhlIHdhdGNoZG9nIHRpbWVyCisgIGRldmljZS4KKyAgVGhlIHJvdXRpbmUgbmVlZHMgYSBwb2ludGVyIHRvIHRoZSB3YXRjaGRvZyB0aW1lciBkZXZpY2Ugc3RydWN0dXJlIGFzIGEKKyAgcGFyYW1ldGVyLiBJdCByZXR1cm5zIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm5vIGNvZGUgZm9yIGZhaWx1cmUuCisqIHN0b3A6IHdpdGggdGhpcyByb3V0aW5lIHRoZSB3YXRjaGRvZyB0aW1lciBkZXZpY2UgaXMgYmVpbmcgc3RvcHBlZC4KKyAgVGhlIHJvdXRpbmUgbmVlZHMgYSBwb2ludGVyIHRvIHRoZSB3YXRjaGRvZyB0aW1lciBkZXZpY2Ugc3RydWN0dXJlIGFzIGEKKyAgcGFyYW1ldGVyLiBJdCByZXR1cm5zIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm5vIGNvZGUgZm9yIGZhaWx1cmUuCisgIFNvbWUgd2F0Y2hkb2cgdGltZXIgaGFyZHdhcmUgY2FuIG9ubHkgYmUgc3RhcnRlZCBhbmQgbm90IGJlIHN0b3BwZWQuIFRoZQorICBkcml2ZXIgc3VwcG9ydGluZyB0aGlzIGhhcmR3YXJlIG5lZWRzIHRvIG1ha2Ugc3VyZSB0aGF0IGEgc3RhcnQgYW5kIHN0b3AKKyAgcm91dGluZSBpcyBiZWluZyBwcm92aWRlZC4gVGhpcyBjYW4gYmUgZG9uZSBieSB1c2luZyBhIHRpbWVyIGluIHRoZSBkcml2ZXIKKyAgdGhhdCByZWd1bGFybHkgc2VuZHMgYSBrZWVwYWxpdmUgcGluZyB0byB0aGUgd2F0Y2hkb2cgdGltZXIgaGFyZHdhcmUuCisKK05vdCBhbGwgd2F0Y2hkb2cgdGltZXIgaGFyZHdhcmUgc3VwcG9ydHMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eS4gVGhhdCdzIHdoeQorYWxsIG90aGVyIHJvdXRpbmVzL29wZXJhdGlvbnMgYXJlIG9wdGlvbmFsLiBUaGV5IG9ubHkgbmVlZCB0byBiZSBwcm92aWRlZCBpZgordGhleSBhcmUgc3VwcG9ydGVkLiBUaGVzZSBvcHRpb25hbCByb3V0aW5lcy9vcGVyYXRpb25zIGFyZToKKyogcGluZzogdGhpcyBpcyB0aGUgcm91dGluZSB0aGF0IHNlbmRzIGEga2VlcGFsaXZlIHBpbmcgdG8gdGhlIHdhdGNoZG9nIHRpbWVyCisgIGhhcmR3YXJlLgorICBUaGUgcm91dGluZSBuZWVkcyBhIHBvaW50ZXIgdG8gdGhlIHdhdGNoZG9nIHRpbWVyIGRldmljZSBzdHJ1Y3R1cmUgYXMgYQorICBwYXJhbWV0ZXIuIEl0IHJldHVybnMgemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZXJybm8gY29kZSBmb3IgZmFpbHVyZS4KKyAgTW9zdCBoYXJkd2FyZSB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBhcyBhIHNlcGFyYXRlIGZ1bmN0aW9uIHVzZXMgdGhlCisgIHN0YXJ0IGZ1bmN0aW9uIHRvIHJlc3RhcnQgdGhlIHdhdGNoZG9nIHRpbWVyIGhhcmR3YXJlLiBBbmQgdGhhdCdzIGFsc28gd2hhdAorICB0aGUgd2F0Y2hkb2cgdGltZXIgZHJpdmVyIGNvcmUgZG9lczogdG8gc2VuZCBhIGtlZXBhbGl2ZSBwaW5nIHRvIHRoZSB3YXRjaGRvZworICB0aW1lciBoYXJkd2FyZSBpdCB3aWxsIGVpdGhlciB1c2UgdGhlIHBpbmcgb3BlcmF0aW9uICh3aGVuIGF2YWlsYWJsZSkgb3IgdGhlCisgIHN0YXJ0IG9wZXJhdGlvbiAod2hlbiB0aGUgcGluZyBvcGVyYXRpb24gaXMgbm90IGF2YWlsYWJsZSkuCisgIChOb3RlOiB0aGUgV0RJT0NfS0VFUEFMSVZFIGlvY3RsIGNhbGwgd2lsbCBvbmx5IGJlIGFjdGl2ZSB3aGVuIHRoZQorICBXRElPRl9LRUVQQUxJVkVQSU5HIGJpdCBoYXMgYmVlbiBzZXQgaW4gdGhlIG9wdGlvbiBmaWVsZCBvbiB0aGUgd2F0Y2hkb2cncworICBpbmZvIHN0cnVjdHVyZSkuCisqIHN0YXR1czogdGhpcyByb3V0aW5lIGNoZWNrcyB0aGUgc3RhdHVzIG9mIHRoZSB3YXRjaGRvZyB0aW1lciBkZXZpY2UuIFRoZQorICBzdGF0dXMgb2YgdGhlIGRldmljZSBpcyByZXBvcnRlZCB3aXRoIHdhdGNoZG9nIFdESU9GXyogc3RhdHVzIGZsYWdzL2JpdHMuCisqIHNldF90aW1lb3V0OiB0aGlzIHJvdXRpbmUgY2hlY2tzIGFuZCBjaGFuZ2VzIHRoZSB0aW1lb3V0IG9mIHRoZSB3YXRjaGRvZworICB0aW1lciBkZXZpY2UuIEl0IHJldHVybnMgMCBvbiBzdWNjZXNzLCAtRUlOVkFMIGZvciAicGFyYW1ldGVyIG91dCBvZiByYW5nZSIKKyAgYW5kIC1FSU8gZm9yICJjb3VsZCBub3Qgd3JpdGUgdmFsdWUgdG8gdGhlIHdhdGNoZG9nIi4gT24gc3VjY2VzcyB0aGUgdGltZW91dAorICB2YWx1ZSBvZiB0aGUgd2F0Y2hkb2dfZGV2aWNlIHdpbGwgYmUgY2hhbmdlZCB0byB0aGUgdmFsdWUgdGhhdCB3YXMganVzdCB1c2VkCisgIHRvIHJlLXByb2dyYW0gdGhlIHdhdGNoZG9nIHRpbWVyIGRldmljZS4KKyAgKE5vdGU6IHRoZSBXRElPRl9TRVRUSU1FT1VUIG5lZWRzIHRvIGJlIHNldCBpbiB0aGUgb3B0aW9ucyBmaWVsZCBvZiB0aGUKKyAgd2F0Y2hkb2cncyBpbmZvIHN0cnVjdHVyZSkuCisqIGlvY3RsOiBpZiB0aGlzIHJvdXRpbmUgaXMgcHJlc2VudCB0aGVuIGl0IHdpbGwgYmUgY2FsbGVkIGZpcnN0IGJlZm9yZSB3ZSBkbworICBvdXIgb3duIGludGVybmFsIGlvY3RsIGNhbGwgaGFuZGxpbmcuIFRoaXMgcm91dGluZSBzaG91bGQgcmV0dXJuIC1FTk9JT0NUTENNRAorICBpZiBhIGNvbW1hbmQgaXMgbm90IHN1cHBvcnRlZC4gVGhlIHBhcmFtZXRlcnMgdGhhdCBhcmUgcGFzc2VkIHRvIHRoZSBpb2N0bAorICBjYWxsIGFyZTogd2F0Y2hkb2dfZGV2aWNlLCBjbWQgYW5kIGFyZy4KKworVGhlIHN0YXR1cyBiaXRzIHNob3VsZCAocHJlZmVyYWJseSkgYmUgc2V0IHdpdGggdGhlIHNldF9iaXQgYW5kIGNsZWFyX2JpdCBhbGlrZQorYml0LW9wZXJhdGlvbnMuIFRoZSBzdGF0dXMgYml0cyB0aGF0IGFyZSBkZWZpbmVkIGFyZToKKyogV0RPR19BQ1RJVkU6IHRoaXMgc3RhdHVzIGJpdCBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgYSB3YXRjaGRvZyB0aW1lciBkZXZpY2UKKyAgaXMgYWN0aXZlIG9yIG5vdC4gV2hlbiB0aGUgd2F0Y2hkb2cgaXMgYWN0aXZlIGFmdGVyIGJvb3RpbmcsIHRoZW4geW91IHNob3VsZAorICBzZXQgdGhpcyBzdGF0dXMgYml0IChOb3RlOiB3aGVuIHlvdSByZWdpc3RlciB0aGUgd2F0Y2hkb2cgdGltZXIgZGV2aWNlIHdpdGgKKyAgdGhpcyBiaXQgc2V0LCB0aGVuIG9wZW5pbmcgL2Rldi93YXRjaGRvZyB3aWxsIHNraXAgdGhlIHN0YXJ0IG9wZXJhdGlvbikKKyogV0RPR19ERVZfT1BFTjogdGhpcyBzdGF0dXMgYml0IHNob3dzIHdoZXRoZXIgb3Igbm90IHRoZSB3YXRjaGRvZyBkZXZpY2UKKyAgd2FzIG9wZW5lZCB2aWEgL2Rldi93YXRjaGRvZy4KKyAgKFRoaXMgYml0IHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgdGhlIFdhdGNoRG9nIFRpbWVyIERyaXZlciBDb3JlKS4KKyogV0RPR19BTExPV19SRUxFQVNFOiB0aGlzIGJpdCBzdG9yZXMgd2hldGhlciBvciBub3QgdGhlIG1hZ2ljIGNsb3NlIGNoYXJhY3RlcgorICBoYXMgYmVlbiBzZW50IChzbyB0aGF0IHdlIGNhbiBzdXBwb3J0IHRoZSBtYWdpYyBjbG9zZSBmZWF0dXJlKS4KKyAgKFRoaXMgYml0IHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgdGhlIFdhdGNoRG9nIFRpbWVyIERyaXZlciBDb3JlKS4KKyogV0RPR19OT19XQVlfT1VUOiB0aGlzIGJpdCBzdG9yZXMgdGhlIG5vd2F5b3V0IHNldHRpbmcgZm9yIHRoZSB3YXRjaGRvZy4KKyAgSWYgdGhpcyBiaXQgaXMgc2V0IHRoZW4gdGhlIHdhdGNoZG9nIHRpbWVyIHdpbGwgbm90IGJlIGFibGUgdG8gc3RvcC4KKworTm90ZTogVGhlIFdhdGNoRG9nIFRpbWVyIERyaXZlciBDb3JlIHN1cHBvcnRzIHRoZSBtYWdpYyBjbG9zZSBmZWF0dXJlIGFuZAordGhlIG5vd2F5b3V0IGZlYXR1cmUuIFRvIHVzZSB0aGUgbWFnaWMgY2xvc2UgZmVhdHVyZSB5b3UgbXVzdCBzZXQgdGhlCitXRElPRl9NQUdJQ0NMT1NFIGJpdCBpbiB0aGUgb3B0aW9ucyBmaWVsZCBvZiB0aGUgd2F0Y2hkb2cncyBpbmZvIHN0cnVjdHVyZS4KK1RoZSBub3dheW91dCBmZWF0dXJlIHdpbGwgb3ZlcnJ1bGUgdGhlIG1hZ2ljIGNsb3NlIGZlYXR1cmUuCisKK1RvIGdldCBvciBzZXQgZHJpdmVyIHNwZWNpZmljIGRhdGEgdGhlIGZvbGxvd2luZyB0d28gaGVscGVyIGZ1bmN0aW9ucyBzaG91bGQgYmUKK3VzZWQ6CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3YXRjaGRvZ19zZXRfZHJ2ZGF0YShzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZGQsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW5saW5lIHZvaWQgKndhdGNoZG9nX2dldF9kcnZkYXRhKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCkKKworVGhlIHdhdGNoZG9nX3NldF9kcnZkYXRhIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gYWRkIGRyaXZlciBzcGVjaWZpYyBkYXRhLiBUaGUKK2FyZ3VtZW50cyBvZiB0aGlzIGZ1bmN0aW9uIGFyZSB0aGUgd2F0Y2hkb2cgZGV2aWNlIHdoZXJlIHlvdSB3YW50IHRvIGFkZCB0aGUKK2RyaXZlciBzcGVjaWZpYyBkYXRhIHRvIGFuZCBhIHBvaW50ZXIgdG8gdGhlIGRhdGEgaXRzZWxmLgorCitUaGUgd2F0Y2hkb2dfZ2V0X2RydmRhdGEgZnVuY3Rpb24gYWxsb3dzIHlvdSB0byByZXRyaWV2ZSBkcml2ZXIgc3BlY2lmaWMgZGF0YS4KK1RoZSBhcmd1bWVudCBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRoZSB3YXRjaGRvZyBkZXZpY2Ugd2hlcmUgeW91IHdhbnQgdG8gcmV0cmlldmUKK2RhdGEgZnJvbS4gVGhlIGZ1bmN0aW9uIHJldHJ1bnMgdGhlIHBvaW50ZXIgdG8gdGhlIGRyaXZlciBzcGVjaWZpYyBkYXRhLgpkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVSUwppbmRleCBjYTg3ZjQ3Li41MWQ0MmZiIDEwMDY0NAotLS0gYS9NQUlOVEFJTkVSUworKysgYi9NQUlOVEFJTkVSUwpAQCAtMTkyNSw2ICsxOTI1LDEyIEBACiBGOglhcmNoL3g4Ni9rZXJuZWwvY3B1aWQuYwogRjoJYXJjaC94ODYva2VybmVsL21zci5jCiAKK0NQVSBQT1dFUiBNT05JVE9SSU5HIFNVQlNZU1RFTQorTToJRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGRvbWluaWticm9kb3dza2kubmV0PgorTToJVGhvbWFzIFJlbm5pbmdlciA8dHJlbm5Ac3VzZS5kZT4KK1M6CU1haW50YWluZWQKK0Y6CXRvb2xzL3Bvd2VyL2NwdXBvd2VyCisKIENQVVNFVFMKIE06CVBhdWwgTWVuYWdlIDxtZW5hZ2VAZ29vZ2xlLmNvbT4KIFc6CWh0dHA6Ly93d3cuYnVsbG9wZW5zb3VyY2Uub3JnL2NwdXNldC8KQEAgLTMzNjAsNiArMzM2NiwxMiBAQAogRjoJZHJpdmVycy9uZXQvaXhnYmUvCiBGOglkcml2ZXJzL25ldC9peGdiZXZmLwogCitJTlRFTCBNUlNUIFBNVSBEUklWRVIKK006CUxlbiBCcm93biA8bGVuLmJyb3duQGludGVsLmNvbT4KK0w6CWxpbnV4LXBtQGxpc3RzLmxpbnV4LWZvdW5kYXRpb24ub3JnCitTOglTdXBwb3J0ZWQKK0Y6CWFyY2gveDg2L3BsYXRmb3JtL21yc3QvcG11LioKKwogSU5URUwgUFJPL1dJUkVMRVNTIDIxMDAgTkVUV09SSyBDT05ORUNUSU9OIFNVUFBPUlQKIEw6CWxpbnV4LXdpcmVsZXNzQHZnZXIua2VybmVsLm9yZwogUzoJT3JwaGFuCkBAIC00MTQ5LDYgKzQxNjEsMTMgQEAKIEY6CWRyaXZlcnMvdmlkZW8vbWF0cm94L21hdHJveGZiXyoKIEY6CWluY2x1ZGUvbGludXgvbWF0cm94ZmIuaAogCitNQVgxNjY4IFRFTVBFUkFUVVJFIFNFTlNPUiBEUklWRVIKK006CSJEYXZpZCBHZW9yZ2UiIDxkYXZpZC5nZW9yZ2VAc2thLmFjLnphPgorTDoJbG0tc2Vuc29yc0BsbS1zZW5zb3JzLm9yZworUzoJTWFpbnRhaW5lZAorRjoJRG9jdW1lbnRhdGlvbi9od21vbi9tYXgxNjY4CitGOglkcml2ZXJzL2h3bW9uL21heDE2NjguYworCiBNQVg2NjUwIEhBUkRXQVJFIE1PTklUT1IgQU5EIEZBTiBDT05UUk9MTEVSIERSSVZFUgogTToJIkhhbnMgSi4gS29jaCIgPGhqa0BoYW5zamtvY2guZGU+CiBMOglsbS1zZW5zb3JzQGxtLXNlbnNvcnMub3JnCkBAIC00NzA3LDYgKzQ3MjYsNyBAQAogRjoJZHJpdmVycy9vZgogRjoJaW5jbHVkZS9saW51eC9vZiouaAogSzoJb2ZfZ2V0X3Byb3BlcnR5CitLOglvZl9tYXRjaF90YWJsZQogCiBPUEVOUklTQyBBUkNISVRFQ1RVUkUKIE06CUpvbmFzIEJvbm4gPGpvbmFzQHNvdXRocG9sZS5zZT4KQEAgLTQ5OTcsNiArNTAxNywxNyBAQAogRjoJZHJpdmVycy92aWRlby9mYi1wdXYzLmMKIEY6CWRyaXZlcnMvcnRjL3J0Yy1wdXYzLmMKIAorUE1CVVMgSEFSRFdBUkUgTU9OSVRPUklORyBEUklWRVJTCitNOglHdWVudGVyIFJvZWNrIDxndWVudGVyLnJvZWNrQGVyaWNzc29uLmNvbT4KK0w6CWxtLXNlbnNvcnNAbG0tc2Vuc29ycy5vcmcKK1c6CWh0dHA6Ly93d3cubG0tc2Vuc29ycy5vcmcvCitXOglodHRwOi8vd3d3LnJvZWNrLXVzLm5ldC9saW51eC9kcml2ZXJzLworVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9ncm9lY2svbGludXgtc3RhZ2luZy5naXQKK1M6CU1haW50YWluZWQKK0Y6CURvY3VtZW50YXRpb24vaHdtb24vcG1idXMKK0Y6CWRyaXZlcnMvaHdtb24vcG1idXMvCitGOglpbmNsdWRlL2xpbnV4L2kyYy9wbWJ1cy5oCisKIFBNQyBTSUVSUkEgTWF4UkFJRCBEUklWRVIKIE06CUFuaWwgUmF2aW5kcmFuYXRoIDxhbmlsX3JhdmluZHJhbmF0aEBwbWMtc2llcnJhLmNvbT4KIEw6CWxpbnV4LXNjc2lAdmdlci5rZXJuZWwub3JnCkBAIC02MjkyLDYgKzYzMjMsNyBAQAogVEFSR0VUIFNVQlNZU1RFTQogTToJTmljaG9sYXMgQS4gQmVsbGluZ2VyIDxuYWJAbGludXgtaXNjc2kub3JnPgogTDoJbGludXgtc2NzaUB2Z2VyLmtlcm5lbC5vcmcKK0w6CXRhcmdldC1kZXZlbEB2Z2VyLmtlcm5lbC5vcmcKIEw6CWh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9saW51eC1pc2NzaS10YXJnZXQtZGV2CiBXOglodHRwOi8vd3d3LmxpbnV4LWlzY3NpLm9yZwogVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9uYWIvbGlvLWNvcmUtMi42LmdpdCBtYXN0ZXIKZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKaW5kZXggZDAxODk1Ni4uZjY3NmQxNSAxMDA2NDQKLS0tIGEvTWFrZWZpbGUKKysrIGIvTWFrZWZpbGUKQEAgLTM2MCw3ICszNjAsNyBAQAogTElOVVhJTkNMVURFICAgIDo9IC1JJChzcmN0cmVlKS9hcmNoLyQoaGRyLWFyY2gpL2luY2x1ZGUgXAogICAgICAgICAgICAgICAgICAgIC1JYXJjaC8kKGhkci1hcmNoKS9pbmNsdWRlL2dlbmVyYXRlZCAtSWluY2x1ZGUgXAogICAgICAgICAgICAgICAgICAgICQoaWYgJChLQlVJTERfU1JDKSwgLUkkKHNyY3RyZWUpL2luY2x1ZGUpIFwKLSAgICAgICAgICAgICAgICAgICAtaW5jbHVkZSBpbmNsdWRlL2dlbmVyYXRlZC9hdXRvY29uZi5oCisgICAgICAgICAgICAgICAgICAgLWluY2x1ZGUgJChzcmN0cmVlKS9pbmNsdWRlL2xpbnV4L2tjb25maWcuaAogCiBLQlVJTERfQ1BQRkxBR1MgOj0gLURfX0tFUk5FTF9fCiAKZGlmZiAtLWdpdCBhL2FyY2gvS2NvbmZpZyBiL2FyY2gvS2NvbmZpZwppbmRleCAyNmIwZTIzLi40YjA2NjljIDEwMDY0NAotLS0gYS9hcmNoL0tjb25maWcKKysrIGIvYXJjaC9LY29uZmlnCkBAIC0xNzgsNCArMTc4LDcgQEAKIGNvbmZpZyBIQVZFX1JDVV9UQUJMRV9GUkVFCiAJYm9vbAogCitjb25maWcgQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcKKwlib29sCisKIHNvdXJjZSAia2VybmVsL2djb3YvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvS2NvbmZpZyBiL2FyY2gvYWxwaGEvS2NvbmZpZwppbmRleCBjYTJkYThkLi42MGNkZTUzIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL0tjb25maWcKKysrIGIvYXJjaC9hbHBoYS9LY29uZmlnCkBAIC0xNCw2ICsxNCw3IEBACiAJc2VsZWN0IEFVVE9fSVJRX0FGRklOSVRZIGlmIFNNUAogCXNlbGVjdCBHRU5FUklDX0lSUV9TSE9XCiAJc2VsZWN0IEFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCCisJc2VsZWN0IEFSQ0hfSEFWRV9OTUlfU0FGRV9DTVBYQ0hHCiAJaGVscAogCSAgVGhlIEFscGhhIGlzIGEgNjQtYml0IGdlbmVyYWwtcHVycG9zZSBwcm9jZXNzb3IgZGVzaWduZWQgYW5kCiAJICBtYXJrZXRlZCBieSB0aGUgRGlnaXRhbCBFcXVpcG1lbnQgQ29ycG9yYXRpb24gb2YgYmxlc3NlZCBtZW1vcnksCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfYWxjb3IuYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19hbGNvci5jCmluZGV4IDBlMTQzOTkuLjg2MDZkNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19hbGNvci5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19hbGNvci5jCkBAIC0xODMsNyArMTgzLDcgQEAKICAqLwogCiBzdGF0aWMgaW50IF9faW5pdAotYWxjb3JfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCithbGNvcl9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdGF0aWMgY2hhciBpcnFfdGFiWzddWzVdIF9faW5pdGRhdGEgPSB7CiAJCS8qSU5UICAgIElOVEEgICBJTlRCICAgSU5UQyAgIElOVEQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19jYWJyaW9sZXQuYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19jYWJyaW9sZXQuYwppbmRleCBjOGMxMTJkLi4xMDI5NjE5IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfY2FicmlvbGV0LmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2NhYnJpb2xldC5jCkBAIC0xNzUsNyArMTc1LDcgQEAKICAqLwogCiBzdGF0aWMgaW5saW5lIGludCBfX2luaXQKLWViNjZwX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorZWI2NnBfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RhdGljIGNoYXIgaXJxX3RhYls1XVs1XSBfX2luaXRkYXRhID0gewogCQkvKklOVCAgSU5UQSAgSU5UQiAgSU5UQyAgIElOVEQgKi8KQEAgLTIwNSw3ICsyMDUsNyBAQAogICovCiAKIHN0YXRpYyBpbmxpbmUgaW50IF9faW5pdAotY2FicmlvbGV0X21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorY2FicmlvbGV0X21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0YXRpYyBjaGFyIGlycV90YWJbNV1bNV0gX19pbml0ZGF0YSA9IHsKIAkJLypJTlQgICBJTlRBICBJTlRCICBJTlRDICAgSU5URCAqLwpAQCAtMjg5LDcgKzI4OSw3IEBACiAgKi8KIAogc3RhdGljIGlubGluZSBpbnQgX19pbml0Ci1hbHBoYXBjMTY0X21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorYWxwaGFwYzE2NF9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdGF0aWMgY2hhciBpcnFfdGFiWzddWzVdIF9faW5pdGRhdGEgPSB7CiAJCS8qSU5UICAgSU5UQSAgSU5UQiAgIElOVEMgICBJTlREICovCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfZHAyNjQuYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19kcDI2NC5jCmluZGV4IGY4ODU2ODIuLmJiN2YwYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19kcDI2NC5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19kcDI2NC5jCkBAIC0zODIsNyArMzgyLDcgQEAKIH0KIAogc3RhdGljIGludCBfX2luaXQKLWRwMjY0X21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorZHAyNjRfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RhdGljIGNoYXIgaXJxX3RhYls2XVs1XSBfX2luaXRkYXRhID0gewogCQkvKklOVCAgICBJTlRBICAgSU5UQiAgIElOVEMgICBJTlREICovCkBAIC00MDQsNyArNDA0LDcgQEAKIH0KIAogc3RhdGljIGludCBfX2luaXQKLW1vbmV0X21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorbW9uZXRfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RhdGljIGNoYXIgaXJxX3RhYlsxM11bNV0gX19pbml0ZGF0YSA9IHsKIAkJLypJTlQgICAgSU5UQSAgIElOVEIgICBJTlRDICAgSU5URCAqLwpAQCAtNDY2LDcgKzQ2Niw3IEBACiB9CiAKIHN0YXRpYyBpbnQgX19pbml0Ci13ZWJicmlja19tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3dlYmJyaWNrX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0YXRpYyBjaGFyIGlycV90YWJbMTNdWzVdIF9faW5pdGRhdGEgPSB7CiAJCS8qSU5UICAgIElOVEEgICBJTlRCICAgSU5UQyAgIElOVEQgKi8KQEAgLTQ4OCw3ICs0ODgsNyBAQAogfQogCiBzdGF0aWMgaW50IF9faW5pdAotY2xpcHBlcl9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK2NsaXBwZXJfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RhdGljIGNoYXIgaXJxX3RhYls3XVs1XSBfX2luaXRkYXRhID0gewogCQkvKklOVCAgICBJTlRBICAgSU5UQiAgIElOVEMgICBJTlREICovCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfZWI2NHAuYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19lYjY0cC5jCmluZGV4IGE3YTIzYjQuLjNjNmMxM2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19lYjY0cC5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19lYjY0cC5jCkBAIC0xNjksNyArMTY5LDcgQEAKICAqLwogCiBzdGF0aWMgaW50IF9faW5pdAotZWI2NHBfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitlYjY0cF9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdGF0aWMgY2hhciBpcnFfdGFiWzVdWzVdIF9faW5pdGRhdGEgPSB7CiAJCS8qSU5UICBJTlRBICBJTlRCICBJTlRDICAgSU5URCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2VpZ2VyLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfZWlnZXIuYwppbmRleCBhNjBjZDViLi4zNWY0ODBkIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfZWlnZXIuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfZWlnZXIuYwpAQCAtMTQ0LDcgKzE0NCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgX19pbml0Ci1laWdlcl9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK2VpZ2VyX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXU4IGlycV9vcmlnOwogCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWFydmVsLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWFydmVsLmMKaW5kZXggMzg4Yjk5ZC4uOTVjZmM4MyAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX21hcnZlbC5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19tYXJ2ZWwuYwpAQCAtMzE4LDcgKzMxOCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgCi1tYXJ2ZWxfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCittYXJ2ZWxfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlID0gZGV2LT5zeXNkYXRhOwogCXN0cnVjdCBpbzdfcG9ydCAqaW83X3BvcnQgPSBob3NlLT5zeXNkYXRhOwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX21pYXRhLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWlhdGEuYwppbmRleCA2MWNjZDk1Li4yNThkYTY4IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWlhdGEuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWlhdGEuYwpAQCAtMTUxLDcgKzE1MSw3IEBACiAgKi8KIAogc3RhdGljIGludCBfX2luaXQKLW1pYXRhX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorbWlhdGFfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAgICAgICAgIHN0YXRpYyBjaGFyIGlycV90YWJbMThdWzVdIF9faW5pdGRhdGEgPSB7CiAJCS8qSU5UICAgIElOVEEgICBJTlRCICAgSU5UQyAgIElOVEQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19taWthc2EuYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19taWthc2EuYwppbmRleCAwZTZlNDY5Li5jMGZkNzI4IDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbWlrYXNhLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX21pa2FzYS5jCkBAIC0xNDYsNyArMTQ2LDcgQEAKICAqLwogCiBzdGF0aWMgaW50IF9faW5pdAotbWlrYXNhX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorbWlrYXNhX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0YXRpYyBjaGFyIGlycV90YWJbOF1bNV0gX19pbml0ZGF0YSA9IHsKIAkJLypJTlQgICAgSU5UQSAgIElOVEIgICBJTlRDICAgSU5URCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX25hdXRpbHVzLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbmF1dGlsdXMuYwppbmRleCA5OWMwZjQ2Li40MTEyMjAwIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbmF1dGlsdXMuYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfbmF1dGlsdXMuYwpAQCAtNjUsNyArNjUsNyBAQAogfQogCiBzdGF0aWMgaW50IF9faW5pdAotbmF1dGlsdXNfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCituYXV0aWx1c19tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAkvKiBQcmVzZXJ2ZSB0aGUgSVJRIHNldCB1cCBieSB0aGUgY29uc29sZS4gICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19ub3JpdGFrZS5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX25vcml0YWtlLmMKaW5kZXggYTAwYWM3MC4uMjE3MjUyOCAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX25vcml0YWtlLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX25vcml0YWtlLmMKQEAgLTE5NCw3ICsxOTQsNyBAQAogICovCiAKIHN0YXRpYyBpbnQgX19pbml0Ci1ub3JpdGFrZV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK25vcml0YWtlX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0YXRpYyBjaGFyIGlycV90YWJbMTVdWzVdIF9faW5pdGRhdGEgPSB7CiAJCS8qSU5UICAgIElOVEEgICBJTlRCICAgSU5UQyAgIElOVEQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19yYXdoaWRlLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfcmF3aGlkZS5jCmluZGV4IDdmNTIxNjEuLmExMjVkNmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19yYXdoaWRlLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3Jhd2hpZGUuYwpAQCAtMjIzLDcgKzIyMyw3IEBACiAgKi8KIAogc3RhdGljIGludCBfX2luaXQKLXJhd2hpZGVfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCityYXdoaWRlX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0YXRpYyBjaGFyIGlycV90YWJbNV1bNV0gX19pbml0ZGF0YSA9IHsKIAkJLypJTlQgICAgSU5UQSAgIElOVEIgICBJTlRDICAgSU5URCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3J1ZmZpYW4uYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19ydWZmaWFuLmMKaW5kZXggZjMzNjQ4ZS4uMjU4MWNiZSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3J1ZmZpYW4uYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfcnVmZmlhbi5jCkBAIC0xMTksNyArMTE5LDcgQEAKICAqLwogCiBzdGF0aWMgaW50IF9faW5pdAotcnVmZmlhbl9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3J1ZmZpYW5fbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAgICAgICAgIHN0YXRpYyBjaGFyIGlycV90YWJbMTFdWzVdIF9faW5pdGRhdGEgPSB7CiAJICAgICAgLypJTlQgIElOVEEgSU5UQiBJTlRDIElOVEQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19yeDE2NC5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3J4MTY0LmMKaW5kZXggMjE2ZDk0ZC4uYjE3MmIyNyAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3J4MTY0LmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3J4MTY0LmMKQEAgLTE0NCw3ICsxNDQsNyBAQAogICovCiAKIHN0YXRpYyBpbnQgX19pbml0Ci1yeDE2NF9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3J4MTY0X21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogI2lmIDAKIAlzdGF0aWMgY2hhciBpcnFfdGFiX3Bhc3MxWzZdWzVdIF9faW5pdGRhdGEgPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfc2FibGUuYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19zYWJsZS5jCmluZGV4IGRhNzE0ZTQuLjk4ZDFkYmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19zYWJsZS5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19zYWJsZS5jCkBAIC0xOTQsNyArMTk0LDcgQEAKICAqLwogCiBzdGF0aWMgaW50IF9faW5pdAotc2FibGVfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzYWJsZV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdGF0aWMgY2hhciBpcnFfdGFiWzldWzVdIF9faW5pdGRhdGEgPSB7CiAJCS8qSU5UICAgIElOVEEgICBJTlRCICAgSU5UQyAgIElOVEQgKi8KQEAgLTM3Niw3ICszNzYsNyBAQAogICovCiAKIHN0YXRpYyBpbnQgX19pbml0Ci1seW54X21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorbHlueF9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdGF0aWMgY2hhciBpcnFfdGFiWzE5XVs1XSBfX2luaXRkYXRhID0gewogCQkvKklOVCAgICBJTlRBICAgSU5UQiAgIElOVEMgICBJTlREICovCmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfc2lvLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfc2lvLmMKaW5kZXggODViNGFlYS4uNDdiZWMxZSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3Npby5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c19zaW8uYwpAQCAtMTQ2LDcgKzE0Niw3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IF9faW5pdAotbm9uYW1lX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorbm9uYW1lX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCS8qCiAJICogVGhlIE5vbmFtZSBib2FyZCBoYXMgNSBQQ0kgc2xvdHMgd2l0aCBlYWNoIG9mIHRoZSA0CkBAIC0xODUsNyArMTg1LDcgQEAKIH0KIAogc3RhdGljIGlubGluZSBpbnQgX19pbml0Ci1wMmtfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitwMmtfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RhdGljIGNoYXIgaXJxX3RhYltdWzVdIF9faW5pdGRhdGEgPSB7CiAJCS8qSU5UIEEgICBCICAgQyAgIEQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19zeDE2NC5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3N4MTY0LmMKaW5kZXggNDFkNGFkNC4uNzNlMWMzMSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3N4MTY0LmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3N4MTY0LmMKQEAgLTk1LDcgKzk1LDcgQEAKICAqLwogCiBzdGF0aWMgaW50IF9faW5pdAotc3gxNjRfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzeDE2NF9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdGF0aWMgY2hhciBpcnFfdGFiWzVdWzVdIF9faW5pdGRhdGEgPSB7CiAJCS8qSU5UICAgIElOVEEgICBJTlRCICAgSU5UQyAgIElOVEQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c190YWthcmEuYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c190YWthcmEuYwppbmRleCBhMzFmOGNkLi4yYWU5OWFkIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfdGFrYXJhLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3Rha2FyYS5jCkBAIC0xNTcsNyArMTU3LDcgQEAKICAqLwogCiBzdGF0aWMgaW50IF9faW5pdAotdGFrYXJhX21hcF9pcnFfc3JtKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3Rha2FyYV9tYXBfaXJxX3NybShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RhdGljIGNoYXIgaXJxX3RhYlsxNV1bNV0gX19pbml0ZGF0YSA9IHsKIAkJeyAxNiszLCAxNiszLCAxNiszLCAxNiszLCAxNiszfSwgICAvKiBzbG90ICA2ID09IGRldmljZSAzICovCkBAIC0xODgsNyArMTg4LDcgQEAKIH0KIAogc3RhdGljIGludCBfX2luaXQKLXRha2FyYV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3Rha2FyYV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdGF0aWMgY2hhciBpcnFfdGFiWzE1XVs1XSBfX2luaXRkYXRhID0gewogCQl7IDE2KzMsIDE2KzMsIDE2KzMsIDE2KzMsIDE2KzN9LCAgIC8qIHNsb3QgIDYgPT0gZGV2aWNlIDMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c190aXRhbi5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3RpdGFuLmMKaW5kZXggNjk5NDQwNy4uZjQ3YjMwYSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3RpdGFuLmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3RpdGFuLmMKQEAgLTMwNSw3ICszMDUsNyBAQAogfQogCiBzdGF0aWMgaW50IF9fZGV2aW5pdAotdGl0YW5fbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCit0aXRhbl9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAl1OCBpbnRsaW5lOwogCWludCBpcnE7CmRpZmYgLS1naXQgYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfd2lsZGZpcmUuYyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c193aWxkZmlyZS5jCmluZGV4IGQ5MmNkYzcuLjE3Yzg1YTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEva2VybmVsL3N5c193aWxkZmlyZS5jCisrKyBiL2FyY2gvYWxwaGEva2VybmVsL3N5c193aWxkZmlyZS5jCkBAIC0yOTAsNyArMjkwLDcgQEAKICAqLwogCiBzdGF0aWMgaW50IF9faW5pdAotd2lsZGZpcmVfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCit3aWxkZmlyZV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdGF0aWMgY2hhciBpcnFfdGFiWzhdWzVdIF9faW5pdGRhdGEgPSB7CiAJCS8qSU5UICAgIElOVEEgICBJTlRCICAgSU5UQyAgIElOVEQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL0tjb25maWcgYi9hcmNoL2FybS9LY29uZmlnCmluZGV4IDA5ZWJmMGIuLjJjNzFhOGYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL0tjb25maWcKKysrIGIvYXJjaC9hcm0vS2NvbmZpZwpAQCAtMTcxNiw2ICsxNzE2LDcgQEAKIAlib29sICJGbGF0dGVuZWQgRGV2aWNlIFRyZWUgc3VwcG9ydCIKIAlzZWxlY3QgT0YKIAlzZWxlY3QgT0ZfRUFSTFlfRkxBVFRSRUUKKwlzZWxlY3QgSVJRX0RPTUFJTgogCWhlbHAKIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgZmxhdHRlbmVkIGRldmljZSB0cmVlIG1hY2hpbmUgZGVzY3JpcHRpb25zLgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9NYWtlZmlsZSBiL2FyY2gvYXJtL01ha2VmaWxlCmluZGV4IDNhNGEwNGIuLjcwYzQyNGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL01ha2VmaWxlCkBAIC0yODIsNiArMjgyLDEyIEBACiB6aW5zdGFsbCB1aW5zdGFsbCBpbnN0YWxsOiB2bWxpbnV4CiAJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSBNQUNISU5FPSQoTUFDSElORSkgJEAKIAorJS5kdGI6CisJJChRKSQoTUFLRSkgJChidWlsZCk9JChib290KSBNQUNISU5FPSQoTUFDSElORSkgJChib290KS8kQAorCitkdGJzOgorCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYm9vdCkgTUFDSElORT0kKE1BQ0hJTkUpICQoYm9vdCkvJEAKKwogIyBXZSB1c2UgTVJQUk9QRVJfRklMRVMgYW5kIENMRUFOX0ZJTEVTIG5vdwogYXJjaGNsZWFuOgogCSQoUSkkKE1BS0UpICQoY2xlYW4pPSQoYm9vdCkKQEAgLTI5OCw2ICszMDQsNyBAQAogICBlY2hvICAnICB1SW1hZ2UgICAgICAgIC0gVS1Cb290IHdyYXBwZWQgekltYWdlJwogICBlY2hvICAnICBib290cEltYWdlICAgIC0gQ29tYmluZWQgekltYWdlIGFuZCBpbml0aWFsIFJBTSBkaXNrJyAKICAgZWNobyAgJyAgICAgICAgICAgICAgICAgIChzdXBwbHkgaW5pdHJkIGltYWdlIHZpYSBtYWtlIHZhcmlhYmxlIElOSVRSRD08cGF0aD4pJworICBlY2hvICAnICBkdGJzICAgICAgICAgIC0gQnVpbGQgZGV2aWNlIHRyZWUgYmxvYnMgZm9yIGVuYWJsZWQgYm9hcmRzJwogICBlY2hvICAnICBpbnN0YWxsICAgICAgIC0gSW5zdGFsbCB1bmNvbXByZXNzZWQga2VybmVsJwogICBlY2hvICAnICB6aW5zdGFsbCAgICAgIC0gSW5zdGFsbCBjb21wcmVzc2VkIGtlcm5lbCcKICAgZWNobyAgJyAgdWluc3RhbGwgICAgICAtIEluc3RhbGwgVS1Cb290IHdyYXBwZWQgY29tcHJlc3NlZCBrZXJuZWwnCmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L01ha2VmaWxlIGIvYXJjaC9hcm0vYm9vdC9NYWtlZmlsZQppbmRleCA5MTI4ZmRkLi5hMWVkZmQ1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9ib290L01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL2Jvb3QvTWFrZWZpbGUKQEAgLTU5LDYgKzU5LDEyIEBACiAKIGVuZGlmCiAKKyMgUnVsZSB0byBidWlsZCBkZXZpY2UgdHJlZSBibG9icworJChvYmopLyUuZHRiOiAkKHNyYykvZHRzLyUuZHRzCisJJChjYWxsIGNtZCxkdGMpCisKKyQob2JqKS9kdGJzOiAkKGFkZHByZWZpeCAkKG9iaikvLCAkKGR0Yi15KSkKKwogcXVpZXRfY21kX3VpbWFnZSA9IFVJTUFHRSAgJEAKICAgICAgIGNtZF91aW1hZ2UgPSAkKENPTkZJR19TSEVMTCkgJChNS0lNQUdFKSAtQSBhcm0gLU8gbGludXggLVQga2VybmVsIFwKIAkJICAgLUMgbm9uZSAtYSAkKExPQURBRERSKSAtZSAkKFNUQVJUQUREUikgXApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvc2tlbGV0b24uZHRzaSBiL2FyY2gvYXJtL2Jvb3QvZHRzL3NrZWxldG9uLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQxZDI0MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3NrZWxldG9uLmR0c2kKQEAgLTAsMCArMSwxMyBAQAorLyoKKyAqIFNrZWxldG9uIGRldmljZSB0cmVlOyB0aGUgYmFyZSBtaW5pbXVtIG5lZWRlZCB0byBib290OyBqdXN0IGluY2x1ZGUgYW5kCisgKiBhZGQgYSBjb21wYXRpYmxlIHZhbHVlLiAgVGhlIGJvb3Rsb2FkZXIgd2lsbCB0eXBpY2FsbHkgcG9wdWxhdGUgdGhlIG1lbW9yeQorICogbm9kZS4KKyAqLworCisvIHsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwljaG9zZW4geyB9OworCWFsaWFzZXMgeyB9OworCW1lbW9yeSB7IGRldmljZV90eXBlID0gIm1lbW9yeSI7IHJlZyA9IDwwIDA+OyB9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhLWhhcm1vbnkuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmEtaGFybW9ueS5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMwNTMzNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3RlZ3JhLWhhcm1vbnkuZHRzCkBAIC0wLDAgKzEsNzAgQEAKKy9kdHMtdjEvOworCisvbWVtcmVzZXJ2ZS8gMHgxYzAwMDAwMCAweDA0MDAwMDAwOworL2luY2x1ZGUvICJ0ZWdyYTIwLmR0c2kiCisKKy8geworCW1vZGVsID0gIk5WSURJQSBUZWdyYTIgSGFybW9ueSBldmFsdWF0aW9uIGJvYXJkIjsKKwljb21wYXRpYmxlID0gIm52aWRpYSxoYXJtb255IiwgIm52aWRpYSx0ZWdyYTIwIjsKKworCWNob3NlbiB7CisJCWJvb3RhcmdzID0gInZtYWxsb2M9MTkyTSB2aWRlbz10ZWdyYWZiIGNvbnNvbGU9dHR5UzAsMTE1MjAwbjggcm9vdD0vZGV2L21tY2JsazBwMiBydyByb290d2FpdCI7CisJfTsKKworCW1lbW9yeUAwIHsKKwkJcmVnID0gPCAweDAwMDAwMDAwIDB4NDAwMDAwMDAgPjsKKwl9OworCisJaTJjQDcwMDBjMDAwIHsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDQwMDAwMD47CisKKwkJY29kZWM6IHdtODkwM0AxYSB7CisJCQljb21wYXRpYmxlID0gIndsZix3bTg5MDMiOworCQkJcmVnID0gPDB4MWE+OworCQkJaW50ZXJydXB0cyA9IDwgMzQ3ID47CisKKwkJCWdwaW8tY29udHJvbGxlcjsKKwkJCSNncGlvLWNlbGxzID0gPDI+OworCisJCQkvKiAweDgwMDAgPSBOb3QgY29uZmlndXJlZCAqLworCQkJZ3Bpby1jZmcgPSA8IDB4ODAwMCAweDgwMDAgMCAweDgwMDAgMHg4MDAwID47CisJCX07CisJfTsKKworCWkyY0A3MDAwYzQwMCB7CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDw0MDAwMDA+OworCX07CisKKwlpMmNANzAwMGM1MDAgeworCQljbG9jay1mcmVxdWVuY3kgPSA8NDAwMDAwPjsKKwl9OworCisJaTJjQDcwMDBkMDAwIHsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDQwMDAwMD47CisJfTsKKworCXNvdW5kIHsKKwkJY29tcGF0aWJsZSA9ICJudmlkaWEsaGFybW9ueS1zb3VuZCIsICJudmlkaWEsdGVncmEtd204OTAzIjsKKworCQlzcGtyLWVuLWdwaW9zID0gPCZjb2RlYyAyIDA+OworCQlocC1kZXQtZ3Bpb3MgPSA8JmdwaW8gMTc4IDA+OworCQlpbnQtbWljLWVuLWdwaW9zID0gPCZncGlvIDE4NCAwPjsKKwkJZXh0LW1pYy1lbi1ncGlvcyA9IDwmZ3BpbyAxODUgMD47CisJfTsKKworCXNlcmlhbEA3MDAwNjMwMCB7CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDwgMjE2MDAwMDAwID47CisJfTsKKworCXNkaGNpQGM4MDAwMjAwIHsKKwkJZ3Bpb3MgPSA8JmdwaW8gNjkgMD4sIC8qIGNkLCBncGlvIFBJNSAqLworCQkJPCZncGlvIDU3IDA+LCAvKiB3cCwgZ3BpbyBQSDEgKi8KKwkJCTwmZ3BpbyAxNTUgMD47IC8qIHBvd2VyLCBncGlvIFBUMyAqLworCX07CisKKwlzZGhjaUBjODAwMDYwMCB7CisJCWdwaW9zID0gPCZncGlvIDU4IDA+LCAvKiBjZCwgZ3BpbyBQSDIgKi8KKwkJCTwmZ3BpbyA1OSAwPiwgLyogd3AsIGdwaW8gUEgzICovCisJCQk8JmdwaW8gNzAgMD47IC8qIHBvd2VyLCBncGlvIFBJNiAqLworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmEtc2VhYm9hcmQuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmEtc2VhYm9hcmQuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NDBjYWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2R0cy90ZWdyYS1zZWFib2FyZC5kdHMKQEAgLTAsMCArMSwyOCBAQAorL2R0cy12MS87CisKKy9tZW1yZXNlcnZlLyAweDFjMDAwMDAwIDB4MDQwMDAwMDA7CisvaW5jbHVkZS8gInRlZ3JhMjAuZHRzaSIKKworLyB7CisJbW9kZWwgPSAiTlZJRElBIFNlYWJvYXJkIjsKKwljb21wYXRpYmxlID0gIm52aWRpYSxzZWFib2FyZCIsICJudmlkaWEsdGVncmEyMCI7CisKKwljaG9zZW4geworCQlib290YXJncyA9ICJ2bWFsbG9jPTE5Mk0gdmlkZW89dGVncmFmYiBjb25zb2xlPXR0eVMwLDExNTIwMG44IHJvb3Q9L2Rldi9tbWNibGsxcDMgcncgcm9vdHdhaXQiOworCX07CisKKwltZW1vcnkgeworCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOworCQlyZWcgPSA8IDB4MDAwMDAwMDAgMHg0MDAwMDAwMCA+OworCX07CisKKwlzZXJpYWxANzAwMDYzMDAgeworCQljbG9jay1mcmVxdWVuY3kgPSA8IDIxNjAwMDAwMCA+OworCX07CisKKwlzZGhjaUBjODAwMDQwMCB7CisJCWdwaW9zID0gPCZncGlvIDY5IDA+LCAvKiBjZCwgZ3BpbyBQSTUgKi8KKwkJCTwmZ3BpbyA1NyAwPiwgLyogd3AsIGdwaW8gUEgxICovCisJCQk8JmdwaW8gNzAgMD47IC8qIHBvd2VyLCBncGlvIFBJNiAqLworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmEyMC5kdHNpIGIvYXJjaC9hcm0vYm9vdC9kdHMvdGVncmEyMC5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3Mjc1OTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9ib290L2R0cy90ZWdyYTIwLmR0c2kKQEAgLTAsMCArMSwxMzkgQEAKKy9pbmNsdWRlLyAic2tlbGV0b24uZHRzaSIKKworLyB7CisJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMCI7CisJaW50ZXJydXB0LXBhcmVudCA9IDwmaW50Yz47CisKKwlpbnRjOiBpbnRlcnJ1cHQtY29udHJvbGxlckA1MDA0MTAwMCB7CisJCWNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMjAtZ2ljIjsKKwkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCXJlZyA9IDwgMHg1MDA0MTAwMCAweDEwMDAgPiwKKwkJICAgICAgPCAweDUwMDQwMTAwIDB4MDEwMCA+OworCX07CisKKwlpMmNANzAwMGMwMDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisJCWNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMjAtaTJjIjsKKwkJcmVnID0gPDB4NzAwMEMwMDAgMHgxMDA+OworCQlpbnRlcnJ1cHRzID0gPCA3MCA+OworCX07CisKKwlpMmNANzAwMGM0MDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisJCWNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMjAtaTJjIjsKKwkJcmVnID0gPDB4NzAwMEM0MDAgMHgxMDA+OworCQlpbnRlcnJ1cHRzID0gPCAxMTYgPjsKKwl9OworCisJaTJjQDcwMDBjNTAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCQljb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIwLWkyYyI7CisJCXJlZyA9IDwweDcwMDBDNTAwIDB4MTAwPjsKKwkJaW50ZXJydXB0cyA9IDwgMTI0ID47CisJfTsKKworCWkyY0A3MDAwZDAwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1pMmMiOworCQlyZWcgPSA8MHg3MDAwRDAwMCAweDIwMD47CisJCWludGVycnVwdHMgPSA8IDg1ID47CisJfTsKKworCWkyc0A3MDAwMjgwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1pMnMiOworCQlyZWcgPSA8MHg3MDAwMjgwMCAweDIwMD47CisJCWludGVycnVwdHMgPSA8IDQ1ID47CisJCWRtYS1jaGFubmVsID0gPCAyID47CisJfTsKKworCWkyc0A3MDAwMmEwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1pMnMiOworCQlyZWcgPSA8MHg3MDAwMmEwMCAweDIwMD47CisJCWludGVycnVwdHMgPSA8IDM1ID47CisJCWRtYS1jaGFubmVsID0gPCAxID47CisJfTsKKworCWRhc0A3MDAwMGMwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1kYXMiOworCQlyZWcgPSA8MHg3MDAwMGMwMCAweDgwPjsKKwl9OworCisJZ3BpbzogZ3Bpb0A2MDAwZDAwMCB7CisJCWNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMjAtZ3BpbyI7CisJCXJlZyA9IDwgMHg2MDAwZDAwMCAweDEwMDAgPjsKKwkJaW50ZXJydXB0cyA9IDwgNjQgNjUgNjYgNjcgODcgMTE5IDEyMSA+OworCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJZ3Bpby1jb250cm9sbGVyOworCX07CisKKwlzZXJpYWxANzAwMDYwMDAgeworCQljb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIwLXVhcnQiOworCQlyZWcgPSA8MHg3MDAwNjAwMCAweDQwPjsKKwkJcmVnLXNoaWZ0ID0gPDI+OworCQlpbnRlcnJ1cHRzID0gPCA2OCA+OworCX07CisKKwlzZXJpYWxANzAwMDYwNDAgeworCQljb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIwLXVhcnQiOworCQlyZWcgPSA8MHg3MDAwNjA0MCAweDQwPjsKKwkJcmVnLXNoaWZ0ID0gPDI+OworCQlpbnRlcnJ1cHRzID0gPCA2OSA+OworCX07CisKKwlzZXJpYWxANzAwMDYyMDAgeworCQljb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIwLXVhcnQiOworCQlyZWcgPSA8MHg3MDAwNjIwMCAweDEwMD47CisJCXJlZy1zaGlmdCA9IDwyPjsKKwkJaW50ZXJydXB0cyA9IDwgNzggPjsKKwl9OworCisJc2VyaWFsQDcwMDA2MzAwIHsKKwkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC11YXJ0IjsKKwkJcmVnID0gPDB4NzAwMDYzMDAgMHgxMDA+OworCQlyZWctc2hpZnQgPSA8Mj47CisJCWludGVycnVwdHMgPSA8IDEyMiA+OworCX07CisKKwlzZXJpYWxANzAwMDY0MDAgeworCQljb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIwLXVhcnQiOworCQlyZWcgPSA8MHg3MDAwNjQwMCAweDEwMD47CisJCXJlZy1zaGlmdCA9IDwyPjsKKwkJaW50ZXJydXB0cyA9IDwgMTIzID47CisJfTsKKworCXNkaGNpQGM4MDAwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1zZGhjaSI7CisJCXJlZyA9IDwweGM4MDAwMDAwIDB4MjAwPjsKKwkJaW50ZXJydXB0cyA9IDwgNDYgPjsKKwl9OworCisJc2RoY2lAYzgwMDAyMDAgeworCQljb21wYXRpYmxlID0gIm52aWRpYSx0ZWdyYTIwLXNkaGNpIjsKKwkJcmVnID0gPDB4YzgwMDAyMDAgMHgyMDA+OworCQlpbnRlcnJ1cHRzID0gPCA0NyA+OworCX07CisKKwlzZGhjaUBjODAwMDQwMCB7CisJCWNvbXBhdGlibGUgPSAibnZpZGlhLHRlZ3JhMjAtc2RoY2kiOworCQlyZWcgPSA8MHhjODAwMDQwMCAweDIwMD47CisJCWludGVycnVwdHMgPSA8IDUxID47CisJfTsKKworCXNkaGNpQGM4MDAwNjAwIHsKKwkJY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1zZGhjaSI7CisJCXJlZyA9IDwweGM4MDAwNjAwIDB4MjAwPjsKKwkJaW50ZXJydXB0cyA9IDwgNjMgPjsKKwl9OworfTsKKwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vYm9vdC9kdHMvdmVyc2F0aWxlLWFiLmR0cyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3ZlcnNhdGlsZS1hYi5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIzMjkyNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL2Jvb3QvZHRzL3ZlcnNhdGlsZS1hYi5kdHMKQEAgLTAsMCArMSwxOTIgQEAKKy9kdHMtdjEvOworL2luY2x1ZGUvICJza2VsZXRvbi5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJBUk0gVmVyc2F0aWxlIEFCIjsKKwljb21wYXRpYmxlID0gImFybSx2ZXJzYXRpbGUtYWIiOworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCWludGVycnVwdC1wYXJlbnQgPSA8JnZpYz47CisKKwlhbGlhc2VzIHsKKwkJc2VyaWFsMCA9ICZ1YXJ0MDsKKwkJc2VyaWFsMSA9ICZ1YXJ0MTsKKwkJc2VyaWFsMiA9ICZ1YXJ0MjsKKwkJaTJjMCA9ICZpMmMwOworCX07CisKKwltZW1vcnkgeworCQlyZWcgPSA8MHgwIDB4MDgwMDAwMDA+OworCX07CisKKwlmbGFzaEAzNDAwMDAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLHZlcnNhdGlsZS1mbGFzaCI7CisJCXJlZyA9IDwweDM0MDAwMDAwIDB4NDAwMDAwMD47CisJCWJhbmstd2lkdGggPSA8ND47CisJfTsKKworCWkyYzA6IGkyY0AxMDAwMjAwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJY29tcGF0aWJsZSA9ICJhcm0sdmVyc2F0aWxlLWkyYyI7CisJCXJlZyA9IDwweDEwMDAyMDAwIDB4MTAwMD47CisKKwkJcnRjQDY4IHsKKwkJCWNvbXBhdGlibGUgPSAiZGFsbGFzLGRzMTMzOCI7CisJCQlyZWcgPSA8MHg2OD47CisJCX07CisJfTsKKworCW5ldEAxMDAxMDAwMCB7CisJCWNvbXBhdGlibGUgPSAic21zYyxsYW45MWMxMTEiOworCQlyZWcgPSA8MHgxMDAxMDAwMCAweDEwMDAwPjsKKwkJaW50ZXJydXB0cyA9IDwyNT47CisJfTsKKworCWxjZEAxMDAwODAwMCB7CisJCWNvbXBhdGlibGUgPSAiYXJtLHZlcnNhdGlsZS1sY2QiOworCQlyZWcgPSA8MHgxMDAwODAwMCAweDEwMDA+OworCX07CisKKwlhbWJhIHsKKwkJY29tcGF0aWJsZSA9ICJhcm0sYW1iYS1idXMiOworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCXJhbmdlczsKKworCQl2aWM6IGludGNAMTAxNDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcm0sdmVyc2F0aWxlLXZpYyI7CisJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQlyZWcgPSA8MHgxMDE0MDAwMCAweDEwMDA+OworCQl9OworCisJCXNpYzogaW50Y0AxMDAwMzAwMCB7CisJCQljb21wYXRpYmxlID0gImFybSx2ZXJzYXRpbGUtc2ljIjsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCXJlZyA9IDwweDEwMDAzMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZ2aWM+OworCQkJaW50ZXJydXB0cyA9IDwzMT47IC8qIENhc2NhZGVkIHRvIHZpYyAqLworCQl9OworCisJCWRtYUAxMDEzMDAwMCB7CisJCQljb21wYXRpYmxlID0gImFybSxwbDA4MSIsICJhcm0scHJpbWVjZWxsIjsKKwkJCXJlZyA9IDwweDEwMTMwMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDE3PjsKKwkJfTsKKworCQl1YXJ0MDogdWFydEAxMDFmMTAwMCB7CisJCQljb21wYXRpYmxlID0gImFybSxwbDAxMSIsICJhcm0scHJpbWVjZWxsIjsKKwkJCXJlZyA9IDwweDEwMWYxMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDEyPjsKKwkJfTsKKworCQl1YXJ0MTogdWFydEAxMDFmMjAwMCB7CisJCQljb21wYXRpYmxlID0gImFybSxwbDAxMSIsICJhcm0scHJpbWVjZWxsIjsKKwkJCXJlZyA9IDwweDEwMWYyMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDEzPjsKKwkJfTsKKworCQl1YXJ0MjogdWFydEAxMDFmMzAwMCB7CisJCQljb21wYXRpYmxlID0gImFybSxwbDAxMSIsICJhcm0scHJpbWVjZWxsIjsKKwkJCXJlZyA9IDwweDEwMWYzMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDE0PjsKKwkJfTsKKworCQlzbWNAMTAxMDAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJCXJlZyA9IDwweDEwMTAwMDAwIDB4MTAwMD47CisJCX07CisKKwkJbXBtY0AxMDExMDAwMCB7CisJCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOworCQkJcmVnID0gPDB4MTAxMTAwMDAgMHgxMDAwPjsKKwkJfTsKKworCQlkaXNwbGF5QDEwMTIwMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHBsMTEwIiwgImFybSxwcmltZWNlbGwiOworCQkJcmVnID0gPDB4MTAxMjAwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MTY+OworCQl9OworCisJCXNjdGxAMTAxZTAwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJCXJlZyA9IDwweDEwMWUwMDAwIDB4MTAwMD47CisJCX07CisKKwkJd2F0Y2hkb2dAMTAxZTEwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJCXJlZyA9IDwweDEwMWUxMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDA+OworCQl9OworCisJCWdwaW8wOiBncGlvQDEwMWU0MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHBsMDYxIiwgImFybSxwcmltZWNlbGwiOworCQkJcmVnID0gPDB4MTAxZTQwMDAgMHgxMDAwPjsKKwkJCWdwaW8tY29udHJvbGxlcjsKKwkJCWludGVycnVwdHMgPSA8Nj47CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKKwkJfTsKKworCQlncGlvMTogZ3Bpb0AxMDFlNTAwMCB7CisJCQljb21wYXRpYmxlID0gImFybSxwbDA2MSIsICJhcm0scHJpbWVjZWxsIjsKKwkJCXJlZyA9IDwweDEwMWU1MDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDc+OworCQkJZ3Bpby1jb250cm9sbGVyOworCQkJI2dwaW8tY2VsbHMgPSA8Mj47CisJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJCX07CisKKwkJcnRjQDEwMWU4MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHBsMDMwIiwgImFybSxwcmltZWNlbGwiOworCQkJcmVnID0gPDB4MTAxZTgwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MTA+OworCQl9OworCisJCXNjaUAxMDFmMDAwMCB7CisJCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOworCQkJcmVnID0gPDB4MTAxZjAwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8MTU+OworCQl9OworCisJCXNzcEAxMDFmNDAwMCB7CisJCQljb21wYXRpYmxlID0gImFybSxwbDAyMiIsICJhcm0scHJpbWVjZWxsIjsKKwkJCXJlZyA9IDwweDEwMWY0MDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDExPjsKKwkJfTsKKworCQlmcGdhIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHZlcnNhdGlsZS1mcGdhIiwgInNpbXBsZS1idXMiOworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCXJhbmdlcyA9IDwwIDB4MTAwMDAwMDAgMHgxMDAwMD47CisKKwkJCWFhY2lANDAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJCQlyZWcgPSA8MHg0MDAwIDB4MTAwMD47CisJCQkJaW50ZXJydXB0cyA9IDwyND47CisJCQl9OworCQkJbW1jQDUwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiYXJtLHByaW1lY2VsbCI7CisJCQkJcmVnID0gPCAweDUwMDAgMHgxMDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDIyPjsKKwkJCX07CisJCQlrbWlANjAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJhcm0scGwwNTAiLCAiYXJtLHByaW1lY2VsbCI7CisJCQkJcmVnID0gPDB4NjAwMCAweDEwMDA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JnNpYz47CisJCQkJaW50ZXJydXB0cyA9IDwzPjsKKwkJCX07CisJCQlrbWlANzAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJhcm0scGwwNTAiLCAiYXJtLHByaW1lY2VsbCI7CisJCQkJcmVnID0gPDB4NzAwMCAweDEwMDA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JnNpYz47CisJCQkJaW50ZXJydXB0cyA9IDw0PjsKKwkJCX07CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9ib290L2R0cy92ZXJzYXRpbGUtcGIuZHRzIGIvYXJjaC9hcm0vYm9vdC9kdHMvdmVyc2F0aWxlLXBiLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTYxNGUzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9hcm0vYm9vdC9kdHMvdmVyc2F0aWxlLXBiLmR0cwpAQCAtMCwwICsxLDQ4IEBACisvaW5jbHVkZS8gInZlcnNhdGlsZS1hYi5kdHMiCisKKy8geworCW1vZGVsID0gIkFSTSBWZXJzYXRpbGUgUEIiOworCWNvbXBhdGlibGUgPSAiYXJtLHZlcnNhdGlsZS1wYiI7CisKKwlhbWJhIHsKKwkJZ3BpbzI6IGdwaW9AMTAxZTYwMDAgeworCQkJY29tcGF0aWJsZSA9ICJhcm0scGwwNjEiLCAiYXJtLHByaW1lY2VsbCI7CisJCQlyZWcgPSA8MHgxMDFlNjAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDw4PjsKKwkJCWdwaW8tY29udHJvbGxlcjsKKwkJCSNncGlvLWNlbGxzID0gPDI+OworCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQl9OworCisJCWdwaW8zOiBncGlvQDEwMWU3MDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYXJtLHBsMDYxIiwgImFybSxwcmltZWNlbGwiOworCQkJcmVnID0gPDB4MTAxZTcwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8OT47CisJCQlncGlvLWNvbnRyb2xsZXI7CisJCQkjZ3Bpby1jZWxscyA9IDwyPjsKKwkJCWludGVycnVwdC1jb250cm9sbGVyOworCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKKwkJfTsKKworCQlmcGdhIHsKKwkJCXVhcnRAOTAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJhcm0scGwwMTEiLCAiYXJtLHByaW1lY2VsbCI7CisJCQkJcmVnID0gPDB4OTAwMCAweDEwMDA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JnNpYz47CisJCQkJaW50ZXJydXB0cyA9IDw2PjsKKwkJCX07CisJCQlzY2lAYTAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJhcm0scHJpbWVjZWxsIjsKKwkJCQlyZWcgPSA8MHhhMDAwIDB4MTAwMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmc2ljPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDU+OworCQkJfTsKKwkJCW1tY0BiMDAwIHsKKwkJCQljb21wYXRpYmxlID0gImFybSxwcmltZWNlbGwiOworCQkJCXJlZyA9IDwweGIwMDAgMHgxMDAwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDIzPjsKKwkJCX07CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vaXQ4MTUyLmMgYi9hcmNoL2FybS9jb21tb24vaXQ4MTUyLmMKaW5kZXggMTRhZDYyZS4uYTc5MzRiYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL2l0ODE1Mi5jCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9pdDgxNTIuYwpAQCAtMTQ0LDcgKzE0NCw3IEBACiB9CiAKIC8qIG1hcHBpbmcgZm9yIG9uLWNoaXAgZGV2aWNlcyAqLwotaW50IF9faW5pdCBpdDgxNTJfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQoraW50IF9faW5pdCBpdDgxNTJfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWlmICgoZGV2LT52ZW5kb3IgPT0gUENJX1ZFTkRPUl9JRF9JVEUpICYmCiAJICAgIChkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lURV84MTUyKSkgewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vaGFyZHdhcmUvaXQ4MTUyLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9pdDgxNTIuaAppbmRleCBiMmY5NWM3Li5iM2ZlYTM4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9pdDgxNTIuaAorKysgYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9oYXJkd2FyZS9pdDgxNTIuaApAQCAtMTA1LDcgKzEwNSw3IEBACiAKIGV4dGVybiB2b2lkIGl0ODE1Ml9pcnFfZGVtdXgodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKTsKIGV4dGVybiB2b2lkIGl0ODE1Ml9pbml0X2lycSh2b2lkKTsKLWV4dGVybiBpbnQgaXQ4MTUyX3BjaV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbik7CitleHRlcm4gaW50IGl0ODE1Ml9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pOwogZXh0ZXJuIGludCBpdDgxNTJfcGNpX3NldHVwKGludCBuciwgc3RydWN0IHBjaV9zeXNfZGF0YSAqc3lzKTsKIGV4dGVybiBzdHJ1Y3QgcGNpX2J1cyAqaXQ4MTUyX3BjaV9zY2FuX2J1cyhpbnQgbnIsIHN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5cyk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvYXJjaC5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC9hcmNoLmgKaW5kZXggMzI4MWZiNC4uMjE3YWExOTEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvYXJjaC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvYXJjaC5oCkBAIC03NCw0ICs3NCwxMSBAQAogI2RlZmluZSBNQUNISU5FX0VORAkJCQlcCiB9OwogCisjZGVmaW5lIERUX01BQ0hJTkVfU1RBUlQoX25hbWUsIF9uYW1lc3RyKQkJXAorc3RhdGljIGNvbnN0IHN0cnVjdCBtYWNoaW5lX2Rlc2MgX19tYWNoX2Rlc2NfIyNfbmFtZQlcCisgX191c2VkCQkJCQkJCVwKKyBfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLmFyY2guaW5mby5pbml0IikpKSA9IHsJXAorCS5ucgkJPSB+MCwJCQkJXAorCS5uYW1lCQk9IF9uYW1lc3RyLAorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvcGNpLmggYi9hcmNoL2FybS9pbmNsdWRlL2FzbS9tYWNoL3BjaS5oCmluZGV4IDE2MzMwYmQuLjE4NmVmZDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL21hY2gvcGNpLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vbWFjaC9wY2kuaApAQCAtMjUsNyArMjUsNyBAQAogCXZvaWQJCSgqcHJlaW5pdCkodm9pZCk7CiAJdm9pZAkJKCpwb3N0aW5pdCkodm9pZCk7CiAJdTgJCSgqc3dpenpsZSkoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggKnBpbik7Ci0JaW50CQkoKm1hcF9pcnEpKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbik7CisJaW50CQkoKm1hcF9pcnEpKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbik7CiB9OwogCiAvKgpAQCAtNDQsNyArNDQsNyBAQAogCQkJCQkvKiBCcmlkZ2Ugc3dpenpsaW5nCQkJKi8KIAl1OAkJKCpzd2l6emxlKShzdHJ1Y3QgcGNpX2RldiAqLCB1OCAqKTsKIAkJCQkJLyogSVJRIG1hcHBpbmcJCQkJKi8KLQlpbnQJCSgqbWFwX2lycSkoc3RydWN0IHBjaV9kZXYgKiwgdTgsIHU4KTsKKwlpbnQJCSgqbWFwX2lycSkoY29uc3Qgc3RydWN0IHBjaV9kZXYgKiwgdTgsIHU4KTsKIAlzdHJ1Y3QgaHdfcGNpCSpodzsKIAl2b2lkCQkqcHJpdmF0ZV9kYXRhOwkvKiBwbGF0Zm9ybSBjb250cm9sbGVyIHByaXZhdGUgZGF0YQkqLwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3Byb20uaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3Byb20uaAppbmRleCAxMWI4NzA4Li42ZjY1Y2E4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9pbmNsdWRlL2FzbS9wcm9tLmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vcHJvbS5oCkBAIC0xNiwxMSArMTYsNiBAQAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KIAotc3RhdGljIGlubGluZSB2b2lkIGlycV9kaXNwb3NlX21hcHBpbmcodW5zaWduZWQgaW50IHZpcnEpCi17Ci0JcmV0dXJuOwotfQotCiBleHRlcm4gc3RydWN0IG1hY2hpbmVfZGVzYyAqc2V0dXBfbWFjaGluZV9mZHQodW5zaWduZWQgaW50IGR0X3BoeXMpOwogZXh0ZXJuIHZvaWQgYXJtX2R0X21lbWJsb2NrX3Jlc2VydmUodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9iaW9zMzIuYyBiL2FyY2gvYXJtL2tlcm5lbC9iaW9zMzIuYwppbmRleCBlNGVlMDUwLi5kNmRmMzU5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvYmlvczMyLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2Jpb3MzMi5jCkBAIC00NzYsNyArNDc2LDcgQEAKIC8qCiAgKiBNYXAgYSBzbG90L3BpbiB0byBhbiBJUlEuCiAgKi8KLXN0YXRpYyBpbnQgcGNpYmlvc19tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgcGNpYmlvc19tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdHJ1Y3QgcGNpX3N5c19kYXRhICpzeXMgPSBkZXYtPnN5c2RhdGE7CiAJaW50IGlycSA9IC0xOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL2RldnRyZWUuYyBiL2FyY2gvYXJtL2tlcm5lbC9kZXZ0cmVlLmMKaW5kZXggMGNkZDdiNC4uMWEzM2U5ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL2RldnRyZWUuYworKysgYi9hcmNoL2FybS9rZXJuZWwvZGV2dHJlZS5jCkBAIC0xMzIsMTcgKzEzMiwzIEBACiAKIAlyZXR1cm4gbWRlc2NfYmVzdDsKIH0KLQotLyoqCi0gKiBpcnFfY3JlYXRlX29mX21hcHBpbmcgLSBIb29rIHRvIHJlc29sdmUgT0YgaXJxIHNwZWNpZmllciBpbnRvIGEgTGludXggaXJxIwotICoKLSAqIEN1cnJlbnRseSB0aGUgbWFwcGluZyBtZWNoYW5pc20gaXMgdHJpdmlhbDsgc2ltcGxlIGZsYXQgaHdpcnEgbnVtYmVycyBhcmUKLSAqIG1hcHBlZCAxOjEgb250byBMaW51eCBpcnEgbnVtYmVycy4gIENhc2NhZGVkIGlycSBjb250cm9sbGVycyBhcmUgbm90Ci0gKiBzdXBwb3J0ZWQuCi0gKi8KLXVuc2lnbmVkIGludCBpcnFfY3JlYXRlX29mX21hcHBpbmcoc3RydWN0IGRldmljZV9ub2RlICpjb250cm9sbGVyLAotCQkJCSAgIGNvbnN0IHUzMiAqaW50c3BlYywgdW5zaWduZWQgaW50IGludHNpemUpCi17Ci0JcmV0dXJuIGludHNwZWNbMF07Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChpcnFfY3JlYXRlX29mX21hcHBpbmcpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvYXJtL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggNWUxZTU0MS4uMWEzNDdmNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL2FybS9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L2h3X2JyZWFrcG9pbnQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVpZGxlLmg+CiAKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9sZWRzLmg+CkBAIC0xOTYsNyArMTk3LDggQEAKIAkJCQljcHVfcmVsYXgoKTsKIAkJCX0gZWxzZSB7CiAJCQkJc3RvcF9jcml0aWNhbF90aW1pbmdzKCk7Ci0JCQkJcG1faWRsZSgpOworCQkJCWlmIChjcHVpZGxlX2lkbGVfY2FsbCgpKQorCQkJCQlwbV9pZGxlKCk7CiAJCQkJc3RhcnRfY3JpdGljYWxfdGltaW5ncygpOwogCQkJCS8qCiAJCQkJICogVGhpcyB3aWxsIGV2ZW50dWFsbHkgYmUgcmVtb3ZlZCAtIHBtX2lkbGUKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtYXQ5MS9NYWtlZmlsZQppbmRleCA5Njk2NjIzLi5iZjU3ZThiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL01ha2VmaWxlCkBAIC0yLDcgKzIsNyBAQAogIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGtlcm5lbC4KICMKIAotb2JqLXkJCTo9IGlycS5vIGdwaW8ubworb2JqLXkJCTo9IGlycS5vIGdwaW8ubyBzZXR1cC5vCiBvYmotbQkJOj0KIG9iai1uCQk6PQogb2JqLQkJOj0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxY2FwOS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5LmMKaW5kZXggZjEwMTNkMC4uYmZjNjg0NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFjYXA5LmMKQEAgLTI1LDIzICsyNSwxMCBAQAogI2luY2x1ZGUgPG1hY2gvYXQ5MV9yc3RjLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxX3NoZHdjLmg+CiAKKyNpbmNsdWRlICJzb2MuaCIKICNpbmNsdWRlICJnZW5lcmljLmgiCiAjaW5jbHVkZSAiY2xvY2suaCIKIAotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBhdDkxY2FwOV9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKLQl7Ci0JCS52aXJ0dWFsCT0gQVQ5MV9WQV9CQVNFX1NZUywKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEFUOTFfQkFTRV9TWVMpLAotCQkubGVuZ3RoCQk9IFNaXzE2SywKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sIHsKLQkJLnZpcnR1YWwJPSBBVDkxX0lPX1ZJUlRfQkFTRSAtIEFUOTFDQVA5X1NSQU1fU0laRSwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEFUOTFDQVA5X1NSQU1fQkFTRSksCi0JCS5sZW5ndGgJCT0gQVQ5MUNBUDlfU1JBTV9TSVpFLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwKLX07Ci0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiAgQ2xvY2tzCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMzM5LDI0ICszMjYsMTcgQEAKICAqICBBVDkxQ0FQOSBwcm9jZXNzb3IgaW5pdGlhbGl6YXRpb24KICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXZvaWQgX19pbml0IGF0OTFjYXA5X21hcF9pbyh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IGF0OTFjYXA5X21hcF9pbyh2b2lkKQogewotCS8qIE1hcCBwZXJpcGhlcmFscyAqLwotCWlvdGFibGVfaW5pdChhdDkxY2FwOV9pb19kZXNjLCBBUlJBWV9TSVpFKGF0OTFjYXA5X2lvX2Rlc2MpKTsKKwlhdDkxX2luaXRfc3JhbSgwLCBBVDkxQ0FQOV9TUkFNX0JBU0UsIEFUOTFDQVA5X1NSQU1fU0laRSk7CiB9CiAKLXZvaWQgX19pbml0IGF0OTFjYXA5X2luaXRpYWxpemUodW5zaWduZWQgbG9uZyBtYWluX2Nsb2NrKQorc3RhdGljIHZvaWQgX19pbml0IGF0OTFjYXA5X2luaXRpYWxpemUodm9pZCkKIHsKIAlhdDkxX2FyY2hfcmVzZXQgPSBhdDkxY2FwOV9yZXNldDsKIAlwbV9wb3dlcl9vZmYgPSBhdDkxY2FwOV9wb3dlcm9mZjsKIAlhdDkxX2V4dGVybl9pcnEgPSAoMSA8PCBBVDkxQ0FQOV9JRF9JUlEwKSB8ICgxIDw8IEFUOTFDQVA5X0lEX0lSUTEpOwogCi0JLyogSW5pdCBjbG9jayBzdWJzeXN0ZW0gKi8KLQlhdDkxX2Nsb2NrX2luaXQobWFpbl9jbG9jayk7Ci0KLQkvKiBSZWdpc3RlciB0aGUgcHJvY2Vzc29yLXNwZWNpZmljIGNsb2NrcyAqLwotCWF0OTFjYXA5X3JlZ2lzdGVyX2Nsb2NrcygpOwotCiAJLyogUmVnaXN0ZXIgR1BJTyBzdWJzeXN0ZW0gKi8KIAlhdDkxX2dwaW9faW5pdChhdDkxY2FwOV9ncGlvLCA0KTsKIApAQCAtNDA5LDE0ICszODksOSBAQAogCTAsCS8qIEFkdmFuY2VkIEludGVycnVwdCBDb250cm9sbGVyIChJUlExKSAqLwogfTsKIAotdm9pZCBfX2luaXQgYXQ5MWNhcDlfaW5pdF9pbnRlcnJ1cHRzKHVuc2lnbmVkIGludCBwcmlvcml0eVtOUl9BSUNfSVJRU10pCi17Ci0JaWYgKCFwcmlvcml0eSkKLQkJcHJpb3JpdHkgPSBhdDkxY2FwOV9kZWZhdWx0X2lycV9wcmlvcml0eTsKLQotCS8qIEluaXRpYWxpemUgdGhlIEFJQyBpbnRlcnJ1cHQgY29udHJvbGxlciAqLwotCWF0OTFfYWljX2luaXQocHJpb3JpdHkpOwotCi0JLyogRW5hYmxlIEdQSU8gaW50ZXJydXB0cyAqLwotCWF0OTFfZ3Bpb19pcnFfc2V0dXAoKTsKLX0KK3N0cnVjdCBhdDkxX2luaXRfc29jIF9faW5pdGRhdGEgYXQ5MWNhcDlfc29jID0geworCS5tYXBfaW8gPSBhdDkxY2FwOV9tYXBfaW8sCisJLmRlZmF1bHRfaXJxX3ByaW9yaXR5ID0gYXQ5MWNhcDlfZGVmYXVsdF9pcnFfcHJpb3JpdHksCisJLnJlZ2lzdGVyX2Nsb2NrcyA9IGF0OTFjYXA5X3JlZ2lzdGVyX2Nsb2NrcywKKwkuaW5pdCA9IGF0OTFjYXA5X2luaXRpYWxpemUsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFybTkyMDAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxcm05MjAwLmMKaW5kZXggODNhMWEzZi4uZjczMzAyZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFybTkyMDAuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXJtOTIwMC5jCkBAIC0yMCwyNSArMjAsMTYgQEAKICNpbmNsdWRlIDxtYWNoL2F0OTFfc3QuaD4KICNpbmNsdWRlIDxtYWNoL2NwdS5oPgogCisjaW5jbHVkZSAic29jLmgiCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogI2luY2x1ZGUgImNsb2NrLmgiCiAKIHN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgYXQ5MXJtOTIwMF9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKIAl7Ci0JCS52aXJ0dWFsCT0gQVQ5MV9WQV9CQVNFX1NZUywKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEFUOTFfQkFTRV9TWVMpLAotCQkubGVuZ3RoCQk9IFNaXzRLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewogCQkudmlydHVhbAk9IEFUOTFfVkFfQkFTRV9FTUFDLAogCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MVJNOTIwMF9CQVNFX0VNQUMpLAogCQkubGVuZ3RoCQk9IFNaXzE2SywKIAkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sIHsKLQkJLnZpcnR1YWwJPSBBVDkxX0lPX1ZJUlRfQkFTRSAtIEFUOTFSTTkyMDBfU1JBTV9TSVpFLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MVJNOTIwMF9TUkFNX0JBU0UpLAotCQkubGVuZ3RoCQk9IEFUOTFSTTkyMDBfU1JBTV9TSVpFLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCiAJfSwKIH07CiAKQEAgLTMwNCwyNCArMjk1LDE3IEBACiAJYXQ5MV9zeXNfd3JpdGUoQVQ5MV9TVF9DUiwgQVQ5MV9TVF9XRFJTVCk7CiB9CiAKLWludCBybTkyMDBfdHlwZTsKLUVYUE9SVF9TWU1CT0wocm05MjAwX3R5cGUpOwotCi12b2lkIF9faW5pdCBhdDkxcm05MjAwX3NldF90eXBlKGludCB0eXBlKQotewotCXJtOTIwMF90eXBlID0gdHlwZTsKLX0KLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqICBBVDkxUk05MjAwIHByb2Nlc3NvciBpbml0aWFsaXphdGlvbgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLXZvaWQgX19pbml0IGF0OTFybTkyMDBfbWFwX2lvKHZvaWQpCitzdGF0aWMgdm9pZCBfX2luaXQgYXQ5MXJtOTIwMF9tYXBfaW8odm9pZCkKIHsKIAkvKiBNYXAgcGVyaXBoZXJhbHMgKi8KKwlhdDkxX2luaXRfc3JhbSgwLCBBVDkxUk05MjAwX1NSQU1fQkFTRSwgQVQ5MVJNOTIwMF9TUkFNX1NJWkUpOwogCWlvdGFibGVfaW5pdChhdDkxcm05MjAwX2lvX2Rlc2MsIEFSUkFZX1NJWkUoYXQ5MXJtOTIwMF9pb19kZXNjKSk7CiB9CiAKLXZvaWQgX19pbml0IGF0OTFybTkyMDBfaW5pdGlhbGl6ZSh1bnNpZ25lZCBsb25nIG1haW5fY2xvY2spCitzdGF0aWMgdm9pZCBfX2luaXQgYXQ5MXJtOTIwMF9pbml0aWFsaXplKHZvaWQpCiB7CiAJYXQ5MV9hcmNoX3Jlc2V0ID0gYXQ5MXJtOTIwMF9yZXNldDsKIAlhdDkxX2V4dGVybl9pcnEgPSAoMSA8PCBBVDkxUk05MjAwX0lEX0lSUTApIHwgKDEgPDwgQVQ5MVJNOTIwMF9JRF9JUlExKQpAQCAtMzI5LDEyICszMTMsNiBAQAogCQkJfCAoMSA8PCBBVDkxUk05MjAwX0lEX0lSUTQpIHwgKDEgPDwgQVQ5MVJNOTIwMF9JRF9JUlE1KQogCQkJfCAoMSA8PCBBVDkxUk05MjAwX0lEX0lSUTYpOwogCi0JLyogSW5pdCBjbG9jayBzdWJzeXN0ZW0gKi8KLQlhdDkxX2Nsb2NrX2luaXQobWFpbl9jbG9jayk7Ci0KLQkvKiBSZWdpc3RlciB0aGUgcHJvY2Vzc29yLXNwZWNpZmljIGNsb2NrcyAqLwotCWF0OTFybTkyMDBfcmVnaXN0ZXJfY2xvY2tzKCk7Ci0KIAkvKiBJbml0aWFsaXplIEdQSU8gc3Vic3lzdGVtICovCiAJYXQ5MV9ncGlvX2luaXQoYXQ5MXJtOTIwMF9ncGlvLAogCQljcHVfaXNfYXQ5MXJtOTIwMF9iZ2EoKSA/IEFUOTFSTTkyMDBfQkdBIDogQVQ5MVJNOTIwMF9QUUZQKTsKQEAgLTM4MywxNCArMzYxLDkgQEAKIAkwCS8qIEFkdmFuY2VkIEludGVycnVwdCBDb250cm9sbGVyIChJUlE2KSAqLwogfTsKIAotdm9pZCBfX2luaXQgYXQ5MXJtOTIwMF9pbml0X2ludGVycnVwdHModW5zaWduZWQgaW50IHByaW9yaXR5W05SX0FJQ19JUlFTXSkKLXsKLQlpZiAoIXByaW9yaXR5KQotCQlwcmlvcml0eSA9IGF0OTFybTkyMDBfZGVmYXVsdF9pcnFfcHJpb3JpdHk7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBBSUMgaW50ZXJydXB0IGNvbnRyb2xsZXIgKi8KLQlhdDkxX2FpY19pbml0KHByaW9yaXR5KTsKLQotCS8qIEVuYWJsZSBHUElPIGludGVycnVwdHMgKi8KLQlhdDkxX2dwaW9faXJxX3NldHVwKCk7Ci19CitzdHJ1Y3QgYXQ5MV9pbml0X3NvYyBfX2luaXRkYXRhIGF0OTFybTkyMDBfc29jID0geworCS5tYXBfaW8gPSBhdDkxcm05MjAwX21hcF9pbywKKwkuZGVmYXVsdF9pcnFfcHJpb3JpdHkgPSBhdDkxcm05MjAwX2RlZmF1bHRfaXJxX3ByaW9yaXR5LAorCS5yZWdpc3Rlcl9jbG9ja3MgPSBhdDkxcm05MjAwX3JlZ2lzdGVyX2Nsb2NrcywKKwkuaW5pdCA9IGF0OTFybTkyMDBfaW5pdGlhbGl6ZSwKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MC5jCmluZGV4IDdkNjA2YjAuLmNiMzk3YmUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MC5jCkBAIC0xNyw1OCArMTcsMTYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvbWFwLmg+CiAjaW5jbHVkZSA8bWFjaC9jcHUuaD4KKyNpbmNsdWRlIDxtYWNoL2F0OTFfZGJndS5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MXNhbTkyNjAuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFfcG1jLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxX3JzdGMuaD4KICNpbmNsdWRlIDxtYWNoL2F0OTFfc2hkd2MuaD4KIAorI2luY2x1ZGUgInNvYy5oIgogI2luY2x1ZGUgImdlbmVyaWMuaCIKICNpbmNsdWRlICJjbG9jay5oIgogCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIGF0OTFzYW05MjYwX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCXsKLQkJLnZpcnR1YWwJPSBBVDkxX1ZBX0JBU0VfU1lTLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MV9CQVNFX1NZUyksCi0JCS5sZW5ndGgJCT0gU1pfMTZLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBhdDkxc2FtOTI2MF9zcmFtX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCXsKLQkJLnZpcnR1YWwJPSBBVDkxX0lPX1ZJUlRfQkFTRSAtIEFUOTFTQU05MjYwX1NSQU0wX1NJWkUsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihBVDkxU0FNOTI2MF9TUkFNMF9CQVNFKSwKLQkJLmxlbmd0aAkJPSBBVDkxU0FNOTI2MF9TUkFNMF9TSVpFLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewotCQkudmlydHVhbAk9IEFUOTFfSU9fVklSVF9CQVNFIC0gQVQ5MVNBTTkyNjBfU1JBTTBfU0laRSAtIEFUOTFTQU05MjYwX1NSQU0xX1NJWkUsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihBVDkxU0FNOTI2MF9TUkFNMV9CQVNFKSwKLQkJLmxlbmd0aAkJPSBBVDkxU0FNOTI2MF9TUkFNMV9TSVpFLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBhdDkxc2FtOWcyMF9zcmFtX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCXsKLQkJLnZpcnR1YWwJPSBBVDkxX0lPX1ZJUlRfQkFTRSAtIEFUOTFTQU05RzIwX1NSQU0wX1NJWkUsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihBVDkxU0FNOUcyMF9TUkFNMF9CQVNFKSwKLQkJLmxlbmd0aAkJPSBBVDkxU0FNOUcyMF9TUkFNMF9TSVpFLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewotCQkudmlydHVhbAk9IEFUOTFfSU9fVklSVF9CQVNFIC0gQVQ5MVNBTTlHMjBfU1JBTTBfU0laRSAtIEFUOTFTQU05RzIwX1NSQU0xX1NJWkUsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihBVDkxU0FNOUcyMF9TUkFNMV9CQVNFKSwKLQkJLmxlbmd0aAkJPSBBVDkxU0FNOUcyMF9TUkFNMV9TSVpFLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfQotfTsKLQotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBhdDkxc2FtOXhlX3NyYW1fZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0JewotCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MVNBTTlYRV9TUkFNX0JBU0UpLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfQotfTsKLQogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqICBDbG9ja3MKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0zMzAsMTEgKzI4OCw5IEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBhdDkxc2FtOXhlX21hcF9pbyh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgY2lkciwgc3JhbV9zaXplOworCXVuc2lnbmVkIGxvbmcgc3JhbV9zaXplOwogCi0JY2lkciA9IGF0OTFfc3lzX3JlYWQoQVQ5MV9EQkdVX0NJRFIpOwotCi0Jc3dpdGNoIChjaWRyICYgQVQ5MV9DSURSX1NSQU1TSVopIHsKKwlzd2l0Y2ggKGF0OTFfc29jX2luaXRkYXRhLmNpZHIgJiBBVDkxX0NJRFJfU1JBTVNJWikgewogCQljYXNlIEFUOTFfQ0lEUl9TUkFNU0laXzMySzoKIAkJCXNyYW1fc2l6ZSA9IDIgKiBTWl8xNks7CiAJCQlicmVhazsKQEAgLTM0MywzOCArMjk5LDI5IEBACiAJCQlzcmFtX3NpemUgPSBTWl8xNks7CiAJfQogCi0JYXQ5MXNhbTl4ZV9zcmFtX2Rlc2MtPnZpcnR1YWwgPSBBVDkxX0lPX1ZJUlRfQkFTRSAtIHNyYW1fc2l6ZTsKLQlhdDkxc2FtOXhlX3NyYW1fZGVzYy0+bGVuZ3RoID0gc3JhbV9zaXplOwotCi0JaW90YWJsZV9pbml0KGF0OTFzYW05eGVfc3JhbV9kZXNjLCBBUlJBWV9TSVpFKGF0OTFzYW05eGVfc3JhbV9kZXNjKSk7CisJYXQ5MV9pbml0X3NyYW0oMCwgQVQ5MVNBTTlYRV9TUkFNX0JBU0UsIHNyYW1fc2l6ZSk7CiB9CiAKLXZvaWQgX19pbml0IGF0OTFzYW05MjYwX21hcF9pbyh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IGF0OTFzYW05MjYwX21hcF9pbyh2b2lkKQogewotCS8qIE1hcCBwZXJpcGhlcmFscyAqLwotCWlvdGFibGVfaW5pdChhdDkxc2FtOTI2MF9pb19kZXNjLCBBUlJBWV9TSVpFKGF0OTFzYW05MjYwX2lvX2Rlc2MpKTsKLQotCWlmIChjcHVfaXNfYXQ5MXNhbTl4ZSgpKQorCWlmIChjcHVfaXNfYXQ5MXNhbTl4ZSgpKSB7CiAJCWF0OTFzYW05eGVfbWFwX2lvKCk7Ci0JZWxzZSBpZiAoY3B1X2lzX2F0OTFzYW05ZzIwKCkpCi0JCWlvdGFibGVfaW5pdChhdDkxc2FtOWcyMF9zcmFtX2Rlc2MsIEFSUkFZX1NJWkUoYXQ5MXNhbTlnMjBfc3JhbV9kZXNjKSk7Ci0JZWxzZQotCQlpb3RhYmxlX2luaXQoYXQ5MXNhbTkyNjBfc3JhbV9kZXNjLCBBUlJBWV9TSVpFKGF0OTFzYW05MjYwX3NyYW1fZGVzYykpOworCX0gZWxzZSBpZiAoY3B1X2lzX2F0OTFzYW05ZzIwKCkpIHsKKwkJYXQ5MV9pbml0X3NyYW0oMCwgQVQ5MVNBTTlHMjBfU1JBTTBfQkFTRSwgQVQ5MVNBTTlHMjBfU1JBTTBfU0laRSk7CisJCWF0OTFfaW5pdF9zcmFtKDEsIEFUOTFTQU05RzIwX1NSQU0xX0JBU0UsIEFUOTFTQU05RzIwX1NSQU0xX1NJWkUpOworCX0gZWxzZSB7CisJCWF0OTFfaW5pdF9zcmFtKDAsIEFUOTFTQU05MjYwX1NSQU0wX0JBU0UsIEFUOTFTQU05MjYwX1NSQU0wX1NJWkUpOworCQlhdDkxX2luaXRfc3JhbSgxLCBBVDkxU0FNOTI2MF9TUkFNMV9CQVNFLCBBVDkxU0FNOTI2MF9TUkFNMV9TSVpFKTsKKwl9CiB9CiAKLXZvaWQgX19pbml0IGF0OTFzYW05MjYwX2luaXRpYWxpemUodW5zaWduZWQgbG9uZyBtYWluX2Nsb2NrKQorc3RhdGljIHZvaWQgX19pbml0IGF0OTFzYW05MjYwX2luaXRpYWxpemUodm9pZCkKIHsKIAlhdDkxX2FyY2hfcmVzZXQgPSBhdDkxc2FtOV9hbHRfcmVzZXQ7CiAJcG1fcG93ZXJfb2ZmID0gYXQ5MXNhbTkyNjBfcG93ZXJvZmY7CiAJYXQ5MV9leHRlcm5faXJxID0gKDEgPDwgQVQ5MVNBTTkyNjBfSURfSVJRMCkgfCAoMSA8PCBBVDkxU0FNOTI2MF9JRF9JUlExKQogCQkJfCAoMSA8PCBBVDkxU0FNOTI2MF9JRF9JUlEyKTsKIAotCS8qIEluaXQgY2xvY2sgc3Vic3lzdGVtICovCi0JYXQ5MV9jbG9ja19pbml0KG1haW5fY2xvY2spOwotCi0JLyogUmVnaXN0ZXIgdGhlIHByb2Nlc3Nvci1zcGVjaWZpYyBjbG9ja3MgKi8KLQlhdDkxc2FtOTI2MF9yZWdpc3Rlcl9jbG9ja3MoKTsKLQogCS8qIFJlZ2lzdGVyIEdQSU8gc3Vic3lzdGVtICovCiAJYXQ5MV9ncGlvX2luaXQoYXQ5MXNhbTkyNjBfZ3BpbywgMyk7CiB9CkBAIC00MjEsMTQgKzM2OCw5IEBACiAJMCwJLyogQWR2YW5jZWQgSW50ZXJydXB0IENvbnRyb2xsZXIgKi8KIH07CiAKLXZvaWQgX19pbml0IGF0OTFzYW05MjYwX2luaXRfaW50ZXJydXB0cyh1bnNpZ25lZCBpbnQgcHJpb3JpdHlbTlJfQUlDX0lSUVNdKQotewotCWlmICghcHJpb3JpdHkpCi0JCXByaW9yaXR5ID0gYXQ5MXNhbTkyNjBfZGVmYXVsdF9pcnFfcHJpb3JpdHk7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBBSUMgaW50ZXJydXB0IGNvbnRyb2xsZXIgKi8KLQlhdDkxX2FpY19pbml0KHByaW9yaXR5KTsKLQotCS8qIEVuYWJsZSBHUElPIGludGVycnVwdHMgKi8KLQlhdDkxX2dwaW9faXJxX3NldHVwKCk7Ci19CitzdHJ1Y3QgYXQ5MV9pbml0X3NvYyBfX2luaXRkYXRhIGF0OTFzYW05MjYwX3NvYyA9IHsKKwkubWFwX2lvID0gYXQ5MXNhbTkyNjBfbWFwX2lvLAorCS5kZWZhdWx0X2lycV9wcmlvcml0eSA9IGF0OTFzYW05MjYwX2RlZmF1bHRfaXJxX3ByaW9yaXR5LAorCS5yZWdpc3Rlcl9jbG9ja3MgPSBhdDkxc2FtOTI2MF9yZWdpc3Rlcl9jbG9ja3MsCisJLmluaXQgPSBhdDkxc2FtOTI2MF9pbml0aWFsaXplLAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYxLmMKaW5kZXggYzE0ODMxNi4uZDUyMmI0NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYxLmMKQEAgLTIyLDM2ICsyMiwxMCBAQAogI2luY2x1ZGUgPG1hY2gvYXQ5MV9yc3RjLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxX3NoZHdjLmg+CiAKKyNpbmNsdWRlICJzb2MuaCIKICNpbmNsdWRlICJnZW5lcmljLmgiCiAjaW5jbHVkZSAiY2xvY2suaCIKIAotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBhdDkxc2FtOTI2MV9pb19kZXNjW10gX19pbml0ZGF0YSA9IHsKLQl7Ci0JCS52aXJ0dWFsCT0gQVQ5MV9WQV9CQVNFX1NZUywKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEFUOTFfQkFTRV9TWVMpLAotCQkubGVuZ3RoCQk9IFNaXzE2SywKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sCi19OwotCi1zdGF0aWMgc3RydWN0IG1hcF9kZXNjIGF0OTFzYW05MjYxX3NyYW1fZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0JewotCQkudmlydHVhbAk9IEFUOTFfSU9fVklSVF9CQVNFIC0gQVQ5MVNBTTkyNjFfU1JBTV9TSVpFLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MVNBTTkyNjFfU1JBTV9CQVNFKSwKLQkJLmxlbmd0aAkJPSBBVDkxU0FNOTI2MV9TUkFNX1NJWkUsCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LAotfTsKLQotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBhdDkxc2FtOWcxMF9zcmFtX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCXsKLQkJLnZpcnR1YWwJPSBBVDkxX0lPX1ZJUlRfQkFTRSAtIEFUOTFTQU05RzEwX1NSQU1fU0laRSwKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEFUOTFTQU05RzEwX1NSQU1fQkFTRSksCi0JCS5sZW5ndGgJCT0gQVQ5MVNBTTlHMTBfU1JBTV9TSVpFLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwKLX07Ci0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiAgQ2xvY2tzCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMzAyLDMwICsyNzYsMjEgQEAKICAqICBBVDkxU0FNOTI2MSBwcm9jZXNzb3IgaW5pdGlhbGl6YXRpb24KICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXZvaWQgX19pbml0IGF0OTFzYW05MjYxX21hcF9pbyh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IGF0OTFzYW05MjYxX21hcF9pbyh2b2lkKQogewotCS8qIE1hcCBwZXJpcGhlcmFscyAqLwotCWlvdGFibGVfaW5pdChhdDkxc2FtOTI2MV9pb19kZXNjLCBBUlJBWV9TSVpFKGF0OTFzYW05MjYxX2lvX2Rlc2MpKTsKLQogCWlmIChjcHVfaXNfYXQ5MXNhbTlnMTAoKSkKLQkJaW90YWJsZV9pbml0KGF0OTFzYW05ZzEwX3NyYW1fZGVzYywgQVJSQVlfU0laRShhdDkxc2FtOWcxMF9zcmFtX2Rlc2MpKTsKKwkJYXQ5MV9pbml0X3NyYW0oMCwgQVQ5MVNBTTlHMTBfU1JBTV9CQVNFLCBBVDkxU0FNOUcxMF9TUkFNX1NJWkUpOwogCWVsc2UKLQkJaW90YWJsZV9pbml0KGF0OTFzYW05MjYxX3NyYW1fZGVzYywgQVJSQVlfU0laRShhdDkxc2FtOTI2MV9zcmFtX2Rlc2MpKTsKKwkJYXQ5MV9pbml0X3NyYW0oMCwgQVQ5MVNBTTkyNjFfU1JBTV9CQVNFLCBBVDkxU0FNOTI2MV9TUkFNX1NJWkUpOwogfQogCi12b2lkIF9faW5pdCBhdDkxc2FtOTI2MV9pbml0aWFsaXplKHVuc2lnbmVkIGxvbmcgbWFpbl9jbG9jaykKK3N0YXRpYyB2b2lkIF9faW5pdCBhdDkxc2FtOTI2MV9pbml0aWFsaXplKHZvaWQpCiB7CiAJYXQ5MV9hcmNoX3Jlc2V0ID0gYXQ5MXNhbTlfYWx0X3Jlc2V0OwogCXBtX3Bvd2VyX29mZiA9IGF0OTFzYW05MjYxX3Bvd2Vyb2ZmOwogCWF0OTFfZXh0ZXJuX2lycSA9ICgxIDw8IEFUOTFTQU05MjYxX0lEX0lSUTApIHwgKDEgPDwgQVQ5MVNBTTkyNjFfSURfSVJRMSkKIAkJCXwgKDEgPDwgQVQ5MVNBTTkyNjFfSURfSVJRMik7CiAKLQkvKiBJbml0IGNsb2NrIHN1YnN5c3RlbSAqLwotCWF0OTFfY2xvY2tfaW5pdChtYWluX2Nsb2NrKTsKLQotCS8qIFJlZ2lzdGVyIHRoZSBwcm9jZXNzb3Itc3BlY2lmaWMgY2xvY2tzICovCi0JYXQ5MXNhbTkyNjFfcmVnaXN0ZXJfY2xvY2tzKCk7Ci0KIAkvKiBSZWdpc3RlciBHUElPIHN1YnN5c3RlbSAqLwogCWF0OTFfZ3Bpb19pbml0KGF0OTFzYW05MjYxX2dwaW8sIDMpOwogfQpAQCAtMzcyLDE0ICszMzcsOSBAQAogCTAsCS8qIEFkdmFuY2VkIEludGVycnVwdCBDb250cm9sbGVyICovCiB9OwogCi12b2lkIF9faW5pdCBhdDkxc2FtOTI2MV9pbml0X2ludGVycnVwdHModW5zaWduZWQgaW50IHByaW9yaXR5W05SX0FJQ19JUlFTXSkKLXsKLQlpZiAoIXByaW9yaXR5KQotCQlwcmlvcml0eSA9IGF0OTFzYW05MjYxX2RlZmF1bHRfaXJxX3ByaW9yaXR5OwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgQUlDIGludGVycnVwdCBjb250cm9sbGVyICovCi0JYXQ5MV9haWNfaW5pdChwcmlvcml0eSk7Ci0KLQkvKiBFbmFibGUgR1BJTyBpbnRlcnJ1cHRzICovCi0JYXQ5MV9ncGlvX2lycV9zZXR1cCgpOwotfQorc3RydWN0IGF0OTFfaW5pdF9zb2MgX19pbml0ZGF0YSBhdDkxc2FtOTI2MV9zb2MgPSB7CisJLm1hcF9pbyA9IGF0OTFzYW05MjYxX21hcF9pbywKKwkuZGVmYXVsdF9pcnFfcHJpb3JpdHkgPSBhdDkxc2FtOTI2MV9kZWZhdWx0X2lycV9wcmlvcml0eSwKKwkucmVnaXN0ZXJfY2xvY2tzID0gYXQ5MXNhbTkyNjFfcmVnaXN0ZXJfY2xvY2tzLAorCS5pbml0ID0gYXQ5MXNhbTkyNjFfaW5pdGlhbGl6ZSwKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2My5jCmluZGV4IGRjMjg0NzcuLjA0NGYzYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2My5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2My5jCkBAIC0yMSwyOCArMjEsMTAgQEAKICNpbmNsdWRlIDxtYWNoL2F0OTFfcnN0Yy5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MV9zaGR3Yy5oPgogCisjaW5jbHVkZSAic29jLmgiCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogI2luY2x1ZGUgImNsb2NrLmgiCiAKLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgYXQ5MXNhbTkyNjNfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0JewotCQkudmlydHVhbAk9IEFUOTFfVkFfQkFTRV9TWVMsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihBVDkxX0JBU0VfU1lTKSwKLQkJLmxlbmd0aAkJPSBTWl8xNkssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gQVQ5MV9JT19WSVJUX0JBU0UgLSBBVDkxU0FNOTI2M19TUkFNMF9TSVpFLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MVNBTTkyNjNfU1JBTTBfQkFTRSksCi0JCS5sZW5ndGgJCT0gQVQ5MVNBTTkyNjNfU1JBTTBfU0laRSwKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sIHsKLQkJLnZpcnR1YWwJPSBBVDkxX0lPX1ZJUlRfQkFTRSAtIEFUOTFTQU05MjYzX1NSQU0wX1NJWkUgLSBBVDkxU0FNOTI2M19TUkFNMV9TSVpFLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MVNBTTkyNjNfU1JBTTFfQkFTRSksCi0JCS5sZW5ndGgJCT0gQVQ5MVNBTTkyNjNfU1JBTTFfU0laRSwKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0sCi19OwotCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogIENsb2NrcwogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTMxMywyNCArMjk1LDE4IEBACiAgKiAgQVQ5MVNBTTkyNjMgcHJvY2Vzc29yIGluaXRpYWxpemF0aW9uCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi12b2lkIF9faW5pdCBhdDkxc2FtOTI2M19tYXBfaW8odm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBhdDkxc2FtOTI2M19tYXBfaW8odm9pZCkKIHsKLQkvKiBNYXAgcGVyaXBoZXJhbHMgKi8KLQlpb3RhYmxlX2luaXQoYXQ5MXNhbTkyNjNfaW9fZGVzYywgQVJSQVlfU0laRShhdDkxc2FtOTI2M19pb19kZXNjKSk7CisJYXQ5MV9pbml0X3NyYW0oMCwgQVQ5MVNBTTkyNjNfU1JBTTBfQkFTRSwgQVQ5MVNBTTkyNjNfU1JBTTBfU0laRSk7CisJYXQ5MV9pbml0X3NyYW0oMSwgQVQ5MVNBTTkyNjNfU1JBTTFfQkFTRSwgQVQ5MVNBTTkyNjNfU1JBTTFfU0laRSk7CiB9CiAKLXZvaWQgX19pbml0IGF0OTFzYW05MjYzX2luaXRpYWxpemUodW5zaWduZWQgbG9uZyBtYWluX2Nsb2NrKQorc3RhdGljIHZvaWQgX19pbml0IGF0OTFzYW05MjYzX2luaXRpYWxpemUodm9pZCkKIHsKIAlhdDkxX2FyY2hfcmVzZXQgPSBhdDkxc2FtOV9hbHRfcmVzZXQ7CiAJcG1fcG93ZXJfb2ZmID0gYXQ5MXNhbTkyNjNfcG93ZXJvZmY7CiAJYXQ5MV9leHRlcm5faXJxID0gKDEgPDwgQVQ5MVNBTTkyNjNfSURfSVJRMCkgfCAoMSA8PCBBVDkxU0FNOTI2M19JRF9JUlExKTsKIAotCS8qIEluaXQgY2xvY2sgc3Vic3lzdGVtICovCi0JYXQ5MV9jbG9ja19pbml0KG1haW5fY2xvY2spOwotCi0JLyogUmVnaXN0ZXIgdGhlIHByb2Nlc3Nvci1zcGVjaWZpYyBjbG9ja3MgKi8KLQlhdDkxc2FtOTI2M19yZWdpc3Rlcl9jbG9ja3MoKTsKLQogCS8qIFJlZ2lzdGVyIEdQSU8gc3Vic3lzdGVtICovCiAJYXQ5MV9ncGlvX2luaXQoYXQ5MXNhbTkyNjNfZ3BpbywgNSk7CiB9CkBAIC0zNzcsMTQgKzM1Myw5IEBACiAJMCwJLyogQWR2YW5jZWQgSW50ZXJydXB0IENvbnRyb2xsZXIgKElSUTEpICovCiB9OwogCi12b2lkIF9faW5pdCBhdDkxc2FtOTI2M19pbml0X2ludGVycnVwdHModW5zaWduZWQgaW50IHByaW9yaXR5W05SX0FJQ19JUlFTXSkKLXsKLQlpZiAoIXByaW9yaXR5KQotCQlwcmlvcml0eSA9IGF0OTFzYW05MjYzX2RlZmF1bHRfaXJxX3ByaW9yaXR5OwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgQUlDIGludGVycnVwdCBjb250cm9sbGVyICovCi0JYXQ5MV9haWNfaW5pdChwcmlvcml0eSk7Ci0KLQkvKiBFbmFibGUgR1BJTyBpbnRlcnJ1cHRzICovCi0JYXQ5MV9ncGlvX2lycV9zZXR1cCgpOwotfQorc3RydWN0IGF0OTFfaW5pdF9zb2MgX19pbml0ZGF0YSBhdDkxc2FtOTI2M19zb2MgPSB7CisJLm1hcF9pbyA9IGF0OTFzYW05MjYzX21hcF9pbywKKwkuZGVmYXVsdF9pcnFfcHJpb3JpdHkgPSBhdDkxc2FtOTI2M19kZWZhdWx0X2lycV9wcmlvcml0eSwKKwkucmVnaXN0ZXJfY2xvY2tzID0gYXQ5MXNhbTkyNjNfcmVnaXN0ZXJfY2xvY2tzLAorCS5pbml0ID0gYXQ5MXNhbTkyNjNfaW5pdGlhbGl6ZSwKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlnNDUuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOWc0NS5jCmluZGV4IDExZTIxNDEuLmUwNGM1ZmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOWc0NS5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOWc0NS5jCkBAIC0yMiwyMyArMjIsMTAgQEAKICNpbmNsdWRlIDxtYWNoL2F0OTFfc2hkd2MuaD4KICNpbmNsdWRlIDxtYWNoL2NwdS5oPgogCisjaW5jbHVkZSAic29jLmgiCiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogI2luY2x1ZGUgImNsb2NrLmgiCiAKLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgYXQ5MXNhbTlnNDVfaW9fZGVzY1tdIF9faW5pdGRhdGEgPSB7Ci0JewotCQkudmlydHVhbAk9IEFUOTFfVkFfQkFTRV9TWVMsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihBVDkxX0JBU0VfU1lTKSwKLQkJLmxlbmd0aAkJPSBTWl8xNkssCi0JCS50eXBlCQk9IE1UX0RFVklDRSwKLQl9LCB7Ci0JCS52aXJ0dWFsCT0gQVQ5MV9JT19WSVJUX0JBU0UgLSBBVDkxU0FNOUc0NV9TUkFNX1NJWkUsCi0JCS5wZm4JCT0gX19waHlzX3RvX3BmbihBVDkxU0FNOUc0NV9TUkFNX0JBU0UpLAotCQkubGVuZ3RoCQk9IEFUOTFTQU05RzQ1X1NSQU1fU0laRSwKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0KLX07Ci0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiAgQ2xvY2tzCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMzI5LDI0ICszMTYsMTcgQEAKICAqICBBVDkxU0FNOUc0NSBwcm9jZXNzb3IgaW5pdGlhbGl6YXRpb24KICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLXZvaWQgX19pbml0IGF0OTFzYW05ZzQ1X21hcF9pbyh2b2lkKQorc3RhdGljIHZvaWQgX19pbml0IGF0OTFzYW05ZzQ1X21hcF9pbyh2b2lkKQogewotCS8qIE1hcCBwZXJpcGhlcmFscyAqLwotCWlvdGFibGVfaW5pdChhdDkxc2FtOWc0NV9pb19kZXNjLCBBUlJBWV9TSVpFKGF0OTFzYW05ZzQ1X2lvX2Rlc2MpKTsKKwlhdDkxX2luaXRfc3JhbSgwLCBBVDkxU0FNOUc0NV9TUkFNX0JBU0UsIEFUOTFTQU05RzQ1X1NSQU1fU0laRSk7CiB9CiAKLXZvaWQgX19pbml0IGF0OTFzYW05ZzQ1X2luaXRpYWxpemUodW5zaWduZWQgbG9uZyBtYWluX2Nsb2NrKQorc3RhdGljIHZvaWQgX19pbml0IGF0OTFzYW05ZzQ1X2luaXRpYWxpemUodm9pZCkKIHsKIAlhdDkxX2FyY2hfcmVzZXQgPSBhdDkxc2FtOWc0NV9yZXNldDsKIAlwbV9wb3dlcl9vZmYgPSBhdDkxc2FtOWc0NV9wb3dlcm9mZjsKIAlhdDkxX2V4dGVybl9pcnEgPSAoMSA8PCBBVDkxU0FNOUc0NV9JRF9JUlEwKTsKIAotCS8qIEluaXQgY2xvY2sgc3Vic3lzdGVtICovCi0JYXQ5MV9jbG9ja19pbml0KG1haW5fY2xvY2spOwotCi0JLyogUmVnaXN0ZXIgdGhlIHByb2Nlc3Nvci1zcGVjaWZpYyBjbG9ja3MgKi8KLQlhdDkxc2FtOWc0NV9yZWdpc3Rlcl9jbG9ja3MoKTsKLQogCS8qIFJlZ2lzdGVyIEdQSU8gc3Vic3lzdGVtICovCiAJYXQ5MV9ncGlvX2luaXQoYXQ5MXNhbTlnNDVfZ3BpbywgNSk7CiB9CkBAIC0zOTMsMTQgKzM3Myw5IEBACiAJMCwJLyogQWR2YW5jZWQgSW50ZXJydXB0IENvbnRyb2xsZXIgKElSUTApICovCiB9OwogCi12b2lkIF9faW5pdCBhdDkxc2FtOWc0NV9pbml0X2ludGVycnVwdHModW5zaWduZWQgaW50IHByaW9yaXR5W05SX0FJQ19JUlFTXSkKLXsKLQlpZiAoIXByaW9yaXR5KQotCQlwcmlvcml0eSA9IGF0OTFzYW05ZzQ1X2RlZmF1bHRfaXJxX3ByaW9yaXR5OwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgQUlDIGludGVycnVwdCBjb250cm9sbGVyICovCi0JYXQ5MV9haWNfaW5pdChwcmlvcml0eSk7Ci0KLQkvKiBFbmFibGUgR1BJTyBpbnRlcnJ1cHRzICovCi0JYXQ5MV9ncGlvX2lycV9zZXR1cCgpOwotfQorc3RydWN0IGF0OTFfaW5pdF9zb2MgX19pbml0ZGF0YSBhdDkxc2FtOWc0NV9zb2MgPSB7CisJLm1hcF9pbyA9IGF0OTFzYW05ZzQ1X21hcF9pbywKKwkuZGVmYXVsdF9pcnFfcHJpb3JpdHkgPSBhdDkxc2FtOWc0NV9kZWZhdWx0X2lycV9wcmlvcml0eSwKKwkucmVnaXN0ZXJfY2xvY2tzID0gYXQ5MXNhbTlnNDVfcmVnaXN0ZXJfY2xvY2tzLAorCS5pbml0ID0gYXQ5MXNhbTlnNDVfaW5pdGlhbGl6ZSwKK307CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlybC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05cmwuYwppbmRleCAyOWRmZjE4Li5hMjM4MTA1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTlybC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOXJsLmMKQEAgLTE2LDMwICsxNiwxNiBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KICNpbmNsdWRlIDxtYWNoL2NwdS5oPgorI2luY2x1ZGUgPG1hY2gvYXQ5MV9kYmd1Lmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxc2FtOXJsLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxX3BtYy5oPgogI2luY2x1ZGUgPG1hY2gvYXQ5MV9yc3RjLmg+CiAjaW5jbHVkZSA8bWFjaC9hdDkxX3NoZHdjLmg+CiAKKyNpbmNsdWRlICJzb2MuaCIKICNpbmNsdWRlICJnZW5lcmljLmgiCiAjaW5jbHVkZSAiY2xvY2suaCIKIAotc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBhdDkxc2FtOXJsX2lvX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCXsKLQkJLnZpcnR1YWwJPSBBVDkxX1ZBX0JBU0VfU1lTLAotCQkucGZuCQk9IF9fcGh5c190b19wZm4oQVQ5MV9CQVNFX1NZUyksCi0JCS5sZW5ndGgJCT0gU1pfMTZLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2MgYXQ5MXNhbTlybF9zcmFtX2Rlc2NbXSBfX2luaXRkYXRhID0gewotCXsKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEFUOTFTQU05UkxfU1JBTV9CQVNFKSwKLQkJLnR5cGUJCT0gTVRfREVWSUNFLAotCX0KLX07Ci0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiAgQ2xvY2tzCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMjg3LDE2ICsyNzMsMTEgQEAKICAqICBBVDkxU0FNOVJMIHByb2Nlc3NvciBpbml0aWFsaXphdGlvbgogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotdm9pZCBfX2luaXQgYXQ5MXNhbTlybF9tYXBfaW8odm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBhdDkxc2FtOXJsX21hcF9pbyh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgY2lkciwgc3JhbV9zaXplOworCXVuc2lnbmVkIGxvbmcgc3JhbV9zaXplOwogCi0JLyogTWFwIHBlcmlwaGVyYWxzICovCi0JaW90YWJsZV9pbml0KGF0OTFzYW05cmxfaW9fZGVzYywgQVJSQVlfU0laRShhdDkxc2FtOXJsX2lvX2Rlc2MpKTsKLQotCWNpZHIgPSBhdDkxX3N5c19yZWFkKEFUOTFfREJHVV9DSURSKTsKLQotCXN3aXRjaCAoY2lkciAmIEFUOTFfQ0lEUl9TUkFNU0laKSB7CisJc3dpdGNoIChhdDkxX3NvY19pbml0ZGF0YS5jaWRyICYgQVQ5MV9DSURSX1NSQU1TSVopIHsKIAkJY2FzZSBBVDkxX0NJRFJfU1JBTVNJWl8zMks6CiAJCQlzcmFtX3NpemUgPSAyICogU1pfMTZLOwogCQkJYnJlYWs7CkBAIC0zMDUsMjUgKzI4NiwxNiBAQAogCQkJc3JhbV9zaXplID0gU1pfMTZLOwogCX0KIAotCWF0OTFzYW05cmxfc3JhbV9kZXNjLT52aXJ0dWFsID0gQVQ5MV9JT19WSVJUX0JBU0UgLSBzcmFtX3NpemU7Ci0JYXQ5MXNhbTlybF9zcmFtX2Rlc2MtPmxlbmd0aCA9IHNyYW1fc2l6ZTsKLQogCS8qIE1hcCBTUkFNICovCi0JaW90YWJsZV9pbml0KGF0OTFzYW05cmxfc3JhbV9kZXNjLCBBUlJBWV9TSVpFKGF0OTFzYW05cmxfc3JhbV9kZXNjKSk7CisJYXQ5MV9pbml0X3NyYW0oMCwgQVQ5MVNBTTlSTF9TUkFNX0JBU0UsIHNyYW1fc2l6ZSk7CiB9CiAKLXZvaWQgX19pbml0IGF0OTFzYW05cmxfaW5pdGlhbGl6ZSh1bnNpZ25lZCBsb25nIG1haW5fY2xvY2spCitzdGF0aWMgdm9pZCBfX2luaXQgYXQ5MXNhbTlybF9pbml0aWFsaXplKHZvaWQpCiB7CiAJYXQ5MV9hcmNoX3Jlc2V0ID0gYXQ5MXNhbTlfYWx0X3Jlc2V0OwogCXBtX3Bvd2VyX29mZiA9IGF0OTFzYW05cmxfcG93ZXJvZmY7CiAJYXQ5MV9leHRlcm5faXJxID0gKDEgPDwgQVQ5MVNBTTlSTF9JRF9JUlEwKTsKIAotCS8qIEluaXQgY2xvY2sgc3Vic3lzdGVtICovCi0JYXQ5MV9jbG9ja19pbml0KG1haW5fY2xvY2spOwotCi0JLyogUmVnaXN0ZXIgdGhlIHByb2Nlc3Nvci1zcGVjaWZpYyBjbG9ja3MgKi8KLQlhdDkxc2FtOXJsX3JlZ2lzdGVyX2Nsb2NrcygpOwotCiAJLyogUmVnaXN0ZXIgR1BJTyBzdWJzeXN0ZW0gKi8KIAlhdDkxX2dwaW9faW5pdChhdDkxc2FtOXJsX2dwaW8sIDQpOwogfQpAQCAtMzcwLDE0ICszNDIsOSBAQAogCTAsCS8qIEFkdmFuY2VkIEludGVycnVwdCBDb250cm9sbGVyICovCiB9OwogCi12b2lkIF9faW5pdCBhdDkxc2FtOXJsX2luaXRfaW50ZXJydXB0cyh1bnNpZ25lZCBpbnQgcHJpb3JpdHlbTlJfQUlDX0lSUVNdKQotewotCWlmICghcHJpb3JpdHkpCi0JCXByaW9yaXR5ID0gYXQ5MXNhbTlybF9kZWZhdWx0X2lycV9wcmlvcml0eTsKLQotCS8qIEluaXRpYWxpemUgdGhlIEFJQyBpbnRlcnJ1cHQgY29udHJvbGxlciAqLwotCWF0OTFfYWljX2luaXQocHJpb3JpdHkpOwotCi0JLyogRW5hYmxlIEdQSU8gaW50ZXJydXB0cyAqLwotCWF0OTFfZ3Bpb19pcnFfc2V0dXAoKTsKLX0KK3N0cnVjdCBhdDkxX2luaXRfc29jIF9faW5pdGRhdGEgYXQ5MXNhbTlybF9zb2MgPSB7CisJLm1hcF9pbyA9IGF0OTFzYW05cmxfbWFwX2lvLAorCS5kZWZhdWx0X2lycV9wcmlvcml0eSA9IGF0OTFzYW05cmxfZGVmYXVsdF9pcnFfcHJpb3JpdHksCisJLnJlZ2lzdGVyX2Nsb2NrcyA9IGF0OTFzYW05cmxfcmVnaXN0ZXJfY2xvY2tzLAorCS5pbml0ID0gYXQ5MXNhbTlybF9pbml0aWFsaXplLAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC0xYXJtLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtMWFybS5jCmluZGV4IGFiMWQ0NjMuLjVhYTU4ODUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC0xYXJtLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLTFhcm0uYwpAQCAtNDYsNyArNDYsNyBAQAogCWF0OTFybTkyMDBfc2V0X3R5cGUoQVJDSF9SRVZJU09OXzkyMDBfUFFGUCk7CiAKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTguNDMyIE1IeiBjcnlzdGFsICovCi0JYXQ5MXJtOTIwMF9pbml0aWFsaXplKDE4NDMyMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMTg0MzIwMDApOwogCiAJLyogREJHVSBvbiB0dHlTMC4gKFJ4ICYgVHggb25seSkgKi8KIAlhdDkxX3JlZ2lzdGVyX3VhcnQoMCwgMCwgMCk7CkBAIC02MywxMSArNjMsNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgb25lYXJtX2luaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXJtOTIwMF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYXQ5MV9ldGhfZGF0YSBfX2luaXRkYXRhIG9uZWFybV9ldGhfZGF0YSA9IHsKIAkucGh5X2lycV9waW4JPSBBVDkxX1BJTl9QQzQsCiAJLmlzX3JtaWkJPSAxLApAQCAtOTcsOCArOTIsOCBAQAogTUFDSElORV9TVEFSVChPTkVBUk0sICJBamVjbyAxQVJNIHNpbmdsZSBib2FyZCBjb21wdXRlciIpCiAJLyogTWFpbnRhaW5lcjogTGVubmVydCBCdXl0ZW5oZWsgPGJ1eXRlbmhAd2FudHN0b2ZseS5vcmc+ICovCiAJLnRpbWVyCQk9ICZhdDkxcm05MjAwX3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXJtOTIwMF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IG9uZWFybV9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IG9uZWFybV9pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IG9uZWFybV9ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1hZmViLTkyNjB2MS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWFmZWItOTI2MHYxLmMKaW5kZXggYTQ5MjRkZS4uYjBjNzk2ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWFmZWItOTI2MHYxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWFmZWItOTI2MHYxLmMKQEAgLTUxLDcgKzUxLDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBhZmViOTI2MF9pbml0X2Vhcmx5KHZvaWQpCiB7CiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDE4LjQzMiBNSHogY3J5c3RhbCAqLwotCWF0OTFzYW05MjYwX2luaXRpYWxpemUoMTg0MzIwMDApOworCWF0OTFfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CiAKIAkvKiBEQkdVIG9uIHR0eVMwLiAoUnggJiBUeCBvbmx5KSAqLwogCWF0OTFfcmVnaXN0ZXJfdWFydCgwLCAwLCAwKTsKQEAgLTcwLDEyICs3MCw2IEBACiAJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBhZmViOTI2MF9pbml0X2lycSh2b2lkKQotewotCWF0OTFzYW05MjYwX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQotCiAvKgogICogVVNCIEhvc3QgcG9ydAogICovCkBAIC0yMTksOSArMjEzLDkgQEAKIE1BQ0hJTkVfU1RBUlQoQUZFQjkyNjAsICJDdXN0b20gYWZlYjkyNjAgYm9hcmQiKQogCS8qIE1haW50YWluZXI6IFNlcmdleSBMYXBpbiA8c2xhcGluQG9zc2ZhbnMub3JnPiAqLwogCS50aW1lcgkJPSAmYXQ5MXNhbTkyNnhfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxc2FtOTI2MF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGFmZWI5MjYwX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gYWZlYjkyNjBfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBhZmViOTI2MF9ib2FyZF9pbml0LAogTUFDSElORV9FTkQKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhbTYwLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FtNjAuYwppbmRleCAxNDhmY2NiLi5kMWFiZDU4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FtNjAuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FtNjAuYwpAQCAtNDgsNyArNDgsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IGNhbTYwX2luaXRfZWFybHkodm9pZCkKIHsKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTAgTUh6IGNyeXN0YWwgKi8KLQlhdDkxc2FtOTI2MF9pbml0aWFsaXplKDEwMDAwMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMTAwMDAwMDApOwogCiAJLyogREJHVSBvbiB0dHlTMC4gKFJ4ICYgVHggb25seSkgKi8KIAlhdDkxX3JlZ2lzdGVyX3VhcnQoMCwgMCwgMCk7CkBAIC01NywxMiArNTcsNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgY2FtNjBfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxc2FtOTI2MF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KLQogLyoKICAqIFVTQiBIb3N0CiAgKi8KQEAgLTE5OSw4ICsxOTMsOCBAQAogTUFDSElORV9TVEFSVChDQU02MCwgIkt3aWtCeXRlIENBTTYwIikKIAkvKiBNYWludGFpbmVyOiBLd2lrQnl0ZSAqLwogCS50aW1lcgkJPSAmYXQ5MXNhbTkyNnhfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxc2FtOTI2MF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGNhbTYwX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gY2FtNjBfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBjYW02MF9ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jYXA5YWRrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FwOWFkay5jCmluZGV4IGNkYjY1ZDQuLjY3OWIwYjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jYXA5YWRrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhcDlhZGsuYwpAQCAtNTMsNyArNTMsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IGNhcDlhZGtfaW5pdF9lYXJseSh2b2lkKQogewogCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAxMiBNSHogY3J5c3RhbCAqLwotCWF0OTFjYXA5X2luaXRpYWxpemUoMTIwMDAwMDApOworCWF0OTFfaW5pdGlhbGl6ZSgxMjAwMDAwMCk7CiAKIAkvKiBTZXR1cCB0aGUgTEVEczogVVNFUjEgYW5kIFVTRVIyIExFRCBmb3IgY3B1L3RpbWVyLi4uICovCiAJYXQ5MV9pbml0X2xlZHMoQVQ5MV9QSU5fUEExMCwgQVQ5MV9QSU5fUEExMSk7CkBAIC02NSwxMiArNjUsNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgY2FwOWFka19pbml0X2lycSh2b2lkKQotewotCWF0OTFjYXA5X2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQotCiAvKgogICogVVNCIEhvc3QgcG9ydAogICovCkBAIC0zOTcsOCArMzkxLDggQEAKIE1BQ0hJTkVfU1RBUlQoQVQ5MUNBUDlBREssICJBdG1lbCBBVDkxQ0FQOUEtREsiKQogCS8qIE1haW50YWluZXI6IFN0ZWxpYW4gUG9wIDxzdGVsaWFuLnBvcEBsZWFkdGVjaGRlc2lnbi5jb20+ICovCiAJLnRpbWVyCQk9ICZhdDkxc2FtOTI2eF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFjYXA5X21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gY2FwOWFka19pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGNhcDlhZGtfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBjYXA5YWRrX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNhcm1ldmEuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jYXJtZXZhLmMKaW5kZXggZjM2YjE4Ni4uYzU3OGM1ZDkwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY2FybWV2YS5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jYXJtZXZhLmMKQEAgLTQzLDcgKzQzLDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBjYXJtZXZhX2luaXRfZWFybHkodm9pZCkKIHsKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMjAuMDAwIE1IeiBjcnlzdGFsICovCi0JYXQ5MXJtOTIwMF9pbml0aWFsaXplKDIwMDAwMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMjAwMDAwMDApOwogCiAJLyogREJHVSBvbiB0dHlTMC4gKFJ4ICYgVHggb25seSkgKi8KIAlhdDkxX3JlZ2lzdGVyX3VhcnQoMCwgMCwgMCk7CkBAIC01NywxMSArNTcsNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgY2FybWV2YV9pbml0X2lycSh2b2lkKQotewotCWF0OTFybTkyMDBfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCiBzdGF0aWMgc3RydWN0IGF0OTFfZXRoX2RhdGEgX19pbml0ZGF0YSBjYXJtZXZhX2V0aF9kYXRhID0gewogCS5waHlfaXJxX3Bpbgk9IEFUOTFfUElOX1BDNCwKIAkuaXNfcm1paQk9IDEsCkBAIC0xNjMsOCArMTU4LDggQEAKIE1BQ0hJTkVfU1RBUlQoQ0FSTUVWQSwgIkNhcm1ldmEiKQogCS8qIE1haW50YWluZXI6IENvbml0ZWMgRGF0YXN5c3RlbXMgKi8KIAkudGltZXIJCT0gJmF0OTFybTkyMDBfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxcm05MjAwX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gY2FybWV2YV9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGNhcm1ldmFfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBjYXJtZXZhX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNwdTlrcmVhLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3B1OWtyZWEuYwppbmRleCA5ODA1MTEwLi5mNGRhOGExIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3B1OWtyZWEuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3B1OWtyZWEuYwpAQCAtNTAsNyArNTAsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IGNwdTlrcmVhX2luaXRfZWFybHkodm9pZCkKIHsKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTguNDMyIE1IeiBjcnlzdGFsICovCi0JYXQ5MXNhbTkyNjBfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CisJYXQ5MV9pbml0aWFsaXplKDE4NDMyMDAwKTsKIAogCS8qIERHQlUgb24gdHR5UzAuIChSeCAmIFR4IG9ubHkpICovCiAJYXQ5MV9yZWdpc3Rlcl91YXJ0KDAsIDAsIDApOwpAQCAtODEsMTEgKzgxLDYgQEAKIAlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGNwdTlrcmVhX2luaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXNhbTkyNjBfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCiAvKgogICogVVNCIEhvc3QgcG9ydAogICovCkBAIC0zNzYsOCArMzcxLDggQEAKICNlbmRpZgogCS8qIE1haW50YWluZXI6IEVyaWMgQmVuYXJkIC0gRVVLUkVBIEVsZWN0cm9tYXRpcXVlICovCiAJLnRpbWVyCQk9ICZhdDkxc2FtOTI2eF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFzYW05MjYwX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gY3B1OWtyZWFfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBjcHU5a3JlYV9pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IGNwdTlrcmVhX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNwdWF0OTEuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jcHVhdDkxLmMKaW5kZXggNmRhYWJlMy4uMmQ5MTlmNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNwdWF0OTEuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3B1YXQ5MS5jCkBAIC01Nyw3ICs1Nyw3IEBACiAJYXQ5MXJtOTIwMF9zZXRfdHlwZShBUkNIX1JFVklTT05fOTIwMF9QUUZQKTsKIAogCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAxOC40MzIgTUh6IGNyeXN0YWwgKi8KLQlhdDkxcm05MjAwX2luaXRpYWxpemUoMTg0MzIwMDApOworCWF0OTFfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CiAKIAkvKiBEQkdVIG9uIHR0eVMwLiAoUnggJiBUeCBvbmx5KSAqLwogCWF0OTFfcmVnaXN0ZXJfdWFydCgwLCAwLCAwKTsKQEAgLTgyLDExICs4Miw2IEBACiAJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBjcHVhdDkxX2luaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXJtOTIwMF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYXQ5MV9ldGhfZGF0YSBfX2luaXRkYXRhIGNwdWF0OTFfZXRoX2RhdGEgPSB7CiAJLmlzX3JtaWkJPSAxLAogfTsKQEAgLTE4MCw4ICsxNzUsOCBAQAogTUFDSElORV9TVEFSVChDUFVBVDkxLCAiRXVrcmVhIikKIAkvKiBNYWludGFpbmVyOiBFcmljIEJlbmFyZCAtIEVVS1JFQSBFbGVjdHJvbWF0aXF1ZSAqLwogCS50aW1lcgkJPSAmYXQ5MXJtOTIwMF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFybTkyMDBfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBjcHVhdDkxX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gY3B1YXQ5MV9pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IGNwdWF0OTFfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3NiMzM3LmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3NiMzM3LmMKaW5kZXggZDk4YmNlYy4uMTc2NTRkNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNzYjMzNy5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jc2IzMzcuYwpAQCAtNDYsNyArNDYsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IGNzYjMzN19pbml0X2Vhcmx5KHZvaWQpCiB7CiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDMuNjg2NCBNSHogY3J5c3RhbCAqLwotCWF0OTFybTkyMDBfaW5pdGlhbGl6ZSgzNjg2NDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMzY4NjQwMCk7CiAKIAkvKiBTZXR1cCB0aGUgTEVEcyAqLwogCWF0OTFfaW5pdF9sZWRzKEFUOTFfUElOX1BCMCwgQVQ5MV9QSU5fUEIxKTsKQEAgLTU4LDExICs1OCw2IEBACiAJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBjc2IzMzdfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxcm05MjAwX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQogc3RhdGljIHN0cnVjdCBhdDkxX2V0aF9kYXRhIF9faW5pdGRhdGEgY3NiMzM3X2V0aF9kYXRhID0gewogCS5waHlfaXJxX3Bpbgk9IEFUOTFfUElOX1BDMiwKIAkuaXNfcm1paQk9IDAsCkBAIC0yNTgsOCArMjUzLDggQEAKIE1BQ0hJTkVfU1RBUlQoQ1NCMzM3LCAiQ29nZW50IENTQjMzNyIpCiAJLyogTWFpbnRhaW5lcjogQmlsbCBHYXRsaWZmICovCiAJLnRpbWVyCQk9ICZhdDkxcm05MjAwX3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXJtOTIwMF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGNzYjMzN19pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGNzYjMzN19pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IGNzYjMzN19ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jc2I2MzcuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1jc2I2MzcuYwppbmRleCAwMTlhYWI0Li43MmI1NTY3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtY3NiNjM3LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWNzYjYzNy5jCkBAIC00Myw3ICs0Myw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgY3NiNjM3X2luaXRfZWFybHkodm9pZCkKIHsKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMy42ODY0IE1IeiBjcnlzdGFsICovCi0JYXQ5MXJtOTIwMF9pbml0aWFsaXplKDM2ODY0MDApOworCWF0OTFfaW5pdGlhbGl6ZSgzNjg2NDAwKTsKIAogCS8qIERCR1Ugb24gdHR5UzAuIChSeCAmIFR4IG9ubHkpICovCiAJYXQ5MV9yZWdpc3Rlcl91YXJ0KDAsIDAsIDApOwpAQCAtNTIsMTEgKzUyLDYgQEAKIAlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGNzYjYzN19pbml0X2lycSh2b2lkKQotewotCWF0OTFybTkyMDBfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCiBzdGF0aWMgc3RydWN0IGF0OTFfZXRoX2RhdGEgX19pbml0ZGF0YSBjc2I2MzdfZXRoX2RhdGEgPSB7CiAJLnBoeV9pcnFfcGluCT0gQVQ5MV9QSU5fUEMwLAogCS5pc19ybWlpCT0gMCwKQEAgLTEzOSw4ICsxMzQsOCBAQAogTUFDSElORV9TVEFSVChDU0I2MzcsICJDb2dlbnQgQ1NCNjM3IikKIAkvKiBNYWludGFpbmVyOiBCaWxsIEdhdGxpZmYgKi8KIAkudGltZXIJCT0gJmF0OTFybTkyMDBfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxcm05MjAwX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gY3NiNjM3X2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gY3NiNjM3X2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gY3NiNjM3X2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWViOTIwMC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWViOTIwMC5jCmluZGV4IGU5NDg0NTMuLjAxMTcwYTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1lYjkyMDAuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZWI5MjAwLmMKQEAgLTQzLDcgKzQzLDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBlYjkyMDBfaW5pdF9lYXJseSh2b2lkKQogewogCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAxOC40MzIgTUh6IGNyeXN0YWwgKi8KLQlhdDkxcm05MjAwX2luaXRpYWxpemUoMTg0MzIwMDApOworCWF0OTFfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CiAKIAkvKiBEQkdVIG9uIHR0eVMwLiAoUnggJiBUeCBvbmx5KSAqLwogCWF0OTFfcmVnaXN0ZXJfdWFydCgwLCAwLCAwKTsKQEAgLTYwLDExICs2MCw2IEBACiAJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBlYjkyMDBfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxcm05MjAwX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQogc3RhdGljIHN0cnVjdCBhdDkxX2V0aF9kYXRhIF9faW5pdGRhdGEgZWI5MjAwX2V0aF9kYXRhID0gewogCS5waHlfaXJxX3Bpbgk9IEFUOTFfUElOX1BDNCwKIAkuaXNfcm1paQk9IDEsCkBAIC0xMjEsOCArMTE2LDggQEAKIAogTUFDSElORV9TVEFSVChBVEVCOTIwMCwgIkVtYmVzdCBBVEVCOTIwMCIpCiAJLnRpbWVyCQk9ICZhdDkxcm05MjAwX3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXJtOTIwMF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGViOTIwMF9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGViOTIwMF9pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IGViOTIwMF9ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1lY2JhdDkxLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZWNiYXQ5MS5jCmluZGV4IGE2ZjU3ZmEuLjdjMDMxM2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1lY2JhdDkxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWVjYmF0OTEuYwpAQCAtNDksNyArNDksNyBAQAogCWF0OTFybTkyMDBfc2V0X3R5cGUoQVJDSF9SRVZJU09OXzkyMDBfUFFGUCk7CiAKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTguNDMyIE1IeiBjcnlzdGFsICovCi0JYXQ5MXJtOTIwMF9pbml0aWFsaXplKDE4NDMyMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMTg0MzIwMDApOwogCiAJLyogU2V0dXAgdGhlIExFRHMgKi8KIAlhdDkxX2luaXRfbGVkcyhBVDkxX1BJTl9QQzcsIEFUOTFfUElOX1BDNyk7CkBAIC02NCwxMSArNjQsNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZWNiX2F0OTFpbml0X2lycSh2b2lkKQotewotCWF0OTFybTkyMDBfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCiBzdGF0aWMgc3RydWN0IGF0OTFfZXRoX2RhdGEgX19pbml0ZGF0YSBlY2JfYXQ5MWV0aF9kYXRhID0gewogCS5waHlfaXJxX3Bpbgk9IEFUOTFfUElOX1BDNCwKIAkuaXNfcm1paQk9IDAsCkBAIC0xNzMsOCArMTY4LDggQEAKIE1BQ0hJTkVfU1RBUlQoRUNCQVQ5MSwgImVtUWJpdCdzIEVDQl9BVDkxIikKIAkvKiBNYWludGFpbmVyOiBlbVFiaXQuY29tICovCiAJLnRpbWVyCQk9ICZhdDkxcm05MjAwX3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXJtOTIwMF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGVjYl9hdDkxaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBlY2JfYXQ5MWluaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gZWNiX2F0OTFib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1lY285MjAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1lY285MjAuYwppbmRleCBiZmMwMDYyLi44MjUyYzcyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZWNvOTIwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWVjbzkyMC5jCkBAIC0zNSw3ICszNSw3IEBACiAJLyogU2V0IGNwdSB0eXBlOiBQUUZQICovCiAJYXQ5MXJtOTIwMF9zZXRfdHlwZShBUkNIX1JFVklTT05fOTIwMF9QUUZQKTsKIAotCWF0OTFybTkyMDBfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CisJYXQ5MV9pbml0aWFsaXplKDE4NDMyMDAwKTsKIAogCS8qIFNldHVwIHRoZSBMRURzICovCiAJYXQ5MV9pbml0X2xlZHMoQVQ5MV9QSU5fUEIwLCBBVDkxX1BJTl9QQjEpOwpAQCAtNDcsMTEgKzQ3LDYgQEAKIAlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGVjbzkyMF9pbml0X2lycSh2b2lkKQotewotCWF0OTFybTkyMDBfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCiBzdGF0aWMgc3RydWN0IGF0OTFfZXRoX2RhdGEgX19pbml0ZGF0YSBlY285MjBfZXRoX2RhdGEgPSB7CiAJLnBoeV9pcnFfcGluCT0gQVQ5MV9QSU5fUEMyLAogCS5pc19ybWlpCT0gMSwKQEAgLTEzNSw4ICsxMzAsOCBAQAogTUFDSElORV9TVEFSVChFQ085MjAsICJlY285MjAiKQogCS8qIE1haW50YWluZXI6IFNhc2NoYSBIYXVlciAqLwogCS50aW1lcgkJPSAmYXQ5MXJtOTIwMF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFybTkyMDBfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBlY285MjBfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBlY285MjBfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBlY285MjBfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZmxleGliaXR5LmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZmxleGliaXR5LmMKaW5kZXggNDY2YzA2My4uNGMzZjY1ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWZsZXhpYml0eS5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1mbGV4aWJpdHkuYwpAQCAtNDAsNyArNDAsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IGZsZXhpYml0eV9pbml0X2Vhcmx5KHZvaWQpCiB7CiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDE4LjQzMiBNSHogY3J5c3RhbCAqLwotCWF0OTFzYW05MjYwX2luaXRpYWxpemUoMTg0MzIwMDApOworCWF0OTFfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CiAKIAkvKiBEQkdVIG9uIHR0eVMwLiAoUnggJiBUeCBvbmx5KSAqLwogCWF0OTFfcmVnaXN0ZXJfdWFydCgwLCAwLCAwKTsKQEAgLTQ5LDExICs0OSw2IEBACiAJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBmbGV4aWJpdHlfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxc2FtOTI2MF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KIC8qIFVTQiBIb3N0IHBvcnQgKi8KIHN0YXRpYyBzdHJ1Y3QgYXQ5MV91c2JoX2RhdGEgX19pbml0ZGF0YSBmbGV4aWJpdHlfdXNiaF9kYXRhID0gewogCS5wb3J0cwkJPSAyLApAQCAtMTU1LDggKzE1MCw4IEBACiBNQUNISU5FX1NUQVJUKEZMRVhJQklUWSwgIkZsZXhpYml0eSBDb25uZWN0IikKIAkvKiBNYWludGFpbmVyOiBNYXhpbSBPc2lwb3YgKi8KIAkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXNhbTkyNjBfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBmbGV4aWJpdHlfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBmbGV4aWJpdHlfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBmbGV4aWJpdHlfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZm94ZzIwLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZm94ZzIwLmMKaW5kZXggZTJkMWRjOS4uZjI3ZDFhNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWZveGcyMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1mb3hnMjAuYwpAQCAtNjAsNyArNjAsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IGZveGcyMF9pbml0X2Vhcmx5KHZvaWQpCiB7CiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDE4LjQzMiBNSHogY3J5c3RhbCAqLwotCWF0OTFzYW05MjYwX2luaXRpYWxpemUoMTg0MzIwMDApOworCWF0OTFfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CiAKIAkvKiBEQkdVIG9uIHR0eVMwLiAoUnggJiBUeCBvbmx5KSAqLwogCWF0OTFfcmVnaXN0ZXJfdWFydCgwLCAwLCAwKTsKQEAgLTEwMSwxMiArMTAxLDYgQEAKIAogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZm94ZzIwX2luaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXNhbTkyNjBfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCi0KIC8qCiAgKiBVU0IgSG9zdCBwb3J0CiAgKi8KQEAgLTI2Nyw4ICsyNjEsOCBAQAogTUFDSElORV9TVEFSVChBQ01FTkVUVVNGT1hHMjAsICJBY21lIFN5c3RlbXMgc3JsIEZPWCBCb2FyZCBHMjAiKQogCS8qIE1haW50YWluZXI6IFNlcmdpbyBUYW56aWxsaSAqLwogCS50aW1lcgkJPSAmYXQ5MXNhbTkyNnhfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxc2FtOTI2MF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGZveGcyMF9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGZveGcyMF9pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IGZveGcyMF9ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1nc2lhMThzLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtZ3NpYTE4cy5jCmluZGV4IDFkNGYzNmIuLjJlOTU5NDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1nc2lhMThzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWdzaWExOHMuYwpAQCAtNzUsMTEgKzc1LDYgQEAKIAlhdDkxX3JlZ2lzdGVyX3VhcnQoQVQ5MVNBTTkyNjBfSURfVVM0LCA1LCAwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGluaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXNhbTkyNjBfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCiAvKgogICogVHdvIFVTQiBIb3N0IHBvcnRzCiAgKi8KQEAgLTU3Nyw4ICs1NzIsOCBAQAogCiBNQUNISU5FX1NUQVJUKEdTSUExOFMsICJHU19JQTE4X1MiKQogCS50aW1lcgkJPSAmYXQ5MXNhbTkyNnhfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxc2FtOTI2MF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGdzaWExOHNfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBpbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IGdzaWExOHNfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQta2FmYS5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWthZmEuYwppbmRleCA5YjAwM2ZmLi40YTE3MDg5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQta2FmYS5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1rYWZhLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIAlhdDkxcm05MjAwX3NldF90eXBlKEFSQ0hfUkVWSVNPTl85MjAwX1BRRlApOwogCiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDE4LjQzMiBNSHogY3J5c3RhbCAqLwotCWF0OTFybTkyMDBfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CisJYXQ5MV9pbml0aWFsaXplKDE4NDMyMDAwKTsKIAogCS8qIFNldCB1cCB0aGUgTEVEcyAqLwogCWF0OTFfaW5pdF9sZWRzKEFUOTFfUElOX1BCNCwgQVQ5MV9QSU5fUEI0KTsKQEAgLTYxLDExICs2MSw2IEBACiAJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBrYWZhX2luaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXJtOTIwMF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYXQ5MV9ldGhfZGF0YSBfX2luaXRkYXRhIGthZmFfZXRoX2RhdGEgPSB7CiAJLnBoeV9pcnFfcGluCT0gQVQ5MV9QSU5fUEM0LAogCS5pc19ybWlpCT0gMCwKQEAgLTk5LDggKzk0LDggQEAKIE1BQ0hJTkVfU1RBUlQoS0FGQSwgIlNwZXJyeS1TdW4gS0FGQSIpCiAJLyogTWFpbnRhaW5lcjogU2VyZ2VpIFNoYXJvbm92ICovCiAJLnRpbWVyCQk9ICZhdDkxcm05MjAwX3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXJtOTIwMF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGthZmFfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBrYWZhX2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0ga2FmYV9ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1rYjkyMDIuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1rYjkyMDIuYwppbmRleCBhODEzYTc0Li45ZGM4ZDQ5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQta2I5MjAyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLWtiOTIwMi5jCkBAIC00OCw3ICs0OCw3IEBACiAJYXQ5MXJtOTIwMF9zZXRfdHlwZShBUkNIX1JFVklTT05fOTIwMF9QUUZQKTsKIAogCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAxMCBNSHogY3J5c3RhbCAqLwotCWF0OTFybTkyMDBfaW5pdGlhbGl6ZSgxMDAwMDAwMCk7CisJYXQ5MV9pbml0aWFsaXplKDEwMDAwMDAwKTsKIAogCS8qIFNldCB1cCB0aGUgTEVEcyAqLwogCWF0OTFfaW5pdF9sZWRzKEFUOTFfUElOX1BDMTksIEFUOTFfUElOX1BDMTgpOwpAQCAtNjksMTEgKzY5LDYgQEAKIAlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGtiOTIwMl9pbml0X2lycSh2b2lkKQotewotCWF0OTFybTkyMDBfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCiBzdGF0aWMgc3RydWN0IGF0OTFfZXRoX2RhdGEgX19pbml0ZGF0YSBrYjkyMDJfZXRoX2RhdGEgPSB7CiAJLnBoeV9pcnFfcGluCT0gQVQ5MV9QSU5fUEIyOSwKIAkuaXNfcm1paQk9IDAsCkBAIC0xNDAsOCArMTM1LDggQEAKIE1BQ0hJTkVfU1RBUlQoS0I5MjAwLCAiS0I5MjB4IikKIAkvKiBNYWludGFpbmVyOiBLd2lrQnl0ZSwgSW5jLiAqLwogCS50aW1lcgkJPSAmYXQ5MXJtOTIwMF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFybTkyMDBfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBrYjkyMDJfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBrYjkyMDJfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBrYjkyMDJfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtbmVvY29yZTkyNi5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLW5lb2NvcmU5MjYuYwppbmRleCA5NjFlODA1Li45YmM2YWIzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtbmVvY29yZTkyNi5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1uZW9jb3JlOTI2LmMKQEAgLTU0LDcgKzU0LDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBuZW9jb3JlOTI2X2luaXRfZWFybHkodm9pZCkKIHsKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMjAgTUh6IGNyeXN0YWwgKi8KLQlhdDkxc2FtOTI2M19pbml0aWFsaXplKDIwMDAwMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMjAwMDAwMDApOwogCiAJLyogREJHVSBvbiB0dHlTMC4gKFJ4ICYgVHggb25seSkgKi8KIAlhdDkxX3JlZ2lzdGVyX3VhcnQoMCwgMCwgMCk7CkBAIC02NiwxMiArNjYsNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgbmVvY29yZTkyNl9pbml0X2lycSh2b2lkKQotewotCWF0OTFzYW05MjYzX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQotCiAvKgogICogVVNCIEhvc3QgcG9ydAogICovCkBAIC0zODgsOCArMzgyLDggQEAKIE1BQ0hJTkVfU1RBUlQoTkVPQ09SRTkyNiwgIkFERU5FTyBORU9DT1JFIDkyNiIpCiAJLyogTWFpbnRhaW5lcjogQURFTkVPICovCiAJLnRpbWVyCQk9ICZhdDkxc2FtOTI2eF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFzYW05MjYzX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gbmVvY29yZTkyNl9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IG5lb2NvcmU5MjZfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBuZW9jb3JlOTI2X2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXBjb250cm9sLWcyMC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXBjb250cm9sLWcyMC5jCmluZGV4IDIxYTIxYWYuLjQ5ZTNmNjkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1wY29udHJvbC1nMjAuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcGNvbnRyb2wtZzIwLmMKQEAgLTUzLDEzICs1Myw2IEBACiAJYXQ5MV9yZWdpc3Rlcl91YXJ0KEFUOTFTQU05MjYwX0lEX1VTNCwgMywgMCk7CiB9CiAKLQotc3RhdGljIHZvaWQgX19pbml0IGluaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXNhbTkyNjBfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCi0KIHN0YXRpYyBzdHJ1Y3Qgc2FtOV9zbWNfY29uZmlnIF9faW5pdGRhdGEgcGNvbnRyb2xfc21jX2NvbmZpZ1syXSA9IHsgewogCS5uY3NfcmVhZF9zZXR1cAkJPSAxNiwKIAkubnJkX3NldHVwCQk9IDE4LApAQCAtMjIzLDggKzIxNiw4IEBACiBNQUNISU5FX1NUQVJUKFBDT05UUk9MX0cyMCwgIlBDb250cm9sIEcyMCIpCiAJLyogTWFpbnRhaW5lcjogcGdzZWxsbWFubkBwb3J0bmVyLWVsZWt0cm9uaWsuYXQgKi8KIAkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXNhbTkyNjBfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBwY29udHJvbF9nMjBfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBpbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IHBjb250cm9sX2cyMF9ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1waWNvdHV4MjAwLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcGljb3R1eDIwMC5jCmluZGV4IDc1NmNjMmEuLmI3YjgzOTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1waWNvdHV4MjAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXBpY290dXgyMDAuYwpAQCAtNDYsNyArNDYsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IHBpY290dXgyMDBfaW5pdF9lYXJseSh2b2lkKQogewogCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAxOC40MzIgTUh6IGNyeXN0YWwgKi8KLQlhdDkxcm05MjAwX2luaXRpYWxpemUoMTg0MzIwMDApOworCWF0OTFfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CiAKIAkvKiBEQkdVIG9uIHR0eVMwLiAoUnggJiBUeCBvbmx5KSAqLwogCWF0OTFfcmVnaXN0ZXJfdWFydCgwLCAwLCAwKTsKQEAgLTYwLDExICs2MCw2IEBACiAJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBwaWNvdHV4MjAwX2luaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXJtOTIwMF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYXQ5MV9ldGhfZGF0YSBfX2luaXRkYXRhIHBpY290dXgyMDBfZXRoX2RhdGEgPSB7CiAJLnBoeV9pcnFfcGluCT0gQVQ5MV9QSU5fUEM0LAogCS5pc19ybWlpCT0gMSwKQEAgLTEyNCw4ICsxMTksOCBAQAogTUFDSElORV9TVEFSVChQSUNPVFVYMlhYLCAicGljb3R1eCAyMDAiKQogCS8qIE1haW50YWluZXI6IEtsZWluaGVueiBFbGVrdHJvbmlrIEdtYkggKi8KIAkudGltZXIJCT0gJmF0OTFybTkyMDBfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxcm05MjAwX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gcGljb3R1eDIwMF9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IHBpY290dXgyMDBfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBwaWNvdHV4MjAwX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXFpbC1hOTI2MC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXFpbC1hOTI2MC5jCmluZGV4IGQxYTYwMDEuLjgxZjkxMTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1xaWwtYTkyNjAuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcWlsLWE5MjYwLmMKQEAgLTUxLDcgKzUxLDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBla19pbml0X2Vhcmx5KHZvaWQpCiB7CiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDEyLjAwMCBNSHogY3J5c3RhbCAqLwotCWF0OTFzYW05MjYwX2luaXRpYWxpemUoMTIwMDAwMDApOworCWF0OTFfaW5pdGlhbGl6ZSgxMjAwMDAwMCk7CiAKIAkvKiBEQkdVIG9uIHR0eVMwLiAoUnggJiBUeCBvbmx5KSAqLwogCWF0OTFfcmVnaXN0ZXJfdWFydCgwLCAwLCAwKTsKQEAgLTcyLDEyICs3Miw2IEBACiAKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGVrX2luaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXNhbTkyNjBfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCi0KIC8qCiAgKiBVU0IgSG9zdCBwb3J0CiAgKi8KQEAgLTI2OSw4ICsyNjMsOCBAQAogTUFDSElORV9TVEFSVChRSUxfQTkyNjAsICJDQUxBTyBRSUxfQTkyNjAiKQogCS8qIE1haW50YWluZXI6IGNhbGFvLXN5c3RlbXMgKi8KIAkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXNhbTkyNjBfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBla19pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGVrX2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gZWtfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcm05MjAwZGsuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1ybTkyMDBkay5jCmluZGV4IGFlZjk2MjcuLjZmMDhmYWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1ybTkyMDBkay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1ybTkyMDBkay5jCkBAIC00OCw3ICs0OCw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgZGtfaW5pdF9lYXJseSh2b2lkKQogewogCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAxOC40MzIgTUh6IGNyeXN0YWwgKi8KLQlhdDkxcm05MjAwX2luaXRpYWxpemUoMTg0MzIwMDApOworCWF0OTFfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CiAKIAkvKiBTZXR1cCB0aGUgTEVEcyAqLwogCWF0OTFfaW5pdF9sZWRzKEFUOTFfUElOX1BCMiwgQVQ5MV9QSU5fUEIyKTsKQEAgLTY1LDExICs2NSw2IEBACiAJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBka19pbml0X2lycSh2b2lkKQotewotCWF0OTFybTkyMDBfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCiBzdGF0aWMgc3RydWN0IGF0OTFfZXRoX2RhdGEgX19pbml0ZGF0YSBka19ldGhfZGF0YSA9IHsKIAkucGh5X2lycV9waW4JPSBBVDkxX1BJTl9QQzQsCiAJLmlzX3JtaWkJPSAxLApAQCAtMjI4LDggKzIyMyw4IEBACiBNQUNISU5FX1NUQVJUKEFUOTFSTTkyMDBESywgIkF0bWVsIEFUOTFSTTkyMDAtREsiKQogCS8qIE1haW50YWluZXI6IFNBTiBQZW9wbGUvQXRtZWwgKi8KIAkudGltZXIJCT0gJmF0OTFybTkyMDBfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxcm05MjAwX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gZGtfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBka19pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IGRrX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXJtOTIwMGVrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcm05MjAwZWsuYwppbmRleCAwMTVhMDIxLi44NWJjY2NkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcm05MjAwZWsuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtcm05MjAwZWsuYwpAQCAtNDgsNyArNDgsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IGVrX2luaXRfZWFybHkodm9pZCkKIHsKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTguNDMyIE1IeiBjcnlzdGFsICovCi0JYXQ5MXJtOTIwMF9pbml0aWFsaXplKDE4NDMyMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMTg0MzIwMDApOwogCiAJLyogU2V0dXAgdGhlIExFRHMgKi8KIAlhdDkxX2luaXRfbGVkcyhBVDkxX1BJTl9QQjEsIEFUOTFfUElOX1BCMik7CkBAIC02NSwxMSArNjUsNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZWtfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxcm05MjAwX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQogc3RhdGljIHN0cnVjdCBhdDkxX2V0aF9kYXRhIF9faW5pdGRhdGEgZWtfZXRoX2RhdGEgPSB7CiAJLnBoeV9pcnFfcGluCT0gQVQ5MV9QSU5fUEM0LAogCS5pc19ybWlpCT0gMSwKQEAgLTE5NCw4ICsxODksOCBAQAogTUFDSElORV9TVEFSVChBVDkxUk05MjAwRUssICJBdG1lbCBBVDkxUk05MjAwLUVLIikKIAkvKiBNYWludGFpbmVyOiBTQU4gUGVvcGxlL0F0bWVsICovCiAJLnRpbWVyCQk9ICZhdDkxcm05MjAwX3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXJtOTIwMF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGVrX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gZWtfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBla19ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05LWw5MjYwLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOS1sOTI2MC5jCmluZGV4IGFhZjFiZjAuLjRkM2EwMmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05LWw5MjYwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTktbDkyNjAuYwpAQCAtNDcsNyArNDcsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IGVrX2luaXRfZWFybHkodm9pZCkKIHsKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTguNDMyIE1IeiBjcnlzdGFsICovCi0JYXQ5MXNhbTkyNjBfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CisJYXQ5MV9pbml0aWFsaXplKDE4NDMyMDAwKTsKIAogCS8qIFNldHVwIHRoZSBMRURzICovCiAJYXQ5MV9pbml0X2xlZHMoQVQ5MV9QSU5fUEE5LCBBVDkxX1BJTl9QQTYpOwpAQCAtNjcsMTIgKzY3LDYgQEAKIAlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGVrX2luaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXNhbTkyNjBfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCi0KIC8qCiAgKiBVU0IgSG9zdCBwb3J0CiAgKi8KQEAgLTIxMyw4ICsyMDcsOCBAQAogTUFDSElORV9TVEFSVChTQU05X0w5MjYwLCAiT2xpbWV4IFNBTTktTDkyNjAiKQogCS8qIE1haW50YWluZXI6IE9saW1leCAqLwogCS50aW1lcgkJPSAmYXQ5MXNhbTkyNnhfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxc2FtOTI2MF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGVrX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gZWtfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBla19ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYwZWsuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYwZWsuYwppbmRleCA1YzI0MDc0Li44YTUwYzNlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2MGVrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjBlay5jCkBAIC01Myw3ICs1Myw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgZWtfaW5pdF9lYXJseSh2b2lkKQogewogCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAxOC40MzIgTUh6IGNyeXN0YWwgKi8KLQlhdDkxc2FtOTI2MF9pbml0aWFsaXplKDE4NDMyMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMTg0MzIwMDApOwogCiAJLyogREJHVSBvbiB0dHlTMC4gKFJ4ICYgVHggb25seSkgKi8KIAlhdDkxX3JlZ2lzdGVyX3VhcnQoMCwgMCwgMCk7CkBAIC03MCwxMiArNzAsNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZWtfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxc2FtOTI2MF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KLQogLyoKICAqIFVTQiBIb3N0IHBvcnQKICAqLwpAQCAtMzU0LDggKzM0OCw4IEBACiBNQUNISU5FX1NUQVJUKEFUOTFTQU05MjYwRUssICJBdG1lbCBBVDkxU0FNOTI2MC1FSyIpCiAJLyogTWFpbnRhaW5lcjogQXRtZWwgKi8KIAkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXNhbTkyNjBfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBla19pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGVrX2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gZWtfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2MWVrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2MWVrLmMKaW5kZXggYjYwYzIyYi4uNTA5NmEwZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjFlay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYxZWsuYwpAQCAtNTcsNyArNTcsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IGVrX2luaXRfZWFybHkodm9pZCkKIHsKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTguNDMyIE1IeiBjcnlzdGFsICovCi0JYXQ5MXNhbTkyNjFfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CisJYXQ5MV9pbml0aWFsaXplKDE4NDMyMDAwKTsKIAogCS8qIFNldHVwIHRoZSBMRURzICovCiAJYXQ5MV9pbml0X2xlZHMoQVQ5MV9QSU5fUEExMywgQVQ5MV9QSU5fUEExNCk7CkBAIC02OSwxMiArNjksNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZWtfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxc2FtOTI2MV9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KLQogLyoKICAqIERNOTAwMCBldGhlcm5ldCBkZXZpY2UKICAqLwpAQCAtNjIxLDggKzYxNSw4IEBACiAjZW5kaWYKIAkvKiBNYWludGFpbmVyOiBBdG1lbCAqLwogCS50aW1lcgkJPSAmYXQ5MXNhbTkyNnhfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxc2FtOTI2MV9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGVrX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gZWtfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBla19ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYzZWsuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05MjYzZWsuYwppbmRleCA5YmJkYzkyLi5lYThmMTg1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOTI2M2VrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTkyNjNlay5jCkBAIC01Niw3ICs1Niw3IEBACiBzdGF0aWMgdm9pZCBfX2luaXQgZWtfaW5pdF9lYXJseSh2b2lkKQogewogCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAxNi4zNjcgTUh6IGNyeXN0YWwgKi8KLQlhdDkxc2FtOTI2M19pbml0aWFsaXplKDE2MzY3NjYwKTsKKwlhdDkxX2luaXRpYWxpemUoMTYzNjc2NjApOwogCiAJLyogREJHVSBvbiB0dHlTMC4gKFJ4ICYgVHggb25seSkgKi8KIAlhdDkxX3JlZ2lzdGVyX3VhcnQoMCwgMCwgMCk7CkBAIC02OCwxMiArNjgsNiBAQAogCWF0OTFfc2V0X3NlcmlhbF9jb25zb2xlKDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgZWtfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxc2FtOTI2M19pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KLQogLyoKICAqIFVTQiBIb3N0IHBvcnQKICAqLwpAQCAtNDUyLDggKzQ0Niw4IEBACiBNQUNISU5FX1NUQVJUKEFUOTFTQU05MjYzRUssICJBdG1lbCBBVDkxU0FNOTI2My1FSyIpCiAJLyogTWFpbnRhaW5lcjogQXRtZWwgKi8KIAkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXNhbTkyNjNfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBla19pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGVrX2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gZWtfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOWcyMGVrLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOWcyMGVrLmMKaW5kZXggMTMyNWE1MC4uODE3ZjU5ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlnMjBlay5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05ZzIwZWsuYwpAQCAtNjQsNyArNjQsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IGVrX2luaXRfZWFybHkodm9pZCkKIHsKIAkvKiBJbml0aWFsaXplIHByb2Nlc3NvcjogMTguNDMyIE1IeiBjcnlzdGFsICovCi0JYXQ5MXNhbTkyNjBfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CisJYXQ5MV9pbml0aWFsaXplKDE4NDMyMDAwKTsKIAogCS8qIERCR1Ugb24gdHR5UzAuIChSeCAmIFR4IG9ubHkpICovCiAJYXQ5MV9yZWdpc3Rlcl91YXJ0KDAsIDAsIDApOwpAQCAtODEsMTIgKzgxLDYgQEAKIAlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGVrX2luaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXNhbTkyNjBfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCi0KIC8qCiAgKiBVU0IgSG9zdCBwb3J0CiAgKi8KQEAgLTQwNCwxNyArMzk4LDE3IEBACiBNQUNISU5FX1NUQVJUKEFUOTFTQU05RzIwRUssICJBdG1lbCBBVDkxU0FNOUcyMC1FSyIpCiAJLyogTWFpbnRhaW5lcjogQXRtZWwgKi8KIAkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXNhbTkyNjBfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBla19pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGVrX2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gZWtfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECiAKIE1BQ0hJTkVfU1RBUlQoQVQ5MVNBTTlHMjBFS18yTU1DLCAiQXRtZWwgQVQ5MVNBTTlHMjAtRUsgMiBNTUMgU2xvdCBNb2QiKQogCS8qIE1haW50YWluZXI6IEF0bWVsICovCiAJLnRpbWVyCQk9ICZhdDkxc2FtOTI2eF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFzYW05MjYwX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gZWtfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBla19pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IGVrX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTltMTBnNDVlay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTltMTBnNDVlay5jCmluZGV4IDMzZWFhMTMuLmFkMjM0Y2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05bTEwZzQ1ZWsuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc2FtOW0xMGc0NWVrLmMKQEAgLTUwLDcgKzUwLDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBla19pbml0X2Vhcmx5KHZvaWQpCiB7CiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDEyLjAwMCBNSHogY3J5c3RhbCAqLwotCWF0OTFzYW05ZzQ1X2luaXRpYWxpemUoMTIwMDAwMDApOworCWF0OTFfaW5pdGlhbGl6ZSgxMjAwMDAwMCk7CiAKIAkvKiBER0JVIG9uIHR0eVMwLiAoUnggJiBUeCBvbmx5KSAqLwogCWF0OTFfcmVnaXN0ZXJfdWFydCgwLCAwLCAwKTsKQEAgLTYzLDEyICs2Myw2IEBACiAJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBla19pbml0X2lycSh2b2lkKQotewotCWF0OTFzYW05ZzQ1X2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQotCiAvKgogICogVVNCIEhTIEhvc3QgcG9ydCAoY29tbW9uIHRvIE9IQ0kgJiBFSENJKQogICovCkBAIC00MjIsOCArNDE2LDggQEAKIE1BQ0hJTkVfU1RBUlQoQVQ5MVNBTTlNMTBHNDVFSywgIkF0bWVsIEFUOTFTQU05TTEwRzQ1LUVLIikKIAkvKiBNYWludGFpbmVyOiBBdG1lbCAqLwogCS50aW1lcgkJPSAmYXQ5MXNhbTkyNnhfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxc2FtOWc0NV9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGVrX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gZWtfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBla19ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zYW05cmxlay5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlybGVrLmMKaW5kZXggZWZmYjM5OS4uNGYxNGI1NCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlybGVrLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNhbTlybGVrLmMKQEAgLTQxLDcgKzQxLDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBla19pbml0X2Vhcmx5KHZvaWQpCiB7CiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDEyLjAwMCBNSHogY3J5c3RhbCAqLwotCWF0OTFzYW05cmxfaW5pdGlhbGl6ZSgxMjAwMDAwMCk7CisJYXQ5MV9pbml0aWFsaXplKDEyMDAwMDAwKTsKIAogCS8qIERCR1Ugb24gdHR5UzAuIChSeCAmIFR4IG9ubHkpICovCiAJYXQ5MV9yZWdpc3Rlcl91YXJ0KDAsIDAsIDApOwpAQCAtNTMsMTIgKzUzLDYgQEAKIAlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGVrX2luaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXNhbTlybF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KLQogLyoKICAqIFVTQiBIUyBEZXZpY2UgcG9ydAogICovCkBAIC0zMzAsOCArMzI0LDggQEAKIE1BQ0hJTkVfU1RBUlQoQVQ5MVNBTTlSTEVLLCAiQXRtZWwgQVQ5MVNBTTlSTC1FSyIpCiAJLyogTWFpbnRhaW5lcjogQXRtZWwgKi8KIAkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXNhbTlybF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IGVrX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0gZWtfaW5pdF9pcnEsCisJLmluaXRfaXJxCT0gYXQ5MV9pbml0X2lycV9kZWZhdWx0LAogCS5pbml0X21hY2hpbmUJPSBla19ib2FyZF9pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zbmFwcGVyOTI2MC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNuYXBwZXI5MjYwLmMKaW5kZXggNjAxMGNlMS4uYzczZDI1ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNuYXBwZXI5MjYwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXNuYXBwZXI5MjYwLmMKQEAgLTQyLDcgKzQyLDcgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IHNuYXBwZXI5MjYwX2luaXRfZWFybHkodm9pZCkKIHsKLQlhdDkxc2FtOTI2MF9pbml0aWFsaXplKDE4NDMyMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMTg0MzIwMDApOwogCiAJLyogRGVidWcgb24gdHR5UzAgKi8KIAlhdDkxX3JlZ2lzdGVyX3VhcnQoMCwgMCwgMCk7CkBAIC01NSwxMSArNTUsNiBAQAogCWF0OTFfcmVnaXN0ZXJfdWFydChBVDkxU0FNOTI2MF9JRF9VUzIsIDMsIDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgc25hcHBlcjkyNjBfaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxc2FtOTI2MF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYXQ5MV91c2JoX2RhdGEgX19pbml0ZGF0YSBzbmFwcGVyOTI2MF91c2JoX2RhdGEgPSB7CiAJLnBvcnRzCQk9IDIsCiB9OwpAQCAtMTc5LDkgKzE3NCw5IEBACiAKIE1BQ0hJTkVfU1RBUlQoU05BUFBFUl85MjYwLCAiQmx1ZXdhdGVyIFN5c3RlbXMgU25hcHBlciA5MjYwLzlHMjAgbW9kdWxlIikKIAkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXNhbTkyNjBfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBzbmFwcGVyOTI2MF9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IHNuYXBwZXI5MjYwX2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gc25hcHBlcjkyNjBfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zdGFtcDlnMjAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC1zdGFtcDlnMjAuYwppbmRleCA1ZTVjODU2Li45MzZlNWZkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtc3RhbXA5ZzIwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXN0YW1wOWcyMC5jCkBAIC0zNSw3ICszNSw3IEBACiB2b2lkIF9faW5pdCBzdGFtcDlnMjBfaW5pdF9lYXJseSh2b2lkKQogewogCS8qIEluaXRpYWxpemUgcHJvY2Vzc29yOiAxOC40MzIgTUh6IGNyeXN0YWwgKi8KLQlhdDkxc2FtOTI2MF9pbml0aWFsaXplKDE4NDMyMDAwKTsKKwlhdDkxX2luaXRpYWxpemUoMTg0MzIwMDApOwogCiAJLyogREdCVSBvbiB0dHlTMC4gKFJ4ICYgVHggb25seSkgKi8KIAlhdDkxX3JlZ2lzdGVyX3VhcnQoMCwgMCwgMCk7CkBAIC03NiwxMiArNzYsNiBAQAogCWF0OTFfcmVnaXN0ZXJfdWFydChBVDkxU0FNOTI2MF9JRF9VUzUsIDYsIDApOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9pcnEodm9pZCkKLXsKLQlhdDkxc2FtOTI2MF9pbml0X2ludGVycnVwdHMoTlVMTCk7Ci19Ci0KLQogLyoKICAqIE5BTkQgZmxhc2gKICAqLwpAQCAtMjk5LDE3ICsyOTMsMTcgQEAKIE1BQ0hJTkVfU1RBUlQoUE9SVFVYRzIwLCAidGFza2l0IFBvcnR1eEcyMCIpCiAJLyogTWFpbnRhaW5lcjogdGFza2l0IEdtYkggKi8KIAkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXNhbTkyNjBfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBwb3J0dXhnMjBfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBpbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IHBvcnR1eGcyMF9ib2FyZF9pbml0LAogTUFDSElORV9FTkQKIAogTUFDSElORV9TVEFSVChTVEFNUDlHMjAsICJ0YXNraXQgU3RhbXA5RzIwIikKIAkvKiBNYWludGFpbmVyOiB0YXNraXQgR21iSCAqLwogCS50aW1lcgkJPSAmYXQ5MXNhbTkyNnhfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxc2FtOTI2MF9tYXBfaW8sCisJLm1hcF9pbwkJPSBhdDkxX21hcF9pbywKIAkuaW5pdF9lYXJseQk9IHN0YW1wOWcyMGV2Yl9pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGluaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gc3RhbXA5ZzIwZXZiX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXVzYi1hOTI2MC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXVzYi1hOTI2MC5jCmluZGV4IDBlNzg0ZTYuLjhjNGMxYTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC11c2ItYTkyNjAuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtdXNiLWE5MjYwLmMKQEAgLTUxLDcgKzUxLDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBla19pbml0X2Vhcmx5KHZvaWQpCiB7CiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDEyLjAwMCBNSHogY3J5c3RhbCAqLwotCWF0OTFzYW05MjYwX2luaXRpYWxpemUoMTIwMDAwMDApOworCWF0OTFfaW5pdGlhbGl6ZSgxMjAwMDAwMCk7CiAKIAkvKiBEQkdVIG9uIHR0eVMwLiAoUnggJiBUeCBvbmx5KSAqLwogCWF0OTFfcmVnaXN0ZXJfdWFydCgwLCAwLCAwKTsKQEAgLTYwLDEyICs2MCw2IEBACiAJYXQ5MV9zZXRfc2VyaWFsX2NvbnNvbGUoMCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBla19pbml0X2lycSh2b2lkKQotewotCWF0OTFzYW05MjYwX2luaXRfaW50ZXJydXB0cyhOVUxMKTsKLX0KLQotCiAvKgogICogVVNCIEhvc3QgcG9ydAogICovCkBAIC0yMjksOCArMjIzLDggQEAKIE1BQ0hJTkVfU1RBUlQoVVNCX0E5MjYwLCAiQ0FMQU8gVVNCX0E5MjYwIikKIAkvKiBNYWludGFpbmVyOiBjYWxhby1zeXN0ZW1zICovCiAJLnRpbWVyCQk9ICZhdDkxc2FtOTI2eF90aW1lciwKLQkubWFwX2lvCQk9IGF0OTFzYW05MjYwX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0gZWtfaW5pdF9lYXJseSwKLQkuaW5pdF9pcnEJPSBla19pbml0X2lycSwKKwkuaW5pdF9pcnEJPSBhdDkxX2luaXRfaXJxX2RlZmF1bHQsCiAJLmluaXRfbWFjaGluZQk9IGVrX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXVzYi1hOTI2My5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXVzYi1hOTI2My5jCmluZGV4IGNmNjI2ZGQuLjI1ZTc5MzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC11c2ItYTkyNjMuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQtdXNiLWE5MjYzLmMKQEAgLTUwLDcgKzUwLDcgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBla19pbml0X2Vhcmx5KHZvaWQpCiB7CiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDEyLjAwIE1IeiBjcnlzdGFsICovCi0JYXQ5MXNhbTkyNjNfaW5pdGlhbGl6ZSgxMjAwMDAwMCk7CisJYXQ5MV9pbml0aWFsaXplKDEyMDAwMDAwKTsKIAogCS8qIERCR1Ugb24gdHR5UzAuIChSeCAmIFR4IG9ubHkpICovCiAJYXQ5MV9yZWdpc3Rlcl91YXJ0KDAsIDAsIDApOwpAQCAtNTksMTIgKzU5LDYgQEAKIAlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGVrX2luaXRfaXJxKHZvaWQpCi17Ci0JYXQ5MXNhbTkyNjNfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCi0KIC8qCiAgKiBVU0IgSG9zdCBwb3J0CiAgKi8KQEAgLTI0NSw4ICsyMzksOCBAQAogTUFDSElORV9TVEFSVChVU0JfQTkyNjMsICJDQUxBTyBVU0JfQTkyNjMiKQogCS8qIE1haW50YWluZXI6IGNhbGFvLXN5c3RlbXMgKi8KIAkudGltZXIJCT0gJmF0OTFzYW05MjZ4X3RpbWVyLAotCS5tYXBfaW8JCT0gYXQ5MXNhbTkyNjNfbWFwX2lvLAorCS5tYXBfaW8JCT0gYXQ5MV9tYXBfaW8sCiAJLmluaXRfZWFybHkJPSBla19pbml0X2Vhcmx5LAotCS5pbml0X2lycQk9IGVrX2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0gZWtfYm9hcmRfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQteWwtOTIwMC5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2JvYXJkLXlsLTkyMDAuYwppbmRleCBjMjA4Y2MzLi45NWVkY2JkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYm9hcmQteWwtOTIwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9ib2FyZC15bC05MjAwLmMKQEAgLTU2LDcgKzU2LDcgQEAKIAlhdDkxcm05MjAwX3NldF90eXBlKEFSQ0hfUkVWSVNPTl85MjAwX1BRRlApOwogCiAJLyogSW5pdGlhbGl6ZSBwcm9jZXNzb3I6IDE4LjQzMiBNSHogY3J5c3RhbCAqLwotCWF0OTFybTkyMDBfaW5pdGlhbGl6ZSgxODQzMjAwMCk7CisJYXQ5MV9pbml0aWFsaXplKDE4NDMyMDAwKTsKIAogCS8qIFNldHVwIHRoZSBMRURzIEQyPVBCMTcgKHRpbWVyKSwgRDM9UEIxNiAoY3B1KSAqLwogCWF0OTFfaW5pdF9sZWRzKEFUOTFfUElOX1BCMTYsIEFUOTFfUElOX1BCMTcpOwpAQCAtNzksMTIgKzc5LDYgQEAKIAlhdDkxX3NldF9zZXJpYWxfY29uc29sZSgwKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IHlsOTIwMF9pbml0X2lycSh2b2lkKQotewotCWF0OTFybTkyMDBfaW5pdF9pbnRlcnJ1cHRzKE5VTEwpOwotfQotCi0KIC8qCiAgKiBMRURzCiAgKi8KQEAgLTU5OSw4ICs1OTMsOCBAQAogTUFDSElORV9TVEFSVChZTDkyMDAsICJ1Q2RyYWdvbiBZTC05MjAwIikKIAkvKiBNYWludGFpbmVyOiBTLkJpcnRsZXMgKi8KIAkudGltZXIJCT0gJmF0OTFybTkyMDBfdGltZXIsCi0JLm1hcF9pbwkJPSBhdDkxcm05MjAwX21hcF9pbywKKwkubWFwX2lvCQk9IGF0OTFfbWFwX2lvLAogCS5pbml0X2Vhcmx5CT0geWw5MjAwX2luaXRfZWFybHksCi0JLmluaXRfaXJxCT0geWw5MjAwX2luaXRfaXJxLAorCS5pbml0X2lycQk9IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCwKIAkuaW5pdF9tYWNoaW5lCT0geWw5MjAwX2JvYXJkX2luaXQsCiBNQUNISU5FX0VORApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2dlbmVyaWMuaCBiL2FyY2gvYXJtL21hY2gtYXQ5MS9nZW5lcmljLmgKaW5kZXggOGZmMzQxOC4uOTM4YjM0ZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2dlbmVyaWMuaAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvZ2VuZXJpYy5oCkBAIC0xMSwzNSArMTEsMTkgQEAKICNpbmNsdWRlIDxsaW51eC9jbGtkZXYuaD4KIAogIC8qIE1hcCBpbyAqLwotZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFybTkyMDBfbWFwX2lvKHZvaWQpOwotZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFzYW05MjYwX21hcF9pbyh2b2lkKTsKLWV4dGVybiB2b2lkIF9faW5pdCBhdDkxc2FtOTI2MV9tYXBfaW8odm9pZCk7Ci1leHRlcm4gdm9pZCBfX2luaXQgYXQ5MXNhbTkyNjNfbWFwX2lvKHZvaWQpOwotZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFzYW05cmxfbWFwX2lvKHZvaWQpOwotZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFzYW05ZzQ1X21hcF9pbyh2b2lkKTsKLWV4dGVybiB2b2lkIF9faW5pdCBhdDkxeDQwX21hcF9pbyh2b2lkKTsKLWV4dGVybiB2b2lkIF9faW5pdCBhdDkxY2FwOV9tYXBfaW8odm9pZCk7CitleHRlcm4gdm9pZCBfX2luaXQgYXQ5MV9tYXBfaW8odm9pZCk7CitleHRlcm4gdm9pZCBfX2luaXQgYXQ5MV9pbml0X3NyYW0oaW50IGJhbmssIHVuc2lnbmVkIGxvbmcgYmFzZSwKKwkJCQkgIHVuc2lnbmVkIGludCBsZW5ndGgpOwogCiAgLyogUHJvY2Vzc29ycyAqLwogZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFybTkyMDBfc2V0X3R5cGUoaW50IHR5cGUpOwotZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFybTkyMDBfaW5pdGlhbGl6ZSh1bnNpZ25lZCBsb25nIG1haW5fY2xvY2spOwotZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFzYW05MjYwX2luaXRpYWxpemUodW5zaWduZWQgbG9uZyBtYWluX2Nsb2NrKTsKLWV4dGVybiB2b2lkIF9faW5pdCBhdDkxc2FtOTI2MV9pbml0aWFsaXplKHVuc2lnbmVkIGxvbmcgbWFpbl9jbG9jayk7Ci1leHRlcm4gdm9pZCBfX2luaXQgYXQ5MXNhbTkyNjNfaW5pdGlhbGl6ZSh1bnNpZ25lZCBsb25nIG1haW5fY2xvY2spOwotZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFzYW05cmxfaW5pdGlhbGl6ZSh1bnNpZ25lZCBsb25nIG1haW5fY2xvY2spOwotZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFzYW05ZzQ1X2luaXRpYWxpemUodW5zaWduZWQgbG9uZyBtYWluX2Nsb2NrKTsKK2V4dGVybiB2b2lkIF9faW5pdCBhdDkxX2luaXRpYWxpemUodW5zaWduZWQgbG9uZyBtYWluX2Nsb2NrKTsKIGV4dGVybiB2b2lkIF9faW5pdCBhdDkxeDQwX2luaXRpYWxpemUodW5zaWduZWQgbG9uZyBtYWluX2Nsb2NrKTsKLWV4dGVybiB2b2lkIF9faW5pdCBhdDkxY2FwOV9pbml0aWFsaXplKHVuc2lnbmVkIGxvbmcgbWFpbl9jbG9jayk7CiAKICAvKiBJbnRlcnJ1cHRzICovCi1leHRlcm4gdm9pZCBfX2luaXQgYXQ5MXJtOTIwMF9pbml0X2ludGVycnVwdHModW5zaWduZWQgaW50IHByaW9yaXR5W10pOwotZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFzYW05MjYwX2luaXRfaW50ZXJydXB0cyh1bnNpZ25lZCBpbnQgcHJpb3JpdHlbXSk7Ci1leHRlcm4gdm9pZCBfX2luaXQgYXQ5MXNhbTkyNjFfaW5pdF9pbnRlcnJ1cHRzKHVuc2lnbmVkIGludCBwcmlvcml0eVtdKTsKLWV4dGVybiB2b2lkIF9faW5pdCBhdDkxc2FtOTI2M19pbml0X2ludGVycnVwdHModW5zaWduZWQgaW50IHByaW9yaXR5W10pOwotZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFzYW05cmxfaW5pdF9pbnRlcnJ1cHRzKHVuc2lnbmVkIGludCBwcmlvcml0eVtdKTsKLWV4dGVybiB2b2lkIF9faW5pdCBhdDkxc2FtOWc0NV9pbml0X2ludGVycnVwdHModW5zaWduZWQgaW50IHByaW9yaXR5W10pOworZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFfaW5pdF9pcnFfZGVmYXVsdCh2b2lkKTsKK2V4dGVybiB2b2lkIF9faW5pdCBhdDkxX2luaXRfaW50ZXJydXB0cyh1bnNpZ25lZCBpbnQgcHJpb3JpdHlbXSk7CiBleHRlcm4gdm9pZCBfX2luaXQgYXQ5MXg0MF9pbml0X2ludGVycnVwdHModW5zaWduZWQgaW50IHByaW9yaXR5W10pOwotZXh0ZXJuIHZvaWQgX19pbml0IGF0OTFjYXA5X2luaXRfaW50ZXJydXB0cyh1bnNpZ25lZCBpbnQgcHJpb3JpdHlbXSk7CiBleHRlcm4gdm9pZCBfX2luaXQgYXQ5MV9haWNfaW5pdCh1bnNpZ25lZCBpbnQgcHJpb3JpdHlbXSk7CiAKICAvKiBUaW1lciAqLwpAQCAtNDksNyArMzMsNiBAQAogZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgYXQ5MXg0MF90aW1lcjsKIAogIC8qIENsb2NrcyAqLwotZXh0ZXJuIGludCBfX2luaXQgYXQ5MV9jbG9ja19pbml0KHVuc2lnbmVkIGxvbmcgbWFpbl9jbG9jayk7CiAvKgogICogZnVuY3Rpb24gdG8gc3BlY2lmeSB0aGUgY2xvY2sgb2YgdGhlIGRlZmF1bHQgY29uc29sZS4gQXMgd2UgZG8gbm90CiAgKiB1c2UgdGhlIGRldmljZS9kcml2ZXIgYnVzLCB0aGUgZGV2X25hbWUgaXMgbm90IGludGlhbGl6ZS4gU28gd2UgbmVlZApAQCAtNjIsNiArNDUsMTEgQEAKIGV4dGVybiB2b2lkIF9faW5pdCBhdDkxc2FtOXJsX3NldF9jb25zb2xlX2Nsb2NrKGludCBpZCk7CiBleHRlcm4gdm9pZCBfX2luaXQgYXQ5MXNhbTlnNDVfc2V0X2NvbnNvbGVfY2xvY2soaW50IGlkKTsKIGV4dGVybiB2b2lkIF9faW5pdCBhdDkxY2FwOV9zZXRfY29uc29sZV9jbG9jayhpbnQgaWQpOworI2lmZGVmIENPTkZJR19BVDkxX1BNQ19VTklUCitleHRlcm4gaW50IF9faW5pdCBhdDkxX2Nsb2NrX2luaXQodW5zaWduZWQgbG9uZyBtYWluX2Nsb2NrKTsKKyNlbHNlCitzdGF0aWMgaW50IGlubGluZSBhdDkxX2Nsb2NrX2luaXQodW5zaWduZWQgbG9uZyBtYWluX2Nsb2NrKSB7IHJldHVybiAwOyB9CisjZW5kaWYKIHN0cnVjdCBkZXZpY2U7CiAKICAvKiBQb3dlciBNYW5hZ2VtZW50ICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFfZGJndS5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxX2RiZ3UuaAppbmRleCA2ZGNhYTc3Li5kYmZlNDU1YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxX2RiZ3UuaAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFfZGJndS5oCkBAIC0xNiwyMiArMTYsMjUgQEAKICNpZm5kZWYgQVQ5MV9EQkdVX0gKICNkZWZpbmUgQVQ5MV9EQkdVX0gKIAorI2RlZmluZSBkYmd1X3JlYWRsKGRiZ3UsIGZpZWxkKSBcCisJX19yYXdfcmVhZGwoQVQ5MV9WQV9CQVNFX1NZUyArIGRiZ3UgKyBBVDkxX0RCR1VfICMjIGZpZWxkKQorCiAjaWZkZWYgQVQ5MV9EQkdVCi0jZGVmaW5lIEFUOTFfREJHVV9DUgkJKEFUOTFfREJHVSArIDB4MDApCS8qIENvbnRyb2wgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVQ5MV9EQkdVX01SCQkoQVQ5MV9EQkdVICsgMHgwNCkJLyogTW9kZSBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxX0RCR1VfSUVSCQkoQVQ5MV9EQkdVICsgMHgwOCkJLyogSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0RCR1VfQ1IJCSgweDAwKQkvKiBDb250cm9sIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfREJHVV9NUgkJKDB4MDQpCS8qIE1vZGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9EQkdVX0lFUgkJKDB4MDgpCS8qIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KICNkZWZpbmUJCUFUOTFfREJHVV9UWFJEWQkJKDEgPDwgMSkJCS8qIFRyYW5zbWl0dGVyIFJlYWR5ICovCiAjZGVmaW5lCQlBVDkxX0RCR1VfVFhFTVBUWQkoMSA8PCA5KQkJLyogVHJhbnNtaXR0ZXIgRW1wdHkgKi8KLSNkZWZpbmUgQVQ5MV9EQkdVX0lEUgkJKEFUOTFfREJHVSArIDB4MGMpCS8qIEludGVycnVwdCBEaXNhYmxlIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUOTFfREJHVV9JTVIJCShBVDkxX0RCR1UgKyAweDEwKQkvKiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxX0RCR1VfU1IJCShBVDkxX0RCR1UgKyAweDE0KQkvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVQ5MV9EQkdVX1JIUgkJKEFUOTFfREJHVSArIDB4MTgpCS8qIFJlY2VpdmVyIEhvbGRpbmcgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVQ5MV9EQkdVX1RIUgkJKEFUOTFfREJHVSArIDB4MWMpCS8qIFRyYW5zbWl0dGVyIEhvbGRpbmcgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgQVQ5MV9EQkdVX0JSR1IJCShBVDkxX0RCR1UgKyAweDIwKQkvKiBCYXVkIFJhdGUgR2VuZXJhdG9yIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfREJHVV9JRFIJCSgweDBjKQkvKiBJbnRlcnJ1cHQgRGlzYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0RCR1VfSU1SCQkoMHgxMCkJLyogSW50ZXJydXB0IE1hc2sgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9EQkdVX1NSCQkoMHgxNCkJLyogU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfREJHVV9SSFIJCSgweDE4KQkvKiBSZWNlaXZlciBIb2xkaW5nIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfREJHVV9USFIJCSgweDFjKQkvKiBUcmFuc21pdHRlciBIb2xkaW5nIFJlZ2lzdGVyICovCisjZGVmaW5lIEFUOTFfREJHVV9CUkdSCQkoMHgyMCkJLyogQmF1ZCBSYXRlIEdlbmVyYXRvciBSZWdpc3RlciAqLwogCi0jZGVmaW5lIEFUOTFfREJHVV9DSURSCQkoQVQ5MV9EQkdVICsgMHg0MCkJLyogQ2hpcCBJRCBSZWdpc3RlciAqLwotI2RlZmluZSBBVDkxX0RCR1VfRVhJRAkJKEFUOTFfREJHVSArIDB4NDQpCS8qIENoaXAgSUQgRXh0ZW5zaW9uIFJlZ2lzdGVyICovCi0jZGVmaW5lIEFUOTFfREJHVV9GTlIJCShBVDkxX0RCR1UgKyAweDQ4KQkvKiBGb3JjZSBOVFJTVCBSZWdpc3RlciBbU0FNOSBvbmx5XSAqLworI2RlZmluZSBBVDkxX0RCR1VfQ0lEUgkJKDB4NDApCS8qIENoaXAgSUQgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVQ5MV9EQkdVX0VYSUQJCSgweDQ0KQkvKiBDaGlwIElEIEV4dGVuc2lvbiBSZWdpc3RlciAqLworI2RlZmluZSBBVDkxX0RCR1VfRk5SCQkoMHg0OCkJLyogRm9yY2UgTlRSU1QgUmVnaXN0ZXIgW1NBTTkgb25seV0gKi8KICNkZWZpbmUJCUFUOTFfREJHVV9GTlRSU1QJKDEgPDwgMCkJCS8qIEZvcmNlIE5UUlNUICovCiAKICNlbmRpZiAvKiBBVDkxX0RCR1UgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MWNhcDkuaCBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MWNhcDkuaAppbmRleCA2NjU5OTM4Li5jNWRmMWU4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFjYXA5LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxY2FwOS5oCkBAIC03NSw3ICs3NSw2IEBACiAjZGVmaW5lIEFUOTFDQVA5X0JBU0VfRU1BQwkJMHhmZmZiYzAwMAogI2RlZmluZSBBVDkxQ0FQOV9CQVNFX0FEQwkJMHhmZmZjMDAwMAogI2RlZmluZSBBVDkxQ0FQOV9CQVNFX0lTSQkJMHhmZmZjNDAwMAotI2RlZmluZSBBVDkxX0JBU0VfU1lTCQkJMHhmZmZmZTIwMAogCiAvKgogICogU3lzdGVtIFBlcmlwaGVyYWxzIChvZmZzZXQgZnJvbSBBVDkxX0JBU0VfU1lTKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxcm05MjAwLmggYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFybTkyMDAuaAppbmRleCA5OWUwZjhkLi5lNDAzN2I1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFybTkyMDAuaAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFybTkyMDAuaApAQCAtNzQsNyArNzQsNiBAQAogI2RlZmluZSBBVDkxUk05MjAwX0JBU0VfU1NDMQkweGZmZmQ0MDAwCiAjZGVmaW5lIEFUOTFSTTkyMDBfQkFTRV9TU0MyCTB4ZmZmZDgwMDAKICNkZWZpbmUgQVQ5MVJNOTIwMF9CQVNFX1NQSQkweGZmZmUwMDAwCi0jZGVmaW5lIEFUOTFfQkFTRV9TWVMJCTB4ZmZmZmYwMDAKIAogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOTI2MC5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOTI2MC5oCmluZGV4IDhiNmJmODMuLjlhNzkxMTYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTkyNjAuaAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05MjYwLmgKQEAgLTc2LDcgKzc2LDYgQEAKICNkZWZpbmUgQVQ5MVNBTTkyNjBfQkFTRV9UQzQJCTB4ZmZmZGMwNDAKICNkZWZpbmUgQVQ5MVNBTTkyNjBfQkFTRV9UQzUJCTB4ZmZmZGMwODAKICNkZWZpbmUgQVQ5MVNBTTkyNjBfQkFTRV9BREMJCTB4ZmZmZTAwMDAKLSNkZWZpbmUgQVQ5MV9CQVNFX1NZUwkJCTB4ZmZmZmU4MDAKIAogLyoKICAqIFN5c3RlbSBQZXJpcGhlcmFscyAob2Zmc2V0IGZyb20gQVQ5MV9CQVNFX1NZUykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTkyNjEuaCBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTkyNjEuaAppbmRleCBlYWZiZGRhLi5jZTU5NjIwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05MjYxLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOTI2MS5oCkBAIC02MCw3ICs2MCw2IEBACiAjZGVmaW5lIEFUOTFTQU05MjYxX0JBU0VfU1NDMgkJMHhmZmZjNDAwMAogI2RlZmluZSBBVDkxU0FNOTI2MV9CQVNFX1NQSTAJCTB4ZmZmYzgwMDAKICNkZWZpbmUgQVQ5MVNBTTkyNjFfQkFTRV9TUEkxCQkweGZmZmNjMDAwCi0jZGVmaW5lIEFUOTFfQkFTRV9TWVMJCQkweGZmZmZlYTAwCiAKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTkyNjMuaCBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTkyNjMuaAppbmRleCBlMmQzNDgyLi5mMWI5Mjk2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05MjYzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOTI2My5oCkBAIC03MCw3ICs3MCw2IEBACiAjZGVmaW5lIEFUOTFTQU05MjYzX0JBU0VfRU1BQwkJMHhmZmZiYzAwMAogI2RlZmluZSBBVDkxU0FNOTI2M19CQVNFX0lTSQkJMHhmZmZjNDAwMAogI2RlZmluZSBBVDkxU0FNOTI2M19CQVNFXzJER0UJCTB4ZmZmYzgwMDAKLSNkZWZpbmUgQVQ5MV9CQVNFX1NZUwkJCTB4ZmZmZmUwMDAKIAogLyoKICAqIFN5c3RlbSBQZXJpcGhlcmFscyAob2Zmc2V0IGZyb20gQVQ5MV9CQVNFX1NZUykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTlnNDUuaCBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTlnNDUuaAppbmRleCA2NTkzMDRhLi4yYzYxMWI5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05ZzQ1LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxc2FtOWc0NS5oCkBAIC04Miw3ICs4Miw2IEBACiAjZGVmaW5lIEFUOTFTQU05RzQ1X0JBU0VfVEMzCQkweGZmZmQ0MDAwCiAjZGVmaW5lIEFUOTFTQU05RzQ1X0JBU0VfVEM0CQkweGZmZmQ0MDQwCiAjZGVmaW5lIEFUOTFTQU05RzQ1X0JBU0VfVEM1CQkweGZmZmQ0MDgwCi0jZGVmaW5lIEFUOTFfQkFTRV9TWVMJCQkweGZmZmZlMjAwCiAKIC8qCiAgKiBTeXN0ZW0gUGVyaXBoZXJhbHMgKG9mZnNldCBmcm9tIEFUOTFfQkFTRV9TWVMpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2F0OTFzYW05cmwuaCBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTlybC5oCmluZGV4IDQxZGJiZTYuLjFhYWJhY2QgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTlybC5oCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MXNhbTlybC5oCkBAIC02NCw3ICs2NCw2IEBACiAjZGVmaW5lIEFUOTFTQU05UkxfQkFTRV9UU0MJMHhmZmZkMDAwMAogI2RlZmluZSBBVDkxU0FNOVJMX0JBU0VfVURQSFMJMHhmZmZkNDAwMAogI2RlZmluZSBBVDkxU0FNOVJMX0JBU0VfQUM5N0MJMHhmZmZkODAwMAotI2RlZmluZSBBVDkxX0JBU0VfU1lTCQkweGZmZmZjMDAwCiAKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvY3B1LmggYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2NwdS5oCmluZGV4IGRmOTY2YzIuLmY2Y2U5MzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvY3B1LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9jcHUuaApAQCAtMSw3ICsxLDggQEAKIC8qCiAgKiBhcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2NwdS5oCiAgKgotICogIENvcHlyaWdodCAoQykgMjAwNiBTQU4gUGVvcGxlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU0FOIFBlb3BsZQorICogQ29weXJpZ2h0IChDKSAyMDExIEplYW4tQ2hyaXN0b3BoZSBQTEFHTklPTC1WSUxMQVJEIDxwbGFnbmlvakBqY3Jvc29mdC5jb20+CiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0xMCwxMiArMTEsOCBAQAogICoKICAqLwogCi0jaWZuZGVmIF9fQVNNX0FSQ0hfQ1BVX0gKLSNkZWZpbmUgX19BU01fQVJDSF9DUFVfSAotCi0jaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPG1hY2gvYXQ5MV9kYmd1Lmg+Ci0KKyNpZm5kZWYgX19NQUNIX0NQVV9IX18KKyNkZWZpbmUgX19NQUNIX0NQVV9IX18KIAogI2RlZmluZSBBUkNIX0lEX0FUOTFSTTkyMDAJMHgwOTI5MDc4MAogI2RlZmluZSBBUkNIX0lEX0FUOTFTQU05MjYwCTB4MDE5ODAzYTAKQEAgLTM5LDE2ICszNiw2IEBACiAjZGVmaW5lIEFSQ0hfSURfQVQ5MU00MDgwNwkweDE0MDgwNzQ1CiAjZGVmaW5lIEFSQ0hfSURfQVQ5MVI0MDAwOAkweDQ0MDAwODQwCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBhdDkxX2NwdV9pZGVudGlmeSh2b2lkKQotewotCXJldHVybiAoYXQ5MV9zeXNfcmVhZChBVDkxX0RCR1VfQ0lEUikgJiB+QVQ5MV9DSURSX1ZFUlNJT04pOwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYXQ5MV9jcHVfZnVsbHlfaWRlbnRpZnkodm9pZCkKLXsKLQlyZXR1cm4gYXQ5MV9zeXNfcmVhZChBVDkxX0RCR1VfQ0lEUik7Ci19Ci0KICNkZWZpbmUgQVJDSF9FWElEX0FUOTFTQU05TTExCTB4MDAwMDAwMDEKICNkZWZpbmUgQVJDSF9FWElEX0FUOTFTQU05TTEwCTB4MDAwMDAwMDIKICNkZWZpbmUgQVJDSF9FWElEX0FUOTFTQU05RzQ2CTB4MDAwMDAwMDMKQEAgLTYwLDQwICs0Nyw4MCBAQAogI2RlZmluZSBBUkNIX0VYSURfQVQ5MVNBTTlHMjUJMHgwMDAwMDAwMwogI2RlZmluZSBBUkNIX0VYSURfQVQ5MVNBTTlYMjUJMHgwMDAwMDAwNAogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYXQ5MV9leGlkX2lkZW50aWZ5KHZvaWQpCi17Ci0JcmV0dXJuIGF0OTFfc3lzX3JlYWQoQVQ5MV9EQkdVX0VYSUQpOwotfQotCi0KICNkZWZpbmUgQVJDSF9GQU1JTFlfQVQ5MVg5MgkweDA5MjAwMDAwCiAjZGVmaW5lIEFSQ0hfRkFNSUxZX0FUOTFTQU05CTB4MDE5MDAwMDAKICNkZWZpbmUgQVJDSF9GQU1JTFlfQVQ5MVNBTTlYRQkweDAyOTAwMDAwCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBhdDkxX2FyY2hfaWRlbnRpZnkodm9pZCkKLXsKLQlyZXR1cm4gKGF0OTFfc3lzX3JlYWQoQVQ5MV9EQkdVX0NJRFIpICYgQVQ5MV9DSURSX0FSQ0gpOwotfQotCi0jaWZkZWYgQ09ORklHX0FSQ0hfQVQ5MUNBUDkKLSNpbmNsdWRlIDxtYWNoL2F0OTFfcG1jLmg+Ci0KKy8qIFBNQyByZXZpc2lvbiAqLwogI2RlZmluZSBBUkNIX1JFVklTSU9OX0NBUDlfQgkweDM5OQogI2RlZmluZSBBUkNIX1JFVklTSU9OX0NBUDlfQwkweDYwMQogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgYXQ5MWNhcDlfcmV2X2lkZW50aWZ5KHZvaWQpCi17Ci0JcmV0dXJuIChhdDkxX3N5c19yZWFkKEFUOTFfUE1DX1ZFUikpOwotfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfQVJDSF9BVDkxUk05MjAwCi1leHRlcm4gaW50IHJtOTIwMF90eXBlOworLyogUk05MjAwIHR5cGUgKi8KICNkZWZpbmUgQVJDSF9SRVZJU09OXzkyMDBfQkdBCSgwIDw8IDApCiAjZGVmaW5lIEFSQ0hfUkVWSVNPTl85MjAwX1BRRlAJKDEgPDwgMCkKLSNkZWZpbmUgY3B1X2lzX2F0OTFybTkyMDAoKQkoYXQ5MV9jcHVfaWRlbnRpZnkoKSA9PSBBUkNIX0lEX0FUOTFSTTkyMDApCi0jZGVmaW5lIGNwdV9pc19hdDkxcm05MjAwX2JnYSgpCSghY3B1X2lzX2F0OTFybTkyMDBfcHFmcCgpKQotI2RlZmluZSBjcHVfaXNfYXQ5MXJtOTIwMF9wcWZwKCkgKGNwdV9pc19hdDkxcm05MjAwKCkgJiYgcm05MjAwX3R5cGUgJiBBUkNIX1JFVklTT05fOTIwMF9QUUZQKQorCitlbnVtIGF0OTFfc29jX3R5cGUgeworCS8qIDkyMFQgKi8KKwlBVDkxX1NPQ19STTkyMDAsCisKKwkvKiBDQVAgKi8KKwlBVDkxX1NPQ19DQVA5LAorCisJLyogU0FNOTJ4eCAqLworCUFUOTFfU09DX1NBTTkyNjAsIEFUOTFfU09DX1NBTTkyNjEsIEFUOTFfU09DX1NBTTkyNjMsCisKKwkvKiBTQU05R3h4ICovCisJQVQ5MV9TT0NfU0FNOUcxMCwgQVQ5MV9TT0NfU0FNOUcyMCwgQVQ5MV9TT0NfU0FNOUc0NSwKKworCS8qIFNBTTlSTCAqLworCUFUOTFfU09DX1NBTTlSTCwKKworCS8qIFNBTTlYNSAqLworCUFUOTFfU09DX1NBTTlYNSwKKworCS8qIFVua25vd24gdHlwZSAqLworCUFUOTFfU09DX05PTkUKK307CisKK2VudW0gYXQ5MV9zb2Nfc3VidHlwZSB7CisJLyogUk05MjAwICovCisJQVQ5MV9TT0NfUk05MjAwX0JHQSwgQVQ5MV9TT0NfUk05MjAwX1BRRlAsCisKKwkvKiBDQVA5ICovCisJQVQ5MV9TT0NfQ0FQOV9SRVZfQiwgQVQ5MV9TT0NfQ0FQOV9SRVZfQywKKworCS8qIFNBTTkyNjAgKi8KKwlBVDkxX1NPQ19TQU05WEUsCisKKwkvKiBTQU05RzQ1ICovCisJQVQ5MV9TT0NfU0FNOUc0NUVTLCBBVDkxX1NPQ19TQU05TTEwLCBBVDkxX1NPQ19TQU05RzQ2LCBBVDkxX1NPQ19TQU05TTExLAorCisJLyogU0FNOVg1ICovCisJQVQ5MV9TT0NfU0FNOUcxNSwgQVQ5MV9TT0NfU0FNOUczNSwgQVQ5MV9TT0NfU0FNOVgzNSwKKwlBVDkxX1NPQ19TQU05RzI1LCBBVDkxX1NPQ19TQU05WDI1LAorCisJLyogVW5rbm93biBzdWJ0eXBlICovCisJQVQ5MV9TT0NfU1VCVFlQRV9OT05FCit9OworCitzdHJ1Y3QgYXQ5MV9zb2NpbmZvIHsKKwl1bnNpZ25lZCBpbnQgdHlwZSwgc3VidHlwZTsKKwl1bnNpZ25lZCBpbnQgY2lkciwgZXhpZDsKK307CisKK2V4dGVybiBzdHJ1Y3QgYXQ5MV9zb2NpbmZvIGF0OTFfc29jX2luaXRkYXRhOworY29uc3QgY2hhciAqYXQ5MV9nZXRfc29jX3R5cGUoc3RydWN0IGF0OTFfc29jaW5mbyAqYyk7Citjb25zdCBjaGFyICphdDkxX2dldF9zb2Nfc3VidHlwZShzdHJ1Y3QgYXQ5MV9zb2NpbmZvICpjKTsKKworc3RhdGljIGlubGluZSBpbnQgYXQ5MV9zb2NfaXNfZGV0ZWN0ZWQodm9pZCkKK3sKKwlyZXR1cm4gYXQ5MV9zb2NfaW5pdGRhdGEudHlwZSAhPSBBVDkxX1NPQ19OT05FOworfQorCisjaWZkZWYgQ09ORklHX0FSQ0hfQVQ5MVJNOTIwMAorI2RlZmluZSBjcHVfaXNfYXQ5MXJtOTIwMCgpCShhdDkxX3NvY19pbml0ZGF0YS50eXBlID09IEFUOTFfU09DX1JNOTIwMCkKKyNkZWZpbmUgY3B1X2lzX2F0OTFybTkyMDBfYmdhKCkJKGF0OTFfc29jX2luaXRkYXRhLnN1YnR5cGUgPT0gQVQ5MV9TT0NfUk05MjAwX0JHQSkKKyNkZWZpbmUgY3B1X2lzX2F0OTFybTkyMDBfcHFmcCgpIChhdDkxX3NvY19pbml0ZGF0YS5zdWJ0eXBlID09IEFUOTFfU09DX1JNOTIwMF9QUUZQKQogI2Vsc2UKICNkZWZpbmUgY3B1X2lzX2F0OTFybTkyMDAoKQkoMCkKICNkZWZpbmUgY3B1X2lzX2F0OTFybTkyMDBfYmdhKCkJKDApCkBAIC0xMDEsNTIgKzEyOCw0OSBAQAogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQVJDSF9BVDkxU0FNOTI2MAotI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTl4ZSgpCShhdDkxX2FyY2hfaWRlbnRpZnkoKSA9PSBBUkNIX0ZBTUlMWV9BVDkxU0FNOVhFKQotI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTkyNjAoKQkoKGF0OTFfY3B1X2lkZW50aWZ5KCkgPT0gQVJDSF9JRF9BVDkxU0FNOTI2MCkgfHwgY3B1X2lzX2F0OTFzYW05eGUoKSkKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05eGUoKQkoYXQ5MV9zb2NfaW5pdGRhdGEuc3VidHlwZSA9PSBBVDkxX1NPQ19TQU05WEUpCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOTI2MCgpCShhdDkxX3NvY19pbml0ZGF0YS50eXBlID09IEFUOTFfU09DX1NBTTkyNjApCiAjZWxzZQogI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTl4ZSgpCSgwKQogI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTkyNjAoKQkoMCkKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FSQ0hfQVQ5MVNBTTlHMjAKLSNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzIwKCkJKGF0OTFfY3B1X2lkZW50aWZ5KCkgPT0gQVJDSF9JRF9BVDkxU0FNOUcyMCkKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzIwKCkJKGF0OTFfc29jX2luaXRkYXRhLnR5cGUgPT0gQVQ5MV9TT0NfU0FNOUcyMCkKICNlbHNlCiAjZGVmaW5lIGNwdV9pc19hdDkxc2FtOWcyMCgpCSgwKQogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfQVJDSF9BVDkxU0FNOTI2MQotI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTkyNjEoKQkoYXQ5MV9jcHVfaWRlbnRpZnkoKSA9PSBBUkNIX0lEX0FUOTFTQU05MjYxKQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTkyNjEoKQkoYXQ5MV9zb2NfaW5pdGRhdGEudHlwZSA9PSBBVDkxX1NPQ19TQU05MjYxKQogI2Vsc2UKICNkZWZpbmUgY3B1X2lzX2F0OTFzYW05MjYxKCkJKDApCiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19BUkNIX0FUOTFTQU05RzEwCi0jZGVmaW5lIGNwdV9pc19hdDkxc2FtOWcxMCgpCSgoYXQ5MV9jcHVfaWRlbnRpZnkoKSAmIH5BVDkxX0NJRFJfRVhUKQk9PSBBUkNIX0lEX0FUOTFTQU05RzEwKQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnMTAoKQkoYXQ5MV9zb2NfaW5pdGRhdGEudHlwZSA9PSBBVDkxX1NPQ19TQU05RzEwKQogI2Vsc2UKICNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzEwKCkJKDApCiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19BUkNIX0FUOTFTQU05MjYzCi0jZGVmaW5lIGNwdV9pc19hdDkxc2FtOTI2MygpCShhdDkxX2NwdV9pZGVudGlmeSgpID09IEFSQ0hfSURfQVQ5MVNBTTkyNjMpCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOTI2MygpCShhdDkxX3NvY19pbml0ZGF0YS50eXBlID09IEFUOTFfU09DX1NBTTkyNjMpCiAjZWxzZQogI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTkyNjMoKQkoMCkKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FSQ0hfQVQ5MVNBTTlSTAotI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlybCgpCShhdDkxX2NwdV9pZGVudGlmeSgpID09IEFSQ0hfSURfQVQ5MVNBTTlSTDY0KQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlybCgpCShhdDkxX3NvY19pbml0ZGF0YS50eXBlID09IEFUOTFfU09DX1NBTTlSTCkKICNlbHNlCiAjZGVmaW5lIGNwdV9pc19hdDkxc2FtOXJsKCkJKDApCiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19BUkNIX0FUOTFTQU05RzQ1Ci0jZGVmaW5lIGNwdV9pc19hdDkxc2FtOWc0NSgpCShhdDkxX2NwdV9pZGVudGlmeSgpID09IEFSQ0hfSURfQVQ5MVNBTTlHNDUpCi0jZGVmaW5lIGNwdV9pc19hdDkxc2FtOWc0NWVzKCkJKGF0OTFfY3B1X2Z1bGx5X2lkZW50aWZ5KCkgPT0gQVJDSF9JRF9BVDkxU0FNOUc0NUVTKQotI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTltMTAoKSAgICAoY3B1X2lzX2F0OTFzYW05ZzQ1KCkgJiYgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXQ5MV9leGlkX2lkZW50aWZ5KCkgPT0gQVJDSF9FWElEX0FUOTFTQU05TTEwKSkKLSNkZWZpbmUgY3B1X2lzX2F0OTFzYW05bTQ2KCkgICAgKGNwdV9pc19hdDkxc2FtOWc0NSgpICYmIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF0OTFfZXhpZF9pZGVudGlmeSgpID09IEFSQ0hfRVhJRF9BVDkxU0FNOUc0NikpCi0jZGVmaW5lIGNwdV9pc19hdDkxc2FtOW0xMSgpICAgIChjcHVfaXNfYXQ5MXNhbTlnNDUoKSAmJiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdDkxX2V4aWRfaWRlbnRpZnkoKSA9PSBBUkNIX0VYSURfQVQ5MVNBTTlNMTEpKQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnNDUoKQkoYXQ5MV9zb2NfaW5pdGRhdGEudHlwZSA9PSBBVDkxX1NPQ19TQU05RzQ1KQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnNDVlcygpCShhdDkxX3NvY19pbml0ZGF0YS5zdWJ0eXBlID09IEFUOTFfU09DX1NBTTlHNDVFUykKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05bTEwKCkJKGF0OTFfc29jX2luaXRkYXRhLnN1YnR5cGUgPT0gQVQ5MV9TT0NfU0FNOU0xMCkKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzQ2KCkJKGF0OTFfc29jX2luaXRkYXRhLnN1YnR5cGUgPT0gQVQ5MV9TT0NfU0FNOUc0NikKKyNkZWZpbmUgY3B1X2lzX2F0OTFzYW05bTExKCkJKGF0OTFfc29jX2luaXRkYXRhLnN1YnR5cGUgPT0gQVQ5MV9TT0NfU0FNOU0xMSkKICNlbHNlCiAjZGVmaW5lIGNwdV9pc19hdDkxc2FtOWc0NSgpCSgwKQogI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnNDVlcygpCSgwKQpAQCAtMTU2LDE3ICsxODAsMTIgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FSQ0hfQVQ5MVNBTTlYNQotI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTl4NSgpCShhdDkxX2NwdV9pZGVudGlmeSgpID09IEFSQ0hfSURfQVQ5MVNBTTlYNSkKLSNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzE1KCkJKGNwdV9pc19hdDkxc2FtOXg1KCkgJiYgXAotCQkJCShhdDkxX2V4aWRfaWRlbnRpZnkoKSA9PSBBUkNIX0VYSURfQVQ5MVNBTTlHMTUpKQotI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnMzUoKQkoY3B1X2lzX2F0OTFzYW05eDUoKSAmJiBcCi0JCQkJKGF0OTFfZXhpZF9pZGVudGlmeSgpID09IEFSQ0hfRVhJRF9BVDkxU0FNOUczNSkpCi0jZGVmaW5lIGNwdV9pc19hdDkxc2FtOXgzNSgpCShjcHVfaXNfYXQ5MXNhbTl4NSgpICYmIFwKLQkJCQkoYXQ5MV9leGlkX2lkZW50aWZ5KCkgPT0gQVJDSF9FWElEX0FUOTFTQU05WDM1KSkKLSNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzI1KCkJKGNwdV9pc19hdDkxc2FtOXg1KCkgJiYgXAotCQkJCShhdDkxX2V4aWRfaWRlbnRpZnkoKSA9PSBBUkNIX0VYSURfQVQ5MVNBTTlHMjUpKQotI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTl4MjUoKQkoY3B1X2lzX2F0OTFzYW05eDUoKSAmJiBcCi0JCQkJKGF0OTFfZXhpZF9pZGVudGlmeSgpID09IEFSQ0hfRVhJRF9BVDkxU0FNOVgyNSkpCisjZGVmaW5lIGNwdV9pc19hdDkxc2FtOXg1KCkJKGF0OTFfc29jX2luaXRkYXRhLnR5cGUgPT0gQVQ5MV9TT0NfU0FNOVg1KQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnMTUoKQkoYXQ5MV9zb2NfaW5pdGRhdGEuc3VidHlwZSA9PSBBVDkxX1NPQ19TQU05RzE1KQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnMzUoKQkoYXQ5MV9zb2NfaW5pdGRhdGEuc3VidHlwZSA9PSBBVDkxX1NPQ19TQU05RzM1KQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTl4MzUoKQkoYXQ5MV9zb2NfaW5pdGRhdGEuc3VidHlwZSA9PSBBVDkxX1NPQ19TQU05WDM1KQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTlnMjUoKQkoYXQ5MV9zb2NfaW5pdGRhdGEuc3VidHlwZSA9PSBBVDkxX1NPQ19TQU05RzI1KQorI2RlZmluZSBjcHVfaXNfYXQ5MXNhbTl4MjUoKQkoYXQ5MV9zb2NfaW5pdGRhdGEuc3VidHlwZSA9PSBBVDkxX1NPQ19TQU05WDI1KQogI2Vsc2UKICNkZWZpbmUgY3B1X2lzX2F0OTFzYW05eDUoKQkoMCkKICNkZWZpbmUgY3B1X2lzX2F0OTFzYW05ZzE1KCkJKDApCkBAIC0xNzcsOSArMTk2LDkgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FSQ0hfQVQ5MUNBUDkKLSNkZWZpbmUgY3B1X2lzX2F0OTFjYXA5KCkJKGF0OTFfY3B1X2lkZW50aWZ5KCkgPT0gQVJDSF9JRF9BVDkxQ0FQOSkKLSNkZWZpbmUgY3B1X2lzX2F0OTFjYXA5X3JldkIoKQkoYXQ5MWNhcDlfcmV2X2lkZW50aWZ5KCkgPT0gQVJDSF9SRVZJU0lPTl9DQVA5X0IpCi0jZGVmaW5lIGNwdV9pc19hdDkxY2FwOV9yZXZDKCkJKGF0OTFjYXA5X3Jldl9pZGVudGlmeSgpID09IEFSQ0hfUkVWSVNJT05fQ0FQOV9DKQorI2RlZmluZSBjcHVfaXNfYXQ5MWNhcDkoKQkoYXQ5MV9zb2NfaW5pdGRhdGEudHlwZSA9PSBBVDkxX1NPQ19DQVA5KQorI2RlZmluZSBjcHVfaXNfYXQ5MWNhcDlfcmV2QigpCShhdDkxX3NvY19pbml0ZGF0YS5zdWJ0eXBlID09IEFUOTFfU09DX0NBUDlfUkVWX0IpCisjZGVmaW5lIGNwdV9pc19hdDkxY2FwOV9yZXZDKCkJKGF0OTFfc29jX2luaXRkYXRhLnN1YnR5cGUgPT0gQVQ5MV9TT0NfQ0FQOV9SRVZfQykKICNlbHNlCiAjZGVmaW5lIGNwdV9pc19hdDkxY2FwOSgpCSgwKQogI2RlZmluZSBjcHVfaXNfYXQ5MWNhcDlfcmV2QigpCSgwKQpAQCAtMTkyLDQgKzIxMSw0IEBACiAgKi8KICNkZWZpbmUgY3B1X2lzX2F0MzJhcDcwMDAoKQkoMCkKIAotI2VuZGlmCisjZW5kaWYgLyogX19NQUNIX0NQVV9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvZGVidWctbWFjcm8uUwppbmRleCAwZjk1OWZhLi5iYzFlMGIyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2RlYnVnLW1hY3JvLlMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9kZWJ1Zy1tYWNyby5TCkBAIC0xNSwyMyArMTUsMjMgQEAKICNpbmNsdWRlIDxtYWNoL2F0OTFfZGJndS5oPgogCiAJLm1hY3JvCWFkZHJ1YXJ0LCBycCwgcnYKLQlsZHIJXHJwLCA9KEFUOTFfQkFTRV9TWVMgKyBBVDkxX0RCR1UpCQlAIFN5c3RlbSBwZXJpcGhlcmFscyAocGh5cyBhZGRyZXNzKQotCWxkcglccnYsID0oQVQ5MV9WQV9CQVNFX1NZUwkrIEFUOTFfREJHVSkJCUAgU3lzdGVtIHBlcmlwaGVyYWxzICh2aXJ0IGFkZHJlc3MpCisJbGRyCVxycCwgPShBVDkxX0JBU0VfU1lTICsgQVQ5MV9EQkdVKQlAIFN5c3RlbSBwZXJpcGhlcmFscyAocGh5cyBhZGRyZXNzKQorCWxkcglccnYsID0oQVQ5MV9WQV9CQVNFX1NZUwkrIEFUOTFfREJHVSkJQCBTeXN0ZW0gcGVyaXBoZXJhbHMgKHZpcnQgYWRkcmVzcykKIAkuZW5kbQogCiAJLm1hY3JvCXNlbmR1YXJ0LHJkLHJ4Ci0Jc3RyYglccmQsIFtccngsICMoQVQ5MV9EQkdVX1RIUiAtIEFUOTFfREJHVSldCUAgV3JpdGUgdG8gVHJhbnNtaXR0ZXIgSG9sZGluZyBSZWdpc3RlcgorCXN0cmIJXHJkLCBbXHJ4LCAjKEFUOTFfREJHVV9USFIpXQkJQCBXcml0ZSB0byBUcmFuc21pdHRlciBIb2xkaW5nIFJlZ2lzdGVyCiAJLmVuZG0KIAogCS5tYWNybwl3YWl0dWFydCxyZCxyeAotMTAwMToJbGRyCVxyZCwgW1xyeCwgIyhBVDkxX0RCR1VfU1IgLSBBVDkxX0RCR1UpXQkJQCBSZWFkIFN0YXR1cyBSZWdpc3RlcgotCXRzdAlccmQsICNBVDkxX0RCR1VfVFhSRFkJCQkJQCBEQkdVX1RYUkRZID0gMSB3aGVuIHJlYWR5IHRvIHRyYW5zbWl0CisxMDAxOglsZHIJXHJkLCBbXHJ4LCAjKEFUOTFfREJHVV9TUildCQlAIFJlYWQgU3RhdHVzIFJlZ2lzdGVyCisJdHN0CVxyZCwgI0FUOTFfREJHVV9UWFJEWQkJCUAgREJHVV9UWFJEWSA9IDEgd2hlbiByZWFkeSB0byB0cmFuc21pdAogCWJlcQkxMDAxYgogCS5lbmRtCiAKIAkubWFjcm8JYnVzeXVhcnQscmQscngKLTEwMDE6CWxkcglccmQsIFtccngsICMoQVQ5MV9EQkdVX1NSIC0gQVQ5MV9EQkdVKV0JCUAgUmVhZCBTdGF0dXMgUmVnaXN0ZXIKLQl0c3QJXHJkLCAjQVQ5MV9EQkdVX1RYRU1QVFkJCQkJQCBEQkdVX1RYRU1QVFkgPSAxIHdoZW4gdHJhbnNtaXNzaW9uIGNvbXBsZXRlCisxMDAxOglsZHIJXHJkLCBbXHJ4LCAjKEFUOTFfREJHVV9TUildCQlAIFJlYWQgU3RhdHVzIFJlZ2lzdGVyCisJdHN0CVxyZCwgI0FUOTFfREJHVV9UWEVNUFRZCQkJQCBEQkdVX1RYRU1QVFkgPSAxIHdoZW4gdHJhbnNtaXNzaW9uIGNvbXBsZXRlCiAJYmVxCTEwMDFiCiAJLmVuZG0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9oYXJkd2FyZS5oCmluZGV4IDEwMDhiOWYuLjQ4MzQ3OGQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvaGFyZHdhcmUuaAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2hhcmR3YXJlLmgKQEAgLTM2LDYgKzM2LDIwIEBACiAjZXJyb3IgIlVuc3VwcG9ydGVkIEFUOTEgcHJvY2Vzc29yIgogI2VuZGlmCiAKKyNpZiAhZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxWDQwKQorLyoKKyAqIE9uIGFsbCBhdDkxIGV4Y2VwdCBybTkyMDAgYW5kIHg0MCBoYXZlIHRoZSBTeXN0ZW0gQ29udHJvbGxlciBzdGFydHMKKyAqIGF0IGFkZHJlc3MgMHhmZmZmYzAwMCBhbmQgaGFzIGEgc2l6ZSBvZiAxNktpQi4KKyAqCisgKiBPbiBybTkyMDAgaXQncyBzdGFydCBhdCAweGZmZmU0MDAwIG9mIDExMUtpQiB3aXRoIG5vbiByZXNlcnZlZCBkYXRhIHN0YXJ0aW5nCisgKiBhdCAweGZmZmZmMDAwCisgKgorICogUmVtb3ZlcyB0aGUgaW5kaXZpZHVhbCBkZWZpbml0aW9ucyBvZiBBVDkxX0JBU0VfU1lTIGFuZAorICogcmVwbGFjZXMgdGhlbSB3aXRoIGEgY29tbW9uIHZlcnNpb24gYXQgYmFzZSAweGZmZmZmYzAwMCBhbmQgc2l6ZSAxNktpQgorICogYW5kIG1hcCB0aGUgc2FtZSBtZW1vcnkgc3BhY2UKKyAqLworI2RlZmluZSBBVDkxX0JBU0VfU1lTCTB4ZmZmZmMwMDAKKyNlbmRpZgogCiAvKgogICogUGVyaXBoZXJhbCBpZGVudGlmaWVycy9pbnRlcnJ1cHRzLgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9pby5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9pby5oCmluZGV4IDBiMGNjY2MuLjQyOThlNzggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvaW8uaAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvaW5jbHVkZS9tYWNoL2lvLmgKQEAgLTIxLDE0ICsyMSwyMyBAQAogI2lmbmRlZiBfX0FTTV9BUkNIX0lPX0gKICNkZWZpbmUgX19BU01fQVJDSF9JT19ICiAKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisKICNkZWZpbmUgSU9fU1BBQ0VfTElNSVQJCTB4RkZGRkZGRkYKIAogI2RlZmluZSBfX2lvKGEpCQlfX3R5cGVzYWZlX2lvKGEpCiAjZGVmaW5lIF9fbWVtX3BjaShhKQkoYSkKIAotCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCisjaWZuZGVmIENPTkZJR19BUkNIX0FUOTFYNDAKKyNkZWZpbmUgX19hcmNoX2lvcmVtYXAJYXQ5MV9pb3JlbWFwCisjZGVmaW5lIF9fYXJjaF9pb3VubWFwCWF0OTFfaW91bm1hcAorI2VuZGlmCisKK3ZvaWQgX19pb21lbSAqYXQ5MV9pb3JlbWFwKHVuc2lnbmVkIGxvbmcgcGh5cywgc2l6ZV90IHNpemUsIHVuc2lnbmVkIGludCB0eXBlKTsKK3ZvaWQgYXQ5MV9pb3VubWFwKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcik7CisKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGF0OTFfc3lzX3JlYWQodW5zaWduZWQgaW50IHJlZ19vZmZzZXQpCiB7CiAJdm9pZCBfX2lvbWVtICphZGRyID0gKHZvaWQgX19pb21lbSAqKUFUOTFfVkFfQkFTRV9TWVM7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9zZXR1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNjQyOTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvc2V0dXAuYwpAQCAtMCwwICsxLDI5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBdG1lbCBDb3Jwb3JhdGlvbi4KKyAqIENvcHlyaWdodCAoQykgMjAxMSBKZWFuLUNocmlzdG9waGUgUExBR05JT0wtVklMTEFSRCA8cGxhZ25pb2pAamNyb3NvZnQuY29tPgorICoKKyAqIFVuZGVyIEdQTHYyCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoL21hcC5oPgorCisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPG1hY2gvY3B1Lmg+CisjaW5jbHVkZSA8bWFjaC9hdDkxX2RiZ3UuaD4KKyNpbmNsdWRlIDxtYWNoL2F0OTFfcG1jLmg+CisKKyNpbmNsdWRlICJzb2MuaCIKKyNpbmNsdWRlICJnZW5lcmljLmgiCisKK3N0cnVjdCBhdDkxX2luaXRfc29jIF9faW5pdGRhdGEgYXQ5MV9ib290X3NvYzsKKworc3RydWN0IGF0OTFfc29jaW5mbyBhdDkxX3NvY19pbml0ZGF0YTsKK0VYUE9SVF9TWU1CT0woYXQ5MV9zb2NfaW5pdGRhdGEpOworCit2b2lkIF9faW5pdCBhdDkxcm05MjAwX3NldF90eXBlKGludCB0eXBlKQoreworCWlmICh0eXBlID09IEFSQ0hfUkVWSVNPTl85MjAwX1BRRlApCisJCWF0OTFfc29jX2luaXRkYXRhLnN1YnR5cGUgPSBBVDkxX1NPQ19STTkyMDBfQkdBOworCWVsc2UKKwkJYXQ5MV9zb2NfaW5pdGRhdGEuc3VidHlwZSA9IEFUOTFfU09DX1JNOTIwMF9QUUZQOworfQorCit2b2lkIF9faW5pdCBhdDkxX2luaXRfaXJxX2RlZmF1bHQodm9pZCkKK3sKKwlhdDkxX2luaXRfaW50ZXJydXB0cyhhdDkxX2Jvb3Rfc29jLmRlZmF1bHRfaXJxX3ByaW9yaXR5KTsKK30KKwordm9pZCBfX2luaXQgYXQ5MV9pbml0X2ludGVycnVwdHModW5zaWduZWQgaW50ICpwcmlvcml0eSkKK3sKKwkvKiBJbml0aWFsaXplIHRoZSBBSUMgaW50ZXJydXB0IGNvbnRyb2xsZXIgKi8KKwlhdDkxX2FpY19pbml0KHByaW9yaXR5KTsKKworCS8qIEVuYWJsZSBHUElPIGludGVycnVwdHMgKi8KKwlhdDkxX2dwaW9faXJxX3NldHVwKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWFwX2Rlc2Mgc3JhbV9kZXNjWzJdIF9faW5pdGRhdGE7CisKK3ZvaWQgX19pbml0IGF0OTFfaW5pdF9zcmFtKGludCBiYW5rLCB1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGludCBsZW5ndGgpCit7CisJc3RydWN0IG1hcF9kZXNjICpkZXNjID0gJnNyYW1fZGVzY1tiYW5rXTsKKworCWRlc2MtPnZpcnR1YWwgPSBBVDkxX0lPX1ZJUlRfQkFTRSAtIGxlbmd0aDsKKwlpZiAoYmFuayA+IDApCisJCWRlc2MtPnZpcnR1YWwgLT0gc3JhbV9kZXNjW2JhbmsgLSAxXS5sZW5ndGg7CisKKwlkZXNjLT5wZm4gPSBfX3BoeXNfdG9fcGZuKGJhc2UpOworCWRlc2MtPmxlbmd0aCA9IGxlbmd0aDsKKwlkZXNjLT50eXBlID0gTVRfREVWSUNFOworCisJcHJfaW5mbygiQVQ5MTogc3JhbSBhdCAweCVseCBvZiAweCV4IG1hcHBlZCBhdCAweCVseFxuIiwKKwkJYmFzZSwgbGVuZ3RoLCBkZXNjLT52aXJ0dWFsKTsKKworCWlvdGFibGVfaW5pdChkZXNjLCAxKTsKK30KKworc3RhdGljIHN0cnVjdCBtYXBfZGVzYyBhdDkxX2lvX2Rlc2MgX19pbml0ZGF0YSA9IHsKKwkudmlydHVhbAk9IEFUOTFfVkFfQkFTRV9TWVMsCisJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEFUOTFfQkFTRV9TWVMpLAorCS5sZW5ndGgJCT0gU1pfMTZLLAorCS50eXBlCQk9IE1UX0RFVklDRSwKK307CisKK3ZvaWQgX19pb21lbSAqYXQ5MV9pb3JlbWFwKHVuc2lnbmVkIGxvbmcgcCwgc2l6ZV90IHNpemUsIHVuc2lnbmVkIGludCB0eXBlKQoreworCWlmIChwID49IEFUOTFfQkFTRV9TWVMgJiYgcCA8PSAoQVQ5MV9CQVNFX1NZUyArIFNaXzE2SyAtIDEpKQorCQlyZXR1cm4gKHZvaWQgX19pb21lbSAqKUFUOTFfSU9fUDJWKHApOworCisJcmV0dXJuIF9fYXJtX2lvcmVtYXBfY2FsbGVyKHAsIHNpemUsIHR5cGUsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7Cit9CitFWFBPUlRfU1lNQk9MKGF0OTFfaW9yZW1hcCk7CisKK3ZvaWQgYXQ5MV9pb3VubWFwKHZvbGF0aWxlIHZvaWQgX19pb21lbSAqYWRkcikKK3sKKwl1bnNpZ25lZCBsb25nIHZpcnQgPSAodW5zaWduZWQgbG9uZylhZGRyOworCisJaWYgKHZpcnQgPj0gVk1BTExPQ19TVEFSVCAmJiB2aXJ0IDwgVk1BTExPQ19FTkQpCisJCV9faW91bm1hcChhZGRyKTsKK30KK0VYUE9SVF9TWU1CT0woYXQ5MV9pb3VubWFwKTsKKworI2RlZmluZSBBVDkxX0RCR1UwCTB4ZmZmZmYyMDAKKyNkZWZpbmUgQVQ5MV9EQkdVMQkweGZmZmZlZTAwCisKK3N0YXRpYyB2b2lkIF9faW5pdCBzb2NfZGV0ZWN0KHUzMiBkYmd1X2Jhc2UpCit7CisJdTMyIGNpZHIsIHNvY2lkOworCisJY2lkciA9IF9fcmF3X3JlYWRsKEFUOTFfSU9fUDJWKGRiZ3VfYmFzZSkgKyBBVDkxX0RCR1VfQ0lEUik7CisJc29jaWQgPSBjaWRyICYgfkFUOTFfQ0lEUl9WRVJTSU9OOworCisJc3dpdGNoIChzb2NpZCkgeworCWNhc2UgQVJDSF9JRF9BVDkxQ0FQOTogeworI2lmZGVmIENPTkZJR19BVDkxX1BNQ19VTklUCisJCXUzMiBwbWNfdmVyID0gYXQ5MV9zeXNfcmVhZChBVDkxX1BNQ19WRVIpOworCisJCWlmIChwbWNfdmVyID09IEFSQ0hfUkVWSVNJT05fQ0FQOV9CKQorCQkJYXQ5MV9zb2NfaW5pdGRhdGEuc3VidHlwZSA9IEFUOTFfU09DX0NBUDlfUkVWX0I7CisJCWVsc2UgaWYgKHBtY192ZXIgPT0gQVJDSF9SRVZJU0lPTl9DQVA5X0MpCisJCQlhdDkxX3NvY19pbml0ZGF0YS5zdWJ0eXBlID0gQVQ5MV9TT0NfQ0FQOV9SRVZfQzsKKyNlbmRpZgorCQlhdDkxX3NvY19pbml0ZGF0YS50eXBlID0gQVQ5MV9TT0NfQ0FQOTsKKwkJYXQ5MV9ib290X3NvYyA9IGF0OTFjYXA5X3NvYzsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBBUkNIX0lEX0FUOTFSTTkyMDA6CisJCWF0OTFfc29jX2luaXRkYXRhLnR5cGUgPSBBVDkxX1NPQ19STTkyMDA7CisJCWF0OTFfYm9vdF9zb2MgPSBhdDkxcm05MjAwX3NvYzsKKwkJYnJlYWs7CisKKwljYXNlIEFSQ0hfSURfQVQ5MVNBTTkyNjA6CisJCWF0OTFfc29jX2luaXRkYXRhLnR5cGUgPSBBVDkxX1NPQ19TQU05MjYwOworCQlhdDkxX2Jvb3Rfc29jID0gYXQ5MXNhbTkyNjBfc29jOworCQlicmVhazsKKworCWNhc2UgQVJDSF9JRF9BVDkxU0FNOTI2MToKKwkJYXQ5MV9zb2NfaW5pdGRhdGEudHlwZSA9IEFUOTFfU09DX1NBTTkyNjE7CisJCWF0OTFfYm9vdF9zb2MgPSBhdDkxc2FtOTI2MV9zb2M7CisJCWJyZWFrOworCisJY2FzZSBBUkNIX0lEX0FUOTFTQU05MjYzOgorCQlhdDkxX3NvY19pbml0ZGF0YS50eXBlID0gQVQ5MV9TT0NfU0FNOTI2MzsKKwkJYXQ5MV9ib290X3NvYyA9IGF0OTFzYW05MjYzX3NvYzsKKwkJYnJlYWs7CisKKwljYXNlIEFSQ0hfSURfQVQ5MVNBTTlHMjA6CisJCWF0OTFfc29jX2luaXRkYXRhLnR5cGUgPSBBVDkxX1NPQ19TQU05RzIwOworCQlhdDkxX2Jvb3Rfc29jID0gYXQ5MXNhbTkyNjBfc29jOworCQlicmVhazsKKworCWNhc2UgQVJDSF9JRF9BVDkxU0FNOUc0NToKKwkJYXQ5MV9zb2NfaW5pdGRhdGEudHlwZSA9IEFUOTFfU09DX1NBTTlHNDU7CisJCWlmIChjaWRyID09IEFSQ0hfSURfQVQ5MVNBTTlHNDVFUykKKwkJCWF0OTFfc29jX2luaXRkYXRhLnN1YnR5cGUgPSBBVDkxX1NPQ19TQU05RzQ1RVM7CisJCWF0OTFfYm9vdF9zb2MgPSBhdDkxc2FtOWc0NV9zb2M7CisJCWJyZWFrOworCisJY2FzZSBBUkNIX0lEX0FUOTFTQU05Ukw2NDoKKwkJYXQ5MV9zb2NfaW5pdGRhdGEudHlwZSA9IEFUOTFfU09DX1NBTTlSTDsKKwkJYXQ5MV9ib290X3NvYyA9IGF0OTFzYW05cmxfc29jOworCQlicmVhazsKKworCWNhc2UgQVJDSF9JRF9BVDkxU0FNOVg1OgorCQlhdDkxX3NvY19pbml0ZGF0YS50eXBlID0gQVQ5MV9TT0NfU0FNOVg1OworCQlhdDkxX2Jvb3Rfc29jID0gYXQ5MXNhbTl4NV9zb2M7CisJCWJyZWFrOworCX0KKworCS8qIGF0OTFzYW05ZzEwICovCisJaWYgKChjaWRyICYgfkFUOTFfQ0lEUl9FWFQpID09IEFSQ0hfSURfQVQ5MVNBTTlHMTApIHsKKwkJYXQ5MV9zb2NfaW5pdGRhdGEudHlwZSA9IEFUOTFfU09DX1NBTTlHMTA7CisJCWF0OTFfYm9vdF9zb2MgPSBhdDkxc2FtOTI2MV9zb2M7CisJfQorCS8qIGF0OTFzYW05eGUgKi8KKwllbHNlIGlmICgoY2lkciAmIEFUOTFfQ0lEUl9BUkNIKSA9PSBBUkNIX0ZBTUlMWV9BVDkxU0FNOVhFKSB7CisJCWF0OTFfc29jX2luaXRkYXRhLnR5cGUgPSBBVDkxX1NPQ19TQU05MjYwOworCQlhdDkxX3NvY19pbml0ZGF0YS5zdWJ0eXBlID0gQVQ5MV9TT0NfU0FNOVhFOworCQlhdDkxX2Jvb3Rfc29jID0gYXQ5MXNhbTkyNjBfc29jOworCX0KKworCWlmICghYXQ5MV9zb2NfaXNfZGV0ZWN0ZWQoKSkKKwkJcmV0dXJuOworCisJYXQ5MV9zb2NfaW5pdGRhdGEuY2lkciA9IGNpZHI7CisKKwkvKiBzdWIgdmVyc2lvbiBvZiBzb2MgKi8KKwlhdDkxX3NvY19pbml0ZGF0YS5leGlkID0gX19yYXdfcmVhZGwoQVQ5MV9JT19QMlYoZGJndV9iYXNlKSArIEFUOTFfREJHVV9FWElEKTsKKworCWlmIChhdDkxX3NvY19pbml0ZGF0YS50eXBlID09IEFUOTFfU09DX1NBTTlHNDUpIHsKKwkJc3dpdGNoIChhdDkxX3NvY19pbml0ZGF0YS5leGlkKSB7CisJCWNhc2UgQVJDSF9FWElEX0FUOTFTQU05TTEwOgorCQkJYXQ5MV9zb2NfaW5pdGRhdGEuc3VidHlwZSA9IEFUOTFfU09DX1NBTTlNMTA7CisJCQlicmVhazsKKwkJY2FzZSBBUkNIX0VYSURfQVQ5MVNBTTlHNDY6CisJCQlhdDkxX3NvY19pbml0ZGF0YS5zdWJ0eXBlID0gQVQ5MV9TT0NfU0FNOUc0NjsKKwkJCWJyZWFrOworCQljYXNlIEFSQ0hfRVhJRF9BVDkxU0FNOU0xMToKKwkJCWF0OTFfc29jX2luaXRkYXRhLnN1YnR5cGUgPSBBVDkxX1NPQ19TQU05TTExOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoYXQ5MV9zb2NfaW5pdGRhdGEudHlwZSA9PSBBVDkxX1NPQ19TQU05WDUpIHsKKwkJc3dpdGNoIChhdDkxX3NvY19pbml0ZGF0YS5leGlkKSB7CisJCWNhc2UgQVJDSF9FWElEX0FUOTFTQU05RzE1OgorCQkJYXQ5MV9zb2NfaW5pdGRhdGEuc3VidHlwZSA9IEFUOTFfU09DX1NBTTlHMTU7CisJCQlicmVhazsKKwkJY2FzZSBBUkNIX0VYSURfQVQ5MVNBTTlHMzU6CisJCQlhdDkxX3NvY19pbml0ZGF0YS5zdWJ0eXBlID0gQVQ5MV9TT0NfU0FNOUczNTsKKwkJCWJyZWFrOworCQljYXNlIEFSQ0hfRVhJRF9BVDkxU0FNOVgzNToKKwkJCWF0OTFfc29jX2luaXRkYXRhLnN1YnR5cGUgPSBBVDkxX1NPQ19TQU05WDM1OworCQkJYnJlYWs7CisJCWNhc2UgQVJDSF9FWElEX0FUOTFTQU05RzI1OgorCQkJYXQ5MV9zb2NfaW5pdGRhdGEuc3VidHlwZSA9IEFUOTFfU09DX1NBTTlHMjU7CisJCQlicmVhazsKKwkJY2FzZSBBUkNIX0VYSURfQVQ5MVNBTTlYMjU6CisJCQlhdDkxX3NvY19pbml0ZGF0YS5zdWJ0eXBlID0gQVQ5MV9TT0NfU0FNOVgyNTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqc29jX25hbWVbXSA9IHsKKwlbQVQ5MV9TT0NfUk05MjAwXQk9ICJhdDkxcm05MjAwIiwKKwlbQVQ5MV9TT0NfQ0FQOV0JCT0gImF0OTFjYXA5IiwKKwlbQVQ5MV9TT0NfU0FNOTI2MF0JPSAiYXQ5MXNhbTkyNjAiLAorCVtBVDkxX1NPQ19TQU05MjYxXQk9ICJhdDkxc2FtOTI2MSIsCisJW0FUOTFfU09DX1NBTTkyNjNdCT0gImF0OTFzYW05MjYzIiwKKwlbQVQ5MV9TT0NfU0FNOUcxMF0JPSAiYXQ5MXNhbTlnMTAiLAorCVtBVDkxX1NPQ19TQU05RzIwXQk9ICJhdDkxc2FtOWcyMCIsCisJW0FUOTFfU09DX1NBTTlHNDVdCT0gImF0OTFzYW05ZzQ1IiwKKwlbQVQ5MV9TT0NfU0FNOVJMXQk9ICJhdDkxc2FtOXJsIiwKKwlbQVQ5MV9TT0NfU0FNOVg1XQk9ICJhdDkxc2FtOXg1IiwKKwlbQVQ5MV9TT0NfTk9ORV0JCT0gIlVua25vd24iCit9OworCitjb25zdCBjaGFyICphdDkxX2dldF9zb2NfdHlwZShzdHJ1Y3QgYXQ5MV9zb2NpbmZvICpjKQoreworCXJldHVybiBzb2NfbmFtZVtjLT50eXBlXTsKK30KK0VYUE9SVF9TWU1CT0woYXQ5MV9nZXRfc29jX3R5cGUpOworCitzdGF0aWMgY29uc3QgY2hhciAqc29jX3N1YnR5cGVfbmFtZVtdID0geworCVtBVDkxX1NPQ19STTkyMDBfQkdBXQk9ICJhdDkxcm05MjAwIEJHQSIsCisJW0FUOTFfU09DX1JNOTIwMF9QUUZQXQk9ICJhdDkxcm05MjAwIFBRRlAiLAorCVtBVDkxX1NPQ19DQVA5X1JFVl9CXQk9ICJhdDkxY2FwOSByZXZCIiwKKwlbQVQ5MV9TT0NfQ0FQOV9SRVZfQ10JPSAiYXQ5MWNhcDkgcmV2QyIsCisJW0FUOTFfU09DX1NBTTlYRV0JPSAiYXQ5MXNhbTl4ZSIsCisJW0FUOTFfU09DX1NBTTlHNDVFU10JPSAiYXQ5MXNhbTlnNDVlcyIsCisJW0FUOTFfU09DX1NBTTlNMTBdCT0gImF0OTFzYW05bTEwIiwKKwlbQVQ5MV9TT0NfU0FNOUc0Nl0JPSAiYXQ5MXNhbTlnNDYiLAorCVtBVDkxX1NPQ19TQU05TTExXQk9ICJhdDkxc2FtOW0xMSIsCisJW0FUOTFfU09DX1NBTTlHMTVdCT0gImF0OTFzYW05ZzE1IiwKKwlbQVQ5MV9TT0NfU0FNOUczNV0JPSAiYXQ5MXNhbTlnMzUiLAorCVtBVDkxX1NPQ19TQU05WDM1XQk9ICJhdDkxc2FtOXgzNSIsCisJW0FUOTFfU09DX1NBTTlHMjVdCT0gImF0OTFzYW05ZzI1IiwKKwlbQVQ5MV9TT0NfU0FNOVgyNV0JPSAiYXQ5MXNhbTl4MjUiLAorCVtBVDkxX1NPQ19TVUJUWVBFX05PTkVdCT0gIlVua25vd24iCit9OworCitjb25zdCBjaGFyICphdDkxX2dldF9zb2Nfc3VidHlwZShzdHJ1Y3QgYXQ5MV9zb2NpbmZvICpjKQoreworCXJldHVybiBzb2Nfc3VidHlwZV9uYW1lW2MtPnN1YnR5cGVdOworfQorRVhQT1JUX1NZTUJPTChhdDkxX2dldF9zb2Nfc3VidHlwZSk7CisKK3ZvaWQgX19pbml0IGF0OTFfbWFwX2lvKHZvaWQpCit7CisJLyogTWFwIHBlcmlwaGVyYWxzICovCisJaW90YWJsZV9pbml0KCZhdDkxX2lvX2Rlc2MsIDEpOworCisJYXQ5MV9zb2NfaW5pdGRhdGEudHlwZSA9IEFUOTFfU09DX05PTkU7CisJYXQ5MV9zb2NfaW5pdGRhdGEuc3VidHlwZSA9IEFUOTFfU09DX1NVQlRZUEVfTk9ORTsKKworCXNvY19kZXRlY3QoQVQ5MV9EQkdVMCk7CisJaWYgKCFhdDkxX3NvY19pc19kZXRlY3RlZCgpKQorCQlzb2NfZGV0ZWN0KEFUOTFfREJHVTEpOworCisJaWYgKCFhdDkxX3NvY19pc19kZXRlY3RlZCgpKQorCQlwYW5pYygiQVQ5MTogSW1wb3NzaWJsZSB0byBkZXRlY3QgdGhlIFNPQyB0eXBlIik7CisKKwlwcl9pbmZvKCJBVDkxOiBEZXRlY3RlZCBzb2MgdHlwZTogJXNcbiIsCisJCWF0OTFfZ2V0X3NvY190eXBlKCZhdDkxX3NvY19pbml0ZGF0YSkpOworCXByX2luZm8oIkFUOTE6IERldGVjdGVkIHNvYyBzdWJ0eXBlOiAlc1xuIiwKKwkJYXQ5MV9nZXRfc29jX3N1YnR5cGUoJmF0OTFfc29jX2luaXRkYXRhKSk7CisKKwlpZiAoIWF0OTFfc29jX2lzX2VuYWJsZWQoKSkKKwkJcGFuaWMoIkFUOTE6IFNvYyBub3QgZW5hYmxlZCIpOworCisJaWYgKGF0OTFfYm9vdF9zb2MubWFwX2lvKQorCQlhdDkxX2Jvb3Rfc29jLm1hcF9pbygpOworfQorCit2b2lkIF9faW5pdCBhdDkxX2luaXRpYWxpemUodW5zaWduZWQgbG9uZyBtYWluX2Nsb2NrKQoreworCS8qIEluaXQgY2xvY2sgc3Vic3lzdGVtICovCisJYXQ5MV9jbG9ja19pbml0KG1haW5fY2xvY2spOworCisJLyogUmVnaXN0ZXIgdGhlIHByb2Nlc3Nvci1zcGVjaWZpYyBjbG9ja3MgKi8KKwlhdDkxX2Jvb3Rfc29jLnJlZ2lzdGVyX2Nsb2NrcygpOworCisJYXQ5MV9ib290X3NvYy5pbml0KCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvc29jLmggYi9hcmNoL2FybS9tYWNoLWF0OTEvc29jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFlZDg4MQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9zb2MuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEplYW4tQ2hyaXN0b3BoZSBQTEFHTklPTC1WSUxMQVJEIDxwbGFnbmlvakBqY3Jvc29mdC5jb20+CisgKgorICogVW5kZXIgR1BMdjIKKyAqLworCitzdHJ1Y3QgYXQ5MV9pbml0X3NvYyB7CisJdW5zaWduZWQgaW50ICpkZWZhdWx0X2lycV9wcmlvcml0eTsKKwl2b2lkICgqbWFwX2lvKSh2b2lkKTsKKwl2b2lkICgqcmVnaXN0ZXJfY2xvY2tzKSh2b2lkKTsKKwl2b2lkICgqaW5pdCkodm9pZCk7Cit9OworCitleHRlcm4gc3RydWN0IGF0OTFfaW5pdF9zb2MgYXQ5MV9ib290X3NvYzsKK2V4dGVybiBzdHJ1Y3QgYXQ5MV9pbml0X3NvYyBhdDkxY2FwOV9zb2M7CitleHRlcm4gc3RydWN0IGF0OTFfaW5pdF9zb2MgYXQ5MXJtOTIwMF9zb2M7CitleHRlcm4gc3RydWN0IGF0OTFfaW5pdF9zb2MgYXQ5MXNhbTkyNjBfc29jOworZXh0ZXJuIHN0cnVjdCBhdDkxX2luaXRfc29jIGF0OTFzYW05MjYxX3NvYzsKK2V4dGVybiBzdHJ1Y3QgYXQ5MV9pbml0X3NvYyBhdDkxc2FtOTI2M19zb2M7CitleHRlcm4gc3RydWN0IGF0OTFfaW5pdF9zb2MgYXQ5MXNhbTlnNDVfc29jOworZXh0ZXJuIHN0cnVjdCBhdDkxX2luaXRfc29jIGF0OTFzYW05cmxfc29jOworZXh0ZXJuIHN0cnVjdCBhdDkxX2luaXRfc29jIGF0OTFzYW05eDVfc29jOworCitzdGF0aWMgaW5saW5lIGludCBhdDkxX3NvY19pc19lbmFibGVkKHZvaWQpCit7CisJcmV0dXJuIGF0OTFfYm9vdF9zb2MuaW5pdCAhPSBOVUxMOworfQorCisjaWYgIWRlZmluZWQoQ09ORklHX0FSQ0hfQVQ5MUNBUDkpCisjZGVmaW5lIGF0OTFjYXA5X3NvYwlhdDkxX2Jvb3Rfc29jCisjZW5kaWYKKworI2lmICFkZWZpbmVkKENPTkZJR19BUkNIX0FUOTFSTTkyMDApCisjZGVmaW5lIGF0OTFybTkyMDBfc29jCWF0OTFfYm9vdF9zb2MKKyNlbmRpZgorCisjaWYgIShkZWZpbmVkKENPTkZJR19BUkNIX0FUOTFTQU05MjYwKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX0FUOTFTQU05RzIwKSkKKyNkZWZpbmUgYXQ5MXNhbTkyNjBfc29jCWF0OTFfYm9vdF9zb2MKKyNlbmRpZgorCisjaWYgIShkZWZpbmVkKENPTkZJR19BUkNIX0FUOTFTQU05MjYxKSB8fCBkZWZpbmVkKENPTkZJR19BUkNIX0FUOTFTQU05RzEwKSkKKyNkZWZpbmUgYXQ5MXNhbTkyNjFfc29jCWF0OTFfYm9vdF9zb2MKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoQ09ORklHX0FSQ0hfQVQ5MVNBTTkyNjMpCisjZGVmaW5lIGF0OTFzYW05MjYzX3NvYwlhdDkxX2Jvb3Rfc29jCisjZW5kaWYKKworI2lmICFkZWZpbmVkKENPTkZJR19BUkNIX0FUOTFTQU05RzQ1KQorI2RlZmluZSBhdDkxc2FtOWc0NV9zb2MJYXQ5MV9ib290X3NvYworI2VuZGlmCisKKyNpZiAhZGVmaW5lZChDT05GSUdfQVJDSF9BVDkxU0FNOVJMKQorI2RlZmluZSBhdDkxc2FtOXJsX3NvYwlhdDkxX2Jvb3Rfc29jCisjZW5kaWYKKworI2lmICFkZWZpbmVkKENPTkZJR19BUkNIX0FUOTFTQU05WDUpCisjZGVmaW5lIGF0OTFzYW05eDVfc29jCWF0OTFfYm9vdF9zb2MKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1jbnMzeHh4L3BjaWUuYyBiL2FyY2gvYXJtL21hY2gtY25zM3h4eC9wY2llLmMKaW5kZXggYTRlYzA4MC4uMDZmZDI1ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1jbnMzeHh4L3BjaWUuYworKysgYi9hcmNoL2FybS9tYWNoLWNuczN4eHgvcGNpZS5jCkBAIC0xNzIsNyArMTcyLDcgQEAKIAlyZXR1cm4gcGNpX3NjYW5fYnVzKHN5cy0+YnVzbnIsICZjbnMzeHh4X3BjaWVfb3BzLCBzeXMpOwogfQogCi1zdGF0aWMgaW50IGNuczN4eHhfcGNpZV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgY25zM3h4eF9wY2llX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0cnVjdCBjbnMzeHh4X3BjaWUgKmNuc3BjaSA9IHBkZXZfdG9fY25zcGNpKGRldik7CiAJaW50IGlycSA9IGNuc3BjaS0+aXJxc1tzbG90XTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZG92ZS9wY2llLmMgYi9hcmNoL2FybS9tYWNoLWRvdmUvcGNpZS5jCmluZGV4IGMyZjFjNDcuLmFhMmIzYTAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZG92ZS9wY2llLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1kb3ZlL3BjaWUuYwpAQCAtMTkzLDcgKzE5Myw3IEBACiAJcmV0dXJuIGJ1czsKIH0KIAotc3RhdGljIGludCBfX2luaXQgZG92ZV9wY2llX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgZG92ZV9wY2llX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0cnVjdCBwY2llX3BvcnQgKnBwID0gYnVzX3RvX3BvcnQoZGV2LT5idXMtPm51bWJlcik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9jYXRzLXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NhdHMtcGNpLmMKaW5kZXggYWUzZTFjOC4uMzIzMjFmNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NhdHMtcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL2NhdHMtcGNpLmMKQEAgLTE2LDcgKzE2LDcgQEAKIC8qIGNhdHMgaG9zdC1zcGVjaWZpYyBzdHVmZiAqLwogc3RhdGljIGludCBpcnFtYXBfY2F0c1tdIF9faW5pdGRhdGEgPSB7IElSUV9QQ0ksIElSUV9JTjAsIElSUV9JTjEsIElSUV9JTjMgfTsKIAotc3RhdGljIGludCBfX2luaXQgY2F0c19tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IGNhdHNfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaWYgKGRldi0+aXJxID49IDI1NSkKIAkJcmV0dXJuIC0xOwkvKiBub3QgYSB2YWxpZCBpbnRlcnJ1cHQuICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvZWJzYTI4NS1wY2kuYyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9lYnNhMjg1LXBjaS5jCmluZGV4IGU1YWI1YmQuLjUxMWM2NzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9lYnNhMjg1LXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9lYnNhMjg1LXBjaS5jCkBAIC0xNSw3ICsxNSw3IEBACiAKIHN0YXRpYyBpbnQgaXJxbWFwX2Vic2EyODVbXSBfX2luaXRkYXRhID0geyBJUlFfSU4zLCBJUlFfSU4xLCBJUlFfSU4wLCBJUlFfUENJIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IGVic2EyODVfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBlYnNhMjg1X21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWlmIChkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0NPTlRBUSAmJgogCSAgICBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0NPTlRBUV84MkM2OTMpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvbmV0d2luZGVyLXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL25ldHdpbmRlci1wY2kuYwppbmRleCBlMjYzZDZkLi42MjE4NzYxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvbmV0d2luZGVyLXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9uZXR3aW5kZXItcGNpLmMKQEAgLTE3LDcgKzE3LDcgQEAKICAqIFdlIG5vdyB1c2UgdGhlIHNsb3QgSUQgaW5zdGVhZCBvZiB0aGUgZGV2aWNlIGlkZW50aWZpZXJzIHRvIHNlbGVjdAogICogd2hpY2ggaW50ZXJydXB0IGlzIHJvdXRlZCB3aGVyZS4KICAqLwotc3RhdGljIGludCBfX2luaXQgbmV0d2luZGVyX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgbmV0d2luZGVyX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN3aXRjaCAoc2xvdCkgewogCWNhc2UgMDogIC8qIGhvc3QgYnJpZGdlICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvcGVyc29uYWwtcGNpLmMgYi9hcmNoL2FybS9tYWNoLWZvb3RicmlkZ2UvcGVyc29uYWwtcGNpLmMKaW5kZXggZDVmY2E5NS4uYWViNjUxZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1mb290YnJpZGdlL3BlcnNvbmFsLXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZm9vdGJyaWRnZS9wZXJzb25hbC1wY2kuYwpAQCAtMTgsNyArMTgsOCBAQAogCUlSUV9ET09SQkVMTEhPU1QsIElSUV9ETUExLCBJUlFfRE1BMiwgSVJRX1BDSQogfTsKIAotc3RhdGljIGludCBfX2luaXQgcGVyc29uYWxfc2VydmVyX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgcGVyc29uYWxfc2VydmVyX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwKKwl1OCBwaW4pCiB7CiAJdW5zaWduZWQgY2hhciBsaW5lOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgxLmMgYi9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgxLmMKaW5kZXggZGNjNDE3Mi4uNGFhYmViMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDEuYwpAQCAtNTg3LDkgKzU4Nyw5IEBACiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJtbWEiLCBtbWFfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14X3VkYy4wIiwgTlVMTCwgdXNiZF9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJncHQiLCBncHRfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMCIsIE5VTEwsIHVhcnRfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMSIsIE5VTEwsIHVhcnRfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMiIsIE5VTEwsIHVhcnRfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14MS11YXJ0LjAiLCBOVUxMLCB1YXJ0X2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteDEtdWFydC4xIiwgTlVMTCwgdWFydF9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgxLXVhcnQuMiIsIE5VTEwsIHVhcnRfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14LWkyYy4wIiwgTlVMTCwgaTJjX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteDEtY3NwaS4wIiwgTlVMTCwgc3BpX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteDEtY3NwaS4xIiwgTlVMTCwgc3BpX2NsaykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDIxLmMgYi9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgyMS5jCmluZGV4IGJmMzBhOGMuLmVlMTVkOGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDIxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MjEuYwpAQCAtMTE2MiwxMCArMTE2MiwxMCBAQAogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAicGVyY2xrMyIsIHBlcl9jbGtbMl0pCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJwZXJjbGs0IiwgcGVyX2Nsa1szXSkKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImNsa28iLCBjbGtvX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjAiLCBOVUxMLCB1YXJ0X2Nsa1swXSkKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjEiLCBOVUxMLCB1YXJ0X2Nsa1sxXSkKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjIiLCBOVUxMLCB1YXJ0X2Nsa1syXSkKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjMiLCBOVUxMLCB1YXJ0X2Nsa1szXSkKKwlfUkVHSVNURVJfQ0xPQ0soImlteDIxLXVhcnQuMCIsIE5VTEwsIHVhcnRfY2xrWzBdKQorCV9SRUdJU1RFUl9DTE9DSygiaW14MjEtdWFydC4xIiwgTlVMTCwgdWFydF9jbGtbMV0pCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjIiLCBOVUxMLCB1YXJ0X2Nsa1syXSkKKwlfUkVHSVNURVJfQ0xPQ0soImlteDIxLXVhcnQuMyIsIE5VTEwsIHVhcnRfY2xrWzNdKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZ3B0MSIsIGdwdF9jbGtbMF0pCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJncHQxIiwgZ3B0X2Nsa1sxXSkKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImdwdDEiLCBncHRfY2xrWzJdKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MjUuYyBiL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDI1LmMKaW5kZXggYWYxYzU4MC4uMGZjN2JhNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MjUuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgyNS5jCkBAIC0yNzIsMTEgKzI3MiwxMiBAQAogCX0sCiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBsb29rdXBzW10gPSB7Ci0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4wIiwgTlVMTCwgdWFydDFfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMSIsIE5VTEwsIHVhcnQyX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjIiLCBOVUxMLCB1YXJ0M19jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4zIiwgTlVMTCwgdWFydDRfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuNCIsIE5VTEwsIHVhcnQ1X2NsaykKKwkvKiBpLm14MjUgaGFzIHRoZSBpLm14MjEgdHlwZSB1YXJ0ICovCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjAiLCBOVUxMLCB1YXJ0MV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjEiLCBOVUxMLCB1YXJ0Ml9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjIiLCBOVUxMLCB1YXJ0M19jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjMiLCBOVUxMLCB1YXJ0NF9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjQiLCBOVUxMLCB1YXJ0NV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJteGMtZWhjaS4wIiwgInVzYiIsIHVzYm90Z19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJteGMtZWhjaS4xIiwgInVzYiIsIHVzYm90Z19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJteGMtZWhjaS4yIiwgInVzYiIsIHVzYm90Z19jbGspCkBAIC0yOTUsMTkgKzI5NiwyMCBAQAogCV9SRUdJU1RFUl9DTE9DSygiaW14LWkyYy4wIiwgTlVMTCwgaTJjX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1pMmMuMSIsIE5VTEwsIGkyY19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgtaTJjLjIiLCBOVUxMLCBpMmNfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiZmVjLjAiLCBOVUxMLCBmZWNfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14MjUtZmVjLjAiLCBOVUxMLCBmZWNfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14ZGlfcnRjLjAiLCBOVUxMLCBkcnlpY2VfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14LWZiLjAiLCBOVUxMLCBsY2RjX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteDItd2R0LjAiLCBOVUxMLCB3ZHRfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14LXNzaS4wIiwgTlVMTCwgc3NpMV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgtc3NpLjEiLCBOVUxMLCBzc2kyX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteC4wIiwgTlVMTCwgZXNkaGMxX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteC4xIiwgTlVMTCwgZXNkaGMyX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteDI1LjAiLCBOVUxMLCBlc2RoYzFfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygic2RoY2ktZXNkaGMtaW14MjUuMSIsIE5VTEwsIGVzZGhjMl9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJteDItY2FtZXJhLjAiLCBOVUxMLCBjc2lfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiYXVkbXV4IiwgYXVkbXV4X2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImZsZXhjYW4uMCIsIE5VTEwsIGNhbjFfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiZmxleGNhbi4xIiwgTlVMTCwgY2FuMl9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtc2RtYSIsIE5VTEwsIHNkbWFfY2xrKQorCS8qIGkubXgyNSBoYXMgdGhlIGkubXgzNSB0eXBlIHNkbWEgKi8KKwlfUkVHSVNURVJfQ0xPQ0soImlteDM1LXNkbWEiLCBOVUxMLCBzZG1hX2NsaykKIH07CiAKIGludCBfX2luaXQgbXgyNV9jbG9ja3NfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MjcuYyBiL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDI3LmMKaW5kZXggNTgzZjI1MS4uNjkxMmI4MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MjcuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgyNy5jCkBAIC02MjQsMTIgKzYyNCwxMyBAQAogCX0sCiAKIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBsb29rdXBzW10gPSB7Ci0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4wIiwgTlVMTCwgdWFydDFfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMSIsIE5VTEwsIHVhcnQyX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjIiLCBOVUxMLCB1YXJ0M19jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4zIiwgTlVMTCwgdWFydDRfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuNCIsIE5VTEwsIHVhcnQ1X2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjUiLCBOVUxMLCB1YXJ0Nl9jbGspCisJLyogaS5teDI3IGhhcyB0aGUgaS5teDIxIHR5cGUgdWFydCAqLworCV9SRUdJU1RFUl9DTE9DSygiaW14MjEtdWFydC4wIiwgTlVMTCwgdWFydDFfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14MjEtdWFydC4xIiwgTlVMTCwgdWFydDJfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14MjEtdWFydC4yIiwgTlVMTCwgdWFydDNfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14MjEtdWFydC4zIiwgTlVMTCwgdWFydDRfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14MjEtdWFydC40IiwgTlVMTCwgdWFydDVfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14MjEtdWFydC41IiwgTlVMTCwgdWFydDZfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZ3B0MSIsIGdwdDFfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZ3B0MiIsIGdwdDJfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZ3B0MyIsIGdwdDNfY2xrKQpAQCAtNjYyLDcgKzY2Myw3IEBACiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJicm9tIiwgYnJvbV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJlbW1hIiwgZW1tYV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJzbGNkYyIsIHNsY2RjX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImZlYy4wIiwgTlVMTCwgZmVjX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteDI3LWZlYy4wIiwgTlVMTCwgZmVjX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImVtaSIsIGVtaV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJzYWhhcmEyIiwgc2FoYXJhMl9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJhdGEiLCBhdGFfY2xrKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MzEuYyBiL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDMxLmMKaW5kZXggMjVmMzQzZi4uZDk3Mzc3MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MzEuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgzMS5jCkBAIC01NDcsMTEgKzU0NywxMiBAQAogCV9SRUdJU1RFUl9DTE9DSygiZnNsLXVzYjItdWRjIiwgInVzYiIsIHVzYl9jbGsxKQogCV9SRUdJU1RFUl9DTE9DSygiZnNsLXVzYjItdWRjIiwgInVzYl9haGIiLCB1c2JfY2xrMikKIAlfUkVHSVNURVJfQ0xPQ0soIm14My1jYW1lcmEuMCIsIE5VTEwsIGNzaV9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4wIiwgTlVMTCwgdWFydDFfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMSIsIE5VTEwsIHVhcnQyX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjIiLCBOVUxMLCB1YXJ0M19jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4zIiwgTlVMTCwgdWFydDRfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuNCIsIE5VTEwsIHVhcnQ1X2NsaykKKwkvKiBpLm14MzEgaGFzIHRoZSBpLm14MjEgdHlwZSB1YXJ0ICovCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjAiLCBOVUxMLCB1YXJ0MV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjEiLCBOVUxMLCB1YXJ0Ml9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjIiLCBOVUxMLCB1YXJ0M19jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjMiLCBOVUxMLCB1YXJ0NF9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjQiLCBOVUxMLCB1YXJ0NV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgtaTJjLjAiLCBOVUxMLCBpMmMxX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1pMmMuMSIsIE5VTEwsIGkyYzJfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14LWkyYy4yIiwgTlVMTCwgaTJjM19jbGspCkBAIC01NjQsNyArNTY1LDcgQEAKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImF0YSIsIGF0YV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJydGljIiwgcnRpY19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJybmciLCBybmdfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXNkbWEiLCBOVUxMLCBzZG1hX2NsazEpCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgzMS1zZG1hIiwgTlVMTCwgc2RtYV9jbGsxKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAic2RtYV9pcGciLCBzZG1hX2NsazIpCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJtc3RpY2siLCBtc3RpY2sxX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgIm1zdGljayIsIG1zdGljazJfY2xrKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MzUuYyBiL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDM1LmMKaW5kZXggNWE0Y2MxZS4uODhiNjJhMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDM1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MzUuYwpAQCAtNDU4LDEwICs0NTgsMTEgQEAKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1lcGl0LjAiLCBOVUxMLCBlcGl0MV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgtZXBpdC4xIiwgTlVMTCwgZXBpdDJfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZXNhaSIsIGVzYWlfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygic2RoY2ktZXNkaGMtaW14LjAiLCBOVUxMLCBlc2RoYzFfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygic2RoY2ktZXNkaGMtaW14LjEiLCBOVUxMLCBlc2RoYzJfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygic2RoY2ktZXNkaGMtaW14LjIiLCBOVUxMLCBlc2RoYzNfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiZmVjLjAiLCBOVUxMLCBmZWNfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygic2RoY2ktZXNkaGMtaW14MzUuMCIsIE5VTEwsIGVzZGhjMV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJzZGhjaS1lc2RoYy1pbXgzNS4xIiwgTlVMTCwgZXNkaGMyX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteDM1LjIiLCBOVUxMLCBlc2RoYzNfY2xrKQorCS8qIGkubXgzNSBoYXMgdGhlIGkubXgyNyB0eXBlIGZlYyAqLworCV9SRUdJU1RFUl9DTE9DSygiaW14MjctZmVjLjAiLCBOVUxMLCBmZWNfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZ3BpbyIsIGdwaW8xX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgImdwaW8iLCBncGlvMl9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJncGlvIiwgZ3BpbzNfY2xrKQpAQCAtNDgxLDE0ICs0ODIsMTUgQEAKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgInJ0YyIsIHJ0Y19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJydGljIiwgcnRpY19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJzY2MiLCBzY2NfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXNkbWEiLCBOVUxMLCBzZG1hX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soImlteDM1LXNkbWEiLCBOVUxMLCBzZG1hX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgInNwYmEiLCBzcGJhX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soTlVMTCwgInNwZGlmIiwgc3BkaWZfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14LXNzaS4wIiwgTlVMTCwgc3NpMV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgtc3NpLjEiLCBOVUxMLCBzc2kyX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjAiLCBOVUxMLCB1YXJ0MV9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4xIiwgTlVMTCwgdWFydDJfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMiIsIE5VTEwsIHVhcnQzX2NsaykKKwkvKiBpLm14MzUgaGFzIHRoZSBpLm14MjEgdHlwZSB1YXJ0ICovCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjAiLCBOVUxMLCB1YXJ0MV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjEiLCBOVUxMLCB1YXJ0Ml9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjIiLCBOVUxMLCB1YXJ0M19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJteGMtZWhjaS4wIiwgInVzYiIsIHVzYm90Z19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJteGMtZWhjaS4xIiwgInVzYiIsIHVzYm90Z19jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJteGMtZWhjaS4yIiwgInVzYiIsIHVzYm90Z19jbGspCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9ldWtyZWFfbWJpbXhzZDI1LWJhc2Vib2FyZC5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvZXVrcmVhX21iaW14c2QyNS1iYXNlYm9hcmQuYwppbmRleCAwMWViY2IzLi42NmU4NzI2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9ldWtyZWFfbWJpbXhzZDI1LWJhc2Vib2FyZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2V1a3JlYV9tYmlteHNkMjUtYmFzZWJvYXJkLmMKQEAgLTIyNSw3ICsyMjUsOCBAQAogCiBzdGF0aWMgc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgc2QxX3BkYXRhID0gewogCS5jZF9ncGlvID0gR1BJT19TRDFDRCwKLQkud3BfZ3BpbyA9IC1FSU5WQUwsCisJLmNkX3R5cGUgPSBFU0RIQ19DRF9HUElPLAorCS53cF90eXBlID0gRVNESENfV1BfTk9ORSwKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9ldWtyZWFfbWJpbXhzZDM1LWJhc2Vib2FyZC5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvZXVrcmVhX21iaW14c2QzNS1iYXNlYm9hcmQuYwppbmRleCA1NThlYjUyLi4wZjBhZjAyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9ldWtyZWFfbWJpbXhzZDM1LWJhc2Vib2FyZC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L2V1a3JlYV9tYmlteHNkMzUtYmFzZWJvYXJkLmMKQEAgLTIzNiw3ICsyMzYsOCBAQAogCiBzdGF0aWMgc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgc2QxX3BkYXRhID0gewogCS5jZF9ncGlvID0gR1BJT19TRDFDRCwKLQkud3BfZ3BpbyA9IC1FSU5WQUwsCisJLmNkX3R5cGUgPSBFU0RIQ19DRF9HUElPLAorCS53cF90eXBlID0gRVNESENfV1BfTk9ORSwKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MjVfM2RzLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLW14MjVfM2RzLmMKaW5kZXggMDE1MzRiYi4uN2Y2NmE5MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1teDI1XzNkcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtbXgyNV8zZHMuYwpAQCAtMjE1LDYgKzIxNSw4IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgbXgyNXBka19lc2RoY19wZGF0YSBfX2luaXRjb25zdCA9IHsKIAkud3BfZ3BpbyA9IFNEMV9HUElPX1dQLAogCS5jZF9ncGlvID0gU0QxX0dQSU9fQ0QsCisJLndwX3R5cGUgPSBFU0RIQ19XUF9HUElPLAorCS5jZF90eXBlID0gRVNESENfQ0RfR1BJTywKIH07CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBteDI1cGRrX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcGNtMDQzLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXBjbTA0My5jCmluZGV4IDE2M2NjMzE4Li42NjBlYzNlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tYWNoLXBjbTA0My5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21hY2gtcGNtMDQzLmMKQEAgLTM0OSw2ICszNDksOCBAQAogc3RhdGljIHN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhIHNkMV9wZGF0YSA9IHsKIAkud3BfZ3BpbyA9IFNEMV9HUElPX1dQLAogCS5jZF9ncGlvID0gU0QxX0dQSU9fQ0QsCisJLndwX3R5cGUgPSBFU0RIQ19XUF9HUElPLAorCS5jZF90eXBlID0gRVNESENfQ0RfR1BJTywKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgyNS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbW0taW14MjUuYwppbmRleCA4YmYwMjkxLi5jYzRkMTUyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgyNS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L21tLWlteDI1LmMKQEAgLTc5LDcgKzc5LDYgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc2RtYV9wbGF0Zm9ybV9kYXRhIGlteDI1X3NkbWFfcGRhdGEgX19pbml0ZGF0YSA9IHsKLQkuc2RtYV92ZXJzaW9uID0gMiwKIAkuZndfbmFtZSA9ICJzZG1hLWlteDI1LmJpbiIsCiAJLnNjcmlwdF9hZGRycyA9ICZpbXgyNV9zZG1hX3NjcmlwdCwKIH07CkBAIC05Miw1ICs5MSw2IEBACiAJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAyLCBNWDI1X0dQSU8zX0JBU0VfQUREUiwgU1pfMTZLLCBNWDI1X0lOVF9HUElPMywgMCk7CiAJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAzLCBNWDI1X0dQSU80X0JBU0VfQUREUiwgU1pfMTZLLCBNWDI1X0lOVF9HUElPNCwgMCk7CiAKLQlpbXhfYWRkX2lteF9zZG1hKE1YMjVfU0RNQV9CQVNFX0FERFIsIE1YMjVfSU5UX1NETUEsICZpbXgyNV9zZG1hX3BkYXRhKTsKKwkvKiBpLm14MjUgaGFzIHRoZSBpLm14MzUgdHlwZSBzZG1hICovCisJaW14X2FkZF9pbXhfc2RtYSgiaW14MzUtc2RtYSIsIE1YMjVfU0RNQV9CQVNFX0FERFIsIE1YMjVfSU5UX1NETUEsICZpbXgyNV9zZG1hX3BkYXRhKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21tLWlteDMxLmMgYi9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgzMS5jCmluZGV4IDYxYmZmMzguLmI3YzU1ZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21tLWlteDMxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbW0taW14MzEuYwpAQCAtNjksNyArNjksNiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBzZG1hX3BsYXRmb3JtX2RhdGEgaW14MzFfc2RtYV9wZGF0YSBfX2luaXRkYXRhID0gewotCS5zZG1hX3ZlcnNpb24gPSAxLAogCS5md19uYW1lID0gInNkbWEtaW14MzEtdG8yLmJpbiIsCiAJLnNjcmlwdF9hZGRycyA9ICZpbXgzMV90bzJfc2RtYV9zY3JpcHQsCiB9OwpAQCAtODgsNSArODcsNSBAQAogCQlpbXgzMV9zZG1hX3BkYXRhLnNjcmlwdF9hZGRycyA9ICZpbXgzMV90bzFfc2RtYV9zY3JpcHQ7CiAJfQogCi0JaW14X2FkZF9pbXhfc2RtYShNWDMxX1NETUFfQkFTRV9BRERSLCBNWDMxX0lOVF9TRE1BLCAmaW14MzFfc2RtYV9wZGF0YSk7CisJaW14X2FkZF9pbXhfc2RtYSgiaW14MzEtc2RtYSIsIE1YMzFfU0RNQV9CQVNFX0FERFIsIE1YMzFfSU5UX1NETUEsICZpbXgzMV9zZG1hX3BkYXRhKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L21tLWlteDM1LmMgYi9hcmNoL2FybS9tYWNoLWlteC9tbS1pbXgzNS5jCmluZGV4IDk4NzY5YWUuLmY0OWJhYzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21tLWlteDM1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvbW0taW14MzUuYwpAQCAtODYsNyArODYsNiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBzZG1hX3BsYXRmb3JtX2RhdGEgaW14MzVfc2RtYV9wZGF0YSBfX2luaXRkYXRhID0gewotCS5zZG1hX3ZlcnNpb24gPSAyLAogCS5md19uYW1lID0gInNkbWEtaW14MzUtdG8yLmJpbiIsCiAJLnNjcmlwdF9hZGRycyA9ICZpbXgzNV90bzJfc2RtYV9zY3JpcHQsCiB9OwpAQCAtMTA2LDUgKzEwNSw1IEBACiAJCWlteDM1X3NkbWFfcGRhdGEuc2NyaXB0X2FkZHJzID0gJmlteDM1X3RvMV9zZG1hX3NjcmlwdDsKIAl9CiAKLQlpbXhfYWRkX2lteF9zZG1hKE1YMzVfU0RNQV9CQVNFX0FERFIsIE1YMzVfSU5UX1NETUEsICZpbXgzNV9zZG1hX3BkYXRhKTsKKwlpbXhfYWRkX2lteF9zZG1hKCJpbXgzNS1zZG1hIiwgTVgzNV9TRE1BX0JBU0VfQUREUiwgTVgzNV9JTlRfU0RNQSwgJmlteDM1X3NkbWFfcGRhdGEpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL3BjaS5jIGIvYXJjaC9hcm0vbWFjaC1pbnRlZ3JhdG9yL3BjaS5jCmluZGV4IDJmZGI5NTQuLjUyMGI2YmYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW50ZWdyYXRvci9wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLWludGVncmF0b3IvcGNpLmMKQEAgLTk1LDcgKzk1LDcgQEAKICAqIG1hcCB0aGUgc3BlY2lmaWVkIGRldmljZS9zbG90L3BpbiB0byBhbiBJUlEuICBUaGlzIHdvcmtzIG91dCBzdWNoCiAgKiB0aGF0IHNsb3QgOSBwaW4gMSBpcyBJTlQwLCBwaW4gMiBpcyBJTlQxLCBhbmQgc2xvdCAxMCBwaW4gMSBpcyBJTlQxLgogICovCi1zdGF0aWMgaW50IF9faW5pdCBpbnRlZ3JhdG9yX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgaW50ZWdyYXRvcl9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpbnQgaW50bnIgPSAoKHNsb3QgLSA5KSArIChwaW4gLSAxKSkgJiAzOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDEzeHgvaXE4MTM0MG1jLmMgYi9hcmNoL2FybS9tYWNoLWlvcDEzeHgvaXE4MTM0MG1jLmMKaW5kZXggOWI1YTYzZi4uMjNkZmFmZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L2lxODEzNDBtYy5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9pcTgxMzQwbWMuYwpAQCAtMzAsNyArMzAsNyBAQAogZXh0ZXJuIGludCBpbml0X2F0dTsgLyogRmxhZyB0byBzZWxlY3Qgd2hpY2ggQVRVKHMpIHRvIGluaXRpYWxpemUgLyBkaXNhYmxlICovCiAKIHN0YXRpYyBpbnQgX19pbml0Ci1pcTgxMzQwbWNfcGNpeF9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IGlkc2VsLCB1OCBwaW4pCitpcTgxMzQwbWNfcGNpeF9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IGlkc2VsLCB1OCBwaW4pCiB7CiAJc3dpdGNoIChpZHNlbCkgewogCWNhc2UgMToKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9wY2kuYyBiL2FyY2gvYXJtL21hY2gtaW9wMTN4eC9wY2kuYwppbmRleCAwNjkwYjFkLi4yNTFjNDA4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDEzeHgvcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AxM3h4L3BjaS5jCkBAIC0zODgsNyArMzg4LDcgQEAKIH0KIAogc3RhdGljIGludAotaW9wMTN4eF9wY2llX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggaWRzZWwsIHU4IHBpbikKK2lvcDEzeHhfcGNpZV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IGlkc2VsLCB1OCBwaW4pCiB7CiAJV0FSTl9PTihpZHNlbCAhPSAwKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvZW03MjEwLmMgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9lbTcyMTAuYwppbmRleCA3NzlmOTI0Li42Y2JmZmJmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9lbTcyMTAuYworKysgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9lbTcyMTAuYwpAQCAtODEsNyArODEsNyBAQAogI2RlZmluZSBJTlRECUlSUV9JT1AzMlhfWElOVDMKIAogc3RhdGljIGludCBfX2luaXQKLWVtNzIxMF9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitlbTcyMTBfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0YXRpYyBpbnQgcGNpX2lycV90YWJsZVtdWzRdID0gewogCQkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvZ2xhbnRhbmsuYyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2dsYW50YW5rLmMKaW5kZXggYzZiNmY5Yy4uY2VlZjVkNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvZ2xhbnRhbmsuYworKysgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9nbGFudGFuay5jCkBAIC03Nyw3ICs3Nyw3IEBACiAjZGVmaW5lIElOVEQJSVJRX0lPUDMyWF9YSU5UMwogCiBzdGF0aWMgaW50IF9faW5pdAotZ2xhbnRhbmtfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorZ2xhbnRhbmtfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0YXRpYyBpbnQgcGNpX2lycV90YWJsZVtdWzRdID0gewogCQkvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvaXEzMTI0NC5jIGIvYXJjaC9hcm0vbWFjaC1pb3AzMngvaXEzMTI0NC5jCmluZGV4IGZkZTk2MmMuLjNhNjI1MTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2lxMzEyNDQuYworKysgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9pcTMxMjQ0LmMKQEAgLTEwMyw3ICsxMDMsNyBAQAogICogRVA4MDIxOS9JUTMxMjQ0IFBDSS4KICAqLwogc3RhdGljIGludCBfX2luaXQKLWVwODAyMTlfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorZXA4MDIxOV9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaW50IGlycTsKIApAQCAtMTM5LDcgKzEzOSw3IEBACiB9OwogCiBzdGF0aWMgaW50IF9faW5pdAotaXEzMTI0NF9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitpcTMxMjQ0X3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpbnQgaXJxOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlvcDMyeC9pcTgwMzIxLmMgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9pcTgwMzIxLmMKaW5kZXggM2E5NTk1MC4uMzViN2U2OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pb3AzMngvaXE4MDMyMS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW9wMzJ4L2lxODAzMjEuYwpAQCAtNzEsNyArNzEsNyBAQAogICogSVE4MDMyMSBQQ0kuCiAgKi8KIHN0YXRpYyBpbnQgX19pbml0Ci1pcTgwMzIxX3BjaV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK2lxODAzMjFfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWludCBpcnE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L24yMTAwLmMgYi9hcmNoL2FybS9tYWNoLWlvcDMyeC9uMjEwMC5jCmluZGV4IDYyNmFhMzcuLjFhMzc0ZWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMzJ4L24yMTAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzMngvbjIxMDAuYwpAQCAtNzgsNyArNzgsNyBAQAogICogTjIxMDAgUENJLgogICovCiBzdGF0aWMgaW50IF9faW5pdAotbjIxMDBfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorbjIxMDBfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWludCBpcnE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW9wMzN4L2lxODAzMzEuYyBiL2FyY2gvYXJtL21hY2gtaW9wMzN4L2lxODAzMzEuYwppbmRleCBjNTY1ZjhkLi42MzdjMDI3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlvcDMzeC9pcTgwMzMxLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pb3AzM3gvaXE4MDMzMS5jCkBAIC01NCw3ICs1NCw3IEBACiAgKiBJUTgwMzMxIFBDSS4KICAqLwogc3RhdGljIGludCBfX2luaXQKLWlxODAzMzFfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQoraXE4MDMzMV9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaW50IGlycTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pb3AzM3gvaXE4MDMzMi5jIGIvYXJjaC9hcm0vbWFjaC1pb3AzM3gvaXE4MDMzMi5jCmluZGV4IDM2YTllZmIuLjkwYTA0MzYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW9wMzN4L2lxODAzMzIuYworKysgYi9hcmNoL2FybS9tYWNoLWlvcDMzeC9pcTgwMzMyLmMKQEAgLTU0LDcgKzU0LDcgQEAKICAqIElRODAzMzIgUENJLgogICovCiBzdGF0aWMgaW50IF9faW5pdAotaXE4MDMzMl9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitpcTgwMzMyX3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpbnQgaXJxOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvZW5wMjYxMS5jIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2VucDI2MTEuYwppbmRleCA4ODY2M2FiLi42MmM2MGFkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvZW5wMjYxMS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9lbnAyNjExLmMKQEAgLTE0OCw3ICsxNDgsOCBAQAogCXJldHVybiBwY2lfc2Nhbl9idXMoc3lzLT5idXNuciwgJmVucDI2MTFfcGNpX29wcywgc3lzKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgZW5wMjYxMV9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBlbnAyNjExX3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsCisJdTggcGluKQogewogCWludCBpcnE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjQwMC5jIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyNDAwLmMKaW5kZXggZGZmZmMxZS4uNWJhZDFhOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyNDAwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHAyMDAwL2l4ZHAyNDAwLmMKQEAgLTc4LDcgKzc4LDggQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgaXhkcDI0MDBfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgaXhkcDI0MDBfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwKKwl1OCBwaW4pCiB7CiAJaWYgKGl4ZHAyeDAwX21hc3Rlcl9ucHUoKSkgewogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDI4MDAuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjgwMC5jCmluZGV4IGNkNGM5YmMuLjNkM2NlZjggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjgwMC5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMjgwMC5jCkBAIC0xNjEsNyArMTYxLDggQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgaXhkcDI4MDBfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgaXhkcDI4MDBfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwKKwl1OCBwaW4pCiB7CiAJaWYgKGl4ZHAyeDAwX21hc3Rlcl9ucHUoKSkgewogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDIwMDAvaXhkcDJ4MDEuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMS5jCmluZGV4IDg0ODM1YjIuLmJlMmEyNTQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwMjAwMC9peGRwMngwMS5jCkBAIC0yNTIsNyArMjUyLDggQEAKIAogI2RlZmluZSBERVZQSU4oZGV2LCBwaW4pICgocGluKSB8ICgoZGV2KSA8PCAzKSkKIAotc3RhdGljIGludCBfX2luaXQgaXhkcDJ4MDFfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgaXhkcDJ4MDFfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwKKwl1OCBwaW4pCiB7CiAJdTggYnVzID0gZGV2LT5idXMtPm51bWJlcjsKIAl1MzIgZGV2cGluID0gREVWUElOKFBDSV9TTE9UKGRldi0+ZGV2Zm4pLCBwaW4pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyM3h4L2l4ZHAyMzUxLmMgYi9hcmNoL2FybS9tYWNoLWl4cDIzeHgvaXhkcDIzNTEuYwppbmRleCA4ZGNiYTE3Li5lYzAyOGUzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDIzeHgvaXhkcDIzNTEuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIzeHgvaXhkcDIzNTEuYwpAQCAtMTY4LDcgKzE2OCw3IEBACiAgKi8KICNkZWZpbmUgREVWUElOKGRldiwgcGluKSAoKHBpbikgfCAoKGRldikgPDwgMykpCiAKLXN0YXRpYyBpbnQgX19pbml0IGl4ZHAyMzUxX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgaXhkcDIzNTFfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJdTggYnVzID0gZGV2LT5idXMtPm51bWJlcjsKIAl1MzIgZGV2cGluID0gREVWUElOKFBDSV9TTE9UKGRldi0+ZGV2Zm4pLCBwaW4pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHAyM3h4L3JvYWRydW5uZXIuYyBiL2FyY2gvYXJtL21hY2gtaXhwMjN4eC9yb2FkcnVubmVyLmMKaW5kZXggOGZlMGM2Mi4uODQ0NTUxZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHAyM3h4L3JvYWRydW5uZXIuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDIzeHgvcm9hZHJ1bm5lci5jCkBAIC01Niw3ICs1Niw4IEBACiAjZGVmaW5lIElOVENfUElOCUlYUDIzWFhfR1BJT19QSU5fMTEKICNkZWZpbmUgSU5URF9QSU4JSVhQMjNYWF9HUElPX1BJTl8xMgogCi1zdGF0aWMgaW50IF9faW5pdCByb2FkcnVubmVyX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggaWRzZWwsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IHJvYWRydW5uZXJfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBpZHNlbCwKKwl1OCBwaW4pCiB7CiAJc3RhdGljIGludCBwY2lfY2FyZF9zbG90X2lycVtdID0ge0lOVEIsIElOVEMsIElOVEQsIElOVEF9OwogCXN0YXRpYyBpbnQgcG1jX2NhcmRfc2xvdF9pcnFbXSA9IHtJTlRBLCBJTlRCLCBJTlRDLCBJTlREfTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2F2aWxhLXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvYXZpbGEtcGNpLmMKaW5kZXggMTYyMDQzZi4uOGZlYTBhMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvYXZpbGEtcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvYXZpbGEtcGNpLmMKQEAgLTQ2LDcgKzQ2LDcgQEAKIAlpeHA0eHhfcGNpX3ByZWluaXQoKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgYXZpbGFfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBhdmlsYV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdGF0aWMgaW50IHBjaV9pcnFfdGFibGVbSVJRX0xJTkVTXSA9IHsKIAkJSVhQNFhYX0dQSU9fSVJRKElOVEEpLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvY295b3RlLXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvY295b3RlLXBjaS5jCmluZGV4IDM3ZmRhN2QuLjcxZjVjOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NveW90ZS1wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb3lvdGUtcGNpLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAlpeHA0eHhfcGNpX3ByZWluaXQoKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgY295b3RlX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgY295b3RlX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWlmIChzbG90ID09IFNMT1QwX0RFVklEKQogCQlyZXR1cm4gSVhQNFhYX0dQSU9fSVJRKFNMT1QwX0lOVEEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZHNtZzYwMC1wY2kuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2RzbWc2MDAtcGNpLmMKaW5kZXggYzc2MTIwMS4uMDUzMjUxMCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZHNtZzYwMC1wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9kc21nNjAwLXBjaS5jCkBAIC00NCw3ICs0NCw3IEBACiAJaXhwNHh4X3BjaV9wcmVpbml0KCk7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGRzbWc2MDBfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBkc21nNjAwX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0YXRpYyBpbnQgcGNpX2lycV90YWJsZVtNQVhfREVWXVtJUlFfTElORVNdID0gewogCQl7IElYUDRYWF9HUElPX0lSUShJTlRFKSwgLTEsIC0xIH0sCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9mc2ctcGNpLmMgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9mc2ctcGNpLmMKaW5kZXggNDRjY2RlOS4uZDJhYzgwMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZnNnLXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2ZzZy1wY2kuYwpAQCAtMzgsNyArMzgsNyBAQAogCWl4cDR4eF9wY2lfcHJlaW5pdCgpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBmc2dfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBmc2dfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RhdGljIGludCBwY2lfaXJxX3RhYmxlW0lSUV9MSU5FU10gPSB7CiAJCUlYUDRYWF9HUElPX0lSUShJTlRDKSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2dhdGV3YXk3MDAxLXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ2F0ZXdheTcwMDEtcGNpLmMKaW5kZXggZmMxMTI0MS4uNzY1ODFmYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ2F0ZXdheTcwMDEtcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ2F0ZXdheTcwMDEtcGNpLmMKQEAgLTM1LDcgKzM1LDggQEAKIAlpeHA0eHhfcGNpX3ByZWluaXQoKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgZ2F0ZXdheTcwMDFfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBnYXRld2F5NzAwMV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsCisJdTggcGluKQogewogCWlmIChzbG90ID09IDEpCiAJCXJldHVybiBJUlFfSVhQNFhYX0dQSU8xMTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2dvcmFtb19tbHIuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2dvcmFtb19tbHIuYwppbmRleCA1ZjAwYWQyLi43NTQ4ZDlhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9nb3JhbW9fbWxyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvZ29yYW1vX21sci5jCkBAIC00NjIsNyArNDYyLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGdtbHJfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBnbWxyX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN3aXRjaChzbG90KSB7CiAJY2FzZSBTTE9UX0VUSEE6CXJldHVybiBJWFA0WFhfR1BJT19JUlEoR1BJT19JUlFfRVRIQSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9ndHd4NTcxNS1wY2kuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2d0d3g1NzE1LXBjaS5jCmluZGV4IDM4Y2MwNzIuLmQ2OGZjMDYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2d0d3g1NzE1LXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2d0d3g1NzE1LXBjaS5jCkBAIC00OSw3ICs0OSw3IEBACiB9CiAKIAotc3RhdGljIGludCBfX2luaXQgZ3R3eDU3MTVfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBndHd4NTcxNV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpbnQgcmMgPSAtMTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcDQyNS1wY2kuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHA0MjUtcGNpLmMKaW5kZXggNThmNDAwNC4uZmZmZDhjNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvaXhkcDQyNS1wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwNDI1LXBjaS5jCkBAIC00Myw3ICs0Myw3IEBACiAJaXhwNHh4X3BjaV9wcmVpbml0KCk7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGl4ZHA0MjVfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBpeGRwNDI1X21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0YXRpYyBpbnQgcGNpX2lycV90YWJsZVtJUlFfTElORVNdID0gewogCQlJWFA0WFhfR1BJT19JUlEoSU5UQSksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9peGRwZzQyNS1wY2kuYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHBnNDI1LXBjaS5jCmluZGV4IGU2NGY2ZDAuLjM0ZWZlNzUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHBnNDI1LXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2l4ZHBnNDI1LXBjaS5jCkBAIC0zMSw3ICszMSw3IEBACiAJaXhwNHh4X3BjaV9wcmVpbml0KCk7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IGl4ZHBnNDI1X21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgaXhkcGc0MjVfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaWYgKHNsb3QgPT0gMTIgfHwgc2xvdCA9PSAxMykKIAkJcmV0dXJuIElSUV9JWFA0WFhfR1BJTzc7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9uYXMxMDBkLXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvbmFzMTAwZC1wY2kuYwppbmRleCA0MjhkMTIwLi41NDM0Y2NmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9uYXMxMDBkLXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L25hczEwMGQtcGNpLmMKQEAgLTQxLDcgKzQxLDcgQEAKIAlpeHA0eHhfcGNpX3ByZWluaXQoKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgbmFzMTAwZF9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IG5hczEwMGRfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RhdGljIGludCBwY2lfaXJxX3RhYmxlW01BWF9ERVZdW0lSUV9MSU5FU10gPSB7CiAJCXsgSVhQNFhYX0dQSU9fSVJRKElOVEEpLCAtMSwgLTEgfSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L25zbHUyLXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvbnNsdTItcGNpLmMKaW5kZXggMmU4NWY3Ni4uYjU3MTYwNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvbnNsdTItcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvbnNsdTItcGNpLmMKQEAgLTM4LDcgKzM4LDcgQEAKIAlpeHA0eHhfcGNpX3ByZWluaXQoKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgbnNsdTJfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBuc2x1Ml9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlzdGF0aWMgaW50IHBjaV9pcnFfdGFibGVbSVJRX0xJTkVTXSA9IHsKIAkJSVhQNFhYX0dQSU9fSVJRKElOVEEpLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1peHA0eHgvdnVsY2FuLXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvdnVsY2FuLXBjaS5jCmluZGV4IDAzYmRlYzUuLjBiYzNmMzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L3Z1bGNhbi1wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLWl4cDR4eC92dWxjYW4tcGNpLmMKQEAgLTQzLDcgKzQzLDcgQEAKIAlpeHA0eHhfcGNpX3ByZWluaXQoKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgdnVsY2FuX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgdnVsY2FuX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWlmIChzbG90ID09IDEpCiAJCXJldHVybiBJWFA0WFhfR1BJT19JUlEoSU5UQSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC93ZzMwMnYyLXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1peHA0eHgvd2czMDJ2Mi1wY2kuYwppbmRleCAxN2YzY2Y1Li5mMjdkZmNmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWl4cDR4eC93ZzMwMnYyLXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L3dnMzAydjItcGNpLmMKQEAgLTM1LDcgKzM1LDcgQEAKIAlpeHA0eHhfcGNpX3ByZWluaXQoKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgd2czMDJ2Ml9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IHdnMzAydjJfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaWYgKHNsb3QgPT0gMSkKIAkJcmV0dXJuIElSUV9JWFA0WFhfR1BJTzg7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtpcmt3b29kL3BjaWUuYyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvcGNpZS5jCmluZGV4IGJmZWI5YzkuLjc0Yjk5MmQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta2lya3dvb2QvcGNpZS5jCisrKyBiL2FyY2gvYXJtL21hY2gta2lya3dvb2QvcGNpZS5jCkBAIC0yNDUsNyArMjQ1LDggQEAKIAlyZXR1cm4gYnVzOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBraXJrd29vZF9wY2llX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQga2lya3dvb2RfcGNpZV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsCisJdTggcGluKQogewogCXN0cnVjdCBwY2llX3BvcnQgKnBwID0gYnVzX3RvX3BvcnQoZGV2LT5idXMpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWtzODY5NS9ib2FyZC1kc20zMjAuYyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L2JvYXJkLWRzbTMyMC5jCmluZGV4IGFkYTkyYjYuLjEzMzhjYjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2JvYXJkLWRzbTMyMC5jCisrKyBiL2FyY2gvYXJtL21hY2gta3M4Njk1L2JvYXJkLWRzbTMyMC5jCkBAIC0zNCw3ICszNCw3IEBACiAjaW5jbHVkZSAiZ2VuZXJpYy5oIgogCiAjaWZkZWYgQ09ORklHX1BDSQotc3RhdGljIGludCBkc20zMjBfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBkc20zMjBfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN3aXRjaCAoc2xvdCkgewogCWNhc2UgMDoKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2JvYXJkLW1pY3JlbC5jIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvYm9hcmQtbWljcmVsLmMKaW5kZXggYzdhZDA5Yi4uZTJlM2NiYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1rczg2OTUvYm9hcmQtbWljcmVsLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvYm9hcmQtbWljcmVsLmMKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlICJnZW5lcmljLmgiCiAKICNpZmRlZiBDT05GSUdfUENJCi1zdGF0aWMgaW50IG1pY3JlbF9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IG1pY3JlbF9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJcmV0dXJuIEtTODY5NV9JUlFfRVhURVJOMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2luY2x1ZGUvbWFjaC9kZXZpY2VzLmggYi9hcmNoL2FybS9tYWNoLWtzODY5NS9pbmNsdWRlL21hY2gvZGV2aWNlcy5oCmluZGV4IDI3NDRmZWMuLjg1YTNjOWEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gta3M4Njk1L2luY2x1ZGUvbWFjaC9kZXZpY2VzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1rczg2OTUvaW5jbHVkZS9tYWNoL2RldmljZXMuaApAQCAtMzAsNyArMzAsNyBAQAogCiBzdHJ1Y3Qga3M4Njk1X3BjaV9jZmcgewogCXNob3J0IG1vZGU7Ci0JaW50ICgqbWFwX2lycSkoc3RydWN0IHBjaV9kZXYgKiwgdTgsIHU4KTsKKwlpbnQgKCptYXBfaXJxKShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqLCB1OCwgdTgpOwogfTsKIGV4dGVybiBfX2luaXQgdm9pZCBrczg2OTVfaW5pdF9wY2koc3RydWN0IGtzODY5NV9wY2lfY2ZnICopOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC1tc20vS2NvbmZpZwppbmRleCA4ODhlOTI1Li5lYmRlOTdmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL0tjb25maWcKQEAgLTExLDYgKzExLDcgQEAKIAlzZWxlY3QgTVNNX1NNRAogCXNlbGVjdCBNU01fU01EX1BLRzMKIAlzZWxlY3QgQ1BVX1Y2CisJc2VsZWN0IEdQSU9fTVNNX1YxCiAJc2VsZWN0IE1TTV9QUk9DX0NPTU0KIAlzZWxlY3QgSEFTX01TTV9ERUJVR19VQVJUX1BIWVMKIApAQCAtMjIsNiArMjMsNyBAQAogCXNlbGVjdCBNU01fVklDCiAJc2VsZWN0IENQVV9WNwogCXNlbGVjdCBNU01fR1BJT01VWAorCXNlbGVjdCBHUElPX01TTV9WMQogCXNlbGVjdCBNU01fUFJPQ19DT01NCiAJc2VsZWN0IEhBU19NU01fREVCVUdfVUFSVF9QSFlTCiAKQEAgLTMzLDYgKzM1LDcgQEAKIAlzZWxlY3QgTVNNX1ZJQwogCXNlbGVjdCBDUFVfVjcKIAlzZWxlY3QgTVNNX0dQSU9NVVgKKwlzZWxlY3QgR1BJT19NU01fVjEKIAlzZWxlY3QgTVNNX1BST0NfQ09NTQogCXNlbGVjdCBIQVNfTVNNX0RFQlVHX1VBUlRfUEhZUwogCkBAIC00NCw2ICs0Nyw3IEBACiAJc2VsZWN0IEFSTV9HSUMKIAlzZWxlY3QgQ1BVX1Y3CiAJc2VsZWN0IE1TTV9WMl9UTE1NCisJc2VsZWN0IEdQSU9fTVNNX1YyCiAJc2VsZWN0IE1TTV9HUElPTVVYCiAJc2VsZWN0IE1TTV9TQ00gaWYgU01QCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC1tc20vTWFrZWZpbGUKaW5kZXggYjcwNjU4Yy4uNDI4NWRmZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vTWFrZWZpbGUKQEAgLTI5LDExICsyOSwzIEBACiBvYmotJChDT05GSUdfQVJDSF9NU003WDMwKSArPSBncGlvbXV4LXYxLm8gZ3Bpb211eC5vCiBvYmotJChDT05GSUdfQVJDSF9RU0Q4WDUwKSArPSBncGlvbXV4LTh4NTAubyBncGlvbXV4LXYxLm8gZ3Bpb211eC5vCiBvYmotJChDT05GSUdfQVJDSF9NU004WDYwKSArPSBncGlvbXV4LTh4NjAubyBncGlvbXV4LXYyLm8gZ3Bpb211eC5vCi1pZmRlZiBDT05GSUdfTVNNX1YyX1RMTU0KLWlmbmRlZiBDT05GSUdfQVJDSF9NU004OTYwCi0jIFRPRE86IFRMTU0gTWFwcGluZyBpc3N1ZXMgbmVlZCB0byBiZSByZXNvbHZlZAotb2JqLXkJKz0gZ3Bpby12Mi5vCi1lbmRpZgotZWxzZQotb2JqLXkJKz0gZ3Bpby5vCi1lbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vZ3Bpby5jIGIvYXJjaC9hcm0vbWFjaC1tc20vZ3Bpby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWEyNzNiLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2dwaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDM3NiArMCwwIEBACi0vKiBsaW51eC9hcmNoL2FybS9tYWNoLW1zbS9ncGlvLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgR29vZ2xlLCBJbmMuCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDktMjAxMCwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKLSAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgImdwaW9faHcuaCIKLSNpbmNsdWRlICJncGlvbXV4LmgiCi0KLSNkZWZpbmUgRklSU1RfR1BJT19JUlEgTVNNX0dQSU9fVE9fSU5UKDApCi0KLSNkZWZpbmUgTVNNX0dQSU9fQkFOSyhiYW5rLCBmaXJzdCwgbGFzdCkJCQkJXAotCXsJCQkJCQkJCVwKLQkJLnJlZ3MgPSB7CQkJCQkJXAotCQkJLm91dCA9ICAgICAgICAgTVNNX0dQSU9fT1VUXyMjYmFuaywJCVwKLQkJCS5pbiA9ICAgICAgICAgIE1TTV9HUElPX0lOXyMjYmFuaywJCVwKLQkJCS5pbnRfc3RhdHVzID0gIE1TTV9HUElPX0lOVF9TVEFUVVNfIyNiYW5rLAlcCi0JCQkuaW50X2NsZWFyID0gICBNU01fR1BJT19JTlRfQ0xFQVJfIyNiYW5rLAlcCi0JCQkuaW50X2VuID0gICAgICBNU01fR1BJT19JTlRfRU5fIyNiYW5rLAkJXAotCQkJLmludF9lZGdlID0gICAgTVNNX0dQSU9fSU5UX0VER0VfIyNiYW5rLAlcCi0JCQkuaW50X3BvcyA9ICAgICBNU01fR1BJT19JTlRfUE9TXyMjYmFuaywJCVwKLQkJCS5vZSA9ICAgICAgICAgIE1TTV9HUElPX09FXyMjYmFuaywJCVwKLQkJfSwJCQkJCQkJXAotCQkuY2hpcCA9IHsJCQkJCQlcCi0JCQkuYmFzZSA9IChmaXJzdCksCQkJCVwKLQkJCS5uZ3BpbyA9IChsYXN0KSAtIChmaXJzdCkgKyAxLAkJCVwKLQkJCS5nZXQgPSBtc21fZ3Bpb19nZXQsCQkJCVwKLQkJCS5zZXQgPSBtc21fZ3Bpb19zZXQsCQkJCVwKLQkJCS5kaXJlY3Rpb25faW5wdXQgPSBtc21fZ3Bpb19kaXJlY3Rpb25faW5wdXQsCVwKLQkJCS5kaXJlY3Rpb25fb3V0cHV0ID0gbXNtX2dwaW9fZGlyZWN0aW9uX291dHB1dCwJXAotCQkJLnRvX2lycSA9IG1zbV9ncGlvX3RvX2lycSwJCQlcCi0JCQkucmVxdWVzdCA9IG1zbV9ncGlvX3JlcXVlc3QsCQkJXAotCQkJLmZyZWUgPSBtc21fZ3Bpb19mcmVlLAkJCQlcCi0JCX0JCQkJCQkJXAotCX0KLQotI2RlZmluZSBNU01fR1BJT19CUk9LRU5fSU5UX0NMRUFSIDEKLQotc3RydWN0IG1zbV9ncGlvX3JlZ3MgewotCXZvaWQgX19pb21lbSAqb3V0OwotCXZvaWQgX19pb21lbSAqaW47Ci0Jdm9pZCBfX2lvbWVtICppbnRfc3RhdHVzOwotCXZvaWQgX19pb21lbSAqaW50X2NsZWFyOwotCXZvaWQgX19pb21lbSAqaW50X2VuOwotCXZvaWQgX19pb21lbSAqaW50X2VkZ2U7Ci0Jdm9pZCBfX2lvbWVtICppbnRfcG9zOwotCXZvaWQgX19pb21lbSAqb2U7Ci19OwotCi1zdHJ1Y3QgbXNtX2dwaW9fY2hpcCB7Ci0Jc3BpbmxvY2tfdAkJbG9jazsKLQlzdHJ1Y3QgZ3Bpb19jaGlwCWNoaXA7Ci0Jc3RydWN0IG1zbV9ncGlvX3JlZ3MJcmVnczsKLSNpZiBNU01fR1BJT19CUk9LRU5fSU5UX0NMRUFSCi0JdW5zaWduZWQgICAgICAgICAgICAgICAgaW50X3N0YXR1c19jb3B5OwotI2VuZGlmCi0JdW5zaWduZWQgaW50ICAgICAgICAgICAgYm90aF9lZGdlX2RldGVjdDsKLQl1bnNpZ25lZCBpbnQgICAgICAgICAgICBpbnRfZW5hYmxlWzJdOyAvKiAwOiBhd2FrZSwgMTogc2xlZXAgKi8KLX07Ci0KLXN0YXRpYyBpbnQgbXNtX2dwaW9fd3JpdGUoc3RydWN0IG1zbV9ncGlvX2NoaXAgKm1zbV9jaGlwLAotCQkJICB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIG9uKQotewotCXVuc2lnbmVkIG1hc2sgPSBCSVQob2Zmc2V0KTsKLQl1bnNpZ25lZCB2YWw7Ci0KLQl2YWwgPSByZWFkbChtc21fY2hpcC0+cmVncy5vdXQpOwotCWlmIChvbikKLQkJd3JpdGVsKHZhbCB8IG1hc2ssIG1zbV9jaGlwLT5yZWdzLm91dCk7Ci0JZWxzZQotCQl3cml0ZWwodmFsICYgfm1hc2ssIG1zbV9jaGlwLT5yZWdzLm91dCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9ncGlvX3VwZGF0ZV9ib3RoX2VkZ2VfZGV0ZWN0KHN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcCkKLXsKLQlpbnQgbG9vcF9saW1pdCA9IDEwMDsKLQl1bnNpZ25lZCBwb2wsIHZhbCwgdmFsMiwgaW50c3RhdDsKLQlkbyB7Ci0JCXZhbCA9IHJlYWRsKG1zbV9jaGlwLT5yZWdzLmluKTsKLQkJcG9sID0gcmVhZGwobXNtX2NoaXAtPnJlZ3MuaW50X3Bvcyk7Ci0JCXBvbCA9IChwb2wgJiB+bXNtX2NoaXAtPmJvdGhfZWRnZV9kZXRlY3QpIHwKLQkJICAgICAgKH52YWwgJiBtc21fY2hpcC0+Ym90aF9lZGdlX2RldGVjdCk7Ci0JCXdyaXRlbChwb2wsIG1zbV9jaGlwLT5yZWdzLmludF9wb3MpOwotCQlpbnRzdGF0ID0gcmVhZGwobXNtX2NoaXAtPnJlZ3MuaW50X3N0YXR1cyk7Ci0JCXZhbDIgPSByZWFkbChtc21fY2hpcC0+cmVncy5pbik7Ci0JCWlmICgoKHZhbCBeIHZhbDIpICYgbXNtX2NoaXAtPmJvdGhfZWRnZV9kZXRlY3QgJiB+aW50c3RhdCkgPT0gMCkKLQkJCXJldHVybjsKLQl9IHdoaWxlIChsb29wX2xpbWl0LS0gPiAwKTsKLQlwcmludGsoS0VSTl9FUlIgIm1zbV9ncGlvX3VwZGF0ZV9ib3RoX2VkZ2VfZGV0ZWN0LCAiCi0JICAgICAgICJmYWlsZWQgdG8gcmVhY2ggc3RhYmxlIHN0YXRlICV4ICE9ICV4XG4iLCB2YWwsIHZhbDIpOwotfQotCi1zdGF0aWMgaW50IG1zbV9ncGlvX2NsZWFyX2RldGVjdF9zdGF0dXMoc3RydWN0IG1zbV9ncGlvX2NoaXAgKm1zbV9jaGlwLAotCQkJCQl1bnNpZ25lZCBvZmZzZXQpCi17Ci0JdW5zaWduZWQgYml0ID0gQklUKG9mZnNldCk7Ci0KLSNpZiBNU01fR1BJT19CUk9LRU5fSU5UX0NMRUFSCi0JLyogU2F2ZSBpbnRlcnJ1cHRzIHRoYXQgYWxyZWFkeSB0cmlnZ2VyZWQgYmVmb3JlIHdlIGxvb3NlIHRoZW0uICovCi0JLyogQW55IGludGVycnVwdCB0aGF0IHRyaWdnZXJzIGJldHdlZW4gdGhlIHJlYWQgb2YgaW50X3N0YXR1cyAqLwotCS8qIGFuZCB0aGUgd3JpdGUgdG8gaW50X2NsZWFyIHdpbGwgc3RpbGwgYmUgbG9zdCB0aG91Z2guICovCi0JbXNtX2NoaXAtPmludF9zdGF0dXNfY29weSB8PSByZWFkbChtc21fY2hpcC0+cmVncy5pbnRfc3RhdHVzKTsKLQltc21fY2hpcC0+aW50X3N0YXR1c19jb3B5ICY9IH5iaXQ7Ci0jZW5kaWYKLQl3cml0ZWwoYml0LCBtc21fY2hpcC0+cmVncy5pbnRfY2xlYXIpOwotCW1zbV9ncGlvX3VwZGF0ZV9ib3RoX2VkZ2VfZGV0ZWN0KG1zbV9jaGlwKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtc21fZ3Bpb19kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcDsKLQl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKLQotCW1zbV9jaGlwID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBtc21fZ3Bpb19jaGlwLCBjaGlwKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7Ci0Jd3JpdGVsKHJlYWRsKG1zbV9jaGlwLT5yZWdzLm9lKSAmIH5CSVQob2Zmc2V0KSwgbXNtX2NoaXAtPnJlZ3Mub2UpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1tc21fZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQotewotCXN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcDsKLQl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKLQotCW1zbV9jaGlwID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBtc21fZ3Bpb19jaGlwLCBjaGlwKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7Ci0JbXNtX2dwaW9fd3JpdGUobXNtX2NoaXAsIG9mZnNldCwgdmFsdWUpOwotCXdyaXRlbChyZWFkbChtc21fY2hpcC0+cmVncy5vZSkgfCBCSVQob2Zmc2V0KSwgbXNtX2NoaXAtPnJlZ3Mub2UpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0Jc3RydWN0IG1zbV9ncGlvX2NoaXAgKm1zbV9jaGlwOwotCi0JbXNtX2NoaXAgPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IG1zbV9ncGlvX2NoaXAsIGNoaXApOwotCXJldHVybiAocmVhZGwobXNtX2NoaXAtPnJlZ3MuaW4pICYgKDFVIDw8IG9mZnNldCkpID8gMSA6IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zbV9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKLXsKLQlzdHJ1Y3QgbXNtX2dwaW9fY2hpcCAqbXNtX2NoaXA7Ci0JdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7Ci0KLQltc21fY2hpcCA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgbXNtX2dwaW9fY2hpcCwgY2hpcCk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOwotCW1zbV9ncGlvX3dyaXRlKG1zbV9jaGlwLCBvZmZzZXQsIHZhbHVlKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc21fY2hpcC0+bG9jaywgaXJxX2ZsYWdzKTsKLX0KLQotc3RhdGljIGludCBtc21fZ3Bpb190b19pcnEoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQotewotCXJldHVybiBNU01fR1BJT19UT19JTlQoY2hpcC0+YmFzZSArIG9mZnNldCk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfTVNNX0dQSU9NVVgKLXN0YXRpYyBpbnQgbXNtX2dwaW9fcmVxdWVzdChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0JcmV0dXJuIG1zbV9ncGlvbXV4X2dldChjaGlwLT5iYXNlICsgb2Zmc2V0KTsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2dwaW9fZnJlZShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCi17Ci0JbXNtX2dwaW9tdXhfcHV0KGNoaXAtPmJhc2UgKyBvZmZzZXQpOwotfQotI2Vsc2UKLSNkZWZpbmUgbXNtX2dwaW9fcmVxdWVzdCBOVUxMCi0jZGVmaW5lIG1zbV9ncGlvX2ZyZWUgTlVMTAotI2VuZGlmCi0KLXN0cnVjdCBtc21fZ3Bpb19jaGlwIG1zbV9ncGlvX2NoaXBzW10gPSB7Ci0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9NU003WDAwQSkKLQlNU01fR1BJT19CQU5LKDAsICAgMCwgIDE1KSwKLQlNU01fR1BJT19CQU5LKDEsICAxNiwgIDQyKSwKLQlNU01fR1BJT19CQU5LKDIsICA0MywgIDY3KSwKLQlNU01fR1BJT19CQU5LKDMsICA2OCwgIDk0KSwKLQlNU01fR1BJT19CQU5LKDQsICA5NSwgMTA2KSwKLQlNU01fR1BJT19CQU5LKDUsIDEwNywgMTIxKSwKLSNlbGlmIGRlZmluZWQoQ09ORklHX0FSQ0hfTVNNN1gyNSkgfHwgZGVmaW5lZChDT05GSUdfQVJDSF9NU003WDI3KQotCU1TTV9HUElPX0JBTksoMCwgICAwLCAgMTUpLAotCU1TTV9HUElPX0JBTksoMSwgIDE2LCAgNDIpLAotCU1TTV9HUElPX0JBTksoMiwgIDQzLCAgNjcpLAotCU1TTV9HUElPX0JBTksoMywgIDY4LCAgOTQpLAotCU1TTV9HUElPX0JBTksoNCwgIDk1LCAxMDYpLAotCU1TTV9HUElPX0JBTksoNSwgMTA3LCAxMzIpLAotI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9NU003WDMwKQotCU1TTV9HUElPX0JBTksoMCwgICAwLCAgMTUpLAotCU1TTV9HUElPX0JBTksoMSwgIDE2LCAgNDMpLAotCU1TTV9HUElPX0JBTksoMiwgIDQ0LCAgNjcpLAotCU1TTV9HUElPX0JBTksoMywgIDY4LCAgOTQpLAotCU1TTV9HUElPX0JBTksoNCwgIDk1LCAxMDYpLAotCU1TTV9HUElPX0JBTksoNSwgMTA3LCAxMzMpLAotCU1TTV9HUElPX0JBTksoNiwgMTM0LCAxNTApLAotCU1TTV9HUElPX0JBTksoNywgMTUxLCAxODEpLAotI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9RU0Q4WDUwKQotCU1TTV9HUElPX0JBTksoMCwgICAwLCAgMTUpLAotCU1TTV9HUElPX0JBTksoMSwgIDE2LCAgNDIpLAotCU1TTV9HUElPX0JBTksoMiwgIDQzLCAgNjcpLAotCU1TTV9HUElPX0JBTksoMywgIDY4LCAgOTQpLAotCU1TTV9HUElPX0JBTksoNCwgIDk1LCAxMDMpLAotCU1TTV9HUElPX0JBTksoNSwgMTA0LCAxMjEpLAotCU1TTV9HUElPX0JBTksoNiwgMTIyLCAxNTIpLAotCU1TTV9HUElPX0JBTksoNywgMTUzLCAxNjQpLAotI2VuZGlmCi19OwotCi1zdGF0aWMgdm9pZCBtc21fZ3Bpb19pcnFfYWNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKLXsKLQl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKLQlzdHJ1Y3QgbXNtX2dwaW9fY2hpcCAqbXNtX2NoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7Ci0JbXNtX2dwaW9fY2xlYXJfZGV0ZWN0X3N0YXR1cyhtc21fY2hpcCwKLQkJCQkgICAgIGQtPmlycSAtIGdwaW9fdG9faXJxKG1zbV9jaGlwLT5jaGlwLmJhc2UpKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc21fY2hpcC0+bG9jaywgaXJxX2ZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2dwaW9faXJxX21hc2soc3RydWN0IGlycV9kYXRhICpkKQotewotCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOwotCXN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwotCXVuc2lnbmVkIG9mZnNldCA9IGQtPmlycSAtIGdwaW9fdG9faXJxKG1zbV9jaGlwLT5jaGlwLmJhc2UpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOwotCS8qIGxldmVsIHRyaWdnZXJlZCBpbnRlcnJ1cHRzIGFyZSBhbHNvIGxhdGNoZWQgKi8KLQlpZiAoIShyZWFkbChtc21fY2hpcC0+cmVncy5pbnRfZWRnZSkgJiBCSVQob2Zmc2V0KSkpCi0JCW1zbV9ncGlvX2NsZWFyX2RldGVjdF9zdGF0dXMobXNtX2NoaXAsIG9mZnNldCk7Ci0JbXNtX2NoaXAtPmludF9lbmFibGVbMF0gJj0gfkJJVChvZmZzZXQpOwotCXdyaXRlbChtc21fY2hpcC0+aW50X2VuYWJsZVswXSwgbXNtX2NoaXAtPnJlZ3MuaW50X2VuKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc21fY2hpcC0+bG9jaywgaXJxX2ZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2dwaW9faXJxX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCi17Ci0JdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7Ci0Jc3RydWN0IG1zbV9ncGlvX2NoaXAgKm1zbV9jaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7Ci0JdW5zaWduZWQgb2Zmc2V0ID0gZC0+aXJxIC0gZ3Bpb190b19pcnEobXNtX2NoaXAtPmNoaXAuYmFzZSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7Ci0JLyogbGV2ZWwgdHJpZ2dlcmVkIGludGVycnVwdHMgYXJlIGFsc28gbGF0Y2hlZCAqLwotCWlmICghKHJlYWRsKG1zbV9jaGlwLT5yZWdzLmludF9lZGdlKSAmIEJJVChvZmZzZXQpKSkKLQkJbXNtX2dwaW9fY2xlYXJfZGV0ZWN0X3N0YXR1cyhtc21fY2hpcCwgb2Zmc2V0KTsKLQltc21fY2hpcC0+aW50X2VuYWJsZVswXSB8PSBCSVQob2Zmc2V0KTsKLQl3cml0ZWwobXNtX2NoaXAtPmludF9lbmFibGVbMF0sIG1zbV9jaGlwLT5yZWdzLmludF9lbik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7Ci19Ci0KLXN0YXRpYyBpbnQgbXNtX2dwaW9faXJxX3NldF93YWtlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IG9uKQotewotCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOwotCXN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOwotCXVuc2lnbmVkIG9mZnNldCA9IGQtPmlycSAtIGdwaW9fdG9faXJxKG1zbV9jaGlwLT5jaGlwLmJhc2UpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOwotCi0JaWYgKG9uKQotCQltc21fY2hpcC0+aW50X2VuYWJsZVsxXSB8PSBCSVQob2Zmc2V0KTsKLQllbHNlCi0JCW1zbV9jaGlwLT5pbnRfZW5hYmxlWzFdICY9IH5CSVQob2Zmc2V0KTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG1zbV9ncGlvX2lycV9zZXRfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCBmbG93X3R5cGUpCi17Ci0JdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7Ci0Jc3RydWN0IG1zbV9ncGlvX2NoaXAgKm1zbV9jaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7Ci0JdW5zaWduZWQgb2Zmc2V0ID0gZC0+aXJxIC0gZ3Bpb190b19pcnEobXNtX2NoaXAtPmNoaXAuYmFzZSk7Ci0JdW5zaWduZWQgdmFsLCBtYXNrID0gQklUKG9mZnNldCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7Ci0JdmFsID0gcmVhZGwobXNtX2NoaXAtPnJlZ3MuaW50X2VkZ2UpOwotCWlmIChmbG93X3R5cGUgJiBJUlFfVFlQRV9FREdFX0JPVEgpIHsKLQkJd3JpdGVsKHZhbCB8IG1hc2ssIG1zbV9jaGlwLT5yZWdzLmludF9lZGdlKTsKLQkJX19pcnFfc2V0X2hhbmRsZXJfbG9ja2VkKGQtPmlycSwgaGFuZGxlX2VkZ2VfaXJxKTsKLQl9IGVsc2UgewotCQl3cml0ZWwodmFsICYgfm1hc2ssIG1zbV9jaGlwLT5yZWdzLmludF9lZGdlKTsKLQkJX19pcnFfc2V0X2hhbmRsZXJfbG9ja2VkKGQtPmlycSwgaGFuZGxlX2xldmVsX2lycSk7Ci0JfQotCWlmICgoZmxvd190eXBlICYgSVJRX1RZUEVfRURHRV9CT1RIKSA9PSBJUlFfVFlQRV9FREdFX0JPVEgpIHsKLQkJbXNtX2NoaXAtPmJvdGhfZWRnZV9kZXRlY3QgfD0gbWFzazsKLQkJbXNtX2dwaW9fdXBkYXRlX2JvdGhfZWRnZV9kZXRlY3QobXNtX2NoaXApOwotCX0gZWxzZSB7Ci0JCW1zbV9jaGlwLT5ib3RoX2VkZ2VfZGV0ZWN0ICY9IH5tYXNrOwotCQl2YWwgPSByZWFkbChtc21fY2hpcC0+cmVncy5pbnRfcG9zKTsKLQkJaWYgKGZsb3dfdHlwZSAmIChJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9UUklHR0VSX0hJR0gpKQotCQkJd3JpdGVsKHZhbCB8IG1hc2ssIG1zbV9jaGlwLT5yZWdzLmludF9wb3MpOwotCQllbHNlCi0JCQl3cml0ZWwodmFsICYgfm1hc2ssIG1zbV9jaGlwLT5yZWdzLmludF9wb3MpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc21fY2hpcC0+bG9jaywgaXJxX2ZsYWdzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgbXNtX2dwaW9faXJxX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQotewotCWludCBpLCBqLCBtYXNrOwotCXVuc2lnbmVkIHZhbDsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1zbV9ncGlvX2NoaXBzKTsgaSsrKSB7Ci0JCXN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcCA9ICZtc21fZ3Bpb19jaGlwc1tpXTsKLQkJdmFsID0gcmVhZGwobXNtX2NoaXAtPnJlZ3MuaW50X3N0YXR1cyk7Ci0JCXZhbCAmPSBtc21fY2hpcC0+aW50X2VuYWJsZVswXTsKLQkJd2hpbGUgKHZhbCkgewotCQkJbWFzayA9IHZhbCAmIC12YWw7Ci0JCQlqID0gZmxzKG1hc2spIC0gMTsKLQkJCS8qIHByaW50aygiJXMgJTA4eCAlMDh4IGJpdCAlZCBncGlvICVkIGlycSAlZFxuIiwKLQkJCQlfX2Z1bmNfXywgdiwgbSwgaiwgbXNtX2NoaXAtPmNoaXAuc3RhcnQgKyBqLAotCQkJCUZJUlNUX0dQSU9fSVJRICsgbXNtX2NoaXAtPmNoaXAuc3RhcnQgKyBqKTsgKi8KLQkJCXZhbCAmPSB+bWFzazsKLQkJCWdlbmVyaWNfaGFuZGxlX2lycShGSVJTVF9HUElPX0lSUSArCi0JCQkJCSAgIG1zbV9jaGlwLT5jaGlwLmJhc2UgKyBqKTsKLQkJfQotCX0KLQlkZXNjLT5pcnFfZGF0YS5jaGlwLT5pcnFfYWNrKCZkZXNjLT5pcnFfZGF0YSk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgbXNtX2dwaW9faXJxX2NoaXAgPSB7Ci0JLm5hbWUgICAgICAgICAgPSAibXNtZ3BpbyIsCi0JLmlycV9hY2sgICAgICAgPSBtc21fZ3Bpb19pcnFfYWNrLAotCS5pcnFfbWFzayAgICAgID0gbXNtX2dwaW9faXJxX21hc2ssCi0JLmlycV91bm1hc2sgICAgPSBtc21fZ3Bpb19pcnFfdW5tYXNrLAotCS5pcnFfc2V0X3dha2UgID0gbXNtX2dwaW9faXJxX3NldF93YWtlLAotCS5pcnFfc2V0X3R5cGUgID0gbXNtX2dwaW9faXJxX3NldF90eXBlLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbXNtX2luaXRfZ3Bpbyh2b2lkKQotewotCWludCBpLCBqID0gMDsKLQotCWZvciAoaSA9IEZJUlNUX0dQSU9fSVJROyBpIDwgRklSU1RfR1BJT19JUlEgKyBOUl9HUElPX0lSUVM7IGkrKykgewotCQlpZiAoaSAtIEZJUlNUX0dQSU9fSVJRID49Ci0JCQltc21fZ3Bpb19jaGlwc1tqXS5jaGlwLmJhc2UgKwotCQkJbXNtX2dwaW9fY2hpcHNbal0uY2hpcC5uZ3BpbykKLQkJCWorKzsKLQkJaXJxX3NldF9jaGlwX2RhdGEoaSwgJm1zbV9ncGlvX2NoaXBzW2pdKTsKLQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGksICZtc21fZ3Bpb19pcnFfY2hpcCwKLQkJCQkJIGhhbmRsZV9lZGdlX2lycSk7Ci0JCXNldF9pcnFfZmxhZ3MoaSwgSVJRRl9WQUxJRCk7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXNtX2dwaW9fY2hpcHMpOyBpKyspIHsKLQkJc3Bpbl9sb2NrX2luaXQoJm1zbV9ncGlvX2NoaXBzW2ldLmxvY2spOwotCQl3cml0ZWwoMCwgbXNtX2dwaW9fY2hpcHNbaV0ucmVncy5pbnRfZW4pOwotCQlncGlvY2hpcF9hZGQoJm1zbV9ncGlvX2NoaXBzW2ldLmNoaXApOwotCX0KLQotCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKElOVF9HUElPX0dST1VQMSwgbXNtX2dwaW9faXJxX2hhbmRsZXIpOwotCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKElOVF9HUElPX0dST1VQMiwgbXNtX2dwaW9faXJxX2hhbmRsZXIpOwotCWlycV9zZXRfaXJxX3dha2UoSU5UX0dQSU9fR1JPVVAxLCAxKTsKLQlpcnFfc2V0X2lycV93YWtlKElOVF9HUElPX0dST1VQMiwgMik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXBvc3Rjb3JlX2luaXRjYWxsKG1zbV9pbml0X2dwaW8pOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vZ3Bpb19ody5oIGIvYXJjaC9hcm0vbWFjaC1tc20vZ3Bpb19ody5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjUwNjYwLi4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2dwaW9faHcuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKiBhcmNoL2FybS9tYWNoLW1zbS9ncGlvX2h3LmgKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgR29vZ2xlLCBJbmMuCi0gKiBBdXRob3I6IEJyaWFuIFN3ZXRsYW5kIDxzd2V0bGFuZEBnb29nbGUuY29tPgotICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTAsIENvZGUgQXVyb3JhIEZvcnVtLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5kCi0gKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3NlIHRlcm1zLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAotICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICovCi0KLSNpZm5kZWYgX19BUkNIX0FSTV9NQUNIX01TTV9HUElPX0hXX0gKLSNkZWZpbmUgX19BUkNIX0FSTV9NQUNIX01TTV9HUElPX0hXX0gKLQotI2luY2x1ZGUgPG1hY2gvbXNtX2lvbWFwLmg+Ci0KLS8qIHNlZSA4MC1WQTczNi0yIFJldiBDIHBwIDY5NS03NTEKLSoqCi0qKiBUaGVzZSBhcmUgYWN0dWFsbHkgdGhlICpzaGFkb3cqIGdwaW8gcmVnaXN0ZXJzLCBzaW5jZSB0aGUKLSoqIHJlYWwgb25lcyAod2hpY2ggYWxsb3cgZnVsbCBhY2Nlc3MpIGFyZSBvbmx5IGF2YWlsYWJsZSB0byB0aGUKLSoqIEFSTTkgc2lkZSBvZiB0aGUgd29ybGQuCi0qKgotKiogU2luY2UgdGhlIF9CQVNFIG5lZWQgdG8gYmUgcGFnZS1hbGlnbmVkIHdoZW4gd2UncmUgbWFwcGluZyB0aGVtCi0qKiB0byB2aXJ0dWFsIGFkZHJlc3NlcywgYWRqdXN0IGZvciB0aGUgYWRkaXRpb25hbCBvZmZzZXQgaW4gdGhlc2UKLSoqIG1hY3Jvcy4KLSovCi0KLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX01TTTdYMzApCi0jZGVmaW5lIE1TTV9HUElPMV9SRUcob2ZmKSAoTVNNX0dQSU8xX0JBU0UgKyAob2ZmKSkKLSNkZWZpbmUgTVNNX0dQSU8yX1JFRyhvZmYpIChNU01fR1BJTzJfQkFTRSArIDB4NDAwICsgKG9mZikpCi0jZWxzZQotI2RlZmluZSBNU01fR1BJTzFfUkVHKG9mZikgKE1TTV9HUElPMV9CQVNFICsgMHg4MDAgKyAob2ZmKSkKLSNkZWZpbmUgTVNNX0dQSU8yX1JFRyhvZmYpIChNU01fR1BJTzJfQkFTRSArIDB4QzAwICsgKG9mZikpCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfTVNNN1gwMEEpIHx8IGRlZmluZWQoQ09ORklHX0FSQ0hfTVNNN1gyNSkgfHxcCi0gICAgZGVmaW5lZChDT05GSUdfQVJDSF9NU003WDI3KQotCi0vKiBvdXRwdXQgdmFsdWUgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MDApICAvKiBncGlvICAxNS0wICAqLwotI2RlZmluZSBNU01fR1BJT19PVVRfMSAgICAgICAgIE1TTV9HUElPMl9SRUcoMHgwMCkgIC8qIGdwaW8gIDQyLTE2ICovCi0jZGVmaW5lIE1TTV9HUElPX09VVF8yICAgICAgICAgTVNNX0dQSU8xX1JFRygweDA0KSAgLyogZ3BpbyAgNjctNDMgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzMgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MDgpICAvKiBncGlvICA5NC02OCAqLwotI2RlZmluZSBNU01fR1BJT19PVVRfNCAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgwQykgIC8qIGdwaW8gMTA2LTk1ICovCi0jZGVmaW5lIE1TTV9HUElPX09VVF81ICAgICAgICAgTVNNX0dQSU8xX1JFRygweDUwKSAgLyogZ3BpbyAxMDctMTIxICovCi0KLS8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgb3V0cHV0IGVuYWJsZSAqLwotI2RlZmluZSBNU01fR1BJT19PRV8wICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgxMCkKLSNkZWZpbmUgTVNNX0dQSU9fT0VfMSAgICAgICAgICBNU01fR1BJTzJfUkVHKDB4MDgpCi0jZGVmaW5lIE1TTV9HUElPX09FXzIgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDE0KQotI2RlZmluZSBNU01fR1BJT19PRV8zICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgxOCkKLSNkZWZpbmUgTVNNX0dQSU9fT0VfNCAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MUMpCi0jZGVmaW5lIE1TTV9HUElPX09FXzUgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDU0KQotCi0vKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIGlucHV0IHJlYWQgKi8KLSNkZWZpbmUgTVNNX0dQSU9fSU5fMCAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MzQpCi0jZGVmaW5lIE1TTV9HUElPX0lOXzEgICAgICAgICAgTVNNX0dQSU8yX1JFRygweDIwKQotI2RlZmluZSBNU01fR1BJT19JTl8yICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgzOCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5fMyAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4M0MpCi0jZGVmaW5lIE1TTV9HUElPX0lOXzQgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDQwKQotI2RlZmluZSBNU01fR1BJT19JTl81ICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHg0NCkKLQotLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCAxPWVkZ2UgMD1sZXZlbCBpbnRlcnJ1cCAqLwotI2RlZmluZSBNU01fR1BJT19JTlRfRURHRV8wICAgIE1TTV9HUElPMV9SRUcoMHg2MCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VER0VfMSAgICBNU01fR1BJTzJfUkVHKDB4NTApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FREdFXzIgICAgTVNNX0dQSU8xX1JFRygweDY0KQotI2RlZmluZSBNU01fR1BJT19JTlRfRURHRV8zICAgIE1TTV9HUElPMV9SRUcoMHg2OCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VER0VfNCAgICBNU01fR1BJTzFfUkVHKDB4NkMpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FREdFXzUgICAgTVNNX0dQSU8xX1JFRygweEMwKQotCi0vKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIDE9cG9zaXRpdmUgMD1uZWdhdGl2ZSAqLwotI2RlZmluZSBNU01fR1BJT19JTlRfUE9TXzAgICAgIE1TTV9HUElPMV9SRUcoMHg3MCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1BPU18xICAgICBNU01fR1BJTzJfUkVHKDB4NTgpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9QT1NfMiAgICAgTVNNX0dQSU8xX1JFRygweDc0KQotI2RlZmluZSBNU01fR1BJT19JTlRfUE9TXzMgICAgIE1TTV9HUElPMV9SRUcoMHg3OCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1BPU180ICAgICBNU01fR1BJTzFfUkVHKDB4N0MpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9QT1NfNSAgICAgTVNNX0dQSU8xX1JFRygweEJDKQotCi0vKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIGludGVycnVwdCBlbmFibGUgKi8KLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VOXzAgICAgICBNU01fR1BJTzFfUkVHKDB4ODApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FTl8xICAgICAgTVNNX0dQSU8yX1JFRygweDYwKQotI2RlZmluZSBNU01fR1BJT19JTlRfRU5fMiAgICAgIE1TTV9HUElPMV9SRUcoMHg4NCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VOXzMgICAgICBNU01fR1BJTzFfUkVHKDB4ODgpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FTl80ICAgICAgTVNNX0dQSU8xX1JFRygweDhDKQotI2RlZmluZSBNU01fR1BJT19JTlRfRU5fNSAgICAgIE1TTV9HUElPMV9SRUcoMHhCOCkKLQotLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCB3cml0ZSAxIHRvIGNsZWFyIGludGVycnVwdCAqLwotI2RlZmluZSBNU01fR1BJT19JTlRfQ0xFQVJfMCAgIE1TTV9HUElPMV9SRUcoMHg5MCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0NMRUFSXzEgICBNU01fR1BJTzJfUkVHKDB4NjgpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9DTEVBUl8yICAgTVNNX0dQSU8xX1JFRygweDk0KQotI2RlZmluZSBNU01fR1BJT19JTlRfQ0xFQVJfMyAgIE1TTV9HUElPMV9SRUcoMHg5OCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0NMRUFSXzQgICBNU01fR1BJTzFfUkVHKDB4OUMpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9DTEVBUl81ICAgTVNNX0dQSU8xX1JFRygweEI0KQotCi0vKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIDE9aW50ZXJydXB0IHBlbmRpbmcgKi8KLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1NUQVRVU18wICBNU01fR1BJTzFfUkVHKDB4QTApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9TVEFUVVNfMSAgTVNNX0dQSU8yX1JFRygweDcwKQotI2RlZmluZSBNU01fR1BJT19JTlRfU1RBVFVTXzIgIE1TTV9HUElPMV9SRUcoMHhBNCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1NUQVRVU18zICBNU01fR1BJTzFfUkVHKDB4QTgpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9TVEFUVVNfNCAgTVNNX0dQSU8xX1JFRygweEFDKQotI2RlZmluZSBNU01fR1BJT19JTlRfU1RBVFVTXzUgIE1TTV9HUElPMV9SRUcoMHhCMCkKLQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19BUkNIX1FTRDhYNTApCi0vKiBvdXRwdXQgdmFsdWUgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MDApICAvKiBncGlvICAxNS0wICAgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzEgICAgICAgICBNU01fR1BJTzJfUkVHKDB4MDApICAvKiBncGlvICA0Mi0xNiAgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzIgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MDQpICAvKiBncGlvICA2Ny00MyAgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzMgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MDgpICAvKiBncGlvICA5NC02OCAgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzQgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MEMpICAvKiBncGlvIDEwMy05NSAgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzUgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MTApICAvKiBncGlvIDEyMS0xMDQgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzYgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MTQpICAvKiBncGlvIDE1Mi0xMjIgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzcgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MTgpICAvKiBncGlvIDE2NC0xNTMgKi8KLQotLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCBvdXRwdXQgZW5hYmxlICovCi0jZGVmaW5lIE1TTV9HUElPX09FXzAgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDIwKQotI2RlZmluZSBNU01fR1BJT19PRV8xICAgICAgICAgIE1TTV9HUElPMl9SRUcoMHgwOCkKLSNkZWZpbmUgTVNNX0dQSU9fT0VfMiAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MjQpCi0jZGVmaW5lIE1TTV9HUElPX09FXzMgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDI4KQotI2RlZmluZSBNU01fR1BJT19PRV80ICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgyQykKLSNkZWZpbmUgTVNNX0dQSU9fT0VfNSAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MzApCi0jZGVmaW5lIE1TTV9HUElPX09FXzYgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDM0KQotI2RlZmluZSBNU01fR1BJT19PRV83ICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgzOCkKLQotLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCBpbnB1dCByZWFkICovCi0jZGVmaW5lIE1TTV9HUElPX0lOXzAgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDUwKQotI2RlZmluZSBNU01fR1BJT19JTl8xICAgICAgICAgIE1TTV9HUElPMl9SRUcoMHgyMCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5fMiAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4NTQpCi0jZGVmaW5lIE1TTV9HUElPX0lOXzMgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDU4KQotI2RlZmluZSBNU01fR1BJT19JTl80ICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHg1QykKLSNkZWZpbmUgTVNNX0dQSU9fSU5fNSAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4NjApCi0jZGVmaW5lIE1TTV9HUElPX0lOXzYgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDY0KQotI2RlZmluZSBNU01fR1BJT19JTl83ICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHg2OCkKLQotLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCAxPWVkZ2UgMD1sZXZlbCBpbnRlcnJ1cCAqLwotI2RlZmluZSBNU01fR1BJT19JTlRfRURHRV8wICAgIE1TTV9HUElPMV9SRUcoMHg3MCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VER0VfMSAgICBNU01fR1BJTzJfUkVHKDB4NTApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FREdFXzIgICAgTVNNX0dQSU8xX1JFRygweDc0KQotI2RlZmluZSBNU01fR1BJT19JTlRfRURHRV8zICAgIE1TTV9HUElPMV9SRUcoMHg3OCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VER0VfNCAgICBNU01fR1BJTzFfUkVHKDB4N0MpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FREdFXzUgICAgTVNNX0dQSU8xX1JFRygweDgwKQotI2RlZmluZSBNU01fR1BJT19JTlRfRURHRV82ICAgIE1TTV9HUElPMV9SRUcoMHg4NCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VER0VfNyAgICBNU01fR1BJTzFfUkVHKDB4ODgpCi0KLS8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgMT1wb3NpdGl2ZSAwPW5lZ2F0aXZlICovCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9QT1NfMCAgICAgTVNNX0dQSU8xX1JFRygweDkwKQotI2RlZmluZSBNU01fR1BJT19JTlRfUE9TXzEgICAgIE1TTV9HUElPMl9SRUcoMHg1OCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1BPU18yICAgICBNU01fR1BJTzFfUkVHKDB4OTQpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9QT1NfMyAgICAgTVNNX0dQSU8xX1JFRygweDk4KQotI2RlZmluZSBNU01fR1BJT19JTlRfUE9TXzQgICAgIE1TTV9HUElPMV9SRUcoMHg5QykKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1BPU181ICAgICBNU01fR1BJTzFfUkVHKDB4QTApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9QT1NfNiAgICAgTVNNX0dQSU8xX1JFRygweEE0KQotI2RlZmluZSBNU01fR1BJT19JTlRfUE9TXzcgICAgIE1TTV9HUElPMV9SRUcoMHhBOCkKLQotLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCBpbnRlcnJ1cHQgZW5hYmxlICovCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FTl8wICAgICAgTVNNX0dQSU8xX1JFRygweEIwKQotI2RlZmluZSBNU01fR1BJT19JTlRfRU5fMSAgICAgIE1TTV9HUElPMl9SRUcoMHg2MCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VOXzIgICAgICBNU01fR1BJTzFfUkVHKDB4QjQpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FTl8zICAgICAgTVNNX0dQSU8xX1JFRygweEI4KQotI2RlZmluZSBNU01fR1BJT19JTlRfRU5fNCAgICAgIE1TTV9HUElPMV9SRUcoMHhCQykKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VOXzUgICAgICBNU01fR1BJTzFfUkVHKDB4QzApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FTl82ICAgICAgTVNNX0dQSU8xX1JFRygweEM0KQotI2RlZmluZSBNU01fR1BJT19JTlRfRU5fNyAgICAgIE1TTV9HUElPMV9SRUcoMHhDOCkKLQotLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCB3cml0ZSAxIHRvIGNsZWFyIGludGVycnVwdCAqLwotI2RlZmluZSBNU01fR1BJT19JTlRfQ0xFQVJfMCAgIE1TTV9HUElPMV9SRUcoMHhEMCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0NMRUFSXzEgICBNU01fR1BJTzJfUkVHKDB4NjgpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9DTEVBUl8yICAgTVNNX0dQSU8xX1JFRygweEQ0KQotI2RlZmluZSBNU01fR1BJT19JTlRfQ0xFQVJfMyAgIE1TTV9HUElPMV9SRUcoMHhEOCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0NMRUFSXzQgICBNU01fR1BJTzFfUkVHKDB4REMpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9DTEVBUl81ICAgTVNNX0dQSU8xX1JFRygweEUwKQotI2RlZmluZSBNU01fR1BJT19JTlRfQ0xFQVJfNiAgIE1TTV9HUElPMV9SRUcoMHhFNCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0NMRUFSXzcgICBNU01fR1BJTzFfUkVHKDB4RTgpCi0KLS8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgMT1pbnRlcnJ1cHQgcGVuZGluZyAqLwotI2RlZmluZSBNU01fR1BJT19JTlRfU1RBVFVTXzAgIE1TTV9HUElPMV9SRUcoMHhGMCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1NUQVRVU18xICBNU01fR1BJTzJfUkVHKDB4NzApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9TVEFUVVNfMiAgTVNNX0dQSU8xX1JFRygweEY0KQotI2RlZmluZSBNU01fR1BJT19JTlRfU1RBVFVTXzMgIE1TTV9HUElPMV9SRUcoMHhGOCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1NUQVRVU180ICBNU01fR1BJTzFfUkVHKDB4RkMpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9TVEFUVVNfNSAgTVNNX0dQSU8xX1JFRygweDEwMCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1NUQVRVU182ICBNU01fR1BJTzFfUkVHKDB4MTA0KQotI2RlZmluZSBNU01fR1BJT19JTlRfU1RBVFVTXzcgIE1TTV9HUElPMV9SRUcoMHgxMDgpCi0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfQVJDSF9NU003WDMwKQotCi0vKiBvdXRwdXQgdmFsdWUgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MDApICAgLyogZ3BpbyAgMTUtMCAgICovCi0jZGVmaW5lIE1TTV9HUElPX09VVF8xICAgICAgICAgTVNNX0dQSU8yX1JFRygweDAwKSAgIC8qIGdwaW8gIDQzLTE2ICAqLwotI2RlZmluZSBNU01fR1BJT19PVVRfMiAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgwNCkgICAvKiBncGlvICA2Ny00NCAgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzMgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MDgpICAgLyogZ3BpbyAgOTQtNjggICovCi0jZGVmaW5lIE1TTV9HUElPX09VVF80ICAgICAgICAgTVNNX0dQSU8xX1JFRygweDBDKSAgIC8qIGdwaW8gMTA2LTk1ICAqLwotI2RlZmluZSBNU01fR1BJT19PVVRfNSAgICAgICAgIE1TTV9HUElPMV9SRUcoMHg1MCkgICAvKiBncGlvIDEzMy0xMDcgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT1VUXzYgICAgICAgICBNU01fR1BJTzFfUkVHKDB4QzQpICAgLyogZ3BpbyAxNTAtMTM0ICovCi0jZGVmaW5lIE1TTV9HUElPX09VVF83ICAgICAgICAgTVNNX0dQSU8xX1JFRygweDIxNCkgIC8qIGdwaW8gMTgxLTE1MSAqLwotCi0vKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIG91dHB1dCBlbmFibGUgKi8KLSNkZWZpbmUgTVNNX0dQSU9fT0VfMCAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MTApCi0jZGVmaW5lIE1TTV9HUElPX09FXzEgICAgICAgICAgTVNNX0dQSU8yX1JFRygweDA4KQotI2RlZmluZSBNU01fR1BJT19PRV8yICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgxNCkKLSNkZWZpbmUgTVNNX0dQSU9fT0VfMyAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MTgpCi0jZGVmaW5lIE1TTV9HUElPX09FXzQgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDFDKQotI2RlZmluZSBNU01fR1BJT19PRV81ICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHg1NCkKLSNkZWZpbmUgTVNNX0dQSU9fT0VfNiAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4QzgpCi0jZGVmaW5lIE1TTV9HUElPX09FXzcgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDIxOCkKLQotLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCBpbnB1dCByZWFkICovCi0jZGVmaW5lIE1TTV9HUElPX0lOXzAgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDM0KQotI2RlZmluZSBNU01fR1BJT19JTl8xICAgICAgICAgIE1TTV9HUElPMl9SRUcoMHgyMCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5fMiAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4MzgpCi0jZGVmaW5lIE1TTV9HUElPX0lOXzMgICAgICAgICAgTVNNX0dQSU8xX1JFRygweDNDKQotI2RlZmluZSBNU01fR1BJT19JTl80ICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHg0MCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5fNSAgICAgICAgICBNU01fR1BJTzFfUkVHKDB4NDQpCi0jZGVmaW5lIE1TTV9HUElPX0lOXzYgICAgICAgICAgTVNNX0dQSU8xX1JFRygweENDKQotI2RlZmluZSBNU01fR1BJT19JTl83ICAgICAgICAgIE1TTV9HUElPMV9SRUcoMHgyMUMpCi0KLS8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgMT1lZGdlIDA9bGV2ZWwgaW50ZXJydXAgKi8KLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VER0VfMCAgICBNU01fR1BJTzFfUkVHKDB4NjApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FREdFXzEgICAgTVNNX0dQSU8yX1JFRygweDUwKQotI2RlZmluZSBNU01fR1BJT19JTlRfRURHRV8yICAgIE1TTV9HUElPMV9SRUcoMHg2NCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VER0VfMyAgICBNU01fR1BJTzFfUkVHKDB4NjgpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FREdFXzQgICAgTVNNX0dQSU8xX1JFRygweDZDKQotI2RlZmluZSBNU01fR1BJT19JTlRfRURHRV81ICAgIE1TTV9HUElPMV9SRUcoMHhDMCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VER0VfNiAgICBNU01fR1BJTzFfUkVHKDB4RDApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FREdFXzcgICAgTVNNX0dQSU8xX1JFRygweDI0MCkKLQotLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCAxPXBvc2l0aXZlIDA9bmVnYXRpdmUgKi8KLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1BPU18wICAgICBNU01fR1BJTzFfUkVHKDB4NzApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9QT1NfMSAgICAgTVNNX0dQSU8yX1JFRygweDU4KQotI2RlZmluZSBNU01fR1BJT19JTlRfUE9TXzIgICAgIE1TTV9HUElPMV9SRUcoMHg3NCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1BPU18zICAgICBNU01fR1BJTzFfUkVHKDB4NzgpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9QT1NfNCAgICAgTVNNX0dQSU8xX1JFRygweDdDKQotI2RlZmluZSBNU01fR1BJT19JTlRfUE9TXzUgICAgIE1TTV9HUElPMV9SRUcoMHhCQykKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1BPU182ICAgICBNU01fR1BJTzFfUkVHKDB4RDQpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9QT1NfNyAgICAgTVNNX0dQSU8xX1JFRygweDIyOCkKLQotLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCBpbnRlcnJ1cHQgZW5hYmxlICovCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FTl8wICAgICAgTVNNX0dQSU8xX1JFRygweDgwKQotI2RlZmluZSBNU01fR1BJT19JTlRfRU5fMSAgICAgIE1TTV9HUElPMl9SRUcoMHg2MCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VOXzIgICAgICBNU01fR1BJTzFfUkVHKDB4ODQpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FTl8zICAgICAgTVNNX0dQSU8xX1JFRygweDg4KQotI2RlZmluZSBNU01fR1BJT19JTlRfRU5fNCAgICAgIE1TTV9HUElPMV9SRUcoMHg4QykKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0VOXzUgICAgICBNU01fR1BJTzFfUkVHKDB4QjgpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9FTl82ICAgICAgTVNNX0dQSU8xX1JFRygweEQ4KQotI2RlZmluZSBNU01fR1BJT19JTlRfRU5fNyAgICAgIE1TTV9HUElPMV9SRUcoMHgyMkMpCi0KLS8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgd3JpdGUgMSB0byBjbGVhciBpbnRlcnJ1cHQgKi8KLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0NMRUFSXzAgICBNU01fR1BJTzFfUkVHKDB4OTApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9DTEVBUl8xICAgTVNNX0dQSU8yX1JFRygweDY4KQotI2RlZmluZSBNU01fR1BJT19JTlRfQ0xFQVJfMiAgIE1TTV9HUElPMV9SRUcoMHg5NCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0NMRUFSXzMgICBNU01fR1BJTzFfUkVHKDB4OTgpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9DTEVBUl80ICAgTVNNX0dQSU8xX1JFRygweDlDKQotI2RlZmluZSBNU01fR1BJT19JTlRfQ0xFQVJfNSAgIE1TTV9HUElPMV9SRUcoMHhCNCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX0NMRUFSXzYgICBNU01fR1BJTzFfUkVHKDB4REMpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9DTEVBUl83ICAgTVNNX0dQSU8xX1JFRygweDIzMCkKLQotLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCAxPWludGVycnVwdCBwZW5kaW5nICovCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9TVEFUVVNfMCAgTVNNX0dQSU8xX1JFRygweEEwKQotI2RlZmluZSBNU01fR1BJT19JTlRfU1RBVFVTXzEgIE1TTV9HUElPMl9SRUcoMHg3MCkKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1NUQVRVU18yICBNU01fR1BJTzFfUkVHKDB4QTQpCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9TVEFUVVNfMyAgTVNNX0dQSU8xX1JFRygweEE4KQotI2RlZmluZSBNU01fR1BJT19JTlRfU1RBVFVTXzQgIE1TTV9HUElPMV9SRUcoMHhBQykKLSNkZWZpbmUgTVNNX0dQSU9fSU5UX1NUQVRVU181ICBNU01fR1BJTzFfUkVHKDB4QjApCi0jZGVmaW5lIE1TTV9HUElPX0lOVF9TVEFUVVNfNiAgTVNNX0dQSU8xX1JFRygweEUwKQotI2RlZmluZSBNU01fR1BJT19JTlRfU1RBVFVTXzcgIE1TTV9HUElPMV9SRUcoMHgyMzQpCi0KLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2dwaW9tdXguaCBiL2FyY2gvYXJtL21hY2gtbXNtL2dwaW9tdXguaAppbmRleCBiMTc4ZDljLi4wMDQ1OWY2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9ncGlvbXV4LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vZ3Bpb211eC5oCkBAIC0xOSw2ICsxOSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPG1hY2gvbXNtX2dwaW9tdXguaD4KIAogI2lmIGRlZmluZWQoQ09ORklHX01TTV9WMl9UTE1NKQogI2luY2x1ZGUgImdwaW9tdXgtdjIuaCIKQEAgLTcxLDEyICs3Miw2IEBACiAgKi8KIGV4dGVybiBzdHJ1Y3QgbXNtX2dwaW9tdXhfY29uZmlnIG1zbV9ncGlvbXV4X2NvbmZpZ3NbR1BJT01VWF9OR1BJT1NdOwogCi0vKiBJbmNyZW1lbnQgYSBncGlvJ3MgcmVmZXJlbmNlIGNvdW50LCBwb3NzaWJseSBhY3RpdmF0aW5nIHRoZSBsaW5lLiAqLwotaW50IF9fbXVzdF9jaGVjayBtc21fZ3Bpb211eF9nZXQodW5zaWduZWQgZ3Bpbyk7Ci0KLS8qIERlY3JlbWVudCBhIGdwaW8ncyByZWZlcmVuY2UgY291bnQsIHBvc3NpYmx5IHN1c3BlbmRpbmcgdGhlIGxpbmUuICovCi1pbnQgbXNtX2dwaW9tdXhfcHV0KHVuc2lnbmVkIGdwaW8pOwotCiAvKiBJbnN0YWxsIGEgbmV3IGNvbmZpZ3VyYXRpb24gdG8gdGhlIGdwaW8gbGluZS4gIFRvIGF2b2lkIG92ZXJ3cml0aW5nCiAgKiBhIGNvbmZpZ3VyYXRpb24sIGxlYXZlIHRoZSBWQUxJRCBiaXQgb3V0LgogICovCkBAIC05NCwxNiArODksNiBAQAogICovCiB2b2lkIF9fbXNtX2dwaW9tdXhfd3JpdGUodW5zaWduZWQgZ3BpbywgZ3Bpb211eF9jb25maWdfdCB2YWwpOwogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IF9fbXVzdF9jaGVjayBtc21fZ3Bpb211eF9nZXQodW5zaWduZWQgZ3BpbykKLXsKLQlyZXR1cm4gLUVOT1NZUzsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgbXNtX2dwaW9tdXhfcHV0KHVuc2lnbmVkIGdwaW8pCi17Ci0JcmV0dXJuIC1FTk9TWVM7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgaW50IG1zbV9ncGlvbXV4X3dyaXRlKHVuc2lnbmVkIGdwaW8sCiAJCQkJICAgIGdwaW9tdXhfY29uZmlnX3QgYWN0aXZlLAogCQkJCSAgICBncGlvbXV4X2NvbmZpZ190IHN1c3BlbmRlZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tc21fZ3Bpb211eC5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21zbV9ncGlvbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM3ZDM5MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tc21fZ3Bpb211eC5oCkBAIC0wLDAgKzEsMzggQEAKKy8qIENvcHlyaWdodCAoYykgMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZAorICogb25seSB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9NU01fR1BJT01VWF9ICisjZGVmaW5lIF9MSU5VWF9NU01fR1BJT01VWF9ICisKKyNpZmRlZiBDT05GSUdfTVNNX0dQSU9NVVgKKworLyogSW5jcmVtZW50IGEgZ3BpbydzIHJlZmVyZW5jZSBjb3VudCwgcG9zc2libHkgYWN0aXZhdGluZyB0aGUgbGluZS4gKi8KK2ludCBfX211c3RfY2hlY2sgbXNtX2dwaW9tdXhfZ2V0KHVuc2lnbmVkIGdwaW8pOworCisvKiBEZWNyZW1lbnQgYSBncGlvJ3MgcmVmZXJlbmNlIGNvdW50LCBwb3NzaWJseSBzdXNwZW5kaW5nIHRoZSBsaW5lLiAqLworaW50IG1zbV9ncGlvbXV4X3B1dCh1bnNpZ25lZCBncGlvKTsKKworI2Vsc2UKKworc3RhdGljIGlubGluZSBpbnQgX19tdXN0X2NoZWNrIG1zbV9ncGlvbXV4X2dldCh1bnNpZ25lZCBncGlvKQoreworCXJldHVybiAtRU5PU1lTOworfQorCitzdGF0aWMgaW5saW5lIGludCBtc21fZ3Bpb211eF9wdXQodW5zaWduZWQgZ3BpbykKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKworI2VuZGlmCisKKyNlbmRpZiAvKiBfTElOVVhfTVNNX0dQSU9NVVhfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21zbV9pb21hcC03eDAwLmggYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbXNtX2lvbWFwLTd4MDAuaAppbmRleCA4Zjk5ZDk3Li45NGZlOWZlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbXNtX2lvbWFwLTd4MDAuaAorKysgYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbXNtX2lvbWFwLTd4MDAuaApAQCAtNTUsMTMgKzU1LDExIEBACiAjZGVmaW5lIE1TTV9ETU9WX1BIWVMgICAgICAgICAweEE5NzAwMDAwCiAjZGVmaW5lIE1TTV9ETU9WX1NJWkUgICAgICAgICBTWl80SwogCi0jZGVmaW5lIE1TTV9HUElPMV9CQVNFICAgICAgICBJT01FTSgweEUwMDAzMDAwKQotI2RlZmluZSBNU01fR1BJTzFfUEhZUyAgICAgICAgMHhBOTIwMDAwMAotI2RlZmluZSBNU01fR1BJTzFfU0laRSAgICAgICAgU1pfNEsKKyNkZWZpbmUgTVNNN1gwMF9HUElPMV9QSFlTICAgICAgICAweEE5MjAwMDAwCisjZGVmaW5lIE1TTTdYMDBfR1BJTzFfU0laRSAgICAgICAgU1pfNEsKIAotI2RlZmluZSBNU01fR1BJTzJfQkFTRSAgICAgICAgSU9NRU0oMHhFMDAwNDAwMCkKLSNkZWZpbmUgTVNNX0dQSU8yX1BIWVMgICAgICAgIDB4QTkzMDAwMDAKLSNkZWZpbmUgTVNNX0dQSU8yX1NJWkUgICAgICAgIFNaXzRLCisjZGVmaW5lIE1TTTdYMDBfR1BJTzJfUEhZUyAgICAgICAgMHhBOTMwMDAwMAorI2RlZmluZSBNU003WDAwX0dQSU8yX1NJWkUgICAgICAgIFNaXzRLCiAKICNkZWZpbmUgTVNNX0NMS19DVExfQkFTRSAgICAgIElPTUVNKDB4RTAwMDUwMDApCiAjZGVmaW5lIE1TTV9DTEtfQ1RMX1BIWVMgICAgICAweEE4NjAwMDAwCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbXNtX2lvbWFwLTd4MzAuaCBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tc21faW9tYXAtN3gzMC5oCmluZGV4IDRkODRiZTEuLjM3Njk0NDQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tc21faW9tYXAtN3gzMC5oCisrKyBiL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tc21faW9tYXAtN3gzMC5oCkBAIC00NiwxMyArNDYsMTEgQEAKICNkZWZpbmUgTVNNX0RNT1ZfUEhZUyAgICAgICAgIDB4QUM0MDAwMDAKICNkZWZpbmUgTVNNX0RNT1ZfU0laRSAgICAgICAgIFNaXzRLCiAKLSNkZWZpbmUgTVNNX0dQSU8xX0JBU0UgICAgICAgIElPTUVNKDB4RTAwMDMwMDApCi0jZGVmaW5lIE1TTV9HUElPMV9QSFlTICAgICAgICAweEFDMDAxMDAwCi0jZGVmaW5lIE1TTV9HUElPMV9TSVpFICAgICAgICBTWl80SworI2RlZmluZSBNU003WDMwX0dQSU8xX1BIWVMgICAgICAgIDB4QUMwMDEwMDAKKyNkZWZpbmUgTVNNN1gzMF9HUElPMV9TSVpFICAgICAgICBTWl80SwogCi0jZGVmaW5lIE1TTV9HUElPMl9CQVNFICAgICAgICBJT01FTSgweEUwMDA0MDAwKQotI2RlZmluZSBNU01fR1BJTzJfUEhZUyAgICAgICAgMHhBQzEwMTAwMAotI2RlZmluZSBNU01fR1BJTzJfU0laRSAgICAgICAgU1pfNEsKKyNkZWZpbmUgTVNNN1gzMF9HUElPMl9QSFlTICAgICAgICAweEFDMTAxMDAwCisjZGVmaW5lIE1TTTdYMzBfR1BJTzJfU0laRSAgICAgICAgU1pfNEsKIAogI2RlZmluZSBNU01fQ0xLX0NUTF9CQVNFICAgICAgSU9NRU0oMHhFMDAwNTAwMCkKICNkZWZpbmUgTVNNX0NMS19DVExfUEhZUyAgICAgIDB4QUI4MDAwMDAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tc21faW9tYXAtOHg1MC5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21zbV9pb21hcC04eDUwLmgKaW5kZXggZDQxNDMyMC4uZDY3Y2Q3MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21zbV9pb21hcC04eDUwLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21zbV9pb21hcC04eDUwLmgKQEAgLTQ2LDEzICs0NiwxMSBAQAogI2RlZmluZSBNU01fRE1PVl9QSFlTICAgICAgICAgMHhBOTcwMDAwMAogI2RlZmluZSBNU01fRE1PVl9TSVpFICAgICAgICAgU1pfNEsKIAotI2RlZmluZSBNU01fR1BJTzFfQkFTRSAgICAgICAgSU9NRU0oMHhFMDAwMzAwMCkKLSNkZWZpbmUgTVNNX0dQSU8xX1BIWVMgICAgICAgIDB4QTkwMDAwMDAKLSNkZWZpbmUgTVNNX0dQSU8xX1NJWkUgICAgICAgIFNaXzRLCisjZGVmaW5lIFFTRDhYNTBfR1BJTzFfUEhZUyAgICAgICAgMHhBOTAwMDAwMAorI2RlZmluZSBRU0Q4WDUwX0dQSU8xX1NJWkUgICAgICAgIFNaXzRLCiAKLSNkZWZpbmUgTVNNX0dQSU8yX0JBU0UgICAgICAgIElPTUVNKDB4RTAwMDQwMDApCi0jZGVmaW5lIE1TTV9HUElPMl9QSFlTICAgICAgICAweEE5MTAwMDAwCi0jZGVmaW5lIE1TTV9HUElPMl9TSVpFICAgICAgICBTWl80SworI2RlZmluZSBRU0Q4WDUwX0dQSU8yX1BIWVMgICAgICAgIDB4QTkxMDAwMDAKKyNkZWZpbmUgUVNEOFg1MF9HUElPMl9TSVpFICAgICAgICBTWl80SwogCiAjZGVmaW5lIE1TTV9DTEtfQ1RMX0JBU0UgICAgICBJT01FTSgweEUwMDA1MDAwKQogI2RlZmluZSBNU01fQ0xLX0NUTF9QSFlTICAgICAgMHhBODYwMDAwMApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21zbV9pb21hcC5oIGIvYXJjaC9hcm0vbWFjaC1tc20vaW5jbHVkZS9tYWNoL21zbV9pb21hcC5oCmluZGV4IDJmNDk0YjYuLjRkZWQxNTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2luY2x1ZGUvbWFjaC9tc21faW9tYXAuaAorKysgYi9hcmNoL2FybS9tYWNoLW1zbS9pbmNsdWRlL21hY2gvbXNtX2lvbWFwLmgKQEAgLTYxLDUgKzYxLDcgQEAKICNkZWZpbmUgTVNNX1FHSUNfQ1BVX0JBU0UJSU9NRU0oMHhGMDAwMTAwMCkKICNkZWZpbmUgTVNNX1RNUl9CQVNFCQlJT01FTSgweEYwMjAwMDAwKQogI2RlZmluZSBNU01fVE1SMF9CQVNFCQlJT01FTSgweEYwMjAxMDAwKQorI2RlZmluZSBNU01fR1BJTzFfQkFTRQkJSU9NRU0oMHhFMDAwMzAwMCkKKyNkZWZpbmUgTVNNX0dQSU8yX0JBU0UJCUlPTUVNKDB4RTAwMDQwMDApCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vaW8uYyBiL2FyY2gvYXJtL21hY2gtbXNtL2lvLmMKaW5kZXggY2VjNmVkMS4uMTQwZGRiYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tc20vaW8uYworKysgYi9hcmNoL2FybS9tYWNoLW1zbS9pby5jCkBAIC00Myw4ICs0Myw4IEBACiAJTVNNX0RFVklDRShWSUMpLAogCU1TTV9DSElQX0RFVklDRShDU1IsIE1TTTdYMDApLAogCU1TTV9ERVZJQ0UoRE1PViksCi0JTVNNX0RFVklDRShHUElPMSksCi0JTVNNX0RFVklDRShHUElPMiksCisJTVNNX0NISVBfREVWSUNFKEdQSU8xLCBNU003WDAwKSwKKwlNU01fQ0hJUF9ERVZJQ0UoR1BJTzIsIE1TTTdYMDApLAogCU1TTV9ERVZJQ0UoQ0xLX0NUTCksCiAjaWZkZWYgQ09ORklHX01TTV9ERUJVR19VQVJUCiAJTVNNX0RFVklDRShERUJVR19VQVJUKSwKQEAgLTc2LDggKzc2LDggQEAKIAlNU01fREVWSUNFKFZJQyksCiAJTVNNX0NISVBfREVWSUNFKENTUiwgUVNEOFg1MCksCiAJTVNNX0RFVklDRShETU9WKSwKLQlNU01fREVWSUNFKEdQSU8xKSwKLQlNU01fREVWSUNFKEdQSU8yKSwKKwlNU01fQ0hJUF9ERVZJQ0UoR1BJTzEsIFFTRDhYNTApLAorCU1TTV9DSElQX0RFVklDRShHUElPMiwgUVNEOFg1MCksCiAJTVNNX0RFVklDRShDTEtfQ1RMKSwKIAlNU01fREVWSUNFKFNJUkMpLAogCU1TTV9ERVZJQ0UoU0NQTEwpLApAQCAtMTM1LDggKzEzNSw4IEBACiAJTVNNX0RFVklDRShWSUMpLAogCU1TTV9DSElQX0RFVklDRShDU1IsIE1TTTdYMzApLAogCU1TTV9ERVZJQ0UoRE1PViksCi0JTVNNX0RFVklDRShHUElPMSksCi0JTVNNX0RFVklDRShHUElPMiksCisJTVNNX0NISVBfREVWSUNFKEdQSU8xLCBNU003WDMwKSwKKwlNU01fQ0hJUF9ERVZJQ0UoR1BJTzIsIE1TTTdYMzApLAogCU1TTV9ERVZJQ0UoQ0xLX0NUTCksCiAJTVNNX0RFVklDRShDTEtfQ1RMX1NIMiksCiAJTVNNX0RFVklDRShBRDUpLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL3BjaWUuYyBiL2FyY2gvYXJtL21hY2gtbXY3OHh4MC9wY2llLmMKaW5kZXggZDYzMzZhZi4uYzUxYWYxYyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1tdjc4eHgwL3BjaWUuYworKysgYi9hcmNoL2FybS9tYWNoLW12Nzh4eDAvcGNpZS5jCkBAIC0yNjAsNyArMjYwLDggQEAKIAlyZXR1cm4gYnVzOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBtdjc4eHgwX3BjaWVfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBtdjc4eHgwX3BjaWVfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LAorCXU4IHBpbikKIHsKIAlzdHJ1Y3QgcGNpZV9wb3J0ICpwcCA9IGJ1c190b19wb3J0KGRldi0+YnVzLT5udW1iZXIpOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUxX2JhYmJhZ2UuYyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfYmFiYmFnZS5jCmluZGV4IDE1YzYwMDAuLmU0MDBiMDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfYmFiYmFnZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfYmFiYmFnZS5jCkBAIC00MSw4ICs0MSw2IEBACiAjZGVmaW5lIEJBQkJBR0VfUE9XRVJfS0VZCUlNWF9HUElPX05SKDIsIDIxKQogI2RlZmluZSBCQUJCQUdFX0VDU1BJMV9DUzAJSU1YX0dQSU9fTlIoNCwgMjQpCiAjZGVmaW5lIEJBQkJBR0VfRUNTUEkxX0NTMQlJTVhfR1BJT19OUig0LCAyNSkKLSNkZWZpbmUgQkFCQkFHRV9TRDFfQ0QJCUlNWF9HUElPX05SKDEsIDApCi0jZGVmaW5lIEJBQkJBR0VfU0QxX1dQCQlJTVhfR1BJT19OUigxLCAxKQogI2RlZmluZSBCQUJCQUdFX1NEMl9DRAkJSU1YX0dQSU9fTlIoMSwgNikKICNkZWZpbmUgQkFCQkFHRV9TRDJfV1AJCUlNWF9HUElPX05SKDEsIDUpCiAKQEAgLTE0Niw4ICsxNDQsOSBAQAogCU1YNTFfUEFEX1NEMV9EQVRBMV9fU0QxX0RBVEExLAogCU1YNTFfUEFEX1NEMV9EQVRBMl9fU0QxX0RBVEEyLAogCU1YNTFfUEFEX1NEMV9EQVRBM19fU0QxX0RBVEEzLAotCU1YNTFfUEFEX0dQSU8xXzBfX0dQSU8xXzAsCi0JTVg1MV9QQURfR1BJTzFfMV9fR1BJTzFfMSwKKwkvKiBDRC9XUCBmcm9tIGNvbnRyb2xsZXIgKi8KKwlNWDUxX1BBRF9HUElPMV8wX19TRDFfQ0QsCisJTVg1MV9QQURfR1BJTzFfMV9fU0QxX1dQLAogCiAJLyogU0QgMiAqLwogCU1YNTFfUEFEX1NEMl9DTURfX1NEMl9DTUQsCkBAIC0xNTYsNiArMTU1LDcgQEAKIAlNWDUxX1BBRF9TRDJfREFUQTFfX1NEMl9EQVRBMSwKIAlNWDUxX1BBRF9TRDJfREFUQTJfX1NEMl9EQVRBMiwKIAlNWDUxX1BBRF9TRDJfREFUQTNfX1NEMl9EQVRBMywKKwkvKiBDRC9XUCBncGlvICovCiAJTVg1MV9QQURfR1BJTzFfNl9fR1BJTzFfNiwKIAlNWDUxX1BBRF9HUElPMV81X19HUElPMV81LAogCkBAIC0zNDAsMTMgKzM0MCwxNSBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhIG14NTFfYmFiYmFnZV9zZDFfZGF0YSBfX2luaXRjb25zdCA9IHsKLQkuY2RfZ3BpbyA9IEJBQkJBR0VfU0QxX0NELAotCS53cF9ncGlvID0gQkFCQkFHRV9TRDFfV1AsCisJLmNkX3R5cGUgPSBFU0RIQ19DRF9DT05UUk9MTEVSLAorCS53cF90eXBlID0gRVNESENfV1BfQ09OVFJPTExFUiwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXNkaGNfcGxhdGZvcm1fZGF0YSBteDUxX2JhYmJhZ2Vfc2QyX2RhdGEgX19pbml0Y29uc3QgPSB7CiAJLmNkX2dwaW8gPSBCQUJCQUdFX1NEMl9DRCwKIAkud3BfZ3BpbyA9IEJBQkJBR0VfU0QyX1dQLAorCS5jZF90eXBlID0gRVNESENfQ0RfR1BJTywKKwkud3BfdHlwZSA9IEVTREhDX1dQX0dQSU8sCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1M19sb2NvLmMgYi9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUzX2xvY28uYwppbmRleCA1NGJlNTI1Li40ZTFkNTFkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUzX2xvY28uYworKysgYi9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUzX2xvY28uYwpAQCAtMjEwLDExICsyMTAsMTUgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhIG14NTNfbG9jb19zZDFfZGF0YSBfX2luaXRjb25zdCA9IHsKIAkuY2RfZ3BpbyA9IExPQ09fU0QxX0NELAorCS5jZF90eXBlID0gRVNESENfQ0RfR1BJTywKKwkud3BfdHlwZSA9IEVTREhDX1dQX05PTkUsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgbXg1M19sb2NvX3NkM19kYXRhIF9faW5pdGNvbnN0ID0gewogCS5jZF9ncGlvID0gTE9DT19TRDNfQ0QsCiAJLndwX2dwaW8gPSBMT0NPX1NEM19XUCwKKwkuY2RfdHlwZSA9IEVTREhDX0NEX0dQSU8sCisJLndwX3R5cGUgPSBFU0RIQ19XUF9HUElPLAogfTsKIAogc3RhdGljIGlubGluZSB2b2lkIG14NTNfbG9jb19mZWNfcmVzZXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L2Nsb2NrLW14NTEtbXg1My5jIGIvYXJjaC9hcm0vbWFjaC1teDUvY2xvY2stbXg1MS1teDUzLmMKaW5kZXggMjNjZDgwOS4uN2YyMDMwOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvY2xvY2stbXg1MS1teDUzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvY2xvY2stbXg1MS1teDUzLmMKQEAgLTE0MjIsMTEgKzE0MjIsMTMgQEAKICAgICAgICB9LAogCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgbXg1MV9sb29rdXBzW10gPSB7Ci0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4wIiwgTlVMTCwgdWFydDFfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMSIsIE5VTEwsIHVhcnQyX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjIiLCBOVUxMLCB1YXJ0M19jbGspCisJLyogaS5teDUxIGhhcyB0aGUgaS5teDIxIHR5cGUgdWFydCAqLworCV9SRUdJU1RFUl9DTE9DSygiaW14MjEtdWFydC4wIiwgTlVMTCwgdWFydDFfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14MjEtdWFydC4xIiwgTlVMTCwgdWFydDJfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygiaW14MjEtdWFydC4yIiwgTlVMTCwgdWFydDNfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiZ3B0IiwgZ3B0X2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImZlYy4wIiwgTlVMTCwgZmVjX2NsaykKKwkvKiBpLm14NTEgaGFzIHRoZSBpLm14MjcgdHlwZSBmZWMgKi8KKwlfUkVHSVNURVJfQ0xPQ0soImlteDI3LWZlYy4wIiwgTlVMTCwgZmVjX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soIm14Y19wd20uMCIsICJwd20iLCBwd20xX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soIm14Y19wd20uMSIsICJwd20iLCBwd20yX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1pMmMuMCIsIE5VTEwsIGkyYzFfY2xrKQpAQCAtMTQ0Niw3ICsxNDQ4LDggQEAKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1zc2kuMCIsIE5VTEwsIHNzaTFfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14LXNzaS4xIiwgTlVMTCwgc3NpMl9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgtc3NpLjIiLCBOVUxMLCBzc2kzX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC1zZG1hIiwgTlVMTCwgc2RtYV9jbGspCisJLyogaS5teDUxIGhhcyB0aGUgaS5teDM1IHR5cGUgc2RtYSAqLworCV9SRUdJU1RFUl9DTE9DSygiaW14MzUtc2RtYSIsIE5VTEwsIHNkbWFfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiY2tpaCIsIGNraWhfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiY2tpaDIiLCBja2loMl9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJncHRfMzJrIiwgZ3B0XzMya19jbGspCkBAIC0xNDU0LDEwICsxNDU3LDEwIEBACiAJX1JFR0lTVEVSX0NMT0NLKCJpbXg1MS1lY3NwaS4xIiwgTlVMTCwgZWNzcGkyX2NsaykKIAkvKiBpLm14NTEgaGFzIHRoZSBpLm14MzUgdHlwZSBjc3BpICovCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgzNS1jc3BpLjAiLCBOVUxMLCBjc3BpX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteC4wIiwgTlVMTCwgZXNkaGMxX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteC4xIiwgTlVMTCwgZXNkaGMyX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteC4yIiwgTlVMTCwgZXNkaGMzX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteC4zIiwgTlVMTCwgZXNkaGM0X2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteDUxLjAiLCBOVUxMLCBlc2RoYzFfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygic2RoY2ktZXNkaGMtaW14NTEuMSIsIE5VTEwsIGVzZGhjMl9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJzZGhjaS1lc2RoYy1pbXg1MS4yIiwgTlVMTCwgZXNkaGMzX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteDUxLjMiLCBOVUxMLCBlc2RoYzRfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiY3B1X2NsayIsIGNwdV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJpaW1fY2xrIiwgaWltX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteDItd2R0LjAiLCBOVUxMLCBkdW1teV9jbGspCkBAIC0xNDcwLDI5ICsxNDczLDMyIEBACiB9OwogCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgbXg1M19sb29rdXBzW10gPSB7Ci0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4wIiwgTlVMTCwgdWFydDFfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuMSIsIE5VTEwsIHVhcnQyX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soImlteC11YXJ0LjIiLCBOVUxMLCB1YXJ0M19jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtdWFydC4zIiwgTlVMTCwgdWFydDRfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiaW14LXVhcnQuNCIsIE5VTEwsIHVhcnQ1X2NsaykKKwkvKiBpLm14NTMgaGFzIHRoZSBpLm14MjEgdHlwZSB1YXJ0ICovCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjAiLCBOVUxMLCB1YXJ0MV9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjEiLCBOVUxMLCB1YXJ0Ml9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjIiLCBOVUxMLCB1YXJ0M19jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjMiLCBOVUxMLCB1YXJ0NF9jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJpbXgyMS11YXJ0LjQiLCBOVUxMLCB1YXJ0NV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKE5VTEwsICJncHQiLCBncHRfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygiZmVjLjAiLCBOVUxMLCBmZWNfY2xrKQorCS8qIGkubXg1MyBoYXMgdGhlIGkubXgyNSB0eXBlIGZlYyAqLworCV9SRUdJU1RFUl9DTE9DSygiaW14MjUtZmVjLjAiLCBOVUxMLCBmZWNfY2xrKQogCV9SRUdJU1RFUl9DTE9DSyhOVUxMLCAiaWltX2NsayIsIGlpbV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgtaTJjLjAiLCBOVUxMLCBpMmMxX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1pMmMuMSIsIE5VTEwsIGkyYzJfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14LWkyYy4yIiwgTlVMTCwgaTJjM19teDUzX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteC4wIiwgTlVMTCwgZXNkaGMxX2NsaykKLQlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteC4xIiwgTlVMTCwgZXNkaGMyX214NTNfY2xrKQotCV9SRUdJU1RFUl9DTE9DSygic2RoY2ktZXNkaGMtaW14LjIiLCBOVUxMLCBlc2RoYzNfbXg1M19jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJzZGhjaS1lc2RoYy1pbXguMyIsIE5VTEwsIGVzZGhjNF9teDUzX2NsaykKIAkvKiBpLm14NTMgaGFzIHRoZSBpLm14NTEgdHlwZSBlY3NwaSAqLwogCV9SRUdJU1RFUl9DTE9DSygiaW14NTEtZWNzcGkuMCIsIE5VTEwsIGVjc3BpMV9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXg1MS1lY3NwaS4xIiwgTlVMTCwgZWNzcGkyX2NsaykKIAkvKiBpLm14NTMgaGFzIHRoZSBpLm14MjUgdHlwZSBjc3BpICovCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgzNS1jc3BpLjAiLCBOVUxMLCBjc3BpX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteDUzLjAiLCBOVUxMLCBlc2RoYzFfY2xrKQorCV9SRUdJU1RFUl9DTE9DSygic2RoY2ktZXNkaGMtaW14NTMuMSIsIE5VTEwsIGVzZGhjMl9teDUzX2NsaykKKwlfUkVHSVNURVJfQ0xPQ0soInNkaGNpLWVzZGhjLWlteDUzLjIiLCBOVUxMLCBlc2RoYzNfbXg1M19jbGspCisJX1JFR0lTVEVSX0NMT0NLKCJzZGhjaS1lc2RoYy1pbXg1My4zIiwgTlVMTCwgZXNkaGM0X214NTNfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14Mi13ZHQuMCIsIE5VTEwsIGR1bW15X2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteDItd2R0LjEiLCBOVUxMLCBkdW1teV9jbGspCi0JX1JFR0lTVEVSX0NMT0NLKCJpbXgtc2RtYSIsIE5VTEwsIHNkbWFfY2xrKQorCS8qIGkubXg1MyBoYXMgdGhlIGkubXgzNSB0eXBlIHNkbWEgKi8KKwlfUkVHSVNURVJfQ0xPQ0soImlteDM1LXNkbWEiLCBOVUxMLCBzZG1hX2NsaykKIAlfUkVHSVNURVJfQ0xPQ0soImlteC1zc2kuMCIsIE5VTEwsIHNzaTFfY2xrKQogCV9SRUdJU1RFUl9DTE9DSygiaW14LXNzaS4xIiwgTlVMTCwgc3NpMl9jbGspCiAJX1JFR0lTVEVSX0NMT0NLKCJpbXgtc3NpLjIiLCBOVUxMLCBzc2kzX2NsaykKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L21tLmMgYi9hcmNoL2FybS9tYWNoLW14NS9tbS5jCmluZGV4IGVmOGFlYzkuLmJhZWE2ZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L21tLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvbW0uYwpAQCAtMTE1LDcgKzExNSw2IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHNkbWFfcGxhdGZvcm1fZGF0YSBpbXg1MV9zZG1hX3BkYXRhIF9faW5pdGRhdGEgPSB7Ci0JLnNkbWFfdmVyc2lvbiA9IDIsCiAJLmZ3X25hbWUgPSAic2RtYS1pbXg1MS5iaW4iLAogCS5zY3JpcHRfYWRkcnMgPSAmaW14NTFfc2RtYV9zY3JpcHQsCiB9OwpAQCAtMTM1LDcgKzEzNCw2IEBACiB9OwogCiBzdGF0aWMgc3RydWN0IHNkbWFfcGxhdGZvcm1fZGF0YSBpbXg1M19zZG1hX3BkYXRhIF9faW5pdGRhdGEgPSB7Ci0JLnNkbWFfdmVyc2lvbiA9IDIsCiAJLmZ3X25hbWUgPSAic2RtYS1pbXg1My5iaW4iLAogCS5zY3JpcHRfYWRkcnMgPSAmaW14NTNfc2RtYV9zY3JpcHQsCiB9OwpAQCAtMTQ4LDcgKzE0Niw4IEBACiAJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAyLCBNWDUxX0dQSU8zX0JBU0VfQUREUiwgU1pfMTZLLCBNWDUxX01YQ19JTlRfR1BJTzNfTE9XLCBNWDUxX01YQ19JTlRfR1BJTzNfSElHSCk7CiAJbXhjX3JlZ2lzdGVyX2dwaW8oImlteDMxLWdwaW8iLCAzLCBNWDUxX0dQSU80X0JBU0VfQUREUiwgU1pfMTZLLCBNWDUxX01YQ19JTlRfR1BJTzRfTE9XLCBNWDUxX01YQ19JTlRfR1BJTzRfSElHSCk7CiAKLQlpbXhfYWRkX2lteF9zZG1hKE1YNTFfU0RNQV9CQVNFX0FERFIsIE1YNTFfSU5UX1NETUEsICZpbXg1MV9zZG1hX3BkYXRhKTsKKwkvKiBpLm14NTEgaGFzIHRoZSBpLm14MzUgdHlwZSBzZG1hICovCisJaW14X2FkZF9pbXhfc2RtYSgiaW14MzUtc2RtYSIsIE1YNTFfU0RNQV9CQVNFX0FERFIsIE1YNTFfSU5UX1NETUEsICZpbXg1MV9zZG1hX3BkYXRhKTsKIH0KIAogdm9pZCBfX2luaXQgaW14NTNfc29jX2luaXQodm9pZCkKQEAgLTE2Miw1ICsxNjEsNiBAQAogCW14Y19yZWdpc3Rlcl9ncGlvKCJpbXgzMS1ncGlvIiwgNSwgTVg1M19HUElPNl9CQVNFX0FERFIsIFNaXzE2SywgTVg1M19JTlRfR1BJTzZfTE9XLCBNWDUzX0lOVF9HUElPNl9ISUdIKTsKIAlteGNfcmVnaXN0ZXJfZ3BpbygiaW14MzEtZ3BpbyIsIDYsIE1YNTNfR1BJTzdfQkFTRV9BRERSLCBTWl8xNkssIE1YNTNfSU5UX0dQSU83X0xPVywgTVg1M19JTlRfR1BJTzdfSElHSCk7CiAKLQlpbXhfYWRkX2lteF9zZG1hKE1YNTNfU0RNQV9CQVNFX0FERFIsIE1YNTNfSU5UX1NETUEsICZpbXg1M19zZG1hX3BkYXRhKTsKKwkvKiBpLm14NTMgaGFzIHRoZSBpLm14MzUgdHlwZSBzZG1hICovCisJaW14X2FkZF9pbXhfc2RtYSgiaW14MzUtc2RtYSIsIE1YNTNfU0RNQV9CQVNFX0FERFIsIE1YNTNfSU5UX1NETUEsICZpbXg1M19zZG1hX3BkYXRhKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L214NTFfZWZpa2EuYyBiL2FyY2gvYXJtL21hY2gtbXg1L214NTFfZWZpa2EuYwppbmRleCA1NjczOWMyLi40NDM1ZTAzIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14NS9teDUxX2VmaWthLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvbXg1MV9lZmlrYS5jCkBAIC0yNjAsOCArMjYwLDggQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSB2c2RfY29uc3VtZXJzW10gPSB7Ci0JUkVHVUxBVE9SX1NVUFBMWSgidm1tYyIsICJzZGhjaS1lc2RoYy1pbXguMCIpLAotCVJFR1VMQVRPUl9TVVBQTFkoInZtbWMiLCAic2RoY2ktZXNkaGMtaW14LjEiKSwKKwlSRUdVTEFUT1JfU1VQUExZKCJ2bW1jIiwgInNkaGNpLWVzZGhjLWlteDUxLjAiKSwKKwlSRUdVTEFUT1JfU1VQUExZKCJ2bW1jIiwgInNkaGNpLWVzZGhjLWlteDUxLjEiKSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSBwd2d0MV9jb25zdW1lcltdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1yeDUxLXBlcmlwaGVyYWxzLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEtcGVyaXBoZXJhbHMuYwppbmRleCBjYzUwM2FhLi41YTg4NmNkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEtcGVyaXBoZXJhbHMuYworKysgYi9hcmNoL2FybS9tYWNoLW9tYXAyL2JvYXJkLXJ4NTEtcGVyaXBoZXJhbHMuYwpAQCAtNDE4LDYgKzQxOCwxMCBAQAogCVJFR1VMQVRPUl9TVVBQTFkoInZtbWMiLCAib21hcF9oc21tYy4wIiksCiB9OwogCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9jb25zdW1lcl9zdXBwbHkgcng1MV92YXV4Ml9zdXBwbHlbXSA9IHsKKwlSRUdVTEFUT1JfU1VQUExZKCJ2ZGRzX2NzaWIiLCAib21hcDNpc3AiKSwKK307CisKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yX2NvbnN1bWVyX3N1cHBseSByeDUxX3ZhdXgzX3N1cHBseVtdID0gewogCVJFR1VMQVRPUl9TVVBQTFkoInZtbWMiLCAib21hcF9oc21tYy4xIiksCiB9OwpAQCAtNDc5LDYgKzQ4Myw4IEBACiAJCS52YWxpZF9vcHNfbWFzawkJPSBSRUdVTEFUT1JfQ0hBTkdFX01PREUKIAkJCQkJfCBSRUdVTEFUT1JfQ0hBTkdFX1NUQVRVUywKIAl9LAorCS5udW1fY29uc3VtZXJfc3VwcGxpZXMJPSBBUlJBWV9TSVpFKHJ4NTFfdmF1eDJfc3VwcGx5KSwKKwkuY29uc3VtZXJfc3VwcGxpZXMJPSByeDUxX3ZhdXgyX3N1cHBseSwKIH07CiAKIC8qIFZBVVgzIC0gYWRkcyBtb3JlIHBvd2VyIHRvIFZJT18xOCByYWlsICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL2Rpc3BsYXkuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZGlzcGxheS5jCmluZGV4IDU0M2ZjYjguLmE1YjdhMjMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDIvZGlzcGxheS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvZGlzcGxheS5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8dmlkZW8vb21hcGRzcy5oPgogI2luY2x1ZGUgPHBsYXQvb21hcF9od21vZC5oPgogI2luY2x1ZGUgPHBsYXQvb21hcF9kZXZpY2UuaD4KKyNpbmNsdWRlIDxwbGF0L29tYXAtcG0uaD4KIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugb21hcF9kaXNwbGF5X2RldmljZSA9IHsKIAkubmFtZSAgICAgICAgICA9ICJvbWFwZHNzIiwKQEAgLTQyLDIwICs0Myw2IEBACiAJfSwKIH07CiAKLS8qIG9oX2NvcmUgaXMgdXNlZCBmb3IgZ2V0dGluZyBvcHQtY2xvY2tzICovCi1zdGF0aWMgc3RydWN0IG9tYXBfaHdtb2QJKm9oX2NvcmU7Ci0KLXN0YXRpYyBib29sIG9wdF9jbG9ja19hdmFpbGFibGUoY29uc3QgY2hhciAqY2xrX3JvbGUpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgb2hfY29yZS0+b3B0X2Nsa3NfY250OyBpKyspIHsKLQkJaWYgKCFzdHJjbXAob2hfY29yZS0+b3B0X2Nsa3NbaV0ucm9sZSwgY2xrX3JvbGUpKQotCQkJcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQogc3RydWN0IG9tYXBfZHNzX2h3bW9kX2RhdGEgewogCWNvbnN0IGNoYXIgKm9oX25hbWU7CiAJY29uc3QgY2hhciAqZGV2X25hbWU7CkBAIC0xMDksMTYgKzk2LDkgQEAKIAkJb2hfY291bnQgPSBBUlJBWV9TSVpFKG9tYXA0X2Rzc19od21vZF9kYXRhKTsKIAl9CiAKLQkvKiBvcHRfY2xrcyBhcmUgYWx3YXlzIGFzc29jaWF0ZWQgd2l0aCBkc3MgaHdtb2QgKi8KLQlvaF9jb3JlID0gb21hcF9od21vZF9sb29rdXAoImRzc19jb3JlIik7Ci0JaWYgKCFvaF9jb3JlKSB7Ci0JCXByX2VycigiQ291bGQgbm90IGxvb2sgdXAgZHNzX2NvcmUuXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCiAJcGRhdGEuYm9hcmRfZGF0YSA9IGJvYXJkX2RhdGE7Ci0JcGRhdGEuYm9hcmRfZGF0YS0+Z2V0X2xhc3Rfb2ZmX29uX3RyYW5zYWN0aW9uX2lkID0gTlVMTDsKLQlwZGF0YS5vcHRfY2xvY2tfYXZhaWxhYmxlID0gb3B0X2Nsb2NrX2F2YWlsYWJsZTsKKwlwZGF0YS5ib2FyZF9kYXRhLT5nZXRfY29udGV4dF9sb3NzX2NvdW50ID0KKwkJb21hcF9wbV9nZXRfZGV2X2NvbnRleHRfbG9zc19jb3VudDsKIAogCWZvciAoaSA9IDA7IGkgPCBvaF9jb3VudDsgaSsrKSB7CiAJCW9oID0gb21hcF9od21vZF9sb29rdXAoY3Vycl9kc3NfaHdtb2RbaV0ub2hfbmFtZSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvY29tbW9uLmggYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvY29tbW9uLmgKaW5kZXggZjJiMmIzNS4uM2U1NDk5ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2NvbW1vbi5oCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9jb21tb24uaApAQCAtNTEsNyArNTEsNyBAQAogdm9pZCBvcmlvbjV4X3BjaV9zZXRfY2FyZGJ1c19tb2RlKHZvaWQpOwogaW50IG9yaW9uNXhfcGNpX3N5c19zZXR1cChpbnQgbnIsIHN0cnVjdCBwY2lfc3lzX2RhdGEgKnN5cyk7CiBzdHJ1Y3QgcGNpX2J1cyAqb3Jpb241eF9wY2lfc3lzX3NjYW5fYnVzKGludCBuciwgc3RydWN0IHBjaV9zeXNfZGF0YSAqc3lzKTsKLWludCBvcmlvbjV4X3BjaV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbik7CitpbnQgb3Jpb241eF9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pOwogCiBzdHJ1Y3QgbWFjaGluZV9kZXNjOwogc3RydWN0IG1lbWluZm87CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvZGI4OGY1MjgxLXNldHVwLmMgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvZGI4OGY1MjgxLXNldHVwLmMKaW5kZXggZjk1ZDNjYi4uYTNlM2U5ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2RiODhmNTI4MS1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9kYjg4ZjUyODEtc2V0dXAuYwpAQCAtMjM3LDcgKzIzNyw4IEBACiAJfQogfQogCi1zdGF0aWMgaW50IF9faW5pdCBkYjg4ZjUyODFfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgZGI4OGY1MjgxX3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsCisJdTggcGluKQogewogCWludCBpcnE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9kbnMzMjMtc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9kbnMzMjMtc2V0dXAuYwppbmRleCA4NTVlMGU3Li5hNmVkZGFlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvZG5zMzIzLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2RuczMyMy1zZXR1cC5jCkBAIC03MCwxNCArNzAsMTQgQEAKICAqIFBDSSBzZXR1cAogICovCiAKLXN0YXRpYyBpbnQgX19pbml0IGRuczMyM19wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBkbnMzMjNfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWludCBpcnE7CiAKIAkvKgogCSAqIENoZWNrIGZvciBkZXZpY2VzIHdpdGggaGFyZC13aXJlZCBJUlFzLgogCSAqLwotCWlycSA9IG9yaW9uNXhfcGNpX21hcF9pcnEoZGV2LCBzbG90LCBwaW4pOworCWlycSA9IG9yaW9uNXhfcGNpX21hcF9pcnEoY29uc3QgZGV2LCBzbG90LCBwaW4pOwogCWlmIChpcnEgIT0gLTEpCiAJCXJldHVybiBpcnE7CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9rdXJvYm94X3Byby1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2t1cm9ib3hfcHJvLXNldHVwLmMKaW5kZXggYzBlYjY0Ni4uMDAzODEyNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2t1cm9ib3hfcHJvLXNldHVwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L2t1cm9ib3hfcHJvLXNldHVwLmMKQEAgLTExOSw3ICsxMTksOCBAQAogICogUENJCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGludCBfX2luaXQga3Vyb2JveF9wcm9fcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQga3Vyb2JveF9wcm9fcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwKKwl1OCBwaW4pCiB7CiAJaW50IGlycTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L21zczItc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9tc3MyLXNldHVwLmMKaW5kZXggNTkyNjNiNy4uZWYzYmI4ZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L21zczItc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvbXNzMi1zZXR1cC5jCkBAIC03Myw3ICs3Myw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogUENJIHNldHVwCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXN0YXRpYyBpbnQgX19pbml0IG1zczJfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgbXNzMl9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaW50IGlycTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3BjaS5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3BjaS5jCmluZGV4IGY2NDk2NWQuLjI4Yjg3NjAgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9wY2kuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcGNpLmMKQEAgLTU4OSw3ICs1ODksNyBAQAogCXJldHVybiBidXM7CiB9CiAKLWludCBfX2luaXQgb3Jpb241eF9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitpbnQgX19pbml0IG9yaW9uNXhfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWludCBidXMgPSBkZXYtPmJ1cy0+bnVtYmVyOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcmQ4OGY1MTgxbC1meG8tc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9yZDg4ZjUxODFsLWZ4by1zZXR1cC5jCmluZGV4IDllZWM3YzIuLjI5MWQyMmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9yZDg4ZjUxODFsLWZ4by1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC9yZDg4ZjUxODFsLWZ4by1zZXR1cC5jCkBAIC0xMzEsNyArMTMxLDcgQEAKIH0KIAogc3RhdGljIGludCBfX2luaXQKLXJkODhmNTE4MWxfZnhvX3BjaV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3JkODhmNTE4MWxfZnhvX3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpbnQgaXJxOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcmQ4OGY1MTgxbC1nZS1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNTE4MWwtZ2Utc2V0dXAuYwppbmRleCAwY2M5MGJiZi4uM2YwMjM2MiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNTE4MWwtZ2Utc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcmQ4OGY1MTgxbC1nZS1zZXR1cC5jCkBAIC0xNDAsNyArMTQwLDcgQEAKIH0KIAogc3RhdGljIGludCBfX2luaXQKLXJkODhmNTE4MWxfZ2VfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorcmQ4OGY1MTgxbF9nZV9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaW50IGlycTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNTE4Mi1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3JkODhmNTE4Mi1zZXR1cC5jCmluZGV4IDQ4ZGEzOWIuLjI3ZmQzOGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC9yZDg4ZjUxODItc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvcmQ4OGY1MTgyLXNldHVwLmMKQEAgLTE3Miw3ICsxNzIsOCBAQAogCX0KIH0KIAotc3RhdGljIGludCBfX2luaXQgcmQ4OGY1MTgyX3BjaV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IHJkODhmNTE4Ml9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LAorCXU4IHBpbikKIHsKIAlpbnQgaXJxOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvdGVyYXN0YXRpb25fcHJvMi1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3RlcmFzdGF0aW9uX3BybzItc2V0dXAuYwppbmRleCAyOWNlODI2Li5hMzRlNGZhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvdGVyYXN0YXRpb25fcHJvMi1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC90ZXJhc3RhdGlvbl9wcm8yLXNldHVwLmMKQEAgLTEwMCw3ICsxMDAsNyBAQAogCX0KIH0KIAotc3RhdGljIGludCBfX2luaXQgdHNwMl9wY2lfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCB0c3AyX3BjaV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpbnQgaXJxOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvdHMyMDktc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC90czIwOS1zZXR1cC5jCmluZGV4IDQ3MTYyZmQuLmM5ODMxNjEgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC90czIwOS1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC90czIwOS1zZXR1cC5jCkBAIC0xNDMsNyArMTQzLDggQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHFuYXBfdHMyMDlfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgcW5hcF90czIwOV9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LAorCXU4IHBpbikKIHsKIAlpbnQgaXJxOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvdHM0MDktc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC90czQwOS1zZXR1cC5jCmluZGV4IDVhYWNjN2EuLmNjMzNiMjIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb3Jpb241eC90czQwOS1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC90czQwOS1zZXR1cC5jCkBAIC0xMjEsNyArMTIxLDggQEAKICAqIFBDSQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyBpbnQgX19pbml0IHFuYXBfdHM0MDlfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgcW5hcF90czQwOV9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LAorCXU4IHBpbikKIHsKIAlpbnQgaXJxOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvd25yODU0dC1zZXR1cC5jIGIvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3ducjg1NHQtc2V0dXAuYwppbmRleCA0NDRhMWM3Li4yNjUzNTk1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9yaW9uNXgvd25yODU0dC1zZXR1cC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC93bnI4NTR0LXNldHVwLmMKQEAgLTEzMyw3ICsxMzMsOCBAQAogCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmd25yODU0dF9ub3JfZmxhc2gpOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCB3bnI4NTR0X3BjaV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IHducjg1NHRfcGNpX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwKKwl1OCBwaW4pCiB7CiAJaW50IGlycTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3dydDM1MG4tdjItc2V0dXAuYyBiL2FyY2gvYXJtL21hY2gtb3Jpb241eC93cnQzNTBuLXYyLXNldHVwLmMKaW5kZXggZDE5NTJiZS4uMjUxZWYxNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vcmlvbjV4L3dydDM1MG4tdjItc2V0dXAuYworKysgYi9hcmNoL2FybS9tYWNoLW9yaW9uNXgvd3J0MzUwbi12Mi1zZXR1cC5jCkBAIC0yMjEsNyArMjIxLDggQEAKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJndydDM1MG5fdjJfYnV0dG9uX2RldmljZSk7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHdydDM1MG5fdjJfcGNpX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgd3J0MzUwbl92Ml9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LAorCXU4IHBpbikKIHsKIAlpbnQgaXJxOwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS9jbS14Mnh4LXBjaS5jIGIvYXJjaC9hcm0vbWFjaC1weGEvY20teDJ4eC1wY2kuYwppbmRleCA0ZWI3NjYwLi42YmY0NzlkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXB4YS9jbS14Mnh4LXBjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL2NtLXgyeHgtcGNpLmMKQEAgLTc3LDcgKzc3LDcgQEAKICNlbmRpZgogCiAvKiBQQ0kgSVJRIG1hcHBpbmcqLwotc3RhdGljIGludCBfX2luaXQgY214Mnh4X3BjaV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IGNteDJ4eF9wY2lfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaW50IGlycTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvcGNpLW5hbm9lbmdpbmUuYyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL3BjaS1uYW5vZW5naW5lLmMKaW5kZXggNWZjMDc0Zi4uOTY0YzZjMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zYTExMDAvcGNpLW5hbm9lbmdpbmUuYworKysgYi9hcmNoL2FybS9tYWNoLXNhMTEwMC9wY2ktbmFub2VuZ2luZS5jCkBAIC0xMjIsNyArMTIyLDggQEAKIAkud3JpdGUJPSBuYW5vZW5naW5lX3dyaXRlX2NvbmZpZywKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHBjaV9uYW5vZW5naW5lX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCBfX2luaXQgcGNpX25hbm9lbmdpbmVfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LAorCXU4IHBpbikKIHsKIAlyZXR1cm4gTkFOT0VOR0lORV9JUlFfR1BJT19QQ0k7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNoYXJrL3BjaS5jIGIvYXJjaC9hcm0vbWFjaC1zaGFyay9wY2kuYwppbmRleCA5MmQ3MjI3Li43Y2I3OWEwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNoYXJrL3BjaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2hhcmsvcGNpLmMKQEAgLTE0LDcgKzE0LDcgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9wY2kuaD4KICNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgogCi1zdGF0aWMgaW50IF9faW5pdCBzaGFya19tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IHNoYXJrX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCWlmIChkZXYtPmJ1cy0+bnVtYmVyID09IDApCiAJCWlmIChkZXYtPmRldmZuID09IDApCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWFwNGV2Yi5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1hcDRldmIuYwppbmRleCA4MzcxMzhlLi45ZTA4NTZiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWFwNGV2Yi5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtYXA0ZXZiLmMKQEAgLTk1NywxOSArOTU3LDE2IEBACiAJfSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGNzaTJfZGV2aWNlID0gewotCS5uYW1lICAgPSAic2gtbW9iaWxlLWNzaTIiLAotCS5pZCAgICAgPSAwLAorc3RhdGljIHN0cnVjdCBzaF9tb2JpbGVfY2V1X2NvbXBhbmlvbiBjc2kyID0geworCS5pZAkJPSAwLAogCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShjc2kyX3Jlc291cmNlcyksCiAJLnJlc291cmNlCT0gY3NpMl9yZXNvdXJjZXMsCi0JLmRldiAgICA9IHsKLQkJLnBsYXRmb3JtX2RhdGEgPSAmY3NpMl9pbmZvLAotCX0sCisJLnBsYXRmb3JtX2RhdGEJPSAmY3NpMl9pbmZvLAogfTsKIAogc3RhdGljIHN0cnVjdCBzaF9tb2JpbGVfY2V1X2luZm8gc2hfbW9iaWxlX2NldV9pbmZvID0gewogCS5mbGFncyA9IFNIX0NFVV9GTEFHX1VTRV84QklUX0JVUywKLQkuY3NpMl9kZXYgPSAmY3NpMl9kZXZpY2UuZGV2LAorCS5jc2kyID0gJmNzaTIsCiB9OwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIGNldV9yZXNvdXJjZXNbXSA9IHsKQEAgLTEwMTMsNyArMTAxMCw2IEBACiAJJmxjZGMxX2RldmljZSwKIAkmbGNkY19kZXZpY2UsCiAJJmhkbWlfZGV2aWNlLAotCSZjc2kyX2RldmljZSwKIAkmY2V1X2RldmljZSwKIAkmYXA0ZXZiX2NhbWVyYSwKIAkmbWVyYW1fZGV2aWNlLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1tYWNrZXJlbC5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1tYWNrZXJlbC5jCmluZGV4IDViMzZiNmMuLmQ0MWMwMWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtbWFja2VyZWwuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLW1hY2tlcmVsLmMKQEAgLTExOTIsOCArMTE5Miw4IEBACiB9OwogCiAKLXN0YXRpYyBpbnQgbWFja2VyZWxfY2FtZXJhX2FkZChzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wsIHN0cnVjdCBkZXZpY2UgKmRldik7Ci1zdGF0aWMgdm9pZCBtYWNrZXJlbF9jYW1lcmFfZGVsKHN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCk7CitzdGF0aWMgaW50IG1hY2tlcmVsX2NhbWVyYV9hZGQoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpOworc3RhdGljIHZvaWQgbWFja2VyZWxfY2FtZXJhX2RlbChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCk7CiAKIHN0YXRpYyBpbnQgY2FtZXJhX3NldF9jYXB0dXJlKHN0cnVjdCBzb2NfY2FtZXJhX3BsYXRmb3JtX2luZm8gKmluZm8sCiAJCQkgICAgICBpbnQgZW5hYmxlKQpAQCAtMTIzMiwxNiArMTIzMiwxNSBAQAogCXNvY19jYW1lcmFfcGxhdGZvcm1fcmVsZWFzZSgmY2FtZXJhX2RldmljZSk7CiB9CiAKLXN0YXRpYyBpbnQgbWFja2VyZWxfY2FtZXJhX2FkZChzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wsCi0JCQkgICAgICAgc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBtYWNrZXJlbF9jYW1lcmFfYWRkKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCXJldHVybiBzb2NfY2FtZXJhX3BsYXRmb3JtX2FkZChpY2wsIGRldiwgJmNhbWVyYV9kZXZpY2UsICZjYW1lcmFfbGluaywKKwlyZXR1cm4gc29jX2NhbWVyYV9wbGF0Zm9ybV9hZGQoaWNkLCAmY2FtZXJhX2RldmljZSwgJmNhbWVyYV9saW5rLAogCQkJCSAgICAgICBtYWNrZXJlbF9jYW1lcmFfcmVsZWFzZSwgMCk7CiB9CiAKLXN0YXRpYyB2b2lkIG1hY2tlcmVsX2NhbWVyYV9kZWwoc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsKQorc3RhdGljIHZvaWQgbWFja2VyZWxfY2FtZXJhX2RlbChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKIHsKLQlzb2NfY2FtZXJhX3BsYXRmb3JtX2RlbChpY2wsIGNhbWVyYV9kZXZpY2UsICZjYW1lcmFfbGluayk7CisJc29jX2NhbWVyYV9wbGF0Zm9ybV9kZWwoaWNkLCBjYW1lcmFfZGV2aWNlLCAmY2FtZXJhX2xpbmspOwogfQogCiBzdGF0aWMgc3RydWN0IHNoX21vYmlsZV9jZXVfaW5mbyBzaF9tb2JpbGVfY2V1X2luZm8gPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2Nsb2NrLXNoNzM2Ny5jIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jbG9jay1zaDczNjcuYwppbmRleCA2YjE4NmFlLi41MjE4YzM0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2Nsb2NrLXNoNzM2Ny5jCisrKyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvY2xvY2stc2g3MzY3LmMKQEAgLTI1OSw5ICsyNTksNiBAQAogCVtDTU1TVFAwMDNdID0gTVNUUCgmcl9jbGssIENNTVNUUENSMCwgMywgMCksIC8qIEtFWVNDICovCiB9OwogCi0jZGVmaW5lIENMS0RFVl9DT05fSUQoX2lkLCBfY2xrKSB7IC5jb25faWQgPSBfaWQsIC5jbGsgPSBfY2xrIH0KLSNkZWZpbmUgQ0xLREVWX0RFVl9JRChfaWQsIF9jbGspIHsgLmRldl9pZCA9IF9pZCwgLmNsayA9IF9jbGsgfQotCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgbG9va3Vwc1tdID0gewogCS8qIG1haW4gY2xvY2tzICovCiAJQ0xLREVWX0NPTl9JRCgicl9jbGsiLCAmcl9jbGspLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jbG9jay1zaDczNzIuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvY2xvY2stc2g3MzcyLmMKaW5kZXggOTFmNTc3OS4uNmIxNjE5YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jbG9jay1zaDczNzIuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2Nsb2NrLXNoNzM3Mi5jCkBAIC01NjEsMTAgKzU2MSw2IEBACiAJW01TVFA0MDNdID0gTVNUUCgmcl9jbGssIFNNU1RQQ1I0LCAzLCAwKSwgLyogS0VZU0MgKi8KIH07CiAKLSNkZWZpbmUgQ0xLREVWX0NPTl9JRChfaWQsIF9jbGspIHsgLmNvbl9pZCA9IF9pZCwgLmNsayA9IF9jbGsgfQotI2RlZmluZSBDTEtERVZfREVWX0lEKF9pZCwgX2NsaykgeyAuZGV2X2lkID0gX2lkLCAuY2xrID0gX2NsayB9Ci0jZGVmaW5lIENMS0RFVl9JQ0tfSUQoX2NpZCwgX2RpZCwgX2NsaykgeyAuY29uX2lkID0gX2NpZCwgLmRldl9pZCA9IF9kaWQsIC5jbGsgPSBfY2xrIH0KLQogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIGxvb2t1cHNbXSA9IHsKIAkvKiBtYWluIGNsb2NrcyAqLwogCUNMS0RFVl9DT05fSUQoImR2X2Nsa2lfZGl2Ml9jbGsiLCAmc2g3MzcyX2R2X2Nsa2lfZGl2Ml9jbGspLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jbG9jay1zaDczNzcuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvY2xvY2stc2g3Mzc3LmMKaW5kZXggOTU5NDI0Ni4uOGNlZTdiMSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jbG9jay1zaDczNzcuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2Nsb2NrLXNoNzM3Ny5jCkBAIC0yNjcsOSArMjY3LDYgQEAKIAlbTVNUUDQwM10gPSBNU1RQKCZyX2NsaywgU01TVFBDUjQsIDMsIDApLCAvKiBLRVlTQyAqLwogfTsKIAotI2RlZmluZSBDTEtERVZfQ09OX0lEKF9pZCwgX2NsaykgeyAuY29uX2lkID0gX2lkLCAuY2xrID0gX2NsayB9Ci0jZGVmaW5lIENMS0RFVl9ERVZfSUQoX2lkLCBfY2xrKSB7IC5kZXZfaWQgPSBfaWQsIC5jbGsgPSBfY2xrIH0KLQogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIGxvb2t1cHNbXSA9IHsKIAkvKiBtYWluIGNsb2NrcyAqLwogCUNMS0RFVl9DT05fSUQoInJfY2xrIiwgJnJfY2xrKSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvY2xvY2stc2g3M2EwLmMgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2Nsb2NrLXNoNzNhMC5jCmluZGV4IGJjYWNiMWUuLjZkYjJjY2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvY2xvY2stc2g3M2EwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jbG9jay1zaDczYTAuYwpAQCAtMzA2LDEwICszMDYsNiBAQAogCVtNU1RQNDAzXSA9IE1TVFAoJnJfY2xrLCBTTVNUUENSNCwgMywgMCksIC8qIEtFWVNDICovCiB9OwogCi0jZGVmaW5lIENMS0RFVl9DT05fSUQoX2lkLCBfY2xrKSB7IC5jb25faWQgPSBfaWQsIC5jbGsgPSBfY2xrIH0KLSNkZWZpbmUgQ0xLREVWX0RFVl9JRChfaWQsIF9jbGspIHsgLmRldl9pZCA9IF9pZCwgLmNsayA9IF9jbGsgfQotI2RlZmluZSBDTEtERVZfSUNLX0lEKF9jaWQsIF9kaWQsIF9jbGspIHsgLmNvbl9pZCA9IF9jaWQsIC5kZXZfaWQgPSBfZGlkLCAuY2xrID0gX2NsayB9Ci0KIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBsb29rdXBzW10gPSB7CiAJLyogbWFpbiBjbG9ja3MgKi8KIAlDTEtERVZfQ09OX0lEKCJyX2NsayIsICZyX2NsayksCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL0tjb25maWcgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL0tjb25maWcKaW5kZXggNWVjMTg0Ni4uZDgyZWJhYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvS2NvbmZpZwpAQCAtMjcsMTQgKzI3LDE0IEBACiAKIGNvbmZpZyBNQUNIX0hBUk1PTlkKICAgICAgICBib29sICJIYXJtb255IGJvYXJkIgotICAgICAgIHNlbGVjdCBNQUNIX0hBU19TTkRfU09DX1RFR1JBX1dNODkwMworICAgICAgIHNlbGVjdCBNQUNIX0hBU19TTkRfU09DX1RFR1JBX1dNODkwMyBpZiBTTkRfU09DCiAgICAgICAgaGVscAogICAgICAgICAgU3VwcG9ydCBmb3IgblZpZGlhIEhhcm1vbnkgZGV2ZWxvcG1lbnQgcGxhdGZvcm0KIAogY29uZmlnIE1BQ0hfS0FFTgogICAgICAgIGJvb2wgIkthZW4gYm9hcmQiCiAgICAgICAgc2VsZWN0IE1BQ0hfU0VBQk9BUkQKLSAgICAgICBzZWxlY3QgTUFDSF9IQVNfU05EX1NPQ19URUdSQV9XTTg5MDMKKyAgICAgICBzZWxlY3QgTUFDSF9IQVNfU05EX1NPQ19URUdSQV9XTTg5MDMgaWYgU05EX1NPQwogICAgICAgIGhlbHAKICAgICAgICAgIFN1cHBvcnQgZm9yIHRoZSBLYWVuIHZlcnNpb24gb2YgU2VhYm9hcmQKIApAQCAtNDUsMTIgKzQ1LDE4IEBACiAKIGNvbmZpZyBNQUNIX1NFQUJPQVJECiAgICAgICAgYm9vbCAiU2VhYm9hcmQgYm9hcmQiCi0gICAgICAgc2VsZWN0IE1BQ0hfSEFTX1NORF9TT0NfVEVHUkFfV004OTAzCisgICAgICAgc2VsZWN0IE1BQ0hfSEFTX1NORF9TT0NfVEVHUkFfV004OTAzIGlmIFNORF9TT0MKICAgICAgICBoZWxwCiAgICAgICAgICBTdXBwb3J0IGZvciBuVmlkaWEgU2VhYm9hcmQgZGV2ZWxvcG1lbnQgcGxhdGZvcm0uIEl0IHdpbGwKIAkgYWxzbyBiZSBpbmNsdWRlZCBmb3Igc29tZSBvZiB0aGUgZGVyaXZhdGl2ZSBib2FyZHMgdGhhdAogCSBoYXZlIGxhcmdlIHNpbWlsYXJpdGllcyB3aXRoIHRoZSBzZWFib2FyZCBkZXNpZ24uCiAKK2NvbmZpZyBNQUNIX1RFR1JBX0RUCisJYm9vbCAiR2VuZXJpYyBUZWdyYSBib2FyZCAoRkRUIHN1cHBvcnQpIgorCXNlbGVjdCBVU0VfT0YKKwloZWxwCisJICBTdXBwb3J0IGZvciBnZW5lcmljIG5WaWRpYSBUZWdyYSBib2FyZHMgdXNpbmcgRmxhdHRlbmVkIERldmljZSBUcmVlCisKIGNvbmZpZyBNQUNIX1RSSU1TTElDRQogICAgICAgIGJvb2wgIlRyaW1TbGljZSBib2FyZCIKICAgICAgICBzZWxlY3QgVEVHUkFfUENJCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL01ha2VmaWxlIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9NYWtlZmlsZQppbmRleCBlZDU4ZWY5Li5mMTFiOTEwIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXRlZ3JhL01ha2VmaWxlCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvTWFrZWZpbGUKQEAgLTI5LDUgKzI5LDggQEAKIG9iai0ke0NPTkZJR19NQUNIX1NFQUJPQVJEfSAgICAgICAgICAgICArPSBib2FyZC1zZWFib2FyZC5vCiBvYmotJHtDT05GSUdfTUFDSF9TRUFCT0FSRH0gICAgICAgICAgICAgKz0gYm9hcmQtc2VhYm9hcmQtcGlubXV4Lm8KIAorb2JqLSR7Q09ORklHX01BQ0hfVEVHUkFfRFR9ICAgICAgICAgICAgICs9IGJvYXJkLWR0Lm8KK29iai0ke0NPTkZJR19NQUNIX1RFR1JBX0RUfSAgICAgICAgICAgICArPSBib2FyZC1oYXJtb255LXBpbm11eC5vCisKIG9iai0ke0NPTkZJR19NQUNIX1RSSU1TTElDRX0gICAgICAgICAgICArPSBib2FyZC10cmltc2xpY2Uubwogb2JqLSR7Q09ORklHX01BQ0hfVFJJTVNMSUNFfSAgICAgICAgICAgICs9IGJvYXJkLXRyaW1zbGljZS1waW5tdXgubwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9NYWtlZmlsZS5ib290IGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9NYWtlZmlsZS5ib290CmluZGV4IGRiNTJkNjEuLjQyOGFkMTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtdGVncmEvTWFrZWZpbGUuYm9vdAorKysgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL01ha2VmaWxlLmJvb3QKQEAgLTEsMyArMSw2IEBACiB6cmVsYWRkci0kKENPTkZJR19BUkNIX1RFR1JBXzJ4X1NPQykJOj0gMHgwMDAwODAwMAogcGFyYW1zX3BoeXMtJChDT05GSUdfQVJDSF9URUdSQV8yeF9TT0MpCTo9IDB4MDAwMDAxMDAKIGluaXRyZF9waHlzLSQoQ09ORklHX0FSQ0hfVEVHUkFfMnhfU09DKQk6PSAweDAwODAwMDAwCisKK2R0Yi0kKENPTkZJR19NQUNIX0hBUk1PTlkpICs9IHRlZ3JhLWhhcm1vbnkuZHRiCitkdGItJChDT05GSUdfTUFDSF9TRUFCT0FSRCkgKz0gdGVncmEtc2VhYm9hcmQuZHRiCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLWR0LmMgYi9hcmNoL2FybS9tYWNoLXRlZ3JhL2JvYXJkLWR0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY0N2UwNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvYXJtL21hY2gtdGVncmEvYm9hcmQtZHQuYwpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIG5WaWRpYSBUZWdyYSBkZXZpY2UgdHJlZSBib2FyZCBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFNlY3JldCBMYWIgVGVjaG5vbG9naWVzLCBMdGQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlLCBJbmMuCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQKKyAqIG1heSBiZSBjb3BpZWQsIGRpc3RyaWJ1dGVkLCBhbmQgbW9kaWZpZWQgdW5kZXIgdGhvc2UgdGVybXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaXJxZG9tYWluLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZmR0Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfaXJxLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KKyNpbmNsdWRlIDxsaW51eC9wZGFfcG93ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy10ZWdyYS5oPgorCisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisjaW5jbHVkZSA8YXNtL21hY2gvdGltZS5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorCisjaW5jbHVkZSA8bWFjaC9pb21hcC5oPgorI2luY2x1ZGUgPG1hY2gvaXJxcy5oPgorCisjaW5jbHVkZSAiYm9hcmQuaCIKKyNpbmNsdWRlICJib2FyZC1oYXJtb255LmgiCisjaW5jbHVkZSAiY2xvY2suaCIKKyNpbmNsdWRlICJkZXZpY2VzLmgiCisKK3ZvaWQgaGFybW9ueV9waW5tdXhfaW5pdCh2b2lkKTsKK3ZvaWQgc2VhYm9hcmRfcGlubXV4X2luaXQodm9pZCk7CisKKworc3RydWN0IG9mX2Rldl9hdXhkYXRhIHRlZ3JhMjBfYXV4ZGF0YV9sb29rdXBbXSBfX2luaXRkYXRhID0geworCU9GX0RFVl9BVVhEQVRBKCJudmlkaWEsdGVncmEyMC1zZGhjaSIsIFRFR1JBX1NETU1DMV9CQVNFLCAic2RoY2ktdGVncmEuMCIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJudmlkaWEsdGVncmEyMC1zZGhjaSIsIFRFR1JBX1NETU1DMl9CQVNFLCAic2RoY2ktdGVncmEuMSIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJudmlkaWEsdGVncmEyMC1zZGhjaSIsIFRFR1JBX1NETU1DM19CQVNFLCAic2RoY2ktdGVncmEuMiIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJudmlkaWEsdGVncmEyMC1zZGhjaSIsIFRFR1JBX1NETU1DNF9CQVNFLCAic2RoY2ktdGVncmEuMyIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJudmlkaWEsdGVncmEyMC1pMmMiLCBURUdSQV9JMkNfQkFTRSwgInRlZ3JhLWkyYy4wIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoIm52aWRpYSx0ZWdyYTIwLWkyYyIsIFRFR1JBX0kyQzJfQkFTRSwgInRlZ3JhLWkyYy4xIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoIm52aWRpYSx0ZWdyYTIwLWkyYyIsIFRFR1JBX0kyQzNfQkFTRSwgInRlZ3JhLWkyYy4yIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoIm52aWRpYSx0ZWdyYTIwLWkyYyIsIFRFR1JBX0RWQ19CQVNFLCAidGVncmEtaTJjLjMiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgibnZpZGlhLHRlZ3JhMjAtaTJzIiwgVEVHUkFfSTJTMV9CQVNFLCAidGVncmEtaTJzLjAiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgibnZpZGlhLHRlZ3JhMjAtaTJzIiwgVEVHUkFfSTJTMV9CQVNFLCAidGVncmEtaTJzLjEiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgibnZpZGlhLHRlZ3JhMjAtZGFzIiwgVEVHUkFfQVBCX01JU0NfREFTX0JBU0UsICJ0ZWdyYS1kYXMiLCBOVUxMKSwKKwl7fQorfTsKKworc3RhdGljIF9faW5pdGRhdGEgc3RydWN0IHRlZ3JhX2Nsa19pbml0X3RhYmxlIHRlZ3JhX2R0X2Nsa19pbml0X3RhYmxlW10gPSB7CisJLyogbmFtZQkJcGFyZW50CQlyYXRlCQllbmFibGVkICovCisJeyAidWFydGQiLAkicGxsX3AiLAkyMTYwMDAwMDAsCXRydWUgfSwKKwl7IE5VTEwsCQlOVUxMLAkJMCwJCTB9LAorfTsKKworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgdGVncmFfZHRfbWF0Y2hfdGFibGVbXSBfX2luaXRkYXRhID0geworCXsgLmNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyIsIH0sCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHRlZ3JhX2R0X2dpY19tYXRjaFtdIF9faW5pdGRhdGEgPSB7CisJeyAuY29tcGF0aWJsZSA9ICJudmlkaWEsdGVncmEyMC1naWMiLCB9LAorCXt9Cit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgdGVncmFfZHRfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKKworCW5vZGUgPSBvZl9maW5kX21hdGNoaW5nX25vZGVfYnlfYWRkcmVzcyhOVUxMLCB0ZWdyYV9kdF9naWNfbWF0Y2gsCisJCQkJCQlURUdSQV9BUk1fSU5UX0RJU1RfQkFTRSk7CisJaWYgKG5vZGUpCisJCWlycV9kb21haW5fYWRkX3NpbXBsZShub2RlLCBJTlRfR0lDX0JBU0UpOworCisJdGVncmFfY2xrX2luaXRfZnJvbV90YWJsZSh0ZWdyYV9kdF9jbGtfaW5pdF90YWJsZSk7CisKKwlpZiAob2ZfbWFjaGluZV9pc19jb21wYXRpYmxlKCJudmlkaWEsaGFybW9ueSIpKQorCQloYXJtb255X3Bpbm11eF9pbml0KCk7CisJZWxzZSBpZiAob2ZfbWFjaGluZV9pc19jb21wYXRpYmxlKCJudmlkaWEsc2VhYm9hcmQiKSkKKwkJc2VhYm9hcmRfcGlubXV4X2luaXQoKTsKKworCS8qCisJICogRmluaXNoZWQgd2l0aCB0aGUgc3RhdGljIHJlZ2lzdHJhdGlvbnMgbm93OyBmaWxsIGluIHRoZSBtaXNzaW5nCisJICogZGV2aWNlcworCSAqLworCW9mX3BsYXRmb3JtX3BvcHVsYXRlKE5VTEwsIHRlZ3JhX2R0X21hdGNoX3RhYmxlLCB0ZWdyYTIwX2F1eGRhdGFfbG9va3VwLCBOVUxMKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiB0ZWdyYV9kdF9ib2FyZF9jb21wYXRbXSA9IHsKKwkibnZpZGlhLGhhcm1vbnkiLAorCSJudmlkaWEsc2VhYm9hcmQiLAorCU5VTEwKK307CisKK0RUX01BQ0hJTkVfU1RBUlQoVEVHUkFfRFQsICJuVmlkaWEgVGVncmEgKEZsYXR0ZW5lZCBEZXZpY2UgVHJlZSkiKQorCS5tYXBfaW8JCT0gdGVncmFfbWFwX2NvbW1vbl9pbywKKwkuaW5pdF9lYXJseQk9IHRlZ3JhX2luaXRfZWFybHksCisJLmluaXRfaXJxCT0gdGVncmFfaW5pdF9pcnEsCisJLnRpbWVyCQk9ICZ0ZWdyYV90aW1lciwKKwkuaW5pdF9tYWNoaW5lCT0gdGVncmFfZHRfaW5pdCwKKwkuZHRfY29tcGF0CT0gdGVncmFfZHRfYm9hcmRfY29tcGF0LAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdGVncmEvcGNpZS5jIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9wY2llLmMKaW5kZXggMDMxY2QwYS4uZjFmNjk5ZCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC10ZWdyYS9wY2llLmMKKysrIGIvYXJjaC9hcm0vbWFjaC10ZWdyYS9wY2llLmMKQEAgLTQ0OSw3ICs0NDksNyBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IHRlZ3JhX3BjaWVfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IHRlZ3JhX3BjaWVfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJcmV0dXJuIElOVF9QQ0lFX0lOVFI7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9LY29uZmlnIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvS2NvbmZpZwppbmRleCA5Y2RlYzVhLi5jMWYzOGY2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9LY29uZmlnCisrKyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL0tjb25maWcKQEAgLTE3LDQgKzE3LDEyIEBACiAJICBJbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBBUk0oUikgVmVyc2F0aWxlIEFwcGxpY2F0aW9uIEJhc2Vib2FyZAogCSAgZm9yIHRoZSBBUk05MjZFSi1TLgogCitjb25maWcgTUFDSF9WRVJTQVRJTEVfRFQKKwlib29sICJTdXBwb3J0IFZlcnNhdGlsZSBwbGF0Zm9ybSBmcm9tIGRldmljZSB0cmVlIgorCXNlbGVjdCBVU0VfT0YKKwlzZWxlY3QgQ1BVX0FSTTkyNlQKKwloZWxwCisJICBJbmNsdWRlIHN1cHBvcnQgZm9yIHRoZSBBUk0oUikgVmVyc2F0aWxlL1BCIHBsYXRmb3JtLAorCSAgdXNpbmcgdGhlIGRldmljZSB0cmVlIGZvciBkaXNjb3ZlcnkKKwogZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9NYWtlZmlsZQppbmRleCA5N2NmNGQ4Li44MWZhM2ZlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9NYWtlZmlsZQpAQCAtNSw0ICs1LDUgQEAKIG9iai15CQkJCQk6PSBjb3JlLm8KIG9iai0kKENPTkZJR19BUkNIX1ZFUlNBVElMRV9QQikJCSs9IHZlcnNhdGlsZV9wYi5vCiBvYmotJChDT05GSUdfTUFDSF9WRVJTQVRJTEVfQUIpCQkrPSB2ZXJzYXRpbGVfYWIubworb2JqLSQoQ09ORklHX01BQ0hfVkVSU0FUSUxFX0RUKQkJKz0gdmVyc2F0aWxlX2R0Lm8KIG9iai0kKENPTkZJR19QQ0kpCQkJKz0gcGNpLm8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuYyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuYwppbmRleCAwYzk5Y2YwLi5lMzQwYTU0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jb3JlLmMKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY29yZS5jCkBAIC0yNCw2ICsyNCw5IEBACiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxZG9tYWluLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfYWRkcmVzcy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvYW1iYS9idXMuaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL2NsY2QuaD4KICNpbmNsdWRlIDxsaW51eC9hbWJhL3BsMDYxLmg+CkBAIC04MywxMyArODYsMjYgQEAKICNkZWZpbmUgUElDX01BU0sJMAogI2VuZGlmCiAKKy8qIExvb2t1cCB0YWJsZSBmb3IgZmluZGluZyBhIERUIG5vZGUgdGhhdCByZXByZXNlbnRzIHRoZSB2aWMgaW5zdGFuY2UgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHZpY19vZl9tYXRjaFtdIF9faW5pdGNvbnN0ID0geworCXsgLmNvbXBhdGlibGUgPSAiYXJtLHZlcnNhdGlsZS12aWMiLCB9LAorCXt9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzaWNfb2ZfbWF0Y2hbXSBfX2luaXRjb25zdCA9IHsKKwl7IC5jb21wYXRpYmxlID0gImFybSx2ZXJzYXRpbGUtc2ljIiwgfSwKKwl7fQorfTsKKwogdm9pZCBfX2luaXQgdmVyc2F0aWxlX2luaXRfaXJxKHZvaWQpCiB7CiAJdmljX2luaXQoVkFfVklDX0JBU0UsIElSUV9WSUNfU1RBUlQsIH4wLCAwKTsKKwlpcnFfZG9tYWluX2dlbmVyYXRlX3NpbXBsZSh2aWNfb2ZfbWF0Y2gsIFZFUlNBVElMRV9WSUNfQkFTRSwgSVJRX1ZJQ19TVEFSVCk7CiAKIAl3cml0ZWwofjAsIFZBX1NJQ19CQVNFICsgU0lDX0lSUV9FTkFCTEVfQ0xFQVIpOwogCiAJZnBnYV9pcnFfaW5pdChJUlFfVklDU09VUkNFMzEsIH5QSUNfTUFTSywgJnNpY19pcnEpOworCWlycV9kb21haW5fZ2VuZXJhdGVfc2ltcGxlKHNpY19vZl9tYXRjaCwgVkVSU0FUSUxFX1NJQ19CQVNFLCBJUlFfU0lDX1NUQVJUKTsKIAogCS8qCiAJICogSW50ZXJydXB0cyBvbiBzZWNvbmRhcnkgY29udHJvbGxlciBmcm9tIDAgdG8gOCBhcmUgcm91dGVkIHRvCkBAIC02NDYsNiArNjYyLDUyIEBACiAJJmttaTFfZGV2aWNlLAogfTsKIAorI2lmZGVmIENPTkZJR19PRgorLyoKKyAqIExvb2t1cCB0YWJsZSBmb3IgYXR0YWNoaW5nIGEgc3BlY2lmaWMgbmFtZSBhbmQgcGxhdGZvcm1fZGF0YSBwb2ludGVyIHRvCisgKiBkZXZpY2VzIGFzIHRoZXkgZ2V0IGNyZWF0ZWQgYnkgb2ZfcGxhdGZvcm1fcG9wdWxhdGUoKS4gIElkZWFsbHkgdGhpcyB0YWJsZQorICogd291bGQgbm90IGV4aXN0LCBidXQgdGhlIGN1cnJlbnQgY2xvY2sgaW1wbGVtZW50YXRpb24gZGVwZW5kcyBvbiBzb21lIGRldmljZXMKKyAqIGhhdmluZyBhIHNwZWNpZmljIG5hbWUuCisgKi8KK3N0cnVjdCBvZl9kZXZfYXV4ZGF0YSB2ZXJzYXRpbGVfYXV4ZGF0YV9sb29rdXBbXSBfX2luaXRkYXRhID0geworCU9GX0RFVl9BVVhEQVRBKCJhcm0scHJpbWVjZWxsIiwgVkVSU0FUSUxFX01NQ0kwX0JBU0UsICJmcGdhOjA1IiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImFybSxwcmltZWNlbGwiLCBWRVJTQVRJTEVfS01JMF9CQVNFLCAiZnBnYTowNiIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJhcm0scHJpbWVjZWxsIiwgVkVSU0FUSUxFX0tNSTFfQkFTRSwgImZwZ2E6MDciLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiYXJtLHByaW1lY2VsbCIsIFZFUlNBVElMRV9VQVJUM19CQVNFLCAiZnBnYTowOSIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJhcm0scHJpbWVjZWxsIiwgVkVSU0FUSUxFX01NQ0kxX0JBU0UsICJmcGdhOjBiIiwgTlVMTCksCisKKwlPRl9ERVZfQVVYREFUQSgiYXJtLHByaW1lY2VsbCIsIFZFUlNBVElMRV9DTENEX0JBU0UsICJkZXY6MjAiLCAmY2xjZF9wbGF0X2RhdGEpLAorCU9GX0RFVl9BVVhEQVRBKCJhcm0scHJpbWVjZWxsIiwgVkVSU0FUSUxFX1VBUlQwX0JBU0UsICJkZXY6ZjEiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiYXJtLHByaW1lY2VsbCIsIFZFUlNBVElMRV9VQVJUMV9CQVNFLCAiZGV2OmYyIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImFybSxwcmltZWNlbGwiLCBWRVJTQVRJTEVfVUFSVDJfQkFTRSwgImRldjpmMyIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJhcm0scHJpbWVjZWxsIiwgVkVSU0FUSUxFX1NTUF9CQVNFLCAiZGV2OmY0IiwgTlVMTCksCisKKyNpZiAwCisJLyoKKwkgKiBUaGVzZSBlbnRyaWVzIGFyZSB1bm5lY2Vzc2FyeSBiZWNhdXNlIG5vIGNsb2NrcyByZWZlcmVuY2luZworCSAqIHRoZW0uICBJJ3ZlIGxlZnQgdGhlbSBpbiBmb3Igbm93IGFzIHBsYWNlIGhvbGRlcnMgaW4gY2FzZQorCSAqIGFueSBvZiB0aGVtIG5lZWQgdG8gYmUgYWRkZWQgYmFjaywgYnV0IHRoZXkgc2hvdWxkIGJlCisJICogcmVtb3ZlZCBiZWZvcmUgYWN0dWFsbHkgY29tbWl0dGluZyB0aGlzIHBhdGNoLiAgLS1nY2wKKwkgKi8KKwlPRl9ERVZfQVVYREFUQSgiYXJtLHByaW1lY2VsbCIsIFZFUlNBVElMRV9BQUNJX0JBU0UsICJmcGdhOjA0IiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImFybSxwcmltZWNlbGwiLCBWRVJTQVRJTEVfU0NJMV9CQVNFLCAiZnBnYTowYSIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJhcm0scHJpbWVjZWxsIiwgVkVSU0FUSUxFX1NNQ19CQVNFLCAiZGV2OjAwIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImFybSxwcmltZWNlbGwiLCBWRVJTQVRJTEVfTVBNQ19CQVNFLCAiZGV2OjEwIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImFybSxwcmltZWNlbGwiLCBWRVJTQVRJTEVfRE1BQ19CQVNFLCAiZGV2OjMwIiwgTlVMTCksCisKKwlPRl9ERVZfQVVYREFUQSgiYXJtLHByaW1lY2VsbCIsIFZFUlNBVElMRV9TQ1RMX0JBU0UsICJkZXY6ZTAiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiYXJtLHByaW1lY2VsbCIsIFZFUlNBVElMRV9XQVRDSERPR19CQVNFLCAiZGV2OmUxIiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImFybSxwcmltZWNlbGwiLCBWRVJTQVRJTEVfR1BJTzBfQkFTRSwgImRldjplNCIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJhcm0scHJpbWVjZWxsIiwgVkVSU0FUSUxFX0dQSU8xX0JBU0UsICJkZXY6ZTUiLCBOVUxMKSwKKwlPRl9ERVZfQVVYREFUQSgiYXJtLHByaW1lY2VsbCIsIFZFUlNBVElMRV9HUElPMl9CQVNFLCAiZGV2OmU2IiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImFybSxwcmltZWNlbGwiLCBWRVJTQVRJTEVfR1BJTzNfQkFTRSwgImRldjplNyIsIE5VTEwpLAorCU9GX0RFVl9BVVhEQVRBKCJhcm0scHJpbWVjZWxsIiwgVkVSU0FUSUxFX1JUQ19CQVNFLCAiZGV2OmU4IiwgTlVMTCksCisJT0ZfREVWX0FVWERBVEEoImFybSxwcmltZWNlbGwiLCBWRVJTQVRJTEVfU0NJX0JBU0UsICJkZXY6ZjAiLCBOVUxMKSwKKyNlbmRpZgorCXt9Cit9OworI2VuZGlmCisKICNpZmRlZiBDT05GSUdfTEVEUwogI2RlZmluZSBWQV9MRURTX0JBU0UgKF9faW9fYWRkcmVzcyhWRVJTQVRJTEVfU1lTX0JBU0UpICsgVkVSU0FUSUxFX1NZU19MRURfT0ZGU0VUKQogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jb3JlLmggYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS9jb3JlLmgKaW5kZXggZmQ2NDA0ZS4uZTAxNDIyNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvY29yZS5oCisrKyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL2NvcmUuaApAQCAtMjMsNiArMjMsNyBAQAogI2RlZmluZSBfX0FTTV9BUkNIX1ZFUlNBVElMRV9ICiAKICNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAKIGV4dGVybiB2b2lkIF9faW5pdCB2ZXJzYXRpbGVfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkIF9faW5pdCB2ZXJzYXRpbGVfaW5pdF9lYXJseSh2b2lkKTsKQEAgLTMwLDYgKzMxLDkgQEAKIGV4dGVybiB2b2lkIF9faW5pdCB2ZXJzYXRpbGVfbWFwX2lvKHZvaWQpOwogZXh0ZXJuIHN0cnVjdCBzeXNfdGltZXIgdmVyc2F0aWxlX3RpbWVyOwogZXh0ZXJuIHVuc2lnbmVkIGludCBtbWNfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmRldik7CisjaWZkZWYgQ09ORklHX09GCitleHRlcm4gc3RydWN0IG9mX2Rldl9hdXhkYXRhIHZlcnNhdGlsZV9hdXhkYXRhX2xvb2t1cFtdOworI2VuZGlmCiAKICNkZWZpbmUgQU1CQV9ERVZJQ0UobmFtZSxidXNpZCxiYXNlLHBsYXQpCQkJXAogc3RhdGljIHN0cnVjdCBhbWJhX2RldmljZSBuYW1lIyNfZGV2aWNlID0gewkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3BjaS5jIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvcGNpLmMKaW5kZXggNzg0OGExNy4uYzg5OGRlYiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvcGNpLmMKKysrIGIvYXJjaC9hcm0vbWFjaC12ZXJzYXRpbGUvcGNpLmMKQEAgLTMyOCw3ICszMjgsNyBAQAogLyoKICAqIG1hcCB0aGUgc3BlY2lmaWVkIGRldmljZS9zbG90L3BpbiB0byBhbiBJUlEuICAgRGlmZmVyZW50IGJhY2twbGFuZXMgbWF5IG5lZWQgdG8gbW9kaWZ5IHRoaXMuCiAgKi8KLXN0YXRpYyBpbnQgX19pbml0IHZlcnNhdGlsZV9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK3N0YXRpYyBpbnQgX19pbml0IHZlcnNhdGlsZV9tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpbnQgaXJxOwogCWludCBkZXZzbG90ID0gUENJX1NMT1QoZGV2LT5kZXZmbik7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS92ZXJzYXRpbGVfZHQuYyBiL2FyY2gvYXJtL21hY2gtdmVyc2F0aWxlL3ZlcnNhdGlsZV9kdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZTAzN2MKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2FybS9tYWNoLXZlcnNhdGlsZS92ZXJzYXRpbGVfZHQuYwpAQCAtMCwwICsxLDUxIEBACisvKgorICogVmVyc2F0aWxlIGJvYXJkIHN1cHBvcnQgdXNpbmcgdGhlIGRldmljZSB0cmVlCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMCBTZWNyZXQgTGFiIFRlY2hub2xvZ2llcyBMdGQuCisgKiAgQ29weXJpZ2h0IChDKSAyMDA5IEplcmVteSBLZXJyIDxqZXJlbXkua2VyckBjYW5vbmljYWwuY29tPgorICogIENvcHlyaWdodCAoQykgMjAwNCBBUk0gTGltaXRlZAorICogIENvcHlyaWdodCAoQykgMjAwMCBEZWVwIEJsdWUgU29sdXRpb25zIEx0ZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC9hcmNoLmg+CisKKyNpbmNsdWRlICJjb3JlLmgiCisKK3N0YXRpYyB2b2lkIF9faW5pdCB2ZXJzYXRpbGVfZHRfaW5pdCh2b2lkKQoreworCW9mX3BsYXRmb3JtX3BvcHVsYXRlKE5VTEwsIG9mX2RlZmF1bHRfYnVzX21hdGNoX3RhYmxlLAorCQkJICAgICB2ZXJzYXRpbGVfYXV4ZGF0YV9sb29rdXAsIE5VTEwpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqdmVyc2F0aWxlX2R0X21hdGNoW10gX19pbml0Y29uc3QgPSB7CisJImFybSx2ZXJzYXRpbGUtYWIiLAorCSJhcm0sdmVyc2F0aWxlLXBiIiwKKwlOVUxMLAorfTsKKworRFRfTUFDSElORV9TVEFSVChWRVJTQVRJTEVfUEIsICJBUk0tVmVyc2F0aWxlIChEZXZpY2UgVHJlZSBTdXBwb3J0KSIpCisJLm1hcF9pbwkJPSB2ZXJzYXRpbGVfbWFwX2lvLAorCS5pbml0X2Vhcmx5CT0gdmVyc2F0aWxlX2luaXRfZWFybHksCisJLmluaXRfaXJxCT0gdmVyc2F0aWxlX2luaXRfaXJxLAorCS50aW1lcgkJPSAmdmVyc2F0aWxlX3RpbWVyLAorCS5pbml0X21hY2hpbmUJPSB2ZXJzYXRpbGVfZHRfaW5pdCwKKwkuZHRfY29tcGF0CT0gdmVyc2F0aWxlX2R0X21hdGNoLAorTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtenlucS9NYWtlZmlsZSBiL2FyY2gvYXJtL21hY2gtenlucS9NYWtlZmlsZQppbmRleCBjNTUwYzY3Li4zOTcyNjhjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXp5bnEvTWFrZWZpbGUKKysrIGIvYXJjaC9hcm0vbWFjaC16eW5xL01ha2VmaWxlCkBAIC0zLDQgKzMsNCBAQAogIwogCiAjIENvbW1vbiBzdXBwb3J0Ci1vYmoteSAJCQkJOj0gY29tbW9uLm8gdGltZXIubyBib2FyZF9kdC5vCitvYmoteQkJCQk6PSBjb21tb24ubyB0aW1lci5vCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXp5bnEvYm9hcmRfZHQuYyBiL2FyY2gvYXJtL21hY2gtenlucS9ib2FyZF9kdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2FyY2gvYXJtL21hY2gtenlucS9ib2FyZF9kdC5jCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0tZmVjLmMgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLWZlYy5jCmluZGV4IDRmYzZmZmMuLjBiYWU0NGUgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0tZmVjLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1mZWMuYwpAQCAtMTEsNDAgKzExLDQ1IEBACiAjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1hY2gvZGV2aWNlcy1jb21tb24uaD4KIAotI2RlZmluZSBpbXhfZmVjX2RhdGFfZW50cnlfc2luZ2xlKHNvYykJCQkJCVwKKyNkZWZpbmUgaW14X2ZlY19kYXRhX2VudHJ5X3NpbmdsZShzb2MsIF9kZXZpZCkJCQkJXAogCXsJCQkJCQkJCVwKKwkJLmRldmlkID0gX2RldmlkLAkJCQkJXAogCQkuaW9iYXNlID0gc29jICMjIF9GRUNfQkFTRV9BRERSLAkJCVwKIAkJLmlycSA9IHNvYyAjIyBfSU5UX0ZFQywJCQkJCVwKIAl9CiAKICNpZmRlZiBDT05GSUdfU09DX0lNWDI1CiBjb25zdCBzdHJ1Y3QgaW14X2ZlY19kYXRhIGlteDI1X2ZlY19kYXRhIF9faW5pdGNvbnN0ID0KLQlpbXhfZmVjX2RhdGFfZW50cnlfc2luZ2xlKE1YMjUpOworCWlteF9mZWNfZGF0YV9lbnRyeV9zaW5nbGUoTVgyNSwgImlteDI1LWZlYyIpOwogI2VuZGlmIC8qIGlmZGVmIENPTkZJR19TT0NfSU1YMjUgKi8KIAogI2lmZGVmIENPTkZJR19TT0NfSU1YMjcKIGNvbnN0IHN0cnVjdCBpbXhfZmVjX2RhdGEgaW14MjdfZmVjX2RhdGEgX19pbml0Y29uc3QgPQotCWlteF9mZWNfZGF0YV9lbnRyeV9zaW5nbGUoTVgyNyk7CisJaW14X2ZlY19kYXRhX2VudHJ5X3NpbmdsZShNWDI3LCAiaW14MjctZmVjIik7CiAjZW5kaWYgLyogaWZkZWYgQ09ORklHX1NPQ19JTVgyNyAqLwogCiAjaWZkZWYgQ09ORklHX1NPQ19JTVgzNQorLyogaS5teDM1IGhhcyB0aGUgaS5teDI3IHR5cGUgZmVjICovCiBjb25zdCBzdHJ1Y3QgaW14X2ZlY19kYXRhIGlteDM1X2ZlY19kYXRhIF9faW5pdGNvbnN0ID0KLQlpbXhfZmVjX2RhdGFfZW50cnlfc2luZ2xlKE1YMzUpOworCWlteF9mZWNfZGF0YV9lbnRyeV9zaW5nbGUoTVgzNSwgImlteDI3LWZlYyIpOwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfU09DX0lNWDUwCisvKiBpLm14NTAgaGFzIHRoZSBpLm14MjUgdHlwZSBmZWMgKi8KIGNvbnN0IHN0cnVjdCBpbXhfZmVjX2RhdGEgaW14NTBfZmVjX2RhdGEgX19pbml0Y29uc3QgPQotCWlteF9mZWNfZGF0YV9lbnRyeV9zaW5nbGUoTVg1MCk7CisJaW14X2ZlY19kYXRhX2VudHJ5X3NpbmdsZShNWDUwLCAiaW14MjUtZmVjIik7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19TT0NfSU1YNTEKKy8qIGkubXg1MSBoYXMgdGhlIGkubXgyNyB0eXBlIGZlYyAqLwogY29uc3Qgc3RydWN0IGlteF9mZWNfZGF0YSBpbXg1MV9mZWNfZGF0YSBfX2luaXRjb25zdCA9Ci0JaW14X2ZlY19kYXRhX2VudHJ5X3NpbmdsZShNWDUxKTsKKwlpbXhfZmVjX2RhdGFfZW50cnlfc2luZ2xlKE1YNTEsICJpbXgyNy1mZWMiKTsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1NPQ19JTVg1MworLyogaS5teDUzIGhhcyB0aGUgaS5teDI1IHR5cGUgZmVjICovCiBjb25zdCBzdHJ1Y3QgaW14X2ZlY19kYXRhIGlteDUzX2ZlY19kYXRhIF9faW5pdGNvbnN0ID0KLQlpbXhfZmVjX2RhdGFfZW50cnlfc2luZ2xlKE1YNTMpOworCWlteF9mZWNfZGF0YV9lbnRyeV9zaW5nbGUoTVg1MywgImlteDI1LWZlYyIpOwogI2VuZGlmCiAKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9faW5pdCBpbXhfYWRkX2ZlYygKQEAgLTYzLDcgKzY4LDcgQEAKIAkJfSwKIAl9OwogCi0JcmV0dXJuIGlteF9hZGRfcGxhdGZvcm1fZGV2aWNlX2RtYW1hc2soImZlYyIsIDAsCisJcmV0dXJuIGlteF9hZGRfcGxhdGZvcm1fZGV2aWNlX2RtYW1hc2soZGF0YS0+ZGV2aWQsIDAsCiAJCQlyZXMsIEFSUkFZX1NJWkUocmVzKSwKIAkJCXBkYXRhLCBzaXplb2YoKnBkYXRhKSwgRE1BX0JJVF9NQVNLKDMyKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLWlteC1kbWEuYyBiL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0taW14LWRtYS5jCmluZGV4IDJiMGZkYjIuLjdmYTdlOWMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0taW14LWRtYS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0taW14LWRtYS5jCkBAIC0xNCw3ICsxNCw3IEBACiAJCQkiaW14LWRtYSIsIC0xLCBOVUxMLCAwLCBOVUxMLCAwKTsKIH0KIAotc3RydWN0IHBsYXRmb3JtX2RldmljZSBfX2luaXQgX19tYXliZV91bnVzZWQgKmlteF9hZGRfaW14X3NkbWEoCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIF9faW5pdCBfX21heWJlX3VudXNlZCAqaW14X2FkZF9pbXhfc2RtYShjaGFyICpuYW1lLAogCXJlc291cmNlX3NpemVfdCBpb2Jhc2UsIGludCBpcnEsIHN0cnVjdCBzZG1hX3BsYXRmb3JtX2RhdGEgKnBkYXRhKQogewogCXN0cnVjdCByZXNvdXJjZSByZXNbXSA9IHsKQEAgLTI5LDYgKzI5LDYgQEAKIAkJfSwKIAl9OwogCi0JcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9yZXNuZGF0YSgmbXhjX2FoYl9idXMsICJpbXgtc2RtYSIsCisJcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9yZXNuZGF0YSgmbXhjX2FoYl9idXMsIG5hbWUsCiAJCQktMSwgcmVzLCBBUlJBWV9TSVpFKHJlcyksIHBkYXRhLCBzaXplb2YoKnBkYXRhKSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLWlteC11YXJ0LmMgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLWlteC11YXJ0LmMKaW5kZXggY2ZjZThjOS4uMjAyMGQ4NDkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0taW14LXVhcnQuYworKysgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLWlteC11YXJ0LmMKQEAgLTE1Miw3ICsxNTIsNyBAQAogCQl9LAogCX07CiAKLQlyZXR1cm4gaW14X2FkZF9wbGF0Zm9ybV9kZXZpY2UoImlteC11YXJ0IiwgZGF0YS0+aWQsIHJlcywKKwlyZXR1cm4gaW14X2FkZF9wbGF0Zm9ybV9kZXZpY2UoImlteDEtdWFydCIsIGRhdGEtPmlkLCByZXMsCiAJCQlBUlJBWV9TSVpFKHJlcyksIHBkYXRhLCBzaXplb2YoKnBkYXRhKSk7CiB9CiAKQEAgLTE3Miw2ICsxNzIsNyBAQAogCQl9LAogCX07CiAKLQlyZXR1cm4gaW14X2FkZF9wbGF0Zm9ybV9kZXZpY2UoImlteC11YXJ0IiwgZGF0YS0+aWQsIHJlcywgQVJSQVlfU0laRShyZXMpLAotCQkJcGRhdGEsIHNpemVvZigqcGRhdGEpKTsKKwkvKiBpLm14MjEgdHlwZSB1YXJ0IHJ1bnMgb24gYWxsIGkubXggZXhjZXB0IGkubXgxICovCisJcmV0dXJuIGlteF9hZGRfcGxhdGZvcm1fZGV2aWNlKCJpbXgyMS11YXJ0IiwgZGF0YS0+aWQsCisJCQlyZXMsIEFSUkFZX1NJWkUocmVzKSwgcGRhdGEsIHNpemVvZigqcGRhdGEpKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0tc2RoY2ktZXNkaGMtaW14LmMgYi9hcmNoL2FybS9wbGF0LW14Yy9kZXZpY2VzL3BsYXRmb3JtLXNkaGNpLWVzZGhjLWlteC5jCmluZGV4IDZiMjk0MGIuLjU5NTVmNWQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2RldmljZXMvcGxhdGZvcm0tc2RoY2ktZXNkaGMtaW14LmMKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvZGV2aWNlcy9wbGF0Zm9ybS1zZGhjaS1lc2RoYy1pbXguYwpAQCAtMTAsMjEgKzEwLDIyIEBACiAjaW5jbHVkZSA8bWFjaC9kZXZpY2VzLWNvbW1vbi5oPgogI2luY2x1ZGUgPG1hY2gvZXNkaGMuaD4KIAotI2RlZmluZSBpbXhfc2RoY2lfZXNkaGNfaW14X2RhdGFfZW50cnlfc2luZ2xlKHNvYywgX2lkLCBod2lkKSBcCisjZGVmaW5lIGlteF9zZGhjaV9lc2RoY19pbXhfZGF0YV9lbnRyeV9zaW5nbGUoc29jLCBfZGV2aWQsIF9pZCwgaHdpZCkgXAogCXsJCQkJCQkJCVwKKwkJLmRldmlkID0gX2RldmlkLAkJCQkJXAogCQkuaWQgPSBfaWQsCQkJCQkJXAogCQkuaW9iYXNlID0gc29jICMjIF9FU0RIQyAjIyBod2lkICMjIF9CQVNFX0FERFIsCVwKIAkJLmlycSA9IHNvYyAjIyBfSU5UX0VTREhDICMjIGh3aWQsCQkJXAogCX0KIAotI2RlZmluZSBpbXhfc2RoY2lfZXNkaGNfaW14X2RhdGFfZW50cnkoc29jLCBpZCwgaHdpZCkJXAotCVtpZF0gPSBpbXhfc2RoY2lfZXNkaGNfaW14X2RhdGFfZW50cnlfc2luZ2xlKHNvYywgaWQsIGh3aWQpCisjZGVmaW5lIGlteF9zZGhjaV9lc2RoY19pbXhfZGF0YV9lbnRyeShzb2MsIGRldmlkLCBpZCwgaHdpZCkJXAorCVtpZF0gPSBpbXhfc2RoY2lfZXNkaGNfaW14X2RhdGFfZW50cnlfc2luZ2xlKHNvYywgZGV2aWQsIGlkLCBod2lkKQogCiAjaWZkZWYgQ09ORklHX1NPQ19JTVgyNQogY29uc3Qgc3RydWN0IGlteF9zZGhjaV9lc2RoY19pbXhfZGF0YQogaW14MjVfc2RoY2lfZXNkaGNfaW14X2RhdGFbXSBfX2luaXRjb25zdCA9IHsKICNkZWZpbmUgaW14MjVfc2RoY2lfZXNkaGNfaW14X2RhdGFfZW50cnkoX2lkLCBfaHdpZCkJCQlcCi0JaW14X3NkaGNpX2VzZGhjX2lteF9kYXRhX2VudHJ5KE1YMjUsIF9pZCwgX2h3aWQpCisJaW14X3NkaGNpX2VzZGhjX2lteF9kYXRhX2VudHJ5KE1YMjUsICJzZGhjaS1lc2RoYy1pbXgyNSIsIF9pZCwgX2h3aWQpCiAJaW14MjVfc2RoY2lfZXNkaGNfaW14X2RhdGFfZW50cnkoMCwgMSksCiAJaW14MjVfc2RoY2lfZXNkaGNfaW14X2RhdGFfZW50cnkoMSwgMiksCiB9OwpAQCAtMzQsNyArMzUsNyBAQAogY29uc3Qgc3RydWN0IGlteF9zZGhjaV9lc2RoY19pbXhfZGF0YQogaW14MzVfc2RoY2lfZXNkaGNfaW14X2RhdGFbXSBfX2luaXRjb25zdCA9IHsKICNkZWZpbmUgaW14MzVfc2RoY2lfZXNkaGNfaW14X2RhdGFfZW50cnkoX2lkLCBfaHdpZCkJCQlcCi0JaW14X3NkaGNpX2VzZGhjX2lteF9kYXRhX2VudHJ5KE1YMzUsIF9pZCwgX2h3aWQpCisJaW14X3NkaGNpX2VzZGhjX2lteF9kYXRhX2VudHJ5KE1YMzUsICJzZGhjaS1lc2RoYy1pbXgzNSIsIF9pZCwgX2h3aWQpCiAJaW14MzVfc2RoY2lfZXNkaGNfaW14X2RhdGFfZW50cnkoMCwgMSksCiAJaW14MzVfc2RoY2lfZXNkaGNfaW14X2RhdGFfZW50cnkoMSwgMiksCiAJaW14MzVfc2RoY2lfZXNkaGNfaW14X2RhdGFfZW50cnkoMiwgMyksCkBAIC00NSw3ICs0Niw3IEBACiBjb25zdCBzdHJ1Y3QgaW14X3NkaGNpX2VzZGhjX2lteF9kYXRhCiBpbXg1MV9zZGhjaV9lc2RoY19pbXhfZGF0YVtdIF9faW5pdGNvbnN0ID0gewogI2RlZmluZSBpbXg1MV9zZGhjaV9lc2RoY19pbXhfZGF0YV9lbnRyeShfaWQsIF9od2lkKQkJCVwKLQlpbXhfc2RoY2lfZXNkaGNfaW14X2RhdGFfZW50cnkoTVg1MSwgX2lkLCBfaHdpZCkKKwlpbXhfc2RoY2lfZXNkaGNfaW14X2RhdGFfZW50cnkoTVg1MSwgInNkaGNpLWVzZGhjLWlteDUxIiwgX2lkLCBfaHdpZCkKIAlpbXg1MV9zZGhjaV9lc2RoY19pbXhfZGF0YV9lbnRyeSgwLCAxKSwKIAlpbXg1MV9zZGhjaV9lc2RoY19pbXhfZGF0YV9lbnRyeSgxLCAyKSwKIAlpbXg1MV9zZGhjaV9lc2RoY19pbXhfZGF0YV9lbnRyeSgyLCAzKSwKQEAgLTU3LDcgKzU4LDcgQEAKIGNvbnN0IHN0cnVjdCBpbXhfc2RoY2lfZXNkaGNfaW14X2RhdGEKIGlteDUzX3NkaGNpX2VzZGhjX2lteF9kYXRhW10gX19pbml0Y29uc3QgPSB7CiAjZGVmaW5lIGlteDUzX3NkaGNpX2VzZGhjX2lteF9kYXRhX2VudHJ5KF9pZCwgX2h3aWQpCQkJXAotCWlteF9zZGhjaV9lc2RoY19pbXhfZGF0YV9lbnRyeShNWDUzLCBfaWQsIF9od2lkKQorCWlteF9zZGhjaV9lc2RoY19pbXhfZGF0YV9lbnRyeShNWDUzLCAic2RoY2ktZXNkaGMtaW14NTMiLCBfaWQsIF9od2lkKQogCWlteDUzX3NkaGNpX2VzZGhjX2lteF9kYXRhX2VudHJ5KDAsIDEpLAogCWlteDUzX3NkaGNpX2VzZGhjX2lteF9kYXRhX2VudHJ5KDEsIDIpLAogCWlteDUzX3NkaGNpX2VzZGhjX2lteF9kYXRhX2VudHJ5KDIsIDMpLApAQCAtNjUsNiArNjYsMTEgQEAKIH07CiAjZW5kaWYgLyogaWZkZWYgQ09ORklHX1NPQ19JTVg1MyAqLwogCitzdGF0aWMgY29uc3Qgc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgZGVmYXVsdF9lc2RoY19wZGF0YSBfX2luaXRjb25zdCA9IHsKKwkud3BfdHlwZSA9IEVTREhDX1dQX05PTkUsCisJLmNkX3R5cGUgPSBFU0RIQ19DRF9OT05FLAorfTsKKwogc3RydWN0IHBsYXRmb3JtX2RldmljZSAqX19pbml0IGlteF9hZGRfc2RoY2lfZXNkaGNfaW14KAogCQljb25zdCBzdHJ1Y3QgaW14X3NkaGNpX2VzZGhjX2lteF9kYXRhICpkYXRhLAogCQljb25zdCBzdHJ1Y3QgZXNkaGNfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCkBAIC04MSw2ICs4NywxMyBAQAogCQl9LAogCX07CiAKLQlyZXR1cm4gaW14X2FkZF9wbGF0Zm9ybV9kZXZpY2UoInNkaGNpLWVzZGhjLWlteCIsIGRhdGEtPmlkLCByZXMsCisJLyoKKwkgKiBJZiBtYWNoaW5lIGRvZXMgbm90IHByb3ZpZGUgcGRhdGEsIHVzZSB0aGUgZGVmYXVsdCBvbmUKKwkgKiB3aGljaCBtZWFucyBubyBXUC9DRCBzdXBwb3J0CisJICovCisJaWYgKCFwZGF0YSkKKwkJcGRhdGEgPSAmZGVmYXVsdF9lc2RoY19wZGF0YTsKKworCXJldHVybiBpbXhfYWRkX3BsYXRmb3JtX2RldmljZShkYXRhLT5kZXZpZCwgZGF0YS0+aWQsIHJlcywKIAkJCUFSUkFZX1NJWkUocmVzKSwgcGRhdGEsIHNpemVvZigqcGRhdGEpKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9kZXZpY2VzLWNvbW1vbi5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2RldmljZXMtY29tbW9uLmgKaW5kZXggYmY5MzgyMC4uNTI0NTM4YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2RldmljZXMtY29tbW9uLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2RldmljZXMtY29tbW9uLmgKQEAgLTMwLDYgKzMwLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2ZlYy5oPgogc3RydWN0IGlteF9mZWNfZGF0YSB7CisJY29uc3QgY2hhciAqZGV2aWQ7CiAJcmVzb3VyY2Vfc2l6ZV90IGlvYmFzZTsKIAlyZXNvdXJjZV9zaXplX3QgaXJxOwogfTsKQEAgLTI3Niw2ICsyNzcsNyBAQAogCiAjaW5jbHVkZSA8bWFjaC9lc2RoYy5oPgogc3RydWN0IGlteF9zZGhjaV9lc2RoY19pbXhfZGF0YSB7CisJY29uc3QgY2hhciAqZGV2aWQ7CiAJaW50IGlkOwogCXJlc291cmNlX3NpemVfdCBpb2Jhc2U7CiAJcmVzb3VyY2Vfc2l6ZV90IGlycTsKQEAgLTI5Nyw1ICsyOTksNSBAQAogCQljb25zdCBzdHJ1Y3Qgc3BpX2lteF9tYXN0ZXIgKnBkYXRhKTsKIAogc3RydWN0IHBsYXRmb3JtX2RldmljZSAqaW14X2FkZF9pbXhfZG1hKHZvaWQpOwotc3RydWN0IHBsYXRmb3JtX2RldmljZSAqaW14X2FkZF9pbXhfc2RtYSgKK3N0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmlteF9hZGRfaW14X3NkbWEoY2hhciAqbmFtZSwKIAlyZXNvdXJjZV9zaXplX3QgaW9iYXNlLCBpbnQgaXJxLCBzdHJ1Y3Qgc2RtYV9wbGF0Zm9ybV9kYXRhICpwZGF0YSk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZG1hLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZG1hLmgKaW5kZXggZWY3NzUxNS4uMjMzZDBhNSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2RtYS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9kbWEuaApAQCAtNjAsNyArNjAsOCBAQAogCiBzdGF0aWMgaW5saW5lIGludCBpbXhfZG1hX2lzX2dlbmVyYWxfcHVycG9zZShzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCiB7Ci0JcmV0dXJuICFzdHJjbXAoZGV2X25hbWUoY2hhbi0+ZGV2aWNlLT5kZXYpLCAiaW14LXNkbWEiKSB8fAorCXJldHVybiAhc3RyY21wKGRldl9uYW1lKGNoYW4tPmRldmljZS0+ZGV2KSwgImlteDMxLXNkbWEiKSB8fAorCQkhc3RyY21wKGRldl9uYW1lKGNoYW4tPmRldmljZS0+ZGV2KSwgImlteDM1LXNkbWEiKSB8fAogCQkhc3RyY21wKGRldl9uYW1lKGNoYW4tPmRldmljZS0+ZGV2KSwgImlteC1kbWEiKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL2VzZGhjLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZXNkaGMuaAppbmRleCA4NjAwM2Y0Li5hYWY5NzQ4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZXNkaGMuaAorKysgYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvZXNkaGMuaApAQCAtMTAsMTcgKzEwLDM0IEBACiAjaWZuZGVmIF9fQVNNX0FSQ0hfSU1YX0VTREhDX0gKICNkZWZpbmUgX19BU01fQVJDSF9JTVhfRVNESENfSAogCitlbnVtIHdwX3R5cGVzIHsKKwlFU0RIQ19XUF9OT05FLAkJLyogbm8gV1AsIG5laXRoZXIgY29udHJvbGxlciBub3IgZ3BpbyAqLworCUVTREhDX1dQX0NPTlRST0xMRVIsCS8qIG1tYyBjb250cm9sbGVyIGludGVybmFsIFdQICovCisJRVNESENfV1BfR1BJTywJCS8qIGV4dGVybmFsIGdwaW8gcGluIGZvciBXUCAqLworfTsKKworZW51bSBjZF90eXBlcyB7CisJRVNESENfQ0RfTk9ORSwJCS8qIG5vIENELCBuZWl0aGVyIGNvbnRyb2xsZXIgbm9yIGdwaW8gKi8KKwlFU0RIQ19DRF9DT05UUk9MTEVSLAkvKiBtbWMgY29udHJvbGxlciBpbnRlcm5hbCBDRCAqLworCUVTREhDX0NEX0dQSU8sCQkvKiBleHRlcm5hbCBncGlvIHBpbiBmb3IgQ0QgKi8KKwlFU0RIQ19DRF9QRVJNQU5FTlQsCS8qIG5vIENELCBjYXJkIHBlcm1hbmVudGx5IHdpcmVkIHRvIGhvc3QgKi8KK307CisKIC8qKgotICogc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgLSBvcHRpb25hbCBwbGF0Zm9ybSBkYXRhIGZvciBlc2RoYyBvbiBpLk1YCisgKiBzdHJ1Y3QgZXNkaGNfcGxhdGZvcm1fZGF0YSAtIHBsYXRmb3JtIGRhdGEgZm9yIGVzZGhjIG9uIGkuTVgKICAqCi0gKiBzdHJvbmdseSByZWNvbW1lbmRlZCBmb3IgaS5NWDI1LzM1LCBub3QgbmVlZGVkIGZvciBvdGhlciB2YXJpYW50cworICogRVNESENfV1AoQ0QpX0NPTlRST0xMRVIgdHlwZSBpcyBub3QgYXZhaWxhYmxlIG9uIGkuTVgyNS8zNS4KICAqCi0gKiBAd3BfZ3BpbzoJZ3BpbyBmb3Igd3JpdGVfcHJvdGVjdCAoLUVJTlZBTCBpZiB1bnVzZWQpCi0gKiBAY2RfZ3BpbzoJZ3BpbyBmb3IgY2FyZF9kZXRlY3QgaW50ZXJydXB0ICgtRUlOVkFMIGlmIHVudXNlZCkKKyAqIEB3cF9ncGlvOglncGlvIGZvciB3cml0ZV9wcm90ZWN0CisgKiBAY2RfZ3BpbzoJZ3BpbyBmb3IgY2FyZF9kZXRlY3QgaW50ZXJydXB0CisgKiBAd3BfdHlwZToJdHlwZSBvZiB3cml0ZV9wcm90ZWN0IG1ldGhvZCAoc2VlIHdwX3R5cGVzIGVudW0gYWJvdmUpCisgKiBAY2RfdHlwZToJdHlwZSBvZiBjYXJkX2RldGVjdCBtZXRob2QgKHNlZSBjZF90eXBlcyBlbnVtIGFib3ZlKQogICovCiAKIHN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhIHsKIAl1bnNpZ25lZCBpbnQgd3BfZ3BpbzsKIAl1bnNpZ25lZCBpbnQgY2RfZ3BpbzsKKwllbnVtIHdwX3R5cGVzIHdwX3R5cGU7CisJZW51bSBjZF90eXBlcyBjZF90eXBlOwogfTsKICNlbmRpZiAvKiBfX0FTTV9BUkNIX0lNWF9FU0RIQ19IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvc2RtYS5oIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL3NkbWEuaAppbmRleCBmNDk1Yzg3Li4zYTM5NDI4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvc2RtYS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC9zZG1hLmgKQEAgLTQ4LDEyICs0OCwxMCBAQAogLyoqCiAgKiBzdHJ1Y3Qgc2RtYV9wbGF0Zm9ybV9kYXRhIC0gcGxhdGZvcm0gc3BlY2lmaWMgZGF0YSBmb3IgU0RNQSBlbmdpbmUKICAqCi0gKiBAc2RtYV92ZXJzaW9uCVRoZSB2ZXJzaW9uIG9mIHRoaXMgU0RNQSBlbmdpbmUKICAqIEBmd19uYW1lCQlUaGUgZmlybXdhcmUgbmFtZQogICogQHNjcmlwdF9hZGRycwlTRE1BIHNjcmlwdHMgYWRkcmVzc2VzIGluIFNETUEgUk9NCiAgKi8KIHN0cnVjdCBzZG1hX3BsYXRmb3JtX2RhdGEgewotCWludCBzZG1hX3ZlcnNpb247CiAJY2hhciAqZndfbmFtZTsKIAlzdHJ1Y3Qgc2RtYV9zY3JpcHRfc3RhcnRfYWRkcnMgKnNjcmlwdF9hZGRyczsKIH07CmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL0tjb25maWcgYi9hcmNoL2F2cjMyL0tjb25maWcKaW5kZXggZTlkNjg5Yi4uMTk3ZTk2ZiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9LY29uZmlnCisrKyBiL2FyY2gvYXZyMzIvS2NvbmZpZwpAQCAtMTAsNiArMTAsNyBAQAogCXNlbGVjdCBHRU5FUklDX0lSUV9QUk9CRQogCXNlbGVjdCBIQVJESVJRU19TV19SRVNFTkQKIAlzZWxlY3QgR0VORVJJQ19JUlFfU0hPVworCXNlbGVjdCBBUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRwogCWhlbHAKIAkgIEFWUjMyIGlzIGEgaGlnaC1wZXJmb3JtYW5jZSAzMi1iaXQgUklTQyBtaWNyb3Byb2Nlc3NvciBjb3JlLAogCSAgZGVzaWduZWQgZm9yIGNvc3Qtc2Vuc2l0aXZlIGVtYmVkZGVkIGFwcGxpY2F0aW9ucywgd2l0aCBwYXJ0aWN1bGFyCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAvZHJpdmVycy9zeW5jX3NlcmlhbC5jIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2RyaXZlcnMvc3luY19zZXJpYWwuYwppbmRleCA4NTAyNjUzNy4uNDY2YWY0MCAxMDA2NDQKLS0tIGEvYXJjaC9jcmlzL2FyY2gtdjEwL2RyaXZlcnMvc3luY19zZXJpYWwuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MTAvZHJpdmVycy9zeW5jX3NlcmlhbC5jCkBAIC0xNTgsNyArMTU4LDcgQEAKIHN0YXRpYyBpbnQgc3luY19zZXJpYWxfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiBzdGF0aWMgdW5zaWduZWQgaW50IHN5bmNfc2VyaWFsX3BvbGwoc3RydWN0IGZpbGUgKmZpbHAsIHBvbGxfdGFibGUgKndhaXQpOwogCi1zdGF0aWMgaW50IHN5bmNfc2VyaWFsX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLAorc3RhdGljIGxvbmcgc3luY19zZXJpYWxfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCiAJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOwogc3RhdGljIHNzaXplX3Qgc3luY19zZXJpYWxfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZiwKIAlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CkBAIC02MjUsMTEgKzYyNSwxMSBAQAogCQkJKlJfSVJRX01BU0sxX1NFVCA9IDEgPDwgcG9ydC0+ZGF0YV9hdmFpbF9iaXQ7CiAJCURFQlVHKHByaW50ayhLRVJOX0RFQlVHICJzc2VyJWQgcmVjIHN0YXJ0ZWRcbiIsIGRldikpOwogCX0KLQlyZXQgPSAwOworCWVyciA9IDA7CiAJCiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZzeW5jX3NlcmlhbF9tdXRleCk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IHN5bmNfc2VyaWFsX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL2lycS5jIGIvYXJjaC9jcmlzL2FyY2gtdjEwL2tlcm5lbC9pcnEuYwppbmRleCA5MDdjZmI1Li5iYTBlNTk2IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MTAva2VybmVsL2lycS5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYxMC9rZXJuZWwvaXJxLmMKQEAgLTIwLDYgKzIwLDkgQEAKICNkZWZpbmUgY3Jpc3YxMF9tYXNrX2lycShpcnFfbnIpICgqUl9WRUNUX01BU0tfQ0xSID0gMSA8PCAoaXJxX25yKSk7CiAjZGVmaW5lIGNyaXN2MTBfdW5tYXNrX2lycShpcnFfbnIpICgqUl9WRUNUX01BU0tfU0VUID0gMSA8PCAoaXJxX25yKSk7CiAKK2V4dGVybiB2b2lkIGtnZGJfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGJyZWFrcG9pbnQodm9pZCk7CisKIC8qIGRvbid0IHVzZSBzZXRfaW50X3ZlY3RvciwgaXQgYnlwYXNzZXMgdGhlIGxpbnV4IGludGVycnVwdCBoYW5kbGVycy4gaXQgaXMKICAqIGdsb2JhbCBqdXN0IHNvIHRoYXQgdGhlIGtlcm5lbCBnZGIgY2FuIHVzZSBpdC4KICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmggYi9hcmNoL2NyaXMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAppbmRleCAyOWI3NGExLi4zMzJmMTljIDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAorKysgYi9hcmNoL2NyaXMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaApAQCAtMTEsOCArMTEsNiBAQAogCiAjaWZkZWYgX19LRVJORUxfXwogCi0jZGVmaW5lIF9fSEFWRV9BUkNIX1RIUkVBRF9JTkZPX0FMTE9DQVRPUgotCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogI2luY2x1ZGUgPGFzbS90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KQEAgLTY3LDggKzY1LDEwIEBACiAKICNkZWZpbmUgaW5pdF90aHJlYWRfaW5mbwkoaW5pdF90aHJlYWRfdW5pb24udGhyZWFkX2luZm8pCiAKKyNkZWZpbmUgX19IQVZFX0FSQ0hfVEhSRUFEX0lORk9fQUxMT0NBVE9SCiAvKiB0aHJlYWQgaW5mb3JtYXRpb24gYWxsb2NhdGlvbiAqLwotI2RlZmluZSBhbGxvY190aHJlYWRfaW5mbyh0c2ssIG5vZGUpICgoc3RydWN0IHRocmVhZF9pbmZvICopIF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCwxKSkKKyNkZWZpbmUgYWxsb2NfdGhyZWFkX2luZm9fbm9kZSh0c2ssIG5vZGUpCVwKKwkoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIDEpKQogI2RlZmluZSBmcmVlX3RocmVhZF9pbmZvKHRpKSBmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSAodGkpLCAxKQogCiAjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9mcnYvS2NvbmZpZyBiL2FyY2gvZnJ2L0tjb25maWcKaW5kZXggY2I4ODRlNC4uYmFkMjdhNiAxMDA2NDQKLS0tIGEvYXJjaC9mcnYvS2NvbmZpZworKysgYi9hcmNoL2Zydi9LY29uZmlnCkBAIC03LDYgKzcsNyBAQAogCXNlbGVjdCBIQVZFX1BFUkZfRVZFTlRTCiAJc2VsZWN0IEhBVkVfR0VORVJJQ19IQVJESVJRUwogCXNlbGVjdCBHRU5FUklDX0lSUV9TSE9XCisJc2VsZWN0IEFSQ0hfSEFWRV9OTUlfU0FGRV9DTVBYQ0hHCiAKIGNvbmZpZyBaT05FX0RNQQogCWJvb2wKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L21tL3BnYWxsb2MuYyBiL2FyY2gvZnJ2L21tL3BnYWxsb2MuYwppbmRleCBjNDJjODNkLi40ZmI2M2EzIDEwMDY0NAotLS0gYS9hcmNoL2Zydi9tbS9wZ2FsbG9jLmMKKysrIGIvYXJjaC9mcnYvbW0vcGdhbGxvYy5jCkBAIC0xMzMsMTMgKzEzMyw3IEBACiAKIHBnZF90ICpwZ2RfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7Ci0JcGdkX3QgKnBnZDsKLQotCXBnZCA9IHF1aWNrbGlzdF9hbGxvYygwLCBHRlBfS0VSTkVMLCBwZ2RfY3Rvcik7Ci0JaWYgKCFwZ2QpCi0JCXJldHVybiBwZ2Q7Ci0KLQlyZXR1cm4gcGdkOworCXJldHVybiBxdWlja2xpc3RfYWxsb2MoMCwgR0ZQX0tFUk5FTCwgcGdkX2N0b3IpOwogfQogCiB2b2lkIHBnZF9mcmVlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwZ2RfdCAqcGdkKQpkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L0tjb25maWcgYi9hcmNoL2lhNjQvS2NvbmZpZwppbmRleCAxMzdiMjc3Li4xMjQ4NTQ3IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvS2NvbmZpZworKysgYi9hcmNoL2lhNjQvS2NvbmZpZwpAQCAtMjcsNiArMjcsOCBAQAogCXNlbGVjdCBHRU5FUklDX1BFTkRJTkdfSVJRIGlmIFNNUAogCXNlbGVjdCBJUlFfUEVSX0NQVQogCXNlbGVjdCBHRU5FUklDX0lSUV9TSE9XCisJc2VsZWN0IEFSQ0hfV0FOVF9PUFRJT05BTF9HUElPTElCCisJc2VsZWN0IEFSQ0hfSEFWRV9OTUlfU0FGRV9DTVBYQ0hHCiAJZGVmYXVsdCB5CiAJaGVscAogCSAgVGhlIEl0YW5pdW0gUHJvY2Vzc29yIEZhbWlseSBpcyBJbnRlbCdzIDY0LWJpdCBzdWNjZXNzb3IgdG8KQEAgLTg5LDYgKzkxLDkgQEAKIGNvbmZpZyBIQVZFX1NFVFVQX1BFUl9DUFVfQVJFQQogCWRlZl9ib29sIHkKIAorY29uZmlnIEdFTkVSSUNfR1BJTworCWRlZl9ib29sIHkKKwogY29uZmlnIERNSQogCWJvb2wKIAlkZWZhdWx0IHkKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9ncGlvLmggYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vZ3Bpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MGEyMGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vZ3Bpby5oCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBHZW5lcmljIEdQSU8gQVBJIGltcGxlbWVudGF0aW9uIGZvciBJQS02NC4KKyAqCisgKiBBIHN0cmlnaHQgY29weSBvZiB0aGF0IGZvciBQb3dlclBDIHdoaWNoIHdhczoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCAgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIEF1dGhvcjogQW50b24gVm9yb250c292IDxhdm9yb250c292QHJ1Lm12aXN0YS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIF9BU01fSUE2NF9HUElPX0gKKyNkZWZpbmUgX0FTTV9JQTY0X0dQSU9fSAorCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9ncGlvLmg+CisKKyNpZmRlZiBDT05GSUdfR1BJT0xJQgorCisvKgorICogV2UgZG9uJ3QgKHlldCkgaW1wbGVtZW50IGlubGluZWQvcmFwaWQgdmVyc2lvbnMgZm9yIG9uLWNoaXAgZ3Bpb3MuCisgKiBKdXN0IGNhbGwgZ3Bpb2xpYi4KKyAqLworc3RhdGljIGlubGluZSBpbnQgZ3Bpb19nZXRfdmFsdWUodW5zaWduZWQgaW50IGdwaW8pCit7CisJcmV0dXJuIF9fZ3Bpb19nZXRfdmFsdWUoZ3Bpbyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBncGlvX3NldF92YWx1ZSh1bnNpZ25lZCBpbnQgZ3BpbywgaW50IHZhbHVlKQoreworCV9fZ3Bpb19zZXRfdmFsdWUoZ3BpbywgdmFsdWUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBncGlvX2NhbnNsZWVwKHVuc2lnbmVkIGludCBncGlvKQoreworCXJldHVybiBfX2dwaW9fY2Fuc2xlZXAoZ3Bpbyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGdwaW9fdG9faXJxKHVuc2lnbmVkIGludCBncGlvKQoreworCXJldHVybiBfX2dwaW9fdG9faXJxKGdwaW8pOworfQorCitzdGF0aWMgaW5saW5lIGludCBpcnFfdG9fZ3Bpbyh1bnNpZ25lZCBpbnQgaXJxKQoreworCXJldHVybiAtRUlOVkFMOworfQorCisjZW5kaWYgLyogQ09ORklHX0dQSU9MSUIgKi8KKworI2VuZGlmIC8qIF9BU01fSUE2NF9HUElPX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvZWZpLmMgYi9hcmNoL2lhNjQva2VybmVsL2VmaS5jCmluZGV4IDZmYzAzYWYuLmMzOGQyMmUgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvZWZpLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9lZmkuYwpAQCAtMTU2LDcgKzE1Niw3IEBACiAjZGVmaW5lIFNUVUJfU0VUX1ZBUklBQkxFKHByZWZpeCwgYWRqdXN0X2FyZykJCQkJICAgICAgIFwKIHN0YXRpYyBlZmlfc3RhdHVzX3QJCQkJCQkJICAgICAgIFwKIHByZWZpeCMjX3NldF92YXJpYWJsZSAoZWZpX2NoYXIxNl90ICpuYW1lLCBlZmlfZ3VpZF90ICp2ZW5kb3IsCQkgICAgICAgXAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBhdHRyLCB1bnNpZ25lZCBsb25nIGRhdGFfc2l6ZSwJICAgICAgIFwKKwkJICAgICAgIHUzMiBhdHRyLCB1bnNpZ25lZCBsb25nIGRhdGFfc2l6ZSwJCSAgICAgICBcCiAJCSAgICAgICB2b2lkICpkYXRhKQkJCQkJICAgICAgIFwKIHsJCQkJCQkJCQkgICAgICAgXAogCXN0cnVjdCBpYTY0X2ZwcmVnIGZyWzZdOwkJCQkJICAgICAgIFwKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9LY29uZmlnIGIvYXJjaC9tNjhrL0tjb25maWcKaW5kZXggMjg0Y2QzNy4uOWU4ZWU5ZCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL0tjb25maWcKKysrIGIvYXJjaC9tNjhrL0tjb25maWcKQEAgLTYsNiArNiw3IEBACiAJc2VsZWN0IEdFTkVSSUNfQVRPTUlDNjQgaWYgTU1VCiAJc2VsZWN0IEhBVkVfR0VORVJJQ19IQVJESVJRUyBpZiAhTU1VCiAJc2VsZWN0IEdFTkVSSUNfSVJRX1NIT1cgaWYgIU1NVQorCXNlbGVjdCBBUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRyBpZiBSTVdfSU5TTlMKIAogY29uZmlnIFJXU0VNX0dFTkVSSUNfU1BJTkxPQ0sKIAlib29sCmRpZmYgLS1naXQgYS9hcmNoL202OGsvS2NvbmZpZy5tbXUgYi9hcmNoL202OGsvS2NvbmZpZy5tbXUKaW5kZXggMTY1MzliMS4uMTNlMjBiYiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL0tjb25maWcubW11CisrKyBiL2FyY2gvbTY4ay9LY29uZmlnLm1tdQpAQCAtMzcyLDEyICszNzIsNiBAQAogCSAgSW5jbHVkZSBzdXBwb3J0IGluIHRoZSBrZXJuZWwgZm9yIHBjbWNpYSBvbiBBbWlnYSAxMjAwIGFuZCBBbWlnYQogCSAgNjAwLiBJZiB5b3UgaW50ZW5kIHRvIHVzZSBwY21jaWEgY2FyZHMgc2F5IFk7IG90aGVyd2lzZSBzYXkgTi4KIAotY29uZmlnIFNUUkFNX1BST0MKLQlib29sICJTVC1SQU0gc3RhdGlzdGljcyBpbiAvcHJvYyIKLQlkZXBlbmRzIG9uIEFUQVJJCi0JaGVscAotCSAgU2F5IFkgaGVyZSB0byByZXBvcnQgU1QtUkFNIHVzYWdlIHN0YXRpc3RpY3MgaW4gL3Byb2Mvc3RyYW0uCi0KIGNvbmZpZyBIRUFSVEJFQVQKIAlib29sICJVc2UgcG93ZXIgTEVEIGFzIGEgaGVhcnRiZWF0IiBpZiBBTUlHQSB8fCBBUE9MTE8gfHwgQVRBUkkgfHwgTUFDIHx8UTQwCiAJZGVmYXVsdCB5IGlmICFBTUlHQSAmJiAhQVBPTExPICYmICFBVEFSSSAmJiAhTUFDICYmICFRNDAgJiYgSFAzMDAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hbWlnYS9jaGlwcmFtLmMgYi9hcmNoL202OGsvYW1pZ2EvY2hpcHJhbS5jCmluZGV4IGRkMDQ0N2QuLjk5NDQ5ZmIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9hbWlnYS9jaGlwcmFtLmMKKysrIGIvYXJjaC9tNjhrL2FtaWdhL2NoaXByYW0uYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogCisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL2FtaWdhaHcuaD4KIApAQCAtMjMsMTExICsyNCwxMDAgQEAKIEVYUE9SVF9TWU1CT0woYW1pZ2FfY2hpcF9zaXplKTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjaGlwcmFtX3JlcyA9IHsKLSAgICAubmFtZSA9ICJDaGlwIFJBTSIsIC5zdGFydCA9IENISVBfUEhZU0FERFIKKwkubmFtZSA9ICJDaGlwIFJBTSIsIC5zdGFydCA9IENISVBfUEhZU0FERFIKIH07Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBjaGlwYXZhaWw7CitzdGF0aWMgYXRvbWljX3QgY2hpcGF2YWlsOwogCiAKIHZvaWQgX19pbml0IGFtaWdhX2NoaXBfaW5pdCh2b2lkKQogewotICAgIGlmICghQU1JR0FIV19QUkVTRU5UKENISVBfUkFNKSkKLQlyZXR1cm47CisJaWYgKCFBTUlHQUhXX1BSRVNFTlQoQ0hJUF9SQU0pKQorCQlyZXR1cm47CiAKLSAgICBjaGlwcmFtX3Jlcy5lbmQgPSBhbWlnYV9jaGlwX3NpemUtMTsKLSAgICByZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJmNoaXByYW1fcmVzKTsKKwljaGlwcmFtX3Jlcy5lbmQgPSBDSElQX1BIWVNBRERSICsgYW1pZ2FfY2hpcF9zaXplIC0gMTsKKwlyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJmNoaXByYW1fcmVzKTsKIAotICAgIGNoaXBhdmFpbCA9IGFtaWdhX2NoaXBfc2l6ZTsKKwlhdG9taWNfc2V0KCZjaGlwYXZhaWwsIGFtaWdhX2NoaXBfc2l6ZSk7CiB9CiAKIAogdm9pZCAqYW1pZ2FfY2hpcF9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUsIGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0gICAgc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJdm9pZCAqcDsKIAotICAgIC8qIHJvdW5kIHVwICovCi0gICAgc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7CisJcmVzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJlc291cmNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXMpCisJCXJldHVybiBOVUxMOwogCi0jaWZkZWYgREVCVUcKLSAgICBwcmludGsoImFtaWdhX2NoaXBfYWxsb2M6IGFsbG9jYXRlICVsZCBieXRlc1xuIiwgc2l6ZSk7Ci0jZW5kaWYKLSAgICByZXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmVzb3VyY2UpLCBHRlBfS0VSTkVMKTsKLSAgICBpZiAoIXJlcykKLQlyZXR1cm4gTlVMTDsKLSAgICByZXMtPm5hbWUgPSBuYW1lOworCXJlcy0+bmFtZSA9IG5hbWU7CisJcCA9IGFtaWdhX2NoaXBfYWxsb2NfcmVzKHNpemUsIHJlcyk7CisJaWYgKCFwKSB7CisJCWtmcmVlKHJlcyk7CisJCXJldHVybiBOVUxMOworCX0KIAotICAgIGlmIChhbGxvY2F0ZV9yZXNvdXJjZSgmY2hpcHJhbV9yZXMsIHJlcywgc2l6ZSwgMCwgVUlOVF9NQVgsIFBBR0VfU0laRSwgTlVMTCwgTlVMTCkgPCAwKSB7Ci0Ja2ZyZWUocmVzKTsKLQlyZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgY2hpcGF2YWlsIC09IHNpemU7Ci0jaWZkZWYgREVCVUcKLSAgICBwcmludGsoImFtaWdhX2NoaXBfYWxsb2M6IHJldHVybmluZyAlbHhcbiIsIHJlcy0+c3RhcnQpOwotI2VuZGlmCi0gICAgcmV0dXJuICh2b2lkICopWlRXT19WQUREUihyZXMtPnN0YXJ0KTsKKwlyZXR1cm4gcDsKIH0KIEVYUE9SVF9TWU1CT0woYW1pZ2FfY2hpcF9hbGxvYyk7CiAKIAotICAgIC8qCi0gICAgICogIFdhcm5pbmc6Ci0gICAgICogIGFtaWdhX2NoaXBfYWxsb2NfcmVzIGlzIG1lYW50IG9ubHkgZm9yIGRyaXZlcnMgdGhhdCBuZWVkIHRvIGFsbG9jYXRlCi0gICAgICogIENoaXAgUkFNIGJlZm9yZSBrbWFsbG9jKCkgaXMgZnVuY3Rpb25hbC4gQXMgYSBjb25zZXF1ZW5jZSwgdGhvc2UKLSAgICAgKiAgZHJpdmVycyBtdXN0IG5vdCBmcmVlIHRoYXQgQ2hpcCBSQU0gYWZ0ZXJ3YXJkcy4KLSAgICAgKi8KKwkvKgorCSAqICBXYXJuaW5nOgorCSAqICBhbWlnYV9jaGlwX2FsbG9jX3JlcyBpcyBtZWFudCBvbmx5IGZvciBkcml2ZXJzIHRoYXQgbmVlZCB0bworCSAqICBhbGxvY2F0ZSBDaGlwIFJBTSBiZWZvcmUga21hbGxvYygpIGlzIGZ1bmN0aW9uYWwuIEFzIGEgY29uc2VxdWVuY2UsCisJICogIHRob3NlIGRyaXZlcnMgbXVzdCBub3QgZnJlZSB0aGF0IENoaXAgUkFNIGFmdGVyd2FyZHMuCisJICovCiAKLXZvaWQgKiBfX2luaXQgYW1pZ2FfY2hpcF9hbGxvY19yZXModW5zaWduZWQgbG9uZyBzaXplLCBzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKK3ZvaWQgKmFtaWdhX2NoaXBfYWxsb2NfcmVzKHVuc2lnbmVkIGxvbmcgc2l6ZSwgc3RydWN0IHJlc291cmNlICpyZXMpCiB7Ci0gICAgdW5zaWduZWQgbG9uZyBzdGFydDsKKwlpbnQgZXJyb3I7CiAKLSAgICAvKiByb3VuZCB1cCAqLwotICAgIHNpemUgPSBQQUdFX0FMSUdOKHNpemUpOwotICAgIC8qIGRtZXNnIGludG8gY2hpcG1lbSBwcmVmZXJzIG1lbW9yeSBhdCB0aGUgc2FmZSBlbmQgKi8KLSAgICBzdGFydCA9IENISVBfUEhZU0FERFIgKyBjaGlwYXZhaWwgLSBzaXplOworCS8qIHJvdW5kIHVwICovCisJc2l6ZSA9IFBBR0VfQUxJR04oc2l6ZSk7CiAKLSNpZmRlZiBERUJVRwotICAgIHByaW50aygiYW1pZ2FfY2hpcF9hbGxvY19yZXM6IGFsbG9jYXRlICVsZCBieXRlc1xuIiwgc2l6ZSk7Ci0jZW5kaWYKLSAgICBpZiAoYWxsb2NhdGVfcmVzb3VyY2UoJmNoaXByYW1fcmVzLCByZXMsIHNpemUsIHN0YXJ0LCBVSU5UX01BWCwgUEFHRV9TSVpFLCBOVUxMLCBOVUxMKSA8IDApIHsKLQlwcmludGsoImFtaWdhX2NoaXBfYWxsb2NfcmVzOiBmaXJzdCBhbGxvYyBmYWlsZWQhXG4iKTsKLQlpZiAoYWxsb2NhdGVfcmVzb3VyY2UoJmNoaXByYW1fcmVzLCByZXMsIHNpemUsIDAsIFVJTlRfTUFYLCBQQUdFX1NJWkUsIE5VTEwsIE5VTEwpIDwgMCkKLQkgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGNoaXBhdmFpbCAtPSBzaXplOwotI2lmZGVmIERFQlVHCi0gICAgcHJpbnRrKCJhbWlnYV9jaGlwX2FsbG9jX3JlczogcmV0dXJuaW5nICVseFxuIiwgcmVzLT5zdGFydCk7Ci0jZW5kaWYKLSAgICByZXR1cm4gKHZvaWQgKilaVFdPX1ZBRERSKHJlcy0+c3RhcnQpOworCXByX2RlYnVnKCJhbWlnYV9jaGlwX2FsbG9jX3JlczogYWxsb2NhdGUgJWx1IGJ5dGVzXG4iLCBzaXplKTsKKwllcnJvciA9IGFsbG9jYXRlX3Jlc291cmNlKCZjaGlwcmFtX3JlcywgcmVzLCBzaXplLCAwLCBVSU5UX01BWCwKKwkJCQkgIFBBR0VfU0laRSwgTlVMTCwgTlVMTCk7CisJaWYgKGVycm9yIDwgMCkgeworCQlwcl9lcnIoImFtaWdhX2NoaXBfYWxsb2NfcmVzOiBhbGxvY2F0ZV9yZXNvdXJjZSgpIGZhaWxlZCAlZCFcbiIsCisJCSAgICAgICBlcnJvcik7CisJCXJldHVybiBOVUxMOworCX0KKworCWF0b21pY19zdWIoc2l6ZSwgJmNoaXBhdmFpbCk7CisJcHJfZGVidWcoImFtaWdhX2NoaXBfYWxsb2NfcmVzOiByZXR1cm5pbmcgJXBSXG4iLCByZXMpOworCXJldHVybiAodm9pZCAqKVpUV09fVkFERFIocmVzLT5zdGFydCk7CiB9CiAKIHZvaWQgYW1pZ2FfY2hpcF9mcmVlKHZvaWQgKnB0cikKIHsKLSAgICB1bnNpZ25lZCBsb25nIHN0YXJ0ID0gWlRXT19QQUREUihwdHIpOwotICAgIHN0cnVjdCByZXNvdXJjZSAqKnAsICpyZXM7Ci0gICAgdW5zaWduZWQgbG9uZyBzaXplOworCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBaVFdPX1BBRERSKHB0cik7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJdW5zaWduZWQgbG9uZyBzaXplOwogCi0gICAgZm9yIChwID0gJmNoaXByYW1fcmVzLmNoaWxkOyAocmVzID0gKnApOyBwID0gJnJlcy0+c2libGluZykgewotCWlmIChyZXMtPnN0YXJ0ICE9IHN0YXJ0KQotCSAgICBjb250aW51ZTsKLQkqcCA9IHJlcy0+c2libGluZzsKLQlzaXplID0gcmVzLT5lbmQtc3RhcnQ7Ci0jaWZkZWYgREVCVUcKLQlwcmludGsoImFtaWdhX2NoaXBfZnJlZTogZnJlZSAlbGQgYnl0ZXMgYXQgJXBcbiIsIHNpemUsIHB0cik7Ci0jZW5kaWYKLQljaGlwYXZhaWwgKz0gc2l6ZTsKKwlyZXMgPSBsb29rdXBfcmVzb3VyY2UoJmNoaXByYW1fcmVzLCBzdGFydCk7CisJaWYgKCFyZXMpIHsKKwkJcHJfZXJyKCJhbWlnYV9jaGlwX2ZyZWU6IHRyeWluZyB0byBmcmVlIG5vbmV4aXN0ZW50IHJlZ2lvbiBhdCAiCisJCSAgICAgICAiJXBcbiIsIHB0cik7CisJCXJldHVybjsKKwl9CisKKwlzaXplID0gcmVzb3VyY2Vfc2l6ZShyZXMpOworCXByX2RlYnVnKCJhbWlnYV9jaGlwX2ZyZWU6IGZyZWUgJWx1IGJ5dGVzIGF0ICVwXG4iLCBzaXplLCBwdHIpOworCWF0b21pY19hZGQoc2l6ZSwgJmNoaXBhdmFpbCk7CisJcmVsZWFzZV9yZXNvdXJjZShyZXMpOwogCWtmcmVlKHJlcyk7Ci0JcmV0dXJuOwotICAgIH0KLSAgICBwcmludGsoImFtaWdhX2NoaXBfZnJlZTogdHJ5aW5nIHRvIGZyZWUgbm9uZXhpc3RlbnQgcmVnaW9uIGF0ICVwXG4iLCBwdHIpOwogfQogRVhQT1JUX1NZTUJPTChhbWlnYV9jaGlwX2ZyZWUpOwogCiAKIHVuc2lnbmVkIGxvbmcgYW1pZ2FfY2hpcF9hdmFpbCh2b2lkKQogewotI2lmZGVmIERFQlVHCi0JcHJpbnRrKCJhbWlnYV9jaGlwX2F2YWlsIDogJWxkIGJ5dGVzXG4iLCBjaGlwYXZhaWwpOwotI2VuZGlmCi0JcmV0dXJuIGNoaXBhdmFpbDsKKwl1bnNpZ25lZCBsb25nIG4gPSBhdG9taWNfcmVhZCgmY2hpcGF2YWlsKTsKKworCXByX2RlYnVnKCJhbWlnYV9jaGlwX2F2YWlsIDogJWx1IGJ5dGVzXG4iLCBuKTsKKwlyZXR1cm4gbjsKIH0KIEVYUE9SVF9TWU1CT0woYW1pZ2FfY2hpcF9hdmFpbCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9hdGFyaS9zdHJhbS5jIGIvYXJjaC9tNjhrL2F0YXJpL3N0cmFtLmMKaW5kZXggNmVjM2I3Zi4uMDgxMGM4ZCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2F0YXJpL3N0cmFtLmMKKysrIGIvYXJjaC9tNjhrL2F0YXJpL3N0cmFtLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogYXJjaC9tNjhrL2F0YXJpL3N0cmFtLmM6IEZ1bmN0aW9ucyBmb3IgU1QtUkFNIGFsbG9jYXRpb25zCisgKiBGdW5jdGlvbnMgZm9yIFNULVJBTSBhbGxvY2F0aW9ucwogICoKICAqIENvcHlyaWdodCAxOTk0LTk3IFJvbWFuIEhvZGVrIDxSb21hbi5Ib2Rla0BpbmZvcm1hdGlrLnVuaS1lcmxhbmdlbi5kZT4KICAqCkBAIC0zMCw5MSArMzAsMzUgQEAKICNpbmNsdWRlIDxhc20vYXRhcmlfc3RyYW0uaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAotI3VuZGVmIERFQlVHCi0KLSNpZmRlZiBERUJVRwotI2RlZmluZQlEUFJJTlRLKGZtdCxhcmdzLi4uKSBwcmludGsoIGZtdCwgIyNhcmdzICkKLSNlbHNlCi0jZGVmaW5lIERQUklOVEsoZm10LGFyZ3MuLi4pCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX1BST0NfRlMpICYmIGRlZmluZWQoQ09ORklHX1NUUkFNX1BST0MpCi0vKiBhYmJyZXYgZm9yIHRoZSAmJiBhYm92ZS4uLiAqLwotI2RlZmluZSBET19QUk9DCi0jaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jZW5kaWYKIAogLyoKLSAqICsrcm9tYW46Ci0gKgotICogTmV3IHZlcnNpb24gb2YgU1QtUmFtIGJ1ZmZlciBhbGxvY2F0aW9uLiBJbnN0ZWFkIG9mIHVzaW5nIHRoZQotICogMSBNQiAtIDQgS0IgdGhhdCByZW1haW4gd2hlbiB0aGUgU1QtUmFtIGNodW5rIHN0YXJ0cyBhdCAkMTAwMAotICogKDEgTUIgZ3JhbnVsYXJpdHkhKSwgc3VjaCBidWZmZXJzIGFyZSByZXNlcnZlZCBsaWtlIHRoaXM6Ci0gKgotICogIC0gSWYgdGhlIGtlcm5lbCByZXNpZGVzIGluIFNULVJhbSBhbnl3YXksIHdlIGNhbiB0YWtlIHRoZSBidWZmZXIKLSAqICAgIGZyb20gYmVoaW5kIHRoZSBjdXJyZW50IGtlcm5lbCBkYXRhIHNwYWNlIHRoZSBub3JtYWwgd2F5Ci0gKiAgICAoaW5jcmVtZW50aW5nIHN0YXJ0X21lbSkuCi0gKgotICogIC0gSWYgdGhlIGtlcm5lbCBpcyBpbiBUVC1SYW0sIHN0cmFtX2luaXQoKSBpbml0aWFsaXplcyBzdGFydCBhbmQKLSAqICAgIGVuZCBvZiB0aGUgYXZhaWxhYmxlIHJlZ2lvbi4gQnVmZmVycyBhcmUgYWxsb2NhdGVkIGZyb20gdGhlcmUKLSAqICAgIGFuZCBtZW1faW5pdCgpIGxhdGVyIG1hcmtzIHRoZSBzdWNoIHVzZWQgcGFnZXMgYXMgcmVzZXJ2ZWQuCi0gKiAgICBTaW5jZSBlYWNoIFRULVJhbSBjaHVuayBpcyBhdCBsZWFzdCA0IE1CIGluIHNpemUsIEkgaG9wZSB0aGVyZQotICogICAgd29uJ3QgYmUgYW4gb3ZlcnJ1biBvZiB0aGUgU1QtUmFtIHJlZ2lvbiBieSBub3JtYWwga2VybmVsIGRhdGEKLSAqICAgIHNwYWNlLgotICoKLSAqIEZvciB0aGF0LCBTVC1SYW0gbWF5IG9ubHkgYmUgYWxsb2NhdGVkIHdoaWxlIGtlcm5lbCBpbml0aWFsaXphdGlvbgotICogaXMgZ29pbmcgb24sIG9yIGV4YWN0bHk6IGJlZm9yZSBtZW1faW5pdCgpIGlzIGNhbGxlZC4gVGhlcmUgaXMgYWxzbwotICogbm8gcHJvdmlzaW9uIG5vdyBmb3IgZnJlZWluZyBTVC1SYW0gYnVmZmVycy4gSXQgc2VlbXMgdGhhdCBpc24ndAotICogcmVhbGx5IG5lZWRlZC4KLSAqCisgKiBUaGUgU1QtUkFNIGFsbG9jYXRvciBhbGxvY2F0ZXMgbWVtb3J5IGZyb20gYSBwb29sIG9mIHJlc2VydmVkIFNULVJBTSBvZgorICogY29uZmlndXJhYmxlIHNpemUsIHNldCBhc2lkZSBvbiBTVC1SQU0gaW5pdC4KKyAqIEFzIGxvbmcgYXMgdGhpcyBwb29sIGlzIG5vdCBleGhhdXN0ZWQsIGFsbG9jYXRpb24gb2YgcmVhbCBTVC1SQU0gY2FuIGJlCisgKiBndWFyYW50ZWVkLgogICovCiAKLS8qIFN0YXJ0IGFuZCBlbmQgKHZpcnR1YWwpIG9mIFNULVJBTSAqLwotc3RhdGljIHZvaWQgKnN0cmFtX3N0YXJ0LCAqc3RyYW1fZW5kOwotCi0vKiBzZXQgYWZ0ZXIgbWVtb3J5X2luaXQoKSBleGVjdXRlZCBhbmQgYWxsb2NhdGlvbnMgdmlhIHN0YXJ0X21lbSBhcmVuJ3QKLSAqIHBvc3NpYmxlIGFueW1vcmUgKi8KLXN0YXRpYyBpbnQgbWVtX2luaXRfZG9uZTsKLQogLyogc2V0IGlmIGtlcm5lbCBpcyBpbiBTVC1SQU0gKi8KIHN0YXRpYyBpbnQga2VybmVsX2luX3N0cmFtOwogCi10eXBlZGVmIHN0cnVjdCBzdHJhbV9ibG9jayB7Ci0Jc3RydWN0IHN0cmFtX2Jsb2NrICpuZXh0OwotCXZvaWQgKnN0YXJ0OwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQl1bnNpZ25lZCBmbGFnczsKLQljb25zdCBjaGFyICpvd25lcjsKLX0gQkxPQ0s7CitzdGF0aWMgc3RydWN0IHJlc291cmNlIHN0cmFtX3Bvb2wgPSB7CisJLm5hbWUgPSAiU1QtUkFNIFBvb2wiCit9OwogCi0vKiB2YWx1ZXMgZm9yIGZsYWdzIGZpZWxkICovCi0jZGVmaW5lIEJMT0NLX0ZSRUUJMHgwMQkvKiBmcmVlIHN0cnVjdHVyZSBpbiB0aGUgQkxPQ0tzIHBvb2wgKi8KLSNkZWZpbmUgQkxPQ0tfS01BTExPQ0VECTB4MDIJLyogc3RydWN0dXJlIGFsbG9jYXRlZCBieSBrbWFsbG9jKCkgKi8KLSNkZWZpbmUgQkxPQ0tfR0ZQCTB4MDgJLyogYmxvY2sgYWxsb2NhdGVkIHdpdGggX19nZXRfZG1hX3BhZ2VzKCkgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBvb2xfc2l6ZSA9IDEwMjQqMTAyNDsKIAotLyogbGlzdCBvZiBhbGxvY2F0ZWQgYmxvY2tzICovCi1zdGF0aWMgQkxPQ0sgKmFsbG9jX2xpc3Q7CiAKLS8qIFdlIGNhbid0IGFsd2F5cyB1c2Uga21hbGxvYygpIHRvIGFsbG9jYXRlIEJMT0NLIHN0cnVjdHVyZXMsIHNpbmNlCi0gKiBzdHJhbV9hbGxvYygpIGNhbiBiZSBjYWxsZWQgcmF0aGVyIGVhcmx5LiBTbyB3ZSBuZWVkIHNvbWUgcG9vbCBvZgotICogc3RhdGljYWxseSBhbGxvY2F0ZWQgc3RydWN0dXJlcy4gMjAgb2YgdGhlbSBpcyBtb3JlIHRoYW4gZW5vdWdoLCBzbyBpbiBtb3N0Ci0gKiBjYXNlcyB3ZSBuZXZlciBzaG91bGQgbmVlZCB0byBjYWxsIGttYWxsb2MoKS4gKi8KLSNkZWZpbmUgTl9TVEFUSUNfQkxPQ0tTCTIwCi1zdGF0aWMgQkxPQ0sgc3RhdGljX2Jsb2Nrc1tOX1NUQVRJQ19CTE9DS1NdOworc3RhdGljIGludCBfX2luaXQgYXRhcmlfc3RyYW1fc2V0dXAoY2hhciAqYXJnKQoreworCWlmICghTUFDSF9JU19BVEFSSSkKKwkJcmV0dXJuIDA7CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBQcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCXBvb2xfc2l6ZSA9IG1lbXBhcnNlKGFyZywgTlVMTCk7CisJcmV0dXJuIDA7Cit9CiAKLXN0YXRpYyBCTE9DSyAqYWRkX3JlZ2lvbiggdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBzaXplICk7Ci1zdGF0aWMgQkxPQ0sgKmZpbmRfcmVnaW9uKCB2b2lkICphZGRyICk7Ci1zdGF0aWMgaW50IHJlbW92ZV9yZWdpb24oIEJMT0NLICpibG9jayApOworZWFybHlfcGFyYW0oInN0cmFtX3Bvb2wiLCBhdGFyaV9zdHJhbV9zZXR1cCk7CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqIEVuZCBvZiBQcm90b3R5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0MCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCQkJCQkJCSAgIFB1YmxpYyBJbnRlcmZhY2UJCQkJCQkJCSovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAogLyoKICAqIFRoaXMgaW5pdCBmdW5jdGlvbiBpcyBjYWxsZWQgdmVyeSBlYXJseSBieSBhdGFyaS9jb25maWcuYwpAQCAtMTIzLDI1ICs2NywyMyBAQAogdm9pZCBfX2luaXQgYXRhcmlfc3RyYW1faW5pdCh2b2lkKQogewogCWludCBpOworCXZvaWQgKnN0cmFtX3N0YXJ0OwogCi0JLyogaW5pdGlhbGl6ZSBzdGF0aWMgYmxvY2tzICovCi0JZm9yKCBpID0gMDsgaSA8IE5fU1RBVElDX0JMT0NLUzsgKytpICkKLQkJc3RhdGljX2Jsb2Nrc1tpXS5mbGFncyA9IEJMT0NLX0ZSRUU7Ci0KLQkvKiBkZXRlcm1pbmUgd2hldGhlciBrZXJuZWwgY29kZSByZXNpZGVzIGluIFNULVJBTSAodGhlbiBTVC1SQU0gaXMgdGhlCi0JICogZmlyc3QgbWVtb3J5IGJsb2NrIGF0IHZpcnR1YWwgMHgwKSAqLworCS8qCisJICogZGV0ZXJtaW5lIHdoZXRoZXIga2VybmVsIGNvZGUgcmVzaWRlcyBpbiBTVC1SQU0KKwkgKiAodGhlbiBTVC1SQU0gaXMgdGhlIGZpcnN0IG1lbW9yeSBibG9jayBhdCB2aXJ0dWFsIDB4MCkKKwkgKi8KIAlzdHJhbV9zdGFydCA9IHBoeXNfdG9fdmlydCgwKTsKIAlrZXJuZWxfaW5fc3RyYW0gPSAoc3RyYW1fc3RhcnQgPT0gMCk7CiAKLQlmb3IoIGkgPSAwOyBpIDwgbTY4a19udW1fbWVtb3J5OyArK2kgKSB7CisJZm9yIChpID0gMDsgaSA8IG02OGtfbnVtX21lbW9yeTsgKytpKSB7CiAJCWlmIChtNjhrX21lbW9yeVtpXS5hZGRyID09IDApIHsKLQkJCS8qIHNraXAgZmlyc3QgMmtCIG9yIHBhZ2UgKHN1cGVydmlzb3Itb25seSEpICovCi0JCQlzdHJhbV9lbmQgPSBzdHJhbV9zdGFydCArIG02OGtfbWVtb3J5W2ldLnNpemU7CiAJCQlyZXR1cm47CiAJCX0KIAl9CisKIAkvKiBTaG91bGQgbmV2ZXIgY29tZSBoZXJlISAoVGhlcmUgaXMgYWx3YXlzIFNULVJhbSEpICovCi0JcGFuaWMoICJhdGFyaV9zdHJhbV9pbml0OiBubyBTVC1SQU0gZm91bmQhIiApOworCXBhbmljKCJhdGFyaV9zdHJhbV9pbml0OiBubyBTVC1SQU0gZm91bmQhIik7CiB9CiAKIApAQCAtMTUxLDIyNiArOTMsNjggQEAKICAqLwogdm9pZCBfX2luaXQgYXRhcmlfc3RyYW1fcmVzZXJ2ZV9wYWdlcyh2b2lkICpzdGFydF9tZW0pCiB7Ci0JLyogYWx3YXlzIHJlc2VydmUgZmlyc3QgcGFnZSBvZiBTVC1SQU0sIHRoZSBmaXJzdCAyIGtCIGFyZQotCSAqIHN1cGVydmlzb3Itb25seSEgKi8KKwkvKgorCSAqIGFsd2F5cyByZXNlcnZlIGZpcnN0IHBhZ2Ugb2YgU1QtUkFNLCB0aGUgZmlyc3QgMiBLaUIgYXJlCisJICogc3VwZXJ2aXNvci1vbmx5IQorCSAqLwogCWlmICgha2VybmVsX2luX3N0cmFtKQogCQlyZXNlcnZlX2Jvb3RtZW0oMCwgUEFHRV9TSVpFLCBCT09UTUVNX0RFRkFVTFQpOwogCi19CisJc3RyYW1fcG9vbC5zdGFydCA9IChyZXNvdXJjZV9zaXplX3QpYWxsb2NfYm9vdG1lbV9sb3dfcGFnZXMocG9vbF9zaXplKTsKKwlzdHJhbV9wb29sLmVuZCA9IHN0cmFtX3Bvb2wuc3RhcnQgKyBwb29sX3NpemUgLSAxOworCXJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmc3RyYW1fcG9vbCk7CiAKLXZvaWQgYXRhcmlfc3RyYW1fbWVtX2luaXRfaG9vayAodm9pZCkKLXsKLQltZW1faW5pdF9kb25lID0gMTsKKwlwcl9kZWJ1ZygiYXRhcmlfc3RyYW0gcG9vbDogc2l6ZSA9ICVsdSBieXRlcywgcmVzb3VyY2UgPSAlcFJcbiIsCisJCSBwb29sX3NpemUsICZzdHJhbV9wb29sKTsKIH0KIAogCi0vKgotICogVGhpcyBpcyBtYWluIHB1YmxpYyBpbnRlcmZhY2U6IHNvbWVob3cgYWxsb2NhdGUgYSBTVC1SQU0gYmxvY2sKLSAqCi0gKiAgLSBJZiB3ZSdyZSBiZWZvcmUgbWVtX2luaXQoKSwgd2UgaGF2ZSB0byBtYWtlIGEgc3RhdGljIGFsbG9jYXRpb24uIFRoZQotICogICAgcmVnaW9uIGlzIHRha2VuIGluIHRoZSBrZXJuZWwgZGF0YSBhcmVhIChpZiB0aGUga2VybmVsIGlzIGluIFNULVJBTSkgb3IKLSAqICAgIGZyb20gdGhlIHN0YXJ0IG9mIFNULVJBTSAoaWYgdGhlIGtlcm5lbCBpcyBpbiBUVC1SQU0pIGFuZCBhZGRlZCB0byB0aGUKLSAqICAgIHJzdmRfc3RyYW1fKiByZWdpb24uIFRoZSBTVC1SQU0gaXMgc29tZXdoZXJlIGluIHRoZSBtaWRkbGUgb2Yga2VybmVsCi0gKiAgICBhZGRyZXNzIHNwYWNlIGluIHRoZSBsYXR0ZXIgY2FzZS4KLSAqCi0gKiAgLSBJZiBtZW1faW5pdCgpIGFscmVhZHkgaGFzIGJlZW4gY2FsbGVkLCB0cnkgd2l0aCBfX2dldF9kbWFfcGFnZXMoKS4KLSAqICAgIFRoaXMgaGFzIHRoZSBkaXNhZHZhbnRhZ2UgdGhhdCBpdCdzIHZlcnkgaGFyZCB0byBnZXQgbW9yZSB0aGFuIDEgcGFnZSwKLSAqICAgIGFuZCBpdCBpcyBsaWtlbHkgdG8gZmFpbCA6LSgKLSAqCi0gKi8KLXZvaWQgKmF0YXJpX3N0cmFtX2FsbG9jKGxvbmcgc2l6ZSwgY29uc3QgY2hhciAqb3duZXIpCit2b2lkICphdGFyaV9zdHJhbV9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUsIGNvbnN0IGNoYXIgKm93bmVyKQogewotCXZvaWQgKmFkZHIgPSBOVUxMOwotCUJMT0NLICpibG9jazsKLQlpbnQgZmxhZ3M7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IGVycm9yOwogCi0JRFBSSU5USygiYXRhcmlfc3RyYW1fYWxsb2Moc2l6ZT0lMDhseCxvd25lcj0lcylcbiIsIHNpemUsIG93bmVyKTsKKwlwcl9kZWJ1ZygiYXRhcmlfc3RyYW1fYWxsb2M6IGFsbG9jYXRlICVsdSBieXRlc1xuIiwgc2l6ZSk7CiAKLQlpZiAoIW1lbV9pbml0X2RvbmUpCi0JCXJldHVybiBhbGxvY19ib290bWVtX2xvdyhzaXplKTsKLQllbHNlIHsKLQkJLyogQWZ0ZXIgbWVtX2luaXQoKTogY2FuIG9ubHkgcmVzb3J0IHRvIF9fZ2V0X2RtYV9wYWdlcygpICovCi0JCWFkZHIgPSAodm9pZCAqKV9fZ2V0X2RtYV9wYWdlcyhHRlBfS0VSTkVMLCBnZXRfb3JkZXIoc2l6ZSkpOwotCQlmbGFncyA9IEJMT0NLX0dGUDsKLQkJRFBSSU5USyggImF0YXJpX3N0cmFtX2FsbG9jOiBhZnRlciBtZW1faW5pdCwgIgotCQkJCSAiZ2V0X3BhZ2VzPSVwXG4iLCBhZGRyICk7CisJLyogcm91bmQgdXAgKi8KKwlzaXplID0gUEFHRV9BTElHTihzaXplKTsKKworCXJlcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByZXNvdXJjZSksIEdGUF9LRVJORUwpOworCWlmICghcmVzKQorCQlyZXR1cm4gTlVMTDsKKworCXJlcy0+bmFtZSA9IG93bmVyOworCWVycm9yID0gYWxsb2NhdGVfcmVzb3VyY2UoJnN0cmFtX3Bvb2wsIHJlcywgc2l6ZSwgMCwgVUlOVF9NQVgsCisJCQkJICBQQUdFX1NJWkUsIE5VTEwsIE5VTEwpOworCWlmIChlcnJvciA8IDApIHsKKwkJcHJfZXJyKCJhdGFyaV9zdHJhbV9hbGxvYzogYWxsb2NhdGVfcmVzb3VyY2UoKSBmYWlsZWQgJWQhXG4iLAorCQkgICAgICAgZXJyb3IpOworCQlrZnJlZShyZXMpOworCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlpZiAoYWRkcikgewotCQlpZiAoIShibG9jayA9IGFkZF9yZWdpb24oIGFkZHIsIHNpemUgKSkpIHsKLQkJCS8qIG91dCBvZiBtZW1vcnkgZm9yIEJMT0NLIHN0cnVjdHVyZSA6LSggKi8KLQkJCURQUklOVEsoICJhdGFyaV9zdHJhbV9hbGxvYzogb3V0IG9mIG1lbSBmb3IgQkxPQ0sgLS0gIgotCQkJCQkgImZyZWVpbmcgYWdhaW5cbiIgKTsKLQkJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpYWRkciwgZ2V0X29yZGVyKHNpemUpKTsKLQkJCXJldHVybiggTlVMTCApOwotCQl9Ci0JCWJsb2NrLT5vd25lciA9IG93bmVyOwotCQlibG9jay0+ZmxhZ3MgfD0gZmxhZ3M7Ci0JfQotCXJldHVybiggYWRkciApOworCXByX2RlYnVnKCJhdGFyaV9zdHJhbV9hbGxvYzogcmV0dXJuaW5nICVwUlxuIiwgcmVzKTsKKwlyZXR1cm4gKHZvaWQgKilyZXMtPnN0YXJ0OwogfQogRVhQT1JUX1NZTUJPTChhdGFyaV9zdHJhbV9hbGxvYyk7CiAKLXZvaWQgYXRhcmlfc3RyYW1fZnJlZSggdm9pZCAqYWRkciApCiAKK3ZvaWQgYXRhcmlfc3RyYW1fZnJlZSh2b2lkICphZGRyKQogewotCUJMT0NLICpibG9jazsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpYWRkcjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwl1bnNpZ25lZCBsb25nIHNpemU7CiAKLQlEUFJJTlRLKCAiYXRhcmlfc3RyYW1fZnJlZShhZGRyPSVwKVxuIiwgYWRkciApOwotCi0JaWYgKCEoYmxvY2sgPSBmaW5kX3JlZ2lvbiggYWRkciApKSkgewotCQlwcmludGsoIEtFUk5fRVJSICJBdHRlbXB0IHRvIGZyZWUgbm9uLWFsbG9jYXRlZCBTVC1SQU0gYmxvY2sgYXQgJXAgIgotCQkJCSJmcm9tICVwXG4iLCBhZGRyLCBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCkgKTsKKwlyZXMgPSBsb29rdXBfcmVzb3VyY2UoJnN0cmFtX3Bvb2wsIHN0YXJ0KTsKKwlpZiAoIXJlcykgeworCQlwcl9lcnIoImF0YXJpX3N0cmFtX2ZyZWU6IHRyeWluZyB0byBmcmVlIG5vbmV4aXN0ZW50IHJlZ2lvbiAiCisJCSAgICAgICAiYXQgJXBcbiIsIGFkZHIpOwogCQlyZXR1cm47CiAJfQotCURQUklOVEsoICJhdGFyaV9zdHJhbV9mcmVlOiBmb3VuZCBibG9jayAoJXApOiBzaXplPSUwOGx4LCBvd25lcj0lcywgIgotCQkJICJmbGFncz0lMDJ4XG4iLCBibG9jaywgYmxvY2stPnNpemUsIGJsb2NrLT5vd25lciwgYmxvY2stPmZsYWdzICk7CiAKLQlpZiAoIShibG9jay0+ZmxhZ3MgJiBCTE9DS19HRlApKQotCQlnb3RvIGZhaWw7Ci0KLQlEUFJJTlRLKCJhdGFyaV9zdHJhbV9mcmVlOiBpcyBrbWFsbG9jZWQsIG9yZGVyX3NpemU9JWRcbiIsCi0JCWdldF9vcmRlcihibG9jay0+c2l6ZSkpOwotCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpYWRkciwgZ2V0X29yZGVyKGJsb2NrLT5zaXplKSk7Ci0JcmVtb3ZlX3JlZ2lvbiggYmxvY2sgKTsKLQlyZXR1cm47Ci0KLSAgZmFpbDoKLQlwcmludGsoIEtFUk5fRVJSICJhdGFyaV9zdHJhbV9mcmVlOiBjYW5ub3QgZnJlZSBibG9jayBhdCAlcCAiCi0JCQkiKGNhbGxlZCBmcm9tICVwKVxuIiwgYWRkciwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApICk7CisJc2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKKwlwcl9kZWJ1ZygiYXRhcmlfc3RyYW1fZnJlZTogZnJlZSAlbHUgYnl0ZXMgYXQgJXBcbiIsIHNpemUsIGFkZHIpOworCXJlbGVhc2VfcmVzb3VyY2UocmVzKTsKKwlrZnJlZShyZXMpOwogfQogRVhQT1JUX1NZTUJPTChhdGFyaV9zdHJhbV9mcmVlKTsKLQotDAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgkJCQkJCQkgIFJlZ2lvbiBNYW5hZ2VtZW50CQkJCQkJCQkqLwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLQotLyogaW5zZXJ0IGEgcmVnaW9uIGludG8gdGhlIGFsbG9jZWQgbGlzdCAoc29ydGVkKSAqLwotc3RhdGljIEJMT0NLICphZGRfcmVnaW9uKCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIHNpemUgKQotewotCUJMT0NLICoqcCwgKm4gPSBOVUxMOwotCWludCBpOwotCi0JZm9yKCBpID0gMDsgaSA8IE5fU1RBVElDX0JMT0NLUzsgKytpICkgewotCQlpZiAoc3RhdGljX2Jsb2Nrc1tpXS5mbGFncyAmIEJMT0NLX0ZSRUUpIHsKLQkJCW4gPSAmc3RhdGljX2Jsb2Nrc1tpXTsKLQkJCW4tPmZsYWdzID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmICghbiAmJiBtZW1faW5pdF9kb25lKSB7Ci0JCS8qIGlmIHN0YXRpY3MgYmxvY2sgcG9vbCBleGhhdXN0ZWQgYW5kIHdlIGNhbiBjYWxsIGttYWxsb2MoKSBhbHJlYWR5Ci0JCSAqIChhZnRlciBtZW1faW5pdCgpKSwgdHJ5IHRoYXQgKi8KLQkJbiA9IGttYWxsb2MoIHNpemVvZihCTE9DSyksIEdGUF9LRVJORUwgKTsKLQkJaWYgKG4pCi0JCQluLT5mbGFncyA9IEJMT0NLX0tNQUxMT0NFRDsKLQl9Ci0JaWYgKCFuKSB7Ci0JCXByaW50ayggS0VSTl9FUlIgIk91dCBvZiBtZW1vcnkgZm9yIFNULVJBTSBkZXNjcmlwdG9yIGJsb2Nrc1xuIiApOwotCQlyZXR1cm4oIE5VTEwgKTsKLQl9Ci0Jbi0+c3RhcnQgPSBhZGRyOwotCW4tPnNpemUgID0gc2l6ZTsKLQotCWZvciggcCA9ICZhbGxvY19saXN0OyAqcDsgcCA9ICYoKCpwKS0+bmV4dCkgKQotCQlpZiAoKCpwKS0+c3RhcnQgPiBhZGRyKSBicmVhazsKLQluLT5uZXh0ID0gKnA7Ci0JKnAgPSBuOwotCi0JcmV0dXJuKCBuICk7Ci19Ci0KLQotLyogZmluZCBhIHJlZ2lvbiAoYnkgc3RhcnQgYWRkcikgaW4gdGhlIGFsbG9jZWQgbGlzdCAqLwotc3RhdGljIEJMT0NLICpmaW5kX3JlZ2lvbiggdm9pZCAqYWRkciApCi17Ci0JQkxPQ0sgKnA7Ci0KLQlmb3IoIHAgPSBhbGxvY19saXN0OyBwOyBwID0gcC0+bmV4dCApIHsKLQkJaWYgKHAtPnN0YXJ0ID09IGFkZHIpCi0JCQlyZXR1cm4oIHAgKTsKLQkJaWYgKHAtPnN0YXJ0ID4gYWRkcikKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4oIE5VTEwgKTsKLX0KLQotCi0vKiByZW1vdmUgYSBibG9jayBmcm9tIHRoZSBhbGxvY2VkIGxpc3QgKi8KLXN0YXRpYyBpbnQgcmVtb3ZlX3JlZ2lvbiggQkxPQ0sgKmJsb2NrICkKLXsKLQlCTE9DSyAqKnA7Ci0KLQlmb3IoIHAgPSAmYWxsb2NfbGlzdDsgKnA7IHAgPSAmKCgqcCktPm5leHQpICkKLQkJaWYgKCpwID09IGJsb2NrKSBicmVhazsKLQlpZiAoISpwKQotCQlyZXR1cm4oIDAgKTsKLQotCSpwID0gYmxvY2stPm5leHQ7Ci0JaWYgKGJsb2NrLT5mbGFncyAmIEJMT0NLX0tNQUxMT0NFRCkKLQkJa2ZyZWUoIGJsb2NrICk7Ci0JZWxzZQotCQlibG9jay0+ZmxhZ3MgfD0gQkxPQ0tfRlJFRTsKLQlyZXR1cm4oIDEgKTsKLX0KLQotCi0MCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCQkJCQkJIC9wcm9jIHN0YXRpc3RpY3MgZmlsZSBzdHVmZgkJCQkJCSovCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLQotI2lmZGVmIERPX1BST0MKLQotI2RlZmluZQlQUklOVF9QUk9DKGZtdCxhcmdzLi4uKSBzZXFfcHJpbnRmKCBtLCBmbXQsICMjYXJncyApCi0KLXN0YXRpYyBpbnQgc3RyYW1fcHJvY19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKLXsKLQlCTE9DSyAqcDsKLQotCVBSSU5UX1BST0MoIlRvdGFsIFNULVJBTTogICAgICAlOHUga0JcbiIsCi0JCQkgICAoc3RyYW1fZW5kIC0gc3RyYW1fc3RhcnQpID4+IDEwKTsKLQlQUklOVF9QUk9DKCAiQWxsb2NhdGVkIHJlZ2lvbnM6XG4iICk7Ci0JZm9yKCBwID0gYWxsb2NfbGlzdDsgcDsgcCA9IHAtPm5leHQgKSB7Ci0JCVBSSU5UX1BST0MoIjB4JTA4bHgtMHglMDhseDogJXMgKCIsCi0JCQkgICB2aXJ0X3RvX3BoeXMocC0+c3RhcnQpLAotCQkJICAgdmlydF90b19waHlzKHAtPnN0YXJ0K3AtPnNpemUtMSksCi0JCQkgICBwLT5vd25lcik7Ci0JCWlmIChwLT5mbGFncyAmIEJMT0NLX0dGUCkKLQkJCVBSSU5UX1BST0MoICJwYWdlLWFsbG9jZWQpXG4iICk7Ci0JCWVsc2UKLQkJCVBSSU5UX1BST0MoICI/PylcbiIgKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzdHJhbV9wcm9jX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHN0cmFtX3Byb2Nfc2hvdywgTlVMTCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHN0cmFtX3Byb2NfZm9wcyA9IHsKLQkub3BlbgkJPSBzdHJhbV9wcm9jX29wZW4sCi0JLnJlYWQJCT0gc2VxX3JlYWQsCi0JLmxsc2VlawkJPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UJPSBzaW5nbGVfcmVsZWFzZSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHByb2Nfc3RyYW1faW5pdCh2b2lkKQotewotCXByb2NfY3JlYXRlKCJzdHJhbSIsIDAsIE5VTEwsICZzdHJhbV9wcm9jX2ZvcHMpOwotCXJldHVybiAwOwotfQotbW9kdWxlX2luaXQocHJvY19zdHJhbV9pbml0KTsKLSNlbmRpZgotCi0KLS8qCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiAgYy1pbmRlbnQtbGV2ZWw6IDQKLSAqICB0YWItd2lkdGg6IDQKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2F0YXJpX3N0cmFtLmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vYXRhcmlfc3RyYW0uaAppbmRleCA3NTQ2ZDEzLi42MmUyNzU5IDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vYXRhcmlfc3RyYW0uaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vYXRhcmlfc3RyYW0uaApAQCAtNiwxMiArNiwxMSBAQAogICovCiAKIC8qIHB1YmxpYyBpbnRlcmZhY2UgKi8KLXZvaWQgKmF0YXJpX3N0cmFtX2FsbG9jKGxvbmcgc2l6ZSwgY29uc3QgY2hhciAqb3duZXIpOwordm9pZCAqYXRhcmlfc3RyYW1fYWxsb2ModW5zaWduZWQgbG9uZyBzaXplLCBjb25zdCBjaGFyICpvd25lcik7CiB2b2lkIGF0YXJpX3N0cmFtX2ZyZWUodm9pZCAqKTsKIAogLyogZnVuY3Rpb25zIGNhbGxlZCBpbnRlcm5hbGx5IGJ5IG90aGVyIHBhcnRzIG9mIHRoZSBrZXJuZWwgKi8KIHZvaWQgYXRhcmlfc3RyYW1faW5pdCh2b2lkKTsKIHZvaWQgYXRhcmlfc3RyYW1fcmVzZXJ2ZV9wYWdlcyh2b2lkICpzdGFydF9tZW0pOwotdm9pZCBhdGFyaV9zdHJhbV9tZW1faW5pdF9ob29rICh2b2lkKTsKIAogI2VuZGlmIC8qX002OEtfQVRBUklfU1RSQU1fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2F0YXJpaHcuaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9hdGFyaWh3LmgKaW5kZXggZjUxZjcwOS4uMDM5MmIyODY1IDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vYXRhcmlody5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9hdGFyaWh3LmgKQEAgLTM5OSw4ICszOTksOCBAQAogI2RlZmluZSBDT0RFQ19PVkVSRkxPV19MRUZUICAgICAyCiAgIHVfY2hhciB1bnVzZWQyLCB1bnVzZWQzLCB1bnVzZWQ0LCB1bnVzZWQ1OwogICB1X2NoYXIgZ3Bpb19kaXJlY3Rpb25zOwotI2RlZmluZSBHUElPX0lOICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIEdQSU9fT1VUICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgQ09ERUNfR1BJT19JTiAgICAgICAgICAgMAorI2RlZmluZSBDT0RFQ19HUElPX09VVCAgICAgICAgICAxCiAgIHVfY2hhciB1bnVzZWQ2OwogICB1X2NoYXIgZ3Bpb19kYXRhOwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvc2V0dXBfbW0uYyBiL2FyY2gvbTY4ay9rZXJuZWwvc2V0dXBfbW0uYwppbmRleCAzMzRkODM2Li5jM2I0NTA2IDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3NldHVwX21tLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9zZXR1cF9tbS5jCkBAIC0yMTYsNyArMjE2LDkgQEAKIAogdm9pZCBfX2luaXQgc2V0dXBfYXJjaChjaGFyICoqY21kbGluZV9wKQogeworI2lmbmRlZiBDT05GSUdfU1VOMwogCWludCBpOworI2VuZGlmCiAKIAkvKiBUaGUgYm9vdGluZm8gaXMgbG9jYXRlZCByaWdodCBhZnRlciB0aGUga2VybmVsIGJzcyAqLwogCW02OGtfcGFyc2VfYm9vdGluZm8oKGNvbnN0IHN0cnVjdCBiaV9yZWNvcmQgKilfZW5kKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tYXRoLWVtdS9mcF9sb2cuYyBiL2FyY2gvbTY4ay9tYXRoLWVtdS9mcF9sb2cuYwppbmRleCAzNjdlY2VlLi4zMzg0YTUyIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbWF0aC1lbXUvZnBfbG9nLmMKKysrIGIvYXJjaC9tNjhrL21hdGgtZW11L2ZwX2xvZy5jCkBAIC0xMDUsOSArMTA1LDYgQEAKIAogCWZwX21vbmFkaWNfY2hlY2soZGVzdCwgc3JjKTsKIAotCWlmIChJU19aRVJPKGRlc3QpKQotCQlyZXR1cm4gZGVzdDsKLQogCXJldHVybiBkZXN0OwogfQogCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbWF0aC1lbXUvbXVsdGlfYXJpdGguaCBiL2FyY2gvbTY4ay9tYXRoLWVtdS9tdWx0aV9hcml0aC5oCmluZGV4IDRhZDBjYTkuLjRiNWViM2QgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tYXRoLWVtdS9tdWx0aV9hcml0aC5oCisrKyBiL2FyY2gvbTY4ay9tYXRoLWVtdS9tdWx0aV9hcml0aC5oCkBAIC0xOSwyNDYgKzE5LDYgQEAKICNpZm5kZWYgTVVMVElfQVJJVEhfSAogI2RlZmluZSBNVUxUSV9BUklUSF9ICiAKLSNpZiAwCS8qIG9sZCBjb2RlLi4uICovCi0KLS8qIFVuc2lnbmVkIG9ubHksIGJlY2F1c2Ugd2UgZG9uJ3QgbmVlZCBzaWducyB0byBtdWx0aXBseSBhbmQgZGl2aWRlLiAqLwotdHlwZWRlZiB1bnNpZ25lZCBpbnQgaW50MTI4WzRdOwotCi0vKiBXb3JkIG9yZGVyICovCi1lbnVtIHsKLQlNU1cxMjgsCi0JTk1TVzEyOCwKLQlOTFNXMTI4LAotCUxTVzEyOAotfTsKLQotLyogYmlnLWVuZGlhbiAqLwotI2RlZmluZSBMT19XT1JEKGxsKSAoKCh1bnNpZ25lZCBpbnQgKikgJmxsKVsxXSkKLSNkZWZpbmUgSElfV09SRChsbCkgKCgodW5zaWduZWQgaW50ICopICZsbClbMF0pCi0KLS8qIENvbnZlbmllbmNlIGZ1bmN0aW9ucyB0byBzdHVmZiB2YXJpb3VzIGludGVnZXIgdmFsdWVzIGludG8gaW50MTI4cyAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgemVybzEyOChpbnQxMjggYSkKLXsKLQlhW0xTVzEyOF0gPSBhW05MU1cxMjhdID0gYVtOTVNXMTI4XSA9IGFbTVNXMTI4XSA9IDA7Ci19Ci0KLS8qIEh1bWFuLXJlYWRhYmxlIHdvcmQgb3JkZXIgaW4gdGhlIGFyZ3VtZW50cyAqLwotc3RhdGljIGlubGluZSB2b2lkIHNldDEyOCh1bnNpZ25lZCBpbnQgaTMsIHVuc2lnbmVkIGludCBpMiwgdW5zaWduZWQgaW50IGkxLAotCQkJICB1bnNpZ25lZCBpbnQgaTAsIGludDEyOCBhKQotewotCWFbTFNXMTI4XSA9IGkwOwotCWFbTkxTVzEyOF0gPSBpMTsKLQlhW05NU1cxMjhdID0gaTI7Ci0JYVtNU1cxMjhdID0gaTM7Ci19Ci0KLS8qIENvbnZlbmllbmNlIGZ1bmN0aW9ucyAoZm9yIHRlc3RpbmcgYXMgd2VsbCkgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBpbnQ2NF90b18xMjgodW5zaWduZWQgbG9uZyBsb25nIHNyYywgaW50MTI4IGRlc3QpCi17Ci0JZGVzdFtMU1cxMjhdID0gKHVuc2lnbmVkIGludCkgc3JjOwotCWRlc3RbTkxTVzEyOF0gPSBzcmMgPj4gMzI7Ci0JZGVzdFtOTVNXMTI4XSA9IGRlc3RbTVNXMTI4XSA9IDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpbnQxMjhfdG9fNjQoY29uc3QgaW50MTI4IHNyYywgdW5zaWduZWQgbG9uZyBsb25nICpkZXN0KQotewotCSpkZXN0ID0gc3JjW0xTVzEyOF0gfCAobG9uZyBsb25nKSBzcmNbTkxTVzEyOF0gPDwgMzI7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfaTEyOChjb25zdCBpbnQxMjggYSkKLXsKLQlwcmludGsoIiUwOHggJTA4eCAlMDh4ICUwOHhcbiIsIGFbTVNXMTI4XSwgYVtOTVNXMTI4XSwKLQkgICAgICAgYVtOTFNXMTI4XSwgYVtMU1cxMjhdKTsKLX0KLQotLyogSW50ZXJuYWwgc2hpZnRlcnM6Ci0KLSAgIE5vdGUgdGhhdCB0aGVzZSBhcmUgb25seSBnb29kIGZvciAwIDwgY291bnQgPCAzMi4KLSAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgX2xzbDEyOCh1bnNpZ25lZCBpbnQgY291bnQsIGludDEyOCBhKQotewotCWFbTVNXMTI4XSA9IChhW01TVzEyOF0gPDwgY291bnQpIHwgKGFbTk1TVzEyOF0gPj4gKDMyIC0gY291bnQpKTsKLQlhW05NU1cxMjhdID0gKGFbTk1TVzEyOF0gPDwgY291bnQpIHwgKGFbTkxTVzEyOF0gPj4gKDMyIC0gY291bnQpKTsKLQlhW05MU1cxMjhdID0gKGFbTkxTVzEyOF0gPDwgY291bnQpIHwgKGFbTFNXMTI4XSA+PiAoMzIgLSBjb3VudCkpOwotCWFbTFNXMTI4XSA8PD0gY291bnQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfbHNyMTI4KHVuc2lnbmVkIGludCBjb3VudCwgaW50MTI4IGEpCi17Ci0JYVtMU1cxMjhdID0gKGFbTFNXMTI4XSA+PiBjb3VudCkgfCAoYVtOTFNXMTI4XSA8PCAoMzIgLSBjb3VudCkpOwotCWFbTkxTVzEyOF0gPSAoYVtOTFNXMTI4XSA+PiBjb3VudCkgfCAoYVtOTVNXMTI4XSA8PCAoMzIgLSBjb3VudCkpOwotCWFbTk1TVzEyOF0gPSAoYVtOTVNXMTI4XSA+PiBjb3VudCkgfCAoYVtNU1cxMjhdIDw8ICgzMiAtIGNvdW50KSk7Ci0JYVtNU1cxMjhdID4+PSBjb3VudDsKLX0KLQotLyogU2hvdWxkIGJlIGZhc3Rlciwgb25lIHdvdWxkIGhvcGUgKi8KLQotc3RhdGljIGlubGluZSB2b2lkIGxzbG9uZTEyOChpbnQxMjggYSkKLXsKLQlhc20gdm9sYXRpbGUgKCJsc2wubCAjMSwlMFxuIgotCQkgICAgICAicm94bC5sICMxLCUxXG4iCi0JCSAgICAgICJyb3hsLmwgIzEsJTJcbiIKLQkJICAgICAgInJveGwubCAjMSwlM1xuIgotCQkgICAgICA6Ci0JCSAgICAgICI9ZCIgKGFbTFNXMTI4XSksCi0JCSAgICAgICI9ZCIoYVtOTFNXMTI4XSksCi0JCSAgICAgICI9ZCIoYVtOTVNXMTI4XSksCi0JCSAgICAgICI9ZCIoYVtNU1cxMjhdKQotCQkgICAgICA6Ci0JCSAgICAgICIwIihhW0xTVzEyOF0pLAotCQkgICAgICAiMSIoYVtOTFNXMTI4XSksCi0JCSAgICAgICIyIihhW05NU1cxMjhdKSwKLQkJICAgICAgIjMiKGFbTVNXMTI4XSkpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbHNyb25lMTI4KGludDEyOCBhKQotewotCWFzbSB2b2xhdGlsZSAoImxzci5sICMxLCUwXG4iCi0JCSAgICAgICJyb3hyLmwgIzEsJTFcbiIKLQkJICAgICAgInJveHIubCAjMSwlMlxuIgotCQkgICAgICAicm94ci5sICMxLCUzXG4iCi0JCSAgICAgIDoKLQkJICAgICAgIj1kIiAoYVtNU1cxMjhdKSwKLQkJICAgICAgIj1kIihhW05NU1cxMjhdKSwKLQkJICAgICAgIj1kIihhW05MU1cxMjhdKSwKLQkJICAgICAgIj1kIihhW0xTVzEyOF0pCi0JCSAgICAgIDoKLQkJICAgICAgIjAiKGFbTVNXMTI4XSksCi0JCSAgICAgICIxIihhW05NU1cxMjhdKSwKLQkJICAgICAgIjIiKGFbTkxTVzEyOF0pLAotCQkgICAgICAiMyIoYVtMU1cxMjhdKSk7Ci19Ci0KLS8qIEdlbmVyYWxpemVkIDEyOC1iaXQgc2hpZnRlcnM6Ci0KLSAgIFRoZXNlIGJpdC1zaGlmdCB0byBhIG11bHRpcGxlIG9mIDMyLCB0aGVuIG1vdmUgd2hvbGUgbG9uZ3dvcmRzLiAgKi8KLQotc3RhdGljIGlubGluZSB2b2lkIGxzbDEyOCh1bnNpZ25lZCBpbnQgY291bnQsIGludDEyOCBhKQotewotCWludCB3b3JkY291bnQsIGk7Ci0KLQlpZiAoY291bnQgJSAzMikKLQkJX2xzbDEyOChjb3VudCAlIDMyLCBhKTsKLQotCWlmICgwID09ICh3b3JkY291bnQgPSBjb3VudCAvIDMyKSkKLQkJcmV0dXJuOwotCi0JLyogYXJnaCwgZ2FrLCBlbmRpYW4tc2Vuc2l0aXZlICovCi0JZm9yIChpID0gMDsgaSA8IDQgLSB3b3JkY291bnQ7IGkrKykgewotCQlhW2ldID0gYVtpICsgd29yZGNvdW50XTsKLQl9Ci0JZm9yIChpID0gMzsgaSA+PSA0IC0gd29yZGNvdW50OyAtLWkpIHsKLQkJYVtpXSA9IDA7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbHNyMTI4KHVuc2lnbmVkIGludCBjb3VudCwgaW50MTI4IGEpCi17Ci0JaW50IHdvcmRjb3VudCwgaTsKLQotCWlmIChjb3VudCAlIDMyKQotCQlfbHNyMTI4KGNvdW50ICUgMzIsIGEpOwotCi0JaWYgKDAgPT0gKHdvcmRjb3VudCA9IGNvdW50IC8gMzIpKQotCQlyZXR1cm47Ci0KLQlmb3IgKGkgPSAzOyBpID49IHdvcmRjb3VudDsgLS1pKSB7Ci0JCWFbaV0gPSBhW2kgLSB3b3JkY291bnRdOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgd29yZGNvdW50OyBpKyspIHsKLQkJYVtpXSA9IDA7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIGludCBvcmwxMjgoaW50IGEsIGludDEyOCBiKQotewotCWJbTFNXMTI4XSB8PSBhOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBidHN0aGkxMjgoY29uc3QgaW50MTI4IGEpCi17Ci0JcmV0dXJuIGFbTVNXMTI4XSAmIDB4ODAwMDAwMDA7Ci19Ci0KLS8qIHRlc3QgYml0cyAobnVtYmVyZWQgZnJvbSAwID0gTFNCKSB1cCB0byBhbmQgaW5jbHVkaW5nICJ0b3AiICovCi1zdGF0aWMgaW5saW5lIGludCBiZnRlc3RsbzEyOChpbnQgdG9wLCBjb25zdCBpbnQxMjggYSkKLXsKLQlpbnQgciA9IDA7Ci0KLQlpZiAodG9wID4gMzEpCi0JCXIgfD0gYVtMU1cxMjhdOwotCWlmICh0b3AgPiA2MykKLQkJciB8PSBhW05MU1cxMjhdOwotCWlmICh0b3AgPiA5NSkKLQkJciB8PSBhW05NU1cxMjhdOwotCi0JciB8PSBhWzMgLSAodG9wIC8gMzIpXSAmICgoMSA8PCAodG9wICUgMzIgKyAxKSkgLSAxKTsKLQotCXJldHVybiAociAhPSAwKTsKLX0KLQotLyogQWFyZ2guICBXZSBuZWVkIHRoZXNlIGJlY2F1c2UgR0NDIGlzIGJyb2tlbiAqLwotLyogRklYTUU6IGRvIHRoZW0gaW4gYXNzZW1ibHksIGZvciBnb29kbmVzcycgc2FrZSEgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBtYXNrNjQoaW50IHBvcywgdW5zaWduZWQgbG9uZyBsb25nICptYXNrKQotewotCSptYXNrID0gMDsKLQotCWlmIChwb3MgPCAzMikgewotCQlMT19XT1JEKCptYXNrKSA9ICgxIDw8IHBvcykgLSAxOwotCQlyZXR1cm47Ci0JfQotCUxPX1dPUkQoKm1hc2spID0gLTE7Ci0JSElfV09SRCgqbWFzaykgPSAoMSA8PCAocG9zIC0gMzIpKSAtIDE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBic2V0NjQoaW50IHBvcywgdW5zaWduZWQgbG9uZyBsb25nICpkZXN0KQotewotCS8qIFRoaXMgY29uZGl0aW9uYWwgd2lsbCBiZSBvcHRpbWl6ZWQgYXdheS4gIFRoYW5rcywgR0NDISAqLwotCWlmIChwb3MgPCAzMikKLQkJYXNtIHZvbGF0aWxlICgiYnNldCAlMSwlMCI6Ij1tIgotCQkJICAgICAgKExPX1dPUkQoKmRlc3QpKToiaWQiKHBvcykpOwotCWVsc2UKLQkJYXNtIHZvbGF0aWxlICgiYnNldCAlMSwlMCI6Ij1tIgotCQkJICAgICAgKEhJX1dPUkQoKmRlc3QpKToiaWQiKHBvcyAtIDMyKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGJ0c3Q2NChpbnQgcG9zLCB1bnNpZ25lZCBsb25nIGxvbmcgZGVzdCkKLXsKLQlpZiAocG9zIDwgMzIpCi0JCXJldHVybiAoMCAhPSAoTE9fV09SRChkZXN0KSAmICgxIDw8IHBvcykpKTsKLQllbHNlCi0JCXJldHVybiAoMCAhPSAoSElfV09SRChkZXN0KSAmICgxIDw8IChwb3MgLSAzMikpKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBsc2w2NChpbnQgY291bnQsIHVuc2lnbmVkIGxvbmcgbG9uZyAqZGVzdCkKLXsKLQlpZiAoY291bnQgPCAzMikgewotCQlISV9XT1JEKCpkZXN0KSA9IChISV9XT1JEKCpkZXN0KSA8PCBjb3VudCkKLQkJICAgIHwgKExPX1dPUkQoKmRlc3QpID4+IGNvdW50KTsKLQkJTE9fV09SRCgqZGVzdCkgPDw9IGNvdW50OwotCQlyZXR1cm47Ci0JfQotCWNvdW50IC09IDMyOwotCUhJX1dPUkQoKmRlc3QpID0gTE9fV09SRCgqZGVzdCkgPDwgY291bnQ7Ci0JTE9fV09SRCgqZGVzdCkgPSAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgbHNyNjQoaW50IGNvdW50LCB1bnNpZ25lZCBsb25nIGxvbmcgKmRlc3QpCi17Ci0JaWYgKGNvdW50IDwgMzIpIHsKLQkJTE9fV09SRCgqZGVzdCkgPSAoTE9fV09SRCgqZGVzdCkgPj4gY291bnQpCi0JCSAgICB8IChISV9XT1JEKCpkZXN0KSA8PCAoMzIgLSBjb3VudCkpOwotCQlISV9XT1JEKCpkZXN0KSA+Pj0gY291bnQ7Ci0JCXJldHVybjsKLQl9Ci0JY291bnQgLT0gMzI7Ci0JTE9fV09SRCgqZGVzdCkgPSBISV9XT1JEKCpkZXN0KSA+PiBjb3VudDsKLQlISV9XT1JEKCpkZXN0KSA9IDA7Ci19Ci0jZW5kaWYKLQogc3RhdGljIGlubGluZSB2b2lkIGZwX2Rlbm9ybWFsaXplKHN0cnVjdCBmcF9leHQgKnJlZywgdW5zaWduZWQgaW50IGNudCkKIHsKIAlyZWctPmV4cCArPSBjbnQ7CkBAIC00ODEsMTE3ICsyNDEsNiBAQAogCX0KIH0KIAotI2lmIDAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGZwX2ZsczEyOCh1bmlvbiBmcF9tYW50MTI4ICpzcmMpCi17Ci0JdW5zaWduZWQgbG9uZyBkYXRhOwotCXVuc2lnbmVkIGludCByZXMsIG9mZjsKLQotCWlmICgoZGF0YSA9IHNyYy0+bTMyWzBdKSkKLQkJb2ZmID0gMDsKLQllbHNlIGlmICgoZGF0YSA9IHNyYy0+bTMyWzFdKSkKLQkJb2ZmID0gMzI7Ci0JZWxzZSBpZiAoKGRhdGEgPSBzcmMtPm0zMlsyXSkpCi0JCW9mZiA9IDY0OwotCWVsc2UgaWYgKChkYXRhID0gc3JjLT5tMzJbM10pKQotCQlvZmYgPSA5NjsKLQllbHNlCi0JCXJldHVybiAxMjg7Ci0KLQlhc20gKCJiZmZmbyAlMXsjMCwjMzJ9LCUwIiA6ICI9ZCIgKHJlcykgOiAiZG0iIChkYXRhKSk7Ci0JcmV0dXJuIHJlcyArIG9mZjsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGZwX3NoaWZ0bWFudDEyOCh1bmlvbiBmcF9tYW50MTI4ICpzcmMsIGludCBzaGlmdCkKLXsKLQl1bnNpZ25lZCBsb25nIHN0aWNreTsKLQotCXN3aXRjaCAoc2hpZnQpIHsKLQljYXNlIDA6Ci0JCXJldHVybjsKLQljYXNlIDE6Ci0JCWFzbSB2b2xhdGlsZSAoImxzbC5sICMxLCUwIgotCQkJOiAiPWQiIChzcmMtPm0zMlszXSkgOiAiMCIgKHNyYy0+bTMyWzNdKSk7Ci0JCWFzbSB2b2xhdGlsZSAoInJveGwubCAjMSwlMCIKLQkJCTogIj1kIiAoc3JjLT5tMzJbMl0pIDogIjAiIChzcmMtPm0zMlsyXSkpOwotCQlhc20gdm9sYXRpbGUgKCJyb3hsLmwgIzEsJTAiCi0JCQk6ICI9ZCIgKHNyYy0+bTMyWzFdKSA6ICIwIiAoc3JjLT5tMzJbMV0pKTsKLQkJYXNtIHZvbGF0aWxlICgicm94bC5sICMxLCUwIgotCQkJOiAiPWQiIChzcmMtPm0zMlswXSkgOiAiMCIgKHNyYy0+bTMyWzBdKSk7Ci0JCXJldHVybjsKLQljYXNlIDIgLi4uIDMxOgotCQlzcmMtPm0zMlswXSA9IChzcmMtPm0zMlswXSA8PCBzaGlmdCkgfCAoc3JjLT5tMzJbMV0gPj4gKDMyIC0gc2hpZnQpKTsKLQkJc3JjLT5tMzJbMV0gPSAoc3JjLT5tMzJbMV0gPDwgc2hpZnQpIHwgKHNyYy0+bTMyWzJdID4+ICgzMiAtIHNoaWZ0KSk7Ci0JCXNyYy0+bTMyWzJdID0gKHNyYy0+bTMyWzJdIDw8IHNoaWZ0KSB8IChzcmMtPm0zMlszXSA+PiAoMzIgLSBzaGlmdCkpOwotCQlzcmMtPm0zMlszXSA9IChzcmMtPm0zMlszXSA8PCBzaGlmdCk7Ci0JCXJldHVybjsKLQljYXNlIDMyIC4uLiA2MzoKLQkJc2hpZnQgLT0gMzI7Ci0JCXNyYy0+bTMyWzBdID0gKHNyYy0+bTMyWzFdIDw8IHNoaWZ0KSB8IChzcmMtPm0zMlsyXSA+PiAoMzIgLSBzaGlmdCkpOwotCQlzcmMtPm0zMlsxXSA9IChzcmMtPm0zMlsyXSA8PCBzaGlmdCkgfCAoc3JjLT5tMzJbM10gPj4gKDMyIC0gc2hpZnQpKTsKLQkJc3JjLT5tMzJbMl0gPSAoc3JjLT5tMzJbM10gPDwgc2hpZnQpOwotCQlzcmMtPm0zMlszXSA9IDA7Ci0JCXJldHVybjsKLQljYXNlIDY0IC4uLiA5NToKLQkJc2hpZnQgLT0gNjQ7Ci0JCXNyYy0+bTMyWzBdID0gKHNyYy0+bTMyWzJdIDw8IHNoaWZ0KSB8IChzcmMtPm0zMlszXSA+PiAoMzIgLSBzaGlmdCkpOwotCQlzcmMtPm0zMlsxXSA9IChzcmMtPm0zMlszXSA8PCBzaGlmdCk7Ci0JCXNyYy0+bTMyWzJdID0gc3JjLT5tMzJbM10gPSAwOwotCQlyZXR1cm47Ci0JY2FzZSA5NiAuLi4gMTI3OgotCQlzaGlmdCAtPSA5NjsKLQkJc3JjLT5tMzJbMF0gPSAoc3JjLT5tMzJbM10gPDwgc2hpZnQpOwotCQlzcmMtPm0zMlsxXSA9IHNyYy0+bTMyWzJdID0gc3JjLT5tMzJbM10gPSAwOwotCQlyZXR1cm47Ci0JY2FzZSAtMzEgLi4uIC0xOgotCQlzaGlmdCA9IC1zaGlmdDsKLQkJc3RpY2t5ID0gMDsKLQkJaWYgKHNyYy0+bTMyWzNdIDw8ICgzMiAtIHNoaWZ0KSkKLQkJCXN0aWNreSA9IDE7Ci0JCXNyYy0+bTMyWzNdID0gKHNyYy0+bTMyWzNdID4+IHNoaWZ0KSB8IChzcmMtPm0zMlsyXSA8PCAoMzIgLSBzaGlmdCkpIHwgc3RpY2t5OwotCQlzcmMtPm0zMlsyXSA9IChzcmMtPm0zMlsyXSA+PiBzaGlmdCkgfCAoc3JjLT5tMzJbMV0gPDwgKDMyIC0gc2hpZnQpKTsKLQkJc3JjLT5tMzJbMV0gPSAoc3JjLT5tMzJbMV0gPj4gc2hpZnQpIHwgKHNyYy0+bTMyWzBdIDw8ICgzMiAtIHNoaWZ0KSk7Ci0JCXNyYy0+bTMyWzBdID0gKHNyYy0+bTMyWzBdID4+IHNoaWZ0KTsKLQkJcmV0dXJuOwotCWNhc2UgLTYzIC4uLiAtMzI6Ci0JCXNoaWZ0ID0gLXNoaWZ0IC0gMzI7Ci0JCXN0aWNreSA9IDA7Ci0JCWlmICgoc3JjLT5tMzJbMl0gPDwgKDMyIC0gc2hpZnQpKSB8fCBzcmMtPm0zMlszXSkKLQkJCXN0aWNreSA9IDE7Ci0JCXNyYy0+bTMyWzNdID0gKHNyYy0+bTMyWzJdID4+IHNoaWZ0KSB8IChzcmMtPm0zMlsxXSA8PCAoMzIgLSBzaGlmdCkpIHwgc3RpY2t5OwotCQlzcmMtPm0zMlsyXSA9IChzcmMtPm0zMlsxXSA+PiBzaGlmdCkgfCAoc3JjLT5tMzJbMF0gPDwgKDMyIC0gc2hpZnQpKTsKLQkJc3JjLT5tMzJbMV0gPSAoc3JjLT5tMzJbMF0gPj4gc2hpZnQpOwotCQlzcmMtPm0zMlswXSA9IDA7Ci0JCXJldHVybjsKLQljYXNlIC05NSAuLi4gLTY0OgotCQlzaGlmdCA9IC1zaGlmdCAtIDY0OwotCQlzdGlja3kgPSAwOwotCQlpZiAoKHNyYy0+bTMyWzFdIDw8ICgzMiAtIHNoaWZ0KSkgfHwgc3JjLT5tMzJbMl0gfHwgc3JjLT5tMzJbM10pCi0JCQlzdGlja3kgPSAxOwotCQlzcmMtPm0zMlszXSA9IChzcmMtPm0zMlsxXSA+PiBzaGlmdCkgfCAoc3JjLT5tMzJbMF0gPDwgKDMyIC0gc2hpZnQpKSB8IHN0aWNreTsKLQkJc3JjLT5tMzJbMl0gPSAoc3JjLT5tMzJbMF0gPj4gc2hpZnQpOwotCQlzcmMtPm0zMlsxXSA9IHNyYy0+bTMyWzBdID0gMDsKLQkJcmV0dXJuOwotCWNhc2UgLTEyNyAuLi4gLTk2OgotCQlzaGlmdCA9IC1zaGlmdCAtIDk2OwotCQlzdGlja3kgPSAwOwotCQlpZiAoKHNyYy0+bTMyWzBdIDw8ICgzMiAtIHNoaWZ0KSkgfHwgc3JjLT5tMzJbMV0gfHwgc3JjLT5tMzJbMl0gfHwgc3JjLT5tMzJbM10pCi0JCQlzdGlja3kgPSAxOwotCQlzcmMtPm0zMlszXSA9IChzcmMtPm0zMlswXSA+PiBzaGlmdCkgfCBzdGlja3k7Ci0JCXNyYy0+bTMyWzJdID0gc3JjLT5tMzJbMV0gPSBzcmMtPm0zMlswXSA9IDA7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoc2hpZnQgPCAwICYmIChzcmMtPm0zMlswXSB8fCBzcmMtPm0zMlsxXSB8fCBzcmMtPm0zMlsyXSB8fCBzcmMtPm0zMlszXSkpCi0JCXNyYy0+bTMyWzNdID0gMTsKLQllbHNlCi0JCXNyYy0+bTMyWzNdID0gMDsKLQlzcmMtPm0zMlsyXSA9IDA7Ci0Jc3JjLT5tMzJbMV0gPSAwOwotCXNyYy0+bTMyWzBdID0gMDsKLX0KLSNlbmRpZgotCiBzdGF0aWMgaW5saW5lIHZvaWQgZnBfcHV0bWFudDEyOChzdHJ1Y3QgZnBfZXh0ICpkZXN0LCB1bmlvbiBmcF9tYW50MTI4ICpzcmMsCiAJCQkJIGludCBzaGlmdCkKIHsKQEAgLTYzNywxODMgKzI4Niw0IEBACiAJfQogfQogCi0jaWYgMCAvKiBvbGQgY29kZS4uLiAqLwotc3RhdGljIGlubGluZSBpbnQgZmxzKHVuc2lnbmVkIGludCBhKQotewotCWludCByOwotCi0JYXNtIHZvbGF0aWxlICgiYmZmZm8gJTF7IzAsIzMyfSwlMCIKLQkJICAgICAgOiAiPWQiIChyKSA6ICJtZCIgKGEpKTsKLQlyZXR1cm4gcjsKLX0KLQotLyogZmxzID0gImZpbmQgbGFzdCBzZXQiIChjZi4gZmZzKDMpKSAqLwotc3RhdGljIGlubGluZSBpbnQgZmxzMTI4KGNvbnN0IGludDEyOCBhKQotewotCWlmIChhW01TVzEyOF0pCi0JCXJldHVybiBmbHMoYVtNU1cxMjhdKTsKLQlpZiAoYVtOTVNXMTI4XSkKLQkJcmV0dXJuIGZscyhhW05NU1cxMjhdKSArIDMyOwotCS8qIFhYWDogaXQgcHJvYmFibHkgbmV2ZXIgZ2V0cyBiZXlvbmQgdGhpcyBwb2ludCBpbiBhY3R1YWwKLQkgICB1c2UsIGJ1dCB0aGF0J3MgaW5kaWNhdGl2ZSBvZiBhIG1vcmUgZ2VuZXJhbCBwcm9ibGVtIGluIHRoZQotCSAgIGFsZ29yaXRobSAoaS5lLiBhcyBwZXIgdGhlIGFjdHVhbCA2ODg4MSBpbXBsZW1lbnRhdGlvbiwgd2UKLQkgICByZWFsbHkgb25seSBuZWVkIGF0IG1vc3QgNjcgYml0cyBvZiBwcmVjaXNpb24gW3BsdXMKLQkgICBvdmVyZmxvd10pIHNvIEknbSBub3QgZ29pbmcgdG8gZml4IGl0LiAqLwotCWlmIChhW05MU1cxMjhdKQotCQlyZXR1cm4gZmxzKGFbTkxTVzEyOF0pICsgNjQ7Ci0JaWYgKGFbTFNXMTI4XSkKLQkJcmV0dXJuIGZscyhhW0xTVzEyOF0pICsgOTY7Ci0JZWxzZQotCQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHplcm9wMTI4KGNvbnN0IGludDEyOCBhKQotewotCXJldHVybiAhKGFbTFNXMTI4XSB8IGFbTkxTVzEyOF0gfCBhW05NU1cxMjhdIHwgYVtNU1cxMjhdKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgbm9uemVyb3AxMjgoY29uc3QgaW50MTI4IGEpCi17Ci0JcmV0dXJuIChhW0xTVzEyOF0gfCBhW05MU1cxMjhdIHwgYVtOTVNXMTI4XSB8IGFbTVNXMTI4XSk7Ci19Ci0KLS8qIEFkZGl0aW9uIGFuZCBzdWJ0cmFjdGlvbiAqLwotLyogRG8gdGhlc2UgaW4gInB1cmUiIGFzc2VtYmx5LCBiZWNhdXNlICJleHRlbmRlZCIgYXNtIGlzIHVubWFuYWdlYWJsZQotICAgaGVyZSAqLwotc3RhdGljIGlubGluZSB2b2lkIGFkZDEyOChjb25zdCBpbnQxMjggYSwgaW50MTI4IGIpCi17Ci0JLyogcm90YXRpbmcgY2FycnkgZmxhZ3MgKi8KLQl1bnNpZ25lZCBpbnQgY2FycnlbMl07Ci0KLQljYXJyeVswXSA9IGFbTFNXMTI4XSA+ICgweGZmZmZmZmZmIC0gYltMU1cxMjhdKTsKLQliW0xTVzEyOF0gKz0gYVtMU1cxMjhdOwotCi0JY2FycnlbMV0gPSBhW05MU1cxMjhdID4gKDB4ZmZmZmZmZmYgLSBiW05MU1cxMjhdIC0gY2FycnlbMF0pOwotCWJbTkxTVzEyOF0gPSBhW05MU1cxMjhdICsgYltOTFNXMTI4XSArIGNhcnJ5WzBdOwotCi0JY2FycnlbMF0gPSBhW05NU1cxMjhdID4gKDB4ZmZmZmZmZmYgLSBiW05NU1cxMjhdIC0gY2FycnlbMV0pOwotCWJbTk1TVzEyOF0gPSBhW05NU1cxMjhdICsgYltOTVNXMTI4XSArIGNhcnJ5WzFdOwotCi0JYltNU1cxMjhdID0gYVtNU1cxMjhdICsgYltNU1cxMjhdICsgY2FycnlbMF07Ci19Ci0KLS8qIE5vdGU6IGFzc2VtYmxlciBzZW1hbnRpY3M6ICJiIC09IGEiICovCi1zdGF0aWMgaW5saW5lIHZvaWQgc3ViMTI4KGNvbnN0IGludDEyOCBhLCBpbnQxMjggYikKLXsKLQkvKiByb3RhdGluZyBib3Jyb3cgZmxhZ3MgKi8KLQl1bnNpZ25lZCBpbnQgYm9ycm93WzJdOwotCi0JYm9ycm93WzBdID0gYltMU1cxMjhdIDwgYVtMU1cxMjhdOwotCWJbTFNXMTI4XSAtPSBhW0xTVzEyOF07Ci0KLQlib3Jyb3dbMV0gPSBiW05MU1cxMjhdIDwgYVtOTFNXMTI4XSArIGJvcnJvd1swXTsKLQliW05MU1cxMjhdID0gYltOTFNXMTI4XSAtIGFbTkxTVzEyOF0gLSBib3Jyb3dbMF07Ci0KLQlib3Jyb3dbMF0gPSBiW05NU1cxMjhdIDwgYVtOTVNXMTI4XSArIGJvcnJvd1sxXTsKLQliW05NU1cxMjhdID0gYltOTVNXMTI4XSAtIGFbTk1TVzEyOF0gLSBib3Jyb3dbMV07Ci0KLQliW01TVzEyOF0gPSBiW01TVzEyOF0gLSBhW01TVzEyOF0gLSBib3Jyb3dbMF07Ci19Ci0KLS8qIFBvb3IgbWFuJ3MgNjQtYml0IGV4cGFuZGluZyBtdWx0aXBseSAqLwotc3RhdGljIGlubGluZSB2b2lkIG11bDY0KHVuc2lnbmVkIGxvbmcgbG9uZyBhLCB1bnNpZ25lZCBsb25nIGxvbmcgYiwgaW50MTI4IGMpCi17Ci0JdW5zaWduZWQgbG9uZyBsb25nIGFjYzsKLQlpbnQxMjggYWNjMTI4OwotCi0JemVybzEyOChhY2MxMjgpOwotCXplcm8xMjgoYyk7Ci0KLQkvKiBmaXJzdCB0aGUgbG93IHdvcmRzICovCi0JaWYgKExPX1dPUkQoYSkgJiYgTE9fV09SRChiKSkgewotCQlhY2MgPSAobG9uZyBsb25nKSBMT19XT1JEKGEpICogTE9fV09SRChiKTsKLQkJY1tOTFNXMTI4XSA9IEhJX1dPUkQoYWNjKTsKLQkJY1tMU1cxMjhdID0gTE9fV09SRChhY2MpOwotCX0KLQkvKiBOZXh0IHRoZSBoaWdoIHdvcmRzICovCi0JaWYgKEhJX1dPUkQoYSkgJiYgSElfV09SRChiKSkgewotCQlhY2MgPSAobG9uZyBsb25nKSBISV9XT1JEKGEpICogSElfV09SRChiKTsKLQkJY1tNU1cxMjhdID0gSElfV09SRChhY2MpOwotCQljW05NU1cxMjhdID0gTE9fV09SRChhY2MpOwotCX0KLQkvKiBUaGUgbWlkZGxlIHdvcmRzICovCi0JaWYgKExPX1dPUkQoYSkgJiYgSElfV09SRChiKSkgewotCQlhY2MgPSAobG9uZyBsb25nKSBMT19XT1JEKGEpICogSElfV09SRChiKTsKLQkJYWNjMTI4W05NU1cxMjhdID0gSElfV09SRChhY2MpOwotCQlhY2MxMjhbTkxTVzEyOF0gPSBMT19XT1JEKGFjYyk7Ci0JCWFkZDEyOChhY2MxMjgsIGMpOwotCX0KLQkvKiBUaGUgZmlyc3QgYW5kIGxhc3Qgd29yZHMgKi8KLQlpZiAoSElfV09SRChhKSAmJiBMT19XT1JEKGIpKSB7Ci0JCWFjYyA9IChsb25nIGxvbmcpIEhJX1dPUkQoYSkgKiBMT19XT1JEKGIpOwotCQlhY2MxMjhbTk1TVzEyOF0gPSBISV9XT1JEKGFjYyk7Ci0JCWFjYzEyOFtOTFNXMTI4XSA9IExPX1dPUkQoYWNjKTsKLQkJYWRkMTI4KGFjYzEyOCwgYyk7Ci0JfQotfQotCi0vKiBOb3RlOiB1bnNpZ25lZCAqLwotc3RhdGljIGlubGluZSBpbnQgY21wMTI4KGludDEyOCBhLCBpbnQxMjggYikKLXsKLQlpZiAoYVtNU1cxMjhdIDwgYltNU1cxMjhdKQotCQlyZXR1cm4gLTE7Ci0JaWYgKGFbTVNXMTI4XSA+IGJbTVNXMTI4XSkKLQkJcmV0dXJuIDE7Ci0JaWYgKGFbTk1TVzEyOF0gPCBiW05NU1cxMjhdKQotCQlyZXR1cm4gLTE7Ci0JaWYgKGFbTk1TVzEyOF0gPiBiW05NU1cxMjhdKQotCQlyZXR1cm4gMTsKLQlpZiAoYVtOTFNXMTI4XSA8IGJbTkxTVzEyOF0pCi0JCXJldHVybiAtMTsKLQlpZiAoYVtOTFNXMTI4XSA+IGJbTkxTVzEyOF0pCi0JCXJldHVybiAxOwotCi0JcmV0dXJuIChzaWduZWQpIGFbTFNXMTI4XSAtIGJbTFNXMTI4XTsKLX0KLQotaW5saW5lIHZvaWQgZGl2MTI4KGludDEyOCBhLCBpbnQxMjggYiwgaW50MTI4IGMpCi17Ci0JaW50MTI4IG1hc2s7Ci0KLQkvKiBBbGdvcml0aG06Ci0KLQkgICBTaGlmdCB0aGUgZGl2aXNvciB1bnRpbCBpdCdzIGF0IGxlYXN0IGFzIGJpZyBhcyB0aGUKLQkgICBkaXZpZGVuZCwga2VlcGluZyB0cmFjayBvZiB0aGUgcG9zaXRpb24gdG8gd2hpY2ggd2UndmUKLQkgICBzaGlmdGVkIGl0LCBpLmUuIHRoZSBwb3dlciBvZiAyIHdoaWNoIHdlJ3ZlIG11bHRpcGxpZWQgaXQKLQkgICBieS4KLQotCSAgIFRoZW4sIGZvciB0aGlzIHBvd2VyIG9mIDIgKHRoZSBtYXNrKSwgYW5kIGV2ZXJ5IG9uZSBzbWFsbGVyCi0JICAgdGhhbiBpdCwgc3VidHJhY3QgdGhlIG1hc2sgZnJvbSB0aGUgZGl2aWRlbmQgYW5kIGFkZCBpdCB0bwotCSAgIHRoZSBxdW90aWVudCB1bnRpbCB0aGUgZGl2aWRlbmQgaXMgc21hbGxlciB0aGFuIHRoZSByYWlzZWQKLQkgICBkaXZpc29yLiAgQXQgdGhpcyBwb2ludCwgZGl2aWRlIHRoZSBkaXZpZGVuZCBhbmQgdGhlIG1hc2sKLQkgICBieSAyIChpLmUuIHNoaWZ0IG9uZSBwbGFjZSB0byB0aGUgcmlnaHQpLiAgTGF0aGVyLCByaW5zZSwKLQkgICBhbmQgcmVwZWF0LCB1bnRpbCB0aGVyZSBhcmUgbm8gbW9yZSBwb3dlcnMgb2YgMiBsZWZ0LiAqLwotCi0JLyogRklYTUU6IG5lZWRsZXNzIHRvIHNheSwgdGhlcmUncyByb29tIGZvciBpbXByb3ZlbWVudCBoZXJlIHRvby4gKi8KLQotCS8qIFNoaWZ0IHVwICovCi0JLyogWFhYOiBzaW5jZSBpdCBqdXN0IGhhcyB0byBiZSAiYXQgbGVhc3QgYXMgYmlnIiwgd2UgY2FuCi0JICAgcHJvYmFibHkgZWxpbWluYXRlIHRoaXMgaG9ycmlibHkgd2FzdGVmdWwgbG9vcC4gIEkgd2lsbAotCSAgIGhhdmUgdG8gcHJvdmUgdGhpcyBmaXJzdCwgdGhvdWdoICovCi0Jc2V0MTI4KDAsIDAsIDAsIDEsIG1hc2spOwotCXdoaWxlIChjbXAxMjgoYiwgYSkgPCAwICYmICFidHN0aGkxMjgoYikpIHsKLQkJbHNsb25lMTI4KGIpOwotCQlsc2xvbmUxMjgobWFzayk7Ci0JfQotCi0JLyogU2hpZnQgZG93biAqLwotCXplcm8xMjgoYyk7Ci0JZG8gewotCQlpZiAoY21wMTI4KGEsIGIpID49IDApIHsKLQkJCXN1YjEyOChiLCBhKTsKLQkJCWFkZDEyOChtYXNrLCBjKTsKLQkJfQotCQlsc3JvbmUxMjgobWFzayk7Ci0JCWxzcm9uZTEyOChiKTsKLQl9IHdoaWxlIChub256ZXJvcDEyOChtYXNrKSk7Ci0KLQkvKiBUaGUgcmVtYWluZGVyIGlzIGluIGEuLi4gKi8KLX0KLSNlbmRpZgotCiAjZW5kaWYJLyogTVVMVElfQVJJVEhfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21tL2luaXRfbW0uYyBiL2FyY2gvbTY4ay9tbS9pbml0X21tLmMKaW5kZXggOTExM2MyZi4uYmJlNTI1NCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21tL2luaXRfbW0uYworKysgYi9hcmNoL202OGsvbW0vaW5pdF9tbS5jCkBAIC04MywxMSArODMsNiBAQAogCWludCBpbml0cGFnZXMgPSAwOwogCWludCBpOwogCi0jaWZkZWYgQ09ORklHX0FUQVJJCi0JaWYgKE1BQ0hfSVNfQVRBUkkpCi0JCWF0YXJpX3N0cmFtX21lbV9pbml0X2hvb2soKTsKLSNlbmRpZgotCiAJLyogdGhpcyB3aWxsIHB1dCBhbGwgbWVtb3J5IG9udG8gdGhlIGZyZWVsaXN0cyAqLwogCXRvdGFscmFtX3BhZ2VzID0gbnVtX3BoeXNwYWdlcyA9IDA7CiAJZm9yX2VhY2hfb25saW5lX3BnZGF0KHBnZGF0KSB7CmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9LY29uZmlnIGIvYXJjaC9wYXJpc2MvS2NvbmZpZwppbmRleCA2NWFkYzg2Li5lMDc3YjBiIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9LY29uZmlnCisrKyBiL2FyY2gvcGFyaXNjL0tjb25maWcKQEAgLTE1LDYgKzE1LDcgQEAKIAlzZWxlY3QgSEFWRV9HRU5FUklDX0hBUkRJUlFTCiAJc2VsZWN0IEdFTkVSSUNfSVJRX1BST0JFCiAJc2VsZWN0IElSUV9QRVJfQ1BVCisJc2VsZWN0IEFSQ0hfSEFWRV9OTUlfU0FGRV9DTVBYQ0hHCiAKIAloZWxwCiAJICBUaGUgUEEtUklTQyBtaWNyb3Byb2Nlc3NvciBpcyBkZXNpZ25lZCBieSBIZXdsZXR0LVBhY2thcmQgYW5kIHVzZWQKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2F0b21pYy5oIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vYXRvbWljLmgKaW5kZXggYjFkYzcxZi4uNDA1NGIzMSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vYXRvbWljLmgKKysrIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTI1OCwxMCArMjU4LDEwIEBACiAKICNkZWZpbmUgQVRPTUlDNjRfSU5JVChpKSAoKGF0b21pYzY0X3QpIHsgKGkpIH0pCiAKLXN0YXRpYyBfX2lubGluZV9fIGludAorc3RhdGljIF9faW5saW5lX18gczY0CiBfX2F0b21pYzY0X2FkZF9yZXR1cm4oczY0IGksIGF0b21pYzY0X3QgKnYpCiB7Ci0JaW50IHJldDsKKwlzNjQgcmV0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJX2F0b21pY19zcGluX2xvY2tfaXJxc2F2ZSh2LCBmbGFncyk7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2Z1dGV4LmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9mdXRleC5oCmluZGV4IDY3YTMzY2MuLjIzODhiZGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcGFyaXNjL2luY2x1ZGUvYXNtL2Z1dGV4LmgKKysrIGIvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vZnV0ZXguaApAQCAtNSwxMSArNSwxNCBAQAogCiAjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS9lcnJuby5oPgogCiBzdGF0aWMgaW5saW5lIGludAogZnV0ZXhfYXRvbWljX29wX2ludXNlciAoaW50IGVuY29kZWRfb3AsIHUzMiBfX3VzZXIgKnVhZGRyKQogeworCXVuc2lnbmVkIGxvbmcgaW50IGZsYWdzOworCXUzMiB2YWw7CiAJaW50IG9wID0gKGVuY29kZWRfb3AgPj4gMjgpICYgNzsKIAlpbnQgY21wID0gKGVuY29kZWRfb3AgPj4gMjQpICYgMTU7CiAJaW50IG9wYXJnID0gKGVuY29kZWRfb3AgPDwgOCkgPj4gMjA7CkBAIC0xOCwyMSArMjEsNTggQEAKIAlpZiAoZW5jb2RlZF9vcCAmIChGVVRFWF9PUF9PUEFSR19TSElGVCA8PCAyOCkpCiAJCW9wYXJnID0gMSA8PCBvcGFyZzsKIAotCWlmICghIGFjY2Vzc19vayAoVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKHUzMikpKQorCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgdWFkZHIsIHNpemVvZigqdWFkZHIpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlwYWdlZmF1bHRfZGlzYWJsZSgpOwogCisJX2F0b21pY19zcGluX2xvY2tfaXJxc2F2ZSh1YWRkciwgZmxhZ3MpOworCiAJc3dpdGNoIChvcCkgewogCWNhc2UgRlVURVhfT1BfU0VUOgorCQkvKiAqKGludCAqKVVBRERSMiA9IE9QQVJHOyAqLworCQlyZXQgPSBnZXRfdXNlcihvbGR2YWwsIHVhZGRyKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBwdXRfdXNlcihvcGFyZywgdWFkZHIpOworCQlicmVhazsKIAljYXNlIEZVVEVYX09QX0FERDoKKwkJLyogKihpbnQgKilVQUREUjIgKz0gT1BBUkc7ICovCisJCXJldCA9IGdldF91c2VyKG9sZHZhbCwgdWFkZHIpOworCQlpZiAoIXJldCkgeworCQkJdmFsID0gb2xkdmFsICsgb3Bhcmc7CisJCQlyZXQgPSBwdXRfdXNlcih2YWwsIHVhZGRyKTsKKwkJfQorCQlicmVhazsKIAljYXNlIEZVVEVYX09QX09SOgorCQkvKiAqKGludCAqKVVBRERSMiB8PSBPUEFSRzsgKi8KKwkJcmV0ID0gZ2V0X3VzZXIob2xkdmFsLCB1YWRkcik7CisJCWlmICghcmV0KSB7CisJCQl2YWwgPSBvbGR2YWwgfCBvcGFyZzsKKwkJCXJldCA9IHB1dF91c2VyKHZhbCwgdWFkZHIpOworCQl9CisJCWJyZWFrOwogCWNhc2UgRlVURVhfT1BfQU5ETjoKKwkJLyogKihpbnQgKilVQUREUjIgJj0gfk9QQVJHOyAqLworCQlyZXQgPSBnZXRfdXNlcihvbGR2YWwsIHVhZGRyKTsKKwkJaWYgKCFyZXQpIHsKKwkJCXZhbCA9IG9sZHZhbCAmIH5vcGFyZzsKKwkJCXJldCA9IHB1dF91c2VyKHZhbCwgdWFkZHIpOworCQl9CisJCWJyZWFrOwogCWNhc2UgRlVURVhfT1BfWE9SOgorCQkvKiAqKGludCAqKVVBRERSMiBePSBPUEFSRzsgKi8KKwkJcmV0ID0gZ2V0X3VzZXIob2xkdmFsLCB1YWRkcik7CisJCWlmICghcmV0KSB7CisJCQl2YWwgPSBvbGR2YWwgXiBvcGFyZzsKKwkJCXJldCA9IHB1dF91c2VyKHZhbCwgdWFkZHIpOworCQl9CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldCA9IC1FTk9TWVM7CiAJfQogCisJX2F0b21pY19zcGluX3VubG9ja19pcnFyZXN0b3JlKHVhZGRyLCBmbGFncyk7CisKIAlwYWdlZmF1bHRfZW5hYmxlKCk7CiAKIAlpZiAoIXJldCkgewpAQCAtNTQsNyArOTQsOSBAQAogZnV0ZXhfYXRvbWljX2NtcHhjaGdfaW5hdG9taWModTMyICp1dmFsLCB1MzIgX191c2VyICp1YWRkciwKIAkJCSAgICAgIHUzMiBvbGR2YWwsIHUzMiBuZXd2YWwpCiB7CisJaW50IHJldDsKIAl1MzIgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkvKiBmdXRleC5jIHdhbnRzIHRvIGRvIGEgY21weGNoZ19pbmF0b21pYyBvbiBrZXJuZWwgTlVMTCwgd2hpY2ggaXMKIAkgKiBvdXIgZ2F0ZXdheSBwYWdlLCBhbmQgY2F1c2VzIG5vIGVuZCBvZiB0cm91YmxlLi4uCkBAIC02NSwxMiArMTA3LDI0IEBACiAJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1YWRkciwgc2l6ZW9mKHUzMikpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWlmIChnZXRfdXNlcih2YWwsIHVhZGRyKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYgKHZhbCA9PSBvbGR2YWwgJiYgcHV0X3VzZXIobmV3dmFsLCB1YWRkcikpCi0JCXJldHVybiAtRUZBVUxUOworCS8qIEhQUEEgaGFzIG5vIGNtcHhjaGcgaW4gaGFyZHdhcmUgYW5kIHRoZXJlZm9yZSB0aGUKKwkgKiBiZXN0IHdlIGNhbiBkbyBoZXJlIGlzIHVzZSBhbiBhcnJheSBvZiBsb2Nrcy4gVGhlCisJICogbG9jayBzZWxlY3RlZCBpcyBiYXNlZCBvbiBhIGhhc2ggb2YgdGhlIHVzZXJzcGFjZQorCSAqIGFkZHJlc3MuIFRoaXMgc2hvdWxkIHNjYWxlIHRvIGEgY291cGxlIG9mIENQVXMuCisJICovCisKKwlfYXRvbWljX3NwaW5fbG9ja19pcnFzYXZlKHVhZGRyLCBmbGFncyk7CisKKwlyZXQgPSBnZXRfdXNlcih2YWwsIHVhZGRyKTsKKworCWlmICghcmV0ICYmIHZhbCA9PSBvbGR2YWwpCisJCXJldCA9IHB1dF91c2VyKG5ld3ZhbCwgdWFkZHIpOworCiAJKnV2YWwgPSB2YWw7Ci0JcmV0dXJuIDA7CisKKwlfYXRvbWljX3NwaW5fdW5sb2NrX2lycXJlc3RvcmUodWFkZHIsIGZsYWdzKTsKKworCXJldHVybiByZXQ7CiB9CiAKICNlbmRpZiAvKl9fS0VSTkVMX18qLwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vdW5pc3RkLmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS91bmlzdGQuaAppbmRleCAzMzkyZGUzLi5kNjFkZTY0IDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS91bmlzdGQuaAorKysgYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS91bmlzdGQuaApAQCAtODIxLDggKzgyMSw5IEBACiAjZGVmaW5lIF9fTlJfb3Blbl9ieV9oYW5kbGVfYXQJKF9fTlJfTGludXggKyAzMjYpCiAjZGVmaW5lIF9fTlJfc3luY2ZzCQkoX19OUl9MaW51eCArIDMyNykKICNkZWZpbmUgX19OUl9zZXRucwkJKF9fTlJfTGludXggKyAzMjgpCisjZGVmaW5lIF9fTlJfc2VuZG1tc2cJCShfX05SX0xpbnV4ICsgMzI5KQogCi0jZGVmaW5lIF9fTlJfTGludXhfc3lzY2FsbHMJKF9fTlJfc2V0bnMgKyAxKQorI2RlZmluZSBfX05SX0xpbnV4X3N5c2NhbGxzCShfX05SX3NlbmRtbXNnICsgMSkKIAogCiAjZGVmaW5lIF9fSUdOT1JFX3NlbGVjdAkJLyogbmV3c2VsZWN0ICovCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvc3lzY2FsbF90YWJsZS5TIGIvYXJjaC9wYXJpc2Mva2VybmVsL3N5c2NhbGxfdGFibGUuUwppbmRleCAzNGE0ZjVhLi5lNjYzNjZmIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9rZXJuZWwvc3lzY2FsbF90YWJsZS5TCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMKQEAgLTQyNyw2ICs0MjcsNyBAQAogCUVOVFJZX0NPTVAob3Blbl9ieV9oYW5kbGVfYXQpCiAJRU5UUllfU0FNRShzeW5jZnMpCiAJRU5UUllfU0FNRShzZXRucykKKwlFTlRSWV9DT01QKHNlbmRtbXNnKQogCiAJLyogTm90aGluZyB5ZXQgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvS2NvbmZpZwppbmRleCAzNzRjNDc1Li42OTI2YjYxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvS2NvbmZpZwpAQCAtMTM2LDYgKzEzNiw3IEBACiAJc2VsZWN0IEhBVkVfU1lTQ0FMTF9UUkFDRVBPSU5UUwogCXNlbGVjdCBIQVZFX0JQRl9KSVQgaWYgKFBQQzY0ICYmIE5FVCkKIAlzZWxlY3QgSEFWRV9BUkNIX0pVTVBfTEFCRUwKKwlzZWxlY3QgQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcKIAogY29uZmlnIEVBUkxZX1BSSU5USwogCWJvb2wKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9LY29uZmlnIGIvYXJjaC9zMzkwL0tjb25maWcKaW5kZXggYzAzZmVmNy4uZWQ1Y2I1YSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL0tjb25maWcKKysrIGIvYXJjaC9zMzkwL0tjb25maWcKQEAgLTgxLDYgKzgxLDcgQEAKIAlzZWxlY3QgSU5JVF9BTExfUE9TU0lCTEUKIAlzZWxlY3QgSEFWRV9JUlFfV09SSwogCXNlbGVjdCBIQVZFX1BFUkZfRVZFTlRTCisJc2VsZWN0IEFSQ0hfSEFWRV9OTUlfU0FGRV9DTVBYQ0hHCiAJc2VsZWN0IEhBVkVfS0VSTkVMX0daSVAKIAlzZWxlY3QgSEFWRV9LRVJORUxfQlpJUDIKIAlzZWxlY3QgSEFWRV9LRVJORUxfTFpNQQpAQCAtMjczLDExICsyNzQsMTEgQEAKIAkgIG9uIG9sZGVyIG1hY2hpbmVzLgogCiBjb25maWcgTUFSQ0hfWjE5NgotCWJvb2wgIklCTSB6RW50ZXJwcmlzZSAxOTYiCisJYm9vbCAiSUJNIHpFbnRlcnByaXNlIDExNCBhbmQgMTk2IgogCWhlbHAKLQkgIFNlbGVjdCB0aGlzIHRvIGVuYWJsZSBvcHRpbWl6YXRpb25zIGZvciBJQk0gekVudGVycHJpc2UgMTk2Ci0JICAoMjgxNyBzZXJpZXMpLiBUaGUga2VybmVsIHdpbGwgYmUgc2xpZ2h0bHkgZmFzdGVyIGJ1dCB3aWxsIG5vdCB3b3JrCi0JICBvbiBvbGRlciBtYWNoaW5lcy4KKwkgIFNlbGVjdCB0aGlzIHRvIGVuYWJsZSBvcHRpbWl6YXRpb25zIGZvciBJQk0gekVudGVycHJpc2UgMTE0IGFuZCAxOTYKKwkgICgyODE4IGFuZCAyODE3IHNlcmllcykuIFRoZSBrZXJuZWwgd2lsbCBiZSBzbGlnaHRseSBmYXN0ZXIgYnV0IHdpbGwKKwkgIG5vdCB3b3JrIG9uIG9sZGVyIG1hY2hpbmVzLgogCiBlbmRjaG9pY2UKIApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2lwbC5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2lwbC5oCmluZGV4IDVlOTVkOTUuLjk3Y2M0NDAgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9pcGwuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vaXBsLmgKQEAgLTE2Nyw1ICsxNjcsNiBAQAogfTsKIAogZXh0ZXJuIGludCBkaWFnMzA4KHVuc2lnbmVkIGxvbmcgc3ViY29kZSwgdm9pZCAqYWRkcik7CitleHRlcm4gdm9pZCBkaWFnMzA4X3Jlc2V0KHZvaWQpOwogCiAjZW5kaWYgLyogX0FTTV9TMzkwX0lQTF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbG93Y29yZS5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2xvd2NvcmUuaAppbmRleCBmMjYyODBkLi5lODVjOTExIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vbG93Y29yZS5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9sb3djb3JlLmgKQEAgLTE4LDYgKzE4LDcgQEAKIHZvaWQgcGdtX2NoZWNrX2hhbmRsZXIodm9pZCk7CiB2b2lkIG1jY2tfaW50X2hhbmRsZXIodm9pZCk7CiB2b2lkIGlvX2ludF9oYW5kbGVyKHZvaWQpOwordm9pZCBwc3dfcmVzdGFydF9pbnRfaGFuZGxlcih2b2lkKTsKIAogI2lmZGVmIENPTkZJR18zMkJJVAogCkBAIC0xNTAsNyArMTUxLDEwIEBACiAJICovCiAJX191MzIJaXBpYjsJCQkJLyogMHgwZTAwICovCiAJX191MzIJaXBpYl9jaGVja3N1bTsJCQkvKiAweDBlMDQgKi8KLQlfX3U4CXBhZF8weDBlMDhbMHgwZjAwLTB4MGUwOF07CS8qIDB4MGUwOCAqLworCisJLyogNjQgYml0IHNhdmUgYXJlYSAqLworCV9fdTY0CXNhdmVfYXJlYV82NDsJCQkvKiAweDBlMDggKi8KKwlfX3U4CXBhZF8weDBlMTBbMHgwZjAwLTB4MGUxMF07CS8qIDB4MGUxMCAqLwogCiAJLyogRXh0ZW5kZWQgZmFjaWxpdHkgbGlzdCAqLwogCV9fdTY0CXN0ZmxlX2ZhY19saXN0WzMyXTsJCS8qIDB4MGYwMCAqLwpAQCAtMjg2LDcgKzI5MCwxMCBAQAogCSAqLwogCV9fdTY0CWlwaWI7CQkJCS8qIDB4MGUwMCAqLwogCV9fdTMyCWlwaWJfY2hlY2tzdW07CQkJLyogMHgwZTA4ICovCi0JX191OAlwYWRfMHgwZTBjWzB4MGYwMC0weDBlMGNdOwkvKiAweDBlMGMgKi8KKworCS8qIDY0IGJpdCBzYXZlIGFyZWEgKi8KKwlfX3U2NAlzYXZlX2FyZWFfNjQ7CQkJLyogMHgwZTBjICovCisJX191OAlwYWRfMHgwZTE0WzB4MGYwMC0weDBlMTRdOwkvKiAweDBlMTQgKi8KIAogCS8qIEV4dGVuZGVkIGZhY2lsaXR5IGxpc3QgKi8KIAlfX3U2NAlzdGZsZV9mYWNfbGlzdFszMl07CQkvKiAweDBmMDAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAppbmRleCA1NWRmY2M4Li5hNGI2MjI5IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCkBAIC0xMTksMTQgKzExOSwxMiBAQAogICogRG8gbmVjZXNzYXJ5IHNldHVwIHRvIHN0YXJ0IHVwIGEgbmV3IHRocmVhZC4KICAqLwogI2RlZmluZSBzdGFydF90aHJlYWQocmVncywgbmV3X3BzdywgbmV3X3N0YWNrcCkgZG8gewkJXAotCXNldF9mcyhVU0VSX0RTKTsJCQkJCVwKIAlyZWdzLT5wc3cubWFzawk9IHBzd191c2VyX2JpdHM7CQkJXAogCXJlZ3MtPnBzdy5hZGRyCT0gbmV3X3BzdyB8IFBTV19BRERSX0FNT0RFOwkJXAogCXJlZ3MtPmdwcnNbMTVdCT0gbmV3X3N0YWNrcDsJCQkJXAogfSB3aGlsZSAoMCkKIAogI2RlZmluZSBzdGFydF90aHJlYWQzMShyZWdzLCBuZXdfcHN3LCBuZXdfc3RhY2twKSBkbyB7CQlcCi0Jc2V0X2ZzKFVTRVJfRFMpOwkJCQkJXAogCXJlZ3MtPnBzdy5tYXNrCT0gcHN3X3VzZXIzMl9iaXRzOwkJCVwKIAlyZWdzLT5wc3cuYWRkcgk9IG5ld19wc3cgfCBQU1dfQUREUl9BTU9ERTsJCVwKIAlyZWdzLT5ncHJzWzE1XQk9IG5ld19zdGFja3A7CQkJCVwKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zeXN0ZW0uaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zeXN0ZW0uaAppbmRleCBkMzgyNjI5Li42NTgyZjY5IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc3lzdGVtLmgKKysrIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3N5c3RlbS5oCkBAIC0xMTMsNiArMTEzLDcgQEAKIAogZXh0ZXJuIHZvaWQgY21tYV9pbml0KHZvaWQpOwogZXh0ZXJuIGludCBtZW1jcHlfcmVhbCh2b2lkICosIHZvaWQgKiwgc2l6ZV90KTsKK2V4dGVybiB2b2lkIGNvcHlfdG9fYWJzb2x1dGVfemVybyh2b2lkICpkZXN0LCB2b2lkICpzcmMsIHNpemVfdCBjb3VudCk7CiAKICNkZWZpbmUgZmluaXNoX2FyY2hfc3dpdGNoKHByZXYpIGRvIHsJCQkJCSAgICAgXAogCXNldF9mcyhjdXJyZW50LT50aHJlYWQubW1fc2VnbWVudCk7CQkJCSAgICAgXApkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9zMzkwL2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IDA1ZDhmMzguLjUzMmZkNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL3MzOTAva2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTI3LDEyICsyNyw5IEBACiAJQkxBTksoKTsKIAlERUZJTkUoX19UQVNLX3BpZCwgb2Zmc2V0b2Yoc3RydWN0IHRhc2tfc3RydWN0LCBwaWQpKTsKIAlCTEFOSygpOwotCURFRklORShfX1RIUkVBRF9wZXJfY2F1c2UsCi0JICAgICAgIG9mZnNldG9mKHN0cnVjdCB0YXNrX3N0cnVjdCwgdGhyZWFkLnBlcl9ldmVudC5jYXVzZSkpOwotCURFRklORShfX1RIUkVBRF9wZXJfYWRkcmVzcywKLQkgICAgICAgb2Zmc2V0b2Yoc3RydWN0IHRhc2tfc3RydWN0LCB0aHJlYWQucGVyX2V2ZW50LmFkZHJlc3MpKTsKLQlERUZJTkUoX19USFJFQURfcGVyX3BhaWQsCi0JICAgICAgIG9mZnNldG9mKHN0cnVjdCB0YXNrX3N0cnVjdCwgdGhyZWFkLnBlcl9ldmVudC5wYWlkKSk7CisJREVGSU5FKF9fVEhSRUFEX3Blcl9jYXVzZSwgb2Zmc2V0b2Yoc3RydWN0IHRhc2tfc3RydWN0LCB0aHJlYWQucGVyX2V2ZW50LmNhdXNlKSk7CisJREVGSU5FKF9fVEhSRUFEX3Blcl9hZGRyZXNzLCBvZmZzZXRvZihzdHJ1Y3QgdGFza19zdHJ1Y3QsIHRocmVhZC5wZXJfZXZlbnQuYWRkcmVzcykpOworCURFRklORShfX1RIUkVBRF9wZXJfcGFpZCwgb2Zmc2V0b2Yoc3RydWN0IHRhc2tfc3RydWN0LCB0aHJlYWQucGVyX2V2ZW50LnBhaWQpKTsKIAlCTEFOSygpOwogCURFRklORShfX1RJX3Rhc2ssIG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfaW5mbywgdGFzaykpOwogCURFRklORShfX1RJX2RvbWFpbiwgb2Zmc2V0b2Yoc3RydWN0IHRocmVhZF9pbmZvLCBleGVjX2RvbWFpbikpOwpAQCAtMTQyLDYgKzEzOSw3IEBACiAJREVGSU5FKF9fTENfRlBSRUdTX1NBVkVfQVJFQSwgb2Zmc2V0b2Yoc3RydWN0IF9sb3djb3JlLCBmbG9hdGluZ19wdF9zYXZlX2FyZWEpKTsKIAlERUZJTkUoX19MQ19HUFJFR1NfU0FWRV9BUkVBLCBvZmZzZXRvZihzdHJ1Y3QgX2xvd2NvcmUsIGdwcmVnc19zYXZlX2FyZWEpKTsKIAlERUZJTkUoX19MQ19DUkVHU19TQVZFX0FSRUEsIG9mZnNldG9mKHN0cnVjdCBfbG93Y29yZSwgY3JlZ3Nfc2F2ZV9hcmVhKSk7CisJREVGSU5FKF9fTENfU0FWRV9BUkVBXzY0LCBvZmZzZXRvZihzdHJ1Y3QgX2xvd2NvcmUsIHNhdmVfYXJlYV82NCkpOwogI2lmZGVmIENPTkZJR18zMkJJVAogCURFRklORShTQVZFX0FSRUFfQkFTRSwgb2Zmc2V0b2Yoc3RydWN0IF9sb3djb3JlLCBleHRlbmRlZF9zYXZlX2FyZWFfYWRkcikpOwogI2Vsc2UgLyogQ09ORklHXzMyQklUICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2Jhc2UuUyBiL2FyY2gvczM5MC9rZXJuZWwvYmFzZS5TCmluZGV4IDIwOTkzOGMuLjI1NTQzNTYgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvYmFzZS5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvYmFzZS5TCkBAIC03Niw2ICs3Niw0MiBAQAogCS5xdWFkCTAKIAkucHJldmlvdXMKIAorIworIyBDYWxscyBkaWFnIDMwOCBzdWJjb2RlIDEgYW5kIGNvbnRpbnVlcyBleGVjdXRpb24KKyMKKyMgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zIG11c3QgYmUgZW5zdXJlZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uOgorIyAqIFByZWZpeCByZWdpc3RlciA9IDAKKyMgKiBMb3djb3JlIHByb3RlY3Rpb24gaXMgZGlzYWJsZWQKKyMKK0VOVFJZKGRpYWczMDhfcmVzZXQpCisJbGFybAklcjQsLkxjdGxyZWdzCQkjIFNhdmUgY29udHJvbCByZWdpc3RlcnMKKwlzdGN0ZwklYzAsJWMxNSwwKCVyNCkKKwlsYXJsCSVyNCwuTHJlc3RhcnRfcHN3CSMgU2V0dXAgcmVzdGFydCBQU1cgYXQgYWJzb2x1dGUgMAorCWxnaGkJJXIzLDAKKwlsZwklcjQsMCglcjQpCQkjIFNhdmUgUFNXCisJc3R1cmcJJXI0LCVyMwkJCSMgVXNlIHN0dXJnLCBiZWNhdXNlIG9mIGxhcmdlIHBhZ2VzCisJbGdoaQklcjEsMQorCWRpYWcJJXIxLCVyMSwweDMwOAorLkxyZXN0YXJ0X3BhcnQyOgorCWxoaQklcjAsMAkJCSMgTG9hZCByMCB3aXRoIHplcm8KKwlsaGkJJXIxLDIJCQkjIFVzZSBtb2RlIDIgPSBFU0FNRSAoZHVtcCkKKwlzaWdwCSVyMSwlcjAsMHgxMgkJIyBTd2l0Y2ggdG8gRVNBTUUgbW9kZQorCXNhbTY0CQkJCSMgU3dpdGNoIHRvIDY0IGJpdCBhZGRyZXNzaW5nIG1vZGUKKwlsYXJsCSVyNCwuTGN0bHJlZ3MJCSMgUmVzdG9yZSBjb250cm9sIHJlZ2lzdGVycworCWxjdGxnCSVjMCwlYzE1LDAoJXI0KQorCWJyCSVyMTQKKy5hbGlnbiAxNgorLkxyZXN0YXJ0X3BzdzoKKwkubG9uZwkweDAwMDgwMDAwLDB4ODAwMDAwMDAgKyAuTHJlc3RhcnRfcGFydDIKKworCS5zZWN0aW9uIC5ic3MKKy5hbGlnbiA4CisuTGN0bHJlZ3M6CisJLnJlcHQJMTYKKwkucXVhZAkwCisJLmVuZHIKKwkucHJldmlvdXMKKwogI2Vsc2UgLyogQ09ORklHXzY0QklUICovCiAKIEVOVFJZKHMzOTBfYmFzZV9tY2NrX2hhbmRsZXIpCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL2NvbXBhdF9zaWduYWwuYyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3NpZ25hbC5jCmluZGV4IGVlZTk5OTguLmE5YTI4NWIgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3NpZ25hbC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvY29tcGF0X3NpZ25hbC5jCkBAIC0zODAsMjAgKzM4MCwxMyBAQAogCQlnb3RvIGJhZGZyYW1lOwogCWlmIChfX2NvcHlfZnJvbV91c2VyKCZzZXQuc2lnLCAmZnJhbWUtPnNjLm9sZG1hc2ssIF9TSUdNQVNLX0NPUFlfU0laRTMyKSkKIAkJZ290byBiYWRmcmFtZTsKLQogCXNpZ2RlbHNldG1hc2soJnNldCwgfl9CTE9DS0FCTEUpOwotCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCWN1cnJlbnQtPmJsb2NrZWQgPSBzZXQ7Ci0JcmVjYWxjX3NpZ3BlbmRpbmcoKTsKLQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCisJc2V0X2N1cnJlbnRfYmxvY2tlZCgmc2V0KTsKIAlpZiAocmVzdG9yZV9zaWdyZWdzMzIocmVncywgJmZyYW1lLT5zcmVncykpCiAJCWdvdG8gYmFkZnJhbWU7CiAJaWYgKHJlc3RvcmVfc2lncmVnc19ncHJzX2hpZ2gocmVncywgZnJhbWUtPmdwcnNfaGlnaCkpCiAJCWdvdG8gYmFkZnJhbWU7Ci0KIAlyZXR1cm4gcmVncy0+Z3Byc1syXTsKLQogYmFkZnJhbWU6CiAJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOwogCXJldHVybiAwOwpAQCAtNDEzLDMxICs0MDYsMjIgQEAKIAkJZ290byBiYWRmcmFtZTsKIAlpZiAoX19jb3B5X2Zyb21fdXNlcigmc2V0LCAmZnJhbWUtPnVjLnVjX3NpZ21hc2ssIHNpemVvZihzZXQpKSkKIAkJZ290byBiYWRmcmFtZTsKLQogCXNpZ2RlbHNldG1hc2soJnNldCwgfl9CTE9DS0FCTEUpOwotCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCWN1cnJlbnQtPmJsb2NrZWQgPSBzZXQ7Ci0JcmVjYWxjX3NpZ3BlbmRpbmcoKTsKLQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCisJc2V0X2N1cnJlbnRfYmxvY2tlZCgmc2V0KTsKIAlpZiAocmVzdG9yZV9zaWdyZWdzMzIocmVncywgJmZyYW1lLT51Yy51Y19tY29udGV4dCkpCiAJCWdvdG8gYmFkZnJhbWU7CiAJaWYgKHJlc3RvcmVfc2lncmVnc19ncHJzX2hpZ2gocmVncywgZnJhbWUtPmdwcnNfaGlnaCkpCiAJCWdvdG8gYmFkZnJhbWU7Ci0KIAllcnIgPSBfX2dldF91c2VyKHNzX3NwLCAmZnJhbWUtPnVjLnVjX3N0YWNrLnNzX3NwKTsKIAlzdC5zc19zcCA9IGNvbXBhdF9wdHIoc3Nfc3ApOwogCWVyciB8PSBfX2dldF91c2VyKHN0LnNzX3NpemUsICZmcmFtZS0+dWMudWNfc3RhY2suc3Nfc2l6ZSk7CiAJZXJyIHw9IF9fZ2V0X3VzZXIoc3Quc3NfZmxhZ3MsICZmcmFtZS0+dWMudWNfc3RhY2suc3NfZmxhZ3MpOwogCWlmIChlcnIpCiAJCWdvdG8gYmFkZnJhbWU7IAotCiAJc2V0X2ZzIChLRVJORUxfRFMpOwogCWRvX3NpZ2FsdHN0YWNrKChzdGFja190IF9fZm9yY2UgX191c2VyICopJnN0LCBOVUxMLCByZWdzLT5ncHJzWzE1XSk7CiAJc2V0X2ZzIChvbGRfZnMpOwotCiAJcmV0dXJuIHJlZ3MtPmdwcnNbMl07Ci0KIGJhZGZyYW1lOgogCWZvcmNlX3NpZyhTSUdTRUdWLCBjdXJyZW50KTsKIAlyZXR1cm4gMDsKQEAgLTYwNSwxMCArNTg5LDEwIEBACiAgKiBPSywgd2UncmUgaW52b2tpbmcgYSBoYW5kbGVyCiAgKi8JCiAKLWludAotaGFuZGxlX3NpZ25hbDMyKHVuc2lnbmVkIGxvbmcgc2lnLCBzdHJ1Y3Qga19zaWdhY3Rpb24gKmthLAotCQlzaWdpbmZvX3QgKmluZm8sIHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK2ludCBoYW5kbGVfc2lnbmFsMzIodW5zaWduZWQgbG9uZyBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqa2EsCisJCSAgICBzaWdpbmZvX3QgKmluZm8sIHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogeworCXNpZ3NldF90IGJsb2NrZWQ7CiAJaW50IHJldDsKIAogCS8qIFNldCB1cCB0aGUgc3RhY2sgZnJhbWUgKi8KQEAgLTYxNiwxNSArNjAwLDEyIEBACiAJCXJldCA9IHNldHVwX3J0X2ZyYW1lMzIoc2lnLCBrYSwgaW5mbywgb2xkc2V0LCByZWdzKTsKIAllbHNlCiAJCXJldCA9IHNldHVwX2ZyYW1lMzIoc2lnLCBrYSwgb2xkc2V0LCByZWdzKTsKLQotCWlmIChyZXQgPT0gMCkgewotCQlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQkJc2lnb3JzZXRzKCZjdXJyZW50LT5ibG9ja2VkLCZjdXJyZW50LT5ibG9ja2VkLCZrYS0+c2Euc2FfbWFzayk7Ci0JCWlmICghKGthLT5zYS5zYV9mbGFncyAmIFNBX05PREVGRVIpKQotCQkJc2lnYWRkc2V0KCZjdXJyZW50LT5ibG9ja2VkLHNpZyk7Ci0JCXJlY2FsY19zaWdwZW5kaW5nKCk7Ci0JCXNwaW5fdW5sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JfQotCXJldHVybiByZXQ7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlzaWdvcnNldHMoJmJsb2NrZWQsICZjdXJyZW50LT5ibG9ja2VkLCAma2EtPnNhLnNhX21hc2spOworCWlmICghKGthLT5zYS5zYV9mbGFncyAmIFNBX05PREVGRVIpKQorCQlzaWdhZGRzZXQoJmJsb2NrZWQsIHNpZyk7CisJc2V0X2N1cnJlbnRfYmxvY2tlZCgmYmxvY2tlZCk7CisJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvZW50cnkuUyBiL2FyY2gvczM5MC9rZXJuZWwvZW50cnkuUwppbmRleCAzZWFiN2NmLi4wMmVjOGZlIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeS5TCkBAIC04NDksNiArODQ5LDM0IEBACiByZXN0YXJ0X2dvOgogI2VuZGlmCiAKKyMKKyMgUFNXIHJlc3RhcnQgaW50ZXJydXB0IGhhbmRsZXIKKyMKK0VOVFJZKHBzd19yZXN0YXJ0X2ludF9oYW5kbGVyKQorCXN0CSVyMTUsX19MQ19TQVZFX0FSRUFfNjQoJXIwKQkjIHNhdmUgcjE1CisJYmFzcgklcjE1LDAKKzA6CWwJJXIxNSwuTHJlc3RhcnRfc3RhY2stMGIoJXIxNSkJIyBsb2FkIHJlc3RhcnQgc3RhY2sKKwlsCSVyMTUsMCglcjE1KQorCWFoaQklcjE1LC1TUF9TSVpFCQkJIyBtYWtlIHJvb20gZm9yIHB0X3JlZ3MKKwlzdG0JJXIwLCVyMTQsU1BfUjAoJXIxNSkJCSMgc3RvcmUgZ3BycyAlcjAtJXIxNCB0byBzdGFjaworCW12YwlTUF9SMTUoNCwlcjE1KSxfX0xDX1NBVkVfQVJFQV82NCglcjApIyBzdG9yZSBzYXZlZCAlcjE1IHRvIHN0YWNrCisJbXZjCVNQX1BTVyg4LCVyMTUpLF9fTENfUlNUX09MRF9QU1coJXIwKSAjIHN0b3JlIHJlc3RhcnQgb2xkIHBzdworCXhjCV9fU0ZfQkFDS0NIQUlOKDQsJXIxNSksX19TRl9CQUNLQ0hBSU4oJXIxNSkgIyBzZXQgYmFja2NoYWluIHRvIDAKKwliYXNyCSVyMTQsMAorMToJbAklcjE0LC5MZG9fcmVzdGFydC0xYiglcjE0KQorCWJhc3IJJXIxNCwlcjE0CisKKwliYXNyCSVyMTQsMAkJCQkjIGxvYWQgZGlzYWJsZWQgd2FpdCBQU1cgaWYKKzI6CWxwc3cJcmVzdGFydF9wc3dfY3Jhc2gtMmIoJXIxNCkJIyBkb19yZXN0YXJ0IHJldHVybnMKKwkuYWxpZ24gNAorLkxkb19yZXN0YXJ0OgorCS5sb25nCWRvX3Jlc3RhcnQKKy5McmVzdGFydF9zdGFjazoKKwkubG9uZwlyZXN0YXJ0X3N0YWNrCisJLmFsaWduIDgKK3Jlc3RhcnRfcHN3X2NyYXNoOgorCS5sb25nCTB4MDAwYTAwMDAsMHgwMDAwMDAwMCArIHJlc3RhcnRfcHN3X2NyYXNoCisKIAkuc2VjdGlvbiAua3Byb2Jlcy50ZXh0LCAiYXgiCiAKICNpZmRlZiBDT05GSUdfQ0hFQ0tfU1RBQ0sKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvZW50cnk2NC5TIGIvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeTY0LlMKaW5kZXggN2EwZmQ0Mi4uNWY3MjlkNiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeTY0LlMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9lbnRyeTY0LlMKQEAgLTg2NSw2ICs4NjUsMjYgQEAKIHJlc3RhcnRfZ286CiAjZW5kaWYKIAorIworIyBQU1cgcmVzdGFydCBpbnRlcnJ1cHQgaGFuZGxlcgorIworRU5UUlkocHN3X3Jlc3RhcnRfaW50X2hhbmRsZXIpCisJc3RnCSVyMTUsX19MQ19TQVZFX0FSRUFfNjQoJXIwKQkjIHNhdmUgcjE1CisJbGFybAklcjE1LHJlc3RhcnRfc3RhY2sJCSMgbG9hZCByZXN0YXJ0IHN0YWNrCisJbGcJJXIxNSwwKCVyMTUpCisJYWdoaQklcjE1LC1TUF9TSVpFCQkJIyBtYWtlIHJvb20gZm9yIHB0X3JlZ3MKKwlzdG1nCSVyMCwlcjE0LFNQX1IwKCVyMTUpCQkjIHN0b3JlIGdwcnMgJXIwLSVyMTQgdG8gc3RhY2sKKwltdmMJU1BfUjE1KDgsJXIxNSksX19MQ19TQVZFX0FSRUFfNjQoJXIwKSMgc3RvcmUgc2F2ZWQgJXIxNSB0byBzdGFjaworCW12YwlTUF9QU1coMTYsJXIxNSksX19MQ19SU1RfT0xEX1BTVyglcjApIyBzdG9yZSByZXN0YXJ0IG9sZCBwc3cKKwl4YwlfX1NGX0JBQ0tDSEFJTig4LCVyMTUpLF9fU0ZfQkFDS0NIQUlOKCVyMTUpICMgc2V0IGJhY2tjaGFpbiB0byAwCisJYnJhc2wJJXIxNCxkb19yZXN0YXJ0CisKKwlsYXJsCSVyMTQscmVzdGFydF9wc3dfY3Jhc2gJCSMgbG9hZCBkaXNhYmxlZCB3YWl0IFBTVyBpZgorCWxwc3dlCTAoJXIxNCkJCQkJIyBkb19yZXN0YXJ0IHJldHVybnMKKwkuYWxpZ24gOAorcmVzdGFydF9wc3dfY3Jhc2g6CisJLnF1YWQJMHgwMDAyMDAwMDgwMDAwMDAwLDB4MDAwMDAwMDAwMDAwMDAwMCArIHJlc3RhcnRfcHN3X2NyYXNoCisKIAkuc2VjdGlvbiAua3Byb2Jlcy50ZXh0LCAiYXgiCiAKICNpZmRlZiBDT05GSUdfQ0hFQ0tfU1RBQ0sKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvaXBsLmMgYi9hcmNoL3MzOTAva2VybmVsL2lwbC5jCmluZGV4IGE2ODkwNzAuLjA0MzYxZDUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvaXBsLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9pcGwuYwpAQCAtNDUsMTEgKzQ1LDEzIEBACiAgKiAtIGhhbHQKICAqIC0gcG93ZXIgb2ZmCiAgKiAtIHJlaXBsCisgKiAtIHJlc3RhcnQKICAqLwogI2RlZmluZSBPTl9QQU5JQ19TVFIJCSJvbl9wYW5pYyIKICNkZWZpbmUgT05fSEFMVF9TVFIJCSJvbl9oYWx0IgogI2RlZmluZSBPTl9QT0ZGX1NUUgkJIm9uX3BvZmYiCiAjZGVmaW5lIE9OX1JFSVBMX1NUUgkJIm9uX3JlYm9vdCIKKyNkZWZpbmUgT05fUkVTVEFSVF9TVFIJCSJvbl9yZXN0YXJ0IgogCiBzdHJ1Y3Qgc2h1dGRvd25fYWN0aW9uOwogc3RydWN0IHNodXRkb3duX3RyaWdnZXIgewpAQCAtMTU0NCwxNyArMTU0NiwyMCBAQAogc3RhdGljIGNoYXIgdm1jbWRfb25fcGFuaWNbMTI4XTsKIHN0YXRpYyBjaGFyIHZtY21kX29uX2hhbHRbMTI4XTsKIHN0YXRpYyBjaGFyIHZtY21kX29uX3BvZmZbMTI4XTsKK3N0YXRpYyBjaGFyIHZtY21kX29uX3Jlc3RhcnRbMTI4XTsKIAogREVGSU5FX0lQTF9BVFRSX1NUUl9SVyh2bWNtZCwgb25fcmVib290LCAiJXNcbiIsICIlc1xuIiwgdm1jbWRfb25fcmVib290KTsKIERFRklORV9JUExfQVRUUl9TVFJfUlcodm1jbWQsIG9uX3BhbmljLCAiJXNcbiIsICIlc1xuIiwgdm1jbWRfb25fcGFuaWMpOwogREVGSU5FX0lQTF9BVFRSX1NUUl9SVyh2bWNtZCwgb25faGFsdCwgIiVzXG4iLCAiJXNcbiIsIHZtY21kX29uX2hhbHQpOwogREVGSU5FX0lQTF9BVFRSX1NUUl9SVyh2bWNtZCwgb25fcG9mZiwgIiVzXG4iLCAiJXNcbiIsIHZtY21kX29uX3BvZmYpOworREVGSU5FX0lQTF9BVFRSX1NUUl9SVyh2bWNtZCwgb25fcmVzdGFydCwgIiVzXG4iLCAiJXNcbiIsIHZtY21kX29uX3Jlc3RhcnQpOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdm1jbWRfYXR0cnNbXSA9IHsKIAkmc3lzX3ZtY21kX29uX3JlYm9vdF9hdHRyLmF0dHIsCiAJJnN5c192bWNtZF9vbl9wYW5pY19hdHRyLmF0dHIsCiAJJnN5c192bWNtZF9vbl9oYWx0X2F0dHIuYXR0ciwKIAkmc3lzX3ZtY21kX29uX3BvZmZfYXR0ci5hdHRyLAorCSZzeXNfdm1jbWRfb25fcmVzdGFydF9hdHRyLmF0dHIsCiAJTlVMTCwKIH07CiAKQEAgLTE1NzYsNiArMTU4MSw4IEBACiAJCWNtZCA9IHZtY21kX29uX2hhbHQ7CiAJZWxzZSBpZiAoc3RyY21wKHRyaWdnZXItPm5hbWUsIE9OX1BPRkZfU1RSKSA9PSAwKQogCQljbWQgPSB2bWNtZF9vbl9wb2ZmOworCWVsc2UgaWYgKHN0cmNtcCh0cmlnZ2VyLT5uYW1lLCBPTl9SRVNUQVJUX1NUUikgPT0gMCkKKwkJY21kID0gdm1jbWRfb25fcmVzdGFydDsKIAllbHNlCiAJCXJldHVybjsKIApAQCAtMTcwNyw2ICsxNzE0LDM0IEBACiAJc3RvcF9ydW4oJm9uX3BhbmljX3RyaWdnZXIpOwogfQogCisvKiBvbiByZXN0YXJ0ICovCisKK3N0YXRpYyBzdHJ1Y3Qgc2h1dGRvd25fdHJpZ2dlciBvbl9yZXN0YXJ0X3RyaWdnZXIgPSB7T05fUkVTVEFSVF9TVFIsCisJJnJlaXBsX2FjdGlvbn07CisKK3N0YXRpYyBzc2l6ZV90IG9uX3Jlc3RhcnRfc2hvdyhzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCSAgICAgICBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKnBhZ2UpCit7CisJcmV0dXJuIHNwcmludGYocGFnZSwgIiVzXG4iLCBvbl9yZXN0YXJ0X3RyaWdnZXIuYWN0aW9uLT5uYW1lKTsKK30KKworc3RhdGljIHNzaXplX3Qgb25fcmVzdGFydF9zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCQlzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXJldHVybiBzZXRfdHJpZ2dlcihidWYsICZvbl9yZXN0YXJ0X3RyaWdnZXIsIGxlbik7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgb25fcmVzdGFydF9hdHRyID0KKwlfX0FUVFIob25fcmVzdGFydCwgMDY0NCwgb25fcmVzdGFydF9zaG93LCBvbl9yZXN0YXJ0X3N0b3JlKTsKKwordm9pZCBkb19yZXN0YXJ0KHZvaWQpCit7CisJc21wX3NlbmRfc3RvcCgpOworCW9uX3Jlc3RhcnRfdHJpZ2dlci5hY3Rpb24tPmZuKCZvbl9yZXN0YXJ0X3RyaWdnZXIpOworCXN0b3BfcnVuKCZvbl9yZXN0YXJ0X3RyaWdnZXIpOworfQorCiAvKiBvbiBoYWx0ICovCiAKIHN0YXRpYyBzdHJ1Y3Qgc2h1dGRvd25fdHJpZ2dlciBvbl9oYWx0X3RyaWdnZXIgPSB7T05fSEFMVF9TVFIsICZzdG9wX2FjdGlvbn07CkBAIC0xNzgzLDcgKzE4MTgsOSBAQAogCWlmIChzeXNmc19jcmVhdGVfZmlsZSgmc2h1dGRvd25fYWN0aW9uc19rc2V0LT5rb2JqLAogCQkJICAgICAgJm9uX3BvZmZfYXR0ci5hdHRyKSkKIAkJZ290byBmYWlsOwotCisJaWYgKHN5c2ZzX2NyZWF0ZV9maWxlKCZzaHV0ZG93bl9hY3Rpb25zX2tzZXQtPmtvYmosCisJCQkgICAgICAmb25fcmVzdGFydF9hdHRyLmF0dHIpKQorCQlnb3RvIGZhaWw7CiAJcmV0dXJuOwogZmFpbDoKIAlwYW5pYygic2h1dGRvd25fdHJpZ2dlcnNfaW5pdCBmYWlsZWRcbiIpOwpAQCAtMTk1OSw2ICsxOTk2LDEyIEBACiB7CiAJc3RydWN0IHJlc2V0X2NhbGwgKnJlc2V0OwogCisjaWZkZWYgQ09ORklHXzY0QklUCisJaWYgKGRpYWczMDhfc2V0X3dvcmtzKSB7CisJCWRpYWczMDhfcmVzZXQoKTsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgogCWxpc3RfZm9yX2VhY2hfZW50cnkocmVzZXQsICZyY2FsbCwgbGlzdCkKIAkJcmVzZXQtPmZuKCk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3JlaXBsNjQuUyBiL2FyY2gvczM5MC9rZXJuZWwvcmVpcGw2NC5TCmluZGV4IDc4ZWI3Y2YuLmU2OTA5NzUgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvcmVpcGw2NC5TCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvcmVpcGw2NC5TCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqICAgIENvcHlyaWdodCBJQk0gQ29ycCAyMDAwLDIwMDkKKyAqICAgIENvcHlyaWdodCBJQk0gQ29ycCAyMDAwLDIwMTEKICAqICAgIEF1dGhvcihzKTogSG9sZ2VyIFNtb2xpbnNraSA8SG9sZ2VyLlNtb2xpbnNraUBkZS5pYm0uY29tPiwKICAqCQkgRGVuaXMgSm9zZXBoIEJhcnJvdywKICAqLwpAQCAtOCw2ICs4LDY0IEBACiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKICMKKyMgc3RvcmVfc3RhdHVzCisjCisjIFByZXJlcXVpc2l0ZXMgdG8gcnVuIHRoaXMgZnVuY3Rpb246CisjIC0gUHJlZml4IHJlZ2lzdGVyIGlzIHNldCB0byB6ZXJvCisjIC0gT3JpZ2luYWwgcHJlZml4IHJlZ2lzdGVyIGlzIHN0b3JlZCBpbiAiZHVtcF9wcmVmaXhfcGFnZSIKKyMgLSBMb3djb3JlIHByb3RlY3Rpb24gaXMgb2ZmCisjCitFTlRSWShzdG9yZV9zdGF0dXMpCisJLyogU2F2ZSByZWdpc3RlciBvbmUgYW5kIGxvYWQgc2F2ZSBhcmVhIGJhc2UgKi8KKwlzdGcJJXIxLF9fTENfU0FWRV9BUkVBXzY0KCVyMCkKKwlsZ2hpCSVyMSxTQVZFX0FSRUFfQkFTRQorCS8qIEdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgKi8KKwlzdG1nCSVyMCwlcjE1LF9fTENfR1BSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJbGcJJXIyLF9fTENfU0FWRV9BUkVBXzY0KCVyMCkKKwlzdGcJJXIyLF9fTENfR1BSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSs4KCVyMSkKKwkvKiBDb250cm9sIHJlZ2lzdGVycyAqLworCXN0Y3RnCSVjMCwlYzE1LF9fTENfQ1JFR1NfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwkvKiBBY2Nlc3MgcmVnaXN0ZXJzICovCisJc3RhbQklYTAsJWExNSxfX0xDX0FSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJLyogRmxvYXRpbmcgcG9pbnQgcmVnaXN0ZXJzICovCisJc3RkCSVmMCwgMHgwMCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJc3RkCSVmMSwgMHgwOCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJc3RkCSVmMiwgMHgxMCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJc3RkCSVmMywgMHgxOCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJc3RkCSVmNCwgMHgyMCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJc3RkCSVmNSwgMHgyOCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJc3RkCSVmNiwgMHgzMCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJc3RkCSVmNywgMHgzOCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJc3RkCSVmOCwgMHg0MCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJc3RkCSVmOSwgMHg0OCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJc3RkCSVmMTAsMHg1MCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJc3RkCSVmMTEsMHg1OCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJc3RkCSVmMTIsMHg2MCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJc3RkCSVmMTMsMHg2OCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJc3RkCSVmMTQsMHg3MCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJc3RkCSVmMTUsMHg3OCArIF9fTENfRlBSRUdTX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSglcjEpCisJLyogRmxvYXRpbmcgcG9pbnQgY29udHJvbCByZWdpc3RlciAqLworCXN0ZnBjCV9fTENfRlBfQ1JFR19TQVZFX0FSRUEtU0FWRV9BUkVBX0JBU0UoJXIxKQorCS8qIENQVSB0aW1lciAqLworCXN0cHQJX19MQ19DUFVfVElNRVJfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFKCVyMSkKKwkvKiBTYXZlZCBwcmVmaXggcmVnaXN0ZXIgKi8KKwlsYXJsCSVyMixkdW1wX3ByZWZpeF9wYWdlCisJbXZjCV9fTENfUFJFRklYX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSg0LCVyMSksMCglcjIpCisJLyogQ2xvY2sgY29tcGFyYXRvciAtIHNldmVuIGJ5dGVzICovCisJbGFybAklcjIsLkxjbGtjbXAKKwlzdGNrYwkwKCVyMikKKwltdmMJX19MQ19DTE9DS19DT01QX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSArIDEoNywlcjEpLDEoJXIyKQorCS8qIFByb2dyYW0gc3RhdHVzIHdvcmQgKi8KKwllcHN3CSVyMiwlcjMKKwlzdAklcjIsX19MQ19QU1dfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFICsgMCglcjEpCisJc3QJJXIzLF9fTENfUFNXX1NBVkVfQVJFQS1TQVZFX0FSRUFfQkFTRSArIDQoJXIxKQorCWxhcmwJJXIyLHN0b3JlX3N0YXR1cworCXN0ZwklcjIsX19MQ19QU1dfU0FWRV9BUkVBLVNBVkVfQVJFQV9CQVNFICsgOCglcjEpCisJYnIJJXIxNAorLmFsaWduCTgKKy5MY2xrY21wOgkucXVhZAkweDAwMDAwMDAwMDAwMDAwMDAKKworIwogIyBkb19yZWlwbF9hc20KICMgUGFyYW1ldGVyOiByMiA9IHNjaGlkIG9mIHJlaXBsIGRldmljZQogIwpAQCAtMTUsMjIgKzczLDcgQEAKIEVOVFJZKGRvX3JlaXBsX2FzbSkKIAkJYmFzcgklcjEzLDAKIC5McGcwOgkJbHBzd2UJLkxuZXdwc3ctLkxwZzAoJXIxMykKLS5McGcxOgkJIyBkbyBzdG9yZSBzdGF0dXMgb2YgYWxsIHJlZ2lzdGVycwotCi0JCXN0ZwklcjEsLkxyZWdzYXZlLS5McGcwKCVyMTMpCi0JCWxnaGkJJXIxLDB4MTAwMAotCQlzdG1nCSVyMCwlcjE1LF9fTENfR1BSRUdTX1NBVkVfQVJFQS0weDEwMDAoJXIxKQotCQlsZwklcjAsLkxyZWdzYXZlLS5McGcwKCVyMTMpCi0JCXN0ZwklcjAsX19MQ19HUFJFR1NfU0FWRV9BUkVBLTB4MTAwMCs4KCVyMSkKLQkJc3RjdGcJJWMwLCVjMTUsX19MQ19DUkVHU19TQVZFX0FSRUEtMHgxMDAwKCVyMSkKLQkJc3RhbQklYTAsJWExNSxfX0xDX0FSRUdTX1NBVkVfQVJFQS0weDEwMDAoJXIxKQotCQlsZwklcjEwLC5MZHVtcF9wZngtLkxwZzAoJXIxMykKLQkJbXZjCV9fTENfUFJFRklYX1NBVkVfQVJFQS0weDEwMDAoNCwlcjEpLDAoJXIxMCkKLQkJc3RmcGMJX19MQ19GUF9DUkVHX1NBVkVfQVJFQS0weDEwMDAoJXIxKQotCQlzdGNrYwkuTGNsa2NtcC0uTHBnMCglcjEzKQotCQltdmMJX19MQ19DTE9DS19DT01QX1NBVkVfQVJFQS0weDEwMDAoNywlcjEpLC5MY2xrY21wLS5McGcwKCVyMTMpCi0JCXN0cHQJX19MQ19DUFVfVElNRVJfU0FWRV9BUkVBLTB4MTAwMCglcjEpCi0JCXN0ZwklcjEzLCBfX0xDX1BTV19TQVZFX0FSRUEtMHgxMDAwKzgoJXIxKQorLkxwZzE6CQlicmFzbAklcjE0LHN0b3JlX3N0YXR1cwogCiAJCWxjdGxnCSVjNiwlYzYsLkxhbGwtLkxwZzAoJXIxMykKIAkJbGdyCSVyMSwlcjIKQEAgLTY3LDEwICsxMTAsNyBAQAogCQlzdAklcjE0LC5MZGlzcHN3KzEyLS5McGcwKCVyMTMpCiAJCWxwc3dlCS5MZGlzcHN3LS5McGcwKCVyMTMpCiAJCS5hbGlnbgk4Ci0uTGNsa2NtcDoJLnF1YWQJMHgwMDAwMDAwMDAwMDAwMDAwCiAuTGFsbDoJCS5xdWFkCTB4MDAwMDAwMDBmZjAwMDAwMAotLkxkdW1wX3BmeDoJLnF1YWQJZHVtcF9wcmVmaXhfcGFnZQotLkxyZWdzYXZlOgkucXVhZAkweDAwMDAwMDAwMDAwMDAwMDAKIAkJLmFsaWduCTE2CiAvKgogICogVGhlc2UgYWRkcmVzc2VzIGhhdmUgdG8gYmUgMzEgYml0IG90aGVyd2lzZQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jCmluZGV4IDBjMzVkZWUxLi43YjM3MWMzIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jCkBAIC0zNDYsNyArMzQ2LDcgQEAKIAlsYyA9IF9fYWxsb2NfYm9vdG1lbV9sb3coTENfUEFHRVMgKiBQQUdFX1NJWkUsIExDX1BBR0VTICogUEFHRV9TSVpFLCAwKTsKIAlsYy0+cmVzdGFydF9wc3cubWFzayA9IFBTV19CQVNFX0JJVFMgfCBQU1dfREVGQVVMVF9LRVk7CiAJbGMtPnJlc3RhcnRfcHN3LmFkZHIgPQotCQlQU1dfQUREUl9BTU9ERSB8ICh1bnNpZ25lZCBsb25nKSByZXN0YXJ0X2ludF9oYW5kbGVyOworCQlQU1dfQUREUl9BTU9ERSB8ICh1bnNpZ25lZCBsb25nKSBwc3dfcmVzdGFydF9pbnRfaGFuZGxlcjsKIAlpZiAodXNlcl9tb2RlICE9IEhPTUVfU1BBQ0VfTU9ERSkKIAkJbGMtPnJlc3RhcnRfcHN3Lm1hc2sgfD0gUFNXX0FTQ19IT01FOwogCWxjLT5leHRlcm5hbF9uZXdfcHN3Lm1hc2sgPSBwc3dfa2VybmVsX2JpdHM7CkBAIC01MjksNiArNTI5LDI3IEBACiAJCW1lbW9yeV9lbmQgPSBtZW1vcnlfc2l6ZTsKIH0KIAordm9pZCAqcmVzdGFydF9zdGFjayBfX2F0dHJpYnV0ZV9fKChfX3NlY3Rpb25fXygiLmRhdGEiKSkpOworCisvKgorICogU2V0dXAgbmV3IFBTVyBhbmQgYWxsb2NhdGUgc3RhY2sgZm9yIFBTVyByZXN0YXJ0IGludGVycnVwdAorICovCitzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfcmVzdGFydF9wc3codm9pZCkKK3sKKwlwc3dfdCBwc3c7CisKKwlyZXN0YXJ0X3N0YWNrID0gX19hbGxvY19ib290bWVtKEFTWU5DX1NJWkUsIEFTWU5DX1NJWkUsIDApOworCXJlc3RhcnRfc3RhY2sgKz0gQVNZTkNfU0laRTsKKworCS8qCisJICogU2V0dXAgcmVzdGFydCBQU1cgZm9yIGFic29sdXRlIHplcm8gbG93Y29yZS4gVGhpcyBpcyBuZWNlc2FyeQorCSAqIGlmIFBTVyByZXN0YXJ0IGlzIGRvbmUgb24gYW4gb2ZmbGluZSBDUFUgdGhhdCBoYXMgbG93Y29yZSB6ZXJvCisJICovCisJcHN3Lm1hc2sgPSBQU1dfQkFTRV9CSVRTIHwgUFNXX0RFRkFVTFRfS0VZOworCXBzdy5hZGRyID0gUFNXX0FERFJfQU1PREUgfCAodW5zaWduZWQgbG9uZykgcHN3X3Jlc3RhcnRfaW50X2hhbmRsZXI7CisJY29weV90b19hYnNvbHV0ZV96ZXJvKCZTMzkwX2xvd2NvcmUucmVzdGFydF9wc3csICZwc3csIHNpemVvZihwc3cpKTsKK30KKwogc3RhdGljIHZvaWQgX19pbml0CiBzZXR1cF9tZW1vcnkodm9pZCkKIHsKQEAgLTczMSw2ICs3NTIsNyBAQAogCQlzdHJjcHkoZWxmX3BsYXRmb3JtLCAiejEwIik7CiAJCWJyZWFrOwogCWNhc2UgMHgyODE3OgorCWNhc2UgMHgyODE4OgogCQlzdHJjcHkoZWxmX3BsYXRmb3JtLCAiejE5NiIpOwogCQlicmVhazsKIAl9CkBAIC03OTIsNiArODE0LDcgQEAKIAlzZXR1cF9hZGRyZXNzaW5nX21vZGUoKTsKIAlzZXR1cF9tZW1vcnkoKTsKIAlzZXR1cF9yZXNvdXJjZXMoKTsKKwlzZXR1cF9yZXN0YXJ0X3BzdygpOwogCXNldHVwX2xvd2NvcmUoKTsKIAogICAgICAgICBjcHVfaW5pdCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9zaWduYWwuYyBiL2FyY2gvczM5MC9rZXJuZWwvc2lnbmFsLmMKaW5kZXggYWJiYjNjMy4uOWE0MGUxYyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zaWduYWwuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3NpZ25hbC5jCkBAIC01NywxNyArNTcsMTUgQEAKICAqLwogU1lTQ0FMTF9ERUZJTkUzKHNpZ3N1c3BlbmQsIGludCwgaGlzdG9yeTAsIGludCwgaGlzdG9yeTEsIG9sZF9zaWdzZXRfdCwgbWFzaykKIHsKLQltYXNrICY9IF9CTE9DS0FCTEU7Ci0Jc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JY3VycmVudC0+c2F2ZWRfc2lnbWFzayA9IGN1cnJlbnQtPmJsb2NrZWQ7Ci0Jc2lnaW5pdHNldCgmY3VycmVudC0+YmxvY2tlZCwgbWFzayk7Ci0JcmVjYWxjX3NpZ3BlbmRpbmcoKTsKLQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOworCXNpZ3NldF90IGJsb2NrZWQ7CiAKKwljdXJyZW50LT5zYXZlZF9zaWdtYXNrID0gY3VycmVudC0+YmxvY2tlZDsKKwltYXNrICY9IF9CTE9DS0FCTEU7CisJc2lnaW5pdHNldCgmYmxvY2tlZCwgbWFzayk7CisJc2V0X2N1cnJlbnRfYmxvY2tlZCgmYmxvY2tlZCk7CiAJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAlzY2hlZHVsZSgpOwotCXNldF90aHJlYWRfZmxhZyhUSUZfUkVTVE9SRV9TSUdNQVNLKTsKLQorCXNldF9yZXN0b3JlX3NpZ21hc2soKTsKIAlyZXR1cm4gLUVSRVNUQVJUTk9IQU5EOwogfQogCkBAIC0xNzIsMTggKzE3MCwxMSBAQAogCQlnb3RvIGJhZGZyYW1lOwogCWlmIChfX2NvcHlfZnJvbV91c2VyKCZzZXQuc2lnLCAmZnJhbWUtPnNjLm9sZG1hc2ssIF9TSUdNQVNLX0NPUFlfU0laRSkpCiAJCWdvdG8gYmFkZnJhbWU7Ci0KIAlzaWdkZWxzZXRtYXNrKCZzZXQsIH5fQkxPQ0tBQkxFKTsKLQlzcGluX2xvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQljdXJyZW50LT5ibG9ja2VkID0gc2V0OwotCXJlY2FsY19zaWdwZW5kaW5nKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxKCZjdXJyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKLQorCXNldF9jdXJyZW50X2Jsb2NrZWQoJnNldCk7CiAJaWYgKHJlc3RvcmVfc2lncmVncyhyZWdzLCAmZnJhbWUtPnNyZWdzKSkKIAkJZ290byBiYWRmcmFtZTsKLQogCXJldHVybiByZWdzLT5ncHJzWzJdOwotCiBiYWRmcmFtZToKIAlmb3JjZV9zaWcoU0lHU0VHViwgY3VycmVudCk7CiAJcmV0dXJuIDA7CkBAIC0xOTksMjEgKzE5MCwxNCBAQAogCQlnb3RvIGJhZGZyYW1lOwogCWlmIChfX2NvcHlfZnJvbV91c2VyKCZzZXQuc2lnLCAmZnJhbWUtPnVjLnVjX3NpZ21hc2ssIHNpemVvZihzZXQpKSkKIAkJZ290byBiYWRmcmFtZTsKLQogCXNpZ2RlbHNldG1hc2soJnNldCwgfl9CTE9DS0FCTEUpOwotCXNwaW5fbG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCWN1cnJlbnQtPmJsb2NrZWQgPSBzZXQ7Ci0JcmVjYWxjX3NpZ3BlbmRpbmcoKTsKLQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCisJc2V0X2N1cnJlbnRfYmxvY2tlZCgmc2V0KTsKIAlpZiAocmVzdG9yZV9zaWdyZWdzKHJlZ3MsICZmcmFtZS0+dWMudWNfbWNvbnRleHQpKQogCQlnb3RvIGJhZGZyYW1lOwotCiAJaWYgKGRvX3NpZ2FsdHN0YWNrKCZmcmFtZS0+dWMudWNfc3RhY2ssIE5VTEwsCiAJCQkgICByZWdzLT5ncHJzWzE1XSkgPT0gLUVGQVVMVCkKIAkJZ290byBiYWRmcmFtZTsKIAlyZXR1cm4gcmVncy0+Z3Byc1syXTsKLQogYmFkZnJhbWU6CiAJZm9yY2Vfc2lnKFNJR1NFR1YsIGN1cnJlbnQpOwogCXJldHVybiAwOwpAQCAtMzg1LDE0ICszNjksMTEgQEAKIAlyZXR1cm4gLUVGQVVMVDsKIH0KIAotLyoKLSAqIE9LLCB3ZSdyZSBpbnZva2luZyBhIGhhbmRsZXIKLSAqLwkKLQotc3RhdGljIGludAotaGFuZGxlX3NpZ25hbCh1bnNpZ25lZCBsb25nIHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKLQkgICAgICBzaWdpbmZvX3QgKmluZm8sIHNpZ3NldF90ICpvbGRzZXQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3N0YXRpYyBpbnQgaGFuZGxlX3NpZ25hbCh1bnNpZ25lZCBsb25nIHNpZywgc3RydWN0IGtfc2lnYWN0aW9uICprYSwKKwkJCSBzaWdpbmZvX3QgKmluZm8sIHNpZ3NldF90ICpvbGRzZXQsCisJCQkgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CisJc2lnc2V0X3QgYmxvY2tlZDsKIAlpbnQgcmV0OwogCiAJLyogU2V0IHVwIHRoZSBzdGFjayBmcmFtZSAqLwpAQCAtNDAwLDE3ICszODEsMTMgQEAKIAkJcmV0ID0gc2V0dXBfcnRfZnJhbWUoc2lnLCBrYSwgaW5mbywgb2xkc2V0LCByZWdzKTsKIAllbHNlCiAJCXJldCA9IHNldHVwX2ZyYW1lKHNpZywga2EsIG9sZHNldCwgcmVncyk7Ci0KLQlpZiAocmV0ID09IDApIHsKLQkJc3Bpbl9sb2NrX2lycSgmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7Ci0JCXNpZ29yc2V0cygmY3VycmVudC0+YmxvY2tlZCwmY3VycmVudC0+YmxvY2tlZCwma2EtPnNhLnNhX21hc2spOwotCQlpZiAoIShrYS0+c2Euc2FfZmxhZ3MgJiBTQV9OT0RFRkVSKSkKLQkJCXNpZ2FkZHNldCgmY3VycmVudC0+YmxvY2tlZCxzaWcpOwotCQlyZWNhbGNfc2lncGVuZGluZygpOwotCQlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwotCX0KLQotCXJldHVybiByZXQ7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlzaWdvcnNldHMoJmJsb2NrZWQsICZjdXJyZW50LT5ibG9ja2VkLCAma2EtPnNhLnNhX21hc2spOworCWlmICghKGthLT5zYS5zYV9mbGFncyAmIFNBX05PREVGRVIpKQorCQlzaWdhZGRzZXQoJmJsb2NrZWQsIHNpZyk7CisJc2V0X2N1cnJlbnRfYmxvY2tlZCgmYmxvY2tlZCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3NtcC5jIGIvYXJjaC9zMzkwL2tlcm5lbC9zbXAuYwppbmRleCBhNmQ4NWMwLi42YWIxNmFjIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAva2VybmVsL3NtcC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc21wLmMKQEAgLTQ1MiwyMyArNDUyLDI3IEBACiAgKi8KIGludCBfX2NwdWluaXQgc3RhcnRfc2Vjb25kYXJ5KHZvaWQgKmNwdXZvaWQpCiB7Ci0JLyogU2V0dXAgdGhlIGNwdSAqLwogCWNwdV9pbml0KCk7CiAJcHJlZW1wdF9kaXNhYmxlKCk7Ci0JLyogRW5hYmxlIFRPRCBjbG9jayBpbnRlcnJ1cHRzIG9uIHRoZSBzZWNvbmRhcnkgY3B1LiAqLwogCWluaXRfY3B1X3RpbWVyKCk7Ci0JLyogRW5hYmxlIGNwdSB0aW1lciBpbnRlcnJ1cHRzIG9uIHRoZSBzZWNvbmRhcnkgY3B1LiAqLwogCWluaXRfY3B1X3Z0aW1lcigpOwotCS8qIEVuYWJsZSBwZmF1bHQgcHNldWRvIHBhZ2UgZmF1bHRzIG9uIHRoaXMgY3B1LiAqLwogCXBmYXVsdF9pbml0KCk7CiAKLQkvKiBjYWxsIGNwdSBub3RpZmllcnMgKi8KIAlub3RpZnlfY3B1X3N0YXJ0aW5nKHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0JLyogTWFyayB0aGlzIGNwdSBhcyBvbmxpbmUgKi8KIAlpcGlfY2FsbF9sb2NrKCk7CiAJc2V0X2NwdV9vbmxpbmUoc21wX3Byb2Nlc3Nvcl9pZCgpLCB0cnVlKTsKIAlpcGlfY2FsbF91bmxvY2soKTsKLQkvKiBTd2l0Y2ggb24gaW50ZXJydXB0cyAqLworCV9fY3RsX2NsZWFyX2JpdCgwLCAyOCk7IC8qIERpc2FibGUgbG93Y29yZSBwcm90ZWN0aW9uICovCisJUzM5MF9sb3djb3JlLnJlc3RhcnRfcHN3Lm1hc2sgPSBQU1dfQkFTRV9CSVRTIHwgUFNXX0RFRkFVTFRfS0VZOworCVMzOTBfbG93Y29yZS5yZXN0YXJ0X3Bzdy5hZGRyID0KKwkJUFNXX0FERFJfQU1PREUgfCAodW5zaWduZWQgbG9uZykgcHN3X3Jlc3RhcnRfaW50X2hhbmRsZXI7CisJX19jdGxfc2V0X2JpdCgwLCAyOCk7IC8qIEVuYWJsZSBsb3djb3JlIHByb3RlY3Rpb24gKi8KKwkvKgorCSAqIFdhaXQgdW50aWwgdGhlIGNwdSB3aGljaCBicm91Z2h0IHRoaXMgb25lIHVwIG1hcmtlZCBpdAorCSAqIGFjdGl2ZSBiZWZvcmUgZW5hYmxpbmcgaW50ZXJydXB0cy4KKwkgKi8KKwl3aGlsZSAoIWNwdW1hc2tfdGVzdF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjcHVfYWN0aXZlX21hc2spKQorCQljcHVfcmVsYXgoKTsKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJLyogY3B1X2lkbGUgd2lsbCBjYWxsIHNjaGVkdWxlIGZvciB1cyAqLwogCWNwdV9pZGxlKCk7CkBAIC01MDcsNyArNTExLDExIEBACiAJbWVtc2V0KChjaGFyICopbG93Y29yZSArIDUxMiwgMCwgc2l6ZW9mKCpsb3djb3JlKSAtIDUxMik7CiAJbG93Y29yZS0+YXN5bmNfc3RhY2sgPSBhc3luY19zdGFjayArIEFTWU5DX1NJWkU7CiAJbG93Y29yZS0+cGFuaWNfc3RhY2sgPSBwYW5pY19zdGFjayArIFBBR0VfU0laRTsKLQorCWxvd2NvcmUtPnJlc3RhcnRfcHN3Lm1hc2sgPSBQU1dfQkFTRV9CSVRTIHwgUFNXX0RFRkFVTFRfS0VZOworCWxvd2NvcmUtPnJlc3RhcnRfcHN3LmFkZHIgPQorCQlQU1dfQUREUl9BTU9ERSB8ICh1bnNpZ25lZCBsb25nKSByZXN0YXJ0X2ludF9oYW5kbGVyOworCWlmICh1c2VyX21vZGUgIT0gSE9NRV9TUEFDRV9NT0RFKQorCQlsb3djb3JlLT5yZXN0YXJ0X3Bzdy5tYXNrIHw9IFBTV19BU0NfSE9NRTsKICNpZm5kZWYgQ09ORklHXzY0QklUCiAJaWYgKE1BQ0hJTkVfSEFTX0lFRUUpIHsKIAkJdW5zaWduZWQgbG9uZyBzYXZlX2FyZWE7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvbW0vbWFjY2Vzcy5jIGIvYXJjaC9zMzkwL21tL21hY2Nlc3MuYwppbmRleCA1MWU1Y2Q5Li41ZGJiYWE2IDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvbW0vbWFjY2Vzcy5jCisrKyBiL2FyY2gvczM5MC9tbS9tYWNjZXNzLmMKQEAgLTg1LDMgKzg1LDE5IEBACiAJYXJjaF9sb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJcmV0dXJuIHJjOwogfQorCisvKgorICogQ29weSBtZW1vcnkgdG8gYWJzb2x1dGUgemVybworICovCit2b2lkIGNvcHlfdG9fYWJzb2x1dGVfemVybyh2b2lkICpkZXN0LCB2b2lkICpzcmMsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIGNyMDsKKworCUJVR19PTigodW5zaWduZWQgbG9uZykgZGVzdCArIGNvdW50ID49IHNpemVvZihzdHJ1Y3QgX2xvd2NvcmUpKTsKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwlfX2N0bF9zdG9yZShjcjAsIDAsIDApOworCV9fY3RsX2NsZWFyX2JpdCgwLCAyOCk7IC8qIGRpc2FibGUgbG93Y29yZSBwcm90ZWN0aW9uICovCisJbWVtY3B5X3JlYWwoZGVzdCArIHN0b3JlX3ByZWZpeCgpLCBzcmMsIGNvdW50KTsKKwlfX2N0bF9sb2FkKGNyMCwgMCwgMCk7CisJcHJlZW1wdF9lbmFibGUoKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9tbS9wZ3RhYmxlLmMgYi9hcmNoL3MzOTAvbW0vcGd0YWJsZS5jCmluZGV4IDJhZGIyMzkuLjRkMWYyYmMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9tbS9wZ3RhYmxlLmMKKysrIGIvYXJjaC9zMzkwL21tL3BndGFibGUuYwpAQCAtNTI4LDYgKzUyOCw3IEBACiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgKnBhZ2VfdGFibGVfYWxsb2NfcGdzdGUoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCQkJCQkgICAgdW5zaWduZWQgbG9uZyB2bWFkZHIpCiB7CisJcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwYWdlX3RhYmxlX2ZyZWVfcGdzdGUodW5zaWduZWQgbG9uZyAqdGFibGUpCmRpZmYgLS1naXQgYS9hcmNoL3NoL0tjb25maWcgYi9hcmNoL3NoL0tjb25maWcKaW5kZXggNzQ4ZmYxOS4uZmY5MTc3YyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9LY29uZmlnCisrKyBiL2FyY2gvc2gvS2NvbmZpZwpAQCAtMTEsNiArMTEsNyBAQAogCXNlbGVjdCBIQVZFX0RNQV9BVFRSUwogCXNlbGVjdCBIQVZFX0lSUV9XT1JLCiAJc2VsZWN0IEhBVkVfUEVSRl9FVkVOVFMKKwlzZWxlY3QgQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcgaWYgKEdVU0FfUkIgfHwgQ1BVX1NINEEpCiAJc2VsZWN0IFBFUkZfVVNFX1ZNQUxMT0MKIAlzZWxlY3QgSEFWRV9LRVJORUxfR1pJUAogCXNlbGVjdCBIQVZFX0tFUk5FTF9CWklQMgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9NYWtlZmlsZSBiL2FyY2gvc2gvTWFrZWZpbGUKaW5kZXggZTNkODE3MC4uOTkzODVkMCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9NYWtlZmlsZQorKysgYi9hcmNoL3NoL01ha2VmaWxlCkBAIC0xNzMsNiArMTczLDcgQEAKIGNwdWluY2Rpci0kKENPTkZJR19DUFVfU0gyQSkJKz0gY3B1LXNoMmEKIGNwdWluY2Rpci0kKENPTkZJR19DUFVfU0gyKQkrPSBjcHUtc2gyCiBjcHVpbmNkaXItJChDT05GSUdfQ1BVX1NIMykJKz0gY3B1LXNoMworY3B1aW5jZGlyLSQoQ09ORklHX0NQVV9TSDRBKQkrPSBjcHUtc2g0YQogY3B1aW5jZGlyLSQoQ09ORklHX0NQVV9TSDQpCSs9IGNwdS1zaDQKIGNwdWluY2Rpci0kKENPTkZJR19DUFVfU0g1KQkrPSBjcHUtc2g1CiBjcHVpbmNkaXIteQkJCSs9IGNwdS1jb21tb24JIyBNdXN0IGJlIGxhc3QKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2JvYXJkLWFwc2g0YTNhLmMgYi9hcmNoL3NoL2JvYXJkcy9ib2FyZC1hcHNoNGEzYS5jCmluZGV4IDhlMmEyNzAuLjI4MjM2MTkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL2JvYXJkLWFwc2g0YTNhLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvYm9hcmQtYXBzaDRhM2EuYwpAQCAtMTE2LDcgKzExNiw3IEBACiAJaW50IHJldDsKIAogCWNsayA9IGNsa19nZXQoTlVMTCwgImV4dGFsIik7Ci0JaWYgKCFjbGsgfHwgSVNfRVJSKGNsaykpCisJaWYgKElTX0VSUihjbGspKQogCQlyZXR1cm4gUFRSX0VSUihjbGspOwogCXJldCA9IGNsa19zZXRfcmF0ZShjbGssIDMzMzMzMDAwKTsKIAljbGtfcHV0KGNsayk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9ib2FyZC1hcHNoNGFkMGEuYyBiL2FyY2gvc2gvYm9hcmRzL2JvYXJkLWFwc2g0YWQwYS5jCmluZGV4IGUyYmQyMTguLmI0ZDYyOTJhIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9ib2FyZC1hcHNoNGFkMGEuYworKysgYi9hcmNoL3NoL2JvYXJkcy9ib2FyZC1hcHNoNGFkMGEuYwpAQCAtOTQsNyArOTQsNyBAQAogCWludCByZXQ7CiAKIAljbGsgPSBjbGtfZ2V0KE5VTEwsICJleHRhbCIpOwotCWlmICghY2xrIHx8IElTX0VSUihjbGspKQorCWlmIChJU19FUlIoY2xrKSkKIAkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKIAlyZXQgPSBjbGtfc2V0X3JhdGUoY2xrLCAzMzMzMzAwMCk7CiAJY2xrX3B1dChjbGspOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvYm9hcmQtc2g3Nzg1bGNyLmMgYi9hcmNoL3NoL2JvYXJkcy9ib2FyZC1zaDc3ODVsY3IuYwppbmRleCBlZTY1ZmYwLi5kODc5ODQ4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9ib2FyZC1zaDc3ODVsY3IuYworKysgYi9hcmNoL3NoL2JvYXJkcy9ib2FyZC1zaDc3ODVsY3IuYwpAQCAtMjk5LDcgKzI5OSw3IEBACiAJaW50IHJldDsKIAogCWNsayA9IGNsa19nZXQoTlVMTCwgImV4dGFsIik7Ci0JaWYgKCFjbGsgfHwgSVNfRVJSKGNsaykpCisJaWYgKElTX0VSUihjbGspKQogCQlyZXR1cm4gUFRSX0VSUihjbGspOwogCXJldCA9IGNsa19zZXRfcmF0ZShjbGssIDMzMzMzMzMzKTsKIAljbGtfcHV0KGNsayk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9ib2FyZC11cnF1ZWxsLmMgYi9hcmNoL3NoL2JvYXJkcy9ib2FyZC11cnF1ZWxsLmMKaW5kZXggZDgxYzYwOS4uMjRlMzMxNiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvYm9hcmQtdXJxdWVsbC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL2JvYXJkLXVycXVlbGwuYwpAQCAtMTkwLDcgKzE5MCw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJY2xrID0gY2xrX2dldChOVUxMLCAiZXh0YWwiKTsKLQlpZiAoIWNsayB8fCBJU19FUlIoY2xrKSkKKwlpZiAoSVNfRVJSKGNsaykpCiAJCXJldHVybiBQVFJfRVJSKGNsayk7CiAJcmV0ID0gY2xrX3NldF9yYXRlKGNsaywgMzMzMzMzMzMpOwogCWNsa19wdXQoY2xrKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21hY2gtYXAzMjVyeGEvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtYXAzMjVyeGEvc2V0dXAuYwppbmRleCAxZGM5MjRiLi5kMzYyNjU3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWFwMzI1cnhhL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvbWFjaC1hcDMyNXJ4YS9zZXR1cC5jCkBAIC0zMzIsOCArMzMyLDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGFwMzI1cnhhX2NhbWVyYV9hZGQoc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsLCBzdHJ1Y3QgZGV2aWNlICpkZXYpOwotc3RhdGljIHZvaWQgYXAzMjVyeGFfY2FtZXJhX2RlbChzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wpOworc3RhdGljIGludCBhcDMyNXJ4YV9jYW1lcmFfYWRkKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKTsKK3N0YXRpYyB2b2lkIGFwMzI1cnhhX2NhbWVyYV9kZWwoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpOwogCiBzdGF0aWMgc3RydWN0IHNvY19jYW1lcmFfcGxhdGZvcm1faW5mbyBjYW1lcmFfaW5mbyA9IHsKIAkuZm9ybWF0X25hbWUgPSAiVVlWWSIsCkBAIC0zNjYsMjQgKzM2NiwyMyBAQAogCXNvY19jYW1lcmFfcGxhdGZvcm1fcmVsZWFzZSgmY2FtZXJhX2RldmljZSk7CiB9CiAKLXN0YXRpYyBpbnQgYXAzMjVyeGFfY2FtZXJhX2FkZChzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wsCi0JCQkgICAgICAgc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBhcDMyNXJ4YV9jYW1lcmFfYWRkKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCWludCByZXQgPSBzb2NfY2FtZXJhX3BsYXRmb3JtX2FkZChpY2wsIGRldiwgJmNhbWVyYV9kZXZpY2UsICZjYW1lcmFfbGluaywKKwlpbnQgcmV0ID0gc29jX2NhbWVyYV9wbGF0Zm9ybV9hZGQoaWNkLCAmY2FtZXJhX2RldmljZSwgJmNhbWVyYV9saW5rLAogCQkJCQkgIGFwMzI1cnhhX2NhbWVyYV9yZWxlYXNlLCAwKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAogCXJldCA9IGNhbWVyYV9wcm9iZSgpOwogCWlmIChyZXQgPCAwKQotCQlzb2NfY2FtZXJhX3BsYXRmb3JtX2RlbChpY2wsIGNhbWVyYV9kZXZpY2UsICZjYW1lcmFfbGluayk7CisJCXNvY19jYW1lcmFfcGxhdGZvcm1fZGVsKGljZCwgY2FtZXJhX2RldmljZSwgJmNhbWVyYV9saW5rKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGFwMzI1cnhhX2NhbWVyYV9kZWwoc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsKQorc3RhdGljIHZvaWQgYXAzMjVyeGFfY2FtZXJhX2RlbChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKIHsKLQlzb2NfY2FtZXJhX3BsYXRmb3JtX2RlbChpY2wsIGNhbWVyYV9kZXZpY2UsICZjYW1lcmFfbGluayk7CisJc29jX2NhbWVyYV9wbGF0Zm9ybV9kZWwoaWNkLCBjYW1lcmFfZGV2aWNlLCAmY2FtZXJhX2xpbmspOwogfQogI2VuZGlmIC8qIENPTkZJR19JMkMgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvbWFjaC1oaWdobGFuZGVyL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWhpZ2hsYW5kZXIvc2V0dXAuYwppbmRleCA4NzYxOGM5Li43NGI4ZGIxIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9tYWNoLWhpZ2hsYW5kZXIvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9tYWNoLWhpZ2hsYW5kZXIvc2V0dXAuYwpAQCAtMzM1LDggKzMzNSw2IEBACiAJJml2ZHJfY2xrLAogfTsKIAotI2RlZmluZSBDTEtERVZfQ09OX0lEKF9pZCwgX2NsaykgeyAuY29uX2lkID0gX2lkLCAuY2xrID0gX2NsayB9Ci0KIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBsb29rdXBzW10gPSB7CiAJLyogbWFpbiBjbG9ja3MgKi8KIAlDTEtERVZfQ09OX0lEKCJpdmRyX2NsayIsICZpdmRyX2NsayksCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9tYWNoLXNkazc3ODYvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtc2RrNzc4Ni9zZXR1cC5jCmluZGV4IDE1MjFhYTcuLjQ4NmQxYWMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21hY2gtc2RrNzc4Ni9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL21hY2gtc2RrNzc4Ni9zZXR1cC5jCkBAIC0xOTQsNyArMTk0LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAljbGsgPSBjbGtfZ2V0KE5VTEwsICJleHRhbCIpOwotCWlmICghY2xrIHx8IElTX0VSUihjbGspKQorCWlmIChJU19FUlIoY2xrKSkKIAkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKIAlyZXQgPSBjbGtfc2V0X3JhdGUoY2xrLCAzMzMzMzMzMyk7CiAJY2xrX3B1dChjbGspOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtY2F5bWFuLmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1jYXltYW4uYwppbmRleCBiNjhiNjFkLi5lZGMyZmI3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1jYXltYW4uYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1jYXltYW4uYwpAQCAtNSw3ICs1LDcgQEAKICNpbmNsdWRlIDxjcHUvaXJxLmg+CiAjaW5jbHVkZSAicGNpLXNoNS5oIgogCi1pbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitpbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJaW50IHJlc3VsdCA9IC0xOwogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1kcmVhbWNhc3QuYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLWRyZWFtY2FzdC5jCmluZGV4IDk0MmVmNGYuLmVkZWVhODkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLWRyZWFtY2FzdC5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLWRyZWFtY2FzdC5jCkBAIC02NCw3ICs2NCw3IEBACiB9CiBERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgZ2Fwc3BjaV9maXh1cF9yZXNvdXJjZXMpOwogCi1pbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitpbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJLyoKIAkgKiBUaGUgaW50ZXJydXB0IHJvdXRpbmcgc2VtYW50aWNzIGhlcmUgYXJlIHF1aXRlIHRyaXZpYWwuCmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1sYW5kaXNrLmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1sYW5kaXNrLmMKaW5kZXggOTVjNmUyZC4uZWNiMWQxMCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtbGFuZGlzay5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLWxhbmRpc2suYwpAQCAtMTksNyArMTksNyBAQAogI2RlZmluZSBQQ0lNQ1JfTVJTRVRfT0ZGCTB4QkZGRkZGRkYKICNkZWZpbmUgUENJTUNSX1JGU0hfT0ZGCQkweEZGRkZGRkZCCiAKLWludCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU4IHNsb3QsIHU4IHBpbikKK2ludCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAkvKgogCSAqIHNsb3QwOiBwaW4xLTQgPSBpcnE1LDYsNyw4CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1yNzc4MHJwLmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1yNzc4MHJwLmMKaW5kZXggMDhiMmQ4Ni4uZjkzNzBkY2UgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXI3NzgwcnAuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1yNzc4MHJwLmMKQEAgLTE4LDcgKzE4LDcgQEAKIAk2NSwgNjYsIDY3LCA2OCwKIH07CiAKLWludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1OCBzbG90LCB1OCBwaW4pCitpbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTggc2xvdCwgdTggcGluKQogewogCXJldHVybiBpcnFfdGFiW3Nsb3RdOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtcnRzNzc1MXIyZC5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtcnRzNzc1MXIyZC5jCmluZGV4IGUyNDg1MTYuLmVhZGRiNTYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXJ0czc3NTFyMmQuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1ydHM3NzUxcjJkLmMKQEAgLTMxLDcgKzMxLDcgQEAKIAlJUlFfRVRIMCwgSVJRX0VUSDEsIElSUV9JTlRBLCBJUlFfSU5URCwKIH07CiAKLWludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1OCBzbG90LCB1OCBwaW4pCitpbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTggc2xvdCwgdTggcGluKQogewogCWlmIChtYWNoX2lzX2xib3hyZTIoKSkKIAkJcmV0dXJuIGxib3hyZTJfaXJxX3RhYltzbG90XTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXNkazc3ODAuYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXNkazc3ODAuYwppbmRleCAwOTMwZjk4Li4wYjg0NzI1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1zZGs3NzgwLmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtc2RrNzc4MC5jCkBAIC0yNyw3ICsyNyw3IEBACiAJeyA2OCwgNjcsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSB9LAogfTsKIAotaW50IF9faW5pdCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU4IHNsb3QsIHU4IHBpbikKK2ludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAgICAgICAgcmV0dXJuIHNkazc3ODBfaXJxX3RhYltwaW4tMV1bc2xvdF07CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1zZTc3NTEuYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXNlNzc1MS5jCmluZGV4IGZkM2U2YjAuLjJlYzE0NmMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXNlNzc1MS5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXNlNzc1MS5jCkBAIC02LDcgKzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSAicGNpLXNoNC5oIgogCi1pbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShzdHJ1Y3QgcGNpX2RldiAqLCB1OCBzbG90LCB1OCBwaW4pCitpbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqLCB1OCBzbG90LCB1OCBwaW4pCiB7CiAgICAgICAgIHN3aXRjaCAoc2xvdCkgewogICAgICAgICBjYXNlIDA6IHJldHVybiAxMzsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXNoMDMuYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXNoMDMuYwppbmRleCAyZThhMThiLi4xNjE1ZTU5IDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1zaDAzLmMKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtc2gwMy5jCkBAIC0zLDcgKzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKLWludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK2ludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpbnQgaXJxOwogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1zbmFwZ2Vhci5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtc25hcGdlYXIuYwppbmRleCA1YTM5ZWNjLi40YTA5M2M2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy1zbmFwZ2Vhci5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXNuYXBnZWFyLmMKQEAgLTE4LDcgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlICJwY2ktc2g0LmgiCiAKLWludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1OCBzbG90LCB1OCBwaW4pCitpbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTggc2xvdCwgdTggcGluKQogewogCWludCBpcnEgPSAtMTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtdGl0YW4uYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvZml4dXBzLXRpdGFuLmMKaW5kZXggM2E3OWZhOC4uYmQxYWRkYiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9maXh1cHMtdGl0YW4uYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL2ZpeHVwcy10aXRhbi5jCkBAIC0yNyw3ICsyNyw3IEBACiAJVElUQU5fSVJRX1VTQiwKIH07CiAKLWludCBfX2luaXQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB1OCBzbG90LCB1OCBwaW4pCitpbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTggc2xvdCwgdTggcGluKQogewogCWludCBpcnEgPSB0aXRhbl9pcnFfdGFiW3Nsb3RdOwogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaWUtc2g3Nzg2LmMgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaWUtc2g3Nzg2LmMKaW5kZXggNDQxOGY5MC4uNGRmMjdjNGYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpZS1zaDc3ODYuYworKysgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaWUtc2g3Nzg2LmMKQEAgLTQ2Niw3ICs0NjYsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTggc2xvdCwgdTggcGluKQoraW50IF9faW5pdCBwY2liaW9zX21hcF9wbGF0Zm9ybV9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKnBkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKICAgICAgICAgcmV0dXJuIDcxOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9pbmNsdWRlL2FzbS9wY2kuaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vcGNpLmgKaW5kZXggZjBlZmU5N2YuLmNiMjFlMjMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvaW5jbHVkZS9hc20vcGNpLmgKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2FzbS9wY2kuaApAQCAtMTEyLDcgKzExMiw3IEBACiAjZW5kaWYKIAogLyogQm9hcmQtc3BlY2lmaWMgZml4dXAgcm91dGluZXMuICovCi1pbnQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbik7CitpbnQgcGNpYmlvc19tYXBfcGxhdGZvcm1faXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbik7CiAKIGV4dGVybiB2b2lkIHBjaWJpb3NfcmVzb3VyY2VfdG9fYnVzKHN0cnVjdCBwY2lfZGV2ICpkZXYsCiAJc3RydWN0IHBjaV9idXNfcmVnaW9uICpyZWdpb24sIHN0cnVjdCByZXNvdXJjZSAqcmVzKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9jcHUtc2gzL2NwdS9zZXJpYWwuaCBiL2FyY2gvc2gvaW5jbHVkZS9jcHUtc2gzL2NwdS9zZXJpYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzY2MzI5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9pbmNsdWRlL2NwdS1zaDMvY3B1L3NlcmlhbC5oCkBAIC0wLDAgKzEsMTAgQEAKKyNpZm5kZWYgX19DUFVfU0gzX1NFUklBTF9ICisjZGVmaW5lIF9fQ1BVX1NIM19TRVJJQUxfSAorCisjaW5jbHVkZSA8bGludXgvc2VyaWFsX3NjaS5oPgorCitleHRlcm4gc3RydWN0IHBsYXRfc2NpX3BvcnRfb3BzIHNoNzcweF9zY2lfcG9ydF9vcHM7CitleHRlcm4gc3RydWN0IHBsYXRfc2NpX3BvcnRfb3BzIHNoNzcxMF9zY2lfcG9ydF9vcHM7CitleHRlcm4gc3RydWN0IHBsYXRfc2NpX3BvcnRfb3BzIHNoNzcyMF9zY2lfcG9ydF9vcHM7CisKKyNlbmRpZiAvKiBfX0NQVV9TSDNfU0VSSUFMX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9jcHUtc2g0YS9jcHUvc2VyaWFsLmggYi9hcmNoL3NoL2luY2x1ZGUvY3B1LXNoNGEvY3B1L3NlcmlhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMWJjMjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2luY2x1ZGUvY3B1LXNoNGEvY3B1L3NlcmlhbC5oCkBAIC0wLDAgKzEsNyBAQAorI2lmbmRlZiBfX0NQVV9TSDRBX1NFUklBTF9ICisjZGVmaW5lIF9fQ1BVX1NINEFfU0VSSUFMX0gKKworLyogYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2VyaWFsLXNoNzcyMi5jICovCitleHRlcm4gc3RydWN0IHBsYXRfc2NpX3BvcnRfb3BzIHNoNzcyMl9zY2lfcG9ydF9vcHM7CisKKyNlbmRpZiAvKiBfX0NQVV9TSDRBX1NFUklBTF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvY2xvY2stY3BnLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvY2xvY2stY3BnLmMKaW5kZXggOGY2M2EyNi4uZjU5YjFmMyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L2Nsb2NrLWNwZy5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9jbG9jay1jcGcuYwpAQCAtMzUsOCArMzUsNiBAQAogCSZjcHVfY2xrLAogfTsKIAotI2RlZmluZSBDTEtERVZfQ09OX0lEKF9pZCwgX2NsaykgeyAuY29uX2lkID0gX2lkLCAuY2xrID0gX2NsayB9Ci0KIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBsb29rdXBzW10gPSB7CiAJLyogbWFpbiBjbG9ja3MgKi8KIAlDTEtERVZfQ09OX0lEKCJtYXN0ZXJfY2xrIiwgJm1hc3Rlcl9jbGspLApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9NYWtlZmlsZSBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvTWFrZWZpbGUKaW5kZXggZWNhYjI3NC4uNmYxM2YzMyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9NYWtlZmlsZQorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL01ha2VmaWxlCkBAIC03LDE1ICs3LDE1IEBACiBvYmotJChDT05GSUdfSElCRVJOQVRJT04pCQkrPSBzd3N1c3AubwogCiAjIENQVSBzdWJ0eXBlIHNldHVwCi1vYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1KQkrPSBzZXR1cC1zaDc3MDUubwotb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNikJKz0gc2V0dXAtc2g3NzB4Lm8KLW9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDcpCSs9IHNldHVwLXNoNzcweC5vCi1vYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA4KQkrPSBzZXR1cC1zaDc3MHgubwotb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOSkJKz0gc2V0dXAtc2g3NzB4Lm8KLW9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTApCSs9IHNldHVwLXNoNzcxMC5vCi1vYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEyKQkrPSBzZXR1cC1zaDc3MTAubwotb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMCkJKz0gc2V0dXAtc2g3NzIwLm8KLW9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjEpCSs9IHNldHVwLXNoNzcyMC5vCitvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1KQkrPSBzZXR1cC1zaDc3MDUubyBzZXJpYWwtc2g3NzB4Lm8KK29iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDYpCSs9IHNldHVwLXNoNzcweC5vIHNlcmlhbC1zaDc3MHgubworb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNykJKz0gc2V0dXAtc2g3NzB4Lm8gc2VyaWFsLXNoNzcweC5vCitvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA4KQkrPSBzZXR1cC1zaDc3MHgubyBzZXJpYWwtc2g3NzB4Lm8KK29iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkpCSs9IHNldHVwLXNoNzcweC5vIHNlcmlhbC1zaDc3MHgubworb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMCkJKz0gc2V0dXAtc2g3NzEwLm8gc2VyaWFsLXNoNzcxMC5vCitvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEyKQkrPSBzZXR1cC1zaDc3MTAubyBzZXJpYWwtc2g3NzEwLm8KK29iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjApCSs9IHNldHVwLXNoNzcyMC5vIHNlcmlhbC1zaDc3MjAubworb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMSkJKz0gc2V0dXAtc2g3NzIwLm8gc2VyaWFsLXNoNzcyMC5vCiAKICMgUHJpbWFyeSBvbi1jaGlwIGNsb2NrcyAoY29tbW9uKQogY2xvY2stJChDT05GSUdfQ1BVX1NIMykJCQk6PSBjbG9jay1zaDMubwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXJpYWwtc2g3NzB4LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NlcmlhbC1zaDc3MHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjcyNDJjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXJpYWwtc2g3NzB4LmMKQEAgLTAsMCArMSwzMyBAQAorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9zY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8Y3B1L3NlcmlhbC5oPgorCisjZGVmaW5lIFNDUENSIDB4QTQwMDAxMTYKKyNkZWZpbmUgU0NQRFIgMHhBNDAwMDEzNgorCitzdGF0aWMgdm9pZCBzaDc3MHhfc2NpX2luaXRfcGlucyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgY2ZsYWcpCit7CisJdW5zaWduZWQgc2hvcnQgZGF0YTsKKworCS8qIFdlIG5lZWQgdG8gc2V0IFNDUENSIHRvIGVuYWJsZSBSVFMvQ1RTICovCisJZGF0YSA9IF9fcmF3X3JlYWR3KFNDUENSKTsKKwkvKiBDbGVhciBvdXQgU0NQN01EMSwwLCBTQ1A2TUQxLDAsIFNDUDRNRDEsMCovCisJX19yYXdfd3JpdGV3KGRhdGEgJiAweDBmY2YsIFNDUENSKTsKKworCWlmICghKGNmbGFnICYgQ1JUU0NUUykpIHsKKwkJLyogV2UgbmVlZCB0byBzZXQgU0NQQ1IgdG8gZW5hYmxlIFJUUy9DVFMgKi8KKwkJZGF0YSA9IF9fcmF3X3JlYWR3KFNDUENSKTsKKwkJLyogQ2xlYXIgb3V0IFNDUDdNRDEsMCwgU0NQNE1EMSwwLAorCQkgICBTZXQgU0NQNk1EMSwwID0gezAxfSAob3V0cHV0KSAgKi8KKwkJX19yYXdfd3JpdGV3KChkYXRhICYgMHgwZmNmKSB8IDB4MTAwMCwgU0NQQ1IpOworCisJCWRhdGEgPSBfX3Jhd19yZWFkYihTQ1BEUik7CisJCS8qIFNldCAvUlRTMiAoYml0NikgPSAwICovCisJCV9fcmF3X3dyaXRlYihkYXRhICYgMHhiZiwgU0NQRFIpOworCX0KK30KKworc3RydWN0IHBsYXRfc2NpX3BvcnRfb3BzIHNoNzcweF9zY2lfcG9ydF9vcHMgPSB7CisJLmluaXRfcGlucwk9IHNoNzcweF9zY2lfaW5pdF9waW5zLAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2VyaWFsLXNoNzcxMC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXJpYWwtc2g3NzEwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIxOTBlZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2VyaWFsLXNoNzcxMC5jCkBAIC0wLDAgKzEsMjAgQEAKKyNpbmNsdWRlIDxsaW51eC9zZXJpYWxfc2NpLmg+CisjaW5jbHVkZSA8bGludXgvc2VyaWFsX2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGNwdS9zZXJpYWwuaD4KKworI2RlZmluZSBQQUNSIDB4YTQwNTAxMDAKKyNkZWZpbmUgUEJDUiAweGE0MDUwMTAyCisKK3N0YXRpYyB2b2lkIHNoNzcxMF9zY2lfaW5pdF9waW5zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBjZmxhZykKK3sKKwlpZiAocG9ydC0+bWFwYmFzZSA9PSAweEE0NDAwMDAwKSB7CisJCV9fcmF3X3dyaXRldyhfX3Jhd19yZWFkdyhQQUNSKSAmIDB4ZmZjMCwgUEFDUik7CisJCV9fcmF3X3dyaXRldyhfX3Jhd19yZWFkdyhQQkNSKSAmIDB4MGZmZiwgUEJDUik7CisJfSBlbHNlIGlmIChwb3J0LT5tYXBiYXNlID09IDB4QTQ0MTAwMDApCisJCV9fcmF3X3dyaXRldyhfX3Jhd19yZWFkdyhQQkNSKSAmIDB4ZjAwMywgUEJDUik7Cit9CisKK3N0cnVjdCBwbGF0X3NjaV9wb3J0X29wcyBzaDc3MTBfc2NpX3BvcnRfb3BzID0geworCS5pbml0X3BpbnMJPSBzaDc3MTBfc2NpX2luaXRfcGlucywKK307CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NlcmlhbC1zaDc3MjAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2VyaWFsLXNoNzcyMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MzJjNTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NlcmlhbC1zaDc3MjAuYwpAQCAtMCwwICsxLDM3IEBACisjaW5jbHVkZSA8bGludXgvc2VyaWFsX3NjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxjcHUvc2VyaWFsLmg+CisjaW5jbHVkZSA8YXNtL2dwaW8uaD4KKworc3RhdGljIHZvaWQgc2g3NzIwX3NjaV9pbml0X3BpbnMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IGNmbGFnKQoreworCXVuc2lnbmVkIHNob3J0IGRhdGE7CisKKwlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCS8qIGVuYWJsZSBSVFMvQ1RTICovCisJCWlmIChwb3J0LT5tYXBiYXNlID09IDB4YTQ0MzAwMDApIHsgLyogU0NJRjAgKi8KKwkJCS8qIENsZWFyIFBUQ1IgYml0IDktMjsgZW5hYmxlIGFsbCBzY2lmIHBpbnMgYnV0IHNjayAqLworCQkJZGF0YSA9IF9fcmF3X3JlYWR3KFBPUlRfUFRDUik7CisJCQlfX3Jhd193cml0ZXcoKGRhdGEgJiAweGZjMDMpLCBQT1JUX1BUQ1IpOworCQl9IGVsc2UgaWYgKHBvcnQtPm1hcGJhc2UgPT0gMHhhNDQzODAwMCkgeyAvKiBTQ0lGMSAqLworCQkJLyogQ2xlYXIgUFZDUiBiaXQgOS0yICovCisJCQlkYXRhID0gX19yYXdfcmVhZHcoUE9SVF9QVkNSKTsKKwkJCV9fcmF3X3dyaXRldygoZGF0YSAmIDB4ZmMwMyksIFBPUlRfUFZDUik7CisJCX0KKwl9IGVsc2UgeworCQlpZiAocG9ydC0+bWFwYmFzZSA9PSAweGE0NDMwMDAwKSB7IC8qIFNDSUYwICovCisJCQkvKiBDbGVhciBQVENSIGJpdCA1LTI7IGVuYWJsZSBvbmx5IHR4IGFuZCByeCAgKi8KKwkJCWRhdGEgPSBfX3Jhd19yZWFkdyhQT1JUX1BUQ1IpOworCQkJX19yYXdfd3JpdGV3KChkYXRhICYgMHhmZmMzKSwgUE9SVF9QVENSKTsKKwkJfSBlbHNlIGlmIChwb3J0LT5tYXBiYXNlID09IDB4YTQ0MzgwMDApIHsgLyogU0NJRjEgKi8KKwkJCS8qIENsZWFyIFBWQ1IgYml0IDUtMiAqLworCQkJZGF0YSA9IF9fcmF3X3JlYWR3KFBPUlRfUFZDUik7CisJCQlfX3Jhd193cml0ZXcoKGRhdGEgJiAweGZmYzMpLCBQT1JUX1BWQ1IpOworCQl9CisJfQorfQorCitzdHJ1Y3QgcGxhdF9zY2lfcG9ydF9vcHMgc2g3NzIwX3NjaV9wb3J0X29wcyA9IHsKKwkuaW5pdF9waW5zCT0gc2g3NzIwX3NjaV9pbml0X3BpbnMsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MDUuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzA1LmMKaW5kZXggY2QyZTcwMi4uMjMwOTYxOCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MDUuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcwNS5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3NjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NoX3RpbWVyLmg+CiAjaW5jbHVkZSA8YXNtL3J0Yy5oPgorI2luY2x1ZGUgPGNwdS9zZXJpYWwuaD4KIAogZW51bSB7CiAJVU5VU0VEID0gMCwKQEAgLTc1LDYgKzc2LDggQEAKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fNCwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyA1NiwgNTYsIDU2IH0sCisJLm9wcwkJPSAmc2g3NzB4X3NjaV9wb3J0X29wcywKKwkucmVndHlwZQk9IFNDSXhfU0g3NzA1X1NDSUZfUkVHVFlQRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWYwX2RldmljZSA9IHsKQEAgLTkyLDYgKzk1LDggQEAKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fNCwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyA1MiwgNTIsIDUyIH0sCisJLm9wcwkJPSAmc2g3NzB4X3NjaV9wb3J0X29wcywKKwkucmVndHlwZQk9IFNDSXhfU0g3NzA1X1NDSUZfUkVHVFlQRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWYxX2RldmljZSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzB4LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcweC5jCmluZGV4IDQ1NTFhZDYuLjNmM2Q1ZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzB4LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MHguYwpAQCAtMTksNiArMTksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9zY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zaF90aW1lci5oPgorI2luY2x1ZGUgPGNwdS9zZXJpYWwuaD4KIAogZW51bSB7CiAJVU5VU0VEID0gMCwKQEAgLTEwOCwxMSArMTA5LDE0IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMF9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlCT0gMHhmZmZmZmU4MCwKKwkucG9ydF9yZWcJPSAweGE0MDAwMTM2LAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKIAkuc2NzY3IJCT0gU0NTQ1JfVEUgfCBTQ1NDUl9SRSwKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZQkJPSBQT1JUX1NDSSwKIAkuaXJxcwkJPSB7IDIzLCAyMywgMjMsIDAgfSwKKwkub3BzCQk9ICZzaDc3MHhfc2NpX3BvcnRfb3BzLAorCS5yZWdzaGlmdAk9IDEsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmMF9kZXZpY2UgPSB7CkBAIC0xMzIsNiArMTM2LDggQEAKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyA1NiwgNTYsIDU2LCA1NiB9LAorCS5vcHMJCT0gJnNoNzcweF9zY2lfcG9ydF9vcHMsCisJLnJlZ3R5cGUJPSBTQ0l4X1NIM19TQ0lGX1JFR1RZUEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmMV9kZXZpY2UgPSB7CkBAIC0xNDYsMTEgKzE1MiwxNCBAQAogICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOSkKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMl9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlCT0gMHhhNDAwMDE0MCwKKwkucG9ydF9yZWcJPSBTQ0l4X05PVF9TVVBQT1JURUQsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAogCS5zY3NjcgkJPSBTQ1NDUl9URSB8IFNDU0NSX1JFLAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlCQk9IFBPUlRfSVJEQSwKIAkuaXJxcwkJPSB7IDUyLCA1MiwgNTIsIDUyIH0sCisJLm9wcwkJPSAmc2g3NzB4X3NjaV9wb3J0X29wcywKKwkucmVnc2hpZnQJPSAxLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpZjJfZGV2aWNlID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MjAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzIwLmMKaW5kZXggMzY1Yjk0YTYuLjk0OTIwMzQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzIwLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MjAuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9zY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zaF90aW1lci5oPgogI2luY2x1ZGUgPGFzbS9ydGMuaD4KKyNpbmNsdWRlIDxjcHUvc2VyaWFsLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgcnRjX3Jlc291cmNlc1tdID0gewogCVswXSA9IHsKQEAgLTU1LDYgKzU2LDggQEAKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fNCwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyA4MCwgODAsIDgwLCA4MCB9LAorCS5vcHMJCT0gJnNoNzcyMF9zY2lfcG9ydF9vcHMsCisJLnJlZ3R5cGUJPSBTQ0l4X1NINzcwNV9TQ0lGX1JFR1RZUEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmMF9kZXZpY2UgPSB7CkBAIC03Miw2ICs3NSw4IEBACiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzQsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzICAgICAgICAgICA9IHsgODEsIDgxLCA4MSwgODEgfSwKKwkub3BzCQk9ICZzaDc3MjBfc2NpX3BvcnRfb3BzLAorCS5yZWd0eXBlCT0gU0NJeF9TSDc3MDVfU0NJRl9SRUdUWVBFLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpZjFfZGV2aWNlID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9jbG9jay1zaDQtMjAyLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L2Nsb2NrLXNoNC0yMDIuYwppbmRleCAzZjZmOGU5Li5mNGUyNjJhIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L2Nsb2NrLXNoNC0yMDIuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L2Nsb2NrLXNoNC0yMDIuYwpAQCAtMTQ3LDggKzE0Nyw2IEBACiAJJnNoNDIwMl9zaG9jX2NsaywKIH07CiAKLSNkZWZpbmUgQ0xLREVWX0NPTl9JRChfaWQsIF9jbGspIHsgLmNvbl9pZCA9IF9pZCwgLmNsayA9IF9jbGsgfQotCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgbG9va3Vwc1tdID0gewogCS8qIG1haW4gY2xvY2tzICovCiAJQ0xLREVWX0NPTl9JRCgiZW1pX2NsayIsICZzaDQyMDJfZW1pX2NsayksCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc1MC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NTAuYwppbmRleCBlNTNiNGIzLi45OGNjMGM3IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc1MC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzUwLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogU0g3NzUwL1NINzc1MSBTZXR1cAorICogU0g3MDkxL1NINzc1MC9TSDc3NTBTL1NINzc1MFIvU0g3NzUxL1NINzc1MVIgU2V0dXAKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDA2ICBQYXVsIE11bmR0CiAgKiAgQ29weXJpZ2h0IChDKSAyMDA2ICBKYW1pZSBMZW5laGFuCkBAIC0zOCwxMSArMzgsMTMgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaV9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlCT0gMHhmZmUwMDAwMCwKKwkucG9ydF9yZWcJPSAweGZmZTAwMDFDLAogCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKIAkuc2NzY3IJCT0gU0NTQ1JfVEUgfCBTQ1NDUl9SRSwKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZQkJPSBQT1JUX1NDSSwKIAkuaXJxcwkJPSB7IDIzLCAyMywgMjMsIDAgfSwKKwkucmVnc2hpZnQJPSAyLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpX2RldmljZSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzYwLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc2MC5jCmluZGV4IDc4YmJmMjMuLmMwYjRjNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzYwLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NjAuYwpAQCAtMTMzLDYgKzEzMyw3IEBACiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgNTIsIDUzLCA1NSwgNTQgfSwKKwkucmVndHlwZQk9IFNDSXhfU0g0X1NDSUZfRklGT0RBVEFfUkVHVFlQRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWYwX2RldmljZSA9IHsKQEAgLTE1MCw2ICsxNTEsNyBAQAogCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkuaXJxcwkJPSB7IDcyLCA3MywgNzUsIDc0IH0sCisJLnJlZ3R5cGUJPSBTQ0l4X1NINF9TQ0lGX0ZJRk9EQVRBX1JFR1RZUEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmMV9kZXZpY2UgPSB7CkBAIC0xNjcsNiArMTY5LDcgQEAKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyA3NiwgNzcsIDc5LCA3OCB9LAorCS5yZWd0eXBlCT0gU0NJeF9TSDRfU0NJRl9GSUZPREFUQV9SRUdUWVBFLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpZjJfZGV2aWNlID0gewpAQCAtMTg0LDYgKzE4Nyw3IEBACiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUJCT0gUE9SVF9TQ0ksCiAJLmlycXMJCT0geyA4MCwgODEsIDgyLCAwIH0sCisJLnJlZ3NoaWZ0CT0gMiwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWYzX2RldmljZSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL01ha2VmaWxlIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvTWFrZWZpbGUKaW5kZXggY2MxMjJiMS4uYzU3ZmIyOCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvTWFrZWZpbGUKQEAgLTEwLDcgKzEwLDcgQEAKIG9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUpCSs9IHNldHVwLXNoNzc4NS5vCiBvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg2KQkrPSBzZXR1cC1zaDc3ODYubyBpbnRjLXNoeDMubwogb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzM0MykJKz0gc2V0dXAtc2g3MzQzLm8KLW9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjIpCSs9IHNldHVwLXNoNzcyMi5vCitvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyKQkrPSBzZXR1cC1zaDc3MjIubyBzZXJpYWwtc2g3NzIyLm8KIG9iai0kKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjMpCSs9IHNldHVwLXNoNzcyMy5vCiBvYmotJChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzI0KQkrPSBzZXR1cC1zaDc3MjQubwogb2JqLSQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzM2NikJKz0gc2V0dXAtc2g3MzY2Lm8KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzM0My5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3MzQzLmMKaW5kZXggOTNjNjQ2MC4uNzBlNDViZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3MzQzLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3MzQzLmMKQEAgLTE5NCw4ICsxOTQsNiBAQAogCVtNU1RQMjAwXSA9IE1TVFAoJmRpdjRfY2xrc1tESVY0X0JdLCBNU1RQQ1IyLCAwLCAwKSwKIH07CiAKLSNkZWZpbmUgQ0xLREVWX0NPTl9JRChfaWQsIF9jbGspIHsgLmNvbl9pZCA9IF9pZCwgLmNsayA9IF9jbGsgfQotCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgbG9va3Vwc1tdID0gewogCS8qIG1haW4gY2xvY2tzICovCiAJQ0xLREVWX0NPTl9JRCgicmNsayIsICZyX2NsayksCkBAIC0yMzMsMzIgKzIzMSwxNyBAQAogCUNMS0RFVl9DT05fSUQoInJ3ZHQwIiwgJm1zdHBfY2xrc1tNU1RQMDEzXSksCiAJQ0xLREVWX0NPTl9JRCgibWZpMCIsICZtc3RwX2Nsa3NbTVNUUDAxMV0pLAogCUNMS0RFVl9DT05fSUQoImZsY3RsMCIsICZtc3RwX2Nsa3NbTVNUUDAxMF0pLAotCXsKLQkJLyogU0NJRjAgKi8KLQkJLmRldl9pZAkJPSAic2gtc2NpLjAiLAotCQkuY29uX2lkCQk9ICJzY2lfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMDddLAotCX0sIHsKLQkJLyogU0NJRjEgKi8KLQkJLmRldl9pZAkJPSAic2gtc2NpLjEiLAotCQkuY29uX2lkCQk9ICJzY2lfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMDZdLAotCX0sIHsKLQkJLyogU0NJRjIgKi8KLQkJLmRldl9pZAkJPSAic2gtc2NpLjIiLAotCQkuY29uX2lkCQk9ICJzY2lfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMDVdLAotCX0sIHsKLQkJLyogU0NJRjMgKi8KLQkJLmRldl9pZAkJPSAic2gtc2NpLjMiLAotCQkuY29uX2lkCQk9ICJzY2lfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMDRdLAotCX0sCisKKwlDTEtERVZfSUNLX0lEKCJzY2lfZmNrIiwgInNoLXNjaS4wIiwgJm1zdHBfY2xrc1tNU1RQMDA3XSksCisJQ0xLREVWX0lDS19JRCgic2NpX2ZjayIsICJzaC1zY2kuMSIsICZtc3RwX2Nsa3NbTVNUUDAwNl0pLAorCUNMS0RFVl9JQ0tfSUQoInNjaV9mY2siLCAic2gtc2NpLjIiLCAmbXN0cF9jbGtzW01TVFAwMDVdKSwKKwlDTEtERVZfSUNLX0lEKCJzY2lfZmNrIiwgInNoLXNjaS4zIiwgJm1zdHBfY2xrc1tNU1RQMDA0XSksCisKIAlDTEtERVZfQ09OX0lEKCJzaW8wIiwgJm1zdHBfY2xrc1tNU1RQMDAzXSksCiAJQ0xLREVWX0NPTl9JRCgic2lvZjAiLCAmbXN0cF9jbGtzW01TVFAwMDJdKSwKIAlDTEtERVZfQ09OX0lEKCJzaW9mMSIsICZtc3RwX2Nsa3NbTVNUUDAwMV0pLAotCUNMS0RFVl9DT05fSUQoImkyYzAiLCAmbXN0cF9jbGtzW01TVFAxMDldKSwKLQlDTEtERVZfQ09OX0lEKCJpMmMxIiwgJm1zdHBfY2xrc1tNU1RQMTA4XSksCisJQ0xLREVWX0RFVl9JRCgiaTJjLXNoX21vYmlsZS4wIiwgJm1zdHBfY2xrc1tNU1RQMTA5XSksCisJQ0xLREVWX0RFVl9JRCgiaTJjLXNoX21vYmlsZS4xIiwgJm1zdHBfY2xrc1tNU1RQMTA4XSksCiAJQ0xLREVWX0NPTl9JRCgidHB1MCIsICZtc3RwX2Nsa3NbTVNUUDIyNV0pLAogCUNMS0RFVl9DT05fSUQoImlyZGEwIiwgJm1zdHBfY2xrc1tNU1RQMjI0XSksCiAJQ0xLREVWX0NPTl9JRCgic2RoaTAiLCAmbXN0cF9jbGtzW01TVFAyMThdKSwKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzM2Ni5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3MzY2LmMKaW5kZXggMDQ5ZGMwNjIuLjNjMzE2NTAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzM2Ni5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzM2Ni5jCkBAIC0xOTIsOCArMTkyLDYgQEAKIAlbTVNUUDIwMF0gPSBNU1RQKCZkaXY0X2Nsa3NbRElWNF9CXSwgTVNUUENSMiwgMCwgMCksCiB9OwogCi0jZGVmaW5lIENMS0RFVl9DT05fSUQoX2lkLCBfY2xrKSB7IC5jb25faWQgPSBfaWQsIC5jbGsgPSBfY2xrIH0KLQogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIGxvb2t1cHNbXSA9IHsKIAkvKiBtYWluIGNsb2NrcyAqLwogCUNMS0RFVl9DT05fSUQoInJjbGsiLCAmcl9jbGspLApAQCAtMjMxLDI1ICsyMjksMTQgQEAKIAlDTEtERVZfQ09OX0lEKCJyd2R0MCIsICZtc3RwX2Nsa3NbTVNUUDAxM10pLAogCUNMS0RFVl9DT05fSUQoIm1maTAiLCAmbXN0cF9jbGtzW01TVFAwMTFdKSwKIAlDTEtERVZfQ09OX0lEKCJmbGN0bDAiLCAmbXN0cF9jbGtzW01TVFAwMTBdKSwKLQl7Ci0JCS8qIFNDSUYwICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS4wIiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDA3XSwKLQl9LCB7Ci0JCS8qIFNDSUYxICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS4xIiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDA2XSwKLQl9LCB7Ci0JCS8qIFNDSUYyICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS4yIiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDA1XSwKLQl9LAorCisJQ0xLREVWX0lDS19JRCgic2NpX2ZjayIsICJzaC1zY2kuMCIsICZtc3RwX2Nsa3NbTVNUUDAwN10pLAorCUNMS0RFVl9JQ0tfSUQoInNjaV9mY2siLCAic2gtc2NpLjEiLCAmbXN0cF9jbGtzW01TVFAwMDZdKSwKKwlDTEtERVZfSUNLX0lEKCJzY2lfZmNrIiwgInNoLXNjaS4yIiwgJm1zdHBfY2xrc1tNU1RQMDA1XSksCisKIAlDTEtERVZfQ09OX0lEKCJtc2lvZjAiLCAmbXN0cF9jbGtzW01TVFAwMDJdKSwKIAlDTEtERVZfQ09OX0lEKCJzYnIwIiwgJm1zdHBfY2xrc1tNU1RQMDAxXSksCi0JQ0xLREVWX0NPTl9JRCgiaTJjMCIsICZtc3RwX2Nsa3NbTVNUUDEwOV0pLAorCUNMS0RFVl9ERVZfSUQoImkyYy1zaF9tb2JpbGUuMCIsICZtc3RwX2Nsa3NbTVNUUDEwOV0pLAogCUNMS0RFVl9DT05fSUQoImljYjAiLCAmbXN0cF9jbGtzW01TVFAyMjddKSwKIAlDTEtERVZfQ09OX0lEKCJtZXJhbTAiLCAmbXN0cF9jbGtzW01TVFAyMjZdKSwKIAlDTEtERVZfQ09OX0lEKCJkYWN5MSIsICZtc3RwX2Nsa3NbTVNUUDIyNF0pLApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3NzIyLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3MjIuYwppbmRleCA5ZDIzYTM2Li5jOWE0ODA4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3MjIuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3MjIuYwpAQCAtMTc1LDggKzE3NSw2IEBACiAJU0hfSFdCTEtfQ0xLKEhXQkxLX0xDREMsICZkaXY0X2Nsa3NbRElWNF9QXSwgMCksCiB9OwogCi0jZGVmaW5lIENMS0RFVl9DT05fSUQoX2lkLCBfY2xrKSB7IC5jb25faWQgPSBfaWQsIC5jbGsgPSBfY2xrIH0KLQogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIGxvb2t1cHNbXSA9IHsKIAkvKiBtYWluIGNsb2NrcyAqLwogCUNMS0RFVl9DT05fSUQoInJjbGsiLCAmcl9jbGspLApAQCAtMjAxLDQyICsxOTksMjAgQEAKIAkvKiBNU1RQIGNsb2NrcyAqLwogCUNMS0RFVl9DT05fSUQoInVyYW0wIiwgJm1zdHBfY2xrc1tIV0JMS19VUkFNXSksCiAJQ0xLREVWX0NPTl9JRCgieHltZW0wIiwgJm1zdHBfY2xrc1tIV0JMS19YWU1FTV0pLAotCXsKLQkJLyogVE1VMCAqLwotCQkuZGV2X2lkCQk9ICJzaF90bXUuMCIsCi0JCS5jb25faWQJCT0gInRtdV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbSFdCTEtfVE1VXSwKLQl9LCB7Ci0JCS8qIFRNVTEgKi8KLQkJLmRldl9pZAkJPSAic2hfdG11LjEiLAotCQkuY29uX2lkCQk9ICJ0bXVfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW0hXQkxLX1RNVV0sCi0JfSwgewotCQkvKiBUTVUyICovCi0JCS5kZXZfaWQJCT0gInNoX3RtdS4yIiwKLQkJLmNvbl9pZAkJPSAidG11X2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tIV0JMS19UTVVdLAotCX0sCisKKwlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS4wIiwgJm1zdHBfY2xrc1tIV0JMS19UTVVdKSwKKwlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS4xIiwgJm1zdHBfY2xrc1tIV0JMS19UTVVdKSwKKwlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS4yIiwgJm1zdHBfY2xrc1tIV0JMS19UTVVdKSwKKwogCUNMS0RFVl9DT05fSUQoImNtdF9mY2siLCAmbXN0cF9jbGtzW0hXQkxLX0NNVF0pLAogCUNMS0RFVl9DT05fSUQoInJ3ZHQwIiwgJm1zdHBfY2xrc1tIV0JMS19SV0RUXSksCiAJQ0xLREVWX0NPTl9JRCgiZmxjdGwwIiwgJm1zdHBfY2xrc1tIV0JMS19GTENUTF0pLAotCXsKLQkJLyogU0NJRjAgKi8KLQkJLmRldl9pZAkJPSAic2gtc2NpLjAiLAotCQkuY29uX2lkCQk9ICJzY2lfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW0hXQkxLX1NDSUYwXSwKLQl9LCB7Ci0JCS8qIFNDSUYxICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS4xIiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tIV0JMS19TQ0lGMV0sCi0JfSwgewotCQkvKiBTQ0lGMiAqLwotCQkuZGV2X2lkCQk9ICJzaC1zY2kuMiIsCi0JCS5jb25faWQJCT0gInNjaV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbSFdCTEtfU0NJRjJdLAotCX0sCi0JQ0xLREVWX0NPTl9JRCgiaTJjMCIsICZtc3RwX2Nsa3NbSFdCTEtfSUlDXSksCisKKwlDTEtERVZfSUNLX0lEKCJzY2lfZmNrIiwgInNoLXNjaS4wIiwgJm1zdHBfY2xrc1tIV0JMS19TQ0lGMF0pLAorCUNMS0RFVl9JQ0tfSUQoInNjaV9mY2siLCAic2gtc2NpLjEiLCAmbXN0cF9jbGtzW0hXQkxLX1NDSUYxXSksCisJQ0xLREVWX0lDS19JRCgic2NpX2ZjayIsICJzaC1zY2kuMiIsICZtc3RwX2Nsa3NbSFdCTEtfU0NJRjJdKSwKKworCUNMS0RFVl9ERVZfSUQoImkyYy1zaF9tb2JpbGUuMCIsICZtc3RwX2Nsa3NbSFdCTEtfSUlDXSksCiAJQ0xLREVWX0NPTl9JRCgicnRjMCIsICZtc3RwX2Nsa3NbSFdCTEtfUlRDXSksCiAJQ0xLREVWX0NPTl9JRCgic2RoaTAiLCAmbXN0cF9jbGtzW0hXQkxLX1NESEldKSwKIAlDTEtERVZfQ09OX0lEKCJrZXlzYzAiLCAmbXN0cF9jbGtzW0hXQkxLX0tFWVNDXSksCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3MjMuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzcyMy5jCmluZGV4IDU1NDkzY2QuLjNjYzM4MjcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzcyMy5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzcyMy5jCkBAIC0yMDAsOCArMjAwLDYgQEAKIAlTSF9IV0JMS19DTEsoSFdCTEtfTENEQywgJmRpdjRfY2xrc1tESVY0X0JdLCAwKSwKIH07CiAKLSNkZWZpbmUgQ0xLREVWX0NPTl9JRChfaWQsIF9jbGspIHsgLmNvbl9pZCA9IF9pZCwgLmNsayA9IF9jbGsgfQotCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgbG9va3Vwc1tdID0gewogCS8qIG1haW4gY2xvY2tzICovCiAJQ0xLREVWX0NPTl9JRCgicmNsayIsICZyX2NsayksCkBAIC0zMDUsNyArMzAzLDcgQEAKIAlDTEtERVZfQ09OX0lEKCJtc2lvZjAiLCAmbXN0cF9jbGtzW0hXQkxLX01TSU9GMF0pLAogCUNMS0RFVl9DT05fSUQoIm1zaW9mMSIsICZtc3RwX2Nsa3NbSFdCTEtfTVNJT0YxXSksCiAJQ0xLREVWX0NPTl9JRCgibWVyYW0wIiwgJm1zdHBfY2xrc1tIV0JMS19NRVJBTV0pLAotCUNMS0RFVl9DT05fSUQoImkyYzAiLCAmbXN0cF9jbGtzW0hXQkxLX0lJQ10pLAorCUNMS0RFVl9ERVZfSUQoImkyYy1zaF9tb2JpbGUuMCIsICZtc3RwX2Nsa3NbSFdCTEtfSUlDXSksCiAJQ0xLREVWX0NPTl9JRCgicnRjMCIsICZtc3RwX2Nsa3NbSFdCTEtfUlRDXSksCiAJQ0xLREVWX0NPTl9JRCgiYXRhcGkwIiwgJm1zdHBfY2xrc1tIV0JMS19BVEFQSV0pLAogCUNMS0RFVl9DT05fSUQoImFkYzAiLCAmbXN0cF9jbGtzW0hXQkxLX0FEQ10pLApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3NzI0LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3MjQuYwppbmRleCBkMDhmYTk1Li44NjY4ZjU1IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3MjQuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3MjQuYwpAQCAtMjUyLDggKzI1Miw2IEBACiAJU0hfSFdCTEtfQ0xLKEhXQkxLX0xDREMsICZkaXY0X2Nsa3NbRElWNF9CXSwgMCksCiB9OwogCi0jZGVmaW5lIENMS0RFVl9DT05fSUQoX2lkLCBfY2xrKSB7IC5jb25faWQgPSBfaWQsIC5jbGsgPSBfY2xrIH0KLQogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIGxvb2t1cHNbXSA9IHsKIAkvKiBtYWluIGNsb2NrcyAqLwogCUNMS0RFVl9DT05fSUQoInJjbGsiLCAmcl9jbGspLApAQCAtMjg5LDc3ICsyODcsMzEgQEAKIAlDTEtERVZfQ09OX0lEKCJzaDAiLCAmbXN0cF9jbGtzW0hXQkxLX1NIWVdBWV0pLAogCUNMS0RFVl9DT05fSUQoImh1ZGkwIiwgJm1zdHBfY2xrc1tIV0JMS19IVURJXSksCiAJQ0xLREVWX0NPTl9JRCgidWJjMCIsICZtc3RwX2Nsa3NbSFdCTEtfVUJDXSksCi0JewotCQkvKiBUTVUwICovCi0JCS5kZXZfaWQJCT0gInNoX3RtdS4wIiwKLQkJLmNvbl9pZAkJPSAidG11X2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tIV0JMS19UTVUwXSwKLQl9LCB7Ci0JCS8qIFRNVTEgKi8KLQkJLmRldl9pZAkJPSAic2hfdG11LjEiLAotCQkuY29uX2lkCQk9ICJ0bXVfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW0hXQkxLX1RNVTBdLAotCX0sIHsKLQkJLyogVE1VMiAqLwotCQkuZGV2X2lkCQk9ICJzaF90bXUuMiIsCi0JCS5jb25faWQJCT0gInRtdV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbSFdCTEtfVE1VMF0sCi0JfSwgewotCQkvKiBUTVUzICovCi0JCS5kZXZfaWQJCT0gInNoX3RtdS4zIiwKLQkJLmNvbl9pZAkJPSAidG11X2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tIV0JMS19UTVUxXSwKLQl9LAorCisJQ0xLREVWX0lDS19JRCgidG11X2ZjayIsICJzaF90bXUuMCIsICZtc3RwX2Nsa3NbSFdCTEtfVE1VMF0pLAorCUNMS0RFVl9JQ0tfSUQoInRtdV9mY2siLCAic2hfdG11LjEiLCAmbXN0cF9jbGtzW0hXQkxLX1RNVTBdKSwKKwlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS4yIiwgJm1zdHBfY2xrc1tIV0JMS19UTVUwXSksCisJQ0xLREVWX0lDS19JRCgidG11X2ZjayIsICJzaF90bXUuMyIsICZtc3RwX2Nsa3NbSFdCTEtfVE1VMV0pLAorCiAJQ0xLREVWX0NPTl9JRCgiY210X2ZjayIsICZtc3RwX2Nsa3NbSFdCTEtfQ01UXSksCiAJQ0xLREVWX0NPTl9JRCgicndkdDAiLCAmbXN0cF9jbGtzW0hXQkxLX1JXRFRdKSwKIAlDTEtERVZfQ09OX0lEKCJkbWFjMSIsICZtc3RwX2Nsa3NbSFdCTEtfRE1BQzFdKSwKLQl7Ci0JCS8qIFRNVTQgKi8KLQkJLmRldl9pZAkJPSAic2hfdG11LjQiLAotCQkuY29uX2lkCQk9ICJ0bXVfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW0hXQkxLX1RNVTFdLAotCX0sIHsKLQkJLyogVE1VNSAqLwotCQkuZGV2X2lkCQk9ICJzaF90bXUuNSIsCi0JCS5jb25faWQJCT0gInRtdV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbSFdCTEtfVE1VMV0sCi0JfSwgewotCQkvKiBTQ0lGMCAqLwotCQkuZGV2X2lkCQk9ICJzaC1zY2kuMCIsCi0JCS5jb25faWQJCT0gInNjaV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbSFdCTEtfU0NJRjBdLAotCX0sIHsKLQkJLyogU0NJRjEgKi8KLQkJLmRldl9pZAkJPSAic2gtc2NpLjEiLAotCQkuY29uX2lkCQk9ICJzY2lfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW0hXQkxLX1NDSUYxXSwKLQl9LCB7Ci0JCS8qIFNDSUYyICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS4yIiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tIV0JMS19TQ0lGMl0sCi0JfSwgewotCQkvKiBTQ0lGMyAqLwotCQkuZGV2X2lkCQk9ICJzaC1zY2kuMyIsCi0JCS5jb25faWQJCT0gInNjaV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbSFdCTEtfU0NJRjNdLAotCX0sIHsKLQkJLyogU0NJRjQgKi8KLQkJLmRldl9pZAkJPSAic2gtc2NpLjQiLAotCQkuY29uX2lkCQk9ICJzY2lfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW0hXQkxLX1NDSUY0XSwKLQl9LCB7Ci0JCS8qIFNDSUY1ICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS41IiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tIV0JMS19TQ0lGNV0sCi0JfSwKKworCUNMS0RFVl9JQ0tfSUQoInRtdV9mY2siLCAic2hfdG11LjQiLCAmbXN0cF9jbGtzW0hXQkxLX1RNVTFdKSwKKwlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS41IiwgJm1zdHBfY2xrc1tIV0JMS19UTVUxXSksCisJQ0xLREVWX0lDS19JRCgic2NpX2ZjayIsICJzaC1zY2kuMCIsICZtc3RwX2Nsa3NbSFdCTEtfU0NJRjBdKSwKKwlDTEtERVZfSUNLX0lEKCJzY2lfZmNrIiwgInNoLXNjaS4xIiwgJm1zdHBfY2xrc1tIV0JMS19TQ0lGMV0pLAorCUNMS0RFVl9JQ0tfSUQoInNjaV9mY2siLCAic2gtc2NpLjIiLCAmbXN0cF9jbGtzW0hXQkxLX1NDSUYyXSksCisJQ0xLREVWX0lDS19JRCgic2NpX2ZjayIsICJzaC1zY2kuMyIsICZtc3RwX2Nsa3NbSFdCTEtfU0NJRjNdKSwKKwlDTEtERVZfSUNLX0lEKCJzY2lfZmNrIiwgInNoLXNjaS40IiwgJm1zdHBfY2xrc1tIV0JMS19TQ0lGNF0pLAorCUNMS0RFVl9JQ0tfSUQoInNjaV9mY2siLCAic2gtc2NpLjUiLCAmbXN0cF9jbGtzW0hXQkxLX1NDSUY1XSksCisKIAlDTEtERVZfQ09OX0lEKCJtc2lvZjAiLCAmbXN0cF9jbGtzW0hXQkxLX01TSU9GMF0pLAogCUNMS0RFVl9DT05fSUQoIm1zaW9mMSIsICZtc3RwX2Nsa3NbSFdCTEtfTVNJT0YxXSksCiAJQ0xLREVWX0NPTl9JRCgia2V5c2MwIiwgJm1zdHBfY2xrc1tIV0JMS19LRVlTQ10pLAogCUNMS0RFVl9DT05fSUQoInJ0YzAiLCAmbXN0cF9jbGtzW0hXQkxLX1JUQ10pLAotCUNMS0RFVl9DT05fSUQoImkyYzAiLCAmbXN0cF9jbGtzW0hXQkxLX0lJQzBdKSwKLQlDTEtERVZfQ09OX0lEKCJpMmMxIiwgJm1zdHBfY2xrc1tIV0JMS19JSUMxXSksCisJQ0xLREVWX0RFVl9JRCgiaTJjLXNoX21vYmlsZS4wIiwgJm1zdHBfY2xrc1tIV0JMS19JSUMwXSksCisJQ0xLREVWX0RFVl9JRCgiaTJjLXNoX21vYmlsZS4xIiwgJm1zdHBfY2xrc1tIV0JMS19JSUMxXSksCiAJQ0xLREVWX0NPTl9JRCgibW1jMCIsICZtc3RwX2Nsa3NbSFdCTEtfTU1DXSksCiAJQ0xLREVWX0NPTl9JRCgiZXRoMCIsICZtc3RwX2Nsa3NbSFdCTEtfRVRIRVJdKSwKIAlDTEtERVZfQ09OX0lEKCJhdGFwaTAiLCAmbXN0cF9jbGtzW0hXQkxLX0FUQVBJXSksCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3NTcuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzc1Ny5jCmluZGV4IGVlZGRkYWQuLjNiMDk3YjAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzc1Ny5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzc1Ny5jCkBAIC0xMDEsOCArMTAxLDYgQEAKIAlbTVNUUDIyMF0gPSBTSF9DTEtfTVNUUDMyKCZkaXY0X2Nsa3NbRElWNF9QXSwgTVNUUENSMiwgMjAsIDApLAogfTsKIAotI2RlZmluZSBDTEtERVZfQ09OX0lEKF9pZCwgX2NsaykgeyAuY29uX2lkID0gX2lkLCAuY2xrID0gX2NsayB9Ci0KIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBsb29rdXBzW10gPSB7CiAJLyogbWFpbiBjbG9ja3MgKi8KIAlDTEtERVZfQ09OX0lEKCJleHRhbCIsICZleHRhbF9jbGspLApAQCAtMTE2LDMzICsxMTQsMTMgQEAKIAkvKiBNU1RQMzIgY2xvY2tzICovCiAJQ0xLREVWX0NPTl9JRCgic2RoaTAiLCAmbXN0cF9jbGtzW01TVFAwMDRdKSwKIAlDTEtERVZfQ09OX0lEKCJyaWljIiwgJm1zdHBfY2xrc1tNU1RQMDAwXSksCi0JewotCQkvKiBUTVUwICovCi0JCS5kZXZfaWQJCT0gInNoX3RtdS4wIiwKLQkJLmNvbl9pZAkJPSAidG11X2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMTEzXSwKLQl9LCB7Ci0JCS8qIFRNVTEgKi8KLQkJLmRldl9pZAkJPSAic2hfdG11LjEiLAotCQkuY29uX2lkCQk9ICJ0bXVfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAxMTRdLAotCX0sCi0JewotCQkvKiBTQ0lGNCAoQnV0LCBJRCBpcyAyKSAqLwotCQkuZGV2X2lkCQk9ICJzaC1zY2kuMiIsCi0JCS5jb25faWQJCT0gInNjaV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbTVNUUDExMl0sCi0JfSwgewotCQkvKiBTQ0lGMyAqLwotCQkuZGV2X2lkCQk9ICJzaC1zY2kuMSIsCi0JCS5jb25faWQJCT0gInNjaV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbTVNUUDExMV0sCi0JfSwgewotCQkvKiBTQ0lGMiAqLwotCQkuZGV2X2lkCQk9ICJzaC1zY2kuMCIsCi0JCS5jb25faWQJCT0gInNjaV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbTVNUUDExMF0sCi0JfSwKKworCUNMS0RFVl9JQ0tfSUQoInRtdV9mY2siLCAic2hfdG11LjAiLCAmbXN0cF9jbGtzW01TVFAxMTNdKSwKKwlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS4xIiwgJm1zdHBfY2xrc1tNU1RQMTE0XSksCisJQ0xLREVWX0lDS19JRCgic2NpX2ZjayIsICJzaC1zY2kuMiIsICZtc3RwX2Nsa3NbTVNUUDExMl0pLAorCUNMS0RFVl9JQ0tfSUQoInNjaV9mY2siLCAic2gtc2NpLjEiLCAmbXN0cF9jbGtzW01TVFAxMTFdKSwKKwlDTEtERVZfSUNLX0lEKCJzY2lfZmNrIiwgInNoLXNjaS4wIiwgJm1zdHBfY2xrc1tNU1RQMTEwXSksCisKIAlDTEtERVZfQ09OX0lEKCJ1c2IwIiwgJm1zdHBfY2xrc1tNU1RQMTAyXSksCiAJQ0xLREVWX0NPTl9JRCgibW1jMCIsICZtc3RwX2Nsa3NbTVNUUDIyMF0pLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzc2My5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3NzYzLmMKaW5kZXggNTk5NjMwZi4uMmQ0YzdmZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3NzYzLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3NzYzLmMKQEAgLTkxLDggKzkxLDYgQEAKIAkmc2g3NzYzX3NoeXdheV9jbGssCiB9OwogCi0jZGVmaW5lIENMS0RFVl9DT05fSUQoX2lkLCBfY2xrKSB7IC5jb25faWQgPSBfaWQsIC5jbGsgPSBfY2xrIH0KLQogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIGxvb2t1cHNbXSA9IHsKIAkvKiBtYWluIGNsb2NrcyAqLwogCUNMS0RFVl9DT05fSUQoInNoeXdheV9jbGsiLCAmc2g3NzYzX3NoeXdheV9jbGspLApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3NzgwLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3ODAuYwppbmRleCA4ODk0OTI2Li4zYjUzMzQ4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3ODAuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3ODAuYwpAQCAtOTcsOCArOTcsNiBAQAogCSZzaDc3ODBfc2h5d2F5X2NsaywKIH07CiAKLSNkZWZpbmUgQ0xLREVWX0NPTl9JRChfaWQsIF9jbGspIHsgLmNvbl9pZCA9IF9pZCwgLmNsayA9IF9jbGsgfQotCiBzdGF0aWMgc3RydWN0IGNsa19sb29rdXAgbG9va3Vwc1tdID0gewogCS8qIG1haW4gY2xvY2tzICovCiAJQ0xLREVWX0NPTl9JRCgic2h5d2F5X2NsayIsICZzaDc3ODBfc2h5d2F5X2NsayksCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaDc3ODUuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzc4NS5jCmluZGV4IDJkOTYwMjQuLmU1YjQyMGMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzc4NS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzc4NS5jCkBAIC0xMTYsOCArMTE2LDYgQEAKIAlbTVNUUDEwMF0gPSBTSF9DTEtfTVNUUDMyKE5VTEwsIE1TVFBDUjEsIDAsIDApLAogfTsKIAotI2RlZmluZSBDTEtERVZfQ09OX0lEKF9pZCwgX2NsaykgeyAuY29uX2lkID0gX2lkLCAuY2xrID0gX2NsayB9Ci0KIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBsb29rdXBzW10gPSB7CiAJLyogbWFpbiBjbG9ja3MgKi8KIAlDTEtERVZfQ09OX0lEKCJleHRhbCIsICZleHRhbF9jbGspLApAQCAtMTM0LDc0ICsxMzIsMjcgQEAKIAlDTEtERVZfQ09OX0lEKCJjcHVfY2xrIiwgJmRpdjRfY2xrc1tESVY0X0ldKSwKIAogCS8qIE1TVFAzMiBjbG9ja3MgKi8KLQl7Ci0JCS8qIFNDSUY1ICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS41IiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDI5XSwKLQl9LCB7Ci0JCS8qIFNDSUY0ICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS40IiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDI4XSwKLQl9LCB7Ci0JCS8qIFNDSUYzICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS4zIiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDI3XSwKLQl9LCB7Ci0JCS8qIFNDSUYyICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS4yIiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDI2XSwKLQl9LCB7Ci0JCS8qIFNDSUYxICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS4xIiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDI1XSwKLQl9LCB7Ci0JCS8qIFNDSUYwICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS4wIiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDI0XSwKLQl9LAorCUNMS0RFVl9JQ0tfSUQoInNjaV9mY2siLCAic2gtc2NpLjUiLCAmbXN0cF9jbGtzW01TVFAwMjldKSwKKwlDTEtERVZfSUNLX0lEKCJzY2lfZmNrIiwgInNoLXNjaS40IiwgJm1zdHBfY2xrc1tNU1RQMDI4XSksCisJQ0xLREVWX0lDS19JRCgic2NpX2ZjayIsICJzaC1zY2kuMyIsICZtc3RwX2Nsa3NbTVNUUDAyN10pLAorCUNMS0RFVl9JQ0tfSUQoInNjaV9mY2siLCAic2gtc2NpLjIiLCAmbXN0cF9jbGtzW01TVFAwMjZdKSwKKwlDTEtERVZfSUNLX0lEKCJzY2lfZmNrIiwgInNoLXNjaS4xIiwgJm1zdHBfY2xrc1tNU1RQMDI1XSksCisJQ0xLREVWX0lDS19JRCgic2NpX2ZjayIsICJzaC1zY2kuMCIsICZtc3RwX2Nsa3NbTVNUUDAyNF0pLAorCiAJQ0xLREVWX0NPTl9JRCgic3NpMV9mY2siLCAmbXN0cF9jbGtzW01TVFAwMjFdKSwKIAlDTEtERVZfQ09OX0lEKCJzc2kwX2ZjayIsICZtc3RwX2Nsa3NbTVNUUDAyMF0pLAogCUNMS0RFVl9DT05fSUQoImhhYzFfZmNrIiwgJm1zdHBfY2xrc1tNU1RQMDE3XSksCiAJQ0xLREVWX0NPTl9JRCgiaGFjMF9mY2siLCAmbXN0cF9jbGtzW01TVFAwMTZdKSwKIAlDTEtERVZfQ09OX0lEKCJtbWNpZl9mY2siLCAmbXN0cF9jbGtzW01TVFAwMTNdKSwKIAlDTEtERVZfQ09OX0lEKCJmbGN0bF9mY2siLCAmbXN0cF9jbGtzW01TVFAwMTJdKSwKLQl7Ci0JCS8qIFRNVTAgKi8KLQkJLmRldl9pZAkJPSAic2hfdG11LjAiLAotCQkuY29uX2lkCQk9ICJ0bXVfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMDhdLAotCX0sIHsKLQkJLyogVE1VMSAqLwotCQkuZGV2X2lkCQk9ICJzaF90bXUuMSIsCi0JCS5jb25faWQJCT0gInRtdV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbTVNUUDAwOF0sCi0JfSwgewotCQkvKiBUTVUyICovCi0JCS5kZXZfaWQJCT0gInNoX3RtdS4yIiwKLQkJLmNvbl9pZAkJPSAidG11X2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDA4XSwKLQl9LCB7Ci0JCS8qIFRNVTMgKi8KLQkJLmRldl9pZAkJPSAic2hfdG11LjMiLAotCQkuY29uX2lkCQk9ICJ0bXVfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMDldLAotCX0sIHsKLQkJLyogVE1VNCAqLwotCQkuZGV2X2lkCQk9ICJzaF90bXUuNCIsCi0JCS5jb25faWQJCT0gInRtdV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbTVNUUDAwOV0sCi0JfSwgewotCQkvKiBUTVU1ICovCi0JCS5kZXZfaWQJCT0gInNoX3RtdS41IiwKLQkJLmNvbl9pZAkJPSAidG11X2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDA5XSwKLQl9LAorCisJQ0xLREVWX0lDS19JRCgidG11X2ZjayIsICJzaF90bXUuMCIsICZtc3RwX2Nsa3NbTVNUUDAwOF0pLAorCUNMS0RFVl9JQ0tfSUQoInRtdV9mY2siLCAic2hfdG11LjEiLCAmbXN0cF9jbGtzW01TVFAwMDhdKSwKKwlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS4yIiwgJm1zdHBfY2xrc1tNU1RQMDA4XSksCisJQ0xLREVWX0lDS19JRCgidG11X2ZjayIsICJzaF90bXUuMyIsICZtc3RwX2Nsa3NbTVNUUDAwOV0pLAorCUNMS0RFVl9JQ0tfSUQoInRtdV9mY2siLCAic2hfdG11LjQiLCAmbXN0cF9jbGtzW01TVFAwMDldKSwKKwlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS41IiwgJm1zdHBfY2xrc1tNU1RQMDA5XSksCisKIAlDTEtERVZfQ09OX0lEKCJzaW9mX2ZjayIsICZtc3RwX2Nsa3NbTVNUUDAwM10pLAogCUNMS0RFVl9DT05fSUQoImhzcGlfZmNrIiwgJm1zdHBfY2xrc1tNU1RQMDAyXSksCiAJQ0xLREVWX0NPTl9JRCgiaHVkaV9mY2siLCAmbXN0cF9jbGtzW01TVFAxMTldKSwKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoNzc4Ni5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3Nzg2LmMKaW5kZXggNDJlNDAzYi4uZjZjMGMzZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3Nzg2LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2g3Nzg2LmMKQEAgLTEyNSw4ICsxMjUsNiBAQAogCVtNU1RQMTAyXSA9IFNIX0NMS19NU1RQMzIoTlVMTCwgTVNUUENSMSwgMiwgMCksCiB9OwogCi0jZGVmaW5lIENMS0RFVl9DT05fSUQoX2lkLCBfY2xrKSB7IC5jb25faWQgPSBfaWQsIC5jbGsgPSBfY2xrIH0KLQogc3RhdGljIHN0cnVjdCBjbGtfbG9va3VwIGxvb2t1cHNbXSA9IHsKIAkvKiBtYWluIGNsb2NrcyAqLwogCUNMS0RFVl9DT05fSUQoImV4dGFsIiwgJmV4dGFsX2NsayksCkBAIC0xNDEsMzcgKzEzOSwxMyBAQAogCUNMS0RFVl9DT05fSUQoImNwdV9jbGsiLCAmZGl2NF9jbGtzW0RJVjRfSV0pLAogCiAJLyogTVNUUDMyIGNsb2NrcyAqLwotCXsKLQkJLyogU0NJRjUgKi8KLQkJLmRldl9pZAkJPSAic2gtc2NpLjUiLAotCQkuY29uX2lkCQk9ICJzY2lfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMjldLAotCX0sIHsKLQkJLyogU0NJRjQgKi8KLQkJLmRldl9pZAkJPSAic2gtc2NpLjQiLAotCQkuY29uX2lkCQk9ICJzY2lfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMjhdLAotCX0sIHsKLQkJLyogU0NJRjMgKi8KLQkJLmRldl9pZAkJPSAic2gtc2NpLjMiLAotCQkuY29uX2lkCQk9ICJzY2lfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMjddLAotCX0sIHsKLQkJLyogU0NJRjIgKi8KLQkJLmRldl9pZAkJPSAic2gtc2NpLjIiLAotCQkuY29uX2lkCQk9ICJzY2lfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMjZdLAotCX0sIHsKLQkJLyogU0NJRjEgKi8KLQkJLmRldl9pZAkJPSAic2gtc2NpLjEiLAotCQkuY29uX2lkCQk9ICJzY2lfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMjVdLAotCX0sIHsKLQkJLyogU0NJRjAgKi8KLQkJLmRldl9pZAkJPSAic2gtc2NpLjAiLAotCQkuY29uX2lkCQk9ICJzY2lfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMjRdLAotCX0sCisJQ0xLREVWX0lDS19JRCgic2NpX2ZjayIsICJzaC1zY2kuNSIsICZtc3RwX2Nsa3NbTVNUUDAyOV0pLAorCUNMS0RFVl9JQ0tfSUQoInNjaV9mY2siLCAic2gtc2NpLjQiLCAmbXN0cF9jbGtzW01TVFAwMjhdKSwKKwlDTEtERVZfSUNLX0lEKCJzY2lfZmNrIiwgInNoLXNjaS4zIiwgJm1zdHBfY2xrc1tNU1RQMDI3XSksCisJQ0xLREVWX0lDS19JRCgic2NpX2ZjayIsICJzaC1zY2kuMiIsICZtc3RwX2Nsa3NbTVNUUDAyNl0pLAorCUNMS0RFVl9JQ0tfSUQoInNjaV9mY2siLCAic2gtc2NpLjEiLCAmbXN0cF9jbGtzW01TVFAwMjVdKSwKKwlDTEtERVZfSUNLX0lEKCJzY2lfZmNrIiwgInNoLXNjaS4wIiwgJm1zdHBfY2xrc1tNU1RQMDI0XSksCisKIAlDTEtERVZfQ09OX0lEKCJzc2kzX2ZjayIsICZtc3RwX2Nsa3NbTVNUUDAyM10pLAogCUNMS0RFVl9DT05fSUQoInNzaTJfZmNrIiwgJm1zdHBfY2xrc1tNU1RQMDIyXSksCiAJQ0xLREVWX0NPTl9JRCgic3NpMV9mY2siLCAmbXN0cF9jbGtzW01TVFAwMjFdKSwKQEAgLTE4MCw2NyArMTU0LDIwIEBACiAJQ0xLREVWX0NPTl9JRCgiaGFjMF9mY2siLCAmbXN0cF9jbGtzW01TVFAwMTZdKSwKIAlDTEtERVZfQ09OX0lEKCJpMmMxX2ZjayIsICZtc3RwX2Nsa3NbTVNUUDAxNV0pLAogCUNMS0RFVl9DT05fSUQoImkyYzBfZmNrIiwgJm1zdHBfY2xrc1tNU1RQMDE0XSksCi0JewotCQkvKiBUTVUwICovCi0JCS5kZXZfaWQJCT0gInNoX3RtdS4wIiwKLQkJLmNvbl9pZAkJPSAidG11X2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDA4XSwKLQl9LCB7Ci0JCS8qIFRNVTEgKi8KLQkJLmRldl9pZAkJPSAic2hfdG11LjEiLAotCQkuY29uX2lkCQk9ICJ0bXVfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMDhdLAotCX0sIHsKLQkJLyogVE1VMiAqLwotCQkuZGV2X2lkCQk9ICJzaF90bXUuMiIsCi0JCS5jb25faWQJCT0gInRtdV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbTVNUUDAwOF0sCi0JfSwgewotCQkvKiBUTVUzICovCi0JCS5kZXZfaWQJCT0gInNoX3RtdS4zIiwKLQkJLmNvbl9pZAkJPSAidG11X2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDA5XSwKLQl9LCB7Ci0JCS8qIFRNVTQgKi8KLQkJLmRldl9pZAkJPSAic2hfdG11LjQiLAotCQkuY29uX2lkCQk9ICJ0bXVfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMDldLAotCX0sIHsKLQkJLyogVE1VNSAqLwotCQkuZGV2X2lkCQk9ICJzaF90bXUuNSIsCi0JCS5jb25faWQJCT0gInRtdV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbTVNUUDAwOV0sCi0JfSwgewotCQkvKiBUTVU2ICovCi0JCS5kZXZfaWQJCT0gInNoX3RtdS42IiwKLQkJLmNvbl9pZAkJPSAidG11X2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDEwXSwKLQl9LCB7Ci0JCS8qIFRNVTcgKi8KLQkJLmRldl9pZAkJPSAic2hfdG11LjciLAotCQkuY29uX2lkCQk9ICJ0bXVfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMTBdLAotCX0sIHsKLQkJLyogVE1VOCAqLwotCQkuZGV2X2lkCQk9ICJzaF90bXUuOCIsCi0JCS5jb25faWQJCT0gInRtdV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbTVNUUDAxMF0sCi0JfSwgewotCQkvKiBUTVU5ICovCi0JCS5kZXZfaWQJCT0gInNoX3RtdS45IiwKLQkJLmNvbl9pZAkJPSAidG11X2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDExXSwKLQl9LCB7Ci0JCS8qIFRNVTEwICovCi0JCS5kZXZfaWQJCT0gInNoX3RtdS4xMCIsCi0JCS5jb25faWQJCT0gInRtdV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbTVNUUDAxMV0sCi0JfSwgewotCQkvKiBUTVUxMSAqLwotCQkuZGV2X2lkCQk9ICJzaF90bXUuMTEiLAotCQkuY29uX2lkCQk9ICJ0bXVfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMTFdLAotCX0sCisKKwlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS4wIiwgJm1zdHBfY2xrc1tNU1RQMDA4XSksCisJQ0xLREVWX0lDS19JRCgidG11X2ZjayIsICJzaF90bXUuMSIsICZtc3RwX2Nsa3NbTVNUUDAwOF0pLAorCUNMS0RFVl9JQ0tfSUQoInRtdV9mY2siLCAic2hfdG11LjIiLCAmbXN0cF9jbGtzW01TVFAwMDhdKSwKKwlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS4zIiwgJm1zdHBfY2xrc1tNU1RQMDA5XSksCisJQ0xLREVWX0lDS19JRCgidG11X2ZjayIsICJzaF90bXUuNCIsICZtc3RwX2Nsa3NbTVNUUDAwOV0pLAorCUNMS0RFVl9JQ0tfSUQoInRtdV9mY2siLCAic2hfdG11LjUiLCAmbXN0cF9jbGtzW01TVFAwMDldKSwKKwlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS42IiwgJm1zdHBfY2xrc1tNU1RQMDEwXSksCisJQ0xLREVWX0lDS19JRCgidG11X2ZjayIsICJzaF90bXUuNyIsICZtc3RwX2Nsa3NbTVNUUDAxMF0pLAorCUNMS0RFVl9JQ0tfSUQoInRtdV9mY2siLCAic2hfdG11LjgiLCAmbXN0cF9jbGtzW01TVFAwMTBdKSwKKwlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS45IiwgJm1zdHBfY2xrc1tNU1RQMDExXSksCisJQ0xLREVWX0lDS19JRCgidG11X2ZjayIsICJzaF90bXUuMTAiLCAmbXN0cF9jbGtzW01TVFAwMTFdKSwKKwlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS4xMSIsICZtc3RwX2Nsa3NbTVNUUDAxMV0pLAorCiAJQ0xLREVWX0NPTl9JRCgic2RpZjFfZmNrIiwgJm1zdHBfY2xrc1tNU1RQMDA1XSksCiAJQ0xLREVWX0NPTl9JRCgic2RpZjBfZmNrIiwgJm1zdHBfY2xrc1tNU1RQMDA0XSksCiAJQ0xLREVWX0NPTl9JRCgiaHNwaV9mY2siLCAmbXN0cF9jbGtzW01TVFAwMDJdKSwKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoeDMuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL2Nsb2NrLXNoeDMuYwppbmRleCAxYWZkYjkzLi5iZjJkMDBiIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9jbG9jay1zaHgzLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvY2xvY2stc2h4My5jCkBAIC0xMDAsOCArMTAwLDYgQEAKIAlbTVNUUDEwNF0gPSBTSF9DTEtfTVNUUDMyKE5VTEwsIE1TVFBDUjEsIDQsIDApLAogfTsKIAotI2RlZmluZSBDTEtERVZfQ09OX0lEKF9pZCwgX2NsaykgeyAuY29uX2lkID0gX2lkLCAuY2xrID0gX2NsayB9Ci0KIHN0YXRpYyBzdHJ1Y3QgY2xrX2xvb2t1cCBsb29rdXBzW10gPSB7CiAJLyogbWFpbiBjbG9ja3MgKi8KIAlDTEtERVZfQ09OX0lEKCJleHRhbCIsICZleHRhbF9jbGspLApAQCAtMTE2LDYyICsxMTQsMjMgQEAKIAlDTEtERVZfQ09OX0lEKCJjcHVfY2xrIiwgJmRpdjRfY2xrc1tESVY0X0ldKSwKIAogCS8qIE1TVFAzMiBjbG9ja3MgKi8KLQl7Ci0JCS8qIFNDSUYzICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS4zIiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDI3XSwKLQl9LCB7Ci0JCS8qIFNDSUYyICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS4yIiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDI2XSwKLQl9LCB7Ci0JCS8qIFNDSUYxICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS4xIiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDI1XSwKLQl9LCB7Ci0JCS8qIFNDSUYwICovCi0JCS5kZXZfaWQJCT0gInNoLXNjaS4wIiwKLQkJLmNvbl9pZAkJPSAic2NpX2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDI0XSwKLQl9LAorCUNMS0RFVl9JQ0tfSUQoInNjaV9mY2siLCAic2gtc2NpLjMiLCAmbXN0cF9jbGtzW01TVFAwMjddKSwKKwlDTEtERVZfSUNLX0lEKCJzY2lfZmNrIiwgInNoLXNjaS4yIiwgJm1zdHBfY2xrc1tNU1RQMDI2XSksCisJQ0xLREVWX0lDS19JRCgic2NpX2ZjayIsICJzaC1zY2kuMSIsICZtc3RwX2Nsa3NbTVNUUDAyNV0pLAorCUNMS0RFVl9JQ0tfSUQoInNjaV9mY2siLCAic2gtc2NpLjAiLCAmbXN0cF9jbGtzW01TVFAwMjRdKSwKKwogCUNMS0RFVl9DT05fSUQoImg4ZXhfZmNrIiwgJm1zdHBfY2xrc1tNU1RQMDAzXSksCiAJQ0xLREVWX0NPTl9JRCgiY3NtX2ZjayIsICZtc3RwX2Nsa3NbTVNUUDAwMl0pLAogCUNMS0RFVl9DT05fSUQoImZlMV9mY2siLCAmbXN0cF9jbGtzW01TVFAwMDFdKSwKIAlDTEtERVZfQ09OX0lEKCJmZTBfZmNrIiwgJm1zdHBfY2xrc1tNU1RQMDAwXSksCi0JewotCQkvKiBUTVUwICovCi0JCS5kZXZfaWQJCT0gInNoX3RtdS4wIiwKLQkJLmNvbl9pZAkJPSAidG11X2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDA4XSwKLQl9LCB7Ci0JCS8qIFRNVTEgKi8KLQkJLmRldl9pZAkJPSAic2hfdG11LjEiLAotCQkuY29uX2lkCQk9ICJ0bXVfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMDhdLAotCX0sIHsKLQkJLyogVE1VMiAqLwotCQkuZGV2X2lkCQk9ICJzaF90bXUuMiIsCi0JCS5jb25faWQJCT0gInRtdV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbTVNUUDAwOF0sCi0JfSwgewotCQkvKiBUTVUzICovCi0JCS5kZXZfaWQJCT0gInNoX3RtdS4zIiwKLQkJLmNvbl9pZAkJPSAidG11X2ZjayIsCi0JCS5jbGsJCT0gJm1zdHBfY2xrc1tNU1RQMDA5XSwKLQl9LCB7Ci0JCS8qIFRNVTQgKi8KLQkJLmRldl9pZAkJPSAic2hfdG11LjQiLAotCQkuY29uX2lkCQk9ICJ0bXVfZmNrIiwKLQkJLmNsawkJPSAmbXN0cF9jbGtzW01TVFAwMDldLAotCX0sIHsKLQkJLyogVE1VNSAqLwotCQkuZGV2X2lkCQk9ICJzaF90bXUuNSIsCi0JCS5jb25faWQJCT0gInRtdV9mY2siLAotCQkuY2xrCQk9ICZtc3RwX2Nsa3NbTVNUUDAwOV0sCi0JfSwKKworCUNMS0RFVl9JQ0tfSUQoInRtdV9mY2siLCAic2hfdG11LjAiLCAmbXN0cF9jbGtzW01TVFAwMDhdKSwKKwlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS4xIiwgJm1zdHBfY2xrc1tNU1RQMDA4XSksCisJQ0xLREVWX0lDS19JRCgidG11X2ZjayIsICJzaF90bXUuMiIsICZtc3RwX2Nsa3NbTVNUUDAwOF0pLAorCUNMS0RFVl9JQ0tfSUQoInRtdV9mY2siLCAic2hfdG11LjMiLCAmbXN0cF9jbGtzW01TVFAwMDldKSwKKwlDTEtERVZfSUNLX0lEKCJ0bXVfZmNrIiwgInNoX3RtdS40IiwgJm1zdHBfY2xrc1tNU1RQMDA5XSksCisJQ0xLREVWX0lDS19JRCgidG11X2ZjayIsICJzaF90bXUuNSIsICZtc3RwX2Nsa3NbTVNUUDAwOV0pLAorCiAJQ0xLREVWX0NPTl9JRCgiaHVkaV9mY2siLCAmbXN0cF9jbGtzW01TVFAxMTldKSwKIAlDTEtERVZfQ09OX0lEKCJkbWFjXzExXzZfZmNrIiwgJm1zdHBfY2xrc1tNU1RQMTA1XSksCiAJQ0xLREVWX0NPTl9JRCgiZG1hY181XzBfZmNrIiwgJm1zdHBfY2xrc1tNU1RQMTA0XSksCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXJpYWwtc2g3NzIyLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXJpYWwtc2g3NzIyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTliYzNhNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NlcmlhbC1zaDc3MjIuYwpAQCAtMCwwICsxLDIzIEBACisjaW5jbHVkZSA8bGludXgvc2VyaWFsX3NjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbF9jb3JlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2RlZmluZSBQU0NSIDB4QTQwNTAxMUUKKworc3RhdGljIHZvaWQgc2g3NzIyX3NjaV9pbml0X3BpbnMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IGNmbGFnKQoreworCXVuc2lnbmVkIHNob3J0IGRhdGE7CisKKwlpZiAocG9ydC0+bWFwYmFzZSA9PSAweGZmZTAwMDAwKSB7CisJCWRhdGEgPSBfX3Jhd19yZWFkdyhQU0NSKTsKKwkJZGF0YSAmPSB+MHgwM2NmOworCQlpZiAoIShjZmxhZyAmIENSVFNDVFMpKQorCQkJZGF0YSB8PSAweDAzNDA7CisKKwkJX19yYXdfd3JpdGV3KGRhdGEsIFBTQ1IpOworCX0KK30KKworc3RydWN0IHBsYXRfc2NpX3BvcnRfb3BzIHNoNzcyMl9zY2lfcG9ydF9vcHMgPSB7CisJLmluaXRfcGlucwk9IHNoNzcyMl9zY2lfaW5pdF9waW5zLAorfTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzM2Ni5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3MzY2LmMKaW5kZXggODI2MTZhZi4uODc3NzM4NiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3MzY2LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3MzY2LmMKQEAgLTIwLDYgKzIwLDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWYwX3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UJPSAweGZmZTAwMDAwLAorCS5wb3J0X3JlZwk9IDB4YTQwNTAxM2UsCiAJLmZsYWdzCQk9IFVQRl9CT09UX0FVVE9DT05GLAogCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyMi5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzIyLmMKaW5kZXggNTgxM2Q4MC4uMjc4YTBlNSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzIyLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzIyLmMKQEAgLTIyLDYgKzIyLDcgQEAKIAogI2luY2x1ZGUgPGNwdS9kbWEtcmVnaXN0ZXIuaD4KICNpbmNsdWRlIDxjcHUvc2g3NzIyLmg+CisjaW5jbHVkZSA8Y3B1L3NlcmlhbC5oPgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNoX2RtYWVfc2xhdmVfY29uZmlnIHNoNzcyMl9kbWFlX3NsYXZlc1tdID0gewogCXsKQEAgLTE4NSw2ICsxODYsOCBAQAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlICAgICAgICAgICA9IFBPUlRfU0NJRiwKIAkuaXJxcyAgICAgICAgICAgPSB7IDgwLCA4MCwgODAsIDgwIH0sCisJLm9wcwkJPSAmc2g3NzIyX3NjaV9wb3J0X29wcywKKwkucmVndHlwZQk9IFNDSXhfU0g0X1NDSUZfTk9fU0NTUFRSX1JFR1RZUEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmMF9kZXZpY2UgPSB7CkBAIC0yMDIsNiArMjA1LDggQEAKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZSAgICAgICAgICAgPSBQT1JUX1NDSUYsCiAJLmlycXMgICAgICAgICAgID0geyA4MSwgODEsIDgxLCA4MSB9LAorCS5vcHMJCT0gJnNoNzcyMl9zY2lfcG9ydF9vcHMsCisJLnJlZ3R5cGUJPSBTQ0l4X1NINF9TQ0lGX05PX1NDU1BUUl9SRUdUWVBFLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpZjFfZGV2aWNlID0gewpAQCAtMjE5LDYgKzIyNCw4IEBACiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUgICAgICAgICAgID0gUE9SVF9TQ0lGLAogCS5pcnFzICAgICAgICAgICA9IHsgODIsIDgyLCA4MiwgODIgfSwKKwkub3BzCQk9ICZzaDc3MjJfc2NpX3BvcnRfb3BzLAorCS5yZWd0eXBlCT0gU0NJeF9TSDRfU0NJRl9OT19TQ1NQVFJfUkVHVFlQRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWYyX2RldmljZSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyMy5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzIzLmMKaW5kZXggMDcyMzgyMi4uM2MyODEwZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzIzLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzIzLmMKQEAgLTIzLDExICsyMywxMyBAQAogLyogU2VyaWFsICovCiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjBfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZSAgICAgICAgPSAweGZmZTAwMDAwLAorCS5wb3J0X3JlZwk9IDB4YTQwNTAxNjAsCiAJLmZsYWdzICAgICAgICAgID0gVVBGX0JPT1RfQVVUT0NPTkYsCiAJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUgfCBTQ1NDUl9SRUlFLAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlICAgICAgICAgICA9IFBPUlRfU0NJRiwKIAkuaXJxcyAgICAgICAgICAgPSB7IDgwLCA4MCwgODAsIDgwIH0sCisJLnJlZ3R5cGUJPSBTQ0l4X1NINF9TQ0lGX05PX1NDU1BUUl9SRUdUWVBFLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpZjBfZGV2aWNlID0gewpAQCAtNDAsMTEgKzQyLDEzIEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMV9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlICAgICAgICA9IDB4ZmZlMTAwMDAsCisJLnBvcnRfcmVnCT0gU0NJeF9OT1RfU1VQUE9SVEVELAogCS5mbGFncyAgICAgICAgICA9IFVQRl9CT09UX0FVVE9DT05GLAogCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZSAgICAgICAgICAgPSBQT1JUX1NDSUYsCiAJLmlycXMgICAgICAgICAgID0geyA4MSwgODEsIDgxLCA4MSB9LAorCS5yZWd0eXBlCT0gU0NJeF9TSDRfU0NJRl9OT19TQ1NQVFJfUkVHVFlQRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWYxX2RldmljZSA9IHsKQEAgLTU3LDExICs2MSwxMyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjJfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZSAgICAgICAgPSAweGZmZTIwMDAwLAorCS5wb3J0X3JlZwk9IFNDSXhfTk9UX1NVUFBPUlRFRCwKIAkuZmxhZ3MgICAgICAgICAgPSBVUEZfQk9PVF9BVVRPQ09ORiwKIAkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUsCiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUgICAgICAgICAgID0gUE9SVF9TQ0lGLAogCS5pcnFzICAgICAgICAgICA9IHsgODIsIDgyLCA4MiwgODIgfSwKKwkucmVndHlwZQk9IFNDSXhfU0g0X1NDSUZfTk9fU0NTUFRSX1JFR1RZUEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmMl9kZXZpY2UgPSB7CkBAIC03NSw2ICs4MSw3IEBACiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjNfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZSAgICAgICAgPSAweGE0ZTMwMDAwLAogCS5mbGFncyAgICAgICAgICA9IFVQRl9CT09UX0FVVE9DT05GLAorCS5wb3J0X3JlZwk9IFNDSXhfTk9UX1NVUFBPUlRFRCwKIAkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSB8IFNDU0NSX1JFSUUsCiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzMsCiAJLnR5cGUgICAgICAgICAgID0gUE9SVF9TQ0lGQSwKQEAgLTkxLDYgKzk4LDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0X3NjaV9wb3J0IHNjaWY0X3BsYXRmb3JtX2RhdGEgPSB7CiAJLm1hcGJhc2UgICAgICAgID0gMHhhNGU0MDAwMCwKKwkucG9ydF9yZWcJPSBTQ0l4X05PVF9TVVBQT1JURUQsCiAJLmZsYWdzICAgICAgICAgID0gVVBGX0JPT1RfQVVUT0NPTkYsCiAJLnNjc2NyCQk9IFNDU0NSX1JFIHwgU0NTQ1JfVEUgfCBTQ1NDUl9SRUlFLAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18zLApAQCAtMTA4LDYgKzExNiw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmNV9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlICAgICAgICA9IDB4YTRlNTAwMDAsCisJLnBvcnRfcmVnCT0gU0NJeF9OT1RfU1VQUE9SVEVELAogCS5mbGFncyAgICAgICAgICA9IFVQRl9CT09UX0FVVE9DT05GLAogCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMywKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzcyNC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzI0LmMKaW5kZXggMTM0YTM5Ny4uYTM3ZGQ3MiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzI0LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzI0LmMKQEAgLTI5NiwxMSArMjk2LDEzIEBACiAvKiBTZXJpYWwgKi8KIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMF9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlICAgICAgICA9IDB4ZmZlMDAwMDAsCisJLnBvcnRfcmVnCT0gU0NJeF9OT1RfU1VQUE9SVEVELAogCS5mbGFncyAgICAgICAgICA9IFVQRl9CT09UX0FVVE9DT05GLAogCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZSAgICAgICAgICAgPSBQT1JUX1NDSUYsCiAJLmlycXMgICAgICAgICAgID0geyA4MCwgODAsIDgwLCA4MCB9LAorCS5yZWd0eXBlCT0gU0NJeF9TSDRfU0NJRl9OT19TQ1NQVFJfUkVHVFlQRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWYwX2RldmljZSA9IHsKQEAgLTMxMywxMSArMzE1LDEzIEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMV9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlICAgICAgICA9IDB4ZmZlMTAwMDAsCisJLnBvcnRfcmVnCT0gU0NJeF9OT1RfU1VQUE9SVEVELAogCS5mbGFncyAgICAgICAgICA9IFVQRl9CT09UX0FVVE9DT05GLAogCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZSAgICAgICAgICAgPSBQT1JUX1NDSUYsCiAJLmlycXMgICAgICAgICAgID0geyA4MSwgODEsIDgxLCA4MSB9LAorCS5yZWd0eXBlCT0gU0NJeF9TSDRfU0NJRl9OT19TQ1NQVFJfUkVHVFlQRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWYxX2RldmljZSA9IHsKQEAgLTMzMCwxMSArMzM0LDEzIEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMl9wbGF0Zm9ybV9kYXRhID0gewogCS5tYXBiYXNlICAgICAgICA9IDB4ZmZlMjAwMDAsCisJLnBvcnRfcmVnCT0gU0NJeF9OT1RfU1VQUE9SVEVELAogCS5mbGFncyAgICAgICAgICA9IFVQRl9CT09UX0FVVE9DT05GLAogCS5zY3NjcgkJPSBTQ1NDUl9SRSB8IFNDU0NSX1RFIHwgU0NTQ1JfUkVJRSwKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZSAgICAgICAgICAgPSBQT1JUX1NDSUYsCiAJLmlycXMgICAgICAgICAgID0geyA4MiwgODIsIDgyLCA4MiB9LAorCS5yZWd0eXBlCT0gU0NJeF9TSDRfU0NJRl9OT19TQ1NQVFJfUkVHVFlQRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWYyX2RldmljZSA9IHsKQEAgLTM0Nyw2ICszNTMsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjNfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZSAgICAgICAgPSAweGE0ZTMwMDAwLAorCS5wb3J0X3JlZwk9IFNDSXhfTk9UX1NVUFBPUlRFRCwKIAkuZmxhZ3MgICAgICAgICAgPSBVUEZfQk9PVF9BVVRPQ09ORiwKIAkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMywKQEAgLTM2NCw2ICszNzEsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjRfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZSAgICAgICAgPSAweGE0ZTQwMDAwLAorCS5wb3J0X3JlZwk9IFNDSXhfTk9UX1NVUFBPUlRFRCwKIAkuZmxhZ3MgICAgICAgICAgPSBVUEZfQk9PVF9BVVRPQ09ORiwKIAkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMywKQEAgLTM4MSw2ICszODksNyBAQAogCiBzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3BvcnQgc2NpZjVfcGxhdGZvcm1fZGF0YSA9IHsKIAkubWFwYmFzZSAgICAgICAgPSAweGE0ZTUwMDAwLAorCS5wb3J0X3JlZwk9IFNDSXhfTk9UX1NVUFBPUlRFRCwKIAkuZmxhZ3MgICAgICAgICAgPSBVUEZfQk9PVF9BVVRPQ09ORiwKIAkuc2NzY3IJCT0gU0NTQ1JfUkUgfCBTQ1NDUl9URSwKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMywKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc2My5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzYzLmMKaW5kZXggNTkzZWNhNi4uMDAxMTM1MSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzYzLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3NzYzLmMKQEAgLTIzLDYgKzIzLDcgQEAKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMiwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyA0MCwgNDAsIDQwLCA0MCB9LAorCS5yZWd0eXBlCT0gU0NJeF9TSDRfU0NJRl9GSUZPREFUQV9SRUdUWVBFLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpZjBfZGV2aWNlID0gewpAQCAtNDAsNiArNDEsNyBAQAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18yLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDc2LCA3NiwgNzYsIDc2IH0sCisJLnJlZ3R5cGUJPSBTQ0l4X1NINF9TQ0lGX0ZJRk9EQVRBX1JFR1RZUEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmMV9kZXZpY2UgPSB7CkBAIC01Nyw2ICs1OSw3IEBACiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzIsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgMTA0LCAxMDQsIDEwNCwgMTA0IH0sCisJLnJlZ3R5cGUJPSBTQ0l4X1NINF9TQ0lGX0ZJRk9EQVRBX1JFR1RZUEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmMl9kZXZpY2UgPSB7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4MC5jCmluZGV4IDA4YWRkN2YuLjNkNGQyMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4MC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4MC5jCkBAIC0xNCw3ICsxNCw2IEBACiAjaW5jbHVkZSA8bGludXgvc2VyaWFsX3NjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NoX2RtYS5oPgogI2luY2x1ZGUgPGxpbnV4L3NoX3RpbWVyLmg+Ci0KICNpbmNsdWRlIDxjcHUvZG1hLXJlZ2lzdGVyLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMF9wbGF0Zm9ybV9kYXRhID0gewpAQCAtMjQsNiArMjMsNyBAQAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18xLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDQwLCA0MCwgNDAsIDQwIH0sCisJLnJlZ3R5cGUJPSBTQ0l4X1NINF9TQ0lGX0ZJRk9EQVRBX1JFR1RZUEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmMF9kZXZpY2UgPSB7CkBAIC00MSw2ICs0MSw3IEBACiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzEsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgNzYsIDc2LCA3NiwgNzYgfSwKKwkucmVndHlwZQk9IFNDSXhfU0g0X1NDSUZfRklGT0RBVEFfUkVHVFlQRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWYxX2RldmljZSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4NS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3Nzg1LmMKaW5kZXggMThkOGZjMS4uYjI5ZTYzNCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3Nzg1LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNGEvc2V0dXAtc2g3Nzg1LmMKQEAgLTE1LDkgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NoX2RtYS5oPgogI2luY2x1ZGUgPGxpbnV4L3NoX3RpbWVyLmg+Ci0KICNpbmNsdWRlIDxhc20vbW16b25lLmg+Ci0KICNpbmNsdWRlIDxjcHUvZG1hLXJlZ2lzdGVyLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lmMF9wbGF0Zm9ybV9kYXRhID0gewpAQCAtMjcsNiArMjUsNyBAQAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18xLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDQwLCA0MCwgNDAsIDQwIH0sCisJLnJlZ3R5cGUJPSBTQ0l4X1NINF9TQ0lGX0ZJRk9EQVRBX1JFR1RZUEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmMF9kZXZpY2UgPSB7CkBAIC00NCw2ICs0Myw3IEBACiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzEsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgNDQsIDQ0LCA0NCwgNDQgfSwKKwkucmVndHlwZQk9IFNDSXhfU0g0X1NDSUZfRklGT0RBVEFfUkVHVFlQRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWYxX2RldmljZSA9IHsKQEAgLTYxLDYgKzYxLDcgQEAKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMSwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyA2MCwgNjAsIDYwLCA2MCB9LAorCS5yZWd0eXBlCT0gU0NJeF9TSDRfU0NJRl9GSUZPREFUQV9SRUdUWVBFLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpZjJfZGV2aWNlID0gewpAQCAtNzgsNiArNzksNyBAQAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18xLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDYxLCA2MSwgNjEsIDYxIH0sCisJLnJlZ3R5cGUJPSBTQ0l4X1NINF9TQ0lGX0ZJRk9EQVRBX1JFR1RZUEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmM19kZXZpY2UgPSB7CkBAIC05NSw2ICs5Nyw3IEBACiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzEsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgNjIsIDYyLCA2MiwgNjIgfSwKKwkucmVndHlwZQk9IFNDSXhfU0g0X1NDSUZfRklGT0RBVEFfUkVHVFlQRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWY0X2RldmljZSA9IHsKQEAgLTExMiw2ICsxMTUsNyBAQAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18xLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDYzLCA2MywgNjMsIDYzIH0sCisJLnJlZ3R5cGUJPSBTQ0l4X1NINF9TQ0lGX0ZJRk9EQVRBX1JFR1RZUEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmNV9kZXZpY2UgPSB7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0YS9zZXR1cC1zaDc3ODYuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4Ni5jCmluZGV4IGJlYmEzMmIuLmRkNWU3MDkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4Ni5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDRhL3NldHVwLXNoNzc4Ni5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIFNINzc4NiBTZXR1cAogICoKLSAqIENvcHlyaWdodCAoQykgMjAwOSAtIDIwMTAgIFJlbmVzYXMgU29sdXRpb25zIENvcnAuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgLSAyMDExICBSZW5lc2FzIFNvbHV0aW9ucyBDb3JwLgogICogS3VuaW5vcmkgTW9yaW1vdG8gPG1vcmltb3RvLmt1bmlub3JpQHJlbmVzYXMuY29tPgogICogUGF1bCBNdW5kdCA8cGF1bC5tdW5kdEByZW5lc2FzLmNvbT4KICAqCkBAIC0zMyw2ICszMyw3IEBACiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzEsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgNDAsIDQxLCA0MywgNDIgfSwKKwkucmVndHlwZQk9IFNDSXhfU0g0X1NDSUZfRklGT0RBVEFfUkVHVFlQRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWYwX2RldmljZSA9IHsKQEAgLTUzLDYgKzU0LDcgQEAKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMSwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyA0NCwgNDQsIDQ0LCA0NCB9LAorCS5yZWd0eXBlCT0gU0NJeF9TSDRfU0NJRl9GSUZPREFUQV9SRUdUWVBFLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpZjFfZGV2aWNlID0gewpAQCAtNzAsNiArNzIsNyBAQAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18xLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDUwLCA1MCwgNTAsIDUwIH0sCisJLnJlZ3R5cGUJPSBTQ0l4X1NINF9TQ0lGX0ZJRk9EQVRBX1JFR1RZUEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmMl9kZXZpY2UgPSB7CkBAIC04Nyw2ICs5MCw3IEBACiAJLnNjYnJyX2FsZ29faWQJPSBTQ0JSUl9BTEdPXzEsCiAJLnR5cGUJCT0gUE9SVF9TQ0lGLAogCS5pcnFzCQk9IHsgNTEsIDUxLCA1MSwgNTEgfSwKKwkucmVndHlwZQk9IFNDSXhfU0g0X1NDSUZfRklGT0RBVEFfUkVHVFlQRSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHNjaWYzX2RldmljZSA9IHsKQEAgLTEwNCw2ICsxMDgsNyBAQAogCS5zY2Jycl9hbGdvX2lkCT0gU0NCUlJfQUxHT18xLAogCS50eXBlCQk9IFBPUlRfU0NJRiwKIAkuaXJxcwkJPSB7IDUyLCA1MiwgNTIsIDUyIH0sCisJLnJlZ3R5cGUJPSBTQ0l4X1NINF9TQ0lGX0ZJRk9EQVRBX1JFR1RZUEUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBzY2lmNF9kZXZpY2UgPSB7CkBAIC0xMjEsNiArMTI2LDcgQEAKIAkuc2NicnJfYWxnb19pZAk9IFNDQlJSX0FMR09fMSwKIAkudHlwZQkJPSBQT1JUX1NDSUYsCiAJLmlycXMJCT0geyA1MywgNTMsIDUzLCA1MyB9LAorCS5yZWd0eXBlCT0gU0NJeF9TSDRfU0NJRl9GSUZPREFUQV9SRUdUWVBFLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ugc2NpZjVfZGV2aWNlID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvaWRsZS5jIGIvYXJjaC9zaC9rZXJuZWwvaWRsZS5jCmluZGV4IDg0ZGIwZDYuLjMyMTE0ZTAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2lkbGUuYworKysgYi9hcmNoL3NoL2tlcm5lbC9pZGxlLmMKQEAgLTE2LDEyICsxNiwxMyBAQAogI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KICNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVpZGxlLmg+CiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8bGludXgvYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogCi12b2lkICgqcG1faWRsZSkodm9pZCkgPSBOVUxMOworc3RhdGljIHZvaWQgKCpwbV9pZGxlKSh2b2lkKTsKIAogc3RhdGljIGludCBobHRfY291bnRlcjsKIApAQCAtMTAwLDcgKzEwMSw4IEBACiAJCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCQkJLyogRG9uJ3QgdHJhY2UgaXJxcyBvZmYgZm9yIGlkbGUgKi8KIAkJCXN0b3BfY3JpdGljYWxfdGltaW5ncygpOwotCQkJcG1faWRsZSgpOworCQkJaWYgKGNwdWlkbGVfaWRsZV9jYWxsKCkpCisJCQkJcG1faWRsZSgpOwogCQkJLyoKIAkJCSAqIFNhbml0eSBjaGVjayB0byBlbnN1cmUgdGhhdCBwbV9pZGxlKCkgcmV0dXJucwogCQkJICogd2l0aCBJUlFzIGVuYWJsZWQKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvS2NvbmZpZyBiL2FyY2gvc3BhcmMvS2NvbmZpZwppbmRleCAxMDc0ZGRkLi40MmM2N2JlIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL0tjb25maWcKKysrIGIvYXJjaC9zcGFyYy9LY29uZmlnCkBAIC01NCw2ICs1NCw3IEBACiAJc2VsZWN0IEhBVkVfUEVSRl9FVkVOVFMKIAlzZWxlY3QgUEVSRl9VU0VfVk1BTExPQwogCXNlbGVjdCBJUlFfUFJFRkxPV19GQVNURU9JCisJc2VsZWN0IEFSQ0hfSEFWRV9OTUlfU0FGRV9DTVBYQ0hHCiAKIGNvbmZpZyBBUkNIX0RFRkNPTkZJRwogCXN0cmluZwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9sZW9uX3BjaS5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9sZW9uX3BjaS5oCmluZGV4IDQyYjRiMzEuLmY0ODUyN2UgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vbGVvbl9wY2kuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL2xlb25fcGNpLmgKQEAgLTEyLDcgKzEyLDcgQEAKIAlzdHJ1Y3QgcGNpX29wcyAqb3BzOwogCXN0cnVjdCByZXNvdXJjZQlpb19zcGFjZTsKIAlzdHJ1Y3QgcmVzb3VyY2UJbWVtX3NwYWNlOwotCWludCAoKm1hcF9pcnEpKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbik7CisJaW50ICgqbWFwX2lycSkoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKTsKIH07CiAKIGV4dGVybiB2b2lkIGxlb25fcGNpX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqb2ZkZXYsCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9pb3BvcnQuYyBiL2FyY2gvc3BhcmMva2VybmVsL2lvcG9ydC5jCmluZGV4IDZmZmNjZDYuLmQwNDc5ZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2lvcG9ydC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL2lvcG9ydC5jCkBAIC02NSw5ICs2NSw2IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSAqX3NwYXJjX2ZpbmRfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpyLAotCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcpOwotCiBzdGF0aWMgdm9pZCBfX2lvbWVtICpfc3BhcmNfaW9yZW1hcChzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgdTMyIGJ1cywgdTMyIHBhLCBpbnQgc3opOwogc3RhdGljIHZvaWQgX19pb21lbSAqX3NwYXJjX2FsbG9jX2lvKHVuc2lnbmVkIGludCBidXNubywgdW5zaWduZWQgbG9uZyBwaHlzLAogICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgY2hhciAqbmFtZSk7CkBAIC0xNDMsNyArMTQwLDExIEBACiAJdW5zaWduZWQgbG9uZyB2YWRkciA9ICh1bnNpZ25lZCBsb25nKSB2aXJ0dWFsICYgUEFHRV9NQVNLOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCi0JaWYgKChyZXMgPSBfc3BhcmNfZmluZF9yZXNvdXJjZSgmc3BhcmNfaW9tYXAsIHZhZGRyKSkgPT0gTlVMTCkgeworCS8qCisJICogWFhYIFRvbyBzbG93LiBDYW4gaGF2ZSA4MTkyIERWTUEgcGFnZXMgb24gc3VuNG0gaW4gdGhlIHdvcnN0IGNhc2UuCisJICogVGhpcyBwcm9iYWJseSB3YXJyYW50cyBzb21lIHNvcnQgb2YgaGFzaGluZy4KKwkqLworCWlmICgocmVzID0gbG9va3VwX3Jlc291cmNlKCZzcGFyY19pb21hcCwgdmFkZHIpKSA9PSBOVUxMKSB7CiAJCXByaW50aygiZnJlZV9pby9pb3VubWFwOiBjYW5ub3QgZnJlZSAlbHhcbiIsIHZhZGRyKTsKIAkJcmV0dXJuOwogCX0KQEAgLTMxOSw3ICszMjAsNyBAQAogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCXN0cnVjdCBwYWdlICpwZ3Y7CiAKLQlpZiAoKHJlcyA9IF9zcGFyY19maW5kX3Jlc291cmNlKCZfc3BhcmNfZHZtYSwKKwlpZiAoKHJlcyA9IGxvb2t1cF9yZXNvdXJjZSgmX3NwYXJjX2R2bWEsCiAJICAgICh1bnNpZ25lZCBsb25nKXApKSA9PSBOVUxMKSB7CiAJCXByaW50aygic2J1c19mcmVlX2NvbnNpc3RlbnQ6IGNhbm5vdCBmcmVlICVwXG4iLCBwKTsKIAkJcmV0dXJuOwpAQCAtNDkyLDcgKzQ5Myw3IEBACiB7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAKLQlpZiAoKHJlcyA9IF9zcGFyY19maW5kX3Jlc291cmNlKCZfc3BhcmNfZHZtYSwKKwlpZiAoKHJlcyA9IGxvb2t1cF9yZXNvdXJjZSgmX3NwYXJjX2R2bWEsCiAJICAgICh1bnNpZ25lZCBsb25nKXApKSA9PSBOVUxMKSB7CiAJCXByaW50aygicGNpX2ZyZWVfY29uc2lzdGVudDogY2Fubm90IGZyZWUgJXBcbiIsIHApOwogCQlyZXR1cm47CkBAIC03MTUsMjUgKzcxNiw2IEBACiB9OwogI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCiAKLS8qCi0gKiBUaGlzIGlzIGEgdmVyc2lvbiBvZiBmaW5kX3Jlc291cmNlIGFuZCBpdCBiZWxvbmdzIHRvIGtlcm5lbC9yZXNvdXJjZS5jLgotICogVW50aWwgd2UgaGF2ZSBhZ3JlZW1lbnQgd2l0aCBMaW51cyBhbmQgTWFydGluLCBpdCBsaW5nZXJzIGhlcmUuCi0gKgotICogWFhYIFRvbyBzbG93LiBDYW4gaGF2ZSA4MTkyIERWTUEgcGFnZXMgb24gc3VuNG0gaW4gdGhlIHdvcnN0IGNhc2UuCi0gKiBUaGlzIHByb2JhYmx5IHdhcnJhbnRzIHNvbWUgc29ydCBvZiBoYXNoaW5nLgotICovCi1zdGF0aWMgc3RydWN0IHJlc291cmNlICpfc3BhcmNfZmluZF9yZXNvdXJjZShzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QsCi0JCQkJCSAgICAgdW5zaWduZWQgbG9uZyBoaXQpCi17Ci0Jc3RydWN0IHJlc291cmNlICp0bXA7Ci0KLQlmb3IgKHRtcCA9IHJvb3QtPmNoaWxkOyB0bXAgIT0gMDsgdG1wID0gdG1wLT5zaWJsaW5nKSB7Ci0JCWlmICh0bXAtPnN0YXJ0IDw9IGhpdCAmJiB0bXAtPmVuZCA+PSBoaXQpCi0JCQlyZXR1cm4gdG1wOwotCX0KLQlyZXR1cm4gTlVMTDsKLX0KLQogc3RhdGljIHZvaWQgcmVnaXN0ZXJfcHJvY19zcGFyY19pb3BvcnQodm9pZCkKIHsKICNpZmRlZiBDT05GSUdfUFJPQ19GUwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvbGVvbl9wY2lfZ3JwY2kyLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9sZW9uX3BjaV9ncnBjaTIuYwppbmRleCA0NGRjMDkzLi5mYWQxYmQwIDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2tlcm5lbC9sZW9uX3BjaV9ncnBjaTIuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9sZW9uX3BjaV9ncnBjaTIuYwpAQCAtMjE1LDcgKzIxNSw3IEBACiBERUZJTkVfU1BJTkxPQ0soZ3JwY2kyX2Rldl9sb2NrKTsKIHN0cnVjdCBncnBjaTJfcHJpdiAqZ3JwY2kycHJpdjsKIAotaW50IGdycGNpMl9tYXBfaXJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKK2ludCBncnBjaTJfbWFwX2lycShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCiB7CiAJc3RydWN0IGdycGNpMl9wcml2ICpwcml2ID0gZGV2LT5idXMtPnN5c2RhdGE7CiAJaW50IGlycV9ncm91cDsKZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9LY29uZmlnIGIvYXJjaC90aWxlL0tjb25maWcKaW5kZXggMDI0OWI4Yi4uYjMwZjcxYSAxMDA2NDQKLS0tIGEvYXJjaC90aWxlL0tjb25maWcKKysrIGIvYXJjaC90aWxlL0tjb25maWcKQEAgLTEyLDYgKzEyLDcgQEAKIAlzZWxlY3QgR0VORVJJQ19QRU5ESU5HX0lSUSBpZiBTTVAKIAlzZWxlY3QgR0VORVJJQ19JUlFfU0hPVwogCXNlbGVjdCBTWVNfSFlQRVJWSVNPUgorCXNlbGVjdCBBUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRyBpZiAhTTM4NgogCiAjIEZJWE1FOiBpbnZlc3RpZ2F0ZSB3aGV0aGVyIHdlIG5lZWQvd2FudCB0aGVzZSBvcHRpb25zLgogIwlzZWxlY3QgSEFWRV9JT1JFTUFQX1BST1QKZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9LYnVpbGQgYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vS2J1aWxkCmluZGV4IDg0OWFiMmYuLmFlYzYwZGMgMTAwNjQ0Ci0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9LYnVpbGQKKysrIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL0tidWlsZApAQCAtMiwzICsyLDQxIEBACiAKIGhlYWRlci15ICs9IHVjb250ZXh0LmgKIGhlYWRlci15ICs9IGhhcmR3YWxsLmgKKworZ2VuZXJpYy15ICs9IGJ1Zy5oCitnZW5lcmljLXkgKz0gYnVncy5oCitnZW5lcmljLXkgKz0gY3B1dGltZS5oCitnZW5lcmljLXkgKz0gZGV2aWNlLmgKK2dlbmVyaWMteSArPSBkaXY2NC5oCitnZW5lcmljLXkgKz0gZW1lcmdlbmN5LXJlc3RhcnQuaAorZ2VuZXJpYy15ICs9IGVycm5vLmgKK2dlbmVyaWMteSArPSBmYi5oCitnZW5lcmljLXkgKz0gZmNudGwuaAorZ2VuZXJpYy15ICs9IGlvY3RsLmgKK2dlbmVyaWMteSArPSBpb2N0bHMuaAorZ2VuZXJpYy15ICs9IGlwYy5oCitnZW5lcmljLXkgKz0gaXBjYnVmLmgKK2dlbmVyaWMteSArPSBpcnFfcmVncy5oCitnZW5lcmljLXkgKz0ga2RlYnVnLmgKK2dlbmVyaWMteSArPSBsb2NhbC5oCitnZW5lcmljLXkgKz0gbW9kdWxlLmgKK2dlbmVyaWMteSArPSBtc2didWYuaAorZ2VuZXJpYy15ICs9IG11dGV4LmgKK2dlbmVyaWMteSArPSBwYXJhbS5oCitnZW5lcmljLXkgKz0gcGFycG9ydC5oCitnZW5lcmljLXkgKz0gcG9sbC5oCitnZW5lcmljLXkgKz0gcG9zaXhfdHlwZXMuaAorZ2VuZXJpYy15ICs9IHJlc291cmNlLmgKK2dlbmVyaWMteSArPSBzY2F0dGVybGlzdC5oCitnZW5lcmljLXkgKz0gc2VtYnVmLmgKK2dlbmVyaWMteSArPSBzZXJpYWwuaAorZ2VuZXJpYy15ICs9IHNobWJ1Zi5oCitnZW5lcmljLXkgKz0gc2htcGFyYW0uaAorZ2VuZXJpYy15ICs9IHNvY2tldC5oCitnZW5lcmljLXkgKz0gc29ja2lvcy5oCitnZW5lcmljLXkgKz0gc3RhdGZzLmgKK2dlbmVyaWMteSArPSB0ZXJtYml0cy5oCitnZW5lcmljLXkgKz0gdGVybWlvcy5oCitnZW5lcmljLXkgKz0gdHlwZXMuaAorZ2VuZXJpYy15ICs9IHVjb250ZXh0LmgKK2dlbmVyaWMteSArPSB4b3IuaApkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2J1Zy5oIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2J1Zy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTJmZDg5Li4wMDAwMDAwCi0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9idWcuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9idWcuaD4KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9idWdzLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vYnVncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTc5MWUxLi4wMDAwMDAwCi0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9idWdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvYnVncy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2NwdXRpbWUuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9jcHV0aW1lLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNjhhZDcuLjAwMDAwMDAKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2NwdXRpbWUuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9jcHV0aW1lLmg+CmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vZGV2aWNlLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vZGV2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwYTRjMjUuLjAwMDAwMDAKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2RldmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2RldmljZS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2RpdjY0LmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vZGl2NjQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNkOTc4Yy4uMDAwMDAwMAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vZGl2NjQuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9kaXY2NC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2VtZXJnZW5jeS1yZXN0YXJ0LmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vZW1lcmdlbmN5LXJlc3RhcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcxMWJkOS4uMDAwMDAwMAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vZW1lcmdlbmN5LXJlc3RhcnQuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9lbWVyZ2VuY3ktcmVzdGFydC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2Vycm5vLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vZXJybm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM4MmI1MC4uMDAwMDAwMAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vZXJybm8uaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9lcnJuby5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2ZiLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vZmIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E0OTg4ZS4uMDAwMDAwMAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vZmIuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mYi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2ZjbnRsLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vZmNudGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZhYjEyZC4uMDAwMDAwMAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vZmNudGwuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9mY250bC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2ZpeG1hcC5oIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2ZpeG1hcC5oCmluZGV4IDUxNTM3ZmYuLmM2NmY3OTMgMTAwNjQ0Ci0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9maXhtYXAuaAorKysgYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vZml4bWFwLmgKQEAgLTc1LDEyICs3NSw2IEBACiAKICNkZWZpbmUgc2V0X2ZpeG1hcChpZHgsIHBoeXMpIFwKIAkJX19zZXRfZml4bWFwKGlkeCwgcGh5cywgUEFHRV9LRVJORUwpCi0vKgotICogU29tZSBoYXJkd2FyZSB3YW50cyB0byBnZXQgZml4bWFwcGVkIHdpdGhvdXQgY2FjaGluZy4KLSAqLwotI2RlZmluZSBzZXRfZml4bWFwX25vY2FjaGUoaWR4LCBwaHlzKSBcCi0JCV9fc2V0X2ZpeG1hcChpZHgsIHBoeXMsIFBBR0VfS0VSTkVMX05PQ0FDSEUpCi0KICNkZWZpbmUgY2xlYXJfZml4bWFwKGlkeCkgXAogCQlfX3NldF9maXhtYXAoaWR4LCAwLCBfX3BncHJvdCgwKSkKIApkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2lvY3RsLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vaW9jdGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI3OWZlMC4uMDAwMDAwMAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vaW9jdGwuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pb2N0bC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2lvY3Rscy5oIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2lvY3Rscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzM0Yzc2Li4wMDAwMDAwCi0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9pb2N0bHMuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pb2N0bHMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9pcGMuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9pcGMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ2ZTNkOS4uMDAwMDAwMAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vaXBjLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvaXBjLmg+CmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vaXBjYnVmLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vaXBjYnVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0YzdlNTEuLjAwMDAwMDAKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2lwY2J1Zi5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2lwY2J1Zi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2lycV9yZWdzLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vaXJxX3JlZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RkOWMwYi4uMDAwMDAwMAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vaXJxX3JlZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9pcnFfcmVncy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2tkZWJ1Zy5oIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2tkZWJ1Zy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWNlMWIwLi4wMDAwMDAwCi0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9rZGVidWcuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9rZGVidWcuaD4KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9sb2NhbC5oIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2xvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMWM1MzAuLjAwMDAwMDAKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2xvY2FsLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvbG9jYWwuaD4KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9tb2R1bGUuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9tb2R1bGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU0Yjc5Zi4uMDAwMDAwMAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vbW9kdWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvbW9kdWxlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vbXNnYnVmLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vbXNnYnVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwOTEzNGMuLjAwMDAwMDAKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL21zZ2J1Zi5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL21zZ2J1Zi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL211dGV4LmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vbXV0ZXguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY2MTAxYS4uMDAwMDAwMAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vbXV0ZXguaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9tdXRleC1kZWMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9wYXJhbS5oIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3BhcmFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NWQ0NTQuLjAwMDAwMDAKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3BhcmFtLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGFyYW0uaD4KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9wYXJwb3J0LmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vcGFycG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjI1MmFmLi4wMDAwMDAwCi0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9wYXJwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvcGFycG9ydC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3BvbGwuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9wb2xsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ODUwOWQuLjAwMDAwMDAKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3BvbGwuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wb2xsLmg+CmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vcG9zaXhfdHlwZXMuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9wb3NpeF90eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmNhZTYyLi4wMDAwMDAwCi0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9wb3NpeF90eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3Bvc2l4X3R5cGVzLmg+CmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vcmVzb3VyY2UuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9yZXNvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGJjNGRiLi4wMDAwMDAwCi0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9yZXNvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3Jlc291cmNlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vc2NhdHRlcmxpc3QuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9zY2F0dGVybGlzdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWQ3ODZmLi4wMDAwMDAwCi0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9zY2F0dGVybGlzdC5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NjYXR0ZXJsaXN0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vc2VtYnVmLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vc2VtYnVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2NzNiODMuLjAwMDAwMDAKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3NlbWJ1Zi5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NlbWJ1Zi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3NlcmlhbC5oIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3NlcmlhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGNiMGNhZi4uMDAwMDAwMAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vc2VyaWFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvc2VyaWFsLmg+CmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vc2htYnVmLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vc2htYnVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYzA1ZmMuLjAwMDAwMDAKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3NobWJ1Zi5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NobWJ1Zi5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3NobXBhcmFtLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vc2htcGFyYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNmMzBkZS4uMDAwMDAwMAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vc2htcGFyYW0uaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zaG1wYXJhbS5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3NvY2tldC5oIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3NvY2tldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjcxMzg0Li4wMDAwMDAwCi0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9zb2NrZXQuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zb2NrZXQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9zb2NraW9zLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vc29ja2lvcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWY2ZDQ3Li4wMDAwMDAwCi0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9zb2NraW9zLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvc29ja2lvcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3N0YXRmcy5oIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3N0YXRmcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjkxZmUxLi4wMDAwMDAwCi0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9zdGF0ZnMuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy9zdGF0ZnMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS90ZXJtYml0cy5oIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3Rlcm1iaXRzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MzViMTAuLjAwMDAwMDAKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3Rlcm1iaXRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvdGVybWJpdHMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS90ZXJtaW9zLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vdGVybWlvcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODBkNzhhLi4wMDAwMDAwCi0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS90ZXJtaW9zLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvdGVybWlvcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3R5cGVzLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vdHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjllNzliYy4uMDAwMDAwMAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vdHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy90eXBlcy5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3Vjb250ZXh0LmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vdWNvbnRleHQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJjMDdiOS4uMDAwMDAwMAotLS0gYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vdWNvbnRleHQuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy91Y29udGV4dC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3hvci5oIGIvYXJjaC90aWxlL2luY2x1ZGUvYXNtL3hvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODJlYjEyLi4wMDAwMDAwCi0tLSBhL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS94b3IuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLSNpbmNsdWRlIDxhc20tZ2VuZXJpYy94b3IuaD4KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9pbmNsdWRlL2h2L2Rydl9zcm9tX2ludGYuaCBiL2FyY2gvdGlsZS9pbmNsdWRlL2h2L2Rydl9zcm9tX2ludGYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzk1ZmFhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC90aWxlL2luY2x1ZGUvaHYvZHJ2X3Nyb21faW50Zi5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBUaWxlcmEgQ29ycG9yYXRpb24uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB2ZXJzaW9uIDIuCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBHT09EIFRJVExFIG9yCisgKiAgIE5PTiBJTkZSSU5HRU1FTlQuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogICBtb3JlIGRldGFpbHMuCisgKi8KKworLyoqCisgKiBAZmlsZSBkcnZfc3JvbV9pbnRmLmgKKyAqIEludGVyZmFjZSBkZWZpbml0aW9ucyBmb3IgdGhlIFNQSSBGbGFzaCBST00gZHJpdmVyLgorICovCisKKyNpZm5kZWYgX1NZU19IVl9JTkNMVURFX0RSVl9TUk9NX0lOVEZfSAorI2RlZmluZSBfU1lTX0hWX0lOQ0xVREVfRFJWX1NST01fSU5URl9ICisKKy8qKiBSZWFkIHRoaXMgb2Zmc2V0IHRvIGdldCB0aGUgdG90YWwgZGV2aWNlIHNpemUuICovCisjZGVmaW5lIFNST01fVE9UQUxfU0laRV9PRkYgICAweEYwMDAwMDAwCisKKy8qKiBSZWFkIHRoaXMgb2Zmc2V0IHRvIGdldCB0aGUgZGV2aWNlIHNlY3RvciBzaXplLiAqLworI2RlZmluZSBTUk9NX1NFQ1RPUl9TSVpFX09GRiAgMHhGMDAwMDAwNAorCisvKiogUmVhZCB0aGlzIG9mZnNldCB0byBnZXQgdGhlIGRldmljZSBwYWdlIHNpemUuICovCisjZGVmaW5lIFNST01fUEFHRV9TSVpFX09GRiAgICAweEYwMDAwMDA4CisKKy8qKiBXcml0ZSB0aGlzIG9mZnNldCB0byBmbHVzaCBhbnkgcGVuZGluZyB3cml0ZXMuICovCisjZGVmaW5lIFNST01fRkxVU0hfT0ZGICAgICAgICAweEYxMDAwMDAwCisKKy8qKiBXcml0ZSB0aGlzIG9mZnNldCwgcGx1cyB0aGUgYnl0ZSBvZmZzZXQgb2YgdGhlIHN0YXJ0IG9mIGEgc2VjdG9yLCB0bworICogIGVyYXNlIGEgc2VjdG9yLiAgQW55IHdyaXRlIGRhdGEgaXMgaWdub3JlZCwgYnV0IHRoZXJlIG11c3QgYmUgYXQgbGVhc3QKKyAqICBvbmUgYnl0ZSBvZiB3cml0ZSBkYXRhLiAgT25seSBhcHBsaWVzIHdoZW4gdGhlIGRyaXZlciBpcyBpbiBNVEQgbW9kZS4KKyAqLworI2RlZmluZSBTUk9NX0VSQVNFX09GRiAgICAgICAgMHhGMjAwMDAwMAorCisjZW5kaWYgLyogX1NZU19IVl9JTkNMVURFX0RSVl9TUk9NX0lOVEZfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2tlcm5lbC9wY2kuYyBiL2FyY2gvdGlsZS9rZXJuZWwvcGNpLmMKaW5kZXggNmQ0Y2I1ZC4uMmE4MDE0YyAxMDA2NDQKLS0tIGEvYXJjaC90aWxlL2tlcm5lbC9wY2kuYworKysgYi9hcmNoL3RpbGUva2VybmVsL3BjaS5jCkBAIC0yMjgsNyArMjI4LDcgQEAKICAqIChwaW4gLSAxKSBjb252ZXJ0cyBmcm9tIHRoZSBQQ0kgc3RhbmRhcmQncyBbMTo0XSBjb252ZW50aW9uIHRvCiAgKiBhIG5vcm1hbCBbMDozXSByYW5nZS4KICAqLwotc3RhdGljIGludCB0aWxlX21hcF9pcnEoc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQorc3RhdGljIGludCB0aWxlX21hcF9pcnEoY29uc3Qgc3RydWN0IHBjaV9kZXYgKmRldiwgdTggc2xvdCwgdTggcGluKQogewogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqY29udHJvbGxlciA9CiAJCShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKilkZXYtPnN5c2RhdGE7CmRpZmYgLS1naXQgYS9hcmNoL3RpbGUva2VybmVsL3RpbWUuYyBiL2FyY2gvdGlsZS9rZXJuZWwvdGltZS5jCmluZGV4IGM0YmU1OGMuLmY2ZjUwZjJhIDEwMDY0NAotLS0gYS9hcmNoL3RpbGUva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3RpbGUva2VybmVsL3RpbWUuYwpAQCAtNzgsNyArNzgsNiBAQAogCS5yYXRpbmcgPSAzMDAsCiAJLnJlYWQgPSBjbG9ja3NvdXJjZV9nZXRfY3ljbGVzLAogCS5tYXNrID0gQ0xPQ0tTT1VSQ0VfTUFTSyg2NCksCi0JLnNoaWZ0ID0gMjIsICAgLyogdHlwaWNhbCB2YWx1ZSwgZS5nLiB4ODYgdHNjIHVzZXMgdGhpcyAqLwogCS5mbGFncyA9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAogfTsKIApAQCAtOTEsOCArOTAsNiBAQAogCWN5Y2xlc19wZXJfc2VjID0gaHZfc3lzY29uZihIVl9TWVNDT05GX0NQVV9TUEVFRCk7CiAJc2NoZWRfY2xvY2tfbXVsdCA9CiAJCWNsb2Nrc291cmNlX2h6Mm11bHQoY3ljbGVzX3Blcl9zZWMsIFNDSEVEX0NMT0NLX1NISUZUKTsKLQljeWNsZV9jb3VudGVyX2NzLm11bHQgPQotCQljbG9ja3NvdXJjZV9oejJtdWx0KGN5Y2xlc19wZXJfc2VjLCBjeWNsZV9jb3VudGVyX2NzLnNoaWZ0KTsKIH0KIAogdm9pZCBfX2luaXQgY2FsaWJyYXRlX2RlbGF5KHZvaWQpCkBAIC0xMDcsNyArMTA0LDcgQEAKIHZvaWQgX19pbml0IHRpbWVfaW5pdCh2b2lkKQogewogCS8qIEluaXRpYWxpemUgYW5kIHJlZ2lzdGVyIHRoZSBjbG9jayBzb3VyY2UuICovCi0JY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmN5Y2xlX2NvdW50ZXJfY3MpOworCWNsb2Nrc291cmNlX3JlZ2lzdGVyX2h6KCZjeWNsZV9jb3VudGVyX2NzLCBjeWNsZXNfcGVyX3NlYyk7CiAKIAkvKiBTdGFydCB1cCB0aGUgdGlsZS10aW1lciBpbnRlcnJ1cHQgc291cmNlIG9uIHRoZSBib290IGNwdS4gKi8KIAlzZXR1cF90aWxlX3RpbWVyKCk7CmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvbW0vaW5pdC5jIGIvYXJjaC90aWxlL21tL2luaXQuYwppbmRleCA0ZTEwYzQwLi43MzA5OTg4YyAxMDA2NDQKLS0tIGEvYXJjaC90aWxlL21tL2luaXQuYworKysgYi9hcmNoL3RpbGUvbW0vaW5pdC5jCkBAIC04MzYsOCArODM2LDcgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0ZMQVRNRU0KLQlpZiAoIW1lbV9tYXApCi0JCUJVRygpOworCUJVR19PTighbWVtX21hcCk7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19ISUdITUVNCmRpZmYgLS1naXQgYS9hcmNoL3VuaWNvcmUzMi9rZXJuZWwvcGNpLmMgYi9hcmNoL3VuaWNvcmUzMi9rZXJuZWwvcGNpLmMKaW5kZXggMTAwZWFiOC4uNDg5MmZiYiAxMDA2NDQKLS0tIGEvYXJjaC91bmljb3JlMzIva2VybmVsL3BjaS5jCisrKyBiL2FyY2gvdW5pY29yZTMyL2tlcm5lbC9wY2kuYwpAQCAtMTAyLDcgKzEwMiw3IEBACiAJd3JpdGVsKHJlYWRsKFBDSUJSSV9DTUQpIHwgUENJQlJJX0NNRF9JTyB8IFBDSUJSSV9DTURfTUVNLCBQQ0lCUklfQ01EKTsKIH0KIAotc3RhdGljIGludCBfX2luaXQgcGNpX3B1djNfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCBwY2lfcHV2M19tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpZiAoZGV2LT5idXMtPm51bWJlciA9PSAwKSB7CiAjaWZkZWYgQ09ORklHX0FSQ0hfRlBHQSAvKiA0IHBjaSBzbG90cyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvS2NvbmZpZyBiL2FyY2gveDg2L0tjb25maWcKaW5kZXggMTUzYWE2Zi4uNmE0N2JiMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvS2NvbmZpZworKysgYi9hcmNoL3g4Ni9LY29uZmlnCkBAIC03Miw2ICs3Miw3IEBACiAJc2VsZWN0IFVTRV9HRU5FUklDX1NNUF9IRUxQRVJTIGlmIFNNUAogCXNlbGVjdCBIQVZFX0JQRl9KSVQgaWYgKFg4Nl82NCAmJiBORVQpCiAJc2VsZWN0IENMS0VWVF9JODI1MworCXNlbGVjdCBBUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRwogCiBjb25maWcgSU5TVFJVQ1RJT05fREVDT0RFUgogCWRlZl9ib29sIChLUFJPQkVTIHx8IFBFUkZfRVZFTlRTKQpAQCAtMTkwNSw3ICsxOTA2LDcgQEAKICMgeDg2LTY0IGRvZXNuJ3Qgc3VwcG9ydCBQQ0kgQklPUyBhY2Nlc3MgZnJvbSBsb25nIG1vZGUgc28gYWx3YXlzIGdvIGRpcmVjdC4KIGNvbmZpZyBQQ0lfRElSRUNUCiAJZGVmX2Jvb2wgeQotCWRlcGVuZHMgb24gUENJICYmIChYODZfNjQgfHwgKFBDSV9HT0RJUkVDVCB8fCBQQ0lfR09BTlkgfHwgUENJX0dPT0xQQykpCisJZGVwZW5kcyBvbiBQQ0kgJiYgKFg4Nl82NCB8fCAoUENJX0dPRElSRUNUIHx8IFBDSV9HT0FOWSB8fCBQQ0lfR09PTFBDIHx8IFBDSV9HT01NQ09ORklHKSkKIAogY29uZmlnIFBDSV9NTUNPTkZJRwogCWRlZl9ib29sIHkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2lvLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pby5oCmluZGV4IGQwMjgwNGQuLmQ4ZThlZWYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2lvLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaW8uaApAQCAtNDAsOCArNDAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KIAotI2luY2x1ZGUgPHhlbi94ZW4uaD4KLQogI2RlZmluZSBidWlsZF9tbWlvX3JlYWQobmFtZSwgc2l6ZSwgdHlwZSwgcmVnLCBiYXJyaWVyKSBcCiBzdGF0aWMgaW5saW5lIHR5cGUgbmFtZShjb25zdCB2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHIpIFwKIHsgdHlwZSByZXQ7IGFzbSB2b2xhdGlsZSgibW92IiBzaXplICIgJTEsJTAiOnJlZyAocmV0KSBcCkBAIC0zMzQsNiArMzMyLDcgQEAKIGV4dGVybiBib29sIGlzX2Vhcmx5X2lvcmVtYXBfcHRlcChwdGVfdCAqcHRlcCk7CiAKICNpZmRlZiBDT05GSUdfWEVOCisjaW5jbHVkZSA8eGVuL3hlbi5oPgogc3RydWN0IGJpb192ZWM7CiAKIGV4dGVybiBib29sIHhlbl9iaW92ZWNfcGh5c19tZXJnZWFibGUoY29uc3Qgc3RydWN0IGJpb192ZWMgKnZlYzEsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCmluZGV4IDIxOTM3MTUuLjBkMTE3MWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCkBAIC03NTEsOCArNzUxLDYgQEAKIAkJICAgICA6OiAiYSIgKGVheCksICJjIiAoZWN4KSk7CiB9CiAKLWV4dGVybiB2b2lkIG13YWl0X2lkbGVfd2l0aF9oaW50cyh1bnNpZ25lZCBsb25nIGVheCwgdW5zaWduZWQgbG9uZyBlY3gpOwotCiBleHRlcm4gdm9pZCBzZWxlY3RfaWRsZV9yb3V0aW5lKGNvbnN0IHN0cnVjdCBjcHVpbmZvX3g4NiAqYyk7CiBleHRlcm4gdm9pZCBpbml0X2FtZF9lNDAwX2MxZV9tYXNrKHZvaWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9jc3RhdGUuYyBiL2FyY2gveDg2L2tlcm5lbC9hY3BpL2NzdGF0ZS5jCmluZGV4IDU4MTI0MDQuLmY1MGU3ZmIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hY3BpL2NzdGF0ZS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hY3BpL2NzdGF0ZS5jCkBAIC0xNDksNiArMTQ5LDI5IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChhY3BpX3Byb2Nlc3Nvcl9mZmhfY3N0YXRlX3Byb2JlKTsKIAorLyoKKyAqIFRoaXMgdXNlcyBuZXcgTU9OSVRPUi9NV0FJVCBpbnN0cnVjdGlvbnMgb24gUDQgcHJvY2Vzc29ycyB3aXRoIFBOSSwKKyAqIHdoaWNoIGNhbiBvYnZpYXRlIElQSSB0byB0cmlnZ2VyIGNoZWNraW5nIG9mIG5lZWRfcmVzY2hlZC4KKyAqIFdlIGV4ZWN1dGUgTU9OSVRPUiBhZ2FpbnN0IG5lZWRfcmVzY2hlZCBhbmQgZW50ZXIgb3B0aW1pemVkIHdhaXQgc3RhdGUKKyAqIHRocm91Z2ggTVdBSVQuIFdoZW5ldmVyIHNvbWVvbmUgY2hhbmdlcyBuZWVkX3Jlc2NoZWQsIHdlIHdvdWxkIGJlIHdva2VuCisgKiB1cCBmcm9tIE1XQUlUICh3aXRob3V0IGFuIElQSSkuCisgKgorICogTmV3IHdpdGggQ29yZSBEdW8gcHJvY2Vzc29ycywgTVdBSVQgY2FuIHRha2Ugc29tZSBoaW50cyBiYXNlZCBvbiBDUFUKKyAqIGNhcGFiaWxpdHkuCisgKi8KK3ZvaWQgbXdhaXRfaWRsZV93aXRoX2hpbnRzKHVuc2lnbmVkIGxvbmcgYXgsIHVuc2lnbmVkIGxvbmcgY3gpCit7CisJaWYgKCFuZWVkX3Jlc2NoZWQoKSkgeworCQlpZiAodGhpc19jcHVfaGFzKFg4Nl9GRUFUVVJFX0NMRkxVU0hfTU9OSVRPUikpCisJCQljbGZsdXNoKCh2b2lkICopJmN1cnJlbnRfdGhyZWFkX2luZm8oKS0+ZmxhZ3MpOworCisJCV9fbW9uaXRvcigodm9pZCAqKSZjdXJyZW50X3RocmVhZF9pbmZvKCktPmZsYWdzLCAwLCAwKTsKKwkJc21wX21iKCk7CisJCWlmICghbmVlZF9yZXNjaGVkKCkpCisJCQlfX213YWl0KGF4LCBjeCk7CisJfQorfQorCiB2b2lkIGFjcGlfcHJvY2Vzc29yX2ZmaF9jc3RhdGVfZW50ZXIoc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4ICpjeCkKIHsKIAl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggZTFiYThjYjIuLmU3ZTNiMDEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3MuYwpAQCAtNDM4LDI5ICs0MzgsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoY3B1X2lkbGVfd2FpdCk7CiAKLS8qCi0gKiBUaGlzIHVzZXMgbmV3IE1PTklUT1IvTVdBSVQgaW5zdHJ1Y3Rpb25zIG9uIFA0IHByb2Nlc3NvcnMgd2l0aCBQTkksCi0gKiB3aGljaCBjYW4gb2J2aWF0ZSBJUEkgdG8gdHJpZ2dlciBjaGVja2luZyBvZiBuZWVkX3Jlc2NoZWQuCi0gKiBXZSBleGVjdXRlIE1PTklUT1IgYWdhaW5zdCBuZWVkX3Jlc2NoZWQgYW5kIGVudGVyIG9wdGltaXplZCB3YWl0IHN0YXRlCi0gKiB0aHJvdWdoIE1XQUlULiBXaGVuZXZlciBzb21lb25lIGNoYW5nZXMgbmVlZF9yZXNjaGVkLCB3ZSB3b3VsZCBiZSB3b2tlbgotICogdXAgZnJvbSBNV0FJVCAod2l0aG91dCBhbiBJUEkpLgotICoKLSAqIE5ldyB3aXRoIENvcmUgRHVvIHByb2Nlc3NvcnMsIE1XQUlUIGNhbiB0YWtlIHNvbWUgaGludHMgYmFzZWQgb24gQ1BVCi0gKiBjYXBhYmlsaXR5LgotICovCi12b2lkIG13YWl0X2lkbGVfd2l0aF9oaW50cyh1bnNpZ25lZCBsb25nIGF4LCB1bnNpZ25lZCBsb25nIGN4KQotewotCWlmICghbmVlZF9yZXNjaGVkKCkpIHsKLQkJaWYgKHRoaXNfY3B1X2hhcyhYODZfRkVBVFVSRV9DTEZMVVNIX01PTklUT1IpKQotCQkJY2xmbHVzaCgodm9pZCAqKSZjdXJyZW50X3RocmVhZF9pbmZvKCktPmZsYWdzKTsKLQotCQlfX21vbml0b3IoKHZvaWQgKikmY3VycmVudF90aHJlYWRfaW5mbygpLT5mbGFncywgMCwgMCk7Ci0JCXNtcF9tYigpOwotCQlpZiAoIW5lZWRfcmVzY2hlZCgpKQotCQkJX19td2FpdChheCwgY3gpOwotCX0KLX0KLQogLyogRGVmYXVsdCBNT05JVE9SL01XQUlUIHdpdGggbm8gaGludHMsIHVzZWQgZm9yIGRlZmF1bHQgQzEgc3RhdGUgKi8KIHN0YXRpYyB2b2lkIG13YWl0X2lkbGUodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jCmluZGV4IGEzZDBkYzUuLjdhM2I2NTEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfMzIuYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWlkbGUuaD4KIAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtMTA5LDcgKzExMCw4IEBACiAJCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCQkJLyogRG9uJ3QgdHJhY2UgaXJxcyBvZmYgZm9yIGlkbGUgKi8KIAkJCXN0b3BfY3JpdGljYWxfdGltaW5ncygpOwotCQkJcG1faWRsZSgpOworCQkJaWYgKGNwdWlkbGVfaWRsZV9jYWxsKCkpCisJCQkJcG1faWRsZSgpOwogCQkJc3RhcnRfY3JpdGljYWxfdGltaW5ncygpOwogCQl9CiAJCXRpY2tfbm9oel9yZXN0YXJ0X3NjaGVkX3RpY2soKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jCmluZGV4IGNhNmY3YWIuLmY2OTNlNDQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWlkbGUuaD4KIAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtMTM2LDcgKzEzNyw4IEBACiAJCQllbnRlcl9pZGxlKCk7CiAJCQkvKiBEb24ndCB0cmFjZSBpcnFzIG9mZiBmb3IgaWRsZSAqLwogCQkJc3RvcF9jcml0aWNhbF90aW1pbmdzKCk7Ci0JCQlwbV9pZGxlKCk7CisJCQlpZiAoY3B1aWRsZV9pZGxlX2NhbGwoKSkKKwkJCQlwbV9pZGxlKCk7CiAJCQlzdGFydF9jcml0aWNhbF90aW1pbmdzKCk7CiAKIAkJCS8qIEluIG1hbnkgY2FzZXMgdGhlIGludGVycnVwdCB0aGF0IGVuZGVkIGlkbGUKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9hY3BpLmMgYi9hcmNoL3g4Ni9wY2kvYWNwaS5jCmluZGV4IDY4YzNjMTMuLmFlM2NiMjMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BjaS9hY3BpLmMKKysrIGIvYXJjaC94ODYvcGNpL2FjcGkuYwpAQCAtMjQ2LDEwICsyNDYsOSBAQAogCiAJCWNvbmZsaWN0ID0gaW5zZXJ0X3Jlc291cmNlX2NvbmZsaWN0KHJvb3QsIHJlcyk7CiAJCWlmIChjb25mbGljdCkKLQkJCWRldl9lcnIoJmluZm8tPmJyaWRnZS0+ZGV2LAotCQkJCSJhZGRyZXNzIHNwYWNlIGNvbGxpc2lvbjogaG9zdCBicmlkZ2Ugd2luZG93ICVwUiAiCi0JCQkJImNvbmZsaWN0cyB3aXRoICVzICVwUlxuIiwKLQkJCQlyZXMsIGNvbmZsaWN0LT5uYW1lLCBjb25mbGljdCk7CisJCQlkZXZfaW5mbygmaW5mby0+YnJpZGdlLT5kZXYsCisJCQkJICJpZ25vcmluZyBob3N0IGJyaWRnZSB3aW5kb3cgJXBSIChjb25mbGljdHMgd2l0aCAlcyAlcFIpXG4iLAorCQkJCSByZXMsIGNvbmZsaWN0LT5uYW1lLCBjb25mbGljdCk7CiAJCWVsc2UKIAkJCXBjaV9idXNfYWRkX3Jlc291cmNlKGluZm8tPmJ1cywgcmVzLCAwKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvY2U0MTAwLmMgYi9hcmNoL3g4Ni9wY2kvY2U0MTAwLmMKaW5kZXggNjc4NThiZS4uOTkxNzYwOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2NlNDEwMC5jCisrKyBiL2FyY2gveDg2L3BjaS9jZTQxMDAuYwpAQCAtMjU3LDYgKzI1Nyw3IEBACiB7CiAJaW50IGk7CiAKKwlXQVJOX09OKHNlZyk7CiAJaWYgKGJ1cyA9PSAxKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJ1czFfZml4dXBzKTsgaSsrKSB7CiAJCQlpZiAoYnVzMV9maXh1cHNbaV0uZGV2X2Z1bmMgPT0gZGV2Zm4gJiYKQEAgLTI4Miw2ICsyODMsNyBAQAogewogCWludCBpOwogCisJV0FSTl9PTihzZWcpOwogCWlmIChidXMgPT0gMSkgewogCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidXMxX2ZpeHVwcyk7IGkrKykgewogCQkJaWYgKGJ1czFfZml4dXBzW2ldLmRldl9mdW5jID09IGRldmZuICYmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wY2kvY29tbW9uLmMgYi9hcmNoL3g4Ni9wY2kvY29tbW9uLmMKaW5kZXggNWZlNzUwMi4uOTJkZjMyMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL2NvbW1vbi5jCisrKyBiL2FyY2gveDg2L3BjaS9jb21tb24uYwpAQCAtMjQ3LDEzICsyNDcsNiBAQAogCX0sCiAjZW5kaWYJCS8qIF9faTM4Nl9fICovCiAJewotCQkuY2FsbGJhY2sgPSBmaW5kX3NvcnRfbWV0aG9kLAotCQkuaWRlbnQgPSAiRGVsbCBTeXN0ZW0iLAotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jIiksCi0JCX0sCi0JfSwKLQl7CiAJCS5jYWxsYmFjayA9IHNldF9iZl9zb3J0LAogCQkuaWRlbnQgPSAiRGVsbCBQb3dlckVkZ2UgMTk1MCIsCiAJCS5tYXRjaGVzID0gewpAQCAtMjk0LDYgKzI4NywxMyBAQAogCQl9LAogCX0sCiAJeworCQkuY2FsbGJhY2sgPSBmaW5kX3NvcnRfbWV0aG9kLAorCQkuaWRlbnQgPSAiRGVsbCBTeXN0ZW0iLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jIiksCisJCX0sCisJfSwKKwl7CiAJCS5jYWxsYmFjayA9IHNldF9iZl9zb3J0LAogCQkuaWRlbnQgPSAiSFAgUHJvTGlhbnQgQkwyMHAgRzMiLAogCQkubWF0Y2hlcyA9IHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9kaXJlY3QuYyBiL2FyY2gveDg2L3BjaS9kaXJlY3QuYwppbmRleCBlNmZkODQ3Li40ZjJjNzA0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvZGlyZWN0LmMKKysrIGIvYXJjaC94ODYvcGNpL2RpcmVjdC5jCkBAIC0yMiw3ICsyMiw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICgoYnVzID4gMjU1KSB8fCAoZGV2Zm4gPiAyNTUpIHx8IChyZWcgPiA0MDk1KSkgeworCWlmIChzZWcgfHwgKGJ1cyA+IDI1NSkgfHwgKGRldmZuID4gMjU1KSB8fCAocmVnID4gNDA5NSkpIHsKIAkJKnZhbHVlID0gLTE7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTUzLDcgKzUzLDcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JaWYgKChidXMgPiAyNTUpIHx8IChkZXZmbiA+IDI1NSkgfHwgKHJlZyA+IDQwOTUpKQorCWlmIChzZWcgfHwgKGJ1cyA+IDI1NSkgfHwgKGRldmZuID4gMjU1KSB8fCAocmVnID4gNDA5NSkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZwY2lfY29uZmlnX2xvY2ssIGZsYWdzKTsKQEAgLTk3LDYgKzk3LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBkZXYsIGZuOwogCisJV0FSTl9PTihzZWcpOwogCWlmICgoYnVzID4gMjU1KSB8fCAoZGV2Zm4gPiAyNTUpIHx8IChyZWcgPiAyNTUpKSB7CiAJCSp2YWx1ZSA9IC0xOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTEzOCw2ICsxMzksNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGRldiwgZm47CiAKKwlXQVJOX09OKHNlZyk7CiAJaWYgKChidXMgPiAyNTUpIHx8IChkZXZmbiA+IDI1NSkgfHwgKHJlZyA+IDI1NSkpIAogCQlyZXR1cm4gLUVJTlZBTDsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL251bWFxXzMyLmMgYi9hcmNoL3g4Ni9wY2kvbnVtYXFfMzIuYwppbmRleCA1YzllMjQ1Li41MTJhODhjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvbnVtYXFfMzIuYworKysgYi9hcmNoL3g4Ni9wY2kvbnVtYXFfMzIuYwpAQCAtMzQsNiArMzQsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdm9pZCAqYWRyIF9faW9tZW0gPSBYUVVBRF9QT1JUX0FERFIoMHhjZmMsIEJVUzJRVUFEKGJ1cykpOwogCisJV0FSTl9PTihzZWcpOwogCWlmICghdmFsdWUgfHwgKGJ1cyA+PSBNQVhfTVBfQlVTU0VTKSB8fCAoZGV2Zm4gPiAyNTUpIHx8IChyZWcgPiAyNTUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtNzMsNiArNzQsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdm9pZCAqYWRyIF9faW9tZW0gPSBYUVVBRF9QT1JUX0FERFIoMHhjZmMsIEJVUzJRVUFEKGJ1cykpOwogCisJV0FSTl9PTihzZWcpOwogCWlmICgoYnVzID49IE1BWF9NUF9CVVNTRVMpIHx8IChkZXZmbiA+IDI1NSkgfHwgKHJlZyA+IDI1NSkpIAogCQlyZXR1cm4gLUVJTlZBTDsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGNpL29scGMuYyBiL2FyY2gveDg2L3BjaS9vbHBjLmMKaW5kZXggMTM3MDBlYy4uNTI2MjYwMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL29scGMuYworKysgYi9hcmNoL3g4Ni9wY2kvb2xwYy5jCkBAIC0yMDYsNiArMjA2LDggQEAKIHsKIAl1aW50MzJfdCAqYWRkcjsKIAorCVdBUk5fT04oc2VnKTsKKwogCS8qIFVzZSB0aGUgaGFyZHdhcmUgbWVjaGFuaXNtIGZvciBub24tc2ltdWxhdGVkIGRldmljZXMgKi8KIAlpZiAoIWlzX3NpbXVsYXRlZChidXMsIGRldmZuKSkKIAkJcmV0dXJuIHBjaV9kaXJlY3RfY29uZjEucmVhZChzZWcsIGJ1cywgZGV2Zm4sIHJlZywgbGVuLCB2YWx1ZSk7CkBAIC0yNjQsNiArMjY2LDggQEAKIHN0YXRpYyBpbnQgcGNpX29scGNfd3JpdGUodW5zaWduZWQgaW50IHNlZywgdW5zaWduZWQgaW50IGJ1cywKIAkJdW5zaWduZWQgaW50IGRldmZuLCBpbnQgcmVnLCBpbnQgbGVuLCB1aW50MzJfdCB2YWx1ZSkKIHsKKwlXQVJOX09OKHNlZyk7CisKIAkvKiBVc2UgdGhlIGhhcmR3YXJlIG1lY2hhbmlzbSBmb3Igbm9uLXNpbXVsYXRlZCBkZXZpY2VzICovCiAJaWYgKCFpc19zaW11bGF0ZWQoYnVzLCBkZXZmbikpCiAJCXJldHVybiBwY2lfZGlyZWN0X2NvbmYxLndyaXRlKHNlZywgYnVzLCBkZXZmbiwgcmVnLCBsZW4sIHZhbHVlKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9wY2Jpb3MuYyBiL2FyY2gveDg2L3BjaS9wY2Jpb3MuYwppbmRleCBhNWY3ZDBkLi5mNjg1NTM1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvcGNiaW9zLmMKKysrIGIvYXJjaC94ODYvcGNpL3BjYmlvcy5jCkBAIC0xODEsNiArMTgxLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGxvbmcgYnggPSAoYnVzIDw8IDgpIHwgZGV2Zm47CiAKKwlXQVJOX09OKHNlZyk7CiAJaWYgKCF2YWx1ZSB8fCAoYnVzID4gMjU1KSB8fCAoZGV2Zm4gPiAyNTUpIHx8IChyZWcgPiAyNTUpKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMjQ3LDYgKzI0OCw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1bnNpZ25lZCBsb25nIGJ4ID0gKGJ1cyA8PCA4KSB8IGRldmZuOwogCisJV0FSTl9PTihzZWcpOwogCWlmICgoYnVzID4gMjU1KSB8fCAoZGV2Zm4gPiAyNTUpIHx8IChyZWcgPiAyNTUpKSAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS92aXN3cy5jIGIvYXJjaC94ODYvcGNpL3Zpc3dzLmMKaW5kZXggMDMwMDhmNy4uNmYyZjhlZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGNpL3Zpc3dzLmMKKysrIGIvYXJjaC94ODYvcGNpL3Zpc3dzLmMKQEAgLTI0LDcgKzI0LDcgQEAKIAogdW5zaWduZWQgaW50IHBjaV9idXMwLCBwY2lfYnVzMTsKIAotc3RhdGljIGludCBfX2luaXQgdmlzd3NfbWFwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCBzbG90LCB1OCBwaW4pCitzdGF0aWMgaW50IF9faW5pdCB2aXN3c19tYXBfaXJxKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICpkZXYsIHU4IHNsb3QsIHU4IHBpbikKIHsKIAlpbnQgaXJxLCBidXMgPSBkZXYtPmJ1cy0+bnVtYmVyOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9tcnN0L01ha2VmaWxlIGIvYXJjaC94ODYvcGxhdGZvcm0vbXJzdC9NYWtlZmlsZQppbmRleCBmNjFjY2RkLi4xZWEzODc3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wbGF0Zm9ybS9tcnN0L01ha2VmaWxlCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL21yc3QvTWFrZWZpbGUKQEAgLTEsMyArMSw0IEBACiBvYmotJChDT05GSUdfWDg2X01SU1QpCQkrPSBtcnN0Lm8KIG9iai0kKENPTkZJR19YODZfTVJTVCkJCSs9IHZydGMubwogb2JqLSQoQ09ORklHX0VBUkxZX1BSSU5US19NUlNUKQkrPSBlYXJseV9wcmludGtfbXJzdC5vCitvYmotJChDT05GSUdfWDg2X01SU1QpCQkrPSBwbXUubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vbXJzdC9wbXUuYyBiL2FyY2gveDg2L3BsYXRmb3JtL21yc3QvcG11LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI4MWRhNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL21yc3QvcG11LmMKQEAgLTAsMCArMSw4MTcgQEAKKy8qCisgKiBtcnN0L3BtdS5jIC0gZHJpdmVyIGZvciBNUlNUIFBvd2VyIE1hbmFnZW1lbnQgVW5pdAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgSW50ZWwgQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY3B1aWRsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2ZpLmg+CisjaW5jbHVkZSA8YXNtL2ludGVsX3NjdV9pcGMuaD4KKyNpbmNsdWRlICJwbXUuaCIKKworI2RlZmluZSBJUENNU0dfRldfUkVWSVNJT04JMHhGNAorCitzdHJ1Y3QgbXJzdF9kZXZpY2UgeworCXUxNiBwY2lfZGV2X251bTsJLyogREVCVUcgb25seSAqLworCXUxNiBsc3M7CisJdTE2IGxhdGVzdF9yZXF1ZXN0OworCXVuc2lnbmVkIGludCBwY2lfc3RhdGVfY291bnRzW1BDSV9EM2NvbGQgKyAxXTsgLyogREVCVUcgb25seSAqLworfTsKKworLyoKKyAqIGNvbWxldGUgbGlzdCBvZiBNUlNUIFBDSSBkZXZpY2VzCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbXJzdF9kZXZpY2UgbXJzdF9kZXZzW10gPSB7CisvKiAgMCAqLyB7IDB4MDgwMCwgTFNTX1NQSTAgfSwJCS8qIE1vb3Jlc3Rvd24gU1BJIEN0cmwgMCAqLworLyogIDEgKi8geyAweDA4MDEsIExTU19TUEkxIH0sCQkvKiBNb29yZXN0b3duIFNQSSBDdHJsIDEgKi8KKy8qICAyICovIHsgMHgwODAyLCBMU1NfSTJDMCB9LAkJLyogTW9vcmVzdG93biBJMkMgMCAqLworLyogIDMgKi8geyAweDA4MDMsIExTU19JMkMxIH0sCQkvKiBNb29yZXN0b3duIEkyQyAxICovCisvKiAgNCAqLyB7IDB4MDgwNCwgTFNTX0kyQzIgfSwJCS8qIE1vb3Jlc3Rvd24gSTJDIDIgKi8KKy8qICA1ICovIHsgMHgwODA1LCBMU1NfS0JEIH0sCQkvKiBNb29yZXN0b3duIEtleWJvYXJkIEN0cmwgKi8KKy8qICA2ICovIHsgMHgwODA2LCBMU1NfVVNCX0hDIH0sCS8qIE1vb3Jlc3Rvd24gVVNCIEN0cmwgKi8KKy8qICA3ICovIHsgMHgwODA3LCBMU1NfU0RfSEMwIH0sCS8qIE1vb3Jlc3Rvd24gU0QgSG9zdCBDdHJsIDAgKi8KKy8qICA4ICovIHsgMHgwODA4LCBMU1NfU0RfSEMxIH0sCS8qIE1vb3Jlc3Rvd24gU0QgSG9zdCBDdHJsIDEgKi8KKy8qICA5ICovIHsgMHgwODA5LCBMU1NfTkFORCB9LAkJLyogTW9vcmVzdG93biBOQU5EIEN0cmwgKi8KKy8qIDEwICovIHsgMHgwODBhLCBMU1NfQVVESU8gfSwJCS8qIE1vb3Jlc3Rvd24gQXVkaW8gQ3RybCAqLworLyogMTEgKi8geyAweDA4MGIsIExTU19JTUFHSU5HIH0sCS8qIE1vb3Jlc3Rvd24gSVNQICovCisvKiAxMiAqLyB7IDB4MDgwYywgTFNTX1NFQ1VSSVRZIH0sCS8qIE1vb3Jlc3Rvd24gU2VjdXJpdHkgQ29udHJvbGxlciAqLworLyogMTMgKi8geyAweDA4MGQsIExTU19ESVNQTEFZIH0sCS8qIE1vb3Jlc3Rvd24gRXh0ZXJuYWwgRGlzcGxheXMgKi8KKy8qIDE0ICovIHsgMHgwODBlLCAwIH0sCQkJLyogTW9vcmVzdG93biBTQ1UgSVBDICovCisvKiAxNSAqLyB7IDB4MDgwZiwgTFNTX0dQSU8gfSwJCS8qIE1vb3Jlc3Rvd24gR1BJTyBDb250cm9sbGVyICovCisvKiAxNiAqLyB7IDB4MDgxMCwgMCB9LAkJCS8qIE1vb3Jlc3Rvd24gUG93ZXIgTWFuYWdlbWVudCBVbml0ICovCisvKiAxNyAqLyB7IDB4MDgxMSwgTFNTX1VTQl9PVEcgfSwJLyogTW9vcmVzdG93biBPVEcgQ3RybCAqLworLyogMTggKi8geyAweDA4MTIsIExTU19TUEkyIH0sCQkvKiBNb29yZXN0b3duIFNQSSBDdHJsIDIgKi8KKy8qIDE5ICovIHsgMHgwODEzLCAwIH0sCQkJLyogTW9vcmVzdG93biBTQyBETUEgKi8KKy8qIDIwICovIHsgMHgwODE0LCBMU1NfQVVESU9fTFBFIH0sCS8qIE1vb3Jlc3Rvd24gTFBFIERNQSAqLworLyogMjEgKi8geyAweDA4MTUsIExTU19BVURJT19TU1AgfSwJLyogTW9vcmVzdG93biBTU1AwICovCisKKy8qIDIyICovIHsgMHgwODRGLCBMU1NfU0RfSEMyIH0sCS8qIE1vb3Jlc3Rvd24gU0QgSG9zdCBDdHJsIDIgKi8KKworLyogMjMgKi8geyAweDQxMDIsIDAgfSwJCQkvKiBMaW5jcm9mdCAqLworLyogMjQgKi8geyAweDQxMTAsIDAgfSwJCQkvKiBMaW5jcm9mdCAqLworfTsKKworLyogbi5iLiBXZSBpZ25vcmUgUENJLWlkIDB4ODE1IGluIExTUzkgYi9jIE1lZUdvIGhhcyBubyBkcml2ZXIgZm9yIGl0ICovCitzdGF0aWMgdTE2IG1yc3RfbHNzOV9wY2lfaWRzW10gPSB7MHgwODBhLCAweDA4MTQsIDB9Oworc3RhdGljIHUxNiBtcnN0X2xzczEwX3BjaV9pZHNbXSA9IHsweDA4MDAsIDB4MDgwMSwgMHgwODAyLCAweDA4MDMsCisJCQkJCTB4MDgwNCwgMHgwODA1LCAweDA4MGYsIDB9OworCisvKiBoYW5kbGUgY29uY3VycmVudCBTTVAgaW52b2thdGlvbnMgb2YgcG11X3BjaV9zZXRfcG93ZXJfc3RhdGUoKSAqLworc3RhdGljIHNwaW5sb2NrX3QgbXJzdF9wbXVfcG93ZXJfc3RhdGVfbG9jazsKKworc3RhdGljIHVuc2lnbmVkIGludCB3YWtlX2NvdW50ZXJzW01SU1RfTlVNX0xTU107CS8qIERFQlVHIG9ubHkgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgcG11X2lycV9zdGF0c1tJTlRfSU5WQUxJRCArIDFdOwkvKiBERUJVRyBvbmx5ICovCisKK3N0YXRpYyBpbnQgZ3JhcGhpY3NfaXNfb2ZmOworc3RhdGljIGludCBsc3NfczBpM19lbmFibGVkOworc3RhdGljIGJvb2wgbXJzdF9wbXVfczBpM19lbmFibGU7CisKKy8qICBkZWJ1ZyBjb3VudGVycyAqLworc3RhdGljIHUzMiBwbXVfd2FpdF9yZWFkeV9jYWxsczsKK3N0YXRpYyB1MzIgcG11X3dhaXRfcmVhZHlfdWRlbGF5czsKK3N0YXRpYyB1MzIgcG11X3dhaXRfcmVhZHlfdWRlbGF5c19tYXg7CitzdGF0aWMgdTMyIHBtdV93YWl0X2RvbmVfY2FsbHM7CitzdGF0aWMgdTMyIHBtdV93YWl0X2RvbmVfdWRlbGF5czsKK3N0YXRpYyB1MzIgcG11X3dhaXRfZG9uZV91ZGVsYXlzX21heDsKK3N0YXRpYyB1MzIgcG11X3NldF9wb3dlcl9zdGF0ZV9lbnRyeTsKK3N0YXRpYyB1MzIgcG11X3NldF9wb3dlcl9zdGF0ZV9zZW5kX2NtZDsKKworc3RhdGljIHN0cnVjdCBtcnN0X2RldmljZSAqcGNpX2lkXzJfbXJzdF9kZXYodTE2IHBjaV9kZXZfbnVtKQoreworCWludCBpbmRleCA9IDA7CisKKwlpZiAoKHBjaV9kZXZfbnVtID49IDB4MDgwMCkgJiYgKHBjaV9kZXZfbnVtIDw9IDB4ODE1KSkKKwkJaW5kZXggPSBwY2lfZGV2X251bSAtIDB4ODAwOworCWVsc2UgaWYgKHBjaV9kZXZfbnVtID09IDB4MDg0RikKKwkJaW5kZXggPSAyMjsKKwllbHNlIGlmIChwY2lfZGV2X251bSA9PSAweDQxMDIpCisJCWluZGV4ID0gMjM7CisJZWxzZSBpZiAocGNpX2Rldl9udW0gPT0gMHg0MTEwKQorCQlpbmRleCA9IDI0OworCisJaWYgKHBjaV9kZXZfbnVtICE9IG1yc3RfZGV2c1tpbmRleF0ucGNpX2Rldl9udW0pIHsKKwkJV0FSTl9PTkNFKDEsIEZXX0JVRyAiVW5rbm93biBQQ0kgZGV2aWNlIDB4JTA0WFxuIiwgcGNpX2Rldl9udW0pOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gJm1yc3RfZGV2c1tpbmRleF07Cit9CisKKy8qKgorICogbXJzdF9wbXVfdmFsaWRhdGVfY3N0YXRlcworICogQGRldjogY3B1aWRsZV9kZXZpY2UKKyAqCisgKiBDZXJ0YWluIHN0YXRlcyBhcmUgbm90IGFwcHJvcHJpYXRlIGZvciBnb3Zlcm5vciB0byBwaWNrIGluIHNvbWUgY2FzZXMuCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFzIGNwdWlkbGVfZGV2aWNlJ3MgcHJlcGFyZSBjYWxsYmFjayBhbmQKKyAqIHRodXMgdGVsbHMgZ292ZXJub3IgdG8gaWdub3JlIHN1Y2ggc3RhdGVzIHdoZW4gc2VsZWN0aW5nIHRoZSBuZXh0IHN0YXRlCisgKiB0byBlbnRlci4KKyAqLworCisjZGVmaW5lIElETEVfU1RBVEU0X0lTX0M2CTQKKyNkZWZpbmUgSURMRV9TVEFURTVfSVNfUzBJMwk1CisKK2ludCBtcnN0X3BtdV9pbnZhbGlkX2NzdGF0ZXModm9pZCkKK3sKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJLyoKKwkgKiBEZW1vdGUgdG8gQzQgaWYgdGhlIFBNVSBpcyBidXN5LgorCSAqIFNpbmNlIExTUyBjaGFuZ2VzIGxlYXZlIHRoZSBidXN5IGJpdCBjbGVhci4uLgorCSAqIGJ1c3kgbWVhbnMgZWl0aGVyIHRoZSBQTVUgaXMgd2FpdGluZyBmb3IgYW4gQUNLLUM2IHRoYXQKKwkgKiBpc24ndCBjb21pbmcgZHVlIHRvIGFuIE1XQUlUIHRoYXQgcmV0dXJuZWQgaW1tZWRpYXRlbHk7CisJICogb3Igd2UgcmV0dXJuZWQgZnJvbSBTMGkzIHN1Y2Nlc3NmdWxseSwgYW5kIHRoZSBQTVUKKwkgKiBpcyBub3QgZG9uZSBzZW5kaW5nIHVzIGludGVycnVwdHMuCisJICovCisJaWYgKHBtdV9yZWFkX2J1c3lfc3RhdHVzKCkpCisJCXJldHVybiAxIDw8IElETEVfU1RBVEU0X0lTX0M2IHwgMSA8PCBJRExFX1NUQVRFNV9JU19TMEkzOworCisJLyoKKwkgKiBEaXNhbGxvdyBTMGkzIGlmOiBQTVUgaXMgbm90IGluaXRpYWxpemVkLCBvciBDUFUxIGlzIGFjdGl2ZSwKKwkgKiBvciBpZiBkZXZpY2UgTFNTIGlzIGluc3VmZmljaWVudCwgb3IgdGhlIEdQVSBpcyBhY3RpdmUsCisJICogb3IgaWYgaXQgaGFzIGJlZW4gZXhwbGljaXRseSBkaXNhYmxlZC4KKwkgKi8KKwlpZiAoIXBtdV9yZWcgfHwgIWNwdW1hc2tfZXF1YWwoY3B1X29ubGluZV9tYXNrLCBjcHVtYXNrX29mKGNwdSkpIHx8CisJICAgICFsc3NfczBpM19lbmFibGVkIHx8ICFncmFwaGljc19pc19vZmYgfHwgIW1yc3RfcG11X3MwaTNfZW5hYmxlKQorCQlyZXR1cm4gMSA8PCBJRExFX1NUQVRFNV9JU19TMEkzOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBwbXVfdXBkYXRlX3dha2VfY291bnRlcnMoKTogcmVhZCBQTV9XS1MsIHVwZGF0ZSB3YWtlX2NvdW50ZXJzW10KKyAqIERFQlVHIG9ubHkuCisgKi8KK3N0YXRpYyB2b2lkIHBtdV91cGRhdGVfd2FrZV9jb3VudGVycyh2b2lkKQoreworCWludCBsc3M7CisJdTMyIHdha2Vfc3RhdHVzOworCisJd2FrZV9zdGF0dXMgPSBwbXVfcmVhZF93a3MoKTsKKworCWZvciAobHNzID0gMDsgbHNzIDwgTVJTVF9OVU1fTFNTOyArK2xzcykgeworCQlpZiAod2FrZV9zdGF0dXMgJiAoMSA8PCBsc3MpKQorCQkJd2FrZV9jb3VudGVyc1tsc3NdKys7CisJfQorfQorCitpbnQgbXJzdF9wbXVfczBpM19lbnRyeSh2b2lkKQoreworCWludCBzdGF0dXM7CisKKwkvKiBDbGVhciBhbnkgcG9zc2libGUgZXJyb3IgY29uZGl0aW9ucyAqLworCXBtdV93cml0ZV9pY3MoMHgzMDApOworCisJLyogc2V0IHdha2UgY29udHJvbCB0byBjdXJyZW50IEQtc3RhdGVzICovCisJcG11X3dyaXRlX3dzc2MoUzBJM19TU1NfVEFSR0VUKTsKKworCXN0YXR1cyA9IG1yc3RfczBpM19lbnRyeShQTV9TMEkzX0NPTU1BTkQsICZwbXVfcmVnLT5wbV9jbWQpOworCXBtdV91cGRhdGVfd2FrZV9jb3VudGVycygpOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qIHBvbGwgZm9yIG1heGltdW0gb2YgNW1zIGZvciBidXN5IGJpdCB0byBjbGVhciAqLworc3RhdGljIGludCBwbXVfd2FpdF9yZWFkeSh2b2lkKQoreworCWludCB1ZGVsYXlzOworCisJcG11X3dhaXRfcmVhZHlfY2FsbHMrKzsKKworCWZvciAodWRlbGF5cyA9IDA7IHVkZWxheXMgPCA1MDA7ICsrdWRlbGF5cykgeworCQlpZiAodWRlbGF5cyA+IHBtdV93YWl0X3JlYWR5X3VkZWxheXNfbWF4KQorCQkJcG11X3dhaXRfcmVhZHlfdWRlbGF5c19tYXggPSB1ZGVsYXlzOworCisJCWlmIChwbXVfcmVhZF9idXN5X3N0YXR1cygpID09IDApCisJCQlyZXR1cm4gMDsKKworCQl1ZGVsYXkoMTApOworCQlwbXVfd2FpdF9yZWFkeV91ZGVsYXlzKys7CisJfQorCisJLyoKKwkgKiBpZiB0aGlzIGZpcmVzLCBvYnNlcnZlCisJICogL3N5cy9rZXJuZWwvZGVidWcvbXJzdF9wbXVfd2FpdF9yZWFkeV9jYWxscworCSAqIC9zeXMva2VybmVsL2RlYnVnL21yc3RfcG11X3dhaXRfcmVhZHlfdWRlbGF5cworCSAqLworCVdBUk5fT05DRSgxLCAiU0NVIG5vdCByZWFkeSBmb3IgNW1zIik7CisJcmV0dXJuIC1FQlVTWTsKK30KKy8qIHBvbGwgZm9yIG1heGltdW0gb2YgNTBtcyB1cyBmb3IgYnVzeSBiaXQgdG8gY2xlYXIgKi8KK3N0YXRpYyBpbnQgcG11X3dhaXRfZG9uZSh2b2lkKQoreworCWludCB1ZGVsYXlzOworCisJcG11X3dhaXRfZG9uZV9jYWxscysrOworCisJZm9yICh1ZGVsYXlzID0gMDsgdWRlbGF5cyA8IDUwMDsgKyt1ZGVsYXlzKSB7CisJCWlmICh1ZGVsYXlzID4gcG11X3dhaXRfZG9uZV91ZGVsYXlzX21heCkKKwkJCXBtdV93YWl0X2RvbmVfdWRlbGF5c19tYXggPSB1ZGVsYXlzOworCisJCWlmIChwbXVfcmVhZF9idXN5X3N0YXR1cygpID09IDApCisJCQlyZXR1cm4gMDsKKworCQl1ZGVsYXkoMTAwKTsKKwkJcG11X3dhaXRfZG9uZV91ZGVsYXlzKys7CisJfQorCisJLyoKKwkgKiBpZiB0aGlzIGZpcmVzLCBvYnNlcnZlCisJICogL3N5cy9rZXJuZWwvZGVidWcvbXJzdF9wbXVfd2FpdF9kb25lX2NhbGxzCisJICogL3N5cy9rZXJuZWwvZGVidWcvbXJzdF9wbXVfd2FpdF9kb25lX3VkZWxheXMKKwkgKi8KKwlXQVJOX09OQ0UoMSwgIlNDVSBub3QgZG9uZSBmb3IgNTBtcyIpOworCXJldHVybiAtRUJVU1k7Cit9CisKK3UzMiBtcnN0X3BtdV9tc2lfaXNfZGlzYWJsZWQodm9pZCkKK3sKKwlyZXR1cm4gcG11X21zaV9pc19kaXNhYmxlZCgpOworfQorCit2b2lkIG1yc3RfcG11X2VuYWJsZV9tc2kodm9pZCkKK3sKKwlwbXVfbXNpX2VuYWJsZSgpOworfQorCisvKioKKyAqIHBtdV9pcnEgLSBwbXUgZHJpdmVyIGludGVycnVwdCBoYW5kbGVyCisgKiBDb250ZXh0OiBpbnRlcnJ1cHQgY29udGV4dAorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgcG11X2lycShpbnQgaXJxLCB2b2lkICpkdW1teSkKK3sKKwl1bmlvbiBwbXVfcG1faWNzIHBtdV9pY3M7CisKKwlwbXVfaWNzLnZhbHVlID0gcG11X3JlYWRfaWNzKCk7CisKKwlpZiAoIXBtdV9pY3MuYml0cy5wZW5kaW5nKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlzd2l0Y2ggKHBtdV9pY3MuYml0cy5jYXVzZSkgeworCWNhc2UgSU5UX1NQVVJJT1VTOgorCWNhc2UgSU5UX0NNRF9ET05FOgorCWNhc2UgSU5UX0NNRF9FUlI6CisJY2FzZSBJTlRfV0FLRV9SWDoKKwljYXNlIElOVF9TU19FUlJPUjoKKwljYXNlIElOVF9TMElYX01JU1M6CisJY2FzZSBJTlRfTk9fQUNLQzY6CisJCXBtdV9pcnFfc3RhdHNbcG11X2ljcy5iaXRzLmNhdXNlXSsrOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwbXVfaXJxX3N0YXRzW0lOVF9JTlZBTElEXSsrOworCX0KKworCXBtdV93cml0ZV9pY3MocG11X2ljcy52YWx1ZSk7IC8qIENsZWFyIHBlbmRpbmcgaW50ZXJydXB0ICovCisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBUcmFuc2xhdGUgUENJIHBvd2VyIG1hbmFnZW1lbnQgdG8gTVJTVCBMU1MgRC1zdGF0ZXMKKyAqLworc3RhdGljIGludCBwY2lfMl9tcnN0X3N0YXRlKGludCBsc3MsIHBjaV9wb3dlcl90IHBjaV9zdGF0ZSkKK3sKKwlzd2l0Y2ggKHBjaV9zdGF0ZSkgeworCWNhc2UgUENJX0QwOgorCQlpZiAoU1NNU0soRDBpMSwgbHNzKSAmIEQwSTFfQUNHX1NTU19UQVJHRVQpCisJCQlyZXR1cm4gRDBpMTsKKwkJZWxzZQorCQkJcmV0dXJuIEQwOworCWNhc2UgUENJX0QxOgorCQlyZXR1cm4gRDBpMTsKKwljYXNlIFBDSV9EMjoKKwkJcmV0dXJuIEQwaTI7CisJY2FzZSBQQ0lfRDNob3Q6CisJY2FzZSBQQ0lfRDNjb2xkOgorCQlyZXR1cm4gRDBpMzsKKwlkZWZhdWx0OgorCQlXQVJOKDEsICJwY2lfc3RhdGUgJWRcbiIsIHBjaV9zdGF0ZSk7CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGludCBwbXVfaXNzdWVfY29tbWFuZCh1MzIgcG1fc3NjKQoreworCXVuaW9uIHBtdV9wbV9zZXRfY2ZnX2NtZF90IGNvbW1hbmQ7CisKKwlpZiAocG11X3JlYWRfYnVzeV9zdGF0dXMoKSkgeworCQlwcl9kZWJ1ZygicG11IGlzIGJ1c3ksIE9wZXJhdGlvbiBub3QgcGVybWl0dGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogZW5hYmxlIGludGVycnVwdHMgaW4gUE1VIHNvIHRoYXQgaW50ZXJydXB0cyBhcmUKKwkgKiBwcm9wYWdhdGVkIHdoZW4gaW9jIGJpdCBmb3IgYSBwYXJ0aWN1bGFyIHNldAorCSAqIGNvbW1hbmQgaXMgc2V0CisJICovCisKKwlwbXVfaXJxX2VuYWJsZSgpOworCisJLyogQ29uZmlndXJlIHRoZSBzdWIgc3lzdGVtcyBmb3IgcG11MiAqLworCisJcG11X3dyaXRlX3NzYyhwbV9zc2MpOworCisJLyoKKwkgKiBTZW5kIHRoZSBzZXQgY29uZmlnIGNvbW1hbmQgZm9yIHBtdSBpdHMgY29uZmlndXJlZAorCSAqIGZvciBtb2RlIENNX0lNTUVESUFURSAmIGhlbmNlIHdpdGggTm8gVHJpZ2dlcgorCSAqLworCisJY29tbWFuZC5wbXUyX3BhcmFtcy5kX3BhcmFtLmNmZ19tb2RlID0gQ01fSU1NRURJQVRFOworCWNvbW1hbmQucG11Ml9wYXJhbXMuZF9wYXJhbS5jZmdfZGVsYXkgPSAwOworCWNvbW1hbmQucG11Ml9wYXJhbXMuZF9wYXJhbS5yc3ZkID0gMDsKKworCS8qIGNvbnN0cnVjdCB0aGUgY29tbWFuZCB0byBzZW5kIFNFVF9DRkcgdG8gcGFydGljdWxhciBQTVUgKi8KKwljb21tYW5kLnBtdTJfcGFyYW1zLmRfcGFyYW0uY21kID0gU0VUX0NGR19DTUQ7CisJY29tbWFuZC5wbXUyX3BhcmFtcy5kX3BhcmFtLmlvYyA9IDA7CisJY29tbWFuZC5wbXUyX3BhcmFtcy5kX3BhcmFtLm1vZGVfaWQgPSAwOworCWNvbW1hbmQucG11Ml9wYXJhbXMuZF9wYXJhbS5zeXNfc3RhdGUgPSBTWVNfU1RBVEVfUzBJMDsKKworCS8qIHdyaXRlIHRoZSB2YWx1ZSBvZiBQTV9DTUQgaW50byBwYXJ0aWN1bGFyIFBNVSAqLworCXByX2RlYnVnKCJwbXUgY29tbWFuZCBiZWluZyB3cml0dGVuICV4XG4iLAorCQkJY29tbWFuZC5wbXVfcG1fc2V0X2NmZ19jbWRfdmFsdWUpOworCisJcG11X3dyaXRlX2NtZChjb21tYW5kLnBtdV9wbV9zZXRfY2ZnX2NtZF92YWx1ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUxNiBwbXVfbWluX2xzc19wY2lfcmVxKHUxNiAqaWRzLCB1MTYgcGNpX3N0YXRlKQoreworCXUxNiBleGlzdGluZ19yZXF1ZXN0OworCWludCBpOworCisJZm9yIChpID0gMDsgaWRzW2ldOyArK2kpIHsKKwkJc3RydWN0IG1yc3RfZGV2aWNlICptcnN0X2RldjsKKworCQltcnN0X2RldiA9IHBjaV9pZF8yX21yc3RfZGV2KGlkc1tpXSk7CisJCWlmICh1bmxpa2VseSghbXJzdF9kZXYpKQorCQkJY29udGludWU7CisKKwkJZXhpc3RpbmdfcmVxdWVzdCA9IG1yc3RfZGV2LT5sYXRlc3RfcmVxdWVzdDsKKwkJaWYgKGV4aXN0aW5nX3JlcXVlc3QgPCBwY2lfc3RhdGUpCisJCQlwY2lfc3RhdGUgPSBleGlzdGluZ19yZXF1ZXN0OworCX0KKwlyZXR1cm4gcGNpX3N0YXRlOworfQorCisvKioKKyAqIHBtdV9wY2lfc2V0X3Bvd2VyX3N0YXRlIC0gQ2FsbGJhY2sgZnVuY3Rpb24gaXMgdXNlZCBieSBhbGwgdGhlIFBDSSBkZXZpY2VzCisgKgkJCWZvciBhIHBsYXRmb3JtICBzcGVjaWZpYyBkZXZpY2UgcG93ZXIgb24vc2h1dGRvd24uCisgKi8KKworaW50IHBtdV9wY2lfc2V0X3Bvd2VyX3N0YXRlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwY2lfcG93ZXJfdCBwY2lfc3RhdGUpCit7CisJdTMyIG9sZF9zc3MsIG5ld19zc3M7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IG1yc3RfZGV2aWNlICptcnN0X2RldjsKKworCXBtdV9zZXRfcG93ZXJfc3RhdGVfZW50cnkrKzsKKworCUJVR19PTihwZGV2LT52ZW5kb3IgIT0gUENJX1ZFTkRPUl9JRF9JTlRFTCk7CisJQlVHX09OKHBjaV9zdGF0ZSA8IFBDSV9EMCB8fCBwY2lfc3RhdGUgPiBQQ0lfRDNjb2xkKTsKKworCW1yc3RfZGV2ID0gcGNpX2lkXzJfbXJzdF9kZXYocGRldi0+ZGV2aWNlKTsKKwlpZiAodW5saWtlbHkoIW1yc3RfZGV2KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltcnN0X2Rldi0+cGNpX3N0YXRlX2NvdW50c1twY2lfc3RhdGVdKys7CS8qIGNvdW50IGludm9jYXRpb25zICovCisKKwkvKiBQTVUgZHJpdmVyIGNhbGxzIHNlbGYgYXMgcGFydCBvZiBQQ0kgaW5pdGlhbGl6YXRpb24sIGlnbm9yZSAqLworCWlmIChwZGV2LT5kZXZpY2UgPT0gUENJX0RFVl9JRF9NUlNUX1BNVSkKKwkJcmV0dXJuIDA7CisKKwlCVUdfT04oIXBtdV9yZWcpOyAvKiBTVyBidWcgaWYgY2FsbGVkIGJlZm9yZSBpbml0aWFsaXplZCAqLworCisJc3Bpbl9sb2NrKCZtcnN0X3BtdV9wb3dlcl9zdGF0ZV9sb2NrKTsKKworCWlmIChwZGV2LT5kM19kZWxheSkgeworCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJkM19kZWxheSAlZCwgc2hvdWxkIGJlIDBcbiIsCisJCQlwZGV2LT5kM19kZWxheSk7CisJCXBkZXYtPmQzX2RlbGF5ID0gMDsKKwl9CisJLyoKKwkgKiBJZiBMaW5jcm9mdCBncmFwaGljcywgc2ltcGx5IHJlbWVtYmVyIHN0YXRlCisJICovCisJaWYgKChwZGV2LT5jbGFzcyA+PiAxNikgPT0gUENJX0JBU0VfQ0xBU1NfRElTUExBWQorCQkmJiAhKChwZGV2LT5jbGFzcyAmIFBDSV9TVUJfQ0xBU1NfTUFTSykgPj4gOCkpIHsKKwkJaWYgKHBjaV9zdGF0ZSA9PSBQQ0lfRDApCisJCQlncmFwaGljc19pc19vZmYgPSAwOworCQllbHNlCisJCQlncmFwaGljc19pc19vZmYgPSAxOworCQlnb3RvIHJldDsKKwl9CisKKwlpZiAoIW1yc3RfZGV2LT5sc3MpCisJCWdvdG8gcmV0OwkvKiBkZXZpY2Ugd2l0aCBubyBMU1MgKi8KKworCWlmIChtcnN0X2Rldi0+bGF0ZXN0X3JlcXVlc3QgPT0gcGNpX3N0YXRlKQorCQlnb3RvIHJldDsJLyogbm8gY2hhbmdlICovCisKKwltcnN0X2Rldi0+bGF0ZXN0X3JlcXVlc3QgPSBwY2lfc3RhdGU7CS8qIHJlY29yZCBsYXRlc3QgcmVxdWVzdCAqLworCisJLyoKKwkgKiBMU1M5IGFuZCBMU1MxMCBjb250YWluIG11bHRpcGxlIFBDSSBkZXZpY2VzLgorCSAqIFVzZSB0aGUgbG93ZXN0IG51bWJlcmVkIChoaWdoZXN0IHBvd2VyKSBzdGF0ZSBpbiB0aGUgTFNTCisJICovCisJaWYgKG1yc3RfZGV2LT5sc3MgPT0gOSkKKwkJcGNpX3N0YXRlID0gcG11X21pbl9sc3NfcGNpX3JlcShtcnN0X2xzczlfcGNpX2lkcywgcGNpX3N0YXRlKTsKKwllbHNlIGlmIChtcnN0X2Rldi0+bHNzID09IDEwKQorCQlwY2lfc3RhdGUgPSBwbXVfbWluX2xzc19wY2lfcmVxKG1yc3RfbHNzMTBfcGNpX2lkcywgcGNpX3N0YXRlKTsKKworCXN0YXR1cyA9IHBtdV93YWl0X3JlYWR5KCk7CisJaWYgKHN0YXR1cykKKwkJZ290byByZXQ7CisKKwlvbGRfc3NzID0gcG11X3JlYWRfc3NzKCk7CisJbmV3X3NzcyA9IG9sZF9zc3MgJiB+U1NNU0soMywgbXJzdF9kZXYtPmxzcyk7CisJbmV3X3NzcyB8PSBTU01TSyhwY2lfMl9tcnN0X3N0YXRlKG1yc3RfZGV2LT5sc3MsIHBjaV9zdGF0ZSksCisJCQltcnN0X2Rldi0+bHNzKTsKKworCWlmIChuZXdfc3NzID09IG9sZF9zc3MpCisJCWdvdG8gcmV0OwkvKiBub3RoaW5nIHRvIGRvICovCisKKwlwbXVfc2V0X3Bvd2VyX3N0YXRlX3NlbmRfY21kKys7CisKKwlzdGF0dXMgPSBwbXVfaXNzdWVfY29tbWFuZChuZXdfc3NzKTsKKworCWlmICh1bmxpa2VseShzdGF0dXMgIT0gMCkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIElzc3VlIGEgUE0gY29tbWFuZFxuIik7CisJCWdvdG8gcmV0OworCX0KKworCWlmIChwbXVfd2FpdF9kb25lKCkpCisJCWdvdG8gcmV0OworCisJbHNzX3MwaTNfZW5hYmxlZCA9CisJKChwbXVfcmVhZF9zc3MoKSAmIFMwSTNfU1NTX1RBUkdFVCkgPT0gUzBJM19TU1NfVEFSR0VUKTsKK3JldDoKKwlzcGluX3VubG9jaygmbXJzdF9wbXVfcG93ZXJfc3RhdGVfbG9jayk7CisJcmV0dXJuIHN0YXR1czsKK30KKworI2lmZGVmIENPTkZJR19ERUJVR19GUworc3RhdGljIGNoYXIgKmQwaXhfbmFtZXNbXSA9IHsiRDAiLCAiRDBpMSIsICJEMGkyIiwgIkQwaTMifTsKKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpkMGl4X25hbWUoaW50IHN0YXRlKQoreworCXJldHVybiBkMGl4X25hbWVzWyhpbnQpIHN0YXRlXTsKK30KKworc3RhdGljIGludCBkZWJ1Z19tcnN0X3BtdV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqdW51c2VkKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKKwl1MzIgY3VyX3Btc3NzOworCWludCBsc3M7CisKKwlzZXFfcHJpbnRmKHMsICIweCUwOFggRDBJMV9BQ0dfU1NTX1RBUkdFVFxuIiwgRDBJMV9BQ0dfU1NTX1RBUkdFVCk7CisKKwljdXJfcG1zc3MgPSBwbXVfcmVhZF9zc3MoKTsKKworCXNlcV9wcmludGYocywgIjB4JTA4WCBTMEkzX1NTU19UQVJHRVRcbiIsIFMwSTNfU1NTX1RBUkdFVCk7CisKKwlzZXFfcHJpbnRmKHMsICIweCUwOFggQ3VycmVudCBTU1MgIiwgY3VyX3Btc3NzKTsKKwlzZXFfcHJpbnRmKHMsIGxzc19zMGkzX2VuYWJsZWQgPyAiXG4iIDogIltCTE9DS1MgczBpM11cbiIpOworCisJaWYgKGNwdW1hc2tfZXF1YWwoY3B1X29ubGluZV9tYXNrLCBjcHVtYXNrX29mKDApKSkKKwkJc2VxX3ByaW50ZihzLCAiY3B1MCBpcyBvbmx5IGNwdSBvbmxpbmVcbiIpOworCWVsc2UKKwkJc2VxX3ByaW50ZihzLCAiY3B1MCBpcyBOT1Qgb25seSBjcHUgb25saW5lIFtCTE9DS1MgUzBpM11cbiIpOworCisJc2VxX3ByaW50ZihzLCAiR0ZYOiAlc1xuIiwgZ3JhcGhpY3NfaXNfb2ZmID8gIiIgOiAiW0JMT0NLUyBzMGkzXSIpOworCisKKwlmb3JfZWFjaF9wY2lfZGV2KHBkZXYpIHsKKwkJaW50IHBvczsKKwkJdTE2IHBtY3NyOworCQlzdHJ1Y3QgbXJzdF9kZXZpY2UgKm1yc3RfZGV2OworCQlpbnQgaTsKKworCQltcnN0X2RldiA9IHBjaV9pZF8yX21yc3RfZGV2KHBkZXYtPmRldmljZSk7CisKKwkJc2VxX3ByaW50ZihzLCAiJXMgJTA0eC8lMDRYICUtMTYuMTZzICIsCisJCQlkZXZfbmFtZSgmcGRldi0+ZGV2KSwKKwkJCXBkZXYtPnZlbmRvciwgcGRldi0+ZGV2aWNlLAorCQkJZGV2X2RyaXZlcl9zdHJpbmcoJnBkZXYtPmRldikpOworCisJCWlmICh1bmxpa2VseSAoIW1yc3RfZGV2KSkgeworCQkJc2VxX3ByaW50ZihzLCAiIFVOS05PV05cbiIpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAobXJzdF9kZXYtPmxzcykKKwkJCXNlcV9wcmludGYocywgIkxTUyAlMmQgJS00cyAiLCBtcnN0X2Rldi0+bHNzLAorCQkJCWQwaXhfbmFtZSgoKGN1cl9wbXNzcyA+PgorCQkJCQkobXJzdF9kZXYtPmxzcyAqIDIpKSAmIDB4MykpKTsKKwkJZWxzZQorCQkJc2VxX3ByaW50ZihzLCAiICAgICAgICAgICAgIik7CisKKwkJLyogUENJIFBNIGNvbmZpZyBzcGFjZSBzZXR0aW5nICovCisJCXBvcyA9IHBjaV9maW5kX2NhcGFiaWxpdHkocGRldiwgUENJX0NBUF9JRF9QTSk7CisJCWlmIChwb3MgIT0gMCkgeworCQkJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgcG9zICsgUENJX1BNX0NUUkwsICZwbWNzcik7CisJCXNlcV9wcmludGYocywgIlBDSS0lLTRzIiwKKwkJCXBjaV9wb3dlcl9uYW1lKHBtY3NyICYgUENJX1BNX0NUUkxfU1RBVEVfTUFTSykpOworCQl9IGVsc2UgeworCQkJc2VxX3ByaW50ZihzLCAiICAgICAgICAiKTsKKwkJfQorCisJCXNlcV9wcmludGYocywgIiAlcyAiLCBwY2lfcG93ZXJfbmFtZShtcnN0X2Rldi0+bGF0ZXN0X3JlcXVlc3QpKTsKKwkJZm9yIChpID0gMDsgaSA8PSBQQ0lfRDNjb2xkOyArK2kpCisJCQlzZXFfcHJpbnRmKHMsICIlZCAiLCBtcnN0X2Rldi0+cGNpX3N0YXRlX2NvdW50c1tpXSk7CisKKwkJaWYgKG1yc3RfZGV2LT5sc3MpIHsKKwkJCXVuc2lnbmVkIGludCBsc3NtYXNrOworCisJCQlsc3NtYXNrID0gU1NNU0soRDBpMywgbXJzdF9kZXYtPmxzcyk7CisKKwkJCWlmICgobHNzbWFzayAmIFMwSTNfU1NTX1RBUkdFVCkgJiYKKwkJCQkoKGxzc21hc2sgJiBjdXJfcG1zc3MpICE9CisJCQkJCShsc3NtYXNrICYgUzBJM19TU1NfVEFSR0VUKSkpCisJCQkJCQlzZXFfcHJpbnRmKHMgLCAiW0JMT0NLUyBzMGkzXSIpOworCQl9CisKKwkJc2VxX3ByaW50ZihzLCAiXG4iKTsKKwl9CisJc2VxX3ByaW50ZihzLCAiV2FrZSBDb3VudGVyczpcbiIpOworCWZvciAobHNzID0gMDsgbHNzIDwgTVJTVF9OVU1fTFNTOyArK2xzcykKKwkJc2VxX3ByaW50ZihzLCAiTFNTJWQgJWRcbiIsIGxzcywgd2FrZV9jb3VudGVyc1tsc3NdKTsKKworCXNlcV9wcmludGYocywgIkludGVycnVwdCBDb3VudGVyczpcbiIpOworCXNlcV9wcmludGYocywKKwkJIklOVF9TUFVSSU9VUyBcdCU4dVxuIiAiSU5UX0NNRF9ET05FIFx0JTh1XG4iCisJCSJJTlRfQ01EX0VSUiAgXHQlOHVcbiIgIklOVF9XQUtFX1JYICBcdCU4dVxuIgorCQkiSU5UX1NTX0VSUk9SIFx0JTh1XG4iICJJTlRfUzBJWF9NSVNTXHQlOHVcbiIKKwkJIklOVF9OT19BQ0tDNiBcdCU4dVxuIiAiSU5UX0lOVkFMSUQgIFx0JTh1XG4iLAorCQlwbXVfaXJxX3N0YXRzW0lOVF9TUFVSSU9VU10sIHBtdV9pcnFfc3RhdHNbSU5UX0NNRF9ET05FXSwKKwkJcG11X2lycV9zdGF0c1tJTlRfQ01EX0VSUl0sIHBtdV9pcnFfc3RhdHNbSU5UX1dBS0VfUlhdLAorCQlwbXVfaXJxX3N0YXRzW0lOVF9TU19FUlJPUl0sIHBtdV9pcnFfc3RhdHNbSU5UX1MwSVhfTUlTU10sCisJCXBtdV9pcnFfc3RhdHNbSU5UX05PX0FDS0M2XSwgcG11X2lycV9zdGF0c1tJTlRfSU5WQUxJRF0pOworCisJc2VxX3ByaW50ZihzLCAibXJzdF9wbXVfd2FpdF9yZWFkeV9jYWxscyAgICAgICAgICAlOGRcbiIsCisJCQlwbXVfd2FpdF9yZWFkeV9jYWxscyk7CisJc2VxX3ByaW50ZihzLCAibXJzdF9wbXVfd2FpdF9yZWFkeV91ZGVsYXlzICAgICAgICAlOGRcbiIsCisJCQlwbXVfd2FpdF9yZWFkeV91ZGVsYXlzKTsKKwlzZXFfcHJpbnRmKHMsICJtcnN0X3BtdV93YWl0X3JlYWR5X3VkZWxheXNfbWF4ICAgICU4ZFxuIiwKKwkJCXBtdV93YWl0X3JlYWR5X3VkZWxheXNfbWF4KTsKKwlzZXFfcHJpbnRmKHMsICJtcnN0X3BtdV93YWl0X2RvbmVfY2FsbHMgICAgICAgICAgICU4ZFxuIiwKKwkJCXBtdV93YWl0X2RvbmVfY2FsbHMpOworCXNlcV9wcmludGYocywgIm1yc3RfcG11X3dhaXRfZG9uZV91ZGVsYXlzICAgICAgICAgJThkXG4iLAorCQkJcG11X3dhaXRfZG9uZV91ZGVsYXlzKTsKKwlzZXFfcHJpbnRmKHMsICJtcnN0X3BtdV93YWl0X2RvbmVfdWRlbGF5c19tYXggICAgICU4ZFxuIiwKKwkJCXBtdV93YWl0X2RvbmVfdWRlbGF5c19tYXgpOworCXNlcV9wcmludGYocywgIm1yc3RfcG11X3NldF9wb3dlcl9zdGF0ZV9lbnRyeSAgICAgJThkXG4iLAorCQkJcG11X3NldF9wb3dlcl9zdGF0ZV9lbnRyeSk7CisJc2VxX3ByaW50ZihzLCAibXJzdF9wbXVfc2V0X3Bvd2VyX3N0YXRlX3NlbmRfY21kICAlOGRcbiIsCisJCQlwbXVfc2V0X3Bvd2VyX3N0YXRlX3NlbmRfY21kKTsKKwlzZXFfcHJpbnRmKHMsICJTQ1UgYnVzeTogJWRcbiIsIHBtdV9yZWFkX2J1c3lfc3RhdHVzKCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVidWdfbXJzdF9wbXVfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgZGVidWdfbXJzdF9wbXVfc2hvdywgTlVMTCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRldmljZXNfc3RhdGVfb3BlcmF0aW9ucyA9IHsKKwkub3BlbgkJPSBkZWJ1Z19tcnN0X3BtdV9vcGVuLAorCS5yZWFkCQk9IHNlcV9yZWFkLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCit9OworI2VuZGlmCS8qIERFQlVHX0ZTICovCisKKy8qCisgKiBWYWxpZGF0ZSBTQ1UgUENJIHNoaW0gUENJIHZlbmRvciBjYXBhYmlsaXR5IGJ5dGUKKyAqIGFnYWluc3QgTFNTIGhhcmQtY29kZWQgaW4gbXJzdF9kZXZzW10gYWJvdmUuCisgKiBERUJVRyBvbmx5LgorICovCitzdGF0aWMgdm9pZCBwbXVfc2N1X2Zpcm13YXJlX2RlYnVnKHZvaWQpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOworCisJZm9yX2VhY2hfcGNpX2RldihwZGV2KSB7CisJCXN0cnVjdCBtcnN0X2RldmljZSAqbXJzdF9kZXY7CisJCXU4IHBjaV9jb25maWdfbHNzOworCQlpbnQgcG9zOworCisJCW1yc3RfZGV2ID0gcGNpX2lkXzJfbXJzdF9kZXYocGRldi0+ZGV2aWNlKTsKKwkJaWYgKHVubGlrZWx5KCFtcnN0X2RldikpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBGV19CVUcgInBtdTogVW5rbm93biAiCisJCQkJIlBDSSBkZXZpY2UgMHglMDRYXG4iLCBwZGV2LT5kZXZpY2UpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAobXJzdF9kZXYtPmxzcyA9PSAwKQorCQkJY29udGludWU7CSAvKiBubyBMU1MgaW4gb3VyIHRhYmxlICovCisKKwkJcG9zID0gcGNpX2ZpbmRfY2FwYWJpbGl0eShwZGV2LCBQQ0lfQ0FQX0lEX1ZORFIpOworCQlpZiAoIXBvcyAhPSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgRldfQlVHICJwbXU6IDB4JTA0WCAiCisJCQkJIm1pc3NpbmcgUENJIFZlbmRvciBDYXBhYmlsaXR5XG4iLAorCQkJCXBkZXYtPmRldmljZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBwb3MgKyA0LCAmcGNpX2NvbmZpZ19sc3MpOworCQlpZiAoIShwY2lfY29uZmlnX2xzcyAmIFBDSV9WRU5ET1JfQ0FQX0xPR19TU19NQVNLKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSIEZXX0JVRyAicG11OiAweCUwNFggIgorCQkJCSJpbnZhbGlkIFBDSSBWZW5kb3IgQ2FwYWJpbGl0eSAweCV4ICIKKwkJCQkiIGV4cGVjdGVkIExTUyAweCVYXG4iLAorCQkJCXBkZXYtPmRldmljZSwgcGNpX2NvbmZpZ19sc3MsIG1yc3RfZGV2LT5sc3MpOworCQkJY29udGludWU7CisJCX0KKwkJcGNpX2NvbmZpZ19sc3MgJj0gUENJX1ZFTkRPUl9DQVBfTE9HX0lEX01BU0s7CisKKwkJaWYgKG1yc3RfZGV2LT5sc3MgPT0gcGNpX2NvbmZpZ19sc3MpCisJCQljb250aW51ZTsKKworCQlwcmludGsoS0VSTl9FUlIgRldfQlVHICJwbXU6IDB4JTA0WCBMU1MgPSAlZCwgZXhwZWN0ZWQgJWRcbiIsCisJCQlwZGV2LT5kZXZpY2UsIHBjaV9jb25maWdfbHNzLCBtcnN0X2Rldi0+bHNzKTsKKwl9Cit9CisKKy8qKgorICogcG11X3Byb2JlCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IHBtdV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQoreworCWludCByZXQ7CisJc3RydWN0IG1yc3RfcG11X3JlZyAqcG11OworCisJLyogSW5pdCB0aGUgZGV2aWNlICovCisJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gRW5hYmxlIFBDSSBkZXZpY2VcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgTVJTVF9QTVVfRFJWX05BTUUpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBvYnRhaW4gUENJIHJlc291cmNlcywgYWJvcnRpbmdcbiIpOworCQlnb3RvIG91dF9lcnIxOworCX0KKworCS8qIE1hcCB0aGUgbWVtb3J5IG9mIFBNVSByZWcgYmFzZSAqLworCXBtdSA9IHBjaV9pb21hcChwZGV2LCAwLCAwKTsKKwlpZiAoIXBtdSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gbWFwIHRoZSBQTVUgYWRkcmVzcyBzcGFjZVxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2VycjI7CisJfQorCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCisJLyogL3N5cy9rZXJuZWwvZGVidWcvbXJzdF9wbXUgKi8KKwkodm9pZCkgZGVidWdmc19jcmVhdGVfZmlsZSgibXJzdF9wbXUiLCBTX0lGUkVHIHwgU19JUlVHTywKKwkJCQlOVUxMLCBOVUxMLCAmZGV2aWNlc19zdGF0ZV9vcGVyYXRpb25zKTsKKyNlbmRpZgorCXBtdV9yZWcgPSBwbXU7CS8qIHN1Y2Nlc3MgKi8KKworCWlmIChyZXF1ZXN0X2lycShwZGV2LT5pcnEsIHBtdV9pcnEsIDAsIE1SU1RfUE1VX0RSVl9OQU1FLCBOVUxMKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJSZWdpc3RlcmluZyBpc3IgaGFzIGZhaWxlZFxuIik7CisJCXJldCA9IC0xOworCQlnb3RvIG91dF9lcnIzOworCX0KKworCXBtdV9zY3VfZmlybXdhcmVfZGVidWcoKTsKKworCXBtdV93cml0ZV93a2MoUzBJM19XQUtFX1NPVVJDRVMpOwkvKiBFbmFibGUgUzBpMyB3YWtldXAgc291cmNlcyAqLworCisJcG11X3dhaXRfcmVhZHkoKTsKKworCXBtdV93cml0ZV9zc2MoRDBJMV9BQ0dfU1NTX1RBUkdFVCk7CS8qIEVuYWJsZSBBdXRvLUNsb2NrX0dhdGluZyAqLworCXBtdV93cml0ZV9jbWQoMHgyMDEpOworCisJc3Bpbl9sb2NrX2luaXQoJm1yc3RfcG11X3Bvd2VyX3N0YXRlX2xvY2spOworCisJLyogRW5hYmxlIHRoZSBoYXJkd2FyZSBpbnRlcnJ1cHQgKi8KKwlwbXVfaXJxX2VuYWJsZSgpOworCXJldHVybiAwOworCitvdXRfZXJyMzoKKwlmcmVlX2lycShwZGV2LT5pcnEsIE5VTEwpOworCXBjaV9pb3VubWFwKHBkZXYsIHBtdV9yZWcpOworCXBtdV9yZWcgPSBOVUxMOworb3V0X2VycjI6CisJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIDApOworb3V0X2VycjE6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBwbXVfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCWRldl9lcnIoJnBkZXYtPmRldiwgIk1pZCBQTSBwbXVfcmVtb3ZlIGNhbGxlZFxuIik7CisKKwkvKiBGcmVlaW5nIHVwIHRoZSBpcnEgKi8KKwlmcmVlX2lycShwZGV2LT5pcnEsIE5VTEwpOworCisJcGNpX2lvdW5tYXAocGRldiwgcG11X3JlZyk7CisJcG11X3JlZyA9IE5VTEw7CisKKwkvKiBkaXNhYmxlIHRoZSBjdXJyZW50IFBDSSBkZXZpY2UgKi8KKwlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgMCk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworfQorCitzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUocG11X3BjaV9pZHMpID0geworCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZfSURfTVJTVF9QTVUpLCAwIH0sCisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgcG11X3BjaV9pZHMpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgZHJpdmVyID0geworCS5uYW1lID0gTVJTVF9QTVVfRFJWX05BTUUsCisJLmlkX3RhYmxlID0gcG11X3BjaV9pZHMsCisJLnByb2JlID0gcG11X3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChwbXVfcmVtb3ZlKSwKK307CisKKy8qKgorICogcG11X3BjaV9yZWdpc3RlciAtIHJlZ2lzdGVyIHRoZSBQTVUgZHJpdmVyIGFzIFBDSSBkZXZpY2UKKyAqLworc3RhdGljIGludCBfX2luaXQgcG11X3BjaV9yZWdpc3Rlcih2b2lkKQoreworCXJldHVybiBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZkcml2ZXIpOworfQorCisvKiBSZWdpc3RlciBhbmQgcHJvYmUgdmlhIGZzX2luaXRjYWxsKCkgdG8gcHJlY2VlZCBkZXZpY2VfaW5pdGNhbGwoKSAqLworZnNfaW5pdGNhbGwocG11X3BjaV9yZWdpc3Rlcik7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtaWRfcGNpX2NsZWFudXAodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmRyaXZlcik7Cit9CisKK3N0YXRpYyBpbnQgaWFfbWFqb3I7CitzdGF0aWMgaW50IGlhX21pbm9yOworCitzdGF0aWMgaW50IHBtdV9zZmlfcGFyc2Vfb2VtKHN0cnVjdCBzZmlfdGFibGVfaGVhZGVyICp0YWJsZSkKK3sKKwlzdHJ1Y3Qgc2ZpX3RhYmxlX3NpbXBsZSAqc2I7CisKKwlzYiA9IChzdHJ1Y3Qgc2ZpX3RhYmxlX3NpbXBsZSAqKXRhYmxlOworCWlhX21ham9yID0gKHNiLT5wZW50cnlbMV0gPj4gMCkgJiAweEZGRkY7CisJaWFfbWlub3IgPSAoc2ItPnBlbnRyeVsxXSA+PiAxNikgJiAweEZGRkY7CisJcHJpbnRrKEtFUk5fSU5GTyAibXJzdF9wbXU6IElBIEZXIHZlcnNpb24gdiV4LiV4XG4iLAorCQlpYV9tYWpvciwgaWFfbWlub3IpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHNjdV9md19jaGVjayh2b2lkKQoreworCWludCByZXQ7CisJdTMyIGZ3X3ZlcnNpb247CisKKwlpZiAoIXBtdV9yZWcpCisJCXJldHVybiAwOwkvKiB0aGlzIGRyaXZlciBkaWRuJ3QgcHJvYmUtb3V0ICovCisKKwlzZmlfdGFibGVfcGFyc2UoIk9FTUIiLCBOVUxMLCBOVUxMLCBwbXVfc2ZpX3BhcnNlX29lbSk7CisKKwlpZiAoaWFfbWFqb3IgPCAweDYwMDUgfHwgaWFfbWlub3IgPCAweDE1MjUpIHsKKwkJV0FSTigxLCAibXJzdF9wbXU6IElBIEZXIHZlcnNpb24gdG9vIG9sZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXQgPSBpbnRlbF9zY3VfaXBjX2NvbW1hbmQoSVBDTVNHX0ZXX1JFVklTSU9OLCAwLCBOVUxMLCAwLAorCQkJCQkmZndfdmVyc2lvbiwgMSk7CisKKwlpZiAocmV0KSB7CisJCVdBUk4oMSwgIm1yc3RfcG11OiBJUEMgRlcgdmVyc2lvbj8gJWRcbiIsIHJldCk7CisJfSBlbHNlIHsKKwkJaW50IHNjdV9tYWpvciA9IChmd192ZXJzaW9uID4+IDgpICYgMHhGRjsKKwkJaW50IHNjdV9taW5vciA9IChmd192ZXJzaW9uID4+IDApICYgMHhGRjsKKworCQlwcmludGsoS0VSTl9JTkZPICJtcnN0X3BtdTogZmlybXdhcmUgdiV4XG4iLCBmd192ZXJzaW9uKTsKKworCQlpZiAoKHNjdV9tYWpvciA+PSAweEMwKSAmJiAoc2N1X21pbm9yID49IDB4NDkpKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJtcnN0X3BtdTogZW5hYmxpbmcgUzBpM1xuIik7CisJCQltcnN0X3BtdV9zMGkzX2VuYWJsZSA9IHRydWU7CisJCX0gZWxzZSB7CisJCQlXQVJOKDEsICJtcnN0X3BtdTogUzBpMyBkaXNhYmxlZCwgb2xkIGZpcm13YXJlICVYLiVYIiwKKwkJCQkJc2N1X21ham9yLCBzY3VfbWlub3IpOworCQl9CisJfQorCXJldHVybiAwOworfQorbGF0ZV9pbml0Y2FsbChzY3VfZndfY2hlY2spOworbW9kdWxlX2V4aXQobWlkX3BjaV9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BsYXRmb3JtL21yc3QvcG11LmggYi9hcmNoL3g4Ni9wbGF0Zm9ybS9tcnN0L3BtdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYmZlNjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9tcnN0L3BtdS5oCkBAIC0wLDAgKzEsMjM0IEBACisvKgorICogbXJzdC9wbXUuaCAtIHByaXZhdGUgZGVmaW5pdGlvbnMgZm9yIE1SU1QgUG93ZXIgTWFuYWdlbWVudCBVbml0IG1yc3QvcG11LmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIEludGVsIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKi8KKworI2lmbmRlZiBfTVJTVF9QTVVfSF8KKyNkZWZpbmUgX01SU1RfUE1VX0hfCisKKyNkZWZpbmUgUENJX0RFVl9JRF9NUlNUX1BNVQkJMHgwODEwCisjZGVmaW5lIE1SU1RfUE1VX0RSVl9OQU1FCQkibXJzdF9wbXUiCisjZGVmaW5lCVBDSV9TVUJfQ0xBU1NfTUFTSwkJMHhGRjAwCisKKyNkZWZpbmUJUENJX1ZFTkRPUl9DQVBfTE9HX0lEX01BU0sJMHg3RgorI2RlZmluZSBQQ0lfVkVORE9SX0NBUF9MT0dfU1NfTUFTSwkweDgwCisKKyNkZWZpbmUgU1VCX1NZU19BTExfRDBJMQkweDAxMTU1NTU1CisjZGVmaW5lIFMwSTNfV0FLRV9TT1VSQ0VTCTB4MDAwMDFGRkYKKworI2RlZmluZSBQTV9TMEkzX0NPTU1BTkQJCQkJCVwKKwkoKDAgPDwgMzEpIHwJLyogUmVzZXJ2ZWQgKi8JCQlcCisJKDAgPDwgMzApIHwJLyogQ29yZSBtdXN0IGJlIGlkbGUgKi8JCVwKKwkoMHhjMiA8PCAyMikgfAkvKiBBQ0sgQzYgdHJpZ2dlciAqLwkJXAorCSgzIDw8IDE5KSB8CS8qIFRyaWdnZXIgb24gRE1JIG1lc3NhZ2UgKi8JXAorCSgzIDw8IDE2KSB8CS8qIEVudGVyIFMwaTMgKi8JCVwKKwkoMCA8PCAxMykgfAkvKiBOdW1lcmljIG1vZGUgSUQgKHN3KSAqLwlcCisJKDMgPDwgOSkgfAkvKiBUcmlnZ2VyIG1vZGUgKi8JCVwKKwkoMCA8PCA4KSB8CS8qIERvIG5vdCBpbnRlcnJ1cHQgKi8JCVwKKwkoMSA8PCAwKSkJLyogU2V0IGNvbmZpZ3VyYXRpb24gKi8KKworI2RlZmluZQlMU1NfRE1JCQkwCisjZGVmaW5lCUxTU19TRF9IQzAJMQorI2RlZmluZQlMU1NfU0RfSEMxCTIKKyNkZWZpbmUJTFNTX05BTkQJMworI2RlZmluZQlMU1NfSU1BR0lORwk0CisjZGVmaW5lCUxTU19TRUNVUklUWQk1CisjZGVmaW5lCUxTU19ESVNQTEFZCTYKKyNkZWZpbmUJTFNTX1VTQl9IQwk3CisjZGVmaW5lCUxTU19VU0JfT1RHCTgKKyNkZWZpbmUJTFNTX0FVRElPCTkKKyNkZWZpbmUJTFNTX0FVRElPX0xQRQk5CisjZGVmaW5lCUxTU19BVURJT19TU1AJOQorI2RlZmluZQlMU1NfSTJDMAkxMAorI2RlZmluZQlMU1NfSTJDMQkxMAorI2RlZmluZQlMU1NfSTJDMgkxMAorI2RlZmluZQlMU1NfS0JECQkxMAorI2RlZmluZQlMU1NfU1BJMAkxMAorI2RlZmluZQlMU1NfU1BJMQkxMAorI2RlZmluZQlMU1NfU1BJMgkxMAorI2RlZmluZQlMU1NfR1BJTwkxMAorI2RlZmluZQlMU1NfU1JBTQkxMQkvKiB1c2VkIGJ5IFNDVSwgZG8gbm90IHRvdWNoICovCisjZGVmaW5lCUxTU19TRF9IQzIJMTIKKy8qIExTUyBoYXJkd2FyZSBiaXRzIDE1LDE0LDEzIGFyZSBoYXJkd2lyZWQgdG8gMCwgdGh1cyB1bnVzYWJsZSAqLworI2RlZmluZSBNUlNUX05VTV9MU1MJMTMKKworI2RlZmluZSBNSU4oYSwgYikgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorCisjZGVmaW5lCVNTTVNLKG1hc2ssIGxzcykgKChtYXNrKSA8PCAoKGxzcykgKiAyKSkKKyNkZWZpbmUJRDAJMAorI2RlZmluZQlEMGkxCTEKKyNkZWZpbmUJRDBpMgkyCisjZGVmaW5lCUQwaTMJMworCisjZGVmaW5lIFMwSTNfU1NTX1RBUkdFVAkoCQlcCisJU1NNU0soRDBpMSwgTFNTX0RNSSkgfAkJXAorCVNTTVNLKEQwaTMsIExTU19TRF9IQzApIHwJXAorCVNTTVNLKEQwaTMsIExTU19TRF9IQzEpIHwJXAorCVNTTVNLKEQwaTMsIExTU19OQU5EKSB8CQlcCisJU1NNU0soRDBpMywgTFNTX1NEX0hDMikgfAlcCisJU1NNU0soRDBpMywgTFNTX0lNQUdJTkcpIHwJXAorCVNTTVNLKEQwaTMsIExTU19TRUNVUklUWSkgfAlcCisJU1NNU0soRDBpMywgTFNTX0RJU1BMQVkpIHwJXAorCVNTTVNLKEQwaTMsIExTU19VU0JfSEMpIHwJXAorCVNTTVNLKEQwaTMsIExTU19VU0JfT1RHKSB8CVwKKwlTU01TSyhEMGkzLCBMU1NfQVVESU8pIHwJXAorCVNTTVNLKEQwaTEsIExTU19JMkMwKSkKKworLyoKKyAqIEQwaTEgb24gTGFuZ3dlbGwgaXMgQXV0b25vbW91cyBDbG9jayBHYXRpbmcgKEFDRykuCisgKiBFbmFibGUgQUNHIG9uIGV2ZXJ5IExTUyBleGNlcHQgY2FtZXJhIGFuZCBhdWRpbworICovCisjZGVmaW5lIEQwSTFfQUNHX1NTU19UQVJHRVQJIFwKKwkoU1VCX1NZU19BTExfRDBJMSAmIH5TU01TSyhEMGkxLCBMU1NfSU1BR0lORykgJiB+U1NNU0soRDBpMSwgTFNTX0FVRElPKSkKKworZW51bSBjbV9tb2RlIHsKKwlDTV9OT1AsCQkJLyogaWdub3JlIHRoZSBjb25maWcgbW9kZSB2YWx1ZSAqLworCUNNX0lNTUVESUFURSwKKwlDTV9ERUxBWSwKKwlDTV9UUklHR0VSLAorCUNNX0lOVkFMSUQKK307CisKK2VudW0gc3lzX3N0YXRlIHsKKwlTWVNfU1RBVEVfUzBJMCwKKwlTWVNfU1RBVEVfUzBJMSwKKwlTWVNfU1RBVEVfUzBJMiwKKwlTWVNfU1RBVEVfUzBJMywKKwlTWVNfU1RBVEVfUzMsCisJU1lTX1NUQVRFX1M1Cit9OworCisjZGVmaW5lIFNFVF9DRkdfQ01ECTEKKworZW51bSBpbnRfc3RhdHVzIHsKKwlJTlRfU1BVUklPVVMgPSAwLAorCUlOVF9DTURfRE9ORSA9IDEsCisJSU5UX0NNRF9FUlIgPSAyLAorCUlOVF9XQUtFX1JYID0gMywKKwlJTlRfU1NfRVJST1IgPSA0LAorCUlOVF9TMElYX01JU1MgPSA1LAorCUlOVF9OT19BQ0tDNiA9IDYsCisJSU5UX0lOVkFMSUQgPSA3LAorfTsKKworLyogUE1VIHJlZ2lzdGVyIGludGVyZmFjZSAqLworc3RhdGljIHN0cnVjdCBtcnN0X3BtdV9yZWcgeworCXUzMiBwbV9zdHM7CQkvKiAweDAwICovCisJdTMyIHBtX2NtZDsJCS8qIDB4MDQgKi8KKwl1MzIgcG1faWNzOwkJLyogMHgwOCAqLworCXUzMiBfcmVzdjE7CQkvKiAweDBDICovCisJdTMyIHBtX3drY1syXTsJCS8qIDB4MTAgKi8KKwl1MzIgcG1fd2tzWzJdOwkJLyogMHgxOCAqLworCXUzMiBwbV9zc2NbNF07CQkvKiAweDIwICovCisJdTMyIHBtX3Nzc1s0XTsJCS8qIDB4MzAgKi8KKwl1MzIgcG1fd3NzY1s0XTsJCS8qIDB4NDAgKi8KKwl1MzIgcG1fYzNjNDsJCS8qIDB4NTAgKi8KKwl1MzIgcG1fYzVjNjsJCS8qIDB4NTQgKi8KKwl1MzIgcG1fbXNpX2Rpc2FibGU7CS8qIDB4NTggKi8KK30gKnBtdV9yZWc7CisKK3N0YXRpYyBpbmxpbmUgdTMyIHBtdV9yZWFkX3N0cyh2b2lkKSB7IHJldHVybiByZWFkbCgmcG11X3JlZy0+cG1fc3RzKTsgfQorc3RhdGljIGlubGluZSB1MzIgcG11X3JlYWRfaWNzKHZvaWQpIHsgcmV0dXJuIHJlYWRsKCZwbXVfcmVnLT5wbV9pY3MpOyB9CitzdGF0aWMgaW5saW5lIHUzMiBwbXVfcmVhZF93a3Modm9pZCkgeyByZXR1cm4gcmVhZGwoJnBtdV9yZWctPnBtX3drc1swXSk7IH0KK3N0YXRpYyBpbmxpbmUgdTMyIHBtdV9yZWFkX3Nzcyh2b2lkKSB7IHJldHVybiByZWFkbCgmcG11X3JlZy0+cG1fc3NzWzBdKTsgfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcG11X3dyaXRlX2NtZCh1MzIgYXJnKSB7IHdyaXRlbChhcmcsICZwbXVfcmVnLT5wbV9jbWQpOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgcG11X3dyaXRlX2ljcyh1MzIgYXJnKSB7IHdyaXRlbChhcmcsICZwbXVfcmVnLT5wbV9pY3MpOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgcG11X3dyaXRlX3drYyh1MzIgYXJnKSB7IHdyaXRlbChhcmcsICZwbXVfcmVnLT5wbV93a2NbMF0pOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgcG11X3dyaXRlX3NzYyh1MzIgYXJnKSB7IHdyaXRlbChhcmcsICZwbXVfcmVnLT5wbV9zc2NbMF0pOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgcG11X3dyaXRlX3dzc2ModTMyIGFyZykKKwkJCQkJeyB3cml0ZWwoYXJnLCAmcG11X3JlZy0+cG1fd3NzY1swXSk7IH0KKworc3RhdGljIGlubGluZSB2b2lkIHBtdV9tc2lfZW5hYmxlKHZvaWQpIHsgd3JpdGVsKDAsICZwbXVfcmVnLT5wbV9tc2lfZGlzYWJsZSk7IH0KK3N0YXRpYyBpbmxpbmUgdTMyIHBtdV9tc2lfaXNfZGlzYWJsZWQodm9pZCkKKwkJCQl7IHJldHVybiByZWFkbCgmcG11X3JlZy0+cG1fbXNpX2Rpc2FibGUpOyB9CisKK3VuaW9uIHBtdV9wbV9pY3MgeworCXN0cnVjdCB7CisJCXUzMiBjYXVzZTo4OworCQl1MzIgZW5hYmxlOjE7CisJCXUzMiBwZW5kaW5nOjE7CisJCXUzMiByZXNlcnZlZDoyMjsKKwl9IGJpdHM7CisJdTMyIHZhbHVlOworfTsKKworc3RhdGljIGlubGluZSB2b2lkIHBtdV9pcnFfZW5hYmxlKHZvaWQpCit7CisJdW5pb24gcG11X3BtX2ljcyBwbXVfaWNzOworCisJcG11X2ljcy52YWx1ZSA9IHBtdV9yZWFkX2ljcygpOworCXBtdV9pY3MuYml0cy5lbmFibGUgPSAxOworCXBtdV93cml0ZV9pY3MocG11X2ljcy52YWx1ZSk7Cit9CisKK3VuaW9uIHBtdV9wbV9zdGF0dXMgeworCXN0cnVjdCB7CisJCXUzMiBwbXVfcmV2Ojg7CisJCXUzMiBwbXVfYnVzeToxOworCQl1MzIgbW9kZV9pZDo0OworCQl1MzIgUmVzZXJ2ZWQ6MTk7CisJfSBwbXVfc3RhdHVzX3BhcnRzOworCXUzMiBwbXVfc3RhdHVzX3ZhbHVlOworfTsKKworc3RhdGljIGlubGluZSBpbnQgcG11X3JlYWRfYnVzeV9zdGF0dXModm9pZCkKK3sKKwl1bmlvbiBwbXVfcG1fc3RhdHVzIHJlc3VsdDsKKworCXJlc3VsdC5wbXVfc3RhdHVzX3ZhbHVlID0gcG11X3JlYWRfc3RzKCk7CisKKwlyZXR1cm4gcmVzdWx0LnBtdV9zdGF0dXNfcGFydHMucG11X2J1c3k7Cit9CisKKy8qIHBtdSBzZXQgY29uZmlnIHBhcmFtZXRlcnMgKi8KK3N0cnVjdCBjZmdfZGVsYXlfcGFyYW1fdCB7CisJdTMyIGNtZDo4OworCXUzMiBpb2M6MTsKKwl1MzIgY2ZnX21vZGU6NDsKKwl1MzIgbW9kZV9pZDozOworCXUzMiBzeXNfc3RhdGU6MzsKKwl1MzIgY2ZnX2RlbGF5Ojg7CisJdTMyIHJzdmQ6NTsKK307CisKK3N0cnVjdCBjZmdfdHJpZ19wYXJhbV90IHsKKwl1MzIgY21kOjg7CisJdTMyIGlvYzoxOworCXUzMiBjZmdfbW9kZTo0OworCXUzMiBtb2RlX2lkOjM7CisJdTMyIHN5c19zdGF0ZTozOworCXUzMiBjZmdfdHJpZ190eXBlOjM7CisJdTMyIGNmZ190cmlnX3ZhbDo4OworCXUzMiBjbWJpOjE7CisJdTMyIHJzdmQxOjE7Cit9OworCit1bmlvbiBwbXVfcG1fc2V0X2NmZ19jbWRfdCB7CisJdW5pb24geworCQlzdHJ1Y3QgY2ZnX2RlbGF5X3BhcmFtX3QgZF9wYXJhbTsKKwkJc3RydWN0IGNmZ190cmlnX3BhcmFtX3QgdF9wYXJhbTsKKwl9IHBtdTJfcGFyYW1zOworCXUzMiBwbXVfcG1fc2V0X2NmZ19jbWRfdmFsdWU7Cit9OworCisjaWZkZWYgRlVUVVJFX1BBVENICitleHRlcm4gaW50IG1yc3RfczBpM19lbnRyeSh1MzIgcmVndmFsLCB1MzIgKnJlZ2FkZHIpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IG1yc3RfczBpM19lbnRyeSh1MzIgcmVndmFsLCB1MzIgKnJlZ2FkZHIpIHsgcmV0dXJuIC0xOyB9CisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL01ha2VmaWxlIGIvYXJjaC94ODYveGVuL01ha2VmaWxlCmluZGV4IGNjZjczYjIuLjQ1ZTk0YWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni94ZW4vTWFrZWZpbGUKQEAgLTEzLDcgKzEzLDkgQEAKIG9iai15CQk6PSBlbmxpZ2h0ZW4ubyBzZXR1cC5vIG11bHRpY2FsbHMubyBtbXUubyBpcnEubyBcCiAJCQl0aW1lLm8geGVuLWFzbS5vIHhlbi1hc21fJChCSVRTKS5vIFwKIAkJCWdyYW50LXRhYmxlLm8gc3VzcGVuZC5vIHBsYXRmb3JtLXBjaS11bnBsdWcubyBcCi0JCQlwMm0ubyB0cmFjZS5vCisJCQlwMm0ubworCitvYmotJChDT05GSUdfRlVOQ1RJT05fVFJBQ0VSKSArPSB0cmFjZS5vCiAKIG9iai0kKENPTkZJR19TTVApCQkrPSBzbXAubwogb2JqLSQoQ09ORklHX1BBUkFWSVJUX1NQSU5MT0NLUykrPSBzcGlubG9jay5vCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vc2V0dXAuYyBiL2FyY2gveDg2L3hlbi9zZXR1cC5jCmluZGV4IDYwYWVlYjUuLmE5NjI3ZTIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9zZXR1cC5jCisrKyBiL2FyY2gveDg2L3hlbi9zZXR1cC5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KICNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWlkbGUuaD4KIAogI2luY2x1ZGUgPGFzbS9lbGYuaD4KICNpbmNsdWRlIDxhc20vdmRzby5oPgpAQCAtNDI2LDcgKzQyNyw3IEBACiAjaWZkZWYgQ09ORklHX1g4Nl8zMgogCWJvb3RfY3B1X2RhdGEuaGx0X3dvcmtzX29rID0gMTsKICNlbmRpZgotCXBtX2lkbGUgPSBkZWZhdWx0X2lkbGU7CisJZGlzYWJsZV9jcHVpZGxlKCk7CiAJYm9vdF9vcHRpb25faWRsZV9vdmVycmlkZSA9IElETEVfSEFMVDsKIAogCWZpZGRsZV92ZHNvKCk7CmRpZmYgLS1naXQgYS9ibG9jay9ibGstY29yZS5jIGIvYmxvY2svYmxrLWNvcmUuYwppbmRleCBiODUwYmVkLi5iNjI3NTU4IDEwMDY0NAotLS0gYS9ibG9jay9ibGstY29yZS5jCisrKyBiL2Jsb2NrL2Jsay1jb3JlLmMKQEAgLTEzNjgsOCArMTM2OCwxMCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBmYWlsX21ha2VfcmVxdWVzdF9kZWJ1Z2ZzKHZvaWQpCiB7Ci0JcmV0dXJuIGluaXRfZmF1bHRfYXR0cl9kZW50cmllcygmZmFpbF9tYWtlX3JlcXVlc3QsCi0JCQkJCSJmYWlsX21ha2VfcmVxdWVzdCIpOworCXN0cnVjdCBkZW50cnkgKmRpciA9IGZhdWx0X2NyZWF0ZV9kZWJ1Z2ZzX2F0dHIoImZhaWxfbWFrZV9yZXF1ZXN0IiwKKwkJCQkJCU5VTEwsICZmYWlsX21ha2VfcmVxdWVzdCk7CisKKwlyZXR1cm4gSVNfRVJSKGRpcikgPyBQVFJfRVJSKGRpcikgOiAwOwogfQogCiBsYXRlX2luaXRjYWxsKGZhaWxfbWFrZV9yZXF1ZXN0X2RlYnVnZnMpOwpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLXRpbWVvdXQuYyBiL2Jsb2NrL2Jsay10aW1lb3V0LmMKaW5kZXggNGYwYzA2Yy4uNzgwMzU0OCAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLXRpbWVvdXQuYworKysgYi9ibG9jay9ibGstdGltZW91dC5jCkBAIC0yOCw3ICsyOCwxMCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBmYWlsX2lvX3RpbWVvdXRfZGVidWdmcyh2b2lkKQogewotCXJldHVybiBpbml0X2ZhdWx0X2F0dHJfZGVudHJpZXMoJmZhaWxfaW9fdGltZW91dCwgImZhaWxfaW9fdGltZW91dCIpOworCXN0cnVjdCBkZW50cnkgKmRpciA9IGZhdWx0X2NyZWF0ZV9kZWJ1Z2ZzX2F0dHIoImZhaWxfaW9fdGltZW91dCIsCisJCQkJCQlOVUxMLCAmZmFpbF9pb190aW1lb3V0KTsKKworCXJldHVybiBJU19FUlIoZGlyKSA/IFBUUl9FUlIoZGlyKSA6IDA7CiB9CiAKIGxhdGVfaW5pdGNhbGwoZmFpbF9pb190aW1lb3V0X2RlYnVnZnMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY2dsb2JhbC5oIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2dsb2JhbC5oCmluZGV4IDczODYzZDg2Li43NmRjMDJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjZ2xvYmFsLmgKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9hY2dsb2JhbC5oCkBAIC0xMjYsNiArMTI2LDEyIEBACiAgKi8KIHU4IEFDUElfSU5JVF9HTE9CQUwoYWNwaV9nYmxfdHJ1bmNhdGVfaW9fYWRkcmVzc2VzLCBGQUxTRSk7CiAKKy8qCisgKiBEaXNhYmxlIHJ1bnRpbWUgY2hlY2tpbmcgYW5kIHJlcGFpciBvZiB2YWx1ZXMgcmV0dXJuZWQgYnkgY29udHJvbCBtZXRob2RzLgorICogVXNlIG9ubHkgaWYgdGhlIHJlcGFpciBpcyBjYXVzaW5nIGEgcHJvYmxlbSBvbiBhIHBhcnRpY3VsYXIgbWFjaGluZS4KKyAqLwordTggQUNQSV9JTklUX0dMT0JBTChhY3BpX2dibF9kaXNhYmxlX2F1dG9fcmVwYWlyLCBGQUxTRSk7CisKIC8qIGFjcGlfZ2JsX0ZBRFQgaXMgYSBsb2NhbCBjb3B5IG9mIHRoZSBGQURULCBjb252ZXJ0ZWQgdG8gYSBjb21tb24gZm9ybWF0LiAqLwogCiBzdHJ1Y3QgYWNwaV90YWJsZV9mYWR0IGFjcGlfZ2JsX0ZBRFQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjbG9jYWwuaCBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNsb2NhbC5oCmluZGV4IGM3Zjc0M2MuLjU1NTIxMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNsb2NhbC5oCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNsb2NhbC5oCkBAIC0zNTcsNiArMzU3LDcgQEAKIAljaGFyICpwYXRobmFtZTsKIAljb25zdCB1bmlvbiBhY3BpX3ByZWRlZmluZWRfaW5mbyAqcHJlZGVmaW5lZDsKIAl1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpwYXJlbnRfcGFja2FnZTsKKwlzdHJ1Y3QgYWNwaV9uYW1lc3BhY2Vfbm9kZSAqbm9kZTsKIAl1MzIgZmxhZ3M7CiAJdTggbm9kZV9mbGFnczsKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjcHJlZGVmLmggYi9kcml2ZXJzL2FjcGkvYWNwaWNhL2FjcHJlZGVmLmgKaW5kZXggOTRlNzNjOS4uYzQ0NWNjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FjcGljYS9hY3ByZWRlZi5oCisrKyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvYWNwcmVkZWYuaApAQCAtNDY4LDYgKzQ2OCw3IEBACiAJe3siX1NXUyIsIDAsIEFDUElfUlRZUEVfSU5URUdFUn19LAogCXt7Il9UQzEiLCAwLCBBQ1BJX1JUWVBFX0lOVEVHRVJ9fSwKIAl7eyJfVEMyIiwgMCwgQUNQSV9SVFlQRV9JTlRFR0VSfX0sCisJe3siX1RETCIsIDAsIEFDUElfUlRZUEVfSU5URUdFUn19LAogCXt7Il9USVAiLCAxLCBBQ1BJX1JUWVBFX0lOVEVHRVJ9fSwKIAl7eyJfVElWIiwgMSwgQUNQSV9SVFlQRV9JTlRFR0VSfX0sCiAJe3siX1RNUCIsIDAsIEFDUElfUlRZUEVfSU5URUdFUn19LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGljYS9uc3ByZWRlZi5jIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3ByZWRlZi5jCmluZGV4IDlmYjAzZmEuLmM4NDVjODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNwcmVkZWYuYworKysgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zcHJlZGVmLmMKQEAgLTE5MywxNCArMTkzLDIwIEBACiAJfQogCiAJLyoKLQkgKiAxKSBXZSBoYXZlIGEgcmV0dXJuIHZhbHVlLCBidXQgaWYgb25lIHdhc24ndCBleHBlY3RlZCwganVzdCBleGl0LCB0aGlzIGlzCi0JICogbm90IGEgcHJvYmxlbS4gRm9yIGV4YW1wbGUsIGlmIHRoZSAiSW1wbGljaXQgUmV0dXJuIiBmZWF0dXJlIGlzCi0JICogZW5hYmxlZCwgbWV0aG9kcyB3aWxsIGFsd2F5cyByZXR1cm4gYSB2YWx1ZS4KKwkgKiBSZXR1cm4gdmFsdWUgdmFsaWRhdGlvbiBhbmQgcG9zc2libGUgcmVwYWlyLgogCSAqCi0JICogMikgSWYgdGhlIHJldHVybiB2YWx1ZSBjYW4gYmUgb2YgYW55IHR5cGUsIHRoZW4gd2UgY2Fubm90IHBlcmZvcm0gYW55Ci0JICogdmFsaWRhdGlvbiwgZXhpdC4KKwkgKiAxKSBEb24ndCBwZXJmb3JtIHJldHVybiB2YWx1ZSB2YWxpZGF0aW9uL3JlcGFpciBpZiB0aGlzIGZlYXR1cmUKKwkgKiBoYXMgYmVlbiBkaXNhYmxlZCB2aWEgYSBnbG9iYWwgb3B0aW9uLgorCSAqCisJICogMikgV2UgaGF2ZSBhIHJldHVybiB2YWx1ZSwgYnV0IGlmIG9uZSB3YXNuJ3QgZXhwZWN0ZWQsIGp1c3QgZXhpdCwKKwkgKiB0aGlzIGlzIG5vdCBhIHByb2JsZW0uIEZvciBleGFtcGxlLCBpZiB0aGUgIkltcGxpY2l0IFJldHVybiIKKwkgKiBmZWF0dXJlIGlzIGVuYWJsZWQsIG1ldGhvZHMgd2lsbCBhbHdheXMgcmV0dXJuIGEgdmFsdWUuCisJICoKKwkgKiAzKSBJZiB0aGUgcmV0dXJuIHZhbHVlIGNhbiBiZSBvZiBhbnkgdHlwZSwgdGhlbiB3ZSBjYW5ub3QgcGVyZm9ybQorCSAqIGFueSB2YWxpZGF0aW9uLCBqdXN0IGV4aXQuCiAJICovCi0JaWYgKCghcHJlZGVmaW5lZC0+aW5mby5leHBlY3RlZF9idHlwZXMpIHx8CisJaWYgKGFjcGlfZ2JsX2Rpc2FibGVfYXV0b19yZXBhaXIgfHwKKwkgICAgKCFwcmVkZWZpbmVkLT5pbmZvLmV4cGVjdGVkX2J0eXBlcykgfHwKIAkgICAgKHByZWRlZmluZWQtPmluZm8uZXhwZWN0ZWRfYnR5cGVzID09IEFDUElfUlRZUEVfQUxMKSkgewogCQlnb3RvIGNsZWFudXA7CiAJfQpAQCAtMjEyLDYgKzIxOCw3IEBACiAJCWdvdG8gY2xlYW51cDsKIAl9CiAJZGF0YS0+cHJlZGVmaW5lZCA9IHByZWRlZmluZWQ7CisJZGF0YS0+bm9kZSA9IG5vZGU7CiAJZGF0YS0+bm9kZV9mbGFncyA9IG5vZGUtPmZsYWdzOwogCWRhdGEtPnBhdGhuYW1lID0gcGF0aG5hbWU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNyZXBhaXIyLmMgYi9kcml2ZXJzL2FjcGkvYWNwaWNhL25zcmVwYWlyMi5jCmluZGV4IDk3Mzg4M2IuLjAyNGM0ZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvbnNyZXBhaXIyLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS9uc3JlcGFpcjIuYwpAQCAtNTAzLDYgKzUwMywyMSBAQAogewogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnJldHVybl9vYmplY3QgPSAqcmV0dXJuX29iamVjdF9wdHI7CiAJYWNwaV9zdGF0dXMgc3RhdHVzOworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCisJLyoKKwkgKiBXZSBjYW4gb25seSBzb3J0IHRoZSBfVFNTIHJldHVybiBwYWNrYWdlIGlmIHRoZXJlIGlzIG5vIF9QU1MgaW4gdGhlCisJICogc2FtZSBzY29wZS4gVGhpcyBpcyBiZWNhdXNlIGlmIF9QU1MgaXMgcHJlc2VudCwgdGhlIEFDUEkgc3BlY2lmaWNhdGlvbgorCSAqIGRpY3RhdGVzIHRoYXQgdGhlIF9UU1MgUG93ZXIgRGlzc2lwYXRpb24gZmllbGQgaXMgdG8gYmUgaWdub3JlZCwgYW5kCisJICogdGhlcmVmb3JlIHNvbWUgQklPU3MgbGVhdmUgZ2FyYmFnZSB2YWx1ZXMgaW4gdGhlIF9UU1MgUG93ZXIgZmllbGQocykuCisJICogSW4gdGhpcyBjYXNlLCBpdCBpcyBiZXN0IHRvIGp1c3QgcmV0dXJuIHRoZSBfVFNTIHBhY2thZ2UgYXMtaXMuCisJICogKE1heSwgMjAxMSkKKwkgKi8KKwlzdGF0dXMgPQorCSAgICBhY3BpX25zX2dldF9ub2RlKGRhdGEtPm5vZGUsICJeX1BTUyIsIEFDUElfTlNfTk9fVVBTRUFSQ0gsICZub2RlKTsKKwlpZiAoQUNQSV9TVUNDRVNTKHN0YXR1cykpIHsKKwkJcmV0dXJuIChBRV9PSyk7CisJfQogCiAJc3RhdHVzID0gYWNwaV9uc19jaGVja19zb3J0ZWRfbGlzdChkYXRhLCByZXR1cm5fb2JqZWN0LCA1LCAxLAogCQkJCQkgICBBQ1BJX1NPUlRfREVTQ0VORElORywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJpbnN0YWwuYyBiL2RyaXZlcnMvYWNwaS9hY3BpY2EvdGJpbnN0YWwuYwppbmRleCA0OGRiMDk0Li42MjM2NWY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaWNhL3RiaW5zdGFsLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGljYS90Ymluc3RhbC5jCkBAIC0xMjYsMTIgKzEyNiwyOSBAQAogCX0KIAogCS8qCi0JICogT3JpZ2luYWxseSwgd2UgY2hlY2tlZCB0aGUgdGFibGUgc2lnbmF0dXJlIGZvciAiU1NEVCIgb3IgIlBTRFQiIGhlcmUuCi0JICogTmV4dCwgd2UgYWRkZWQgc3VwcG9ydCBmb3IgT0VNeCB0YWJsZXMsIHNpZ25hdHVyZSAiT0VNIi4KLQkgKiBWYWxpZCB0YWJsZXMgd2VyZSBlbmNvdW50ZXJlZCB3aXRoIGEgbnVsbCBzaWduYXR1cmUsIHNvIHdlJ3ZlIGp1c3QKLQkgKiBnaXZlbiB1cCBvbiB2YWxpZGF0aW5nIHRoZSBzaWduYXR1cmUsIHNpbmNlIGl0IHNlZW1zIHRvIGJlIGEgd2FzdGUKLQkgKiBvZiBjb2RlLiBUaGUgb3JpZ2luYWwgY29kZSB3YXMgcmVtb3ZlZCAoMDUvMjAwOCkuCisJICogVmFsaWRhdGUgdGhlIGluY29taW5nIHRhYmxlIHNpZ25hdHVyZS4KKwkgKgorCSAqIDEpIE9yaWdpbmFsbHksIHdlIGNoZWNrZWQgdGhlIHRhYmxlIHNpZ25hdHVyZSBmb3IgIlNTRFQiIG9yICJQU0RUIi4KKwkgKiAyKSBXZSBhZGRlZCBzdXBwb3J0IGZvciBPRU14IHRhYmxlcywgc2lnbmF0dXJlICJPRU0iLgorCSAqIDMpIFZhbGlkIHRhYmxlcyB3ZXJlIGVuY291bnRlcmVkIHdpdGggYSBudWxsIHNpZ25hdHVyZSwgc28gd2UganVzdAorCSAqICAgIGdhdmUgdXAgb24gdmFsaWRhdGluZyB0aGUgc2lnbmF0dXJlLCAoMDUvMjAwOCkuCisJICogNCkgV2UgZW5jb3VudGVyZWQgbm9uLUFNTCB0YWJsZXMgc3VjaCBhcyB0aGUgTUFEVCwgd2hpY2ggY2F1c2VkCisJICogICAgaW50ZXJwcmV0ZXIgZXJyb3JzIGFuZCBrZXJuZWwgZmF1bHRzLiBTbyBub3csIHdlIG9uY2UgYWdhaW4gYWxsb3cKKwkgKiAgICBvbmx5ICJTU0RUIiwgIk9FTXgiLCBhbmQgbm93LCBhbHNvIGEgbnVsbCBzaWduYXR1cmUuICgwNS8yMDExKS4KIAkgKi8KKwlpZiAoKHRhYmxlX2Rlc2MtPnBvaW50ZXItPnNpZ25hdHVyZVswXSAhPSAweDAwKSAmJgorCSAgICAoIUFDUElfQ09NUEFSRV9OQU1FKHRhYmxlX2Rlc2MtPnBvaW50ZXItPnNpZ25hdHVyZSwgQUNQSV9TSUdfU1NEVCkpCisJICAgICYmIChBQ1BJX1NUUk5DTVAodGFibGVfZGVzYy0+cG9pbnRlci0+c2lnbmF0dXJlLCAiT0VNIiwgMykpKSB7CisJCUFDUElfRVJST1IoKEFFX0lORk8sCisJCQkgICAgIlRhYmxlIGhhcyBpbnZhbGlkIHNpZ25hdHVyZSBbJTQuNHNdICgweCU4LjhYKSwgbXVzdCBiZSBTU0RUIG9yIE9FTXgiLAorCQkJICAgIGFjcGlfdXRfdmFsaWRfYWNwaV9uYW1lKCoodTMyICopdGFibGVfZGVzYy0+CisJCQkJCQkgICAgcG9pbnRlci0+CisJCQkJCQkgICAgc2lnbmF0dXJlKSA/IHRhYmxlX2Rlc2MtPgorCQkJICAgIHBvaW50ZXItPnNpZ25hdHVyZSA6ICI/Pz8/IiwKKwkJCSAgICAqKHUzMiAqKXRhYmxlX2Rlc2MtPnBvaW50ZXItPnNpZ25hdHVyZSkpOworCisJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9CQURfU0lHTkFUVVJFKTsKKwl9CiAKIAkodm9pZClhY3BpX3V0X2FjcXVpcmVfbXV0ZXgoQUNQSV9NVFhfVEFCTEVTKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FwZWkvS2NvbmZpZyBiL2RyaXZlcnMvYWNwaS9hcGVpL0tjb25maWcKaW5kZXggZjczOWE3MC4uYzM0YWE1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FwZWkvS2NvbmZpZworKysgYi9kcml2ZXJzL2FjcGkvYXBlaS9LY29uZmlnCkBAIC0xMCw5ICsxMCwxMSBAQAogCSAgZXJyb3IgaW5qZWN0aW9uLgogCiBjb25maWcgQUNQSV9BUEVJX0dIRVMKLQl0cmlzdGF0ZSAiQVBFSSBHZW5lcmljIEhhcmR3YXJlIEVycm9yIFNvdXJjZSIKKwlib29sICJBUEVJIEdlbmVyaWMgSGFyZHdhcmUgRXJyb3IgU291cmNlIgogCWRlcGVuZHMgb24gQUNQSV9BUEVJICYmIFg4NgogCXNlbGVjdCBBQ1BJX0hFRAorCXNlbGVjdCBMTElTVAorCXNlbGVjdCBHRU5FUklDX0FMTE9DQVRPUgogCWhlbHAKIAkgIEdlbmVyaWMgSGFyZHdhcmUgRXJyb3IgU291cmNlIHByb3ZpZGVzIGEgd2F5IHRvIHJlcG9ydAogCSAgcGxhdGZvcm0gaGFyZHdhcmUgZXJyb3JzIChzdWNoIGFzIHRoYXQgZnJvbSBjaGlwc2V0KS4gSXQKQEAgLTMwLDYgKzMyLDEzIEBACiAJICBQQ0llIEFFUiBlcnJvcnMgbWF5IGJlIHJlcG9ydGVkIHZpYSBBUEVJIGZpcm13YXJlIGZpcnN0IG1vZGUuCiAJICBUdXJuIG9uIHRoaXMgb3B0aW9uIHRvIGVuYWJsZSB0aGUgY29ycmVzcG9uZGluZyBzdXBwb3J0LgogCitjb25maWcgQUNQSV9BUEVJX01FTU9SWV9GQUlMVVJFCisJYm9vbCAiQVBFSSBtZW1vcnkgZXJyb3IgcmVjb3ZlcmluZyBzdXBwb3J0IgorCWRlcGVuZHMgb24gQUNQSV9BUEVJICYmIE1FTU9SWV9GQUlMVVJFCisJaGVscAorCSAgTWVtb3J5IGVycm9ycyBtYXkgYmUgcmVwb3J0ZWQgdmlhIEFQRUkgZmlybXdhcmUgZmlyc3QgbW9kZS4KKwkgIFR1cm4gb24gdGhpcyBvcHRpb24gdG8gZW5hYmxlIHRoZSBtZW1vcnkgcmVjb3ZlcmluZyBzdXBwb3J0LgorCiBjb25maWcgQUNQSV9BUEVJX0VJTkoKIAl0cmlzdGF0ZSAiQVBFSSBFcnJvciBJTkplY3Rpb24gKEVJTkopIgogCWRlcGVuZHMgb24gQUNQSV9BUEVJICYmIERFQlVHX0ZTCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYXBlaS9hcGVpLWJhc2UuYyBiL2RyaXZlcnMvYWNwaS9hcGVpL2FwZWktYmFzZS5jCmluZGV4IDRhOTA0YTQuLjgwNDEyNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hcGVpL2FwZWktYmFzZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9hcGVpL2FwZWktYmFzZS5jCkBAIC0xNTcsOSArMTU3LDEwIEBACiAgKiBJbnRlcnByZXQgdGhlIHNwZWNpZmllZCBhY3Rpb24uIEdvIHRocm91Z2ggd2hvbGUgYWN0aW9uIHRhYmxlLAogICogZXhlY3V0ZSBhbGwgaW5zdHJ1Y3Rpb25zIGJlbG9uZyB0byB0aGUgYWN0aW9uLgogICovCi1pbnQgYXBlaV9leGVjX3J1bihzdHJ1Y3QgYXBlaV9leGVjX2NvbnRleHQgKmN0eCwgdTggYWN0aW9uKQoraW50IF9fYXBlaV9leGVjX3J1bihzdHJ1Y3QgYXBlaV9leGVjX2NvbnRleHQgKmN0eCwgdTggYWN0aW9uLAorCQkgICAgYm9vbCBvcHRpb25hbCkKIHsKLQlpbnQgcmM7CisJaW50IHJjID0gLUVOT0VOVDsKIAl1MzIgaSwgaXA7CiAJc3RydWN0IGFjcGlfd2hlYV9oZWFkZXIgKmVudHJ5OwogCWFwZWlfZXhlY19pbnNfZnVuY190IHJ1bjsKQEAgLTE5OCw5ICsxOTksOSBAQAogCQkJZ290byByZXdpbmQ7CiAJfQogCi0JcmV0dXJuIDA7CisJcmV0dXJuICFvcHRpb25hbCAmJiByYyA8IDAgPyByYyA6IDA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChhcGVpX2V4ZWNfcnVuKTsKK0VYUE9SVF9TWU1CT0xfR1BMKF9fYXBlaV9leGVjX3J1bik7CiAKIHR5cGVkZWYgaW50ICgqYXBlaV9leGVjX2VudHJ5X2Z1bmNfdCkoc3RydWN0IGFwZWlfZXhlY19jb250ZXh0ICpjdHgsCiAJCQkJICAgICAgc3RydWN0IGFjcGlfd2hlYV9oZWFkZXIgKmVudHJ5LApAQCAtNjAzLDMgKzYwNCwyOSBAQAogCXJldHVybiBkYXBlaTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGFwZWlfZ2V0X2RlYnVnZnNfZGlyKTsKKworaW50IGFwZWlfb3NjX3NldHVwKHZvaWQpCit7CisJc3RhdGljIHU4IHdoZWFfdXVpZF9zdHJbXSA9ICJlZDg1NWUwYy02YzkwLTQ3YmYtYTYyYS0yNmRlMGZjNWFkNWMiOworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKwl1MzIgY2FwYnVmWzNdOworCXN0cnVjdCBhY3BpX29zY19jb250ZXh0IGNvbnRleHQgPSB7CisJCS51dWlkX3N0cgk9IHdoZWFfdXVpZF9zdHIsCisJCS5yZXYJCT0gMSwKKwkJLmNhcC5sZW5ndGgJPSBzaXplb2YoY2FwYnVmKSwKKwkJLmNhcC5wb2ludGVyCT0gY2FwYnVmLAorCX07CisKKwljYXBidWZbT1NDX1FVRVJZX1RZUEVdID0gT1NDX1FVRVJZX0VOQUJMRTsKKwljYXBidWZbT1NDX1NVUFBPUlRfVFlQRV0gPSAwOworCWNhcGJ1ZltPU0NfQ09OVFJPTF9UWVBFXSA9IDA7CisKKwlpZiAoQUNQSV9GQUlMVVJFKGFjcGlfZ2V0X2hhbmRsZShOVUxMLCAiXFxfU0IiLCAmaGFuZGxlKSkKKwkgICAgfHwgQUNQSV9GQUlMVVJFKGFjcGlfcnVuX29zYyhoYW5kbGUsICZjb250ZXh0KSkpCisJCXJldHVybiAtRUlPOworCWVsc2UgeworCQlrZnJlZShjb250ZXh0LnJldC5wb2ludGVyKTsKKwkJcmV0dXJuIDA7CisJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwoYXBlaV9vc2Nfc2V0dXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FwZWkvYXBlaS1pbnRlcm5hbC5oIGIvZHJpdmVycy9hY3BpL2FwZWkvYXBlaS1pbnRlcm5hbC5oCmluZGV4IGVmMDU4MWYuLmY1NzA1MGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hcGVpL2FwZWktaW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL2FjcGkvYXBlaS9hcGVpLWludGVybmFsLmgKQEAgLTUwLDcgKzUwLDE4IEBACiAJcmV0dXJuIGN0eC0+dmFsdWU7CiB9CiAKLWludCBhcGVpX2V4ZWNfcnVuKHN0cnVjdCBhcGVpX2V4ZWNfY29udGV4dCAqY3R4LCB1OCBhY3Rpb24pOworaW50IF9fYXBlaV9leGVjX3J1bihzdHJ1Y3QgYXBlaV9leGVjX2NvbnRleHQgKmN0eCwgdTggYWN0aW9uLCBib29sIG9wdGlvbmFsKTsKKworc3RhdGljIGlubGluZSBpbnQgYXBlaV9leGVjX3J1bihzdHJ1Y3QgYXBlaV9leGVjX2NvbnRleHQgKmN0eCwgdTggYWN0aW9uKQoreworCXJldHVybiBfX2FwZWlfZXhlY19ydW4oY3R4LCBhY3Rpb24sIDApOworfQorCisvKiBJdCBpcyBvcHRpb25hbCB3aGV0aGVyIHRoZSBmaXJtd2FyZSBwcm92aWRlcyB0aGUgYWN0aW9uICovCitzdGF0aWMgaW5saW5lIGludCBhcGVpX2V4ZWNfcnVuX29wdGlvbmFsKHN0cnVjdCBhcGVpX2V4ZWNfY29udGV4dCAqY3R4LCB1OCBhY3Rpb24pCit7CisJcmV0dXJuIF9fYXBlaV9leGVjX3J1bihjdHgsIGFjdGlvbiwgMSk7Cit9CiAKIC8qIENvbW1vbiBpbnN0cnVjdGlvbiBpbXBsZW1lbnRhdGlvbiAqLwogCkBAIC0xMTMsNCArMTI0LDYgQEAKIAkJCWNvbnN0IHN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpY19zdGF0dXMgKmVzdGF0dXMpOwogaW50IGFwZWlfZXN0YXR1c19jaGVja19oZWFkZXIoY29uc3Qgc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljX3N0YXR1cyAqZXN0YXR1cyk7CiBpbnQgYXBlaV9lc3RhdHVzX2NoZWNrKGNvbnN0IHN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpY19zdGF0dXMgKmVzdGF0dXMpOworCitpbnQgYXBlaV9vc2Nfc2V0dXAodm9pZCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hcGVpL2VpbmouYyBiL2RyaXZlcnMvYWNwaS9hcGVpL2VpbmouYwppbmRleCBmNzRiMmVhLi41ODliOTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYXBlaS9laW5qLmMKKysrIGIvZHJpdmVycy9hY3BpL2FwZWkvZWluai5jCkBAIC00Niw3ICs0Niw4IEBACiAgKiBTb21lIEJJT1NlcyBhbGxvdyBwYXJhbWV0ZXJzIHRvIHRoZSBTRVRfRVJST1JfVFlQRSBlbnRyaWVzIGluIHRoZQogICogRUlOSiB0YWJsZSB0aHJvdWdoIGFuIHVucHVibGlzaGVkIGV4dGVuc2lvbi4gVXNlIHdpdGggY2F1dGlvbiBhcwogICogbW9zdCB3aWxsIGlnbm9yZSB0aGUgcGFyYW1ldGVyIGFuZCBtYWtlIHRoZWlyIG93biBjaG9pY2Ugb2YgYWRkcmVzcwotICogZm9yIGVycm9yIGluamVjdGlvbi4KKyAqIGZvciBlcnJvciBpbmplY3Rpb24uICBUaGlzIGV4dGVuc2lvbiBpcyB1c2VkIG9ubHkgaWYKKyAqIHBhcmFtX2V4dGVuc2lvbiBtb2R1bGUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZC4KICAqLwogc3RydWN0IGVpbmpfcGFyYW1ldGVyIHsKIAl1NjQgdHlwZTsKQEAgLTY1LDYgKzY2LDkgQEAKIAkoKHN0cnVjdCBhY3BpX3doZWFfaGVhZGVyICopKChjaGFyICopKHRhYikgKwkJCVwKIAkJCQkgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX2VpbmopKSkKIAorc3RhdGljIGJvb2wgcGFyYW1fZXh0ZW5zaW9uOworbW9kdWxlX3BhcmFtKHBhcmFtX2V4dGVuc2lvbiwgYm9vbCwgMCk7CisKIHN0YXRpYyBzdHJ1Y3QgYWNwaV90YWJsZV9laW5qICplaW5qX3RhYjsKIAogc3RhdGljIHN0cnVjdCBhcGVpX3Jlc291cmNlcyBlaW5qX3Jlc291cmNlczsKQEAgLTI4NSw3ICsyODksNyBAQAogCiAJZWlual9leGVjX2N0eF9pbml0KCZjdHgpOwogCi0JcmMgPSBhcGVpX2V4ZWNfcnVuKCZjdHgsIEFDUElfRUlOSl9CRUdJTl9PUEVSQVRJT04pOworCXJjID0gYXBlaV9leGVjX3J1bl9vcHRpb25hbCgmY3R4LCBBQ1BJX0VJTkpfQkVHSU5fT1BFUkFUSU9OKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAlhcGVpX2V4ZWNfY3R4X3NldF9pbnB1dCgmY3R4LCB0eXBlKTsKQEAgLTMyMyw3ICszMjcsNyBAQAogCXJjID0gX19laW5qX2Vycm9yX3RyaWdnZXIodHJpZ2dlcl9wYWRkcik7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7Ci0JcmMgPSBhcGVpX2V4ZWNfcnVuKCZjdHgsIEFDUElfRUlOSl9FTkRfT1BFUkFUSU9OKTsKKwlyYyA9IGFwZWlfZXhlY19ydW5fb3B0aW9uYWwoJmN0eCwgQUNQSV9FSU5KX0VORF9PUEVSQVRJT04pOwogCiAJcmV0dXJuIHJjOwogfQpAQCAtNDg5LDE0ICs0OTMsNiBAQAogCQkJCSAgICAgZWlual9kZWJ1Z19kaXIsIE5VTEwsICZlcnJvcl90eXBlX2ZvcHMpOwogCWlmICghZmVudHJ5KQogCQlnb3RvIGVycl9jbGVhbnVwOwotCWZlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX3g2NCgicGFyYW0xIiwgU19JUlVTUiB8IFNfSVdVU1IsCi0JCQkJICAgIGVpbmpfZGVidWdfZGlyLCAmZXJyb3JfcGFyYW0xKTsKLQlpZiAoIWZlbnRyeSkKLQkJZ290byBlcnJfY2xlYW51cDsKLQlmZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV94NjQoInBhcmFtMiIsIFNfSVJVU1IgfCBTX0lXVVNSLAotCQkJCSAgICBlaW5qX2RlYnVnX2RpciwgJmVycm9yX3BhcmFtMik7Ci0JaWYgKCFmZW50cnkpCi0JCWdvdG8gZXJyX2NsZWFudXA7CiAJZmVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgiZXJyb3JfaW5qZWN0IiwgU19JV1VTUiwKIAkJCQkgICAgIGVpbmpfZGVidWdfZGlyLCBOVUxMLCAmZXJyb3JfaW5qZWN0X2ZvcHMpOwogCWlmICghZmVudHJ5KQpAQCAtNTEzLDEyICs1MDksMjMgQEAKIAlyYyA9IGFwZWlfZXhlY19wcmVfbWFwX2dhcnMoJmN0eCk7CiAJaWYgKHJjKQogCQlnb3RvIGVycl9yZWxlYXNlOwotCXBhcmFtX3BhZGRyID0gZWlual9nZXRfcGFyYW1ldGVyX2FkZHJlc3MoKTsKLQlpZiAocGFyYW1fcGFkZHIpIHsKLQkJZWlual9wYXJhbSA9IGlvcmVtYXAocGFyYW1fcGFkZHIsIHNpemVvZigqZWlual9wYXJhbSkpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWlmICghZWlual9wYXJhbSkKLQkJCWdvdG8gZXJyX3VubWFwOworCWlmIChwYXJhbV9leHRlbnNpb24pIHsKKwkJcGFyYW1fcGFkZHIgPSBlaW5qX2dldF9wYXJhbWV0ZXJfYWRkcmVzcygpOworCQlpZiAocGFyYW1fcGFkZHIpIHsKKwkJCWVpbmpfcGFyYW0gPSBpb3JlbWFwKHBhcmFtX3BhZGRyLCBzaXplb2YoKmVpbmpfcGFyYW0pKTsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWlmICghZWlual9wYXJhbSkKKwkJCQlnb3RvIGVycl91bm1hcDsKKwkJCWZlbnRyeSA9IGRlYnVnZnNfY3JlYXRlX3g2NCgicGFyYW0xIiwgU19JUlVTUiB8IFNfSVdVU1IsCisJCQkJCQkgICAgZWlual9kZWJ1Z19kaXIsICZlcnJvcl9wYXJhbTEpOworCQkJaWYgKCFmZW50cnkpCisJCQkJZ290byBlcnJfdW5tYXA7CisJCQlmZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV94NjQoInBhcmFtMiIsIFNfSVJVU1IgfCBTX0lXVVNSLAorCQkJCQkJICAgIGVpbmpfZGVidWdfZGlyLCAmZXJyb3JfcGFyYW0yKTsKKwkJCWlmICghZmVudHJ5KQorCQkJCWdvdG8gZXJyX3VubWFwOworCQl9IGVsc2UKKwkJCXByX3dhcm4oRUlOSl9QRlggIlBhcmFtZXRlciBleHRlbnNpb24gaXMgbm90IHN1cHBvcnRlZC5cbiIpOwogCX0KIAogCXByX2luZm8oRUlOSl9QRlggIkVycm9yIElOSmVjdGlvbiBpcyBpbml0aWFsaXplZC5cbiIpOwpAQCAtNTI2LDYgKzUzMyw4IEBACiAJcmV0dXJuIDA7CiAKIGVycl91bm1hcDoKKwlpZiAoZWlual9wYXJhbSkKKwkJaW91bm1hcChlaW5qX3BhcmFtKTsKIAlhcGVpX2V4ZWNfcG9zdF91bm1hcF9nYXJzKCZjdHgpOwogZXJyX3JlbGVhc2U6CiAJYXBlaV9yZXNvdXJjZXNfcmVsZWFzZSgmZWlual9yZXNvdXJjZXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FwZWkvZXJzdC1kYmcuYyBiL2RyaXZlcnMvYWNwaS9hcGVpL2Vyc3QtZGJnLmMKaW5kZXggYTRjZmI2NC4uOTAzNTQ5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FwZWkvZXJzdC1kYmcuYworKysgYi9kcml2ZXJzL2FjcGkvYXBlaS9lcnN0LWRiZy5jCkBAIC0zMyw3ICszMyw3IEBACiAKICNkZWZpbmUgRVJTVF9EQkdfUEZYCQkJIkVSU1QgREJHOiAiCiAKLSNkZWZpbmUgRVJTVF9EQkdfUkVDT1JEX0xFTl9NQVgJCTQwOTYKKyNkZWZpbmUgRVJTVF9EQkdfUkVDT1JEX0xFTl9NQVgJCTB4NDAwMAogCiBzdGF0aWMgdm9pZCAqZXJzdF9kYmdfYnVmOwogc3RhdGljIHVuc2lnbmVkIGludCBlcnN0X2RiZ19idWZfbGVuOwpAQCAtMjEzLDYgKzIxMywxMCBAQAogCiBzdGF0aWMgX19pbml0IGludCBlcnN0X2RiZ19pbml0KHZvaWQpCiB7CisJaWYgKGVyc3RfZGlzYWJsZSkgeworCQlwcl9pbmZvKEVSU1RfREJHX1BGWCAiRVJTVCBzdXBwb3J0IGlzIGRpc2FibGVkLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KIAlyZXR1cm4gbWlzY19yZWdpc3RlcigmZXJzdF9kYmdfZGV2KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FwZWkvZXJzdC5jIGIvZHJpdmVycy9hY3BpL2FwZWkvZXJzdC5jCmluZGV4IGU2Y2VmOGUuLjJjYTU5ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hcGVpL2Vyc3QuYworKysgYi9kcml2ZXJzL2FjcGkvYXBlaS9lcnN0LmMKQEAgLTY0Miw3ICs2NDIsNyBAQAogCWludCByYzsKIAogCWVyc3RfZXhlY19jdHhfaW5pdCgmY3R4KTsKLQlyYyA9IGFwZWlfZXhlY19ydW4oJmN0eCwgQUNQSV9FUlNUX0JFR0lOX1dSSVRFKTsKKwlyYyA9IGFwZWlfZXhlY19ydW5fb3B0aW9uYWwoJmN0eCwgQUNQSV9FUlNUX0JFR0lOX1dSSVRFKTsKIAlpZiAocmMpCiAJCXJldHVybiByYzsKIAlhcGVpX2V4ZWNfY3R4X3NldF9pbnB1dCgmY3R4LCBvZmZzZXQpOwpAQCAtNjY2LDcgKzY2Niw3IEBACiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAJdmFsID0gYXBlaV9leGVjX2N0eF9nZXRfb3V0cHV0KCZjdHgpOwotCXJjID0gYXBlaV9leGVjX3J1bigmY3R4LCBBQ1BJX0VSU1RfRU5EKTsKKwlyYyA9IGFwZWlfZXhlY19ydW5fb3B0aW9uYWwoJmN0eCwgQUNQSV9FUlNUX0VORCk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAKQEAgLTY4MSw3ICs2ODEsNyBAQAogCWludCByYzsKIAogCWVyc3RfZXhlY19jdHhfaW5pdCgmY3R4KTsKLQlyYyA9IGFwZWlfZXhlY19ydW4oJmN0eCwgQUNQSV9FUlNUX0JFR0lOX1JFQUQpOworCXJjID0gYXBlaV9leGVjX3J1bl9vcHRpb25hbCgmY3R4LCBBQ1BJX0VSU1RfQkVHSU5fUkVBRCk7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAJYXBlaV9leGVjX2N0eF9zZXRfaW5wdXQoJmN0eCwgb2Zmc2V0KTsKQEAgLTcwOSw3ICs3MDksNyBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCXZhbCA9IGFwZWlfZXhlY19jdHhfZ2V0X291dHB1dCgmY3R4KTsKLQlyYyA9IGFwZWlfZXhlY19ydW4oJmN0eCwgQUNQSV9FUlNUX0VORCk7CisJcmMgPSBhcGVpX2V4ZWNfcnVuX29wdGlvbmFsKCZjdHgsIEFDUElfRVJTVF9FTkQpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCkBAIC03MjQsNyArNzI0LDcgQEAKIAlpbnQgcmM7CiAKIAllcnN0X2V4ZWNfY3R4X2luaXQoJmN0eCk7Ci0JcmMgPSBhcGVpX2V4ZWNfcnVuKCZjdHgsIEFDUElfRVJTVF9CRUdJTl9DTEVBUik7CisJcmMgPSBhcGVpX2V4ZWNfcnVuX29wdGlvbmFsKCZjdHgsIEFDUElfRVJTVF9CRUdJTl9DTEVBUik7CiAJaWYgKHJjKQogCQlyZXR1cm4gcmM7CiAJYXBlaV9leGVjX2N0eF9zZXRfaW5wdXQoJmN0eCwgcmVjb3JkX2lkKTsKQEAgLTc0OCw3ICs3NDgsNyBAQAogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCXZhbCA9IGFwZWlfZXhlY19jdHhfZ2V0X291dHB1dCgmY3R4KTsKLQlyYyA9IGFwZWlfZXhlY19ydW4oJmN0eCwgQUNQSV9FUlNUX0VORCk7CisJcmMgPSBhcGVpX2V4ZWNfcnVuX29wdGlvbmFsKCZjdHgsIEFDUElfRVJTVF9FTkQpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOwogCkBAIC05MzIsOCArOTMyLDExIEBACiBzdGF0aWMgaW50IGVyc3Rfb3Blbl9wc3RvcmUoc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpOwogc3RhdGljIGludCBlcnN0X2Nsb3NlX3BzdG9yZShzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7CiBzdGF0aWMgc3NpemVfdCBlcnN0X3JlYWRlcih1NjQgKmlkLCBlbnVtIHBzdG9yZV90eXBlX2lkICp0eXBlLAotCQkgICAgICAgc3RydWN0IHRpbWVzcGVjICp0aW1lKTsKLXN0YXRpYyB1NjQgZXJzdF93cml0ZXIoZW51bSBwc3RvcmVfdHlwZV9pZCB0eXBlLCBzaXplX3Qgc2l6ZSk7CisJCQkgICBzdHJ1Y3QgdGltZXNwZWMgKnRpbWUsIHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKTsKK3N0YXRpYyB1NjQgZXJzdF93cml0ZXIoZW51bSBwc3RvcmVfdHlwZV9pZCB0eXBlLCB1bnNpZ25lZCBpbnQgcGFydCwKKwkJICAgICAgIHNpemVfdCBzaXplLCBzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7CitzdGF0aWMgaW50IGVyc3RfY2xlYXJlcihlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIHU2NCBpZCwKKwkJCXN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKTsKIAogc3RhdGljIHN0cnVjdCBwc3RvcmVfaW5mbyBlcnN0X2luZm8gPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLApAQCAtOTQyLDcgKzk0NSw3IEBACiAJLmNsb3NlCQk9IGVyc3RfY2xvc2VfcHN0b3JlLAogCS5yZWFkCQk9IGVyc3RfcmVhZGVyLAogCS53cml0ZQkJPSBlcnN0X3dyaXRlciwKLQkuZXJhc2UJCT0gZXJzdF9jbGVhcgorCS5lcmFzZQkJPSBlcnN0X2NsZWFyZXIKIH07CiAKICNkZWZpbmUgQ1BFUl9DUkVBVE9SX1BTVE9SRQkJCQkJCVwKQEAgLTk4Myw3ICs5ODYsNyBAQAogfQogCiBzdGF0aWMgc3NpemVfdCBlcnN0X3JlYWRlcih1NjQgKmlkLCBlbnVtIHBzdG9yZV90eXBlX2lkICp0eXBlLAotCQkgICAgICAgc3RydWN0IHRpbWVzcGVjICp0aW1lKQorCQkJICAgc3RydWN0IHRpbWVzcGVjICp0aW1lLCBzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSkKIHsKIAlpbnQgcmM7CiAJc3NpemVfdCBsZW4gPSAwOwpAQCAtMTAzNyw3ICsxMDQwLDggQEAKIAlyZXR1cm4gKHJjIDwgMCkgPyByYyA6IChsZW4gLSBzaXplb2YoKnJjZCkpOwogfQogCi1zdGF0aWMgdTY0IGVyc3Rfd3JpdGVyKGVudW0gcHN0b3JlX3R5cGVfaWQgdHlwZSwgc2l6ZV90IHNpemUpCitzdGF0aWMgdTY0IGVyc3Rfd3JpdGVyKGVudW0gcHN0b3JlX3R5cGVfaWQgdHlwZSwgdW5zaWduZWQgaW50IHBhcnQsCisJCSAgICAgICBzaXplX3Qgc2l6ZSwgc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpCiB7CiAJc3RydWN0IGNwZXJfcHN0b3JlX3JlY29yZCAqcmNkID0gKHN0cnVjdCBjcGVyX3BzdG9yZV9yZWNvcmQgKikKIAkJCQkJKGVyc3RfaW5mby5idWYgLSBzaXplb2YoKnJjZCkpOwpAQCAtMTA4MCw2ICsxMDg0LDEyIEBACiAJcmV0dXJuIHJjZC0+aGRyLnJlY29yZF9pZDsKIH0KIAorc3RhdGljIGludCBlcnN0X2NsZWFyZXIoZW51bSBwc3RvcmVfdHlwZV9pZCB0eXBlLCB1NjQgaWQsCisJCQlzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSkKK3sKKwlyZXR1cm4gZXJzdF9jbGVhcihpZCk7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IGVyc3RfaW5pdCh2b2lkKQogewogCWludCByYyA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYXBlaS9naGVzLmMgYi9kcml2ZXJzL2FjcGkvYXBlaS9naGVzLmMKaW5kZXggZjcwM2IyOC4uMDc4NGY5OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FwZWkvZ2hlcy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hcGVpL2doZXMuYwpAQCAtMTIsNyArMTIsNyBAQAogICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgR2VuZXJpYyBIYXJkd2FyZSBFcnJvciBTb3VyY2UsIHBsZWFzZQogICogcmVmZXIgdG8gQUNQSSBTcGVjaWZpY2F0aW9uIHZlcnNpb24gNC4wLCBzZWN0aW9uIDE3LjMuMi42CiAgKgotICogQ29weXJpZ2h0IDIwMTAgSW50ZWwgQ29ycC4KKyAqIENvcHlyaWdodCAyMDEwLDIwMTEgSW50ZWwgQ29ycC4KICAqICAgQXV0aG9yOiBIdWFuZyBZaW5nIDx5aW5nLmh1YW5nQGludGVsLmNvbT4KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCkBAIC00Miw2ICs0Miw5IEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvaXJxX3dvcmsuaD4KKyNpbmNsdWRlIDxsaW51eC9sbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dlbmFsbG9jLmg+CiAjaW5jbHVkZSA8YWNwaS9hcGVpLmg+CiAjaW5jbHVkZSA8YWNwaS9hdG9taWNpby5oPgogI2luY2x1ZGUgPGFjcGkvaGVkLmg+CkBAIC01Myw2ICs1NiwzMCBAQAogI2RlZmluZSBHSEVTX1BGWAkiR0hFUzogIgogCiAjZGVmaW5lIEdIRVNfRVNUQVRVU19NQVhfU0laRQkJNjU1MzYKKyNkZWZpbmUgR0hFU19FU09VUkNFX1BSRUFMTE9DX01BWF9TSVpFCTY1NTM2CisKKyNkZWZpbmUgR0hFU19FU1RBVFVTX1BPT0xfTUlOX0FMTE9DX09SREVSIDMKKworLyogVGhpcyBpcyBqdXN0IGFuIGVzdGltYXRpb24gZm9yIG1lbW9yeSBwb29sIGFsbG9jYXRpb24gKi8KKyNkZWZpbmUgR0hFU19FU1RBVFVTX0NBQ0hFX0FWR19TSVpFCTUxMgorCisjZGVmaW5lIEdIRVNfRVNUQVRVU19DQUNIRVNfU0laRQk0CisKKyNkZWZpbmUgR0hFU19FU1RBVFVTX0lOX0NBQ0hFX01BWF9OU0VDCTEwMDAwMDAwMDAwVUxMCisvKiBQcmV2ZW50IHRvbyBtYW55IGNhY2hlcyBhcmUgYWxsb2NhdGVkIGJlY2F1c2Ugb2YgUkNVICovCisjZGVmaW5lIEdIRVNfRVNUQVRVU19DQUNIRV9BTExPQ0VEX01BWAkoR0hFU19FU1RBVFVTX0NBQ0hFU19TSVpFICogMyAvIDIpCisKKyNkZWZpbmUgR0hFU19FU1RBVFVTX0NBQ0hFX0xFTihlc3RhdHVzX2xlbikJCQlcCisJKHNpemVvZihzdHJ1Y3QgZ2hlc19lc3RhdHVzX2NhY2hlKSArIChlc3RhdHVzX2xlbikpCisjZGVmaW5lIEdIRVNfRVNUQVRVU19GUk9NX0NBQ0hFKGVzdGF0dXNfY2FjaGUpCQkJXAorCSgoc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljX3N0YXR1cyAqKQkJCVwKKwkgKChzdHJ1Y3QgZ2hlc19lc3RhdHVzX2NhY2hlICopKGVzdGF0dXNfY2FjaGUpICsgMSkpCisKKyNkZWZpbmUgR0hFU19FU1RBVFVTX05PREVfTEVOKGVzdGF0dXNfbGVuKQkJCVwKKwkoc2l6ZW9mKHN0cnVjdCBnaGVzX2VzdGF0dXNfbm9kZSkgKyAoZXN0YXR1c19sZW4pKQorI2RlZmluZSBHSEVTX0VTVEFUVVNfRlJPTV9OT0RFKGVzdGF0dXNfbm9kZSkJCQkJXAorCSgoc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljX3N0YXR1cyAqKQkJCQlcCisJICgoc3RydWN0IGdoZXNfZXN0YXR1c19ub2RlICopKGVzdGF0dXNfbm9kZSkgKyAxKSkKIAogLyoKICAqIE9uZSBzdHJ1Y3QgZ2hlcyBpcyBjcmVhdGVkIGZvciBlYWNoIGdlbmVyaWMgaGFyZHdhcmUgZXJyb3Igc291cmNlLgpAQCAtNzcsNiArMTA0LDIyIEBACiAJfTsKIH07CiAKK3N0cnVjdCBnaGVzX2VzdGF0dXNfbm9kZSB7CisJc3RydWN0IGxsaXN0X25vZGUgbGxub2RlOworCXN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpYyAqZ2VuZXJpYzsKK307CisKK3N0cnVjdCBnaGVzX2VzdGF0dXNfY2FjaGUgeworCXUzMiBlc3RhdHVzX2xlbjsKKwlhdG9taWNfdCBjb3VudDsKKwlzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWMgKmdlbmVyaWM7CisJdW5zaWduZWQgbG9uZyBsb25nIHRpbWVfaW47CisJc3RydWN0IHJjdV9oZWFkIHJjdTsKK307CisKK2ludCBnaGVzX2Rpc2FibGU7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGlzYWJsZSwgZ2hlc19kaXNhYmxlLCBib29sLCAwKTsKKwogc3RhdGljIGludCBnaGVzX3BhbmljX3RpbWVvdXQJX19yZWFkX21vc3RseSA9IDMwOwogCiAvKgpAQCAtMTIxLDYgKzE2NCwyMiBAQAogc3RhdGljIERFRklORV9SQVdfU1BJTkxPQ0soZ2hlc19pb3JlbWFwX2xvY2tfbm1pKTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZ2hlc19pb3JlbWFwX2xvY2tfaXJxKTsKIAorLyoKKyAqIHByaW50ayBpcyBub3Qgc2FmZSBpbiBOTUkgY29udGV4dC4gIFNvIGluIE5NSSBoYW5kbGVyLCB3ZSBhbGxvY2F0ZQorICogcmVxdWlyZWQgbWVtb3J5IGZyb20gbG9jay1sZXNzIG1lbW9yeSBhbGxvY2F0b3IKKyAqIChnaGVzX2VzdGF0dXNfcG9vbCksIHNhdmUgZXN0YXR1cyBpbnRvIGl0LCBwdXQgdGhlbSBpbnRvIGxvY2stbGVzcworICogbGlzdCAoZ2hlc19lc3RhdHVzX2xsaXN0KSwgdGhlbiBkZWxheSBwcmludGsgaW50byBJUlEgY29udGV4dCB2aWEKKyAqIGlycV93b3JrIChnaGVzX3Byb2NfaXJxX3dvcmspLiAgZ2hlc19lc3RhdHVzX3NpemVfcmVxdWVzdCByZWNvcmQKKyAqIHJlcXVpcmVkIHBvb2wgc2l6ZSBieSBhbGwgTk1JIGVycm9yIHNvdXJjZS4KKyAqLworc3RhdGljIHN0cnVjdCBnZW5fcG9vbCAqZ2hlc19lc3RhdHVzX3Bvb2w7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBnaGVzX2VzdGF0dXNfcG9vbF9zaXplX3JlcXVlc3Q7CitzdGF0aWMgc3RydWN0IGxsaXN0X2hlYWQgZ2hlc19lc3RhdHVzX2xsaXN0Oworc3RhdGljIHN0cnVjdCBpcnFfd29yayBnaGVzX3Byb2NfaXJxX3dvcms7CisKK3N0cnVjdCBnaGVzX2VzdGF0dXNfY2FjaGUgKmdoZXNfZXN0YXR1c19jYWNoZXNbR0hFU19FU1RBVFVTX0NBQ0hFU19TSVpFXTsKK3N0YXRpYyBhdG9taWNfdCBnaGVzX2VzdGF0dXNfY2FjaGVfYWxsb2NlZDsKKwogc3RhdGljIGludCBnaGVzX2lvcmVtYXBfaW5pdCh2b2lkKQogewogCWdoZXNfaW9yZW1hcF9hcmVhID0gX19nZXRfdm1fYXJlYShQQUdFX1NJWkUgKiBHSEVTX0lPUkVNQVBfUEFHRVMsCkBAIC0xODAsNiArMjM5LDU1IEBACiAJX19mbHVzaF90bGJfb25lKHZhZGRyKTsKIH0KIAorc3RhdGljIGludCBnaGVzX2VzdGF0dXNfcG9vbF9pbml0KHZvaWQpCit7CisJZ2hlc19lc3RhdHVzX3Bvb2wgPSBnZW5fcG9vbF9jcmVhdGUoR0hFU19FU1RBVFVTX1BPT0xfTUlOX0FMTE9DX09SREVSLCAtMSk7CisJaWYgKCFnaGVzX2VzdGF0dXNfcG9vbCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdoZXNfZXN0YXR1c19wb29sX2ZyZWVfY2h1bmtfcGFnZShzdHJ1Y3QgZ2VuX3Bvb2wgKnBvb2wsCisJCQkJCSAgICAgIHN0cnVjdCBnZW5fcG9vbF9jaHVuayAqY2h1bmssCisJCQkJCSAgICAgIHZvaWQgKmRhdGEpCit7CisJZnJlZV9wYWdlKGNodW5rLT5zdGFydF9hZGRyKTsKK30KKworc3RhdGljIHZvaWQgZ2hlc19lc3RhdHVzX3Bvb2xfZXhpdCh2b2lkKQoreworCWdlbl9wb29sX2Zvcl9lYWNoX2NodW5rKGdoZXNfZXN0YXR1c19wb29sLAorCQkJCWdoZXNfZXN0YXR1c19wb29sX2ZyZWVfY2h1bmtfcGFnZSwgTlVMTCk7CisJZ2VuX3Bvb2xfZGVzdHJveShnaGVzX2VzdGF0dXNfcG9vbCk7Cit9CisKK3N0YXRpYyBpbnQgZ2hlc19lc3RhdHVzX3Bvb2xfZXhwYW5kKHVuc2lnbmVkIGxvbmcgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgaSwgcGFnZXMsIHNpemUsIGFkZHI7CisJaW50IHJldDsKKworCWdoZXNfZXN0YXR1c19wb29sX3NpemVfcmVxdWVzdCArPSBQQUdFX0FMSUdOKGxlbik7CisJc2l6ZSA9IGdlbl9wb29sX3NpemUoZ2hlc19lc3RhdHVzX3Bvb2wpOworCWlmIChzaXplID49IGdoZXNfZXN0YXR1c19wb29sX3NpemVfcmVxdWVzdCkKKwkJcmV0dXJuIDA7CisJcGFnZXMgPSAoZ2hlc19lc3RhdHVzX3Bvb2xfc2l6ZV9yZXF1ZXN0IC0gc2l6ZSkgLyBQQUdFX1NJWkU7CisJZm9yIChpID0gMDsgaSA8IHBhZ2VzOyBpKyspIHsKKwkJYWRkciA9IF9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwkJaWYgKCFhZGRyKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXJldCA9IGdlbl9wb29sX2FkZChnaGVzX2VzdGF0dXNfcG9vbCwgYWRkciwgUEFHRV9TSVpFLCAtMSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBnaGVzX2VzdGF0dXNfcG9vbF9zaHJpbmsodW5zaWduZWQgbG9uZyBsZW4pCit7CisJZ2hlc19lc3RhdHVzX3Bvb2xfc2l6ZV9yZXF1ZXN0IC09IFBBR0VfQUxJR04obGVuKTsKK30KKwogc3RhdGljIHN0cnVjdCBnaGVzICpnaGVzX25ldyhzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWMgKmdlbmVyaWMpCiB7CiAJc3RydWN0IGdoZXMgKmdoZXM7CkBAIC0zNDEsNDMgKzQ0OSwxOTYgQEAKIAlnaGVzLT5mbGFncyAmPSB+R0hFU19UT19DTEVBUjsKIH0KIAotc3RhdGljIHZvaWQgZ2hlc19kb19wcm9jKHN0cnVjdCBnaGVzICpnaGVzKQorc3RhdGljIHZvaWQgZ2hlc19kb19wcm9jKGNvbnN0IHN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpY19zdGF0dXMgKmVzdGF0dXMpCiB7Ci0JaW50IHNldiwgcHJvY2Vzc2VkID0gMDsKKwlpbnQgc2V2LCBzZWNfc2V2OwogCXN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpY19kYXRhICpnZGF0YTsKIAotCXNldiA9IGdoZXNfc2V2ZXJpdHkoZ2hlcy0+ZXN0YXR1cy0+ZXJyb3Jfc2V2ZXJpdHkpOwotCWFwZWlfZXN0YXR1c19mb3JfZWFjaF9zZWN0aW9uKGdoZXMtPmVzdGF0dXMsIGdkYXRhKSB7Ci0jaWZkZWYgQ09ORklHX1g4Nl9NQ0UKKwlzZXYgPSBnaGVzX3NldmVyaXR5KGVzdGF0dXMtPmVycm9yX3NldmVyaXR5KTsKKwlhcGVpX2VzdGF0dXNfZm9yX2VhY2hfc2VjdGlvbihlc3RhdHVzLCBnZGF0YSkgeworCQlzZWNfc2V2ID0gZ2hlc19zZXZlcml0eShnZGF0YS0+ZXJyb3Jfc2V2ZXJpdHkpOwogCQlpZiAoIXV1aWRfbGVfY21wKCoodXVpZF9sZSAqKWdkYXRhLT5zZWN0aW9uX3R5cGUsCiAJCQkJIENQRVJfU0VDX1BMQVRGT1JNX01FTSkpIHsKLQkJCWFwZWlfbWNlX3JlcG9ydF9tZW1fZXJyb3IoCi0JCQkJc2V2ID09IEdIRVNfU0VWX0NPUlJFQ1RFRCwKLQkJCQkoc3RydWN0IGNwZXJfc2VjX21lbV9lcnIgKikoZ2RhdGErMSkpOwotCQkJcHJvY2Vzc2VkID0gMTsKLQkJfQorCQkJc3RydWN0IGNwZXJfc2VjX21lbV9lcnIgKm1lbV9lcnI7CisJCQltZW1fZXJyID0gKHN0cnVjdCBjcGVyX3NlY19tZW1fZXJyICopKGdkYXRhKzEpOworI2lmZGVmIENPTkZJR19YODZfTUNFCisJCQlhcGVpX21jZV9yZXBvcnRfbWVtX2Vycm9yKHNldiA9PSBHSEVTX1NFVl9DT1JSRUNURUQsCisJCQkJCQkgIG1lbV9lcnIpOwogI2VuZGlmCisjaWZkZWYgQ09ORklHX0FDUElfQVBFSV9NRU1PUllfRkFJTFVSRQorCQkJaWYgKHNldiA9PSBHSEVTX1NFVl9SRUNPVkVSQUJMRSAmJgorCQkJICAgIHNlY19zZXYgPT0gR0hFU19TRVZfUkVDT1ZFUkFCTEUgJiYKKwkJCSAgICBtZW1fZXJyLT52YWxpZGF0aW9uX2JpdHMgJiBDUEVSX01FTV9WQUxJRF9QSFlTSUNBTF9BRERSRVNTKSB7CisJCQkJdW5zaWduZWQgbG9uZyBwZm47CisJCQkJcGZuID0gbWVtX2Vyci0+cGh5c2ljYWxfYWRkciA+PiBQQUdFX1NISUZUOworCQkJCW1lbW9yeV9mYWlsdXJlX3F1ZXVlKHBmbiwgMCwgMCk7CisJCQl9CisjZW5kaWYKKwkJfQogCX0KIH0KIAotc3RhdGljIHZvaWQgZ2hlc19wcmludF9lc3RhdHVzKGNvbnN0IGNoYXIgKnBmeCwgc3RydWN0IGdoZXMgKmdoZXMpCitzdGF0aWMgdm9pZCBfX2doZXNfcHJpbnRfZXN0YXR1cyhjb25zdCBjaGFyICpwZngsCisJCQkJIGNvbnN0IHN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpYyAqZ2VuZXJpYywKKwkJCQkgY29uc3Qgc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljX3N0YXR1cyAqZXN0YXR1cykKIHsKLQkvKiBOb3QgbW9yZSB0aGFuIDIgbWVzc2FnZXMgZXZlcnkgNSBzZWNvbmRzICovCi0Jc3RhdGljIERFRklORV9SQVRFTElNSVRfU1RBVEUocmF0ZWxpbWl0LCA1KkhaLCAyKTsKLQogCWlmIChwZnggPT0gTlVMTCkgewotCQlpZiAoZ2hlc19zZXZlcml0eShnaGVzLT5lc3RhdHVzLT5lcnJvcl9zZXZlcml0eSkgPD0KKwkJaWYgKGdoZXNfc2V2ZXJpdHkoZXN0YXR1cy0+ZXJyb3Jfc2V2ZXJpdHkpIDw9CiAJCSAgICBHSEVTX1NFVl9DT1JSRUNURUQpCiAJCQlwZnggPSBLRVJOX1dBUk5JTkcgSFdfRVJSOwogCQllbHNlCiAJCQlwZnggPSBLRVJOX0VSUiBIV19FUlI7CiAJfQotCWlmIChfX3JhdGVsaW1pdCgmcmF0ZWxpbWl0KSkgewotCQlwcmludGsoCi0JIiVzIiJIYXJkd2FyZSBlcnJvciBmcm9tIEFQRUkgR2VuZXJpYyBIYXJkd2FyZSBFcnJvciBTb3VyY2U6ICVkXG4iLAotCXBmeCwgZ2hlcy0+Z2VuZXJpYy0+aGVhZGVyLnNvdXJjZV9pZCk7Ci0JCWFwZWlfZXN0YXR1c19wcmludChwZngsIGdoZXMtPmVzdGF0dXMpOworCXByaW50aygiJXMiIkhhcmR3YXJlIGVycm9yIGZyb20gQVBFSSBHZW5lcmljIEhhcmR3YXJlIEVycm9yIFNvdXJjZTogJWRcbiIsCisJICAgICAgIHBmeCwgZ2VuZXJpYy0+aGVhZGVyLnNvdXJjZV9pZCk7CisJYXBlaV9lc3RhdHVzX3ByaW50KHBmeCwgZXN0YXR1cyk7Cit9CisKK3N0YXRpYyBpbnQgZ2hlc19wcmludF9lc3RhdHVzKGNvbnN0IGNoYXIgKnBmeCwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpYyAqZ2VuZXJpYywKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpY19zdGF0dXMgKmVzdGF0dXMpCit7CisJLyogTm90IG1vcmUgdGhhbiAyIG1lc3NhZ2VzIGV2ZXJ5IDUgc2Vjb25kcyAqLworCXN0YXRpYyBERUZJTkVfUkFURUxJTUlUX1NUQVRFKHJhdGVsaW1pdF9jb3JyZWN0ZWQsIDUqSFosIDIpOworCXN0YXRpYyBERUZJTkVfUkFURUxJTUlUX1NUQVRFKHJhdGVsaW1pdF91bmNvcnJlY3RlZCwgNSpIWiwgMik7CisJc3RydWN0IHJhdGVsaW1pdF9zdGF0ZSAqcmF0ZWxpbWl0OworCisJaWYgKGdoZXNfc2V2ZXJpdHkoZXN0YXR1cy0+ZXJyb3Jfc2V2ZXJpdHkpIDw9IEdIRVNfU0VWX0NPUlJFQ1RFRCkKKwkJcmF0ZWxpbWl0ID0gJnJhdGVsaW1pdF9jb3JyZWN0ZWQ7CisJZWxzZQorCQlyYXRlbGltaXQgPSAmcmF0ZWxpbWl0X3VuY29ycmVjdGVkOworCWlmIChfX3JhdGVsaW1pdChyYXRlbGltaXQpKSB7CisJCV9fZ2hlc19wcmludF9lc3RhdHVzKHBmeCwgZ2VuZXJpYywgZXN0YXR1cyk7CisJCXJldHVybiAxOwogCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEdIRVMgZXJyb3Igc3RhdHVzIHJlcG9ydGluZyB0aHJvdHRsZSwgdG8gcmVwb3J0IG1vcmUga2luZHMgb2YKKyAqIGVycm9ycywgaW5zdGVhZCBvZiBqdXN0IG1vc3QgZnJlcXVlbnRseSBvY2N1cnJlZCBlcnJvcnMuCisgKi8KK3N0YXRpYyBpbnQgZ2hlc19lc3RhdHVzX2NhY2hlZChzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWNfc3RhdHVzICplc3RhdHVzKQoreworCXUzMiBsZW47CisJaW50IGksIGNhY2hlZCA9IDA7CisJdW5zaWduZWQgbG9uZyBsb25nIG5vdzsKKwlzdHJ1Y3QgZ2hlc19lc3RhdHVzX2NhY2hlICpjYWNoZTsKKwlzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWNfc3RhdHVzICpjYWNoZV9lc3RhdHVzOworCisJbGVuID0gYXBlaV9lc3RhdHVzX2xlbihlc3RhdHVzKTsKKwlyY3VfcmVhZF9sb2NrKCk7CisJZm9yIChpID0gMDsgaSA8IEdIRVNfRVNUQVRVU19DQUNIRVNfU0laRTsgaSsrKSB7CisJCWNhY2hlID0gcmN1X2RlcmVmZXJlbmNlKGdoZXNfZXN0YXR1c19jYWNoZXNbaV0pOworCQlpZiAoY2FjaGUgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlpZiAobGVuICE9IGNhY2hlLT5lc3RhdHVzX2xlbikKKwkJCWNvbnRpbnVlOworCQljYWNoZV9lc3RhdHVzID0gR0hFU19FU1RBVFVTX0ZST01fQ0FDSEUoY2FjaGUpOworCQlpZiAobWVtY21wKGVzdGF0dXMsIGNhY2hlX2VzdGF0dXMsIGxlbikpCisJCQljb250aW51ZTsKKwkJYXRvbWljX2luYygmY2FjaGUtPmNvdW50KTsKKwkJbm93ID0gc2NoZWRfY2xvY2soKTsKKwkJaWYgKG5vdyAtIGNhY2hlLT50aW1lX2luIDwgR0hFU19FU1RBVFVTX0lOX0NBQ0hFX01BWF9OU0VDKQorCQkJY2FjaGVkID0gMTsKKwkJYnJlYWs7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiBjYWNoZWQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ2hlc19lc3RhdHVzX2NhY2hlICpnaGVzX2VzdGF0dXNfY2FjaGVfYWxsb2MoCisJc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljICpnZW5lcmljLAorCXN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpY19zdGF0dXMgKmVzdGF0dXMpCit7CisJaW50IGFsbG9jZWQ7CisJdTMyIGxlbiwgY2FjaGVfbGVuOworCXN0cnVjdCBnaGVzX2VzdGF0dXNfY2FjaGUgKmNhY2hlOworCXN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpY19zdGF0dXMgKmNhY2hlX2VzdGF0dXM7CisKKwlhbGxvY2VkID0gYXRvbWljX2FkZF9yZXR1cm4oMSwgJmdoZXNfZXN0YXR1c19jYWNoZV9hbGxvY2VkKTsKKwlpZiAoYWxsb2NlZCA+IEdIRVNfRVNUQVRVU19DQUNIRV9BTExPQ0VEX01BWCkgeworCQlhdG9taWNfZGVjKCZnaGVzX2VzdGF0dXNfY2FjaGVfYWxsb2NlZCk7CisJCXJldHVybiBOVUxMOworCX0KKwlsZW4gPSBhcGVpX2VzdGF0dXNfbGVuKGVzdGF0dXMpOworCWNhY2hlX2xlbiA9IEdIRVNfRVNUQVRVU19DQUNIRV9MRU4obGVuKTsKKwljYWNoZSA9ICh2b2lkICopZ2VuX3Bvb2xfYWxsb2MoZ2hlc19lc3RhdHVzX3Bvb2wsIGNhY2hlX2xlbik7CisJaWYgKCFjYWNoZSkgeworCQlhdG9taWNfZGVjKCZnaGVzX2VzdGF0dXNfY2FjaGVfYWxsb2NlZCk7CisJCXJldHVybiBOVUxMOworCX0KKwljYWNoZV9lc3RhdHVzID0gR0hFU19FU1RBVFVTX0ZST01fQ0FDSEUoY2FjaGUpOworCW1lbWNweShjYWNoZV9lc3RhdHVzLCBlc3RhdHVzLCBsZW4pOworCWNhY2hlLT5lc3RhdHVzX2xlbiA9IGxlbjsKKwlhdG9taWNfc2V0KCZjYWNoZS0+Y291bnQsIDApOworCWNhY2hlLT5nZW5lcmljID0gZ2VuZXJpYzsKKwljYWNoZS0+dGltZV9pbiA9IHNjaGVkX2Nsb2NrKCk7CisJcmV0dXJuIGNhY2hlOworfQorCitzdGF0aWMgdm9pZCBnaGVzX2VzdGF0dXNfY2FjaGVfZnJlZShzdHJ1Y3QgZ2hlc19lc3RhdHVzX2NhY2hlICpjYWNoZSkKK3sKKwl1MzIgbGVuOworCisJbGVuID0gYXBlaV9lc3RhdHVzX2xlbihHSEVTX0VTVEFUVVNfRlJPTV9DQUNIRShjYWNoZSkpOworCWxlbiA9IEdIRVNfRVNUQVRVU19DQUNIRV9MRU4obGVuKTsKKwlnZW5fcG9vbF9mcmVlKGdoZXNfZXN0YXR1c19wb29sLCAodW5zaWduZWQgbG9uZyljYWNoZSwgbGVuKTsKKwlhdG9taWNfZGVjKCZnaGVzX2VzdGF0dXNfY2FjaGVfYWxsb2NlZCk7Cit9CisKK3N0YXRpYyB2b2lkIGdoZXNfZXN0YXR1c19jYWNoZV9yY3VfZnJlZShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IGdoZXNfZXN0YXR1c19jYWNoZSAqY2FjaGU7CisKKwljYWNoZSA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgZ2hlc19lc3RhdHVzX2NhY2hlLCByY3UpOworCWdoZXNfZXN0YXR1c19jYWNoZV9mcmVlKGNhY2hlKTsKK30KKworc3RhdGljIHZvaWQgZ2hlc19lc3RhdHVzX2NhY2hlX2FkZCgKKwlzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWMgKmdlbmVyaWMsCisJc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljX3N0YXR1cyAqZXN0YXR1cykKK3sKKwlpbnQgaSwgc2xvdCA9IC0xLCBjb3VudDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbm93LCBkdXJhdGlvbiwgcGVyaW9kLCBtYXhfcGVyaW9kID0gMDsKKwlzdHJ1Y3QgZ2hlc19lc3RhdHVzX2NhY2hlICpjYWNoZSwgKnNsb3RfY2FjaGUgPSBOVUxMLCAqbmV3X2NhY2hlOworCisJbmV3X2NhY2hlID0gZ2hlc19lc3RhdHVzX2NhY2hlX2FsbG9jKGdlbmVyaWMsIGVzdGF0dXMpOworCWlmIChuZXdfY2FjaGUgPT0gTlVMTCkKKwkJcmV0dXJuOworCXJjdV9yZWFkX2xvY2soKTsKKwlub3cgPSBzY2hlZF9jbG9jaygpOworCWZvciAoaSA9IDA7IGkgPCBHSEVTX0VTVEFUVVNfQ0FDSEVTX1NJWkU7IGkrKykgeworCQljYWNoZSA9IHJjdV9kZXJlZmVyZW5jZShnaGVzX2VzdGF0dXNfY2FjaGVzW2ldKTsKKwkJaWYgKGNhY2hlID09IE5VTEwpIHsKKwkJCXNsb3QgPSBpOworCQkJc2xvdF9jYWNoZSA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCQlkdXJhdGlvbiA9IG5vdyAtIGNhY2hlLT50aW1lX2luOworCQlpZiAoZHVyYXRpb24gPj0gR0hFU19FU1RBVFVTX0lOX0NBQ0hFX01BWF9OU0VDKSB7CisJCQlzbG90ID0gaTsKKwkJCXNsb3RfY2FjaGUgPSBjYWNoZTsKKwkJCWJyZWFrOworCQl9CisJCWNvdW50ID0gYXRvbWljX3JlYWQoJmNhY2hlLT5jb3VudCk7CisJCXBlcmlvZCA9IGR1cmF0aW9uOworCQlkb19kaXYocGVyaW9kLCAoY291bnQgKyAxKSk7CisJCWlmIChwZXJpb2QgPiBtYXhfcGVyaW9kKSB7CisJCQltYXhfcGVyaW9kID0gcGVyaW9kOworCQkJc2xvdCA9IGk7CisJCQlzbG90X2NhY2hlID0gY2FjaGU7CisJCX0KKwl9CisJLyogbmV3X2NhY2hlIG11c3QgYmUgcHV0IGludG8gYXJyYXkgYWZ0ZXIgaXRzIGNvbnRlbnRzIGFyZSB3cml0dGVuICovCisJc21wX3dtYigpOworCWlmIChzbG90ICE9IC0xICYmIGNtcHhjaGcoZ2hlc19lc3RhdHVzX2NhY2hlcyArIHNsb3QsCisJCQkJICBzbG90X2NhY2hlLCBuZXdfY2FjaGUpID09IHNsb3RfY2FjaGUpIHsKKwkJaWYgKHNsb3RfY2FjaGUpCisJCQljYWxsX3JjdSgmc2xvdF9jYWNoZS0+cmN1LCBnaGVzX2VzdGF0dXNfY2FjaGVfcmN1X2ZyZWUpOworCX0gZWxzZQorCQlnaGVzX2VzdGF0dXNfY2FjaGVfZnJlZShuZXdfY2FjaGUpOworCXJjdV9yZWFkX3VubG9jaygpOwogfQogCiBzdGF0aWMgaW50IGdoZXNfcHJvYyhzdHJ1Y3QgZ2hlcyAqZ2hlcykKQEAgLTM4Nyw5ICs2NDgsMTEgQEAKIAlyYyA9IGdoZXNfcmVhZF9lc3RhdHVzKGdoZXMsIDApOwogCWlmIChyYykKIAkJZ290byBvdXQ7Ci0JZ2hlc19wcmludF9lc3RhdHVzKE5VTEwsIGdoZXMpOwotCWdoZXNfZG9fcHJvYyhnaGVzKTsKLQorCWlmICghZ2hlc19lc3RhdHVzX2NhY2hlZChnaGVzLT5lc3RhdHVzKSkgeworCQlpZiAoZ2hlc19wcmludF9lc3RhdHVzKE5VTEwsIGdoZXMtPmdlbmVyaWMsIGdoZXMtPmVzdGF0dXMpKQorCQkJZ2hlc19lc3RhdHVzX2NhY2hlX2FkZChnaGVzLT5nZW5lcmljLCBnaGVzLT5lc3RhdHVzKTsKKwl9CisJZ2hlc19kb19wcm9jKGdoZXMtPmVzdGF0dXMpOwogb3V0OgogCWdoZXNfY2xlYXJfZXN0YXR1cyhnaGVzKTsKIAlyZXR1cm4gMDsKQEAgLTQ0Nyw2ICs3MTAsNDUgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCBnaGVzX3Byb2NfaW5faXJxKHN0cnVjdCBpcnFfd29yayAqaXJxX3dvcmspCit7CisJc3RydWN0IGxsaXN0X25vZGUgKmxsbm9kZSwgKm5leHQsICp0YWlsID0gTlVMTDsKKwlzdHJ1Y3QgZ2hlc19lc3RhdHVzX25vZGUgKmVzdGF0dXNfbm9kZTsKKwlzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWMgKmdlbmVyaWM7CisJc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljX3N0YXR1cyAqZXN0YXR1czsKKwl1MzIgbGVuLCBub2RlX2xlbjsKKworCS8qCisJICogQmVjYXVzZSB0aGUgdGltZSBvcmRlciBvZiBlc3RhdHVzIGluIGxpc3QgaXMgcmV2ZXJzZWQsCisJICogcmV2ZXJ0IGl0IGJhY2sgdG8gcHJvcGVyIG9yZGVyLgorCSAqLworCWxsbm9kZSA9IGxsaXN0X2RlbF9hbGwoJmdoZXNfZXN0YXR1c19sbGlzdCk7CisJd2hpbGUgKGxsbm9kZSkgeworCQluZXh0ID0gbGxub2RlLT5uZXh0OworCQlsbG5vZGUtPm5leHQgPSB0YWlsOworCQl0YWlsID0gbGxub2RlOworCQlsbG5vZGUgPSBuZXh0OworCX0KKwlsbG5vZGUgPSB0YWlsOworCXdoaWxlIChsbG5vZGUpIHsKKwkJbmV4dCA9IGxsbm9kZS0+bmV4dDsKKwkJZXN0YXR1c19ub2RlID0gbGxpc3RfZW50cnkobGxub2RlLCBzdHJ1Y3QgZ2hlc19lc3RhdHVzX25vZGUsCisJCQkJCSAgIGxsbm9kZSk7CisJCWVzdGF0dXMgPSBHSEVTX0VTVEFUVVNfRlJPTV9OT0RFKGVzdGF0dXNfbm9kZSk7CisJCWxlbiA9IGFwZWlfZXN0YXR1c19sZW4oZXN0YXR1cyk7CisJCW5vZGVfbGVuID0gR0hFU19FU1RBVFVTX05PREVfTEVOKGxlbik7CisJCWdoZXNfZG9fcHJvYyhlc3RhdHVzKTsKKwkJaWYgKCFnaGVzX2VzdGF0dXNfY2FjaGVkKGVzdGF0dXMpKSB7CisJCQlnZW5lcmljID0gZXN0YXR1c19ub2RlLT5nZW5lcmljOworCQkJaWYgKGdoZXNfcHJpbnRfZXN0YXR1cyhOVUxMLCBnZW5lcmljLCBlc3RhdHVzKSkKKwkJCQlnaGVzX2VzdGF0dXNfY2FjaGVfYWRkKGdlbmVyaWMsIGVzdGF0dXMpOworCQl9CisJCWdlbl9wb29sX2ZyZWUoZ2hlc19lc3RhdHVzX3Bvb2wsICh1bnNpZ25lZCBsb25nKWVzdGF0dXNfbm9kZSwKKwkJCSAgICAgIG5vZGVfbGVuKTsKKwkJbGxub2RlID0gbmV4dDsKKwl9Cit9CisKIHN0YXRpYyBpbnQgZ2hlc19ub3RpZnlfbm1pKHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywKIAkJCQkgIHVuc2lnbmVkIGxvbmcgY21kLCB2b2lkICpkYXRhKQogewpAQCAtNDc2LDcgKzc3OCw4IEBACiAKIAlpZiAoc2V2X2dsb2JhbCA+PSBHSEVTX1NFVl9QQU5JQykgewogCQlvb3BzX2JlZ2luKCk7Ci0JCWdoZXNfcHJpbnRfZXN0YXR1cyhLRVJOX0VNRVJHIEhXX0VSUiwgZ2hlc19nbG9iYWwpOworCQlfX2doZXNfcHJpbnRfZXN0YXR1cyhLRVJOX0VNRVJHIEhXX0VSUiwgZ2hlc19nbG9iYWwtPmdlbmVyaWMsCisJCQkJICAgICBnaGVzX2dsb2JhbC0+ZXN0YXR1cyk7CiAJCS8qIHJlYm9vdCB0byBsb2cgdGhlIGVycm9yISAqLwogCQlpZiAocGFuaWNfdGltZW91dCA9PSAwKQogCQkJcGFuaWNfdGltZW91dCA9IGdoZXNfcGFuaWNfdGltZW91dDsKQEAgLTQ4NCwxMiArNzg3LDM0IEBACiAJfQogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZ2hlcywgJmdoZXNfbm1pLCBsaXN0KSB7CisjaWZkZWYgQ09ORklHX0FSQ0hfSEFWRV9OTUlfU0FGRV9DTVBYQ0hHCisJCXUzMiBsZW4sIG5vZGVfbGVuOworCQlzdHJ1Y3QgZ2hlc19lc3RhdHVzX25vZGUgKmVzdGF0dXNfbm9kZTsKKwkJc3RydWN0IGFjcGlfaGVzdF9nZW5lcmljX3N0YXR1cyAqZXN0YXR1czsKKyNlbmRpZgogCQlpZiAoIShnaGVzLT5mbGFncyAmIEdIRVNfVE9fQ0xFQVIpKQogCQkJY29udGludWU7Ci0JCS8qIERvIG5vdCBwcmludCBlc3RhdHVzIGJlY2F1c2UgcHJpbnRrIGlzIG5vdCBOTUkgc2FmZSAqLwotCQlnaGVzX2RvX3Byb2MoZ2hlcyk7CisjaWZkZWYgQ09ORklHX0FSQ0hfSEFWRV9OTUlfU0FGRV9DTVBYQ0hHCisJCWlmIChnaGVzX2VzdGF0dXNfY2FjaGVkKGdoZXMtPmVzdGF0dXMpKQorCQkJZ290byBuZXh0OworCQkvKiBTYXZlIGVzdGF0dXMgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZyBpbiBJUlEgY29udGV4dCAqLworCQlsZW4gPSBhcGVpX2VzdGF0dXNfbGVuKGdoZXMtPmVzdGF0dXMpOworCQlub2RlX2xlbiA9IEdIRVNfRVNUQVRVU19OT0RFX0xFTihsZW4pOworCQllc3RhdHVzX25vZGUgPSAodm9pZCAqKWdlbl9wb29sX2FsbG9jKGdoZXNfZXN0YXR1c19wb29sLAorCQkJCQkJICAgICAgbm9kZV9sZW4pOworCQlpZiAoZXN0YXR1c19ub2RlKSB7CisJCQllc3RhdHVzX25vZGUtPmdlbmVyaWMgPSBnaGVzLT5nZW5lcmljOworCQkJZXN0YXR1cyA9IEdIRVNfRVNUQVRVU19GUk9NX05PREUoZXN0YXR1c19ub2RlKTsKKwkJCW1lbWNweShlc3RhdHVzLCBnaGVzLT5lc3RhdHVzLCBsZW4pOworCQkJbGxpc3RfYWRkKCZlc3RhdHVzX25vZGUtPmxsbm9kZSwgJmdoZXNfZXN0YXR1c19sbGlzdCk7CisJCX0KK25leHQ6CisjZW5kaWYKIAkJZ2hlc19jbGVhcl9lc3RhdHVzKGdoZXMpOwogCX0KKyNpZmRlZiBDT05GSUdfQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcKKwlpcnFfd29ya19xdWV1ZSgmZ2hlc19wcm9jX2lycV93b3JrKTsKKyNlbmRpZgogCiBvdXQ6CiAJcmF3X3NwaW5fdW5sb2NrKCZnaGVzX25taV9sb2NrKTsKQEAgLTUwNCwxMCArODI5LDI2IEBACiAJLm5vdGlmaWVyX2NhbGwgPSBnaGVzX25vdGlmeV9ubWksCiB9OwogCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnaGVzX2Vzb3VyY2VfcHJlYWxsb2Nfc2l6ZSgKKwljb25zdCBzdHJ1Y3QgYWNwaV9oZXN0X2dlbmVyaWMgKmdlbmVyaWMpCit7CisJdW5zaWduZWQgbG9uZyBibG9ja19sZW5ndGgsIHByZWFsbG9jX3JlY29yZHMsIHByZWFsbG9jX3NpemU7CisKKwlibG9ja19sZW5ndGggPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBnZW5lcmljLT5lcnJvcl9ibG9ja19sZW5ndGgsCisJCQkgICAgIEdIRVNfRVNUQVRVU19NQVhfU0laRSk7CisJcHJlYWxsb2NfcmVjb3JkcyA9IG1heF90KHVuc2lnbmVkIGxvbmcsCisJCQkJIGdlbmVyaWMtPnJlY29yZHNfdG9fcHJlYWxsb2NhdGUsIDEpOworCXByZWFsbG9jX3NpemUgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBibG9ja19sZW5ndGggKiBwcmVhbGxvY19yZWNvcmRzLAorCQkJICAgICAgR0hFU19FU09VUkNFX1BSRUFMTE9DX01BWF9TSVpFKTsKKworCXJldHVybiBwcmVhbGxvY19zaXplOworfQorCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBnaGVzX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmdoZXNfZGV2KQogewogCXN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpYyAqZ2VuZXJpYzsKIAlzdHJ1Y3QgZ2hlcyAqZ2hlcyA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBsZW47CiAJaW50IHJjID0gLUVJTlZBTDsKIAogCWdlbmVyaWMgPSAqKHN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpYyAqKilnaGVzX2Rldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CkBAIC01NzMsNiArOTE0LDggQEAKIAkJbXV0ZXhfdW5sb2NrKCZnaGVzX2xpc3RfbXV0ZXgpOwogCQlicmVhazsKIAljYXNlIEFDUElfSEVTVF9OT1RJRllfTk1JOgorCQlsZW4gPSBnaGVzX2Vzb3VyY2VfcHJlYWxsb2Nfc2l6ZShnZW5lcmljKTsKKwkJZ2hlc19lc3RhdHVzX3Bvb2xfZXhwYW5kKGxlbik7CiAJCW11dGV4X2xvY2soJmdoZXNfbGlzdF9tdXRleCk7CiAJCWlmIChsaXN0X2VtcHR5KCZnaGVzX25taSkpCiAJCQlyZWdpc3Rlcl9kaWVfbm90aWZpZXIoJmdoZXNfbm90aWZpZXJfbm1pKTsKQEAgLTU5Nyw2ICs5NDAsNyBAQAogewogCXN0cnVjdCBnaGVzICpnaGVzOwogCXN0cnVjdCBhY3BpX2hlc3RfZ2VuZXJpYyAqZ2VuZXJpYzsKKwl1bnNpZ25lZCBsb25nIGxlbjsKIAogCWdoZXMgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShnaGVzX2Rldik7CiAJZ2VuZXJpYyA9IGdoZXMtPmdlbmVyaWM7CkBAIC02MjcsNiArOTcxLDggQEAKIAkJICogZnJlZWQgYWZ0ZXIgTk1JIGhhbmRsZXIgZmluaXNoZXMuCiAJCSAqLwogCQlzeW5jaHJvbml6ZV9yY3UoKTsKKwkJbGVuID0gZ2hlc19lc291cmNlX3ByZWFsbG9jX3NpemUoZ2VuZXJpYyk7CisJCWdoZXNfZXN0YXR1c19wb29sX3NocmluayhsZW4pOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlCVUcoKTsKQEAgLTY2MiwxNSArMTAwOCw0MyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAoZ2hlc19kaXNhYmxlKSB7CisJCXByX2luZm8oR0hFU19QRlggIkdIRVMgaXMgbm90IGVuYWJsZWQhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaW5pdF9pcnFfd29yaygmZ2hlc19wcm9jX2lycV93b3JrLCBnaGVzX3Byb2NfaW5faXJxKTsKKwogCXJjID0gZ2hlc19pb3JlbWFwX2luaXQoKTsKIAlpZiAocmMpCiAJCWdvdG8gZXJyOwogCi0JcmMgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmdoZXNfcGxhdGZvcm1fZHJpdmVyKTsKKwlyYyA9IGdoZXNfZXN0YXR1c19wb29sX2luaXQoKTsKIAlpZiAocmMpCiAJCWdvdG8gZXJyX2lvcmVtYXBfZXhpdDsKIAorCXJjID0gZ2hlc19lc3RhdHVzX3Bvb2xfZXhwYW5kKEdIRVNfRVNUQVRVU19DQUNIRV9BVkdfU0laRSAqCisJCQkJICAgICAgR0hFU19FU1RBVFVTX0NBQ0hFX0FMTE9DRURfTUFYKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX3Bvb2xfZXhpdDsKKworCXJjID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZnaGVzX3BsYXRmb3JtX2RyaXZlcik7CisJaWYgKHJjKQorCQlnb3RvIGVycl9wb29sX2V4aXQ7CisKKwlyYyA9IGFwZWlfb3NjX3NldHVwKCk7CisJaWYgKHJjID09IDAgJiYgb3NjX3NiX2FwZWlfc3VwcG9ydF9hY2tlZCkKKwkJcHJfaW5mbyhHSEVTX1BGWCAiQVBFSSBmaXJtd2FyZSBmaXJzdCBtb2RlIGlzIGVuYWJsZWQgYnkgQVBFSSBiaXQgYW5kIFdIRUEgX09TQy5cbiIpOworCWVsc2UgaWYgKHJjID09IDAgJiYgIW9zY19zYl9hcGVpX3N1cHBvcnRfYWNrZWQpCisJCXByX2luZm8oR0hFU19QRlggIkFQRUkgZmlybXdhcmUgZmlyc3QgbW9kZSBpcyBlbmFibGVkIGJ5IFdIRUEgX09TQy5cbiIpOworCWVsc2UgaWYgKHJjICYmIG9zY19zYl9hcGVpX3N1cHBvcnRfYWNrZWQpCisJCXByX2luZm8oR0hFU19QRlggIkFQRUkgZmlybXdhcmUgZmlyc3QgbW9kZSBpcyBlbmFibGVkIGJ5IEFQRUkgYml0LlxuIik7CisJZWxzZQorCQlwcl9pbmZvKEdIRVNfUEZYICJGYWlsZWQgdG8gZW5hYmxlIEFQRUkgZmlybXdhcmUgZmlyc3QgbW9kZS5cbiIpOworCiAJcmV0dXJuIDA7CitlcnJfcG9vbF9leGl0OgorCWdoZXNfZXN0YXR1c19wb29sX2V4aXQoKTsKIGVycl9pb3JlbWFwX2V4aXQ6CiAJZ2hlc19pb3JlbWFwX2V4aXQoKTsKIGVycjoKQEAgLTY4MCw2ICsxMDU0LDcgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCBnaGVzX2V4aXQodm9pZCkKIHsKIAlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZ2hlc19wbGF0Zm9ybV9kcml2ZXIpOworCWdoZXNfZXN0YXR1c19wb29sX2V4aXQoKTsKIAlnaGVzX2lvcmVtYXBfZXhpdCgpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYXBlaS9oZXN0LmMgYi9kcml2ZXJzL2FjcGkvYXBlaS9oZXN0LmMKaW5kZXggMTgxYmMyZi4uMDVmZWUwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2FwZWkvaGVzdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9hcGVpL2hlc3QuYwpAQCAtMjMxLDE2ICsyMzEsMTcgQEAKIAkJZ290byBlcnI7CiAJfQogCi0JcmMgPSBhcGVpX2hlc3RfcGFyc2UoaGVzdF9wYXJzZV9naGVzX2NvdW50LCAmZ2hlc19jb3VudCk7Ci0JaWYgKHJjKQotCQlnb3RvIGVycjsKLQotCXJjID0gaGVzdF9naGVzX2Rldl9yZWdpc3RlcihnaGVzX2NvdW50KTsKLQlpZiAoIXJjKSB7Ci0JCXByX2luZm8oSEVTVF9QRlggIlRhYmxlIHBhcnNpbmcgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXG4iKTsKLQkJcmV0dXJuOworCWlmICghZ2hlc19kaXNhYmxlKSB7CisJCXJjID0gYXBlaV9oZXN0X3BhcnNlKGhlc3RfcGFyc2VfZ2hlc19jb3VudCwgJmdoZXNfY291bnQpOworCQlpZiAocmMpCisJCQlnb3RvIGVycjsKKwkJcmMgPSBoZXN0X2doZXNfZGV2X3JlZ2lzdGVyKGdoZXNfY291bnQpOworCQlpZiAocmMpCisJCQlnb3RvIGVycjsKIAl9CiAKKwlwcl9pbmZvKEhFU1RfUEZYICJUYWJsZSBwYXJzaW5nIGhhcyBiZWVuIGluaXRpYWxpemVkLlxuIik7CisJcmV0dXJuOwogZXJyOgogCWhlc3RfZGlzYWJsZSA9IDE7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jIGIvZHJpdmVycy9hY3BpL2JhdHRlcnkuYwppbmRleCAyYzY2MTM1Li44N2MwYThkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jCisrKyBiL2RyaXZlcnMvYWNwaS9iYXR0ZXJ5LmMKQEAgLTU1LDYgKzU1LDkgQEAKICNkZWZpbmUgQUNQSV9CQVRURVJZX05PVElGWV9JTkZPCTB4ODEKICNkZWZpbmUgQUNQSV9CQVRURVJZX05PVElGWV9USFJFU0hPTEQgICAweDgyCiAKKy8qIEJhdHRlcnkgcG93ZXIgdW5pdDogMCBtZWFucyBtVywgMSBtZWFucyBtQSAqLworI2RlZmluZSBBQ1BJX0JBVFRFUllfUE9XRVJfVU5JVF9NQQkxCisKICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9CQVRURVJZX0NPTVBPTkVOVAogCiBBQ1BJX01PRFVMRV9OQU1FKCJiYXR0ZXJ5Iik7CkBAIC05MSwxMSArOTQsNiBAQAogZW51bSB7CiAJQUNQSV9CQVRURVJZX0FMQVJNX1BSRVNFTlQsCiAJQUNQSV9CQVRURVJZX1hJTkZPX1BSRVNFTlQsCi0JLyogRm9yIGJ1Z2d5IERTRFRzIHRoYXQgcmVwb3J0IG5lZ2F0aXZlIDE2LWJpdCB2YWx1ZXMgZm9yIGVpdGhlcgotCSAqIGNoYXJnaW5nIG9yIGRpc2NoYXJnaW5nIGN1cnJlbnQgYW5kL29yIHJlcG9ydCAwIGFzIDY1NTM2Ci0JICogZHVlIHRvIGJhZCBtYXRoLgotCSAqLwotCUFDUElfQkFUVEVSWV9RVUlSS19TSUdORUQxNl9DVVJSRU5ULAogCUFDUElfQkFUVEVSWV9RVUlSS19QRVJDRU5UQUdFX0NBUEFDSVRZLAogfTsKIApAQCAtMzAxLDcgKzI5OSw4IEBACiAjaWZkZWYgQ09ORklHX0FDUElfUFJPQ0ZTX1BPV0VSCiBpbmxpbmUgY2hhciAqYWNwaV9iYXR0ZXJ5X3VuaXRzKHN0cnVjdCBhY3BpX2JhdHRlcnkgKmJhdHRlcnkpCiB7Ci0JcmV0dXJuIChiYXR0ZXJ5LT5wb3dlcl91bml0KT8ibUEiOiJtVyI7CisJcmV0dXJuIChiYXR0ZXJ5LT5wb3dlcl91bml0ID09IEFDUElfQkFUVEVSWV9QT1dFUl9VTklUX01BKSA/CisJCSJtQSIgOiAibVciOwogfQogI2VuZGlmCiAKQEAgLTQ2MSw5ICs0NjAsMTcgQEAKIAliYXR0ZXJ5LT51cGRhdGVfdGltZSA9IGppZmZpZXM7CiAJa2ZyZWUoYnVmZmVyLnBvaW50ZXIpOwogCi0JaWYgKHRlc3RfYml0KEFDUElfQkFUVEVSWV9RVUlSS19TSUdORUQxNl9DVVJSRU5ULCAmYmF0dGVyeS0+ZmxhZ3MpICYmCi0JICAgIGJhdHRlcnktPnJhdGVfbm93ICE9IC0xKQorCS8qIEZvciBidWdneSBEU0RUcyB0aGF0IHJlcG9ydCBuZWdhdGl2ZSAxNi1iaXQgdmFsdWVzIGZvciBlaXRoZXIKKwkgKiBjaGFyZ2luZyBvciBkaXNjaGFyZ2luZyBjdXJyZW50IGFuZC9vciByZXBvcnQgMCBhcyA2NTUzNgorCSAqIGR1ZSB0byBiYWQgbWF0aC4KKwkgKi8KKwlpZiAoYmF0dGVyeS0+cG93ZXJfdW5pdCA9PSBBQ1BJX0JBVFRFUllfUE9XRVJfVU5JVF9NQSAmJgorCQliYXR0ZXJ5LT5yYXRlX25vdyAhPSBBQ1BJX0JBVFRFUllfVkFMVUVfVU5LTk9XTiAmJgorCQkoczE2KShiYXR0ZXJ5LT5yYXRlX25vdykgPCAwKSB7CiAJCWJhdHRlcnktPnJhdGVfbm93ID0gYWJzKChzMTYpYmF0dGVyeS0+cmF0ZV9ub3cpOworCQlwcmludGtfb25jZShLRVJOX1dBUk5JTkcgRldfQlVHICJiYXR0ZXJ5OiAoZGlzKWNoYXJnZSByYXRlIgorCQkJIiBpbnZhbGlkLlxuIik7CisJfQogCiAJaWYgKHRlc3RfYml0KEFDUElfQkFUVEVSWV9RVUlSS19QRVJDRU5UQUdFX0NBUEFDSVRZLCAmYmF0dGVyeS0+ZmxhZ3MpCiAJICAgICYmIGJhdHRlcnktPmNhcGFjaXR5X25vdyA+PSAwICYmIGJhdHRlcnktPmNhcGFjaXR5X25vdyA8PSAxMDApCkBAIC01NDQsNyArNTUxLDcgQEAKIHsKIAlpbnQgcmVzdWx0OwogCi0JaWYgKGJhdHRlcnktPnBvd2VyX3VuaXQpIHsKKwlpZiAoYmF0dGVyeS0+cG93ZXJfdW5pdCA9PSBBQ1BJX0JBVFRFUllfUE9XRVJfVU5JVF9NQSkgewogCQliYXR0ZXJ5LT5iYXQucHJvcGVydGllcyA9IGNoYXJnZV9iYXR0ZXJ5X3Byb3BzOwogCQliYXR0ZXJ5LT5iYXQubnVtX3Byb3BlcnRpZXMgPQogCQkJQVJSQVlfU0laRShjaGFyZ2VfYmF0dGVyeV9wcm9wcyk7CkBAIC01NjYsMTggKzU3MywxNiBAQAogCiBzdGF0aWMgdm9pZCBzeXNmc19yZW1vdmVfYmF0dGVyeShzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICpiYXR0ZXJ5KQogewotCWlmICghYmF0dGVyeS0+YmF0LmRldikKKwltdXRleF9sb2NrKCZiYXR0ZXJ5LT5sb2NrKTsKKwlpZiAoIWJhdHRlcnktPmJhdC5kZXYpIHsKKwkJbXV0ZXhfdW5sb2NrKCZiYXR0ZXJ5LT5sb2NrKTsKIAkJcmV0dXJuOworCX0KKwogCWRldmljZV9yZW1vdmVfZmlsZShiYXR0ZXJ5LT5iYXQuZGV2LCAmYWxhcm1fYXR0cik7CiAJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmJhdHRlcnktPmJhdCk7CiAJYmF0dGVyeS0+YmF0LmRldiA9IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIGFjcGlfYmF0dGVyeV9xdWlya3Moc3RydWN0IGFjcGlfYmF0dGVyeSAqYmF0dGVyeSkKLXsKLQlpZiAoZG1pX25hbWVfaW5fdmVuZG9ycygiQWNlciIpICYmIGJhdHRlcnktPnBvd2VyX3VuaXQpIHsKLQkJc2V0X2JpdChBQ1BJX0JBVFRFUllfUVVJUktfU0lHTkVEMTZfQ1VSUkVOVCwgJmJhdHRlcnktPmZsYWdzKTsKLQl9CisJbXV0ZXhfdW5sb2NrKCZiYXR0ZXJ5LT5sb2NrKTsKIH0KIAogLyoKQEAgLTU5Miw3ICs1OTcsNyBAQAogICoKICAqIEhhbmRsZSB0aGlzIGNvcnJlY3RseSBzbyB0aGF0IHRoZXkgd29uJ3QgYnJlYWsgdXNlcnNwYWNlLgogICovCi1zdGF0aWMgdm9pZCBhY3BpX2JhdHRlcnlfcXVpcmtzMihzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICpiYXR0ZXJ5KQorc3RhdGljIHZvaWQgYWNwaV9iYXR0ZXJ5X3F1aXJrcyhzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICpiYXR0ZXJ5KQogewogCWlmICh0ZXN0X2JpdChBQ1BJX0JBVFRFUllfUVVJUktfUEVSQ0VOVEFHRV9DQVBBQ0lUWSwgJmJhdHRlcnktPmZsYWdzKSkKIAkJcmV0dXJuIDsKQEAgLTYyMywxMyArNjI4LDE1IEBACiAJCXJlc3VsdCA9IGFjcGlfYmF0dGVyeV9nZXRfaW5mbyhiYXR0ZXJ5KTsKIAkJaWYgKHJlc3VsdCkKIAkJCXJldHVybiByZXN1bHQ7Ci0JCWFjcGlfYmF0dGVyeV9xdWlya3MoYmF0dGVyeSk7CiAJCWFjcGlfYmF0dGVyeV9pbml0X2FsYXJtKGJhdHRlcnkpOwogCX0KLQlpZiAoIWJhdHRlcnktPmJhdC5kZXYpCi0JCXN5c2ZzX2FkZF9iYXR0ZXJ5KGJhdHRlcnkpOworCWlmICghYmF0dGVyeS0+YmF0LmRldikgeworCQlyZXN1bHQgPSBzeXNmc19hZGRfYmF0dGVyeShiYXR0ZXJ5KTsKKwkJaWYgKHJlc3VsdCkKKwkJCXJldHVybiByZXN1bHQ7CisJfQogCXJlc3VsdCA9IGFjcGlfYmF0dGVyeV9nZXRfc3RhdGUoYmF0dGVyeSk7Ci0JYWNwaV9iYXR0ZXJ5X3F1aXJrczIoYmF0dGVyeSk7CisJYWNwaV9iYXR0ZXJ5X3F1aXJrcyhiYXR0ZXJ5KTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC04NjMsNyArODcwLDcgQEAKIAkJfSwgXAogCX0KIAotc3RhdGljIHN0cnVjdCBiYXR0ZXJ5X2ZpbGUgeworc3RhdGljIGNvbnN0IHN0cnVjdCBiYXR0ZXJ5X2ZpbGUgewogCXN0cnVjdCBmaWxlX29wZXJhdGlvbnMgb3BzOwogCW1vZGVfdCBtb2RlOwogCWNvbnN0IGNoYXIgKm5hbWU7CkBAIC05NDgsOSArOTU1LDEyIEBACiAJc3RydWN0IGFjcGlfYmF0dGVyeSAqYmF0dGVyeSA9IGNvbnRhaW5lcl9vZihuYiwgc3RydWN0IGFjcGlfYmF0dGVyeSwKIAkJCQkJCSAgICBwbV9uYik7CiAJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBQTV9QT1NUX0hJQkVSTkFUSU9OOgogCWNhc2UgUE1fUE9TVF9TVVNQRU5EOgotCQlzeXNmc19yZW1vdmVfYmF0dGVyeShiYXR0ZXJ5KTsKLQkJc3lzZnNfYWRkX2JhdHRlcnkoYmF0dGVyeSk7CisJCWlmIChiYXR0ZXJ5LT5iYXQuZGV2KSB7CisJCQlzeXNmc19yZW1vdmVfYmF0dGVyeShiYXR0ZXJ5KTsKKwkJCXN5c2ZzX2FkZF9iYXR0ZXJ5KGJhdHRlcnkpOworCQl9CiAJCWJyZWFrOwogCX0KIApAQCAtOTc1LDI1ICs5ODUsMzMgQEAKIAlpZiAoQUNQSV9TVUNDRVNTKGFjcGlfZ2V0X2hhbmRsZShiYXR0ZXJ5LT5kZXZpY2UtPmhhbmRsZSwKIAkJCSJfQklYIiwgJmhhbmRsZSkpKQogCQlzZXRfYml0KEFDUElfQkFUVEVSWV9YSU5GT19QUkVTRU5ULCAmYmF0dGVyeS0+ZmxhZ3MpOwotCWFjcGlfYmF0dGVyeV91cGRhdGUoYmF0dGVyeSk7CisJcmVzdWx0ID0gYWNwaV9iYXR0ZXJ5X3VwZGF0ZShiYXR0ZXJ5KTsKKwlpZiAocmVzdWx0KQorCQlnb3RvIGZhaWw7CiAjaWZkZWYgQ09ORklHX0FDUElfUFJPQ0ZTX1BPV0VSCiAJcmVzdWx0ID0gYWNwaV9iYXR0ZXJ5X2FkZF9mcyhkZXZpY2UpOwogI2VuZGlmCi0JaWYgKCFyZXN1bHQpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIiVzIFNsb3QgWyVzXSAoYmF0dGVyeSAlcylcbiIsCi0JCQlBQ1BJX0JBVFRFUllfREVWSUNFX05BTUUsIGFjcGlfZGV2aWNlX2JpZChkZXZpY2UpLAotCQkJZGV2aWNlLT5zdGF0dXMuYmF0dGVyeV9wcmVzZW50ID8gInByZXNlbnQiIDogImFic2VudCIpOwotCX0gZWxzZSB7CisJaWYgKHJlc3VsdCkgewogI2lmZGVmIENPTkZJR19BQ1BJX1BST0NGU19QT1dFUgogCQlhY3BpX2JhdHRlcnlfcmVtb3ZlX2ZzKGRldmljZSk7CiAjZW5kaWYKLQkJa2ZyZWUoYmF0dGVyeSk7CisJCWdvdG8gZmFpbDsKIAl9CiAKKwlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiJXMgU2xvdCBbJXNdIChiYXR0ZXJ5ICVzKVxuIiwKKwkJQUNQSV9CQVRURVJZX0RFVklDRV9OQU1FLCBhY3BpX2RldmljZV9iaWQoZGV2aWNlKSwKKwkJZGV2aWNlLT5zdGF0dXMuYmF0dGVyeV9wcmVzZW50ID8gInByZXNlbnQiIDogImFic2VudCIpOworCiAJYmF0dGVyeS0+cG1fbmIubm90aWZpZXJfY2FsbCA9IGJhdHRlcnlfbm90aWZ5OwogCXJlZ2lzdGVyX3BtX25vdGlmaWVyKCZiYXR0ZXJ5LT5wbV9uYik7CiAKIAlyZXR1cm4gcmVzdWx0OworCitmYWlsOgorCXN5c2ZzX3JlbW92ZV9iYXR0ZXJ5KGJhdHRlcnkpOworCW11dGV4X2Rlc3Ryb3koJmJhdHRlcnktPmxvY2spOworCWtmcmVlKGJhdHRlcnkpOworCXJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXRpYyBpbnQgYWNwaV9iYXR0ZXJ5X3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYnVzLmMgYi9kcml2ZXJzL2FjcGkvYnVzLmMKaW5kZXggZDFlMDZjMS4uNDM3ZGRiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2J1cy5jCisrKyBiL2RyaXZlcnMvYWNwaS9idXMuYwpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgorI2luY2x1ZGUgPGFjcGkvYXBlaS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KIApAQCAtNTE5LDYgKzUyMCw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKGFjcGlfcnVuX29zYyk7CiAKK2Jvb2wgb3NjX3NiX2FwZWlfc3VwcG9ydF9hY2tlZDsKIHN0YXRpYyB1OCBzYl91dWlkX3N0cltdID0gIjA4MTFCMDZFLTRBMjctNDRGOS04RDYwLTNDQkJDMjJFN0I0OCI7CiBzdGF0aWMgdm9pZCBhY3BpX2J1c19vc2Nfc3VwcG9ydCh2b2lkKQogewpAQCAtNTQxLDExICs1NDMsMTkgQEAKICNpZiBkZWZpbmVkKENPTkZJR19BQ1BJX1BST0NFU1NPUikgfHwgZGVmaW5lZChDT05GSUdfQUNQSV9QUk9DRVNTT1JfTU9EVUxFKQogCWNhcGJ1ZltPU0NfU1VQUE9SVF9UWVBFXSB8PSBPU0NfU0JfUFBDX09TVF9TVVBQT1JUOwogI2VuZGlmCisKKwlpZiAoIWdoZXNfZGlzYWJsZSkKKwkJY2FwYnVmW09TQ19TVVBQT1JUX1RZUEVdIHw9IE9TQ19TQl9BUEVJX1NVUFBPUlQ7CiAJaWYgKEFDUElfRkFJTFVSRShhY3BpX2dldF9oYW5kbGUoTlVMTCwgIlxcX1NCIiwgJmhhbmRsZSkpKQogCQlyZXR1cm47Ci0JaWYgKEFDUElfU1VDQ0VTUyhhY3BpX3J1bl9vc2MoaGFuZGxlLCAmY29udGV4dCkpKQorCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9ydW5fb3NjKGhhbmRsZSwgJmNvbnRleHQpKSkgeworCQl1MzIgKmNhcGJ1Zl9yZXQgPSBjb250ZXh0LnJldC5wb2ludGVyOworCQlpZiAoY29udGV4dC5yZXQubGVuZ3RoID4gT1NDX1NVUFBPUlRfVFlQRSkKKwkJCW9zY19zYl9hcGVpX3N1cHBvcnRfYWNrZWQgPQorCQkJCWNhcGJ1Zl9yZXRbT1NDX1NVUFBPUlRfVFlQRV0gJiBPU0NfU0JfQVBFSV9TVVBQT1JUOwogCQlrZnJlZShjb250ZXh0LnJldC5wb2ludGVyKTsKLQkvKiBkbyB3ZSBuZWVkIHRvIGNoZWNrIHRoZSByZXR1cm5lZCBjYXA/IFNvdW5kcyBubyAqLworCX0KKwkvKiBkbyB3ZSBuZWVkIHRvIGNoZWNrIG90aGVyIHJldHVybmVkIGNhcD8gU291bmRzIG5vICovCiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZG9jay5jIGIvZHJpdmVycy9hY3BpL2RvY2suYwppbmRleCAxODY0YWQzLi4xOWE2MTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZG9jay5jCisrKyBiL2RyaXZlcnMvYWNwaS9kb2NrLmMKQEAgLTc3LDcgKzc3LDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJc3RydWN0IGxpc3RfaGVhZCBob3RwbHVnX2xpc3Q7CiAJYWNwaV9oYW5kbGUgaGFuZGxlOwotCXN0cnVjdCBhY3BpX2RvY2tfb3BzICpvcHM7CisJY29uc3Qgc3RydWN0IGFjcGlfZG9ja19vcHMgKm9wczsKIAl2b2lkICpjb250ZXh0OwogfTsKIApAQCAtNTg5LDcgKzU4OSw3IEBACiAgKiB0aGUgZG9jayBkcml2ZXIgYWZ0ZXIgX0RDSyBpcyBleGVjdXRlZC4KICAqLwogaW50Ci1yZWdpc3Rlcl9ob3RwbHVnX2RvY2tfZGV2aWNlKGFjcGlfaGFuZGxlIGhhbmRsZSwgc3RydWN0IGFjcGlfZG9ja19vcHMgKm9wcywKK3JlZ2lzdGVyX2hvdHBsdWdfZG9ja19kZXZpY2UoYWNwaV9oYW5kbGUgaGFuZGxlLCBjb25zdCBzdHJ1Y3QgYWNwaV9kb2NrX29wcyAqb3BzLAogCQkJICAgICB2b2lkICpjb250ZXh0KQogewogCXN0cnVjdCBkb2NrX2RlcGVuZGVudF9kZXZpY2UgKmRkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2VjX3N5cy5jIGIvZHJpdmVycy9hY3BpL2VjX3N5cy5jCmluZGV4IDA1YjQ0MjAuLjIyZjkxOGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9lY19zeXMuYworKysgYi9kcml2ZXJzL2FjcGkvZWNfc3lzLmMKQEAgLTkyLDcgKzkyLDcgQEAKIAlyZXR1cm4gY291bnQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFjcGlfZWNfaW9fb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWNwaV9lY19pb19vcHMgPSB7CiAJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJLm9wZW4gID0gYWNwaV9lY19vcGVuX2lvLAogCS5yZWFkICA9IGFjcGlfZWNfcmVhZF9pbywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9mYW4uYyBiL2RyaXZlcnMvYWNwaS9mYW4uYwppbmRleCA0Njc0NzlmLi4wZjAzNTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZmFuLmMKKysrIGIvZHJpdmVycy9hY3BpL2Zhbi5jCkBAIC0xMTAsNyArMTEwLDcgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2Vfb3BzIGZhbl9jb29saW5nX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZV9vcHMgZmFuX2Nvb2xpbmdfb3BzID0gewogCS5nZXRfbWF4X3N0YXRlID0gZmFuX2dldF9tYXhfc3RhdGUsCiAJLmdldF9jdXJfc3RhdGUgPSBmYW5fZ2V0X2N1cl9zdGF0ZSwKIAkuc2V0X2N1cl9zdGF0ZSA9IGZhbl9zZXRfY3VyX3N0YXRlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL29zbC5jIGIvZHJpdmVycy9hY3BpL29zbC5jCmluZGV4IDM3MmY5YjcuLmZhMzJmNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9vc2wuYworKysgYi9kcml2ZXJzL2FjcGkvb3NsLmMKQEAgLTE1NSw3ICsxNTUsNyBAQAogewogCWlmICghc3RyY21wKCJMaW51eCIsIGludGVyZmFjZSkpIHsKIAotCQlwcmludGsoS0VSTl9OT1RJQ0UgRldfQlVHIFBSRUZJWAorCQlwcmludGtfb25jZShLRVJOX05PVElDRSBGV19CVUcgUFJFRklYCiAJCQkiQklPUyBfT1NJKExpbnV4KSBxdWVyeSAlcyVzXG4iLAogCQkJb3NpX2xpbnV4LmVuYWJsZSA/ICJob25vcmVkIiA6ICJpZ25vcmVkIiwKIAkJCW9zaV9saW51eC5jbWRsaW5lID8gIiB2aWEgY21kbGluZSIgOgpAQCAtMjM3LDggKzIzNywyMyBAQAogI2VuZGlmCiB9CiAKKyNpZmRlZiBDT05GSUdfS0VYRUMKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGFjcGlfcnNkcDsKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX2FjcGlfcnNkcChjaGFyICphcmcpCit7CisJYWNwaV9yc2RwID0gc2ltcGxlX3N0cnRvdWwoYXJnLCBOVUxMLCAxNik7CisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgiYWNwaV9yc2RwIiwgc2V0dXBfYWNwaV9yc2RwKTsKKyNlbmRpZgorCiBhY3BpX3BoeXNpY2FsX2FkZHJlc3MgX19pbml0IGFjcGlfb3NfZ2V0X3Jvb3RfcG9pbnRlcih2b2lkKQogeworI2lmZGVmIENPTkZJR19LRVhFQworCWlmIChhY3BpX3JzZHApCisJCXJldHVybiBhY3BpX3JzZHA7CisjZW5kaWYKKwogCWlmIChlZmlfZW5hYmxlZCkgewogCQlpZiAoZWZpLmFjcGkyMCAhPSBFRklfSU5WQUxJRF9UQUJMRV9BRERSKQogCQkJcmV0dXJuIGVmaS5hY3BpMjA7CkBAIC0xMDgzLDcgKzEwOTgsMTMgQEAKIAlib29sIGVuYWJsZTsKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb3NpX3NldHVwX2VudHJ5IF9faW5pdGRhdGEgb3NpX3NldHVwX2VudHJpZXNbT1NJX1NUUklOR19FTlRSSUVTX01BWF07CitzdGF0aWMgc3RydWN0IG9zaV9zZXR1cF9lbnRyeSBfX2luaXRkYXRhCisJCW9zaV9zZXR1cF9lbnRyaWVzW09TSV9TVFJJTkdfRU5UUklFU19NQVhdID0geworCXsiTW9kdWxlIERldmljZSIsIHRydWV9LAorCXsiUHJvY2Vzc29yIERldmljZSIsIHRydWV9LAorCXsiMy4wIF9TQ1AgRXh0ZW5zaW9ucyIsIHRydWV9LAorCXsiUHJvY2Vzc29yIEFnZ3JlZ2F0b3IgRGV2aWNlIiwgdHJ1ZX0sCit9OwogCiB2b2lkIF9faW5pdCBhY3BpX29zaV9zZXR1cChjaGFyICpzdHIpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGNpX2lycS5jIGIvZHJpdmVycy9hY3BpL3BjaV9pcnEuYwppbmRleCBmOTA3Y2ZiLi43ZjllYmE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGNpX2lycS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wY2lfaXJxLmMKQEAgLTMwMyw2ICszMDMsNjEgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFBDSSBJbnRlcnJ1cHQgUm91dGluZyBTdXBwb3J0CiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQworZXh0ZXJuIGludCBub2lvYXBpY3F1aXJrOworZXh0ZXJuIGludCBub2lvYXBpY3Jlcm91dGU7CisKK3N0YXRpYyBpbnQgYnJpZGdlX2hhc19ib290X2ludGVycnVwdF92YXJpYW50KHN0cnVjdCBwY2lfYnVzICpidXMpCit7CisJc3RydWN0IHBjaV9idXMgKmJ1c19pdDsKKworCWZvciAoYnVzX2l0ID0gYnVzIDsgYnVzX2l0IDsgYnVzX2l0ID0gYnVzX2l0LT5wYXJlbnQpIHsKKwkJaWYgKCFidXNfaXQtPnNlbGYpCisJCQlyZXR1cm4gMDsKKwkJaWYgKGJ1c19pdC0+c2VsZi0+aXJxX3Jlcm91dGVfdmFyaWFudCkKKwkJCXJldHVybiBidXNfaXQtPnNlbGYtPmlycV9yZXJvdXRlX3ZhcmlhbnQ7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogU29tZSBjaGlwc2V0cyAoZS5nLiBJbnRlbCA2NzAwUFhIKSBnZW5lcmF0ZSBhIGxlZ2FjeSBJTlR4IHdoZW4gdGhlIElSUQorICogZW50cnkgaW4gdGhlIGNoaXBzZXQncyBJTy1BUElDIGlzIG1hc2tlZCAoYXMsIGUuZy4gdGhlIFJUIGtlcm5lbCBkb2VzCisgKiBkdXJpbmcgaW50ZXJydXB0IGhhbmRsaW5nKS4gV2hlbiB0aGlzIElOVHggZ2VuZXJhdGlvbiBjYW5ub3QgYmUgZGlzYWJsZWQsCisgKiB3ZSByZXJvdXRlIHRoZXNlIGludGVycnVwdHMgdG8gdGhlaXIgbGVnYWN5IGVxdWl2YWxlbnQgdG8gZ2V0IHJpZCBvZgorICogc3B1cmlvdXMgaW50ZXJydXB0cy4KKyAqLworc3RhdGljIGludCBhY3BpX3Jlcm91dGVfYm9vdF9pbnRlcnJ1cHQoc3RydWN0IHBjaV9kZXYgKmRldiwKKwkJCQkgICAgICAgc3RydWN0IGFjcGlfcHJ0X2VudHJ5ICplbnRyeSkKK3sKKwlpZiAobm9pb2FwaWNxdWlyayB8fCBub2lvYXBpY3Jlcm91dGUpIHsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJc3dpdGNoIChicmlkZ2VfaGFzX2Jvb3RfaW50ZXJydXB0X3ZhcmlhbnQoZGV2LT5idXMpKSB7CisJCWNhc2UgMDoKKwkJCS8qIG5vIHJlcm91dGluZyBuZWNlc3NhcnkgKi8KKwkJCXJldHVybiAwOworCQljYXNlIElOVEVMX0lSUV9SRVJPVVRFX1ZBUklBTlQ6CisJCQkvKgorCQkJICogUmVtYXAgYWNjb3JkaW5nIHRvIElOVHggcm91dGluZyB0YWJsZSBpbiA2NzAwUFhICisJCQkgKiBzcGVjcywgaW50ZWwgb3JkZXIgbnVtYmVyIDMwMjYyOC0wMDIsIHNlY3Rpb24KKwkJCSAqIDIuMTUuMi4gT3RoZXIgY2hpcHNldHMgKDgwMzMyLCAuLi4pIGhhdmUgdGhlIHNhbWUKKwkJCSAqIG1hcHBpbmcgYW5kIGFyZSBoYW5kbGVkIGhlcmUgYXMgd2VsbC4KKwkJCSAqLworCQkJZGV2X2luZm8oJmRldi0+ZGV2LCAiUENJIElSUSAlZCAtPiByZXJvdXRlZCB0byBsZWdhY3kgIgorCQkJCSAiSVJRICVkXG4iLCBlbnRyeS0+aW5kZXgsCisJCQkJIChlbnRyeS0+aW5kZXggJSA0KSArIDE2KTsKKwkJCWVudHJ5LT5pbmRleCA9IChlbnRyeS0+aW5kZXggJSA0KSArIDE2OworCQkJcmV0dXJuIDE7CisJCWRlZmF1bHQ6CisJCQlkZXZfd2FybigmZGV2LT5kZXYsICJDYW5ub3QgcmVyb3V0ZSBJUlEgJWQgdG8gbGVnYWN5ICIKKwkJCQkgIklSUTogdW5rbm93biBtYXBwaW5nXG4iLCBlbnRyeS0+aW5kZXgpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorfQorI2VuZGlmIC8qIENPTkZJR19YODZfSU9fQVBJQyAqLworCiBzdGF0aWMgc3RydWN0IGFjcGlfcHJ0X2VudHJ5ICphY3BpX3BjaV9pcnFfbG9va3VwKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBwaW4pCiB7CiAJc3RydWN0IGFjcGlfcHJ0X2VudHJ5ICplbnRyeTsKQEAgLTMxMSw2ICszNjYsOSBAQAogCiAJZW50cnkgPSBhY3BpX3BjaV9pcnFfZmluZF9wcnRfZW50cnkoZGV2LCBwaW4pOwogCWlmIChlbnRyeSkgeworI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQworCQlhY3BpX3Jlcm91dGVfYm9vdF9pbnRlcnJ1cHQoZGV2LCBlbnRyeSk7CisjZW5kaWYgLyogQ09ORklHX1g4Nl9JT19BUElDICovCiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkZvdW5kICVzWyVjXSBfUFJUIGVudHJ5XG4iLAogCQkJCSAgcGNpX25hbWUoZGV2KSwgcGluX25hbWUocGluKSkpOwogCQlyZXR1cm4gZW50cnk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGNpX3Jvb3QuYyBiL2RyaXZlcnMvYWNwaS9wY2lfcm9vdC5jCmluZGV4IGQwNjA3OGQuLjI2NzJjNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wY2lfcm9vdC5jCisrKyBiL2RyaXZlcnMvYWNwaS9wY2lfcm9vdC5jCkBAIC00ODUsNyArNDg1LDggQEAKIAkJcm9vdC0+c2Vjb25kYXJ5LmVuZCA9IDB4RkY7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgRldfQlVHIFBSRUZJWAogCQkgICAgICAgIm5vIHNlY29uZGFyeSBidXMgcmFuZ2UgaW4gX0NSU1xuIik7Ci0JCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfaW50ZWdlcihkZXZpY2UtPmhhbmRsZSwgTUVUSE9EX05BTUVfX0JCTiwJCQkJCSAgICAgICBOVUxMLCAmYnVzKTsKKwkJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGRldmljZS0+aGFuZGxlLCBNRVRIT0RfTkFNRV9fQkJOLAorCQkJCQkgICAgICAgTlVMTCwgJmJ1cyk7CiAJCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkKIAkJCXJvb3QtPnNlY29uZGFyeS5zdGFydCA9IGJ1czsKIAkJZWxzZSBpZiAoc3RhdHVzID09IEFFX05PVF9GT1VORCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhlcm1hbC5jIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl90aGVybWFsLmMKaW5kZXggNzljYjY1My4uODcwNTUwZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl90aGVybWFsLmMKKysrIGIvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl90aGVybWFsLmMKQEAgLTI0NCw3ICsyNDQsNyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlX29wcyBwcm9jZXNzb3JfY29vbGluZ19vcHMgPSB7Citjb25zdCBzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZV9vcHMgcHJvY2Vzc29yX2Nvb2xpbmdfb3BzID0gewogCS5nZXRfbWF4X3N0YXRlID0gcHJvY2Vzc29yX2dldF9tYXhfc3RhdGUsCiAJLmdldF9jdXJfc3RhdGUgPSBwcm9jZXNzb3JfZ2V0X2N1cl9zdGF0ZSwKIAkuc2V0X2N1cl9zdGF0ZSA9IHByb2Nlc3Nvcl9zZXRfY3VyX3N0YXRlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Nicy5jIGIvZHJpdmVycy9hY3BpL3Nicy5jCmluZGV4IDUwNjU4ZmYuLjZlMzZkMGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zYnMuYworKysgYi9kcml2ZXJzL2FjcGkvc2JzLmMKQEAgLTEzMCw2ICsxMzAsOSBAQAogCiAjZGVmaW5lIHRvX2FjcGlfc2JzKHgpIGNvbnRhaW5lcl9vZih4LCBzdHJ1Y3QgYWNwaV9zYnMsIGNoYXJnZXIpCiAKK3N0YXRpYyBpbnQgYWNwaV9zYnNfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7CitzdGF0aWMgaW50IGFjcGlfYmF0dGVyeV9nZXRfc3RhdGUoc3RydWN0IGFjcGlfYmF0dGVyeSAqYmF0dGVyeSk7CisKIHN0YXRpYyBpbmxpbmUgaW50IGJhdHRlcnlfc2NhbGUoaW50IGxvZykKIHsKIAlpbnQgc2NhbGUgPSAxOwpAQCAtMTk1LDYgKzE5OCw4IEBACiAKIAlpZiAoKCFiYXR0ZXJ5LT5wcmVzZW50KSAmJiBwc3AgIT0gUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVCkKIAkJcmV0dXJuIC1FTk9ERVY7CisKKwlhY3BpX2JhdHRlcnlfZ2V0X3N0YXRlKGJhdHRlcnkpOwogCXN3aXRjaCAocHNwKSB7CiAJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9TVEFUVVM6CiAJCWlmIChiYXR0ZXJ5LT5yYXRlX25vdyA8IDApCkBAIC0yMjUsMTEgKzIzMCwxNyBAQAogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUE9XRVJfTk9XOgogCQl2YWwtPmludHZhbCA9IGFicyhiYXR0ZXJ5LT5yYXRlX25vdykgKgogCQkJCWFjcGlfYmF0dGVyeV9pcHNjYWxlKGJhdHRlcnkpICogMTAwMDsKKwkJdmFsLT5pbnR2YWwgKj0gKGFjcGlfYmF0dGVyeV9tb2RlKGJhdHRlcnkpKSA/CisJCQkJKGJhdHRlcnktPnZvbHRhZ2Vfbm93ICoKKwkJCQlhY3BpX2JhdHRlcnlfdnNjYWxlKGJhdHRlcnkpIC8gMTAwMCkgOiAxOwogCQlicmVhazsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfQVZHOgogCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUE9XRVJfQVZHOgogCQl2YWwtPmludHZhbCA9IGFicyhiYXR0ZXJ5LT5yYXRlX2F2ZykgKgogCQkJCWFjcGlfYmF0dGVyeV9pcHNjYWxlKGJhdHRlcnkpICogMTAwMDsKKwkJdmFsLT5pbnR2YWwgKj0gKGFjcGlfYmF0dGVyeV9tb2RlKGJhdHRlcnkpKSA/CisJCQkJKGJhdHRlcnktPnZvbHRhZ2Vfbm93ICoKKwkJCQlhY3BpX2JhdHRlcnlfdnNjYWxlKGJhdHRlcnkpIC8gMTAwMCkgOiAxOwogCQlicmVhazsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZOgogCQl2YWwtPmludHZhbCA9IGJhdHRlcnktPnN0YXRlX29mX2NoYXJnZTsKQEAgLTkwMyw4ICs5MTQsNiBAQAogCX0KIH0KIAotc3RhdGljIGludCBhY3BpX3Nic19yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKLQogc3RhdGljIGludCBhY3BpX3Nic19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IGFjcGlfc2JzICpzYnM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc2xlZXAuYyBiL2RyaXZlcnMvYWNwaS9zbGVlcC5jCmluZGV4IDZjOTQ5NjAuLjNlZDgwYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zbGVlcC5jCisrKyBiL2RyaXZlcnMvYWNwaS9zbGVlcC5jCkBAIC00MjgsNiArNDI4LDIyIEBACiAJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiMTAwMCBTZXJpZXMiKSwKIAkJfSwKIAl9LAorCXsKKwkuY2FsbGJhY2sgPSBpbml0X29sZF9zdXNwZW5kX29yZGVyaW5nLAorCS5pZGVudCA9ICJBc3VzIEE4Ti1TTEkgREVMVVhFIiwKKwkubWF0Y2hlcyA9IHsKKwkJRE1JX01BVENIKERNSV9CT0FSRF9WRU5ET1IsICJBU1VTVGVLIENvbXB1dGVyIElOQy4iKSwKKwkJRE1JX01BVENIKERNSV9CT0FSRF9OQU1FLCAiQThOLVNMSSBERUxVWEUiKSwKKwkJfSwKKwl9LAorCXsKKwkuY2FsbGJhY2sgPSBpbml0X29sZF9zdXNwZW5kX29yZGVyaW5nLAorCS5pZGVudCA9ICJBc3VzIEE4Ti1TTEkgUHJlbWl1bSIsCisJLm1hdGNoZXMgPSB7CisJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQVNVU1RlSyBDb21wdXRlciBJTkMuIiksCisJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIkE4Ti1TTEkgUHJlbWl1bSIpLAorCQl9LAorCX0sCiAJe30sCiB9OwogI2VuZGlmIC8qIENPTkZJR19TVVNQRU5EICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvc3lzZnMuYyBiL2RyaXZlcnMvYWNwaS9zeXNmcy5jCmluZGV4IDc3MjU1ZjIuLmM1MzhkMGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zeXNmcy5jCisrKyBiL2RyaXZlcnMvYWNwaS9zeXNmcy5jCkBAIC0xNDksMTIgKzE0OSwxMiBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qga2VybmVsX3BhcmFtX29wcyBwYXJhbV9vcHNfZGVidWdfbGF5ZXIgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGtlcm5lbF9wYXJhbV9vcHMgcGFyYW1fb3BzX2RlYnVnX2xheWVyID0gewogCS5zZXQgPSBwYXJhbV9zZXRfdWludCwKIAkuZ2V0ID0gcGFyYW1fZ2V0X2RlYnVnX2xheWVyLAogfTsKIAotc3RhdGljIHN0cnVjdCBrZXJuZWxfcGFyYW1fb3BzIHBhcmFtX29wc19kZWJ1Z19sZXZlbCA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qga2VybmVsX3BhcmFtX29wcyBwYXJhbV9vcHNfZGVidWdfbGV2ZWwgPSB7CiAJLnNldCA9IHBhcmFtX3NldF91aW50LAogCS5nZXQgPSBwYXJhbV9nZXRfZGVidWdfbGV2ZWwsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RoZXJtYWwuYyBiL2RyaXZlcnMvYWNwaS90aGVybWFsLmMKaW5kZXggMjYwN2UxNy4uNDhmYmM2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3RoZXJtYWwuYworKysgYi9kcml2ZXJzL2FjcGkvdGhlcm1hbC5jCkBAIC04MTIsNyArODEyLDcgQEAKIAkJCQl0aGVybWFsX3pvbmVfdW5iaW5kX2Nvb2xpbmdfZGV2aWNlKTsKIH0KIAotc3RhdGljIHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlX29wcyBhY3BpX3RoZXJtYWxfem9uZV9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2Vfb3BzIGFjcGlfdGhlcm1hbF96b25lX29wcyA9IHsKIAkuYmluZCA9IGFjcGlfdGhlcm1hbF9iaW5kX2Nvb2xpbmdfZGV2aWNlLAogCS51bmJpbmQJPSBhY3BpX3RoZXJtYWxfdW5iaW5kX2Nvb2xpbmdfZGV2aWNlLAogCS5nZXRfdGVtcCA9IHRoZXJtYWxfZ2V0X3RlbXAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdmlkZW8uYyBiL2RyaXZlcnMvYWNwaS92aWRlby5jCmluZGV4IGFkYTRiNGQuLjA4YTQ0YjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS92aWRlby5jCisrKyBiL2RyaXZlcnMvYWNwaS92aWRlby5jCkBAIC0zMDcsNyArMzA3LDcgQEAKIAlyZXR1cm4gYWNwaV92aWRlb19kZXZpY2VfbGNkX3NldF9sZXZlbCh2aWRlbywgbGV2ZWwpOwogfQogCi1zdGF0aWMgc3RydWN0IHRoZXJtYWxfY29vbGluZ19kZXZpY2Vfb3BzIHZpZGVvX2Nvb2xpbmdfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlX29wcyB2aWRlb19jb29saW5nX29wcyA9IHsKIAkuZ2V0X21heF9zdGF0ZSA9IHZpZGVvX2dldF9tYXhfc3RhdGUsCiAJLmdldF9jdXJfc3RhdGUgPSB2aWRlb19nZXRfY3VyX3N0YXRlLAogCS5zZXRfY3VyX3N0YXRlID0gdmlkZW9fc2V0X2N1cl9zdGF0ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1hY3BpLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtYWNwaS5jCmluZGV4IGUwYTViNTUuLmJiN2M1ZjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1hY3BpLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLWFjcGkuYwpAQCAtMjE4LDEyICsyMTgsMTIgQEAKIAlhdGFfYWNwaV91ZXZlbnQoZGV2LT5saW5rLT5hcCwgZGV2LCBldmVudCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYWNwaV9kb2NrX29wcyBhdGFfYWNwaV9kZXZfZG9ja19vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZG9ja19vcHMgYXRhX2FjcGlfZGV2X2RvY2tfb3BzID0gewogCS5oYW5kbGVyID0gYXRhX2FjcGlfZGV2X25vdGlmeV9kb2NrLAogCS51ZXZlbnQgPSBhdGFfYWNwaV9kZXZfdWV2ZW50LAogfTsKIAotc3RhdGljIHN0cnVjdCBhY3BpX2RvY2tfb3BzIGF0YV9hY3BpX2FwX2RvY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RvY2tfb3BzIGF0YV9hY3BpX2FwX2RvY2tfb3BzID0gewogCS5oYW5kbGVyID0gYXRhX2FjcGlfYXBfbm90aWZ5X2RvY2ssCiAJLnVldmVudCA9IGF0YV9hY3BpX2FwX3VldmVudCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvZGV2dG1wZnMuYyBiL2RyaXZlcnMvYmFzZS9kZXZ0bXBmcy5jCmluZGV4IGI4OWZmZmMuLjMzZTFiZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmFzZS9kZXZ0bXBmcy5jCisrKyBiL2RyaXZlcnMvYmFzZS9kZXZ0bXBmcy5jCkBAIC0xNjYsNyArMTY2LDcgQEAKIHsKIAljaGFyICpwYXRoOwogCWNoYXIgKnM7Ci0JaW50IGVycjsKKwlpbnQgZXJyID0gMDsKIAogCS8qIHBhcmVudCBkaXJlY3RvcmllcyBkbyBub3QgZXhpc3QsIGNyZWF0ZSB0aGVtICovCiAJcGF0aCA9IGtzdHJkdXAobm9kZXBhdGgsIEdGUF9LRVJORUwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL0tjb25maWcgYi9kcml2ZXJzL2NoYXIvS2NvbmZpZwppbmRleCA0OTUwMmJjLi40MjNmZDU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvS2NvbmZpZworKysgYi9kcml2ZXJzL2NoYXIvS2NvbmZpZwpAQCAtNjE2LDUgKzYxNiwxNiBAQAogCSAgRW5hYmxlcyB1c2Vyc3BhY2UgY2xpZW50cyB0byByZWFkIGFuZCB3cml0ZSB0byBzb21lIHBhY2tldCBTTUQKIAkgIHBvcnRzIHZpYSBkZXZpY2UgaW50ZXJmYWNlIGZvciBNU00gY2hpcHNldC4KIAorY29uZmlnIFRJTEVfU1JPTQorCWJvb2wgIkNoYXJhY3Rlci1kZXZpY2UgYWNjZXNzIHZpYSBoeXBlcnZpc29yIHRvIHRoZSBUaWxlcmEgU1BJIFJPTSIKKwlkZXBlbmRzIG9uIFRJTEUKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICBUaGlzIGRldmljZSBwcm92aWRlcyBjaGFyYWN0ZXItbGV2ZWwgcmVhZC13cml0ZSBhY2Nlc3MKKwkgIHRvIHRoZSBTUk9NLCB0eXBpY2FsbHkgdmlhIHRoZSAiMCIsICIxIiwgYW5kICIyIiBkZXZpY2VzCisJICBpbiAvZGV2L3Nyb20vLiAgVGhlIFRpbGVyYSBoeXBlcnZpc29yIG1ha2VzIHRoZSBmbGFzaAorCSAgZGV2aWNlIGFwcGVhciBtdWNoIGxpa2UgYSBzaW1wbGUgRUVQUk9NLCBhbmQga25vd3MKKwkgIGhvdyB0byBwYXJ0aXRpb24gYSBzaW5nbGUgUk9NIGZvciBtdWx0aXBsZSBwdXJwb3Nlcy4KKwogZW5kbWVudQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvTWFrZWZpbGUgYi9kcml2ZXJzL2NoYXIvTWFrZWZpbGUKaW5kZXggN2EwMDY3Mi4uMzI3NjJiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY2hhci9NYWtlZmlsZQpAQCAtNjMsMyArNjMsNSBAQAogCiBvYmotJChDT05GSUdfSlNfUlRDKQkJKz0ganMtcnRjLm8KIGpzLXJ0Yy15ID0gcnRjLm8KKworb2JqLSQoQ09ORklHX1RJTEVfU1JPTSkJCSs9IHRpbGUtc3JvbS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmFtb29wcy5jIGIvZHJpdmVycy9jaGFyL3JhbW9vcHMuYwppbmRleCBiZDliOTRiLi44MTBhZmY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvcmFtb29wcy5jCisrKyBiL2RyaXZlcnMvY2hhci9yYW1vb3BzLmMKQEAgLTIyLDYgKzIyLDcgQEAKICNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ttc2dfZHVtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KQEAgLTE0Niw2ICsxNDcsMTQgQEAKIAljeHQtPnBoeXNfYWRkciA9IHBkYXRhLT5tZW1fYWRkcmVzczsKIAljeHQtPnJlY29yZF9zaXplID0gcGRhdGEtPnJlY29yZF9zaXplOwogCWN4dC0+ZHVtcF9vb3BzID0gcGRhdGEtPmR1bXBfb29wczsKKwkvKgorCSAqIFVwZGF0ZSB0aGUgbW9kdWxlIHBhcmFtZXRlciB2YXJpYWJsZXMgYXMgd2VsbCBzbyB0aGV5IGFyZSB2aXNpYmxlCisJICogdGhyb3VnaCAvc3lzL21vZHVsZS9yYW1vb3BzL3BhcmFtZXRlcnMvCisJICovCisJbWVtX3NpemUgPSBwZGF0YS0+bWVtX3NpemU7CisJbWVtX2FkZHJlc3MgPSBwZGF0YS0+bWVtX2FkZHJlc3M7CisJcmVjb3JkX3NpemUgPSBwZGF0YS0+cmVjb3JkX3NpemU7CisJZHVtcF9vb3BzID0gcGRhdGEtPmR1bXBfb29wczsKIAogCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKGN4dC0+cGh5c19hZGRyLCBjeHQtPnNpemUsICJyYW1vb3BzIikpIHsKIAkJcHJfZXJyKCJyZXF1ZXN0IG1lbSByZWdpb24gZmFpbGVkXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90aWxlLXNyb20uYyBiL2RyaXZlcnMvY2hhci90aWxlLXNyb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjNlZTAwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL3RpbGUtc3JvbS5jCkBAIC0wLDAgKzEsNDgxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTEgVGlsZXJhIENvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSwgR09PRCBUSVRMRSBvcgorICogICBOT04gSU5GUklOR0VNRU5ULiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqICAgbW9yZSBkZXRhaWxzLgorICoKKyAqIFNQSSBGbGFzaCBST00gZHJpdmVyCisgKgorICogVGhpcyBzb3VyY2UgY29kZSBpcyBkZXJpdmVkIGZyb20gY29kZSBwcm92aWRlZCBpbiAiTGludXggRGV2aWNlCisgKiBEcml2ZXJzLCBUaGlyZCBFZGl0aW9uIiwgYnkgSm9uYXRoYW4gQ29yYmV0LCBBbGVzc2FuZHJvIFJ1YmluaSwgYW5kCisgKiBHcmVnIEtyb2FoLUhhcnRtYW4sIHB1Ymxpc2hlZCBieSBPJ1JlaWxseSBNZWRpYSwgSW5jLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4JLyogcHJpbnRrKCkgKi8KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CQkvKiBrbWFsbG9jKCkgKi8KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgkJLyogZXZlcnl0aGluZy4uLiAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CS8qIGVycm9yIGNvZGVzICovCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4JLyogc2l6ZV90ICovCisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CS8qIE9fQUNDTU9ERSAqLworI2luY2x1ZGUgPGxpbnV4L2Fpby5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9odWdldGxiLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGh2L2h5cGVydmlzb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2NkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGh2L2Rydl9zcm9tX2ludGYuaD4KKworLyoKKyAqIFNpemUgb2Ygb3VyIGh5cGVydmlzb3IgSS9PIHJlcXVlc3RzLiAgV2UgYnJlYWsgdXAgbGFyZ2UgdHJhbnNmZXJzCisgKiBzbyB0aGF0IHdlIGRvbid0IHNwZW5kIGxhcmdlIHVuaW50ZXJydXB0ZWQgc3BhbnMgb2YgdGltZSBpbiB0aGUKKyAqIGh5cGVydmlzb3IuICBFcmFzaW5nIGFuIFNST00gc2VjdG9yIHRha2VzIGEgc2lnbmlmaWNhbnQgZnJhY3Rpb24gb2YKKyAqIGEgc2Vjb25kLCBzbyBpZiB3ZSBhbGxvd2VkIHRoZSB1c2VyIHRvLCBzYXksIGRvIG9uZSBJL08gdG8gd3JpdGUgdGhlCisgKiBlbnRpcmUgUk9NLCB3ZSdkIGdldCBzb2Z0IGxvY2t1cCB0aW1lb3V0cywgb3Igd29yc2UuCisgKi8KKyNkZWZpbmUgU1JPTV9DSFVOS19TSVpFICgoc2l6ZV90KTQwOTYpCisKKy8qCisgKiBXaGVuIGh5cGVydmlzb3IgaXMgYnVzeSAoZS5nLiBlcmFzaW5nKSwgcG9sbCB0aGUgc3RhdHVzIHBlcmlvZGljYWxseS4KKyAqLworCisvKgorICogSW50ZXJ2YWwgdG8gcG9sbCB0aGUgc3RhdGUgaW4gbXNlYworICovCisjZGVmaW5lIFNST01fV0FJVF9UUllfSU5URVJWQUwgMjAKKworLyoKKyAqIE1heGltdW0gdGltZXMgdG8gcG9sbCB0aGUgc3RhdGUKKyAqLworI2RlZmluZSBTUk9NX01BWF9XQUlUX1RSWV9USU1FUyAxMDAwCisKK3N0cnVjdCBzcm9tX2RldiB7CisJaW50IGh2X2RldmhkbDsJCQkvKiBIYW5kbGUgZm9yIGh5cGVydmlzb3IgZGV2aWNlICovCisJdTMyIHRvdGFsX3NpemU7CQkJLyogU2l6ZSBvZiB0aGlzIGRldmljZSAqLworCXUzMiBzZWN0b3Jfc2l6ZTsJCS8qIFNpemUgb2YgYSBzZWN0b3IgKi8KKwl1MzIgcGFnZV9zaXplOwkJCS8qIFNpemUgb2YgYSBwYWdlICovCisJc3RydWN0IG11dGV4IGxvY2s7CQkvKiBBbGxvdyBvbmx5IG9uZSBhY2Nlc3NvciBhdCBhIHRpbWUgKi8KK307CisKK3N0YXRpYyBpbnQgc3JvbV9tYWpvcjsJCQkvKiBEeW5hbWljIG1ham9yIGJ5IGRlZmF1bHQgKi8KK21vZHVsZV9wYXJhbShzcm9tX21ham9yLCBpbnQsIDApOworTU9EVUxFX0FVVEhPUigiVGlsZXJhIENvcnBvcmF0aW9uIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgc3JvbV9kZXZzOwkJCS8qIE51bWJlciBvZiBTUk9NIHBhcnRpdGlvbnMgKi8KK3N0YXRpYyBzdHJ1Y3QgY2RldiBzcm9tX2NkZXY7CitzdGF0aWMgc3RydWN0IGNsYXNzICpzcm9tX2NsYXNzOworc3RhdGljIHN0cnVjdCBzcm9tX2RldiAqc3JvbV9kZXZpY2VzOworCisvKgorICogSGFuZGxlIGNhbGxpbmcgdGhlIGh5cGVydmlzb3IgYW5kIG1hbmFnaW5nIEVBR0FJTi9FQlVTWS4KKyAqLworCitzdGF0aWMgc3NpemVfdCBfc3JvbV9yZWFkKGludCBodl9kZXZoZGwsIHZvaWQgKmJ1ZiwKKwkJCSAgbG9mZl90IG9mZiwgc2l6ZV90IGNvdW50KQoreworCWludCByZXR2YWwsIHJldHJpZXMgPSBTUk9NX01BWF9XQUlUX1RSWV9USU1FUzsKKwlmb3IgKDs7KSB7CisJCXJldHZhbCA9IGh2X2Rldl9wcmVhZChodl9kZXZoZGwsIDAsIChIVl9WaXJ0QWRkcilidWYsCisJCQkJICAgICAgY291bnQsIG9mZik7CisJCWlmIChyZXR2YWwgPj0gMCkKKwkJCXJldHVybiByZXR2YWw7CisJCWlmIChyZXR2YWwgPT0gSFZfRUFHQUlOKQorCQkJY29udGludWU7CisJCWlmIChyZXR2YWwgPT0gSFZfRUJVU1kgJiYgLS1yZXRyaWVzID4gMCkgeworCQkJbXNsZWVwKFNST01fV0FJVF9UUllfSU5URVJWQUwpOworCQkJY29udGludWU7CisJCX0KKwkJcHJfZXJyKCJfc3JvbV9yZWFkOiBlcnJvciAlZFxuIiwgcmV0dmFsKTsKKwkJcmV0dXJuIC1FSU87CisJfQorfQorCitzdGF0aWMgc3NpemVfdCBfc3JvbV93cml0ZShpbnQgaHZfZGV2aGRsLCBjb25zdCB2b2lkICpidWYsCisJCQkgICBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJaW50IHJldHZhbCwgcmV0cmllcyA9IFNST01fTUFYX1dBSVRfVFJZX1RJTUVTOworCWZvciAoOzspIHsKKwkJcmV0dmFsID0gaHZfZGV2X3B3cml0ZShodl9kZXZoZGwsIDAsIChIVl9WaXJ0QWRkcilidWYsCisJCQkJICAgICAgIGNvdW50LCBvZmYpOworCQlpZiAocmV0dmFsID49IDApCisJCQlyZXR1cm4gcmV0dmFsOworCQlpZiAocmV0dmFsID09IEhWX0VBR0FJTikKKwkJCWNvbnRpbnVlOworCQlpZiAocmV0dmFsID09IEhWX0VCVVNZICYmIC0tcmV0cmllcyA+IDApIHsKKwkJCW1zbGVlcChTUk9NX1dBSVRfVFJZX0lOVEVSVkFMKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXByX2VycigiX3Nyb21fd3JpdGU6IGVycm9yICVkXG4iLCByZXR2YWwpOworCQlyZXR1cm4gLUVJTzsKKwl9Cit9CisKKy8qKgorICogc3JvbV9vcGVuKCkgLSBEZXZpY2Ugb3BlbiByb3V0aW5lLgorICogQGlub2RlOiBJbm9kZSBmb3IgdGhpcyBkZXZpY2UuCisgKiBAZmlscDogRmlsZSBmb3IgdGhpcyBzcGVjaWZpYyBvcGVuIG9mIHRoZSBkZXZpY2UuCisgKgorICogUmV0dXJucyB6ZXJvLCBvciBhbiBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW50IHNyb21fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlmaWxwLT5wcml2YXRlX2RhdGEgPSAmc3JvbV9kZXZpY2VzW2ltaW5vcihpbm9kZSldOworCXJldHVybiAwOworfQorCisKKy8qKgorICogc3JvbV9yZWxlYXNlKCkgLSBEZXZpY2UgcmVsZWFzZSByb3V0aW5lLgorICogQGlub2RlOiBJbm9kZSBmb3IgdGhpcyBkZXZpY2UuCisgKiBAZmlscDogRmlsZSBmb3IgdGhpcyBzcGVjaWZpYyBvcGVuIG9mIHRoZSBkZXZpY2UuCisgKgorICogUmV0dXJucyB6ZXJvLCBvciBhbiBlcnJvciBjb2RlLgorICovCitzdGF0aWMgaW50IHNyb21fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3Qgc3JvbV9kZXYgKnNyb20gPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJY2hhciBkdW1teTsKKworCS8qIE1ha2Ugc3VyZSB3ZSd2ZSBmbHVzaGVkIGFueXRoaW5nIHdyaXR0ZW4gdG8gdGhlIFJPTS4gKi8KKwltdXRleF9sb2NrKCZzcm9tLT5sb2NrKTsKKwlpZiAoc3JvbS0+aHZfZGV2aGRsID49IDApCisJCV9zcm9tX3dyaXRlKHNyb20tPmh2X2RldmhkbCwgJmR1bW15LCBTUk9NX0ZMVVNIX09GRiwgMSk7CisJbXV0ZXhfdW5sb2NrKCZzcm9tLT5sb2NrKTsKKworCWZpbHAtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqIHNyb21fcmVhZCgpIC0gUmVhZCBkYXRhIGZyb20gdGhlIGRldmljZS4KKyAqIEBmaWxwOiBGaWxlIGZvciB0aGlzIHNwZWNpZmljIG9wZW4gb2YgdGhlIGRldmljZS4KKyAqIEBidWY6IFVzZXIncyBkYXRhIGJ1ZmZlci4KKyAqIEBjb3VudDogTnVtYmVyIG9mIGJ5dGVzIHJlcXVlc3RlZC4KKyAqIEBmX3BvczogRmlsZSBwb3NpdGlvbi4KKyAqCisgKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyByZWFkLCBvciBhbiBlcnJvciBjb2RlLgorICovCitzdGF0aWMgc3NpemVfdCBzcm9tX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICpidWYsCisJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKmZfcG9zKQoreworCWludCByZXR2YWwgPSAwOworCXZvaWQgKmtlcm5idWY7CisJc3RydWN0IHNyb21fZGV2ICpzcm9tID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCisJa2VybmJ1ZiA9IGttYWxsb2MoU1JPTV9DSFVOS19TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWtlcm5idWYpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc3JvbS0+bG9jaykpIHsKKwkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQlrZnJlZShrZXJuYnVmKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwl3aGlsZSAoY291bnQpIHsKKwkJaW50IGh2X3JldHZhbDsKKwkJaW50IGJ5dGVzX3RoaXNfcGFzcyA9IG1pbihjb3VudCwgU1JPTV9DSFVOS19TSVpFKTsKKworCQlodl9yZXR2YWwgPSBfc3JvbV9yZWFkKHNyb20tPmh2X2RldmhkbCwga2VybmJ1ZiwKKwkJCQkgICAgICAgKmZfcG9zLCBieXRlc190aGlzX3Bhc3MpOworCQlpZiAoaHZfcmV0dmFsID4gMCkgeworCQkJaWYgKGNvcHlfdG9fdXNlcihidWYsIGtlcm5idWYsIGh2X3JldHZhbCkgIT0gMCkgeworCQkJCXJldHZhbCA9IC1FRkFVTFQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSBpZiAoaHZfcmV0dmFsIDw9IDApIHsKKwkJCWlmIChyZXR2YWwgPT0gMCkKKwkJCQlyZXR2YWwgPSBodl9yZXR2YWw7CisJCQlicmVhazsKKwkJfQorCisJCXJldHZhbCArPSBodl9yZXR2YWw7CisJCSpmX3BvcyArPSBodl9yZXR2YWw7CisJCWJ1ZiArPSBodl9yZXR2YWw7CisJCWNvdW50IC09IGh2X3JldHZhbDsKKwl9CisKKwltdXRleF91bmxvY2soJnNyb20tPmxvY2spOworCWtmcmVlKGtlcm5idWYpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBzcm9tX3dyaXRlKCkgLSBXcml0ZSBkYXRhIHRvIHRoZSBkZXZpY2UuCisgKiBAZmlscDogRmlsZSBmb3IgdGhpcyBzcGVjaWZpYyBvcGVuIG9mIHRoZSBkZXZpY2UuCisgKiBAYnVmOiBVc2VyJ3MgZGF0YSBidWZmZXIuCisgKiBAY291bnQ6IE51bWJlciBvZiBieXRlcyByZXF1ZXN0ZWQuCisgKiBAZl9wb3M6IEZpbGUgcG9zaXRpb24uCisgKgorICogUmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiwgb3IgYW4gZXJyb3IgY29kZS4KKyAqLworc3RhdGljIHNzaXplX3Qgc3JvbV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKmZfcG9zKQoreworCWludCByZXR2YWwgPSAwOworCXZvaWQgKmtlcm5idWY7CisJc3RydWN0IHNyb21fZGV2ICpzcm9tID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCisJa2VybmJ1ZiA9IGttYWxsb2MoU1JPTV9DSFVOS19TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWtlcm5idWYpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmc3JvbS0+bG9jaykpIHsKKwkJcmV0dmFsID0gLUVSRVNUQVJUU1lTOworCQlrZnJlZShrZXJuYnVmKTsKKwkJcmV0dXJuIHJldHZhbDsKKwl9CisKKwl3aGlsZSAoY291bnQpIHsKKwkJaW50IGh2X3JldHZhbDsKKwkJaW50IGJ5dGVzX3RoaXNfcGFzcyA9IG1pbihjb3VudCwgU1JPTV9DSFVOS19TSVpFKTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoa2VybmJ1ZiwgYnVmLCBieXRlc190aGlzX3Bhc3MpICE9IDApIHsKKwkJCXJldHZhbCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCisJCWh2X3JldHZhbCA9IF9zcm9tX3dyaXRlKHNyb20tPmh2X2RldmhkbCwga2VybmJ1ZiwKKwkJCQkJKmZfcG9zLCBieXRlc190aGlzX3Bhc3MpOworCQlpZiAoaHZfcmV0dmFsIDw9IDApIHsKKwkJCWlmIChyZXR2YWwgPT0gMCkKKwkJCQlyZXR2YWwgPSBodl9yZXR2YWw7CisJCQlicmVhazsKKwkJfQorCisJCXJldHZhbCArPSBodl9yZXR2YWw7CisJCSpmX3BvcyArPSBodl9yZXR2YWw7CisJCWJ1ZiArPSBodl9yZXR2YWw7CisJCWNvdW50IC09IGh2X3JldHZhbDsKKwl9CisKKwltdXRleF91bmxvY2soJnNyb20tPmxvY2spOworCWtmcmVlKGtlcm5idWYpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyogUHJvdmlkZSBvdXIgb3duIGltcGxlbWVudGF0aW9uIHNvIHdlIGNhbiB1c2Ugc3JvbS0+dG90YWxfc2l6ZS4gKi8KK2xvZmZfdCBzcm9tX2xsc2VlayhzdHJ1Y3QgZmlsZSAqZmlscCwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbikKK3sKKwlzdHJ1Y3Qgc3JvbV9kZXYgKnNyb20gPSBmaWxwLT5wcml2YXRlX2RhdGE7CisKKwlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZzcm9tLT5sb2NrKSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKworCXN3aXRjaCAob3JpZ2luKSB7CisJY2FzZSBTRUVLX0VORDoKKwkJb2Zmc2V0ICs9IHNyb20tPnRvdGFsX3NpemU7CisJCWJyZWFrOworCWNhc2UgU0VFS19DVVI6CisJCW9mZnNldCArPSBmaWxwLT5mX3BvczsKKwkJYnJlYWs7CisJfQorCisJaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gc3JvbS0+dG90YWxfc2l6ZSkgeworCQlvZmZzZXQgPSAtRUlOVkFMOworCX0gZWxzZSB7CisJCWZpbHAtPmZfcG9zID0gb2Zmc2V0OworCQlmaWxwLT5mX3ZlcnNpb24gPSAwOworCX0KKworCW11dGV4X3VubG9jaygmc3JvbS0+bG9jayk7CisKKwlyZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgc3NpemVfdCB0b3RhbF9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3Qgc3JvbV9kZXYgKnNyb20gPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgc3JvbS0+dG90YWxfc2l6ZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNlY3Rvcl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IHNyb21fZGV2ICpzcm9tID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHNyb20tPnNlY3Rvcl9zaXplKTsKK30KKworc3RhdGljIHNzaXplX3QgcGFnZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzcm9tX2RldiAqc3JvbSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBzcm9tLT5wYWdlX3NpemUpOworfQorCitzdGF0aWMgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgc3JvbV9kZXZfYXR0cnNbXSA9IHsKKwlfX0FUVFIodG90YWxfc2l6ZSwgU19JUlVHTywgdG90YWxfc2hvdywgTlVMTCksCisJX19BVFRSKHNlY3Rvcl9zaXplLCBTX0lSVUdPLCBzZWN0b3Jfc2hvdywgTlVMTCksCisJX19BVFRSKHBhZ2Vfc2l6ZSwgU19JUlVHTywgcGFnZV9zaG93LCBOVUxMKSwKKwlfX0FUVFJfTlVMTAorfTsKKworc3RhdGljIGNoYXIgKnNyb21fZGV2bm9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsIG1vZGVfdCAqbW9kZSkKK3sKKwkqbW9kZSA9IFNfSVJVR08gfCBTX0lXVVNSOworCXJldHVybiBrYXNwcmludGYoR0ZQX0tFUk5FTCwgInNyb20vJXMiLCBkZXZfbmFtZShkZXYpKTsKK30KKworLyoKKyAqIFRoZSBmb3BzCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNyb21fZm9wcyA9IHsKKwkub3duZXIgPSAgICAgVEhJU19NT0RVTEUsCisJLmxsc2VlayA9ICAgIHNyb21fbGxzZWVrLAorCS5yZWFkID0JICAgICBzcm9tX3JlYWQsCisJLndyaXRlID0gICAgIHNyb21fd3JpdGUsCisJLm9wZW4gPQkgICAgIHNyb21fb3BlbiwKKwkucmVsZWFzZSA9ICAgc3JvbV9yZWxlYXNlLAorfTsKKworLyoqCisgKiBzcm9tX3NldHVwX21pbm9yKCkgLSBJbml0aWFsaXplIHBlci1taW5vciBpbmZvcm1hdGlvbi4KKyAqIEBzcm9tOiBQZXItZGV2aWNlIFNST00gc3RhdGUuCisgKiBAaW5kZXg6IERldmljZSB0byBzZXQgdXAuCisgKi8KK3N0YXRpYyBpbnQgc3JvbV9zZXR1cF9taW5vcihzdHJ1Y3Qgc3JvbV9kZXYgKnNyb20sIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJaW50IGRldmhkbCA9IHNyb20tPmh2X2RldmhkbDsKKworCW11dGV4X2luaXQoJnNyb20tPmxvY2spOworCisJaWYgKF9zcm9tX3JlYWQoZGV2aGRsLCAmc3JvbS0+dG90YWxfc2l6ZSwKKwkJICAgICAgIFNST01fVE9UQUxfU0laRV9PRkYsIHNpemVvZihzcm9tLT50b3RhbF9zaXplKSkgPCAwKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAoX3Nyb21fcmVhZChkZXZoZGwsICZzcm9tLT5zZWN0b3Jfc2l6ZSwKKwkJICAgICAgIFNST01fU0VDVE9SX1NJWkVfT0ZGLCBzaXplb2Yoc3JvbS0+c2VjdG9yX3NpemUpKSA8IDApCisJCXJldHVybiAtRUlPOworCWlmIChfc3JvbV9yZWFkKGRldmhkbCwgJnNyb20tPnBhZ2Vfc2l6ZSwKKwkJICAgICAgIFNST01fUEFHRV9TSVpFX09GRiwgc2l6ZW9mKHNyb20tPnBhZ2Vfc2l6ZSkpIDwgMCkKKwkJcmV0dXJuIC1FSU87CisKKwlkZXYgPSBkZXZpY2VfY3JlYXRlKHNyb21fY2xhc3MsICZwbGF0Zm9ybV9idXMsCisJCQkgICAgTUtERVYoc3JvbV9tYWpvciwgaW5kZXgpLCBzcm9tLCAiJWQiLCBpbmRleCk7CisJcmV0dXJuIElTX0VSUihkZXYpID8gUFRSX0VSUihkZXYpIDogMDsKK30KKworLyoqIHNyb21faW5pdCgpIC0gSW5pdGlhbGl6ZSB0aGUgZHJpdmVyJ3MgbW9kdWxlLiAqLworc3RhdGljIGludCBzcm9tX2luaXQodm9pZCkKK3sKKwlpbnQgcmVzdWx0LCBpOworCWRldl90IGRldiA9IE1LREVWKHNyb21fbWFqb3IsIDApOworCisJLyoKKwkgKiBTdGFydCB3aXRoIGEgcGxhdXNpYmxlIG51bWJlciBvZiBwYXJ0aXRpb25zOyB0aGUga3JlYWxsb2MoKSBjYWxsCisJICogYmVsb3cgd2lsbCB5aWVsZCBhYm91dCBsb2coc3JvbV9kZXZzKSBhZGRpdGlvbmFsIGFsbG9jYXRpb25zLgorCSAqLworCXNyb21fZGV2aWNlcyA9IGt6YWxsb2MoNCAqIHNpemVvZihzdHJ1Y3Qgc3JvbV9kZXYpLCBHRlBfS0VSTkVMKTsKKworCS8qIERpc2NvdmVyIHRoZSBudW1iZXIgb2Ygc3JvbSBwYXJ0aXRpb25zLiAqLworCWZvciAoaSA9IDA7IDsgaSsrKSB7CisJCWludCBkZXZoZGw7CisJCWNoYXIgYnVmWzIwXTsKKwkJc3RydWN0IHNyb21fZGV2ICpuZXdfc3JvbV9kZXZpY2VzID0KKwkJCWtyZWFsbG9jKHNyb21fZGV2aWNlcywgKGkrMSkgKiBzaXplb2Yoc3RydWN0IHNyb21fZGV2KSwKKwkJCQkgR0ZQX0tFUk5FTCB8IF9fR0ZQX1pFUk8pOworCQlpZiAoIW5ld19zcm9tX2RldmljZXMpIHsKKwkJCXJlc3VsdCA9IC1FTk9NRU07CisJCQlnb3RvIGZhaWxfbWVtOworCQl9CisJCXNyb21fZGV2aWNlcyA9IG5ld19zcm9tX2RldmljZXM7CisJCXNwcmludGYoYnVmLCAic3JvbS8wLyVkIiwgaSk7CisJCWRldmhkbCA9IGh2X2Rldl9vcGVuKChIVl9WaXJ0QWRkcilidWYsIDApOworCQlpZiAoZGV2aGRsIDwgMCkgeworCQkJaWYgKGRldmhkbCAhPSBIVl9FTk9ERVYpCisJCQkJcHJfbm90aWNlKCJzcm9tLyVkOiBodl9kZXZfb3BlbiBmYWlsZWQ6ICVkLlxuIiwKKwkJCQkJICBpLCBkZXZoZGwpOworCQkJYnJlYWs7CisJCX0KKwkJc3JvbV9kZXZpY2VzW2ldLmh2X2RldmhkbCA9IGRldmhkbDsKKwl9CisJc3JvbV9kZXZzID0gaTsKKworCS8qIEJhaWwgb3V0IGVhcmx5IGlmIHdlIGhhdmUgbm8gcGFydGl0aW9ucyBhdCBhbGwuICovCisJaWYgKHNyb21fZGV2cyA9PSAwKSB7CisJCXJlc3VsdCA9IC1FTk9ERVY7CisJCWdvdG8gZmFpbF9tZW07CisJfQorCisJLyogUmVnaXN0ZXIgb3VyIG1ham9yLCBhbmQgYWNjZXB0IGEgZHluYW1pYyBudW1iZXIuICovCisJaWYgKHNyb21fbWFqb3IpCisJCXJlc3VsdCA9IHJlZ2lzdGVyX2NocmRldl9yZWdpb24oZGV2LCBzcm9tX2RldnMsICJzcm9tIik7CisJZWxzZSB7CisJCXJlc3VsdCA9IGFsbG9jX2NocmRldl9yZWdpb24oJmRldiwgMCwgc3JvbV9kZXZzLCAic3JvbSIpOworCQlzcm9tX21ham9yID0gTUFKT1IoZGV2KTsKKwl9CisJaWYgKHJlc3VsdCA8IDApCisJCWdvdG8gZmFpbF9tZW07CisKKwkvKiBSZWdpc3RlciBhIGNoYXJhY3RlciBkZXZpY2UuICovCisJY2Rldl9pbml0KCZzcm9tX2NkZXYsICZzcm9tX2ZvcHMpOworCXNyb21fY2Rldi5vd25lciA9IFRISVNfTU9EVUxFOworCXNyb21fY2Rldi5vcHMgPSAmc3JvbV9mb3BzOworCXJlc3VsdCA9IGNkZXZfYWRkKCZzcm9tX2NkZXYsIGRldiwgc3JvbV9kZXZzKTsKKwlpZiAocmVzdWx0IDwgMCkKKwkJZ290byBmYWlsX2NocmRldjsKKworCS8qIENyZWF0ZSBhIHN5c2ZzIGNsYXNzLiAqLworCXNyb21fY2xhc3MgPSBjbGFzc19jcmVhdGUoVEhJU19NT0RVTEUsICJzcm9tIik7CisJaWYgKElTX0VSUihzcm9tX2NsYXNzKSkgeworCQlyZXN1bHQgPSBQVFJfRVJSKHNyb21fY2xhc3MpOworCQlnb3RvIGZhaWxfY2RldjsKKwl9CisJc3JvbV9jbGFzcy0+ZGV2X2F0dHJzID0gc3JvbV9kZXZfYXR0cnM7CisJc3JvbV9jbGFzcy0+ZGV2bm9kZSA9IHNyb21fZGV2bm9kZTsKKworCS8qIERvIHBlci1wYXJ0aXRpb24gaW5pdGlhbGl6YXRpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgc3JvbV9kZXZzOyBpKyspIHsKKwkJcmVzdWx0ID0gc3JvbV9zZXR1cF9taW5vcihzcm9tX2RldmljZXMgKyBpLCBpKTsKKwkJaWYgKHJlc3VsdCA8IDApCisJCQlnb3RvIGZhaWxfY2xhc3M7CisJfQorCisJcmV0dXJuIDA7CisKK2ZhaWxfY2xhc3M6CisJZm9yIChpID0gMDsgaSA8IHNyb21fZGV2czsgaSsrKQorCQlkZXZpY2VfZGVzdHJveShzcm9tX2NsYXNzLCBNS0RFVihzcm9tX21ham9yLCBpKSk7CisJY2xhc3NfZGVzdHJveShzcm9tX2NsYXNzKTsKK2ZhaWxfY2RldjoKKwljZGV2X2RlbCgmc3JvbV9jZGV2KTsKK2ZhaWxfY2hyZGV2OgorCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihkZXYsIHNyb21fZGV2cyk7CitmYWlsX21lbToKKwlrZnJlZShzcm9tX2RldmljZXMpOworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKiBzcm9tX2NsZWFudXAoKSAtIENsZWFuIHVwIHRoZSBkcml2ZXIncyBtb2R1bGUuICovCitzdGF0aWMgdm9pZCBzcm9tX2NsZWFudXAodm9pZCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgc3JvbV9kZXZzOyBpKyspCisJCWRldmljZV9kZXN0cm95KHNyb21fY2xhc3MsIE1LREVWKHNyb21fbWFqb3IsIGkpKTsKKwljbGFzc19kZXN0cm95KHNyb21fY2xhc3MpOworCWNkZXZfZGVsKCZzcm9tX2NkZXYpOworCXVucmVnaXN0ZXJfY2hyZGV2X3JlZ2lvbihNS0RFVihzcm9tX21ham9yLCAwKSwgc3JvbV9kZXZzKTsKKwlrZnJlZShzcm9tX2RldmljZXMpOworfQorCittb2R1bGVfaW5pdChzcm9tX2luaXQpOworbW9kdWxlX2V4aXQoc3JvbV9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci90cG0vdHBtX3Rpcy5jIGIvZHJpdmVycy9jaGFyL3RwbS90cG1fdGlzLmMKaW5kZXggN2ZjMmYxMC4uM2Y0MDUxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3RwbS90cG1fdGlzLmMKKysrIGIvZHJpdmVycy9jaGFyL3RwbS90cG1fdGlzLmMKQEAgLTgwLDcgKzgwLDcgQEAKIHN0YXRpYyBMSVNUX0hFQUQodGlzX2NoaXBzKTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0sodGlzX2xvY2spOwogCi0jaWZkZWYgQ09ORklHX1BOUAorI2lmIGRlZmluZWQoQ09ORklHX1BOUCkgJiYgZGVmaW5lZChDT05GSUdfQUNQSSkKIHN0YXRpYyBpbnQgaXNfaXRwbShzdHJ1Y3QgcG5wX2RldiAqZGV2KQogewogCXN0cnVjdCBhY3BpX2RldmljZSAqYWNwaSA9IHBucF9hY3BpX2RldmljZShkZXYpOwpAQCAtOTMsNiArOTMsMTEgQEAKIAogCXJldHVybiAwOwogfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2l0cG0oc3RydWN0IHBucF9kZXYgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KICNlbmRpZgogCiBzdGF0aWMgaW50IGNoZWNrX2xvY2FsaXR5KHN0cnVjdCB0cG1fY2hpcCAqY2hpcCwgaW50IGwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS5jIGIvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUuYwppbmRleCBiZjUwOTI0Li5kNGM1NDIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS5jCisrKyBiL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLmMKQEAgLTI1LDkgKzI1LDE5IEBACiAKIERFRklORV9NVVRFWChjcHVpZGxlX2xvY2spOwogTElTVF9IRUFEKGNwdWlkbGVfZGV0ZWN0ZWRfZGV2aWNlcyk7Ci1zdGF0aWMgdm9pZCAoKnBtX2lkbGVfb2xkKSh2b2lkKTsKIAogc3RhdGljIGludCBlbmFibGVkX2RldmljZXM7CitzdGF0aWMgaW50IG9mZiBfX3JlYWRfbW9zdGx5Oworc3RhdGljIGludCBpbml0aWFsaXplZCBfX3JlYWRfbW9zdGx5OworCitpbnQgY3B1aWRsZV9kaXNhYmxlZCh2b2lkKQoreworCXJldHVybiBvZmY7Cit9Cit2b2lkIGRpc2FibGVfY3B1aWRsZSh2b2lkKQoreworCW9mZiA9IDE7Cit9CiAKICNpZiBkZWZpbmVkKENPTkZJR19BUkNIX0hBU19DUFVfSURMRV9XQUlUKQogc3RhdGljIHZvaWQgY3B1aWRsZV9raWNrX2NwdXModm9pZCkKQEAgLTQ2LDI1ICs1NiwyMyBAQAogICogY3B1aWRsZV9pZGxlX2NhbGwgLSB0aGUgbWFpbiBpZGxlIGxvb3AKICAqCiAgKiBOT1RFOiBubyBsb2NrcyBvciBzZW1hcGhvcmVzIHNob3VsZCBiZSB1c2VkIGhlcmUKKyAqIHJldHVybiBub24temVybyBvbiBmYWlsdXJlCiAgKi8KLXN0YXRpYyB2b2lkIGNwdWlkbGVfaWRsZV9jYWxsKHZvaWQpCitpbnQgY3B1aWRsZV9pZGxlX2NhbGwodm9pZCkKIHsKIAlzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiA9IF9fdGhpc19jcHVfcmVhZChjcHVpZGxlX2RldmljZXMpOwogCXN0cnVjdCBjcHVpZGxlX3N0YXRlICp0YXJnZXRfc3RhdGU7CiAJaW50IG5leHRfc3RhdGU7CiAKKwlpZiAob2ZmKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghaW5pdGlhbGl6ZWQpCisJCXJldHVybiAtRU5PREVWOworCiAJLyogY2hlY2sgaWYgdGhlIGRldmljZSBpcyByZWFkeSAqLwotCWlmICghZGV2IHx8ICFkZXYtPmVuYWJsZWQpIHsKLQkJaWYgKHBtX2lkbGVfb2xkKQotCQkJcG1faWRsZV9vbGQoKTsKLQkJZWxzZQotI2lmIGRlZmluZWQoQ09ORklHX0FSQ0hfSEFTX0RFRkFVTFRfSURMRSkKLQkJCWRlZmF1bHRfaWRsZSgpOwotI2Vsc2UKLQkJCWxvY2FsX2lycV9lbmFibGUoKTsKLSNlbmRpZgotCQlyZXR1cm47Ci0JfQorCWlmICghZGV2IHx8ICFkZXYtPmVuYWJsZWQpCisJCXJldHVybiAtRUJVU1k7CiAKICNpZiAwCiAJLyogc2hvd3MgcmVncmVzc2lvbnMsIHJlLWVuYWJsZSBmb3IgMi42LjI5ICovCkBAIC04OSw3ICs5Nyw3IEBACiAJbmV4dF9zdGF0ZSA9IGNwdWlkbGVfY3Vycl9nb3Zlcm5vci0+c2VsZWN0KGRldik7CiAJaWYgKG5lZWRfcmVzY2hlZCgpKSB7CiAJCWxvY2FsX2lycV9lbmFibGUoKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gMDsKIAl9CiAKIAl0YXJnZXRfc3RhdGUgPSAmZGV2LT5zdGF0ZXNbbmV4dF9zdGF0ZV07CkBAIC0xMTQsNiArMTIyLDggQEAKIAkvKiBnaXZlIHRoZSBnb3Zlcm5vciBhbiBvcHBvcnR1bml0eSB0byByZWZsZWN0IG9uIHRoZSBvdXRjb21lICovCiAJaWYgKGNwdWlkbGVfY3Vycl9nb3Zlcm5vci0+cmVmbGVjdCkKIAkJY3B1aWRsZV9jdXJyX2dvdmVybm9yLT5yZWZsZWN0KGRldik7CisKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0xMjEsMTAgKzEzMSwxMCBAQAogICovCiB2b2lkIGNwdWlkbGVfaW5zdGFsbF9pZGxlX2hhbmRsZXIodm9pZCkKIHsKLQlpZiAoZW5hYmxlZF9kZXZpY2VzICYmIChwbV9pZGxlICE9IGNwdWlkbGVfaWRsZV9jYWxsKSkgeworCWlmIChlbmFibGVkX2RldmljZXMpIHsKIAkJLyogTWFrZSBzdXJlIGFsbCBjaGFuZ2VzIGZpbmlzaGVkIGJlZm9yZSB3ZSBzd2l0Y2ggdG8gbmV3IGlkbGUgKi8KIAkJc21wX3dtYigpOwotCQlwbV9pZGxlID0gY3B1aWRsZV9pZGxlX2NhbGw7CisJCWluaXRpYWxpemVkID0gMTsKIAl9CiB9CiAKQEAgLTEzMyw4ICsxNDMsOCBAQAogICovCiB2b2lkIGNwdWlkbGVfdW5pbnN0YWxsX2lkbGVfaGFuZGxlcih2b2lkKQogewotCWlmIChlbmFibGVkX2RldmljZXMgJiYgcG1faWRsZV9vbGQgJiYgKHBtX2lkbGUgIT0gcG1faWRsZV9vbGQpKSB7Ci0JCXBtX2lkbGUgPSBwbV9pZGxlX29sZDsKKwlpZiAoZW5hYmxlZF9kZXZpY2VzKSB7CisJCWluaXRpYWxpemVkID0gMDsKIAkJY3B1aWRsZV9raWNrX2NwdXMoKTsKIAl9CiB9CkBAIC00MjcsNyArNDM3LDggQEAKIHsKIAlpbnQgcmV0OwogCi0JcG1faWRsZV9vbGQgPSBwbV9pZGxlOworCWlmIChjcHVpZGxlX2Rpc2FibGVkKCkpCisJCXJldHVybiAtRU5PREVWOwogCiAJcmV0ID0gY3B1aWRsZV9hZGRfY2xhc3Nfc3lzZnMoJmNwdV9zeXNkZXZfY2xhc3MpOwogCWlmIChyZXQpCkBAIC00MzgsNCArNDQ5LDUgQEAKIAlyZXR1cm4gMDsKIH0KIAorbW9kdWxlX3BhcmFtKG9mZiwgaW50LCAwNDQ0KTsKIGNvcmVfaW5pdGNhbGwoY3B1aWRsZV9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLmggYi9kcml2ZXJzL2NwdWlkbGUvY3B1aWRsZS5oCmluZGV4IDMzZTUwZDUuLjM4YzNmZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1aWRsZS9jcHVpZGxlLmgKKysrIGIvZHJpdmVycy9jcHVpZGxlL2NwdWlkbGUuaApAQCAtMTMsNiArMTMsNyBAQAogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgY3B1aWRsZV9kZXRlY3RlZF9kZXZpY2VzOwogZXh0ZXJuIHN0cnVjdCBtdXRleCBjcHVpZGxlX2xvY2s7CiBleHRlcm4gc3BpbmxvY2tfdCBjcHVpZGxlX2RyaXZlcl9sb2NrOworZXh0ZXJuIGludCBjcHVpZGxlX2Rpc2FibGVkKHZvaWQpOwogCiAvKiBpZGxlIGxvb3AgKi8KIGV4dGVybiB2b2lkIGNwdWlkbGVfaW5zdGFsbF9pZGxlX2hhbmRsZXIodm9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWlkbGUvZHJpdmVyLmMgYi9kcml2ZXJzL2NwdWlkbGUvZHJpdmVyLmMKaW5kZXggZmQxNjAxZS4uM2Y3ZTNjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVpZGxlL2RyaXZlci5jCisrKyBiL2RyaXZlcnMvY3B1aWRsZS9kcml2ZXIuYwpAQCAtMjYsNiArMjYsOSBAQAogCWlmICghZHJ2KQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWlmIChjcHVpZGxlX2Rpc2FibGVkKCkpCisJCXJldHVybiAtRU5PREVWOworCiAJc3Bpbl9sb2NrKCZjcHVpZGxlX2RyaXZlcl9sb2NrKTsKIAlpZiAoY3B1aWRsZV9jdXJyX2RyaXZlcikgewogCQlzcGluX3VubG9jaygmY3B1aWRsZV9kcml2ZXJfbG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NwdWlkbGUvZ292ZXJub3IuYyBiL2RyaXZlcnMvY3B1aWRsZS9nb3Zlcm5vci5jCmluZGV4IDcyNGMxNjQuLmVhMmY4ZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1aWRsZS9nb3Zlcm5vci5jCisrKyBiL2RyaXZlcnMvY3B1aWRsZS9nb3Zlcm5vci5jCkBAIC04MSw2ICs4MSw5IEBACiAJaWYgKCFnb3YgfHwgIWdvdi0+c2VsZWN0KQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWlmIChjcHVpZGxlX2Rpc2FibGVkKCkpCisJCXJldHVybiAtRU5PREVWOworCiAJbXV0ZXhfbG9jaygmY3B1aWRsZV9sb2NrKTsKIAlpZiAoX19jcHVpZGxlX2ZpbmRfZ292ZXJub3IoZ292LT5uYW1lKSA9PSBOVUxMKSB7CiAJCXJldCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9UT0RPIGIvZHJpdmVycy9kbWEvVE9ETwppbmRleCBhNGFmODU4Li43MzRlZDAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9UT0RPCisrKyBiL2RyaXZlcnMvZG1hL1RPRE8KQEAgLTksNiArOSw1IEBACiAJLSBteHMtZG1hLmMKIAktIGR3X2RtYWMKIAktIGludGVsX21pZF9kbWEKLQktIHN0ZV9kbWE0MAogNC4gQ2hlY2sgb3RoZXIgc3Vic3lzdGVtcyBmb3IgZG1hIGRyaXZlcnMgYW5kIG1lcmdlL21vdmUgdG8gZG1hZW5naW5lCiA1LiBSZW1vdmUgZG1hX3NsYXZlX2NvbmZpZydzIGRtYSBkaXJlY3Rpb24uCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9hbWJhLXBsMDh4LmMgYi9kcml2ZXJzL2RtYS9hbWJhLXBsMDh4LmMKaW5kZXggZTZkNzIyOC4uMTk2YTczNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvYW1iYS1wbDA4eC5jCisrKyBiL2RyaXZlcnMvZG1hL2FtYmEtcGwwOHguYwpAQCAtMTU2LDE0ICsxNTYsMTAgQEAKICNkZWZpbmUgUEwwOFhfQk9VTkRBUllfU0hJRlQJCSgxMCkJLyogMUtCIDB4NDAwICovCiAjZGVmaW5lIFBMMDhYX0JPVU5EQVJZX1NJWkUJCSgxIDw8IFBMMDhYX0JPVU5EQVJZX1NISUZUKQogCi0vKiBNaW5pbXVtIHBlcmlvZCBiZXR3ZWVuIHdvcmsgcXVldWUgcnVucyAqLwotI2RlZmluZSBQTDA4WF9XUV9QRVJJT0RNSU4JMjAKLQogLyogU2l6ZSAoYnl0ZXMpIG9mIGVhY2ggTExJIGJ1ZmZlciBhbGxvY2F0ZWQgZm9yIG9uZSB0cmFuc2ZlciAqLwogIyBkZWZpbmUgUEwwOFhfTExJX1RTRlJfU0laRQkweDIwMDAKIAogLyogTWF4aW11bSB0aW1lcyB3ZSBjYWxsIGRtYV9wb29sX2FsbG9jIG9uIHRoaXMgcG9vbCB3aXRob3V0IGZyZWVpbmcgKi8KLSNkZWZpbmUgUEwwOFhfTUFYX0FMTE9DUwkweDQwCiAjZGVmaW5lIE1BWF9OVU1fVFNGUl9MTElTCShQTDA4WF9MTElfVFNGUl9TSVpFL3NpemVvZihzdHJ1Y3QgcGwwOHhfbGxpKSkKICNkZWZpbmUgUEwwOFhfQUxJR04JCTgKIApAQCAtNDk1LDEwICs0OTEsMTAgQEAKIAogc3RydWN0IHBsMDh4X2xsaV9idWlsZF9kYXRhIHsKIAlzdHJ1Y3QgcGwwOHhfdHhkICp0eGQ7Ci0Jc3RydWN0IHBsMDh4X2RyaXZlcl9kYXRhICpwbDA4eDsKIAlzdHJ1Y3QgcGwwOHhfYnVzX2RhdGEgc3JjYnVzOwogCXN0cnVjdCBwbDA4eF9idXNfZGF0YSBkc3RidXM7CiAJc2l6ZV90IHJlbWFpbmRlcjsKKwl1MzIgbGxpX2J1czsKIH07CiAKIC8qCkBAIC01NTEsOCArNTQ3LDcgQEAKIAlsbGlzX3ZhW251bV9sbGlzXS5zcmMgPSBiZC0+c3JjYnVzLmFkZHI7CiAJbGxpc192YVtudW1fbGxpc10uZHN0ID0gYmQtPmRzdGJ1cy5hZGRyOwogCWxsaXNfdmFbbnVtX2xsaXNdLmxsaSA9IGxsaXNfYnVzICsgKG51bV9sbGlzICsgMSkgKiBzaXplb2Yoc3RydWN0IHBsMDh4X2xsaSk7Ci0JaWYgKGJkLT5wbDA4eC0+bGxpX2J1c2VzICYgUEwwOFhfQUhCMikKLQkJbGxpc192YVtudW1fbGxpc10ubGxpIHw9IFBMMDgwX0xMSV9MTV9BSEIyOworCWxsaXNfdmFbbnVtX2xsaXNdLmxsaSB8PSBiZC0+bGxpX2J1czsKIAogCWlmIChjY3RsICYgUEwwODBfQ09OVFJPTF9TUkNfSU5DUikKIAkJYmQtPnNyY2J1cy5hZGRyICs9IGxlbjsKQEAgLTYwNSw5ICs2MDAsOSBAQAogCWNjdGwgPSB0eGQtPmNjdGw7CiAKIAliZC50eGQgPSB0eGQ7Ci0JYmQucGwwOHggPSBwbDA4eDsKIAliZC5zcmNidXMuYWRkciA9IHR4ZC0+c3JjX2FkZHI7CiAJYmQuZHN0YnVzLmFkZHIgPSB0eGQtPmRzdF9hZGRyOworCWJkLmxsaV9idXMgPSAocGwwOHgtPmxsaV9idXNlcyAmIFBMMDhYX0FIQjIpID8gUEwwODBfTExJX0xNX0FIQjIgOiAwOwogCiAJLyogRmluZCBtYXhpbXVtIHdpZHRoIG9mIHRoZSBzb3VyY2UgYnVzICovCiAJYmQuc3JjYnVzLm1heHdpZHRoID0KQEAgLTYyMiwyNSArNjE3LDE1IEBACiAJLyogU2V0IHVwIHRoZSBidXMgd2lkdGhzIHRvIHRoZSBtYXhpbXVtICovCiAJYmQuc3JjYnVzLmJ1c3dpZHRoID0gYmQuc3JjYnVzLm1heHdpZHRoOwogCWJkLmRzdGJ1cy5idXN3aWR0aCA9IGJkLmRzdGJ1cy5tYXh3aWR0aDsKLQlkZXZfdmRiZygmcGwwOHgtPmFkZXYtPmRldiwKLQkJICIlcyBzb3VyY2UgYnVzIGlzICVkIGJ5dGVzIHdpZGUsIGRlc3QgYnVzIGlzICVkIGJ5dGVzIHdpZGVcbiIsCi0JCSBfX2Z1bmNfXywgYmQuc3JjYnVzLmJ1c3dpZHRoLCBiZC5kc3RidXMuYnVzd2lkdGgpOwotCiAKIAkvKgogCSAqIEJ5dGVzIHRyYW5zZmVycmVkID09IHRzaXplICogTUlOKGJ1c3dpZHRocyksIG5vdCBtYXgoYnVzd2lkdGhzKQogCSAqLwogCW1heF9ieXRlc19wZXJfbGxpID0gbWluKGJkLnNyY2J1cy5idXN3aWR0aCwgYmQuZHN0YnVzLmJ1c3dpZHRoKSAqCiAJCVBMMDgwX0NPTlRST0xfVFJBTlNGRVJfU0laRV9NQVNLOwotCWRldl92ZGJnKCZwbDA4eC0+YWRldi0+ZGV2LAotCQkgIiVzIG1heCBieXRlcyBwZXIgbGxpID0gJXp1XG4iLAotCQkgX19mdW5jX18sIG1heF9ieXRlc19wZXJfbGxpKTsKIAogCS8qIFdlIG5lZWQgdG8gY291bnQgdGhpcyBkb3duIHRvIHplcm8gKi8KIAliZC5yZW1haW5kZXIgPSB0eGQtPmxlbjsKLQlkZXZfdmRiZygmcGwwOHgtPmFkZXYtPmRldiwKLQkJICIlcyByZW1haW5kZXIgPSAlenVcbiIsCi0JCSBfX2Z1bmNfXywgYmQucmVtYWluZGVyKTsKIAogCS8qCiAJICogQ2hvb3NlIGJ1cyB0byBhbGlnbiB0bwpAQCAtNjQ5LDYgKzYzNCwxNiBAQAogCSAqLwogCXBsMDh4X2Nob29zZV9tYXN0ZXJfYnVzKCZiZCwgJm1idXMsICZzYnVzLCBjY3RsKTsKIAorCWRldl92ZGJnKCZwbDA4eC0+YWRldi0+ZGV2LCAic3JjPTB4JTA4eCVzLyV1IGRzdD0weCUwOHglcy8ldSBsZW49JXp1IGxsaW1heD0lenVcbiIsCisJCSBiZC5zcmNidXMuYWRkciwgY2N0bCAmIFBMMDgwX0NPTlRST0xfU1JDX0lOQ1IgPyAiKyIgOiAiIiwKKwkJIGJkLnNyY2J1cy5idXN3aWR0aCwKKwkJIGJkLmRzdGJ1cy5hZGRyLCBjY3RsICYgUEwwODBfQ09OVFJPTF9EU1RfSU5DUiA/ICIrIiA6ICIiLAorCQkgYmQuZHN0YnVzLmJ1c3dpZHRoLAorCQkgYmQucmVtYWluZGVyLCBtYXhfYnl0ZXNfcGVyX2xsaSk7CisJZGV2X3ZkYmcoJnBsMDh4LT5hZGV2LT5kZXYsICJtYnVzPSVzIHNidXM9JXNcbiIsCisJCSBtYnVzID09ICZiZC5zcmNidXMgPyAic3JjIiA6ICJkc3QiLAorCQkgc2J1cyA9PSAmYmQuc3JjYnVzID8gInNyYyIgOiAiZHN0Iik7CisKIAlpZiAodHhkLT5sZW4gPCBtYnVzLT5idXN3aWR0aCkgewogCQkvKiBMZXNzIHRoYW4gYSBidXMgd2lkdGggYXZhaWxhYmxlIC0gc2VuZCBhcyBzaW5nbGUgYnl0ZXMgKi8KIAkJd2hpbGUgKGJkLnJlbWFpbmRlcikgewpAQCAtODQwLDE1ICs4MzUsMTQgQEAKIAl7CiAJCWludCBpOwogCisJCWRldl92ZGJnKCZwbDA4eC0+YWRldi0+ZGV2LAorCQkJICIlLTNzICUtOXMgICUtMTBzICUtMTBzICUtMTBzICVzXG4iLAorCQkJICJsbGkiLCAiIiwgImNzcmMiLCAiY2RzdCIsICJjbGxpIiwgImNjdGwiKTsKIAkJZm9yIChpID0gMDsgaSA8IG51bV9sbGlzOyBpKyspIHsKIAkJCWRldl92ZGJnKCZwbDA4eC0+YWRldi0+ZGV2LAotCQkJCSAibGxpICVkIEAlcDogY3NyYz0weCUwOHgsIGNkc3Q9MHglMDh4LCBjY3RsPTB4JTA4eCwgY2xsaT0weCUwOHhcbiIsCi0JCQkJIGksCi0JCQkJICZsbGlzX3ZhW2ldLAotCQkJCSBsbGlzX3ZhW2ldLnNyYywKLQkJCQkgbGxpc192YVtpXS5kc3QsCi0JCQkJIGxsaXNfdmFbaV0uY2N0bCwKLQkJCQkgbGxpc192YVtpXS5sbGkKKwkJCQkgIiUzZCBAJXA6IDB4JTA4eCAweCUwOHggMHglMDh4IDB4JTA4eFxuIiwKKwkJCQkgaSwgJmxsaXNfdmFbaV0sIGxsaXNfdmFbaV0uc3JjLAorCQkJCSBsbGlzX3ZhW2ldLmRzdCwgbGxpc192YVtpXS5sbGksIGxsaXNfdmFbaV0uY2N0bAogCQkJCSk7CiAJCX0KIAl9CkBAIC0xMDU0LDY0ICsxMDQ4LDEwNSBAQAogCiAvKiBQcmltZUNlbGwgRE1BIGV4dGVuc2lvbiAqLwogc3RydWN0IGJ1cnN0X3RhYmxlIHsKLQlpbnQgYnVyc3R3b3JkczsKKwl1MzIgYnVyc3R3b3JkczsKIAl1MzIgcmVnOwogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBidXJzdF90YWJsZSBidXJzdF9zaXplc1tdID0gewogCXsKIAkJLmJ1cnN0d29yZHMgPSAyNTYsCi0JCS5yZWcgPSAoUEwwODBfQlNJWkVfMjU2IDw8IFBMMDgwX0NPTlRST0xfU0JfU0laRV9TSElGVCkgfAotCQkJKFBMMDgwX0JTSVpFXzI1NiA8PCBQTDA4MF9DT05UUk9MX0RCX1NJWkVfU0hJRlQpLAorCQkucmVnID0gUEwwODBfQlNJWkVfMjU2LAogCX0sCiAJewogCQkuYnVyc3R3b3JkcyA9IDEyOCwKLQkJLnJlZyA9IChQTDA4MF9CU0laRV8xMjggPDwgUEwwODBfQ09OVFJPTF9TQl9TSVpFX1NISUZUKSB8Ci0JCQkoUEwwODBfQlNJWkVfMTI4IDw8IFBMMDgwX0NPTlRST0xfREJfU0laRV9TSElGVCksCisJCS5yZWcgPSBQTDA4MF9CU0laRV8xMjgsCiAJfSwKIAl7CiAJCS5idXJzdHdvcmRzID0gNjQsCi0JCS5yZWcgPSAoUEwwODBfQlNJWkVfNjQgPDwgUEwwODBfQ09OVFJPTF9TQl9TSVpFX1NISUZUKSB8Ci0JCQkoUEwwODBfQlNJWkVfNjQgPDwgUEwwODBfQ09OVFJPTF9EQl9TSVpFX1NISUZUKSwKKwkJLnJlZyA9IFBMMDgwX0JTSVpFXzY0LAogCX0sCiAJewogCQkuYnVyc3R3b3JkcyA9IDMyLAotCQkucmVnID0gKFBMMDgwX0JTSVpFXzMyIDw8IFBMMDgwX0NPTlRST0xfU0JfU0laRV9TSElGVCkgfAotCQkJKFBMMDgwX0JTSVpFXzMyIDw8IFBMMDgwX0NPTlRST0xfREJfU0laRV9TSElGVCksCisJCS5yZWcgPSBQTDA4MF9CU0laRV8zMiwKIAl9LAogCXsKIAkJLmJ1cnN0d29yZHMgPSAxNiwKLQkJLnJlZyA9IChQTDA4MF9CU0laRV8xNiA8PCBQTDA4MF9DT05UUk9MX1NCX1NJWkVfU0hJRlQpIHwKLQkJCShQTDA4MF9CU0laRV8xNiA8PCBQTDA4MF9DT05UUk9MX0RCX1NJWkVfU0hJRlQpLAorCQkucmVnID0gUEwwODBfQlNJWkVfMTYsCiAJfSwKIAl7CiAJCS5idXJzdHdvcmRzID0gOCwKLQkJLnJlZyA9IChQTDA4MF9CU0laRV84IDw8IFBMMDgwX0NPTlRST0xfU0JfU0laRV9TSElGVCkgfAotCQkJKFBMMDgwX0JTSVpFXzggPDwgUEwwODBfQ09OVFJPTF9EQl9TSVpFX1NISUZUKSwKKwkJLnJlZyA9IFBMMDgwX0JTSVpFXzgsCiAJfSwKIAl7CiAJCS5idXJzdHdvcmRzID0gNCwKLQkJLnJlZyA9IChQTDA4MF9CU0laRV80IDw8IFBMMDgwX0NPTlRST0xfU0JfU0laRV9TSElGVCkgfAotCQkJKFBMMDgwX0JTSVpFXzQgPDwgUEwwODBfQ09OVFJPTF9EQl9TSVpFX1NISUZUKSwKKwkJLnJlZyA9IFBMMDgwX0JTSVpFXzQsCiAJfSwKIAl7Ci0JCS5idXJzdHdvcmRzID0gMSwKLQkJLnJlZyA9IChQTDA4MF9CU0laRV8xIDw8IFBMMDgwX0NPTlRST0xfU0JfU0laRV9TSElGVCkgfAotCQkJKFBMMDgwX0JTSVpFXzEgPDwgUEwwODBfQ09OVFJPTF9EQl9TSVpFX1NISUZUKSwKKwkJLmJ1cnN0d29yZHMgPSAwLAorCQkucmVnID0gUEwwODBfQlNJWkVfMSwKIAl9LAogfTsKIAorLyoKKyAqIEdpdmVuIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGF2YWlsYWJsZSBidXMgbWFza3MsIHNlbGVjdCB3aGljaAorICogd2lsbCBiZSByb3V0ZWQgdG8gZWFjaCBwb3J0LiAgV2UgdHJ5IHRvIGhhdmUgc291cmNlIGFuZCBkZXN0aW5hdGlvbgorICogb24gc2VwYXJhdGUgcG9ydHMsIGJ1dCBhbHdheXMgcmVzcGVjdCB0aGUgYWxsb3dhYmxlIHNldHRpbmdzLgorICovCitzdGF0aWMgdTMyIHBsMDh4X3NlbGVjdF9idXModTggc3JjLCB1OCBkc3QpCit7CisJdTMyIGNjdGwgPSAwOworCisJaWYgKCEoZHN0ICYgUEwwOFhfQUhCMSkgfHwgKChkc3QgJiBQTDA4WF9BSEIyKSAmJiAoc3JjICYgUEwwOFhfQUhCMSkpKQorCQljY3RsIHw9IFBMMDgwX0NPTlRST0xfRFNUX0FIQjI7CisJaWYgKCEoc3JjICYgUEwwOFhfQUhCMSkgfHwgKChzcmMgJiBQTDA4WF9BSEIyKSAmJiAhKGRzdCAmIFBMMDhYX0FIQjIpKSkKKwkJY2N0bCB8PSBQTDA4MF9DT05UUk9MX1NSQ19BSEIyOworCisJcmV0dXJuIGNjdGw7Cit9CisKK3N0YXRpYyB1MzIgcGwwOHhfY2N0bCh1MzIgY2N0bCkKK3sKKwljY3RsICY9IH4oUEwwODBfQ09OVFJPTF9TUkNfQUhCMiB8IFBMMDgwX0NPTlRST0xfRFNUX0FIQjIgfAorCQkgIFBMMDgwX0NPTlRST0xfU1JDX0lOQ1IgfCBQTDA4MF9DT05UUk9MX0RTVF9JTkNSIHwKKwkJICBQTDA4MF9DT05UUk9MX1BST1RfTUFTSyk7CisKKwkvKiBBY2Nlc3MgdGhlIGNlbGwgaW4gcHJpdmlsZWdlZCBtb2RlLCBub24tYnVmZmVyYWJsZSwgbm9uLWNhY2hlYWJsZSAqLworCXJldHVybiBjY3RsIHwgUEwwODBfQ09OVFJPTF9QUk9UX1NZUzsKK30KKworc3RhdGljIHUzMiBwbDA4eF93aWR0aChlbnVtIGRtYV9zbGF2ZV9idXN3aWR0aCB3aWR0aCkKK3sKKwlzd2l0Y2ggKHdpZHRoKSB7CisJY2FzZSBETUFfU0xBVkVfQlVTV0lEVEhfMV9CWVRFOgorCQlyZXR1cm4gUEwwODBfV0lEVEhfOEJJVDsKKwljYXNlIERNQV9TTEFWRV9CVVNXSURUSF8yX0JZVEVTOgorCQlyZXR1cm4gUEwwODBfV0lEVEhfMTZCSVQ7CisJY2FzZSBETUFfU0xBVkVfQlVTV0lEVEhfNF9CWVRFUzoKKwkJcmV0dXJuIFBMMDgwX1dJRFRIXzMyQklUOworCWRlZmF1bHQ6CisJCXJldHVybiB+MDsKKwl9Cit9CisKK3N0YXRpYyB1MzIgcGwwOHhfYnVyc3QodTMyIG1heGJ1cnN0KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYnVyc3Rfc2l6ZXMpOyBpKyspCisJCWlmIChidXJzdF9zaXplc1tpXS5idXJzdHdvcmRzIDw9IG1heGJ1cnN0KQorCQkJYnJlYWs7CisKKwlyZXR1cm4gYnVyc3Rfc2l6ZXNbaV0ucmVnOworfQorCiBzdGF0aWMgaW50IGRtYV9zZXRfcnVudGltZV9jb25maWcoc3RydWN0IGRtYV9jaGFuICpjaGFuLAogCQkJCSAgc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgKmNvbmZpZykKIHsKIAlzdHJ1Y3QgcGwwOHhfZG1hX2NoYW4gKnBsY2hhbiA9IHRvX3BsMDh4X2NoYW4oY2hhbik7CiAJc3RydWN0IHBsMDh4X2RyaXZlcl9kYXRhICpwbDA4eCA9IHBsY2hhbi0+aG9zdDsKLQlzdHJ1Y3QgcGwwOHhfY2hhbm5lbF9kYXRhICpjZCA9IHBsY2hhbi0+Y2Q7CiAJZW51bSBkbWFfc2xhdmVfYnVzd2lkdGggYWRkcl93aWR0aDsKLQlkbWFfYWRkcl90IGFkZHI7Ci0JdTMyIG1heGJ1cnN0OworCXUzMiB3aWR0aCwgYnVyc3QsIG1heGJ1cnN0OwogCXUzMiBjY3RsID0gMDsKLQlpbnQgaTsKIAogCWlmICghcGxjaGFuLT5zbGF2ZSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMTE5LDExICsxMTU0LDkgQEAKIAkvKiBUcmFuc2ZlciBkaXJlY3Rpb24gKi8KIAlwbGNoYW4tPnJ1bnRpbWVfZGlyZWN0aW9uID0gY29uZmlnLT5kaXJlY3Rpb247CiAJaWYgKGNvbmZpZy0+ZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpIHsKLQkJYWRkciA9IGNvbmZpZy0+ZHN0X2FkZHI7CiAJCWFkZHJfd2lkdGggPSBjb25maWctPmRzdF9hZGRyX3dpZHRoOwogCQltYXhidXJzdCA9IGNvbmZpZy0+ZHN0X21heGJ1cnN0OwogCX0gZWxzZSBpZiAoY29uZmlnLT5kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKSB7Ci0JCWFkZHIgPSBjb25maWctPnNyY19hZGRyOwogCQlhZGRyX3dpZHRoID0gY29uZmlnLT5zcmNfYWRkcl93aWR0aDsKIAkJbWF4YnVyc3QgPSBjb25maWctPnNyY19tYXhidXJzdDsKIAl9IGVsc2UgewpAQCAtMTEzMiw0NiArMTE2NSw0MCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlzd2l0Y2ggKGFkZHJfd2lkdGgpIHsKLQljYXNlIERNQV9TTEFWRV9CVVNXSURUSF8xX0JZVEU6Ci0JCWNjdGwgfD0gKFBMMDgwX1dJRFRIXzhCSVQgPDwgUEwwODBfQ09OVFJPTF9TV0lEVEhfU0hJRlQpIHwKLQkJCShQTDA4MF9XSURUSF84QklUIDw8IFBMMDgwX0NPTlRST0xfRFdJRFRIX1NISUZUKTsKLQkJYnJlYWs7Ci0JY2FzZSBETUFfU0xBVkVfQlVTV0lEVEhfMl9CWVRFUzoKLQkJY2N0bCB8PSAoUEwwODBfV0lEVEhfMTZCSVQgPDwgUEwwODBfQ09OVFJPTF9TV0lEVEhfU0hJRlQpIHwKLQkJCShQTDA4MF9XSURUSF8xNkJJVCA8PCBQTDA4MF9DT05UUk9MX0RXSURUSF9TSElGVCk7Ci0JCWJyZWFrOwotCWNhc2UgRE1BX1NMQVZFX0JVU1dJRFRIXzRfQllURVM6Ci0JCWNjdGwgfD0gKFBMMDgwX1dJRFRIXzMyQklUIDw8IFBMMDgwX0NPTlRST0xfU1dJRFRIX1NISUZUKSB8Ci0JCQkoUEwwODBfV0lEVEhfMzJCSVQgPDwgUEwwODBfQ09OVFJPTF9EV0lEVEhfU0hJRlQpOwotCQlicmVhazsKLQlkZWZhdWx0OgorCXdpZHRoID0gcGwwOHhfd2lkdGgoYWRkcl93aWR0aCk7CisJaWYgKHdpZHRoID09IH4wKSB7CiAJCWRldl9lcnIoJnBsMDh4LT5hZGV2LT5kZXYsCiAJCQkiYmFkIHJ1bnRpbWVfY29uZmlnOiBhbGllbiBhZGRyZXNzIHdpZHRoXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJY2N0bCB8PSB3aWR0aCA8PCBQTDA4MF9DT05UUk9MX1NXSURUSF9TSElGVDsKKwljY3RsIHw9IHdpZHRoIDw8IFBMMDgwX0NPTlRST0xfRFdJRFRIX1NISUZUOworCiAJLyoKLQkgKiBOb3cgZGVjaWRlIG9uIGEgbWF4YnVyc3Q6CiAJICogSWYgdGhpcyBjaGFubmVsIHdpbGwgb25seSByZXF1ZXN0IHNpbmdsZSB0cmFuc2ZlcnMsIHNldCB0aGlzCiAJICogZG93biB0byBPTkUgZWxlbWVudC4gIEFsc28gc2VsZWN0IG9uZSBlbGVtZW50IGlmIG5vIG1heGJ1cnN0CiAJICogaXMgc3BlY2lmaWVkLgogCSAqLwotCWlmIChwbGNoYW4tPmNkLT5zaW5nbGUgfHwgbWF4YnVyc3QgPT0gMCkgewotCQljY3RsIHw9IChQTDA4MF9CU0laRV8xIDw8IFBMMDgwX0NPTlRST0xfU0JfU0laRV9TSElGVCkgfAotCQkJKFBMMDgwX0JTSVpFXzEgPDwgUEwwODBfQ09OVFJPTF9EQl9TSVpFX1NISUZUKTsKKwlpZiAocGxjaGFuLT5jZC0+c2luZ2xlKQorCQltYXhidXJzdCA9IDE7CisKKwlidXJzdCA9IHBsMDh4X2J1cnN0KG1heGJ1cnN0KTsKKwljY3RsIHw9IGJ1cnN0IDw8IFBMMDgwX0NPTlRST0xfU0JfU0laRV9TSElGVDsKKwljY3RsIHw9IGJ1cnN0IDw8IFBMMDgwX0NPTlRST0xfREJfU0laRV9TSElGVDsKKworCWlmIChwbGNoYW4tPnJ1bnRpbWVfZGlyZWN0aW9uID09IERNQV9GUk9NX0RFVklDRSkgeworCQlwbGNoYW4tPnNyY19hZGRyID0gY29uZmlnLT5zcmNfYWRkcjsKKwkJcGxjaGFuLT5zcmNfY2N0bCA9IHBsMDh4X2NjdGwoY2N0bCkgfCBQTDA4MF9DT05UUk9MX0RTVF9JTkNSIHwKKwkJCXBsMDh4X3NlbGVjdF9idXMocGxjaGFuLT5jZC0+cGVyaXBoX2J1c2VzLAorCQkJCQkgcGwwOHgtPm1lbV9idXNlcyk7CiAJfSBlbHNlIHsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYnVyc3Rfc2l6ZXMpOyBpKyspCi0JCQlpZiAoYnVyc3Rfc2l6ZXNbaV0uYnVyc3R3b3JkcyA8PSBtYXhidXJzdCkKLQkJCQlicmVhazsKLQkJY2N0bCB8PSBidXJzdF9zaXplc1tpXS5yZWc7CisJCXBsY2hhbi0+ZHN0X2FkZHIgPSBjb25maWctPmRzdF9hZGRyOworCQlwbGNoYW4tPmRzdF9jY3RsID0gcGwwOHhfY2N0bChjY3RsKSB8IFBMMDgwX0NPTlRST0xfU1JDX0lOQ1IgfAorCQkJcGwwOHhfc2VsZWN0X2J1cyhwbDA4eC0+bWVtX2J1c2VzLAorCQkJCQkgcGxjaGFuLT5jZC0+cGVyaXBoX2J1c2VzKTsKIAl9CiAKLQlwbGNoYW4tPnJ1bnRpbWVfYWRkciA9IGFkZHI7Ci0KLQkvKiBNb2RpZnkgdGhlIGRlZmF1bHQgY2hhbm5lbCBkYXRhIHRvIGZpdCBQcmltZUNlbGwgcmVxdWVzdCAqLwotCWNkLT5jY3RsID0gY2N0bDsKLQogCWRldl9kYmcoJnBsMDh4LT5hZGV2LT5kZXYsCiAJCSJjb25maWd1cmVkIGNoYW5uZWwgJXMgKCVzKSBmb3IgJXMsIGRhdGEgd2lkdGggJWQsICIKIAkJIm1heGJ1cnN0ICVkIHdvcmRzLCBMRSwgQ0NUTD0weCUwOHhcbiIsCkBAIC0xMjcwLDIzICsxMjk3LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIEdpdmVuIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGF2YWlsYWJsZSBidXMgbWFza3MsIHNlbGVjdCB3aGljaAotICogd2lsbCBiZSByb3V0ZWQgdG8gZWFjaCBwb3J0LiAgV2UgdHJ5IHRvIGhhdmUgc291cmNlIGFuZCBkZXN0aW5hdGlvbgotICogb24gc2VwYXJhdGUgcG9ydHMsIGJ1dCBhbHdheXMgcmVzcGVjdCB0aGUgYWxsb3dhYmxlIHNldHRpbmdzLgotICovCi1zdGF0aWMgdTMyIHBsMDh4X3NlbGVjdF9idXMoc3RydWN0IHBsMDh4X2RyaXZlcl9kYXRhICpwbDA4eCwgdTggc3JjLCB1OCBkc3QpCi17Ci0JdTMyIGNjdGwgPSAwOwotCi0JaWYgKCEoZHN0ICYgUEwwOFhfQUhCMSkgfHwgKChkc3QgJiBQTDA4WF9BSEIyKSAmJiAoc3JjICYgUEwwOFhfQUhCMSkpKQotCQljY3RsIHw9IFBMMDgwX0NPTlRST0xfRFNUX0FIQjI7Ci0JaWYgKCEoc3JjICYgUEwwOFhfQUhCMSkgfHwgKChzcmMgJiBQTDA4WF9BSEIyKSAmJiAhKGRzdCAmIFBMMDhYX0FIQjIpKSkKLQkJY2N0bCB8PSBQTDA4MF9DT05UUk9MX1NSQ19BSEIyOwotCi0JcmV0dXJuIGNjdGw7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcGwwOHhfdHhkICpwbDA4eF9nZXRfdHhkKHN0cnVjdCBwbDA4eF9kbWFfY2hhbiAqcGxjaGFuLAogCXVuc2lnbmVkIGxvbmcgZmxhZ3MpCiB7CkBAIC0xMzM4LDggKzEzNDgsOCBAQAogCXR4ZC0+Y2N0bCB8PSBQTDA4MF9DT05UUk9MX1NSQ19JTkNSIHwgUEwwODBfQ09OVFJPTF9EU1RfSU5DUjsKIAogCWlmIChwbDA4eC0+dmQtPmR1YWxtYXN0ZXIpCi0JCXR4ZC0+Y2N0bCB8PSBwbDA4eF9zZWxlY3RfYnVzKHBsMDh4LAotCQkJCQlwbDA4eC0+bWVtX2J1c2VzLCBwbDA4eC0+bWVtX2J1c2VzKTsKKwkJdHhkLT5jY3RsIHw9IHBsMDh4X3NlbGVjdF9idXMocGwwOHgtPm1lbV9idXNlcywKKwkJCQkJICAgICAgcGwwOHgtPm1lbV9idXNlcyk7CiAKIAlyZXQgPSBwbDA4eF9wcmVwX2NoYW5uZWxfcmVzb3VyY2VzKHBsY2hhbiwgdHhkKTsKIAlpZiAocmV0KQpAQCAtMTM1Niw3ICsxMzY2LDYgQEAKIAlzdHJ1Y3QgcGwwOHhfZG1hX2NoYW4gKnBsY2hhbiA9IHRvX3BsMDh4X2NoYW4oY2hhbik7CiAJc3RydWN0IHBsMDh4X2RyaXZlcl9kYXRhICpwbDA4eCA9IHBsY2hhbi0+aG9zdDsKIAlzdHJ1Y3QgcGwwOHhfdHhkICp0eGQ7Ci0JdTggc3JjX2J1c2VzLCBkc3RfYnVzZXM7CiAJaW50IHJldDsKIAogCS8qCkBAIC0xMzkwLDQyICsxMzk5LDIyIEBACiAJdHhkLT5kaXJlY3Rpb24gPSBkaXJlY3Rpb247CiAJdHhkLT5sZW4gPSBzZ2wtPmxlbmd0aDsKIAotCXR4ZC0+Y2N0bCA9IHBsY2hhbi0+Y2QtPmNjdGwgJgotCQkJfihQTDA4MF9DT05UUk9MX1NSQ19BSEIyIHwgUEwwODBfQ09OVFJPTF9EU1RfQUhCMiB8Ci0JCQkgIFBMMDgwX0NPTlRST0xfU1JDX0lOQ1IgfCBQTDA4MF9DT05UUk9MX0RTVF9JTkNSIHwKLQkJCSAgUEwwODBfQ09OVFJPTF9QUk9UX01BU0spOwotCi0JLyogQWNjZXNzIHRoZSBjZWxsIGluIHByaXZpbGVnZWQgbW9kZSwgbm9uLWJ1ZmZlcmFibGUsIG5vbi1jYWNoZWFibGUgKi8KLQl0eGQtPmNjdGwgfD0gUEwwODBfQ09OVFJPTF9QUk9UX1NZUzsKLQogCWlmIChkaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkgewogCQl0eGQtPmNjZmcgfD0gUEwwODBfRkxPV19NRU0yUEVSIDw8IFBMMDgwX0NPTkZJR19GTE9XX0NPTlRST0xfU0hJRlQ7Ci0JCXR4ZC0+Y2N0bCB8PSBQTDA4MF9DT05UUk9MX1NSQ19JTkNSOworCQl0eGQtPmNjdGwgPSBwbGNoYW4tPmRzdF9jY3RsOwogCQl0eGQtPnNyY19hZGRyID0gc2dsLT5kbWFfYWRkcmVzczsKLQkJaWYgKHBsY2hhbi0+cnVudGltZV9hZGRyKQotCQkJdHhkLT5kc3RfYWRkciA9IHBsY2hhbi0+cnVudGltZV9hZGRyOwotCQllbHNlCi0JCQl0eGQtPmRzdF9hZGRyID0gcGxjaGFuLT5jZC0+YWRkcjsKLQkJc3JjX2J1c2VzID0gcGwwOHgtPm1lbV9idXNlczsKLQkJZHN0X2J1c2VzID0gcGxjaGFuLT5jZC0+cGVyaXBoX2J1c2VzOworCQl0eGQtPmRzdF9hZGRyID0gcGxjaGFuLT5kc3RfYWRkcjsKIAl9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpIHsKIAkJdHhkLT5jY2ZnIHw9IFBMMDgwX0ZMT1dfUEVSMk1FTSA8PCBQTDA4MF9DT05GSUdfRkxPV19DT05UUk9MX1NISUZUOwotCQl0eGQtPmNjdGwgfD0gUEwwODBfQ09OVFJPTF9EU1RfSU5DUjsKLQkJaWYgKHBsY2hhbi0+cnVudGltZV9hZGRyKQotCQkJdHhkLT5zcmNfYWRkciA9IHBsY2hhbi0+cnVudGltZV9hZGRyOwotCQllbHNlCi0JCQl0eGQtPnNyY19hZGRyID0gcGxjaGFuLT5jZC0+YWRkcjsKKwkJdHhkLT5jY3RsID0gcGxjaGFuLT5zcmNfY2N0bDsKKwkJdHhkLT5zcmNfYWRkciA9IHBsY2hhbi0+c3JjX2FkZHI7CiAJCXR4ZC0+ZHN0X2FkZHIgPSBzZ2wtPmRtYV9hZGRyZXNzOwotCQlzcmNfYnVzZXMgPSBwbGNoYW4tPmNkLT5wZXJpcGhfYnVzZXM7Ci0JCWRzdF9idXNlcyA9IHBsMDh4LT5tZW1fYnVzZXM7CiAJfSBlbHNlIHsKIAkJZGV2X2VycigmcGwwOHgtPmFkZXYtPmRldiwKIAkJCSIlcyBkaXJlY3Rpb24gdW5zdXBwb3J0ZWRcbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0JdHhkLT5jY3RsIHw9IHBsMDh4X3NlbGVjdF9idXMocGwwOHgsIHNyY19idXNlcywgZHN0X2J1c2VzKTsKLQogCXJldCA9IHBsMDh4X3ByZXBfY2hhbm5lbF9yZXNvdXJjZXMocGxjaGFuLCB0eGQpOwogCWlmIChyZXQpCiAJCXJldHVybiBOVUxMOwpAQCAtMTY3Niw2ICsxNjY1LDIwIEBACiAJcmV0dXJuIG1hc2sgPyBJUlFfSEFORExFRCA6IElSUV9OT05FOwogfQogCitzdGF0aWMgdm9pZCBwbDA4eF9kbWFfc2xhdmVfaW5pdChzdHJ1Y3QgcGwwOHhfZG1hX2NoYW4gKmNoYW4pCit7CisJdTMyIGNjdGwgPSBwbDA4eF9jY3RsKGNoYW4tPmNkLT5jY3RsKTsKKworCWNoYW4tPnNsYXZlID0gdHJ1ZTsKKwljaGFuLT5uYW1lID0gY2hhbi0+Y2QtPmJ1c19pZDsKKwljaGFuLT5zcmNfYWRkciA9IGNoYW4tPmNkLT5hZGRyOworCWNoYW4tPmRzdF9hZGRyID0gY2hhbi0+Y2QtPmFkZHI7CisJY2hhbi0+c3JjX2NjdGwgPSBjY3RsIHwgUEwwODBfQ09OVFJPTF9EU1RfSU5DUiB8CisJCXBsMDh4X3NlbGVjdF9idXMoY2hhbi0+Y2QtPnBlcmlwaF9idXNlcywgY2hhbi0+aG9zdC0+bWVtX2J1c2VzKTsKKwljaGFuLT5kc3RfY2N0bCA9IGNjdGwgfCBQTDA4MF9DT05UUk9MX1NSQ19JTkNSIHwKKwkJcGwwOHhfc2VsZWN0X2J1cyhjaGFuLT5ob3N0LT5tZW1fYnVzZXMsIGNoYW4tPmNkLT5wZXJpcGhfYnVzZXMpOworfQorCiAvKgogICogSW5pdGlhbGlzZSB0aGUgRE1BQyBtZW1jcHkvc2xhdmUgY2hhbm5lbHMuCiAgKiBNYWtlIGEgbG9jYWwgd3JhcHBlciB0byBob2xkIHJlcXVpcmVkIGRhdGEKQEAgLTE3MDcsOSArMTcxMCw4IEBACiAJCWNoYW4tPnN0YXRlID0gUEwwOFhfQ0hBTl9JRExFOwogCiAJCWlmIChzbGF2ZSkgewotCQkJY2hhbi0+c2xhdmUgPSB0cnVlOwotCQkJY2hhbi0+bmFtZSA9IHBsMDh4LT5wZC0+c2xhdmVfY2hhbm5lbHNbaV0uYnVzX2lkOwogCQkJY2hhbi0+Y2QgPSAmcGwwOHgtPnBkLT5zbGF2ZV9jaGFubmVsc1tpXTsKKwkJCXBsMDh4X2RtYV9zbGF2ZV9pbml0KGNoYW4pOwogCQl9IGVsc2UgewogCQkJY2hhbi0+Y2QgPSAmcGwwOHgtPnBkLT5tZW1jcHlfY2hhbm5lbDsKIAkJCWNoYW4tPm5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgIm1lbWNweSVkIiwgaSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9hdF9oZG1hYy5jIGIvZHJpdmVycy9kbWEvYXRfaGRtYWMuYwppbmRleCAzNjE0NGY4Li42YTQ4M2VhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9hdF9oZG1hYy5jCisrKyBiL2RyaXZlcnMvZG1hL2F0X2hkbWFjLmMKQEAgLTEyMTYsNyArMTIxNiw3IEBACiAJYXRkbWEtPmRtYV9jb21tb24uY2FwX21hc2sgPSBwZGF0YS0+Y2FwX21hc2s7CiAJYXRkbWEtPmFsbF9jaGFuX21hc2sgPSAoMSA8PCBwZGF0YS0+bnJfY2hhbm5lbHMpIC0gMTsKIAotCXNpemUgPSBpby0+ZW5kIC0gaW8tPnN0YXJ0ICsgMTsKKwlzaXplID0gcmVzb3VyY2Vfc2l6ZShpbyk7CiAJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oaW8tPnN0YXJ0LCBzaXplLCBwZGV2LT5kZXYuZHJpdmVyLT5uYW1lKSkgewogCQllcnIgPSAtRUJVU1k7CiAJCWdvdG8gZXJyX2tmcmVlOwpAQCAtMTM2Miw3ICsxMzYyLDcgQEAKIAlhdGRtYS0+cmVncyA9IE5VTEw7CiAKIAlpbyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKGlvLT5zdGFydCwgaW8tPmVuZCAtIGlvLT5zdGFydCArIDEpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihpby0+c3RhcnQsIHJlc291cmNlX3NpemUoaW8pKTsKIAogCWtmcmVlKGF0ZG1hKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvY29oOTAxMzE4LmMgYi9kcml2ZXJzL2RtYS9jb2g5MDEzMTguYwppbmRleCBhOTJkOTVlLi40MjM0ZjQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9jb2g5MDEzMTguYworKysgYi9kcml2ZXJzL2RtYS9jb2g5MDEzMTguYwpAQCAtNDEsNiArNDEsOCBAQAogCXN0cnVjdCBjb2g5MDEzMThfbGxpICpsbGk7CiAJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGhlYWRfY29uZmlnOworCXUzMiBoZWFkX2N0cmw7CiB9OwogCiBzdHJ1Y3QgY29oOTAxMzE4X2Jhc2UgewpAQCAtNjYxLDYgKzY2Myw5IEBACiAKIAkJY29oOTAxMzE4X2Rlc2Nfc3VibWl0KGNvaGMsIGNvaGQpOwogCisJCS8qIFByb2dyYW0gdGhlIHRyYW5zYWN0aW9uIGhlYWQgKi8KKwkJY29oOTAxMzE4X3NldF9jb25mKGNvaGMsIGNvaGQtPmhlYWRfY29uZmlnKTsKKwkJY29oOTAxMzE4X3NldF9jdHJsKGNvaGMsIGNvaGQtPmhlYWRfY3RybCk7CiAJCWNvaDkwMTMxOF9wcmVwX2xpbmtlZF9saXN0KGNvaGMsIGNvaGQtPmxsaSk7CiAKIAkJLyogc3RhcnQgZG1hIGpvYiBvbiB0aGlzIGNoYW5uZWwgKi8KQEAgLTEwOTEsOCArMTA5Niw2IEBACiAJfSBlbHNlCiAJCWdvdG8gZXJyX2RpcmVjdGlvbjsKIAotCWNvaDkwMTMxOF9zZXRfY29uZihjb2hjLCBjb25maWcpOwotCiAJLyogVGhlIGRtYSBvbmx5IHN1cHBvcnRzIHRyYW5zbWl0dGluZyBwYWNrYWdlcyB1cCB0bwogCSAqIE1BWF9ETUFfUEFDS0VUX1NJWkUuIENhbGN1bGF0ZSB0byB0b3RhbCBudW1iZXIgb2YKIAkgKiBkbWEgZWxlbXRzIHJlcXVpcmVkIHRvIHNlbmQgdGhlIGVudGlyZSBzZyBsaXN0CkBAIC0xMTI5LDE2ICsxMTMyLDE4IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJfbGxpX2ZpbGw7CiAKLQkvKgotCSAqIFNldCB0aGUgZGVmYXVsdCBjdHJsIGZvciB0aGUgY2hhbm5lbCB0byB0aGUgb25lIGZyb20gdGhlIGxsaSwKLQkgKiB0aGluZ3MgbWF5IGhhdmUgY2hhbmdlZCBkdWUgdG8gb2RkIGJ1ZmZlciBhbGlnbm1lbnQgZXRjLgotCSAqLwotCWNvaDkwMTMxOF9zZXRfY3RybChjb2hjLCBsbGktPmNvbnRyb2wpOwogCiAJQ09IX0RCRyhjb2g5MDEzMThfbGlzdF9wcmludChjb2hjLCBsbGkpKTsKIAogCS8qIFBpY2sgYSBkZXNjcmlwdG9yIHRvIGhhbmRsZSB0aGlzIHRyYW5zZmVyICovCiAJY29oZCA9IGNvaDkwMTMxOF9kZXNjX2dldChjb2hjKTsKKwljb2hkLT5oZWFkX2NvbmZpZyA9IGNvbmZpZzsKKwkvKgorCSAqIFNldCB0aGUgZGVmYXVsdCBoZWFkIGN0cmwgZm9yIHRoZSBjaGFubmVsIHRvIHRoZSBvbmUgZnJvbSB0aGUKKwkgKiBsbGksIHRoaW5ncyBtYXkgaGF2ZSBjaGFuZ2VkIGR1ZSB0byBvZGQgYnVmZmVyIGFsaWdubWVudAorCSAqIGV0Yy4KKwkgKi8KKwljb2hkLT5oZWFkX2N0cmwgPSBsbGktPmNvbnRyb2w7CiAJY29oZC0+ZGlyID0gZGlyZWN0aW9uOwogCWNvaGQtPmZsYWdzID0gZmxhZ3M7CiAJY29oZC0+ZGVzYy50eF9zdWJtaXQgPSBjb2g5MDEzMThfdHhfc3VibWl0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvZG1hZW5naW5lLmMgYi9kcml2ZXJzL2RtYS9kbWFlbmdpbmUuYwppbmRleCA0ODY5NGMzLi5iNDg5NjdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9kbWFlbmdpbmUuYworKysgYi9kcml2ZXJzL2RtYS9kbWFlbmdpbmUuYwpAQCAtNjIsOSArNjIsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogc3RhdGljIERFRklORV9NVVRFWChkbWFfbGlzdF9tdXRleCk7CitzdGF0aWMgREVGSU5FX0lEUihkbWFfaWRyKTsKIHN0YXRpYyBMSVNUX0hFQUQoZG1hX2RldmljZV9saXN0KTsKIHN0YXRpYyBsb25nIGRtYWVuZ2luZV9yZWZfY291bnQ7Ci1zdGF0aWMgc3RydWN0IGlkciBkbWFfaWRyOwogCiAvKiAtLS0gc3lzZnMgaW1wbGVtZW50YXRpb24gLS0tICovCiAKQEAgLTUxMCw4ICs1MTAsOCBAQAogCQkJCQkgZG1hX2NoYW5fbmFtZShjaGFuKSk7CiAJCQkJbGlzdF9kZWxfcmN1KCZkZXZpY2UtPmdsb2JhbF9ub2RlKTsKIAkJCX0gZWxzZSBpZiAoZXJyKQotCQkJCXByX2VycigiZG1hZW5naW5lOiBmYWlsZWQgdG8gZ2V0ICVzOiAoJWQpXG4iLAotCQkJCSAgICAgICBkbWFfY2hhbl9uYW1lKGNoYW4pLCBlcnIpOworCQkJCXByX2RlYnVnKCJkbWFlbmdpbmU6IGZhaWxlZCB0byBnZXQgJXM6ICglZClcbiIsCisJCQkJCSBkbWFfY2hhbl9uYW1lKGNoYW4pLCBlcnIpOwogCQkJZWxzZQogCQkJCWJyZWFrOwogCQkJaWYgKC0tZGV2aWNlLT5wcml2YXRlY250ID09IDApCkBAIC0xMDUwLDggKzEwNTAsNiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBkbWFfYnVzX2luaXQodm9pZCkKIHsKLQlpZHJfaW5pdCgmZG1hX2lkcik7Ci0JbXV0ZXhfaW5pdCgmZG1hX2xpc3RfbXV0ZXgpOwogCXJldHVybiBjbGFzc19yZWdpc3RlcigmZG1hX2RldmNsYXNzKTsKIH0KIGFyY2hfaW5pdGNhbGwoZG1hX2J1c19pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2VwOTN4eF9kbWEuYyBiL2RyaXZlcnMvZG1hL2VwOTN4eF9kbWEuYwppbmRleCAwNzY2YzFlLi41ZDdhNDliIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9lcDkzeHhfZG1hLmMKKysrIGIvZHJpdmVycy9kbWEvZXA5M3h4X2RtYS5jCkBAIC05MDIsNyArOTAyLDcgQEAKICAqCiAgKiBSZXR1cm5zIGEgdmFsaWQgRE1BIGRlc2NyaXB0b3Igb3IgJU5VTEwgaW4gY2FzZSBvZiBmYWlsdXJlLgogICovCi1zdHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKgorc3RhdGljIHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqCiBlcDkzeHhfZG1hX3ByZXBfZG1hX21lbWNweShzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4sIGRtYV9hZGRyX3QgZGVzdCwKIAkJCSAgIGRtYV9hZGRyX3Qgc3JjLCBzaXplX3QgbGVuLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvaW14LXNkbWEuYyBiL2RyaXZlcnMvZG1hL2lteC1zZG1hLmMKaW5kZXggMWVhNDdkYi4uN2JkN2U5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvaW14LXNkbWEuYworKysgYi9kcml2ZXJzL2RtYS9pbXgtc2RtYS5jCkBAIC0zMiw2ICszMiw4IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8bWFjaC9zZG1hLmg+CkBAIC02NSw4ICs2Nyw4IEBACiAjZGVmaW5lIFNETUFfT05DRV9SVEIJCTB4MDYwCiAjZGVmaW5lIFNETUFfWFRSSUdfQ09ORjEJMHgwNzAKICNkZWZpbmUgU0RNQV9YVFJJR19DT05GMgkweDA3NAotI2RlZmluZSBTRE1BX0NITkVOQkwwX1YyCTB4MjAwCi0jZGVmaW5lIFNETUFfQ0hORU5CTDBfVjEJMHgwODAKKyNkZWZpbmUgU0RNQV9DSE5FTkJMMF9JTVgzNQkweDIwMAorI2RlZmluZSBTRE1BX0NITkVOQkwwX0lNWDMxCTB4MDgwCiAjZGVmaW5lIFNETUFfQ0hOUFJJXzAJCTB4MTAwCiAKIC8qCkBAIC0yOTksMTMgKzMwMSwxOCBAQAogCXUzMglyYW1fY29kZV9zaXplOwogfTsKIAorZW51bSBzZG1hX2RldnR5cGUgeworCUlNWDMxX1NETUEsCS8qIHJ1bnMgb24gaS5teDMxICovCisJSU1YMzVfU0RNQSwJLyogcnVucyBvbiBpLm14MzUgYW5kIGxhdGVyICovCit9OworCiBzdHJ1Y3Qgc2RtYV9lbmdpbmUgewogCXN0cnVjdCBkZXZpY2UJCQkqZGV2OwogCXN0cnVjdCBkZXZpY2VfZG1hX3BhcmFtZXRlcnMJZG1hX3Bhcm1zOwogCXN0cnVjdCBzZG1hX2NoYW5uZWwJCWNoYW5uZWxbTUFYX0RNQV9DSEFOTkVMU107CiAJc3RydWN0IHNkbWFfY2hhbm5lbF9jb250cm9sCSpjaGFubmVsX2NvbnRyb2w7CiAJdm9pZCBfX2lvbWVtCQkJKnJlZ3M7Ci0JdW5zaWduZWQgaW50CQkJdmVyc2lvbjsKKwllbnVtIHNkbWFfZGV2dHlwZQkJZGV2dHlwZTsKIAl1bnNpZ25lZCBpbnQJCQludW1fZXZlbnRzOwogCXN0cnVjdCBzZG1hX2NvbnRleHRfZGF0YQkqY29udGV4dDsKIAlkbWFfYWRkcl90CQkJY29udGV4dF9waHlzOwpAQCAtMzE0LDYgKzMyMSwyNiBAQAogCXN0cnVjdCBzZG1hX3NjcmlwdF9zdGFydF9hZGRycwkqc2NyaXB0X2FkZHJzOwogfTsKIAorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgc2RtYV9kZXZ0eXBlc1tdID0geworCXsKKwkJLm5hbWUgPSAiaW14MzEtc2RtYSIsCisJCS5kcml2ZXJfZGF0YSA9IElNWDMxX1NETUEsCisJfSwgeworCQkubmFtZSA9ICJpbXgzNS1zZG1hIiwKKwkJLmRyaXZlcl9kYXRhID0gSU1YMzVfU0RNQSwKKwl9LCB7CisJCS8qIHNlbnRpbmVsICovCisJfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGxhdGZvcm0sIHNkbWFfZGV2dHlwZXMpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBzZG1hX2R0X2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDMxLXNkbWEiLCAuZGF0YSA9ICZzZG1hX2RldnR5cGVzW0lNWDMxX1NETUFdLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDM1LXNkbWEiLCAuZGF0YSA9ICZzZG1hX2RldnR5cGVzW0lNWDM1X1NETUFdLCB9LAorCXsgLyogc2VudGluZWwgKi8gfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHNkbWFfZHRfaWRzKTsKKwogI2RlZmluZSBTRE1BX0hfQ09ORklHX0RTUERNQQkoMSA8PCAxMikgLyogaW5kaWNhdGVzIGlmIHRoZSBEU1BETUEgaXMgdXNlZCAqLwogI2RlZmluZSBTRE1BX0hfQ09ORklHX1JURF9QSU5TCSgxIDw8IDExKSAvKiBpbmRpY2F0ZXMgaWYgUmVhbC1UaW1lIERlYnVnIHBpbnMgYXJlIGVuYWJsZWQgKi8KICNkZWZpbmUgU0RNQV9IX0NPTkZJR19BQ1IJKDEgPDwgNCkgIC8qIGluZGljYXRlcyBpZiBBSEIgZnJlcSAvY29yZSBmcmVxID0gMiBvciAxICovCkBAIC0zMjEsOCArMzQ4LDggQEAKIAogc3RhdGljIGlubGluZSB1MzIgY2huZW5ibF9vZnMoc3RydWN0IHNkbWFfZW5naW5lICpzZG1hLCB1bnNpZ25lZCBpbnQgZXZlbnQpCiB7Ci0JdTMyIGNobmVuYmwwID0gKHNkbWEtPnZlcnNpb24gPT0gMiA/IFNETUFfQ0hORU5CTDBfVjIgOiBTRE1BX0NITkVOQkwwX1YxKTsKLQorCXUzMiBjaG5lbmJsMCA9IChzZG1hLT5kZXZ0eXBlID09IElNWDMxX1NETUEgPyBTRE1BX0NITkVOQkwwX0lNWDMxIDoKKwkJCQkJCSAgICAgIFNETUFfQ0hORU5CTDBfSU1YMzUpOwogCXJldHVybiBjaG5lbmJsMCArIGV2ZW50ICogNDsKIH0KIApAQCAtMTEwOCwyMiArMTEzNSwxNCBAQAogCQljb25zdCBjaGFyICpmd19uYW1lKQogewogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7Ci0JY2hhciAqZnduYW1lOwogCWNvbnN0IHN0cnVjdCBzZG1hX2Zpcm13YXJlX2hlYWRlciAqaGVhZGVyOwogCWludCByZXQ7CiAJY29uc3Qgc3RydWN0IHNkbWFfc2NyaXB0X3N0YXJ0X2FkZHJzICphZGRyOwogCXVuc2lnbmVkIHNob3J0ICpyYW1fY29kZTsKIAotCWZ3bmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXMiLCBmd19uYW1lKTsKLQlpZiAoIWZ3bmFtZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZnduYW1lLCBzZG1hLT5kZXYpOwotCWlmIChyZXQpIHsKLQkJa2ZyZWUoZnduYW1lKTsKKwlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgZndfbmFtZSwgc2RtYS0+ZGV2KTsKKwlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwotCX0KLQlrZnJlZShmd25hbWUpOwogCiAJaWYgKGZ3LT5zaXplIDwgc2l6ZW9mKCpoZWFkZXIpKQogCQlnb3RvIGVycl9maXJtd2FyZTsKQEAgLTExNjIsMTUgKzExODEsMTYgQEAKIAlpbnQgaSwgcmV0OwogCWRtYV9hZGRyX3QgY2NiX3BoeXM7CiAKLQlzd2l0Y2ggKHNkbWEtPnZlcnNpb24pIHsKLQljYXNlIDE6CisJc3dpdGNoIChzZG1hLT5kZXZ0eXBlKSB7CisJY2FzZSBJTVgzMV9TRE1BOgogCQlzZG1hLT5udW1fZXZlbnRzID0gMzI7CiAJCWJyZWFrOwotCWNhc2UgMjoKKwljYXNlIElNWDM1X1NETUE6CiAJCXNkbWEtPm51bV9ldmVudHMgPSA0ODsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2VycihzZG1hLT5kZXYsICJVbmtub3duIHZlcnNpb24gJWQuIGFib3J0aW5nXG4iLCBzZG1hLT52ZXJzaW9uKTsKKwkJZGV2X2VycihzZG1hLT5kZXYsICJVbmtub3duIHNkbWEgdHlwZSAlZC4gYWJvcnRpbmdcbiIsCisJCQlzZG1hLT5kZXZ0eXBlKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0xMjM5LDYgKzEyNTksMTAgQEAKIAogc3RhdGljIGludCBfX2luaXQgc2RtYV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkID0KKwkJCW9mX21hdGNoX2RldmljZShzZG1hX2R0X2lkcywgJnBkZXYtPmRldik7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IHBkZXYtPmRldi5vZl9ub2RlOworCWNvbnN0IGNoYXIgKmZ3X25hbWU7CiAJaW50IHJldDsKIAlpbnQgaXJxOwogCXN0cnVjdCByZXNvdXJjZSAqaW9yZXM7CkBAIC0xMjU0LDcgKzEyNzgsNyBAQAogCiAJaW9yZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7Ci0JaWYgKCFpb3JlcyB8fCBpcnEgPCAwIHx8ICFwZGF0YSkgeworCWlmICghaW9yZXMgfHwgaXJxIDwgMCkgewogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIGVycl9pcnE7CiAJfQpAQCAtMTI4MSwxMCArMTMwNSwxNCBAQAogCQlnb3RvIGVycl9yZXF1ZXN0X2lycTsKIAogCXNkbWEtPnNjcmlwdF9hZGRycyA9IGt6YWxsb2Moc2l6ZW9mKCpzZG1hLT5zY3JpcHRfYWRkcnMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXNkbWEtPnNjcmlwdF9hZGRycykKKwlpZiAoIXNkbWEtPnNjcmlwdF9hZGRycykgeworCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGVycl9hbGxvYzsKKwl9CiAKLQlzZG1hLT52ZXJzaW9uID0gcGRhdGEtPnNkbWFfdmVyc2lvbjsKKwlpZiAob2ZfaWQpCisJCXBkZXYtPmlkX2VudHJ5ID0gb2ZfaWQtPmRhdGE7CisJc2RtYS0+ZGV2dHlwZSA9IHBkZXYtPmlkX2VudHJ5LT5kcml2ZXJfZGF0YTsKIAogCWRtYV9jYXBfc2V0KERNQV9TTEFWRSwgc2RtYS0+ZG1hX2RldmljZS5jYXBfbWFzayk7CiAJZG1hX2NhcF9zZXQoRE1BX0NZQ0xJQywgc2RtYS0+ZG1hX2RldmljZS5jYXBfbWFzayk7CkBAIC0xMzE0LDEwICsxMzQyLDMwIEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJfaW5pdDsKIAotCWlmIChwZGF0YS0+c2NyaXB0X2FkZHJzKQorCWlmIChwZGF0YSAmJiBwZGF0YS0+c2NyaXB0X2FkZHJzKQogCQlzZG1hX2FkZF9zY3JpcHRzKHNkbWEsIHBkYXRhLT5zY3JpcHRfYWRkcnMpOwogCi0Jc2RtYV9nZXRfZmlybXdhcmUoc2RtYSwgcGRhdGEtPmZ3X25hbWUpOworCWlmIChwZGF0YSkgeworCQlzZG1hX2dldF9maXJtd2FyZShzZG1hLCBwZGF0YS0+ZndfbmFtZSk7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogQmVjYXVzZSB0aGF0IGRldmljZSB0cmVlIGRvZXMgbm90IGVuY29kZSBST00gc2NyaXB0IGFkZHJlc3MsCisJCSAqIHRoZSBSQU0gc2NyaXB0IGluIGZpcm13YXJlIGlzIG1hbmRhdG9yeSBmb3IgZGV2aWNlIHRyZWUKKwkJICogcHJvYmUsIG90aGVyd2lzZSBpdCBmYWlscy4KKwkJICovCisJCXJldCA9IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKG5wLCAiZnNsLHNkbWEtcmFtLXNjcmlwdC1uYW1lIiwKKwkJCQkJICAgICAgJmZ3X25hbWUpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGZpcm13YXJlIG5hbWVcbiIpOworCQkJZ290byBlcnJfaW5pdDsKKwkJfQorCisJCXJldCA9IHNkbWFfZ2V0X2Zpcm13YXJlKHNkbWEsIGZ3X25hbWUpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGZpcm13YXJlXG4iKTsKKwkJCWdvdG8gZXJyX2luaXQ7CisJCX0KKwl9CiAKIAlzZG1hLT5kbWFfZGV2aWNlLmRldiA9ICZwZGV2LT5kZXY7CiAKQEAgLTEzNjUsNyArMTQxMyw5IEBACiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzZG1hX2RyaXZlciA9IHsKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAiaW14LXNkbWEiLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBzZG1hX2R0X2lkcywKIAl9LAorCS5pZF90YWJsZQk9IHNkbWFfZGV2dHlwZXMsCiAJLnJlbW92ZQkJPSBfX2V4aXRfcChzZG1hX3JlbW92ZSksCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9pbnRlbF9taWRfZG1hLmMgYi9kcml2ZXJzL2RtYS9pbnRlbF9taWRfZG1hLmMKaW5kZXggZjY1MzUxNy4uOGEzZmRkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvaW50ZWxfbWlkX2RtYS5jCisrKyBiL2RyaXZlcnMvZG1hL2ludGVsX21pZF9kbWEuYwpAQCAtMTM1MSw3ICsxMzUxLDYgQEAKIAkJCXJldHVybiAtRUFHQUlOOwogCX0KIAlkZXZpY2UtPnN0YXRlID0gU1VTUEVOREVEOwotCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIGRldmljZSk7CiAJcGNpX3NhdmVfc3RhdGUocGNpKTsKIAlwY2lfZGlzYWJsZV9kZXZpY2UocGNpKTsKIAlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBjaSwgUENJX0QzaG90KTsKQEAgLTEzODAsNyArMTM3OSw2IEBACiAJfQogCWRldmljZS0+c3RhdGUgPSBSVU5OSU5HOwogCWlvd3JpdGUzMihSRUdfQklUMCwgZGV2aWNlLT5kbWFfYmFzZSArIERNQV9DRkcpOwotCXBjaV9zZXRfZHJ2ZGF0YShwY2ksIGRldmljZSk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2lvYXQvZG1hX3YzLmMgYi9kcml2ZXJzL2RtYS9pb2F0L2RtYV92My5jCmluZGV4IGQ4NDVkYzQuLmY1MTljOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2lvYXQvZG1hX3YzLmMKKysrIGIvZHJpdmVycy9kbWEvaW9hdC9kbWFfdjMuYwpAQCAtNzMsMTAgKzczLDEwIEBACiAvKiBwcm92aWRlIGEgbG9va3VwIHRhYmxlIGZvciBzZXR0aW5nIHRoZSBzb3VyY2UgYWRkcmVzcyBpbiB0aGUgYmFzZSBvcgogICogZXh0ZW5kZWQgZGVzY3JpcHRvciBvZiBhbiB4b3Igb3IgcHEgZGVzY3JpcHRvcgogICovCi1zdGF0aWMgY29uc3QgdTggeG9yX2lkeF90b19kZXNjIF9fcmVhZF9tb3N0bHkgPSAweGQwOwotc3RhdGljIGNvbnN0IHU4IHhvcl9pZHhfdG9fZmllbGRbXSBfX3JlYWRfbW9zdGx5ID0geyAxLCA0LCA1LCA2LCA3LCAwLCAxLCAyIH07Ci1zdGF0aWMgY29uc3QgdTggcHFfaWR4X3RvX2Rlc2MgX19yZWFkX21vc3RseSA9IDB4Zjg7Ci1zdGF0aWMgY29uc3QgdTggcHFfaWR4X3RvX2ZpZWxkW10gX19yZWFkX21vc3RseSA9IHsgMSwgNCwgNSwgMCwgMSwgMiwgNCwgNSB9Oworc3RhdGljIGNvbnN0IHU4IHhvcl9pZHhfdG9fZGVzYyA9IDB4ZTA7CitzdGF0aWMgY29uc3QgdTggeG9yX2lkeF90b19maWVsZFtdID0geyAxLCA0LCA1LCA2LCA3LCAwLCAxLCAyIH07CitzdGF0aWMgY29uc3QgdTggcHFfaWR4X3RvX2Rlc2MgPSAweGY4Oworc3RhdGljIGNvbnN0IHU4IHBxX2lkeF90b19maWVsZFtdID0geyAxLCA0LCA1LCAwLCAxLCAyLCA0LCA1IH07CiAKIHN0YXRpYyBkbWFfYWRkcl90IHhvcl9nZXRfc3JjKHN0cnVjdCBpb2F0X3Jhd19kZXNjcmlwdG9yICpkZXNjc1syXSwgaW50IGlkeCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL2lvYXQvcGNpLmMgYi9kcml2ZXJzL2RtYS9pb2F0L3BjaS5jCmluZGV4IGZhYjM3ZDEuLjVlM2E0MGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL2lvYXQvcGNpLmMKKysrIGIvZHJpdmVycy9kbWEvaW9hdC9wY2kuYwpAQCAtNzIsNiArNzIsMTcgQEAKIAl7IFBDSV9WREVWSUNFKElOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lPQVRfSlNGOCkgfSwKIAl7IFBDSV9WREVWSUNFKElOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMX0lPQVRfSlNGOSkgfSwKIAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9TTkIwKSB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9TTkIxKSB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9TTkIyKSB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9TTkIzKSB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9TTkI0KSB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9TTkI1KSB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9TTkI2KSB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9TTkI3KSB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9TTkI4KSB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9TTkI5KSB9LAorCiAJeyAwLCB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGlvYXRfcGNpX3RibCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9pcHUvaXB1X2lkbWFjLmMgYi9kcml2ZXJzL2RtYS9pcHUvaXB1X2lkbWFjLmMKaW5kZXggZmQ3ZDJiMy4uNjgxNTkwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvaXB1L2lwdV9pZG1hYy5jCisrKyBiL2RyaXZlcnMvZG1hL2lwdS9pcHVfaWRtYWMuYwpAQCAtMTcwNiwxNiArMTcwNiwxNCBAQAogCQlpcHVfZGF0YS5pcnFfZm4sIGlwdV9kYXRhLmlycV9lcnIsIGlwdV9kYXRhLmlycV9iYXNlKTsKIAogCS8qIFJlbWFwIElQVSBjb21tb24gcmVnaXN0ZXJzICovCi0JaXB1X2RhdGEucmVnX2lwdSA9IGlvcmVtYXAobWVtX2lwdS0+c3RhcnQsCi0JCQkJICAgbWVtX2lwdS0+ZW5kIC0gbWVtX2lwdS0+c3RhcnQgKyAxKTsKKwlpcHVfZGF0YS5yZWdfaXB1ID0gaW9yZW1hcChtZW1faXB1LT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShtZW1faXB1KSk7CiAJaWYgKCFpcHVfZGF0YS5yZWdfaXB1KSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX2lvcmVtYXBfaXB1OwogCX0KIAogCS8qIFJlbWFwIEltYWdlIENvbnZlcnRlciBhbmQgSW1hZ2UgRE1BIENvbnRyb2xsZXIgcmVnaXN0ZXJzICovCi0JaXB1X2RhdGEucmVnX2ljID0gaW9yZW1hcChtZW1faWMtPnN0YXJ0LAotCQkJCSAgbWVtX2ljLT5lbmQgLSBtZW1faWMtPnN0YXJ0ICsgMSk7CisJaXB1X2RhdGEucmVnX2ljID0gaW9yZW1hcChtZW1faWMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbV9pYykpOwogCWlmICghaXB1X2RhdGEucmVnX2ljKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX2lvcmVtYXBfaWM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9tdl94b3IuYyBiL2RyaXZlcnMvZG1hL212X3hvci5jCmluZGV4IDA2ZjlmMjcuLjlhMzUzYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL212X3hvci5jCisrKyBiL2RyaXZlcnMvZG1hL212X3hvci5jCkBAIC0xMzA0LDcgKzEzMDQsOCBAQAogCWlmICghcmVzKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCW1zcC0+eG9yX2Jhc2UgPSBkZXZtX2lvcmVtYXAoJnBkZXYtPmRldiwgcmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwltc3AtPnhvcl9iYXNlID0gZGV2bV9pb3JlbWFwKCZwZGV2LT5kZXYsIHJlcy0+c3RhcnQsCisJCQkJICAgICByZXNvdXJjZV9zaXplKHJlcykpOwogCWlmICghbXNwLT54b3JfYmFzZSkKIAkJcmV0dXJuIC1FQlVTWTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvbXhzLWRtYS5jIGIvZHJpdmVycy9kbWEvbXhzLWRtYS5jCmluZGV4IDg4YWFkNGYuLmJlNjQxY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL214cy1kbWEuYworKysgYi9kcml2ZXJzL2RtYS9teHMtZG1hLmMKQEAgLTMyNywxMCArMzI3LDEyIEBACiAKIAltZW1zZXQobXhzX2NoYW4tPmNjdywgMCwgUEFHRV9TSVpFKTsKIAotCXJldCA9IHJlcXVlc3RfaXJxKG14c19jaGFuLT5jaGFuX2lycSwgbXhzX2RtYV9pbnRfaGFuZGxlciwKLQkJCQkwLCAibXhzLWRtYSIsIG14c19kbWEpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX2lycTsKKwlpZiAobXhzX2NoYW4tPmNoYW5faXJxICE9IE5PX0lSUSkgeworCQlyZXQgPSByZXF1ZXN0X2lycShteHNfY2hhbi0+Y2hhbl9pcnEsIG14c19kbWFfaW50X2hhbmRsZXIsCisJCQkJCTAsICJteHMtZG1hIiwgbXhzX2RtYSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9pcnE7CisJfQogCiAJcmV0ID0gY2xrX2VuYWJsZShteHNfZG1hLT5jbGspOwogCWlmIChyZXQpCkBAIC01MzUsNiArNTM3LDcgQEAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgRE1BX1RFUk1JTkFURV9BTEw6CiAJCW14c19kbWFfZGlzYWJsZV9jaGFuKG14c19jaGFuKTsKKwkJbXhzX2RtYV9yZXNldF9jaGFuKG14c19jaGFuKTsKIAkJYnJlYWs7CiAJY2FzZSBETUFfUEFVU0U6CiAJCW14c19kbWFfcGF1c2VfY2hhbihteHNfY2hhbik7CkBAIC03MDcsNiArNzEwLDggQEAKIAl9LCB7CiAJCS5uYW1lID0gIm14cy1kbWEtYXBieCIsCiAJCS5kcml2ZXJfZGF0YSA9IE1YU19ETUFfQVBCWCwKKwl9LCB7CisJCS8qIGVuZCBvZiBsaXN0ICovCiAJfQogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvcGNoX2RtYS5jIGIvZHJpdmVycy9kbWEvcGNoX2RtYS5jCmluZGV4IGZmNWIzOGYuLjFhYzhkNGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3BjaF9kbWEuYworKysgYi9kcml2ZXJzL2RtYS9wY2hfZG1hLmMKQEAgLTQ1LDcgKzQ1LDggQEAKICNkZWZpbmUgRE1BX1NUQVRVU19NQVNLX0JJVFMJCTB4MwogI2RlZmluZSBETUFfU1RBVFVTX1NISUZUX0JJVFMJCTE2CiAjZGVmaW5lIERNQV9TVEFUVVNfSVJRKHgpCQkoMHgxIDw8ICh4KSkKLSNkZWZpbmUgRE1BX1NUQVRVU19FUlIoeCkJCSgweDEgPDwgKCh4KSArIDgpKQorI2RlZmluZSBETUFfU1RBVFVTMF9FUlIoeCkJCSgweDEgPDwgKCh4KSArIDgpKQorI2RlZmluZSBETUFfU1RBVFVTMl9FUlIoeCkJCSgweDEgPDwgKHgpKQogCiAjZGVmaW5lIERNQV9ERVNDX1dJRFRIX1NISUZUX0JJVFMJMTIKICNkZWZpbmUgRE1BX0RFU0NfV0lEVEhfMV9CWVRFCQkoMHgzIDw8IERNQV9ERVNDX1dJRFRIX1NISUZUX0JJVFMpCkBAIC02MSw2ICs2Miw5IEBACiAKICNkZWZpbmUgTUFYX0NIQU5fTlIJCQk4CiAKKyNkZWZpbmUgRE1BX01BU0tfQ1RMMF9NT0RFCTB4MzMzMzMzMzMKKyNkZWZpbmUgRE1BX01BU0tfQ1RMMl9NT0RFCTB4MDAwMDMzMzMKKwogc3RhdGljIHVuc2lnbmVkIGludCBpbml0X25yX2Rlc2NfcGVyX2NoYW5uZWwgPSA2NDsKIG1vZHVsZV9wYXJhbShpbml0X25yX2Rlc2NfcGVyX2NoYW5uZWwsIHVpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhpbml0X25yX2Rlc2NfcGVyX2NoYW5uZWwsCkBAIC0xMzMsNiArMTM3LDcgQEAKICNkZWZpbmUgUENIX0RNQV9DVEwzCTB4MEMKICNkZWZpbmUgUENIX0RNQV9TVFMwCTB4MTAKICNkZWZpbmUgUENIX0RNQV9TVFMxCTB4MTQKKyNkZWZpbmUgUENIX0RNQV9TVFMyCTB4MTgKIAogI2RlZmluZSBkbWFfcmVhZGwocGQsIG5hbWUpIFwKIAlyZWFkbCgocGQpLT5tZW1iYXNlICsgUENIX0RNQV8jI25hbWUpCkBAIC0xODMsMTMgKzE4OCwxOSBAQAogewogCXN0cnVjdCBwY2hfZG1hICpwZCA9IHRvX3BkKGNoYW4tPmRldmljZSk7CiAJdTMyIHZhbDsKKwlpbnQgcG9zOworCisJaWYgKGNoYW4tPmNoYW5faWQgPCA4KQorCQlwb3MgPSBjaGFuLT5jaGFuX2lkOworCWVsc2UKKwkJcG9zID0gY2hhbi0+Y2hhbl9pZCArIDg7CiAKIAl2YWwgPSBkbWFfcmVhZGwocGQsIENUTDIpOwogCiAJaWYgKGVuYWJsZSkKLQkJdmFsIHw9IDB4MSA8PCBjaGFuLT5jaGFuX2lkOworCQl2YWwgfD0gMHgxIDw8IHBvczsKIAllbHNlCi0JCXZhbCAmPSB+KDB4MSA8PCBjaGFuLT5jaGFuX2lkKTsKKwkJdmFsICY9IH4oMHgxIDw8IHBvcyk7CiAKIAlkbWFfd3JpdGVsKHBkLCBDVEwyLCB2YWwpOwogCkBAIC0yMDIsMTAgKzIxMywxNyBAQAogCXN0cnVjdCBwY2hfZG1hX2NoYW4gKnBkX2NoYW4gPSB0b19wZF9jaGFuKGNoYW4pOwogCXN0cnVjdCBwY2hfZG1hICpwZCA9IHRvX3BkKGNoYW4tPmRldmljZSk7CiAJdTMyIHZhbDsKKwl1MzIgbWFza19tb2RlOworCXUzMiBtYXNrX2N0bDsKIAogCWlmIChjaGFuLT5jaGFuX2lkIDwgOCkgewogCQl2YWwgPSBkbWFfcmVhZGwocGQsIENUTDApOwogCisJCW1hc2tfbW9kZSA9IERNQV9DVEwwX01PREVfTUFTS19CSVRTIDw8CisJCQkJCShETUFfQ1RMMF9CSVRTX1BFUl9DSCAqIGNoYW4tPmNoYW5faWQpOworCQltYXNrX2N0bCA9IERNQV9NQVNLX0NUTDBfTU9ERSAmIH4oRE1BX0NUTDBfTU9ERV9NQVNLX0JJVFMgPDwKKwkJCQkgICAgICAgKERNQV9DVEwwX0JJVFNfUEVSX0NIICogY2hhbi0+Y2hhbl9pZCkpOworCQl2YWwgJj0gbWFza19tb2RlOwogCQlpZiAocGRfY2hhbi0+ZGlyID09IERNQV9UT19ERVZJQ0UpCiAJCQl2YWwgfD0gMHgxIDw8IChETUFfQ1RMMF9CSVRTX1BFUl9DSCAqIGNoYW4tPmNoYW5faWQgKwogCQkJCSAgICAgICBETUFfQ1RMMF9ESVJfU0hJRlRfQklUUyk7CkBAIC0yMTMsMTggKzIzMSwyNCBAQAogCQkJdmFsICY9IH4oMHgxIDw8IChETUFfQ1RMMF9CSVRTX1BFUl9DSCAqIGNoYW4tPmNoYW5faWQgKwogCQkJCQkgRE1BX0NUTDBfRElSX1NISUZUX0JJVFMpKTsKIAorCQl2YWwgfD0gbWFza19jdGw7CiAJCWRtYV93cml0ZWwocGQsIENUTDAsIHZhbCk7CiAJfSBlbHNlIHsKIAkJaW50IGNoID0gY2hhbi0+Y2hhbl9pZCAtIDg7IC8qIGNoOC0tPjAgY2g5LS0+MSAuLi4gY2gxMS0+MyAqLwogCQl2YWwgPSBkbWFfcmVhZGwocGQsIENUTDMpOwogCisJCW1hc2tfbW9kZSA9IERNQV9DVEwwX01PREVfTUFTS19CSVRTIDw8CisJCQkJCQkoRE1BX0NUTDBfQklUU19QRVJfQ0ggKiBjaCk7CisJCW1hc2tfY3RsID0gRE1BX01BU0tfQ1RMMl9NT0RFICYgfihETUFfQ1RMMF9NT0RFX01BU0tfQklUUyA8PAorCQkJCQkJIChETUFfQ1RMMF9CSVRTX1BFUl9DSCAqIGNoKSk7CisJCXZhbCAmPSBtYXNrX21vZGU7CiAJCWlmIChwZF9jaGFuLT5kaXIgPT0gRE1BX1RPX0RFVklDRSkKIAkJCXZhbCB8PSAweDEgPDwgKERNQV9DVEwwX0JJVFNfUEVSX0NIICogY2ggKwogCQkJCSAgICAgICBETUFfQ1RMMF9ESVJfU0hJRlRfQklUUyk7CiAJCWVsc2UKIAkJCXZhbCAmPSB+KDB4MSA8PCAoRE1BX0NUTDBfQklUU19QRVJfQ0ggKiBjaCArCiAJCQkJCSBETUFfQ1RMMF9ESVJfU0hJRlRfQklUUykpOwotCisJCXZhbCB8PSBtYXNrX2N0bDsKIAkJZG1hX3dyaXRlbChwZCwgQ1RMMywgdmFsKTsKIAl9CiAKQEAgLTIzNiwzMyArMjYwLDM3IEBACiB7CiAJc3RydWN0IHBjaF9kbWEgKnBkID0gdG9fcGQoY2hhbi0+ZGV2aWNlKTsKIAl1MzIgdmFsOworCXUzMiBtYXNrX2N0bDsKKwl1MzIgbWFza19kaXI7CiAKIAlpZiAoY2hhbi0+Y2hhbl9pZCA8IDgpIHsKKwkJbWFza19jdGwgPSBETUFfTUFTS19DVEwwX01PREUgJiB+KERNQV9DVEwwX01PREVfTUFTS19CSVRTIDw8CisJCQkgICAoRE1BX0NUTDBfQklUU19QRVJfQ0ggKiBjaGFuLT5jaGFuX2lkKSk7CisJCW1hc2tfZGlyID0gMSA8PCAoRE1BX0NUTDBfQklUU19QRVJfQ0ggKiBjaGFuLT5jaGFuX2lkICtcCisJCQkJIERNQV9DVEwwX0RJUl9TSElGVF9CSVRTKTsKIAkJdmFsID0gZG1hX3JlYWRsKHBkLCBDVEwwKTsKLQotCQl2YWwgJj0gfihETUFfQ1RMMF9NT0RFX01BU0tfQklUUyA8PAotCQkJKERNQV9DVEwwX0JJVFNfUEVSX0NIICogY2hhbi0+Y2hhbl9pZCkpOworCQl2YWwgJj0gbWFza19kaXI7CiAJCXZhbCB8PSBtb2RlIDw8IChETUFfQ1RMMF9CSVRTX1BFUl9DSCAqIGNoYW4tPmNoYW5faWQpOwotCisJCXZhbCB8PSBtYXNrX2N0bDsKIAkJZG1hX3dyaXRlbChwZCwgQ1RMMCwgdmFsKTsKIAl9IGVsc2UgewogCQlpbnQgY2ggPSBjaGFuLT5jaGFuX2lkIC0gODsgLyogY2g4LS0+MCBjaDktLT4xIC4uLiBjaDExLT4zICovCi0KKwkJbWFza19jdGwgPSBETUFfTUFTS19DVEwyX01PREUgJiB+KERNQV9DVEwwX01PREVfTUFTS19CSVRTIDw8CisJCQkJCQkgKERNQV9DVEwwX0JJVFNfUEVSX0NIICogY2gpKTsKKwkJbWFza19kaXIgPSAxIDw8IChETUFfQ1RMMF9CSVRTX1BFUl9DSCAqIGNoICtcCisJCQkJIERNQV9DVEwwX0RJUl9TSElGVF9CSVRTKTsKIAkJdmFsID0gZG1hX3JlYWRsKHBkLCBDVEwzKTsKLQotCQl2YWwgJj0gfihETUFfQ1RMMF9NT0RFX01BU0tfQklUUyA8PAotCQkJKERNQV9DVEwwX0JJVFNfUEVSX0NIICogY2gpKTsKKwkJdmFsICY9IG1hc2tfZGlyOwogCQl2YWwgfD0gbW9kZSA8PCAoRE1BX0NUTDBfQklUU19QRVJfQ0ggKiBjaCk7Ci0KKwkJdmFsIHw9IG1hc2tfY3RsOwogCQlkbWFfd3JpdGVsKHBkLCBDVEwzLCB2YWwpOwotCiAJfQogCiAJZGV2X2RiZyhjaGFuMmRldihjaGFuKSwgInBkY19zZXRfbW9kZTogY2hhbiAlZCAtPiAleFxuIiwKIAkJY2hhbi0+Y2hhbl9pZCwgdmFsKTsKIH0KIAotc3RhdGljIHUzMiBwZGNfZ2V0X3N0YXR1cyhzdHJ1Y3QgcGNoX2RtYV9jaGFuICpwZF9jaGFuKQorc3RhdGljIHUzMiBwZGNfZ2V0X3N0YXR1czAoc3RydWN0IHBjaF9kbWFfY2hhbiAqcGRfY2hhbikKIHsKIAlzdHJ1Y3QgcGNoX2RtYSAqcGQgPSB0b19wZChwZF9jaGFuLT5jaGFuLmRldmljZSk7CiAJdTMyIHZhbDsKQEAgLTI3Miw5ICszMDAsMjcgQEAKIAkJCURNQV9TVEFUVVNfQklUU19QRVJfQ0ggKiBwZF9jaGFuLT5jaGFuLmNoYW5faWQpKTsKIH0KIAorc3RhdGljIHUzMiBwZGNfZ2V0X3N0YXR1czIoc3RydWN0IHBjaF9kbWFfY2hhbiAqcGRfY2hhbikKK3sKKwlzdHJ1Y3QgcGNoX2RtYSAqcGQgPSB0b19wZChwZF9jaGFuLT5jaGFuLmRldmljZSk7CisJdTMyIHZhbDsKKworCXZhbCA9IGRtYV9yZWFkbChwZCwgU1RTMik7CisJcmV0dXJuIERNQV9TVEFUVVNfTUFTS19CSVRTICYgKHZhbCA+PiAoRE1BX1NUQVRVU19TSElGVF9CSVRTICsKKwkJCURNQV9TVEFUVVNfQklUU19QRVJfQ0ggKiAocGRfY2hhbi0+Y2hhbi5jaGFuX2lkIC0gOCkpKTsKK30KKwogc3RhdGljIGJvb2wgcGRjX2lzX2lkbGUoc3RydWN0IHBjaF9kbWFfY2hhbiAqcGRfY2hhbikKIHsKLQlpZiAocGRjX2dldF9zdGF0dXMocGRfY2hhbikgPT0gRE1BX1NUQVRVU19JRExFKQorCXUzMiBzdHM7CisKKwlpZiAocGRfY2hhbi0+Y2hhbi5jaGFuX2lkIDwgOCkKKwkJc3RzID0gcGRjX2dldF9zdGF0dXMwKHBkX2NoYW4pOworCWVsc2UKKwkJc3RzID0gcGRjX2dldF9zdGF0dXMyKHBkX2NoYW4pOworCisKKwlpZiAoc3RzID09IERNQV9TVEFUVVNfSURMRSkKIAkJcmV0dXJuIHRydWU7CiAJZWxzZQogCQlyZXR1cm4gZmFsc2U7CkBAIC00OTUsMTEgKzU0MSwxMSBAQAogCQlsaXN0X2FkZF90YWlsKCZkZXNjLT5kZXNjX25vZGUsICZ0bXBfbGlzdCk7CiAJfQogCi0Jc3Bpbl9sb2NrX2JoKCZwZF9jaGFuLT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZwZF9jaGFuLT5sb2NrKTsKIAlsaXN0X3NwbGljZSgmdG1wX2xpc3QsICZwZF9jaGFuLT5mcmVlX2xpc3QpOwogCXBkX2NoYW4tPmRlc2NzX2FsbG9jYXRlZCA9IGk7CiAJcGRfY2hhbi0+Y29tcGxldGVkX2Nvb2tpZSA9IGNoYW4tPmNvb2tpZSA9IDE7Ci0Jc3Bpbl91bmxvY2tfYmgoJnBkX2NoYW4tPmxvY2spOworCXNwaW5fdW5sb2NrX2lycSgmcGRfY2hhbi0+bG9jayk7CiAKIAlwZGNfZW5hYmxlX2lycShjaGFuLCAxKTsKIApAQCAtNTE3LDEwICs1NjMsMTAgQEAKIAlCVUdfT04oIWxpc3RfZW1wdHkoJnBkX2NoYW4tPmFjdGl2ZV9saXN0KSk7CiAJQlVHX09OKCFsaXN0X2VtcHR5KCZwZF9jaGFuLT5xdWV1ZSkpOwogCi0Jc3Bpbl9sb2NrX2JoKCZwZF9jaGFuLT5sb2NrKTsKKwlzcGluX2xvY2tfaXJxKCZwZF9jaGFuLT5sb2NrKTsKIAlsaXN0X3NwbGljZV9pbml0KCZwZF9jaGFuLT5mcmVlX2xpc3QsICZ0bXBfbGlzdCk7CiAJcGRfY2hhbi0+ZGVzY3NfYWxsb2NhdGVkID0gMDsKLQlzcGluX3VubG9ja19iaCgmcGRfY2hhbi0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZwZF9jaGFuLT5sb2NrKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkZXNjLCBfZCwgJnRtcF9saXN0LCBkZXNjX25vZGUpCiAJCXBjaV9wb29sX2ZyZWUocGQtPnBvb2wsIGRlc2MsIGRlc2MtPnR4ZC5waHlzKTsKQEAgLTUzNiwxMCArNTgyLDEwIEBACiAJZG1hX2Nvb2tpZV90IGxhc3RfY29tcGxldGVkOwogCWludCByZXQ7CiAKLQlzcGluX2xvY2tfYmgoJnBkX2NoYW4tPmxvY2spOworCXNwaW5fbG9ja19pcnEoJnBkX2NoYW4tPmxvY2spOwogCWxhc3RfY29tcGxldGVkID0gcGRfY2hhbi0+Y29tcGxldGVkX2Nvb2tpZTsKIAlsYXN0X3VzZWQgPSBjaGFuLT5jb29raWU7Ci0Jc3Bpbl91bmxvY2tfYmgoJnBkX2NoYW4tPmxvY2spOworCXNwaW5fdW5sb2NrX2lycSgmcGRfY2hhbi0+bG9jayk7CiAKIAlyZXQgPSBkbWFfYXN5bmNfaXNfY29tcGxldGUoY29va2llLCBsYXN0X2NvbXBsZXRlZCwgbGFzdF91c2VkKTsKIApAQCAtNjU0LDcgKzcwMCw3IEBACiAJaWYgKGNtZCAhPSBETUFfVEVSTUlOQVRFX0FMTCkKIAkJcmV0dXJuIC1FTlhJTzsKIAotCXNwaW5fbG9ja19iaCgmcGRfY2hhbi0+bG9jayk7CisJc3Bpbl9sb2NrX2lycSgmcGRfY2hhbi0+bG9jayk7CiAKIAlwZGNfc2V0X21vZGUoJnBkX2NoYW4tPmNoYW4sIERNQV9DVEwwX0RJU0FCTEUpOwogCkBAIC02NjQsNyArNzEwLDcgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZGVzYywgX2QsICZsaXN0LCBkZXNjX25vZGUpCiAJCXBkY19jaGFpbl9jb21wbGV0ZShwZF9jaGFuLCBkZXNjKTsKIAotCXNwaW5fdW5sb2NrX2JoKCZwZF9jaGFuLT5sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJnBkX2NoYW4tPmxvY2spOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02OTMsMzAgKzczOSw0NSBAQAogCXN0cnVjdCBwY2hfZG1hICpwZCA9IChzdHJ1Y3QgcGNoX2RtYSAqKWRldmlkOwogCXN0cnVjdCBwY2hfZG1hX2NoYW4gKnBkX2NoYW47CiAJdTMyIHN0czA7CisJdTMyIHN0czI7CiAJaW50IGk7Ci0JaW50IHJldCA9IElSUV9OT05FOworCWludCByZXQwID0gSVJRX05PTkU7CisJaW50IHJldDIgPSBJUlFfTk9ORTsKIAogCXN0czAgPSBkbWFfcmVhZGwocGQsIFNUUzApOworCXN0czIgPSBkbWFfcmVhZGwocGQsIFNUUzIpOwogCiAJZGV2X2RiZyhwZC0+ZG1hLmRldiwgInBkX2lycSBzdHMwOiAleFxuIiwgc3RzMCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcGQtPmRtYS5jaGFuY250OyBpKyspIHsKIAkJcGRfY2hhbiA9ICZwZC0+Y2hhbm5lbHNbaV07CiAKLQkJaWYgKHN0czAgJiBETUFfU1RBVFVTX0lSUShpKSkgewotCQkJaWYgKHN0czAgJiBETUFfU1RBVFVTX0VSUihpKSkKLQkJCQlzZXRfYml0KDAsICZwZF9jaGFuLT5lcnJfc3RhdHVzKTsKKwkJaWYgKGkgPCA4KSB7CisJCQlpZiAoc3RzMCAmIERNQV9TVEFUVVNfSVJRKGkpKSB7CisJCQkJaWYgKHN0czAgJiBETUFfU1RBVFVTMF9FUlIoaSkpCisJCQkJCXNldF9iaXQoMCwgJnBkX2NoYW4tPmVycl9zdGF0dXMpOwogCi0JCQl0YXNrbGV0X3NjaGVkdWxlKCZwZF9jaGFuLT50YXNrbGV0KTsKLQkJCXJldCA9IElSUV9IQU5ETEVEOworCQkJCXRhc2tsZXRfc2NoZWR1bGUoJnBkX2NoYW4tPnRhc2tsZXQpOworCQkJCXJldDAgPSBJUlFfSEFORExFRDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChzdHMyICYgRE1BX1NUQVRVU19JUlEoaSAtIDgpKSB7CisJCQkJaWYgKHN0czIgJiBETUFfU1RBVFVTMl9FUlIoaSkpCisJCQkJCXNldF9iaXQoMCwgJnBkX2NoYW4tPmVycl9zdGF0dXMpOworCisJCQkJdGFza2xldF9zY2hlZHVsZSgmcGRfY2hhbi0+dGFza2xldCk7CisJCQkJcmV0MiA9IElSUV9IQU5ETEVEOworCQkJfQogCQl9Ci0KIAl9CiAKIAkvKiBjbGVhciBpbnRlcnJ1cHQgYml0cyBpbiBzdGF0dXMgcmVnaXN0ZXIgKi8KLQlkbWFfd3JpdGVsKHBkLCBTVFMwLCBzdHMwKTsKKwlpZiAocmV0MCkKKwkJZG1hX3dyaXRlbChwZCwgU1RTMCwgc3RzMCk7CisJaWYgKHJldDIpCisJCWRtYV93cml0ZWwocGQsIFNUUzIsIHN0czIpOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gcmV0MCB8IHJldDI7CiB9CiAKICNpZmRlZglDT05GSUdfUE0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3BsMzMwLmMgYi9kcml2ZXJzL2RtYS9wbDMzMC5jCmluZGV4IDZhYmUxZWMuLjAwZWVlNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3BsMzMwLmMKKysrIGIvZHJpdmVycy9kbWEvcGwzMzAuYwpAQCAtODIsNyArODIsNyBAQAogCXNwaW5sb2NrX3QgcG9vbF9sb2NrOwogCiAJLyogUGVyaXBoZXJhbCBjaGFubmVscyBjb25uZWN0ZWQgdG8gdGhpcyBETUFDICovCi0Jc3RydWN0IGRtYV9wbDMzMF9jaGFuIHBlcmlwaGVyYWxzWzBdOyAvKiBrZWVwIGF0IGVuZCAqLworCXN0cnVjdCBkbWFfcGwzMzBfY2hhbiAqcGVyaXBoZXJhbHM7IC8qIGtlZXAgYXQgZW5kICovCiB9OwogCiBzdHJ1Y3QgZG1hX3BsMzMwX2Rlc2MgewpAQCAtNDUxLDggKzQ1MSwxMyBAQAogCWRlc2MtPnR4ZC5jb29raWUgPSAwOwogCWFzeW5jX3R4X2FjaygmZGVzYy0+dHhkKTsKIAotCWRlc2MtPnJlcS5ycXR5cGUgPSBwZXJpLT5ycXR5cGU7Ci0JZGVzYy0+cmVxLnBlcmkgPSBwZXJpLT5wZXJpX2lkOworCWlmIChwZXJpKSB7CisJCWRlc2MtPnJlcS5ycXR5cGUgPSBwZXJpLT5ycXR5cGU7CisJCWRlc2MtPnJlcS5wZXJpID0gcGVyaS0+cGVyaV9pZDsKKwl9IGVsc2UgeworCQlkZXNjLT5yZXEucnF0eXBlID0gTUVNVE9NRU07CisJCWRlc2MtPnJlcS5wZXJpID0gMDsKKwl9CiAKIAlkbWFfYXN5bmNfdHhfZGVzY3JpcHRvcl9pbml0KCZkZXNjLT50eGQsICZwY2gtPmNoYW4pOwogCkBAIC01MjksMTAgKzUzNCwxMCBAQAogCXN0cnVjdCBwbDMzMF9pbmZvICpwaTsKIAlpbnQgYnVyc3Q7CiAKLQlpZiAodW5saWtlbHkoIXBjaCB8fCAhbGVuIHx8ICFwZXJpKSkKKwlpZiAodW5saWtlbHkoIXBjaCB8fCAhbGVuKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlpZiAocGVyaS0+cnF0eXBlICE9IE1FTVRPTUVNKQorCWlmIChwZXJpICYmIHBlcmktPnJxdHlwZSAhPSBNRU1UT01FTSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlwaSA9ICZwY2gtPmRtYWMtPnBpZjsKQEAgLTU3Nyw3ICs1ODIsNyBAQAogCWludCBpLCBidXJzdF9zaXplOwogCWRtYV9hZGRyX3QgYWRkcjsKIAotCWlmICh1bmxpa2VseSghcGNoIHx8ICFzZ2wgfHwgIXNnX2xlbikpCisJaWYgKHVubGlrZWx5KCFwY2ggfHwgIXNnbCB8fCAhc2dfbGVuIHx8ICFwZXJpKSkKIAkJcmV0dXJuIE5VTEw7CiAKIAkvKiBNYWtlIHN1cmUgdGhlIGRpcmVjdGlvbiBpcyBjb25zaXN0ZW50ICovCkBAIC02NjYsMTcgKzY3MSwxMiBAQAogCXN0cnVjdCBkbWFfZGV2aWNlICpwZDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlpbnQgaSwgcmV0LCBpcnE7CisJaW50IG51bV9jaGFuOwogCiAJcGRhdCA9IGFkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwogCi0JaWYgKCFwZGF0IHx8ICFwZGF0LT5ucl92YWxpZF9wZXJpKSB7Ci0JCWRldl9lcnIoJmFkZXYtPmRldiwgInBsYXRmb3JtIGRhdGEgbWlzc2luZ1xuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQogCS8qIEFsbG9jYXRlIGEgbmV3IERNQUMgYW5kIGl0cyBDaGFubmVscyAqLwotCXBkbWFjID0ga3phbGxvYyhwZGF0LT5ucl92YWxpZF9wZXJpICogc2l6ZW9mKCpwY2gpCi0JCQkJKyBzaXplb2YoKnBkbWFjKSwgR0ZQX0tFUk5FTCk7CisJcGRtYWMgPSBremFsbG9jKHNpemVvZigqcGRtYWMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBkbWFjKSB7CiAJCWRldl9lcnIoJmFkZXYtPmRldiwgInVuYWJsZSB0byBhbGxvY2F0ZSBtZW1cbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTY4NSw3ICs2ODUsNyBAQAogCXBpID0gJnBkbWFjLT5waWY7CiAJcGktPmRldiA9ICZhZGV2LT5kZXY7CiAJcGktPnBsMzMwX2RhdGEgPSBOVUxMOwotCXBpLT5tY2J1ZnN6ID0gcGRhdC0+bWNidWZfc3o7CisJcGktPm1jYnVmc3ogPSBwZGF0ID8gcGRhdC0+bWNidWZfc3ogOiAwOwogCiAJcmVzID0gJmFkZXYtPnJlczsKIAlyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpLCAiZG1hLXBsMzMwIik7CkBAIC03MTcsMjcgKzcxNywzNSBAQAogCUlOSVRfTElTVF9IRUFEKCZwZC0+Y2hhbm5lbHMpOwogCiAJLyogSW5pdGlhbGl6ZSBjaGFubmVsIHBhcmFtZXRlcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcGRhdC0+bnJfdmFsaWRfcGVyaTsgaSsrKSB7Ci0JCXN0cnVjdCBkbWFfcGwzMzBfcGVyaSAqcGVyaSA9ICZwZGF0LT5wZXJpW2ldOwotCQlwY2ggPSAmcGRtYWMtPnBlcmlwaGVyYWxzW2ldOworCW51bV9jaGFuID0gbWF4KHBkYXQgPyBwZGF0LT5ucl92YWxpZF9wZXJpIDogMCwgKHU4KXBpLT5wY2ZnLm51bV9jaGFuKTsKKwlwZG1hYy0+cGVyaXBoZXJhbHMgPSBremFsbG9jKG51bV9jaGFuICogc2l6ZW9mKCpwY2gpLCBHRlBfS0VSTkVMKTsKIAotCQlzd2l0Y2ggKHBlcmktPnJxdHlwZSkgewotCQljYXNlIE1FTVRPTUVNOgorCWZvciAoaSA9IDA7IGkgPCBudW1fY2hhbjsgaSsrKSB7CisJCXBjaCA9ICZwZG1hYy0+cGVyaXBoZXJhbHNbaV07CisJCWlmIChwZGF0KSB7CisJCQlzdHJ1Y3QgZG1hX3BsMzMwX3BlcmkgKnBlcmkgPSAmcGRhdC0+cGVyaVtpXTsKKworCQkJc3dpdGNoIChwZXJpLT5ycXR5cGUpIHsKKwkJCWNhc2UgTUVNVE9NRU06CisJCQkJZG1hX2NhcF9zZXQoRE1BX01FTUNQWSwgcGQtPmNhcF9tYXNrKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgTUVNVE9ERVY6CisJCQljYXNlIERFVlRPTUVNOgorCQkJCWRtYV9jYXBfc2V0KERNQV9TTEFWRSwgcGQtPmNhcF9tYXNrKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZGV2X2VycigmYWRldi0+ZGV2LCAiREVWVE9ERVYgTm90IFN1cHBvcnRlZFxuIik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlwY2gtPmNoYW4ucHJpdmF0ZSA9IHBlcmk7CisJCX0gZWxzZSB7CiAJCQlkbWFfY2FwX3NldChETUFfTUVNQ1BZLCBwZC0+Y2FwX21hc2spOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUVNVE9ERVY6Ci0JCWNhc2UgREVWVE9NRU06Ci0JCQlkbWFfY2FwX3NldChETUFfU0xBVkUsIHBkLT5jYXBfbWFzayk7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWRldl9lcnIoJmFkZXYtPmRldiwgIkRFVlRPREVWIE5vdCBTdXBwb3J0ZWRcbiIpOwotCQkJY29udGludWU7CisJCQlwY2gtPmNoYW4ucHJpdmF0ZSA9IE5VTEw7CiAJCX0KIAogCQlJTklUX0xJU1RfSEVBRCgmcGNoLT53b3JrX2xpc3QpOwogCQlzcGluX2xvY2tfaW5pdCgmcGNoLT5sb2NrKTsKIAkJcGNoLT5wbDMzMF9jaGlkID0gTlVMTDsKLQkJcGNoLT5jaGFuLnByaXZhdGUgPSBwZXJpOwogCQlwY2gtPmNoYW4uZGV2aWNlID0gcGQ7CiAJCXBjaC0+Y2hhbi5jaGFuX2lkID0gaTsKIAkJcGNoLT5kbWFjID0gcGRtYWM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9zaGRtYS5jIGIvZHJpdmVycy9kbWEvc2hkbWEuYwppbmRleCAwMjgzMzAwLi43ZjQ5MjM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9zaGRtYS5jCisrKyBiL2RyaXZlcnMvZG1hL3NoZG1hLmMKQEAgLTcwLDEyICs3MCwzNiBAQAogCiBzdGF0aWMgdTE2IGRtYW9yX3JlYWQoc3RydWN0IHNoX2RtYWVfZGV2aWNlICpzaGRldikKIHsKLQlyZXR1cm4gX19yYXdfcmVhZHcoc2hkZXYtPmNoYW5fcmVnICsgRE1BT1IgLyBzaXplb2YodTMyKSk7CisJdTMyIF9faW9tZW0gKmFkZHIgPSBzaGRldi0+Y2hhbl9yZWcgKyBETUFPUiAvIHNpemVvZih1MzIpOworCisJaWYgKHNoZGV2LT5wZGF0YS0+ZG1hb3JfaXNfMzJiaXQpCisJCXJldHVybiBfX3Jhd19yZWFkbChhZGRyKTsKKwllbHNlCisJCXJldHVybiBfX3Jhd19yZWFkdyhhZGRyKTsKIH0KIAogc3RhdGljIHZvaWQgZG1hb3Jfd3JpdGUoc3RydWN0IHNoX2RtYWVfZGV2aWNlICpzaGRldiwgdTE2IGRhdGEpCiB7Ci0JX19yYXdfd3JpdGV3KGRhdGEsIHNoZGV2LT5jaGFuX3JlZyArIERNQU9SIC8gc2l6ZW9mKHUzMikpOworCXUzMiBfX2lvbWVtICphZGRyID0gc2hkZXYtPmNoYW5fcmVnICsgRE1BT1IgLyBzaXplb2YodTMyKTsKKworCWlmIChzaGRldi0+cGRhdGEtPmRtYW9yX2lzXzMyYml0KQorCQlfX3Jhd193cml0ZWwoZGF0YSwgYWRkcik7CisJZWxzZQorCQlfX3Jhd193cml0ZXcoZGF0YSwgYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIGNoY3Jfd3JpdGUoc3RydWN0IHNoX2RtYWVfY2hhbiAqc2hfZGMsIHUzMiBkYXRhKQoreworCXN0cnVjdCBzaF9kbWFlX2RldmljZSAqc2hkZXYgPSB0b19zaF9kZXYoc2hfZGMpOworCisJX19yYXdfd3JpdGVsKGRhdGEsIHNoX2RjLT5iYXNlICsgc2hkZXYtPmNoY3Jfb2Zmc2V0IC8gc2l6ZW9mKHUzMikpOworfQorCitzdGF0aWMgdTMyIGNoY3JfcmVhZChzdHJ1Y3Qgc2hfZG1hZV9jaGFuICpzaF9kYykKK3sKKwlzdHJ1Y3Qgc2hfZG1hZV9kZXZpY2UgKnNoZGV2ID0gdG9fc2hfZGV2KHNoX2RjKTsKKworCXJldHVybiBfX3Jhd19yZWFkbChzaF9kYy0+YmFzZSArIHNoZGV2LT5jaGNyX29mZnNldCAvIHNpemVvZih1MzIpKTsKIH0KIAogLyoKQEAgLTEyMCw3ICsxNDQsNyBAQAogCiBzdGF0aWMgYm9vbCBkbWFlX2lzX2J1c3koc3RydWN0IHNoX2RtYWVfY2hhbiAqc2hfY2hhbikKIHsKLQl1MzIgY2hjciA9IHNoX2RtYWVfcmVhZGwoc2hfY2hhbiwgQ0hDUik7CisJdTMyIGNoY3IgPSBjaGNyX3JlYWQoc2hfY2hhbik7CiAKIAlpZiAoKGNoY3IgJiAoQ0hDUl9ERSB8IENIQ1JfVEUpKSA9PSBDSENSX0RFKQogCQlyZXR1cm4gdHJ1ZTsgLyogd29ya2luZyAqLwpAQCAtMTMwLDggKzE1NCw3IEBACiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgY2FsY194bWl0X3NoaWZ0KHN0cnVjdCBzaF9kbWFlX2NoYW4gKnNoX2NoYW4sIHUzMiBjaGNyKQogewotCXN0cnVjdCBzaF9kbWFlX2RldmljZSAqc2hkZXYgPSBjb250YWluZXJfb2Yoc2hfY2hhbi0+Y29tbW9uLmRldmljZSwKLQkJCQkJCXN0cnVjdCBzaF9kbWFlX2RldmljZSwgY29tbW9uKTsKKwlzdHJ1Y3Qgc2hfZG1hZV9kZXZpY2UgKnNoZGV2ID0gdG9fc2hfZGV2KHNoX2NoYW4pOwogCXN0cnVjdCBzaF9kbWFlX3BkYXRhICpwZGF0YSA9IHNoZGV2LT5wZGF0YTsKIAlpbnQgY250ID0gKChjaGNyICYgcGRhdGEtPnRzX2xvd19tYXNrKSA+PiBwZGF0YS0+dHNfbG93X3NoaWZ0KSB8CiAJCSgoY2hjciAmIHBkYXRhLT50c19oaWdoX21hc2spID4+IHBkYXRhLT50c19oaWdoX3NoaWZ0KTsKQEAgLTE0NCw4ICsxNjcsNyBAQAogCiBzdGF0aWMgdTMyIGxvZzJzaXplX3RvX2NoY3Ioc3RydWN0IHNoX2RtYWVfY2hhbiAqc2hfY2hhbiwgaW50IGwyc2l6ZSkKIHsKLQlzdHJ1Y3Qgc2hfZG1hZV9kZXZpY2UgKnNoZGV2ID0gY29udGFpbmVyX29mKHNoX2NoYW4tPmNvbW1vbi5kZXZpY2UsCi0JCQkJCQlzdHJ1Y3Qgc2hfZG1hZV9kZXZpY2UsIGNvbW1vbik7CisJc3RydWN0IHNoX2RtYWVfZGV2aWNlICpzaGRldiA9IHRvX3NoX2RldihzaF9jaGFuKTsKIAlzdHJ1Y3Qgc2hfZG1hZV9wZGF0YSAqcGRhdGEgPSBzaGRldi0+cGRhdGE7CiAJaW50IGk7CiAKQEAgLTE2OSwxOCArMTkxLDIzIEBACiAKIHN0YXRpYyB2b2lkIGRtYWVfc3RhcnQoc3RydWN0IHNoX2RtYWVfY2hhbiAqc2hfY2hhbikKIHsKLQl1MzIgY2hjciA9IHNoX2RtYWVfcmVhZGwoc2hfY2hhbiwgQ0hDUik7CisJc3RydWN0IHNoX2RtYWVfZGV2aWNlICpzaGRldiA9IHRvX3NoX2RldihzaF9jaGFuKTsKKwl1MzIgY2hjciA9IGNoY3JfcmVhZChzaF9jaGFuKTsKIAotCWNoY3IgfD0gQ0hDUl9ERSB8IENIQ1JfSUU7Ci0Jc2hfZG1hZV93cml0ZWwoc2hfY2hhbiwgY2hjciAmIH5DSENSX1RFLCBDSENSKTsKKwlpZiAoc2hkZXYtPnBkYXRhLT5uZWVkc190ZW5kX3NldCkKKwkJc2hfZG1hZV93cml0ZWwoc2hfY2hhbiwgMHhGRkZGRkZGRiwgVEVORCk7CisKKwljaGNyIHw9IENIQ1JfREUgfCBzaGRldi0+Y2hjcl9pZV9iaXQ7CisJY2hjcl93cml0ZShzaF9jaGFuLCBjaGNyICYgfkNIQ1JfVEUpOwogfQogCiBzdGF0aWMgdm9pZCBkbWFlX2hhbHQoc3RydWN0IHNoX2RtYWVfY2hhbiAqc2hfY2hhbikKIHsKLQl1MzIgY2hjciA9IHNoX2RtYWVfcmVhZGwoc2hfY2hhbiwgQ0hDUik7CisJc3RydWN0IHNoX2RtYWVfZGV2aWNlICpzaGRldiA9IHRvX3NoX2RldihzaF9jaGFuKTsKKwl1MzIgY2hjciA9IGNoY3JfcmVhZChzaF9jaGFuKTsKIAotCWNoY3IgJj0gfihDSENSX0RFIHwgQ0hDUl9URSB8IENIQ1JfSUUpOwotCXNoX2RtYWVfd3JpdGVsKHNoX2NoYW4sIGNoY3IsIENIQ1IpOworCWNoY3IgJj0gfihDSENSX0RFIHwgQ0hDUl9URSB8IHNoZGV2LT5jaGNyX2llX2JpdCk7CisJY2hjcl93cml0ZShzaF9jaGFuLCBjaGNyKTsKIH0KIAogc3RhdGljIHZvaWQgZG1hZV9pbml0KHN0cnVjdCBzaF9kbWFlX2NoYW4gKnNoX2NoYW4pCkBAIC0xOTIsNyArMjE5LDcgQEAKIAl1MzIgY2hjciA9IERNX0lOQyB8IFNNX0lOQyB8IDB4NDAwIHwgbG9nMnNpemVfdG9fY2hjcihzaF9jaGFuLAogCQkJCQkJICAgTE9HMl9ERUZBVUxUX1hGRVJfU0laRSk7CiAJc2hfY2hhbi0+eG1pdF9zaGlmdCA9IGNhbGNfeG1pdF9zaGlmdChzaF9jaGFuLCBjaGNyKTsKLQlzaF9kbWFlX3dyaXRlbChzaF9jaGFuLCBjaGNyLCBDSENSKTsKKwljaGNyX3dyaXRlKHNoX2NoYW4sIGNoY3IpOwogfQogCiBzdGF0aWMgaW50IGRtYWVfc2V0X2NoY3Ioc3RydWN0IHNoX2RtYWVfY2hhbiAqc2hfY2hhbiwgdTMyIHZhbCkKQEAgLTIwMiwyMyArMjI5LDI1IEBACiAJCXJldHVybiAtRUJVU1k7CiAKIAlzaF9jaGFuLT54bWl0X3NoaWZ0ID0gY2FsY194bWl0X3NoaWZ0KHNoX2NoYW4sIHZhbCk7Ci0Jc2hfZG1hZV93cml0ZWwoc2hfY2hhbiwgdmFsLCBDSENSKTsKKwljaGNyX3dyaXRlKHNoX2NoYW4sIHZhbCk7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBkbWFlX3NldF9kbWFycyhzdHJ1Y3Qgc2hfZG1hZV9jaGFuICpzaF9jaGFuLCB1MTYgdmFsKQogewotCXN0cnVjdCBzaF9kbWFlX2RldmljZSAqc2hkZXYgPSBjb250YWluZXJfb2Yoc2hfY2hhbi0+Y29tbW9uLmRldmljZSwKLQkJCQkJCXN0cnVjdCBzaF9kbWFlX2RldmljZSwgY29tbW9uKTsKKwlzdHJ1Y3Qgc2hfZG1hZV9kZXZpY2UgKnNoZGV2ID0gdG9fc2hfZGV2KHNoX2NoYW4pOwogCXN0cnVjdCBzaF9kbWFlX3BkYXRhICpwZGF0YSA9IHNoZGV2LT5wZGF0YTsKIAljb25zdCBzdHJ1Y3Qgc2hfZG1hZV9jaGFubmVsICpjaGFuX3BkYXRhID0gJnBkYXRhLT5jaGFubmVsW3NoX2NoYW4tPmlkXTsKIAl1MTYgX19pb21lbSAqYWRkciA9IHNoZGV2LT5kbWFyczsKLQlpbnQgc2hpZnQgPSBjaGFuX3BkYXRhLT5kbWFyc19iaXQ7CisJdW5zaWduZWQgaW50IHNoaWZ0ID0gY2hhbl9wZGF0YS0+ZG1hcnNfYml0OwogCiAJaWYgKGRtYWVfaXNfYnVzeShzaF9jaGFuKSkKIAkJcmV0dXJuIC1FQlVTWTsKIAorCWlmIChwZGF0YS0+bm9fZG1hcnMpCisJCXJldHVybiAwOworCiAJLyogaW4gdGhlIGNhc2Ugb2YgYSBtaXNzaW5nIERNQVJTIHJlc291cmNlIHVzZSBmaXJzdCBtZW1vcnkgd2luZG93ICovCiAJaWYgKCFhZGRyKQogCQlhZGRyID0gKHUxNiBfX2lvbWVtICopc2hkZXYtPmNoYW5fcmVnOwpAQCAtMjk2LDkgKzMyNSw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHNoX2RtYWVfc2xhdmVfY29uZmlnICpzaF9kbWFlX2ZpbmRfc2xhdmUoCiAJc3RydWN0IHNoX2RtYWVfY2hhbiAqc2hfY2hhbiwgc3RydWN0IHNoX2RtYWVfc2xhdmUgKnBhcmFtKQogewotCXN0cnVjdCBkbWFfZGV2aWNlICpkbWFfZGV2ID0gc2hfY2hhbi0+Y29tbW9uLmRldmljZTsKLQlzdHJ1Y3Qgc2hfZG1hZV9kZXZpY2UgKnNoZGV2ID0gY29udGFpbmVyX29mKGRtYV9kZXYsCi0JCQkJCXN0cnVjdCBzaF9kbWFlX2RldmljZSwgY29tbW9uKTsKKwlzdHJ1Y3Qgc2hfZG1hZV9kZXZpY2UgKnNoZGV2ID0gdG9fc2hfZGV2KHNoX2NoYW4pOwogCXN0cnVjdCBzaF9kbWFlX3BkYXRhICpwZGF0YSA9IHNoZGV2LT5wZGF0YTsKIAlpbnQgaTsKIApAQCAtNzcxLDEwICs3OTgsOCBAQAogCiAJc3Bpbl9sb2NrX2JoKCZzaF9jaGFuLT5kZXNjX2xvY2spOwogCS8qIERNQSB3b3JrIGNoZWNrICovCi0JaWYgKGRtYWVfaXNfYnVzeShzaF9jaGFuKSkgewotCQlzcGluX3VubG9ja19iaCgmc2hfY2hhbi0+ZGVzY19sb2NrKTsKLQkJcmV0dXJuOwotCX0KKwlpZiAoZG1hZV9pc19idXN5KHNoX2NoYW4pKQorCQlnb3RvIHNoX2NoYW5feGZlcl9sZF9xdWV1ZV9lbmQ7CiAKIAkvKiBGaW5kIHRoZSBmaXJzdCBub3QgdHJhbnNmZXJyZWQgZGVzY3JpcHRvciAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVzYywgJnNoX2NoYW4tPmxkX3F1ZXVlLCBub2RlKQpAQCAtNzg4LDYgKzgxMyw3IEBACiAJCQlicmVhazsKIAkJfQogCitzaF9jaGFuX3hmZXJfbGRfcXVldWVfZW5kOgogCXNwaW5fdW5sb2NrX2JoKCZzaF9jaGFuLT5kZXNjX2xvY2spOwogfQogCkBAIC04NDYsNyArODcyLDcgQEAKIAogCXNwaW5fbG9jaygmc2hfY2hhbi0+ZGVzY19sb2NrKTsKIAotCWNoY3IgPSBzaF9kbWFlX3JlYWRsKHNoX2NoYW4sIENIQ1IpOworCWNoY3IgPSBjaGNyX3JlYWQoc2hfY2hhbik7CiAKIAlpZiAoY2hjciAmIENIQ1JfVEUpIHsKIAkJLyogRE1BIHN0b3AgKi8KQEAgLTExNDQsNiArMTE3MCwxNiBAQAogCS8qIHBsYXRmb3JtIGRhdGEgKi8KIAlzaGRldi0+cGRhdGEgPSBwZGF0YTsKIAorCWlmIChwZGF0YS0+Y2hjcl9vZmZzZXQpCisJCXNoZGV2LT5jaGNyX29mZnNldCA9IHBkYXRhLT5jaGNyX29mZnNldDsKKwllbHNlCisJCXNoZGV2LT5jaGNyX29mZnNldCA9IENIQ1I7CisKKwlpZiAocGRhdGEtPmNoY3JfaWVfYml0KQorCQlzaGRldi0+Y2hjcl9pZV9iaXQgPSBwZGF0YS0+Y2hjcl9pZV9iaXQ7CisJZWxzZQorCQlzaGRldi0+Y2hjcl9pZV9iaXQgPSBDSENSX0lFOworCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgc2hkZXYpOwogCiAJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9zaGRtYS5oIGIvZHJpdmVycy9kbWEvc2hkbWEuaAppbmRleCA1YWU5ZmM1MS4uZGM1NjU3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvc2hkbWEuaAorKysgYi9kcml2ZXJzL2RtYS9zaGRtYS5oCkBAIC00NywxMCArNDcsMTQgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CiAJdTMyIF9faW9tZW0gKmNoYW5fcmVnOwogCXUxNiBfX2lvbWVtICpkbWFyczsKKwl1bnNpZ25lZCBpbnQgY2hjcl9vZmZzZXQ7CisJdTMyIGNoY3JfaWVfYml0OwogfTsKIAogI2RlZmluZSB0b19zaF9jaGFuKGNoYW4pIGNvbnRhaW5lcl9vZihjaGFuLCBzdHJ1Y3Qgc2hfZG1hZV9jaGFuLCBjb21tb24pCiAjZGVmaW5lIHRvX3NoX2Rlc2MobGgpIGNvbnRhaW5lcl9vZihsaCwgc3RydWN0IHNoX2Rlc2MsIG5vZGUpCiAjZGVmaW5lIHR4X3RvX3NoX2Rlc2ModHgpIGNvbnRhaW5lcl9vZih0eCwgc3RydWN0IHNoX2Rlc2MsIGFzeW5jX3R4KQorI2RlZmluZSB0b19zaF9kZXYoY2hhbikgY29udGFpbmVyX29mKGNoYW4tPmNvbW1vbi5kZXZpY2UsXAorCQkJCSAgICAgc3RydWN0IHNoX2RtYWVfZGV2aWNlLCBjb21tb24pCiAKICNlbmRpZgkvKiBfX0RNQV9TSERNQV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9zdGVfZG1hNDAuYyBiL2RyaXZlcnMvZG1hL3N0ZV9kbWE0MC5jCmluZGV4IDI5ZDFhZGQuLmNkM2E3YzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1hL3N0ZV9kbWE0MC5jCisrKyBiL2RyaXZlcnMvZG1hL3N0ZV9kbWE0MC5jCkBAIC0xNCw2ICsxNCw3IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9hbWJhL2J1cy5oPgogCiAjaW5jbHVkZSA8cGxhdC9zdGVfZG1hNDAuaD4KIApAQCAtNDUsOSArNDYsNiBAQAogI2RlZmluZSBENDBfQUxMT0NfUEhZCQkoMSA8PCAzMCkKICNkZWZpbmUgRDQwX0FMTE9DX0xPR19GUkVFCTAKIAotLyogSGFyZHdhcmUgZGVzaWduZXIgb2YgdGhlIGJsb2NrICovCi0jZGVmaW5lIEQ0MF9IV19ERVNJR05FUiAweDgKLQogLyoqCiAgKiBlbnVtIDQwX2NvbW1hbmQgLSBUaGUgZGlmZmVyZW50IGNvbW1hbmRzIGFuZC9vciBzdGF0dXNlcy4KICAqCkBAIC0xODYsNiArMTg0LDggQEAKICAqIEBsb2dfZGVmOiBEZWZhdWx0IGxvZ2ljYWwgY2hhbm5lbCBzZXR0aW5ncy4KICAqIEBsY2xhOiBTcGFjZSBmb3Igb25lIGRzdCBzcmMgcGFpciBmb3IgbG9naWNhbCBjaGFubmVsIHRyYW5zZmVycy4KICAqIEBsY3BhOiBQb2ludGVyIHRvIGRzdCBhbmQgc3JjIGxjcGEgc2V0dGluZ3MuCisgKiBAcnVudGltZV9hZGRyOiBydW50aW1lIGNvbmZpZ3VyZWQgYWRkcmVzcy4KKyAqIEBydW50aW1lX2RpcmVjdGlvbjogcnVudGltZSBjb25maWd1cmVkIGRpcmVjdGlvbi4KICAqCiAgKiBUaGlzIHN0cnVjdCBjYW4gZWl0aGVyICJiZSIgYSBsb2dpY2FsIG9yIGEgcGh5c2ljYWwgY2hhbm5lbC4KICAqLwpAQCAtMjAwLDYgKzIwMCw3IEBACiAJc3RydWN0IGRtYV9jaGFuCQkJIGNoYW47CiAJc3RydWN0IHRhc2tsZXRfc3RydWN0CQkgdGFza2xldDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCQkgY2xpZW50OworCXN0cnVjdCBsaXN0X2hlYWQJCSBwZW5kaW5nX3F1ZXVlOwogCXN0cnVjdCBsaXN0X2hlYWQJCSBhY3RpdmU7CiAJc3RydWN0IGxpc3RfaGVhZAkJIHF1ZXVlOwogCXN0cnVjdCBzdGVkbWE0MF9jaGFuX2NmZwkgZG1hX2NmZzsKQEAgLTY0NSw3ICs2NDYsMjAgQEAKIAogc3RhdGljIHZvaWQgZDQwX2Rlc2NfcXVldWUoc3RydWN0IGQ0MF9jaGFuICpkNDBjLCBzdHJ1Y3QgZDQwX2Rlc2MgKmRlc2MpCiB7Ci0JbGlzdF9hZGRfdGFpbCgmZGVzYy0+bm9kZSwgJmQ0MGMtPnF1ZXVlKTsKKwlsaXN0X2FkZF90YWlsKCZkZXNjLT5ub2RlLCAmZDQwYy0+cGVuZGluZ19xdWV1ZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZDQwX2Rlc2MgKmQ0MF9maXJzdF9wZW5kaW5nKHN0cnVjdCBkNDBfY2hhbiAqZDQwYykKK3sKKwlzdHJ1Y3QgZDQwX2Rlc2MgKmQ7CisKKwlpZiAobGlzdF9lbXB0eSgmZDQwYy0+cGVuZGluZ19xdWV1ZSkpCisJCXJldHVybiBOVUxMOworCisJZCA9IGxpc3RfZmlyc3RfZW50cnkoJmQ0MGMtPnBlbmRpbmdfcXVldWUsCisJCQkgICAgIHN0cnVjdCBkNDBfZGVzYywKKwkJCSAgICAgbm9kZSk7CisJcmV0dXJuIGQ7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZDQwX2Rlc2MgKmQ0MF9maXJzdF9xdWV1ZWQoc3RydWN0IGQ0MF9jaGFuICpkNDBjKQpAQCAtODAyLDYgKzgxNiwxMSBAQAogCQlkNDBfZGVzY19mcmVlKGQ0MGMsIGQ0MGQpOwogCX0KIAorCS8qIFJlbGVhc2UgcGVuZGluZyBkZXNjcmlwdG9ycyAqLworCXdoaWxlICgoZDQwZCA9IGQ0MF9maXJzdF9wZW5kaW5nKGQ0MGMpKSkgeworCQlkNDBfZGVzY19yZW1vdmUoZDQwZCk7CisJCWQ0MF9kZXNjX2ZyZWUoZDQwYywgZDQwZCk7CisJfQogCiAJZDQwYy0+cGVuZGluZ190eCA9IDA7CiAJZDQwYy0+YnVzeSA9IGZhbHNlOwpAQCAtMjA5Miw3ICsyMTExLDcgQEAKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwogCWludCBpOwogCi0Jc2cgPSBrY2FsbG9jKHBlcmlvZHMgKyAxLCBzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KSwgR0ZQX0tFUk5FTCk7CisJc2cgPSBrY2FsbG9jKHBlcmlvZHMgKyAxLCBzaXplb2Yoc3RydWN0IHNjYXR0ZXJsaXN0KSwgR0ZQX05PV0FJVCk7CiAJZm9yIChpID0gMDsgaSA8IHBlcmlvZHM7IGkrKykgewogCQlzZ19kbWFfYWRkcmVzcygmc2dbaV0pID0gZG1hX2FkZHI7CiAJCXNnX2RtYV9sZW4oJnNnW2ldKSA9IHBlcmlvZF9sZW47CkBAIC0yMTUyLDI0ICsyMTcxLDg3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZDQwYy0+bG9jaywgZmxhZ3MpOwogCi0JLyogQnVzeSBtZWFucyB0aGF0IHBlbmRpbmcgam9icyBhcmUgYWxyZWFkeSBiZWluZyBwcm9jZXNzZWQgKi8KKwlsaXN0X3NwbGljZV90YWlsX2luaXQoJmQ0MGMtPnBlbmRpbmdfcXVldWUsICZkNDBjLT5xdWV1ZSk7CisKKwkvKiBCdXN5IG1lYW5zIHRoYXQgcXVldWVkIGpvYnMgYXJlIGFscmVhZHkgYmVpbmcgcHJvY2Vzc2VkICovCiAJaWYgKCFkNDBjLT5idXN5KQogCQkodm9pZCkgZDQwX3F1ZXVlX3N0YXJ0KGQ0MGMpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZDQwYy0+bG9jaywgZmxhZ3MpOwogfQogCitzdGF0aWMgaW50CitkbWE0MF9jb25maWdfdG9faGFsZmNoYW5uZWwoc3RydWN0IGQ0MF9jaGFuICpkNDBjLAorCQkJICAgIHN0cnVjdCBzdGVkbWE0MF9oYWxmX2NoYW5uZWxfaW5mbyAqaW5mbywKKwkJCSAgICBlbnVtIGRtYV9zbGF2ZV9idXN3aWR0aCB3aWR0aCwKKwkJCSAgICB1MzIgbWF4YnVyc3QpCit7CisJZW51bSBzdGVkbWE0MF9wZXJpcGhfZGF0YV93aWR0aCBhZGRyX3dpZHRoOworCWludCBwc2l6ZTsKKworCXN3aXRjaCAod2lkdGgpIHsKKwljYXNlIERNQV9TTEFWRV9CVVNXSURUSF8xX0JZVEU6CisJCWFkZHJfd2lkdGggPSBTVEVETUE0MF9CWVRFX1dJRFRIOworCQlicmVhazsKKwljYXNlIERNQV9TTEFWRV9CVVNXSURUSF8yX0JZVEVTOgorCQlhZGRyX3dpZHRoID0gU1RFRE1BNDBfSEFMRldPUkRfV0lEVEg7CisJCWJyZWFrOworCWNhc2UgRE1BX1NMQVZFX0JVU1dJRFRIXzRfQllURVM6CisJCWFkZHJfd2lkdGggPSBTVEVETUE0MF9XT1JEX1dJRFRIOworCQlicmVhazsKKwljYXNlIERNQV9TTEFWRV9CVVNXSURUSF84X0JZVEVTOgorCQlhZGRyX3dpZHRoID0gU1RFRE1BNDBfRE9VQkxFV09SRF9XSURUSDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihkNDBjLT5iYXNlLT5kZXYsCisJCQkiaWxsZWdhbCBwZXJpcGhlcmFsIGFkZHJlc3Mgd2lkdGggIgorCQkJInJlcXVlc3RlZCAoJWQpXG4iLAorCQkJd2lkdGgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY2hhbl9pc19sb2dpY2FsKGQ0MGMpKSB7CisJCWlmIChtYXhidXJzdCA+PSAxNikKKwkJCXBzaXplID0gU1RFRE1BNDBfUFNJWkVfTE9HXzE2OworCQllbHNlIGlmIChtYXhidXJzdCA+PSA4KQorCQkJcHNpemUgPSBTVEVETUE0MF9QU0laRV9MT0dfODsKKwkJZWxzZSBpZiAobWF4YnVyc3QgPj0gNCkKKwkJCXBzaXplID0gU1RFRE1BNDBfUFNJWkVfTE9HXzQ7CisJCWVsc2UKKwkJCXBzaXplID0gU1RFRE1BNDBfUFNJWkVfTE9HXzE7CisJfSBlbHNlIHsKKwkJaWYgKG1heGJ1cnN0ID49IDE2KQorCQkJcHNpemUgPSBTVEVETUE0MF9QU0laRV9QSFlfMTY7CisJCWVsc2UgaWYgKG1heGJ1cnN0ID49IDgpCisJCQlwc2l6ZSA9IFNURURNQTQwX1BTSVpFX1BIWV84OworCQllbHNlIGlmIChtYXhidXJzdCA+PSA0KQorCQkJcHNpemUgPSBTVEVETUE0MF9QU0laRV9QSFlfNDsKKwkJZWxzZQorCQkJcHNpemUgPSBTVEVETUE0MF9QU0laRV9QSFlfMTsKKwl9CisKKwlpbmZvLT5kYXRhX3dpZHRoID0gYWRkcl93aWR0aDsKKwlpbmZvLT5wc2l6ZSA9IHBzaXplOworCWluZm8tPmZsb3dfY3RybCA9IFNURURNQTQwX05PX0ZMT1dfQ1RSTDsKKworCXJldHVybiAwOworfQorCiAvKiBSdW50aW1lIHJlY29uZmlndXJhdGlvbiBleHRlbnNpb24gKi8KLXN0YXRpYyB2b2lkIGQ0MF9zZXRfcnVudGltZV9jb25maWcoc3RydWN0IGRtYV9jaGFuICpjaGFuLAotCQkJICAgICAgIHN0cnVjdCBkbWFfc2xhdmVfY29uZmlnICpjb25maWcpCitzdGF0aWMgaW50IGQ0MF9zZXRfcnVudGltZV9jb25maWcoc3RydWN0IGRtYV9jaGFuICpjaGFuLAorCQkJCSAgc3RydWN0IGRtYV9zbGF2ZV9jb25maWcgKmNvbmZpZykKIHsKIAlzdHJ1Y3QgZDQwX2NoYW4gKmQ0MGMgPSBjb250YWluZXJfb2YoY2hhbiwgc3RydWN0IGQ0MF9jaGFuLCBjaGFuKTsKIAlzdHJ1Y3Qgc3RlZG1hNDBfY2hhbl9jZmcgKmNmZyA9ICZkNDBjLT5kbWFfY2ZnOwotCWVudW0gZG1hX3NsYXZlX2J1c3dpZHRoIGNvbmZpZ19hZGRyX3dpZHRoOworCWVudW0gZG1hX3NsYXZlX2J1c3dpZHRoIHNyY19hZGRyX3dpZHRoLCBkc3RfYWRkcl93aWR0aDsKIAlkbWFfYWRkcl90IGNvbmZpZ19hZGRyOwotCXUzMiBjb25maWdfbWF4YnVyc3Q7Ci0JZW51bSBzdGVkbWE0MF9wZXJpcGhfZGF0YV93aWR0aCBhZGRyX3dpZHRoOwotCWludCBwc2l6ZTsKKwl1MzIgc3JjX21heGJ1cnN0LCBkc3RfbWF4YnVyc3Q7CisJaW50IHJldDsKKworCXNyY19hZGRyX3dpZHRoID0gY29uZmlnLT5zcmNfYWRkcl93aWR0aDsKKwlzcmNfbWF4YnVyc3QgPSBjb25maWctPnNyY19tYXhidXJzdDsKKwlkc3RfYWRkcl93aWR0aCA9IGNvbmZpZy0+ZHN0X2FkZHJfd2lkdGg7CisJZHN0X21heGJ1cnN0ID0gY29uZmlnLT5kc3RfbWF4YnVyc3Q7CiAKIAlpZiAoY29uZmlnLT5kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKSB7CiAJCWRtYV9hZGRyX3QgZGV2X2FkZHJfcnggPQpAQCAtMjE4OCw4ICsyMjcwLDExIEBACiAJCQkJY2ZnLT5kaXIpOwogCQljZmctPmRpciA9IFNURURNQTQwX1BFUklQSF9UT19NRU07CiAKLQkJY29uZmlnX2FkZHJfd2lkdGggPSBjb25maWctPnNyY19hZGRyX3dpZHRoOwotCQljb25maWdfbWF4YnVyc3QgPSBjb25maWctPnNyY19tYXhidXJzdDsKKwkJLyogQ29uZmlndXJlIHRoZSBtZW1vcnkgc2lkZSAqLworCQlpZiAoZHN0X2FkZHJfd2lkdGggPT0gRE1BX1NMQVZFX0JVU1dJRFRIX1VOREVGSU5FRCkKKwkJCWRzdF9hZGRyX3dpZHRoID0gc3JjX2FkZHJfd2lkdGg7CisJCWlmIChkc3RfbWF4YnVyc3QgPT0gMCkKKwkJCWRzdF9tYXhidXJzdCA9IHNyY19tYXhidXJzdDsKIAogCX0gZWxzZSBpZiAoY29uZmlnLT5kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkgewogCQlkbWFfYWRkcl90IGRldl9hZGRyX3R4ID0KQEAgLTIyMDgsNjggKzIyOTMsMzkgQEAKIAkJCQljZmctPmRpcik7CiAJCWNmZy0+ZGlyID0gU1RFRE1BNDBfTUVNX1RPX1BFUklQSDsKIAotCQljb25maWdfYWRkcl93aWR0aCA9IGNvbmZpZy0+ZHN0X2FkZHJfd2lkdGg7Ci0JCWNvbmZpZ19tYXhidXJzdCA9IGNvbmZpZy0+ZHN0X21heGJ1cnN0OwotCisJCS8qIENvbmZpZ3VyZSB0aGUgbWVtb3J5IHNpZGUgKi8KKwkJaWYgKHNyY19hZGRyX3dpZHRoID09IERNQV9TTEFWRV9CVVNXSURUSF9VTkRFRklORUQpCisJCQlzcmNfYWRkcl93aWR0aCA9IGRzdF9hZGRyX3dpZHRoOworCQlpZiAoc3JjX21heGJ1cnN0ID09IDApCisJCQlzcmNfbWF4YnVyc3QgPSBkc3RfbWF4YnVyc3Q7CiAJfSBlbHNlIHsKIAkJZGV2X2VycihkNDBjLT5iYXNlLT5kZXYsCiAJCQkidW5yZWNvZ25pemVkIGNoYW5uZWwgZGlyZWN0aW9uICVkXG4iLAogCQkJY29uZmlnLT5kaXJlY3Rpb24pOwotCQlyZXR1cm47CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXN3aXRjaCAoY29uZmlnX2FkZHJfd2lkdGgpIHsKLQljYXNlIERNQV9TTEFWRV9CVVNXSURUSF8xX0JZVEU6Ci0JCWFkZHJfd2lkdGggPSBTVEVETUE0MF9CWVRFX1dJRFRIOwotCQlicmVhazsKLQljYXNlIERNQV9TTEFWRV9CVVNXSURUSF8yX0JZVEVTOgotCQlhZGRyX3dpZHRoID0gU1RFRE1BNDBfSEFMRldPUkRfV0lEVEg7Ci0JCWJyZWFrOwotCWNhc2UgRE1BX1NMQVZFX0JVU1dJRFRIXzRfQllURVM6Ci0JCWFkZHJfd2lkdGggPSBTVEVETUE0MF9XT1JEX1dJRFRIOwotCQlicmVhazsKLQljYXNlIERNQV9TTEFWRV9CVVNXSURUSF84X0JZVEVTOgotCQlhZGRyX3dpZHRoID0gU1RFRE1BNDBfRE9VQkxFV09SRF9XSURUSDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKKwlpZiAoc3JjX21heGJ1cnN0ICogc3JjX2FkZHJfd2lkdGggIT0gZHN0X21heGJ1cnN0ICogZHN0X2FkZHJfd2lkdGgpIHsKIAkJZGV2X2VycihkNDBjLT5iYXNlLT5kZXYsCi0JCQkiaWxsZWdhbCBwZXJpcGhlcmFsIGFkZHJlc3Mgd2lkdGggIgotCQkJInJlcXVlc3RlZCAoJWQpXG4iLAotCQkJY29uZmlnLT5zcmNfYWRkcl93aWR0aCk7Ci0JCXJldHVybjsKKwkJCSJzcmMvZHN0IHdpZHRoL21heGJ1cnN0IG1pc21hdGNoOiAlZColZCAhPSAlZColZFxuIiwKKwkJCXNyY19tYXhidXJzdCwKKwkJCXNyY19hZGRyX3dpZHRoLAorCQkJZHN0X21heGJ1cnN0LAorCQkJZHN0X2FkZHJfd2lkdGgpOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZiAoY2hhbl9pc19sb2dpY2FsKGQ0MGMpKSB7Ci0JCWlmIChjb25maWdfbWF4YnVyc3QgPj0gMTYpCi0JCQlwc2l6ZSA9IFNURURNQTQwX1BTSVpFX0xPR18xNjsKLQkJZWxzZSBpZiAoY29uZmlnX21heGJ1cnN0ID49IDgpCi0JCQlwc2l6ZSA9IFNURURNQTQwX1BTSVpFX0xPR184OwotCQllbHNlIGlmIChjb25maWdfbWF4YnVyc3QgPj0gNCkKLQkJCXBzaXplID0gU1RFRE1BNDBfUFNJWkVfTE9HXzQ7Ci0JCWVsc2UKLQkJCXBzaXplID0gU1RFRE1BNDBfUFNJWkVfTE9HXzE7Ci0JfSBlbHNlIHsKLQkJaWYgKGNvbmZpZ19tYXhidXJzdCA+PSAxNikKLQkJCXBzaXplID0gU1RFRE1BNDBfUFNJWkVfUEhZXzE2OwotCQllbHNlIGlmIChjb25maWdfbWF4YnVyc3QgPj0gOCkKLQkJCXBzaXplID0gU1RFRE1BNDBfUFNJWkVfUEhZXzg7Ci0JCWVsc2UgaWYgKGNvbmZpZ19tYXhidXJzdCA+PSA0KQotCQkJcHNpemUgPSBTVEVETUE0MF9QU0laRV9QSFlfNDsKLQkJZWxzZSBpZiAoY29uZmlnX21heGJ1cnN0ID49IDIpCi0JCQlwc2l6ZSA9IFNURURNQTQwX1BTSVpFX1BIWV8yOwotCQllbHNlCi0JCQlwc2l6ZSA9IFNURURNQTQwX1BTSVpFX1BIWV8xOwotCX0KKwlyZXQgPSBkbWE0MF9jb25maWdfdG9faGFsZmNoYW5uZWwoZDQwYywgJmNmZy0+c3JjX2luZm8sCisJCQkJCSAgc3JjX2FkZHJfd2lkdGgsCisJCQkJCSAgc3JjX21heGJ1cnN0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCi0JLyogU2V0IHVwIGFsbCB0aGUgZW5kcG9pbnQgY29uZmlncyAqLwotCWNmZy0+c3JjX2luZm8uZGF0YV93aWR0aCA9IGFkZHJfd2lkdGg7Ci0JY2ZnLT5zcmNfaW5mby5wc2l6ZSA9IHBzaXplOwotCWNmZy0+c3JjX2luZm8uYmlnX2VuZGlhbiA9IGZhbHNlOwotCWNmZy0+c3JjX2luZm8uZmxvd19jdHJsID0gU1RFRE1BNDBfTk9fRkxPV19DVFJMOwotCWNmZy0+ZHN0X2luZm8uZGF0YV93aWR0aCA9IGFkZHJfd2lkdGg7Ci0JY2ZnLT5kc3RfaW5mby5wc2l6ZSA9IHBzaXplOwotCWNmZy0+ZHN0X2luZm8uYmlnX2VuZGlhbiA9IGZhbHNlOwotCWNmZy0+ZHN0X2luZm8uZmxvd19jdHJsID0gU1RFRE1BNDBfTk9fRkxPV19DVFJMOworCXJldCA9IGRtYTQwX2NvbmZpZ190b19oYWxmY2hhbm5lbChkNDBjLCAmY2ZnLT5kc3RfaW5mbywKKwkJCQkJICBkc3RfYWRkcl93aWR0aCwKKwkJCQkJICBkc3RfbWF4YnVyc3QpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAkvKiBGaWxsIGluIHJlZ2lzdGVyIHZhbHVlcyAqLwogCWlmIChjaGFuX2lzX2xvZ2ljYWwoZDQwYykpCkBAIC0yMjgyLDEyICsyMzM4LDE0IEBACiAJZDQwYy0+cnVudGltZV9hZGRyID0gY29uZmlnX2FkZHI7CiAJZDQwYy0+cnVudGltZV9kaXJlY3Rpb24gPSBjb25maWctPmRpcmVjdGlvbjsKIAlkZXZfZGJnKGQ0MGMtPmJhc2UtPmRldiwKLQkJImNvbmZpZ3VyZWQgY2hhbm5lbCAlcyBmb3IgJXMsIGRhdGEgd2lkdGggJWQsICIKLQkJIm1heGJ1cnN0ICVkIGJ5dGVzLCBMRSwgbm8gZmxvdyBjb250cm9sXG4iLAorCQkiY29uZmlndXJlZCBjaGFubmVsICVzIGZvciAlcywgZGF0YSB3aWR0aCAlZC8lZCwgIgorCQkibWF4YnVyc3QgJWQvJWQgZWxlbWVudHMsIExFLCBubyBmbG93IGNvbnRyb2xcbiIsCiAJCWRtYV9jaGFuX25hbWUoY2hhbiksCiAJCShjb25maWctPmRpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpID8gIlJYIiA6ICJUWCIsCi0JCWNvbmZpZ19hZGRyX3dpZHRoLAotCQljb25maWdfbWF4YnVyc3QpOworCQlzcmNfYWRkcl93aWR0aCwgZHN0X2FkZHJfd2lkdGgsCisJCXNyY19tYXhidXJzdCwgZHN0X21heGJ1cnN0KTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGQ0MF9jb250cm9sKHN0cnVjdCBkbWFfY2hhbiAqY2hhbiwgZW51bSBkbWFfY3RybF9jbWQgY21kLApAQCAtMjMwOCw5ICsyMzY2LDggQEAKIAljYXNlIERNQV9SRVNVTUU6CiAJCXJldHVybiBkNDBfcmVzdW1lKGQ0MGMpOwogCWNhc2UgRE1BX1NMQVZFX0NPTkZJRzoKLQkJZDQwX3NldF9ydW50aW1lX2NvbmZpZyhjaGFuLAorCQlyZXR1cm4gZDQwX3NldF9ydW50aW1lX2NvbmZpZyhjaGFuLAogCQkJKHN0cnVjdCBkbWFfc2xhdmVfY29uZmlnICopIGFyZyk7Ci0JCXJldHVybiAwOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KQEAgLTIzNDEsNiArMjM5OCw3IEBACiAKIAkJSU5JVF9MSVNUX0hFQUQoJmQ0MGMtPmFjdGl2ZSk7CiAJCUlOSVRfTElTVF9IRUFEKCZkNDBjLT5xdWV1ZSk7CisJCUlOSVRfTElTVF9IRUFEKCZkNDBjLT5wZW5kaW5nX3F1ZXVlKTsKIAkJSU5JVF9MSVNUX0hFQUQoJmQ0MGMtPmNsaWVudCk7CiAKIAkJdGFza2xldF9pbml0KCZkNDBjLT50YXNrbGV0LCBkbWFfdGFza2xldCwKQEAgLTI1MDIsMjUgKzI1NjAsNiBAQAogCiBzdGF0aWMgc3RydWN0IGQ0MF9iYXNlICogX19pbml0IGQ0MF9od19kZXRlY3RfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewotCXN0YXRpYyBjb25zdCBzdHJ1Y3QgZDQwX3JlZ192YWwgZG1hX2lkX3JlZ3NbXSA9IHsKLQkJLyogUGVyaXBoZXJhbCBJZCAqLwotCQl7IC5yZWcgPSBENDBfRFJFR19QRVJJUEhJRDAsIC52YWwgPSAweDAwNDB9LAotCQl7IC5yZWcgPSBENDBfRFJFR19QRVJJUEhJRDEsIC52YWwgPSAweDAwMDB9LAotCQkvKgotCQkgKiBENDBfRFJFR19QRVJJUEhJRDIgRGVwZW5kcyBvbiBIVyByZXZpc2lvbjoKLQkJICogIERCODUwMGVkIGhhcyAweDAwMDgsCi0JCSAqICA/IGhhcyAweDAwMTgsCi0JCSAqICBEQjg1MDB2MSBoYXMgMHgwMDI4Ci0JCSAqICBEQjg1MDB2MiBoYXMgMHgwMDM4Ci0JCSAqLwotCQl7IC5yZWcgPSBENDBfRFJFR19QRVJJUEhJRDMsIC52YWwgPSAweDAwMDB9LAotCi0JCS8qIFBDZWxsIElkICovCi0JCXsgLnJlZyA9IEQ0MF9EUkVHX0NFTExJRDAsIC52YWwgPSAweDAwMGR9LAotCQl7IC5yZWcgPSBENDBfRFJFR19DRUxMSUQxLCAudmFsID0gMHgwMGYwfSwKLQkJeyAucmVnID0gRDQwX0RSRUdfQ0VMTElEMiwgLnZhbCA9IDB4MDAwNX0sCi0JCXsgLnJlZyA9IEQ0MF9EUkVHX0NFTExJRDMsIC52YWwgPSAweDAwYjF9Ci0JfTsKIAlzdHJ1Y3Qgc3RlZG1hNDBfcGxhdGZvcm1fZGF0YSAqcGxhdF9kYXRhOwogCXN0cnVjdCBjbGsgKmNsayA9IE5VTEw7CiAJdm9pZCBfX2lvbWVtICp2aXJ0YmFzZSA9IE5VTEw7CkBAIC0yNTI5LDggKzI1NjgsOSBAQAogCWludCBudW1fbG9nX2NoYW5zID0gMDsKIAlpbnQgbnVtX3BoeV9jaGFuczsKIAlpbnQgaTsKLQl1MzIgdmFsOwotCXUzMiByZXY7CisJdTMyIHBpZDsKKwl1MzIgY2lkOworCXU4IHJldjsKIAogCWNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CiAKQEAgLTI1NTQsMzIgKzI1OTQsMzIgQEAKIAlpZiAoIXZpcnRiYXNlKQogCQlnb3RvIGZhaWx1cmU7CiAKLQkvKiBIVyB2ZXJzaW9uIGNoZWNrICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZG1hX2lkX3JlZ3MpOyBpKyspIHsKLQkJaWYgKGRtYV9pZF9yZWdzW2ldLnZhbCAhPQotCQkgICAgcmVhZGwodmlydGJhc2UgKyBkbWFfaWRfcmVnc1tpXS5yZWcpKSB7Ci0JCQlkNDBfZXJyKCZwZGV2LT5kZXYsCi0JCQkJIlVua25vd24gaGFyZHdhcmUhIEV4cGVjdGVkIDB4JXggYXQgMHgleCBidXQgZ290IDB4JXhcbiIsCi0JCQkJZG1hX2lkX3JlZ3NbaV0udmFsLAotCQkJCWRtYV9pZF9yZWdzW2ldLnJlZywKLQkJCQlyZWFkbCh2aXJ0YmFzZSArIGRtYV9pZF9yZWdzW2ldLnJlZykpOwotCQkJZ290byBmYWlsdXJlOwotCQl9Ci0JfQorCS8qIFRoaXMgaXMganVzdCBhIHJlZ3VsYXIgQU1CQSBQcmltZUNlbGwgSUQgYWN0dWFsbHkgKi8KKwlmb3IgKHBpZCA9IDAsIGkgPSAwOyBpIDwgNDsgaSsrKQorCQlwaWQgfD0gKHJlYWRsKHZpcnRiYXNlICsgcmVzb3VyY2Vfc2l6ZShyZXMpIC0gMHgyMCArIDQgKiBpKQorCQkJJiAyNTUpIDw8IChpICogOCk7CisJZm9yIChjaWQgPSAwLCBpID0gMDsgaSA8IDQ7IGkrKykKKwkJY2lkIHw9IChyZWFkbCh2aXJ0YmFzZSArIHJlc291cmNlX3NpemUocmVzKSAtIDB4MTAgKyA0ICogaSkKKwkJCSYgMjU1KSA8PCAoaSAqIDgpOwogCi0JLyogR2V0IHNpbGljb24gcmV2aXNpb24gYW5kIGRlc2lnbmVyICovCi0JdmFsID0gcmVhZGwodmlydGJhc2UgKyBENDBfRFJFR19QRVJJUEhJRDIpOwotCi0JaWYgKCh2YWwgJiBENDBfRFJFR19QRVJJUEhJRDJfREVTSUdORVJfTUFTSykgIT0KLQkgICAgRDQwX0hXX0RFU0lHTkVSKSB7Ci0JCWQ0MF9lcnIoJnBkZXYtPmRldiwgIlVua25vd24gZGVzaWduZXIhIEdvdCAleCB3YW50ZWQgJXhcbiIsCi0JCQl2YWwgJiBENDBfRFJFR19QRVJJUEhJRDJfREVTSUdORVJfTUFTSywKLQkJCUQ0MF9IV19ERVNJR05FUik7CisJaWYgKGNpZCAhPSBBTUJBX0NJRCkgeworCQlkNDBfZXJyKCZwZGV2LT5kZXYsICJVbmtub3duIGhhcmR3YXJlISBObyBQcmltZUNlbGwgSURcbiIpOwogCQlnb3RvIGZhaWx1cmU7CiAJfQotCi0JcmV2ID0gKHZhbCAmIEQ0MF9EUkVHX1BFUklQSElEMl9SRVZfTUFTSykgPj4KLQkJRDQwX0RSRUdfUEVSSVBISUQyX1JFVl9QT1M7CisJaWYgKEFNQkFfTUFORl9CSVRTKHBpZCkgIT0gQU1CQV9WRU5ET1JfU1QpIHsKKwkJZDQwX2VycigmcGRldi0+ZGV2LCAiVW5rbm93biBkZXNpZ25lciEgR290ICV4IHdhbnRlZCAleFxuIiwKKwkJCUFNQkFfTUFORl9CSVRTKHBpZCksCisJCQlBTUJBX1ZFTkRPUl9TVCk7CisJCWdvdG8gZmFpbHVyZTsKKwl9CisJLyoKKwkgKiBIVyByZXZpc2lvbjoKKwkgKiBEQjg1MDBlZCBoYXMgcmV2aXNpb24gMAorCSAqID8gaGFzIHJldmlzaW9uIDEKKwkgKiBEQjg1MDB2MSBoYXMgcmV2aXNpb24gMgorCSAqIERCODUwMHYyIGhhcyByZXZpc2lvbiAzCisJICovCisJcmV2ID0gQU1CQV9SRVZfQklUUyhwaWQpOwogCiAJLyogVGhlIG51bWJlciBvZiBwaHlzaWNhbCBjaGFubmVscyBvbiB0aGlzIEhXICovCiAJbnVtX3BoeV9jaGFucyA9IDQgKiAocmVhZGwodmlydGJhc2UgKyBENDBfRFJFR19JQ0ZHKSAmIDB4NykgKyA0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9kbWEvc3RlX2RtYTQwX2xsLmggYi9kcml2ZXJzL2RtYS9zdGVfZG1hNDBfbGwuaAppbmRleCAxOTVlZTY1Li5iNDRjNDU1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9kbWEvc3RlX2RtYTQwX2xsLmgKKysrIGIvZHJpdmVycy9kbWEvc3RlX2RtYTQwX2xsLmgKQEAgLTE4NCw5ICsxODQsNiBAQAogI2RlZmluZSBENDBfRFJFR19QRVJJUEhJRDAJMHhGRTAKICNkZWZpbmUgRDQwX0RSRUdfUEVSSVBISUQxCTB4RkU0CiAjZGVmaW5lIEQ0MF9EUkVHX1BFUklQSElEMgkweEZFOAotI2RlZmluZSBENDBfRFJFR19QRVJJUEhJRDJfUkVWX1BPUyA0Ci0jZGVmaW5lIEQ0MF9EUkVHX1BFUklQSElEMl9SRVZfTUFTSyAoMHhmIDw8IEQ0MF9EUkVHX1BFUklQSElEMl9SRVZfUE9TKQotI2RlZmluZSBENDBfRFJFR19QRVJJUEhJRDJfREVTSUdORVJfTUFTSyAweGYKICNkZWZpbmUgRDQwX0RSRUdfUEVSSVBISUQzCTB4RkVDCiAjZGVmaW5lIEQ0MF9EUkVHX0NFTExJRDAJMHhGRjAKICNkZWZpbmUgRDQwX0RSRUdfQ0VMTElEMQkweEZGNApkaWZmIC0tZ2l0IGEvZHJpdmVycy9laXNhL3BjaV9laXNhLmMgYi9kcml2ZXJzL2Vpc2EvcGNpX2Vpc2EuYwppbmRleCAzMGRhNzBkLi5jZGFlMjA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Vpc2EvcGNpX2Vpc2EuYworKysgYi9kcml2ZXJzL2Vpc2EvcGNpX2Vpc2EuYwpAQCAtNDUsMTMgKzQ1LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBfX2luaXRkYXRhIHBjaV9laXNhX3BjaV90YmxbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBwY2lfZWlzYV9wY2lfdGJsW10gPSB7CiAJeyBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAogCSAgUENJX0NMQVNTX0JSSURHRV9FSVNBIDw8IDgsIDB4ZmZmZjAwLCAwIH0sCiAJeyAwLCB9CiB9OwogCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgX19pbml0ZGF0YSBwY2lfZWlzYV9kcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgX19yZWZkYXRhIHBjaV9laXNhX2RyaXZlciA9IHsKIAkubmFtZQkJPSAicGNpX2Vpc2EiLAogCS5pZF90YWJsZQk9IHBjaV9laXNhX3BjaV90YmwsCiAJLnByb2JlCQk9IHBjaV9laXNhX2luaXQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2VmaXZhcnMuYyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpdmFycy5jCmluZGV4IDVmMjlhYWYuLmViODBiNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvZWZpdmFycy5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvZWZpdmFycy5jCkBAIC03OCw2ICs3OCw3IEBACiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wc3RvcmUuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKQEAgLTg5LDYgKzkwLDggQEAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9WRVJTSU9OKEVGSVZBUlNfVkVSU0lPTik7CiAKKyNkZWZpbmUgRFVNUF9OQU1FX0xFTiA1MgorCiAvKgogICogVGhlIG1heGltdW0gc2l6ZSBvZiBWYXJpYWJsZU5hbWUgKyBEYXRhID0gMTAyNAogICogVGhlcmVmb3JlLCBpdCdzIHJlYXNvbmFibGUgdG8gc2F2ZSB0aGF0IG11Y2gKQEAgLTExOSw2ICsxMjIsMTAgQEAKIAlzc2l6ZV90ICgqc3RvcmUpKHN0cnVjdCBlZml2YXJfZW50cnkgKmVudHJ5LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCk7CiB9OwogCisjZGVmaW5lIFBTVE9SRV9FRklfQVRUUklCVVRFUyBcCisJKEVGSV9WQVJJQUJMRV9OT05fVk9MQVRJTEUgfCBcCisJIEVGSV9WQVJJQUJMRV9CT09UU0VSVklDRV9BQ0NFU1MgfCBcCisJIEVGSV9WQVJJQUJMRV9SVU5USU1FX0FDQ0VTUykKIAogI2RlZmluZSBFRklWQVJfQVRUUihfbmFtZSwgX21vZGUsIF9zaG93LCBfc3RvcmUpIFwKIHN0cnVjdCBlZml2YXJfYXR0cmlidXRlIGVmaXZhcl9hdHRyXyMjX25hbWUgPSB7IFwKQEAgLTE0MSwyMyArMTQ4LDYxIEBACiAKIC8qIFJldHVybiB0aGUgbnVtYmVyIG9mIHVuaWNvZGUgY2hhcmFjdGVycyBpbiBkYXRhICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZwotdXRmOF9zdHJsZW4oZWZpX2NoYXIxNl90ICpkYXRhLCB1bnNpZ25lZCBsb25nIG1heGxlbmd0aCkKK3V0ZjE2X3N0cm5sZW4oZWZpX2NoYXIxNl90ICpzLCBzaXplX3QgbWF4bGVuZ3RoKQogewogCXVuc2lnbmVkIGxvbmcgbGVuZ3RoID0gMDsKIAotCXdoaWxlICgqZGF0YSsrICE9IDAgJiYgbGVuZ3RoIDwgbWF4bGVuZ3RoKQorCXdoaWxlICgqcysrICE9IDAgJiYgbGVuZ3RoIDwgbWF4bGVuZ3RoKQogCQlsZW5ndGgrKzsKIAlyZXR1cm4gbGVuZ3RoOwogfQogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK3V0ZjE2X3N0cmxlbihlZmlfY2hhcjE2X3QgKnMpCit7CisJcmV0dXJuIHV0ZjE2X3N0cm5sZW4ocywgfjBVTCk7Cit9CisKIC8qCiAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBpcyB0aGUgbGVuZ3RoIG9mIHRoaXMgc3RyaW5nCiAgKiBOb3RlOiB0aGlzIGlzIE5PVCB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIHVuaWNvZGUgY2hhcmFjdGVycwogICovCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKLXV0Zjhfc3Ryc2l6ZShlZmlfY2hhcjE2X3QgKmRhdGEsIHVuc2lnbmVkIGxvbmcgbWF4bGVuZ3RoKQordXRmMTZfc3Ryc2l6ZShlZmlfY2hhcjE2X3QgKmRhdGEsIHVuc2lnbmVkIGxvbmcgbWF4bGVuZ3RoKQogewotCXJldHVybiB1dGY4X3N0cmxlbihkYXRhLCBtYXhsZW5ndGgvc2l6ZW9mKGVmaV9jaGFyMTZfdCkpICogc2l6ZW9mKGVmaV9jaGFyMTZfdCk7CisJcmV0dXJuIHV0ZjE2X3N0cm5sZW4oZGF0YSwgbWF4bGVuZ3RoL3NpemVvZihlZmlfY2hhcjE2X3QpKSAqIHNpemVvZihlZmlfY2hhcjE2X3QpOworfQorCitzdGF0aWMgaW5saW5lIGludAordXRmMTZfc3RybmNtcChjb25zdCBlZmlfY2hhcjE2X3QgKmEsIGNvbnN0IGVmaV9jaGFyMTZfdCAqYiwgc2l6ZV90IGxlbikKK3sKKwl3aGlsZSAoMSkgeworCQlpZiAobGVuID09IDApCisJCQlyZXR1cm4gMDsKKwkJaWYgKCphIDwgKmIpCisJCQlyZXR1cm4gLTE7CisJCWlmICgqYSA+ICpiKQorCQkJcmV0dXJuIDE7CisJCWlmICgqYSA9PSAwKSAvKiBpbXBsaWVzICpiID09IDAgKi8KKwkJCXJldHVybiAwOworCQlhKys7CisJCWIrKzsKKwkJbGVuLS07CisJfQorfQorCitzdGF0aWMgZWZpX3N0YXR1c190CitnZXRfdmFyX2RhdGFfbG9ja2VkKHN0cnVjdCBlZml2YXJzICplZml2YXJzLCBzdHJ1Y3QgZWZpX3ZhcmlhYmxlICp2YXIpCit7CisJZWZpX3N0YXR1c190IHN0YXR1czsKKworCXZhci0+RGF0YVNpemUgPSAxMDI0OworCXN0YXR1cyA9IGVmaXZhcnMtPm9wcy0+Z2V0X3ZhcmlhYmxlKHZhci0+VmFyaWFibGVOYW1lLAorCQkJCQkgICAgJnZhci0+VmVuZG9yR3VpZCwKKwkJCQkJICAgICZ2YXItPkF0dHJpYnV0ZXMsCisJCQkJCSAgICAmdmFyLT5EYXRhU2l6ZSwKKwkJCQkJICAgIHZhci0+RGF0YSk7CisJcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdGljIGVmaV9zdGF0dXNfdApAQCAtMTY2LDEzICsyMTEsOSBAQAogCWVmaV9zdGF0dXNfdCBzdGF0dXM7CiAKIAlzcGluX2xvY2soJmVmaXZhcnMtPmxvY2spOwotCXZhci0+RGF0YVNpemUgPSAxMDI0OwotCXN0YXR1cyA9IGVmaXZhcnMtPm9wcy0+Z2V0X3ZhcmlhYmxlKHZhci0+VmFyaWFibGVOYW1lLAotCQkJCQkgICAgJnZhci0+VmVuZG9yR3VpZCwKLQkJCQkJICAgICZ2YXItPkF0dHJpYnV0ZXMsCi0JCQkJCSAgICAmdmFyLT5EYXRhU2l6ZSwKLQkJCQkJICAgIHZhci0+RGF0YSk7CisJc3RhdHVzID0gZ2V0X3Zhcl9kYXRhX2xvY2tlZChlZml2YXJzLCB2YXIpOwogCXNwaW5fdW5sb2NrKCZlZml2YXJzLT5sb2NrKTsKKwogCWlmIChzdGF0dXMgIT0gRUZJX1NVQ0NFU1MpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAiZWZpdmFyczogZ2V0X3ZhcmlhYmxlKCkgZmFpbGVkIDB4JWx4IVxuIiwKIAkJCXN0YXR1cyk7CkBAIC0zODcsMTIgKzQyOCwxODAgQEAKIAkuZGVmYXVsdF9hdHRycyA9IGRlZl9hdHRycywKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcHN0b3JlX2luZm8gZWZpX3BzdG9yZV9pbmZvOworCiBzdGF0aWMgaW5saW5lIHZvaWQKIGVmaXZhcl91bnJlZ2lzdGVyKHN0cnVjdCBlZml2YXJfZW50cnkgKnZhcikKIHsKIAlrb2JqZWN0X3B1dCgmdmFyLT5rb2JqKTsKIH0KIAorI2lmZGVmIENPTkZJR19QU1RPUkUKKworc3RhdGljIGludCBlZmlfcHN0b3JlX29wZW4oc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpCit7CisJc3RydWN0IGVmaXZhcnMgKmVmaXZhcnMgPSBwc2ktPmRhdGE7CisKKwlzcGluX2xvY2soJmVmaXZhcnMtPmxvY2spOworCWVmaXZhcnMtPndhbGtfZW50cnkgPSBsaXN0X2ZpcnN0X2VudHJ5KCZlZml2YXJzLT5saXN0LAorCQkJCQkgICAgICAgc3RydWN0IGVmaXZhcl9lbnRyeSwgbGlzdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZWZpX3BzdG9yZV9jbG9zZShzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSkKK3sKKwlzdHJ1Y3QgZWZpdmFycyAqZWZpdmFycyA9IHBzaS0+ZGF0YTsKKworCXNwaW5fdW5sb2NrKCZlZml2YXJzLT5sb2NrKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgZWZpX3BzdG9yZV9yZWFkKHU2NCAqaWQsIGVudW0gcHN0b3JlX3R5cGVfaWQgKnR5cGUsCisJCQkgICAgICAgc3RydWN0IHRpbWVzcGVjICp0aW1lc3BlYywgc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpCit7CisJZWZpX2d1aWRfdCB2ZW5kb3IgPSBMSU5VWF9FRklfQ1JBU0hfR1VJRDsKKwlzdHJ1Y3QgZWZpdmFycyAqZWZpdmFycyA9IHBzaS0+ZGF0YTsKKwljaGFyIG5hbWVbRFVNUF9OQU1FX0xFTl07CisJaW50IGk7CisJdW5zaWduZWQgaW50IHBhcnQsIHNpemU7CisJdW5zaWduZWQgbG9uZyB0aW1lOworCisJd2hpbGUgKCZlZml2YXJzLT53YWxrX2VudHJ5LT5saXN0ICE9ICZlZml2YXJzLT5saXN0KSB7CisJCWlmICghZWZpX2d1aWRjbXAoZWZpdmFycy0+d2Fsa19lbnRyeS0+dmFyLlZlbmRvckd1aWQsCisJCQkJIHZlbmRvcikpIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBEVU1QX05BTUVfTEVOOyBpKyspIHsKKwkJCQluYW1lW2ldID0gZWZpdmFycy0+d2Fsa19lbnRyeS0+dmFyLlZhcmlhYmxlTmFtZVtpXTsKKwkJCX0KKwkJCWlmIChzc2NhbmYobmFtZSwgImR1bXAtdHlwZSV1LSV1LSVsdSIsIHR5cGUsICZwYXJ0LCAmdGltZSkgPT0gMykgeworCQkJCSppZCA9IHBhcnQ7CisJCQkJdGltZXNwZWMtPnR2X3NlYyA9IHRpbWU7CisJCQkJdGltZXNwZWMtPnR2X25zZWMgPSAwOworCQkJCWdldF92YXJfZGF0YV9sb2NrZWQoZWZpdmFycywgJmVmaXZhcnMtPndhbGtfZW50cnktPnZhcik7CisJCQkJc2l6ZSA9IGVmaXZhcnMtPndhbGtfZW50cnktPnZhci5EYXRhU2l6ZTsKKwkJCQltZW1jcHkocHNpLT5idWYsIGVmaXZhcnMtPndhbGtfZW50cnktPnZhci5EYXRhLCBzaXplKTsKKwkJCQllZml2YXJzLT53YWxrX2VudHJ5ID0gbGlzdF9lbnRyeShlZml2YXJzLT53YWxrX2VudHJ5LT5saXN0Lm5leHQsCisJCQkJCSAgICAgICAgICAgc3RydWN0IGVmaXZhcl9lbnRyeSwgbGlzdCk7CisJCQkJcmV0dXJuIHNpemU7CisJCQl9CisJCX0KKwkJZWZpdmFycy0+d2Fsa19lbnRyeSA9IGxpc3RfZW50cnkoZWZpdmFycy0+d2Fsa19lbnRyeS0+bGlzdC5uZXh0LAorCQkJCQkJIHN0cnVjdCBlZml2YXJfZW50cnksIGxpc3QpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHU2NCBlZmlfcHN0b3JlX3dyaXRlKGVudW0gcHN0b3JlX3R5cGVfaWQgdHlwZSwgdW5zaWduZWQgaW50IHBhcnQsCisJCQkgICAgc2l6ZV90IHNpemUsIHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKQoreworCWNoYXIgbmFtZVtEVU1QX05BTUVfTEVOXTsKKwljaGFyIHN0dWJfbmFtZVtEVU1QX05BTUVfTEVOXTsKKwllZmlfY2hhcjE2X3QgZWZpX25hbWVbRFVNUF9OQU1FX0xFTl07CisJZWZpX2d1aWRfdCB2ZW5kb3IgPSBMSU5VWF9FRklfQ1JBU0hfR1VJRDsKKwlzdHJ1Y3QgZWZpdmFycyAqZWZpdmFycyA9IHBzaS0+ZGF0YTsKKwlzdHJ1Y3QgZWZpdmFyX2VudHJ5ICplbnRyeSwgKmZvdW5kID0gTlVMTDsKKwlpbnQgaTsKKworCXNwcmludGYoc3R1Yl9uYW1lLCAiZHVtcC10eXBlJXUtJXUtIiwgdHlwZSwgcGFydCk7CisJc3ByaW50ZihuYW1lLCAiJXMlbHUiLCBzdHViX25hbWUsIGdldF9zZWNvbmRzKCkpOworCisJc3Bpbl9sb2NrKCZlZml2YXJzLT5sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCBEVU1QX05BTUVfTEVOOyBpKyspCisJCWVmaV9uYW1lW2ldID0gc3R1Yl9uYW1lW2ldOworCisJLyoKKwkgKiBDbGVhbiB1cCBhbnkgZW50cmllcyB3aXRoIHRoZSBzYW1lIG5hbWUKKwkgKi8KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZlZml2YXJzLT5saXN0LCBsaXN0KSB7CisJCWdldF92YXJfZGF0YV9sb2NrZWQoZWZpdmFycywgJmVudHJ5LT52YXIpOworCisJCWlmIChlZmlfZ3VpZGNtcChlbnRyeS0+dmFyLlZlbmRvckd1aWQsIHZlbmRvcikpCisJCQljb250aW51ZTsKKwkJaWYgKHV0ZjE2X3N0cm5jbXAoZW50cnktPnZhci5WYXJpYWJsZU5hbWUsIGVmaV9uYW1lLAorCQkJCSAgdXRmMTZfc3RybGVuKGVmaV9uYW1lKSkpCisJCQljb250aW51ZTsKKwkJLyogTmVlZHMgdG8gYmUgYSBwcmVmaXggKi8KKwkJaWYgKGVudHJ5LT52YXIuVmFyaWFibGVOYW1lW3V0ZjE2X3N0cmxlbihlZmlfbmFtZSldID09IDApCisJCQljb250aW51ZTsKKworCQkvKiBmb3VuZCAqLworCQlmb3VuZCA9IGVudHJ5OworCQllZml2YXJzLT5vcHMtPnNldF92YXJpYWJsZShlbnRyeS0+dmFyLlZhcmlhYmxlTmFtZSwKKwkJCQkJICAgJmVudHJ5LT52YXIuVmVuZG9yR3VpZCwKKwkJCQkJICAgUFNUT1JFX0VGSV9BVFRSSUJVVEVTLAorCQkJCQkgICAwLCBOVUxMKTsKKwl9CisKKwlpZiAoZm91bmQpCisJCWxpc3RfZGVsKCZmb3VuZC0+bGlzdCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRFVNUF9OQU1FX0xFTjsgaSsrKQorCQllZmlfbmFtZVtpXSA9IG5hbWVbaV07CisKKwllZml2YXJzLT5vcHMtPnNldF92YXJpYWJsZShlZmlfbmFtZSwgJnZlbmRvciwgUFNUT1JFX0VGSV9BVFRSSUJVVEVTLAorCQkJCSAgIHNpemUsIHBzaS0+YnVmKTsKKworCXNwaW5fdW5sb2NrKCZlZml2YXJzLT5sb2NrKTsKKworCWlmIChmb3VuZCkKKwkJZWZpdmFyX3VucmVnaXN0ZXIoZm91bmQpOworCisJaWYgKHNpemUpCisJCWVmaXZhcl9jcmVhdGVfc3lzZnNfZW50cnkoZWZpdmFycywKKwkJCQkJICB1dGYxNl9zdHJzaXplKGVmaV9uYW1lLAorCQkJCQkJCURVTVBfTkFNRV9MRU4gKiAyKSwKKwkJCQkJICBlZmlfbmFtZSwgJnZlbmRvcik7CisKKwlyZXR1cm4gcGFydDsKK307CisKK3N0YXRpYyBpbnQgZWZpX3BzdG9yZV9lcmFzZShlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIHU2NCBpZCwKKwkJCSAgICBzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSkKK3sKKwllZmlfcHN0b3JlX3dyaXRlKHR5cGUsIGlkLCAwLCBwc2kpOworCisJcmV0dXJuIDA7Cit9CisjZWxzZQorc3RhdGljIGludCBlZmlfcHN0b3JlX29wZW4oc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZWZpX3BzdG9yZV9jbG9zZShzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgZWZpX3BzdG9yZV9yZWFkKHU2NCAqaWQsIGVudW0gcHN0b3JlX3R5cGVfaWQgKnR5cGUsCisJCQkgICAgICAgc3RydWN0IHRpbWVzcGVjICp0aW1lLCBzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSkKK3sKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB1NjQgZWZpX3BzdG9yZV93cml0ZShlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIHVuc2lnbmVkIGludCBwYXJ0LAorCQkJICAgIHNpemVfdCBzaXplLCBzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlZmlfcHN0b3JlX2VyYXNlKGVudW0gcHN0b3JlX3R5cGVfaWQgdHlwZSwgdTY0IGlkLAorCQkJICAgIHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKQoreworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcHN0b3JlX2luZm8gZWZpX3BzdG9yZV9pbmZvID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAiZWZpIiwKKwkub3BlbgkJPSBlZmlfcHN0b3JlX29wZW4sCisJLmNsb3NlCQk9IGVmaV9wc3RvcmVfY2xvc2UsCisJLnJlYWQJCT0gZWZpX3BzdG9yZV9yZWFkLAorCS53cml0ZQkJPSBlZmlfcHN0b3JlX3dyaXRlLAorCS5lcmFzZQkJPSBlZmlfcHN0b3JlX2VyYXNlLAorfTsKIAogc3RhdGljIHNzaXplX3QgZWZpdmFyX2NyZWF0ZShzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYmosCiAJCQkgICAgIHN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwKQEAgLTQxNCw4ICs2MjMsOCBAQAogCSAqIERvZXMgdGhpcyB2YXJpYWJsZSBhbHJlYWR5IGV4aXN0PwogCSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzZWFyY2hfZWZpdmFyLCBuLCAmZWZpdmFycy0+bGlzdCwgbGlzdCkgewotCQlzdHJzaXplMSA9IHV0Zjhfc3Ryc2l6ZShzZWFyY2hfZWZpdmFyLT52YXIuVmFyaWFibGVOYW1lLCAxMDI0KTsKLQkJc3Ryc2l6ZTIgPSB1dGY4X3N0cnNpemUobmV3X3Zhci0+VmFyaWFibGVOYW1lLCAxMDI0KTsKKwkJc3Ryc2l6ZTEgPSB1dGYxNl9zdHJzaXplKHNlYXJjaF9lZml2YXItPnZhci5WYXJpYWJsZU5hbWUsIDEwMjQpOworCQlzdHJzaXplMiA9IHV0ZjE2X3N0cnNpemUobmV3X3Zhci0+VmFyaWFibGVOYW1lLCAxMDI0KTsKIAkJaWYgKHN0cnNpemUxID09IHN0cnNpemUyICYmCiAJCQkhbWVtY21wKCYoc2VhcmNoX2VmaXZhci0+dmFyLlZhcmlhYmxlTmFtZSksCiAJCQkJbmV3X3Zhci0+VmFyaWFibGVOYW1lLCBzdHJzaXplMSkgJiYKQEAgLTQ0Nyw4ICs2NTYsOCBAQAogCiAJLyogQ3JlYXRlIHRoZSBlbnRyeSBpbiBzeXNmcy4gIExvY2tpbmcgaXMgbm90IHJlcXVpcmVkIGhlcmUgKi8KIAlzdGF0dXMgPSBlZml2YXJfY3JlYXRlX3N5c2ZzX2VudHJ5KGVmaXZhcnMsCi0JCQkJCSAgIHV0Zjhfc3Ryc2l6ZShuZXdfdmFyLT5WYXJpYWJsZU5hbWUsCi0JCQkJCQkJMTAyNCksCisJCQkJCSAgIHV0ZjE2X3N0cnNpemUobmV3X3Zhci0+VmFyaWFibGVOYW1lLAorCQkJCQkJCSAxMDI0KSwKIAkJCQkJICAgbmV3X3Zhci0+VmFyaWFibGVOYW1lLAogCQkJCQkgICAmbmV3X3Zhci0+VmVuZG9yR3VpZCk7CiAJaWYgKHN0YXR1cykgewpAQCAtNDc3LDggKzY4Niw4IEBACiAJICogRG9lcyB0aGlzIHZhcmlhYmxlIGFscmVhZHkgZXhpc3Q/CiAJICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNlYXJjaF9lZml2YXIsIG4sICZlZml2YXJzLT5saXN0LCBsaXN0KSB7Ci0JCXN0cnNpemUxID0gdXRmOF9zdHJzaXplKHNlYXJjaF9lZml2YXItPnZhci5WYXJpYWJsZU5hbWUsIDEwMjQpOwotCQlzdHJzaXplMiA9IHV0Zjhfc3Ryc2l6ZShkZWxfdmFyLT5WYXJpYWJsZU5hbWUsIDEwMjQpOworCQlzdHJzaXplMSA9IHV0ZjE2X3N0cnNpemUoc2VhcmNoX2VmaXZhci0+dmFyLlZhcmlhYmxlTmFtZSwgMTAyNCk7CisJCXN0cnNpemUyID0gdXRmMTZfc3Ryc2l6ZShkZWxfdmFyLT5WYXJpYWJsZU5hbWUsIDEwMjQpOwogCQlpZiAoc3Ryc2l6ZTEgPT0gc3Ryc2l6ZTIgJiYKIAkJCSFtZW1jbXAoJihzZWFyY2hfZWZpdmFyLT52YXIuVmFyaWFibGVOYW1lKSwKIAkJCQlkZWxfdmFyLT5WYXJpYWJsZU5hbWUsIHN0cnNpemUxKSAmJgpAQCAtNzYzLDYgKzk3MiwxNiBAQAogCWlmIChlcnJvcikKIAkJdW5yZWdpc3Rlcl9lZml2YXJzKGVmaXZhcnMpOwogCisJZWZpdmFycy0+ZWZpX3BzdG9yZV9pbmZvID0gZWZpX3BzdG9yZV9pbmZvOworCisJZWZpdmFycy0+ZWZpX3BzdG9yZV9pbmZvLmJ1ZiA9IGttYWxsb2MoNDA5NiwgR0ZQX0tFUk5FTCk7CisJaWYgKGVmaXZhcnMtPmVmaV9wc3RvcmVfaW5mby5idWYpIHsKKwkJZWZpdmFycy0+ZWZpX3BzdG9yZV9pbmZvLmJ1ZnNpemUgPSAxMDI0OworCQllZml2YXJzLT5lZmlfcHN0b3JlX2luZm8uZGF0YSA9IGVmaXZhcnM7CisJCW11dGV4X2luaXQoJmVmaXZhcnMtPmVmaV9wc3RvcmVfaW5mby5idWZfbXV0ZXgpOworCQlwc3RvcmVfcmVnaXN0ZXIoJmVmaXZhcnMtPmVmaV9wc3RvcmVfaW5mbyk7CisJfQorCiBvdXQ6CiAJa2ZyZWUodmFyaWFibGVfbmFtZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9LY29uZmlnIGIvZHJpdmVycy9ncGlvL0tjb25maWcKaW5kZXggMzYzNDk4Ni4uZDUzOWVmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL0tjb25maWcKKysrIGIvZHJpdmVycy9ncGlvL0tjb25maWcKQEAgLTEwMyw2ICsxMDMsMjIgQEAKIAlkZWZfYm9vbCB5CiAJZGVwZW5kcyBvbiBQUENfTVBDNTJ4eAogCitjb25maWcgR1BJT19NU01fVjEKKwl0cmlzdGF0ZSAiUXVhbGNvbW0gTVNNIEdQSU8gdjEiCisJZGVwZW5kcyBvbiBHUElPTElCICYmIEFSQ0hfTVNNCisJaGVscAorCSAgU2F5IHllcyBoZXJlIHRvIHN1cHBvcnQgdGhlIEdQSU8gaW50ZXJmYWNlIG9uIEFSTSB2NiBiYXNlZAorCSAgUXVhbGNvbW0gTVNNIGNoaXBzLiAgTW9zdCBvZiB0aGUgcGlucyBvbiB0aGUgTVNNIGNhbiBiZQorCSAgc2VsZWN0ZWQgZm9yIEdQSU8sIGFuZCBhcmUgY29udHJvbGxlZCBieSB0aGlzIGRyaXZlci4KKworY29uZmlnIEdQSU9fTVNNX1YyCisJdHJpc3RhdGUgIlF1YWxjb21tIE1TTSBHUElPIHYyIgorCWRlcGVuZHMgb24gR1BJT0xJQiAmJiBBUkNIX01TTQorCWhlbHAKKwkgIFNheSB5ZXMgaGVyZSB0byBzdXBwb3J0IHRoZSBHUElPIGludGVyZmFjZSBvbiBBUk0gdjcgYmFzZWQKKwkgIFF1YWxjb21tIE1TTSBjaGlwcy4gIE1vc3Qgb2YgdGhlIHBpbnMgb24gdGhlIE1TTSBjYW4gYmUKKwkgIHNlbGVjdGVkIGZvciBHUElPLCBhbmQgYXJlIGNvbnRyb2xsZWQgYnkgdGhpcyBkcml2ZXIuCisKIGNvbmZpZyBHUElPX01YQwogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIEFSQ0hfTVhDCkBAIC0yODAsNiArMjk2LDEyIEBACiAJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIEdQSU9zIGZvdW5kIG9uIHRoZSBUQzM1ODlYCiAJICBJL08gRXhwYW5kZXIuCiAKK2NvbmZpZyBHUElPX1RQUzY1OTEyCisJdHJpc3RhdGUgIlRJIFRQUzY1OTEyIEdQSU8iCisJZGVwZW5kcyBvbiAoTUZEX1RQUzY1OTEyX0kyQyB8fCBNRkRfVFBTNjU5MTJfU1BJKQorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIFRQUzY1OTEyIGdwaW8gY2hpcAorCiBjb25maWcgR1BJT19UV0w0MDMwCiAJdHJpc3RhdGUgIlRXTDQwMzAsIFRXTDUwMzAsIGFuZCBUUFM2NTl4MCBHUElPcyIKIAlkZXBlbmRzIG9uIFRXTDQwMzBfQ09SRQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL01ha2VmaWxlIGIvZHJpdmVycy9ncGlvL01ha2VmaWxlCmluZGV4IDcyMDcxMTIuLjk1ODg5NDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwaW8vTWFrZWZpbGUKQEAgLTI3LDYgKzI3LDggQEAKIG9iai0kKENPTkZJR19HUElPX01DUDIzUzA4KQkrPSBncGlvLW1jcDIzczA4Lm8KIG9iai0kKENPTkZJR19HUElPX01MX0lPSCkJKz0gZ3Bpby1tbC1pb2gubwogb2JqLSQoQ09ORklHX0dQSU9fTVBDNTIwMCkJKz0gZ3Bpby1tcGM1MjAwLm8KK29iai0kKENPTkZJR19HUElPX01TTV9WMSkJKz0gZ3Bpby1tc20tdjEubworb2JqLSQoQ09ORklHX0dQSU9fTVNNX1YyKQkrPSBncGlvLW1zbS12Mi5vCiBvYmotJChDT05GSUdfR1BJT19NWEMpCQkrPSBncGlvLW14Yy5vCiBvYmotJChDT05GSUdfR1BJT19NWFMpCQkrPSBncGlvLW14cy5vCiBvYmotJChDT05GSUdfUExBVF9OT01BRElLKQkrPSBncGlvLW5vbWFkaWsubwpAQCAtNDgsNiArNTAsNyBAQAogb2JqLSQoQ09ORklHX0FSQ0hfVEVHUkEpCSs9IGdwaW8tdGVncmEubwogb2JqLSQoQ09ORklHX0dQSU9fVElNQkVSREFMRSkJKz0gZ3Bpby10aW1iZXJkYWxlLm8KIG9iai0kKENPTkZJR19HUElPX1RQUzY1OTEwKQkrPSBncGlvLXRwczY1OTEwLm8KK29iai0kKENPTkZJR19HUElPX1RQUzY1OTEyKQkrPSBncGlvLXRwczY1OTEyLm8KIG9iai0kKENPTkZJR19HUElPX1RXTDQwMzApCSs9IGdwaW8tdHdsNDAzMC5vCiBvYmotJChDT05GSUdfTUFDSF9VMzAwKQkJKz0gZ3Bpby11MzAwLm8KIG9iai0kKENPTkZJR19HUElPX1VDQjE0MDApCSs9IGdwaW8tdWNiMTQwMC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1hYjg1MDAuYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWFiODUwMC5jCmluZGV4IGVkNzk1ZTYuLjA1MGMwNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLWFiODUwMC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLWFiODUwMC5jCkBAIC01MTYsNSArNTE2LDUgQEAKIAogTU9EVUxFX0FVVEhPUigiQklCRUsgQkFTVSA8YmliZWsuYmFzdUBzdGVyaWNzc29uLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGFsbG93cyB0byB1c2UgQUI4NTAwIHVudXNlZCBwaW5zIHRvIGJlIHVzZWQgYXMgR1BJTyIpOwotTU9EVUxFX0FMSUFTKCJBQjg1MDAgR1BJTyBkcml2ZXIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06YWI4NTAwLWdwaW8iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLW1zbS12MS5jIGIvZHJpdmVycy9ncGlvL2dwaW8tbXNtLXYxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJhNGQ0MjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tc20tdjEuYwpAQCAtMCwwICsxLDYzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBHb29nbGUsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAwOS0yMDExLCBDb2RlIEF1cm9yYSBGb3J1bS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGFuZAorICogbWF5IGJlIGNvcGllZCwgZGlzdHJpYnV0ZWQsIGFuZCBtb2RpZmllZCB1bmRlciB0aG9zZSB0ZXJtcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bWFjaC9jcHUuaD4KKyNpbmNsdWRlIDxtYWNoL21zbV9ncGlvbXV4Lmg+CisjaW5jbHVkZSA8bWFjaC9tc21faW9tYXAuaD4KKworLyogc2VlIDgwLVZBNzM2LTIgUmV2IEMgcHAgNjk1LTc1MQorKioKKyoqIFRoZXNlIGFyZSBhY3R1YWxseSB0aGUgKnNoYWRvdyogZ3BpbyByZWdpc3RlcnMsIHNpbmNlIHRoZQorKiogcmVhbCBvbmVzICh3aGljaCBhbGxvdyBmdWxsIGFjY2VzcykgYXJlIG9ubHkgYXZhaWxhYmxlIHRvIHRoZQorKiogQVJNOSBzaWRlIG9mIHRoZSB3b3JsZC4KKyoqCisqKiBTaW5jZSB0aGUgX0JBU0UgbmVlZCB0byBiZSBwYWdlLWFsaWduZWQgd2hlbiB3ZSdyZSBtYXBwaW5nIHRoZW0KKyoqIHRvIHZpcnR1YWwgYWRkcmVzc2VzLCBhZGp1c3QgZm9yIHRoZSBhZGRpdGlvbmFsIG9mZnNldCBpbiB0aGVzZQorKiogbWFjcm9zLgorKi8KKworI2RlZmluZSBNU01fR1BJTzFfUkVHKG9mZikgKE1TTV9HUElPMV9CQVNFICsgKG9mZikpCisjZGVmaW5lIE1TTV9HUElPMl9SRUcob2ZmKSAoTVNNX0dQSU8yX0JBU0UgKyAweDQwMCArIChvZmYpKQorI2RlZmluZSBNU01fR1BJTzFfU0hBRE9XX1JFRyhvZmYpIChNU01fR1BJTzFfQkFTRSArIDB4ODAwICsgKG9mZikpCisjZGVmaW5lIE1TTV9HUElPMl9TSEFET1dfUkVHKG9mZikgKE1TTV9HUElPMl9CQVNFICsgMHhDMDAgKyAob2ZmKSkKKworLyoKKyAqIE1TTTdYMDAgcmVnaXN0ZXJzCisgKi8KKy8qIG91dHB1dCB2YWx1ZSAqLworI2RlZmluZSBNU003WDAwX0dQSU9fT1VUXzAJTVNNX0dQSU8xX1NIQURPV19SRUcoMHgwMCkgIC8qIGdwaW8gIDE1LTAgICovCisjZGVmaW5lIE1TTTdYMDBfR1BJT19PVVRfMQlNU01fR1BJTzJfU0hBRE9XX1JFRygweDAwKSAgLyogZ3BpbyAgNDItMTYgKi8KKyNkZWZpbmUgTVNNN1gwMF9HUElPX09VVF8yCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4MDQpICAvKiBncGlvICA2Ny00MyAqLworI2RlZmluZSBNU003WDAwX0dQSU9fT1VUXzMJTVNNX0dQSU8xX1NIQURPV19SRUcoMHgwOCkgIC8qIGdwaW8gIDk0LTY4ICovCisjZGVmaW5lIE1TTTdYMDBfR1BJT19PVVRfNAlNU01fR1BJTzFfU0hBRE9XX1JFRygweDBDKSAgLyogZ3BpbyAxMDYtOTUgKi8KKyNkZWZpbmUgTVNNN1gwMF9HUElPX09VVF81CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4NTApICAvKiBncGlvIDEwNy0xMjEgKi8KKworLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCBvdXRwdXQgZW5hYmxlICovCisjZGVmaW5lIE1TTTdYMDBfR1BJT19PRV8wCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4MTApCisjZGVmaW5lIE1TTTdYMDBfR1BJT19PRV8xCU1TTV9HUElPMl9TSEFET1dfUkVHKDB4MDgpCisjZGVmaW5lIE1TTTdYMDBfR1BJT19PRV8yCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4MTQpCisjZGVmaW5lIE1TTTdYMDBfR1BJT19PRV8zCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4MTgpCisjZGVmaW5lIE1TTTdYMDBfR1BJT19PRV80CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4MUMpCisjZGVmaW5lIE1TTTdYMDBfR1BJT19PRV81CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4NTQpCisKKy8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgaW5wdXQgcmVhZCAqLworI2RlZmluZSBNU003WDAwX0dQSU9fSU5fMAlNU01fR1BJTzFfU0hBRE9XX1JFRygweDM0KQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5fMQlNU01fR1BJTzJfU0hBRE9XX1JFRygweDIwKQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5fMglNU01fR1BJTzFfU0hBRE9XX1JFRygweDM4KQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5fMwlNU01fR1BJTzFfU0hBRE9XX1JFRygweDNDKQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5fNAlNU01fR1BJTzFfU0hBRE9XX1JFRygweDQwKQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5fNQlNU01fR1BJTzFfU0hBRE9XX1JFRygweDQ0KQorCisvKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIDE9ZWRnZSAwPWxldmVsIGludGVycnVwICovCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfRURHRV8wCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4NjApCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfRURHRV8xCU1TTV9HUElPMl9TSEFET1dfUkVHKDB4NTApCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfRURHRV8yCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4NjQpCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfRURHRV8zCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4NjgpCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfRURHRV80CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4NkMpCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfRURHRV81CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4QzApCisKKy8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgMT1wb3NpdGl2ZSAwPW5lZ2F0aXZlICovCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfUE9TXzAJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg3MCkKKyNkZWZpbmUgTVNNN1gwMF9HUElPX0lOVF9QT1NfMQlNU01fR1BJTzJfU0hBRE9XX1JFRygweDU4KQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5UX1BPU18yCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4NzQpCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfUE9TXzMJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg3OCkKKyNkZWZpbmUgTVNNN1gwMF9HUElPX0lOVF9QT1NfNAlNU01fR1BJTzFfU0hBRE9XX1JFRygweDdDKQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5UX1BPU181CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4QkMpCisKKy8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBNU003WDAwX0dQSU9fSU5UX0VOXzAJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg4MCkKKyNkZWZpbmUgTVNNN1gwMF9HUElPX0lOVF9FTl8xCU1TTV9HUElPMl9TSEFET1dfUkVHKDB4NjApCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfRU5fMglNU01fR1BJTzFfU0hBRE9XX1JFRygweDg0KQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5UX0VOXzMJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg4OCkKKyNkZWZpbmUgTVNNN1gwMF9HUElPX0lOVF9FTl80CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4OEMpCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfRU5fNQlNU01fR1BJTzFfU0hBRE9XX1JFRygweEI4KQorCisvKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIHdyaXRlIDEgdG8gY2xlYXIgaW50ZXJydXB0ICovCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfQ0xFQVJfMAlNU01fR1BJTzFfU0hBRE9XX1JFRygweDkwKQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5UX0NMRUFSXzEJTVNNX0dQSU8yX1NIQURPV19SRUcoMHg2OCkKKyNkZWZpbmUgTVNNN1gwMF9HUElPX0lOVF9DTEVBUl8yCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4OTQpCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfQ0xFQVJfMwlNU01fR1BJTzFfU0hBRE9XX1JFRygweDk4KQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5UX0NMRUFSXzQJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg5QykKKyNkZWZpbmUgTVNNN1gwMF9HUElPX0lOVF9DTEVBUl81CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4QjQpCisKKy8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgMT1pbnRlcnJ1cHQgcGVuZGluZyAqLworI2RlZmluZSBNU003WDAwX0dQSU9fSU5UX1NUQVRVU18wCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4QTApCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfU1RBVFVTXzEJTVNNX0dQSU8yX1NIQURPV19SRUcoMHg3MCkKKyNkZWZpbmUgTVNNN1gwMF9HUElPX0lOVF9TVEFUVVNfMglNU01fR1BJTzFfU0hBRE9XX1JFRygweEE0KQorI2RlZmluZSBNU003WDAwX0dQSU9fSU5UX1NUQVRVU18zCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4QTgpCisjZGVmaW5lIE1TTTdYMDBfR1BJT19JTlRfU1RBVFVTXzQJTVNNX0dQSU8xX1NIQURPV19SRUcoMHhBQykKKyNkZWZpbmUgTVNNN1gwMF9HUElPX0lOVF9TVEFUVVNfNQlNU01fR1BJTzFfU0hBRE9XX1JFRygweEIwKQorCisvKgorICogUVNEOFg1MCByZWdpc3RlcnMKKyAqLworLyogb3V0cHV0IHZhbHVlICovCisjZGVmaW5lIFFTRDhYNTBfR1BJT19PVVRfMAlNU01fR1BJTzFfU0hBRE9XX1JFRygweDAwKSAgLyogZ3BpbyAgMTUtMCAgICovCisjZGVmaW5lIFFTRDhYNTBfR1BJT19PVVRfMQlNU01fR1BJTzJfU0hBRE9XX1JFRygweDAwKSAgLyogZ3BpbyAgNDItMTYgICovCisjZGVmaW5lIFFTRDhYNTBfR1BJT19PVVRfMglNU01fR1BJTzFfU0hBRE9XX1JFRygweDA0KSAgLyogZ3BpbyAgNjctNDMgICovCisjZGVmaW5lIFFTRDhYNTBfR1BJT19PVVRfMwlNU01fR1BJTzFfU0hBRE9XX1JFRygweDA4KSAgLyogZ3BpbyAgOTQtNjggICovCisjZGVmaW5lIFFTRDhYNTBfR1BJT19PVVRfNAlNU01fR1BJTzFfU0hBRE9XX1JFRygweDBDKSAgLyogZ3BpbyAxMDMtOTUgICovCisjZGVmaW5lIFFTRDhYNTBfR1BJT19PVVRfNQlNU01fR1BJTzFfU0hBRE9XX1JFRygweDEwKSAgLyogZ3BpbyAxMjEtMTA0ICovCisjZGVmaW5lIFFTRDhYNTBfR1BJT19PVVRfNglNU01fR1BJTzFfU0hBRE9XX1JFRygweDE0KSAgLyogZ3BpbyAxNTItMTIyICovCisjZGVmaW5lIFFTRDhYNTBfR1BJT19PVVRfNwlNU01fR1BJTzFfU0hBRE9XX1JFRygweDE4KSAgLyogZ3BpbyAxNjQtMTUzICovCisKKy8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgb3V0cHV0IGVuYWJsZSAqLworI2RlZmluZSBRU0Q4WDUwX0dQSU9fT0VfMAlNU01fR1BJTzFfU0hBRE9XX1JFRygweDIwKQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fT0VfMQlNU01fR1BJTzJfU0hBRE9XX1JFRygweDA4KQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fT0VfMglNU01fR1BJTzFfU0hBRE9XX1JFRygweDI0KQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fT0VfMwlNU01fR1BJTzFfU0hBRE9XX1JFRygweDI4KQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fT0VfNAlNU01fR1BJTzFfU0hBRE9XX1JFRygweDJDKQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fT0VfNQlNU01fR1BJTzFfU0hBRE9XX1JFRygweDMwKQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fT0VfNglNU01fR1BJTzFfU0hBRE9XX1JFRygweDM0KQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fT0VfNwlNU01fR1BJTzFfU0hBRE9XX1JFRygweDM4KQorCisvKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIGlucHV0IHJlYWQgKi8KKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOXzAJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg1MCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOXzEJTVNNX0dQSU8yX1NIQURPV19SRUcoMHgyMCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOXzIJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg1NCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOXzMJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg1OCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOXzQJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg1QykKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOXzUJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg2MCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOXzYJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg2NCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOXzcJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg2OCkKKworLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCAxPWVkZ2UgMD1sZXZlbCBpbnRlcnJ1cCAqLworI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0VER0VfMAlNU01fR1BJTzFfU0hBRE9XX1JFRygweDcwKQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0VER0VfMQlNU01fR1BJTzJfU0hBRE9XX1JFRygweDUwKQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0VER0VfMglNU01fR1BJTzFfU0hBRE9XX1JFRygweDc0KQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0VER0VfMwlNU01fR1BJTzFfU0hBRE9XX1JFRygweDc4KQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0VER0VfNAlNU01fR1BJTzFfU0hBRE9XX1JFRygweDdDKQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0VER0VfNQlNU01fR1BJTzFfU0hBRE9XX1JFRygweDgwKQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0VER0VfNglNU01fR1BJTzFfU0hBRE9XX1JFRygweDg0KQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0VER0VfNwlNU01fR1BJTzFfU0hBRE9XX1JFRygweDg4KQorCisvKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIDE9cG9zaXRpdmUgMD1uZWdhdGl2ZSAqLworI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX1BPU18wCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4OTApCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfUE9TXzEJTVNNX0dQSU8yX1NIQURPV19SRUcoMHg1OCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9QT1NfMglNU01fR1BJTzFfU0hBRE9XX1JFRygweDk0KQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX1BPU18zCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4OTgpCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfUE9TXzQJTVNNX0dQSU8xX1NIQURPV19SRUcoMHg5QykKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9QT1NfNQlNU01fR1BJTzFfU0hBRE9XX1JFRygweEEwKQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX1BPU182CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4QTQpCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfUE9TXzcJTVNNX0dQSU8xX1NIQURPV19SRUcoMHhBOCkKKworLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfRU5fMAlNU01fR1BJTzFfU0hBRE9XX1JFRygweEIwKQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0VOXzEJTVNNX0dQSU8yX1NIQURPV19SRUcoMHg2MCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9FTl8yCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4QjQpCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfRU5fMwlNU01fR1BJTzFfU0hBRE9XX1JFRygweEI4KQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0VOXzQJTVNNX0dQSU8xX1NIQURPV19SRUcoMHhCQykKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9FTl81CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4QzApCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfRU5fNglNU01fR1BJTzFfU0hBRE9XX1JFRygweEM0KQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0VOXzcJTVNNX0dQSU8xX1NIQURPV19SRUcoMHhDOCkKKworLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCB3cml0ZSAxIHRvIGNsZWFyIGludGVycnVwdCAqLworI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0NMRUFSXzAJTVNNX0dQSU8xX1NIQURPV19SRUcoMHhEMCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9DTEVBUl8xCU1TTV9HUElPMl9TSEFET1dfUkVHKDB4NjgpCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfQ0xFQVJfMglNU01fR1BJTzFfU0hBRE9XX1JFRygweEQ0KQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0NMRUFSXzMJTVNNX0dQSU8xX1NIQURPV19SRUcoMHhEOCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9DTEVBUl80CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4REMpCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfQ0xFQVJfNQlNU01fR1BJTzFfU0hBRE9XX1JFRygweEUwKQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX0NMRUFSXzYJTVNNX0dQSU8xX1NIQURPV19SRUcoMHhFNCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9DTEVBUl83CU1TTV9HUElPMV9TSEFET1dfUkVHKDB4RTgpCisKKy8qIHNhbWUgcGluIG1hcCBhcyBhYm92ZSwgMT1pbnRlcnJ1cHQgcGVuZGluZyAqLworI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX1NUQVRVU18wCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4RjApCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfU1RBVFVTXzEJTVNNX0dQSU8yX1NIQURPV19SRUcoMHg3MCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9TVEFUVVNfMglNU01fR1BJTzFfU0hBRE9XX1JFRygweEY0KQorI2RlZmluZSBRU0Q4WDUwX0dQSU9fSU5UX1NUQVRVU18zCU1TTV9HUElPMV9TSEFET1dfUkVHKDB4RjgpCisjZGVmaW5lIFFTRDhYNTBfR1BJT19JTlRfU1RBVFVTXzQJTVNNX0dQSU8xX1NIQURPV19SRUcoMHhGQykKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9TVEFUVVNfNQlNU01fR1BJTzFfU0hBRE9XX1JFRygweDEwMCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9TVEFUVVNfNglNU01fR1BJTzFfU0hBRE9XX1JFRygweDEwNCkKKyNkZWZpbmUgUVNEOFg1MF9HUElPX0lOVF9TVEFUVVNfNwlNU01fR1BJTzFfU0hBRE9XX1JFRygweDEwOCkKKworLyoKKyAqIE1TTTdYMzAgcmVnaXN0ZXJzCisgKi8KKy8qIG91dHB1dCB2YWx1ZSAqLworI2RlZmluZSBNU003WDMwX0dQSU9fT1VUXzAJTVNNX0dQSU8xX1JFRygweDAwKSAgIC8qIGdwaW8gIDE1LTAgICAqLworI2RlZmluZSBNU003WDMwX0dQSU9fT1VUXzEJTVNNX0dQSU8yX1JFRygweDAwKSAgIC8qIGdwaW8gIDQzLTE2ICAqLworI2RlZmluZSBNU003WDMwX0dQSU9fT1VUXzIJTVNNX0dQSU8xX1JFRygweDA0KSAgIC8qIGdwaW8gIDY3LTQ0ICAqLworI2RlZmluZSBNU003WDMwX0dQSU9fT1VUXzMJTVNNX0dQSU8xX1JFRygweDA4KSAgIC8qIGdwaW8gIDk0LTY4ICAqLworI2RlZmluZSBNU003WDMwX0dQSU9fT1VUXzQJTVNNX0dQSU8xX1JFRygweDBDKSAgIC8qIGdwaW8gMTA2LTk1ICAqLworI2RlZmluZSBNU003WDMwX0dQSU9fT1VUXzUJTVNNX0dQSU8xX1JFRygweDUwKSAgIC8qIGdwaW8gMTMzLTEwNyAqLworI2RlZmluZSBNU003WDMwX0dQSU9fT1VUXzYJTVNNX0dQSU8xX1JFRygweEM0KSAgIC8qIGdwaW8gMTUwLTEzNCAqLworI2RlZmluZSBNU003WDMwX0dQSU9fT1VUXzcJTVNNX0dQSU8xX1JFRygweDIxNCkgIC8qIGdwaW8gMTgxLTE1MSAqLworCisvKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIG91dHB1dCBlbmFibGUgKi8KKyNkZWZpbmUgTVNNN1gzMF9HUElPX09FXzAJTVNNX0dQSU8xX1JFRygweDEwKQorI2RlZmluZSBNU003WDMwX0dQSU9fT0VfMQlNU01fR1BJTzJfUkVHKDB4MDgpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19PRV8yCU1TTV9HUElPMV9SRUcoMHgxNCkKKyNkZWZpbmUgTVNNN1gzMF9HUElPX09FXzMJTVNNX0dQSU8xX1JFRygweDE4KQorI2RlZmluZSBNU003WDMwX0dQSU9fT0VfNAlNU01fR1BJTzFfUkVHKDB4MUMpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19PRV81CU1TTV9HUElPMV9SRUcoMHg1NCkKKyNkZWZpbmUgTVNNN1gzMF9HUElPX09FXzYJTVNNX0dQSU8xX1JFRygweEM4KQorI2RlZmluZSBNU003WDMwX0dQSU9fT0VfNwlNU01fR1BJTzFfUkVHKDB4MjE4KQorCisvKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIGlucHV0IHJlYWQgKi8KKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOXzAJTVNNX0dQSU8xX1JFRygweDM0KQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5fMQlNU01fR1BJTzJfUkVHKDB4MjApCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTl8yCU1TTV9HUElPMV9SRUcoMHgzOCkKKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOXzMJTVNNX0dQSU8xX1JFRygweDNDKQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5fNAlNU01fR1BJTzFfUkVHKDB4NDApCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTl81CU1TTV9HUElPMV9SRUcoMHg0NCkKKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOXzYJTVNNX0dQSU8xX1JFRygweENDKQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5fNwlNU01fR1BJTzFfUkVHKDB4MjFDKQorCisvKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIDE9ZWRnZSAwPWxldmVsIGludGVycnVwICovCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfRURHRV8wCU1TTV9HUElPMV9SRUcoMHg2MCkKKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOVF9FREdFXzEJTVNNX0dQSU8yX1JFRygweDUwKQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX0VER0VfMglNU01fR1BJTzFfUkVHKDB4NjQpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfRURHRV8zCU1TTV9HUElPMV9SRUcoMHg2OCkKKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOVF9FREdFXzQJTVNNX0dQSU8xX1JFRygweDZDKQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX0VER0VfNQlNU01fR1BJTzFfUkVHKDB4QzApCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfRURHRV82CU1TTV9HUElPMV9SRUcoMHhEMCkKKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOVF9FREdFXzcJTVNNX0dQSU8xX1JFRygweDI0MCkKKworLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCAxPXBvc2l0aXZlIDA9bmVnYXRpdmUgKi8KKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOVF9QT1NfMAlNU01fR1BJTzFfUkVHKDB4NzApCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfUE9TXzEJTVNNX0dQSU8yX1JFRygweDU4KQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX1BPU18yCU1TTV9HUElPMV9SRUcoMHg3NCkKKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOVF9QT1NfMwlNU01fR1BJTzFfUkVHKDB4NzgpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfUE9TXzQJTVNNX0dQSU8xX1JFRygweDdDKQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX1BPU181CU1TTV9HUElPMV9SRUcoMHhCQykKKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOVF9QT1NfNglNU01fR1BJTzFfUkVHKDB4RDQpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfUE9TXzcJTVNNX0dQSU8xX1JFRygweDIyOCkKKworLyogc2FtZSBwaW4gbWFwIGFzIGFib3ZlLCBpbnRlcnJ1cHQgZW5hYmxlICovCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfRU5fMAlNU01fR1BJTzFfUkVHKDB4ODApCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfRU5fMQlNU01fR1BJTzJfUkVHKDB4NjApCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfRU5fMglNU01fR1BJTzFfUkVHKDB4ODQpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfRU5fMwlNU01fR1BJTzFfUkVHKDB4ODgpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfRU5fNAlNU01fR1BJTzFfUkVHKDB4OEMpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfRU5fNQlNU01fR1BJTzFfUkVHKDB4QjgpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfRU5fNglNU01fR1BJTzFfUkVHKDB4RDgpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfRU5fNwlNU01fR1BJTzFfUkVHKDB4MjJDKQorCisvKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIHdyaXRlIDEgdG8gY2xlYXIgaW50ZXJydXB0ICovCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfQ0xFQVJfMAlNU01fR1BJTzFfUkVHKDB4OTApCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfQ0xFQVJfMQlNU01fR1BJTzJfUkVHKDB4NjgpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfQ0xFQVJfMglNU01fR1BJTzFfUkVHKDB4OTQpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfQ0xFQVJfMwlNU01fR1BJTzFfUkVHKDB4OTgpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfQ0xFQVJfNAlNU01fR1BJTzFfUkVHKDB4OUMpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfQ0xFQVJfNQlNU01fR1BJTzFfUkVHKDB4QjQpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfQ0xFQVJfNglNU01fR1BJTzFfUkVHKDB4REMpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfQ0xFQVJfNwlNU01fR1BJTzFfUkVHKDB4MjMwKQorCisvKiBzYW1lIHBpbiBtYXAgYXMgYWJvdmUsIDE9aW50ZXJydXB0IHBlbmRpbmcgKi8KKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOVF9TVEFUVVNfMAlNU01fR1BJTzFfUkVHKDB4QTApCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfU1RBVFVTXzEJTVNNX0dQSU8yX1JFRygweDcwKQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX1NUQVRVU18yCU1TTV9HUElPMV9SRUcoMHhBNCkKKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOVF9TVEFUVVNfMwlNU01fR1BJTzFfUkVHKDB4QTgpCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfU1RBVFVTXzQJTVNNX0dQSU8xX1JFRygweEFDKQorI2RlZmluZSBNU003WDMwX0dQSU9fSU5UX1NUQVRVU181CU1TTV9HUElPMV9SRUcoMHhCMCkKKyNkZWZpbmUgTVNNN1gzMF9HUElPX0lOVF9TVEFUVVNfNglNU01fR1BJTzFfUkVHKDB4RTApCisjZGVmaW5lIE1TTTdYMzBfR1BJT19JTlRfU1RBVFVTXzcJTVNNX0dQSU8xX1JFRygweDIzNCkKKworI2RlZmluZSBGSVJTVF9HUElPX0lSUSBNU01fR1BJT19UT19JTlQoMCkKKworI2RlZmluZSBNU01fR1BJT19CQU5LKHNvYywgYmFuaywgZmlyc3QsIGxhc3QpCQkJCVwKKwl7CQkJCQkJCQlcCisJCS5yZWdzID0gewkJCQkJCVwKKwkJCS5vdXQgPSAgICAgICAgIHNvYyMjX0dQSU9fT1VUXyMjYmFuaywJCVwKKwkJCS5pbiA9ICAgICAgICAgIHNvYyMjX0dQSU9fSU5fIyNiYW5rLAkJXAorCQkJLmludF9zdGF0dXMgPSAgc29jIyNfR1BJT19JTlRfU1RBVFVTXyMjYmFuaywJXAorCQkJLmludF9jbGVhciA9ICAgc29jIyNfR1BJT19JTlRfQ0xFQVJfIyNiYW5rLAlcCisJCQkuaW50X2VuID0gICAgICBzb2MjI19HUElPX0lOVF9FTl8jI2JhbmssCVwKKwkJCS5pbnRfZWRnZSA9ICAgIHNvYyMjX0dQSU9fSU5UX0VER0VfIyNiYW5rLAlcCisJCQkuaW50X3BvcyA9ICAgICBzb2MjI19HUElPX0lOVF9QT1NfIyNiYW5rLAlcCisJCQkub2UgPSAgICAgICAgICBzb2MjI19HUElPX09FXyMjYmFuaywJCVwKKwkJfSwJCQkJCQkJXAorCQkuY2hpcCA9IHsJCQkJCQlcCisJCQkuYmFzZSA9IChmaXJzdCksCQkJCVwKKwkJCS5uZ3BpbyA9IChsYXN0KSAtIChmaXJzdCkgKyAxLAkJCVwKKwkJCS5nZXQgPSBtc21fZ3Bpb19nZXQsCQkJCVwKKwkJCS5zZXQgPSBtc21fZ3Bpb19zZXQsCQkJCVwKKwkJCS5kaXJlY3Rpb25faW5wdXQgPSBtc21fZ3Bpb19kaXJlY3Rpb25faW5wdXQsCVwKKwkJCS5kaXJlY3Rpb25fb3V0cHV0ID0gbXNtX2dwaW9fZGlyZWN0aW9uX291dHB1dCwJXAorCQkJLnRvX2lycSA9IG1zbV9ncGlvX3RvX2lycSwJCQlcCisJCQkucmVxdWVzdCA9IG1zbV9ncGlvX3JlcXVlc3QsCQkJXAorCQkJLmZyZWUgPSBtc21fZ3Bpb19mcmVlLAkJCQlcCisJCX0JCQkJCQkJXAorCX0KKworI2RlZmluZSBNU01fR1BJT19CUk9LRU5fSU5UX0NMRUFSIDEKKworc3RydWN0IG1zbV9ncGlvX3JlZ3MgeworCXZvaWQgX19pb21lbSAqb3V0OworCXZvaWQgX19pb21lbSAqaW47CisJdm9pZCBfX2lvbWVtICppbnRfc3RhdHVzOworCXZvaWQgX19pb21lbSAqaW50X2NsZWFyOworCXZvaWQgX19pb21lbSAqaW50X2VuOworCXZvaWQgX19pb21lbSAqaW50X2VkZ2U7CisJdm9pZCBfX2lvbWVtICppbnRfcG9zOworCXZvaWQgX19pb21lbSAqb2U7Cit9OworCitzdHJ1Y3QgbXNtX2dwaW9fY2hpcCB7CisJc3BpbmxvY2tfdAkJbG9jazsKKwlzdHJ1Y3QgZ3Bpb19jaGlwCWNoaXA7CisJc3RydWN0IG1zbV9ncGlvX3JlZ3MJcmVnczsKKyNpZiBNU01fR1BJT19CUk9LRU5fSU5UX0NMRUFSCisJdW5zaWduZWQgICAgICAgICAgICAgICAgaW50X3N0YXR1c19jb3B5OworI2VuZGlmCisJdW5zaWduZWQgaW50ICAgICAgICAgICAgYm90aF9lZGdlX2RldGVjdDsKKwl1bnNpZ25lZCBpbnQgICAgICAgICAgICBpbnRfZW5hYmxlWzJdOyAvKiAwOiBhd2FrZSwgMTogc2xlZXAgKi8KK307CisKK3N0YXRpYyBpbnQgbXNtX2dwaW9fd3JpdGUoc3RydWN0IG1zbV9ncGlvX2NoaXAgKm1zbV9jaGlwLAorCQkJICB1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIG9uKQoreworCXVuc2lnbmVkIG1hc2sgPSBCSVQob2Zmc2V0KTsKKwl1bnNpZ25lZCB2YWw7CisKKwl2YWwgPSByZWFkbChtc21fY2hpcC0+cmVncy5vdXQpOworCWlmIChvbikKKwkJd3JpdGVsKHZhbCB8IG1hc2ssIG1zbV9jaGlwLT5yZWdzLm91dCk7CisJZWxzZQorCQl3cml0ZWwodmFsICYgfm1hc2ssIG1zbV9jaGlwLT5yZWdzLm91dCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1zbV9ncGlvX3VwZGF0ZV9ib3RoX2VkZ2VfZGV0ZWN0KHN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcCkKK3sKKwlpbnQgbG9vcF9saW1pdCA9IDEwMDsKKwl1bnNpZ25lZCBwb2wsIHZhbCwgdmFsMiwgaW50c3RhdDsKKwlkbyB7CisJCXZhbCA9IHJlYWRsKG1zbV9jaGlwLT5yZWdzLmluKTsKKwkJcG9sID0gcmVhZGwobXNtX2NoaXAtPnJlZ3MuaW50X3Bvcyk7CisJCXBvbCA9IChwb2wgJiB+bXNtX2NoaXAtPmJvdGhfZWRnZV9kZXRlY3QpIHwKKwkJICAgICAgKH52YWwgJiBtc21fY2hpcC0+Ym90aF9lZGdlX2RldGVjdCk7CisJCXdyaXRlbChwb2wsIG1zbV9jaGlwLT5yZWdzLmludF9wb3MpOworCQlpbnRzdGF0ID0gcmVhZGwobXNtX2NoaXAtPnJlZ3MuaW50X3N0YXR1cyk7CisJCXZhbDIgPSByZWFkbChtc21fY2hpcC0+cmVncy5pbik7CisJCWlmICgoKHZhbCBeIHZhbDIpICYgbXNtX2NoaXAtPmJvdGhfZWRnZV9kZXRlY3QgJiB+aW50c3RhdCkgPT0gMCkKKwkJCXJldHVybjsKKwl9IHdoaWxlIChsb29wX2xpbWl0LS0gPiAwKTsKKwlwcmludGsoS0VSTl9FUlIgIm1zbV9ncGlvX3VwZGF0ZV9ib3RoX2VkZ2VfZGV0ZWN0LCAiCisJICAgICAgICJmYWlsZWQgdG8gcmVhY2ggc3RhYmxlIHN0YXRlICV4ICE9ICV4XG4iLCB2YWwsIHZhbDIpOworfQorCitzdGF0aWMgaW50IG1zbV9ncGlvX2NsZWFyX2RldGVjdF9zdGF0dXMoc3RydWN0IG1zbV9ncGlvX2NoaXAgKm1zbV9jaGlwLAorCQkJCQl1bnNpZ25lZCBvZmZzZXQpCit7CisJdW5zaWduZWQgYml0ID0gQklUKG9mZnNldCk7CisKKyNpZiBNU01fR1BJT19CUk9LRU5fSU5UX0NMRUFSCisJLyogU2F2ZSBpbnRlcnJ1cHRzIHRoYXQgYWxyZWFkeSB0cmlnZ2VyZWQgYmVmb3JlIHdlIGxvb3NlIHRoZW0uICovCisJLyogQW55IGludGVycnVwdCB0aGF0IHRyaWdnZXJzIGJldHdlZW4gdGhlIHJlYWQgb2YgaW50X3N0YXR1cyAqLworCS8qIGFuZCB0aGUgd3JpdGUgdG8gaW50X2NsZWFyIHdpbGwgc3RpbGwgYmUgbG9zdCB0aG91Z2guICovCisJbXNtX2NoaXAtPmludF9zdGF0dXNfY29weSB8PSByZWFkbChtc21fY2hpcC0+cmVncy5pbnRfc3RhdHVzKTsKKwltc21fY2hpcC0+aW50X3N0YXR1c19jb3B5ICY9IH5iaXQ7CisjZW5kaWYKKwl3cml0ZWwoYml0LCBtc21fY2hpcC0+cmVncy5pbnRfY2xlYXIpOworCW1zbV9ncGlvX3VwZGF0ZV9ib3RoX2VkZ2VfZGV0ZWN0KG1zbV9jaGlwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtc21fZ3Bpb19kaXJlY3Rpb25faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcDsKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKworCW1zbV9jaGlwID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBtc21fZ3Bpb19jaGlwLCBjaGlwKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7CisJd3JpdGVsKHJlYWRsKG1zbV9jaGlwLT5yZWdzLm9lKSAmIH5CSVQob2Zmc2V0KSwgbXNtX2NoaXAtPnJlZ3Mub2UpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cittc21fZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIG9mZnNldCwgaW50IHZhbHVlKQoreworCXN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcDsKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKworCW1zbV9jaGlwID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCBtc21fZ3Bpb19jaGlwLCBjaGlwKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7CisJbXNtX2dwaW9fd3JpdGUobXNtX2NoaXAsIG9mZnNldCwgdmFsdWUpOworCXdyaXRlbChyZWFkbChtc21fY2hpcC0+cmVncy5vZSkgfCBCSVQob2Zmc2V0KSwgbXNtX2NoaXAtPnJlZ3Mub2UpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IG1zbV9ncGlvX2NoaXAgKm1zbV9jaGlwOworCisJbXNtX2NoaXAgPSBjb250YWluZXJfb2YoY2hpcCwgc3RydWN0IG1zbV9ncGlvX2NoaXAsIGNoaXApOworCXJldHVybiAocmVhZGwobXNtX2NoaXAtPnJlZ3MuaW4pICYgKDFVIDw8IG9mZnNldCkpID8gMSA6IDA7Cit9CisKK3N0YXRpYyB2b2lkIG1zbV9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQsIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgbXNtX2dwaW9fY2hpcCAqbXNtX2NoaXA7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisKKwltc21fY2hpcCA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgbXNtX2dwaW9fY2hpcCwgY2hpcCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOworCW1zbV9ncGlvX3dyaXRlKG1zbV9jaGlwLCBvZmZzZXQsIHZhbHVlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc21fY2hpcC0+bG9jaywgaXJxX2ZsYWdzKTsKK30KKworc3RhdGljIGludCBtc21fZ3Bpb190b19pcnEoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgb2Zmc2V0KQoreworCXJldHVybiBNU01fR1BJT19UT19JTlQoY2hpcC0+YmFzZSArIG9mZnNldCk7Cit9CisKKyNpZmRlZiBDT05GSUdfTVNNX0dQSU9NVVgKK3N0YXRpYyBpbnQgbXNtX2dwaW9fcmVxdWVzdChzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJcmV0dXJuIG1zbV9ncGlvbXV4X2dldChjaGlwLT5iYXNlICsgb2Zmc2V0KTsKK30KKworc3RhdGljIHZvaWQgbXNtX2dwaW9fZnJlZShzdHJ1Y3QgZ3Bpb19jaGlwICpjaGlwLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJbXNtX2dwaW9tdXhfcHV0KGNoaXAtPmJhc2UgKyBvZmZzZXQpOworfQorI2Vsc2UKKyNkZWZpbmUgbXNtX2dwaW9fcmVxdWVzdCBOVUxMCisjZGVmaW5lIG1zbV9ncGlvX2ZyZWUgTlVMTAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgbXNtX2dwaW9fY2hpcCAqbXNtX2dwaW9fY2hpcHM7CitzdGF0aWMgaW50IG1zbV9ncGlvX2NvdW50OworCitzdGF0aWMgc3RydWN0IG1zbV9ncGlvX2NoaXAgbXNtX2dwaW9fY2hpcHNfbXNtN3gwMVtdID0geworCU1TTV9HUElPX0JBTksoTVNNN1gwMCwgMCwgICAwLCAgMTUpLAorCU1TTV9HUElPX0JBTksoTVNNN1gwMCwgMSwgIDE2LCAgNDIpLAorCU1TTV9HUElPX0JBTksoTVNNN1gwMCwgMiwgIDQzLCAgNjcpLAorCU1TTV9HUElPX0JBTksoTVNNN1gwMCwgMywgIDY4LCAgOTQpLAorCU1TTV9HUElPX0JBTksoTVNNN1gwMCwgNCwgIDk1LCAxMDYpLAorCU1TTV9HUElPX0JBTksoTVNNN1gwMCwgNSwgMTA3LCAxMjEpLAorfTsKKworc3RhdGljIHN0cnVjdCBtc21fZ3Bpb19jaGlwIG1zbV9ncGlvX2NoaXBzX21zbTd4MzBbXSA9IHsKKwlNU01fR1BJT19CQU5LKE1TTTdYMzAsIDAsICAgMCwgIDE1KSwKKwlNU01fR1BJT19CQU5LKE1TTTdYMzAsIDEsICAxNiwgIDQzKSwKKwlNU01fR1BJT19CQU5LKE1TTTdYMzAsIDIsICA0NCwgIDY3KSwKKwlNU01fR1BJT19CQU5LKE1TTTdYMzAsIDMsICA2OCwgIDk0KSwKKwlNU01fR1BJT19CQU5LKE1TTTdYMzAsIDQsICA5NSwgMTA2KSwKKwlNU01fR1BJT19CQU5LKE1TTTdYMzAsIDUsIDEwNywgMTMzKSwKKwlNU01fR1BJT19CQU5LKE1TTTdYMzAsIDYsIDEzNCwgMTUwKSwKKwlNU01fR1BJT19CQU5LKE1TTTdYMzAsIDcsIDE1MSwgMTgxKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgbXNtX2dwaW9fY2hpcCBtc21fZ3Bpb19jaGlwc19xc2Q4eDUwW10gPSB7CisJTVNNX0dQSU9fQkFOSyhRU0Q4WDUwLCAwLCAgIDAsICAxNSksCisJTVNNX0dQSU9fQkFOSyhRU0Q4WDUwLCAxLCAgMTYsICA0MiksCisJTVNNX0dQSU9fQkFOSyhRU0Q4WDUwLCAyLCAgNDMsICA2NyksCisJTVNNX0dQSU9fQkFOSyhRU0Q4WDUwLCAzLCAgNjgsICA5NCksCisJTVNNX0dQSU9fQkFOSyhRU0Q4WDUwLCA0LCAgOTUsIDEwMyksCisJTVNNX0dQSU9fQkFOSyhRU0Q4WDUwLCA1LCAxMDQsIDEyMSksCisJTVNNX0dQSU9fQkFOSyhRU0Q4WDUwLCA2LCAxMjIsIDE1MiksCisJTVNNX0dQSU9fQkFOSyhRU0Q4WDUwLCA3LCAxNTMsIDE2NCksCit9OworCitzdGF0aWMgdm9pZCBtc21fZ3Bpb19pcnFfYWNrKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKKwlzdHJ1Y3QgbXNtX2dwaW9fY2hpcCAqbXNtX2NoaXAgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7CisJbXNtX2dwaW9fY2xlYXJfZGV0ZWN0X3N0YXR1cyhtc21fY2hpcCwKKwkJCQkgICAgIGQtPmlycSAtIGdwaW9fdG9faXJxKG1zbV9jaGlwLT5jaGlwLmJhc2UpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc21fY2hpcC0+bG9jaywgaXJxX2ZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgbXNtX2dwaW9faXJxX21hc2soc3RydWN0IGlycV9kYXRhICpkKQoreworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCXN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXVuc2lnbmVkIG9mZnNldCA9IGQtPmlycSAtIGdwaW9fdG9faXJxKG1zbV9jaGlwLT5jaGlwLmJhc2UpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOworCS8qIGxldmVsIHRyaWdnZXJlZCBpbnRlcnJ1cHRzIGFyZSBhbHNvIGxhdGNoZWQgKi8KKwlpZiAoIShyZWFkbChtc21fY2hpcC0+cmVncy5pbnRfZWRnZSkgJiBCSVQob2Zmc2V0KSkpCisJCW1zbV9ncGlvX2NsZWFyX2RldGVjdF9zdGF0dXMobXNtX2NoaXAsIG9mZnNldCk7CisJbXNtX2NoaXAtPmludF9lbmFibGVbMF0gJj0gfkJJVChvZmZzZXQpOworCXdyaXRlbChtc21fY2hpcC0+aW50X2VuYWJsZVswXSwgbXNtX2NoaXAtPnJlZ3MuaW50X2VuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc21fY2hpcC0+bG9jaywgaXJxX2ZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgbXNtX2dwaW9faXJxX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmQpCit7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisJc3RydWN0IG1zbV9ncGlvX2NoaXAgKm1zbV9jaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJdW5zaWduZWQgb2Zmc2V0ID0gZC0+aXJxIC0gZ3Bpb190b19pcnEobXNtX2NoaXAtPmNoaXAuYmFzZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7CisJLyogbGV2ZWwgdHJpZ2dlcmVkIGludGVycnVwdHMgYXJlIGFsc28gbGF0Y2hlZCAqLworCWlmICghKHJlYWRsKG1zbV9jaGlwLT5yZWdzLmludF9lZGdlKSAmIEJJVChvZmZzZXQpKSkKKwkJbXNtX2dwaW9fY2xlYXJfZGV0ZWN0X3N0YXR1cyhtc21fY2hpcCwgb2Zmc2V0KTsKKwltc21fY2hpcC0+aW50X2VuYWJsZVswXSB8PSBCSVQob2Zmc2V0KTsKKwl3cml0ZWwobXNtX2NoaXAtPmludF9lbmFibGVbMF0sIG1zbV9jaGlwLT5yZWdzLmludF9lbik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgbXNtX2dwaW9faXJxX3NldF93YWtlKHN0cnVjdCBpcnFfZGF0YSAqZCwgdW5zaWduZWQgaW50IG9uKQoreworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCXN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXVuc2lnbmVkIG9mZnNldCA9IGQtPmlycSAtIGdwaW9fdG9faXJxKG1zbV9jaGlwLT5jaGlwLmJhc2UpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOworCisJaWYgKG9uKQorCQltc21fY2hpcC0+aW50X2VuYWJsZVsxXSB8PSBCSVQob2Zmc2V0KTsKKwllbHNlCisJCW1zbV9jaGlwLT5pbnRfZW5hYmxlWzFdICY9IH5CSVQob2Zmc2V0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1zbV9jaGlwLT5sb2NrLCBpcnFfZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1zbV9ncGlvX2lycV9zZXRfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmQsIHVuc2lnbmVkIGludCBmbG93X3R5cGUpCit7CisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CisJc3RydWN0IG1zbV9ncGlvX2NoaXAgKm1zbV9jaGlwID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CisJdW5zaWduZWQgb2Zmc2V0ID0gZC0+aXJxIC0gZ3Bpb190b19pcnEobXNtX2NoaXAtPmNoaXAuYmFzZSk7CisJdW5zaWduZWQgdmFsLCBtYXNrID0gQklUKG9mZnNldCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbXNtX2NoaXAtPmxvY2ssIGlycV9mbGFncyk7CisJdmFsID0gcmVhZGwobXNtX2NoaXAtPnJlZ3MuaW50X2VkZ2UpOworCWlmIChmbG93X3R5cGUgJiBJUlFfVFlQRV9FREdFX0JPVEgpIHsKKwkJd3JpdGVsKHZhbCB8IG1hc2ssIG1zbV9jaGlwLT5yZWdzLmludF9lZGdlKTsKKwkJX19pcnFfc2V0X2hhbmRsZXJfbG9ja2VkKGQtPmlycSwgaGFuZGxlX2VkZ2VfaXJxKTsKKwl9IGVsc2UgeworCQl3cml0ZWwodmFsICYgfm1hc2ssIG1zbV9jaGlwLT5yZWdzLmludF9lZGdlKTsKKwkJX19pcnFfc2V0X2hhbmRsZXJfbG9ja2VkKGQtPmlycSwgaGFuZGxlX2xldmVsX2lycSk7CisJfQorCWlmICgoZmxvd190eXBlICYgSVJRX1RZUEVfRURHRV9CT1RIKSA9PSBJUlFfVFlQRV9FREdFX0JPVEgpIHsKKwkJbXNtX2NoaXAtPmJvdGhfZWRnZV9kZXRlY3QgfD0gbWFzazsKKwkJbXNtX2dwaW9fdXBkYXRlX2JvdGhfZWRnZV9kZXRlY3QobXNtX2NoaXApOworCX0gZWxzZSB7CisJCW1zbV9jaGlwLT5ib3RoX2VkZ2VfZGV0ZWN0ICY9IH5tYXNrOworCQl2YWwgPSByZWFkbChtc21fY2hpcC0+cmVncy5pbnRfcG9zKTsKKwkJaWYgKGZsb3dfdHlwZSAmIChJUlFGX1RSSUdHRVJfUklTSU5HIHwgSVJRRl9UUklHR0VSX0hJR0gpKQorCQkJd3JpdGVsKHZhbCB8IG1hc2ssIG1zbV9jaGlwLT5yZWdzLmludF9wb3MpOworCQllbHNlCisJCQl3cml0ZWwodmFsICYgfm1hc2ssIG1zbV9jaGlwLT5yZWdzLmludF9wb3MpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtc21fY2hpcC0+bG9jaywgaXJxX2ZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXNtX2dwaW9faXJxX2hhbmRsZXIodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCWludCBpLCBqLCBtYXNrOworCXVuc2lnbmVkIHZhbDsKKworCWZvciAoaSA9IDA7IGkgPCBtc21fZ3Bpb19jb3VudDsgaSsrKSB7CisJCXN0cnVjdCBtc21fZ3Bpb19jaGlwICptc21fY2hpcCA9ICZtc21fZ3Bpb19jaGlwc1tpXTsKKwkJdmFsID0gcmVhZGwobXNtX2NoaXAtPnJlZ3MuaW50X3N0YXR1cyk7CisJCXZhbCAmPSBtc21fY2hpcC0+aW50X2VuYWJsZVswXTsKKwkJd2hpbGUgKHZhbCkgeworCQkJbWFzayA9IHZhbCAmIC12YWw7CisJCQlqID0gZmxzKG1hc2spIC0gMTsKKwkJCS8qIHByaW50aygiJXMgJTA4eCAlMDh4IGJpdCAlZCBncGlvICVkIGlycSAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgdiwgbSwgaiwgbXNtX2NoaXAtPmNoaXAuc3RhcnQgKyBqLAorCQkJCUZJUlNUX0dQSU9fSVJRICsgbXNtX2NoaXAtPmNoaXAuc3RhcnQgKyBqKTsgKi8KKwkJCXZhbCAmPSB+bWFzazsKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShGSVJTVF9HUElPX0lSUSArCisJCQkJCSAgIG1zbV9jaGlwLT5jaGlwLmJhc2UgKyBqKTsKKwkJfQorCX0KKwlkZXNjLT5pcnFfZGF0YS5jaGlwLT5pcnFfYWNrKCZkZXNjLT5pcnFfZGF0YSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgbXNtX2dwaW9faXJxX2NoaXAgPSB7CisJLm5hbWUgICAgICAgICAgPSAibXNtZ3BpbyIsCisJLmlycV9hY2sgICAgICAgPSBtc21fZ3Bpb19pcnFfYWNrLAorCS5pcnFfbWFzayAgICAgID0gbXNtX2dwaW9faXJxX21hc2ssCisJLmlycV91bm1hc2sgICAgPSBtc21fZ3Bpb19pcnFfdW5tYXNrLAorCS5pcnFfc2V0X3dha2UgID0gbXNtX2dwaW9faXJxX3NldF93YWtlLAorCS5pcnFfc2V0X3R5cGUgID0gbXNtX2dwaW9faXJxX3NldF90eXBlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbXNtX2luaXRfZ3Bpbyh2b2lkKQoreworCWludCBpLCBqID0gMDsKKworCWlmIChjcHVfaXNfbXNtN3gwMSgpKSB7CisJCW1zbV9ncGlvX2NoaXBzID0gbXNtX2dwaW9fY2hpcHNfbXNtN3gwMTsKKwkJbXNtX2dwaW9fY291bnQgPSBBUlJBWV9TSVpFKG1zbV9ncGlvX2NoaXBzX21zbTd4MDEpOworCX0gZWxzZSBpZiAoY3B1X2lzX21zbTd4MzAoKSkgeworCQltc21fZ3Bpb19jaGlwcyA9IG1zbV9ncGlvX2NoaXBzX21zbTd4MzA7CisJCW1zbV9ncGlvX2NvdW50ID0gQVJSQVlfU0laRShtc21fZ3Bpb19jaGlwc19tc203eDMwKTsKKwl9IGVsc2UgaWYgKGNwdV9pc19xc2Q4eDUwKCkpIHsKKwkJbXNtX2dwaW9fY2hpcHMgPSBtc21fZ3Bpb19jaGlwc19xc2Q4eDUwOworCQltc21fZ3Bpb19jb3VudCA9IEFSUkFZX1NJWkUobXNtX2dwaW9fY2hpcHNfcXNkOHg1MCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gRklSU1RfR1BJT19JUlE7IGkgPCBGSVJTVF9HUElPX0lSUSArIE5SX0dQSU9fSVJRUzsgaSsrKSB7CisJCWlmIChpIC0gRklSU1RfR1BJT19JUlEgPj0KKwkJCW1zbV9ncGlvX2NoaXBzW2pdLmNoaXAuYmFzZSArCisJCQltc21fZ3Bpb19jaGlwc1tqXS5jaGlwLm5ncGlvKQorCQkJaisrOworCQlpcnFfc2V0X2NoaXBfZGF0YShpLCAmbXNtX2dwaW9fY2hpcHNbal0pOworCQlpcnFfc2V0X2NoaXBfYW5kX2hhbmRsZXIoaSwgJm1zbV9ncGlvX2lycV9jaGlwLAorCQkJCQkgaGFuZGxlX2VkZ2VfaXJxKTsKKwkJc2V0X2lycV9mbGFncyhpLCBJUlFGX1ZBTElEKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbXNtX2dwaW9fY291bnQ7IGkrKykgeworCQlzcGluX2xvY2tfaW5pdCgmbXNtX2dwaW9fY2hpcHNbaV0ubG9jayk7CisJCXdyaXRlbCgwLCBtc21fZ3Bpb19jaGlwc1tpXS5yZWdzLmludF9lbik7CisJCWdwaW9jaGlwX2FkZCgmbXNtX2dwaW9fY2hpcHNbaV0uY2hpcCk7CisJfQorCisJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoSU5UX0dQSU9fR1JPVVAxLCBtc21fZ3Bpb19pcnFfaGFuZGxlcik7CisJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoSU5UX0dQSU9fR1JPVVAyLCBtc21fZ3Bpb19pcnFfaGFuZGxlcik7CisJaXJxX3NldF9pcnFfd2FrZShJTlRfR1BJT19HUk9VUDEsIDEpOworCWlycV9zZXRfaXJxX3dha2UoSU5UX0dQSU9fR1JPVVAyLCAyKTsKKwlyZXR1cm4gMDsKK30KKworcG9zdGNvcmVfaW5pdGNhbGwobXNtX2luaXRfZ3Bpbyk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW1zbS9ncGlvLXYyLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tc20tdjIuYwpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBhcmNoL2FybS9tYWNoLW1zbS9ncGlvLXYyLmMKcmVuYW1lIHRvIGRyaXZlcnMvZ3Bpby9ncGlvLW1zbS12Mi5jCmluZGV4IGNjOWM0ZmQuLjVjYjEyMjcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2dwaW8tdjIuYworKysgYi9kcml2ZXJzL2dwaW8vZ3Bpby1tc20tdjIuYwpAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAoYykgMjAxMCwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSwgQ29kZSBBdXJvcmEgRm9ydW0uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFuZApAQCAtMzAsOCArMzAsOCBAQAogCiAjaW5jbHVkZSA8YXNtL21hY2gvaXJxLmg+CiAKKyNpbmNsdWRlIDxtYWNoL21zbV9ncGlvbXV4Lmg+CiAjaW5jbHVkZSA8bWFjaC9tc21faW9tYXAuaD4KLSNpbmNsdWRlICJncGlvbXV4LmgiCiAKIC8qIEJpdHMgb2YgaW50ZXJlc3QgaW4gdGhlIEdQSU9fSU5fT1VUIHJlZ2lzdGVyLgogICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby10cHM2NTkxMi5jIGIvZHJpdmVycy9ncGlvL2dwaW8tdHBzNjU5MTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWU2NmMwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tdHBzNjU5MTIuYwpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDExIFRleGFzIEluc3RydW1lbnRzIEluYy4KKyAqCisgKiBBdXRob3I6IE1hcmdhcml0YSBPbGF5YSA8bWFnaUBzbGltbG9naWMuY28udWs+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gd204MzUwIGltcGxlbWVudGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC90cHM2NTkxMi5oPgorCitzdHJ1Y3QgdHBzNjU5MTJfZ3Bpb19kYXRhIHsKKwlzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyOworCXN0cnVjdCBncGlvX2NoaXAgZ3Bpb19jaGlwOworfTsKKworc3RhdGljIGludCB0cHM2NTkxMl9ncGlvX2dldChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgb2Zmc2V0KQoreworCXN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTIgPSBjb250YWluZXJfb2YoZ2MsIHN0cnVjdCB0cHM2NTkxMiwgZ3Bpbyk7CisJaW50IHZhbDsKKworCXZhbCA9IHRwczY1OTEyX3JlZ19yZWFkKHRwczY1OTEyLCBUUFM2NTkxMl9HUElPMSArIG9mZnNldCk7CisKKwlpZiAodmFsICYgR1BJT19TVFNfTUFTSykKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdHBzNjU5MTJfZ3Bpb19zZXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIG9mZnNldCwKKwkJCSAgICAgIGludCB2YWx1ZSkKK3sKKwlzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyID0gY29udGFpbmVyX29mKGdjLCBzdHJ1Y3QgdHBzNjU5MTIsIGdwaW8pOworCisJaWYgKHZhbHVlKQorCQl0cHM2NTkxMl9zZXRfYml0cyh0cHM2NTkxMiwgVFBTNjU5MTJfR1BJTzEgKyBvZmZzZXQsCisJCQkJCQkJR1BJT19TRVRfTUFTSyk7CisJZWxzZQorCQl0cHM2NTkxMl9jbGVhcl9iaXRzKHRwczY1OTEyLCBUUFM2NTkxMl9HUElPMSArIG9mZnNldCwKKwkJCQkJCQkJR1BJT19TRVRfTUFTSyk7Cit9CisKK3N0YXRpYyBpbnQgdHBzNjU5MTJfZ3Bpb19vdXRwdXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIG9mZnNldCwKKwkJCQlpbnQgdmFsdWUpCit7CisJc3RydWN0IHRwczY1OTEyICp0cHM2NTkxMiA9IGNvbnRhaW5lcl9vZihnYywgc3RydWN0IHRwczY1OTEyLCBncGlvKTsKKworCS8qIFNldCB0aGUgaW5pdGlhbCB2YWx1ZSAqLworCXRwczY1OTEyX2dwaW9fc2V0KGdjLCBvZmZzZXQsIHZhbHVlKTsKKworCXJldHVybiB0cHM2NTkxMl9zZXRfYml0cyh0cHM2NTkxMiwgVFBTNjU5MTJfR1BJTzEgKyBvZmZzZXQsCisJCQkJCQkJCUdQSU9fQ0ZHX01BU0spOworfQorCitzdGF0aWMgaW50IHRwczY1OTEyX2dwaW9faW5wdXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyID0gY29udGFpbmVyX29mKGdjLCBzdHJ1Y3QgdHBzNjU5MTIsIGdwaW8pOworCisJcmV0dXJuIHRwczY1OTEyX2NsZWFyX2JpdHModHBzNjU5MTIsIFRQUzY1OTEyX0dQSU8xICsgb2Zmc2V0LAorCQkJCQkJCQlHUElPX0NGR19NQVNLKTsKKworfQorCitzdGF0aWMgc3RydWN0IGdwaW9fY2hpcCB0ZW1wbGF0ZV9jaGlwID0geworCS5sYWJlbAkJCT0gInRwczY1OTEyIiwKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5kaXJlY3Rpb25faW5wdXQJPSB0cHM2NTkxMl9ncGlvX2lucHV0LAorCS5kaXJlY3Rpb25fb3V0cHV0CT0gdHBzNjU5MTJfZ3Bpb19vdXRwdXQsCisJLmdldAkJCT0gdHBzNjU5MTJfZ3Bpb19nZXQsCisJLnNldAkJCT0gdHBzNjU5MTJfZ3Bpb19zZXQsCisJLmNhbl9zbGVlcAkJPSAxLAorCS5uZ3BpbwkJCT0gNSwKKwkuYmFzZQkJCT0gLTEsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB0cHM2NTkxMl9ncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHRwczY1OTEyICp0cHM2NTkxMiA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgdHBzNjU5MTJfYm9hcmQgKnBkYXRhID0gdHBzNjU5MTItPmRldi0+cGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgdHBzNjU5MTJfZ3Bpb19kYXRhICp0cHM2NTkxMl9ncGlvOworCWludCByZXQ7CisKKwl0cHM2NTkxMl9ncGlvID0ga3phbGxvYyhzaXplb2YoKnRwczY1OTEyX2dwaW8pLCBHRlBfS0VSTkVMKTsKKwlpZiAodHBzNjU5MTJfZ3BpbyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRwczY1OTEyX2dwaW8tPnRwczY1OTEyID0gdHBzNjU5MTI7CisJdHBzNjU5MTJfZ3Bpby0+Z3Bpb19jaGlwID0gdGVtcGxhdGVfY2hpcDsKKwl0cHM2NTkxMl9ncGlvLT5ncGlvX2NoaXAuZGV2ID0gJnBkZXYtPmRldjsKKwlpZiAocGRhdGEgJiYgcGRhdGEtPmdwaW9fYmFzZSkKKwkJdHBzNjU5MTJfZ3Bpby0+Z3Bpb19jaGlwLmJhc2UgPSBwZGF0YS0+Z3Bpb19iYXNlOworCisJcmV0ID0gZ3Bpb2NoaXBfYWRkKCZ0cHM2NTkxMl9ncGlvLT5ncGlvX2NoaXApOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZWdpc3RlciBncGlvY2hpcCwgJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyOworCX0KKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHRwczY1OTEyX2dwaW8pOworCisJcmV0dXJuIHJldDsKKworZXJyOgorCWtmcmVlKHRwczY1OTEyX2dwaW8pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHRwczY1OTEyX2dwaW9fcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHRwczY1OTEyX2dwaW9fZGF0YSAgKnRwczY1OTEyX2dwaW8gPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ3Bpb2NoaXBfcmVtb3ZlKCZ0cHM2NTkxMl9ncGlvLT5ncGlvX2NoaXApOworCWlmIChyZXQgPT0gMCkKKwkJa2ZyZWUodHBzNjU5MTJfZ3Bpbyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB0cHM2NTkxMl9ncGlvX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJ0cHM2NTkxMi1ncGlvIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSB0cHM2NTkxMl9ncGlvX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcCh0cHM2NTkxMl9ncGlvX3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0cHM2NTkxMl9ncGlvX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ0cHM2NTkxMl9ncGlvX2RyaXZlcik7Cit9CitzdWJzeXNfaW5pdGNhbGwodHBzNjU5MTJfZ3Bpb19pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHRwczY1OTEyX2dwaW9fZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ0cHM2NTkxMl9ncGlvX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdCh0cHM2NTkxMl9ncGlvX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJNYXJnYXJpdGEgT2xheWEgQ2FicmVyYSA8bWFnaUBzbGltbG9naWMuY28udWs+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkdQSU8gaW50ZXJmYWNlIGZvciBUUFM2NTkxMiBQTUlDcyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTp0cHM2NTkxMi1ncGlvIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL0tjb25maWcgYi9kcml2ZXJzL2h3bW9uL0tjb25maWcKaW5kZXggMDU5OGNkMi4uMGI2MmMzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9LY29uZmlnCisrKyBiL2RyaXZlcnMvaHdtb24vS2NvbmZpZwpAQCAtNjIzLDcgKzYyMyw3IEBACiAJICBMTTg2LCBMTTg5IGFuZCBMTTk5LCBBbmFsb2cgRGV2aWNlcyBBRE0xMDMyLCBBRFQ3NDYxLCBhbmQgQURUNzQ2MUEsCiAJICBNYXhpbSBNQVg2NjQ2LCBNQVg2NjQ3LCBNQVg2NjQ4LCBNQVg2NjQ5LCBNQVg2NjU3LCBNQVg2NjU4LCBNQVg2NjU5LAogCSAgTUFYNjY4MCwgTUFYNjY4MSwgTUFYNjY5MiwgTUFYNjY5NSwgTUFYNjY5NiwgT04gU2VtaWNvbmR1Y3RvciBOQ1QxMDA4LAotCSAgYW5kIFdpbmJvbmQvTnV2b3RvbiBXODNMNzcxVy9HL0FXRy9BU0cgc2Vuc29yIGNoaXBzLgorCSAgV2luYm9uZC9OdXZvdG9uIFc4M0w3NzFXL0cvQVdHL0FTRyBhbmQgUGhpbGlwcyBTQTU2MDA0IHNlbnNvciBjaGlwcy4KIAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgbG05MC4KQEAgLTY5NCwxNCArNjk0LDI0IEBACiAJICBiZSBjYWxsZWQgbHRjNDI2MS4KIAogY29uZmlnIFNFTlNPUlNfTE05NTI0MQotCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNOTUyNDEgc2Vuc29yIGNoaXAiCisJdHJpc3RhdGUgIk5hdGlvbmFsIFNlbWljb25kdWN0b3IgTE05NTI0MSBhbmQgY29tcGF0aWJsZXMiCiAJZGVwZW5kcyBvbiBJMkMKIAloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgTE05NTI0MSBzZW5zb3IgY2hpcC4KKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBMTTk1MjMxIGFuZCBMTTk1MjQxIHNlbnNvcgorCSAgY2hpcHMuCiAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIGxtOTUyNDEuCiAKK2NvbmZpZyBTRU5TT1JTX0xNOTUyNDUKKwl0cmlzdGF0ZSAiTmF0aW9uYWwgU2VtaWNvbmR1Y3RvciBMTTk1MjQ1IHNlbnNvciBjaGlwIgorCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBMTTk1MjQ1IHNlbnNvciBjaGlwLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBsbTk1MjQ1LgorCiBjb25maWcgU0VOU09SU19NQVgxMTExCiAJdHJpc3RhdGUgIk1heGltIE1BWDExMTEgTXVsdGljaGFubmVsLCBTZXJpYWwgOC1iaXQgQURDIGNoaXAiCiAJZGVwZW5kcyBvbiBTUElfTUFTVEVSCkBAIC03MzYsNiArNzQ2LDE2IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCiAJICB3aWxsIGJlIGNhbGxlZCBtYXgxNjE5LgogCitjb25maWcgU0VOU09SU19NQVgxNjY4CisJdHJpc3RhdGUgIk1heGltIE1BWDE2NjggYW5kIGNvbXBhdGlibGVzIgorCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBzdXBwb3J0IGZvciBNQVgxNjY4LCBNQVgxOTg5IGFuZAorCSAgTUFYMTgwNSBjaGlwcy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgbWF4MTY2OC4KKwogY29uZmlnIFNFTlNPUlNfTUFYNjYzOQogCXRyaXN0YXRlICJNYXhpbSBNQVg2NjM5IHNlbnNvciBjaGlwIgogCWRlcGVuZHMgb24gSTJDICYmIEVYUEVSSU1FTlRBTApAQCAtNzY3LDYgKzc4NywyMCBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgbWF4NjY1MC4KIAorY29uZmlnIFNFTlNPUlNfTlRDX1RIRVJNSVNUT1IKKwl0cmlzdGF0ZSAiTlRDIHRoZXJtaXN0b3Igc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIE5UQyB0aGVybWlzdG9ycyBzZW5zb3IgcmVhZGluZyBhbmQgaXRzCisJICBpbnRlcnByZXRhdGlvbi4gVGhlIGRyaXZlciBjYW4gYWxzbyBtb25pdG9yIHRoZSB0ZW1wZXJhdHVyZSBhbmQKKwkgIHNlbmQgbm90aWZpY2F0aW9ucyBhYm91dCB0aGUgdGVtcGVyYXR1cmUuCisKKwkgIEN1cnJlbnRseSwgdGhpcyBkcml2ZXIgc3VwcG9ydHMKKwkgIE5DUDE1V0I0NzMsIE5DUDE4V0I0NzMsIE5DUDIxV0I0NzMsIE5DUDAzV0I0NzMsIGFuZCBOQ1AxNVdMMzMzLgorCisJICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gIElmIHNvLCB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCBudGMtdGhlcm1pc3Rvci4KKwogY29uZmlnIFNFTlNPUlNfUEM4NzM2MAogCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIFBDODczNjAgZmFtaWx5IgogCXNlbGVjdCBIV01PTl9WSUQKQEAgLTgwNyw5MiArODQxLDcgQEAKIAkgIFRoZXNlIGRldmljZXMgYXJlIGhhcmQgdG8gZGV0ZWN0IGFuZCByYXJlbHkgZm91bmQgb24gbWFpbnN0cmVhbQogCSAgaGFyZHdhcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCi1jb25maWcgUE1CVVMKLQl0cmlzdGF0ZSAiUE1CdXMgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKLQlkZWZhdWx0IG4KLQloZWxwCi0JICBTYXkgeWVzIGhlcmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIFBNQnVzIHN1cHBvcnQuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCi0JICBiZSBjYWxsZWQgcG1idXNfY29yZS4KLQotaWYgUE1CVVMKLQotY29uZmlnIFNFTlNPUlNfUE1CVVMKLQl0cmlzdGF0ZSAiR2VuZXJpYyBQTUJ1cyBkZXZpY2VzIgotCWRlZmF1bHQgbgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBoYXJkd2FyZSBtb25pdG9yaW5nIHN1cHBvcnQgZm9yIGdlbmVyaWMKLQkgIFBNQnVzIGRldmljZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gQk1SNDUwLCBCTVI0NTEsIEJNUjQ1MywKLQkgIEJNUjQ1NCwgYW5kIExUQzI5NzguCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCi0JICBiZSBjYWxsZWQgcG1idXMuCi0KLWNvbmZpZyBTRU5TT1JTX0FETTEyNzUKLQl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURNMTI3NSIKLQlkZWZhdWx0IG4KLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgaGFyZHdhcmUgbW9uaXRvcmluZyBzdXBwb3J0IGZvciBBbmFsb2cKLQkgIERldmljZXMgQURNMTI3NSBIb3QtU3dhcCBDb250cm9sbGVyIGFuZCBEaWdpdGFsIFBvd2VyIE1vbml0b3IuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCi0JICBiZSBjYWxsZWQgYWRtMTI3NS4KLQotY29uZmlnIFNFTlNPUlNfTUFYMTYwNjQKLQl0cmlzdGF0ZSAiTWF4aW0gTUFYMTYwNjQiCi0JZGVmYXVsdCBuCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IGhhcmR3YXJlIG1vbml0b3Jpbmcgc3VwcG9ydCBmb3IgTWF4aW0KLQkgIE1BWDE2MDY0LgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAotCSAgYmUgY2FsbGVkIG1heDE2MDY0LgotCi1jb25maWcgU0VOU09SU19NQVgzNDQ0MAotCXRyaXN0YXRlICJNYXhpbSBNQVgzNDQ0MC9NQVgzNDQ0MSIKLQlkZWZhdWx0IG4KLQloZWxwCi0JICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgaGFyZHdhcmUgbW9uaXRvcmluZyBzdXBwb3J0IGZvciBNYXhpbQotCSAgTUFYMzQ0NDAgYW5kIE1BWDM0NDQxLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAotCSAgYmUgY2FsbGVkIG1heDM0NDQwLgotCi1jb25maWcgU0VOU09SU19NQVg4Njg4Ci0JdHJpc3RhdGUgIk1heGltIE1BWDg2ODgiCi0JZGVmYXVsdCBuCi0JaGVscAotCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IGhhcmR3YXJlIG1vbml0b3Jpbmcgc3VwcG9ydCBmb3IgTWF4aW0KLQkgIE1BWDg2ODguCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCi0JICBiZSBjYWxsZWQgbWF4ODY4OC4KLQotY29uZmlnIFNFTlNPUlNfVUNEOTAwMAotCXRyaXN0YXRlICJUSSBVQ0Q5MDEyMCwgVUNEOTAxMjQsIFVDRDkwOTAsIFVDRDkwOTEwIgotCWRlZmF1bHQgbgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBoYXJkd2FyZSBtb25pdG9yaW5nIHN1cHBvcnQgZm9yIFRJCi0JICBVQ0Q5MDEyMCwgVUNEOTAxMjQsIFVDRDkwOTAsIFVDRDkwOTEwIFNlcXVlbmNlciBhbmQgU3lzdGVtIEhlYWx0aAotCSAgQ29udHJvbGxlcnMuCi0KLQkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCi0JICBiZSBjYWxsZWQgdWNkOTAwMC4KLQotY29uZmlnIFNFTlNPUlNfVUNEOTIwMAotCXRyaXN0YXRlICJUSSBVQ0Q5MjIwLCBVQ0Q5MjIyLCBVQ0Q5MjI0LCBVQ0Q5MjQwLCBVQ0Q5MjQ0LCBVQ0Q5MjQ2LCBVQ0Q5MjQ4IgotCWRlZmF1bHQgbgotCWhlbHAKLQkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBoYXJkd2FyZSBtb25pdG9yaW5nIHN1cHBvcnQgZm9yIFRJCi0JICBVQ0Q5MjIwLCBVQ0Q5MjIyLCBVQ0Q5MjI0LCBVQ0Q5MjQwLCBVQ0Q5MjQ0LCBVQ0Q5MjQ2LCBhbmQgVUNEOTI0OAotCSAgRGlnaXRhbCBQV00gU3lzdGVtIENvbnRyb2xsZXJzLgotCi0JICBUaGlzIGRyaXZlciBjYW4gYWxzbyBiZSBidWlsdCBhcyBhIG1vZHVsZS4gSWYgc28sIHRoZSBtb2R1bGUgd2lsbAotCSAgYmUgY2FsbGVkIHVjZDkyMDAuCi0KLWVuZGlmICMgUE1CVVMKK3NvdXJjZSBkcml2ZXJzL2h3bW9uL3BtYnVzL0tjb25maWcKIAogY29uZmlnIFNFTlNPUlNfU0hUMTUKIAl0cmlzdGF0ZSAiU2Vuc2lyb24gaHVtaWRpdHkgYW5kIHRlbXBlcmF0dXJlIHNlbnNvcnMuIFNIVDE1IGFuZCBjb21wYXQuIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9NYWtlZmlsZSBiL2RyaXZlcnMvaHdtb24vTWFrZWZpbGUKaW5kZXggZDc5OTVhMS4uM2M5Y2NlZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2h3bW9uL01ha2VmaWxlCkBAIC04MCw2ICs4MCw3IEBACiBvYmotJChDT05GSUdfU0VOU09SU19MTTkyKQkrPSBsbTkyLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0xNOTMpCSs9IGxtOTMubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfTE05NTI0MSkJKz0gbG05NTI0MS5vCitvYmotJChDT05GSUdfU0VOU09SU19MTTk1MjQ1KQkrPSBsbTk1MjQ1Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX0xUQzQxNTEpCSs9IGx0YzQxNTEubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfTFRDNDIxNSkJKz0gbHRjNDIxNS5vCiBvYmotJChDT05GSUdfU0VOU09SU19MVEM0MjQ1KQkrPSBsdGM0MjQ1Lm8KQEAgLTg3LDEwICs4OCwxMiBAQAogb2JqLSQoQ09ORklHX1NFTlNPUlNfTUFYMTExMSkJKz0gbWF4MTExMS5vCiBvYmotJChDT05GSUdfU0VOU09SU19NQVgxNjA2NSkJKz0gbWF4MTYwNjUubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfTUFYMTYxOSkJKz0gbWF4MTYxOS5vCitvYmotJChDT05GSUdfU0VOU09SU19NQVgxNjY4KQkrPSBtYXgxNjY4Lm8KIG9iai0kKENPTkZJR19TRU5TT1JTX01BWDY2MzkpCSs9IG1heDY2Mzkubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfTUFYNjY0MikJKz0gbWF4NjY0Mi5vCiBvYmotJChDT05GSUdfU0VOU09SU19NQVg2NjUwKQkrPSBtYXg2NjUwLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX01DMTM3ODNfQURDKSs9IG1jMTM3ODMtYWRjLm8KK29iai0kKENPTkZJR19TRU5TT1JTX05UQ19USEVSTUlTVE9SKQkrPSBudGNfdGhlcm1pc3Rvci5vCiBvYmotJChDT05GSUdfU0VOU09SU19QQzg3MzYwKQkrPSBwYzg3MzYwLm8KIG9iai0kKENPTkZJR19TRU5TT1JTX1BDODc0MjcpCSs9IHBjODc0Mjcubwogb2JqLSQoQ09ORklHX1NFTlNPUlNfUENGODU5MSkJKz0gcGNmODU5MS5vCkBAIC0xMjEsMTUgKzEyNCw3IEBACiBvYmotJChDT05GSUdfU0VOU09SU19XTTgzMVgpCSs9IHdtODMxeC1od21vbi5vCiBvYmotJChDT05GSUdfU0VOU09SU19XTTgzNTApCSs9IHdtODM1MC1od21vbi5vCiAKLSMgUE1CdXMgZHJpdmVycwotb2JqLSQoQ09ORklHX1BNQlVTKQkJKz0gcG1idXNfY29yZS5vCi1vYmotJChDT05GSUdfU0VOU09SU19QTUJVUykJKz0gcG1idXMubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfQURNMTI3NSkJKz0gYWRtMTI3NS5vCi1vYmotJChDT05GSUdfU0VOU09SU19NQVgxNjA2NCkJKz0gbWF4MTYwNjQubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfTUFYMzQ0NDApCSs9IG1heDM0NDQwLm8KLW9iai0kKENPTkZJR19TRU5TT1JTX01BWDg2ODgpCSs9IG1heDg2ODgubwotb2JqLSQoQ09ORklHX1NFTlNPUlNfVUNEOTAwMCkJKz0gdWNkOTAwMC5vCi1vYmotJChDT05GSUdfU0VOU09SU19VQ0Q5MjAwKQkrPSB1Y2Q5MjAwLm8KK29iai0kKENPTkZJR19QTUJVUykJCSs9IHBtYnVzLwogCiBjY2ZsYWdzLSQoQ09ORklHX0hXTU9OX0RFQlVHX0NISVApIDo9IC1EREVCVUcKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9jb3JldGVtcC5jIGIvZHJpdmVycy9od21vbi9jb3JldGVtcC5jCmluZGV4IDAwNzBkNTQuLjU5ZDgzZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vY29yZXRlbXAuYworKysgYi9kcml2ZXJzL2h3bW9uL2NvcmV0ZW1wLmMKQEAgLTQ0LDcgKzQ0LDkgQEAKICNkZWZpbmUgQkFTRV9TWVNGU19BVFRSX05PCTIJLyogU3lzZnMgQmFzZSBhdHRyIG5vIGZvciBjb3JldGVtcCAqLwogI2RlZmluZSBOVU1fUkVBTF9DT1JFUwkJMTYJLyogTnVtYmVyIG9mIFJlYWwgY29yZXMgcGVyIGNwdSAqLwogI2RlZmluZSBDT1JFVEVNUF9OQU1FX0xFTkdUSAkxNwkvKiBTdHJpbmcgTGVuZ3RoIG9mIGF0dHJzICovCi0jZGVmaW5lIE1BWF9BVFRSUwkJNQkvKiBNYXhpbXVtIG5vIG9mIHBlci1jb3JlIGF0dHJzICovCisjZGVmaW5lIE1BWF9DT1JFX0FUVFJTCQk0CS8qIE1heGltdW0gbm8gb2YgYmFzaWMgYXR0cnMgKi8KKyNkZWZpbmUgTUFYX1RIUkVTSF9BVFRSUwkzCS8qIE1heGltdW0gbm8gb2YgVGhyZXNob2xkIGF0dHJzICovCisjZGVmaW5lIFRPVEFMX0FUVFJTCQkoTUFYX0NPUkVfQVRUUlMgKyBNQVhfVEhSRVNIX0FUVFJTKQogI2RlZmluZSBNQVhfQ09SRV9EQVRBCQkoTlVNX1JFQUxfQ09SRVMgKyBCQVNFX1NZU0ZTX0FUVFJfTk8pCiAKICNpZmRlZiBDT05GSUdfU01QCkBAIC02Nyw2ICs2OSw5IEBACiAgKgkJVGhpcyB2YWx1ZSBpcyBwYXNzZWQgYXMgImlkIiBmaWVsZCB0byByZG1zci93cm1zciBmdW5jdGlvbnMuCiAgKiBAc3RhdHVzX3JlZzogT25lIG9mIElBMzJfVEhFUk1fU1RBVFVTIG9yIElBMzJfUEFDS0FHRV9USEVSTV9TVEFUVVMsCiAgKgkJZnJvbSB3aGVyZSB0aGUgdGVtcGVyYXR1cmUgdmFsdWVzIHNob3VsZCBiZSByZWFkLgorICogQGludHJwdF9yZWc6IE9uZSBvZiBJQTMyX1RIRVJNX0lOVEVSUlVQVCBvciBJQTMyX1BBQ0tBR0VfVEhFUk1fSU5URVJSVVBULAorICoJCWZyb20gd2hlcmUgdGhlIHRocmVzaG9sZHMgYXJlIHJlYWQuCisgKiBAYXR0cl9zaXplOiAgVG90YWwgbnVtYmVyIG9mIHByZS1jb3JlIGF0dHJzIGRpc3BsYXllZCBpbiB0aGUgc3lzZnMuCiAgKiBAaXNfcGtnX2RhdGE6IElmIHRoaXMgaXMgMSwgdGhlIHRlbXBfZGF0YSBob2xkcyBwa2d0ZW1wIGRhdGEuCiAgKgkJT3RoZXJ3aXNlLCB0ZW1wX2RhdGEgaG9sZHMgY29yZXRlbXAgZGF0YS4KICAqIEB2YWxpZDogSWYgdGhpcyBpcyAxLCB0aGUgY3VycmVudCB0ZW1wZXJhdHVyZSBpcyB2YWxpZC4KQEAgLTc0LDE1ICs3OSwxOCBAQAogc3RydWN0IHRlbXBfZGF0YSB7CiAJaW50IHRlbXA7CiAJaW50IHR0YXJnZXQ7CisJaW50IHRtaW47CiAJaW50IHRqbWF4OwogCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOwogCXVuc2lnbmVkIGludCBjcHU7CiAJdTMyIGNwdV9jb3JlX2lkOwogCXUzMiBzdGF0dXNfcmVnOworCXUzMiBpbnRycHRfcmVnOworCWludCBhdHRyX3NpemU7CiAJYm9vbCBpc19wa2dfZGF0YTsKIAlib29sIHZhbGlkOwotCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBzZF9hdHRyc1tNQVhfQVRUUlNdOwotCWNoYXIgYXR0cl9uYW1lW01BWF9BVFRSU11bQ09SRVRFTVBfTkFNRV9MRU5HVEhdOworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBzZF9hdHRyc1tUT1RBTF9BVFRSU107CisJY2hhciBhdHRyX25hbWVbVE9UQUxfQVRUUlNdW0NPUkVURU1QX05BTUVfTEVOR1RIXTsKIAlzdHJ1Y3QgbXV0ZXggdXBkYXRlX2xvY2s7CiB9OwogCkBAIC0xMzUsNiArMTQzLDE5IEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIChlYXggPj4gNSkgJiAxKTsKIH0KIAorc3RhdGljIHNzaXplX3Qgc2hvd19tYXhfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCit7CisJdTMyIGVheCwgZWR4OworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdGVtcF9kYXRhICp0ZGF0YSA9IHBkYXRhLT5jb3JlX2RhdGFbYXR0ci0+aW5kZXhdOworCisJcmRtc3Jfb25fY3B1KHRkYXRhLT5jcHUsIHRkYXRhLT5zdGF0dXNfcmVnLCAmZWF4LCAmZWR4KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCAhIShlYXggJiBUSEVSTV9TVEFUVVNfVEhSRVNIT0xEMSkpOworfQorCiBzdGF0aWMgc3NpemVfdCBzaG93X3RqbWF4KHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpCiB7CkBAIC0xNTMsNiArMTc0LDgzIEBACiAJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHBkYXRhLT5jb3JlX2RhdGFbYXR0ci0+aW5kZXhdLT50dGFyZ2V0KTsKIH0KIAorc3RhdGljIHNzaXplX3Qgc3RvcmVfdHRhcmdldChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IHBsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHNlbnNvcl9kZXZpY2VfYXR0cmlidXRlICphdHRyID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpOworCXN0cnVjdCB0ZW1wX2RhdGEgKnRkYXRhID0gcGRhdGEtPmNvcmVfZGF0YVthdHRyLT5pbmRleF07CisJdTMyIGVheCwgZWR4OworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCBkaWZmOworCisJaWYgKHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogVEhFUk1fTUFTS19USFJFU0hPTEQxIGlzIDcgYml0cyB3aWRlLiBWYWx1ZXMgYXJlIGVudGVyZWQgaW4gdGVybXMKKwkgKiBvZiBtaWxsaSBkZWdyZWUgY2Vsc2l1cy4gSGVuY2UgZG9uJ3QgYWNjZXB0IHZhbCA+ICgxMjcgKiAxMDAwKQorCSAqLworCWlmICh2YWwgPiB0ZGF0YS0+dGptYXggfHwgdmFsID4gMTI3MDAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRpZmYgPSAodGRhdGEtPnRqbWF4IC0gdmFsKSAvIDEwMDA7CisKKwltdXRleF9sb2NrKCZ0ZGF0YS0+dXBkYXRlX2xvY2spOworCXJkbXNyX29uX2NwdSh0ZGF0YS0+Y3B1LCB0ZGF0YS0+aW50cnB0X3JlZywgJmVheCwgJmVkeCk7CisJZWF4ID0gKGVheCAmIH5USEVSTV9NQVNLX1RIUkVTSE9MRDEpIHwKKwkJCQkoZGlmZiA8PCBUSEVSTV9TSElGVF9USFJFU0hPTEQxKTsKKwl3cm1zcl9vbl9jcHUodGRhdGEtPmNwdSwgdGRhdGEtPmludHJwdF9yZWcsIGVheCwgZWR4KTsKKwl0ZGF0YS0+dHRhcmdldCA9IHZhbDsKKwltdXRleF91bmxvY2soJnRkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdG1pbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBwZGF0YS0+Y29yZV9kYXRhW2F0dHItPmluZGV4XS0+dG1pbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3RtaW4oc3RydWN0IGRldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAorCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBwbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKTsKKwlzdHJ1Y3QgdGVtcF9kYXRhICp0ZGF0YSA9IHBkYXRhLT5jb3JlX2RhdGFbYXR0ci0+aW5kZXhdOworCXUzMiBlYXgsIGVkeDsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgZGlmZjsKKworCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKgorCSAqIFRIRVJNX01BU0tfVEhSRVNIT0xEMCBpcyA3IGJpdHMgd2lkZS4gVmFsdWVzIGFyZSBlbnRlcmVkIGluIHRlcm1zCisJICogb2YgbWlsbGkgZGVncmVlIGNlbHNpdXMuIEhlbmNlIGRvbid0IGFjY2VwdCB2YWwgPiAoMTI3ICogMTAwMCkKKwkgKi8KKwlpZiAodmFsID4gdGRhdGEtPnRqbWF4IHx8IHZhbCA+IDEyNzAwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkaWZmID0gKHRkYXRhLT50am1heCAtIHZhbCkgLyAxMDAwOworCisJbXV0ZXhfbG9jaygmdGRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlyZG1zcl9vbl9jcHUodGRhdGEtPmNwdSwgdGRhdGEtPmludHJwdF9yZWcsICZlYXgsICZlZHgpOworCWVheCA9IChlYXggJiB+VEhFUk1fTUFTS19USFJFU0hPTEQwKSB8CisJCQkJKGRpZmYgPDwgVEhFUk1fU0hJRlRfVEhSRVNIT0xEMCk7CisJd3Jtc3Jfb25fY3B1KHRkYXRhLT5jcHUsIHRkYXRhLT5pbnRycHRfcmVnLCBlYXgsIGVkeCk7CisJdGRhdGEtPnRtaW4gPSB2YWw7CisJbXV0ZXhfdW5sb2NrKCZ0ZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCiBzdGF0aWMgc3NpemVfdCBzaG93X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LAogCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKIHsKQEAgLTM0NCwyMyArNDQyLDMxIEBACiAJCQkJaW50IGF0dHJfbm8pCiB7CiAJaW50IGVyciwgaTsKLQlzdGF0aWMgc3NpemVfdCAoKnJkX3B0cltNQVhfQVRUUlNdKSAoc3RydWN0IGRldmljZSAqZGV2LAorCXN0YXRpYyBzc2l6ZV90ICgqcmRfcHRyW1RPVEFMX0FUVFJTXSkgKHN0cnVjdCBkZXZpY2UgKmRldiwKIAkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLCBjaGFyICpidWYpID0gewotCQkJc2hvd19sYWJlbCwgc2hvd19jcml0X2FsYXJtLCBzaG93X3R0YXJnZXQsCi0JCQlzaG93X3RlbXAsIHNob3dfdGptYXggfTsKLQlzdGF0aWMgY29uc3QgY2hhciAqbmFtZXNbTUFYX0FUVFJTXSA9IHsKKwkJCXNob3dfbGFiZWwsIHNob3dfY3JpdF9hbGFybSwgc2hvd190ZW1wLCBzaG93X3RqbWF4LAorCQkJc2hvd19tYXhfYWxhcm0sIHNob3dfdHRhcmdldCwgc2hvd190bWluIH07CisJc3RhdGljIHNzaXplX3QgKCpyd19wdHJbVE9UQUxfQVRUUlNdKSAoc3RydWN0IGRldmljZSAqZGV2LAorCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNvbnN0IGNoYXIgKmJ1ZiwKKwkJCXNpemVfdCBjb3VudCkgPSB7IE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCisJCQkJCXN0b3JlX3R0YXJnZXQsIHN0b3JlX3RtaW4gfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqbmFtZXNbVE9UQUxfQVRUUlNdID0gewogCQkJCQkidGVtcCVkX2xhYmVsIiwgInRlbXAlZF9jcml0X2FsYXJtIiwKLQkJCQkJInRlbXAlZF9tYXgiLCAidGVtcCVkX2lucHV0IiwKLQkJCQkJInRlbXAlZF9jcml0IiB9OworCQkJCQkidGVtcCVkX2lucHV0IiwgInRlbXAlZF9jcml0IiwKKwkJCQkJInRlbXAlZF9tYXhfYWxhcm0iLCAidGVtcCVkX21heCIsCisJCQkJCSJ0ZW1wJWRfbWF4X2h5c3QiIH07CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0FUVFJTOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgdGRhdGEtPmF0dHJfc2l6ZTsgaSsrKSB7CiAJCXNucHJpbnRmKHRkYXRhLT5hdHRyX25hbWVbaV0sIENPUkVURU1QX05BTUVfTEVOR1RILCBuYW1lc1tpXSwKIAkJCWF0dHJfbm8pOwogCQlzeXNmc19hdHRyX2luaXQoJnRkYXRhLT5zZF9hdHRyc1tpXS5kZXZfYXR0ci5hdHRyKTsKIAkJdGRhdGEtPnNkX2F0dHJzW2ldLmRldl9hdHRyLmF0dHIubmFtZSA9IHRkYXRhLT5hdHRyX25hbWVbaV07CiAJCXRkYXRhLT5zZF9hdHRyc1tpXS5kZXZfYXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPOworCQlpZiAocndfcHRyW2ldKSB7CisJCQl0ZGF0YS0+c2RfYXR0cnNbaV0uZGV2X2F0dHIuYXR0ci5tb2RlIHw9IFNfSVdVU1I7CisJCQl0ZGF0YS0+c2RfYXR0cnNbaV0uZGV2X2F0dHIuc3RvcmUgPSByd19wdHJbaV07CisJCX0KIAkJdGRhdGEtPnNkX2F0dHJzW2ldLmRldl9hdHRyLnNob3cgPSByZF9wdHJbaV07Ci0JCXRkYXRhLT5zZF9hdHRyc1tpXS5kZXZfYXR0ci5zdG9yZSA9IE5VTEw7CiAJCXRkYXRhLT5zZF9hdHRyc1tpXS5pbmRleCA9IGF0dHJfbm87CiAJCWVyciA9IGRldmljZV9jcmVhdGVfZmlsZShkZXYsICZ0ZGF0YS0+c2RfYXR0cnNbaV0uZGV2X2F0dHIpOwogCQlpZiAoZXJyKQpAQCAtMzc0LDM4ICs0ODAsNiBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIHVwZGF0ZV90dGFyZ2V0KF9fdTggY3B1X21vZGVsLCBzdHJ1Y3QgdGVtcF9kYXRhICp0ZGF0YSwKLQkJCQlzdHJ1Y3QgZGV2aWNlICpkZXYpCi17Ci0JaW50IGVycjsKLQl1MzIgZWF4LCBlZHg7Ci0KLQkvKgotCSAqIEluaXRpYWxpemUgdHRhcmdldCB2YWx1ZS4gRXZlbnR1YWxseSB0aGlzIHdpbGwgYmUKLQkgKiBpbml0aWFsaXplZCB3aXRoIHRoZSB2YWx1ZSBmcm9tIE1TUl9JQTMyX1RIRVJNX0lOVEVSUlVQVAotCSAqIHJlZ2lzdGVyLiBJZiBJQTMyX1RFTVBFUkFUVVJFX1RBUkdFVCBpcyBzdXBwb3J0ZWQsIHRoaXMKLQkgKiB2YWx1ZSB3aWxsIGJlIG92ZXIgd3JpdHRlbiBiZWxvdy4KLQkgKiBUbyBEbzogUGF0Y2ggdG8gaW5pdGlhbGl6ZSB0dGFyZ2V0IGZyb20gTVNSX0lBMzJfVEhFUk1fSU5URVJSVVBUCi0JICovCi0JdGRhdGEtPnR0YXJnZXQgPSB0ZGF0YS0+dGptYXggLSAyMDAwMDsKLQotCS8qCi0JICogUmVhZCB0aGUgc3RpbGwgdW5kb2N1bWVudGVkIElBMzJfVEVNUEVSQVRVUkVfVEFSR0VULiBJdCBleGlzdHMKLQkgKiBvbiBvbGRlciBDUFVzIGJ1dCBub3QgaW4gdGhpcyByZWdpc3RlciwKLQkgKiBBdG9tcyBkb24ndCBoYXZlIGl0IGVpdGhlci4KLQkgKi8KLQlpZiAoY3B1X21vZGVsID4gMHhlICYmIGNwdV9tb2RlbCAhPSAweDFjKSB7Ci0JCWVyciA9IHJkbXNyX3NhZmVfb25fY3B1KHRkYXRhLT5jcHUsCi0JCQkJTVNSX0lBMzJfVEVNUEVSQVRVUkVfVEFSR0VULCAmZWF4LCAmZWR4KTsKLQkJaWYgKGVycikgewotCQkJZGV2X3dhcm4oZGV2LAotCQkJIlVuYWJsZSB0byByZWFkIElBMzJfVEVNUEVSQVRVUkVfVEFSR0VUIE1TUlxuIik7Ci0JCX0gZWxzZSB7Ci0JCQl0ZGF0YS0+dHRhcmdldCA9IHRkYXRhLT50am1heCAtCi0JCQkJCSgoZWF4ID4+IDgpICYgMHhmZikgKiAxMDAwOwotCQl9Ci0JfQotfQogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBjaGtfdWNvZGVfdmVyc2lvbihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewpAQCAtNDY0LDkgKzUzOCwxMiBAQAogCiAJdGRhdGEtPnN0YXR1c19yZWcgPSBwa2dfZmxhZyA/IE1TUl9JQTMyX1BBQ0tBR0VfVEhFUk1fU1RBVFVTIDoKIAkJCQkJCQlNU1JfSUEzMl9USEVSTV9TVEFUVVM7CisJdGRhdGEtPmludHJwdF9yZWcgPSBwa2dfZmxhZyA/IE1TUl9JQTMyX1BBQ0tBR0VfVEhFUk1fSU5URVJSVVBUIDoKKwkJCQkJCU1TUl9JQTMyX1RIRVJNX0lOVEVSUlVQVDsKIAl0ZGF0YS0+aXNfcGtnX2RhdGEgPSBwa2dfZmxhZzsKIAl0ZGF0YS0+Y3B1ID0gY3B1OwogCXRkYXRhLT5jcHVfY29yZV9pZCA9IFRPX0NPUkVfSUQoY3B1KTsKKwl0ZGF0YS0+YXR0cl9zaXplID0gTUFYX0NPUkVfQVRUUlM7CiAJbXV0ZXhfaW5pdCgmdGRhdGEtPnVwZGF0ZV9sb2NrKTsKIAlyZXR1cm4gdGRhdGE7CiB9CkBAIC01MTYsNyArNTkzLDE3IEBACiAJZWxzZQogCQl0ZGF0YS0+dGptYXggPSBnZXRfdGptYXgoYywgY3B1LCAmcGRldi0+ZGV2KTsKIAotCXVwZGF0ZV90dGFyZ2V0KGMtPng4Nl9tb2RlbCwgdGRhdGEsICZwZGV2LT5kZXYpOworCS8qCisJICogVGVzdCBpZiB3ZSBjYW4gYWNjZXNzIHRoZSBpbnRycHQgcmVnaXN0ZXIuIElmIHNvLCBpbmNyZWFzZSB0aGUKKwkgKiAnc2l6ZScgZW5vdWdoIHRvIGhhdmUgdHRhcmdldC90bWluL21heF9hbGFybSBpbnRlcmZhY2VzLgorCSAqIEluaXRpYWxpemUgdHRhcmdldCB3aXRoIGJpdHMgMTY6MjIgb2YgTVNSX0lBMzJfVEhFUk1fSU5URVJSVVBUCisJICovCisJZXJyID0gcmRtc3Jfc2FmZV9vbl9jcHUoY3B1LCB0ZGF0YS0+aW50cnB0X3JlZywgJmVheCwgJmVkeCk7CisJaWYgKCFlcnIpIHsKKwkJdGRhdGEtPmF0dHJfc2l6ZSArPSBNQVhfVEhSRVNIX0FUVFJTOworCQl0ZGF0YS0+dHRhcmdldCA9IHRkYXRhLT50am1heCAtICgoZWF4ID4+IDE2KSAmIDB4N2YpICogMTAwMDsKKwl9CisKIAlwZGF0YS0+Y29yZV9kYXRhW2F0dHJfbm9dID0gdGRhdGE7CiAKIAkvKiBDcmVhdGUgc3lzZnMgaW50ZXJmYWNlcyAqLwpAQCAtNTUzLDcgKzY0MCw3IEBACiAJc3RydWN0IHRlbXBfZGF0YSAqdGRhdGEgPSBwZGF0YS0+Y29yZV9kYXRhW2luZHhdOwogCiAJLyogUmVtb3ZlIHRoZSBzeXNmcyBhdHRyaWJ1dGVzICovCi0JZm9yIChpID0gMDsgaSA8IE1BWF9BVFRSUzsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCB0ZGF0YS0+YXR0cl9zaXplOyBpKyspCiAJCWRldmljZV9yZW1vdmVfZmlsZShkZXYsICZ0ZGF0YS0+c2RfYXR0cnNbaV0uZGV2X2F0dHIpOwogCiAJa2ZyZWUocGRhdGEtPmNvcmVfZGF0YVtpbmR4XSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtOTAuYyBiL2RyaXZlcnMvaHdtb24vbG05MC5jCmluZGV4IDJmOTRmOTUuLjkwZGRiODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG05MC5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG05MC5jCkBAIC01NCw2ICs1NCw5IEBACiAgKiBhbmQgZXh0ZW5kZWQgbW9kZS4gVGhleSBhcmUgbW9zdGx5IGNvbXBhdGlibGUgd2l0aCBMTTkwIGV4Y2VwdCBmb3IgYSBkYXRhCiAgKiBmb3JtYXQgZGlmZmVyZW5jZSBmb3IgdGhlIHRlbXBlcmF0dXJlIHZhbHVlIHJlZ2lzdGVycy4KICAqCisgKiBUaGlzIGRyaXZlciBhbHNvIHN1cHBvcnRzIHRoZSBTQTU2MDA0IGZyb20gUGhpbGlwcy4gVGhpcyBkZXZpY2UgaXMKKyAqIHBpbi1jb21wYXRpYmxlIHdpdGggdGhlIExNODYsIHRoZSBFRC9FRFAgcGFydHMgYXJlIGFsc28gYWRkcmVzcy1jb21wYXRpYmxlLgorICoKICAqIFNpbmNlIHRoZSBMTTkwIHdhcyB0aGUgZmlyc3QgY2hpcHNldCBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIsIG1vc3QKICAqIGNvbW1lbnRzIHdpbGwgcmVmZXIgdG8gdGhpcyBjaGlwc2V0LCBidXQgYXJlIGFjdHVhbGx5IGdlbmVyYWwgYW5kCiAgKiBjb25jZXJuIGFsbCBzdXBwb3J0ZWQgY2hpcHNldHMsIHVubGVzcyBtZW50aW9uZWQgb3RoZXJ3aXNlLgpAQCAtOTYsMTMgKzk5LDE1IEBACiAgKiBNQVg2NjU5IGNhbiBoYXZlIGFkZHJlc3MgMHg0YywgMHg0ZCBvciAweDRlLgogICogTUFYNjY4MCBhbmQgTUFYNjY4MSBjYW4gaGF2ZSBhZGRyZXNzIDB4MTgsIDB4MTksIDB4MWEsIDB4MjksIDB4MmEsIDB4MmIsCiAgKiAweDRjLCAweDRkIG9yIDB4NGUuCisgKiBTQTU2MDA0IGNhbiBoYXZlIGFkZHJlc3MgMHg0OCB0aHJvdWdoIDB4NEYuCiAgKi8KIAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IG5vcm1hbF9pMmNbXSA9IHsKLQkweDE4LCAweDE5LCAweDFhLCAweDI5LCAweDJhLCAweDJiLCAweDRjLCAweDRkLCAweDRlLCBJMkNfQ0xJRU5UX0VORCB9OworCTB4MTgsIDB4MTksIDB4MWEsIDB4MjksIDB4MmEsIDB4MmIsIDB4NDgsIDB4NDksIDB4NGEsIDB4NGIsIDB4NGMsCisJMHg0ZCwgMHg0ZSwgMHg0ZiwgSTJDX0NMSUVOVF9FTkQgfTsKIAogZW51bSBjaGlwcyB7IGxtOTAsIGFkbTEwMzIsIGxtOTksIGxtODYsIG1heDY2NTcsIG1heDY2NTksIGFkdDc0NjEsIG1heDY2ODAsCi0JbWF4NjY0NiwgdzgzbDc3MSwgbWF4NjY5NiB9OworCW1heDY2NDYsIHc4M2w3NzEsIG1heDY2OTYsIHNhNTYwMDQgfTsKIAogLyoKICAqIFRoZSBMTTkwIHJlZ2lzdGVycwpAQCAtMTUyLDYgKzE1NywxMCBAQAogI2RlZmluZSBNQVg2NjU5X1JFR19SX0xPQ0FMX0VNRVJHCTB4MTcKICNkZWZpbmUgTUFYNjY1OV9SRUdfV19MT0NBTF9FTUVSRwkweDE3CiAKKy8qICBTQTU2MDA0IHJlZ2lzdGVycyAqLworCisjZGVmaW5lIFNBNTYwMDRfUkVHX1JfTE9DQUxfVEVNUEwgMHgyMgorCiAjZGVmaW5lIExNOTBfREVGX0NPTlZSQVRFX1JWQUwJNgkvKiBEZWYgY29udmVyc2lvbiByYXRlIHJlZ2lzdGVyIHZhbHVlICovCiAjZGVmaW5lIExNOTBfTUFYX0NPTlZSQVRFX01TCTE2MDAwCS8qIE1heGltdW0gY29udmVyc2lvbiByYXRlIGluIG1zICovCiAKQEAgLTE2MSw3ICsxNzAsNiBAQAogI2RlZmluZSBMTTkwX0ZMQUdfQURUNzQ2MV9FWFQJKDEgPDwgMCkgLyogQURUNzQ2MSBleHRlbmRlZCBtb2RlCSovCiAvKiBEZXZpY2UgZmVhdHVyZXMgKi8KICNkZWZpbmUgTE05MF9IQVZFX09GRlNFVAkoMSA8PCAxKSAvKiB0ZW1wZXJhdHVyZSBvZmZzZXQgcmVnaXN0ZXIJKi8KLSNkZWZpbmUgTE05MF9IQVZFX0xPQ0FMX0VYVAkoMSA8PCAyKSAvKiBleHRlbmRlZCBsb2NhbCB0ZW1wZXJhdHVyZQkqLwogI2RlZmluZSBMTTkwX0hBVkVfUkVNX0xJTUlUX0VYVAkoMSA8PCAzKSAvKiBleHRlbmRlZCByZW1vdGUgbGltaXQJKi8KICNkZWZpbmUgTE05MF9IQVZFX0VNRVJHRU5DWQkoMSA8PCA0KSAvKiAzcmQgdXBwZXIgKGVtZXJnZW5jeSkgbGltaXQJKi8KICNkZWZpbmUgTE05MF9IQVZFX0VNRVJHRU5DWV9BTEFSTSAoMSA8PCA1KS8qIGVtZXJnZW5jeSBhbGFybQkJKi8KQEAgLTE5Miw2ICsyMDAsNyBAQAogCXsgIm1heDY2OTYiLCBtYXg2Njk2IH0sCiAJeyAibmN0MTAwOCIsIGFkdDc0NjEgfSwKIAl7ICJ3ODNsNzcxIiwgdzgzbDc3MSB9LAorCXsgInNhNTYwMDQiLCBzYTU2MDA0IH0sCiAJeyB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGxtOTBfaWQpOwpAQCAtMjA0LDYgKzIxMyw3IEBACiAJdTE2IGFsZXJ0X2FsYXJtczsJLyogV2hpY2ggYWxhcm0gYml0cyB0cmlnZ2VyIEFMRVJUIyAqLwogCQkJCS8qIFVwcGVyIDggYml0cyBmb3IgbWF4NjY5NS85NiAqLwogCXU4IG1heF9jb252cmF0ZTsJLyogTWF4aW11bSBjb252ZXJzaW9uIHJhdGUgcmVnaXN0ZXIgdmFsdWUgKi8KKwl1OCByZWdfbG9jYWxfZXh0OwkvKiBFeHRlbmRlZCBsb2NhbCB0ZW1wIHJlZ2lzdGVyIChvcHRpb25hbCkgKi8KIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbG05MF9wYXJhbXMgbG05MF9wYXJhbXNbXSA9IHsKQEAgLTIzNSwxOSArMjQ1LDIwIEBACiAJCS5tYXhfY29udnJhdGUgPSA5LAogCX0sCiAJW21heDY2NDZdID0gewotCQkuZmxhZ3MgPSBMTTkwX0hBVkVfTE9DQUxfRVhULAogCQkuYWxlcnRfYWxhcm1zID0gMHg3YywKIAkJLm1heF9jb252cmF0ZSA9IDYsCisJCS5yZWdfbG9jYWxfZXh0ID0gTUFYNjY1N19SRUdfUl9MT0NBTF9URU1QTCwKIAl9LAogCVttYXg2NjU3XSA9IHsKLQkJLmZsYWdzID0gTE05MF9IQVZFX0xPQ0FMX0VYVCwKIAkJLmFsZXJ0X2FsYXJtcyA9IDB4N2MsCiAJCS5tYXhfY29udnJhdGUgPSA4LAorCQkucmVnX2xvY2FsX2V4dCA9IE1BWDY2NTdfUkVHX1JfTE9DQUxfVEVNUEwsCiAJfSwKIAlbbWF4NjY1OV0gPSB7Ci0JCS5mbGFncyA9IExNOTBfSEFWRV9MT0NBTF9FWFQgfCBMTTkwX0hBVkVfRU1FUkdFTkNZLAorCQkuZmxhZ3MgPSBMTTkwX0hBVkVfRU1FUkdFTkNZLAogCQkuYWxlcnRfYWxhcm1zID0gMHg3YywKIAkJLm1heF9jb252cmF0ZSA9IDgsCisJCS5yZWdfbG9jYWxfZXh0ID0gTUFYNjY1N19SRUdfUl9MT0NBTF9URU1QTCwKIAl9LAogCVttYXg2NjgwXSA9IHsKIAkJLmZsYWdzID0gTE05MF9IQVZFX09GRlNFVCwKQEAgLTI1NSwxNiArMjY2LDIzIEBACiAJCS5tYXhfY29udnJhdGUgPSA3LAogCX0sCiAJW21heDY2OTZdID0gewotCQkuZmxhZ3MgPSBMTTkwX0hBVkVfTE9DQUxfRVhUIHwgTE05MF9IQVZFX0VNRVJHRU5DWQorCQkuZmxhZ3MgPSBMTTkwX0hBVkVfRU1FUkdFTkNZCiAJCSAgfCBMTTkwX0hBVkVfRU1FUkdFTkNZX0FMQVJNIHwgTE05MF9IQVZFX1RFTVAzLAogCQkuYWxlcnRfYWxhcm1zID0gMHgxODdjLAogCQkubWF4X2NvbnZyYXRlID0gNiwKKwkJLnJlZ19sb2NhbF9leHQgPSBNQVg2NjU3X1JFR19SX0xPQ0FMX1RFTVBMLAogCX0sCiAJW3c4M2w3NzFdID0gewogCQkuZmxhZ3MgPSBMTTkwX0hBVkVfT0ZGU0VUIHwgTE05MF9IQVZFX1JFTV9MSU1JVF9FWFQsCiAJCS5hbGVydF9hbGFybXMgPSAweDdjLAogCQkubWF4X2NvbnZyYXRlID0gOCwKIAl9LAorCVtzYTU2MDA0XSA9IHsKKwkJLmZsYWdzID0gTE05MF9IQVZFX09GRlNFVCB8IExNOTBfSEFWRV9SRU1fTElNSVRfRVhULAorCQkuYWxlcnRfYWxhcm1zID0gMHg3YiwKKwkJLm1heF9jb252cmF0ZSA9IDksCisJCS5yZWdfbG9jYWxfZXh0ID0gU0E1NjAwNF9SRUdfUl9MT0NBTF9URU1QTCwKKwl9LAogfTsKIAogLyoKQEAgLTI4Niw2ICszMDQsNyBAQAogCXUxNiBhbGVydF9hbGFybXM7CS8qIFdoaWNoIGFsYXJtIGJpdHMgdHJpZ2dlciBBTEVSVCMgKi8KIAkJCQkvKiBVcHBlciA4IGJpdHMgZm9yIG1heDY2OTUvOTYgKi8KIAl1OCBtYXhfY29udnJhdGU7CS8qIE1heGltdW0gY29udmVyc2lvbiByYXRlICovCisJdTggcmVnX2xvY2FsX2V4dDsJLyogbG9jYWwgZXh0ZW5zaW9uIHJlZ2lzdGVyIG9mZnNldCAqLwogCiAJLyogcmVnaXN0ZXJzIHZhbHVlcyAqLwogCXM4IHRlbXA4WzhdOwkvKiAwOiBsb2NhbCBsb3cgbGltaXQKQEAgLTQ1Miw5ICs0NzEsOSBAQAogCQlsbTkwX3JlYWRfcmVnKGNsaWVudCwgTE05MF9SRUdfUl9SRU1PVEVfQ1JJVCwgJmRhdGEtPnRlbXA4WzNdKTsKIAkJbG05MF9yZWFkX3JlZyhjbGllbnQsIExNOTBfUkVHX1JfVENSSVRfSFlTVCwgJmRhdGEtPnRlbXBfaHlzdCk7CiAKLQkJaWYgKGRhdGEtPmZsYWdzICYgTE05MF9IQVZFX0xPQ0FMX0VYVCkgeworCQlpZiAoZGF0YS0+cmVnX2xvY2FsX2V4dCkgewogCQkJbG05MF9yZWFkMTYoY2xpZW50LCBMTTkwX1JFR19SX0xPQ0FMX1RFTVAsCi0JCQkJICAgIE1BWDY2NTdfUkVHX1JfTE9DQUxfVEVNUEwsCisJCQkJICAgIGRhdGEtPnJlZ19sb2NhbF9leHQsCiAJCQkJICAgICZkYXRhLT50ZW1wMTFbNF0pOwogCQl9IGVsc2UgewogCQkJaWYgKGxtOTBfcmVhZF9yZWcoY2xpZW50LCBMTTkwX1JFR19SX0xPQ0FMX1RFTVAsCkBAIC0xMDkyLDcgKzExMTEsNyBAQAogCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IG5ld19jbGllbnQtPmFkYXB0ZXI7CiAJaW50IGFkZHJlc3MgPSBuZXdfY2xpZW50LT5hZGRyOwogCWNvbnN0IGNoYXIgKm5hbWUgPSBOVUxMOwotCWludCBtYW5faWQsIGNoaXBfaWQsIHJlZ19jb25maWcxLCByZWdfY29udnJhdGU7CisJaW50IG1hbl9pZCwgY2hpcF9pZCwgcmVnX2NvbmZpZzEsIHJlZ19jb25maWcyLCByZWdfY29udnJhdGU7CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCiAJCXJldHVybiAtRU5PREVWOwpAQCAtMTEwOCwxNSArMTEyNywxNiBAQAogCQkJCQkJTE05MF9SRUdfUl9DT05WUkFURSkpIDwgMCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAoKGFkZHJlc3MgPT0gMHg0QyB8fCBhZGRyZXNzID09IDB4NEQpCi0JICYmIG1hbl9pZCA9PSAweDAxKSB7IC8qIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgKi8KLQkJaW50IHJlZ19jb25maWcyOwotCisJaWYgKG1hbl9pZCA9PSAweDAxIHx8IG1hbl9pZCA9PSAweDVDIHx8IG1hbl9pZCA9PSAweDQxKSB7CiAJCXJlZ19jb25maWcyID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCiAJCQkJCQlMTTkwX1JFR19SX0NPTkZJRzIpOwogCQlpZiAocmVnX2NvbmZpZzIgPCAwKQogCQkJcmV0dXJuIC1FTk9ERVY7CisJfSBlbHNlCisJCXJlZ19jb25maWcyID0gMDsJLyogTWFrZSBjb21waWxlciBoYXBweSAqLwogCisJaWYgKChhZGRyZXNzID09IDB4NEMgfHwgYWRkcmVzcyA9PSAweDREKQorCSAmJiBtYW5faWQgPT0gMHgwMSkgeyAvKiBOYXRpb25hbCBTZW1pY29uZHVjdG9yICovCiAJCWlmICgocmVnX2NvbmZpZzEgJiAweDJBKSA9PSAweDAwCiAJCSAmJiAocmVnX2NvbmZpZzIgJiAweEY4KSA9PSAweDAwCiAJCSAmJiByZWdfY29udnJhdGUgPD0gMHgwOSkgewpAQCAtMTI0NSwxMyArMTI2NSw2IEBACiAJfSBlbHNlCiAJaWYgKGFkZHJlc3MgPT0gMHg0QwogCSAmJiBtYW5faWQgPT0gMHg1QykgeyAvKiBXaW5ib25kL051dm90b24gKi8KLQkJaW50IHJlZ19jb25maWcyOwotCi0JCXJlZ19jb25maWcyID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsCi0JCQkJCQlMTTkwX1JFR19SX0NPTkZJRzIpOwotCQlpZiAocmVnX2NvbmZpZzIgPCAwKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0KIAkJaWYgKChyZWdfY29uZmlnMSAmIDB4MkEpID09IDB4MDAKIAkJICYmIChyZWdfY29uZmlnMiAmIDB4RjgpID09IDB4MDApIHsKIAkJCWlmIChjaGlwX2lkID09IDB4MDEgLyogVzgzTDc3MVcvRyAqLwpAQCAtMTI2Myw2ICsxMjc2LDE1IEBACiAJCQkJbmFtZSA9ICJ3ODNsNzcxIjsKIAkJCX0KIAkJfQorCX0gZWxzZQorCWlmIChhZGRyZXNzID49IDB4NDggJiYgYWRkcmVzcyA8PSAweDRGCisJICYmIG1hbl9pZCA9PSAweEExKSB7IC8qICBOWFAgU2VtaWNvbmR1Y3Rvci9QaGlsaXBzICovCisJCWlmIChjaGlwX2lkID09IDB4MDAKKwkJICYmIChyZWdfY29uZmlnMSAmIDB4MkEpID09IDB4MDAKKwkJICYmIChyZWdfY29uZmlnMiAmIDB4RkUpID09IDB4MDAKKwkJICYmIHJlZ19jb252cmF0ZSA8PSAweDA5KSB7CisJCQluYW1lID0gInNhNTYwMDQiOworCQl9CiAJfQogCiAJaWYgKCFuYW1lKSB7IC8qIGlkZW50aWZpY2F0aW9uIGZhaWxlZCAqLwpAQCAtMTM2OCw2ICsxMzkwLDcgQEAKIAogCS8qIFNldCBjaGlwIGNhcGFiaWxpdGllcyAqLwogCWRhdGEtPmZsYWdzID0gbG05MF9wYXJhbXNbZGF0YS0+a2luZF0uZmxhZ3M7CisJZGF0YS0+cmVnX2xvY2FsX2V4dCA9IGxtOTBfcGFyYW1zW2RhdGEtPmtpbmRdLnJlZ19sb2NhbF9leHQ7CiAKIAkvKiBTZXQgbWF4aW11bSBjb252ZXJzaW9uIHJhdGUgKi8KIAlkYXRhLT5tYXhfY29udnJhdGUgPSBsbTkwX3BhcmFtc1tkYXRhLT5raW5kXS5tYXhfY29udnJhdGU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtOTUyNDEuYyBiL2RyaXZlcnMvaHdtb24vbG05NTI0MS5jCmluZGV4IGQzYjQ2NGIuLjUxMzkwMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbG05NTI0MS5jCisrKyBiL2RyaXZlcnMvaHdtb24vbG05NTI0MS5jCkBAIC03NCw4ICs3NCw5IEBACiAjZGVmaW5lIFRUX09GRiAwCiAjZGVmaW5lIFRUX09OIDEKICNkZWZpbmUgVFRfTUFTSyA3Ci0jZGVmaW5lIE1BTlVGQUNUVVJFUl9JRCAweDAxCi0jZGVmaW5lIERFRkFVTFRfUkVWSVNJT04gMHhBNAorI2RlZmluZSBOQVRTRU1JX01BTl9JRAkweDAxCisjZGVmaW5lIExNOTUyMzFfQ0hJUF9JRAkweEExCisjZGVmaW5lIExNOTUyNDFfQ0hJUF9JRAkweEE0CiAKIHN0YXRpYyBjb25zdCB1OCBsbTk1MjQxX3JlZ19hZGRyZXNzW10gPSB7CiAJTE05NTI0MV9SRUdfUl9MT0NBTF9URU1QSCwKQEAgLTMzOCwyMCArMzM5LDI1IEBACiAJCQkgIHN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXdfY2xpZW50LT5hZGFwdGVyOwotCWludCBhZGRyZXNzID0gbmV3X2NsaWVudC0+YWRkcjsKIAljb25zdCBjaGFyICpuYW1lOworCWludCBtZmdfaWQsIGNoaXBfaWQ7CiAKIAlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgTE05NTI0MV9SRUdfUl9NQU5fSUQpCi0JICAgICA9PSBNQU5VRkFDVFVSRVJfSUQpCi0JICAgICYmIChpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgTE05NTI0MV9SRUdfUl9DSElQX0lEKQotCQk9PSBERUZBVUxUX1JFVklTSU9OKSkgewotCQluYW1lID0gREVWTkFNRTsKLQl9IGVsc2UgewotCQlkZXZfZGJnKCZhZGFwdGVyLT5kZXYsICJMTTk1MjQxIGRldGVjdGlvbiBmYWlsZWQgYXQgMHglMDJ4XG4iLAotCQkJYWRkcmVzcyk7CisJbWZnX2lkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKG5ld19jbGllbnQsIExNOTUyNDFfUkVHX1JfTUFOX0lEKTsKKwlpZiAobWZnX2lkICE9IE5BVFNFTUlfTUFOX0lEKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWNoaXBfaWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgTE05NTI0MV9SRUdfUl9DSElQX0lEKTsKKwlzd2l0Y2ggKGNoaXBfaWQpIHsKKwljYXNlIExNOTUyMzFfQ0hJUF9JRDoKKwkJbmFtZSA9ICJsbTk1MjMxIjsKKwkJYnJlYWs7CisJY2FzZSBMTTk1MjQxX0NISVBfSUQ6CisJCW5hbWUgPSAibG05NTI0MSI7CisJCWJyZWFrOworCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtNDMxLDcgKzQzNyw4IEBACiAKIC8qIERyaXZlciBkYXRhIChjb21tb24gdG8gYWxsIGNsaWVudHMpICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbG05NTI0MV9pZFtdID0gewotCXsgREVWTkFNRSwgMCB9LAorCXsgImxtOTUyMzEiLCAwIH0sCisJeyAibG05NTI0MSIsIDAgfSwKIAl7IH0KIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbG05NTI0MV9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2xtOTUyNDUuYyBiL2RyaXZlcnMvaHdtb24vbG05NTI0NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZTllNjgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2h3bW9uL2xtOTUyNDUuYwpAQCAtMCwwICsxLDU0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBBbGV4YW5kZXIgU3RlaW4gPGFsZXhhbmRlci5zdGVpbkBzeXN0ZWMtZWxlY3Ryb25pYy5jb20+CisgKgorICogVGhlIExNOTUyNDUgaXMgYSBzZW5zb3IgY2hpcCBtYWRlIGJ5IE5hdGlvbmFsIFNlbWljb25kdWN0b3JzLgorICogSXQgcmVwb3J0cyB1cCB0byB0d28gdGVtcGVyYXR1cmVzIChpdHMgb3duIHBsdXMgYW4gZXh0ZXJuYWwgb25lKS4KKyAqIENvbXBsZXRlIGRhdGFzaGVldCBjYW4gYmUgb2J0YWluZWQgZnJvbSBOYXRpb25hbCdzIHdlYnNpdGUgYXQ6CisgKiAgIGh0dHA6Ly93d3cubmF0aW9uYWwuY29tL2RzLmNnaS9MTS9MTTk1MjQ1LnBkZgorICoKKyAqIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIGxtOTUyNDEuYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorCisjZGVmaW5lIERFVk5BTUUgImxtOTUyNDUiCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBub3JtYWxfaTJjW10gPSB7CisJMHgxOCwgMHgxOSwgMHgyOSwgMHg0YywgMHg0ZCwgSTJDX0NMSUVOVF9FTkQgfTsKKworLyogTE05NTI0NSByZWdpc3RlcnMgKi8KKy8qIGdlbmVyYWwgcmVnaXN0ZXJzICovCisjZGVmaW5lIExNOTUyNDVfUkVHX1JXX0NPTkZJRzEJCTB4MDMKKyNkZWZpbmUgTE05NTI0NV9SRUdfUldfQ09OVkVSU19SQVRFCTB4MDQKKyNkZWZpbmUgTE05NTI0NV9SRUdfV19PTkVfU0hPVAkJMHgwRgorCisvKiBkaW9kZSBjb25maWd1cmF0aW9uICovCisjZGVmaW5lIExNOTUyNDVfUkVHX1JXX0NPTkZJRzIJCTB4QkYKKyNkZWZpbmUgTE05NTI0NV9SRUdfUldfUkVNT1RFX09GRkgJMHgxMQorI2RlZmluZSBMTTk1MjQ1X1JFR19SV19SRU1PVEVfT0ZGTAkweDEyCisKKy8qIHN0YXR1cyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTE05NTI0NV9SRUdfUl9TVEFUVVMxCQkweDAyCisjZGVmaW5lIExNOTUyNDVfUkVHX1JfU1RBVFVTMgkJMHgzMworCisvKiBsaW1pdCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTE05NTI0NV9SRUdfUldfUkVNT1RFX09TX0xJTUlUCQkweDA3CisjZGVmaW5lIExNOTUyNDVfUkVHX1JXX0xPQ0FMX09TX1RDUklUX0xJTUlUCTB4MjAKKyNkZWZpbmUgTE05NTI0NV9SRUdfUldfUkVNT1RFX1RDUklUX0xJTUlUCTB4MTkKKyNkZWZpbmUgTE05NTI0NV9SRUdfUldfQ09NTU9OX0hZU1RFUkVTSVMJMHgyMQorCisvKiB0ZW1wZXJhdHVyZSBzaWduZWQgKi8KKyNkZWZpbmUgTE05NTI0NV9SRUdfUl9MT0NBTF9URU1QSF9TCTB4MDAKKyNkZWZpbmUgTE05NTI0NV9SRUdfUl9MT0NBTF9URU1QTF9TCTB4MzAKKyNkZWZpbmUgTE05NTI0NV9SRUdfUl9SRU1PVEVfVEVNUEhfUwkweDAxCisjZGVmaW5lIExNOTUyNDVfUkVHX1JfUkVNT1RFX1RFTVBMX1MJMHgxMAorLyogdGVtcGVyYXR1cmUgdW5zaWduZWQgKi8KKyNkZWZpbmUgTE05NTI0NV9SRUdfUl9SRU1PVEVfVEVNUEhfVQkweDMxCisjZGVmaW5lIExNOTUyNDVfUkVHX1JfUkVNT1RFX1RFTVBMX1UJMHgzMgorCisvKiBpZCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgTE05NTI0NV9SRUdfUl9NQU5fSUQJCTB4RkUKKyNkZWZpbmUgTE05NTI0NV9SRUdfUl9DSElQX0lECQkweEZGCisKKy8qIExNOTUyNDUgc3BlY2lmaWMgYml0ZmllbGRzICovCisjZGVmaW5lIENGR19TVE9QCQkweDQwCisjZGVmaW5lIENGR19SRU1PVEVfVENSSVRfTUFTSwkweDEwCisjZGVmaW5lIENGR19SRU1PVEVfT1NfTUFTSwkweDA4CisjZGVmaW5lIENGR19MT0NBTF9UQ1JJVF9NQVNLCTB4MDQKKyNkZWZpbmUgQ0ZHX0xPQ0FMX09TX01BU0sJMHgwMgorCisjZGVmaW5lIENGRzJfT1NfQTAJCTB4NDAKKyNkZWZpbmUgQ0ZHMl9ESU9ERV9GQVVMVF9PUwkweDIwCisjZGVmaW5lIENGRzJfRElPREVfRkFVTFRfVENSSVQJMHgxMAorI2RlZmluZSBDRkcyX1JFTU9URV9UVAkJMHgwOAorI2RlZmluZSBDRkcyX1JFTU9URV9GSUxURVJfRElTCTB4MDAKKyNkZWZpbmUgQ0ZHMl9SRU1PVEVfRklMVEVSX0VOCTB4MDYKKworLyogY29udmVyc2F0aW9uIHJhdGUgaW4gbXMgKi8KKyNkZWZpbmUgUkFURV9DUjAwNjMJMHgwMAorI2RlZmluZSBSQVRFX0NSMDM2NAkweDAxCisjZGVmaW5lIFJBVEVfQ1IxMDAwCTB4MDIKKyNkZWZpbmUgUkFURV9DUjI1MDAJMHgwMworCisjZGVmaW5lIFNUQVRVUzFfRElPREVfRkFVTFQJMHgwNAorI2RlZmluZSBTVEFUVVMxX1JUQ1JJVAkJMHgwMgorI2RlZmluZSBTVEFUVVMxX0xPQwkJMHgwMQorCisjZGVmaW5lIE1BTlVGQUNUVVJFUl9JRAkJMHgwMQorI2RlZmluZSBERUZBVUxUX1JFVklTSU9OCTB4QjMKKworc3RhdGljIGNvbnN0IHU4IGxtOTUyNDVfcmVnX2FkZHJlc3NbXSA9IHsKKwlMTTk1MjQ1X1JFR19SX0xPQ0FMX1RFTVBIX1MsCisJTE05NTI0NV9SRUdfUl9MT0NBTF9URU1QTF9TLAorCUxNOTUyNDVfUkVHX1JfUkVNT1RFX1RFTVBIX1MsCisJTE05NTI0NV9SRUdfUl9SRU1PVEVfVEVNUExfUywKKwlMTTk1MjQ1X1JFR19SX1JFTU9URV9URU1QSF9VLAorCUxNOTUyNDVfUkVHX1JfUkVNT1RFX1RFTVBMX1UsCisJTE05NTI0NV9SRUdfUldfTE9DQUxfT1NfVENSSVRfTElNSVQsCisJTE05NTI0NV9SRUdfUldfUkVNT1RFX1RDUklUX0xJTUlULAorCUxNOTUyNDVfUkVHX1JXX0NPTU1PTl9IWVNURVJFU0lTLAorCUxNOTUyNDVfUkVHX1JfU1RBVFVTMSwKK307CisKKy8qIENsaWVudCBkYXRhIChlYWNoIGNsaWVudCBnZXRzIGl0cyBvd24pICovCitzdHJ1Y3QgbG05NTI0NV9kYXRhIHsKKwlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CisJc3RydWN0IG11dGV4IHVwZGF0ZV9sb2NrOworCXVuc2lnbmVkIGxvbmcgbGFzdF91cGRhdGVkOwkvKiBpbiBqaWZmaWVzICovCisJdW5zaWduZWQgbG9uZyBpbnRlcnZhbDsJLyogaW4gbXNlY3MgKi8KKwlib29sIHZhbGlkOwkJLyogemVybyB1bnRpbCBmb2xsb3dpbmcgZmllbGRzIGFyZSB2YWxpZCAqLworCS8qIHJlZ2lzdGVycyB2YWx1ZXMgKi8KKwl1OCByZWdzW0FSUkFZX1NJWkUobG05NTI0NV9yZWdfYWRkcmVzcyldOworCXU4IGNvbmZpZzEsIGNvbmZpZzI7Cit9OworCisvKiBDb252ZXJzaW9ucyAqLworc3RhdGljIGludCB0ZW1wX2Zyb21fcmVnX3Vuc2lnbmVkKHU4IHZhbF9oLCB1OCB2YWxfbCkKK3sKKwlyZXR1cm4gdmFsX2ggKiAxMDAwICsgdmFsX2wgKiAxMDAwIC8gMjU2OworfQorCitzdGF0aWMgaW50IHRlbXBfZnJvbV9yZWdfc2lnbmVkKHU4IHZhbF9oLCB1OCB2YWxfbCkKK3sKKwlpZiAodmFsX2ggJiAweDgwKQorCQlyZXR1cm4gKHZhbF9oIC0gMHgxMDApICogMTAwMDsKKwlyZXR1cm4gdGVtcF9mcm9tX3JlZ191bnNpZ25lZCh2YWxfaCwgdmFsX2wpOworfQorCitzdGF0aWMgc3RydWN0IGxtOTUyNDVfZGF0YSAqbG05NTI0NV91cGRhdGVfZGV2aWNlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIGRhdGEtPmxhc3RfdXBkYXRlZAorCQkrIG1zZWNzX3RvX2ppZmZpZXMoZGF0YS0+aW50ZXJ2YWwpKSB8fCAhZGF0YS0+dmFsaWQpIHsKKwkJaW50IGk7CisKKwkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJVcGRhdGluZyBsbTk1MjQ1IGRhdGEuXG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobG05NTI0NV9yZWdfYWRkcmVzcyk7IGkrKykKKwkJCWRhdGEtPnJlZ3NbaV0KKwkJCSAgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQkJCQkJICAgICBsbTk1MjQ1X3JlZ19hZGRyZXNzW2ldKTsKKwkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwkJZGF0YS0+dmFsaWQgPSAxOworCX0KKworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGRhdGE7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxtOTUyNDVfcmVhZF9jb252ZXJzaW9uX3JhdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgcmF0ZTsKKwl1bnNpZ25lZCBsb25nIGludGVydmFsOworCisJcmF0ZSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDVfUkVHX1JXX0NPTlZFUlNfUkFURSk7CisKKwlzd2l0Y2ggKHJhdGUpIHsKKwljYXNlIFJBVEVfQ1IwMDYzOgorCQlpbnRlcnZhbCA9IDYzOworCQlicmVhazsKKwljYXNlIFJBVEVfQ1IwMzY0OgorCQlpbnRlcnZhbCA9IDM2NDsKKwkJYnJlYWs7CisJY2FzZSBSQVRFX0NSMTAwMDoKKwkJaW50ZXJ2YWwgPSAxMDAwOworCQlicmVhazsKKwljYXNlIFJBVEVfQ1IyNTAwOgorCWRlZmF1bHQ6CisJCWludGVydmFsID0gMjUwMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGludGVydmFsOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsbTk1MjQ1X3NldF9jb252ZXJzaW9uX3JhdGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCXVuc2lnbmVkIGxvbmcgaW50ZXJ2YWwpCit7CisJaW50IHJhdGU7CisKKwlpZiAoaW50ZXJ2YWwgPD0gNjMpIHsKKwkJaW50ZXJ2YWwgPSA2MzsKKwkJcmF0ZSA9IFJBVEVfQ1IwMDYzOworCX0gZWxzZSBpZiAoaW50ZXJ2YWwgPD0gMzY0KSB7CisJCWludGVydmFsID0gMzY0OworCQlyYXRlID0gUkFURV9DUjAzNjQ7CisJfSBlbHNlIGlmIChpbnRlcnZhbCA8PSAxMDAwKSB7CisJCWludGVydmFsID0gMTAwMDsKKwkJcmF0ZSA9IFJBVEVfQ1IxMDAwOworCX0gZWxzZSB7CisJCWludGVydmFsID0gMjUwMDsKKwkJcmF0ZSA9IFJBVEVfQ1IyNTAwOworCX0KKworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQ1X1JFR19SV19DT05WRVJTX1JBVEUsIHJhdGUpOworCisJcmV0dXJuIGludGVydmFsOworfQorCisvKiBTeXNmcyBzdHVmZiAqLworc3RhdGljIHNzaXplX3Qgc2hvd19pbnB1dChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJICBjaGFyICpidWYpCit7CisJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGxtOTUyNDVfdXBkYXRlX2RldmljZShkZXYpOworCWludCB0ZW1wOworCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisKKwkvKgorCSAqIEluZGV4IDAgKExvY2FsIHRlbXApIGlzIGFsd2F5cyBzaWduZWQKKwkgKiBJbmRleCAyIChSZW1vdGUgdGVtcCkgaGFzIGJvdGggc2lnbmVkIGFuZCB1bnNpZ25lZCBkYXRhCisJICogdXNlIHNpZ25lZCBjYWxjdWxhdGlvbiBmb3IgcmVtb3RlIGlmIHNpZ25lZCBiaXQgaXMgc2V0CisJICovCisJaWYgKGluZGV4ID09IDAgfHwgZGF0YS0+cmVnc1tpbmRleF0gJiAweDgwKQorCQl0ZW1wID0gdGVtcF9mcm9tX3JlZ19zaWduZWQoZGF0YS0+cmVnc1tpbmRleF0sCisJCQkgICAgZGF0YS0+cmVnc1tpbmRleCArIDFdKTsKKwllbHNlCisJCXRlbXAgPSB0ZW1wX2Zyb21fcmVnX3Vuc2lnbmVkKGRhdGEtPnJlZ3NbaW5kZXggKyAyXSwKKwkJCSAgICBkYXRhLT5yZWdzW2luZGV4ICsgM10pOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwgIiVkXG4iLCB0ZW1wKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2hvd19saW1pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gbG05NTI0NV91cGRhdGVfZGV2aWNlKGRldik7CisJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsICIlZFxuIiwKKwkJCWRhdGEtPnJlZ3NbaW5kZXhdICogMTAwMCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF9saW1pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGF0dHIpLT5pbmRleDsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKworCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJdmFsIC89IDEwMDA7CisKKwl2YWwgPSBTRU5TT1JTX0xJTUlUKHZhbCwgMCwgKGluZGV4ID09IDYgPyAxMjcgOiAyNTUpKTsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWRhdGEtPnZhbGlkID0gMDsKKworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBsbTk1MjQ1X3JlZ19hZGRyZXNzW2luZGV4XSwgdmFsKTsKKworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfY3JpdF9oeXN0KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKworCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJdmFsIC89IDEwMDA7CisKKwl2YWwgPSBTRU5TT1JTX0xJTUlUKHZhbCwgMCwgMzEpOworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJZGF0YS0+dmFsaWQgPSAwOworCisJLyogc2hhcmVkIGNyaXQgaHlzdGVyZXNpcyAqLworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBMTTk1MjQ1X1JFR19SV19DT01NT05fSFlTVEVSRVNJUywKKwkJdmFsKTsKKworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X3R5cGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSBjaGFyICpidWYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUgLSAxLAorCQlkYXRhLT5jb25maWcyICYgQ0ZHMl9SRU1PVEVfVFQgPyAiMVxuIiA6ICIyXG4iKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X3R5cGUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXVuc2lnbmVkIGxvbmcgdmFsOworCisJaWYgKHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMTAsICZ2YWwpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHZhbCAhPSAxICYmIHZhbCAhPSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmICh2YWwgPT0gMSkKKwkJZGF0YS0+Y29uZmlnMiB8PSBDRkcyX1JFTU9URV9UVDsKKwllbHNlCisJCWRhdGEtPmNvbmZpZzIgJj0gfkNGRzJfUkVNT1RFX1RUOworCisJZGF0YS0+dmFsaWQgPSAwOworCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIExNOTUyNDVfUkVHX1JXX0NPTkZJRzIsCisJCQkJICBkYXRhLT5jb25maWcyKTsKKworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgY2hhciAqYnVmKQoreworCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBsbTk1MjQ1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKwlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoYXR0ciktPmluZGV4OworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFIC0gMSwgIiVkXG4iLAorCQkJISEoZGF0YS0+cmVnc1s5XSAmIGluZGV4KSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfaW50ZXJ2YWwoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBsbTk1MjQ1X2RhdGEgKmRhdGEgPSBsbTk1MjQ1X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSAtIDEsICIlbHVcbiIsIGRhdGEtPmludGVydmFsKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2V0X2ludGVydmFsKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKwlpZiAoc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbCkgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWRhdGEtPmludGVydmFsID0gbG05NTI0NV9zZXRfY29udmVyc2lvbl9yYXRlKGNsaWVudCwgdmFsKTsKKworCW11dGV4X3VubG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2lucHV0LCBTX0lSVUdPLCBzaG93X2lucHV0LCBOVUxMLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfY3JpdCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfbGltaXQsCisJCXNldF9saW1pdCwgNik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX2NyaXRfaHlzdCwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfbGltaXQsCisJCXNldF9jcml0X2h5c3QsIDgpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9jcml0X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLAorCQlTVEFUVVMxX0xPQyk7CisKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfaW5wdXQsIFNfSVJVR08sIHNob3dfaW5wdXQsIE5VTEwsIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9jcml0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19saW1pdCwKKwkJc2V0X2xpbWl0LCA3KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfY3JpdF9oeXN0LCBTX0lXVVNSIHwgU19JUlVHTywgc2hvd19saW1pdCwKKwkJc2V0X2NyaXRfaHlzdCwgOCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX2NyaXRfYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsCisJCVNUQVRVUzFfUlRDUklUKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfdHlwZSwgU19JV1VTUiB8IFNfSVJVR08sIHNob3dfdHlwZSwKKwkJc2V0X3R5cGUsIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9mYXVsdCwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwKKwkJU1RBVFVTMV9ESU9ERV9GQVVMVCk7CisKK3N0YXRpYyBERVZJQ0VfQVRUUih1cGRhdGVfaW50ZXJ2YWwsIFNfSVdVU1IgfCBTX0lSVUdPLCBzaG93X2ludGVydmFsLAorCQlzZXRfaW50ZXJ2YWwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbG05NTI0NV9hdHRyaWJ1dGVzW10gPSB7CisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfY3JpdC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfY3JpdF9oeXN0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9jcml0X2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfY3JpdC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfY3JpdF9oeXN0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9jcml0X2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl90eXBlLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9mYXVsdC5kZXZfYXR0ci5hdHRyLAorCSZkZXZfYXR0cl91cGRhdGVfaW50ZXJ2YWwuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBsbTk1MjQ1X2dyb3VwID0geworCS5hdHRycyA9IGxtOTUyNDVfYXR0cmlidXRlcywKK307CisKKy8qIFJldHVybiAwIGlmIGRldGVjdGlvbiBpcyBzdWNjZXNzZnVsLCAtRU5PREVWIG90aGVyd2lzZSAqLworc3RhdGljIGludCBsbTk1MjQ1X2RldGVjdChzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudCwKKwkJCSAgc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvKQoreworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IG5ld19jbGllbnQtPmFkYXB0ZXI7CisKKwlpZiAoIWkyY19jaGVja19mdW5jdGlvbmFsaXR5KGFkYXB0ZXIsIEkyQ19GVU5DX1NNQlVTX0JZVEVfREFUQSkpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShuZXdfY2xpZW50LCBMTTk1MjQ1X1JFR19SX01BTl9JRCkKKwkJCSE9IE1BTlVGQUNUVVJFUl9JRAorCQl8fCBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEobmV3X2NsaWVudCwgTE05NTI0NV9SRUdfUl9DSElQX0lEKQorCQkJIT0gREVGQVVMVF9SRVZJU0lPTikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlzdHJsY3B5KGluZm8tPnR5cGUsIERFVk5BTUUsIEkyQ19OQU1FX1NJWkUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBsbTk1MjQ1X2luaXRfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGxtOTUyNDVfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJZGF0YS0+dmFsaWQgPSAwOworCWRhdGEtPmludGVydmFsID0gbG05NTI0NV9yZWFkX2NvbnZlcnNpb25fcmF0ZShjbGllbnQpOworCisJZGF0YS0+Y29uZmlnMSA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsCisJCUxNOTUyNDVfUkVHX1JXX0NPTkZJRzEpOworCWRhdGEtPmNvbmZpZzIgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LAorCQlMTTk1MjQ1X1JFR19SV19DT05GSUcyKTsKKworCWlmIChkYXRhLT5jb25maWcxICYgQ0ZHX1NUT1ApIHsKKwkJLyogQ2xlYXIgdGhlIHN0YW5kYnkgYml0ICovCisJCWRhdGEtPmNvbmZpZzEgJj0gfkNGR19TVE9QOworCQlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgTE05NTI0NV9SRUdfUldfQ09ORklHMSwKKwkJCWRhdGEtPmNvbmZpZzEpOworCX0KK30KKworc3RhdGljIGludCBsbTk1MjQ1X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50LAorCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhOworCWludCBlcnI7CisKKwlkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGxtOTUyNDVfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghZGF0YSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXQ7CisJfQorCisJaTJjX3NldF9jbGllbnRkYXRhKG5ld19jbGllbnQsIGRhdGEpOworCW11dGV4X2luaXQoJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCS8qIEluaXRpYWxpemUgdGhlIExNOTUyNDUgY2hpcCAqLworCWxtOTUyNDVfaW5pdF9jbGllbnQobmV3X2NsaWVudCk7CisKKwkvKiBSZWdpc3RlciBzeXNmcyBob29rcyAqLworCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmbmV3X2NsaWVudC0+ZGV2LmtvYmosICZsbTk1MjQ1X2dyb3VwKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXRfZnJlZTsKKworCWRhdGEtPmh3bW9uX2RldiA9IGh3bW9uX2RldmljZV9yZWdpc3RlcigmbmV3X2NsaWVudC0+ZGV2KTsKKwlpZiAoSVNfRVJSKGRhdGEtPmh3bW9uX2RldikpIHsKKwkJZXJyID0gUFRSX0VSUihkYXRhLT5od21vbl9kZXYpOworCQlnb3RvIGV4aXRfcmVtb3ZlX2ZpbGVzOworCX0KKworCXJldHVybiAwOworCitleGl0X3JlbW92ZV9maWxlczoKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJm5ld19jbGllbnQtPmRldi5rb2JqLCAmbG05NTI0NV9ncm91cCk7CitleGl0X2ZyZWU6CisJa2ZyZWUoZGF0YSk7CitleGl0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbG05NTI0NV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgbG05NTI0NV9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlod21vbl9kZXZpY2VfdW5yZWdpc3RlcihkYXRhLT5od21vbl9kZXYpOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJmxtOTUyNDVfZ3JvdXApOworCisJa2ZyZWUoZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIERyaXZlciBkYXRhIChjb21tb24gdG8gYWxsIGNsaWVudHMpICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgbG05NTI0NV9pZFtdID0geworCXsgREVWTkFNRSwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBsbTk1MjQ1X2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGxtOTUyNDVfZHJpdmVyID0geworCS5jbGFzcwkJPSBJMkNfQ0xBU1NfSFdNT04sCisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSBERVZOQU1FLAorCX0sCisJLnByb2JlCQk9IGxtOTUyNDVfcHJvYmUsCisJLnJlbW92ZQkJPSBsbTk1MjQ1X3JlbW92ZSwKKwkuaWRfdGFibGUJPSBsbTk1MjQ1X2lkLAorCS5kZXRlY3QJCT0gbG05NTI0NV9kZXRlY3QsCisJLmFkZHJlc3NfbGlzdAk9IG5vcm1hbF9pMmMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzZW5zb3JzX2xtOTUyNDVfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmbG05NTI0NV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2Vuc29yc19sbTk1MjQ1X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmbG05NTI0NV9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJBbGV4YW5kZXIgU3RlaW4gPGFsZXhhbmRlci5zdGVpbkBzeXN0ZWMtZWxlY3Ryb25pYy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkxNOTUyNDUgc2Vuc29yIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChzZW5zb3JzX2xtOTUyNDVfaW5pdCk7Cittb2R1bGVfZXhpdChzZW5zb3JzX2xtOTUyNDVfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL21heDE2NjguYyBiL2RyaXZlcnMvaHdtb24vbWF4MTY2OC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZDFiMmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2h3bW9uL21heDE2NjguYwpAQCAtMCwwICsxLDUwMiBAQAorLyoKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEgRGF2aWQgR2VvcmdlIDxkYXZpZC5nZW9yZ2VAc2thLmFjLnphPgorCisgICAgYmFzZWQgb24gYWRtMTAyMS5jCisgICAgc29tZSBjcmVkaXQgdG8gQ2hyaXN0b3BoIFNjaGV1cmVyLCBidXQgbGFyZ2VseSBhIHJld3JpdGUKKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLmg+CisjaW5jbHVkZSA8bGludXgvaHdtb24tc3lzZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorCisvKiBBZGRyZXNzZXMgdG8gc2NhbiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IG1heDE2NjhfYWRkcl9saXN0W10gPSB7CisJMHgxOCwgMHgxOSwgMHgxYSwgMHgyOSwgMHgyYSwgMHgyYiwgMHg0YywgMHg0ZCwgMHg0ZSwgSTJDX0NMSUVOVF9FTkQgfTsKKworLyogbWF4MTY2OCByZWdpc3RlcnMgKi8KKworI2RlZmluZSBNQVgxNjY4X1JFR19URU1QKG5yKQkobnIpCisjZGVmaW5lIE1BWDE2NjhfUkVHX1NUQVQxCTB4MDUKKyNkZWZpbmUgTUFYMTY2OF9SRUdfU1RBVDIJMHgwNgorI2RlZmluZSBNQVgxNjY4X1JFR19NQU5fSUQJMHhmZQorI2RlZmluZSBNQVgxNjY4X1JFR19ERVZfSUQJMHhmZgorCisvKiBsaW1pdHMgKi8KKworLyogd3JpdGUgaGlnaCBsaW1pdHMgKi8KKyNkZWZpbmUgTUFYMTY2OF9SRUdfTElNSF9XUihucikJKDB4MTMgKyAyICogKG5yKSkKKy8qIHdyaXRlIGxvdyBsaW1pdHMgKi8KKyNkZWZpbmUgTUFYMTY2OF9SRUdfTElNTF9XUihucikJKDB4MTQgKyAyICogKG5yKSkKKy8qIHJlYWQgaGlnaCBsaW1pdHMgKi8KKyNkZWZpbmUgTUFYMTY2OF9SRUdfTElNSF9SRChucikJKDB4MDggKyAyICogKG5yKSkKKy8qIHJlYWQgbG93IGxpbWl0cyAqLworI2RlZmluZSBNQVgxNjY4X1JFR19MSU1MX1JEKG5yKQkoMHgwOSArIDIgKiAobnIpKQorCisvKiBtYW51ZmFjdHVyZXIgYW5kIGRldmljZSBJRCBDb25zdGFudHMgKi8KKyNkZWZpbmUgTUFOX0lEX01BWElNCQkweDRkCisjZGVmaW5lIERFVl9JRF9NQVgxNjY4CQkweDMKKyNkZWZpbmUgREVWX0lEX01BWDE4MDUJCTB4NQorI2RlZmluZSBERVZfSURfTUFYMTk4OQkJMHhiCisKKy8qIHJlYWQgb25seSBtb2RlIG1vZHVsZSBwYXJhbWV0ZXIgKi8KK3N0YXRpYyBpbnQgcmVhZF9vbmx5OworbW9kdWxlX3BhcmFtKHJlYWRfb25seSwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHJlYWRfb25seSwgIkRvbid0IHNldCBhbnkgdmFsdWVzLCByZWFkIG9ubHkgbW9kZSIpOworCitlbnVtIGNoaXBzIHsgbWF4MTY2OCwgbWF4MTgwNSwgbWF4MTk4OSB9OworCitzdHJ1Y3QgbWF4MTY2OF9kYXRhIHsKKwlzdHJ1Y3QgZGV2aWNlICpod21vbl9kZXY7CisJZW51bSBjaGlwcyB0eXBlOworCisJc3RydWN0IG11dGV4IHVwZGF0ZV9sb2NrOworCWNoYXIgdmFsaWQ7CQkvKiAhPTAgaWYgZm9sbG93aW5nIGZpZWxkcyBhcmUgdmFsaWQgKi8KKwl1bnNpZ25lZCBsb25nIGxhc3RfdXBkYXRlZDsJLyogSW4gamlmZmllcyAqLworCisJLyogMXggbG9jYWwgYW5kIDR4IHJlbW90ZSAqLworCXM4IHRlbXBfbWF4WzVdOworCXM4IHRlbXBfbWluWzVdOworCXM4IHRlbXBbNV07CisJdTE2IGFsYXJtczsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWF4MTY2OF9kYXRhICptYXgxNjY4X3VwZGF0ZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IG1heDE2NjhfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBtYXgxNjY4X2RhdGEgKnJldCA9IGRhdGE7CisJczMyIHZhbDsKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCWlmIChkYXRhLT52YWxpZCAmJiAhdGltZV9hZnRlcihqaWZmaWVzLAorCQkJZGF0YS0+bGFzdF91cGRhdGVkICsgSFogKyBIWiAvIDIpKQorCQlnb3RvIGFib3J0OworCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQl2YWwgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNQVgxNjY4X1JFR19URU1QKGkpKTsKKwkJaWYgKHVubGlrZWx5KHZhbCA8IDApKSB7CisJCQlyZXQgPSBFUlJfUFRSKHZhbCk7CisJCQlnb3RvIGFib3J0OworCQl9CisJCWRhdGEtPnRlbXBbaV0gPSAoczgpIHZhbDsKKworCQl2YWwgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNQVgxNjY4X1JFR19MSU1IX1JEKGkpKTsKKwkJaWYgKHVubGlrZWx5KHZhbCA8IDApKSB7CisJCQlyZXQgPSBFUlJfUFRSKHZhbCk7CisJCQlnb3RvIGFib3J0OworCQl9CisJCWRhdGEtPnRlbXBfbWF4W2ldID0gKHM4KSB2YWw7CisKKwkJdmFsID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTUFYMTY2OF9SRUdfTElNTF9SRChpKSk7CisJCWlmICh1bmxpa2VseSh2YWwgPCAwKSkgeworCQkJcmV0ID0gRVJSX1BUUih2YWwpOworCQkJZ290byBhYm9ydDsKKwkJfQorCQlkYXRhLT50ZW1wX21pbltpXSA9IChzOCkgdmFsOworCX0KKworCXZhbCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIE1BWDE2NjhfUkVHX1NUQVQxKTsKKwlpZiAodW5saWtlbHkodmFsIDwgMCkpIHsKKwkJcmV0ID0gRVJSX1BUUih2YWwpOworCQlnb3RvIGFib3J0OworCX0KKwlkYXRhLT5hbGFybXMgPSB2YWwgPDwgODsKKworCXZhbCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIE1BWDE2NjhfUkVHX1NUQVQyKTsKKwlpZiAodW5saWtlbHkodmFsIDwgMCkpIHsKKwkJcmV0ID0gRVJSX1BUUih2YWwpOworCQlnb3RvIGFib3J0OworCX0KKwlkYXRhLT5hbGFybXMgfD0gdmFsOworCisJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKKwlkYXRhLT52YWxpZCA9IDE7CithYm9ydDoKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcChzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OworCXN0cnVjdCBtYXgxNjY4X2RhdGEgKmRhdGEgPSBtYXgxNjY4X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKworCWlmIChJU19FUlIoZGF0YSkpCisJCXJldHVybiBQVFJfRVJSKGRhdGEpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGRhdGEtPnRlbXBbaW5kZXhdICogMTAwMCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9tYXgoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJc3RydWN0IG1heDE2NjhfZGF0YSAqZGF0YSA9IG1heDE2NjhfdXBkYXRlX2RldmljZShkZXYpOworCisJaWYgKElTX0VSUihkYXRhKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGF0YSk7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+dGVtcF9tYXhbaW5kZXhdICogMTAwMCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfdGVtcF9taW4oc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGV2YXR0ciwgY2hhciAqYnVmKQoreworCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJc3RydWN0IG1heDE2NjhfZGF0YSAqZGF0YSA9IG1heDE2NjhfdXBkYXRlX2RldmljZShkZXYpOworCisJaWYgKElTX0VSUihkYXRhKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGF0YSk7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgZGF0YS0+dGVtcF9taW5baW5kZXhdICogMTAwMCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNob3dfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgY2hhciAqYnVmKQoreworCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihhdHRyKS0+aW5kZXg7CisJc3RydWN0IG1heDE2NjhfZGF0YSAqZGF0YSA9IG1heDE2NjhfdXBkYXRlX2RldmljZShkZXYpOworCisJaWYgKElTX0VSUihkYXRhKSkKKwkJcmV0dXJuIFBUUl9FUlIoZGF0YSk7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgKGRhdGEtPmFsYXJtcyA+PiBpbmRleCkgJiAweDEpOworfQorCitzdGF0aWMgc3NpemVfdCBzaG93X2ZhdWx0KHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlpbnQgaW5kZXggPSB0b19zZW5zb3JfZGV2X2F0dHIoZGV2YXR0ciktPmluZGV4OworCXN0cnVjdCBtYXgxNjY4X2RhdGEgKmRhdGEgPSBtYXgxNjY4X3VwZGF0ZV9kZXZpY2UoZGV2KTsKKworCWlmIChJU19FUlIoZGF0YSkpCisJCXJldHVybiBQVFJfRVJSKGRhdGEpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsCisJCSAgICAgICAoZGF0YS0+YWxhcm1zICYgKDEgPDwgMTIpKSAmJiBkYXRhLT50ZW1wW2luZGV4XSA9PSAxMjcpOworfQorCitzdGF0aWMgc3NpemVfdCBzZXRfdGVtcF9tYXgoc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICpkZXZhdHRyLAorCQkJICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWludCBpbmRleCA9IHRvX3NlbnNvcl9kZXZfYXR0cihkZXZhdHRyKS0+aW5kZXg7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKKwlzdHJ1Y3QgbWF4MTY2OF9kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJbG9uZyB0ZW1wOworCWludCByZXQ7CisKKwlyZXQgPSBrc3RydG9sKGJ1ZiwgMTAsICZ0ZW1wKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCW11dGV4X2xvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKwlkYXRhLT50ZW1wX21heFtpbmRleF0gPSBTRU5TT1JTX0xJTUlUKHRlbXAvMTAwMCwgLTEyOCwgMTI3KTsKKwlpZiAoaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsCisJCQkJCU1BWDE2NjhfUkVHX0xJTUhfV1IoaW5kZXgpLAorCQkJCQlkYXRhLT50ZW1wX21heFtpbmRleF0pKQorCQljb3VudCA9IC1FSU87CisJbXV0ZXhfdW5sb2NrKCZkYXRhLT51cGRhdGVfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNldF90ZW1wX21pbihzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmRldmF0dHIsCisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaW50IGluZGV4ID0gdG9fc2Vuc29yX2Rldl9hdHRyKGRldmF0dHIpLT5pbmRleDsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudChkZXYpOworCXN0cnVjdCBtYXgxNjY4X2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlsb25nIHRlbXA7CisJaW50IHJldDsKKworCXJldCA9IGtzdHJ0b2woYnVmLCAxMCwgJnRlbXApOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOworCWRhdGEtPnRlbXBfbWluW2luZGV4XSA9IFNFTlNPUlNfTElNSVQodGVtcC8xMDAwLCAtMTI4LCAxMjcpOworCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwKKwkJCQkJTUFYMTY2OF9SRUdfTElNTF9XUihpbmRleCksCisJCQkJCWRhdGEtPnRlbXBfbWF4W2luZGV4XSkpCisJCWNvdW50ID0gLUVJTzsKKwltdXRleF91bmxvY2soJmRhdGEtPnVwZGF0ZV9sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfbWF4LCBTX0lSVUdPLCBzaG93X3RlbXBfbWF4LAorCQkJCXNldF90ZW1wX21heCwgMCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21pbiwgU19JUlVHTywgc2hvd190ZW1wX21pbiwKKwkJCQlzZXRfdGVtcF9taW4sIDApOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfbWF4LCBTX0lSVUdPLCBzaG93X3RlbXBfbWF4LAorCQkJCXNldF90ZW1wX21heCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAyX21pbiwgU19JUlVHTywgc2hvd190ZW1wX21pbiwKKwkJCQlzZXRfdGVtcF9taW4sIDEpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wM19pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCAyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfbWF4LCBTX0lSVUdPLCBzaG93X3RlbXBfbWF4LAorCQkJCXNldF90ZW1wX21heCwgMik7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX21pbiwgU19JUlVHTywgc2hvd190ZW1wX21pbiwKKwkJCQlzZXRfdGVtcF9taW4sIDIpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNF9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCAzKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDRfbWF4LCBTX0lSVUdPLCBzaG93X3RlbXBfbWF4LAorCQkJCXNldF90ZW1wX21heCwgMyk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA0X21pbiwgU19JUlVHTywgc2hvd190ZW1wX21pbiwKKwkJCQlzZXRfdGVtcF9taW4sIDMpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNV9pbnB1dCwgU19JUlVHTywgc2hvd190ZW1wLCBOVUxMLCA0KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDVfbWF4LCBTX0lSVUdPLCBzaG93X3RlbXBfbWF4LAorCQkJCXNldF90ZW1wX21heCwgNCk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXA1X21pbiwgU19JUlVHTywgc2hvd190ZW1wX21pbiwKKwkJCQlzZXRfdGVtcF9taW4sIDQpOworCitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAxX21heF9hbGFybSwgU19JUlVHTywgc2hvd19hbGFybSwgTlVMTCwgMTQpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV9taW5fYWxhcm0sIFNfSVJVR08sIHNob3dfYWxhcm0sIE5VTEwsIDEzKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfbWluX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA3KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDJfbWF4X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA2KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfbWluX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA1KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDNfbWF4X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCA0KTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDRfbWluX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAzKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDRfbWF4X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDVfbWluX2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAxKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDVfbWF4X2FsYXJtLCBTX0lSVUdPLCBzaG93X2FsYXJtLCBOVUxMLCAwKTsKKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMl9mYXVsdCwgU19JUlVHTywgc2hvd19mYXVsdCwgTlVMTCwgMSk7CitzdGF0aWMgU0VOU09SX0RFVklDRV9BVFRSKHRlbXAzX2ZhdWx0LCBTX0lSVUdPLCBzaG93X2ZhdWx0LCBOVUxMLCAyKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDRfZmF1bHQsIFNfSVJVR08sIHNob3dfZmF1bHQsIE5VTEwsIDMpOworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wNV9mYXVsdCwgU19JUlVHTywgc2hvd19mYXVsdCwgTlVMTCwgNCk7CisKKy8qIEF0dHJpYnV0ZXMgY29tbW9uIHRvIE1BWDE2NjgsIE1BWDE5ODkgYW5kIE1BWDE4MDUgKi8KK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICptYXgxNjY4X2F0dHJpYnV0ZV9jb21tb25bXSA9IHsKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21heC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX2lucHV0LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19tYXguZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX21pbi5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKworCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWF4X2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMV9taW5fYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX21heF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDJfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXAzX21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9mYXVsdC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfZmF1bHQuZGV2X2F0dHIuYXR0ciwKKwlOVUxMCit9OworCisvKiBBdHRyaWJ1dGVzIG5vdCBwcmVzZW50IG9uIE1BWDE4MDUgKi8KK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICptYXgxNjY4X2F0dHJpYnV0ZV91bmlxdWVbXSA9IHsKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXA0X21heC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDRfbWluLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wNF9pbnB1dC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDVfbWF4LmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wNV9taW4uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXA1X2lucHV0LmRldl9hdHRyLmF0dHIsCisKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXA0X21heF9hbGFybS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDRfbWluX2FsYXJtLmRldl9hdHRyLmF0dHIsCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wNV9tYXhfYWxhcm0uZGV2X2F0dHIuYXR0ciwKKwkmc2Vuc29yX2Rldl9hdHRyX3RlbXA1X21pbl9hbGFybS5kZXZfYXR0ci5hdHRyLAorCisJJnNlbnNvcl9kZXZfYXR0cl90ZW1wNF9mYXVsdC5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDVfZmF1bHQuZGV2X2F0dHIuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgbW9kZV90IG1heDE2NjhfYXR0cmlidXRlX21vZGUoc3RydWN0IGtvYmplY3QgKmtvYmosCisJCQkJICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLCBpbnQgaW5kZXgpCit7CisJaW50IHJldCA9IFNfSVJVR087CisJaWYgKHJlYWRfb25seSkKKwkJcmV0dXJuIHJldDsKKwlpZiAoYXR0ciA9PSAmc2Vuc29yX2Rldl9hdHRyX3RlbXAxX21heC5kZXZfYXR0ci5hdHRyIHx8CisJICAgIGF0dHIgPT0gJnNlbnNvcl9kZXZfYXR0cl90ZW1wMl9tYXguZGV2X2F0dHIuYXR0ciB8fAorCSAgICBhdHRyID09ICZzZW5zb3JfZGV2X2F0dHJfdGVtcDNfbWF4LmRldl9hdHRyLmF0dHIgfHwKKwkgICAgYXR0ciA9PSAmc2Vuc29yX2Rldl9hdHRyX3RlbXA0X21heC5kZXZfYXR0ci5hdHRyIHx8CisJICAgIGF0dHIgPT0gJnNlbnNvcl9kZXZfYXR0cl90ZW1wNV9tYXguZGV2X2F0dHIuYXR0ciB8fAorCSAgICBhdHRyID09ICZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfbWluLmRldl9hdHRyLmF0dHIgfHwKKwkgICAgYXR0ciA9PSAmc2Vuc29yX2Rldl9hdHRyX3RlbXAyX21pbi5kZXZfYXR0ci5hdHRyIHx8CisJICAgIGF0dHIgPT0gJnNlbnNvcl9kZXZfYXR0cl90ZW1wM19taW4uZGV2X2F0dHIuYXR0ciB8fAorCSAgICBhdHRyID09ICZzZW5zb3JfZGV2X2F0dHJfdGVtcDRfbWluLmRldl9hdHRyLmF0dHIgfHwKKwkgICAgYXR0ciA9PSAmc2Vuc29yX2Rldl9hdHRyX3RlbXA1X21pbi5kZXZfYXR0ci5hdHRyKQorCQlyZXQgfD0gU19JV1VTUjsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBtYXgxNjY4X2dyb3VwX2NvbW1vbiA9IHsKKwkuYXR0cnMgPSBtYXgxNjY4X2F0dHJpYnV0ZV9jb21tb24sCisJLmlzX3Zpc2libGUgPSBtYXgxNjY4X2F0dHJpYnV0ZV9tb2RlCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBtYXgxNjY4X2dyb3VwX3VuaXF1ZSA9IHsKKwkuYXR0cnMgPSBtYXgxNjY4X2F0dHJpYnV0ZV91bmlxdWUsCisJLmlzX3Zpc2libGUgPSBtYXgxNjY4X2F0dHJpYnV0ZV9tb2RlCit9OworCisvKiBSZXR1cm4gMCBpZiBkZXRlY3Rpb24gaXMgc3VjY2Vzc2Z1bCwgLUVOT0RFViBvdGhlcndpc2UgKi8KK3N0YXRpYyBpbnQgbWF4MTY2OF9kZXRlY3Qoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSAgc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvKQoreworCXN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciA9IGNsaWVudC0+YWRhcHRlcjsKKwljb25zdCBjaGFyICp0eXBlX25hbWU7CisJaW50IG1hbl9pZCwgZGV2X2lkOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIENoZWNrIGZvciB1bnN1cHBvcnRlZCBwYXJ0ICovCisJbWFuX2lkID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgTUFYMTY2OF9SRUdfTUFOX0lEKTsKKwlpZiAobWFuX2lkICE9IE1BTl9JRF9NQVhJTSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkZXZfaWQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBNQVgxNjY4X1JFR19ERVZfSUQpOworCWlmIChkZXZfaWQgPCAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXR5cGVfbmFtZSA9IE5VTEw7CisJaWYgKGRldl9pZCA9PSBERVZfSURfTUFYMTY2OCkKKwkJdHlwZV9uYW1lID0gIm1heDE2NjgiOworCWVsc2UgaWYgKGRldl9pZCA9PSBERVZfSURfTUFYMTgwNSkKKwkJdHlwZV9uYW1lID0gIm1heDE4MDUiOworCWVsc2UgaWYgKGRldl9pZCA9PSBERVZfSURfTUFYMTk4OSkKKwkJdHlwZV9uYW1lID0gIm1heDE5ODkiOworCisJaWYgKCF0eXBlX25hbWUpCisJCXJldHVybiAtRU5PREVWOworCisJc3RybGNweShpbmZvLT50eXBlLCB0eXBlX25hbWUsIEkyQ19OQU1FX1NJWkUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWF4MTY2OF9wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICppZCkKK3sKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjbGllbnQtPmFkYXB0ZXI7CisJc3RydWN0IG1heDE2NjhfZGF0YSAqZGF0YTsKKwlpbnQgZXJyOworCisJaWYgKCFpMmNfY2hlY2tfZnVuY3Rpb25hbGl0eShhZGFwdGVyLCBJMkNfRlVOQ19TTUJVU19CWVRFX0RBVEEpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbWF4MTY2OF9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGRhdGEpOworCWRhdGEtPnR5cGUgPSBpZC0+ZHJpdmVyX2RhdGE7CisJbXV0ZXhfaW5pdCgmZGF0YS0+dXBkYXRlX2xvY2spOworCisJLyogUmVnaXN0ZXIgc3lzZnMgaG9va3MgKi8KKwllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmNsaWVudC0+ZGV2LmtvYmosICZtYXgxNjY4X2dyb3VwX2NvbW1vbik7CisJaWYgKGVycikKKwkJZ290byBlcnJvcl9mcmVlOworCisJaWYgKGRhdGEtPnR5cGUgPT0gbWF4MTY2OCB8fCBkYXRhLT50eXBlID09IG1heDE5ODkpIHsKKwkJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLAorCQkJCQkgJm1heDE2NjhfZ3JvdXBfdW5pcXVlKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyb3Jfc3lzcmVtMDsKKwl9CisKKwlkYXRhLT5od21vbl9kZXYgPSBod21vbl9kZXZpY2VfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2KTsKKwlpZiAoSVNfRVJSKGRhdGEtPmh3bW9uX2RldikpIHsKKwkJZXJyID0gUFRSX0VSUihkYXRhLT5od21vbl9kZXYpOworCQlnb3RvIGVycm9yX3N5c3JlbTE7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycm9yX3N5c3JlbTE6CisJaWYgKGRhdGEtPnR5cGUgPT0gbWF4MTY2OCB8fCBkYXRhLT50eXBlID09IG1heDE5ODkpCisJCXN5c2ZzX3JlbW92ZV9ncm91cCgmY2xpZW50LT5kZXYua29iaiwgJm1heDE2NjhfZ3JvdXBfdW5pcXVlKTsKK2Vycm9yX3N5c3JlbTA6CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbWF4MTY2OF9ncm91cF9jb21tb24pOworZXJyb3JfZnJlZToKKwlrZnJlZShkYXRhKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1heDE2NjhfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IG1heDE2NjhfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJaHdtb25fZGV2aWNlX3VucmVnaXN0ZXIoZGF0YS0+aHdtb25fZGV2KTsKKwlpZiAoZGF0YS0+dHlwZSA9PSBtYXgxNjY4IHx8IGRhdGEtPnR5cGUgPT0gbWF4MTk4OSkKKwkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbWF4MTY2OF9ncm91cF91bmlxdWUpOworCisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZjbGllbnQtPmRldi5rb2JqLCAmbWF4MTY2OF9ncm91cF9jb21tb24pOworCisJa2ZyZWUoZGF0YSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBtYXgxNjY4X2lkW10gPSB7CisJeyAibWF4MTY2OCIsIG1heDE2NjggfSwKKwl7ICJtYXgxODA1IiwgbWF4MTgwNSB9LAorCXsgIm1heDE5ODkiLCBtYXgxOTg5IH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIG1heDE2NjhfaWQpOworCisvKiBUaGlzIGlzIHRoZSBkcml2ZXIgdGhhdCB3aWxsIGJlIGluc2VydGVkICovCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgbWF4MTY2OF9kcml2ZXIgPSB7CisJLmNsYXNzID0gSTJDX0NMQVNTX0hXTU9OLAorCS5kcml2ZXIgPSB7CisJCSAgLm5hbWUJPSAibWF4MTY2OCIsCisJCSAgfSwKKwkucHJvYmUgPSBtYXgxNjY4X3Byb2JlLAorCS5yZW1vdmUJPSBtYXgxNjY4X3JlbW92ZSwKKwkuaWRfdGFibGUgPSBtYXgxNjY4X2lkLAorCS5kZXRlY3QJPSBtYXgxNjY4X2RldGVjdCwKKwkuYWRkcmVzc19saXN0ID0gbWF4MTY2OF9hZGRyX2xpc3QsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzZW5zb3JzX21heDE2NjhfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmbWF4MTY2OF9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc2Vuc29yc19tYXgxNjY4X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmbWF4MTY2OF9kcml2ZXIpOworfQorCitNT0RVTEVfQVVUSE9SKCJEYXZpZCBHZW9yZ2UgPGRhdmlkLmdlb3JnZUBza2EuYWMuemE+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1BWDE2NjggcmVtb3RlIHRlbXBlcmF0dXJlIHNlbnNvciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoc2Vuc29yc19tYXgxNjY4X2luaXQpCittb2R1bGVfZXhpdChzZW5zb3JzX21heDE2NjhfZXhpdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbnRjX3RoZXJtaXN0b3IuYyBiL2RyaXZlcnMvaHdtb24vbnRjX3RoZXJtaXN0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzkyNmY0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9od21vbi9udGNfdGhlcm1pc3Rvci5jCkBAIC0wLDAgKzEsNDUzIEBACisvKgorICogbnRjX3RoZXJtaXN0b3IuYyAtIE5UQyBUaGVybWlzdG9ycworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcworICogIE15dW5nSm9vIEhhbSA8bXl1bmdqb28uaGFtQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvbWF0aDY0Lmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kYXRhL250Y190aGVybWlzdG9yLmg+CisKKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorI2luY2x1ZGUgPGxpbnV4L2h3bW9uLXN5c2ZzLmg+CisKK3N0cnVjdCBudGNfY29tcGVuc2F0aW9uIHsKKwlpbnQJCXRlbXBfQzsKKwl1bnNpZ25lZCBpbnQJb2htOworfTsKKworLyoKKyAqIEEgY29tcGVuc2F0aW9uIHRhYmxlIHNob3VsZCBiZSBzb3J0ZWQgYnkgdGhlIHZhbHVlcyBvZiAub2htCisgKiBpbiBkZXNjZW5kaW5nIG9yZGVyLgorICogVGhlIGZvbGxvd2luZyBjb21wZW5zYXRpb24gdGFibGVzIGFyZSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIG9mIE11cmF0YSBOVEMKKyAqIFRoZXJtaXN0b3JzIERhdGFzaGVldAorICovCitjb25zdCBzdHJ1Y3QgbnRjX2NvbXBlbnNhdGlvbiBuY3BYWHdiNDczW10gPSB7CisJeyAudGVtcF9DCT0gLTQwLCAub2htCT0gMTc0NzkyMCB9LAorCXsgLnRlbXBfQwk9IC0zNSwgLm9obQk9IDEyNDU0MjggfSwKKwl7IC50ZW1wX0MJPSAtMzAsIC5vaG0JPSA4OTg0ODUgfSwKKwl7IC50ZW1wX0MJPSAtMjUsIC5vaG0JPSA2NTU4MDIgfSwKKwl7IC50ZW1wX0MJPSAtMjAsIC5vaG0JPSA0ODM5NTQgfSwKKwl7IC50ZW1wX0MJPSAtMTUsIC5vaG0JPSAzNjA4NTAgfSwKKwl7IC50ZW1wX0MJPSAtMTAsIC5vaG0JPSAyNzE2OTcgfSwKKwl7IC50ZW1wX0MJPSAtNSwgLm9obQk9IDIwNjQ2MyB9LAorCXsgLnRlbXBfQwk9IDAsIC5vaG0JPSAxNTgyMTQgfSwKKwl7IC50ZW1wX0MJPSA1LCAub2htCT0gMTIyMjU5IH0sCisJeyAudGVtcF9DCT0gMTAsIC5vaG0JPSA5NTIyNyB9LAorCXsgLnRlbXBfQwk9IDE1LCAub2htCT0gNzQ3MzAgfSwKKwl7IC50ZW1wX0MJPSAyMCwgLm9obQk9IDU5MDY1IH0sCisJeyAudGVtcF9DCT0gMjUsIC5vaG0JPSA0NzAwMCB9LAorCXsgLnRlbXBfQwk9IDMwLCAub2htCT0gMzc2NDMgfSwKKwl7IC50ZW1wX0MJPSAzNSwgLm9obQk9IDMwMzM0IH0sCisJeyAudGVtcF9DCT0gNDAsIC5vaG0JPSAyNDU5MSB9LAorCXsgLnRlbXBfQwk9IDQ1LCAub2htCT0gMjAwNDggfSwKKwl7IC50ZW1wX0MJPSA1MCwgLm9obQk9IDE2NDMzIH0sCisJeyAudGVtcF9DCT0gNTUsIC5vaG0JPSAxMzUzOSB9LAorCXsgLnRlbXBfQwk9IDYwLCAub2htCT0gMTEyMDkgfSwKKwl7IC50ZW1wX0MJPSA2NSwgLm9obQk9IDkzMjggfSwKKwl7IC50ZW1wX0MJPSA3MCwgLm9obQk9IDc3OTggfSwKKwl7IC50ZW1wX0MJPSA3NSwgLm9obQk9IDY1NDQgfSwKKwl7IC50ZW1wX0MJPSA4MCwgLm9obQk9IDU1MTggfSwKKwl7IC50ZW1wX0MJPSA4NSwgLm9obQk9IDQ2NzQgfSwKKwl7IC50ZW1wX0MJPSA5MCwgLm9obQk9IDM5NzIgfSwKKwl7IC50ZW1wX0MJPSA5NSwgLm9obQk9IDMzODggfSwKKwl7IC50ZW1wX0MJPSAxMDAsIC5vaG0JPSAyOTAyIH0sCisJeyAudGVtcF9DCT0gMTA1LCAub2htCT0gMjQ5NCB9LAorCXsgLnRlbXBfQwk9IDExMCwgLm9obQk9IDIxNTAgfSwKKwl7IC50ZW1wX0MJPSAxMTUsIC5vaG0JPSAxODYwIH0sCisJeyAudGVtcF9DCT0gMTIwLCAub2htCT0gMTYxNSB9LAorCXsgLnRlbXBfQwk9IDEyNSwgLm9obQk9IDE0MDYgfSwKK307Citjb25zdCBzdHJ1Y3QgbnRjX2NvbXBlbnNhdGlvbiBuY3BYWHdsMzMzW10gPSB7CisJeyAudGVtcF9DCT0gLTQwLCAub2htCT0gMTYxMDE1NCB9LAorCXsgLnRlbXBfQwk9IC0zNSwgLm9obQk9IDExMzA4NTAgfSwKKwl7IC50ZW1wX0MJPSAtMzAsIC5vaG0JPSA4MDI2MDkgfSwKKwl7IC50ZW1wX0MJPSAtMjUsIC5vaG0JPSA1NzUzODUgfSwKKwl7IC50ZW1wX0MJPSAtMjAsIC5vaG0JPSA0MTY0NjQgfSwKKwl7IC50ZW1wX0MJPSAtMTUsIC5vaG0JPSAzMDQyMTkgfSwKKwl7IC50ZW1wX0MJPSAtMTAsIC5vaG0JPSAyMjQxOTMgfSwKKwl7IC50ZW1wX0MJPSAtNSwgLm9obQk9IDE2NjYyMyB9LAorCXsgLnRlbXBfQwk9IDAsIC5vaG0JPSAxMjQ4NTAgfSwKKwl7IC50ZW1wX0MJPSA1LCAub2htCT0gOTQyODcgfSwKKwl7IC50ZW1wX0MJPSAxMCwgLm9obQk9IDcxNzQ3IH0sCisJeyAudGVtcF9DCT0gMTUsIC5vaG0JPSA1NDk5NiB9LAorCXsgLnRlbXBfQwk9IDIwLCAub2htCT0gNDI0NTUgfSwKKwl7IC50ZW1wX0MJPSAyNSwgLm9obQk9IDMzMDAwIH0sCisJeyAudGVtcF9DCT0gMzAsIC5vaG0JPSAyNTgyMiB9LAorCXsgLnRlbXBfQwk9IDM1LCAub2htCT0gMjAzMzUgfSwKKwl7IC50ZW1wX0MJPSA0MCwgLm9obQk9IDE2MTE1IH0sCisJeyAudGVtcF9DCT0gNDUsIC5vaG0JPSAxMjg0OSB9LAorCXsgLnRlbXBfQwk9IDUwLCAub2htCT0gMTAzMDYgfSwKKwl7IC50ZW1wX0MJPSA1NSwgLm9obQk9IDgzMTQgfSwKKwl7IC50ZW1wX0MJPSA2MCwgLm9obQk9IDY3NDYgfSwKKwl7IC50ZW1wX0MJPSA2NSwgLm9obQk9IDU1MDMgfSwKKwl7IC50ZW1wX0MJPSA3MCwgLm9obQk9IDQ1MTMgfSwKKwl7IC50ZW1wX0MJPSA3NSwgLm9obQk9IDM3MjEgfSwKKwl7IC50ZW1wX0MJPSA4MCwgLm9obQk9IDMwODQgfSwKKwl7IC50ZW1wX0MJPSA4NSwgLm9obQk9IDI1NjkgfSwKKwl7IC50ZW1wX0MJPSA5MCwgLm9obQk9IDIxNTEgfSwKKwl7IC50ZW1wX0MJPSA5NSwgLm9obQk9IDE4MDkgfSwKKwl7IC50ZW1wX0MJPSAxMDAsIC5vaG0JPSAxNTI5IH0sCisJeyAudGVtcF9DCT0gMTA1LCAub2htCT0gMTI5OSB9LAorCXsgLnRlbXBfQwk9IDExMCwgLm9obQk9IDExMDggfSwKKwl7IC50ZW1wX0MJPSAxMTUsIC5vaG0JPSA5NDkgfSwKKwl7IC50ZW1wX0MJPSAxMjAsIC5vaG0JPSA4MTcgfSwKKwl7IC50ZW1wX0MJPSAxMjUsIC5vaG0JPSA3MDcgfSwKK307CisKK3N0cnVjdCBudGNfZGF0YSB7CisJc3RydWN0IGRldmljZSAqaHdtb25fZGV2OworCXN0cnVjdCBudGNfdGhlcm1pc3Rvcl9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwljb25zdCBzdHJ1Y3QgbnRjX2NvbXBlbnNhdGlvbiAqY29tcDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJaW50IG5fY29tcDsKKwljaGFyIG5hbWVbUExBVEZPUk1fTkFNRV9TSVpFXTsKK307CisKK3N0YXRpYyBpbmxpbmUgdTY0IGRpdjY0X3U2NF9zYWZlKHU2NCBkaXZpZGVuZCwgdTY0IGRpdmlzb3IpCit7CisJaWYgKGRpdmlzb3IgPT0gMCAmJiBkaXZpZGVuZCA9PSAwKQorCQlyZXR1cm4gMDsKKwlpZiAoZGl2aXNvciA9PSAwKQorCQlyZXR1cm4gVUlOVF9NQVg7CisJcmV0dXJuIGRpdjY0X3U2NChkaXZpZGVuZCwgZGl2aXNvcik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X29obV9vZl90aGVybWlzdG9yKHN0cnVjdCBudGNfZGF0YSAqZGF0YSwKKwkJdW5zaWduZWQgaW50IHVWKQoreworCXN0cnVjdCBudGNfdGhlcm1pc3Rvcl9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRhdGEtPnBkYXRhOworCXU2NCBtViA9IHVWIC8gMTAwMDsKKwl1NjQgcG1WID0gcGRhdGEtPnB1bGx1cF91ViAvIDEwMDA7CisJdTY0IE4sIHB1TywgcGRPOworCXB1TyA9IHBkYXRhLT5wdWxsdXBfb2htOworCXBkTyA9IHBkYXRhLT5wdWxsZG93bl9vaG07CisKKwlpZiAobVYgPT0gMCkgeworCQlpZiAocGRhdGEtPmNvbm5lY3QgPT0gTlRDX0NPTk5FQ1RFRF9QT1NJVElWRSkKKwkJCXJldHVybiBVSU5UX01BWDsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChtViA+PSBwbVYpCisJCXJldHVybiAocGRhdGEtPmNvbm5lY3QgPT0gTlRDX0NPTk5FQ1RFRF9QT1NJVElWRSkgPworCQkJMCA6IFVJTlRfTUFYOworCisJaWYgKHBkYXRhLT5jb25uZWN0ID09IE5UQ19DT05ORUNURURfUE9TSVRJVkUgJiYgcHVPID09IDApCisJCU4gPSBkaXY2NF91NjRfc2FmZShwZE8gKiAocG1WIC0gbVYpLCBtVik7CisJZWxzZSBpZiAocGRhdGEtPmNvbm5lY3QgPT0gTlRDX0NPTk5FQ1RFRF9HUk9VTkQgJiYgcGRPID09IDApCisJCU4gPSBkaXY2NF91NjRfc2FmZShwdU8gKiBtViwgcG1WIC0gbVYpOworCWVsc2UgaWYgKHBkYXRhLT5jb25uZWN0ID09IE5UQ19DT05ORUNURURfUE9TSVRJVkUpCisJCU4gPSBkaXY2NF91NjRfc2FmZShwZE8gKiBwdU8gKiAocG1WIC0gbVYpLAorCQkJCXB1TyAqIG1WIC0gcGRPICogKHBtViAtIG1WKSk7CisJZWxzZQorCQlOID0gZGl2NjRfdTY0X3NhZmUocGRPICogcHVPICogbVYsIHBkTyAqIChwbVYgLSBtVikgLSBwdU8gKiBtVik7CisKKwlyZXR1cm4gKHVuc2lnbmVkIGludCkgTjsKK30KKworc3RhdGljIGludCBsb29rdXBfY29tcChzdHJ1Y3QgbnRjX2RhdGEgKmRhdGEsCisJCXVuc2lnbmVkIGludCBvaG0sIGludCAqaV9sb3csIGludCAqaV9oaWdoKQoreworCWludCBzdGFydCwgZW5kLCBtaWQgPSAtMTsKKworCS8qIERvIGEgYmluYXJ5IHNlYXJjaCBvbiBjb21wZW5zYXRpb24gdGFibGUgKi8KKwlzdGFydCA9IDA7CisJZW5kID0gZGF0YS0+bl9jb21wOworCisJd2hpbGUgKGVuZCA+IHN0YXJ0KSB7CisJCW1pZCA9IHN0YXJ0ICsgKGVuZCAtIHN0YXJ0KSAvIDI7CisJCWlmIChkYXRhLT5jb21wW21pZF0ub2htIDwgb2htKQorCQkJZW5kID0gbWlkOworCQllbHNlIGlmIChkYXRhLT5jb21wW21pZF0ub2htID4gb2htKQorCQkJc3RhcnQgPSBtaWQgKyAxOworCQllbHNlCisJCQlicmVhazsKKwl9CisKKwlpZiAobWlkID09IDApIHsKKwkJaWYgKGRhdGEtPmNvbXBbbWlkXS5vaG0gPiBvaG0pIHsKKwkJCSppX2hpZ2ggPSBtaWQ7CisJCQkqaV9sb3cgPSBtaWQgKyAxOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQkqaV9sb3cgPSBtaWQ7CisJCQkqaV9oaWdoID0gLTE7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwlpZiAobWlkID09IChkYXRhLT5uX2NvbXAgLSAxKSkgeworCQlpZiAoZGF0YS0+Y29tcFttaWRdLm9obSA8PSBvaG0pIHsKKwkJCSppX2xvdyA9IG1pZDsKKwkJCSppX2hpZ2ggPSBtaWQgLSAxOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQkqaV9sb3cgPSAtMTsKKwkJCSppX2hpZ2ggPSBtaWQ7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCWlmIChkYXRhLT5jb21wW21pZF0ub2htIDw9IG9obSkgeworCQkqaV9sb3cgPSBtaWQ7CisJCSppX2hpZ2ggPSBtaWQgLSAxOworCX0KKwlpZiAoZGF0YS0+Y29tcFttaWRdLm9obSA+IG9obSkgeworCQkqaV9sb3cgPSBtaWQgKyAxOworCQkqaV9oaWdoID0gbWlkOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF90ZW1wX21DKHN0cnVjdCBudGNfZGF0YSAqZGF0YSwgdW5zaWduZWQgaW50IG9obSwgaW50ICp0ZW1wKQoreworCWludCBsb3csIGhpZ2g7CisJaW50IHJldDsKKworCXJldCA9IGxvb2t1cF9jb21wKGRhdGEsIG9obSwgJmxvdywgJmhpZ2gpOworCWlmIChyZXQpIHsKKwkJLyogVW5hYmxlIHRvIHVzZSBsaW5lYXIgYXBwcm94aW1hdGlvbiAqLworCQlpZiAobG93ICE9IC0xKQorCQkJKnRlbXAgPSBkYXRhLT5jb21wW2xvd10udGVtcF9DICogMTAwMDsKKwkJZWxzZSBpZiAoaGlnaCAhPSAtMSkKKwkJCSp0ZW1wID0gZGF0YS0+Y29tcFtoaWdoXS50ZW1wX0MgKiAxMDAwOworCQllbHNlCisJCQlyZXR1cm4gcmV0OworCX0gZWxzZSB7CisJCSp0ZW1wID0gZGF0YS0+Y29tcFtsb3ddLnRlbXBfQyAqIDEwMDAgKworCQkJKChkYXRhLT5jb21wW2hpZ2hdLnRlbXBfQyAtIGRhdGEtPmNvbXBbbG93XS50ZW1wX0MpICoKKwkJCSAxMDAwICogKChpbnQpb2htIC0gKGludClkYXRhLT5jb21wW2xvd10ub2htKSkgLworCQkJKChpbnQpZGF0YS0+Y29tcFtoaWdoXS5vaG0gLSAoaW50KWRhdGEtPmNvbXBbbG93XS5vaG0pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG50Y190aGVybWlzdG9yX3JlYWQoc3RydWN0IG50Y19kYXRhICpkYXRhLCBpbnQgKnRlbXApCit7CisJaW50IHJldDsKKwlpbnQgcmVhZF9vaG0sIHJlYWRfdVY7CisJdW5zaWduZWQgaW50IG9obSA9IDA7CisKKwlpZiAoZGF0YS0+cGRhdGEtPnJlYWRfb2htKSB7CisJCXJlYWRfb2htID0gZGF0YS0+cGRhdGEtPnJlYWRfb2htKCk7CisJCWlmIChyZWFkX29obSA8IDApCisJCQlyZXR1cm4gcmVhZF9vaG07CisJCW9obSA9ICh1bnNpZ25lZCBpbnQpcmVhZF9vaG07CisJfQorCisJaWYgKGRhdGEtPnBkYXRhLT5yZWFkX3VWKSB7CisJCXJlYWRfdVYgPSBkYXRhLT5wZGF0YS0+cmVhZF91VigpOworCQlpZiAocmVhZF91ViA8IDApCisJCQlyZXR1cm4gcmVhZF91VjsKKwkJb2htID0gZ2V0X29obV9vZl90aGVybWlzdG9yKGRhdGEsICh1bnNpZ25lZCBpbnQpcmVhZF91Vik7CisJfQorCisJcmV0ID0gZ2V0X3RlbXBfbUMoZGF0YSwgb2htLCB0ZW1wKTsKKwlpZiAocmV0KSB7CisJCWRldl9kYmcoZGF0YS0+ZGV2LCAiU2Vuc29yIHJlYWRpbmcgZnVuY3Rpb24gbm90IGF2YWlsYWJsZS5cbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBudGNfc2hvd19uYW1lKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbnRjX2RhdGEgKmRhdGEgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBkYXRhLT5uYW1lKTsKK30KKworc3RhdGljIHNzaXplX3QgbnRjX3Nob3dfdHlwZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiNFxuIik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG50Y19zaG93X3RlbXAoc3RydWN0IGRldmljZSAqZGV2LAorCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBudGNfZGF0YSAqZGF0YSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWludCB0ZW1wLCByZXQ7CisKKwlyZXQgPSBudGNfdGhlcm1pc3Rvcl9yZWFkKGRhdGEsICZ0ZW1wKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCB0ZW1wKTsKK30KKworc3RhdGljIFNFTlNPUl9ERVZJQ0VfQVRUUih0ZW1wMV90eXBlLCBTX0lSVUdPLCBudGNfc2hvd190eXBlLCBOVUxMLCAwKTsKK3N0YXRpYyBTRU5TT1JfREVWSUNFX0FUVFIodGVtcDFfaW5wdXQsIFNfSVJVR08sIG50Y19zaG93X3RlbXAsIE5VTEwsIDApOworc3RhdGljIERFVklDRV9BVFRSKG5hbWUsIFNfSVJVR08sIG50Y19zaG93X25hbWUsIE5VTEwpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbnRjX2F0dHJpYnV0ZXNbXSA9IHsKKwkmZGV2X2F0dHJfbmFtZS5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfdHlwZS5kZXZfYXR0ci5hdHRyLAorCSZzZW5zb3JfZGV2X2F0dHJfdGVtcDFfaW5wdXQuZGV2X2F0dHIuYXR0ciwKKwlOVUxMLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgbnRjX2F0dHJfZ3JvdXAgPSB7CisJLmF0dHJzID0gbnRjX2F0dHJpYnV0ZXMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBudGNfdGhlcm1pc3Rvcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBudGNfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgbnRjX3RoZXJtaXN0b3JfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlpbnQgcmV0ID0gMDsKKworCWlmICghcGRhdGEpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiTm8gcGxhdGZvcm0gaW5pdCBkYXRhIHN1cHBsaWVkLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIEVpdGhlciBvbmUgb2YgdGhlIHR3byBpcyByZXF1aXJlZC4gKi8KKwlpZiAoIXBkYXRhLT5yZWFkX3VWICYmICFwZGF0YS0+cmVhZF9vaG0pIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQm90aCByZWFkX3VWIGFuZCByZWFkX29obSBtaXNzaW5nLiIKKwkJCQkiTmVlZCBlaXRoZXIgb25lIG9mIHRoZSB0d28uXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHBkYXRhLT5yZWFkX3VWICYmIHBkYXRhLT5yZWFkX29obSkgeworCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiT25seSBvbmUgb2YgcmVhZF91ViBhbmQgcmVhZF9vaG0gIgorCQkJCSJpcyBuZWVkZWQ7IGlnbm9yaW5nIHJlYWRfdVYuXG4iKTsKKwkJcGRhdGEtPnJlYWRfdVYgPSBOVUxMOworCX0KKworCWlmIChwZGF0YS0+cmVhZF91ViAmJiAocGRhdGEtPnB1bGx1cF91ViA9PSAwIHx8CisJCQkJKHBkYXRhLT5wdWxsdXBfb2htID09IDAgJiYgcGRhdGEtPmNvbm5lY3QgPT0KKwkJCQkgTlRDX0NPTk5FQ1RFRF9HUk9VTkQpIHx8CisJCQkJKHBkYXRhLT5wdWxsZG93bl9vaG0gPT0gMCAmJiBwZGF0YS0+Y29ubmVjdCA9PQorCQkJCSBOVENfQ09OTkVDVEVEX1BPU0lUSVZFKSB8fAorCQkJCShwZGF0YS0+Y29ubmVjdCAhPSBOVENfQ09OTkVDVEVEX1BPU0lUSVZFICYmCisJCQkJIHBkYXRhLT5jb25uZWN0ICE9IE5UQ19DT05ORUNURURfR1JPVU5EKSkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiUmVxdWlyZWQgZGF0YSB0byB1c2UgcmVhZF91ViBub3QgIgorCQkJCSJzdXBwbGllZC5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkYXRhID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG50Y19kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRhdGEtPmRldiA9ICZwZGV2LT5kZXY7CisJZGF0YS0+cGRhdGEgPSBwZGF0YTsKKwlzdHJuY3B5KGRhdGEtPm5hbWUsIHBkZXYtPmlkX2VudHJ5LT5uYW1lLCBQTEFURk9STV9OQU1FX1NJWkUpOworCisJc3dpdGNoIChwZGV2LT5pZF9lbnRyeS0+ZHJpdmVyX2RhdGEpIHsKKwljYXNlIFRZUEVfTkNQWFhXQjQ3MzoKKwkJZGF0YS0+Y29tcCA9IG5jcFhYd2I0NzM7CisJCWRhdGEtPm5fY29tcCA9IEFSUkFZX1NJWkUobmNwWFh3YjQ3Myk7CisJCWJyZWFrOworCWNhc2UgVFlQRV9OQ1BYWFdMMzMzOgorCQlkYXRhLT5jb21wID0gbmNwWFh3bDMzMzsKKwkJZGF0YS0+bl9jb21wID0gQVJSQVlfU0laRShuY3BYWHdsMzMzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiVW5rbm93biBkZXZpY2UgdHlwZTogJWx1KCVzKVxuIiwKKwkJCQlwZGV2LT5pZF9lbnRyeS0+ZHJpdmVyX2RhdGEsCisJCQkJcGRldi0+aWRfZW50cnktPm5hbWUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBkYXRhKTsKKworCXJldCA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmZGF0YS0+ZGV2LT5rb2JqLCAmbnRjX2F0dHJfZ3JvdXApOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkYXRhLT5kZXYsICJ1bmFibGUgdG8gY3JlYXRlIHN5c2ZzIGZpbGVzXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJZGF0YS0+aHdtb25fZGV2ID0gaHdtb25fZGV2aWNlX3JlZ2lzdGVyKGRhdGEtPmRldik7CisJaWYgKElTX0VSUl9PUl9OVUxMKGRhdGEtPmh3bW9uX2RldikpIHsKKwkJZGV2X2VycihkYXRhLT5kZXYsICJ1bmFibGUgdG8gcmVnaXN0ZXIgYXMgaHdtb24gZGV2aWNlLlxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2FmdGVyX3N5c2ZzOworCX0KKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJUaGVybWlzdG9yICVzOiVkICh0eXBlOiAlcy8lbHUpIHN1Y2Nlc3NmdWxseSBwcm9iZWQuXG4iLAorCQkJcGRldi0+bmFtZSwgcGRldi0+aWQsIHBkZXYtPmlkX2VudHJ5LT5uYW1lLAorCQkJcGRldi0+aWRfZW50cnktPmRyaXZlcl9kYXRhKTsKKwlyZXR1cm4gMDsKK2Vycl9hZnRlcl9zeXNmczoKKwlzeXNmc19yZW1vdmVfZ3JvdXAoJmRhdGEtPmRldi0+a29iaiwgJm50Y19hdHRyX2dyb3VwKTsKK2VycjoKKwlrZnJlZShkYXRhKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBudGNfdGhlcm1pc3Rvcl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbnRjX2RhdGEgKmRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWh3bW9uX2RldmljZV91bnJlZ2lzdGVyKGRhdGEtPmh3bW9uX2Rldik7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKCZkYXRhLT5kZXYtPmtvYmosICZudGNfYXR0cl9ncm91cCk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlrZnJlZShkYXRhKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBudGNfdGhlcm1pc3Rvcl9pZFtdID0geworCXsgIm5jcDE1d2I0NzMiLCBUWVBFX05DUFhYV0I0NzMgfSwKKwl7ICJuY3AxOHdiNDczIiwgVFlQRV9OQ1BYWFdCNDczIH0sCisJeyAibmNwMjF3YjQ3MyIsIFRZUEVfTkNQWFhXQjQ3MyB9LAorCXsgIm5jcDAzd2I0NzMiLCBUWVBFX05DUFhYV0I0NzMgfSwKKwl7ICJuY3AxNXdsMzMzIiwgVFlQRV9OQ1BYWFdMMzMzIH0sCisJeyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbnRjX3RoZXJtaXN0b3JfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gIm50Yy10aGVybWlzdG9yIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBudGNfdGhlcm1pc3Rvcl9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AobnRjX3RoZXJtaXN0b3JfcmVtb3ZlKSwKKwkuaWRfdGFibGUgPSBudGNfdGhlcm1pc3Rvcl9pZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG50Y190aGVybWlzdG9yX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZudGNfdGhlcm1pc3Rvcl9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChudGNfdGhlcm1pc3Rvcl9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IG50Y190aGVybWlzdG9yX2NsZWFudXAodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbnRjX3RoZXJtaXN0b3JfZHJpdmVyKTsKK30KKworbW9kdWxlX2V4aXQobnRjX3RoZXJtaXN0b3JfY2xlYW51cCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiTlRDIFRoZXJtaXN0b3IgRHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJNeXVuZ0pvbyBIYW0gPG15dW5nam9vLmhhbUBzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06bnRjLXRoZXJtaXN0b3IiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vcG1idXMvS2NvbmZpZyBiL2RyaXZlcnMvaHdtb24vcG1idXMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTIzN2I5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9od21vbi9wbWJ1cy9LY29uZmlnCkBAIC0wLDAgKzEsMTAwIEBACisjCisjIFBNQnVzIGNoaXAgZHJpdmVycyBjb25maWd1cmF0aW9uCisjCisKK21lbnVjb25maWcgUE1CVVMKKwl0cmlzdGF0ZSAiUE1CdXMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEkyQyAmJiBFWFBFUklNRU5UQUwKKwlkZWZhdWx0IG4KKwloZWxwCisJICBTYXkgeWVzIGhlcmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlIFBNQnVzIHN1cHBvcnQuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgcG1idXNfY29yZS4KKworaWYgUE1CVVMKKworY29uZmlnIFNFTlNPUlNfUE1CVVMKKwl0cmlzdGF0ZSAiR2VuZXJpYyBQTUJ1cyBkZXZpY2VzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBoYXJkd2FyZSBtb25pdG9yaW5nIHN1cHBvcnQgZm9yIGdlbmVyaWMKKwkgIFBNQnVzIGRldmljZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gQURQNDAwMCwgQk1SNDUwLCBCTVI0NTEsCisJICBCTVI0NTMsIEJNUjQ1NCwgTFRDMjk3OCwgTkNQNDIwMCwgYW5kIE5DUDQyMDguCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgcG1idXMuCisKK2NvbmZpZyBTRU5TT1JTX0FETTEyNzUKKwl0cmlzdGF0ZSAiQW5hbG9nIERldmljZXMgQURNMTI3NSIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgaGFyZHdhcmUgbW9uaXRvcmluZyBzdXBwb3J0IGZvciBBbmFsb2cKKwkgIERldmljZXMgQURNMTI3NSBIb3QtU3dhcCBDb250cm9sbGVyIGFuZCBEaWdpdGFsIFBvd2VyIE1vbml0b3IuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgYWRtMTI3NS4KKworY29uZmlnIFNFTlNPUlNfTE0yNTA2NgorCXRyaXN0YXRlICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNMjUwNjYgYW5kIGNvbXBhdGlibGVzIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBoYXJkd2FyZSBtb25pdG9yaW5nIHN1cHBvcnQgZm9yIE5hdGlvbmFsCisJICBTZW1pY29uZHVjdG9yIExNMjUwNjYsIExNNTA2NCwgYW5kIExNNTA2Ni4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBsbTI1MDY2LgorCitjb25maWcgU0VOU09SU19NQVgxNjA2NAorCXRyaXN0YXRlICJNYXhpbSBNQVgxNjA2NCIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgaGFyZHdhcmUgbW9uaXRvcmluZyBzdXBwb3J0IGZvciBNYXhpbQorCSAgTUFYMTYwNjQuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgbWF4MTYwNjQuCisKK2NvbmZpZyBTRU5TT1JTX01BWDM0NDQwCisJdHJpc3RhdGUgIk1heGltIE1BWDM0NDQwL01BWDM0NDQxIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIElmIHlvdSBzYXkgeWVzIGhlcmUgeW91IGdldCBoYXJkd2FyZSBtb25pdG9yaW5nIHN1cHBvcnQgZm9yIE1heGltCisJICBNQVgzNDQ0MCBhbmQgTUFYMzQ0NDEuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgbWF4MzQ0NDAuCisKK2NvbmZpZyBTRU5TT1JTX01BWDg2ODgKKwl0cmlzdGF0ZSAiTWF4aW0gTUFYODY4OCIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgaGFyZHdhcmUgbW9uaXRvcmluZyBzdXBwb3J0IGZvciBNYXhpbQorCSAgTUFYODY4OC4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCBtYXg4Njg4LgorCitjb25maWcgU0VOU09SU19VQ0Q5MDAwCisJdHJpc3RhdGUgIlRJIFVDRDkwMTIwLCBVQ0Q5MDEyNCwgVUNEOTA5MCwgVUNEOTA5MTAiCisJZGVmYXVsdCBuCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IGhhcmR3YXJlIG1vbml0b3Jpbmcgc3VwcG9ydCBmb3IgVEkKKwkgIFVDRDkwMTIwLCBVQ0Q5MDEyNCwgVUNEOTA5MCwgVUNEOTA5MTAgU2VxdWVuY2VyIGFuZCBTeXN0ZW0gSGVhbHRoCisJICBDb250cm9sbGVycy4KKworCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwKKwkgIGJlIGNhbGxlZCB1Y2Q5MDAwLgorCitjb25maWcgU0VOU09SU19VQ0Q5MjAwCisJdHJpc3RhdGUgIlRJIFVDRDkyMjAsIFVDRDkyMjIsIFVDRDkyMjQsIFVDRDkyNDAsIFVDRDkyNDQsIFVDRDkyNDYsIFVDRDkyNDgiCisJZGVmYXVsdCBuCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IGhhcmR3YXJlIG1vbml0b3Jpbmcgc3VwcG9ydCBmb3IgVEkKKwkgIFVDRDkyMjAsIFVDRDkyMjIsIFVDRDkyMjQsIFVDRDkyNDAsIFVDRDkyNDQsIFVDRDkyNDYsIGFuZCBVQ0Q5MjQ4CisJICBEaWdpdGFsIFBXTSBTeXN0ZW0gQ29udHJvbGxlcnMuCisKKwkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiBJZiBzbywgdGhlIG1vZHVsZSB3aWxsCisJICBiZSBjYWxsZWQgdWNkOTIwMC4KKworZW5kaWYgIyBQTUJVUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9wbWJ1cy9NYWtlZmlsZSBiL2RyaXZlcnMvaHdtb24vcG1idXMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIzZWVkYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvaHdtb24vcG1idXMvTWFrZWZpbGUKQEAgLTAsMCArMSwxMyBAQAorIworIyBNYWtlZmlsZSBmb3IgUE1CdXMgY2hpcCBkcml2ZXJzLgorIworCitvYmotJChDT05GSUdfUE1CVVMpCQkrPSBwbWJ1c19jb3JlLm8KK29iai0kKENPTkZJR19TRU5TT1JTX1BNQlVTKQkrPSBwbWJ1cy5vCitvYmotJChDT05GSUdfU0VOU09SU19BRE0xMjc1KQkrPSBhZG0xMjc1Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX0xNMjUwNjYpCSs9IGxtMjUwNjYubworb2JqLSQoQ09ORklHX1NFTlNPUlNfTUFYMTYwNjQpCSs9IG1heDE2MDY0Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX01BWDM0NDQwKQkrPSBtYXgzNDQ0MC5vCitvYmotJChDT05GSUdfU0VOU09SU19NQVg4Njg4KQkrPSBtYXg4Njg4Lm8KK29iai0kKENPTkZJR19TRU5TT1JTX1VDRDkwMDApCSs9IHVjZDkwMDAubworb2JqLSQoQ09ORklHX1NFTlNPUlNfVUNEOTIwMCkJKz0gdWNkOTIwMC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL2FkbTEyNzUuYyBiL2RyaXZlcnMvaHdtb24vcG1idXMvYWRtMTI3NS5jCnNpbWlsYXJpdHkgaW5kZXggNjclCnJlbmFtZSBmcm9tIGRyaXZlcnMvaHdtb24vYWRtMTI3NS5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL3BtYnVzL2FkbTEyNzUuYwppbmRleCA4YmMxYmQ2Li5jOTM2ZTI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL2FkbTEyNzUuYworKysgYi9kcml2ZXJzL2h3bW9uL3BtYnVzL2FkbTEyNzUuYwpAQCAtMjMsMTEgKzIzLDY4IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSAicG1idXMuaCIKIAorI2RlZmluZSBBRE0xMjc1X1BFQUtfSU9VVAkJMHhkMAorI2RlZmluZSBBRE0xMjc1X1BFQUtfVklOCQkweGQxCisjZGVmaW5lIEFETTEyNzVfUEVBS19WT1VUCQkweGQyCiAjZGVmaW5lIEFETTEyNzVfUE1PTl9DT05GSUcJCTB4ZDQKIAogI2RlZmluZSBBRE0xMjc1X1ZJTl9WT1VUX1NFTEVDVAkJKDEgPDwgNikKICNkZWZpbmUgQURNMTI3NV9WUkFOR0UJCQkoMSA8PCA1KQogCitzdGF0aWMgaW50IGFkbTEyNzVfcmVhZF93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHBhZ2UsIGludCByZWcpCit7CisJaW50IHJldDsKKworCWlmIChwYWdlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBQTUJVU19WSVJUX1JFQURfSU9VVF9NQVg6CisJCXJldCA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgMCwgQURNMTI3NV9QRUFLX0lPVVQpOworCQlicmVhazsKKwljYXNlIFBNQlVTX1ZJUlRfUkVBRF9WT1VUX01BWDoKKwkJcmV0ID0gcG1idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCAwLCBBRE0xMjc1X1BFQUtfVk9VVCk7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRUFEX1ZJTl9NQVg6CisJCXJldCA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgMCwgQURNMTI3NV9QRUFLX1ZJTik7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRVNFVF9JT1VUX0hJU1RPUlk6CisJY2FzZSBQTUJVU19WSVJUX1JFU0VUX1ZPVVRfSElTVE9SWToKKwljYXNlIFBNQlVTX1ZJUlRfUkVTRVRfVklOX0hJU1RPUlk6CisJCXJldCA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9EQVRBOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhZG0xMjc1X3dyaXRlX3dvcmRfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcGFnZSwgaW50IHJlZywKKwkJCQkgICB1MTYgd29yZCkKK3sKKwlpbnQgcmV0OworCisJaWYgKHBhZ2UpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChyZWcpIHsKKwljYXNlIFBNQlVTX1ZJUlRfUkVTRVRfSU9VVF9ISVNUT1JZOgorCQlyZXQgPSBwbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCAwLCBBRE0xMjc1X1BFQUtfSU9VVCwgMCk7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRVNFVF9WT1VUX0hJU1RPUlk6CisJCXJldCA9IHBtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIDAsIEFETTEyNzVfUEVBS19WT1VULCAwKTsKKwkJYnJlYWs7CisJY2FzZSBQTUJVU19WSVJUX1JFU0VUX1ZJTl9ISVNUT1JZOgorCQlyZXQgPSBwbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCAwLCBBRE0xMjc1X1BFQUtfVklOLCAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT0RBVEE7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IGFkbTEyNzVfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAkJCSBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CkBAIC01MCwxNCArMTA3LDE3IEBACiAJfQogCiAJaW5mby0+cGFnZXMgPSAxOwotCWluZm8tPmRpcmVjdFtQU0NfVk9MVEFHRV9JTl0gPSB0cnVlOwotCWluZm8tPmRpcmVjdFtQU0NfVk9MVEFHRV9PVVRdID0gdHJ1ZTsKLQlpbmZvLT5kaXJlY3RbUFNDX0NVUlJFTlRfT1VUXSA9IHRydWU7CisJaW5mby0+Zm9ybWF0W1BTQ19WT0xUQUdFX0lOXSA9IGRpcmVjdDsKKwlpbmZvLT5mb3JtYXRbUFNDX1ZPTFRBR0VfT1VUXSA9IGRpcmVjdDsKKwlpbmZvLT5mb3JtYXRbUFNDX0NVUlJFTlRfT1VUXSA9IGRpcmVjdDsKIAlpbmZvLT5tW1BTQ19DVVJSRU5UX09VVF0gPSA4MDc7CiAJaW5mby0+YltQU0NfQ1VSUkVOVF9PVVRdID0gMjA0NzU7CiAJaW5mby0+UltQU0NfQ1VSUkVOVF9PVVRdID0gLTE7CiAJaW5mby0+ZnVuY1swXSA9IFBNQlVTX0hBVkVfSU9VVCB8IFBNQlVTX0hBVkVfU1RBVFVTX0lPVVQ7CiAKKwlpbmZvLT5yZWFkX3dvcmRfZGF0YSA9IGFkbTEyNzVfcmVhZF93b3JkX2RhdGE7CisJaW5mby0+d3JpdGVfd29yZF9kYXRhID0gYWRtMTI3NV93cml0ZV93b3JkX2RhdGE7CisKIAlpZiAoY29uZmlnICYgQURNMTI3NV9WUkFOR0UpIHsKIAkJaW5mby0+bVtQU0NfVk9MVEFHRV9JTl0gPSAxOTE5OTsKIAkJaW5mby0+YltQU0NfVk9MVEFHRV9JTl0gPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9wbWJ1cy9sbTI1MDY2LmMgYi9kcml2ZXJzL2h3bW9uL3BtYnVzL2xtMjUwNjYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGJjMTE0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9od21vbi9wbWJ1cy9sbTI1MDY2LmMKQEAgLTAsMCArMSwzNDAgQEAKKy8qCisgKiBIYXJkd2FyZSBtb25pdG9yaW5nIGRyaXZlciBmb3IgTE0yNTA2NiAvIExNNTA2NCAvIExNNTA2NgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBFcmljc3NvbiBBQi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgInBtYnVzLmgiCisKK2VudW0gY2hpcHMgeyBsbTI1MDY2LCBsbTUwNjQsIGxtNTA2NiB9OworCisjZGVmaW5lIExNMjUwNjZfUkVBRF9WQVVYCQkweGQwCisjZGVmaW5lIExNMjUwNjZfTUZSX1JFQURfSUlOCQkweGQxCisjZGVmaW5lIExNMjUwNjZfTUZSX1JFQURfUElOCQkweGQyCisjZGVmaW5lIExNMjUwNjZfTUZSX0lJTl9PQ19XQVJOX0xJTUlUCTB4ZDMKKyNkZWZpbmUgTE0yNTA2Nl9NRlJfUElOX09QX1dBUk5fTElNSVQJMHhkNAorI2RlZmluZSBMTTI1MDY2X1JFQURfUElOX1BFQUsJCTB4ZDUKKyNkZWZpbmUgTE0yNTA2Nl9DTEVBUl9QSU5fUEVBSwkJMHhkNgorI2RlZmluZSBMTTI1MDY2X0RFVklDRV9TRVRVUAkJMHhkOQorI2RlZmluZSBMTTI1MDY2X1JFQURfQVZHX1ZJTgkJMHhkYworI2RlZmluZSBMTTI1MDY2X1JFQURfQVZHX1ZPVVQJCTB4ZGQKKyNkZWZpbmUgTE0yNTA2Nl9SRUFEX0FWR19JSU4JCTB4ZGUKKyNkZWZpbmUgTE0yNTA2Nl9SRUFEX0FWR19QSU4JCTB4ZGYKKworI2RlZmluZSBMTTI1MDY2X0RFVl9TRVRVUF9DTAkJKDEgPDwgNCkJLyogQ3VycmVudCBsaW1pdCAqLworCitzdHJ1Y3QgbG0yNTA2Nl9kYXRhIHsKKwlpbnQgaWQ7CisJc3RydWN0IHBtYnVzX2RyaXZlcl9pbmZvIGluZm87Cit9OworCisjZGVmaW5lIHRvX2xtMjUwNjZfZGF0YSh4KSAgY29udGFpbmVyX29mKHgsIHN0cnVjdCBsbTI1MDY2X2RhdGEsIGluZm8pCisKK3N0YXRpYyBpbnQgbG0yNTA2Nl9yZWFkX3dvcmRfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcGFnZSwgaW50IHJlZykKK3sKKwljb25zdCBzdHJ1Y3QgcG1idXNfZHJpdmVyX2luZm8gKmluZm8gPSBwbWJ1c19nZXRfZHJpdmVyX2luZm8oY2xpZW50KTsKKwljb25zdCBzdHJ1Y3QgbG0yNTA2Nl9kYXRhICpkYXRhID0gdG9fbG0yNTA2Nl9kYXRhKGluZm8pOworCWludCByZXQ7CisKKwlpZiAocGFnZSA+IDEpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogTWFwIFJFQURfVkFVWCBpbnRvIFJFQURfVk9VVCByZWdpc3RlciBvbiBwYWdlIDEgKi8KKwlpZiAocGFnZSA9PSAxKSB7CisJCXN3aXRjaCAocmVnKSB7CisJCWNhc2UgUE1CVVNfUkVBRF9WT1VUOgorCQkJcmV0ID0gcG1idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCAwLAorCQkJCQkJICAgTE0yNTA2Nl9SRUFEX1ZBVVgpOworCQkJaWYgKHJldCA8IDApCisJCQkJYnJlYWs7CisJCQkvKiBBZGp1c3QgcmV0dXJuZWQgdmFsdWUgdG8gbWF0Y2ggVk9VVCBjb2VmZmljaWVudHMgKi8KKwkJCXN3aXRjaCAoZGF0YS0+aWQpIHsKKwkJCWNhc2UgbG0yNTA2NjoKKwkJCQkvKiBWT1VUOiA0LjU0IG1WIFZBVVg6IDI4My4yIHVWIExTQiAqLworCQkJCXJldCA9IERJVl9ST1VORF9DTE9TRVNUKHJldCAqIDI4MzIsIDQ1NDAwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgbG01MDY0OgorCQkJCS8qIFZPVVQ6IDQuNTMgbVYgVkFVWDogNzAwIHVWIExTQiAqLworCQkJCXJldCA9IERJVl9ST1VORF9DTE9TRVNUKHJldCAqIDcwLCA0NTMpOworCQkJCWJyZWFrOworCQkJY2FzZSBsbTUwNjY6CisJCQkJLyogVk9VVDogMi4xOCBtViBWQVVYOiA3MjUgdVYgTFNCICovCisJCQkJcmV0ID0gRElWX1JPVU5EX0NMT1NFU1QocmV0ICogNzI1LCAyMTgwKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogTm8gb3RoZXIgdmFsaWQgcmVnaXN0ZXJzIG9uIHBhZ2UgMSAqLworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWdvdG8gZG9uZTsKKwl9CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgUE1CVVNfUkVBRF9JSU46CisJCXJldCA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgMCwgTE0yNTA2Nl9NRlJfUkVBRF9JSU4pOworCQlicmVhazsKKwljYXNlIFBNQlVTX1JFQURfUElOOgorCQlyZXQgPSBwbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIDAsIExNMjUwNjZfTUZSX1JFQURfUElOKTsKKwkJYnJlYWs7CisJY2FzZSBQTUJVU19JSU5fT0NfV0FSTl9MSU1JVDoKKwkJcmV0ID0gcG1idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCAwLAorCQkJCQkgICBMTTI1MDY2X01GUl9JSU5fT0NfV0FSTl9MSU1JVCk7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfUElOX09QX1dBUk5fTElNSVQ6CisJCXJldCA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgMCwKKwkJCQkJICAgTE0yNTA2Nl9NRlJfUElOX09QX1dBUk5fTElNSVQpOworCQlicmVhazsKKwljYXNlIFBNQlVTX1ZJUlRfUkVBRF9WSU5fQVZHOgorCQlyZXQgPSBwbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIDAsIExNMjUwNjZfUkVBRF9BVkdfVklOKTsKKwkJYnJlYWs7CisJY2FzZSBQTUJVU19WSVJUX1JFQURfVk9VVF9BVkc6CisJCXJldCA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgMCwgTE0yNTA2Nl9SRUFEX0FWR19WT1VUKTsKKwkJYnJlYWs7CisJY2FzZSBQTUJVU19WSVJUX1JFQURfSUlOX0FWRzoKKwkJcmV0ID0gcG1idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCAwLCBMTTI1MDY2X1JFQURfQVZHX0lJTik7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRUFEX1BJTl9BVkc6CisJCXJldCA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgMCwgTE0yNTA2Nl9SRUFEX0FWR19QSU4pOworCQlicmVhazsKKwljYXNlIFBNQlVTX1ZJUlRfUkVBRF9QSU5fTUFYOgorCQlyZXQgPSBwbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIDAsIExNMjUwNjZfUkVBRF9QSU5fUEVBSyk7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRVNFVF9QSU5fSElTVE9SWToKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT0RBVEE7CisJCWJyZWFrOworCX0KK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBsbTI1MDY2X3dyaXRlX3dvcmRfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcGFnZSwgaW50IHJlZywKKwkJCQkgICB1MTYgd29yZCkKK3sKKwlpbnQgcmV0OworCisJaWYgKHBhZ2UgPiAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBQTUJVU19JSU5fT0NfV0FSTl9MSU1JVDoKKwkJcmV0ID0gcG1idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgMCwKKwkJCQkJICAgIExNMjUwNjZfTUZSX0lJTl9PQ19XQVJOX0xJTUlULAorCQkJCQkgICAgd29yZCk7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfUElOX09QX1dBUk5fTElNSVQ6CisJCXJldCA9IHBtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIDAsCisJCQkJCSAgICBMTTI1MDY2X01GUl9QSU5fT1BfV0FSTl9MSU1JVCwKKwkJCQkJICAgIHdvcmQpOworCQlicmVhazsKKwljYXNlIFBNQlVTX1ZJUlRfUkVTRVRfUElOX0hJU1RPUlk6CisJCXJldCA9IHBtYnVzX3dyaXRlX2J5dGUoY2xpZW50LCAwLCBMTTI1MDY2X0NMRUFSX1BJTl9QRUFLKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT0RBVEE7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGxtMjUwNjZfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCSAgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCWludCBjb25maWc7CisJaW50IHJldDsKKwlzdHJ1Y3QgbG0yNTA2Nl9kYXRhICpkYXRhOworCXN0cnVjdCBwbWJ1c19kcml2ZXJfaW5mbyAqaW5mbzsKKworCWlmICghaTJjX2NoZWNrX2Z1bmN0aW9uYWxpdHkoY2xpZW50LT5hZGFwdGVyLAorCQkJCSAgICAgSTJDX0ZVTkNfU01CVVNfUkVBRF9CWVRFX0RBVEEpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbG0yNTA2Nl9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNvbmZpZyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIExNMjUwNjZfREVWSUNFX1NFVFVQKTsKKwlpZiAoY29uZmlnIDwgMCkgeworCQlyZXQgPSBjb25maWc7CisJCWdvdG8gZXJyX21lbTsKKwl9CisKKwlkYXRhLT5pZCA9IGlkLT5kcml2ZXJfZGF0YTsKKwlpbmZvID0gJmRhdGEtPmluZm87CisKKwlpbmZvLT5wYWdlcyA9IDI7CisJaW5mby0+Zm9ybWF0W1BTQ19WT0xUQUdFX0lOXSA9IGRpcmVjdDsKKwlpbmZvLT5mb3JtYXRbUFNDX1ZPTFRBR0VfT1VUXSA9IGRpcmVjdDsKKwlpbmZvLT5mb3JtYXRbUFNDX0NVUlJFTlRfSU5dID0gZGlyZWN0OworCWluZm8tPmZvcm1hdFtQU0NfVEVNUEVSQVRVUkVdID0gZGlyZWN0OworCWluZm8tPmZvcm1hdFtQU0NfUE9XRVJdID0gZGlyZWN0OworCisJaW5mby0+bVtQU0NfVEVNUEVSQVRVUkVdID0gMTY7CisJaW5mby0+YltQU0NfVEVNUEVSQVRVUkVdID0gMDsKKwlpbmZvLT5SW1BTQ19URU1QRVJBVFVSRV0gPSAwOworCisJaW5mby0+ZnVuY1swXSA9IFBNQlVTX0hBVkVfVklOIHwgUE1CVVNfSEFWRV9WT1VUCisJICB8IFBNQlVTX0hBVkVfU1RBVFVTX1ZPVVQgfCBQTUJVU19IQVZFX1BJTiB8IFBNQlVTX0hBVkVfSUlOCisJICB8IFBNQlVTX0hBVkVfU1RBVFVTX0lOUFVUIHwgUE1CVVNfSEFWRV9URU1QIHwgUE1CVVNfSEFWRV9TVEFUVVNfVEVNUDsKKwlpbmZvLT5mdW5jWzFdID0gUE1CVVNfSEFWRV9WT1VUOworCisJaW5mby0+cmVhZF93b3JkX2RhdGEgPSBsbTI1MDY2X3JlYWRfd29yZF9kYXRhOworCWluZm8tPndyaXRlX3dvcmRfZGF0YSA9IGxtMjUwNjZfd3JpdGVfd29yZF9kYXRhOworCisJc3dpdGNoIChpZC0+ZHJpdmVyX2RhdGEpIHsKKwljYXNlIGxtMjUwNjY6CisJCWluZm8tPm1bUFNDX1ZPTFRBR0VfSU5dID0gMjIwNzA7CisJCWluZm8tPmJbUFNDX1ZPTFRBR0VfSU5dID0gMDsKKwkJaW5mby0+UltQU0NfVk9MVEFHRV9JTl0gPSAtMjsKKwkJaW5mby0+bVtQU0NfVk9MVEFHRV9PVVRdID0gMjIwNzA7CisJCWluZm8tPmJbUFNDX1ZPTFRBR0VfT1VUXSA9IDA7CisJCWluZm8tPlJbUFNDX1ZPTFRBR0VfT1VUXSA9IC0yOworCisJCWlmIChjb25maWcgJiBMTTI1MDY2X0RFVl9TRVRVUF9DTCkgeworCQkJaW5mby0+bVtQU0NfQ1VSUkVOVF9JTl0gPSA2ODUyOworCQkJaW5mby0+YltQU0NfQ1VSUkVOVF9JTl0gPSAwOworCQkJaW5mby0+UltQU0NfQ1VSUkVOVF9JTl0gPSAtMjsKKwkJCWluZm8tPm1bUFNDX1BPV0VSXSA9IDM2OTsKKwkJCWluZm8tPmJbUFNDX1BPV0VSXSA9IDA7CisJCQlpbmZvLT5SW1BTQ19QT1dFUl0gPSAtMjsKKwkJfSBlbHNlIHsKKwkJCWluZm8tPm1bUFNDX0NVUlJFTlRfSU5dID0gMTM2NjE7CisJCQlpbmZvLT5iW1BTQ19DVVJSRU5UX0lOXSA9IDA7CisJCQlpbmZvLT5SW1BTQ19DVVJSRU5UX0lOXSA9IC0yOworCQkJaW5mby0+bVtQU0NfUE9XRVJdID0gNzM2OworCQkJaW5mby0+YltQU0NfUE9XRVJdID0gMDsKKwkJCWluZm8tPlJbUFNDX1BPV0VSXSA9IC0yOworCQl9CisJCWJyZWFrOworCWNhc2UgbG01MDY0OgorCQlpbmZvLT5tW1BTQ19WT0xUQUdFX0lOXSA9IDIyMDc1OworCQlpbmZvLT5iW1BTQ19WT0xUQUdFX0lOXSA9IDA7CisJCWluZm8tPlJbUFNDX1ZPTFRBR0VfSU5dID0gLTI7CisJCWluZm8tPm1bUFNDX1ZPTFRBR0VfT1VUXSA9IDIyMDc1OworCQlpbmZvLT5iW1BTQ19WT0xUQUdFX09VVF0gPSAwOworCQlpbmZvLT5SW1BTQ19WT0xUQUdFX09VVF0gPSAtMjsKKworCQlpZiAoY29uZmlnICYgTE0yNTA2Nl9ERVZfU0VUVVBfQ0wpIHsKKwkJCWluZm8tPm1bUFNDX0NVUlJFTlRfSU5dID0gNjcxMzsKKwkJCWluZm8tPmJbUFNDX0NVUlJFTlRfSU5dID0gMDsKKwkJCWluZm8tPlJbUFNDX0NVUlJFTlRfSU5dID0gLTI7CisJCQlpbmZvLT5tW1BTQ19QT1dFUl0gPSAzNjE5OworCQkJaW5mby0+YltQU0NfUE9XRVJdID0gMDsKKwkJCWluZm8tPlJbUFNDX1BPV0VSXSA9IC0zOworCQl9IGVsc2UgeworCQkJaW5mby0+bVtQU0NfQ1VSUkVOVF9JTl0gPSAxMzQyNjsKKwkJCWluZm8tPmJbUFNDX0NVUlJFTlRfSU5dID0gMDsKKwkJCWluZm8tPlJbUFNDX0NVUlJFTlRfSU5dID0gLTI7CisJCQlpbmZvLT5tW1BTQ19QT1dFUl0gPSA3MjM4OworCQkJaW5mby0+YltQU0NfUE9XRVJdID0gMDsKKwkJCWluZm8tPlJbUFNDX1BPV0VSXSA9IC0zOworCQl9CisJCWJyZWFrOworCWNhc2UgbG01MDY2OgorCQlpbmZvLT5tW1BTQ19WT0xUQUdFX0lOXSA9IDQ1ODc7CisJCWluZm8tPmJbUFNDX1ZPTFRBR0VfSU5dID0gMDsKKwkJaW5mby0+UltQU0NfVk9MVEFHRV9JTl0gPSAtMjsKKwkJaW5mby0+bVtQU0NfVk9MVEFHRV9PVVRdID0gNDU4NzsKKwkJaW5mby0+YltQU0NfVk9MVEFHRV9PVVRdID0gMDsKKwkJaW5mby0+UltQU0NfVk9MVEFHRV9PVVRdID0gLTI7CisKKwkJaWYgKGNvbmZpZyAmIExNMjUwNjZfREVWX1NFVFVQX0NMKSB7CisJCQlpbmZvLT5tW1BTQ19DVVJSRU5UX0lOXSA9IDEwNzUzOworCQkJaW5mby0+YltQU0NfQ1VSUkVOVF9JTl0gPSAwOworCQkJaW5mby0+UltQU0NfQ1VSUkVOVF9JTl0gPSAtMjsKKwkJCWluZm8tPm1bUFNDX1BPV0VSXSA9IDEyMDQ7CisJCQlpbmZvLT5iW1BTQ19QT1dFUl0gPSAwOworCQkJaW5mby0+UltQU0NfUE9XRVJdID0gLTM7CisJCX0gZWxzZSB7CisJCQlpbmZvLT5tW1BTQ19DVVJSRU5UX0lOXSA9IDU0MDU7CisJCQlpbmZvLT5iW1BTQ19DVVJSRU5UX0lOXSA9IDA7CisJCQlpbmZvLT5SW1BTQ19DVVJSRU5UX0lOXSA9IC0yOworCQkJaW5mby0+bVtQU0NfUE9XRVJdID0gNjA1OworCQkJaW5mby0+YltQU0NfUE9XRVJdID0gMDsKKwkJCWluZm8tPlJbUFNDX1BPV0VSXSA9IC0zOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX21lbTsKKwl9CisKKwlyZXQgPSBwbWJ1c19kb19wcm9iZShjbGllbnQsIGlkLCBpbmZvKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9tZW07CisJcmV0dXJuIDA7CisKK2Vycl9tZW06CisJa2ZyZWUoZGF0YSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBsbTI1MDY2X3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCWNvbnN0IHN0cnVjdCBwbWJ1c19kcml2ZXJfaW5mbyAqaW5mbyA9IHBtYnVzX2dldF9kcml2ZXJfaW5mbyhjbGllbnQpOworCWNvbnN0IHN0cnVjdCBsbTI1MDY2X2RhdGEgKmRhdGEgPSB0b19sbTI1MDY2X2RhdGEoaW5mbyk7CisJaW50IHJldDsKKworCXJldCA9IHBtYnVzX2RvX3JlbW92ZShjbGllbnQpOworCWtmcmVlKGRhdGEpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBsbTI1MDY2X2lkW10gPSB7CisJeyJsbTI1MDY2IiwgbG0yNTA2Nn0sCisJeyJsbTUwNjQiLCBsbTUwNjR9LAorCXsibG01MDY2IiwgbG01MDY2fSwKKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBsbTI1MDY2X2lkKTsKKworLyogVGhpcyBpcyB0aGUgZHJpdmVyIHRoYXQgd2lsbCBiZSBpbnNlcnRlZCAqLworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIGxtMjUwNjZfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gImxtMjUwNjYiLAorCQkgICB9LAorCS5wcm9iZSA9IGxtMjUwNjZfcHJvYmUsCisJLnJlbW92ZSA9IGxtMjUwNjZfcmVtb3ZlLAorCS5pZF90YWJsZSA9IGxtMjUwNjZfaWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBsbTI1MDY2X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmxtMjUwNjZfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGxtMjUwNjZfZXhpdCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZsbTI1MDY2X2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIkd1ZW50ZXIgUm9lY2siKTsKK01PRFVMRV9ERVNDUklQVElPTigiUE1CdXMgZHJpdmVyIGZvciBMTTI1MDY2L0xNNTA2NC9MTTUwNjYiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9pbml0KGxtMjUwNjZfaW5pdCk7Cittb2R1bGVfZXhpdChsbTI1MDY2X2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9tYXgxNjA2NC5jIGIvZHJpdmVycy9od21vbi9wbWJ1cy9tYXgxNjA2NC5jCnNpbWlsYXJpdHkgaW5kZXggNjYlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaHdtb24vbWF4MTYwNjQuYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi9wbWJ1cy9tYXgxNjA2NC5jCmluZGV4IDFkNmQ3MTcuLmU1MGIyOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vbWF4MTYwNjQuYworKysgYi9kcml2ZXJzL2h3bW9uL3BtYnVzL21heDE2MDY0LmMKQEAgLTI1LDExICsyNSw2MCBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgInBtYnVzLmgiCiAKKyNkZWZpbmUgTUFYMTYwNjRfTUZSX1ZPVVRfUEVBSwkJMHhkNAorI2RlZmluZSBNQVgxNjA2NF9NRlJfVEVNUEVSQVRVUkVfUEVBSwkweGQ2CisKK3N0YXRpYyBpbnQgbWF4MTYwNjRfcmVhZF93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHBhZ2UsIGludCByZWcpCit7CisJaW50IHJldDsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBQTUJVU19WSVJUX1JFQURfVk9VVF9NQVg6CisJCXJldCA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgcGFnZSwKKwkJCQkJICAgTUFYMTYwNjRfTUZSX1ZPVVRfUEVBSyk7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRUFEX1RFTVBfTUFYOgorCQlyZXQgPSBwbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHBhZ2UsCisJCQkJCSAgIE1BWDE2MDY0X01GUl9URU1QRVJBVFVSRV9QRUFLKTsKKwkJYnJlYWs7CisJY2FzZSBQTUJVU19WSVJUX1JFU0VUX1ZPVVRfSElTVE9SWToKKwljYXNlIFBNQlVTX1ZJUlRfUkVTRVRfVEVNUF9ISVNUT1JZOgorCQlyZXQgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PREFUQTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWF4MTYwNjRfd3JpdGVfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlLAorCQkJCSAgICBpbnQgcmVnLCB1MTYgd29yZCkKK3sKKwlpbnQgcmV0OworCisJc3dpdGNoIChyZWcpIHsKKwljYXNlIFBNQlVTX1ZJUlRfUkVTRVRfVk9VVF9ISVNUT1JZOgorCQlyZXQgPSBwbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCBwYWdlLAorCQkJCQkgICAgTUFYMTYwNjRfTUZSX1ZPVVRfUEVBSywgMCk7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRVNFVF9URU1QX0hJU1RPUlk6CisJCXJldCA9IHBtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHBhZ2UsCisJCQkJCSAgICBNQVgxNjA2NF9NRlJfVEVNUEVSQVRVUkVfUEVBSywKKwkJCQkJICAgIDB4ZmZmZik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9EQVRBOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIHN0cnVjdCBwbWJ1c19kcml2ZXJfaW5mbyBtYXgxNjA2NF9pbmZvID0gewogCS5wYWdlcyA9IDQsCi0JLmRpcmVjdFtQU0NfVk9MVEFHRV9JTl0gPSB0cnVlLAotCS5kaXJlY3RbUFNDX1ZPTFRBR0VfT1VUXSA9IHRydWUsCi0JLmRpcmVjdFtQU0NfVEVNUEVSQVRVUkVdID0gdHJ1ZSwKKwkuZm9ybWF0W1BTQ19WT0xUQUdFX0lOXSA9IGRpcmVjdCwKKwkuZm9ybWF0W1BTQ19WT0xUQUdFX09VVF0gPSBkaXJlY3QsCisJLmZvcm1hdFtQU0NfVEVNUEVSQVRVUkVdID0gZGlyZWN0LAogCS5tW1BTQ19WT0xUQUdFX0lOXSA9IDE5OTk1LAogCS5iW1BTQ19WT0xUQUdFX0lOXSA9IDAsCiAJLlJbUFNDX1ZPTFRBR0VfSU5dID0gLTEsCkBAIC00NCw2ICs5Myw4IEBACiAJLmZ1bmNbMV0gPSBQTUJVU19IQVZFX1ZPVVQgfCBQTUJVU19IQVZFX1NUQVRVU19WT1VULAogCS5mdW5jWzJdID0gUE1CVVNfSEFWRV9WT1VUIHwgUE1CVVNfSEFWRV9TVEFUVVNfVk9VVCwKIAkuZnVuY1szXSA9IFBNQlVTX0hBVkVfVk9VVCB8IFBNQlVTX0hBVkVfU1RBVFVTX1ZPVVQsCisJLnJlYWRfd29yZF9kYXRhID0gbWF4MTYwNjRfcmVhZF93b3JkX2RhdGEsCisJLndyaXRlX3dvcmRfZGF0YSA9IG1heDE2MDY0X3dyaXRlX3dvcmRfZGF0YSwKIH07CiAKIHN0YXRpYyBpbnQgbWF4MTYwNjRfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vbWF4MzQ0NDAuYyBiL2RyaXZlcnMvaHdtb24vcG1idXMvbWF4MzQ0NDAuYwpzaW1pbGFyaXR5IGluZGV4IDc2JQpyZW5hbWUgZnJvbSBkcml2ZXJzL2h3bW9uL21heDM0NDQwLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vcG1idXMvbWF4MzQ0NDAuYwppbmRleCBkYjExZTFhLi5mZGE2MjFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL21heDM0NDQwLmMKKysrIGIvZHJpdmVycy9od21vbi9wbWJ1cy9tYXgzNDQ0MC5jCkBAIC0yNywxMSArMjcsNzAgQEAKIAogZW51bSBjaGlwcyB7IG1heDM0NDQwLCBtYXgzNDQ0MSB9OwogCisjZGVmaW5lIE1BWDM0NDQwX01GUl9WT1VUX1BFQUsJCTB4ZDQKKyNkZWZpbmUgTUFYMzQ0NDBfTUZSX0lPVVRfUEVBSwkJMHhkNQorI2RlZmluZSBNQVgzNDQ0MF9NRlJfVEVNUEVSQVRVUkVfUEVBSwkweGQ2CisKICNkZWZpbmUgTUFYMzQ0NDBfU1RBVFVTX09DX1dBUk4JCSgxIDw8IDApCiAjZGVmaW5lIE1BWDM0NDQwX1NUQVRVU19PQ19GQVVMVAkoMSA8PCAxKQogI2RlZmluZSBNQVgzNDQ0MF9TVEFUVVNfT1RfRkFVTFQJKDEgPDwgNSkKICNkZWZpbmUgTUFYMzQ0NDBfU1RBVFVTX09UX1dBUk4JCSgxIDw8IDYpCiAKK3N0YXRpYyBpbnQgbWF4MzQ0NDBfcmVhZF93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHBhZ2UsIGludCByZWcpCit7CisJaW50IHJldDsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBQTUJVU19WSVJUX1JFQURfVk9VVF9NQVg6CisJCXJldCA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgcGFnZSwKKwkJCQkJICAgTUFYMzQ0NDBfTUZSX1ZPVVRfUEVBSyk7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRUFEX0lPVVRfTUFYOgorCQlyZXQgPSBwbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHBhZ2UsCisJCQkJCSAgIE1BWDM0NDQwX01GUl9JT1VUX1BFQUspOworCQlicmVhazsKKwljYXNlIFBNQlVTX1ZJUlRfUkVBRF9URU1QX01BWDoKKwkJcmV0ID0gcG1idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCBwYWdlLAorCQkJCQkgICBNQVgzNDQ0MF9NRlJfVEVNUEVSQVRVUkVfUEVBSyk7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRVNFVF9WT1VUX0hJU1RPUlk6CisJY2FzZSBQTUJVU19WSVJUX1JFU0VUX0lPVVRfSElTVE9SWToKKwljYXNlIFBNQlVTX1ZJUlRfUkVTRVRfVEVNUF9ISVNUT1JZOgorCQlyZXQgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PREFUQTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWF4MzQ0NDBfd3JpdGVfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlLAorCQkJCSAgICBpbnQgcmVnLCB1MTYgd29yZCkKK3sKKwlpbnQgcmV0OworCisJc3dpdGNoIChyZWcpIHsKKwljYXNlIFBNQlVTX1ZJUlRfUkVTRVRfVk9VVF9ISVNUT1JZOgorCQlyZXQgPSBwbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCBwYWdlLAorCQkJCQkgICAgTUFYMzQ0NDBfTUZSX1ZPVVRfUEVBSywgMCk7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRVNFVF9JT1VUX0hJU1RPUlk6CisJCXJldCA9IHBtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHBhZ2UsCisJCQkJCSAgICBNQVgzNDQ0MF9NRlJfSU9VVF9QRUFLLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBQTUJVU19WSVJUX1JFU0VUX1RFTVBfSElTVE9SWToKKwkJcmV0ID0gcG1idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgcGFnZSwKKwkJCQkJICAgIE1BWDM0NDQwX01GUl9URU1QRVJBVFVSRV9QRUFLLAorCQkJCQkgICAgMHhmZmZmKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVOT0RBVEE7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IG1heDM0NDQwX3JlYWRfYnl0ZV9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlLCBpbnQgcmVnKQogewogCWludCByZXQ7CkBAIC03MiwxMCArMTMxLDEwIEBACiBzdGF0aWMgc3RydWN0IHBtYnVzX2RyaXZlcl9pbmZvIG1heDM0NDQwX2luZm9bXSA9IHsKIAlbbWF4MzQ0NDBdID0gewogCQkucGFnZXMgPSAxNCwKLQkJLmRpcmVjdFtQU0NfVk9MVEFHRV9JTl0gPSB0cnVlLAotCQkuZGlyZWN0W1BTQ19WT0xUQUdFX09VVF0gPSB0cnVlLAotCQkuZGlyZWN0W1BTQ19URU1QRVJBVFVSRV0gPSB0cnVlLAotCQkuZGlyZWN0W1BTQ19DVVJSRU5UX09VVF0gPSB0cnVlLAorCQkuZm9ybWF0W1BTQ19WT0xUQUdFX0lOXSA9IGRpcmVjdCwKKwkJLmZvcm1hdFtQU0NfVk9MVEFHRV9PVVRdID0gZGlyZWN0LAorCQkuZm9ybWF0W1BTQ19URU1QRVJBVFVSRV0gPSBkaXJlY3QsCisJCS5mb3JtYXRbUFNDX0NVUlJFTlRfT1VUXSA9IGRpcmVjdCwKIAkJLm1bUFNDX1ZPTFRBR0VfSU5dID0gMSwKIAkJLmJbUFNDX1ZPTFRBR0VfSU5dID0gMCwKIAkJLlJbUFNDX1ZPTFRBR0VfSU5dID0gMywJICAgIC8qIFIgPSAwIGluIGRhdGFzaGVldCByZWZsZWN0cyBtViAqLwpAQCAtMTA5LDE0ICsxNjgsMTYgQEAKIAkJLmZ1bmNbMTJdID0gUE1CVVNfSEFWRV9URU1QIHwgUE1CVVNfSEFWRV9TVEFUVVNfVEVNUCwKIAkJLmZ1bmNbMTNdID0gUE1CVVNfSEFWRV9URU1QIHwgUE1CVVNfSEFWRV9TVEFUVVNfVEVNUCwKIAkJLnJlYWRfYnl0ZV9kYXRhID0gbWF4MzQ0NDBfcmVhZF9ieXRlX2RhdGEsCisJCS5yZWFkX3dvcmRfZGF0YSA9IG1heDM0NDQwX3JlYWRfd29yZF9kYXRhLAorCQkud3JpdGVfd29yZF9kYXRhID0gbWF4MzQ0NDBfd3JpdGVfd29yZF9kYXRhLAogCX0sCiAJW21heDM0NDQxXSA9IHsKIAkJLnBhZ2VzID0gMTIsCi0JCS5kaXJlY3RbUFNDX1ZPTFRBR0VfSU5dID0gdHJ1ZSwKLQkJLmRpcmVjdFtQU0NfVk9MVEFHRV9PVVRdID0gdHJ1ZSwKLQkJLmRpcmVjdFtQU0NfVEVNUEVSQVRVUkVdID0gdHJ1ZSwKLQkJLmRpcmVjdFtQU0NfQ1VSUkVOVF9PVVRdID0gdHJ1ZSwKLQkJLmRpcmVjdFtQU0NfRkFOXSA9IHRydWUsCisJCS5mb3JtYXRbUFNDX1ZPTFRBR0VfSU5dID0gZGlyZWN0LAorCQkuZm9ybWF0W1BTQ19WT0xUQUdFX09VVF0gPSBkaXJlY3QsCisJCS5mb3JtYXRbUFNDX1RFTVBFUkFUVVJFXSA9IGRpcmVjdCwKKwkJLmZvcm1hdFtQU0NfQ1VSUkVOVF9PVVRdID0gZGlyZWN0LAorCQkuZm9ybWF0W1BTQ19GQU5dID0gZGlyZWN0LAogCQkubVtQU0NfVk9MVEFHRV9JTl0gPSAxLAogCQkuYltQU0NfVk9MVEFHRV9JTl0gPSAwLAogCQkuUltQU0NfVk9MVEFHRV9JTl0gPSAzLApAQCAtMTUwLDYgKzIxMSw4IEBACiAJCS5mdW5jWzEwXSA9IFBNQlVTX0hBVkVfVEVNUCB8IFBNQlVTX0hBVkVfU1RBVFVTX1RFTVAsCiAJCS5mdW5jWzExXSA9IFBNQlVTX0hBVkVfVEVNUCB8IFBNQlVTX0hBVkVfU1RBVFVTX1RFTVAsCiAJCS5yZWFkX2J5dGVfZGF0YSA9IG1heDM0NDQwX3JlYWRfYnl0ZV9kYXRhLAorCQkucmVhZF93b3JkX2RhdGEgPSBtYXgzNDQ0MF9yZWFkX3dvcmRfZGF0YSwKKwkJLndyaXRlX3dvcmRfZGF0YSA9IG1heDM0NDQwX3dyaXRlX3dvcmRfZGF0YSwKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9tYXg4Njg4LmMgYi9kcml2ZXJzL2h3bW9uL3BtYnVzL21heDg2ODguYwpzaW1pbGFyaXR5IGluZGV4IDcyJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2h3bW9uL21heDg2ODguYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi9wbWJ1cy9tYXg4Njg4LmMKaW5kZXggN2ZiOTNmNC4uYzNlNzJmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9tYXg4Njg4LmMKKysrIGIvZHJpdmVycy9od21vbi9wbWJ1cy9tYXg4Njg4LmMKQEAgLTI1LDYgKzI1LDkgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlICJwbWJ1cy5oIgogCisjZGVmaW5lIE1BWDg2ODhfTUZSX1ZPVVRfUEVBSwkJMHhkNAorI2RlZmluZSBNQVg4Njg4X01GUl9JT1VUX1BFQUsJCTB4ZDUKKyNkZWZpbmUgTUFYODY4OF9NRlJfVEVNUEVSQVRVUkVfUEVBSwkweGQ2CiAjZGVmaW5lIE1BWDg2ODhfTUZHX1NUQVRVUwkJMHhkOAogCiAjZGVmaW5lIE1BWDg2ODhfU1RBVFVTX09DX0ZBVUxUCQkoMSA8PCA0KQpAQCAtMzcsNiArNDAsNjIgQEAKICNkZWZpbmUgTUFYODY4OF9TVEFUVVNfT1RfRkFVTFQJCSgxIDw8IDEzKQogI2RlZmluZSBNQVg4Njg4X1NUQVRVU19PVF9XQVJOSU5HCSgxIDw8IDE0KQogCitzdGF0aWMgaW50IG1heDg2ODhfcmVhZF93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHBhZ2UsIGludCByZWcpCit7CisJaW50IHJldDsKKworCWlmIChwYWdlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBQTUJVU19WSVJUX1JFQURfVk9VVF9NQVg6CisJCXJldCA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgMCwgTUFYODY4OF9NRlJfVk9VVF9QRUFLKTsKKwkJYnJlYWs7CisJY2FzZSBQTUJVU19WSVJUX1JFQURfSU9VVF9NQVg6CisJCXJldCA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgMCwgTUFYODY4OF9NRlJfSU9VVF9QRUFLKTsKKwkJYnJlYWs7CisJY2FzZSBQTUJVU19WSVJUX1JFQURfVEVNUF9NQVg6CisJCXJldCA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgMCwKKwkJCQkJICAgTUFYODY4OF9NRlJfVEVNUEVSQVRVUkVfUEVBSyk7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRVNFVF9WT1VUX0hJU1RPUlk6CisJY2FzZSBQTUJVU19WSVJUX1JFU0VUX0lPVVRfSElTVE9SWToKKwljYXNlIFBNQlVTX1ZJUlRfUkVTRVRfVEVNUF9ISVNUT1JZOgorCQlyZXQgPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRU5PREFUQTsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWF4ODY4OF93cml0ZV93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHBhZ2UsIGludCByZWcsCisJCQkJICAgdTE2IHdvcmQpCit7CisJaW50IHJldDsKKworCXN3aXRjaCAocmVnKSB7CisJY2FzZSBQTUJVU19WSVJUX1JFU0VUX1ZPVVRfSElTVE9SWToKKwkJcmV0ID0gcG1idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgMCwgTUFYODY4OF9NRlJfVk9VVF9QRUFLLAorCQkJCQkgICAgMCk7CisJCWJyZWFrOworCWNhc2UgUE1CVVNfVklSVF9SRVNFVF9JT1VUX0hJU1RPUlk6CisJCXJldCA9IHBtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIDAsIE1BWDg2ODhfTUZSX0lPVVRfUEVBSywKKwkJCQkJICAgIDApOworCQlicmVhazsKKwljYXNlIFBNQlVTX1ZJUlRfUkVTRVRfVEVNUF9ISVNUT1JZOgorCQlyZXQgPSBwbWJ1c193cml0ZV93b3JkX2RhdGEoY2xpZW50LCAwLAorCQkJCQkgICAgTUFYODY4OF9NRlJfVEVNUEVSQVRVUkVfUEVBSywKKwkJCQkJICAgIDB4ZmZmZik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FTk9EQVRBOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBtYXg4Njg4X3JlYWRfYnl0ZV9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlLCBpbnQgcmVnKQogewogCWludCByZXQgPSAwOwpAQCAtOTEsMTAgKzE1MCwxMCBAQAogCiBzdGF0aWMgc3RydWN0IHBtYnVzX2RyaXZlcl9pbmZvIG1heDg2ODhfaW5mbyA9IHsKIAkucGFnZXMgPSAxLAotCS5kaXJlY3RbUFNDX1ZPTFRBR0VfSU5dID0gdHJ1ZSwKLQkuZGlyZWN0W1BTQ19WT0xUQUdFX09VVF0gPSB0cnVlLAotCS5kaXJlY3RbUFNDX1RFTVBFUkFUVVJFXSA9IHRydWUsCi0JLmRpcmVjdFtQU0NfQ1VSUkVOVF9PVVRdID0gdHJ1ZSwKKwkuZm9ybWF0W1BTQ19WT0xUQUdFX0lOXSA9IGRpcmVjdCwKKwkuZm9ybWF0W1BTQ19WT0xUQUdFX09VVF0gPSBkaXJlY3QsCisJLmZvcm1hdFtQU0NfVEVNUEVSQVRVUkVdID0gZGlyZWN0LAorCS5mb3JtYXRbUFNDX0NVUlJFTlRfT1VUXSA9IGRpcmVjdCwKIAkubVtQU0NfVk9MVEFHRV9JTl0gPSAxOTk5NSwKIAkuYltQU0NfVk9MVEFHRV9JTl0gPSAwLAogCS5SW1BTQ19WT0xUQUdFX0lOXSA9IC0xLApAQCAtMTExLDYgKzE3MCw4IEBACiAJCXwgUE1CVVNfSEFWRV9TVEFUVVNfVk9VVCB8IFBNQlVTX0hBVkVfU1RBVFVTX0lPVVQKIAkJfCBQTUJVU19IQVZFX1NUQVRVU19URU1QLAogCS5yZWFkX2J5dGVfZGF0YSA9IG1heDg2ODhfcmVhZF9ieXRlX2RhdGEsCisJLnJlYWRfd29yZF9kYXRhID0gbWF4ODY4OF9yZWFkX3dvcmRfZGF0YSwKKwkud3JpdGVfd29yZF9kYXRhID0gbWF4ODY4OF93cml0ZV93b3JkX2RhdGEsCiB9OwogCiBzdGF0aWMgaW50IG1heDg2ODhfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vcG1idXMuYyBiL2RyaXZlcnMvaHdtb24vcG1idXMvcG1idXMuYwpzaW1pbGFyaXR5IGluZGV4IDg5JQpyZW5hbWUgZnJvbSBkcml2ZXJzL2h3bW9uL3BtYnVzLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vcG1idXMvcG1idXMuYwppbmRleCA5YjFmMGMzLi43M2RlOWYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3BtYnVzLmMKKysrIGIvZHJpdmVycy9od21vbi9wbWJ1cy9wbWJ1cy5jCkBAIC05Niw2ICs5Niw4IEBACiBzdGF0aWMgaW50IHBtYnVzX2lkZW50aWZ5KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCiAJCQkgIHN0cnVjdCBwbWJ1c19kcml2ZXJfaW5mbyAqaW5mbykKIHsKKwlpbnQgcmV0ID0gMDsKKwogCWlmICghaW5mby0+cGFnZXMpIHsKIAkJLyoKIAkJICogQ2hlY2sgaWYgdGhlIFBBR0UgY29tbWFuZCBpcyBzdXBwb3J0ZWQuIElmIGl0IGlzLApAQCAtMTE3LDYgKzExOSwyNyBAQAogCQl9CiAJfQogCisJaWYgKHBtYnVzX2NoZWNrX2J5dGVfcmVnaXN0ZXIoY2xpZW50LCAwLCBQTUJVU19WT1VUX01PREUpKSB7CisJCWludCB2b3V0X21vZGU7CisKKwkJdm91dF9tb2RlID0gcG1idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCAwLCBQTUJVU19WT1VUX01PREUpOworCQlpZiAodm91dF9tb2RlID49IDAgJiYgdm91dF9tb2RlICE9IDB4ZmYpIHsKKwkJCXN3aXRjaCAodm91dF9tb2RlID4+IDUpIHsKKwkJCWNhc2UgMDoKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQlpbmZvLT5mb3JtYXRbUFNDX1ZPTFRBR0VfT1VUXSA9IHZpZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQlpbmZvLT5mb3JtYXRbUFNDX1ZPTFRBR0VfT1VUXSA9IGRpcmVjdDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0ID0gLUVOT0RFVjsKKwkJCQlnb3RvIGFib3J0OworCQkJfQorCQl9CisJfQorCiAJLyoKIAkgKiBXZSBzaG91bGQgY2hlY2sgaWYgdGhlIENPRUZGSUNJRU5UUyByZWdpc3RlciBpcyBzdXBwb3J0ZWQuCiAJICogSWYgaXQgaXMsIGFuZCB0aGUgY2hpcCBpcyBjb25maWd1cmVkIGZvciBkaXJlY3QgbW9kZSwgd2UgY2FuIHJlYWQKQEAgLTEyNSwxMyArMTQ4LDE4IEBACiAJICoKIAkgKiBUbyBkbyB0aGlzLCB3ZSB3aWxsIG5lZWQgYWNjZXNzIHRvIGEgY2hpcCB3aGljaCBhY3R1YWxseSBzdXBwb3J0cyB0aGUKIAkgKiBDT0VGRklDSUVOVFMgY29tbWFuZCwgc2luY2UgdGhlIGNvbW1hbmQgaXMgdG9vIGNvbXBsZXggdG8gaW1wbGVtZW50Ci0JICogd2l0aG91dCB0ZXN0aW5nIGl0LgorCSAqIHdpdGhvdXQgdGVzdGluZyBpdC4gVW50aWwgdGhlbiwgYWJvcnQgaWYgYSBjaGlwIGNvbmZpZ3VyZWQgZm9yIGRpcmVjdAorCSAqIG1vZGUgd2FzIGRldGVjdGVkLgogCSAqLworCWlmIChpbmZvLT5mb3JtYXRbUFNDX1ZPTFRBR0VfT1VUXSA9PSBkaXJlY3QpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBhYm9ydDsKKwl9CiAKIAkvKiBUcnkgdG8gZmluZCBzZW5zb3IgZ3JvdXBzICAqLwogCXBtYnVzX2ZpbmRfc2Vuc29yX2dyb3VwcyhjbGllbnQsIGluZm8pOwotCi0JcmV0dXJuIDA7CithYm9ydDoKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IHBtYnVzX3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCkBAIC0xNzIsMTEgKzIwMCwxNCBAQAogICogVXNlIGRyaXZlcl9kYXRhIHRvIHNldCB0aGUgbnVtYmVyIG9mIHBhZ2VzIHN1cHBvcnRlZCBieSB0aGUgY2hpcC4KICAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIHBtYnVzX2lkW10gPSB7CisJeyJhZHA0MDAwIiwgMX0sCiAJeyJibXI0NTAiLCAxfSwKIAl7ImJtcjQ1MSIsIDF9LAogCXsiYm1yNDUzIiwgMX0sCiAJeyJibXI0NTQiLCAxfSwKIAl7Imx0YzI5NzgiLCA4fSwKKwl7Im5jcDQyMDAiLCAxfSwKKwl7Im5jcDQyMDgiLCAxfSwKIAl7InBtYnVzIiwgMH0sCiAJe30KIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3BtYnVzLmggYi9kcml2ZXJzL2h3bW9uL3BtYnVzL3BtYnVzLmgKc2ltaWxhcml0eSBpbmRleCA3OSUKcmVuYW1lIGZyb20gZHJpdmVycy9od21vbi9wbWJ1cy5oCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL3BtYnVzL3BtYnVzLmgKaW5kZXggNTA2NDdhYi4uMDgwOGQ5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9od21vbi9wbWJ1cy5oCisrKyBiL2RyaXZlcnMvaHdtb24vcG1idXMvcG1idXMuaApAQCAtMTI2LDYgKzEyNiw0MiBAQAogI2RlZmluZSBQTUJVU19NRlJfU0VSSUFMCQkweDlFCiAKIC8qCisgKiBWaXJ0dWFsIHJlZ2lzdGVycy4KKyAqIFVzZWZ1bCB0byBzdXBwb3J0IGF0dHJpYnV0ZXMgd2hpY2ggYXJlIG5vdCBzdXBwb3J0ZWQgYnkgc3RhbmRhcmQgUE1CdXMKKyAqIHJlZ2lzdGVycyBidXQgZXhpc3QgYXMgbWFudWZhY3R1cmVyIHNwZWNpZmljIHJlZ2lzdGVycyBvbiBpbmRpdmlkdWFsIGNoaXBzLgorICogTXVzdCBiZSBtYXBwZWQgdG8gcmVhbCByZWdpc3RlcnMgaW4gZGV2aWNlIHNwZWNpZmljIGNvZGUuCisgKgorICogU2VtYW50aWNzOgorICogVmlydHVhbCByZWdpc3RlcnMgYXJlIGFsbCB3b3JkIHNpemUuCisgKiBSRUFEIHJlZ2lzdGVycyBhcmUgcmVhZC1vbmx5OyB3cml0ZXMgYXJlIGVpdGhlciBpZ25vcmVkIG9yIHJldHVybiBhbiBlcnJvci4KKyAqIFJFU0VUIHJlZ2lzdGVycyBhcmUgcmVhZC93cml0ZS4gUmVhZGluZyByZXR1cm5zIHplcm8gKHVzZWQgZm9yIGRldGVjdGlvbiksCisgKiB3cml0aW5nIGFueSB2YWx1ZSBjYXVzZXMgdGhlIGFzc29jaWF0ZWQgaGlzdG9yeSB0byBiZSByZXNldC4KKyAqLworI2RlZmluZSBQTUJVU19WSVJUX0JBU0UJCQkweDEwMAorI2RlZmluZSBQTUJVU19WSVJUX1JFQURfVEVNUF9NSU4JKFBNQlVTX1ZJUlRfQkFTRSArIDApCisjZGVmaW5lIFBNQlVTX1ZJUlRfUkVBRF9URU1QX01BWAkoUE1CVVNfVklSVF9CQVNFICsgMSkKKyNkZWZpbmUgUE1CVVNfVklSVF9SRVNFVF9URU1QX0hJU1RPUlkJKFBNQlVTX1ZJUlRfQkFTRSArIDIpCisjZGVmaW5lIFBNQlVTX1ZJUlRfUkVBRF9WSU5fQVZHCQkoUE1CVVNfVklSVF9CQVNFICsgMykKKyNkZWZpbmUgUE1CVVNfVklSVF9SRUFEX1ZJTl9NSU4JCShQTUJVU19WSVJUX0JBU0UgKyA0KQorI2RlZmluZSBQTUJVU19WSVJUX1JFQURfVklOX01BWAkJKFBNQlVTX1ZJUlRfQkFTRSArIDUpCisjZGVmaW5lIFBNQlVTX1ZJUlRfUkVTRVRfVklOX0hJU1RPUlkJKFBNQlVTX1ZJUlRfQkFTRSArIDYpCisjZGVmaW5lIFBNQlVTX1ZJUlRfUkVBRF9JSU5fQVZHCQkoUE1CVVNfVklSVF9CQVNFICsgNykKKyNkZWZpbmUgUE1CVVNfVklSVF9SRUFEX0lJTl9NSU4JCShQTUJVU19WSVJUX0JBU0UgKyA4KQorI2RlZmluZSBQTUJVU19WSVJUX1JFQURfSUlOX01BWAkJKFBNQlVTX1ZJUlRfQkFTRSArIDkpCisjZGVmaW5lIFBNQlVTX1ZJUlRfUkVTRVRfSUlOX0hJU1RPUlkJKFBNQlVTX1ZJUlRfQkFTRSArIDEwKQorI2RlZmluZSBQTUJVU19WSVJUX1JFQURfUElOX0FWRwkJKFBNQlVTX1ZJUlRfQkFTRSArIDExKQorI2RlZmluZSBQTUJVU19WSVJUX1JFQURfUElOX01BWAkJKFBNQlVTX1ZJUlRfQkFTRSArIDEyKQorI2RlZmluZSBQTUJVU19WSVJUX1JFU0VUX1BJTl9ISVNUT1JZCShQTUJVU19WSVJUX0JBU0UgKyAxMykKKyNkZWZpbmUgUE1CVVNfVklSVF9SRUFEX1ZPVVRfQVZHCShQTUJVU19WSVJUX0JBU0UgKyAxNCkKKyNkZWZpbmUgUE1CVVNfVklSVF9SRUFEX1ZPVVRfTUlOCShQTUJVU19WSVJUX0JBU0UgKyAxNSkKKyNkZWZpbmUgUE1CVVNfVklSVF9SRUFEX1ZPVVRfTUFYCShQTUJVU19WSVJUX0JBU0UgKyAxNikKKyNkZWZpbmUgUE1CVVNfVklSVF9SRVNFVF9WT1VUX0hJU1RPUlkJKFBNQlVTX1ZJUlRfQkFTRSArIDE3KQorI2RlZmluZSBQTUJVU19WSVJUX1JFQURfSU9VVF9BVkcJKFBNQlVTX1ZJUlRfQkFTRSArIDE4KQorI2RlZmluZSBQTUJVU19WSVJUX1JFQURfSU9VVF9NSU4JKFBNQlVTX1ZJUlRfQkFTRSArIDE5KQorI2RlZmluZSBQTUJVU19WSVJUX1JFQURfSU9VVF9NQVgJKFBNQlVTX1ZJUlRfQkFTRSArIDIwKQorI2RlZmluZSBQTUJVU19WSVJUX1JFU0VUX0lPVVRfSElTVE9SWQkoUE1CVVNfVklSVF9CQVNFICsgMjEpCisKKy8qCiAgKiBDQVBBQklMSVRZCiAgKi8KICNkZWZpbmUgUEJfQ0FQQUJJTElUWV9TTUJBTEVSVAkJKDE8PDQpCkBAIC0yNjYsMTEgKzMwMiwxMSBAQAogI2RlZmluZSBQTUJVU19IQVZFX1NUQVRVU19GQU4xMgkoMSA8PCAxNikKICNkZWZpbmUgUE1CVVNfSEFWRV9TVEFUVVNfRkFOMzQJKDEgPDwgMTcpCiAKK2VudW0gcG1idXNfZGF0YV9mb3JtYXQgeyBsaW5lYXIgPSAwLCBkaXJlY3QsIHZpZCB9OworCiBzdHJ1Y3QgcG1idXNfZHJpdmVyX2luZm8gewogCWludCBwYWdlczsJCS8qIFRvdGFsIG51bWJlciBvZiBwYWdlcyAqLwotCWJvb2wgZGlyZWN0W1BTQ19OVU1fQ0xBU1NFU107Ci0JCQkJLyogdHJ1ZSBpZiBkZXZpY2UgdXNlcyBkaXJlY3QgZGF0YSBmb3JtYXQKLQkJCQkgICBmb3IgdGhlIGdpdmVuIHNlbnNvciBjbGFzcyAqLworCWVudW0gcG1idXNfZGF0YV9mb3JtYXQgZm9ybWF0W1BTQ19OVU1fQ0xBU1NFU107CiAJLyoKIAkgKiBTdXBwb3J0IG9uZSBzZXQgb2YgY29lZmZpY2llbnRzIGZvciBlYWNoIHNlbnNvciB0eXBlCiAJICogVXNlZCBmb3IgY2hpcHMgcHJvdmlkaW5nIGRhdGEgaW4gZGlyZWN0IG1vZGUuCkBAIC0yODYsNiArMzIyLDkgQEAKIAkgKiBuZWNlc3NhcnkuCiAJICovCiAJaW50ICgqcmVhZF9ieXRlX2RhdGEpKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlLCBpbnQgcmVnKTsKKwlpbnQgKCpyZWFkX3dvcmRfZGF0YSkoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHBhZ2UsIGludCByZWcpOworCWludCAoKndyaXRlX3dvcmRfZGF0YSkoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHBhZ2UsIGludCByZWcsCisJCQkgICAgICAgdTE2IHdvcmQpOwogCS8qCiAJICogVGhlIGlkZW50aWZ5IGZ1bmN0aW9uIGRldGVybWluZXMgc3VwcG9ydGVkIFBNQnVzIGZ1bmN0aW9uYWxpdHkuCiAJICogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IG5lY2Vzc2FyeSBpZiBhIGNoaXAgZHJpdmVyIHN1cHBvcnRzIG11bHRpcGxlCkBAIC0yOTksNiArMzM4LDkgQEAKIAogaW50IHBtYnVzX3NldF9wYWdlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHBhZ2UpOwogaW50IHBtYnVzX3JlYWRfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHBhZ2UsIHU4IHJlZyk7CitpbnQgcG1idXNfd3JpdGVfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHBhZ2UsIHU4IHJlZywgdTE2IHdvcmQpOworaW50IHBtYnVzX3JlYWRfYnl0ZV9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlLCB1OCByZWcpOworaW50IHBtYnVzX3dyaXRlX2J5dGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHBhZ2UsIHU4IHZhbHVlKTsKIHZvaWQgcG1idXNfY2xlYXJfZmF1bHRzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpOwogYm9vbCBwbWJ1c19jaGVja19ieXRlX3JlZ2lzdGVyKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlLCBpbnQgcmVnKTsKIGJvb2wgcG1idXNfY2hlY2tfd29yZF9yZWdpc3RlcihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcGFnZSwgaW50IHJlZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3BtYnVzX2NvcmUuYyBiL2RyaXZlcnMvaHdtb24vcG1idXMvcG1idXNfY29yZS5jCnNpbWlsYXJpdHkgaW5kZXggODQlCnJlbmFtZSBmcm9tIGRyaXZlcnMvaHdtb24vcG1idXNfY29yZS5jCnJlbmFtZSB0byBkcml2ZXJzL2h3bW9uL3BtYnVzL3BtYnVzX2NvcmUuYwppbmRleCA4ZTMxYThlLi41YzFiNmNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h3bW9uL3BtYnVzX2NvcmUuYworKysgYi9kcml2ZXJzL2h3bW9uL3BtYnVzL3BtYnVzX2NvcmUuYwpAQCAtMzMsMTQgKzMzLDE4IEBACiAvKgogICogQ29uc3RhbnRzIG5lZWRlZCB0byBkZXRlcm1pbmUgbnVtYmVyIG9mIHNlbnNvcnMsIGJvb2xlYW5zLCBhbmQgbGFiZWxzLgogICovCi0jZGVmaW5lIFBNQlVTX01BWF9JTlBVVF9TRU5TT1JTCQkxMQkvKiA2KnZvbHQsIDMqY3VyciwgMipwb3dlciAqLwotI2RlZmluZSBQTUJVU19WT1VUX1NFTlNPUlNfUEVSX1BBR0UJNQkvKiBpbnB1dCwgbWluLCBtYXgsIGxjcml0LAotCQkJCQkJICAgY3JpdCAqLwotI2RlZmluZSBQTUJVU19JT1VUX1NFTlNPUlNfUEVSX1BBR0UJNAkvKiBpbnB1dCwgbWluLCBtYXgsIGNyaXQgKi8KKyNkZWZpbmUgUE1CVVNfTUFYX0lOUFVUX1NFTlNPUlMJCTIyCS8qIDEwKnZvbHQsIDcqY3VyciwgNSpwb3dlciAqLworI2RlZmluZSBQTUJVU19WT1VUX1NFTlNPUlNfUEVSX1BBR0UJOQkvKiBpbnB1dCwgbWluLCBtYXgsIGxjcml0LAorCQkJCQkJICAgY3JpdCwgbG93ZXN0LCBoaWdoZXN0LCBhdmcsCisJCQkJCQkgICByZXNldCAqLworI2RlZmluZSBQTUJVU19JT1VUX1NFTlNPUlNfUEVSX1BBR0UJOAkvKiBpbnB1dCwgbWluLCBtYXgsIGNyaXQsCisJCQkJCQkgICBsb3dlc3QsIGhpZ2hlc3QsIGF2ZywKKwkJCQkJCSAgIHJlc2V0ICovCiAjZGVmaW5lIFBNQlVTX1BPVVRfU0VOU09SU19QRVJfUEFHRQk0CS8qIGlucHV0LCBjYXAsIG1heCwgY3JpdCAqLwogI2RlZmluZSBQTUJVU19NQVhfU0VOU09SU19QRVJfRkFOCTEJLyogaW5wdXQgKi8KLSNkZWZpbmUgUE1CVVNfTUFYX1NFTlNPUlNfUEVSX1RFTVAJNQkvKiBpbnB1dCwgbWluLCBtYXgsIGxjcml0LAotCQkJCQkJICAgY3JpdCAqLworI2RlZmluZSBQTUJVU19NQVhfU0VOU09SU19QRVJfVEVNUAk4CS8qIGlucHV0LCBtaW4sIG1heCwgbGNyaXQsCisJCQkJCQkgICBjcml0LCBsb3dlc3QsIGhpZ2hlc3QsCisJCQkJCQkgICByZXNldCAqLwogCiAjZGVmaW5lIFBNQlVTX01BWF9JTlBVVF9CT09MRUFOUwk3CS8qIHY6IG1pbl9hbGFybSwgbWF4X2FsYXJtLAogCQkJCQkJICAgbGNyaXRfYWxhcm0sIGNyaXRfYWxhcm07CkBAIC03NCwxMSArNzgsMTMgQEAKICNkZWZpbmUgUEJfU1RBVFVTX0lOUFVUX0JBU0UJKFBCX1NUQVRVU19GQU4zNF9CQVNFICsgUE1CVVNfUEFHRVMpCiAjZGVmaW5lIFBCX1NUQVRVU19URU1QX0JBU0UJKFBCX1NUQVRVU19JTlBVVF9CQVNFICsgMSkKIAorI2RlZmluZSBQTUJVU19OQU1FX1NJWkUJCTI0CisKIHN0cnVjdCBwbWJ1c19zZW5zb3IgewotCWNoYXIgbmFtZVtJMkNfTkFNRV9TSVpFXTsJLyogc3lzZnMgc2Vuc29yIG5hbWUgKi8KKwljaGFyIG5hbWVbUE1CVVNfTkFNRV9TSVpFXTsJLyogc3lzZnMgc2Vuc29yIG5hbWUgKi8KIAlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgYXR0cmlidXRlOwogCXU4IHBhZ2U7CQkvKiBwYWdlIG51bWJlciAqLwotCXU4IHJlZzsJCQkvKiByZWdpc3RlciAqLworCXUxNiByZWc7CQkvKiByZWdpc3RlciAqLwogCWVudW0gcG1idXNfc2Vuc29yX2NsYXNzZXMgY2xhc3M7CS8qIHNlbnNvciBjbGFzcyAqLwogCWJvb2wgdXBkYXRlOwkJLyogcnVudGltZSBzZW5zb3IgdXBkYXRlIG5lZWRlZCAqLwogCWludCBkYXRhOwkJLyogU2Vuc29yIGRhdGEuCkBAIC04NiwxNCArOTIsMTQgQEAKIH07CiAKIHN0cnVjdCBwbWJ1c19ib29sZWFuIHsKLQljaGFyIG5hbWVbSTJDX05BTUVfU0laRV07CS8qIHN5c2ZzIGJvb2xlYW4gbmFtZSAqLworCWNoYXIgbmFtZVtQTUJVU19OQU1FX1NJWkVdOwkvKiBzeXNmcyBib29sZWFuIG5hbWUgKi8KIAlzdHJ1Y3Qgc2Vuc29yX2RldmljZV9hdHRyaWJ1dGUgYXR0cmlidXRlOwogfTsKIAogc3RydWN0IHBtYnVzX2xhYmVsIHsKLQljaGFyIG5hbWVbSTJDX05BTUVfU0laRV07CS8qIHN5c2ZzIGxhYmVsIG5hbWUgKi8KKwljaGFyIG5hbWVbUE1CVVNfTkFNRV9TSVpFXTsJLyogc3lzZnMgbGFiZWwgbmFtZSAqLwogCXN0cnVjdCBzZW5zb3JfZGV2aWNlX2F0dHJpYnV0ZSBhdHRyaWJ1dGU7Ci0JY2hhciBsYWJlbFtJMkNfTkFNRV9TSVpFXTsJLyogbGFiZWwgKi8KKwljaGFyIGxhYmVsW1BNQlVTX05BTUVfU0laRV07CS8qIGxhYmVsICovCiB9OwogCiBzdHJ1Y3QgcG1idXNfZGF0YSB7CkBAIC0xNjIsMTkgKzE2OCwyMSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocG1idXNfc2V0X3BhZ2UpOwogCi1zdGF0aWMgaW50IHBtYnVzX3dyaXRlX2J5dGUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcGFnZSwgdTggdmFsdWUpCitpbnQgcG1idXNfd3JpdGVfYnl0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcGFnZSwgdTggdmFsdWUpCiB7CiAJaW50IHJ2OwogCi0JcnYgPSBwbWJ1c19zZXRfcGFnZShjbGllbnQsIHBhZ2UpOwotCWlmIChydiA8IDApCi0JCXJldHVybiBydjsKKwlpZiAocGFnZSA+PSAwKSB7CisJCXJ2ID0gcG1idXNfc2V0X3BhZ2UoY2xpZW50LCBwYWdlKTsKKwkJaWYgKHJ2IDwgMCkKKwkJCXJldHVybiBydjsKKwl9CiAKIAlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGUoY2xpZW50LCB2YWx1ZSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChwbWJ1c193cml0ZV9ieXRlKTsKIAotc3RhdGljIGludCBwbWJ1c193cml0ZV93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcGFnZSwgdTggcmVnLAotCQkJCSB1MTYgd29yZCkKK2ludCBwbWJ1c193cml0ZV93b3JkX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTggcGFnZSwgdTggcmVnLCB1MTYgd29yZCkKIHsKIAlpbnQgcnY7CiAKQEAgLTE4NCw2ICsxOTIsMjggQEAKIAogCXJldHVybiBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgcmVnLCB3b3JkKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHBtYnVzX3dyaXRlX3dvcmRfZGF0YSk7CisKKy8qCisgKiBfcG1idXNfd3JpdGVfd29yZF9kYXRhKCkgaXMgc2ltaWxhciB0byBwbWJ1c193cml0ZV93b3JkX2RhdGEoKSwgYnV0IGNoZWNrcyBpZgorICogYSBkZXZpY2Ugc3BlY2lmaWMgbWFwcGluZyBmdW5jdGlvbiBleGlzdHMgYW5kIGNhbGxzIGl0IGlmIG5lY2Vzc2FyeS4KKyAqLworc3RhdGljIGludCBfcG1idXNfd3JpdGVfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlLCBpbnQgcmVnLAorCQkJCSAgdTE2IHdvcmQpCit7CisJc3RydWN0IHBtYnVzX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwljb25zdCBzdHJ1Y3QgcG1idXNfZHJpdmVyX2luZm8gKmluZm8gPSBkYXRhLT5pbmZvOworCWludCBzdGF0dXM7CisKKwlpZiAoaW5mby0+d3JpdGVfd29yZF9kYXRhKSB7CisJCXN0YXR1cyA9IGluZm8tPndyaXRlX3dvcmRfZGF0YShjbGllbnQsIHBhZ2UsIHJlZywgd29yZCk7CisJCWlmIChzdGF0dXMgIT0gLUVOT0RBVEEpCisJCQlyZXR1cm4gc3RhdHVzOworCX0KKwlpZiAocmVnID49IFBNQlVTX1ZJUlRfQkFTRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHBtYnVzX3dyaXRlX3dvcmRfZGF0YShjbGllbnQsIHBhZ2UsIHJlZywgd29yZCk7Cit9CiAKIGludCBwbWJ1c19yZWFkX3dvcmRfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBwYWdlLCB1OCByZWcpCiB7CkBAIC0xOTcsMTYgKzIyNyw1NyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocG1idXNfcmVhZF93b3JkX2RhdGEpOwogCi1zdGF0aWMgaW50IHBtYnVzX3JlYWRfYnl0ZV9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHU4IHBhZ2UsIHU4IHJlZykKKy8qCisgKiBfcG1idXNfcmVhZF93b3JkX2RhdGEoKSBpcyBzaW1pbGFyIHRvIHBtYnVzX3JlYWRfd29yZF9kYXRhKCksIGJ1dCBjaGVja3MgaWYKKyAqIGEgZGV2aWNlIHNwZWNpZmljIG1hcHBpbmcgZnVuY3Rpb24gZXhpc3RzIGFuZCBjYWxscyBpdCBpZiBuZWNlc3NhcnkuCisgKi8KK3N0YXRpYyBpbnQgX3BtYnVzX3JlYWRfd29yZF9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlLCBpbnQgcmVnKQoreworCXN0cnVjdCBwbWJ1c19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisJY29uc3Qgc3RydWN0IHBtYnVzX2RyaXZlcl9pbmZvICppbmZvID0gZGF0YS0+aW5mbzsKKwlpbnQgc3RhdHVzOworCisJaWYgKGluZm8tPnJlYWRfd29yZF9kYXRhKSB7CisJCXN0YXR1cyA9IGluZm8tPnJlYWRfd29yZF9kYXRhKGNsaWVudCwgcGFnZSwgcmVnKTsKKwkJaWYgKHN0YXR1cyAhPSAtRU5PREFUQSkKKwkJCXJldHVybiBzdGF0dXM7CisJfQorCWlmIChyZWcgPj0gUE1CVVNfVklSVF9CQVNFKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gcG1idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LCBwYWdlLCByZWcpOworfQorCitpbnQgcG1idXNfcmVhZF9ieXRlX2RhdGEoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IHBhZ2UsIHU4IHJlZykKIHsKIAlpbnQgcnY7CiAKLQlydiA9IHBtYnVzX3NldF9wYWdlKGNsaWVudCwgcGFnZSk7Ci0JaWYgKHJ2IDwgMCkKLQkJcmV0dXJuIHJ2OworCWlmIChwYWdlID49IDApIHsKKwkJcnYgPSBwbWJ1c19zZXRfcGFnZShjbGllbnQsIHBhZ2UpOworCQlpZiAocnYgPCAwKQorCQkJcmV0dXJuIHJ2OworCX0KIAogCXJldHVybiBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCByZWcpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocG1idXNfcmVhZF9ieXRlX2RhdGEpOworCisvKgorICogX3BtYnVzX3JlYWRfYnl0ZV9kYXRhKCkgaXMgc2ltaWxhciB0byBwbWJ1c19yZWFkX2J5dGVfZGF0YSgpLCBidXQgY2hlY2tzIGlmCisgKiBhIGRldmljZSBzcGVjaWZpYyBtYXBwaW5nIGZ1bmN0aW9uIGV4aXN0cyBhbmQgY2FsbHMgaXQgaWYgbmVjZXNzYXJ5LgorICovCitzdGF0aWMgaW50IF9wbWJ1c19yZWFkX2J5dGVfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcGFnZSwgaW50IHJlZykKK3sKKwlzdHJ1Y3QgcG1idXNfZGF0YSAqZGF0YSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCWNvbnN0IHN0cnVjdCBwbWJ1c19kcml2ZXJfaW5mbyAqaW5mbyA9IGRhdGEtPmluZm87CisJaW50IHN0YXR1czsKKworCWlmIChpbmZvLT5yZWFkX2J5dGVfZGF0YSkgeworCQlzdGF0dXMgPSBpbmZvLT5yZWFkX2J5dGVfZGF0YShjbGllbnQsIHBhZ2UsIHJlZyk7CisJCWlmIChzdGF0dXMgIT0gLUVOT0RBVEEpCisJCQlyZXR1cm4gc3RhdHVzOworCX0KKwlyZXR1cm4gcG1idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBwYWdlLCByZWcpOworfQogCiBzdGF0aWMgdm9pZCBwbWJ1c19jbGVhcl9mYXVsdF9wYWdlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlKQogewpAQCAtMjIzLDEzICsyOTQsMTMgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHBtYnVzX2NsZWFyX2ZhdWx0cyk7CiAKLXN0YXRpYyBpbnQgcG1idXNfY2hlY2tfc3RhdHVzX2NtbChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBpbnQgcGFnZSkKK3N0YXRpYyBpbnQgcG1idXNfY2hlY2tfc3RhdHVzX2NtbChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewogCWludCBzdGF0dXMsIHN0YXR1czI7CiAKLQlzdGF0dXMgPSBwbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHBhZ2UsIFBNQlVTX1NUQVRVU19CWVRFKTsKKwlzdGF0dXMgPSBwbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIC0xLCBQTUJVU19TVEFUVVNfQllURSk7CiAJaWYgKHN0YXR1cyA8IDAgfHwgKHN0YXR1cyAmIFBCX1NUQVRVU19DTUwpKSB7Ci0JCXN0YXR1czIgPSBwbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHBhZ2UsIFBNQlVTX1NUQVRVU19DTUwpOworCQlzdGF0dXMyID0gcG1idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCAtMSwgUE1CVVNfU1RBVFVTX0NNTCk7CiAJCWlmIChzdGF0dXMyIDwgMCB8fCAoc3RhdHVzMiAmIFBCX0NNTF9GQVVMVF9JTlZBTElEX0NPTU1BTkQpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMjQxLDEwICszMTIsMTAgQEAKIAlpbnQgcnY7CiAJc3RydWN0IHBtYnVzX2RhdGEgKmRhdGEgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAotCXJ2ID0gcG1idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBwYWdlLCByZWcpOworCXJ2ID0gX3BtYnVzX3JlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcGFnZSwgcmVnKTsKIAlpZiAocnYgPj0gMCAmJiAhKGRhdGEtPmZsYWdzICYgUE1CVVNfU0tJUF9TVEFUVVNfQ0hFQ0spKQotCQlydiA9IHBtYnVzX2NoZWNrX3N0YXR1c19jbWwoY2xpZW50LCBwYWdlKTsKLQlwbWJ1c19jbGVhcl9mYXVsdF9wYWdlKGNsaWVudCwgcGFnZSk7CisJCXJ2ID0gcG1idXNfY2hlY2tfc3RhdHVzX2NtbChjbGllbnQpOworCXBtYnVzX2NsZWFyX2ZhdWx0X3BhZ2UoY2xpZW50LCAtMSk7CiAJcmV0dXJuIHJ2ID49IDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwbWJ1c19jaGVja19ieXRlX3JlZ2lzdGVyKTsKQEAgLTI1NCwxMCArMzI1LDEwIEBACiAJaW50IHJ2OwogCXN0cnVjdCBwbWJ1c19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAKLQlydiA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgcGFnZSwgcmVnKTsKKwlydiA9IF9wbWJ1c19yZWFkX3dvcmRfZGF0YShjbGllbnQsIHBhZ2UsIHJlZyk7CiAJaWYgKHJ2ID49IDAgJiYgIShkYXRhLT5mbGFncyAmIFBNQlVTX1NLSVBfU1RBVFVTX0NIRUNLKSkKLQkJcnYgPSBwbWJ1c19jaGVja19zdGF0dXNfY21sKGNsaWVudCwgcGFnZSk7Ci0JcG1idXNfY2xlYXJfZmF1bHRfcGFnZShjbGllbnQsIHBhZ2UpOworCQlydiA9IHBtYnVzX2NoZWNrX3N0YXR1c19jbWwoY2xpZW50KTsKKwlwbWJ1c19jbGVhcl9mYXVsdF9wYWdlKGNsaWVudCwgLTEpOwogCXJldHVybiBydiA+PSAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocG1idXNfY2hlY2tfd29yZF9yZWdpc3Rlcik7CkBAIC0yNzAsMjQgKzM0MSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwbWJ1c19nZXRfZHJpdmVyX2luZm8pOwogCi0vKgotICogX3BtYnVzX3JlYWRfYnl0ZV9kYXRhKCkgaXMgc2ltaWxhciB0byBwbWJ1c19yZWFkX2J5dGVfZGF0YSgpLCBidXQgY2hlY2tzIGlmCi0gKiBhIGRldmljZSBzcGVjaWZpYyBtYXBwaW5nIGZ1bmNpb24gZXhpc3RzIGFuZCBjYWxscyBpdCBpZiBuZWNlc3NhcnkuCi0gKi8KLXN0YXRpYyBpbnQgX3BtYnVzX3JlYWRfYnl0ZV9kYXRhKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBwYWdlLCBpbnQgcmVnKQotewotCXN0cnVjdCBwbWJ1c19kYXRhICpkYXRhID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0JY29uc3Qgc3RydWN0IHBtYnVzX2RyaXZlcl9pbmZvICppbmZvID0gZGF0YS0+aW5mbzsKLQlpbnQgc3RhdHVzOwotCi0JaWYgKGluZm8tPnJlYWRfYnl0ZV9kYXRhKSB7Ci0JCXN0YXR1cyA9IGluZm8tPnJlYWRfYnl0ZV9kYXRhKGNsaWVudCwgcGFnZSwgcmVnKTsKLQkJaWYgKHN0YXR1cyAhPSAtRU5PREFUQSkKLQkJCXJldHVybiBzdGF0dXM7Ci0JfQotCXJldHVybiBwbWJ1c19yZWFkX2J5dGVfZGF0YShjbGllbnQsIHBhZ2UsIHJlZyk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcG1idXNfZGF0YSAqcG1idXNfdXBkYXRlX2RldmljZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQoZGV2KTsKQEAgLTM0Nyw4ICs0MDAsOSBAQAogCiAJCQlpZiAoIWRhdGEtPnZhbGlkIHx8IHNlbnNvci0+dXBkYXRlKQogCQkJCXNlbnNvci0+ZGF0YQotCQkJCSAgICA9IHBtYnVzX3JlYWRfd29yZF9kYXRhKGNsaWVudCwgc2Vuc29yLT5wYWdlLAotCQkJCQkJCSAgIHNlbnNvci0+cmVnKTsKKwkJCQkgICAgPSBfcG1idXNfcmVhZF93b3JkX2RhdGEoY2xpZW50LAorCQkJCQkJCSAgICBzZW5zb3ItPnBhZ2UsCisJCQkJCQkJICAgIHNlbnNvci0+cmVnKTsKIAkJfQogCQlwbWJ1c19jbGVhcl9mYXVsdHMoY2xpZW50KTsKIAkJZGF0YS0+bGFzdF91cGRhdGVkID0gamlmZmllczsKQEAgLTQ0MywxNSArNDk3LDM3IEBACiAJcmV0dXJuICh2YWwgLSBiKSAvIG07CiB9CiAKKy8qCisgKiBDb252ZXJ0IFZJRCBzZW5zb3IgdmFsdWVzIHRvIG1pbGxpLSBvciBtaWNyby11bml0cworICogZGVwZW5kaW5nIG9uIHNlbnNvciB0eXBlLgorICogV2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCBWUjExLgorICovCitzdGF0aWMgbG9uZyBwbWJ1c19yZWcyZGF0YV92aWQoc3RydWN0IHBtYnVzX2RhdGEgKmRhdGEsCisJCQkgICAgICAgc3RydWN0IHBtYnVzX3NlbnNvciAqc2Vuc29yKQoreworCWxvbmcgdmFsID0gc2Vuc29yLT5kYXRhOworCisJaWYgKHZhbCA8IDB4MDIgfHwgdmFsID4gMHhiMikKKwkJcmV0dXJuIDA7CisJcmV0dXJuIERJVl9ST1VORF9DTE9TRVNUKDE2MDAwMCAtICh2YWwgLSAyKSAqIDYyNSwgMTAwKTsKK30KKwogc3RhdGljIGxvbmcgcG1idXNfcmVnMmRhdGEoc3RydWN0IHBtYnVzX2RhdGEgKmRhdGEsIHN0cnVjdCBwbWJ1c19zZW5zb3IgKnNlbnNvcikKIHsKIAlsb25nIHZhbDsKIAotCWlmIChkYXRhLT5pbmZvLT5kaXJlY3Rbc2Vuc29yLT5jbGFzc10pCisJc3dpdGNoIChkYXRhLT5pbmZvLT5mb3JtYXRbc2Vuc29yLT5jbGFzc10pIHsKKwljYXNlIGRpcmVjdDoKIAkJdmFsID0gcG1idXNfcmVnMmRhdGFfZGlyZWN0KGRhdGEsIHNlbnNvcik7Ci0JZWxzZQorCQlicmVhazsKKwljYXNlIHZpZDoKKwkJdmFsID0gcG1idXNfcmVnMmRhdGFfdmlkKGRhdGEsIHNlbnNvcik7CisJCWJyZWFrOworCWNhc2UgbGluZWFyOgorCWRlZmF1bHQ6CiAJCXZhbCA9IHBtYnVzX3JlZzJkYXRhX2xpbmVhcihkYXRhLCBzZW5zb3IpOwotCisJCWJyZWFrOworCX0KIAlyZXR1cm4gdmFsOwogfQogCkBAIC01NjEsMTYgKzYzNywzMSBAQAogCXJldHVybiB2YWw7CiB9CiAKK3N0YXRpYyB1MTYgcG1idXNfZGF0YTJyZWdfdmlkKHN0cnVjdCBwbWJ1c19kYXRhICpkYXRhLAorCQkJICAgICAgZW51bSBwbWJ1c19zZW5zb3JfY2xhc3NlcyBjbGFzcywgbG9uZyB2YWwpCit7CisJdmFsID0gU0VOU09SU19MSU1JVCh2YWwsIDUwMCwgMTYwMCk7CisKKwlyZXR1cm4gMiArIERJVl9ST1VORF9DTE9TRVNUKCgxNjAwIC0gdmFsKSAqIDEwMCwgNjI1KTsKK30KKwogc3RhdGljIHUxNiBwbWJ1c19kYXRhMnJlZyhzdHJ1Y3QgcG1idXNfZGF0YSAqZGF0YSwKIAkJCSAgZW51bSBwbWJ1c19zZW5zb3JfY2xhc3NlcyBjbGFzcywgbG9uZyB2YWwpCiB7CiAJdTE2IHJlZ3ZhbDsKIAotCWlmIChkYXRhLT5pbmZvLT5kaXJlY3RbY2xhc3NdKQorCXN3aXRjaCAoZGF0YS0+aW5mby0+Zm9ybWF0W2NsYXNzXSkgeworCWNhc2UgZGlyZWN0OgogCQlyZWd2YWwgPSBwbWJ1c19kYXRhMnJlZ19kaXJlY3QoZGF0YSwgY2xhc3MsIHZhbCk7Ci0JZWxzZQorCQlicmVhazsKKwljYXNlIHZpZDoKKwkJcmVndmFsID0gcG1idXNfZGF0YTJyZWdfdmlkKGRhdGEsIGNsYXNzLCB2YWwpOworCQlicmVhazsKKwljYXNlIGxpbmVhcjoKKwlkZWZhdWx0OgogCQlyZWd2YWwgPSBwbWJ1c19kYXRhMnJlZ19saW5lYXIoZGF0YSwgY2xhc3MsIHZhbCk7Ci0KKwkJYnJlYWs7CisJfQogCXJldHVybiByZWd2YWw7CiB9CiAKQEAgLTY4Miw3ICs3NzMsNyBAQAogCiAJbXV0ZXhfbG9jaygmZGF0YS0+dXBkYXRlX2xvY2spOwogCXJlZ3ZhbCA9IHBtYnVzX2RhdGEycmVnKGRhdGEsIHNlbnNvci0+Y2xhc3MsIHZhbCk7Ci0JcmV0ID0gcG1idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgc2Vuc29yLT5wYWdlLCBzZW5zb3ItPnJlZywgcmVndmFsKTsKKwlyZXQgPSBfcG1idXNfd3JpdGVfd29yZF9kYXRhKGNsaWVudCwgc2Vuc29yLT5wYWdlLCBzZW5zb3ItPnJlZywgcmVndmFsKTsKIAlpZiAocmV0IDwgMCkKIAkJcnYgPSByZXQ7CiAJZWxzZQpAQCAtODY3LDcgKzk1OCw4IEBACiAgKiBhbmQgaXRzIGFzc29jaWF0ZWQgYWxhcm0gYXR0cmlidXRlLgogICovCiBzdHJ1Y3QgcG1idXNfbGltaXRfYXR0ciB7Ci0JdTggcmVnOwkJCS8qIExpbWl0IHJlZ2lzdGVyICovCisJdTE2IHJlZzsJCS8qIExpbWl0IHJlZ2lzdGVyICovCisJYm9vbCB1cGRhdGU7CQkvKiBUcnVlIGlmIHJlZ2lzdGVyIG5lZWRzIHVwZGF0ZXMgKi8KIAljb25zdCBjaGFyICphdHRyOwkvKiBBdHRyaWJ1dGUgbmFtZSAqLwogCWNvbnN0IGNoYXIgKmFsYXJtOwkvKiBBbGFybSBhdHRyaWJ1dGUgbmFtZSAqLwogCXUzMiBzYml0OwkJLyogQWxhcm0gYXR0cmlidXRlIHN0YXR1cyBiaXQgKi8KQEAgLTkxMiw5ICsxMDA0LDEwIEBACiAJCWlmIChwbWJ1c19jaGVja193b3JkX3JlZ2lzdGVyKGNsaWVudCwgcGFnZSwgbC0+cmVnKSkgewogCQkJY2luZGV4ID0gZGF0YS0+bnVtX3NlbnNvcnM7CiAJCQlwbWJ1c19hZGRfc2Vuc29yKGRhdGEsIG5hbWUsIGwtPmF0dHIsIGluZGV4LCBwYWdlLAotCQkJCQkgbC0+cmVnLCBhdHRyLT5jbGFzcywgYXR0ci0+dXBkYXRlLAorCQkJCQkgbC0+cmVnLCBhdHRyLT5jbGFzcywKKwkJCQkJIGF0dHItPnVwZGF0ZSB8fCBsLT51cGRhdGUsCiAJCQkJCSBmYWxzZSk7Ci0JCQlpZiAoaW5mby0+ZnVuY1twYWdlXSAmIGF0dHItPnNmdW5jKSB7CisJCQlpZiAobC0+c2JpdCAmJiAoaW5mby0+ZnVuY1twYWdlXSAmIGF0dHItPnNmdW5jKSkgewogCQkJCWlmIChhdHRyLT5jb21wYXJlKSB7CiAJCQkJCXBtYnVzX2FkZF9ib29sZWFuX2NtcChkYXRhLCBuYW1lLAogCQkJCQkJbC0+YWxhcm0sIGluZGV4LApAQCAtOTUzLDkgKzEwNDYsMTEgQEAKIAkJCQkJCSAgIGluZGV4LCBwYWdlLCBjYmFzZSwgYXR0cik7CiAJCS8qCiAJCSAqIEFkZCBnZW5lcmljIGFsYXJtIGF0dHJpYnV0ZSBvbmx5IGlmIHRoZXJlIGFyZSBubyBpbmRpdmlkdWFsCi0JCSAqIGFsYXJtIGF0dHJpYnV0ZXMsIGFuZCBpZiB0aGVyZSBpcyBhIGdsb2JhbCBhbGFybSBiaXQuCisJCSAqIGFsYXJtIGF0dHJpYnV0ZXMsIGlmIHRoZXJlIGlzIGEgZ2xvYmFsIGFsYXJtIGJpdCwgYW5kIGlmCisJCSAqIHRoZSBnZW5lcmljIHN0YXR1cyByZWdpc3RlciBmb3IgdGhpcyBwYWdlIGlzIGFjY2Vzc2libGUuCiAJCSAqLwotCQlpZiAoIWhhdmVfYWxhcm0gJiYgYXR0ci0+Z2JpdCkKKwkJaWYgKCFoYXZlX2FsYXJtICYmIGF0dHItPmdiaXQgJiYKKwkJICAgIHBtYnVzX2NoZWNrX2J5dGVfcmVnaXN0ZXIoY2xpZW50LCBwYWdlLCBQTUJVU19TVEFUVVNfQllURSkpCiAJCQlwbWJ1c19hZGRfYm9vbGVhbl9yZWcoZGF0YSwgbmFtZSwgImFsYXJtIiwgaW5kZXgsCiAJCQkJCSAgICAgIFBCX1NUQVRVU19CQVNFICsgcGFnZSwKIAkJCQkJICAgICAgYXR0ci0+Z2JpdCk7CkBAIC0xMDA4LDYgKzExMDMsMjEgQEAKIAkJLmF0dHIgPSAiY3JpdCIsCiAJCS5hbGFybSA9ICJjcml0X2FsYXJtIiwKIAkJLnNiaXQgPSBQQl9WT0xUQUdFX09WX0ZBVUxULAorCX0sIHsKKwkJLnJlZyA9IFBNQlVTX1ZJUlRfUkVBRF9WSU5fQVZHLAorCQkudXBkYXRlID0gdHJ1ZSwKKwkJLmF0dHIgPSAiYXZlcmFnZSIsCisJfSwgeworCQkucmVnID0gUE1CVVNfVklSVF9SRUFEX1ZJTl9NSU4sCisJCS51cGRhdGUgPSB0cnVlLAorCQkuYXR0ciA9ICJsb3dlc3QiLAorCX0sIHsKKwkJLnJlZyA9IFBNQlVTX1ZJUlRfUkVBRF9WSU5fTUFYLAorCQkudXBkYXRlID0gdHJ1ZSwKKwkJLmF0dHIgPSAiaGlnaGVzdCIsCisJfSwgeworCQkucmVnID0gUE1CVVNfVklSVF9SRVNFVF9WSU5fSElTVE9SWSwKKwkJLmF0dHIgPSAicmVzZXRfaGlzdG9yeSIsCiAJfSwKIH07CiAKQEAgLTEwMzIsNiArMTE0MiwyMSBAQAogCQkuYXR0ciA9ICJjcml0IiwKIAkJLmFsYXJtID0gImNyaXRfYWxhcm0iLAogCQkuc2JpdCA9IFBCX1ZPTFRBR0VfT1ZfRkFVTFQsCisJfSwgeworCQkucmVnID0gUE1CVVNfVklSVF9SRUFEX1ZPVVRfQVZHLAorCQkudXBkYXRlID0gdHJ1ZSwKKwkJLmF0dHIgPSAiYXZlcmFnZSIsCisJfSwgeworCQkucmVnID0gUE1CVVNfVklSVF9SRUFEX1ZPVVRfTUlOLAorCQkudXBkYXRlID0gdHJ1ZSwKKwkJLmF0dHIgPSAibG93ZXN0IiwKKwl9LCB7CisJCS5yZWcgPSBQTUJVU19WSVJUX1JFQURfVk9VVF9NQVgsCisJCS51cGRhdGUgPSB0cnVlLAorCQkuYXR0ciA9ICJoaWdoZXN0IiwKKwl9LCB7CisJCS5yZWcgPSBQTUJVU19WSVJUX1JFU0VUX1ZPVVRfSElTVE9SWSwKKwkJLmF0dHIgPSAicmVzZXRfaGlzdG9yeSIsCiAJfQogfTsKIApAQCAtMTA3OCw2ICsxMjAzLDIxIEBACiAJCS5hdHRyID0gImNyaXQiLAogCQkuYWxhcm0gPSAiY3JpdF9hbGFybSIsCiAJCS5zYml0ID0gUEJfSUlOX09DX0ZBVUxULAorCX0sIHsKKwkJLnJlZyA9IFBNQlVTX1ZJUlRfUkVBRF9JSU5fQVZHLAorCQkudXBkYXRlID0gdHJ1ZSwKKwkJLmF0dHIgPSAiYXZlcmFnZSIsCisJfSwgeworCQkucmVnID0gUE1CVVNfVklSVF9SRUFEX0lJTl9NSU4sCisJCS51cGRhdGUgPSB0cnVlLAorCQkuYXR0ciA9ICJsb3dlc3QiLAorCX0sIHsKKwkJLnJlZyA9IFBNQlVTX1ZJUlRfUkVBRF9JSU5fTUFYLAorCQkudXBkYXRlID0gdHJ1ZSwKKwkJLmF0dHIgPSAiaGlnaGVzdCIsCisJfSwgeworCQkucmVnID0gUE1CVVNfVklSVF9SRVNFVF9JSU5fSElTVE9SWSwKKwkJLmF0dHIgPSAicmVzZXRfaGlzdG9yeSIsCiAJfQogfTsKIApAQCAtMTA5Nyw2ICsxMjM3LDIxIEBACiAJCS5hdHRyID0gImNyaXQiLAogCQkuYWxhcm0gPSAiY3JpdF9hbGFybSIsCiAJCS5zYml0ID0gUEJfSU9VVF9PQ19GQVVMVCwKKwl9LCB7CisJCS5yZWcgPSBQTUJVU19WSVJUX1JFQURfSU9VVF9BVkcsCisJCS51cGRhdGUgPSB0cnVlLAorCQkuYXR0ciA9ICJhdmVyYWdlIiwKKwl9LCB7CisJCS5yZWcgPSBQTUJVU19WSVJUX1JFQURfSU9VVF9NSU4sCisJCS51cGRhdGUgPSB0cnVlLAorCQkuYXR0ciA9ICJsb3dlc3QiLAorCX0sIHsKKwkJLnJlZyA9IFBNQlVTX1ZJUlRfUkVBRF9JT1VUX01BWCwKKwkJLnVwZGF0ZSA9IHRydWUsCisJCS5hdHRyID0gImhpZ2hlc3QiLAorCX0sIHsKKwkJLnJlZyA9IFBNQlVTX1ZJUlRfUkVTRVRfSU9VVF9ISVNUT1JZLAorCQkuYXR0ciA9ICJyZXNldF9oaXN0b3J5IiwKIAl9CiB9OwogCkBAIC0xMTMyLDYgKzEyODcsMTcgQEAKIAkJLmF0dHIgPSAibWF4IiwKIAkJLmFsYXJtID0gImFsYXJtIiwKIAkJLnNiaXQgPSBQQl9QSU5fT1BfV0FSTklORywKKwl9LCB7CisJCS5yZWcgPSBQTUJVU19WSVJUX1JFQURfUElOX0FWRywKKwkJLnVwZGF0ZSA9IHRydWUsCisJCS5hdHRyID0gImF2ZXJhZ2UiLAorCX0sIHsKKwkJLnJlZyA9IFBNQlVTX1ZJUlRfUkVBRF9QSU5fTUFYLAorCQkudXBkYXRlID0gdHJ1ZSwKKwkJLmF0dHIgPSAiaW5wdXRfaGlnaGVzdCIsCisJfSwgeworCQkucmVnID0gUE1CVVNfVklSVF9SRVNFVF9QSU5fSElTVE9SWSwKKwkJLmF0dHIgPSAicmVzZXRfaGlzdG9yeSIsCiAJfQogfTsKIApAQCAtMTIwMCw2ICsxMzY2LDM5IEBACiAJCS5hdHRyID0gImNyaXQiLAogCQkuYWxhcm0gPSAiY3JpdF9hbGFybSIsCiAJCS5zYml0ID0gUEJfVEVNUF9PVF9GQVVMVCwKKwl9LCB7CisJCS5yZWcgPSBQTUJVU19WSVJUX1JFQURfVEVNUF9NSU4sCisJCS5hdHRyID0gImxvd2VzdCIsCisJfSwgeworCQkucmVnID0gUE1CVVNfVklSVF9SRUFEX1RFTVBfTUFYLAorCQkuYXR0ciA9ICJoaWdoZXN0IiwKKwl9LCB7CisJCS5yZWcgPSBQTUJVU19WSVJUX1JFU0VUX1RFTVBfSElTVE9SWSwKKwkJLmF0dHIgPSAicmVzZXRfaGlzdG9yeSIsCisJfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwbWJ1c19saW1pdF9hdHRyIHRlbXBfbGltaXRfYXR0cnMyM1tdID0geworCXsKKwkJLnJlZyA9IFBNQlVTX1VUX1dBUk5fTElNSVQsCisJCS5hdHRyID0gIm1pbiIsCisJCS5hbGFybSA9ICJtaW5fYWxhcm0iLAorCQkuc2JpdCA9IFBCX1RFTVBfVVRfV0FSTklORywKKwl9LCB7CisJCS5yZWcgPSBQTUJVU19VVF9GQVVMVF9MSU1JVCwKKwkJLmF0dHIgPSAibGNyaXQiLAorCQkuYWxhcm0gPSAibGNyaXRfYWxhcm0iLAorCQkuc2JpdCA9IFBCX1RFTVBfVVRfRkFVTFQsCisJfSwgeworCQkucmVnID0gUE1CVVNfT1RfV0FSTl9MSU1JVCwKKwkJLmF0dHIgPSAibWF4IiwKKwkJLmFsYXJtID0gIm1heF9hbGFybSIsCisJCS5zYml0ID0gUEJfVEVNUF9PVF9XQVJOSU5HLAorCX0sIHsKKwkJLnJlZyA9IFBNQlVTX09UX0ZBVUxUX0xJTUlULAorCQkuYXR0ciA9ICJjcml0IiwKKwkJLmFsYXJtID0gImNyaXRfYWxhcm0iLAorCQkuc2JpdCA9IFBCX1RFTVBfT1RfRkFVTFQsCiAJfQogfTsKIApAQCAtMTIyNiw4ICsxNDI1LDggQEAKIAkJLnNmdW5jID0gUE1CVVNfSEFWRV9TVEFUVVNfVEVNUCwKIAkJLnNiYXNlID0gUEJfU1RBVFVTX1RFTVBfQkFTRSwKIAkJLmdiaXQgPSBQQl9TVEFUVVNfVEVNUEVSQVRVUkUsCi0JCS5saW1pdCA9IHRlbXBfbGltaXRfYXR0cnMsCi0JCS5ubGltaXQgPSBBUlJBWV9TSVpFKHRlbXBfbGltaXRfYXR0cnMpLAorCQkubGltaXQgPSB0ZW1wX2xpbWl0X2F0dHJzMjMsCisJCS5ubGltaXQgPSBBUlJBWV9TSVpFKHRlbXBfbGltaXRfYXR0cnMyMyksCiAJfSwgewogCQkucmVnID0gUE1CVVNfUkVBRF9URU1QRVJBVFVSRV8zLAogCQkuY2xhc3MgPSBQU0NfVEVNUEVSQVRVUkUsCkBAIC0xMjM4LDggKzE0MzcsOCBAQAogCQkuc2Z1bmMgPSBQTUJVU19IQVZFX1NUQVRVU19URU1QLAogCQkuc2Jhc2UgPSBQQl9TVEFUVVNfVEVNUF9CQVNFLAogCQkuZ2JpdCA9IFBCX1NUQVRVU19URU1QRVJBVFVSRSwKLQkJLmxpbWl0ID0gdGVtcF9saW1pdF9hdHRycywKLQkJLm5saW1pdCA9IEFSUkFZX1NJWkUodGVtcF9saW1pdF9hdHRycyksCisJCS5saW1pdCA9IHRlbXBfbGltaXRfYXR0cnMyMywKKwkJLm5saW1pdCA9IEFSUkFZX1NJWkUodGVtcF9saW1pdF9hdHRyczIzKSwKIAl9CiB9OwogCkBAIC0xMzgwLDcgKzE1NzksNyBAQAogCQkgKi8KIAkJc3dpdGNoICh2b3V0X21vZGUgPj4gNSkgewogCQljYXNlIDA6CS8qIGxpbmVhciBtb2RlICAgICAgKi8KLQkJCWlmIChkYXRhLT5pbmZvLT5kaXJlY3RbUFNDX1ZPTFRBR0VfT1VUXSkKKwkJCWlmIChkYXRhLT5pbmZvLT5mb3JtYXRbUFNDX1ZPTFRBR0VfT1VUXSAhPSBsaW5lYXIpCiAJCQkJcmV0dXJuIC1FTk9ERVY7CiAKIAkJCWV4cG9uZW50ID0gdm91dF9tb2RlICYgMHgxZjsKQEAgLTEzODksOCArMTU4OCwxMiBAQAogCQkJCWV4cG9uZW50IHw9IH4weDFmOwogCQkJZGF0YS0+ZXhwb25lbnQgPSBleHBvbmVudDsKIAkJCWJyZWFrOworCQljYXNlIDE6IC8qIFZJRCBtb2RlICAgICAgICAgKi8KKwkJCWlmIChkYXRhLT5pbmZvLT5mb3JtYXRbUFNDX1ZPTFRBR0VfT1VUXSAhPSB2aWQpCisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQlicmVhazsKIAkJY2FzZSAyOgkvKiBkaXJlY3QgbW9kZSAgICAgICovCi0JCQlpZiAoIWRhdGEtPmluZm8tPmRpcmVjdFtQU0NfVk9MVEFHRV9PVVRdKQorCQkJaWYgKGRhdGEtPmluZm8tPmZvcm1hdFtQU0NfVk9MVEFHRV9PVVRdICE9IGRpcmVjdCkKIAkJCQlyZXR1cm4gLUVOT0RFVjsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgpAQCAtMTQ1NywxOCArMTY2MCw2IEBACiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0X2RhdGE7CiAJfQotCS8qCi0JICogQmFpbCBvdXQgaWYgbW9yZSB0aGFuIG9uZSBwYWdlIHdhcyBjb25maWd1cmVkLCBidXQgd2UgY2FuIG5vdAotCSAqIHNlbGVjdCB0aGUgaGlnaGVzdCBwYWdlLiBUaGlzIGlzIGFuIGluZGljYXRpb24gdGhhdCB0aGUgd3JvbmcKLQkgKiBjaGlwIHR5cGUgd2FzIHNlbGVjdGVkLiBCZXR0ZXIgYmFpbCBvdXQgbm93IHRoYW4ga2VlcAotCSAqIHJldHVybmluZyBlcnJvcnMgbGF0ZXIgb24uCi0JICovCi0JaWYgKGluZm8tPnBhZ2VzID4gMSAmJiBwbWJ1c19zZXRfcGFnZShjbGllbnQsIGluZm8tPnBhZ2VzIC0gMSkgPCAwKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiRmFpbGVkIHRvIHNlbGVjdCBwYWdlICVkXG4iLAotCQkJaW5mby0+cGFnZXMgLSAxKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBvdXRfZGF0YTsKLQl9CiAKIAlyZXQgPSBwbWJ1c19pZGVudGlmeV9jb21tb24oY2xpZW50LCBkYXRhKTsKIAlpZiAocmV0IDwgMCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi91Y2Q5MDAwLmMgYi9kcml2ZXJzL2h3bW9uL3BtYnVzL3VjZDkwMDAuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gZHJpdmVycy9od21vbi91Y2Q5MDAwLmMKcmVuYW1lIHRvIGRyaXZlcnMvaHdtb24vcG1idXMvdWNkOTAwMC5jCmRpZmYgLS1naXQgYS9kcml2ZXJzL2h3bW9uL3VjZDkyMDAuYyBiL2RyaXZlcnMvaHdtb24vcG1idXMvdWNkOTIwMC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBkcml2ZXJzL2h3bW9uL3VjZDkyMDAuYwpyZW5hbWUgdG8gZHJpdmVycy9od21vbi9wbWJ1cy91Y2Q5MjAwLmMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2N5ODJjNjkzLmMgYi9kcml2ZXJzL2lkZS9jeTgyYzY5My5jCmluZGV4IDNiZTYwZGEuLjY3Y2JjZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaWRlL2N5ODJjNjkzLmMKKysrIGIvZHJpdmVycy9pZGUvY3k4MmM2OTMuYwpAQCAtMTQxLDYgKzE0MSw4IEBACiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIENZODJfSURFX1NMQVZFX0lPVywgdGltZV8xNik7CiAJCXBjaV93cml0ZV9jb25maWdfYnl0ZShkZXYsIENZODJfSURFX1NMQVZFXzhCSVQsIHRpbWVfOCk7CiAJfQorCWlmIChod2lmLT5pbmRleCA+IDApCisJCXBjaV9kZXZfcHV0KGRldik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2lvcHNfY3k4MmM2OTMoaWRlX2h3aWZfdCAqaHdpZikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaWRlL2lkZV9wbGF0Zm9ybS5jIGIvZHJpdmVycy9pZGUvaWRlX3BsYXRmb3JtLmMKaW5kZXggNTQyNjAzYi4uOTYyNjkzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pZGUvaWRlX3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9pZGUvaWRlX3BsYXRmb3JtLmMKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9hdGFfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgcGxhdF9pZGVfc2V0dXBfcG9ydHMoc3RydWN0IGlkZV9odyAqaHcsCkBAIC05NSw3ICs5NiwxMCBAQAogCXBsYXRfaWRlX3NldHVwX3BvcnRzKCZodywgYmFzZSwgYWx0X2Jhc2UsIHBkYXRhLCByZXNfaXJxLT5zdGFydCk7CiAJaHcuZGV2ID0gJnBkZXYtPmRldjsKIAotCWQuaXJxX2ZsYWdzID0gcmVzX2lycS0+ZmxhZ3M7CisJZC5pcnFfZmxhZ3MgPSByZXNfaXJxLT5mbGFncyAmIElSUUZfVFJJR0dFUl9NQVNLOworCWlmIChyZXNfaXJxLT5mbGFncyAmIElPUkVTT1VSQ0VfSVJRX1NIQVJFQUJMRSkKKwkJZC5pcnFfZmxhZ3MgfD0gSVJRRl9TSEFSRUQ7CisKIAlpZiAobW1pbykKIAkJZC5ob3N0X2ZsYWdzIHw9IElERV9IRkxBR19NTUlPOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2dwaW9fa2V5cy5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9ncGlvX2tleXMuYwppbmRleCBjZTI4MWQxLi42N2RmOTFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2dwaW9fa2V5cy5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvZ3Bpb19rZXlzLmMKQEAgLTQ4Myw3ICs0ODMsNyBAQAogCiAJYnV0dG9ucyA9IGt6YWxsb2MocGRhdGEtPm5idXR0b25zICogKHNpemVvZiAqYnV0dG9ucyksIEdGUF9LRVJORUwpOwogCWlmICghYnV0dG9ucykKLQkJcmV0dXJuIC1FTk9ERVY7CisJCXJldHVybiAtRU5PTUVNOwogCiAJcHAgPSBOVUxMOwogCWkgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9sbTgzMjMuYyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvbG04MzIzLmMKaW5kZXggYWIwYWNhZi4uNzU2MzQ4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9rZXlib2FyZC9sbTgzMjMuYworKysgYi9kcml2ZXJzL2lucHV0L2tleWJvYXJkL2xtODMyMy5jCkBAIC03NTQsOCArNzU0LDExIEBACiAJZGV2aWNlX3JlbW92ZV9maWxlKCZjbGllbnQtPmRldiwgJmRldl9hdHRyX2Rpc2FibGVfa3ApOwogZmFpbDI6CiAJd2hpbGUgKC0tcHdtID49IDApCi0JCWlmIChsbS0+cHdtW3B3bV0uZW5hYmxlZCkKKwkJaWYgKGxtLT5wd21bcHdtXS5lbmFibGVkKSB7CisJCQlkZXZpY2VfcmVtb3ZlX2ZpbGUobG0tPnB3bVtwd21dLmNkZXYuZGV2LAorCQkJCQkgICAmZGV2X2F0dHJfdGltZSk7CiAJCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmbG0tPnB3bVtwd21dLmNkZXYpOworCQl9CiBmYWlsMToKIAlpbnB1dF9mcmVlX2RldmljZShpZGV2KTsKIAlrZnJlZShsbSk7CkBAIC03NzUsOCArNzc4LDEwIEBACiAJZGV2aWNlX3JlbW92ZV9maWxlKCZsbS0+Y2xpZW50LT5kZXYsICZkZXZfYXR0cl9kaXNhYmxlX2twKTsKIAogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCi0JCWlmIChsbS0+cHdtW2ldLmVuYWJsZWQpCisJCWlmIChsbS0+cHdtW2ldLmVuYWJsZWQpIHsKKwkJCWRldmljZV9yZW1vdmVfZmlsZShsbS0+cHdtW2ldLmNkZXYuZGV2LCAmZGV2X2F0dHJfdGltZSk7CiAJCQlsZWRfY2xhc3NkZXZfdW5yZWdpc3RlcigmbG0tPnB3bVtpXS5jZGV2KTsKKwkJfQogCiAJa2ZyZWUobG0pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3RlZ3JhLWtiYy5jIGIvZHJpdmVycy9pbnB1dC9rZXlib2FyZC90ZWdyYS1rYmMuYwppbmRleCBkYTM4MjhmLi5mMjcwNDQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L2tleWJvYXJkL3RlZ3JhLWtiYy5jCisrKyBiL2RyaXZlcnMvaW5wdXQva2V5Ym9hcmQvdGVncmEta2JjLmMKQEAgLTE5LDYgKzE5LDcgQEAKICAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEsIFVTQS4KICAqLwogCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTM3LDcgKzM4LDcgQEAKICNkZWZpbmUgS0JDX1JPV19TQ0FOX0RMWQk1CiAKIC8qIEtCQyB1c2VzIGEgMzJLSHogY2xvY2sgc28gYSBjeWNsZSA9IDEvMzJLaHogKi8KLSNkZWZpbmUgS0JDX0NZQ0xFX1VTRUMJMzIKKyNkZWZpbmUgS0JDX0NZQ0xFX01TCTMyCiAKIC8qIEtCQyBSZWdpc3RlcnMgKi8KIApAQCAtNjQ3LDcgKzY0OCw3IEBACiAJZGVib3VuY2VfY250ID0gbWluKHBkYXRhLT5kZWJvdW5jZV9jbnQsIEtCQ19NQVhfREVCT1VOQ0VfQ05UKTsKIAlzY2FuX3RpbWVfcm93cyA9IChLQkNfUk9XX1NDQU5fVElNRSArIGRlYm91bmNlX2NudCkgKiBudW1fcm93czsKIAlrYmMtPnJlcG9sbF9kbHkgPSBLQkNfUk9XX1NDQU5fRExZICsgc2Nhbl90aW1lX3Jvd3MgKyBwZGF0YS0+cmVwZWF0X2NudDsKLQlrYmMtPnJlcG9sbF9kbHkgPSAoKGtiYy0+cmVwb2xsX2RseSAqIEtCQ19DWUNMRV9VU0VDKSArIDk5OSkgLyAxMDAwOworCWtiYy0+cmVwb2xsX2RseSA9IERJVl9ST1VORF9VUChrYmMtPnJlcG9sbF9kbHksIEtCQ19DWUNMRV9NUyk7CiAKIAlpbnB1dF9kZXYtPm5hbWUgPSBwZGV2LT5uYW1lOwogCWlucHV0X2Rldi0+aWQuYnVzdHlwZSA9IEJVU19IT1NUOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL2t4dGo5LmMgYi9kcml2ZXJzL2lucHV0L21pc2Mva3h0ajkuYwppbmRleCBjNDU2ZjYzLi43ODM1OTdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2Mva3h0ajkuYworKysgYi9kcml2ZXJzL2lucHV0L21pc2Mva3h0ajkuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0L2t4dGo5Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQtcG9sbGRldi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL21tYTg0NTAuYyBiL2RyaXZlcnMvaW5wdXQvbWlzYy9tbWE4NDUwLmMKaW5kZXggMjBmOGY5Mi4uNmM3NmNmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9taXNjL21tYTg0NTAuYworKysgYi9kcml2ZXJzL2lucHV0L21pc2MvbW1hODQ1MC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC1wb2xsZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CiAKICNkZWZpbmUgTU1BODQ1MF9EUlZfTkFNRQkibW1hODQ1MCIKIApAQCAtMjI5LDEwICsyMzAsMTcgQEAKIH07CiBNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgbW1hODQ1MF9pZCk7CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1tYTg0NTBfZHRfaWRzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJmc2wsbW1hODQ1MCIsIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIG1tYTg0NTBfZHRfaWRzKTsKKwogc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIG1tYTg0NTBfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCT0gTU1BODQ1MF9EUlZfTkFNRSwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IG1tYTg0NTBfZHRfaWRzLAogCX0sCiAJLnByb2JlCQk9IG1tYTg0NTBfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChtbWE4NDUwX3JlbW92ZSksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL2hncGsuYyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvaGdway5jCmluZGV4IDk1NTc3YzEuLjRkMTdkOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5wdXQvbW91c2UvaGdway5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2UvaGdway5jCkBAIC0zMiw2ICszMiw3IEBACiAjZGVmaW5lIERFQlVHCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2VyaW8uaD4KICNpbmNsdWRlIDxsaW51eC9saWJwczIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9zZXJpby94aWxpbnhfcHMyLmMgYi9kcml2ZXJzL2lucHV0L3NlcmlvL3hpbGlueF9wczIuYwppbmRleCA4MGJhYTUzLi5kNjRjNWE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L3NlcmlvL3hpbGlueF9wczIuYworKysgYi9kcml2ZXJzL2lucHV0L3NlcmlvL3hpbGlueF9wczIuYwpAQCAtMjMsNyArMjMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW8uaD4KLQorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2FkNzg3OS5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzkuYwppbmRleCBiYzNiNTE4Li4xMzFmOWQxYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZDc4NzkuYworKysgYi9kcml2ZXJzL2lucHV0L3RvdWNoc2NyZWVuL2FkNzg3OS5jCkBAIC0yNDksMTIgKzI0OSwxNCBAQAogCiBzdGF0aWMgdm9pZCBfX2FkNzg3OV9kaXNhYmxlKHN0cnVjdCBhZDc4NzkgKnRzKQogeworCXUxNiByZWcgPSAodHMtPmNtZF9jcnRsMiAmIH5BRDc4NzlfUE0oLTEpKSB8CisJCUFENzg3OV9QTShBRDc4NzlfUE1fU0hVVERPV04pOwogCWRpc2FibGVfaXJxKHRzLT5pcnEpOwogCiAJaWYgKGRlbF90aW1lcl9zeW5jKCZ0cy0+dGltZXIpKQogCQlhZDc4NzlfdHNfZXZlbnRfcmVsZWFzZSh0cyk7CiAKLQlhZDc4Nzlfd3JpdGUodHMsIEFENzg3OV9SRUdfQ1RSTDIsIEFENzg3OV9QTShBRDc4NzlfUE1fU0hVVERPV04pKTsKKwlhZDc4Nzlfd3JpdGUodHMsIEFENzg3OV9SRUdfQ1RSTDIsIHJlZyk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9LY29uZmlnIGIvZHJpdmVycy9tZC9LY29uZmlnCmluZGV4IDg0MjAxMjkuLmY3NWE2NmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvS2NvbmZpZworKysgYi9kcml2ZXJzL21kL0tjb25maWcKQEAgLTI0MSwxMiArMjQxLDEzIEBACiAgICAgICAgICBuZWVkZWQgZm9yIGxpdmUgZGF0YSBtaWdyYXRpb24gdG9vbHMgc3VjaCBhcyAncHZtb3ZlJy4KIAogY29uZmlnIERNX1JBSUQKLSAgICAgICB0cmlzdGF0ZSAiUkFJRCA0LzUvNiB0YXJnZXQgKEVYUEVSSU1FTlRBTCkiCisgICAgICAgdHJpc3RhdGUgIlJBSUQgMS80LzUvNiB0YXJnZXQgKEVYUEVSSU1FTlRBTCkiCiAgICAgICAgZGVwZW5kcyBvbiBCTEtfREVWX0RNICYmIEVYUEVSSU1FTlRBTAorICAgICAgIHNlbGVjdCBNRF9SQUlEMQogICAgICAgIHNlbGVjdCBNRF9SQUlENDU2CiAgICAgICAgc2VsZWN0IEJMS19ERVZfTUQKICAgICAgICAtLS1oZWxwLS0tCi0JIEEgZG0gdGFyZ2V0IHRoYXQgc3VwcG9ydHMgUkFJRDQsIFJBSUQ1IGFuZCBSQUlENiBtYXBwaW5ncworCSBBIGRtIHRhcmdldCB0aGF0IHN1cHBvcnRzIFJBSUQxLCBSQUlENCwgUkFJRDUgYW5kIFJBSUQ2IG1hcHBpbmdzCiAKIAkgQSBSQUlELTUgc2V0IG9mIE4gZHJpdmVzIHdpdGggYSBjYXBhY2l0eSBvZiBDIE1CIHBlciBkcml2ZSBwcm92aWRlcwogCSB0aGUgY2FwYWNpdHkgb2YgQyAqIChOIC0gMSkgTUIsIGFuZCBwcm90ZWN0cyBhZ2FpbnN0IGEgZmFpbHVyZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1jcnlwdC5jIGIvZHJpdmVycy9tZC9kbS1jcnlwdC5jCmluZGV4IGJhZTZjNGUuLjQ5ZGE1NWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tY3J5cHQuYworKysgYi9kcml2ZXJzL21kL2RtLWNyeXB0LmMKQEAgLTMwLDcgKzMwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZXZpY2UtbWFwcGVyLmg+CiAKICNkZWZpbmUgRE1fTVNHX1BSRUZJWCAiY3J5cHQiCi0jZGVmaW5lIE1FU0dfU1RSKHgpIHgsIHNpemVvZih4KQogCiAvKgogICogY29udGV4dCBob2xkaW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgbXVsdGktcGFydCBjb252ZXJzaW9uCkBAIC0yMzksNyArMjM4LDcgQEAKIAkJCSAgICAgIHN0cnVjdCBkbV9jcnlwdF9yZXF1ZXN0ICpkbXJlcSkKIHsKIAltZW1zZXQoaXYsIDAsIGNjLT5pdl9zaXplKTsKLQkqKHUzMiAqKWl2ID0gY3B1X3RvX2xlMzIoZG1yZXEtPml2X3NlY3RvciAmIDB4ZmZmZmZmZmYpOworCSooX19sZTMyICopaXYgPSBjcHVfdG9fbGUzMihkbXJlcS0+aXZfc2VjdG9yICYgMHhmZmZmZmZmZik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTI0OCw3ICsyNDcsNyBAQAogCQkJCXN0cnVjdCBkbV9jcnlwdF9yZXF1ZXN0ICpkbXJlcSkKIHsKIAltZW1zZXQoaXYsIDAsIGNjLT5pdl9zaXplKTsKLQkqKHU2NCAqKWl2ID0gY3B1X3RvX2xlNjQoZG1yZXEtPml2X3NlY3Rvcik7CisJKihfX2xlNjQgKilpdiA9IGNwdV90b19sZTY0KGRtcmVxLT5pdl9zZWN0b3IpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC00MTUsNyArNDE0LDcgQEAKIAlzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqZXNzaXZfdGZtID0gdGhpc19jcnlwdF9jb25maWcoY2MpLT5pdl9wcml2YXRlOwogCiAJbWVtc2V0KGl2LCAwLCBjYy0+aXZfc2l6ZSk7Ci0JKih1NjQgKilpdiA9IGNwdV90b19sZTY0KGRtcmVxLT5pdl9zZWN0b3IpOworCSooX19sZTY0ICopaXYgPSBjcHVfdG9fbGU2NChkbXJlcS0+aXZfc2VjdG9yKTsKIAljcnlwdG9fY2lwaGVyX2VuY3J5cHRfb25lKGVzc2l2X3RmbSwgaXYsIGl2KTsKIAogCXJldHVybiAwOwpAQCAtMTU3NSwxMSArMTU3NCwxNyBAQAogc3RhdGljIGludCBjcnlwdF9jdHIoc3RydWN0IGRtX3RhcmdldCAqdGksIHVuc2lnbmVkIGludCBhcmdjLCBjaGFyICoqYXJndikKIHsKIAlzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYzsKLQl1bnNpZ25lZCBpbnQga2V5X3NpemU7CisJdW5zaWduZWQgaW50IGtleV9zaXplLCBvcHRfcGFyYW1zOwogCXVuc2lnbmVkIGxvbmcgbG9uZyB0bXBsbDsKIAlpbnQgcmV0OworCXN0cnVjdCBkbV9hcmdfc2V0IGFzOworCWNvbnN0IGNoYXIgKm9wdF9zdHJpbmc7CiAKLQlpZiAoYXJnYyAhPSA1KSB7CisJc3RhdGljIHN0cnVjdCBkbV9hcmcgX2FyZ3NbXSA9IHsKKwkJezAsIDEsICJJbnZhbGlkIG51bWJlciBvZiBmZWF0dXJlIGFyZ3MifSwKKwl9OworCisJaWYgKGFyZ2MgPCA1KSB7CiAJCXRpLT5lcnJvciA9ICJOb3QgZW5vdWdoIGFyZ3VtZW50cyI7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTE2NDgsNiArMTY1MywzMCBAQAogCX0KIAljYy0+c3RhcnQgPSB0bXBsbDsKIAorCWFyZ3YgKz0gNTsKKwlhcmdjIC09IDU7CisKKwkvKiBPcHRpb25hbCBwYXJhbWV0ZXJzICovCisJaWYgKGFyZ2MpIHsKKwkJYXMuYXJnYyA9IGFyZ2M7CisJCWFzLmFyZ3YgPSBhcmd2OworCisJCXJldCA9IGRtX3JlYWRfYXJnX2dyb3VwKF9hcmdzLCAmYXMsICZvcHRfcGFyYW1zLCAmdGktPmVycm9yKTsKKwkJaWYgKHJldCkKKwkJCWdvdG8gYmFkOworCisJCW9wdF9zdHJpbmcgPSBkbV9zaGlmdF9hcmcoJmFzKTsKKworCQlpZiAob3B0X3BhcmFtcyA9PSAxICYmIG9wdF9zdHJpbmcgJiYKKwkJICAgICFzdHJjYXNlY21wKG9wdF9zdHJpbmcsICJhbGxvd19kaXNjYXJkcyIpKQorCQkJdGktPm51bV9kaXNjYXJkX3JlcXVlc3RzID0gMTsKKwkJZWxzZSBpZiAob3B0X3BhcmFtcykgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCXRpLT5lcnJvciA9ICJJbnZhbGlkIGZlYXR1cmUgYXJndW1lbnRzIjsKKwkJCWdvdG8gYmFkOworCQl9CisJfQorCiAJcmV0ID0gLUVOT01FTTsKIAljYy0+aW9fcXVldWUgPSBhbGxvY193b3JrcXVldWUoImtjcnlwdGRfaW8iLAogCQkJCSAgICAgICBXUV9OT05fUkVFTlRSQU5UfApAQCAtMTY4Miw5ICsxNzExLDE2IEBACiAJc3RydWN0IGRtX2NyeXB0X2lvICppbzsKIAlzdHJ1Y3QgY3J5cHRfY29uZmlnICpjYzsKIAotCWlmIChiaW8tPmJpX3J3ICYgUkVRX0ZMVVNIKSB7CisJLyoKKwkgKiBJZiBiaW8gaXMgUkVRX0ZMVVNIIG9yIFJFUV9ESVNDQVJELCBqdXN0IGJ5cGFzcyBjcnlwdCBxdWV1ZXMuCisJICogLSBmb3IgUkVRX0ZMVVNIIGRldmljZS1tYXBwZXIgY29yZSBlbnN1cmVzIHRoYXQgbm8gSU8gaXMgaW4tZmxpZ2h0CisJICogLSBmb3IgUkVRX0RJU0NBUkQgY2FsbGVyIG11c3QgdXNlIGZsdXNoIGlmIElPIG9yZGVyaW5nIG1hdHRlcnMKKwkgKi8KKwlpZiAodW5saWtlbHkoYmlvLT5iaV9ydyAmIChSRVFfRkxVU0ggfCBSRVFfRElTQ0FSRCkpKSB7CiAJCWNjID0gdGktPnByaXZhdGU7CiAJCWJpby0+YmlfYmRldiA9IGNjLT5kZXYtPmJkZXY7CisJCWlmIChiaW9fc2VjdG9ycyhiaW8pKQorCQkJYmlvLT5iaV9zZWN0b3IgPSBjYy0+c3RhcnQgKyBkbV90YXJnZXRfb2Zmc2V0KHRpLCBiaW8tPmJpX3NlY3Rvcik7CiAJCXJldHVybiBETV9NQVBJT19SRU1BUFBFRDsKIAl9CiAKQEAgLTE3MjcsNiArMTc2MywxMCBAQAogCiAJCURNRU1JVCgiICVsbHUgJXMgJWxsdSIsICh1bnNpZ25lZCBsb25nIGxvbmcpY2MtPml2X29mZnNldCwKIAkJCQljYy0+ZGV2LT5uYW1lLCAodW5zaWduZWQgbG9uZyBsb25nKWNjLT5zdGFydCk7CisKKwkJaWYgKHRpLT5udW1fZGlzY2FyZF9yZXF1ZXN0cykKKwkJCURNRU1JVCgiIDEgYWxsb3dfZGlzY2FyZHMiKTsKKwogCQlicmVhazsKIAl9CiAJcmV0dXJuIDA7CkBAIC0xNzcwLDEyICsxODEwLDEyIEBACiAJaWYgKGFyZ2MgPCAyKQogCQlnb3RvIGVycm9yOwogCi0JaWYgKCFzdHJuaWNtcChhcmd2WzBdLCBNRVNHX1NUUigia2V5IikpKSB7CisJaWYgKCFzdHJjYXNlY21wKGFyZ3ZbMF0sICJrZXkiKSkgewogCQlpZiAoIXRlc3RfYml0KERNX0NSWVBUX1NVU1BFTkRFRCwgJmNjLT5mbGFncykpIHsKIAkJCURNV0FSTigibm90IHN1c3BlbmRlZCBkdXJpbmcga2V5IG1hbmlwdWxhdGlvbi4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCWlmIChhcmdjID09IDMgJiYgIXN0cm5pY21wKGFyZ3ZbMV0sIE1FU0dfU1RSKCJzZXQiKSkpIHsKKwkJaWYgKGFyZ2MgPT0gMyAmJiAhc3RyY2FzZWNtcChhcmd2WzFdLCAic2V0IikpIHsKIAkJCXJldCA9IGNyeXB0X3NldF9rZXkoY2MsIGFyZ3ZbMl0pOwogCQkJaWYgKHJldCkKIAkJCQlyZXR1cm4gcmV0OwpAQCAtMTc4Myw3ICsxODIzLDcgQEAKIAkJCQlyZXQgPSBjYy0+aXZfZ2VuX29wcy0+aW5pdChjYyk7CiAJCQlyZXR1cm4gcmV0OwogCQl9Ci0JCWlmIChhcmdjID09IDIgJiYgIXN0cm5pY21wKGFyZ3ZbMV0sIE1FU0dfU1RSKCJ3aXBlIikpKSB7CisJCWlmIChhcmdjID09IDIgJiYgIXN0cmNhc2VjbXAoYXJndlsxXSwgIndpcGUiKSkgewogCQkJaWYgKGNjLT5pdl9nZW5fb3BzICYmIGNjLT5pdl9nZW5fb3BzLT53aXBlKSB7CiAJCQkJcmV0ID0gY2MtPml2X2dlbl9vcHMtPndpcGUoY2MpOwogCQkJCWlmIChyZXQpCkBAIC0xODIzLDcgKzE4NjMsNyBAQAogCiBzdGF0aWMgc3RydWN0IHRhcmdldF90eXBlIGNyeXB0X3RhcmdldCA9IHsKIAkubmFtZSAgID0gImNyeXB0IiwKLQkudmVyc2lvbiA9IHsxLCAxMCwgMH0sCisJLnZlcnNpb24gPSB7MSwgMTEsIDB9LAogCS5tb2R1bGUgPSBUSElTX01PRFVMRSwKIAkuY3RyICAgID0gY3J5cHRfY3RyLAogCS5kdHIgICAgPSBjcnlwdF9kdHIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWZsYWtleS5jIGIvZHJpdmVycy9tZC9kbS1mbGFrZXkuYwppbmRleCBlYTc5MDYyLi44OWY3M2NhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWZsYWtleS5jCisrKyBiL2RyaXZlcnMvbWQvZG0tZmxha2V5LmMKQEAgLTEsNiArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDAzIFNpc3RpbmEgU29mdHdhcmUgKFVLKSBMaW1pdGVkLgotICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDEwIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAxMC0yMDExIFJlZCBIYXQsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIGZpbGUgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdQTC4KICAqLwpAQCAtMTUsNiArMTUsOSBAQAogCiAjZGVmaW5lIERNX01TR19QUkVGSVggImZsYWtleSIKIAorI2RlZmluZSBhbGxfY29ycnVwdF9iaW9fZmxhZ3NfbWF0Y2goYmlvLCBmYykJXAorCSgoKGJpbyktPmJpX3J3ICYgKGZjKS0+Y29ycnVwdF9iaW9fZmxhZ3MpID09IChmYyktPmNvcnJ1cHRfYmlvX2ZsYWdzKQorCiAvKgogICogRmxha2V5OiBVc2VkIGZvciB0ZXN0aW5nIG9ubHksIHNpbXVsYXRlcyBpbnRlcm1pdHRlbnQsCiAgKiBjYXRhc3Ryb3BoaWMgZGV2aWNlIGZhaWx1cmUuCkBAIC0yNSw2MCArMjgsMTg5IEBACiAJc2VjdG9yX3Qgc3RhcnQ7CiAJdW5zaWduZWQgdXBfaW50ZXJ2YWw7CiAJdW5zaWduZWQgZG93bl9pbnRlcnZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNvcnJ1cHRfYmlvX2J5dGU7CisJdW5zaWduZWQgY29ycnVwdF9iaW9fcnc7CisJdW5zaWduZWQgY29ycnVwdF9iaW9fdmFsdWU7CisJdW5zaWduZWQgY29ycnVwdF9iaW9fZmxhZ3M7CiB9OwogCi0vKgotICogQ29uc3RydWN0IGEgZmxha2V5IG1hcHBpbmc6IDxkZXZfcGF0aD4gPG9mZnNldD4gPHVwIGludGVydmFsPiA8ZG93biBpbnRlcnZhbD4KLSAqLwotc3RhdGljIGludCBmbGFrZXlfY3RyKHN0cnVjdCBkbV90YXJnZXQgKnRpLCB1bnNpZ25lZCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCi17Ci0Jc3RydWN0IGZsYWtleV9jICpmYzsKLQl1bnNpZ25lZCBsb25nIGxvbmcgdG1wOworZW51bSBmZWF0dXJlX2ZsYWdfYml0cyB7CisJRFJPUF9XUklURVMKK307CiAKLQlpZiAoYXJnYyAhPSA0KSB7Ci0JCXRpLT5lcnJvciA9ICJkbS1mbGFrZXk6IEludmFsaWQgYXJndW1lbnQgY291bnQiOworc3RhdGljIGludCBwYXJzZV9mZWF0dXJlcyhzdHJ1Y3QgZG1fYXJnX3NldCAqYXMsIHN0cnVjdCBmbGFrZXlfYyAqZmMsCisJCQkgIHN0cnVjdCBkbV90YXJnZXQgKnRpKQoreworCWludCByOworCXVuc2lnbmVkIGFyZ2M7CisJY29uc3QgY2hhciAqYXJnX25hbWU7CisKKwlzdGF0aWMgc3RydWN0IGRtX2FyZyBfYXJnc1tdID0geworCQl7MCwgNiwgIkludmFsaWQgbnVtYmVyIG9mIGZlYXR1cmUgYXJncyJ9LAorCQl7MSwgVUlOVF9NQVgsICJJbnZhbGlkIGNvcnJ1cHQgYmlvIGJ5dGUifSwKKwkJezAsIDI1NSwgIkludmFsaWQgY29ycnVwdCB2YWx1ZSB0byB3cml0ZSBpbnRvIGJpbyBieXRlICgwLTI1NSkifSwKKwkJezAsIFVJTlRfTUFYLCAiSW52YWxpZCBjb3JydXB0IGJpbyBmbGFncyBtYXNrIn0sCisJfTsKKworCS8qIE5vIGZlYXR1cmUgYXJndW1lbnRzIHN1cHBsaWVkLiAqLworCWlmICghYXMtPmFyZ2MpCisJCXJldHVybiAwOworCisJciA9IGRtX3JlYWRfYXJnX2dyb3VwKF9hcmdzLCBhcywgJmFyZ2MsICZ0aS0+ZXJyb3IpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXdoaWxlIChhcmdjKSB7CisJCWFyZ19uYW1lID0gZG1fc2hpZnRfYXJnKGFzKTsKKwkJYXJnYy0tOworCisJCS8qCisJCSAqIGRyb3Bfd3JpdGVzCisJCSAqLworCQlpZiAoIXN0cmNhc2VjbXAoYXJnX25hbWUsICJkcm9wX3dyaXRlcyIpKSB7CisJCQlpZiAodGVzdF9hbmRfc2V0X2JpdChEUk9QX1dSSVRFUywgJmZjLT5mbGFncykpIHsKKwkJCQl0aS0+ZXJyb3IgPSAiRmVhdHVyZSBkcm9wX3dyaXRlcyBkdXBsaWNhdGVkIjsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBjb3JydXB0X2Jpb19ieXRlIDxOdGhfYnl0ZT4gPGRpcmVjdGlvbj4gPHZhbHVlPiA8YmlvX2ZsYWdzPgorCQkgKi8KKwkJaWYgKCFzdHJjYXNlY21wKGFyZ19uYW1lLCAiY29ycnVwdF9iaW9fYnl0ZSIpKSB7CisJCQlpZiAoIWFyZ2MpCisJCQkJdGktPmVycm9yID0gIkZlYXR1cmUgY29ycnVwdF9iaW9fYnl0ZSByZXF1aXJlcyBwYXJhbWV0ZXJzIjsKKworCQkJciA9IGRtX3JlYWRfYXJnKF9hcmdzICsgMSwgYXMsICZmYy0+Y29ycnVwdF9iaW9fYnl0ZSwgJnRpLT5lcnJvcik7CisJCQlpZiAocikKKwkJCQlyZXR1cm4gcjsKKwkJCWFyZ2MtLTsKKworCQkJLyoKKwkJCSAqIERpcmVjdGlvbiByIG9yIHc/CisJCQkgKi8KKwkJCWFyZ19uYW1lID0gZG1fc2hpZnRfYXJnKGFzKTsKKwkJCWlmICghc3RyY2FzZWNtcChhcmdfbmFtZSwgInciKSkKKwkJCQlmYy0+Y29ycnVwdF9iaW9fcncgPSBXUklURTsKKwkJCWVsc2UgaWYgKCFzdHJjYXNlY21wKGFyZ19uYW1lLCAiciIpKQorCQkJCWZjLT5jb3JydXB0X2Jpb19ydyA9IFJFQUQ7CisJCQllbHNlIHsKKwkJCQl0aS0+ZXJyb3IgPSAiSW52YWxpZCBjb3JydXB0IGJpbyBkaXJlY3Rpb24gKHIgb3IgdykiOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJYXJnYy0tOworCisJCQkvKgorCQkJICogVmFsdWUgb2YgYnl0ZSAoMC0yNTUpIHRvIHdyaXRlIGluIHBsYWNlIG9mIGNvcnJlY3Qgb25lLgorCQkJICovCisJCQlyID0gZG1fcmVhZF9hcmcoX2FyZ3MgKyAyLCBhcywgJmZjLT5jb3JydXB0X2Jpb192YWx1ZSwgJnRpLT5lcnJvcik7CisJCQlpZiAocikKKwkJCQlyZXR1cm4gcjsKKwkJCWFyZ2MtLTsKKworCQkJLyoKKwkJCSAqIE9ubHkgY29ycnVwdCBiaW9zIHdpdGggdGhlc2UgZmxhZ3Mgc2V0LgorCQkJICovCisJCQlyID0gZG1fcmVhZF9hcmcoX2FyZ3MgKyAzLCBhcywgJmZjLT5jb3JydXB0X2Jpb19mbGFncywgJnRpLT5lcnJvcik7CisJCQlpZiAocikKKwkJCQlyZXR1cm4gcjsKKwkJCWFyZ2MtLTsKKworCQkJY29udGludWU7CisJCX0KKworCQl0aS0+ZXJyb3IgPSAiVW5yZWNvZ25pc2VkIGZsYWtleSBmZWF0dXJlIHJlcXVlc3RlZCI7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWZjID0ga21hbGxvYyhzaXplb2YoKmZjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHRlc3RfYml0KERST1BfV1JJVEVTLCAmZmMtPmZsYWdzKSAmJiAoZmMtPmNvcnJ1cHRfYmlvX3J3ID09IFdSSVRFKSkgeworCQl0aS0+ZXJyb3IgPSAiZHJvcF93cml0ZXMgaXMgaW5jb21wYXRpYmxlIHdpdGggY29ycnVwdF9iaW9fYnl0ZSB3aXRoIHRoZSBXUklURSBmbGFnIHNldCI7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogQ29uc3RydWN0IGEgZmxha2V5IG1hcHBpbmc6CisgKiA8ZGV2X3BhdGg+IDxvZmZzZXQ+IDx1cCBpbnRlcnZhbD4gPGRvd24gaW50ZXJ2YWw+IFs8I2ZlYXR1cmUgYXJncz4gWzxhcmc+XSpdCisgKgorICogICBGZWF0dXJlIGFyZ3M6CisgKiAgICAgW2Ryb3Bfd3JpdGVzXQorICogICAgIFtjb3JydXB0X2Jpb19ieXRlIDxOdGhfYnl0ZT4gPGRpcmVjdGlvbj4gPHZhbHVlPiA8YmlvX2ZsYWdzPl0KKyAqCisgKiAgIE50aF9ieXRlIHN0YXJ0cyBmcm9tIDEgZm9yIHRoZSBmaXJzdCBieXRlLgorICogICBEaXJlY3Rpb24gaXMgciBmb3IgUkVBRCBvciB3IGZvciBXUklURS4KKyAqICAgYmlvX2ZsYWdzIGlzIGlnbm9yZWQgaWYgMC4KKyAqLworc3RhdGljIGludCBmbGFrZXlfY3RyKHN0cnVjdCBkbV90YXJnZXQgKnRpLCB1bnNpZ25lZCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RhdGljIHN0cnVjdCBkbV9hcmcgX2FyZ3NbXSA9IHsKKwkJezAsIFVJTlRfTUFYLCAiSW52YWxpZCB1cCBpbnRlcnZhbCJ9LAorCQl7MCwgVUlOVF9NQVgsICJJbnZhbGlkIGRvd24gaW50ZXJ2YWwifSwKKwl9OworCisJaW50IHI7CisJc3RydWN0IGZsYWtleV9jICpmYzsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdG1wbGw7CisJc3RydWN0IGRtX2FyZ19zZXQgYXM7CisJY29uc3QgY2hhciAqZGV2bmFtZTsKKworCWFzLmFyZ2MgPSBhcmdjOworCWFzLmFyZ3YgPSBhcmd2OworCisJaWYgKGFyZ2MgPCA0KSB7CisJCXRpLT5lcnJvciA9ICJJbnZhbGlkIGFyZ3VtZW50IGNvdW50IjsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZmMgPSBremFsbG9jKHNpemVvZigqZmMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWZjKSB7Ci0JCXRpLT5lcnJvciA9ICJkbS1mbGFrZXk6IENhbm5vdCBhbGxvY2F0ZSBsaW5lYXIgY29udGV4dCI7CisJCXRpLT5lcnJvciA9ICJDYW5ub3QgYWxsb2NhdGUgbGluZWFyIGNvbnRleHQiOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJZmMtPnN0YXJ0X3RpbWUgPSBqaWZmaWVzOwogCi0JaWYgKHNzY2FuZihhcmd2WzFdLCAiJWxsdSIsICZ0bXApICE9IDEpIHsKLQkJdGktPmVycm9yID0gImRtLWZsYWtleTogSW52YWxpZCBkZXZpY2Ugc2VjdG9yIjsKLQkJZ290byBiYWQ7Ci0JfQotCWZjLT5zdGFydCA9IHRtcDsKKwlkZXZuYW1lID0gZG1fc2hpZnRfYXJnKCZhcyk7CiAKLQlpZiAoc3NjYW5mKGFyZ3ZbMl0sICIldSIsICZmYy0+dXBfaW50ZXJ2YWwpICE9IDEpIHsKLQkJdGktPmVycm9yID0gImRtLWZsYWtleTogSW52YWxpZCB1cCBpbnRlcnZhbCI7CisJaWYgKHNzY2FuZihkbV9zaGlmdF9hcmcoJmFzKSwgIiVsbHUiLCAmdG1wbGwpICE9IDEpIHsKKwkJdGktPmVycm9yID0gIkludmFsaWQgZGV2aWNlIHNlY3RvciI7CiAJCWdvdG8gYmFkOwogCX0KKwlmYy0+c3RhcnQgPSB0bXBsbDsKIAotCWlmIChzc2NhbmYoYXJndlszXSwgIiV1IiwgJmZjLT5kb3duX2ludGVydmFsKSAhPSAxKSB7Ci0JCXRpLT5lcnJvciA9ICJkbS1mbGFrZXk6IEludmFsaWQgZG93biBpbnRlcnZhbCI7CisJciA9IGRtX3JlYWRfYXJnKF9hcmdzLCAmYXMsICZmYy0+dXBfaW50ZXJ2YWwsICZ0aS0+ZXJyb3IpOworCWlmIChyKQogCQlnb3RvIGJhZDsKLQl9CisKKwlyID0gZG1fcmVhZF9hcmcoX2FyZ3MsICZhcywgJmZjLT5kb3duX2ludGVydmFsLCAmdGktPmVycm9yKTsKKwlpZiAocikKKwkJZ290byBiYWQ7CiAKIAlpZiAoIShmYy0+dXBfaW50ZXJ2YWwgKyBmYy0+ZG93bl9pbnRlcnZhbCkpIHsKLQkJdGktPmVycm9yID0gImRtLWZsYWtleTogVG90YWwgKHVwICsgZG93bikgaW50ZXJ2YWwgaXMgemVybyI7CisJCXRpLT5lcnJvciA9ICJUb3RhbCAodXAgKyBkb3duKSBpbnRlcnZhbCBpcyB6ZXJvIjsKIAkJZ290byBiYWQ7CiAJfQogCiAJaWYgKGZjLT51cF9pbnRlcnZhbCArIGZjLT5kb3duX2ludGVydmFsIDwgZmMtPnVwX2ludGVydmFsKSB7Ci0JCXRpLT5lcnJvciA9ICJkbS1mbGFrZXk6IEludGVydmFsIG92ZXJmbG93IjsKKwkJdGktPmVycm9yID0gIkludGVydmFsIG92ZXJmbG93IjsKIAkJZ290byBiYWQ7CiAJfQogCi0JaWYgKGRtX2dldF9kZXZpY2UodGksIGFyZ3ZbMF0sIGRtX3RhYmxlX2dldF9tb2RlKHRpLT50YWJsZSksICZmYy0+ZGV2KSkgewotCQl0aS0+ZXJyb3IgPSAiZG0tZmxha2V5OiBEZXZpY2UgbG9va3VwIGZhaWxlZCI7CisJciA9IHBhcnNlX2ZlYXR1cmVzKCZhcywgZmMsIHRpKTsKKwlpZiAocikKKwkJZ290byBiYWQ7CisKKwlpZiAoZG1fZ2V0X2RldmljZSh0aSwgZGV2bmFtZSwgZG1fdGFibGVfZ2V0X21vZGUodGktPnRhYmxlKSwgJmZjLT5kZXYpKSB7CisJCXRpLT5lcnJvciA9ICJEZXZpY2UgbG9va3VwIGZhaWxlZCI7CiAJCWdvdG8gYmFkOwogCX0KIAogCXRpLT5udW1fZmx1c2hfcmVxdWVzdHMgPSAxOworCXRpLT5udW1fZGlzY2FyZF9yZXF1ZXN0cyA9IDE7CiAJdGktPnByaXZhdGUgPSBmYzsKIAlyZXR1cm4gMDsKIApAQCAtOTksNyArMjMxLDcgQEAKIHsKIAlzdHJ1Y3QgZmxha2V5X2MgKmZjID0gdGktPnByaXZhdGU7CiAKLQlyZXR1cm4gZmMtPnN0YXJ0ICsgKGJpX3NlY3RvciAtIHRpLT5iZWdpbik7CisJcmV0dXJuIGZjLT5zdGFydCArIGRtX3RhcmdldF9vZmZzZXQodGksIGJpX3NlY3Rvcik7CiB9CiAKIHN0YXRpYyB2b2lkIGZsYWtleV9tYXBfYmlvKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzdHJ1Y3QgYmlvICpiaW8pCkBAIC0xMTEsNiArMjQzLDI1IEBACiAJCWJpby0+Ymlfc2VjdG9yID0gZmxha2V5X21hcF9zZWN0b3IodGksIGJpby0+Ymlfc2VjdG9yKTsKIH0KIAorc3RhdGljIHZvaWQgY29ycnVwdF9iaW9fZGF0YShzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBmbGFrZXlfYyAqZmMpCit7CisJdW5zaWduZWQgYmlvX2J5dGVzID0gYmlvX2N1cl9ieXRlcyhiaW8pOworCWNoYXIgKmRhdGEgPSBiaW9fZGF0YShiaW8pOworCisJLyoKKwkgKiBPdmVyd3JpdGUgdGhlIE50aCBieXRlIG9mIHRoZSBkYXRhIHJldHVybmVkLgorCSAqLworCWlmIChkYXRhICYmIGJpb19ieXRlcyA+PSBmYy0+Y29ycnVwdF9iaW9fYnl0ZSkgeworCQlkYXRhW2ZjLT5jb3JydXB0X2Jpb19ieXRlIC0gMV0gPSBmYy0+Y29ycnVwdF9iaW9fdmFsdWU7CisKKwkJRE1ERUJVRygiQ29ycnVwdGluZyBkYXRhIGJpbz0lcCBieSB3cml0aW5nICV1IHRvIGJ5dGUgJXUgIgorCQkJIihydz0lYyBiaV9ydz0lbHUgYmlfc2VjdG9yPSVsbHUgY3VyX2J5dGVzPSV1KVxuIiwKKwkJCWJpbywgZmMtPmNvcnJ1cHRfYmlvX3ZhbHVlLCBmYy0+Y29ycnVwdF9iaW9fYnl0ZSwKKwkJCShiaW9fZGF0YV9kaXIoYmlvKSA9PSBXUklURSkgPyAndycgOiAncicsCisJCQliaW8tPmJpX3J3LCAodW5zaWduZWQgbG9uZyBsb25nKWJpby0+Ymlfc2VjdG9yLCBiaW9fYnl0ZXMpOworCX0KK30KKwogc3RhdGljIGludCBmbGFrZXlfbWFwKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzdHJ1Y3QgYmlvICpiaW8sCiAJCSAgICAgIHVuaW9uIG1hcF9pbmZvICptYXBfY29udGV4dCkKIHsKQEAgLTExOSwxOCArMjcwLDcxIEBACiAKIAkvKiBBcmUgd2UgYWxpdmUgPyAqLwogCWVsYXBzZWQgPSAoamlmZmllcyAtIGZjLT5zdGFydF90aW1lKSAvIEhaOwotCWlmIChlbGFwc2VkICUgKGZjLT51cF9pbnRlcnZhbCArIGZjLT5kb3duX2ludGVydmFsKSA+PSBmYy0+dXBfaW50ZXJ2YWwpCi0JCXJldHVybiAtRUlPOworCWlmIChlbGFwc2VkICUgKGZjLT51cF9pbnRlcnZhbCArIGZjLT5kb3duX2ludGVydmFsKSA+PSBmYy0+dXBfaW50ZXJ2YWwpIHsKKwkJLyoKKwkJICogRmxhZyB0aGlzIGJpbyBhcyBzdWJtaXR0ZWQgd2hpbGUgZG93bi4KKwkJICovCisJCW1hcF9jb250ZXh0LT5sbCA9IDE7CiAKKwkJLyoKKwkJICogTWFwIHJlYWRzIGFzIG5vcm1hbC4KKwkJICovCisJCWlmIChiaW9fZGF0YV9kaXIoYmlvKSA9PSBSRUFEKQorCQkJZ290byBtYXBfYmlvOworCisJCS8qCisJCSAqIERyb3Agd3JpdGVzPworCQkgKi8KKwkJaWYgKHRlc3RfYml0KERST1BfV1JJVEVTLCAmZmMtPmZsYWdzKSkgeworCQkJYmlvX2VuZGlvKGJpbywgMCk7CisJCQlyZXR1cm4gRE1fTUFQSU9fU1VCTUlUVEVEOworCQl9CisKKwkJLyoKKwkJICogQ29ycnVwdCBtYXRjaGluZyB3cml0ZXMuCisJCSAqLworCQlpZiAoZmMtPmNvcnJ1cHRfYmlvX2J5dGUgJiYgKGZjLT5jb3JydXB0X2Jpb19ydyA9PSBXUklURSkpIHsKKwkJCWlmIChhbGxfY29ycnVwdF9iaW9fZmxhZ3NfbWF0Y2goYmlvLCBmYykpCisJCQkJY29ycnVwdF9iaW9fZGF0YShiaW8sIGZjKTsKKwkJCWdvdG8gbWFwX2JpbzsKKwkJfQorCisJCS8qCisJCSAqIEJ5IGRlZmF1bHQsIGVycm9yIGFsbCBJL08uCisJCSAqLworCQlyZXR1cm4gLUVJTzsKKwl9CisKK21hcF9iaW86CiAJZmxha2V5X21hcF9iaW8odGksIGJpbyk7CiAKIAlyZXR1cm4gRE1fTUFQSU9fUkVNQVBQRUQ7CiB9CiAKK3N0YXRpYyBpbnQgZmxha2V5X2VuZF9pbyhzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IGJpbyAqYmlvLAorCQkJIGludCBlcnJvciwgdW5pb24gbWFwX2luZm8gKm1hcF9jb250ZXh0KQoreworCXN0cnVjdCBmbGFrZXlfYyAqZmMgPSB0aS0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBiaW9fc3VibWl0dGVkX3doaWxlX2Rvd24gPSBtYXBfY29udGV4dC0+bGw7CisKKwkvKgorCSAqIENvcnJ1cHQgc3VjY2Vzc2Z1bCBSRUFEcyB3aGlsZSBpbiBkb3duIHN0YXRlLgorCSAqIElmIGZsYWdzIHdlcmUgc3BlY2lmaWVkLCBvbmx5IGNvcnJ1cHQgdGhvc2UgdGhhdCBtYXRjaC4KKwkgKi8KKwlpZiAoIWVycm9yICYmIGJpb19zdWJtaXR0ZWRfd2hpbGVfZG93biAmJgorCSAgICAoYmlvX2RhdGFfZGlyKGJpbykgPT0gUkVBRCkgJiYgKGZjLT5jb3JydXB0X2Jpb19ydyA9PSBSRUFEKSAmJgorCSAgICBhbGxfY29ycnVwdF9iaW9fZmxhZ3NfbWF0Y2goYmlvLCBmYykpCisJCWNvcnJ1cHRfYmlvX2RhdGEoYmlvLCBmYyk7CisKKwlyZXR1cm4gZXJyb3I7Cit9CisKIHN0YXRpYyBpbnQgZmxha2V5X3N0YXR1cyhzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RhdHVzX3R5cGVfdCB0eXBlLAogCQkJIGNoYXIgKnJlc3VsdCwgdW5zaWduZWQgaW50IG1heGxlbikKIHsKKwl1bnNpZ25lZCBzeiA9IDA7CiAJc3RydWN0IGZsYWtleV9jICpmYyA9IHRpLT5wcml2YXRlOworCXVuc2lnbmVkIGRyb3Bfd3JpdGVzOwogCiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBTVEFUVVNUWVBFX0lORk86CkBAIC0xMzgsOSArMzQyLDIyIEBACiAJCWJyZWFrOwogCiAJY2FzZSBTVEFUVVNUWVBFX1RBQkxFOgotCQlzbnByaW50ZihyZXN1bHQsIG1heGxlbiwgIiVzICVsbHUgJXUgJXUiLCBmYy0+ZGV2LT5uYW1lLAotCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpZmMtPnN0YXJ0LCBmYy0+dXBfaW50ZXJ2YWwsCi0JCQkgZmMtPmRvd25faW50ZXJ2YWwpOworCQlETUVNSVQoIiVzICVsbHUgJXUgJXUgIiwgZmMtPmRldi0+bmFtZSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZmMtPnN0YXJ0LCBmYy0+dXBfaW50ZXJ2YWwsCisJCSAgICAgICBmYy0+ZG93bl9pbnRlcnZhbCk7CisKKwkJZHJvcF93cml0ZXMgPSB0ZXN0X2JpdChEUk9QX1dSSVRFUywgJmZjLT5mbGFncyk7CisJCURNRU1JVCgiJXUgIiwgZHJvcF93cml0ZXMgKyAoZmMtPmNvcnJ1cHRfYmlvX2J5dGUgPiAwKSAqIDUpOworCisJCWlmIChkcm9wX3dyaXRlcykKKwkJCURNRU1JVCgiZHJvcF93cml0ZXMgIik7CisKKwkJaWYgKGZjLT5jb3JydXB0X2Jpb19ieXRlKQorCQkJRE1FTUlUKCJjb3JydXB0X2Jpb19ieXRlICV1ICVjICV1ICV1ICIsCisJCQkgICAgICAgZmMtPmNvcnJ1cHRfYmlvX2J5dGUsCisJCQkgICAgICAgKGZjLT5jb3JydXB0X2Jpb19ydyA9PSBXUklURSkgPyAndycgOiAncicsCisJCQkgICAgICAgZmMtPmNvcnJ1cHRfYmlvX3ZhbHVlLCBmYy0+Y29ycnVwdF9iaW9fZmxhZ3MpOworCiAJCWJyZWFrOwogCX0KIAlyZXR1cm4gMDsKQEAgLTE3NywxMSArMzk0LDEyIEBACiAKIHN0YXRpYyBzdHJ1Y3QgdGFyZ2V0X3R5cGUgZmxha2V5X3RhcmdldCA9IHsKIAkubmFtZSAgID0gImZsYWtleSIsCi0JLnZlcnNpb24gPSB7MSwgMSwgMH0sCisJLnZlcnNpb24gPSB7MSwgMiwgMH0sCiAJLm1vZHVsZSA9IFRISVNfTU9EVUxFLAogCS5jdHIgICAgPSBmbGFrZXlfY3RyLAogCS5kdHIgICAgPSBmbGFrZXlfZHRyLAogCS5tYXAgICAgPSBmbGFrZXlfbWFwLAorCS5lbmRfaW8gPSBmbGFrZXlfZW5kX2lvLAogCS5zdGF0dXMgPSBmbGFrZXlfc3RhdHVzLAogCS5pb2N0bAk9IGZsYWtleV9pb2N0bCwKIAkubWVyZ2UJPSBmbGFrZXlfbWVyZ2UsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWlvLmMgYi9kcml2ZXJzL21kL2RtLWlvLmMKaW5kZXggMjA2NzI4OC4uYWQyZWJhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1pby5jCisrKyBiL2RyaXZlcnMvbWQvZG0taW8uYwpAQCAtMzgsNiArMzgsOCBAQAogCXN0cnVjdCBkbV9pb19jbGllbnQgKmNsaWVudDsKIAlpb19ub3RpZnlfZm4gY2FsbGJhY2s7CiAJdm9pZCAqY29udGV4dDsKKwl2b2lkICp2bWFfaW52YWxpZGF0ZV9hZGRyZXNzOworCXVuc2lnbmVkIGxvbmcgdm1hX2ludmFsaWRhdGVfc2l6ZTsKIH0gX19hdHRyaWJ1dGVfXygoYWxpZ25lZChETV9JT19NQVhfUkVHSU9OUykpKTsKIAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpfZG1faW9fY2FjaGU7CkBAIC0xMTYsNiArMTE4LDEwIEBACiAJCXNldF9iaXQocmVnaW9uLCAmaW8tPmVycm9yX2JpdHMpOwogCiAJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmlvLT5jb3VudCkpIHsKKwkJaWYgKGlvLT52bWFfaW52YWxpZGF0ZV9zaXplKQorCQkJaW52YWxpZGF0ZV9rZXJuZWxfdm1hcF9yYW5nZShpby0+dm1hX2ludmFsaWRhdGVfYWRkcmVzcywKKwkJCQkJCSAgICAgaW8tPnZtYV9pbnZhbGlkYXRlX3NpemUpOworCiAJCWlmIChpby0+c2xlZXBlcikKIAkJCXdha2VfdXBfcHJvY2Vzcyhpby0+c2xlZXBlcik7CiAKQEAgLTE1OSw2ICsxNjUsOSBAQAogCiAJdW5zaWduZWQgY29udGV4dF91OwogCXZvaWQgKmNvbnRleHRfcHRyOworCisJdm9pZCAqdm1hX2ludmFsaWRhdGVfYWRkcmVzczsKKwl1bnNpZ25lZCBsb25nIHZtYV9pbnZhbGlkYXRlX3NpemU7CiB9OwogCiAvKgpAQCAtMzc3LDYgKzM4Niw5IEBACiAJaW8tPnNsZWVwZXIgPSBjdXJyZW50OwogCWlvLT5jbGllbnQgPSBjbGllbnQ7CiAKKwlpby0+dm1hX2ludmFsaWRhdGVfYWRkcmVzcyA9IGRwLT52bWFfaW52YWxpZGF0ZV9hZGRyZXNzOworCWlvLT52bWFfaW52YWxpZGF0ZV9zaXplID0gZHAtPnZtYV9pbnZhbGlkYXRlX3NpemU7CisKIAlkaXNwYXRjaF9pbyhydywgbnVtX3JlZ2lvbnMsIHdoZXJlLCBkcCwgaW8sIDEpOwogCiAJd2hpbGUgKDEpIHsKQEAgLTQxNSwxMyArNDI3LDIxIEBACiAJaW8tPmNhbGxiYWNrID0gZm47CiAJaW8tPmNvbnRleHQgPSBjb250ZXh0OwogCisJaW8tPnZtYV9pbnZhbGlkYXRlX2FkZHJlc3MgPSBkcC0+dm1hX2ludmFsaWRhdGVfYWRkcmVzczsKKwlpby0+dm1hX2ludmFsaWRhdGVfc2l6ZSA9IGRwLT52bWFfaW52YWxpZGF0ZV9zaXplOworCiAJZGlzcGF0Y2hfaW8ocncsIG51bV9yZWdpb25zLCB3aGVyZSwgZHAsIGlvLCAwKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBkcF9pbml0KHN0cnVjdCBkbV9pb19yZXF1ZXN0ICppb19yZXEsIHN0cnVjdCBkcGFnZXMgKmRwKQorc3RhdGljIGludCBkcF9pbml0KHN0cnVjdCBkbV9pb19yZXF1ZXN0ICppb19yZXEsIHN0cnVjdCBkcGFnZXMgKmRwLAorCQkgICB1bnNpZ25lZCBsb25nIHNpemUpCiB7CiAJLyogU2V0IHVwIGRwYWdlcyBiYXNlZCBvbiBtZW1vcnkgdHlwZSAqLworCisJZHAtPnZtYV9pbnZhbGlkYXRlX2FkZHJlc3MgPSBOVUxMOworCWRwLT52bWFfaW52YWxpZGF0ZV9zaXplID0gMDsKKwogCXN3aXRjaCAoaW9fcmVxLT5tZW0udHlwZSkgewogCWNhc2UgRE1fSU9fUEFHRV9MSVNUOgogCQlsaXN0X2RwX2luaXQoZHAsIGlvX3JlcS0+bWVtLnB0ci5wbCwgaW9fcmVxLT5tZW0ub2Zmc2V0KTsKQEAgLTQzMiw2ICs0NTIsMTEgQEAKIAkJYnJlYWs7CiAKIAljYXNlIERNX0lPX1ZNQToKKwkJZmx1c2hfa2VybmVsX3ZtYXBfcmFuZ2UoaW9fcmVxLT5tZW0ucHRyLnZtYSwgc2l6ZSk7CisJCWlmICgoaW9fcmVxLT5iaV9ydyAmIFJXX01BU0spID09IFJFQUQpIHsKKwkJCWRwLT52bWFfaW52YWxpZGF0ZV9hZGRyZXNzID0gaW9fcmVxLT5tZW0ucHRyLnZtYTsKKwkJCWRwLT52bWFfaW52YWxpZGF0ZV9zaXplID0gc2l6ZTsKKwkJfQogCQl2bV9kcF9pbml0KGRwLCBpb19yZXEtPm1lbS5wdHIudm1hKTsKIAkJYnJlYWs7CiAKQEAgLTQ2MCw3ICs0ODUsNyBAQAogCWludCByOwogCXN0cnVjdCBkcGFnZXMgZHA7CiAKLQlyID0gZHBfaW5pdChpb19yZXEsICZkcCk7CisJciA9IGRwX2luaXQoaW9fcmVxLCAmZHAsICh1bnNpZ25lZCBsb25nKXdoZXJlLT5jb3VudCA8PCBTRUNUT1JfU0hJRlQpOwogCWlmIChyKQogCQlyZXR1cm4gcjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1pb2N0bC5jIGIvZHJpdmVycy9tZC9kbS1pb2N0bC5jCmluZGV4IDRjYWNkYWQuLjJlOWEzY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0taW9jdGwuYworKysgYi9kcml2ZXJzL21kL2RtLWlvY3RsLmMKQEAgLTEyOCw2ICsxMjgsMjQgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIHN0cnVjdCBoYXNoX2NlbGwgKl9fZ2V0X2Rldl9jZWxsKHVpbnQ2NF90IGRldikKK3sKKwlzdHJ1Y3QgbWFwcGVkX2RldmljZSAqbWQ7CisJc3RydWN0IGhhc2hfY2VsbCAqaGM7CisKKwltZCA9IGRtX2dldF9tZChodWdlX2RlY29kZV9kZXYoZGV2KSk7CisJaWYgKCFtZCkKKwkJcmV0dXJuIE5VTEw7CisKKwloYyA9IGRtX2dldF9tZHB0cihtZCk7CisJaWYgKCFoYykgeworCQlkbV9wdXQobWQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gaGM7Cit9CisKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEluc2VydGluZywgcmVtb3ZpbmcgYW5kIHJlbmFtaW5nIGEgZGV2aWNlLgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtNzE4LDI1ICs3MzYsNDUgQEAKICAqLwogc3RhdGljIHN0cnVjdCBoYXNoX2NlbGwgKl9fZmluZF9kZXZpY2VfaGFzaF9jZWxsKHN0cnVjdCBkbV9pb2N0bCAqcGFyYW0pCiB7Ci0Jc3RydWN0IG1hcHBlZF9kZXZpY2UgKm1kOwotCXZvaWQgKm1kcHRyID0gTlVMTDsKKwlzdHJ1Y3QgaGFzaF9jZWxsICpoYyA9IE5VTEw7CiAKLQlpZiAoKnBhcmFtLT51dWlkKQotCQlyZXR1cm4gX19nZXRfdXVpZF9jZWxsKHBhcmFtLT51dWlkKTsKKwlpZiAoKnBhcmFtLT51dWlkKSB7CisJCWlmICgqcGFyYW0tPm5hbWUgfHwgcGFyYW0tPmRldikKKwkJCXJldHVybiBOVUxMOwogCi0JaWYgKCpwYXJhbS0+bmFtZSkKLQkJcmV0dXJuIF9fZ2V0X25hbWVfY2VsbChwYXJhbS0+bmFtZSk7CisJCWhjID0gX19nZXRfdXVpZF9jZWxsKHBhcmFtLT51dWlkKTsKKwkJaWYgKCFoYykKKwkJCXJldHVybiBOVUxMOworCX0gZWxzZSBpZiAoKnBhcmFtLT5uYW1lKSB7CisJCWlmIChwYXJhbS0+ZGV2KQorCQkJcmV0dXJuIE5VTEw7CiAKLQltZCA9IGRtX2dldF9tZChodWdlX2RlY29kZV9kZXYocGFyYW0tPmRldikpOwotCWlmICghbWQpCi0JCWdvdG8gb3V0OworCQloYyA9IF9fZ2V0X25hbWVfY2VsbChwYXJhbS0+bmFtZSk7CisJCWlmICghaGMpCisJCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UgaWYgKHBhcmFtLT5kZXYpIHsKKwkJaGMgPSBfX2dldF9kZXZfY2VsbChwYXJhbS0+ZGV2KTsKKwkJaWYgKCFoYykKKwkJCXJldHVybiBOVUxMOworCX0gZWxzZQorCQlyZXR1cm4gTlVMTDsKIAotCW1kcHRyID0gZG1fZ2V0X21kcHRyKG1kKTsKLQlpZiAoIW1kcHRyKQotCQlkbV9wdXQobWQpOworCS8qCisJICogU25lYWtpbHkgd3JpdGUgaW4gYm90aCB0aGUgbmFtZSBhbmQgdGhlIHV1aWQKKwkgKiB3aGlsZSB3ZSBoYXZlIHRoZSBjZWxsLgorCSAqLworCXN0cmxjcHkocGFyYW0tPm5hbWUsIGhjLT5uYW1lLCBzaXplb2YocGFyYW0tPm5hbWUpKTsKKwlpZiAoaGMtPnV1aWQpCisJCXN0cmxjcHkocGFyYW0tPnV1aWQsIGhjLT51dWlkLCBzaXplb2YocGFyYW0tPnV1aWQpKTsKKwllbHNlCisJCXBhcmFtLT51dWlkWzBdID0gJ1wwJzsKIAotb3V0OgotCXJldHVybiBtZHB0cjsKKwlpZiAoaGMtPm5ld19tYXApCisJCXBhcmFtLT5mbGFncyB8PSBETV9JTkFDVElWRV9QUkVTRU5UX0ZMQUc7CisJZWxzZQorCQlwYXJhbS0+ZmxhZ3MgJj0gfkRNX0lOQUNUSVZFX1BSRVNFTlRfRkxBRzsKKworCXJldHVybiBoYzsKIH0KIAogc3RhdGljIHN0cnVjdCBtYXBwZWRfZGV2aWNlICpmaW5kX2RldmljZShzdHJ1Y3QgZG1faW9jdGwgKnBhcmFtKQpAQCAtNzQ2LDI0ICs3ODQsOCBAQAogCiAJZG93bl9yZWFkKCZfaGFzaF9sb2NrKTsKIAloYyA9IF9fZmluZF9kZXZpY2VfaGFzaF9jZWxsKHBhcmFtKTsKLQlpZiAoaGMpIHsKKwlpZiAoaGMpCiAJCW1kID0gaGMtPm1kOwotCi0JCS8qCi0JCSAqIFNuZWFraWx5IHdyaXRlIGluIGJvdGggdGhlIG5hbWUgYW5kIHRoZSB1dWlkCi0JCSAqIHdoaWxlIHdlIGhhdmUgdGhlIGNlbGwuCi0JCSAqLwotCQlzdHJsY3B5KHBhcmFtLT5uYW1lLCBoYy0+bmFtZSwgc2l6ZW9mKHBhcmFtLT5uYW1lKSk7Ci0JCWlmIChoYy0+dXVpZCkKLQkJCXN0cmxjcHkocGFyYW0tPnV1aWQsIGhjLT51dWlkLCBzaXplb2YocGFyYW0tPnV1aWQpKTsKLQkJZWxzZQotCQkJcGFyYW0tPnV1aWRbMF0gPSAnXDAnOwotCi0JCWlmIChoYy0+bmV3X21hcCkKLQkJCXBhcmFtLT5mbGFncyB8PSBETV9JTkFDVElWRV9QUkVTRU5UX0ZMQUc7Ci0JCWVsc2UKLQkJCXBhcmFtLT5mbGFncyAmPSB+RE1fSU5BQ1RJVkVfUFJFU0VOVF9GTEFHOwotCX0KIAl1cF9yZWFkKCZfaGFzaF9sb2NrKTsKIAogCXJldHVybiBtZDsKQEAgLTE0MDIsNiArMTQyNCwxMSBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlpZiAoIWFyZ2MpIHsKKwkJRE1XQVJOKCJFbXB0eSBtZXNzYWdlIHJlY2VpdmVkLiIpOworCQlnb3RvIG91dDsKKwl9CisKIAl0YWJsZSA9IGRtX2dldF9saXZlX3RhYmxlKG1kKTsKIAlpZiAoIXRhYmxlKQogCQlnb3RvIG91dF9hcmd2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1rY29weWQuYyBiL2RyaXZlcnMvbWQvZG0ta2NvcHlkLmMKaW5kZXggMzIwNDAxZC4uZjgyMTQ3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1rY29weWQuYworKysgYi9kcml2ZXJzL21kL2RtLWtjb3B5ZC5jCkBAIC0yMjQsOCArMjI0LDYgQEAKIAl1bnNpZ25lZCBpbnQgbnVtX2Rlc3RzOwogCXN0cnVjdCBkbV9pb19yZWdpb24gZGVzdHNbRE1fS0NPUFlEX01BWF9SRUdJT05TXTsKIAotCXNlY3Rvcl90IG9mZnNldDsKLQl1bnNpZ25lZCBpbnQgbnJfcGFnZXM7CiAJc3RydWN0IHBhZ2VfbGlzdCAqcGFnZXM7CiAKIAkvKgpAQCAtMzgwLDcgKzM3OCw3IEBACiAJCS5iaV9ydyA9IGpvYi0+cncsCiAJCS5tZW0udHlwZSA9IERNX0lPX1BBR0VfTElTVCwKIAkJLm1lbS5wdHIucGwgPSBqb2ItPnBhZ2VzLAotCQkubWVtLm9mZnNldCA9IGpvYi0+b2Zmc2V0LAorCQkubWVtLm9mZnNldCA9IDAsCiAJCS5ub3RpZnkuZm4gPSBjb21wbGV0ZV9pbywKIAkJLm5vdGlmeS5jb250ZXh0ID0gam9iLAogCQkuY2xpZW50ID0gam9iLT5rYy0+aW9fY2xpZW50LApAQCAtMzk3LDEwICszOTUsOSBAQAogc3RhdGljIGludCBydW5fcGFnZXNfam9iKHN0cnVjdCBrY29weWRfam9iICpqb2IpCiB7CiAJaW50IHI7CisJdW5zaWduZWQgbnJfcGFnZXMgPSBkbV9kaXZfdXAoam9iLT5kZXN0c1swXS5jb3VudCwgUEFHRV9TSVpFID4+IDkpOwogCi0Jam9iLT5ucl9wYWdlcyA9IGRtX2Rpdl91cChqb2ItPmRlc3RzWzBdLmNvdW50ICsgam9iLT5vZmZzZXQsCi0JCQkJICBQQUdFX1NJWkUgPj4gOSk7Ci0JciA9IGtjb3B5ZF9nZXRfcGFnZXMoam9iLT5rYywgam9iLT5ucl9wYWdlcywgJmpvYi0+cGFnZXMpOworCXIgPSBrY29weWRfZ2V0X3BhZ2VzKGpvYi0+a2MsIG5yX3BhZ2VzLCAmam9iLT5wYWdlcyk7CiAJaWYgKCFyKSB7CiAJCS8qIHRoaXMgam9iIGlzIHJlYWR5IGZvciBpbyAqLwogCQlwdXNoKCZqb2ItPmtjLT5pb19qb2JzLCBqb2IpOwpAQCAtNjAyLDggKzU5OSw2IEBACiAJam9iLT5udW1fZGVzdHMgPSBudW1fZGVzdHM7CiAJbWVtY3B5KCZqb2ItPmRlc3RzLCBkZXN0cywgc2l6ZW9mKCpkZXN0cykgKiBudW1fZGVzdHMpOwogCi0Jam9iLT5vZmZzZXQgPSAwOwotCWpvYi0+bnJfcGFnZXMgPSAwOwogCWpvYi0+cGFnZXMgPSBOVUxMOwogCiAJam9iLT5mbiA9IGZuOwpAQCAtNjIyLDYgKzYxNywzNyBAQAogfQogRVhQT1JUX1NZTUJPTChkbV9rY29weWRfY29weSk7CiAKK3ZvaWQgKmRtX2tjb3B5ZF9wcmVwYXJlX2NhbGxiYWNrKHN0cnVjdCBkbV9rY29weWRfY2xpZW50ICprYywKKwkJCQkgZG1fa2NvcHlkX25vdGlmeV9mbiBmbiwgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3Qga2NvcHlkX2pvYiAqam9iOworCisJam9iID0gbWVtcG9vbF9hbGxvYyhrYy0+am9iX3Bvb2wsIEdGUF9OT0lPKTsKKworCW1lbXNldChqb2IsIDAsIHNpemVvZihzdHJ1Y3Qga2NvcHlkX2pvYikpOworCWpvYi0+a2MgPSBrYzsKKwlqb2ItPmZuID0gZm47CisJam9iLT5jb250ZXh0ID0gY29udGV4dDsKKworCWF0b21pY19pbmMoJmtjLT5ucl9qb2JzKTsKKworCXJldHVybiBqb2I7Cit9CitFWFBPUlRfU1lNQk9MKGRtX2tjb3B5ZF9wcmVwYXJlX2NhbGxiYWNrKTsKKwordm9pZCBkbV9rY29weWRfZG9fY2FsbGJhY2sodm9pZCAqaiwgaW50IHJlYWRfZXJyLCB1bnNpZ25lZCBsb25nIHdyaXRlX2VycikKK3sKKwlzdHJ1Y3Qga2NvcHlkX2pvYiAqam9iID0gajsKKwlzdHJ1Y3QgZG1fa2NvcHlkX2NsaWVudCAqa2MgPSBqb2ItPmtjOworCisJam9iLT5yZWFkX2VyciA9IHJlYWRfZXJyOworCWpvYi0+d3JpdGVfZXJyID0gd3JpdGVfZXJyOworCisJcHVzaCgma2MtPmNvbXBsZXRlX2pvYnMsIGpvYik7CisJd2FrZShrYyk7Cit9CitFWFBPUlRfU1lNQk9MKGRtX2tjb3B5ZF9kb19jYWxsYmFjayk7CisKIC8qCiAgKiBDYW5jZWxzIGEga2NvcHlkIGpvYiwgZWcuIHNvbWVvbmUgbWlnaHQgYmUgZGVhY3RpdmF0aW5nIGEKICAqIG1pcnJvci4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tbG9nLXVzZXJzcGFjZS1iYXNlLmMgYi9kcml2ZXJzL21kL2RtLWxvZy11c2Vyc3BhY2UtYmFzZS5jCmluZGV4IGFhMmUwYzMuLjEwMjFjODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tbG9nLXVzZXJzcGFjZS1iYXNlLmMKKysrIGIvZHJpdmVycy9tZC9kbS1sb2ctdXNlcnNwYWNlLWJhc2UuYwpAQCAtMzk0LDggKzM5NCw3IEBACiAJCQlncm91cFtjb3VudF0gPSBmZS0+cmVnaW9uOwogCQkJY291bnQrKzsKIAotCQkJbGlzdF9kZWwoJmZlLT5saXN0KTsKLQkJCWxpc3RfYWRkKCZmZS0+bGlzdCwgJnRtcF9saXN0KTsKKwkJCWxpc3RfbW92ZSgmZmUtPmxpc3QsICZ0bXBfbGlzdCk7CiAKIAkJCXR5cGUgPSBmZS0+dHlwZTsKIAkJCWlmIChjb3VudCA+PSBNQVhfRkxVU0hfR1JPVVBfQ09VTlQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLWxvZy5jIGIvZHJpdmVycy9tZC9kbS1sb2cuYwppbmRleCA5NDhlM2Y0Li4zYjUyYmI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLWxvZy5jCisrKyBiL2RyaXZlcnMvbWQvZG0tbG9nLmMKQEAgLTE5NywxNSArMTk3LDIxIEBACiAjZGVmaW5lIE1JUlJPUl9ESVNLX1ZFUlNJT04gMgogI2RlZmluZSBMT0dfT0ZGU0VUIDIKIAotc3RydWN0IGxvZ19oZWFkZXIgewotCXVpbnQzMl90IG1hZ2ljOworc3RydWN0IGxvZ19oZWFkZXJfZGlzayB7CisJX19sZTMyIG1hZ2ljOwogCiAJLyoKIAkgKiBTaW1wbGUsIGluY3JlbWVudGluZyB2ZXJzaW9uLiBubyBiYWNrd2FyZAogCSAqIGNvbXBhdGliaWxpdHkuCiAJICovCisJX19sZTMyIHZlcnNpb247CisJX19sZTY0IG5yX3JlZ2lvbnM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgbG9nX2hlYWRlcl9jb3JlIHsKKwl1aW50MzJfdCBtYWdpYzsKIAl1aW50MzJfdCB2ZXJzaW9uOwotCXNlY3Rvcl90IG5yX3JlZ2lvbnM7CisJdWludDY0X3QgbnJfcmVnaW9uczsKIH07CiAKIHN0cnVjdCBsb2dfYyB7CkBAIC0yMzksMTAgKzI0NSwxMCBAQAogCWludCBsb2dfZGV2X2ZhaWxlZDsKIAlpbnQgbG9nX2Rldl9mbHVzaF9mYWlsZWQ7CiAJc3RydWN0IGRtX2RldiAqbG9nX2RldjsKLQlzdHJ1Y3QgbG9nX2hlYWRlciBoZWFkZXI7CisJc3RydWN0IGxvZ19oZWFkZXJfY29yZSBoZWFkZXI7CiAKIAlzdHJ1Y3QgZG1faW9fcmVnaW9uIGhlYWRlcl9sb2NhdGlvbjsKLQlzdHJ1Y3QgbG9nX2hlYWRlciAqZGlza19oZWFkZXI7CisJc3RydWN0IGxvZ19oZWFkZXJfZGlzayAqZGlza19oZWFkZXI7CiB9OwogCiAvKgpAQCAtMjUxLDM0ICsyNTcsMzQgQEAKICAqLwogc3RhdGljIGlubGluZSBpbnQgbG9nX3Rlc3RfYml0KHVpbnQzMl90ICpicywgdW5zaWduZWQgYml0KQogewotCXJldHVybiB0ZXN0X2JpdF9sZShiaXQsICh1bnNpZ25lZCBsb25nICopIGJzKSA/IDEgOiAwOworCXJldHVybiB0ZXN0X2JpdF9sZShiaXQsIGJzKSA/IDEgOiAwOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbG9nX3NldF9iaXQoc3RydWN0IGxvZ19jICpsLAogCQkJICAgICAgIHVpbnQzMl90ICpicywgdW5zaWduZWQgYml0KQogewotCV9fdGVzdF9hbmRfc2V0X2JpdF9sZShiaXQsICh1bnNpZ25lZCBsb25nICopIGJzKTsKKwlfX3NldF9iaXRfbGUoYml0LCBicyk7CiAJbC0+dG91Y2hlZF9jbGVhbmVkID0gMTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGxvZ19jbGVhcl9iaXQoc3RydWN0IGxvZ19jICpsLAogCQkJCSB1aW50MzJfdCAqYnMsIHVuc2lnbmVkIGJpdCkKIHsKLQlfX3Rlc3RfYW5kX2NsZWFyX2JpdF9sZShiaXQsICh1bnNpZ25lZCBsb25nICopIGJzKTsKKwlfX2NsZWFyX2JpdF9sZShiaXQsIGJzKTsKIAlsLT50b3VjaGVkX2RpcnRpZWQgPSAxOwogfQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqIEhlYWRlciBJTwogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgdm9pZCBoZWFkZXJfdG9fZGlzayhzdHJ1Y3QgbG9nX2hlYWRlciAqY29yZSwgc3RydWN0IGxvZ19oZWFkZXIgKmRpc2spCitzdGF0aWMgdm9pZCBoZWFkZXJfdG9fZGlzayhzdHJ1Y3QgbG9nX2hlYWRlcl9jb3JlICpjb3JlLCBzdHJ1Y3QgbG9nX2hlYWRlcl9kaXNrICpkaXNrKQogewogCWRpc2stPm1hZ2ljID0gY3B1X3RvX2xlMzIoY29yZS0+bWFnaWMpOwogCWRpc2stPnZlcnNpb24gPSBjcHVfdG9fbGUzMihjb3JlLT52ZXJzaW9uKTsKIAlkaXNrLT5ucl9yZWdpb25zID0gY3B1X3RvX2xlNjQoY29yZS0+bnJfcmVnaW9ucyk7CiB9CiAKLXN0YXRpYyB2b2lkIGhlYWRlcl9mcm9tX2Rpc2soc3RydWN0IGxvZ19oZWFkZXIgKmNvcmUsIHN0cnVjdCBsb2dfaGVhZGVyICpkaXNrKQorc3RhdGljIHZvaWQgaGVhZGVyX2Zyb21fZGlzayhzdHJ1Y3QgbG9nX2hlYWRlcl9jb3JlICpjb3JlLCBzdHJ1Y3QgbG9nX2hlYWRlcl9kaXNrICpkaXNrKQogewogCWNvcmUtPm1hZ2ljID0gbGUzMl90b19jcHUoZGlzay0+bWFnaWMpOwogCWNvcmUtPnZlcnNpb24gPSBsZTMyX3RvX2NwdShkaXNrLT52ZXJzaW9uKTsKQEAgLTQ4Niw3ICs0OTIsNyBAQAogCW1lbXNldChsYy0+c3luY19iaXRzLCAoc3luYyA9PSBOT1NZTkMpID8gLTEgOiAwLCBiaXRzZXRfc2l6ZSk7CiAJbGMtPnN5bmNfY291bnQgPSAoc3luYyA9PSBOT1NZTkMpID8gcmVnaW9uX2NvdW50IDogMDsKIAotCWxjLT5yZWNvdmVyaW5nX2JpdHMgPSB2bWFsbG9jKGJpdHNldF9zaXplKTsKKwlsYy0+cmVjb3ZlcmluZ19iaXRzID0gdnphbGxvYyhiaXRzZXRfc2l6ZSk7CiAJaWYgKCFsYy0+cmVjb3ZlcmluZ19iaXRzKSB7CiAJCURNV0FSTigiY291bGRuJ3QgYWxsb2NhdGUgc3luYyBiaXRzZXQiKTsKIAkJdmZyZWUobGMtPnN5bmNfYml0cyk7CkBAIC00OTgsNyArNTA0LDYgQEAKIAkJa2ZyZWUobGMpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JbWVtc2V0KGxjLT5yZWNvdmVyaW5nX2JpdHMsIDAsIGJpdHNldF9zaXplKTsKIAlsYy0+c3luY19zZWFyY2ggPSAwOwogCWxvZy0+Y29udGV4dCA9IGxjOwogCkBAIC03MzksOCArNzQ0LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlkbyB7Ci0JCSpyZWdpb24gPSBmaW5kX25leHRfemVyb19iaXRfbGUoCi0JCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcgKikgbGMtPnN5bmNfYml0cywKKwkJKnJlZ2lvbiA9IGZpbmRfbmV4dF96ZXJvX2JpdF9sZShsYy0+c3luY19iaXRzLAogCQkJCQkgICAgIGxjLT5yZWdpb25fY291bnQsCiAJCQkJCSAgICAgbGMtPnN5bmNfc2VhcmNoKTsKIAkJbGMtPnN5bmNfc2VhcmNoID0gKnJlZ2lvbiArIDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLW1wYXRoLmMgYi9kcml2ZXJzL21kL2RtLW1wYXRoLmMKaW5kZXggYzM1NDcwMS4uNWUwMDkwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS1tcGF0aC5jCisrKyBiL2RyaXZlcnMvbWQvZG0tbXBhdGguYwpAQCAtMjIsNyArMjIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgogCiAjZGVmaW5lIERNX01TR19QUkVGSVggIm11bHRpcGF0aCIKLSNkZWZpbmUgTUVTR19TVFIoeCkgeCwgc2l6ZW9mKHgpCiAjZGVmaW5lIERNX1BHX0lOSVRfREVMQVlfTVNFQ1MgMjAwMAogI2RlZmluZSBETV9QR19JTklUX0RFTEFZX0RFRkFVTFQgKCh1bnNpZ25lZCkgLTEpCiAKQEAgLTUwNSw4MCArNTA0LDI5IEBACiAgKiAgICAgIDwjcGF0aHM+IDwjcGVyLXBhdGggc2VsZWN0b3IgYXJncz4KICAqICAgICAgICAgWzxwYXRoPiBbPGFyZz5dKiBdKyBdKwogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RydWN0IHBhcmFtIHsKLQl1bnNpZ25lZCBtaW47Ci0JdW5zaWduZWQgbWF4OwotCWNoYXIgKmVycm9yOwotfTsKLQotc3RhdGljIGludCByZWFkX3BhcmFtKHN0cnVjdCBwYXJhbSAqcGFyYW0sIGNoYXIgKnN0ciwgdW5zaWduZWQgKnYsIGNoYXIgKiplcnJvcikKLXsKLQlpZiAoIXN0ciB8fAotCSAgICAoc3NjYW5mKHN0ciwgIiV1IiwgdikgIT0gMSkgfHwKLQkgICAgKCp2IDwgcGFyYW0tPm1pbikgfHwKLQkgICAgKCp2ID4gcGFyYW0tPm1heCkpIHsKLQkJKmVycm9yID0gcGFyYW0tPmVycm9yOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RydWN0IGFyZ19zZXQgewotCXVuc2lnbmVkIGFyZ2M7Ci0JY2hhciAqKmFyZ3Y7Ci19OwotCi1zdGF0aWMgY2hhciAqc2hpZnQoc3RydWN0IGFyZ19zZXQgKmFzKQotewotCWNoYXIgKnI7Ci0KLQlpZiAoYXMtPmFyZ2MpIHsKLQkJYXMtPmFyZ2MtLTsKLQkJciA9ICphcy0+YXJndjsKLQkJYXMtPmFyZ3YrKzsKLQkJcmV0dXJuIHI7Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbnN1bWUoc3RydWN0IGFyZ19zZXQgKmFzLCB1bnNpZ25lZCBuKQotewotCUJVR19PTiAoYXMtPmFyZ2MgPCBuKTsKLQlhcy0+YXJnYyAtPSBuOwotCWFzLT5hcmd2ICs9IG47Ci19Ci0KLXN0YXRpYyBpbnQgcGFyc2VfcGF0aF9zZWxlY3RvcihzdHJ1Y3QgYXJnX3NldCAqYXMsIHN0cnVjdCBwcmlvcml0eV9ncm91cCAqcGcsCitzdGF0aWMgaW50IHBhcnNlX3BhdGhfc2VsZWN0b3Ioc3RydWN0IGRtX2FyZ19zZXQgKmFzLCBzdHJ1Y3QgcHJpb3JpdHlfZ3JvdXAgKnBnLAogCQkJICAgICAgIHN0cnVjdCBkbV90YXJnZXQgKnRpKQogewogCWludCByOwogCXN0cnVjdCBwYXRoX3NlbGVjdG9yX3R5cGUgKnBzdDsKIAl1bnNpZ25lZCBwc19hcmdjOwogCi0Jc3RhdGljIHN0cnVjdCBwYXJhbSBfcGFyYW1zW10gPSB7CisJc3RhdGljIHN0cnVjdCBkbV9hcmcgX2FyZ3NbXSA9IHsKIAkJezAsIDEwMjQsICJpbnZhbGlkIG51bWJlciBvZiBwYXRoIHNlbGVjdG9yIGFyZ3MifSwKIAl9OwogCi0JcHN0ID0gZG1fZ2V0X3BhdGhfc2VsZWN0b3Ioc2hpZnQoYXMpKTsKKwlwc3QgPSBkbV9nZXRfcGF0aF9zZWxlY3RvcihkbV9zaGlmdF9hcmcoYXMpKTsKIAlpZiAoIXBzdCkgewogCQl0aS0+ZXJyb3IgPSAidW5rbm93biBwYXRoIHNlbGVjdG9yIHR5cGUiOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlyID0gcmVhZF9wYXJhbShfcGFyYW1zLCBzaGlmdChhcyksICZwc19hcmdjLCAmdGktPmVycm9yKTsKKwlyID0gZG1fcmVhZF9hcmdfZ3JvdXAoX2FyZ3MsIGFzLCAmcHNfYXJnYywgJnRpLT5lcnJvcik7CiAJaWYgKHIpIHsKIAkJZG1fcHV0X3BhdGhfc2VsZWN0b3IocHN0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKHBzX2FyZ2MgPiBhcy0+YXJnYykgewotCQlkbV9wdXRfcGF0aF9zZWxlY3Rvcihwc3QpOwotCQl0aS0+ZXJyb3IgPSAibm90IGVub3VnaCBhcmd1bWVudHMgZm9yIHBhdGggc2VsZWN0b3IiOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KIAlyID0gcHN0LT5jcmVhdGUoJnBnLT5wcywgcHNfYXJnYywgYXMtPmFyZ3YpOwogCWlmIChyKSB7CiAJCWRtX3B1dF9wYXRoX3NlbGVjdG9yKHBzdCk7CkBAIC01ODcsMTIgKzUzNSwxMiBAQAogCX0KIAogCXBnLT5wcy50eXBlID0gcHN0OwotCWNvbnN1bWUoYXMsIHBzX2FyZ2MpOworCWRtX2NvbnN1bWVfYXJncyhhcywgcHNfYXJnYyk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBwZ3BhdGggKnBhcnNlX3BhdGgoc3RydWN0IGFyZ19zZXQgKmFzLCBzdHJ1Y3QgcGF0aF9zZWxlY3RvciAqcHMsCitzdGF0aWMgc3RydWN0IHBncGF0aCAqcGFyc2VfcGF0aChzdHJ1Y3QgZG1fYXJnX3NldCAqYXMsIHN0cnVjdCBwYXRoX3NlbGVjdG9yICpwcywKIAkJCSAgICAgICBzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSkKIHsKIAlpbnQgcjsKQEAgLTYwOSw3ICs1NTcsNyBAQAogCWlmICghcCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAKLQlyID0gZG1fZ2V0X2RldmljZSh0aSwgc2hpZnQoYXMpLCBkbV90YWJsZV9nZXRfbW9kZSh0aS0+dGFibGUpLAorCXIgPSBkbV9nZXRfZGV2aWNlKHRpLCBkbV9zaGlmdF9hcmcoYXMpLCBkbV90YWJsZV9nZXRfbW9kZSh0aS0+dGFibGUpLAogCQkJICAmcC0+cGF0aC5kZXYpOwogCWlmIChyKSB7CiAJCXRpLT5lcnJvciA9ICJlcnJvciBnZXR0aW5nIGRldmljZSI7CkBAIC02NjAsMTYgKzYwOCwxNiBAQAogCXJldHVybiBFUlJfUFRSKHIpOwogfQogCi1zdGF0aWMgc3RydWN0IHByaW9yaXR5X2dyb3VwICpwYXJzZV9wcmlvcml0eV9ncm91cChzdHJ1Y3QgYXJnX3NldCAqYXMsCitzdGF0aWMgc3RydWN0IHByaW9yaXR5X2dyb3VwICpwYXJzZV9wcmlvcml0eV9ncm91cChzdHJ1Y3QgZG1fYXJnX3NldCAqYXMsCiAJCQkJCQkgICBzdHJ1Y3QgbXVsdGlwYXRoICptKQogewotCXN0YXRpYyBzdHJ1Y3QgcGFyYW0gX3BhcmFtc1tdID0geworCXN0YXRpYyBzdHJ1Y3QgZG1fYXJnIF9hcmdzW10gPSB7CiAJCXsxLCAxMDI0LCAiaW52YWxpZCBudW1iZXIgb2YgcGF0aHMifSwKIAkJezAsIDEwMjQsICJpbnZhbGlkIG51bWJlciBvZiBzZWxlY3RvciBhcmdzIn0KIAl9OwogCiAJaW50IHI7Ci0JdW5zaWduZWQgaSwgbnJfc2VsZWN0b3JfYXJncywgbnJfcGFyYW1zOworCXVuc2lnbmVkIGksIG5yX3NlbGVjdG9yX2FyZ3MsIG5yX2FyZ3M7CiAJc3RydWN0IHByaW9yaXR5X2dyb3VwICpwZzsKIAlzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSA9IG0tPnRpOwogCkBAIC02OTMsMjYgKzY0MSwyNiBAQAogCS8qCiAJICogcmVhZCB0aGUgcGF0aHMKIAkgKi8KLQlyID0gcmVhZF9wYXJhbShfcGFyYW1zLCBzaGlmdChhcyksICZwZy0+bnJfcGdwYXRocywgJnRpLT5lcnJvcik7CisJciA9IGRtX3JlYWRfYXJnKF9hcmdzLCBhcywgJnBnLT5ucl9wZ3BhdGhzLCAmdGktPmVycm9yKTsKIAlpZiAocikKIAkJZ290byBiYWQ7CiAKLQlyID0gcmVhZF9wYXJhbShfcGFyYW1zICsgMSwgc2hpZnQoYXMpLCAmbnJfc2VsZWN0b3JfYXJncywgJnRpLT5lcnJvcik7CisJciA9IGRtX3JlYWRfYXJnKF9hcmdzICsgMSwgYXMsICZucl9zZWxlY3Rvcl9hcmdzLCAmdGktPmVycm9yKTsKIAlpZiAocikKIAkJZ290byBiYWQ7CiAKLQlucl9wYXJhbXMgPSAxICsgbnJfc2VsZWN0b3JfYXJnczsKKwlucl9hcmdzID0gMSArIG5yX3NlbGVjdG9yX2FyZ3M7CiAJZm9yIChpID0gMDsgaSA8IHBnLT5ucl9wZ3BhdGhzOyBpKyspIHsKIAkJc3RydWN0IHBncGF0aCAqcGdwYXRoOwotCQlzdHJ1Y3QgYXJnX3NldCBwYXRoX2FyZ3M7CisJCXN0cnVjdCBkbV9hcmdfc2V0IHBhdGhfYXJnczsKIAotCQlpZiAoYXMtPmFyZ2MgPCBucl9wYXJhbXMpIHsKKwkJaWYgKGFzLT5hcmdjIDwgbnJfYXJncykgewogCQkJdGktPmVycm9yID0gIm5vdCBlbm91Z2ggcGF0aCBwYXJhbWV0ZXJzIjsKIAkJCXIgPSAtRUlOVkFMOwogCQkJZ290byBiYWQ7CiAJCX0KIAotCQlwYXRoX2FyZ3MuYXJnYyA9IG5yX3BhcmFtczsKKwkJcGF0aF9hcmdzLmFyZ2MgPSBucl9hcmdzOwogCQlwYXRoX2FyZ3MuYXJndiA9IGFzLT5hcmd2OwogCiAJCXBncGF0aCA9IHBhcnNlX3BhdGgoJnBhdGhfYXJncywgJnBnLT5wcywgdGkpOwpAQCAtNzIzLDcgKzY3MSw3IEBACiAKIAkJcGdwYXRoLT5wZyA9IHBnOwogCQlsaXN0X2FkZF90YWlsKCZwZ3BhdGgtPmxpc3QsICZwZy0+cGdwYXRocyk7Ci0JCWNvbnN1bWUoYXMsIG5yX3BhcmFtcyk7CisJCWRtX2NvbnN1bWVfYXJncyhhcywgbnJfYXJncyk7CiAJfQogCiAJcmV0dXJuIHBnOwpAQCAtNzMzLDI4ICs2ODEsMjMgQEAKIAlyZXR1cm4gRVJSX1BUUihyKTsKIH0KIAotc3RhdGljIGludCBwYXJzZV9od19oYW5kbGVyKHN0cnVjdCBhcmdfc2V0ICphcywgc3RydWN0IG11bHRpcGF0aCAqbSkKK3N0YXRpYyBpbnQgcGFyc2VfaHdfaGFuZGxlcihzdHJ1Y3QgZG1fYXJnX3NldCAqYXMsIHN0cnVjdCBtdWx0aXBhdGggKm0pCiB7CiAJdW5zaWduZWQgaHdfYXJnYzsKIAlpbnQgcmV0OwogCXN0cnVjdCBkbV90YXJnZXQgKnRpID0gbS0+dGk7CiAKLQlzdGF0aWMgc3RydWN0IHBhcmFtIF9wYXJhbXNbXSA9IHsKKwlzdGF0aWMgc3RydWN0IGRtX2FyZyBfYXJnc1tdID0gewogCQl7MCwgMTAyNCwgImludmFsaWQgbnVtYmVyIG9mIGhhcmR3YXJlIGhhbmRsZXIgYXJncyJ9LAogCX07CiAKLQlpZiAocmVhZF9wYXJhbShfcGFyYW1zLCBzaGlmdChhcyksICZod19hcmdjLCAmdGktPmVycm9yKSkKKwlpZiAoZG1fcmVhZF9hcmdfZ3JvdXAoX2FyZ3MsIGFzLCAmaHdfYXJnYywgJnRpLT5lcnJvcikpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKCFod19hcmdjKQogCQlyZXR1cm4gMDsKIAotCWlmIChod19hcmdjID4gYXMtPmFyZ2MpIHsKLQkJdGktPmVycm9yID0gIm5vdCBlbm91Z2ggYXJndW1lbnRzIGZvciBoYXJkd2FyZSBoYW5kbGVyIjsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbS0+aHdfaGFuZGxlcl9uYW1lID0ga3N0cmR1cChzaGlmdChhcyksIEdGUF9LRVJORUwpOworCW0tPmh3X2hhbmRsZXJfbmFtZSA9IGtzdHJkdXAoZG1fc2hpZnRfYXJnKGFzKSwgR0ZQX0tFUk5FTCk7CiAJcmVxdWVzdF9tb2R1bGUoInNjc2lfZGhfJXMiLCBtLT5od19oYW5kbGVyX25hbWUpOwogCWlmIChzY3NpX2RoX2hhbmRsZXJfZXhpc3QobS0+aHdfaGFuZGxlcl9uYW1lKSA9PSAwKSB7CiAJCXRpLT5lcnJvciA9ICJ1bmtub3duIGhhcmR3YXJlIGhhbmRsZXIgdHlwZSI7CkBAIC03NzgsNyArNzIxLDcgQEAKIAkJZm9yIChpID0gMCwgcCs9aisxOyBpIDw9IGh3X2FyZ2MgLSAyOyBpKyssIHArPWorMSkKIAkJCWogPSBzcHJpbnRmKHAsICIlcyIsIGFzLT5hcmd2W2ldKTsKIAl9Ci0JY29uc3VtZShhcywgaHdfYXJnYyAtIDEpOworCWRtX2NvbnN1bWVfYXJncyhhcywgaHdfYXJnYyAtIDEpOwogCiAJcmV0dXJuIDA7CiBmYWlsOgpAQCAtNzg3LDIwICs3MzAsMjAgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHBhcnNlX2ZlYXR1cmVzKHN0cnVjdCBhcmdfc2V0ICphcywgc3RydWN0IG11bHRpcGF0aCAqbSkKK3N0YXRpYyBpbnQgcGFyc2VfZmVhdHVyZXMoc3RydWN0IGRtX2FyZ19zZXQgKmFzLCBzdHJ1Y3QgbXVsdGlwYXRoICptKQogewogCWludCByOwogCXVuc2lnbmVkIGFyZ2M7CiAJc3RydWN0IGRtX3RhcmdldCAqdGkgPSBtLT50aTsKLQljb25zdCBjaGFyICpwYXJhbV9uYW1lOworCWNvbnN0IGNoYXIgKmFyZ19uYW1lOwogCi0Jc3RhdGljIHN0cnVjdCBwYXJhbSBfcGFyYW1zW10gPSB7CisJc3RhdGljIHN0cnVjdCBkbV9hcmcgX2FyZ3NbXSA9IHsKIAkJezAsIDUsICJpbnZhbGlkIG51bWJlciBvZiBmZWF0dXJlIGFyZ3MifSwKIAkJezEsIDUwLCAicGdfaW5pdF9yZXRyaWVzIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA1MCJ9LAogCQl7MCwgNjAwMDAsICJwZ19pbml0X2RlbGF5X21zZWNzIG11c3QgYmUgYmV0d2VlbiAwIGFuZCA2MDAwMCJ9LAogCX07CiAKLQlyID0gcmVhZF9wYXJhbShfcGFyYW1zLCBzaGlmdChhcyksICZhcmdjLCAmdGktPmVycm9yKTsKKwlyID0gZG1fcmVhZF9hcmdfZ3JvdXAoX2FyZ3MsIGFzLCAmYXJnYywgJnRpLT5lcnJvcik7CiAJaWYgKHIpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC04MDgsMjYgKzc1MSwyNCBAQAogCQlyZXR1cm4gMDsKIAogCWRvIHsKLQkJcGFyYW1fbmFtZSA9IHNoaWZ0KGFzKTsKKwkJYXJnX25hbWUgPSBkbV9zaGlmdF9hcmcoYXMpOwogCQlhcmdjLS07CiAKLQkJaWYgKCFzdHJuaWNtcChwYXJhbV9uYW1lLCBNRVNHX1NUUigicXVldWVfaWZfbm9fcGF0aCIpKSkgeworCQlpZiAoIXN0cmNhc2VjbXAoYXJnX25hbWUsICJxdWV1ZV9pZl9ub19wYXRoIikpIHsKIAkJCXIgPSBxdWV1ZV9pZl9ub19wYXRoKG0sIDEsIDApOwogCQkJY29udGludWU7CiAJCX0KIAotCQlpZiAoIXN0cm5pY21wKHBhcmFtX25hbWUsIE1FU0dfU1RSKCJwZ19pbml0X3JldHJpZXMiKSkgJiYKKwkJaWYgKCFzdHJjYXNlY21wKGFyZ19uYW1lLCAicGdfaW5pdF9yZXRyaWVzIikgJiYKIAkJICAgIChhcmdjID49IDEpKSB7Ci0JCQlyID0gcmVhZF9wYXJhbShfcGFyYW1zICsgMSwgc2hpZnQoYXMpLAotCQkJCSAgICAgICAmbS0+cGdfaW5pdF9yZXRyaWVzLCAmdGktPmVycm9yKTsKKwkJCXIgPSBkbV9yZWFkX2FyZyhfYXJncyArIDEsIGFzLCAmbS0+cGdfaW5pdF9yZXRyaWVzLCAmdGktPmVycm9yKTsKIAkJCWFyZ2MtLTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJaWYgKCFzdHJuaWNtcChwYXJhbV9uYW1lLCBNRVNHX1NUUigicGdfaW5pdF9kZWxheV9tc2VjcyIpKSAmJgorCQlpZiAoIXN0cmNhc2VjbXAoYXJnX25hbWUsICJwZ19pbml0X2RlbGF5X21zZWNzIikgJiYKIAkJICAgIChhcmdjID49IDEpKSB7Ci0JCQlyID0gcmVhZF9wYXJhbShfcGFyYW1zICsgMiwgc2hpZnQoYXMpLAotCQkJCSAgICAgICAmbS0+cGdfaW5pdF9kZWxheV9tc2VjcywgJnRpLT5lcnJvcik7CisJCQlyID0gZG1fcmVhZF9hcmcoX2FyZ3MgKyAyLCBhcywgJm0tPnBnX2luaXRfZGVsYXlfbXNlY3MsICZ0aS0+ZXJyb3IpOwogCQkJYXJnYy0tOwogCQkJY29udGludWU7CiAJCX0KQEAgLTg0MiwxNSArNzgzLDE1IEBACiBzdGF0aWMgaW50IG11bHRpcGF0aF9jdHIoc3RydWN0IGRtX3RhcmdldCAqdGksIHVuc2lnbmVkIGludCBhcmdjLAogCQkJIGNoYXIgKiphcmd2KQogewotCS8qIHRhcmdldCBwYXJhbWV0ZXJzICovCi0Jc3RhdGljIHN0cnVjdCBwYXJhbSBfcGFyYW1zW10gPSB7CisJLyogdGFyZ2V0IGFyZ3VtZW50cyAqLworCXN0YXRpYyBzdHJ1Y3QgZG1fYXJnIF9hcmdzW10gPSB7CiAJCXswLCAxMDI0LCAiaW52YWxpZCBudW1iZXIgb2YgcHJpb3JpdHkgZ3JvdXBzIn0sCiAJCXswLCAxMDI0LCAiaW52YWxpZCBpbml0aWFsIHByaW9yaXR5IGdyb3VwIG51bWJlciJ9LAogCX07CiAKIAlpbnQgcjsKIAlzdHJ1Y3QgbXVsdGlwYXRoICptOwotCXN0cnVjdCBhcmdfc2V0IGFzOworCXN0cnVjdCBkbV9hcmdfc2V0IGFzOwogCXVuc2lnbmVkIHBnX2NvdW50ID0gMDsKIAl1bnNpZ25lZCBuZXh0X3BnX251bTsKIApAQCAtODcxLDExICs4MTIsMTEgQEAKIAlpZiAocikKIAkJZ290byBiYWQ7CiAKLQlyID0gcmVhZF9wYXJhbShfcGFyYW1zLCBzaGlmdCgmYXMpLCAmbS0+bnJfcHJpb3JpdHlfZ3JvdXBzLCAmdGktPmVycm9yKTsKKwlyID0gZG1fcmVhZF9hcmcoX2FyZ3MsICZhcywgJm0tPm5yX3ByaW9yaXR5X2dyb3VwcywgJnRpLT5lcnJvcik7CiAJaWYgKHIpCiAJCWdvdG8gYmFkOwogCi0JciA9IHJlYWRfcGFyYW0oX3BhcmFtcyArIDEsIHNoaWZ0KCZhcyksICZuZXh0X3BnX251bSwgJnRpLT5lcnJvcik7CisJciA9IGRtX3JlYWRfYXJnKF9hcmdzICsgMSwgJmFzLCAmbmV4dF9wZ19udW0sICZ0aS0+ZXJyb3IpOwogCWlmIChyKQogCQlnb3RvIGJhZDsKIApAQCAtMTUwNSwxMCArMTQ0NiwxMCBAQAogCX0KIAogCWlmIChhcmdjID09IDEpIHsKLQkJaWYgKCFzdHJuaWNtcChhcmd2WzBdLCBNRVNHX1NUUigicXVldWVfaWZfbm9fcGF0aCIpKSkgeworCQlpZiAoIXN0cmNhc2VjbXAoYXJndlswXSwgInF1ZXVlX2lmX25vX3BhdGgiKSkgewogCQkJciA9IHF1ZXVlX2lmX25vX3BhdGgobSwgMSwgMCk7CiAJCQlnb3RvIG91dDsKLQkJfSBlbHNlIGlmICghc3RybmljbXAoYXJndlswXSwgTUVTR19TVFIoImZhaWxfaWZfbm9fcGF0aCIpKSkgeworCQl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKGFyZ3ZbMF0sICJmYWlsX2lmX25vX3BhdGgiKSkgewogCQkJciA9IHF1ZXVlX2lmX25vX3BhdGgobSwgMCwgMCk7CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtMTUxOSwxOCArMTQ2MCwxOCBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAoIXN0cm5pY21wKGFyZ3ZbMF0sIE1FU0dfU1RSKCJkaXNhYmxlX2dyb3VwIikpKSB7CisJaWYgKCFzdHJjYXNlY21wKGFyZ3ZbMF0sICJkaXNhYmxlX2dyb3VwIikpIHsKIAkJciA9IGJ5cGFzc19wZ19udW0obSwgYXJndlsxXSwgMSk7CiAJCWdvdG8gb3V0OwotCX0gZWxzZSBpZiAoIXN0cm5pY21wKGFyZ3ZbMF0sIE1FU0dfU1RSKCJlbmFibGVfZ3JvdXAiKSkpIHsKKwl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKGFyZ3ZbMF0sICJlbmFibGVfZ3JvdXAiKSkgewogCQlyID0gYnlwYXNzX3BnX251bShtLCBhcmd2WzFdLCAwKTsKIAkJZ290byBvdXQ7Ci0JfSBlbHNlIGlmICghc3RybmljbXAoYXJndlswXSwgTUVTR19TVFIoInN3aXRjaF9ncm91cCIpKSkgeworCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJndlswXSwgInN3aXRjaF9ncm91cCIpKSB7CiAJCXIgPSBzd2l0Y2hfcGdfbnVtKG0sIGFyZ3ZbMV0pOwogCQlnb3RvIG91dDsKLQl9IGVsc2UgaWYgKCFzdHJuaWNtcChhcmd2WzBdLCBNRVNHX1NUUigicmVpbnN0YXRlX3BhdGgiKSkpCisJfSBlbHNlIGlmICghc3RyY2FzZWNtcChhcmd2WzBdLCAicmVpbnN0YXRlX3BhdGgiKSkKIAkJYWN0aW9uID0gcmVpbnN0YXRlX3BhdGg7Ci0JZWxzZSBpZiAoIXN0cm5pY21wKGFyZ3ZbMF0sIE1FU0dfU1RSKCJmYWlsX3BhdGgiKSkpCisJZWxzZSBpZiAoIXN0cmNhc2VjbXAoYXJndlswXSwgImZhaWxfcGF0aCIpKQogCQlhY3Rpb24gPSBmYWlsX3BhdGg7CiAJZWxzZSB7CiAJCURNV0FSTigiVW5yZWNvZ25pc2VkIG11bHRpcGF0aCBtZXNzYWdlIHJlY2VpdmVkLiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1yYWlkLmMgYi9kcml2ZXJzL21kL2RtLXJhaWQuYwppbmRleCBlNWQ4OTA0Li5hMDAyZGQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLXJhaWQuYworKysgYi9kcml2ZXJzL21kL2RtLXJhaWQuYwpAQCAtOCwxOSArOCwxOSBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgIm1kLmgiCisjaW5jbHVkZSAicmFpZDEuaCIKICNpbmNsdWRlICJyYWlkNS5oIgotI2luY2x1ZGUgImRtLmgiCiAjaW5jbHVkZSAiYml0bWFwLmgiCiAKKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UtbWFwcGVyLmg+CisKICNkZWZpbmUgRE1fTVNHX1BSRUZJWCAicmFpZCIKIAogLyoKLSAqIElmIHRoZSBNRCBkb2Vzbid0IHN1cHBvcnQgTURfU1lOQ19TVEFURV9GT1JDRUQgeWV0LCB0aGVuCi0gKiBtYWtlIGl0IHNvIHRoZSBmbGFnIGRvZXNuJ3Qgc2V0IGFueXRoaW5nLgorICogVGhlIGZvbGxvd2luZyBmbGFncyBhcmUgdXNlZCBieSBkbS1yYWlkLmMgdG8gc2V0IHVwIHRoZSBhcnJheSBzdGF0ZS4KKyAqIFRoZXkgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSBtZF9ydW4gaXMgY2FsbGVkLgogICovCi0jaWZuZGVmIE1EX1NZTkNfU1RBVEVfRk9SQ0VECi0jZGVmaW5lIE1EX1NZTkNfU1RBVEVfRk9SQ0VEIDAKLSNlbmRpZgorI2RlZmluZSBGaXJzdFVzZSAxMCAgICAgICAgICAgICAvKiByZGV2IGZsYWcgKi8KIAogc3RydWN0IHJhaWRfZGV2IHsKIAkvKgpAQCAtNDMsMTQgKzQzLDE1IEBACiAvKgogICogRmxhZ3MgZm9yIHJzLT5wcmludF9mbGFncyBmaWVsZC4KICAqLwotI2RlZmluZSBETVBGX0RBRU1PTl9TTEVFUCAgICAgIDB4MQotI2RlZmluZSBETVBGX01BWF9XUklURV9CRUhJTkQgIDB4MgotI2RlZmluZSBETVBGX1NZTkMgICAgICAgICAgICAgIDB4NAotI2RlZmluZSBETVBGX05PU1lOQyAgICAgICAgICAgIDB4OAotI2RlZmluZSBETVBGX1NUUklQRV9DQUNIRSAgICAgIDB4MTAKLSNkZWZpbmUgRE1QRl9NSU5fUkVDT1ZFUllfUkFURSAweDIwCi0jZGVmaW5lIERNUEZfTUFYX1JFQ09WRVJZX1JBVEUgMHg0MAotCisjZGVmaW5lIERNUEZfU1lOQyAgICAgICAgICAgICAgMHgxCisjZGVmaW5lIERNUEZfTk9TWU5DICAgICAgICAgICAgMHgyCisjZGVmaW5lIERNUEZfUkVCVUlMRCAgICAgICAgICAgMHg0CisjZGVmaW5lIERNUEZfREFFTU9OX1NMRUVQICAgICAgMHg4CisjZGVmaW5lIERNUEZfTUlOX1JFQ09WRVJZX1JBVEUgMHgxMAorI2RlZmluZSBETVBGX01BWF9SRUNPVkVSWV9SQVRFIDB4MjAKKyNkZWZpbmUgRE1QRl9NQVhfV1JJVEVfQkVISU5EICAweDQwCisjZGVmaW5lIERNUEZfU1RSSVBFX0NBQ0hFICAgICAgMHg4MAorI2RlZmluZSBETVBGX1JFR0lPTl9TSVpFICAgICAgIDBYMTAwCiBzdHJ1Y3QgcmFpZF9zZXQgewogCXN0cnVjdCBkbV90YXJnZXQgKnRpOwogCkBAIC03Miw2ICs3Myw3IEBACiAJY29uc3QgdW5zaWduZWQgbGV2ZWw7CQkvKiBSQUlEIGxldmVsLiAqLwogCWNvbnN0IHVuc2lnbmVkIGFsZ29yaXRobTsJLyogUkFJRCBhbGdvcml0aG0uICovCiB9IHJhaWRfdHlwZXNbXSA9IHsKKwl7InJhaWQxIiwgICAgIlJBSUQxIChtaXJyb3JpbmcpIiwgICAgICAgICAgICAgICAwLCAyLCAxLCAwIC8qIE5PTkUgKi99LAogCXsicmFpZDQiLCAgICAiUkFJRDQgKGRlZGljYXRlZCBwYXJpdHkgZGlzaykiLAkxLCAyLCA1LCBBTEdPUklUSE1fUEFSSVRZXzB9LAogCXsicmFpZDVfbGEiLCAiUkFJRDUgKGxlZnQgYXN5bW1ldHJpYykiLAkJMSwgMiwgNSwgQUxHT1JJVEhNX0xFRlRfQVNZTU1FVFJJQ30sCiAJeyJyYWlkNV9yYSIsICJSQUlENSAocmlnaHQgYXN5bW1ldHJpYykiLAkxLCAyLCA1LCBBTEdPUklUSE1fUklHSFRfQVNZTU1FVFJJQ30sCkBAIC0xMDUsNyArMTA3LDggQEAKIAl9CiAKIAlzZWN0b3JzX3Blcl9kZXYgPSB0aS0+bGVuOwotCWlmIChzZWN0b3JfZGl2KHNlY3RvcnNfcGVyX2RldiwgKHJhaWRfZGV2cyAtIHJhaWRfdHlwZS0+cGFyaXR5X2RldnMpKSkgeworCWlmICgocmFpZF90eXBlLT5sZXZlbCA+IDEpICYmCisJICAgIHNlY3Rvcl9kaXYoc2VjdG9yc19wZXJfZGV2LCAocmFpZF9kZXZzIC0gcmFpZF90eXBlLT5wYXJpdHlfZGV2cykpKSB7CiAJCXRpLT5lcnJvciA9ICJUYXJnZXQgbGVuZ3RoIG5vdCBkaXZpc2libGUgYnkgbnVtYmVyIG9mIGRhdGEgZGV2aWNlcyI7CiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCX0KQEAgLTE0Nyw5ICsxNTAsMTYgQEAKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBycy0+bWQucmFpZF9kaXNrczsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBycy0+bWQucmFpZF9kaXNrczsgaSsrKSB7CisJCWlmIChycy0+ZGV2W2ldLm1ldGFfZGV2KQorCQkJZG1fcHV0X2RldmljZShycy0+dGksIHJzLT5kZXZbaV0ubWV0YV9kZXYpOworCQlpZiAocnMtPmRldltpXS5yZGV2LnNiX3BhZ2UpCisJCQlwdXRfcGFnZShycy0+ZGV2W2ldLnJkZXYuc2JfcGFnZSk7CisJCXJzLT5kZXZbaV0ucmRldi5zYl9wYWdlID0gTlVMTDsKKwkJcnMtPmRldltpXS5yZGV2LnNiX2xvYWRlZCA9IDA7CiAJCWlmIChycy0+ZGV2W2ldLmRhdGFfZGV2KQogCQkJZG1fcHV0X2RldmljZShycy0+dGksIHJzLT5kZXZbaV0uZGF0YV9kZXYpOworCX0KIAogCWtmcmVlKHJzKTsKIH0KQEAgLTE1OSw3ICsxNjksMTYgQEAKICAqICA8bWV0YV9kZXY+OiBtZXRhIGRldmljZSBuYW1lIG9yICctJyBpZiBtaXNzaW5nCiAgKiAgPGRhdGFfZGV2PjogZGF0YSBkZXZpY2UgbmFtZSBvciAnLScgaWYgbWlzc2luZwogICoKLSAqIFRoaXMgY29kZSBwYXJzZXMgdGhvc2Ugd29yZHMuCisgKiBUaGUgZm9sbG93aW5nIGFyZSBwZXJtaXR0ZWQ6CisgKiAgICAtIC0KKyAqICAgIC0gPGRhdGFfZGV2PgorICogICAgPG1ldGFfZGV2PiA8ZGF0YV9kZXY+CisgKgorICogVGhlIGZvbGxvd2luZyBpcyBub3QgYWxsb3dlZDoKKyAqICAgIDxtZXRhX2Rldj4gLQorICoKKyAqIFRoaXMgY29kZSBwYXJzZXMgdGhvc2Ugd29yZHMuICBJZiB0aGVyZSBpcyBhIGZhaWx1cmUsCisgKiB0aGUgY2FsbGVyIG11c3QgdXNlIGNvbnRleHRfZnJlZSB0byB1bndpbmQgdGhlIG9wZXJhdGlvbnMuCiAgKi8KIHN0YXRpYyBpbnQgZGV2X3Bhcm1zKHN0cnVjdCByYWlkX3NldCAqcnMsIGNoYXIgKiphcmd2KQogewpAQCAtMTgyLDggKzIwMSwxNiBAQAogCQlycy0+ZGV2W2ldLnJkZXYubWRkZXYgPSAmcnMtPm1kOwogCiAJCWlmIChzdHJjbXAoYXJndlswXSwgIi0iKSkgewotCQkJcnMtPnRpLT5lcnJvciA9ICJNZXRhZGF0YSBkZXZpY2VzIG5vdCBzdXBwb3J0ZWQiOwotCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXQgPSBkbV9nZXRfZGV2aWNlKHJzLT50aSwgYXJndlswXSwKKwkJCQkJICAgIGRtX3RhYmxlX2dldF9tb2RlKHJzLT50aS0+dGFibGUpLAorCQkJCQkgICAgJnJzLT5kZXZbaV0ubWV0YV9kZXYpOworCQkJcnMtPnRpLT5lcnJvciA9ICJSQUlEIG1ldGFkYXRhIGRldmljZSBsb29rdXAgZmFpbHVyZSI7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisKKwkJCXJzLT5kZXZbaV0ucmRldi5zYl9wYWdlID0gYWxsb2NfcGFnZShHRlBfS0VSTkVMKTsKKwkJCWlmICghcnMtPmRldltpXS5yZGV2LnNiX3BhZ2UpCisJCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KIAogCQlpZiAoIXN0cmNtcChhcmd2WzFdLCAiLSIpKSB7CkBAIC0xOTMsNiArMjIwLDEwIEBACiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAKKwkJCXJzLT50aS0+ZXJyb3IgPSAiTm8gZGF0YSBkZXZpY2Ugc3VwcGxpZWQgd2l0aCBtZXRhZGF0YSBkZXZpY2UiOworCQkJaWYgKHJzLT5kZXZbaV0ubWV0YV9kZXYpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTIwNCw2ICsyMzUsMTAgQEAKIAkJCXJldHVybiByZXQ7CiAJCX0KIAorCQlpZiAocnMtPmRldltpXS5tZXRhX2RldikgeworCQkJbWV0YWRhdGFfYXZhaWxhYmxlID0gMTsKKwkJCXJzLT5kZXZbaV0ucmRldi5tZXRhX2JkZXYgPSBycy0+ZGV2W2ldLm1ldGFfZGV2LT5iZGV2OworCQl9CiAJCXJzLT5kZXZbaV0ucmRldi5iZGV2ID0gcnMtPmRldltpXS5kYXRhX2Rldi0+YmRldjsKIAkJbGlzdF9hZGQoJnJzLT5kZXZbaV0ucmRldi5zYW1lX3NldCwgJnJzLT5tZC5kaXNrcyk7CiAJCWlmICghdGVzdF9iaXQoSW5fc3luYywgJnJzLT5kZXZbaV0ucmRldi5mbGFncykpCkBAIC0yMzUsMzMgKzI3MCwxMDkgQEAKIH0KIAogLyoKKyAqIHZhbGlkYXRlX3JlZ2lvbl9zaXplCisgKiBAcnMKKyAqIEByZWdpb25fc2l6ZTogIHJlZ2lvbiBzaXplIGluIHNlY3RvcnMuICBJZiAwLCBwaWNrIGEgc2l6ZSAoNE1pQiBkZWZhdWx0KS4KKyAqCisgKiBTZXQgcnMtPm1kLmJpdG1hcF9pbmZvLmNodW5rc2l6ZSAod2hpY2ggcmVhbGx5IHJlZmVycyB0byAncmVnaW9uIHNpemUnKS4KKyAqIEVuc3VyZSB0aGF0ICh0aS0+bGVuL3JlZ2lvbl9zaXplIDwgMl4yMSkgLSByZXF1aXJlZCBieSBNRCBiaXRtYXAuCisgKgorICogUmV0dXJuczogMCBvbiBzdWNjZXNzLCAtRUlOVkFMIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgdmFsaWRhdGVfcmVnaW9uX3NpemUoc3RydWN0IHJhaWRfc2V0ICpycywgdW5zaWduZWQgbG9uZyByZWdpb25fc2l6ZSkKK3sKKwl1bnNpZ25lZCBsb25nIG1pbl9yZWdpb25fc2l6ZSA9IHJzLT50aS0+bGVuIC8gKDEgPDwgMjEpOworCisJaWYgKCFyZWdpb25fc2l6ZSkgeworCQkvKgorCQkgKiBDaG9vc2UgYSByZWFzb25hYmxlIGRlZmF1bHQuICBBbGwgZmlndXJlcyBpbiBzZWN0b3JzLgorCQkgKi8KKwkJaWYgKG1pbl9yZWdpb25fc2l6ZSA+ICgxIDw8IDEzKSkgeworCQkJRE1JTkZPKCJDaG9vc2luZyBkZWZhdWx0IHJlZ2lvbiBzaXplIG9mICVsdSBzZWN0b3JzIiwKKwkJCSAgICAgICByZWdpb25fc2l6ZSk7CisJCQlyZWdpb25fc2l6ZSA9IG1pbl9yZWdpb25fc2l6ZTsKKwkJfSBlbHNlIHsKKwkJCURNSU5GTygiQ2hvb3NpbmcgZGVmYXVsdCByZWdpb24gc2l6ZSBvZiA0TWlCIik7CisJCQlyZWdpb25fc2l6ZSA9IDEgPDwgMTM7IC8qIHNlY3RvcnMgKi8KKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIFZhbGlkYXRlIHVzZXItc3VwcGxpZWQgdmFsdWUuCisJCSAqLworCQlpZiAocmVnaW9uX3NpemUgPiBycy0+dGktPmxlbikgeworCQkJcnMtPnRpLT5lcnJvciA9ICJTdXBwbGllZCByZWdpb24gc2l6ZSBpcyB0b28gbGFyZ2UiOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpZiAocmVnaW9uX3NpemUgPCBtaW5fcmVnaW9uX3NpemUpIHsKKwkJCURNRVJSKCJTdXBwbGllZCByZWdpb25fc2l6ZSAoJWx1IHNlY3RvcnMpIGJlbG93IG1pbmltdW0gKCVsdSkiLAorCQkJICAgICAgcmVnaW9uX3NpemUsIG1pbl9yZWdpb25fc2l6ZSk7CisJCQlycy0+dGktPmVycm9yID0gIlN1cHBsaWVkIHJlZ2lvbiBzaXplIGlzIHRvbyBzbWFsbCI7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmICghaXNfcG93ZXJfb2ZfMihyZWdpb25fc2l6ZSkpIHsKKwkJCXJzLT50aS0+ZXJyb3IgPSAiUmVnaW9uIHNpemUgaXMgbm90IGEgcG93ZXIgb2YgMiI7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChyZWdpb25fc2l6ZSA8IHJzLT5tZC5jaHVua19zZWN0b3JzKSB7CisJCQlycy0+dGktPmVycm9yID0gIlJlZ2lvbiBzaXplIGlzIHNtYWxsZXIgdGhhbiB0aGUgY2h1bmsgc2l6ZSI7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCS8qCisJICogQ29udmVydCBzZWN0b3JzIHRvIGJ5dGVzLgorCSAqLworCXJzLT5tZC5iaXRtYXBfaW5mby5jaHVua3NpemUgPSAocmVnaW9uX3NpemUgPDwgOSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKICAqIFBvc3NpYmxlIGFyZ3VtZW50cyBhcmUuLi4KLSAqIFJBSUQ0NTY6CiAgKgk8Y2h1bmtfc2l6ZT4gW29wdGlvbmFsX2FyZ3NdCiAgKgotICogT3B0aW9uYWwgYXJnczoKLSAqICAgIFtbbm9dc3luY10JCQlGb3JjZSBvciBwcmV2ZW50IHJlY292ZXJ5IG9mIHRoZSBlbnRpcmUgYXJyYXkKKyAqIEFyZ3VtZW50IGRlZmluaXRpb25zCisgKiAgICA8Y2h1bmtfc2l6ZT4JCQlUaGUgbnVtYmVyIG9mIHNlY3RvcnMgcGVyIGRpc2sgdGhhdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgZm9ybSB0aGUgInN0cmlwZSIKKyAqICAgIFtbbm9dc3luY10JCQlGb3JjZSBvciBwcmV2ZW50IHJlY292ZXJ5IG9mIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGlyZSBhcnJheQogICogICAgW3JlYnVpbGQgPGlkeD5dCQkJUmVidWlsZCB0aGUgZHJpdmUgaW5kaWNhdGVkIGJ5IHRoZSBpbmRleAotICogICAgW2RhZW1vbl9zbGVlcCA8bXM+XQkJVGltZSBiZXR3ZWVuIGJpdG1hcCBkYWVtb24gd29yayB0byBjbGVhciBiaXRzCisgKiAgICBbZGFlbW9uX3NsZWVwIDxtcz5dCQlUaW1lIGJldHdlZW4gYml0bWFwIGRhZW1vbiB3b3JrIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXIgYml0cwogICogICAgW21pbl9yZWNvdmVyeV9yYXRlIDxrQi9zZWMvZGlzaz5dCVRocm90dGxlIFJBSUQgaW5pdGlhbGl6YXRpb24KICAqICAgIFttYXhfcmVjb3ZlcnlfcmF0ZSA8a0Ivc2VjL2Rpc2s+XQlUaHJvdHRsZSBSQUlEIGluaXRpYWxpemF0aW9uCisgKiAgICBbd3JpdGVfbW9zdGx5IDxpZHg+XQkJSW5kaWNhdGUgYSB3cml0ZSBtb3N0bHkgZHJpdmUgdmlhIGluZGV4CiAgKiAgICBbbWF4X3dyaXRlX2JlaGluZCA8c2VjdG9ycz5dCVNlZSAnLXdyaXRlLWJlaGluZD0nIChtYW4gbWRhZG0pCiAgKiAgICBbc3RyaXBlX2NhY2hlIDxzZWN0b3JzPl0JCVN0cmlwZSBjYWNoZSBzaXplIGZvciBoaWdoZXIgUkFJRHMKKyAqICAgIFtyZWdpb25fc2l6ZSA8c2VjdG9ycz5dICAgICAgICAgICBEZWZpbmVzIGdyYW51bGFyaXR5IG9mIGJpdG1hcAogICovCiBzdGF0aWMgaW50IHBhcnNlX3JhaWRfcGFyYW1zKHN0cnVjdCByYWlkX3NldCAqcnMsIGNoYXIgKiphcmd2LAogCQkJICAgICB1bnNpZ25lZCBudW1fcmFpZF9wYXJhbXMpCiB7CiAJdW5zaWduZWQgaSwgcmVidWlsZF9jbnQgPSAwOwotCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJdW5zaWduZWQgbG9uZyB2YWx1ZSwgcmVnaW9uX3NpemUgPSAwOwogCWNoYXIgKmtleTsKIAogCS8qCiAJICogRmlyc3QsIHBhcnNlIHRoZSBpbi1vcmRlciByZXF1aXJlZCBhcmd1bWVudHMKKwkgKiAiY2h1bmtfc2l6ZSIgaXMgdGhlIG9ubHkgYXJndW1lbnQgb2YgdGhpcyB0eXBlLgogCSAqLwotCWlmICgoc3RyaWN0X3N0cnRvdWwoYXJndlswXSwgMTAsICZ2YWx1ZSkgPCAwKSB8fAotCSAgICAhaXNfcG93ZXJfb2ZfMih2YWx1ZSkgfHwgKHZhbHVlIDwgOCkpIHsKKwlpZiAoKHN0cmljdF9zdHJ0b3VsKGFyZ3ZbMF0sIDEwLCAmdmFsdWUpIDwgMCkpIHsKIAkJcnMtPnRpLT5lcnJvciA9ICJCYWQgY2h1bmsgc2l6ZSI7CiAJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAocnMtPnJhaWRfdHlwZS0+bGV2ZWwgPT0gMSkgeworCQlpZiAodmFsdWUpCisJCQlETUVSUigiSWdub3JpbmcgY2h1bmsgc2l6ZSBwYXJhbWV0ZXIgZm9yIFJBSUQgMSIpOworCQl2YWx1ZSA9IDA7CisJfSBlbHNlIGlmICghaXNfcG93ZXJfb2ZfMih2YWx1ZSkpIHsKKwkJcnMtPnRpLT5lcnJvciA9ICJDaHVuayBzaXplIG11c3QgYmUgYSBwb3dlciBvZiAyIjsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIGlmICh2YWx1ZSA8IDgpIHsKKwkJcnMtPnRpLT5lcnJvciA9ICJDaHVuayBzaXplIHZhbHVlIGlzIHRvbyBzbWFsbCI7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXJzLT5tZC5uZXdfY2h1bmtfc2VjdG9ycyA9IHJzLT5tZC5jaHVua19zZWN0b3JzID0gdmFsdWU7CkBAIC0yNjksMjIgKzM4MCwzOSBAQAogCW51bV9yYWlkX3BhcmFtcy0tOwogCiAJLyoKKwkgKiBXZSBzZXQgZWFjaCBpbmRpdmlkdWFsIGRldmljZSBhcyBJbl9zeW5jIHdpdGggYSBjb21wbGV0ZWQKKwkgKiAncmVjb3Zlcnlfb2Zmc2V0Jy4gIElmIHRoZXJlIGhhcyBiZWVuIGEgZGV2aWNlIGZhaWx1cmUgb3IKKwkgKiByZXBsYWNlbWVudCB0aGVuIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNhc2VzIGFwcGxpZXM6CisJICoKKwkgKiAgIDEpIFVzZXIgc3BlY2lmaWVzICdyZWJ1aWxkJy4KKwkgKiAgICAgIC0gRGV2aWNlIGlzIHJlc2V0IHdoZW4gcGFyYW0gaXMgcmVhZC4KKwkgKiAgIDIpIEEgbmV3IGRldmljZSBpcyBzdXBwbGllZC4KKwkgKiAgICAgIC0gTm8gbWF0Y2hpbmcgc3VwZXJibG9jayBmb3VuZCwgcmVzZXRzIGRldmljZS4KKwkgKiAgIDMpIERldmljZSBmYWlsdXJlIHdhcyB0cmFuc2llbnQgYW5kIHJldHVybnMgb24gcmVsb2FkLgorCSAqICAgICAgLSBGYWlsdXJlIG5vdGljZWQsIHJlc2V0cyBkZXZpY2UgZm9yIGJpdG1hcCByZXBsYXkuCisJICogICA0KSBEZXZpY2UgaGFkbid0IGNvbXBsZXRlZCByZWNvdmVyeSBhZnRlciBwcmV2aW91cyBmYWlsdXJlLgorCSAqICAgICAgLSBTdXBlcmJsb2NrIGlzIHJlYWQgYW5kIG92ZXJyaWRlcyByZWNvdmVyeV9vZmZzZXQuCisJICoKKwkgKiBXaGF0IGlzIGZvdW5kIGluIHRoZSBzdXBlcmJsb2NrcyBvZiB0aGUgZGV2aWNlcyBpcyBhbHdheXMKKwkgKiBhdXRob3JpdGF0aXZlLCB1bmxlc3MgJ3JlYnVpbGQnIG9yICdbbm9dc3luYycgd2FzIHNwZWNpZmllZC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgcnMtPm1kLnJhaWRfZGlza3M7IGkrKykgeworCQlzZXRfYml0KEluX3N5bmMsICZycy0+ZGV2W2ldLnJkZXYuZmxhZ3MpOworCQlycy0+ZGV2W2ldLnJkZXYucmVjb3Zlcnlfb2Zmc2V0ID0gTWF4U2VjdG9yOworCX0KKworCS8qCiAJICogU2Vjb25kLCBwYXJzZSB0aGUgdW5vcmRlcmVkIG9wdGlvbmFsIGFyZ3VtZW50cwogCSAqLwotCWZvciAoaSA9IDA7IGkgPCBycy0+bWQucmFpZF9kaXNrczsgaSsrKQotCQlzZXRfYml0KEluX3N5bmMsICZycy0+ZGV2W2ldLnJkZXYuZmxhZ3MpOwotCiAJZm9yIChpID0gMDsgaSA8IG51bV9yYWlkX3BhcmFtczsgaSsrKSB7Ci0JCWlmICghc3RyY21wKGFyZ3ZbaV0sICJub3N5bmMiKSkgeworCQlpZiAoIXN0cmNhc2VjbXAoYXJndltpXSwgIm5vc3luYyIpKSB7CiAJCQlycy0+bWQucmVjb3ZlcnlfY3AgPSBNYXhTZWN0b3I7CiAJCQlycy0+cHJpbnRfZmxhZ3MgfD0gRE1QRl9OT1NZTkM7Ci0JCQlycy0+bWQuZmxhZ3MgfD0gTURfU1lOQ19TVEFURV9GT1JDRUQ7CiAJCQljb250aW51ZTsKIAkJfQotCQlpZiAoIXN0cmNtcChhcmd2W2ldLCAic3luYyIpKSB7CisJCWlmICghc3RyY2FzZWNtcChhcmd2W2ldLCAic3luYyIpKSB7CiAJCQlycy0+bWQucmVjb3ZlcnlfY3AgPSAwOwogCQkJcnMtPnByaW50X2ZsYWdzIHw9IERNUEZfU1lOQzsKLQkJCXJzLT5tZC5mbGFncyB8PSBNRF9TWU5DX1NUQVRFX0ZPUkNFRDsKIAkJCWNvbnRpbnVlOwogCQl9CiAKQEAgLTMwMCw5ICs0MjgsMTMgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKLQkJaWYgKCFzdHJjbXAoa2V5LCAicmVidWlsZCIpKSB7Ci0JCQlpZiAoKytyZWJ1aWxkX2NudCA+IHJzLT5yYWlkX3R5cGUtPnBhcml0eV9kZXZzKSB7Ci0JCQkJcnMtPnRpLT5lcnJvciA9ICJUb28gbWFueSByZWJ1aWxkIGRyaXZlcyBnaXZlbiI7CisJCWlmICghc3RyY2FzZWNtcChrZXksICJyZWJ1aWxkIikpIHsKKwkJCXJlYnVpbGRfY250Kys7CisJCQlpZiAoKChycy0+cmFpZF90eXBlLT5sZXZlbCAhPSAxKSAmJgorCQkJICAgICAocmVidWlsZF9jbnQgPiBycy0+cmFpZF90eXBlLT5wYXJpdHlfZGV2cykpIHx8CisJCQkgICAgKChycy0+cmFpZF90eXBlLT5sZXZlbCA9PSAxKSAmJgorCQkJICAgICAocmVidWlsZF9jbnQgPiAocnMtPm1kLnJhaWRfZGlza3MgLSAxKSkpKSB7CisJCQkJcnMtPnRpLT5lcnJvciA9ICJUb28gbWFueSByZWJ1aWxkIGRldmljZXMgc3BlY2lmaWVkIGZvciBnaXZlbiBSQUlEIHR5cGUiOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQkJaWYgKHZhbHVlID4gcnMtPm1kLnJhaWRfZGlza3MpIHsKQEAgLTMxMSw3ICs0NDMsMjIgQEAKIAkJCX0KIAkJCWNsZWFyX2JpdChJbl9zeW5jLCAmcnMtPmRldlt2YWx1ZV0ucmRldi5mbGFncyk7CiAJCQlycy0+ZGV2W3ZhbHVlXS5yZGV2LnJlY292ZXJ5X29mZnNldCA9IDA7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChrZXksICJtYXhfd3JpdGVfYmVoaW5kIikpIHsKKwkJCXJzLT5wcmludF9mbGFncyB8PSBETVBGX1JFQlVJTEQ7CisJCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoa2V5LCAid3JpdGVfbW9zdGx5IikpIHsKKwkJCWlmIChycy0+cmFpZF90eXBlLT5sZXZlbCAhPSAxKSB7CisJCQkJcnMtPnRpLT5lcnJvciA9ICJ3cml0ZV9tb3N0bHkgb3B0aW9uIGlzIG9ubHkgdmFsaWQgZm9yIFJBSUQxIjsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWlmICh2YWx1ZSA+IHJzLT5tZC5yYWlkX2Rpc2tzKSB7CisJCQkJcnMtPnRpLT5lcnJvciA9ICJJbnZhbGlkIHdyaXRlX21vc3RseSBkcml2ZSBpbmRleCBnaXZlbiI7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlzZXRfYml0KFdyaXRlTW9zdGx5LCAmcnMtPmRldlt2YWx1ZV0ucmRldi5mbGFncyk7CisJCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoa2V5LCAibWF4X3dyaXRlX2JlaGluZCIpKSB7CisJCQlpZiAocnMtPnJhaWRfdHlwZS0+bGV2ZWwgIT0gMSkgeworCQkJCXJzLT50aS0+ZXJyb3IgPSAibWF4X3dyaXRlX2JlaGluZCBvcHRpb24gaXMgb25seSB2YWxpZCBmb3IgUkFJRDEiOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQogCQkJcnMtPnByaW50X2ZsYWdzIHw9IERNUEZfTUFYX1dSSVRFX0JFSElORDsKIAogCQkJLyoKQEAgLTMyNCwxNCArNDcxLDE0IEBACiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAJCQlycy0+bWQuYml0bWFwX2luZm8ubWF4X3dyaXRlX2JlaGluZCA9IHZhbHVlOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAoa2V5LCAiZGFlbW9uX3NsZWVwIikpIHsKKwkJfSBlbHNlIGlmICghc3RyY2FzZWNtcChrZXksICJkYWVtb25fc2xlZXAiKSkgewogCQkJcnMtPnByaW50X2ZsYWdzIHw9IERNUEZfREFFTU9OX1NMRUVQOwogCQkJaWYgKCF2YWx1ZSB8fCAodmFsdWUgPiBNQVhfU0NIRURVTEVfVElNRU9VVCkpIHsKIAkJCQlycy0+dGktPmVycm9yID0gImRhZW1vbiBzbGVlcCBwZXJpb2Qgb3V0IG9mIHJhbmdlIjsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJCXJzLT5tZC5iaXRtYXBfaW5mby5kYWVtb25fc2xlZXAgPSB2YWx1ZTsKLQkJfSBlbHNlIGlmICghc3RyY21wKGtleSwgInN0cmlwZV9jYWNoZSIpKSB7CisJCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoa2V5LCAic3RyaXBlX2NhY2hlIikpIHsKIAkJCXJzLT5wcmludF9mbGFncyB8PSBETVBGX1NUUklQRV9DQUNIRTsKIAogCQkJLyoKQEAgLTM0OCwyMCArNDk1LDIzIEBACiAJCQkJcnMtPnRpLT5lcnJvciA9ICJCYWQgc3RyaXBlX2NhY2hlIHNpemUiOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQotCQl9IGVsc2UgaWYgKCFzdHJjbXAoa2V5LCAibWluX3JlY292ZXJ5X3JhdGUiKSkgeworCQl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKGtleSwgIm1pbl9yZWNvdmVyeV9yYXRlIikpIHsKIAkJCXJzLT5wcmludF9mbGFncyB8PSBETVBGX01JTl9SRUNPVkVSWV9SQVRFOwogCQkJaWYgKHZhbHVlID4gSU5UX01BWCkgewogCQkJCXJzLT50aS0+ZXJyb3IgPSAibWluX3JlY292ZXJ5X3JhdGUgb3V0IG9mIHJhbmdlIjsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KIAkJCXJzLT5tZC5zeW5jX3NwZWVkX21pbiA9IChpbnQpdmFsdWU7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChrZXksICJtYXhfcmVjb3ZlcnlfcmF0ZSIpKSB7CisJCX0gZWxzZSBpZiAoIXN0cmNhc2VjbXAoa2V5LCAibWF4X3JlY292ZXJ5X3JhdGUiKSkgewogCQkJcnMtPnByaW50X2ZsYWdzIHw9IERNUEZfTUFYX1JFQ09WRVJZX1JBVEU7CiAJCQlpZiAodmFsdWUgPiBJTlRfTUFYKSB7CiAJCQkJcnMtPnRpLT5lcnJvciA9ICJtYXhfcmVjb3ZlcnlfcmF0ZSBvdXQgb2YgcmFuZ2UiOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQkJcnMtPm1kLnN5bmNfc3BlZWRfbWF4ID0gKGludCl2YWx1ZTsKKwkJfSBlbHNlIGlmICghc3RyY2FzZWNtcChrZXksICJyZWdpb25fc2l6ZSIpKSB7CisJCQlycy0+cHJpbnRfZmxhZ3MgfD0gRE1QRl9SRUdJT05fU0laRTsKKwkJCXJlZ2lvbl9zaXplID0gdmFsdWU7CiAJCX0gZWxzZSB7CiAJCQlETUVSUigiVW5hYmxlIHRvIHBhcnNlIFJBSUQgcGFyYW1ldGVyOiAlcyIsIGtleSk7CiAJCQlycy0+dGktPmVycm9yID0gIlVuYWJsZSB0byBwYXJzZSBSQUlEIHBhcmFtZXRlcnMiOwpAQCAtMzY5LDYgKzUxOSwxOSBAQAogCQl9CiAJfQogCisJaWYgKHZhbGlkYXRlX3JlZ2lvbl9zaXplKHJzLCByZWdpb25fc2l6ZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHJzLT5tZC5jaHVua19zZWN0b3JzKQorCQlycy0+dGktPnNwbGl0X2lvID0gcnMtPm1kLmNodW5rX3NlY3RvcnM7CisJZWxzZQorCQlycy0+dGktPnNwbGl0X2lvID0gcmVnaW9uX3NpemU7CisKKwlpZiAocnMtPm1kLmNodW5rX3NlY3RvcnMpCisJCXJzLT50aS0+c3BsaXRfaW8gPSBycy0+bWQuY2h1bmtfc2VjdG9yczsKKwllbHNlCisJCXJzLT50aS0+c3BsaXRfaW8gPSByZWdpb25fc2l6ZTsKKwogCS8qIEFzc3VtZSB0aGVyZSBhcmUgbm8gbWV0YWRhdGEgZGV2aWNlcyB1bnRpbCB0aGUgZHJpdmVzIGFyZSBwYXJzZWQgKi8KIAlycy0+bWQucGVyc2lzdGVudCA9IDA7CiAJcnMtPm1kLmV4dGVybmFsID0gMTsKQEAgLTM4NywxNyArNTUwLDM1MSBAQAogewogCXN0cnVjdCByYWlkX3NldCAqcnMgPSBjb250YWluZXJfb2YoY2IsIHN0cnVjdCByYWlkX3NldCwgY2FsbGJhY2tzKTsKIAorCWlmIChycy0+cmFpZF90eXBlLT5sZXZlbCA9PSAxKQorCQlyZXR1cm4gbWRfcmFpZDFfY29uZ2VzdGVkKCZycy0+bWQsIGJpdHMpOworCiAJcmV0dXJuIG1kX3JhaWQ1X2Nvbmdlc3RlZCgmcnMtPm1kLCBiaXRzKTsKIH0KIAogLyoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIG5ldmVyIHJvdXRpbmVseSB1c2VkIGJ5IHVzZXJzcGFjZSwgdW5saWtlIG1kIHN1cGVyYmxvY2tzLgorICogRGV2aWNlcyB3aXRoIHRoaXMgc3VwZXJibG9jayBzaG91bGQgb25seSBldmVyIGJlIGFjY2Vzc2VkIHZpYSBkZXZpY2UtbWFwcGVyLgorICovCisjZGVmaW5lIERNX1JBSURfTUFHSUMgMHg2NDUyNkQ0NAorc3RydWN0IGRtX3JhaWRfc3VwZXJibG9jayB7CisJX19sZTMyIG1hZ2ljOwkJLyogIkRtUmQiICovCisJX19sZTMyIGZlYXR1cmVzOwkvKiBVc2VkIHRvIGluZGljYXRlIHBvc3NpYmxlIGZ1dHVyZSBjaGFuZ2VzICovCisKKwlfX2xlMzIgbnVtX2RldmljZXM7CS8qIE51bWJlciBvZiBkZXZpY2VzIGluIHRoaXMgYXJyYXkuIChNYXggNjQpICovCisJX19sZTMyIGFycmF5X3Bvc2l0aW9uOwkvKiBUaGUgcG9zaXRpb24gb2YgdGhpcyBkcml2ZSBpbiB0aGUgYXJyYXkgKi8KKworCV9fbGU2NCBldmVudHM7CQkvKiBJbmNyZW1lbnRlZCBieSBtZCB3aGVuIHN1cGVyYmxvY2sgdXBkYXRlZCAqLworCV9fbGU2NCBmYWlsZWRfZGV2aWNlczsJLyogQml0IGZpZWxkIG9mIGRldmljZXMgdG8gaW5kaWNhdGUgZmFpbHVyZXMgKi8KKworCS8qCisJICogVGhpcyBvZmZzZXQgdHJhY2tzIHRoZSBwcm9ncmVzcyBvZiB0aGUgcmVwYWlyIG9yIHJlcGxhY2VtZW50IG9mCisJICogYW4gaW5kaXZpZHVhbCBkcml2ZS4KKwkgKi8KKwlfX2xlNjQgZGlza19yZWNvdmVyeV9vZmZzZXQ7CisKKwkvKgorCSAqIFRoaXMgb2Zmc2V0IHRyYWNrcyB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIGluaXRpYWwgYXJyYXkKKwkgKiBzeW5jaHJvbmlzYXRpb24vcGFyaXR5IGNhbGN1bGF0aW9uLgorCSAqLworCV9fbGU2NCBhcnJheV9yZXN5bmNfb2Zmc2V0OworCisJLyoKKwkgKiBSQUlEIGNoYXJhY3RlcmlzdGljcworCSAqLworCV9fbGUzMiBsZXZlbDsKKwlfX2xlMzIgbGF5b3V0OworCV9fbGUzMiBzdHJpcGVfc2VjdG9yczsKKworCV9fdTggcGFkWzQ1Ml07CQkvKiBSb3VuZCBzdHJ1Y3QgdG8gNTEyIGJ5dGVzLiAqLworCQkJCS8qIEFsd2F5cyBzZXQgdG8gMCB3aGVuIHdyaXRpbmcuICovCit9IF9fcGFja2VkOworCitzdGF0aWMgaW50IHJlYWRfZGlza19zYihtZGtfcmRldl90ICpyZGV2LCBpbnQgc2l6ZSkKK3sKKwlCVUdfT04oIXJkZXYtPnNiX3BhZ2UpOworCisJaWYgKHJkZXYtPnNiX2xvYWRlZCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXN5bmNfcGFnZV9pbyhyZGV2LCAwLCBzaXplLCByZGV2LT5zYl9wYWdlLCBSRUFELCAxKSkgeworCQlETUVSUigiRmFpbGVkIHRvIHJlYWQgZGV2aWNlIHN1cGVyYmxvY2siKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmRldi0+c2JfbG9hZGVkID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzdXBlcl9zeW5jKG1kZGV2X3QgKm1kZGV2LCBtZGtfcmRldl90ICpyZGV2KQoreworCW1ka19yZGV2X3QgKnIsICp0OworCXVpbnQ2NF90IGZhaWxlZF9kZXZpY2VzOworCXN0cnVjdCBkbV9yYWlkX3N1cGVyYmxvY2sgKnNiOworCisJc2IgPSBwYWdlX2FkZHJlc3MocmRldi0+c2JfcGFnZSk7CisJZmFpbGVkX2RldmljZXMgPSBsZTY0X3RvX2NwdShzYi0+ZmFpbGVkX2RldmljZXMpOworCisJcmRldl9mb3JfZWFjaChyLCB0LCBtZGRldikKKwkJaWYgKChyLT5yYWlkX2Rpc2sgPj0gMCkgJiYgdGVzdF9iaXQoRmF1bHR5LCAmci0+ZmxhZ3MpKQorCQkJZmFpbGVkX2RldmljZXMgfD0gKDFVTEwgPDwgci0+cmFpZF9kaXNrKTsKKworCW1lbXNldChzYiwgMCwgc2l6ZW9mKCpzYikpOworCisJc2ItPm1hZ2ljID0gY3B1X3RvX2xlMzIoRE1fUkFJRF9NQUdJQyk7CisJc2ItPmZlYXR1cmVzID0gY3B1X3RvX2xlMzIoMCk7CS8qIE5vIGZlYXR1cmVzIHlldCAqLworCisJc2ItPm51bV9kZXZpY2VzID0gY3B1X3RvX2xlMzIobWRkZXYtPnJhaWRfZGlza3MpOworCXNiLT5hcnJheV9wb3NpdGlvbiA9IGNwdV90b19sZTMyKHJkZXYtPnJhaWRfZGlzayk7CisKKwlzYi0+ZXZlbnRzID0gY3B1X3RvX2xlNjQobWRkZXYtPmV2ZW50cyk7CisJc2ItPmZhaWxlZF9kZXZpY2VzID0gY3B1X3RvX2xlNjQoZmFpbGVkX2RldmljZXMpOworCisJc2ItPmRpc2tfcmVjb3Zlcnlfb2Zmc2V0ID0gY3B1X3RvX2xlNjQocmRldi0+cmVjb3Zlcnlfb2Zmc2V0KTsKKwlzYi0+YXJyYXlfcmVzeW5jX29mZnNldCA9IGNwdV90b19sZTY0KG1kZGV2LT5yZWNvdmVyeV9jcCk7CisKKwlzYi0+bGV2ZWwgPSBjcHVfdG9fbGUzMihtZGRldi0+bGV2ZWwpOworCXNiLT5sYXlvdXQgPSBjcHVfdG9fbGUzMihtZGRldi0+bGF5b3V0KTsKKwlzYi0+c3RyaXBlX3NlY3RvcnMgPSBjcHVfdG9fbGUzMihtZGRldi0+Y2h1bmtfc2VjdG9ycyk7Cit9CisKKy8qCisgKiBzdXBlcl9sb2FkCisgKgorICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgc3VwZXJibG9jayBpZiBvbmUgaXMgbm90IGZvdW5kIG9uIHRoZSBkZXZpY2UKKyAqIGFuZCB3aWxsIGRlY2lkZSB3aGljaCBzdXBlcmJsb2NrIHRvIHVzZSBpZiB0aGVyZSdzIGEgY2hvaWNlLgorICoKKyAqIFJldHVybjogMSBpZiB1c2UgcmRldiwgMCBpZiB1c2UgcmVmZGV2LCAtRXh4eCBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBzdXBlcl9sb2FkKG1ka19yZGV2X3QgKnJkZXYsIG1ka19yZGV2X3QgKnJlZmRldikKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBkbV9yYWlkX3N1cGVyYmxvY2sgKnNiOworCXN0cnVjdCBkbV9yYWlkX3N1cGVyYmxvY2sgKnJlZnNiOworCXVpbnQ2NF90IGV2ZW50c19zYiwgZXZlbnRzX3JlZnNiOworCisJcmRldi0+c2Jfc3RhcnQgPSAwOworCXJkZXYtPnNiX3NpemUgPSBzaXplb2YoKnNiKTsKKworCXJldCA9IHJlYWRfZGlza19zYihyZGV2LCByZGV2LT5zYl9zaXplKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJc2IgPSBwYWdlX2FkZHJlc3MocmRldi0+c2JfcGFnZSk7CisJaWYgKHNiLT5tYWdpYyAhPSBjcHVfdG9fbGUzMihETV9SQUlEX01BR0lDKSkgeworCQlzdXBlcl9zeW5jKHJkZXYtPm1kZGV2LCByZGV2KTsKKworCQlzZXRfYml0KEZpcnN0VXNlLCAmcmRldi0+ZmxhZ3MpOworCisJCS8qIEZvcmNlIHdyaXRpbmcgb2Ygc3VwZXJibG9ja3MgdG8gZGlzayAqLworCQlzZXRfYml0KE1EX0NIQU5HRV9ERVZTLCAmcmRldi0+bWRkZXYtPmZsYWdzKTsKKworCQkvKiBBbnkgc3VwZXJibG9jayBpcyBiZXR0ZXIgdGhhbiBub25lLCBjaG9vc2UgdGhhdCBpZiBnaXZlbiAqLworCQlyZXR1cm4gcmVmZGV2ID8gMCA6IDE7CisJfQorCisJaWYgKCFyZWZkZXYpCisJCXJldHVybiAxOworCisJZXZlbnRzX3NiID0gbGU2NF90b19jcHUoc2ItPmV2ZW50cyk7CisKKwlyZWZzYiA9IHBhZ2VfYWRkcmVzcyhyZWZkZXYtPnNiX3BhZ2UpOworCWV2ZW50c19yZWZzYiA9IGxlNjRfdG9fY3B1KHJlZnNiLT5ldmVudHMpOworCisJcmV0dXJuIChldmVudHNfc2IgPiBldmVudHNfcmVmc2IpID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbnQgc3VwZXJfaW5pdF92YWxpZGF0aW9uKG1kZGV2X3QgKm1kZGV2LCBtZGtfcmRldl90ICpyZGV2KQoreworCWludCByb2xlOworCXN0cnVjdCByYWlkX3NldCAqcnMgPSBjb250YWluZXJfb2YobWRkZXYsIHN0cnVjdCByYWlkX3NldCwgbWQpOworCXVpbnQ2NF90IGV2ZW50c19zYjsKKwl1aW50NjRfdCBmYWlsZWRfZGV2aWNlczsKKwlzdHJ1Y3QgZG1fcmFpZF9zdXBlcmJsb2NrICpzYjsKKwl1aW50MzJfdCBuZXdfZGV2cyA9IDA7CisJdWludDMyX3QgcmVidWlsZHMgPSAwOworCW1ka19yZGV2X3QgKnIsICp0OworCXN0cnVjdCBkbV9yYWlkX3N1cGVyYmxvY2sgKnNiMjsKKworCXNiID0gcGFnZV9hZGRyZXNzKHJkZXYtPnNiX3BhZ2UpOworCWV2ZW50c19zYiA9IGxlNjRfdG9fY3B1KHNiLT5ldmVudHMpOworCWZhaWxlZF9kZXZpY2VzID0gbGU2NF90b19jcHUoc2ItPmZhaWxlZF9kZXZpY2VzKTsKKworCS8qCisJICogSW5pdGlhbGlzZSB0byAxIGlmIHRoaXMgaXMgYSBuZXcgc3VwZXJibG9jay4KKwkgKi8KKwltZGRldi0+ZXZlbnRzID0gZXZlbnRzX3NiID8gOiAxOworCisJLyoKKwkgKiBSZXNoYXBpbmcgaXMgbm90IGN1cnJlbnRseSBhbGxvd2VkCisJICovCisJaWYgKChsZTMyX3RvX2NwdShzYi0+bGV2ZWwpICE9IG1kZGV2LT5sZXZlbCkgfHwKKwkgICAgKGxlMzJfdG9fY3B1KHNiLT5sYXlvdXQpICE9IG1kZGV2LT5sYXlvdXQpIHx8CisJICAgIChsZTMyX3RvX2NwdShzYi0+c3RyaXBlX3NlY3RvcnMpICE9IG1kZGV2LT5jaHVua19zZWN0b3JzKSkgeworCQlETUVSUigiUmVzaGFwaW5nIGFycmF5cyBub3QgeWV0IHN1cHBvcnRlZC4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogV2UgY2FuIG9ubHkgY2hhbmdlIHRoZSBudW1iZXIgb2YgZGV2aWNlcyBpbiBSQUlEMSByaWdodCBub3cgKi8KKwlpZiAoKHJzLT5yYWlkX3R5cGUtPmxldmVsICE9IDEpICYmCisJICAgIChsZTMyX3RvX2NwdShzYi0+bnVtX2RldmljZXMpICE9IG1kZGV2LT5yYWlkX2Rpc2tzKSkgeworCQlETUVSUigiUmVzaGFwaW5nIGFycmF5cyBub3QgeWV0IHN1cHBvcnRlZC4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCEocnMtPnByaW50X2ZsYWdzICYgKERNUEZfU1lOQyB8IERNUEZfTk9TWU5DKSkpCisJCW1kZGV2LT5yZWNvdmVyeV9jcCA9IGxlNjRfdG9fY3B1KHNiLT5hcnJheV9yZXN5bmNfb2Zmc2V0KTsKKworCS8qCisJICogRHVyaW5nIGxvYWQsIHdlIHNldCBGaXJzdFVzZSBpZiBhIG5ldyBzdXBlcmJsb2NrIHdhcyB3cml0dGVuLgorCSAqIFRoZXJlIGFyZSB0d28gcmVhc29ucyB3ZSBtaWdodCBub3QgaGF2ZSBhIHN1cGVyYmxvY2s6CisJICogMSkgVGhlIGFycmF5IGlzIGJyYW5kIG5ldyAtIGluIHdoaWNoIGNhc2UsIGFsbCBvZiB0aGUKKwkgKiAgICBkZXZpY2VzIG11c3QgaGF2ZSB0aGVpciBJbl9zeW5jIGJpdCBzZXQuICBBbHNvLAorCSAqICAgIHJlY292ZXJ5X2NwIG11c3QgYmUgMCwgdW5sZXNzIGZvcmNlZC4KKwkgKiAyKSBUaGlzIGlzIGEgbmV3IGRldmljZSBiZWluZyBhZGRlZCB0byBhbiBvbGQgYXJyYXkKKwkgKiAgICBhbmQgdGhlIG5ldyBkZXZpY2UgbmVlZHMgdG8gYmUgcmVidWlsdCAtIGluIHdoaWNoCisJICogICAgY2FzZSB0aGUgSW5fc3luYyBiaXQgd2lsbCAvbm90LyBiZSBzZXQgYW5kCisJICogICAgcmVjb3ZlcnlfY3AgbXVzdCBiZSBNYXhTZWN0b3IuCisJICovCisJcmRldl9mb3JfZWFjaChyLCB0LCBtZGRldikgeworCQlpZiAoIXRlc3RfYml0KEluX3N5bmMsICZyLT5mbGFncykpIHsKKwkJCWlmICghdGVzdF9iaXQoRmlyc3RVc2UsICZyLT5mbGFncykpCisJCQkJRE1FUlIoIlN1cGVyYmxvY2sgYXJlYSBvZiAiCisJCQkJICAgICAgInJlYnVpbGQgZGV2aWNlICVkIHNob3VsZCBoYXZlIGJlZW4gIgorCQkJCSAgICAgICJjbGVhcmVkLiIsIHItPnJhaWRfZGlzayk7CisJCQlzZXRfYml0KEZpcnN0VXNlLCAmci0+ZmxhZ3MpOworCQkJcmVidWlsZHMrKzsKKwkJfSBlbHNlIGlmICh0ZXN0X2JpdChGaXJzdFVzZSwgJnItPmZsYWdzKSkKKwkJCW5ld19kZXZzKys7CisJfQorCisJaWYgKCFyZWJ1aWxkcykgeworCQlpZiAobmV3X2RldnMgPT0gbWRkZXYtPnJhaWRfZGlza3MpIHsKKwkJCURNSU5GTygiU3VwZXJibG9ja3MgY3JlYXRlZCBmb3IgbmV3IGFycmF5Iik7CisJCQlzZXRfYml0KE1EX0FSUkFZX0ZJUlNUX1VTRSwgJm1kZGV2LT5mbGFncyk7CisJCX0gZWxzZSBpZiAobmV3X2RldnMpIHsKKwkJCURNRVJSKCJOZXcgZGV2aWNlIGluamVjdGVkICIKKwkJCSAgICAgICJpbnRvIGV4aXN0aW5nIGFycmF5IHdpdGhvdXQgJ3JlYnVpbGQnICIKKwkJCSAgICAgICJwYXJhbWV0ZXIgc3BlY2lmaWVkIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSBpZiAobmV3X2RldnMpIHsKKwkJRE1FUlIoIidyZWJ1aWxkJyBkZXZpY2VzIGNhbm5vdCBiZSAiCisJCSAgICAgICJpbmplY3RlZCBpbnRvIGFuIGFycmF5IHdpdGggb3RoZXIgZmlyc3QtdGltZSBkZXZpY2VzIik7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSBpZiAobWRkZXYtPnJlY292ZXJ5X2NwICE9IE1heFNlY3RvcikgeworCQlETUVSUigiJ3JlYnVpbGQnIHNwZWNpZmllZCB3aGlsZSBhcnJheSBpcyBub3QgaW4tc3luYyIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIE5vdyB3ZSBzZXQgdGhlIEZhdWx0eSBiaXQgZm9yIHRob3NlIGRldmljZXMgdGhhdCBhcmUKKwkgKiByZWNvcmRlZCBpbiB0aGUgc3VwZXJibG9jayBhcyBmYWlsZWQuCisJICovCisJcmRldl9mb3JfZWFjaChyLCB0LCBtZGRldikgeworCQlpZiAoIXItPnNiX3BhZ2UpCisJCQljb250aW51ZTsKKwkJc2IyID0gcGFnZV9hZGRyZXNzKHItPnNiX3BhZ2UpOworCQlzYjItPmZhaWxlZF9kZXZpY2VzID0gMDsKKworCQkvKgorCQkgKiBDaGVjayBmb3IgYW55IGRldmljZSByZS1vcmRlcmluZy4KKwkJICovCisJCWlmICghdGVzdF9iaXQoRmlyc3RVc2UsICZyLT5mbGFncykgJiYgKHItPnJhaWRfZGlzayA+PSAwKSkgeworCQkJcm9sZSA9IGxlMzJfdG9fY3B1KHNiMi0+YXJyYXlfcG9zaXRpb24pOworCQkJaWYgKHJvbGUgIT0gci0+cmFpZF9kaXNrKSB7CisJCQkJaWYgKHJzLT5yYWlkX3R5cGUtPmxldmVsICE9IDEpIHsKKwkJCQkJcnMtPnRpLT5lcnJvciA9ICJDYW5ub3QgY2hhbmdlIGRldmljZSAiCisJCQkJCQkicG9zaXRpb25zIGluIFJBSUQgYXJyYXkiOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQkJRE1JTkZPKCJSQUlEMSBkZXZpY2UgIyVkIG5vdyBhdCBwb3NpdGlvbiAjJWQiLAorCQkJCSAgICAgICByb2xlLCByLT5yYWlkX2Rpc2spOworCQkJfQorCisJCQkvKgorCQkJICogUGFydGlhbCByZWNvdmVyeSBpcyBwZXJmb3JtZWQgb24KKwkJCSAqIHJldHVybmluZyBmYWlsZWQgZGV2aWNlcy4KKwkJCSAqLworCQkJaWYgKGZhaWxlZF9kZXZpY2VzICYgKDEgPDwgcm9sZSkpCisJCQkJc2V0X2JpdChGYXVsdHksICZyLT5mbGFncyk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdXBlcl92YWxpZGF0ZShtZGRldl90ICptZGRldiwgbWRrX3JkZXZfdCAqcmRldikKK3sKKwlzdHJ1Y3QgZG1fcmFpZF9zdXBlcmJsb2NrICpzYiA9IHBhZ2VfYWRkcmVzcyhyZGV2LT5zYl9wYWdlKTsKKworCS8qCisJICogSWYgbWRkZXYtPmV2ZW50cyBpcyBub3Qgc2V0LCB3ZSBrbm93IHdlIGhhdmUgbm90IHlldCBpbml0aWFsaXplZAorCSAqIHRoZSBhcnJheS4KKwkgKi8KKwlpZiAoIW1kZGV2LT5ldmVudHMgJiYgc3VwZXJfaW5pdF92YWxpZGF0aW9uKG1kZGV2LCByZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltZGRldi0+Yml0bWFwX2luZm8ub2Zmc2V0ID0gNDA5NiA+PiA5OyAvKiBFbmFibGUgYml0bWFwIGNyZWF0aW9uICovCisJcmRldi0+bWRkZXYtPmJpdG1hcF9pbmZvLmRlZmF1bHRfb2Zmc2V0ID0gNDA5NiA+PiA5OworCWlmICghdGVzdF9iaXQoRmlyc3RVc2UsICZyZGV2LT5mbGFncykpIHsKKwkJcmRldi0+cmVjb3Zlcnlfb2Zmc2V0ID0gbGU2NF90b19jcHUoc2ItPmRpc2tfcmVjb3Zlcnlfb2Zmc2V0KTsKKwkJaWYgKHJkZXYtPnJlY292ZXJ5X29mZnNldCAhPSBNYXhTZWN0b3IpCisJCQljbGVhcl9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKTsKKwl9CisKKwkvKgorCSAqIElmIGEgZGV2aWNlIGNvbWVzIGJhY2ssIHNldCBpdCBhcyBub3QgSW5fc3luYyBhbmQgbm8gbG9uZ2VyIGZhdWx0eS4KKwkgKi8KKwlpZiAodGVzdF9iaXQoRmF1bHR5LCAmcmRldi0+ZmxhZ3MpKSB7CisJCWNsZWFyX2JpdChGYXVsdHksICZyZGV2LT5mbGFncyk7CisJCWNsZWFyX2JpdChJbl9zeW5jLCAmcmRldi0+ZmxhZ3MpOworCQlyZGV2LT5zYXZlZF9yYWlkX2Rpc2sgPSByZGV2LT5yYWlkX2Rpc2s7CisJCXJkZXYtPnJlY292ZXJ5X29mZnNldCA9IDA7CisJfQorCisJY2xlYXJfYml0KEZpcnN0VXNlLCAmcmRldi0+ZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBbmFseXNlIHN1cGVyYmxvY2tzIGFuZCBzZWxlY3QgdGhlIGZyZXNoZXN0LgorICovCitzdGF0aWMgaW50IGFuYWx5c2Vfc3VwZXJibG9ja3Moc3RydWN0IGRtX3RhcmdldCAqdGksIHN0cnVjdCByYWlkX3NldCAqcnMpCit7CisJaW50IHJldDsKKwltZGtfcmRldl90ICpyZGV2LCAqZnJlc2hlc3QsICp0bXA7CisJbWRkZXZfdCAqbWRkZXYgPSAmcnMtPm1kOworCisJZnJlc2hlc3QgPSBOVUxMOworCXJkZXZfZm9yX2VhY2gocmRldiwgdG1wLCBtZGRldikgeworCQlpZiAoIXJkZXYtPm1ldGFfYmRldikKKwkJCWNvbnRpbnVlOworCisJCXJldCA9IHN1cGVyX2xvYWQocmRldiwgZnJlc2hlc3QpOworCisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgMToKKwkJCWZyZXNoZXN0ID0gcmRldjsKKwkJCWJyZWFrOworCQljYXNlIDA6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXRpLT5lcnJvciA9ICJGYWlsZWQgdG8gbG9hZCBzdXBlcmJsb2NrIjsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKKwlpZiAoIWZyZXNoZXN0KQorCQlyZXR1cm4gMDsKKworCS8qCisJICogVmFsaWRhdGlvbiBvZiB0aGUgZnJlc2hlc3QgZGV2aWNlIHByb3ZpZGVzIHRoZSBzb3VyY2Ugb2YKKwkgKiB2YWxpZGF0aW9uIGZvciB0aGUgcmVtYWluaW5nIGRldmljZXMuCisJICovCisJdGktPmVycm9yID0gIlVuYWJsZSB0byBhc3NlbWJsZSBhcnJheTogSW52YWxpZCBzdXBlcmJsb2NrcyI7CisJaWYgKHN1cGVyX3ZhbGlkYXRlKG1kZGV2LCBmcmVzaGVzdCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmRldl9mb3JfZWFjaChyZGV2LCB0bXAsIG1kZGV2KQorCQlpZiAoKHJkZXYgIT0gZnJlc2hlc3QpICYmIHN1cGVyX3ZhbGlkYXRlKG1kZGV2LCByZGV2KSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIDA7Cit9CisKKy8qCiAgKiBDb25zdHJ1Y3QgYSBSQUlENC81LzYgbWFwcGluZzoKICAqIEFyZ3M6CiAgKgk8cmFpZF90eXBlPiA8I3JhaWRfcGFyYW1zPiA8cmFpZF9wYXJhbXM+CQlcCiAgKgk8I3JhaWRfZGV2cz4geyA8bWV0YV9kZXYxPiA8ZGV2MT4gLi4gPG1ldGFfZGV2Tj4gPGRldk4+IH0KICAqCi0gKiAqKiBtZXRhZGF0YSBkZXZpY2VzIGFyZSBub3Qgc3VwcG9ydGVkIHlldCwgdXNlICctJyBpbnN0ZWFkICoqCi0gKgogICogPHJhaWRfcGFyYW1zPiB2YXJpZXMgYnkgPHJhaWRfdHlwZT4uICBTZWUgJ3BhcnNlX3JhaWRfcGFyYW1zJyBmb3IKICAqIGRldGFpbHMgb24gcG9zc2libGUgPHJhaWRfcGFyYW1zPi4KICAqLwpAQCAtNDY1LDggKzk2MiwxMiBAQAogCWlmIChyZXQpCiAJCWdvdG8gYmFkOwogCisJcnMtPm1kLnN5bmNfc3VwZXIgPSBzdXBlcl9zeW5jOworCXJldCA9IGFuYWx5c2Vfc3VwZXJibG9ja3ModGksIHJzKTsKKwlpZiAocmV0KQorCQlnb3RvIGJhZDsKKwogCUlOSVRfV09SSygmcnMtPm1kLmV2ZW50X3dvcmssIGRvX3RhYmxlX2V2ZW50KTsKLQl0aS0+c3BsaXRfaW8gPSBycy0+bWQuY2h1bmtfc2VjdG9yczsKIAl0aS0+cHJpdmF0ZSA9IHJzOwogCiAJbXV0ZXhfbG9jaygmcnMtPm1kLnJlY29uZmlnX211dGV4KTsKQEAgLTQ4Miw2ICs5ODMsNyBAQAogCXJzLT5jYWxsYmFja3MuY29uZ2VzdGVkX2ZuID0gcmFpZF9pc19jb25nZXN0ZWQ7CiAJZG1fdGFibGVfYWRkX3RhcmdldF9jYWxsYmFja3ModGktPnRhYmxlLCAmcnMtPmNhbGxiYWNrcyk7CiAKKwltZGRldl9zdXNwZW5kKCZycy0+bWQpOwogCXJldHVybiAwOwogCiBiYWQ6CkBAIC01NDYsMTIgKzEwNDgsMTcgQEAKIAkJYnJlYWs7CiAJY2FzZSBTVEFUVVNUWVBFX1RBQkxFOgogCQkvKiBUaGUgc3RyaW5nIHlvdSB3b3VsZCB1c2UgdG8gY29uc3RydWN0IHRoaXMgYXJyYXkgKi8KLQkJZm9yIChpID0gMDsgaSA8IHJzLT5tZC5yYWlkX2Rpc2tzOyBpKyspCi0JCQlpZiAocnMtPmRldltpXS5kYXRhX2RldiAmJgorCQlmb3IgKGkgPSAwOyBpIDwgcnMtPm1kLnJhaWRfZGlza3M7IGkrKykgeworCQkJaWYgKChycy0+cHJpbnRfZmxhZ3MgJiBETVBGX1JFQlVJTEQpICYmCisJCQkgICAgcnMtPmRldltpXS5kYXRhX2RldiAmJgogCQkJICAgICF0ZXN0X2JpdChJbl9zeW5jLCAmcnMtPmRldltpXS5yZGV2LmZsYWdzKSkKLQkJCQlyYWlkX3BhcmFtX2NudCsrOyAvKiBmb3IgcmVidWlsZHMgKi8KKwkJCQlyYWlkX3BhcmFtX2NudCArPSAyOyAvKiBmb3IgcmVidWlsZHMgKi8KKwkJCWlmIChycy0+ZGV2W2ldLmRhdGFfZGV2ICYmCisJCQkgICAgdGVzdF9iaXQoV3JpdGVNb3N0bHksICZycy0+ZGV2W2ldLnJkZXYuZmxhZ3MpKQorCQkJCXJhaWRfcGFyYW1fY250ICs9IDI7CisJCX0KIAotCQlyYWlkX3BhcmFtX2NudCArPSAoaHdlaWdodDY0KHJzLT5wcmludF9mbGFncykgKiAyKTsKKwkJcmFpZF9wYXJhbV9jbnQgKz0gKGh3ZWlnaHQ2NChycy0+cHJpbnRfZmxhZ3MgJiB+RE1QRl9SRUJVSUxEKSAqIDIpOwogCQlpZiAocnMtPnByaW50X2ZsYWdzICYgKERNUEZfU1lOQyB8IERNUEZfTk9TWU5DKSkKIAkJCXJhaWRfcGFyYW1fY250LS07CiAKQEAgLTU2NSw3ICsxMDcyLDggQEAKIAkJCURNRU1JVCgiIG5vc3luYyIpOwogCiAJCWZvciAoaSA9IDA7IGkgPCBycy0+bWQucmFpZF9kaXNrczsgaSsrKQotCQkJaWYgKHJzLT5kZXZbaV0uZGF0YV9kZXYgJiYKKwkJCWlmICgocnMtPnByaW50X2ZsYWdzICYgRE1QRl9SRUJVSUxEKSAmJgorCQkJICAgIHJzLT5kZXZbaV0uZGF0YV9kZXYgJiYKIAkJCSAgICAhdGVzdF9iaXQoSW5fc3luYywgJnJzLT5kZXZbaV0ucmRldi5mbGFncykpCiAJCQkJRE1FTUlUKCIgcmVidWlsZCAldSIsIGkpOwogCkBAIC01NzksNiArMTA4NywxMSBAQAogCQlpZiAocnMtPnByaW50X2ZsYWdzICYgRE1QRl9NQVhfUkVDT1ZFUllfUkFURSkKIAkJCURNRU1JVCgiIG1heF9yZWNvdmVyeV9yYXRlICVkIiwgcnMtPm1kLnN5bmNfc3BlZWRfbWF4KTsKIAorCQlmb3IgKGkgPSAwOyBpIDwgcnMtPm1kLnJhaWRfZGlza3M7IGkrKykKKwkJCWlmIChycy0+ZGV2W2ldLmRhdGFfZGV2ICYmCisJCQkgICAgdGVzdF9iaXQoV3JpdGVNb3N0bHksICZycy0+ZGV2W2ldLnJkZXYuZmxhZ3MpKQorCQkJCURNRU1JVCgiIHdyaXRlX21vc3RseSAldSIsIGkpOworCiAJCWlmIChycy0+cHJpbnRfZmxhZ3MgJiBETVBGX01BWF9XUklURV9CRUhJTkQpCiAJCQlETUVNSVQoIiBtYXhfd3JpdGVfYmVoaW5kICVsdSIsCiAJCQkgICAgICAgcnMtPm1kLmJpdG1hcF9pbmZvLm1heF93cml0ZV9iZWhpbmQpOwpAQCAtNTkxLDkgKzExMDQsMTYgQEAKIAkJCSAgICAgICBjb25mID8gY29uZi0+bWF4X25yX3N0cmlwZXMgKiAyIDogMCk7CiAJCX0KIAorCQlpZiAocnMtPnByaW50X2ZsYWdzICYgRE1QRl9SRUdJT05fU0laRSkKKwkJCURNRU1JVCgiIHJlZ2lvbl9zaXplICVsdSIsCisJCQkgICAgICAgcnMtPm1kLmJpdG1hcF9pbmZvLmNodW5rc2l6ZSA+PiA5KTsKKwogCQlETUVNSVQoIiAlZCIsIHJzLT5tZC5yYWlkX2Rpc2tzKTsKIAkJZm9yIChpID0gMDsgaSA8IHJzLT5tZC5yYWlkX2Rpc2tzOyBpKyspIHsKLQkJCURNRU1JVCgiIC0iKTsgLyogbWV0YWRhdGEgZGV2aWNlICovCisJCQlpZiAocnMtPmRldltpXS5tZXRhX2RldikKKwkJCQlETUVNSVQoIiAlcyIsIHJzLT5kZXZbaV0ubWV0YV9kZXYtPm5hbWUpOworCQkJZWxzZQorCQkJCURNRU1JVCgiIC0iKTsKIAogCQkJaWYgKHJzLT5kZXZbaV0uZGF0YV9kZXYpCiAJCQkJRE1FTUlUKCIgJXMiLCBycy0+ZGV2W2ldLmRhdGFfZGV2LT5uYW1lKTsKQEAgLTY1MCwxMiArMTE3MCwxMyBAQAogewogCXN0cnVjdCByYWlkX3NldCAqcnMgPSB0aS0+cHJpdmF0ZTsKIAorCWJpdG1hcF9sb2FkKCZycy0+bWQpOwogCW1kZGV2X3Jlc3VtZSgmcnMtPm1kKTsKIH0KIAogc3RhdGljIHN0cnVjdCB0YXJnZXRfdHlwZSByYWlkX3RhcmdldCA9IHsKIAkubmFtZSA9ICJyYWlkIiwKLQkudmVyc2lvbiA9IHsxLCAwLCAwfSwKKwkudmVyc2lvbiA9IHsxLCAxLCAwfSwKIAkubW9kdWxlID0gVEhJU19NT0RVTEUsCiAJLmN0ciA9IHJhaWRfY3RyLAogCS5kdHIgPSByYWlkX2R0ciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tc25hcC1wZXJzaXN0ZW50LmMgYi9kcml2ZXJzL21kL2RtLXNuYXAtcGVyc2lzdGVudC5jCmluZGV4IDEzNWMyZjEuLmQxZjFkNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tc25hcC1wZXJzaXN0ZW50LmMKKysrIGIvZHJpdmVycy9tZC9kbS1zbmFwLXBlcnNpc3RlbnQuYwpAQCAtNTgsMjUgKzU4LDMwIEBACiAjZGVmaW5lIE5VTV9TTkFQU0hPVF9IRFJfQ0hVTktTIDEKIAogc3RydWN0IGRpc2tfaGVhZGVyIHsKLQl1aW50MzJfdCBtYWdpYzsKKwlfX2xlMzIgbWFnaWM7CiAKIAkvKgogCSAqIElzIHRoaXMgc25hcHNob3QgdmFsaWQuICBUaGVyZSBpcyBubyB3YXkgb2YgcmVjb3ZlcmluZwogCSAqIGFuIGludmFsaWQgc25hcHNob3QuCiAJICovCi0JdWludDMyX3QgdmFsaWQ7CisJX19sZTMyIHZhbGlkOwogCiAJLyoKIAkgKiBTaW1wbGUsIGluY3JlbWVudGluZyB2ZXJzaW9uLiBubyBiYWNrd2FyZAogCSAqIGNvbXBhdGliaWxpdHkuCiAJICovCi0JdWludDMyX3QgdmVyc2lvbjsKKwlfX2xlMzIgdmVyc2lvbjsKIAogCS8qIEluIHNlY3RvcnMgKi8KLQl1aW50MzJfdCBjaHVua19zaXplOwotfTsKKwlfX2xlMzIgY2h1bmtfc2l6ZTsKK30gX19wYWNrZWQ7CiAKIHN0cnVjdCBkaXNrX2V4Y2VwdGlvbiB7CisJX19sZTY0IG9sZF9jaHVuazsKKwlfX2xlNjQgbmV3X2NodW5rOworfSBfX3BhY2tlZDsKKworc3RydWN0IGNvcmVfZXhjZXB0aW9uIHsKIAl1aW50NjRfdCBvbGRfY2h1bms7CiAJdWludDY0X3QgbmV3X2NodW5rOwogfTsKQEAgLTE2OSwxMCArMTc0LDkgQEAKIAlpZiAoIXBzLT5hcmVhKQogCQlnb3RvIGVycl9hcmVhOwogCi0JcHMtPnplcm9fYXJlYSA9IHZtYWxsb2MobGVuKTsKKwlwcy0+emVyb19hcmVhID0gdnphbGxvYyhsZW4pOwogCWlmICghcHMtPnplcm9fYXJlYSkKIAkJZ290byBlcnJfemVyb19hcmVhOwotCW1lbXNldChwcy0+emVyb19hcmVhLCAwLCBsZW4pOwogCiAJcHMtPmhlYWRlcl9hcmVhID0gdm1hbGxvYyhsZW4pOwogCWlmICghcHMtPmhlYWRlcl9hcmVhKQpAQCAtMzk2LDMyICs0MDAsMzIgQEAKIH0KIAogc3RhdGljIHZvaWQgcmVhZF9leGNlcHRpb24oc3RydWN0IHBzdG9yZSAqcHMsCi0JCQkgICB1aW50MzJfdCBpbmRleCwgc3RydWN0IGRpc2tfZXhjZXB0aW9uICpyZXN1bHQpCisJCQkgICB1aW50MzJfdCBpbmRleCwgc3RydWN0IGNvcmVfZXhjZXB0aW9uICpyZXN1bHQpCiB7Ci0Jc3RydWN0IGRpc2tfZXhjZXB0aW9uICplID0gZ2V0X2V4Y2VwdGlvbihwcywgaW5kZXgpOworCXN0cnVjdCBkaXNrX2V4Y2VwdGlvbiAqZGUgPSBnZXRfZXhjZXB0aW9uKHBzLCBpbmRleCk7CiAKIAkvKiBjb3B5IGl0ICovCi0JcmVzdWx0LT5vbGRfY2h1bmsgPSBsZTY0X3RvX2NwdShlLT5vbGRfY2h1bmspOwotCXJlc3VsdC0+bmV3X2NodW5rID0gbGU2NF90b19jcHUoZS0+bmV3X2NodW5rKTsKKwlyZXN1bHQtPm9sZF9jaHVuayA9IGxlNjRfdG9fY3B1KGRlLT5vbGRfY2h1bmspOworCXJlc3VsdC0+bmV3X2NodW5rID0gbGU2NF90b19jcHUoZGUtPm5ld19jaHVuayk7CiB9CiAKIHN0YXRpYyB2b2lkIHdyaXRlX2V4Y2VwdGlvbihzdHJ1Y3QgcHN0b3JlICpwcywKLQkJCSAgICB1aW50MzJfdCBpbmRleCwgc3RydWN0IGRpc2tfZXhjZXB0aW9uICpkZSkKKwkJCSAgICB1aW50MzJfdCBpbmRleCwgc3RydWN0IGNvcmVfZXhjZXB0aW9uICplKQogewotCXN0cnVjdCBkaXNrX2V4Y2VwdGlvbiAqZSA9IGdldF9leGNlcHRpb24ocHMsIGluZGV4KTsKKwlzdHJ1Y3QgZGlza19leGNlcHRpb24gKmRlID0gZ2V0X2V4Y2VwdGlvbihwcywgaW5kZXgpOwogCiAJLyogY29weSBpdCAqLwotCWUtPm9sZF9jaHVuayA9IGNwdV90b19sZTY0KGRlLT5vbGRfY2h1bmspOwotCWUtPm5ld19jaHVuayA9IGNwdV90b19sZTY0KGRlLT5uZXdfY2h1bmspOworCWRlLT5vbGRfY2h1bmsgPSBjcHVfdG9fbGU2NChlLT5vbGRfY2h1bmspOworCWRlLT5uZXdfY2h1bmsgPSBjcHVfdG9fbGU2NChlLT5uZXdfY2h1bmspOwogfQogCiBzdGF0aWMgdm9pZCBjbGVhcl9leGNlcHRpb24oc3RydWN0IHBzdG9yZSAqcHMsIHVpbnQzMl90IGluZGV4KQogewotCXN0cnVjdCBkaXNrX2V4Y2VwdGlvbiAqZSA9IGdldF9leGNlcHRpb24ocHMsIGluZGV4KTsKKwlzdHJ1Y3QgZGlza19leGNlcHRpb24gKmRlID0gZ2V0X2V4Y2VwdGlvbihwcywgaW5kZXgpOwogCiAJLyogY2xlYXIgaXQgKi8KLQllLT5vbGRfY2h1bmsgPSAwOwotCWUtPm5ld19jaHVuayA9IDA7CisJZGUtPm9sZF9jaHVuayA9IDA7CisJZGUtPm5ld19jaHVuayA9IDA7CiB9CiAKIC8qCkBAIC00MzcsMTMgKzQ0MSwxMyBAQAogewogCWludCByOwogCXVuc2lnbmVkIGludCBpOwotCXN0cnVjdCBkaXNrX2V4Y2VwdGlvbiBkZTsKKwlzdHJ1Y3QgY29yZV9leGNlcHRpb24gZTsKIAogCS8qIHByZXN1bWUgdGhlIGFyZWEgaXMgZnVsbCAqLwogCSpmdWxsID0gMTsKIAogCWZvciAoaSA9IDA7IGkgPCBwcy0+ZXhjZXB0aW9uc19wZXJfYXJlYTsgaSsrKSB7Ci0JCXJlYWRfZXhjZXB0aW9uKHBzLCBpLCAmZGUpOworCQlyZWFkX2V4Y2VwdGlvbihwcywgaSwgJmUpOwogCiAJCS8qCiAJCSAqIElmIHRoZSBuZXdfY2h1bmsgaXMgcG9pbnRpbmcgYXQgdGhlIHN0YXJ0IG9mCkBAIC00NTEsNyArNDU1LDcgQEAKIAkJICogaXMgd2Uga25vdyB0aGF0IHdlJ3ZlIGhpdCB0aGUgZW5kIG9mIHRoZQogCQkgKiBleGNlcHRpb25zLiAgVGhlcmVmb3JlIHRoZSBhcmVhIGlzIG5vdCBmdWxsLgogCQkgKi8KLQkJaWYgKGRlLm5ld19jaHVuayA9PSAwTEwpIHsKKwkJaWYgKGUubmV3X2NodW5rID09IDBMTCkgewogCQkJcHMtPmN1cnJlbnRfY29tbWl0dGVkID0gaTsKIAkJCSpmdWxsID0gMDsKIAkJCWJyZWFrOwpAQCAtNDYwLDEzICs0NjQsMTMgQEAKIAkJLyoKIAkJICogS2VlcCB0cmFjayBvZiB0aGUgc3RhcnQgb2YgdGhlIGZyZWUgY2h1bmtzLgogCQkgKi8KLQkJaWYgKHBzLT5uZXh0X2ZyZWUgPD0gZGUubmV3X2NodW5rKQotCQkJcHMtPm5leHRfZnJlZSA9IGRlLm5ld19jaHVuayArIDE7CisJCWlmIChwcy0+bmV4dF9mcmVlIDw9IGUubmV3X2NodW5rKQorCQkJcHMtPm5leHRfZnJlZSA9IGUubmV3X2NodW5rICsgMTsKIAogCQkvKgogCQkgKiBPdGhlcndpc2Ugd2UgYWRkIHRoZSBleGNlcHRpb24gdG8gdGhlIHNuYXBzaG90LgogCQkgKi8KLQkJciA9IGNhbGxiYWNrKGNhbGxiYWNrX2NvbnRleHQsIGRlLm9sZF9jaHVuaywgZGUubmV3X2NodW5rKTsKKwkJciA9IGNhbGxiYWNrKGNhbGxiYWNrX2NvbnRleHQsIGUub2xkX2NodW5rLCBlLm5ld19jaHVuayk7CiAJCWlmIChyKQogCQkJcmV0dXJuIHI7CiAJfQpAQCAtNTYzLDcgKzU2Nyw3IEBACiAJcHMtPmV4Y2VwdGlvbnNfcGVyX2FyZWEgPSAocHMtPnN0b3JlLT5jaHVua19zaXplIDw8IFNFQ1RPUl9TSElGVCkgLwogCQkJCSAgc2l6ZW9mKHN0cnVjdCBkaXNrX2V4Y2VwdGlvbik7CiAJcHMtPmNhbGxiYWNrcyA9IGRtX3ZjYWxsb2MocHMtPmV4Y2VwdGlvbnNfcGVyX2FyZWEsCi0JCQlzaXplb2YoKnBzLT5jYWxsYmFja3MpKTsKKwkJCQkgICBzaXplb2YoKnBzLT5jYWxsYmFja3MpKTsKIAlpZiAoIXBzLT5jYWxsYmFja3MpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC02NDEsMTIgKzY0NSwxMiBAQAogewogCXVuc2lnbmVkIGludCBpOwogCXN0cnVjdCBwc3RvcmUgKnBzID0gZ2V0X2luZm8oc3RvcmUpOwotCXN0cnVjdCBkaXNrX2V4Y2VwdGlvbiBkZTsKKwlzdHJ1Y3QgY29yZV9leGNlcHRpb24gY2U7CiAJc3RydWN0IGNvbW1pdF9jYWxsYmFjayAqY2I7CiAKLQlkZS5vbGRfY2h1bmsgPSBlLT5vbGRfY2h1bms7Ci0JZGUubmV3X2NodW5rID0gZS0+bmV3X2NodW5rOwotCXdyaXRlX2V4Y2VwdGlvbihwcywgcHMtPmN1cnJlbnRfY29tbWl0dGVkKyssICZkZSk7CisJY2Uub2xkX2NodW5rID0gZS0+b2xkX2NodW5rOworCWNlLm5ld19jaHVuayA9IGUtPm5ld19jaHVuazsKKwl3cml0ZV9leGNlcHRpb24ocHMsIHBzLT5jdXJyZW50X2NvbW1pdHRlZCsrLCAmY2UpOwogCiAJLyoKIAkgKiBBZGQgdGhlIGNhbGxiYWNrIHRvIHRoZSBiYWNrIG9mIHRoZSBhcnJheS4gIFRoaXMgY29kZQpAQCAtNjcwLDcgKzY3NCw3IEBACiAJICogSWYgd2UgY29tcGxldGVseSBmaWxsZWQgdGhlIGN1cnJlbnQgYXJlYSwgdGhlbiB3aXBlIHRoZSBuZXh0IG9uZS4KIAkgKi8KIAlpZiAoKHBzLT5jdXJyZW50X2NvbW1pdHRlZCA9PSBwcy0+ZXhjZXB0aW9uc19wZXJfYXJlYSkgJiYKLQkgICAgIHplcm9fZGlza19hcmVhKHBzLCBwcy0+Y3VycmVudF9hcmVhICsgMSkpCisJICAgIHplcm9fZGlza19hcmVhKHBzLCBwcy0+Y3VycmVudF9hcmVhICsgMSkpCiAJCXBzLT52YWxpZCA9IDA7CiAKIAkvKgpAQCAtNzAxLDcgKzcwNSw3IEBACiAJCQkJICAgIGNodW5rX3QgKmxhc3RfbmV3X2NodW5rKQogewogCXN0cnVjdCBwc3RvcmUgKnBzID0gZ2V0X2luZm8oc3RvcmUpOwotCXN0cnVjdCBkaXNrX2V4Y2VwdGlvbiBkZTsKKwlzdHJ1Y3QgY29yZV9leGNlcHRpb24gY2U7CiAJaW50IG5yX2NvbnNlY3V0aXZlOwogCWludCByOwogCkBAIC03MjIsOSArNzI2LDkgQEAKIAkJcHMtPmN1cnJlbnRfY29tbWl0dGVkID0gcHMtPmV4Y2VwdGlvbnNfcGVyX2FyZWE7CiAJfQogCi0JcmVhZF9leGNlcHRpb24ocHMsIHBzLT5jdXJyZW50X2NvbW1pdHRlZCAtIDEsICZkZSk7Ci0JKmxhc3Rfb2xkX2NodW5rID0gZGUub2xkX2NodW5rOwotCSpsYXN0X25ld19jaHVuayA9IGRlLm5ld19jaHVuazsKKwlyZWFkX2V4Y2VwdGlvbihwcywgcHMtPmN1cnJlbnRfY29tbWl0dGVkIC0gMSwgJmNlKTsKKwkqbGFzdF9vbGRfY2h1bmsgPSBjZS5vbGRfY2h1bms7CisJKmxhc3RfbmV3X2NodW5rID0gY2UubmV3X2NodW5rOwogCiAJLyoKIAkgKiBGaW5kIG51bWJlciBvZiBjb25zZWN1dGl2ZSBjaHVua3Mgd2l0aGluIHRoZSBjdXJyZW50IGFyZWEsCkBAIC03MzMsOSArNzM3LDkgQEAKIAlmb3IgKG5yX2NvbnNlY3V0aXZlID0gMTsgbnJfY29uc2VjdXRpdmUgPCBwcy0+Y3VycmVudF9jb21taXR0ZWQ7CiAJICAgICBucl9jb25zZWN1dGl2ZSsrKSB7CiAJCXJlYWRfZXhjZXB0aW9uKHBzLCBwcy0+Y3VycmVudF9jb21taXR0ZWQgLSAxIC0gbnJfY29uc2VjdXRpdmUsCi0JCQkgICAgICAgJmRlKTsKLQkJaWYgKGRlLm9sZF9jaHVuayAhPSAqbGFzdF9vbGRfY2h1bmsgLSBucl9jb25zZWN1dGl2ZSB8fAotCQkgICAgZGUubmV3X2NodW5rICE9ICpsYXN0X25ld19jaHVuayAtIG5yX2NvbnNlY3V0aXZlKQorCQkJICAgICAgICZjZSk7CisJCWlmIChjZS5vbGRfY2h1bmsgIT0gKmxhc3Rfb2xkX2NodW5rIC0gbnJfY29uc2VjdXRpdmUgfHwKKwkJICAgIGNlLm5ld19jaHVuayAhPSAqbGFzdF9uZXdfY2h1bmsgLSBucl9jb25zZWN1dGl2ZSkKIAkJCWJyZWFrOwogCX0KIApAQCAtNzUzLDcgKzc1Nyw3IEBACiAJZm9yIChpID0gMDsgaSA8IG5yX21lcmdlZDsgaSsrKQogCQljbGVhcl9leGNlcHRpb24ocHMsIHBzLT5jdXJyZW50X2NvbW1pdHRlZCAtIDEgLSBpKTsKIAotCXIgPSBhcmVhX2lvKHBzLCBXUklURSk7CisJciA9IGFyZWFfaW8ocHMsIFdSSVRFX0ZMVVNIX0ZVQSk7CiAJaWYgKHIgPCAwKQogCQlyZXR1cm4gcjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS1zbmFwLmMgYi9kcml2ZXJzL21kL2RtLXNuYXAuYwppbmRleCA5ZWNmZjVmLi42Zjc1ODg3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL2RtLXNuYXAuYworKysgYi9kcml2ZXJzL21kL2RtLXNuYXAuYwpAQCAtMzAsMTYgKzMwLDYgQEAKIAkoKHRpKS0+dHlwZS0+bmFtZSA9PSBkbV9zbmFwc2hvdF9tZXJnZV90YXJnZXRfbmFtZSkKIAogLyoKLSAqIFRoZSBwZXJjZW50YWdlIGluY3JlbWVudCB3ZSB3aWxsIHdha2UgdXAgdXNlcnMgYXQKLSAqLwotI2RlZmluZSBXQUtFX1VQX1BFUkNFTlQgNQotCi0vKgotICoga2NvcHlkIHByaW9yaXR5IG9mIHNuYXBzaG90IG9wZXJhdGlvbnMKLSAqLwotI2RlZmluZSBTTkFQU0hPVF9DT1BZX1BSSU9SSVRZIDIKLQotLyoKICAqIFRoZSBzaXplIG9mIHRoZSBtZW1wb29sIHVzZWQgdG8gdHJhY2sgY2h1bmtzIGluIHVzZS4KICAqLwogI2RlZmluZSBNSU5fSU9TIDI1NgpAQCAtMTgwLDYgKzE3MCwxMyBAQAogCSAqIGtjb3B5ZC4KIAkgKi8KIAlpbnQgc3RhcnRlZDsKKworCS8qCisJICogRm9yIHdyaXRpbmcgYSBjb21wbGV0ZSBjaHVuaywgYnlwYXNzaW5nIHRoZSBjb3B5LgorCSAqLworCXN0cnVjdCBiaW8gKmZ1bGxfYmlvOworCWJpb19lbmRfaW9fdCAqZnVsbF9iaW9fZW5kX2lvOworCXZvaWQgKmZ1bGxfYmlvX3ByaXZhdGU7CiB9OwogCiAvKgpAQCAtMTA1NSw4ICsxMDUyLDcgQEAKIAogCXMgPSBrbWFsbG9jKHNpemVvZigqcyksIEdGUF9LRVJORUwpOwogCWlmICghcykgewotCQl0aS0+ZXJyb3IgPSAiQ2Fubm90IGFsbG9jYXRlIHNuYXBzaG90IGNvbnRleHQgcHJpdmF0ZSAiCi0JCSAgICAic3RydWN0dXJlIjsKKwkJdGktPmVycm9yID0gIkNhbm5vdCBhbGxvY2F0ZSBwcml2YXRlIHNuYXBzaG90IHN0cnVjdHVyZSI7CiAJCXIgPSAtRU5PTUVNOwogCQlnb3RvIGJhZDsKIAl9CkBAIC0xMzgwLDYgKzEzNzYsNyBAQAogCXN0cnVjdCBkbV9zbmFwc2hvdCAqcyA9IHBlLT5zbmFwOwogCXN0cnVjdCBiaW8gKm9yaWdpbl9iaW9zID0gTlVMTDsKIAlzdHJ1Y3QgYmlvICpzbmFwc2hvdF9iaW9zID0gTlVMTDsKKwlzdHJ1Y3QgYmlvICpmdWxsX2JpbyA9IE5VTEw7CiAJaW50IGVycm9yID0gMDsKIAogCWlmICghc3VjY2VzcykgewpAQCAtMTQxNSwxMCArMTQxMiwxNSBAQAogCSAqLwogCWRtX2luc2VydF9leGNlcHRpb24oJnMtPmNvbXBsZXRlLCBlKTsKIAotIG91dDoKK291dDoKIAlkbV9yZW1vdmVfZXhjZXB0aW9uKCZwZS0+ZSk7CiAJc25hcHNob3RfYmlvcyA9IGJpb19saXN0X2dldCgmcGUtPnNuYXBzaG90X2Jpb3MpOwogCW9yaWdpbl9iaW9zID0gYmlvX2xpc3RfZ2V0KCZwZS0+b3JpZ2luX2Jpb3MpOworCWZ1bGxfYmlvID0gcGUtPmZ1bGxfYmlvOworCWlmIChmdWxsX2JpbykgeworCQlmdWxsX2Jpby0+YmlfZW5kX2lvID0gcGUtPmZ1bGxfYmlvX2VuZF9pbzsKKwkJZnVsbF9iaW8tPmJpX3ByaXZhdGUgPSBwZS0+ZnVsbF9iaW9fcHJpdmF0ZTsKKwl9CiAJZnJlZV9wZW5kaW5nX2V4Y2VwdGlvbihwZSk7CiAKIAlpbmNyZW1lbnRfcGVuZGluZ19leGNlcHRpb25zX2RvbmVfY291bnQoKTsKQEAgLTE0MjYsMTAgKzE0MjgsMTUgQEAKIAl1cF93cml0ZSgmcy0+bG9jayk7CiAKIAkvKiBTdWJtaXQgYW55IHBlbmRpbmcgd3JpdGUgYmlvcyAqLwotCWlmIChlcnJvcikKKwlpZiAoZXJyb3IpIHsKKwkJaWYgKGZ1bGxfYmlvKQorCQkJYmlvX2lvX2Vycm9yKGZ1bGxfYmlvKTsKIAkJZXJyb3JfYmlvcyhzbmFwc2hvdF9iaW9zKTsKLQllbHNlCisJfSBlbHNlIHsKKwkJaWYgKGZ1bGxfYmlvKQorCQkJYmlvX2VuZGlvKGZ1bGxfYmlvLCAwKTsKIAkJZmx1c2hfYmlvcyhzbmFwc2hvdF9iaW9zKTsKKwl9CiAKIAlyZXRyeV9vcmlnaW5fYmlvcyhzLCBvcmlnaW5fYmlvcyk7CiB9CkBAIC0xNDgwLDggKzE0ODcsMzMgQEAKIAlkZXN0LmNvdW50ID0gc3JjLmNvdW50OwogCiAJLyogSGFuZCBvdmVyIHRvIGtjb3B5ZCAqLwotCWRtX2tjb3B5ZF9jb3B5KHMtPmtjb3B5ZF9jbGllbnQsCi0JCSAgICAmc3JjLCAxLCAmZGVzdCwgMCwgY29weV9jYWxsYmFjaywgcGUpOworCWRtX2tjb3B5ZF9jb3B5KHMtPmtjb3B5ZF9jbGllbnQsICZzcmMsIDEsICZkZXN0LCAwLCBjb3B5X2NhbGxiYWNrLCBwZSk7Cit9CisKK3N0YXRpYyB2b2lkIGZ1bGxfYmlvX2VuZF9pbyhzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnJvcikKK3sKKwl2b2lkICpjYWxsYmFja19kYXRhID0gYmlvLT5iaV9wcml2YXRlOworCisJZG1fa2NvcHlkX2RvX2NhbGxiYWNrKGNhbGxiYWNrX2RhdGEsIDAsIGVycm9yID8gMSA6IDApOworfQorCitzdGF0aWMgdm9pZCBzdGFydF9mdWxsX2JpbyhzdHJ1Y3QgZG1fc25hcF9wZW5kaW5nX2V4Y2VwdGlvbiAqcGUsCisJCQkgICBzdHJ1Y3QgYmlvICpiaW8pCit7CisJc3RydWN0IGRtX3NuYXBzaG90ICpzID0gcGUtPnNuYXA7CisJdm9pZCAqY2FsbGJhY2tfZGF0YTsKKworCXBlLT5mdWxsX2JpbyA9IGJpbzsKKwlwZS0+ZnVsbF9iaW9fZW5kX2lvID0gYmlvLT5iaV9lbmRfaW87CisJcGUtPmZ1bGxfYmlvX3ByaXZhdGUgPSBiaW8tPmJpX3ByaXZhdGU7CisKKwljYWxsYmFja19kYXRhID0gZG1fa2NvcHlkX3ByZXBhcmVfY2FsbGJhY2socy0+a2NvcHlkX2NsaWVudCwKKwkJCQkJCSAgIGNvcHlfY2FsbGJhY2ssIHBlKTsKKworCWJpby0+YmlfZW5kX2lvID0gZnVsbF9iaW9fZW5kX2lvOworCWJpby0+YmlfcHJpdmF0ZSA9IGNhbGxiYWNrX2RhdGE7CisKKwlnZW5lcmljX21ha2VfcmVxdWVzdChiaW8pOwogfQogCiBzdGF0aWMgc3RydWN0IGRtX3NuYXBfcGVuZGluZ19leGNlcHRpb24gKgpAQCAtMTUxOSw2ICsxNTUxLDcgQEAKIAliaW9fbGlzdF9pbml0KCZwZS0+b3JpZ2luX2Jpb3MpOwogCWJpb19saXN0X2luaXQoJnBlLT5zbmFwc2hvdF9iaW9zKTsKIAlwZS0+c3RhcnRlZCA9IDA7CisJcGUtPmZ1bGxfYmlvID0gTlVMTDsKIAogCWlmIChzLT5zdG9yZS0+dHlwZS0+cHJlcGFyZV9leGNlcHRpb24ocy0+c3RvcmUsICZwZS0+ZSkpIHsKIAkJZnJlZV9wZW5kaW5nX2V4Y2VwdGlvbihwZSk7CkBAIC0xNjEyLDEwICsxNjQ1LDE5IEBACiAJCX0KIAogCQlyZW1hcF9leGNlcHRpb24ocywgJnBlLT5lLCBiaW8sIGNodW5rKTsKLQkJYmlvX2xpc3RfYWRkKCZwZS0+c25hcHNob3RfYmlvcywgYmlvKTsKIAogCQlyID0gRE1fTUFQSU9fU1VCTUlUVEVEOwogCisJCWlmICghcGUtPnN0YXJ0ZWQgJiYKKwkJICAgIGJpby0+Ymlfc2l6ZSA9PSAocy0+c3RvcmUtPmNodW5rX3NpemUgPDwgU0VDVE9SX1NISUZUKSkgeworCQkJcGUtPnN0YXJ0ZWQgPSAxOworCQkJdXBfd3JpdGUoJnMtPmxvY2spOworCQkJc3RhcnRfZnVsbF9iaW8ocGUsIGJpbyk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWJpb19saXN0X2FkZCgmcGUtPnNuYXBzaG90X2Jpb3MsIGJpbyk7CisKIAkJaWYgKCFwZS0+c3RhcnRlZCkgewogCQkJLyogdGhpcyBpcyBwcm90ZWN0ZWQgYnkgc25hcC0+bG9jayAqLwogCQkJcGUtPnN0YXJ0ZWQgPSAxOwpAQCAtMTYyOCw5ICsxNjcwLDkgQEAKIAkJbWFwX2NvbnRleHQtPnB0ciA9IHRyYWNrX2NodW5rKHMsIGNodW5rKTsKIAl9CiAKLSBvdXRfdW5sb2NrOgorb3V0X3VubG9jazoKIAl1cF93cml0ZSgmcy0+bG9jayk7Ci0gb3V0Ogorb3V0OgogCXJldHVybiByOwogfQogCkBAIC0xOTc0LDcgKzIwMTYsNyBAQAogCQkJcGVfdG9fc3RhcnRfbm93ID0gcGU7CiAJCX0KIAotIG5leHRfc25hcHNob3Q6CituZXh0X3NuYXBzaG90OgogCQl1cF93cml0ZSgmc25hcC0+bG9jayk7CiAKIAkJaWYgKHBlX3RvX3N0YXJ0X25vdykgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS10YWJsZS5jIGIvZHJpdmVycy9tZC9kbS10YWJsZS5jCmluZGV4IGJmZTljMjMuLjk4NmI4NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0tdGFibGUuYworKysgYi9kcml2ZXJzL21kL2RtLXRhYmxlLmMKQEAgLTU0LDcgKzU0LDYgQEAKIAlzZWN0b3JfdCAqaGlnaHM7CiAJc3RydWN0IGRtX3RhcmdldCAqdGFyZ2V0czsKIAotCXVuc2lnbmVkIGRpc2NhcmRzX3N1cHBvcnRlZDoxOwogCXVuc2lnbmVkIGludGVncml0eV9zdXBwb3J0ZWQ6MTsKIAogCS8qCkBAIC0xNTQsMTIgKzE1MywxMSBAQAogCQlyZXR1cm4gTlVMTDsKIAogCXNpemUgPSBubWVtYiAqIGVsZW1fc2l6ZTsKLQlhZGRyID0gdm1hbGxvYyhzaXplKTsKLQlpZiAoYWRkcikKLQkJbWVtc2V0KGFkZHIsIDAsIHNpemUpOworCWFkZHIgPSB2emFsbG9jKHNpemUpOwogCiAJcmV0dXJuIGFkZHI7CiB9CitFWFBPUlRfU1lNQk9MKGRtX3ZjYWxsb2MpOwogCiAvKgogICogaGlnaHMsIGFuZCB0YXJnZXRzIGFyZSBtYW5hZ2VkIGFzIGR5bmFtaWMgYXJyYXlzIGR1cmluZyBhCkBAIC0yMDksNyArMjA3LDYgQEAKIAlJTklUX0xJU1RfSEVBRCgmdC0+ZGV2aWNlcyk7CiAJSU5JVF9MSVNUX0hFQUQoJnQtPnRhcmdldF9jYWxsYmFja3MpOwogCWF0b21pY19zZXQoJnQtPmhvbGRlcnMsIDApOwotCXQtPmRpc2NhcmRzX3N1cHBvcnRlZCA9IDE7CiAKIAlpZiAoIW51bV90YXJnZXRzKQogCQludW1fdGFyZ2V0cyA9IEtFWVNfUEVSX05PREU7CkBAIC0yODEsNiArMjc4LDcgQEAKIHsKIAlhdG9taWNfaW5jKCZ0LT5ob2xkZXJzKTsKIH0KK0VYUE9SVF9TWU1CT0woZG1fdGFibGVfZ2V0KTsKIAogdm9pZCBkbV90YWJsZV9wdXQoc3RydWN0IGRtX3RhYmxlICp0KQogewpAQCAtMjkwLDYgKzI4OCw3IEBACiAJc21wX21iX19iZWZvcmVfYXRvbWljX2RlYygpOwogCWF0b21pY19kZWMoJnQtPmhvbGRlcnMpOwogfQorRVhQT1JUX1NZTUJPTChkbV90YWJsZV9wdXQpOwogCiAvKgogICogQ2hlY2tzIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGV4dGVuZCBoaWdocyBvciB0YXJnZXRzLgpAQCAtNDU1LDEzICs0NTQsMTQgQEAKICAqIEFkZCBhIGRldmljZSB0byB0aGUgbGlzdCwgb3IganVzdCBpbmNyZW1lbnQgdGhlIHVzYWdlIGNvdW50IGlmCiAgKiBpdCdzIGFscmVhZHkgcHJlc2VudC4KICAqLwotc3RhdGljIGludCBfX3RhYmxlX2dldF9kZXZpY2Uoc3RydWN0IGRtX3RhYmxlICp0LCBzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwKLQkJICAgICAgY29uc3QgY2hhciAqcGF0aCwgZm1vZGVfdCBtb2RlLCBzdHJ1Y3QgZG1fZGV2ICoqcmVzdWx0KQoraW50IGRtX2dldF9kZXZpY2Uoc3RydWN0IGRtX3RhcmdldCAqdGksIGNvbnN0IGNoYXIgKnBhdGgsIGZtb2RlX3QgbW9kZSwKKwkJICBzdHJ1Y3QgZG1fZGV2ICoqcmVzdWx0KQogewogCWludCByOwogCWRldl90IHVuaW5pdGlhbGl6ZWRfdmFyKGRldik7CiAJc3RydWN0IGRtX2Rldl9pbnRlcm5hbCAqZGQ7CiAJdW5zaWduZWQgaW50IG1ham9yLCBtaW5vcjsKKwlzdHJ1Y3QgZG1fdGFibGUgKnQgPSB0aS0+dGFibGU7CiAKIAlCVUdfT04oIXQpOwogCkBAIC01MDksNiArNTA5LDcgQEAKIAkqcmVzdWx0ID0gJmRkLT5kbV9kZXY7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKGRtX2dldF9kZXZpY2UpOwogCiBpbnQgZG1fc2V0X2RldmljZV9saW1pdHMoc3RydWN0IGRtX3RhcmdldCAqdGksIHN0cnVjdCBkbV9kZXYgKmRldiwKIAkJCSBzZWN0b3JfdCBzdGFydCwgc2VjdG9yX3QgbGVuLCB2b2lkICpkYXRhKQpAQCAtNTM5LDIzICs1NDAsMTUgQEAKIAkgKiBJZiBub3Qgd2UnbGwgZm9yY2UgRE0gdG8gdXNlIFBBR0VfU0laRSBvcgogCSAqIHNtYWxsZXIgSS9PLCBqdXN0IHRvIGJlIHNhZmUuCiAJICovCi0KLQlpZiAocS0+bWVyZ2VfYnZlY19mbiAmJiAhdGktPnR5cGUtPm1lcmdlKQorCWlmIChkbV9xdWV1ZV9tZXJnZV9pc19jb21wdWxzb3J5KHEpICYmICF0aS0+dHlwZS0+bWVyZ2UpCiAJCWJsa19saW1pdHNfbWF4X2h3X3NlY3RvcnMobGltaXRzLAogCQkJCQkgICh1bnNpZ25lZCBpbnQpIChQQUdFX1NJWkUgPj4gOSkpOwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZG1fc2V0X2RldmljZV9saW1pdHMpOwogCi1pbnQgZG1fZ2V0X2RldmljZShzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgY29uc3QgY2hhciAqcGF0aCwgZm1vZGVfdCBtb2RlLAotCQkgIHN0cnVjdCBkbV9kZXYgKipyZXN1bHQpCi17Ci0JcmV0dXJuIF9fdGFibGVfZ2V0X2RldmljZSh0aS0+dGFibGUsIHRpLCBwYXRoLCBtb2RlLCByZXN1bHQpOwotfQotCi0KIC8qCi0gKiBEZWNyZW1lbnQgYSBkZXZpY2VzIHVzZSBjb3VudCBhbmQgcmVtb3ZlIGl0IGlmIG5lY2Vzc2FyeS4KKyAqIERlY3JlbWVudCBhIGRldmljZSdzIHVzZSBjb3VudCBhbmQgcmVtb3ZlIGl0IGlmIG5lY2Vzc2FyeS4KICAqLwogdm9pZCBkbV9wdXRfZGV2aWNlKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzdHJ1Y3QgZG1fZGV2ICpkKQogewpAQCAtNTY4LDYgKzU2MSw3IEBACiAJCWtmcmVlKGRkKTsKIAl9CiB9CitFWFBPUlRfU1lNQk9MKGRtX3B1dF9kZXZpY2UpOwogCiAvKgogICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgdGFyZ2V0IGpvaW5zIG9udG8gdGhlIGVuZCBvZiB0aGUgdGFibGUuCkBAIC03OTEsOCArNzg1LDkgQEAKIAogCXQtPmhpZ2hzW3QtPm51bV90YXJnZXRzKytdID0gdGd0LT5iZWdpbiArIHRndC0+bGVuIC0gMTsKIAotCWlmICghdGd0LT5udW1fZGlzY2FyZF9yZXF1ZXN0cykKLQkJdC0+ZGlzY2FyZHNfc3VwcG9ydGVkID0gMDsKKwlpZiAoIXRndC0+bnVtX2Rpc2NhcmRfcmVxdWVzdHMgJiYgdGd0LT5kaXNjYXJkc19zdXBwb3J0ZWQpCisJCURNV0FSTigiJXM6ICVzOiBpZ25vcmluZyBkaXNjYXJkc19zdXBwb3J0ZWQgYmVjYXVzZSBudW1fZGlzY2FyZF9yZXF1ZXN0cyBpcyB6ZXJvLiIsCisJCSAgICAgICBkbV9kZXZpY2VfbmFtZSh0LT5tZCksIHR5cGUpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTgwMiw2ICs3OTcsNjMgQEAKIAlyZXR1cm4gcjsKIH0KIAorLyoKKyAqIFRhcmdldCBhcmd1bWVudCBwYXJzaW5nIGhlbHBlcnMuCisgKi8KK3N0YXRpYyBpbnQgdmFsaWRhdGVfbmV4dF9hcmcoc3RydWN0IGRtX2FyZyAqYXJnLCBzdHJ1Y3QgZG1fYXJnX3NldCAqYXJnX3NldCwKKwkJCSAgICAgdW5zaWduZWQgKnZhbHVlLCBjaGFyICoqZXJyb3IsIHVuc2lnbmVkIGdyb3VwZWQpCit7CisJY29uc3QgY2hhciAqYXJnX3N0ciA9IGRtX3NoaWZ0X2FyZyhhcmdfc2V0KTsKKworCWlmICghYXJnX3N0ciB8fAorCSAgICAoc3NjYW5mKGFyZ19zdHIsICIldSIsIHZhbHVlKSAhPSAxKSB8fAorCSAgICAoKnZhbHVlIDwgYXJnLT5taW4pIHx8CisJICAgICgqdmFsdWUgPiBhcmctPm1heCkgfHwKKwkgICAgKGdyb3VwZWQgJiYgYXJnX3NldC0+YXJnYyA8ICp2YWx1ZSkpIHsKKwkJKmVycm9yID0gYXJnLT5lcnJvcjsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBkbV9yZWFkX2FyZyhzdHJ1Y3QgZG1fYXJnICphcmcsIHN0cnVjdCBkbV9hcmdfc2V0ICphcmdfc2V0LAorCQl1bnNpZ25lZCAqdmFsdWUsIGNoYXIgKiplcnJvcikKK3sKKwlyZXR1cm4gdmFsaWRhdGVfbmV4dF9hcmcoYXJnLCBhcmdfc2V0LCB2YWx1ZSwgZXJyb3IsIDApOworfQorRVhQT1JUX1NZTUJPTChkbV9yZWFkX2FyZyk7CisKK2ludCBkbV9yZWFkX2FyZ19ncm91cChzdHJ1Y3QgZG1fYXJnICphcmcsIHN0cnVjdCBkbV9hcmdfc2V0ICphcmdfc2V0LAorCQkgICAgICB1bnNpZ25lZCAqdmFsdWUsIGNoYXIgKiplcnJvcikKK3sKKwlyZXR1cm4gdmFsaWRhdGVfbmV4dF9hcmcoYXJnLCBhcmdfc2V0LCB2YWx1ZSwgZXJyb3IsIDEpOworfQorRVhQT1JUX1NZTUJPTChkbV9yZWFkX2FyZ19ncm91cCk7CisKK2NvbnN0IGNoYXIgKmRtX3NoaWZ0X2FyZyhzdHJ1Y3QgZG1fYXJnX3NldCAqYXMpCit7CisJY2hhciAqcjsKKworCWlmIChhcy0+YXJnYykgeworCQlhcy0+YXJnYy0tOworCQlyID0gKmFzLT5hcmd2OworCQlhcy0+YXJndisrOworCQlyZXR1cm4gcjsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woZG1fc2hpZnRfYXJnKTsKKwordm9pZCBkbV9jb25zdW1lX2FyZ3Moc3RydWN0IGRtX2FyZ19zZXQgKmFzLCB1bnNpZ25lZCBudW1fYXJncykKK3sKKwlCVUdfT04oYXMtPmFyZ2MgPCBudW1fYXJncyk7CisJYXMtPmFyZ2MgLT0gbnVtX2FyZ3M7CisJYXMtPmFyZ3YgKz0gbnVtX2FyZ3M7Cit9CitFWFBPUlRfU1lNQk9MKGRtX2NvbnN1bWVfYXJncyk7CisKIHN0YXRpYyBpbnQgZG1fdGFibGVfc2V0X3R5cGUoc3RydWN0IGRtX3RhYmxlICp0KQogewogCXVuc2lnbmVkIGk7CkBAIC0xMDc3LDExICsxMTI5LDEzIEBACiAJCXQtPmV2ZW50X2ZuKHQtPmV2ZW50X2NvbnRleHQpOwogCW11dGV4X3VubG9jaygmX2V2ZW50X2xvY2spOwogfQorRVhQT1JUX1NZTUJPTChkbV90YWJsZV9ldmVudCk7CiAKIHNlY3Rvcl90IGRtX3RhYmxlX2dldF9zaXplKHN0cnVjdCBkbV90YWJsZSAqdCkKIHsKIAlyZXR1cm4gdC0+bnVtX3RhcmdldHMgPyAodC0+aGlnaHNbdC0+bnVtX3RhcmdldHMgLSAxXSArIDEpIDogMDsKIH0KK0VYUE9SVF9TWU1CT0woZG1fdGFibGVfZ2V0X3NpemUpOwogCiBzdHJ1Y3QgZG1fdGFyZ2V0ICpkbV90YWJsZV9nZXRfdGFyZ2V0KHN0cnVjdCBkbV90YWJsZSAqdCwgdW5zaWduZWQgaW50IGluZGV4KQogewpAQCAtMTE5NCw5ICsxMjQ4LDQ1IEBACiAJCQkgICAgICAgYmxrX2dldF9pbnRlZ3JpdHkodGVtcGxhdGVfZGlzaykpOwogfQogCitzdGF0aWMgaW50IGRldmljZV9mbHVzaF9jYXBhYmxlKHN0cnVjdCBkbV90YXJnZXQgKnRpLCBzdHJ1Y3QgZG1fZGV2ICpkZXYsCisJCQkJc2VjdG9yX3Qgc3RhcnQsIHNlY3Rvcl90IGxlbiwgdm9pZCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBmbHVzaCA9ICgqKHVuc2lnbmVkICopZGF0YSk7CisJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBiZGV2X2dldF9xdWV1ZShkZXYtPmJkZXYpOworCisJcmV0dXJuIHEgJiYgKHEtPmZsdXNoX2ZsYWdzICYgZmx1c2gpOworfQorCitzdGF0aWMgYm9vbCBkbV90YWJsZV9zdXBwb3J0c19mbHVzaChzdHJ1Y3QgZG1fdGFibGUgKnQsIHVuc2lnbmVkIGZsdXNoKQoreworCXN0cnVjdCBkbV90YXJnZXQgKnRpOworCXVuc2lnbmVkIGkgPSAwOworCisJLyoKKwkgKiBSZXF1aXJlIGF0IGxlYXN0IG9uZSB1bmRlcmx5aW5nIGRldmljZSB0byBzdXBwb3J0IGZsdXNoZXMuCisJICogdC0+ZGV2aWNlcyBpbmNsdWRlcyBpbnRlcm5hbCBkbSBkZXZpY2VzIHN1Y2ggYXMgbWlycm9yIGxvZ3MKKwkgKiBzbyB3ZSBuZWVkIHRvIHVzZSBpdGVyYXRlX2RldmljZXMgaGVyZSwgd2hpY2ggdGFyZ2V0cworCSAqIHN1cHBvcnRpbmcgZmx1c2hlcyBtdXN0IHByb3ZpZGUuCisJICovCisJd2hpbGUgKGkgPCBkbV90YWJsZV9nZXRfbnVtX3RhcmdldHModCkpIHsKKwkJdGkgPSBkbV90YWJsZV9nZXRfdGFyZ2V0KHQsIGkrKyk7CisKKwkJaWYgKCF0aS0+bnVtX2ZsdXNoX3JlcXVlc3RzKQorCQkJY29udGludWU7CisKKwkJaWYgKHRpLT50eXBlLT5pdGVyYXRlX2RldmljZXMgJiYKKwkJICAgIHRpLT50eXBlLT5pdGVyYXRlX2RldmljZXModGksIGRldmljZV9mbHVzaF9jYXBhYmxlLCAmZmx1c2gpKQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHZvaWQgZG1fdGFibGVfc2V0X3Jlc3RyaWN0aW9ucyhzdHJ1Y3QgZG1fdGFibGUgKnQsIHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLAogCQkJICAgICAgIHN0cnVjdCBxdWV1ZV9saW1pdHMgKmxpbWl0cykKIHsKKwl1bnNpZ25lZCBmbHVzaCA9IDA7CisKIAkvKgogCSAqIENvcHkgdGFibGUncyBsaW1pdHMgdG8gdGhlIERNIGRldmljZSdzIHJlcXVlc3RfcXVldWUKIAkgKi8KQEAgLTEyMDcsNiArMTI5NywxMyBAQAogCWVsc2UKIAkJcXVldWVfZmxhZ19zZXRfdW5sb2NrZWQoUVVFVUVfRkxBR19ESVNDQVJELCBxKTsKIAorCWlmIChkbV90YWJsZV9zdXBwb3J0c19mbHVzaCh0LCBSRVFfRkxVU0gpKSB7CisJCWZsdXNoIHw9IFJFUV9GTFVTSDsKKwkJaWYgKGRtX3RhYmxlX3N1cHBvcnRzX2ZsdXNoKHQsIFJFUV9GVUEpKQorCQkJZmx1c2ggfD0gUkVRX0ZVQTsKKwl9CisJYmxrX3F1ZXVlX2ZsdXNoKHEsIGZsdXNoKTsKKwogCWRtX3RhYmxlX3NldF9pbnRlZ3JpdHkodCk7CiAKIAkvKgpAQCAtMTIzNyw2ICsxMzM0LDcgQEAKIHsKIAlyZXR1cm4gdC0+bW9kZTsKIH0KK0VYUE9SVF9TWU1CT0woZG1fdGFibGVfZ2V0X21vZGUpOwogCiBzdGF0aWMgdm9pZCBzdXNwZW5kX3RhcmdldHMoc3RydWN0IGRtX3RhYmxlICp0LCB1bnNpZ25lZCBwb3N0c3VzcGVuZCkKIHsKQEAgLTEzNDUsNiArMTQ0Myw3IEBACiB7CiAJcmV0dXJuIHQtPm1kOwogfQorRVhQT1JUX1NZTUJPTChkbV90YWJsZV9nZXRfbWQpOwogCiBzdGF0aWMgaW50IGRldmljZV9kaXNjYXJkX2NhcGFibGUoc3RydWN0IGRtX3RhcmdldCAqdGksIHN0cnVjdCBkbV9kZXYgKmRldiwKIAkJCQkgIHNlY3Rvcl90IHN0YXJ0LCBzZWN0b3JfdCBsZW4sIHZvaWQgKmRhdGEpCkBAIC0xMzU5LDE5ICsxNDU4LDE5IEBACiAJc3RydWN0IGRtX3RhcmdldCAqdGk7CiAJdW5zaWduZWQgaSA9IDA7CiAKLQlpZiAoIXQtPmRpc2NhcmRzX3N1cHBvcnRlZCkKLQkJcmV0dXJuIDA7Ci0KIAkvKgogCSAqIFVubGVzcyBhbnkgdGFyZ2V0IHVzZWQgYnkgdGhlIHRhYmxlIHNldCBkaXNjYXJkc19zdXBwb3J0ZWQsCiAJICogcmVxdWlyZSBhdCBsZWFzdCBvbmUgdW5kZXJseWluZyBkZXZpY2UgdG8gc3VwcG9ydCBkaXNjYXJkcy4KIAkgKiB0LT5kZXZpY2VzIGluY2x1ZGVzIGludGVybmFsIGRtIGRldmljZXMgc3VjaCBhcyBtaXJyb3IgbG9ncwogCSAqIHNvIHdlIG5lZWQgdG8gdXNlIGl0ZXJhdGVfZGV2aWNlcyBoZXJlLCB3aGljaCB0YXJnZXRzCi0JICogc3VwcG9ydGluZyBkaXNjYXJkIG11c3QgcHJvdmlkZS4KKwkgKiBzdXBwb3J0aW5nIGRpc2NhcmQgc2VsZWN0aXZlbHkgbXVzdCBwcm92aWRlLgogCSAqLwogCXdoaWxlIChpIDwgZG1fdGFibGVfZ2V0X251bV90YXJnZXRzKHQpKSB7CiAJCXRpID0gZG1fdGFibGVfZ2V0X3RhcmdldCh0LCBpKyspOwogCisJCWlmICghdGktPm51bV9kaXNjYXJkX3JlcXVlc3RzKQorCQkJY29udGludWU7CisKIAkJaWYgKHRpLT5kaXNjYXJkc19zdXBwb3J0ZWQpCiAJCQlyZXR1cm4gMTsKIApAQCAtMTM4MiwxMyArMTQ4MSwzIEBACiAKIAlyZXR1cm4gMDsKIH0KLQotRVhQT1JUX1NZTUJPTChkbV92Y2FsbG9jKTsKLUVYUE9SVF9TWU1CT0woZG1fZ2V0X2RldmljZSk7Ci1FWFBPUlRfU1lNQk9MKGRtX3B1dF9kZXZpY2UpOwotRVhQT1JUX1NZTUJPTChkbV90YWJsZV9ldmVudCk7Ci1FWFBPUlRfU1lNQk9MKGRtX3RhYmxlX2dldF9zaXplKTsKLUVYUE9SVF9TWU1CT0woZG1fdGFibGVfZ2V0X21vZGUpOwotRVhQT1JUX1NZTUJPTChkbV90YWJsZV9nZXRfbWQpOwotRVhQT1JUX1NZTUJPTChkbV90YWJsZV9wdXQpOwotRVhQT1JUX1NZTUJPTChkbV90YWJsZV9nZXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9kbS5jIGIvZHJpdmVycy9tZC9kbS5jCmluZGV4IDBjZjY4YjQuLjUyYjM5ZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWQvZG0uYworKysgYi9kcml2ZXJzL21kL2RtLmMKQEAgLTM3LDYgKzM3LDggQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbWFqb3IgPSAwOwogc3RhdGljIHVuc2lnbmVkIGludCBfbWFqb3IgPSAwOwogCitzdGF0aWMgREVGSU5FX0lEUihfbWlub3JfaWRyKTsKKwogc3RhdGljIERFRklORV9TUElOTE9DSyhfbWlub3JfbG9jayk7CiAvKgogICogRm9yIGJpby1iYXNlZCBkbS4KQEAgLTEwOSw2ICsxMTEsNyBAQAogI2RlZmluZSBETUZfRlJFRUlORyAzCiAjZGVmaW5lIERNRl9ERUxFVElORyA0CiAjZGVmaW5lIERNRl9OT0ZMVVNIX1NVU1BFTkRJTkcgNQorI2RlZmluZSBETUZfTUVSR0VfSVNfT1BUSU9OQUwgNgogCiAvKgogICogV29yayBwcm9jZXNzZWQgYnkgcGVyLWRldmljZSB3b3JrcXVldWUuCkBAIC0zMTMsNiArMzE2LDEyIEBACiAKIAl3aGlsZSAoaS0tKQogCQlfZXhpdHNbaV0oKTsKKworCS8qCisJICogU2hvdWxkIGJlIGVtcHR5IGJ5IHRoaXMgcG9pbnQuCisJICovCisJaWRyX3JlbW92ZV9hbGwoJl9taW5vcl9pZHIpOworCWlkcl9kZXN0cm95KCZfbWlub3JfaWRyKTsKIH0KIAogLyoKQEAgLTExNzEsNyArMTE4MCw4IEBACiAKIAkJLyoKIAkJICogRXZlbiB0aG91Z2ggdGhlIGRldmljZSBhZHZlcnRpc2VkIGRpc2NhcmQgc3VwcG9ydCwKLQkJICogcmVjb25maWd1cmF0aW9uIG1pZ2h0IGhhdmUgY2hhbmdlZCB0aGF0IHNpbmNlIHRoZQorCQkgKiB0aGF0IGRvZXMgbm90IG1lYW4gZXZlcnkgdGFyZ2V0IHN1cHBvcnRzIGl0LCBhbmQKKwkJICogcmVjb25maWd1cmF0aW9uIG1pZ2h0IGFsc28gaGF2ZSBjaGFuZ2VkIHRoYXQgc2luY2UgdGhlCiAJCSAqIGNoZWNrIHdhcyBwZXJmb3JtZWQuCiAJCSAqLwogCQlpZiAoIXRpLT5udW1fZGlzY2FyZF9yZXF1ZXN0cykKQEAgLTE3MDUsOCArMTcxNSw2IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBBbiBJRFIgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIGFsbG9jYXRlZCBtaW5vciBudW1iZXJzLgogICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotc3RhdGljIERFRklORV9JRFIoX21pbm9yX2lkcik7Ci0KIHN0YXRpYyB2b2lkIGZyZWVfbWlub3IoaW50IG1pbm9yKQogewogCXNwaW5fbG9jaygmX21pbm9yX2xvY2spOwpAQCAtMTgwMCw3ICsxODA4LDYgQEAKIAlibGtfcXVldWVfbWFrZV9yZXF1ZXN0KG1kLT5xdWV1ZSwgZG1fcmVxdWVzdCk7CiAJYmxrX3F1ZXVlX2JvdW5jZV9saW1pdChtZC0+cXVldWUsIEJMS19CT1VOQ0VfQU5ZKTsKIAlibGtfcXVldWVfbWVyZ2VfYnZlYyhtZC0+cXVldWUsIGRtX21lcmdlX2J2ZWMpOwotCWJsa19xdWV1ZV9mbHVzaChtZC0+cXVldWUsIFJFUV9GTFVTSCB8IFJFUV9GVUEpOwogfQogCiAvKgpAQCAtMTk4Niw2ICsxOTkzLDU5IEBACiB9CiAKIC8qCisgKiBSZXR1cm4gMSBpZiB0aGUgcXVldWUgaGFzIGEgY29tcHVsc29yeSBtZXJnZV9idmVjX2ZuIGZ1bmN0aW9uLgorICoKKyAqIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAwLCB0aGVuIHRoZSBkZXZpY2UgaXMgZWl0aGVyIGEgbm9uLWRtCisgKiBkZXZpY2Ugd2l0aG91dCBhIG1lcmdlX2J2ZWNfZm4sIG9yIGl0IGlzIGEgZG0gZGV2aWNlIHRoYXQgaXMKKyAqIGFibGUgdG8gc3BsaXQgYW55IGJpb3MgaXQgcmVjZWl2ZXMgdGhhdCBhcmUgdG9vIGJpZy4KKyAqLworaW50IGRtX3F1ZXVlX21lcmdlX2lzX2NvbXB1bHNvcnkoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpCit7CisJc3RydWN0IG1hcHBlZF9kZXZpY2UgKmRldl9tZDsKKworCWlmICghcS0+bWVyZ2VfYnZlY19mbikKKwkJcmV0dXJuIDA7CisKKwlpZiAocS0+bWFrZV9yZXF1ZXN0X2ZuID09IGRtX3JlcXVlc3QpIHsKKwkJZGV2X21kID0gcS0+cXVldWVkYXRhOworCQlpZiAodGVzdF9iaXQoRE1GX01FUkdFX0lTX09QVElPTkFMLCAmZGV2X21kLT5mbGFncykpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBkbV9kZXZpY2VfbWVyZ2VfaXNfY29tcHVsc29yeShzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwKKwkJCQkJIHN0cnVjdCBkbV9kZXYgKmRldiwgc2VjdG9yX3Qgc3RhcnQsCisJCQkJCSBzZWN0b3JfdCBsZW4sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiA9IGRldi0+YmRldjsKKwlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGJkZXZfZ2V0X3F1ZXVlKGJkZXYpOworCisJcmV0dXJuIGRtX3F1ZXVlX21lcmdlX2lzX2NvbXB1bHNvcnkocSk7Cit9CisKKy8qCisgKiBSZXR1cm4gMSBpZiBpdCBpcyBhY2NlcHRhYmxlIHRvIGlnbm9yZSBtZXJnZV9idmVjX2ZuIGJhc2VkCisgKiBvbiB0aGUgcHJvcGVydGllcyBvZiB0aGUgdW5kZXJseWluZyBkZXZpY2VzLgorICovCitzdGF0aWMgaW50IGRtX3RhYmxlX21lcmdlX2lzX29wdGlvbmFsKHN0cnVjdCBkbV90YWJsZSAqdGFibGUpCit7CisJdW5zaWduZWQgaSA9IDA7CisJc3RydWN0IGRtX3RhcmdldCAqdGk7CisKKwl3aGlsZSAoaSA8IGRtX3RhYmxlX2dldF9udW1fdGFyZ2V0cyh0YWJsZSkpIHsKKwkJdGkgPSBkbV90YWJsZV9nZXRfdGFyZ2V0KHRhYmxlLCBpKyspOworCisJCWlmICh0aS0+dHlwZS0+aXRlcmF0ZV9kZXZpY2VzICYmCisJCSAgICB0aS0+dHlwZS0+aXRlcmF0ZV9kZXZpY2VzKHRpLCBkbV9kZXZpY2VfbWVyZ2VfaXNfY29tcHVsc29yeSwgTlVMTCkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyoKICAqIFJldHVybnMgb2xkIG1hcCwgd2hpY2ggY2FsbGVyIG11c3QgZGVzdHJveS4KICAqLwogc3RhdGljIHN0cnVjdCBkbV90YWJsZSAqX19iaW5kKHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCwgc3RydWN0IGRtX3RhYmxlICp0LApAQCAtMTk5NSw2ICsyMDU1LDcgQEAKIAlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IG1kLT5xdWV1ZTsKIAlzZWN0b3JfdCBzaXplOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IG1lcmdlX2lzX29wdGlvbmFsOwogCiAJc2l6ZSA9IGRtX3RhYmxlX2dldF9zaXplKHQpOwogCkBAIC0yMDIwLDEwICsyMDgxLDE2IEBACiAKIAlfX2JpbmRfbWVtcG9vbHMobWQsIHQpOwogCisJbWVyZ2VfaXNfb3B0aW9uYWwgPSBkbV90YWJsZV9tZXJnZV9pc19vcHRpb25hbCh0KTsKKwogCXdyaXRlX2xvY2tfaXJxc2F2ZSgmbWQtPm1hcF9sb2NrLCBmbGFncyk7CiAJb2xkX21hcCA9IG1kLT5tYXA7CiAJbWQtPm1hcCA9IHQ7CiAJZG1fdGFibGVfc2V0X3Jlc3RyaWN0aW9ucyh0LCBxLCBsaW1pdHMpOworCWlmIChtZXJnZV9pc19vcHRpb25hbCkKKwkJc2V0X2JpdChETUZfTUVSR0VfSVNfT1BUSU9OQUwsICZtZC0+ZmxhZ3MpOworCWVsc2UKKwkJY2xlYXJfYml0KERNRl9NRVJHRV9JU19PUFRJT05BTCwgJm1kLT5mbGFncyk7CiAJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJm1kLT5tYXBfbG9jaywgZmxhZ3MpOwogCiAJcmV0dXJuIG9sZF9tYXA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLmggYi9kcml2ZXJzL21kL2RtLmgKaW5kZXggMWFhZjE2Ny4uNjc0NWRiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS5oCisrKyBiL2RyaXZlcnMvbWQvZG0uaApAQCAtNjYsNiArNjYsOCBAQAogdm9pZCBkbV90YWJsZV9mcmVlX21kX21lbXBvb2xzKHN0cnVjdCBkbV90YWJsZSAqdCk7CiBzdHJ1Y3QgZG1fbWRfbWVtcG9vbHMgKmRtX3RhYmxlX2dldF9tZF9tZW1wb29scyhzdHJ1Y3QgZG1fdGFibGUgKnQpOwogCitpbnQgZG1fcXVldWVfbWVyZ2VfaXNfY29tcHVsc29yeShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSk7CisKIHZvaWQgZG1fbG9ja19tZF90eXBlKHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCk7CiB2b2lkIGRtX3VubG9ja19tZF90eXBlKHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCk7CiB2b2lkIGRtX3NldF9tZF90eXBlKHN0cnVjdCBtYXBwZWRfZGV2aWNlICptZCwgdW5zaWduZWQgdHlwZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL0tjb25maWcKaW5kZXggNjk5NTk0MC4uOTU3NWRiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvS2NvbmZpZwpAQCAtNjgsNyArNjgsNiBAQAogCiBjb25maWcgRFZCX0NPUkUKIAl0cmlzdGF0ZSAiRFZCIGZvciBMaW51eCIKLQlkZXBlbmRzIG9uIE5FVCAmJiBJTkVUCiAJc2VsZWN0IENSQzMyCiAJaGVscAogCSAgRFZCIGNvcmUgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGRldmljZSBoYW5kbGluZywgc29mdHdhcmUgZmFsbGJhY2tzIGV0Yy4KQEAgLTg1LDYgKzg0LDE5IEBACiAKIAkgIElmIHVuc3VyZSBzYXkgTi4KIAorY29uZmlnIERWQl9ORVQKKwlib29sICJEVkIgTmV0d29yayBTdXBwb3J0IgorCWRlZmF1bHQgKE5FVCAmJiBJTkVUKQorCWRlcGVuZHMgb24gTkVUICYmIElORVQgJiYgRFZCX0NPUkUKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIERWQiBOZXR3b3JrIFN1cHBvcnQgd2hpY2ggaXMgYSBwYXJ0IG9mIHRoZSBEVkIKKwkgIHN0YW5kYXJkLiBJdCBpcyB1c2VkLCBmb3IgZXhhbXBsZSwgYnkgYXV0b21hdGljIGZpcm13YXJlIHVwZGF0ZXMgdXNlZAorCSAgb24gU2V0LVRvcC1Cb3hlcy4gSXQgY2FuIGFsc28gYmUgdXNlZCB0byBhY2Nlc3MgdGhlIEludGVybmV0IHZpYSB0aGUKKwkgIERWQiBjYXJkLCBpZiB0aGUgbmV0d29yayBwcm92aWRlciBzdXBwb3J0cyBpdC4KKworCSAgWW91IG1heSB3YW50IHRvIGRpc2FibGUgdGhlIG5ldHdvcmsgc3VwcG9ydCBvbiBlbWJlZGRlZCBkZXZpY2VzLiBJZgorCSAgdW5zdXJlIHNheSBZLgorCiBjb25maWcgVklERU9fTUVESUEKIAl0cmlzdGF0ZQogCWRlZmF1bHQgKERWQl9DT1JFICYmIChWSURFT19ERVYgPSBuKSkgfHwgKFZJREVPX0RFViAmJiAoRFZCX0NPUkUgPSBuKSkgfHwgKERWQl9DT1JFICYmIFZJREVPX0RFVikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL0tjb25maWcKaW5kZXggMjJkM2NhMy4uOTk2MzAyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL0tjb25maWcKQEAgLTIzLDYgKzIzLDcgQEAKIAlkZXBlbmRzIG9uIFZJREVPX01FRElBICYmIEkyQwogCXNlbGVjdCBNRURJQV9UVU5FUl9YQzIwMjggaWYgIU1FRElBX1RVTkVSX0NVU1RPTUlTRQogCXNlbGVjdCBNRURJQV9UVU5FUl9YQzUwMDAgaWYgIU1FRElBX1RVTkVSX0NVU1RPTUlTRQorCXNlbGVjdCBNRURJQV9UVU5FUl9YQzQwMDAgaWYgIU1FRElBX1RVTkVSX0NVU1RPTUlTRQogCXNlbGVjdCBNRURJQV9UVU5FUl9NVDIwWFggaWYgIU1FRElBX1RVTkVSX0NVU1RPTUlTRQogCXNlbGVjdCBNRURJQV9UVU5FUl9UREE4MjkwIGlmICFNRURJQV9UVU5FUl9DVVNUT01JU0UKIAlzZWxlY3QgTUVESUFfVFVORVJfVEVBNTc2MSBpZiAhTUVESUFfVFVORVJfQ1VTVE9NSVNFCkBAIC0xNTIsNiArMTUzLDE1IEBACiAJICBUaGlzIGRldmljZSBpcyBvbmx5IHVzZWQgaW5zaWRlIGEgU2lQIGNhbGxlZCB0b2dldGhlciB3aXRoIGEKIAkgIGRlbW9kdWxhdG9yIGZvciBub3cuCiAKK2NvbmZpZyBNRURJQV9UVU5FUl9YQzQwMDAKKwl0cmlzdGF0ZSAiWGNlaXZlIFhDNDAwMCBzaWxpY29uIHR1bmVyIgorCWRlcGVuZHMgb24gVklERU9fTUVESUEgJiYgSTJDCisJZGVmYXVsdCBtIGlmIE1FRElBX1RVTkVSX0NVU1RPTUlTRQorCWhlbHAKKwkgIEEgZHJpdmVyIGZvciB0aGUgc2lsaWNvbiB0dW5lciBYQzQwMDAgZnJvbSBYY2VpdmUuCisJICBUaGlzIGRldmljZSBpcyBvbmx5IHVzZWQgaW5zaWRlIGEgU2lQIGNhbGxlZCB0b2dldGhlciB3aXRoIGEKKwkgIGRlbW9kdWxhdG9yIGZvciBub3cuCisKIGNvbmZpZyBNRURJQV9UVU5FUl9NWEw1MDA1UwogCXRyaXN0YXRlICJNYXhMaW5lYXIgTVNMNTAwNVMgc2lsaWNvbiB0dW5lciIKIAlkZXBlbmRzIG9uIFZJREVPX01FRElBICYmIEkyQwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL01ha2VmaWxlCmluZGV4IDJjYjRmNTMuLjIwZDI0ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvTWFrZWZpbGUKQEAgLTE2LDYgKzE2LDcgQEAKIG9iai0kKENPTkZJR19NRURJQV9UVU5FUl9UREE4MjdYKSArPSB0ZGE4Mjd4Lm8KIG9iai0kKENPTkZJR19NRURJQV9UVU5FUl9UREExODI3MSkgKz0gdGRhMTgyNzEubwogb2JqLSQoQ09ORklHX01FRElBX1RVTkVSX1hDNTAwMCkgKz0geGM1MDAwLm8KK29iai0kKENPTkZJR19NRURJQV9UVU5FUl9YQzQwMDApICs9IHhjNDAwMC5vCiBvYmotJChDT05GSUdfTUVESUFfVFVORVJfTVQyMDYwKSArPSBtdDIwNjAubwogb2JqLSQoQ09ORklHX01FRElBX1RVTkVSX01UMjI2NikgKz0gbXQyMjY2Lm8KIG9iai0kKENPTkZJR19NRURJQV9UVU5FUl9RVDEwMTApICs9IHF0MTAxMC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdHVuZXItdHlwZXMuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90dW5lci10eXBlcy5jCmluZGV4IGFmYmE2ZGMuLjk0YTYwM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90dW5lci10eXBlcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90dW5lci10eXBlcy5jCkBAIC0xODA1LDYgKzE4MDUsMTAgQEAKIAkJLm5hbWUgICA9ICJYY2VpdmUgNTAwMCB0dW5lciIsCiAJCS8qIHNlZSB4YzUwMDAuYyBmb3IgZGV0YWlscyAqLwogCX0sCisJW1RVTkVSX1hDNDAwMF0gPSB7IC8qIFhjZWl2ZSA0MDAwICovCisJCS5uYW1lICAgPSAiWGNlaXZlIDQwMDAgdHVuZXIiLAorCQkvKiBzZWUgeGM0MDAwLmMgZm9yIGRldGFpbHMgKi8KKwl9LAogCVtUVU5FUl9UQ0xfTUYwMkdJUF81Tl0gPSB7IC8qIFRDTCB0dW5lciBNRjAyR0lQLTVOLUUgKi8KIAkJLm5hbWUgICA9ICJUQ0wgdHVuZXIgTUYwMkdJUC01Ti1FIiwKIAkJLnBhcmFtcyA9IHR1bmVyX3RjbF9tZjAyZ2lwXzVuX3BhcmFtcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy94YzQwMDAuYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy94YzQwMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzRmNGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL3hjNDAwMC5jCkBAIC0wLDAgKzEsMTY5MSBAQAorLyoKKyAqICBEcml2ZXIgZm9yIFhjZWl2ZSBYQzQwMDAgIlFBTS84VlNCIHNpbmdsZSBjaGlwIHR1bmVyIgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDcgWGNlaXZlIENvcnBvcmF0aW9uCisgKiAgQ29weXJpZ2h0IChjKSAyMDA3IFN0ZXZlbiBUb3RoIDxzdG90aEBsaW51eHR2Lm9yZz4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgRGV2aW4gSGVpdG11ZWxsZXIgPGRoZWl0bXVlbGxlckBrZXJuZWxsYWJzLmNvbT4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMDkgRGF2aWRlIEZlcnJpIDxkLmZlcnJpQHplcm8xMS5pdD4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTAgSXN0dmFuIFZhcmdhIDxpc3R2YW5fdkBtYWlsYm94Lmh1PgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kdmIvZnJvbnRlbmQuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKworI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorCisjaW5jbHVkZSAieGM0MDAwLmgiCisjaW5jbHVkZSAidHVuZXItaTJjLmgiCisjaW5jbHVkZSAidHVuZXIteGMyMDI4LXR5cGVzLmgiCisKK3N0YXRpYyBpbnQgZGVidWc7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiRGVidWdnaW5nIGxldmVsICgwIHRvIDIsIGRlZmF1bHQ6IDAgKG9mZikpLiIpOworCitzdGF0aWMgaW50IG5vX3Bvd2Vyb2ZmOworbW9kdWxlX3BhcmFtKG5vX3Bvd2Vyb2ZmLCBpbnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhub19wb3dlcm9mZiwgIlBvd2VyIG1hbmFnZW1lbnQgKDE6IGRpc2FibGVkLCAyOiBlbmFibGVkLCAiCisJIjAgKGRlZmF1bHQpOiB1c2UgZGV2aWNlLXNwZWNpZmljIGRlZmF1bHQgbW9kZSkuIik7CisKK3N0YXRpYyBpbnQgYXVkaW9fc3RkOworbW9kdWxlX3BhcmFtKGF1ZGlvX3N0ZCwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoYXVkaW9fc3RkLCAiQXVkaW8gc3RhbmRhcmQuIFhDNDAwMCBhdWRpbyBkZWNvZGVyIGV4cGxpY2l0bHkgIgorCSJuZWVkcyB0byBrbm93IHdoYXQgYXVkaW8gc3RhbmRhcmQgaXMgbmVlZGVkIGZvciBzb21lIHZpZGVvIHN0YW5kYXJkcyAiCisJIndpdGggYXVkaW8gQTIgb3IgTklDQU0uIFRoZSB2YWxpZCBzZXR0aW5ncyBhcmUgYSBzdW0gb2Y6XG4iCisJIiAxOiB1c2UgTklDQU0vQiBvciBBMi9CIGluc3RlYWQgb2YgTklDQU0vQSBvciBBMi9BXG4iCisJIiAyOiB1c2UgQTIgaW5zdGVhZCBvZiBOSUNBTSBvciBCVFNDXG4iCisJIiA0OiB1c2UgU0VDQU0vSzMgaW5zdGVhZCBvZiBLMVxuIgorCSIgODogdXNlIFBBTC1EL0sgYXVkaW8gZm9yIFNFQ0FNLUQvS1xuIgorCSIxNjogdXNlIEZNIHJhZGlvIGlucHV0IDEgaW5zdGVhZCBvZiBpbnB1dCAyXG4iCisJIjMyOiB1c2UgbW9ubyBhdWRpbyAodGhlIGxvd2VyIHRocmVlIGJpdHMgYXJlIGlnbm9yZWQpIik7CisKK3N0YXRpYyBjaGFyIGZpcm13YXJlX25hbWVbMzBdOworbW9kdWxlX3BhcmFtX3N0cmluZyhmaXJtd2FyZV9uYW1lLCBmaXJtd2FyZV9uYW1lLCBzaXplb2YoZmlybXdhcmVfbmFtZSksIDApOworTU9EVUxFX1BBUk1fREVTQyhmaXJtd2FyZV9uYW1lLCAiRmlybXdhcmUgZmlsZSBuYW1lLiBBbGxvd3Mgb3ZlcnJpZGluZyB0aGUgIgorCSJkZWZhdWx0IGZpcm13YXJlIG5hbWUuIik7CisKK3N0YXRpYyBERUZJTkVfTVVURVgoeGM0MDAwX2xpc3RfbXV0ZXgpOworc3RhdGljIExJU1RfSEVBRChoeWJyaWRfdHVuZXJfaW5zdGFuY2VfbGlzdCk7CisKKyNkZWZpbmUgZHByaW50ayhsZXZlbCwgZm10LCBhcmcuLi4pIGlmIChkZWJ1ZyA+PSBsZXZlbCkgXAorCXByaW50ayhLRVJOX0lORk8gIiVzOiAiIGZtdCwgInhjNDAwMCIsICMjIGFyZykKKworLyogc3RydWN0IGZvciBzdG9yaW5nIGZpcm13YXJlIHRhYmxlICovCitzdHJ1Y3QgZmlybXdhcmVfZGVzY3JpcHRpb24geworCXVuc2lnbmVkIGludCAgdHlwZTsKKwl2NGwyX3N0ZF9pZCAgIGlkOworCV9fdTE2ICAgICAgICAgaW50X2ZyZXE7CisJdW5zaWduZWQgY2hhciAqcHRyOworCXVuc2lnbmVkIGludCAgc2l6ZTsKK307CisKK3N0cnVjdCBmaXJtd2FyZV9wcm9wZXJ0aWVzIHsKKwl1bnNpZ25lZCBpbnQJdHlwZTsKKwl2NGwyX3N0ZF9pZAlpZDsKKwl2NGwyX3N0ZF9pZAlzdGRfcmVxOworCV9fdTE2CQlpbnRfZnJlcTsKKwl1bnNpZ25lZCBpbnQJc2NvZGVfdGFibGU7CisJaW50CQlzY29kZV9ucjsKK307CisKK3N0cnVjdCB4YzQwMDBfcHJpdiB7CisJc3RydWN0IHR1bmVyX2kyY19wcm9wcyBpMmNfcHJvcHM7CisJc3RydWN0IGxpc3RfaGVhZCBoeWJyaWRfdHVuZXJfaW5zdGFuY2VfbGlzdDsKKwlzdHJ1Y3QgZmlybXdhcmVfZGVzY3JpcHRpb24gKmZpcm07CisJaW50CWZpcm1fc2l6ZTsKKwl1MzIJaWZfa2h6OworCXUzMglmcmVxX2h6OworCXUzMgliYW5kd2lkdGg7CisJdTgJdmlkZW9fc3RhbmRhcmQ7CisJdTgJcmZfbW9kZTsKKwl1OAlkZWZhdWx0X3BtOworCXU4CWR2Yl9hbXBsaXR1ZGU7CisJdTgJc2V0X3Ntb290aGVkY3ZiczsKKwl1OAlpZ25vcmVfaTJjX3dyaXRlX2Vycm9yczsKKwlfX3UxNglmaXJtX3ZlcnNpb247CisJc3RydWN0IGZpcm13YXJlX3Byb3BlcnRpZXMgY3VyX2Z3OworCV9fdTE2CWh3bW9kZWw7CisJX191MTYJaHd2ZXJzOworCXN0cnVjdCBtdXRleAlsb2NrOworfTsKKworI2RlZmluZSBYQzQwMDBfQVVESU9fU1REX0IJCSAxCisjZGVmaW5lIFhDNDAwMF9BVURJT19TVERfQTIJCSAyCisjZGVmaW5lIFhDNDAwMF9BVURJT19TVERfSzMJCSA0CisjZGVmaW5lIFhDNDAwMF9BVURJT19TVERfTAkJIDgKKyNkZWZpbmUgWEM0MDAwX0FVRElPX1NURF9JTlBVVDEJCTE2CisjZGVmaW5lIFhDNDAwMF9BVURJT19TVERfTU9OTwkJMzIKKworI2RlZmluZSBYQzQwMDBfREVGQVVMVF9GSVJNV0FSRSAiZHZiLWZlLXhjNDAwMC0xLjQuZnciCisKKy8qIE1pc2MgRGVmaW5lcyAqLworI2RlZmluZSBNQVhfVFZfU1RBTkRBUkQJCQkyNAorI2RlZmluZSBYQ19NQVhfSTJDX1dSSVRFX0xFTkdUSAkJNjQKKyNkZWZpbmUgWENfUE9XRVJFRF9ET1dOCQkJMHg4MDAwMDAwMFUKKworLyogU2lnbmFsIFR5cGVzICovCisjZGVmaW5lIFhDX1JGX01PREVfQUlSCQkJMAorI2RlZmluZSBYQ19SRl9NT0RFX0NBQkxFCQkxCisKKy8qIFByb2R1Y3QgaWQgKi8KKyNkZWZpbmUgWENfUFJPRFVDVF9JRF9GV19OT1RfTE9BREVECTB4MjAwMAorI2RlZmluZSBYQ19QUk9EVUNUX0lEX1hDNDAwMAkJMHgwRkEwCisjZGVmaW5lIFhDX1BST0RVQ1RfSURfWEM0MTAwCQkweDEwMDQKKworLyogUmVnaXN0ZXJzIChXcml0ZS1vbmx5KSAqLworI2RlZmluZSBYUkVHX0lOSVQgICAgICAgICAweDAwCisjZGVmaW5lIFhSRUdfVklERU9fTU9ERSAgIDB4MDEKKyNkZWZpbmUgWFJFR19BVURJT19NT0RFICAgMHgwMgorI2RlZmluZSBYUkVHX1JGX0ZSRVEgICAgICAweDAzCisjZGVmaW5lIFhSRUdfRF9DT0RFICAgICAgIDB4MDQKKyNkZWZpbmUgWFJFR19ESVJFQ1RTSVRUSU5HX01PREUgMHgwNQorI2RlZmluZSBYUkVHX1NFRUtfTU9ERSAgICAweDA2CisjZGVmaW5lIFhSRUdfUE9XRVJfRE9XTiAgIDB4MDgKKyNkZWZpbmUgWFJFR19TSUdOQUxTT1VSQ0UgMHgwQQorI2RlZmluZSBYUkVHX1NNT09USEVEQ1ZCUyAweDBFCisjZGVmaW5lIFhSRUdfQU1QTElUVURFICAgIDB4MTAKKworLyogUmVnaXN0ZXJzIChSZWFkLW9ubHkpICovCisjZGVmaW5lIFhSRUdfQURDX0VOViAgICAgIDB4MDAKKyNkZWZpbmUgWFJFR19RVUFMSVRZICAgICAgMHgwMQorI2RlZmluZSBYUkVHX0ZSQU1FX0xJTkVTICAweDAyCisjZGVmaW5lIFhSRUdfSFNZTkNfRlJFUSAgIDB4MDMKKyNkZWZpbmUgWFJFR19MT0NLICAgICAgICAgMHgwNAorI2RlZmluZSBYUkVHX0ZSRVFfRVJST1IgICAweDA1CisjZGVmaW5lIFhSRUdfU05SICAgICAgICAgIDB4MDYKKyNkZWZpbmUgWFJFR19WRVJTSU9OICAgICAgMHgwNworI2RlZmluZSBYUkVHX1BST0RVQ1RfSUQgICAweDA4CisKKy8qCisgICBCYXNpYyBmaXJtd2FyZSBkZXNjcmlwdGlvbi4gVGhpcyB3aWxsIHJlbWFpbiB3aXRoCisgICB0aGUgZHJpdmVyIGZvciBkb2N1bWVudGF0aW9uIHB1cnBvc2VzLgorCisgICBUaGlzIHJlcHJlc2VudHMgYW4gSTJDIGZpcm13YXJlIGZpbGUgZW5jb2RlZCBhcyBhCisgICBzdHJpbmcgb2YgdW5zaWduZWQgY2hhci4gRm9ybWF0IGlzIGFzIGZvbGxvd3M6CisKKyAgIGNoYXJbMCAgXT1sZW4wX01TQiAgLT4gbGVuID0gbGVuX01TQiAqIDI1NiArIGxlbl9MU0IKKyAgIGNoYXJbMSAgXT1sZW4wX0xTQiAgLT4gbGVuZ3RoIG9mIGZpcnN0IHdyaXRlIHRyYW5zYWN0aW9uCisgICBjaGFyWzIgIF09ZGF0YTAgLT4gZmlyc3QgYnl0ZSB0byBiZSBzZW50CisgICBjaGFyWzMgIF09ZGF0YTEKKyAgIGNoYXJbNCAgXT1kYXRhMgorICAgY2hhclsgICBdPS4uLgorICAgY2hhcltNICBdPWRhdGFOICAtPiBsYXN0IGJ5dGUgdG8gYmUgc2VudAorICAgY2hhcltNKzFdPWxlbjFfTVNCICAtPiBsZW4gPSBsZW5fTVNCICogMjU2ICsgbGVuX0xTQgorICAgY2hhcltNKzJdPWxlbjFfTFNCICAtPiBsZW5ndGggb2Ygc2Vjb25kIHdyaXRlIHRyYW5zYWN0aW9uCisgICBjaGFyW00rM109ZGF0YTAKKyAgIGNoYXJbTSs0XT1kYXRhMQorICAgLi4uCisgICBldGMuCisKKyAgIFRoZSBbbGVuXSB2YWx1ZSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgZm9sbG93czoKKworICAgbGVuPSBsZW5fTVNCIF8gbGVuX0xTQgorICAgbGVuPTExMTFfMTExMV8xMTExXzExMTEgICA6IEVuZCBvZiBJMkNfU0VRVUVOQ0UKKyAgIGxlbj0wMDAwXzAwMDBfMDAwMF8wMDAwICAgOiBSZXNldCBjb21tYW5kOiBEbyBoYXJkd2FyZSByZXNldAorICAgbGVuPTBOTk5fTk5OTl9OTk5OX05OTk4gICA6IE5vcm1hbCB0cmFuc2FjdGlvbjogbnVtYmVyIG9mIGJ5dGVzID0gezE6MzI3NjcpCisgICBsZW49MVdXV19XV1dXX1dXV1dfV1dXVyAgIDogV2FpdCBjb21tYW5kOiB3YWl0IGZvciB7MTozMjc2N30gbXMKKworICAgRm9yIHRoZSBSRVNFVCBhbmQgV0FJVCBjb21tYW5kcywgdGhlIHR3byBmb2xsb3dpbmcgYnl0ZXMgd2lsbCBjb250YWluCisgICBpbW1lZGlhdGVseSB0aGUgbGVuZ3RoIG9mIHRoZSBmb2xsb3dpbmcgdHJhbnNhY3Rpb24uCisqLworCitzdHJ1Y3QgWENfVFZfU1RBTkRBUkQgeworCWNvbnN0IGNoYXIgICpOYW1lOworCXUxNgkgICAgYXVkaW9fbW9kZTsKKwl1MTYJICAgIHZpZGVvX21vZGU7CisJdTE2CSAgICBpbnRfZnJlcTsKK307CisKKy8qIFR1bmVyIHN0YW5kYXJkcyAqLworI2RlZmluZSBYQzQwMDBfTU5fTlRTQ19QQUxfQlRTQwkJMAorI2RlZmluZSBYQzQwMDBfTU5fTlRTQ19QQUxfQTIJCTEKKyNkZWZpbmUgWEM0MDAwX01OX05UU0NfUEFMX0VJQUoJCTIKKyNkZWZpbmUgWEM0MDAwX01OX05UU0NfUEFMX01vbm8JCTMKKyNkZWZpbmUgWEM0MDAwX0JHX1BBTF9BMgkJNAorI2RlZmluZSBYQzQwMDBfQkdfUEFMX05JQ0FNCQk1CisjZGVmaW5lIFhDNDAwMF9CR19QQUxfTU9OTwkJNgorI2RlZmluZSBYQzQwMDBfSV9QQUxfTklDQU0JCTcKKyNkZWZpbmUgWEM0MDAwX0lfUEFMX05JQ0FNX01PTk8JCTgKKyNkZWZpbmUgWEM0MDAwX0RLX1BBTF9BMgkJOQorI2RlZmluZSBYQzQwMDBfREtfUEFMX05JQ0FNCQkxMAorI2RlZmluZSBYQzQwMDBfREtfUEFMX01PTk8JCTExCisjZGVmaW5lIFhDNDAwMF9ES19TRUNBTV9BMkRLMQkJMTIKKyNkZWZpbmUgWEM0MDAwX0RLX1NFQ0FNX0EyTERLMwkJMTMKKyNkZWZpbmUgWEM0MDAwX0RLX1NFQ0FNX0EyTU9OTwkJMTQKKyNkZWZpbmUgWEM0MDAwX0RLX1NFQ0FNX05JQ0FNCQkxNQorI2RlZmluZSBYQzQwMDBfTF9TRUNBTV9OSUNBTQkJMTYKKyNkZWZpbmUgWEM0MDAwX0xDX1NFQ0FNX05JQ0FNCQkxNworI2RlZmluZSBYQzQwMDBfRFRWNgkJCTE4CisjZGVmaW5lIFhDNDAwMF9EVFY4CQkJMTkKKyNkZWZpbmUgWEM0MDAwX0RUVjdfOAkJCTIwCisjZGVmaW5lIFhDNDAwMF9EVFY3CQkJMjEKKyNkZWZpbmUgWEM0MDAwX0ZNX1JhZGlvX0lOUFVUMgkJMjIKKyNkZWZpbmUgWEM0MDAwX0ZNX1JhZGlvX0lOUFVUMQkJMjMKKworc3RhdGljIHN0cnVjdCBYQ19UVl9TVEFOREFSRCB4YzQwMDBfc3RhbmRhcmRbTUFYX1RWX1NUQU5EQVJEXSA9IHsKKwl7Ik0vTi1OVFNDL1BBTC1CVFNDIiwJMHgwMDAwLCAweDgwQTAsIDQ1MDB9LAorCXsiTS9OLU5UU0MvUEFMLUEyIiwJMHgwMDAwLCAweDgwQTAsIDQ2MDB9LAorCXsiTS9OLU5UU0MvUEFMLUVJQUoiLAkweDAwNDAsIDB4ODBBMCwgNDUwMH0sCisJeyJNL04tTlRTQy9QQUwtTW9ubyIsCTB4MDA3OCwgMHg4MEEwLCA0NTAwfSwKKwl7IkIvRy1QQUwtQTIiLAkJMHgwMDAwLCAweDgxNTksIDU2NDB9LAorCXsiQi9HLVBBTC1OSUNBTSIsCTB4MDAwNCwgMHg4MTU5LCA1NzQwfSwKKwl7IkIvRy1QQUwtTU9OTyIsCTB4MDA3OCwgMHg4MTU5LCA1NTAwfSwKKwl7IkktUEFMLU5JQ0FNIiwJCTB4MDA4MCwgMHg4MDQ5LCA2MjQwfSwKKwl7IkktUEFMLU5JQ0FNLU1PTk8iLAkweDAwNzgsIDB4ODA0OSwgNjAwMH0sCisJeyJEL0stUEFMLUEyIiwJCTB4MDAwMCwgMHg4MDQ5LCA2MzgwfSwKKwl7IkQvSy1QQUwtTklDQU0iLAkweDAwODAsIDB4ODA0OSwgNjIwMH0sCisJeyJEL0stUEFMLU1PTk8iLAkweDAwNzgsIDB4ODA0OSwgNjUwMH0sCisJeyJEL0stU0VDQU0tQTIgREsxIiwJMHgwMDAwLCAweDgwNDksIDYzNDB9LAorCXsiRC9LLVNFQ0FNLUEyIEwvREszIiwJMHgwMDAwLCAweDgwNDksIDYwMDB9LAorCXsiRC9LLVNFQ0FNLUEyIE1PTk8iLAkweDAwNzgsIDB4ODA0OSwgNjUwMH0sCisJeyJEL0stU0VDQU0tTklDQU0iLAkweDAwODAsIDB4ODA0OSwgNjIwMH0sCisJeyJMLVNFQ0FNLU5JQ0FNIiwJMHg4MDgwLCAweDAwMDksIDYyMDB9LAorCXsiTCctU0VDQU0tTklDQU0iLAkweDgwODAsIDB4NDAwOSwgNjIwMH0sCisJeyJEVFY2IiwJCTB4MDBDMCwgMHg4MDAyLCAgICAwfSwKKwl7IkRUVjgiLAkJMHgwMEMwLCAweDgwMEIsICAgIDB9LAorCXsiRFRWNy84IiwJCTB4MDBDMCwgMHg4MDFCLCAgICAwfSwKKwl7IkRUVjciLAkJMHgwMEMwLCAweDgwMDcsICAgIDB9LAorCXsiRk0gUmFkaW8tSU5QVVQyIiwJMHgwMDA4LCAweDk4MDAsIDEwNzAwfSwKKwl7IkZNIFJhZGlvLUlOUFVUMSIsCTB4MDAwOCwgMHg5MDAwLCAxMDcwMH0KK307CisKK3N0YXRpYyBpbnQgeGM0MDAwX3JlYWRyZWcoc3RydWN0IHhjNDAwMF9wcml2ICpwcml2LCB1MTYgcmVnLCB1MTYgKnZhbCk7CitzdGF0aWMgaW50IHhjNDAwMF90dW5lcl9yZXNldChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSk7CitzdGF0aWMgdm9pZCB4Y19kZWJ1Z19kdW1wKHN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdik7CisKK3N0YXRpYyBpbnQgeGNfc2VuZF9pMmNfZGF0YShzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYsIHU4ICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IGkyY19tc2cgbXNnID0geyAuYWRkciA9IHByaXYtPmkyY19wcm9wcy5hZGRyLAorCQkJICAgICAgIC5mbGFncyA9IDAsIC5idWYgPSBidWYsIC5sZW4gPSBsZW4gfTsKKwlpZiAoaTJjX3RyYW5zZmVyKHByaXYtPmkyY19wcm9wcy5hZGFwLCAmbXNnLCAxKSAhPSAxKSB7CisJCWlmIChwcml2LT5pZ25vcmVfaTJjX3dyaXRlX2Vycm9ycyA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInhjNDAwMDogSTJDIHdyaXRlIGZhaWxlZCAobGVuPSVpKVxuIiwKKwkJCSAgICAgICBsZW4pOworCQkJaWYgKGxlbiA9PSA0KSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJieXRlcyAlMDJ4ICUwMnggJTAyeCAlMDJ4XG4iLCBidWZbMF0sCisJCQkJICAgICAgIGJ1ZlsxXSwgYnVmWzJdLCBidWZbM10pOworCQkJfQorCQkJcmV0dXJuIC1FUkVNT1RFSU87CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGM0MDAwX3R1bmVyX3Jlc2V0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdiA9IGZlLT50dW5lcl9wcml2OworCWludCByZXQ7CisKKwlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoZmUtPmNhbGxiYWNrKSB7CisJCXJldCA9IGZlLT5jYWxsYmFjaygoKGZlLT5kdmIpICYmIChmZS0+ZHZiLT5wcml2KSkgPworCQkJCQkgICBmZS0+ZHZiLT5wcml2IDoKKwkJCQkJICAgcHJpdi0+aTJjX3Byb3BzLmFkYXAtPmFsZ29fZGF0YSwKKwkJCQkJICAgRFZCX0ZST05URU5EX0NPTVBPTkVOVF9UVU5FUiwKKwkJCQkJICAgWEM0MDAwX1RVTkVSX1JFU0VULCAwKTsKKwkJaWYgKHJldCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJ4YzQwMDA6IHJlc2V0IGZhaWxlZFxuIik7CisJCQlyZXR1cm4gLUVSRU1PVEVJTzsKKwkJfQorCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAieGM0MDAwOiBubyB0dW5lciByZXNldCBjYWxsYmFjayBmdW5jdGlvbiwgIgorCQkJCSJmYXRhbFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4Y193cml0ZV9yZWcoc3RydWN0IHhjNDAwMF9wcml2ICpwcml2LCB1MTYgcmVnQWRkciwgdTE2IGkyY0RhdGEpCit7CisJdTggYnVmWzRdOworCWludCByZXN1bHQ7CisKKwlidWZbMF0gPSAocmVnQWRkciA+PiA4KSAmIDB4RkY7CisJYnVmWzFdID0gcmVnQWRkciAmIDB4RkY7CisJYnVmWzJdID0gKGkyY0RhdGEgPj4gOCkgJiAweEZGOworCWJ1ZlszXSA9IGkyY0RhdGEgJiAweEZGOworCXJlc3VsdCA9IHhjX3NlbmRfaTJjX2RhdGEocHJpdiwgYnVmLCA0KTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgeGNfbG9hZF9pMmNfc2VxdWVuY2Uoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGNvbnN0IHU4ICppMmNfc2VxdWVuY2UpCit7CisJc3RydWN0IHhjNDAwMF9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CisKKwlpbnQgaSwgbmJ5dGVzX3RvX3NlbmQsIHJlc3VsdDsKKwl1bnNpZ25lZCBpbnQgbGVuLCBwb3MsIGluZGV4OworCXU4IGJ1ZltYQ19NQVhfSTJDX1dSSVRFX0xFTkdUSF07CisKKwlpbmRleCA9IDA7CisJd2hpbGUgKChpMmNfc2VxdWVuY2VbaW5kZXhdICE9IDB4RkYpIHx8CisJCShpMmNfc2VxdWVuY2VbaW5kZXggKyAxXSAhPSAweEZGKSkgeworCQlsZW4gPSBpMmNfc2VxdWVuY2VbaW5kZXhdICogMjU2ICsgaTJjX3NlcXVlbmNlW2luZGV4KzFdOworCQlpZiAobGVuID09IDB4MDAwMCkgeworCQkJLyogUkVTRVQgY29tbWFuZCAqLworCQkJLyogTk9URTogdGhpcyBpcyBpZ25vcmVkLCBhcyB0aGUgcmVzZXQgY2FsbGJhY2sgd2FzICovCisJCQkvKiBhbHJlYWR5IGNhbGxlZCBieSBjaGVja19maXJtd2FyZSgpICovCisJCQlpbmRleCArPSAyOworCQl9IGVsc2UgaWYgKGxlbiAmIDB4ODAwMCkgeworCQkJLyogV0FJVCBjb21tYW5kICovCisJCQltc2xlZXAobGVuICYgMHg3RkZGKTsKKwkJCWluZGV4ICs9IDI7CisJCX0gZWxzZSB7CisJCQkvKiBTZW5kIGkyYyBkYXRhIHdoaWxzdCBlbnN1cmluZyBpbmRpdmlkdWFsIHRyYW5zYWN0aW9ucworCQkJICogZG8gbm90IGV4Y2VlZCBYQ19NQVhfSTJDX1dSSVRFX0xFTkdUSCBieXRlcy4KKwkJCSAqLworCQkJaW5kZXggKz0gMjsKKwkJCWJ1ZlswXSA9IGkyY19zZXF1ZW5jZVtpbmRleF07CisJCQlidWZbMV0gPSBpMmNfc2VxdWVuY2VbaW5kZXggKyAxXTsKKwkJCXBvcyA9IDI7CisJCQl3aGlsZSAocG9zIDwgbGVuKSB7CisJCQkJaWYgKChsZW4gLSBwb3MpID4gWENfTUFYX0kyQ19XUklURV9MRU5HVEggLSAyKQorCQkJCQluYnl0ZXNfdG9fc2VuZCA9CisJCQkJCQlYQ19NQVhfSTJDX1dSSVRFX0xFTkdUSDsKKwkJCQllbHNlCisJCQkJCW5ieXRlc190b19zZW5kID0gKGxlbiAtIHBvcyArIDIpOworCQkJCWZvciAoaSA9IDI7IGkgPCBuYnl0ZXNfdG9fc2VuZDsgaSsrKSB7CisJCQkJCWJ1ZltpXSA9IGkyY19zZXF1ZW5jZVtpbmRleCArIHBvcyArCisJCQkJCQlpIC0gMl07CisJCQkJfQorCQkJCXJlc3VsdCA9IHhjX3NlbmRfaTJjX2RhdGEocHJpdiwgYnVmLAorCQkJCQluYnl0ZXNfdG9fc2VuZCk7CisKKwkJCQlpZiAocmVzdWx0ICE9IDApCisJCQkJCXJldHVybiByZXN1bHQ7CisKKwkJCQlwb3MgKz0gbmJ5dGVzX3RvX3NlbmQgLSAyOworCQkJfQorCQkJaW5kZXggKz0gbGVuOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhjX3NldF90dl9zdGFuZGFyZChzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYsCisJdTE2IHZpZGVvX21vZGUsIHUxNiBhdWRpb19tb2RlKQoreworCWludCByZXQ7CisJZHByaW50aygxLCAiJXMoMHglMDR4LDB4JTA0eClcbiIsIF9fZnVuY19fLCB2aWRlb19tb2RlLCBhdWRpb19tb2RlKTsKKwlkcHJpbnRrKDEsICIlcygpIFN0YW5kYXJkID0gJXNcbiIsCisJCV9fZnVuY19fLAorCQl4YzQwMDBfc3RhbmRhcmRbcHJpdi0+dmlkZW9fc3RhbmRhcmRdLk5hbWUpOworCisJLyogRG9uJ3QgY29tcGxhaW4gd2hlbiB0aGUgcmVxdWVzdCBmYWlscyBiZWNhdXNlIG9mIGkyYyBzdHJldGNoaW5nICovCisJcHJpdi0+aWdub3JlX2kyY193cml0ZV9lcnJvcnMgPSAxOworCisJcmV0ID0geGNfd3JpdGVfcmVnKHByaXYsIFhSRUdfVklERU9fTU9ERSwgdmlkZW9fbW9kZSk7CisJaWYgKHJldCA9PSAwKQorCQlyZXQgPSB4Y193cml0ZV9yZWcocHJpdiwgWFJFR19BVURJT19NT0RFLCBhdWRpb19tb2RlKTsKKworCXByaXYtPmlnbm9yZV9pMmNfd3JpdGVfZXJyb3JzID0gMDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgeGNfc2V0X3NpZ25hbF9zb3VyY2Uoc3RydWN0IHhjNDAwMF9wcml2ICpwcml2LCB1MTYgcmZfbW9kZSkKK3sKKwlkcHJpbnRrKDEsICIlcyglZCkgU291cmNlID0gJXNcbiIsIF9fZnVuY19fLCByZl9tb2RlLAorCQlyZl9tb2RlID09IFhDX1JGX01PREVfQUlSID8gIkFOVEVOTkEiIDogIkNBQkxFIik7CisKKwlpZiAoKHJmX21vZGUgIT0gWENfUkZfTU9ERV9BSVIpICYmIChyZl9tb2RlICE9IFhDX1JGX01PREVfQ0FCTEUpKSB7CisJCXJmX21vZGUgPSBYQ19SRl9NT0RFX0NBQkxFOworCQlwcmludGsoS0VSTl9FUlIKKwkJCSIlcygpLCBJbnZhbGlkIG1vZGUsIGRlZmF1bHRpbmcgdG8gQ0FCTEUiLAorCQkJX19mdW5jX18pOworCX0KKwlyZXR1cm4geGNfd3JpdGVfcmVnKHByaXYsIFhSRUdfU0lHTkFMU09VUkNFLCByZl9tb2RlKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkdmJfdHVuZXJfb3BzIHhjNDAwMF90dW5lcl9vcHM7CisKK3N0YXRpYyBpbnQgeGNfc2V0X3JmX2ZyZXF1ZW5jeShzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYsIHUzMiBmcmVxX2h6KQoreworCXUxNiBmcmVxX2NvZGU7CisKKwlkcHJpbnRrKDEsICIlcygldSlcbiIsIF9fZnVuY19fLCBmcmVxX2h6KTsKKworCWlmICgoZnJlcV9oeiA+IHhjNDAwMF90dW5lcl9vcHMuaW5mby5mcmVxdWVuY3lfbWF4KSB8fAorCSAgICAoZnJlcV9oeiA8IHhjNDAwMF90dW5lcl9vcHMuaW5mby5mcmVxdWVuY3lfbWluKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmcmVxX2NvZGUgPSAodTE2KShmcmVxX2h6IC8gMTU2MjUpOworCisJLyogV0FTOiBTdGFydGluZyBpbiBmaXJtd2FyZSB2ZXJzaW9uIDEuMS40NCwgWGNlaXZlIHJlY29tbWVuZHMgdXNpbmcgdGhlCisJICAgRklORVJGUkVRIGZvciBhbGwgbm9ybWFsIHR1bmluZyAodGhlIGRvYyBpbmRpY2F0ZXMgcmVnIDB4MDMgc2hvdWxkCisJICAgb25seSBiZSB1c2VkIGZvciBmYXN0IHNjYW5uaW5nIGZvciBjaGFubmVsIGxvY2spICovCisJLyogV0FTOiBYUkVHX0ZJTkVSRlJFUSAqLworCXJldHVybiB4Y193cml0ZV9yZWcocHJpdiwgWFJFR19SRl9GUkVRLCBmcmVxX2NvZGUpOworfQorCitzdGF0aWMgaW50IHhjX2dldF9hZGNfZW52ZWxvcGUoc3RydWN0IHhjNDAwMF9wcml2ICpwcml2LCB1MTYgKmFkY19lbnZlbG9wZSkKK3sKKwlyZXR1cm4geGM0MDAwX3JlYWRyZWcocHJpdiwgWFJFR19BRENfRU5WLCBhZGNfZW52ZWxvcGUpOworfQorCitzdGF0aWMgaW50IHhjX2dldF9mcmVxdWVuY3lfZXJyb3Ioc3RydWN0IHhjNDAwMF9wcml2ICpwcml2LCB1MzIgKmZyZXFfZXJyb3JfaHopCit7CisJaW50IHJlc3VsdDsKKwl1MTYgcmVnRGF0YTsKKwl1MzIgdG1wOworCisJcmVzdWx0ID0geGM0MDAwX3JlYWRyZWcocHJpdiwgWFJFR19GUkVRX0VSUk9SLCAmcmVnRGF0YSk7CisJaWYgKHJlc3VsdCAhPSAwKQorCQlyZXR1cm4gcmVzdWx0OworCisJdG1wID0gKHUzMilyZWdEYXRhICYgMHhGRkZGVTsKKwl0bXAgPSAodG1wIDwgMHg4MDAwVSA/IHRtcCA6IDB4MTAwMDBVIC0gdG1wKTsKKwkoKmZyZXFfZXJyb3JfaHopID0gdG1wICogMTU2MjU7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCB4Y19nZXRfbG9ja19zdGF0dXMoc3RydWN0IHhjNDAwMF9wcml2ICpwcml2LCB1MTYgKmxvY2tfc3RhdHVzKQoreworCXJldHVybiB4YzQwMDBfcmVhZHJlZyhwcml2LCBYUkVHX0xPQ0ssIGxvY2tfc3RhdHVzKTsKK30KKworc3RhdGljIGludCB4Y19nZXRfdmVyc2lvbihzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYsCisJdTggKmh3X21ham9ydmVyc2lvbiwgdTggKmh3X21pbm9ydmVyc2lvbiwKKwl1OCAqZndfbWFqb3J2ZXJzaW9uLCB1OCAqZndfbWlub3J2ZXJzaW9uKQoreworCXUxNiBkYXRhOworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSB4YzQwMDBfcmVhZHJlZyhwcml2LCBYUkVHX1ZFUlNJT04sICZkYXRhKTsKKwlpZiAocmVzdWx0ICE9IDApCisJCXJldHVybiByZXN1bHQ7CisKKwkoKmh3X21ham9ydmVyc2lvbikgPSAoZGF0YSA+PiAxMikgJiAweDBGOworCSgqaHdfbWlub3J2ZXJzaW9uKSA9IChkYXRhID4+ICA4KSAmIDB4MEY7CisJKCpmd19tYWpvcnZlcnNpb24pID0gKGRhdGEgPj4gIDQpICYgMHgwRjsKKwkoKmZ3X21pbm9ydmVyc2lvbikgPSBkYXRhICYgMHgwRjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhjX2dldF9oc3luY19mcmVxKHN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdiwgdTMyICpoc3luY19mcmVxX2h6KQoreworCXUxNiByZWdEYXRhOworCWludCByZXN1bHQ7CisKKwlyZXN1bHQgPSB4YzQwMDBfcmVhZHJlZyhwcml2LCBYUkVHX0hTWU5DX0ZSRVEsICZyZWdEYXRhKTsKKwlpZiAocmVzdWx0ICE9IDApCisJCXJldHVybiByZXN1bHQ7CisKKwkoKmhzeW5jX2ZyZXFfaHopID0gKChyZWdEYXRhICYgMHgwZmZmKSAqIDc2MykvMTAwOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbnQgeGNfZ2V0X2ZyYW1lX2xpbmVzKHN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdiwgdTE2ICpmcmFtZV9saW5lcykKK3sKKwlyZXR1cm4geGM0MDAwX3JlYWRyZWcocHJpdiwgWFJFR19GUkFNRV9MSU5FUywgZnJhbWVfbGluZXMpOworfQorCitzdGF0aWMgaW50IHhjX2dldF9xdWFsaXR5KHN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdiwgdTE2ICpxdWFsaXR5KQoreworCXJldHVybiB4YzQwMDBfcmVhZHJlZyhwcml2LCBYUkVHX1FVQUxJVFksIHF1YWxpdHkpOworfQorCitzdGF0aWMgdTE2IHhjX3dhaXRfZm9yX2xvY2soc3RydWN0IHhjNDAwMF9wcml2ICpwcml2KQoreworCXUxNglsb2NrX3N0YXRlID0gMDsKKwlpbnQJd2F0Y2hkb2dfY291bnQgPSA0MDsKKworCXdoaWxlICgobG9ja19zdGF0ZSA9PSAwKSAmJiAod2F0Y2hkb2dfY291bnQgPiAwKSkgeworCQl4Y19nZXRfbG9ja19zdGF0dXMocHJpdiwgJmxvY2tfc3RhdGUpOworCQlpZiAobG9ja19zdGF0ZSAhPSAxKSB7CisJCQltc2xlZXAoNSk7CisJCQl3YXRjaGRvZ19jb3VudC0tOworCQl9CisJfQorCXJldHVybiBsb2NrX3N0YXRlOworfQorCitzdGF0aWMgaW50IHhjX3R1bmVfY2hhbm5lbChzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYsIHUzMiBmcmVxX2h6KQoreworCWludAlmb3VuZCA9IDE7CisJaW50CXJlc3VsdDsKKworCWRwcmludGsoMSwgIiVzKCV1KVxuIiwgX19mdW5jX18sIGZyZXFfaHopOworCisJLyogRG9uJ3QgY29tcGxhaW4gd2hlbiB0aGUgcmVxdWVzdCBmYWlscyBiZWNhdXNlIG9mIGkyYyBzdHJldGNoaW5nICovCisJcHJpdi0+aWdub3JlX2kyY193cml0ZV9lcnJvcnMgPSAxOworCXJlc3VsdCA9IHhjX3NldF9yZl9mcmVxdWVuY3kocHJpdiwgZnJlcV9oeik7CisJcHJpdi0+aWdub3JlX2kyY193cml0ZV9lcnJvcnMgPSAwOworCisJaWYgKHJlc3VsdCAhPSAwKQorCQlyZXR1cm4gMDsKKworCS8qIHdhaXQgZm9yIGxvY2sgb25seSBpbiBhbmFsb2cgVFYgbW9kZSAqLworCWlmICgocHJpdi0+Y3VyX2Z3LnR5cGUgJiAoRk0gfCBEVFY2IHwgRFRWNyB8IERUVjc4IHwgRFRWOCkpID09IDApIHsKKwkJaWYgKHhjX3dhaXRfZm9yX2xvY2socHJpdikgIT0gMSkKKwkJCWZvdW5kID0gMDsKKwl9CisKKwkvKiBXYWl0IGZvciBzdGF0cyB0byBzdGFiaWxpemUuCisJICogRnJhbWUgTGluZXMgbmVlZHMgdHdvIGZyYW1lIHRpbWVzIGFmdGVyIGluaXRpYWwgbG9jaworCSAqIGJlZm9yZSBpdCBpcyB2YWxpZC4KKwkgKi8KKwltc2xlZXAoZGVidWcgPyAxMDAgOiAxMCk7CisKKwlpZiAoZGVidWcpCisJCXhjX2RlYnVnX2R1bXAocHJpdik7CisKKwlyZXR1cm4gZm91bmQ7Cit9CisKK3N0YXRpYyBpbnQgeGM0MDAwX3JlYWRyZWcoc3RydWN0IHhjNDAwMF9wcml2ICpwcml2LCB1MTYgcmVnLCB1MTYgKnZhbCkKK3sKKwl1OCBidWZbMl0gPSB7IHJlZyA+PiA4LCByZWcgJiAweGZmIH07CisJdTggYnZhbFsyXSA9IHsgMCwgMCB9OworCXN0cnVjdCBpMmNfbXNnIG1zZ1syXSA9IHsKKwkJeyAuYWRkciA9IHByaXYtPmkyY19wcm9wcy5hZGRyLAorCQkJLmZsYWdzID0gMCwgLmJ1ZiA9ICZidWZbMF0sIC5sZW4gPSAyIH0sCisJCXsgLmFkZHIgPSBwcml2LT5pMmNfcHJvcHMuYWRkciwKKwkJCS5mbGFncyA9IEkyQ19NX1JELCAuYnVmID0gJmJ2YWxbMF0sIC5sZW4gPSAyIH0sCisJfTsKKworCWlmIChpMmNfdHJhbnNmZXIocHJpdi0+aTJjX3Byb3BzLmFkYXAsIG1zZywgMikgIT0gMikgeworCQlwcmludGsoS0VSTl9FUlIgInhjNDAwMDogSTJDIHJlYWQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC1FUkVNT1RFSU87CisJfQorCisJKnZhbCA9IChidmFsWzBdIDw8IDgpIHwgYnZhbFsxXTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBkdW1wX2Zpcm1fdHlwZSh0KQlkdW1wX2Zpcm1fdHlwZV9hbmRfaW50X2ZyZXEodCwgMCkKK3N0YXRpYyB2b2lkIGR1bXBfZmlybV90eXBlX2FuZF9pbnRfZnJlcSh1bnNpZ25lZCBpbnQgdHlwZSwgdTE2IGludF9mcmVxKQoreworCSBpZiAodHlwZSAmIEJBU0UpCisJCXByaW50ayhLRVJOX0NPTlQgIkJBU0UgIik7CisJIGlmICh0eXBlICYgSU5JVDEpCisJCXByaW50ayhLRVJOX0NPTlQgIklOSVQxICIpOworCSBpZiAodHlwZSAmIEY4TUhaKQorCQlwcmludGsoS0VSTl9DT05UICJGOE1IWiAiKTsKKwkgaWYgKHR5cGUgJiBNVFMpCisJCXByaW50ayhLRVJOX0NPTlQgIk1UUyAiKTsKKwkgaWYgKHR5cGUgJiBEMjYyMCkKKwkJcHJpbnRrKEtFUk5fQ09OVCAiRDI2MjAgIik7CisJIGlmICh0eXBlICYgRDI2MzMpCisJCXByaW50ayhLRVJOX0NPTlQgIkQyNjMzICIpOworCSBpZiAodHlwZSAmIERUVjYpCisJCXByaW50ayhLRVJOX0NPTlQgIkRUVjYgIik7CisJIGlmICh0eXBlICYgUUFNKQorCQlwcmludGsoS0VSTl9DT05UICJRQU0gIik7CisJIGlmICh0eXBlICYgRFRWNykKKwkJcHJpbnRrKEtFUk5fQ09OVCAiRFRWNyAiKTsKKwkgaWYgKHR5cGUgJiBEVFY3OCkKKwkJcHJpbnRrKEtFUk5fQ09OVCAiRFRWNzggIik7CisJIGlmICh0eXBlICYgRFRWOCkKKwkJcHJpbnRrKEtFUk5fQ09OVCAiRFRWOCAiKTsKKwkgaWYgKHR5cGUgJiBGTSkKKwkJcHJpbnRrKEtFUk5fQ09OVCAiRk0gIik7CisJIGlmICh0eXBlICYgSU5QVVQxKQorCQlwcmludGsoS0VSTl9DT05UICJJTlBVVDEgIik7CisJIGlmICh0eXBlICYgTENEKQorCQlwcmludGsoS0VSTl9DT05UICJMQ0QgIik7CisJIGlmICh0eXBlICYgTk9HRCkKKwkJcHJpbnRrKEtFUk5fQ09OVCAiTk9HRCAiKTsKKwkgaWYgKHR5cGUgJiBNT05PKQorCQlwcmludGsoS0VSTl9DT05UICJNT05PICIpOworCSBpZiAodHlwZSAmIEFUU0MpCisJCXByaW50ayhLRVJOX0NPTlQgIkFUU0MgIik7CisJIGlmICh0eXBlICYgSUYpCisJCXByaW50ayhLRVJOX0NPTlQgIklGICIpOworCSBpZiAodHlwZSAmIExHNjApCisJCXByaW50ayhLRVJOX0NPTlQgIkxHNjAgIik7CisJIGlmICh0eXBlICYgQVRJNjM4KQorCQlwcmludGsoS0VSTl9DT05UICJBVEk2MzggIik7CisJIGlmICh0eXBlICYgT1JFTjUzOCkKKwkJcHJpbnRrKEtFUk5fQ09OVCAiT1JFTjUzOCAiKTsKKwkgaWYgKHR5cGUgJiBPUkVOMzYpCisJCXByaW50ayhLRVJOX0NPTlQgIk9SRU4zNiAiKTsKKwkgaWYgKHR5cGUgJiBUT1lPVEEzODgpCisJCXByaW50ayhLRVJOX0NPTlQgIlRPWU9UQTM4OCAiKTsKKwkgaWYgKHR5cGUgJiBUT1lPVEE3OTQpCisJCXByaW50ayhLRVJOX0NPTlQgIlRPWU9UQTc5NCAiKTsKKwkgaWYgKHR5cGUgJiBESUJDT001MikKKwkJcHJpbnRrKEtFUk5fQ09OVCAiRElCQ09NNTIgIik7CisJIGlmICh0eXBlICYgWkFSTElOSzQ1NikKKwkJcHJpbnRrKEtFUk5fQ09OVCAiWkFSTElOSzQ1NiAiKTsKKwkgaWYgKHR5cGUgJiBDSElOQSkKKwkJcHJpbnRrKEtFUk5fQ09OVCAiQ0hJTkEgIik7CisJIGlmICh0eXBlICYgRjZNSFopCisJCXByaW50ayhLRVJOX0NPTlQgIkY2TUhaICIpOworCSBpZiAodHlwZSAmIElOUFVUMikKKwkJcHJpbnRrKEtFUk5fQ09OVCAiSU5QVVQyICIpOworCSBpZiAodHlwZSAmIFNDT0RFKQorCQlwcmludGsoS0VSTl9DT05UICJTQ09ERSAiKTsKKwkgaWYgKHR5cGUgJiBIQVNfSUYpCisJCXByaW50ayhLRVJOX0NPTlQgIkhBU19JRl8lZCAiLCBpbnRfZnJlcSk7Cit9CisKK3N0YXRpYyBpbnQgc2Vla19maXJtd2FyZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdW5zaWduZWQgaW50IHR5cGUsCisJCQkgdjRsMl9zdGRfaWQgKmlkKQoreworCXN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdiA9IGZlLT50dW5lcl9wcml2OworCWludAkJaSwgYmVzdF9pID0gLTE7CisJdW5zaWduZWQgaW50CWJlc3RfbnJfZGlmZnMgPSAyNTVVOworCisJaWYgKCFwcml2LT5maXJtKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IhIGZpcm13YXJlIG5vdCBsb2FkZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKCh0eXBlICYgflNDT0RFKSA9PSAwKSAmJiAoKmlkID09IDApKQorCQkqaWQgPSBWNEwyX1NURF9QQUw7CisKKwkvKiBTZWVrIGZvciBnZW5lcmljIHZpZGVvIHN0YW5kYXJkIG1hdGNoICovCisJZm9yIChpID0gMDsgaSA8IHByaXYtPmZpcm1fc2l6ZTsgaSsrKSB7CisJCXY0bDJfc3RkX2lkCWlkX2RpZmZfbWFzayA9CisJCQkocHJpdi0+ZmlybVtpXS5pZCBeICgqaWQpKSAmICgqaWQpOworCQl1bnNpZ25lZCBpbnQJdHlwZV9kaWZmX21hc2sgPQorCQkJKHByaXYtPmZpcm1baV0udHlwZSBeIHR5cGUpCisJCQkmIChCQVNFX1RZUEVTIHwgRFRWX1RZUEVTIHwgTENEIHwgTk9HRCB8IE1PTk8gfCBTQ09ERSk7CisJCXVuc2lnbmVkIGludAlucl9kaWZmczsKKworCQlpZiAodHlwZV9kaWZmX21hc2sKKwkJICAgICYgKEJBU0UgfCBJTklUMSB8IEZNIHwgRFRWNiB8IERUVjcgfCBEVFY3OCB8IERUVjggfCBTQ09ERSkpCisJCQljb250aW51ZTsKKworCQlucl9kaWZmcyA9IGh3ZWlnaHQ2NChpZF9kaWZmX21hc2spICsgaHdlaWdodDMyKHR5cGVfZGlmZl9tYXNrKTsKKwkJaWYgKCFucl9kaWZmcykJLyogU3VwcG9ydHMgYWxsIHRoZSByZXF1ZXN0ZWQgc3RhbmRhcmRzICovCisJCQlnb3RvIGZvdW5kOworCisJCWlmIChucl9kaWZmcyA8IGJlc3RfbnJfZGlmZnMpIHsKKwkJCWJlc3RfbnJfZGlmZnMgPSBucl9kaWZmczsKKwkJCWJlc3RfaSA9IGk7CisJCX0KKwl9CisKKwkvKiBGSVhNRTogV291bGQgbWFrZSBzZW5zZSB0byBzZWVrIGZvciB0eXBlICJoaW50IiBtYXRjaCA/ICovCisJaWYgKGJlc3RfaSA8IDApIHsKKwkJaSA9IC1FTk9FTlQ7CisJCWdvdG8gcmV0OworCX0KKworCWlmIChiZXN0X25yX2RpZmZzID4gMFUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIlNlbGVjdGluZyBiZXN0IG1hdGNoaW5nIGZpcm13YXJlICgldSBiaXRzIGRpZmZlcikgZm9yICIKKwkJICAgICAgICJ0eXBlPSgleCksIGlkICUwMTZsbHg6XG4iLAorCQkgICAgICAgYmVzdF9ucl9kaWZmcywgdHlwZSwgKHVuc2lnbmVkIGxvbmcgbG9uZykqaWQpOworCQlpID0gYmVzdF9pOworCX0KKworZm91bmQ6CisJKmlkID0gcHJpdi0+ZmlybVtpXS5pZDsKKworcmV0OgorCWlmIChkZWJ1ZykgeworCQlwcmludGsoS0VSTl9ERUJVRyAiJXMgZmlybXdhcmUgZm9yIHR5cGU9IiwKKwkJICAgICAgIChpIDwgMCkgPyAiQ2FuJ3QgZmluZCIgOiAiRm91bmQiKTsKKwkJZHVtcF9maXJtX3R5cGUodHlwZSk7CisJCXByaW50ayhLRVJOX0RFQlVHICIoJXgpLCBpZCAlMDE2bGx4LlxuIiwgdHlwZSwgKHVuc2lnbmVkIGxvbmcgbG9uZykqaWQpOworCX0KKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBsb2FkX2Zpcm13YXJlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1bnNpZ25lZCBpbnQgdHlwZSwKKwkJCSB2NGwyX3N0ZF9pZCAqaWQpCit7CisJc3RydWN0IHhjNDAwMF9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CisJaW50ICAgICAgICAgICAgICAgIHBvcywgcmM7CisJdW5zaWduZWQgY2hhciAgICAgICpwOworCisJcG9zID0gc2Vla19maXJtd2FyZShmZSwgdHlwZSwgaWQpOworCWlmIChwb3MgPCAwKQorCQlyZXR1cm4gcG9zOworCisJcCA9IHByaXYtPmZpcm1bcG9zXS5wdHI7CisKKwkvKiBEb24ndCBjb21wbGFpbiB3aGVuIHRoZSByZXF1ZXN0IGZhaWxzIGJlY2F1c2Ugb2YgaTJjIHN0cmV0Y2hpbmcgKi8KKwlwcml2LT5pZ25vcmVfaTJjX3dyaXRlX2Vycm9ycyA9IDE7CisKKwlyYyA9IHhjX2xvYWRfaTJjX3NlcXVlbmNlKGZlLCBwKTsKKworCXByaXYtPmlnbm9yZV9pMmNfd3JpdGVfZXJyb3JzID0gMDsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB4YzQwMDBfZnd1cGxvYWQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IHhjNDAwMF9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdyAgID0gTlVMTDsKKwljb25zdCB1bnNpZ25lZCBjaGFyICAgKnAsICplbmRwOworCWludCAgICAgICAgICAgICAgICAgICByYyA9IDA7CisJaW50CQkgICAgICBuLCBuX2FycmF5OworCWNoYXIJCSAgICAgIG5hbWVbMzNdOworCWNvbnN0IGNoYXIJICAgICAgKmZuYW1lOworCisJaWYgKGZpcm13YXJlX25hbWVbMF0gIT0gJ1wwJykKKwkJZm5hbWUgPSBmaXJtd2FyZV9uYW1lOworCWVsc2UKKwkJZm5hbWUgPSBYQzQwMDBfREVGQVVMVF9GSVJNV0FSRTsKKworCWRwcmludGsoMSwgIlJlYWRpbmcgZmlybXdhcmUgJXNcbiIsIGZuYW1lKTsKKwlyYyA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmbmFtZSwgcHJpdi0+aTJjX3Byb3BzLmFkYXAtPmRldi5wYXJlbnQpOworCWlmIChyYyA8IDApIHsKKwkJaWYgKHJjID09IC1FTk9FTlQpCisJCQlwcmludGsoS0VSTl9FUlIgIkVycm9yOiBmaXJtd2FyZSAlcyBub3QgZm91bmQuXG4iLCBmbmFtZSk7CisJCWVsc2UKKwkJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgJWQgd2hpbGUgcmVxdWVzdGluZyBmaXJtd2FyZSAlc1xuIiwKKwkJCSAgICAgICByYywgZm5hbWUpOworCisJCXJldHVybiByYzsKKwl9CisJcCA9IGZ3LT5kYXRhOworCWVuZHAgPSBwICsgZnctPnNpemU7CisKKwlpZiAoZnctPnNpemUgPCBzaXplb2YobmFtZSkgLSAxICsgMiArIDIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFcnJvcjogZmlybXdhcmUgZmlsZSAlcyBoYXMgaW52YWxpZCBzaXplIVxuIiwKKwkJICAgICAgIGZuYW1lKTsKKwkJZ290byBjb3JydXB0OworCX0KKworCW1lbWNweShuYW1lLCBwLCBzaXplb2YobmFtZSkgLSAxKTsKKwluYW1lW3NpemVvZihuYW1lKSAtIDFdID0gJ1wwJzsKKwlwICs9IHNpemVvZihuYW1lKSAtIDE7CisKKwlwcml2LT5maXJtX3ZlcnNpb24gPSBnZXRfdW5hbGlnbmVkX2xlMTYocCk7CisJcCArPSAyOworCisJbl9hcnJheSA9IGdldF91bmFsaWduZWRfbGUxNihwKTsKKwlwICs9IDI7CisKKwlkcHJpbnRrKDEsICJMb2FkaW5nICVkIGZpcm13YXJlIGltYWdlcyBmcm9tICVzLCB0eXBlOiAlcywgdmVyICVkLiVkXG4iLAorCQluX2FycmF5LCBmbmFtZSwgbmFtZSwKKwkJcHJpdi0+ZmlybV92ZXJzaW9uID4+IDgsIHByaXYtPmZpcm1fdmVyc2lvbiAmIDB4ZmYpOworCisJcHJpdi0+ZmlybSA9IGt6YWxsb2Moc2l6ZW9mKCpwcml2LT5maXJtKSAqIG5fYXJyYXksIEdGUF9LRVJORUwpOworCWlmIChwcml2LT5maXJtID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJOb3QgZW5vdWdoIG1lbW9yeSB0byBsb2FkIGZpcm13YXJlIGZpbGUuXG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGRvbmU7CisJfQorCXByaXYtPmZpcm1fc2l6ZSA9IG5fYXJyYXk7CisKKwluID0gLTE7CisJd2hpbGUgKHAgPCBlbmRwKSB7CisJCV9fdTMyIHR5cGUsIHNpemU7CisJCXY0bDJfc3RkX2lkIGlkOworCQlfX3UxNiBpbnRfZnJlcSA9IDA7CisKKwkJbisrOworCQlpZiAobiA+PSBuX2FycmF5KSB7CisJCQlwcmludGsoS0VSTl9FUlIgIk1vcmUgZmlybXdhcmUgaW1hZ2VzIGluIGZpbGUgdGhhbiAiCisJCQkgICAgICAgIndlcmUgZXhwZWN0ZWQhXG4iKTsKKwkJCWdvdG8gY29ycnVwdDsKKwkJfQorCisJCS8qIENoZWNrcyBpZiB0aGVyZSdzIGVub3VnaCBieXRlcyB0byByZWFkICovCisJCWlmIChlbmRwIC0gcCA8IHNpemVvZih0eXBlKSArIHNpemVvZihpZCkgKyBzaXplb2Yoc2l6ZSkpCisJCQlnb3RvIGhlYWRlcjsKKworCQl0eXBlID0gZ2V0X3VuYWxpZ25lZF9sZTMyKHApOworCQlwICs9IHNpemVvZih0eXBlKTsKKworCQlpZCA9IGdldF91bmFsaWduZWRfbGU2NChwKTsKKwkJcCArPSBzaXplb2YoaWQpOworCisJCWlmICh0eXBlICYgSEFTX0lGKSB7CisJCQlpbnRfZnJlcSA9IGdldF91bmFsaWduZWRfbGUxNihwKTsKKwkJCXAgKz0gc2l6ZW9mKGludF9mcmVxKTsKKwkJCWlmIChlbmRwIC0gcCA8IHNpemVvZihzaXplKSkKKwkJCQlnb3RvIGhlYWRlcjsKKwkJfQorCisJCXNpemUgPSBnZXRfdW5hbGlnbmVkX2xlMzIocCk7CisJCXAgKz0gc2l6ZW9mKHNpemUpOworCisJCWlmICghc2l6ZSB8fCBzaXplID4gZW5kcCAtIHApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiRmlybXdhcmUgdHlwZSAoJXgpLCBpZCAlbGx4IGlzIGNvcnJ1cHRlZCAoc2l6ZT0lZCwgZXhwZWN0ZWQgJWQpXG4iLAorCQkJICAgICAgIHR5cGUsICh1bnNpZ25lZCBsb25nIGxvbmcpaWQsCisJCQkgICAgICAgKHVuc2lnbmVkKShlbmRwIC0gcCksIHNpemUpOworCQkJZ290byBjb3JydXB0OworCQl9CisKKwkJcHJpdi0+ZmlybVtuXS5wdHIgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCQlpZiAocHJpdi0+ZmlybVtuXS5wdHIgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJOb3QgZW5vdWdoIG1lbW9yeSB0byBsb2FkIGZpcm13YXJlIGZpbGUuXG4iKTsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCWlmIChkZWJ1ZykgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgIlJlYWRpbmcgZmlybXdhcmUgdHlwZSAiKTsKKwkJCWR1bXBfZmlybV90eXBlX2FuZF9pbnRfZnJlcSh0eXBlLCBpbnRfZnJlcSk7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiKCV4KSwgaWQgJWxseCwgc2l6ZT0lZC5cbiIsCisJCQkgICAgICAgdHlwZSwgKHVuc2lnbmVkIGxvbmcgbG9uZylpZCwgc2l6ZSk7CisJCX0KKworCQltZW1jcHkocHJpdi0+ZmlybVtuXS5wdHIsIHAsIHNpemUpOworCQlwcml2LT5maXJtW25dLnR5cGUgPSB0eXBlOworCQlwcml2LT5maXJtW25dLmlkICAgPSBpZDsKKwkJcHJpdi0+ZmlybVtuXS5zaXplID0gc2l6ZTsKKwkJcHJpdi0+ZmlybVtuXS5pbnRfZnJlcSA9IGludF9mcmVxOworCisJCXAgKz0gc2l6ZTsKKwl9CisKKwlpZiAobiArIDEgIT0gcHJpdi0+ZmlybV9zaXplKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRmlybXdhcmUgZmlsZSBpcyBpbmNvbXBsZXRlIVxuIik7CisJCWdvdG8gY29ycnVwdDsKKwl9CisKKwlnb3RvIGRvbmU7CisKK2hlYWRlcjoKKwlwcmludGsoS0VSTl9FUlIgIkZpcm13YXJlIGhlYWRlciBpcyBpbmNvbXBsZXRlIVxuIik7Citjb3JydXB0OgorCXJjID0gLUVJTlZBTDsKKwlwcmludGsoS0VSTl9FUlIgIkVycm9yOiBmaXJtd2FyZSBmaWxlIGlzIGNvcnJ1cHRlZCFcbiIpOworCitkb25lOgorCXJlbGVhc2VfZmlybXdhcmUoZncpOworCWlmIChyYyA9PSAwKQorCQlkcHJpbnRrKDEsICJGaXJtd2FyZSBmaWxlcyBsb2FkZWQuXG4iKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBsb2FkX3Njb2RlKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1bnNpZ25lZCBpbnQgdHlwZSwKKwkJCSB2NGwyX3N0ZF9pZCAqaWQsIF9fdTE2IGludF9mcmVxLCBpbnQgc2NvZGUpCit7CisJc3RydWN0IHhjNDAwMF9wcml2ICpwcml2ID0gZmUtPnR1bmVyX3ByaXY7CisJaW50CQlwb3MsIHJjOworCXVuc2lnbmVkIGNoYXIJKnA7CisJdTgJCXNjb2RlX2J1ZlsxM107CisJdTgJCWluZGlyZWN0X21vZGVbNV07CisKKwlkcHJpbnRrKDEsICIlcyBjYWxsZWQgaW50X2ZyZXE9JWRcbiIsIF9fZnVuY19fLCBpbnRfZnJlcSk7CisKKwlpZiAoIWludF9mcmVxKSB7CisJCXBvcyA9IHNlZWtfZmlybXdhcmUoZmUsIHR5cGUsIGlkKTsKKwkJaWYgKHBvcyA8IDApCisJCQlyZXR1cm4gcG9zOworCX0gZWxzZSB7CisJCWZvciAocG9zID0gMDsgcG9zIDwgcHJpdi0+ZmlybV9zaXplOyBwb3MrKykgeworCQkJaWYgKChwcml2LT5maXJtW3Bvc10uaW50X2ZyZXEgPT0gaW50X2ZyZXEpICYmCisJCQkgICAgKHByaXYtPmZpcm1bcG9zXS50eXBlICYgSEFTX0lGKSkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAocG9zID09IHByaXYtPmZpcm1fc2l6ZSkKKwkJCXJldHVybiAtRU5PRU5UOworCX0KKworCXAgPSBwcml2LT5maXJtW3Bvc10ucHRyOworCisJaWYgKHByaXYtPmZpcm1bcG9zXS5zaXplICE9IDEyICogMTYgfHwgc2NvZGUgPj0gMTYpCisJCXJldHVybiAtRUlOVkFMOworCXAgKz0gMTIgKiBzY29kZTsKKworCWlmIChkZWJ1ZykgeworCQl0dW5lcl9pbmZvKCJMb2FkaW5nIFNDT0RFIGZvciB0eXBlPSIpOworCQlkdW1wX2Zpcm1fdHlwZV9hbmRfaW50X2ZyZXEocHJpdi0+ZmlybVtwb3NdLnR5cGUsCisJCQkJCSAgICBwcml2LT5maXJtW3Bvc10uaW50X2ZyZXEpOworCQlwcmludGsoS0VSTl9DT05UICIoJXgpLCBpZCAlMDE2bGx4LlxuIiwgcHJpdi0+ZmlybVtwb3NdLnR5cGUsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSppZCk7CisJfQorCisJc2NvZGVfYnVmWzBdID0gMHgwMDsKKwltZW1jcHkoJnNjb2RlX2J1ZlsxXSwgcCwgMTIpOworCisJLyogRW50ZXIgZGlyZWN0LW1vZGUgKi8KKwlyYyA9IHhjX3dyaXRlX3JlZyhwcml2LCBYUkVHX0RJUkVDVFNJVFRJTkdfTU9ERSwgMCk7CisJaWYgKHJjIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBwdXQgZGV2aWNlIGludG8gZGlyZWN0IG1vZGUhXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmMgPSB4Y19zZW5kX2kyY19kYXRhKHByaXYsIHNjb2RlX2J1ZiwgMTMpOworCWlmIChyYyAhPSAwKSB7CisJCS8qIEV2ZW4gaWYgdGhlIHNlbmQgZmFpbGVkLCBtYWtlIHN1cmUgd2Ugc2V0IGJhY2sgdG8gaW5kaXJlY3QKKwkJICAgbW9kZSAqLworCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBzZXQgc2NvZGUgJWRcbiIsIHJjKTsKKwl9CisKKwkvKiBTd2l0Y2ggYmFjayB0byBpbmRpcmVjdC1tb2RlICovCisJbWVtc2V0KGluZGlyZWN0X21vZGUsIDAsIHNpemVvZihpbmRpcmVjdF9tb2RlKSk7CisJaW5kaXJlY3RfbW9kZVs0XSA9IDB4ODg7CisJeGNfc2VuZF9pMmNfZGF0YShwcml2LCBpbmRpcmVjdF9tb2RlLCBzaXplb2YoaW5kaXJlY3RfbW9kZSkpOworCW1zbGVlcCgxMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGVja19maXJtd2FyZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdW5zaWduZWQgaW50IHR5cGUsCisJCQkgIHY0bDJfc3RkX2lkIHN0ZCwgX191MTYgaW50X2ZyZXEpCit7CisJc3RydWN0IHhjNDAwMF9wcml2ICAgICAgICAgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKKwlzdHJ1Y3QgZmlybXdhcmVfcHJvcGVydGllcyBuZXdfZnc7CisJaW50CQkJICAgcmMgPSAwLCBpc19yZXRyeSA9IDA7CisJdTE2CQkJICAgaHdtb2RlbDsKKwl2NGwyX3N0ZF9pZAkJICAgc3RkMDsKKwl1OAkJCSAgIGh3X21ham9yLCBod19taW5vciwgZndfbWFqb3IsIGZ3X21pbm9yOworCisJZHByaW50aygxLCAiJXMgY2FsbGVkXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoIXByaXYtPmZpcm0pIHsKKwkJcmMgPSB4YzQwMDBfZnd1cGxvYWQoZmUpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCX0KKworcmV0cnk6CisJbmV3X2Z3LnR5cGUgPSB0eXBlOworCW5ld19mdy5pZCA9IHN0ZDsKKwluZXdfZncuc3RkX3JlcSA9IHN0ZDsKKwluZXdfZncuc2NvZGVfdGFibGUgPSBTQ09ERTsKKwluZXdfZncuc2NvZGVfbnIgPSAwOworCW5ld19mdy5pbnRfZnJlcSA9IGludF9mcmVxOworCisJZHByaW50aygxLCAiY2hlY2tpbmcgZmlybXdhcmUsIHVzZXIgcmVxdWVzdGVkIHR5cGU9Iik7CisJaWYgKGRlYnVnKSB7CisJCWR1bXBfZmlybV90eXBlKG5ld19mdy50eXBlKTsKKwkJcHJpbnRrKEtFUk5fQ09OVCAiKCV4KSwgaWQgJTAxNmxseCwgIiwgbmV3X2Z3LnR5cGUsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW5ld19mdy5zdGRfcmVxKTsKKwkJaWYgKCFpbnRfZnJlcSkKKwkJCXByaW50ayhLRVJOX0NPTlQgInNjb2RlX3RibCAiKTsKKwkJZWxzZQorCQkJcHJpbnRrKEtFUk5fQ09OVCAiaW50X2ZyZXEgJWQsICIsIG5ld19mdy5pbnRfZnJlcSk7CisJCXByaW50ayhLRVJOX0NPTlQgInNjb2RlX25yICVkXG4iLCBuZXdfZncuc2NvZGVfbnIpOworCX0KKworCS8qIE5vIG5lZWQgdG8gcmVsb2FkIGJhc2UgZmlybXdhcmUgaWYgaXQgbWF0Y2hlcyAqLworCWlmIChwcml2LT5jdXJfZncudHlwZSAmIEJBU0UpIHsKKwkJZHByaW50aygxLCAiQkFTRSBmaXJtd2FyZSBub3QgY2hhbmdlZC5cbiIpOworCQlnb3RvIHNraXBfYmFzZTsKKwl9CisKKwkvKiBVcGRhdGluZyBCQVNFIC0gZm9yZ2V0IGFib3V0IGFsbCBjdXJyZW50bHkgbG9hZGVkIGZpcm13YXJlICovCisJbWVtc2V0KCZwcml2LT5jdXJfZncsIDAsIHNpemVvZihwcml2LT5jdXJfZncpKTsKKworCS8qIFJlc2V0IGlzIG5lZWRlZCBiZWZvcmUgbG9hZGluZyBmaXJtd2FyZSAqLworCXJjID0geGM0MDAwX3R1bmVyX3Jlc2V0KGZlKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGZhaWw7CisKKwkvKiBCQVNFIGZpcm13YXJlcyBhcmUgYWxsIHN0ZDAgKi8KKwlzdGQwID0gMDsKKwlyYyA9IGxvYWRfZmlybXdhcmUoZmUsIEJBU0UsICZzdGQwKTsKKwlpZiAocmMgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRXJyb3IgJWQgd2hpbGUgbG9hZGluZyBiYXNlIGZpcm13YXJlXG4iLCByYyk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKiBMb2FkIElOSVQxLCBpZiBuZWVkZWQgKi8KKwlkcHJpbnRrKDEsICJMb2FkIGluaXQxIGZpcm13YXJlLCBpZiBleGlzdHNcbiIpOworCisJcmMgPSBsb2FkX2Zpcm13YXJlKGZlLCBCQVNFIHwgSU5JVDEsICZzdGQwKTsKKwlpZiAocmMgPT0gLUVOT0VOVCkKKwkJcmMgPSBsb2FkX2Zpcm13YXJlKGZlLCBCQVNFIHwgSU5JVDEsICZzdGQwKTsKKwlpZiAocmMgPCAwICYmIHJjICE9IC1FTk9FTlQpIHsKKwkJdHVuZXJfZXJyKCJFcnJvciAlZCB3aGlsZSBsb2FkaW5nIGluaXQxIGZpcm13YXJlXG4iLAorCQkJICByYyk7CisJCWdvdG8gZmFpbDsKKwl9CisKK3NraXBfYmFzZToKKwkvKgorCSAqIE5vIG5lZWQgdG8gcmVsb2FkIHN0YW5kYXJkIHNwZWNpZmljIGZpcm13YXJlIGlmIGJhc2UgZmlybXdhcmUKKwkgKiB3YXMgbm90IHJlbG9hZGVkIGFuZCByZXF1ZXN0ZWQgdmlkZW8gc3RhbmRhcmRzIGhhdmUgbm90IGNoYW5nZWQuCisJICovCisJaWYgKHByaXYtPmN1cl9mdy50eXBlID09IChCQVNFIHwgbmV3X2Z3LnR5cGUpICYmCisJICAgIHByaXYtPmN1cl9mdy5zdGRfcmVxID09IHN0ZCkgeworCQlkcHJpbnRrKDEsICJTdGQtc3BlY2lmaWMgZmlybXdhcmUgYWxyZWFkeSBsb2FkZWQuXG4iKTsKKwkJZ290byBza2lwX3N0ZF9zcGVjaWZpYzsKKwl9CisKKwkvKiBSZWxvYWRpbmcgc3RkLXNwZWNpZmljIGZpcm13YXJlIGZvcmNlcyBhIFNDT0RFIHVwZGF0ZSAqLworCXByaXYtPmN1cl9mdy5zY29kZV90YWJsZSA9IDA7CisKKwkvKiBMb2FkIHRoZSBzdGFuZGFyZCBmaXJtd2FyZSAqLworCXJjID0gbG9hZF9maXJtd2FyZShmZSwgbmV3X2Z3LnR5cGUsICZuZXdfZncuaWQpOworCisJaWYgKHJjIDwgMCkKKwkJZ290byBmYWlsOworCitza2lwX3N0ZF9zcGVjaWZpYzoKKwlpZiAocHJpdi0+Y3VyX2Z3LnNjb2RlX3RhYmxlID09IG5ld19mdy5zY29kZV90YWJsZSAmJgorCSAgICBwcml2LT5jdXJfZncuc2NvZGVfbnIgPT0gbmV3X2Z3LnNjb2RlX25yKSB7CisJCWRwcmludGsoMSwgIlNDT0RFIGZpcm13YXJlIGFscmVhZHkgbG9hZGVkLlxuIik7CisJCWdvdG8gY2hlY2tfZGV2aWNlOworCX0KKworCS8qIExvYWQgU0NPREUgZmlybXdhcmUsIGlmIGV4aXN0cyAqLworCXJjID0gbG9hZF9zY29kZShmZSwgbmV3X2Z3LnR5cGUgfCBuZXdfZncuc2NvZGVfdGFibGUsICZuZXdfZncuaWQsCisJCQluZXdfZncuaW50X2ZyZXEsIG5ld19mdy5zY29kZV9ucik7CisJaWYgKHJjICE9IDApCisJCWRwcmludGsoMSwgImxvYWQgc2NvZGUgZmFpbGVkICVkXG4iLCByYyk7CisKK2NoZWNrX2RldmljZToKKwlyYyA9IHhjNDAwMF9yZWFkcmVnKHByaXYsIFhSRUdfUFJPRFVDVF9JRCwgJmh3bW9kZWwpOworCisJaWYgKHhjX2dldF92ZXJzaW9uKHByaXYsICZod19tYWpvciwgJmh3X21pbm9yLCAmZndfbWFqb3IsCisJCQkgICAmZndfbWlub3IpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gcmVhZCB0dW5lciByZWdpc3RlcnMuXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCWRwcmludGsoMSwgIkRldmljZSBpcyBYY2VpdmUgJWQgdmVyc2lvbiAlZC4lZCwgIgorCQkiZmlybXdhcmUgdmVyc2lvbiAlZC4lZFxuIiwKKwkJaHdtb2RlbCwgaHdfbWFqb3IsIGh3X21pbm9yLCBmd19tYWpvciwgZndfbWlub3IpOworCisJLyogQ2hlY2sgZmlybXdhcmUgdmVyc2lvbiBhZ2FpbnN0IHdoYXQgd2UgZG93bmxvYWRlZC4gKi8KKwlpZiAocHJpdi0+ZmlybV92ZXJzaW9uICE9ICgoZndfbWFqb3IgPDwgOCkgfCBmd19taW5vcikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIkluY29ycmVjdCByZWFkYmFjayBvZiBmaXJtd2FyZSB2ZXJzaW9uICVkLiVkLlxuIiwKKwkJICAgICAgIGZ3X21ham9yLCBmd19taW5vcik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKiBDaGVjayB0aGF0IHRoZSB0dW5lciBoYXJkd2FyZSBtb2RlbCByZW1haW5zIGNvbnNpc3RlbnQgb3ZlciB0aW1lLiAqLworCWlmIChwcml2LT5od21vZGVsID09IDAgJiYKKwkgICAgKGh3bW9kZWwgPT0gWENfUFJPRFVDVF9JRF9YQzQwMDAgfHwKKwkgICAgIGh3bW9kZWwgPT0gWENfUFJPRFVDVF9JRF9YQzQxMDApKSB7CisJCXByaXYtPmh3bW9kZWwgPSBod21vZGVsOworCQlwcml2LT5od3ZlcnMgPSAoaHdfbWFqb3IgPDwgOCkgfCBod19taW5vcjsKKwl9IGVsc2UgaWYgKHByaXYtPmh3bW9kZWwgPT0gMCB8fCBwcml2LT5od21vZGVsICE9IGh3bW9kZWwgfHwKKwkJICAgcHJpdi0+aHd2ZXJzICE9ICgoaHdfbWFqb3IgPDwgOCkgfCBod19taW5vcikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIlJlYWQgaW52YWxpZCBkZXZpY2UgaGFyZHdhcmUgaW5mb3JtYXRpb24gLSB0dW5lciAiCisJCSAgICAgICAiaHVuZz9cbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJbWVtY3B5KCZwcml2LT5jdXJfZncsICZuZXdfZncsIHNpemVvZihwcml2LT5jdXJfZncpKTsKKworCS8qCisJICogQnkgc2V0dGluZyBCQVNFIGluIGN1cl9mdy50eXBlIG9ubHkgYWZ0ZXIgc3VjY2Vzc2Z1bGx5IGxvYWRpbmcgYWxsCisJICogZmlybXdhcmVzLCB3ZSBjYW46CisJICogMS4gSWRlbnRpZnkgdGhhdCBCQVNFIGZpcm13YXJlIHdpdGggdHlwZT0wIGhhcyBiZWVuIGxvYWRlZDsKKwkgKiAyLiBUZWxsIHdoZXRoZXIgQkFTRSBmaXJtd2FyZSB3YXMganVzdCBjaGFuZ2VkIHRoZSBuZXh0IHRpbWUgdGhyb3VnaC4KKwkgKi8KKwlwcml2LT5jdXJfZncudHlwZSB8PSBCQVNFOworCisJcmV0dXJuIDA7CisKK2ZhaWw6CisJbWVtc2V0KCZwcml2LT5jdXJfZncsIDAsIHNpemVvZihwcml2LT5jdXJfZncpKTsKKwlpZiAoIWlzX3JldHJ5KSB7CisJCW1zbGVlcCg1MCk7CisJCWlzX3JldHJ5ID0gMTsKKwkJZHByaW50aygxLCAiUmV0cnlpbmcgZmlybXdhcmUgbG9hZFxuIik7CisJCWdvdG8gcmV0cnk7CisJfQorCisJaWYgKHJjID09IC1FTk9FTlQpCisJCXJjID0gLUVJTlZBTDsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIHhjX2RlYnVnX2R1bXAoc3RydWN0IHhjNDAwMF9wcml2ICpwcml2KQoreworCXUxNglhZGNfZW52ZWxvcGU7CisJdTMyCWZyZXFfZXJyb3JfaHogPSAwOworCXUxNglsb2NrX3N0YXR1czsKKwl1MzIJaHN5bmNfZnJlcV9oeiA9IDA7CisJdTE2CWZyYW1lX2xpbmVzOworCXUxNglxdWFsaXR5OworCXU4CWh3X21ham9ydmVyc2lvbiA9IDAsIGh3X21pbm9ydmVyc2lvbiA9IDA7CisJdTgJZndfbWFqb3J2ZXJzaW9uID0gMCwgZndfbWlub3J2ZXJzaW9uID0gMDsKKworCXhjX2dldF9hZGNfZW52ZWxvcGUocHJpdiwgJmFkY19lbnZlbG9wZSk7CisJZHByaW50aygxLCAiKioqIEFEQyBlbnZlbG9wZSAoMC0xMDIzKSA9ICVkXG4iLCBhZGNfZW52ZWxvcGUpOworCisJeGNfZ2V0X2ZyZXF1ZW5jeV9lcnJvcihwcml2LCAmZnJlcV9lcnJvcl9oeik7CisJZHByaW50aygxLCAiKioqIEZyZXF1ZW5jeSBlcnJvciA9ICVkIEh6XG4iLCBmcmVxX2Vycm9yX2h6KTsKKworCXhjX2dldF9sb2NrX3N0YXR1cyhwcml2LCAmbG9ja19zdGF0dXMpOworCWRwcmludGsoMSwgIioqKiBMb2NrIHN0YXR1cyAoMC1XYWl0LCAxLUxvY2tlZCwgMi1Oby1zaWduYWwpID0gJWRcbiIsCisJCWxvY2tfc3RhdHVzKTsKKworCXhjX2dldF92ZXJzaW9uKHByaXYsICZod19tYWpvcnZlcnNpb24sICZod19taW5vcnZlcnNpb24sCisJCSAgICAgICAmZndfbWFqb3J2ZXJzaW9uLCAmZndfbWlub3J2ZXJzaW9uKTsKKwlkcHJpbnRrKDEsICIqKiogSFc6IFYlMDJ4LiUwMngsIEZXOiBWJTAyeC4lMDJ4XG4iLAorCQlod19tYWpvcnZlcnNpb24sIGh3X21pbm9ydmVyc2lvbiwKKwkJZndfbWFqb3J2ZXJzaW9uLCBmd19taW5vcnZlcnNpb24pOworCisJaWYgKHByaXYtPnZpZGVvX3N0YW5kYXJkIDwgWEM0MDAwX0RUVjYpIHsKKwkJeGNfZ2V0X2hzeW5jX2ZyZXEocHJpdiwgJmhzeW5jX2ZyZXFfaHopOworCQlkcHJpbnRrKDEsICIqKiogSG9yaXpvbnRhbCBzeW5jIGZyZXF1ZW5jeSA9ICVkIEh6XG4iLAorCQkJaHN5bmNfZnJlcV9oeik7CisKKwkJeGNfZ2V0X2ZyYW1lX2xpbmVzKHByaXYsICZmcmFtZV9saW5lcyk7CisJCWRwcmludGsoMSwgIioqKiBGcmFtZSBsaW5lcyA9ICVkXG4iLCBmcmFtZV9saW5lcyk7CisJfQorCisJeGNfZ2V0X3F1YWxpdHkocHJpdiwgJnF1YWxpdHkpOworCWRwcmludGsoMSwgIioqKiBRdWFsaXR5ICgwOjw4ZEIsIDc6PjU2ZEIpID0gJWRcbiIsIHF1YWxpdHkpOworfQorCitzdGF0aWMgaW50IHhjNDAwMF9zZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCXN0cnVjdCBkdmJfZnJvbnRlbmRfcGFyYW1ldGVycyAqcGFyYW1zKQoreworCXN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdiA9IGZlLT50dW5lcl9wcml2OworCXVuc2lnbmVkIGludCB0eXBlOworCWludAlyZXQgPSAtRVJFTU9URUlPOworCisJZHByaW50aygxLCAiJXMoKSBmcmVxdWVuY3k9JWQgKEh6KVxuIiwgX19mdW5jX18sIHBhcmFtcy0+ZnJlcXVlbmN5KTsKKworCW11dGV4X2xvY2soJnByaXYtPmxvY2spOworCisJaWYgKGZlLT5vcHMuaW5mby50eXBlID09IEZFX0FUU0MpIHsKKwkJZHByaW50aygxLCAiJXMoKSBBVFNDXG4iLCBfX2Z1bmNfXyk7CisJCXN3aXRjaCAocGFyYW1zLT51LnZzYi5tb2R1bGF0aW9uKSB7CisJCWNhc2UgVlNCXzg6CisJCWNhc2UgVlNCXzE2OgorCQkJZHByaW50aygxLCAiJXMoKSBWU0IgbW9kdWxhdGlvblxuIiwgX19mdW5jX18pOworCQkJcHJpdi0+cmZfbW9kZSA9IFhDX1JGX01PREVfQUlSOworCQkJcHJpdi0+ZnJlcV9oeiA9IHBhcmFtcy0+ZnJlcXVlbmN5IC0gMTc1MDAwMDsKKwkJCXByaXYtPmJhbmR3aWR0aCA9IEJBTkRXSURUSF82X01IWjsKKwkJCXByaXYtPnZpZGVvX3N0YW5kYXJkID0gWEM0MDAwX0RUVjY7CisJCQl0eXBlID0gRFRWNjsKKwkJCWJyZWFrOworCQljYXNlIFFBTV82NDoKKwkJY2FzZSBRQU1fMjU2OgorCQljYXNlIFFBTV9BVVRPOgorCQkJZHByaW50aygxLCAiJXMoKSBRQU0gbW9kdWxhdGlvblxuIiwgX19mdW5jX18pOworCQkJcHJpdi0+cmZfbW9kZSA9IFhDX1JGX01PREVfQ0FCTEU7CisJCQlwcml2LT5mcmVxX2h6ID0gcGFyYW1zLT5mcmVxdWVuY3kgLSAxNzUwMDAwOworCQkJcHJpdi0+YmFuZHdpZHRoID0gQkFORFdJRFRIXzZfTUhaOworCQkJcHJpdi0+dmlkZW9fc3RhbmRhcmQgPSBYQzQwMDBfRFRWNjsKKwkJCXR5cGUgPSBEVFY2OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBmYWlsOworCQl9CisJfSBlbHNlIGlmIChmZS0+b3BzLmluZm8udHlwZSA9PSBGRV9PRkRNKSB7CisJCWRwcmludGsoMSwgIiVzKCkgT0ZETVxuIiwgX19mdW5jX18pOworCQlzd2l0Y2ggKHBhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aCkgeworCQljYXNlIEJBTkRXSURUSF82X01IWjoKKwkJCXByaXYtPmJhbmR3aWR0aCA9IEJBTkRXSURUSF82X01IWjsKKwkJCXByaXYtPnZpZGVvX3N0YW5kYXJkID0gWEM0MDAwX0RUVjY7CisJCQlwcml2LT5mcmVxX2h6ID0gcGFyYW1zLT5mcmVxdWVuY3kgLSAxNzUwMDAwOworCQkJdHlwZSA9IERUVjY7CisJCQlicmVhazsKKwkJY2FzZSBCQU5EV0lEVEhfN19NSFo6CisJCQlwcml2LT5iYW5kd2lkdGggPSBCQU5EV0lEVEhfN19NSFo7CisJCQlwcml2LT52aWRlb19zdGFuZGFyZCA9IFhDNDAwMF9EVFY3OworCQkJcHJpdi0+ZnJlcV9oeiA9IHBhcmFtcy0+ZnJlcXVlbmN5IC0gMjI1MDAwMDsKKwkJCXR5cGUgPSBEVFY3OworCQkJYnJlYWs7CisJCWNhc2UgQkFORFdJRFRIXzhfTUhaOgorCQkJcHJpdi0+YmFuZHdpZHRoID0gQkFORFdJRFRIXzhfTUhaOworCQkJcHJpdi0+dmlkZW9fc3RhbmRhcmQgPSBYQzQwMDBfRFRWODsKKwkJCXByaXYtPmZyZXFfaHogPSBwYXJhbXMtPmZyZXF1ZW5jeSAtIDI3NTAwMDA7CisJCQl0eXBlID0gRFRWODsKKwkJCWJyZWFrOworCQljYXNlIEJBTkRXSURUSF9BVVRPOgorCQkJaWYgKHBhcmFtcy0+ZnJlcXVlbmN5IDwgNDAwMDAwMDAwKSB7CisJCQkJcHJpdi0+YmFuZHdpZHRoID0gQkFORFdJRFRIXzdfTUhaOworCQkJCXByaXYtPmZyZXFfaHogPSBwYXJhbXMtPmZyZXF1ZW5jeSAtIDIyNTAwMDA7CisJCQl9IGVsc2UgeworCQkJCXByaXYtPmJhbmR3aWR0aCA9IEJBTkRXSURUSF84X01IWjsKKwkJCQlwcml2LT5mcmVxX2h6ID0gcGFyYW1zLT5mcmVxdWVuY3kgLSAyNzUwMDAwOworCQkJfQorCQkJcHJpdi0+dmlkZW9fc3RhbmRhcmQgPSBYQzQwMDBfRFRWN184OworCQkJdHlwZSA9IERUVjc4OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgInhjNDAwMCBiYW5kd2lkdGggbm90IHNldCFcbiIpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlwcml2LT5yZl9tb2RlID0gWENfUkZfTU9ERV9BSVI7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ4YzQwMDAgbW9kdWxhdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWQhXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBmYWlsOworCX0KKworCWRwcmludGsoMSwgIiVzKCkgZnJlcXVlbmN5PSVkIChjb21wZW5zYXRlZClcbiIsCisJCV9fZnVuY19fLCBwcml2LT5mcmVxX2h6KTsKKworCS8qIE1ha2Ugc3VyZSB0aGUgY29ycmVjdCBmaXJtd2FyZSB0eXBlIGlzIGxvYWRlZCAqLworCWlmIChjaGVja19maXJtd2FyZShmZSwgdHlwZSwgMCwgcHJpdi0+aWZfa2h6KSAhPSAwKQorCQlnb3RvIGZhaWw7CisKKwlyZXQgPSB4Y19zZXRfc2lnbmFsX3NvdXJjZShwcml2LCBwcml2LT5yZl9tb2RlKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ4YzQwMDA6IHhjX3NldF9zaWduYWxfc291cmNlKCVkKSBmYWlsZWRcbiIsCisJCSAgICAgICBwcml2LT5yZl9tb2RlKTsKKwkJZ290byBmYWlsOworCX0gZWxzZSB7CisJCXUxNgl2aWRlb19tb2RlLCBhdWRpb19tb2RlOworCQl2aWRlb19tb2RlID0geGM0MDAwX3N0YW5kYXJkW3ByaXYtPnZpZGVvX3N0YW5kYXJkXS52aWRlb19tb2RlOworCQlhdWRpb19tb2RlID0geGM0MDAwX3N0YW5kYXJkW3ByaXYtPnZpZGVvX3N0YW5kYXJkXS5hdWRpb19tb2RlOworCQlpZiAodHlwZSA9PSBEVFY2ICYmIHByaXYtPmZpcm1fdmVyc2lvbiAhPSAweDAxMDIpCisJCQl2aWRlb19tb2RlIHw9IDB4MDAwMTsKKwkJcmV0ID0geGNfc2V0X3R2X3N0YW5kYXJkKHByaXYsIHZpZGVvX21vZGUsIGF1ZGlvX21vZGUpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAieGM0MDAwOiB4Y19zZXRfdHZfc3RhbmRhcmQgZmFpbGVkXG4iKTsKKwkJCS8qIERKSCAtIGRvIG5vdCByZXR1cm4gd2hlbiBpdCBmYWlscy4uLiAqLworCQkJLyogZ290byBmYWlsOyAqLworCQl9CisJfQorCisJaWYgKHhjX3dyaXRlX3JlZyhwcml2LCBYUkVHX0RfQ09ERSwgMCkgPT0gMCkKKwkJcmV0ID0gMDsKKwlpZiAocHJpdi0+ZHZiX2FtcGxpdHVkZSAhPSAwKSB7CisJCWlmICh4Y193cml0ZV9yZWcocHJpdiwgWFJFR19BTVBMSVRVREUsCisJCQkJIChwcml2LT5maXJtX3ZlcnNpb24gIT0gMHgwMTAyIHx8CisJCQkJICBwcml2LT5kdmJfYW1wbGl0dWRlICE9IDEzNCA/CisJCQkJICBwcml2LT5kdmJfYW1wbGl0dWRlIDogMTMyKSkgIT0gMCkKKwkJCXJldCA9IC1FUkVNT1RFSU87CisJfQorCWlmIChwcml2LT5zZXRfc21vb3RoZWRjdmJzICE9IDApIHsKKwkJaWYgKHhjX3dyaXRlX3JlZyhwcml2LCBYUkVHX1NNT09USEVEQ1ZCUywgMSkgIT0gMCkKKwkJCXJldCA9IC1FUkVNT1RFSU87CisJfQorCWlmIChyZXQgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgInhjNDAwMDogc2V0dGluZyByZWdpc3RlcnMgZmFpbGVkXG4iKTsKKwkJLyogZ290byBmYWlsOyAqLworCX0KKworCXhjX3R1bmVfY2hhbm5lbChwcml2LCBwcml2LT5mcmVxX2h6KTsKKworCXJldCA9IDA7CisKK2ZhaWw6CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgeGM0MDAwX3NldF9hbmFsb2dfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCXN0cnVjdCBhbmFsb2dfcGFyYW1ldGVycyAqcGFyYW1zKQoreworCXN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdiA9IGZlLT50dW5lcl9wcml2OworCXVuc2lnbmVkIGludCB0eXBlID0gMDsKKwlpbnQJcmV0ID0gLUVSRU1PVEVJTzsKKworCWlmIChwYXJhbXMtPm1vZGUgPT0gVjRMMl9UVU5FUl9SQURJTykgeworCQlkcHJpbnRrKDEsICIlcygpIGZyZXF1ZW5jeT0lZCAoaW4gdW5pdHMgb2YgNjIuNUh6KVxuIiwKKwkJCV9fZnVuY19fLCBwYXJhbXMtPmZyZXF1ZW5jeSk7CisKKwkJbXV0ZXhfbG9jaygmcHJpdi0+bG9jayk7CisKKwkJcGFyYW1zLT5zdGQgPSAwOworCQlwcml2LT5mcmVxX2h6ID0gcGFyYW1zLT5mcmVxdWVuY3kgKiAxMjVMIC8gMjsKKworCQlpZiAoYXVkaW9fc3RkICYgWEM0MDAwX0FVRElPX1NURF9JTlBVVDEpIHsKKwkJCXByaXYtPnZpZGVvX3N0YW5kYXJkID0gWEM0MDAwX0ZNX1JhZGlvX0lOUFVUMTsKKwkJCXR5cGUgPSBGTSB8IElOUFVUMTsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPnZpZGVvX3N0YW5kYXJkID0gWEM0MDAwX0ZNX1JhZGlvX0lOUFVUMjsKKwkJCXR5cGUgPSBGTSB8IElOUFVUMjsKKwkJfQorCisJCWdvdG8gdHVuZV9jaGFubmVsOworCX0KKworCWRwcmludGsoMSwgIiVzKCkgZnJlcXVlbmN5PSVkIChpbiB1bml0cyBvZiA2Mi41a2h6KVxuIiwKKwkJX19mdW5jX18sIHBhcmFtcy0+ZnJlcXVlbmN5KTsKKworCW11dGV4X2xvY2soJnByaXYtPmxvY2spOworCisJLyogcGFyYW1zLT5mcmVxdWVuY3kgaXMgaW4gdW5pdHMgb2YgNjIuNWtoeiAqLworCXByaXYtPmZyZXFfaHogPSBwYXJhbXMtPmZyZXF1ZW5jeSAqIDYyNTAwOworCisJcGFyYW1zLT5zdGQgJj0gVjRMMl9TVERfQUxMOworCS8qIGlmIHN0ZCBpcyBub3QgZGVmaW5lZCwgY2hvb3NlIG9uZSAqLworCWlmICghcGFyYW1zLT5zdGQpCisJCXBhcmFtcy0+c3RkID0gVjRMMl9TVERfUEFMX0JHOworCisJaWYgKGF1ZGlvX3N0ZCAmIFhDNDAwMF9BVURJT19TVERfTU9OTykKKwkJdHlwZSA9IE1PTk87CisKKwlpZiAocGFyYW1zLT5zdGQgJiBWNEwyX1NURF9NTikgeworCQlwYXJhbXMtPnN0ZCA9IFY0TDJfU1REX01OOworCQlpZiAoYXVkaW9fc3RkICYgWEM0MDAwX0FVRElPX1NURF9NT05PKSB7CisJCQlwcml2LT52aWRlb19zdGFuZGFyZCA9IFhDNDAwMF9NTl9OVFNDX1BBTF9Nb25vOworCQl9IGVsc2UgaWYgKGF1ZGlvX3N0ZCAmIFhDNDAwMF9BVURJT19TVERfQTIpIHsKKwkJCXBhcmFtcy0+c3RkIHw9IFY0TDJfU1REX0EyOworCQkJcHJpdi0+dmlkZW9fc3RhbmRhcmQgPSBYQzQwMDBfTU5fTlRTQ19QQUxfQTI7CisJCX0gZWxzZSB7CisJCQlwYXJhbXMtPnN0ZCB8PSBWNEwyX1NURF9CVFNDOworCQkJcHJpdi0+dmlkZW9fc3RhbmRhcmQgPSBYQzQwMDBfTU5fTlRTQ19QQUxfQlRTQzsKKwkJfQorCQlnb3RvIHR1bmVfY2hhbm5lbDsKKwl9CisKKwlpZiAocGFyYW1zLT5zdGQgJiBWNEwyX1NURF9QQUxfQkcpIHsKKwkJcGFyYW1zLT5zdGQgPSBWNEwyX1NURF9QQUxfQkc7CisJCWlmIChhdWRpb19zdGQgJiBYQzQwMDBfQVVESU9fU1REX01PTk8pIHsKKwkJCXByaXYtPnZpZGVvX3N0YW5kYXJkID0gWEM0MDAwX0JHX1BBTF9NT05POworCQl9IGVsc2UgaWYgKCEoYXVkaW9fc3RkICYgWEM0MDAwX0FVRElPX1NURF9BMikpIHsKKwkJCWlmICghKGF1ZGlvX3N0ZCAmIFhDNDAwMF9BVURJT19TVERfQikpIHsKKwkJCQlwYXJhbXMtPnN0ZCB8PSBWNEwyX1NURF9OSUNBTV9BOworCQkJCXByaXYtPnZpZGVvX3N0YW5kYXJkID0gWEM0MDAwX0JHX1BBTF9OSUNBTTsKKwkJCX0gZWxzZSB7CisJCQkJcGFyYW1zLT5zdGQgfD0gVjRMMl9TVERfTklDQU1fQjsKKwkJCQlwcml2LT52aWRlb19zdGFuZGFyZCA9IFhDNDAwMF9CR19QQUxfTklDQU07CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoIShhdWRpb19zdGQgJiBYQzQwMDBfQVVESU9fU1REX0IpKSB7CisJCQkJcGFyYW1zLT5zdGQgfD0gVjRMMl9TVERfQTJfQTsKKwkJCQlwcml2LT52aWRlb19zdGFuZGFyZCA9IFhDNDAwMF9CR19QQUxfQTI7CisJCQl9IGVsc2UgeworCQkJCXBhcmFtcy0+c3RkIHw9IFY0TDJfU1REX0EyX0I7CisJCQkJcHJpdi0+dmlkZW9fc3RhbmRhcmQgPSBYQzQwMDBfQkdfUEFMX0EyOworCQkJfQorCQl9CisJCWdvdG8gdHVuZV9jaGFubmVsOworCX0KKworCWlmIChwYXJhbXMtPnN0ZCAmIFY0TDJfU1REX1BBTF9JKSB7CisJCS8qIGRlZmF1bHQgdG8gTklDQU0gYXVkaW8gc3RhbmRhcmQgKi8KKwkJcGFyYW1zLT5zdGQgPSBWNEwyX1NURF9QQUxfSSB8IFY0TDJfU1REX05JQ0FNOworCQlpZiAoYXVkaW9fc3RkICYgWEM0MDAwX0FVRElPX1NURF9NT05PKQorCQkJcHJpdi0+dmlkZW9fc3RhbmRhcmQgPSBYQzQwMDBfSV9QQUxfTklDQU1fTU9OTzsKKwkJZWxzZQorCQkJcHJpdi0+dmlkZW9fc3RhbmRhcmQgPSBYQzQwMDBfSV9QQUxfTklDQU07CisJCWdvdG8gdHVuZV9jaGFubmVsOworCX0KKworCWlmIChwYXJhbXMtPnN0ZCAmIFY0TDJfU1REX1BBTF9ESykgeworCQlwYXJhbXMtPnN0ZCA9IFY0TDJfU1REX1BBTF9ESzsKKwkJaWYgKGF1ZGlvX3N0ZCAmIFhDNDAwMF9BVURJT19TVERfTU9OTykgeworCQkJcHJpdi0+dmlkZW9fc3RhbmRhcmQgPSBYQzQwMDBfREtfUEFMX01PTk87CisJCX0gZWxzZSBpZiAoYXVkaW9fc3RkICYgWEM0MDAwX0FVRElPX1NURF9BMikgeworCQkJcGFyYW1zLT5zdGQgfD0gVjRMMl9TVERfQTI7CisJCQlwcml2LT52aWRlb19zdGFuZGFyZCA9IFhDNDAwMF9ES19QQUxfQTI7CisJCX0gZWxzZSB7CisJCQlwYXJhbXMtPnN0ZCB8PSBWNEwyX1NURF9OSUNBTTsKKwkJCXByaXYtPnZpZGVvX3N0YW5kYXJkID0gWEM0MDAwX0RLX1BBTF9OSUNBTTsKKwkJfQorCQlnb3RvIHR1bmVfY2hhbm5lbDsKKwl9CisKKwlpZiAocGFyYW1zLT5zdGQgJiBWNEwyX1NURF9TRUNBTV9ESykgeworCQkvKiBkZWZhdWx0IHRvIEEyIGF1ZGlvIHN0YW5kYXJkICovCisJCXBhcmFtcy0+c3RkID0gVjRMMl9TVERfU0VDQU1fREsgfCBWNEwyX1NURF9BMjsKKwkJaWYgKGF1ZGlvX3N0ZCAmIFhDNDAwMF9BVURJT19TVERfTCkgeworCQkJdHlwZSA9IDA7CisJCQlwcml2LT52aWRlb19zdGFuZGFyZCA9IFhDNDAwMF9ES19TRUNBTV9OSUNBTTsKKwkJfSBlbHNlIGlmIChhdWRpb19zdGQgJiBYQzQwMDBfQVVESU9fU1REX01PTk8pIHsKKwkJCXByaXYtPnZpZGVvX3N0YW5kYXJkID0gWEM0MDAwX0RLX1NFQ0FNX0EyTU9OTzsKKwkJfSBlbHNlIGlmIChhdWRpb19zdGQgJiBYQzQwMDBfQVVESU9fU1REX0szKSB7CisJCQlwYXJhbXMtPnN0ZCB8PSBWNEwyX1NURF9TRUNBTV9LMzsKKwkJCXByaXYtPnZpZGVvX3N0YW5kYXJkID0gWEM0MDAwX0RLX1NFQ0FNX0EyTERLMzsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPnZpZGVvX3N0YW5kYXJkID0gWEM0MDAwX0RLX1NFQ0FNX0EyREsxOworCQl9CisJCWdvdG8gdHVuZV9jaGFubmVsOworCX0KKworCWlmIChwYXJhbXMtPnN0ZCAmIFY0TDJfU1REX1NFQ0FNX0wpIHsKKwkJLyogZGVmYXVsdCB0byBOSUNBTSBhdWRpbyBzdGFuZGFyZCAqLworCQl0eXBlID0gMDsKKwkJcGFyYW1zLT5zdGQgPSBWNEwyX1NURF9TRUNBTV9MIHwgVjRMMl9TVERfTklDQU07CisJCXByaXYtPnZpZGVvX3N0YW5kYXJkID0gWEM0MDAwX0xfU0VDQU1fTklDQU07CisJCWdvdG8gdHVuZV9jaGFubmVsOworCX0KKworCWlmIChwYXJhbXMtPnN0ZCAmIFY0TDJfU1REX1NFQ0FNX0xDKSB7CisJCS8qIGRlZmF1bHQgdG8gTklDQU0gYXVkaW8gc3RhbmRhcmQgKi8KKwkJdHlwZSA9IDA7CisJCXBhcmFtcy0+c3RkID0gVjRMMl9TVERfU0VDQU1fTEMgfCBWNEwyX1NURF9OSUNBTTsKKwkJcHJpdi0+dmlkZW9fc3RhbmRhcmQgPSBYQzQwMDBfTENfU0VDQU1fTklDQU07CisJCWdvdG8gdHVuZV9jaGFubmVsOworCX0KKwordHVuZV9jaGFubmVsOgorCS8qIEZJWE1FOiBpdCBjb3VsZCBiZSBhaXIuICovCisJcHJpdi0+cmZfbW9kZSA9IFhDX1JGX01PREVfQ0FCTEU7CisKKwlpZiAoY2hlY2tfZmlybXdhcmUoZmUsIHR5cGUsIHBhcmFtcy0+c3RkLAorCQkJICAgeGM0MDAwX3N0YW5kYXJkW3ByaXYtPnZpZGVvX3N0YW5kYXJkXS5pbnRfZnJlcSkgIT0gMCkKKwkJZ290byBmYWlsOworCisJcmV0ID0geGNfc2V0X3NpZ25hbF9zb3VyY2UocHJpdiwgcHJpdi0+cmZfbW9kZSk7CisJaWYgKHJldCAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgInhjNDAwMDogeGNfc2V0X3NpZ25hbF9zb3VyY2UoJWQpIGZhaWxlZFxuIiwKKwkJICAgICAgIHByaXYtPnJmX21vZGUpOworCQlnb3RvIGZhaWw7CisJfSBlbHNlIHsKKwkJdTE2CXZpZGVvX21vZGUsIGF1ZGlvX21vZGU7CisJCXZpZGVvX21vZGUgPSB4YzQwMDBfc3RhbmRhcmRbcHJpdi0+dmlkZW9fc3RhbmRhcmRdLnZpZGVvX21vZGU7CisJCWF1ZGlvX21vZGUgPSB4YzQwMDBfc3RhbmRhcmRbcHJpdi0+dmlkZW9fc3RhbmRhcmRdLmF1ZGlvX21vZGU7CisJCWlmIChwcml2LT52aWRlb19zdGFuZGFyZCA8IFhDNDAwMF9CR19QQUxfQTIpIHsKKwkJCWlmICh0eXBlICYgTk9HRCkKKwkJCQl2aWRlb19tb2RlICY9IDB4RkY3RjsKKwkJfSBlbHNlIGlmIChwcml2LT52aWRlb19zdGFuZGFyZCA8IFhDNDAwMF9JX1BBTF9OSUNBTSkgeworCQkJaWYgKHByaXYtPmZpcm1fdmVyc2lvbiA9PSAweDAxMDIpCisJCQkJdmlkZW9fbW9kZSAmPSAweEZFRkY7CisJCQlpZiAoYXVkaW9fc3RkICYgWEM0MDAwX0FVRElPX1NURF9CKQorCQkJCXZpZGVvX21vZGUgfD0gMHgwMDgwOworCQl9CisJCXJldCA9IHhjX3NldF90dl9zdGFuZGFyZChwcml2LCB2aWRlb19tb2RlLCBhdWRpb19tb2RlKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInhjNDAwMDogeGNfc2V0X3R2X3N0YW5kYXJkIGZhaWxlZFxuIik7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisKKwlpZiAoeGNfd3JpdGVfcmVnKHByaXYsIFhSRUdfRF9DT0RFLCAwKSA9PSAwKQorCQlyZXQgPSAwOworCWlmICh4Y193cml0ZV9yZWcocHJpdiwgWFJFR19BTVBMSVRVREUsIDEpICE9IDApCisJCXJldCA9IC1FUkVNT1RFSU87CisJaWYgKHByaXYtPnNldF9zbW9vdGhlZGN2YnMgIT0gMCkgeworCQlpZiAoeGNfd3JpdGVfcmVnKHByaXYsIFhSRUdfU01PT1RIRURDVkJTLCAxKSAhPSAwKQorCQkJcmV0ID0gLUVSRU1PVEVJTzsKKwl9CisJaWYgKHJldCAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAieGM0MDAwOiBzZXR0aW5nIHJlZ2lzdGVycyBmYWlsZWRcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJeGNfdHVuZV9jaGFubmVsKHByaXYsIHByaXYtPmZyZXFfaHopOworCisJcmV0ID0gMDsKKworZmFpbDoKKwltdXRleF91bmxvY2soJnByaXYtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB4YzQwMDBfZ2V0X2ZyZXF1ZW5jeShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICpmcmVxKQoreworCXN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdiA9IGZlLT50dW5lcl9wcml2OworCisJKmZyZXEgPSBwcml2LT5mcmVxX2h6OworCisJaWYgKGRlYnVnKSB7CisJCW11dGV4X2xvY2soJnByaXYtPmxvY2spOworCQlpZiAoKHByaXYtPmN1cl9mdy50eXBlCisJCSAgICAgJiAoQkFTRSB8IEZNIHwgRFRWNiB8IERUVjcgfCBEVFY3OCB8IERUVjgpKSA9PSBCQVNFKSB7CisJCQl1MTYJc25yID0gMDsKKwkJCWlmICh4YzQwMDBfcmVhZHJlZyhwcml2LCBYUkVHX1NOUiwgJnNucikgPT0gMCkgeworCQkJCW11dGV4X3VubG9jaygmcHJpdi0+bG9jayk7CisJCQkJZHByaW50aygxLCAiJXMoKSBmcmVxID0gJXUsIFNOUiA9ICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgKmZyZXEsIHNucik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZwcml2LT5sb2NrKTsKKwl9CisKKwlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4YzQwMDBfZ2V0X2JhbmR3aWR0aChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICpidykKK3sKKwlzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKKwlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwkqYncgPSBwcml2LT5iYW5kd2lkdGg7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGM0MDAwX2dldF9zdGF0dXMoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIHUzMiAqc3RhdHVzKQoreworCXN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdiA9IGZlLT50dW5lcl9wcml2OworCXUxNglsb2NrX3N0YXR1cyA9IDA7CisKKwltdXRleF9sb2NrKCZwcml2LT5sb2NrKTsKKworCWlmIChwcml2LT5jdXJfZncudHlwZSAmIEJBU0UpCisJCXhjX2dldF9sb2NrX3N0YXR1cyhwcml2LCAmbG9ja19zdGF0dXMpOworCisJKnN0YXR1cyA9IChsb2NrX3N0YXR1cyA9PSAxID8KKwkJICAgVFVORVJfU1RBVFVTX0xPQ0tFRCB8IFRVTkVSX1NUQVRVU19TVEVSRU8gOiAwKTsKKwlpZiAocHJpdi0+Y3VyX2Z3LnR5cGUgJiAoRFRWNiB8IERUVjcgfCBEVFY3OCB8IERUVjgpKQorCQkqc3RhdHVzICY9ICh+VFVORVJfU1RBVFVTX1NURVJFTyk7CisKKwltdXRleF91bmxvY2soJnByaXYtPmxvY2spOworCisJZHByaW50aygyLCAiJXMoKSBsb2NrX3N0YXR1cyA9ICVkXG4iLCBfX2Z1bmNfXywgbG9ja19zdGF0dXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGM0MDAwX3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCB4YzQwMDBfcHJpdiAqcHJpdiA9IGZlLT50dW5lcl9wcml2OworCWludAlyZXQgPSAwOworCisJZHByaW50aygxLCAiJXMoKVxuIiwgX19mdW5jX18pOworCisJbXV0ZXhfbG9jaygmcHJpdi0+bG9jayk7CisKKwkvKiBBdm9pZCBmaXJtd2FyZSByZWxvYWQgb24gc2xvdyBkZXZpY2VzICovCisJaWYgKChub19wb3dlcm9mZiA9PSAyIHx8CisJICAgICAobm9fcG93ZXJvZmYgPT0gMCAmJiBwcml2LT5kZWZhdWx0X3BtICE9IDApKSAmJgorCSAgICAocHJpdi0+Y3VyX2Z3LnR5cGUgJiBCQVNFKSAhPSAwKSB7CisJCS8qIGZvcmNlIHJlc2V0IGFuZCBmaXJtd2FyZSByZWxvYWQgKi8KKwkJcHJpdi0+Y3VyX2Z3LnR5cGUgPSBYQ19QT1dFUkVEX0RPV047CisKKwkJaWYgKHhjX3dyaXRlX3JlZyhwcml2LCBYUkVHX1BPV0VSX0RPV04sIDApICE9IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICJ4YzQwMDA6ICVzKCkgdW5hYmxlIHRvIHNodXRkb3duIHR1bmVyXG4iLAorCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCXJldCA9IC1FUkVNT1RFSU87CisJCX0KKwkJbXNsZWVwKDIwKTsKKwl9CisKKwltdXRleF91bmxvY2soJnByaXYtPmxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB4YzQwMDBfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlkcHJpbnRrKDEsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4YzQwMDBfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgeGM0MDAwX3ByaXYgKnByaXYgPSBmZS0+dHVuZXJfcHJpdjsKKworCWRwcmludGsoMSwgIiVzKClcbiIsIF9fZnVuY19fKTsKKworCW11dGV4X2xvY2soJnhjNDAwMF9saXN0X211dGV4KTsKKworCWlmIChwcml2KQorCQloeWJyaWRfdHVuZXJfcmVsZWFzZV9zdGF0ZShwcml2KTsKKworCW11dGV4X3VubG9jaygmeGM0MDAwX2xpc3RfbXV0ZXgpOworCisJZmUtPnR1bmVyX3ByaXYgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHZiX3R1bmVyX29wcyB4YzQwMDBfdHVuZXJfb3BzID0geworCS5pbmZvID0geworCQkubmFtZSAgICAgICAgICAgPSAiWGNlaXZlIFhDNDAwMCIsCisJCS5mcmVxdWVuY3lfbWluICA9ICAgIDEwMDAwMDAsCisJCS5mcmVxdWVuY3lfbWF4ICA9IDEwMjMwMDAwMDAsCisJCS5mcmVxdWVuY3lfc3RlcCA9ICAgICAgNTAwMDAsCisJfSwKKworCS5yZWxlYXNlCSAgID0geGM0MDAwX3JlbGVhc2UsCisJLmluaXQJCSAgID0geGM0MDAwX2luaXQsCisJLnNsZWVwCQkgICA9IHhjNDAwMF9zbGVlcCwKKworCS5zZXRfcGFyYW1zCSAgID0geGM0MDAwX3NldF9wYXJhbXMsCisJLnNldF9hbmFsb2dfcGFyYW1zID0geGM0MDAwX3NldF9hbmFsb2dfcGFyYW1zLAorCS5nZXRfZnJlcXVlbmN5CSAgID0geGM0MDAwX2dldF9mcmVxdWVuY3ksCisJLmdldF9iYW5kd2lkdGgJICAgPSB4YzQwMDBfZ2V0X2JhbmR3aWR0aCwKKwkuZ2V0X3N0YXR1cwkgICA9IHhjNDAwMF9nZXRfc3RhdHVzCit9OworCitzdHJ1Y3QgZHZiX2Zyb250ZW5kICp4YzQwMDBfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCSAgIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLAorCQkJCSAgIHN0cnVjdCB4YzQwMDBfY29uZmlnICpjZmcpCit7CisJc3RydWN0IHhjNDAwMF9wcml2ICpwcml2ID0gTlVMTDsKKwlpbnQJaW5zdGFuY2U7CisJdTE2CWlkID0gMDsKKworCWRwcmludGsoMSwgIiVzKCVkLSUwNHgpXG4iLCBfX2Z1bmNfXywKKwkJaTJjID8gaTJjX2FkYXB0ZXJfaWQoaTJjKSA6IC0xLAorCQljZmcgPyBjZmctPmkyY19hZGRyZXNzIDogLTEpOworCisJbXV0ZXhfbG9jaygmeGM0MDAwX2xpc3RfbXV0ZXgpOworCisJaW5zdGFuY2UgPSBoeWJyaWRfdHVuZXJfcmVxdWVzdF9zdGF0ZShzdHJ1Y3QgeGM0MDAwX3ByaXYsIHByaXYsCisJCQkJCSAgICAgIGh5YnJpZF90dW5lcl9pbnN0YW5jZV9saXN0LAorCQkJCQkgICAgICBpMmMsIGNmZy0+aTJjX2FkZHJlc3MsICJ4YzQwMDAiKTsKKwlzd2l0Y2ggKGluc3RhbmNlKSB7CisJY2FzZSAwOgorCQlnb3RvIGZhaWw7CisJCWJyZWFrOworCWNhc2UgMToKKwkJLyogbmV3IHR1bmVyIGluc3RhbmNlICovCisJCXByaXYtPmJhbmR3aWR0aCA9IEJBTkRXSURUSF82X01IWjsKKwkJLyogc2V0IGRlZmF1bHQgY29uZmlndXJhdGlvbiAqLworCQlwcml2LT5pZl9raHogPSA0NTYwOworCQlwcml2LT5kZWZhdWx0X3BtID0gMDsKKwkJcHJpdi0+ZHZiX2FtcGxpdHVkZSA9IDEzNDsKKwkJcHJpdi0+c2V0X3Ntb290aGVkY3ZicyA9IDE7CisJCW11dGV4X2luaXQoJnByaXYtPmxvY2spOworCQlmZS0+dHVuZXJfcHJpdiA9IHByaXY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIGV4aXN0aW5nIHR1bmVyIGluc3RhbmNlICovCisJCWZlLT50dW5lcl9wcml2ID0gcHJpdjsKKwkJYnJlYWs7CisJfQorCisJaWYgKGNmZy0+aWZfa2h6ICE9IDApIHsKKwkJLyogY29weSBjb25maWd1cmF0aW9uIGlmIHByb3ZpZGVkIGJ5IHRoZSBjYWxsZXIgKi8KKwkJcHJpdi0+aWZfa2h6ID0gY2ZnLT5pZl9raHo7CisJCXByaXYtPmRlZmF1bHRfcG0gPSBjZmctPmRlZmF1bHRfcG07CisJCXByaXYtPmR2Yl9hbXBsaXR1ZGUgPSBjZmctPmR2Yl9hbXBsaXR1ZGU7CisJCXByaXYtPnNldF9zbW9vdGhlZGN2YnMgPSBjZmctPnNldF9zbW9vdGhlZGN2YnM7CisJfQorCisJLyogQ2hlY2sgaWYgZmlybXdhcmUgaGFzIGJlZW4gbG9hZGVkLiBJdCBpcyBwb3NzaWJsZSB0aGF0IGFub3RoZXIKKwkgICBpbnN0YW5jZSBvZiB0aGUgZHJpdmVyIGhhcyBsb2FkZWQgdGhlIGZpcm13YXJlLgorCSAqLworCisJaWYgKGluc3RhbmNlID09IDEpIHsKKwkJaWYgKHhjNDAwMF9yZWFkcmVnKHByaXYsIFhSRUdfUFJPRFVDVF9JRCwgJmlkKSAhPSAwKQorCQkJZ290byBmYWlsOworCX0gZWxzZSB7CisJCWlkID0gKChwcml2LT5jdXJfZncudHlwZSAmIEJBU0UpICE9IDAgPworCQkgICAgICBwcml2LT5od21vZGVsIDogWENfUFJPRFVDVF9JRF9GV19OT1RfTE9BREVEKTsKKwl9CisKKwlzd2l0Y2ggKGlkKSB7CisJY2FzZSBYQ19QUk9EVUNUX0lEX1hDNDAwMDoKKwljYXNlIFhDX1BST0RVQ1RfSURfWEM0MTAwOgorCQlwcmludGsoS0VSTl9JTkZPCisJCQkieGM0MDAwOiBTdWNjZXNzZnVsbHkgaWRlbnRpZmllZCBhdCBhZGRyZXNzIDB4JTAyeFxuIiwKKwkJCWNmZy0+aTJjX2FkZHJlc3MpOworCQlwcmludGsoS0VSTl9JTkZPCisJCQkieGM0MDAwOiBGaXJtd2FyZSBoYXMgYmVlbiBsb2FkZWQgcHJldmlvdXNseVxuIik7CisJCWJyZWFrOworCWNhc2UgWENfUFJPRFVDVF9JRF9GV19OT1RfTE9BREVEOgorCQlwcmludGsoS0VSTl9JTkZPCisJCQkieGM0MDAwOiBTdWNjZXNzZnVsbHkgaWRlbnRpZmllZCBhdCBhZGRyZXNzIDB4JTAyeFxuIiwKKwkJCWNmZy0+aTJjX2FkZHJlc3MpOworCQlwcmludGsoS0VSTl9JTkZPCisJCQkieGM0MDAwOiBGaXJtd2FyZSBoYXMgbm90IGJlZW4gbG9hZGVkIHByZXZpb3VzbHlcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIKKwkJCSJ4YzQwMDA6IERldmljZSBub3QgZm91bmQgYXQgYWRkciAweCUwMnggKDB4JXgpXG4iLAorCQkJY2ZnLT5pMmNfYWRkcmVzcywgaWQpOworCQlnb3RvIGZhaWw7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZ4YzQwMDBfbGlzdF9tdXRleCk7CisKKwltZW1jcHkoJmZlLT5vcHMudHVuZXJfb3BzLCAmeGM0MDAwX3R1bmVyX29wcywKKwkJc2l6ZW9mKHN0cnVjdCBkdmJfdHVuZXJfb3BzKSk7CisKKwlpZiAoaW5zdGFuY2UgPT0gMSkgeworCQlpbnQJcmV0OworCQltdXRleF9sb2NrKCZwcml2LT5sb2NrKTsKKwkJcmV0ID0geGM0MDAwX2Z3dXBsb2FkKGZlKTsKKwkJbXV0ZXhfdW5sb2NrKCZwcml2LT5sb2NrKTsKKwkJaWYgKHJldCAhPSAwKQorCQkJZ290byBmYWlsMjsKKwl9CisKKwlyZXR1cm4gZmU7CitmYWlsOgorCW11dGV4X3VubG9jaygmeGM0MDAwX2xpc3RfbXV0ZXgpOworZmFpbDI6CisJeGM0MDAwX3JlbGVhc2UoZmUpOworCXJldHVybiBOVUxMOworfQorRVhQT1JUX1NZTUJPTCh4YzQwMDBfYXR0YWNoKTsKKworTU9EVUxFX0FVVEhPUigiU3RldmVuIFRvdGgsIERhdmlkZSBGZXJyaSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJYY2VpdmUgeGM0MDAwIHNpbGljb24gdHVuZXIgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMveGM0MDAwLmggYi9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMveGM0MDAwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZhNDRkMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy94YzQwMDAuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogIERyaXZlciBmb3IgWGNlaXZlIFhDNDAwMCAiUUFNLzhWU0Igc2luZ2xlIGNoaXAgdHVuZXIiCisgKgorICogIENvcHlyaWdodCAoYykgMjAwNyBTdGV2ZW4gVG90aCA8c3RvdGhAbGludXh0di5vcmc+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBfX1hDNDAwMF9IX18KKyNkZWZpbmUgX19YQzQwMDBfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorCitzdHJ1Y3QgZHZiX2Zyb250ZW5kOworc3RydWN0IGkyY19hZGFwdGVyOworCitzdHJ1Y3QgeGM0MDAwX2NvbmZpZyB7CisJdTgJaTJjX2FkZHJlc3M7CisJLyogaWYgbm9uLXplcm8sIHBvd2VyIG1hbmFnZW1lbnQgaXMgZW5hYmxlZCBieSBkZWZhdWx0ICovCisJdTgJZGVmYXVsdF9wbTsKKwkvKiB2YWx1ZSB0byBiZSB3cml0dGVuIHRvIFhSRUdfQU1QTElUVURFIGluIERWQi1UIG1vZGUgKDA6IG5vIHdyaXRlKSAqLworCXU4CWR2Yl9hbXBsaXR1ZGU7CisJLyogaWYgbm9uLXplcm8sIHJlZ2lzdGVyIDB4MEUgaXMgc2V0IHRvIGZpbHRlciBhbmFsb2cgVFYgdmlkZW8gb3V0cHV0ICovCisJdTgJc2V0X3Ntb290aGVkY3ZiczsKKwkvKiBJRiBmb3IgRFZCLVQgKi8KKwl1MzIJaWZfa2h6OworfTsKKworLyogeGM0MDAwIGNhbGxiYWNrIGNvbW1hbmQgKi8KKyNkZWZpbmUgWEM0MDAwX1RVTkVSX1JFU0VUCQkwCisKKy8qIEZvciBlYWNoIGJyaWRnZSBmcmFtZXdvcmssIHdoZW4gaXQgYXR0YWNoZXMgZWl0aGVyIGFuYWxvZyBvciBkaWdpdGFsLAorICogaXQgaGFzIHRvIHN0b3JlIGEgcmVmZXJlbmNlIGJhY2sgdG8gaXRzIF9jb3JlIGVxdWl2YWxlbnQgc3RydWN0dXJlLAorICogc28gdGhhdCBpdCBjYW4gc2VydmljZSB0aGUgaGFyZHdhcmUgYnkgc3RlZXJpbmcgZ3BpbydzIGV0Yy4KKyAqIEVhY2ggYnJpZGdlIGltcGxlbWVudGF0aW9uIGlzIGRpZmZlcmVudCBzbyBjYXN0IGRldnB0ciBhY2NvcmRpbmdseS4KKyAqIFRoZSB4YzQwMDAgZHJpdmVyIGNhcmVzIG5vdCBmb3IgdGhpcyB2YWx1ZSwgb3RoZXIgdGhhbiBlbnN1cmluZworICogaXQncyBwYXNzZWQgYmFjayB0byBhIGJyaWRnZSBkdXJpbmcgdHVuZXJfY2FsbGJhY2soKS4KKyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfTUVESUFfVFVORVJfWEM0MDAwKSB8fCAoZGVmaW5lZChDT05GSUdfTUVESUFfVFVORVJfWEM0MDAwX01PRFVMRSkgJiYgZGVmaW5lZChNT0RVTEUpKQorZXh0ZXJuIHN0cnVjdCBkdmJfZnJvbnRlbmQgKnhjNDAwMF9hdHRhY2goc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJCSAgc3RydWN0IGkyY19hZGFwdGVyICppMmMsCisJCQkJCSAgc3RydWN0IHhjNDAwMF9jb25maWcgKmNmZyk7CisjZWxzZQorc3RhdGljIGlubGluZSBzdHJ1Y3QgZHZiX2Zyb250ZW5kICp4YzQwMDBfYXR0YWNoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkJCQkJIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLAorCQkJCQkJIHN0cnVjdCB4YzQwMDBfY29uZmlnICpjZmcpCit7CisJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IGRyaXZlciBkaXNhYmxlZCBieSBLY29uZmlnXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvS2NvbmZpZwppbmRleCBlZTIxNGMzLi5mNmU0MGIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL0tjb25maWcKQEAgLTgwLDYgKzgwLDEwIEBACiAJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBQQ0kgJiYgSTJDCiAJc291cmNlICJkcml2ZXJzL21lZGlhL2R2Yi9uZ2VuZS9LY29uZmlnIgogCitjb21tZW50ICJTdXBwb3J0ZWQgZGRicmlkZ2UgKCdPY3RvcHVzJykgQWRhcHRlcnMiCisJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBQQ0kgJiYgSTJDCisJc291cmNlICJkcml2ZXJzL21lZGlhL2R2Yi9kZGJyaWRnZS9LY29uZmlnIgorCiBjb21tZW50ICJTdXBwb3J0ZWQgRFZCIEZyb250ZW5kcyIKIAlkZXBlbmRzIG9uIERWQl9DT1JFCiBzb3VyY2UgImRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL2R2Yi9NYWtlZmlsZQppbmRleCBhMWEwODc1Li5iMmNlZmU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9NYWtlZmlsZQpAQCAtMTUsNiArMTUsNyBAQAogCQlkbTExMDUvCQlcCiAJCXB0MS8JCVwKIAkJbWFudGlzLwkJXAotCQluZ2VuZS8KKwkJbmdlbmUvCQlcCisJCWRkYnJpZGdlLwogCiBvYmotJChDT05GSUdfRFZCX0ZJUkVEVFYpCSs9IGZpcmV3aXJlLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvYnQ4eHgvZHZiLWJ0OHh4LmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguYwppbmRleCAxZTExMDZkLi41MjFkNjkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9idDh4eC9kdmItYnQ4eHguYwpAQCAtODkyLDcgKzg5Miw3IEBACiAJaWYgKCEoYnR0dl9wY2lfZGV2ID0gYnR0dl9nZXRfcGNpZGV2KGNhcmQtPmJ0dHZfbnIpKSkgewogCQlwcmludGsoImR2Yl9idDh4eDogbm8gcGNpIGRldmljZSBmb3IgY2FyZCAlZFxuIiwgY2FyZC0+YnR0dl9ucik7CiAJCWtmcmVlKGNhcmQpOwotCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJaWYgKCEoY2FyZC0+YnQgPSBkdmJfYnQ4eHhfODc4X21hdGNoKGNhcmQtPmJ0dHZfbnIsIGJ0dHZfcGNpX2RldikpKSB7CkBAIC05MDIsNyArOTAyLDcgQEAKIAkJICAgICAgICJpbnN0YWxsZWQsIHRyeSByZW1vdmluZyBpdC5cbiIpOwogCiAJCWtmcmVlKGNhcmQpOwotCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCiAJbXV0ZXhfaW5pdCgmY2FyZC0+YnQtPmdwaW9fbG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kZGJyaWRnZS9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvZGRicmlkZ2UvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDk5ZTFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZGRicmlkZ2UvS2NvbmZpZwpAQCAtMCwwICsxLDE4IEBACitjb25maWcgRFZCX0REQlJJREdFCisJdHJpc3RhdGUgIkRpZ2l0YWwgRGV2aWNlcyBicmlkZ2Ugc3VwcG9ydCIKKwlkZXBlbmRzIG9uIERWQl9DT1JFICYmIFBDSSAmJiBJMkMKKwlzZWxlY3QgRFZCX0xOQlAyMSBpZiAhRFZCX0ZFX0NVU1RPTUlTRQorCXNlbGVjdCBEVkJfU1RWNjExMHggaWYgIURWQl9GRV9DVVNUT01JU0UKKwlzZWxlY3QgRFZCX1NUVjA5MHggaWYgIURWQl9GRV9DVVNUT01JU0UKKwlzZWxlY3QgRFZCX0RSWEsgaWYgIURWQl9GRV9DVVNUT01JU0UKKwlzZWxlY3QgRFZCX1REQTE4MjcxQzJERCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQorCS0tLWhlbHAtLS0KKwkgIFN1cHBvcnQgZm9yIGNhcmRzIHdpdGggdGhlIERpZ2l0YWwgRGV2aWNlcyBQQ0kgZXhwcmVzcyBicmlkZ2U6CisJICAtIE9jdG9wdXMgUENJZSBCcmlkZ2UKKwkgIC0gT2N0b3B1cyBtaW5pIFBDSWUgQnJpZGdlCisJICAtIE9jdG9wdXMgTEUKKwkgIC0gRHVvRmxleCBTMiBPY3RvcHVzCisJICAtIER1b0ZsZXggQ1QgT2N0b3B1cworCSAgLSBjaW5lUzIodjYpCisKKwkgIFNheSBZIGlmIHlvdSBvd24gc3VjaCBhIGNhcmQgYW5kIHdhbnQgdG8gdXNlIGl0LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZGRicmlkZ2UvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL2R2Yi9kZGJyaWRnZS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTRmZTE5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZGRicmlkZ2UvTWFrZWZpbGUKQEAgLTAsMCArMSwxNCBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIGRkYnJpZGdlIGRldmljZSBkcml2ZXIKKyMKKworZGRicmlkZ2Utb2JqcyA6PSBkZGJyaWRnZS1jb3JlLm8KKworb2JqLSQoQ09ORklHX0RWQl9EREJSSURHRSkgKz0gZGRicmlkZ2UubworCitFWFRSQV9DRkxBR1MgKz0gLUlkcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS8KK0VYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy8KK0VYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy8KKworIyBGb3IgdGhlIHN0YWdpbmcgQ0kgZHJpdmVyIGN4ZDIwOTkKK0VYVFJBX0NGTEFHUyArPSAtSWRyaXZlcnMvc3RhZ2luZy9jeGQyMDk5LwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZGRicmlkZ2UvZGRicmlkZ2UtY29yZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZGRicmlkZ2UvZGRicmlkZ2UtY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3M2Q1NDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kZGJyaWRnZS9kZGJyaWRnZS1jb3JlLmMKQEAgLTAsMCArMSwxNzE5IEBACisvKgorICogZGRicmlkZ2UuYzogRGlnaXRhbCBEZXZpY2VzIFBDSWUgYnJpZGdlIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIERpZ2l0YWwgRGV2aWNlcyBHbWJICisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBvbmx5LCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqIE9yLCBwb2ludCB5b3VyIGJyb3dzZXIgdG8gaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2lfaWRzLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvc3dhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlICJkZGJyaWRnZS5oIgorCisjaW5jbHVkZSAiZGRicmlkZ2UtcmVncy5oIgorCisjaW5jbHVkZSAidGRhMTgyNzFjMmRkLmgiCisjaW5jbHVkZSAic3R2NjExMHguaCIKKyNpbmNsdWRlICJzdHYwOTB4LmgiCisjaW5jbHVkZSAibG5iaDI0LmgiCisjaW5jbHVkZSAiZHJ4ay5oIgorCitEVkJfREVGSU5FX01PRF9PUFRfQURBUFRFUl9OUihhZGFwdGVyX25yKTsKKworLyogTVNJIGhhZCBwcm9ibGVtcyB3aXRoIGxvc3QgaW50ZXJydXB0cywgZml4ZWQgYnV0IG5lZWRzIHRlc3RpbmcgKi8KKyN1bmRlZiBDT05GSUdfUENJX01TSQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGkyY19yZWFkKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgdTggYWRyLCB1OCAqdmFsKQoreworCXN0cnVjdCBpMmNfbXNnIG1zZ3NbMV0gPSB7ey5hZGRyID0gYWRyLCAgLmZsYWdzID0gSTJDX01fUkQsCisJCQkJICAgLmJ1ZiAgPSB2YWwsICAubGVuICAgPSAxIH0gfTsKKwlyZXR1cm4gKGkyY190cmFuc2ZlcihhZGFwdGVyLCBtc2dzLCAxKSA9PSAxKSA/IDAgOiAtMTsKK30KKworc3RhdGljIGludCBpMmNfcmVhZF9yZWcoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCB1OCBhZHIsIHU4IHJlZywgdTggKnZhbCkKK3sKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzWzJdID0ge3suYWRkciA9IGFkciwgIC5mbGFncyA9IDAsCisJCQkJICAgLmJ1ZiAgPSAmcmVnLCAubGVuICAgPSAxIH0sCisJCQkJICB7LmFkZHIgPSBhZHIsICAuZmxhZ3MgPSBJMkNfTV9SRCwKKwkJCQkgICAuYnVmICA9IHZhbCwgIC5sZW4gICA9IDEgfSB9OworCXJldHVybiAoaTJjX3RyYW5zZmVyKGFkYXB0ZXIsIG1zZ3MsIDIpID09IDIpID8gMCA6IC0xOworfQorCitzdGF0aWMgaW50IGkyY19yZWFkX3JlZzE2KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgdTggYWRyLAorCQkJICB1MTYgcmVnLCB1OCAqdmFsKQoreworCXU4IG1zZ1syXSA9IHtyZWc+PjgsIHJlZyYweGZmfTsKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzWzJdID0ge3suYWRkciA9IGFkciwgLmZsYWdzID0gMCwKKwkJCQkgICAuYnVmICA9IG1zZywgLmxlbiAgID0gMn0sCisJCQkJICB7LmFkZHIgPSBhZHIsIC5mbGFncyA9IEkyQ19NX1JELAorCQkJCSAgIC5idWYgID0gdmFsLCAubGVuICAgPSAxfSB9OworCXJldHVybiAoaTJjX3RyYW5zZmVyKGFkYXB0ZXIsIG1zZ3MsIDIpID09IDIpID8gMCA6IC0xOworfQorCitzdGF0aWMgaW50IGRkYl9pMmNfY21kKHN0cnVjdCBkZGJfaTJjICppMmMsIHUzMiBhZHIsIHUzMiBjbWQpCit7CisJc3RydWN0IGRkYiAqZGV2ID0gaTJjLT5kZXY7CisJaW50IHN0YXQ7CisJdTMyIHZhbDsKKworCWkyYy0+ZG9uZSA9IDA7CisJZGRid3JpdGVsKChhZHIgPDwgOSkgfCBjbWQsIGkyYy0+cmVncyArIEkyQ19DT01NQU5EKTsKKwlzdGF0ID0gd2FpdF9ldmVudF90aW1lb3V0KGkyYy0+d3EsIGkyYy0+ZG9uZSA9PSAxLCBIWik7CisJaWYgKHN0YXQgPD0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIkkyQyB0aW1lb3V0XG4iKTsKKwkJeyAvKiBNU0kgZGVidWdnaW5nKi8KKwkJCXUzMiBpc3RhdCA9IGRkYnJlYWRsKElOVEVSUlVQVF9TVEFUVVMpOworCQkJcHJpbnRrKEtFUk5fRVJSICJJUlMgJTA4eFxuIiwgaXN0YXQpOworCQkJZGRid3JpdGVsKGlzdGF0LCBJTlRFUlJVUFRfQUNLKTsKKwkJfQorCQlyZXR1cm4gLUVJTzsKKwl9CisJdmFsID0gZGRicmVhZGwoaTJjLT5yZWdzK0kyQ19DT01NQU5EKTsKKwlpZiAodmFsICYgMHg3MDAwMCkKKwkJcmV0dXJuIC1FSU87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGRiX2kyY19tYXN0ZXJfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsCisJCQkgICAgICAgc3RydWN0IGkyY19tc2cgbXNnW10sIGludCBudW0pCit7CisJc3RydWN0IGRkYl9pMmMgKmkyYyA9IChzdHJ1Y3QgZGRiX2kyYyAqKWkyY19nZXRfYWRhcGRhdGEoYWRhcHRlcik7CisJc3RydWN0IGRkYiAqZGV2ID0gaTJjLT5kZXY7CisJdTggYWRkciA9IDA7CisKKwlpZiAobnVtKQorCQlhZGRyID0gbXNnWzBdLmFkZHI7CisKKwlpZiAobnVtID09IDIgJiYgbXNnWzFdLmZsYWdzICYgSTJDX01fUkQgJiYKKwkgICAgIShtc2dbMF0uZmxhZ3MgJiBJMkNfTV9SRCkpIHsKKwkJbWVtY3B5X3RvaW8oZGV2LT5yZWdzICsgSTJDX1RBU0tNRU1fQkFTRSArIGkyYy0+d2J1ZiwKKwkJCSAgICBtc2dbMF0uYnVmLCBtc2dbMF0ubGVuKTsKKwkJZGRid3JpdGVsKG1zZ1swXS5sZW58KG1zZ1sxXS5sZW4gPDwgMTYpLAorCQkJICBpMmMtPnJlZ3MrSTJDX1RBU0tMRU5HVEgpOworCQlpZiAoIWRkYl9pMmNfY21kKGkyYywgYWRkciwgMSkpIHsKKwkJCW1lbWNweV9mcm9taW8obXNnWzFdLmJ1ZiwKKwkJCQkgICAgICBkZXYtPnJlZ3MgKyBJMkNfVEFTS01FTV9CQVNFICsgaTJjLT5yYnVmLAorCQkJCSAgICAgIG1zZ1sxXS5sZW4pOworCQkJcmV0dXJuIG51bTsKKwkJfQorCX0KKworCWlmIChudW0gPT0gMSAmJiAhKG1zZ1swXS5mbGFncyAmIEkyQ19NX1JEKSkgeworCQlkZGJjcHl0byhJMkNfVEFTS01FTV9CQVNFICsgaTJjLT53YnVmLCBtc2dbMF0uYnVmLCBtc2dbMF0ubGVuKTsKKwkJZGRid3JpdGVsKG1zZ1swXS5sZW4sIGkyYy0+cmVncyArIEkyQ19UQVNLTEVOR1RIKTsKKwkJaWYgKCFkZGJfaTJjX2NtZChpMmMsIGFkZHIsIDIpKQorCQkJcmV0dXJuIG51bTsKKwl9CisJaWYgKG51bSA9PSAxICYmIChtc2dbMF0uZmxhZ3MgJiBJMkNfTV9SRCkpIHsKKwkJZGRid3JpdGVsKG1zZ1swXS5sZW4gPDwgMTYsIGkyYy0+cmVncyArIEkyQ19UQVNLTEVOR1RIKTsKKwkJaWYgKCFkZGJfaTJjX2NtZChpMmMsIGFkZHIsIDMpKSB7CisJCQlkZGJjcHlmcm9tKG1zZ1swXS5idWYsCisJCQkJICAgSTJDX1RBU0tNRU1fQkFTRSArIGkyYy0+cmJ1ZiwgbXNnWzBdLmxlbik7CisJCQlyZXR1cm4gbnVtOworCQl9CisJfQorCXJldHVybiAtRUlPOworfQorCisKK3N0YXRpYyB1MzIgZGRiX2kyY19mdW5jdGlvbmFsaXR5KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCkKK3sKKwlyZXR1cm4gSTJDX0ZVTkNfU01CVVNfRU1VTDsKK30KKworc3RydWN0IGkyY19hbGdvcml0aG0gZGRiX2kyY19hbGdvID0geworCS5tYXN0ZXJfeGZlciAgID0gZGRiX2kyY19tYXN0ZXJfeGZlciwKKwkuZnVuY3Rpb25hbGl0eSA9IGRkYl9pMmNfZnVuY3Rpb25hbGl0eSwKK307CisKK3N0YXRpYyB2b2lkIGRkYl9pMmNfcmVsZWFzZShzdHJ1Y3QgZGRiICpkZXYpCit7CisJaW50IGk7CisJc3RydWN0IGRkYl9pMmMgKmkyYzsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXA7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5pbmZvLT5wb3J0X251bTsgaSsrKSB7CisJCWkyYyA9ICZkZXYtPmkyY1tpXTsKKwkJYWRhcCA9ICZpMmMtPmFkYXA7CisJCWkyY19kZWxfYWRhcHRlcihhZGFwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZGRiX2kyY19pbml0KHN0cnVjdCBkZGIgKmRldikKK3sKKwlpbnQgaSwgaiwgc3RhdCA9IDA7CisJc3RydWN0IGRkYl9pMmMgKmkyYzsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXA7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5pbmZvLT5wb3J0X251bTsgaSsrKSB7CisJCWkyYyA9ICZkZXYtPmkyY1tpXTsKKwkJaTJjLT5kZXYgPSBkZXY7CisJCWkyYy0+bnIgPSBpOworCQlpMmMtPndidWYgPSBpICogKEkyQ19UQVNLTUVNX1NJWkUgLyA0KTsKKwkJaTJjLT5yYnVmID0gaTJjLT53YnVmICsgKEkyQ19UQVNLTUVNX1NJWkUgLyA4KTsKKwkJaTJjLT5yZWdzID0gMHg4MCArIGkgKiAweDIwOworCQlkZGJ3cml0ZWwoSTJDX1NQRUVEXzEwMCwgaTJjLT5yZWdzICsgSTJDX1RJTUlORyk7CisJCWRkYndyaXRlbCgoaTJjLT5yYnVmIDw8IDE2KSB8IGkyYy0+d2J1ZiwKKwkJCSAgaTJjLT5yZWdzICsgSTJDX1RBU0tBRERSRVNTKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmaTJjLT53cSk7CisKKwkJYWRhcCA9ICZpMmMtPmFkYXA7CisJCWkyY19zZXRfYWRhcGRhdGEoYWRhcCwgaTJjKTsKKyNpZmRlZiBJMkNfQURBUF9DTEFTU19UVl9ESUdJVEFMCisJCWFkYXAtPmNsYXNzID0gSTJDX0FEQVBfQ0xBU1NfVFZfRElHSVRBTHxJMkNfQ0xBU1NfVFZfQU5BTE9HOworI2Vsc2UKKyNpZmRlZiBJMkNfQ0xBU1NfVFZfQU5BTE9HCisJCWFkYXAtPmNsYXNzID0gSTJDX0NMQVNTX1RWX0FOQUxPRzsKKyNlbmRpZgorI2VuZGlmCisJCXN0cmNweShhZGFwLT5uYW1lLCAiZGRicmlkZ2UiKTsKKwkJYWRhcC0+YWxnbyA9ICZkZGJfaTJjX2FsZ287CisJCWFkYXAtPmFsZ29fZGF0YSA9ICh2b2lkICopaTJjOworCQlhZGFwLT5kZXYucGFyZW50ID0gJmRldi0+cGRldi0+ZGV2OworCQlzdGF0ID0gaTJjX2FkZF9hZGFwdGVyKGFkYXApOworCQlpZiAoc3RhdCkKKwkJCWJyZWFrOworCX0KKwlpZiAoc3RhdCkKKwkJZm9yIChqID0gMDsgaiA8IGk7IGorKykgeworCQkJaTJjID0gJmRldi0+aTJjW2pdOworCQkJYWRhcCA9ICZpMmMtPmFkYXA7CisJCQlpMmNfZGVsX2FkYXB0ZXIoYWRhcCk7CisJCX0KKwlyZXR1cm4gc3RhdDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZiAwCitzdGF0aWMgdm9pZCBzZXRfdGFibGUoc3RydWN0IGRkYiAqZGV2LCB1MzIgb2ZmLAorCQkgICAgICBkbWFfYWRkcl90ICpwYnVmLCB1MzIgbnVtKQoreworCXUzMiBpLCBiYXNlOworCXU2NCBtZW07CisKKwliYXNlID0gRE1BX0JBU0VfQUREUkVTU19UQUJMRSArIG9mZjsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJbWVtID0gcGJ1ZltpXTsKKwkJZGRid3JpdGVsKG1lbSAmIDB4ZmZmZmZmZmYsIGJhc2UgKyBpICogOCk7CisJCWRkYndyaXRlbChtZW0gPj4gMzIsIGJhc2UgKyBpICogOCArIDQpOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBkZGJfYWRkcmVzc190YWJsZShzdHJ1Y3QgZGRiICpkZXYpCit7CisJdTMyIGksIGosIGJhc2U7CisJdTY0IG1lbTsKKwlkbWFfYWRkcl90ICpwYnVmOworCisJZm9yIChpID0gMDsgaSA8IGRldi0+aW5mby0+cG9ydF9udW0gKiAyOyBpKyspIHsKKwkJYmFzZSA9IERNQV9CQVNFX0FERFJFU1NfVEFCTEUgKyBpICogMHgxMDA7CisJCXBidWYgPSBkZXYtPmlucHV0W2ldLnBidWY7CisJCWZvciAoaiA9IDA7IGogPCBkZXYtPmlucHV0W2ldLmRtYV9idWZfbnVtOyBqKyspIHsKKwkJCW1lbSA9IHBidWZbal07CisJCQlkZGJ3cml0ZWwobWVtICYgMHhmZmZmZmZmZiwgYmFzZSArIGogKiA4KTsKKwkJCWRkYndyaXRlbChtZW0gPj4gMzIsIGJhc2UgKyBqICogOCArIDQpOworCQl9CisJfQorCWZvciAoaSA9IDA7IGkgPCBkZXYtPmluZm8tPnBvcnRfbnVtOyBpKyspIHsKKwkJYmFzZSA9IERNQV9CQVNFX0FERFJFU1NfVEFCTEUgKyAweDgwMCArIGkgKiAweDEwMDsKKwkJcGJ1ZiA9IGRldi0+b3V0cHV0W2ldLnBidWY7CisJCWZvciAoaiA9IDA7IGogPCBkZXYtPm91dHB1dFtpXS5kbWFfYnVmX251bTsgaisrKSB7CisJCQltZW0gPSBwYnVmW2pdOworCQkJZGRid3JpdGVsKG1lbSAmIDB4ZmZmZmZmZmYsIGJhc2UgKyBqICogOCk7CisJCQlkZGJ3cml0ZWwobWVtID4+IDMyLCBiYXNlICsgaiAqIDggKyA0KTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgaW9fZnJlZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTggKip2YnVmLAorCQkgICAgZG1hX2FkZHJfdCAqcGJ1ZiwgdTMyIHNpemUsIGludCBudW0pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJaWYgKHZidWZbaV0pIHsKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQocGRldiwgc2l6ZSwgdmJ1ZltpXSwgcGJ1ZltpXSk7CisJCQl2YnVmW2ldID0gMDsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBpb19hbGxvYyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTggKip2YnVmLAorCQkgICAgZG1hX2FkZHJfdCAqcGJ1ZiwgdTMyIHNpemUsIGludCBudW0pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJdmJ1ZltpXSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBkZXYsIHNpemUsICZwYnVmW2ldKTsKKwkJaWYgKCF2YnVmW2ldKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRkYl9idWZmZXJzX2FsbG9jKHN0cnVjdCBkZGIgKmRldikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZGRiX3BvcnQgKnBvcnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5pbmZvLT5wb3J0X251bTsgaSsrKSB7CisJCXBvcnQgPSAmZGV2LT5wb3J0W2ldOworCQlzd2l0Y2ggKHBvcnQtPmNsYXNzKSB7CisJCWNhc2UgRERCX1BPUlRfVFVORVI6CisJCQlpZiAoaW9fYWxsb2MoZGV2LT5wZGV2LCBwb3J0LT5pbnB1dFswXS0+dmJ1ZiwKKwkJCQkgICAgIHBvcnQtPmlucHV0WzBdLT5wYnVmLAorCQkJCSAgICAgcG9ydC0+aW5wdXRbMF0tPmRtYV9idWZfc2l6ZSwKKwkJCQkgICAgIHBvcnQtPmlucHV0WzBdLT5kbWFfYnVmX251bSkgPCAwKQorCQkJCXJldHVybiAtMTsKKwkJCWlmIChpb19hbGxvYyhkZXYtPnBkZXYsIHBvcnQtPmlucHV0WzFdLT52YnVmLAorCQkJCSAgICAgcG9ydC0+aW5wdXRbMV0tPnBidWYsCisJCQkJICAgICBwb3J0LT5pbnB1dFsxXS0+ZG1hX2J1Zl9zaXplLAorCQkJCSAgICAgcG9ydC0+aW5wdXRbMV0tPmRtYV9idWZfbnVtKSA8IDApCisJCQkJcmV0dXJuIC0xOworCQkJYnJlYWs7CisJCWNhc2UgRERCX1BPUlRfQ0k6CisJCQlpZiAoaW9fYWxsb2MoZGV2LT5wZGV2LCBwb3J0LT5pbnB1dFswXS0+dmJ1ZiwKKwkJCQkgICAgIHBvcnQtPmlucHV0WzBdLT5wYnVmLAorCQkJCSAgICAgcG9ydC0+aW5wdXRbMF0tPmRtYV9idWZfc2l6ZSwKKwkJCQkgICAgIHBvcnQtPmlucHV0WzBdLT5kbWFfYnVmX251bSkgPCAwKQorCQkJCXJldHVybiAtMTsKKwkJCWlmIChpb19hbGxvYyhkZXYtPnBkZXYsIHBvcnQtPm91dHB1dC0+dmJ1ZiwKKwkJCQkgICAgIHBvcnQtPm91dHB1dC0+cGJ1ZiwKKwkJCQkgICAgIHBvcnQtPm91dHB1dC0+ZG1hX2J1Zl9zaXplLAorCQkJCSAgICAgcG9ydC0+b3V0cHV0LT5kbWFfYnVmX251bSkgPCAwKQorCQkJCXJldHVybiAtMTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisJZGRiX2FkZHJlc3NfdGFibGUoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGRiX2J1ZmZlcnNfZnJlZShzdHJ1Y3QgZGRiICpkZXYpCit7CisJaW50IGk7CisJc3RydWN0IGRkYl9wb3J0ICpwb3J0OworCisJZm9yIChpID0gMDsgaSA8IGRldi0+aW5mby0+cG9ydF9udW07IGkrKykgeworCQlwb3J0ID0gJmRldi0+cG9ydFtpXTsKKwkJaW9fZnJlZShkZXYtPnBkZXYsIHBvcnQtPmlucHV0WzBdLT52YnVmLAorCQkJcG9ydC0+aW5wdXRbMF0tPnBidWYsCisJCQlwb3J0LT5pbnB1dFswXS0+ZG1hX2J1Zl9zaXplLAorCQkJcG9ydC0+aW5wdXRbMF0tPmRtYV9idWZfbnVtKTsKKwkJaW9fZnJlZShkZXYtPnBkZXYsIHBvcnQtPmlucHV0WzFdLT52YnVmLAorCQkJcG9ydC0+aW5wdXRbMV0tPnBidWYsCisJCQlwb3J0LT5pbnB1dFsxXS0+ZG1hX2J1Zl9zaXplLAorCQkJcG9ydC0+aW5wdXRbMV0tPmRtYV9idWZfbnVtKTsKKwkJaW9fZnJlZShkZXYtPnBkZXYsIHBvcnQtPm91dHB1dC0+dmJ1ZiwKKwkJCXBvcnQtPm91dHB1dC0+cGJ1ZiwKKwkJCXBvcnQtPm91dHB1dC0+ZG1hX2J1Zl9zaXplLAorCQkJcG9ydC0+b3V0cHV0LT5kbWFfYnVmX251bSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkZGJfaW5wdXRfc3RhcnQoc3RydWN0IGRkYl9pbnB1dCAqaW5wdXQpCit7CisJc3RydWN0IGRkYiAqZGV2ID0gaW5wdXQtPnBvcnQtPmRldjsKKworCXNwaW5fbG9ja19pcnEoJmlucHV0LT5sb2NrKTsKKwlpbnB1dC0+Y2J1ZiA9IDA7CisJaW5wdXQtPmNvZmYgPSAwOworCisJLyogcmVzZXQgKi8KKwlkZGJ3cml0ZWwoMCwgVFNfSU5QVVRfQ09OVFJPTChpbnB1dC0+bnIpKTsKKwlkZGJ3cml0ZWwoMiwgVFNfSU5QVVRfQ09OVFJPTChpbnB1dC0+bnIpKTsKKwlkZGJ3cml0ZWwoMCwgVFNfSU5QVVRfQ09OVFJPTChpbnB1dC0+bnIpKTsKKworCWRkYndyaXRlbCgoMSA8PCAxNikgfAorCQkgIChpbnB1dC0+ZG1hX2J1Zl9udW0gPDwgMTEpIHwKKwkJICAoaW5wdXQtPmRtYV9idWZfc2l6ZSA+PiA3KSwKKwkJICBETUFfQlVGRkVSX1NJWkUoaW5wdXQtPm5yKSk7CisJZGRid3JpdGVsKDAsIERNQV9CVUZGRVJfQUNLKGlucHV0LT5ucikpOworCisJZGRid3JpdGVsKDEsIERNQV9CQVNFX1dSSVRFKTsKKwlkZGJ3cml0ZWwoMywgRE1BX0JVRkZFUl9DT05UUk9MKGlucHV0LT5ucikpOworCWRkYndyaXRlbCg5LCBUU19JTlBVVF9DT05UUk9MKGlucHV0LT5ucikpOworCWlucHV0LT5ydW5uaW5nID0gMTsKKwlzcGluX3VubG9ja19pcnEoJmlucHV0LT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgZGRiX2lucHV0X3N0b3Aoc3RydWN0IGRkYl9pbnB1dCAqaW5wdXQpCit7CisJc3RydWN0IGRkYiAqZGV2ID0gaW5wdXQtPnBvcnQtPmRldjsKKworCXNwaW5fbG9ja19pcnEoJmlucHV0LT5sb2NrKTsKKwlkZGJ3cml0ZWwoMCwgVFNfSU5QVVRfQ09OVFJPTChpbnB1dC0+bnIpKTsKKwlkZGJ3cml0ZWwoMCwgRE1BX0JVRkZFUl9DT05UUk9MKGlucHV0LT5ucikpOworCWlucHV0LT5ydW5uaW5nID0gMDsKKwlzcGluX3VubG9ja19pcnEoJmlucHV0LT5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgZGRiX291dHB1dF9zdGFydChzdHJ1Y3QgZGRiX291dHB1dCAqb3V0cHV0KQoreworCXN0cnVjdCBkZGIgKmRldiA9IG91dHB1dC0+cG9ydC0+ZGV2OworCisJc3Bpbl9sb2NrX2lycSgmb3V0cHV0LT5sb2NrKTsKKwlvdXRwdXQtPmNidWYgPSAwOworCW91dHB1dC0+Y29mZiA9IDA7CisJZGRid3JpdGVsKDAsIFRTX09VVFBVVF9DT05UUk9MKG91dHB1dC0+bnIpKTsKKwlkZGJ3cml0ZWwoMiwgVFNfT1VUUFVUX0NPTlRST0wob3V0cHV0LT5ucikpOworCWRkYndyaXRlbCgwLCBUU19PVVRQVVRfQ09OVFJPTChvdXRwdXQtPm5yKSk7CisJZGRid3JpdGVsKDB4M2MsIFRTX09VVFBVVF9DT05UUk9MKG91dHB1dC0+bnIpKTsKKwlkZGJ3cml0ZWwoKDEgPDwgMTYpIHwKKwkJICAob3V0cHV0LT5kbWFfYnVmX251bSA8PCAxMSkgfAorCQkgIChvdXRwdXQtPmRtYV9idWZfc2l6ZSA+PiA3KSwKKwkJICBETUFfQlVGRkVSX1NJWkUob3V0cHV0LT5uciArIDgpKTsKKwlkZGJ3cml0ZWwoMCwgRE1BX0JVRkZFUl9BQ0sob3V0cHV0LT5uciArIDgpKTsKKworCWRkYndyaXRlbCgxLCBETUFfQkFTRV9SRUFEKTsKKwlkZGJ3cml0ZWwoMywgRE1BX0JVRkZFUl9DT05UUk9MKG91dHB1dC0+bnIgKyA4KSk7CisJLyogZGRid3JpdGVsKDB4YmQsIFRTX09VVFBVVF9DT05UUk9MKG91dHB1dC0+bnIpKTsgKi8KKwlkZGJ3cml0ZWwoMHgxZCwgVFNfT1VUUFVUX0NPTlRST0wob3V0cHV0LT5ucikpOworCW91dHB1dC0+cnVubmluZyA9IDE7CisJc3Bpbl91bmxvY2tfaXJxKCZvdXRwdXQtPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBkZGJfb3V0cHV0X3N0b3Aoc3RydWN0IGRkYl9vdXRwdXQgKm91dHB1dCkKK3sKKwlzdHJ1Y3QgZGRiICpkZXYgPSBvdXRwdXQtPnBvcnQtPmRldjsKKworCXNwaW5fbG9ja19pcnEoJm91dHB1dC0+bG9jayk7CisJZGRid3JpdGVsKDAsIFRTX09VVFBVVF9DT05UUk9MKG91dHB1dC0+bnIpKTsKKwlkZGJ3cml0ZWwoMCwgRE1BX0JVRkZFUl9DT05UUk9MKG91dHB1dC0+bnIgKyA4KSk7CisJb3V0cHV0LT5ydW5uaW5nID0gMDsKKwlzcGluX3VubG9ja19pcnEoJm91dHB1dC0+bG9jayk7Cit9CisKK3N0YXRpYyB1MzIgZGRiX291dHB1dF9mcmVlKHN0cnVjdCBkZGJfb3V0cHV0ICpvdXRwdXQpCit7CisJdTMyIGlkeCwgb2ZmLCBzdGF0ID0gb3V0cHV0LT5zdGF0OworCXMzMiBkaWZmOworCisJaWR4ID0gKHN0YXQgPj4gMTEpICYgMHgxZjsKKwlvZmYgPSAoc3RhdCAmIDB4N2ZmKSA8PCA3OworCisJaWYgKG91dHB1dC0+Y2J1ZiAhPSBpZHgpIHsKKwkJaWYgKCgoKG91dHB1dC0+Y2J1ZiArIDEpICUgb3V0cHV0LT5kbWFfYnVmX251bSkgPT0gaWR4KSAmJgorCQkgICAgKG91dHB1dC0+ZG1hX2J1Zl9zaXplIC0gb3V0cHV0LT5jb2ZmIDw9IDE4OCkpCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIDE4ODsKKwl9CisJZGlmZiA9IG9mZiAtIG91dHB1dC0+Y29mZjsKKwlpZiAoZGlmZiA8PSAwIHx8IGRpZmYgPiAxODgpCisJCXJldHVybiAxODg7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGRkYl9vdXRwdXRfd3JpdGUoc3RydWN0IGRkYl9vdXRwdXQgKm91dHB1dCwKKwkJCQljb25zdCB1OCAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGRkYiAqZGV2ID0gb3V0cHV0LT5wb3J0LT5kZXY7CisJdTMyIGlkeCwgb2ZmLCBzdGF0ID0gb3V0cHV0LT5zdGF0OworCXUzMiBsZWZ0ID0gY291bnQsIGxlbjsKKworCWlkeCA9IChzdGF0ID4+IDExKSAmIDB4MWY7CisJb2ZmID0gKHN0YXQgJiAweDdmZikgPDwgNzsKKworCXdoaWxlIChsZWZ0KSB7CisJCWxlbiA9IG91dHB1dC0+ZG1hX2J1Zl9zaXplIC0gb3V0cHV0LT5jb2ZmOworCQlpZiAoKCgob3V0cHV0LT5jYnVmICsgMSkgJSBvdXRwdXQtPmRtYV9idWZfbnVtKSA9PSBpZHgpICYmCisJCSAgICAob2ZmID09IDApKSB7CisJCQlpZiAobGVuIDw9IDE4OCkKKwkJCQlicmVhazsKKwkJCWxlbiAtPSAxODg7CisJCX0KKwkJaWYgKG91dHB1dC0+Y2J1ZiA9PSBpZHgpIHsKKwkJCWlmIChvZmYgPiBvdXRwdXQtPmNvZmYpIHsKKyNpZiAxCisJCQkJbGVuID0gb2ZmIC0gb3V0cHV0LT5jb2ZmOworCQkJCWxlbiAtPSAobGVuICUgMTg4KTsKKwkJCQlpZiAobGVuIDw9IDE4OCkKKworI2VuZGlmCisJCQkJCWJyZWFrOworCQkJCWxlbiAtPSAxODg7CisJCQl9CisJCX0KKwkJaWYgKGxlbiA+IGxlZnQpCisJCQlsZW4gPSBsZWZ0OworCQlpZiAoY29weV9mcm9tX3VzZXIob3V0cHV0LT52YnVmW291dHB1dC0+Y2J1Zl0gKyBvdXRwdXQtPmNvZmYsCisJCQkJICAgYnVmLCBsZW4pKQorCQkJcmV0dXJuIC1FSU87CisJCWxlZnQgLT0gbGVuOworCQlidWYgKz0gbGVuOworCQlvdXRwdXQtPmNvZmYgKz0gbGVuOworCQlpZiAob3V0cHV0LT5jb2ZmID09IG91dHB1dC0+ZG1hX2J1Zl9zaXplKSB7CisJCQlvdXRwdXQtPmNvZmYgPSAwOworCQkJb3V0cHV0LT5jYnVmID0gKChvdXRwdXQtPmNidWYgKyAxKSAlIG91dHB1dC0+ZG1hX2J1Zl9udW0pOworCQl9CisJCWRkYndyaXRlbCgob3V0cHV0LT5jYnVmIDw8IDExKSB8IChvdXRwdXQtPmNvZmYgPj4gNyksCisJCQkgIERNQV9CVUZGRVJfQUNLKG91dHB1dC0+bnIgKyA4KSk7CisJfQorCXJldHVybiBjb3VudCAtIGxlZnQ7Cit9CisKK3N0YXRpYyB1MzIgZGRiX2lucHV0X2F2YWlsKHN0cnVjdCBkZGJfaW5wdXQgKmlucHV0KQoreworCXN0cnVjdCBkZGIgKmRldiA9IGlucHV0LT5wb3J0LT5kZXY7CisJdTMyIGlkeCwgb2ZmLCBzdGF0ID0gaW5wdXQtPnN0YXQ7CisJdTMyIGN0cmwgPSBkZGJyZWFkbChETUFfQlVGRkVSX0NPTlRST0woaW5wdXQtPm5yKSk7CisKKwlpZHggPSAoc3RhdCA+PiAxMSkgJiAweDFmOworCW9mZiA9IChzdGF0ICYgMHg3ZmYpIDw8IDc7CisKKwlpZiAoY3RybCAmIDQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJJQSAlZCAlZCAlMDh4XG4iLCBpZHgsIG9mZiwgY3RybCk7CisJCWRkYndyaXRlbChpbnB1dC0+c3RhdCwgRE1BX0JVRkZFUl9BQ0soaW5wdXQtPm5yKSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoaW5wdXQtPmNidWYgIT0gaWR4KQorCQlyZXR1cm4gMTg4OworCXJldHVybiAwOworfQorCitzdGF0aWMgc2l6ZV90IGRkYl9pbnB1dF9yZWFkKHN0cnVjdCBkZGJfaW5wdXQgKmlucHV0LCB1OCAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGRkYiAqZGV2ID0gaW5wdXQtPnBvcnQtPmRldjsKKwl1MzIgbGVmdCA9IGNvdW50OworCXUzMiBpZHgsIG9mZiwgZnJlZSwgc3RhdCA9IGlucHV0LT5zdGF0OworCWludCByZXQ7CisKKwlpZHggPSAoc3RhdCA+PiAxMSkgJiAweDFmOworCW9mZiA9IChzdGF0ICYgMHg3ZmYpIDw8IDc7CisKKwl3aGlsZSAobGVmdCkgeworCQlpZiAoaW5wdXQtPmNidWYgPT0gaWR4KQorCQkJcmV0dXJuIGNvdW50IC0gbGVmdDsKKwkJZnJlZSA9IGlucHV0LT5kbWFfYnVmX3NpemUgLSBpbnB1dC0+Y29mZjsKKwkJaWYgKGZyZWUgPiBsZWZ0KQorCQkJZnJlZSA9IGxlZnQ7CisJCXJldCA9IGNvcHlfdG9fdXNlcihidWYsIGlucHV0LT52YnVmW2lucHV0LT5jYnVmXSArCisJCQkJICAgaW5wdXQtPmNvZmYsIGZyZWUpOworCQlpbnB1dC0+Y29mZiArPSBmcmVlOworCQlpZiAoaW5wdXQtPmNvZmYgPT0gaW5wdXQtPmRtYV9idWZfc2l6ZSkgeworCQkJaW5wdXQtPmNvZmYgPSAwOworCQkJaW5wdXQtPmNidWYgPSAoaW5wdXQtPmNidWYrMSkgJSBpbnB1dC0+ZG1hX2J1Zl9udW07CisJCX0KKwkJbGVmdCAtPSBmcmVlOworCQlkZGJ3cml0ZWwoKGlucHV0LT5jYnVmIDw8IDExKSB8IChpbnB1dC0+Y29mZiA+PiA3KSwKKwkJCSAgRE1BX0JVRkZFUl9BQ0soaW5wdXQtPm5yKSk7CisJfQorCXJldHVybiBjb3VudDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgMAorc3RhdGljIHN0cnVjdCBkZGJfaW5wdXQgKmZlMmlucHV0KHN0cnVjdCBkZGIgKmRldiwgc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5pbmZvLT5wb3J0X251bSAqIDI7IGkrKykgeworCQlpZiAoZGV2LT5pbnB1dFtpXS5mZSA9PSBmZSkKKwkJCXJldHVybiAmZGV2LT5pbnB1dFtpXTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBkcnhrX2dhdGVfY3RybChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgZGRiX2lucHV0ICppbnB1dCA9IGZlLT5zZWNfcHJpdjsKKwlzdHJ1Y3QgZGRiX3BvcnQgKnBvcnQgPSBpbnB1dC0+cG9ydDsKKwlpbnQgc3RhdHVzOworCisJaWYgKGVuYWJsZSkgeworCQltdXRleF9sb2NrKCZwb3J0LT5pMmNfZ2F0ZV9sb2NrKTsKKwkJc3RhdHVzID0gaW5wdXQtPmdhdGVfY3RybChmZSwgMSk7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gaW5wdXQtPmdhdGVfY3RybChmZSwgMCk7CisJCW11dGV4X3VubG9jaygmcG9ydC0+aTJjX2dhdGVfbG9jayk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgZGVtb2RfYXR0YWNoX2RyeGsoc3RydWN0IGRkYl9pbnB1dCAqaW5wdXQpCit7CisJc3RydWN0IGkyY19hZGFwdGVyICppMmMgPSAmaW5wdXQtPnBvcnQtPmkyYy0+YWRhcDsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZTsKKwlzdHJ1Y3QgZHJ4a19jb25maWcgY29uZmlnOworCisJbWVtc2V0KCZjb25maWcsIDAsIHNpemVvZihjb25maWcpKTsKKwljb25maWcuYWRyID0gMHgyOSArIChpbnB1dC0+bnIgJiAxKTsKKworCWZlID0gaW5wdXQtPmZlID0gZHZiX2F0dGFjaChkcnhrX2F0dGFjaCwgJmNvbmZpZywgaTJjLCAmaW5wdXQtPmZlMik7CisJaWYgKCFpbnB1dC0+ZmUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJObyBEUlhLIGZvdW5kIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlmZS0+c2VjX3ByaXYgPSBpbnB1dDsKKwlpbnB1dC0+Z2F0ZV9jdHJsID0gZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsOworCWZlLT5vcHMuaTJjX2dhdGVfY3RybCA9IGRyeGtfZ2F0ZV9jdHJsOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR1bmVyX2F0dGFjaF90ZGExODI3MShzdHJ1Y3QgZGRiX2lucHV0ICppbnB1dCkKK3sKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYyA9ICZpbnB1dC0+cG9ydC0+aTJjLT5hZGFwOworCXN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlOworCisJaWYgKGlucHV0LT5mZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWlucHV0LT5mZS0+b3BzLmkyY19nYXRlX2N0cmwoaW5wdXQtPmZlLCAxKTsKKwlmZSA9IGR2Yl9hdHRhY2godGRhMTgyNzFjMmRkX2F0dGFjaCwgaW5wdXQtPmZlLCBpMmMsIDB4NjApOworCWlmICghZmUpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJObyBUREExODI3MSBmb3VuZCFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKGlucHV0LT5mZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWlucHV0LT5mZS0+b3BzLmkyY19nYXRlX2N0cmwoaW5wdXQtPmZlLCAwKTsKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IHN0djA5MHhfY29uZmlnIHN0djA5MDAgPSB7CisJLmRldmljZSAgICAgICAgID0gU1RWMDkwMCwKKwkuZGVtb2RfbW9kZSAgICAgPSBTVFYwOTB4X0RVQUwsCisJLmNsa19tb2RlICAgICAgID0gU1RWMDkweF9DTEtfRVhULAorCisJLnh0YWwgICAgICAgICAgID0gMjcwMDAwMDAsCisJLmFkZHJlc3MgICAgICAgID0gMHg2OSwKKworCS50czFfbW9kZSAgICAgICA9IFNUVjA5MHhfVFNNT0RFX1NFUklBTF9QVU5DVFVSRUQsCisJLnRzMl9tb2RlICAgICAgID0gU1RWMDkweF9UU01PREVfU0VSSUFMX1BVTkNUVVJFRCwKKworCS5yZXBlYXRlcl9sZXZlbCA9IFNUVjA5MHhfUlBUTEVWRUxfMTYsCisKKwkuYWRjMV9yYW5nZQk9IFNUVjA5MHhfQURDXzFWcHAsCisJLmFkYzJfcmFuZ2UJPSBTVFYwOTB4X0FEQ18xVnBwLAorCisJLmRpc2VxY19lbnZlbG9wZV9tb2RlID0gdHJ1ZSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3R2MDkweF9jb25maWcgc3R2MDkwMF9hYSA9IHsKKwkuZGV2aWNlICAgICAgICAgPSBTVFYwOTAwLAorCS5kZW1vZF9tb2RlICAgICA9IFNUVjA5MHhfRFVBTCwKKwkuY2xrX21vZGUgICAgICAgPSBTVFYwOTB4X0NMS19FWFQsCisKKwkueHRhbCAgICAgICAgICAgPSAyNzAwMDAwMCwKKwkuYWRkcmVzcyAgICAgICAgPSAweDY4LAorCisJLnRzMV9tb2RlICAgICAgID0gU1RWMDkweF9UU01PREVfU0VSSUFMX1BVTkNUVVJFRCwKKwkudHMyX21vZGUgICAgICAgPSBTVFYwOTB4X1RTTU9ERV9TRVJJQUxfUFVOQ1RVUkVELAorCisJLnJlcGVhdGVyX2xldmVsID0gU1RWMDkweF9SUFRMRVZFTF8xNiwKKworCS5hZGMxX3JhbmdlCT0gU1RWMDkweF9BRENfMVZwcCwKKwkuYWRjMl9yYW5nZQk9IFNUVjA5MHhfQURDXzFWcHAsCisKKwkuZGlzZXFjX2VudmVsb3BlX21vZGUgPSB0cnVlLAorfTsKKworc3RhdGljIHN0cnVjdCBzdHY2MTEweF9jb25maWcgc3R2NjExMGEgPSB7CisJLmFkZHIgICAgPSAweDYwLAorCS5yZWZjbGsJID0gMjcwMDAwMDAsCisJLmNsa19kaXYgPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBzdHY2MTEweF9jb25maWcgc3R2NjExMGIgPSB7CisJLmFkZHIgICAgPSAweDYzLAorCS5yZWZjbGsJID0gMjcwMDAwMDAsCisJLmNsa19kaXYgPSAxLAorfTsKKworc3RhdGljIGludCBkZW1vZF9hdHRhY2hfc3R2MDkwMChzdHJ1Y3QgZGRiX2lucHV0ICppbnB1dCwgaW50IHR5cGUpCit7CisJc3RydWN0IGkyY19hZGFwdGVyICppMmMgPSAmaW5wdXQtPnBvcnQtPmkyYy0+YWRhcDsKKwlzdHJ1Y3Qgc3R2MDkweF9jb25maWcgKmZlY29uZiA9IHR5cGUgPyAmc3R2MDkwMF9hYSA6ICZzdHYwOTAwOworCisJaW5wdXQtPmZlID0gZHZiX2F0dGFjaChzdHYwOTB4X2F0dGFjaCwgZmVjb25mLCBpMmMsCisJCQkgICAgICAgKGlucHV0LT5uciAmIDEpID8gU1RWMDkweF9ERU1PRFVMQVRPUl8xCisJCQkgICAgICAgOiBTVFYwOTB4X0RFTU9EVUxBVE9SXzApOworCWlmICghaW5wdXQtPmZlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTm8gU1RWMDkwMCBmb3VuZCFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKCFkdmJfYXR0YWNoKGxuYmgyNF9hdHRhY2gsIGlucHV0LT5mZSwgaTJjLCAwLAorCQkJMCwgKGlucHV0LT5uciAmIDEpID8KKwkJCSgweDA5IC0gdHlwZSkgOiAoMHgwYiAtIHR5cGUpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIk5vIExOQkgyNCBmb3VuZCFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdHVuZXJfYXR0YWNoX3N0djYxMTAoc3RydWN0IGRkYl9pbnB1dCAqaW5wdXQsIGludCB0eXBlKQoreworCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjID0gJmlucHV0LT5wb3J0LT5pMmMtPmFkYXA7CisJc3RydWN0IHN0djA5MHhfY29uZmlnICpmZWNvbmYgPSB0eXBlID8gJnN0djA5MDBfYWEgOiAmc3R2MDkwMDsKKwlzdHJ1Y3Qgc3R2NjExMHhfY29uZmlnICp0dW5lcmNvbmYgPSAoaW5wdXQtPm5yICYgMSkgPworCQkmc3R2NjExMGIgOiAmc3R2NjExMGE7CisJc3RydWN0IHN0djYxMTB4X2RldmN0bCAqY3RsOworCisJY3RsID0gZHZiX2F0dGFjaChzdHY2MTEweF9hdHRhY2gsIGlucHV0LT5mZSwgdHVuZXJjb25mLCBpMmMpOworCWlmICghY3RsKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTm8gU1RWNjExMFggZm91bmQhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXByaW50ayhLRVJOX0lORk8gImF0dGFjaCB0dW5lciBpbnB1dCAlZCBhZHIgJTAyeFxuIiwKKwkJCSBpbnB1dC0+bnIsIHR1bmVyY29uZi0+YWRkcik7CisKKwlmZWNvbmYtPnR1bmVyX2luaXQgICAgICAgICAgPSBjdGwtPnR1bmVyX2luaXQ7CisJZmVjb25mLT50dW5lcl9zbGVlcCAgICAgICAgID0gY3RsLT50dW5lcl9zbGVlcDsKKwlmZWNvbmYtPnR1bmVyX3NldF9tb2RlICAgICAgPSBjdGwtPnR1bmVyX3NldF9tb2RlOworCWZlY29uZi0+dHVuZXJfc2V0X2ZyZXF1ZW5jeSA9IGN0bC0+dHVuZXJfc2V0X2ZyZXF1ZW5jeTsKKwlmZWNvbmYtPnR1bmVyX2dldF9mcmVxdWVuY3kgPSBjdGwtPnR1bmVyX2dldF9mcmVxdWVuY3k7CisJZmVjb25mLT50dW5lcl9zZXRfYmFuZHdpZHRoID0gY3RsLT50dW5lcl9zZXRfYmFuZHdpZHRoOworCWZlY29uZi0+dHVuZXJfZ2V0X2JhbmR3aWR0aCA9IGN0bC0+dHVuZXJfZ2V0X2JhbmR3aWR0aDsKKwlmZWNvbmYtPnR1bmVyX3NldF9iYmdhaW4gICAgPSBjdGwtPnR1bmVyX3NldF9iYmdhaW47CisJZmVjb25mLT50dW5lcl9nZXRfYmJnYWluICAgID0gY3RsLT50dW5lcl9nZXRfYmJnYWluOworCWZlY29uZi0+dHVuZXJfc2V0X3JlZmNsayAgICA9IGN0bC0+dHVuZXJfc2V0X3JlZmNsazsKKwlmZWNvbmYtPnR1bmVyX2dldF9zdGF0dXMgICAgPSBjdGwtPnR1bmVyX2dldF9zdGF0dXM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBteV9kdmJfZG14X3RzX2NhcmRfaW5pdChzdHJ1Y3QgZHZiX2RlbXV4ICpkdmJkZW11eCwgY2hhciAqaWQsCisJCQkgICAgaW50ICgqc3RhcnRfZmVlZCkoc3RydWN0IGR2Yl9kZW11eF9mZWVkICopLAorCQkJICAgIGludCAoKnN0b3BfZmVlZCkoc3RydWN0IGR2Yl9kZW11eF9mZWVkICopLAorCQkJICAgIHZvaWQgKnByaXYpCit7CisJZHZiZGVtdXgtPnByaXYgPSBwcml2OworCisJZHZiZGVtdXgtPmZpbHRlcm51bSA9IDI1NjsKKwlkdmJkZW11eC0+ZmVlZG51bSA9IDI1NjsKKwlkdmJkZW11eC0+c3RhcnRfZmVlZCA9IHN0YXJ0X2ZlZWQ7CisJZHZiZGVtdXgtPnN0b3BfZmVlZCA9IHN0b3BfZmVlZDsKKwlkdmJkZW11eC0+d3JpdGVfdG9fZGVjb2RlciA9IE5VTEw7CisJZHZiZGVtdXgtPmRteC5jYXBhYmlsaXRpZXMgPSAoRE1YX1RTX0ZJTFRFUklORyB8CisJCQkJICAgICAgRE1YX1NFQ1RJT05fRklMVEVSSU5HIHwKKwkJCQkgICAgICBETVhfTUVNT1JZX0JBU0VEX0ZJTFRFUklORyk7CisJcmV0dXJuIGR2Yl9kbXhfaW5pdChkdmJkZW11eCk7Cit9CisKK3N0YXRpYyBpbnQgbXlfZHZiX2RteGRldl90c19jYXJkX2luaXQoc3RydWN0IGRteGRldiAqZG14ZGV2LAorCQkJICAgICAgIHN0cnVjdCBkdmJfZGVtdXggKmR2YmRlbXV4LAorCQkJICAgICAgIHN0cnVjdCBkbXhfZnJvbnRlbmQgKmh3X2Zyb250ZW5kLAorCQkJICAgICAgIHN0cnVjdCBkbXhfZnJvbnRlbmQgKm1lbV9mcm9udGVuZCwKKwkJCSAgICAgICBzdHJ1Y3QgZHZiX2FkYXB0ZXIgKmR2Yl9hZGFwdGVyKQoreworCWludCByZXQ7CisKKwlkbXhkZXYtPmZpbHRlcm51bSA9IDI1NjsKKwlkbXhkZXYtPmRlbXV4ID0gJmR2YmRlbXV4LT5kbXg7CisJZG14ZGV2LT5jYXBhYmlsaXRpZXMgPSAwOworCXJldCA9IGR2Yl9kbXhkZXZfaW5pdChkbXhkZXYsIGR2Yl9hZGFwdGVyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWh3X2Zyb250ZW5kLT5zb3VyY2UgPSBETVhfRlJPTlRFTkRfMDsKKwlkdmJkZW11eC0+ZG14LmFkZF9mcm9udGVuZCgmZHZiZGVtdXgtPmRteCwgaHdfZnJvbnRlbmQpOworCW1lbV9mcm9udGVuZC0+c291cmNlID0gRE1YX01FTU9SWV9GRTsKKwlkdmJkZW11eC0+ZG14LmFkZF9mcm9udGVuZCgmZHZiZGVtdXgtPmRteCwgbWVtX2Zyb250ZW5kKTsKKwlyZXR1cm4gZHZiZGVtdXgtPmRteC5jb25uZWN0X2Zyb250ZW5kKCZkdmJkZW11eC0+ZG14LCBod19mcm9udGVuZCk7Cit9CisKK3N0YXRpYyBpbnQgc3RhcnRfZmVlZChzdHJ1Y3QgZHZiX2RlbXV4X2ZlZWQgKmR2YmRteGZlZWQpCit7CisJc3RydWN0IGR2Yl9kZW11eCAqZHZiZG14ID0gZHZiZG14ZmVlZC0+ZGVtdXg7CisJc3RydWN0IGRkYl9pbnB1dCAqaW5wdXQgPSBkdmJkbXgtPnByaXY7CisKKwlpZiAoIWlucHV0LT51c2VycykKKwkJZGRiX2lucHV0X3N0YXJ0KGlucHV0KTsKKworCXJldHVybiArK2lucHV0LT51c2VyczsKK30KKworc3RhdGljIGludCBzdG9wX2ZlZWQoc3RydWN0IGR2Yl9kZW11eF9mZWVkICpkdmJkbXhmZWVkKQoreworCXN0cnVjdCBkdmJfZGVtdXggKmR2YmRteCA9IGR2YmRteGZlZWQtPmRlbXV4OworCXN0cnVjdCBkZGJfaW5wdXQgKmlucHV0ID0gZHZiZG14LT5wcml2OworCisJaWYgKC0taW5wdXQtPnVzZXJzKQorCQlyZXR1cm4gaW5wdXQtPnVzZXJzOworCisJZGRiX2lucHV0X3N0b3AoaW5wdXQpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGR2Yl9pbnB1dF9kZXRhY2goc3RydWN0IGRkYl9pbnB1dCAqaW5wdXQpCit7CisJc3RydWN0IGR2Yl9hZGFwdGVyICphZGFwID0gJmlucHV0LT5hZGFwOworCXN0cnVjdCBkdmJfZGVtdXggKmR2YmRlbXV4ID0gJmlucHV0LT5kZW11eDsKKworCXN3aXRjaCAoaW5wdXQtPmF0dGFjaGVkKSB7CisJY2FzZSA1OgorCQlpZiAoaW5wdXQtPmZlMikKKwkJCWR2Yl91bnJlZ2lzdGVyX2Zyb250ZW5kKGlucHV0LT5mZTIpOworCQlpZiAoaW5wdXQtPmZlKSB7CisJCQlkdmJfdW5yZWdpc3Rlcl9mcm9udGVuZChpbnB1dC0+ZmUpOworCQkJZHZiX2Zyb250ZW5kX2RldGFjaChpbnB1dC0+ZmUpOworCQkJaW5wdXQtPmZlID0gTlVMTDsKKwkJfQorCWNhc2UgNDoKKwkJZHZiX25ldF9yZWxlYXNlKCZpbnB1dC0+ZHZibmV0KTsKKworCWNhc2UgMzoKKwkJZHZiZGVtdXgtPmRteC5jbG9zZSgmZHZiZGVtdXgtPmRteCk7CisJCWR2YmRlbXV4LT5kbXgucmVtb3ZlX2Zyb250ZW5kKCZkdmJkZW11eC0+ZG14LAorCQkJCQkgICAgICAmaW5wdXQtPmh3X2Zyb250ZW5kKTsKKwkJZHZiZGVtdXgtPmRteC5yZW1vdmVfZnJvbnRlbmQoJmR2YmRlbXV4LT5kbXgsCisJCQkJCSAgICAgICZpbnB1dC0+bWVtX2Zyb250ZW5kKTsKKwkJZHZiX2RteGRldl9yZWxlYXNlKCZpbnB1dC0+ZG14ZGV2KTsKKworCWNhc2UgMjoKKwkJZHZiX2RteF9yZWxlYXNlKCZpbnB1dC0+ZGVtdXgpOworCisJY2FzZSAxOgorCQlkdmJfdW5yZWdpc3Rlcl9hZGFwdGVyKGFkYXApOworCX0KKwlpbnB1dC0+YXR0YWNoZWQgPSAwOworfQorCitzdGF0aWMgaW50IGR2Yl9pbnB1dF9hdHRhY2goc3RydWN0IGRkYl9pbnB1dCAqaW5wdXQpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgZGRiX3BvcnQgKnBvcnQgPSBpbnB1dC0+cG9ydDsKKwlzdHJ1Y3QgZHZiX2FkYXB0ZXIgKmFkYXAgPSAmaW5wdXQtPmFkYXA7CisJc3RydWN0IGR2Yl9kZW11eCAqZHZiZGVtdXggPSAmaW5wdXQtPmRlbXV4OworCisJcmV0ID0gZHZiX3JlZ2lzdGVyX2FkYXB0ZXIoYWRhcCwgIkREQnJpZGdlIiwgVEhJU19NT0RVTEUsCisJCQkJICAgJmlucHV0LT5wb3J0LT5kZXYtPnBkZXYtPmRldiwKKwkJCQkgICBhZGFwdGVyX25yKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImRkYnJpZGdlOiBDb3VsZCBub3QgcmVnaXN0ZXIgYWRhcHRlci4iCisJCSAgICAgICAiQ2hlY2sgaWYgeW91IGVuYWJsZWQgZW5vdWdoIGFkYXB0ZXJzIGluIGR2Yi1jb3JlIVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCWlucHV0LT5hdHRhY2hlZCA9IDE7CisKKwlyZXQgPSBteV9kdmJfZG14X3RzX2NhcmRfaW5pdChkdmJkZW11eCwgIlNXIGRlbXV4IiwKKwkJCQkgICAgICBzdGFydF9mZWVkLAorCQkJCSAgICAgIHN0b3BfZmVlZCwgaW5wdXQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCWlucHV0LT5hdHRhY2hlZCA9IDI7CisKKwlyZXQgPSBteV9kdmJfZG14ZGV2X3RzX2NhcmRfaW5pdCgmaW5wdXQtPmRteGRldiwgJmlucHV0LT5kZW11eCwKKwkJCQkJICZpbnB1dC0+aHdfZnJvbnRlbmQsCisJCQkJCSAmaW5wdXQtPm1lbV9mcm9udGVuZCwgYWRhcCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJaW5wdXQtPmF0dGFjaGVkID0gMzsKKworCXJldCA9IGR2Yl9uZXRfaW5pdChhZGFwLCAmaW5wdXQtPmR2Ym5ldCwgaW5wdXQtPmRteGRldi5kZW11eCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJaW5wdXQtPmF0dGFjaGVkID0gNDsKKworCWlucHV0LT5mZSA9IDA7CisJc3dpdGNoIChwb3J0LT50eXBlKSB7CisJY2FzZSBEREJfVFVORVJfRFZCU19TVDoKKwkJaWYgKGRlbW9kX2F0dGFjaF9zdHYwOTAwKGlucHV0LCAwKSA8IDApCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJaWYgKHR1bmVyX2F0dGFjaF9zdHY2MTEwKGlucHV0LCAwKSA8IDApCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJaWYgKGlucHV0LT5mZSkgeworCQkJaWYgKGR2Yl9yZWdpc3Rlcl9mcm9udGVuZChhZGFwLCBpbnB1dC0+ZmUpIDwgMCkKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQlicmVhazsKKwljYXNlIEREQl9UVU5FUl9EVkJTX1NUX0FBOgorCQlpZiAoZGVtb2RfYXR0YWNoX3N0djA5MDAoaW5wdXQsIDEpIDwgMCkKKwkJCXJldHVybiAtRU5PREVWOworCQlpZiAodHVuZXJfYXR0YWNoX3N0djYxMTAoaW5wdXQsIDEpIDwgMCkKKwkJCXJldHVybiAtRU5PREVWOworCQlpZiAoaW5wdXQtPmZlKSB7CisJCQlpZiAoZHZiX3JlZ2lzdGVyX2Zyb250ZW5kKGFkYXAsIGlucHV0LT5mZSkgPCAwKQorCQkJCXJldHVybiAtRU5PREVWOworCQl9CisJCWJyZWFrOworCWNhc2UgRERCX1RVTkVSX0RWQkNUX1RSOgorCQlpZiAoZGVtb2RfYXR0YWNoX2RyeGsoaW5wdXQpIDwgMCkKKwkJCXJldHVybiAtRU5PREVWOworCQlpZiAodHVuZXJfYXR0YWNoX3RkYTE4MjcxKGlucHV0KSA8IDApCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJaWYgKGlucHV0LT5mZSkgeworCQkJaWYgKGR2Yl9yZWdpc3Rlcl9mcm9udGVuZChhZGFwLCBpbnB1dC0+ZmUpIDwgMCkKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQlpZiAoaW5wdXQtPmZlMikgeworCQkJaWYgKGR2Yl9yZWdpc3Rlcl9mcm9udGVuZChhZGFwLCBpbnB1dC0+ZmUyKSA8IDApCisJCQkJcmV0dXJuIC1FTk9ERVY7CisJCQlpbnB1dC0+ZmUyLT50dW5lcl9wcml2ID0gaW5wdXQtPmZlLT50dW5lcl9wcml2OworCQkJbWVtY3B5KCZpbnB1dC0+ZmUyLT5vcHMudHVuZXJfb3BzLAorCQkJICAgICAgICZpbnB1dC0+ZmUtPm9wcy50dW5lcl9vcHMsCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBkdmJfdHVuZXJfb3BzKSk7CisJCX0KKwkJYnJlYWs7CisJfQorCWlucHV0LT5hdHRhY2hlZCA9IDU7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzc2l6ZV90IHRzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWYsCisJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgZHZiX2RldmljZSAqZHZiZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkZGJfb3V0cHV0ICpvdXRwdXQgPSBkdmJkZXYtPnByaXY7CisJc2l6ZV90IGxlZnQgPSBjb3VudDsKKwlpbnQgc3RhdDsKKworCXdoaWxlIChsZWZ0KSB7CisJCWlmIChkZGJfb3V0cHV0X2ZyZWUob3V0cHV0KSA8IDE4OCkgeworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJCWJyZWFrOworCQkJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgKKwkJCQkgICAgb3V0cHV0LT53cSwgZGRiX291dHB1dF9mcmVlKG91dHB1dCkgPj0gMTg4KSA8IDApCisJCQkJYnJlYWs7CisJCX0KKwkJc3RhdCA9IGRkYl9vdXRwdXRfd3JpdGUob3V0cHV0LCBidWYsIGxlZnQpOworCQlpZiAoc3RhdCA8IDApCisJCQlicmVhazsKKwkJYnVmICs9IHN0YXQ7CisJCWxlZnQgLT0gc3RhdDsKKwl9CisJcmV0dXJuIChsZWZ0ID09IGNvdW50KSA/IC1FQUdBSU4gOiAoY291bnQgLSBsZWZ0KTsKK30KKworc3RhdGljIHNzaXplX3QgdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLAorCQkgICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZGRiX291dHB1dCAqb3V0cHV0ID0gZHZiZGV2LT5wcml2OworCXN0cnVjdCBkZGJfaW5wdXQgKmlucHV0ID0gb3V0cHV0LT5wb3J0LT5pbnB1dFswXTsKKwlpbnQgbGVmdCwgcmVhZDsKKworCWNvdW50IC09IGNvdW50ICUgMTg4OworCWxlZnQgPSBjb3VudDsKKwl3aGlsZSAobGVmdCkgeworCQlpZiAoZGRiX2lucHV0X2F2YWlsKGlucHV0KSA8IDE4OCkgeworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJCWJyZWFrOworCQkJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZSgKKwkJCQkgICAgaW5wdXQtPndxLCBkZGJfaW5wdXRfYXZhaWwoaW5wdXQpID49IDE4OCkgPCAwKQorCQkJCWJyZWFrOworCQl9CisJCXJlYWQgPSBkZGJfaW5wdXRfcmVhZChpbnB1dCwgYnVmLCBsZWZ0KTsKKwkJbGVmdCAtPSByZWFkOworCQlidWYgKz0gcmVhZDsKKwl9CisJcmV0dXJuIChsZWZ0ID09IGNvdW50KSA/IC1FQUdBSU4gOiAoY291bnQgLSBsZWZ0KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB0c19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCS8qCisJc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZGRiX291dHB1dCAqb3V0cHV0ID0gZHZiZGV2LT5wcml2OworCXN0cnVjdCBkZGJfaW5wdXQgKmlucHV0ID0gb3V0cHV0LT5wb3J0LT5pbnB1dFswXTsKKwkqLworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworI2lmIDAKKwlpZiAoZGF0YV9hdmFpbF90b19yZWFkKQorCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJaWYgKGRhdGFfYXZhaWxfdG9fd3JpdGUpCisJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisKKwlwb2xsX3dhaXQoZmlsZSwgJnJlYWRfcXVldWUsIHdhaXQpOworCXBvbGxfd2FpdChmaWxlLCAmd3JpdGVfcXVldWUsIHdhaXQpOworI2VuZGlmCisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNpX2ZvcHMgPSB7CisJLm93bmVyICAgPSBUSElTX01PRFVMRSwKKwkucmVhZCAgICA9IHRzX3JlYWQsCisJLndyaXRlICAgPSB0c193cml0ZSwKKwkub3BlbiAgICA9IGR2Yl9nZW5lcmljX29wZW4sCisJLnJlbGVhc2UgPSBkdmJfZ2VuZXJpY19yZWxlYXNlLAorCS5wb2xsICAgID0gdHNfcG9sbCwKKwkubW1hcCAgICA9IDAsCit9OworCitzdGF0aWMgc3RydWN0IGR2Yl9kZXZpY2UgZHZiZGV2X2NpID0geworCS5wcml2ICAgID0gMCwKKwkucmVhZGVycyA9IC0xLAorCS53cml0ZXJzID0gLTEsCisJLnVzZXJzICAgPSAtMSwKKwkuZm9wcyAgICA9ICZjaV9mb3BzLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBpbnB1dF90YXNrbGV0KHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgZGRiX2lucHV0ICppbnB1dCA9IChzdHJ1Y3QgZGRiX2lucHV0ICopIGRhdGE7CisJc3RydWN0IGRkYiAqZGV2ID0gaW5wdXQtPnBvcnQtPmRldjsKKworCXNwaW5fbG9jaygmaW5wdXQtPmxvY2spOworCWlmICghaW5wdXQtPnJ1bm5pbmcpIHsKKwkJc3Bpbl91bmxvY2soJmlucHV0LT5sb2NrKTsKKwkJcmV0dXJuOworCX0KKwlpbnB1dC0+c3RhdCA9IGRkYnJlYWRsKERNQV9CVUZGRVJfQ1VSUkVOVChpbnB1dC0+bnIpKTsKKworCWlmIChpbnB1dC0+cG9ydC0+Y2xhc3MgPT0gRERCX1BPUlRfVFVORVIpIHsKKwkJaWYgKDQmZGRicmVhZGwoRE1BX0JVRkZFUl9DT05UUk9MKGlucHV0LT5ucikpKQorCQkJcHJpbnRrKEtFUk5fRVJSICJPdmVyZmxvdyBpbnB1dCAlZFxuIiwgaW5wdXQtPm5yKTsKKwkJd2hpbGUgKGlucHV0LT5jYnVmICE9ICgoaW5wdXQtPnN0YXQgPj4gMTEpICYgMHgxZikKKwkJICAgICAgIHx8ICg0JmRkYnJlYWRsKERNQV9CVUZGRVJfQ09OVFJPTChpbnB1dC0+bnIpKSkpIHsKKwkJCWR2Yl9kbXhfc3dmaWx0ZXJfcGFja2V0cygmaW5wdXQtPmRlbXV4LAorCQkJCQkJIGlucHV0LT52YnVmW2lucHV0LT5jYnVmXSwKKwkJCQkJCSBpbnB1dC0+ZG1hX2J1Zl9zaXplIC8gMTg4KTsKKworCQkJaW5wdXQtPmNidWYgPSAoaW5wdXQtPmNidWYgKyAxKSAlIGlucHV0LT5kbWFfYnVmX251bTsKKwkJCWRkYndyaXRlbCgoaW5wdXQtPmNidWYgPDwgMTEpLAorCQkJCSAgRE1BX0JVRkZFUl9BQ0soaW5wdXQtPm5yKSk7CisJCQlpbnB1dC0+c3RhdCA9IGRkYnJlYWRsKERNQV9CVUZGRVJfQ1VSUkVOVChpbnB1dC0+bnIpKTsKKwkJICAgICAgIH0KKwl9CisJaWYgKGlucHV0LT5wb3J0LT5jbGFzcyA9PSBEREJfUE9SVF9DSSkKKwkJd2FrZV91cCgmaW5wdXQtPndxKTsKKwlzcGluX3VubG9jaygmaW5wdXQtPmxvY2spOworfQorCitzdGF0aWMgdm9pZCBvdXRwdXRfdGFza2xldCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGRkYl9vdXRwdXQgKm91dHB1dCA9IChzdHJ1Y3QgZGRiX291dHB1dCAqKSBkYXRhOworCXN0cnVjdCBkZGIgKmRldiA9IG91dHB1dC0+cG9ydC0+ZGV2OworCisJc3Bpbl9sb2NrKCZvdXRwdXQtPmxvY2spOworCWlmICghb3V0cHV0LT5ydW5uaW5nKSB7CisJCXNwaW5fdW5sb2NrKCZvdXRwdXQtPmxvY2spOworCQlyZXR1cm47CisJfQorCW91dHB1dC0+c3RhdCA9IGRkYnJlYWRsKERNQV9CVUZGRVJfQ1VSUkVOVChvdXRwdXQtPm5yICsgOCkpOworCXdha2VfdXAoJm91dHB1dC0+d3EpOworCXNwaW5fdW5sb2NrKCZvdXRwdXQtPmxvY2spOworfQorCisKK3N0cnVjdCBjeGQyMDk5X2NmZyBjeGRfY2ZnID0geworCS5iaXRyYXRlID0gIDYyMDAwLAorCS5hZHIgICAgID0gIDB4NDAsCisJLnBvbGFyaXR5ID0gMSwKKwkuY2xvY2tfbW9kZSA9IDEsCit9OworCitzdGF0aWMgaW50IGRkYl9jaV9hdHRhY2goc3RydWN0IGRkYl9wb3J0ICpwb3J0KQoreworCWludCByZXQ7CisKKwlyZXQgPSBkdmJfcmVnaXN0ZXJfYWRhcHRlcigmcG9ydC0+b3V0cHV0LT5hZGFwLAorCQkJCSAgICJEREJyaWRnZSIsCisJCQkJICAgVEhJU19NT0RVTEUsCisJCQkJICAgJnBvcnQtPmRldi0+cGRldi0+ZGV2LAorCQkJCSAgIGFkYXB0ZXJfbnIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXBvcnQtPmVuID0gY3hkMjA5OV9hdHRhY2goJmN4ZF9jZmcsIHBvcnQsICZwb3J0LT5pMmMtPmFkYXApOworCWlmICghcG9ydC0+ZW4pIHsKKwkJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcigmcG9ydC0+b3V0cHV0LT5hZGFwKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWRkYl9pbnB1dF9zdGFydChwb3J0LT5pbnB1dFswXSk7CisJZGRiX291dHB1dF9zdGFydChwb3J0LT5vdXRwdXQpOworCWR2Yl9jYV9lbjUwMjIxX2luaXQoJnBvcnQtPm91dHB1dC0+YWRhcCwKKwkJCSAgICBwb3J0LT5lbiwgMCwgMSk7CisJcmV0ID0gZHZiX3JlZ2lzdGVyX2RldmljZSgmcG9ydC0+b3V0cHV0LT5hZGFwLCAmcG9ydC0+b3V0cHV0LT5kZXYsCisJCQkJICAmZHZiZGV2X2NpLCAodm9pZCAqKSBwb3J0LT5vdXRwdXQsCisJCQkJICBEVkJfREVWSUNFX1NFQyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkZGJfcG9ydF9hdHRhY2goc3RydWN0IGRkYl9wb3J0ICpwb3J0KQoreworCWludCByZXQgPSAwOworCisJc3dpdGNoIChwb3J0LT5jbGFzcykgeworCWNhc2UgRERCX1BPUlRfVFVORVI6CisJCXJldCA9IGR2Yl9pbnB1dF9hdHRhY2gocG9ydC0+aW5wdXRbMF0pOworCQlpZiAocmV0IDwgMCkKKwkJCWJyZWFrOworCQlyZXQgPSBkdmJfaW5wdXRfYXR0YWNoKHBvcnQtPmlucHV0WzFdKTsKKwkJYnJlYWs7CisJY2FzZSBEREJfUE9SVF9DSToKKwkJcmV0ID0gZGRiX2NpX2F0dGFjaChwb3J0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWlmIChyZXQgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgInBvcnRfYXR0YWNoIG9uIHBvcnQgJWQgZmFpbGVkXG4iLCBwb3J0LT5ucik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkZGJfcG9ydHNfYXR0YWNoKHN0cnVjdCBkZGIgKmRldikKK3sKKwlpbnQgaSwgcmV0ID0gMDsKKwlzdHJ1Y3QgZGRiX3BvcnQgKnBvcnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgZGV2LT5pbmZvLT5wb3J0X251bTsgaSsrKSB7CisJCXBvcnQgPSAmZGV2LT5wb3J0W2ldOworCQlyZXQgPSBkZGJfcG9ydF9hdHRhY2gocG9ydCk7CisJCWlmIChyZXQgPCAwKQorCQkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGRkYl9wb3J0c19kZXRhY2goc3RydWN0IGRkYiAqZGV2KQoreworCWludCBpOworCXN0cnVjdCBkZGJfcG9ydCAqcG9ydDsKKworCWZvciAoaSA9IDA7IGkgPCBkZXYtPmluZm8tPnBvcnRfbnVtOyBpKyspIHsKKwkJcG9ydCA9ICZkZXYtPnBvcnRbaV07CisJCXN3aXRjaCAocG9ydC0+Y2xhc3MpIHsKKwkJY2FzZSBEREJfUE9SVF9UVU5FUjoKKwkJCWR2Yl9pbnB1dF9kZXRhY2gocG9ydC0+aW5wdXRbMF0pOworCQkJZHZiX2lucHV0X2RldGFjaChwb3J0LT5pbnB1dFsxXSk7CisJCQlicmVhazsKKwkJY2FzZSBEREJfUE9SVF9DSToKKwkJCWlmIChwb3J0LT5vdXRwdXQtPmRldikKKwkJCQlkdmJfdW5yZWdpc3Rlcl9kZXZpY2UocG9ydC0+b3V0cHV0LT5kZXYpOworCQkJaWYgKHBvcnQtPmVuKSB7CisJCQkJZGRiX2lucHV0X3N0b3AocG9ydC0+aW5wdXRbMF0pOworCQkJCWRkYl9vdXRwdXRfc3RvcChwb3J0LT5vdXRwdXQpOworCQkJCWR2Yl9jYV9lbjUwMjIxX3JlbGVhc2UocG9ydC0+ZW4pOworCQkJCWtmcmVlKHBvcnQtPmVuKTsKKwkJCQlwb3J0LT5lbiA9IDA7CisJCQkJZHZiX3VucmVnaXN0ZXJfYWRhcHRlcigmcG9ydC0+b3V0cHV0LT5hZGFwKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IHBvcnRfaGFzX2NpKHN0cnVjdCBkZGJfcG9ydCAqcG9ydCkKK3sKKwl1OCB2YWw7CisJcmV0dXJuIGkyY19yZWFkX3JlZygmcG9ydC0+aTJjLT5hZGFwLCAweDQwLCAwLCAmdmFsKSA/IDAgOiAxOworfQorCitzdGF0aWMgaW50IHBvcnRfaGFzX3N0djA5MDAoc3RydWN0IGRkYl9wb3J0ICpwb3J0KQoreworCXU4IHZhbDsKKwlpZiAoaTJjX3JlYWRfcmVnMTYoJnBvcnQtPmkyYy0+YWRhcCwgMHg2OSwgMHhmMTAwLCAmdmFsKSA8IDApCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHBvcnRfaGFzX3N0djA5MDBfYWEoc3RydWN0IGRkYl9wb3J0ICpwb3J0KQoreworCXU4IHZhbDsKKwlpZiAoaTJjX3JlYWRfcmVnMTYoJnBvcnQtPmkyYy0+YWRhcCwgMHg2OCwgMHhmMTAwLCAmdmFsKSA8IDApCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHBvcnRfaGFzX2RyeGtzKHN0cnVjdCBkZGJfcG9ydCAqcG9ydCkKK3sKKwl1OCB2YWw7CisJaWYgKGkyY19yZWFkKCZwb3J0LT5pMmMtPmFkYXAsIDB4MjksICZ2YWwpIDwgMCkKKwkJcmV0dXJuIDA7CisJaWYgKGkyY19yZWFkKCZwb3J0LT5pMmMtPmFkYXAsIDB4MmEsICZ2YWwpIDwgMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGRkYl9wb3J0X3Byb2JlKHN0cnVjdCBkZGJfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgZGRiICpkZXYgPSBwb3J0LT5kZXY7CisJY2hhciAqbW9kbmFtZSA9ICJOTyBNT0RVTEUiOworCisJcG9ydC0+Y2xhc3MgPSBEREJfUE9SVF9OT05FOworCisJaWYgKHBvcnRfaGFzX2NpKHBvcnQpKSB7CisJCW1vZG5hbWUgPSAiQ0kiOworCQlwb3J0LT5jbGFzcyA9IEREQl9QT1JUX0NJOworCQlkZGJ3cml0ZWwoSTJDX1NQRUVEXzQwMCwgcG9ydC0+aTJjLT5yZWdzICsgSTJDX1RJTUlORyk7CisJfSBlbHNlIGlmIChwb3J0X2hhc19zdHYwOTAwKHBvcnQpKSB7CisJCW1vZG5hbWUgPSAiRFVBTCBEVkItUzIiOworCQlwb3J0LT5jbGFzcyA9IEREQl9QT1JUX1RVTkVSOworCQlwb3J0LT50eXBlID0gRERCX1RVTkVSX0RWQlNfU1Q7CisJCWRkYndyaXRlbChJMkNfU1BFRURfMTAwLCBwb3J0LT5pMmMtPnJlZ3MgKyBJMkNfVElNSU5HKTsKKwl9IGVsc2UgaWYgKHBvcnRfaGFzX3N0djA5MDBfYWEocG9ydCkpIHsKKwkJbW9kbmFtZSA9ICJEVUFMIERWQi1TMiI7CisJCXBvcnQtPmNsYXNzID0gRERCX1BPUlRfVFVORVI7CisJCXBvcnQtPnR5cGUgPSBEREJfVFVORVJfRFZCU19TVF9BQTsKKwkJZGRid3JpdGVsKEkyQ19TUEVFRF8xMDAsIHBvcnQtPmkyYy0+cmVncyArIEkyQ19USU1JTkcpOworCX0gZWxzZSBpZiAocG9ydF9oYXNfZHJ4a3MocG9ydCkpIHsKKwkJbW9kbmFtZSA9ICJEVUFMIERWQi1DL1QiOworCQlwb3J0LT5jbGFzcyA9IEREQl9QT1JUX1RVTkVSOworCQlwb3J0LT50eXBlID0gRERCX1RVTkVSX0RWQkNUX1RSOworCQlkZGJ3cml0ZWwoSTJDX1NQRUVEXzQwMCwgcG9ydC0+aTJjLT5yZWdzICsgSTJDX1RJTUlORyk7CisJfQorCXByaW50ayhLRVJOX0lORk8gIlBvcnQgJWQgKFRBQiAlZCk6ICVzXG4iLAorCQkJIHBvcnQtPm5yLCBwb3J0LT5ucisxLCBtb2RuYW1lKTsKK30KKworc3RhdGljIHZvaWQgZGRiX2lucHV0X2luaXQoc3RydWN0IGRkYl9wb3J0ICpwb3J0LCBpbnQgbnIpCit7CisJc3RydWN0IGRkYiAqZGV2ID0gcG9ydC0+ZGV2OworCXN0cnVjdCBkZGJfaW5wdXQgKmlucHV0ID0gJmRldi0+aW5wdXRbbnJdOworCisJaW5wdXQtPm5yID0gbnI7CisJaW5wdXQtPnBvcnQgPSBwb3J0OworCWlucHV0LT5kbWFfYnVmX251bSA9IElOUFVUX0RNQV9CVUZTOworCWlucHV0LT5kbWFfYnVmX3NpemUgPSBJTlBVVF9ETUFfU0laRTsKKwlkZGJ3cml0ZWwoMCwgVFNfSU5QVVRfQ09OVFJPTChucikpOworCWRkYndyaXRlbCgyLCBUU19JTlBVVF9DT05UUk9MKG5yKSk7CisJZGRid3JpdGVsKDAsIFRTX0lOUFVUX0NPTlRST0wobnIpKTsKKwlkZGJ3cml0ZWwoMCwgRE1BX0JVRkZFUl9BQ0sobnIpKTsKKwl0YXNrbGV0X2luaXQoJmlucHV0LT50YXNrbGV0LCBpbnB1dF90YXNrbGV0LCAodW5zaWduZWQgbG9uZykgaW5wdXQpOworCXNwaW5fbG9ja19pbml0KCZpbnB1dC0+bG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5wdXQtPndxKTsKK30KKworc3RhdGljIHZvaWQgZGRiX291dHB1dF9pbml0KHN0cnVjdCBkZGJfcG9ydCAqcG9ydCwgaW50IG5yKQoreworCXN0cnVjdCBkZGIgKmRldiA9IHBvcnQtPmRldjsKKwlzdHJ1Y3QgZGRiX291dHB1dCAqb3V0cHV0ID0gJmRldi0+b3V0cHV0W25yXTsKKwlvdXRwdXQtPm5yID0gbnI7CisJb3V0cHV0LT5wb3J0ID0gcG9ydDsKKwlvdXRwdXQtPmRtYV9idWZfbnVtID0gT1VUUFVUX0RNQV9CVUZTOworCW91dHB1dC0+ZG1hX2J1Zl9zaXplID0gT1VUUFVUX0RNQV9TSVpFOworCisJZGRid3JpdGVsKDAsIFRTX09VVFBVVF9DT05UUk9MKG5yKSk7CisJZGRid3JpdGVsKDIsIFRTX09VVFBVVF9DT05UUk9MKG5yKSk7CisJZGRid3JpdGVsKDAsIFRTX09VVFBVVF9DT05UUk9MKG5yKSk7CisJdGFza2xldF9pbml0KCZvdXRwdXQtPnRhc2tsZXQsIG91dHB1dF90YXNrbGV0LCAodW5zaWduZWQgbG9uZykgb3V0cHV0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZvdXRwdXQtPndxKTsKK30KKworc3RhdGljIHZvaWQgZGRiX3BvcnRzX2luaXQoc3RydWN0IGRkYiAqZGV2KQoreworCWludCBpOworCXN0cnVjdCBkZGJfcG9ydCAqcG9ydDsKKworCWZvciAoaSA9IDA7IGkgPCBkZXYtPmluZm8tPnBvcnRfbnVtOyBpKyspIHsKKwkJcG9ydCA9ICZkZXYtPnBvcnRbaV07CisJCXBvcnQtPmRldiA9IGRldjsKKwkJcG9ydC0+bnIgPSBpOworCQlwb3J0LT5pMmMgPSAmZGV2LT5pMmNbaV07CisJCXBvcnQtPmlucHV0WzBdID0gJmRldi0+aW5wdXRbMiAqIGldOworCQlwb3J0LT5pbnB1dFsxXSA9ICZkZXYtPmlucHV0WzIgKiBpICsgMV07CisJCXBvcnQtPm91dHB1dCA9ICZkZXYtPm91dHB1dFtpXTsKKworCQltdXRleF9pbml0KCZwb3J0LT5pMmNfZ2F0ZV9sb2NrKTsKKwkJZGRiX3BvcnRfcHJvYmUocG9ydCk7CisJCWRkYl9pbnB1dF9pbml0KHBvcnQsIDIgKiBpKTsKKwkJZGRiX2lucHV0X2luaXQocG9ydCwgMiAqIGkgKyAxKTsKKwkJZGRiX291dHB1dF9pbml0KHBvcnQsIGkpOworCX0KK30KKworc3RhdGljIHZvaWQgZGRiX3BvcnRzX3JlbGVhc2Uoc3RydWN0IGRkYiAqZGV2KQoreworCWludCBpOworCXN0cnVjdCBkZGJfcG9ydCAqcG9ydDsKKworCWZvciAoaSA9IDA7IGkgPCBkZXYtPmluZm8tPnBvcnRfbnVtOyBpKyspIHsKKwkJcG9ydCA9ICZkZXYtPnBvcnRbaV07CisJCXBvcnQtPmRldiA9IGRldjsKKwkJdGFza2xldF9raWxsKCZwb3J0LT5pbnB1dFswXS0+dGFza2xldCk7CisJCXRhc2tsZXRfa2lsbCgmcG9ydC0+aW5wdXRbMV0tPnRhc2tsZXQpOworCQl0YXNrbGV0X2tpbGwoJnBvcnQtPm91dHB1dC0+dGFza2xldCk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGlycV9oYW5kbGVfaTJjKHN0cnVjdCBkZGIgKmRldiwgaW50IG4pCit7CisJc3RydWN0IGRkYl9pMmMgKmkyYyA9ICZkZXYtPmkyY1tuXTsKKworCWkyYy0+ZG9uZSA9IDE7CisJd2FrZV91cCgmaTJjLT53cSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBpcnFfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCit7CisJc3RydWN0IGRkYiAqZGV2ID0gKHN0cnVjdCBkZGIgKikgZGV2X2lkOworCXUzMiBzID0gZGRicmVhZGwoSU5URVJSVVBUX1NUQVRVUyk7CisKKwlpZiAoIXMpCisJCXJldHVybiBJUlFfTk9ORTsKKworCWRvIHsKKwkJZGRid3JpdGVsKHMsIElOVEVSUlVQVF9BQ0spOworCisJCWlmIChzICYgMHgwMDAwMDAwMSkKKwkJCWlycV9oYW5kbGVfaTJjKGRldiwgMCk7CisJCWlmIChzICYgMHgwMDAwMDAwMikKKwkJCWlycV9oYW5kbGVfaTJjKGRldiwgMSk7CisJCWlmIChzICYgMHgwMDAwMDAwNCkKKwkJCWlycV9oYW5kbGVfaTJjKGRldiwgMik7CisJCWlmIChzICYgMHgwMDAwMDAwOCkKKwkJCWlycV9oYW5kbGVfaTJjKGRldiwgMyk7CisKKwkJaWYgKHMgJiAweDAwMDAwMTAwKQorCQkJdGFza2xldF9zY2hlZHVsZSgmZGV2LT5pbnB1dFswXS50YXNrbGV0KTsKKwkJaWYgKHMgJiAweDAwMDAwMjAwKQorCQkJdGFza2xldF9zY2hlZHVsZSgmZGV2LT5pbnB1dFsxXS50YXNrbGV0KTsKKwkJaWYgKHMgJiAweDAwMDAwNDAwKQorCQkJdGFza2xldF9zY2hlZHVsZSgmZGV2LT5pbnB1dFsyXS50YXNrbGV0KTsKKwkJaWYgKHMgJiAweDAwMDAwODAwKQorCQkJdGFza2xldF9zY2hlZHVsZSgmZGV2LT5pbnB1dFszXS50YXNrbGV0KTsKKwkJaWYgKHMgJiAweDAwMDAxMDAwKQorCQkJdGFza2xldF9zY2hlZHVsZSgmZGV2LT5pbnB1dFs0XS50YXNrbGV0KTsKKwkJaWYgKHMgJiAweDAwMDAyMDAwKQorCQkJdGFza2xldF9zY2hlZHVsZSgmZGV2LT5pbnB1dFs1XS50YXNrbGV0KTsKKwkJaWYgKHMgJiAweDAwMDA0MDAwKQorCQkJdGFza2xldF9zY2hlZHVsZSgmZGV2LT5pbnB1dFs2XS50YXNrbGV0KTsKKwkJaWYgKHMgJiAweDAwMDA4MDAwKQorCQkJdGFza2xldF9zY2hlZHVsZSgmZGV2LT5pbnB1dFs3XS50YXNrbGV0KTsKKworCQlpZiAocyAmIDB4MDAwMTAwMDApCisJCQl0YXNrbGV0X3NjaGVkdWxlKCZkZXYtPm91dHB1dFswXS50YXNrbGV0KTsKKwkJaWYgKHMgJiAweDAwMDIwMDAwKQorCQkJdGFza2xldF9zY2hlZHVsZSgmZGV2LT5vdXRwdXRbMV0udGFza2xldCk7CisJCWlmIChzICYgMHgwMDA0MDAwMCkKKwkJCXRhc2tsZXRfc2NoZWR1bGUoJmRldi0+b3V0cHV0WzJdLnRhc2tsZXQpOworCQlpZiAocyAmIDB4MDAwODAwMDApCisJCQl0YXNrbGV0X3NjaGVkdWxlKCZkZXYtPm91dHB1dFszXS50YXNrbGV0KTsKKworCQkvKiBpZiAocyAmIDB4MDAwZjAwMDApCXByaW50ayhLRVJOX0RFQlVHICIlMDh4XG4iLCBpc3RhdCk7ICovCisJfSB3aGlsZSAoKHMgPSBkZGJyZWFkbChJTlRFUlJVUFRfU1RBVFVTKSkpOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgZmxhc2hpbyhzdHJ1Y3QgZGRiICpkZXYsIHU4ICp3YnVmLCB1MzIgd2xlbiwgdTggKnJidWYsIHUzMiBybGVuKQoreworCXUzMiBkYXRhLCBzaGlmdDsKKworCWlmICh3bGVuID4gNCkKKwkJZGRid3JpdGVsKDEsIFNQSV9DT05UUk9MKTsKKwl3aGlsZSAod2xlbiA+IDQpIHsKKwkJLyogRklYTUU6IGNoZWNrIGZvciBiaWctZW5kaWFuICovCisJCWRhdGEgPSBzd2FiMzIoKih1MzIgKil3YnVmKTsKKwkJd2J1ZiArPSA0OworCQl3bGVuIC09IDQ7CisJCWRkYndyaXRlbChkYXRhLCBTUElfREFUQSk7CisJCXdoaWxlIChkZGJyZWFkbChTUElfQ09OVFJPTCkgJiAweDAwMDQpCisJCQk7CisJfQorCisJaWYgKHJsZW4pCisJCWRkYndyaXRlbCgweDAwMDEgfCAoKHdsZW4gPDwgKDggKyAzKSkgJiAweDFmMDApLCBTUElfQ09OVFJPTCk7CisJZWxzZQorCQlkZGJ3cml0ZWwoMHgwMDAzIHwgKCh3bGVuIDw8ICg4ICsgMykpICYgMHgxZjAwKSwgU1BJX0NPTlRST0wpOworCisJZGF0YSA9IDA7CisJc2hpZnQgPSAoKDQgLSB3bGVuKSAqIDgpOworCXdoaWxlICh3bGVuKSB7CisJCWRhdGEgPDw9IDg7CisJCWRhdGEgfD0gKndidWY7CisJCXdsZW4tLTsKKwkJd2J1ZisrOworCX0KKwlpZiAoc2hpZnQpCisJCWRhdGEgPDw9IHNoaWZ0OworCWRkYndyaXRlbChkYXRhLCBTUElfREFUQSk7CisJd2hpbGUgKGRkYnJlYWRsKFNQSV9DT05UUk9MKSAmIDB4MDAwNCkKKwkJOworCisJaWYgKCFybGVuKSB7CisJCWRkYndyaXRlbCgwLCBTUElfQ09OVFJPTCk7CisJCXJldHVybiAwOworCX0KKwlpZiAocmxlbiA+IDQpCisJCWRkYndyaXRlbCgxLCBTUElfQ09OVFJPTCk7CisKKwl3aGlsZSAocmxlbiA+IDQpIHsKKwkJZGRid3JpdGVsKDB4ZmZmZmZmZmYsIFNQSV9EQVRBKTsKKwkJd2hpbGUgKGRkYnJlYWRsKFNQSV9DT05UUk9MKSAmIDB4MDAwNCkKKwkJCTsKKwkJZGF0YSA9IGRkYnJlYWRsKFNQSV9EQVRBKTsKKwkJKih1MzIgKikgcmJ1ZiA9IHN3YWIzMihkYXRhKTsKKwkJcmJ1ZiArPSA0OworCQlybGVuIC09IDQ7CisJfQorCWRkYndyaXRlbCgweDAwMDMgfCAoKHJsZW4gPDwgKDggKyAzKSkgJiAweDFGMDApLCBTUElfQ09OVFJPTCk7CisJZGRid3JpdGVsKDB4ZmZmZmZmZmYsIFNQSV9EQVRBKTsKKwl3aGlsZSAoZGRicmVhZGwoU1BJX0NPTlRST0wpICYgMHgwMDA0KQorCQk7CisKKwlkYXRhID0gZGRicmVhZGwoU1BJX0RBVEEpOworCWRkYndyaXRlbCgwLCBTUElfQ09OVFJPTCk7CisKKwlpZiAocmxlbiA8IDQpCisJCWRhdGEgPDw9ICgoNCAtIHJsZW4pICogOCk7CisKKwl3aGlsZSAocmxlbiA+IDApIHsKKwkJKnJidWYgPSAoKGRhdGEgPj4gMjQpICYgMHhmZik7CisJCWRhdGEgPDw9IDg7CisJCXJidWYrKzsKKwkJcmxlbi0tOworCX0KKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBEREJfTUFHSUMgJ2QnCisKK3N0cnVjdCBkZGJfZmxhc2hpbyB7CisJX191OCAqd3JpdGVfYnVmOworCV9fdTMyIHdyaXRlX2xlbjsKKwlfX3U4ICpyZWFkX2J1ZjsKKwlfX3UzMiByZWFkX2xlbjsKK307CisKKyNkZWZpbmUgSU9DVExfRERCX0ZMQVNISU8gIF9JT1dSKEREQl9NQUdJQywgMHgwMCwgc3RydWN0IGRkYl9mbGFzaGlvKQorCisjZGVmaW5lIEREQl9OQU1FICJkZGJyaWRnZSIKKworc3RhdGljIHUzMiBkZGJfbnVtOworc3RhdGljIHN0cnVjdCBkZGIgKmRkYnNbMzJdOworc3RhdGljIHN0cnVjdCBjbGFzcyAqZGRiX2NsYXNzOworc3RhdGljIGludCBkZGJfbWFqb3I7CisKK3N0YXRpYyBpbnQgZGRiX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGRkYiAqZGV2ID0gZGRic1tpbWlub3IoaW5vZGUpXTsKKworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGRldjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGxvbmcgZGRiX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZGRiICpkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdm9pZCAqcGFyZyA9ICh2b2lkICopYXJnOworCWludCByZXMgPSAtRUZBVUxUOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIElPQ1RMX0REQl9GTEFTSElPOgorCXsKKwkJc3RydWN0IGRkYl9mbGFzaGlvIGZpbzsKKwkJdTggKnJidWYsICp3YnVmOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmZmlvLCBwYXJnLCBzaXplb2YoZmlvKSkpCisJCQlicmVhazsKKwkJaWYgKGZpby53cml0ZV9sZW4gKyBmaW8ucmVhZF9sZW4gPiAxMDI4KSB7CisJCQlwcmludGsoS0VSTl9FUlIgIklPQlVGIHRvbyBzbWFsbFxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQl3YnVmID0gJmRldi0+aW9idWZbMF07CisJCWlmICghd2J1ZikKKwkJCXJldHVybiAtRU5PTUVNOworCQlyYnVmID0gd2J1ZiArIGZpby53cml0ZV9sZW47CisJCWlmIChjb3B5X2Zyb21fdXNlcih3YnVmLCBmaW8ud3JpdGVfYnVmLCBmaW8ud3JpdGVfbGVuKSkgeworCQkJdmZyZWUod2J1Zik7CisJCQlicmVhazsKKwkJfQorCQlyZXMgPSBmbGFzaGlvKGRldiwgd2J1ZiwgZmlvLndyaXRlX2xlbiwKKwkJCSAgICAgIHJidWYsIGZpby5yZWFkX2xlbik7CisJCWlmIChjb3B5X3RvX3VzZXIoZmlvLnJlYWRfYnVmLCByYnVmLCBmaW8ucmVhZF9sZW4pKQorCQkJcmVzID0gLUVGQVVMVDsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkZGJfZm9wcyA9IHsKKwkudW5sb2NrZWRfaW9jdGwgPSBkZGJfaW9jdGwsCisJLm9wZW4gICAgICAgICAgID0gZGRiX29wZW4sCit9OworCitzdGF0aWMgY2hhciAqZGRiX2Rldm5vZGUoc3RydWN0IGRldmljZSAqZGV2aWNlLCBtb2RlX3QgKm1vZGUpCit7CisJc3RydWN0IGRkYiAqZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldmljZSk7CisKKwlyZXR1cm4ga2FzcHJpbnRmKEdGUF9LRVJORUwsICJkZGJyaWRnZS9jYXJkJWQiLCBkZXYtPm5yKTsKK30KKworc3RhdGljIGludCBkZGJfY2xhc3NfY3JlYXRlKHZvaWQpCit7CisJZGRiX21ham9yID0gcmVnaXN0ZXJfY2hyZGV2KDAsIEREQl9OQU1FLCAmZGRiX2ZvcHMpOworCWlmIChkZGJfbWFqb3IgPCAwKQorCQlyZXR1cm4gZGRiX21ham9yOworCisJZGRiX2NsYXNzID0gY2xhc3NfY3JlYXRlKFRISVNfTU9EVUxFLCBEREJfTkFNRSk7CisJaWYgKElTX0VSUihkZGJfY2xhc3MpKSB7CisJCXVucmVnaXN0ZXJfY2hyZGV2KGRkYl9tYWpvciwgRERCX05BTUUpOworCQlyZXR1cm4gLTE7CisJfQorCWRkYl9jbGFzcy0+ZGV2bm9kZSA9IGRkYl9kZXZub2RlOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkZGJfY2xhc3NfZGVzdHJveSh2b2lkKQoreworCWNsYXNzX2Rlc3Ryb3koZGRiX2NsYXNzKTsKKwl1bnJlZ2lzdGVyX2NocmRldihkZGJfbWFqb3IsIEREQl9OQU1FKTsKK30KKworc3RhdGljIGludCBkZGJfZGV2aWNlX2NyZWF0ZShzdHJ1Y3QgZGRiICpkZXYpCit7CisJZGV2LT5uciA9IGRkYl9udW0rKzsKKwlkZXYtPmRkYl9kZXYgPSBkZXZpY2VfY3JlYXRlKGRkYl9jbGFzcywgTlVMTCwKKwkJCQkgICAgIE1LREVWKGRkYl9tYWpvciwgZGV2LT5uciksCisJCQkJICAgICBkZXYsICJkZGJyaWRnZSVkIiwgZGV2LT5ucik7CisJZGRic1tkZXYtPm5yXSA9IGRldjsKKwlpZiAoSVNfRVJSKGRldi0+ZGRiX2RldikpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGRiX2RldmljZV9kZXN0cm95KHN0cnVjdCBkZGIgKmRldikKK3sKKwlkZGJfbnVtLS07CisJaWYgKElTX0VSUihkZXYtPmRkYl9kZXYpKQorCQlyZXR1cm47CisJZGV2aWNlX2Rlc3Ryb3koZGRiX2NsYXNzLCBNS0RFVihkZGJfbWFqb3IsIDApKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGRkYl91bm1hcChzdHJ1Y3QgZGRiICpkZXYpCit7CisJaWYgKGRldi0+cmVncykKKwkJaW91bm1hcChkZXYtPnJlZ3MpOworCXZmcmVlKGRldik7Cit9CisKKworc3RhdGljIHZvaWQgX19kZXZleGl0IGRkYl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGRkYiAqZGV2ID0gKHN0cnVjdCBkZGIgKikgcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCisJZGRiX3BvcnRzX2RldGFjaChkZXYpOworCWRkYl9pMmNfcmVsZWFzZShkZXYpOworCisJZGRid3JpdGVsKDAsIElOVEVSUlVQVF9FTkFCTEUpOworCWZyZWVfaXJxKGRldi0+cGRldi0+aXJxLCBkZXYpOworI2lmZGVmIENPTkZJR19QQ0lfTVNJCisJaWYgKGRldi0+bXNpKQorCQlwY2lfZGlzYWJsZV9tc2koZGV2LT5wZGV2KTsKKyNlbmRpZgorCWRkYl9wb3J0c19yZWxlYXNlKGRldik7CisJZGRiX2J1ZmZlcnNfZnJlZShkZXYpOworCWRkYl9kZXZpY2VfZGVzdHJveShkZXYpOworCisJZGRiX3VubWFwKGRldik7CisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIDApOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKK30KKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkZGJfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBkZGIgKmRldjsKKwlpbnQgc3RhdCA9IDA7CisJaW50IGlycV9mbGFnID0gSVJRRl9TSEFSRUQ7CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikgPCAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRldiA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZGIpKTsKKwlpZiAoZGV2ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChkZXYsIDAsIHNpemVvZihzdHJ1Y3QgZGRiKSk7CisKKwlkZXYtPnBkZXYgPSBwZGV2OworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOworCWRldi0+aW5mbyA9IChzdHJ1Y3QgZGRiX2luZm8gKikgaWQtPmRyaXZlcl9kYXRhOworCXByaW50ayhLRVJOX0lORk8gIkREQnJpZGdlIGRyaXZlciBkZXRlY3RlZDogJXNcbiIsIGRldi0+aW5mby0+bmFtZSk7CisKKwlkZXYtPnJlZ3MgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDApLAorCQkJICAgIHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAwKSk7CisJaWYgKCFkZXYtPnJlZ3MpIHsKKwkJc3RhdCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiSFcgJTA4eCBGVyAlMDh4XG4iLCBkZGJyZWFkbCgwKSwgZGRicmVhZGwoNCkpOworCisjaWZkZWYgQ09ORklHX1BDSV9NU0kKKwlpZiAocGNpX21zaV9lbmFibGVkKCkpCisJCXN0YXQgPSBwY2lfZW5hYmxlX21zaShkZXYtPnBkZXYpOworCWlmIChzdGF0KSB7CisJCXByaW50ayhLRVJOX0lORk8gIjogTVNJIG5vdCBhdmFpbGFibGUuXG4iKTsKKwl9IGVsc2UgeworCQlpcnFfZmxhZyA9IDA7CisJCWRldi0+bXNpID0gMTsKKwl9CisjZW5kaWYKKwlzdGF0ID0gcmVxdWVzdF9pcnEoZGV2LT5wZGV2LT5pcnEsIGlycV9oYW5kbGVyLAorCQkJICAgaXJxX2ZsYWcsICJEREJyaWRnZSIsICh2b2lkICopIGRldik7CisJaWYgKHN0YXQgPCAwKQorCQlnb3RvIGZhaWwxOworCWRkYndyaXRlbCgwLCBETUFfQkFTRV9XUklURSk7CisJZGRid3JpdGVsKDAsIERNQV9CQVNFX1JFQUQpOworCWRkYndyaXRlbCgweGZmZmZmZmZmLCBJTlRFUlJVUFRfQUNLKTsKKwlkZGJ3cml0ZWwoMHhmZmYwZiwgSU5URVJSVVBUX0VOQUJMRSk7CisJZGRid3JpdGVsKDAsIE1TSTFfRU5BQkxFKTsKKworCWlmIChkZGJfaTJjX2luaXQoZGV2KSA8IDApCisJCWdvdG8gZmFpbDE7CisJZGRiX3BvcnRzX2luaXQoZGV2KTsKKwlpZiAoZGRiX2J1ZmZlcnNfYWxsb2MoZGV2KSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiOiBDb3VsZCBub3QgYWxsb2NhdGUgYnVmZmVyIG1lbW9yeVxuIik7CisJCWdvdG8gZmFpbDI7CisJfQorCWlmIChkZGJfcG9ydHNfYXR0YWNoKGRldikgPCAwKQorCQlnb3RvIGZhaWwzOworCWRkYl9kZXZpY2VfY3JlYXRlKGRldik7CisJcmV0dXJuIDA7CisKK2ZhaWwzOgorCWRkYl9wb3J0c19kZXRhY2goZGV2KTsKKwlwcmludGsoS0VSTl9FUlIgImZhaWwzXG4iKTsKKwlkZGJfcG9ydHNfcmVsZWFzZShkZXYpOworZmFpbDI6CisJcHJpbnRrKEtFUk5fRVJSICJmYWlsMlxuIik7CisJZGRiX2J1ZmZlcnNfZnJlZShkZXYpOworZmFpbDE6CisJcHJpbnRrKEtFUk5fRVJSICJmYWlsMVxuIik7CisJaWYgKGRldi0+bXNpKQorCQlwY2lfZGlzYWJsZV9tc2koZGV2LT5wZGV2KTsKKwlmcmVlX2lycShkZXYtPnBkZXYtPmlycSwgZGV2KTsKK2ZhaWw6CisJcHJpbnRrKEtFUk5fRVJSICJmYWlsXG4iKTsKKwlkZGJfdW5tYXAoZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgMCk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiAtMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IGRkYl9pbmZvIGRkYl9ub25lID0geworCS50eXBlICAgICA9IEREQl9OT05FLAorCS5uYW1lICAgICA9ICJEaWdpdGFsIERldmljZXMgUENJZSBicmlkZ2UiLAorfTsKKworc3RhdGljIHN0cnVjdCBkZGJfaW5mbyBkZGJfb2N0b3B1cyA9IHsKKwkudHlwZSAgICAgPSBEREJfT0NUT1BVUywKKwkubmFtZSAgICAgPSAiRGlnaXRhbCBEZXZpY2VzIE9jdG9wdXMgRFZCIGFkYXB0ZXIiLAorCS5wb3J0X251bSA9IDQsCit9OworCitzdGF0aWMgc3RydWN0IGRkYl9pbmZvIGRkYl9vY3RvcHVzX2xlID0geworCS50eXBlICAgICA9IEREQl9PQ1RPUFVTLAorCS5uYW1lICAgICA9ICJEaWdpdGFsIERldmljZXMgT2N0b3B1cyBMRSBEVkIgYWRhcHRlciIsCisJLnBvcnRfbnVtID0gMiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGRiX2luZm8gZGRiX3Y2ID0geworCS50eXBlICAgICA9IEREQl9PQ1RPUFVTLAorCS5uYW1lICAgICA9ICJEaWdpdGFsIERldmljZXMgQ2luZSBTMiBWNiBEVkIgYWRhcHRlciIsCisJLnBvcnRfbnVtID0gMywKK307CisKKyNkZWZpbmUgRERWSUQgMHhkZDAxIC8qIERpZ2l0YWwgRGV2aWNlcyBWZW5kb3IgSUQgKi8KKworI2RlZmluZSBEREJfSUQoX3ZlbmQsIF9kZXYsIF9zdWJ2ZW5kLCBfc3ViZGV2LCBfZHJpdmVyZGF0YSkgewlcCisJLnZlbmRvciAgICAgID0gX3ZlbmQsICAgIC5kZXZpY2UgICAgPSBfZGV2LCBcCisJLnN1YnZlbmRvciAgID0gX3N1YnZlbmQsIC5zdWJkZXZpY2UgPSBfc3ViZGV2LCBcCisJLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcpJl9kcml2ZXJkYXRhIH0KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkIGRkYl9pZF90YmxbXSBfX2RldmluaXRkYXRhID0geworCUREQl9JRChERFZJRCwgMHgwMDAyLCBERFZJRCwgMHgwMDAxLCBkZGJfb2N0b3B1cyksCisJRERCX0lEKEREVklELCAweDAwMDMsIEREVklELCAweDAwMDEsIGRkYl9vY3RvcHVzKSwKKwlEREJfSUQoRERWSUQsIDB4MDAwMywgRERWSUQsIDB4MDAwMiwgZGRiX29jdG9wdXNfbGUpLAorCUREQl9JRChERFZJRCwgMHgwMDAzLCBERFZJRCwgMHgwMDEwLCBkZGJfb2N0b3B1cyksCisJRERCX0lEKEREVklELCAweDAwMDMsIEREVklELCAweDAwMjAsIGRkYl92NiksCisJLyogaW4gY2FzZSBzdWItaWRzIGdvdCBkZWxldGVkIGluIGZsYXNoICovCisJRERCX0lEKEREVklELCAweDAwMDMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGRkYl9ub25lKSwKKwl7MH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgZGRiX2lkX3RibCk7CisKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGRkYl9wY2lfZHJpdmVyID0geworCS5uYW1lICAgICAgICA9ICJEREJyaWRnZSIsCisJLmlkX3RhYmxlICAgID0gZGRiX2lkX3RibCwKKwkucHJvYmUgICAgICAgPSBkZGJfcHJvYmUsCisJLnJlbW92ZSAgICAgID0gZGRiX3JlbW92ZSwKK307CisKK3N0YXRpYyBfX2luaXQgaW50IG1vZHVsZV9pbml0X2RkYnJpZGdlKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiRGlnaXRhbCBEZXZpY2VzIFBDSUUgYnJpZGdlIGRyaXZlciwgIgorCSAgICAgICAiQ29weXJpZ2h0IChDKSAyMDEwLTExIERpZ2l0YWwgRGV2aWNlcyBHbWJIXG4iKTsKKwlpZiAoZGRiX2NsYXNzX2NyZWF0ZSgpKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmRkYl9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIF9fZXhpdCB2b2lkIG1vZHVsZV9leGl0X2RkYnJpZGdlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZkZGJfcGNpX2RyaXZlcik7CisJZGRiX2NsYXNzX2Rlc3Ryb3koKTsKK30KKworbW9kdWxlX2luaXQobW9kdWxlX2luaXRfZGRicmlkZ2UpOworbW9kdWxlX2V4aXQobW9kdWxlX2V4aXRfZGRicmlkZ2UpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkRpZ2l0YWwgRGV2aWNlcyBQQ0llIEJyaWRnZSIpOworTU9EVUxFX0FVVEhPUigiUmFscGggTWV0emxlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oIjAuNSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZGRicmlkZ2UvZGRicmlkZ2UtcmVncy5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZGRicmlkZ2UvZGRicmlkZ2UtcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzY2NiMzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kZGJyaWRnZS9kZGJyaWRnZS1yZWdzLmgKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBkZGJyaWRnZS1yZWdzLmg6IERpZ2l0YWwgRGV2aWNlcyBQQ0llIGJyaWRnZSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBEaWdpdGFsIERldmljZXMgR21iSAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKiBPciwgcG9pbnQgeW91ciBicm93c2VyIHRvIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAorICovCisKKy8qIERELURWQkJyaWRnZVYxLmggMjczIDIwMTAtMDktMTcgMDU6MDM6MTZaIG1hbmZyZWQgKi8KKworLyogUmVnaXN0ZXIgRGVmaW5pdGlvbnMgKi8KKworI2RlZmluZSBDVVJfUkVHSVNURVJNQVBfVkVSU0lPTiAweDEwMDAwCisKKyNkZWZpbmUgSEFSRFdBUkVfVkVSU0lPTiAgICAgICAweDAwCisjZGVmaW5lIFJFR0lTVEVSTUFQX1ZFUlNJT04gICAgMHgwNAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBTUEkgQ29udHJvbGxlciAqLworCisjZGVmaW5lIFNQSV9DT05UUk9MICAgICAweDEwCisjZGVmaW5lIFNQSV9EQVRBICAgICAgICAweDE0CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogSW50ZXJydXB0IGNvbnRyb2xsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEhvdyBtYW55IE1TSSdzIGFyZSBhdmFpbGFibGUgZGVwZW5kcyBvbiBIVyAoTWluIDIgbWF4IDgpICovCisvKiBIb3cgbWFueSBhcmUgdXNhYmxlIGFsc28gZGVwZW5kcyBvbiBIb3N0IHBsYXRmb3JtICAgICAgICAqLworCisjZGVmaW5lIElOVEVSUlVQVF9CQVNFICAgKDB4NDApCisKKyNkZWZpbmUgSU5URVJSVVBUX0VOQUJMRSAoSU5URVJSVVBUX0JBU0UgKyAweDAwKQorI2RlZmluZSBNU0kwX0VOQUJMRSAgICAgIChJTlRFUlJVUFRfQkFTRSArIDB4MDApCisjZGVmaW5lIE1TSTFfRU5BQkxFICAgICAgKElOVEVSUlVQVF9CQVNFICsgMHgwNCkKKyNkZWZpbmUgTVNJMl9FTkFCTEUgICAgICAoSU5URVJSVVBUX0JBU0UgKyAweDA4KQorI2RlZmluZSBNU0kzX0VOQUJMRSAgICAgIChJTlRFUlJVUFRfQkFTRSArIDB4MEMpCisjZGVmaW5lIE1TSTRfRU5BQkxFICAgICAgKElOVEVSUlVQVF9CQVNFICsgMHgxMCkKKyNkZWZpbmUgTVNJNV9FTkFCTEUgICAgICAoSU5URVJSVVBUX0JBU0UgKyAweDE0KQorI2RlZmluZSBNU0k2X0VOQUJMRSAgICAgIChJTlRFUlJVUFRfQkFTRSArIDB4MTgpCisjZGVmaW5lIE1TSTdfRU5BQkxFICAgICAgKElOVEVSUlVQVF9CQVNFICsgMHgxQykKKworI2RlZmluZSBJTlRFUlJVUFRfU1RBVFVTIChJTlRFUlJVUFRfQkFTRSArIDB4MjApCisjZGVmaW5lIElOVEVSUlVQVF9BQ0sgICAgKElOVEVSUlVQVF9CQVNFICsgMHgyMCkKKworI2RlZmluZSBJTlRNQVNLX0kyQzEgICAgICAgICgweDAwMDAwMDAxKQorI2RlZmluZSBJTlRNQVNLX0kyQzIgICAgICAgICgweDAwMDAwMDAyKQorI2RlZmluZSBJTlRNQVNLX0kyQzMgICAgICAgICgweDAwMDAwMDA0KQorI2RlZmluZSBJTlRNQVNLX0kyQzQgICAgICAgICgweDAwMDAwMDA4KQorCisjZGVmaW5lIElOVE1BU0tfQ0lSUTEgICAgICAgKDB4MDAwMDAwMTApCisjZGVmaW5lIElOVE1BU0tfQ0lSUTIgICAgICAgKDB4MDAwMDAwMjApCisjZGVmaW5lIElOVE1BU0tfQ0lSUTMgICAgICAgKDB4MDAwMDAwNDApCisjZGVmaW5lIElOVE1BU0tfQ0lSUTQgICAgICAgKDB4MDAwMDAwODApCisKKyNkZWZpbmUgSU5UTUFTS19UU0lOUFVUMSAgICAoMHgwMDAwMDEwMCkKKyNkZWZpbmUgSU5UTUFTS19UU0lOUFVUMiAgICAoMHgwMDAwMDIwMCkKKyNkZWZpbmUgSU5UTUFTS19UU0lOUFVUMyAgICAoMHgwMDAwMDQwMCkKKyNkZWZpbmUgSU5UTUFTS19UU0lOUFVUNCAgICAoMHgwMDAwMDgwMCkKKyNkZWZpbmUgSU5UTUFTS19UU0lOUFVUNSAgICAoMHgwMDAwMTAwMCkKKyNkZWZpbmUgSU5UTUFTS19UU0lOUFVUNiAgICAoMHgwMDAwMjAwMCkKKyNkZWZpbmUgSU5UTUFTS19UU0lOUFVUNyAgICAoMHgwMDAwNDAwMCkKKyNkZWZpbmUgSU5UTUFTS19UU0lOUFVUOCAgICAoMHgwMDAwODAwMCkKKworI2RlZmluZSBJTlRNQVNLX1RTT1VUUFVUMSAgICgweDAwMDEwMDAwKQorI2RlZmluZSBJTlRNQVNLX1RTT1VUUFVUMiAgICgweDAwMDIwMDAwKQorI2RlZmluZSBJTlRNQVNLX1RTT1VUUFVUMyAgICgweDAwMDQwMDAwKQorI2RlZmluZSBJTlRNQVNLX1RTT1VUUFVUNCAgICgweDAwMDgwMDAwKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBJMkMgTWFzdGVyIENvbnRyb2xsZXIgKi8KKworI2RlZmluZSBJMkNfQkFTRSAgICAgICAgKDB4ODApICAvKiBCeXRlIG9mZnNldCAqLworCisjZGVmaW5lIEkyQ19DT01NQU5EICAgICAoMHgwMCkKKyNkZWZpbmUgSTJDX1RJTUlORyAgICAgICgweDA0KQorI2RlZmluZSBJMkNfVEFTS0xFTkdUSCAgKDB4MDgpICAgICAvKiBIaWdoIHJlYWQsIGxvdyB3cml0ZSAqLworI2RlZmluZSBJMkNfVEFTS0FERFJFU1MgKDB4MEMpICAgICAvKiBIaWdoIHJlYWQsIGxvdyB3cml0ZSAqLworCisjZGVmaW5lIEkyQ19NT05JVE9SICAgICAoMHgxQykKKworI2RlZmluZSBJMkNfQkFTRV8xICAgICAgKEkyQ19CQVNFICsgMHgwMCkKKyNkZWZpbmUgSTJDX0JBU0VfMiAgICAgIChJMkNfQkFTRSArIDB4MjApCisjZGVmaW5lIEkyQ19CQVNFXzMgICAgICAoSTJDX0JBU0UgKyAweDQwKQorI2RlZmluZSBJMkNfQkFTRV80ICAgICAgKEkyQ19CQVNFICsgMHg2MCkKKworI2RlZmluZSBJMkNfQkFTRV9OKGkpICAgKEkyQ19CQVNFICsgKGkpICogMHgyMCkKKworI2RlZmluZSBJMkNfVEFTS01FTV9CQVNFICAgICgweDEwMDApICAgIC8qIEJ5dGUgb2Zmc2V0ICovCisjZGVmaW5lIEkyQ19UQVNLTUVNX1NJWkUgICAgKDB4MTAwMCkKKworI2RlZmluZSBJMkNfU1BFRURfNDAwICAgKDB4MDQwMzA0MDQpCisjZGVmaW5lIEkyQ19TUEVFRF8yMDAgICAoMHgwOTA4MDkwOSkKKyNkZWZpbmUgSTJDX1NQRUVEXzE1NCAgICgweDBDMEIwQzBDKQorI2RlZmluZSBJMkNfU1BFRURfMTAwICAgKDB4MTMxMjEzMTMpCisjZGVmaW5lIEkyQ19TUEVFRF83NyAgICAoMHgxOTE4MTkxOSkKKyNkZWZpbmUgSTJDX1NQRUVEXzUwICAgICgweDI3MjYyNzI3KQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIERNQSAgQ29udHJvbGxlciAqLworCisjZGVmaW5lIERNQV9CQVNFX1dSSVRFICAgICAgICAoMHgxMDApCisjZGVmaW5lIERNQV9CQVNFX1JFQUQgICAgICAgICAoMHgxNDApCisKKyNkZWZpbmUgRE1BX0NPTlRST0wgICAgICgweDAwKSAgICAgICAgICAgICAgICAgIC8qIDY0ICovCisjZGVmaW5lIERNQV9FUlJPUiAgICAgICAoMHgwNCkgICAgICAgICAgICAgICAgICAvKiA2NSAoIG9ubHkgcmVhZCBpbnN0YW5jZSApICovCisKKyNkZWZpbmUgRE1BX0RJQUdfQ09OVFJPTCAgICAgICAgICAgICAgICAoMHgxQykgIC8qIDcxICovCisjZGVmaW5lIERNQV9ESUFHX1BBQ0tFVENPVU5URVJfTE9XICAgICAgKDB4MjApICAvKiA3MiAqLworI2RlZmluZSBETUFfRElBR19QQUNLRVRDT1VOVEVSX0hJR0ggICAgICgweDI0KSAgLyogNzMgKi8KKyNkZWZpbmUgRE1BX0RJQUdfVElNRUNPVU5URVJfTE9XICAgICAgICAoMHgyOCkgIC8qIDc0ICovCisjZGVmaW5lIERNQV9ESUFHX1RJTUVDT1VOVEVSX0hJR0ggICAgICAgKDB4MkMpICAvKiA3NSAqLworI2RlZmluZSBETUFfRElBR19SRUNIRUNLQ09VTlRFUiAgICAgICAgICgweDMwKSAgLyogNzYgICggU3BsaXQgY29tcGxldGlvbnMgb24gcmVhZCApICovCisjZGVmaW5lIERNQV9ESUFHX1dBSVRUSU1FT1VUSU5JVCAgICAgICAgKDB4MzQpICAvKiA3NyAqLworI2RlZmluZSBETUFfRElBR19XQUlUT1ZFUkZMT1dDT1VOVEVSICAgICgweDM4KSAgLyogNzggKi8KKyNkZWZpbmUgRE1BX0RJQUdfV0FJVENPVU5URVIgICAgICAgICAgICAoMHgzQykgIC8qIDc5ICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIERNQSAgQnVmZmVyICovCisKKyNkZWZpbmUgVFNfSU5QVVRfQkFTRSAgICAgICAoMHgyMDApCisjZGVmaW5lIFRTX0lOUFVUX0NPTlRST0woaSkgICAgICAgICAoVFNfSU5QVVRfQkFTRSArIChpKSAqIDE2ICsgMHgwMCkKKworI2RlZmluZSBUU19PVVRQVVRfQkFTRSAgICAgICAoMHgyODApCisjZGVmaW5lIFRTX09VVFBVVF9DT05UUk9MKGkpICAgICAgICAgKFRTX09VVFBVVF9CQVNFICsgKGkpICogMTYgKyAweDAwKQorCisjZGVmaW5lIERNQV9CVUZGRVJfQkFTRSAgICAgKDB4MzAwKQorCisjZGVmaW5lIERNQV9CVUZGRVJfQ09OVFJPTChpKSAgICAgICAoRE1BX0JVRkZFUl9CQVNFICsgKGkpICogMTYgKyAweDAwKQorI2RlZmluZSBETUFfQlVGRkVSX0FDSyhpKSAgICAgICAgICAgKERNQV9CVUZGRVJfQkFTRSArIChpKSAqIDE2ICsgMHgwNCkKKyNkZWZpbmUgRE1BX0JVRkZFUl9DVVJSRU5UKGkpICAgICAgIChETUFfQlVGRkVSX0JBU0UgKyAoaSkgKiAxNiArIDB4MDgpCisjZGVmaW5lIERNQV9CVUZGRVJfU0laRShpKSAgICAgICAgICAoRE1BX0JVRkZFUl9CQVNFICsgKGkpICogMTYgKyAweDBjKQorCisjZGVmaW5lIERNQV9CQVNFX0FERFJFU1NfVEFCTEUgICgweDIwMDApCisjZGVmaW5lIERNQV9CQVNFX0FERFJFU1NfVEFCTEVfRU5UUklFUyAoNTEyKQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kZGJyaWRnZS9kZGJyaWRnZS5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZGRicmlkZ2UvZGRicmlkZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDE0ODkzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZGRicmlkZ2UvZGRicmlkZ2UuaApAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIGRkYnJpZGdlLmg6IERpZ2l0YWwgRGV2aWNlcyBQQ0llIGJyaWRnZSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBEaWdpdGFsIERldmljZXMgR21iSAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgb25seSwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKiBPciwgcG9pbnQgeW91ciBicm93c2VyIHRvIGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbAorICovCisKKyNpZm5kZWYgX0REQlJJREdFX0hfCisjZGVmaW5lIF9EREJSSURHRV9IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGxpbnV4L2R2Yi9mcm9udGVuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2R2Yi9jYS5oPgorI2luY2x1ZGUgPGxpbnV4L2R2Yi92aWRlby5oPgorI2luY2x1ZGUgPGxpbnV4L2R2Yi9hdWRpby5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorCisjaW5jbHVkZSAiZG14ZGV2LmgiCisjaW5jbHVkZSAiZHZiZGV2LmgiCisjaW5jbHVkZSAiZHZiX2RlbXV4LmgiCisjaW5jbHVkZSAiZHZiX2Zyb250ZW5kLmgiCisjaW5jbHVkZSAiZHZiX3JpbmdidWZmZXIuaCIKKyNpbmNsdWRlICJkdmJfY2FfZW41MDIyMS5oIgorI2luY2x1ZGUgImR2Yl9uZXQuaCIKKyNpbmNsdWRlICJjeGQyMDk5LmgiCisKKyNkZWZpbmUgRERCX01BWF9JMkMgICAgIDQKKyNkZWZpbmUgRERCX01BWF9QT1JUICAgIDQKKyNkZWZpbmUgRERCX01BWF9JTlBVVCAgIDgKKyNkZWZpbmUgRERCX01BWF9PVVRQVVQgIDQKKworc3RydWN0IGRkYl9pbmZvIHsKKwlpbnQgICB0eXBlOworI2RlZmluZSBEREJfTk9ORSAgICAgICAgIDAKKyNkZWZpbmUgRERCX09DVE9QVVMgICAgICAxCisJY2hhciAqbmFtZTsKKwlpbnQgICBwb3J0X251bTsKKwl1MzIgICBwb3J0X3R5cGVbRERCX01BWF9QT1JUXTsKK307CisKKy8qIERNQV9TSVpFIE1VU1QgYmUgZGl2aXNpYmxlIGJ5IDE4OCBhbmQgMTI4ICEhISAqLworCisjZGVmaW5lIElOUFVUX0RNQV9NQVhfQlVGUyAzMiAgICAgIC8qIGhhcmR3YXJlIHRhYmxlIGxpbWl0ICovCisjZGVmaW5lIElOUFVUX0RNQV9CVUZTIDgKKyNkZWZpbmUgSU5QVVRfRE1BX1NJWkUgKDEyOCo0NyoyMSkKKworI2RlZmluZSBPVVRQVVRfRE1BX01BWF9CVUZTIDMyCisjZGVmaW5lIE9VVFBVVF9ETUFfQlVGUyA4CisjZGVmaW5lIE9VVFBVVF9ETUFfU0laRSAoMTI4KjQ3KjIxKQorCitzdHJ1Y3QgZGRiOworc3RydWN0IGRkYl9wb3J0OworCitzdHJ1Y3QgZGRiX2lucHV0IHsKKwlzdHJ1Y3QgZGRiX3BvcnQgICAgICAgKnBvcnQ7CisJdTMyICAgICAgICAgICAgICAgICAgICBucjsKKwlpbnQgICAgICAgICAgICAgICAgICAgIGF0dGFjaGVkOworCisJZG1hX2FkZHJfdCAgICAgICAgICAgICBwYnVmW0lOUFVUX0RNQV9NQVhfQlVGU107CisJdTggICAgICAgICAgICAgICAgICAgICp2YnVmW0lOUFVUX0RNQV9NQVhfQlVGU107CisJdTMyICAgICAgICAgICAgICAgICAgICBkbWFfYnVmX251bTsKKwl1MzIgICAgICAgICAgICAgICAgICAgIGRtYV9idWZfc2l6ZTsKKworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAgdGFza2xldDsKKwlzcGlubG9ja190ICAgICAgICAgICAgIGxvY2s7CisJd2FpdF9xdWV1ZV9oZWFkX3QgICAgICB3cTsKKwlpbnQgICAgICAgICAgICAgICAgICAgIHJ1bm5pbmc7CisJdTMyICAgICAgICAgICAgICAgICAgICBzdGF0OworCXUzMiAgICAgICAgICAgICAgICAgICAgY2J1ZjsKKwl1MzIgICAgICAgICAgICAgICAgICAgIGNvZmY7CisKKwlzdHJ1Y3QgZHZiX2FkYXB0ZXIgICAgIGFkYXA7CisJc3RydWN0IGR2Yl9kZXZpY2UgICAgICpkZXY7CisJc3RydWN0IGR2Yl9mcm9udGVuZCAgICpmZTsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kICAgKmZlMjsKKwlzdHJ1Y3QgZG14ZGV2ICAgICAgICAgIGRteGRldjsKKwlzdHJ1Y3QgZHZiX2RlbXV4ICAgICAgIGRlbXV4OworCXN0cnVjdCBkdmJfbmV0ICAgICAgICAgZHZibmV0OworCXN0cnVjdCBkbXhfZnJvbnRlbmQgICAgaHdfZnJvbnRlbmQ7CisJc3RydWN0IGRteF9mcm9udGVuZCAgICBtZW1fZnJvbnRlbmQ7CisJaW50ICAgICAgICAgICAgICAgICAgICB1c2VyczsKKwlpbnQgKCpnYXRlX2N0cmwpKHN0cnVjdCBkdmJfZnJvbnRlbmQgKiwgaW50KTsKK307CisKK3N0cnVjdCBkZGJfb3V0cHV0IHsKKwlzdHJ1Y3QgZGRiX3BvcnQgICAgICAgKnBvcnQ7CisJdTMyICAgICAgICAgICAgICAgICAgICBucjsKKwlkbWFfYWRkcl90ICAgICAgICAgICAgIHBidWZbT1VUUFVUX0RNQV9NQVhfQlVGU107CisJdTggICAgICAgICAgICAgICAgICAgICp2YnVmW09VVFBVVF9ETUFfTUFYX0JVRlNdOworCXUzMiAgICAgICAgICAgICAgICAgICAgZG1hX2J1Zl9udW07CisJdTMyICAgICAgICAgICAgICAgICAgICBkbWFfYnVmX3NpemU7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0ICB0YXNrbGV0OworCXNwaW5sb2NrX3QgICAgICAgICAgICAgbG9jazsKKwl3YWl0X3F1ZXVlX2hlYWRfdCAgICAgIHdxOworCWludCAgICAgICAgICAgICAgICAgICAgcnVubmluZzsKKwl1MzIgICAgICAgICAgICAgICAgICAgIHN0YXQ7CisJdTMyICAgICAgICAgICAgICAgICAgICBjYnVmOworCXUzMiAgICAgICAgICAgICAgICAgICAgY29mZjsKKworCXN0cnVjdCBkdmJfYWRhcHRlciAgICAgYWRhcDsKKwlzdHJ1Y3QgZHZiX2RldmljZSAgICAgKmRldjsKK307CisKK3N0cnVjdCBkZGJfaTJjIHsKKwlzdHJ1Y3QgZGRiICAgICAgICAgICAgKmRldjsKKwl1MzIgICAgICAgICAgICAgICAgICAgIG5yOworCXN0cnVjdCBpMmNfYWRhcHRlciAgICAgYWRhcDsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgICAgIGFkYXAyOworCXUzMiAgICAgICAgICAgICAgICAgICAgcmVnczsKKwl1MzIgICAgICAgICAgICAgICAgICAgIHJidWY7CisJdTMyICAgICAgICAgICAgICAgICAgICB3YnVmOworCWludCAgICAgICAgICAgICAgICAgICAgZG9uZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCAgICAgIHdxOworfTsKKworc3RydWN0IGRkYl9wb3J0IHsKKwlzdHJ1Y3QgZGRiICAgICAgICAgICAgKmRldjsKKwl1MzIgICAgICAgICAgICAgICAgICAgIG5yOworCXN0cnVjdCBkZGJfaTJjICAgICAgICAqaTJjOworCXN0cnVjdCBtdXRleCAgICAgICAgICAgaTJjX2dhdGVfbG9jazsKKwl1MzIgICAgICAgICAgICAgICAgICAgIGNsYXNzOworI2RlZmluZSBEREJfUE9SVF9OT05FICAgICAgICAgICAwCisjZGVmaW5lIEREQl9QT1JUX0NJICAgICAgICAgICAgIDEKKyNkZWZpbmUgRERCX1BPUlRfVFVORVIgICAgICAgICAgMgorCXUzMiAgICAgICAgICAgICAgICAgICAgdHlwZTsKKyNkZWZpbmUgRERCX1RVTkVSX05PTkUgICAgICAgICAgMAorI2RlZmluZSBEREJfVFVORVJfRFZCU19TVCAgICAgICAxCisjZGVmaW5lIEREQl9UVU5FUl9EVkJTX1NUX0FBICAgIDIKKyNkZWZpbmUgRERCX1RVTkVSX0RWQkNUX1RSICAgICAxNgorI2RlZmluZSBEREJfVFVORVJfRFZCQ1RfU1QgICAgIDE3CisJdTMyICAgICAgICAgICAgICAgICAgICBhZHI7CisKKwlzdHJ1Y3QgZGRiX2lucHV0ICAgICAgKmlucHV0WzJdOworCXN0cnVjdCBkZGJfb3V0cHV0ICAgICAqb3V0cHV0OworCXN0cnVjdCBkdmJfY2FfZW41MDIyMSAqZW47Cit9OworCitzdHJ1Y3QgZGRiIHsKKwlzdHJ1Y3QgcGNpX2RldiAgICAgICAgKnBkZXY7CisJdW5zaWduZWQgY2hhciAgICAgICAgICpyZWdzOworCXN0cnVjdCBkZGJfcG9ydCAgICAgICAgcG9ydFtEREJfTUFYX1BPUlRdOworCXN0cnVjdCBkZGJfaTJjICAgICAgICAgaTJjW0REQl9NQVhfSTJDXTsKKwlzdHJ1Y3QgZGRiX2lucHV0ICAgICAgIGlucHV0W0REQl9NQVhfSU5QVVRdOworCXN0cnVjdCBkZGJfb3V0cHV0ICAgICAgb3V0cHV0W0REQl9NQVhfT1VUUFVUXTsKKworCXN0cnVjdCBkZXZpY2UgICAgICAgICAqZGRiX2RldjsKKwlpbnQgICAgICAgICAgICAgICAgICAgIG5yOworCXU4ICAgICAgICAgICAgICAgICAgICAgaW9idWZbMTAyOF07CisKKwlzdHJ1Y3QgZGRiX2luZm8gICAgICAgKmluZm87CisJaW50ICAgICAgICAgICAgICAgICAgICBtc2k7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBkZGJ3cml0ZWwoX3ZhbCwgX2FkcikgICAgICAgIHdyaXRlbCgoX3ZhbCksIFwKKwkJCQkgICAgIChjaGFyICopIChkZXYtPnJlZ3MrKF9hZHIpKSkKKyNkZWZpbmUgZGRicmVhZGwoX2FkcikgICAgICAgICAgICAgICByZWFkbCgoY2hhciAqKSAoZGV2LT5yZWdzKyhfYWRyKSkpCisjZGVmaW5lIGRkYmNweXRvKF9hZHIsIF9zcmMsIF9jb3VudCkgbWVtY3B5X3RvaW8oKGNoYXIgKikJXAorCQkJCSAgICAgKGRldi0+cmVncysoX2FkcikpLCAoX3NyYyksIChfY291bnQpKQorI2RlZmluZSBkZGJjcHlmcm9tKF9kc3QsIF9hZHIsIF9jb3VudCkgbWVtY3B5X2Zyb21pbygoX2RzdCksIChjaGFyICopIFwKKwkJCQkgICAgICAgKGRldi0+cmVncysoX2FkcikpLCAoX2NvdW50KSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9NYWtlZmlsZQppbmRleCAwYjUxODI4Li44ZjIyYmNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9NYWtlZmlsZQpAQCAtMiw4ICsyLDEwIEBACiAjIE1ha2VmaWxlIGZvciB0aGUga2VybmVsIERWQiBkZXZpY2UgZHJpdmVycy4KICMKIAorZHZiLW5ldC0kKENPTkZJR19EVkJfTkVUKSA6PSBkdmJfbmV0Lm8KKwogZHZiLWNvcmUtb2JqcyA6PSBkdmJkZXYubyBkbXhkZXYubyBkdmJfZGVtdXgubyBkdmJfZmlsdGVyLm8gCVwKIAkJIGR2Yl9jYV9lbjUwMjIxLm8gZHZiX2Zyb250ZW5kLm8gCQlcCi0JCSBkdmJfbmV0Lm8gZHZiX3JpbmdidWZmZXIubyBkdmJfbWF0aC5vCisJCSAkKGR2Yi1uZXQteSkgZHZiX3JpbmdidWZmZXIubyBkdmJfbWF0aC5vCiAKIG9iai0kKENPTkZJR19EVkJfQ09SRSkgKz0gZHZiLWNvcmUubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLWNvcmUvZHZiX2Zyb250ZW5kLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuYwppbmRleCA1YjZiNDUxLi5lZmU5YzMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfZnJvbnRlbmQuYwpAQCAtOTA0LDcgKzkwNCw3IEBACiAJLmJ1ZmZlciA9IGIgXAogfQogCi1zdGF0aWMgc3RydWN0IGR0dl9jbWRzX2ggZHR2X2NtZHNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZHR2X2NtZHNfaCBkdHZfY21kc1tEVFZfTUFYX0NPTU1BTkQgKyAxXSA9IHsKIAlfRFRWX0NNRChEVFZfVFVORSwgMSwgMCksCiAJX0RUVl9DTUQoRFRWX0NMRUFSLCAxLCAwKSwKIApAQCAtOTY2LDYgKzk2Niw3IEBACiAJX0RUVl9DTUQoRFRWX0lTREJUX0xBWUVSQ19USU1FX0lOVEVSTEVBVklORywgMCwgMCksCiAKIAlfRFRWX0NNRChEVFZfSVNEQlNfVFNfSUQsIDEsIDApLAorCV9EVFZfQ01EKERUVl9EVkJUMl9QTFBfSUQsIDEsIDApLAogCiAJLyogR2V0ICovCiAJX0RUVl9DTUQoRFRWX0RJU0VRQ19TTEFWRV9SRVBMWSwgMCwgMSksCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbmV0LmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbmV0LmgKaW5kZXggM2EzMTI2Y2EuLjFlNTNhY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi1jb3JlL2R2Yl9uZXQuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItY29yZS9kdmJfbmV0LmgKQEAgLTMyLDYgKzMyLDggQEAKIAogI2RlZmluZSBEVkJfTkVUX0RFVklDRVNfTUFYIDEwCiAKKyNpZmRlZiBDT05GSUdfRFZCX05FVAorCiBzdHJ1Y3QgZHZiX25ldCB7CiAJc3RydWN0IGR2Yl9kZXZpY2UgKmR2YmRldjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2aWNlW0RWQl9ORVRfREVWSUNFU19NQVhdOwpAQCAtNDAsOCArNDIsMjUgQEAKIAlzdHJ1Y3QgZG14X2RlbXV4ICpkZW11eDsKIH07CiAKLQogdm9pZCBkdmJfbmV0X3JlbGVhc2Uoc3RydWN0IGR2Yl9uZXQgKik7CiBpbnQgIGR2Yl9uZXRfaW5pdChzdHJ1Y3QgZHZiX2FkYXB0ZXIgKiwgc3RydWN0IGR2Yl9uZXQgKiwgc3RydWN0IGRteF9kZW11eCAqKTsKIAorI2Vsc2UKKworc3RydWN0IGR2Yl9uZXQgeworCXN0cnVjdCBkdmJfZGV2aWNlICpkdmJkZXY7Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgZHZiX25ldF9yZWxlYXNlKHN0cnVjdCBkdmJfbmV0ICpkdmJuZXQpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGR2Yl9uZXRfaW5pdChzdHJ1Y3QgZHZiX2FkYXB0ZXIgKmFkYXAsCisJCQkgICAgICAgc3RydWN0IGR2Yl9uZXQgKmR2Ym5ldCwgc3RydWN0IGRteF9kZW11eCAqZG14KQoreworCXJldHVybiAwOworfQorCisjZW5kaWYgLyogaWZkZWYgQ09ORklHX0RWQl9ORVQgKi8KKwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL0tjb25maWcKaW5kZXggZTg1MzA0Yy4uNWQ3M2RlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvS2NvbmZpZwpAQCAtODEsNiArODEsNyBAQAogCXNlbGVjdCBNRURJQV9UVU5FUl9NVDIyNjYgaWYgIU1FRElBX1RVTkVSX0NVU1RPTUlTRQogCXNlbGVjdCBNRURJQV9UVU5FUl9YQzIwMjggaWYgIU1FRElBX1RVTkVSX0NVU1RPTUlTRQogCXNlbGVjdCBNRURJQV9UVU5FUl9YQzUwMDAgaWYgIU1FRElBX1RVTkVSX0NVU1RPTUlTRQorCXNlbGVjdCBNRURJQV9UVU5FUl9YQzQwMDAgaWYgIU1FRElBX1RVTkVSX0NVU1RPTUlTRQogCXNlbGVjdCBNRURJQV9UVU5FUl9NWEw1MDA3VCBpZiAhTUVESUFfVFVORVJfQ1VTVE9NSVNFCiAJaGVscAogCSAgU3VwcG9ydCBmb3IgVVNCMi4wLzEuMSBEVkIgcmVjZWl2ZXJzIGJhc2VkIG9uIHRoZSBEaUIwNzAwIFVTQiBicmlkZ2UuIFRoZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMTUuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDE1LmMKaW5kZXggMTAwZWJjMy4uZDdhZDA1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMTUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAxNS5jCkBAIC05MSw3ICs5MSw2IEBACiAJY2FzZSBHRVRfQ09ORklHOgogCWNhc2UgUkVBRF9NRU1PUlk6CiAJY2FzZSBSRUNPTk5FQ1RfVVNCOgotCWNhc2UgR0VUX0lSX0NPREU6CiAJCXdyaXRlID0gMDsKIAkJYnJlYWs7CiAJY2FzZSBSRUFEX0kyQzoKQEAgLTE2NCwxMyArMTYzLDYgQEAKIAlkZWJfeGZlcigiPDw8ICIpOwogCWRlYnVnX2R1bXAoYnVmLCBhY3RfbGVuLCBkZWJfeGZlcik7CiAKLQkvKiByZW1vdGUgY29udHJvbGxlciBxdWVyeSBzdGF0dXMgaXMgMSBpZiByZW1vdGUgY29kZSBpcyBub3QgcmVjZWl2ZWQgKi8KLQlpZiAocmVxLT5jbWQgPT0gR0VUX0lSX0NPREUgJiYgYnVmWzFdID09IDEpIHsKLQkJYnVmWzFdID0gMDsgLyogY2xlYXIgY29tbWFuZCAiZXJyb3IiIHN0YXR1cyAqLwotCQltZW1zZXQoJmJ1ZlsyXSwgMCwgcmVxLT5kYXRhX2xlbik7Ci0JCWJ1ZlszXSA9IDE7IC8qIG5vIHJlbW90ZSBjb2RlIHJlY2VpdmVkIG1hcmsgKi8KLQl9Ci0KIAkvKiBjaGVjayBzdGF0dXMgKi8KIAlpZiAoYnVmWzFdKSB7CiAJCWVycigiY29tbWFuZCBmYWlsZWQ6JWQiLCBidWZbMV0pOwpAQCAtMjkyLDYgKzI4NCwxMCBAQAogCQl9CiAKIAkJaWYgKG51bSA+IGkgKyAxICYmIChtc2dbaSsxXS5mbGFncyAmIEkyQ19NX1JEKSkgeworCQkJaWYgKG1zZ1tpXS5sZW4gPiAzIHx8IG1zZ1tpKzFdLmxlbiA+IDYxKSB7CisJCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KIAkJCWlmIChtc2dbaV0uYWRkciA9PQogCQkJCWFmOTAxNV9hZjkwMTNfY29uZmlnWzBdLmRlbW9kX2FkZHJlc3MpCiAJCQkJcmVxLmNtZCA9IFJFQURfTUVNT1JZOwpAQCAtMzA2LDEyICszMDIsMTYgQEAKIAkJCXJldCA9IGFmOTAxNV9jdHJsX21zZyhkLCAmcmVxKTsKIAkJCWkgKz0gMjsKIAkJfSBlbHNlIGlmIChtc2dbaV0uZmxhZ3MgJiBJMkNfTV9SRCkgewotCQkJcmV0ID0gLUVJTlZBTDsKLQkJCWlmIChtc2dbaV0uYWRkciA9PQotCQkJCWFmOTAxNV9hZjkwMTNfY29uZmlnWzBdLmRlbW9kX2FkZHJlc3MpCisJCQlpZiAobXNnW2ldLmxlbiA+IDYxKSB7CisJCQkJcmV0ID0gLUVPUE5PVFNVUFA7CiAJCQkJZ290byBlcnJvcjsKLQkJCWVsc2UKLQkJCQlyZXEuY21kID0gUkVBRF9JMkM7CisJCQl9CisJCQlpZiAobXNnW2ldLmFkZHIgPT0KKwkJCQlhZjkwMTVfYWY5MDEzX2NvbmZpZ1swXS5kZW1vZF9hZGRyZXNzKSB7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQkJcmVxLmNtZCA9IFJFQURfSTJDOwogCQkJcmVxLmkyY19hZGRyID0gbXNnW2ldLmFkZHI7CiAJCQlyZXEuYWRkciA9IGFkZHI7CiAJCQlyZXEubWJveCA9IG1ib3g7CkBAIC0zMjEsNiArMzIxLDEwIEBACiAJCQlyZXQgPSBhZjkwMTVfY3RybF9tc2coZCwgJnJlcSk7CiAJCQlpICs9IDE7CiAJCX0gZWxzZSB7CisJCQlpZiAobXNnW2ldLmxlbiA+IDIxKSB7CisJCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KIAkJCWlmIChtc2dbaV0uYWRkciA9PQogCQkJCWFmOTAxNV9hZjkwMTNfY29uZmlnWzBdLmRlbW9kX2FkZHJlc3MpCiAJCQkJcmVxLmNtZCA9IFdSSVRFX01FTU9SWTsKQEAgLTczNSw2ICs3MzksNyBAQAogCXsgMHhiOGZlYjcwOCwgUkNfTUFQX01TSV9ESUdJVk9YX0lJIH0sCiAJeyAweGEzNzAzZDAwLCBSQ19NQVBfQUxJTktfRFRVX00gfSwKIAl7IDB4OWI3ZGM2NGUsIFJDX01BUF9UT1RBTF9NRURJQV9JTl9IQU5EIH0sIC8qIE1ZR0lDVFYgVTcxOCAqLworCXsgMHg1ZDQ5ZTNkYiwgUkNfTUFQX0RJR0lUVFJBREUgfSwgLyogTEMtUG93ZXIgTEMtVVNCLURWQlQgKi8KIAl7IH0KIH07CiAKQEAgLTc0OSw2ICs3NTQsOCBAQAogCQlSQ19NQVBfQVpVUkVXQVZFX0FEX1RVNzAwIH0sCiAJeyAoVVNCX1ZJRF9NU0lfMiA8PCAxNikgKyBVU0JfUElEX01TSV9ESUdJX1ZPWF9NSU5JX0lJSSwKIAkJUkNfTUFQX01TSV9ESUdJVk9YX0lJSSB9LAorCXsgKFVTQl9WSURfTVNJXzIgPDwgMTYpICsgVVNCX1BJRF9NU0lfRElHSVZPWF9EVU8sCisJCVJDX01BUF9NU0lfRElHSVZPWF9JSUkgfSwKIAl7IChVU0JfVklEX0xFQURURUsgPDwgMTYpICsgVVNCX1BJRF9XSU5GQVNUX0RUVl9ET05HTEVfR09MRCwKIAkJUkNfTUFQX0xFQURURUtfWTA0RzAwNTEgfSwKIAl7IChVU0JfVklEX0FWRVJNRURJQSA8PCAxNikgKyBVU0JfUElEX0FWRVJNRURJQV9WT0xBUl9YLApAQCAtNzU5LDYgKzc2Niw4IEBACiAJCVJDX01BUF9ESUdJVEFMTk9XX1RJTllUV0lOIH0sCiAJeyAoVVNCX1ZJRF9HVEVLIDw8IDE2KSArIFVTQl9QSURfVElOWVRXSU5fMywKIAkJUkNfTUFQX0RJR0lUQUxOT1dfVElOWVRXSU4gfSwKKwl7IChVU0JfVklEX0tXT1JMRF8yIDw8IDE2KSArIFVTQl9QSURfU1ZFT05fU1RWMjIsCisJCVJDX01BUF9NU0lfRElHSVZPWF9JSUkgfSwKIAl7IH0KIH07CiAKQEAgLTEwODIsNDQgKzEwOTEsMTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKiBpbml0IDJuZCBJMkMgYWRhcHRlciAqLwotc3RhdGljIGludCBhZjkwMTVfaTJjX2luaXQoc3RydWN0IGR2Yl91c2JfZGV2aWNlICpkKQotewotCWludCByZXQ7Ci0Jc3RydWN0IGFmOTAxNV9zdGF0ZSAqc3RhdGUgPSBkLT5wcml2OwotCWRlYl9pbmZvKCIlczpcbiIsIF9fZnVuY19fKTsKLQotCXN0cm5jcHkoc3RhdGUtPmkyY19hZGFwLm5hbWUsIGQtPmRlc2MtPm5hbWUsCi0JCXNpemVvZihzdGF0ZS0+aTJjX2FkYXAubmFtZSkpOwotCXN0YXRlLT5pMmNfYWRhcC5hbGdvICAgICAgPSBkLT5wcm9wcy5pMmNfYWxnbzsKLQlzdGF0ZS0+aTJjX2FkYXAuYWxnb19kYXRhID0gTlVMTDsKLQlzdGF0ZS0+aTJjX2FkYXAuZGV2LnBhcmVudCA9ICZkLT51ZGV2LT5kZXY7Ci0KLQlpMmNfc2V0X2FkYXBkYXRhKCZzdGF0ZS0+aTJjX2FkYXAsIGQpOwotCi0JcmV0ID0gaTJjX2FkZF9hZGFwdGVyKCZzdGF0ZS0+aTJjX2FkYXApOwotCWlmIChyZXQgPCAwKQotCQllcnIoImNvdWxkIG5vdCBhZGQgaTJjIGFkYXB0ZXIiKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KIHN0YXRpYyBpbnQgYWY5MDE1X2FmOTAxM19mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBhZjkwMTVfc3RhdGUgKnN0YXRlID0gYWRhcC0+ZGV2LT5wcml2OwotCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXA7CiAKLQlpZiAoYWRhcC0+aWQgPT0gMCkgewotCQkvKiBzZWxlY3QgSTJDIGFkYXB0ZXIgKi8KLQkJaTJjX2FkYXAgPSAmYWRhcC0+ZGV2LT5pMmNfYWRhcDsKLQotCQlkZWJfaW5mbygiJXM6IGluaXQgSTJDXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IGFmOTAxNV9pMmNfaW5pdChhZGFwLT5kZXYpOwotCX0gZWxzZSB7Ci0JCS8qIHNlbGVjdCBJMkMgYWRhcHRlciAqLwotCQlpMmNfYWRhcCA9ICZzdGF0ZS0+aTJjX2FkYXA7Ci0KKwlpZiAoYWRhcC0+aWQgPT0gMSkgewogCQkvKiBjb3B5IGZpcm13YXJlIHRvIDJuZCBkZW1vZHVsYXRvciAqLwogCQlpZiAoYWY5MDE1X2NvbmZpZy5kdWFsX21vZGUpIHsKIAkJCXJldCA9IGFmOTAxNV9jb3B5X2Zpcm13YXJlKGFkYXAtPmRldik7CkBAIC0xMTM2LDcgKzExMTIsNyBAQAogCiAJLyogYXR0YWNoIGRlbW9kdWxhdG9yICovCiAJYWRhcC0+ZmUgPSBkdmJfYXR0YWNoKGFmOTAxM19hdHRhY2gsICZhZjkwMTVfYWY5MDEzX2NvbmZpZ1thZGFwLT5pZF0sCi0JCWkyY19hZGFwKTsKKwkJJmFkYXAtPmRldi0+aTJjX2FkYXApOwogCiAJcmV0dXJuIGFkYXAtPmZlID09IE5VTEwgPyAtRU5PREVWIDogMDsKIH0KQEAgLTEyMDYsNTcgKzExODIsNTYgQEAKIAogc3RhdGljIGludCBhZjkwMTVfdHVuZXJfYXR0YWNoKHN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXApCiB7Ci0Jc3RydWN0IGFmOTAxNV9zdGF0ZSAqc3RhdGUgPSBhZGFwLT5kZXYtPnByaXY7Ci0Jc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcDsKIAlpbnQgcmV0OwogCWRlYl9pbmZvKCIlczpcbiIsIF9fZnVuY19fKTsKIAotCS8qIHNlbGVjdCBJMkMgYWRhcHRlciAqLwotCWlmIChhZGFwLT5pZCA9PSAwKQotCQlpMmNfYWRhcCA9ICZhZGFwLT5kZXYtPmkyY19hZGFwOwotCWVsc2UKLQkJaTJjX2FkYXAgPSAmc3RhdGUtPmkyY19hZGFwOwotCiAJc3dpdGNoIChhZjkwMTVfYWY5MDEzX2NvbmZpZ1thZGFwLT5pZF0udHVuZXIpIHsKIAljYXNlIEFGOTAxM19UVU5FUl9NVDIwNjA6CiAJY2FzZSBBRjkwMTNfVFVORVJfTVQyMDYwXzI6Ci0JCXJldCA9IGR2Yl9hdHRhY2gobXQyMDYwX2F0dGFjaCwgYWRhcC0+ZmUsIGkyY19hZGFwLAorCQlyZXQgPSBkdmJfYXR0YWNoKG10MjA2MF9hdHRhY2gsIGFkYXAtPmZlLCAmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKIAkJCSZhZjkwMTVfbXQyMDYwX2NvbmZpZywKIAkJCWFmOTAxNV9jb25maWcubXQyMDYwX2lmMVthZGFwLT5pZF0pCiAJCQk9PSBOVUxMID8gLUVOT0RFViA6IDA7CiAJCWJyZWFrOwogCWNhc2UgQUY5MDEzX1RVTkVSX1FUMTAxMDoKIAljYXNlIEFGOTAxM19UVU5FUl9RVDEwMTBBOgotCQlyZXQgPSBkdmJfYXR0YWNoKHF0MTAxMF9hdHRhY2gsIGFkYXAtPmZlLCBpMmNfYWRhcCwKKwkJcmV0ID0gZHZiX2F0dGFjaChxdDEwMTBfYXR0YWNoLCBhZGFwLT5mZSwgJmFkYXAtPmRldi0+aTJjX2FkYXAsCiAJCQkmYWY5MDE1X3F0MTAxMF9jb25maWcpID09IE5VTEwgPyAtRU5PREVWIDogMDsKIAkJYnJlYWs7CiAJY2FzZSBBRjkwMTNfVFVORVJfVERBMTgyNzE6Ci0JCXJldCA9IGR2Yl9hdHRhY2godGRhMTgyNzFfYXR0YWNoLCBhZGFwLT5mZSwgMHhjMCwgaTJjX2FkYXAsCisJCXJldCA9IGR2Yl9hdHRhY2godGRhMTgyNzFfYXR0YWNoLCBhZGFwLT5mZSwgMHhjMCwKKwkJCSZhZGFwLT5kZXYtPmkyY19hZGFwLAogCQkJJmFmOTAxNV90ZGExODI3MV9jb25maWcpID09IE5VTEwgPyAtRU5PREVWIDogMDsKIAkJYnJlYWs7CiAJY2FzZSBBRjkwMTNfVFVORVJfVERBMTgyMTg6Ci0JCXJldCA9IGR2Yl9hdHRhY2godGRhMTgyMThfYXR0YWNoLCBhZGFwLT5mZSwgaTJjX2FkYXAsCisJCXJldCA9IGR2Yl9hdHRhY2godGRhMTgyMThfYXR0YWNoLCBhZGFwLT5mZSwKKwkJCSZhZGFwLT5kZXYtPmkyY19hZGFwLAogCQkJJmFmOTAxNV90ZGExODIxOF9jb25maWcpID09IE5VTEwgPyAtRU5PREVWIDogMDsKIAkJYnJlYWs7CiAJY2FzZSBBRjkwMTNfVFVORVJfTVhMNTAwM0Q6Ci0JCXJldCA9IGR2Yl9hdHRhY2gobXhsNTAwNXNfYXR0YWNoLCBhZGFwLT5mZSwgaTJjX2FkYXAsCisJCXJldCA9IGR2Yl9hdHRhY2gobXhsNTAwNXNfYXR0YWNoLCBhZGFwLT5mZSwKKwkJCSZhZGFwLT5kZXYtPmkyY19hZGFwLAogCQkJJmFmOTAxNV9teGw1MDAzX2NvbmZpZykgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOwogCQlicmVhazsKIAljYXNlIEFGOTAxM19UVU5FUl9NWEw1MDA1RDoKIAljYXNlIEFGOTAxM19UVU5FUl9NWEw1MDA1UjoKLQkJcmV0ID0gZHZiX2F0dGFjaChteGw1MDA1c19hdHRhY2gsIGFkYXAtPmZlLCBpMmNfYWRhcCwKKwkJcmV0ID0gZHZiX2F0dGFjaChteGw1MDA1c19hdHRhY2gsIGFkYXAtPmZlLAorCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsCiAJCQkmYWY5MDE1X214bDUwMDVfY29uZmlnKSA9PSBOVUxMID8gLUVOT0RFViA6IDA7CiAJCWJyZWFrOwogCWNhc2UgQUY5MDEzX1RVTkVSX0VOVjc3SDExRDU6Ci0JCXJldCA9IGR2Yl9hdHRhY2goZHZiX3BsbF9hdHRhY2gsIGFkYXAtPmZlLCAweGMwLCBpMmNfYWRhcCwKKwkJcmV0ID0gZHZiX2F0dGFjaChkdmJfcGxsX2F0dGFjaCwgYWRhcC0+ZmUsIDB4YzAsCisJCQkmYWRhcC0+ZGV2LT5pMmNfYWRhcCwKIAkJCURWQl9QTExfVERBNjY1WCkgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOwogCQlicmVhazsKIAljYXNlIEFGOTAxM19UVU5FUl9NQzQ0UzgwMzoKLQkJcmV0ID0gZHZiX2F0dGFjaChtYzQ0czgwM19hdHRhY2gsIGFkYXAtPmZlLCBpMmNfYWRhcCwKKwkJcmV0ID0gZHZiX2F0dGFjaChtYzQ0czgwM19hdHRhY2gsIGFkYXAtPmZlLAorCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsCiAJCQkmYWY5MDE1X21jNDRzODAzX2NvbmZpZykgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOwogCQlicmVhazsKIAljYXNlIEFGOTAxM19UVU5FUl9NWEw1MDA3VDoKLQkJcmV0ID0gZHZiX2F0dGFjaChteGw1MDA3dF9hdHRhY2gsIGFkYXAtPmZlLCBpMmNfYWRhcCwKKwkJcmV0ID0gZHZiX2F0dGFjaChteGw1MDA3dF9hdHRhY2gsIGFkYXAtPmZlLAorCQkJJmFkYXAtPmRldi0+aTJjX2FkYXAsCiAJCQkweGMwLCAmYWY5MDE1X214bDUwMDd0X2NvbmZpZykgPT0gTlVMTCA/IC1FTk9ERVYgOiAwOwogCQlicmVhazsKIAljYXNlIEFGOTAxM19UVU5FUl9VTktOT1dOOgpAQCAtMTMwOSw2ICsxMjg0LDcgQEAKIAkJVVNCX1BJRF9URVJSQVRFQ19DSU5FUkdZX1RfU1RJQ0tfRFVBTF9SQyl9LAogLyogMzUgKi97VVNCX0RFVklDRShVU0JfVklEX0FWRVJNRURJQSwgVVNCX1BJRF9BVkVSTUVESUFfQTg1MFQpfSwKIAl7VVNCX0RFVklDRShVU0JfVklEX0dURUssICAgICAgVVNCX1BJRF9USU5ZVFdJTl8zKX0sCisJe1VTQl9ERVZJQ0UoVVNCX1ZJRF9LV09STERfMiwgIFVTQl9QSURfU1ZFT05fU1RWMjIpfSwKIAl7MH0sCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGFmOTAxNV91c2JfdGFibGUpOwpAQCAtMTUwMiw3ICsxNDc4LDcgQEAKIAogCQkuaTJjX2FsZ28gPSAmYWY5MDE1X2kyY19hbGdvLAogCi0JCS5udW1fZGV2aWNlX2Rlc2NzID0gOSwgLyogY2hlY2sgbWF4IGZyb20gZHZiLXVzYi5oICovCisJCS5udW1fZGV2aWNlX2Rlc2NzID0gMTAsIC8qIGNoZWNrIG1heCBmcm9tIGR2Yi11c2IuaCAqLwogCQkuZGV2aWNlcyA9IHsKIAkJCXsKIAkJCQkubmFtZSA9ICJYdGVuc2lvbnMgWEQtMzgwIiwKQEAgLTE1NTQsNiArMTUzMCwxMSBAQAogCQkJCS5jb2xkX2lkcyA9IHsmYWY5MDE1X3VzYl90YWJsZVsyMF0sIE5VTEx9LAogCQkJCS53YXJtX2lkcyA9IHtOVUxMfSwKIAkJCX0sCisJCQl7CisJCQkJLm5hbWUgPSAiU3Zlb24gU1RWMjIgRHVhbCBVU0IgRFZCLVQgVHVuZXIgSERUViIsCisJCQkJLmNvbGRfaWRzID0geyZhZjkwMTVfdXNiX3RhYmxlWzM3XSwgTlVMTH0sCisJCQkJLndhcm1faWRzID0ge05VTEx9LAorCQkJfSwKIAkJfQogCX0sIHsKIAkJLmNhcHMgPSBEVkJfVVNCX0lTX0FOX0kyQ19BREFQVEVSLApAQCAtMTcwNCwzMyArMTY4NSwxMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGFmOTAxNV9pMmNfZXhpdChzdHJ1Y3QgZHZiX3VzYl9kZXZpY2UgKmQpCi17Ci0Jc3RydWN0IGFmOTAxNV9zdGF0ZSAqc3RhdGUgPSBkLT5wcml2OwotCWRlYl9pbmZvKCIlczpcbiIsIF9fZnVuY19fKTsKLQotCS8qIHJlbW92ZSAybmQgSTJDIGFkYXB0ZXIgKi8KLQlpZiAoZC0+c3RhdGUgJiBEVkJfVVNCX1NUQVRFX0kyQykKLQkJaTJjX2RlbF9hZGFwdGVyKCZzdGF0ZS0+aTJjX2FkYXApOwotfQotCi1zdGF0aWMgdm9pZCBhZjkwMTVfdXNiX2RldmljZV9leGl0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQotewotCXN0cnVjdCBkdmJfdXNiX2RldmljZSAqZCA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7Ci0JZGViX2luZm8oIiVzOlxuIiwgX19mdW5jX18pOwotCi0JLyogcmVtb3ZlIDJuZCBJMkMgYWRhcHRlciAqLwotCWlmIChkICE9IE5VTEwgJiYgZC0+ZGVzYyAhPSBOVUxMKQotCQlhZjkwMTVfaTJjX2V4aXQoZCk7Ci0KLQlkdmJfdXNiX2RldmljZV9leGl0KGludGYpOwotfQotCiAvKiB1c2Igc3BlY2lmaWMgb2JqZWN0IG5lZWRlZCB0byByZWdpc3RlciB0aGlzIGRyaXZlciB3aXRoIHRoZSB1c2Igc3Vic3lzdGVtICovCiBzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgYWY5MDE1X3VzYl9kcml2ZXIgPSB7CiAJLm5hbWUgPSAiZHZiX3VzYl9hZjkwMTUiLAogCS5wcm9iZSA9IGFmOTAxNV91c2JfcHJvYmUsCi0JLmRpc2Nvbm5lY3QgPSBhZjkwMTVfdXNiX2RldmljZV9leGl0LAorCS5kaXNjb25uZWN0ID0gZHZiX3VzYl9kZXZpY2VfZXhpdCwKIAkuaWRfdGFibGUgPSBhZjkwMTVfdXNiX3RhYmxlLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMTUuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYWY5MDE1LmgKaW5kZXggYmViMzAwNC4uNjI1MmVhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hZjkwMTUuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FmOTAxNS5oCkBAIC05OSw3ICs5OSw2IEBACiB9OwogCiBzdHJ1Y3QgYWY5MDE1X3N0YXRlIHsKLQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgaTJjX2FkYXA7IC8qIEkyQyBhZGFwdGVyIGZvciAybmQgRkUgKi8KIAl1OCByY19yZXBlYXQ7CiAJdTMyIHJjX2tleWNvZGU7CiAJdTggcmNfbGFzdFs0XTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYW55c2VlLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FueXNlZS5jCmluZGV4IDdjMzI3YjUuLjJjYmYxOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYW55c2VlLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hbnlzZWUuYwpAQCAtMzQ3LDE1ICszNDcsMTcgQEAKICAqIFBDQjogPwogICogcGFydHM6IEROT1M0MDRaSDEwMkEoTVQzNTIsIERUVDc1NzkoPykpCiAgKgotICogRTMwIFZJRD0wNGI0IFBJRD04NjFmIEhXPTIgRlc9Mi4xIFByb2R1Y3Q9Pz8/Pz8/Pz8KLSAqIFBDQjogPworICogRTMwIFZJRD0wNGI0IFBJRD04NjFmIEhXPTIgRlc9Mi4xICJhbnlzZWUtVChMUCkiCisgKiBQQ0I6IFBDQiA1MDdUIChyZXYxLjYxKQogICogcGFydHM6IEROT1M0MDRaSDEwM0EoWkwxMDM1MywgRFRUNzU3OSg/KSkKKyAqIE9FQT0wYSBPRUI9MDAgT0VDPTAwIE9FRD1mZiBPRUU9MDAKKyAqIElPQT00NSBJT0I9ZmYgSU9DPTAwIElPRD1mZiBJT0U9MDAKICAqCiAgKiBFMzAgUGx1cyBWSUQ9MDRiNCBQSUQ9ODYxZiBIVz02IEZXPTEuMCAiYW55c2VlIgogICogUENCOiA1MDdDRCAocmV2MS4xKQogICogcGFydHM6IEROT1M0MDRaSDEwM0EoWkwxMDM1MywgRFRUNzU3OSg/KSksIENTVDU2STAxCi0gKiBPRUE9ODAgT0VCPTAwIE9FQz0wMCBPRUQ9ZmYgT0VGPWZlCi0gKiBJT0E9NGYgSU9CPWZmIElPQz0wMCBJT0Q9MDYgSU9GPTAxCisgKiBPRUE9ODAgT0VCPTAwIE9FQz0wMCBPRUQ9ZmYgT0VFPWZlCisgKiBJT0E9NGYgSU9CPWZmIElPQz0wMCBJT0Q9MDYgSU9FPTAxCiAgKiBJT0RbMF0gWkwxMDM1MyAxPWVuYWJsZWQKICAqIElPQVs3XSBUUyAwPWVuYWJsZWQKICAqIHR1bmVyIGlzIG5vdCBiZWhpbmQgWkwxMDM1MyBJMkMtZ2F0ZSAobm8gY2FyZSBpZiBnYXRlIGRpc2FibGVkIG9yIG5vdCkKQEAgLTM2MywzMCArMzY1LDMwIEBACiAgKiBFMzAgQyBQbHVzIFZJRD0wNGI0IFBJRD04NjFmIEhXPTEwIEZXPTEuMCAiYW55c2VlLURDKExQKSIKICAqIFBDQjogNTA3REMgKHJldjAuMikKICAqIHBhcnRzOiBUREExMDAyMywgRFRPUzQwM0lIMTAyQiBUTSwgQ1NUNTZJMDEKLSAqIE9FQT04MCBPRUI9MDAgT0VDPTAwIE9FRD1mZiBPRUY9ZmUKLSAqIElPQT00ZiBJT0I9ZmYgSU9DPTAwIElPRD0yNiBJT0Y9MDEKKyAqIE9FQT04MCBPRUI9MDAgT0VDPTAwIE9FRD1mZiBPRUU9ZmUKKyAqIElPQT00ZiBJT0I9ZmYgSU9DPTAwIElPRD0yNiBJT0U9MDEKICAqIElPRFswXSBUREExMDAyMyAxPWVuYWJsZWQKICAqCiAgKiBFMzAgUzIgUGx1cyBWSUQ9MDRiNCBQSUQ9ODYxZiBIVz0xMSBGVz0wLjEgImFueXNlZS1TMihMUCkiCiAgKiBQQ0I6IDUwN1NJIChyZXYyLjEpCiAgKiBwYXJ0czogQlMyTjEwV0NDMDEoQ1gyNDExNiwgQ1gyNDExOCksIElTTDY0MjMsIFREQTgwMjQKLSAqIE9FQT04MCBPRUI9MDAgT0VDPWZmIE9FRD1mZiBPRUY9ZmUKLSAqIElPQT00ZCBJT0I9ZmYgSU9DPTAwIElPRD0yNiBJT0Y9MDEKKyAqIE9FQT04MCBPRUI9MDAgT0VDPWZmIE9FRD1mZiBPRUU9ZmUKKyAqIElPQT00ZCBJT0I9ZmYgSU9DPTAwIElPRD0yNiBJT0U9MDEKICAqIElPRFswXSBDWDI0MTE2IDE9ZW5hYmxlZAogICoKICAqIEUzMCBDIFBsdXMgVklEPTFjNzMgUElEPTg2MWYgSFc9MTUgRlc9MS4yICJhbnlzZWUtRkEoTFApIgogICogUENCOiA1MDdGQSAocmV2MC40KQogICogcGFydHM6IFREQTEwMDIzLCBEVE9TNDAzSUgxMDJCIFRNLCBUREE4MDI0Ci0gKiBPRUE9ODAgT0VCPTAwIE9FQz1mZiBPRUQ9ZmYgT0VGPWZmCi0gKiBJT0E9NGQgSU9CPWZmIElPQz0wMCBJT0Q9MDAgSU9GPWMwCisgKiBPRUE9ODAgT0VCPTAwIE9FQz1mZiBPRUQ9ZmYgT0VFPWZmCisgKiBJT0E9NGQgSU9CPWZmIElPQz0wMCBJT0Q9MDAgSU9FPWMwCiAgKiBJT0RbNV0gVERBMTAwMjMgMT1lbmFibGVkCiAgKiBJT0VbMF0gdHVuZXIgMT1lbmFibGVkCiAgKgogICogRTMwIENvbWJvIFBsdXMgVklEPTFjNzMgUElEPTg2MWYgSFc9MTUgRlc9MS4yICJhbnlzZWUtRkEoTFApIgogICogUENCOiA1MDdGQSAocmV2MS4xKQogICogcGFydHM6IFpMMTAzNTMsIFREQTEwMDIzLCBEVE9TNDAzSUgxMDJCIFRNLCBUREE4MDI0Ci0gKiBPRUE9ODAgT0VCPTAwIE9FQz1mZiBPRUQ9ZmYgT0VGPWZmCi0gKiBJT0E9NGQgSU9CPWZmIElPQz0wMCBJT0Q9MDAgSU9GPWMwCisgKiBPRUE9ODAgT0VCPTAwIE9FQz1mZiBPRUQ9ZmYgT0VFPWZmCisgKiBJT0E9NGQgSU9CPWZmIElPQz0wMCBJT0Q9MDAgSU9FPWMwCiAgKiBEVkItQzoKICAqIElPRFs1XSBUREExMDAyMyAxPWVuYWJsZWQKICAqIElPRVswXSB0dW5lciAxPWVuYWJsZWQKQEAgLTM5OCw4ICs0MDAsOCBAQAogICogRTcgVEMgVklEPTFjNzMgUElEPTg2MWYgSFc9MTggRlc9MC43IEFNVENJPTAuNSAiYW55c2VlLUU3VEMoTFApIgogICogUENCOiA1MDhUQyAocmV2MC42KQogICogcGFydHM6IFpMMTAzNTMsIFREQTEwMDIzLCBETk9ENDRDREgwODZBKFREQTE4MjEyKQotICogT0VBPTgwIE9FQj0wMCBPRUM9MDMgT0VEPWY3IE9FRj1mZgotICogSU9BPTRkIElPQj0wMCBJT0M9Y2MgSU9EPTQ4IElPRj1lNAorICogT0VBPTgwIE9FQj0wMCBPRUM9MDMgT0VEPWY3IE9FRT1mZgorICogSU9BPTRkIElPQj0wMCBJT0M9Y2MgSU9EPTQ4IElPRT1lNAogICogSU9BWzddIFRTIDE9ZW5hYmxlZAogICogSU9FWzRdIFREQTE4MjEyIDE9ZW5hYmxlZAogICogRFZCLUM6CkBAIC00MTQsMTEgKzQxNiwzNCBAQAogICogRTcgUzIgVklEPTFjNzMgUElEPTg2MWYgSFc9MTkgRlc9MC40IEFNVENJPTAuNSAiYW55c2VlLUU3UzIoTFApIgogICogUENCOiA1MDhTMiAocmV2MC43KQogICogcGFydHM6IEROQlUxMDUxMklTVChTVFYwOTAzLCBTVFY2MTEwKSwgSVNMNjQyMwotICogT0VBPTgwIE9FQj0wMCBPRUM9MDMgT0VEPWY3IE9FRj1mZgotICogSU9BPTRkIElPQj0wMCBJT0M9YzQgSU9EPTA4IElPRj1lNAorICogT0VBPTgwIE9FQj0wMCBPRUM9MDMgT0VEPWY3IE9FRT1mZgorICogSU9BPTRkIElPQj0wMCBJT0M9YzQgSU9EPTA4IElPRT1lNAogICogSU9BWzddIFRTIDE9ZW5hYmxlZAogICogSU9FWzVdIFNUVjA5MDMgMT1lbmFibGVkCiAgKgorICogRTcgUFRDIFZJRD0xYzczIFBJRD04NjFmIEhXPTIxIEZXPTAuMSBBTVRDST0/PyAiYW55c2VlLUU3UFRDKExQKSIKKyAqIFBDQjogNTA4UFRDIChyZXYwLjUpCisgKiBwYXJ0czogWkwxMDM1MywgVERBMTAwMjMsIEROT0Q0NENESDA4NkEoVERBMTgyMTIpCisgKiBPRUE9ODAgT0VCPTAwIE9FQz0wMyBPRUQ9ZjcgT0VFPWZmCisgKiBJT0E9NGQgSU9CPTAwIElPQz1jYyBJT0Q9NDggSU9FPWU0CisgKiBJT0FbN10gVFMgMT1lbmFibGVkCisgKiBJT0VbNF0gVERBMTgyMTIgMT1lbmFibGVkCisgKiBEVkItQzoKKyAqIElPRFs2XSBaTDEwMzUzIDA9ZGlzYWJsZWQKKyAqIElPRFs1XSBUREExMDAyMyAxPWVuYWJsZWQKKyAqIElPRVswXSBJRiAxPWVuYWJsZWQKKyAqIERWQi1UOgorICogSU9EWzVdIFREQTEwMDIzIDA9ZGlzYWJsZWQKKyAqIElPRFs2XSBaTDEwMzUzIDE9ZW5hYmxlZAorICogSU9FWzBdIElGIDA9ZW5hYmxlZAorICoKKyAqIEU3IFMyIFZJRD0xYzczIFBJRD04NjFmIEhXPTIyIEZXPTAuMSBBTVRDST0/PyAiYW55c2VlLUU3UFMyKExQKSIKKyAqIFBDQjogNTA4UFMyIChyZXYwLjQpCisgKiBwYXJ0czogRE5CVTEwNTEySVNUKFNUVjA5MDMsIFNUVjYxMTApLCBJU0w2NDIzCisgKiBPRUE9ODAgT0VCPTAwIE9FQz0wMyBPRUQ9ZjcgT0VFPWZmCisgKiBJT0E9NGQgSU9CPTAwIElPQz1jNCBJT0Q9MDggSU9FPWU0CisgKiBJT0FbN10gVFMgMT1lbmFibGVkCisgKiBJT0VbNV0gU1RWMDkwMyAxPWVuYWJsZWQKICAqLwogCiBzdGF0aWMgaW50IGFueXNlZV9mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKQEAgLTQ1OSw3ICs0ODQsNyBAQAogCXN0YXRlLT5odyA9IGh3X2luZm9bMF07CiAKIAlzd2l0Y2ggKHN0YXRlLT5odykgewotCWNhc2UgQU5ZU0VFX0hXXzAyOiAvKiAyICovCisJY2FzZSBBTllTRUVfSFdfNTA3VDogLyogMiAqLwogCQkvKiBFMzAgKi8KIAogCQkvKiBhdHRhY2ggZGVtb2QgKi8KQEAgLTU5Myw3ICs2MTgsOSBAQAogCiAJCWJyZWFrOwogCWNhc2UgQU5ZU0VFX0hXXzUwOFRDOiAvKiAxOCAqLworCWNhc2UgQU5ZU0VFX0hXXzUwOFBUQzogLyogMjEgKi8KIAkJLyogRTcgVEMgKi8KKwkJLyogRTcgUFRDICovCiAKIAkJLyogZW5hYmxlIHRyYW5zcG9ydCBzdHJlYW0gb24gSU9BWzddICovCiAJCXJldCA9IGFueXNlZV93cl9yZWdfbWFzayhhZGFwLT5kZXYsIFJFR19JT0EsICgxIDw8IDcpLCAweDgwKTsKQEAgLTY1MCw3ICs2NzcsOSBAQAogCiAJCWJyZWFrOwogCWNhc2UgQU5ZU0VFX0hXXzUwOFMyOiAvKiAxOSAqLworCWNhc2UgQU5ZU0VFX0hXXzUwOFBTMjogLyogMjIgKi8KIAkJLyogRTcgUzIgKi8KKwkJLyogRTcgUFMyICovCiAKIAkJLyogZW5hYmxlIHRyYW5zcG9ydCBzdHJlYW0gb24gSU9BWzddICovCiAJCXJldCA9IGFueXNlZV93cl9yZWdfbWFzayhhZGFwLT5kZXYsIFJFR19JT0EsICgxIDw8IDcpLCAweDgwKTsKQEAgLTY4Nyw3ICs3MTYsNyBAQAogCWRlYl9pbmZvKCIlczpcbiIsIF9fZnVuY19fKTsKIAogCXN3aXRjaCAoc3RhdGUtPmh3KSB7Ci0JY2FzZSBBTllTRUVfSFdfMDI6IC8qIDIgKi8KKwljYXNlIEFOWVNFRV9IV181MDdUOiAvKiAyICovCiAJCS8qIEUzMCAqLwogCiAJCS8qIGF0dGFjaCB0dW5lciAqLwpAQCAtNzYyLDcgKzc5MSw5IEBACiAKIAkJYnJlYWs7CiAJY2FzZSBBTllTRUVfSFdfNTA4VEM6IC8qIDE4ICovCisJY2FzZSBBTllTRUVfSFdfNTA4UFRDOiAvKiAyMSAqLwogCQkvKiBFNyBUQyAqLworCQkvKiBFNyBQVEMgKi8KIAogCQkvKiBlbmFibGUgdHVuZXIgb24gSU9FWzRdICovCiAJCXJldCA9IGFueXNlZV93cl9yZWdfbWFzayhhZGFwLT5kZXYsIFJFR19JT0UsICgxIDw8IDQpLCAweDEwKTsKQEAgLTc3NSw3ICs4MDYsOSBAQAogCiAJCWJyZWFrOwogCWNhc2UgQU5ZU0VFX0hXXzUwOFMyOiAvKiAxOSAqLworCWNhc2UgQU5ZU0VFX0hXXzUwOFBTMjogLyogMjIgKi8KIAkJLyogRTcgUzIgKi8KKwkJLyogRTcgUFMyICovCiAKIAkJLyogYXR0YWNoIHR1bmVyICovCiAJCWZlID0gZHZiX2F0dGFjaChzdHY2MTEwX2F0dGFjaCwgYWRhcC0+ZmUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FueXNlZS5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9hbnlzZWUuaAppbmRleCBhNzY3M2FhLi5hZDZjY2QxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2FueXNlZS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvYW55c2VlLmgKQEAgLTYxLDEzICs2MSwxNSBAQAogCXU4IHNlcTsKIH07CiAKLSNkZWZpbmUgQU5ZU0VFX0hXXzAyICAgICAyIC8qIEUzMCAqLwotI2RlZmluZSBBTllTRUVfSFdfNTA3Q0QgIDYgLyogRTMwIFBsdXMgKi8KLSNkZWZpbmUgQU5ZU0VFX0hXXzUwN0RDIDEwIC8qIEUzMCBDIFBsdXMgKi8KLSNkZWZpbmUgQU5ZU0VFX0hXXzUwN1NJIDExIC8qIEUzMCBTMiBQbHVzICovCi0jZGVmaW5lIEFOWVNFRV9IV181MDdGQSAxNSAvKiBFMzAgQ29tYm8gUGx1cyAvIEUzMCBDIFBsdXMgKi8KLSNkZWZpbmUgQU5ZU0VFX0hXXzUwOFRDIDE4IC8qIEU3IFRDICovCi0jZGVmaW5lIEFOWVNFRV9IV181MDhTMiAxOSAvKiBFNyBTMiAqLworI2RlZmluZSBBTllTRUVfSFdfNTA3VCAgICAyIC8qIEUzMCAqLworI2RlZmluZSBBTllTRUVfSFdfNTA3Q0QgICA2IC8qIEUzMCBQbHVzICovCisjZGVmaW5lIEFOWVNFRV9IV181MDdEQyAgMTAgLyogRTMwIEMgUGx1cyAqLworI2RlZmluZSBBTllTRUVfSFdfNTA3U0kgIDExIC8qIEUzMCBTMiBQbHVzICovCisjZGVmaW5lIEFOWVNFRV9IV181MDdGQSAgMTUgLyogRTMwIENvbWJvIFBsdXMgLyBFMzAgQyBQbHVzICovCisjZGVmaW5lIEFOWVNFRV9IV181MDhUQyAgMTggLyogRTcgVEMgKi8KKyNkZWZpbmUgQU5ZU0VFX0hXXzUwOFMyICAxOSAvKiBFNyBTMiAqLworI2RlZmluZSBBTllTRUVfSFdfNTA4UFRDIDIxIC8qIEU3IFBUQyBQbHVzICovCisjZGVmaW5lIEFOWVNFRV9IV181MDhQUzIgMjIgLyogRTcgUFMyIFBsdXMgKi8KIAogI2RlZmluZSBSRUdfSU9BICAgICAgIDB4ODAgLyogUG9ydCBBIChiaXQgYWRkcmVzc2FibGUpICovCiAjZGVmaW5lIFJFR19JT0IgICAgICAgMHg5MCAvKiBQb3J0IEIgKGJpdCBhZGRyZXNzYWJsZSkgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGliMDcwMF9kZXZpY2VzLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2RpYjA3MDBfZGV2aWNlcy5jCmluZGV4IGM1MTlhZDUuLmQwZWE1YjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZGliMDcwMF9kZXZpY2VzLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kaWIwNzAwX2RldmljZXMuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgIm10MjI2Ni5oIgogI2luY2x1ZGUgInR1bmVyLXhjMjAyOC5oIgogI2luY2x1ZGUgInhjNTAwMC5oIgorI2luY2x1ZGUgInhjNDAwMC5oIgogI2luY2x1ZGUgInM1aDE0MTEuaCIKICNpbmNsdWRlICJkaWIwMDcwLmgiCiAjaW5jbHVkZSAiZGliMDA5MC5oIgpAQCAtMjY1NSw2ICsyNjU2LDE1NiBAQAogCQk9PSBOVUxMID8gLUVOT0RFViA6IDA7CiB9CiAKK3N0YXRpYyBpbnQgZGliMDcwMF94YzQwMDBfdHVuZXJfY2FsbGJhY2sodm9pZCAqcHJpdiwgaW50IGNvbXBvbmVudCwKKwkJCQkJIGludCBjb21tYW5kLCBpbnQgYXJnKQoreworCXN0cnVjdCBkdmJfdXNiX2FkYXB0ZXIgKmFkYXAgPSBwcml2OworCisJaWYgKGNvbW1hbmQgPT0gWEM0MDAwX1RVTkVSX1JFU0VUKSB7CisJCS8qIFJlc2V0IHRoZSB0dW5lciAqLworCQlkaWI3MDAwcF9zZXRfZ3BpbyhhZGFwLT5mZSwgOCwgMCwgMCk7CisJCW1zbGVlcCgxMCk7CisJCWRpYjcwMDBwX3NldF9ncGlvKGFkYXAtPmZlLCA4LCAwLCAxKTsKKwl9IGVsc2UgeworCQllcnIoInhjNDAwMDogdW5rbm93biB0dW5lciBjYWxsYmFjayBjb21tYW5kOiAlZFxuIiwgY29tbWFuZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRpYngwMDBfYWdjX2NvbmZpZyBzdGs3NzAwcF83MDAwcF94YzQwMDBfYWdjX2NvbmZpZyA9IHsKKwkuYmFuZF9jYXBzID0gQkFORF9VSEYgfCBCQU5EX1ZIRiwKKwkuc2V0dXAgPSAweDY0LAorCS5pbnZfZ2FpbiA9IDB4MDJjOCwKKwkudGltZV9zdGFiaWxpeiA9IDB4MTUsCisJLmFscGhhX2xldmVsID0gMHgwMCwKKwkudGhsb2NrID0gMHg3NiwKKwkud2JkX2ludiA9IDB4MDEsCisJLndiZF9yZWYgPSAweDBiMzMsCisJLndiZF9zZWwgPSAweDAwLAorCS53YmRfYWxwaGEgPSAweDAyLAorCS5hZ2MxX21heCA9IDB4MDAsCisJLmFnYzFfbWluID0gMHgwMCwKKwkuYWdjMl9tYXggPSAweDliMjYsCisJLmFnYzJfbWluID0gMHgyNmNhLAorCS5hZ2MxX3B0MSA9IDB4MDAsCisJLmFnYzFfcHQyID0gMHgwMCwKKwkuYWdjMV9wdDMgPSAweDAwLAorCS5hZ2MxX3Nsb3BlMSA9IDB4MDAsCisJLmFnYzFfc2xvcGUyID0gMHgwMCwKKwkuYWdjMl9wdDEgPSAweDAwLAorCS5hZ2MyX3B0MiA9IDB4ODAsCisJLmFnYzJfc2xvcGUxID0gMHgxZCwKKwkuYWdjMl9zbG9wZTIgPSAweDFkLAorCS5hbHBoYV9tYW50ID0gMHgxMSwKKwkuYWxwaGFfZXhwID0gMHgxYiwKKwkuYmV0YV9tYW50ID0gMHgxNywKKwkuYmV0YV9leHAgPSAweDMzLAorCS5wZXJmb3JtX2FnY19zb2Z0c3BsaXQgPSAweDAwLAorfTsKKworc3RhdGljIHN0cnVjdCBkaWJ4MDAwX2JhbmR3aWR0aF9jb25maWcgc3RrNzcwMHBfeGM0MDAwX3BsbF9jb25maWcgPSB7CisJNjAwMDAsIDMwMDAwLAkvKiBpbnRlcm5hbCwgc2FtcGxpbmcgKi8KKwkxLCA4LCAzLCAxLCAwLAkvKiBwbGxfY2ZnOiBwcmVkaXYsIHJhdGlvLCByYW5nZSwgcmVzZXQsIGJ5cGFzcyAqLworCTAsIDAsIDEsIDEsIDAsCS8qIG1pc2M6IHJlZmRpdiwgYnlwY2xrX2RpdiwgSU9fQ0xLX2VuX2NvcmUsICovCisJCQkvKiBBRENsa1NyYywgbW9kdWxvICovCisJKDMgPDwgMTQpIHwgKDEgPDwgMTIpIHwgNTI0LAkvKiBzYWRfY2ZnOiByZWZzZWwsIHNlbCwgZnJlcV8xNWsgKi8KKwkzOTM3MDUzNCwJLyogaWZyZXEgKi8KKwkyMDQ1MjIyNSwJLyogdGltZiAqLworCTMwMDAwMDAwCS8qIHh0YWwgKi8KK307CisKKy8qIEZJWE1FOiBub25lIG9mIHRoZXNlIGlucHV0cyBhcmUgdmFsaWRhdGVkIHlldCAqLworc3RhdGljIHN0cnVjdCBkaWI3MDAwcF9jb25maWcgcGN0dl8zNDBlX2NvbmZpZyA9IHsKKwkub3V0cHV0X21wZWcyX2luXzE4OF9ieXRlcyA9IDEsCisKKwkuYWdjX2NvbmZpZ19jb3VudCA9IDEsCisJLmFnYyA9ICZzdGs3NzAwcF83MDAwcF94YzQwMDBfYWdjX2NvbmZpZywKKwkuYncgID0gJnN0azc3MDBwX3hjNDAwMF9wbGxfY29uZmlnLAorCisJLmdwaW9fZGlyID0gRElCNzAwME1fR1BJT19ERUZBVUxUX0RJUkVDVElPTlMsCisJLmdwaW9fdmFsID0gRElCNzAwME1fR1BJT19ERUZBVUxUX1ZBTFVFUywKKwkuZ3Bpb19wd21fcG9zID0gRElCNzAwME1fR1BJT19ERUZBVUxUX1BXTV9QT1MsCit9OworCisvKiBQQ1RWIDM0MGUgR1BJT3MgbWFwOgorICAgZGliMDcwMDoKKyAgIEdQSU8yICAtIENYMjU4NDMgc2xlZXAKKyAgIEdQSU8zICAtIENTNTM0MCByZXNldAorICAgR1BJTzUgIC0gSVJECisgICBHUElPNiAgLSBQb3dlciBTdXBwbHkKKyAgIEdQSU84ICAtIExOQSAoMT1vZmYgMD1vbikKKyAgIEdQSU8xMCAtIENYMjU4NDMgcmVzZXQKKyAgIGRpYjcwMDA6CisgICBHUElPOCAgLSB4YzQwMDAgcmVzZXQKKyAqLworc3RhdGljIGludCBwY3R2MzQwZV9mcm9udGVuZF9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3QgZGliMDcwMF9zdGF0ZSAqc3QgPSBhZGFwLT5kZXYtPnByaXY7CisKKwkvKiBQb3dlciBTdXBwbHkgb24gKi8KKwlkaWIwNzAwX3NldF9ncGlvKGFkYXAtPmRldiwgR1BJTzYsICBHUElPX09VVCwgMCk7CisJbXNsZWVwKDUwKTsKKwlkaWIwNzAwX3NldF9ncGlvKGFkYXAtPmRldiwgR1BJTzYsICBHUElPX09VVCwgMSk7CisJbXNsZWVwKDEwMCk7IC8qIEFsbG93IHBvd2VyIHN1cHBseSB0byBzZXR0bGUgYmVmb3JlIHByb2JpbmcgKi8KKworCS8qIGN4MjU4NDMgcmVzZXQgKi8KKwlkaWIwNzAwX3NldF9ncGlvKGFkYXAtPmRldiwgR1BJTzEwLCAgR1BJT19PVVQsIDApOworCW1zbGVlcCgxKTsgLyogY3gyNTg0MyBkYXRhc2hlZXQgc2F5IDM1MHVzIHJlcXVpcmVkICovCisJZGliMDcwMF9zZXRfZ3BpbyhhZGFwLT5kZXYsIEdQSU8xMCwgIEdQSU9fT1VULCAxKTsKKworCS8qIExOQSBvZmYgZm9yIG5vdyAqLworCWRpYjA3MDBfc2V0X2dwaW8oYWRhcC0+ZGV2LCBHUElPOCwgIEdQSU9fT1VULCAxKTsKKworCS8qIFB1dCB0aGUgQ1gyNTg0MyB0byBzbGVlcCBmb3Igbm93IHNpbmNlIHdlJ3JlIGluIGRpZ2l0YWwgbW9kZSAqLworCWRpYjA3MDBfc2V0X2dwaW8oYWRhcC0+ZGV2LCBHUElPMiwgR1BJT19PVVQsIDEpOworCisJLyogRklYTUU6IG5vdCB2ZXJpZmllZCB5ZXQgKi8KKwlkaWIwNzAwX2N0cmxfY2xvY2soYWRhcC0+ZGV2LCA3MiwgMSk7CisKKwltc2xlZXAoNTAwKTsKKworCWlmIChkaWI3MDAwcGNfZGV0ZWN0aW9uKCZhZGFwLT5kZXYtPmkyY19hZGFwKSA9PSAwKSB7CisJCS8qIERlbW9kdWxhdG9yIG5vdCBmb3VuZCBmb3Igc29tZSByZWFzb24/ICovCisJCXJldHVybiAtRU5PREVWOworCX0KKworCWFkYXAtPmZlID0gZHZiX2F0dGFjaChkaWI3MDAwcF9hdHRhY2gsICZhZGFwLT5kZXYtPmkyY19hZGFwLCAweDEyLAorCQkJICAgICAgJnBjdHZfMzQwZV9jb25maWcpOworCXN0LT5pc19kaWI3MDAwcGMgPSAxOworCisJcmV0dXJuIGFkYXAtPmZlID09IE5VTEwgPyAtRU5PREVWIDogMDsKK30KKworc3RhdGljIHN0cnVjdCB4YzQwMDBfY29uZmlnIGRpYjcwMDBwX3hjNDAwMF90dW5lcmNvbmZpZyA9IHsKKwkuaTJjX2FkZHJlc3MJICA9IDB4NjEsCisJLmRlZmF1bHRfcG0JICA9IDEsCisJLmR2Yl9hbXBsaXR1ZGUJICA9IDAsCisJLnNldF9zbW9vdGhlZGN2YnMgPSAwLAorCS5pZl9raHoJCSAgPSA1NDAwCit9OworCitzdGF0aWMgaW50IHhjNDAwMF90dW5lcl9hdHRhY2goc3RydWN0IGR2Yl91c2JfYWRhcHRlciAqYWRhcCkKK3sKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKnR1bl9pMmM7CisKKwkvKiBUaGUgeGM0MDAwIGlzIG5vdCBvbiB0aGUgbWFpbiBpMmMgYnVzICovCisJdHVuX2kyYyA9IGRpYjcwMDBwX2dldF9pMmNfbWFzdGVyKGFkYXAtPmZlLAorCQkJCQkgIERJQlgwMDBfSTJDX0lOVEVSRkFDRV9UVU5FUiwgMSk7CisJaWYgKHR1bl9pMmMgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCByZWFjaCB0dW5lciBpMmMgYnVzXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogU2V0dXAgdGhlIHJlc2V0IGNhbGxiYWNrICovCisJYWRhcC0+ZmUtPmNhbGxiYWNrID0gZGliMDcwMF94YzQwMDBfdHVuZXJfY2FsbGJhY2s7CisKKwlyZXR1cm4gZHZiX2F0dGFjaCh4YzQwMDBfYXR0YWNoLCBhZGFwLT5mZSwgdHVuX2kyYywKKwkJCSAgJmRpYjcwMDBwX3hjNDAwMF90dW5lcmNvbmZpZykKKwkJPT0gTlVMTCA/IC1FTk9ERVYgOiAwOworfQorCiBzdGF0aWMgc3RydWN0IGxnZHQzMzA1X2NvbmZpZyBoY3dfbGdkdDMzMDVfY29uZmlnID0gewogCS5pMmNfYWRkciAgICAgICAgICAgPSAweDBlLAogCS5tcGVnX21vZGUgICAgICAgICAgPSBMR0RUMzMwNV9NUEVHX1BBUkFMTEVMLApAQCAtMjgwMiw2ICsyOTUzLDggQEAKIAl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9ESUJDT00sICAgIFVTQl9QSURfRElCQ09NX1RGRTcwOTBQVlIpIH0sCiAJeyBVU0JfREVWSUNFKFVTQl9WSURfVEVDSE5JU0FULCBVU0JfUElEX1RFQ0hOSVNBVF9BSVJTVEFSX1RFTEVTVElDS18yKSB9LAogLyogNzUgKi97IFVTQl9ERVZJQ0UoVVNCX1ZJRF9NRURJT04sICAgIFVTQl9QSURfQ1JFQVRJWF9DVFgxOTIxKSB9LAorCXsgVVNCX0RFVklDRShVU0JfVklEX1BJTk5BQ0xFLCAgVVNCX1BJRF9QSU5OQUNMRV9QQ1RWMzQwRSkgfSwKKwl7IFVTQl9ERVZJQ0UoVVNCX1ZJRF9QSU5OQUNMRSwgIFVTQl9QSURfUElOTkFDTEVfUENUVjM0MEVfU0UpIH0sCiAJeyAwIH0JCS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIGRpYjA3MDBfdXNiX2lkX3RhYmxlKTsKQEAgLTM3NzIsNiArMzkyNSw0MSBAQAogCQkJCQkgICAgUkNfVFlQRV9ORUMsCiAJCQkuY2hhbmdlX3Byb3RvY29sICA9IGRpYjA3MDBfY2hhbmdlX3Byb3RvY29sLAogCQl9LAorCX0sIHsgRElCMDcwMF9ERUZBVUxUX0RFVklDRV9QUk9QRVJUSUVTLAorCQkubnVtX2FkYXB0ZXJzID0gMSwKKwkJLmFkYXB0ZXIgPSB7CisJCQl7CisJCQkJLmZyb250ZW5kX2F0dGFjaCAgPSBwY3R2MzQwZV9mcm9udGVuZF9hdHRhY2gsCisJCQkJLnR1bmVyX2F0dGFjaCAgICAgPSB4YzQwMDBfdHVuZXJfYXR0YWNoLAorCisJCQkJRElCMDcwMF9ERUZBVUxUX1NUUkVBTUlOR19DT05GSUcoMHgwMiksCisKKwkJCQkuc2l6ZV9vZl9wcml2ID0gc2l6ZW9mKHN0cnVjdAorCQkJCQkJZGliMDcwMF9hZGFwdGVyX3N0YXRlKSwKKwkJCX0sCisJCX0sCisKKwkJLm51bV9kZXZpY2VfZGVzY3MgPSAyLAorCQkuZGV2aWNlcyA9IHsKKwkJCXsgICAiUGlubmFjbGUgUENUViAzNDBlIEhEIFBybyBVU0IgU3RpY2siLAorCQkJCXsgJmRpYjA3MDBfdXNiX2lkX3RhYmxlWzc2XSwgTlVMTCB9LAorCQkJCXsgTlVMTCB9LAorCQkJfSwKKwkJCXsgICAiUGlubmFjbGUgUENUViBIeWJyaWQgU3RpY2sgU29sbyIsCisJCQkJeyAmZGliMDcwMF91c2JfaWRfdGFibGVbNzddLCBOVUxMIH0sCisJCQkJeyBOVUxMIH0sCisJCQl9LAorCQl9LAorCQkucmMuY29yZSA9IHsKKwkJCS5yY19pbnRlcnZhbCAgICAgID0gREVGQVVMVF9SQ19JTlRFUlZBTCwKKwkJCS5yY19jb2RlcyAgICAgICAgID0gUkNfTUFQX0RJQjA3MDBfUkM1X1RBQkxFLAorCQkJLm1vZHVsZV9uYW1lCSAgPSAiZGliMDcwMCIsCisJCQkucmNfcXVlcnkgICAgICAgICA9IGRpYjA3MDBfcmNfcXVlcnlfb2xkX2Zpcm13YXJlLAorCQkJLmFsbG93ZWRfcHJvdG9zICAgPSBSQ19UWVBFX1JDNSB8CisJCQkJCSAgICBSQ19UWVBFX1JDNiB8CisJCQkJCSAgICBSQ19UWVBFX05FQywKKwkJCS5jaGFuZ2VfcHJvdG9jb2wgID0gZGliMDcwMF9jaGFuZ2VfcHJvdG9jb2wsCisJCX0sCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pZHMuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi1pZHMuaAppbmRleCAyMWIxNTQ5Li4yYTc5YjhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2ItaWRzLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9kdmItdXNiLWlkcy5oCkBAIC0yMzAsNiArMjMwLDggQEAKICNkZWZpbmUgVVNCX1BJRF9QSU5OQUNMRV9QQ1RWMzEwRQkJCTB4MzIxMQogI2RlZmluZSBVU0JfUElEX1BJTk5BQ0xFX1BDVFY4MDFFCQkJMHgwMjNhCiAjZGVmaW5lIFVTQl9QSURfUElOTkFDTEVfUENUVjgwMUVfU0UJCQkweDAyM2IKKyNkZWZpbmUgVVNCX1BJRF9QSU5OQUNMRV9QQ1RWMzQwRQkJCTB4MDIzZAorI2RlZmluZSBVU0JfUElEX1BJTk5BQ0xFX1BDVFYzNDBFX1NFCQkJMHgwMjNlCiAjZGVmaW5lIFVTQl9QSURfUElOTkFDTEVfUENUVjczQQkJCTB4MDI0MwogI2RlZmluZSBVU0JfUElEX1BJTk5BQ0xFX1BDVFY3M0VTRQkJCTB4MDI0NQogI2RlZmluZSBVU0JfUElEX1BJTk5BQ0xFX1BDVFY3NEUJCQkweDAyNDYKQEAgLTMxMyw2ICszMTUsNyBAQAogI2RlZmluZSBVU0JfUElEX0ZSSUlPX1dISVRFCQkJCTB4MDAwMQogI2RlZmluZSBVU0JfUElEX1RWV0FZX1BMVVMJCQkJMHgwMDAyCiAjZGVmaW5lIFVTQl9QSURfU1ZFT05fU1RWMjAJCQkJMHhlMzlkCisjZGVmaW5lIFVTQl9QSURfU1ZFT05fU1RWMjIJCQkJMHhlNDAxCiAjZGVmaW5lIFVTQl9QSURfQVpVUkVXQVZFX0FaNjAyNwkJCTB4MzI3NQogI2RlZmluZSBVU0JfUElEX1RFUlJBVEVDX0RWQlMyQ0lfVjEJCQkweDEwYTQKICNkZWZpbmUgVVNCX1BJRF9URVJSQVRFQ19EVkJTMkNJX1YyCQkJMHgxMGFjCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2R2Yi11c2IuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi5oCmluZGV4IDc2YTgwOTYuLjdkMzVkMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZHZiLXVzYi5oCkBAIC04NSw3ICs4NSw3IEBACiAJcmV0dXJuIGtleS0+c2NhbmNvZGUgJiAweGZmOwogfQogCi1zdGF0aWMgaW5saW5lIHU4IHJjNV9zY2FuKHN0cnVjdCByY19tYXBfdGFibGUgKmtleSkKK3N0YXRpYyBpbmxpbmUgdTE2IHJjNV9zY2FuKHN0cnVjdCByY19tYXBfdGFibGUgKmtleSkKIHsKIAlyZXR1cm4ga2V5LT5zY2FuY29kZSAmIDB4ZmZmZjsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZ3A4cHNrLmggYi9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL2dwOHBzay5oCmluZGV4IDgzMTc0OWEuLmVkMzJiOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvZ3A4cHNrLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi9ncDhwc2suaApAQCAtNzgsOSArNzgsNiBAQAogI2RlZmluZSBBRFZfTU9EX0RWQl9CUFNLIDkgICAgIC8qIERWQi1TIEJQU0sgKi8KIAogI2RlZmluZSBHRVRfVVNCX1NQRUVEICAgICAgICAgICAgICAgICAgICAgMHgwNwotICNkZWZpbmUgVVNCX1NQRUVEX0xPVyAgICAgICAgICAgICAgICAgICAgMAotICNkZWZpbmUgVVNCX1NQRUVEX0ZVTEwgICAgICAgICAgICAgICAgICAgMQotICNkZWZpbmUgVVNCX1NQRUVEX0hJR0ggICAgICAgICAgICAgICAgICAgMgogCiAjZGVmaW5lIFJFU0VUX0ZYMiAgICAgICAgICAgICAgICAgICAgICAgICAweDEzCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdGVjaG5pc2F0LXVzYjIuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdGVjaG5pc2F0LXVzYjIuYwppbmRleCAwOGY4ODQyLi40NzNiOTVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3RlY2huaXNhdC11c2IyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi90ZWNobmlzYXQtdXNiMi5jCkBAIC03NjUsMTAgKzc2NSw4IEBACiAJLyogd29yayBhbmQgc3R1ZmYgd2FzIG9ubHkgY3JlYXRlZCB3aGVuIHRoZSBkZXZpY2UgaXMgaXMgaG90LXN0YXRlICovCiAJaWYgKGRldiAhPSBOVUxMKSB7CiAJCXN0cnVjdCB0ZWNobmlzYXRfdXNiMl9zdGF0ZSAqc3RhdGUgPSBkZXYtPnByaXY7Ci0JCWlmIChzdGF0ZSAhPSBOVUxMKSB7CisJCWlmIChzdGF0ZSAhPSBOVUxMKQogCQkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZzdGF0ZS0+Z3JlZW5fbGVkX3dvcmspOwotCQkJZmx1c2hfc2NoZWR1bGVkX3dvcmsoKTsKLQkJfQogCX0KIAogCWR2Yl91c2JfZGV2aWNlX2V4aXQoaW50Zik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzA0NS5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZHZiLXVzYi92cDcwNDUuaAppbmRleCA5Njk2ODhmLi5jZjVlYzQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9kdmItdXNiL3ZwNzA0NS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2R2Yi11c2IvdnA3MDQ1LmgKQEAgLTM2LDkgKzM2LDYgQEAKICAjZGVmaW5lIFR1bmVyX1Bvd2VyX09GRiAgICAgICAgICAgICAgICAgIDAKIAogI2RlZmluZSBHRVRfVVNCX1NQRUVEICAgICAgICAgICAgICAgICAgICAgMHgwNwotICNkZWZpbmUgVVNCX1NQRUVEX0xPVyAgICAgICAgICAgICAgICAgICAgMAotICNkZWZpbmUgVVNCX1NQRUVEX0ZVTEwgICAgICAgICAgICAgICAgICAgMQotICNkZWZpbmUgVVNCX1NQRUVEX0hJR0ggICAgICAgICAgICAgICAgICAgMgogCiAjZGVmaW5lIExPQ0tfVFVORVJfQ09NTUFORCAgICAgICAgICAgICAgICAweDA5CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2ZpcmV3aXJlL2ZpcmVkdHYtYXZjLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9maXJld2lyZS9maXJlZHR2LWF2Yy5jCmluZGV4IDIxYzUyZTMuLjQ4OWFlODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2ZpcmV3aXJlL2ZpcmVkdHYtYXZjLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZmlyZXdpcmUvZmlyZWR0di1hdmMuYwpAQCAtMTIwOCw3ICsxMjA4LDcgQEAKIAlpZiAoci0+cmVzcG9uc2UgIT0gQVZDX1JFU1BPTlNFX0FDQ0VQVEVEKSB7CiAJCWRldl9lcnIoZmR0di0+ZGV2aWNlLAogCQkJIkNBIFBNVCBmYWlsZWQgd2l0aCByZXNwb25zZSAweCV4XG4iLCByLT5yZXNwb25zZSk7Ci0JCXJldCA9IC1FRkFVTFQ7CisJCXJldCA9IC1FQUNDRVM7CiAJfQogb3V0OgogCW11dGV4X3VubG9jaygmZmR0di0+YXZjX211dGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2ZpcmV3aXJlL2ZpcmVkdHYtY2kuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2ZpcmV3aXJlL2ZpcmVkdHYtY2kuYwppbmRleCA4ZmZiNTY1Li5lNWViZGJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9maXJld2lyZS9maXJlZHR2LWNpLmMKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZmlyZXdpcmUvZmlyZWR0di1jaS5jCkBAIC00NSwxMSArNDUsNiBAQAogCXJldHVybiBmbGFnczsKIH0KIAotc3RhdGljIGludCBmZHR2X2NhX3Jlc2V0KHN0cnVjdCBmaXJlZHR2ICpmZHR2KQotewotCXJldHVybiBhdmNfY2FfcmVzZXQoZmR0dikgPyAtRUZBVUxUIDogMDsKLX0KLQogc3RhdGljIGludCBmZHR2X2NhX2dldF9jYXBzKHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgY2FfY2FwcyAqY2FwID0gYXJnOwpAQCAtNjUsMTIgKzYwLDE0IEBACiB7CiAJc3RydWN0IGZpcmVkdHZfdHVuZXJfc3RhdHVzIHN0YXQ7CiAJc3RydWN0IGNhX3Nsb3RfaW5mbyAqc2xvdCA9IGFyZzsKKwlpbnQgZXJyOwogCi0JaWYgKGF2Y190dW5lcl9zdGF0dXMoZmR0diwgJnN0YXQpKQotCQlyZXR1cm4gLUVGQVVMVDsKKwllcnIgPSBhdmNfdHVuZXJfc3RhdHVzKGZkdHYsICZzdGF0KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOwogCiAJaWYgKHNsb3QtPm51bSAhPSAwKQotCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIC1FQUNDRVM7CiAKIAlzbG90LT50eXBlID0gQ0FfQ0k7CiAJc2xvdC0+ZmxhZ3MgPSBmZHR2X2dldF9jYV9mbGFncygmc3RhdCk7CkBAIC04MSwyMSArNzgsMjEgQEAKIHsKIAlzdHJ1Y3QgY2FfbXNnICpyZXBseSA9IGFyZzsKIAotCXJldHVybiBhdmNfY2FfYXBwX2luZm8oZmR0diwgcmVwbHktPm1zZywgJnJlcGx5LT5sZW5ndGgpID8gLUVGQVVMVCA6IDA7CisJcmV0dXJuIGF2Y19jYV9hcHBfaW5mbyhmZHR2LCByZXBseS0+bXNnLCAmcmVwbHktPmxlbmd0aCk7CiB9CiAKIHN0YXRpYyBpbnQgZmR0dl9jYV9pbmZvKHN0cnVjdCBmaXJlZHR2ICpmZHR2LCB2b2lkICphcmcpCiB7CiAJc3RydWN0IGNhX21zZyAqcmVwbHkgPSBhcmc7CiAKLQlyZXR1cm4gYXZjX2NhX2luZm8oZmR0diwgcmVwbHktPm1zZywgJnJlcGx5LT5sZW5ndGgpID8gLUVGQVVMVCA6IDA7CisJcmV0dXJuIGF2Y19jYV9pbmZvKGZkdHYsIHJlcGx5LT5tc2csICZyZXBseS0+bGVuZ3RoKTsKIH0KIAogc3RhdGljIGludCBmZHR2X2NhX2dldF9tbWkoc3RydWN0IGZpcmVkdHYgKmZkdHYsIHZvaWQgKmFyZykKIHsKIAlzdHJ1Y3QgY2FfbXNnICpyZXBseSA9IGFyZzsKIAotCXJldHVybiBhdmNfY2FfZ2V0X21taShmZHR2LCByZXBseS0+bXNnLCAmcmVwbHktPmxlbmd0aCkgPyAtRUZBVUxUIDogMDsKKwlyZXR1cm4gYXZjX2NhX2dldF9tbWkoZmR0diwgcmVwbHktPm1zZywgJnJlcGx5LT5sZW5ndGgpOwogfQogCiBzdGF0aWMgaW50IGZkdHZfY2FfZ2V0X21zZyhzdHJ1Y3QgZmlyZWR0diAqZmR0diwgdm9pZCAqYXJnKQpAQCAtMTExLDE0ICsxMDgsMTUgQEAKIAkJZXJyID0gZmR0dl9jYV9pbmZvKGZkdHYsIGFyZyk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWlmIChhdmNfdHVuZXJfc3RhdHVzKGZkdHYsICZzdGF0KSkKLQkJCWVyciA9IC1FRkFVTFQ7Ci0JCWVsc2UgaWYgKHN0YXQuY2FfbW1pID09IDEpCisJCWVyciA9IGF2Y190dW5lcl9zdGF0dXMoZmR0diwgJnN0YXQpOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJCWlmIChzdGF0LmNhX21taSA9PSAxKQogCQkJZXJyID0gZmR0dl9jYV9nZXRfbW1pKGZkdHYsIGFyZyk7CiAJCWVsc2UgewogCQkJZGV2X2luZm8oZmR0di0+ZGV2aWNlLCAidW5oYW5kbGVkIENBIG1lc3NhZ2UgMHglMDh4XG4iLAogCQkJCSBmZHR2LT5jYV9sYXN0X2NvbW1hbmQpOwotCQkJZXJyID0gLUVGQVVMVDsKKwkJCWVyciA9IC1FQUNDRVM7CiAJCX0KIAl9CiAJZmR0di0+Y2FfbGFzdF9jb21tYW5kID0gMDsKQEAgLTE0MSw3ICsxMzksNyBAQAogCQlkYXRhX2xlbmd0aCA9IG1zZy0+bXNnWzNdOwogCX0KIAotCXJldHVybiBhdmNfY2FfcG10KGZkdHYsICZtc2ctPm1zZ1tkYXRhX3Bvc10sIGRhdGFfbGVuZ3RoKSA/IC1FRkFVTFQgOiAwOworCXJldHVybiBhdmNfY2FfcG10KGZkdHYsICZtc2ctPm1zZ1tkYXRhX3Bvc10sIGRhdGFfbGVuZ3RoKTsKIH0KIAogc3RhdGljIGludCBmZHR2X2NhX3NlbmRfbXNnKHN0cnVjdCBmaXJlZHR2ICpmZHR2LCB2b2lkICphcmcpCkBAIC0xNzAsNyArMTY4LDcgQEAKIAlkZWZhdWx0OgogCQlkZXZfZXJyKGZkdHYtPmRldmljZSwgInVuaGFuZGxlZCBDQSBtZXNzYWdlIDB4JTA4eFxuIiwKIAkJCWZkdHYtPmNhX2xhc3RfY29tbWFuZCk7Ci0JCWVyciA9IC1FRkFVTFQ7CisJCWVyciA9IC1FQUNDRVM7CiAJfQogCXJldHVybiBlcnI7CiB9CkBAIC0xODQsNyArMTgyLDcgQEAKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBDQV9SRVNFVDoKLQkJZXJyID0gZmR0dl9jYV9yZXNldChmZHR2KTsKKwkJZXJyID0gYXZjX2NhX3Jlc2V0KGZkdHYpOwogCQlicmVhazsKIAljYXNlIENBX0dFVF9DQVA6CiAJCWVyciA9IGZkdHZfY2FfZ2V0X2NhcHMoYXJnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcKaW5kZXggNDRiODE2Zi4uMzJlMDhlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL0tjb25maWcKQEAgLTQ5LDYgKzQ5LDI3IEBACiAJaGVscAogCSAgQSBTaWxpY29uIHR1bmVyIHRoYXQgc3VwcG9ydHMgRFZCLVMgYW5kIERWQi1TMiBtb2RlcwogCitjb21tZW50ICJNdWx0aXN0YW5kYXJkIChjYWJsZSArIHRlcnJlc3RyaWFsKSBmcm9udGVuZHMiCisJZGVwZW5kcyBvbiBEVkJfQ09SRQorCitjb25maWcgRFZCX0RSWEsKKwl0cmlzdGF0ZSAiTWljcm9uYXMgRFJYSyBiYXNlZCIKKwlkZXBlbmRzIG9uIERWQl9DT1JFICYmIEkyQworCWRlZmF1bHQgbSBpZiBEVkJfRkVfQ1VTVE9NSVNFCisJaGVscAorCSAgTWljcm9uYXMgRFJYLUsgRFZCLUMvVCBkZW1vZHVsYXRvci4KKworCSAgU2F5IFkgd2hlbiB5b3Ugd2FudCB0byBzdXBwb3J0IHRoaXMgZnJvbnRlbmQuCisKK2NvbmZpZyBEVkJfVERBMTgyNzFDMkRECisJdHJpc3RhdGUgIk5YUCBUREExODI3MUMyIHNpbGljb24gdHVuZXIiCisJZGVwZW5kcyBvbiBEVkJfQ09SRSAmJiBJMkMKKwlkZWZhdWx0IG0gaWYgRFZCX0ZFX0NVU1RPTUlTRQorCWhlbHAKKwkgIE5YUCBUREExODI3MSBzaWxpY29uIHR1bmVyLgorCisJICBTYXkgWSB3aGVuIHlvdSB3YW50IHRvIHN1cHBvcnQgdGhpcyB0dW5lci4KKwogY29tbWVudCAiRFZCLVMgKHNhdGVsbGl0ZSkgZnJvbnRlbmRzIgogCWRlcGVuZHMgb24gRFZCX0NPUkUKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL01ha2VmaWxlCmluZGV4IDJmM2E2ZjcuLjZhNmJhMDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvTWFrZWZpbGUKQEAgLTEwLDYgKzEwLDcgQEAKIGF1ODUyMi1vYmpzID0gYXU4NTIyX2RpZy5vIGF1ODUyMl9kZWNvZGVyLm8KIGRyeGQtb2JqcyA9IGRyeGRfZmlybS5vIGRyeGRfaGFyZC5vCiBjeGQyODIwci1vYmpzID0gY3hkMjgyMHJfY29yZS5vIGN4ZDI4MjByX2MubyBjeGQyODIwcl90Lm8gY3hkMjgyMHJfdDIubworZHJ4ay1vYmpzIDo9IGRyeGtfaGFyZC5vCiAKIG9iai0kKENPTkZJR19EVkJfUExMKSArPSBkdmItcGxsLm8KIG9iai0kKENPTkZJR19EVkJfU1RWMDI5OSkgKz0gc3R2MDI5OS5vCkBAIC04OCw0ICs4OSw2IEBACiBvYmotJChDT05GSUdfRFZCX0lYMjUwNVYpICs9IGl4MjUwNXYubwogb2JqLSQoQ09ORklHX0RWQl9TVFYwMzY3KSArPSBzdHYwMzY3Lm8KIG9iai0kKENPTkZJR19EVkJfQ1hEMjgyMFIpICs9IGN4ZDI4MjByLm8KK29iai0kKENPTkZJR19EVkJfRFJYSykgKz0gZHJ4ay5vCitvYmotJChDT05GSUdfRFZCX1REQTE4MjcxQzJERCkgKz0gdGRhMTgyNzFjMmRkLm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2F1ODUyMl9kZWNvZGVyLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYXU4NTIyX2RlY29kZXIuYwppbmRleCBiNTM3ODkxLi4yYjI0OGMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYXU4NTIyX2RlY29kZXIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvYXU4NTIyX2RlY29kZXIuYwpAQCAtNjkyLDcgKzY5Miw3IEBACiAJLyogSW50ZXJyb2dhdGUgdGhlIGRlY29kZXIgdG8gc2VlIGlmIHdlIGFyZSBnZXR0aW5nIGEgcmVhbCBzaWduYWwgKi8KIAlsb2NrX3N0YXR1cyA9IGF1ODUyMl9yZWFkcmVnKHN0YXRlLCAweDAwKTsKIAlpZiAobG9ja19zdGF0dXMgPT0gMHhhMikKLQkJdnQtPnNpZ25hbCA9IDB4MDE7CisJCXZ0LT5zaWduYWwgPSAweGZmZmY7CiAJZWxzZQogCQl2dC0+c2lnbmFsID0gMHgwMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTMuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTEzLmMKaW5kZXggZTllZTU1NS4uYzM0MWQ1NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTMuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExMy5jCkBAIC0zMSw4ICszMSw4IEBACiAKIHN0YXRpYyBpbnQgZGVidWc7CiAKLSNkZWZpbmUgaW5mbyhhcmdzLi4uKSBkbyB7IHByaW50ayhLRVJOX0lORk8gIkNYMjQxMTM6ICIgYXJncyk7IH0gd2hpbGUgKDApCi0jZGVmaW5lIGVycihhcmdzLi4uKSAgZG8geyBwcmludGsoS0VSTl9FUlIgICJDWDI0MTEzOiAiIGFyZ3MpOyB9IHdoaWxlICgwKQorI2RlZmluZSBjeF9pbmZvKGFyZ3MuLi4pIGRvIHsgcHJpbnRrKEtFUk5fSU5GTyAiQ1gyNDExMzogIiBhcmdzKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgY3hfZXJyKGFyZ3MuLi4pICBkbyB7IHByaW50ayhLRVJOX0VSUiAgIkNYMjQxMTM6ICIgYXJncyk7IH0gd2hpbGUgKDApCiAKICNkZWZpbmUgZHByaW50ayhhcmdzLi4uKSBcCiAJZG8geyBcCkBAIC0zNDEsNyArMzQxLDcgQEAKIAl9IHdoaWxlIChOIDwgNiAmJiBSIDwgMyk7CiAKIAlpZiAoTiA8IDYpIHsKLQkJZXJyKCJzdHJhbmdlIGZyZXF1ZW5jeTogTiA8IDZcbiIpOworCQljeF9lcnIoInN0cmFuZ2UgZnJlcXVlbmN5OiBOIDwgNlxuIik7CiAJCXJldHVybjsKIAl9CiAJRiA9IGZyZXFfaHo7CkBAIC01NjMsNyArNTYzLDcgQEAKIAkJa3phbGxvYyhzaXplb2Yoc3RydWN0IGN4MjQxMTNfc3RhdGUpLCBHRlBfS0VSTkVMKTsKIAlpbnQgcmM7CiAJaWYgKHN0YXRlID09IE5VTEwpIHsKLQkJZXJyKCJVbmFibGUgdG8ga3phbGxvY1xuIik7CisJCWN4X2VycigiVW5hYmxlIHRvIGt6YWxsb2NcbiIpOwogCQlnb3RvIGVycm9yOwogCX0KIApAQCAtNTcxLDcgKzU3MSw3IEBACiAJc3RhdGUtPmNvbmZpZyA9IGNvbmZpZzsKIAlzdGF0ZS0+aTJjID0gaTJjOwogCi0JaW5mbygidHJ5aW5nIHRvIGRldGVjdCBteXNlbGZcbiIpOworCWN4X2luZm8oInRyeWluZyB0byBkZXRlY3QgbXlzZWxmXG4iKTsKIAogCS8qIG1ha2luZyBhIGR1bW15IHJlYWQsIGJlY2F1c2Ugb2Ygc29tZSBleHBlY3RlZCB0cm91YmxlcwogCSAqIGFmdGVyIHBvd2VyIG9uICovCkBAIC01NzksMjQgKzU3OSwyNCBAQAogCiAJcmMgPSBjeDI0MTEzX3JlYWRyZWcoc3RhdGUsIDB4MDApOwogCWlmIChyYyA8IDApIHsKLQkJaW5mbygiQ1gyNDExMyBub3QgZm91bmQuXG4iKTsKKwkJY3hfaW5mbygiQ1gyNDExMyBub3QgZm91bmQuXG4iKTsKIAkJZ290byBlcnJvcjsKIAl9CiAJc3RhdGUtPnJldiA9IHJjOwogCiAJc3dpdGNoIChyYykgewogCWNhc2UgMHg0MzoKLQkJaW5mbygiZGV0ZWN0ZWQgQ1gyNDExMyB2YXJpYW50XG4iKTsKKwkJY3hfaW5mbygiZGV0ZWN0ZWQgQ1gyNDExMyB2YXJpYW50XG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBSRVZfQ1gyNDExMzoKLQkJaW5mbygic3VjY2Vzc2Z1bGx5IGRldGVjdGVkXG4iKTsKKwkJY3hfaW5mbygic3VjY2Vzc2Z1bGx5IGRldGVjdGVkXG4iKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZXJyKCJ1bnN1cHBvcnRlZCBkZXZpY2UgaWQ6ICV4XG4iLCBzdGF0ZS0+cmV2KTsKKwkJY3hfZXJyKCJ1bnN1cHBvcnRlZCBkZXZpY2UgaWQ6ICV4XG4iLCBzdGF0ZS0+cmV2KTsKIAkJZ290byBlcnJvcjsKIAl9CiAJc3RhdGUtPnZlciA9IGN4MjQxMTNfcmVhZHJlZyhzdGF0ZSwgMHgwMSk7Ci0JaW5mbygidmVyc2lvbjogJXhcbiIsIHN0YXRlLT52ZXIpOworCWN4X2luZm8oInZlcnNpb246ICV4XG4iLCBzdGF0ZS0+dmVyKTsKIAogCS8qIGNyZWF0ZSBkdmJfZnJvbnRlbmQgKi8KIAltZW1jcHkoJmZlLT5vcHMudHVuZXJfb3BzLCAmY3gyNDExM190dW5lcl9vcHMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExNi5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4MjQxMTYuYwppbmRleCA5NWM2NDY1Li5jY2QwNTI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3gyNDExNi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeDI0MTE2LmMKQEAgLTE0NTIsMTEgKzE0NTIsNyBAQAogCWNtZC5hcmdzWzB4MDBdID0gQ01EX0JBTkRXSURUSDsKIAljbWQuYXJnc1sweDAxXSA9IDB4MDA7CiAJY21kLmxlbiA9IDB4MDI7Ci0JcmV0ID0gY3gyNDExNl9jbWRfZXhlY3V0ZShmZSwgJmNtZCk7Ci0JaWYgKHJldCAhPSAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gY3gyNDExNl9jbWRfZXhlY3V0ZShmZSwgJmNtZCk7CiB9CiAKIHN0YXRpYyBpbnQgY3gyNDExNl90dW5lKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeGQyODIwci5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4ZDI4MjByLmgKaW5kZXggYWQxNzg0NS4uMjkwNjU4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4ZDI4MjByLmgKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4ZDI4MjByLmgKQEAgLTU1LDEzICs1NSwxMyBAQAogCSAqIERlZmF1bHQ6IDAKIAkgKiBWYWx1ZXM6IDAsIDEKIAkgKi8KLQlpbnQgaWZfYWdjX3BvbGFyaXR5OjE7CisJYm9vbCBpZl9hZ2NfcG9sYXJpdHk7CiAKIAkvKiBTcGVjdHJ1bSBpbnZlcnNpb24uCiAJICogRGVmYXVsdDogMAogCSAqIFZhbHVlczogMCwgMQogCSAqLwotCWludCBzcGVjX2ludjoxOworCWJvb2wgc3BlY19pbnY7CiAKIAkvKiBJRnMgZm9yIGFsbCB1c2VkIG1vZGVzLgogCSAqIERlZmF1bHQ6IG5vbmUsIG11c3Qgc2V0CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3hkMjgyMHJfY29yZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4ZDI4MjByX2NvcmUuYwppbmRleCAwNzc5ZjY5Li5kNDE2ZTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3hkMjgyMHJfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeGQyODIwcl9jb3JlLmMKQEAgLTMxNCw2ICszMTQsOCBAQAogCQkJfSBlbHNlIGlmIChjLT5kZWxpdmVyeV9zeXN0ZW0gPT0gU1lTX0RWQlQyKSB7CiAJCQkJLyogRFZCLVQgPT4gRFZCLVQyICovCiAJCQkJcmV0ID0gY3hkMjgyMHJfc2xlZXBfdChmZSk7CisJCQkJaWYgKHJldCkKKwkJCQkJYnJlYWs7CiAJCQkJcmV0ID0gY3hkMjgyMHJfc2V0X2Zyb250ZW5kX3QyKGZlLCBwKTsKIAkJCX0KIAkJCWJyZWFrOwpAQCAtMzI0LDYgKzMyNiw4IEBACiAJCQl9IGVsc2UgaWYgKGMtPmRlbGl2ZXJ5X3N5c3RlbSA9PSBTWVNfRFZCVCkgewogCQkJCS8qIERWQi1UMiA9PiBEVkItVCAqLwogCQkJCXJldCA9IGN4ZDI4MjByX3NsZWVwX3QyKGZlKTsKKwkJCQlpZiAocmV0KQorCQkJCQlicmVhazsKIAkJCQlyZXQgPSBjeGQyODIwcl9zZXRfZnJvbnRlbmRfdChmZSwgcCk7CiAJCQl9CiAJCQlicmVhazsKQEAgLTc0MCwxMiArNzQ0LDEzIEBACiAJc3RydWN0IGkyY19tc2cgbXNnW10sIGludCBudW0pCiB7CiAJc3RydWN0IGN4ZDI4MjByX3ByaXYgKnByaXYgPSBpMmNfZ2V0X2FkYXBkYXRhKGkyY19hZGFwKTsKLQl1OCBvYnVmW21zZ1swXS5sZW4gKyAyXTsKKwlpbnQgcmV0OworCXU4ICpvYnVmID0ga21hbGxvYyhtc2dbMF0ubGVuICsgMiwgR0ZQX0tFUk5FTCk7CiAJc3RydWN0IGkyY19tc2cgbXNnMlsyXSA9IHsKIAkJewogCQkJLmFkZHIgPSBwcml2LT5jZmcuaTJjX2FkZHJlc3MsCiAJCQkuZmxhZ3MgPSAwLAotCQkJLmxlbiA9IHNpemVvZihvYnVmKSwKKwkJCS5sZW4gPSBtc2dbMF0ubGVuICsgMiwKIAkJCS5idWYgPSBvYnVmLAogCQl9LCB7CiAJCQkuYWRkciA9IHByaXYtPmNmZy5pMmNfYWRkcmVzcywKQEAgLTc1NSwxNSArNzYwLDI0IEBACiAJCX0KIAl9OwogCisJaWYgKCFvYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKwogCW9idWZbMF0gPSAweDA5OwogCW9idWZbMV0gPSAobXNnWzBdLmFkZHIgPDwgMSk7CiAJaWYgKG51bSA9PSAyKSB7IC8qIEkyQyByZWFkICovCiAJCW9idWZbMV0gPSAobXNnWzBdLmFkZHIgPDwgMSkgfCBJMkNfTV9SRDsgLyogSTJDIFJEIGZsYWcgKi8KLQkJbXNnMlswXS5sZW4gPSBzaXplb2Yob2J1ZikgLSAxOyAvKiBtYXliZSBIVyBidWcgPyAqLworCQltc2cyWzBdLmxlbiA9IG1zZ1swXS5sZW4gKyAyIC0gMTsgLyogJy0xJyBtYXliZSBIVyBidWcgPyAqLwogCX0KIAltZW1jcHkoJm9idWZbMl0sIG1zZ1swXS5idWYsIG1zZ1swXS5sZW4pOwogCi0JcmV0dXJuIGkyY190cmFuc2Zlcihwcml2LT5pMmMsIG1zZzIsIG51bSk7CisJcmV0ID0gaTJjX3RyYW5zZmVyKHByaXYtPmkyYywgbXNnMiwgbnVtKTsKKwlpZiAocmV0IDwgMCkKKwkJd2FybigidHVuZXIgaTJjIGZhaWxlZCByZXQ6JWQiLCByZXQpOworCisJa2ZyZWUob2J1Zik7CisKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgc3RydWN0IGkyY19hbGdvcml0aG0gY3hkMjgyMHJfdHVuZXJfaTJjX2FsZ28gPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3hkMjgyMHJfcHJpdi5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2N4ZDI4MjByX3ByaXYuaAppbmRleCAyNWFkYmVlLi4wYzBlYmM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvY3hkMjgyMHJfcHJpdi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9jeGQyODIwcl9wcml2LmgKQEAgLTU1LDEzICs1NSwxMyBAQAogCXN0cnVjdCBtdXRleCBmZV9sb2NrOyAvKsKgRkUgbG9jayAqLwogCWludCBhY3RpdmVfZmU6MjsgLyogRkUgbG9jaywgLTE9Tk9ORSwgMD1EVkItVC9UMiwgMT1EVkItQyAqLwogCi0JaW50IGJlcl9ydW5uaW5nOjE7CisJYm9vbCBiZXJfcnVubmluZzsKIAogCXU4IGJhbmtbMl07CiAJdTggZ3Bpb1szXTsKIAogCWZlX2RlbGl2ZXJ5X3N5c3RlbV90IGRlbGl2ZXJ5X3N5c3RlbTsKLQlpbnQgbGFzdF90dW5lX2ZhaWxlZDoxOyAvKiBmb3Igc3dpdGNoIGJldHdlZW4gVCBhbmQgVDIgdHVuZSAqLworCWJvb2wgbGFzdF90dW5lX2ZhaWxlZDsgLyogZm9yIHN3aXRjaCBiZXR3ZWVuIFQgYW5kIFQyIHR1bmUgKi8KIH07CiAKIC8qIGN4ZDI4MjByX2NvcmUuYyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RpYjcwMDBwLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliNzAwMHAuYwppbmRleCAwYzlmNDBjLi5hNjRhNTM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliNzAwMHAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZGliNzAwMHAuYwpAQCAtMjMzNiw2ICsyMzM2LDExIEBACiAJCXJlcXVlc3RfZmlybXdhcmUoKSB3aWxsIGhpdCBhbiBPT1BTICh0aGlzIHNob3VsZCBiZSBtb3ZlZCBzb21ld2hlcmUKIAkJbW9yZSBjb21tb24pICovCiAKKwkvKiBGSVhNRTogbWFrZSBzdXJlIHRoZSBkZXYucGFyZW50IGZpZWxkIGlzIGluaXRpYWxpemVkLCBvciBlbHNlCisJICAgcmVxdWVzdF9maXJtd2FyZSgpIHdpbGwgaGl0IGFuIE9PUFMgKHRoaXMgc2hvdWxkIGJlIG1vdmVkIHNvbWV3aGVyZQorCSAgIG1vcmUgY29tbW9uKSAqLworCXN0LT5pMmNfbWFzdGVyLmdhdGVkX3R1bmVyX2kyY19hZGFwLmRldi5wYXJlbnQgPSBpMmNfYWRhcC0+ZGV2LnBhcmVudDsKKwogCWRpYngwMDBfaW5pdF9pMmNfbWFzdGVyKCZzdC0+aTJjX21hc3RlciwgRElCNzAwMFAsIHN0LT5pMmNfYWRhcCwgc3QtPmkyY19hZGRyKTsKIAogCS8qIGluaXQgNzA5MCB0dW5lciBhZGFwdGVyICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHJ4ZF9oYXJkLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHJ4ZF9oYXJkLmMKaW5kZXggZWE0YzFjMy4uMjIzOGJmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RyeGRfaGFyZC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcnhkX2hhcmQuYwpAQCAtMjgsNyArMjgsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAKICNpbmNsdWRlICJkdmJfZnJvbnRlbmQuaCIKQEAgLTIzMyw3ICsyMzIsNyBAQAogCXJldHVybiAwOwogfQogCi1pbmxpbmUgdTMyIE11bERpdjMyKHUzMiBhLCB1MzIgYiwgdTMyIGMpCitzdGF0aWMgaW5saW5lIHUzMiBNdWxEaXYzMih1MzIgYSwgdTMyIGIsIHUzMiBjKQogewogCXU2NCB0bXA2NDsKIApAQCAtOTEwLDE0ICs5MDksMTYgQEAKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0Jc3RhdGUtPm1pY3JvY29kZSA9IGt6YWxsb2MoZnctPnNpemUsIEdGUF9LRVJORUwpOworCXN0YXRlLT5taWNyb2NvZGUgPSBrbWFsbG9jKGZ3LT5zaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAoc3RhdGUtPm1pY3JvY29kZSA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZHJ4ZDogZmlybXdhcmUgbG9hZCBmYWlsdXJlOiBub21lbW9yeVxuIik7CisJCXJlbGVhc2VfZmlybXdhcmUoZncpOworCQlwcmludGsoS0VSTl9FUlIgImRyeGQ6IGZpcm13YXJlIGxvYWQgZmFpbHVyZTogbm8gbWVtb3J5XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJbWVtY3B5KHN0YXRlLT5taWNyb2NvZGUsIGZ3LT5kYXRhLCBmdy0+c2l6ZSk7CiAJc3RhdGUtPm1pY3JvY29kZV9sZW5ndGggPSBmdy0+c2l6ZTsKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RyeGsuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcnhrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThiYWY0MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcnhrLmgKQEAgLTAsMCArMSw0NyBAQAorI2lmbmRlZiBfRFJYS19IXworI2RlZmluZSBfRFJYS19IXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKworLyoqCisgKiBzdHJ1Y3QgZHJ4a19jb25maWcgLSBDb25maWd1cmUgdGhlIGluaXRpYWwgcGFyYW1ldGVycyBmb3IgRFJYLUsKKyAqCisgKiBhZHI6CQkJSTJDIEFkZHJlc3Mgb2YgdGhlIERSWC1LCisgKiBzaW5nbGVfbWFzdGVyOglEZXZpY2UgaXMgb24gdGhlIHNpbmdsZSBtYXN0ZXIgbW9kZQorICogbm9faTJjX2JyaWRnZToJRG9uJ3Qgc3dpdGNoIHRoZSBJMkMgYnJpZGdlIHRvIHRhbGsgd2l0aCB0dW5lcgorICogYW50ZW5uYV9ncGlvOglHUElPIGJpdCB1c2VkIHRvIGNvbnRyb2wgdGhlIGFudGVubmEKKyAqIGFudGVubmFfZHZidDoJR1BJTyBiaXQgZm9yIGNoYW5naW5nIGFudGVubmEgdG8gRFZCLUMuIEEgdmFsdWUgb2YgMQorICoJCQltZWFucyB0aGF0IDE9RFZCQywgMCA9IERWQlQuIFplcm8gbWVhbnMgdGhlIG9wcG9zaXRlLgorICogbWljcm9jb2RlX25hbWU6CU5hbWUgb2YgdGhlIGZpcm13YXJlIGZpbGUgd2l0aCB0aGUgbWljcm9jb2RlCisgKgorICogT24gdGhlICpfZ3BpbyB2YXJzLCBiaXQgMCBpcyBVSU8tMSwgYml0IDEgaXMgVUlPLTIgYW5kIGJpdCAyIGlzCisgKiBVSU8tMy4KKyAqLworc3RydWN0IGRyeGtfY29uZmlnIHsKKwl1OAlhZHI7CisJYm9vbAlzaW5nbGVfbWFzdGVyOworCWJvb2wJbm9faTJjX2JyaWRnZTsKKworCWJvb2wJYW50ZW5uYV9kdmJ0OworCXUxNglhbnRlbm5hX2dwaW87CisKKwljb25zdCBjaGFyICptaWNyb2NvZGVfbmFtZTsKK307CisKKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfRFJYSykgfHwgKGRlZmluZWQoQ09ORklHX0RWQl9EUlhLX01PRFVMRSkgXAorICAgICAgICAmJiBkZWZpbmVkKE1PRFVMRSkpCitleHRlcm4gc3RydWN0IGR2Yl9mcm9udGVuZCAqZHJ4a19hdHRhY2goY29uc3Qgc3RydWN0IGRyeGtfY29uZmlnICpjb25maWcsCisJCQkJCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLAorCQkJCQlzdHJ1Y3QgZHZiX2Zyb250ZW5kICoqZmVfdCk7CisjZWxzZQorc3RhdGljIGlubGluZSBzdHJ1Y3QgZHZiX2Zyb250ZW5kICpkcnhrX2F0dGFjaChjb25zdCBzdHJ1Y3QgZHJ4a19jb25maWcgKmNvbmZpZywKKwkJCQkJc3RydWN0IGkyY19hZGFwdGVyICppMmMsCisJCQkJCXN0cnVjdCBkdmJfZnJvbnRlbmQgKipmZV90KQoreworICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICIlczogZHJpdmVyIGRpc2FibGVkIGJ5IEtjb25maWdcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7Cit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHJ4a19oYXJkLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHJ4a19oYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFiMDgzOAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcnhrX2hhcmQuYwpAQCAtMCwwICsxLDY0NTQgQEAKKy8qCisgKiBkcnhrX2hhcmQ6IERSWC1LIERWQi1DL1QgZGVtb2R1bGF0b3IgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgRGlnaXRhbCBEZXZpY2VzIEdtYkgKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICogT3IsIHBvaW50IHlvdXIgYnJvd3NlciB0byBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKworI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorI2luY2x1ZGUgImRyeGsuaCIKKyNpbmNsdWRlICJkcnhrX2hhcmQuaCIKKworc3RhdGljIGludCBQb3dlckRvd25EVkJUKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgYm9vbCBzZXRQb3dlck1vZGUpOworc3RhdGljIGludCBQb3dlckRvd25RQU0oc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKTsKK3N0YXRpYyBpbnQgU2V0RFZCVFN0YW5kYXJkKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwKKwkJCSAgIGVudW0gT3BlcmF0aW9uTW9kZSBvTW9kZSk7CitzdGF0aWMgaW50IFNldFFBTVN0YW5kYXJkKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwKKwkJCSAgZW51bSBPcGVyYXRpb25Nb2RlIG9Nb2RlKTsKK3N0YXRpYyBpbnQgU2V0UUFNKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgdTE2IEludGVybWVkaWF0ZUZyZXFrSHosCisJCSAgczMyIHR1bmVyRnJlcU9mZnNldCk7CitzdGF0aWMgaW50IFNldERWQlRTdGFuZGFyZChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsCisJCQkgICBlbnVtIE9wZXJhdGlvbk1vZGUgb01vZGUpOworc3RhdGljIGludCBEVkJUU3RhcnQoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKTsKK3N0YXRpYyBpbnQgU2V0RFZCVChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIHUxNiBJbnRlcm1lZGlhdGVGcmVxa0h6LAorCQkgICBzMzIgdHVuZXJGcmVxT2Zmc2V0KTsKK3N0YXRpYyBpbnQgR2V0UUFNTG9ja1N0YXR1cyhzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIHUzMiAqcExvY2tTdGF0dXMpOworc3RhdGljIGludCBHZXREVkJUTG9ja1N0YXR1cyhzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIHUzMiAqcExvY2tTdGF0dXMpOworc3RhdGljIGludCBTd2l0Y2hBbnRlbm5hVG9RQU0oc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKTsKK3N0YXRpYyBpbnQgU3dpdGNoQW50ZW5uYVRvRFZCVChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUpOworCitzdGF0aWMgYm9vbCBJc0RWQlQoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCXJldHVybiBzdGF0ZS0+bV9PcGVyYXRpb25Nb2RlID09IE9NX0RWQlQ7Cit9CisKK3N0YXRpYyBib29sIElzUUFNKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwlyZXR1cm4gc3RhdGUtPm1fT3BlcmF0aW9uTW9kZSA9PSBPTV9RQU1fSVRVX0EgfHwKKwkgICAgc3RhdGUtPm1fT3BlcmF0aW9uTW9kZSA9PSBPTV9RQU1fSVRVX0IgfHwKKwkgICAgc3RhdGUtPm1fT3BlcmF0aW9uTW9kZSA9PSBPTV9RQU1fSVRVX0M7Cit9CisKK2Jvb2wgSXNBMVdpdGhQYXRjaENvZGUoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCXJldHVybiBzdGF0ZS0+bV9EUlhLX0ExX1BBVENIX0NPREU7Cit9CisKK2Jvb2wgSXNBMVdpdGhSb21Db2RlKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwlyZXR1cm4gc3RhdGUtPm1fRFJYS19BMV9ST01fQ09ERTsKK30KKworI2RlZmluZSBOT0ExUk9NIDAKKworI2RlZmluZSBEUlhEQVBfRkFTSV9TSE9SVF9GT1JNQVQoYWRkcikgKCgoYWRkcikgJiAweEZDMzBGRjgwKSA9PSAwKQorI2RlZmluZSBEUlhEQVBfRkFTSV9MT05HX0ZPUk1BVChhZGRyKSAgKCgoYWRkcikgJiAweEZDMzBGRjgwKSAhPSAwKQorCisjZGVmaW5lIERFRkFVTFRfTUVSXzgzICAxNjUKKyNkZWZpbmUgREVGQVVMVF9NRVJfOTMgIDI1MAorCisjaWZuZGVmIERSWEtfTVBFR19TRVJJQUxfT1VUUFVUX1BJTl9EUklWRV9TVFJFTkdUSAorI2RlZmluZSBEUlhLX01QRUdfU0VSSUFMX09VVFBVVF9QSU5fRFJJVkVfU1RSRU5HVEggKDB4MDIpCisjZW5kaWYKKworI2lmbmRlZiBEUlhLX01QRUdfUEFSQUxMRUxfT1VUUFVUX1BJTl9EUklWRV9TVFJFTkdUSAorI2RlZmluZSBEUlhLX01QRUdfUEFSQUxMRUxfT1VUUFVUX1BJTl9EUklWRV9TVFJFTkdUSCAoMHgwMykKKyNlbmRpZgorCisjaWZuZGVmIERSWEtfTVBFR19PVVRQVVRfQ0xLX0RSSVZFX1NUUkVOR1RICisjZGVmaW5lIERSWEtfTVBFR19PVVRQVVRfQ0xLX0RSSVZFX1NUUkVOR1RIICgweDA2KQorI2VuZGlmCisKKyNkZWZpbmUgREVGQVVMVF9EUlhLX01QRUdfTE9DS19USU1FT1VUIDcwMAorI2RlZmluZSBERUZBVUxUX0RSWEtfREVNT0RfTE9DS19USU1FT1VUIDUwMAorCisjaWZuZGVmIERSWEtfS0lfUkFHQ19BVFYKKyNkZWZpbmUgRFJYS19LSV9SQUdDX0FUViAgIDQKKyNlbmRpZgorI2lmbmRlZiBEUlhLX0tJX0lBR0NfQVRWCisjZGVmaW5lIERSWEtfS0lfSUFHQ19BVFYgICA2CisjZW5kaWYKKyNpZm5kZWYgRFJYS19LSV9EQUdDX0FUVgorI2RlZmluZSBEUlhLX0tJX0RBR0NfQVRWICAgNworI2VuZGlmCisKKyNpZm5kZWYgRFJYS19LSV9SQUdDX1FBTQorI2RlZmluZSBEUlhLX0tJX1JBR0NfUUFNICAgMworI2VuZGlmCisjaWZuZGVmIERSWEtfS0lfSUFHQ19RQU0KKyNkZWZpbmUgRFJYS19LSV9JQUdDX1FBTSAgIDQKKyNlbmRpZgorI2lmbmRlZiBEUlhLX0tJX0RBR0NfUUFNCisjZGVmaW5lIERSWEtfS0lfREFHQ19RQU0gICA3CisjZW5kaWYKKyNpZm5kZWYgRFJYS19LSV9SQUdDX0RWQlQKKyNkZWZpbmUgRFJYS19LSV9SQUdDX0RWQlQgIChJc0ExV2l0aFBhdGNoQ29kZShzdGF0ZSkgPyAzIDogMikKKyNlbmRpZgorI2lmbmRlZiBEUlhLX0tJX0lBR0NfRFZCVAorI2RlZmluZSBEUlhLX0tJX0lBR0NfRFZCVCAgKElzQTFXaXRoUGF0Y2hDb2RlKHN0YXRlKSA/IDQgOiAyKQorI2VuZGlmCisjaWZuZGVmIERSWEtfS0lfREFHQ19EVkJUCisjZGVmaW5lIERSWEtfS0lfREFHQ19EVkJUICAoSXNBMVdpdGhQYXRjaENvZGUoc3RhdGUpID8gMTAgOiA3KQorI2VuZGlmCisKKyNpZm5kZWYgRFJYS19BR0NfREFDX09GRlNFVAorI2RlZmluZSBEUlhLX0FHQ19EQUNfT0ZGU0VUICgweDgwMCkKKyNlbmRpZgorCisjaWZuZGVmIERSWEtfQkFORFdJRFRIXzhNSFpfSU5fSFoKKyNkZWZpbmUgRFJYS19CQU5EV0lEVEhfOE1IWl9JTl9IWiAgKDB4OEI4MjQ5TCkKKyNlbmRpZgorCisjaWZuZGVmIERSWEtfQkFORFdJRFRIXzdNSFpfSU5fSFoKKyNkZWZpbmUgRFJYS19CQU5EV0lEVEhfN01IWl9JTl9IWiAgKDB4N0ExMjAwTCkKKyNlbmRpZgorCisjaWZuZGVmIERSWEtfQkFORFdJRFRIXzZNSFpfSU5fSFoKKyNkZWZpbmUgRFJYS19CQU5EV0lEVEhfNk1IWl9JTl9IWiAgKDB4NjhBMUI2TCkKKyNlbmRpZgorCisjaWZuZGVmIERSWEtfUUFNX1NZTUJPTFJBVEVfTUFYCisjZGVmaW5lIERSWEtfUUFNX1NZTUJPTFJBVEVfTUFYICAgICAgICAgKDcyMzMwMDApCisjZW5kaWYKKworI2RlZmluZSBEUlhLX0JMX1JPTV9PRkZTRVRfVEFQU19EVkJUICAgIDU2CisjZGVmaW5lIERSWEtfQkxfUk9NX09GRlNFVF9UQVBTX0lUVV9BICAgNjQKKyNkZWZpbmUgRFJYS19CTF9ST01fT0ZGU0VUX1RBUFNfSVRVX0MgICAweDVGRTAKKyNkZWZpbmUgRFJYS19CTF9ST01fT0ZGU0VUX1RBUFNfQkcgICAgICAyNAorI2RlZmluZSBEUlhLX0JMX1JPTV9PRkZTRVRfVEFQU19ES0lMTFAgIDMyCisjZGVmaW5lIERSWEtfQkxfUk9NX09GRlNFVF9UQVBTX05UU0MgICAgNDAKKyNkZWZpbmUgRFJYS19CTF9ST01fT0ZGU0VUX1RBUFNfRk0gICAgICA0OAorI2RlZmluZSBEUlhLX0JMX1JPTV9PRkZTRVRfVUNPREUgICAgICAgIDAKKworI2RlZmluZSBEUlhLX0JMQ19USU1FT1VUICAgICAgICAgICAgICAgIDEwMAorCisjZGVmaW5lIERSWEtfQkxDQ19OUl9FTEVNRU5UU19UQVBTICAgICAgMgorI2RlZmluZSBEUlhLX0JMQ0NfTlJfRUxFTUVOVFNfVUNPREUgICAgIDYKKworI2RlZmluZSBEUlhLX0JMRENfTlJfRUxFTUVOVFNfVEFQUyAgICAgIDI4CisKKyNpZm5kZWYgRFJYS19PRkRNX05FX05PVENIX1dJRFRICisjZGVmaW5lIERSWEtfT0ZETV9ORV9OT1RDSF9XSURUSCAgICAgICAgICAgICAoNCkKKyNlbmRpZgorCisjZGVmaW5lIERSWEtfUUFNX1NMX1NJR19QT1dFUl9RQU0xNiAgICAgICAoNDA5NjApCisjZGVmaW5lIERSWEtfUUFNX1NMX1NJR19QT1dFUl9RQU0zMiAgICAgICAoMjA0ODApCisjZGVmaW5lIERSWEtfUUFNX1NMX1NJR19QT1dFUl9RQU02NCAgICAgICAoNDMwMDgpCisjZGVmaW5lIERSWEtfUUFNX1NMX1NJR19QT1dFUl9RQU0xMjggICAgICAoMjA5OTIpCisjZGVmaW5lIERSWEtfUUFNX1NMX1NJR19QT1dFUl9RQU0yNTYgICAgICAoNDM1MjApCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGVidWc7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiZW5hYmxlIGRlYnVnIG1lc3NhZ2VzIik7CisKKyNkZWZpbmUgZHByaW50ayhsZXZlbCwgZm10LCBhcmcuLi4pIGRvIHsJCQlcCitpZiAoZGVidWcgPj0gbGV2ZWwpCQkJCQkJXAorCXByaW50ayhLRVJOX0RFQlVHICJkcnhrOiAlcyIgZm10LCBfX2Z1bmNfXywgIyMgYXJnKTsJXAorfSB3aGlsZSAoMCkKKworCitzdGF0aWMgaW5saW5lIHUzMiBNdWxEaXYzMih1MzIgYSwgdTMyIGIsIHUzMiBjKQoreworCXU2NCB0bXA2NDsKKworCXRtcDY0ID0gKHU2NCkgYSAqICh1NjQpIGI7CisJZG9fZGl2KHRtcDY0LCBjKTsKKworCXJldHVybiAodTMyKSB0bXA2NDsKK30KKworaW5saW5lIHUzMiBGcmFjMjhhKHUzMiBhLCB1MzIgYykKK3sKKwlpbnQgaSA9IDA7CisJdTMyIFExID0gMDsKKwl1MzIgUjAgPSAwOworCisJUjAgPSAoYSAlIGMpIDw8IDQ7CS8qIDMyLTI4ID09IDQgc2hpZnRzIHBvc3NpYmxlIGF0IG1heCAqLworCVExID0gYSAvIGM7CQkvKiBpbnRlZ2VyIHBhcnQsIG9ubHkgdGhlIDQgbGVhc3Qgc2lnbmlmaWNhbnQgYml0cworCQkJCSAgIHdpbGwgYmUgdmlzaWJsZSBpbiB0aGUgcmVzdWx0ICovCisKKwkvKiBkaXZpc2lvbiB1c2luZyByYWRpeCAxNiwgNyBuaWJibGVzIGluIHRoZSByZXN1bHQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisJCVExID0gKFExIDw8IDQpIHwgKFIwIC8gYyk7CisJCVIwID0gKFIwICUgYykgPDwgNDsKKwl9CisJLyogcm91bmRpbmcgKi8KKwlpZiAoKFIwID4+IDMpID49IGMpCisJCVExKys7CisKKwlyZXR1cm4gUTE7Cit9CisKK3N0YXRpYyB1MzIgTG9nMTBUaW1lczEwMCh1MzIgeCkKK3sKKwlzdGF0aWMgY29uc3QgdTggc2NhbGUgPSAxNTsKKwlzdGF0aWMgY29uc3QgdTggaW5kZXhXaWR0aCA9IDU7CisJdTggaSA9IDA7CisJdTMyIHkgPSAwOworCXUzMiBkID0gMDsKKwl1MzIgayA9IDA7CisJdTMyIHIgPSAwOworCS8qCisJICAgbG9nMmx1dFtuXSA9ICgxPDxzY2FsZSkgKiAyMDAgKiBsb2cyKDEuMCArICgoMS4wLygxPDxJTkRFWFdJRFRIKSkgKiBuKSkKKwkgICAwIDw9IG4gPCAoKDE8PElOREVYV0lEVEgpKzEpCisJICovCisKKwlzdGF0aWMgY29uc3QgdTMyIGxvZzJsdXRbXSA9IHsKKwkJMCwJCS8qIDAuMDAwMDAwICovCisJCTI5MDk0MSwJCS8qIDI5MDk0MS4zMDA2MjggKi8KKwkJNTczMTk2LAkJLyogNTczMTk2LjQ3NjQxOCAqLworCQk4NDcyNjksCQkvKiA4NDcyNjkuMTc5ODUxICovCisJCTExMTM2MjAsCS8qIDExMTM2MjAuNDg5NDUyICovCisJCTEzNzI2NzQsCS8qIDEzNzI2NzMuNTc2OTg2ICovCisJCTE2MjQ4MTgsCS8qIDE2MjQ4MTcuNzUyMTA0ICovCisJCTE4NzA0MTIsCS8qIDE4NzA0MTEuOTgxNTM2ICovCisJCTIxMDk3ODgsCS8qIDIxMDk3ODcuOTYyNjU0ICovCisJCTIzNDMyNTMsCS8qIDIzNDMyNTIuODE3NDY1ICovCisJCTI1NzEwOTEsCS8qIDI1NzEwOTEuNDYxOTIzICovCisJCTI3OTM1NjksCS8qIDI3OTM1NjguNjk2NDE2ICovCisJCTMwMTA5MzEsCS8qIDMwMTA5MzEuMDU1OTAxICovCisJCTMyMjM0MDgsCS8qIDMyMjM0MDguNDUyMTA2ICovCisJCTM0MzEyMTYsCS8qIDM0MzEyMTUuNjM1MjE1ICovCisJCTM2MzQ1NTMsCS8qIDM2MzQ1NTMuNDk4MzU1ICovCisJCTM4MzM2MTAsCS8qIDM4MzM2MTAuMjQ0NzI2ICovCisJCTQwMjg1NjIsCS8qIDQwMjg1NjIuNDM0MzkzICovCisJCTQyMTk1NzYsCS8qIDQyMTk1NzUuOTI1MzA4ICovCisJCTQ0MDY4MDcsCS8qIDQ0MDY4MDYuNzIxMTQ0ICovCisJCTQ1OTA0MDIsCS8qIDQ1OTA0MDEuNzM2ODA5ICovCisJCTQ3NzA0OTksCS8qIDQ3NzA0OTkuNDkxMDI1ICovCisJCTQ5NDcyMzEsCS8qIDQ5NDcyMzAuNzM0MTc5ICovCisJCTUxMjA3MTksCS8qIDUxMjA3MTkuMDE4NTU1ICovCisJCTUyOTEwODEsCS8qIDUyOTEwODEuMjE3MTk3ICovCisJCTU0NTg0MjgsCS8qIDU0NTg0MjcuOTk2ODMwICovCisJCTU2MjI4NjQsCS8qIDU2MjI4NjQuMjQ5NjY4ICovCisJCTU3ODQ0ODksCS8qIDU3ODQ0ODkuNDg4Mjk4ICovCisJCTU5NDMzOTgsCS8qIDU5NDMzOTguMjA3MzgwICovCisJCTYwOTk2ODAsCS8qIDYwOTk2ODAuMjE1NDUyICovCisJCTYyNTM0MjEsCS8qIDYyNTM0MjAuOTM5NzUxICovCisJCTY0MDQ3MDIsCS8qIDY0MDQ3MDEuNzA2NjQ5ICovCisJCTY1NTM2MDAsCS8qIDY1NTM2MDAuMDAwMDAwICovCisJfTsKKworCisJaWYgKHggPT0gMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBTY2FsZSB4IChub3JtYWxpemUpICovCisJLyogY29tcHV0aW5nIHkgaW4gbG9nKHgveSkgPSBsb2coeCkgLSBsb2coeSkgKi8KKwlpZiAoKHggJiAoKDB4ZmZmZmZmZmYpIDw8IChzY2FsZSArIDEpKSkgPT0gMCkgeworCQlmb3IgKGsgPSBzY2FsZTsgayA+IDA7IGstLSkgeworCQkJaWYgKHggJiAoKCh1MzIpIDEpIDw8IHNjYWxlKSkKKwkJCQlicmVhazsKKwkJCXggPDw9IDE7CisJCX0KKwl9IGVsc2UgeworCQlmb3IgKGsgPSBzY2FsZTsgayA8IDMxOyBrKyspIHsKKwkJCWlmICgoeCAmICgoKHUzMikgKC0xKSkgPDwgKHNjYWxlICsgMSkpKSA9PSAwKQorCQkJCWJyZWFrOworCQkJeCA+Pj0gMTsKKwkJfQorCX0KKwkvKgorCSAgIE5vdyB4IGhhcyBiaW5hcnkgcG9pbnQgYmV0d2VlbiBiaXRbc2NhbGVdIGFuZCBiaXRbc2NhbGUtMV0KKwkgICBhbmQgMS4wIDw9IHggPCAyLjAgKi8KKworCS8qIGNvcnJlY3Rpb24gZm9yIGRpdmlzb246IGxvZyh4KSA9IGxvZyh4L3kpK2xvZyh5KSAqLworCXkgPSBrICogKCgoKHUzMikgMSkgPDwgc2NhbGUpICogMjAwKTsKKworCS8qIHJlbW92ZSBpbnRlZ2VyIHBhcnQgKi8KKwl4ICY9ICgoKCh1MzIpIDEpIDw8IHNjYWxlKSAtIDEpOworCS8qIGdldCBpbmRleCAqLworCWkgPSAodTgpICh4ID4+IChzY2FsZSAtIGluZGV4V2lkdGgpKTsKKwkvKiBjb21wdXRlIGRlbHRhICh4IC0gYSkgKi8KKwlkID0geCAmICgoKCh1MzIpIDEpIDw8IChzY2FsZSAtIGluZGV4V2lkdGgpKSAtIDEpOworCS8qIGNvbXB1dGUgbG9nLCBtdWx0aXBsaWNhdGlvbiAoZCogKC4uKSkgbXVzdCBiZSB3aXRoaW4gcmFuZ2UgISAqLworCXkgKz0gbG9nMmx1dFtpXSArCisJICAgICgoZCAqIChsb2cybHV0W2kgKyAxXSAtIGxvZzJsdXRbaV0pKSA+PiAoc2NhbGUgLSBpbmRleFdpZHRoKSk7CisJLyogQ29udmVyIHRvIGxvZzEwKCkgKi8KKwl5IC89IDEwODg1MzsJCS8qIChsb2cyKDEwKSA8PCBzY2FsZSkgKi8KKwlyID0gKHkgPj4gMSk7CisJLyogcm91bmRpbmcgKi8KKwlpZiAoeSAmICgodTMyKSAxKSkKKwkJcisrOworCXJldHVybiByOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEkyQyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgaTJjX3JlYWQxKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgdTggYWRyLCB1OCAqdmFsKQoreworCXN0cnVjdCBpMmNfbXNnIG1zZ3NbMV0gPSB7IHsuYWRkciA9IGFkciwgLmZsYWdzID0gSTJDX01fUkQsCisJCQkJICAgIC5idWYgPSB2YWwsIC5sZW4gPSAxfQorCX07CisKKwlyZXR1cm4gaTJjX3RyYW5zZmVyKGFkYXB0ZXIsIG1zZ3MsIDEpOworfQorCitzdGF0aWMgaW50IGkyY193cml0ZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHU4IGFkciwgdTggKmRhdGEsIGludCBsZW4pCit7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3QgaTJjX21zZyBtc2cgPSB7CisJICAgIC5hZGRyID0gYWRyLCAuZmxhZ3MgPSAwLCAuYnVmID0gZGF0YSwgLmxlbiA9IGxlbiB9OworCisJZHByaW50aygzLCAiOiIpOworCWlmIChkZWJ1ZyA+IDIpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJCXByaW50ayhLRVJOX0NPTlQgIiAlMDJ4IiwgZGF0YVtpXSk7CisJCXByaW50ayhLRVJOX0NPTlQgIlxuIik7CisJfQorCXN0YXR1cyA9IGkyY190cmFuc2ZlcihhZGFwLCAmbXNnLCAxKTsKKwlpZiAoc3RhdHVzID49IDAgJiYgc3RhdHVzICE9IDEpCisJCXN0YXR1cyA9IC1FSU87CisKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBpMmMgd3JpdGUgZXJyb3IgYXQgYWRkciAweCUwMnhcbiIsIGFkcik7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IGkyY19yZWFkKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcCwKKwkJICAgIHU4IGFkciwgdTggKm1zZywgaW50IGxlbiwgdTggKmFuc3csIGludCBhbGVuKQoreworCWludCBzdGF0dXM7CisJc3RydWN0IGkyY19tc2cgbXNnc1syXSA9IHsKKwkJey5hZGRyID0gYWRyLCAuZmxhZ3MgPSAwLAorCQkJCSAgICAuYnVmID0gbXNnLCAubGVuID0gbGVufSwKKwkJey5hZGRyID0gYWRyLCAuZmxhZ3MgPSBJMkNfTV9SRCwKKwkJIC5idWYgPSBhbnN3LCAubGVuID0gYWxlbn0KKwl9OworCisJc3RhdHVzID0gaTJjX3RyYW5zZmVyKGFkYXAsIG1zZ3MsIDIpOworCWlmIChzdGF0dXMgIT0gMikgeworCQlpZiAoZGVidWcgPiAyKQorCQkJcHJpbnRrKEtFUk5fQ09OVCAiOiBFUlJPUiFcbiIpOworCQlpZiAoc3RhdHVzID49IDApCisJCQlzdGF0dXMgPSAtRUlPOworCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogaTJjIHJlYWQgZXJyb3IgYXQgYWRkciAweCUwMnhcbiIsIGFkcik7CisJCXJldHVybiBzdGF0dXM7CisJfQorCWlmIChkZWJ1ZyA+IDIpIHsKKwkJaW50IGk7CisJCWRwcmludGsoMiwgIjogcmVhZCBmcm9tICIpOworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQlwcmludGsoS0VSTl9DT05UICIgJTAyeCIsIG1zZ1tpXSk7CisJCXByaW50ayhLRVJOX0NPTlQgIlZhbHVlID0gIik7CisJCWZvciAoaSA9IDA7IGkgPCBhbGVuOyBpKyspCisJCQlwcmludGsoS0VSTl9DT05UICIgJTAyeCIsIGFuc3dbaV0pOworCQlwcmludGsoS0VSTl9DT05UICJcbiIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkMTZfZmxhZ3Moc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCB1MzIgcmVnLCB1MTYgKmRhdGEsIHU4IGZsYWdzKQoreworCWludCBzdGF0dXM7CisJdTggYWRyID0gc3RhdGUtPmRlbW9kX2FkZHJlc3MsIG1tMVs0XSwgbW0yWzJdLCBsZW47CisKKwlpZiAoc3RhdGUtPnNpbmdsZV9tYXN0ZXIpCisJCWZsYWdzIHw9IDB4QzA7CisKKwlpZiAoRFJYREFQX0ZBU0lfTE9OR19GT1JNQVQocmVnKSB8fCAoZmxhZ3MgIT0gMCkpIHsKKwkJbW0xWzBdID0gKCgocmVnIDw8IDEpICYgMHhGRikgfCAweDAxKTsKKwkJbW0xWzFdID0gKChyZWcgPj4gMTYpICYgMHhGRik7CisJCW1tMVsyXSA9ICgocmVnID4+IDI0KSAmIDB4RkYpIHwgZmxhZ3M7CisJCW1tMVszXSA9ICgocmVnID4+IDcpICYgMHhGRik7CisJCWxlbiA9IDQ7CisJfSBlbHNlIHsKKwkJbW0xWzBdID0gKChyZWcgPDwgMSkgJiAweEZGKTsKKwkJbW0xWzFdID0gKCgocmVnID4+IDE2KSAmIDB4MEYpIHwgKChyZWcgPj4gMTgpICYgMHhGMCkpOworCQlsZW4gPSAyOworCX0KKwlkcHJpbnRrKDIsICIoMHglMDh4LCAweCUwMngpXG4iLCByZWcsIGZsYWdzKTsKKwlzdGF0dXMgPSBpMmNfcmVhZChzdGF0ZS0+aTJjLCBhZHIsIG1tMSwgbGVuLCBtbTIsIDIpOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCWlmIChkYXRhKQorCQkqZGF0YSA9IG1tMlswXSB8IChtbTJbMV0gPDwgOCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkMTYoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCB1MzIgcmVnLCB1MTYgKmRhdGEpCit7CisJcmV0dXJuIHJlYWQxNl9mbGFncyhzdGF0ZSwgcmVnLCBkYXRhLCAwKTsKK30KKworc3RhdGljIGludCByZWFkMzJfZmxhZ3Moc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCB1MzIgcmVnLCB1MzIgKmRhdGEsIHU4IGZsYWdzKQoreworCWludCBzdGF0dXM7CisJdTggYWRyID0gc3RhdGUtPmRlbW9kX2FkZHJlc3MsIG1tMVs0XSwgbW0yWzRdLCBsZW47CisKKwlpZiAoc3RhdGUtPnNpbmdsZV9tYXN0ZXIpCisJCWZsYWdzIHw9IDB4QzA7CisKKwlpZiAoRFJYREFQX0ZBU0lfTE9OR19GT1JNQVQocmVnKSB8fCAoZmxhZ3MgIT0gMCkpIHsKKwkJbW0xWzBdID0gKCgocmVnIDw8IDEpICYgMHhGRikgfCAweDAxKTsKKwkJbW0xWzFdID0gKChyZWcgPj4gMTYpICYgMHhGRik7CisJCW1tMVsyXSA9ICgocmVnID4+IDI0KSAmIDB4RkYpIHwgZmxhZ3M7CisJCW1tMVszXSA9ICgocmVnID4+IDcpICYgMHhGRik7CisJCWxlbiA9IDQ7CisJfSBlbHNlIHsKKwkJbW0xWzBdID0gKChyZWcgPDwgMSkgJiAweEZGKTsKKwkJbW0xWzFdID0gKCgocmVnID4+IDE2KSAmIDB4MEYpIHwgKChyZWcgPj4gMTgpICYgMHhGMCkpOworCQlsZW4gPSAyOworCX0KKwlkcHJpbnRrKDIsICIoMHglMDh4LCAweCUwMngpXG4iLCByZWcsIGZsYWdzKTsKKwlzdGF0dXMgPSBpMmNfcmVhZChzdGF0ZS0+aTJjLCBhZHIsIG1tMSwgbGVuLCBtbTIsIDQpOworCWlmIChzdGF0dXMgPCAwKQorCQlyZXR1cm4gc3RhdHVzOworCWlmIChkYXRhKQorCQkqZGF0YSA9IG1tMlswXSB8IChtbTJbMV0gPDwgOCkgfAorCQkgICAgKG1tMlsyXSA8PCAxNikgfCAobW0yWzNdIDw8IDI0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlYWQzMihzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIHUzMiByZWcsIHUzMiAqZGF0YSkKK3sKKwlyZXR1cm4gcmVhZDMyX2ZsYWdzKHN0YXRlLCByZWcsIGRhdGEsIDApOworfQorCitzdGF0aWMgaW50IHdyaXRlMTZfZmxhZ3Moc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCB1MzIgcmVnLCB1MTYgZGF0YSwgdTggZmxhZ3MpCit7CisJdTggYWRyID0gc3RhdGUtPmRlbW9kX2FkZHJlc3MsIG1tWzZdLCBsZW47CisKKwlpZiAoc3RhdGUtPnNpbmdsZV9tYXN0ZXIpCisJCWZsYWdzIHw9IDB4QzA7CisJaWYgKERSWERBUF9GQVNJX0xPTkdfRk9STUFUKHJlZykgfHwgKGZsYWdzICE9IDApKSB7CisJCW1tWzBdID0gKCgocmVnIDw8IDEpICYgMHhGRikgfCAweDAxKTsKKwkJbW1bMV0gPSAoKHJlZyA+PiAxNikgJiAweEZGKTsKKwkJbW1bMl0gPSAoKHJlZyA+PiAyNCkgJiAweEZGKSB8IGZsYWdzOworCQltbVszXSA9ICgocmVnID4+IDcpICYgMHhGRik7CisJCWxlbiA9IDQ7CisJfSBlbHNlIHsKKwkJbW1bMF0gPSAoKHJlZyA8PCAxKSAmIDB4RkYpOworCQltbVsxXSA9ICgoKHJlZyA+PiAxNikgJiAweDBGKSB8ICgocmVnID4+IDE4KSAmIDB4RjApKTsKKwkJbGVuID0gMjsKKwl9CisJbW1bbGVuXSA9IGRhdGEgJiAweGZmOworCW1tW2xlbiArIDFdID0gKGRhdGEgPj4gOCkgJiAweGZmOworCisJZHByaW50aygyLCAiKDB4JTA4eCwgMHglMDR4LCAweCUwMngpXG4iLCByZWcsIGRhdGEsIGZsYWdzKTsKKwlyZXR1cm4gaTJjX3dyaXRlKHN0YXRlLT5pMmMsIGFkciwgbW0sIGxlbiArIDIpOworfQorCitzdGF0aWMgaW50IHdyaXRlMTYoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCB1MzIgcmVnLCB1MTYgZGF0YSkKK3sKKwlyZXR1cm4gd3JpdGUxNl9mbGFncyhzdGF0ZSwgcmVnLCBkYXRhLCAwKTsKK30KKworc3RhdGljIGludCB3cml0ZTMyX2ZsYWdzKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgdTMyIHJlZywgdTMyIGRhdGEsIHU4IGZsYWdzKQoreworCXU4IGFkciA9IHN0YXRlLT5kZW1vZF9hZGRyZXNzLCBtbVs4XSwgbGVuOworCisJaWYgKHN0YXRlLT5zaW5nbGVfbWFzdGVyKQorCQlmbGFncyB8PSAweEMwOworCWlmIChEUlhEQVBfRkFTSV9MT05HX0ZPUk1BVChyZWcpIHx8IChmbGFncyAhPSAwKSkgeworCQltbVswXSA9ICgoKHJlZyA8PCAxKSAmIDB4RkYpIHwgMHgwMSk7CisJCW1tWzFdID0gKChyZWcgPj4gMTYpICYgMHhGRik7CisJCW1tWzJdID0gKChyZWcgPj4gMjQpICYgMHhGRikgfCBmbGFnczsKKwkJbW1bM10gPSAoKHJlZyA+PiA3KSAmIDB4RkYpOworCQlsZW4gPSA0OworCX0gZWxzZSB7CisJCW1tWzBdID0gKChyZWcgPDwgMSkgJiAweEZGKTsKKwkJbW1bMV0gPSAoKChyZWcgPj4gMTYpICYgMHgwRikgfCAoKHJlZyA+PiAxOCkgJiAweEYwKSk7CisJCWxlbiA9IDI7CisJfQorCW1tW2xlbl0gPSBkYXRhICYgMHhmZjsKKwltbVtsZW4gKyAxXSA9IChkYXRhID4+IDgpICYgMHhmZjsKKwltbVtsZW4gKyAyXSA9IChkYXRhID4+IDE2KSAmIDB4ZmY7CisJbW1bbGVuICsgM10gPSAoZGF0YSA+PiAyNCkgJiAweGZmOworCWRwcmludGsoMiwgIigweCUwOHgsIDB4JTA4eCwgMHglMDJ4KVxuIiwgcmVnLCBkYXRhLCBmbGFncyk7CisKKwlyZXR1cm4gaTJjX3dyaXRlKHN0YXRlLT5pMmMsIGFkciwgbW0sIGxlbiArIDQpOworfQorCitzdGF0aWMgaW50IHdyaXRlMzIoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCB1MzIgcmVnLCB1MzIgZGF0YSkKK3sKKwlyZXR1cm4gd3JpdGUzMl9mbGFncyhzdGF0ZSwgcmVnLCBkYXRhLCAwKTsKK30KKworc3RhdGljIGludCB3cml0ZV9ibG9jayhzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIHUzMiBBZGRyZXNzLAorCQkgICAgICBjb25zdCBpbnQgQmxvY2tTaXplLCBjb25zdCB1OCBwQmxvY2tbXSkKK3sKKwlpbnQgc3RhdHVzID0gMCwgQmxrU2l6ZSA9IEJsb2NrU2l6ZTsKKwl1OCBGbGFncyA9IDA7CisKKwlpZiAoc3RhdGUtPnNpbmdsZV9tYXN0ZXIpCisJCUZsYWdzIHw9IDB4QzA7CisKKwl3aGlsZSAoQmxrU2l6ZSA+IDApIHsKKwkJaW50IENodW5rID0gQmxrU2l6ZSA+IHN0YXRlLT5tX0NodW5rU2l6ZSA/CisJCSAgICBzdGF0ZS0+bV9DaHVua1NpemUgOiBCbGtTaXplOworCQl1OCAqQWRyQnVmID0gJnN0YXRlLT5DaHVua1swXTsKKwkJdTMyIEFkckxlbmd0aCA9IDA7CisKKwkJaWYgKERSWERBUF9GQVNJX0xPTkdfRk9STUFUKEFkZHJlc3MpIHx8IChGbGFncyAhPSAwKSkgeworCQkJQWRyQnVmWzBdID0gKCgoQWRkcmVzcyA8PCAxKSAmIDB4RkYpIHwgMHgwMSk7CisJCQlBZHJCdWZbMV0gPSAoKEFkZHJlc3MgPj4gMTYpICYgMHhGRik7CisJCQlBZHJCdWZbMl0gPSAoKEFkZHJlc3MgPj4gMjQpICYgMHhGRik7CisJCQlBZHJCdWZbM10gPSAoKEFkZHJlc3MgPj4gNykgJiAweEZGKTsKKwkJCUFkckJ1ZlsyXSB8PSBGbGFnczsKKwkJCUFkckxlbmd0aCA9IDQ7CisJCQlpZiAoQ2h1bmsgPT0gc3RhdGUtPm1fQ2h1bmtTaXplKQorCQkJCUNodW5rIC09IDI7CisJCX0gZWxzZSB7CisJCQlBZHJCdWZbMF0gPSAoKEFkZHJlc3MgPDwgMSkgJiAweEZGKTsKKwkJCUFkckJ1ZlsxXSA9ICgoKEFkZHJlc3MgPj4gMTYpICYgMHgwRikgfAorCQkJCSAgICAgKChBZGRyZXNzID4+IDE4KSAmIDB4RjApKTsKKwkJCUFkckxlbmd0aCA9IDI7CisJCX0KKwkJbWVtY3B5KCZzdGF0ZS0+Q2h1bmtbQWRyTGVuZ3RoXSwgcEJsb2NrLCBDaHVuayk7CisJCWRwcmludGsoMiwgIigweCUwOHgsIDB4JTAyeClcbiIsIEFkZHJlc3MsIEZsYWdzKTsKKwkJaWYgKGRlYnVnID4gMSkgeworCQkJaW50IGk7CisJCQlpZiAocEJsb2NrKQorCQkJCWZvciAoaSA9IDA7IGkgPCBDaHVuazsgaSsrKQorCQkJCQlwcmludGsoS0VSTl9DT05UICIgJTAyeCIsIHBCbG9ja1tpXSk7CisJCQlwcmludGsoS0VSTl9DT05UICJcbiIpOworCQl9CisJCXN0YXR1cyA9IGkyY193cml0ZShzdGF0ZS0+aTJjLCBzdGF0ZS0+ZGVtb2RfYWRkcmVzcywKKwkJCQkgICAmc3RhdGUtPkNodW5rWzBdLCBDaHVuayArIEFkckxlbmd0aCk7CisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImRyeGs6ICVzOiBpMmMgd3JpdGUgZXJyb3IgYXQgYWRkciAweCUwMnhcbiIsCisJCQkgICAgICAgX19mdW5jX18sIEFkZHJlc3MpOworCQkJYnJlYWs7CisJCX0KKwkJcEJsb2NrICs9IENodW5rOworCQlBZGRyZXNzICs9IChDaHVuayA+PiAxKTsKKwkJQmxrU2l6ZSAtPSBDaHVuazsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworI2lmbmRlZiBEUlhLX01BWF9SRVRSSUVTX1BPV0VSVVAKKyNkZWZpbmUgRFJYS19NQVhfUkVUUklFU19QT1dFUlVQIDIwCisjZW5kaWYKKworaW50IFBvd2VyVXBEZXZpY2Uoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCWludCBzdGF0dXM7CisJdTggZGF0YSA9IDA7CisJdTE2IHJldHJ5Q291bnQgPSAwOworCisJZHByaW50aygxLCAiXG4iKTsKKworCXN0YXR1cyA9IGkyY19yZWFkMShzdGF0ZS0+aTJjLCBzdGF0ZS0+ZGVtb2RfYWRkcmVzcywgJmRhdGEpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCWRvIHsKKwkJCWRhdGEgPSAwOworCQkJc3RhdHVzID0gaTJjX3dyaXRlKHN0YXRlLT5pMmMsIHN0YXRlLT5kZW1vZF9hZGRyZXNzLAorCQkJCQkgICAmZGF0YSwgMSk7CisJCQltc2xlZXAoMTApOworCQkJcmV0cnlDb3VudCsrOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJY29udGludWU7CisJCQlzdGF0dXMgPSBpMmNfcmVhZDEoc3RhdGUtPmkyYywgc3RhdGUtPmRlbW9kX2FkZHJlc3MsCisJCQkJCSAgICZkYXRhKTsKKwkJfSB3aGlsZSAoc3RhdHVzIDwgMCAmJgorCQkJIChyZXRyeUNvdW50IDwgRFJYS19NQVhfUkVUUklFU19QT1dFUlVQKSk7CisJCWlmIChzdGF0dXMgPCAwICYmIHJldHJ5Q291bnQgPj0gRFJYS19NQVhfUkVUUklFU19QT1dFUlVQKQorCQkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBNYWtlIHN1cmUgYWxsIGNsayBkb21haW5zIGFyZSBhY3RpdmUgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fQ0NfUFdEX01PREVfX0EsIFNJT19DQ19QV0RfTU9ERV9MRVZFTF9OT05FKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fQ0NfVVBEQVRFX19BLCBTSU9fQ0NfVVBEQVRFX0tFWSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJLyogRW5hYmxlIHBsbCBsb2NrIHRlc3RzICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX0NDX1BMTF9MT0NLX19BLCAxKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXRlLT5tX2N1cnJlbnRQb3dlck1vZGUgPSBEUlhfUE9XRVJfVVA7CisKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKworc3RhdGljIGludCBpbml0X3N0YXRlKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwkvKgorCSAqIEZJWE1FOiBtb3N0IChhbGw/KSBvZiB0aGUgdmFsdWVzIGJlbGxvdyBzaG91bGQgYmUgbW92ZWQgaW50bworCSAqIHN0cnVjdCBkcnhrX2NvbmZpZywgYXMgdGhleSBhcmUgcHJvYmFibHkgYm9hcmQtc3BlY2lmaWMKKwkgKi8KKwl1MzIgdWxWU0JJZkFnY01vZGUgPSBEUlhLX0FHQ19DVFJMX0FVVE87CisJdTMyIHVsVlNCSWZBZ2NPdXRwdXRMZXZlbCA9IDA7CisJdTMyIHVsVlNCSWZBZ2NNaW5MZXZlbCA9IDA7CisJdTMyIHVsVlNCSWZBZ2NNYXhMZXZlbCA9IDB4N0ZGRjsKKwl1MzIgdWxWU0JJZkFnY1NwZWVkID0gMzsKKworCXUzMiB1bFZTQlJmQWdjTW9kZSA9IERSWEtfQUdDX0NUUkxfQVVUTzsKKwl1MzIgdWxWU0JSZkFnY091dHB1dExldmVsID0gMDsKKwl1MzIgdWxWU0JSZkFnY01pbkxldmVsID0gMDsKKwl1MzIgdWxWU0JSZkFnY01heExldmVsID0gMHg3RkZGOworCXUzMiB1bFZTQlJmQWdjU3BlZWQgPSAzOworCXUzMiB1bFZTQlJmQWdjVG9wID0gOTUwMDsKKwl1MzIgdWxWU0JSZkFnY0N1dE9mZkN1cnJlbnQgPSA0MDAwOworCisJdTMyIHVsQVRWSWZBZ2NNb2RlID0gRFJYS19BR0NfQ1RSTF9BVVRPOworCXUzMiB1bEFUVklmQWdjT3V0cHV0TGV2ZWwgPSAwOworCXUzMiB1bEFUVklmQWdjTWluTGV2ZWwgPSAwOworCXUzMiB1bEFUVklmQWdjTWF4TGV2ZWwgPSAwOworCXUzMiB1bEFUVklmQWdjU3BlZWQgPSAzOworCisJdTMyIHVsQVRWUmZBZ2NNb2RlID0gRFJYS19BR0NfQ1RSTF9PRkY7CisJdTMyIHVsQVRWUmZBZ2NPdXRwdXRMZXZlbCA9IDA7CisJdTMyIHVsQVRWUmZBZ2NNaW5MZXZlbCA9IDA7CisJdTMyIHVsQVRWUmZBZ2NNYXhMZXZlbCA9IDA7CisJdTMyIHVsQVRWUmZBZ2NUb3AgPSA5NTAwOworCXUzMiB1bEFUVlJmQWdjQ3V0T2ZmQ3VycmVudCA9IDQwMDA7CisJdTMyIHVsQVRWUmZBZ2NTcGVlZCA9IDM7CisKKwl1MzIgdWxRdWFsODMgPSBERUZBVUxUX01FUl84MzsKKwl1MzIgdWxRdWFsOTMgPSBERUZBVUxUX01FUl85MzsKKworCXUzMiB1bERWQlRTdGF0aWNUU0Nsb2NrID0gMTsKKwl1MzIgdWxEVkJDU3RhdGljVFNDbG9jayA9IDE7CisKKwl1MzIgdWxNcGVnTG9ja1RpbWVPdXQgPSBERUZBVUxUX0RSWEtfTVBFR19MT0NLX1RJTUVPVVQ7CisJdTMyIHVsRGVtb2RMb2NrVGltZU91dCA9IERFRkFVTFRfRFJYS19ERU1PRF9MT0NLX1RJTUVPVVQ7CisKKwkvKiBpb19wYWRfY2ZnIHJlZ2lzdGVyICg4IGJpdCByZWcuKSBNU0IgYml0IGlzIDEgKGRlZmF1bHQgdmFsdWUpICovCisJLyogaW9fcGFkX2NmZ19tb2RlIG91dHB1dCBtb2RlIGlzIGRyaXZlIGFsd2F5cyAqLworCS8qIGlvX3BhZF9jZmdfZHJpdmUgaXMgc2V0IHRvIHBvd2VyIDIgKDIzIG1BKSAqLworCXUzMiB1bEdQSU9DZmcgPSAweDAxMTM7CisJdTMyIHVsU2VyaWFsTW9kZSA9IDE7CisJdTMyIHVsSW52ZXJ0VFNDbG9jayA9IDA7CisJdTMyIHVsVFNEYXRhU3RyZW5ndGggPSBEUlhLX01QRUdfU0VSSUFMX09VVFBVVF9QSU5fRFJJVkVfU1RSRU5HVEg7CisJdTMyIHVsVFNDbG9ja2tTdHJlbmd0aCA9IERSWEtfTVBFR19PVVRQVVRfQ0xLX0RSSVZFX1NUUkVOR1RIOworCXUzMiB1bERWQlRCaXRyYXRlID0gNTAwMDAwMDA7CisJdTMyIHVsRFZCQ0JpdHJhdGUgPSBEUlhLX1FBTV9TWU1CT0xSQVRFX01BWCAqIDg7CisKKwl1MzIgdWxJbnNlcnRSU0J5dGUgPSAwOworCisJdTMyIHVsUmZNaXJyb3IgPSAxOworCXUzMiB1bFBvd2VyRG93biA9IDA7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJc3RhdGUtPm1faGFzTE5BID0gZmFsc2U7CisJc3RhdGUtPm1faGFzRFZCVCA9IGZhbHNlOworCXN0YXRlLT5tX2hhc0RWQkMgPSBmYWxzZTsKKwlzdGF0ZS0+bV9oYXNBVFYgPSBmYWxzZTsKKwlzdGF0ZS0+bV9oYXNPT0IgPSBmYWxzZTsKKwlzdGF0ZS0+bV9oYXNBdWRpbyA9IGZhbHNlOworCisJc3RhdGUtPm1fQ2h1bmtTaXplID0gMTI0OworCisJc3RhdGUtPm1fb3NjQ2xvY2tGcmVxID0gMDsKKwlzdGF0ZS0+bV9zbWFydEFudEludmVydGVkID0gZmFsc2U7CisJc3RhdGUtPm1fYlBEb3duT3BlbkJyaWRnZSA9IGZhbHNlOworCisJLyogcmVhbCBzeXN0ZW0gY2xvY2sgZnJlcXVlbmN5IGluIGtIeiAqLworCXN0YXRlLT5tX3N5c0Nsb2NrRnJlcSA9IDE1MTg3NTsKKwkvKiBUaW1pbmcgZGl2LCAyNTBucy9Qc3lzICovCisJLyogVGltaW5nIGRpdiwgPSAoZGVsYXkgKG5hbm8gc2Vjb25kcykgKiBzeXNjbGsgKGtIeikpLyAxMDAwICovCisJc3RhdGUtPm1fSElDZmdUaW1pbmdEaXYgPSAoKHN0YXRlLT5tX3N5c0Nsb2NrRnJlcSAvIDEwMDApICoKKwkJCQkgICBISV9JMkNfREVMQVkpIC8gMTAwMDsKKwkvKiBDbGlwcGluZyAqLworCWlmIChzdGF0ZS0+bV9ISUNmZ1RpbWluZ0RpdiA+IFNJT19ISV9SQV9SQU1fUEFSXzJfQ0ZHX0RJVl9fTSkKKwkJc3RhdGUtPm1fSElDZmdUaW1pbmdEaXYgPSBTSU9fSElfUkFfUkFNX1BBUl8yX0NGR19ESVZfX007CisJc3RhdGUtPm1fSElDZmdXYWtlVXBLZXkgPSAoc3RhdGUtPmRlbW9kX2FkZHJlc3MgPDwgMSk7CisJLyogcG9ydC9icmlkZ2UvcG93ZXIgZG93biBjdHJsICovCisJc3RhdGUtPm1fSElDZmdDdHJsID0gU0lPX0hJX1JBX1JBTV9QQVJfNV9DRkdfU0xWMF9TTEFWRTsKKworCXN0YXRlLT5tX2JQb3dlckRvd24gPSAodWxQb3dlckRvd24gIT0gMCk7CisKKwlzdGF0ZS0+bV9EUlhLX0ExX1BBVENIX0NPREUgPSBmYWxzZTsKKwlzdGF0ZS0+bV9EUlhLX0ExX1JPTV9DT0RFID0gZmFsc2U7CisJc3RhdGUtPm1fRFJYS19BMl9ST01fQ09ERSA9IGZhbHNlOworCXN0YXRlLT5tX0RSWEtfQTNfUk9NX0NPREUgPSBmYWxzZTsKKwlzdGF0ZS0+bV9EUlhLX0EyX1BBVENIX0NPREUgPSBmYWxzZTsKKwlzdGF0ZS0+bV9EUlhLX0EzX1BBVENIX0NPREUgPSBmYWxzZTsKKworCS8qIEluaXQgQUdDIGFuZCBQR0EgcGFyYW1ldGVycyAqLworCS8qIFZTQiBJRiAqLworCXN0YXRlLT5tX3ZzYklmQWdjQ2ZnLmN0cmxNb2RlID0gKHVsVlNCSWZBZ2NNb2RlKTsKKwlzdGF0ZS0+bV92c2JJZkFnY0NmZy5vdXRwdXRMZXZlbCA9ICh1bFZTQklmQWdjT3V0cHV0TGV2ZWwpOworCXN0YXRlLT5tX3ZzYklmQWdjQ2ZnLm1pbk91dHB1dExldmVsID0gKHVsVlNCSWZBZ2NNaW5MZXZlbCk7CisJc3RhdGUtPm1fdnNiSWZBZ2NDZmcubWF4T3V0cHV0TGV2ZWwgPSAodWxWU0JJZkFnY01heExldmVsKTsKKwlzdGF0ZS0+bV92c2JJZkFnY0NmZy5zcGVlZCA9ICh1bFZTQklmQWdjU3BlZWQpOworCXN0YXRlLT5tX3ZzYlBnYUNmZyA9IDE0MDsKKworCS8qIFZTQiBSRiAqLworCXN0YXRlLT5tX3ZzYlJmQWdjQ2ZnLmN0cmxNb2RlID0gKHVsVlNCUmZBZ2NNb2RlKTsKKwlzdGF0ZS0+bV92c2JSZkFnY0NmZy5vdXRwdXRMZXZlbCA9ICh1bFZTQlJmQWdjT3V0cHV0TGV2ZWwpOworCXN0YXRlLT5tX3ZzYlJmQWdjQ2ZnLm1pbk91dHB1dExldmVsID0gKHVsVlNCUmZBZ2NNaW5MZXZlbCk7CisJc3RhdGUtPm1fdnNiUmZBZ2NDZmcubWF4T3V0cHV0TGV2ZWwgPSAodWxWU0JSZkFnY01heExldmVsKTsKKwlzdGF0ZS0+bV92c2JSZkFnY0NmZy5zcGVlZCA9ICh1bFZTQlJmQWdjU3BlZWQpOworCXN0YXRlLT5tX3ZzYlJmQWdjQ2ZnLnRvcCA9ICh1bFZTQlJmQWdjVG9wKTsKKwlzdGF0ZS0+bV92c2JSZkFnY0NmZy5jdXRPZmZDdXJyZW50ID0gKHVsVlNCUmZBZ2NDdXRPZmZDdXJyZW50KTsKKwlzdGF0ZS0+bV92c2JQcmVTYXdDZmcucmVmZXJlbmNlID0gMHgwNzsKKwlzdGF0ZS0+bV92c2JQcmVTYXdDZmcudXNlUHJlU2F3ID0gdHJ1ZTsKKworCXN0YXRlLT5tX1F1YWxpdHk4M3BlcmNlbnQgPSBERUZBVUxUX01FUl84MzsKKwlzdGF0ZS0+bV9RdWFsaXR5OTNwZXJjZW50ID0gREVGQVVMVF9NRVJfOTM7CisJaWYgKHVsUXVhbDkzIDw9IDUwMCAmJiB1bFF1YWw4MyA8IHVsUXVhbDkzKSB7CisJCXN0YXRlLT5tX1F1YWxpdHk4M3BlcmNlbnQgPSB1bFF1YWw4MzsKKwkJc3RhdGUtPm1fUXVhbGl0eTkzcGVyY2VudCA9IHVsUXVhbDkzOworCX0KKworCS8qIEFUViBJRiAqLworCXN0YXRlLT5tX2F0dklmQWdjQ2ZnLmN0cmxNb2RlID0gKHVsQVRWSWZBZ2NNb2RlKTsKKwlzdGF0ZS0+bV9hdHZJZkFnY0NmZy5vdXRwdXRMZXZlbCA9ICh1bEFUVklmQWdjT3V0cHV0TGV2ZWwpOworCXN0YXRlLT5tX2F0dklmQWdjQ2ZnLm1pbk91dHB1dExldmVsID0gKHVsQVRWSWZBZ2NNaW5MZXZlbCk7CisJc3RhdGUtPm1fYXR2SWZBZ2NDZmcubWF4T3V0cHV0TGV2ZWwgPSAodWxBVFZJZkFnY01heExldmVsKTsKKwlzdGF0ZS0+bV9hdHZJZkFnY0NmZy5zcGVlZCA9ICh1bEFUVklmQWdjU3BlZWQpOworCisJLyogQVRWIFJGICovCisJc3RhdGUtPm1fYXR2UmZBZ2NDZmcuY3RybE1vZGUgPSAodWxBVFZSZkFnY01vZGUpOworCXN0YXRlLT5tX2F0dlJmQWdjQ2ZnLm91dHB1dExldmVsID0gKHVsQVRWUmZBZ2NPdXRwdXRMZXZlbCk7CisJc3RhdGUtPm1fYXR2UmZBZ2NDZmcubWluT3V0cHV0TGV2ZWwgPSAodWxBVFZSZkFnY01pbkxldmVsKTsKKwlzdGF0ZS0+bV9hdHZSZkFnY0NmZy5tYXhPdXRwdXRMZXZlbCA9ICh1bEFUVlJmQWdjTWF4TGV2ZWwpOworCXN0YXRlLT5tX2F0dlJmQWdjQ2ZnLnNwZWVkID0gKHVsQVRWUmZBZ2NTcGVlZCk7CisJc3RhdGUtPm1fYXR2UmZBZ2NDZmcudG9wID0gKHVsQVRWUmZBZ2NUb3ApOworCXN0YXRlLT5tX2F0dlJmQWdjQ2ZnLmN1dE9mZkN1cnJlbnQgPSAodWxBVFZSZkFnY0N1dE9mZkN1cnJlbnQpOworCXN0YXRlLT5tX2F0dlByZVNhd0NmZy5yZWZlcmVuY2UgPSAweDA0OworCXN0YXRlLT5tX2F0dlByZVNhd0NmZy51c2VQcmVTYXcgPSB0cnVlOworCisKKwkvKiBEVkJUIFJGICovCisJc3RhdGUtPm1fZHZidFJmQWdjQ2ZnLmN0cmxNb2RlID0gRFJYS19BR0NfQ1RSTF9PRkY7CisJc3RhdGUtPm1fZHZidFJmQWdjQ2ZnLm91dHB1dExldmVsID0gMDsKKwlzdGF0ZS0+bV9kdmJ0UmZBZ2NDZmcubWluT3V0cHV0TGV2ZWwgPSAwOworCXN0YXRlLT5tX2R2YnRSZkFnY0NmZy5tYXhPdXRwdXRMZXZlbCA9IDB4RkZGRjsKKwlzdGF0ZS0+bV9kdmJ0UmZBZ2NDZmcudG9wID0gMHgyMTAwOworCXN0YXRlLT5tX2R2YnRSZkFnY0NmZy5jdXRPZmZDdXJyZW50ID0gNDAwMDsKKwlzdGF0ZS0+bV9kdmJ0UmZBZ2NDZmcuc3BlZWQgPSAxOworCisKKwkvKiBEVkJUIElGICovCisJc3RhdGUtPm1fZHZidElmQWdjQ2ZnLmN0cmxNb2RlID0gRFJYS19BR0NfQ1RSTF9BVVRPOworCXN0YXRlLT5tX2R2YnRJZkFnY0NmZy5vdXRwdXRMZXZlbCA9IDA7CisJc3RhdGUtPm1fZHZidElmQWdjQ2ZnLm1pbk91dHB1dExldmVsID0gMDsKKwlzdGF0ZS0+bV9kdmJ0SWZBZ2NDZmcubWF4T3V0cHV0TGV2ZWwgPSA5MDAwOworCXN0YXRlLT5tX2R2YnRJZkFnY0NmZy50b3AgPSAxMzQyNDsKKwlzdGF0ZS0+bV9kdmJ0SWZBZ2NDZmcuY3V0T2ZmQ3VycmVudCA9IDA7CisJc3RhdGUtPm1fZHZidElmQWdjQ2ZnLnNwZWVkID0gMzsKKwlzdGF0ZS0+bV9kdmJ0SWZBZ2NDZmcuRmFzdENsaXBDdHJsRGVsYXkgPSAzMDsKKwlzdGF0ZS0+bV9kdmJ0SWZBZ2NDZmcuSW5nYWluVGd0TWF4ID0gMzAwMDA7CisJLyogc3RhdGUtPm1fZHZidFBnYUNmZyA9IDE0MDsgKi8KKworCXN0YXRlLT5tX2R2YnRQcmVTYXdDZmcucmVmZXJlbmNlID0gNDsKKwlzdGF0ZS0+bV9kdmJ0UHJlU2F3Q2ZnLnVzZVByZVNhdyA9IGZhbHNlOworCisJLyogUUFNIFJGICovCisJc3RhdGUtPm1fcWFtUmZBZ2NDZmcuY3RybE1vZGUgPSBEUlhLX0FHQ19DVFJMX09GRjsKKwlzdGF0ZS0+bV9xYW1SZkFnY0NmZy5vdXRwdXRMZXZlbCA9IDA7CisJc3RhdGUtPm1fcWFtUmZBZ2NDZmcubWluT3V0cHV0TGV2ZWwgPSA2MDIzOworCXN0YXRlLT5tX3FhbVJmQWdjQ2ZnLm1heE91dHB1dExldmVsID0gMjcwMDA7CisJc3RhdGUtPm1fcWFtUmZBZ2NDZmcudG9wID0gMHgyMzgwOworCXN0YXRlLT5tX3FhbVJmQWdjQ2ZnLmN1dE9mZkN1cnJlbnQgPSA0MDAwOworCXN0YXRlLT5tX3FhbVJmQWdjQ2ZnLnNwZWVkID0gMzsKKworCS8qIFFBTSBJRiAqLworCXN0YXRlLT5tX3FhbUlmQWdjQ2ZnLmN0cmxNb2RlID0gRFJYS19BR0NfQ1RSTF9BVVRPOworCXN0YXRlLT5tX3FhbUlmQWdjQ2ZnLm91dHB1dExldmVsID0gMDsKKwlzdGF0ZS0+bV9xYW1JZkFnY0NmZy5taW5PdXRwdXRMZXZlbCA9IDA7CisJc3RhdGUtPm1fcWFtSWZBZ2NDZmcubWF4T3V0cHV0TGV2ZWwgPSA5MDAwOworCXN0YXRlLT5tX3FhbUlmQWdjQ2ZnLnRvcCA9IDB4MDUxMTsKKwlzdGF0ZS0+bV9xYW1JZkFnY0NmZy5jdXRPZmZDdXJyZW50ID0gMDsKKwlzdGF0ZS0+bV9xYW1JZkFnY0NmZy5zcGVlZCA9IDM7CisJc3RhdGUtPm1fcWFtSWZBZ2NDZmcuSW5nYWluVGd0TWF4ID0gNTExOTsKKwlzdGF0ZS0+bV9xYW1JZkFnY0NmZy5GYXN0Q2xpcEN0cmxEZWxheSA9IDUwOworCisJc3RhdGUtPm1fcWFtUGdhQ2ZnID0gMTQwOworCXN0YXRlLT5tX3FhbVByZVNhd0NmZy5yZWZlcmVuY2UgPSA0OworCXN0YXRlLT5tX3FhbVByZVNhd0NmZy51c2VQcmVTYXcgPSBmYWxzZTsKKworCXN0YXRlLT5tX09wZXJhdGlvbk1vZGUgPSBPTV9OT05FOworCXN0YXRlLT5tX0RyeGtTdGF0ZSA9IERSWEtfVU5JTklUSUFMSVpFRDsKKworCS8qIE1QRUcgb3V0cHV0IGNvbmZpZ3VyYXRpb24gKi8KKwlzdGF0ZS0+bV9lbmFibGVNUEVHT3V0cHV0ID0gdHJ1ZTsJLyogSWYgVFJVRTsgZW5hYmxlIE1QRUcgb3VwdXQgKi8KKwlzdGF0ZS0+bV9pbnNlcnRSU0J5dGUgPSBmYWxzZTsJLyogSWYgVFJVRTsgaW5zZXJ0IFJTIGJ5dGUgKi8KKwlzdGF0ZS0+bV9lbmFibGVQYXJhbGxlbCA9IHRydWU7CS8qIElmIFRSVUU7CisJCQkJCSAgIHBhcmFsbGVsIG91dCBvdGhlcndpc2Ugc2VyaWFsICovCisJc3RhdGUtPm1faW52ZXJ0REFUQSA9IGZhbHNlOwkvKiBJZiBUUlVFOyBpbnZlcnQgREFUQSBzaWduYWxzICovCisJc3RhdGUtPm1faW52ZXJ0RVJSID0gZmFsc2U7CS8qIElmIFRSVUU7IGludmVydCBFUlIgc2lnbmFsICovCisJc3RhdGUtPm1faW52ZXJ0U1RSID0gZmFsc2U7CS8qIElmIFRSVUU7IGludmVydCBTVFIgc2lnbmFscyAqLworCXN0YXRlLT5tX2ludmVydFZBTCA9IGZhbHNlOwkvKiBJZiBUUlVFOyBpbnZlcnQgVkFMIHNpZ25hbHMgKi8KKwlzdGF0ZS0+bV9pbnZlcnRDTEsgPSAodWxJbnZlcnRUU0Nsb2NrICE9IDApOwkvKiBJZiBUUlVFOyBpbnZlcnQgQ0xLIHNpZ25hbHMgKi8KKwlzdGF0ZS0+bV9EVkJUU3RhdGljQ0xLID0gKHVsRFZCVFN0YXRpY1RTQ2xvY2sgIT0gMCk7CisJc3RhdGUtPm1fRFZCQ1N0YXRpY0NMSyA9ICh1bERWQkNTdGF0aWNUU0Nsb2NrICE9IDApOworCS8qIElmIFRSVUU7IHN0YXRpYyBNUEVHIGNsb2NrcmF0ZSB3aWxsIGJlIHVzZWQ7CisJICAgb3RoZXJ3aXNlIGNsb2NrcmF0ZSB3aWxsIGFkYXB0IHRvIHRoZSBiaXRyYXRlIG9mIHRoZSBUUyAqLworCisJc3RhdGUtPm1fRFZCVEJpdHJhdGUgPSB1bERWQlRCaXRyYXRlOworCXN0YXRlLT5tX0RWQkNCaXRyYXRlID0gdWxEVkJDQml0cmF0ZTsKKworCXN0YXRlLT5tX1RTRGF0YVN0cmVuZ3RoID0gKHVsVFNEYXRhU3RyZW5ndGggJiAweDA3KTsKKwlzdGF0ZS0+bV9UU0Nsb2Nra1N0cmVuZ3RoID0gKHVsVFNDbG9ja2tTdHJlbmd0aCAmIDB4MDcpOworCisJLyogTWF4aW11bSBiaXRyYXRlIGluIGIvcyBpbiBjYXNlIHN0YXRpYyBjbG9ja3JhdGUgaXMgc2VsZWN0ZWQgKi8KKwlzdGF0ZS0+bV9tcGVnVHNTdGF0aWNCaXRyYXRlID0gMTkzOTI2NTg7CisJc3RhdGUtPm1fZGlzYWJsZVRFSWhhbmRsaW5nID0gZmFsc2U7CisKKwlpZiAodWxJbnNlcnRSU0J5dGUpCisJCXN0YXRlLT5tX2luc2VydFJTQnl0ZSA9IHRydWU7CisKKwlzdGF0ZS0+bV9NcGVnTG9ja1RpbWVPdXQgPSBERUZBVUxUX0RSWEtfTVBFR19MT0NLX1RJTUVPVVQ7CisJaWYgKHVsTXBlZ0xvY2tUaW1lT3V0IDwgMTAwMDApCisJCXN0YXRlLT5tX01wZWdMb2NrVGltZU91dCA9IHVsTXBlZ0xvY2tUaW1lT3V0OworCXN0YXRlLT5tX0RlbW9kTG9ja1RpbWVPdXQgPSBERUZBVUxUX0RSWEtfREVNT0RfTE9DS19USU1FT1VUOworCWlmICh1bERlbW9kTG9ja1RpbWVPdXQgPCAxMDAwMCkKKwkJc3RhdGUtPm1fRGVtb2RMb2NrVGltZU91dCA9IHVsRGVtb2RMb2NrVGltZU91dDsKKworCS8qIFFBTSBkZWZhdWx0cyAqLworCXN0YXRlLT5tX0NvbnN0ZWxsYXRpb24gPSBEUlhfQ09OU1RFTExBVElPTl9BVVRPOworCXN0YXRlLT5tX3FhbUludGVybGVhdmVNb2RlID0gRFJYS19RQU1fSTEyX0oxNzsKKwlzdGF0ZS0+bV9mZWNSc1BsZW4gPSAyMDQgKiA4OwkvKiBmZWNSc1BsZW4gIGFubmV4IEEgKi8KKwlzdGF0ZS0+bV9mZWNSc1ByZXNjYWxlID0gMTsKKworCXN0YXRlLT5tX3NxaVNwZWVkID0gRFJYS19EVkJUX1NRSV9TUEVFRF9NRURJVU07CisJc3RhdGUtPm1fYWdjRmFzdENsaXBDdHJsRGVsYXkgPSAwOworCisJc3RhdGUtPm1fR1BJT0NmZyA9ICh1bEdQSU9DZmcpOworCisJc3RhdGUtPm1fYlBvd2VyRG93biA9IGZhbHNlOworCXN0YXRlLT5tX2N1cnJlbnRQb3dlck1vZGUgPSBEUlhfUE9XRVJfRE9XTjsKKworCXN0YXRlLT5tX2VuYWJsZVBhcmFsbGVsID0gKHVsU2VyaWFsTW9kZSA9PSAwKTsKKworCXN0YXRlLT5tX3JmbWlycm9yID0gKHVsUmZNaXJyb3IgPT0gMCk7CisJc3RhdGUtPm1fSWZBZ2NQb2wgPSBmYWxzZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBEUlhYX09wZW4oc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCWludCBzdGF0dXMgPSAwOworCXUzMiBqdGFnID0gMDsKKwl1MTYgYmlkID0gMDsKKwl1MTYga2V5ID0gMDsKKworCWRwcmludGsoMSwgIlxuIik7CisJLyogc3RvcCBsb2NrIGluZGljYXRvciBwcm9jZXNzICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9HUElPX19BLCBTQ1VfUkFNX0dQSU9fSFdfTE9DS19JTkRfRElTQUJMRSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJLyogQ2hlY2sgZGV2aWNlIGlkICovCisJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBTSU9fVE9QX0NPTU1fS0VZX19BLCAma2V5KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fVE9QX0NPTU1fS0VZX19BLCBTSU9fVE9QX0NPTU1fS0VZX0tFWSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gcmVhZDMyKHN0YXRlLCBTSU9fVE9QX0pUQUdJRF9MT19fQSwgJmp0YWcpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgU0lPX1BEUl9VSU9fSU5fSElfX0EsICZiaWQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19UT1BfQ09NTV9LRVlfX0EsIGtleSk7CitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBHZXREZXZpY2VDYXBhYmlsaXRpZXMoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCXUxNiBzaW9QZHJPaHdDZmcgPSAwOworCXUzMiBzaW9Ub3BKdGFnaWRMbyA9IDA7CisJaW50IHN0YXR1czsKKwljb25zdCBjaGFyICpzcGluID0gIiI7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJLyogZHJpdmVyIDAuOS4wICovCisJLyogc3RvcCBsb2NrIGluZGljYXRvciBwcm9jZXNzICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9HUElPX19BLCBTQ1VfUkFNX0dQSU9fSFdfTE9DS19JTkRfRElTQUJMRSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1RPUF9DT01NX0tFWV9fQSwgMHhGQUJBKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIFNJT19QRFJfT0hXX0NGR19fQSwgJnNpb1Bkck9od0NmZyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1RPUF9DT01NX0tFWV9fQSwgMHgwMDAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN3aXRjaCAoKHNpb1Bkck9od0NmZyAmIFNJT19QRFJfT0hXX0NGR19GUkVGX1NFTF9fTSkpIHsKKwljYXNlIDA6CisJCS8qIGlnbm9yZSAoYnlwYXNzID8pICovCisJCWJyZWFrOworCWNhc2UgMToKKwkJLyogMjcgTUh6ICovCisJCXN0YXRlLT5tX29zY0Nsb2NrRnJlcSA9IDI3MDAwOworCQlicmVhazsKKwljYXNlIDI6CisJCS8qIDIwLjI1IE1IeiAqLworCQlzdGF0ZS0+bV9vc2NDbG9ja0ZyZXEgPSAyMDI1MDsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQkvKiA0IE1IeiAqLworCQlzdGF0ZS0+bV9vc2NDbG9ja0ZyZXEgPSAyMDI1MDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBDbG9jayBGcmVxdWVuY3kgaXMgdW5rb253blxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKgorCQlEZXRlcm1pbmUgZGV2aWNlIGNhcGFiaWxpdGllcworCQlCYXNlZCBvbiBwaW5uaW5nIHYxNAorCQkqLworCXN0YXR1cyA9IHJlYWQzMihzdGF0ZSwgU0lPX1RPUF9KVEFHSURfTE9fX0EsICZzaW9Ub3BKdGFnaWRMbyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJLyogZHJpdmVyIDAuOS4wICovCisJc3dpdGNoICgoc2lvVG9wSnRhZ2lkTG8gPj4gMjkpICYgMHhGKSB7CisJY2FzZSAwOgorCQlzdGF0ZS0+bV9kZXZpY2VTcGluID0gRFJYS19TUElOX0ExOworCQlzcGluID0gIkExIjsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlzdGF0ZS0+bV9kZXZpY2VTcGluID0gRFJYS19TUElOX0EyOworCQlzcGluID0gIkEyIjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlzdGF0ZS0+bV9kZXZpY2VTcGluID0gRFJYS19TUElOX0EzOworCQlzcGluID0gIkEzIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3RhdGUtPm1fZGV2aWNlU3BpbiA9IERSWEtfU1BJTl9VTktOT1dOOworCQlzdGF0dXMgPSAtRUlOVkFMOworCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IFNwaW4gdW5rbm93blxuIik7CisJCWdvdG8gZXJyb3IyOworCX0KKwlzd2l0Y2ggKChzaW9Ub3BKdGFnaWRMbyA+PiAxMikgJiAweEZGKSB7CisJY2FzZSAweDEzOgorCQkvKiB0eXBlSWQgPSBEUlgzOTEzS19UWVBFX0lEICovCisJCXN0YXRlLT5tX2hhc0xOQSA9IGZhbHNlOworCQlzdGF0ZS0+bV9oYXNPT0IgPSBmYWxzZTsKKwkJc3RhdGUtPm1faGFzQVRWID0gZmFsc2U7CisJCXN0YXRlLT5tX2hhc0F1ZGlvID0gZmFsc2U7CisJCXN0YXRlLT5tX2hhc0RWQlQgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNEVkJDID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzU0FXU1cgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNHUElPMiA9IGZhbHNlOworCQlzdGF0ZS0+bV9oYXNHUElPMSA9IGZhbHNlOworCQlzdGF0ZS0+bV9oYXNJUlFOID0gZmFsc2U7CisJCWJyZWFrOworCWNhc2UgMHgxNToKKwkJLyogdHlwZUlkID0gRFJYMzkxNUtfVFlQRV9JRCAqLworCQlzdGF0ZS0+bV9oYXNMTkEgPSBmYWxzZTsKKwkJc3RhdGUtPm1faGFzT09CID0gZmFsc2U7CisJCXN0YXRlLT5tX2hhc0FUViA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0F1ZGlvID0gZmFsc2U7CisJCXN0YXRlLT5tX2hhc0RWQlQgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNEVkJDID0gZmFsc2U7CisJCXN0YXRlLT5tX2hhc1NBV1NXID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzR1BJTzIgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNHUElPMSA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0lSUU4gPSBmYWxzZTsKKwkJYnJlYWs7CisJY2FzZSAweDE2OgorCQkvKiB0eXBlSWQgPSBEUlgzOTE2S19UWVBFX0lEICovCisJCXN0YXRlLT5tX2hhc0xOQSA9IGZhbHNlOworCQlzdGF0ZS0+bV9oYXNPT0IgPSBmYWxzZTsKKwkJc3RhdGUtPm1faGFzQVRWID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzQXVkaW8gPSBmYWxzZTsKKwkJc3RhdGUtPm1faGFzRFZCVCA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0RWQkMgPSBmYWxzZTsKKwkJc3RhdGUtPm1faGFzU0FXU1cgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNHUElPMiA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0dQSU8xID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzSVJRTiA9IGZhbHNlOworCQlicmVhazsKKwljYXNlIDB4MTg6CisJCS8qIHR5cGVJZCA9IERSWDM5MThLX1RZUEVfSUQgKi8KKwkJc3RhdGUtPm1faGFzTE5BID0gZmFsc2U7CisJCXN0YXRlLT5tX2hhc09PQiA9IGZhbHNlOworCQlzdGF0ZS0+bV9oYXNBVFYgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNBdWRpbyA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0RWQlQgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNEVkJDID0gZmFsc2U7CisJCXN0YXRlLT5tX2hhc1NBV1NXID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzR1BJTzIgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNHUElPMSA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0lSUU4gPSBmYWxzZTsKKwkJYnJlYWs7CisJY2FzZSAweDIxOgorCQkvKiB0eXBlSWQgPSBEUlgzOTIxS19UWVBFX0lEICovCisJCXN0YXRlLT5tX2hhc0xOQSA9IGZhbHNlOworCQlzdGF0ZS0+bV9oYXNPT0IgPSBmYWxzZTsKKwkJc3RhdGUtPm1faGFzQVRWID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzQXVkaW8gPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNEVkJUID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzRFZCQyA9IHRydWU7CisJCXN0YXRlLT5tX2hhc1NBV1NXID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzR1BJTzIgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNHUElPMSA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0lSUU4gPSBmYWxzZTsKKwkJYnJlYWs7CisJY2FzZSAweDIzOgorCQkvKiB0eXBlSWQgPSBEUlgzOTIzS19UWVBFX0lEICovCisJCXN0YXRlLT5tX2hhc0xOQSA9IGZhbHNlOworCQlzdGF0ZS0+bV9oYXNPT0IgPSBmYWxzZTsKKwkJc3RhdGUtPm1faGFzQVRWID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzQXVkaW8gPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNEVkJUID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzRFZCQyA9IHRydWU7CisJCXN0YXRlLT5tX2hhc1NBV1NXID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzR1BJTzIgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNHUElPMSA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0lSUU4gPSBmYWxzZTsKKwkJYnJlYWs7CisJY2FzZSAweDI1OgorCQkvKiB0eXBlSWQgPSBEUlgzOTI1S19UWVBFX0lEICovCisJCXN0YXRlLT5tX2hhc0xOQSA9IGZhbHNlOworCQlzdGF0ZS0+bV9oYXNPT0IgPSBmYWxzZTsKKwkJc3RhdGUtPm1faGFzQVRWID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzQXVkaW8gPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNEVkJUID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzRFZCQyA9IHRydWU7CisJCXN0YXRlLT5tX2hhc1NBV1NXID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzR1BJTzIgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNHUElPMSA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0lSUU4gPSBmYWxzZTsKKwkJYnJlYWs7CisJY2FzZSAweDI2OgorCQkvKiB0eXBlSWQgPSBEUlgzOTI2S19UWVBFX0lEICovCisJCXN0YXRlLT5tX2hhc0xOQSA9IGZhbHNlOworCQlzdGF0ZS0+bV9oYXNPT0IgPSBmYWxzZTsKKwkJc3RhdGUtPm1faGFzQVRWID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzQXVkaW8gPSBmYWxzZTsKKwkJc3RhdGUtPm1faGFzRFZCVCA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0RWQkMgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNTQVdTVyA9IHRydWU7CisJCXN0YXRlLT5tX2hhc0dQSU8yID0gdHJ1ZTsKKwkJc3RhdGUtPm1faGFzR1BJTzEgPSB0cnVlOworCQlzdGF0ZS0+bV9oYXNJUlFOID0gZmFsc2U7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRGV2aWNlSUQgMHglMDJ4IG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkoKHNpb1RvcEp0YWdpZExvID4+IDEyKSAmIDB4RkYpKTsKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjI7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTworCSAgICAgICAiZHJ4azogZGV0ZWN0ZWQgYSBkcngtMzklMDJ4aywgc3BpbiAlcywgeHRhbCAlZC4lMDNkIE1IelxuIiwKKwkgICAgICAgKChzaW9Ub3BKdGFnaWRMbyA+PiAxMikgJiAweEZGKSwgc3BpbiwKKwkgICAgICAgc3RhdGUtPm1fb3NjQ2xvY2tGcmVxIC8gMTAwMCwKKwkgICAgICAgc3RhdGUtPm1fb3NjQ2xvY2tGcmVxICUgMTAwMCk7CisKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKworZXJyb3IyOgorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgSElfQ29tbWFuZChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIHUxNiBjbWQsIHUxNiAqcFJlc3VsdCkKK3sKKwlpbnQgc3RhdHVzOworCWJvb2wgcG93ZXJkb3duX2NtZDsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwkvKiBXcml0ZSBjb21tYW5kICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX0hJX1JBX1JBTV9DTURfX0EsIGNtZCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJaWYgKGNtZCA9PSBTSU9fSElfUkFfUkFNX0NNRF9SRVNFVCkKKwkJbXNsZWVwKDEpOworCisJcG93ZXJkb3duX2NtZCA9CisJICAgIChib29sKSAoKGNtZCA9PSBTSU9fSElfUkFfUkFNX0NNRF9DT05GSUcpICYmCisJCSAgICAoKHN0YXRlLT5tX0hJQ2ZnQ3RybCkgJgorCQkgICAgIFNJT19ISV9SQV9SQU1fUEFSXzVfQ0ZHX1NMRUVQX19NKSA9PQorCQkgICAgU0lPX0hJX1JBX1JBTV9QQVJfNV9DRkdfU0xFRVBfWlpaKTsKKwlpZiAocG93ZXJkb3duX2NtZCA9PSBmYWxzZSkgeworCQkvKiBXYWl0IHVudGlsIGNvbW1hbmQgcmR5ICovCisJCXUzMiByZXRyeUNvdW50ID0gMDsKKwkJdTE2IHdhaXRDbWQ7CisKKwkJZG8geworCQkJbXNsZWVwKDEpOworCQkJcmV0cnlDb3VudCArPSAxOworCQkJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBTSU9fSElfUkFfUkFNX0NNRF9fQSwKKwkJCQkJICAmd2FpdENtZCk7CisJCX0gd2hpbGUgKChzdGF0dXMgPCAwKSAmJiAocmV0cnlDb3VudCA8IERSWEtfTUFYX1JFVFJJRVMpCisJCQkgJiYgKHdhaXRDbWQgIT0gMCkpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgU0lPX0hJX1JBX1JBTV9SRVNfX0EsIHBSZXN1bHQpOworCX0KK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgSElfQ2ZnQ29tbWFuZChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUpCit7CisJaW50IHN0YXR1czsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwltdXRleF9sb2NrKCZzdGF0ZS0+bXV0ZXgpOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX0hJX1JBX1JBTV9QQVJfNl9fQSwgc3RhdGUtPm1fSElDZmdUaW1lb3V0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fSElfUkFfUkFNX1BBUl81X19BLCBzdGF0ZS0+bV9ISUNmZ0N0cmwpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19ISV9SQV9SQU1fUEFSXzRfX0EsIHN0YXRlLT5tX0hJQ2ZnV2FrZVVwS2V5KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fSElfUkFfUkFNX1BBUl8zX19BLCBzdGF0ZS0+bV9ISUNmZ0JyaWRnZURlbGF5KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fSElfUkFfUkFNX1BBUl8yX19BLCBzdGF0ZS0+bV9ISUNmZ1RpbWluZ0Rpdik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX0hJX1JBX1JBTV9QQVJfMV9fQSwgU0lPX0hJX1JBX1JBTV9QQVJfMV9QQVIxX1NFQ19LRVkpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IEhJX0NvbW1hbmQoc3RhdGUsIFNJT19ISV9SQV9SQU1fQ01EX0NPTkZJRywgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0ZS0+bV9ISUNmZ0N0cmwgJj0gflNJT19ISV9SQV9SQU1fUEFSXzVfQ0ZHX1NMRUVQX1paWjsKK2Vycm9yOgorCW11dGV4X3VubG9jaygmc3RhdGUtPm11dGV4KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBJbml0SEkoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCWRwcmludGsoMSwgIlxuIik7CisKKwlzdGF0ZS0+bV9ISUNmZ1dha2VVcEtleSA9IChzdGF0ZS0+ZGVtb2RfYWRkcmVzcyA8PCAxKTsKKwlzdGF0ZS0+bV9ISUNmZ1RpbWVvdXQgPSAweDk2RkY7CisJLyogcG9ydC9icmlkZ2UvcG93ZXIgZG93biBjdHJsICovCisJc3RhdGUtPm1fSElDZmdDdHJsID0gU0lPX0hJX1JBX1JBTV9QQVJfNV9DRkdfU0xWMF9TTEFWRTsKKworCXJldHVybiBISV9DZmdDb21tYW5kKHN0YXRlKTsKK30KKworc3RhdGljIGludCBNUEVHVFNDb25maWd1cmVQaW5zKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgYm9vbCBtcGVnRW5hYmxlKQoreworCWludCBzdGF0dXMgPSAtMTsKKwl1MTYgc2lvUGRyTWNsa0NmZyA9IDA7CisJdTE2IHNpb1Bkck1keENmZyA9IDA7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJLyogc3RvcCBsb2NrIGluZGljYXRvciBwcm9jZXNzICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9HUElPX19BLCBTQ1VfUkFNX0dQSU9fSFdfTE9DS19JTkRfRElTQUJMRSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiAgTVBFRyBUUyBwYWQgY29uZmlndXJhdGlvbiAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19UT1BfQ09NTV9LRVlfX0EsIDB4RkFCQSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlpZiAobXBlZ0VuYWJsZSA9PSBmYWxzZSkgeworCQkvKiAgU2V0IE1QRUcgVFMgcGFkcyB0byBpbnB1dG1vZGUgKi8KKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NU1RSVF9DRkdfX0EsIDB4MDAwMCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NRVJSX0NGR19fQSwgMHgwMDAwKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX01DTEtfQ0ZHX19BLCAweDAwMDApOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTVZBTF9DRkdfX0EsIDB4MDAwMCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NRDBfQ0ZHX19BLCAweDAwMDApOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTUQxX0NGR19fQSwgMHgwMDAwKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX01EMl9DRkdfX0EsIDB4MDAwMCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NRDNfQ0ZHX19BLCAweDAwMDApOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTUQ0X0NGR19fQSwgMHgwMDAwKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX01ENV9DRkdfX0EsIDB4MDAwMCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NRDZfQ0ZHX19BLCAweDAwMDApOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTUQ3X0NGR19fQSwgMHgwMDAwKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCX0gZWxzZSB7CisJCS8qIEVuYWJsZSBNUEVHIG91dHB1dCAqLworCQlzaW9QZHJNZHhDZmcgPQorCQkJKChzdGF0ZS0+bV9UU0RhdGFTdHJlbmd0aCA8PAorCQkJU0lPX1BEUl9NRDBfQ0ZHX0RSSVZFX19CKSB8IDB4MDAwMyk7CisJCXNpb1Bkck1jbGtDZmcgPSAoKHN0YXRlLT5tX1RTQ2xvY2trU3RyZW5ndGggPDwKKwkJCQkJU0lPX1BEUl9NQ0xLX0NGR19EUklWRV9fQikgfAorCQkJCQkweDAwMDMpOworCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTVNUUlRfQ0ZHX19BLCBzaW9QZHJNZHhDZmcpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTUVSUl9DRkdfX0EsIDB4MDAwMCk7CS8qIERpc2FibGUgKi8KKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX01WQUxfQ0ZHX19BLCAweDAwMDApOwkvKiBEaXNhYmxlICovCisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJaWYgKHN0YXRlLT5tX2VuYWJsZVBhcmFsbGVsID09IHRydWUpIHsKKwkJCS8qIHBhcmFsZWwgLT4gZW5hYmxlIE1EMSB0byBNRDcgKi8KKwkJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTUQxX0NGR19fQSwgc2lvUGRyTWR4Q2ZnKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX01EMl9DRkdfX0EsIHNpb1Bkck1keENmZyk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NRDNfQ0ZHX19BLCBzaW9QZHJNZHhDZmcpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTUQ0X0NGR19fQSwgc2lvUGRyTWR4Q2ZnKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX01ENV9DRkdfX0EsIHNpb1Bkck1keENmZyk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NRDZfQ0ZHX19BLCBzaW9QZHJNZHhDZmcpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTUQ3X0NGR19fQSwgc2lvUGRyTWR4Q2ZnKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCX0gZWxzZSB7CisJCQlzaW9QZHJNZHhDZmcgPSAoKHN0YXRlLT5tX1RTRGF0YVN0cmVuZ3RoIDw8CisJCQkJCQlTSU9fUERSX01EMF9DRkdfRFJJVkVfX0IpCisJCQkJCXwgMHgwMDAzKTsKKwkJCS8qIHNlcmlhbCAtPiBkaXNhYmxlIE1EMSB0byBNRDcgKi8KKwkJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTUQxX0NGR19fQSwgMHgwMDAwKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX01EMl9DRkdfX0EsIDB4MDAwMCk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NRDNfQ0ZHX19BLCAweDAwMDApOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTUQ0X0NGR19fQSwgMHgwMDAwKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX01ENV9DRkdfX0EsIDB4MDAwMCk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NRDZfQ0ZHX19BLCAweDAwMDApOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfTUQ3X0NGR19fQSwgMHgwMDAwKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCX0KKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NQ0xLX0NGR19fQSwgc2lvUGRyTWNsa0NmZyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9NRDBfQ0ZHX19BLCBzaW9QZHJNZHhDZmcpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJfQorCS8qICBFbmFibGUgTUIgb3V0cHV0IG92ZXIgTVBFRyBwYWRzIGFuZCBjdGwgaW5wdXQgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX01PTl9DRkdfX0EsIDB4MDAwMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJLyogIFdyaXRlIG5vbWFnaWMgd29yZCB0byBlbmFibGUgcGRyIHJlZyB3cml0ZSAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19UT1BfQ09NTV9LRVlfX0EsIDB4MDAwMCk7CitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBNUEVHVFNEaXNhYmxlKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwlkcHJpbnRrKDEsICJcbiIpOworCisJcmV0dXJuIE1QRUdUU0NvbmZpZ3VyZVBpbnMoc3RhdGUsIGZhbHNlKTsKK30KKworc3RhdGljIGludCBCTENoYWluQ21kKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwKKwkJICAgICAgdTE2IHJvbU9mZnNldCwgdTE2IG5yT2ZFbGVtZW50cywgdTMyIHRpbWVPdXQpCit7CisJdTE2IGJsU3RhdHVzID0gMDsKKwlpbnQgc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgZW5kOworCisJZHByaW50aygxLCAiXG4iKTsKKwltdXRleF9sb2NrKCZzdGF0ZS0+bXV0ZXgpOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19CTF9NT0RFX19BLCBTSU9fQkxfTU9ERV9DSEFJTik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX0JMX0NIQUlOX0FERFJfX0EsIHJvbU9mZnNldCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX0JMX0NIQUlOX0xFTl9fQSwgbnJPZkVsZW1lbnRzKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fQkxfRU5BQkxFX19BLCBTSU9fQkxfRU5BQkxFX09OKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCWVuZCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKHRpbWVPdXQpOworCWRvIHsKKwkJbXNsZWVwKDEpOworCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIFNJT19CTF9TVEFUVVNfX0EsICZibFN0YXR1cyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwl9IHdoaWxlICgoYmxTdGF0dXMgPT0gMHgxKSAmJgorCQkJKCh0aW1lX2lzX2FmdGVyX2ppZmZpZXMoZW5kKSkpKTsKKworCWlmIChibFN0YXR1cyA9PSAweDEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBTSU8gbm90IHJlYWR5XG4iKTsKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjI7CisJfQorZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworZXJyb3IyOgorCW11dGV4X3VubG9jaygmc3RhdGUtPm11dGV4KTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisKK3N0YXRpYyBpbnQgRG93bmxvYWRNaWNyb2NvZGUoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLAorCQkJICAgICBjb25zdCB1OCBwTUNJbWFnZVtdLCB1MzIgTGVuZ3RoKQoreworCWNvbnN0IHU4ICpwU3JjID0gcE1DSW1hZ2U7CisJdTE2IEZsYWdzOworCXUxNiBEcmFpbjsKKwl1MzIgQWRkcmVzczsKKwl1MTYgbkJsb2NrczsKKwl1MTYgQmxvY2tTaXplOworCXUxNiBCbG9ja0NSQzsKKwl1MzIgb2Zmc2V0ID0gMDsKKwl1MzIgaTsKKwlpbnQgc3RhdHVzID0gMDsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwkvKiBkb3duIHRoZSBkcmFpbiAod2UgZG9uIGNhcmUgYWJvdXQgTUFHSUNfV09SRCkgKi8KKwlEcmFpbiA9IChwU3JjWzBdIDw8IDgpIHwgcFNyY1sxXTsKKwlwU3JjICs9IHNpemVvZih1MTYpOworCW9mZnNldCArPSBzaXplb2YodTE2KTsKKwluQmxvY2tzID0gKHBTcmNbMF0gPDwgOCkgfCBwU3JjWzFdOworCXBTcmMgKz0gc2l6ZW9mKHUxNik7CisJb2Zmc2V0ICs9IHNpemVvZih1MTYpOworCisJZm9yIChpID0gMDsgaSA8IG5CbG9ja3M7IGkgKz0gMSkgeworCQlBZGRyZXNzID0gKHBTcmNbMF0gPDwgMjQpIHwgKHBTcmNbMV0gPDwgMTYpIHwKKwkJICAgIChwU3JjWzJdIDw8IDgpIHwgcFNyY1szXTsKKwkJcFNyYyArPSBzaXplb2YodTMyKTsKKwkJb2Zmc2V0ICs9IHNpemVvZih1MzIpOworCisJCUJsb2NrU2l6ZSA9ICgocFNyY1swXSA8PCA4KSB8IHBTcmNbMV0pICogc2l6ZW9mKHUxNik7CisJCXBTcmMgKz0gc2l6ZW9mKHUxNik7CisJCW9mZnNldCArPSBzaXplb2YodTE2KTsKKworCQlGbGFncyA9IChwU3JjWzBdIDw8IDgpIHwgcFNyY1sxXTsKKwkJcFNyYyArPSBzaXplb2YodTE2KTsKKwkJb2Zmc2V0ICs9IHNpemVvZih1MTYpOworCisJCUJsb2NrQ1JDID0gKHBTcmNbMF0gPDwgOCkgfCBwU3JjWzFdOworCQlwU3JjICs9IHNpemVvZih1MTYpOworCQlvZmZzZXQgKz0gc2l6ZW9mKHUxNik7CisKKwkJaWYgKG9mZnNldCArIEJsb2NrU2l6ZSA+IExlbmd0aCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBGaXJtd2FyZSBpcyBjb3JydXB0ZWQuXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJc3RhdHVzID0gd3JpdGVfYmxvY2soc3RhdGUsIEFkZHJlc3MsIEJsb2NrU2l6ZSwgcFNyYyk7CisJCWlmIChzdGF0dXMgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIHdoaWxlIGxvYWRpbmcgZmlybXdhcmVcbiIsIHN0YXR1cyk7CisJCQlicmVhazsKKwkJfQorCQlwU3JjICs9IEJsb2NrU2l6ZTsKKwkJb2Zmc2V0ICs9IEJsb2NrU2l6ZTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBEVkJURW5hYmxlT0ZETVRva2VuUmluZyhzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIGJvb2wgZW5hYmxlKQoreworCWludCBzdGF0dXM7CisJdTE2IGRhdGEgPSAwOworCXUxNiBkZXNpcmVkQ3RybCA9IFNJT19PRkRNX1NIX09GRE1fUklOR19FTkFCTEVfT047CisJdTE2IGRlc2lyZWRTdGF0dXMgPSBTSU9fT0ZETV9TSF9PRkRNX1JJTkdfU1RBVFVTX0VOQUJMRUQ7CisJdW5zaWduZWQgbG9uZyBlbmQ7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJaWYgKGVuYWJsZSA9PSBmYWxzZSkgeworCQlkZXNpcmVkQ3RybCA9IFNJT19PRkRNX1NIX09GRE1fUklOR19FTkFCTEVfT0ZGOworCQlkZXNpcmVkU3RhdHVzID0gU0lPX09GRE1fU0hfT0ZETV9SSU5HX1NUQVRVU19ET1dOOworCX0KKworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgU0lPX09GRE1fU0hfT0ZETV9SSU5HX1NUQVRVU19fQSwgJmRhdGEpOworCWlmIChzdGF0dXMgPj0gMCAmJiBkYXRhID09IGRlc2lyZWRTdGF0dXMpIHsKKwkJLyogdG9rZW5yaW5nIGFscmVhZHkgaGFzIGNvcnJlY3Qgc3RhdHVzICovCisJCXJldHVybiBzdGF0dXM7CisJfQorCS8qIERpc2FibGUvZW5hYmxlIGR2YnQgdG9rZW5yaW5nIGJyaWRnZSAgICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX09GRE1fU0hfT0ZETV9SSU5HX0VOQUJMRV9fQSwgZGVzaXJlZEN0cmwpOworCisJZW5kID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoRFJYS19PRkRNX1RSX1NIVVRET1dOX1RJTUVPVVQpOworCWRvIHsKKwkJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBTSU9fT0ZETV9TSF9PRkRNX1JJTkdfU1RBVFVTX19BLCAmZGF0YSk7CisJCWlmICgoc3RhdHVzID49IDAgJiYgZGF0YSA9PSBkZXNpcmVkU3RhdHVzKSB8fCB0aW1lX2lzX2FmdGVyX2ppZmZpZXMoZW5kKSkKKwkJCWJyZWFrOworCQltc2xlZXAoMSk7CisJfSB3aGlsZSAoMSk7CisJaWYgKGRhdGEgIT0gZGVzaXJlZFN0YXR1cykgeworCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IFNJTyBub3QgcmVhZHlcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBNUEVHVFNTdG9wKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwl1MTYgZmVjT2NTbmNNb2RlID0gMDsKKwl1MTYgZmVjT2NJcHJNb2RlID0gMDsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwkvKiBHcmFjZWZ1bGwgc2h1dGRvd24gKGJ5dGUgYm91bmRhcmllcykgKi8KKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIEZFQ19PQ19TTkNfTU9ERV9fQSwgJmZlY09jU25jTW9kZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJZmVjT2NTbmNNb2RlIHw9IEZFQ19PQ19TTkNfTU9ERV9TSFVURE9XTl9fTTsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfT0NfU05DX01PREVfX0EsIGZlY09jU25jTW9kZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBTdXBwcmVzcyBNQ0xLIGR1cmluZyBhYnNlbmNlIG9mIGRhdGEgKi8KKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIEZFQ19PQ19JUFJfTU9ERV9fQSwgJmZlY09jSXByTW9kZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJZmVjT2NJcHJNb2RlIHw9IEZFQ19PQ19JUFJfTU9ERV9NQ0xLX0RJU19EQVRfQUJTX19NOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19PQ19JUFJfTU9ERV9fQSwgZmVjT2NJcHJNb2RlKTsKKworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBzY3VfY29tbWFuZChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsCisJCSAgICAgICB1MTYgY21kLCB1OCBwYXJhbWV0ZXJMZW4sCisJCSAgICAgICB1MTYgKnBhcmFtZXRlciwgdTggcmVzdWx0TGVuLCB1MTYgKnJlc3VsdCkKK3sKKyNpZiAoU0NVX1JBTV9QQVJBTV8wX19BIC0gU0NVX1JBTV9QQVJBTV8xNV9fQSkgIT0gMTUKKyNlcnJvciBEUlhLIHJlZ2lzdGVyIG1hcHBpbmcgbm8gbG9uZ2VyIGNvbXBhdGlibGUgd2l0aCB0aGlzIHJvdXRpbmUhCisjZW5kaWYKKwl1MTYgY3VyQ21kID0gMDsKKwlpbnQgc3RhdHVzID0gLUVJTlZBTDsKKwl1bnNpZ25lZCBsb25nIGVuZDsKKwl1OCBidWZmZXJbMzRdOworCWludCBjbnQgPSAwLCBpaTsKKwljb25zdCBjaGFyICpwOworCWNoYXIgZXJybmFtZVszMF07CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJaWYgKChjbWQgPT0gMCkgfHwgKChwYXJhbWV0ZXJMZW4gPiAwKSAmJiAocGFyYW1ldGVyID09IE5VTEwpKSB8fAorCSAgICAoKHJlc3VsdExlbiA+IDApICYmIChyZXN1bHQgPT0gTlVMTCkpKQorCQlnb3RvIGVycm9yOworCisJbXV0ZXhfbG9jaygmc3RhdGUtPm11dGV4KTsKKworCS8qIGFzc3VtZSB0aGF0IHRoZSBjb21tYW5kIHJlZ2lzdGVyIGlzIHJlYWR5CisJCXNpbmNlIGl0IGlzIGNoZWNrZWQgYWZ0ZXJ3YXJkcyAqLworCWZvciAoaWkgPSBwYXJhbWV0ZXJMZW4gLSAxOyBpaSA+PSAwOyBpaSAtPSAxKSB7CisJCWJ1ZmZlcltjbnQrK10gPSAocGFyYW1ldGVyW2lpXSAmIDB4RkYpOworCQlidWZmZXJbY250KytdID0gKChwYXJhbWV0ZXJbaWldID4+IDgpICYgMHhGRik7CisJfQorCWJ1ZmZlcltjbnQrK10gPSAoY21kICYgMHhGRik7CisJYnVmZmVyW2NudCsrXSA9ICgoY21kID4+IDgpICYgMHhGRik7CisKKwl3cml0ZV9ibG9jayhzdGF0ZSwgU0NVX1JBTV9QQVJBTV8wX19BIC0KKwkJCShwYXJhbWV0ZXJMZW4gLSAxKSwgY250LCBidWZmZXIpOworCS8qIFdhaXQgdW50aWwgU0NVIGhhcyBwcm9jZXNzZWQgY29tbWFuZCAqLworCWVuZCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKERSWEtfTUFYX1dBSVRUSU1FKTsKKwlkbyB7CisJCW1zbGVlcCgxKTsKKwkJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBTQ1VfUkFNX0NPTU1BTkRfX0EsICZjdXJDbWQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJfSB3aGlsZSAoIShjdXJDbWQgPT0gRFJYX1NDVV9SRUFEWSkgJiYgKHRpbWVfaXNfYWZ0ZXJfamlmZmllcyhlbmQpKSk7CisJaWYgKGN1ckNtZCAhPSBEUlhfU0NVX1JFQURZKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogU0NVIG5vdCByZWFkeVxuIik7CisJCXN0YXR1cyA9IC1FSU87CisJCWdvdG8gZXJyb3IyOworCX0KKwkvKiByZWFkIHJlc3VsdHMgKi8KKwlpZiAoKHJlc3VsdExlbiA+IDApICYmIChyZXN1bHQgIT0gTlVMTCkpIHsKKwkJczE2IGVycjsKKwkJaW50IGlpOworCisJCWZvciAoaWkgPSByZXN1bHRMZW4gLSAxOyBpaSA+PSAwOyBpaSAtPSAxKSB7CisJCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIFNDVV9SQU1fUEFSQU1fMF9fQSAtIGlpLCAmcmVzdWx0W2lpXSk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQl9CisKKwkJLyogQ2hlY2sgaWYgYW4gZXJyb3Igd2FzIHJlcG9ydGVkIGJ5IFNDVSAqLworCQllcnIgPSAoczE2KXJlc3VsdFswXTsKKwkJaWYgKGVyciA+PSAwKQorCQkJZ290byBlcnJvcjsKKworCQkvKiBjaGVjayBmb3IgdGhlIGtub3duIGVycm9yIGNvZGVzICovCisJCXN3aXRjaCAoZXJyKSB7CisJCWNhc2UgU0NVX1JFU1VMVF9VTktDTUQ6CisJCQlwID0gIlNDVV9SRVNVTFRfVU5LQ01EIjsKKwkJCWJyZWFrOworCQljYXNlIFNDVV9SRVNVTFRfVU5LU1REOgorCQkJcCA9ICJTQ1VfUkVTVUxUX1VOS1NURCI7CisJCQlicmVhazsKKwkJY2FzZSBTQ1VfUkVTVUxUX1NJWkU6CisJCQlwID0gIlNDVV9SRVNVTFRfU0laRSI7CisJCQlicmVhazsKKwkJY2FzZSBTQ1VfUkVTVUxUX0lOVlBBUjoKKwkJCXAgPSAiU0NVX1JFU1VMVF9JTlZQQVIiOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6IC8qIE90aGVyIG5lZ2F0aXZlIHZhbHVlcyBhcmUgZXJyb3JzICovCisJCQlzcHJpbnRmKGVycm5hbWUsICJFUlJPUjogJWRcbiIsIGVycik7CisJCQlwID0gZXJybmFtZTsKKwkJfQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6ICVzIHdoaWxlIHNlbmRpbmcgY21kIDB4JTA0eCB3aXRoIHBhcmFtczoiLCBwLCBjbWQpOworCQlwcmludF9oZXhfZHVtcF9ieXRlcygiZHJ4azogIiwgRFVNUF9QUkVGSVhfTk9ORSwgYnVmZmVyLCBjbnQpOworCQlzdGF0dXMgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yMjsKKwl9CisKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKK2Vycm9yMjoKKwltdXRleF91bmxvY2soJnN0YXRlLT5tdXRleCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBTZXRJcW1BZihzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIGJvb2wgYWN0aXZlKQoreworCXUxNiBkYXRhID0gMDsKKwlpbnQgc3RhdHVzOworCisJZHByaW50aygxLCAiXG4iKTsKKworCS8qIENvbmZpZ3VyZSBJUU0gKi8KKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIElRTV9BRl9TVERCWV9fQSwgJmRhdGEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJaWYgKCFhY3RpdmUpIHsKKwkJZGF0YSB8PSAoSVFNX0FGX1NUREJZX1NUREJZX0FEQ19TVEFOREJZCisJCQkJfCBJUU1fQUZfU1REQllfU1REQllfQU1QX1NUQU5EQlkKKwkJCQl8IElRTV9BRl9TVERCWV9TVERCWV9QRF9TVEFOREJZCisJCQkJfCBJUU1fQUZfU1REQllfU1REQllfVEFHQ19JRl9TVEFOREJZCisJCQkJfCBJUU1fQUZfU1REQllfU1REQllfVEFHQ19SRl9TVEFOREJZKTsKKwl9IGVsc2UgeworCQlkYXRhICY9ICgofklRTV9BRl9TVERCWV9TVERCWV9BRENfU1RBTkRCWSkKKwkJCQkmICh+SVFNX0FGX1NUREJZX1NUREJZX0FNUF9TVEFOREJZKQorCQkJCSYgKH5JUU1fQUZfU1REQllfU1REQllfUERfU1RBTkRCWSkKKwkJCQkmICh+SVFNX0FGX1NUREJZX1NUREJZX1RBR0NfSUZfU1RBTkRCWSkKKwkJCQkmICh+SVFNX0FGX1NUREJZX1NUREJZX1RBR0NfUkZfU1RBTkRCWSkKKwkJCSk7CisJfQorCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9BRl9TVERCWV9fQSwgZGF0YSk7CisKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IEN0cmxQb3dlck1vZGUoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCBlbnVtIERSWFBvd2VyTW9kZSAqbW9kZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwl1MTYgc2lvQ2NQd2RNb2RlID0gMDsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwkvKiBDaGVjayBhcmd1bWVudHMgKi8KKwlpZiAobW9kZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoKm1vZGUpIHsKKwljYXNlIERSWF9QT1dFUl9VUDoKKwkJc2lvQ2NQd2RNb2RlID0gU0lPX0NDX1BXRF9NT0RFX0xFVkVMX05PTkU7CisJCWJyZWFrOworCWNhc2UgRFJYS19QT1dFUl9ET1dOX09GRE06CisJCXNpb0NjUHdkTW9kZSA9IFNJT19DQ19QV0RfTU9ERV9MRVZFTF9PRkRNOworCQlicmVhazsKKwljYXNlIERSWEtfUE9XRVJfRE9XTl9DT1JFOgorCQlzaW9DY1B3ZE1vZGUgPSBTSU9fQ0NfUFdEX01PREVfTEVWRUxfQ0xPQ0s7CisJCWJyZWFrOworCWNhc2UgRFJYS19QT1dFUl9ET1dOX1BMTDoKKwkJc2lvQ2NQd2RNb2RlID0gU0lPX0NDX1BXRF9NT0RFX0xFVkVMX1BMTDsKKwkJYnJlYWs7CisJY2FzZSBEUlhfUE9XRVJfRE9XTjoKKwkJc2lvQ2NQd2RNb2RlID0gU0lPX0NDX1BXRF9NT0RFX0xFVkVMX09TQzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogVW5rbm93IHNsZWVwIG1vZGUgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogSWYgYWxyZWFkeSBpbiByZXF1ZXN0ZWQgcG93ZXIgbW9kZSwgZG8gbm90aGluZyAqLworCWlmIChzdGF0ZS0+bV9jdXJyZW50UG93ZXJNb2RlID09ICptb2RlKQorCQlyZXR1cm4gMDsKKworCS8qIEZvciBuZXh0IHN0ZXBzIG1ha2Ugc3VyZSB0byBzdGFydCBmcm9tIERSWF9QT1dFUl9VUCBtb2RlICovCisJaWYgKHN0YXRlLT5tX2N1cnJlbnRQb3dlck1vZGUgIT0gRFJYX1BPV0VSX1VQKSB7CisJCXN0YXR1cyA9IFBvd2VyVXBEZXZpY2Uoc3RhdGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IERWQlRFbmFibGVPRkRNVG9rZW5SaW5nKHN0YXRlLCB0cnVlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCX0KKworCWlmICgqbW9kZSA9PSBEUlhfUE9XRVJfVVApIHsKKwkJLyogUmVzdG9yZSBhbmFsb2cgJiBwaW4gY29uZmlndWFydGlvbiAqLworCX0gZWxzZSB7CisJCS8qIFBvd2VyIGRvd24gdG8gcmVxdWVzdGVkIG1vZGUgKi8KKwkJLyogQmFja3VwIHNvbWUgcmVnaXN0ZXIgc2V0dGluZ3MgKi8KKwkJLyogU2V0IHBpbnMgd2l0aCBwb3NzaWJsZSBwdWxsLXVwcyBjb25uZWN0ZWQKKwkJICAgdG8gdGhlbSBpbiBpbnB1dCBtb2RlICovCisJCS8qIEFuYWxvZyBwb3dlciBkb3duICovCisJCS8qIEFEQyBwb3dlciBkb3duICovCisJCS8qIFBvd2VyIGRvd24gZGV2aWNlICovCisJCS8qIHN0b3AgYWxsIGNvbW1fZXhlYyAqLworCQkvKiBTdG9wIGFuZCBwb3dlciBkb3duIHByZXZpb3VzIHN0YW5kYXJkICovCisJCXN3aXRjaCAoc3RhdGUtPm1fT3BlcmF0aW9uTW9kZSkgeworCQljYXNlIE9NX0RWQlQ6CisJCQlzdGF0dXMgPSBNUEVHVFNTdG9wKHN0YXRlKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCQlzdGF0dXMgPSBQb3dlckRvd25EVkJUKHN0YXRlLCBmYWxzZSk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQkJYnJlYWs7CisJCWNhc2UgT01fUUFNX0lUVV9BOgorCQljYXNlIE9NX1FBTV9JVFVfQzoKKwkJCXN0YXR1cyA9IE1QRUdUU1N0b3Aoc3RhdGUpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJCXN0YXR1cyA9IFBvd2VyRG93blFBTShzdGF0ZSk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQlzdGF0dXMgPSBEVkJURW5hYmxlT0ZETVRva2VuUmluZyhzdGF0ZSwgZmFsc2UpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19DQ19QV0RfTU9ERV9fQSwgc2lvQ2NQd2RNb2RlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fQ0NfVVBEQVRFX19BLCBTSU9fQ0NfVVBEQVRFX0tFWSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQlpZiAoKm1vZGUgIT0gRFJYS19QT1dFUl9ET1dOX09GRE0pIHsKKwkJCXN0YXRlLT5tX0hJQ2ZnQ3RybCB8PQorCQkJCVNJT19ISV9SQV9SQU1fUEFSXzVfQ0ZHX1NMRUVQX1paWjsKKwkJCXN0YXR1cyA9IEhJX0NmZ0NvbW1hbmQoc3RhdGUpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKwlzdGF0ZS0+bV9jdXJyZW50UG93ZXJNb2RlID0gKm1vZGU7CisKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgUG93ZXJEb3duRFZCVChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIGJvb2wgc2V0UG93ZXJNb2RlKQoreworCWVudW0gRFJYUG93ZXJNb2RlIHBvd2VyTW9kZSA9IERSWEtfUE9XRVJfRE9XTl9PRkRNOworCXUxNiBjbWRSZXN1bHQgPSAwOworCXUxNiBkYXRhID0gMDsKKwlpbnQgc3RhdHVzOworCisJZHByaW50aygxLCAiXG4iKTsKKworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgU0NVX0NPTU1fRVhFQ19fQSwgJmRhdGEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCWlmIChkYXRhID09IFNDVV9DT01NX0VYRUNfQUNUSVZFKSB7CisJCS8qIFNlbmQgT0ZETSBzdG9wIGNvbW1hbmQgKi8KKwkJc3RhdHVzID0gc2N1X2NvbW1hbmQoc3RhdGUsIFNDVV9SQU1fQ09NTUFORF9TVEFOREFSRF9PRkRNIHwgU0NVX1JBTV9DT01NQU5EX0NNRF9ERU1PRF9TVE9QLCAwLCBOVUxMLCAxLCAmY21kUmVzdWx0KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQkvKiBTZW5kIE9GRE0gcmVzZXQgY29tbWFuZCAqLworCQlzdGF0dXMgPSBzY3VfY29tbWFuZChzdGF0ZSwgU0NVX1JBTV9DT01NQU5EX1NUQU5EQVJEX09GRE0gfCBTQ1VfUkFNX0NPTU1BTkRfQ01EX0RFTU9EX1JFU0VULCAwLCBOVUxMLCAxLCAmY21kUmVzdWx0KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCX0KKworCS8qIFJlc2V0IGRhdGFwYXRoIGZvciBPRkRNLCBwcm9jZXNzb3JzIGZpcnN0ICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgT0ZETV9TQ19DT01NX0VYRUNfX0EsIE9GRE1fU0NfQ09NTV9FWEVDX1NUT1ApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fTENfQ09NTV9FWEVDX19BLCBPRkRNX0xDX0NPTU1fRVhFQ19TVE9QKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQ09NTV9FWEVDX19BLCBJUU1fQ09NTV9FWEVDX0JfU1RPUCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBwb3dlcmRvd24gQUZFICAgICAgICAgICAgICAgICAgICovCisJc3RhdHVzID0gU2V0SXFtQWYoc3RhdGUsIGZhbHNlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIHBvd2VyZG93biB0byBPRkRNIG1vZGUgICAgICAgICAgKi8KKwlpZiAoc2V0UG93ZXJNb2RlKSB7CisJCXN0YXR1cyA9IEN0cmxQb3dlck1vZGUoc3RhdGUsICZwb3dlck1vZGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJfQorZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgU2V0T3BlcmF0aW9uTW9kZShzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsCisJCQkgICAgZW51bSBPcGVyYXRpb25Nb2RlIG9Nb2RlKQoreworCWludCBzdGF0dXMgPSAwOworCisJZHByaW50aygxLCAiXG4iKTsKKwkvKgorCSAgIFN0b3AgYW5kIHBvd2VyIGRvd24gcHJldmlvdXMgc3RhbmRhcmQKKwkgICBUT0RPIGludmVzdGlnYXRlIHRvdGFsIHBvd2VyIGRvd24gaW5zdGVhZCBvZiBwYXJ0aWFsCisJICAgcG93ZXIgZG93biBkZXBlbmRpbmcgb24gInByZXZpb3VzIiBzdGFuZGFyZC4KKwkgKi8KKworCS8qIGRpc2FibGUgSFcgbG9jayBpbmRpY2F0b3IgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0dQSU9fX0EsIFNDVV9SQU1fR1BJT19IV19MT0NLX0lORF9ESVNBQkxFKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIERldmljZSBpcyBhbHJlYWR5IGF0IHRoZSByZXF1aXJlZCBtb2RlICovCisJaWYgKHN0YXRlLT5tX09wZXJhdGlvbk1vZGUgPT0gb01vZGUpCisJCXJldHVybiAwOworCisJc3dpdGNoIChzdGF0ZS0+bV9PcGVyYXRpb25Nb2RlKSB7CisJCS8qIE9NX05PTkUgd2FzIGFkZGVkIGZvciBzdGFydCB1cCAqLworCWNhc2UgT01fTk9ORToKKwkJYnJlYWs7CisJY2FzZSBPTV9EVkJUOgorCQlzdGF0dXMgPSBNUEVHVFNTdG9wKHN0YXRlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSBQb3dlckRvd25EVkJUKHN0YXRlLCB0cnVlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0ZS0+bV9PcGVyYXRpb25Nb2RlID0gT01fTk9ORTsKKwkJYnJlYWs7CisJY2FzZSBPTV9RQU1fSVRVX0E6CS8qIGZhbGx0aHJvdWdoICovCisJY2FzZSBPTV9RQU1fSVRVX0M6CisJCXN0YXR1cyA9IE1QRUdUU1N0b3Aoc3RhdGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IFBvd2VyRG93blFBTShzdGF0ZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdGUtPm1fT3BlcmF0aW9uTW9kZSA9IE9NX05PTkU7CisJCWJyZWFrOworCWNhc2UgT01fUUFNX0lUVV9COgorCWRlZmF1bHQ6CisJCXN0YXR1cyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3I7CisJfQorCisJLyoKKwkJUG93ZXIgdXAgbmV3IHN0YW5kYXJkCisJCSovCisJc3dpdGNoIChvTW9kZSkgeworCWNhc2UgT01fRFZCVDoKKwkJc3RhdGUtPm1fT3BlcmF0aW9uTW9kZSA9IG9Nb2RlOworCQlzdGF0dXMgPSBTZXREVkJUU3RhbmRhcmQoc3RhdGUsIG9Nb2RlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlicmVhazsKKwljYXNlIE9NX1FBTV9JVFVfQToJLyogZmFsbHRocm91Z2ggKi8KKwljYXNlIE9NX1FBTV9JVFVfQzoKKwkJc3RhdGUtPm1fT3BlcmF0aW9uTW9kZSA9IG9Nb2RlOworCQlzdGF0dXMgPSBTZXRRQU1TdGFuZGFyZChzdGF0ZSwgb01vZGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWJyZWFrOworCWNhc2UgT01fUUFNX0lUVV9COgorCWRlZmF1bHQ6CisJCXN0YXR1cyA9IC1FSU5WQUw7CisJfQorZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgU3RhcnQoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCBzMzIgb2Zmc2V0RnJlcSwKKwkJIHMzMiBJbnRlcm1lZGlhdGVGcmVxdWVuY3kpCit7CisJaW50IHN0YXR1cyA9IC1FSU5WQUw7CisKKwl1MTYgSUZyZXFrSHo7CisJczMyIE9mZnNldGtIeiA9IG9mZnNldEZyZXEgLyAxMDAwOworCisJZHByaW50aygxLCAiXG4iKTsKKwlpZiAoc3RhdGUtPm1fRHJ4a1N0YXRlICE9IERSWEtfU1RPUFBFRCAmJgorCQlzdGF0ZS0+bV9EcnhrU3RhdGUgIT0gRFJYS19EVFZfU1RBUlRFRCkKKwkJZ290byBlcnJvcjsKKworCXN0YXRlLT5tX2JNaXJyb3JGcmVxU3BlY3QgPSAoc3RhdGUtPnBhcmFtLmludmVyc2lvbiA9PSBJTlZFUlNJT05fT04pOworCisJaWYgKEludGVybWVkaWF0ZUZyZXF1ZW5jeSA8IDApIHsKKwkJc3RhdGUtPm1fYk1pcnJvckZyZXFTcGVjdCA9ICFzdGF0ZS0+bV9iTWlycm9yRnJlcVNwZWN0OworCQlJbnRlcm1lZGlhdGVGcmVxdWVuY3kgPSAtSW50ZXJtZWRpYXRlRnJlcXVlbmN5OworCX0KKworCXN3aXRjaCAoc3RhdGUtPm1fT3BlcmF0aW9uTW9kZSkgeworCWNhc2UgT01fUUFNX0lUVV9BOgorCWNhc2UgT01fUUFNX0lUVV9DOgorCQlJRnJlcWtIeiA9IChJbnRlcm1lZGlhdGVGcmVxdWVuY3kgLyAxMDAwKTsKKwkJc3RhdHVzID0gU2V0UUFNKHN0YXRlLCBJRnJlcWtIeiwgT2Zmc2V0a0h6KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0ZS0+bV9EcnhrU3RhdGUgPSBEUlhLX0RUVl9TVEFSVEVEOworCQlicmVhazsKKwljYXNlIE9NX0RWQlQ6CisJCUlGcmVxa0h6ID0gKEludGVybWVkaWF0ZUZyZXF1ZW5jeSAvIDEwMDApOworCQlzdGF0dXMgPSBNUEVHVFNTdG9wKHN0YXRlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSBTZXREVkJUKHN0YXRlLCBJRnJlcWtIeiwgT2Zmc2V0a0h6KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSBEVkJUU3RhcnQoc3RhdGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXRlLT5tX0RyeGtTdGF0ZSA9IERSWEtfRFRWX1NUQVJURUQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IFNodXREb3duKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwlkcHJpbnRrKDEsICJcbiIpOworCisJTVBFR1RTU3RvcChzdGF0ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgR2V0TG9ja1N0YXR1cyhzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIHUzMiAqcExvY2tTdGF0dXMsCisJCQkgdTMyIFRpbWUpCit7CisJaW50IHN0YXR1cyA9IC1FSU5WQUw7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJaWYgKHBMb2NrU3RhdHVzID09IE5VTEwpCisJCWdvdG8gZXJyb3I7CisKKwkqcExvY2tTdGF0dXMgPSBOT1RfTE9DS0VEOworCisJLyogZGVmaW5lIHRoZSBTQ1UgY29tbWFuZCBjb2RlICovCisJc3dpdGNoIChzdGF0ZS0+bV9PcGVyYXRpb25Nb2RlKSB7CisJY2FzZSBPTV9RQU1fSVRVX0E6CisJY2FzZSBPTV9RQU1fSVRVX0I6CisJY2FzZSBPTV9RQU1fSVRVX0M6CisJCXN0YXR1cyA9IEdldFFBTUxvY2tTdGF0dXMoc3RhdGUsIHBMb2NrU3RhdHVzKTsKKwkJYnJlYWs7CisJY2FzZSBPTV9EVkJUOgorCQlzdGF0dXMgPSBHZXREVkJUTG9ja1N0YXR1cyhzdGF0ZSwgcExvY2tTdGF0dXMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBNUEVHVFNTdGFydChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUpCit7CisJaW50IHN0YXR1czsKKworCXUxNiBmZWNPY1NuY01vZGUgPSAwOworCisJLyogQWxsb3cgT0MgdG8gc3luYyBhZ2FpbiAqLworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgRkVDX09DX1NOQ19NT0RFX19BLCAmZmVjT2NTbmNNb2RlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlmZWNPY1NuY01vZGUgJj0gfkZFQ19PQ19TTkNfTU9ERV9TSFVURE9XTl9fTTsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfT0NfU05DX01PREVfX0EsIGZlY09jU25jTW9kZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX09DX1NOQ19VTkxPQ0tfX0EsIDEpOworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgTVBFR1RTRHRvSW5pdChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUpCit7CisJaW50IHN0YXR1czsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwkvKiBSYXRlIGludGVncmF0aW9uIHNldHRpbmdzICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX09DX1JDTl9DVExfU1RFUF9MT19fQSwgMHgwMDAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfT0NfUkNOX0NUTF9TVEVQX0hJX19BLCAweDAwMEMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19PQ19SQ05fR0FJTl9fQSwgMHgwMDBBKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfT0NfQVZSX1BBUk1fQV9fQSwgMHgwMDA4KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfT0NfQVZSX1BBUk1fQl9fQSwgMHgwMDA2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfT0NfVE1EX0hJX01BUkdJTl9fQSwgMHgwNjgwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfT0NfVE1EX0xPX01BUkdJTl9fQSwgMHgwMDgwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfT0NfVE1EX0NPVU5UX19BLCAweDAzRjQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogQWRkaXRpb25hbCBjb25maWd1cmF0aW9uICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX09DX09DUl9JTlZFUlRfX0EsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19PQ19TTkNfTFdNX19BLCAyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfT0NfU05DX0hXTV9fQSwgMTIpOworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBNUEVHVFNEdG9TZXR1cChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsCisJCQkgIGVudW0gT3BlcmF0aW9uTW9kZSBvTW9kZSkKK3sKKwlpbnQgc3RhdHVzOworCisJdTE2IGZlY09jUmVnTW9kZSA9IDA7CS8qIEZFQ19PQ19NT0RFICAgICAgIHJlZ2lzdGVyIHZhbHVlICovCisJdTE2IGZlY09jUmVnSXByTW9kZSA9IDA7CS8qIEZFQ19PQ19JUFJfTU9ERSAgIHJlZ2lzdGVyIHZhbHVlICovCisJdTE2IGZlY09jRHRvTW9kZSA9IDA7CS8qIEZFQ19PQ19JUFJfSU5WRVJUIHJlZ2lzdGVyIHZhbHVlICovCisJdTE2IGZlY09jRmN0TW9kZSA9IDA7CS8qIEZFQ19PQ19JUFJfSU5WRVJUIHJlZ2lzdGVyIHZhbHVlICovCisJdTE2IGZlY09jRHRvUGVyaW9kID0gMjsJLyogRkVDX09DX0lQUl9JTlZFUlQgcmVnaXN0ZXIgdmFsdWUgKi8KKwl1MTYgZmVjT2NEdG9CdXJzdExlbiA9IDE4ODsJLyogRkVDX09DX0lQUl9JTlZFUlQgcmVnaXN0ZXIgdmFsdWUgKi8KKwl1MzIgZmVjT2NSY25DdGxSYXRlID0gMDsJLyogRkVDX09DX0lQUl9JTlZFUlQgcmVnaXN0ZXIgdmFsdWUgKi8KKwl1MTYgZmVjT2NUbWRNb2RlID0gMDsKKwl1MTYgZmVjT2NUbWRJbnRVcGRSYXRlID0gMDsKKwl1MzIgbWF4Qml0UmF0ZSA9IDA7CisJYm9vbCBzdGF0aWNDTEsgPSBmYWxzZTsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwkvKiBDaGVjayBpbnNlcnRpb24gb2YgdGhlIFJlZWQtU29sb21vbiBwYXJpdHkgYnl0ZXMgKi8KKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIEZFQ19PQ19NT0RFX19BLCAmZmVjT2NSZWdNb2RlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIEZFQ19PQ19JUFJfTU9ERV9fQSwgJmZlY09jUmVnSXByTW9kZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJZmVjT2NSZWdNb2RlICY9ICh+RkVDX09DX01PREVfUEFSSVRZX19NKTsKKwlmZWNPY1JlZ0lwck1vZGUgJj0gKH5GRUNfT0NfSVBSX01PREVfTVZBTF9ESVNfUEFSX19NKTsKKwlpZiAoc3RhdGUtPm1faW5zZXJ0UlNCeXRlID09IHRydWUpIHsKKwkJLyogZW5hYmxlIHBhcml0eSBzeW1ib2wgZm9yd2FyZCAqLworCQlmZWNPY1JlZ01vZGUgfD0gRkVDX09DX01PREVfUEFSSVRZX19NOworCQkvKiBNVkFMIGRpc2FibGUgZHVyaW5nIHBhcml0eSBieXRlcyAqLworCQlmZWNPY1JlZ0lwck1vZGUgfD0gRkVDX09DX0lQUl9NT0RFX01WQUxfRElTX1BBUl9fTTsKKwkJLyogVFMgYnVyc3QgbGVuZ3RoIHRvIDIwNCAqLworCQlmZWNPY0R0b0J1cnN0TGVuID0gMjA0OworCX0KKworCS8qIENoZWNrIHNlcmlhbCBvciBwYXJyYWxsZWwgb3V0cHV0ICovCisJZmVjT2NSZWdJcHJNb2RlICY9ICh+KEZFQ19PQ19JUFJfTU9ERV9TRVJJQUxfX00pKTsKKwlpZiAoc3RhdGUtPm1fZW5hYmxlUGFyYWxsZWwgPT0gZmFsc2UpIHsKKwkJLyogTVBFRyBkYXRhIG91dHB1dCBpcyBzZXJpYWwgLT4gc2V0IGlwcl9tb2RlWzBdICovCisJCWZlY09jUmVnSXByTW9kZSB8PSBGRUNfT0NfSVBSX01PREVfU0VSSUFMX19NOworCX0KKworCXN3aXRjaCAob01vZGUpIHsKKwljYXNlIE9NX0RWQlQ6CisJCW1heEJpdFJhdGUgPSBzdGF0ZS0+bV9EVkJUQml0cmF0ZTsKKwkJZmVjT2NUbWRNb2RlID0gMzsKKwkJZmVjT2NSY25DdGxSYXRlID0gMHhDMDAwMDA7CisJCXN0YXRpY0NMSyA9IHN0YXRlLT5tX0RWQlRTdGF0aWNDTEs7CisJCWJyZWFrOworCWNhc2UgT01fUUFNX0lUVV9BOgkvKiBmYWxsdGhyb3VnaCAqLworCWNhc2UgT01fUUFNX0lUVV9DOgorCQlmZWNPY1RtZE1vZGUgPSAweDAwMDQ7CisJCWZlY09jUmNuQ3RsUmF0ZSA9IDB4RDJCNEVFOwkvKiBnb29kIGZvciA+NjMgTWIvcyAqLworCQltYXhCaXRSYXRlID0gc3RhdGUtPm1fRFZCQ0JpdHJhdGU7CisJCXN0YXRpY0NMSyA9IHN0YXRlLT5tX0RWQkNTdGF0aWNDTEs7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN0YXR1cyA9IC1FSU5WQUw7CisJfQkJLyogc3dpdGNoIChzdGFuZGFyZCkgKi8KKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIENvbmZpZ3VyZSBEVE8ncyAqLworCWlmIChzdGF0aWNDTEspIHsKKwkJdTMyIGJpdFJhdGUgPSAwOworCisJCS8qIFJhdGlvbmFsIERUTyBmb3IgTUNMSyBzb3VyY2UgKHN0YXRpYyBNQ0xLIHJhdGUpLAorCQkJRHluYW1pYyBEVE8gZm9yIG9wdGltYWwgZ3JvdXBpbmcKKwkJCShhdm9pZCBpbnRyYS1wYWNrZXQgZ2FwcyksCisJCQlEVE8gb2Zmc2V0IGVuYWJsZSB0byBzeW5jIFRTIGJ1cnN0IHdpdGggTVNUUlQgKi8KKwkJZmVjT2NEdG9Nb2RlID0gKEZFQ19PQ19EVE9fTU9ERV9EWU5BTUlDX19NIHwKKwkJCQlGRUNfT0NfRFRPX01PREVfT0ZGU0VUX0VOQUJMRV9fTSk7CisJCWZlY09jRmN0TW9kZSA9IChGRUNfT0NfRkNUX01PREVfUkFUX0VOQV9fTSB8CisJCQkJRkVDX09DX0ZDVF9NT0RFX1ZJUlRfRU5BX19NKTsKKworCQkvKiBDaGVjayB1c2VyIGRlZmluZWQgYml0cmF0ZSAqLworCQliaXRSYXRlID0gbWF4Qml0UmF0ZTsKKwkJaWYgKGJpdFJhdGUgPiA3NTkwMDAwMFVMKSB7CS8qIG1heCBpcyA3NS45IE1iL3MgKi8KKwkJCWJpdFJhdGUgPSA3NTkwMDAwMFVMOworCQl9CisJCS8qIFJhdGlvbmFsIERUTyBwZXJpb2Q6CisJCQlkdG9fcGVyaW9kID0gKEZzeXMgLyBiaXRyYXRlKSAtIDIKKworCQkJUmVzdWx0IHNob3VsZCBiZSBmbG9vcmVkLAorCQkJdG8gbWFrZSBzdXJlID49IHJlcXVlc3RlZCBiaXRyYXRlCisJCQkqLworCQlmZWNPY0R0b1BlcmlvZCA9ICh1MTYpICgoKHN0YXRlLT5tX3N5c0Nsb2NrRnJlcSkKKwkJCQkJCSogMTAwMCkgLyBiaXRSYXRlKTsKKwkJaWYgKGZlY09jRHRvUGVyaW9kIDw9IDIpCisJCQlmZWNPY0R0b1BlcmlvZCA9IDA7CisJCWVsc2UKKwkJCWZlY09jRHRvUGVyaW9kIC09IDI7CisJCWZlY09jVG1kSW50VXBkUmF0ZSA9IDg7CisJfSBlbHNlIHsKKwkJLyogKGNvbW1vbkF0dHItPnN0YXRpY0NMSyA9PSBmYWxzZSkgPT4gZHluYW1pYyBtb2RlICovCisJCWZlY09jRHRvTW9kZSA9IEZFQ19PQ19EVE9fTU9ERV9EWU5BTUlDX19NOworCQlmZWNPY0ZjdE1vZGUgPSBGRUNfT0NfRkNUX01PREVfX1BSRTsKKwkJZmVjT2NUbWRJbnRVcGRSYXRlID0gNTsKKwl9CisKKwkvKiBXcml0ZSBhcHByb3ByaWF0ZSByZWdpc3RlcnMgd2l0aCByZXF1ZXN0ZWQgY29uZmlndXJhdGlvbiAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19PQ19EVE9fQlVSU1RfTEVOX19BLCBmZWNPY0R0b0J1cnN0TGVuKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfT0NfRFRPX1BFUklPRF9fQSwgZmVjT2NEdG9QZXJpb2QpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19PQ19EVE9fTU9ERV9fQSwgZmVjT2NEdG9Nb2RlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfT0NfRkNUX01PREVfX0EsIGZlY09jRmN0TW9kZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX09DX01PREVfX0EsIGZlY09jUmVnTW9kZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX09DX0lQUl9NT0RFX19BLCBmZWNPY1JlZ0lwck1vZGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogUmF0ZSBpbnRlZ3JhdGlvbiBzZXR0aW5ncyAqLworCXN0YXR1cyA9IHdyaXRlMzIoc3RhdGUsIEZFQ19PQ19SQ05fQ1RMX1JBVEVfTE9fX0EsIGZlY09jUmNuQ3RsUmF0ZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX09DX1RNRF9JTlRfVVBEX1JBVEVfX0EsIGZlY09jVG1kSW50VXBkUmF0ZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX09DX1RNRF9NT0RFX19BLCBmZWNPY1RtZE1vZGUpOworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgTVBFR1RTQ29uZmlndXJlUG9sYXJpdHkoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCXUxNiBmZWNPY1JlZ0lwckludmVydCA9IDA7CisKKwkvKiBEYXRhIG1hc2sgZm9yIHRoZSBvdXRwdXQgZGF0YSBieXRlICovCisJdTE2IEludmVydERhdGFNYXNrID0KKwkgICAgRkVDX09DX0lQUl9JTlZFUlRfTUQ3X19NIHwgRkVDX09DX0lQUl9JTlZFUlRfTUQ2X19NIHwKKwkgICAgRkVDX09DX0lQUl9JTlZFUlRfTUQ1X19NIHwgRkVDX09DX0lQUl9JTlZFUlRfTUQ0X19NIHwKKwkgICAgRkVDX09DX0lQUl9JTlZFUlRfTUQzX19NIHwgRkVDX09DX0lQUl9JTlZFUlRfTUQyX19NIHwKKwkgICAgRkVDX09DX0lQUl9JTlZFUlRfTUQxX19NIHwgRkVDX09DX0lQUl9JTlZFUlRfTUQwX19NOworCisJZHByaW50aygxLCAiXG4iKTsKKworCS8qIENvbnRyb2wgc2VsZWN0aXZlIGludmVyc2lvbiBvZiBvdXRwdXQgYml0cyAqLworCWZlY09jUmVnSXBySW52ZXJ0ICY9ICh+KEludmVydERhdGFNYXNrKSk7CisJaWYgKHN0YXRlLT5tX2ludmVydERBVEEgPT0gdHJ1ZSkKKwkJZmVjT2NSZWdJcHJJbnZlcnQgfD0gSW52ZXJ0RGF0YU1hc2s7CisJZmVjT2NSZWdJcHJJbnZlcnQgJj0gKH4oRkVDX09DX0lQUl9JTlZFUlRfTUVSUl9fTSkpOworCWlmIChzdGF0ZS0+bV9pbnZlcnRFUlIgPT0gdHJ1ZSkKKwkJZmVjT2NSZWdJcHJJbnZlcnQgfD0gRkVDX09DX0lQUl9JTlZFUlRfTUVSUl9fTTsKKwlmZWNPY1JlZ0lwckludmVydCAmPSAofihGRUNfT0NfSVBSX0lOVkVSVF9NU1RSVF9fTSkpOworCWlmIChzdGF0ZS0+bV9pbnZlcnRTVFIgPT0gdHJ1ZSkKKwkJZmVjT2NSZWdJcHJJbnZlcnQgfD0gRkVDX09DX0lQUl9JTlZFUlRfTVNUUlRfX007CisJZmVjT2NSZWdJcHJJbnZlcnQgJj0gKH4oRkVDX09DX0lQUl9JTlZFUlRfTVZBTF9fTSkpOworCWlmIChzdGF0ZS0+bV9pbnZlcnRWQUwgPT0gdHJ1ZSkKKwkJZmVjT2NSZWdJcHJJbnZlcnQgfD0gRkVDX09DX0lQUl9JTlZFUlRfTVZBTF9fTTsKKwlmZWNPY1JlZ0lwckludmVydCAmPSAofihGRUNfT0NfSVBSX0lOVkVSVF9NQ0xLX19NKSk7CisJaWYgKHN0YXRlLT5tX2ludmVydENMSyA9PSB0cnVlKQorCQlmZWNPY1JlZ0lwckludmVydCB8PSBGRUNfT0NfSVBSX0lOVkVSVF9NQ0xLX19NOworCisJcmV0dXJuIHdyaXRlMTYoc3RhdGUsIEZFQ19PQ19JUFJfSU5WRVJUX19BLCBmZWNPY1JlZ0lwckludmVydCk7Cit9CisKKyNkZWZpbmUgICBTQ1VfUkFNX0FHQ19LSV9JTlZfUkZfUE9MX19NIDB4NDAwMAorCitzdGF0aWMgaW50IFNldEFnY1JmKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwKKwkJICAgIHN0cnVjdCBTQ2ZnQWdjICpwQWdjQ2ZnLCBib29sIGlzRFRWKQoreworCWludCBzdGF0dXMgPSAtRUlOVkFMOworCXUxNiBkYXRhID0gMDsKKwlzdHJ1Y3QgU0NmZ0FnYyAqcElmQWdjU2V0dGluZ3M7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJaWYgKHBBZ2NDZmcgPT0gTlVMTCkKKwkJZ290byBlcnJvcjsKKworCXN3aXRjaCAocEFnY0NmZy0+Y3RybE1vZGUpIHsKKwljYXNlIERSWEtfQUdDX0NUUkxfQVVUTzoKKwkJLyogRW5hYmxlIFJGIEFHQyBEQUMgKi8KKwkJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBJUU1fQUZfU1REQllfX0EsICZkYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlkYXRhICY9IH5JUU1fQUZfU1REQllfU1REQllfVEFHQ19SRl9TVEFOREJZOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQUZfU1REQllfX0EsIGRhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgU0NVX1JBTV9BR0NfQ09ORklHX19BLCAmZGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQkvKiBFbmFibGUgU0NVIFJGIEFHQyBsb29wICovCisJCWRhdGEgJj0gflNDVV9SQU1fQUdDX0NPTkZJR19ESVNBQkxFX1JGX0FHQ19fTTsKKworCQkvKiBQb2xhcml0eSAqLworCQlpZiAoc3RhdGUtPm1fUmZBZ2NQb2wpCisJCQlkYXRhIHw9IFNDVV9SQU1fQUdDX0NPTkZJR19JTlZfUkZfUE9MX19NOworCQllbHNlCisJCQlkYXRhICY9IH5TQ1VfUkFNX0FHQ19DT05GSUdfSU5WX1JGX1BPTF9fTTsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfQ09ORklHX19BLCBkYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCisJCS8qIFNldCBzcGVlZCAodXNpbmcgY29tcGxlbWVudGFyeSByZWR1Y3Rpb24gdmFsdWUpICovCisJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgU0NVX1JBTV9BR0NfS0lfUkVEX19BLCAmZGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQlkYXRhICY9IH5TQ1VfUkFNX0FHQ19LSV9SRURfUkFHQ19SRURfX007CisJCWRhdGEgfD0gKH4ocEFnY0NmZy0+c3BlZWQgPDwKKwkJCQlTQ1VfUkFNX0FHQ19LSV9SRURfUkFHQ19SRURfX0IpCisJCQkJJiBTQ1VfUkFNX0FHQ19LSV9SRURfUkFHQ19SRURfX00pOworCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0tJX1JFRF9fQSwgZGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQlpZiAoSXNEVkJUKHN0YXRlKSkKKwkJCXBJZkFnY1NldHRpbmdzID0gJnN0YXRlLT5tX2R2YnRJZkFnY0NmZzsKKwkJZWxzZSBpZiAoSXNRQU0oc3RhdGUpKQorCQkJcElmQWdjU2V0dGluZ3MgPSAmc3RhdGUtPm1fcWFtSWZBZ2NDZmc7CisJCWVsc2UKKwkJCXBJZkFnY1NldHRpbmdzID0gJnN0YXRlLT5tX2F0dklmQWdjQ2ZnOworCQlpZiAocElmQWdjU2V0dGluZ3MgPT0gTlVMTCkgeworCQkJc3RhdHVzID0gLUVJTlZBTDsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQkvKiBTZXQgVE9QLCBvbmx5IGlmIElGLUFHQyBpcyBpbiBBVVRPIG1vZGUgKi8KKwkJaWYgKHBJZkFnY1NldHRpbmdzLT5jdHJsTW9kZSA9PSBEUlhLX0FHQ19DVFJMX0FVVE8pCisJCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19JRl9JQUNDVV9ISV9UR1RfTUFYX19BLCBwQWdjQ2ZnLT50b3ApOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKworCQkvKiBDdXQtT2ZmIGN1cnJlbnQgKi8KKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfUkZfSUFDQ1VfSElfQ09fX0EsIHBBZ2NDZmctPmN1dE9mZkN1cnJlbnQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJLyogTWF4LiBvdXRwdXQgbGV2ZWwgKi8KKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfUkZfTUFYX19BLCBwQWdjQ2ZnLT5tYXhPdXRwdXRMZXZlbCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQlicmVhazsKKworCWNhc2UgRFJYS19BR0NfQ1RSTF9VU0VSOgorCQkvKiBFbmFibGUgUkYgQUdDIERBQyAqLworCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIElRTV9BRl9TVERCWV9fQSwgJmRhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWRhdGEgJj0gfklRTV9BRl9TVERCWV9TVERCWV9UQUdDX1JGX1NUQU5EQlk7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9BRl9TVERCWV9fQSwgZGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQkvKiBEaXNhYmxlIFNDVSBSRiBBR0MgbG9vcCAqLworCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0NPTkZJR19fQSwgJmRhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWRhdGEgfD0gU0NVX1JBTV9BR0NfQ09ORklHX0RJU0FCTEVfUkZfQUdDX19NOworCQlpZiAoc3RhdGUtPm1fUmZBZ2NQb2wpCisJCQlkYXRhIHw9IFNDVV9SQU1fQUdDX0NPTkZJR19JTlZfUkZfUE9MX19NOworCQllbHNlCisJCQlkYXRhICY9IH5TQ1VfUkFNX0FHQ19DT05GSUdfSU5WX1JGX1BPTF9fTTsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfQ09ORklHX19BLCBkYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCisJCS8qIFNDVSBjLm8uYy4gdG8gMCwgZW5hYmxpbmcgZnVsbCBjb250cm9sIHJhbmdlICovCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX1JGX0lBQ0NVX0hJX0NPX19BLCAwKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCisJCS8qIFdyaXRlIHZhbHVlIHRvIG91dHB1dCBwaW4gKi8KKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfUkZfSUFDQ1VfSElfX0EsIHBBZ2NDZmctPm91dHB1dExldmVsKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlicmVhazsKKworCWNhc2UgRFJYS19BR0NfQ1RSTF9PRkY6CisJCS8qIERpc2FibGUgUkYgQUdDIERBQyAqLworCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIElRTV9BRl9TVERCWV9fQSwgJmRhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWRhdGEgfD0gSVFNX0FGX1NUREJZX1NUREJZX1RBR0NfUkZfU1RBTkRCWTsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0FGX1NUREJZX19BLCBkYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCisJCS8qIERpc2FibGUgU0NVIFJGIEFHQyBsb29wICovCisJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgU0NVX1JBTV9BR0NfQ09ORklHX19BLCAmZGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJZGF0YSB8PSBTQ1VfUkFNX0FHQ19DT05GSUdfRElTQUJMRV9SRl9BR0NfX007CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0NPTkZJR19fQSwgZGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzdGF0dXMgPSAtRUlOVkFMOworCisJfQorZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKKyNkZWZpbmUgU0NVX1JBTV9BR0NfS0lfSU5WX0lGX1BPTF9fTSAweDIwMDAKKworc3RhdGljIGludCBTZXRBZ2NJZihzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsCisJCSAgICBzdHJ1Y3QgU0NmZ0FnYyAqcEFnY0NmZywgYm9vbCBpc0RUVikKK3sKKwl1MTYgZGF0YSA9IDA7CisJaW50IHN0YXR1cyA9IDA7CisJc3RydWN0IFNDZmdBZ2MgKnBSZkFnY1NldHRpbmdzOworCisJZHByaW50aygxLCAiXG4iKTsKKworCXN3aXRjaCAocEFnY0NmZy0+Y3RybE1vZGUpIHsKKwljYXNlIERSWEtfQUdDX0NUUkxfQVVUTzoKKworCQkvKiBFbmFibGUgSUYgQUdDIERBQyAqLworCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIElRTV9BRl9TVERCWV9fQSwgJmRhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWRhdGEgJj0gfklRTV9BRl9TVERCWV9TVERCWV9UQUdDX0lGX1NUQU5EQlk7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9BRl9TVERCWV9fQSwgZGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0NPTkZJR19fQSwgJmRhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJLyogRW5hYmxlIFNDVSBJRiBBR0MgbG9vcCAqLworCQlkYXRhICY9IH5TQ1VfUkFNX0FHQ19DT05GSUdfRElTQUJMRV9JRl9BR0NfX007CisKKwkJLyogUG9sYXJpdHkgKi8KKwkJaWYgKHN0YXRlLT5tX0lmQWdjUG9sKQorCQkJZGF0YSB8PSBTQ1VfUkFNX0FHQ19DT05GSUdfSU5WX0lGX1BPTF9fTTsKKwkJZWxzZQorCQkJZGF0YSAmPSB+U0NVX1JBTV9BR0NfQ09ORklHX0lOVl9JRl9QT0xfX007CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0NPTkZJR19fQSwgZGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQkvKiBTZXQgc3BlZWQgKHVzaW5nIGNvbXBsZW1lbnRhcnkgcmVkdWN0aW9uIHZhbHVlKSAqLworCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0tJX1JFRF9fQSwgJmRhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWRhdGEgJj0gflNDVV9SQU1fQUdDX0tJX1JFRF9JQUdDX1JFRF9fTTsKKwkJZGF0YSB8PSAofihwQWdjQ2ZnLT5zcGVlZCA8PAorCQkJCVNDVV9SQU1fQUdDX0tJX1JFRF9JQUdDX1JFRF9fQikKKwkJCQkmIFNDVV9SQU1fQUdDX0tJX1JFRF9JQUdDX1JFRF9fTSk7CisKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfS0lfUkVEX19BLCBkYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCisJCWlmIChJc1FBTShzdGF0ZSkpCisJCQlwUmZBZ2NTZXR0aW5ncyA9ICZzdGF0ZS0+bV9xYW1SZkFnY0NmZzsKKwkJZWxzZQorCQkJcFJmQWdjU2V0dGluZ3MgPSAmc3RhdGUtPm1fYXR2UmZBZ2NDZmc7CisJCWlmIChwUmZBZ2NTZXR0aW5ncyA9PSBOVUxMKQorCQkJcmV0dXJuIC0xOworCQkvKiBSZXN0b3JlIFRPUCAqLworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19JRl9JQUNDVV9ISV9UR1RfTUFYX19BLCBwUmZBZ2NTZXR0aW5ncy0+dG9wKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlicmVhazsKKworCWNhc2UgRFJYS19BR0NfQ1RSTF9VU0VSOgorCisJCS8qIEVuYWJsZSBJRiBBR0MgREFDICovCisJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgSVFNX0FGX1NUREJZX19BLCAmZGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJZGF0YSAmPSB+SVFNX0FGX1NUREJZX1NUREJZX1RBR0NfSUZfU1RBTkRCWTsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0FGX1NUREJZX19BLCBkYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCisJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgU0NVX1JBTV9BR0NfQ09ORklHX19BLCAmZGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQkvKiBEaXNhYmxlIFNDVSBJRiBBR0MgbG9vcCAqLworCQlkYXRhIHw9IFNDVV9SQU1fQUdDX0NPTkZJR19ESVNBQkxFX0lGX0FHQ19fTTsKKworCQkvKiBQb2xhcml0eSAqLworCQlpZiAoc3RhdGUtPm1fSWZBZ2NQb2wpCisJCQlkYXRhIHw9IFNDVV9SQU1fQUdDX0NPTkZJR19JTlZfSUZfUE9MX19NOworCQllbHNlCisJCQlkYXRhICY9IH5TQ1VfUkFNX0FHQ19DT05GSUdfSU5WX0lGX1BPTF9fTTsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfQ09ORklHX19BLCBkYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCisJCS8qIFdyaXRlIHZhbHVlIHRvIG91dHB1dCBwaW4gKi8KKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfSUZfSUFDQ1VfSElfVEdUX01BWF9fQSwgcEFnY0NmZy0+b3V0cHV0TGV2ZWwpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWJyZWFrOworCisJY2FzZSBEUlhLX0FHQ19DVFJMX09GRjoKKworCQkvKiBEaXNhYmxlIElmIEFHQyBEQUMgKi8KKwkJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBJUU1fQUZfU1REQllfX0EsICZkYXRhKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlkYXRhIHw9IElRTV9BRl9TVERCWV9TVERCWV9UQUdDX0lGX1NUQU5EQlk7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9BRl9TVERCWV9fQSwgZGF0YSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQkvKiBEaXNhYmxlIFNDVSBJRiBBR0MgbG9vcCAqLworCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0NPTkZJR19fQSwgJmRhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWRhdGEgfD0gU0NVX1JBTV9BR0NfQ09ORklHX0RJU0FCTEVfSUZfQUdDX19NOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19DT05GSUdfX0EsIGRhdGEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWJyZWFrOworCX0JCS8qIHN3aXRjaCAoYWdjU2V0dGluZ3NJZi0+Y3RybE1vZGUpICovCisKKwkvKiBhbHdheXMgc2V0IHRoZSB0b3AgdG8gc3VwcG9ydAorCQljb25maWd1cmF0aW9ucyB3aXRob3V0IGlmLWxvb3AgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19JTkdBSU5fVEdUX01JTl9fQSwgcEFnY0NmZy0+dG9wKTsKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IFJlYWRJRkFnYyhzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIHUzMiAqcFZhbHVlKQoreworCXUxNiBhZ2NEYWNMdmw7CisJaW50IHN0YXR1czsKKwl1MTYgTGV2ZWwgPSAwOworCisJZHByaW50aygxLCAiXG4iKTsKKworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgSVFNX0FGX0FHQ19JRl9fQSwgJmFnY0RhY0x2bCk7CisJaWYgKHN0YXR1cyA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJKnBWYWx1ZSA9IDA7CisKKwlpZiAoYWdjRGFjTHZsID4gRFJYS19BR0NfREFDX09GRlNFVCkKKwkJTGV2ZWwgPSBhZ2NEYWNMdmwgLSBEUlhLX0FHQ19EQUNfT0ZGU0VUOworCWlmIChMZXZlbCA8IDE0MDAwKQorCQkqcFZhbHVlID0gKDE0MDAwIC0gTGV2ZWwpIC8gNDsKKwllbHNlCisJCSpwVmFsdWUgPSAwOworCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBHZXRRQU1TaWduYWxUb05vaXNlKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwKKwkJCSAgICAgICBzMzIgKnBTaWduYWxUb05vaXNlKQoreworCWludCBzdGF0dXMgPSAwOworCXUxNiBxYW1TbEVyclBvd2VyID0gMDsJLyogYWNjdW0uIGVycm9yIGJldHdlZW4KKwkJCQkJcmF3IGFuZCBzbGljZWQgc3ltYm9scyAqLworCXUzMiBxYW1TbFNpZ1Bvd2VyID0gMDsJLyogdXNlZCBmb3IgTUVSLCBkZXBlbmRzIG9mCisJCQkJCVFBTSBjb25zdGVsbGF0aW9uICovCisJdTMyIHFhbVNsTWVyID0gMDsJLyogUUFNIE1FUiAqLworCisJZHByaW50aygxLCAiXG4iKTsKKworCS8qIE1FUiBjYWxjdWxhdGlvbiAqLworCisJLyogZ2V0IHRoZSByZWdpc3RlciB2YWx1ZSBuZWVkZWQgZm9yIE1FUiAqLworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgUUFNX1NMX0VSUl9QT1dFUl9fQSwgJnFhbVNsRXJyUG93ZXIpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKHN0YXRlLT5wYXJhbS51LnFhbS5tb2R1bGF0aW9uKSB7CisJY2FzZSBRQU1fMTY6CisJCXFhbVNsU2lnUG93ZXIgPSBEUlhLX1FBTV9TTF9TSUdfUE9XRVJfUUFNMTYgPDwgMjsKKwkJYnJlYWs7CisJY2FzZSBRQU1fMzI6CisJCXFhbVNsU2lnUG93ZXIgPSBEUlhLX1FBTV9TTF9TSUdfUE9XRVJfUUFNMzIgPDwgMjsKKwkJYnJlYWs7CisJY2FzZSBRQU1fNjQ6CisJCXFhbVNsU2lnUG93ZXIgPSBEUlhLX1FBTV9TTF9TSUdfUE9XRVJfUUFNNjQgPDwgMjsKKwkJYnJlYWs7CisJY2FzZSBRQU1fMTI4OgorCQlxYW1TbFNpZ1Bvd2VyID0gRFJYS19RQU1fU0xfU0lHX1BPV0VSX1FBTTEyOCA8PCAyOworCQlicmVhazsKKwlkZWZhdWx0OgorCWNhc2UgUUFNXzI1NjoKKwkJcWFtU2xTaWdQb3dlciA9IERSWEtfUUFNX1NMX1NJR19QT1dFUl9RQU0yNTYgPDwgMjsKKwkJYnJlYWs7CisJfQorCisJaWYgKHFhbVNsRXJyUG93ZXIgPiAwKSB7CisJCXFhbVNsTWVyID0gTG9nMTBUaW1lczEwMChxYW1TbFNpZ1Bvd2VyKSAtCisJCQlMb2cxMFRpbWVzMTAwKCh1MzIpIHFhbVNsRXJyUG93ZXIpOworCX0KKwkqcFNpZ25hbFRvTm9pc2UgPSBxYW1TbE1lcjsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgR2V0RFZCVFNpZ25hbFRvTm9pc2Uoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLAorCQkJCXMzMiAqcFNpZ25hbFRvTm9pc2UpCit7CisJaW50IHN0YXR1czsKKwl1MTYgcmVnRGF0YSA9IDA7CisJdTMyIEVxUmVnVGRTcXJFcnJJID0gMDsKKwl1MzIgRXFSZWdUZFNxckVyclEgPSAwOworCXUxNiBFcVJlZ1RkU3FyRXJyRXhwID0gMDsKKwl1MTYgRXFSZWdUZFRwc1B3ck9mcyA9IDA7CisJdTE2IEVxUmVnVGRSZXFTbWJDbnQgPSAwOworCXUzMiB0cHNDbnQgPSAwOworCXUzMiBTcXJFcnJJUSA9IDA7CisJdTMyIGEgPSAwOworCXUzMiBiID0gMDsKKwl1MzIgYyA9IDA7CisJdTMyIGlNRVIgPSAwOworCXUxNiB0cmFuc21pc3Npb25QYXJhbXMgPSAwOworCisJZHByaW50aygxLCAiXG4iKTsKKworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgT0ZETV9FUV9UT1BfVERfVFBTX1BXUl9PRlNfX0EsICZFcVJlZ1RkVHBzUHdyT2ZzKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIE9GRE1fRVFfVE9QX1REX1JFUV9TTUJfQ05UX19BLCAmRXFSZWdUZFJlcVNtYkNudCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBPRkRNX0VRX1RPUF9URF9TUVJfRVJSX0VYUF9fQSwgJkVxUmVnVGRTcXJFcnJFeHApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgT0ZETV9FUV9UT1BfVERfU1FSX0VSUl9JX19BLCAmcmVnRGF0YSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJLyogRXh0ZW5kIFNRUl9FUlJfSSBvcGVyYXRpb25hbCByYW5nZSAqLworCUVxUmVnVGRTcXJFcnJJID0gKHUzMikgcmVnRGF0YTsKKwlpZiAoKEVxUmVnVGRTcXJFcnJFeHAgPiAxMSkgJiYKKwkJKEVxUmVnVGRTcXJFcnJJIDwgMHgwMDAwMEZGRlVMKSkgeworCQlFcVJlZ1RkU3FyRXJySSArPSAweDAwMDEwMDAwVUw7CisJfQorCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgT0ZETV9FUV9UT1BfVERfU1FSX0VSUl9RX19BLCAmcmVnRGF0YSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJLyogRXh0ZW5kIFNRUl9FUlJfUSBvcGVyYXRpb25hbCByYW5nZSAqLworCUVxUmVnVGRTcXJFcnJRID0gKHUzMikgcmVnRGF0YTsKKwlpZiAoKEVxUmVnVGRTcXJFcnJFeHAgPiAxMSkgJiYKKwkJKEVxUmVnVGRTcXJFcnJRIDwgMHgwMDAwMEZGRlVMKSkKKwkJRXFSZWdUZFNxckVyclEgKz0gMHgwMDAxMDAwMFVMOworCisJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9fQSwgJnRyYW5zbWlzc2lvblBhcmFtcyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBDaGVjayBpbnB1dCBkYXRhIGZvciBNRVIgKi8KKworCS8qIE1FUiBjYWxjdWxhdGlvbiAoaW4gMC4xIGRCKSB3aXRob3V0IG1hdGguaCAqLworCWlmICgoRXFSZWdUZFRwc1B3ck9mcyA9PSAwKSB8fCAoRXFSZWdUZFJlcVNtYkNudCA9PSAwKSkKKwkJaU1FUiA9IDA7CisJZWxzZSBpZiAoKEVxUmVnVGRTcXJFcnJJICsgRXFSZWdUZFNxckVyclEpID09IDApIHsKKwkJLyogTm8gZXJyb3IgYXQgYWxsLCB0aGlzIG11c3QgYmUgdGhlIEhXIHJlc2V0IHZhbHVlCisJCQkqIEFwcGFyZW50bHkgbm8gZmlyc3QgbWVhc3VyZW1lbnQgeWV0CisJCQkqIFNldCBNRVIgdG8gMC4wICovCisJCWlNRVIgPSAwOworCX0gZWxzZSB7CisJCVNxckVycklRID0gKEVxUmVnVGRTcXJFcnJJICsgRXFSZWdUZFNxckVyclEpIDw8CisJCQlFcVJlZ1RkU3FyRXJyRXhwOworCQlpZiAoKHRyYW5zbWlzc2lvblBhcmFtcyAmCisJCQlPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9NT0RFX19NKQorCQkJPT0gT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fTU9ERV8ySykKKwkJCXRwc0NudCA9IDE3OworCQllbHNlCisJCQl0cHNDbnQgPSA2ODsKKworCQkvKiBJTUVSID0gMTAwICogbG9nMTAgKHgpCisJCQl3aGVyZSB4ID0gKEVxUmVnVGRUcHNQd3JPZnNeMiAqCisJCQlFcVJlZ1RkUmVxU21iQ250ICogdHBzQ250KS9TcXJFcnJJUQorCisJCQk9PiBJTUVSID0gYSArIGIgLWMKKwkJCXdoZXJlIGEgPSAxMDAgKiBsb2cxMCAoRXFSZWdUZFRwc1B3ck9mc14yKQorCQkJYiA9IDEwMCAqIGxvZzEwIChFcVJlZ1RkUmVxU21iQ250ICogdHBzQ250KQorCQkJYyA9IDEwMCAqIGxvZzEwIChTcXJFcnJJUSkKKwkJCSovCisKKwkJLyogbG9nKHgpIHggPSA5Yml0cyAqIDliaXRzLT4xOCBiaXRzICAqLworCQlhID0gTG9nMTBUaW1lczEwMChFcVJlZ1RkVHBzUHdyT2ZzICoKKwkJCQkJRXFSZWdUZFRwc1B3ck9mcyk7CisJCS8qIGxvZyh4KSB4ID0gMTZiaXRzICogN2JpdHMtPjIzIGJpdHMgICovCisJCWIgPSBMb2cxMFRpbWVzMTAwKEVxUmVnVGRSZXFTbWJDbnQgKiB0cHNDbnQpOworCQkvKiBsb2coeCkgeCA9ICgxNmJpdHMgKyAxNmJpdHMpIDw8IDE1IC0+MzIgYml0cyAgKi8KKwkJYyA9IExvZzEwVGltZXMxMDAoU3FyRXJySVEpOworCisJCWlNRVIgPSBhICsgYjsKKwkJLyogTm8gbmVnYXRpdmUgTUVSLCBjbGlwIHRvIHplcm8gKi8KKwkJaWYgKGlNRVIgPiBjKQorCQkJaU1FUiAtPSBjOworCQllbHNlCisJCQlpTUVSID0gMDsKKwl9CisJKnBTaWduYWxUb05vaXNlID0gaU1FUjsKKworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgR2V0U2lnbmFsVG9Ob2lzZShzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIHMzMiAqcFNpZ25hbFRvTm9pc2UpCit7CisJZHByaW50aygxLCAiXG4iKTsKKworCSpwU2lnbmFsVG9Ob2lzZSA9IDA7CisJc3dpdGNoIChzdGF0ZS0+bV9PcGVyYXRpb25Nb2RlKSB7CisJY2FzZSBPTV9EVkJUOgorCQlyZXR1cm4gR2V0RFZCVFNpZ25hbFRvTm9pc2Uoc3RhdGUsIHBTaWduYWxUb05vaXNlKTsKKwljYXNlIE9NX1FBTV9JVFVfQToKKwljYXNlIE9NX1FBTV9JVFVfQzoKKwkJcmV0dXJuIEdldFFBTVNpZ25hbFRvTm9pc2Uoc3RhdGUsIHBTaWduYWxUb05vaXNlKTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZiAwCitzdGF0aWMgaW50IEdldERWQlRRdWFsaXR5KHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgczMyICpwUXVhbGl0eSkKK3sKKwkvKiBTTlIgVmFsdWVzIGZvciBxdWFzaSBlcnJvcmZyZWUgcmVjZXB0aW9uIHJvbSBOb3JkaWcgMi4yICovCisJaW50IHN0YXR1cyA9IDA7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJc3RhdGljIHMzMiBRRV9TTltdID0geworCQk1MSwJCS8qIFFQU0sgMS8yICovCisJCTY5LAkJLyogUVBTSyAyLzMgKi8KKwkJNzksCQkvKiBRUFNLIDMvNCAqLworCQk4OSwJCS8qIFFQU0sgNS82ICovCisJCTk3LAkJLyogUVBTSyA3LzggKi8KKwkJMTA4LAkJLyogMTYtUUFNIDEvMiAqLworCQkxMzEsCQkvKiAxNi1RQU0gMi8zICovCisJCTE0NiwJCS8qIDE2LVFBTSAzLzQgKi8KKwkJMTU2LAkJLyogMTYtUUFNIDUvNiAqLworCQkxNjAsCQkvKiAxNi1RQU0gNy84ICovCisJCTE2NSwJCS8qIDY0LVFBTSAxLzIgKi8KKwkJMTg3LAkJLyogNjQtUUFNIDIvMyAqLworCQkyMDIsCQkvKiA2NC1RQU0gMy80ICovCisJCTIxNiwJCS8qIDY0LVFBTSA1LzYgKi8KKwkJMjI1LAkJLyogNjQtUUFNIDcvOCAqLworCX07CisKKwkqcFF1YWxpdHkgPSAwOworCisJZG8geworCQlzMzIgU2lnbmFsVG9Ob2lzZSA9IDA7CisJCXUxNiBDb25zdGVsbGF0aW9uID0gMDsKKwkJdTE2IENvZGVSYXRlID0gMDsKKwkJdTMyIFNpZ25hbFRvTm9pc2VSZWw7CisJCXUzMiBCRVJRdWFsaXR5OworCisJCXN0YXR1cyA9IEdldERWQlRTaWduYWxUb05vaXNlKHN0YXRlLCAmU2lnbmFsVG9Ob2lzZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgT0ZETV9FUV9UT1BfVERfVFBTX0NPTlNUX19BLCAmQ29uc3RlbGxhdGlvbik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCUNvbnN0ZWxsYXRpb24gJj0gT0ZETV9FUV9UT1BfVERfVFBTX0NPTlNUX19NOworCisJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgT0ZETV9FUV9UT1BfVERfVFBTX0NPREVfSFBfX0EsICZDb2RlUmF0ZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCUNvZGVSYXRlICY9IE9GRE1fRVFfVE9QX1REX1RQU19DT0RFX0hQX19NOworCisJCWlmIChDb25zdGVsbGF0aW9uID4gT0ZETV9FUV9UT1BfVERfVFBTX0NPTlNUXzY0UUFNIHx8CisJCSAgICBDb2RlUmF0ZSA+IE9GRE1fRVFfVE9QX1REX1RQU19DT0RFX0xQXzdfOCkKKwkJCWJyZWFrOworCQlTaWduYWxUb05vaXNlUmVsID0gU2lnbmFsVG9Ob2lzZSAtCisJCSAgICBRRV9TTltDb25zdGVsbGF0aW9uICogNSArIENvZGVSYXRlXTsKKwkJQkVSUXVhbGl0eSA9IDEwMDsKKworCQlpZiAoU2lnbmFsVG9Ob2lzZVJlbCA8IC03MCkKKwkJCSpwUXVhbGl0eSA9IDA7CisJCWVsc2UgaWYgKFNpZ25hbFRvTm9pc2VSZWwgPCAzMCkKKwkJCSpwUXVhbGl0eSA9ICgoU2lnbmFsVG9Ob2lzZVJlbCArIDcwKSAqCisJCQkJICAgICBCRVJRdWFsaXR5KSAvIDEwMDsKKwkJZWxzZQorCQkJKnBRdWFsaXR5ID0gQkVSUXVhbGl0eTsKKwl9IHdoaWxlICgwKTsKKwlyZXR1cm4gMDsKK307CisKK3N0YXRpYyBpbnQgR2V0RFZCQ1F1YWxpdHkoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCBzMzIgKnBRdWFsaXR5KQoreworCWludCBzdGF0dXMgPSAwOworCSpwUXVhbGl0eSA9IDA7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJZG8geworCQl1MzIgU2lnbmFsVG9Ob2lzZSA9IDA7CisJCXUzMiBCRVJRdWFsaXR5ID0gMTAwOworCQl1MzIgU2lnbmFsVG9Ob2lzZVJlbCA9IDA7CisKKwkJc3RhdHVzID0gR2V0UUFNU2lnbmFsVG9Ob2lzZShzdGF0ZSwgJlNpZ25hbFRvTm9pc2UpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCisJCXN3aXRjaCAoc3RhdGUtPnBhcmFtLnUucWFtLm1vZHVsYXRpb24pIHsKKwkJY2FzZSBRQU1fMTY6CisJCQlTaWduYWxUb05vaXNlUmVsID0gU2lnbmFsVG9Ob2lzZSAtIDIwMDsKKwkJCWJyZWFrOworCQljYXNlIFFBTV8zMjoKKwkJCVNpZ25hbFRvTm9pc2VSZWwgPSBTaWduYWxUb05vaXNlIC0gMjMwOworCQkJYnJlYWs7CS8qIE5vdCBpbiBOb3JEaWcgKi8KKwkJY2FzZSBRQU1fNjQ6CisJCQlTaWduYWxUb05vaXNlUmVsID0gU2lnbmFsVG9Ob2lzZSAtIDI2MDsKKwkJCWJyZWFrOworCQljYXNlIFFBTV8xMjg6CisJCQlTaWduYWxUb05vaXNlUmVsID0gU2lnbmFsVG9Ob2lzZSAtIDI5MDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQljYXNlIFFBTV8yNTY6CisJCQlTaWduYWxUb05vaXNlUmVsID0gU2lnbmFsVG9Ob2lzZSAtIDMyMDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKFNpZ25hbFRvTm9pc2VSZWwgPCAtNzApCisJCQkqcFF1YWxpdHkgPSAwOworCQllbHNlIGlmIChTaWduYWxUb05vaXNlUmVsIDwgMzApCisJCQkqcFF1YWxpdHkgPSAoKFNpZ25hbFRvTm9pc2VSZWwgKyA3MCkgKgorCQkJCSAgICAgQkVSUXVhbGl0eSkgLyAxMDA7CisJCWVsc2UKKwkJCSpwUXVhbGl0eSA9IEJFUlF1YWxpdHk7CisJfSB3aGlsZSAoMCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IEdldFF1YWxpdHkoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCBzMzIgKnBRdWFsaXR5KQoreworCWRwcmludGsoMSwgIlxuIik7CisKKwlzd2l0Y2ggKHN0YXRlLT5tX09wZXJhdGlvbk1vZGUpIHsKKwljYXNlIE9NX0RWQlQ6CisJCXJldHVybiBHZXREVkJUUXVhbGl0eShzdGF0ZSwgcFF1YWxpdHkpOworCWNhc2UgT01fUUFNX0lUVV9BOgorCQlyZXR1cm4gR2V0RFZCQ1F1YWxpdHkoc3RhdGUsIHBRdWFsaXR5KTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiBGcmVlIGRhdGEgcmFtIGluIFNJTyBISSAqLworI2RlZmluZSBTSU9fSElfUkFfUkFNX1VTUl9CRUdJTl9fQSAweDQyMDA0MAorI2RlZmluZSBTSU9fSElfUkFfUkFNX1VTUl9FTkRfX0EgICAweDQyMDA2MAorCisjZGVmaW5lIERSWEtfSElfQVRPTUlDX0JVRl9TVEFSVCAoU0lPX0hJX1JBX1JBTV9VU1JfQkVHSU5fX0EpCisjZGVmaW5lIERSWEtfSElfQVRPTUlDX0JVRl9FTkQgICAoU0lPX0hJX1JBX1JBTV9VU1JfQkVHSU5fX0EgKyA3KQorI2RlZmluZSBEUlhLX0hJX0FUT01JQ19SRUFEICAgICAgU0lPX0hJX1JBX1JBTV9QQVJfM19BQ1BfUldfUkVBRAorI2RlZmluZSBEUlhLX0hJX0FUT01JQ19XUklURSAgICAgU0lPX0hJX1JBX1JBTV9QQVJfM19BQ1BfUldfV1JJVEUKKworI2RlZmluZSBEUlhEQVBfRkFTSV9BRERSMkJMT0NLKGFkZHIpICAoKChhZGRyKSA+PiAyMikgJiAweDNGKQorI2RlZmluZSBEUlhEQVBfRkFTSV9BRERSMkJBTksoYWRkcikgICAoKChhZGRyKSA+PiAxNikgJiAweDNGKQorI2RlZmluZSBEUlhEQVBfRkFTSV9BRERSMk9GRlNFVChhZGRyKSAoKGFkZHIpICYgMHg3RkZGKQorCitzdGF0aWMgaW50IENvbmZpZ3VyZUkyQ0JyaWRnZShzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIGJvb2wgYkVuYWJsZUJyaWRnZSkKK3sKKwlpbnQgc3RhdHVzID0gLUVJTlZBTDsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwlpZiAoc3RhdGUtPm1fRHJ4a1N0YXRlID09IERSWEtfVU5JTklUSUFMSVpFRCkKKwkJZ290byBlcnJvcjsKKwlpZiAoc3RhdGUtPm1fRHJ4a1N0YXRlID09IERSWEtfUE9XRVJFRF9ET1dOKQorCQlnb3RvIGVycm9yOworCisJaWYgKHN0YXRlLT5ub19pMmNfYnJpZGdlKQorCQlyZXR1cm4gMDsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19ISV9SQV9SQU1fUEFSXzFfX0EsIFNJT19ISV9SQV9SQU1fUEFSXzFfUEFSMV9TRUNfS0VZKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlpZiAoYkVuYWJsZUJyaWRnZSkgeworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fSElfUkFfUkFNX1BBUl8yX19BLCBTSU9fSElfUkFfUkFNX1BBUl8yX0JSRF9DRkdfQ0xPU0VEKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19ISV9SQV9SQU1fUEFSXzJfX0EsIFNJT19ISV9SQV9SQU1fUEFSXzJfQlJEX0NGR19PUEVOKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCX0KKworCXN0YXR1cyA9IEhJX0NvbW1hbmQoc3RhdGUsIFNJT19ISV9SQV9SQU1fQ01EX0JSRENUUkwsIDApOworCitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBTZXRQcmVTYXcoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLAorCQkgICAgIHN0cnVjdCBTQ2ZnUHJlU2F3ICpwUHJlU2F3Q2ZnKQoreworCWludCBzdGF0dXMgPSAtRUlOVkFMOworCisJZHByaW50aygxLCAiXG4iKTsKKworCWlmICgocFByZVNhd0NmZyA9PSBOVUxMKQorCSAgICB8fCAocFByZVNhd0NmZy0+cmVmZXJlbmNlID4gSVFNX0FGX1BEUkVGX19NKSkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9BRl9QRFJFRl9fQSwgcFByZVNhd0NmZy0+cmVmZXJlbmNlKTsKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IEJMRGlyZWN0Q21kKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgdTMyIHRhcmdldEFkZHIsCisJCSAgICAgICB1MTYgcm9tT2Zmc2V0LCB1MTYgbnJPZkVsZW1lbnRzLCB1MzIgdGltZU91dCkKK3sKKwl1MTYgYmxTdGF0dXMgPSAwOworCXUxNiBvZmZzZXQgPSAodTE2KSAoKHRhcmdldEFkZHIgPj4gMCkgJiAweDAwRkZGRik7CisJdTE2IGJsb2NrYmFuayA9ICh1MTYpICgodGFyZ2V0QWRkciA+PiAxNikgJiAweDAwMEZGRik7CisJaW50IHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIGVuZDsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwltdXRleF9sb2NrKCZzdGF0ZS0+bXV0ZXgpOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19CTF9NT0RFX19BLCBTSU9fQkxfTU9ERV9ESVJFQ1QpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19CTF9UR1RfSERSX19BLCBibG9ja2JhbmspOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19CTF9UR1RfQUREUl9fQSwgb2Zmc2V0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fQkxfU1JDX0FERFJfX0EsIHJvbU9mZnNldCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX0JMX1NSQ19MRU5fX0EsIG5yT2ZFbGVtZW50cyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX0JMX0VOQUJMRV9fQSwgU0lPX0JMX0VOQUJMRV9PTik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwllbmQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyh0aW1lT3V0KTsKKwlkbyB7CisJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgU0lPX0JMX1NUQVRVU19fQSwgJmJsU3RhdHVzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCX0gd2hpbGUgKChibFN0YXR1cyA9PSAweDEpICYmIHRpbWVfaXNfYWZ0ZXJfamlmZmllcyhlbmQpKTsKKwlpZiAoYmxTdGF0dXMgPT0gMHgxKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogU0lPIG5vdCByZWFkeVxuIik7CisJCXN0YXR1cyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3IyOworCX0KK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKK2Vycm9yMjoKKwltdXRleF91bmxvY2soJnN0YXRlLT5tdXRleCk7CisJcmV0dXJuIHN0YXR1czsKKworfQorCitzdGF0aWMgaW50IEFEQ1N5bmNNZWFzdXJlbWVudChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIHUxNiAqY291bnQpCit7CisJdTE2IGRhdGEgPSAwOworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJLyogU3RhcnQgbWVhc3VyZW1lbnQgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQUZfQ09NTV9FWEVDX19BLCBJUU1fQUZfQ09NTV9FWEVDX0FDVElWRSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0FGX1NUQVJUX0xPQ0tfX0EsIDEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJKmNvdW50ID0gMDsKKwlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIElRTV9BRl9QSEFTRTBfX0EsICZkYXRhKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlpZiAoZGF0YSA9PSAxMjcpCisJCSpjb3VudCA9ICpjb3VudCArIDE7CisJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBJUU1fQUZfUEhBU0UxX19BLCAmZGF0YSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJaWYgKGRhdGEgPT0gMTI3KQorCQkqY291bnQgPSAqY291bnQgKyAxOworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgSVFNX0FGX1BIQVNFMl9fQSwgJmRhdGEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCWlmIChkYXRhID09IDEyNykKKwkJKmNvdW50ID0gKmNvdW50ICsgMTsKKworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgQURDU3luY2hyb25pemF0aW9uKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwl1MTYgY291bnQgPSAwOworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJc3RhdHVzID0gQURDU3luY01lYXN1cmVtZW50KHN0YXRlLCAmY291bnQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJaWYgKGNvdW50ID09IDEpIHsKKwkJLyogVHJ5IHNhbXBsaW5nIG9uIGEgZGlmZnJlbnQgZWRnZSAqLworCQl1MTYgY2xrTmVnID0gMDsKKworCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIElRTV9BRl9DTEtORUdfX0EsICZjbGtOZWcpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCWlmICgoY2xrTmVnIHwgSVFNX0FGX0NMS05FR19DTEtORUdEQVRBX19NKSA9PQorCQkJSVFNX0FGX0NMS05FR19DTEtORUdEQVRBX0NMS19BRENfREFUQV9QT1MpIHsKKwkJCWNsa05lZyAmPSAofihJUU1fQUZfQ0xLTkVHX0NMS05FR0RBVEFfX00pKTsKKwkJCWNsa05lZyB8PQorCQkJCUlRTV9BRl9DTEtORUdfQ0xLTkVHREFUQV9DTEtfQURDX0RBVEFfTkVHOworCQl9IGVsc2UgeworCQkJY2xrTmVnICY9ICh+KElRTV9BRl9DTEtORUdfQ0xLTkVHREFUQV9fTSkpOworCQkJY2xrTmVnIHw9CisJCQkJSVFNX0FGX0NMS05FR19DTEtORUdEQVRBX0NMS19BRENfREFUQV9QT1M7CisJCX0KKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0FGX0NMS05FR19fQSwgY2xrTmVnKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSBBRENTeW5jTWVhc3VyZW1lbnQoc3RhdGUsICZjb3VudCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoY291bnQgPCAyKQorCQlzdGF0dXMgPSAtRUlOVkFMOworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgU2V0RnJlcXVlbmN5U2hpZnRlcihzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsCisJCQkgICAgICAgdTE2IGludGVybWVkaWF0ZUZyZXFrSHosCisJCQkgICAgICAgczMyIHR1bmVyRnJlcU9mZnNldCwgYm9vbCBpc0RUVikKK3sKKwlib29sIHNlbGVjdFBvc0ltYWdlID0gZmFsc2U7CisJdTMyIHJmRnJlcVJlc2lkdWFsID0gdHVuZXJGcmVxT2Zmc2V0OworCXUzMiBmbUZyZXF1ZW5jeVNoaWZ0ID0gMDsKKwlib29sIHR1bmVyTWlycm9yID0gIXN0YXRlLT5tX2JNaXJyb3JGcmVxU3BlY3Q7CisJdTMyIGFkY0ZyZXE7CisJYm9vbCBhZGNGbGlwOworCWludCBzdGF0dXM7CisJdTMyIGlmRnJlcUFjdHVhbDsKKwl1MzIgc2FtcGxpbmdGcmVxdWVuY3kgPSAodTMyKSAoc3RhdGUtPm1fc3lzQ2xvY2tGcmVxIC8gMyk7CisJdTMyIGZyZXF1ZW5jeVNoaWZ0OworCWJvb2wgaW1hZ2VUb1NlbGVjdDsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwkvKgorCSAgIFByb2dyYW0gZnJlcXVlbmN5IHNoaWZ0ZXIKKwkgICBObyBuZWVkIHRvIGFjY291bnQgZm9yIG1pcnJvcmluZyBvbiBSRgorCSAqLworCWlmIChpc0RUVikgeworCQlpZiAoKHN0YXRlLT5tX09wZXJhdGlvbk1vZGUgPT0gT01fUUFNX0lUVV9BKSB8fAorCQkgICAgKHN0YXRlLT5tX09wZXJhdGlvbk1vZGUgPT0gT01fUUFNX0lUVV9DKSB8fAorCQkgICAgKHN0YXRlLT5tX09wZXJhdGlvbk1vZGUgPT0gT01fRFZCVCkpCisJCQlzZWxlY3RQb3NJbWFnZSA9IHRydWU7CisJCWVsc2UKKwkJCXNlbGVjdFBvc0ltYWdlID0gZmFsc2U7CisJfQorCWlmICh0dW5lck1pcnJvcikKKwkJLyogdHVuZXIgZG9lc24ndCBtaXJyb3IgKi8KKwkJaWZGcmVxQWN0dWFsID0gaW50ZXJtZWRpYXRlRnJlcWtIeiArCisJCSAgICByZkZyZXFSZXNpZHVhbCArIGZtRnJlcXVlbmN5U2hpZnQ7CisJZWxzZQorCQkvKiB0dW5lciBtaXJyb3JzICovCisJCWlmRnJlcUFjdHVhbCA9IGludGVybWVkaWF0ZUZyZXFrSHogLQorCQkgICAgcmZGcmVxUmVzaWR1YWwgLSBmbUZyZXF1ZW5jeVNoaWZ0OworCWlmIChpZkZyZXFBY3R1YWwgPiBzYW1wbGluZ0ZyZXF1ZW5jeSAvIDIpIHsKKwkJLyogYWRjIG1pcnJvcnMgKi8KKwkJYWRjRnJlcSA9IHNhbXBsaW5nRnJlcXVlbmN5IC0gaWZGcmVxQWN0dWFsOworCQlhZGNGbGlwID0gdHJ1ZTsKKwl9IGVsc2UgeworCQkvKiBhZGMgZG9lc24ndCBtaXJyb3IgKi8KKwkJYWRjRnJlcSA9IGlmRnJlcUFjdHVhbDsKKwkJYWRjRmxpcCA9IGZhbHNlOworCX0KKworCWZyZXF1ZW5jeVNoaWZ0ID0gYWRjRnJlcTsKKwlpbWFnZVRvU2VsZWN0ID0gc3RhdGUtPm1fcmZtaXJyb3IgXiB0dW5lck1pcnJvciBeCisJICAgIGFkY0ZsaXAgXiBzZWxlY3RQb3NJbWFnZTsKKwlzdGF0ZS0+bV9JcW1Gc1JhdGVPZnMgPQorCSAgICBGcmFjMjhhKChmcmVxdWVuY3lTaGlmdCksIHNhbXBsaW5nRnJlcXVlbmN5KTsKKworCWlmIChpbWFnZVRvU2VsZWN0KQorCQlzdGF0ZS0+bV9JcW1Gc1JhdGVPZnMgPSB+c3RhdGUtPm1fSXFtRnNSYXRlT2ZzICsgMTsKKworCS8qIFByb2dyYW0gZnJlcXVlbmN5IHNoaWZ0ZXIgd2l0aCB0dW5lciBvZmZzZXQgY29tcGVuc2F0aW9uICovCisJLyogZnJlcXVlbmN5U2hpZnQgKz0gdHVuZXJGcmVxT2Zmc2V0OyBUT0RPICovCisJc3RhdHVzID0gd3JpdGUzMihzdGF0ZSwgSVFNX0ZTX1JBVEVfT0ZTX0xPX19BLAorCQkJIHN0YXRlLT5tX0lxbUZzUmF0ZU9mcyk7CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgSW5pdEFHQyhzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIGJvb2wgaXNEVFYpCit7CisJdTE2IGluZ2FpblRndCA9IDA7CisJdTE2IGluZ2FpblRndE1pbiA9IDA7CisJdTE2IGluZ2FpblRndE1heCA9IDA7CisJdTE2IGNscEN5Y2xlbiA9IDA7CisJdTE2IGNscFN1bU1pbiA9IDA7CisJdTE2IGNscERpclRvID0gMDsKKwl1MTYgc25zU3VtTWluID0gMDsKKwl1MTYgc25zU3VtTWF4ID0gMDsKKwl1MTYgY2xwU3VtTWF4ID0gMDsKKwl1MTYgc25zRGlyVG8gPSAwOworCXUxNiBraUlubmVyZ2Fpbk1pbiA9IDA7CisJdTE2IGlmSWFjY3VIaVRndCA9IDA7CisJdTE2IGlmSWFjY3VIaVRndE1pbiA9IDA7CisJdTE2IGlmSWFjY3VIaVRndE1heCA9IDA7CisJdTE2IGRhdGEgPSAwOworCXUxNiBmYXN0Q2xwQ3RybERlbGF5ID0gMDsKKwl1MTYgY2xwQ3RybE1vZGUgPSAwOworCWludCBzdGF0dXMgPSAwOworCisJZHByaW50aygxLCAiXG4iKTsKKworCS8qIENvbW1vbiBzZXR0aW5ncyAqLworCXNuc1N1bU1heCA9IDEwMjM7CisJaWZJYWNjdUhpVGd0TWluID0gMjA0NzsKKwljbHBDeWNsZW4gPSA1MDA7CisJY2xwU3VtTWF4ID0gMTAyMzsKKworCS8qIEFHQ0luaXQoKSBub3QgYXZhaWxhYmxlIGZvciBEVkJUOyBpbml0IGRvbmUgaW4gbWljcm9jb2RlICovCisJaWYgKCFJc1FBTShzdGF0ZSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiAlczogbW9kZSAlZCBpcyBub3QgRFZCLUNcbiIsIF9fZnVuY19fLCBzdGF0ZS0+bV9PcGVyYXRpb25Nb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogRklYTUU6IEFuYWxvZyBUViBBR0MgcmVxdWlyZSBkaWZmZXJlbnQgc2V0dGluZ3MgKi8KKworCS8qIFN0YW5kYXJkIHNwZWNpZmljIHNldHRpbmdzICovCisJY2xwU3VtTWluID0gODsKKwljbHBEaXJUbyA9ICh1MTYpIC05OworCWNscEN0cmxNb2RlID0gMDsKKwlzbnNTdW1NaW4gPSA4OworCXNuc0RpclRvID0gKHUxNikgLTk7CisJa2lJbm5lcmdhaW5NaW4gPSAodTE2KSAtMTAzMDsKKwlpZklhY2N1SGlUZ3RNYXggPSAweDIzODA7CisJaWZJYWNjdUhpVGd0ID0gMHgyMzgwOworCWluZ2FpblRndE1pbiA9IDB4MDUxMTsKKwlpbmdhaW5UZ3QgPSAweDA1MTE7CisJaW5nYWluVGd0TWF4ID0gNTExOTsKKwlmYXN0Q2xwQ3RybERlbGF5ID0gc3RhdGUtPm1fcWFtSWZBZ2NDZmcuRmFzdENsaXBDdHJsRGVsYXk7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19GQVNUX0NMUF9DVFJMX0RFTEFZX19BLCBmYXN0Q2xwQ3RybERlbGF5KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0NMUF9DVFJMX01PREVfX0EsIGNscEN0cmxNb2RlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19JTkdBSU5fVEdUX19BLCBpbmdhaW5UZ3QpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0lOR0FJTl9UR1RfTUlOX19BLCBpbmdhaW5UZ3RNaW4pOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0lOR0FJTl9UR1RfTUFYX19BLCBpbmdhaW5UZ3RNYXgpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0lGX0lBQ0NVX0hJX1RHVF9NSU5fX0EsIGlmSWFjY3VIaVRndE1pbik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfSUZfSUFDQ1VfSElfVEdUX01BWF9fQSwgaWZJYWNjdUhpVGd0TWF4KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19JRl9JQUNDVV9ISV9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfSUZfSUFDQ1VfTE9fX0EsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX1JGX0lBQ0NVX0hJX19BLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19SRl9JQUNDVV9MT19fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfQ0xQX1NVTV9NQVhfX0EsIGNscFN1bU1heCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfU05TX1NVTV9NQVhfX0EsIHNuc1N1bU1heCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19LSV9JTk5FUkdBSU5fTUlOX19BLCBraUlubmVyZ2Fpbk1pbik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfSUZfSUFDQ1VfSElfVEdUX19BLCBpZklhY2N1SGlUZ3QpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0NMUF9DWUNMRU5fX0EsIGNscEN5Y2xlbik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19SRl9TTlNfREVWX01BWF9fQSwgMTAyMyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfUkZfU05TX0RFVl9NSU5fX0EsICh1MTYpIC0xMDIzKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19GQVNUX1NOU19DVFJMX0RFTEFZX19BLCA1MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19LSV9NQVhNSU5HQUlOX1RIX19BLCAyMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfQ0xQX1NVTV9NSU5fX0EsIGNscFN1bU1pbik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfU05TX1NVTV9NSU5fX0EsIHNuc1N1bU1pbik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfQ0xQX0RJUl9UT19fQSwgY2xwRGlyVG8pOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX1NOU19ESVJfVE9fX0EsIHNuc0RpclRvKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19LSV9NSU5HQUlOX19BLCAweDdmZmYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0tJX01BWEdBSU5fX0EsIDB4MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfS0lfTUlOX19BLCAweDAxMTcpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0tJX01BWF9fQSwgMHgwNjU3KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19DTFBfU1VNX19BLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19DTFBfQ1lDQ05UX19BLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19DTFBfRElSX1dEX19BLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19DTFBfRElSX1NUUF9fQSwgMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfU05TX1NVTV9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfU05TX0NZQ0NOVF9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfU05TX0RJUl9XRF9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfU05TX0RJUl9TVFBfX0EsIDEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX1NOU19DWUNMRU5fX0EsIDUwMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfS0lfQ1lDTEVOX19BLCA1MDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogSW5pdGlhbGl6ZSBpbm5lci1sb29wIEtJIGdhaW4gZmFjdG9ycyAqLworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgU0NVX1JBTV9BR0NfS0lfX0EsICZkYXRhKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCWRhdGEgPSAweDA2NTc7CisJZGF0YSAmPSB+U0NVX1JBTV9BR0NfS0lfUkZfX007CisJZGF0YSB8PSAoRFJYS19LSV9SQUdDX1FBTSA8PCBTQ1VfUkFNX0FHQ19LSV9SRl9fQik7CisJZGF0YSAmPSB+U0NVX1JBTV9BR0NfS0lfSUZfX007CisJZGF0YSB8PSAoRFJYS19LSV9JQUdDX1FBTSA8PCBTQ1VfUkFNX0FHQ19LSV9JRl9fQik7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0FHQ19LSV9fQSwgZGF0YSk7CitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBEVkJUUUFNR2V0QWNjUGt0RXJyKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgdTE2ICpwYWNrZXRFcnIpCit7CisJaW50IHN0YXR1czsKKworCWRwcmludGsoMSwgIlxuIik7CisJaWYgKHBhY2tldEVyciA9PSBOVUxMKQorCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0ZFQ19BQ0NVTV9QS1RfRkFJTFVSRVNfX0EsIDApOworCWVsc2UKKwkJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBTQ1VfUkFNX0ZFQ19BQ0NVTV9QS1RfRkFJTFVSRVNfX0EsIHBhY2tldEVycik7CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgRFZCVFNjQ29tbWFuZChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsCisJCQkgdTE2IGNtZCwgdTE2IHN1YmNtZCwKKwkJCSB1MTYgcGFyYW0wLCB1MTYgcGFyYW0xLCB1MTYgcGFyYW0yLAorCQkJIHUxNiBwYXJhbTMsIHUxNiBwYXJhbTQpCit7CisJdTE2IGN1ckNtZCA9IDA7CisJdTE2IGVyckNvZGUgPSAwOworCXUxNiByZXRyeUNudCA9IDA7CisJdTE2IHNjRXhlYyA9IDA7CisJaW50IHN0YXR1czsKKworCWRwcmludGsoMSwgIlxuIik7CisJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBPRkRNX1NDX0NPTU1fRVhFQ19fQSwgJnNjRXhlYyk7CisJaWYgKHNjRXhlYyAhPSAxKSB7CisJCS8qIFNDIGlzIG5vdCBydW5uaW5nICovCisJCXN0YXR1cyA9IC1FSU5WQUw7CisJfQorCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogV2FpdCB1bnRpbCBzYyBpcyByZWFkeSB0byByZWNlaXZlIGNvbW1hbmQgKi8KKwlyZXRyeUNudCA9IDA7CisJZG8geworCQltc2xlZXAoMSk7CisJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fQ01EX19BLCAmY3VyQ21kKTsKKwkJcmV0cnlDbnQrKzsKKwl9IHdoaWxlICgoY3VyQ21kICE9IDApICYmIChyZXRyeUNudCA8IERSWEtfTUFYX1JFVFJJRVMpKTsKKwlpZiAocmV0cnlDbnQgPj0gRFJYS19NQVhfUkVUUklFUyAmJiAoc3RhdHVzIDwgMCkpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBXcml0ZSBzdWItY29tbWFuZCAqLworCXN3aXRjaCAoY21kKSB7CisJCS8qIEFsbCBjb21tYW5kcyB1c2luZyBzdWItY21kICovCisJY2FzZSBPRkRNX1NDX1JBX1JBTV9DTURfUFJPQ19TVEFSVDoKKwljYXNlIE9GRE1fU0NfUkFfUkFNX0NNRF9TRVRfUFJFRl9QQVJBTToKKwljYXNlIE9GRE1fU0NfUkFfUkFNX0NNRF9QUk9HUkFNX1BBUkFNOgorCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9DTURfQUREUl9fQSwgc3ViY21kKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBEbyBub3RoaW5nICovCisJCWJyZWFrOworCX0KKworCS8qIFdyaXRlIG5lZWRlZCBwYXJhbWV0ZXJzIGFuZCB0aGUgY29tbWFuZCAqLworCXN3aXRjaCAoY21kKSB7CisJCS8qIEFsbCBjb21tYW5kcyB1c2luZyA1IHBhcmFtZXRlcnMgKi8KKwkJLyogQWxsIGNvbW1hbmRzIHVzaW5nIDQgcGFyYW1ldGVycyAqLworCQkvKiBBbGwgY29tbWFuZHMgdXNpbmcgMyBwYXJhbWV0ZXJzICovCisJCS8qIEFsbCBjb21tYW5kcyB1c2luZyAyIHBhcmFtZXRlcnMgKi8KKwljYXNlIE9GRE1fU0NfUkFfUkFNX0NNRF9QUk9DX1NUQVJUOgorCWNhc2UgT0ZETV9TQ19SQV9SQU1fQ01EX1NFVF9QUkVGX1BBUkFNOgorCWNhc2UgT0ZETV9TQ19SQV9SQU1fQ01EX1BST0dSQU1fUEFSQU06CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX1BBUkFNMV9fQSwgcGFyYW0xKTsKKwkJLyogQWxsIGNvbW1hbmRzIHVzaW5nIDEgcGFyYW1ldGVycyAqLworCWNhc2UgT0ZETV9TQ19SQV9SQU1fQ01EX1NFVF9FQ0hPX1RJTUlORzoKKwljYXNlIE9GRE1fU0NfUkFfUkFNX0NNRF9VU0VSX0lPOgorCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9QQVJBTTBfX0EsIHBhcmFtMCk7CisJCS8qIEFsbCBjb21tYW5kcyB1c2luZyAwIHBhcmFtZXRlcnMgKi8KKwljYXNlIE9GRE1fU0NfUkFfUkFNX0NNRF9HRVRfT1BfUEFSQU06CisJY2FzZSBPRkRNX1NDX1JBX1JBTV9DTURfTlVMTDoKKwkJLyogV3JpdGUgY29tbWFuZCAqLworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9DTURfX0EsIGNtZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIFVua25vd24gY29tbWFuZCAqLworCQlzdGF0dXMgPSAtRUlOVkFMOworCX0KKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIFdhaXQgdW50aWwgc2MgaXMgcmVhZHkgcHJvY2Vzc2luZyBjb21tYW5kICovCisJcmV0cnlDbnQgPSAwOworCWRvIHsKKwkJbXNsZWVwKDEpOworCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX0NNRF9fQSwgJmN1ckNtZCk7CisJCXJldHJ5Q250Kys7CisJfSB3aGlsZSAoKGN1ckNtZCAhPSAwKSAmJiAocmV0cnlDbnQgPCBEUlhLX01BWF9SRVRSSUVTKSk7CisJaWYgKHJldHJ5Q250ID49IERSWEtfTUFYX1JFVFJJRVMgJiYgKHN0YXR1cyA8IDApKQorCQlnb3RvIGVycm9yOworCisJLyogQ2hlY2sgZm9yIGlsbGVnYWwgY21kICovCisJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9DTURfQUREUl9fQSwgJmVyckNvZGUpOworCWlmIChlcnJDb2RlID09IDB4RkZGRikgeworCQkvKiBpbGxlZ2FsIGNvbW1hbmQgKi8KKwkJc3RhdHVzID0gLUVJTlZBTDsKKwl9CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBSZXRyZWl2ZSByZXN1bHRzIHBhcmFtZXRlcnMgZnJvbSBTQyAqLworCXN3aXRjaCAoY21kKSB7CisJCS8qIEFsbCBjb21tYW5kcyB5aWVsZGluZyA1IHJlc3VsdHMgKi8KKwkJLyogQWxsIGNvbW1hbmRzIHlpZWxkaW5nIDQgcmVzdWx0cyAqLworCQkvKiBBbGwgY29tbWFuZHMgeWllbGRpbmcgMyByZXN1bHRzICovCisJCS8qIEFsbCBjb21tYW5kcyB5aWVsZGluZyAyIHJlc3VsdHMgKi8KKwkJLyogQWxsIGNvbW1hbmRzIHlpZWxkaW5nIDEgcmVzdWx0ICovCisJY2FzZSBPRkRNX1NDX1JBX1JBTV9DTURfVVNFUl9JTzoKKwljYXNlIE9GRE1fU0NfUkFfUkFNX0NNRF9HRVRfT1BfUEFSQU06CisJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fUEFSQU0wX19BLCAmKHBhcmFtMCkpOworCQkvKiBBbGwgY29tbWFuZHMgeWllbGRpbmcgMCByZXN1bHRzICovCisJY2FzZSBPRkRNX1NDX1JBX1JBTV9DTURfU0VUX0VDSE9fVElNSU5HOgorCWNhc2UgT0ZETV9TQ19SQV9SQU1fQ01EX1NFVF9USU1FUjoKKwljYXNlIE9GRE1fU0NfUkFfUkFNX0NNRF9QUk9DX1NUQVJUOgorCWNhc2UgT0ZETV9TQ19SQV9SQU1fQ01EX1NFVF9QUkVGX1BBUkFNOgorCWNhc2UgT0ZETV9TQ19SQV9SQU1fQ01EX1BST0dSQU1fUEFSQU06CisJY2FzZSBPRkRNX1NDX1JBX1JBTV9DTURfTlVMTDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogVW5rbm93biBjb21tYW5kICovCisJCXN0YXR1cyA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0JCQkvKiBzd2l0Y2ggKGNtZC0+Y21kKSAqLworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgUG93ZXJVcERWQlQoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCWVudW0gRFJYUG93ZXJNb2RlIHBvd2VyTW9kZSA9IERSWF9QT1dFUl9VUDsKKwlpbnQgc3RhdHVzOworCisJZHByaW50aygxLCAiXG4iKTsKKwlzdGF0dXMgPSBDdHJsUG93ZXJNb2RlKHN0YXRlLCAmcG93ZXJNb2RlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBEVkJUQ3RybFNldEluY0VuYWJsZShzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsIGJvb2wgKmVuYWJsZWQpCit7CisJaW50IHN0YXR1czsKKworCWRwcmludGsoMSwgIlxuIik7CisJaWYgKCplbmFibGVkID09IHRydWUpCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9DRl9CWVBBU1NERVRfX0EsIDApOworCWVsc2UKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0NGX0JZUEFTU0RFVF9fQSwgMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKKyNkZWZpbmUgREVGQVVMVF9GUl9USFJFU184SyAgICAgNDAwMAorc3RhdGljIGludCBEVkJUQ3RybFNldEZyRW5hYmxlKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgYm9vbCAqZW5hYmxlZCkKK3sKKworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCWlmICgqZW5hYmxlZCA9PSB0cnVlKSB7CisJCS8qIHdyaXRlIG1hc2sgdG8gMSAqLworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9GUl9USFJFU184S19fQSwKKwkJCQkgICBERUZBVUxUX0ZSX1RIUkVTXzhLKTsKKwl9IGVsc2UgeworCQkvKiB3cml0ZSBtYXNrIHRvIDAgKi8KKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fRlJfVEhSRVNfOEtfX0EsIDApOworCX0KKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IERWQlRDdHJsU2V0RWNob1RocmVzaG9sZChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsCisJCQkJICAgIHN0cnVjdCBEUlhLQ2ZnRHZidEVjaG9UaHJlc190ICplY2hvVGhyZXMpCit7CisJdTE2IGRhdGEgPSAwOworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fRUNIT19USFJFU19fQSwgJmRhdGEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3dpdGNoIChlY2hvVGhyZXMtPmZmdE1vZGUpIHsKKwljYXNlIERSWF9GRlRNT0RFXzJLOgorCQlkYXRhICY9IH5PRkRNX1NDX1JBX1JBTV9FQ0hPX1RIUkVTXzJLX19NOworCQlkYXRhIHw9ICgoZWNob1RocmVzLT50aHJlc2hvbGQgPDwKKwkJCU9GRE1fU0NfUkFfUkFNX0VDSE9fVEhSRVNfMktfX0IpCisJCQkmIChPRkRNX1NDX1JBX1JBTV9FQ0hPX1RIUkVTXzJLX19NKSk7CisJCWJyZWFrOworCWNhc2UgRFJYX0ZGVE1PREVfOEs6CisJCWRhdGEgJj0gfk9GRE1fU0NfUkFfUkFNX0VDSE9fVEhSRVNfOEtfX007CisJCWRhdGEgfD0gKChlY2hvVGhyZXMtPnRocmVzaG9sZCA8PAorCQkJT0ZETV9TQ19SQV9SQU1fRUNIT19USFJFU184S19fQikKKwkJCSYgKE9GRE1fU0NfUkFfUkFNX0VDSE9fVEhSRVNfOEtfX00pKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fRUNIT19USFJFU19fQSwgZGF0YSk7CitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBEVkJUQ3RybFNldFNxaVNwZWVkKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwKKwkJCSAgICAgICBlbnVtIERSWEtDZmdEdmJ0U3FpU3BlZWQgKnNwZWVkKQoreworCWludCBzdGF0dXMgPSAtRUlOVkFMOworCisJZHByaW50aygxLCAiXG4iKTsKKworCXN3aXRjaCAoKnNwZWVkKSB7CisJY2FzZSBEUlhLX0RWQlRfU1FJX1NQRUVEX0ZBU1Q6CisJY2FzZSBEUlhLX0RWQlRfU1FJX1NQRUVEX01FRElVTToKKwljYXNlIERSWEtfRFZCVF9TUUlfU1BFRURfU0xPVzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZ290byBlcnJvcjsKKwl9CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9GRUNfUFJFX1JTX0JFUl9GSUxURVJfU0hfX0EsCisJCQkgICAodTE2KSAqc3BlZWQpOworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorKiBcYnJpZWYgQWN0aXZhdGUgRFZCVCBzcGVjaWZpYyBwcmVzZXRzCisqIFxwYXJhbSBkZW1vZCBpbnN0YW5jZSBvZiBkZW1vZHVsYXRvci4KKyogXHJldHVybiBEUlhTdGF0dXNfdC4KKyoKKyogQ2FsbGVkIGluIERWQlRTZXRTdGFuZGFyZAorKgorKi8KK3N0YXRpYyBpbnQgRFZCVEFjdGl2YXRlUHJlc2V0cyhzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUpCit7CisJaW50IHN0YXR1czsKKwlib29sIHNldGluY2VuYWJsZSA9IGZhbHNlOworCWJvb2wgc2V0ZnJlbmFibGUgPSB0cnVlOworCisJc3RydWN0IERSWEtDZmdEdmJ0RWNob1RocmVzX3QgZWNob1RocmVzMmsgPSB7IDAsIERSWF9GRlRNT0RFXzJLIH07CisJc3RydWN0IERSWEtDZmdEdmJ0RWNob1RocmVzX3QgZWNob1RocmVzOGsgPSB7IDAsIERSWF9GRlRNT0RFXzhLIH07CisKKwlkcHJpbnRrKDEsICJcbiIpOworCXN0YXR1cyA9IERWQlRDdHJsU2V0SW5jRW5hYmxlKHN0YXRlLCAmc2V0aW5jZW5hYmxlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSBEVkJUQ3RybFNldEZyRW5hYmxlKHN0YXRlLCAmc2V0ZnJlbmFibGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IERWQlRDdHJsU2V0RWNob1RocmVzaG9sZChzdGF0ZSwgJmVjaG9UaHJlczJrKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSBEVkJUQ3RybFNldEVjaG9UaHJlc2hvbGQoc3RhdGUsICZlY2hvVGhyZXM4ayk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9BR0NfSU5HQUlOX1RHVF9NQVhfX0EsIHN0YXRlLT5tX2R2YnRJZkFnY0NmZy5JbmdhaW5UZ3RNYXgpOworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorKiBcYnJpZWYgSW5pdGlhbGl6ZSBjaGFubmVsc3dpdGNoLWluZGVwZW5kZW50IHNldHRpbmdzIGZvciBEVkJULgorKiBccGFyYW0gZGVtb2QgaW5zdGFuY2Ugb2YgZGVtb2R1bGF0b3IuCisqIFxyZXR1cm4gRFJYU3RhdHVzX3QuCisqCisqIEZvciBST00gY29kZSBjaGFubmVsIGZpbHRlciB0YXBzIGFyZSBsb2FkZWQgZnJvbSB0aGUgYm9vdGxvYWRlci4gRm9yIG1pY3JvY29kZQorKiB0aGUgRFZCLVQgdGFwcyBmcm9tIHRoZSBkcnhrX2ZpbHRlcnMuaCBhcmUgdXNlZC4KKyovCitzdGF0aWMgaW50IFNldERWQlRTdGFuZGFyZChzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUsCisJCQkgICBlbnVtIE9wZXJhdGlvbk1vZGUgb01vZGUpCit7CisJdTE2IGNtZFJlc3VsdCA9IDA7CisJdTE2IGRhdGEgPSAwOworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJUG93ZXJVcERWQlQoc3RhdGUpOworCS8qIGFkZGVkIGFudGVubmEgc3dpdGNoICovCisJU3dpdGNoQW50ZW5uYVRvRFZCVChzdGF0ZSk7CisJLyogc2VuZCBPRkRNIHJlc2V0IGNvbW1hbmQgKi8KKwlzdGF0dXMgPSBzY3VfY29tbWFuZChzdGF0ZSwgU0NVX1JBTV9DT01NQU5EX1NUQU5EQVJEX09GRE0gfCBTQ1VfUkFNX0NPTU1BTkRfQ01EX0RFTU9EX1JFU0VULCAwLCBOVUxMLCAxLCAmY21kUmVzdWx0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIHNlbmQgT0ZETSBzZXRlbnYgY29tbWFuZCAqLworCXN0YXR1cyA9IHNjdV9jb21tYW5kKHN0YXRlLCBTQ1VfUkFNX0NPTU1BTkRfU1RBTkRBUkRfT0ZETSB8IFNDVV9SQU1fQ09NTUFORF9DTURfREVNT0RfU0VUX0VOViwgMCwgTlVMTCwgMSwgJmNtZFJlc3VsdCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiByZXNldCBkYXRhcGF0aCBmb3IgT0ZETSwgcHJvY2Vzc29ycyBmaXJzdCAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fU0NfQ09NTV9FWEVDX19BLCBPRkRNX1NDX0NPTU1fRVhFQ19TVE9QKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX0xDX0NPTU1fRVhFQ19fQSwgT0ZETV9MQ19DT01NX0VYRUNfU1RPUCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0NPTU1fRVhFQ19fQSwgSVFNX0NPTU1fRVhFQ19CX1NUT1ApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogSVFNIHNldHVwICovCisJLyogc3luY2hyb25pemUgb24gb2Zkc3RhdGUtPm1fZmVzdGFydCAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9BRl9VUERfU0VMX19BLCAxKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwkvKiB3aW5kb3cgc2l6ZSBmb3IgY2xpcHBpbmcgQURDIGRldGVjdGlvbiAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9BRl9DTFBfTEVOX19BLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwkvKiB3aW5kb3cgc2l6ZSBmb3IgZm9yIHNlbnNlIHByZS1TQVcgZGV0ZWN0aW9uICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0FGX1NOU19MRU5fX0EsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCS8qIHNlbnNlIHRocmVzaG9sZCBmb3Igc2Vuc2UgcHJlLVNBVyBkZXRlY3Rpb24gKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQUZfQU1VWF9fQSwgSVFNX0FGX0FNVVhfU0lHTkFMMkFEQyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gU2V0SXFtQWYoc3RhdGUsIHRydWUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0FGX0FHQ19SRl9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBJbXB1bHNlIG5vaXNlIGNydW5jaGVyIHNldHVwICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0FGX0lOQ19MQ1RfX0EsIDApOwkvKiBjcnVuY2ggaW4gSVFNX0NGICovCisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0NGX0RFVF9MQ1RfX0EsIDApOwkvKiBkZXRlY3QgaW4gSVFNX0NGICovCisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0NGX1dORF9MRU5fX0EsIDMpOwkvKiBwZWFrIGRldGVjdG9yIHdpbmRvdyBsZW5ndGggKi8KKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9SQ19TVFJFVENIX19BLCAxNik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0NGX09VVF9FTkFfX0EsIDB4NCk7CS8qIGVuYWJsZSBvdXRwdXQgMiAqLworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9DRl9EU19FTkFfX0EsIDB4NCk7CS8qIGRlY2ltYXRlIG91dHB1dCAyICovCisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0NGX1NDQUxFX19BLCAxNjAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQ0ZfU0NBTEVfU0hfX0EsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogdmlydHVhbCBjbGlwcGluZyB0aHJlc2hvbGQgZm9yIGNsaXBwaW5nIEFEQyBkZXRlY3Rpb24gKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQUZfQ0xQX1RIX19BLCA0NDgpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9DRl9EQVRBVEhfX0EsIDQ5NSk7CS8qIGNydW5jaGluZyB0aHJlc2hvbGQgKi8KKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IEJMQ2hhaW5DbWQoc3RhdGUsIERSWEtfQkxfUk9NX09GRlNFVF9UQVBTX0RWQlQsIERSWEtfQkxDQ19OUl9FTEVNRU5UU19UQVBTLCBEUlhLX0JMQ19USU1FT1VUKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9DRl9QS0RUSF9fQSwgMik7CS8qIHBlYWsgZGV0ZWN0b3IgdGhyZXNob2xkICovCisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0NGX1BPV19NRUFTX0xFTl9fQSwgMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJLyogZW5hYmxlIHBvd2VyIG1lYXN1cmVtZW50IGludGVycnVwdCAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9DRl9DT01NX0lOVF9NU0tfX0EsIDEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9DT01NX0VYRUNfX0EsIElRTV9DT01NX0VYRUNfQl9BQ1RJVkUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogSVFNIHdpbGwgbm90IGJlIHJlc2V0IGZyb20gaGVyZSwgc3luYyBBREMgYW5kIHVwZGF0ZS9pbml0IEFHQyAqLworCXN0YXR1cyA9IEFEQ1N5bmNocm9uaXphdGlvbihzdGF0ZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gU2V0UHJlU2F3KHN0YXRlLCAmc3RhdGUtPm1fZHZidFByZVNhd0NmZyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBIYWx0IFNDVSB0byBlbmFibGUgc2FmZSBub24tYXRvbWljIGFjY2Vzc2VzICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX0NPTU1fRVhFQ19fQSwgU0NVX0NPTU1fRVhFQ19IT0xEKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IFNldEFnY1JmKHN0YXRlLCAmc3RhdGUtPm1fZHZidFJmQWdjQ2ZnLCB0cnVlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSBTZXRBZ2NJZihzdGF0ZSwgJnN0YXRlLT5tX2R2YnRJZkFnY0NmZywgdHJ1ZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBTZXQgTm9pc2UgRXN0aW1hdGlvbiBub3RjaCB3aWR0aCBhbmQgZW5hYmxlIERDIGZpeCAqLworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fQ09ORklHX19BLCAmZGF0YSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJZGF0YSB8PSBPRkRNX1NDX1JBX1JBTV9DT05GSUdfTkVfRklYX0VOQUJMRV9fTTsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9DT05GSUdfX0EsIGRhdGEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogQWN0aXZhdGUgU0NVIHRvIGVuYWJsZSBTQ1UgY29tbWFuZHMgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfQ09NTV9FWEVDX19BLCBTQ1VfQ09NTV9FWEVDX0FDVElWRSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlpZiAoIXN0YXRlLT5tX0RSWEtfQTNfUk9NX0NPREUpIHsKKwkJLyogQUdDSW5pdCgpIGlzIG5vdCBkb25lIGZvciBEVkJULCBzbyBzZXQgYWdjRmFzdENsaXBDdHJsRGVsYXkgICovCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fQUdDX0ZBU1RfQ0xQX0NUUkxfREVMQVlfX0EsIHN0YXRlLT5tX2R2YnRJZkFnY0NmZy5GYXN0Q2xpcEN0cmxEZWxheSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwl9CisKKwkvKiBPRkRNX1NDIHNldHVwICovCisjaWZkZWYgQ09NUElMRV9GT1JfTk9OUlQKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9CRV9PUFRfREVMQVlfX0EsIDEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX0JFX09QVF9JTklUX0RFTEFZX19BLCAyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKyNlbmRpZgorCisJLyogRkVDIHNldHVwICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX0RJX0lOUFVUX0NUTF9fQSwgMSk7CS8qIE9GRE0gaW5wdXQgKi8KKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCisjaWZkZWYgQ09NUElMRV9GT1JfTk9OUlQKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfUlNfTUVBU1VSRU1FTlRfUEVSSU9EX19BLCAweDQwMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisjZWxzZQorCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19SU19NRUFTVVJFTUVOVF9QRVJJT0RfX0EsIDB4MTAwMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisjZW5kaWYKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfUlNfTUVBU1VSRU1FTlRfUFJFU0NBTEVfX0EsIDB4MDAwMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBTZXR1cCBNUEVHIGJ1cyAqLworCXN0YXR1cyA9IE1QRUdUU0R0b1NldHVwKHN0YXRlLCBPTV9EVkJUKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwkvKiBTZXQgRFZCVCBQcmVzZXRzICovCisJc3RhdHVzID0gRFZCVEFjdGl2YXRlUHJlc2V0cyhzdGF0ZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyoqCisqIFxicmllZiBTdGFydCBkdmJ0IGRlbW9kdWxhdGluZyBmb3IgY2hhbm5lbC4KKyogXHBhcmFtIGRlbW9kIGluc3RhbmNlIG9mIGRlbW9kdWxhdG9yLgorKiBccmV0dXJuIERSWFN0YXR1c190LgorKi8KK3N0YXRpYyBpbnQgRFZCVFN0YXJ0KHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwl1MTYgcGFyYW0xOworCWludCBzdGF0dXM7CisJLyogRFJYS09mZG1TY0NtZF90IHNjQ21kOyAqLworCisJZHByaW50aygxLCAiXG4iKTsKKwkvKiBTdGFydCBjb3JyZWN0IHByb2Nlc3NlcyB0byBnZXQgaW4gbG9jayAqLworCS8qIERSWEs6IE9GRE1fU0NfUkFfUkFNX1BST0NfTE9DS1RSQUNLIGlzIG5vIGxvbmdlciBpbiBtYXBmaWxlISAqLworCXBhcmFtMSA9IE9GRE1fU0NfUkFfUkFNX0xPQ0tUUkFDS19NSU47CisJc3RhdHVzID0gRFZCVFNjQ29tbWFuZChzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fQ01EX1BST0NfU1RBUlQsIDAsIE9GRE1fU0NfUkFfUkFNX1NXX0VWRU5UX1JVTl9OTUFTS19fTSwgcGFyYW0xLCAwLCAwLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwkvKiBTdGFydCBGRUMgT0MgKi8KKwlzdGF0dXMgPSBNUEVHVFNTdGFydChzdGF0ZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX0NPTU1fRVhFQ19fQSwgRkVDX0NPTU1fRVhFQ19BQ1RJVkUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqCisqIFxicmllZiBTZXQgdXAgZHZidCBkZW1vZHVsYXRvciBmb3IgY2hhbm5lbC4KKyogXHBhcmFtIGRlbW9kIGluc3RhbmNlIG9mIGRlbW9kdWxhdG9yLgorKiBccmV0dXJuIERSWFN0YXR1c190LgorKiAvLyBvcmlnaW5hbCBEVkJUU2V0Q2hhbm5lbCgpCisqLworc3RhdGljIGludCBTZXREVkJUKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgdTE2IEludGVybWVkaWF0ZUZyZXFrSHosCisJCSAgIHMzMiB0dW5lckZyZXFPZmZzZXQpCit7CisJdTE2IGNtZFJlc3VsdCA9IDA7CisJdTE2IHRyYW5zbWlzc2lvblBhcmFtcyA9IDA7CisJdTE2IG9wZXJhdGlvbk1vZGUgPSAwOworCXUzMiBpcW1SY1JhdGVPZnMgPSAwOworCXUzMiBiYW5kd2lkdGggPSAwOworCXUxNiBwYXJhbTE7CisJaW50IHN0YXR1czsKKworCWRwcmludGsoMSwgIklGID0lZCwgVEZPID0gJWRcbiIsIEludGVybWVkaWF0ZUZyZXFrSHosIHR1bmVyRnJlcU9mZnNldCk7CisKKwlzdGF0dXMgPSBzY3VfY29tbWFuZChzdGF0ZSwgU0NVX1JBTV9DT01NQU5EX1NUQU5EQVJEX09GRE0gfCBTQ1VfUkFNX0NPTU1BTkRfQ01EX0RFTU9EX1NUT1AsIDAsIE5VTEwsIDEsICZjbWRSZXN1bHQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogSGFsdCBTQ1UgdG8gZW5hYmxlIHNhZmUgbm9uLWF0b21pYyBhY2Nlc3NlcyAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9DT01NX0VYRUNfX0EsIFNDVV9DT01NX0VYRUNfSE9MRCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBTdG9wIHByb2Nlc3NvcnMgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX0NPTU1fRVhFQ19fQSwgT0ZETV9TQ19DT01NX0VYRUNfU1RPUCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgT0ZETV9MQ19DT01NX0VYRUNfX0EsIE9GRE1fTENfQ09NTV9FWEVDX1NUT1ApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogTWFuZGF0b3J5IGZpeCwgYWx3YXlzIHN0b3AgQ1AsIHJlcXVpcmVkIHRvIHNldCBzcGwgb2Zmc2V0IGJhY2sgdG8KKwkJaGFyZHdhcmUgZGVmYXVsdCAoaXMgc2V0IHRvIDAgYnkgdWNvZGUgZHVyaW5nIHBpbG90IGRldGVjdGlvbiAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fQ1BfQ09NTV9FWEVDX19BLCBPRkRNX0NQX0NPTU1fRVhFQ19TVE9QKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qPT0gV3JpdGUgY2hhbm5lbCBzZXR0aW5ncyB0byBkZXZpY2UgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKwkvKiBtb2RlICovCisJc3dpdGNoIChzdGF0ZS0+cGFyYW0udS5vZmRtLnRyYW5zbWlzc2lvbl9tb2RlKSB7CisJY2FzZSBUUkFOU01JU1NJT05fTU9ERV9BVVRPOgorCWRlZmF1bHQ6CisJCW9wZXJhdGlvbk1vZGUgfD0gT0ZETV9TQ19SQV9SQU1fT1BfQVVUT19NT0RFX19NOworCQkvKiBmYWxsIHRocm91Z2ggLCB0cnkgZmlyc3QgZ3Vlc3MgRFJYX0ZGVE1PREVfOEsgKi8KKwljYXNlIFRSQU5TTUlTU0lPTl9NT0RFXzhLOgorCQl0cmFuc21pc3Npb25QYXJhbXMgfD0gT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fTU9ERV84SzsKKwkJYnJlYWs7CisJY2FzZSBUUkFOU01JU1NJT05fTU9ERV8ySzoKKwkJdHJhbnNtaXNzaW9uUGFyYW1zIHw9IE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX01PREVfMks7CisJCWJyZWFrOworCX0KKworCS8qIGd1YXJkICovCisJc3dpdGNoIChzdGF0ZS0+cGFyYW0udS5vZmRtLmd1YXJkX2ludGVydmFsKSB7CisJZGVmYXVsdDoKKwljYXNlIEdVQVJEX0lOVEVSVkFMX0FVVE86CisJCW9wZXJhdGlvbk1vZGUgfD0gT0ZETV9TQ19SQV9SQU1fT1BfQVVUT19HVUFSRF9fTTsKKwkJLyogZmFsbCB0aHJvdWdoICwgdHJ5IGZpcnN0IGd1ZXNzIERSWF9HVUFSRF8xRElWNCAqLworCWNhc2UgR1VBUkRfSU5URVJWQUxfMV80OgorCQl0cmFuc21pc3Npb25QYXJhbXMgfD0gT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fR1VBUkRfNDsKKwkJYnJlYWs7CisJY2FzZSBHVUFSRF9JTlRFUlZBTF8xXzMyOgorCQl0cmFuc21pc3Npb25QYXJhbXMgfD0gT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fR1VBUkRfMzI7CisJCWJyZWFrOworCWNhc2UgR1VBUkRfSU5URVJWQUxfMV8xNjoKKwkJdHJhbnNtaXNzaW9uUGFyYW1zIHw9IE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX0dVQVJEXzE2OworCQlicmVhazsKKwljYXNlIEdVQVJEX0lOVEVSVkFMXzFfODoKKwkJdHJhbnNtaXNzaW9uUGFyYW1zIHw9IE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX0dVQVJEXzg7CisJCWJyZWFrOworCX0KKworCS8qIGhpZXJhcmNoeSAqLworCXN3aXRjaCAoc3RhdGUtPnBhcmFtLnUub2ZkbS5oaWVyYXJjaHlfaW5mb3JtYXRpb24pIHsKKwljYXNlIEhJRVJBUkNIWV9BVVRPOgorCWNhc2UgSElFUkFSQ0hZX05PTkU6CisJZGVmYXVsdDoKKwkJb3BlcmF0aW9uTW9kZSB8PSBPRkRNX1NDX1JBX1JBTV9PUF9BVVRPX0hJRVJfX007CisJCS8qIGZhbGwgdGhyb3VnaCAsIHRyeSBmaXJzdCBndWVzcyBTQ19SQV9SQU1fT1BfUEFSQU1fSElFUl9OTyAqLworCQkvKiB0cmFuc21pc3Npb25QYXJhbXMgfD0gT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fSElFUl9OTzsgKi8KKwkJLyogYnJlYWs7ICovCisJY2FzZSBISUVSQVJDSFlfMToKKwkJdHJhbnNtaXNzaW9uUGFyYW1zIHw9IE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX0hJRVJfQTE7CisJCWJyZWFrOworCWNhc2UgSElFUkFSQ0hZXzI6CisJCXRyYW5zbWlzc2lvblBhcmFtcyB8PSBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9ISUVSX0EyOworCQlicmVhazsKKwljYXNlIEhJRVJBUkNIWV80OgorCQl0cmFuc21pc3Npb25QYXJhbXMgfD0gT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fSElFUl9BNDsKKwkJYnJlYWs7CisJfQorCisKKwkvKiBjb25zdGVsbGF0aW9uICovCisJc3dpdGNoIChzdGF0ZS0+cGFyYW0udS5vZmRtLmNvbnN0ZWxsYXRpb24pIHsKKwljYXNlIFFBTV9BVVRPOgorCWRlZmF1bHQ6CisJCW9wZXJhdGlvbk1vZGUgfD0gT0ZETV9TQ19SQV9SQU1fT1BfQVVUT19DT05TVF9fTTsKKwkJLyogZmFsbCB0aHJvdWdoICwgdHJ5IGZpcnN0IGd1ZXNzIERSWF9DT05TVEVMTEFUSU9OX1FBTTY0ICovCisJY2FzZSBRQU1fNjQ6CisJCXRyYW5zbWlzc2lvblBhcmFtcyB8PSBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9DT05TVF9RQU02NDsKKwkJYnJlYWs7CisJY2FzZSBRUFNLOgorCQl0cmFuc21pc3Npb25QYXJhbXMgfD0gT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fQ09OU1RfUVBTSzsKKwkJYnJlYWs7CisJY2FzZSBRQU1fMTY6CisJCXRyYW5zbWlzc2lvblBhcmFtcyB8PSBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9DT05TVF9RQU0xNjsKKwkJYnJlYWs7CisJfQorI2lmIDAKKwkvKiBObyBoaWVyYWNoaWNhbCBjaGFubmVscyBzdXBwb3J0IGluIEJEQSAqLworCS8qIFByaW9yaXR5IChvbmx5IGZvciBoaWVyYXJjaGljYWwgY2hhbm5lbHMpICovCisJc3dpdGNoIChjaGFubmVsLT5wcmlvcml0eSkgeworCWNhc2UgRFJYX1BSSU9SSVRZX0xPVzoKKwkJdHJhbnNtaXNzaW9uUGFyYW1zIHw9IE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX1BSSU9fTE87CisJCVdSMTYoZGV2QWRkciwgT0ZETV9FQ19TQl9QUklPUl9fQSwKKwkJCU9GRE1fRUNfU0JfUFJJT1JfTE8pOworCQlicmVhazsKKwljYXNlIERSWF9QUklPUklUWV9ISUdIOgorCQl0cmFuc21pc3Npb25QYXJhbXMgfD0gT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fUFJJT19ISTsKKwkJV1IxNihkZXZBZGRyLCBPRkRNX0VDX1NCX1BSSU9SX19BLAorCQkJT0ZETV9FQ19TQl9QUklPUl9ISSkpOworCQlicmVhazsKKwljYXNlIERSWF9QUklPUklUWV9VTktOT1dOOgkvKiBmYWxsIHRocm91Z2ggKi8KKwlkZWZhdWx0OgorCQlzdGF0dXMgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKyNlbHNlCisJLyogU2V0IFByaW9ydHkgaGlnaCAqLworCXRyYW5zbWlzc2lvblBhcmFtcyB8PSBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9QUklPX0hJOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fRUNfU0JfUFJJT1JfX0EsIE9GRE1fRUNfU0JfUFJJT1JfSEkpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworI2VuZGlmCisKKwkvKiBjb2RlcmF0ZSAqLworCXN3aXRjaCAoc3RhdGUtPnBhcmFtLnUub2ZkbS5jb2RlX3JhdGVfSFApIHsKKwljYXNlIEZFQ19BVVRPOgorCWRlZmF1bHQ6CisJCW9wZXJhdGlvbk1vZGUgfD0gT0ZETV9TQ19SQV9SQU1fT1BfQVVUT19SQVRFX19NOworCQkvKiBmYWxsIHRocm91Z2ggLCB0cnkgZmlyc3QgZ3Vlc3MgRFJYX0NPREVSQVRFXzJESVYzICovCisJY2FzZSBGRUNfMl8zOgorCQl0cmFuc21pc3Npb25QYXJhbXMgfD0gT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fUkFURV8yXzM7CisJCWJyZWFrOworCWNhc2UgRkVDXzFfMjoKKwkJdHJhbnNtaXNzaW9uUGFyYW1zIHw9IE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX1JBVEVfMV8yOworCQlicmVhazsKKwljYXNlIEZFQ18zXzQ6CisJCXRyYW5zbWlzc2lvblBhcmFtcyB8PSBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9SQVRFXzNfNDsKKwkJYnJlYWs7CisJY2FzZSBGRUNfNV82OgorCQl0cmFuc21pc3Npb25QYXJhbXMgfD0gT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fUkFURV81XzY7CisJCWJyZWFrOworCWNhc2UgRkVDXzdfODoKKwkJdHJhbnNtaXNzaW9uUGFyYW1zIHw9IE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX1JBVEVfN184OworCQlicmVhazsKKwl9CisKKwkvKiBTQVcgZmlsdGVyIHNlbGVjdGlvbjogbm9ybWFseSBub3QgbmVjZXNhcnJ5LCBidXQgaWYgd2FudGVkCisJCXRoZSBhcHBsaWNhdGlvbiBjYW4gc2VsZWN0IGEgU0FXIGZpbHRlciB2aWEgdGhlIGRyaXZlciBieSB1c2luZyBVSU9zICovCisJLyogRmlyc3QgZGV0ZXJtaW5lIHJlYWwgYmFuZHdpZHRoIChIeikgKi8KKwkvKiBBbHNvIHNldCBkZWxheSBmb3IgaW1wdWxzZSBub2lzZSBjcnVuY2hlciAqLworCS8qIEFsc28gc2V0IHBhcmFtZXRlcnMgZm9yIEVDX09DIGZpeCwgbm90ZSBFQ19PQ19SRUdfVE1EX0hJTF9NQVIgaXMgY2hhbmdlZAorCQlieSBTQyBmb3IgZml4IGZvciBzb21lIDhLLDEvOCBndWFyZCBidXQgaXMgcmVzdG9yZWQgYnkgSW5pdEVDIGFuZCBSZXNldEVDCisJCWZ1bmN0aW9ucyAqLworCXN3aXRjaCAoc3RhdGUtPnBhcmFtLnUub2ZkbS5iYW5kd2lkdGgpIHsKKwljYXNlIEJBTkRXSURUSF9BVVRPOgorCWNhc2UgQkFORFdJRFRIXzhfTUhaOgorCQliYW5kd2lkdGggPSBEUlhLX0JBTkRXSURUSF84TUhaX0lOX0haOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9TUk1NX0ZJWF9GQUNUXzhLX19BLCAzMDUyKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQkvKiBjb2NoYW5uZWwgcHJvdGVjdGlvbiBmb3IgUEFMIDggTUh6ICovCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX05JX0lOSVRfOEtfUEVSX0xFRlRfX0EsIDcpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX05JX0lOSVRfOEtfUEVSX1JJR0hUX19BLCA3KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9OSV9JTklUXzJLX1BFUl9MRUZUX19BLCA3KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9OSV9JTklUXzJLX1BFUl9SSUdIVF9fQSwgMSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJYnJlYWs7CisJY2FzZSBCQU5EV0lEVEhfN19NSFo6CisJCWJhbmR3aWR0aCA9IERSWEtfQkFORFdJRFRIXzdNSFpfSU5fSFo7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX1NSTU1fRklYX0ZBQ1RfOEtfX0EsIDM0OTEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCS8qIGNvY2hhbm5lbCBwcm90ZWN0aW9uIGZvciBQQUwgNyBNSHogKi8KKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fTklfSU5JVF84S19QRVJfTEVGVF9fQSwgOCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fTklfSU5JVF84S19QRVJfUklHSFRfX0EsIDgpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX05JX0lOSVRfMktfUEVSX0xFRlRfX0EsIDQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX05JX0lOSVRfMktfUEVSX1JJR0hUX19BLCAxKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlicmVhazsKKwljYXNlIEJBTkRXSURUSF82X01IWjoKKwkJYmFuZHdpZHRoID0gRFJYS19CQU5EV0lEVEhfNk1IWl9JTl9IWjsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fU1JNTV9GSVhfRkFDVF84S19fQSwgNDA3Myk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJLyogY29jaGFubmVsIHByb3RlY3Rpb24gZm9yIE5UU0MgNiBNSHogKi8KKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fTklfSU5JVF84S19QRVJfTEVGVF9fQSwgMTkpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX05JX0lOSVRfOEtfUEVSX1JJR0hUX19BLCAxOSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fTklfSU5JVF8yS19QRVJfTEVGVF9fQSwgMTQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fU0NfUkFfUkFNX05JX0lOSVRfMktfUEVSX1JJR0hUX19BLCAxKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzdGF0dXMgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKworCWlmIChpcW1SY1JhdGVPZnMgPT0gMCkgeworCQkvKiBOb3cgY29tcHV0ZSBJUU1fUkNfUkFURV9PRlMKKwkJCSgoKFN5c0ZyZXEvQmFuZFdpZHRoKS8yKS8yKSAtMSkgKiAyXjIzKQorCQkJPT4KKwkJCSgoU3lzRnJlcSAvIEJhbmRXaWR0aCkgKiAoMl4yMSkpIC0gKDJeMjMpCisJCQkqLworCQkvKiAoU3lzRnJlcSAvIEJhbmRXaWR0aCkgKiAoMl4yOCkgICovCisJCS8qIGFzc2VydCAoTUFYKHN5c0NsaykvTUlOKGJhbmR3aWR0aCkgPCAxNikKKwkJCT0+IGFzc2VydChNQVgoc3lzQ2xrKSA8IDE2Kk1JTihiYW5kd2lkdGgpKQorCQkJPT4gYXNzZXJ0KDEwOTcxNDI3MiA+IDQ4MDAwMDAwKSA9IHRydWUgc28gRnJhYyAyOCBjYW4gYmUgdXNlZCAgKi8KKwkJaXFtUmNSYXRlT2ZzID0gRnJhYzI4YSgodTMyKQorCQkJCQkoKHN0YXRlLT5tX3N5c0Nsb2NrRnJlcSAqCisJCQkJCQkxMDAwKSAvIDMpLCBiYW5kd2lkdGgpOworCQkvKiAoU3lzRnJlcSAvIEJhbmRXaWR0aCkgKiAoMl4yMSksIHJvdW5kaW5nIGJlZm9yZSB0cnVuY2F0aW5nICAqLworCQlpZiAoKGlxbVJjUmF0ZU9mcyAmIDB4N2ZMKSA+PSAweDQwKQorCQkJaXFtUmNSYXRlT2ZzICs9IDB4ODBMOworCQlpcW1SY1JhdGVPZnMgPSBpcW1SY1JhdGVPZnMgPj4gNzsKKwkJLyogKChTeXNGcmVxIC8gQmFuZFdpZHRoKSAqICgyXjIxKSkgLSAoMl4yMykgICovCisJCWlxbVJjUmF0ZU9mcyA9IGlxbVJjUmF0ZU9mcyAtICgxIDw8IDIzKTsKKwl9CisKKwlpcW1SY1JhdGVPZnMgJj0KKwkJKCgoKHUzMikgSVFNX1JDX1JBVEVfT0ZTX0hJX19NKSA8PAorCQlJUU1fUkNfUkFURV9PRlNfTE9fX1cpIHwgSVFNX1JDX1JBVEVfT0ZTX0xPX19NKTsKKwlzdGF0dXMgPSB3cml0ZTMyKHN0YXRlLCBJUU1fUkNfUkFURV9PRlNfTE9fX0EsIGlxbVJjUmF0ZU9mcyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBCYW5kd2lkdGggc2V0dGluZyBkb25lICovCisKKyNpZiAwCisJc3RhdHVzID0gRFZCVFNldEZyZXF1ZW5jeVNoaWZ0KGRlbW9kLCBjaGFubmVsLCB0dW5lck9mZnNldCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisjZW5kaWYKKwlzdGF0dXMgPSBTZXRGcmVxdWVuY3lTaGlmdGVyKHN0YXRlLCBJbnRlcm1lZGlhdGVGcmVxa0h6LCB0dW5lckZyZXFPZmZzZXQsIHRydWUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyo9PSBTdGFydCBTQywgd3JpdGUgY2hhbm5lbCBzZXR0aW5ncyB0byBTQyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCS8qIEFjdGl2YXRlIFNDVSB0byBlbmFibGUgU0NVIGNvbW1hbmRzICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX0NPTU1fRVhFQ19fQSwgU0NVX0NPTU1fRVhFQ19BQ1RJVkUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogRW5hYmxlIFNDIGFmdGVyIHNldHRpbmcgYWxsIG90aGVyIHBhcmFtZXRlcnMgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBPRkRNX1NDX0NPTU1fU1RBVEVfX0EsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIE9GRE1fU0NfQ09NTV9FWEVDX19BLCAxKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCisJc3RhdHVzID0gc2N1X2NvbW1hbmQoc3RhdGUsIFNDVV9SQU1fQ09NTUFORF9TVEFOREFSRF9PRkRNIHwgU0NVX1JBTV9DT01NQU5EX0NNRF9ERU1PRF9TVEFSVCwgMCwgTlVMTCwgMSwgJmNtZFJlc3VsdCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBXcml0ZSBTQyBwYXJhbWV0ZXIgcmVnaXN0ZXJzLCBzZXQgYWxsIEFVVE8gZmxhZ3MgaW4gb3BlcmF0aW9uIG1vZGUgKi8KKwlwYXJhbTEgPSAoT0ZETV9TQ19SQV9SQU1fT1BfQVVUT19NT0RFX19NIHwKKwkJCU9GRE1fU0NfUkFfUkFNX09QX0FVVE9fR1VBUkRfX00gfAorCQkJT0ZETV9TQ19SQV9SQU1fT1BfQVVUT19DT05TVF9fTSB8CisJCQlPRkRNX1NDX1JBX1JBTV9PUF9BVVRPX0hJRVJfX00gfAorCQkJT0ZETV9TQ19SQV9SQU1fT1BfQVVUT19SQVRFX19NKTsKKwlzdGF0dXMgPSBEVkJUU2NDb21tYW5kKHN0YXRlLCBPRkRNX1NDX1JBX1JBTV9DTURfU0VUX1BSRUZfUEFSQU0sCisJCQkJMCwgdHJhbnNtaXNzaW9uUGFyYW1zLCBwYXJhbTEsIDAsIDAsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJaWYgKCFzdGF0ZS0+bV9EUlhLX0EzX1JPTV9DT0RFKQorCQlzdGF0dXMgPSBEVkJUQ3RybFNldFNxaVNwZWVkKHN0YXRlLCAmc3RhdGUtPm1fc3FpU3BlZWQpOworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCisJcmV0dXJuIHN0YXR1czsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioKKyogXGJyaWVmIFJldHJlaXZlIGxvY2sgc3RhdHVzIC4KKyogXHBhcmFtIGRlbW9kICAgIFBvaW50ZXIgdG8gZGVtb2R1bGF0b3IgaW5zdGFuY2UuCisqIFxwYXJhbSBsb2NrU3RhdCBQb2ludGVyIHRvIGxvY2sgc3RhdHVzIHN0cnVjdHVyZS4KKyogXHJldHVybiBEUlhTdGF0dXNfdC4KKyoKKyovCitzdGF0aWMgaW50IEdldERWQlRMb2NrU3RhdHVzKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgdTMyICpwTG9ja1N0YXR1cykKK3sKKwlpbnQgc3RhdHVzOworCWNvbnN0IHUxNiBtcGVnX2xvY2tfbWFzayA9IChPRkRNX1NDX1JBX1JBTV9MT0NLX01QRUdfX00gfAorCQkJCSAgICBPRkRNX1NDX1JBX1JBTV9MT0NLX0ZFQ19fTSk7CisJY29uc3QgdTE2IGZlY19sb2NrX21hc2sgPSAoT0ZETV9TQ19SQV9SQU1fTE9DS19GRUNfX00pOworCWNvbnN0IHUxNiBkZW1vZF9sb2NrX21hc2sgPSBPRkRNX1NDX1JBX1JBTV9MT0NLX0RFTU9EX19NOworCisJdTE2IFNjUmFSYW1Mb2NrID0gMDsKKwl1MTYgU2NDb21tRXhlYyA9IDA7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJKnBMb2NrU3RhdHVzID0gTk9UX0xPQ0tFRDsKKwkvKiBkcml2ZXIgMC45LjAgKi8KKwkvKiBDaGVjayBpZiBTQyBpcyBydW5uaW5nICovCisJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBPRkRNX1NDX0NPTU1fRVhFQ19fQSwgJlNjQ29tbUV4ZWMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVuZDsKKwlpZiAoU2NDb21tRXhlYyA9PSBPRkRNX1NDX0NPTU1fRVhFQ19TVE9QKQorCQlnb3RvIGVuZDsKKworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgT0ZETV9TQ19SQV9SQU1fTE9DS19fQSwgJlNjUmFSYW1Mb2NrKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlbmQ7CisKKwlpZiAoKFNjUmFSYW1Mb2NrICYgbXBlZ19sb2NrX21hc2spID09IG1wZWdfbG9ja19tYXNrKQorCQkqcExvY2tTdGF0dXMgPSBNUEVHX0xPQ0s7CisJZWxzZSBpZiAoKFNjUmFSYW1Mb2NrICYgZmVjX2xvY2tfbWFzaykgPT0gZmVjX2xvY2tfbWFzaykKKwkJKnBMb2NrU3RhdHVzID0gRkVDX0xPQ0s7CisJZWxzZSBpZiAoKFNjUmFSYW1Mb2NrICYgZGVtb2RfbG9ja19tYXNrKSA9PSBkZW1vZF9sb2NrX21hc2spCisJCSpwTG9ja1N0YXR1cyA9IERFTU9EX0xPQ0s7CisJZWxzZSBpZiAoU2NSYVJhbUxvY2sgJiBPRkRNX1NDX1JBX1JBTV9MT0NLX05PRFZCVF9fTSkKKwkJKnBMb2NrU3RhdHVzID0gTkVWRVJfTE9DSzsKK2VuZDoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IFBvd2VyVXBRQU0oc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCWVudW0gRFJYUG93ZXJNb2RlIHBvd2VyTW9kZSA9IERSWEtfUE9XRVJfRE9XTl9PRkRNOworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCXN0YXR1cyA9IEN0cmxQb3dlck1vZGUoc3RhdGUsICZwb3dlck1vZGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKworLyoqIFBvd2VyIERvd24gUUFNICovCitzdGF0aWMgaW50IFBvd2VyRG93blFBTShzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUpCit7CisJdTE2IGRhdGEgPSAwOworCXUxNiBjbWRSZXN1bHQ7CisJaW50IHN0YXR1cyA9IDA7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgU0NVX0NPTU1fRVhFQ19fQSwgJmRhdGEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCWlmIChkYXRhID09IFNDVV9DT01NX0VYRUNfQUNUSVZFKSB7CisJCS8qCisJCQlTVE9QIGRlbW9kdWxhdG9yCisJCQlRQU0gYW5kIEhXIGJsb2NrcworCQkJKi8KKwkJLyogc3RvcCBhbGwgY29tc3RhdGUtPm1fZXhlYyAqLworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fQ09NTV9FWEVDX19BLCBRQU1fQ09NTV9FWEVDX1NUT1ApOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IHNjdV9jb21tYW5kKHN0YXRlLCBTQ1VfUkFNX0NPTU1BTkRfU1RBTkRBUkRfUUFNIHwgU0NVX1JBTV9DT01NQU5EX0NNRF9ERU1PRF9TVE9QLCAwLCBOVUxMLCAxLCAmY21kUmVzdWx0KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCX0KKwkvKiBwb3dlcmRvd24gQUZFICAgICAgICAgICAgICAgICAgICovCisJc3RhdHVzID0gU2V0SXFtQWYoc3RhdGUsIGZhbHNlKTsKKworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCisJcmV0dXJuIHN0YXR1czsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqCisqIFxicmllZiBTZXR1cCBvZiB0aGUgUUFNIE1lYXN1cmVtZW50IGludGVydmFscyBmb3Igc2lnbmFsIHF1YWxpdHkKKyogXHBhcmFtIGRlbW9kIGluc3RhbmNlIG9mIGRlbW9kLgorKiBccGFyYW0gY29uc3RlbGxhdGlvbiBjdXJyZW50IGNvbnN0ZWxsYXRpb24uCisqIFxyZXR1cm4gRFJYU3RhdHVzX3QuCisqCisqICBOT1RFOgorKiAgVGFrZSBpbnRvIGFjY291bnQgdGhhdCBmb3IgY2VydGFpbiBzZXR0aW5ncyB0aGUgZXJyb3Jjb3VudGVycyBjYW4gb3ZlcmZsb3cuCisqICBUaGUgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgY2hlY2sgdGhpcy4KKyoKKyovCitzdGF0aWMgaW50IFNldFFBTU1lYXN1cmVtZW50KHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwKKwkJCSAgICAgZW51bSBFRHJ4a0NvbnN0ZWxsYXRpb24gY29uc3RlbGxhdGlvbiwKKwkJCSAgICAgdTMyIHN5bWJvbFJhdGUpCit7CisJdTMyIGZlY0JpdHNEZXNpcmVkID0gMDsJLyogQkVSIGFjY291bnRpbmcgcGVyaW9kICovCisJdTMyIGZlY1JzUGVyaW9kVG90YWwgPSAwOwkvKiBUb3RhbCBwZXJpb2QgKi8KKwl1MTYgZmVjUnNQcmVzY2FsZSA9IDA7CS8qIFJlZWRTb2xvbW9uIE1lYXN1cmVtZW50IFByZXNjYWxlICovCisJdTE2IGZlY1JzUGVyaW9kID0gMDsJLyogVmFsdWUgZm9yIGNvcnJlc3BvbmRpbmcgSTJDIHJlZ2lzdGVyICovCisJaW50IHN0YXR1cyA9IDA7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJZmVjUnNQcmVzY2FsZSA9IDE7CisJLyogZmVjQml0c0Rlc2lyZWQgPSBzeW1ib2xSYXRlIFtrSHpdICoKKwkJRnJhbWVMZW5naHQgW21zXSAqCisJCShjb25zdGVsbGF0aW9uICsgMSkgKgorCQlTeW5jTG9zcyAoPT0gMSkgKgorCQlWaXRlcmJpTG9zcyAoPT0xKQorCQkqLworCXN3aXRjaCAoY29uc3RlbGxhdGlvbikgeworCWNhc2UgRFJYX0NPTlNURUxMQVRJT05fUUFNMTY6CisJCWZlY0JpdHNEZXNpcmVkID0gNCAqIHN5bWJvbFJhdGU7CisJCWJyZWFrOworCWNhc2UgRFJYX0NPTlNURUxMQVRJT05fUUFNMzI6CisJCWZlY0JpdHNEZXNpcmVkID0gNSAqIHN5bWJvbFJhdGU7CisJCWJyZWFrOworCWNhc2UgRFJYX0NPTlNURUxMQVRJT05fUUFNNjQ6CisJCWZlY0JpdHNEZXNpcmVkID0gNiAqIHN5bWJvbFJhdGU7CisJCWJyZWFrOworCWNhc2UgRFJYX0NPTlNURUxMQVRJT05fUUFNMTI4OgorCQlmZWNCaXRzRGVzaXJlZCA9IDcgKiBzeW1ib2xSYXRlOworCQlicmVhazsKKwljYXNlIERSWF9DT05TVEVMTEFUSU9OX1FBTTI1NjoKKwkJZmVjQml0c0Rlc2lyZWQgPSA4ICogc3ltYm9sUmF0ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwl9CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlmZWNCaXRzRGVzaXJlZCAvPSAxMDAwOwkvKiBzeW1ib2xSYXRlIFtIel0gLT4gc3ltYm9sUmF0ZSBba0h6XSAgKi8KKwlmZWNCaXRzRGVzaXJlZCAqPSA1MDA7CS8qIG1lYXMuIHBlcmlvZCBbbXNdICovCisKKwkvKiBBbm5leCBBL0M6IGJpdHMvUnNQZXJpb2QgPSAyMDQgKiA4ID0gMTYzMiAqLworCS8qIGZlY1JzUGVyaW9kVG90YWwgPSBmZWNCaXRzRGVzaXJlZCAvIDE2MzIgKi8KKwlmZWNSc1BlcmlvZFRvdGFsID0gKGZlY0JpdHNEZXNpcmVkIC8gMTYzMlVMKSArIDE7CS8qIHJvdWdobHkgY2VpbCAqLworCisJLyogZmVjUnNQZXJpb2RUb3RhbCA9ICBmZWNSc1ByZXNjYWxlICogZmVjUnNQZXJpb2QgICovCisJZmVjUnNQcmVzY2FsZSA9IDEgKyAodTE2KSAoZmVjUnNQZXJpb2RUb3RhbCA+PiAxNik7CisJaWYgKGZlY1JzUHJlc2NhbGUgPT0gMCkgeworCQkvKiBEaXZpZGUgYnkgemVybyAodGhvdWdoIGltcG9zc2libGUpICovCisJCXN0YXR1cyA9IC1FSU5WQUw7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwl9CisJZmVjUnNQZXJpb2QgPQorCQkoKHUxNikgZmVjUnNQZXJpb2RUb3RhbCArCisJCShmZWNSc1ByZXNjYWxlID4+IDEpKSAvIGZlY1JzUHJlc2NhbGU7CisKKwkvKiB3cml0ZSBjb3JyZXNwb25kaW5nIHJlZ2lzdGVycyAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19SU19NRUFTVVJFTUVOVF9QRVJJT0RfX0EsIGZlY1JzUGVyaW9kKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBGRUNfUlNfTUVBU1VSRU1FTlRfUFJFU0NBTEVfX0EsIGZlY1JzUHJlc2NhbGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19PQ19TTkNfRkFJTF9QRVJJT0RfX0EsIGZlY1JzUGVyaW9kKTsKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IFNldFFBTTE2KHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCWRwcmludGsoMSwgIlxuIik7CisJLyogUUFNIEVxdWFsaXplciBTZXR1cCAqLworCS8qIEVxdWFsaXplciAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQwX19BLCAxMzUxNyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDFfX0EsIDEzNTE3KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFEMl9fQSwgMTM1MTcpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQzX19BLCAxMzUxNyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDRfX0EsIDEzNTE3KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFENV9fQSwgMTM1MTcpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCS8qIERlY2lzaW9uIEZlZWRiYWNrIEVxdWFsaXplciAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9EUV9RVUFMX0ZVTjBfX0EsIDIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9EUV9RVUFMX0ZVTjFfX0EsIDIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9EUV9RVUFMX0ZVTjJfX0EsIDIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9EUV9RVUFMX0ZVTjNfX0EsIDIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9EUV9RVUFMX0ZVTjRfX0EsIDIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9EUV9RVUFMX0ZVTjVfX0EsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX1NZX1NZTkNfSFdNX19BLCA1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fU1lfU1lOQ19BV01fX0EsIDQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9TWV9TWU5DX0xXTV9fQSwgMyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBRQU0gU2xpY2VyIFNldHRpbmdzICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fU0xfU0lHX1BPV0VSX19BLCBEUlhLX1FBTV9TTF9TSUdfUE9XRVJfUUFNMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogUUFNIExvb3AgQ29udHJvbGxlciBDb2VmaWNpZW50cyAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NBX0ZJTkVfX0EsIDE1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DQV9DT0FSU0VfX0EsIDQwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19FUF9GSU5FX19BLCAxMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRVBfTUVESVVNX19BLCAyNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRVBfQ09BUlNFX19BLCAyNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRUlfRklORV9fQSwgMTIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VJX01FRElVTV9fQSwgMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VJX0NPQVJTRV9fQSwgMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ1BfRklORV9fQSwgNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ1BfTUVESVVNX19BLCAyMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ1BfQ09BUlNFX19BLCA4MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0lfRklORV9fQSwgNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0lfTUVESVVNX19BLCAyMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0lfQ09BUlNFX19BLCA1MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0ZfRklORV9fQSwgMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGX01FRElVTV9fQSwgMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGX0NPQVJTRV9fQSwgMzIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGMV9GSU5FX19BLCA1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DRjFfTUVESVVNX19BLCAxMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0YxX0NPQVJTRV9fQSwgMTApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisKKwkvKiBRQU0gU3RhdGUgTWFjaGluZSAoRlNNKSBUaHJlc2hvbGRzICovCisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fUlRIX19BLCAxNDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9GVEhfX0EsIDUwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fQ1RIX19BLCA5NSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX1BUSF9fQSwgMTIwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fUVRIX19BLCAyMzApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9NVEhfX0EsIDEwNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fUkFURV9MSU1fX0EsIDQwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fQ09VTlRfTElNX19BLCA0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fRlJFUV9MSU1fX0EsIDI0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCisJLyogUUFNIEZTTSBUcmFja2luZyBQYXJhbWV0ZXJzICovCisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTUVESUFOX0FWX01VTFRfX0EsICh1MTYpIDE2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fUkFESVVTX0FWX0xJTUlUX19BLCAodTE2KSAyMjApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQxX19BLCAodTE2KSAyNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0xDQVZHX09GRlNFVDJfX0EsICh1MTYpIDYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQzX19BLCAodTE2KSAtMjQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQ0X19BLCAodTE2KSAtNjUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQ1X19BLCAodTE2KSAtMTI3KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorKiBcYnJpZWYgUUFNMzIgc3BlY2lmaWMgc2V0dXAKKyogXHBhcmFtIGRlbW9kIGluc3RhbmNlIG9mIGRlbW9kLgorKiBccmV0dXJuIERSWFN0YXR1c190LgorKi8KK3N0YXRpYyBpbnQgU2V0UUFNMzIoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCWludCBzdGF0dXMgPSAwOworCisJZHByaW50aygxLCAiXG4iKTsKKworCS8qIFFBTSBFcXVhbGl6ZXIgU2V0dXAgKi8KKwkvKiBFcXVhbGl6ZXIgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFEMF9fQSwgNjcwNyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDFfX0EsIDY3MDcpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQyX19BLCA2NzA3KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFEM19fQSwgNjcwNyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDRfX0EsIDY3MDcpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQ1X19BLCA2NzA3KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIERlY2lzaW9uIEZlZWRiYWNrIEVxdWFsaXplciAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9EUV9RVUFMX0ZVTjBfX0EsIDMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9EUV9RVUFMX0ZVTjFfX0EsIDMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9EUV9RVUFMX0ZVTjJfX0EsIDMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9EUV9RVUFMX0ZVTjNfX0EsIDMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9EUV9RVUFMX0ZVTjRfX0EsIDMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9EUV9RVUFMX0ZVTjVfX0EsIDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX1NZX1NZTkNfSFdNX19BLCA2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fU1lfU1lOQ19BV01fX0EsIDUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9TWV9TWU5DX0xXTV9fQSwgMyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBRQU0gU2xpY2VyIFNldHRpbmdzICovCisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9TTF9TSUdfUE9XRVJfX0EsIERSWEtfUUFNX1NMX1NJR19QT1dFUl9RQU0zMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKworCS8qIFFBTSBMb29wIENvbnRyb2xsZXIgQ29lZmljaWVudHMgKi8KKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NBX0ZJTkVfX0EsIDE1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DQV9DT0FSU0VfX0EsIDQwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19FUF9GSU5FX19BLCAxMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRVBfTUVESVVNX19BLCAyNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRVBfQ09BUlNFX19BLCAyNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRUlfRklORV9fQSwgMTIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VJX01FRElVTV9fQSwgMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VJX0NPQVJTRV9fQSwgMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ1BfRklORV9fQSwgNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ1BfTUVESVVNX19BLCAyMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ1BfQ09BUlNFX19BLCA4MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0lfRklORV9fQSwgNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0lfTUVESVVNX19BLCAyMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0lfQ09BUlNFX19BLCA1MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0ZfRklORV9fQSwgMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGX01FRElVTV9fQSwgMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGX0NPQVJTRV9fQSwgMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGMV9GSU5FX19BLCA1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DRjFfTUVESVVNX19BLCAxMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0YxX0NPQVJTRV9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKworCS8qIFFBTSBTdGF0ZSBNYWNoaW5lIChGU00pIFRocmVzaG9sZHMgKi8KKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9SVEhfX0EsIDkwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fRlRIX19BLCA1MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0NUSF9fQSwgODApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9QVEhfX0EsIDEwMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX1FUSF9fQSwgMTcwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTVRIX19BLCAxMDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX1JBVEVfTElNX19BLCA0MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0NPVU5UX0xJTV9fQSwgNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0ZSRVFfTElNX19BLCAxMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKworCS8qIFFBTSBGU00gVHJhY2tpbmcgUGFyYW1ldGVycyAqLworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX01FRElBTl9BVl9NVUxUX19BLCAodTE2KSAxMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX1JBRElVU19BVl9MSU1JVF9fQSwgKHUxNikgMTQwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTENBVkdfT0ZGU0VUMV9fQSwgKHUxNikgLTgpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQyX19BLCAodTE2KSAtMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQzX19BLCAodTE2KSAtMjYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQ0X19BLCAodTE2KSAtNTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQ1X19BLCAodTE2KSAtODYpOworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorKiBcYnJpZWYgUUFNNjQgc3BlY2lmaWMgc2V0dXAKKyogXHBhcmFtIGRlbW9kIGluc3RhbmNlIG9mIGRlbW9kLgorKiBccmV0dXJuIERSWFN0YXR1c190LgorKi8KK3N0YXRpYyBpbnQgU2V0UUFNNjQoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCWludCBzdGF0dXMgPSAwOworCisJZHByaW50aygxLCAiXG4iKTsKKwkvKiBRQU0gRXF1YWxpemVyIFNldHVwICovCisJLyogRXF1YWxpemVyICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDBfX0EsIDEzMzM2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFEMV9fQSwgMTI2MTgpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQyX19BLCAxMTk4OCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDNfX0EsIDEzODA5KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFENF9fQSwgMTM4MDkpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQ1X19BLCAxNTYwOSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBEZWNpc2lvbiBGZWVkYmFjayBFcXVhbGl6ZXIgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU4wX19BLCA0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU4xX19BLCA0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU4yX19BLCA0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU4zX19BLCA0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU40X19BLCAzKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU41X19BLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9TWV9TWU5DX0hXTV9fQSwgNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX1NZX1NZTkNfQVdNX19BLCA0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fU1lfU1lOQ19MV01fX0EsIDMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogUUFNIFNsaWNlciBTZXR0aW5ncyAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX1NMX1NJR19QT1dFUl9fQSwgRFJYS19RQU1fU0xfU0lHX1BPV0VSX1FBTTY0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCisJLyogUUFNIExvb3AgQ29udHJvbGxlciBDb2VmaWNpZW50cyAqLworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0FfRklORV9fQSwgMTUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NBX0NPQVJTRV9fQSwgNDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VQX0ZJTkVfX0EsIDEyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19FUF9NRURJVU1fX0EsIDI0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19FUF9DT0FSU0VfX0EsIDI0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19FSV9GSU5FX19BLCAxMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRUlfTUVESVVNX19BLCAxNik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRUlfQ09BUlNFX19BLCAxNik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DUF9GSU5FX19BLCA1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DUF9NRURJVU1fX0EsIDMwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DUF9DT0FSU0VfX0EsIDEwMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0lfRklORV9fQSwgNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0lfTUVESVVNX19BLCAzMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0lfQ09BUlNFX19BLCA1MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0ZfRklORV9fQSwgMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGX01FRElVTV9fQSwgMjUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGX0NPQVJTRV9fQSwgNDgpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGMV9GSU5FX19BLCA1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DRjFfTUVESVVNX19BLCAxMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0YxX0NPQVJTRV9fQSwgMTApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisKKwkvKiBRQU0gU3RhdGUgTWFjaGluZSAoRlNNKSBUaHJlc2hvbGRzICovCisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fUlRIX19BLCAxMDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9GVEhfX0EsIDYwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fQ1RIX19BLCA4MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX1BUSF9fQSwgMTEwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fUVRIX19BLCAyMDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9NVEhfX0EsIDk1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9SQVRFX0xJTV9fQSwgNDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9DT1VOVF9MSU1fX0EsIDQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9GUkVRX0xJTV9fQSwgMTUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisKKwkvKiBRQU0gRlNNIFRyYWNraW5nIFBhcmFtZXRlcnMgKi8KKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9NRURJQU5fQVZfTVVMVF9fQSwgKHUxNikgMTIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9SQURJVVNfQVZfTElNSVRfX0EsICh1MTYpIDE0MSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0xDQVZHX09GRlNFVDFfX0EsICh1MTYpIDcpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQyX19BLCAodTE2KSAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTENBVkdfT0ZGU0VUM19fQSwgKHUxNikgLTE1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTENBVkdfT0ZGU0VUNF9fQSwgKHUxNikgLTQ1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTENBVkdfT0ZGU0VUNV9fQSwgKHUxNikgLTgwKTsKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qKgorKiBcYnJpZWYgUUFNMTI4IHNwZWNpZmljIHNldHVwCisqIFxwYXJhbSBkZW1vZDogaW5zdGFuY2Ugb2YgZGVtb2QuCisqIFxyZXR1cm4gRFJYU3RhdHVzX3QuCisqLworc3RhdGljIGludCBTZXRRQU0xMjgoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCWludCBzdGF0dXMgPSAwOworCisJZHByaW50aygxLCAiXG4iKTsKKwkvKiBRQU0gRXF1YWxpemVyIFNldHVwICovCisJLyogRXF1YWxpemVyICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDBfX0EsIDY1NjQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQxX19BLCA2NTk4KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFEMl9fQSwgNjM5NCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDNfX0EsIDY0MDkpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQ0X19BLCA2NjU2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFENV9fQSwgNzIzOCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBEZWNpc2lvbiBGZWVkYmFjayBFcXVhbGl6ZXIgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU4wX19BLCA2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU4xX19BLCA2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU4yX19BLCA2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU4zX19BLCA2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU40X19BLCA1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fRFFfUVVBTF9GVU41X19BLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9TWV9TWU5DX0hXTV9fQSwgNik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX1NZX1NZTkNfQVdNX19BLCA1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fU1lfU1lOQ19MV01fX0EsIDMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisKKwkvKiBRQU0gU2xpY2VyIFNldHRpbmdzICovCisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9TTF9TSUdfUE9XRVJfX0EsIERSWEtfUUFNX1NMX1NJR19QT1dFUl9RQU0xMjgpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisKKwkvKiBRQU0gTG9vcCBDb250cm9sbGVyIENvZWZpY2llbnRzICovCisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DQV9GSU5FX19BLCAxNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0FfQ09BUlNFX19BLCA0MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRVBfRklORV9fQSwgMTIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VQX01FRElVTV9fQSwgMjQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VQX0NPQVJTRV9fQSwgMjQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VJX0ZJTkVfX0EsIDEyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19FSV9NRURJVU1fX0EsIDE2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19FSV9DT0FSU0VfX0EsIDE2KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NQX0ZJTkVfX0EsIDUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NQX01FRElVTV9fQSwgNDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NQX0NPQVJTRV9fQSwgMTIwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DSV9GSU5FX19BLCA1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DSV9NRURJVU1fX0EsIDQwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DSV9DT0FSU0VfX0EsIDYwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DRl9GSU5FX19BLCAxNik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0ZfTUVESVVNX19BLCAyNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0ZfQ09BUlNFX19BLCA2NCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0YxX0ZJTkVfX0EsIDUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGMV9NRURJVU1fX0EsIDEwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DRjFfQ09BUlNFX19BLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCisJLyogUUFNIFN0YXRlIE1hY2hpbmUgKEZTTSkgVGhyZXNob2xkcyAqLworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX1JUSF9fQSwgNTApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9GVEhfX0EsIDYwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fQ1RIX19BLCA4MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX1BUSF9fQSwgMTAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fUVRIX19BLCAxNDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9NVEhfX0EsIDEwMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fUkFURV9MSU1fX0EsIDQwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fQ09VTlRfTElNX19BLCA1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9GUkVRX0xJTV9fQSwgMTIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogUUFNIEZTTSBUcmFja2luZyBQYXJhbWV0ZXJzICovCisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTUVESUFOX0FWX01VTFRfX0EsICh1MTYpIDgpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9SQURJVVNfQVZfTElNSVRfX0EsICh1MTYpIDY1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTENBVkdfT0ZGU0VUMV9fQSwgKHUxNikgNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0xDQVZHX09GRlNFVDJfX0EsICh1MTYpIDMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQzX19BLCAodTE2KSAtMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0xDQVZHX09GRlNFVDRfX0EsICh1MTYpIC0xMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0xDQVZHX09GRlNFVDVfX0EsICh1MTYpIC0yMyk7CitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioKKyogXGJyaWVmIFFBTTI1NiBzcGVjaWZpYyBzZXR1cAorKiBccGFyYW0gZGVtb2Q6IGluc3RhbmNlIG9mIGRlbW9kLgorKiBccmV0dXJuIERSWFN0YXR1c190LgorKi8KK3N0YXRpYyBpbnQgU2V0UUFNMjU2KHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCWRwcmludGsoMSwgIlxuIik7CisJLyogUUFNIEVxdWFsaXplciBTZXR1cCAqLworCS8qIEVxdWFsaXplciAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQwX19BLCAxMTUwMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDFfX0EsIDEyMDg0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFEMl9fQSwgMTI1NDMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQzX19BLCAxMjkzMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDRfX0EsIDEzNjI5KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFENV9fQSwgMTUzODUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogRGVjaXNpb24gRmVlZGJhY2sgRXF1YWxpemVyICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0RRX1FVQUxfRlVOMF9fQSwgOCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0RRX1FVQUxfRlVOMV9fQSwgOCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0RRX1FVQUxfRlVOMl9fQSwgOCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0RRX1FVQUxfRlVOM19fQSwgOCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0RRX1FVQUxfRlVONF9fQSwgNik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0RRX1FVQUxfRlVONV9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fU1lfU1lOQ19IV01fX0EsIDUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9TWV9TWU5DX0FXTV9fQSwgNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX1NZX1NZTkNfTFdNX19BLCAzKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIFFBTSBTbGljZXIgU2V0dGluZ3MgKi8KKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX1NMX1NJR19QT1dFUl9fQSwgRFJYS19RQU1fU0xfU0lHX1BPV0VSX1FBTTI1Nik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKworCS8qIFFBTSBMb29wIENvbnRyb2xsZXIgQ29lZmljaWVudHMgKi8KKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NBX0ZJTkVfX0EsIDE1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DQV9DT0FSU0VfX0EsIDQwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19FUF9GSU5FX19BLCAxMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRVBfTUVESVVNX19BLCAyNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRVBfQ09BUlNFX19BLCAyNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfRUlfRklORV9fQSwgMTIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VJX01FRElVTV9fQSwgMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0VJX0NPQVJTRV9fQSwgMTYpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ1BfRklORV9fQSwgNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ1BfTUVESVVNX19BLCA1MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ1BfQ09BUlNFX19BLCAyNTApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NJX0ZJTkVfX0EsIDUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NJX01FRElVTV9fQSwgNTApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NJX0NPQVJTRV9fQSwgMTI1KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DRl9GSU5FX19BLCAxNik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0ZfTUVESVVNX19BLCAyNSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0ZfQ09BUlNFX19BLCA0OCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fTENfQ0YxX0ZJTkVfX0EsIDUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0xDX0NGMV9NRURJVU1fX0EsIDEwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9MQ19DRjFfQ09BUlNFX19BLCAxMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKworCS8qIFFBTSBTdGF0ZSBNYWNoaW5lIChGU00pIFRocmVzaG9sZHMgKi8KKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9SVEhfX0EsIDUwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fRlRIX19BLCA2MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0NUSF9fQSwgODApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9QVEhfX0EsIDEwMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX1FUSF9fQSwgMTUwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTVRIX19BLCAxMTApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX1JBVEVfTElNX19BLCA0MCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0NPVU5UX0xJTV9fQSwgNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0ZSRVFfTElNX19BLCAxMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKworCS8qIFFBTSBGU00gVHJhY2tpbmcgUGFyYW1ldGVycyAqLworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX01FRElBTl9BVl9NVUxUX19BLCAodTE2KSA4KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fUkFESVVTX0FWX0xJTUlUX19BLCAodTE2KSA3NCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0xDQVZHX09GRlNFVDFfX0EsICh1MTYpIDE4KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTENBVkdfT0ZGU0VUMl9fQSwgKHUxNikgMTMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQzX19BLCAodTE2KSA3KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fTENBVkdfT0ZGU0VUNF9fQSwgKHUxNikgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9RQU1fRlNNX0xDQVZHX09GRlNFVDVfX0EsICh1MTYpIC04KTsKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKioKKyogXGJyaWVmIFJlc2V0IFFBTSBibG9jay4KKyogXHBhcmFtIGRlbW9kOiAgIGluc3RhbmNlIG9mIGRlbW9kLgorKiBccGFyYW0gY2hhbm5lbDogcG9pbnRlciB0byBjaGFubmVsIGRhdGEuCisqIFxyZXR1cm4gRFJYU3RhdHVzX3QuCisqLworc3RhdGljIGludCBRQU1SZXNldFFBTShzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUpCit7CisJaW50IHN0YXR1czsKKwl1MTYgY21kUmVzdWx0OworCisJZHByaW50aygxLCAiXG4iKTsKKwkvKiBTdG9wIFFBTSBjb21zdGF0ZS0+bV9leGVjICovCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0NPTU1fRVhFQ19fQSwgUUFNX0NPTU1fRVhFQ19TVE9QKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHNjdV9jb21tYW5kKHN0YXRlLCBTQ1VfUkFNX0NPTU1BTkRfU1RBTkRBUkRfUUFNIHwgU0NVX1JBTV9DT01NQU5EX0NNRF9ERU1PRF9SRVNFVCwgMCwgTlVMTCwgMSwgJmNtZFJlc3VsdCk7CitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyoqCisqIFxicmllZiBTZXQgUUFNIHN5bWJvbHJhdGUuCisqIFxwYXJhbSBkZW1vZDogICBpbnN0YW5jZSBvZiBkZW1vZC4KKyogXHBhcmFtIGNoYW5uZWw6IHBvaW50ZXIgdG8gY2hhbm5lbCBkYXRhLgorKiBccmV0dXJuIERSWFN0YXR1c190LgorKi8KK3N0YXRpYyBpbnQgUUFNU2V0U3ltYm9scmF0ZShzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUpCit7CisJdTMyIGFkY0ZyZXF1ZW5jeSA9IDA7CisJdTMyIHN5bWJGcmVxID0gMDsKKwl1MzIgaXFtUmNSYXRlID0gMDsKKwl1MTYgcmF0ZXNlbCA9IDA7CisJdTMyIGxjU3ltYlJhdGUgPSAwOworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCS8qIFNlbGVjdCAmIGNhbGN1bGF0ZSBjb3JyZWN0IElRTSByYXRlICovCisJYWRjRnJlcXVlbmN5ID0gKHN0YXRlLT5tX3N5c0Nsb2NrRnJlcSAqIDEwMDApIC8gMzsKKwlyYXRlc2VsID0gMDsKKwkvKiBwcmludGsoS0VSTl9ERUJVRyAiZHJ4azogU1IgJWRcbiIsIHN0YXRlLT5wYXJhbS51LnFhbS5zeW1ib2xfcmF0ZSk7ICovCisJaWYgKHN0YXRlLT5wYXJhbS51LnFhbS5zeW1ib2xfcmF0ZSA8PSAxMTg4NzUwKQorCQlyYXRlc2VsID0gMzsKKwllbHNlIGlmIChzdGF0ZS0+cGFyYW0udS5xYW0uc3ltYm9sX3JhdGUgPD0gMjM3NzUwMCkKKwkJcmF0ZXNlbCA9IDI7CisJZWxzZSBpZiAoc3RhdGUtPnBhcmFtLnUucWFtLnN5bWJvbF9yYXRlIDw9IDQ3NTUwMDApCisJCXJhdGVzZWwgPSAxOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9GRF9SQVRFU0VMX19BLCByYXRlc2VsKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qCisJCUlxbVJjUmF0ZSA9ICgoRmFkYyAvIChzeW1ib2xyYXRlICogKDQ8PHJhdGVzZWwpKSkgLSAxKSAqICgxPDwyMykKKwkJKi8KKwlzeW1iRnJlcSA9IHN0YXRlLT5wYXJhbS51LnFhbS5zeW1ib2xfcmF0ZSAqICgxIDw8IHJhdGVzZWwpOworCWlmIChzeW1iRnJlcSA9PSAwKSB7CisJCS8qIERpdmlkZSBieSB6ZXJvICovCisJCXN0YXR1cyA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3I7CisJfQorCWlxbVJjUmF0ZSA9IChhZGNGcmVxdWVuY3kgLyBzeW1iRnJlcSkgKiAoMSA8PCAyMSkgKworCQkoRnJhYzI4YSgoYWRjRnJlcXVlbmN5ICUgc3ltYkZyZXEpLCBzeW1iRnJlcSkgPj4gNykgLQorCQkoMSA8PCAyMyk7CisJc3RhdHVzID0gd3JpdGUzMihzdGF0ZSwgSVFNX1JDX1JBVEVfT0ZTX0xPX19BLCBpcW1SY1JhdGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXRlLT5tX2lxbVJjUmF0ZSA9IGlxbVJjUmF0ZTsKKwkvKgorCQlMY1N5bWJGcmVxID0gcm91bmQgKC4xMjUgKiAgc3ltYm9scmF0ZSAvIGFkY0ZyZXEgKiAoMTw8MTUpKQorCQkqLworCXN5bWJGcmVxID0gc3RhdGUtPnBhcmFtLnUucWFtLnN5bWJvbF9yYXRlOworCWlmIChhZGNGcmVxdWVuY3kgPT0gMCkgeworCQkvKiBEaXZpZGUgYnkgemVybyAqLworCQlzdGF0dXMgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKwlsY1N5bWJSYXRlID0gKHN5bWJGcmVxIC8gYWRjRnJlcXVlbmN5KSAqICgxIDw8IDEyKSArCisJCShGcmFjMjhhKChzeW1iRnJlcSAlIGFkY0ZyZXF1ZW5jeSksIGFkY0ZyZXF1ZW5jeSkgPj4KKwkJMTYpOworCWlmIChsY1N5bWJSYXRlID4gNTExKQorCQlsY1N5bWJSYXRlID0gNTExOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9MQ19TWU1CT0xfRlJFUV9fQSwgKHUxNikgbGNTeW1iUmF0ZSk7CisKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKioKKyogXGJyaWVmIEdldCBRQU0gbG9jayBzdGF0dXMuCisqIFxwYXJhbSBkZW1vZDogICBpbnN0YW5jZSBvZiBkZW1vZC4KKyogXHBhcmFtIGNoYW5uZWw6IHBvaW50ZXIgdG8gY2hhbm5lbCBkYXRhLgorKiBccmV0dXJuIERSWFN0YXR1c190LgorKi8KKworc3RhdGljIGludCBHZXRRQU1Mb2NrU3RhdHVzKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSwgdTMyICpwTG9ja1N0YXR1cykKK3sKKwlpbnQgc3RhdHVzOworCXUxNiBSZXN1bHRbMl0gPSB7IDAsIDAgfTsKKworCWRwcmludGsoMSwgIlxuIik7CisJKnBMb2NrU3RhdHVzID0gTk9UX0xPQ0tFRDsKKwlzdGF0dXMgPSBzY3VfY29tbWFuZChzdGF0ZSwKKwkJCVNDVV9SQU1fQ09NTUFORF9TVEFOREFSRF9RQU0gfAorCQkJU0NVX1JBTV9DT01NQU5EX0NNRF9ERU1PRF9HRVRfTE9DSywgMCwgTlVMTCwgMiwKKwkJCVJlc3VsdCk7CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogJXMgc3RhdHVzID0gJTA4eFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CisKKwlpZiAoUmVzdWx0WzFdIDwgU0NVX1JBTV9RQU1fTE9DS0VEX0xPQ0tFRF9ERU1PRF9MT0NLRUQpIHsKKwkJLyogMHgwMDAwIE5PVCBMT0NLRUQgKi8KKwl9IGVsc2UgaWYgKFJlc3VsdFsxXSA8IFNDVV9SQU1fUUFNX0xPQ0tFRF9MT0NLRURfTE9DS0VEKSB7CisJCS8qIDB4NDAwMCBERU1PRCBMT0NLRUQgKi8KKwkJKnBMb2NrU3RhdHVzID0gREVNT0RfTE9DSzsKKwl9IGVsc2UgaWYgKFJlc3VsdFsxXSA8IFNDVV9SQU1fUUFNX0xPQ0tFRF9MT0NLRURfTkVWRVJfTE9DSykgeworCQkvKiAweDgwMDAgREVNT0QgKyBGRUMgTE9DS0VEIChzeXN0ZW0gbG9jaykgKi8KKwkJKnBMb2NrU3RhdHVzID0gTVBFR19MT0NLOworCX0gZWxzZSB7CisJCS8qIDB4QzAwMCBORVZFUiBMT0NLRUQgKi8KKwkJLyogKHN5c3RlbSB3aWxsIG5ldmVyIGJlIGFibGUgdG8gbG9jayB0byB0aGUgc2lnbmFsKSAqLworCQkvKiBUT0RPOiBjaGVjayB0aGlzLCBpbnRlcm1lZGlhdGUgJiBzdGFuZGFyZCBzcGVjaWZpYyBsb2NrIHN0YXRlcyBhcmUgbm90CisJCSAgIHRha2VuIGludG8gYWNjb3VudCBoZXJlICovCisJCSpwTG9ja1N0YXR1cyA9IE5FVkVSX0xPQ0s7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKKyNkZWZpbmUgUUFNX01JUlJPUl9fTSAgICAgICAgIDB4MDMKKyNkZWZpbmUgUUFNX01JUlJPUl9OT1JNQUwgICAgIDB4MDAKKyNkZWZpbmUgUUFNX01JUlJPUkVEICAgICAgICAgIDB4MDEKKyNkZWZpbmUgUUFNX01JUlJPUl9BVVRPX09OICAgIDB4MDIKKyNkZWZpbmUgUUFNX0xPQ0tSQU5HRV9fTSAgICAgIDB4MTAKKyNkZWZpbmUgUUFNX0xPQ0tSQU5HRV9OT1JNQUwgIDB4MTAKKworc3RhdGljIGludCBTZXRRQU0oc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCB1MTYgSW50ZXJtZWRpYXRlRnJlcWtIeiwKKwkJICBzMzIgdHVuZXJGcmVxT2Zmc2V0KQoreworCWludCBzdGF0dXM7CisJdTE2IHNldFBhcmFtUGFyYW1ldGVyc1s0XSA9IHsgMCwgMCwgMCwgMCB9OworCXUxNiBjbWRSZXN1bHQ7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCS8qCisJICogU1RFUCAxOiByZXNldCBkZW1vZHVsYXRvcgorCSAqCXJlc2V0cyBGRUMgREkgYW5kIEZFQyBSUworCSAqCXJlc2V0cyBRQU0gYmxvY2sKKwkgKglyZXNldHMgU0NVIHZhcmlhYmxlcworCSAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19ESV9DT01NX0VYRUNfX0EsIEZFQ19ESV9DT01NX0VYRUNfU1RPUCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX1JTX0NPTU1fRVhFQ19fQSwgRkVDX1JTX0NPTU1fRVhFQ19TVE9QKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSBRQU1SZXNldFFBTShzdGF0ZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKgorCSAqIFNURVAgMjogY29uZmlndXJlIGRlbW9kdWxhdG9yCisJICoJLXNldCBwYXJhbXM7IHJlc2V0cyBJUU0sUUFNLEZFQyBIVzsgaW5pdGlhbGl6ZXMgc29tZQorCSAqICAgICAgIFNDVSB2YXJpYWJsZXMKKwkgKi8KKwlzdGF0dXMgPSBRQU1TZXRTeW1ib2xyYXRlKHN0YXRlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIFNldCBwYXJhbXMgKi8KKwlzd2l0Y2ggKHN0YXRlLT5wYXJhbS51LnFhbS5tb2R1bGF0aW9uKSB7CisJY2FzZSBRQU1fMjU2OgorCQlzdGF0ZS0+bV9Db25zdGVsbGF0aW9uID0gRFJYX0NPTlNURUxMQVRJT05fUUFNMjU2OworCQlicmVhazsKKwljYXNlIFFBTV9BVVRPOgorCWNhc2UgUUFNXzY0OgorCQlzdGF0ZS0+bV9Db25zdGVsbGF0aW9uID0gRFJYX0NPTlNURUxMQVRJT05fUUFNNjQ7CisJCWJyZWFrOworCWNhc2UgUUFNXzE2OgorCQlzdGF0ZS0+bV9Db25zdGVsbGF0aW9uID0gRFJYX0NPTlNURUxMQVRJT05fUUFNMTY7CisJCWJyZWFrOworCWNhc2UgUUFNXzMyOgorCQlzdGF0ZS0+bV9Db25zdGVsbGF0aW9uID0gRFJYX0NPTlNURUxMQVRJT05fUUFNMzI7CisJCWJyZWFrOworCWNhc2UgUUFNXzEyODoKKwkJc3RhdGUtPm1fQ29uc3RlbGxhdGlvbiA9IERSWF9DT05TVEVMTEFUSU9OX1FBTTEyODsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXNldFBhcmFtUGFyYW1ldGVyc1swXSA9IHN0YXRlLT5tX0NvbnN0ZWxsYXRpb247CS8qIGNvbnN0ZWxsYXRpb24gICAgICovCisJc2V0UGFyYW1QYXJhbWV0ZXJzWzFdID0gRFJYS19RQU1fSTEyX0oxNzsJLyogaW50ZXJsZWF2ZSBtb2RlICAgKi8KKwlpZiAoc3RhdGUtPm1fT3BlcmF0aW9uTW9kZSA9PSBPTV9RQU1fSVRVX0MpCisJCXNldFBhcmFtUGFyYW1ldGVyc1syXSA9IFFBTV9UT1BfQU5ORVhfQzsKKwllbHNlCisJCXNldFBhcmFtUGFyYW1ldGVyc1syXSA9IFFBTV9UT1BfQU5ORVhfQTsKKwlzZXRQYXJhbVBhcmFtZXRlcnNbM10gfD0gKFFBTV9NSVJST1JfQVVUT19PTik7CisJLyogRW52IHBhcmFtZXRlcnMgKi8KKwkvKiBjaGVjayBmb3IgTE9DS1JBTkdFIEV4dGVudGVkICovCisJLyogc2V0UGFyYW1QYXJhbWV0ZXJzWzNdIHw9IFFBTV9MT0NLUkFOR0VfTk9STUFMOyAqLworCisJc3RhdHVzID0gc2N1X2NvbW1hbmQoc3RhdGUsIFNDVV9SQU1fQ09NTUFORF9TVEFOREFSRF9RQU0gfCBTQ1VfUkFNX0NPTU1BTkRfQ01EX0RFTU9EX1NFVF9QQVJBTSwgNCwgc2V0UGFyYW1QYXJhbWV0ZXJzLCAxLCAmY21kUmVzdWx0KTsKKwlpZiAoc3RhdHVzIDwgMCkgeworCQkvKiBGYWxsLWJhY2sgdG8gdGhlIHNpbXBsZXIgY2FsbCAqLworCQlpZiAoc3RhdGUtPm1fT3BlcmF0aW9uTW9kZSA9PSBPTV9RQU1fSVRVX0MpCisJCQlzZXRQYXJhbVBhcmFtZXRlcnNbMF0gPSBRQU1fVE9QX0FOTkVYX0M7CisJCWVsc2UKKwkJCXNldFBhcmFtUGFyYW1ldGVyc1swXSA9IFFBTV9UT1BfQU5ORVhfQTsKKwkJc3RhdHVzID0gc2N1X2NvbW1hbmQoc3RhdGUsIFNDVV9SQU1fQ09NTUFORF9TVEFOREFSRF9RQU0gfCBTQ1VfUkFNX0NPTU1BTkRfQ01EX0RFTU9EX1NFVF9FTlYsIDEsIHNldFBhcmFtUGFyYW1ldGVycywgMSwgJmNtZFJlc3VsdCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQlzZXRQYXJhbVBhcmFtZXRlcnNbMF0gPSBzdGF0ZS0+bV9Db25zdGVsbGF0aW9uOyAvKiBjb25zdGVsbGF0aW9uICAgICAqLworCQlzZXRQYXJhbVBhcmFtZXRlcnNbMV0gPSBEUlhLX1FBTV9JMTJfSjE3OyAgICAgICAvKiBpbnRlcmxlYXZlIG1vZGUgICAqLworCQlzdGF0dXMgPSBzY3VfY29tbWFuZChzdGF0ZSwgU0NVX1JBTV9DT01NQU5EX1NUQU5EQVJEX1FBTSB8IFNDVV9SQU1fQ09NTUFORF9DTURfREVNT0RfU0VUX1BBUkFNLCAyLCBzZXRQYXJhbVBhcmFtZXRlcnMsIDEsICZjbWRSZXN1bHQpOworCX0KKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qCisJICogU1RFUCAzOiBlbmFibGUgdGhlIHN5c3RlbSBpbiBhIG1vZGUgd2hlcmUgdGhlIEFEQyBwcm92aWRlcyB2YWxpZAorCSAqIHNpZ25hbCBzZXR1cCBjb25zdGVsbGF0aW9uIGluZGVwZW5kZW50IHJlZ2lzdGVycworCSAqLworI2lmIDAKKwlzdGF0dXMgPSBTZXRGcmVxdWVuY3koY2hhbm5lbCwgdHVuZXJGcmVxT2Zmc2V0KSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisjZW5kaWYKKwlzdGF0dXMgPSBTZXRGcmVxdWVuY3lTaGlmdGVyKHN0YXRlLCBJbnRlcm1lZGlhdGVGcmVxa0h6LCB0dW5lckZyZXFPZmZzZXQsIHRydWUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogU2V0dXAgQkVSIG1lYXN1cmVtZW50ICovCisJc3RhdHVzID0gU2V0UUFNTWVhc3VyZW1lbnQoc3RhdGUsIHN0YXRlLT5tX0NvbnN0ZWxsYXRpb24sIHN0YXRlLT5wYXJhbS51LiBxYW0uc3ltYm9sX3JhdGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogUmVzZXQgZGVmYXVsdCB2YWx1ZXMgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQ0ZfU0NBTEVfU0hfX0EsIElRTV9DRl9TQ0FMRV9TSF9fUFJFKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fU1lfVElNRU9VVF9fQSwgUUFNX1NZX1RJTUVPVVRfX1BSRSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBSZXNldCBkZWZhdWx0IExDIHZhbHVlcyAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9MQ19SQVRFX0xJTUlUX19BLCAzKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fTENfTFBGX0ZBQ1RPUlBfX0EsIDQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9MQ19MUEZfRkFDVE9SSV9fQSwgNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0xDX01PREVfX0EsIDcpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0xDX1FVQUxfVEFCMF9fQSwgMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0xDX1FVQUxfVEFCMV9fQSwgMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0xDX1FVQUxfVEFCMl9fQSwgMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0xDX1FVQUxfVEFCM19fQSwgMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0xDX1FVQUxfVEFCNF9fQSwgMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0xDX1FVQUxfVEFCNV9fQSwgMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0xDX1FVQUxfVEFCNl9fQSwgMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0xDX1FVQUxfVEFCOF9fQSwgMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0xDX1FVQUxfVEFCOV9fQSwgMik7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0xDX1FVQUxfVEFCMTBfX0EsIDIpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9MQ19RVUFMX1RBQjEyX19BLCAyKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fTENfUVVBTF9UQUIxNV9fQSwgMyk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgUUFNX0xDX1FVQUxfVEFCMTZfX0EsIDMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9MQ19RVUFMX1RBQjIwX19BLCA0KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fTENfUVVBTF9UQUIyNV9fQSwgNCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBNaXJyb3JpbmcsIFFBTS1ibG9jayBzdGFydGluZyBwb2ludCBub3QgaW52ZXJ0ZWQgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBRQU1fU1lfU1BfSU5WX19BLCBRQU1fU1lfU1BfSU5WX1NQRUNUUlVNX0lOVl9ESVMpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogSGFsdCBTQ1UgdG8gZW5hYmxlIHNhZmUgbm9uLWF0b21pYyBhY2Nlc3NlcyAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9DT01NX0VYRUNfX0EsIFNDVV9DT01NX0VYRUNfSE9MRCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBTVEVQIDQ6IGNvbnN0ZWxsYXRpb24gc3BlY2lmaWMgc2V0dXAgKi8KKwlzd2l0Y2ggKHN0YXRlLT5wYXJhbS51LnFhbS5tb2R1bGF0aW9uKSB7CisJY2FzZSBRQU1fMTY6CisJCXN0YXR1cyA9IFNldFFBTTE2KHN0YXRlKTsKKwkJYnJlYWs7CisJY2FzZSBRQU1fMzI6CisJCXN0YXR1cyA9IFNldFFBTTMyKHN0YXRlKTsKKwkJYnJlYWs7CisJY2FzZSBRQU1fQVVUTzoKKwljYXNlIFFBTV82NDoKKwkJc3RhdHVzID0gU2V0UUFNNjQoc3RhdGUpOworCQlicmVhazsKKwljYXNlIFFBTV8xMjg6CisJCXN0YXR1cyA9IFNldFFBTTEyOChzdGF0ZSk7CisJCWJyZWFrOworCWNhc2UgUUFNXzI1NjoKKwkJc3RhdHVzID0gU2V0UUFNMjU2KHN0YXRlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3RhdHVzID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogQWN0aXZhdGUgU0NVIHRvIGVuYWJsZSBTQ1UgY29tbWFuZHMgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfQ09NTV9FWEVDX19BLCBTQ1VfQ09NTV9FWEVDX0FDVElWRSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBSZS1jb25maWd1cmUgTVBFRyBvdXRwdXQsIHJlcXVpcmVzIGtub3dsZWRnZSBvZiBjaGFubmVsIGJpdHJhdGUgKi8KKwkvKiBleHRBdHRyLT5jdXJyZW50Q2hhbm5lbC5jb25zdGVsbGF0aW9uID0gY2hhbm5lbC0+Y29uc3RlbGxhdGlvbjsgKi8KKwkvKiBleHRBdHRyLT5jdXJyZW50Q2hhbm5lbC5zeW1ib2xyYXRlICAgID0gY2hhbm5lbC0+c3ltYm9scmF0ZTsgKi8KKwlzdGF0dXMgPSBNUEVHVFNEdG9TZXR1cChzdGF0ZSwgc3RhdGUtPm1fT3BlcmF0aW9uTW9kZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBTdGFydCBwcm9jZXNzZXMgKi8KKwlzdGF0dXMgPSBNUEVHVFNTdGFydChzdGF0ZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgRkVDX0NPTU1fRVhFQ19fQSwgRkVDX0NPTU1fRVhFQ19BQ1RJVkUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFFBTV9DT01NX0VYRUNfX0EsIFFBTV9DT01NX0VYRUNfQUNUSVZFKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQ09NTV9FWEVDX19BLCBJUU1fQ09NTV9FWEVDX0JfQUNUSVZFKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIFNURVAgNTogc3RhcnQgUUFNIGRlbW9kdWxhdG9yIChzdGFydHMgRkVDLCBRQU0gYW5kIElRTSBIVykgKi8KKwlzdGF0dXMgPSBzY3VfY29tbWFuZChzdGF0ZSwgU0NVX1JBTV9DT01NQU5EX1NUQU5EQVJEX1FBTSB8IFNDVV9SQU1fQ09NTUFORF9DTURfREVNT0RfU1RBUlQsIDAsIE5VTEwsIDEsICZjbWRSZXN1bHQpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogdXBkYXRlIGdsb2JhbCBEUlhLIGRhdGEgY29udGFpbmVyICovCisvKj8gICAgIGV4dEF0dHItPnFhbUludGVybGVhdmVNb2RlID0gRFJYS19RQU1fSTEyX0oxNzsgKi8KKworZXJyb3I6CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgU2V0UUFNU3RhbmRhcmQoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLAorCQkJICBlbnVtIE9wZXJhdGlvbk1vZGUgb01vZGUpCit7CisJaW50IHN0YXR1czsKKyNpZmRlZiBEUlhLX1FBTV9UQVBTCisjZGVmaW5lIERSWEtfUUFNQV9UQVBTX1NFTEVDVAorI2luY2x1ZGUgImRyeGtfZmlsdGVycy5oIgorI3VuZGVmIERSWEtfUUFNQV9UQVBTX1NFTEVDVAorI2VuZGlmCisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJLyogYWRkZWQgYW50ZW5uYSBzd2l0Y2ggKi8KKwlTd2l0Y2hBbnRlbm5hVG9RQU0oc3RhdGUpOworCisJLyogRW5zdXJlIGNvcnJlY3QgcG93ZXItdXAgbW9kZSAqLworCXN0YXR1cyA9IFBvd2VyVXBRQU0oc3RhdGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCS8qIFJlc2V0IFFBTSBibG9jayAqLworCXN0YXR1cyA9IFFBTVJlc2V0UUFNKHN0YXRlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIFNldHVwIElRTSAqLworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0NPTU1fRVhFQ19fQSwgSVFNX0NPTU1fRVhFQ19CX1NUT1ApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9BRl9BTVVYX19BLCBJUU1fQUZfQU1VWF9TSUdOQUwyQURDKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIFVwbG9hZCBJUU0gQ2hhbm5lbCBGaWx0ZXIgc2V0dGluZ3MgYnkKKwkJYm9vdCBsb2FkZXIgZnJvbSBST00gdGFibGUgKi8KKwlzd2l0Y2ggKG9Nb2RlKSB7CisJY2FzZSBPTV9RQU1fSVRVX0E6CisJCXN0YXR1cyA9IEJMQ2hhaW5DbWQoc3RhdGUsIERSWEtfQkxfUk9NX09GRlNFVF9UQVBTX0lUVV9BLCBEUlhLX0JMQ0NfTlJfRUxFTUVOVFNfVEFQUywgRFJYS19CTENfVElNRU9VVCk7CisJCWJyZWFrOworCWNhc2UgT01fUUFNX0lUVV9DOgorCQlzdGF0dXMgPSBCTERpcmVjdENtZChzdGF0ZSwgSVFNX0NGX1RBUF9SRTBfX0EsIERSWEtfQkxfUk9NX09GRlNFVF9UQVBTX0lUVV9DLCBEUlhLX0JMRENfTlJfRUxFTUVOVFNfVEFQUywgRFJYS19CTENfVElNRU9VVCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gQkxEaXJlY3RDbWQoc3RhdGUsIElRTV9DRl9UQVBfSU0wX19BLCBEUlhLX0JMX1JPTV9PRkZTRVRfVEFQU19JVFVfQywgRFJYS19CTERDX05SX0VMRU1FTlRTX1RBUFMsIERSWEtfQkxDX1RJTUVPVVQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzdGF0dXMgPSAtRUlOVkFMOworCX0KKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9DRl9PVVRfRU5BX19BLCAoMSA8PCBJUU1fQ0ZfT1VUX0VOQV9RQU1fX0IpKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQ0ZfU1lNTUVUUklDX19BLCAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQ0ZfTUlEVEFQX19BLCAoKDEgPDwgSVFNX0NGX01JRFRBUF9SRV9fQikgfCAoMSA8PCBJUU1fQ0ZfTUlEVEFQX0lNX19CKSkpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX1JDX1NUUkVUQ0hfX0EsIDIxKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQUZfQ0xQX0xFTl9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0FGX0NMUF9USF9fQSwgNDQ4KTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQUZfU05TX0xFTl9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0NGX1BPV19NRUFTX0xFTl9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fRlNfQURKX1NFTF9fQSwgMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX1JDX0FESl9TRUxfX0EsIDEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9DRl9BREpfU0VMX19BLCAxKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQUZfVVBEX1NFTF9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBJUU0gSW1wdWxzZSBOb2lzZSBQcm9jZXNzaW5nIFVuaXQgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQ0ZfQ0xQX1ZBTF9fQSwgNTAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQ0ZfREFUQVRIX19BLCAxMDAwKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQ0ZfQllQQVNTREVUX19BLCAxKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBJUU1fQ0ZfREVUX0xDVF9fQSwgMCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0NGX1dORF9MRU5fX0EsIDEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9DRl9QS0RUSF9fQSwgMSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgSVFNX0FGX0lOQ19CWVBBU1NfX0EsIDEpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogdHVybiBvbiBJUU1BRi4gTXVzdCBiZSBkb25lIGJlZm9yZSBzZXRBZ2MqKigpICovCisJc3RhdHVzID0gU2V0SXFtQWYoc3RhdGUsIHRydWUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIElRTV9BRl9TVEFSVF9MT0NLX19BLCAweDAxKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qIElRTSB3aWxsIG5vdCBiZSByZXNldCBmcm9tIGhlcmUsIHN5bmMgQURDIGFuZCB1cGRhdGUvaW5pdCBBR0MgKi8KKwlzdGF0dXMgPSBBRENTeW5jaHJvbml6YXRpb24oc3RhdGUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogU2V0IHRoZSBGU00gc3RlcCBwZXJpb2QgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX1FBTV9GU01fU1RFUF9QRVJJT0RfX0EsIDIwMDApOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCisJLyogSGFsdCBTQ1UgdG8gZW5hYmxlIHNhZmUgbm9uLWF0b21pYyBhY2Nlc3NlcyAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9DT01NX0VYRUNfX0EsIFNDVV9DT01NX0VYRUNfSE9MRCk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBObyBtb3JlIHJlc2V0cyBvZiB0aGUgSVFNLCBjdXJyZW50IHN0YW5kYXJkIGNvcnJlY3RseSBzZXQgPT4KKwkJbm93IEFHQ3MgY2FuIGJlIGNvbmZpZ3VyZWQuICovCisKKwlzdGF0dXMgPSBJbml0QUdDKHN0YXRlLCB0cnVlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSBTZXRQcmVTYXcoc3RhdGUsICYoc3RhdGUtPm1fcWFtUHJlU2F3Q2ZnKSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBDb25maWd1cmUgQUdDJ3MgKi8KKwlzdGF0dXMgPSBTZXRBZ2NSZihzdGF0ZSwgJihzdGF0ZS0+bV9xYW1SZkFnY0NmZyksIHRydWUpOworCWlmIChzdGF0dXMgPCAwKQorCQlnb3RvIGVycm9yOworCXN0YXR1cyA9IFNldEFnY0lmKHN0YXRlLCAmKHN0YXRlLT5tX3FhbUlmQWdjQ2ZnKSwgdHJ1ZSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBBY3RpdmF0ZSBTQ1UgdG8gZW5hYmxlIFNDVSBjb21tYW5kcyAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9DT01NX0VYRUNfX0EsIFNDVV9DT01NX0VYRUNfQUNUSVZFKTsKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IFdyaXRlR1BJTyhzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUpCit7CisJaW50IHN0YXR1czsKKwl1MTYgdmFsdWUgPSAwOworCisJZHByaW50aygxLCAiXG4iKTsKKwkvKiBzdG9wIGxvY2sgaW5kaWNhdG9yIHByb2Nlc3MgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0dQSU9fX0EsIFNDVV9SQU1fR1BJT19IV19MT0NLX0lORF9ESVNBQkxFKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCS8qICBXcml0ZSBtYWdpYyB3b3JkIHRvIGVuYWJsZSBwZHIgcmVnIHdyaXRlICAgICAgICAgICAgICAgKi8KKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fVE9QX0NPTU1fS0VZX19BLCBTSU9fVE9QX0NPTU1fS0VZX0tFWSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisKKwlpZiAoc3RhdGUtPm1faGFzU0FXU1cpIHsKKwkJaWYgKHN0YXRlLT5VSU9fbWFzayAmIDB4MDAwMSkgeyAvKiBVSU8tMSAqLworCQkJLyogd3JpdGUgdG8gaW8gcGFkIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgLSBvdXRwdXQgbW9kZSAqLworCQkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9TTUFfVFhfQ0ZHX19BLCBzdGF0ZS0+bV9HUElPQ2ZnKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisKKwkJCS8qIHVzZSBjb3JyZXNwb25kaW5nIGJpdCBpbiBpbyBkYXRhIG91dHB1dCByZWdpc3RhciAqLworCQkJc3RhdHVzID0gcmVhZDE2KHN0YXRlLCBTSU9fUERSX1VJT19PVVRfTE9fX0EsICZ2YWx1ZSk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQkJaWYgKChzdGF0ZS0+bV9HUElPICYgMHgwMDAxKSA9PSAwKQorCQkJCXZhbHVlICY9IDB4N0ZGRjsJLyogd3JpdGUgemVybyB0byAxNXRoIGJpdCAtIDFzdCBVSU8gKi8KKwkJCWVsc2UKKwkJCQl2YWx1ZSB8PSAweDgwMDA7CS8qIHdyaXRlIG9uZSB0byAxNXRoIGJpdCAtIDFzdCBVSU8gKi8KKwkJCS8qIHdyaXRlIGJhY2sgdG8gaW8gZGF0YSBvdXRwdXQgcmVnaXN0ZXIgKi8KKwkJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfVUlPX09VVF9MT19fQSwgdmFsdWUpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJfQorCQlpZiAoc3RhdGUtPlVJT19tYXNrICYgMHgwMDAyKSB7IC8qIFVJTy0yICovCisJCQkvKiB3cml0ZSB0byBpbyBwYWQgY29uZmlndXJhdGlvbiByZWdpc3RlciAtIG91dHB1dCBtb2RlICovCisJCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fUERSX1NNQV9UWF9DRkdfX0EsIHN0YXRlLT5tX0dQSU9DZmcpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKworCQkJLyogdXNlIGNvcnJlc3BvbmRpbmcgYml0IGluIGlvIGRhdGEgb3V0cHV0IHJlZ2lzdGFyICovCisJCQlzdGF0dXMgPSByZWFkMTYoc3RhdGUsIFNJT19QRFJfVUlPX09VVF9MT19fQSwgJnZhbHVlKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisJCQlpZiAoKHN0YXRlLT5tX0dQSU8gJiAweDAwMDIpID09IDApCisJCQkJdmFsdWUgJj0gMHhCRkZGOwkvKiB3cml0ZSB6ZXJvIHRvIDE0dGggYml0IC0gMnN0IFVJTyAqLworCQkJZWxzZQorCQkJCXZhbHVlIHw9IDB4NDAwMDsJLyogd3JpdGUgb25lIHRvIDE0dGggYml0IC0gMnN0IFVJTyAqLworCQkJLyogd3JpdGUgYmFjayB0byBpbyBkYXRhIG91dHB1dCByZWdpc3RlciAqLworCQkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX1BEUl9VSU9fT1VUX0xPX19BLCB2YWx1ZSk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQl9CisJCWlmIChzdGF0ZS0+VUlPX21hc2sgJiAweDAwMDQpIHsgLyogVUlPLTMgKi8KKwkJCS8qIHdyaXRlIHRvIGlvIHBhZCBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIC0gb3V0cHV0IG1vZGUgKi8KKwkJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfU01BX1RYX0NGR19fQSwgc3RhdGUtPm1fR1BJT0NmZyk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCisJCQkvKiB1c2UgY29ycmVzcG9uZGluZyBiaXQgaW4gaW8gZGF0YSBvdXRwdXQgcmVnaXN0YXIgKi8KKwkJCXN0YXR1cyA9IHJlYWQxNihzdGF0ZSwgU0lPX1BEUl9VSU9fT1VUX0xPX19BLCAmdmFsdWUpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJCWlmICgoc3RhdGUtPm1fR1BJTyAmIDB4MDAwNCkgPT0gMCkKKwkJCQl2YWx1ZSAmPSAweEZGRkI7ICAgICAgICAgICAgLyogd3JpdGUgemVybyB0byAybmQgYml0IC0gM3JkIFVJTyAqLworCQkJZWxzZQorCQkJCXZhbHVlIHw9IDB4MDAwNDsgICAgICAgICAgICAvKiB3cml0ZSBvbmUgdG8gMm5kIGJpdCAtIDNyZCBVSU8gKi8KKwkJCS8qIHdyaXRlIGJhY2sgdG8gaW8gZGF0YSBvdXRwdXQgcmVnaXN0ZXIgKi8KKwkJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19QRFJfVUlPX09VVF9MT19fQSwgdmFsdWUpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKwkvKiAgV3JpdGUgbWFnaWMgd29yZCB0byBkaXNhYmxlIHBkciByZWcgd3JpdGUgICAgICAgICAgICAgICAqLworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19UT1BfQ09NTV9LRVlfX0EsIDB4MDAwMCk7CitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBTd2l0Y2hBbnRlbm5hVG9RQU0oc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCWludCBzdGF0dXMgPSAwOworCWJvb2wgZ3Bpb19zdGF0ZTsKKworCWRwcmludGsoMSwgIlxuIik7CisKKwlpZiAoIXN0YXRlLT5hbnRlbm5hX2dwaW8pCisJCXJldHVybiAwOworCisJZ3Bpb19zdGF0ZSA9IHN0YXRlLT5tX0dQSU8gJiBzdGF0ZS0+YW50ZW5uYV9ncGlvOworCisJaWYgKHN0YXRlLT5hbnRlbm5hX2R2YnQgXiBncGlvX3N0YXRlKSB7CisJCS8qIEFudGVubmEgaXMgb24gRFZCLVQgbW9kZS4gU3dpdGNoICovCisJCWlmIChzdGF0ZS0+YW50ZW5uYV9kdmJ0KQorCQkJc3RhdGUtPm1fR1BJTyAmPSB+c3RhdGUtPmFudGVubmFfZ3BpbzsKKwkJZWxzZQorCQkJc3RhdGUtPm1fR1BJTyB8PSBzdGF0ZS0+YW50ZW5uYV9ncGlvOworCQlzdGF0dXMgPSBXcml0ZUdQSU8oc3RhdGUpOworCX0KKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBTd2l0Y2hBbnRlbm5hVG9EVkJUKHN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlib29sIGdwaW9fc3RhdGU7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCisJaWYgKCFzdGF0ZS0+YW50ZW5uYV9ncGlvKQorCQlyZXR1cm4gMDsKKworCWdwaW9fc3RhdGUgPSBzdGF0ZS0+bV9HUElPICYgc3RhdGUtPmFudGVubmFfZ3BpbzsKKworCWlmICghKHN0YXRlLT5hbnRlbm5hX2R2YnQgXiBncGlvX3N0YXRlKSkgeworCQkvKiBBbnRlbm5hIGlzIG9uIERWQi1DIG1vZGUuIFN3aXRjaCAqLworCQlpZiAoc3RhdGUtPmFudGVubmFfZHZidCkKKwkJCXN0YXRlLT5tX0dQSU8gfD0gc3RhdGUtPmFudGVubmFfZ3BpbzsKKwkJZWxzZQorCQkJc3RhdGUtPm1fR1BJTyAmPSB+c3RhdGUtPmFudGVubmFfZ3BpbzsKKwkJc3RhdHVzID0gV3JpdGVHUElPKHN0YXRlKTsKKwl9CisJaWYgKHN0YXR1cyA8IDApCisJCXByaW50ayhLRVJOX0VSUiAiZHJ4azogRXJyb3IgJWQgb24gJXNcbiIsIHN0YXR1cywgX19mdW5jX18pOworCXJldHVybiBzdGF0dXM7Cit9CisKKworc3RhdGljIGludCBQb3dlckRvd25EZXZpY2Uoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCS8qIFBvd2VyIGRvd24gdG8gcmVxdWVzdGVkIG1vZGUgKi8KKwkvKiBCYWNrdXAgc29tZSByZWdpc3RlciBzZXR0aW5ncyAqLworCS8qIFNldCBwaW5zIHdpdGggcG9zc2libGUgcHVsbC11cHMgY29ubmVjdGVkIHRvIHRoZW0gaW4gaW5wdXQgbW9kZSAqLworCS8qIEFuYWxvZyBwb3dlciBkb3duICovCisJLyogQURDIHBvd2VyIGRvd24gKi8KKwkvKiBQb3dlciBkb3duIGRldmljZSAqLworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCWlmIChzdGF0ZS0+bV9iUERvd25PcGVuQnJpZGdlKSB7CisJCS8qIE9wZW4gSTJDIGJyaWRnZSBiZWZvcmUgcG93ZXIgZG93biBvZiBEUlhLICovCisJCXN0YXR1cyA9IENvbmZpZ3VyZUkyQ0JyaWRnZShzdGF0ZSwgdHJ1ZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwl9CisJLyogZHJpdmVyIDAuOS4wICovCisJc3RhdHVzID0gRFZCVEVuYWJsZU9GRE1Ub2tlblJpbmcoc3RhdGUsIGZhbHNlKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKworCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19DQ19QV0RfTU9ERV9fQSwgU0lPX0NDX1BXRF9NT0RFX0xFVkVMX0NMT0NLKTsKKwlpZiAoc3RhdHVzIDwgMCkKKwkJZ290byBlcnJvcjsKKwlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fQ0NfVVBEQVRFX19BLCBTSU9fQ0NfVVBEQVRFX0tFWSk7CisJaWYgKHN0YXR1cyA8IDApCisJCWdvdG8gZXJyb3I7CisJc3RhdGUtPm1fSElDZmdDdHJsIHw9IFNJT19ISV9SQV9SQU1fUEFSXzVfQ0ZHX1NMRUVQX1paWjsKKwlzdGF0dXMgPSBISV9DZmdDb21tYW5kKHN0YXRlKTsKK2Vycm9yOgorCWlmIChzdGF0dXMgPCAwKQorCQlwcmludGsoS0VSTl9FUlIgImRyeGs6IEVycm9yICVkIG9uICVzXG4iLCBzdGF0dXMsIF9fZnVuY19fKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgbG9hZF9taWNyb2NvZGUoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlLCBjb25zdCBjaGFyICptY19uYW1lKQoreworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZncgPSBOVUxMOworCWludCBlcnIgPSAwOworCisJZHByaW50aygxLCAiXG4iKTsKKworCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBtY19uYW1lLCBzdGF0ZS0+aTJjLT5kZXYucGFyZW50KTsKKwlpZiAoZXJyIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIKKwkJICAgICAgICJkcnhrOiBDb3VsZCBub3QgbG9hZCBmaXJtd2FyZSBmaWxlICVzLlxuIiwgbWNfbmFtZSk7CisJCXByaW50ayhLRVJOX0lORk8KKwkJICAgICAgICJkcnhrOiBDb3B5ICVzIHRvIHlvdXIgaG90cGx1ZyBkaXJlY3RvcnkhXG4iLCBtY19uYW1lKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJZXJyID0gRG93bmxvYWRNaWNyb2NvZGUoc3RhdGUsIGZ3LT5kYXRhLCBmdy0+c2l6ZSk7CisJcmVsZWFzZV9maXJtd2FyZShmdyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpbml0X2RyeGsoc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlKQoreworCWludCBzdGF0dXMgPSAwOworCWVudW0gRFJYUG93ZXJNb2RlIHBvd2VyTW9kZSA9IERSWEtfUE9XRVJfRE9XTl9PRkRNOworCXUxNiBkcml2ZXJWZXJzaW9uOworCisJZHByaW50aygxLCAiXG4iKTsKKwlpZiAoKHN0YXRlLT5tX0RyeGtTdGF0ZSA9PSBEUlhLX1VOSU5JVElBTElaRUQpKSB7CisJCXN0YXR1cyA9IFBvd2VyVXBEZXZpY2Uoc3RhdGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IERSWFhfT3BlbihzdGF0ZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJLyogU29mdCByZXNldCBvZiBPRkRNLSwgc3lzLSBhbmQgb3NjLWNsb2NrZG9tYWluICovCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNJT19DQ19TT0ZUX1JTVF9fQSwgU0lPX0NDX1NPRlRfUlNUX09GRE1fX00gfCBTSU9fQ0NfU09GVF9SU1RfU1lTX19NIHwgU0lPX0NDX1NPRlRfUlNUX09TQ19fTSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX0NDX1VQREFURV9fQSwgU0lPX0NDX1VQREFURV9LRVkpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCS8qIFRPRE8gaXMgdGhpcyBuZWVkZWQsIGlmIHllcyBob3cgbXVjaCBkZWxheSBpbiB3b3JzdCBjYXNlIHNjZW5hcmlvICovCisJCW1zbGVlcCgxKTsKKwkJc3RhdGUtPm1fRFJYS19BM19QQVRDSF9DT0RFID0gdHJ1ZTsKKwkJc3RhdHVzID0gR2V0RGV2aWNlQ2FwYWJpbGl0aWVzKHN0YXRlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCisJCS8qIEJyaWRnZSBkZWxheSwgdXNlcyBvc2NpbGF0b3IgY2xvY2sgKi8KKwkJLyogRGVsYXkgPSAoZGVsYXkgKG5hbm8gc2Vjb25kcykgKiBvc2NjbGsgKGtIeikpLyAxMDAwICovCisJCS8qIFNEQSBicmRpZ2UgZGVsYXkgKi8KKwkJc3RhdGUtPm1fSElDZmdCcmlkZ2VEZWxheSA9CisJCQkodTE2KSAoKHN0YXRlLT5tX29zY0Nsb2NrRnJlcSAvIDEwMDApICoKKwkJCQlISV9JMkNfQlJJREdFX0RFTEFZKSAvIDEwMDA7CisJCS8qIENsaXBwaW5nICovCisJCWlmIChzdGF0ZS0+bV9ISUNmZ0JyaWRnZURlbGF5ID4KKwkJCVNJT19ISV9SQV9SQU1fUEFSXzNfQ0ZHX0RCTF9TREFfX00pIHsKKwkJCXN0YXRlLT5tX0hJQ2ZnQnJpZGdlRGVsYXkgPQorCQkJCVNJT19ISV9SQV9SQU1fUEFSXzNfQ0ZHX0RCTF9TREFfX007CisJCX0KKwkJLyogU0NMIGJyaWRnZSBkZWxheSwgc2FtZSBhcyBTREEgZm9yIG5vdyAqLworCQlzdGF0ZS0+bV9ISUNmZ0JyaWRnZURlbGF5ICs9CisJCQlzdGF0ZS0+bV9ISUNmZ0JyaWRnZURlbGF5IDw8CisJCQlTSU9fSElfUkFfUkFNX1BBUl8zX0NGR19EQkxfU0NMX19COworCisJCXN0YXR1cyA9IEluaXRISShzdGF0ZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJLyogZGlzYWJsZSB2YXJpb3VzIHByb2Nlc3NlcyAqLworI2lmIE5PQTFST00KKwkJaWYgKCEoc3RhdGUtPm1fRFJYS19BMV9ST01fQ09ERSkKKwkJCSYmICEoc3RhdGUtPm1fRFJYS19BMl9ST01fQ09ERSkpCisjZW5kaWYKKwkJeworCQkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9HUElPX19BLCBTQ1VfUkFNX0dQSU9fSFdfTE9DS19JTkRfRElTQUJMRSk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlnb3RvIGVycm9yOworCQl9CisKKwkJLyogZGlzYWJsZSBNUEVHIHBvcnQgKi8KKwkJc3RhdHVzID0gTVBFR1RTRGlzYWJsZShzdGF0ZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKworCQkvKiBTdG9wIEFVRCBhbmQgU0NVICovCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEFVRF9DT01NX0VYRUNfX0EsIEFVRF9DT01NX0VYRUNfU1RPUCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX0NPTU1fRVhFQ19fQSwgU0NVX0NPTU1fRVhFQ19TVE9QKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCisJCS8qIGVuYWJsZSB0b2tlbi1yaW5nIGJ1cyB0aHJvdWdoIE9GRE0gYmxvY2sgZm9yIHBvc3NpYmxlIHVjb2RlIHVwbG9hZCAqLworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fT0ZETV9TSF9PRkRNX1JJTkdfRU5BQkxFX19BLCBTSU9fT0ZETV9TSF9PRkRNX1JJTkdfRU5BQkxFX09OKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCisJCS8qIGluY2x1ZGUgYm9vdCBsb2FkZXIgc2VjdGlvbiAqLworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTSU9fQkxfQ09NTV9FWEVDX19BLCBTSU9fQkxfQ09NTV9FWEVDX0FDVElWRSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gQkxDaGFpbkNtZChzdGF0ZSwgMCwgNiwgMTAwKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCisJCWlmICghc3RhdGUtPm1pY3JvY29kZV9uYW1lKQorCQkJbG9hZF9taWNyb2NvZGUoc3RhdGUsICJkcnhrX2EzLm1jIik7CisJCWVsc2UKKwkJCWxvYWRfbWljcm9jb2RlKHN0YXRlLCBzdGF0ZS0+bWljcm9jb2RlX25hbWUpOworCisJCS8qIGRpc2FibGUgdG9rZW4tcmluZyBidXMgdGhyb3VnaCBPRkRNIGJsb2NrIGZvciBwb3NzaWJsZSB1Y29kZSB1cGxvYWQgKi8KKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0lPX09GRE1fU0hfT0ZETV9SSU5HX0VOQUJMRV9fQSwgU0lPX09GRE1fU0hfT0ZETV9SSU5HX0VOQUJMRV9PRkYpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJLyogUnVuIFNDVSBmb3IgYSBsaXR0bGUgd2hpbGUgdG8gaW5pdGlhbGl6ZSBtaWNyb2NvZGUgdmVyc2lvbiBudW1iZXJzICovCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9DT01NX0VYRUNfX0EsIFNDVV9DT01NX0VYRUNfQUNUSVZFKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCQlzdGF0dXMgPSBEUlhYX09wZW4oc3RhdGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCS8qIGFkZGVkIGZvciB0ZXN0ICovCisJCW1zbGVlcCgzMCk7CisKKwkJcG93ZXJNb2RlID0gRFJYS19QT1dFUl9ET1dOX09GRE07CisJCXN0YXR1cyA9IEN0cmxQb3dlck1vZGUoc3RhdGUsICZwb3dlck1vZGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJLyogU3RhbXAgZHJpdmVyIHZlcnNpb24gbnVtYmVyIGluIFNDVSBkYXRhIFJBTSBpbiBCQ0QgY29kZQorCQkJRG9uZSB0byBlbmFibGUgZmllbGQgYXBwbGljYXRpb24gZW5naW5lZXJzIHRvIHJldHJlaXZlIGRyeGRyaXZlciB2ZXJzaW9uCisJCQl2aWEgSTJDIGZyb20gU0NVIFJBTS4KKwkJCU5vdCB1c2luZyBTQ1UgY29tbWFuZCBpbnRlcmZhY2UgZm9yIFNDVSByZWdpc3RlciBhY2Nlc3Mgc2luY2Ugbm8KKwkJCW1pY3JvY29kZSBtYXkgYmUgcHJlc2VudC4KKwkJCSovCisJCWRyaXZlclZlcnNpb24gPQorCQkJKCgoRFJYS19WRVJTSU9OX01BSk9SIC8gMTAwKSAlIDEwKSA8PCAxMikgKworCQkJKCgoRFJYS19WRVJTSU9OX01BSk9SIC8gMTApICUgMTApIDw8IDgpICsKKwkJCSgoRFJYS19WRVJTSU9OX01BSk9SICUgMTApIDw8IDQpICsKKwkJCShEUlhLX1ZFUlNJT05fTUlOT1IgJSAxMCk7CisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIFNDVV9SQU1fRFJJVkVSX1ZFUl9ISV9fQSwgZHJpdmVyVmVyc2lvbik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJZHJpdmVyVmVyc2lvbiA9CisJCQkoKChEUlhLX1ZFUlNJT05fUEFUQ0ggLyAxMDAwKSAlIDEwKSA8PCAxMikgKworCQkJKCgoRFJYS19WRVJTSU9OX1BBVENIIC8gMTAwKSAlIDEwKSA8PCA4KSArCisJCQkoKChEUlhLX1ZFUlNJT05fUEFUQ0ggLyAxMCkgJSAxMCkgPDwgNCkgKworCQkJKERSWEtfVkVSU0lPTl9QQVRDSCAlIDEwKTsKKwkJc3RhdHVzID0gd3JpdGUxNihzdGF0ZSwgU0NVX1JBTV9EUklWRVJfVkVSX0xPX19BLCBkcml2ZXJWZXJzaW9uKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlnb3RvIGVycm9yOworCisJCXByaW50ayhLRVJOX0lORk8gIkRSWEsgZHJpdmVyIHZlcnNpb24gJWQuJWQuJWRcbiIsCisJCQlEUlhLX1ZFUlNJT05fTUFKT1IsIERSWEtfVkVSU0lPTl9NSU5PUiwKKwkJCURSWEtfVkVSU0lPTl9QQVRDSCk7CisKKwkJLyogRGlydHkgZml4IG9mIGRlZmF1bHQgdmFsdWVzIGZvciBST00vUEFUQ0ggbWljcm9jb2RlCisJCQlEaXJ0eSBiZWNhdXNlIHRoaXMgZml4IG1ha2VzIGl0IGltcG9zc2libGUgdG8gc2V0dXAgc3VpdGFibGUgdmFsdWVzCisJCQliZWZvcmUgY2FsbGluZyBEUlhfT3Blbi4gVGhpcyBzb2x1dGlvbiByZXF1aXJlcyBjaGFuZ2VzIHRvIFJGIEFHQyBzcGVlZAorCQkJdG8gYmUgZG9uZSB2aWEgdGhlIENUUkwgZnVuY3Rpb24gYWZ0ZXIgY2FsbGluZyBEUlhfT3BlbiAqLworCisJCS8qIG1fZHZidFJmQWdjQ2ZnLnNwZWVkID0gMzsgKi8KKworCQkvKiBSZXNldCBkcml2ZXIgZGVidWcgZmxhZ3MgdG8gMCAqLworCQlzdGF0dXMgPSB3cml0ZTE2KHN0YXRlLCBTQ1VfUkFNX0RSSVZFUl9ERUJVR19fQSwgMCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJLyogZHJpdmVyIDAuOS4wICovCisJCS8qIFNldHVwIEZFQyBPQzoKKwkJCU5PVEU6IE5vIG1vcmUgZnVsbCBGRUMgcmVzZXRzIGFsbG93ZWQgYWZ0ZXJ3YXJkcyEhICovCisJCXN0YXR1cyA9IHdyaXRlMTYoc3RhdGUsIEZFQ19DT01NX0VYRUNfX0EsIEZFQ19DT01NX0VYRUNfU1RPUCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJLyogTVBFR1RTIGZ1bmN0aW9ucyBhcmUgc3RpbGwgdGhlIHNhbWUgKi8KKwkJc3RhdHVzID0gTVBFR1RTRHRvSW5pdChzdGF0ZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gTVBFR1RTU3RvcChzdGF0ZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJZ290byBlcnJvcjsKKwkJc3RhdHVzID0gTVBFR1RTQ29uZmlndXJlUG9sYXJpdHkoc3RhdGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCXN0YXR1cyA9IE1QRUdUU0NvbmZpZ3VyZVBpbnMoc3RhdGUsIHN0YXRlLT5tX2VuYWJsZU1QRUdPdXRwdXQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCS8qIGFkZGVkOiBjb25maWd1cmUgR1BJTyAqLworCQlzdGF0dXMgPSBXcml0ZUdQSU8oc3RhdGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWdvdG8gZXJyb3I7CisKKwkJc3RhdGUtPm1fRHJ4a1N0YXRlID0gRFJYS19TVE9QUEVEOworCisJCWlmIChzdGF0ZS0+bV9iUG93ZXJEb3duKSB7CisJCQlzdGF0dXMgPSBQb3dlckRvd25EZXZpY2Uoc3RhdGUpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJCXN0YXRlLT5tX0RyeGtTdGF0ZSA9IERSWEtfUE9XRVJFRF9ET1dOOworCQl9IGVsc2UKKwkJCXN0YXRlLT5tX0RyeGtTdGF0ZSA9IERSWEtfU1RPUFBFRDsKKwl9CitlcnJvcjoKKwlpZiAoc3RhdHVzIDwgMCkKKwkJcHJpbnRrKEtFUk5fRVJSICJkcnhrOiBFcnJvciAlZCBvbiAlc1xuIiwgc3RhdHVzLCBfX2Z1bmNfXyk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBkcnhrX2NfcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCWRwcmludGsoMSwgIlxuIik7CisJa2ZyZWUoc3RhdGUpOworfQorCitzdGF0aWMgaW50IGRyeGtfY19pbml0KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJZHByaW50aygxLCAiXG4iKTsKKwlpZiAobXV0ZXhfdHJ5bG9jaygmc3RhdGUtPmN0bG9jaykgPT0gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKwlTZXRPcGVyYXRpb25Nb2RlKHN0YXRlLCBPTV9RQU1fSVRVX0EpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRyeGtfY19zbGVlcChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCWRwcmludGsoMSwgIlxuIik7CisJU2h1dERvd24oc3RhdGUpOworCW11dGV4X3VubG9jaygmc3RhdGUtPmN0bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHJ4a19nYXRlX2N0cmwoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGludCBlbmFibGUpCit7CisJc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisKKwlkcHJpbnRrKDEsICIlc1xuIiwgZW5hYmxlID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOworCXJldHVybiBDb25maWd1cmVJMkNCcmlkZ2Uoc3RhdGUsIGVuYWJsZSA/IHRydWUgOiBmYWxzZSk7Cit9CisKK3N0YXRpYyBpbnQgZHJ4a19zZXRfcGFyYW1ldGVycyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCSAgICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCit7CisJc3RydWN0IGRyeGtfc3RhdGUgKnN0YXRlID0gZmUtPmRlbW9kdWxhdG9yX3ByaXY7CisJdTMyIElGOworCisJZHByaW50aygxLCAiXG4iKTsKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDEpOworCWlmIChmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKQorCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfcGFyYW1zKGZlLCBwKTsKKwlpZiAoZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsKQorCQlmZS0+b3BzLmkyY19nYXRlX2N0cmwoZmUsIDApOworCXN0YXRlLT5wYXJhbSA9ICpwOworCWZlLT5vcHMudHVuZXJfb3BzLmdldF9mcmVxdWVuY3koZmUsICZJRik7CisJU3RhcnQoc3RhdGUsIDAsIElGKTsKKworCS8qIHByaW50ayhLRVJOX0RFQlVHICJkcnhrOiAlcyBJRj0lZCBkb25lXG4iLCBfX2Z1bmNfXywgSUYpOyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHJ4a19jX2dldF9mcm9udGVuZChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCSAgICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnApCit7CisJZHByaW50aygxLCAiXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkcnhrX3JlYWRfc3RhdHVzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBmZV9zdGF0dXNfdCAqc3RhdHVzKQoreworCXN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXUzMiBzdGF0OworCisJZHByaW50aygxLCAiXG4iKTsKKwkqc3RhdHVzID0gMDsKKwlHZXRMb2NrU3RhdHVzKHN0YXRlLCAmc3RhdCwgMCk7CisJaWYgKHN0YXQgPT0gTVBFR19MT0NLKQorCQkqc3RhdHVzIHw9IDB4MWY7CisJaWYgKHN0YXQgPT0gRkVDX0xPQ0spCisJCSpzdGF0dXMgfD0gMHgwZjsKKwlpZiAoc3RhdCA9PSBERU1PRF9MT0NLKQorCQkqc3RhdHVzIHw9IDB4MDc7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHJ4a19yZWFkX2JlcihzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICpiZXIpCit7CisJZHByaW50aygxLCAiXG4iKTsKKworCSpiZXIgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRyeGtfcmVhZF9zaWduYWxfc3RyZW5ndGgoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkJICAgICB1MTYgKnN0cmVuZ3RoKQoreworCXN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCXUzMiB2YWwgPSAwOworCisJZHByaW50aygxLCAiXG4iKTsKKwlSZWFkSUZBZ2Moc3RhdGUsICZ2YWwpOworCSpzdHJlbmd0aCA9IHZhbCAmIDB4ZmZmZjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkcnhrX3JlYWRfc25yKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MTYgKnNucikKK3sKKwlzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwlzMzIgc25yMjsKKworCWRwcmludGsoMSwgIlxuIik7CisJR2V0U2lnbmFsVG9Ob2lzZShzdGF0ZSwgJnNucjIpOworCSpzbnIgPSBzbnIyICYgMHhmZmZmOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRyeGtfcmVhZF91Y2Jsb2NrcyhzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgdTMyICp1Y2Jsb2NrcykKK3sKKwlzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKwl1MTYgZXJyOworCisJZHByaW50aygxLCAiXG4iKTsKKwlEVkJUUUFNR2V0QWNjUGt0RXJyKHN0YXRlLCAmZXJyKTsKKwkqdWNibG9ja3MgPSAodTMyKSBlcnI7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHJ4a19jX2dldF90dW5lX3NldHRpbmdzKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3R1bmVfc2V0dGluZ3MKKwkJCQkgICAgKnNldHMpCit7CisJZHByaW50aygxLCAiXG4iKTsKKwlzZXRzLT5taW5fZGVsYXlfbXMgPSAzMDAwOworCXNldHMtPm1heF9kcmlmdCA9IDA7CisJc2V0cy0+c3RlcF9zaXplID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHJ4a190X3JlbGVhc2Uoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJLyoKKwkgKiBUaGVyZSdzIG5vdGhpbmcgdG8gcmVsZWFzZSBoZXJlLCBhcyB0aGUgc3RhdGUgc3RydWN0CisJICogaXMgYWxyZWFkeSBmcmVlZCBieSBkcnhrX2NfcmVsZWFzZS4KKwkgKi8KK30KKworc3RhdGljIGludCBkcnhrX3RfaW5pdChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlzdHJ1Y3QgZHJ4a19zdGF0ZSAqc3RhdGUgPSBmZS0+ZGVtb2R1bGF0b3JfcHJpdjsKKworCWRwcmludGsoMSwgIlxuIik7CisJaWYgKG11dGV4X3RyeWxvY2soJnN0YXRlLT5jdGxvY2spID09IDApCisJCXJldHVybiAtRUJVU1k7CisJU2V0T3BlcmF0aW9uTW9kZShzdGF0ZSwgT01fRFZCVCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHJ4a190X3NsZWVwKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlKQoreworCXN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OworCisJZHByaW50aygxLCAiXG4iKTsKKwltdXRleF91bmxvY2soJnN0YXRlLT5jdGxvY2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRyeGtfdF9nZXRfZnJvbnRlbmQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsCisJCQkgICAgICAgc3RydWN0IGR2Yl9mcm9udGVuZF9wYXJhbWV0ZXJzICpwKQoreworCWRwcmludGsoMSwgIlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzIGRyeGtfY19vcHMgPSB7CisJLmluZm8gPSB7CisJCSAubmFtZSA9ICJEUlhLIERWQi1DIiwKKwkJIC50eXBlID0gRkVfUUFNLAorCQkgLmZyZXF1ZW5jeV9zdGVwc2l6ZSA9IDYyNTAwLAorCQkgLmZyZXF1ZW5jeV9taW4gPSA0NzAwMDAwMCwKKwkJIC5mcmVxdWVuY3lfbWF4ID0gODYyMDAwMDAwLAorCQkgLnN5bWJvbF9yYXRlX21pbiA9IDg3MDAwMCwKKwkJIC5zeW1ib2xfcmF0ZV9tYXggPSAxMTcwMDAwMCwKKwkJIC5jYXBzID0gRkVfQ0FOX1FBTV8xNiB8IEZFX0NBTl9RQU1fMzIgfCBGRV9DQU5fUUFNXzY0IHwKKwkJIEZFX0NBTl9RQU1fMTI4IHwgRkVfQ0FOX1FBTV8yNTYgfCBGRV9DQU5fRkVDX0FVVE99LAorCS5yZWxlYXNlID0gZHJ4a19jX3JlbGVhc2UsCisJLmluaXQgPSBkcnhrX2NfaW5pdCwKKwkuc2xlZXAgPSBkcnhrX2Nfc2xlZXAsCisJLmkyY19nYXRlX2N0cmwgPSBkcnhrX2dhdGVfY3RybCwKKworCS5zZXRfZnJvbnRlbmQgPSBkcnhrX3NldF9wYXJhbWV0ZXJzLAorCS5nZXRfZnJvbnRlbmQgPSBkcnhrX2NfZ2V0X2Zyb250ZW5kLAorCS5nZXRfdHVuZV9zZXR0aW5ncyA9IGRyeGtfY19nZXRfdHVuZV9zZXR0aW5ncywKKworCS5yZWFkX3N0YXR1cyA9IGRyeGtfcmVhZF9zdGF0dXMsCisJLnJlYWRfYmVyID0gZHJ4a19yZWFkX2JlciwKKwkucmVhZF9zaWduYWxfc3RyZW5ndGggPSBkcnhrX3JlYWRfc2lnbmFsX3N0cmVuZ3RoLAorCS5yZWFkX3NuciA9IGRyeGtfcmVhZF9zbnIsCisJLnJlYWRfdWNibG9ja3MgPSBkcnhrX3JlYWRfdWNibG9ja3MsCit9OworCitzdGF0aWMgc3RydWN0IGR2Yl9mcm9udGVuZF9vcHMgZHJ4a190X29wcyA9IHsKKwkuaW5mbyA9IHsKKwkJIC5uYW1lID0gIkRSWEsgRFZCLVQiLAorCQkgLnR5cGUgPSBGRV9PRkRNLAorCQkgLmZyZXF1ZW5jeV9taW4gPSA0NzEyNTAwMCwKKwkJIC5mcmVxdWVuY3lfbWF4ID0gODY1MDAwMDAwLAorCQkgLmZyZXF1ZW5jeV9zdGVwc2l6ZSA9IDE2NjY2NywKKwkJIC5mcmVxdWVuY3lfdG9sZXJhbmNlID0gMCwKKwkJIC5jYXBzID0gRkVfQ0FOX0ZFQ18xXzIgfCBGRV9DQU5fRkVDXzJfMyB8CisJCSBGRV9DQU5fRkVDXzNfNCB8IEZFX0NBTl9GRUNfNV82IHwgRkVfQ0FOX0ZFQ183XzggfAorCQkgRkVfQ0FOX0ZFQ19BVVRPIHwKKwkJIEZFX0NBTl9RQU1fMTYgfCBGRV9DQU5fUUFNXzY0IHwKKwkJIEZFX0NBTl9RQU1fQVVUTyB8CisJCSBGRV9DQU5fVFJBTlNNSVNTSU9OX01PREVfQVVUTyB8CisJCSBGRV9DQU5fR1VBUkRfSU5URVJWQUxfQVVUTyB8CisJCSBGRV9DQU5fSElFUkFSQ0hZX0FVVE8gfCBGRV9DQU5fUkVDT1ZFUiB8IEZFX0NBTl9NVVRFX1RTfSwKKwkucmVsZWFzZSA9IGRyeGtfdF9yZWxlYXNlLAorCS5pbml0ID0gZHJ4a190X2luaXQsCisJLnNsZWVwID0gZHJ4a190X3NsZWVwLAorCS5pMmNfZ2F0ZV9jdHJsID0gZHJ4a19nYXRlX2N0cmwsCisKKwkuc2V0X2Zyb250ZW5kID0gZHJ4a19zZXRfcGFyYW1ldGVycywKKwkuZ2V0X2Zyb250ZW5kID0gZHJ4a190X2dldF9mcm9udGVuZCwKKworCS5yZWFkX3N0YXR1cyA9IGRyeGtfcmVhZF9zdGF0dXMsCisJLnJlYWRfYmVyID0gZHJ4a19yZWFkX2JlciwKKwkucmVhZF9zaWduYWxfc3RyZW5ndGggPSBkcnhrX3JlYWRfc2lnbmFsX3N0cmVuZ3RoLAorCS5yZWFkX3NuciA9IGRyeGtfcmVhZF9zbnIsCisJLnJlYWRfdWNibG9ja3MgPSBkcnhrX3JlYWRfdWNibG9ja3MsCit9OworCitzdHJ1Y3QgZHZiX2Zyb250ZW5kICpkcnhrX2F0dGFjaChjb25zdCBzdHJ1Y3QgZHJ4a19jb25maWcgKmNvbmZpZywKKwkJCQkgc3RydWN0IGkyY19hZGFwdGVyICppMmMsCisJCQkJIHN0cnVjdCBkdmJfZnJvbnRlbmQgKipmZV90KQoreworCXN0cnVjdCBkcnhrX3N0YXRlICpzdGF0ZSA9IE5VTEw7CisJdTggYWRyID0gY29uZmlnLT5hZHI7CisKKwlkcHJpbnRrKDEsICJcbiIpOworCXN0YXRlID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRyeGtfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0YXRlKQorCQlyZXR1cm4gTlVMTDsKKworCXN0YXRlLT5pMmMgPSBpMmM7CisJc3RhdGUtPmRlbW9kX2FkZHJlc3MgPSBhZHI7CisJc3RhdGUtPnNpbmdsZV9tYXN0ZXIgPSBjb25maWctPnNpbmdsZV9tYXN0ZXI7CisJc3RhdGUtPm1pY3JvY29kZV9uYW1lID0gY29uZmlnLT5taWNyb2NvZGVfbmFtZTsKKwlzdGF0ZS0+bm9faTJjX2JyaWRnZSA9IGNvbmZpZy0+bm9faTJjX2JyaWRnZTsKKwlzdGF0ZS0+YW50ZW5uYV9ncGlvID0gY29uZmlnLT5hbnRlbm5hX2dwaW87CisJc3RhdGUtPmFudGVubmFfZHZidCA9IGNvbmZpZy0+YW50ZW5uYV9kdmJ0OworCisJLyogTk9URTogYXMgbW9yZSBVSU8gYml0cyB3aWxsIGJlIHVzZWQsIGFkZCB0aGVtIHRvIHRoZSBtYXNrICovCisJc3RhdGUtPlVJT19tYXNrID0gY29uZmlnLT5hbnRlbm5hX2dwaW87CisKKwkvKiBEZWZhdWx0IGdwaW8gdG8gRFZCLUMgKi8KKwlpZiAoIXN0YXRlLT5hbnRlbm5hX2R2YnQgJiYgc3RhdGUtPmFudGVubmFfZ3BpbykKKwkJc3RhdGUtPm1fR1BJTyB8PSBzdGF0ZS0+YW50ZW5uYV9ncGlvOworCWVsc2UKKwkJc3RhdGUtPm1fR1BJTyAmPSB+c3RhdGUtPmFudGVubmFfZ3BpbzsKKworCW11dGV4X2luaXQoJnN0YXRlLT5tdXRleCk7CisJbXV0ZXhfaW5pdCgmc3RhdGUtPmN0bG9jayk7CisKKwltZW1jcHkoJnN0YXRlLT5jX2Zyb250ZW5kLm9wcywgJmRyeGtfY19vcHMsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgZHZiX2Zyb250ZW5kX29wcykpOworCW1lbWNweSgmc3RhdGUtPnRfZnJvbnRlbmQub3BzLCAmZHJ4a190X29wcywKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBkdmJfZnJvbnRlbmRfb3BzKSk7CisJc3RhdGUtPmNfZnJvbnRlbmQuZGVtb2R1bGF0b3JfcHJpdiA9IHN0YXRlOworCXN0YXRlLT50X2Zyb250ZW5kLmRlbW9kdWxhdG9yX3ByaXYgPSBzdGF0ZTsKKworCWluaXRfc3RhdGUoc3RhdGUpOworCWlmIChpbml0X2RyeGsoc3RhdGUpIDwgMCkKKwkJZ290byBlcnJvcjsKKwkqZmVfdCA9ICZzdGF0ZS0+dF9mcm9udGVuZDsKKworCXJldHVybiAmc3RhdGUtPmNfZnJvbnRlbmQ7CisKK2Vycm9yOgorCXByaW50ayhLRVJOX0VSUiAiZHJ4azogbm90IGZvdW5kXG4iKTsKKwlrZnJlZShzdGF0ZSk7CisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGRyeGtfYXR0YWNoKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJEUlgtSyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlJhbHBoIE1ldHpsZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcnhrX2hhcmQuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcnhrX2hhcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDVjMzJlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2RyeGtfaGFyZC5oCkBAIC0wLDAgKzEsMzQ4IEBACisjaW5jbHVkZSAiZHJ4a19tYXAuaCIKKworI2RlZmluZSBEUlhLX1ZFUlNJT05fTUFKT1IgMAorI2RlZmluZSBEUlhLX1ZFUlNJT05fTUlOT1IgOQorI2RlZmluZSBEUlhLX1ZFUlNJT05fUEFUQ0ggNDMwMAorCisjZGVmaW5lIEhJX0kyQ19ERUxBWSAgICAgICAgNDIKKyNkZWZpbmUgSElfSTJDX0JSSURHRV9ERUxBWSAzNTAKKyNkZWZpbmUgRFJYS19NQVhfUkVUUklFUyAgICAxMDAKKworI2RlZmluZSBEUklWRVJfNDQwMCAxCisKKyNkZWZpbmUgRFJYWF9KVEFHSUQgICAweDAzOTIxMEQ5CisjZGVmaW5lIERSWFhfSl9KVEFHSUQgMHgyMzkzMTBEOQorI2RlZmluZSBEUlhYX0tfSlRBR0lEIDB4MDM5MjEwRDkKKworI2RlZmluZSBEUlhfVU5LTk9XTiAgICAgMjU0CisjZGVmaW5lIERSWF9BVVRPICAgICAgICAyNTUKKworI2RlZmluZSBEUlhfU0NVX1JFQURZICAgMAorI2RlZmluZSBEUlhLX01BWF9XQUlUVElNRSAoMjAwKQorI2RlZmluZSBTQ1VfUkVTVUxUX09LICAgICAgMAorI2RlZmluZSBTQ1VfUkVTVUxUX1NJWkUgICAtNAorI2RlZmluZSBTQ1VfUkVTVUxUX0lOVlBBUiAtMworI2RlZmluZSBTQ1VfUkVTVUxUX1VOS1NURCAtMgorI2RlZmluZSBTQ1VfUkVTVUxUX1VOS0NNRCAtMQorCisjaWZuZGVmIERSWEtfT0ZETV9UUl9TSFVURE9XTl9USU1FT1VUCisjZGVmaW5lIERSWEtfT0ZETV9UUl9TSFVURE9XTl9USU1FT1VUICgyMDApCisjZW5kaWYKKworI2RlZmluZSBEUlhLXzhWU0JfTVBFR19CSVRfUkFURSAgICAgMTkzOTI2NThVTCAgLypicHMqLworI2RlZmluZSBEUlhLX0RWQlRfTVBFR19CSVRfUkFURSAgICAgMzIwMDAwMDBVTCAgLypicHMqLworI2RlZmluZSBEUlhLX1FBTTE2X01QRUdfQklUX1JBVEUgICAgMjcwMDAwMDBVTCAgLypicHMqLworI2RlZmluZSBEUlhLX1FBTTMyX01QRUdfQklUX1JBVEUgICAgMzMwMDAwMDBVTCAgLypicHMqLworI2RlZmluZSBEUlhLX1FBTTY0X01QRUdfQklUX1JBVEUgICAgNDAwMDAwMDBVTCAgLypicHMqLworI2RlZmluZSBEUlhLX1FBTTEyOF9NUEVHX0JJVF9SQVRFICAgNDYwMDAwMDBVTCAgLypicHMqLworI2RlZmluZSBEUlhLX1FBTTI1Nl9NUEVHX0JJVF9SQVRFICAgNTIwMDAwMDBVTCAgLypicHMqLworI2RlZmluZSBEUlhLX01BWF9NUEVHX0JJVF9SQVRFICAgICAgNTIwMDAwMDBVTCAgLypicHMqLworCisjZGVmaW5lICAgSVFNX0NGX09VVF9FTkFfT0ZETV9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lICAgICBJUU1fRlNfQURKX1NFTF9CX1FBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICAgICBJUU1fRlNfQURKX1NFTF9CX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICAgICBJUU1fRlNfQURKX1NFTF9CX1ZTQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lICAgICBJUU1fUkNfQURKX1NFTF9CX09GRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICAgICBJUU1fUkNfQURKX1NFTF9CX1FBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICAgICBJUU1fUkNfQURKX1NFTF9CX1ZTQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisKK2VudW0gT3BlcmF0aW9uTW9kZSB7CisJT01fTk9ORSwKKwlPTV9RQU1fSVRVX0EsCisJT01fUUFNX0lUVV9CLAorCU9NX1FBTV9JVFVfQywKKwlPTV9EVkJUCit9OworCitlbnVtIERSWFBvd2VyTW9kZSB7CisJRFJYX1BPV0VSX1VQID0gMCwKKwlEUlhfUE9XRVJfTU9ERV8xLAorCURSWF9QT1dFUl9NT0RFXzIsCisJRFJYX1BPV0VSX01PREVfMywKKwlEUlhfUE9XRVJfTU9ERV80LAorCURSWF9QT1dFUl9NT0RFXzUsCisJRFJYX1BPV0VSX01PREVfNiwKKwlEUlhfUE9XRVJfTU9ERV83LAorCURSWF9QT1dFUl9NT0RFXzgsCisKKwlEUlhfUE9XRVJfTU9ERV85LAorCURSWF9QT1dFUl9NT0RFXzEwLAorCURSWF9QT1dFUl9NT0RFXzExLAorCURSWF9QT1dFUl9NT0RFXzEyLAorCURSWF9QT1dFUl9NT0RFXzEzLAorCURSWF9QT1dFUl9NT0RFXzE0LAorCURSWF9QT1dFUl9NT0RFXzE1LAorCURSWF9QT1dFUl9NT0RFXzE2LAorCURSWF9QT1dFUl9ET1dOID0gMjU1Cit9OworCisKKy8qKiAvYnJpZWYgSW50ZXJtZWRpYXRlIHBvd2VyIG1vZGUgZm9yIERSWEssIHBvd2VyIGRvd24gT0ZETSBjbG9jayBkb21haW4gKi8KKyNpZm5kZWYgRFJYS19QT1dFUl9ET1dOX09GRE0KKyNkZWZpbmUgRFJYS19QT1dFUl9ET1dOX09GRE0gICAgICAgIERSWF9QT1dFUl9NT0RFXzEKKyNlbmRpZgorCisvKiogL2JyaWVmIEludGVybWVkaWF0ZSBwb3dlciBtb2RlIGZvciBEUlhLLCBwb3dlciBkb3duIGNvcmUgKHN5c2NsaykgKi8KKyNpZm5kZWYgRFJYS19QT1dFUl9ET1dOX0NPUkUKKyNkZWZpbmUgRFJYS19QT1dFUl9ET1dOX0NPUkUgICAgICAgIERSWF9QT1dFUl9NT0RFXzkKKyNlbmRpZgorCisvKiogL2JyaWVmIEludGVybWVkaWF0ZSBwb3dlciBtb2RlIGZvciBEUlhLLCBwb3dlciBkb3duIHBsbCAob25seSBvc2MgcnVucykgKi8KKyNpZm5kZWYgRFJYS19QT1dFUl9ET1dOX1BMTAorI2RlZmluZSBEUlhLX1BPV0VSX0RPV05fUExMICAgICAgICAgRFJYX1BPV0VSX01PREVfMTAKKyNlbmRpZgorCisKK2VudW0gQUdDX0NUUkxfTU9ERSB7IERSWEtfQUdDX0NUUkxfQVVUTyA9IDAsIERSWEtfQUdDX0NUUkxfVVNFUiwgRFJYS19BR0NfQ1RSTF9PRkYgfTsKK2VudW0gRURyeGtTdGF0ZSB7IERSWEtfVU5JTklUSUFMSVpFRCA9IDAsIERSWEtfU1RPUFBFRCwgRFJYS19EVFZfU1RBUlRFRCwgRFJYS19BVFZfU1RBUlRFRCwgRFJYS19QT1dFUkVEX0RPV04gfTsKK2VudW0gRURyeGtDb2VmQXJyYXlJbmRleCB7CisJRFJYS19DT0VGX0lEWF9NTiA9IDAsCisJRFJYS19DT0VGX0lEWF9GTSAgICAsCisJRFJYS19DT0VGX0lEWF9MICAgICAsCisJRFJYS19DT0VGX0lEWF9MUCAgICAsCisJRFJYS19DT0VGX0lEWF9CRyAgICAsCisJRFJYS19DT0VGX0lEWF9ESyAgICAsCisJRFJYS19DT0VGX0lEWF9JICAgICAsCisJRFJYS19DT0VGX0lEWF9NQVgKK307CitlbnVtIEVEcnhrU2lmQXR0ZW51YXRpb24geworCURSWEtfU0lGX0FUVEVOVUFUSU9OXzBEQiwKKwlEUlhLX1NJRl9BVFRFTlVBVElPTl8zREIsCisJRFJYS19TSUZfQVRURU5VQVRJT05fNkRCLAorCURSWEtfU0lGX0FUVEVOVUFUSU9OXzlEQgorfTsKK2VudW0gRURyeGtDb25zdGVsbGF0aW9uIHsKKwlEUlhfQ09OU1RFTExBVElPTl9CUFNLID0gMCwKKwlEUlhfQ09OU1RFTExBVElPTl9RUFNLLAorCURSWF9DT05TVEVMTEFUSU9OX1BTSzgsCisJRFJYX0NPTlNURUxMQVRJT05fUUFNMTYsCisJRFJYX0NPTlNURUxMQVRJT05fUUFNMzIsCisJRFJYX0NPTlNURUxMQVRJT05fUUFNNjQsCisJRFJYX0NPTlNURUxMQVRJT05fUUFNMTI4LAorCURSWF9DT05TVEVMTEFUSU9OX1FBTTI1NiwKKwlEUlhfQ09OU1RFTExBVElPTl9RQU01MTIsCisJRFJYX0NPTlNURUxMQVRJT05fUUFNMTAyNCwKKwlEUlhfQ09OU1RFTExBVElPTl9VTktOT1dOID0gRFJYX1VOS05PV04sCisJRFJYX0NPTlNURUxMQVRJT05fQVVUTyAgICA9IERSWF9BVVRPCit9OworZW51bSBFRHJ4a0ludGVybGVhdmVNb2RlIHsKKwlEUlhLX1FBTV9JMTJfSjE3ICAgID0gMTYsCisJRFJYS19RQU1fSV9VTktOT1dOICA9IERSWF9VTktOT1dOCit9OworZW51bSB7CisJRFJYS19TUElOX0ExID0gMCwKKwlEUlhLX1NQSU5fQTIsCisJRFJYS19TUElOX0EzLAorCURSWEtfU1BJTl9VTktOT1dOCit9OworCitlbnVtIERSWEtDZmdEdmJ0U3FpU3BlZWQgeworCURSWEtfRFZCVF9TUUlfU1BFRURfRkFTVCA9IDAsCisJRFJYS19EVkJUX1NRSV9TUEVFRF9NRURJVU0sCisJRFJYS19EVkJUX1NRSV9TUEVFRF9TTE9XLAorCURSWEtfRFZCVF9TUUlfU1BFRURfVU5LTk9XTiA9IERSWF9VTktOT1dOCit9IDsKKworZW51bSBEUlhGZnRtb2RlX3QgeworCURSWF9GRlRNT0RFXzJLID0gMCwKKwlEUlhfRkZUTU9ERV80SywKKwlEUlhfRkZUTU9ERV84SywKKwlEUlhfRkZUTU9ERV9VTktOT1dOID0gRFJYX1VOS05PV04sCisJRFJYX0ZGVE1PREVfQVVUTyAgICA9IERSWF9BVVRPCit9OworCitlbnVtIERSWE1QRUdTdHJXaWR0aF90IHsKKwlEUlhfTVBFR19TVFJfV0lEVEhfMSwKKwlEUlhfTVBFR19TVFJfV0lEVEhfOAorfTsKKworZW51bSBEUlhRYW1Mb2NrUmFuZ2VfdCB7CisJRFJYX1FBTV9MT0NLUkFOR0VfTk9STUFMLAorCURSWF9RQU1fTE9DS1JBTkdFX0VYVEVOREVECit9OworCitzdHJ1Y3QgRFJYS0NmZ0R2YnRFY2hvVGhyZXNfdCB7CisJdTE2ICAgICAgICAgICAgIHRocmVzaG9sZDsKKwllbnVtIERSWEZmdG1vZGVfdCAgICAgIGZmdE1vZGU7Cit9IDsKKworc3RydWN0IFNDZmdBZ2MgeworCWVudW0gQUdDX0NUUkxfTU9ERSAgICAgY3RybE1vZGU7ICAgICAgICAvKiBvZmYsIHVzZXIsIGF1dG8gKi8KKwl1MTYgICAgICAgICAgICBvdXRwdXRMZXZlbDsgICAgIC8qIHJhbmdlIGRlcGVuZGVudCBvbiBBR0MgKi8KKwl1MTYgICAgICAgICAgICBtaW5PdXRwdXRMZXZlbDsgIC8qIHJhbmdlIGRlcGVuZGVudCBvbiBBR0MgKi8KKwl1MTYgICAgICAgICAgICBtYXhPdXRwdXRMZXZlbDsgIC8qIHJhbmdlIGRlcGVuZGVudCBvbiBBR0MgKi8KKwl1MTYgICAgICAgICAgICBzcGVlZDsgICAgICAgICAgIC8qIHJhbmdlIGRlcGVuZGVudCBvbiBBR0MgKi8KKwl1MTYgICAgICAgICAgICB0b3A7ICAgICAgICAgICAgIC8qIHJmLWFnYyB0YWtlIG92ZXIgcG9pbnQgKi8KKwl1MTYgICAgICAgICAgICBjdXRPZmZDdXJyZW50OyAgIC8qIHJmLWFnYyBpcyBhY2NlbGVyYXRlZCBpZiBvdXRwdXQgY3VycmVudAorCQkJCQkgICBpcyBiZWxvdyBjdXQtb2ZmIGN1cnJlbnQgKi8KKwl1MTYgICAgICAgICAgICBJbmdhaW5UZ3RNYXg7CisJdTE2ICAgICAgICAgICAgRmFzdENsaXBDdHJsRGVsYXk7Cit9OworCitzdHJ1Y3QgU0NmZ1ByZVNhdyB7CisJdTE2ICAgICAgICByZWZlcmVuY2U7IC8qIHByZSBTQVcgcmVmZXJlbmNlIHZhbHVlLCByYW5nZSAwIC4uIDMxICovCisJYm9vbCAgICAgICAgICB1c2VQcmVTYXc7IC8qIFRSVUUgYWxnb3JpdGhtcyBtdXN0IHVzZSBwcmUgU0FXIHNlbnNlICovCit9OworCitzdHJ1Y3QgRFJYS09mZG1TY0NtZF90IHsKKwl1MTYgY21kOyAgICAgICAgLyoqPCBDb21tYW5kIG51bWJlciAqLworCXUxNiBzdWJjbWQ7ICAgICAvKio8IFN1Yi1jb21tYW5kIHBhcmFtZXRlciovCisJdTE2IHBhcmFtMDsgICAgIC8qKjwgR2VuZXJhbCBwdXJwb3VzIHBhcmFtICovCisJdTE2IHBhcmFtMTsgICAgIC8qKjwgR2VuZXJhbCBwdXJwb3VzIHBhcmFtICovCisJdTE2IHBhcmFtMjsgICAgIC8qKjwgR2VuZXJhbCBwdXJwb3VzIHBhcmFtICovCisJdTE2IHBhcmFtMzsgICAgIC8qKjwgR2VuZXJhbCBwdXJwb3VzIHBhcmFtICovCisJdTE2IHBhcmFtNDsgICAgIC8qKjwgR2VuZXJhbCBwdXJwb3VzIHBhcmFtICovCit9OworCitzdHJ1Y3QgZHJ4a19zdGF0ZSB7CisJc3RydWN0IGR2Yl9mcm9udGVuZCBjX2Zyb250ZW5kOworCXN0cnVjdCBkdmJfZnJvbnRlbmQgdF9mcm9udGVuZDsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgcGFyYW07CisJc3RydWN0IGRldmljZSAqZGV2OworCisJc3RydWN0IGkyY19hZGFwdGVyICppMmM7CisJdTggICAgIGRlbW9kX2FkZHJlc3M7CisJdm9pZCAgKnByaXY7CisKKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJc3RydWN0IG11dGV4IGN0bG9jazsKKworCXUzMiAgICBtX0luc3RhbmNlOyAgICAgICAgICAgLyoqPCBDaGFubmVsIDEsMiwzIG9yIDQgKi8KKworCWludCAgICBtX0NodW5rU2l6ZTsKKwl1OCBDaHVua1syNTZdOworCisJYm9vbCAgIG1faGFzTE5BOworCWJvb2wgICBtX2hhc0RWQlQ7CisJYm9vbCAgIG1faGFzRFZCQzsKKwlib29sICAgbV9oYXNBdWRpbzsKKwlib29sICAgbV9oYXNBVFY7CisJYm9vbCAgIG1faGFzT09COworCWJvb2wgICBtX2hhc1NBV1NXOyAgICAgICAgIC8qKjwgVFJVRSBpZiBtYXRfdHggaXMgYXZhaWxhYmxlICovCisJYm9vbCAgIG1faGFzR1BJTzE7ICAgICAgICAgLyoqPCBUUlVFIGlmIG1hdF9yeCBpcyBhdmFpbGFibGUgKi8KKwlib29sICAgbV9oYXNHUElPMjsgICAgICAgICAvKio8IFRSVUUgaWYgR1BJTyBpcyBhdmFpbGFibGUgKi8KKwlib29sICAgbV9oYXNJUlFOOyAgICAgICAgICAvKio8IFRSVUUgaWYgSVJRTiBpcyBhdmFpbGFibGUgKi8KKwl1MTYgICAgbV9vc2NDbG9ja0ZyZXE7CisJdTE2ICAgIG1fSElDZmdUaW1pbmdEaXY7CisJdTE2ICAgIG1fSElDZmdCcmlkZ2VEZWxheTsKKwl1MTYgICAgbV9ISUNmZ1dha2VVcEtleTsKKwl1MTYgICAgbV9ISUNmZ1RpbWVvdXQ7CisJdTE2ICAgIG1fSElDZmdDdHJsOworCXMzMiAgICBtX3N5c0Nsb2NrRnJlcTsgICAgICAvKio8IHN5c3RlbSBjbG9jayBmcmVxdWVuY3kgaW4ga0h6ICovCisKKwllbnVtIEVEcnhrU3RhdGUgICAgbV9EcnhrU3RhdGU7ICAgICAgLyoqPCBTdGF0ZSBvZiBEcnhrIChpbml0LHN0b3BwZWQsc3RhcnRlZCkgKi8KKwllbnVtIE9wZXJhdGlvbk1vZGUgbV9PcGVyYXRpb25Nb2RlOyAgLyoqPCBkaWdpdGFsIHN0YW5kYXJkcyAqLworCXN0cnVjdCBTQ2ZnQWdjICAgICBtX3ZzYlJmQWdjQ2ZnOyAgICAvKio8IHNldHRpbmdzIGZvciBWU0IgUkYtQUdDICovCisJc3RydWN0IFNDZmdBZ2MgICAgIG1fdnNiSWZBZ2NDZmc7ICAgIC8qKjwgc2V0dGluZ3MgZm9yIFZTQiBJRi1BR0MgKi8KKwl1MTYgICAgICAgICAgICAgICAgbV92c2JQZ2FDZmc7ICAgICAgLyoqPCBzZXR0aW5ncyBmb3IgVlNCIFBHQSAqLworCXN0cnVjdCBTQ2ZnUHJlU2F3ICBtX3ZzYlByZVNhd0NmZzsgICAvKio8IHNldHRpbmdzIGZvciBwcmUgU0FXIHNlbnNlICovCisJczMyICAgIG1fUXVhbGl0eTgzcGVyY2VudDsgIC8qKjwgTUVSIGxldmVsICgqMC4xIGRCKSBmb3IgODMlIHF1YWxpdHkgaW5kaWNhdGlvbiAqLworCXMzMiAgICBtX1F1YWxpdHk5M3BlcmNlbnQ7ICAvKio8IE1FUiBsZXZlbCAoKjAuMSBkQikgZm9yIDkzJSBxdWFsaXR5IGluZGljYXRpb24gKi8KKwlib29sICAgbV9zbWFydEFudEludmVydGVkOworCWJvb2wgICBtX2JEZWJ1Z0VuYWJsZUJyaWRnZTsKKwlib29sICAgbV9iUERvd25PcGVuQnJpZGdlOyAgLyoqPCBvbmx5IG9wZW4gRFJYSyBicmlkZ2UgYmVmb3JlIHBvd2VyLWRvd24gb25jZSBpdCBoYXMgYmVlbiBhY2Nlc3NlZCAqLworCWJvb2wgICBtX2JQb3dlckRvd247ICAgICAgICAvKio8IFBvd2VyIGRvd24gd2hlbiBub3QgdXNlZCAqLworCisJdTMyICAgIG1fSXFtRnNSYXRlT2ZzOyAgICAgIC8qKjwgZnJlcXVlbmN5IHNoaWZ0IGFzIHdyaXR0ZW4gdG8gRFJYSyByZWdpc3RlciAoMjhiaXQgZml4cG9pbnQpICovCisKKwlib29sICAgbV9lbmFibGVNUEVHT3V0cHV0OyAgLyoqPCBJZiBUUlVFLCBlbmFibGUgTVBFRyBvdXRwdXQgKi8KKwlib29sICAgbV9pbnNlcnRSU0J5dGU7ICAgICAgLyoqPCBJZiBUUlVFLCBpbnNlcnQgUlMgYnl0ZSAqLworCWJvb2wgICBtX2VuYWJsZVBhcmFsbGVsOyAgICAvKio8IElmIFRSVUUsIHBhcmFsbGVsIG91dCBvdGhlcndpc2Ugc2VyaWFsICovCisJYm9vbCAgIG1faW52ZXJ0REFUQTsgICAgICAgIC8qKjwgSWYgVFJVRSwgaW52ZXJ0IERBVEEgc2lnbmFscyAqLworCWJvb2wgICBtX2ludmVydEVSUjsgICAgICAgICAvKio8IElmIFRSVUUsIGludmVydCBFUlIgc2lnbmFsICovCisJYm9vbCAgIG1faW52ZXJ0U1RSOyAgICAgICAgIC8qKjwgSWYgVFJVRSwgaW52ZXJ0IFNUUiBzaWduYWxzICovCisJYm9vbCAgIG1faW52ZXJ0VkFMOyAgICAgICAgIC8qKjwgSWYgVFJVRSwgaW52ZXJ0IFZBTCBzaWduYWxzICovCisJYm9vbCAgIG1faW52ZXJ0Q0xLOyAgICAgICAgIC8qKjwgSWYgVFJVRSwgaW52ZXJ0IENMSyBzaWduYWxzICovCisJYm9vbCAgIG1fRFZCQ1N0YXRpY0NMSzsKKwlib29sICAgbV9EVkJUU3RhdGljQ0xLOyAgICAgLyoqPCBJZiBUUlVFLCBzdGF0aWMgTVBFRyBjbG9ja3JhdGUgd2lsbAorCQkJCQkgYmUgdXNlZCwgb3RoZXJ3aXNlIGNsb2NrcmF0ZSB3aWxsCisJCQkJCSBhZGFwdCB0byB0aGUgYml0cmF0ZSBvZiB0aGUgVFMgKi8KKwl1MzIgICAgbV9EVkJUQml0cmF0ZTsKKwl1MzIgICAgbV9EVkJDQml0cmF0ZTsKKworCXU4ICAgICBtX1RTRGF0YVN0cmVuZ3RoOworCXU4ICAgICBtX1RTQ2xvY2trU3RyZW5ndGg7CisKKwllbnVtIERSWE1QRUdTdHJXaWR0aF90ICBtX3dpZHRoU1RSOyAgICAvKio8IE1QRUcgc3RhcnQgd2lkdGggKi8KKwl1MzIgICAgbV9tcGVnVHNTdGF0aWNCaXRyYXRlOyAgICAgICAgICAvKio8IE1heGltdW0gYml0cmF0ZSBpbiBiL3MgaW4gY2FzZQorCQkJCQkJICAgIHN0YXRpYyBjbG9ja3JhdGUgaXMgc2VsZWN0ZWQgKi8KKworCS8qIExBUkdFX0lOVEVHRVIgICBtX1N0YXJ0VGltZTsgKi8gICAgIC8qKjwgQ29udGFpbnMgdGhlIHRpbWUgb2YgdGhlIGxhc3QgZGVtb2Qgc3RhcnQgKi8KKwlzMzIgICAgbV9NcGVnTG9ja1RpbWVPdXQ7ICAgICAgLyoqPCBXYWl0Rm9yTG9ja1N0YXR1cyBUaW1lb3V0IChjb3VudHMgZnJvbSBzdGFydCB0aW1lKSAqLworCXMzMiAgICBtX0RlbW9kTG9ja1RpbWVPdXQ7ICAgICAvKio8IFdhaXRGb3JMb2NrU3RhdHVzIFRpbWVvdXQgKGNvdW50cyBmcm9tIHN0YXJ0IHRpbWUpICovCisKKwlib29sICAgbV9kaXNhYmxlVEVJaGFuZGxpbmc7CisKKwlib29sICAgbV9SZkFnY1BvbDsKKwlib29sICAgbV9JZkFnY1BvbDsKKworCXN0cnVjdCBTQ2ZnQWdjICAgIG1fYXR2UmZBZ2NDZmc7ICAvKio8IHNldHRpbmdzIGZvciBBVFYgUkYtQUdDICovCisJc3RydWN0IFNDZmdBZ2MgICAgbV9hdHZJZkFnY0NmZzsgIC8qKjwgc2V0dGluZ3MgZm9yIEFUViBJRi1BR0MgKi8KKwlzdHJ1Y3QgU0NmZ1ByZVNhdyBtX2F0dlByZVNhd0NmZzsgLyoqPCBzZXR0aW5ncyBmb3IgQVRWIHByZSBTQVcgc2Vuc2UgKi8KKwlib29sICAgICAgICAgICAgICBtX3BoYXNlQ29ycmVjdGlvbkJ5cGFzczsKKwlzMTYgICAgICAgICAgICAgICBtX2F0dlRvcFZpZFBlYWs7CisJdTE2ICAgICAgICAgICAgICAgbV9hdHZUb3BOb2lzZVRoOworCWVudW0gRURyeGtTaWZBdHRlbnVhdGlvbiBtX3NpZkF0dGVudWF0aW9uOworCWJvb2wgICAgICAgICAgICAgIG1fZW5hYmxlQ1ZCU091dHB1dDsKKwlib29sICAgICAgICAgICAgICBtX2VuYWJsZVNJRk91dHB1dDsKKwlib29sICAgICAgICAgICAgICBtX2JNaXJyb3JGcmVxU3BlY3Q7CisJZW51bSBFRHJ4a0NvbnN0ZWxsYXRpb24gIG1fQ29uc3RlbGxhdGlvbjsgLyoqPCBDb25zdGVsbGF0aW9uIHR5cGUgb2YgdGhlIGNoYW5uZWwgKi8KKwl1MzIgICAgICAgICAgICAgICBtX0N1cnJTeW1ib2xSYXRlOyAgICAgICAvKio8IEN1cnJlbnQgUUFNIHN5bWJvbCByYXRlICovCisJc3RydWN0IFNDZmdBZ2MgICAgbV9xYW1SZkFnY0NmZzsgICAgICAgICAgLyoqPCBzZXR0aW5ncyBmb3IgUUFNIFJGLUFHQyAqLworCXN0cnVjdCBTQ2ZnQWdjICAgIG1fcWFtSWZBZ2NDZmc7ICAgICAgICAgIC8qKjwgc2V0dGluZ3MgZm9yIFFBTSBJRi1BR0MgKi8KKwl1MTYgICAgICAgICAgICAgICBtX3FhbVBnYUNmZzsgICAgICAgICAgICAvKio8IHNldHRpbmdzIGZvciBRQU0gUEdBICovCisJc3RydWN0IFNDZmdQcmVTYXcgbV9xYW1QcmVTYXdDZmc7ICAgICAgICAgLyoqPCBzZXR0aW5ncyBmb3IgUUFNIHByZSBTQVcgc2Vuc2UgKi8KKwllbnVtIEVEcnhrSW50ZXJsZWF2ZU1vZGUgbV9xYW1JbnRlcmxlYXZlTW9kZTsgLyoqPCBRQU0gSW50ZXJsZWF2ZSBtb2RlICovCisJdTE2ICAgICAgICAgICAgICAgbV9mZWNSc1BsZW47CisJdTE2ICAgICAgICAgICAgICAgbV9mZWNSc1ByZXNjYWxlOworCisJZW51bSBEUlhLQ2ZnRHZidFNxaVNwZWVkIG1fc3FpU3BlZWQ7CisKKwl1MTYgICAgICAgICAgICAgICBtX0dQSU87CisJdTE2ICAgICAgICAgICAgICAgbV9HUElPQ2ZnOworCisJc3RydWN0IFNDZmdBZ2MgICAgbV9kdmJ0UmZBZ2NDZmc7ICAgICAvKio8IHNldHRpbmdzIGZvciBRQU0gUkYtQUdDICovCisJc3RydWN0IFNDZmdBZ2MgICAgbV9kdmJ0SWZBZ2NDZmc7ICAgICAvKio8IHNldHRpbmdzIGZvciBRQU0gSUYtQUdDICovCisJc3RydWN0IFNDZmdQcmVTYXcgbV9kdmJ0UHJlU2F3Q2ZnOyAgICAvKio8IHNldHRpbmdzIGZvciBRQU0gcHJlIFNBVyBzZW5zZSAqLworCisJdTE2ICAgICAgICAgICAgICAgbV9hZ2NGYXN0Q2xpcEN0cmxEZWxheTsKKwlib29sICAgICAgICAgICAgICBtX2FkY0NvbXBQYXNzZWQ7CisJdTE2ICAgICAgICAgICAgICAgbV9hZGNDb21wQ29lZls2NF07CisJdTE2ICAgICAgICAgICAgICAgbV9hZGNTdGF0ZTsKKworCXU4ICAgICAgICAgICAgICAgKm1fbWljcm9jb2RlOworCWludCAgICAgICAgICAgICAgIG1fbWljcm9jb2RlX2xlbmd0aDsKKwlib29sICAgICAgICAgICAgICBtX0RSWEtfQTFfUEFUQ0hfQ09ERTsKKwlib29sICAgICAgICAgICAgICBtX0RSWEtfQTFfUk9NX0NPREU7CisJYm9vbCAgICAgICAgICAgICAgbV9EUlhLX0EyX1JPTV9DT0RFOworCWJvb2wgICAgICAgICAgICAgIG1fRFJYS19BM19ST01fQ09ERTsKKwlib29sICAgICAgICAgICAgICBtX0RSWEtfQTJfUEFUQ0hfQ09ERTsKKwlib29sICAgICAgICAgICAgICBtX0RSWEtfQTNfUEFUQ0hfQ09ERTsKKworCWJvb2wgICAgICAgICAgICAgIG1fcmZtaXJyb3I7CisJdTggICAgICAgICAgICAgICAgbV9kZXZpY2VTcGluOworCXUzMiAgICAgICAgICAgICAgIG1faXFtUmNSYXRlOworCisJZW51bSBEUlhQb3dlck1vZGUgbV9jdXJyZW50UG93ZXJNb2RlOworCisJLyoKKwkgKiBDb25maWd1cmFibGUgcGFyYW1ldGVycyBhdCB0aGUgZHJpdmVyLiBUaGV5IHN0b3JlcyB0aGUgdmFsdWVzIGZvdW5kCisJICogYXQgc3RydWN0IGRyeGtfY29uZmlnLgorCSAqLworCisJdTE2CVVJT19tYXNrOwkvKiBCaXRzIHVzZWQgYnkgVUlPICovCisKKwlib29sCXNpbmdsZV9tYXN0ZXI7CisJYm9vbAlub19pMmNfYnJpZGdlOworCWJvb2wJYW50ZW5uYV9kdmJ0OworCXUxNglhbnRlbm5hX2dwaW87CisKKwljb25zdCBjaGFyICptaWNyb2NvZGVfbmFtZTsKK307CisKKyNkZWZpbmUgTkVWRVJfTE9DSyAwCisjZGVmaW5lIE5PVF9MT0NLRUQgMQorI2RlZmluZSBERU1PRF9MT0NLIDIKKyNkZWZpbmUgRkVDX0xPQ0sgICAzCisjZGVmaW5lIE1QRUdfTE9DSyAgNAorCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHJ4a19tYXAuaCBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9kcnhrX21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMTFhODMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvZHJ4a19tYXAuaApAQCAtMCwwICsxLDQ0OSBAQAorI2RlZmluZSAgQVVEX0NPTU1fRVhFQ19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwCisjZGVmaW5lICAgIEFVRF9DT01NX0VYRUNfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgIEZFQ19DT01NX0VYRUNfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUMwMDAwMAorI2RlZmluZSAgICBGRUNfQ09NTV9FWEVDX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICAgIEZFQ19DT01NX0VYRUNfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgIEZFQ19ESV9DT01NX0VYRUNfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUMyMDAwMAorI2RlZmluZSAgICBGRUNfRElfQ09NTV9FWEVDX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICBGRUNfRElfSU5QVVRfQ1RMX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDMjAwMTYKKyNkZWZpbmUgIEZFQ19SU19DT01NX0VYRUNfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUMzMDAwMAorI2RlZmluZSAgICBGRUNfUlNfQ09NTV9FWEVDX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICBGRUNfUlNfTUVBU1VSRU1FTlRfUEVSSU9EX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDMzAwMTIKKyNkZWZpbmUgIEZFQ19SU19NRUFTVVJFTUVOVF9QUkVTQ0FMRV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUMzMDAxMworI2RlZmluZSAgRkVDX09DX01PREVfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQzQwMDExCisjZGVmaW5lICAgIEZFQ19PQ19NT0RFX1BBUklUWV9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgIEZFQ19PQ19EVE9fTU9ERV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUM0MDAxNAorI2RlZmluZSAgICBGRUNfT0NfRFRPX01PREVfRFlOQU1JQ19fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICAgIEZFQ19PQ19EVE9fTU9ERV9PRkZTRVRfRU5BQkxFX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgIEZFQ19PQ19EVE9fUEVSSU9EX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUM0MDAxNQorI2RlZmluZSAgRkVDX09DX0RUT19CVVJTVF9MRU5fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQzQwMDE4CisjZGVmaW5lICBGRUNfT0NfRkNUX01PREVfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDNDAwMUEKKyNkZWZpbmUgIEZFQ19PQ19GQ1RfTU9ERV9fUFJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgICBGRUNfT0NfRkNUX01PREVfUkFUX0VOQV9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICAgIEZFQ19PQ19GQ1RfTU9ERV9WSVJUX0VOQV9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgIEZFQ19PQ19UTURfTU9ERV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUM0MDAxRQorI2RlZmluZSAgRkVDX09DX1RNRF9DT1VOVF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQzQwMDFGCisjZGVmaW5lICBGRUNfT0NfVE1EX0hJX01BUkdJTl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDNDAwMjAKKyNkZWZpbmUgIEZFQ19PQ19UTURfTE9fTUFSR0lOX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUM0MDAyMQorI2RlZmluZSAgRkVDX09DX1RNRF9JTlRfVVBEX1JBVEVfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQzQwMDIzCisjZGVmaW5lICBGRUNfT0NfQVZSX1BBUk1fQV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDNDAwMjYKKyNkZWZpbmUgIEZFQ19PQ19BVlJfUEFSTV9CX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUM0MDAyNworI2RlZmluZSAgRkVDX09DX1JDTl9HQUlOX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQzQwMDJFCisjZGVmaW5lICBGRUNfT0NfUkNOX0NUTF9SQVRFX0xPX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDNDAwMzAKKyNkZWZpbmUgIEZFQ19PQ19SQ05fQ1RMX1NURVBfTE9fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUM0MDAzMgorI2RlZmluZSAgRkVDX09DX1JDTl9DVExfU1RFUF9ISV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQzQwMDMzCisjZGVmaW5lICBGRUNfT0NfU05DX01PREVfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDNDAwNDAKKyNkZWZpbmUgICAgRkVDX09DX1NOQ19NT0RFX1NIVVRET1dOX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgIEZFQ19PQ19TTkNfTFdNX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUM0MDA0MQorI2RlZmluZSAgRkVDX09DX1NOQ19IV01fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQzQwMDQyCisjZGVmaW5lICBGRUNfT0NfU05DX1VOTE9DS19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDNDAwNDMKKyNkZWZpbmUgIEZFQ19PQ19TTkNfRkFJTF9QRVJJT0RfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUM0MDA0NgorI2RlZmluZSAgRkVDX09DX0lQUl9NT0RFX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQzQwMDQ4CisjZGVmaW5lICAgIEZFQ19PQ19JUFJfTU9ERV9TRVJJQUxfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgICAgRkVDX09DX0lQUl9NT0RFX01DTEtfRElTX0RBVF9BQlNfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSAgICBGRUNfT0NfSVBSX01PREVfTVZBTF9ESVNfUEFSX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSAgRkVDX09DX0lQUl9JTlZFUlRfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxQzQwMDQ5CisjZGVmaW5lICAgIEZFQ19PQ19JUFJfSU5WRVJUX01EMF9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgICAgRkVDX09DX0lQUl9JTlZFUlRfTUQxX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSAgICBGRUNfT0NfSVBSX0lOVkVSVF9NRDJfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lICAgIEZFQ19PQ19JUFJfSU5WRVJUX01EM19fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgKKyNkZWZpbmUgICAgRkVDX09DX0lQUl9JTlZFUlRfTUQ0X19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgICAgRkVDX09DX0lQUl9JTlZFUlRfTUQ1X19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgICAgRkVDX09DX0lQUl9JTlZFUlRfTUQ2X19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgICAgRkVDX09DX0lQUl9JTlZFUlRfTUQ3X19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgICAgRkVDX09DX0lQUl9JTlZFUlRfTUVSUl9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwCisjZGVmaW5lICAgIEZFQ19PQ19JUFJfSU5WRVJUX01TVFJUX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMAorI2RlZmluZSAgICBGRUNfT0NfSVBSX0lOVkVSVF9NVkFMX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAKKyNkZWZpbmUgICAgRkVDX09DX0lQUl9JTlZFUlRfTUNMS19fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwCisjZGVmaW5lICBGRUNfT0NfT0NSX0lOVkVSVF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFDNDAwNTIKKyNkZWZpbmUgIElRTV9DT01NX0VYRUNfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgwMDAwMAorI2RlZmluZSAgICAgIElRTV9DT01NX0VYRUNfQl9TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICAgICAgSVFNX0NPTU1fRVhFQ19CX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgIElRTV9GU19SQVRFX09GU19MT19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTgyMDAxMAorI2RlZmluZSAgSVFNX0ZTX0FESl9TRUxfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODIwMDE0CisjZGVmaW5lICAgICAgSVFNX0ZTX0FESl9TRUxfQl9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgICAgICBJUU1fRlNfQURKX1NFTF9CX1FBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSAgICAgIElRTV9GU19BREpfU0VMX0JfVlNCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lICBJUU1fRkRfUkFURVNFTF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4MzAwMTAKKyNkZWZpbmUgIElRTV9SQ19SQVRFX09GU19MT19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg0MDAxMAorI2RlZmluZSAgSVFNX1JDX1JBVEVfT0ZTX0xPX19XICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKyNkZWZpbmUgIElRTV9SQ19SQVRFX09GU19MT19fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRgorI2RlZmluZSAgSVFNX1JDX1JBVEVfT0ZTX0hJX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRgorI2RlZmluZSAgSVFNX1JDX0FESl9TRUxfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODQwMDE0CisjZGVmaW5lICAgICAgSVFNX1JDX0FESl9TRUxfQl9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgICAgICBJUU1fUkNfQURKX1NFTF9CX1FBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSAgICAgIElRTV9SQ19BREpfU0VMX0JfVlNCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lICBJUU1fUkNfU1RSRVRDSF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NDAwMTYKKyNkZWZpbmUgIElRTV9DRl9DT01NX0lOVF9NU0tfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg2MDAwNgorI2RlZmluZSAgSVFNX0NGX1NZTU1FVFJJQ19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODYwMDEwCisjZGVmaW5lICBJUU1fQ0ZfTUlEVEFQX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NjAwMTEKKyNkZWZpbmUgICAgSVFNX0NGX01JRFRBUF9SRV9fQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgICAgSVFNX0NGX01JRFRBUF9JTV9fQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgIElRTV9DRl9PVVRfRU5BX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg2MDAxMgorI2RlZmluZSAgICBJUU1fQ0ZfT1VUX0VOQV9RQU1fX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSAgICBJUU1fQ0ZfT1VUX0VOQV9PRkRNX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lICBJUU1fQ0ZfQURKX1NFTF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NjAwMTMKKyNkZWZpbmUgIElRTV9DRl9TQ0FMRV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg2MDAxNAorI2RlZmluZSAgSVFNX0NGX1NDQUxFX1NIX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODYwMDE1CisjZGVmaW5lICBJUU1fQ0ZfU0NBTEVfU0hfX1BSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgIElRTV9DRl9QT1dfTUVBU19MRU5fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg2MDAxNworI2RlZmluZSAgSVFNX0NGX0RTX0VOQV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODYwMDE5CisjZGVmaW5lICBJUU1fQ0ZfVEFQX1JFMF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NjAwMjAKKyNkZWZpbmUgIElRTV9DRl9UQVBfSU0wX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg2MDA0MAorI2RlZmluZSAgSVFNX0NGX0NMUF9WQUxfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODYwMDYwCisjZGVmaW5lICBJUU1fQ0ZfREFUQVRIX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NjAwNjEKKyNkZWZpbmUgIElRTV9DRl9QS0RUSF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg2MDA2MgorI2RlZmluZSAgSVFNX0NGX1dORF9MRU5fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODYwMDYzCisjZGVmaW5lICBJUU1fQ0ZfREVUX0xDVF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NjAwNjQKKyNkZWZpbmUgIElRTV9DRl9CWVBBU1NERVRfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg2MDA2NworI2RlZmluZSAgSVFNX0FGX0NPTU1fRVhFQ19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODcwMDAwCisjZGVmaW5lICAgIElRTV9BRl9DT01NX0VYRUNfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgIElRTV9BRl9DTEtORUdfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg3MDAxMgorI2RlZmluZSAgICBJUU1fQUZfQ0xLTkVHX0NMS05FR0RBVEFfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lICAgICAgSVFNX0FGX0NMS05FR19DTEtORUdEQVRBX0NMS19BRENfREFUQV9QT1MgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgICAgICBJUU1fQUZfQ0xLTkVHX0NMS05FR0RBVEFfQ0xLX0FEQ19EQVRBX05FRyAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSAgSVFNX0FGX1NUQVJUX0xPQ0tfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODcwMDFCCisjZGVmaW5lICBJUU1fQUZfUEhBU0UwX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NzAwMUMKKyNkZWZpbmUgIElRTV9BRl9QSEFTRTFfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg3MDAxRAorI2RlZmluZSAgSVFNX0FGX1BIQVNFMl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODcwMDFFCisjZGVmaW5lICBJUU1fQUZfQ0xQX0xFTl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NzAwMjMKKyNkZWZpbmUgIElRTV9BRl9DTFBfVEhfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg3MDAyNAorI2RlZmluZSAgSVFNX0FGX1NOU19MRU5fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODcwMDI2CisjZGVmaW5lICBJUU1fQUZfQUdDX0lGX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NzAwMjgKKyNkZWZpbmUgIElRTV9BRl9BR0NfUkZfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg3MDAyOQorI2RlZmluZSAgSVFNX0FGX1BEUkVGX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODcwMDJCCisjZGVmaW5lICBJUU1fQUZfUERSRUZfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDFGCisjZGVmaW5lICBJUU1fQUZfU1REQllfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NzAwMkMKKyNkZWZpbmUgICAgICBJUU1fQUZfU1REQllfU1REQllfQURDX1NUQU5EQlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSAgICAgIElRTV9BRl9TVERCWV9TVERCWV9BTVBfU1RBTkRCWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lICAgICAgSVFNX0FGX1NUREJZX1NUREJZX1BEX1NUQU5EQlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgKKyNkZWZpbmUgICAgICBJUU1fQUZfU1REQllfU1REQllfVEFHQ19JRl9TVEFOREJZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgICAgICBJUU1fQUZfU1REQllfU1REQllfVEFHQ19SRl9TVEFOREJZICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgIElRTV9BRl9BTVVYX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg3MDAyRAorI2RlZmluZSAgICBJUU1fQUZfQU1VWF9TSUdOQUwyQURDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICBJUU1fQUZfVVBEX1NFTF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE4NzAwMkYKKyNkZWZpbmUgIElRTV9BRl9JTkNfTENUX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTg3MDAzNAorI2RlZmluZSAgSVFNX0FGX0lOQ19CWVBBU1NfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxODcwMDM2CisjZGVmaW5lICBPRkRNX0NQX0NPTU1fRVhFQ19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDI4MDAwMDAKKyNkZWZpbmUgICAgT0ZETV9DUF9DT01NX0VYRUNfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgT0ZETV9FQ19TQl9QUklPUl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzNDEwMDEzCisjZGVmaW5lICAgIE9GRE1fRUNfU0JfUFJJT1JfSEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgICAgT0ZETV9FQ19TQl9QUklPUl9MTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSAgT0ZETV9FUV9UT1BfVERfVFBTX0NPTlNUX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDEwMDU0CisjZGVmaW5lICBPRkRNX0VRX1RPUF9URF9UUFNfQ09OU1RfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMKKyNkZWZpbmUgICAgT0ZETV9FUV9UT1BfVERfVFBTX0NPTlNUXzY0UUFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSAgT0ZETV9FUV9UT1BfVERfVFBTX0NPREVfSFBfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDEwMDU2CisjZGVmaW5lICBPRkRNX0VRX1RPUF9URF9UUFNfQ09ERV9IUF9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDcKKyNkZWZpbmUgICAgT0ZETV9FUV9UT1BfVERfVFBTX0NPREVfTFBfN184ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSAgT0ZETV9FUV9UT1BfVERfU1FSX0VSUl9JX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDEwMDVFCisjZGVmaW5lICBPRkRNX0VRX1RPUF9URF9TUVJfRVJSX1FfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMTAwNUYKKyNkZWZpbmUgIE9GRE1fRVFfVE9QX1REX1NRUl9FUlJfRVhQX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzAxMDA2MAorI2RlZmluZSAgT0ZETV9FUV9UT1BfVERfUkVRX1NNQl9DTlRfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDEwMDYxCisjZGVmaW5lICBPRkRNX0VRX1RPUF9URF9UUFNfUFdSX09GU19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMTAwNjIKKyNkZWZpbmUgIE9GRE1fTENfQ09NTV9FWEVDX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzgwMDAwMAorI2RlZmluZSAgICBPRkRNX0xDX0NPTU1fRVhFQ19TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICBPRkRNX1NDX0NPTU1fRVhFQ19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNDMDAwMDAKKyNkZWZpbmUgICAgT0ZETV9TQ19DT01NX0VYRUNfU1RPUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgT0ZETV9TQ19DT01NX1NUQVRFX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzQzAwMDAxCisjZGVmaW5lICBPRkRNX1NDX1JBX1JBTV9QQVJBTTBfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNDMjAwNDAKKyNkZWZpbmUgIE9GRE1fU0NfUkFfUkFNX1BBUkFNMV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M0MyMDA0MQorI2RlZmluZSAgT0ZETV9TQ19SQV9SQU1fQ01EX0FERFJfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzQzIwMDQyCisjZGVmaW5lICBPRkRNX1NDX1JBX1JBTV9DTURfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNDMjAwNDMKKyNkZWZpbmUgICAgT0ZETV9TQ19SQV9SQU1fQ01EX05VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgICBPRkRNX1NDX1JBX1JBTV9DTURfUFJPQ19TVEFSVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICAgIE9GRE1fU0NfUkFfUkFNX0NNRF9TRVRfUFJFRl9QQVJBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMKKyNkZWZpbmUgICAgT0ZETV9TQ19SQV9SQU1fQ01EX1BST0dSQU1fUEFSQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSAgICBPRkRNX1NDX1JBX1JBTV9DTURfR0VUX09QX1BBUkFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg1CisjZGVmaW5lICAgIE9GRE1fU0NfUkFfUkFNX0NNRF9VU0VSX0lPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDYKKyNkZWZpbmUgICAgT0ZETV9TQ19SQV9SQU1fQ01EX1NFVF9USU1FUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NworI2RlZmluZSAgICBPRkRNX1NDX1JBX1JBTV9DTURfU0VUX0VDSE9fVElNSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4CisjZGVmaW5lICAgIE9GRE1fU0NfUkFfUkFNX1NXX0VWRU5UX1JVTl9OTUFTS19fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgICAgT0ZETV9TQ19SQV9SQU1fTE9DS1RSQUNLX01JTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSAgT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzQzIwMDQ4CisjZGVmaW5lICAgIE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX01PREVfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMKKyNkZWZpbmUgICAgICBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9NT0RFXzJLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgICAgIE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX01PREVfOEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICAgICAgT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fR1VBUkRfMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgICAgICBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9HVUFSRF8xNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSAgICAgIE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX0dVQVJEXzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4CisjZGVmaW5lICAgICAgT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fR1VBUkRfNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEMKKyNkZWZpbmUgICAgICBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9DT05TVF9RUFNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgICAgIE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX0NPTlNUX1FBTTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMAorI2RlZmluZSAgICAgIE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX0NPTlNUX1FBTTY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMAorI2RlZmluZSAgICAgIE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX0hJRVJfTk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICAgICAgT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fSElFUl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwCisjZGVmaW5lICAgICAgT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fSElFUl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwCisjZGVmaW5lICAgICAgT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fSElFUl9BNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEMwCisjZGVmaW5lICAgICAgT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fUkFURV8xXzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgICAgICBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9SQVRFXzJfMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwCisjZGVmaW5lICAgICAgT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fUkFURV8zXzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMAorI2RlZmluZSAgICAgIE9GRE1fU0NfUkFfUkFNX09QX1BBUkFNX1JBVEVfNV82ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2MDAKKyNkZWZpbmUgICAgICBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9SQVRFXzdfOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwCisjZGVmaW5lICAgICAgT0ZETV9TQ19SQV9SQU1fT1BfUEFSQU1fUFJJT19ISSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgICAgICBPRkRNX1NDX1JBX1JBTV9PUF9QQVJBTV9QUklPX0xPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMAorI2RlZmluZSAgICBPRkRNX1NDX1JBX1JBTV9PUF9BVVRPX01PREVfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICAgIE9GRE1fU0NfUkFfUkFNX09QX0FVVE9fR1VBUkRfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgICAgT0ZETV9TQ19SQV9SQU1fT1BfQVVUT19DT05TVF9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSAgICBPRkRNX1NDX1JBX1JBTV9PUF9BVVRPX0hJRVJfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4CisjZGVmaW5lICAgIE9GRE1fU0NfUkFfUkFNX09QX0FVVE9fUkFURV9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwCisjZGVmaW5lICBPRkRNX1NDX1JBX1JBTV9MT0NLX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNDMjAwNEIKKyNkZWZpbmUgICAgT0ZETV9TQ19SQV9SQU1fTE9DS19ERU1PRF9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSAgICBPRkRNX1NDX1JBX1JBTV9MT0NLX0ZFQ19fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisjZGVmaW5lICAgIE9GRE1fU0NfUkFfUkFNX0xPQ0tfTVBFR19fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgICAgT0ZETV9TQ19SQV9SQU1fTE9DS19OT0RWQlRfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OAorI2RlZmluZSAgT0ZETV9TQ19SQV9SQU1fQkVfT1BUX0RFTEFZX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzQzIwMDRECisjZGVmaW5lICBPRkRNX1NDX1JBX1JBTV9CRV9PUFRfSU5JVF9ERUxBWV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNDMjAwNEUKKyNkZWZpbmUgIE9GRE1fU0NfUkFfUkFNX0VDSE9fVEhSRVNfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M0MyMDA0RgorI2RlZmluZSAgICBPRkRNX1NDX1JBX1JBTV9FQ0hPX1RIUkVTXzhLX19CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSAgICBPRkRNX1NDX1JBX1JBTV9FQ0hPX1RIUkVTXzhLX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRgorI2RlZmluZSAgICBPRkRNX1NDX1JBX1JBTV9FQ0hPX1RIUkVTXzJLX19CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOAorI2RlZmluZSAgICBPRkRNX1NDX1JBX1JBTV9FQ0hPX1RIUkVTXzJLX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRjAwCisjZGVmaW5lICBPRkRNX1NDX1JBX1JBTV9DT05GSUdfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNDMjAwNTAKKyNkZWZpbmUgICAgT0ZETV9TQ19SQV9SQU1fQ09ORklHX05FX0ZJWF9FTkFCTEVfX00gICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwCisjZGVmaW5lICBPRkRNX1NDX1JBX1JBTV9GUl9USFJFU184S19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNDMjAwN0QKKyNkZWZpbmUgIE9GRE1fU0NfUkFfUkFNX05JX0lOSVRfMktfUEVSX0xFRlRfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M0MyMDBFMAorI2RlZmluZSAgT0ZETV9TQ19SQV9SQU1fTklfSU5JVF8yS19QRVJfUklHSFRfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzQzIwMEUxCisjZGVmaW5lICBPRkRNX1NDX1JBX1JBTV9OSV9JTklUXzhLX1BFUl9MRUZUX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNDMjAwRTMKKyNkZWZpbmUgIE9GRE1fU0NfUkFfUkFNX05JX0lOSVRfOEtfUEVSX1JJR0hUX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M0MyMDBFNAorI2RlZmluZSAgT0ZETV9TQ19SQV9SQU1fU1JNTV9GSVhfRkFDVF84S19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzQzIwMEY4CisjZGVmaW5lICBRQU1fQ09NTV9FWEVDX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0MDAwMDAKKyNkZWZpbmUgICAgUUFNX0NPTU1fRVhFQ19TVE9QICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgICBRQU1fQ09NTV9FWEVDX0FDVElWRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICAgIFFBTV9UT1BfQU5ORVhfQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgICAgUUFNX1RPUF9BTk5FWF9DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSAgUUFNX1NMX0VSUl9QT1dFUl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDMwMDE3CisjZGVmaW5lICBRQU1fRFFfUVVBTF9GVU4wX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NDAwMTgKKyNkZWZpbmUgIFFBTV9EUV9RVUFMX0ZVTjFfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ0MDAxOQorI2RlZmluZSAgUUFNX0RRX1FVQUxfRlVOMl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDQwMDFBCisjZGVmaW5lICBRQU1fRFFfUVVBTF9GVU4zX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NDAwMUIKKyNkZWZpbmUgIFFBTV9EUV9RVUFMX0ZVTjRfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ0MDAxQworI2RlZmluZSAgUUFNX0RRX1FVQUxfRlVONV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDQwMDFECisjZGVmaW5lICBRQU1fTENfTU9ERV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NTAwMTAKKyNkZWZpbmUgIFFBTV9MQ19RVUFMX1RBQjBfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ1MDAxOAorI2RlZmluZSAgUUFNX0xDX1FVQUxfVEFCMV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDUwMDE5CisjZGVmaW5lICBRQU1fTENfUVVBTF9UQUIyX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NTAwMUEKKyNkZWZpbmUgIFFBTV9MQ19RVUFMX1RBQjNfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ1MDAxQgorI2RlZmluZSAgUUFNX0xDX1FVQUxfVEFCNF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDUwMDFDCisjZGVmaW5lICBRQU1fTENfUVVBTF9UQUI1X19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NTAwMUQKKyNkZWZpbmUgIFFBTV9MQ19RVUFMX1RBQjZfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ1MDAxRQorI2RlZmluZSAgUUFNX0xDX1FVQUxfVEFCOF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDUwMDFGCisjZGVmaW5lICBRQU1fTENfUVVBTF9UQUI5X19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NTAwMjAKKyNkZWZpbmUgIFFBTV9MQ19RVUFMX1RBQjEwX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ1MDAyMQorI2RlZmluZSAgUUFNX0xDX1FVQUxfVEFCMTJfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDUwMDIyCisjZGVmaW5lICBRQU1fTENfUVVBTF9UQUIxNV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NTAwMjMKKyNkZWZpbmUgIFFBTV9MQ19RVUFMX1RBQjE2X19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ1MDAyNAorI2RlZmluZSAgUUFNX0xDX1FVQUxfVEFCMjBfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDUwMDI1CisjZGVmaW5lICBRQU1fTENfUVVBTF9UQUIyNV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NTAwMjYKKyNkZWZpbmUgIFFBTV9MQ19MUEZfRkFDVE9SUF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ1MDAyOAorI2RlZmluZSAgUUFNX0xDX0xQRl9GQUNUT1JJX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDUwMDI5CisjZGVmaW5lICBRQU1fTENfUkFURV9MSU1JVF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NTAwMkEKKyNkZWZpbmUgIFFBTV9MQ19TWU1CT0xfRlJFUV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ1MDAyQgorI2RlZmluZSAgUUFNX1NZX1RJTUVPVVRfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDcwMDExCisjZGVmaW5lICBRQU1fU1lfVElNRU9VVF9fUFJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDNBOTgKKyNkZWZpbmUgIFFBTV9TWV9TWU5DX0xXTV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ3MDAxMgorI2RlZmluZSAgUUFNX1NZX1NZTkNfQVdNX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxNDcwMDEzCisjZGVmaW5lICBRQU1fU1lfU1lOQ19IV01fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE0NzAwMTQKKyNkZWZpbmUgIFFBTV9TWV9TUF9JTlZfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQ3MDAxNworI2RlZmluZSAgICBRQU1fU1lfU1BfSU5WX1NQRUNUUlVNX0lOVl9ESVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICBTQ1VfQ09NTV9FWEVDX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMAorI2RlZmluZSAgICBTQ1VfQ09NTV9FWEVDX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICAgIFNDVV9DT01NX0VYRUNfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgICAgU0NVX0NPTU1fRVhFQ19IT0xEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSAgU0NVX1JBTV9EUklWRVJfREVCVUdfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFFQkYKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0ZTTV9TVEVQX1BFUklPRF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRUM0CisjZGVmaW5lICBTQ1VfUkFNX0dQSU9fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUVDNworI2RlZmluZSAgICAgIFNDVV9SQU1fR1BJT19IV19MT0NLX0lORF9ESVNBQkxFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICBTQ1VfUkFNX0FHQ19DTFBfQ1RSTF9NT0RFX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUVDOAorI2RlZmluZSAgU0NVX1JBTV9GRUNfQUNDVU1fUEtUX0ZBSUxVUkVTX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFFQ0IKKyNkZWZpbmUgIFNDVV9SQU1fRkVDX1BSRV9SU19CRVJfRklMVEVSX1NIX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjA1CisjZGVmaW5lICBTQ1VfUkFNX0FHQ19GQVNUX1NOU19DVFJMX0RFTEFZX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYxNQorI2RlZmluZSAgU0NVX1JBTV9BR0NfS0lfQ1lDTEVOX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGMTcKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX1NOU19DWUNMRU5fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjE4CisjZGVmaW5lICBTQ1VfUkFNX0FHQ19SRl9TTlNfREVWX01BWF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYxOQorI2RlZmluZSAgU0NVX1JBTV9BR0NfUkZfU05TX0RFVl9NSU5fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGMUEKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX1JGX01BWF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjFCCisjZGVmaW5lICBTQ1VfUkFNX0FHQ19DT05GSUdfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYyNAorI2RlZmluZSAgICBTQ1VfUkFNX0FHQ19DT05GSUdfRElTQUJMRV9SRl9BR0NfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICAgIFNDVV9SQU1fQUdDX0NPTkZJR19ESVNBQkxFX0lGX0FHQ19fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgICAgU0NVX1JBTV9BR0NfQ09ORklHX0lOVl9JRl9QT0xfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwCisjZGVmaW5lICAgIFNDVV9SQU1fQUdDX0NPTkZJR19JTlZfUkZfUE9MX19NICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMAorI2RlZmluZSAgU0NVX1JBTV9BR0NfS0lfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGMjUKKyNkZWZpbmUgICAgU0NVX1JBTV9BR0NfS0lfUkZfX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgICAgU0NVX1JBTV9BR0NfS0lfUkZfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RjAKKyNkZWZpbmUgICAgU0NVX1JBTV9BR0NfS0lfSUZfX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgICAgU0NVX1JBTV9BR0NfS0lfSUZfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RjAwCisjZGVmaW5lICBTQ1VfUkFNX0FHQ19LSV9SRURfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYyNgorI2RlZmluZSAgICBTQ1VfUkFNX0FHQ19LSV9SRURfUkFHQ19SRURfX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSAgICBTQ1VfUkFNX0FHQ19LSV9SRURfUkFHQ19SRURfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhDCisjZGVmaW5lICAgIFNDVV9SQU1fQUdDX0tJX1JFRF9JQUdDX1JFRF9fQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lICAgIFNDVV9SQU1fQUdDX0tJX1JFRF9JQUdDX1JFRF9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwCisjZGVmaW5lICBTQ1VfUkFNX0FHQ19LSV9JTk5FUkdBSU5fTUlOX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYyNworI2RlZmluZSAgU0NVX1JBTV9BR0NfS0lfTUlOR0FJTl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGMjgKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX0tJX01BWEdBSU5fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjI5CisjZGVmaW5lICBTQ1VfUkFNX0FHQ19LSV9NQVhNSU5HQUlOX1RIX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYyQQorI2RlZmluZSAgU0NVX1JBTV9BR0NfS0lfTUlOX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGMkIKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX0tJX01BWF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjJDCisjZGVmaW5lICBTQ1VfUkFNX0FHQ19DTFBfU1VNX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYyRAorI2RlZmluZSAgU0NVX1JBTV9BR0NfQ0xQX1NVTV9NSU5fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGMkUKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX0NMUF9TVU1fTUFYX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjJGCisjZGVmaW5lICBTQ1VfUkFNX0FHQ19DTFBfQ1lDTEVOX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYzMAorI2RlZmluZSAgU0NVX1JBTV9BR0NfQ0xQX0NZQ0NOVF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGMzEKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX0NMUF9ESVJfVE9fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjMyCisjZGVmaW5lICBTQ1VfUkFNX0FHQ19DTFBfRElSX1dEX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYzMworI2RlZmluZSAgU0NVX1JBTV9BR0NfQ0xQX0RJUl9TVFBfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGMzQKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX1NOU19TVU1fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjM1CisjZGVmaW5lICBTQ1VfUkFNX0FHQ19TTlNfU1VNX01JTl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYzNgorI2RlZmluZSAgU0NVX1JBTV9BR0NfU05TX1NVTV9NQVhfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGMzcKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX1NOU19DWUNDTlRfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjM4CisjZGVmaW5lICBTQ1VfUkFNX0FHQ19TTlNfRElSX1RPX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYzOQorI2RlZmluZSAgU0NVX1JBTV9BR0NfU05TX0RJUl9XRF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGM0EKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX1NOU19ESVJfU1RQX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjNCCisjZGVmaW5lICBTQ1VfUkFNX0FHQ19JTkdBSU5fVEdUX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUYzRAorI2RlZmluZSAgU0NVX1JBTV9BR0NfSU5HQUlOX1RHVF9NSU5fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGM0UKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX0lOR0FJTl9UR1RfTUFYX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjNGCisjZGVmaW5lICBTQ1VfUkFNX0FHQ19JRl9JQUNDVV9ISV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY0MAorI2RlZmluZSAgU0NVX1JBTV9BR0NfSUZfSUFDQ1VfTE9fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGNDEKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX0lGX0lBQ0NVX0hJX1RHVF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjQyCisjZGVmaW5lICBTQ1VfUkFNX0FHQ19JRl9JQUNDVV9ISV9UR1RfTUlOX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY0MworI2RlZmluZSAgU0NVX1JBTV9BR0NfSUZfSUFDQ1VfSElfVEdUX01BWF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGNDQKKyNkZWZpbmUgIFNDVV9SQU1fQUdDX1JGX0lBQ0NVX0hJX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjQ1CisjZGVmaW5lICBTQ1VfUkFNX0FHQ19SRl9JQUNDVV9MT19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY0NgorI2RlZmluZSAgU0NVX1JBTV9BR0NfUkZfSUFDQ1VfSElfQ09fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGNDcKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0ZTTV9NRURJQU5fQVZfTVVMVF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjg0CisjZGVmaW5lICBTQ1VfUkFNX1FBTV9GU01fUkFESVVTX0FWX0xJTUlUX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY4NQorI2RlZmluZSAgU0NVX1JBTV9RQU1fRlNNX0xDQVZHX09GRlNFVDFfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGODYKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQyX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjg3CisjZGVmaW5lICBTQ1VfUkFNX1FBTV9GU01fTENBVkdfT0ZGU0VUM19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY4OAorI2RlZmluZSAgU0NVX1JBTV9RQU1fRlNNX0xDQVZHX09GRlNFVDRfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGODkKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0ZTTV9MQ0FWR19PRkZTRVQ1X19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjhBCisjZGVmaW5lICBTQ1VfUkFNX1FBTV9GU01fUlRIX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY4RQorI2RlZmluZSAgU0NVX1JBTV9RQU1fRlNNX0ZUSF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGOEYKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0ZTTV9QVEhfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjkwCisjZGVmaW5lICBTQ1VfUkFNX1FBTV9GU01fTVRIX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY5MQorI2RlZmluZSAgU0NVX1JBTV9RQU1fRlNNX0NUSF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGOTIKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0ZTTV9RVEhfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjkzCisjZGVmaW5lICBTQ1VfUkFNX1FBTV9GU01fUkFURV9MSU1fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY5NAorI2RlZmluZSAgU0NVX1JBTV9RQU1fRlNNX0ZSRVFfTElNX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGOTUKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0ZTTV9DT1VOVF9MSU1fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjk2CisjZGVmaW5lICBTQ1VfUkFNX1FBTV9MQ19DQV9DT0FSU0VfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY5NworI2RlZmluZSAgU0NVX1JBTV9RQU1fTENfQ0FfRklORV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGOTkKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0xDX0NQX0NPQVJTRV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjlBCisjZGVmaW5lICBTQ1VfUkFNX1FBTV9MQ19DUF9NRURJVU1fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY5QgorI2RlZmluZSAgU0NVX1JBTV9RQU1fTENfQ1BfRklORV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGOUMKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0xDX0NJX0NPQVJTRV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRjlECisjZGVmaW5lICBTQ1VfUkFNX1FBTV9MQ19DSV9NRURJVU1fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUY5RQorI2RlZmluZSAgU0NVX1JBTV9RQU1fTENfQ0lfRklORV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGOUYKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0xDX0VQX0NPQVJTRV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRkEwCisjZGVmaW5lICBTQ1VfUkFNX1FBTV9MQ19FUF9NRURJVU1fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUZBMQorI2RlZmluZSAgU0NVX1JBTV9RQU1fTENfRVBfRklORV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGQTIKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0xDX0VJX0NPQVJTRV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRkEzCisjZGVmaW5lICBTQ1VfUkFNX1FBTV9MQ19FSV9NRURJVU1fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUZBNAorI2RlZmluZSAgU0NVX1JBTV9RQU1fTENfRUlfRklORV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGQTUKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0xDX0NGX0NPQVJTRV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRkE2CisjZGVmaW5lICBTQ1VfUkFNX1FBTV9MQ19DRl9NRURJVU1fX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUZBNworI2RlZmluZSAgU0NVX1JBTV9RQU1fTENfQ0ZfRklORV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGQTgKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0xDX0NGMV9DT0FSU0VfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRkE5CisjZGVmaW5lICBTQ1VfUkFNX1FBTV9MQ19DRjFfTUVESVVNX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUZBQQorI2RlZmluZSAgU0NVX1JBTV9RQU1fTENfQ0YxX0ZJTkVfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGQUIKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX1NMX1NJR19QT1dFUl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRkFDCisjZGVmaW5lICBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFEMF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUZBRAorI2RlZmluZSAgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDFfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGQUUKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQyX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRkFGCisjZGVmaW5lICBTQ1VfUkFNX1FBTV9FUV9DTUFfUkFEM19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUZCMAorI2RlZmluZSAgU0NVX1JBTV9RQU1fRVFfQ01BX1JBRDRfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGQjEKKyNkZWZpbmUgIFNDVV9SQU1fUUFNX0VRX0NNQV9SQUQ1X19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRkIyCisjZGVmaW5lICAgICAgU0NVX1JBTV9RQU1fTE9DS0VEX0xPQ0tFRF9ERU1PRF9MT0NLRUQgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAKKyNkZWZpbmUgICAgICBTQ1VfUkFNX1FBTV9MT0NLRURfTE9DS0VEX0xPQ0tFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSAgICAgIFNDVV9SQU1fUUFNX0xPQ0tFRF9MT0NLRURfTkVWRVJfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHhDMDAwCisjZGVmaW5lICBTQ1VfUkFNX0FHQ19GQVNUX0NMUF9DVFJMX0RFTEFZX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUZFQQorI2RlZmluZSAgU0NVX1JBTV9EUklWRVJfVkVSX0hJX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGRUIKKyNkZWZpbmUgIFNDVV9SQU1fRFJJVkVSX1ZFUl9MT19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRkVDCisjZGVmaW5lICBTQ1VfUkFNX1BBUkFNXzE1X19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgzMUZFRAorI2RlZmluZSAgU0NVX1JBTV9QQVJBTV8wX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MzFGRkMKKyNkZWZpbmUgIFNDVV9SQU1fQ09NTUFORF9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODMxRkZECisjZGVmaW5lICAgIFNDVV9SQU1fQ09NTUFORF9DTURfREVNT0RfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgICAgU0NVX1JBTV9DT01NQU5EX0NNRF9ERU1PRF9TRVRfRU5WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSAgICBTQ1VfUkFNX0NPTU1BTkRfQ01EX0RFTU9EX1NFVF9QQVJBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzCisjZGVmaW5lICAgIFNDVV9SQU1fQ09NTUFORF9DTURfREVNT0RfU1RBUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQKKyNkZWZpbmUgICAgU0NVX1JBTV9DT01NQU5EX0NNRF9ERU1PRF9HRVRfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NQorI2RlZmluZSAgICBTQ1VfUkFNX0NPTU1BTkRfQ01EX0RFTU9EX1NUT1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5CisjZGVmaW5lICAgICAgU0NVX1JBTV9DT01NQU5EX1NUQU5EQVJEX1FBTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMAorI2RlZmluZSAgICAgIFNDVV9SQU1fQ09NTUFORF9TVEFOREFSRF9PRkRNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAKKyNkZWZpbmUgIFNJT19UT1BfQ09NTV9LRVlfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDEwMDBGCisjZGVmaW5lICAgIFNJT19UT1BfQ09NTV9LRVlfS0VZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZBQkEKKyNkZWZpbmUgIFNJT19UT1BfSlRBR0lEX0xPX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDEwMDEyCisjZGVmaW5lICBTSU9fSElfUkFfUkFNX1JFU19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQyMDAzMQorI2RlZmluZSAgU0lPX0hJX1JBX1JBTV9DTURfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MjAwMzIKKyNkZWZpbmUgICAgU0lPX0hJX1JBX1JBTV9DTURfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgorI2RlZmluZSAgICBTSU9fSElfUkFfUkFNX0NNRF9DT05GSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzCisjZGVmaW5lICAgIFNJT19ISV9SQV9SQU1fQ01EX0JSRENUUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDcKKyNkZWZpbmUgIFNJT19ISV9SQV9SQU1fUEFSXzFfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDIwMDMzCisjZGVmaW5lICAgICAgU0lPX0hJX1JBX1JBTV9QQVJfMV9QQVIxX1NFQ19LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDM5NDUKKyNkZWZpbmUgIFNJT19ISV9SQV9SQU1fUEFSXzJfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDIwMDM0CisjZGVmaW5lICAgIFNJT19ISV9SQV9SQU1fUEFSXzJfQ0ZHX0RJVl9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGCisjZGVmaW5lICAgICAgU0lPX0hJX1JBX1JBTV9QQVJfMl9CUkRfQ0ZHX09QRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKKyNkZWZpbmUgICAgICBTSU9fSElfUkFfUkFNX1BBUl8yX0JSRF9DRkdfQ0xPU0VEICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSAgU0lPX0hJX1JBX1JBTV9QQVJfM19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MjAwMzUKKyNkZWZpbmUgICAgU0lPX0hJX1JBX1JBTV9QQVJfM19DRkdfREJMX1NEQV9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0YKKyNkZWZpbmUgICAgU0lPX0hJX1JBX1JBTV9QQVJfM19DRkdfREJMX1NDTF9fQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgICAgICBTSU9fSElfUkFfUkFNX1BBUl8zX0FDUF9SV19SRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgICAgIFNJT19ISV9SQV9SQU1fUEFSXzNfQUNQX1JXX1dSSVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4CisjZGVmaW5lICBTSU9fSElfUkFfUkFNX1BBUl80X19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQyMDAzNgorI2RlZmluZSAgU0lPX0hJX1JBX1JBTV9QQVJfNV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MjAwMzcKKyNkZWZpbmUgICAgICBTSU9fSElfUkFfUkFNX1BBUl81X0NGR19TTFYwX1NMQVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQorI2RlZmluZSAgICBTSU9fSElfUkFfUkFNX1BBUl81X0NGR19TTEVFUF9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4CisjZGVmaW5lICAgICAgU0lPX0hJX1JBX1JBTV9QQVJfNV9DRkdfU0xFRVBfWlpaICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgKKyNkZWZpbmUgIFNJT19ISV9SQV9SQU1fUEFSXzZfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDIwMDM4CisjZGVmaW5lICBTSU9fQ0NfUExMX0xPQ0tfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ1MDAxMgorI2RlZmluZSAgU0lPX0NDX1BXRF9NT0RFX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0NTAwMTUKKyNkZWZpbmUgICAgICBTSU9fQ0NfUFdEX01PREVfTEVWRUxfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgICAgIFNJT19DQ19QV0RfTU9ERV9MRVZFTF9PRkRNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICAgICAgU0lPX0NDX1BXRF9NT0RFX0xFVkVMX0NMT0NLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgICAgICBTSU9fQ0NfUFdEX01PREVfTEVWRUxfUExMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MworI2RlZmluZSAgICAgIFNJT19DQ19QV0RfTU9ERV9MRVZFTF9PU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0CisjZGVmaW5lICBTSU9fQ0NfU09GVF9SU1RfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ1MDAxNgorI2RlZmluZSAgICBTSU9fQ0NfU09GVF9SU1RfT0ZETV9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICAgIFNJT19DQ19TT0ZUX1JTVF9TWVNfX00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKKyNkZWZpbmUgICAgU0lPX0NDX1NPRlRfUlNUX09TQ19fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NAorI2RlZmluZSAgU0lPX0NDX1VQREFURV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0NTAwMTcKKyNkZWZpbmUgICAgU0lPX0NDX1VQREFURV9LRVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkFCQQorI2RlZmluZSAgU0lPX09GRE1fU0hfT0ZETV9SSU5HX0VOQUJMRV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0NzAwMTAKKyNkZWZpbmUgICAgU0lPX09GRE1fU0hfT0ZETV9SSU5HX0VOQUJMRV9PRkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAorI2RlZmluZSAgICBTSU9fT0ZETV9TSF9PRkRNX1JJTkdfRU5BQkxFX09OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCisjZGVmaW5lICBTSU9fT0ZETV9TSF9PRkRNX1JJTkdfU1RBVFVTX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ3MDAxMgorI2RlZmluZSAgICBTSU9fT0ZETV9TSF9PRkRNX1JJTkdfU1RBVFVTX0RPV04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICAgIFNJT19PRkRNX1NIX09GRE1fUklOR19TVEFUVVNfRU5BQkxFRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgIFNJT19CTF9DT01NX0VYRUNfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDgwMDAwCisjZGVmaW5lICAgIFNJT19CTF9DT01NX0VYRUNfQUNUSVZFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgIFNJT19CTF9TVEFUVVNfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDgwMDEwCisjZGVmaW5lICBTSU9fQkxfTU9ERV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ4MDAxMQorI2RlZmluZSAgICBTSU9fQkxfTU9ERV9ESVJFQ1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCisjZGVmaW5lICAgIFNJT19CTF9NT0RFX0NIQUlOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgIFNJT19CTF9FTkFCTEVfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDgwMDEyCisjZGVmaW5lICAgIFNJT19CTF9FTkFCTEVfT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKKyNkZWZpbmUgIFNJT19CTF9UR1RfSERSX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDgwMDE0CisjZGVmaW5lICBTSU9fQkxfVEdUX0FERFJfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ4MDAxNQorI2RlZmluZSAgU0lPX0JMX1NSQ19BRERSX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ODAwMTYKKyNkZWZpbmUgIFNJT19CTF9TUkNfTEVOX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDgwMDE3CisjZGVmaW5lICBTSU9fQkxfQ0hBSU5fQUREUl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQ4MDAxOAorI2RlZmluZSAgU0lPX0JMX0NIQUlOX0xFTl9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0ODAwMTkKKyNkZWZpbmUgIFNJT19QRFJfTU9OX0NGR19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0YwMDEwCisjZGVmaW5lICBTSU9fUERSX1VJT19JTl9ISV9fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGMDAxNQorI2RlZmluZSAgU0lPX1BEUl9VSU9fT1VUX0xPX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3RjAwMTYKKyNkZWZpbmUgIFNJT19QRFJfT0hXX0NGR19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0YwMDFGCisjZGVmaW5lICAgIFNJT19QRFJfT0hXX0NGR19GUkVGX1NFTF9fTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMKKyNkZWZpbmUgIFNJT19QRFJfTVNUUlRfQ0ZHX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0YwMDI1CisjZGVmaW5lICBTSU9fUERSX01FUlJfQ0ZHX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGMDAyNgorI2RlZmluZSAgU0lPX1BEUl9NQ0xLX0NGR19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3RjAwMjgKKyNkZWZpbmUgICAgU0lPX1BEUl9NQ0xLX0NGR19EUklWRV9fQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgIFNJT19QRFJfTVZBTF9DRkdfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0YwMDI5CisjZGVmaW5lICBTSU9fUERSX01EMF9DRkdfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGMDAyQQorI2RlZmluZSAgICBTSU9fUERSX01EMF9DRkdfRFJJVkVfX0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMworI2RlZmluZSAgU0lPX1BEUl9NRDFfQ0ZHX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3RjAwMkIKKyNkZWZpbmUgIFNJT19QRFJfTUQyX0NGR19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0YwMDJDCisjZGVmaW5lICBTSU9fUERSX01EM19DRkdfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGMDAyRAorI2RlZmluZSAgU0lPX1BEUl9NRDRfQ0ZHX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3RjAwMkYKKyNkZWZpbmUgIFNJT19QRFJfTUQ1X0NGR19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0YwMDMwCisjZGVmaW5lICBTSU9fUERSX01ENl9DRkdfX0EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDdGMDAzMQorI2RlZmluZSAgU0lPX1BEUl9NRDdfQ0ZHX19BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3RjAwMzIKKyNkZWZpbmUgIFNJT19QRFJfU01BX1RYX0NGR19fQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4N0YwMDM4CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvaXRkMTAwMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL2l0ZDEwMDAuYwppbmRleCBmN2E0MGExLi5hYTljY2I4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvaXRkMTAwMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9pdGQxMDAwLmMKQEAgLTM1LDIxICszNSwxOCBAQAogbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIlR1cm4gb24vb2ZmIGRlYnVnZ2luZyAoZGVmYXVsdDpvZmYpLiIpOwogCi0jZGVmaW5lIGRlYihhcmdzLi4uKSAgZG8geyBcCisjZGVmaW5lIGl0ZF9kYmcoYXJncy4uLikgIGRvIHsgXAogCWlmIChkZWJ1ZykgeyBcCiAJCXByaW50ayhLRVJOX0RFQlVHICAgIklURDEwMDA6ICIgYXJncyk7XAotCQlwcmludGsoIlxuIik7IFwKIAl9IFwKIH0gd2hpbGUgKDApCiAKLSNkZWZpbmUgd2FybihhcmdzLi4uKSBkbyB7IFwKKyNkZWZpbmUgaXRkX3dhcm4oYXJncy4uLikgZG8geyBcCiAJcHJpbnRrKEtFUk5fV0FSTklORyAiSVREMTAwMDogIiBhcmdzKTsgXAotCXByaW50aygiXG4iKTsgXAogfSB3aGlsZSAoMCkKIAotI2RlZmluZSBpbmZvKGFyZ3MuLi4pIGRvIHsgXAorI2RlZmluZSBpdGRfaW5mbyhhcmdzLi4uKSBkbyB7IFwKIAlwcmludGsoS0VSTl9JTkZPICAgICJJVEQxMDAwOiAiIGFyZ3MpOyBcCi0JcHJpbnRrKCJcbiIpOyBcCiB9IHdoaWxlICgwKQogCiAvKiBkb24ndCB3cml0ZSBtb3JlIHRoYW4gb25lIGJ5dGUgd2l0aCBmbGV4Y29wIGJlaGluZCAqLwpAQCAtNjIsNyArNTksNyBAQAogCWJ1ZlswXSA9IHJlZzsKIAltZW1jcHkoJmJ1ZlsxXSwgdiwgbGVuKTsKIAotCS8qIGRlYigid3IgJTAyeDogJTAyeCIsIHJlZywgdlswXSk7ICovCisJLyogaXRkX2RiZygid3IgJTAyeDogJTAyeFxuIiwgcmVnLCB2WzBdKTsgKi8KIAogCWlmIChpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgJm1zZywgMSkgIT0gMSkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJpdGQxMDAwIEkyQyB3cml0ZSBmYWlsZWRcbiIpOwpAQCAtODMsNyArODAsNyBAQAogCWl0ZDEwMDBfd3JpdGVfcmVncyhzdGF0ZSwgKHJlZyAtIDEpICYgMHhmZiwgJnN0YXRlLT5zaGFkb3dbKHJlZyAtIDEpICYgMHhmZl0sIDEpOwogCiAJaWYgKGkyY190cmFuc2ZlcihzdGF0ZS0+aTJjLCBtc2csIDIpICE9IDIpIHsKLQkJd2FybigiaXRkMTAwMCBJMkMgcmVhZCBmYWlsZWQiKTsKKwkJaXRkX3dhcm4oIml0ZDEwMDAgSTJDIHJlYWQgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FUkVNT1RFSU87CiAJfQogCXJldHVybiB2YWw7CkBAIC0xMjcsMTQgKzEyNCwxNCBAQAogCXU4IGJiZ3ZtaW4gPSBpdGQxMDAwX3JlYWRfcmVnKHN0YXRlLCBCQkdWTUlOKSAmIDB4ZjA7CiAJdTggYncgICAgICA9IGl0ZDEwMDBfcmVhZF9yZWcoc3RhdGUsIEJXKSAgICAgICYgMHhmMDsKIAotCWRlYigic3ltYm9sX3JhdGUgPSAlZCIsIHN5bWJvbF9yYXRlKTsKKwlpdGRfZGJnKCJzeW1ib2xfcmF0ZSA9ICVkXG4iLCBzeW1ib2xfcmF0ZSk7CiAKIAkvKiBub3Qgc3VyZSB3aGF0IGlzIHRoYXQgPyAtIHN0YXJ0aW5nIHRvIGRvd25sb2FkIHRoZSB0YWJsZSAqLwogCWl0ZDEwMDBfd3JpdGVfcmVnKHN0YXRlLCBDT04xLCBjb24xIHwgKDEgPDwgMSkpOwogCiAJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaXRkMTAwMF9scGZfcGdhKTsgaSsrKQogCQlpZiAoc3ltYm9sX3JhdGUgPCBpdGQxMDAwX2xwZl9wZ2FbaV0uc3ltYm9sX3JhdGUpIHsKLQkJCWRlYigic3ltcmF0ZTogaW5kZXg6ICVkIHBnYWV4dDogJXgsIGJiZ3ZtaW46ICV4IiwgaSwgaXRkMTAwMF9scGZfcGdhW2ldLnBnYWV4dCwgaXRkMTAwMF9scGZfcGdhW2ldLmJiZ3ZtaW4pOworCQkJaXRkX2RiZygic3ltcmF0ZTogaW5kZXg6ICVkIHBnYWV4dDogJXgsIGJiZ3ZtaW46ICV4XG4iLCBpLCBpdGQxMDAwX2xwZl9wZ2FbaV0ucGdhZXh0LCBpdGQxMDAwX2xwZl9wZ2FbaV0uYmJndm1pbik7CiAJCQlpdGQxMDAwX3dyaXRlX3JlZyhzdGF0ZSwgUExMRkgsICAgcGxsZmggfCAoaXRkMTAwMF9scGZfcGdhW2ldLnBnYWV4dCA8PCA0KSk7CiAJCQlpdGQxMDAwX3dyaXRlX3JlZyhzdGF0ZSwgQkJHVk1JTiwgYmJndm1pbiB8IChpdGQxMDAwX2xwZl9wZ2FbaV0uYmJndm1pbikpOwogCQkJaXRkMTAwMF93cml0ZV9yZWcoc3RhdGUsIEJXLCAgICAgIGJ3IHwgKGkgJiAweDBmKSk7CkBAIC0xODIsNyArMTc5LDcgQEAKIAogCQkJYWRjb3V0ID0gaXRkMTAwMF9yZWFkX3JlZyhzdGF0ZSwgUExMTE9DSykgJiAweDBmOwogCi0JCQlkZWIoIlZDTzogJWRrSHo6ICVkIC0+IEFEQ09VVDogJWQgJTAyeCIsIGZyZXFfa2h6LCBpdGQxMDAwX3Zjb3JnW2ldLnZjb3JnLCBhZGNvdXQsIHZjb19jaHAxX2kyYyk7CisJCQlpdGRfZGJnKCJWQ086ICVka0h6OiAlZCAtPiBBRENPVVQ6ICVkICUwMnhcbiIsIGZyZXFfa2h6LCBpdGQxMDAwX3Zjb3JnW2ldLnZjb3JnLCBhZGNvdXQsIHZjb19jaHAxX2kyYyk7CiAKIAkJCWlmIChhZGNvdXQgPiAxMykgewogCQkJCWlmICghKGl0ZDEwMDBfdmNvcmdbaV0udmNvcmcgPT0gNyB8fCBpdGQxMDAwX3Zjb3JnW2ldLnZjb3JnID09IDE1KSkKQEAgLTIzMiw3ICsyMjksNyBAQAogCXBsbGYgPSAodTMyKSB0bXA7CiAKIAlzdGF0ZS0+ZnJlcXVlbmN5ID0gKChwbGxuICogMTAwMCkgKyAocGxsZiAqIDEwMDApLzEwNDg1NzYpICogMipGUkVGOwotCWRlYigiZnJlcXVlbmN5OiAlZGtIeiAod2FudGVkKSAlZGtIeiAoc2V0KSwgUExMRiA9ICVkLCBQTExOID0gJWQiLCBmcmVxX2toeiwgc3RhdGUtPmZyZXF1ZW5jeSwgcGxsZiwgcGxsbik7CisJaXRkX2RiZygiZnJlcXVlbmN5OiAlZGtIeiAod2FudGVkKSAlZGtIeiAoc2V0KSwgUExMRiA9ICVkLCBQTExOID0gJWRcbiIsIGZyZXFfa2h6LCBzdGF0ZS0+ZnJlcXVlbmN5LCBwbGxmLCBwbGxuKTsKIAogCWl0ZDEwMDBfd3JpdGVfcmVnKHN0YXRlLCBQTExOSCwgMHg4MCk7IC8qIFBMTE5IICovOwogCWl0ZDEwMDBfd3JpdGVfcmVnKHN0YXRlLCBQTExOTCwgcGxsbiAmIDB4ZmYpOwpAQCAtMjQyLDcgKzIzOSw3IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpdGQxMDAwX2ZyZV92YWx1ZXMpOyBpKyspIHsKIAkJaWYgKGZyZXFfa2h6IDw9IGl0ZDEwMDBfZnJlX3ZhbHVlc1tpXS5mcmVxKSB7Ci0JCQlkZWIoImZyZV92YWx1ZXM6ICVkIiwgaSk7CisJCQlpdGRfZGJnKCJmcmVfdmFsdWVzOiAlZFxuIiwgaSk7CiAJCQlpdGQxMDAwX3dyaXRlX3JlZyhzdGF0ZSwgUkZUUiwgaXRkMTAwMF9mcmVfdmFsdWVzW2ldLnZhbHVlc1swXSk7CiAJCQlmb3IgKGogPSAwOyBqIDwgOTsgaisrKQogCQkJCWl0ZDEwMDBfd3JpdGVfcmVnKHN0YXRlLCBSRlNUMStqLCBpdGQxMDAwX2ZyZV92YWx1ZXNbaV0udmFsdWVzW2orMV0pOwpAQCAtMzgyLDcgKzM3OSw3IEBACiAJCWtmcmVlKHN0YXRlKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCWluZm8oInN1Y2Nlc3NmdWxseSBpZGVudGlmaWVkIChJRDogJWQpIiwgaSk7CisJaXRkX2luZm8oInN1Y2Nlc3NmdWxseSBpZGVudGlmaWVkIChJRDogJWQpXG4iLCBpKTsKIAogCW1lbXNldChzdGF0ZS0+c2hhZG93LCAweGZmLCBzaXplb2Yoc3RhdGUtPnNoYWRvdykpOwogCWZvciAoaSA9IDB4NjU7IGkgPCAweDljOyBpKyspCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0NjAwMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDYwMDAuYwppbmRleCBhNzYzZWM3NS4uNjU5OWI4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL254dDYwMDAuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvbnh0NjAwMC5jCkBAIC01MCw3ICs1MCw3IEBACiAJaWYgKChyZXQgPSBpMmNfdHJhbnNmZXIoc3RhdGUtPmkyYywgJm1zZywgMSkpICE9IDEpCiAJCWRwcmludGsoIm54dDYwMDA6IG54dDYwMDBfd3JpdGUgZXJyb3IgKHJlZzogMHglMDJYLCBkYXRhOiAweCUwMlgsIHJldDogJWQpXG4iLCByZWcsIGRhdGEsIHJldCk7CiAKLQlyZXR1cm4gKHJldCAhPSAxKSA/IC1FRkFVTFQgOiAwOworCXJldHVybiAocmV0ICE9IDEpID8gLUVJTyA6IDA7CiB9CiAKIHN0YXRpYyB1OCBueHQ2MDAwX3JlYWRyZWcoc3RydWN0IG54dDYwMDBfc3RhdGUqIHN0YXRlLCB1OCByZWcpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQyMC5jIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3M1aDE0MjAuYwppbmRleCAxN2Y4Y2RmLi4zODc5ZDJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvczVoMTQyMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy9zNWgxNDIwLmMKQEAgLTYzNCw3ICs2MzQsNyBAQAogCXN0cnVjdCBzNWgxNDIwX3N0YXRlKiBzdGF0ZSA9IGZlLT5kZW1vZHVsYXRvcl9wcml2OwogCWludCBmcmVxdWVuY3lfZGVsdGE7CiAJc3RydWN0IGR2Yl9mcm9udGVuZF90dW5lX3NldHRpbmdzIGZlc2V0dGluZ3M7Ci0JdWludDhfdCBjbG9ja19zZXR0dGluZzsKKwl1aW50OF90IGNsb2NrX3NldHRpbmc7CiAKIAlkcHJpbnRrKCJlbnRlciAlc1xuIiwgX19mdW5jX18pOwogCkBAIC02ODQsMTkgKzY4NCwxOSBAQAogCXN3aXRjaCAoc3RhdGUtPmZjbGspIHsKIAlkZWZhdWx0OgogCWNhc2UgODgwMDAwMDA6Ci0JCWNsb2NrX3NldHR0aW5nID0gODA7CisJCWNsb2NrX3NldHRpbmcgPSA4MDsKIAkJYnJlYWs7CiAJY2FzZSA4NjAwMDAwMDoKLQkJY2xvY2tfc2V0dHRpbmcgPSA3ODsKKwkJY2xvY2tfc2V0dGluZyA9IDc4OwogCQlicmVhazsKIAljYXNlIDgwMDAwMDAwOgotCQljbG9ja19zZXR0dGluZyA9IDcyOworCQljbG9ja19zZXR0aW5nID0gNzI7CiAJCWJyZWFrOwogCWNhc2UgNTkwMDAwMDA6Ci0JCWNsb2NrX3NldHR0aW5nID0gNTE7CisJCWNsb2NrX3NldHRpbmcgPSA1MTsKIAkJYnJlYWs7CiAJY2FzZSA0NDAwMDAwMDoKLQkJY2xvY2tfc2V0dHRpbmcgPSAzNjsKKwkJY2xvY2tfc2V0dGluZyA9IDM2OwogCQlicmVhazsKIAl9CiAJZHByaW50aygicGxsMDE6ICVkLCBUb25lRnJlcTogJWRcbiIsIHN0YXRlLT5mY2xrLzEwMDAwMDAgLSA4LCAoc3RhdGUtPmZjbGsgKyAoVE9ORV9GUkVRICogMzIpIC0gMSkgLyAoVE9ORV9GUkVRICogMzIpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExODI3MWMyZGQuYyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExODI3MWMyZGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzg0ZThkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTE4MjcxYzJkZC5jCkBAIC0wLDAgKzEsMTI1MSBAQAorLyoKKyAqIHRkYTE4MjcxYzJkZDogRHJpdmVyIGZvciB0aGUgVERBMTgyNzFDMiB0dW5lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBEaWdpdGFsIERldmljZXMgR21iSAorICoKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIG9ubHksIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICogT3IsIHBvaW50IHlvdXIgYnJvd3NlciB0byBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxhc20vZGl2NjQuaD4KKworI2luY2x1ZGUgImR2Yl9mcm9udGVuZC5oIgorCitzdHJ1Y3QgU1N0YW5kYXJkUGFyYW0geworCXMzMiAgIG1fSUZGcmVxdWVuY3k7CisJdTMyICAgbV9CYW5kV2lkdGg7CisJdTggICAgbV9FUDNfNF8wOworCXU4ICAgIG1fRUIyMjsKK307CisKK3N0cnVjdCBTTWFwIHsKKwl1MzIgICBtX0ZyZXF1ZW5jeTsKKwl1OCAgICBtX1BhcmFtOworfTsKKworc3RydWN0IFNNYXBJIHsKKwl1MzIgICBtX0ZyZXF1ZW5jeTsKKwlzMzIgICAgbV9QYXJhbTsKK307CisKK3N0cnVjdCBTTWFwMiB7CisJdTMyICAgbV9GcmVxdWVuY3k7CisJdTggICAgbV9QYXJhbTE7CisJdTggICAgbV9QYXJhbTI7Cit9OworCitzdHJ1Y3QgU1JGQmFuZE1hcCB7CisJdTMyICAgbV9SRl9tYXg7CisJdTMyICAgbV9SRjFfRGVmYXVsdDsKKwl1MzIgICBtX1JGMl9EZWZhdWx0OworCXUzMiAgIG1fUkYzX0RlZmF1bHQ7Cit9OworCitlbnVtIEVSZWdpc3RlciB7CisJSUQgPSAwLAorCVRNLAorCVBMLAorCUVQMSwgRVAyLCBFUDMsIEVQNCwgRVA1LAorCUNQRCwgQ0QxLCBDRDIsIENEMywKKwlNUEQsIE1EMSwgTUQyLCBNRDMsCisJRUIxLCBFQjIsIEVCMywgRUI0LCBFQjUsIEVCNiwgRUI3LCBFQjgsIEVCOSwgRUIxMCwKKwlFQjExLCBFQjEyLCBFQjEzLCBFQjE0LCBFQjE1LCBFQjE2LCBFQjE3LCBFQjE4LCBFQjE5LCBFQjIwLAorCUVCMjEsIEVCMjIsIEVCMjMsCisJTlVNX1JFR1MKK307CisKK3N0cnVjdCB0ZGFfc3RhdGUgeworCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjOworCXU4IGFkcjsKKworCXUzMiAgIG1fRnJlcXVlbmN5OworCXUzMiAgIElGOworCisJdTggICAgbV9JRkxldmVsQW5hbG9nOworCXU4ICAgIG1fSUZMZXZlbERpZ2l0YWw7CisJdTggICAgbV9JRkxldmVsRFZCQzsKKwl1OCAgICBtX0lGTGV2ZWxEVkJUOworCisJdTggICAgbV9FUDQ7CisJdTggICAgbV9FUDNfU3RhbmRieTsKKworCWJvb2wgIG1fYk1hc3RlcjsKKworCXMzMiAgIG1fU2V0dGxpbmdUaW1lOworCisJdTggICAgbV9SZWdzW05VTV9SRUdTXTsKKworCS8qIFRyYWNraW5nIGZpbHRlciBzZXR0aW5ncyBmb3IgYmFuZCAwLi42ICovCisJdTMyICAgbV9SRjFbN107CisJczMyICAgbV9SRl9BMVs3XTsKKwlzMzIgICBtX1JGX0IxWzddOworCXUzMiAgIG1fUkYyWzddOworCXMzMiAgIG1fUkZfQTJbN107CisJczMyICAgbV9SRl9CMls3XTsKKwl1MzIgICBtX1JGM1s3XTsKKworCXU4ICAgIG1fVE1WYWx1ZV9SRkNhbDsgICAgLyogQ2FsaWJyYXRpb24gdGVtcGVyYXR1ciAqLworCisJYm9vbCAgbV9iRk1JbnB1dDsgICAgICAgICAvKiB0cnVlIHRvIHVzZSBQaW4gOCBmb3IgRk0gUmFkaW8gKi8KKworfTsKKworc3RhdGljIGludCBQb3dlclNjYW4oc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGUsCisJCSAgICAgdTggUkZCYW5kLCB1MzIgUkZfaW4sCisJCSAgICAgdTMyICpwUkZfT3V0LCBib29sICpwYmNhbCk7CisKK3N0YXRpYyBpbnQgaTJjX3JlYWRuKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgdTggYWRyLCB1OCAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzWzFdID0ge3suYWRkciA9IGFkciwgIC5mbGFncyA9IEkyQ19NX1JELAorCQkJCSAgIC5idWYgID0gZGF0YSwgLmxlbiAgID0gbGVufSB9OworCXJldHVybiAoaTJjX3RyYW5zZmVyKGFkYXB0ZXIsIG1zZ3MsIDEpID09IDEpID8gMCA6IC0xOworfQorCitzdGF0aWMgaW50IGkyY193cml0ZShzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAsIHU4IGFkciwgdTggKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IGkyY19tc2cgbXNnID0gey5hZGRyID0gYWRyLCAuZmxhZ3MgPSAwLAorCQkJICAgICAgLmJ1ZiA9IGRhdGEsIC5sZW4gPSBsZW59OworCisJaWYgKGkyY190cmFuc2ZlcihhZGFwLCAmbXNnLCAxKSAhPSAxKSB7CisJCXByaW50ayhLRVJOX0VSUiAidGRhMTgyNzFjMmRkOiBpMmMgd3JpdGUgZXJyb3IgYXQgYWRkciAlaVxuIiwgYWRyKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBXcml0ZVJlZ3Moc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGUsCisJCSAgICAgdTggU3ViQWRkciwgdTggKlJlZ3MsIHUxNiBuUmVncykKK3sKKwl1OCBkYXRhW25SZWdzKzFdOworCisJZGF0YVswXSA9IFN1YkFkZHI7CisJbWVtY3B5KGRhdGEgKyAxLCBSZWdzLCBuUmVncyk7CisJcmV0dXJuIGkyY193cml0ZShzdGF0ZS0+aTJjLCBzdGF0ZS0+YWRyLCBkYXRhLCBuUmVncysxKTsKK30KKworc3RhdGljIGludCBXcml0ZVJlZyhzdHJ1Y3QgdGRhX3N0YXRlICpzdGF0ZSwgdTggU3ViQWRkciwgdTggUmVnKQoreworCXU4IG1zZ1syXSA9IHtTdWJBZGRyLCBSZWd9OworCisJcmV0dXJuIGkyY193cml0ZShzdGF0ZS0+aTJjLCBzdGF0ZS0+YWRyLCBtc2csIDIpOworfQorCitzdGF0aWMgaW50IFJlYWQoc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGUsIHU4ICogUmVncykKK3sKKwlyZXR1cm4gaTJjX3JlYWRuKHN0YXRlLT5pMmMsIHN0YXRlLT5hZHIsIFJlZ3MsIDE2KTsKK30KKworc3RhdGljIGludCBSZWFkRXh0ZW50ZWQoc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGUsIHU4ICogUmVncykKK3sKKwlyZXR1cm4gaTJjX3JlYWRuKHN0YXRlLT5pMmMsIHN0YXRlLT5hZHIsIFJlZ3MsIE5VTV9SRUdTKTsKK30KKworc3RhdGljIGludCBVcGRhdGVSZWdzKHN0cnVjdCB0ZGFfc3RhdGUgKnN0YXRlLCB1OCBSZWdGcm9tLCB1OCBSZWdUbykKK3sKKwlyZXR1cm4gV3JpdGVSZWdzKHN0YXRlLCBSZWdGcm9tLAorCQkJICZzdGF0ZS0+bV9SZWdzW1JlZ0Zyb21dLCBSZWdUby1SZWdGcm9tKzEpOworfQorc3RhdGljIGludCBVcGRhdGVSZWcoc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGUsIHU4IFJlZykKK3sKKwlyZXR1cm4gV3JpdGVSZWcoc3RhdGUsIFJlZywgc3RhdGUtPm1fUmVnc1tSZWddKTsKK30KKworI2luY2x1ZGUgInRkYTE4MjcxYzJkZF9tYXBzLmgiCisKK3N0YXRpYyB2b2lkIHJlc2V0KHN0cnVjdCB0ZGFfc3RhdGUgKnN0YXRlKQoreworCXUzMiAgIHVsSUZMZXZlbEFuYWxvZyA9IDA7CisJdTMyICAgdWxJRkxldmVsRGlnaXRhbCA9IDI7CisJdTMyICAgdWxJRkxldmVsRFZCQyA9IDc7CisJdTMyICAgdWxJRkxldmVsRFZCVCA9IDY7CisJdTMyICAgdWxYVE91dCA9IDA7CisJdTMyICAgdWxTdGFuZGJ5TW9kZSA9IDB4MDY7ICAgIC8qIFNlbmQgaW4gc3RkYiwgYnV0IGxlYXZlIG9zYyBvbiAqLworCXUzMiAgIHVsU2xhdmUgPSAwOworCXUzMiAgIHVsRk1JbnB1dCA9IDA7CisJdTMyICAgdWxTZXR0bGluZ1RpbWUgPSAxMDA7CisKKwlzdGF0ZS0+bV9GcmVxdWVuY3kgICAgICAgICA9IDA7CisJc3RhdGUtPm1fU2V0dGxpbmdUaW1lID0gMTAwOworCXN0YXRlLT5tX0lGTGV2ZWxBbmFsb2cgPSAodWxJRkxldmVsQW5hbG9nICYgMHgwNykgPDwgMjsKKwlzdGF0ZS0+bV9JRkxldmVsRGlnaXRhbCA9ICh1bElGTGV2ZWxEaWdpdGFsICYgMHgwNykgPDwgMjsKKwlzdGF0ZS0+bV9JRkxldmVsRFZCQyA9ICh1bElGTGV2ZWxEVkJDICYgMHgwNykgPDwgMjsKKwlzdGF0ZS0+bV9JRkxldmVsRFZCVCA9ICh1bElGTGV2ZWxEVkJUICYgMHgwNykgPDwgMjsKKworCXN0YXRlLT5tX0VQNCA9IDB4MjA7CisJaWYgKHVsWFRPdXQgIT0gMCkKKwkJc3RhdGUtPm1fRVA0IHw9IDB4NDA7CisKKwlzdGF0ZS0+bV9FUDNfU3RhbmRieSA9ICgodWxTdGFuZGJ5TW9kZSAmIDB4MDcpIDw8IDUpIHwgMHgwRjsKKwlzdGF0ZS0+bV9iTWFzdGVyID0gKHVsU2xhdmUgPT0gMCk7CisKKwlzdGF0ZS0+bV9TZXR0bGluZ1RpbWUgPSB1bFNldHRsaW5nVGltZTsKKworCXN0YXRlLT5tX2JGTUlucHV0ID0gKHVsRk1JbnB1dCA9PSAyKTsKK30KKworc3RhdGljIGJvb2wgU2VhcmNoTWFwMShzdHJ1Y3QgU01hcCBNYXBbXSwKKwkJICAgICAgIHUzMiBGcmVxdWVuY3ksIHU4ICpwUGFyYW0pCit7CisJaW50IGkgPSAwOworCisJd2hpbGUgKChNYXBbaV0ubV9GcmVxdWVuY3kgIT0gMCkgJiYgKEZyZXF1ZW5jeSA+IE1hcFtpXS5tX0ZyZXF1ZW5jeSkpCisJCWkgKz0gMTsKKwlpZiAoTWFwW2ldLm1fRnJlcXVlbmN5ID09IDApCisJCXJldHVybiBmYWxzZTsKKwkqcFBhcmFtID0gTWFwW2ldLm1fUGFyYW07CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIFNlYXJjaE1hcDIoc3RydWN0IFNNYXBJIE1hcFtdLAorCQkgICAgICAgdTMyIEZyZXF1ZW5jeSwgczMyICpwUGFyYW0pCit7CisJaW50IGkgPSAwOworCisJd2hpbGUgKChNYXBbaV0ubV9GcmVxdWVuY3kgIT0gMCkgJiYKKwkgICAgICAgKEZyZXF1ZW5jeSA+IE1hcFtpXS5tX0ZyZXF1ZW5jeSkpCisJCWkgKz0gMTsKKwlpZiAoTWFwW2ldLm1fRnJlcXVlbmN5ID09IDApCisJCXJldHVybiBmYWxzZTsKKwkqcFBhcmFtID0gTWFwW2ldLm1fUGFyYW07CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIFNlYXJjaE1hcDMoc3RydWN0IFNNYXAyIE1hcFtdLCB1MzIgRnJlcXVlbmN5LAorCQkgICAgICAgdTggKnBQYXJhbTEsIHU4ICpwUGFyYW0yKQoreworCWludCBpID0gMDsKKworCXdoaWxlICgoTWFwW2ldLm1fRnJlcXVlbmN5ICE9IDApICYmCisJICAgICAgIChGcmVxdWVuY3kgPiBNYXBbaV0ubV9GcmVxdWVuY3kpKQorCQlpICs9IDE7CisJaWYgKE1hcFtpXS5tX0ZyZXF1ZW5jeSA9PSAwKQorCQlyZXR1cm4gZmFsc2U7CisJKnBQYXJhbTEgPSBNYXBbaV0ubV9QYXJhbTE7CisJKnBQYXJhbTIgPSBNYXBbaV0ubV9QYXJhbTI7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIFNlYXJjaE1hcDQoc3RydWN0IFNSRkJhbmRNYXAgTWFwW10sCisJCSAgICAgICB1MzIgRnJlcXVlbmN5LCB1OCAqcFJGQmFuZCkKK3sKKwlpbnQgaSA9IDA7CisKKwl3aGlsZSAoaSA8IDcgJiYgKEZyZXF1ZW5jeSA+IE1hcFtpXS5tX1JGX21heCkpCisJCWkgKz0gMTsKKwlpZiAoaSA9PSA3KQorCQlyZXR1cm4gZmFsc2U7CisJKnBSRkJhbmQgPSBpOworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50IFRoZXJtb21ldGVyUmVhZChzdHJ1Y3QgdGRhX3N0YXRlICpzdGF0ZSwgdTggKnBUTV9WYWx1ZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKworCWRvIHsKKwkJdTggUmVnc1sxNl07CisJCXN0YXRlLT5tX1JlZ3NbVE1dIHw9IDB4MTA7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgVE0pOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0dXMgPSBSZWFkKHN0YXRlLCBSZWdzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJaWYgKCgoUmVnc1tUTV0gJiAweDBGKSA9PSAwICYmIChSZWdzW1RNXSAmIDB4MjApID09IDB4MjApIHx8CisJCSAgICAoKFJlZ3NbVE1dICYgMHgwRikgPT0gOCAmJiAoUmVnc1tUTV0gJiAweDIwKSA9PSAweDAwKSkgeworCQkJc3RhdGUtPm1fUmVnc1tUTV0gXj0gMHgyMDsKKwkJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgVE0pOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJYnJlYWs7CisJCQltc2xlZXAoMTApOworCQkJc3RhdHVzID0gUmVhZChzdGF0ZSwgUmVncyk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlicmVhazsKKwkJfQorCQkqcFRNX1ZhbHVlID0gKFJlZ3NbVE1dICYgMHgyMCkKKwkJCQk/IG1fVGhlcm1vbWV0ZXJfTWFwXzJbUmVnc1tUTV0gJiAweDBGXQorCQkJCTogbV9UaGVybW9tZXRlcl9NYXBfMVtSZWdzW1RNXSAmIDB4MEZdIDsKKwkJc3RhdGUtPm1fUmVnc1tUTV0gJj0gfjB4MTA7ICAgICAgICAvKiBUaGVybW9tZXRlciBvZmYgKi8KKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBUTSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXRlLT5tX1JlZ3NbRVA0XSAmPSB+MHgwMzsgICAgICAgLyogQ0FMX21vZGUgPSAwID8/Pz8/Pz8/PyAqLworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVQNCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoMCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IFN0YW5kQnkoc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGUpCit7CisJaW50IHN0YXR1cyA9IDA7CisJZG8geworCQlzdGF0ZS0+bV9SZWdzW0VCMTJdICY9IH4weDIwOyAgLyogUERfQUdDMV9EZXQgPSAwICovCisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRUIxMik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXRlLT5tX1JlZ3NbRUIxOF0gJj0gfjB4ODM7ICAvKiBBR0MxX2xvb3Bfb2ZmID0gMCwgQUdDMV9HYWluID0gNiBkQiAqLworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVCMTgpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0ZS0+bV9SZWdzW0VCMjFdIHw9IDB4MDM7IC8qIEFHQzJfR2FpbiA9IC02IGRCICovCisJCXN0YXRlLT5tX1JlZ3NbRVAzXSA9IHN0YXRlLT5tX0VQM19TdGFuZGJ5OworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVQMyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXRlLT5tX1JlZ3NbRUIyM10gJj0gfjB4MDY7IC8qIEZvcmNlTFBfRmMyX0VuID0gMCwgTFBfRmNbMl0gPSAwICovCisJCXN0YXR1cyA9IFVwZGF0ZVJlZ3Moc3RhdGUsIEVCMjEsIEVCMjMpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCX0gd2hpbGUgKDApOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgQ2FsY01haW5QTEwoc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGUsIHUzMiBmcmVxKQoreworCisJdTggIFBvc3REaXY7CisJdTggIERpdjsKKwl1NjQgT3NjRnJlcTsKKwl1MzIgTWFpbkRpdjsKKworCWlmICghU2VhcmNoTWFwMyhtX01haW5fUExMX01hcCwgZnJlcSwgJlBvc3REaXYsICZEaXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCU9zY0ZyZXEgPSAodTY0KSBmcmVxICogKHU2NCkgRGl2OworCU9zY0ZyZXEgKj0gKHU2NCkgMTYzODQ7CisJZG9fZGl2KE9zY0ZyZXEsICh1NjQpMTYwMDAwMDApOworCU1haW5EaXYgPSBPc2NGcmVxOworCisJc3RhdGUtPm1fUmVnc1tNUERdID0gUG9zdERpdiAmIDB4Nzc7CisJc3RhdGUtPm1fUmVnc1tNRDFdID0gKChNYWluRGl2ID4+IDE2KSAmIDB4N0YpOworCXN0YXRlLT5tX1JlZ3NbTUQyXSA9ICgoTWFpbkRpdiA+PiAgOCkgJiAweEZGKTsKKwlzdGF0ZS0+bV9SZWdzW01EM10gPSAoTWFpbkRpdiAmIDB4RkYpOworCisJcmV0dXJuIFVwZGF0ZVJlZ3Moc3RhdGUsIE1QRCwgTUQzKTsKK30KKworc3RhdGljIGludCBDYWxjQ2FsUExMKHN0cnVjdCB0ZGFfc3RhdGUgKnN0YXRlLCB1MzIgZnJlcSkKK3sKKwl1OCBQb3N0RGl2OworCXU4IERpdjsKKwl1NjQgT3NjRnJlcTsKKwl1MzIgQ2FsRGl2OworCisJaWYgKCFTZWFyY2hNYXAzKG1fQ2FsX1BMTF9NYXAsIGZyZXEsICZQb3N0RGl2LCAmRGl2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlPc2NGcmVxID0gKHU2NClmcmVxICogKHU2NClEaXY7CisJLyogQ2FsRGl2ID0gdTMyKCBPc2NGcmVxICogMTYzODQgLyAxNjAwMDAwMCApOyAqLworCU9zY0ZyZXEgKj0gKHU2NCkxNjM4NDsKKwlkb19kaXYoT3NjRnJlcSwgKHU2NCkxNjAwMDAwMCk7CisJQ2FsRGl2ID0gT3NjRnJlcTsKKworCXN0YXRlLT5tX1JlZ3NbQ1BEXSA9IFBvc3REaXY7CisJc3RhdGUtPm1fUmVnc1tDRDFdID0gKChDYWxEaXYgPj4gMTYpICYgMHhGRik7CisJc3RhdGUtPm1fUmVnc1tDRDJdID0gKChDYWxEaXYgPj4gIDgpICYgMHhGRik7CisJc3RhdGUtPm1fUmVnc1tDRDNdID0gKENhbERpdiAmIDB4RkYpOworCisJcmV0dXJuIFVwZGF0ZVJlZ3Moc3RhdGUsIENQRCwgQ0QzKTsKK30KKworc3RhdGljIGludCBDYWxpYnJhdGVSRihzdHJ1Y3QgdGRhX3N0YXRlICpzdGF0ZSwKKwkJICAgICAgIHU4IFJGQmFuZCwgdTMyIGZyZXEsIHMzMiAqcENwcm9nKQoreworCWludCBzdGF0dXMgPSAwOworCXU4IFJlZ3NbTlVNX1JFR1NdOworCWRvIHsKKwkJdTggQlBfRmlsdGVyID0gMDsKKwkJdTggR2FpblRhcGVyID0gMDsKKwkJdTggUkZDX0sgPSAwOworCQl1OCBSRkNfTSA9IDA7CisKKwkJc3RhdGUtPm1fUmVnc1tFUDRdICY9IH4weDAzOyAvKiBDQUxfbW9kZSA9IDAgKi8KKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFUDQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0ZS0+bV9SZWdzW0VCMThdIHw9IDB4MDM7ICAvKiBBR0MxX0dhaW4gPSAzICovCisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRUIxOCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisKKwkJLyogU3dpdGNoaW5nIG9mZiBMVCAoYXMgZGF0YXNoZWV0IHNheXMpIGNhdXNlcyBjYWxpYnJhdGlvbiBvbiBDMSB0byBmYWlsICovCisJCS8qIChSZWFkb3V0IG9mIENwcm9nIGlzIGFsbHdheXMgMjU1KSAqLworCQlpZiAoc3RhdGUtPm1fUmVnc1tJRF0gIT0gMHg4MykgICAgLyogQzE6IElEID09IDgzLCBDMjogSUQgPT0gODQgKi8KKwkJCXN0YXRlLT5tX1JlZ3NbRVAzXSB8PSAweDQwOyAvKiBTTV9MVCA9IDEgKi8KKworCQlpZiAoIShTZWFyY2hNYXAxKG1fQlBfRmlsdGVyX01hcCwgZnJlcSwgJkJQX0ZpbHRlcikgJiYKKwkJCVNlYXJjaE1hcDEobV9HYWluVGFwZXJfTWFwLCBmcmVxLCAmR2FpblRhcGVyKSAmJgorCQkJU2VhcmNoTWFwMyhtX0tNX01hcCwgZnJlcSwgJlJGQ19LLCAmUkZDX00pKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXN0YXRlLT5tX1JlZ3NbRVAxXSA9IChzdGF0ZS0+bV9SZWdzW0VQMV0gJiB+MHgwNykgfCBCUF9GaWx0ZXI7CisJCXN0YXRlLT5tX1JlZ3NbRVAyXSA9IChSRkJhbmQgPDwgNSkgfCBHYWluVGFwZXI7CisKKwkJc3RhdGUtPm1fUmVnc1tFQjEzXSA9IChzdGF0ZS0+bV9SZWdzW0VCMTNdICYgfjB4N0MpIHwgKFJGQ19LIDw8IDQpIHwgKFJGQ19NIDw8IDIpOworCisJCXN0YXR1cyA9IFVwZGF0ZVJlZ3Moc3RhdGUsIEVQMSwgRVAzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFQjEzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworCQlzdGF0ZS0+bV9SZWdzW0VCNF0gfD0gMHgyMDsgICAgLyogTE9fRm9yY2VTcmNlID0gMSAqLworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVCNCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisKKwkJc3RhdGUtPm1fUmVnc1tFQjddIHw9IDB4MjA7ICAgIC8qIENBTF9Gb3JjZVNyY2UgPSAxICovCisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRUI3KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworCQlzdGF0ZS0+bV9SZWdzW0VCMTRdID0gMDsgLyogUkZDX0Nwcm9nID0gMCAqLworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVCMTQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCisJCXN0YXRlLT5tX1JlZ3NbRUIyMF0gJj0gfjB4MjA7ICAvKiBGb3JjZUxvY2sgPSAwOyAqLworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVCMjApOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCisJCXN0YXRlLT5tX1JlZ3NbRVA0XSB8PSAweDAzOyAgLyogQ0FMX01vZGUgPSAzICovCisJCXN0YXR1cyA9IFVwZGF0ZVJlZ3Moc3RhdGUsIEVQNCwgRVA1KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworCQlzdGF0dXMgPSBDYWxjQ2FsUExMKHN0YXRlLCBmcmVxKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdHVzID0gQ2FsY01haW5QTEwoc3RhdGUsIGZyZXEgKyAxMDAwMDAwKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworCQltc2xlZXAoNSk7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRVAyKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFUDEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVQMik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRVAxKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworCQlzdGF0ZS0+bV9SZWdzW0VCNF0gJj0gfjB4MjA7ICAgIC8qIExPX0ZvcmNlU3JjZSA9IDAgKi8KKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFQjQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCisJCXN0YXRlLT5tX1JlZ3NbRUI3XSAmPSB+MHgyMDsgICAgLyogQ0FMX0ZvcmNlU3JjZSA9IDAgKi8KKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFQjcpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQltc2xlZXAoMTApOworCisJCXN0YXRlLT5tX1JlZ3NbRUIyMF0gfD0gMHgyMDsgIC8qIEZvcmNlTG9jayA9IDE7ICovCisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRUIyMCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCW1zbGVlcCg2MCk7CisKKwkJc3RhdGUtPm1fUmVnc1tFUDRdICY9IH4weDAzOyAgLyogQ0FMX01vZGUgPSAwICovCisJCXN0YXRlLT5tX1JlZ3NbRVAzXSAmPSB+MHg0MDsgLyogU01fTFQgPSAwICovCisJCXN0YXRlLT5tX1JlZ3NbRUIxOF0gJj0gfjB4MDM7ICAvKiBBR0MxX0dhaW4gPSAwICovCisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRUIxOCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZ3Moc3RhdGUsIEVQMywgRVA0KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFUDEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCisJCXN0YXR1cyA9IFJlYWRFeHRlbnRlZChzdGF0ZSwgUmVncyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisKKwkJKnBDcHJvZyA9IFJlZ3NbRUIxNF07CisKKwl9IHdoaWxlICgwKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IFJGVHJhY2tpbmdGaWx0ZXJzSW5pdChzdHJ1Y3QgdGRhX3N0YXRlICpzdGF0ZSwKKwkJCQkgdTggUkZCYW5kKQoreworCWludCBzdGF0dXMgPSAwOworCisJdTMyICAgUkYxID0gbV9SRl9CYW5kX01hcFtSRkJhbmRdLm1fUkYxX0RlZmF1bHQ7CisJdTMyICAgUkYyID0gbV9SRl9CYW5kX01hcFtSRkJhbmRdLm1fUkYyX0RlZmF1bHQ7CisJdTMyICAgUkYzID0gbV9SRl9CYW5kX01hcFtSRkJhbmRdLm1fUkYzX0RlZmF1bHQ7CisJYm9vbCAgICBiY2FsID0gZmFsc2U7CisKKwlzMzIgICAgQ3Byb2dfY2FsMSA9IDA7CisJczMyICAgIENwcm9nX3RhYmxlMSA9IDA7CisJczMyICAgIENwcm9nX2NhbDIgPSAwOworCXMzMiAgICBDcHJvZ190YWJsZTIgPSAwOworCXMzMiAgICBDcHJvZ19jYWwzID0gMDsKKwlzMzIgICAgQ3Byb2dfdGFibGUzID0gMDsKKworCXN0YXRlLT5tX1JGX0ExW1JGQmFuZF0gPSAwOworCXN0YXRlLT5tX1JGX0IxW1JGQmFuZF0gPSAwOworCXN0YXRlLT5tX1JGX0EyW1JGQmFuZF0gPSAwOworCXN0YXRlLT5tX1JGX0IyW1JGQmFuZF0gPSAwOworCisJZG8geworCQlzdGF0dXMgPSBQb3dlclNjYW4oc3RhdGUsIFJGQmFuZCwgUkYxLCAmUkYxLCAmYmNhbCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCWlmIChiY2FsKSB7CisJCQlzdGF0dXMgPSBDYWxpYnJhdGVSRihzdGF0ZSwgUkZCYW5kLCBSRjEsICZDcHJvZ19jYWwxKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWJyZWFrOworCQl9CisJCVNlYXJjaE1hcDIobV9SRl9DYWxfTWFwLCBSRjEsICZDcHJvZ190YWJsZTEpOworCQlpZiAoIWJjYWwpCisJCQlDcHJvZ19jYWwxID0gQ3Byb2dfdGFibGUxOworCQlzdGF0ZS0+bV9SRl9CMVtSRkJhbmRdID0gQ3Byb2dfY2FsMSAtIENwcm9nX3RhYmxlMTsKKwkJLyogc3RhdGUtPm1fUkZfQTFbUkZfQmFuZF0gPSA/Pz8/ICovCisKKwkJaWYgKFJGMiA9PSAwKQorCQkJYnJlYWs7CisKKwkJc3RhdHVzID0gUG93ZXJTY2FuKHN0YXRlLCBSRkJhbmQsIFJGMiwgJlJGMiwgJmJjYWwpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlpZiAoYmNhbCkgeworCQkJc3RhdHVzID0gQ2FsaWJyYXRlUkYoc3RhdGUsIFJGQmFuZCwgUkYyLCAmQ3Byb2dfY2FsMik7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlicmVhazsKKwkJfQorCQlTZWFyY2hNYXAyKG1fUkZfQ2FsX01hcCwgUkYyLCAmQ3Byb2dfdGFibGUyKTsKKwkJaWYgKCFiY2FsKQorCQkJQ3Byb2dfY2FsMiA9IENwcm9nX3RhYmxlMjsKKworCQlzdGF0ZS0+bV9SRl9BMVtSRkJhbmRdID0KKwkJCShDcHJvZ19jYWwyIC0gQ3Byb2dfdGFibGUyIC0gQ3Byb2dfY2FsMSArIENwcm9nX3RhYmxlMSkgLworCQkJKChzMzIpKFJGMikgLSAoczMyKShSRjEpKTsKKworCQlpZiAoUkYzID09IDApCisJCQlicmVhazsKKworCQlzdGF0dXMgPSBQb3dlclNjYW4oc3RhdGUsIFJGQmFuZCwgUkYzLCAmUkYzLCAmYmNhbCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCWlmIChiY2FsKSB7CisJCQlzdGF0dXMgPSBDYWxpYnJhdGVSRihzdGF0ZSwgUkZCYW5kLCBSRjMsICZDcHJvZ19jYWwzKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWJyZWFrOworCQl9CisJCVNlYXJjaE1hcDIobV9SRl9DYWxfTWFwLCBSRjMsICZDcHJvZ190YWJsZTMpOworCQlpZiAoIWJjYWwpCisJCQlDcHJvZ19jYWwzID0gQ3Byb2dfdGFibGUzOworCQlzdGF0ZS0+bV9SRl9BMltSRkJhbmRdID0gKENwcm9nX2NhbDMgLSBDcHJvZ190YWJsZTMgLSBDcHJvZ19jYWwyICsgQ3Byb2dfdGFibGUyKSAvICgoczMyKShSRjMpIC0gKHMzMikoUkYyKSk7CisJCXN0YXRlLT5tX1JGX0IyW1JGQmFuZF0gPSBDcHJvZ19jYWwyIC0gQ3Byb2dfdGFibGUyOworCisJfSB3aGlsZSAoMCk7CisKKwlzdGF0ZS0+bV9SRjFbUkZCYW5kXSA9IFJGMTsKKwlzdGF0ZS0+bV9SRjJbUkZCYW5kXSA9IFJGMjsKKwlzdGF0ZS0+bV9SRjNbUkZCYW5kXSA9IFJGMzsKKworI2lmIDAKKwlwcmludGsoS0VSTl9FUlIgInRkYTE4MjcxYzJkZDogJXMgJWQgUkYxID0gJWQgQTEgPSAlZCBCMSA9ICVkIFJGMiA9ICVkIEEyID0gJWQgQjIgPSAlZCBSRjMgPSAlZFxuIiwgX19mdW5jX18sCisJICAgICAgIFJGQmFuZCwgUkYxLCBzdGF0ZS0+bV9SRl9BMVtSRkJhbmRdLCBzdGF0ZS0+bV9SRl9CMVtSRkJhbmRdLCBSRjIsCisJICAgICAgIHN0YXRlLT5tX1JGX0EyW1JGQmFuZF0sIHN0YXRlLT5tX1JGX0IyW1JGQmFuZF0sIFJGMyk7CisjZW5kaWYKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgUG93ZXJTY2FuKHN0cnVjdCB0ZGFfc3RhdGUgKnN0YXRlLAorCQkgICAgIHU4IFJGQmFuZCwgdTMyIFJGX2luLCB1MzIgKnBSRl9PdXQsIGJvb2wgKnBiY2FsKQoreworCWludCBzdGF0dXMgPSAwOworCWRvIHsKKwkJdTggICBHYWluX1RhcGVyID0gMDsKKwkJczMyICBSRkNfQ3Byb2cgPSAwOworCQl1OCAgIENJRF9UYXJnZXQgPSAwOworCQl1OCAgIENvdW50TGltaXQgPSAwOworCQl1MzIgIGZyZXFfTWFpblBMTDsKKwkJdTggICBSZWdzW05VTV9SRUdTXTsKKwkJdTggICBDSURfR2FpbjsKKwkJczMyICBDb3VudCA9IDA7CisJCWludCAgc2lnbiAgPSAxOworCQlib29sIHdhaXQgPSBmYWxzZTsKKworCQlpZiAoIShTZWFyY2hNYXAyKG1fUkZfQ2FsX01hcCwgUkZfaW4sICZSRkNfQ3Byb2cpICYmCisJCSAgICAgIFNlYXJjaE1hcDEobV9HYWluVGFwZXJfTWFwLCBSRl9pbiwgJkdhaW5fVGFwZXIpICYmCisJCSAgICAgIFNlYXJjaE1hcDMobV9DSURfVGFyZ2V0X01hcCwgUkZfaW4sICZDSURfVGFyZ2V0LCAmQ291bnRMaW1pdCkpKSB7CisKKwkJCXByaW50ayhLRVJOX0VSUiAidGRhMTgyNzFjMmRkOiAlcyBTZWFyY2ggbWFwIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlzdGF0ZS0+bV9SZWdzW0VQMl0gPSAoUkZCYW5kIDw8IDUpIHwgR2Fpbl9UYXBlcjsKKwkJc3RhdGUtPm1fUmVnc1tFQjE0XSA9IChSRkNfQ3Byb2cpOworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVQMik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRUIxNCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisKKwkJZnJlcV9NYWluUExMID0gUkZfaW4gKyAxMDAwMDAwOworCQlzdGF0dXMgPSBDYWxjTWFpblBMTChzdGF0ZSwgZnJlcV9NYWluUExMKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJbXNsZWVwKDUpOworCQlzdGF0ZS0+bV9SZWdzW0VQNF0gPSAoc3RhdGUtPm1fUmVnc1tFUDRdICYgfjB4MDMpIHwgMTsgICAgLyogQ0FMX21vZGUgPSAxICovCisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRVA0KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFUDIpOyAgLyogTGF1bmNoIHBvd2VyIG1lYXN1cmVtZW50ICovCisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IFJlYWRFeHRlbnRlZChzdGF0ZSwgUmVncyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCUNJRF9HYWluID0gUmVnc1tFQjEwXSAmIDB4M0Y7CisJCXN0YXRlLT5tX1JlZ3NbSURdID0gUmVnc1tJRF07ICAvKiBDaGlwIHZlcnNpb24sIChuZWVkZWQgZm9yIEMxIHdvcmthcnJvdW5kIGluIENhbGlicmF0ZVJGKSAqLworCisJCSpwUkZfT3V0ID0gUkZfaW47CisKKwkJd2hpbGUgKENJRF9HYWluIDwgQ0lEX1RhcmdldCkgeworCQkJZnJlcV9NYWluUExMID0gUkZfaW4gKyBzaWduICogQ291bnQgKyAxMDAwMDAwOworCQkJc3RhdHVzID0gQ2FsY01haW5QTEwoc3RhdGUsIGZyZXFfTWFpblBMTCk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlicmVhazsKKwkJCW1zbGVlcCh3YWl0ID8gNSA6IDEpOworCQkJd2FpdCA9IGZhbHNlOworCQkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFUDIpOyAgLyogTGF1bmNoIHBvd2VyIG1lYXN1cmVtZW50ICovCisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlicmVhazsKKwkJCXN0YXR1cyA9IFJlYWRFeHRlbnRlZChzdGF0ZSwgUmVncyk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlicmVhazsKKwkJCUNJRF9HYWluID0gUmVnc1tFQjEwXSAmIDB4M0Y7CisJCQlDb3VudCArPSAyMDAwMDA7CisKKwkJCWlmIChDb3VudCA8IENvdW50TGltaXQgKiAxMDAwMDApCisJCQkJY29udGludWU7CisJCQlpZiAoc2lnbiA8IDApCisJCQkJYnJlYWs7CisKKwkJCXNpZ24gPSAtc2lnbjsKKwkJCUNvdW50ID0gMjAwMDAwOworCQkJd2FpdCA9IHRydWU7CisJCX0KKwkJc3RhdHVzID0gc3RhdHVzOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlpZiAoQ0lEX0dhaW4gPj0gQ0lEX1RhcmdldCkgeworCQkJKnBiY2FsID0gdHJ1ZTsKKwkJCSpwUkZfT3V0ID0gZnJlcV9NYWluUExMIC0gMTAwMDAwMDsKKwkJfSBlbHNlCisJCQkqcGJjYWwgPSBmYWxzZTsKKwl9IHdoaWxlICgwKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgUG93ZXJTY2FuSW5pdChzdHJ1Y3QgdGRhX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlkbyB7CisJCXN0YXRlLT5tX1JlZ3NbRVAzXSA9IChzdGF0ZS0+bV9SZWdzW0VQM10gJiB+MHgxRikgfCAweDEyOworCQlzdGF0ZS0+bV9SZWdzW0VQNF0gPSAoc3RhdGUtPm1fUmVnc1tFUDRdICYgfjB4MUYpOyAvKiBJZiBsZXZlbCA9IDAsIENhbCBtb2RlID0gMCAqLworCQlzdGF0dXMgPSBVcGRhdGVSZWdzKHN0YXRlLCBFUDMsIEVQNCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXRlLT5tX1JlZ3NbRUIxOF0gPSAoc3RhdGUtPm1fUmVnc1tFQjE4XSAmIH4weDAzKTsgLyogQUdDIDEgR2FpbiA9IDAgKi8KKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFQjE4KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdGUtPm1fUmVnc1tFQjIxXSA9IChzdGF0ZS0+bV9SZWdzW0VCMjFdICYgfjB4MDMpOyAvKiBBR0MgMiBHYWluID0gMCAoRGF0YXNoZWV0ID0gMykgKi8KKwkJc3RhdGUtPm1fUmVnc1tFQjIzXSA9IChzdGF0ZS0+bV9SZWdzW0VCMjNdIHwgMHgwNik7IC8qIEZvcmNlTFBfRmMyX0VuID0gMSwgTFBGY1syXSA9IDEgKi8KKwkJc3RhdHVzID0gVXBkYXRlUmVncyhzdGF0ZSwgRUIyMSwgRUIyMyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoMCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBDYWxjUkZGaWx0ZXJDdXJ2ZShzdHJ1Y3QgdGRhX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlkbyB7CisJCW1zbGVlcCgyMDApOyAgICAgIC8qIFRlbXBlcmF0dXJlIHN0YWJpbGlzYXRpb24gKi8KKwkJc3RhdHVzID0gUG93ZXJTY2FuSW5pdChzdGF0ZSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IFJGVHJhY2tpbmdGaWx0ZXJzSW5pdChzdGF0ZSwgMCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IFJGVHJhY2tpbmdGaWx0ZXJzSW5pdChzdGF0ZSwgMSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IFJGVHJhY2tpbmdGaWx0ZXJzSW5pdChzdGF0ZSwgMik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IFJGVHJhY2tpbmdGaWx0ZXJzSW5pdChzdGF0ZSwgMyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IFJGVHJhY2tpbmdGaWx0ZXJzSW5pdChzdGF0ZSwgNCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IFJGVHJhY2tpbmdGaWx0ZXJzSW5pdChzdGF0ZSwgNSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IFJGVHJhY2tpbmdGaWx0ZXJzSW5pdChzdGF0ZSwgNik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IFRoZXJtb21ldGVyUmVhZChzdGF0ZSwgJnN0YXRlLT5tX1RNVmFsdWVfUkZDYWwpOyAvKiBhbHNvIHN3aXRjaGVzIG9mZiBDYWwgbW9kZSAhISEgKi8KKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwl9IHdoaWxlICgwKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgRml4ZWRDb250ZW50c0kyQ1VwZGF0ZShzdHJ1Y3QgdGRhX3N0YXRlICpzdGF0ZSkKK3sKKwlzdGF0aWMgdTggSW5pdFJlZ3NbXSA9IHsKKwkJMHgwOCwgMHg4MCwgMHhDNiwKKwkJMHhERiwgMHgxNiwgMHg2MCwgMHg4MCwKKwkJMHg4MCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJMHhGQywgMHgwMSwgMHg4NCwgMHg0MSwKKwkJMHgwMSwgMHg4NCwgMHg0MCwgMHgwNywKKwkJMHgwMCwgMHgwMCwgMHg5NiwgMHgzRiwKKwkJMHhDMSwgMHgwMCwgMHg4RiwgMHgwMCwKKwkJMHgwMCwgMHg4QywgMHgwMCwgMHgyMCwKKwkJMHhCMywgMHg0OCwgMHhCMCwKKwl9OworCWludCBzdGF0dXMgPSAwOworCW1lbWNweSgmc3RhdGUtPm1fUmVnc1tUTV0sIEluaXRSZWdzLCBFQjIzIC0gVE0gKyAxKTsKKwlkbyB7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZ3Moc3RhdGUsIFRNLCBFQjIzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworCQkvKiBBR0MxIGdhaW4gc2V0dXAgKi8KKwkJc3RhdGUtPm1fUmVnc1tFQjE3XSA9IDB4MDA7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRUIxNyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXRlLT5tX1JlZ3NbRUIxN10gPSAweDAzOworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVCMTcpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0ZS0+bV9SZWdzW0VCMTddID0gMHg0MzsKKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFQjE3KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdGUtPm1fUmVnc1tFQjE3XSA9IDB4NEM7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRUIxNyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisKKwkJLyogSVJDIENhbCBMb3cgYmFuZCAqLworCQlzdGF0ZS0+bV9SZWdzW0VQM10gPSAweDFGOworCQlzdGF0ZS0+bV9SZWdzW0VQNF0gPSAweDY2OworCQlzdGF0ZS0+bV9SZWdzW0VQNV0gPSAweDgxOworCQlzdGF0ZS0+bV9SZWdzW0NQRF0gPSAweENDOworCQlzdGF0ZS0+bV9SZWdzW0NEMV0gPSAweDZDOworCQlzdGF0ZS0+bV9SZWdzW0NEMl0gPSAweDAwOworCQlzdGF0ZS0+bV9SZWdzW0NEM10gPSAweDAwOworCQlzdGF0ZS0+bV9SZWdzW01QRF0gPSAweEM1OworCQlzdGF0ZS0+bV9SZWdzW01EMV0gPSAweDc3OworCQlzdGF0ZS0+bV9SZWdzW01EMl0gPSAweDA4OworCQlzdGF0ZS0+bV9SZWdzW01EM10gPSAweDAwOworCQlzdGF0dXMgPSBVcGRhdGVSZWdzKHN0YXRlLCBFUDIsIE1EMyk7IC8qIGRpZmYgYmV0d2VlbiBzdyBhbmQgZGF0YXNoZWV0IChlcDMtbWQzKSAqLworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCisjaWYgMAorCQlzdGF0ZS0+bV9SZWdzW0VCNF0gPSAweDYxOyAgICAgICAgICAvKiBtaXNzaW5nIGluIHN3ICovCisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRUI0KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJbXNsZWVwKDEpOworCQlzdGF0ZS0+bV9SZWdzW0VCNF0gPSAweDQxOworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVCNCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisjZW5kaWYKKworCQltc2xlZXAoNSk7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRVAxKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJbXNsZWVwKDUpOworCisJCXN0YXRlLT5tX1JlZ3NbRVA1XSA9IDB4ODU7CisJCXN0YXRlLT5tX1JlZ3NbQ1BEXSA9IDB4Q0I7CisJCXN0YXRlLT5tX1JlZ3NbQ0QxXSA9IDB4NjY7CisJCXN0YXRlLT5tX1JlZ3NbQ0QyXSA9IDB4NzA7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZ3Moc3RhdGUsIEVQMywgQ0QzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJbXNsZWVwKDUpOworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVQMik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCW1zbGVlcCgzMCk7CisKKwkJLyogSVJDIENhbCBtaWQgYmFuZCAqLworCQlzdGF0ZS0+bV9SZWdzW0VQNV0gPSAweDgyOworCQlzdGF0ZS0+bV9SZWdzW0NQRF0gPSAweEE4OworCQlzdGF0ZS0+bV9SZWdzW0NEMl0gPSAweDAwOworCQlzdGF0ZS0+bV9SZWdzW01QRF0gPSAweEExOyAvKiBEYXRhc2hlZXQgPSAweEE5ICovCisJCXN0YXRlLT5tX1JlZ3NbTUQxXSA9IDB4NzM7CisJCXN0YXRlLT5tX1JlZ3NbTUQyXSA9IDB4MUE7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZ3Moc3RhdGUsIEVQMywgTUQzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworCQltc2xlZXAoNSk7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRVAxKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJbXNsZWVwKDUpOworCisJCXN0YXRlLT5tX1JlZ3NbRVA1XSA9IDB4ODY7CisJCXN0YXRlLT5tX1JlZ3NbQ1BEXSA9IDB4QTg7CisJCXN0YXRlLT5tX1JlZ3NbQ0QxXSA9IDB4NjY7CisJCXN0YXRlLT5tX1JlZ3NbQ0QyXSA9IDB4QTA7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZ3Moc3RhdGUsIEVQMywgQ0QzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJbXNsZWVwKDUpOworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVQMik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCW1zbGVlcCgzMCk7CisKKwkJLyogSVJDIENhbCBoaWdoIGJhbmQgKi8KKwkJc3RhdGUtPm1fUmVnc1tFUDVdID0gMHg4MzsKKwkJc3RhdGUtPm1fUmVnc1tDUERdID0gMHg5ODsKKwkJc3RhdGUtPm1fUmVnc1tDRDFdID0gMHg2NTsKKwkJc3RhdGUtPm1fUmVnc1tDRDJdID0gMHgwMDsKKwkJc3RhdGUtPm1fUmVnc1tNUERdID0gMHg5MTsgIC8qIERhdGFzaGVldCA9IDB4OTEgKi8KKwkJc3RhdGUtPm1fUmVnc1tNRDFdID0gMHg3MTsKKwkJc3RhdGUtPm1fUmVnc1tNRDJdID0gMHhDRDsKKwkJc3RhdHVzID0gVXBkYXRlUmVncyhzdGF0ZSwgRVAzLCBNRDMpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQltc2xlZXAoNSk7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRVAxKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJbXNsZWVwKDUpOworCQlzdGF0ZS0+bV9SZWdzW0VQNV0gPSAweDg3OworCQlzdGF0ZS0+bV9SZWdzW0NEMV0gPSAweDY1OworCQlzdGF0ZS0+bV9SZWdzW0NEMl0gPSAweDUwOworCQlzdGF0dXMgPSBVcGRhdGVSZWdzKHN0YXRlLCBFUDMsIENEMyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCW1zbGVlcCg1KTsKKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFUDIpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQltc2xlZXAoMzApOworCisJCS8qIEJhY2sgdG8gbm9ybWFsICovCisJCXN0YXRlLT5tX1JlZ3NbRVA0XSA9IDB4NjQ7CisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRVA0KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFUDEpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCisJfSB3aGlsZSAoMCk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBJbml0Q2FsKHN0cnVjdCB0ZGFfc3RhdGUgKnN0YXRlKQoreworCWludCBzdGF0dXMgPSAwOworCisJZG8geworCQlzdGF0dXMgPSBGaXhlZENvbnRlbnRzSTJDVXBkYXRlKHN0YXRlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdHVzID0gQ2FsY1JGRmlsdGVyQ3VydmUoc3RhdGUpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0dXMgPSBTdGFuZEJ5KHN0YXRlKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJLyogbV9iSW5pdERvbmUgPSB0cnVlOyAqLworCX0gd2hpbGUgKDApOworCXJldHVybiBzdGF0dXM7Cit9OworCitzdGF0aWMgaW50IFJGVHJhY2tpbmdGaWx0ZXJzQ29ycmVjdGlvbihzdHJ1Y3QgdGRhX3N0YXRlICpzdGF0ZSwKKwkJCQkgICAgICAgdTMyIEZyZXF1ZW5jeSkKK3sKKwlpbnQgc3RhdHVzID0gMDsKKwlzMzIgQ3Byb2dfdGFibGU7CisJdTggUkZCYW5kOworCXU4IGRDb3ZlcmRUOworCisJaWYgKCFTZWFyY2hNYXAyKG1fUkZfQ2FsX01hcCwgRnJlcXVlbmN5LCAmQ3Byb2dfdGFibGUpIHx8CisJICAgICFTZWFyY2hNYXA0KG1fUkZfQmFuZF9NYXAsIEZyZXF1ZW5jeSwgJlJGQmFuZCkgfHwKKwkgICAgIVNlYXJjaE1hcDEobV9SRl9DYWxfRENfT3Zlcl9EVF9NYXAsIEZyZXF1ZW5jeSwgJmRDb3ZlcmRUKSkKKworCQlyZXR1cm4gLUVJTlZBTDsKKworCWRvIHsKKwkJdTggVE1WYWx1ZV9DdXJyZW50OworCQl1MzIgICBSRjEgPSBzdGF0ZS0+bV9SRjFbUkZCYW5kXTsKKwkJdTMyICAgUkYyID0gc3RhdGUtPm1fUkYxW1JGQmFuZF07CisJCXUzMiAgIFJGMyA9IHN0YXRlLT5tX1JGMVtSRkJhbmRdOworCQlzMzIgICAgUkZfQTEgPSBzdGF0ZS0+bV9SRl9BMVtSRkJhbmRdOworCQlzMzIgICAgUkZfQjEgPSBzdGF0ZS0+bV9SRl9CMVtSRkJhbmRdOworCQlzMzIgICAgUkZfQTIgPSBzdGF0ZS0+bV9SRl9BMltSRkJhbmRdOworCQlzMzIgICAgUkZfQjIgPSBzdGF0ZS0+bV9SRl9CMltSRkJhbmRdOworCQlzMzIgQ2FwcHJveCA9IDA7CisJCWludCBUQ29tcDsKKworCQlzdGF0ZS0+bV9SZWdzW0VQM10gJj0gfjB4RTA7ICAvKiBQb3dlciB1cCAqLworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVQMyk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisKKwkJc3RhdHVzID0gVGhlcm1vbWV0ZXJSZWFkKHN0YXRlLCAmVE1WYWx1ZV9DdXJyZW50KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworCQlpZiAoUkYzID09IDAgfHwgRnJlcXVlbmN5IDwgUkYyKQorCQkJQ2FwcHJveCA9IFJGX0ExICogKChzMzIpKEZyZXF1ZW5jeSkgLSAoczMyKShSRjEpKSArIFJGX0IxICsgQ3Byb2dfdGFibGU7CisJCWVsc2UKKwkJCUNhcHByb3ggPSBSRl9BMiAqICgoczMyKShGcmVxdWVuY3kpIC0gKHMzMikoUkYyKSkgKyBSRl9CMiArIENwcm9nX3RhYmxlOworCisJCVRDb21wID0gKGludCkoZENvdmVyZFQpICogKChpbnQpKFRNVmFsdWVfQ3VycmVudCkgLSAoaW50KShzdGF0ZS0+bV9UTVZhbHVlX1JGQ2FsKSkvMTAwMDsKKworCQlDYXBwcm94ICs9IFRDb21wOworCisJCWlmIChDYXBwcm94IDwgMCkKKwkJCUNhcHByb3ggPSAwOworCQllbHNlIGlmIChDYXBwcm94ID4gMjU1KQorCQkJQ2FwcHJveCA9IDI1NTsKKworCisJCS8qIFRPRE8gVGVtcGVyYXR1cmUgY29tcGVuc2F0aW9uLiBUaGVyZSBpcyBkZWZlbml0ZWx5IGEgc2NhbGUgZmFjdG9yICovCisJCS8qICAgICAgbWlzc2luZyBpbiB0aGUgZGF0YXNoZWV0LCBzbyBsZWF2ZSBpdCBvdXQgZm9yIG5vdy4gICAgICAgICAgICovCisJCXN0YXRlLT5tX1JlZ3NbRUIxNF0gPSBDYXBwcm94OworCisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRUIxNCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisKKwl9IHdoaWxlICgwKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgaW50IENoYW5uZWxDb25maWd1cmF0aW9uKHN0cnVjdCB0ZGFfc3RhdGUgKnN0YXRlLAorCQkJCXUzMiBGcmVxdWVuY3ksIGludCBTdGFuZGFyZCkKK3sKKworCXMzMiBJbnRlcm1lZGlhdGVGcmVxdWVuY3kgPSBtX1N0YW5kYXJkVGFibGVbU3RhbmRhcmRdLm1fSUZGcmVxdWVuY3k7CisJaW50IHN0YXR1cyA9IDA7CisKKwl1OCBCUF9GaWx0ZXIgPSAwOworCXU4IFJGX0JhbmQgPSAwOworCXU4IEdhaW5UYXBlciA9IDA7CisJdTggSVJfTWVhcyA9IDA7CisKKwlzdGF0ZS0+SUYgPSBJbnRlcm1lZGlhdGVGcmVxdWVuY3k7CisJLyogcHJpbnRrKCJ0ZGExODI3MWMyZGQ6ICVzIEZyZXEgPSAlZCBTdGFuZGFyZCA9ICVkIElGID0gJWRcbiIsIF9fZnVuY19fLCBGcmVxdWVuY3ksIFN0YW5kYXJkLCBJbnRlcm1lZGlhdGVGcmVxdWVuY3kpOyAqLworCS8qIGdldCB2YWx1ZXMgZnJvbSB0YWJsZXMgKi8KKworCWlmICghKFNlYXJjaE1hcDEobV9CUF9GaWx0ZXJfTWFwLCBGcmVxdWVuY3ksICZCUF9GaWx0ZXIpICYmCisJICAgICAgIFNlYXJjaE1hcDEobV9HYWluVGFwZXJfTWFwLCBGcmVxdWVuY3ksICZHYWluVGFwZXIpICYmCisJICAgICAgIFNlYXJjaE1hcDEobV9JUl9NZWFzX01hcCwgRnJlcXVlbmN5LCAmSVJfTWVhcykgJiYKKwkgICAgICAgU2VhcmNoTWFwNChtX1JGX0JhbmRfTWFwLCBGcmVxdWVuY3ksICZSRl9CYW5kKSkpIHsKKworCQlwcmludGsoS0VSTl9FUlIgInRkYTE4MjcxYzJkZDogJXMgU2VhcmNoTWFwIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkbyB7CisJCXN0YXRlLT5tX1JlZ3NbRVAzXSA9IChzdGF0ZS0+bV9SZWdzW0VQM10gJiB+MHgxRikgfCBtX1N0YW5kYXJkVGFibGVbU3RhbmRhcmRdLm1fRVAzXzRfMDsKKwkJc3RhdGUtPm1fUmVnc1tFUDNdICY9IH4weDA0OyAgIC8qIHN3aXRjaCBSRkFHQyB0byBoaWdoIHNwZWVkIG1vZGUgKi8KKworCQkvKiBtX0VQNCBkZWZhdWx0IGZvciBYVG91dE9uLCBDQUxfTW9kZSAoMCkgKi8KKwkJc3RhdGUtPm1fUmVnc1tFUDRdID0gc3RhdGUtPm1fRVA0IHwgKChTdGFuZGFyZCA+IEhGX0FuYWxvZ01heCkgPyBzdGF0ZS0+bV9JRkxldmVsRGlnaXRhbCA6IHN0YXRlLT5tX0lGTGV2ZWxBbmFsb2cpOworCQkvKiBzdGF0ZS0+bV9SZWdzW0VQNF0gPSBzdGF0ZS0+bV9FUDQgfCBzdGF0ZS0+bV9JRkxldmVsRGlnaXRhbDsgKi8KKwkJaWYgKFN0YW5kYXJkIDw9IEhGX0FuYWxvZ01heCkKKwkJCXN0YXRlLT5tX1JlZ3NbRVA0XSA9IHN0YXRlLT5tX0VQNCB8IHN0YXRlLT5tX0lGTGV2ZWxBbmFsb2c7CisJCWVsc2UgaWYgKFN0YW5kYXJkIDw9IEhGX0FUU0MpCisJCQlzdGF0ZS0+bV9SZWdzW0VQNF0gPSBzdGF0ZS0+bV9FUDQgfCBzdGF0ZS0+bV9JRkxldmVsRFZCVDsKKwkJZWxzZSBpZiAoU3RhbmRhcmQgPD0gSEZfRFZCQykKKwkJCXN0YXRlLT5tX1JlZ3NbRVA0XSA9IHN0YXRlLT5tX0VQNCB8IHN0YXRlLT5tX0lGTGV2ZWxEVkJDOworCQllbHNlCisJCQlzdGF0ZS0+bV9SZWdzW0VQNF0gPSBzdGF0ZS0+bV9FUDQgfCBzdGF0ZS0+bV9JRkxldmVsRGlnaXRhbDsKKworCQlpZiAoKFN0YW5kYXJkID09IEhGX0ZNX1JhZGlvKSAmJiBzdGF0ZS0+bV9iRk1JbnB1dCkKKwkJCXN0YXRlLT5tX1JlZ3NbRVA0XSB8PSA4MDsKKworCQlzdGF0ZS0+bV9SZWdzW01QRF0gJj0gfjB4ODA7CisJCWlmIChTdGFuZGFyZCA+IEhGX0FuYWxvZ01heCkKKwkJCXN0YXRlLT5tX1JlZ3NbTVBEXSB8PSAweDgwOyAvKiBBZGQgSUZfbm90Y2ggZm9yIGRpZ2l0YWwgKi8KKworCQlzdGF0ZS0+bV9SZWdzW0VCMjJdID0gbV9TdGFuZGFyZFRhYmxlW1N0YW5kYXJkXS5tX0VCMjI7CisKKwkJLyogTm90ZTogVGhpcyBpcyBtaXNzaW5nIGZyb20gZmxvd2NoYXJ0IGluIFREQTE4MjcxIHNwZWNpZmljYXRpb24gKCAxLjUgTUh6IGN1dG9mZiBmb3IgRk0gKSAqLworCQlpZiAoU3RhbmRhcmQgPT0gSEZfRk1fUmFkaW8pCisJCQlzdGF0ZS0+bV9SZWdzW0VCMjNdIHw9ICAweDA2OyAvKiBGb3JjZUxQX0ZjMl9FbiA9IDEsIExQRmNbMl0gPSAxICovCisJCWVsc2UKKwkJCXN0YXRlLT5tX1JlZ3NbRUIyM10gJj0gfjB4MDY7IC8qIEZvcmNlTFBfRmMyX0VuID0gMCwgTFBGY1syXSA9IDAgKi8KKworCQlzdGF0dXMgPSBVcGRhdGVSZWdzKHN0YXRlLCBFQjIyLCBFQjIzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworCQlzdGF0ZS0+bV9SZWdzW0VQMV0gPSAoc3RhdGUtPm1fUmVnc1tFUDFdICYgfjB4MDcpIHwgMHg0MCB8IEJQX0ZpbHRlcjsgICAvKiBEaXNfUG93ZXJfbGV2ZWwgPSAxLCBGaWx0ZXIgKi8KKwkJc3RhdGUtPm1fUmVnc1tFUDVdID0gKHN0YXRlLT5tX1JlZ3NbRVA1XSAmIH4weDA3KSB8IElSX01lYXM7CisJCXN0YXRlLT5tX1JlZ3NbRVAyXSA9IChSRl9CYW5kIDw8IDUpIHwgR2FpblRhcGVyOworCisJCXN0YXRlLT5tX1JlZ3NbRUIxXSA9IChzdGF0ZS0+bV9SZWdzW0VCMV0gJiB+MHgwNykgfAorCQkJKHN0YXRlLT5tX2JNYXN0ZXIgPyAweDA0IDogMHgwMCk7IC8qIENBTFZDT19Gb3J0TE9uID0gTVMgKi8KKwkJLyogQUdDMV9hbHdheXNfbWFzdGVyID0gMCAqLworCQkvKiBBR0NfZmlyc3RuID0gMCAqLworCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVCMSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisKKwkJaWYgKHN0YXRlLT5tX2JNYXN0ZXIpIHsKKwkJCXN0YXR1cyA9IENhbGNNYWluUExMKHN0YXRlLCBGcmVxdWVuY3kgKyBJbnRlcm1lZGlhdGVGcmVxdWVuY3kpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJYnJlYWs7CisJCQlzdGF0dXMgPSBVcGRhdGVSZWdzKHN0YXRlLCBUTSwgRVA1KTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWJyZWFrOworCQkJc3RhdGUtPm1fUmVnc1tFQjRdIHw9IDB4MjA7ICAgIC8qIExPX2ZvcmNlU3JjZSA9IDEgKi8KKwkJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRUI0KTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWJyZWFrOworCQkJbXNsZWVwKDEpOworCQkJc3RhdGUtPm1fUmVnc1tFQjRdICY9IH4weDIwOyAgIC8qIExPX2ZvcmNlU3JjZSA9IDAgKi8KKwkJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRUI0KTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWJyZWFrOworCQl9IGVsc2UgeworCQkJdTggUG9zdERpdiA9IDA7CisJCQl1OCBEaXY7CisJCQlzdGF0dXMgPSBDYWxjQ2FsUExMKHN0YXRlLCBGcmVxdWVuY3kgKyBJbnRlcm1lZGlhdGVGcmVxdWVuY3kpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJYnJlYWs7CisKKwkJCVNlYXJjaE1hcDMobV9DYWxfUExMX01hcCwgRnJlcXVlbmN5ICsgSW50ZXJtZWRpYXRlRnJlcXVlbmN5LCAmUG9zdERpdiwgJkRpdik7CisJCQlzdGF0ZS0+bV9SZWdzW01QRF0gPSAoc3RhdGUtPm1fUmVnc1tNUERdICYgfjB4N0YpIHwgKFBvc3REaXYgJiAweDc3KTsKKwkJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgTVBEKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWJyZWFrOworCQkJc3RhdHVzID0gVXBkYXRlUmVncyhzdGF0ZSwgVE0sIEVQNSk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlicmVhazsKKworCQkJc3RhdGUtPm1fUmVnc1tFQjddIHw9IDB4MjA7ICAgIC8qIENBTF9mb3JjZVNyY2UgPSAxICovCisJCQlzdGF0dXMgPSBVcGRhdGVSZWcoc3RhdGUsIEVCNyk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlicmVhazsKKwkJCW1zbGVlcCgxKTsKKwkJCXN0YXRlLT5tX1JlZ3NbRUI3XSAmPSB+MHgyMDsgICAvKiBDQUxfZm9yY2VTcmNlID0gMCAqLworCQkJc3RhdHVzID0gVXBkYXRlUmVnKHN0YXRlLCBFQjcpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJYnJlYWs7CisJCX0KKwkJbXNsZWVwKDIwKTsKKwkJaWYgKFN0YW5kYXJkICE9IEhGX0ZNX1JhZGlvKQorCQkJc3RhdGUtPm1fUmVnc1tFUDNdIHw9IDB4MDQ7ICAgIC8qIFJGQUdDIHRvIG5vcm1hbCBtb2RlICovCisJCXN0YXR1cyA9IFVwZGF0ZVJlZyhzdGF0ZSwgRVAzKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworCX0gd2hpbGUgKDApOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgc2xlZXAoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGUgPSBmZS0+dHVuZXJfcHJpdjsKKworCVN0YW5kQnkoc3RhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGluaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVsZWFzZShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSkKK3sKKwlrZnJlZShmZS0+dHVuZXJfcHJpdik7CisJZmUtPnR1bmVyX3ByaXYgPSBOVUxMOworCXJldHVybiAwOworfQorCisvKgorICogQXMgZGVmaW5lZCBvbiBFTiAzMDAgNDI5IEFubmV4IEEgYW5kIG9uIElUVS1UIEouODMgYW5uZXggQSwgdGhlIERWQi1DCisgKiByb2xsLW9mZiBmYWN0b3IgaXMgMC4xNS4KKyAqIEFjY29yZGluZyB3aXRoIHRoZSBzcGVjcywgdGhlIGFtb3VudCBvZiB0aGUgbmVlZGVkIGJhbmR3aXRoIGlzIGdpdmVuIGJ5OgorICoJQncgPSBTeW1ib2xfcmF0ZSAqICgxICsgMC4xNSkKKyAqIEFzIHN1Y2gsIHRoZSBtYXhpbXVtIHN5bWJvbCByYXRlIHN1cHBvcnRlZCBieSA2IE1IeiBpcworICoJbWF4X3N5bWJvbF9yYXRlID0gNiBNSHogLyAxLjE1ID0gNTIxNzM5MSBCYXVkcworICpOT1RFOiBGb3IgSVRVLVQgSi44MyBBbm5leCBDLCB0aGUgcm9sbC1vZmYgZmFjdG9yIGlzIDAuMTMuIFNvOgorICoJbWF4X3N5bWJvbF9yYXRlID0gNiBNSHogLyAxLjEzID0gNTMwOTczNSBCYXVkCisgKglUaGF0IG1lYW5zIHRoYXQgYW4gYWRqdXN0bWVudCBpcyBuZWVkZWQgZm9yIEphcGFuLAorICoJYnV0LCBhcyBjdXJyZW50bHkgRFJYLUsgaXMgaGFyZGNvZGVkIHRvIEFubmV4IEEsIGxldCdzIHN0aWNrCisgKgl3aXRoIDAuMTUgcm9sbC1vZmYgZmFjdG9yLgorICovCisjZGVmaW5lIE1BWF9TWU1CT0xfUkFURV82TUh6CTUyMTczOTEKKworc3RhdGljIGludCBzZXRfcGFyYW1zKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLAorCQkgICAgICBzdHJ1Y3QgZHZiX2Zyb250ZW5kX3BhcmFtZXRlcnMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgdGRhX3N0YXRlICpzdGF0ZSA9IGZlLT50dW5lcl9wcml2OworCWludCBzdGF0dXMgPSAwOworCWludCBTdGFuZGFyZDsKKworCXN0YXRlLT5tX0ZyZXF1ZW5jeSA9IHBhcmFtcy0+ZnJlcXVlbmN5OworCisJaWYgKGZlLT5vcHMuaW5mby50eXBlID09IEZFX09GRE0pCisJCXN3aXRjaCAocGFyYW1zLT51Lm9mZG0uYmFuZHdpZHRoKSB7CisJCWNhc2UgQkFORFdJRFRIXzZfTUhaOgorCQkJU3RhbmRhcmQgPSBIRl9EVkJUXzZNSFo7CisJCQlicmVhazsKKwkJY2FzZSBCQU5EV0lEVEhfN19NSFo6CisJCQlTdGFuZGFyZCA9IEhGX0RWQlRfN01IWjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQljYXNlIEJBTkRXSURUSF84X01IWjoKKwkJCVN0YW5kYXJkID0gSEZfRFZCVF84TUhaOworCQkJYnJlYWs7CisJCX0KKwllbHNlIGlmIChmZS0+b3BzLmluZm8udHlwZSA9PSBGRV9RQU0pIHsKKwkJaWYgKHBhcmFtcy0+dS5xYW0uc3ltYm9sX3JhdGUgPD0gTUFYX1NZTUJPTF9SQVRFXzZNSHopCisJCQlTdGFuZGFyZCA9IEhGX0RWQkNfNk1IWjsKKwkJZWxzZQorCQkJU3RhbmRhcmQgPSBIRl9EVkJDXzhNSFo7CisJfSBlbHNlCisJCXJldHVybiAtRUlOVkFMOworCWRvIHsKKwkJc3RhdHVzID0gUkZUcmFja2luZ0ZpbHRlcnNDb3JyZWN0aW9uKHN0YXRlLCBwYXJhbXMtPmZyZXF1ZW5jeSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IENoYW5uZWxDb25maWd1cmF0aW9uKHN0YXRlLCBwYXJhbXMtPmZyZXF1ZW5jeSwgU3RhbmRhcmQpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCisJCW1zbGVlcChzdGF0ZS0+bV9TZXR0bGluZ1RpbWUpOyAgLyogQWxsb3cgQUdDJ3MgdG8gc2V0dGxlIGRvd24gKi8KKwl9IHdoaWxlICgwKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisjaWYgMAorc3RhdGljIGludCBHZXRTaWduYWxTdHJlbmd0aChzMzIgKnBTaWduYWxTdHJlbmd0aCwgdTMyIFJGQWdjLCB1MzIgSUZBZ2MpCit7CisJaWYgKElGQWdjIDwgNTAwKSB7CisJCS8qIFNjYWxlIHRoaXMgZnJvbSAwIHRvIDUwMDAwICovCisJCSpwU2lnbmFsU3RyZW5ndGggPSBJRkFnYyAqIDEwMDsKKwl9IGVsc2UgeworCQkvKiBTY2FsZSByYW5nZSA1MDAtMTUwMCB0byA1MDAwMC04MDAwMCAqLworCQkqcFNpZ25hbFN0cmVuZ3RoID0gNTAwMDAgKyAoSUZBZ2MgLSA1MDApICogMzA7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBnZXRfZnJlcXVlbmN5KHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKmZyZXF1ZW5jeSkKK3sKKwlzdHJ1Y3QgdGRhX3N0YXRlICpzdGF0ZSA9IGZlLT50dW5lcl9wcml2OworCisJKmZyZXF1ZW5jeSA9IHN0YXRlLT5JRjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfYmFuZHdpZHRoKHN0cnVjdCBkdmJfZnJvbnRlbmQgKmZlLCB1MzIgKmJhbmR3aWR0aCkKK3sKKwkvKiBzdHJ1Y3QgdGRhX3N0YXRlICpzdGF0ZSA9IGZlLT50dW5lcl9wcml2OyAqLworCS8qICpiYW5kd2lkdGggPSBwcml2LT5iYW5kd2lkdGg7ICovCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHN0cnVjdCBkdmJfdHVuZXJfb3BzIHR1bmVyX29wcyA9IHsKKwkuaW5mbyA9IHsKKwkJLm5hbWUgPSAiTlhQIFREQTE4MjcxQzJEIiwKKwkJLmZyZXF1ZW5jeV9taW4gID0gIDQ3MTI1MDAwLAorCQkuZnJlcXVlbmN5X21heCAgPSA4NjUwMDAwMDAsCisJCS5mcmVxdWVuY3lfc3RlcCA9ICAgICA2MjUwMAorCX0sCisJLmluaXQgICAgICAgICAgICAgID0gaW5pdCwKKwkuc2xlZXAgICAgICAgICAgICAgPSBzbGVlcCwKKwkuc2V0X3BhcmFtcyAgICAgICAgPSBzZXRfcGFyYW1zLAorCS5yZWxlYXNlICAgICAgICAgICA9IHJlbGVhc2UsCisJLmdldF9mcmVxdWVuY3kgICAgID0gZ2V0X2ZyZXF1ZW5jeSwKKwkuZ2V0X2JhbmR3aWR0aCAgICAgPSBnZXRfYmFuZHdpZHRoLAorfTsKKworc3RydWN0IGR2Yl9mcm9udGVuZCAqdGRhMTgyNzFjMmRkX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkJIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCB1OCBhZHIpCit7CisJc3RydWN0IHRkYV9zdGF0ZSAqc3RhdGU7CisKKwlzdGF0ZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0ZGFfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN0YXRlKQorCQlyZXR1cm4gTlVMTDsKKworCWZlLT50dW5lcl9wcml2ID0gc3RhdGU7CisJc3RhdGUtPmFkciA9IGFkcjsKKwlzdGF0ZS0+aTJjID0gaTJjOworCW1lbWNweSgmZmUtPm9wcy50dW5lcl9vcHMsICZ0dW5lcl9vcHMsIHNpemVvZihzdHJ1Y3QgZHZiX3R1bmVyX29wcykpOworCXJlc2V0KHN0YXRlKTsKKwlJbml0Q2FsKHN0YXRlKTsKKworCXJldHVybiBmZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHRkYTE4MjcxYzJkZF9hdHRhY2gpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlREQTE4MjcxQzIgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJERCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTE4MjcxYzJkZC5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTE4MjcxYzJkZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzODljNzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9mcm9udGVuZHMvdGRhMTgyNzFjMmRkLmgKQEAgLTAsMCArMSwxNiBAQAorI2lmbmRlZiBfVERBMTgyNzFDMkREX0hfCisjZGVmaW5lIF9UREExODI3MUMyRERfSF8KKyNpZiBkZWZpbmVkKENPTkZJR19EVkJfVERBMTgyNzFDMkREKSB8fCAoZGVmaW5lZChDT05GSUdfRFZCX1REQTE4MjcxQzJERF9NT0RVTEUpIFwKKyAgICAgICAgJiYgZGVmaW5lZChNT0RVTEUpKQorc3RydWN0IGR2Yl9mcm9udGVuZCAqdGRhMTgyNzFjMmRkX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkJIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCB1OCBhZHIpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGR2Yl9mcm9udGVuZCAqdGRhMTgyNzFjMmRkX2F0dGFjaChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKKwkJCQkJIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjLCB1OCBhZHIpCit7CisgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBkcml2ZXIgZGlzYWJsZWQgYnkgS2NvbmZpZ1xuIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExODI3MWMyZGRfbWFwcy5oIGIvZHJpdmVycy9tZWRpYS9kdmIvZnJvbnRlbmRzL3RkYTE4MjcxYzJkZF9tYXBzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg3NjYxYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL2Zyb250ZW5kcy90ZGExODI3MWMyZGRfbWFwcy5oCkBAIC0wLDAgKzEsODE0IEBACitlbnVtIEhGX1MgeworCUhGX05vbmUgPSAwLCBIRl9CLCBIRl9ESywgSEZfRywgSEZfSSwgSEZfTCwgSEZfTDEsIEhGX01OLCBIRl9GTV9SYWRpbywKKwlIRl9BbmFsb2dNYXgsIEhGX0RWQlRfNk1IWiwgSEZfRFZCVF83TUhaLCBIRl9EVkJUXzhNSFosCisJSEZfRFZCVCwgSEZfQVRTQywgIEhGX0RWQkNfNk1IWiwgIEhGX0RWQkNfN01IWiwKKwlIRl9EVkJDXzhNSFosIEhGX0RWQkMKK307CisKK3N0cnVjdCBTU3RhbmRhcmRQYXJhbSBtX1N0YW5kYXJkVGFibGVbXSA9IHsKKwl7ICAgICAgIDAsICAgICAgICAwLCAweDAwLCAweDAwIH0sICAgIC8qIEhGX05vbmUgKi8KKwl7IDYwMDAwMDAsICA3MDAwMDAwLCAweDFELCAweDJDIH0sICAgIC8qIEhGX0IsICovCisJeyA2OTAwMDAwLCAgODAwMDAwMCwgMHgxRSwgMHgyQyB9LCAgICAvKiBIRl9ESywgKi8KKwl7IDcxMDAwMDAsICA4MDAwMDAwLCAweDFFLCAweDJDIH0sICAgIC8qIEhGX0csICovCisJeyA3MjUwMDAwLCAgODAwMDAwMCwgMHgxRSwgMHgyQyB9LCAgICAvKiBIRl9JLCAqLworCXsgNjkwMDAwMCwgIDgwMDAwMDAsIDB4MUUsIDB4MkMgfSwgICAgLyogSEZfTCwgKi8KKwl7IDEyNTAwMDAsICA4MDAwMDAwLCAweDFFLCAweDJDIH0sICAgIC8qIEhGX0wxLCAqLworCXsgNTQwMDAwMCwgIDYwMDAwMDAsIDB4MUMsIDB4MkMgfSwgICAgLyogSEZfTU4sICovCisJeyAxMjUwMDAwLCAgIDUwMDAwMCwgMHgxOCwgMHgyQyB9LCAgICAvKiBIRl9GTV9SYWRpbywgKi8KKwl7ICAgICAgIDAsICAgICAgICAwLCAweDAwLCAweDAwIH0sICAgIC8qIEhGX0FuYWxvZ01heCAoVW51c2VkKSAqLworCXsgMzMwMDAwMCwgIDYwMDAwMDAsIDB4MUMsIDB4NTggfSwgICAgLyogSEZfRFZCVF82TUhaICovCisJeyAzNTAwMDAwLCAgNzAwMDAwMCwgMHgxQywgMHgzNyB9LCAgICAvKiBIRl9EVkJUXzdNSFogKi8KKwl7IDQwMDAwMDAsICA4MDAwMDAwLCAweDFELCAweDM3IH0sICAgIC8qIEhGX0RWQlRfOE1IWiAqLworCXsgICAgICAgMCwgICAgICAgIDAsIDB4MDAsIDB4MDAgfSwgICAgLyogSEZfRFZCVCAoVW51c2VkKSAqLworCXsgNTAwMDAwMCwgIDYwMDAwMDAsIDB4MUMsIDB4MzcgfSwgICAgLyogSEZfQVRTQyAgKGNlbnRlciA9IDMuMjUgTUh6KSAqLworCXsgNDAwMDAwMCwgIDYwMDAwMDAsIDB4MUQsIDB4NTggfSwgICAgLyogSEZfRFZCQ182TUhaIChDaGljYWdvKSAqLworCXsgNDUwMDAwMCwgIDcwMDAwMDAsIDB4MUUsIDB4MzcgfSwgICAgLyogSEZfRFZCQ183TUhaIChub3QgZG9jdW1lbnRlZCBieSBOWFApICovCisJeyA1MDAwMDAwLCAgODAwMDAwMCwgMHgxRiwgMHgzNyB9LCAgICAvKiBIRl9EVkJDXzhNSFogKi8KKwl7ICAgICAgIDAsICAgICAgICAwLCAweDAwLCAweDAwIH0sICAgIC8qIEhGX0RWQkMgKFVudXNlZCkgKi8KK307CisKK3N0cnVjdCBTTWFwICBtX0JQX0ZpbHRlcl9NYXBbXSA9IHsKKwl7ICAgNjIwMDAwMDAsICAweDAwIH0sCisJeyAgIDg0MDAwMDAwLCAgMHgwMSB9LAorCXsgIDEwMDAwMDAwMCwgIDB4MDIgfSwKKwl7ICAxNDAwMDAwMDAsICAweDAzIH0sCisJeyAgMTcwMDAwMDAwLCAgMHgwNCB9LAorCXsgIDE4MDAwMDAwMCwgIDB4MDUgfSwKKwl7ICA4NjUwMDAwMDAsICAweDA2IH0sCisJeyAgICAgICAgICAwLCAgMHgwMCB9LCAgICAvKiBUYWJsZSBFbmQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgU01hcEkgbV9SRl9DYWxfTWFwW10gPSB7CisJeyAgIDQxMDAwMDAwLCAgMHgwRiB9LAorCXsgICA0MzAwMDAwMCwgIDB4MUMgfSwKKwl7ICAgNDUwMDAwMDAsICAweDJGIH0sCisJeyAgIDQ2MDAwMDAwLCAgMHgzOSB9LAorCXsgICA0NzAwMDAwMCwgIDB4NDAgfSwKKwl7ICAgNDc5MDAwMDAsICAweDUwIH0sCisJeyAgIDQ5MTAwMDAwLCAgMHgxNiB9LAorCXsgICA1MDAwMDAwMCwgIDB4MTggfSwKKwl7ICAgNTEwMDAwMDAsICAweDIwIH0sCisJeyAgIDUzMDAwMDAwLCAgMHgyOCB9LAorCXsgICA1NTAwMDAwMCwgIDB4MkIgfSwKKwl7ICAgNTYwMDAwMDAsICAweDMyIH0sCisJeyAgIDU3MDAwMDAwLCAgMHgzNSB9LAorCXsgICA1ODAwMDAwMCwgIDB4M0UgfSwKKwl7ICAgNTkwMDAwMDAsICAweDQzIH0sCisJeyAgIDYwMDAwMDAwLCAgMHg0RSB9LAorCXsgICA2MTEwMDAwMCwgIDB4NTUgfSwKKwl7ICAgNjMwMDAwMDAsICAweDBGIH0sCisJeyAgIDY0MDAwMDAwLCAgMHgxMSB9LAorCXsgICA2NTAwMDAwMCwgIDB4MTIgfSwKKwl7ICAgNjYwMDAwMDAsICAweDE1IH0sCisJeyAgIDY3MDAwMDAwLCAgMHgxNiB9LAorCXsgICA2ODAwMDAwMCwgIDB4MTcgfSwKKwl7ICAgNzAwMDAwMDAsICAweDE5IH0sCisJeyAgIDcxMDAwMDAwLCAgMHgxQyB9LAorCXsgICA3MjAwMDAwMCwgIDB4MUQgfSwKKwl7ICAgNzMwMDAwMDAsICAweDFGIH0sCisJeyAgIDc0MDAwMDAwLCAgMHgyMCB9LAorCXsgICA3NTAwMDAwMCwgIDB4MjEgfSwKKwl7ICAgNzYwMDAwMDAsICAweDI0IH0sCisJeyAgIDc3MDAwMDAwLCAgMHgyNSB9LAorCXsgICA3ODAwMDAwMCwgIDB4MjcgfSwKKwl7ICAgODAwMDAwMDAsICAweDI4IH0sCisJeyAgIDgxMDAwMDAwLCAgMHgyOSB9LAorCXsgICA4MjAwMDAwMCwgIDB4MkQgfSwKKwl7ICAgODMwMDAwMDAsICAweDJFIH0sCisJeyAgIDg0MDAwMDAwLCAgMHgyRiB9LAorCXsgICA4NTAwMDAwMCwgIDB4MzEgfSwKKwl7ICAgODYwMDAwMDAsICAweDMzIH0sCisJeyAgIDg3MDAwMDAwLCAgMHgzNCB9LAorCXsgICA4ODAwMDAwMCwgIDB4MzUgfSwKKwl7ICAgODkwMDAwMDAsICAweDM3IH0sCisJeyAgIDkwMDAwMDAwLCAgMHgzOCB9LAorCXsgICA5MTAwMDAwMCwgIDB4MzkgfSwKKwl7ICAgOTMwMDAwMDAsICAweDNDIH0sCisJeyAgIDk0MDAwMDAwLCAgMHgzRSB9LAorCXsgICA5NTAwMDAwMCwgIDB4M0YgfSwKKwl7ICAgOTYwMDAwMDAsICAweDQwIH0sCisJeyAgIDk3MDAwMDAwLCAgMHg0MiB9LAorCXsgICA5OTAwMDAwMCwgIDB4NDUgfSwKKwl7ICAxMDAwMDAwMDAsICAweDQ2IH0sCisJeyAgMTAyMDAwMDAwLCAgMHg0OCB9LAorCXsgIDEwMzAwMDAwMCwgIDB4NEEgfSwKKwl7ICAxMDUwMDAwMDAsICAweDREIH0sCisJeyAgMTA2MDAwMDAwLCAgMHg0RSB9LAorCXsgIDEwNzAwMDAwMCwgIDB4NTAgfSwKKwl7ICAxMDgwMDAwMDAsICAweDUxIH0sCisJeyAgMTEwMDAwMDAwLCAgMHg1NCB9LAorCXsgIDExMTAwMDAwMCwgIDB4NTYgfSwKKwl7ICAxMTIwMDAwMDAsICAweDU3IH0sCisJeyAgMTEzMDAwMDAwLCAgMHg1OCB9LAorCXsgIDExNDAwMDAwMCwgIDB4NTkgfSwKKwl7ICAxMTUwMDAwMDAsICAweDVDIH0sCisJeyAgMTE2MDAwMDAwLCAgMHg1RCB9LAorCXsgIDExNzAwMDAwMCwgIDB4NUYgfSwKKwl7ICAxMTkwMDAwMDAsICAweDYwIH0sCisJeyAgMTIwMDAwMDAwLCAgMHg2NCB9LAorCXsgIDEyMTAwMDAwMCwgIDB4NjUgfSwKKwl7ICAxMjIwMDAwMDAsICAweDY2IH0sCisJeyAgMTIzMDAwMDAwLCAgMHg2OCB9LAorCXsgIDEyNDAwMDAwMCwgIDB4NjkgfSwKKwl7ICAxMjUwMDAwMDAsICAweDZDIH0sCisJeyAgMTI2MDAwMDAwLCAgMHg2RCB9LAorCXsgIDEyNzAwMDAwMCwgIDB4NkUgfSwKKwl7ICAxMjgwMDAwMDAsICAweDcwIH0sCisJeyAgMTI5MDAwMDAwLCAgMHg3MSB9LAorCXsgIDEzMDAwMDAwMCwgIDB4NzUgfSwKKwl7ICAxMzEwMDAwMDAsICAweDc3IH0sCisJeyAgMTMyMDAwMDAwLCAgMHg3OCB9LAorCXsgIDEzMzAwMDAwMCwgIDB4N0IgfSwKKwl7ICAxMzQwMDAwMDAsICAweDdFIH0sCisJeyAgMTM1MDAwMDAwLCAgMHg4MSB9LAorCXsgIDEzNjAwMDAwMCwgIDB4ODIgfSwKKwl7ICAxMzcwMDAwMDAsICAweDg3IH0sCisJeyAgMTM4MDAwMDAwLCAgMHg4OCB9LAorCXsgIDEzOTAwMDAwMCwgIDB4OEQgfSwKKwl7ICAxNDAwMDAwMDAsICAweDhFIH0sCisJeyAgMTQxMDAwMDAwLCAgMHg5MSB9LAorCXsgIDE0MjAwMDAwMCwgIDB4OTUgfSwKKwl7ICAxNDMwMDAwMDAsICAweDlBIH0sCisJeyAgMTQ0MDAwMDAwLCAgMHg5RCB9LAorCXsgIDE0NTAwMDAwMCwgIDB4QTEgfSwKKwl7ICAxNDYwMDAwMDAsICAweEEyIH0sCisJeyAgMTQ3MDAwMDAwLCAgMHhBNCB9LAorCXsgIDE0ODAwMDAwMCwgIDB4QTkgfSwKKwl7ICAxNDkwMDAwMDAsICAweEFFIH0sCisJeyAgMTUwMDAwMDAwLCAgMHhCMCB9LAorCXsgIDE1MTAwMDAwMCwgIDB4QjEgfSwKKwl7ICAxNTIwMDAwMDAsICAweEI3IH0sCisJeyAgMTUyNjAwMDAwLCAgMHhCRCB9LAorCXsgIDE1NDAwMDAwMCwgIDB4MjAgfSwKKwl7ICAxNTUwMDAwMDAsICAweDIyIH0sCisJeyAgMTU2MDAwMDAwLCAgMHgyNCB9LAorCXsgIDE1NzAwMDAwMCwgIDB4MjUgfSwKKwl7ICAxNTgwMDAwMDAsICAweDI3IH0sCisJeyAgMTU5MDAwMDAwLCAgMHgyOSB9LAorCXsgIDE2MDAwMDAwMCwgIDB4MkMgfSwKKwl7ICAxNjEwMDAwMDAsICAweDJEIH0sCisJeyAgMTYzMDAwMDAwLCAgMHgyRSB9LAorCXsgIDE2NDAwMDAwMCwgIDB4MkYgfSwKKwl7ICAxNjQ3MDAwMDAsICAweDMwIH0sCisJeyAgMTY2MDAwMDAwLCAgMHgxMSB9LAorCXsgIDE2NzAwMDAwMCwgIDB4MTIgfSwKKwl7ICAxNjgwMDAwMDAsICAweDEzIH0sCisJeyAgMTY5MDAwMDAwLCAgMHgxNCB9LAorCXsgIDE3MDAwMDAwMCwgIDB4MTUgfSwKKwl7ICAxNzIwMDAwMDAsICAweDE2IH0sCisJeyAgMTczMDAwMDAwLCAgMHgxNyB9LAorCXsgIDE3NDAwMDAwMCwgIDB4MTggfSwKKwl7ICAxNzUwMDAwMDAsICAweDFBIH0sCisJeyAgMTc2MDAwMDAwLCAgMHgxQiB9LAorCXsgIDE3ODAwMDAwMCwgIDB4MUQgfSwKKwl7ICAxNzkwMDAwMDAsICAweDFFIH0sCisJeyAgMTgwMDAwMDAwLCAgMHgxRiB9LAorCXsgIDE4MTAwMDAwMCwgIDB4MjAgfSwKKwl7ICAxODIwMDAwMDAsICAweDIxIH0sCisJeyAgMTgzMDAwMDAwLCAgMHgyMiB9LAorCXsgIDE4NDAwMDAwMCwgIDB4MjQgfSwKKwl7ICAxODUwMDAwMDAsICAweDI1IH0sCisJeyAgMTg2MDAwMDAwLCAgMHgyNiB9LAorCXsgIDE4NzAwMDAwMCwgIDB4MjcgfSwKKwl7ICAxODgwMDAwMDAsICAweDI5IH0sCisJeyAgMTg5MDAwMDAwLCAgMHgyQSB9LAorCXsgIDE5MDAwMDAwMCwgIDB4MkMgfSwKKwl7ICAxOTEwMDAwMDAsICAweDJEIH0sCisJeyAgMTkyMDAwMDAwLCAgMHgyRSB9LAorCXsgIDE5MzAwMDAwMCwgIDB4MkYgfSwKKwl7ICAxOTQwMDAwMDAsICAweDMwIH0sCisJeyAgMTk1MDAwMDAwLCAgMHgzMyB9LAorCXsgIDE5NjAwMDAwMCwgIDB4MzUgfSwKKwl7ICAxOTgwMDAwMDAsICAweDM2IH0sCisJeyAgMjAwMDAwMDAwLCAgMHgzOCB9LAorCXsgIDIwMTAwMDAwMCwgIDB4M0MgfSwKKwl7ICAyMDIwMDAwMDAsICAweDNEIH0sCisJeyAgMjAzNTAwMDAwLCAgMHgzRSB9LAorCXsgIDIwNjAwMDAwMCwgIDB4MEUgfSwKKwl7ICAyMDgwMDAwMDAsICAweDBGIH0sCisJeyAgMjEyMDAwMDAwLCAgMHgxMCB9LAorCXsgIDIxNjAwMDAwMCwgIDB4MTEgfSwKKwl7ICAyMTcwMDAwMDAsICAweDEyIH0sCisJeyAgMjE4MDAwMDAwLCAgMHgxMyB9LAorCXsgIDIyMDAwMDAwMCwgIDB4MTQgfSwKKwl7ICAyMjIwMDAwMDAsICAweDE1IH0sCisJeyAgMjI1MDAwMDAwLCAgMHgxNiB9LAorCXsgIDIyODAwMDAwMCwgIDB4MTcgfSwKKwl7ICAyMzEwMDAwMDAsICAweDE4IH0sCisJeyAgMjM0MDAwMDAwLCAgMHgxOSB9LAorCXsgIDIzNTAwMDAwMCwgIDB4MUEgfSwKKwl7ICAyMzYwMDAwMDAsICAweDFCIH0sCisJeyAgMjM3MDAwMDAwLCAgMHgxQyB9LAorCXsgIDI0MDAwMDAwMCwgIDB4MUQgfSwKKwl7ICAyNDIwMDAwMDAsICAweDFFIH0sCisJeyAgMjQ0MDAwMDAwLCAgMHgxRiB9LAorCXsgIDI0NzAwMDAwMCwgIDB4MjAgfSwKKwl7ICAyNDkwMDAwMDAsICAweDIxIH0sCisJeyAgMjUyMDAwMDAwLCAgMHgyMiB9LAorCXsgIDI1MzAwMDAwMCwgIDB4MjMgfSwKKwl7ICAyNTQwMDAwMDAsICAweDI0IH0sCisJeyAgMjU2MDAwMDAwLCAgMHgyNSB9LAorCXsgIDI1OTAwMDAwMCwgIDB4MjYgfSwKKwl7ICAyNjIwMDAwMDAsICAweDI3IH0sCisJeyAgMjY0MDAwMDAwLCAgMHgyOCB9LAorCXsgIDI2NzAwMDAwMCwgIDB4MjkgfSwKKwl7ICAyNjkwMDAwMDAsICAweDJBIH0sCisJeyAgMjcxMDAwMDAwLCAgMHgyQiB9LAorCXsgIDI3MzAwMDAwMCwgIDB4MkMgfSwKKwl7ICAyNzUwMDAwMDAsICAweDJEIH0sCisJeyAgMjc3MDAwMDAwLCAgMHgyRSB9LAorCXsgIDI3OTAwMDAwMCwgIDB4MkYgfSwKKwl7ICAyODIwMDAwMDAsICAweDMwIH0sCisJeyAgMjg0MDAwMDAwLCAgMHgzMSB9LAorCXsgIDI4NjAwMDAwMCwgIDB4MzIgfSwKKwl7ICAyODcwMDAwMDAsICAweDMzIH0sCisJeyAgMjkwMDAwMDAwLCAgMHgzNCB9LAorCXsgIDI5MzAwMDAwMCwgIDB4MzUgfSwKKwl7ICAyOTUwMDAwMDAsICAweDM2IH0sCisJeyAgMjk3MDAwMDAwLCAgMHgzNyB9LAorCXsgIDMwMDAwMDAwMCwgIDB4MzggfSwKKwl7ICAzMDMwMDAwMDAsICAweDM5IH0sCisJeyAgMzA1MDAwMDAwLCAgMHgzQSB9LAorCXsgIDMwNjAwMDAwMCwgIDB4M0IgfSwKKwl7ICAzMDcwMDAwMDAsICAweDNDIH0sCisJeyAgMzEwMDAwMDAwLCAgMHgzRCB9LAorCXsgIDMxMjAwMDAwMCwgIDB4M0UgfSwKKwl7ICAzMTUwMDAwMDAsICAweDNGIH0sCisJeyAgMzE4MDAwMDAwLCAgMHg0MCB9LAorCXsgIDMyMDAwMDAwMCwgIDB4NDEgfSwKKwl7ICAzMjMwMDAwMDAsICAweDQyIH0sCisJeyAgMzI0MDAwMDAwLCAgMHg0MyB9LAorCXsgIDMyNTAwMDAwMCwgIDB4NDQgfSwKKwl7ICAzMjcwMDAwMDAsICAweDQ1IH0sCisJeyAgMzMxMDAwMDAwLCAgMHg0NiB9LAorCXsgIDMzNDAwMDAwMCwgIDB4NDcgfSwKKwl7ICAzMzcwMDAwMDAsICAweDQ4IH0sCisJeyAgMzM5MDAwMDAwLCAgMHg0OSB9LAorCXsgIDM0MDAwMDAwMCwgIDB4NEEgfSwKKwl7ICAzNDEwMDAwMDAsICAweDRCIH0sCisJeyAgMzQzMDAwMDAwLCAgMHg0QyB9LAorCXsgIDM0NTAwMDAwMCwgIDB4NEQgfSwKKwl7ICAzNDkwMDAwMDAsICAweDRFIH0sCisJeyAgMzUyMDAwMDAwLCAgMHg0RiB9LAorCXsgIDM1MzAwMDAwMCwgIDB4NTAgfSwKKwl7ICAzNTUwMDAwMDAsICAweDUxIH0sCisJeyAgMzU3MDAwMDAwLCAgMHg1MiB9LAorCXsgIDM1OTAwMDAwMCwgIDB4NTMgfSwKKwl7ICAzNjEwMDAwMDAsICAweDU0IH0sCisJeyAgMzYyMDAwMDAwLCAgMHg1NSB9LAorCXsgIDM2NDAwMDAwMCwgIDB4NTYgfSwKKwl7ICAzNjgwMDAwMDAsICAweDU3IH0sCisJeyAgMzcwMDAwMDAwLCAgMHg1OCB9LAorCXsgIDM3MjAwMDAwMCwgIDB4NTkgfSwKKwl7ICAzNzUwMDAwMDAsICAweDVBIH0sCisJeyAgMzc2MDAwMDAwLCAgMHg1QiB9LAorCXsgIDM3NzAwMDAwMCwgIDB4NUMgfSwKKwl7ICAzNzkwMDAwMDAsICAweDVEIH0sCisJeyAgMzgyMDAwMDAwLCAgMHg1RSB9LAorCXsgIDM4NDAwMDAwMCwgIDB4NUYgfSwKKwl7ICAzODUwMDAwMDAsICAweDYwIH0sCisJeyAgMzg2MDAwMDAwLCAgMHg2MSB9LAorCXsgIDM4ODAwMDAwMCwgIDB4NjIgfSwKKwl7ICAzOTAwMDAwMDAsICAweDYzIH0sCisJeyAgMzkzMDAwMDAwLCAgMHg2NCB9LAorCXsgIDM5NDAwMDAwMCwgIDB4NjUgfSwKKwl7ICAzOTYwMDAwMDAsICAweDY2IH0sCisJeyAgMzk3MDAwMDAwLCAgMHg2NyB9LAorCXsgIDM5ODAwMDAwMCwgIDB4NjggfSwKKwl7ICA0MDAwMDAwMDAsICAweDY5IH0sCisJeyAgNDAyMDAwMDAwLCAgMHg2QSB9LAorCXsgIDQwMzAwMDAwMCwgIDB4NkIgfSwKKwl7ICA0MDcwMDAwMDAsICAweDZDIH0sCisJeyAgNDA4MDAwMDAwLCAgMHg2RCB9LAorCXsgIDQwOTAwMDAwMCwgIDB4NkUgfSwKKwl7ICA0MTAwMDAwMDAsICAweDZGIH0sCisJeyAgNDExMDAwMDAwLCAgMHg3MCB9LAorCXsgIDQxMjAwMDAwMCwgIDB4NzEgfSwKKwl7ICA0MTMwMDAwMDAsICAweDcyIH0sCisJeyAgNDE0MDAwMDAwLCAgMHg3MyB9LAorCXsgIDQxNzAwMDAwMCwgIDB4NzQgfSwKKwl7ICA0MTgwMDAwMDAsICAweDc1IH0sCisJeyAgNDIwMDAwMDAwLCAgMHg3NiB9LAorCXsgIDQyMjAwMDAwMCwgIDB4NzcgfSwKKwl7ICA0MjMwMDAwMDAsICAweDc4IH0sCisJeyAgNDI0MDAwMDAwLCAgMHg3OSB9LAorCXsgIDQyNzAwMDAwMCwgIDB4N0EgfSwKKwl7ICA0MjgwMDAwMDAsICAweDdCIH0sCisJeyAgNDI5MDAwMDAwLCAgMHg3RCB9LAorCXsgIDQzMjAwMDAwMCwgIDB4N0YgfSwKKwl7ICA0MzQwMDAwMDAsICAweDgwIH0sCisJeyAgNDM1MDAwMDAwLCAgMHg4MSB9LAorCXsgIDQzNjAwMDAwMCwgIDB4ODMgfSwKKwl7ICA0MzcwMDAwMDAsICAweDg0IH0sCisJeyAgNDM4MDAwMDAwLCAgMHg4NSB9LAorCXsgIDQzOTAwMDAwMCwgIDB4ODYgfSwKKwl7ICA0NDAwMDAwMDAsICAweDg3IH0sCisJeyAgNDQxMDAwMDAwLCAgMHg4OCB9LAorCXsgIDQ0MjAwMDAwMCwgIDB4ODkgfSwKKwl7ICA0NDUwMDAwMDAsICAweDhBIH0sCisJeyAgNDQ2MDAwMDAwLCAgMHg4QiB9LAorCXsgIDQ0NzAwMDAwMCwgIDB4OEMgfSwKKwl7ICA0NDgwMDAwMDAsICAweDhFIH0sCisJeyAgNDQ5MDAwMDAwLCAgMHg4RiB9LAorCXsgIDQ1MDAwMDAwMCwgIDB4OTAgfSwKKwl7ICA0NTIwMDAwMDAsICAweDkxIH0sCisJeyAgNDUzMDAwMDAwLCAgMHg5MyB9LAorCXsgIDQ1NDAwMDAwMCwgIDB4OTQgfSwKKwl7ICA0NTYwMDAwMDAsICAweDk2IH0sCisJeyAgNDU3ODAwMDAwLCAgMHg5OCB9LAorCXsgIDQ2MTAwMDAwMCwgIDB4MTEgfSwKKwl7ICA0NjgwMDAwMDAsICAweDEyIH0sCisJeyAgNDcyMDAwMDAwLCAgMHgxMyB9LAorCXsgIDQ3MzAwMDAwMCwgIDB4MTQgfSwKKwl7ICA0NzQwMDAwMDAsICAweDE1IH0sCisJeyAgNDgxMDAwMDAwLCAgMHgxNiB9LAorCXsgIDQ4NjAwMDAwMCwgIDB4MTcgfSwKKwl7ICA0OTEwMDAwMDAsICAweDE4IH0sCisJeyAgNDk4MDAwMDAwLCAgMHgxOSB9LAorCXsgIDQ5OTAwMDAwMCwgIDB4MUEgfSwKKwl7ICA1MDEwMDAwMDAsICAweDFCIH0sCisJeyAgNTA2MDAwMDAwLCAgMHgxQyB9LAorCXsgIDUxMTAwMDAwMCwgIDB4MUQgfSwKKwl7ICA1MTYwMDAwMDAsICAweDFFIH0sCisJeyAgNTIwMDAwMDAwLCAgMHgxRiB9LAorCXsgIDUyMTAwMDAwMCwgIDB4MjAgfSwKKwl7ICA1MjUwMDAwMDAsICAweDIxIH0sCisJeyAgNTI5MDAwMDAwLCAgMHgyMiB9LAorCXsgIDUzMzAwMDAwMCwgIDB4MjMgfSwKKwl7ICA1MzkwMDAwMDAsICAweDI0IH0sCisJeyAgNTQxMDAwMDAwLCAgMHgyNSB9LAorCXsgIDU0NzAwMDAwMCwgIDB4MjYgfSwKKwl7ICA1NDkwMDAwMDAsICAweDI3IH0sCisJeyAgNTUxMDAwMDAwLCAgMHgyOCB9LAorCXsgIDU1NjAwMDAwMCwgIDB4MjkgfSwKKwl7ICA1NjEwMDAwMDAsICAweDJBIH0sCisJeyAgNTYzMDAwMDAwLCAgMHgyQiB9LAorCXsgIDU2NTAwMDAwMCwgIDB4MkMgfSwKKwl7ICA1NjkwMDAwMDAsICAweDJEIH0sCisJeyAgNTcxMDAwMDAwLCAgMHgyRSB9LAorCXsgIDU3NzAwMDAwMCwgIDB4MkYgfSwKKwl7ICA1ODAwMDAwMDAsICAweDMwIH0sCisJeyAgNTgyMDAwMDAwLCAgMHgzMSB9LAorCXsgIDU4NDAwMDAwMCwgIDB4MzIgfSwKKwl7ICA1ODgwMDAwMDAsICAweDMzIH0sCisJeyAgNTkxMDAwMDAwLCAgMHgzNCB9LAorCXsgIDU5NjAwMDAwMCwgIDB4MzUgfSwKKwl7ICA1OTgwMDAwMDAsICAweDM2IH0sCisJeyAgNjAzMDAwMDAwLCAgMHgzNyB9LAorCXsgIDYwNDAwMDAwMCwgIDB4MzggfSwKKwl7ICA2MDYwMDAwMDAsICAweDM5IH0sCisJeyAgNjEyMDAwMDAwLCAgMHgzQSB9LAorCXsgIDYxNTAwMDAwMCwgIDB4M0IgfSwKKwl7ICA2MTcwMDAwMDAsICAweDNDIH0sCisJeyAgNjIxMDAwMDAwLCAgMHgzRCB9LAorCXsgIDYyMjAwMDAwMCwgIDB4M0UgfSwKKwl7ICA2MjUwMDAwMDAsICAweDNGIH0sCisJeyAgNjMyMDAwMDAwLCAgMHg0MCB9LAorCXsgIDYzMzAwMDAwMCwgIDB4NDEgfSwKKwl7ICA2MzQwMDAwMDAsICAweDQyIH0sCisJeyAgNjQyMDAwMDAwLCAgMHg0MyB9LAorCXsgIDY0MzAwMDAwMCwgIDB4NDQgfSwKKwl7ICA2NDcwMDAwMDAsICAweDQ1IH0sCisJeyAgNjUwMDAwMDAwLCAgMHg0NiB9LAorCXsgIDY1MjAwMDAwMCwgIDB4NDcgfSwKKwl7ICA2NTcwMDAwMDAsICAweDQ4IH0sCisJeyAgNjYxMDAwMDAwLCAgMHg0OSB9LAorCXsgIDY2MjAwMDAwMCwgIDB4NEEgfSwKKwl7ICA2NjUwMDAwMDAsICAweDRCIH0sCisJeyAgNjY3MDAwMDAwLCAgMHg0QyB9LAorCXsgIDY3MDAwMDAwMCwgIDB4NEQgfSwKKwl7ICA2NzMwMDAwMDAsICAweDRFIH0sCisJeyAgNjc2MDAwMDAwLCAgMHg0RiB9LAorCXsgIDY3NzAwMDAwMCwgIDB4NTAgfSwKKwl7ICA2ODEwMDAwMDAsICAweDUxIH0sCisJeyAgNjgzMDAwMDAwLCAgMHg1MiB9LAorCXsgIDY4NjAwMDAwMCwgIDB4NTMgfSwKKwl7ICA2ODgwMDAwMDAsICAweDU0IH0sCisJeyAgNjg5MDAwMDAwLCAgMHg1NSB9LAorCXsgIDY5MTAwMDAwMCwgIDB4NTYgfSwKKwl7ICA2OTUwMDAwMDAsICAweDU3IH0sCisJeyAgNjk4MDAwMDAwLCAgMHg1OCB9LAorCXsgIDcwMzAwMDAwMCwgIDB4NTkgfSwKKwl7ICA3MDQwMDAwMDAsICAweDVBIH0sCisJeyAgNzA1MDAwMDAwLCAgMHg1QiB9LAorCXsgIDcwNzAwMDAwMCwgIDB4NUMgfSwKKwl7ICA3MTAwMDAwMDAsICAweDVEIH0sCisJeyAgNzEyMDAwMDAwLCAgMHg1RSB9LAorCXsgIDcxNzAwMDAwMCwgIDB4NUYgfSwKKwl7ICA3MTgwMDAwMDAsICAweDYwIH0sCisJeyAgNzIxMDAwMDAwLCAgMHg2MSB9LAorCXsgIDcyMjAwMDAwMCwgIDB4NjIgfSwKKwl7ICA3MjMwMDAwMDAsICAweDYzIH0sCisJeyAgNzI1MDAwMDAwLCAgMHg2NCB9LAorCXsgIDcyNzAwMDAwMCwgIDB4NjUgfSwKKwl7ICA3MzAwMDAwMDAsICAweDY2IH0sCisJeyAgNzMyMDAwMDAwLCAgMHg2NyB9LAorCXsgIDczNTAwMDAwMCwgIDB4NjggfSwKKwl7ICA3NDAwMDAwMDAsICAweDY5IH0sCisJeyAgNzQxMDAwMDAwLCAgMHg2QSB9LAorCXsgIDc0MjAwMDAwMCwgIDB4NkIgfSwKKwl7ICA3NDMwMDAwMDAsICAweDZDIH0sCisJeyAgNzQ1MDAwMDAwLCAgMHg2RCB9LAorCXsgIDc0NzAwMDAwMCwgIDB4NkUgfSwKKwl7ICA3NDgwMDAwMDAsICAweDZGIH0sCisJeyAgNzUwMDAwMDAwLCAgMHg3MCB9LAorCXsgIDc1MjAwMDAwMCwgIDB4NzEgfSwKKwl7ICA3NTQwMDAwMDAsICAweDcyIH0sCisJeyAgNzU3MDAwMDAwLCAgMHg3MyB9LAorCXsgIDc1ODAwMDAwMCwgIDB4NzQgfSwKKwl7ICA3NjAwMDAwMDAsICAweDc1IH0sCisJeyAgNzYzMDAwMDAwLCAgMHg3NiB9LAorCXsgIDc2NDAwMDAwMCwgIDB4NzcgfSwKKwl7ICA3NjYwMDAwMDAsICAweDc4IH0sCisJeyAgNzY3MDAwMDAwLCAgMHg3OSB9LAorCXsgIDc2ODAwMDAwMCwgIDB4N0EgfSwKKwl7ICA3NzMwMDAwMDAsICAweDdCIH0sCisJeyAgNzc0MDAwMDAwLCAgMHg3QyB9LAorCXsgIDc3NjAwMDAwMCwgIDB4N0QgfSwKKwl7ICA3NzcwMDAwMDAsICAweDdFIH0sCisJeyAgNzc4MDAwMDAwLCAgMHg3RiB9LAorCXsgIDc3OTAwMDAwMCwgIDB4ODAgfSwKKwl7ICA3ODEwMDAwMDAsICAweDgxIH0sCisJeyAgNzgzMDAwMDAwLCAgMHg4MiB9LAorCXsgIDc4NDAwMDAwMCwgIDB4ODMgfSwKKwl7ICA3ODUwMDAwMDAsICAweDg0IH0sCisJeyAgNzg2MDAwMDAwLCAgMHg4NSB9LAorCXsgIDc5MzAwMDAwMCwgIDB4ODYgfSwKKwl7ICA3OTQwMDAwMDAsICAweDg3IH0sCisJeyAgNzk1MDAwMDAwLCAgMHg4OCB9LAorCXsgIDc5NzAwMDAwMCwgIDB4ODkgfSwKKwl7ICA3OTkwMDAwMDAsICAweDhBIH0sCisJeyAgODAxMDAwMDAwLCAgMHg4QiB9LAorCXsgIDgwMjAwMDAwMCwgIDB4OEMgfSwKKwl7ICA4MDMwMDAwMDAsICAweDhEIH0sCisJeyAgODA0MDAwMDAwLCAgMHg4RSB9LAorCXsgIDgxMDAwMDAwMCwgIDB4OTAgfSwKKwl7ICA4MTEwMDAwMDAsICAweDkxIH0sCisJeyAgODEyMDAwMDAwLCAgMHg5MiB9LAorCXsgIDgxNDAwMDAwMCwgIDB4OTMgfSwKKwl7ICA4MTYwMDAwMDAsICAweDk0IH0sCisJeyAgODE3MDAwMDAwLCAgMHg5NiB9LAorCXsgIDgxODAwMDAwMCwgIDB4OTcgfSwKKwl7ICA4MjAwMDAwMDAsICAweDk4IH0sCisJeyAgODIxMDAwMDAwLCAgMHg5OSB9LAorCXsgIDgyMjAwMDAwMCwgIDB4OUEgfSwKKwl7ICA4MjgwMDAwMDAsICAweDlCIH0sCisJeyAgODI5MDAwMDAwLCAgMHg5RCB9LAorCXsgIDgzMDAwMDAwMCwgIDB4OUYgfSwKKwl7ICA4MzEwMDAwMDAsICAweEEwIH0sCisJeyAgODMzMDAwMDAwLCAgMHhBMSB9LAorCXsgIDgzNTAwMDAwMCwgIDB4QTIgfSwKKwl7ICA4MzYwMDAwMDAsICAweEEzIH0sCisJeyAgODM3MDAwMDAwLCAgMHhBNCB9LAorCXsgIDgzODAwMDAwMCwgIDB4QTYgfSwKKwl7ICA4NDAwMDAwMDAsICAweEE4IH0sCisJeyAgODQyMDAwMDAwLCAgMHhBOSB9LAorCXsgIDg0NTAwMDAwMCwgIDB4QUEgfSwKKwl7ICA4NDYwMDAwMDAsICAweEFCIH0sCisJeyAgODQ3MDAwMDAwLCAgMHhBRCB9LAorCXsgIDg0ODAwMDAwMCwgIDB4QUUgfSwKKwl7ICA4NTIwMDAwMDAsICAweEFGIH0sCisJeyAgODUzMDAwMDAwLCAgMHhCMCB9LAorCXsgIDg1ODAwMDAwMCwgIDB4QjEgfSwKKwl7ICA4NjAwMDAwMDAsICAweEIyIH0sCisJeyAgODYxMDAwMDAwLCAgMHhCMyB9LAorCXsgIDg2MjAwMDAwMCwgIDB4QjQgfSwKKwl7ICA4NjMwMDAwMDAsICAweEI2IH0sCisJeyAgODY0MDAwMDAwLCAgMHhCOCB9LAorCXsgIDg2NTAwMDAwMCwgIDB4QjkgfSwKKwl7ICAgICAgICAgIDAsICAweDAwIH0sICAgIC8qIFRhYmxlIEVuZCAqLworfTsKKworCitzdGF0aWMgc3RydWN0IFNNYXAyICBtX0tNX01hcFtdID0geworCXsgICA0NzkwMDAwMCwgIDMsIDIgfSwKKwl7ICAgNjExMDAwMDAsICAzLCAxIH0sCisJeyAgMzUwMDAwMDAwLCAgMywgMCB9LAorCXsgIDcyMDAwMDAwMCwgIDIsIDEgfSwKKwl7ICA4NjUwMDAwMDAsICAzLCAzIH0sCisJeyAgICAgICAgICAwLCAgMHgwMCB9LCAgICAvKiBUYWJsZSBFbmQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgU01hcDIgbV9NYWluX1BMTF9NYXBbXSA9IHsKKwl7ICAzMzEyNTAwMCwgMHg1NywgMHhGMCB9LAorCXsgIDM1NTAwMDAwLCAweDU2LCAweEUwIH0sCisJeyAgMzgxODgwMDAsIDB4NTUsIDB4RDAgfSwKKwl7ICA0MTM3NTAwMCwgMHg1NCwgMHhDMCB9LAorCXsgIDQ1MTI1MDAwLCAweDUzLCAweEIwIH0sCisJeyAgNDk2ODgwMDAsIDB4NTIsIDB4QTAgfSwKKwl7ICA1NTE4ODAwMCwgMHg1MSwgMHg5MCB9LAorCXsgIDYyMTI1MDAwLCAweDUwLCAweDgwIH0sCisJeyAgNjYyNTAwMDAsIDB4NDcsIDB4NzggfSwKKwl7ICA3MTAwMDAwMCwgMHg0NiwgMHg3MCB9LAorCXsgIDc2Mzc1MDAwLCAweDQ1LCAweDY4IH0sCisJeyAgODI3NTAwMDAsIDB4NDQsIDB4NjAgfSwKKwl7ICA5MDI1MDAwMCwgMHg0MywgMHg1OCB9LAorCXsgIDk5Mzc1MDAwLCAweDQyLCAweDUwIH0sCisJeyAxMTAzNzUwMDAsIDB4NDEsIDB4NDggfSwKKwl7IDEyNDI1MDAwMCwgMHg0MCwgMHg0MCB9LAorCXsgMTMyNTAwMDAwLCAweDM3LCAweDNDIH0sCisJeyAxNDIwMDAwMDAsIDB4MzYsIDB4MzggfSwKKwl7IDE1Mjc1MDAwMCwgMHgzNSwgMHgzNCB9LAorCXsgMTY1NTAwMDAwLCAweDM0LCAweDMwIH0sCisJeyAxODA1MDAwMDAsIDB4MzMsIDB4MkMgfSwKKwl7IDE5ODc1MDAwMCwgMHgzMiwgMHgyOCB9LAorCXsgMjIwNzUwMDAwLCAweDMxLCAweDI0IH0sCisJeyAyNDg1MDAwMDAsIDB4MzAsIDB4MjAgfSwKKwl7IDI2NTAwMDAwMCwgMHgyNywgMHgxRSB9LAorCXsgMjg0MDAwMDAwLCAweDI2LCAweDFDIH0sCisJeyAzMDU1MDAwMDAsIDB4MjUsIDB4MUEgfSwKKwl7IDMzMTAwMDAwMCwgMHgyNCwgMHgxOCB9LAorCXsgMzYxMDAwMDAwLCAweDIzLCAweDE2IH0sCisJeyAzOTc1MDAwMDAsIDB4MjIsIDB4MTQgfSwKKwl7IDQ0MTUwMDAwMCwgMHgyMSwgMHgxMiB9LAorCXsgNDk3MDAwMDAwLCAweDIwLCAweDEwIH0sCisJeyA1MzAwMDAwMDAsIDB4MTcsIDB4MEYgfSwKKwl7IDU2ODAwMDAwMCwgMHgxNiwgMHgwRSB9LAorCXsgNjExMDAwMDAwLCAweDE1LCAweDBEIH0sCisJeyA2NjIwMDAwMDAsIDB4MTQsIDB4MEMgfSwKKwl7IDcyMjAwMDAwMCwgMHgxMywgMHgwQiB9LAorCXsgNzk1MDAwMDAwLCAweDEyLCAweDBBIH0sCisJeyA4ODMwMDAwMDAsIDB4MTEsIDB4MDkgfSwKKwl7IDk5NDAwMDAwMCwgMHgxMCwgMHgwOCB9LAorCXsgICAgICAgICAwLCAweDAwLCAweDAwIH0sICAgIC8qIFRhYmxlIEVuZCAqLworfTsKKworc3RhdGljIHN0cnVjdCBTTWFwMiBtX0NhbF9QTExfTWFwW10gPSB7CisJeyAgMzM4MTMwMDAsIDB4REQsIDB4RDAgfSwKKwl7ICAzNjYyNTAwMCwgMHhEQywgMHhDMCB9LAorCXsgIDM5OTM4MDAwLCAweERCLCAweEIwIH0sCisJeyAgNDM5MzgwMDAsIDB4REEsIDB4QTAgfSwKKwl7ICA0ODgxMzAwMCwgMHhEOSwgMHg5MCB9LAorCXsgIDU0OTM4MDAwLCAweEQ4LCAweDgwIH0sCisJeyAgNjI4MTMwMDAsIDB4RDMsIDB4NzAgfSwKKwl7ICA2NzYyNTAwMCwgMHhDRCwgMHg2OCB9LAorCXsgIDczMjUwMDAwLCAweENDLCAweDYwIH0sCisJeyAgNzk4NzUwMDAsIDB4Q0IsIDB4NTggfSwKKwl7ICA4Nzg3NTAwMCwgMHhDQSwgMHg1MCB9LAorCXsgIDk3NjI1MDAwLCAweEM5LCAweDQ4IH0sCisJeyAxMDk4NzUwMDAsIDB4QzgsIDB4NDAgfSwKKwl7IDEyNTYyNTAwMCwgMHhDMywgMHgzOCB9LAorCXsgMTM1MjUwMDAwLCAweEJELCAweDM0IH0sCisJeyAxNDY1MDAwMDAsIDB4QkMsIDB4MzAgfSwKKwl7IDE1OTc1MDAwMCwgMHhCQiwgMHgyQyB9LAorCXsgMTc1NzUwMDAwLCAweEJBLCAweDI4IH0sCisJeyAxOTUyNTAwMDAsIDB4QjksIDB4MjQgfSwKKwl7IDIxOTc1MDAwMCwgMHhCOCwgMHgyMCB9LAorCXsgMjUxMjUwMDAwLCAweEIzLCAweDFDIH0sCisJeyAyNzA1MDAwMDAsIDB4QUQsIDB4MUEgfSwKKwl7IDI5MzAwMDAwMCwgMHhBQywgMHgxOCB9LAorCXsgMzE5NTAwMDAwLCAweEFCLCAweDE2IH0sCisJeyAzNTE1MDAwMDAsIDB4QUEsIDB4MTQgfSwKKwl7IDM5MDUwMDAwMCwgMHhBOSwgMHgxMiB9LAorCXsgNDM5NTAwMDAwLCAweEE4LCAweDEwIH0sCisJeyA1MDI1MDAwMDAsIDB4QTMsIDB4MEUgfSwKKwl7IDU0MTAwMDAwMCwgMHg5RCwgMHgwRCB9LAorCXsgNTg2MDAwMDAwLCAweDlDLCAweDBDIH0sCisJeyA2MzkwMDAwMDAsIDB4OUIsIDB4MEIgfSwKKwl7IDcwMzAwMDAwMCwgMHg5QSwgMHgwQSB9LAorCXsgNzgxMDAwMDAwLCAweDk5LCAweDA5IH0sCisJeyA4NzkwMDAwMDAsIDB4OTgsIDB4MDggfSwKKwl7ICAgICAgICAgMCwgMHgwMCwgMHgwMCB9LCAgICAvKiBUYWJsZSBFbmQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgU01hcCAgbV9HYWluVGFwZXJfTWFwW10gPSB7CisJeyAgNDU0MDAwMDAsIDB4MUYgfSwKKwl7ICA0NTgwMDAwMCwgMHgxRSB9LAorCXsgIDQ2MjAwMDAwLCAweDFEIH0sCisJeyAgNDY3MDAwMDAsIDB4MUMgfSwKKwl7ICA0NzEwMDAwMCwgMHgxQiB9LAorCXsgIDQ3NTAwMDAwLCAweDFBIH0sCisJeyAgNDc5MDAwMDAsIDB4MTkgfSwKKwl7ICA0OTYwMDAwMCwgMHgxNyB9LAorCXsgIDUxMjAwMDAwLCAweDE2IH0sCisJeyAgNTI5MDAwMDAsIDB4MTUgfSwKKwl7ICA1NDUwMDAwMCwgMHgxNCB9LAorCXsgIDU2MjAwMDAwLCAweDEzIH0sCisJeyAgNTc4MDAwMDAsIDB4MTIgfSwKKwl7ICA1OTUwMDAwMCwgMHgxMSB9LAorCXsgIDYxMTAwMDAwLCAweDEwIH0sCisJeyAgNjc2MDAwMDAsIDB4MEQgfSwKKwl7ICA3NDIwMDAwMCwgMHgwQyB9LAorCXsgIDgwNzAwMDAwLCAweDBCIH0sCisJeyAgODcyMDAwMDAsIDB4MEEgfSwKKwl7ICA5MzgwMDAwMCwgMHgwOSB9LAorCXsgMTAwMzAwMDAwLCAweDA4IH0sCisJeyAxMDY5MDAwMDAsIDB4MDcgfSwKKwl7IDExMzQwMDAwMCwgMHgwNiB9LAorCXsgMTE5OTAwMDAwLCAweDA1IH0sCisJeyAxMjY1MDAwMDAsIDB4MDQgfSwKKwl7IDEzMzAwMDAwMCwgMHgwMyB9LAorCXsgMTM5NTAwMDAwLCAweDAyIH0sCisJeyAxNDYxMDAwMDAsIDB4MDEgfSwKKwl7IDE1MjYwMDAwMCwgMHgwMCB9LAorCXsgMTU0MzAwMDAwLCAweDFGIH0sCisJeyAxNTYxMDAwMDAsIDB4MUUgfSwKKwl7IDE1NzgwMDAwMCwgMHgxRCB9LAorCXsgMTU5NTAwMDAwLCAweDFDIH0sCisJeyAxNjEyMDAwMDAsIDB4MUIgfSwKKwl7IDE2MzAwMDAwMCwgMHgxQSB9LAorCXsgMTY0NzAwMDAwLCAweDE5IH0sCisJeyAxNzAyMDAwMDAsIDB4MTcgfSwKKwl7IDE3NTgwMDAwMCwgMHgxNiB9LAorCXsgMTgxMzAwMDAwLCAweDE1IH0sCisJeyAxODY5MDAwMDAsIDB4MTQgfSwKKwl7IDE5MjQwMDAwMCwgMHgxMyB9LAorCXsgMTk4MDAwMDAwLCAweDEyIH0sCisJeyAyMDM1MDAwMDAsIDB4MTEgfSwKKwl7IDIxNjIwMDAwMCwgMHgxNCB9LAorCXsgMjI4OTAwMDAwLCAweDEzIH0sCisJeyAyNDE2MDAwMDAsIDB4MTIgfSwKKwl7IDI1NDQwMDAwMCwgMHgxMSB9LAorCXsgMjY3MTAwMDAwLCAweDEwIH0sCisJeyAyNzk4MDAwMDAsIDB4MEYgfSwKKwl7IDI5MjUwMDAwMCwgMHgwRSB9LAorCXsgMzA1MjAwMDAwLCAweDBEIH0sCisJeyAzMTc5MDAwMDAsIDB4MEMgfSwKKwl7IDMzMDcwMDAwMCwgMHgwQiB9LAorCXsgMzQzNDAwMDAwLCAweDBBIH0sCisJeyAzNTYxMDAwMDAsIDB4MDkgfSwKKwl7IDM2ODgwMDAwMCwgMHgwOCB9LAorCXsgMzgxNTAwMDAwLCAweDA3IH0sCisJeyAzOTQyMDAwMDAsIDB4MDYgfSwKKwl7IDQwNjkwMDAwMCwgMHgwNSB9LAorCXsgNDE5NzAwMDAwLCAweDA0IH0sCisJeyA0MzI0MDAwMDAsIDB4MDMgfSwKKwl7IDQ0NTEwMDAwMCwgMHgwMiB9LAorCXsgNDU3ODAwMDAwLCAweDAxIH0sCisJeyA0NzYzMDAwMDAsIDB4MTkgfSwKKwl7IDQ5NDgwMDAwMCwgMHgxOCB9LAorCXsgNTEzMzAwMDAwLCAweDE3IH0sCisJeyA1MzE4MDAwMDAsIDB4MTYgfSwKKwl7IDU1MDMwMDAwMCwgMHgxNSB9LAorCXsgNTY4OTAwMDAwLCAweDE0IH0sCisJeyA1ODc0MDAwMDAsIDB4MTMgfSwKKwl7IDYwNTkwMDAwMCwgMHgxMiB9LAorCXsgNjI0NDAwMDAwLCAweDExIH0sCisJeyA2NDI5MDAwMDAsIDB4MTAgfSwKKwl7IDY2MTQwMDAwMCwgMHgwRiB9LAorCXsgNjc5OTAwMDAwLCAweDBFIH0sCisJeyA2OTg0MDAwMDAsIDB4MEQgfSwKKwl7IDcxNjkwMDAwMCwgMHgwQyB9LAorCXsgNzM1NDAwMDAwLCAweDBCIH0sCisJeyA3NTM5MDAwMDAsIDB4MEEgfSwKKwl7IDc3MjUwMDAwMCwgMHgwOSB9LAorCXsgNzkxMDAwMDAwLCAweDA4IH0sCisJeyA4MDk1MDAwMDAsIDB4MDcgfSwKKwl7IDgyODAwMDAwMCwgMHgwNiB9LAorCXsgODQ2NTAwMDAwLCAweDA1IH0sCisJeyA4NjUwMDAwMDAsIDB4MDQgfSwKKwl7ICAgICAgICAgMCwgMHgwMCB9LCAgICAvKiBUYWJsZSBFbmQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgU01hcCBtX1JGX0NhbF9EQ19PdmVyX0RUX01hcFtdID0geworCXsgIDQ3OTAwMDAwLCAweDAwIH0sCisJeyAgNTUwMDAwMDAsIDB4MDAgfSwKKwl7ICA2MTEwMDAwMCwgMHgwQSB9LAorCXsgIDY0MDAwMDAwLCAweDBBIH0sCisJeyAgODIwMDAwMDAsIDB4MTQgfSwKKwl7ICA4NDAwMDAwMCwgMHgxOSB9LAorCXsgMTE5MDAwMDAwLCAweDFDIH0sCisJeyAxMjQwMDAwMDAsIDB4MjAgfSwKKwl7IDEyOTAwMDAwMCwgMHgyQSB9LAorCXsgMTM0MDAwMDAwLCAweDMyIH0sCisJeyAxMzkwMDAwMDAsIDB4MzkgfSwKKwl7IDE0NDAwMDAwMCwgMHgzRSB9LAorCXsgMTQ5MDAwMDAwLCAweDNGIH0sCisJeyAxNTI2MDAwMDAsIDB4NDAgfSwKKwl7IDE1NDAwMDAwMCwgMHg0MCB9LAorCXsgMTY0NzAwMDAwLCAweDQxIH0sCisJeyAyMDM1MDAwMDAsIDB4MzIgfSwKKwl7IDM1MzAwMDAwMCwgMHgxOSB9LAorCXsgMzU2MDAwMDAwLCAweDFBIH0sCisJeyAzNTkwMDAwMDAsIDB4MUIgfSwKKwl7IDM2MzAwMDAwMCwgMHgxQyB9LAorCXsgMzY2MDAwMDAwLCAweDFEIH0sCisJeyAzNjkwMDAwMDAsIDB4MUUgfSwKKwl7IDM3MzAwMDAwMCwgMHgxRiB9LAorCXsgMzc2MDAwMDAwLCAweDIwIH0sCisJeyAzNzkwMDAwMDAsIDB4MjEgfSwKKwl7IDM4MzAwMDAwMCwgMHgyMiB9LAorCXsgMzg2MDAwMDAwLCAweDIzIH0sCisJeyAzODkwMDAwMDAsIDB4MjQgfSwKKwl7IDM5MzAwMDAwMCwgMHgyNSB9LAorCXsgMzk2MDAwMDAwLCAweDI2IH0sCisJeyAzOTkwMDAwMDAsIDB4MjcgfSwKKwl7IDQwMjAwMDAwMCwgMHgyOCB9LAorCXsgNDA0MDAwMDAwLCAweDI5IH0sCisJeyA0MDcwMDAwMDAsIDB4MkEgfSwKKwl7IDQwOTAwMDAwMCwgMHgyQiB9LAorCXsgNDEyMDAwMDAwLCAweDJDIH0sCisJeyA0MTQwMDAwMDAsIDB4MkQgfSwKKwl7IDQxNzAwMDAwMCwgMHgyRSB9LAorCXsgNDE5MDAwMDAwLCAweDJGIH0sCisJeyA0MjIwMDAwMDAsIDB4MzAgfSwKKwl7IDQyNDAwMDAwMCwgMHgzMSB9LAorCXsgNDI3MDAwMDAwLCAweDMyIH0sCisJeyA0MjkwMDAwMDAsIDB4MzMgfSwKKwl7IDQzMjAwMDAwMCwgMHgzNCB9LAorCXsgNDM0MDAwMDAwLCAweDM1IH0sCisJeyA0MzcwMDAwMDAsIDB4MzYgfSwKKwl7IDQzOTAwMDAwMCwgMHgzNyB9LAorCXsgNDQyMDAwMDAwLCAweDM4IH0sCisJeyA0NDQwMDAwMDAsIDB4MzkgfSwKKwl7IDQ0NzAwMDAwMCwgMHgzQSB9LAorCXsgNDQ5MDAwMDAwLCAweDNCIH0sCisJeyA0NTc4MDAwMDAsIDB4M0MgfSwKKwl7IDQ2NTAwMDAwMCwgMHgwRiB9LAorCXsgNDc3MDAwMDAwLCAweDEyIH0sCisJeyA0ODMwMDAwMDAsIDB4MTQgfSwKKwl7IDUwMjAwMDAwMCwgMHgxOSB9LAorCXsgNTA4MDAwMDAwLCAweDFCIH0sCisJeyA1MTkwMDAwMDAsIDB4MUMgfSwKKwl7IDUyMjAwMDAwMCwgMHgxRCB9LAorCXsgNTI0MDAwMDAwLCAweDFFIH0sCisJeyA1MzQwMDAwMDAsIDB4MUYgfSwKKwl7IDU0OTAwMDAwMCwgMHgyMCB9LAorCXsgNTU0MDAwMDAwLCAweDIyIH0sCisJeyA1ODQwMDAwMDAsIDB4MjQgfSwKKwl7IDU4OTAwMDAwMCwgMHgyNiB9LAorCXsgNjU4MDAwMDAwLCAweDI3IH0sCisJeyA2NjQwMDAwMDAsIDB4MkMgfSwKKwl7IDY2OTAwMDAwMCwgMHgyRCB9LAorCXsgNjk5MDAwMDAwLCAweDJFIH0sCisJeyA3MDQwMDAwMDAsIDB4MzAgfSwKKwl7IDcwOTAwMDAwMCwgMHgzMSB9LAorCXsgNzE0MDAwMDAwLCAweDMyIH0sCisJeyA3MjQwMDAwMDAsIDB4MzMgfSwKKwl7IDcyOTAwMDAwMCwgMHgzNiB9LAorCXsgNzM5MDAwMDAwLCAweDM4IH0sCisJeyA3NDQwMDAwMDAsIDB4MzkgfSwKKwl7IDc0OTAwMDAwMCwgMHgzQiB9LAorCXsgNzU0MDAwMDAwLCAweDNDIH0sCisJeyA3NTkwMDAwMDAsIDB4M0QgfSwKKwl7IDc2NDAwMDAwMCwgMHgzRSB9LAorCXsgNzY5MDAwMDAwLCAweDNGIH0sCisJeyA3NzQwMDAwMDAsIDB4NDAgfSwKKwl7IDc3OTAwMDAwMCwgMHg0MSB9LAorCXsgNzg0MDAwMDAwLCAweDQzIH0sCisJeyA3ODkwMDAwMDAsIDB4NDYgfSwKKwl7IDc5NDAwMDAwMCwgMHg0OCB9LAorCXsgNzk5MDAwMDAwLCAweDRCIH0sCisJeyA4MDQwMDAwMDAsIDB4NEYgfSwKKwl7IDgwOTAwMDAwMCwgMHg1NCB9LAorCXsgODE0MDAwMDAwLCAweDU5IH0sCisJeyA4MTkwMDAwMDAsIDB4NUQgfSwKKwl7IDgyNDAwMDAwMCwgMHg2MSB9LAorCXsgODI5MDAwMDAwLCAweDY4IH0sCisJeyA4MzQwMDAwMDAsIDB4NkUgfSwKKwl7IDgzOTAwMDAwMCwgMHg3NSB9LAorCXsgODQ0MDAwMDAwLCAweDdFIH0sCisJeyA4NDkwMDAwMDAsIDB4ODIgfSwKKwl7IDg1NDAwMDAwMCwgMHg4NCB9LAorCXsgODU5MDAwMDAwLCAweDhGIH0sCisJeyA4NjUwMDAwMDAsIDB4OUEgfSwKKwl7ICAgICAgICAgMCwgMHgwMCB9LCAgICAvKiBUYWJsZSBFbmQgKi8KK307CisKKworc3RhdGljIHN0cnVjdCBTTWFwICBtX0lSX01lYXNfTWFwW10gPSB7CisJeyAyMDAwMDAwMDAsIDB4MDUgfSwKKwl7IDQwMDAwMDAwMCwgMHgwNiB9LAorCXsgODY1MDAwMDAwLCAweDA3IH0sCisJeyAgICAgICAgIDAsIDB4MDAgfSwgICAgLyogVGFibGUgRW5kICovCit9OworCitzdGF0aWMgc3RydWN0IFNNYXAyIG1fQ0lEX1RhcmdldF9NYXBbXSA9IHsKKwl7ICA0NjAwMDAwMCwgMHgwNCwgMTggfSwKKwl7ICA1MjIwMDAwMCwgMHgwQSwgMTUgfSwKKwl7ICA3MDEwMDAwMCwgMHgwMSwgNDAgfSwKKwl7IDEzNjgwMDAwMCwgMHgxOCwgNDAgfSwKKwl7IDE1NjcwMDAwMCwgMHgxOCwgNDAgfSwKKwl7IDE4NjI1MDAwMCwgMHgwQSwgNDAgfSwKKwl7IDIzMDAwMDAwMCwgMHgwQSwgNDAgfSwKKwl7IDM0NTAwMDAwMCwgMHgxOCwgNDAgfSwKKwl7IDQyNjAwMDAwMCwgMHgwRSwgNDAgfSwKKwl7IDQ4OTUwMDAwMCwgMHgxRSwgNDAgfSwKKwl7IDY5NzUwMDAwMCwgMHgzMiwgNDAgfSwKKwl7IDg0MjAwMDAwMCwgMHgzQSwgNDAgfSwKKwl7ICAgICAgICAgMCwgMHgwMCwgIDAgfSwgICAgLyogVGFibGUgRW5kICovCit9OworCitzdGF0aWMgc3RydWN0IFNSRkJhbmRNYXAgIG1fUkZfQmFuZF9NYXBbN10gPSB7CisJeyAgIDQ3OTAwMDAwLCAgIDQ2MDAwMDAwLCAgICAgICAgICAgMCwgICAgICAgICAgMH0sCisJeyAgIDYxMTAwMDAwLCAgIDUyMjAwMDAwLCAgICAgICAgICAgMCwgICAgICAgICAgMH0sCisJeyAgMTUyNjAwMDAwLCAgIDcwMTAwMDAwLCAgIDEzNjgwMDAwMCwgICAgICAgICAgMH0sCisJeyAgMTY0NzAwMDAwLCAgMTU2NzAwMDAwLCAgICAgICAgICAgMCwgICAgICAgICAgMH0sCisJeyAgMjAzNTAwMDAwLCAgMTg2MjUwMDAwLCAgICAgICAgICAgMCwgICAgICAgICAgMH0sCisJeyAgNDU3ODAwMDAwLCAgMjMwMDAwMDAwLCAgIDM0NTAwMDAwMCwgIDQyNjAwMDAwMH0sCisJeyAgODY1MDAwMDAwLCAgNDg5NTAwMDAwLCAgIDY5NzUwMDAwMCwgIDg0MjAwMDAwMH0sCit9OworCit1OCBtX1RoZXJtb21ldGVyX01hcF8xWzE2XSA9IHsKKwk2MCwgNjIsIDY2LCA2NCwKKwk3NCwgNzIsIDY4LCA3MCwKKwk5MCwgODgsIDg0LCA4NiwKKwk3NiwgNzgsIDgyLCA4MCwKK307CisKK3U4IG1fVGhlcm1vbWV0ZXJfTWFwXzJbMTZdID0geworCTkyLCA5NCwgOTgsIDk2LAorCTEwNiwgMTA0LCAxMDAsIDEwMiwKKwkxMjIsIDEyMCwgMTE2LCAxMTgsCisJMTA4LCAxMTAsIDExNCwgMTEyLAorfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvZHZiL25nZW5lL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL2R2Yi9uZ2VuZS9LY29uZmlnCmluZGV4IGNlYzI0MmIuLjY0Yzg0NzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL25nZW5lL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9kdmIvbmdlbmUvS2NvbmZpZwpAQCAtNSw2ICs1LDggQEAKIAlzZWxlY3QgRFZCX1NUVjYxMTB4IGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9TVFYwOTB4IGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9MR0RUMzMwWCBpZiAhRFZCX0ZFX0NVU1RPTUlTRQorCXNlbGVjdCBEVkJfRFJYSyBpZiAhRFZCX0ZFX0NVU1RPTUlTRQorCXNlbGVjdCBEVkJfVERBMTgyNzFDMkREIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IE1FRElBX1RVTkVSX01UMjEzMSBpZiAhTUVESUFfVFVORVJfQ1VTVE9NSVNFCiAJLS0taGVscC0tLQogCSAgU3VwcG9ydCBmb3IgTWljcm9uYXMgUENJIGV4cHJlc3MgY2FyZHMgd2l0aCBuR2VuZSBicmlkZ2UuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9uZ2VuZS9uZ2VuZS1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS9kdmIvbmdlbmUvbmdlbmUtY2FyZHMuYwppbmRleCBmY2Y0YmU5Li4wNTY0MTkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9uZ2VuZS9uZ2VuZS1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL25nZW5lL25nZW5lLWNhcmRzLmMKQEAgLTQwLDYgKzQwLDggQEAKICNpbmNsdWRlICJsbmJoMjQuaCIKICNpbmNsdWRlICJsZ2R0MzMweC5oIgogI2luY2x1ZGUgIm10MjEzMS5oIgorI2luY2x1ZGUgInRkYTE4MjcxYzJkZC5oIgorI2luY2x1ZGUgImRyeGsuaCIKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTgzLDYgKzg1LDQ5IEBACiB9CiAKIAorc3RhdGljIGludCBkcnhrX2dhdGVfY3RybChzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgbmdlbmVfY2hhbm5lbCAqY2hhbiA9IGZlLT5zZWNfcHJpdjsKKwlpbnQgc3RhdHVzOworCisJaWYgKGVuYWJsZSkgeworCQlkb3duKCZjaGFuLT5kZXYtPnBsbF9tdXRleCk7CisJCXN0YXR1cyA9IGNoYW4tPmdhdGVfY3RybChmZSwgMSk7CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gY2hhbi0+Z2F0ZV9jdHJsKGZlLCAwKTsKKwkJdXAoJmNoYW4tPmRldi0+cGxsX211dGV4KTsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCB0dW5lcl9hdHRhY2hfdGRhMTgyNzEoc3RydWN0IG5nZW5lX2NoYW5uZWwgKmNoYW4pCit7CisJc3RydWN0IGkyY19hZGFwdGVyICppMmM7CisJc3RydWN0IGR2Yl9mcm9udGVuZCAqZmU7CisKKwlpMmMgPSAmY2hhbi0+ZGV2LT5jaGFubmVsWzBdLmkyY19hZGFwdGVyOworCWlmIChjaGFuLT5mZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWNoYW4tPmZlLT5vcHMuaTJjX2dhdGVfY3RybChjaGFuLT5mZSwgMSk7CisJZmUgPSBkdmJfYXR0YWNoKHRkYTE4MjcxYzJkZF9hdHRhY2gsIGNoYW4tPmZlLCBpMmMsIDB4NjApOworCWlmIChjaGFuLT5mZS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCWNoYW4tPmZlLT5vcHMuaTJjX2dhdGVfY3RybChjaGFuLT5mZSwgMCk7CisJaWYgKCFmZSkgeworCQlwcmludGsoS0VSTl9FUlIgIk5vIFREQTE4MjcxIGZvdW5kIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHR1bmVyX2F0dGFjaF9wcm9iZShzdHJ1Y3QgbmdlbmVfY2hhbm5lbCAqY2hhbikKK3sKKwlpZiAoY2hhbi0+ZGVtb2RfdHlwZSA9PSAwKQorCQlyZXR1cm4gdHVuZXJfYXR0YWNoX3N0djYxMTAoY2hhbik7CisJaWYgKGNoYW4tPmRlbW9kX3R5cGUgPT0gMSkKKwkJcmV0dXJuIHR1bmVyX2F0dGFjaF90ZGExODI3MShjaGFuKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKwogc3RhdGljIGludCBkZW1vZF9hdHRhY2hfc3R2MDkwMChzdHJ1Y3QgbmdlbmVfY2hhbm5lbCAqY2hhbikKIHsKIAlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYzsKQEAgLTEzMCw2ICsxNzUsNjAgQEAKIAkJdXAoJmNoYW4tPmRldi0+cGxsX211dGV4KTsKIH0KIAorc3RhdGljIGludCBpMmNfcmVhZChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IGFkciwgdTggKnZhbCkKK3sKKwlzdHJ1Y3QgaTJjX21zZyBtc2dzWzFdID0ge3suYWRkciA9IGFkciwgIC5mbGFncyA9IEkyQ19NX1JELAorCQkJCSAgIC5idWYgID0gdmFsLCAgLmxlbiAgID0gMSB9IH07CisJcmV0dXJuIChpMmNfdHJhbnNmZXIoYWRhcHRlciwgbXNncywgMSkgPT0gMSkgPyAwIDogLTE7Cit9CisKK3N0YXRpYyBpbnQgaTJjX3JlYWRfcmVnMTYoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyLCB1OCBhZHIsCisJCQkgIHUxNiByZWcsIHU4ICp2YWwpCit7CisJdTggbXNnWzJdID0ge3JlZz4+OCwgcmVnJjB4ZmZ9OworCXN0cnVjdCBpMmNfbXNnIG1zZ3NbMl0gPSB7ey5hZGRyID0gYWRyLCAuZmxhZ3MgPSAwLAorCQkJCSAgIC5idWYgID0gbXNnLCAubGVuICAgPSAyfSwKKwkJCQkgIHsuYWRkciA9IGFkciwgLmZsYWdzID0gSTJDX01fUkQsCisJCQkJICAgLmJ1ZiAgPSB2YWwsIC5sZW4gICA9IDF9IH07CisJcmV0dXJuIChpMmNfdHJhbnNmZXIoYWRhcHRlciwgbXNncywgMikgPT0gMikgPyAwIDogLTE7Cit9CisKK3N0YXRpYyBpbnQgcG9ydF9oYXNfc3R2MDkwMChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgaW50IHBvcnQpCit7CisJdTggdmFsOworCWlmIChpMmNfcmVhZF9yZWcxNihpMmMsIDB4NjgrcG9ydC8yLCAweGYxMDAsICZ2YWwpIDwgMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcG9ydF9oYXNfZHJ4ayhzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYywgaW50IHBvcnQpCit7CisJdTggdmFsOworCisJaWYgKGkyY19yZWFkKGkyYywgMHgyOStwb3J0LCAmdmFsKSA8IDApCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGRlbW9kX2F0dGFjaF9kcnhrKHN0cnVjdCBuZ2VuZV9jaGFubmVsICpjaGFuLAorCQkJICAgICBzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmkyYykKK3sKKwlzdHJ1Y3QgZHJ4a19jb25maWcgY29uZmlnOworCisJbWVtc2V0KCZjb25maWcsIDAsIHNpemVvZihjb25maWcpKTsKKwljb25maWcuYWRyID0gMHgyOSArIChjaGFuLT5udW1iZXIgXiAyKTsKKworCWNoYW4tPmZlID0gZHZiX2F0dGFjaChkcnhrX2F0dGFjaCwgJmNvbmZpZywgaTJjLCAmY2hhbi0+ZmUyKTsKKwlpZiAoIWNoYW4tPmZlKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTm8gRFJYSyBmb3VuZCFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJY2hhbi0+ZmUtPnNlY19wcml2ID0gY2hhbjsKKwljaGFuLT5nYXRlX2N0cmwgPSBjaGFuLT5mZS0+b3BzLmkyY19nYXRlX2N0cmw7CisJY2hhbi0+ZmUtPm9wcy5pMmNfZ2F0ZV9jdHJsID0gZHJ4a19nYXRlX2N0cmw7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgY2luZVMyX3Byb2JlKHN0cnVjdCBuZ2VuZV9jaGFubmVsICpjaGFuKQogewogCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjOwpAQCAtMTQ0LDQzICsyNDMsNDIgQEAKIAllbHNlCiAJCWkyYyA9ICZjaGFuLT5kZXYtPmNoYW5uZWxbMV0uaTJjX2FkYXB0ZXI7CiAKLQlmZV9jb25mID0gY2hhbi0+ZGV2LT5jYXJkX2luZm8tPmZlX2NvbmZpZ1tjaGFuLT5udW1iZXJdOwotCWkyY19tc2cuYWRkciA9IGZlX2NvbmYtPmFkZHJlc3M7CisJaWYgKHBvcnRfaGFzX3N0djA5MDAoaTJjLCBjaGFuLT5udW1iZXIpKSB7CisJCWNoYW4tPmRlbW9kX3R5cGUgPSAwOworCQlmZV9jb25mID0gY2hhbi0+ZGV2LT5jYXJkX2luZm8tPmZlX2NvbmZpZ1tjaGFuLT5udW1iZXJdOworCQkvKiBkZW1vZCBmb3VuZCwgYXR0YWNoIGl0ICovCisJCXJjID0gZGVtb2RfYXR0YWNoX3N0djA5MDAoY2hhbik7CisJCWlmIChyYyA8IDAgfHwgY2hhbi0+bnVtYmVyIDwgMikKKwkJCXJldHVybiByYzsKIAotCS8qIHByb2JlIGRlbW9kICovCi0JaTJjX21zZy5sZW4gPSAyOwotCWJ1ZlswXSA9IDB4ZjE7Ci0JYnVmWzFdID0gMHgwMDsKLQlyYyA9IGkyY190cmFuc2ZlcihpMmMsICZpMmNfbXNnLCAxKTsKLQlpZiAocmMgIT0gMSkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQkvKiBkZW1vZCBmb3VuZCwgYXR0YWNoIGl0ICovCi0JcmMgPSBkZW1vZF9hdHRhY2hfc3R2MDkwMChjaGFuKTsKLQlpZiAocmMgPCAwIHx8IGNoYW4tPm51bWJlciA8IDIpCi0JCXJldHVybiByYzsKLQotCS8qIGRlbW9kICMyOiByZXByb2dyYW0gb3V0cHV0cyBEUE4xICYgRFBOMiAqLwotCWkyY19tc2cubGVuID0gMzsKLQlidWZbMF0gPSAweGYxOwotCXN3aXRjaCAoY2hhbi0+bnVtYmVyKSB7Ci0JY2FzZSAyOgotCQlidWZbMV0gPSAweDVjOwotCQlidWZbMl0gPSAweGMyOwotCQlicmVhazsKLQljYXNlIDM6Ci0JCWJ1ZlsxXSA9IDB4NjE7Ci0JCWJ1ZlsyXSA9IDB4Y2M7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6CisJCS8qIGRlbW9kICMyOiByZXByb2dyYW0gb3V0cHV0cyBEUE4xICYgRFBOMiAqLworCQlpMmNfbXNnLmFkZHIgPSBmZV9jb25mLT5hZGRyZXNzOworCQlpMmNfbXNnLmxlbiA9IDM7CisJCWJ1ZlswXSA9IDB4ZjE7CisJCXN3aXRjaCAoY2hhbi0+bnVtYmVyKSB7CisJCWNhc2UgMjoKKwkJCWJ1ZlsxXSA9IDB4NWM7CisJCQlidWZbMl0gPSAweGMyOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWJ1ZlsxXSA9IDB4NjE7CisJCQlidWZbMl0gPSAweGNjOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQlyYyA9IGkyY190cmFuc2ZlcihpMmMsICZpMmNfbXNnLCAxKTsKKwkJaWYgKHJjICE9IDEpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBERVZJQ0VfTkFNRSAiOiBjb3VsZCBub3Qgc2V0dXAgRFBOeFxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0gZWxzZSBpZiAocG9ydF9oYXNfZHJ4ayhpMmMsIGNoYW4tPm51bWJlcl4yKSkgeworCQljaGFuLT5kZW1vZF90eXBlID0gMTsKKwkJZGVtb2RfYXR0YWNoX2RyeGsoY2hhbiwgaTJjKTsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgIk5vIGRlbW9kIGZvdW5kIG9uIGNoYW4gJWRcbiIsIGNoYW4tPm51bWJlcik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KLQlyYyA9IGkyY190cmFuc2ZlcihpMmMsICZpMmNfbXNnLCAxKTsKLQlpZiAocmMgIT0gMSkgewotCQlwcmludGsoS0VSTl9FUlIgREVWSUNFX05BTUUgIjogY291bGQgbm90IHNldHVwIERQTnhcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtMzA2LDcgKzQwNCw3IEBACiAJLmlvX3R5cGUJPSB7TkdFTkVfSU9fVFNJTiwgTkdFTkVfSU9fVFNJTiwgTkdFTkVfSU9fVFNJTiwgTkdFTkVfSU9fVFNJTiwKIAkJCSAgIE5HRU5FX0lPX1RTT1VUfSwKIAkuZGVtb2RfYXR0YWNoCT0ge2RlbW9kX2F0dGFjaF9zdHYwOTAwLCBkZW1vZF9hdHRhY2hfc3R2MDkwMCwgY2luZVMyX3Byb2JlLCBjaW5lUzJfcHJvYmV9LAotCS50dW5lcl9hdHRhY2gJPSB7dHVuZXJfYXR0YWNoX3N0djYxMTAsIHR1bmVyX2F0dGFjaF9zdHY2MTEwLCB0dW5lcl9hdHRhY2hfc3R2NjExMCwgdHVuZXJfYXR0YWNoX3N0djYxMTB9LAorCS50dW5lcl9hdHRhY2gJPSB7dHVuZXJfYXR0YWNoX3N0djYxMTAsIHR1bmVyX2F0dGFjaF9zdHY2MTEwLCB0dW5lcl9hdHRhY2hfcHJvYmUsIHR1bmVyX2F0dGFjaF9wcm9iZX0sCiAJLmZlX2NvbmZpZwk9IHsmZmVfY2luZVMyLCAmZmVfY2luZVMyLCAmZmVfY2luZVMyXzIsICZmZV9jaW5lUzJfMn0sCiAJLnR1bmVyX2NvbmZpZwk9IHsmdHVuZXJfY2luZVMyXzAsICZ0dW5lcl9jaW5lUzJfMSwgJnR1bmVyX2NpbmVTMl8wLCAmdHVuZXJfY2luZVMyXzF9LAogCS5sbmIJCT0gezB4MGEsIDB4MDgsIDB4MGIsIDB4MDl9LApAQCAtMzIxLDcgKzQxOSw3IEBACiAJLmlvX3R5cGUJPSB7TkdFTkVfSU9fVFNJTiwgTkdFTkVfSU9fVFNJTiwgTkdFTkVfSU9fVFNJTiwgTkdFTkVfSU9fVFNJTiwKIAkJCSAgIE5HRU5FX0lPX1RTT1VUfSwKIAkuZGVtb2RfYXR0YWNoCT0ge2RlbW9kX2F0dGFjaF9zdHYwOTAwLCBkZW1vZF9hdHRhY2hfc3R2MDkwMCwgY2luZVMyX3Byb2JlLCBjaW5lUzJfcHJvYmV9LAotCS50dW5lcl9hdHRhY2gJPSB7dHVuZXJfYXR0YWNoX3N0djYxMTAsIHR1bmVyX2F0dGFjaF9zdHY2MTEwLCB0dW5lcl9hdHRhY2hfc3R2NjExMCwgdHVuZXJfYXR0YWNoX3N0djYxMTB9LAorCS50dW5lcl9hdHRhY2gJPSB7dHVuZXJfYXR0YWNoX3N0djYxMTAsIHR1bmVyX2F0dGFjaF9zdHY2MTEwLCB0dW5lcl9hdHRhY2hfcHJvYmUsIHR1bmVyX2F0dGFjaF9wcm9iZX0sCiAJLmZlX2NvbmZpZwk9IHsmZmVfY2luZVMyLCAmZmVfY2luZVMyLCAmZmVfY2luZVMyXzIsICZmZV9jaW5lUzJfMn0sCiAJLnR1bmVyX2NvbmZpZwk9IHsmdHVuZXJfY2luZVMyXzAsICZ0dW5lcl9jaW5lUzJfMSwgJnR1bmVyX2NpbmVTMl8wLCAmdHVuZXJfY2luZVMyXzF9LAogCS5sbmIJCT0gezB4MGEsIDB4MDgsIDB4MGIsIDB4MDl9LApAQCAtMzMxLDEzICs0MjksMTMgQEAKIH07CiAKIAotc3RhdGljIHN0cnVjdCBuZ2VuZV9pbmZvIG5nZW5lX2luZm9fZHVvRmxleFMyID0geworc3RhdGljIHN0cnVjdCBuZ2VuZV9pbmZvIG5nZW5lX2luZm9fZHVvRmxleCA9IHsKIAkudHlwZSAgICAgICAgICAgPSBOR0VORV9TSURFV0lOREVSLAotCS5uYW1lICAgICAgICAgICA9ICJEaWdpdGFsIERldmljZXMgRHVvRmxleCBTMiBtaW5pUENJZSIsCisJLm5hbWUgICAgICAgICAgID0gIkRpZ2l0YWwgRGV2aWNlcyBEdW9GbGV4IFBDSWUgb3IgbWluaVBDSWUiLAogCS5pb190eXBlICAgICAgICA9IHtOR0VORV9JT19UU0lOLCBOR0VORV9JT19UU0lOLCBOR0VORV9JT19UU0lOLCBOR0VORV9JT19UU0lOLAogCQkJICAgTkdFTkVfSU9fVFNPVVR9LAogCS5kZW1vZF9hdHRhY2ggICA9IHtjaW5lUzJfcHJvYmUsIGNpbmVTMl9wcm9iZSwgY2luZVMyX3Byb2JlLCBjaW5lUzJfcHJvYmV9LAotCS50dW5lcl9hdHRhY2ggICA9IHt0dW5lcl9hdHRhY2hfc3R2NjExMCwgdHVuZXJfYXR0YWNoX3N0djYxMTAsIHR1bmVyX2F0dGFjaF9zdHY2MTEwLCB0dW5lcl9hdHRhY2hfc3R2NjExMH0sCisJLnR1bmVyX2F0dGFjaCAgID0ge3R1bmVyX2F0dGFjaF9wcm9iZSwgdHVuZXJfYXR0YWNoX3Byb2JlLCB0dW5lcl9hdHRhY2hfcHJvYmUsIHR1bmVyX2F0dGFjaF9wcm9iZX0sCiAJLmZlX2NvbmZpZyAgICAgID0geyZmZV9jaW5lUzIsICZmZV9jaW5lUzIsICZmZV9jaW5lUzJfMiwgJmZlX2NpbmVTMl8yfSwKIAkudHVuZXJfY29uZmlnICAgPSB7JnR1bmVyX2NpbmVTMl8wLCAmdHVuZXJfY2luZVMyXzEsICZ0dW5lcl9jaW5lUzJfMCwgJnR1bmVyX2NpbmVTMl8xfSwKIAkubG5iICAgICAgICAgICAgPSB7MHgwYSwgMHgwOCwgMHgwYiwgMHgwOX0sCkBAIC0zODUsOCArNDgzLDggQEAKIAlOR0VORV9JRCgweDE4YzMsIDB4ZGIwMSwgbmdlbmVfaW5mb19zYXRpeFMyKSwKIAlOR0VORV9JRCgweDE4YzMsIDB4ZGIwMiwgbmdlbmVfaW5mb19zYXRpeFMydjIpLAogCU5HRU5FX0lEKDB4MThjMywgMHhkZDAwLCBuZ2VuZV9pbmZvX2NpbmVTMnY1KSwKLQlOR0VORV9JRCgweDE4YzMsIDB4ZGQxMCwgbmdlbmVfaW5mb19kdW9GbGV4UzIpLAotCU5HRU5FX0lEKDB4MThjMywgMHhkZDIwLCBuZ2VuZV9pbmZvX2R1b0ZsZXhTMiksCisJTkdFTkVfSUQoMHgxOGMzLCAweGRkMTAsIG5nZW5lX2luZm9fZHVvRmxleCksCisJTkdFTkVfSUQoMHgxOGMzLCAweGRkMjAsIG5nZW5lX2luZm9fZHVvRmxleCksCiAJTkdFTkVfSUQoMHgxNDYxLCAweDA2MmUsIG5nZW5lX2luZm9fbTc4MCksCiAJezB9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvbmdlbmUvbmdlbmUtY29yZS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvbmdlbmUvbmdlbmUtY29yZS5jCmluZGV4IDY5MjdjNzIuLmYxMjlhOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL25nZW5lL25nZW5lLWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9uZ2VuZS9uZ2VuZS1jb3JlLmMKQEAgLTQxLDcgKzQxLDcgQEAKIAogI2luY2x1ZGUgIm5nZW5lLmgiCiAKLXN0YXRpYyBpbnQgb25lX2FkYXB0ZXIgPSAxOworc3RhdGljIGludCBvbmVfYWRhcHRlcjsKIG1vZHVsZV9wYXJhbShvbmVfYWRhcHRlciwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0Mob25lX2FkYXB0ZXIsICJVc2Ugb25seSBvbmUgYWRhcHRlci4iKTsKIApAQCAtNDYxLDcgKzQ2MSw3IEBACiAJMHg0MiwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMiwgMHhiYywgMHgwMCwgMHgwMCwKIAkweDQwLCAweDA2LCAweDAwLCAweDAyLCAweDAyLCAweGJjLCAweDAwLCAweDAwLAkvKiBEUlhIICovCiAJMHg3MSwgMHgwNywgMHgwMCwgMHgwMiwgMHgwMiwgMHhiYywgMHgwMCwgMHgwMCwJLyogRFJYSHNlciAqLwotCTB4NzIsIDB4MDYsIDB4MDAsIDB4MDIsIDB4MDIsIDB4YmMsIDB4MDAsIDB4MDAsCS8qIFMyc2VyICovCisJMHg3MiwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMiwgMHhiYywgMHgwMCwgMHgwMCwJLyogUzJzZXIgKi8KIAkweDQwLCAweDA3LCAweDAwLCAweDAyLCAweDAyLCAweGJjLCAweDAwLCAweDAwLCAvKiBMR0RUMzMwMyAqLwogfTsKIApAQCAtNTA3LDcgKzUwNyw3IEBACiB7CiAJdTMyICpwdHIgPSBCdWZmZXI7CiAKLQltZW1zZXQoQnVmZmVyLCAweGZmLCBMZW5ndGgpOworCW1lbXNldChCdWZmZXIsIFRTX0ZJTExFUiwgTGVuZ3RoKTsKIAl3aGlsZSAoTGVuZ3RoID4gMCkgewogCQlpZiAoRmxhZ3MgJiBERl9TV0FQMzIpCiAJCQkqcHRyID0gMHg0NzFGRkYxMDsKQEAgLTE0NDMsNiArMTQ0Myw5IEBACiAJCWNoYW4tPmNpX2RldiA9IE5VTEw7CiAJfQogCisJaWYgKGNoYW4tPmZlMikKKwkJZHZiX3VucmVnaXN0ZXJfZnJvbnRlbmQoY2hhbi0+ZmUyKTsKKwogCWlmIChjaGFuLT5mZSkgewogCQlkdmJfdW5yZWdpc3Rlcl9mcm9udGVuZChjaGFuLT5mZSk7CiAJCWR2Yl9mcm9udGVuZF9kZXRhY2goY2hhbi0+ZmUpOwpAQCAtMTUzNCw2ICsxNTM3LDE0IEBACiAJCQlnb3RvIGVycjsKIAkJY2hhbi0+aGFzX2RlbXV4ID0gdHJ1ZTsKIAl9CisJaWYgKGNoYW4tPmZlMikgeworCQlpZiAoZHZiX3JlZ2lzdGVyX2Zyb250ZW5kKGFkYXB0ZXIsIGNoYW4tPmZlMikgPCAwKQorCQkJZ290byBlcnI7CisJCWNoYW4tPmZlMi0+dHVuZXJfcHJpdiA9IGNoYW4tPmZlLT50dW5lcl9wcml2OworCQltZW1jcHkoJmNoYW4tPmZlMi0+b3BzLnR1bmVyX29wcywKKwkJICAgICAgICZjaGFuLT5mZS0+b3BzLnR1bmVyX29wcywKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgZHZiX3R1bmVyX29wcykpOworCX0KIAogCWlmIChjaGFuLT5oYXNfZGVtdXgpIHsKIAkJcmV0ID0gbXlfZHZiX2RteF90c19jYXJkX2luaXQoZHZiZGVtdXgsICJTVyBkZW11eCIsCkBAIC0xNTcxLDExICsxNTgyLDE4IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgY3hkMjA5OV9jZmcgY3hkX2NmZyA9IHsKKwkuYml0cmF0ZSA9IDYyMDAwLAorCS5hZHIgPSAweDQwLAorCS5wb2xhcml0eSA9IDAsCisJLmNsb2NrX21vZGUgPSAwLAorfTsKKwogc3RhdGljIHZvaWQgY3hkX2F0dGFjaChzdHJ1Y3QgbmdlbmUgKmRldikKIHsKIAlzdHJ1Y3QgbmdlbmVfY2kgKmNpID0gJmRldi0+Y2k7CiAKLQljaS0+ZW4gPSBjeGQyMDk5X2F0dGFjaCgweDQwLCBkZXYsICZkZXYtPmNoYW5uZWxbMF0uaTJjX2FkYXB0ZXIpOworCWNpLT5lbiA9IGN4ZDIwOTlfYXR0YWNoKCZjeGRfY2ZnLCBkZXYsICZkZXYtPmNoYW5uZWxbMF0uaTJjX2FkYXB0ZXIpOwogCWNpLT5kZXYgPSBkZXY7CiAJcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvbmdlbmUvbmdlbmUtZHZiLmMgYi9kcml2ZXJzL21lZGlhL2R2Yi9uZ2VuZS9uZ2VuZS1kdmIuYwppbmRleCAwYjQ5NDMyLi5mY2IxNmE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9uZ2VuZS9uZ2VuZS1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9uZ2VuZS9uZ2VuZS1kdmIuYwpAQCAtMTE4LDYgKzExOCwxNiBAQAogCX0KIH0KIAorLyogc3RhcnQgb2YgZmlsbGVyIHBhY2tldCAqLworc3RhdGljIHU4IGZpbGxfdHNbXSA9IHsgMHg0NywgMHgxZiwgMHhmZiwgMHgxMCwgVFNfRklMTEVSIH07CisKKy8qICNkZWZpbmUgREVCVUdfQ0lfWEZFUiAqLworI2lmZGVmIERFQlVHX0NJX1hGRVIKK3N0YXRpYyB1MzIgb2s7CitzdGF0aWMgdTMyIG92ZXJmbG93Oworc3RhdGljIHUzMiBzdHJpcHBlZDsKKyNlbmRpZgorCiB2b2lkICp0c2luX2V4Y2hhbmdlKHZvaWQgKnByaXYsIHZvaWQgKmJ1ZiwgdTMyIGxlbiwgdTMyIGNsb2NrLCB1MzIgZmxhZ3MpCiB7CiAJc3RydWN0IG5nZW5lX2NoYW5uZWwgKmNoYW4gPSBwcml2OwpAQCAtMTI2LDIxICsxMzYsNDEgQEAKIAogCWlmIChmbGFncyAmIERGX1NXQVAzMikKIAkJc3dhcF9idWZmZXIoYnVmLCBsZW4pOworCiAJaWYgKGRldi0+Y2kuZW4gJiYgY2hhbi0+bnVtYmVyID09IDIpIHsKLQkJaWYgKGR2Yl9yaW5nYnVmZmVyX2ZyZWUoJmRldi0+dHNpbl9yYnVmKSA+IGxlbikgewotCQkJZHZiX3JpbmdidWZmZXJfd3JpdGUoJmRldi0+dHNpbl9yYnVmLCBidWYsIGxlbik7Ci0JCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldi0+dHNpbl9yYnVmLnF1ZXVlKTsKKwkJd2hpbGUgKGxlbiA+PSAxODgpIHsKKwkJCWlmIChtZW1jbXAoYnVmLCBmaWxsX3RzLCBzaXplb2YgZmlsbF90cykgIT0gMCkgeworCQkJCWlmIChkdmJfcmluZ2J1ZmZlcl9mcmVlKCZkZXYtPnRzaW5fcmJ1ZikgPj0gMTg4KSB7CisJCQkJCWR2Yl9yaW5nYnVmZmVyX3dyaXRlKCZkZXYtPnRzaW5fcmJ1ZiwgYnVmLCAxODgpOworCQkJCQl3YWtlX3VwKCZkZXYtPnRzaW5fcmJ1Zi5xdWV1ZSk7CisjaWZkZWYgREVCVUdfQ0lfWEZFUgorCQkJCQlvaysrOworI2VuZGlmCisJCQkJfQorI2lmZGVmIERFQlVHX0NJX1hGRVIKKwkJCQllbHNlCisJCQkJCW92ZXJmbG93Kys7CisjZW5kaWYKKwkJCX0KKyNpZmRlZiBERUJVR19DSV9YRkVSCisJCQllbHNlCisJCQkJc3RyaXBwZWQrKzsKKworCQkJaWYgKG9rICUgMTAwID09IDAgJiYgb3ZlcmZsb3cpCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IG9rICV1IG92ZXJmbG93ICV1IGRyb3BwZWQgJXVcbiIsIF9fZnVuY19fLCBvaywgb3ZlcmZsb3csIHN0cmlwcGVkKTsKKyNlbmRpZgorCQkJYnVmICs9IDE4ODsKKwkJCWxlbiAtPSAxODg7CiAJCX0KLQkJcmV0dXJuIDA7CisJCXJldHVybiBOVUxMOwogCX0KLQlpZiAoY2hhbi0+dXNlcnMgPiAwKSB7CisKKwlpZiAoY2hhbi0+dXNlcnMgPiAwKQogCQlkdmJfZG14X3N3ZmlsdGVyKCZjaGFuLT5kZW11eCwgYnVmLCBsZW4pOwotCX0KKwogCXJldHVybiBOVUxMOwogfQogCi11OCBmaWxsX3RzWzE4OF0gPSB7IDB4NDcsIDB4MWYsIDB4ZmYsIDB4MTAgfTsKLQogdm9pZCAqdHNvdXRfZXhjaGFuZ2Uodm9pZCAqcHJpdiwgdm9pZCAqYnVmLCB1MzIgbGVuLCB1MzIgY2xvY2ssIHUzMiBmbGFncykKIHsKIAlzdHJ1Y3QgbmdlbmVfY2hhbm5lbCAqY2hhbiA9IHByaXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2R2Yi9uZ2VuZS9uZ2VuZS5oIGIvZHJpdmVycy9tZWRpYS9kdmIvbmdlbmUvbmdlbmUuaAppbmRleCA0MGZjZTllLi41NDQzZGMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL2R2Yi9uZ2VuZS9uZ2VuZS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvZHZiL25nZW5lL25nZW5lLmgKQEAgLTY0MSw4ICs2NDEsMTEgQEAKIAlpbnQgICAgICAgICAgICAgICAgICAgbW9kZTsKIAlib29sICAgICAgICAgICAgICAgICAgaGFzX2FkYXB0ZXI7CiAJYm9vbCAgICAgICAgICAgICAgICAgIGhhc19kZW11eDsKKwlpbnQgICAgICAgICAgICAgICAgICAgZGVtb2RfdHlwZTsKKwlpbnQgKCpnYXRlX2N0cmwpKHN0cnVjdCBkdmJfZnJvbnRlbmQgKiwgaW50KTsKIAogCXN0cnVjdCBkdmJfZnJvbnRlbmQgICpmZTsKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kICAqZmUyOwogCXN0cnVjdCBkbXhkZXYgICAgICAgICBkbXhkZXY7CiAJc3RydWN0IGR2Yl9kZW11eCAgICAgIGRlbXV4OwogCXN0cnVjdCBkdmJfbmV0ICAgICAgICBkdmJuZXQ7CkBAIC03ODYsNiArNzg5LDggQEAKIAl1OCAgICAgICAgICAgICAgICAgICAgdWFydF9yYnVmW1VBUlRfUkJVRl9MRU5dOwogCWludCAgICAgICAgICAgICAgICAgICB1YXJ0X3JwLCB1YXJ0X3dwOwogCisjZGVmaW5lIFRTX0ZJTExFUiAgMHg2ZgorCiAJdTggICAgICAgICAgICAgICAgICAgKnRzb3V0X2J1ZjsKICNkZWZpbmUgVFNPVVRfQlVGX1NJWkUgKDUxMioxODgqOCkKIAlzdHJ1Y3QgZHZiX3JpbmdidWZmZXIgdHNvdXRfcmJ1ZjsKQEAgLTg1Miw3ICs4NTcsNyBAQAogfTsKIAogI2lmZGVmIE5HRU5FX1Y0TAotc3RydWN0IG5nZW5lX2Zvcm1hdHsKK3N0cnVjdCBuZ2VuZV9mb3JtYXQgewogCWNoYXIgKm5hbWU7CiAJaW50ICAgZm91cmNjOyAgICAgICAgICAvKiB2aWRlbzRsaW51eCAyICAgICAgKi8KIAlpbnQgICBidGZvcm1hdDsgICAgICAgIC8qIEJUODQ4X0NPTE9SX0ZNVF8qICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zY29yZWFwaS5jIGIvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zY29yZWFwaS5jCmluZGV4IDc4NzY1ZWQuLjczMzFlODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntc2NvcmVhcGkuYworKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXNjb3JlYXBpLmMKQEAgLTExNDcsNyArMTE0Nyw3IEBACiAKIAlpZiAoIWNsaWVudCkgewogCQlzbXNfZXJyKCJiYWQgcGFyYW1ldGVyLiIpOwotCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXJlZ2lzdGVyZWRfY2xpZW50ID0gc21zY29yZV9maW5kX2NsaWVudChjb3JlZGV2LCBkYXRhX3R5cGUsIGlkKTsKIAlpZiAocmVnaXN0ZXJlZF9jbGllbnQgPT0gY2xpZW50KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zY29yZWFwaS5oIGIvZHJpdmVycy9tZWRpYS9kdmIvc2lhbm8vc21zY29yZWFwaS5oCmluZGV4IDhlY2FkZWMuLmM1OTJhZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvZHZiL3NpYW5vL3Ntc2NvcmVhcGkuaAorKysgYi9kcml2ZXJzL21lZGlhL2R2Yi9zaWFuby9zbXNjb3JlYXBpLmgKQEAgLTIyLDcgKzIyLDYgQEAKICNpZm5kZWYgX19TTVNfQ09SRV9BUElfSF9fCiAjZGVmaW5lIF9fU01TX0NPUkVfQVBJX0hfXwogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9kc2JyMTAwLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL2RzYnIxMDAuYwppbmRleCAzZDhjYzQyLi4yNWU1OGNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL2RzYnIxMDAuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL2RzYnIxMDAuYwpAQCAtMTAyLDEwICsxMDIsNyBAQAogLyoKICAqIFZlcnNpb24gSW5mb3JtYXRpb24KICAqLwotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4JLyogZm9yIEtFUk5FTF9WRVJTSU9OIE1BQ1JPCSovCi0KLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYwLjQ2IgotI2RlZmluZSBSQURJT19WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKDAsIDQsIDYpCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICIwLjQuNyIKIAogI2RlZmluZSBEUklWRVJfQVVUSE9SICJNYXJrdXMgRGVtbGVpdG5lciA8bXNkZW1sZWlAdHVjYW5hLmhhcnZhcmQuZWR1PiIKICNkZWZpbmUgRFJJVkVSX0RFU0MgIkQtTGluayBEU0ItUjEwMCBVU0IgRk0gcmFkaW8gZHJpdmVyIgpAQCAtMzM1LDcgKzMzMiw2IEBACiAJc3RybGNweSh2LT5kcml2ZXIsICJkc2JyMTAwIiwgc2l6ZW9mKHYtPmRyaXZlcikpOwogCXN0cmxjcHkodi0+Y2FyZCwgIkQtTGluayBSLTEwMCBVU0IgRk0gUmFkaW8iLCBzaXplb2Yodi0+Y2FyZCkpOwogCXVzYl9tYWtlX3BhdGgocmFkaW8tPnVzYmRldiwgdi0+YnVzX2luZm8sIHNpemVvZih2LT5idXNfaW5mbykpOwotCXYtPnZlcnNpb24gPSBSQURJT19WRVJTSU9OOwogCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSOwogCXJldHVybiAwOwogfQpAQCAtNjQ3LDMgKzY0Myw0IEBACiBNT0RVTEVfQVVUSE9SKCBEUklWRVJfQVVUSE9SICk7CiBNT0RVTEVfREVTQ1JJUFRJT04oIERSSVZFUl9ERVNDICk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUklWRVJfVkVSU0lPTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWFpbXNsYWIuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tYWltc2xhYi5jCmluZGV4IDRjZTEwZGIuLjFjM2Y4NDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tYWltc2xhYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tYWltc2xhYi5jCkBAIC0zMyw3ICszMyw2IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CS8qIHJlcXVlc3RfcmVnaW9uCQkqLwogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CS8qIG1zbGVlcAkJCSovCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CS8qIGtlcm5lbCByYWRpbyBzdHJ1Y3RzCQkqLwotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4JLyogZm9yIEtFUk5FTF9WRVJTSU9OIE1BQ1JPCSovCiAjaW5jbHVkZSA8bGludXgvaW8uaD4JCS8qIG91dGIsIG91dGJfcAkJCSovCiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CkBAIC00MSw2ICs0MCw3IEBACiBNT0RVTEVfQVVUSE9SKCJNLktpcmt3b29kIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkEgZHJpdmVyIGZvciB0aGUgUmFkaW9UcmFjay9SYWRpb1JldmVhbCByYWRpbyBjYXJkLiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oIjAuMC4zIik7CiAKICNpZm5kZWYgQ09ORklHX1JBRElPX1JUUkFDS19QT1JUCiAjZGVmaW5lIENPTkZJR19SQURJT19SVFJBQ0tfUE9SVCAtMQpAQCAtNTMsOCArNTMsNiBAQAogTU9EVUxFX1BBUk1fREVTQyhpbywgIkkvTyBhZGRyZXNzIG9mIHRoZSBSYWRpb1RyYWNrIGNhcmQgKDB4MjBmIG9yIDB4MzBmKSIpOwogbW9kdWxlX3BhcmFtKHJhZGlvX25yLCBpbnQsIDApOwogCi0jZGVmaW5lIFJBRElPX1ZFUlNJT04gS0VSTkVMX1ZFUlNJT04oMCwgMCwgMikKLQogc3RydWN0IHJ0cmFjawogewogCXN0cnVjdCB2NGwyX2RldmljZSB2NGwyX2RldjsKQEAgLTIyMyw3ICsyMjEsNiBAQAogCXN0cmxjcHkodi0+ZHJpdmVyLCAicmFkaW8tYWltc2xhYiIsIHNpemVvZih2LT5kcml2ZXIpKTsKIAlzdHJsY3B5KHYtPmNhcmQsICJSYWRpb1RyYWNrIiwgc2l6ZW9mKHYtPmNhcmQpKTsKIAlzdHJsY3B5KHYtPmJ1c19pbmZvLCAiSVNBIiwgc2l6ZW9mKHYtPmJ1c19pbmZvKSk7Ci0Jdi0+dmVyc2lvbiA9IFJBRElPX1ZFUlNJT047CiAJdi0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVFVORVIgfCBWNEwyX0NBUF9SQURJTzsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tYXp0ZWNoLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWF6dGVjaC5jCmluZGV4IGRkOGE2YWIuLmVlZDdiMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tYXp0ZWNoLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1henRlY2guYwpAQCAtMzAsNyArMzAsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgkvKiByZXF1ZXN0X3JlZ2lvbgkJKi8KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgkvKiB1ZGVsYXkJCQkqLwogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgkvKiBrZXJuZWwgcmFkaW8gc3RydWN0cwkJKi8KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+ICAgICAgLyogZm9yIEtFUk5FTF9WRVJTSU9OIE1BQ1JPICAgICAqLwogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CQkvKiBvdXRiLCBvdXRiX3AJCQkqLwogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgpAQCAtMzgsNiArMzcsNyBAQAogTU9EVUxFX0FVVEhPUigiUnVzc2VsbCBLcm9sbCwgUXVheSBMdSwgRG9uYWxkIFNvbmcsIEphc29uIExld2lzLCBTY290dCBNY0dyYXRoLCBXaWxsaWFtIE1jR3JhdGgiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQSBkcml2ZXIgZm9yIHRoZSBBenRlY2ggcmFkaW8gY2FyZC4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKCIwLjAuMyIpOwogCiAvKiBhY2NlcHRhYmxlIHBvcnRzOiAweDM1MCAoSlAzIHNob3J0ZWQpLCAweDM1OCAoSlAzIG9wZW4pICovCiAKQEAgLTUzLDggKzUzLDYgQEAKIG1vZHVsZV9wYXJhbShyYWRpb19uciwgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoaW8sICJJL08gYWRkcmVzcyBvZiB0aGUgQXp0ZWNoIGNhcmQgKDB4MzUwIG9yIDB4MzU4KSIpOwogCi0jZGVmaW5lIFJBRElPX1ZFUlNJT04gS0VSTkVMX1ZFUlNJT04oMCwgMCwgMikKLQogc3RydWN0IGF6dGVjaAogewogCXN0cnVjdCB2NGwyX2RldmljZSB2NGwyX2RldjsKQEAgLTE4OCw3ICsxODYsNiBAQAogCXN0cmxjcHkodi0+ZHJpdmVyLCAicmFkaW8tYXp0ZWNoIiwgc2l6ZW9mKHYtPmRyaXZlcikpOwogCXN0cmxjcHkodi0+Y2FyZCwgIkF6dGVjaCBSYWRpbyIsIHNpemVvZih2LT5jYXJkKSk7CiAJc3RybGNweSh2LT5idXNfaW5mbywgIklTQSIsIHNpemVvZih2LT5idXNfaW5mbykpOwotCXYtPnZlcnNpb24gPSBSQURJT19WRVJTSU9OOwogCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSIHwgVjRMMl9DQVBfUkFESU87CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWNhZGV0LmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWNhZGV0LmMKaW5kZXggYmM5YWQwOC4uMTZhMDg5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1jYWRldC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tY2FkZXQuYwpAQCAtMzAsNyArMzAsNiBAQAogICoJCUNoYW5nZWQgQVBJIHRvIFY0TDIKICAqLwogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgkvKiBNb2R1bGVzIAkJCSovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgkJLyogSW5pdGRhdGEJCQkqLwogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgkvKiByZXF1ZXN0X3JlZ2lvbgkJKi8KQEAgLTQ2LDYgKzQ1LDcgQEAKIE1PRFVMRV9BVVRIT1IoIkZyZWQgR2xlYXNvbiwgUnVzc2VsbCBLcm9sbCwgUXVheSBMdSwgRG9uYWxkIFNvbmcsIEphc29uIExld2lzLCBTY290dCBNY0dyYXRoLCBXaWxsaWFtIE1jR3JhdGgiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQSBkcml2ZXIgZm9yIHRoZSBBRFMgQ2FkZXQgQU0vRk0vUkRTIHJhZGlvIGNhcmQuIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiMC4zLjQiKTsKIAogc3RhdGljIGludCBpbyA9IC0xOwkJLyogZGVmYXVsdCB0byBpc2FwbnAgYWN0aXZhdGlvbiAqLwogc3RhdGljIGludCByYWRpb19uciA9IC0xOwpAQCAtNTQsOCArNTQsNiBAQAogTU9EVUxFX1BBUk1fREVTQyhpbywgIkkvTyBhZGRyZXNzIG9mIENhZGV0IGNhcmQgKDB4MzMwLDB4MzMyLDB4MzM0LDB4MzM2LDB4MzM4LDB4MzNhLDB4MzNjLDB4MzNlKSIpOwogbW9kdWxlX3BhcmFtKHJhZGlvX25yLCBpbnQsIDApOwogCi0jZGVmaW5lIENBREVUX1ZFUlNJT04gS0VSTkVMX1ZFUlNJT04oMCwgMywgMykKLQogI2RlZmluZSBSRFNfQlVGRkVSIDI1NgogI2RlZmluZSBSRFNfUlhfRkxBRyAxCiAjZGVmaW5lIE1CU19SWF9GTEFHIDIKQEAgLTM2MSw3ICszNTksNiBAQAogCXN0cmxjcHkodi0+ZHJpdmVyLCAiQURTIENhZGV0Iiwgc2l6ZW9mKHYtPmRyaXZlcikpOwogCXN0cmxjcHkodi0+Y2FyZCwgIkFEUyBDYWRldCIsIHNpemVvZih2LT5jYXJkKSk7CiAJc3RybGNweSh2LT5idXNfaW5mbywgIklTQSIsIHNpemVvZih2LT5idXNfaW5mbykpOwotCXYtPnZlcnNpb24gPSBDQURFVF9WRVJTSU9OOwogCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSIHwgVjRMMl9DQVBfUkFESU8gfAogCQkJICBWNEwyX0NBUF9SRUFEV1JJVEUgfCBWNEwyX0NBUF9SRFNfQ0FQVFVSRTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tZ2VtdGVrLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLWdlbXRlay5jCmluZGV4IDI1OTkzNjQuLmVkYWRjODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tZ2VtdGVrLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1nZW10ZWsuYwpAQCAtMjEsMjEgKzIxLDE5IEBACiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CS8qIHJlcXVlc3RfcmVnaW9uCQkqLwogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CS8qIHVkZWxheQkJCSovCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CS8qIGtlcm5lbCByYWRpbyBzdHJ1Y3RzCQkqLwotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4JLyogZm9yIEtFUk5FTF9WRVJTSU9OIE1BQ1JPCSovCiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgkJLyogb3V0Yiwgb3V0Yl9wCQkJKi8KICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KIAotI2RlZmluZSBSQURJT19WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKDAsIDAsIDMpCi0KIC8qCiAgKiBNb2R1bGUgaW5mby4KICAqLwogCi1NT0RVTEVfQVVUSE9SKCJKb25hcyBNdW5zaW4sIFBla2thIFNlcHDkbmVuIDxwZXh1QGthcHNpLmZpPiIpOworTU9EVUxFX0FVVEhPUigiSm9uYXMgTXVuc2luLCBQZWtrYSBTZXBww6RuZW4gPHBleHVAa2Fwc2kuZmk+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkEgZHJpdmVyIGZvciB0aGUgR2VtVGVrIFJhZGlvIGNhcmQuIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiMC4wLjQiKTsKIAogLyoKICAqIE1vZHVsZSBwYXJhbXMuCkBAIC0zODcsNyArMzg1LDYgQEAKIAlzdHJsY3B5KHYtPmRyaXZlciwgInJhZGlvLWdlbXRlayIsIHNpemVvZih2LT5kcml2ZXIpKTsKIAlzdHJsY3B5KHYtPmNhcmQsICJHZW1UZWsiLCBzaXplb2Yodi0+Y2FyZCkpOwogCXN0cmxjcHkodi0+YnVzX2luZm8sICJJU0EiLCBzaXplb2Yodi0+YnVzX2luZm8pKTsKLQl2LT52ZXJzaW9uID0gUkFESU9fVkVSU0lPTjsKIAl2LT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUiB8IFY0TDJfQ0FQX1JBRElPOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1tYXhpcmFkaW8uYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tbWF4aXJhZGlvLmMKaW5kZXggZTgzZTg0MC4uZjg3MmE1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1tYXhpcmFkaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLW1heGlyYWRpby5jCkBAIC00MCwxNSArNDAsMTggQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4gICAgICAvKiBmb3IgS0VSTkVMX1ZFUlNJT04gTUFDUk8gICAgICovCiAjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CiAKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JIjAuNy44IgorCisKIE1PRFVMRV9BVVRIT1IoIkRpbWl0cm9tYW5vbGFraXMgQXBvc3RvbG9zLCBhcGRpbUBncmVjaWFuLm5ldCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJSYWRpbyBkcml2ZXIgZm9yIHRoZSBHdWlsbGVtb3QgTWF4aSBSYWRpbyBGTTIwMDAgcmFkaW8uIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihEUklWRVJfVkVSU0lPTik7CiAKIHN0YXRpYyBpbnQgcmFkaW9fbnIgPSAtMTsKIG1vZHVsZV9wYXJhbShyYWRpb19uciwgaW50LCAwKTsKQEAgLTU4LDEwICs2MSw2IEBACiBtb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiYWN0aXZhdGVzIGRlYnVnIGluZm8iKTsKIAotI2RlZmluZSBEUklWRVJfVkVSU0lPTgkiMC43NyIKLQotI2RlZmluZSBSQURJT19WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKDAsIDcsIDcpCi0KICNkZWZpbmUgZHByaW50ayhkZXYsIG51bSwgZm10LCBhcmcuLi4pIFwKIAl2NGwyX2RiZyhudW0sIGRlYnVnLCAmZGV2LT52NGwyX2RldiwgZm10LCAjIyBhcmcpCiAKQEAgLTE5NSw3ICsxOTQsNiBAQAogCXN0cmxjcHkodi0+ZHJpdmVyLCAicmFkaW8tbWF4aXJhZGlvIiwgc2l6ZW9mKHYtPmRyaXZlcikpOwogCXN0cmxjcHkodi0+Y2FyZCwgIk1heGkgUmFkaW8gRk0yMDAwIHJhZGlvIiwgc2l6ZW9mKHYtPmNhcmQpKTsKIAlzbnByaW50Zih2LT5idXNfaW5mbywgc2l6ZW9mKHYtPmJ1c19pbmZvKSwgIlBDSTolcyIsIHBjaV9uYW1lKGRldi0+cGRldikpOwotCXYtPnZlcnNpb24gPSBSQURJT19WRVJTSU9OOwogCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSIHwgVjRMMl9DQVBfUkFESU87CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLW1yODAwLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLW1yODAwLmMKaW5kZXggYjNhNjM1Yi4uMTc0MmJkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1tcjgwMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tbXI4MDAuYwpAQCAtNjMsMTggKzYzLDE3IEBACiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgkvKiBmb3IgS0VSTkVMX1ZFUlNJT04gTUFDUk8gKi8KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAvKiBkcml2ZXIgYW5kIG1vZHVsZSBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBEUklWRVJfQVVUSE9SICJBbGV4ZXkgS2xpbW92IDxrbGltb3YubGludXhAZ21haWwuY29tPiIKICNkZWZpbmUgRFJJVkVSX0RFU0MgIkF2ZXJNZWRpYSBNUiA4MDAgVVNCIEZNIHJhZGlvIGRyaXZlciIKLSNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjAuMTEiCi0jZGVmaW5lIFJBRElPX1ZFUlNJT04gS0VSTkVMX1ZFUlNJT04oMCwgMSwgMSkKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjAuMS4yIgogCiBNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOwogTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSSVZFUl9WRVJTSU9OKTsKIAogI2RlZmluZSBVU0JfQU1SQURJT19WRU5ET1IgMHgwN2NhCiAjZGVmaW5lIFVTQl9BTVJBRElPX1BST0RVQ1QgMHhiODAwCkBAIC0zMDEsNyArMzAwLDYgQEAKIAlzdHJsY3B5KHYtPmRyaXZlciwgInJhZGlvLW1yODAwIiwgc2l6ZW9mKHYtPmRyaXZlcikpOwogCXN0cmxjcHkodi0+Y2FyZCwgIkF2ZXJNZWRpYSBNUiA4MDAgVVNCIEZNIFJhZGlvIiwgc2l6ZW9mKHYtPmNhcmQpKTsKIAl1c2JfbWFrZV9wYXRoKHJhZGlvLT51c2JkZXYsIHYtPmJ1c19pbmZvLCBzaXplb2Yodi0+YnVzX2luZm8pKTsKLQl2LT52ZXJzaW9uID0gUkFESU9fVkVSU0lPTjsKIAl2LT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUjsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tcnRyYWNrMi5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1ydHJhY2syLmMKaW5kZXggOGQ2ZWE1OS4uMzYyOGJlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1ydHJhY2syLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1ydHJhY2syLmMKQEAgLTE1LDcgKzE1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgkvKiB1ZGVsYXkJCQkqLwogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgkvKiBrZXJuZWwgcmFkaW8gc3RydWN0cwkJKi8KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4gICAgICAvKiBmb3IgS0VSTkVMX1ZFUlNJT04gTUFDUk8gICAgICovCiAjaW5jbHVkZSA8bGludXgvaW8uaD4JCS8qIG91dGIsIG91dGJfcAkJCSovCiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CkBAIC0yMyw2ICsyMiw3IEBACiBNT0RVTEVfQVVUSE9SKCJCZW4gUGZhZmYiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQSBkcml2ZXIgZm9yIHRoZSBSYWRpb1RyYWNrIElJIHJhZGlvIGNhcmQuIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiMC4wLjMiKTsKIAogI2lmbmRlZiBDT05GSUdfUkFESU9fUlRSQUNLMl9QT1JUCiAjZGVmaW5lIENPTkZJR19SQURJT19SVFJBQ0syX1BPUlQgLTEKQEAgLTM1LDggKzM1LDYgQEAKIE1PRFVMRV9QQVJNX0RFU0MoaW8sICJJL08gYWRkcmVzcyBvZiB0aGUgUmFkaW9UcmFjayBjYXJkICgweDIwYyBvciAweDMwYykiKTsKIG1vZHVsZV9wYXJhbShyYWRpb19uciwgaW50LCAwKTsKIAotI2RlZmluZSBSQURJT19WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKDAsIDAsIDIpCi0KIHN0cnVjdCBydHJhY2syCiB7CiAJc3RydWN0IHY0bDJfZGV2aWNlIHY0bDJfZGV2OwpAQCAtMTIxLDcgKzExOSw2IEBACiAJc3RybGNweSh2LT5kcml2ZXIsICJyYWRpby1ydHJhY2syIiwgc2l6ZW9mKHYtPmRyaXZlcikpOwogCXN0cmxjcHkodi0+Y2FyZCwgIlJhZGlvVHJhY2sgSUkiLCBzaXplb2Yodi0+Y2FyZCkpOwogCXN0cmxjcHkodi0+YnVzX2luZm8sICJJU0EiLCBzaXplb2Yodi0+YnVzX2luZm8pKTsKLQl2LT52ZXJzaW9uID0gUkFESU9fVkVSU0lPTjsKIAl2LT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUiB8IFY0TDJfQ0FQX1JBRElPOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1zZjE2Zm1pLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXNmMTZmbWkuYwppbmRleCBiNWE1Zjg5Li4yMmM1NzQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXNmMTZmbWkuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXNmMTZmbWkuYwpAQCAtMTYsNyArMTYsNiBAQAogICogQ29udmVydGVkIHRvIFY0TDIgQVBJIGJ5IE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPgogICovCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CS8qIF9fc2V0dXAJCQkqLwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgkvKiBNb2R1bGVzIAkJCSovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgkJLyogSW5pdGRhdGEJCQkqLwpAQCAtMzIsNiArMzEsNyBAQAogTU9EVUxFX0FVVEhPUigiUGV0ciBWYW5kcm92ZWMsIHZhbmRyb3ZlQHZjLmN2dXQuY3ogYW5kIE0uIEtpcmt3b29kIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkEgZHJpdmVyIGZvciB0aGUgU0YxNi1GTUkgYW5kIFNGMTYtRk1QIHJhZGlvLiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oIjAuMC4zIik7CiAKIHN0YXRpYyBpbnQgaW8gPSAtMTsKIHN0YXRpYyBpbnQgcmFkaW9fbnIgPSAtMTsKQEAgLTQwLDggKzQwLDYgQEAKIE1PRFVMRV9QQVJNX0RFU0MoaW8sICJJL08gYWRkcmVzcyBvZiB0aGUgU0YxNi1GTUkgb3IgU0YxNi1GTVAgY2FyZCAoMHgyODQgb3IgMHgzODQpIik7CiBtb2R1bGVfcGFyYW0ocmFkaW9fbnIsIGludCwgMCk7CiAKLSNkZWZpbmUgUkFESU9fVkVSU0lPTiBLRVJORUxfVkVSU0lPTigwLCAwLCAyKQotCiBzdHJ1Y3QgZm1pCiB7CiAJc3RydWN0IHY0bDJfZGV2aWNlIHY0bDJfZGV2OwpAQCAtMTM0LDcgKzEzMiw2IEBACiAJc3RybGNweSh2LT5kcml2ZXIsICJyYWRpby1zZjE2Zm1pIiwgc2l6ZW9mKHYtPmRyaXZlcikpOwogCXN0cmxjcHkodi0+Y2FyZCwgIlNGMTYtRk14IHJhZGlvIiwgc2l6ZW9mKHYtPmNhcmQpKTsKIAlzdHJsY3B5KHYtPmJ1c19pbmZvLCAiSVNBIiwgc2l6ZW9mKHYtPmJ1c19pbmZvKSk7Ci0Jdi0+dmVyc2lvbiA9IFJBRElPX1ZFUlNJT047CiAJdi0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVFVORVIgfCBWNEwyX0NBUF9SQURJTzsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tc2YxNmZtcjIuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tc2YxNmZtcjIuYwppbmRleCA4N2JhZDc2Li4yZGQ0ODU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXNmMTZmbXIyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby1zZjE2Zm1yMi5jCkBAIC0xLDQ0MSArMSwyMDkgQEAKLS8qIFNGMTZGTVIyIHJhZGlvIGRyaXZlciBmb3IgTGludXggcmFkaW8gc3VwcG9ydAotICogaGVhdmlseSBiYXNlZCBvbiBmbWkgZHJpdmVyLi4uCi0gKiAoYykgMjAwMC0yMDAyIFppZ2xpbyBGcmVkaWFubywgZnJlZGR5NzdAYW5nZWxmaXJlLmNvbQorLyogU0YxNi1GTVIyIHJhZGlvIGRyaXZlciBmb3IgTGludXgKKyAqIENvcHlyaWdodCAoYykgMjAxMSBPbmRyZWogWmFyeQogICoKLSAqIE5vdGVzIG9uIHRoZSBoYXJkd2FyZQotICoKLSAqICBGcmVxdWVuY3kgY29udHJvbCBpcyBkb25lIGRpZ2l0YWxseSAtLSBpZSBvdXQocG9ydCxlbmNvZGVmcmVxKDk1LjgpKTsKLSAqICBObyB2b2x1bWUgY29udHJvbCAtIG9ubHkgbXV0ZS91bm11dGUgLSB5b3UgaGF2ZSB0byB1c2UgbGluZSB2b2x1bWUKLSAqCi0gKiAgRm9yIHJlYWQgc3RlcmVvL21vbm8geW91IG11c3Qgd2FpdCAwLjEgc2VjIGFmdGVyIHNldCBmcmVxdWVuY3kgYW5kCi0gKiAgY2FyZCB1bm11dGVkIHNvIEkgc2V0IGZyZXF1ZW5jeSBvbiB1bm11dGUKLSAqICBTaWduYWwgaGFuZGxpbmcgc2VlbSB0byB3b3JrIG9ubHkgb24gYXV0b3NjYW5uaW5nIChub3QgaW1wbGVtZW50ZWQpCi0gKgotICogIENvbnZlcnRlZCB0byBWNEwyIEFQSSBieSBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4KKyAqIE9yaWdpbmFsIGRyaXZlciB3YXMgKGMpIDIwMDAtMjAwMiBaaWdsaW8gRnJlZGlhbm8sIGZyZWRkeTc3QGFuZ2VsZmlyZS5jb20KKyAqIGJ1dCBhbG1vc3Qgbm90aGluZyByZW1haW5lZCBoZXJlIGFmdGVyIGNvbnZlcnNpb24gdG8gZ2VuZXJpYyBURUE1NzV4CisgKiBpbXBsZW1lbnRhdGlvbgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgkvKiBNb2R1bGVzIAkJCSovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgkJLyogSW5pdGRhdGEJCQkqLwogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgkvKiByZXF1ZXN0X3JlZ2lvbgkJKi8KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgkvKiB1ZGVsYXkJCQkqLwotI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgkvKiBrZXJuZWwgcmFkaW8gc3RydWN0cwkJKi8KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4gICAgICAvKiBmb3IgS0VSTkVMX1ZFUlNJT04gTUFDUk8gICAgICovCiAjaW5jbHVkZSA8bGludXgvaW8uaD4JCS8qIG91dGIsIG91dGJfcAkJCSovCi0jaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CisjaW5jbHVkZSA8c291bmQvdGVhNTc1eC10dW5lci5oPgogCi1NT0RVTEVfQVVUSE9SKCJaaWdsaW8gRnJlZGlhbm8sIGZyZWRkeTc3QGFuZ2VsZmlyZS5jb20iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQSBkcml2ZXIgZm9yIHRoZSBTRjE2Rk1SMiByYWRpby4iKTsKK01PRFVMRV9BVVRIT1IoIk9uZHJlaiBaYXJ5Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1lZGlhRm9ydGUgU0YxNi1GTVIyIEZNIHJhZGlvIGNhcmQgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKLXN0YXRpYyBpbnQgaW8gPSAweDM4NDsKLXN0YXRpYyBpbnQgcmFkaW9fbnIgPSAtMTsKLQotbW9kdWxlX3BhcmFtKGlvLCBpbnQsIDApOwotTU9EVUxFX1BBUk1fREVTQyhpbywgIkkvTyBhZGRyZXNzIG9mIHRoZSBTRjE2Rk1SMiBjYXJkIChzaG91bGQgYmUgMHgzODQsIGlmIGRvIG5vdCB3b3JrIHRyeSAweDI4NCkiKTsKLW1vZHVsZV9wYXJhbShyYWRpb19uciwgaW50LCAwKTsKLQotI2RlZmluZSBSQURJT19WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKDAsMCwyKQotCi0jZGVmaW5lIEFVRF9WT0xfSU5ERVggMQotCi0jdW5kZWYgREVCVUcKLS8vI2RlZmluZSBERUJVRyAxCi0KLSNpZmRlZiBERUJVRwotIyBkZWZpbmUgIGRlYnVnX3ByaW50KHMpIHByaW50ayBzCi0jZWxzZQotIyBkZWZpbmUgIGRlYnVnX3ByaW50KHMpCi0jZW5kaWYKLQotLyogdGhpcyBzaG91bGQgYmUgc3RhdGljIHZhcnMgZm9yIG1vZHVsZSBzaXplICovCi1zdHJ1Y3QgZm1yMgotewotCXN0cnVjdCB2NGwyX2RldmljZSB2NGwyX2RldjsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlIHZkZXY7Ci0Jc3RydWN0IG11dGV4IGxvY2s7CitzdHJ1Y3QgZm1yMiB7CiAJaW50IGlvOwotCWludCBjdXJ2b2w7IC8qIDAtMTUgKi8KLQlpbnQgbXV0ZTsKLQlpbnQgc3RlcmVvOyAvKiBjYXJkIGlzIHByb2R1Y2luZyBzdGVyZW8gYXVkaW8gKi8KLQl1bnNpZ25lZCBsb25nIGN1cmZyZXE7IC8qIGZyZXEgaW4ga0h6ICovCi0JaW50IGNhcmRfdHlwZTsKKwlzdHJ1Y3Qgc25kX3RlYTU3NXggdGVhOworCXN0cnVjdCB2NGwyX2N0cmwgKnZvbHVtZTsKKwlzdHJ1Y3QgdjRsMl9jdHJsICpiYWxhbmNlOwogfTsKIAorLyogdGhlIHBvcnQgaXMgaGFyZHdpcmVkIHNvIG5vIG5lZWQgdG8gc3VwcG9ydCBtdWx0aXBsZSBjYXJkcyAqLworI2RlZmluZSBGTVIyX1BPUlQJMHgzODQKIHN0YXRpYyBzdHJ1Y3QgZm1yMiBmbXIyX2NhcmQ7CiAKLS8qIGh3IHByZWNpc2lvbiBpcyAxMi41IGtIegotICogSXQgaXMgb25seSB1c2VmdWwgdG8gZ2l2ZSBmcmVxIGluIGludGVydmFsIG9mIDIwMCAoPTAuMDEyNU1oeiksCi0gKiBvdGhlciBiaXRzIHdpbGwgYmUgdHJ1bmNhdGVkCi0gKi8KLSNkZWZpbmUgUlNGMTZfRU5DT0RFKHgpCSgoeCkgLyAyMDAgKyA4NTYpCi0jZGVmaW5lIFJTRjE2X01JTkZSRVEgKDg3ICogMTYwMDApCi0jZGVmaW5lIFJTRjE2X01BWEZSRVEgKDEwOCAqIDE2MDAwKQorLyogVEVBNTc1eCB0dW5lciBwaW5zICovCisjZGVmaW5lIFNUUl9EQVRBCSgxIDw8IDApCisjZGVmaW5lIFNUUl9DTEsJCSgxIDw8IDEpCisjZGVmaW5lIFNUUl9XUkVOCSgxIDw8IDIpCisjZGVmaW5lIFNUUl9NT1NUCSgxIDw8IDMpCisvKiBQVDIyNTRBL1RDOTE1NEEgdm9sdW1lIGNvbnRyb2wgcGlucyAqLworI2RlZmluZSBQVF9TVAkJKDEgPDwgNCkKKyNkZWZpbmUgUFRfQ0sJCSgxIDw8IDUpCisjZGVmaW5lIFBUX0RBVEEJCSgxIDw8IDYpCisvKiB2b2x1bWUgY29udHJvbCBwcmVzZW5jZSBwaW4gKi8KKyNkZWZpbmUgRk1SMl9IQVNWT0wJKDEgPDwgNykKIAotc3RhdGljIGlubGluZSB2b2lkIHdhaXQoaW50IG4sIGludCBpbykKK3N0YXRpYyB2b2lkIGZtcjJfdGVhNTc1eF9zZXRfcGlucyhzdHJ1Y3Qgc25kX3RlYTU3NXggKnRlYSwgdTggcGlucykKIHsKLQlmb3IgKDsgbjsgLS1uKQotCQlpbmIoaW8pOworCXN0cnVjdCBmbXIyICpmbXIyID0gdGVhLT5wcml2YXRlX2RhdGE7CisJdTggYml0cyA9IDA7CisKKwliaXRzIHw9IChwaW5zICYgVEVBNTc1WF9EQVRBKSA/IFNUUl9EQVRBIDogMDsKKwliaXRzIHw9IChwaW5zICYgVEVBNTc1WF9DTEspICA/IFNUUl9DTEsgIDogMDsKKwkvKiBXUklURV9FTkFCTEUgaXMgaW52ZXJ0ZWQsIERBVEEgbXVzdCBiZSBoaWdoIGR1cmluZyByZWFkICovCisJYml0cyB8PSAocGlucyAmIFRFQTU3NVhfV1JFTikgPyAwIDogU1RSX1dSRU4gfCBTVFJfREFUQTsKKworCW91dGIoYml0cywgZm1yMi0+aW8pOwogfQogCi1zdGF0aWMgdm9pZCBvdXRiaXRzKGludCBiaXRzLCB1bnNpZ25lZCBpbnQgZGF0YSwgaW50IG5XYWl0LCBpbnQgaW8pCitzdGF0aWMgdTggZm1yMl90ZWE1NzV4X2dldF9waW5zKHN0cnVjdCBzbmRfdGVhNTc1eCAqdGVhKQogewotCWludCBiaXQ7CisJc3RydWN0IGZtcjIgKmZtcjIgPSB0ZWEtPnByaXZhdGVfZGF0YTsKKwl1OCBiaXRzID0gaW5iKGZtcjItPmlvKTsKIAotCWZvciAoOyAtLWJpdHMgPj0gMDspIHsKLQkJYml0ID0gKGRhdGEgPj4gYml0cykgJiAxOwotCQlvdXRiKGJpdCwgaW8pOwotCQl3YWl0KG5XYWl0LCBpbyk7Ci0JCW91dGIoYml0IHwgMiwgaW8pOwotCQl3YWl0KG5XYWl0LCBpbyk7Ci0JCW91dGIoYml0LCBpbyk7Ci0JCXdhaXQobldhaXQsIGlvKTsKKwlyZXR1cm4gIChiaXRzICYgU1RSX0RBVEEpID8gVEVBNTc1WF9EQVRBIDogMCB8CisJCShiaXRzICYgU1RSX01PU1QpID8gVEVBNTc1WF9NT1NUIDogMDsKK30KKworc3RhdGljIHZvaWQgZm1yMl90ZWE1NzV4X3NldF9kaXJlY3Rpb24oc3RydWN0IHNuZF90ZWE1NzV4ICp0ZWEsIGJvb2wgb3V0cHV0KQoreworfQorCitzdGF0aWMgc3RydWN0IHNuZF90ZWE1NzV4X29wcyBmbXIyX3RlYV9vcHMgPSB7CisJLnNldF9waW5zID0gZm1yMl90ZWE1NzV4X3NldF9waW5zLAorCS5nZXRfcGlucyA9IGZtcjJfdGVhNTc1eF9nZXRfcGlucywKKwkuc2V0X2RpcmVjdGlvbiA9IGZtcjJfdGVhNTc1eF9zZXRfZGlyZWN0aW9uLAorfTsKKworLyogVEM5MTU0QS9QVDIyNTRBIHZvbHVtZSBjb250cm9sICovCisKKy8qIDE4LWJpdCBzaGlmdCByZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgVEM5MTU0QV9BVFRfTUFKXzBEQgkoMSA8PCAwKQorI2RlZmluZSBUQzkxNTRBX0FUVF9NQUpfMTBEQgkoMSA8PCAxKQorI2RlZmluZSBUQzkxNTRBX0FUVF9NQUpfMjBEQgkoMSA8PCAyKQorI2RlZmluZSBUQzkxNTRBX0FUVF9NQUpfMzBEQgkoMSA8PCAzKQorI2RlZmluZSBUQzkxNTRBX0FUVF9NQUpfNDBEQgkoMSA8PCA0KQorI2RlZmluZSBUQzkxNTRBX0FUVF9NQUpfNTBEQgkoMSA8PCA1KQorI2RlZmluZSBUQzkxNTRBX0FUVF9NQUpfNjBEQgkoMSA8PCA2KQorCisjZGVmaW5lIFRDOTE1NEFfQVRUX01JTl8wREIJKDEgPDwgNykKKyNkZWZpbmUgVEM5MTU0QV9BVFRfTUlOXzJEQgkoMSA8PCA4KQorI2RlZmluZSBUQzkxNTRBX0FUVF9NSU5fNERCCSgxIDw8IDkpCisjZGVmaW5lIFRDOTE1NEFfQVRUX01JTl82REIJKDEgPDwgMTApCisjZGVmaW5lIFRDOTE1NEFfQVRUX01JTl84REIJKDEgPDwgMTEpCisvKiBiaXQgMTIgaXMgaWdub3JlZCAqLworI2RlZmluZSBUQzkxNTRBX0NIQU5ORUxfTEVGVAkoMSA8PCAxMykKKyNkZWZpbmUgVEM5MTU0QV9DSEFOTkVMX1JJR0hUCSgxIDw8IDE0KQorLyogYml0cyAxNSwgMTYsIDE3IG11c3QgYmUgMCAqLworCisjZGVmaW5lCVRDOTE1NEFfQVRUX01BSih4KQkoMSA8PCB4KQorI2RlZmluZSBUQzkxNTRBX0FUVF9NSU4oeCkJKDEgPDwgKDcgKyB4KSkKKworc3RhdGljIHZvaWQgdGM5MTU0YV9zZXRfcGlucyhzdHJ1Y3QgZm1yMiAqZm1yMiwgdTggcGlucykKK3sKKwlpZiAoIWZtcjItPnRlYS5tdXRlKQorCQlwaW5zIHw9IFNUUl9XUkVOOworCisJb3V0YihwaW5zLCBmbXIyLT5pbyk7Cit9CisKK3N0YXRpYyB2b2lkIHRjOTE1NGFfc2V0X2F0dGVudWF0aW9uKHN0cnVjdCBmbXIyICpmbXIyLCBpbnQgYXR0LCB1MzIgY2hhbm5lbCkKK3sKKwlpbnQgaTsKKwl1MzIgcmVnOworCXU4IGJpdDsKKworCXJlZyA9IFRDOTE1NEFfQVRUX01BSihhdHQgLyAxMCkgfCBUQzkxNTRBX0FUVF9NSU4oKGF0dCAlIDEwKSAvIDIpOworCXJlZyB8PSBjaGFubmVsOworCS8qIHdyaXRlIDE4LWJpdCBzaGlmdCByZWdpc3RlciwgTFNCIGZpcnN0ICovCisJZm9yIChpID0gMDsgaSA8IDE4OyBpKyspIHsKKwkJYml0ID0gcmVnICYgKDEgPDwgaSkgPyBQVF9EQVRBIDogMDsKKwkJdGM5MTU0YV9zZXRfcGlucyhmbXIyLCBiaXQpOworCQl1ZGVsYXkoNSk7CisJCXRjOTE1NGFfc2V0X3BpbnMoZm1yMiwgYml0IHwgUFRfQ0spOworCQl1ZGVsYXkoNSk7CisJCXRjOTE1NGFfc2V0X3BpbnMoZm1yMiwgYml0KTsKIAl9CisKKwkvKiBsYXRjaCByZWdpc3RlciBkYXRhICovCisJdWRlbGF5KDUpOworCXRjOTE1NGFfc2V0X3BpbnMoZm1yMiwgUFRfU1QpOworCXVkZWxheSg1KTsKKwl0YzkxNTRhX3NldF9waW5zKGZtcjIsIDApOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZm1yMl9tdXRlKGludCBpbykKK3N0YXRpYyBpbnQgZm1yMl9zX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKIHsKLQlvdXRiKDB4MDAsIGlvKTsKLQl3YWl0KDQsIGlvKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGZtcjJfdW5tdXRlKGludCBpbykKLXsKLQlvdXRiKDB4MDQsIGlvKTsKLQl3YWl0KDQsIGlvKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgZm1yMl9zdGVyZW9fbW9kZShpbnQgaW8pCi17Ci0JaW50IG4gPSBpbmIoaW8pOwotCi0Jb3V0Yig2LCBpbyk7Ci0JaW5iKGlvKTsKLQluID0gKChuID4+IDMpICYgMSkgXiAxOwotCWRlYnVnX3ByaW50KChLRVJOX0RFQlVHICJzdGVyZW86ICVkXG4iLCBuKSk7Ci0JcmV0dXJuIG47Ci19Ci0KLXN0YXRpYyBpbnQgZm1yMl9wcm9kdWN0X2luZm8oc3RydWN0IGZtcjIgKmRldikKLXsKLQlpbnQgbiA9IGluYihkZXYtPmlvKTsKLQotCW4gJj0gMHhDMTsKLQlpZiAobiA9PSAwKSB7Ci0JCS8qIHRoaXMgc2hvdWxkIHN1cHBvcnQgdm9sdW1lIHNldCAqLwotCQlkZXYtPmNhcmRfdHlwZSA9IDEyOwotCQlyZXR1cm4gMDsKLQl9Ci0JLyogbm90IHZvbHVtZSAobWluZSBpcyAxMSkgKi8KLQlkZXYtPmNhcmRfdHlwZSA9IChuID09IDEyOCkgPyAxMSA6IDA7Ci0JcmV0dXJuIG47Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGZtcjJfZ2V0c2lnc3RyKHN0cnVjdCBmbXIyICpkZXYpCi17Ci0JLyogISEhIHdvcmtzIG9ubHkgaWYgc2Nhbm5pbmcgZnJlcSAqLwotCWludCByZXMgPSAweGZmZmY7Ci0KLQlvdXRiKDUsIGRldi0+aW8pOwotCXdhaXQoNCwgZGV2LT5pbyk7Ci0JaWYgKCEoaW5iKGRldi0+aW8pICYgMSkpCi0JCXJlcyA9IDA7Ci0JZGVidWdfcHJpbnQoKEtFUk5fREVCVUcgInNpZ25hbDogJWRcbiIsIHJlcykpOwotCXJldHVybiByZXM7Ci19Ci0KLS8qIHNldCBmcmVxdWVuY3kgYW5kIHVubXV0ZSBjYXJkICovCi1zdGF0aWMgaW50IGZtcjJfc2V0ZnJlcShzdHJ1Y3QgZm1yMiAqZGV2KQotewotCXVuc2lnbmVkIGxvbmcgZnJlcSA9IGRldi0+Y3VyZnJlcTsKLQotCWZtcjJfbXV0ZShkZXYtPmlvKTsKLQotCS8qIDB4NDIgZm9yIG1vbm8gb3V0cHV0Ci0JICogMHgxMDIgZm9yd2FyZCBzY2FubmluZwotCSAqIDB4MTgyIHNjYW5zaW9uZSBhdmFudGkKLQkgKi8KLQlvdXRiaXRzKDksIDB4MiwgMywgZGV2LT5pbyk7Ci0Jb3V0Yml0cygxNiwgUlNGMTZfRU5DT0RFKGZyZXEpLCAyLCBkZXYtPmlvKTsKLQotCWZtcjJfdW5tdXRlKGRldi0+aW8pOwotCi0JLyogd2FpdCAwLjExIHNlYyAqLwotCW1zbGVlcCgxMTApOwotCi0JLyogTk9URSBpZiBtdXRlIHRoaXMgc3RvcCByYWRpbwotCSAgIHlvdSBtdXN0IHNldCBmcmVxIG9uIHVubXV0ZSAqLwotCWRldi0+c3RlcmVvID0gZm1yMl9zdGVyZW9fbW9kZShkZXYtPmlvKTsKLQlyZXR1cm4gMDsKLX0KLQotLyogISEhIG5vdCB0ZXN0ZWQsIGluIG15IGNhcmQgdGhpcyBkb2Vzbid0IHdvcmsgISEhICovCi1zdGF0aWMgaW50IGZtcjJfc2V0dm9sdW1lKHN0cnVjdCBmbXIyICpkZXYpCi17Ci0JaW50IHZvbFsxNl0gPSB7IDB4MDIxLCAweDA4NCwgMHgwOTAsIDB4MTA0LAotCQkJMHgxMTAsIDB4MjA0LCAweDIxMCwgMHg0MDIsCi0JCQkweDQwNCwgMHg0MDgsIDB4NDEwLCAweDgwMSwKLQkJCTB4ODAyLCAweDgwNCwgMHg4MDgsIDB4ODEwIH07Ci0JaW50IGksIGE7Ci0JaW50IG4gPSB2b2xbZGV2LT5jdXJ2b2wgJiAweDBmXTsKLQotCWlmIChkZXYtPmNhcmRfdHlwZSAhPSAxMSkKLQkJcmV0dXJuIDE7Ci0KLQlmb3IgKGkgPSAxMjsgLS1pID49IDA7ICkgewotCQlhID0gKChuID4+IGkpICYgMSkgPDwgNjsgLyogaWYgKGE9PTApIGEgPSAwOyBlbHNlIGEgPSAweDQwOyAqLwotCQlvdXRiKGEgfCA0LCBkZXYtPmlvKTsKLQkJd2FpdCg0LCBkZXYtPmlvKTsKLQkJb3V0YihhIHwgMHgyNCwgZGV2LT5pbyk7Ci0JCXdhaXQoNCwgZGV2LT5pbyk7Ci0JCW91dGIoYSB8IDQsIGRldi0+aW8pOwotCQl3YWl0KDQsIGRldi0+aW8pOwotCX0KLQlmb3IgKGkgPSA2OyAtLWkgPj0gMDsgKSB7Ci0JCWEgPSAoKDB4MTggPj4gaSkgJiAxKSA8PCA2OwotCQlvdXRiKGEgfCA0LCBkZXYtPmlvKTsKLQkJd2FpdCg0LCBkZXYtPmlvKTsKLQkJb3V0YihhIHwgMHgyNCwgZGV2LT5pbyk7Ci0JCXdhaXQoNCwgZGV2LT5pbyk7Ci0JCW91dGIoYSB8IDQsIGRldi0+aW8pOwotCQl3YWl0KDQsIGRldi0+aW8pOwotCX0KLQl3YWl0KDQsIGRldi0+aW8pOwotCW91dGIoMHgxNCwgZGV2LT5pbyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICAqcHJpdiwKLQkJCQkJc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqdikKLXsKLQlzdHJsY3B5KHYtPmRyaXZlciwgInJhZGlvLXNmMTZmbXIyIiwgc2l6ZW9mKHYtPmRyaXZlcikpOwotCXN0cmxjcHkodi0+Y2FyZCwgIlNGMTYtRk1SMiByYWRpbyIsIHNpemVvZih2LT5jYXJkKSk7Ci0Jc3RybGNweSh2LT5idXNfaW5mbywgIklTQSIsIHNpemVvZih2LT5idXNfaW5mbykpOwotCXYtPnZlcnNpb24gPSBSQURJT19WRVJTSU9OOwotCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSIHwgVjRMMl9DQVBfUkFESU87Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX2dfdHVuZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJCXN0cnVjdCB2NGwyX3R1bmVyICp2KQotewotCXN0cnVjdCBmbXIyICpmbXIyID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKLQotCWlmICh2LT5pbmRleCA+IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3RybGNweSh2LT5uYW1lLCAiRk0iLCBzaXplb2Yodi0+bmFtZSkpOwotCXYtPnR5cGUgPSBWNEwyX1RVTkVSX1JBRElPOwotCi0Jdi0+cmFuZ2Vsb3cgPSBSU0YxNl9NSU5GUkVROwotCXYtPnJhbmdlaGlnaCA9IFJTRjE2X01BWEZSRVE7Ci0Jdi0+cnhzdWJjaGFucyA9IGZtcjItPnN0ZXJlbyA/IFY0TDJfVFVORVJfU1VCX1NURVJFTyA6Ci0JCQkJCVY0TDJfVFVORVJfU1VCX01PTk87Ci0Jdi0+Y2FwYWJpbGl0eSA9IFY0TDJfVFVORVJfQ0FQX1NURVJFTyB8IFY0TDJfVFVORVJfQ0FQX0xPVzsKLQl2LT5hdWRtb2RlID0gVjRMMl9UVU5FUl9NT0RFX1NURVJFTzsKLQltdXRleF9sb2NrKCZmbXIyLT5sb2NrKTsKLQl2LT5zaWduYWwgPSBmbXIyX2dldHNpZ3N0cihmbXIyKTsKLQltdXRleF91bmxvY2soJmZtcjItPmxvY2spOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zX3R1bmVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCQlzdHJ1Y3QgdjRsMl90dW5lciAqdikKLXsKLQlyZXR1cm4gdi0+aW5kZXggPyAtRUlOVkFMIDogMDsKLX0KLQotc3RhdGljIGludCB2aWRpb2Nfc19mcmVxdWVuY3koc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJCXN0cnVjdCB2NGwyX2ZyZXF1ZW5jeSAqZikKLXsKLQlzdHJ1Y3QgZm1yMiAqZm1yMiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7Ci0KLQlpZiAoZi0+dHVuZXIgIT0gMCB8fCBmLT50eXBlICE9IFY0TDJfVFVORVJfUkFESU8pCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChmLT5mcmVxdWVuY3kgPCBSU0YxNl9NSU5GUkVRIHx8Ci0JCQlmLT5mcmVxdWVuY3kgPiBSU0YxNl9NQVhGUkVRKQotCQlyZXR1cm4gLUVJTlZBTDsKLQkvKiByb3VuZGluZyBpbiBzdGVwcyBvZiAyMDAgdG8gbWF0Y2ggdGhlIGZyZXEKLQkgICB0aGF0IHdpbGwgYmUgdXNlZCAqLwotCWZtcjItPmN1cmZyZXEgPSAoZi0+ZnJlcXVlbmN5IC8gMjAwKSAqIDIwMDsKLQotCS8qIHNldCBjYXJkIGZyZXEgKGlmIG5vdCBtdXRlZCkgKi8KLQlpZiAoZm1yMi0+Y3Vydm9sICYmICFmbXIyLT5tdXRlKSB7Ci0JCW11dGV4X2xvY2soJmZtcjItPmxvY2spOwotCQlmbXIyX3NldGZyZXEoZm1yMik7Ci0JCW11dGV4X3VubG9jaygmZm1yMi0+bG9jayk7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19nX2ZyZXF1ZW5jeShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQkJc3RydWN0IHY0bDJfZnJlcXVlbmN5ICpmKQotewotCXN0cnVjdCBmbXIyICpmbXIyID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKLQotCWlmIChmLT50dW5lciAhPSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlmLT50eXBlID0gVjRMMl9UVU5FUl9SQURJTzsKLQlmLT5mcmVxdWVuY3kgPSBmbXIyLT5jdXJmcmVxOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19xdWVyeWN0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMpCi17Ci0Jc3RydWN0IGZtcjIgKmZtcjIgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwotCi0Jc3dpdGNoIChxYy0+aWQpIHsKLQljYXNlIFY0TDJfQ0lEX0FVRElPX01VVEU6Ci0JCXJldHVybiB2NGwyX2N0cmxfcXVlcnlfZmlsbChxYywgMCwgMSwgMSwgMSk7Ci0JY2FzZSBWNEwyX0NJRF9BVURJT19WT0xVTUU6Ci0JCS8qIE9ubHkgY2FyZF90eXBlID09IDExIGltcGxlbWVudHMgdm9sdW1lICovCi0JCWlmIChmbXIyLT5jYXJkX3R5cGUgPT0gMTEpCi0JCQlyZXR1cm4gdjRsMl9jdHJsX3F1ZXJ5X2ZpbGwocWMsIDAsIDE1LCAxLCAwKTsKLQkJcmV0dXJuIHY0bDJfY3RybF9xdWVyeV9maWxsKHFjLCAwLCAxLCAxLCAwKTsKLQl9Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX2dfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKLXsKLQlzdHJ1Y3QgZm1yMiAqZm1yMiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IHNuZF90ZWE1NzV4ICp0ZWEgPSBjb250YWluZXJfb2YoY3RybC0+aGFuZGxlciwgc3RydWN0IHNuZF90ZWE1NzV4LCBjdHJsX2hhbmRsZXIpOworCXN0cnVjdCBmbXIyICpmbXIyID0gdGVhLT5wcml2YXRlX2RhdGE7CisJaW50IHZvbHVtZSwgYmFsYW5jZSwgbGVmdCwgcmlnaHQ7CiAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7Ci0JY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgotCQljdHJsLT52YWx1ZSA9IGZtcjItPm11dGU7Ci0JCXJldHVybiAwOwogCWNhc2UgVjRMMl9DSURfQVVESU9fVk9MVU1FOgotCQljdHJsLT52YWx1ZSA9IGZtcjItPmN1cnZvbDsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zX2N0cmwoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCi17Ci0Jc3RydWN0IGZtcjIgKmZtcjIgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwotCi0Jc3dpdGNoIChjdHJsLT5pZCkgewotCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKLQkJZm1yMi0+bXV0ZSA9IGN0cmwtPnZhbHVlOworCQl2b2x1bWUgPSBjdHJsLT52YWw7CisJCWJhbGFuY2UgPSBmbXIyLT5iYWxhbmNlLT5jdXIudmFsOwogCQlicmVhazsKLQljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKLQkJZm1yMi0+Y3Vydm9sID0gY3RybC0+dmFsdWU7CisJY2FzZSBWNEwyX0NJRF9BVURJT19CQUxBTkNFOgorCQliYWxhbmNlID0gY3RybC0+dmFsOworCQl2b2x1bWUgPSBmbXIyLT52b2x1bWUtPmN1ci52YWw7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotI2lmZGVmIERFQlVHCi0JaWYgKGZtcjItPmN1cnZvbCAmJiAhZm1yMi0+bXV0ZSkKLQkJcHJpbnRrKEtFUk5fREVCVUcgInVubXV0ZVxuIik7Ci0JZWxzZQotCQlwcmludGsoS0VSTl9ERUJVRyAibXV0ZVxuIik7Ci0jZW5kaWYKKwlsZWZ0ID0gcmlnaHQgPSB2b2x1bWU7CisJaWYgKGJhbGFuY2UgPCAwKQorCQlyaWdodCA9IG1heCgwLCByaWdodCArIGJhbGFuY2UpOworCWlmIChiYWxhbmNlID4gMCkKKwkJbGVmdCA9IG1heCgwLCBsZWZ0IC0gYmFsYW5jZSk7CiAKLQltdXRleF9sb2NrKCZmbXIyLT5sb2NrKTsKLQlpZiAoZm1yMi0+Y3Vydm9sICYmICFmbXIyLT5tdXRlKSB7Ci0JCWZtcjJfc2V0dm9sdW1lKGZtcjIpOwotCQkvKiBTZXQgZnJlcXVlbmN5IGFuZCB1bm11dGUgY2FyZCAqLwotCQlmbXIyX3NldGZyZXEoZm1yMik7Ci0JfSBlbHNlCi0JCWZtcjJfbXV0ZShmbXIyLT5pbyk7Ci0JbXV0ZXhfdW5sb2NrKCZmbXIyLT5sb2NrKTsKKwl0YzkxNTRhX3NldF9hdHRlbnVhdGlvbihmbXIyLCBhYnMobGVmdCAtIDY4KSwgVEM5MTU0QV9DSEFOTkVMX0xFRlQpOworCXRjOTE1NGFfc2V0X2F0dGVudWF0aW9uKGZtcjIsIGFicyhyaWdodCAtIDY4KSwgVEM5MTU0QV9DSEFOTkVMX1JJR0hUKTsKKwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHZpZGlvY19nX2lucHV0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgKmkpCi17Ci0JKmkgPSAwOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zX2lucHV0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgaSkKLXsKLQlyZXR1cm4gaSA/IC1FSU5WQUwgOiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19nX2F1ZGlvKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQkJCQlzdHJ1Y3QgdjRsMl9hdWRpbyAqYSkKLXsKLQlhLT5pbmRleCA9IDA7Ci0Jc3RybGNweShhLT5uYW1lLCAiUmFkaW8iLCBzaXplb2YoYS0+bmFtZSkpOwotCWEtPmNhcGFiaWxpdHkgPSBWNEwyX0FVRENBUF9TVEVSRU87Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX3NfYXVkaW8oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCQkJCXN0cnVjdCB2NGwyX2F1ZGlvICphKQotewotCXJldHVybiBhLT5pbmRleCA/IC1FSU5WQUwgOiAwOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIGZtcjJfZm9wcyA9IHsKLQkub3duZXIgICAgICAgICAgPSBUSElTX01PRFVMRSwKLQkudW5sb2NrZWRfaW9jdGwgPSB2aWRlb19pb2N0bDIsCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9vcHMgZm1yMl9jdHJsX29wcyA9IHsKKwkuc19jdHJsID0gZm1yMl9zX2N0cmwsCiB9OwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIGZtcjJfaW9jdGxfb3BzID0gewotCS52aWRpb2NfcXVlcnljYXAgICAgPSB2aWRpb2NfcXVlcnljYXAsCi0JLnZpZGlvY19nX3R1bmVyICAgICA9IHZpZGlvY19nX3R1bmVyLAotCS52aWRpb2Nfc190dW5lciAgICAgPSB2aWRpb2Nfc190dW5lciwKLQkudmlkaW9jX2dfYXVkaW8gICAgID0gdmlkaW9jX2dfYXVkaW8sCi0JLnZpZGlvY19zX2F1ZGlvICAgICA9IHZpZGlvY19zX2F1ZGlvLAotCS52aWRpb2NfZ19pbnB1dCAgICAgPSB2aWRpb2NfZ19pbnB1dCwKLQkudmlkaW9jX3NfaW5wdXQgICAgID0gdmlkaW9jX3NfaW5wdXQsCi0JLnZpZGlvY19nX2ZyZXF1ZW5jeSA9IHZpZGlvY19nX2ZyZXF1ZW5jeSwKLQkudmlkaW9jX3NfZnJlcXVlbmN5ID0gdmlkaW9jX3NfZnJlcXVlbmN5LAotCS52aWRpb2NfcXVlcnljdHJsICAgPSB2aWRpb2NfcXVlcnljdHJsLAotCS52aWRpb2NfZ19jdHJsICAgICAgPSB2aWRpb2NfZ19jdHJsLAotCS52aWRpb2Nfc19jdHJsICAgICAgPSB2aWRpb2Nfc19jdHJsLAotfTsKK3N0YXRpYyBpbnQgZm1yMl90ZWFfZXh0X2luaXQoc3RydWN0IHNuZF90ZWE1NzV4ICp0ZWEpCit7CisJc3RydWN0IGZtcjIgKmZtcjIgPSB0ZWEtPnByaXZhdGVfZGF0YTsKKworCWlmIChpbmIoZm1yMi0+aW8pICYgRk1SMl9IQVNWT0wpIHsKKwkJZm1yMi0+dm9sdW1lID0gdjRsMl9jdHJsX25ld19zdGQoJnRlYS0+Y3RybF9oYW5kbGVyLCAmZm1yMl9jdHJsX29wcywgVjRMMl9DSURfQVVESU9fVk9MVU1FLCAwLCA2OCwgMiwgNTYpOworCQlmbXIyLT5iYWxhbmNlID0gdjRsMl9jdHJsX25ld19zdGQoJnRlYS0+Y3RybF9oYW5kbGVyLCAmZm1yMl9jdHJsX29wcywgVjRMMl9DSURfQVVESU9fQkFMQU5DRSwgLTY4LCA2OCwgMiwgMCk7CisJCWlmICh0ZWEtPmN0cmxfaGFuZGxlci5lcnJvcikgeworCQkJcHJpbnRrKEtFUk5fRVJSICJyYWRpby1zZjE2Zm1yMjogY2FuJ3QgaW5pdGlhbGl6ZSBjb250cmxzXG4iKTsKKwkJCXJldHVybiB0ZWEtPmN0cmxfaGFuZGxlci5lcnJvcjsKKwkJfQorCX0KKworCXJldHVybiAwOworfQogCiBzdGF0aWMgaW50IF9faW5pdCBmbXIyX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgZm1yMiAqZm1yMiA9ICZmbXIyX2NhcmQ7Ci0Jc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldiA9ICZmbXIyLT52NGwyX2RldjsKLQlpbnQgcmVzOwogCi0Jc3RybGNweSh2NGwyX2Rldi0+bmFtZSwgInNmMTZmbXIyIiwgc2l6ZW9mKHY0bDJfZGV2LT5uYW1lKSk7Ci0JZm1yMi0+aW8gPSBpbzsKLQlmbXIyLT5zdGVyZW8gPSAxOwotCW11dGV4X2luaXQoJmZtcjItPmxvY2spOworCWZtcjItPmlvID0gRk1SMl9QT1JUOwogCi0JaWYgKCFyZXF1ZXN0X3JlZ2lvbihmbXIyLT5pbywgMiwgInNmMTZmbXIyIikpIHsKLQkJdjRsMl9lcnIodjRsMl9kZXYsICJyZXF1ZXN0X3JlZ2lvbiBmYWlsZWQhXG4iKTsKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGZtcjItPmlvLCAyLCAiU0YxNi1GTVIyIikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJyYWRpby1zZjE2Zm1yMjogSS9PIHBvcnQgMHgleCBhbHJlYWR5IGluIHVzZVxuIiwgZm1yMi0+aW8pOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAotCXJlcyA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyKE5VTEwsIHY0bDJfZGV2KTsKLQlpZiAocmVzIDwgMCkgeworCWZtcjItPnRlYS5wcml2YXRlX2RhdGEgPSBmbXIyOworCWZtcjItPnRlYS5vcHMgPSAmZm1yMl90ZWFfb3BzOworCWZtcjItPnRlYS5leHRfaW5pdCA9IGZtcjJfdGVhX2V4dF9pbml0OworCXN0cmxjcHkoZm1yMi0+dGVhLmNhcmQsICJTRjE2LUZNUjIiLCBzaXplb2YoZm1yMi0+dGVhLmNhcmQpKTsKKwlzdHJjcHkoZm1yMi0+dGVhLmJ1c19pbmZvLCAiSVNBIik7CisKKwlpZiAoc25kX3RlYTU3NXhfaW5pdCgmZm1yMi0+dGVhKSkgeworCQlwcmludGsoS0VSTl9FUlIgInJhZGlvLXNmMTZmbXIyOiBVbmFibGUgdG8gZGV0ZWN0IFRFQTU3NXggdHVuZXJcbiIpOwogCQlyZWxlYXNlX3JlZ2lvbihmbXIyLT5pbywgMik7Ci0JCXY0bDJfZXJyKHY0bDJfZGV2LCAiQ291bGQgbm90IHJlZ2lzdGVyIHY0bDJfZGV2aWNlXG4iKTsKLQkJcmV0dXJuIHJlczsKKwkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0Jc3RybGNweShmbXIyLT52ZGV2Lm5hbWUsIHY0bDJfZGV2LT5uYW1lLCBzaXplb2YoZm1yMi0+dmRldi5uYW1lKSk7Ci0JZm1yMi0+dmRldi52NGwyX2RldiA9IHY0bDJfZGV2OwotCWZtcjItPnZkZXYuZm9wcyA9ICZmbXIyX2ZvcHM7Ci0JZm1yMi0+dmRldi5pb2N0bF9vcHMgPSAmZm1yMl9pb2N0bF9vcHM7Ci0JZm1yMi0+dmRldi5yZWxlYXNlID0gdmlkZW9fZGV2aWNlX3JlbGVhc2VfZW1wdHk7Ci0JdmlkZW9fc2V0X2RydmRhdGEoJmZtcjItPnZkZXYsIGZtcjIpOwotCi0JLyogbXV0ZSBjYXJkIC0gcHJldmVudHMgbm9pc3kgYm9vdHVwcyAqLwotCWZtcjJfbXV0ZShmbXIyLT5pbyk7Ci0JZm1yMl9wcm9kdWN0X2luZm8oZm1yMik7Ci0KLQlpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZmbXIyLT52ZGV2LCBWRkxfVFlQRV9SQURJTywgcmFkaW9fbnIpIDwgMCkgewotCQl2NGwyX2RldmljZV91bnJlZ2lzdGVyKHY0bDJfZGV2KTsKLQkJcmVsZWFzZV9yZWdpb24oZm1yMi0+aW8sIDIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQl2NGwyX2luZm8odjRsMl9kZXYsICJTRjE2Rk1SMiByYWRpbyBjYXJkIGRyaXZlciBhdCAweCV4LlxuIiwgZm1yMi0+aW8pOwotCWRlYnVnX3ByaW50KChLRVJOX0RFQlVHICJjYXJkX3R5cGUgJWRcbiIsIGZtcjItPmNhcmRfdHlwZSkpOworCXByaW50ayhLRVJOX0lORk8gInJhZGlvLXNmMTZmbXIyOiBTRjE2LUZNUjIgcmFkaW8gY2FyZCBhdCAweCV4LlxuIiwgZm1yMi0+aW8pOwogCXJldHVybiAwOwogfQogCkBAIC00NDMsMjIgKzIxMSw5IEBACiB7CiAJc3RydWN0IGZtcjIgKmZtcjIgPSAmZm1yMl9jYXJkOwogCi0JdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJmZtcjItPnZkZXYpOwotCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJmZtcjItPnY0bDJfZGV2KTsKKwlzbmRfdGVhNTc1eF9leGl0KCZmbXIyLT50ZWEpOwogCXJlbGVhc2VfcmVnaW9uKGZtcjItPmlvLCAyKTsKIH0KIAogbW9kdWxlX2luaXQoZm1yMl9pbml0KTsKIG1vZHVsZV9leGl0KGZtcjJfZXhpdCk7Ci0KLSNpZm5kZWYgTU9EVUxFCi0KLXN0YXRpYyBpbnQgX19pbml0IGZtcjJfc2V0dXBfaW8oY2hhciAqc3RyKQotewotCWdldF9vcHRpb24oJnN0ciwgJmlvKTsKLQlyZXR1cm4gMTsKLX0KLQotX19zZXR1cCgic2YxNmZtcjI9IiwgZm1yMl9zZXR1cF9pbyk7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10ZWE1NzY0LmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXRlYTU3NjQuYwppbmRleCAwZTcxZDgxLi45NWRkY2M0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXRlYTU3NjQuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXRlYTU3NjQuYwpAQCAtMzksMTAgKzM5LDggQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4JCQkvKiBJMkMJCQkJKi8KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+ICAgICAgCS8qIGZvciBLRVJORUxfVkVSU0lPTiBNQUNSTyAgICAgKi8KIAotI2RlZmluZSBEUklWRVJfVkVSU0lPTgkidjAuMDEiCi0jZGVmaW5lIFJBRElPX1ZFUlNJT04JS0VSTkVMX1ZFUlNJT04oMCwgMCwgMSkKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JIjAuMC4yIgogCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IJIkZhYmlvIEJlbGF2ZW51dG8gPGJlbGF2ZW51dG9AZ21haWwuY29tPiIKICNkZWZpbmUgRFJJVkVSX0RFU0MJIkEgZHJpdmVyIGZvciB0aGUgVEVBNTc2NCByYWRpbyBjaGlwIGZvciBFWlggUGhvbmVzLiIKQEAgLTMwMCw3ICsyOTgsNiBAQAogCXN0cmxjcHkodi0+Y2FyZCwgZGV2LT5uYW1lLCBzaXplb2Yodi0+Y2FyZCkpOwogCXNucHJpbnRmKHYtPmJ1c19pbmZvLCBzaXplb2Yodi0+YnVzX2luZm8pLAogCQkgIkkyQzolcyIsIGRldl9uYW1lKCZkZXYtPmRldikpOwotCXYtPnZlcnNpb24gPSBSQURJT19WRVJTSU9OOwogCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSIHwgVjRMMl9DQVBfUkFESU87CiAJcmV0dXJuIDA7CiB9CkBAIC01OTUsOCArNTkyLDkgQEAKIE1PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7CiBNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJJVkVSX1ZFUlNJT04pOwogCi1tb2R1bGVfcGFyYW0odXNlX3h0YWwsIGludCwgMSk7Cittb2R1bGVfcGFyYW0odXNlX3h0YWwsIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHVzZV94dGFsLCAiQ2hpcCBoYXZlIGEgeHRhbCBjb25uZWN0ZWQgaW4gYm9hcmQiKTsKIG1vZHVsZV9wYXJhbShyYWRpb19uciwgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MocmFkaW9fbnIsICJ2aWRlbzRsaW51eCBkZXZpY2UgbnVtYmVyIHRvIHVzZSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10ZXJyYXRlYy5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10ZXJyYXRlYy5jCmluZGV4IGEzMjY2MzkuLmYyZWQ5Y2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdGVycmF0ZWMuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXRlcnJhdGVjLmMKQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4JLyogcmVxdWVzdF9yZWdpb24JCSovCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CS8qIGtlcm5lbCByYWRpbyBzdHJ1Y3RzCQkqLwogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPiAgICAgIC8qIGZvciBLRVJORUxfVkVSU0lPTiBNQUNSTyAgICAgKi8KICNpbmNsdWRlIDxsaW51eC9pby5oPgkJLyogb3V0Yiwgb3V0Yl9wCQkJKi8KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KQEAgLTM3LDYgKzM2LDcgQEAKIE1PRFVMRV9BVVRIT1IoIlIuT0ZGRVJNQU5OUyAmIG90aGVycyIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBIGRyaXZlciBmb3IgdGhlIFRlcnJhVGVjIEFjdGl2ZVJhZGlvIFN0YW5kYWxvbmUgcmFkaW8gY2FyZC4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKCIwLjAuMyIpOwogCiAjaWZuZGVmIENPTkZJR19SQURJT19URVJSQVRFQ19QT1JUCiAjZGVmaW5lIENPTkZJR19SQURJT19URVJSQVRFQ19QT1JUIDB4NTkwCkBAIC00OSw4ICs0OSw2IEBACiBNT0RVTEVfUEFSTV9ERVNDKGlvLCAiSS9PIGFkZHJlc3Mgb2YgdGhlIFRlcnJhVGVjIEFjdGl2ZVJhZGlvIGNhcmQgKDB4NTkwIG9yIDB4NTkxKSIpOwogbW9kdWxlX3BhcmFtKHJhZGlvX25yLCBpbnQsIDApOwogCi0jZGVmaW5lIFJBRElPX1ZFUlNJT04gS0VSTkVMX1ZFUlNJT04oMCwgMCwgMikKLQogc3RhdGljIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCByYWRpb19xY3RybFtdID0gewogCXsKIAkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9BVURJT19NVVRFLApAQCAtMjA1LDcgKzIwMyw2IEBACiAJc3RybGNweSh2LT5kcml2ZXIsICJyYWRpby10ZXJyYXRlYyIsIHNpemVvZih2LT5kcml2ZXIpKTsKIAlzdHJsY3B5KHYtPmNhcmQsICJBY3RpdmVSYWRpbyIsIHNpemVvZih2LT5jYXJkKSk7CiAJc3RybGNweSh2LT5idXNfaW5mbywgIklTQSIsIHNpemVvZih2LT5idXNfaW5mbykpOwotCXYtPnZlcnNpb24gPSBSQURJT19WRVJTSU9OOwogCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSIHwgVjRMMl9DQVBfUkFESU87CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXRpbWIuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdGltYi5jCmluZGV4IGExODU2MTAuLmYxN2I1NDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdGltYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdGltYi5jCkBAIC0xNiw3ICsxNiw2IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CkBAIC00NCw3ICs0Myw2IEBACiAJc3RybGNweSh2LT5kcml2ZXIsIERSSVZFUl9OQU1FLCBzaXplb2Yodi0+ZHJpdmVyKSk7CiAJc3RybGNweSh2LT5jYXJkLCAiVGltYmVyZGFsZSBSYWRpbyIsIHNpemVvZih2LT5jYXJkKSk7CiAJc25wcmludGYodi0+YnVzX2luZm8sIHNpemVvZih2LT5idXNfaW5mbyksICJwbGF0Zm9ybToiRFJJVkVSX05BTUUpOwotCXYtPnZlcnNpb24gPSBLRVJORUxfVkVSU0lPTigwLCAwLCAxKTsKIAl2LT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUiB8IFY0TDJfQ0FQX1JBRElPOwogCXJldHVybiAwOwogfQpAQCAtMjQ1LDQgKzI0Myw1IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIlRpbWJlcmRhbGUgUmFkaW8gZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJNb2NlYW4gTGFib3JhdG9yaWVzIDxpbmZvQG1vY2Vhbi1sYWJzLmNvbT4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9WRVJTSU9OKCIwLjAuMiIpOwogTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybToiRFJJVkVSX05BTUUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10cnVzdC5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby10cnVzdC5jCmluZGV4IDIyZmE5Y2MuLmIzZjQ1YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdHJ1c3QuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXRydXN0LmMKQEAgLTE5LDcgKzE5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPiAgICAgIC8qIGZvciBLRVJORUxfVkVSU0lPTiBNQUNSTyAgICAgKi8KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CkBAIC0yOCw2ICsyNyw3IEBACiBNT0RVTEVfQVVUSE9SKCJFcmljIExhbW1lcnRzLCBSdXNzZWxsIEtyb2xsLCBRdWF5IEx1LCBEb25hbGQgU29uZywgSmFzb24gTGV3aXMsIFNjb3R0IE1jR3JhdGgsIFdpbGxpYW0gTWNHcmF0aCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBIGRyaXZlciBmb3IgdGhlIFRydXN0IEZNIFJhZGlvIGNhcmQuIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiMC4wLjMiKTsKIAogLyogYWNjZXB0YWJsZSBwb3J0czogMHgzNTAgKEpQMyBzaG9ydGVkKSwgMHgzNTggKEpQMyBvcGVuKSAqLwogCkBAIC00Miw4ICs0Miw2IEBACiBNT0RVTEVfUEFSTV9ERVNDKGlvLCAiSS9PIGFkZHJlc3Mgb2YgdGhlIFRydXN0IEZNIFJhZGlvIGNhcmQgKDB4MzUwIG9yIDB4MzU4KSIpOwogbW9kdWxlX3BhcmFtKHJhZGlvX25yLCBpbnQsIDApOwogCi0jZGVmaW5lIFJBRElPX1ZFUlNJT04gS0VSTkVMX1ZFUlNJT04oMCwgMCwgMikKLQogc3RydWN0IHRydXN0IHsKIAlzdHJ1Y3QgdjRsMl9kZXZpY2UgdjRsMl9kZXY7CiAJc3RydWN0IHZpZGVvX2RldmljZSB2ZGV2OwpAQCAtMTk2LDcgKzE5NCw2IEBACiAJc3RybGNweSh2LT5kcml2ZXIsICJyYWRpby10cnVzdCIsIHNpemVvZih2LT5kcml2ZXIpKTsKIAlzdHJsY3B5KHYtPmNhcmQsICJUcnVzdCBGTSBSYWRpbyIsIHNpemVvZih2LT5jYXJkKSk7CiAJc3RybGNweSh2LT5idXNfaW5mbywgIklTQSIsIHNpemVvZih2LT5idXNfaW5mbykpOwotCXYtPnZlcnNpb24gPSBSQURJT19WRVJTSU9OOwogCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSIHwgVjRMMl9DQVBfUkFESU87CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXR5cGhvb24uYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tdHlwaG9vbi5jCmluZGV4IDhkYmJmMDhmLi4zOTg3MjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXR5cGhvb24uYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXR5cGhvb24uYwpAQCAtMzEsMTUgKzMxLDE3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CS8qIE1vZHVsZXMgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4JCS8qIEluaXRkYXRhICAgICAgICAgICAgICAgICAgICAgICAqLwogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgkvKiByZXF1ZXN0X3JlZ2lvbgkJICAqLwotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4gICAgICAvKiBmb3IgS0VSTkVMX1ZFUlNJT04gTUFDUk8gICAgICovCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CS8qIGtlcm5lbCByYWRpbyBzdHJ1Y3RzICAgICAgICAgICAqLwogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CQkvKiBvdXRiLCBvdXRiX3AgICAgICAgICAgICAgICAgICAgKi8KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KIAorI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMC4xLjIiCisKIE1PRFVMRV9BVVRIT1IoIkRyLiBIZW5yaWsgU2VpZGVsIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkEgZHJpdmVyIGZvciB0aGUgVHlwaG9vbiByYWRpbyBjYXJkIChhLmsuYS4gRWNvUmFkaW8pLiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oRFJJVkVSX1ZFUlNJT04pOwogCiAjaWZuZGVmIENPTkZJR19SQURJT19UWVBIT09OX1BPUlQKICNkZWZpbmUgQ09ORklHX1JBRElPX1RZUEhPT05fUE9SVCAtMQpAQCAtNjEsOSArNjMsNyBAQAogbW9kdWxlX3BhcmFtKG11dGVmcmVxLCB1bG9uZywgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKG11dGVmcmVxLCAiRnJlcXVlbmN5IHVzZWQgd2hlbiBtdXRpbmcgdGhlIGNhcmQgKGluIGtIeikiKTsKIAotI2RlZmluZSBSQURJT19WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKDAsIDEsIDEpCi0KLSNkZWZpbmUgQkFOTkVSICJUeXBob29uIFJhZGlvIENhcmQgZHJpdmVyIHYwLjEuMVxuIgorI2RlZmluZSBCQU5ORVIgIlR5cGhvb24gUmFkaW8gQ2FyZCBkcml2ZXIgdiIgRFJJVkVSX1ZFUlNJT04gIlxuIgogCiBzdHJ1Y3QgdHlwaG9vbiB7CiAJc3RydWN0IHY0bDJfZGV2aWNlIHY0bDJfZGV2OwpAQCAtMTcxLDcgKzE3MSw2IEBACiAJc3RybGNweSh2LT5kcml2ZXIsICJyYWRpby10eXBob29uIiwgc2l6ZW9mKHYtPmRyaXZlcikpOwogCXN0cmxjcHkodi0+Y2FyZCwgIlR5cGhvb24gUmFkaW8iLCBzaXplb2Yodi0+Y2FyZCkpOwogCXN0cmxjcHkodi0+YnVzX2luZm8sICJJU0EiLCBzaXplb2Yodi0+YnVzX2luZm8pKTsKLQl2LT52ZXJzaW9uID0gUkFESU9fVkVSU0lPTjsKIAl2LT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUiB8IFY0TDJfQ0FQX1JBRElPOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby13bDEyNzMuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8td2wxMjczLmMKaW5kZXggNDU5ZjcyNy4uNDZjYWNmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby13bDEyNzMuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3JhZGlvLXdsMTI3My5jCkBAIC0xMzgyLDcgKzEzODIsNyBAQAogCiAJc3dpdGNoIChjdHJsLT5pZCkgewogCWNhc2UgIFY0TDJfQ0lEX1RVTkVfQU5URU5OQV9DQVBBQ0lUT1I6Ci0JCWN0cmwtPmN1ci52YWwgPSB3bDEyNzNfZm1fZ2V0X3R4X2N0dW5lKHJhZGlvKTsKKwkJY3RybC0+dmFsID0gd2wxMjczX2ZtX2dldF90eF9jdHVuZShyYWRpbyk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vcmFkaW8tem9sdHJpeC5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby16b2x0cml4LmMKaW5kZXggYWY5OWM1Yi4uZjU2MTNiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby16b2x0cml4LmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby9yYWRpby16b2x0cml4LmMKQEAgLTM1LDcgKzM1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgkvKiB1ZGVsYXksIG1zbGVlcCAgICAgICAgICAgICAgICAgKi8KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4JLyoga2VybmVsIHJhZGlvIHN0cnVjdHMgICAgICAgICAgICovCiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+ICAgICAgLyogZm9yIEtFUk5FTF9WRVJTSU9OIE1BQ1JPICAgICAqLwogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CQkvKiBvdXRiLCBvdXRiX3AgICAgICAgICAgICAgICAgICAgKi8KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KQEAgLTQzLDYgKzQyLDcgQEAKIE1PRFVMRV9BVVRIT1IoIkMudmFuIFNjaGFpayIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJBIGRyaXZlciBmb3IgdGhlIFpvbHRyaXggUmFkaW8gUGx1cy4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKCIwLjAuMyIpOwogCiAjaWZuZGVmIENPTkZJR19SQURJT19aT0xUUklYX1BPUlQKICNkZWZpbmUgQ09ORklHX1JBRElPX1pPTFRSSVhfUE9SVCAtMQpAQCAtNTUsOCArNTUsNiBAQAogTU9EVUxFX1BBUk1fREVTQyhpbywgIkkvTyBhZGRyZXNzIG9mIHRoZSBab2x0cml4IFJhZGlvIFBsdXMgKDB4MjBjIG9yIDB4MzBjKSIpOwogbW9kdWxlX3BhcmFtKHJhZGlvX25yLCBpbnQsIDApOwogCi0jZGVmaW5lIFJBRElPX1ZFUlNJT04gS0VSTkVMX1ZFUlNJT04oMCwgMCwgMikKLQogc3RydWN0IHpvbHRyaXggewogCXN0cnVjdCB2NGwyX2RldmljZSB2NGwyX2RldjsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlIHZkZXY7CkBAIC0yMjgsNyArMjI2LDYgQEAKIAlzdHJsY3B5KHYtPmRyaXZlciwgInJhZGlvLXpvbHRyaXgiLCBzaXplb2Yodi0+ZHJpdmVyKSk7CiAJc3RybGNweSh2LT5jYXJkLCAiWm9sdHJpeCBSYWRpbyIsIHNpemVvZih2LT5jYXJkKSk7CiAJc3RybGNweSh2LT5idXNfaW5mbywgIklTQSIsIHNpemVvZih2LT5idXNfaW5mbykpOwotCXYtPnZlcnNpb24gPSBSQURJT19WRVJTSU9OOwogCXYtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSIHwgVjRMMl9DQVBfUkFESU87CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcweC9yYWRpby1zaTQ3MHgtaTJjLmMgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcweC9yYWRpby1zaTQ3MHgtaTJjLmMKaW5kZXggYTJhNjc3Ny4uZmQzNTQxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MHgvcmFkaW8tc2k0NzB4LWkyYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzB4L3JhZGlvLXNpNDcweC1pMmMuYwpAQCAtMjQsMTAgKzI0LDkgQEAKIAogLyogZHJpdmVyIGRlZmluaXRpb25zICovCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IgIkpvb255b3VuZyBTaGltIDxqeTA5MjIuc2hpbUBzYW1zdW5nLmNvbT4iOwotI2RlZmluZSBEUklWRVJfS0VSTkVMX1ZFUlNJT04gS0VSTkVMX1ZFUlNJT04oMSwgMCwgMSkKICNkZWZpbmUgRFJJVkVSX0NBUkQgIlNpbGljb24gTGFicyBTaTQ3MHggRk0gUmFkaW8gUmVjZWl2ZXIiCiAjZGVmaW5lIERSSVZFUl9ERVNDICJJMkMgcmFkaW8gZHJpdmVyIGZvciBTaTQ3MHggRk0gUmFkaW8gUmVjZWl2ZXJzIgotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMS4wLjEiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICIxLjAuMiIKIAogLyoga2VybmVsIGluY2x1ZGVzICovCiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CkBAIC0yNDgsNyArMjQ3LDYgQEAKIHsKIAlzdHJsY3B5KGNhcGFiaWxpdHktPmRyaXZlciwgRFJJVkVSX05BTUUsIHNpemVvZihjYXBhYmlsaXR5LT5kcml2ZXIpKTsKIAlzdHJsY3B5KGNhcGFiaWxpdHktPmNhcmQsIERSSVZFUl9DQVJELCBzaXplb2YoY2FwYWJpbGl0eS0+Y2FyZCkpOwotCWNhcGFiaWxpdHktPnZlcnNpb24gPSBEUklWRVJfS0VSTkVMX1ZFUlNJT047CiAJY2FwYWJpbGl0eS0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfSFdfRlJFUV9TRUVLIHwKIAkJVjRMMl9DQVBfVFVORVIgfCBWNEwyX0NBUF9SQURJTzsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MHgvcmFkaW8tc2k0NzB4LXVzYi5jIGIvZHJpdmVycy9tZWRpYS9yYWRpby9zaTQ3MHgvcmFkaW8tc2k0NzB4LXVzYi5jCmluZGV4IDM5MmU4NGYuLjRjZjUzNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzB4L3JhZGlvLXNpNDcweC11c2IuYworKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcweC9yYWRpby1zaTQ3MHgtdXNiLmMKQEAgLTI5LDcgKzI5LDYgQEAKIAogLyogZHJpdmVyIGRlZmluaXRpb25zICovCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IgIlRvYmlhcyBMb3JlbnogPHRvYmlhcy5sb3JlbnpAZ214Lm5ldD4iCi0jZGVmaW5lIERSSVZFUl9LRVJORUxfVkVSU0lPTiBLRVJORUxfVkVSU0lPTigxLCAwLCAxMCkKICNkZWZpbmUgRFJJVkVSX0NBUkQgIlNpbGljb24gTGFicyBTaTQ3MHggRk0gUmFkaW8gUmVjZWl2ZXIiCiAjZGVmaW5lIERSSVZFUl9ERVNDICJVU0IgcmFkaW8gZHJpdmVyIGZvciBTaTQ3MHggRk0gUmFkaW8gUmVjZWl2ZXJzIgogI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMS4wLjEwIgpAQCAtNjI2LDcgKzYyNSw2IEBACiAJc3RybGNweShjYXBhYmlsaXR5LT5jYXJkLCBEUklWRVJfQ0FSRCwgc2l6ZW9mKGNhcGFiaWxpdHktPmNhcmQpKTsKIAl1c2JfbWFrZV9wYXRoKHJhZGlvLT51c2JkZXYsIGNhcGFiaWxpdHktPmJ1c19pbmZvLAogCQkJc2l6ZW9mKGNhcGFiaWxpdHktPmJ1c19pbmZvKSk7Ci0JY2FwYWJpbGl0eS0+dmVyc2lvbiA9IERSSVZFUl9LRVJORUxfVkVSU0lPTjsKIAljYXBhYmlsaXR5LT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9IV19GUkVRX1NFRUsgfAogCQlWNEwyX0NBUF9UVU5FUiB8IFY0TDJfQ0FQX1JBRElPIHwgVjRMMl9DQVBfUkRTX0NBUFRVUkU7CiAKQEAgLTY5OSw3ICs2OTcsNyBAQAogCXJhZGlvLT52aWRlb2RldiA9IHZpZGVvX2RldmljZV9hbGxvYygpOwogCWlmICghcmFkaW8tPnZpZGVvZGV2KSB7CiAJCXJldHZhbCA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX2ludGJ1ZmZlcjsKKwkJZ290byBlcnJfdXJiOwogCX0KIAltZW1jcHkocmFkaW8tPnZpZGVvZGV2LCAmc2k0NzB4X3ZpZGRldl90ZW1wbGF0ZSwKIAkJCXNpemVvZihzaTQ3MHhfdmlkZGV2X3RlbXBsYXRlKSk7CkBAIC03OTAsNiArNzg4LDggQEAKIAlrZnJlZShyYWRpby0+YnVmZmVyKTsKIGVycl92aWRlbzoKIAl2aWRlb19kZXZpY2VfcmVsZWFzZShyYWRpby0+dmlkZW9kZXYpOworZXJyX3VyYjoKKwl1c2JfZnJlZV91cmIocmFkaW8tPmludF9pbl91cmIpOwogZXJyX2ludGJ1ZmZlcjoKIAlrZnJlZShyYWRpby0+aW50X2luX2J1ZmZlcik7CiBlcnJfcmFkaW86CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JhZGlvL3NpNDcweC9yYWRpby1zaTQ3MHguaCBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzB4L3JhZGlvLXNpNDcweC5oCmluZGV4IDY4ZGEwMDEuLmYzMDBhNTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzB4L3JhZGlvLXNpNDcweC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vc2k0NzB4L3JhZGlvLXNpNDcweC5oCkBAIC0zMiw3ICszMiw2IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYWRpby93bDEyOHgvZm1kcnYuaCBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vd2wxMjh4L2ZtZHJ2LmgKaW5kZXggMWE0NWE1ZC4uZDg0YWQ5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYWRpby93bDEyOHgvZm1kcnYuaAorKysgYi9kcml2ZXJzL21lZGlhL3JhZGlvL3dsMTI4eC9mbWRydi5oCkBAIC0yOCwxNCArMjgsMTEgQEAKICNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CiAjaW5jbHVkZSA8c291bmQvaW5pdHZhbC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY3RybHMuaD4KIAotI2RlZmluZSBGTV9EUlZfVkVSU0lPTiAgICAgICAgICAgICIwLjEwIgotLyogU2hvdWxkIG1hdGNoIHdpdGggRk1fRFJWX1ZFUlNJT04gKi8KLSNkZWZpbmUgRk1fRFJWX1JBRElPX1ZFUlNJT04gICAgICBLRVJORUxfVkVSU0lPTigwLCAwLCAxKQorI2RlZmluZSBGTV9EUlZfVkVSU0lPTiAgICAgICAgICAgICIwLjEuMSIKICNkZWZpbmUgRk1fRFJWX05BTUUgICAgICAgICAgICAgICAidGlfZm1kcnYiCiAjZGVmaW5lIEZNX0RSVl9DQVJEX1NIT1JUX05BTUUgICAgIlRJIEZNIFJhZGlvIgogI2RlZmluZSBGTV9EUlZfQ0FSRF9MT05HX05BTUUgICAgICJUZXhhcyBJbnN0cnVtZW50cyBGTSBSYWRpbyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmFkaW8vd2wxMjh4L2ZtZHJ2X3Y0bDIuYyBiL2RyaXZlcnMvbWVkaWEvcmFkaW8vd2wxMjh4L2ZtZHJ2X3Y0bDIuYwppbmRleCA4NzAxMDcyLi44YzBlMTkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JhZGlvL3dsMTI4eC9mbWRydl92NGwyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYWRpby93bDEyOHgvZm1kcnZfdjRsMi5jCkBAIC0xNzUsNyArMTc1LDYgQEAKIAlzdHJsY3B5KGNhcGFiaWxpdHktPmNhcmQsIEZNX0RSVl9DQVJEX1NIT1JUX05BTUUsCiAJCQlzaXplb2YoY2FwYWJpbGl0eS0+Y2FyZCkpOwogCXNwcmludGYoY2FwYWJpbGl0eS0+YnVzX2luZm8sICJVQVJUIik7Ci0JY2FwYWJpbGl0eS0+dmVyc2lvbiA9IEZNX0RSVl9SQURJT19WRVJTSU9OOwogCWNhcGFiaWxpdHktPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX0hXX0ZSRVFfU0VFSyB8IFY0TDJfQ0FQX1RVTkVSIHwKIAkJVjRMMl9DQVBfUkFESU8gfCBWNEwyX0NBUF9NT0RVTEFUT1IgfAogCQlWNEwyX0NBUF9BVURJTyB8IFY0TDJfQ0FQX1JFQURXUklURSB8CkBAIC0xOTEsNyArMTkwLDcgQEAKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlICBWNEwyX0NJRF9UVU5FX0FOVEVOTkFfQ0FQQUNJVE9SOgotCQljdHJsLT5jdXIudmFsID0gZm1fdHhfZ2V0X3R1bmVfY2FwX3ZhbChmbWRldik7CisJCWN0cmwtPnZhbCA9IGZtX3R4X2dldF90dW5lX2NhcF92YWwoZm1kZXYpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlmbXdhcm4oIiVzOiBVbmtub3duIElPQ1RMOiAlZFxuIiwgX19mdW5jX18sIGN0cmwtPmlkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvcmMvS2NvbmZpZwppbmRleCA3ZDRiYmMyLi44OTlmNzgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9LY29uZmlnCkBAIC04Nyw2ICs4NywxNyBAQAogCSAgIHVzZXMgYW4gSVIgcHJvdG9jb2wgdGhhdCBpcyBhbG1vc3Qgc3RhbmRhcmQgUkMtNSwgYnV0IG5vdCBxdWl0ZSwKIAkgICBhcyBpdCB1c2VzIGFuIGFkZGl0aW9uYWwgYml0KS4KIAorY29uZmlnIElSX01DRV9LQkRfREVDT0RFUgorCXRyaXN0YXRlICJFbmFibGUgSVIgcmF3IGRlY29kZXIgZm9yIHRoZSBNQ0Uga2V5Ym9hcmQvbW91c2UgcHJvdG9jb2wiCisJZGVwZW5kcyBvbiBSQ19DT1JFCisJc2VsZWN0IEJJVFJFVkVSU0UKKwlkZWZhdWx0IHkKKworCS0tLWhlbHAtLS0KKwkgICBFbmFibGUgdGhpcyBvcHRpb24gaWYgeW91IGhhdmUgYSBNaWNyb3NvZnQgUmVtb3RlIEtleWJvYXJkIGZvcgorCSAgIFdpbmRvd3MgTWVkaWEgQ2VudGVyIEVkaXRpb24sIHdoaWNoIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSB3aXRoCisJICAgYSByYXcgSVIgcmVjZWl2ZXIgaW4geW91ciBzeXN0ZW0uCisKIGNvbmZpZyBJUl9MSVJDX0NPREVDCiAJdHJpc3RhdGUgIkVuYWJsZSBJUiB0byBMSVJDIGJyaWRnZSIKIAlkZXBlbmRzIG9uIFJDX0NPUkUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3JjL01ha2VmaWxlCmluZGV4IDUyODMwZTUuLmYyMjRkYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9NYWtlZmlsZQpAQCAtMTAsNiArMTAsNyBAQAogb2JqLSQoQ09ORklHX0lSX0pWQ19ERUNPREVSKSArPSBpci1qdmMtZGVjb2Rlci5vCiBvYmotJChDT05GSUdfSVJfU09OWV9ERUNPREVSKSArPSBpci1zb255LWRlY29kZXIubwogb2JqLSQoQ09ORklHX0lSX1JDNV9TWl9ERUNPREVSKSArPSBpci1yYzUtc3otZGVjb2Rlci5vCitvYmotJChDT05GSUdfSVJfTUNFX0tCRF9ERUNPREVSKSArPSBpci1tY2Vfa2JkLWRlY29kZXIubwogb2JqLSQoQ09ORklHX0lSX0xJUkNfQ09ERUMpICs9IGlyLWxpcmMtY29kZWMubwogCiAjIHN0YW5kLWFsb25lIElSIHJlY2VpdmVycy90cmFuc21pdHRlcnMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvZW5lX2lyLmMgYi9kcml2ZXJzL21lZGlhL3JjL2VuZV9pci5jCmluZGV4IGE0M2VkNmMuLjJiOWMyNTY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2VuZV9pci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvZW5lX2lyLmMKQEAgLTk1MywxMyArOTUzLDEzIEBACiB9CiAKIC8qIG91dHNpZGUgaW50ZXJmYWNlOiB0cmFuc21pdCAqLwotc3RhdGljIGludCBlbmVfdHJhbnNtaXQoc3RydWN0IHJjX2RldiAqcmRldiwgaW50ICpidWYsIHUzMiBuKQorc3RhdGljIGludCBlbmVfdHJhbnNtaXQoc3RydWN0IHJjX2RldiAqcmRldiwgdW5zaWduZWQgKmJ1ZiwgdW5zaWduZWQgbikKIHsKIAlzdHJ1Y3QgZW5lX2RldmljZSAqZGV2ID0gcmRldi0+cHJpdjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJZGV2LT50eF9idWZmZXIgPSBidWY7Ci0JZGV2LT50eF9sZW4gPSBuIC8gc2l6ZW9mKGludCk7CisJZGV2LT50eF9sZW4gPSBuOwogCWRldi0+dHhfcG9zID0gMDsKIAlkZXYtPnR4X3JlZyA9IDA7CiAJZGV2LT50eF9kb25lID0gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvZW5lX2lyLmggYi9kcml2ZXJzL21lZGlhL3JjL2VuZV9pci5oCmluZGV4IDMzN2E0MWQuLjAxN2MyMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvZW5lX2lyLmgKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9lbmVfaXIuaApAQCAtMjM1LDcgKzIzNSw3IEBACiAJYm9vbCB0eF9zYW1wbGVfcHVsc2U7CQkJLyogY3VycmVudCBzYW1wbGUgaXMgcHVsc2UgKi8KIAogCS8qIFRYIGJ1ZmZlciAqLwotCWludCAqdHhfYnVmZmVyOwkJCQkvKiBpbnB1dCBzYW1wbGVzIGJ1ZmZlciovCisJdW5zaWduZWQgKnR4X2J1ZmZlcjsJCQkvKiBpbnB1dCBzYW1wbGVzIGJ1ZmZlciovCiAJaW50IHR4X3BvczsJCQkJLyogcG9zaXRpb24gaW4gdGhhdCBidWZlciAqLwogCWludCB0eF9sZW47CQkJCS8qIGN1cnJlbnQgbGVuIG9mIHR4IGJ1ZmZlciAqLwogCWludCB0eF9kb25lOwkJCQkvKiBkb25lIHRyYW5zbWl0dGluZyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9pci1saXJjLWNvZGVjLmMgYi9kcml2ZXJzL21lZGlhL3JjL2lyLWxpcmMtY29kZWMuYwppbmRleCAxYzVjYzY1Li5lNWVlZWM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2lyLWxpcmMtY29kZWMuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2lyLWxpcmMtY29kZWMuYwpAQCAtMTAzLDE5ICsxMDMsMTkgQEAKIHsKIAlzdHJ1Y3QgbGlyY19jb2RlYyAqbGlyYzsKIAlzdHJ1Y3QgcmNfZGV2ICpkZXY7Ci0JaW50ICp0eGJ1ZjsgLyogYnVmZmVyIHdpdGggdmFsdWVzIHRvIHRyYW5zbWl0ICovCi0JaW50IHJldCA9IDA7CisJdW5zaWduZWQgaW50ICp0eGJ1ZjsgLyogYnVmZmVyIHdpdGggdmFsdWVzIHRvIHRyYW5zbWl0ICovCisJc3NpemVfdCByZXQgPSAwOwogCXNpemVfdCBjb3VudDsKIAogCWxpcmMgPSBsaXJjX2dldF9wZGF0YShmaWxlKTsKIAlpZiAoIWxpcmMpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JaWYgKG4gJSBzaXplb2YoaW50KSkKKwlpZiAobiA8IHNpemVvZih1bnNpZ25lZCkgfHwgbiAlIHNpemVvZih1bnNpZ25lZCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JY291bnQgPSBuIC8gc2l6ZW9mKGludCk7Ci0JaWYgKGNvdW50ID4gTElSQ0JVRl9TSVpFIHx8IGNvdW50ICUgMiA9PSAwIHx8IG4gJSBzaXplb2YoaW50KSAhPSAwKQorCWNvdW50ID0gbiAvIHNpemVvZih1bnNpZ25lZCk7CisJaWYgKGNvdW50ID4gTElSQ0JVRl9TSVpFIHx8IGNvdW50ICUgMiA9PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXR4YnVmID0gbWVtZHVwX3VzZXIoYnVmLCBuKTsKQEAgLTEyOSw3ICsxMjksMTAgQEAKIAl9CiAKIAlpZiAoZGV2LT50eF9pcikKLQkJcmV0ID0gZGV2LT50eF9pcihkZXYsIHR4YnVmLCAodTMyKW4pOworCQlyZXQgPSBkZXYtPnR4X2lyKGRldiwgdHhidWYsIGNvdW50KTsKKworCWlmIChyZXQgPiAwKQorCQlyZXQgKj0gc2l6ZW9mKHVuc2lnbmVkKTsKIAogb3V0OgogCWtmcmVlKHR4YnVmKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvaXItbWNlX2tiZC1kZWNvZGVyLmMgYi9kcml2ZXJzL21lZGlhL3JjL2lyLW1jZV9rYmQtZGVjb2Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ODRlYmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3JjL2lyLW1jZV9rYmQtZGVjb2Rlci5jCkBAIC0wLDAgKzEsNDQ5IEBACisvKiBpci1tY2Vfa2JkLWRlY29kZXIuYyAtIEEgZGVjb2RlciBmb3IgdGhlIFJDNi1pc2gga2V5Ym9hcmQvbW91c2UgSVIgcHJvdG9jb2wKKyAqIHVzZWQgYnkgdGhlIE1pY3Jvc29mdCBSZW1vdGUgS2V5Ym9hcmQgZm9yIFdpbmRvd3MgTWVkaWEgQ2VudGVyIEVkaXRpb24sCisgKiByZWZlcnJlZCB0byBieSBNaWNyb3NvZnQncyBXaW5kb3dzIE1lZGlhIENlbnRlciByZW1vdGUgc3BlY2lmaWNhdGlvbiBkb2NzCisgKiBhcyAiYW4gaW50ZXJuYWwgcHJvdG9jb2wgY2FsbGVkIE1DSVItMiIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIGJ5IEphcm9kIFdpbHNvbiA8amFyb2RAcmVkaGF0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgInJjLWNvcmUtcHJpdi5oIgorCisvKgorICogVGhpcyBkZWNvZGVyIGN1cnJlbnRseSBzdXBwb3J0czoKKyAqIC0gTUNJUi0yIDI5LWJpdCBJUiBzaWduYWxzIHVzZWQgZm9yIG1vdXNlIG1vdmVtZW50IGFuZCBidXR0b25zCisgKiAtIE1DSVItMiAzMi1iaXQgSVIgc2lnbmFscyB1c2VkIGZvciBzdGFuZGFyZCBrZXlib2FyZCBrZXlzCisgKgorICogVGhlIG1lZGlhIGtleXMgb24gdGhlIGtleWJvYXJkIHNlbmQgUkMtNiBzaWduYWxzIHRoYXQgYXJlIGluZGl0aW5ndWlzaGFibGUKKyAqIGZyb20gdGhlIGtleXMgb2YgdGhlIHNhbWUgbmFtZSBvbiB0aGUgc3RvY2sgTUNFIHJlbW90ZSwgYW5kIHdpbGwgYmUgaGFuZGxlZAorICogYnkgdGhlIHN0YW5kYXJkIFJDLTYgZGVjb2RlciwgYW5kIGJlIG1hZGUgYXZhaWxhYmxlIHRvIHRoZSBzeXN0ZW0gdmlhIHRoZQorICogaW5wdXQgZGV2aWNlIGZvciB0aGUgcmVtb3RlLCByYXRoZXIgdGhhbiB0aGUga2V5Ym9hcmQvbW91c2Ugb25lLgorICovCisKKyNkZWZpbmUgTUNJUjJfVU5JVAkJMzMzMzMzCS8qIG5zICovCisjZGVmaW5lIE1DSVIyX0hFQURFUl9OQklUUwk1CisjZGVmaW5lIE1DSVIyX01PVVNFX05CSVRTCTI5CisjZGVmaW5lIE1DSVIyX0tFWUJPQVJEX05CSVRTCTMyCisjZGVmaW5lIE1DSVIyX1BSRUZJWF9QVUxTRQkoOCAqIE1DSVIyX1VOSVQpCisjZGVmaW5lIE1DSVIyX1BSRUZJWF9TUEFDRQkoMSAqIE1DSVIyX1VOSVQpCisjZGVmaW5lIE1DSVIyX01BWF9MRU4JCSgzICogTUNJUjJfVU5JVCkKKyNkZWZpbmUgTUNJUjJfQklUX1NUQVJUCQkoMSAqIE1DSVIyX1VOSVQpCisjZGVmaW5lIE1DSVIyX0JJVF9FTkQJCSgxICogTUNJUjJfVU5JVCkKKyNkZWZpbmUgTUNJUjJfQklUXzAJCSgxICogTUNJUjJfVU5JVCkKKyNkZWZpbmUgTUNJUjJfQklUX1NFVAkJKDIgKiBNQ0lSMl9VTklUKQorI2RlZmluZSBNQ0lSMl9NT0RFX01BU0sJCTB4ZgkvKiBmb3IgdGhlIGhlYWRlciBiaXRzICovCisjZGVmaW5lIE1DSVIyX0tFWUJPQVJEX0hFQURFUgkweDQKKyNkZWZpbmUgTUNJUjJfTU9VU0VfSEVBREVSCTB4MQorI2RlZmluZSBNQ0lSMl9NQVNLX0tFWVNfU1RBUlQJMHhlMAorCitlbnVtIG1jZV9rYmRfbW9kZSB7CisJTUNJUjJfTU9ERV9LRVlCT0FSRCwKKwlNQ0lSMl9NT0RFX01PVVNFLAorCU1DSVIyX01PREVfVU5LTk9XTiwKK307CisKK2VudW0gbWNlX2tiZF9zdGF0ZSB7CisJU1RBVEVfSU5BQ1RJVkUsCisJU1RBVEVfSEVBREVSX0JJVF9TVEFSVCwKKwlTVEFURV9IRUFERVJfQklUX0VORCwKKwlTVEFURV9CT0RZX0JJVF9TVEFSVCwKKwlTVEFURV9CT0RZX0JJVF9FTkQsCisJU1RBVEVfRklOSVNIRUQsCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBrYmRfa2V5Y29kZXNbMjU2XSA9IHsKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9BLAorCUtFWV9CLAkJS0VZX0MsCQlLRVlfRCwJCUtFWV9FLAkJS0VZX0YsCisJS0VZX0csCQlLRVlfSCwJCUtFWV9JLAkJS0VZX0osCQlLRVlfSywKKwlLRVlfTCwJCUtFWV9NLAkJS0VZX04sCQlLRVlfTywJCUtFWV9QLAorCUtFWV9RLAkJS0VZX1IsCQlLRVlfUywJCUtFWV9ULAkJS0VZX1UsCisJS0VZX1YsCQlLRVlfVywJCUtFWV9YLAkJS0VZX1ksCQlLRVlfWiwKKwlLRVlfMSwJCUtFWV8yLAkJS0VZXzMsCQlLRVlfNCwJCUtFWV81LAorCUtFWV82LAkJS0VZXzcsCQlLRVlfOCwJCUtFWV85LAkJS0VZXzAsCisJS0VZX0VOVEVSLAlLRVlfRVNDLAlLRVlfQkFDS1NQQUNFLAlLRVlfVEFCLAlLRVlfU1BBQ0UsCisJS0VZX01JTlVTLAlLRVlfRVFVQUwsCUtFWV9MRUZUQlJBQ0UsCUtFWV9SSUdIVEJSQUNFLAlLRVlfQkFDS1NMQVNILAorCUtFWV9SRVNFUlZFRCwJS0VZX1NFTUlDT0xPTiwJS0VZX0FQT1NUUk9QSEUsCUtFWV9HUkFWRSwJS0VZX0NPTU1BLAorCUtFWV9ET1QsCUtFWV9TTEFTSCwJS0VZX0NBUFNMT0NLLAlLRVlfRjEsCQlLRVlfRjIsCisJS0VZX0YzLAkJS0VZX0Y0LAkJS0VZX0Y1LAkJS0VZX0Y2LAkJS0VZX0Y3LAorCUtFWV9GOCwJCUtFWV9GOSwJCUtFWV9GMTAsCUtFWV9GMTEsCUtFWV9GMTIsCisJS0VZX1NZU1JRLAlLRVlfU0NST0xMTE9DSywJS0VZX1BBVVNFLAlLRVlfSU5TRVJULAlLRVlfSE9NRSwKKwlLRVlfUEFHRVVQLAlLRVlfREVMRVRFLAlLRVlfRU5ELAlLRVlfUEFHRURPV04sCUtFWV9SSUdIVCwKKwlLRVlfTEVGVCwJS0VZX0RPV04sCUtFWV9VUCwJCUtFWV9OVU1MT0NLLAlLRVlfS1BTTEFTSCwKKwlLRVlfS1BBU1RFUklTSywJS0VZX0tQTUlOVVMsCUtFWV9LUFBMVVMsCUtFWV9LUEVOVEVSLAlLRVlfS1AxLAorCUtFWV9LUDIsCUtFWV9LUDMsCUtFWV9LUDQsCUtFWV9LUDUsCUtFWV9LUDYsCisJS0VZX0tQNywJS0VZX0tQOCwJS0VZX0tQOSwJS0VZX0tQMCwJS0VZX0tQRE9ULAorCUtFWV8xMDJORCwJS0VZX0NPTVBPU0UsCUtFWV9QT1dFUiwJS0VZX0tQRVFVQUwsCUtFWV9GMTMsCisJS0VZX0YxNCwJS0VZX0YxNSwJS0VZX0YxNiwJS0VZX0YxNywJS0VZX0YxOCwKKwlLRVlfRjE5LAlLRVlfRjIwLAlLRVlfRjIxLAlLRVlfRjIyLAlLRVlfRjIzLAorCUtFWV9GMjQsCUtFWV9PUEVOLAlLRVlfSEVMUCwJS0VZX1BST1BTLAlLRVlfRlJPTlQsCisJS0VZX1NUT1AsCUtFWV9BR0FJTiwJS0VZX1VORE8sCUtFWV9DVVQsCUtFWV9DT1BZLAorCUtFWV9QQVNURSwJS0VZX0ZJTkQsCUtFWV9NVVRFLAlLRVlfVk9MVU1FVVAsCUtFWV9WT0xVTUVET1dOLAorCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9LUENPTU1BLAlLRVlfUkVTRVJWRUQsCisJS0VZX1JPLAkJS0VZX0tBVEFLQU5BSElSQUdBTkEsIEtFWV9ZRU4sCUtFWV9IRU5LQU4sCUtFWV9NVUhFTktBTiwKKwlLRVlfS1BKUENPTU1BLAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfSEFOR1VFTCwKKwlLRVlfSEFOSkEsCUtFWV9LQVRBS0FOQSwJS0VZX0hJUkFHQU5BLAlLRVlfWkVOS0FLVUhBTktBS1UsIEtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwKKwlLRVlfUkVTRVJWRUQsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCUtFWV9MRUZUQ1RSTCwKKwlLRVlfTEVGVFNISUZULAlLRVlfTEVGVEFMVCwJS0VZX0xFRlRNRVRBLAlLRVlfUklHSFRDVFJMLAlLRVlfUklHSFRTSElGVCwKKwlLRVlfUklHSFRBTFQsCUtFWV9SSUdIVE1FVEEsCUtFWV9QTEFZUEFVU0UsCUtFWV9TVE9QQ0QsCUtFWV9QUkVWSU9VU1NPTkcsCisJS0VZX05FWFRTT05HLAlLRVlfRUpFQ1RDRCwJS0VZX1ZPTFVNRVVQLAlLRVlfVk9MVU1FRE9XTiwJS0VZX01VVEUsCisJS0VZX1dXVywJS0VZX0JBQ0ssCUtFWV9GT1JXQVJELAlLRVlfU1RPUCwJS0VZX0ZJTkQsCisJS0VZX1NDUk9MTFVQLAlLRVlfU0NST0xMRE9XTiwJS0VZX0VESVQsCUtFWV9TTEVFUCwJS0VZX0NPRkZFRSwKKwlLRVlfUkVGUkVTSCwJS0VZX0NBTEMsCUtFWV9SRVNFUlZFRCwJS0VZX1JFU0VSVkVELAlLRVlfUkVTRVJWRUQsCisJS0VZX1JFU0VSVkVECit9OworCitzdGF0aWMgdm9pZCBtY2Vfa2JkX3J4X3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBtY2Vfa2JkX2RlYyAqbWNlX2tiZCA9IChzdHJ1Y3QgbWNlX2tiZF9kZWMgKilkYXRhOworCWludCBpOworCXVuc2lnbmVkIGNoYXIgbWFza2NvZGU7CisKKwlJUl9kcHJpbnRrKDIsICJ0aW1lciBjYWxsYmFjayBjbGVhcmluZyBhbGwga2V5c1xuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisJCW1hc2tjb2RlID0ga2JkX2tleWNvZGVzW01DSVIyX01BU0tfS0VZU19TVEFSVCArIGldOworCQlpbnB1dF9yZXBvcnRfa2V5KG1jZV9rYmQtPmlkZXYsIG1hc2tjb2RlLCAwKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTUNJUjJfTUFTS19LRVlTX1NUQVJUOyBpKyspCisJCWlucHV0X3JlcG9ydF9rZXkobWNlX2tiZC0+aWRldiwga2JkX2tleWNvZGVzW2ldLCAwKTsKK30KKworc3RhdGljIGVudW0gbWNlX2tiZF9tb2RlIG1jZV9rYmRfbW9kZShzdHJ1Y3QgbWNlX2tiZF9kZWMgKmRhdGEpCit7CisJc3dpdGNoIChkYXRhLT5oZWFkZXIgJiBNQ0lSMl9NT0RFX01BU0spIHsKKwljYXNlIE1DSVIyX0tFWUJPQVJEX0hFQURFUjoKKwkJcmV0dXJuIE1DSVIyX01PREVfS0VZQk9BUkQ7CisJY2FzZSBNQ0lSMl9NT1VTRV9IRUFERVI6CisJCXJldHVybiBNQ0lSMl9NT0RFX01PVVNFOworCWRlZmF1bHQ6CisJCXJldHVybiBNQ0lSMl9NT0RFX1VOS05PV047CisJfQorfQorCitzdGF0aWMgdm9pZCBpcl9tY2Vfa2JkX3Byb2Nlc3Nfa2V5Ym9hcmRfZGF0YShzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2LAorCQkJCQkgICAgIHUzMiBzY2FuY29kZSkKK3sKKwl1OCBrZXlkYXRhICAgPSAoc2NhbmNvZGUgPj4gOCkgJiAweGZmOworCXU4IHNoaWZ0bWFzayA9IHNjYW5jb2RlICYgMHhmZjsKKwl1bnNpZ25lZCBjaGFyIGtleWNvZGUsIG1hc2tjb2RlOworCWludCBpLCBrZXlzdGF0ZTsKKworCUlSX2RwcmludGsoMSwgImtleWJvYXJkOiBrZXlkYXRhID0gMHglMDJ4LCBzaGlmdG1hc2sgPSAweCUwMnhcbiIsCisJCSAgIGtleWRhdGEsIHNoaWZ0bWFzayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisJCW1hc2tjb2RlID0ga2JkX2tleWNvZGVzW01DSVIyX01BU0tfS0VZU19TVEFSVCArIGldOworCQlpZiAoc2hpZnRtYXNrICYgKDEgPDwgaSkpCisJCQlrZXlzdGF0ZSA9IDE7CisJCWVsc2UKKwkJCWtleXN0YXRlID0gMDsKKwkJaW5wdXRfcmVwb3J0X2tleShpZGV2LCBtYXNrY29kZSwga2V5c3RhdGUpOworCX0KKworCWlmIChrZXlkYXRhKSB7CisJCWtleWNvZGUgPSBrYmRfa2V5Y29kZXNba2V5ZGF0YV07CisJCWlucHV0X3JlcG9ydF9rZXkoaWRldiwga2V5Y29kZSwgMSk7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IE1DSVIyX01BU0tfS0VZU19TVEFSVDsgaSsrKQorCQkJaW5wdXRfcmVwb3J0X2tleShpZGV2LCBrYmRfa2V5Y29kZXNbaV0sIDApOworCX0KK30KKworc3RhdGljIHZvaWQgaXJfbWNlX2tiZF9wcm9jZXNzX21vdXNlX2RhdGEoc3RydWN0IGlucHV0X2RldiAqaWRldiwgdTMyIHNjYW5jb2RlKQoreworCS8qIHJhdyBtb3VzZSBjb29yZGluYXRlcyAqLworCXU4IHhkYXRhID0gKHNjYW5jb2RlID4+IDcpICYgMHg3ZjsKKwl1OCB5ZGF0YSA9IChzY2FuY29kZSA+PiAxNCkgJiAweDdmOworCWludCB4LCB5OworCS8qIG1vdXNlIGJ1dHRvbnMgKi8KKwlib29sIHJpZ2h0ID0gc2NhbmNvZGUgJiAweDQwOworCWJvb2wgbGVmdCAgPSBzY2FuY29kZSAmIDB4MjA7CisKKwlpZiAoeGRhdGEgJiAweDQwKQorCQl4ID0gLSgofnhkYXRhICYgMHg3ZikgKyAxKTsKKwllbHNlCisJCXggPSB4ZGF0YTsKKworCWlmICh5ZGF0YSAmIDB4NDApCisJCXkgPSAtKCh+eWRhdGEgJiAweDdmKSArIDEpOworCWVsc2UKKwkJeSA9IHlkYXRhOworCisJSVJfZHByaW50aygxLCAibW91c2U6IHggPSAlZCwgeSA9ICVkLCBidG5zID0gJXMlc1xuIiwKKwkJICAgeCwgeSwgbGVmdCA/ICJMIiA6ICIiLCByaWdodCA/ICJSIiA6ICIiKTsKKworCWlucHV0X3JlcG9ydF9yZWwoaWRldiwgUkVMX1gsIHgpOworCWlucHV0X3JlcG9ydF9yZWwoaWRldiwgUkVMX1ksIHkpOworCisJaW5wdXRfcmVwb3J0X2tleShpZGV2LCBCVE5fTEVGVCwgbGVmdCk7CisJaW5wdXRfcmVwb3J0X2tleShpZGV2LCBCVE5fUklHSFQsIHJpZ2h0KTsKK30KKworLyoqCisgKiBpcl9tY2Vfa2JkX2RlY29kZSgpIC0gRGVjb2RlIG9uZSBtY2Vfa2JkIHB1bHNlIG9yIHNwYWNlCisgKiBAZGV2Ogl0aGUgc3RydWN0IHJjX2RldiBkZXNjcmlwdG9yIG9mIHRoZSBkZXZpY2UKKyAqIEBldjoJCXRoZSBzdHJ1Y3QgaXJfcmF3X2V2ZW50IGRlc2NyaXB0b3Igb2YgdGhlIHB1bHNlL3NwYWNlCisgKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIC1FSU5WQUwgaWYgdGhlIHB1bHNlIHZpb2xhdGVzIHRoZSBzdGF0ZSBtYWNoaW5lCisgKi8KK3N0YXRpYyBpbnQgaXJfbWNlX2tiZF9kZWNvZGUoc3RydWN0IHJjX2RldiAqZGV2LCBzdHJ1Y3QgaXJfcmF3X2V2ZW50IGV2KQoreworCXN0cnVjdCBtY2Vfa2JkX2RlYyAqZGF0YSA9ICZkZXYtPnJhdy0+bWNlX2tiZDsKKwl1MzIgc2NhbmNvZGU7CisJdW5zaWduZWQgbG9uZyBkZWxheTsKKworCWlmICghKGRldi0+cmF3LT5lbmFibGVkX3Byb3RvY29scyAmIFJDX1RZUEVfTUNFX0tCRCkpCisJCXJldHVybiAwOworCisJaWYgKCFpc190aW1pbmdfZXZlbnQoZXYpKSB7CisJCWlmIChldi5yZXNldCkKKwkJCWRhdGEtPnN0YXRlID0gU1RBVEVfSU5BQ1RJVkU7CisJCXJldHVybiAwOworCX0KKworCWlmICghZ2VxX21hcmdpbihldi5kdXJhdGlvbiwgTUNJUjJfVU5JVCwgTUNJUjJfVU5JVCAvIDIpKQorCQlnb3RvIG91dDsKKworYWdhaW46CisJSVJfZHByaW50aygyLCAic3RhcnRlZCBhdCBzdGF0ZSAlaSAoJXV1cyAlcylcbiIsCisJCSAgIGRhdGEtPnN0YXRlLCBUT19VUyhldi5kdXJhdGlvbiksIFRPX1NUUihldi5wdWxzZSkpOworCisJaWYgKCFnZXFfbWFyZ2luKGV2LmR1cmF0aW9uLCBNQ0lSMl9VTklULCBNQ0lSMl9VTklUIC8gMikpCisJCXJldHVybiAwOworCisJc3dpdGNoIChkYXRhLT5zdGF0ZSkgeworCisJY2FzZSBTVEFURV9JTkFDVElWRToKKwkJaWYgKCFldi5wdWxzZSkKKwkJCWJyZWFrOworCisJCS8qIE5vdGU6IGxhcmdlciBtYXJnaW4gb24gZmlyc3QgcHVsc2Ugc2luY2UgZWFjaCBNQ0lSMl9VTklUCisJCSAgIGlzIHF1aXRlIHNob3J0IGFuZCBzb21lIGhhcmR3YXJlIHRha2VzIHNvbWUgdGltZSB0bworCQkgICBhZGp1c3QgdG8gdGhlIHNpZ25hbCAqLworCQlpZiAoIWVxX21hcmdpbihldi5kdXJhdGlvbiwgTUNJUjJfUFJFRklYX1BVTFNFLCBNQ0lSMl9VTklUKSkKKwkJCWJyZWFrOworCisJCWRhdGEtPnN0YXRlID0gU1RBVEVfSEVBREVSX0JJVF9TVEFSVDsKKwkJZGF0YS0+Y291bnQgPSAwOworCQlkYXRhLT5oZWFkZXIgPSAwOworCQlyZXR1cm4gMDsKKworCWNhc2UgU1RBVEVfSEVBREVSX0JJVF9TVEFSVDoKKwkJaWYgKGdlcV9tYXJnaW4oZXYuZHVyYXRpb24sIE1DSVIyX01BWF9MRU4sIE1DSVIyX1VOSVQgLyAyKSkKKwkJCWJyZWFrOworCisJCWRhdGEtPmhlYWRlciA8PD0gMTsKKwkJaWYgKGV2LnB1bHNlKQorCQkJZGF0YS0+aGVhZGVyIHw9IDE7CisJCWRhdGEtPmNvdW50Kys7CisJCWRhdGEtPnN0YXRlID0gU1RBVEVfSEVBREVSX0JJVF9FTkQ7CisJCXJldHVybiAwOworCisJY2FzZSBTVEFURV9IRUFERVJfQklUX0VORDoKKwkJaWYgKCFpc190cmFuc2l0aW9uKCZldiwgJmRldi0+cmF3LT5wcmV2X2V2KSkKKwkJCWJyZWFrOworCisJCWRlY3JlYXNlX2R1cmF0aW9uKCZldiwgTUNJUjJfQklUX0VORCk7CisKKwkJaWYgKGRhdGEtPmNvdW50ICE9IE1DSVIyX0hFQURFUl9OQklUUykgeworCQkJZGF0YS0+c3RhdGUgPSBTVEFURV9IRUFERVJfQklUX1NUQVJUOworCQkJZ290byBhZ2FpbjsKKwkJfQorCisJCXN3aXRjaCAobWNlX2tiZF9tb2RlKGRhdGEpKSB7CisJCWNhc2UgTUNJUjJfTU9ERV9LRVlCT0FSRDoKKwkJCWRhdGEtPndhbnRlZF9iaXRzID0gTUNJUjJfS0VZQk9BUkRfTkJJVFM7CisJCQlicmVhazsKKwkJY2FzZSBNQ0lSMl9NT0RFX01PVVNFOgorCQkJZGF0YS0+d2FudGVkX2JpdHMgPSBNQ0lSMl9NT1VTRV9OQklUUzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJSVJfZHByaW50aygxLCAibm90IGtleWJvYXJkIG9yIG1vdXNlIGRhdGFcbiIpOworCQkJZ290byBvdXQ7CisJCX0KKworCQlkYXRhLT5jb3VudCA9IDA7CisJCWRhdGEtPmJvZHkgPSAwOworCQlkYXRhLT5zdGF0ZSA9IFNUQVRFX0JPRFlfQklUX1NUQVJUOworCQlnb3RvIGFnYWluOworCisJY2FzZSBTVEFURV9CT0RZX0JJVF9TVEFSVDoKKwkJaWYgKGdlcV9tYXJnaW4oZXYuZHVyYXRpb24sIE1DSVIyX01BWF9MRU4sIE1DSVIyX1VOSVQgLyAyKSkKKwkJCWJyZWFrOworCisJCWRhdGEtPmJvZHkgPDw9IDE7CisJCWlmIChldi5wdWxzZSkKKwkJCWRhdGEtPmJvZHkgfD0gMTsKKwkJZGF0YS0+Y291bnQrKzsKKwkJZGF0YS0+c3RhdGUgPSBTVEFURV9CT0RZX0JJVF9FTkQ7CisJCXJldHVybiAwOworCisJY2FzZSBTVEFURV9CT0RZX0JJVF9FTkQ6CisJCWlmICghaXNfdHJhbnNpdGlvbigmZXYsICZkZXYtPnJhdy0+cHJldl9ldikpCisJCQlicmVhazsKKworCQlpZiAoZGF0YS0+Y291bnQgPT0gZGF0YS0+d2FudGVkX2JpdHMpCisJCQlkYXRhLT5zdGF0ZSA9IFNUQVRFX0ZJTklTSEVEOworCQllbHNlCisJCQlkYXRhLT5zdGF0ZSA9IFNUQVRFX0JPRFlfQklUX1NUQVJUOworCisJCWRlY3JlYXNlX2R1cmF0aW9uKCZldiwgTUNJUjJfQklUX0VORCk7CisJCWdvdG8gYWdhaW47CisKKwljYXNlIFNUQVRFX0ZJTklTSEVEOgorCQlpZiAoZXYucHVsc2UpCisJCQlicmVhazsKKworCQlzd2l0Y2ggKGRhdGEtPndhbnRlZF9iaXRzKSB7CisJCWNhc2UgTUNJUjJfS0VZQk9BUkRfTkJJVFM6CisJCQlzY2FuY29kZSA9IGRhdGEtPmJvZHkgJiAweGZmZmY7CisJCQlJUl9kcHJpbnRrKDEsICJrZXlib2FyZCBkYXRhIDB4JTA4eFxuIiwgZGF0YS0+Ym9keSk7CisJCQlpZiAoZGV2LT50aW1lb3V0KQorCQkJCWRlbGF5ID0gdXNlY3NfdG9famlmZmllcyhkZXYtPnRpbWVvdXQgLyAxMDAwKTsKKwkJCWVsc2UKKwkJCQlkZWxheSA9IG1zZWNzX3RvX2ppZmZpZXMoMTAwKTsKKwkJCW1vZF90aW1lcigmZGF0YS0+cnhfdGltZW91dCwgamlmZmllcyArIGRlbGF5KTsKKwkJCS8qIFBhc3MgZGF0YSB0byBrZXlib2FyZCBidWZmZXIgcGFyc2VyICovCisJCQlpcl9tY2Vfa2JkX3Byb2Nlc3Nfa2V5Ym9hcmRfZGF0YShkYXRhLT5pZGV2LCBzY2FuY29kZSk7CisJCQlicmVhazsKKwkJY2FzZSBNQ0lSMl9NT1VTRV9OQklUUzoKKwkJCXNjYW5jb2RlID0gZGF0YS0+Ym9keSAmIDB4MWZmZmZmOworCQkJSVJfZHByaW50aygxLCAibW91c2UgZGF0YSAweCUwNnhcbiIsIHNjYW5jb2RlKTsKKwkJCS8qIFBhc3MgZGF0YSB0byBtb3VzZSBidWZmZXIgcGFyc2VyICovCisJCQlpcl9tY2Vfa2JkX3Byb2Nlc3NfbW91c2VfZGF0YShkYXRhLT5pZGV2LCBzY2FuY29kZSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUlSX2RwcmludGsoMSwgIm5vdCBrZXlib2FyZCBvciBtb3VzZSBkYXRhXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJZGF0YS0+c3RhdGUgPSBTVEFURV9JTkFDVElWRTsKKwkJaW5wdXRfc3luYyhkYXRhLT5pZGV2KTsKKwkJcmV0dXJuIDA7CisJfQorCitvdXQ6CisJSVJfZHByaW50aygxLCAiZmFpbGVkIGF0IHN0YXRlICVpICgldXVzICVzKVxuIiwKKwkJICAgZGF0YS0+c3RhdGUsIFRPX1VTKGV2LmR1cmF0aW9uKSwgVE9fU1RSKGV2LnB1bHNlKSk7CisJZGF0YS0+c3RhdGUgPSBTVEFURV9JTkFDVElWRTsKKwlpbnB1dF9zeW5jKGRhdGEtPmlkZXYpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGlyX21jZV9rYmRfcmVnaXN0ZXIoc3RydWN0IHJjX2RldiAqZGV2KQoreworCXN0cnVjdCBtY2Vfa2JkX2RlYyAqbWNlX2tiZCA9ICZkZXYtPnJhdy0+bWNlX2tiZDsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2OworCWludCBpLCByZXQ7CisKKwlpZGV2ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CisJaWYgKCFpZGV2KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNucHJpbnRmKG1jZV9rYmQtPm5hbWUsIHNpemVvZihtY2Vfa2JkLT5uYW1lKSwKKwkJICJNQ0UgSVIgS2V5Ym9hcmQvTW91c2UgKCVzKSIsIGRldi0+ZHJpdmVyX25hbWUpOworCXN0cmxjYXQobWNlX2tiZC0+cGh5cywgIi9pbnB1dDAiLCBzaXplb2YobWNlX2tiZC0+cGh5cykpOworCisJaWRldi0+bmFtZSA9IG1jZV9rYmQtPm5hbWU7CisJaWRldi0+cGh5cyA9IG1jZV9rYmQtPnBoeXM7CisKKwkvKiBLZXlib2FyZCBiaXRzICovCisJc2V0X2JpdChFVl9LRVksIGlkZXYtPmV2Yml0KTsKKwlzZXRfYml0KEVWX1JFUCwgaWRldi0+ZXZiaXQpOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2Yoa2JkX2tleWNvZGVzKTsgaSsrKQorCQlzZXRfYml0KGtiZF9rZXljb2Rlc1tpXSwgaWRldi0+a2V5Yml0KTsKKworCS8qIE1vdXNlIGJpdHMgKi8KKwlzZXRfYml0KEVWX1JFTCwgaWRldi0+ZXZiaXQpOworCXNldF9iaXQoUkVMX1gsIGlkZXYtPnJlbGJpdCk7CisJc2V0X2JpdChSRUxfWSwgaWRldi0+cmVsYml0KTsKKwlzZXRfYml0KEJUTl9MRUZULCBpZGV2LT5rZXliaXQpOworCXNldF9iaXQoQlROX1JJR0hULCBpZGV2LT5rZXliaXQpOworCisJLyogUmVwb3J0IHNjYW5jb2RlcyB0b28gKi8KKwlzZXRfYml0KEVWX01TQywgaWRldi0+ZXZiaXQpOworCXNldF9iaXQoTVNDX1NDQU4sIGlkZXYtPm1zY2JpdCk7CisKKwlzZXR1cF90aW1lcigmbWNlX2tiZC0+cnhfdGltZW91dCwgbWNlX2tiZF9yeF90aW1lb3V0LAorCQkgICAgKHVuc2lnbmVkIGxvbmcpbWNlX2tiZCk7CisKKwlpbnB1dF9zZXRfZHJ2ZGF0YShpZGV2LCBtY2Vfa2JkKTsKKworI2lmIDAKKwkvKiBBZGRpbmcgdGhpcyByZWZlcmVuY2UgbWVhbnMgdHdvIGlucHV0IGRldmljZXMgYXJlIGFzc29jaWF0ZWQgd2l0aAorCSAqIHRoaXMgcmMtY29yZSBkZXZpY2UsIHdoaWNoIGlyLWtleXRhYmxlIGRvZXNuJ3QgY29wZSB3aXRoIHlldCAqLworCWlkZXYtPmRldi5wYXJlbnQgPSAmZGV2LT5kZXY7CisjZW5kaWYKKworCXJldCA9IGlucHV0X3JlZ2lzdGVyX2RldmljZShpZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlpbnB1dF9mcmVlX2RldmljZShpZGV2KTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJbWNlX2tiZC0+aWRldiA9IGlkZXY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpcl9tY2Vfa2JkX3VucmVnaXN0ZXIoc3RydWN0IHJjX2RldiAqZGV2KQoreworCXN0cnVjdCBtY2Vfa2JkX2RlYyAqbWNlX2tiZCA9ICZkZXYtPnJhdy0+bWNlX2tiZDsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICppZGV2ID0gbWNlX2tiZC0+aWRldjsKKworCWRlbF90aW1lcl9zeW5jKCZtY2Vfa2JkLT5yeF90aW1lb3V0KTsKKwlpbnB1dF91bnJlZ2lzdGVyX2RldmljZShpZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlyX3Jhd19oYW5kbGVyIG1jZV9rYmRfaGFuZGxlciA9IHsKKwkucHJvdG9jb2xzCT0gUkNfVFlQRV9NQ0VfS0JELAorCS5kZWNvZGUJCT0gaXJfbWNlX2tiZF9kZWNvZGUsCisJLnJhd19yZWdpc3Rlcgk9IGlyX21jZV9rYmRfcmVnaXN0ZXIsCisJLnJhd191bnJlZ2lzdGVyCT0gaXJfbWNlX2tiZF91bnJlZ2lzdGVyLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaXJfbWNlX2tiZF9kZWNvZGVfaW5pdCh2b2lkKQoreworCWlyX3Jhd19oYW5kbGVyX3JlZ2lzdGVyKCZtY2Vfa2JkX2hhbmRsZXIpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiSVIgTUNFIEtleWJvYXJkL21vdXNlIHByb3RvY29sIGhhbmRsZXIgaW5pdGlhbGl6ZWRcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgaXJfbWNlX2tiZF9kZWNvZGVfZXhpdCh2b2lkKQoreworCWlyX3Jhd19oYW5kbGVyX3VucmVnaXN0ZXIoJm1jZV9rYmRfaGFuZGxlcik7Cit9CisKK21vZHVsZV9pbml0KGlyX21jZV9rYmRfZGVjb2RlX2luaXQpOworbW9kdWxlX2V4aXQoaXJfbWNlX2tiZF9kZWNvZGVfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkphcm9kIFdpbHNvbiA8amFyb2RAcmVkaGF0LmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiTUNFIEtleWJvYXJkL21vdXNlIElSIHByb3RvY29sIGRlY29kZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvaXItcmF3LmMgYi9kcml2ZXJzL21lZGlhL3JjL2lyLXJhdy5jCmluZGV4IDQyM2VkNDUuLjI3ODA4YmI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL2lyLXJhdy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvaXItcmF3LmMKQEAgLTM1NSw2ICszNTUsNyBAQAogCWxvYWRfcmM2X2RlY29kZSgpOwogCWxvYWRfanZjX2RlY29kZSgpOwogCWxvYWRfc29ueV9kZWNvZGUoKTsKKwlsb2FkX21jZV9rYmRfZGVjb2RlKCk7CiAJbG9hZF9saXJjX2NvZGVjKCk7CiAKIAkvKiBJZiBuZWVkZWQsIHdlIG1heSBsYXRlciBhZGQgc29tZSBpbml0IGNvZGUuIEluIHRoaXMgY2FzZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvaXRlLWNpci5jIGIvZHJpdmVycy9tZWRpYS9yYy9pdGUtY2lyLmMKaW5kZXggZDIwMTY4Zi4uNjgyMDA5ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9pdGUtY2lyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9pdGUtY2lyLmMKQEAgLTM4Miw3ICszODIsNyBAQAogLyogdHJhbnNtaXQgb3V0IElSIHB1bHNlczsgd2hhdCB5b3UgZ2V0IGhlcmUgaXMgYSBiYXRjaCBvZiBhbHRlcm5hdGluZwogICogcHVsc2Uvc3BhY2UvcHVsc2Uvc3BhY2UgbGVuZ3RocyB0aGF0IHdlIHNob3VsZCB3cml0ZSBvdXQgY29tcGxldGVseSB0aHJvdWdoCiAgKiB0aGUgRklGTywgYmxvY2tpbmcgb24gYSBmdWxsIEZJRk8gKi8KLXN0YXRpYyBpbnQgaXRlX3R4X2lyKHN0cnVjdCByY19kZXYgKnJjZGV2LCBpbnQgKnR4YnVmLCB1MzIgbikKK3N0YXRpYyBpbnQgaXRlX3R4X2lyKHN0cnVjdCByY19kZXYgKnJjZGV2LCB1bnNpZ25lZCAqdHhidWYsIHVuc2lnbmVkIG4pCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgaXRlX2RldiAqZGV2ID0gcmNkZXYtPnByaXY7CkBAIC0zOTgsOSArMzk4LDYgQEAKIAkvKiBjbGVhciB0aGUgYXJyYXkganVzdCBpbiBjYXNlICovCiAJbWVtc2V0KGxhc3Rfc2VudCwgMCwgQVJSQVlfU0laRShsYXN0X3NlbnQpKTsKIAotCS8qIG4gY29tZXMgaW4gYnl0ZXM7IGNvbnZlcnQgdG8gaW50cyAqLwotCW4gLz0gc2l6ZW9mKGludCk7Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7CiAKIAkvKiBsZXQgZXZlcnlib2R5IGtub3cgd2UncmUgbm93IHRyYW5zbWl0dGluZyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXJjNi1tY2UuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1yYzYtbWNlLmMKaW5kZXggMDFiNjliYy4uYzM5MDdlMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXJjNi1tY2UuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtcmM2LW1jZS5jCkBAIC0yOSw3ICsyOSw3IEBACiAKIAl7IDB4ODAwZjA0MGEsIEtFWV9ERUxFVEUgfSwKIAl7IDB4ODAwZjA0MGIsIEtFWV9FTlRFUiB9LAotCXsgMHg4MDBmMDQwYywgS0VZX1BPV0VSIH0sCQkvKiBQQyBQb3dlciAqLworCXsgMHg4MDBmMDQwYywgS0VZX1NMRUVQIH0sCQkvKiBGb3JtZXJseSBQQyBQb3dlciAqLwogCXsgMHg4MDBmMDQwZCwgS0VZX01FRElBIH0sCQkvKiBXaW5kb3dzIE1DRSBidXR0b24gKi8KIAl7IDB4ODAwZjA0MGUsIEtFWV9NVVRFIH0sCiAJeyAweDgwMGYwNDBmLCBLRVlfSU5GTyB9LApAQCAtNDQsNyArNDQsNiBAQAogCXsgMHg4MDBmMDQxNiwgS0VZX1BMQVkgfSwKIAl7IDB4ODAwZjA0MTcsIEtFWV9SRUNPUkQgfSwKIAl7IDB4ODAwZjA0MTgsIEtFWV9QQVVTRSB9LAotCXsgMHg4MDBmMDQ2ZSwgS0VZX1BMQVlQQVVTRSB9LAogCXsgMHg4MDBmMDQxOSwgS0VZX1NUT1AgfSwKIAl7IDB4ODAwZjA0MWEsIEtFWV9ORVhUIH0sCiAJeyAweDgwMGYwNDFiLCBLRVlfUFJFVklPVVMgfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvbWNldXNiLmMgYi9kcml2ZXJzL21lZGlhL3JjL21jZXVzYi5jCmluZGV4IGVjOTcyZGMuLjg1ZmY5YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvbWNldXNiLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9tY2V1c2IuYwpAQCAtNjkyLDIwICs2OTIsMTggQEAKIH0KIAogLyogU2VuZCBkYXRhIG91dCB0aGUgSVIgYmxhc3RlciBwb3J0KHMpICovCi1zdGF0aWMgaW50IG1jZXVzYl90eF9pcihzdHJ1Y3QgcmNfZGV2ICpkZXYsIGludCAqdHhidWYsIHUzMiBuKQorc3RhdGljIGludCBtY2V1c2JfdHhfaXIoc3RydWN0IHJjX2RldiAqZGV2LCB1bnNpZ25lZCAqdHhidWYsIHVuc2lnbmVkIGNvdW50KQogewogCXN0cnVjdCBtY2V1c2JfZGV2ICppciA9IGRldi0+cHJpdjsKIAlpbnQgaSwgcmV0ID0gMDsKLQlpbnQgY291bnQsIGNtZGNvdW50ID0gMDsKKwlpbnQgY21kY291bnQgPSAwOwogCXVuc2lnbmVkIGNoYXIgKmNtZGJ1ZjsgLyogTUNFIGNvbW1hbmQgYnVmZmVyICovCiAJbG9uZyBzaWduYWxfZHVyYXRpb24gPSAwOyAvKiBTaW5nbmFsIGxlbmd0aCBpbiB1cyAqLwogCXN0cnVjdCB0aW1ldmFsIHN0YXJ0X3RpbWUsIGVuZF90aW1lOwogCiAJZG9fZ2V0dGltZW9mZGF5KCZzdGFydF90aW1lKTsKIAotCWNvdW50ID0gbiAvIHNpemVvZihpbnQpOwotCi0JY21kYnVmID0ga3phbGxvYyhzaXplb2YoaW50KSAqIE1DRV9DTURCVUZfU0laRSwgR0ZQX0tFUk5FTCk7CisJY21kYnVmID0ga3phbGxvYyhzaXplb2YodW5zaWduZWQpICogTUNFX0NNREJVRl9TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNtZGJ1ZikKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTc3NCw3ICs3NzIsNyBAQAogCiBvdXQ6CiAJa2ZyZWUoY21kYnVmKTsKLQlyZXR1cm4gcmV0ID8gcmV0IDogbjsKKwlyZXR1cm4gcmV0ID8gcmV0IDogY291bnQ7CiB9CiAKIC8qIFNldHMgYWN0aXZlIElSIG91dHB1dHMgLS0gbWNlIGRldmljZXMgdHlwaWNhbGx5IGhhdmUgdHdvICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL251dm90b24tY2lyLmMgYi9kcml2ZXJzL21lZGlhL3JjL251dm90b24tY2lyLmMKaW5kZXggY2U1OTVmOS4uZWFlMDViNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9udXZvdG9uLWNpci5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvbnV2b3Rvbi1jaXIuYwpAQCAtNTQ2LDI0ICs1NDYsMTggQEAKICAqIG51bWJlciBtYXkgbGFyZ2VyIHRoYW4gVFhGQ09OVCAoMHhmZikuIFNvIGluIGludGVycnVwdF9oYW5kbGVyLCBpdCBoYXMgdG8KICAqIHNldCBUWEZDT05UIGFzIDB4ZmYsIHVudGlsIGJ1Zl9jb3VudCBsZXNzIHRoYW4gMHhmZi4KICAqLwotc3RhdGljIGludCBudnRfdHhfaXIoc3RydWN0IHJjX2RldiAqZGV2LCBpbnQgKnR4YnVmLCB1MzIgbikKK3N0YXRpYyBpbnQgbnZ0X3R4X2lyKHN0cnVjdCByY19kZXYgKmRldiwgdW5zaWduZWQgKnR4YnVmLCB1bnNpZ25lZCBuKQogewogCXN0cnVjdCBudnRfZGV2ICpudnQgPSBkZXYtPnByaXY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzaXplX3QgY3VyX2NvdW50OwogCXVuc2lnbmVkIGludCBpOwogCXU4IGlyZW47CiAJaW50IHJldDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZudnQtPnR4LmxvY2ssIGZsYWdzKTsKIAotCWlmIChuID49IFRYX0JVRl9MRU4pIHsKLQkJbnZ0LT50eC5idWZfY291bnQgPSBjdXJfY291bnQgPSBUWF9CVUZfTEVOOwotCQlyZXQgPSBUWF9CVUZfTEVOOwotCX0gZWxzZSB7Ci0JCW52dC0+dHguYnVmX2NvdW50ID0gY3VyX2NvdW50ID0gbjsKLQkJcmV0ID0gbjsKLQl9CisJcmV0ID0gbWluKCh1bnNpZ25lZCkoVFhfQlVGX0xFTiAvIHNpemVvZih1bnNpZ25lZCkpLCBuKTsKKwludnQtPnR4LmJ1Zl9jb3VudCA9IChyZXQgKiBzaXplb2YodW5zaWduZWQpKTsKIAogCW1lbWNweShudnQtPnR4LmJ1ZiwgdHhidWYsIG52dC0+dHguYnVmX2NvdW50KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9yYy1jb3JlLXByaXYuaCBiL2RyaXZlcnMvbWVkaWEvcmMvcmMtY29yZS1wcml2LmgKaW5kZXggODczYjM4Ny4uMDRjMmM3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9yYy1jb3JlLXByaXYuaAorKysgYi9kcml2ZXJzL21lZGlhL3JjL3JjLWNvcmUtcHJpdi5oCkBAIC04NCw2ICs4NCwxNyBAQAogCQl1bnNpZ25lZCBjb3VudDsKIAkJdW5zaWduZWQgd2FudGVkX2JpdHM7CiAJfSByYzVfc3o7CisJc3RydWN0IG1jZV9rYmRfZGVjIHsKKwkJc3RydWN0IGlucHV0X2RldiAqaWRldjsKKwkJc3RydWN0IHRpbWVyX2xpc3QgcnhfdGltZW91dDsKKwkJY2hhciBuYW1lWzY0XTsKKwkJY2hhciBwaHlzWzY0XTsKKwkJaW50IHN0YXRlOworCQl1OCBoZWFkZXI7CisJCXUzMiBib2R5OworCQl1bnNpZ25lZCBjb3VudDsKKwkJdW5zaWduZWQgd2FudGVkX2JpdHM7CisJfSBtY2Vfa2JkOwogCXN0cnVjdCBsaXJjX2NvZGVjIHsKIAkJc3RydWN0IHJjX2RldiAqZGV2OwogCQlzdHJ1Y3QgbGlyY19kcml2ZXIgKmRydjsKQEAgLTE4Miw2ICsxOTMsMTMgQEAKICNkZWZpbmUgbG9hZF9zb255X2RlY29kZSgpCTAKICNlbmRpZgogCisvKiBmcm9tIGlyLW1jZV9rYmQtZGVjb2Rlci5jICovCisjaWZkZWYgQ09ORklHX0lSX01DRV9LQkRfREVDT0RFUl9NT0RVTEUKKyNkZWZpbmUgbG9hZF9tY2Vfa2JkX2RlY29kZSgpCXJlcXVlc3RfbW9kdWxlKCJpci1tY2Vfa2JkLWRlY29kZXIiKQorI2Vsc2UKKyNkZWZpbmUgbG9hZF9tY2Vfa2JkX2RlY29kZSgpCTAKKyNlbmRpZgorCiAvKiBmcm9tIGlyLWxpcmMtY29kZWMuYyAqLwogI2lmZGVmIENPTkZJR19JUl9MSVJDX0NPREVDX01PRFVMRQogI2RlZmluZSBsb2FkX2xpcmNfY29kZWMoKQlyZXF1ZXN0X21vZHVsZSgiaXItbGlyYy1jb2RlYyIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL3JjLWxvb3BiYWNrLmMgYi9kcml2ZXJzL21lZGlhL3JjL3JjLWxvb3BiYWNrLmMKaW5kZXggY2M4NDZiMi4uZWZjNmE1MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9yYy1sb29wYmFjay5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvcmMtbG9vcGJhY2suYwpAQCAtMTAxLDIxICsxMDEsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBsb29wX3R4X2lyKHN0cnVjdCByY19kZXYgKmRldiwgaW50ICp0eGJ1ZiwgdTMyIG4pCitzdGF0aWMgaW50IGxvb3BfdHhfaXIoc3RydWN0IHJjX2RldiAqZGV2LCB1bnNpZ25lZCAqdHhidWYsIHVuc2lnbmVkIGNvdW50KQogewogCXN0cnVjdCBsb29wYmFja19kZXYgKmxvZGV2ID0gZGV2LT5wcml2OwogCXUzMiByeG1hc2s7Ci0JdW5zaWduZWQgY291bnQ7CiAJdW5zaWduZWQgdG90YWxfZHVyYXRpb24gPSAwOwogCXVuc2lnbmVkIGk7CiAJREVGSU5FX0lSX1JBV19FVkVOVChyYXdpcik7CiAKLQlpZiAobiA9PSAwIHx8IG4gJSBzaXplb2YoaW50KSkgewotCQlkcHJpbnRrKCJpbnZhbGlkIHR4IGJ1ZmZlciBzaXplXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JY291bnQgPSBuIC8gc2l6ZW9mKGludCk7CiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCiAJCXRvdGFsX2R1cmF0aW9uICs9IGFicyh0eGJ1ZltpXSk7CiAKQEAgLTE0Miw3ICsxMzUsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKIAkJcmF3aXIucHVsc2UgPSBpICUgMiA/IGZhbHNlIDogdHJ1ZTsKLQkJcmF3aXIuZHVyYXRpb24gPSBhYnModHhidWZbaV0pICogMTAwMDsKKwkJcmF3aXIuZHVyYXRpb24gPSB0eGJ1ZltpXSAqIDEwMDA7CiAJCWlmIChyYXdpci5kdXJhdGlvbikKIAkJCWlyX3Jhd19ldmVudF9zdG9yZV93aXRoX2ZpbHRlcihkZXYsICZyYXdpcik7CiAJfQpAQCAtMTU4LDcgKzE1MSw3IEBACiAJLyogTGlyYyBleHBlY3RzIHRoaXMgZnVuY3Rpb24gdG8gdGFrZSBhcyBsb25nIGFzIHRoZSB0b3RhbCBkdXJhdGlvbiAqLwogCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJc2NoZWR1bGVfdGltZW91dCh1c2Vjc190b19qaWZmaWVzKHRvdGFsX2R1cmF0aW9uKSk7Ci0JcmV0dXJuIG47CisJcmV0dXJuIGNvdW50OwogfQogCiBzdGF0aWMgdm9pZCBsb29wX3NldF9pZGxlKHN0cnVjdCByY19kZXYgKmRldiwgYm9vbCBlbmFibGUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL3JjLW1haW4uYyBiL2RyaXZlcnMvbWVkaWEvcmMvcmMtbWFpbi5jCmluZGV4IDMxODZhYzcuLjUxYTIzZjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvcmMtbWFpbi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvcmMtbWFpbi5jCkBAIC03MzUsNiArNzM1LDcgQEAKIAl7IFJDX1RZUEVfSlZDLAkJImp2YyIJCX0sCiAJeyBSQ19UWVBFX1NPTlksCQkic29ueSIJCX0sCiAJeyBSQ19UWVBFX1JDNV9TWiwJInJjLTUtc3oiCX0sCisJeyBSQ19UWVBFX01DRV9LQkQsCSJtY2Vfa2JkIgl9LAogCXsgUkNfVFlQRV9MSVJDLAkJImxpcmMiCQl9LAogCXsgUkNfVFlQRV9PVEhFUiwJIm90aGVyIgkJfSwKIH07CkBAIC0xMDk5LDcgKzExMDAsNiBAQAogCQlpZiAocmMgPCAwKQogCQkJZ290byBvdXRfaW5wdXQ7CiAJfQotCW11dGV4X3VubG9jaygmZGV2LT5sb2NrKTsKIAogCWlmIChkZXYtPmNoYW5nZV9wcm90b2NvbCkgewogCQlyYyA9IGRldi0+Y2hhbmdlX3Byb3RvY29sKGRldiwgcmNfbWFwLT5yY190eXBlKTsKQEAgLTExMDcsNiArMTEwNyw4IEBACiAJCQlnb3RvIG91dF9yYXc7CiAJfQogCisJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCiAJSVJfZHByaW50aygxLCAiUmVnaXN0ZXJlZCByYyVsZCAoZHJpdmVyOiAlcywgcmVtb3RlOiAlcywgbW9kZSAlcylcbiIsCiAJCSAgIGRldi0+ZGV2bm8sCiAJCSAgIGRldi0+ZHJpdmVyX25hbWUgPyBkZXYtPmRyaXZlcl9uYW1lIDogInVua25vd24iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9yZWRyYXQzLmMgYi9kcml2ZXJzL21lZGlhL3JjL3JlZHJhdDMuYwppbmRleCA1MTQ3NzY3Li5hMTY2MDQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL3JlZHJhdDMuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL3JlZHJhdDMuYwpAQCAtMjA1LDYgKzIwNSw3IEBACiAKIAkvKiByeCBzaWduYWwgdGltZW91dCB0aW1lciAqLwogCXN0cnVjdCB0aW1lcl9saXN0IHJ4X3RpbWVvdXQ7CisJdTMyIGh3X3RpbWVvdXQ7CiAKIAkvKiBJcyB0aGUgZGV2aWNlIGN1cnJlbnRseSByZWNlaXZpbmc/ICovCiAJYm9vbCByZWN2X2luX3Byb2dyZXNzOwpAQCAtNDE0LDIwICs0MTUsMTAgQEAKIAogfQogCi0vKiB0aW1lciBjYWxsYmFjayB0byBzZW5kIGxvbmcgdHJhaWxpbmcgc3BhY2Ugb24gcmVjZWl2ZSB0aW1lb3V0ICovCisvKiB0aW1lciBjYWxsYmFjayB0byBzZW5kIHJlc2V0IGV2ZW50ICovCiBzdGF0aWMgdm9pZCByZWRyYXQzX3J4X3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCByZWRyYXQzX2RldiAqcnIzID0gKHN0cnVjdCByZWRyYXQzX2RldiAqKWRhdGE7Ci0JREVGSU5FX0lSX1JBV19FVkVOVChyYXdpcik7Ci0KLQlyYXdpci5wdWxzZSA9IGZhbHNlOwotCXJhd2lyLmR1cmF0aW9uID0gcnIzLT5yYy0+dGltZW91dDsKLQlycjNfZGJnKHJyMy0+ZGV2LCAic3RvcmluZyB0cmFpbGluZyBzcGFjZSB3aXRoIGR1cmF0aW9uICVkXG4iLAotCQlyYXdpci5kdXJhdGlvbik7Ci0JaXJfcmF3X2V2ZW50X3N0b3JlX3dpdGhfZmlsdGVyKHJyMy0+cmMsICZyYXdpcik7Ci0KLQlycjNfZGJnKHJyMy0+ZGV2LCAiY2FsbGluZyBpcl9yYXdfZXZlbnRfaGFuZGxlXG4iKTsKLQlpcl9yYXdfZXZlbnRfaGFuZGxlKHJyMy0+cmMpOwogCiAJcnIzX2RiZyhycjMtPmRldiwgImNhbGxpbmcgaXJfcmF3X2V2ZW50X3Jlc2V0XG4iKTsKIAlpcl9yYXdfZXZlbnRfcmVzZXQocnIzLT5yYyk7CkBAIC00MzgsNyArNDI5LDcgQEAKIAlERUZJTkVfSVJfUkFXX0VWRU5UKHJhd2lyKTsKIAlzdHJ1Y3QgcmVkcmF0M19zaWduYWxfaGVhZGVyIGhlYWRlcjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0JaW50IGk7CisJaW50IGksIHRyYWlsZXIgPSAwOwogCXVuc2lnbmVkIGxvbmcgZGVsYXk7CiAJdTMyIG1vZF9mcmVxLCBzaW5nbGVfbGVuOwogCXUxNiAqbGVuX3ZhbHM7CkBAIC00NjQsNyArNDU1LDggQEAKIAlpZiAoIShoZWFkZXIubGVuZ3RoID49IFJSM19IRUFERVJfTEVOR1RIKSkKIAkJZGV2X3dhcm4oZGV2LCAicmVhZCByZXR1cm5lZCBsZXNzIHRoYW4gcnIzIGhlYWRlciBsZW5cbiIpOwogCi0JZGVsYXkgPSB1c2Vjc190b19qaWZmaWVzKHJyMy0+cmMtPnRpbWVvdXQgLyAxMDAwKTsKKwkvKiBNYWtlIHN1cmUgd2UgcmVzZXQgdGhlIElSIGtmaWZvIGFmdGVyIGEgYml0IG9mIGluYWN0aXZpdHkgKi8KKwlkZWxheSA9IHVzZWNzX3RvX2ppZmZpZXMocnIzLT5od190aW1lb3V0KTsKIAltb2RfdGltZXIoJnJyMy0+cnhfdGltZW91dCwgamlmZmllcyArIGRlbGF5KTsKIAogCW1lbWNweSgmdG1wMzIsIHNpZ19kYXRhICsgUlIzX1BBVVNFX09GRlNFVCwgc2l6ZW9mKHRtcDMyKSk7CkBAIC01MDYsOSArNDk4LDYgQEAKIAkJdTE2IHZhbCA9IGxlbl92YWxzW2RhdGFfdmFsc1tpXV07CiAJCXNpbmdsZV9sZW4gPSByZWRyYXQzX2xlbl90b191cygodTMyKWJlMTZfdG9fY3B1KHZhbCkpOwogCi0JCS8qIGNhcCB0aGUgdmFsdWUgdG8gSVJfTUFYX0RVUkFUSU9OICovCi0JCXNpbmdsZV9sZW4gJj0gSVJfTUFYX0RVUkFUSU9OOwotCiAJCS8qIHdlIHNob3VsZCBhbHdheXMgZ2V0IHB1bHNlL3NwYWNlL3B1bHNlL3NwYWNlIHNhbXBsZXMgKi8KIAkJaWYgKGkgJSAyKQogCQkJcmF3aXIucHVsc2UgPSBmYWxzZTsKQEAgLTUxNiw2ICs1MDUsMTIgQEAKIAkJCXJhd2lyLnB1bHNlID0gdHJ1ZTsKIAogCQlyYXdpci5kdXJhdGlvbiA9IFVTX1RPX05TKHNpbmdsZV9sZW4pOworCQkvKiBTYXZlIGluaXRpYWwgcHVsc2UgbGVuZ3RoIHRvIGZ1ZGdlIHRyYWlsZXIgKi8KKwkJaWYgKGkgPT0gMCkKKwkJCXRyYWlsZXIgPSByYXdpci5kdXJhdGlvbjsKKwkJLyogY2FwIHRoZSB2YWx1ZSB0byBJUl9NQVhfRFVSQVRJT04gKi8KKwkJcmF3aXIuZHVyYXRpb24gJj0gSVJfTUFYX0RVUkFUSU9OOworCiAJCXJyM19kYmcoZGV2LCAic3RvcmluZyAlcyB3aXRoIGR1cmF0aW9uICVkIChpOiAlZClcbiIsCiAJCQlyYXdpci5wdWxzZSA/ICJwdWxzZSIgOiAic3BhY2UiLCByYXdpci5kdXJhdGlvbiwgaSk7CiAJCWlyX3Jhd19ldmVudF9zdG9yZV93aXRoX2ZpbHRlcihycjMtPnJjLCAmcmF3aXIpOwpAQCAtNTI1LDcgKzUyMCwxMCBAQAogCWlmIChpICUgMikgewogCQlyYXdpci5wdWxzZSA9IGZhbHNlOwogCQkvKiB0aGlzIGR1cmF0aW9uIGlzIG1hZGUgdXAsIGFuZCBtYXkgbm90IGJlIGlkZWFsLi4uICovCi0JCXJhd2lyLmR1cmF0aW9uID0gcnIzLT5yYy0+dGltZW91dCAvIDI7CisJCWlmICh0cmFpbGVyIDwgVVNfVE9fTlMoMTAwMCkpCisJCQlyYXdpci5kdXJhdGlvbiA9IFVTX1RPX05TKDI4MDApOworCQllbHNlCisJCQlyYXdpci5kdXJhdGlvbiA9IHRyYWlsZXI7CiAJCXJyM19kYmcoZGV2LCAic3RvcmluZyB0cmFpbGluZyBzcGFjZSB3aXRoIGR1cmF0aW9uICVkXG4iLAogCQkJcmF3aXIuZHVyYXRpb24pOwogCQlpcl9yYXdfZXZlbnRfc3RvcmVfd2l0aF9maWx0ZXIocnIzLT5yYywgJnJhd2lyKTsKQEAgLTYyOSwzNiArNjI3LDMxIEBACiAJa2ZyZWUocnIzKTsKIH0KIAotc3RhdGljIHUzMiByZWRyYXQzX2dldF90aW1lb3V0KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJCSAgICAgICBzdHJ1Y3QgcmNfZGV2ICpyYywgc3RydWN0IHVzYl9kZXZpY2UgKnVkZXYpCitzdGF0aWMgdTMyIHJlZHJhdDNfZ2V0X3RpbWVvdXQoc3RydWN0IHJlZHJhdDNfZGV2ICpycjMpCiB7CiAJdTMyICp0bXA7Ci0JdTMyIHRpbWVvdXQgPSBNU19UT19OUygxNTApOyAvKiBhIHNhbmUgZGVmYXVsdCwgaWYgdGhpbmdzIGdvIGhheXdpcmUgKi8KKwl1MzIgdGltZW91dCA9IE1TX1RPX1VTKDE1MCk7IC8qIGEgc2FuZSBkZWZhdWx0LCBpZiB0aGluZ3MgZ28gaGF5d2lyZSAqLwogCWludCBsZW4sIHJldCwgcGlwZTsKIAogCWxlbiA9IHNpemVvZigqdG1wKTsKIAl0bXAgPSBremFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0bXApIHsKLQkJZGV2X3dhcm4oZGV2LCAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGx1cmVcbiIpOworCQlkZXZfd2FybihycjMtPmRldiwgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxsdXJlXG4iKTsKIAkJcmV0dXJuIHRpbWVvdXQ7CiAJfQogCi0JcGlwZSA9IHVzYl9yY3ZjdHJscGlwZSh1ZGV2LCAwKTsKLQlyZXQgPSB1c2JfY29udHJvbF9tc2codWRldiwgcGlwZSwgUlIzX0dFVF9JUl9QQVJBTSwKKwlwaXBlID0gdXNiX3JjdmN0cmxwaXBlKHJyMy0+dWRldiwgMCk7CisJcmV0ID0gdXNiX2NvbnRyb2xfbXNnKHJyMy0+dWRldiwgcGlwZSwgUlIzX0dFVF9JUl9QQVJBTSwKIAkJCSAgICAgIFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UgfCBVU0JfRElSX0lOLAogCQkJICAgICAgUlIzX0lSX0lPX1NJR19USU1FT1VULCAwLCB0bXAsIGxlbiwgSFogKiA1KTsKIAlpZiAocmV0ICE9IGxlbikgewotCQlkZXZfd2FybihkZXYsICJGYWlsZWQgdG8gcmVhZCB0aW1lb3V0IGZyb20gaGFyZHdhcmVcbiIpOworCQlkZXZfd2FybihycjMtPmRldiwgIkZhaWxlZCB0byByZWFkIHRpbWVvdXQgZnJvbSBoYXJkd2FyZVxuIik7CiAJCXJldHVybiB0aW1lb3V0OwogCX0KIAotCXRpbWVvdXQgPSBVU19UT19OUyhyZWRyYXQzX2xlbl90b191cyhiZTMyX3RvX2NwdSgqdG1wKSkpOwotCWlmICh0aW1lb3V0IDwgcmMtPm1pbl90aW1lb3V0KQotCQl0aW1lb3V0ID0gcmMtPm1pbl90aW1lb3V0OwotCWVsc2UgaWYgKHRpbWVvdXQgPiByYy0+bWF4X3RpbWVvdXQpCi0JCXRpbWVvdXQgPSByYy0+bWF4X3RpbWVvdXQ7CisJdGltZW91dCA9IHJlZHJhdDNfbGVuX3RvX3VzKGJlMzJfdG9fY3B1KCp0bXApKTsKIAotCXJyM19kYmcoZGV2LCAiR290IHRpbWVvdXQgb2YgJWQgbXNcbiIsIHRpbWVvdXQgLyAoMTAwMCAqIDEwMDApKTsKKwlycjNfZGJnKHJyMy0+ZGV2LCAiR290IHRpbWVvdXQgb2YgJWQgbXNcbiIsIHRpbWVvdXQgLyAxMDAwKTsKIAlyZXR1cm4gdGltZW91dDsKIH0KIApAQCAtMTExMCw5ICsxMTAzLDcgQEAKIAlyYy0+cHJpdiA9IHJyMzsKIAlyYy0+ZHJpdmVyX3R5cGUgPSBSQ19EUklWRVJfSVJfUkFXOwogCXJjLT5hbGxvd2VkX3Byb3RvcyA9IFJDX1RZUEVfQUxMOwotCXJjLT5taW5fdGltZW91dCA9IE1TX1RPX05TKFJSM19SWF9NSU5fVElNRU9VVCk7Ci0JcmMtPm1heF90aW1lb3V0ID0gTVNfVE9fTlMoUlIzX1JYX01BWF9USU1FT1VUKTsKLQlyYy0+dGltZW91dCA9IHJlZHJhdDNfZ2V0X3RpbWVvdXQoZGV2LCByYywgcnIzLT51ZGV2KTsKKwlyYy0+dGltZW91dCA9IFVTX1RPX05TKDI3NTApOwogCXJjLT50eF9pciA9IHJlZHJhdDNfdHJhbnNtaXRfaXI7CiAJcmMtPnNfdHhfY2FycmllciA9IHJlZHJhdDNfc2V0X3R4X2NhcnJpZXI7CiAJcmMtPmRyaXZlcl9uYW1lID0gRFJJVkVSX05BTUU7CkBAIC0xMTg2LDcgKzExNzcsNyBAQAogCXJyMyA9IGt6YWxsb2Moc2l6ZW9mKCpycjMpLCBHRlBfS0VSTkVMKTsKIAlpZiAocnIzID09IE5VTEwpIHsKIAkJZGV2X2VycihkZXYsICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iKTsKLQkJZ290byBlcnJvcjsKKwkJZ290byBub19lbmRwb2ludHM7CiAJfQogCiAJcnIzLT5kZXYgPSAmaW50Zi0+ZGV2OwpAQCAtMTI0Miw2ICsxMjMzLDkgQEAKIAlpZiAocmV0dmFsIDwgMCkKIAkJZ290byBlcnJvcjsKIAorCS8qIHN0b3JlIGN1cnJlbnQgaGFyZHdhcmUgdGltZW91dCwgaW4gdXMsIHdpbGwgdXNlIGZvciBrZmlmbyByZXNldHMgKi8KKwlycjMtPmh3X3RpbWVvdXQgPSByZWRyYXQzX2dldF90aW1lb3V0KHJyMyk7CisKIAkvKiBkZWZhdWx0Li4gd2lsbCBnZXQgb3ZlcnJpZGRlbiBieSBhbnkgc2VuZHMgd2l0aCBhIGZyZXEgZGVmaW5lZCAqLwogCXJyMy0+Y2FycmllciA9IDM4MDAwOwogCkBAIC0xMjgwLDYgKzEyNzQsNyBAQAogCiAJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsKIAlyY191bnJlZ2lzdGVyX2RldmljZShycjMtPnJjKTsKKwlkZWxfdGltZXJfc3luYygmcnIzLT5yeF90aW1lb3V0KTsKIAlyZWRyYXQzX2RlbGV0ZShycjMsIHVkZXYpOwogCiAJcnIzX2Z0cigmaW50Zi0+ZGV2LCAiUmVkUmF0MyBJUiBUcmFuc2NlaXZlciBub3cgZGlzY29ubmVjdGVkXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMvd2luYm9uZC1jaXIuYyBiL2RyaXZlcnMvbWVkaWEvcmMvd2luYm9uZC1jaXIuYwppbmRleCA1ZDA2Yjg5Li5iZWM4YWJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3JjL3dpbmJvbmQtY2lyLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy93aW5ib25kLWNpci5jCkBAIC02LDggKzYsOCBAQAogICogIGNvdWxkIHByb2JhYmx5IHN1cHBvcnQgb3RoZXJzIChXaW5ib25kIFdFQzEwMlgsIE5hdFNlbWksIGV0YykKICAqICB3aXRoIG1pbm9yIG1vZGlmaWNhdGlvbnMuCiAgKgotICogIE9yaWdpbmFsIEF1dGhvcjogRGF2aWQgSORyZGVtYW4gPGRhdmlkQGhhcmRlbWFuLm51PgotICogICAgIENvcHlyaWdodCAoQykgMjAwOSAtIDIwMTAgRGF2aWQgSORyZGVtYW4gPGRhdmlkQGhhcmRlbWFuLm51PgorICogIE9yaWdpbmFsIEF1dGhvcjogRGF2aWQgSMOkcmRlbWFuIDxkYXZpZEBoYXJkZW1hbi5udT4KKyAqICAgICBDb3B5cmlnaHQgKEMpIDIwMDkgLSAyMDExIERhdmlkIEjDpHJkZW1hbiA8ZGF2aWRAaGFyZGVtYW4ubnU+CiAgKgogICogIERlZGljYXRlZCB0byBteSBkYXVnaHRlciBNYXRpbGRhLCB3aXRob3V0IHdob3NlIGxvdmluZyBhdHRlbnRpb24gdGhpcwogICogIGRyaXZlciB3b3VsZCBoYXZlIGJlZW4gZmluaXNoZWQgaW4gaGFsZiB0aGUgdGltZSBhbmQgd2l0aCBhIGZyYWN0aW9uCkBAIC01NzcsMTYgKzU3NywxMiBAQAogfQogCiBzdGF0aWMgaW50Ci13YmNpcl90eChzdHJ1Y3QgcmNfZGV2ICpkZXYsIGludCAqYnVmLCB1MzIgYnVmc2l6ZSkKK3diY2lyX3R4KHN0cnVjdCByY19kZXYgKmRldiwgdW5zaWduZWQgKmJ1ZiwgdW5zaWduZWQgY291bnQpCiB7CiAJc3RydWN0IHdiY2lyX2RhdGEgKmRhdGEgPSBkZXYtPnByaXY7Ci0JdTMyIGNvdW50OwogCXVuc2lnbmVkIGk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCS8qIGJ1ZnNpemUgaGFzIGJlZW4gc2FuaXR5IGNoZWNrZWQgYnkgdGhlIGNhbGxlciAqLwotCWNvdW50ID0gYnVmc2l6ZSAvIHNpemVvZihpbnQpOwotCiAJLyogTm90IHN1cmUgaWYgdGhpcyBpcyBwb3NzaWJsZSwgYnV0IGJldHRlciBzYWZlIHRoYW4gc29ycnkgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGF0YS0+c3BpbmxvY2ssIGZsYWdzKTsKIAlpZiAoZGF0YS0+dHhzdGF0ZSAhPSBXQkNJUl9UWFNUQVRFX0lOQUNUSVZFKSB7CkBAIC04NzYsMTggKzg3Miw4IEBACiAJLyogcHJlc2NhbGVyIDEuMCwgdHgvcnggZmlmbyBsdmwgMTYgKi8KIAlvdXRiKDB4MzAsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19FWENSMik7CiAKLQkvKiBTZXQgYmF1ZCBkaXZpc29yIHRvIGdlbmVyYXRlIG9uZSBieXRlIHBlciBiaXQvY2VsbCAqLwotCXN3aXRjaCAocHJvdG9jb2wpIHsKLQljYXNlIElSX1BST1RPQ09MX1JDNToKLQkJb3V0YigweEE3LCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfQkdETCk7Ci0JCWJyZWFrOwotCWNhc2UgSVJfUFJPVE9DT0xfUkM2OgotCQlvdXRiKDB4NTMsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19CR0RMKTsKLQkJYnJlYWs7Ci0JY2FzZSBJUl9QUk9UT0NPTF9ORUM6Ci0JCW91dGIoMHg2OSwgZGF0YS0+c2Jhc2UgKyBXQkNJUl9SRUdfU1AzX0JHREwpOwotCQlicmVhazsKLQl9CisJLyogU2V0IGJhdWQgZGl2aXNvciB0byBzYW1wbGUgZXZlcnkgMTAgdXMgKi8KKwlvdXRiKDB4MEYsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19CR0RMKTsKIAlvdXRiKDB4MDAsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19CR0RIKTsKIAogCS8qIFNldCBDRUlSIG1vZGUgKi8KQEAgLTg5Niw5ICs4ODIsOSBAQAogCWluYihkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfTFNSKTsgLyogQ2xlYXIgTFNSICovCiAJaW5iKGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19NU1IpOyAvKiBDbGVhciBNU1IgKi8KIAotCS8qIERpc2FibGUgUlggZGVtb2QsIHJ1bi1sZW5ndGggZW5jb2RpbmcvZGVjb2RpbmcsIHNldCBmcmVxIHNwYW4gKi8KKwkvKiBEaXNhYmxlIFJYIGRlbW9kLCBlbmFibGUgcnVuLWxlbmd0aCBlbmMvZGVjLCBzZXQgZnJlcSBzcGFuICovCiAJd2JjaXJfc2VsZWN0X2JhbmsoZGF0YSwgV0JDSVJfQkFOS183KTsKLQlvdXRiKDB4MTAsIGRhdGEtPnNiYXNlICsgV0JDSVJfUkVHX1NQM19SQ0NGRyk7CisJb3V0YigweDkwLCBkYXRhLT5zYmFzZSArIFdCQ0lSX1JFR19TUDNfUkNDRkcpOwogCiAJLyogRGlzYWJsZSB0aW1lciAqLwogCXdiY2lyX3NlbGVjdF9iYW5rKGRhdGEsIFdCQ0lSX0JBTktfNCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL0tjb25maWcKaW5kZXggYmI1M2RlNy4uZjU3NGRjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vS2NvbmZpZwpAQCAtNDg5LDYgKzQ4OSwxNSBAQAogCSAgVGhpcyBpcyBhIGRyaXZlciBmb3IgdGhlIFRvc2hpYmEgVENNODI1eCBWR0EgY2FtZXJhIHNlbnNvci4KIAkgIEl0IGlzIHVzZWQgZm9yIGV4YW1wbGUgaW4gTm9raWEgTjgwMC4KIAorY29tbWVudCAiRmxhc2ggZGV2aWNlcyIKKworY29uZmlnIFZJREVPX0FEUDE2NTMKKwl0cmlzdGF0ZSAiQURQMTY1MyBmbGFzaCBzdXBwb3J0IgorCWRlcGVuZHMgb24gSTJDICYmIFZJREVPX1Y0TDIgJiYgTUVESUFfQ09OVFJPTExFUgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSBkcml2ZXIgZm9yIHRoZSBBRFAxNjUzIGZsYXNoIGNvbnRyb2xsZXIuIEl0IGlzIHVzZWQgZm9yCisJICBleGFtcGxlIGluIE5va2lhIE45MDAuCisKIGNvbW1lbnQgIlZpZGVvIGltcHJvdmVtZW50IGNoaXBzIgogCiBjb25maWcgVklERU9fVVBENjQwMzFBCkBAIC03MDcsNiArNzE2LDggQEAKIAogc291cmNlICJkcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxNjQvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL21lZGlhL3ZpZGVvL21hcnZlbGwtY2NpYy9LY29uZmlnIgorCiBjb25maWcgVklERU9fTTMyUl9BUgogCXRyaXN0YXRlICJBUiBkZXZpY2VzIgogCWRlcGVuZHMgb24gTTMyUiAmJiBWSURFT19WNEwyCkBAIC03MjYsMTUgKzczNyw2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBhcnYuCiAKLWNvbmZpZyBWSURFT19DQUZFX0NDSUMKLQl0cmlzdGF0ZSAiTWFydmVsbCA4OEFMUDAxIChDYWZlKSBDTU9TIENhbWVyYSBDb250cm9sbGVyIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQQ0kgJiYgSTJDICYmIFZJREVPX1Y0TDIKLQlzZWxlY3QgVklERU9fT1Y3NjcwCi0JLS0taGVscC0tLQotCSAgVGhpcyBpcyBhIHZpZGVvNGxpbnV4MiBkcml2ZXIgZm9yIHRoZSBNYXJ2ZWxsIDg4QUxQMDEgaW50ZWdyYXRlZAotCSAgQ01PUyBjYW1lcmEgY29udHJvbGxlci4gIFRoaXMgaXMgdGhlIGNvbnRyb2xsZXIgZm91bmQgb24gZmlyc3QtCi0JICBnZW5lcmF0aW9uIE9MUEMgc3lzdGVtcy4KLQogY29uZmlnIFZJREVPX1NSMDMwUEMzMAogCXRyaXN0YXRlICJTUjAzMFBDMzAgVkdBIGNhbWVyYSBzZW5zb3Igc3VwcG9ydCIKIAlkZXBlbmRzIG9uIEkyQyAmJiBWSURFT19WNEwyCkBAIC04NDYsNiArODQ4LDEyIEBACiAJaGVscAogCSAgVGhpcyBpcyBhIG92MjY0MCBjYW1lcmEgZHJpdmVyCiAKK2NvbmZpZyBTT0NfQ0FNRVJBX09WNTY0MgorCXRyaXN0YXRlICJvdjU2NDIgY2FtZXJhIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTT0NfQ0FNRVJBICYmIEkyQworCWhlbHAKKwkgIFRoaXMgaXMgYSBWNEwyIGNhbWVyYSBkcml2ZXIgZm9yIHRoZSBPbW5pVmlzaW9uIE9WNTY0MiBzZW5zb3IKKwogY29uZmlnIFNPQ19DQU1FUkFfT1Y2NjUwCiAJdHJpc3RhdGUgIm92NjY1MCBzZW5zb3Igc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFNPQ19DQU1FUkEgJiYgSTJDCkBAIC05NTIsNiArOTYwLDE0IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBzNXAtZmltYy4KIAorY29uZmlnIFZJREVPX0FUTUVMX0lTSQorCXRyaXN0YXRlICJBVE1FTCBJbWFnZSBTZW5zb3IgSW50ZXJmYWNlIChJU0kpIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBWSURFT19ERVYgJiYgU09DX0NBTUVSQSAmJiBBUkNIX0FUOTEKKwlzZWxlY3QgVklERU9CVUYyX0RNQV9DT05USUcKKwktLS1oZWxwLS0tCisJICBUaGlzIG1vZHVsZSBtYWtlcyB0aGUgQVRNRUwgSW1hZ2UgU2Vuc29yIEludGVyZmFjZSBhdmFpbGFibGUKKwkgIGFzIGEgdjRsMiBkZXZpY2UuCisKIGNvbmZpZyBWSURFT19TNVBfTUlQSV9DU0lTCiAJdHJpc3RhdGUgIlNhbXN1bmcgUzVQIGFuZCBFWFlOT1M0IE1JUEkgQ1NJIHJlY2VpdmVyIGRyaXZlciIKIAlkZXBlbmRzIG9uIFZJREVPX1Y0TDIgJiYgUE1fUlVOVElNRSAmJiBQTEFUX1M1UCAmJiBWSURFT19WNEwyX1NVQkRFVl9BUEkKQEAgLTk2MSw2ICs5NzcsOCBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgczVwLWNzaXMuCiAKK3NvdXJjZSAiZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvS2NvbmZpZyIKKwogIwogIyBVU0IgTXVsdGltZWRpYSBkZXZpY2UgY29uZmlndXJhdGlvbgogIwpAQCAtMTA1Niw0ICsxMDc0LDEyIEBACiAJICBmcmFtZXdvcmsuCiAKIAorY29uZmlnIFZJREVPX1NBTVNVTkdfUzVQX01GQworCXRyaXN0YXRlICJTYW1zdW5nIFM1UCBNRkMgNS4xIFZpZGVvIENvZGVjIgorCWRlcGVuZHMgb24gVklERU9fREVWICYmIFZJREVPX1Y0TDIgJiYgUExBVF9TNVAKKwlzZWxlY3QgVklERU9CVUYyX0RNQV9DT05USUcKKwlkZWZhdWx0IG4KKwloZWxwCisJICAgIE1GQyA1LjEgZHJpdmVyIGZvciBWNEwyLgorCiBlbmRpZiAjIFY0TF9NRU0yTUVNX0RSSVZFUlMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL01ha2VmaWxlCmluZGV4IGYwZmVjZDYuLjI3MjM5MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9NYWtlZmlsZQpAQCAtNzAsNiArNzAsNyBAQAogb2JqLSQoQ09ORklHX1ZJREVPX1NSMDMwUEMzMCkJKz0gc3IwMzBwYzMwLm8KIG9iai0kKENPTkZJR19WSURFT19OT09OMDEwUEMzMCkJKz0gbm9vbjAxMHBjMzAubwogb2JqLSQoQ09ORklHX1ZJREVPX001TU9MUykJKz0gbTVtb2xzLworb2JqLSQoQ09ORklHX1ZJREVPX0FEUDE2NTMpCSs9IGFkcDE2NTMubwogCiBvYmotJChDT05GSUdfU09DX0NBTUVSQV9JTVgwNzQpCQkrPSBpbXgwNzQubwogb2JqLSQoQ09ORklHX1NPQ19DQU1FUkFfTVQ5TTAwMSkJKz0gbXQ5bTAwMS5vCkBAIC03OCw2ICs3OSw3IEBACiBvYmotJChDT05GSUdfU09DX0NBTUVSQV9NVDlUMTEyKQkrPSBtdDl0MTEyLm8KIG9iai0kKENPTkZJR19TT0NfQ0FNRVJBX01UOVYwMjIpCSs9IG10OXYwMjIubwogb2JqLSQoQ09ORklHX1NPQ19DQU1FUkFfT1YyNjQwKQkJKz0gb3YyNjQwLm8KK29iai0kKENPTkZJR19TT0NfQ0FNRVJBX09WNTY0MikJCSs9IG92NTY0Mi5vCiBvYmotJChDT05GSUdfU09DX0NBTUVSQV9PVjY2NTApCQkrPSBvdjY2NTAubwogb2JqLSQoQ09ORklHX1NPQ19DQU1FUkFfT1Y3NzJYKQkJKz0gb3Y3NzJ4Lm8KIG9iai0kKENPTkZJR19TT0NfQ0FNRVJBX09WOTY0MCkJCSs9IG92OTY0MC5vCkBAIC0xMjcsNyArMTI5LDggQEAKIAogb2JqLSQoQ09ORklHX1ZJREVPX0NYMjM0MVgpICs9IGN4MjM0MXgubwogCi1vYmotJChDT05GSUdfVklERU9fQ0FGRV9DQ0lDKSArPSBjYWZlX2NjaWMubworb2JqLSQoQ09ORklHX1ZJREVPX0NBRkVfQ0NJQykgKz0gbWFydmVsbC1jY2ljLworb2JqLSQoQ09ORklHX1ZJREVPX01NUF9DQU1FUkEpICs9IG1hcnZlbGwtY2NpYy8KIAogb2JqLSQoQ09ORklHX1ZJREVPX1ZJQV9DQU1FUkEpICs9IHZpYS1jYW1lcmEubwogCkBAIC0xNjYsOCArMTY5LDExIEBACiBvYmotJChDT05GSUdfVklERU9fU0hfTU9CSUxFX0NTSTIpCSs9IHNoX21vYmlsZV9jc2kyLm8KIG9iai0kKENPTkZJR19WSURFT19TSF9NT0JJTEVfQ0VVKQkrPSBzaF9tb2JpbGVfY2V1X2NhbWVyYS5vCiBvYmotJChDT05GSUdfVklERU9fT01BUDEpCQkrPSBvbWFwMV9jYW1lcmEubworb2JqLSQoQ09ORklHX1ZJREVPX0FUTUVMX0lTSSkJCSs9IGF0bWVsLWlzaS5vCiAKIG9iai0kKENPTkZJR19WSURFT19TQU1TVU5HX1M1UF9GSU1DKSAJKz0gczVwLWZpbWMvCitvYmotJChDT05GSUdfVklERU9fU0FNU1VOR19TNVBfTUZDKQkrPSBzNXAtbWZjLworb2JqLSQoQ09ORklHX1ZJREVPX1NBTVNVTkdfUzVQX1RWKQkrPSBzNXAtdHYvCiAKIG9iai0kKENPTkZJR19BUkNIX0RBVklOQ0kpCQkrPSBkYXZpbmNpLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2FkcDE2NTMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYWRwMTY1My5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlN2JlZmQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2FkcDE2NTMuYwpAQCAtMCwwICsxLDQ5MSBAQAorLyoKKyAqIGRyaXZlcnMvbWVkaWEvdmlkZW8vYWRwMTY1My5jCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LS0yMDExIE5va2lhIENvcnBvcmF0aW9uCisgKgorICogQ29udGFjdDogU2FrYXJpIEFpbHVzIDxzYWthcmkuYWlsdXNAbWF4d2VsbC5yZXNlYXJjaC5ub2tpYS5jb20+CisgKgorICogQ29udHJpYnV0b3JzOgorICoJU2FrYXJpIEFpbHVzIDxzYWthcmkuYWlsdXNAbWF4d2VsbC5yZXNlYXJjaC5ub2tpYS5jb20+CisgKglUdXVra2EgVG9pdm9uZW4gPHR1dWtrYXQ3NkBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICoKKyAqIFRPRE86CisgKiAtIGZhdWx0IGludGVycnVwdCBoYW5kbGluZworICogLSBoYXJkd2FyZSBzdHJvYmUKKyAqIC0gcG93ZXIgZG9lc24ndCBuZWVkIHRvIGJlIE9OIGlmIGFsbCBsaWdodHMgYXJlIG9mZgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPG1lZGlhL2FkcDE2NTMuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgorCisjZGVmaW5lIFRJTUVPVVRfTUFYCQk4MjAwMDAKKyNkZWZpbmUgVElNRU9VVF9TVEVQCQk1NDYwMAorI2RlZmluZSBUSU1FT1VUX01JTgkJKFRJTUVPVVRfTUFYIC0gQURQMTY1M19SRUdfQ09ORklHX1RNUl9TRVRfTUFYIFwKKwkJCQkgKiBUSU1FT1VUX1NURVApCisjZGVmaW5lIFRJTUVPVVRfVVNfVE9fQ09ERSh0KQkoKFRJTUVPVVRfTUFYICsgKFRJTUVPVVRfU1RFUCAvIDIpIC0gKHQpKSBcCisJCQkJIC8gVElNRU9VVF9TVEVQKQorI2RlZmluZSBUSU1FT1VUX0NPREVfVE9fVVMoYykJKFRJTUVPVVRfTUFYIC0gKGMpICogVElNRU9VVF9TVEVQKQorCisvKiBXcml0ZSB2YWx1ZXMgaW50byBBRFAxNjUzIHJlZ2lzdGVycy4gKi8KK3N0YXRpYyBpbnQgYWRwMTY1M191cGRhdGVfaHcoc3RydWN0IGFkcDE2NTNfZmxhc2ggKmZsYXNoKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZmbGFzaC0+c3ViZGV2KTsKKwl1OCBvdXRfc2VsOworCXU4IGNvbmZpZyA9IDA7CisJaW50IHJ2YWw7CisKKwlvdXRfc2VsID0gQURQMTY1M19JTkRJQ0FUT1JfSU5URU5TSVRZX3VBX1RPX1JFRygKKwkJZmxhc2gtPmluZGljYXRvcl9pbnRlbnNpdHktPnZhbCkKKwkJPDwgQURQMTY1M19SRUdfT1VUX1NFTF9JTEVEX1NISUZUOworCisJc3dpdGNoIChmbGFzaC0+bGVkX21vZGUtPnZhbCkgeworCWNhc2UgVjRMMl9GTEFTSF9MRURfTU9ERV9OT05FOgorCQlicmVhazsKKwljYXNlIFY0TDJfRkxBU0hfTEVEX01PREVfRkxBU0g6CisJCS8qIEZsYXNoIG1vZGUsIGxpZ2h0IG9uIHdpdGggc3Ryb2JlLCBkdXJhdGlvbiBmcm9tIHRpbWVyICovCisJCWNvbmZpZyA9IEFEUDE2NTNfUkVHX0NPTkZJR19UTVJfQ0ZHOworCQljb25maWcgfD0gVElNRU9VVF9VU19UT19DT0RFKGZsYXNoLT5mbGFzaF90aW1lb3V0LT52YWwpCisJCQkgIDw8IEFEUDE2NTNfUkVHX0NPTkZJR19UTVJfU0VUX1NISUZUOworCQlicmVhazsKKwljYXNlIFY0TDJfRkxBU0hfTEVEX01PREVfVE9SQ0g6CisJCS8qIFRvcmNoIG1vZGUsIGxpZ2h0IGltbWVkaWF0ZWx5IG9uLCBkdXJhdGlvbiBpbmRlZmluaXRlICovCisJCW91dF9zZWwgfD0gQURQMTY1M19GTEFTSF9JTlRFTlNJVFlfbUFfVE9fUkVHKAorCQkJZmxhc2gtPnRvcmNoX2ludGVuc2l0eS0+dmFsKQorCQkJPDwgQURQMTY1M19SRUdfT1VUX1NFTF9IUExFRF9TSElGVDsKKwkJYnJlYWs7CisJfQorCisJcnZhbCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRFAxNjUzX1JFR19PVVRfU0VMLCBvdXRfc2VsKTsKKwlpZiAocnZhbCA8IDApCisJCXJldHVybiBydmFsOworCisJcnZhbCA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRFAxNjUzX1JFR19DT05GSUcsIGNvbmZpZyk7CisJaWYgKHJ2YWwgPCAwKQorCQlyZXR1cm4gcnZhbDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkcDE2NTNfZ2V0X2ZhdWx0KHN0cnVjdCBhZHAxNjUzX2ZsYXNoICpmbGFzaCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmZmxhc2gtPnN1YmRldik7CisJaW50IGZhdWx0OworCWludCBydmFsOworCisJZmF1bHQgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoY2xpZW50LCBBRFAxNjUzX1JFR19GQVVMVCk7CisJaWYgKElTX0VSUl9WQUxVRShmYXVsdCkpCisJCXJldHVybiBmYXVsdDsKKworCWZsYXNoLT5mYXVsdCB8PSBmYXVsdDsKKworCWlmICghZmxhc2gtPmZhdWx0KQorCQlyZXR1cm4gMDsKKworCS8qIENsZWFyIGZhdWx0cy4gKi8KKwlydmFsID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFEUDE2NTNfUkVHX09VVF9TRUwsIDApOworCWlmIChJU19FUlJfVkFMVUUocnZhbCkpCisJCXJldHVybiBydmFsOworCisJZmxhc2gtPmxlZF9tb2RlLT52YWwgPSBWNEwyX0ZMQVNIX0xFRF9NT0RFX05PTkU7CisKKwlydmFsID0gYWRwMTY1M191cGRhdGVfaHcoZmxhc2gpOworCWlmIChJU19FUlJfVkFMVUUocnZhbCkpCisJCXJldHVybiBydmFsOworCisJcmV0dXJuIGZsYXNoLT5mYXVsdDsKK30KKworc3RhdGljIGludCBhZHAxNjUzX3N0cm9iZShzdHJ1Y3QgYWRwMTY1M19mbGFzaCAqZmxhc2gsIGludCBlbmFibGUpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJmZsYXNoLT5zdWJkZXYpOworCXU4IG91dF9zZWwgPSBBRFAxNjUzX0lORElDQVRPUl9JTlRFTlNJVFlfdUFfVE9fUkVHKAorCQlmbGFzaC0+aW5kaWNhdG9yX2ludGVuc2l0eS0+dmFsKQorCQk8PCBBRFAxNjUzX1JFR19PVVRfU0VMX0lMRURfU0hJRlQ7CisJaW50IHJ2YWw7CisKKwlpZiAoZmxhc2gtPmxlZF9tb2RlLT52YWwgIT0gVjRMMl9GTEFTSF9MRURfTU9ERV9GTEFTSCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmICghZW5hYmxlKQorCQlyZXR1cm4gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFEUDE2NTNfUkVHX09VVF9TRUwsCisJCQkJCQkgb3V0X3NlbCk7CisKKwlvdXRfc2VsIHw9IEFEUDE2NTNfRkxBU0hfSU5URU5TSVRZX21BX1RPX1JFRygKKwkJZmxhc2gtPmZsYXNoX2ludGVuc2l0eS0+dmFsKQorCQk8PCBBRFAxNjUzX1JFR19PVVRfU0VMX0hQTEVEX1NISUZUOworCXJ2YWwgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURQMTY1M19SRUdfT1VUX1NFTCwgb3V0X3NlbCk7CisJaWYgKHJ2YWwpCisJCXJldHVybiBydmFsOworCisJLyogU29mdHdhcmUgc3Ryb2JlIHVzaW5nIGkyYyAqLworCXJ2YWwgPSBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGNsaWVudCwgQURQMTY1M19SRUdfU1dfU1RST0JFLAorCQlBRFAxNjUzX1JFR19TV19TVFJPQkVfU1dfU1RST0JFKTsKKwlpZiAocnZhbCkKKwkJcmV0dXJuIHJ2YWw7CisJcmV0dXJuIGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoY2xpZW50LCBBRFAxNjUzX1JFR19TV19TVFJPQkUsIDApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogVjRMMiBjb250cm9scworICovCisKK3N0YXRpYyBpbnQgYWRwMTY1M19nZXRfY3RybChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKQoreworCXN0cnVjdCBhZHAxNjUzX2ZsYXNoICpmbGFzaCA9CisJCWNvbnRhaW5lcl9vZihjdHJsLT5oYW5kbGVyLCBzdHJ1Y3QgYWRwMTY1M19mbGFzaCwgY3RybHMpOworCWludCBydmFsOworCisJcnZhbCA9IGFkcDE2NTNfZ2V0X2ZhdWx0KGZsYXNoKTsKKwlpZiAoSVNfRVJSX1ZBTFVFKHJ2YWwpKQorCQlyZXR1cm4gcnZhbDsKKworCWN0cmwtPmN1ci52YWwgPSAwOworCisJaWYgKGZsYXNoLT5mYXVsdCAmIEFEUDE2NTNfUkVHX0ZBVUxUX0ZMVF9TQ1ApCisJCWN0cmwtPmN1ci52YWwgfD0gVjRMMl9GTEFTSF9GQVVMVF9TSE9SVF9DSVJDVUlUOworCWlmIChmbGFzaC0+ZmF1bHQgJiBBRFAxNjUzX1JFR19GQVVMVF9GTFRfT1QpCisJCWN0cmwtPmN1ci52YWwgfD0gVjRMMl9GTEFTSF9GQVVMVF9PVkVSX1RFTVBFUkFUVVJFOworCWlmIChmbGFzaC0+ZmF1bHQgJiBBRFAxNjUzX1JFR19GQVVMVF9GTFRfVE1SKQorCQljdHJsLT5jdXIudmFsIHw9IFY0TDJfRkxBU0hfRkFVTFRfVElNRU9VVDsKKwlpZiAoZmxhc2gtPmZhdWx0ICYgQURQMTY1M19SRUdfRkFVTFRfRkxUX09WKQorCQljdHJsLT5jdXIudmFsIHw9IFY0TDJfRkxBU0hfRkFVTFRfT1ZFUl9WT0xUQUdFOworCisJZmxhc2gtPmZhdWx0ID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkcDE2NTNfc2V0X2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKK3sKKwlzdHJ1Y3QgYWRwMTY1M19mbGFzaCAqZmxhc2ggPQorCQljb250YWluZXJfb2YoY3RybC0+aGFuZGxlciwgc3RydWN0IGFkcDE2NTNfZmxhc2gsIGN0cmxzKTsKKwlpbnQgcnZhbDsKKworCXJ2YWwgPSBhZHAxNjUzX2dldF9mYXVsdChmbGFzaCk7CisJaWYgKElTX0VSUl9WQUxVRShydmFsKSkKKwkJcmV0dXJuIHJ2YWw7CisJaWYgKChydmFsICYgKEFEUDE2NTNfUkVHX0ZBVUxUX0ZMVF9TQ1AgfAorCQkgICAgIEFEUDE2NTNfUkVHX0ZBVUxUX0ZMVF9PVCB8CisJCSAgICAgQURQMTY1M19SRUdfRkFVTFRfRkxUX09WKSkgJiYKKwkgICAgKGN0cmwtPmlkID09IFY0TDJfQ0lEX0ZMQVNIX1NUUk9CRSB8fAorCSAgICAgY3RybC0+aWQgPT0gVjRMMl9DSURfRkxBU0hfVE9SQ0hfSU5URU5TSVRZIHx8CisJICAgICBjdHJsLT5pZCA9PSBWNEwyX0NJRF9GTEFTSF9MRURfTU9ERSkpCisJCXJldHVybiAtRUJVU1k7CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9GTEFTSF9TVFJPQkU6CisJCXJldHVybiBhZHAxNjUzX3N0cm9iZShmbGFzaCwgMSk7CisJY2FzZSBWNEwyX0NJRF9GTEFTSF9TVFJPQkVfU1RPUDoKKwkJcmV0dXJuIGFkcDE2NTNfc3Ryb2JlKGZsYXNoLCAwKTsKKwl9CisKKwlyZXR1cm4gYWRwMTY1M191cGRhdGVfaHcoZmxhc2gpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9vcHMgYWRwMTY1M19jdHJsX29wcyA9IHsKKwkuZ192b2xhdGlsZV9jdHJsID0gYWRwMTY1M19nZXRfY3RybCwKKwkuc19jdHJsID0gYWRwMTY1M19zZXRfY3RybCwKK307CisKK3N0YXRpYyBpbnQgYWRwMTY1M19pbml0X2NvbnRyb2xzKHN0cnVjdCBhZHAxNjUzX2ZsYXNoICpmbGFzaCkKK3sKKwlzdHJ1Y3QgdjRsMl9jdHJsICpmYXVsdDsKKworCXY0bDJfY3RybF9oYW5kbGVyX2luaXQoJmZsYXNoLT5jdHJscywgOSk7CisKKwlmbGFzaC0+bGVkX21vZGUgPQorCQl2NGwyX2N0cmxfbmV3X3N0ZF9tZW51KCZmbGFzaC0+Y3RybHMsICZhZHAxNjUzX2N0cmxfb3BzLAorCQkJCSAgICAgICBWNEwyX0NJRF9GTEFTSF9MRURfTU9ERSwKKwkJCQkgICAgICAgVjRMMl9GTEFTSF9MRURfTU9ERV9UT1JDSCwgfjB4NywgMCk7CisJdjRsMl9jdHJsX25ld19zdGRfbWVudSgmZmxhc2gtPmN0cmxzLCAmYWRwMTY1M19jdHJsX29wcywKKwkJCSAgICAgICBWNEwyX0NJRF9GTEFTSF9TVFJPQkVfU09VUkNFLAorCQkJICAgICAgIFY0TDJfRkxBU0hfU1RST0JFX1NPVVJDRV9TT0ZUV0FSRSwgfjB4MSwgMCk7CisJdjRsMl9jdHJsX25ld19zdGQoJmZsYXNoLT5jdHJscywgJmFkcDE2NTNfY3RybF9vcHMsCisJCQkgIFY0TDJfQ0lEX0ZMQVNIX1NUUk9CRSwgMCwgMCwgMCwgMCk7CisJdjRsMl9jdHJsX25ld19zdGQoJmZsYXNoLT5jdHJscywgJmFkcDE2NTNfY3RybF9vcHMsCisJCQkgIFY0TDJfQ0lEX0ZMQVNIX1NUUk9CRV9TVE9QLCAwLCAwLCAwLCAwKTsKKwlmbGFzaC0+Zmxhc2hfdGltZW91dCA9CisJCXY0bDJfY3RybF9uZXdfc3RkKCZmbGFzaC0+Y3RybHMsICZhZHAxNjUzX2N0cmxfb3BzLAorCQkJCSAgVjRMMl9DSURfRkxBU0hfVElNRU9VVCwgVElNRU9VVF9NSU4sCisJCQkJICBmbGFzaC0+cGxhdGZvcm1fZGF0YS0+bWF4X2ZsYXNoX3RpbWVvdXQsCisJCQkJICBUSU1FT1VUX1NURVAsCisJCQkJICBmbGFzaC0+cGxhdGZvcm1fZGF0YS0+bWF4X2ZsYXNoX3RpbWVvdXQpOworCWZsYXNoLT5mbGFzaF9pbnRlbnNpdHkgPQorCQl2NGwyX2N0cmxfbmV3X3N0ZCgmZmxhc2gtPmN0cmxzLCAmYWRwMTY1M19jdHJsX29wcywKKwkJCQkgIFY0TDJfQ0lEX0ZMQVNIX0lOVEVOU0lUWSwKKwkJCQkgIEFEUDE2NTNfRkxBU0hfSU5URU5TSVRZX01JTiwKKwkJCQkgIGZsYXNoLT5wbGF0Zm9ybV9kYXRhLT5tYXhfZmxhc2hfaW50ZW5zaXR5LAorCQkJCSAgMSwgZmxhc2gtPnBsYXRmb3JtX2RhdGEtPm1heF9mbGFzaF9pbnRlbnNpdHkpOworCWZsYXNoLT50b3JjaF9pbnRlbnNpdHkgPQorCQl2NGwyX2N0cmxfbmV3X3N0ZCgmZmxhc2gtPmN0cmxzLCAmYWRwMTY1M19jdHJsX29wcywKKwkJCQkgIFY0TDJfQ0lEX0ZMQVNIX1RPUkNIX0lOVEVOU0lUWSwKKwkJCQkgIEFEUDE2NTNfVE9SQ0hfSU5URU5TSVRZX01JTiwKKwkJCQkgIGZsYXNoLT5wbGF0Zm9ybV9kYXRhLT5tYXhfdG9yY2hfaW50ZW5zaXR5LAorCQkJCSAgQURQMTY1M19GTEFTSF9JTlRFTlNJVFlfU1RFUCwKKwkJCQkgIGZsYXNoLT5wbGF0Zm9ybV9kYXRhLT5tYXhfdG9yY2hfaW50ZW5zaXR5KTsKKwlmbGFzaC0+aW5kaWNhdG9yX2ludGVuc2l0eSA9CisJCXY0bDJfY3RybF9uZXdfc3RkKCZmbGFzaC0+Y3RybHMsICZhZHAxNjUzX2N0cmxfb3BzLAorCQkJCSAgVjRMMl9DSURfRkxBU0hfSU5ESUNBVE9SX0lOVEVOU0lUWSwKKwkJCQkgIEFEUDE2NTNfSU5ESUNBVE9SX0lOVEVOU0lUWV9NSU4sCisJCQkJICBmbGFzaC0+cGxhdGZvcm1fZGF0YS0+bWF4X2luZGljYXRvcl9pbnRlbnNpdHksCisJCQkJICBBRFAxNjUzX0lORElDQVRPUl9JTlRFTlNJVFlfU1RFUCwKKwkJCQkgIEFEUDE2NTNfSU5ESUNBVE9SX0lOVEVOU0lUWV9NSU4pOworCWZhdWx0ID0gdjRsMl9jdHJsX25ld19zdGQoJmZsYXNoLT5jdHJscywgJmFkcDE2NTNfY3RybF9vcHMsCisJCQkJICBWNEwyX0NJRF9GTEFTSF9GQVVMVCwgMCwKKwkJCQkgIFY0TDJfRkxBU0hfRkFVTFRfT1ZFUl9WT0xUQUdFCisJCQkJICB8IFY0TDJfRkxBU0hfRkFVTFRfT1ZFUl9URU1QRVJBVFVSRQorCQkJCSAgfCBWNEwyX0ZMQVNIX0ZBVUxUX1NIT1JUX0NJUkNVSVQsIDAsIDApOworCisJaWYgKGZsYXNoLT5jdHJscy5lcnJvcikKKwkJcmV0dXJuIGZsYXNoLT5jdHJscy5lcnJvcjsKKworCWZhdWx0LT5pc192b2xhdGlsZSA9IDE7CisKKwlmbGFzaC0+c3ViZGV2LmN0cmxfaGFuZGxlciA9ICZmbGFzaC0+Y3RybHM7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBWNEwyIHN1YmRldiBvcGVyYXRpb25zCisgKi8KKworc3RhdGljIGludAorYWRwMTY1M19pbml0X2RldmljZShzdHJ1Y3QgYWRwMTY1M19mbGFzaCAqZmxhc2gpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJmZsYXNoLT5zdWJkZXYpOworCWludCBydmFsOworCisJLyogQ2xlYXIgRkFVTFQgcmVnaXN0ZXIgYnkgd3JpdGluZyB6ZXJvIHRvIE9VVF9TRUwgKi8KKwlydmFsID0gaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShjbGllbnQsIEFEUDE2NTNfUkVHX09VVF9TRUwsIDApOworCWlmIChydmFsIDwgMCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxlZCB3cml0aW5nIGZhdWx0IHJlZ2lzdGVyXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJbXV0ZXhfbG9jaygmZmxhc2gtPmN0cmxzLmxvY2spOworCS8qIFJlc2V0IGZhdWx0cyBiZWZvcmUgcmVhZGluZyBuZXcgb25lcy4gKi8KKwlmbGFzaC0+ZmF1bHQgPSAwOworCXJ2YWwgPSBhZHAxNjUzX2dldF9mYXVsdChmbGFzaCk7CisJbXV0ZXhfdW5sb2NrKCZmbGFzaC0+Y3RybHMubG9jayk7CisJaWYgKHJ2YWwgPiAwKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiZmF1bHRzIGRldGVjdGVkOiAweCUxLjF4XG4iLCBydmFsKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJbXV0ZXhfbG9jaygmZmxhc2gtPmN0cmxzLmxvY2spOworCXJ2YWwgPSBhZHAxNjUzX3VwZGF0ZV9odyhmbGFzaCk7CisJbXV0ZXhfdW5sb2NrKCZmbGFzaC0+Y3RybHMubG9jayk7CisJaWYgKHJ2YWwpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkiYWRwMTY1M191cGRhdGVfaHcgZmFpbGVkIGF0ICVzXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitfX2FkcDE2NTNfc2V0X3Bvd2VyKHN0cnVjdCBhZHAxNjUzX2ZsYXNoICpmbGFzaCwgaW50IG9uKQoreworCWludCByZXQ7CisKKwlyZXQgPSBmbGFzaC0+cGxhdGZvcm1fZGF0YS0+cG93ZXIoJmZsYXNoLT5zdWJkZXYsIG9uKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmICghb24pCisJCXJldHVybiAwOworCisJcmV0ID0gYWRwMTY1M19pbml0X2RldmljZShmbGFzaCk7CisJaWYgKHJldCA8IDApCisJCWZsYXNoLT5wbGF0Zm9ybV9kYXRhLT5wb3dlcigmZmxhc2gtPnN1YmRldiwgMCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CithZHAxNjUzX3NldF9wb3dlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnN1YmRldiwgaW50IG9uKQoreworCXN0cnVjdCBhZHAxNjUzX2ZsYXNoICpmbGFzaCA9IHRvX2FkcDE2NTNfZmxhc2goc3ViZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJmZsYXNoLT5wb3dlcl9sb2NrKTsKKworCS8qIElmIHRoZSBwb3dlciBjb3VudCBpcyBtb2RpZmllZCBmcm9tIDAgdG8gIT0gMCBvciBmcm9tICE9IDAgdG8gMCwKKwkgKiB1cGRhdGUgdGhlIHBvd2VyIHN0YXRlLgorCSAqLworCWlmIChmbGFzaC0+cG93ZXJfY291bnQgPT0gIW9uKSB7CisJCXJldCA9IF9fYWRwMTY1M19zZXRfcG93ZXIoZmxhc2gsICEhb24pOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZG9uZTsKKwl9CisKKwkvKiBVcGRhdGUgdGhlIHBvd2VyIGNvdW50LiAqLworCWZsYXNoLT5wb3dlcl9jb3VudCArPSBvbiA/IDEgOiAtMTsKKwlXQVJOX09OKGZsYXNoLT5wb3dlcl9jb3VudCA8IDApOworCitkb25lOgorCW11dGV4X3VubG9jaygmZmxhc2gtPnBvd2VyX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRwMTY1M19vcGVuKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgpCit7CisJcmV0dXJuIGFkcDE2NTNfc2V0X3Bvd2VyKHNkLCAxKTsKK30KKworc3RhdGljIGludCBhZHAxNjUzX2Nsb3NlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX3N1YmRldl9maCAqZmgpCit7CisJcmV0dXJuIGFkcDE2NTNfc2V0X3Bvd2VyKHNkLCAwKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9jb3JlX29wcyBhZHAxNjUzX2NvcmVfb3BzID0geworCS5zX3Bvd2VyID0gYWRwMTY1M19zZXRfcG93ZXIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBhZHAxNjUzX29wcyA9IHsKKwkuY29yZSA9ICZhZHAxNjUzX2NvcmVfb3BzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9pbnRlcm5hbF9vcHMgYWRwMTY1M19pbnRlcm5hbF9vcHMgPSB7CisJLm9wZW4gPSBhZHAxNjUzX29wZW4sCisJLmNsb3NlID0gYWRwMTY1M19jbG9zZSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBJMkMgZHJpdmVyCisgKi8KKyNpZmRlZiBDT05GSUdfUE0KKworc3RhdGljIGludCBhZHAxNjUzX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgYWRwMTY1M19mbGFzaCAqZmxhc2ggPSB0b19hZHAxNjUzX2ZsYXNoKHN1YmRldik7CisKKwlpZiAoIWZsYXNoLT5wb3dlcl9jb3VudCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gX19hZHAxNjUzX3NldF9wb3dlcihmbGFzaCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgYWRwMTY1M19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB0b19pMmNfY2xpZW50KGRldik7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgYWRwMTY1M19mbGFzaCAqZmxhc2ggPSB0b19hZHAxNjUzX2ZsYXNoKHN1YmRldik7CisKKwlpZiAoIWZsYXNoLT5wb3dlcl9jb3VudCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gX19hZHAxNjUzX3NldF9wb3dlcihmbGFzaCwgMSk7Cit9CisKKyNlbHNlCisKKyNkZWZpbmUgYWRwMTY1M19zdXNwZW5kCU5VTEwKKyNkZWZpbmUgYWRwMTY1M19yZXN1bWUJTlVMTAorCisjZW5kaWYgLyogQ09ORklHX1BNICovCisKK3N0YXRpYyBpbnQgYWRwMTY1M19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICpkZXZpZCkKK3sKKwlzdHJ1Y3QgYWRwMTY1M19mbGFzaCAqZmxhc2g7CisJaW50IHJldDsKKworCWZsYXNoID0ga3phbGxvYyhzaXplb2YoKmZsYXNoKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGZsYXNoID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJZmxhc2gtPnBsYXRmb3JtX2RhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJbXV0ZXhfaW5pdCgmZmxhc2gtPnBvd2VyX2xvY2spOworCisJdjRsMl9pMmNfc3ViZGV2X2luaXQoJmZsYXNoLT5zdWJkZXYsIGNsaWVudCwgJmFkcDE2NTNfb3BzKTsKKwlmbGFzaC0+c3ViZGV2LmludGVybmFsX29wcyA9ICZhZHAxNjUzX2ludGVybmFsX29wczsKKwlmbGFzaC0+c3ViZGV2LmZsYWdzIHw9IFY0TDJfU1VCREVWX0ZMX0hBU19ERVZOT0RFOworCisJYWRwMTY1M19pbml0X2NvbnRyb2xzKGZsYXNoKTsKKworCXJldCA9IG1lZGlhX2VudGl0eV9pbml0KCZmbGFzaC0+c3ViZGV2LmVudGl0eSwgMCwgTlVMTCwgMCk7CisJaWYgKHJldCA8IDApCisJCWtmcmVlKGZsYXNoKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IGFkcDE2NTNfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKKwlzdHJ1Y3QgYWRwMTY1M19mbGFzaCAqZmxhc2ggPSB0b19hZHAxNjUzX2ZsYXNoKHN1YmRldik7CisKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldigmZmxhc2gtPnN1YmRldik7CisJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmZmxhc2gtPmN0cmxzKTsKKwltZWRpYV9lbnRpdHlfY2xlYW51cCgmZmxhc2gtPnN1YmRldi5lbnRpdHkpOworCWtmcmVlKGZsYXNoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkIGFkcDE2NTNfaWRfdGFibGVbXSA9IHsKKwl7IEFEUDE2NTNfTkFNRSwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhZHAxNjUzX2lkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBkZXZfcG1fb3BzIGFkcDE2NTNfcG1fb3BzID0geworCS5zdXNwZW5kCT0gYWRwMTY1M19zdXNwZW5kLAorCS5yZXN1bWUJCT0gYWRwMTY1M19yZXN1bWUsCit9OworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgYWRwMTY1M19pMmNfZHJpdmVyID0geworCS5kcml2ZXIJCT0geworCQkubmFtZQk9IEFEUDE2NTNfTkFNRSwKKwkJLnBtCT0gJmFkcDE2NTNfcG1fb3BzLAorCX0sCisJLnByb2JlCQk9IGFkcDE2NTNfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2V4aXRfcChhZHAxNjUzX3JlbW92ZSksCisJLmlkX3RhYmxlCT0gYWRwMTY1M19pZF90YWJsZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFkcDE2NTNfaW5pdCh2b2lkKQoreworCWludCBydmFsOworCisJcnZhbCA9IGkyY19hZGRfZHJpdmVyKCZhZHAxNjUzX2kyY19kcml2ZXIpOworCWlmIChydmFsKQorCQlwcmludGsoS0VSTl9BTEVSVCAiJXM6IGZhaWxlZCBhdCBpMmNfYWRkX2RyaXZlclxuIiwgX19mdW5jX18pOworCisJcmV0dXJuIHJ2YWw7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhZHAxNjUzX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmYWRwMTY1M19pMmNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoYWRwMTY1M19pbml0KTsKK21vZHVsZV9leGl0KGFkcDE2NTNfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlNha2FyaSBBaWx1cyA8c2FrYXJpLmFpbHVzQG5va2lhLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQW5hbG9nIERldmljZXMgQURQMTY1MyBMRUQgZmxhc2ggZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2Fydi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9hcnYuYwppbmRleCBmOTg5ZjI4Li5iNmVkNDRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2Fydi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXJ2LmMKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CkBAIC01NCw3ICs1Myw3IEBACiAgKi8KICNkZWZpbmUgVVNFX0lOVAkJMAkvKiBEb24ndCBtb2RpZnkgKi8KIAotI2RlZmluZSBWRVJTSU9OCSIwLjA0IgorI2RlZmluZSBWRVJTSU9OCSIwLjAuNSIKIAogI2RlZmluZSBhcl9pbmwoYWRkcikgCQlpbmwoKHVuc2lnbmVkIGxvbmcpKGFkZHIpKQogI2RlZmluZSBhcl9vdXRsKHZhbCwgYWRkcikJb3V0bCgodW5zaWduZWQgbG9uZykodmFsKSwgKHVuc2lnbmVkIGxvbmcpKGFkZHIpKQpAQCAtNDA0LDcgKzQwMyw2IEBACiAJc3RybGNweSh2Y2FwLT5kcml2ZXIsIGFyLT52ZGV2Lm5hbWUsIHNpemVvZih2Y2FwLT5kcml2ZXIpKTsKIAlzdHJsY3B5KHZjYXAtPmNhcmQsICJDb2xvdXIgQVIgVkdBIiwgc2l6ZW9mKHZjYXAtPmNhcmQpKTsKIAlzdHJsY3B5KHZjYXAtPmJ1c19pbmZvLCAiUGxhdGZvcm0iLCBzaXplb2YodmNhcC0+YnVzX2luZm8pKTsKLQl2Y2FwLT52ZXJzaW9uID0gS0VSTkVMX1ZFUlNJT04oMCwgMCwgNCk7CiAJdmNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1JFQURXUklURTsKIAlyZXR1cm4gMDsKIH0KQEAgLTg3OSwzICs4NzcsNCBAQAogTU9EVUxFX0FVVEhPUigiVGFrZW8gVGFrYWhhc2hpIDx0YWthaGFzaGkudGFrZW9AcmVuZXNhcy5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkNvbG91ciBBUiBNNjQyNzgoVkdBKSBmb3IgVmlkZW80TGludXgiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKFZFUlNJT04pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9hdG1lbC1pc2kuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXRtZWwtaXNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I4OWYwMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXRtZWwtaXNpLmMKQEAgLTAsMCArMSwxMDQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIEF0bWVsIENvcnBvcmF0aW9uCisgKiBKb3NoIFd1LCA8am9zaC53dUBhdG1lbC5jb20+CisgKgorICogQmFzZWQgb24gcHJldmlvdXMgd29yayBieSBMYXJzIEhhcmluZywgPGxhcnMuaGFyaW5nQGF0bWVsLmNvbT4KKyAqIGFuZCBTZWRqaSBHYW91YW91CisgKiBCYXNlZCBvbiB0aGUgYnR0diBkcml2ZXIgZm9yIEJ0ODQ4IHdpdGggcmVzcGVjdGl2ZSBjb3B5cmlnaHQgaG9sZGVycworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgPG1lZGlhL2F0bWVsLWlzaS5oPgorI2luY2x1ZGUgPG1lZGlhL3NvY19jYW1lcmEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zb2NfbWVkaWFidXMuaD4KKyNpbmNsdWRlIDxtZWRpYS92aWRlb2J1ZjItZG1hLWNvbnRpZy5oPgorCisjZGVmaW5lIE1BWF9CVUZGRVJfTlVNCQkJMzIKKyNkZWZpbmUgTUFYX1NVUFBPUlRfV0lEVEgJCTIwNDgKKyNkZWZpbmUgTUFYX1NVUFBPUlRfSEVJR0hUCQkyMDQ4CisjZGVmaW5lIFZJRF9MSU1JVF9CWVRFUwkJCSgxNiAqIDEwMjQgKiAxMDI0KQorI2RlZmluZSBNSU5fRlJBTUVfUkFURQkJCTE1CisjZGVmaW5lIEZSQU1FX0lOVEVSVkFMX01JTExJX1NFQwkoMTAwMCAvIE1JTl9GUkFNRV9SQVRFKQorCisvKiBJU0kgc3RhdGVzICovCitlbnVtIHsKKwlJU0lfU1RBVEVfSURMRSA9IDAsCisJSVNJX1NUQVRFX1JFQURZLAorCUlTSV9TVEFURV9XQUlUX1NPRiwKK307CisKKy8qIEZyYW1lIGJ1ZmZlciBkZXNjcmlwdG9yICovCitzdHJ1Y3QgZmJkIHsKKwkvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBmcmFtZSBidWZmZXIgKi8KKwl1MzIgZmJfYWRkcmVzczsKKwkvKiBETUEgQ29udHJvbCBSZWdpc3Rlcihvbmx5IGluIEhJU0kyKSAqLworCXUzMiBkbWFfY3RybDsKKwkvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBuZXh0IGZiZCAqLworCXUzMiBuZXh0X2ZiZF9hZGRyZXNzOworfTsKKworc3RhdGljIHZvaWQgc2V0X2RtYV9jdHJsKHN0cnVjdCBmYmQgKmZiX2Rlc2MsIHUzMiBjdHJsKQoreworCWZiX2Rlc2MtPmRtYV9jdHJsID0gY3RybDsKK30KKworc3RydWN0IGlzaV9kbWFfZGVzYyB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBmYmQgKnBfZmJkOworCXUzMiBmYmRfcGh5czsKK307CisKKy8qIEZyYW1lIGJ1ZmZlciBkYXRhICovCitzdHJ1Y3QgZnJhbWVfYnVmZmVyIHsKKwlzdHJ1Y3QgdmIyX2J1ZmZlciB2YjsKKwlzdHJ1Y3QgaXNpX2RtYV9kZXNjICpwX2RtYV9kZXNjOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKK3N0cnVjdCBhdG1lbF9pc2kgeworCS8qIFByb3RlY3RzIHRoZSBhY2Nlc3Mgb2YgdmFyaWFibGVzIHNoYXJlZCB3aXRoIHRoZSBJU1IgKi8KKwlzcGlubG9ja190CQkJbG9jazsKKwl2b2lkIF9faW9tZW0JCQkqcmVnczsKKworCWludAkJCQlzZXF1ZW5jZTsKKwkvKiBTdGF0ZSBvZiB0aGUgSVNJIG1vZHVsZSBpbiBjYXB0dXJpbmcgbW9kZSAqLworCWludAkJCQlzdGF0ZTsKKworCS8qIFdhaXQgcXVldWUgZm9yIHdhaXRpbmcgZm9yIFNPRiAqLworCXdhaXRfcXVldWVfaGVhZF90CQl2c3luY193cTsKKworCXN0cnVjdCB2YjJfYWxsb2NfY3R4CQkqYWxsb2NfY3R4OworCisJLyogQWxsb2NhdGUgZGVzY3JpcHRvcnMgZm9yIGRtYSBidWZmZXIgdXNlICovCisJc3RydWN0IGZiZAkJCSpwX2ZiX2Rlc2NyaXB0b3JzOworCXUzMgkJCQlmYl9kZXNjcmlwdG9yc19waHlzOworCXN0cnVjdAkJCQlsaXN0X2hlYWQgZG1hX2Rlc2NfaGVhZDsKKwlzdHJ1Y3QgaXNpX2RtYV9kZXNjCQlkbWFfZGVzY1tNQVhfQlVGRkVSX05VTV07CisKKwlzdHJ1Y3QgY29tcGxldGlvbgkJY29tcGxldGU7CisJc3RydWN0IGNsawkJCSpwY2xrOworCXVuc2lnbmVkIGludAkJCWlycTsKKworCXN0cnVjdCBpc2lfcGxhdGZvcm1fZGF0YQkqcGRhdGE7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkCQl2aWRlb19idWZmZXJfbGlzdDsKKwlzdHJ1Y3QgZnJhbWVfYnVmZmVyCQkqYWN0aXZlOworCisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlCSppY2Q7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdAkJc29jX2hvc3Q7Cit9OworCitzdGF0aWMgdm9pZCBpc2lfd3JpdGVsKHN0cnVjdCBhdG1lbF9pc2kgKmlzaSwgdTMyIHJlZywgdTMyIHZhbCkKK3sKKwl3cml0ZWwodmFsLCBpc2ktPnJlZ3MgKyByZWcpOworfQorc3RhdGljIHUzMiBpc2lfcmVhZGwoc3RydWN0IGF0bWVsX2lzaSAqaXNpLCB1MzIgcmVnKQoreworCXJldHVybiByZWFkbChpc2ktPnJlZ3MgKyByZWcpOworfQorCitzdGF0aWMgaW50IGNvbmZpZ3VyZV9nZW9tZXRyeShzdHJ1Y3QgYXRtZWxfaXNpICppc2ksIHUzMiB3aWR0aCwKKwkJCXUzMiBoZWlnaHQsIGVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBjb2RlKQoreworCXUzMiBjZmcyLCBjcjsKKworCXN3aXRjaCAoY29kZSkgeworCS8qIFlVViwgaW5jbHVkaW5nIGdyZXkgKi8KKwljYXNlIFY0TDJfTUJVU19GTVRfWThfMVg4OgorCQljciA9IElTSV9DRkcyX0dSQVlTQ0FMRTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX01CVVNfRk1UX1VZVlk4XzJYODoKKwkJY3IgPSBJU0lfQ0ZHMl9ZQ0NfU1dBUF9NT0RFXzM7CisJCWJyZWFrOworCWNhc2UgVjRMMl9NQlVTX0ZNVF9WWVVZOF8yWDg6CisJCWNyID0gSVNJX0NGRzJfWUNDX1NXQVBfTU9ERV8yOworCQlicmVhazsKKwljYXNlIFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4OgorCQljciA9IElTSV9DRkcyX1lDQ19TV0FQX01PREVfMTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX01CVVNfRk1UX1lWWVU4XzJYODoKKwkJY3IgPSBJU0lfQ0ZHMl9ZQ0NfU1dBUF9ERUZBVUxUOworCQlicmVhazsKKwkvKiBSR0IsIFRPRE8gKi8KKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpc2lfd3JpdGVsKGlzaSwgSVNJX0NUUkwsIElTSV9DVFJMX0RJUyk7CisKKwljZmcyID0gaXNpX3JlYWRsKGlzaSwgSVNJX0NGRzIpOworCWNmZzIgfD0gY3I7CisJLyogU2V0IHdpZHRoICovCisJY2ZnMiAmPSB+KElTSV9DRkcyX0lNX0hTSVpFX01BU0spOworCWNmZzIgfD0gKCh3aWR0aCAtIDEpIDw8IElTSV9DRkcyX0lNX0hTSVpFX09GRlNFVCkgJgorCQkJSVNJX0NGRzJfSU1fSFNJWkVfTUFTSzsKKwkvKiBTZXQgaGVpZ2h0ICovCisJY2ZnMiAmPSB+KElTSV9DRkcyX0lNX1ZTSVpFX01BU0spOworCWNmZzIgfD0gKChoZWlnaHQgLSAxKSA8PCBJU0lfQ0ZHMl9JTV9WU0laRV9PRkZTRVQpCisJCQkmIElTSV9DRkcyX0lNX1ZTSVpFX01BU0s7CisJaXNpX3dyaXRlbChpc2ksIElTSV9DRkcyLCBjZmcyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYXRtZWxfaXNpX2hhbmRsZV9zdHJlYW1pbmcoc3RydWN0IGF0bWVsX2lzaSAqaXNpKQoreworCWlmIChpc2ktPmFjdGl2ZSkgeworCQlzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIgPSAmaXNpLT5hY3RpdmUtPnZiOworCQlzdHJ1Y3QgZnJhbWVfYnVmZmVyICpidWYgPSBpc2ktPmFjdGl2ZTsKKworCQlsaXN0X2RlbF9pbml0KCZidWYtPmxpc3QpOworCQlkb19nZXR0aW1lb2ZkYXkoJnZiLT52NGwyX2J1Zi50aW1lc3RhbXApOworCQl2Yi0+djRsMl9idWYuc2VxdWVuY2UgPSBpc2ktPnNlcXVlbmNlKys7CisJCXZiMl9idWZmZXJfZG9uZSh2YiwgVkIyX0JVRl9TVEFURV9ET05FKTsKKwl9CisKKwlpZiAobGlzdF9lbXB0eSgmaXNpLT52aWRlb19idWZmZXJfbGlzdCkpIHsKKwkJaXNpLT5hY3RpdmUgPSBOVUxMOworCX0gZWxzZSB7CisJCS8qIHN0YXJ0IG5leHQgZG1hIGZyYW1lLiAqLworCQlpc2ktPmFjdGl2ZSA9IGxpc3RfZW50cnkoaXNpLT52aWRlb19idWZmZXJfbGlzdC5uZXh0LAorCQkJCQlzdHJ1Y3QgZnJhbWVfYnVmZmVyLCBsaXN0KTsKKwkJaXNpX3dyaXRlbChpc2ksIElTSV9ETUFfQ19EU0NSLAorCQkJaXNpLT5hY3RpdmUtPnBfZG1hX2Rlc2MtPmZiZF9waHlzKTsKKwkJaXNpX3dyaXRlbChpc2ksIElTSV9ETUFfQ19DVFJMLAorCQkJSVNJX0RNQV9DVFJMX0ZFVENIIHwgSVNJX0RNQV9DVFJMX0RPTkUpOworCQlpc2lfd3JpdGVsKGlzaSwgSVNJX0RNQV9DSEVSLCBJU0lfRE1BX0NIU1JfQ19DSCk7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogSVNJIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmUgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdCBpc2lfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgYXRtZWxfaXNpICppc2kgPSBkZXZfaWQ7CisJdTMyIHN0YXR1cywgbWFzaywgcGVuZGluZzsKKwlpcnFyZXR1cm5fdCByZXQgPSBJUlFfTk9ORTsKKworCXNwaW5fbG9jaygmaXNpLT5sb2NrKTsKKworCXN0YXR1cyA9IGlzaV9yZWFkbChpc2ksIElTSV9TVEFUVVMpOworCW1hc2sgPSBpc2lfcmVhZGwoaXNpLCBJU0lfSU5UTUFTSyk7CisJcGVuZGluZyA9IHN0YXR1cyAmIG1hc2s7CisKKwlpZiAocGVuZGluZyAmIElTSV9DVFJMX1NSU1QpIHsKKwkJY29tcGxldGUoJmlzaS0+Y29tcGxldGUpOworCQlpc2lfd3JpdGVsKGlzaSwgSVNJX0lOVERJUywgSVNJX0NUUkxfU1JTVCk7CisJCXJldCA9IElSUV9IQU5ETEVEOworCX0gZWxzZSBpZiAocGVuZGluZyAmIElTSV9DVFJMX0RJUykgeworCQljb21wbGV0ZSgmaXNpLT5jb21wbGV0ZSk7CisJCWlzaV93cml0ZWwoaXNpLCBJU0lfSU5URElTLCBJU0lfQ1RSTF9ESVMpOworCQlyZXQgPSBJUlFfSEFORExFRDsKKwl9IGVsc2UgeworCQlpZiAoKHBlbmRpbmcgJiBJU0lfU1JfVlNZTkMpICYmCisJCQkJKGlzaS0+c3RhdGUgPT0gSVNJX1NUQVRFX0lETEUpKSB7CisJCQlpc2ktPnN0YXRlID0gSVNJX1NUQVRFX1JFQURZOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZpc2ktPnZzeW5jX3dxKTsKKwkJCXJldCA9IElSUV9IQU5ETEVEOworCQl9CisJCWlmIChsaWtlbHkocGVuZGluZyAmIElTSV9TUl9DWEZSX0RPTkUpKQorCQkJcmV0ID0gYXRtZWxfaXNpX2hhbmRsZV9zdHJlYW1pbmcoaXNpKTsKKwl9CisKKwlzcGluX3VubG9jaygmaXNpLT5sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lCVdBSVRfSVNJX1JFU0VUCQkxCisjZGVmaW5lCVdBSVRfSVNJX0RJU0FCTEUJMAorc3RhdGljIGludCBhdG1lbF9pc2lfd2FpdF9zdGF0dXMoc3RydWN0IGF0bWVsX2lzaSAqaXNpLCBpbnQgd2FpdF9yZXNldCkKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJLyoKKwkgKiBUaGUgcmVzZXQgb3IgZGlzYWJsZSB3aWxsIG9ubHkgc3VjY2VlZCBpZiB3ZSBoYXZlIGEKKwkgKiBwaXhlbCBjbG9jayBmcm9tIHRoZSBjYW1lcmEuCisJICovCisJaW5pdF9jb21wbGV0aW9uKCZpc2ktPmNvbXBsZXRlKTsKKworCWlmICh3YWl0X3Jlc2V0KSB7CisJCWlzaV93cml0ZWwoaXNpLCBJU0lfSU5URU4sIElTSV9DVFJMX1NSU1QpOworCQlpc2lfd3JpdGVsKGlzaSwgSVNJX0NUUkwsIElTSV9DVFJMX1NSU1QpOworCX0gZWxzZSB7CisJCWlzaV93cml0ZWwoaXNpLCBJU0lfSU5URU4sIElTSV9DVFJMX0RJUyk7CisJCWlzaV93cml0ZWwoaXNpLCBJU0lfQ1RSTCwgSVNJX0NUUkxfRElTKTsKKwl9CisKKwl0aW1lb3V0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZpc2ktPmNvbXBsZXRlLAorCQkJbXNlY3NfdG9famlmZmllcygxMDApKTsKKwlpZiAodGltZW91dCA9PSAwKQorCQlyZXR1cm4gLUVUSU1FRE9VVDsKKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlWaWRlb2J1ZiBvcGVyYXRpb25zCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBxdWV1ZV9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICp2cSwgdW5zaWduZWQgaW50ICpuYnVmZmVycywKKwkJCQl1bnNpZ25lZCBpbnQgKm5wbGFuZXMsIHVuc2lnbmVkIGxvbmcgc2l6ZXNbXSwKKwkJCQl2b2lkICphbGxvY19jdHhzW10pCit7CisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBzb2NfY2FtZXJhX2Zyb21fdmIycSh2cSk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKKwlzdHJ1Y3QgYXRtZWxfaXNpICppc2kgPSBpY2ktPnByaXY7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWludCByZXQsIGJ5dGVzX3Blcl9saW5lOworCisJLyogUmVzZXQgSVNJICovCisJcmV0ID0gYXRtZWxfaXNpX3dhaXRfc3RhdHVzKGlzaSwgV0FJVF9JU0lfUkVTRVQpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIoaWNkLT5wYXJlbnQsICJSZXNldCBJU0kgdGltZWQgb3V0XG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCWlzaV93cml0ZWwoaXNpLCBJU0lfSU5URElTLCB+MFVMKTsKKworCWJ5dGVzX3Blcl9saW5lID0gc29jX21idXNfYnl0ZXNfcGVyX2xpbmUoaWNkLT51c2VyX3dpZHRoLAorCQkJCQkJaWNkLT5jdXJyZW50X2ZtdC0+aG9zdF9mbXQpOworCisJaWYgKGJ5dGVzX3Blcl9saW5lIDwgMCkKKwkJcmV0dXJuIGJ5dGVzX3Blcl9saW5lOworCisJc2l6ZSA9IGJ5dGVzX3Blcl9saW5lICogaWNkLT51c2VyX2hlaWdodDsKKworCWlmICghKm5idWZmZXJzIHx8ICpuYnVmZmVycyA+IE1BWF9CVUZGRVJfTlVNKQorCQkqbmJ1ZmZlcnMgPSBNQVhfQlVGRkVSX05VTTsKKworCWlmIChzaXplICogKm5idWZmZXJzID4gVklEX0xJTUlUX0JZVEVTKQorCQkqbmJ1ZmZlcnMgPSBWSURfTElNSVRfQllURVMgLyBzaXplOworCisJKm5wbGFuZXMgPSAxOworCXNpemVzWzBdID0gc2l6ZTsKKwlhbGxvY19jdHhzWzBdID0gaXNpLT5hbGxvY19jdHg7CisKKwlpc2ktPnNlcXVlbmNlID0gMDsKKwlpc2ktPmFjdGl2ZSA9IE5VTEw7CisKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiJXMsIGNvdW50PSVkLCBzaXplPSVsZFxuIiwgX19mdW5jX18sCisJCSpuYnVmZmVycywgc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBidWZmZXJfaW5pdChzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IGZyYW1lX2J1ZmZlciAqYnVmID0gY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgZnJhbWVfYnVmZmVyLCB2Yik7CisKKwlidWYtPnBfZG1hX2Rlc2MgPSBOVUxMOworCUlOSVRfTElTVF9IRUFEKCZidWYtPmxpc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnVmZmVyX3ByZXBhcmUoc3RydWN0IHZiMl9idWZmZXIgKnZiKQoreworCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gc29jX2NhbWVyYV9mcm9tX3ZiMnEodmItPnZiMl9xdWV1ZSk7CisJc3RydWN0IGZyYW1lX2J1ZmZlciAqYnVmID0gY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgZnJhbWVfYnVmZmVyLCB2Yik7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKKwlzdHJ1Y3QgYXRtZWxfaXNpICppc2kgPSBpY2ktPnByaXY7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXN0cnVjdCBpc2lfZG1hX2Rlc2MgKmRlc2M7CisJaW50IGJ5dGVzX3Blcl9saW5lID0gc29jX21idXNfYnl0ZXNfcGVyX2xpbmUoaWNkLT51c2VyX3dpZHRoLAorCQkJCQkJaWNkLT5jdXJyZW50X2ZtdC0+aG9zdF9mbXQpOworCisJaWYgKGJ5dGVzX3Blcl9saW5lIDwgMCkKKwkJcmV0dXJuIGJ5dGVzX3Blcl9saW5lOworCisJc2l6ZSA9IGJ5dGVzX3Blcl9saW5lICogaWNkLT51c2VyX2hlaWdodDsKKworCWlmICh2YjJfcGxhbmVfc2l6ZSh2YiwgMCkgPCBzaXplKSB7CisJCWRldl9lcnIoaWNkLT5wYXJlbnQsICIlcyBkYXRhIHdpbGwgbm90IGZpdCBpbnRvIHBsYW5lICglbHUgPCAlbHUpXG4iLAorCQkJCV9fZnVuY19fLCB2YjJfcGxhbmVfc2l6ZSh2YiwgMCksIHNpemUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl2YjJfc2V0X3BsYW5lX3BheWxvYWQoJmJ1Zi0+dmIsIDAsIHNpemUpOworCisJaWYgKCFidWYtPnBfZG1hX2Rlc2MpIHsKKwkJaWYgKGxpc3RfZW1wdHkoJmlzaS0+ZG1hX2Rlc2NfaGVhZCkpIHsKKwkJCWRldl9lcnIoaWNkLT5wYXJlbnQsICJOb3QgZW5vdWdoIGRtYSBkZXNjcmlwdG9ycy5cbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0gZWxzZSB7CisJCQkvKiBHZXQgYW4gYXZhaWxhYmxlIGRlc2NyaXB0b3IgKi8KKwkJCWRlc2MgPSBsaXN0X2VudHJ5KGlzaS0+ZG1hX2Rlc2NfaGVhZC5uZXh0LAorCQkJCQkJc3RydWN0IGlzaV9kbWFfZGVzYywgbGlzdCk7CisJCQkvKiBEZWxldGUgdGhlIGRlc2NyaXB0b3Igc2luY2Ugbm93IGl0IGlzIHVzZWQgKi8KKwkJCWxpc3RfZGVsX2luaXQoJmRlc2MtPmxpc3QpOworCisJCQkvKiBJbml0aWFsaXplIHRoZSBkbWEgZGVzY3JpcHRvciAqLworCQkJZGVzYy0+cF9mYmQtPmZiX2FkZHJlc3MgPQorCQkJCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcih2YiwgMCk7CisJCQlkZXNjLT5wX2ZiZC0+bmV4dF9mYmRfYWRkcmVzcyA9IDA7CisJCQlzZXRfZG1hX2N0cmwoZGVzYy0+cF9mYmQsIElTSV9ETUFfQ1RSTF9XQik7CisKKwkJCWJ1Zi0+cF9kbWFfZGVzYyA9IGRlc2M7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJ1ZmZlcl9jbGVhbnVwKHN0cnVjdCB2YjJfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHNvY19jYW1lcmFfZnJvbV92YjJxKHZiLT52YjJfcXVldWUpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CisJc3RydWN0IGF0bWVsX2lzaSAqaXNpID0gaWNpLT5wcml2OworCXN0cnVjdCBmcmFtZV9idWZmZXIgKmJ1ZiA9IGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IGZyYW1lX2J1ZmZlciwgdmIpOworCisJLyogVGhpcyBkZXNjcmlwdG9yIGlzIGF2YWlsYWJsZSBub3cgYW5kIHdlIGFkZCB0byBoZWFkIGxpc3QgKi8KKwlpZiAoYnVmLT5wX2RtYV9kZXNjKQorCQlsaXN0X2FkZCgmYnVmLT5wX2RtYV9kZXNjLT5saXN0LCAmaXNpLT5kbWFfZGVzY19oZWFkKTsKK30KKworc3RhdGljIHZvaWQgc3RhcnRfZG1hKHN0cnVjdCBhdG1lbF9pc2kgKmlzaSwgc3RydWN0IGZyYW1lX2J1ZmZlciAqYnVmZmVyKQoreworCXUzMiBjdHJsLCBjZmcxOworCisJY2ZnMSA9IGlzaV9yZWFkbChpc2ksIElTSV9DRkcxKTsKKwkvKiBFbmFibGUgaXJxOiBjeGZyIGZvciB0aGUgY29kZWMgcGF0aCwgcHhmciBmb3IgdGhlIHByZXZpZXcgcGF0aCAqLworCWlzaV93cml0ZWwoaXNpLCBJU0lfSU5URU4sCisJCQlJU0lfU1JfQ1hGUl9ET05FIHwgSVNJX1NSX1BYRlJfRE9ORSk7CisKKwkvKiBDaGVjayBpZiBhbHJlYWR5IGluIGEgZnJhbWUgKi8KKwlpZiAoaXNpX3JlYWRsKGlzaSwgSVNJX1NUQVRVUykgJiBJU0lfQ1RSTF9DREMpIHsKKwkJZGV2X2Vycihpc2ktPmljZC0+cGFyZW50LCAiQWxyZWFkeSBpbiBmcmFtZSBoYW5kbGluZy5cbiIpOworCQlyZXR1cm47CisJfQorCisJaXNpX3dyaXRlbChpc2ksIElTSV9ETUFfQ19EU0NSLCBidWZmZXItPnBfZG1hX2Rlc2MtPmZiZF9waHlzKTsKKwlpc2lfd3JpdGVsKGlzaSwgSVNJX0RNQV9DX0NUUkwsIElTSV9ETUFfQ1RSTF9GRVRDSCB8IElTSV9ETUFfQ1RSTF9ET05FKTsKKwlpc2lfd3JpdGVsKGlzaSwgSVNJX0RNQV9DSEVSLCBJU0lfRE1BX0NIU1JfQ19DSCk7CisKKwkvKiBFbmFibGUgbGlua2VkIGxpc3QgKi8KKwljZmcxIHw9IGlzaS0+cGRhdGEtPmZyYXRlIHwgSVNJX0NGRzFfRElTQ1I7CisKKwkvKiBFbmFibGUgY29kZWMgcGF0aCBhbmQgSVNJICovCisJY3RybCA9IElTSV9DVFJMX0NEQyB8IElTSV9DVFJMX0VOOworCWlzaV93cml0ZWwoaXNpLCBJU0lfQ1RSTCwgY3RybCk7CisJaXNpX3dyaXRlbChpc2ksIElTSV9DRkcxLCBjZmcxKTsKK30KKworc3RhdGljIHZvaWQgYnVmZmVyX3F1ZXVlKHN0cnVjdCB2YjJfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHNvY19jYW1lcmFfZnJvbV92YjJxKHZiLT52YjJfcXVldWUpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CisJc3RydWN0IGF0bWVsX2lzaSAqaXNpID0gaWNpLT5wcml2OworCXN0cnVjdCBmcmFtZV9idWZmZXIgKmJ1ZiA9IGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IGZyYW1lX2J1ZmZlciwgdmIpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlzaS0+bG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJmJ1Zi0+bGlzdCwgJmlzaS0+dmlkZW9fYnVmZmVyX2xpc3QpOworCisJaWYgKGlzaS0+YWN0aXZlID09IE5VTEwpIHsKKwkJaXNpLT5hY3RpdmUgPSBidWY7CisJCXN0YXJ0X2RtYShpc2ksIGJ1Zik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlzaS0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHN0YXJ0X3N0cmVhbWluZyhzdHJ1Y3QgdmIyX3F1ZXVlICp2cSkKK3sKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHNvY19jYW1lcmFfZnJvbV92YjJxKHZxKTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOworCXN0cnVjdCBhdG1lbF9pc2kgKmlzaSA9IGljaS0+cHJpdjsKKworCXUzMiBzciA9IDA7CisJaW50IHJldDsKKworCXNwaW5fbG9ja19pcnEoJmlzaS0+bG9jayk7CisJaXNpLT5zdGF0ZSA9IElTSV9TVEFURV9JRExFOworCS8qIENsZWFyIGFueSBwZW5kaW5nIFNPRiBpbnRlcnJ1cHQgKi8KKwlzciA9IGlzaV9yZWFkbChpc2ksIElTSV9TVEFUVVMpOworCS8qIEVuYWJsZSBWU1lOQyBpbnRlcnJ1cHQgZm9yIFNPRiAqLworCWlzaV93cml0ZWwoaXNpLCBJU0lfSU5URU4sIElTSV9TUl9WU1lOQyk7CisJaXNpX3dyaXRlbChpc2ksIElTSV9DVFJMLCBJU0lfQ1RSTF9FTik7CisJc3Bpbl91bmxvY2tfaXJxKCZpc2ktPmxvY2spOworCisJZGV2X2RiZyhpY2QtPnBhcmVudCwgIldhaXRpbmcgZm9yIFNPRlxuIik7CisJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGlzaS0+dnN5bmNfd3EsCisJCQkJICAgICAgIGlzaS0+c3RhdGUgIT0gSVNJX1NUQVRFX0lETEUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoaXNpLT5zdGF0ZSAhPSBJU0lfU1RBVEVfUkVBRFkpCisJCXJldHVybiAtRUlPOworCisJc3Bpbl9sb2NrX2lycSgmaXNpLT5sb2NrKTsKKwlpc2ktPnN0YXRlID0gSVNJX1NUQVRFX1dBSVRfU09GOworCWlzaV93cml0ZWwoaXNpLCBJU0lfSU5URElTLCBJU0lfU1JfVlNZTkMpOworCXNwaW5fdW5sb2NrX2lycSgmaXNpLT5sb2NrKTsKKworCXJldHVybiAwOworfQorCisvKiBhYm9ydCBzdHJlYW1pbmcgYW5kIHdhaXQgZm9yIGxhc3QgYnVmZmVyICovCitzdGF0aWMgaW50IHN0b3Bfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnZxKQoreworCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gc29jX2NhbWVyYV9mcm9tX3ZiMnEodnEpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CisJc3RydWN0IGF0bWVsX2lzaSAqaXNpID0gaWNpLT5wcml2OworCXN0cnVjdCBmcmFtZV9idWZmZXIgKmJ1ZiwgKm5vZGU7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJc3Bpbl9sb2NrX2lycSgmaXNpLT5sb2NrKTsKKwlpc2ktPmFjdGl2ZSA9IE5VTEw7CisJLyogUmVsZWFzZSBhbGwgYWN0aXZlIGJ1ZmZlcnMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYnVmLCBub2RlLCAmaXNpLT52aWRlb19idWZmZXJfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbF9pbml0KCZidWYtPmxpc3QpOworCQl2YjJfYnVmZmVyX2RvbmUoJmJ1Zi0+dmIsIFZCMl9CVUZfU1RBVEVfRVJST1IpOworCX0KKwlzcGluX3VubG9ja19pcnEoJmlzaS0+bG9jayk7CisKKwl0aW1lb3V0ID0gamlmZmllcyArIEZSQU1FX0lOVEVSVkFMX01JTExJX1NFQyAqIEhaOworCS8qIFdhaXQgdW50aWwgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBmcmFtZS4gKi8KKwl3aGlsZSAoKGlzaV9yZWFkbChpc2ksIElTSV9TVEFUVVMpICYgSVNJX0NUUkxfQ0RDKSAmJgorCQkJdGltZV9iZWZvcmUoamlmZmllcywgdGltZW91dCkpCisJCW1zbGVlcCgxKTsKKworCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCWRldl9lcnIoaWNkLT5wYXJlbnQsCisJCQkiVGltZW91dCB3YWl0aW5nIGZvciBmaW5pc2hpbmcgY29kZWMgcmVxdWVzdFxuIik7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCWlzaV93cml0ZWwoaXNpLCBJU0lfSU5URElTLAorCQkJSVNJX1NSX0NYRlJfRE9ORSB8IElTSV9TUl9QWEZSX0RPTkUpOworCisJLyogRGlzYWJsZSBJU0kgYW5kIHdhaXQgZm9yIGl0IGlzIGRvbmUgKi8KKwlyZXQgPSBhdG1lbF9pc2lfd2FpdF9zdGF0dXMoaXNpLCBXQUlUX0lTSV9ESVNBQkxFKTsKKwlpZiAocmV0IDwgMCkKKwkJZGV2X2VycihpY2QtPnBhcmVudCwgIkRpc2FibGUgSVNJIHRpbWVkIG91dFxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHZiMl9vcHMgaXNpX3ZpZGVvX3FvcHMgPSB7CisJLnF1ZXVlX3NldHVwCQk9IHF1ZXVlX3NldHVwLAorCS5idWZfaW5pdAkJPSBidWZmZXJfaW5pdCwKKwkuYnVmX3ByZXBhcmUJCT0gYnVmZmVyX3ByZXBhcmUsCisJLmJ1Zl9jbGVhbnVwCQk9IGJ1ZmZlcl9jbGVhbnVwLAorCS5idWZfcXVldWUJCT0gYnVmZmVyX3F1ZXVlLAorCS5zdGFydF9zdHJlYW1pbmcJPSBzdGFydF9zdHJlYW1pbmcsCisJLnN0b3Bfc3RyZWFtaW5nCQk9IHN0b3Bfc3RyZWFtaW5nLAorCS53YWl0X3ByZXBhcmUJCT0gc29jX2NhbWVyYV91bmxvY2ssCisJLndhaXRfZmluaXNoCQk9IHNvY19jYW1lcmFfbG9jaywKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCVNPQyBjYW1lcmEgb3BlcmF0aW9ucyBmb3IgdGhlIGRldmljZQorICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgaXNpX2NhbWVyYV9pbml0X3ZpZGVvYnVmKHN0cnVjdCB2YjJfcXVldWUgKnEsCisJCQkJICAgICBzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKK3sKKwlxLT50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCXEtPmlvX21vZGVzID0gVkIyX01NQVA7CisJcS0+ZHJ2X3ByaXYgPSBpY2Q7CisJcS0+YnVmX3N0cnVjdF9zaXplID0gc2l6ZW9mKHN0cnVjdCBmcmFtZV9idWZmZXIpOworCXEtPm9wcyA9ICZpc2lfdmlkZW9fcW9wczsKKwlxLT5tZW1fb3BzID0gJnZiMl9kbWFfY29udGlnX21lbW9wczsKKworCXJldHVybiB2YjJfcXVldWVfaW5pdChxKTsKK30KKworc3RhdGljIGludCBpc2lfY2FtZXJhX3NldF9mbXQoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCisJCQkgICAgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKKwlzdHJ1Y3QgYXRtZWxfaXNpICppc2kgPSBpY2ktPnByaXY7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7CisJY29uc3Qgc3RydWN0IHNvY19jYW1lcmFfZm9ybWF0X3hsYXRlICp4bGF0ZTsKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXggPSAmZi0+Zm10LnBpeDsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IG1mOworCWludCByZXQ7CisKKwl4bGF0ZSA9IHNvY19jYW1lcmFfeGxhdGVfYnlfZm91cmNjKGljZCwgcGl4LT5waXhlbGZvcm1hdCk7CisJaWYgKCF4bGF0ZSkgeworCQlkZXZfd2FybihpY2QtPnBhcmVudCwgIkZvcm1hdCAleCBub3QgZm91bmRcbiIsCisJCQkgcGl4LT5waXhlbGZvcm1hdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRldl9kYmcoaWNkLT5wYXJlbnQsICJQbGFuIHRvIHNldCBmb3JtYXQgJWR4JWRcbiIsCisJCQlwaXgtPndpZHRoLCBwaXgtPmhlaWdodCk7CisKKwltZi53aWR0aAk9IHBpeC0+d2lkdGg7CisJbWYuaGVpZ2h0CT0gcGl4LT5oZWlnaHQ7CisJbWYuZmllbGQJPSBwaXgtPmZpZWxkOworCW1mLmNvbG9yc3BhY2UJPSBwaXgtPmNvbG9yc3BhY2U7CisJbWYuY29kZQkJPSB4bGF0ZS0+Y29kZTsKKworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIHZpZGVvLCBzX21idXNfZm10LCAmbWYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWYgKG1mLmNvZGUgIT0geGxhdGUtPmNvZGUpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gY29uZmlndXJlX2dlb21ldHJ5KGlzaSwgcGl4LT53aWR0aCwgcGl4LT5oZWlnaHQsIHhsYXRlLT5jb2RlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXBpeC0+d2lkdGgJCT0gbWYud2lkdGg7CisJcGl4LT5oZWlnaHQJCT0gbWYuaGVpZ2h0OworCXBpeC0+ZmllbGQJCT0gbWYuZmllbGQ7CisJcGl4LT5jb2xvcnNwYWNlCQk9IG1mLmNvbG9yc3BhY2U7CisJaWNkLT5jdXJyZW50X2ZtdAk9IHhsYXRlOworCisJZGV2X2RiZyhpY2QtPnBhcmVudCwgIkZpbmFsbHkgc2V0IGZvcm1hdCAlZHglZFxuIiwKKwkJcGl4LT53aWR0aCwgcGl4LT5oZWlnaHQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpc2lfY2FtZXJhX3RyeV9mbXQoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCisJCQkgICAgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7CisJY29uc3Qgc3RydWN0IHNvY19jYW1lcmFfZm9ybWF0X3hsYXRlICp4bGF0ZTsKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXggPSAmZi0+Zm10LnBpeDsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IG1mOworCXUzMiBwaXhmbXQgPSBwaXgtPnBpeGVsZm9ybWF0OworCWludCByZXQ7CisKKwl4bGF0ZSA9IHNvY19jYW1lcmFfeGxhdGVfYnlfZm91cmNjKGljZCwgcGl4Zm10KTsKKwlpZiAocGl4Zm10ICYmICF4bGF0ZSkgeworCQlkZXZfd2FybihpY2QtPnBhcmVudCwgIkZvcm1hdCAleCBub3QgZm91bmRcbiIsIHBpeGZtdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGxpbWl0IHRvIEF0bWVsIElTSSBoYXJkd2FyZSBjYXBhYmlsaXRpZXMgKi8KKwlpZiAocGl4LT5oZWlnaHQgPiBNQVhfU1VQUE9SVF9IRUlHSFQpCisJCXBpeC0+aGVpZ2h0ID0gTUFYX1NVUFBPUlRfSEVJR0hUOworCWlmIChwaXgtPndpZHRoID4gTUFYX1NVUFBPUlRfV0lEVEgpCisJCXBpeC0+d2lkdGggPSBNQVhfU1VQUE9SVF9XSURUSDsKKworCS8qIGxpbWl0IHRvIHNlbnNvciBjYXBhYmlsaXRpZXMgKi8KKwltZi53aWR0aAk9IHBpeC0+d2lkdGg7CisJbWYuaGVpZ2h0CT0gcGl4LT5oZWlnaHQ7CisJbWYuZmllbGQJPSBwaXgtPmZpZWxkOworCW1mLmNvbG9yc3BhY2UJPSBwaXgtPmNvbG9yc3BhY2U7CisJbWYuY29kZQkJPSB4bGF0ZS0+Y29kZTsKKworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIHZpZGVvLCB0cnlfbWJ1c19mbXQsICZtZik7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlwaXgtPndpZHRoCT0gbWYud2lkdGg7CisJcGl4LT5oZWlnaHQJPSBtZi5oZWlnaHQ7CisJcGl4LT5jb2xvcnNwYWNlCT0gbWYuY29sb3JzcGFjZTsKKworCXN3aXRjaCAobWYuZmllbGQpIHsKKwljYXNlIFY0TDJfRklFTERfQU5ZOgorCQlwaXgtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCQlicmVhazsKKwljYXNlIFY0TDJfRklFTERfTk9ORToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihpY2QtPnBhcmVudCwgIkZpZWxkIHR5cGUgJWQgdW5zdXBwb3J0ZWQuXG4iLAorCQkJbWYuZmllbGQpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc29jX21idXNfcGl4ZWxmbXQgaXNpX2NhbWVyYV9mb3JtYXRzW10gPSB7CisJeworCQkuZm91cmNjCQkJPSBWNEwyX1BJWF9GTVRfWVVZViwKKwkJLm5hbWUJCQk9ICJQYWNrZWQgWVVWNDIyIDE2IGJpdCIsCisJCS5iaXRzX3Blcl9zYW1wbGUJPSA4LAorCQkucGFja2luZwkJPSBTT0NfTUJVU19QQUNLSU5HXzJYOF9QQURISSwKKwkJLm9yZGVyCQkJPSBTT0NfTUJVU19PUkRFUl9MRSwKKwl9LAorfTsKKworLyogVGhpcyB3aWxsIGJlIGNvcnJlY3RlZCBhcyB3ZSBnZXQgbW9yZSBmb3JtYXRzICovCitzdGF0aWMgYm9vbCBpc2lfY2FtZXJhX3BhY2tpbmdfc3VwcG9ydGVkKGNvbnN0IHN0cnVjdCBzb2NfbWJ1c19waXhlbGZtdCAqZm10KQoreworCXJldHVybglmbXQtPnBhY2tpbmcgPT0gU09DX01CVVNfUEFDS0lOR19OT05FIHx8CisJCShmbXQtPmJpdHNfcGVyX3NhbXBsZSA9PSA4ICYmCisJCSBmbXQtPnBhY2tpbmcgPT0gU09DX01CVVNfUEFDS0lOR18yWDhfUEFESEkpIHx8CisJCShmbXQtPmJpdHNfcGVyX3NhbXBsZSA+IDggJiYKKwkJIGZtdC0+cGFja2luZyA9PSBTT0NfTUJVU19QQUNLSU5HX0VYVEVORDE2KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbWFrZV9idXNfcGFyYW0oc3RydWN0IGF0bWVsX2lzaSAqaXNpKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJLyoKKwkgKiBQbGF0Zm9ybSBzcGVjaWZpZWQgc3luY2hyb25pemF0aW9uIGFuZCBwaXhlbCBjbG9jayBwb2xhcml0aWVzIGFyZQorCSAqIG9ubHkgYSByZWNvbW1lbmRhdGlvbiBhbmQgYXJlIG9ubHkgdXNlZCBkdXJpbmcgcHJvYmluZy4gQXRtZWwgSVNJCisJICogY2FtZXJhIGludGVyZmFjZSBvbmx5IHdvcmtzIGluIG1hc3RlciBtb2RlLCBpLmUuLCB1c2VzIEhTWU5DIGFuZAorCSAqIFZTWU5DIHNpZ25hbHMgZnJvbSB0aGUgc2Vuc29yCisJICovCisJZmxhZ3MgPSBTT0NBTV9NQVNURVIgfAorCQlTT0NBTV9IU1lOQ19BQ1RJVkVfSElHSCB8CisJCVNPQ0FNX0hTWU5DX0FDVElWRV9MT1cgfAorCQlTT0NBTV9WU1lOQ19BQ1RJVkVfSElHSCB8CisJCVNPQ0FNX1ZTWU5DX0FDVElWRV9MT1cgfAorCQlTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcgfAorCQlTT0NBTV9QQ0xLX1NBTVBMRV9GQUxMSU5HIHwKKwkJU09DQU1fREFUQV9BQ1RJVkVfSElHSDsKKworCWlmIChpc2ktPnBkYXRhLT5kYXRhX3dpZHRoX2ZsYWdzICYgSVNJX0RBVEFXSURUSF8xMCkKKwkJZmxhZ3MgfD0gU09DQU1fREFUQVdJRFRIXzEwOworCisJaWYgKGlzaS0+cGRhdGEtPmRhdGFfd2lkdGhfZmxhZ3MgJiBJU0lfREFUQVdJRFRIXzgpCisJCWZsYWdzIHw9IFNPQ0FNX0RBVEFXSURUSF84OworCisJaWYgKGZsYWdzICYgU09DQU1fREFUQVdJRFRIX01BU0spCisJCXJldHVybiBmbGFnczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlzaV9jYW1lcmFfdHJ5X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKKwkJCQkgICAgdW5zaWduZWQgY2hhciBidXN3aWR0aCkKK3sKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOworCXN0cnVjdCBhdG1lbF9pc2kgKmlzaSA9IGljaS0+cHJpdjsKKwl1bnNpZ25lZCBsb25nIGNhbWVyYV9mbGFnczsKKwlpbnQgcmV0OworCisJY2FtZXJhX2ZsYWdzID0gaWNkLT5vcHMtPnF1ZXJ5X2J1c19wYXJhbShpY2QpOworCXJldCA9IHNvY19jYW1lcmFfYnVzX3BhcmFtX2NvbXBhdGlibGUoY2FtZXJhX2ZsYWdzLAorCQkJCQltYWtlX2J1c19wYXJhbShpc2kpKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpc2lfY2FtZXJhX2dldF9mb3JtYXRzKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAorCQkJCSAgdW5zaWduZWQgaW50IGlkeCwKKwkJCQkgIHN0cnVjdCBzb2NfY2FtZXJhX2Zvcm1hdF94bGF0ZSAqeGxhdGUpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7CisJaW50IGZvcm1hdHMgPSAwLCByZXQ7CisJLyogc2Vuc29yIGZvcm1hdCAqLworCWVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBjb2RlOworCS8qIHNvYyBjYW1lcmEgaG9zdCBmb3JtYXQgKi8KKwljb25zdCBzdHJ1Y3Qgc29jX21idXNfcGl4ZWxmbXQgKmZtdDsKKworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIHZpZGVvLCBlbnVtX21idXNfZm10LCBpZHgsICZjb2RlKTsKKwlpZiAocmV0IDwgMCkKKwkJLyogTm8gbW9yZSBmb3JtYXRzICovCisJCXJldHVybiAwOworCisJZm10ID0gc29jX21idXNfZ2V0X2ZtdGRlc2MoY29kZSk7CisJaWYgKCFmbXQpIHsKKwkJZGV2X2VycihpY2QtPnBhcmVudCwKKwkJCSJJbnZhbGlkIGZvcm1hdCBjb2RlICMldTogJWRcbiIsIGlkeCwgY29kZSk7CisJCXJldHVybiAwOworCX0KKworCS8qIFRoaXMgYWxzbyBjaGVja3Mgc3VwcG9ydCBmb3IgdGhlIHJlcXVlc3RlZCBiaXRzLXBlci1zYW1wbGUgKi8KKwlyZXQgPSBpc2lfY2FtZXJhX3RyeV9idXNfcGFyYW0oaWNkLCBmbXQtPmJpdHNfcGVyX3NhbXBsZSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycihpY2QtPnBhcmVudCwKKwkJCSJGYWlsIHRvIHRyeSB0aGUgYnVzIHBhcmFtZXRlcnMuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoIChjb2RlKSB7CisJY2FzZSBWNEwyX01CVVNfRk1UX1VZVlk4XzJYODoKKwljYXNlIFY0TDJfTUJVU19GTVRfVllVWThfMlg4OgorCWNhc2UgVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDg6CisJY2FzZSBWNEwyX01CVVNfRk1UX1lWWVU4XzJYODoKKwkJZm9ybWF0cysrOworCQlpZiAoeGxhdGUpIHsKKwkJCXhsYXRlLT5ob3N0X2ZtdAk9ICZpc2lfY2FtZXJhX2Zvcm1hdHNbMF07CisJCQl4bGF0ZS0+Y29kZQk9IGNvZGU7CisJCQl4bGF0ZSsrOworCQkJZGV2X2RiZyhpY2QtPnBhcmVudCwgIlByb3ZpZGluZyBmb3JtYXQgJXMgdXNpbmcgY29kZSAlZFxuIiwKKwkJCQlpc2lfY2FtZXJhX2Zvcm1hdHNbMF0ubmFtZSwgY29kZSk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKCFpc2lfY2FtZXJhX3BhY2tpbmdfc3VwcG9ydGVkKGZtdCkpCisJCQlyZXR1cm4gMDsKKwkJaWYgKHhsYXRlKQorCQkJZGV2X2RiZyhpY2QtPnBhcmVudCwKKwkJCQkiUHJvdmlkaW5nIGZvcm1hdCAlcyBpbiBwYXNzLXRocm91Z2ggbW9kZVxuIiwKKwkJCQlmbXQtPm5hbWUpOworCX0KKworCS8qIEdlbmVyaWMgcGFzcy10aHJvdWdoICovCisJZm9ybWF0cysrOworCWlmICh4bGF0ZSkgeworCQl4bGF0ZS0+aG9zdF9mbXQJPSBmbXQ7CisJCXhsYXRlLT5jb2RlCT0gY29kZTsKKwkJeGxhdGUrKzsKKwl9CisKKwlyZXR1cm4gZm9ybWF0czsKK30KKworLyogQ2FsbGVkIHdpdGggLnZpZGVvX2xvY2sgaGVsZCAqLworc3RhdGljIGludCBpc2lfY2FtZXJhX2FkZF9kZXZpY2Uoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCit7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKKwlzdHJ1Y3QgYXRtZWxfaXNpICppc2kgPSBpY2ktPnByaXY7CisJaW50IHJldDsKKworCWlmIChpc2ktPmljZCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJldCA9IGNsa19lbmFibGUoaXNpLT5wY2xrKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaXNpLT5pY2QgPSBpY2Q7CisJZGV2X2RiZyhpY2QtPnBhcmVudCwgIkF0bWVsIElTSSBDYW1lcmEgZHJpdmVyIGF0dGFjaGVkIHRvIGNhbWVyYSAlZFxuIiwKKwkJIGljZC0+ZGV2bnVtKTsKKwlyZXR1cm4gMDsKK30KKy8qIENhbGxlZCB3aXRoIC52aWRlb19sb2NrIGhlbGQgKi8KK3N0YXRpYyB2b2lkIGlzaV9jYW1lcmFfcmVtb3ZlX2RldmljZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKK3sKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOworCXN0cnVjdCBhdG1lbF9pc2kgKmlzaSA9IGljaS0+cHJpdjsKKworCUJVR19PTihpY2QgIT0gaXNpLT5pY2QpOworCisJY2xrX2Rpc2FibGUoaXNpLT5wY2xrKTsKKwlpc2ktPmljZCA9IE5VTEw7CisKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiQXRtZWwgSVNJIENhbWVyYSBkcml2ZXIgZGV0YWNoZWQgZnJvbSBjYW1lcmEgJWRcbiIsCisJCSBpY2QtPmRldm51bSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXNpX2NhbWVyYV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICpwdCkKK3sKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXJldHVybiB2YjJfcG9sbCgmaWNkLT52YjJfdmlkcSwgZmlsZSwgcHQpOworfQorCitzdGF0aWMgaW50IGlzaV9jYW1lcmFfcXVlcnljYXAoc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpLAorCQkJICAgICAgIHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKmNhcCkKK3sKKwlzdHJjcHkoY2FwLT5kcml2ZXIsICJhdG1lbC1pc2kiKTsKKwlzdHJjcHkoY2FwLT5jYXJkLCAiQXRtZWwgSW1hZ2UgU2Vuc29yIEludGVyZmFjZSIpOworCWNhcC0+Y2FwYWJpbGl0aWVzID0gKFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfAorCQkJCVY0TDJfQ0FQX1NUUkVBTUlORyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXNpX2NhbWVyYV9zZXRfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLCB1MzIgcGl4Zm10KQoreworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CisJc3RydWN0IGF0bWVsX2lzaSAqaXNpID0gaWNpLT5wcml2OworCXVuc2lnbmVkIGxvbmcgYnVzX2ZsYWdzLCBjYW1lcmFfZmxhZ3MsIGNvbW1vbl9mbGFnczsKKwlpbnQgcmV0OworCXUzMiBjZmcxID0gMDsKKworCWNhbWVyYV9mbGFncyA9IGljZC0+b3BzLT5xdWVyeV9idXNfcGFyYW0oaWNkKTsKKworCWJ1c19mbGFncyA9IG1ha2VfYnVzX3BhcmFtKGlzaSk7CisJY29tbW9uX2ZsYWdzID0gc29jX2NhbWVyYV9idXNfcGFyYW1fY29tcGF0aWJsZShjYW1lcmFfZmxhZ3MsIGJ1c19mbGFncyk7CisJZGV2X2RiZyhpY2QtPnBhcmVudCwgIkZsYWdzIGNhbTogMHglbHggaG9zdDogMHglbHggY29tbW9uOiAweCVseFxuIiwKKwkJY2FtZXJhX2ZsYWdzLCBidXNfZmxhZ3MsIGNvbW1vbl9mbGFncyk7CisJaWYgKCFjb21tb25fZmxhZ3MpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogTWFrZSBjaG9pc2VzLCBiYXNlZCBvbiBwbGF0Zm9ybSBwcmVmZXJlbmNlcyAqLworCWlmICgoY29tbW9uX2ZsYWdzICYgU09DQU1fSFNZTkNfQUNUSVZFX0hJR0gpICYmCisJICAgIChjb21tb25fZmxhZ3MgJiBTT0NBTV9IU1lOQ19BQ1RJVkVfTE9XKSkgeworCQlpZiAoaXNpLT5wZGF0YS0+aHN5bmNfYWN0X2xvdykKKwkJCWNvbW1vbl9mbGFncyAmPSB+U09DQU1fSFNZTkNfQUNUSVZFX0hJR0g7CisJCWVsc2UKKwkJCWNvbW1vbl9mbGFncyAmPSB+U09DQU1fSFNZTkNfQUNUSVZFX0xPVzsKKwl9CisKKwlpZiAoKGNvbW1vbl9mbGFncyAmIFNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIKSAmJgorCSAgICAoY29tbW9uX2ZsYWdzICYgU09DQU1fVlNZTkNfQUNUSVZFX0xPVykpIHsKKwkJaWYgKGlzaS0+cGRhdGEtPnZzeW5jX2FjdF9sb3cpCisJCQljb21tb25fZmxhZ3MgJj0gflNPQ0FNX1ZTWU5DX0FDVElWRV9ISUdIOworCQllbHNlCisJCQljb21tb25fZmxhZ3MgJj0gflNPQ0FNX1ZTWU5DX0FDVElWRV9MT1c7CisJfQorCisJaWYgKChjb21tb25fZmxhZ3MgJiBTT0NBTV9QQ0xLX1NBTVBMRV9SSVNJTkcpICYmCisJICAgIChjb21tb25fZmxhZ3MgJiBTT0NBTV9QQ0xLX1NBTVBMRV9GQUxMSU5HKSkgeworCQlpZiAoaXNpLT5wZGF0YS0+cGNsa19hY3RfZmFsbGluZykKKwkJCWNvbW1vbl9mbGFncyAmPSB+U09DQU1fUENMS19TQU1QTEVfUklTSU5HOworCQllbHNlCisJCQljb21tb25fZmxhZ3MgJj0gflNPQ0FNX1BDTEtfU0FNUExFX0ZBTExJTkc7CisJfQorCisJcmV0ID0gaWNkLT5vcHMtPnNldF9idXNfcGFyYW0oaWNkLCBjb21tb25fZmxhZ3MpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9kYmcoaWNkLT5wYXJlbnQsICJDYW1lcmEgc2V0X2J1c19wYXJhbSglbHgpIHJldHVybmVkICVkXG4iLAorCQkJY29tbW9uX2ZsYWdzLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qIHNldCBidXMgcGFyYW0gZm9yIElTSSAqLworCWlmIChjb21tb25fZmxhZ3MgJiBTT0NBTV9IU1lOQ19BQ1RJVkVfTE9XKQorCQljZmcxIHw9IElTSV9DRkcxX0hTWU5DX1BPTF9BQ1RJVkVfTE9XOworCWlmIChjb21tb25fZmxhZ3MgJiBTT0NBTV9WU1lOQ19BQ1RJVkVfTE9XKQorCQljZmcxIHw9IElTSV9DRkcxX1ZTWU5DX1BPTF9BQ1RJVkVfTE9XOworCWlmIChjb21tb25fZmxhZ3MgJiBTT0NBTV9QQ0xLX1NBTVBMRV9GQUxMSU5HKQorCQljZmcxIHw9IElTSV9DRkcxX1BJWENMS19QT0xfQUNUSVZFX0ZBTExJTkc7CisKKwlpZiAoaXNpLT5wZGF0YS0+aGFzX2VtYl9zeW5jKQorCQljZmcxIHw9IElTSV9DRkcxX0VNQl9TWU5DOworCWlmIChpc2ktPnBkYXRhLT5pc2lfZnVsbF9tb2RlKQorCQljZmcxIHw9IElTSV9DRkcxX0ZVTExfTU9ERTsKKworCWlzaV93cml0ZWwoaXNpLCBJU0lfQ1RSTCwgSVNJX0NUUkxfRElTKTsKKwlpc2lfd3JpdGVsKGlzaSwgSVNJX0NGRzEsIGNmZzEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0X29wcyBpc2lfc29jX2NhbWVyYV9ob3N0X29wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmFkZAkJPSBpc2lfY2FtZXJhX2FkZF9kZXZpY2UsCisJLnJlbW92ZQkJPSBpc2lfY2FtZXJhX3JlbW92ZV9kZXZpY2UsCisJLnNldF9mbXQJPSBpc2lfY2FtZXJhX3NldF9mbXQsCisJLnRyeV9mbXQJPSBpc2lfY2FtZXJhX3RyeV9mbXQsCisJLmdldF9mb3JtYXRzCT0gaXNpX2NhbWVyYV9nZXRfZm9ybWF0cywKKwkuaW5pdF92aWRlb2J1ZjIJPSBpc2lfY2FtZXJhX2luaXRfdmlkZW9idWYsCisJLnBvbGwJCT0gaXNpX2NhbWVyYV9wb2xsLAorCS5xdWVyeWNhcAk9IGlzaV9jYW1lcmFfcXVlcnljYXAsCisJLnNldF9idXNfcGFyYW0JPSBpc2lfY2FtZXJhX3NldF9idXNfcGFyYW0sCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBhdG1lbF9pc2lfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqc29jX2hvc3QgPSB0b19zb2NfY2FtZXJhX2hvc3QoJnBkZXYtPmRldik7CisJc3RydWN0IGF0bWVsX2lzaSAqaXNpID0gY29udGFpbmVyX29mKHNvY19ob3N0LAorCQkJCQlzdHJ1Y3QgYXRtZWxfaXNpLCBzb2NfaG9zdCk7CisKKwlmcmVlX2lycShpc2ktPmlycSwgaXNpKTsKKwlzb2NfY2FtZXJhX2hvc3RfdW5yZWdpc3Rlcihzb2NfaG9zdCk7CisJdmIyX2RtYV9jb250aWdfY2xlYW51cF9jdHgoaXNpLT5hbGxvY19jdHgpOworCWRtYV9mcmVlX2NvaGVyZW50KCZwZGV2LT5kZXYsCisJCQlzaXplb2Yoc3RydWN0IGZiZCkgKiBNQVhfQlVGRkVSX05VTSwKKwkJCWlzaS0+cF9mYl9kZXNjcmlwdG9ycywKKwkJCWlzaS0+ZmJfZGVzY3JpcHRvcnNfcGh5cyk7CisKKwlpb3VubWFwKGlzaS0+cmVncyk7CisJY2xrX3B1dChpc2ktPnBjbGspOworCWtmcmVlKGlzaSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgYXRtZWxfaXNpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJdW5zaWduZWQgaW50IGlycTsKKwlzdHJ1Y3QgYXRtZWxfaXNpICppc2k7CisJc3RydWN0IGNsayAqcGNsazsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlZ3M7CisJaW50IHJldCwgaTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKnNvY19ob3N0OworCXN0cnVjdCBpc2lfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisKKwlwZGF0YSA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKwlpZiAoIXBkYXRhIHx8ICFwZGF0YS0+ZGF0YV93aWR0aF9mbGFncykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiTm8gY29uZmlnIGF2YWlsYWJsZSBmb3IgQXRtZWwgSVNJXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmVncyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZWdzKQorCQlyZXR1cm4gLUVOWElPOworCisJcGNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgImlzaV9jbGsiKTsKKwlpZiAoSVNfRVJSKHBjbGspKQorCQlyZXR1cm4gUFRSX0VSUihwY2xrKTsKKworCWlzaSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhdG1lbF9pc2kpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWlzaSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJDYW4ndCBhbGxvY2F0ZSBpbnRlcmZhY2UhXG4iKTsKKwkJZ290byBlcnJfYWxsb2NfaXNpOworCX0KKworCWlzaS0+cGNsayA9IHBjbGs7CisJaXNpLT5wZGF0YSA9IHBkYXRhOworCWlzaS0+YWN0aXZlID0gTlVMTDsKKwlzcGluX2xvY2tfaW5pdCgmaXNpLT5sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpc2ktPnZzeW5jX3dxKTsKKwlJTklUX0xJU1RfSEVBRCgmaXNpLT52aWRlb19idWZmZXJfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmlzaS0+ZG1hX2Rlc2NfaGVhZCk7CisKKwlpc2ktPnBfZmJfZGVzY3JpcHRvcnMgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBkZXYtPmRldiwKKwkJCQlzaXplb2Yoc3RydWN0IGZiZCkgKiBNQVhfQlVGRkVSX05VTSwKKwkJCQkmaXNpLT5mYl9kZXNjcmlwdG9yc19waHlzLAorCQkJCUdGUF9LRVJORUwpOworCWlmICghaXNpLT5wX2ZiX2Rlc2NyaXB0b3JzKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IGFsbG9jYXRlIGRlc2NyaXB0b3JzIVxuIik7CisJCWdvdG8gZXJyX2FsbG9jX2Rlc2NyaXB0b3JzOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBNQVhfQlVGRkVSX05VTTsgaSsrKSB7CisJCWlzaS0+ZG1hX2Rlc2NbaV0ucF9mYmQgPSBpc2ktPnBfZmJfZGVzY3JpcHRvcnMgKyBpOworCQlpc2ktPmRtYV9kZXNjW2ldLmZiZF9waHlzID0gaXNpLT5mYl9kZXNjcmlwdG9yc19waHlzICsKKwkJCQkJaSAqIHNpemVvZihzdHJ1Y3QgZmJkKTsKKwkJbGlzdF9hZGQoJmlzaS0+ZG1hX2Rlc2NbaV0ubGlzdCwgJmlzaS0+ZG1hX2Rlc2NfaGVhZCk7CisJfQorCisJaXNpLT5hbGxvY19jdHggPSB2YjJfZG1hX2NvbnRpZ19pbml0X2N0eCgmcGRldi0+ZGV2KTsKKwlpZiAoSVNfRVJSKGlzaS0+YWxsb2NfY3R4KSkgeworCQlyZXQgPSBQVFJfRVJSKGlzaS0+YWxsb2NfY3R4KTsKKwkJZ290byBlcnJfYWxsb2NfY3R4OworCX0KKworCWlzaS0+cmVncyA9IGlvcmVtYXAocmVncy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVncykpOworCWlmICghaXNpLT5yZWdzKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2lvcmVtYXA7CisJfQorCisJaXNpX3dyaXRlbChpc2ksIElTSV9DVFJMLCBJU0lfQ1RSTF9ESVMpOworCisJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAoaXJxIDwgMCkgeworCQlyZXQgPSBpcnE7CisJCWdvdG8gZXJyX3JlcV9pcnE7CisJfQorCisJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBpc2lfaW50ZXJydXB0LCAwLCAiaXNpIiwgaXNpKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIlVuYWJsZSB0byByZXF1ZXN0IGlycSAlZFxuIiwgaXJxKTsKKwkJZ290byBlcnJfcmVxX2lycTsKKwl9CisJaXNpLT5pcnEgPSBpcnE7CisKKwlzb2NfaG9zdAkJPSAmaXNpLT5zb2NfaG9zdDsKKwlzb2NfaG9zdC0+ZHJ2X25hbWUJPSAiaXNpLWNhbWVyYSI7CisJc29jX2hvc3QtPm9wcwkJPSAmaXNpX3NvY19jYW1lcmFfaG9zdF9vcHM7CisJc29jX2hvc3QtPnByaXYJCT0gaXNpOworCXNvY19ob3N0LT52NGwyX2Rldi5kZXYJPSAmcGRldi0+ZGV2OworCXNvY19ob3N0LT5ucgkJPSBwZGV2LT5pZDsKKworCXJldCA9IHNvY19jYW1lcmFfaG9zdF9yZWdpc3Rlcihzb2NfaG9zdCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gcmVnaXN0ZXIgc29jIGNhbWVyYSBob3N0XG4iKTsKKwkJZ290byBlcnJfcmVnaXN0ZXJfc29jX2NhbWVyYV9ob3N0OworCX0KKwlyZXR1cm4gMDsKKworZXJyX3JlZ2lzdGVyX3NvY19jYW1lcmFfaG9zdDoKKwlmcmVlX2lycShpc2ktPmlycSwgaXNpKTsKK2Vycl9yZXFfaXJxOgorCWlvdW5tYXAoaXNpLT5yZWdzKTsKK2Vycl9pb3JlbWFwOgorCXZiMl9kbWFfY29udGlnX2NsZWFudXBfY3R4KGlzaS0+YWxsb2NfY3R4KTsKK2Vycl9hbGxvY19jdHg6CisJZG1hX2ZyZWVfY29oZXJlbnQoJnBkZXYtPmRldiwKKwkJCXNpemVvZihzdHJ1Y3QgZmJkKSAqIE1BWF9CVUZGRVJfTlVNLAorCQkJaXNpLT5wX2ZiX2Rlc2NyaXB0b3JzLAorCQkJaXNpLT5mYl9kZXNjcmlwdG9yc19waHlzKTsKK2Vycl9hbGxvY19kZXNjcmlwdG9yczoKKwlrZnJlZShpc2kpOworZXJyX2FsbG9jX2lzaToKKwljbGtfcHV0KGlzaS0+cGNsayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhdG1lbF9pc2lfZHJpdmVyID0geworCS5wcm9iZQkJPSBhdG1lbF9pc2lfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhdG1lbF9pc2lfcmVtb3ZlKSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUgPSAiYXRtZWxfaXNpIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGF0bWVsX2lzaV9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiAgcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZhdG1lbF9pc2lfZHJpdmVyLCAmYXRtZWxfaXNpX3Byb2JlKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGF0bWVsX2lzaV9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmF0bWVsX2lzaV9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoYXRtZWxfaXNpX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGF0bWVsX2lzaV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiSm9zaCBXdSA8am9zaC53dUBhdG1lbC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRoZSBWNEwyIGRyaXZlciBmb3IgQXRtZWwgTGludXgiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJ2aWRlbyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9hdTA4MjgvYXUwODI4LWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXUwODI4L2F1MDgyOC1jb3JlLmMKaW5kZXggY2EzNDJlNC4uMWU0Y2U1MDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYXUwODI4L2F1MDgyOC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9hdTA4MjgvYXUwODI4LWNvcmUuYwpAQCAtMjkyLDMgKzI5Miw0IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIkRyaXZlciBmb3IgQXV2aXRlayBBVTA4MjggYmFzZWQgcHJvZHVjdHMiKTsKIE1PRFVMRV9BVVRIT1IoIlN0ZXZlbiBUb3RoIDxzdG90aEBsaW51eHR2Lm9yZz4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKCIwLjAuMiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9hdTA4MjgvYXUwODI4LXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2F1MDgyOC9hdTA4MjgtdmlkZW8uYwppbmRleCBjMDNlYjI5Li4wYjNlNDgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2F1MDgyOC9hdTA4MjgtdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2F1MDgyOC9hdTA4MjgtdmlkZW8uYwpAQCAtMzMsNyArMzMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgpAQCAtNDMsOCArNDIsNiBAQAogCiBzdGF0aWMgREVGSU5FX01VVEVYKGF1MDgyOF9zeXNmc19sb2NrKTsKIAotI2RlZmluZSBBVTA4MjhfVkVSU0lPTl9DT0RFIEtFUk5FTF9WRVJTSU9OKDAsIDAsIDEpCi0KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCVZpZGVvYnVmIG9wZXJhdGlvbnMKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0xMjU0LDggKzEyNTEsNiBAQAogCXN0cmxjcHkoY2FwLT5jYXJkLCBkZXYtPmJvYXJkLm5hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKIAlzdHJsY3B5KGNhcC0+YnVzX2luZm8sIGRldi0+djRsMl9kZXYubmFtZSwgc2l6ZW9mKGNhcC0+YnVzX2luZm8pKTsKIAotCWNhcC0+dmVyc2lvbiA9IEFVMDgyOF9WRVJTSU9OX0NPREU7Ci0KIAkvKnNldCB0aGUgZGV2aWNlIGNhcGFiaWxpdGllcyAqLwogCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8CiAJCVY0TDJfQ0FQX1ZCSV9DQVBUVVJFIHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWNhcmRzLmMKaW5kZXggM2M5ZTZjNy4uNWIxNWY2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWNhcmRzLmMKQEAgLTI4OTIsMTMgKzI4OTIsMTAgQEAKIHsKIAl1bnNpZ25lZCBpbnQgZ3Bpb2JpdHM7CiAJaW50IGksdHlwZTsKLQl1bnNpZ25lZCBzaG9ydCB0bXA7CiAKIAkvKiByZWFkIFBDSSBzdWJzeXN0ZW0gSUQgKi8KLQlwY2lfcmVhZF9jb25maWdfd29yZChidHYtPmMucGNpLCBQQ0lfU1VCU1lTVEVNX0lELCAmdG1wKTsKLQlidHYtPmNhcmRpZCA9IHRtcCA8PCAxNjsKLQlwY2lfcmVhZF9jb25maWdfd29yZChidHYtPmMucGNpLCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJnRtcCk7Ci0JYnR2LT5jYXJkaWQgfD0gdG1wOworCWJ0di0+Y2FyZGlkICA9IGJ0di0+Yy5wY2ktPnN1YnN5c3RlbV9kZXZpY2UgPDwgMTY7CisJYnR2LT5jYXJkaWQgfD0gYnR2LT5jLnBjaS0+c3Vic3lzdGVtX3ZlbmRvcjsKIAogCWlmICgwICE9IGJ0di0+Y2FyZGlkICYmIDB4ZmZmZmZmZmYgIT0gYnR2LT5jYXJkaWQpIHsKIAkJLyogbG9vayBmb3IgdGhlIGNhcmQgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0di1kcml2ZXIuYwppbmRleCA4MzRhNDgzLi4xNDQ0NGRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHYtZHJpdmVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2LWRyaXZlci5jCkBAIC01Nyw2ICs1Nyw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zYWE2NTg4Lmg+CiAKKyNkZWZpbmUgQlRUVl9WRVJTSU9OICIwLjkuMTkiCiAKIHVuc2lnbmVkIGludCBidHR2X251bTsJCQkvKiBudW1iZXIgb2YgQnQ4NDhzIGluIHVzZSAqLwogc3RydWN0IGJ0dHYgKmJ0dHZzW0JUVFZfTUFYXTsKQEAgLTE2Myw2ICsxNjQsNyBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJidHR2IC0gdjRsL3Y0bDIgZHJpdmVyIG1vZHVsZSBmb3IgYnQ4NDgvODc4IGJhc2VkIGNhcmRzIik7CiBNT0RVTEVfQVVUSE9SKCJSYWxwaCBNZXR6bGVyICYgTWFyY3VzIE1ldHpsZXIgJiBHZXJkIEtub3JyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihCVFRWX1ZFUlNJT04pOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogc3lzZnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTI2MTYsNyArMjYxOCw2IEBACiAJc3RybGNweShjYXAtPmNhcmQsIGJ0di0+dmlkZW9fZGV2LT5uYW1lLCBzaXplb2YoY2FwLT5jYXJkKSk7CiAJc25wcmludGYoY2FwLT5idXNfaW5mbywgc2l6ZW9mKGNhcC0+YnVzX2luZm8pLAogCQkgIlBDSTolcyIsIHBjaV9uYW1lKGJ0di0+Yy5wY2kpKTsKLQljYXAtPnZlcnNpb24gPSBCVFRWX1ZFUlNJT05fQ09ERTsKIAljYXAtPmNhcGFiaWxpdGllcyA9CiAJCVY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfAogCQlWNEwyX0NBUF9WQklfQ0FQVFVSRSB8CkBAIC0zNDE2LDcgKzM0MTcsNiBAQAogCXN0cmNweShjYXAtPmRyaXZlciwgImJ0dHYiKTsKIAlzdHJsY3B5KGNhcC0+Y2FyZCwgYnR2LT5yYWRpb19kZXYtPm5hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKIAlzcHJpbnRmKGNhcC0+YnVzX2luZm8sICJQQ0k6JXMiLCBwY2lfbmFtZShidHYtPmMucGNpKSk7Ci0JY2FwLT52ZXJzaW9uID0gQlRUVl9WRVJTSU9OX0NPREU7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUjsKIAogCXJldHVybiAwOwpAQCAtNDU4NSwxNCArNDU4NSw4IEBACiAKIAlidHR2X251bSA9IDA7CiAKLQlwcmludGsoS0VSTl9JTkZPICJidHR2OiBkcml2ZXIgdmVyc2lvbiAlZC4lZC4lZCBsb2FkZWRcbiIsCi0JICAgICAgIChCVFRWX1ZFUlNJT05fQ09ERSA+PiAxNikgJiAweGZmLAotCSAgICAgICAoQlRUVl9WRVJTSU9OX0NPREUgPj4gOCkgJiAweGZmLAotCSAgICAgICBCVFRWX1ZFUlNJT05fQ09ERSAmIDB4ZmYpOwotI2lmZGVmIFNOQVBTSE9UCi0JcHJpbnRrKEtFUk5fSU5GTyAiYnR0djogc25hcHNob3QgZGF0ZSAlMDRkLSUwMmQtJTAyZFxuIiwKLQkgICAgICAgU05BUFNIT1QvMTAwMDAsIChTTkFQU0hPVC8xMDApJTEwMCwgU05BUFNIT1QlMTAwKTsKLSNlbmRpZgorCXByaW50ayhLRVJOX0lORk8gImJ0dHY6IGRyaXZlciB2ZXJzaW9uICVzIGxvYWRlZFxuIiwKKwkgICAgICAgQlRUVl9WRVJTSU9OKTsKIAlpZiAoZ2J1ZmZlcnMgPCAyIHx8IGdidWZmZXJzID4gVklERU9fTUFYX0ZSQU1FKQogCQlnYnVmZmVycyA9IDI7CiAJaWYgKGdidWZzaXplID4gQlRUVl9NQVhfRkJVRikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0dnAuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnQ4eHgvYnR0dnAuaAppbmRleCA5Yjc3NmZhLi4zMThlZGYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J0OHh4L2J0dHZwLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9idDh4eC9idHR2cC5oCkBAIC0yNSw5ICsyNSw2IEBACiAjaWZuZGVmIF9CVFRWUF9IXwogI2RlZmluZSBfQlRUVlBfSF8KIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLSNkZWZpbmUgQlRUVl9WRVJTSU9OX0NPREUgS0VSTkVMX1ZFUlNJT04oMCw5LDE4KQotCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2J3LXFjYW0uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnctcWNhbS5jCmluZGV4IGMxMTkzNTAuLmYwOWRmOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnctcWNhbS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vYnctcWNhbS5jCkBAIC03MSw3ICs3MSw2IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9wYXJwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtNjQ3LDcgKzY0Niw2IEBACiAJc3RybGNweSh2Y2FwLT5kcml2ZXIsIHFjYW0tPnY0bDJfZGV2Lm5hbWUsIHNpemVvZih2Y2FwLT5kcml2ZXIpKTsKIAlzdHJsY3B5KHZjYXAtPmNhcmQsICJCJlcgUXVpY2tjYW0iLCBzaXplb2YodmNhcC0+Y2FyZCkpOwogCXN0cmxjcHkodmNhcC0+YnVzX2luZm8sICJwYXJwb3J0Iiwgc2l6ZW9mKHZjYXAtPmJ1c19pbmZvKSk7Ci0JdmNhcC0+dmVyc2lvbiA9IEtFUk5FTF9WRVJTSU9OKDAsIDAsIDIpOwogCXZjYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfCBWNEwyX0NBUF9SRUFEV1JJVEU7CiAJcmV0dXJuIDA7CiB9CkBAIC04OTUsNiArODkzLDcgQEAKIAogCWlmICh2NGwyX2RldmljZV9yZWdpc3RlcihOVUxMLCB2NGwyX2RldikgPCAwKSB7CiAJCXY0bDJfZXJyKHY0bDJfZGV2LCAiQ291bGQgbm90IHJlZ2lzdGVyIHY0bDJfZGV2aWNlXG4iKTsKKwkJa2ZyZWUocWNhbSk7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtMTA5MiwzICsxMDkxLDQgQEAKIG1vZHVsZV9leGl0KGV4aXRfYndfcWNhbXMpOwogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiMC4wLjMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYy1xY2FtLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2MtcWNhbS5jCmluZGV4IDI0ZmMwMDkuLmNkOGZmMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vYy1xY2FtLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jLXFjYW0uYwpAQCAtMzUsNyArMzUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KQEAgLTUxNyw3ICs1MTYsNiBAQAogCXN0cmxjcHkodmNhcC0+ZHJpdmVyLCBxY2FtLT52NGwyX2Rldi5uYW1lLCBzaXplb2YodmNhcC0+ZHJpdmVyKSk7CiAJc3RybGNweSh2Y2FwLT5jYXJkLCAiQ29sb3IgUXVpY2tjYW0iLCBzaXplb2YodmNhcC0+Y2FyZCkpOwogCXN0cmxjcHkodmNhcC0+YnVzX2luZm8sICJwYXJwb3J0Iiwgc2l6ZW9mKHZjYXAtPmJ1c19pbmZvKSk7Ci0JdmNhcC0+dmVyc2lvbiA9IEtFUk5FTF9WRVJTSU9OKDAsIDAsIDMpOwogCXZjYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfCBWNEwyX0NBUF9SRUFEV1JJVEU7CiAJcmV0dXJuIDA7CiB9CkBAIC03NTIsNiArNzUwLDcgQEAKIAogCWlmICh2NGwyX2RldmljZV9yZWdpc3RlcihOVUxMLCB2NGwyX2RldikgPCAwKSB7CiAJCXY0bDJfZXJyKHY0bDJfZGV2LCAiQ291bGQgbm90IHJlZ2lzdGVyIHY0bDJfZGV2aWNlXG4iKTsKKwkJa2ZyZWUocWNhbSk7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtODg2LDYgKzg4NSw3IEBACiBNT0RVTEVfQVVUSE9SKCJQaGlsaXAgQmx1bmRlbGwgPHBoaWxiQGdudS5vcmc+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oQkFOTkVSKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKCIwLjAuNCIpOwogCiBtb2R1bGVfaW5pdChjcWNhbV9pbml0KTsKIG1vZHVsZV9leGl0KGNxY2FtX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jYWZlX2NjaWMtcmVncy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jYWZlX2NjaWMtcmVncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTJhODdjZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NhZmVfY2NpYy1yZWdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoKLSAqIFJlZ2lzdGVyIGRlZmluaXRpb25zIGZvciB0aGUgbTg4YWxwMDEgY2FtZXJhIGludGVyZmFjZS4gIE9mZnNldHMgaW4gYnl0ZXMKLSAqIGFzIGdpdmVuIGluIHRoZSBzcGVjLgotICoKLSAqIENvcHlyaWdodCAyMDA2IE9uZSBMYXB0b3AgUGVyIENoaWxkIEFzc29jaWF0aW9uLCBJbmMuCi0gKgotICogV3JpdHRlbiBieSBKb25hdGhhbiBDb3JiZXQsIGNvcmJldEBsd24ubmV0LgotICoKLSAqIFRoaXMgZmlsZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbAotICogUHVibGljIExpY2Vuc2UsIHZlcnNpb24gMi4KLSAqLwotI2RlZmluZSBSRUdfWTBCQVIJMHgwMAotI2RlZmluZSBSRUdfWTFCQVIJMHgwNAotI2RlZmluZSBSRUdfWTJCQVIJMHgwOAotLyogLi4uICovCi0KLSNkZWZpbmUgUkVHX0lNR1BJVENICTB4MjQJLyogSW1hZ2UgcGl0Y2ggcmVnaXN0ZXIgKi8KLSNkZWZpbmUgICBJTUdQX1lQX1NIRlQJICAyCQkvKiBZIHBpdGNoIHBhcmFtcyAqLwotI2RlZmluZSAgIElNR1BfWVBfTUFTSwkgIDB4MDAwMDNmZmMJLyogWSBwaXRjaCBmaWVsZCAqLwotI2RlZmluZQkgIElNR1BfVVZQX1NIRlQJICAxOAkJLyogVVYgcGl0Y2ggKHBsYW5hcikgKi8KLSNkZWZpbmUgICBJTUdQX1VWUF9NQVNLICAgMHgzZmZjMDAwMAotI2RlZmluZSBSRUdfSVJRU1RBVFJBVwkweDI4CS8qIFJBVyBJUlEgU3RhdHVzICovCi0jZGVmaW5lICAgSVJRX0VPRjAJICAweDAwMDAwMDAxCS8qIEVuZCBvZiBmcmFtZSAwICovCi0jZGVmaW5lICAgSVJRX0VPRjEJICAweDAwMDAwMDAyCS8qIEVuZCBvZiBmcmFtZSAxICovCi0jZGVmaW5lICAgSVJRX0VPRjIJICAweDAwMDAwMDA0CS8qIEVuZCBvZiBmcmFtZSAyICovCi0jZGVmaW5lICAgSVJRX1NPRjAJICAweDAwMDAwMDA4CS8qIFN0YXJ0IG9mIGZyYW1lIDAgKi8KLSNkZWZpbmUgICBJUlFfU09GMQkgIDB4MDAwMDAwMTAJLyogU3RhcnQgb2YgZnJhbWUgMSAqLwotI2RlZmluZSAgIElSUV9TT0YyCSAgMHgwMDAwMDAyMAkvKiBTdGFydCBvZiBmcmFtZSAyICovCi0jZGVmaW5lICAgSVJRX09WRVJGTE9XCSAgMHgwMDAwMDA0MAkvKiBGSUZPIG92ZXJmbG93ICovCi0jZGVmaW5lICAgSVJRX1RXU0lXCSAgMHgwMDAxMDAwMAkvKiBUV1NJIChzbWJ1cykgd3JpdGUgKi8KLSNkZWZpbmUgICBJUlFfVFdTSVIJICAweDAwMDIwMDAwCS8qIFRXU0kgcmVhZCAqLwotI2RlZmluZSAgIElSUV9UV1NJRQkgIDB4MDAwNDAwMDAJLyogVFdTSSBlcnJvciAqLwotI2RlZmluZSAgIFRXU0lJUlFTIChJUlFfVFdTSVd8SVJRX1RXU0lSfElSUV9UV1NJRSkKLSNkZWZpbmUgICBGUkFNRUlSUVMgKElSUV9FT0YwfElSUV9FT0YxfElSUV9FT0YyfElSUV9TT0YwfElSUV9TT0YxfElSUV9TT0YyKQotI2RlZmluZSAgIEFMTElSUVMgKFRXU0lJUlFTfEZSQU1FSVJRU3xJUlFfT1ZFUkZMT1cpCi0jZGVmaW5lIFJFR19JUlFNQVNLCTB4MmMJLyogSVJRIG1hc2sgLSBzYW1lIGJpdHMgYXMgSVJRU1RBVCAqLwotI2RlZmluZSBSRUdfSVJRU1RBVAkweDMwCS8qIElSUSBzdGF0dXMgLyBjbGVhciAqLwotCi0jZGVmaW5lIFJFR19JTUdTSVpFCTB4MzQJLyogSW1hZ2Ugc2l6ZSAqLwotI2RlZmluZSAgSU1HU1pfVl9NQVNLCSAgMHgxZmZmMDAwMAotI2RlZmluZSAgSU1HU1pfVl9TSElGVAkgIDE2Ci0jZGVmaW5lCSBJTUdTWl9IX01BU0sJICAweDAwMDAzZmZmCi0jZGVmaW5lIFJFR19JTUdPRkZTRVQJMHgzOAkvKiBJTWFnZSBvZmZzZXQgKi8KLQotI2RlZmluZSBSRUdfQ1RSTDAJMHgzYwkvKiBDb250cm9sIDAgKi8KLSNkZWZpbmUgICBDMF9FTkFCTEUJICAweDAwMDAwMDAxCS8qIE1ha2VzIHRoZSB3aG9sZSB0aGluZyBnbyAqLwotCi0vKiBNYXNrIGZvciBhbGwgdGhlIGZvcm1hdCBiaXRzICovCi0jZGVmaW5lICAgQzBfREZfTUFTSwkgIDB4MDBmZmZmZmMgICAgLyogQml0cyAyLTIzICovCi0KLS8qIFJHQiBvcmRlcmluZyAqLwotI2RlZmluZSAgIEMwX1JHQjRfUkdCWAkgIDB4MDAwMDAwMDAKLSNkZWZpbmUJICBDMF9SR0I0X1hSR0IJICAweDAwMDAwMDA0Ci0jZGVmaW5lCSAgQzBfUkdCNF9CR1JYCSAgMHgwMDAwMDAwOAotI2RlZmluZSAgIEMwX1JHQjRfWEJHUgkgIDB4MDAwMDAwMGMKLSNkZWZpbmUgICBDMF9SR0I1X1JHR0IJICAweDAwMDAwMDAwCi0jZGVmaW5lCSAgQzBfUkdCNV9HUkJHCSAgMHgwMDAwMDAwNAotI2RlZmluZQkgIEMwX1JHQjVfR0JSRwkgIDB4MDAwMDAwMDgKLSNkZWZpbmUgICBDMF9SR0I1X0JHR1IJICAweDAwMDAwMDBjCi0KLS8qIFNwZWMgaGFzIHR3byBmaWVsZHMgZm9yIERJTiBhbmQgRE9VVCwgYnV0IHRoZXkgbXVzdCBtYXRjaCwgc28KLSAgIGNvbWJpbmUgdGhlbSBoZXJlLiAqLwotI2RlZmluZSAgIEMwX0RGX1lVVgkgIDB4MDAwMDAwMDAgICAgLyogRGF0YSBpcyBZVVYJICAgICovCi0jZGVmaW5lICAgQzBfREZfUkdCCSAgMHgwMDAwMDBhMAkvKiAuLi4gUkdCCQkgICAgKi8KLSNkZWZpbmUgICBDMF9ERl9CQVlFUiAgICAgMHgwMDAwMDE0MAkvKiAuLi4gQmF5ZXIgICAgICAgICAgICAgICAgKi8KLS8qIDgtOC04IG11c3QgYmUgbWlzc2luZyBmcm9tIHRoZSBiZWxvdyAtIGFzayAqLwotI2RlZmluZSAgIEMwX1JHQkZfNTY1CSAgMHgwMDAwMDAwMAotI2RlZmluZSAgIEMwX1JHQkZfNDQ0CSAgMHgwMDAwMDgwMAotI2RlZmluZSAgIEMwX1JHQl9CR1IJICAweDAwMDAxMDAwCS8qIEJsdWUgY29tZXMgZmlyc3QgKi8KLSNkZWZpbmUgICBDMF9ZVVZfUExBTkFSCSAgMHgwMDAwMDAwMAkvKiBZVVYgNDIyIHBsYW5hciBmb3JtYXQgKi8KLSNkZWZpbmUgICBDMF9ZVVZfUEFDS0VECSAgMHgwMDAwODAwMAkvKiBZVVYgNDIyIHBhY2tlZAkqLwotI2RlZmluZSAgIEMwX1lVVl80MjBQTAkgIDB4MDAwMGEwMDAJLyogWVVWIDQyMCBwbGFuYXIJKi8KLS8qIFRoaW5rIHRoYXQgNDIwIHBhY2tlZCBtdXN0IGJlIDExMSAtIGFzayAqLwotI2RlZmluZQkgIEMwX1lVVkVfWVVZVgkgIDB4MDAwMDAwMDAJLyogWTFDYlkwQ3IgCQkqLwotI2RlZmluZQkgIEMwX1lVVkVfWVZZVQkgIDB4MDAwMTAwMDAJLyogWTFDclkwQ2IgCQkqLwotI2RlZmluZQkgIEMwX1lVVkVfVllVWQkgIDB4MDAwMjAwMDAJLyogQ3JZMUNiWTAgCQkqLwotI2RlZmluZQkgIEMwX1lVVkVfVVlWWQkgIDB4MDAwMzAwMDAJLyogQ2JZMUNyWTAgCQkqLwotI2RlZmluZSAgIEMwX1lVVkVfWFlVVgkgIDB4MDAwMDAwMDAgICAgLyogNDIwOiAuWVVWCQkqLwotI2RlZmluZQkgIEMwX1lVVkVfWFlWVQkgIDB4MDAwMTAwMDAJLyogNDIwOiAuWVZVIAkJKi8KLSNkZWZpbmUJICBDMF9ZVVZFX1hVVlkJICAweDAwMDIwMDAwCS8qIDQyMDogLlVWWSAJCSovCi0jZGVmaW5lCSAgQzBfWVVWRV9YVlVZCSAgMHgwMDAzMDAwMAkvKiA0MjA6IC5WVVkgCQkqLwotLyogQmF5ZXIgYml0cyAxOCwxOSBpZiBuZWVkZWQgKi8KLSNkZWZpbmUgICBDMF9IUE9MX0xPVwkgIDB4MDEwMDAwMDAJLyogSFNZTkMgcG9sYXJpdHkgYWN0aXZlIGxvdyAqLwotI2RlZmluZSAgIEMwX1ZQT0xfTE9XCSAgMHgwMjAwMDAwMAkvKiBWU1lOQyBwb2xhcml0eSBhY3RpdmUgbG93ICovCi0jZGVmaW5lICAgQzBfVkNMS19MT1cJICAweDA0MDAwMDAwCS8qIFZDTEsgb24gZmFsbGluZyBlZGdlICovCi0jZGVmaW5lICAgQzBfRE9XTlNDQUxFCSAgMHgwODAwMDAwMAkvKiBFbmFibGUgZG93bnNjYWxlciAqLwotI2RlZmluZQkgIEMwX1NJRk1fTUFTSwkgIDB4YzAwMDAwMDAJLyogU0lGIG1vZGUgYml0cyAqLwotI2RlZmluZSAgIEMwX1NJRl9IVlNZTkMJICAweDAwMDAwMDAwCS8qIFVzZSBIL1ZTWU5DICovCi0jZGVmaW5lICAgQ09fU09GX05PU1lOQwkgIDB4NDAwMDAwMDAJLyogVXNlIGluYmFuZCBhY3RpdmUgc2lnbmFsaW5nICovCi0KLQotI2RlZmluZSBSRUdfQ1RSTDEJMHg0MAkvKiBDb250cm9sIDEgKi8KLSNkZWZpbmUgICBDMV80NDRBTFBIQQkgIDB4MDBmMDAwMDAJLyogQWxwaGEgZmllbGQgaW4gUkdCNDQ0ICovCi0jZGVmaW5lICAgQzFfQUxQSEFfU0hGVAkgIDIwCi0jZGVmaW5lICAgQzFfRE1BQjMyCSAgMHgwMDAwMDAwMAkvKiAzMi1ieXRlIERNQSBidXJzdCAqLwotI2RlZmluZSAgIEMxX0RNQUIxNgkgIDB4MDIwMDAwMDAJLyogMTYtYnl0ZSBETUEgYnVyc3QgKi8KLSNkZWZpbmUJICBDMV9ETUFCNjQJICAweDA0MDAwMDAwCS8qIDY0LWJ5dGUgRE1BIGJ1cnN0ICovCi0jZGVmaW5lCSAgQzFfRE1BQl9NQVNLCSAgMHgwNjAwMDAwMAotI2RlZmluZSAgIEMxX1RXT0JVRlMJICAweDA4MDAwMDAwCS8qIFVzZSBvbmx5IHR3byBETUEgYnVmZmVycyAqLwotI2RlZmluZSAgIEMxX1BXUkRXTgkgIDB4MTAwMDAwMDAJLyogUG93ZXIgZG93biAqLwotCi0jZGVmaW5lIFJFR19DTEtDVFJMCTB4ODgJLyogQ2xvY2sgY29udHJvbCAqLwotI2RlZmluZSAgIENMS19ESVZfTUFTSwkgIDB4MDAwMGZmZmYJLyogVXBwZXIgYml0cyBSVyAicmVzZXJ2ZWQiICovCi0KLSNkZWZpbmUgUkVHX0dQUgkJMHhiNAkvKiBHZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIuICBUaGlzCi0JCQkJICAgY29udHJvbHMgaW5wdXRzIHRvIHRoZSBwb3dlciBhbmQgcmVzZXQKLQkJCQkgICBwaW5zIG9uIHRoZSBPVjc2NzAgdXNlZCB3aXRoIE9MUEM7Ci0JCQkJICAgb3RoZXIgZGVwbG95bWVudHMgY291bGQgZGlmZmVyLiAgKi8KLSNkZWZpbmUgICBHUFJfQzFFTgkgIDB4MDAwMDAwMjAJLyogUGFkIDEgKHBvd2VyIGRvd24pIGVuYWJsZSAqLwotI2RlZmluZSAgIEdQUl9DMEVOCSAgMHgwMDAwMDAxMAkvKiBQYWQgMCAocmVzZXQpIGVuYWJsZSAqLwotI2RlZmluZQkgIEdQUl9DMQkgIDB4MDAwMDAwMDIJLyogQ29udHJvbCAxIHZhbHVlICovCi0vKgotICogQ29udHJvbCAwIGlzIHdpcmVkIHRvIHJlc2V0IG9uIE9MUEMgbWFjaGluZXMuICBGb3Igb3Y3eCBzZW5zb3JzLAotICogaXQgaXMgYWN0aXZlIGxvdywgZm9yIDB2NngsIGluc3RlYWQsIGl0J3MgYWN0aXZlIGhpZ2guICBXaGF0Ci0gKiBmdW4uCi0gKi8KLSNkZWZpbmUgICBHUFJfQzAJICAweDAwMDAwMDAxCS8qIENvbnRyb2wgMCB2YWx1ZSAqLwotCi0jZGVmaW5lIFJFR19UV1NJQzAJMHhiOAkvKiBUV1NJIChzbWJ1cykgY29udHJvbCAwICovCi0jZGVmaW5lICAgVFdTSUMwX0VOICAgICAgIDB4MDAwMDAwMDEJLyogVFdTSSBlbmFibGUgKi8KLSNkZWZpbmUgICBUV1NJQzBfTU9ERQkgIDB4MDAwMDAwMDIJLyogMSA9IDE2LWJpdCwgMCA9IDgtYml0ICovCi0jZGVmaW5lICAgVFdTSUMwX1NJRAkgIDB4MDAwMDAzZmMJLyogU2xhdmUgSUQgKi8KLSNkZWZpbmUgICBUV1NJQzBfU0lEX1NISUZUIDIKLSNkZWZpbmUgICBUV1NJQzBfQ0xLRElWICAgMHgwMDA3ZmMwMAkvKiBDbG9jayBkaXZpZGVyICovCi0jZGVmaW5lICAgVFdTSUMwX01BU0tBQ0sgIDB4MDA0MDAwMDAJLyogTWFzayBhY2sgZnJvbSBzZW5zb3IgKi8KLSNkZWZpbmUgICBUV1NJQzBfT1ZNQUdJQyAgMHgwMDgwMDAwMAkvKiBNYWtlIGl0IHdvcmsgb24gT1Ygc2Vuc29ycyAqLwotCi0jZGVmaW5lIFJFR19UV1NJQzEJMHhiYwkvKiBUV1NJIGNvbnRyb2wgMSAqLwotI2RlZmluZSAgIFRXU0lDMV9EQVRBCSAgMHgwMDAwZmZmZgkvKiBEYXRhIHRvL2Zyb20gY2FtY2hpcCAqLwotI2RlZmluZSAgIFRXU0lDMV9BRERSCSAgMHgwMGZmMDAwMAkvKiBBZGRyZXNzIChyZWdpc3RlcikgKi8KLSNkZWZpbmUgICBUV1NJQzFfQUREUl9TSElGVCAxNgotI2RlZmluZSAgIFRXU0lDMV9SRUFECSAgMHgwMTAwMDAwMAkvKiBTZXQgZm9yIHJlYWQgb3AgKi8KLSNkZWZpbmUgICBUV1NJQzFfV1NUQVQJICAweDAyMDAwMDAwCS8qIFdyaXRlIHN0YXR1cyAqLwotI2RlZmluZSAgIFRXU0lDMV9SVkFMSUQJICAweDA0MDAwMDAwCS8qIFJlYWQgZGF0YSB2YWxpZCAqLwotI2RlZmluZSAgIFRXU0lDMV9FUlJPUgkgIDB4MDgwMDAwMDAJLyogU29tZXRoaW5nIHNjcmV3ZWQgdXAgKi8KLQotCi0jZGVmaW5lIFJFR19VQkFSCTB4YzQJLyogVXBwZXIgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyICovCi0KLS8qCi0gKiBIZXJlJ3MgdGhlIHdlaXJkIGdsb2JhbCBjb250cm9sIHJlZ2lzdGVycyB3aGljaCBhcmUgc2FpZCB0byBsaXZlCi0gKiB3YXkgdXAgaGVyZS4KLSAqLwotI2RlZmluZSBSRUdfR0xfQ1NSICAgICAweDMwMDQgIC8qIENvbnRyb2wvc3RhdHVzIHJlZ2lzdGVyICovCi0jZGVmaW5lICAgR0NTUl9TUlMJIDB4MDAwMDAwMDEJLyogU1cgUmVzZXQgc2V0ICovCi0jZGVmaW5lICAgR0NTUl9TUkMgIAkgMHgwMDAwMDAwMgkvKiBTVyBSZXNldCBjbGVhciAqLwotI2RlZmluZQkgIEdDU1JfTVJTCSAweDAwMDAwMDA0CS8qIE1hc3RlciByZXNldCBzZXQgKi8KLSNkZWZpbmUJICBHQ1NSX01SQwkgMHgwMDAwMDAwOAkvKiBIVyBSZXNldCBjbGVhciAqLwotI2RlZmluZSAgIEdDU1JfQ0NJQ19FTiAgIDB4MDAwMDQwMDAgICAgLyogQ0NJQyBDbG9jayBlbmFibGUgKi8KLSNkZWZpbmUgUkVHX0dMX0lNQVNLICAgMHgzMDBjICAvKiBJbnRlcnJ1cHQgbWFzayByZWdpc3RlciAqLwotI2RlZmluZSAgIEdJTVNLX0NDSUNfRU4gICAgICAgICAgMHgwMDAwMDAwNCAgICAvKiBDQ0lDIEludGVycnVwdCBlbmFibGUgKi8KLQotI2RlZmluZSBSRUdfR0xfRkNSCTB4MzAzOCAgLyogR1BJTyBmdW5jdGlvbmFsIGNvbnRyb2wgcmVnaXN0ZXIgKi8KLSNkZWZpbmUJICBHRkNSX0dQSU9fT04JICAweDA4CQkvKiBDYW1lcmEgR1BJTyBlbmFibGVkICovCi0jZGVmaW5lIFJFR19HTF9HUElPUgkweDMxNWMJLyogR1BJTyByZWdpc3RlciAqLwotI2RlZmluZSAgIEdHUElPX09VVCAgCQkweDgwMDAwCS8qIEdQSU8gb3V0cHV0ICovCi0jZGVmaW5lICAgR0dQSU9fVkFMICAJCTB4MDAwMDgJLyogT3V0cHV0IHBpbiB2YWx1ZSAqLwotCi0jZGVmaW5lIFJFR19MRU4gICAgICAgICAgICAgICAgUkVHX0dMX0lNQVNLICsgNAotCi0KLS8qCi0gKiBVc2VmdWwgc3R1ZmYgdGhhdCBwcm9iYWJseSBiZWxvbmdzIHNvbWV3aGVyZSBnbG9iYWwuCi0gKi8KLSNkZWZpbmUgVkdBX1dJRFRICTY0MAotI2RlZmluZSBWR0FfSEVJR0hUCTQ4MApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jYWZlX2NjaWMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY2FmZV9jY2ljLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NDcwMzMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jYWZlX2NjaWMuYworKysgL2Rldi9udWxsCkBAIC0xLDIyNjcgKzAsMCBAQAotLyoKLSAqIEEgZHJpdmVyIGZvciB0aGUgQ01PUyBjYW1lcmEgY29udHJvbGxlciBpbiB0aGUgTWFydmVsbCA4OEFMUDAxICJjYWZlIgotICogbXVsdGlmdW5jdGlvbiBjaGlwLiAgQ3VycmVudGx5IHdvcmtzIHdpdGggdGhlIE9tbml2aXNpb24gT1Y3NjcwCi0gKiBzZW5zb3IuCi0gKgotICogVGhlIGRhdGEgc2hlZXQgZm9yIHRoaXMgZGV2aWNlIGNhbiBiZSBmb3VuZCBhdDoKLSAqICAgIGh0dHA6Ly93d3cubWFydmVsbC5jb20vcHJvZHVjdHMvcGNfY29ubmVjdGl2aXR5Lzg4YWxwMDEvIAotICoKLSAqIENvcHlyaWdodCAyMDA2IE9uZSBMYXB0b3AgUGVyIENoaWxkIEFzc29jaWF0aW9uLCBJbmMuCi0gKiBDb3B5cmlnaHQgMjAwNi03IEpvbmF0aGFuIENvcmJldCA8Y29yYmV0QGx3bi5uZXQ+Ci0gKgotICogV3JpdHRlbiBieSBKb25hdGhhbiBDb3JiZXQsIGNvcmJldEBsd24ubmV0LgotICoKLSAqIHY0bDJfZGV2aWNlL3Y0bDJfc3ViZGV2IGNvbnZlcnNpb24gYnk6Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+Ci0gKgotICogTm90ZTogdGhpcyBjb252ZXJzaW9uIGlzIHVudGVzdGVkISBQbGVhc2UgY29udGFjdCB0aGUgbGludXgtbWVkaWEKLSAqIG1haWxpbmdsaXN0IGlmIHlvdSBjYW4gdGVzdCB0aGlzLCB0b2dldGhlciB3aXRoIHRoZSB0ZXN0IHJlc3VsdHMuCi0gKgotICogVGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsCi0gKiBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWkuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgotI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgotI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KLSNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Ci0KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotCi0jaW5jbHVkZSAib3Y3NjcwLmgiCi0jaW5jbHVkZSAiY2FmZV9jY2ljLXJlZ3MuaCIKLQotI2RlZmluZSBDQUZFX1ZFUlNJT04gMHgwMDAwMDIKLQotCi0vKgotICogUGFyYW1ldGVycy4KLSAqLwotTU9EVUxFX0FVVEhPUigiSm9uYXRoYW4gQ29yYmV0IDxjb3JiZXRAbHduLm5ldD4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiTWFydmVsbCA4OEFMUDAxIENNT1MgQ2FtZXJhIENvbnRyb2xsZXIgZHJpdmVyIik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgiVmlkZW8iKTsKLQotLyoKLSAqIEludGVybmFsIERNQSBidWZmZXIgbWFuYWdlbWVudC4gIFNpbmNlIHRoZSBjb250cm9sbGVyIGNhbm5vdCBkbyBTL0cgSS9PLAotICogd2UgbXVzdCBoYXZlIHBoeXNpY2FsbHkgY29udGlndW91cyBidWZmZXJzIHRvIGJyaW5nIGZyYW1lcyBpbnRvLgotICogVGhlc2UgcGFyYW1ldGVycyBjb250cm9sIGhvdyBtYW55IGJ1ZmZlcnMgd2UgdXNlLCB3aGV0aGVyIHdlCi0gKiBhbGxvY2F0ZSB0aGVtIGF0IGxvYWQgdGltZSAoYmV0dGVyIGNoYW5jZSBvZiBzdWNjZXNzLCBidXQgbmFpbHMgZG93bgotICogbWVtb3J5KSBvciB3aGVuIHNvbWVib2R5IHRyaWVzIHRvIHVzZSB0aGUgY2FtZXJhIChyaXNraWVyKSwgYW5kLAotICogZm9yIGxvYWQtdGltZSBhbGxvY2F0aW9uLCBob3cgYmlnIHRoZXkgc2hvdWxkIGJlLgotICoKLSAqIFRoZSBjb250cm9sbGVyIGNhbiBjeWNsZSB0aHJvdWdoIHRocmVlIGJ1ZmZlcnMuICBXZSBjb3VsZCB1c2UKLSAqIG1vcmUgYnkgZmxpcHBpbmcgcG9pbnRlcnMgYXJvdW5kLCBidXQgaXQgcHJvYmFibHkgbWFrZXMgbGl0dGxlCi0gKiBzZW5zZS4KLSAqLwotCi0jZGVmaW5lIE1BWF9ETUFfQlVGUyAzCi1zdGF0aWMgaW50IGFsbG9jX2J1ZnNfYXRfcmVhZDsKLW1vZHVsZV9wYXJhbShhbGxvY19idWZzX2F0X3JlYWQsIGJvb2wsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhhbGxvY19idWZzX2F0X3JlYWQsCi0JCSJOb24temVybyB2YWx1ZSBjYXVzZXMgRE1BIGJ1ZmZlcnMgdG8gYmUgYWxsb2NhdGVkIHdoZW4gdGhlICIKLQkJInZpZGVvIGNhcHR1cmUgZGV2aWNlIGlzIHJlYWQsIHJhdGhlciB0aGFuIGF0IG1vZHVsZSBsb2FkICIKLQkJInRpbWUuICBUaGlzIHNhdmVzIG1lbW9yeSwgYnV0IGRlY3JlYXNlcyB0aGUgY2hhbmNlcyBvZiAiCi0JCSJzdWNjZXNzZnVsbHkgZ2V0dGluZyB0aG9zZSBidWZmZXJzLiIpOwotCi1zdGF0aWMgaW50IG5fZG1hX2J1ZnMgPSAzOwotbW9kdWxlX3BhcmFtKG5fZG1hX2J1ZnMsIHVpbnQsIDA2NDQpOwotTU9EVUxFX1BBUk1fREVTQyhuX2RtYV9idWZzLAotCQkiVGhlIG51bWJlciBvZiBETUEgYnVmZmVycyB0byBhbGxvY2F0ZS4gIENhbiBiZSBlaXRoZXIgdHdvICIKLQkJIihzYXZlcyBtZW1vcnksIG1ha2VzIHRpbWluZyB0aWdodGVyKSBvciB0aHJlZS4iKTsKLQotc3RhdGljIGludCBkbWFfYnVmX3NpemUgPSBWR0FfV0lEVEggKiBWR0FfSEVJR0hUICogMjsgIC8qIFdvcnN0IGNhc2UgKi8KLW1vZHVsZV9wYXJhbShkbWFfYnVmX3NpemUsIHVpbnQsIDA0NDQpOwotTU9EVUxFX1BBUk1fREVTQyhkbWFfYnVmX3NpemUsCi0JCSJUaGUgc2l6ZSBvZiB0aGUgYWxsb2NhdGVkIERNQSBidWZmZXJzLiAgSWYgYWN0dWFsIG9wZXJhdGluZyAiCi0JCSJwYXJhbWV0ZXJzIHJlcXVpcmUgbGFyZ2VyIGJ1ZmZlcnMsIGFuIGF0dGVtcHQgdG8gcmVhbGxvY2F0ZSAiCi0JCSJ3aWxsIGJlIG1hZGUuIik7Ci0KLXN0YXRpYyBpbnQgbWluX2J1ZmZlcnMgPSAxOwotbW9kdWxlX3BhcmFtKG1pbl9idWZmZXJzLCB1aW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MobWluX2J1ZmZlcnMsCi0JCSJUaGUgbWluaW11bSBudW1iZXIgb2Ygc3RyZWFtaW5nIEkvTyBidWZmZXJzIHdlIGFyZSB3aWxsaW5nICIKLQkJInRvIHdvcmsgd2l0aC4iKTsKLQotc3RhdGljIGludCBtYXhfYnVmZmVycyA9IDEwOwotbW9kdWxlX3BhcmFtKG1heF9idWZmZXJzLCB1aW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MobWF4X2J1ZmZlcnMsCi0JCSJUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3RyZWFtaW5nIEkvTyBidWZmZXJzIGFuIGFwcGxpY2F0aW9uICIKLQkJIndpbGwgYmUgYWxsb3dlZCB0byBhbGxvY2F0ZS4gIFRoZXNlIGJ1ZmZlcnMgYXJlIGJpZyBhbmQgbGl2ZSAiCi0JCSJpbiB2bWFsbG9jIHNwYWNlLiIpOwotCi1zdGF0aWMgaW50IGZsaXA7Ci1tb2R1bGVfcGFyYW0oZmxpcCwgYm9vbCwgMDQ0NCk7Ci1NT0RVTEVfUEFSTV9ERVNDKGZsaXAsCi0JCSJJZiBzZXQsIHRoZSBzZW5zb3Igd2lsbCBiZSBpbnN0cnVjdGVkIHRvIGZsaXAgdGhlIGltYWdlICIKLQkJInZlcnRpY2FsbHkuIik7Ci0KLQotZW51bSBjYWZlX3N0YXRlIHsKLQlTX05PVFJFQURZLAkvKiBOb3QgeWV0IGluaXRpYWxpemVkICovCi0JU19JRExFLAkJLyogSnVzdCBoYW5naW5nIGFyb3VuZCAqLwotCVNfRkxBS0VELAkvKiBTb21lIHNvcnQgb2YgcHJvYmxlbSAqLwotCVNfU0lOR0xFUkVBRCwJLyogSW4gcmVhZCgpICovCi0JU19TUEVDUkVBRCwgICAJLyogU3BlY3VsYXRpdmUgcmVhZCAoZm9yIGZ1dHVyZSByZWFkKCkpICovCi0JU19TVFJFQU1JTkcJLyogU3RyZWFtaW5nIGRhdGEgKi8KLX07Ci0KLS8qCi0gKiBUcmFja2luZyBvZiBzdHJlYW1pbmcgSS9PIGJ1ZmZlcnMuCi0gKi8KLXN0cnVjdCBjYWZlX3Npb19idWZmZXIgewotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlzdHJ1Y3QgdjRsMl9idWZmZXIgdjRsYnVmOwotCWNoYXIgKmJ1ZmZlcjsgICAvKiBXaGVyZSBpdCBsaXZlcyBpbiBrZXJuZWwgc3BhY2UgKi8KLQlpbnQgbWFwY291bnQ7Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW07Ci19OwotCi0vKgotICogQSBkZXNjcmlwdGlvbiBvZiBvbmUgb2Ygb3VyIGRldmljZXMuCi0gKiBMb2NraW5nOiBjb250cm9sbGVkIGJ5IHNfbXV0ZXguICBDZXJ0YWluIGZpZWxkcywgaG93ZXZlciwgcmVxdWlyZQotICogCSAgICB0aGUgZGV2X2xvY2sgc3BpbmxvY2s7IHRoZXkgYXJlIG1hcmtlZCBhcyBzdWNoIGJ5IGNvbW1lbnRzLgotICoJICAgIGRldl9sb2NrIGlzIGFsc28gcmVxdWlyZWQgZm9yIGFjY2VzcyB0byBkZXZpY2UgcmVnaXN0ZXJzLgotICovCi1zdHJ1Y3QgY2FmZV9jYW1lcmEKLXsKLQlzdHJ1Y3QgdjRsMl9kZXZpY2UgdjRsMl9kZXY7Ci0JZW51bSBjYWZlX3N0YXRlIHN0YXRlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7ICAgCQkvKiBCdWZmZXIgc3RhdHVzLCBtYWlubHkgKGRldl9sb2NrKSAqLwotCWludCB1c2VyczsJCQkvKiBIb3cgbWFueSBvcGVuIEZEcyAqLwotCXN0cnVjdCBmaWxlICpvd25lcjsJCS8qIFdobyBoYXMgZGF0YSBhY2Nlc3MgKHY0bDIpICovCi0KLQkvKgotCSAqIFN1YnN5c3RlbSBzdHJ1Y3R1cmVzLgotCSAqLwotCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwotCXN0cnVjdCB2aWRlb19kZXZpY2UgdmRldjsKLQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgaTJjX2FkYXB0ZXI7Ci0Jc3RydWN0IHY0bDJfc3ViZGV2ICpzZW5zb3I7Ci0JdW5zaWduZWQgc2hvcnQgc2Vuc29yX2FkZHI7Ci0KLQl1bnNpZ25lZCBjaGFyIF9faW9tZW0gKnJlZ3M7Ci0Jc3RydWN0IGxpc3RfaGVhZCBkZXZfbGlzdDsJLyogbGluayB0byBvdGhlciBkZXZpY2VzICovCi0KLQkvKiBETUEgYnVmZmVycyAqLwotCXVuc2lnbmVkIGludCBuYnVmczsJCS8qIEhvdyBtYW55IGFyZSBhbGxvYydkICovCi0JaW50IG5leHRfYnVmOwkJCS8qIE5leHQgdG8gY29uc3VtZSAoZGV2X2xvY2spICovCi0JdW5zaWduZWQgaW50IGRtYV9idWZfc2l6ZTsgIAkvKiBhbGxvY2F0ZWQgc2l6ZSAqLwotCXZvaWQgKmRtYV9idWZzW01BWF9ETUFfQlVGU107CS8qIEludGVybmFsIGJ1ZmZlciBhZGRyZXNzZXMgKi8KLQlkbWFfYWRkcl90IGRtYV9oYW5kbGVzW01BWF9ETUFfQlVGU107IC8qIEJ1ZmZlciBidXMgYWRkcmVzc2VzICovCi0JdW5zaWduZWQgaW50IHNwZWNmcmFtZXM7CS8qIFVuY29uc3VtZWQgc3BlYyBmcmFtZXMgKGRldl9sb2NrKSAqLwotCXVuc2lnbmVkIGludCBzZXF1ZW5jZTsJCS8qIEZyYW1lIHNlcXVlbmNlIG51bWJlciAqLwotCXVuc2lnbmVkIGludCBidWZfc2VxW01BWF9ETUFfQlVGU107IC8qIFNlcXVlbmNlIGZvciBpbmRpdmlkdWFsIGJ1ZmZlcnMgKi8KLQotCS8qIFN0cmVhbWluZyBidWZmZXJzICovCi0JdW5zaWduZWQgaW50IG5fc2J1ZnM7CQkvKiBIb3cgbWFueSB3ZSBoYXZlICovCi0Jc3RydWN0IGNhZmVfc2lvX2J1ZmZlciAqc2JfYnVmczsgLyogVGhlIGFycmF5IG9mIGhvdXNla2VlcGluZyBzdHJ1Y3RzICovCi0Jc3RydWN0IGxpc3RfaGVhZCBzYl9hdmFpbDsJLyogQXZhaWxhYmxlIGZvciBkYXRhICh3ZSBvd24pIChkZXZfbG9jaykgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIHNiX2Z1bGw7CS8qIFdpdGggZGF0YSAodXNlciBzcGFjZSBvd25zKSAoZGV2X2xvY2spICovCi0Jc3RydWN0IHRhc2tsZXRfc3RydWN0IHNfdGFza2xldDsKLQotCS8qIEN1cnJlbnQgb3BlcmF0aW5nIHBhcmFtZXRlcnMgKi8KLQl1MzIgc2Vuc29yX3R5cGU7CQkvKiBDdXJyZW50bHkgb3Y3NjcwIG9ubHkgKi8KLQlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHBpeF9mb3JtYXQ7Ci0JZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlIG1idXNfY29kZTsKLQotCS8qIExvY2tzICovCi0Jc3RydWN0IG11dGV4IHNfbXV0ZXg7IC8qIEFjY2VzcyB0byB0aGlzIHN0cnVjdHVyZSAqLwotCXNwaW5sb2NrX3QgZGV2X2xvY2s7ICAvKiBBY2Nlc3MgdG8gZGV2aWNlICovCi0KLQkvKiBNaXNjICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3Qgc21idXNfd2FpdDsJLyogV2FpdGluZyBvbiBpMmMgZXZlbnRzICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3QgaW93YWl0OwkvKiBXYWl0aW5nIG9uIGZyYW1lIGRhdGEgKi8KLX07Ci0KLS8qCi0gKiBTdGF0dXMgZmxhZ3MuICBBbHdheXMgbWFuaXB1bGF0ZWQgd2l0aCBiaXQgb3BlcmF0aW9ucy4KLSAqLwotI2RlZmluZSBDRl9CVUYwX1ZBTElECSAwCS8qIEJ1ZmZlcnMgdmFsaWQgLSBmaXJzdCB0aHJlZSAqLwotI2RlZmluZSBDRl9CVUYxX1ZBTElECSAxCi0jZGVmaW5lIENGX0JVRjJfVkFMSUQJIDIKLSNkZWZpbmUgQ0ZfRE1BX0FDVElWRQkgMwkvKiBBIGZyYW1lIGlzIGluY29taW5nICovCi0jZGVmaW5lIENGX0NPTkZJR19ORUVERUQgNAkvKiBNdXN0IGNvbmZpZ3VyZSBoYXJkd2FyZSAqLwotCi0jZGVmaW5lIHNlbnNvcl9jYWxsKGNhbSwgbywgZiwgYXJncy4uLikgXAotCXY0bDJfc3ViZGV2X2NhbGwoY2FtLT5zZW5zb3IsIG8sIGYsICMjYXJncykKLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgY2FmZV9jYW1lcmEgKnRvX2NhbShzdHJ1Y3QgdjRsMl9kZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNhZmVfY2FtZXJhLCB2NGwyX2Rldik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgY2FmZV9mb3JtYXRfc3RydWN0IHsKLQlfX3U4ICpkZXNjOwotCV9fdTMyIHBpeGVsZm9ybWF0OwotCWludCBicHA7ICAgLyogQnl0ZXMgcGVyIHBpeGVsICovCi0JZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlIG1idXNfY29kZTsKLX0gY2FmZV9mb3JtYXRzW10gPSB7Ci0JewotCQkuZGVzYwkJPSAiWVVZViA0OjI6MiIsCi0JCS5waXhlbGZvcm1hdAk9IFY0TDJfUElYX0ZNVF9ZVVlWLAotCQkubWJ1c19jb2RlCT0gVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDgsCi0JCS5icHAJCT0gMiwKLQl9LAotCXsKLQkJLmRlc2MJCT0gIlJHQiA0NDQiLAotCQkucGl4ZWxmb3JtYXQJPSBWNEwyX1BJWF9GTVRfUkdCNDQ0LAotCQkubWJ1c19jb2RlCT0gVjRMMl9NQlVTX0ZNVF9SR0I0NDRfMlg4X1BBREhJX0xFLAotCQkuYnBwCQk9IDIsCi0JfSwKLQl7Ci0JCS5kZXNjCQk9ICJSR0IgNTY1IiwKLQkJLnBpeGVsZm9ybWF0CT0gVjRMMl9QSVhfRk1UX1JHQjU2NSwKLQkJLm1idXNfY29kZQk9IFY0TDJfTUJVU19GTVRfUkdCNTY1XzJYOF9MRSwKLQkJLmJwcAkJPSAyLAotCX0sCi0JewotCQkuZGVzYwkJPSAiUmF3IFJHQiBCYXllciIsCi0JCS5waXhlbGZvcm1hdAk9IFY0TDJfUElYX0ZNVF9TQkdHUjgsCi0JCS5tYnVzX2NvZGUJPSBWNEwyX01CVVNfRk1UX1NCR0dSOF8xWDgsCi0JCS5icHAJCT0gMQotCX0sCi19OwotI2RlZmluZSBOX0NBRkVfRk1UUyBBUlJBWV9TSVpFKGNhZmVfZm9ybWF0cykKLQotc3RhdGljIHN0cnVjdCBjYWZlX2Zvcm1hdF9zdHJ1Y3QgKmNhZmVfZmluZF9mb3JtYXQodTMyIHBpeGVsZm9ybWF0KQotewotCXVuc2lnbmVkIGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTl9DQUZFX0ZNVFM7IGkrKykKLQkJaWYgKGNhZmVfZm9ybWF0c1tpXS5waXhlbGZvcm1hdCA9PSBwaXhlbGZvcm1hdCkKLQkJCXJldHVybiBjYWZlX2Zvcm1hdHMgKyBpOwotCS8qIE5vdCBmb3VuZD8gVGhlbiByZXR1cm4gdGhlIGZpcnN0IGZvcm1hdC4gKi8KLQlyZXR1cm4gY2FmZV9mb3JtYXRzOwotfQotCi0vKgotICogU3RhcnQgb3ZlciB3aXRoIERNQSBidWZmZXJzIC0gZGV2X2xvY2sgbmVlZGVkLgotICovCi1zdGF0aWMgdm9pZCBjYWZlX3Jlc2V0X2J1ZmZlcnMoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCi17Ci0JaW50IGk7Ci0KLQljYW0tPm5leHRfYnVmID0gLTE7Ci0JZm9yIChpID0gMDsgaSA8IGNhbS0+bmJ1ZnM7IGkrKykKLQkJY2xlYXJfYml0KGksICZjYW0tPmZsYWdzKTsKLQljYW0tPnNwZWNmcmFtZXMgPSAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBjYWZlX25lZWRzX2NvbmZpZyhzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKLXsKLQlyZXR1cm4gdGVzdF9iaXQoQ0ZfQ09ORklHX05FRURFRCwgJmNhbS0+ZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBjYWZlX3NldF9jb25maWdfbmVlZGVkKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtLCBpbnQgbmVlZGVkKQotewotCWlmIChuZWVkZWQpCi0JCXNldF9iaXQoQ0ZfQ09ORklHX05FRURFRCwgJmNhbS0+ZmxhZ3MpOwotCWVsc2UKLQkJY2xlYXJfYml0KENGX0NPTkZJR19ORUVERUQsICZjYW0tPmZsYWdzKTsKLX0KLQotCi0KLQotLyoKLSAqIERlYnVnZ2luZyBhbmQgcmVsYXRlZC4KLSAqLwotI2RlZmluZSBjYW1fZXJyKGNhbSwgZm10LCBhcmcuLi4pIFwKLQlkZXZfZXJyKCYoY2FtKS0+cGRldi0+ZGV2LCBmbXQsICMjYXJnKTsKLSNkZWZpbmUgY2FtX3dhcm4oY2FtLCBmbXQsIGFyZy4uLikgXAotCWRldl93YXJuKCYoY2FtKS0+cGRldi0+ZGV2LCBmbXQsICMjYXJnKTsKLSNkZWZpbmUgY2FtX2RiZyhjYW0sIGZtdCwgYXJnLi4uKSBcCi0JZGV2X2RiZygmKGNhbSktPnBkZXYtPmRldiwgZm10LCAjI2FyZyk7Ci0KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyoKLSAqIERldmljZSByZWdpc3RlciBJL08KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIGNhZmVfcmVnX3dyaXRlKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtLCB1bnNpZ25lZCBpbnQgcmVnLAotCQl1bnNpZ25lZCBpbnQgdmFsKQotewotCWlvd3JpdGUzMih2YWwsIGNhbS0+cmVncyArIHJlZyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNhZmVfcmVnX3JlYWQoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0sCi0JCXVuc2lnbmVkIGludCByZWcpCi17Ci0JcmV0dXJuIGlvcmVhZDMyKGNhbS0+cmVncyArIHJlZyk7Ci19Ci0KLQotc3RhdGljIGlubGluZSB2b2lkIGNhZmVfcmVnX3dyaXRlX21hc2soc3RydWN0IGNhZmVfY2FtZXJhICpjYW0sIHVuc2lnbmVkIGludCByZWcsCi0JCXVuc2lnbmVkIGludCB2YWwsIHVuc2lnbmVkIGludCBtYXNrKQotewotCXVuc2lnbmVkIGludCB2ID0gY2FmZV9yZWdfcmVhZChjYW0sIHJlZyk7Ci0KLQl2ID0gKHYgJiB+bWFzaykgfCAodmFsICYgbWFzayk7Ci0JY2FmZV9yZWdfd3JpdGUoY2FtLCByZWcsIHYpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgY2FmZV9yZWdfY2xlYXJfYml0KHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtLAotCQl1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsKQotewotCWNhZmVfcmVnX3dyaXRlX21hc2soY2FtLCByZWcsIDAsIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjYWZlX3JlZ19zZXRfYml0KHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtLAotCQl1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsKQotewotCWNhZmVfcmVnX3dyaXRlX21hc2soY2FtLCByZWcsIHZhbCwgdmFsKTsKLX0KLQotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgotICogVGhlIEkyQy9TTUJVUyBpbnRlcmZhY2UgdG8gdGhlIGNhbWVyYSBpdHNlbGYgc3RhcnRzIGhlcmUuICBUaGUKLSAqIGNvbnRyb2xsZXIgaGFuZGxlcyBTTUJVUyBpdHNlbGYsIHByZXNlbnRpbmcgYSByZWxhdGl2ZWx5IHNpbXBsZSByZWdpc3RlcgotICogaW50ZXJmYWNlOyBhbGwgd2UgaGF2ZSB0byBkbyBpcyB0byB0ZWxsIGl0IHdoZXJlIHRvIHJvdXRlIHRoZSBkYXRhLgotICovCi0jZGVmaW5lIENBRkVfU01CVVNfVElNRU9VVCAoSFopICAvKiBnZW5lcm91cyAqLwotCi1zdGF0aWMgaW50IGNhZmVfc21idXNfd3JpdGVfZG9uZShzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBjMTsKLQotCS8qCi0JICogV2UgbXVzdCBkZWxheSBhZnRlciB0aGUgaW50ZXJydXB0LCBvciB0aGUgY29udHJvbGxlciBnZXRzIGNvbmZ1c2VkCi0JICogYW5kIG5ldmVyIGRvZXMgZ2l2ZSB1cyBnb29kIHN0YXR1cy4gIEZvcnR1bmF0ZWx5LCB3ZSBkb24ndCBkbyB0aGlzCi0JICogb2Z0ZW4uCi0JICovCi0JdWRlbGF5KDIwKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCWMxID0gY2FmZV9yZWdfcmVhZChjYW0sIFJFR19UV1NJQzEpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gKGMxICYgKFRXU0lDMV9XU1RBVHxUV1NJQzFfRVJST1IpKSAhPSBUV1NJQzFfV1NUQVQ7Ci19Ci0KLXN0YXRpYyBpbnQgY2FmZV9zbWJ1c193cml0ZV9kYXRhKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtLAotCQl1MTYgYWRkciwgdTggY29tbWFuZCwgdTggdmFsdWUpCi17Ci0JdW5zaWduZWQgaW50IHJ2YWw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0JcnZhbCA9IFRXU0lDMF9FTiB8ICgoYWRkciA8PCBUV1NJQzBfU0lEX1NISUZUKSAmIFRXU0lDMF9TSUQpOwotCXJ2YWwgfD0gVFdTSUMwX09WTUFHSUM7ICAvKiBNYWtlIE9WIHNlbnNvcnMgd29yayAqLwotCS8qCi0JICogTWFydmVsbCBzZXogc2V0IGNsa2RpdiB0byBhbGwgMSdzIGZvciBub3cuCi0JICovCi0JcnZhbCB8PSBUV1NJQzBfQ0xLRElWOwotCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX1RXU0lDMCwgcnZhbCk7Ci0JKHZvaWQpIGNhZmVfcmVnX3JlYWQoY2FtLCBSRUdfVFdTSUMxKTsgLyogZm9yY2Ugd3JpdGUgKi8KLQlydmFsID0gdmFsdWUgfCAoKGNvbW1hbmQgPDwgVFdTSUMxX0FERFJfU0hJRlQpICYgVFdTSUMxX0FERFIpOwotCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX1RXU0lDMSwgcnZhbCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCi0JLyogVW5mb3J0dW5hdGVseSwgcmVhZGluZyBUV1NJQzEgdG9vIHNvb24gYWZ0ZXIgc2VuZGluZyBhIGNvbW1hbmQKLQkgKiBjYXVzZXMgdGhlIGRldmljZSB0byBkaWUuCi0JICogVXNlIGEgYnVzeS13YWl0IGJlY2F1c2Ugd2Ugb2Z0ZW4gc2VuZCBhIGxhcmdlIHF1YW50aXR5IG9mIHNtYWxsCi0JICogY29tbWFuZHMgYXQtb25jZTsgdXNpbmcgbXNsZWVwKCkgd291bGQgY2F1c2UgYSBsb3Qgb2YgY29udGV4dAotCSAqIHN3aXRjaGVzIHdoaWNoIHRha2UgbG9uZ2VyIHRoYW4gMm1zLCByZXN1bHRpbmcgaW4gYSBub3RpY2VhYmxlCi0JICogYm9vdC10aW1lIGFuZCBjYXB0dXJlLXN0YXJ0IGRlbGF5cy4KLQkgKi8KLQltZGVsYXkoMik7Ci0KLQkvKgotCSAqIEFub3RoZXIgc2FkIGZhY3QgaXMgdGhhdCBzb21ldGltZXMsIGNvbW1hbmRzIHNpbGVudGx5IGNvbXBsZXRlIGJ1dAotCSAqIGNhZmVfc21idXNfd3JpdGVfZG9uZSgpIG5ldmVyIGJlY29tZXMgYXdhcmUgb2YgdGhpcy4KLQkgKiBUaGlzIGhhcHBlbnMgYXQgcmFuZG9tIGFuZCBhcHBlYXJzIHRvIHBvc3NpYmxlIG9jY3VyIHdpdGggYW55Ci0JICogY29tbWFuZC4KLQkgKiBXZSBkb24ndCB1bmRlcnN0YW5kIHdoeSB0aGlzIGlzLiBXZSB3b3JrIGFyb3VuZCB0aGlzIGlzc3VlCi0JICogd2l0aCB0aGUgdGltZW91dCBpbiB0aGUgd2FpdCBiZWxvdywgYXNzdW1pbmcgdGhhdCBhbGwgY29tbWFuZHMKLQkgKiBjb21wbGV0ZSB3aXRoaW4gdGhlIHRpbWVvdXQuCi0JICovCi0Jd2FpdF9ldmVudF90aW1lb3V0KGNhbS0+c21idXNfd2FpdCwgY2FmZV9zbWJ1c193cml0ZV9kb25lKGNhbSksCi0JCQlDQUZFX1NNQlVTX1RJTUVPVVQpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQlydmFsID0gY2FmZV9yZWdfcmVhZChjYW0sIFJFR19UV1NJQzEpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQotCWlmIChydmFsICYgVFdTSUMxX1dTVEFUKSB7Ci0JCWNhbV9lcnIoY2FtLCAiU01CVVMgd3JpdGUgKCUwMngvJTAyeC8lMDJ4KSB0aW1lZCBvdXRcbiIsIGFkZHIsCi0JCQkJY29tbWFuZCwgdmFsdWUpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0JaWYgKHJ2YWwgJiBUV1NJQzFfRVJST1IpIHsKLQkJY2FtX2VycihjYW0sICJTTUJVUyB3cml0ZSAoJTAyeC8lMDJ4LyUwMngpIGVycm9yXG4iLCBhZGRyLAotCQkJCWNvbW1hbmQsIHZhbHVlKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCXJldHVybiAwOwotfQotCi0KLQotc3RhdGljIGludCBjYWZlX3NtYnVzX3JlYWRfZG9uZShzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBjMTsKLQotCS8qCi0JICogV2UgbXVzdCBkZWxheSBhZnRlciB0aGUgaW50ZXJydXB0LCBvciB0aGUgY29udHJvbGxlciBnZXRzIGNvbmZ1c2VkCi0JICogYW5kIG5ldmVyIGRvZXMgZ2l2ZSB1cyBnb29kIHN0YXR1cy4gIEZvcnR1bmF0ZWx5LCB3ZSBkb24ndCBkbyB0aGlzCi0JICogb2Z0ZW4uCi0JICovCi0JdWRlbGF5KDIwKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCWMxID0gY2FmZV9yZWdfcmVhZChjYW0sIFJFR19UV1NJQzEpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gYzEgJiAoVFdTSUMxX1JWQUxJRHxUV1NJQzFfRVJST1IpOwotfQotCi0KLQotc3RhdGljIGludCBjYWZlX3NtYnVzX3JlYWRfZGF0YShzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSwKLQkJdTE2IGFkZHIsIHU4IGNvbW1hbmQsIHU4ICp2YWx1ZSkKLXsKLQl1bnNpZ25lZCBpbnQgcnZhbDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQlydmFsID0gVFdTSUMwX0VOIHwgKChhZGRyIDw8IFRXU0lDMF9TSURfU0hJRlQpICYgVFdTSUMwX1NJRCk7Ci0JcnZhbCB8PSBUV1NJQzBfT1ZNQUdJQzsgLyogTWFrZSBPViBzZW5zb3JzIHdvcmsgKi8KLQkvKgotCSAqIE1hcnZlbCBzZXogc2V0IGNsa2RpdiB0byBhbGwgMSdzIGZvciBub3cuCi0JICovCi0JcnZhbCB8PSBUV1NJQzBfQ0xLRElWOwotCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX1RXU0lDMCwgcnZhbCk7Ci0JKHZvaWQpIGNhZmVfcmVnX3JlYWQoY2FtLCBSRUdfVFdTSUMxKTsgLyogZm9yY2Ugd3JpdGUgKi8KLQlydmFsID0gVFdTSUMxX1JFQUQgfCAoKGNvbW1hbmQgPDwgVFdTSUMxX0FERFJfU0hJRlQpICYgVFdTSUMxX0FERFIpOwotCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX1RXU0lDMSwgcnZhbCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCi0Jd2FpdF9ldmVudF90aW1lb3V0KGNhbS0+c21idXNfd2FpdCwKLQkJCWNhZmVfc21idXNfcmVhZF9kb25lKGNhbSksIENBRkVfU01CVVNfVElNRU9VVCk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQlydmFsID0gY2FmZV9yZWdfcmVhZChjYW0sIFJFR19UV1NJQzEpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQotCWlmIChydmFsICYgVFdTSUMxX0VSUk9SKSB7Ci0JCWNhbV9lcnIoY2FtLCAiU01CVVMgcmVhZCAoJTAyeC8lMDJ4KSBlcnJvclxuIiwgYWRkciwgY29tbWFuZCk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQlpZiAoISAocnZhbCAmIFRXU0lDMV9SVkFMSUQpKSB7Ci0JCWNhbV9lcnIoY2FtLCAiU01CVVMgcmVhZCAoJTAyeC8lMDJ4KSB0aW1lZCBvdXRcbiIsIGFkZHIsCi0JCQkJY29tbWFuZCk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQkqdmFsdWUgPSBydmFsICYgMHhmZjsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFBlcmZvcm0gYSB0cmFuc2ZlciBvdmVyIFNNQlVTLiAgVGhpcyB0aGluZyBpcyBjYWxsZWQgdW5kZXIKLSAqIHRoZSBpMmMgYnVzIGxvY2ssIHNvIHdlIHNob3VsZG4ndCByYWNlIHdpdGggb3Vyc2VsdmVzLi4uCi0gKi8KLXN0YXRpYyBpbnQgY2FmZV9zbWJ1c194ZmVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgdTE2IGFkZHIsCi0JCXVuc2lnbmVkIHNob3J0IGZsYWdzLCBjaGFyIHJ3LCB1OCBjb21tYW5kLAotCQlpbnQgc2l6ZSwgdW5pb24gaTJjX3NtYnVzX2RhdGEgKmRhdGEpCi17Ci0Jc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldiA9IGkyY19nZXRfYWRhcGRhdGEoYWRhcHRlcik7Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSB0b19jYW0odjRsMl9kZXYpOwotCWludCByZXQgPSAtRUlOVkFMOwotCi0JLyoKLQkgKiBUaGlzIGludGVyZmFjZSB3b3VsZCBhcHBlYXIgdG8gb25seSBkbyBieXRlIGRhdGEgb3BzLiAgT0sKLQkgKiBpdCBjYW4gZG8gd29yZCB0b28sIGJ1dCB0aGUgY2FtIGNoaXAgaGFzIG5vIHVzZSBmb3IgdGhhdC4KLQkgKi8KLQlpZiAoc2l6ZSAhPSBJMkNfU01CVVNfQllURV9EQVRBKSB7Ci0JCWNhbV9lcnIoY2FtLCAiZnVua3kgeGZlciBzaXplICVkXG4iLCBzaXplKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHJ3ID09IEkyQ19TTUJVU19XUklURSkKLQkJcmV0ID0gY2FmZV9zbWJ1c193cml0ZV9kYXRhKGNhbSwgYWRkciwgY29tbWFuZCwgZGF0YS0+Ynl0ZSk7Ci0JZWxzZSBpZiAocncgPT0gSTJDX1NNQlVTX1JFQUQpCi0JCXJldCA9IGNhZmVfc21idXNfcmVhZF9kYXRhKGNhbSwgYWRkciwgY29tbWFuZCwgJmRhdGEtPmJ5dGUpOwotCXJldHVybiByZXQ7Ci19Ci0KLQotc3RhdGljIHZvaWQgY2FmZV9zbWJ1c19lbmFibGVfaXJxKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCWNhZmVfcmVnX3NldF9iaXQoY2FtLCBSRUdfSVJRTUFTSywgVFdTSUlSUVMpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHUzMiBjYWZlX3NtYnVzX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQotewotCXJldHVybiBJMkNfRlVOQ19TTUJVU19SRUFEX0JZVEVfREFUQSAgfAotCSAgICAgICBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFX0RBVEE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBjYWZlX3NtYnVzX2FsZ28gPSB7Ci0JLnNtYnVzX3hmZXIgPSBjYWZlX3NtYnVzX3hmZXIsCi0JLmZ1bmN0aW9uYWxpdHkgPSBjYWZlX3NtYnVzX2Z1bmMKLX07Ci0KLS8qIFNvbWVib2R5IGlzIG9uIHRoZSBidXMgKi8KLXN0YXRpYyB2b2lkIGNhZmVfY3Rscl9zdG9wX2RtYShzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSk7Ci1zdGF0aWMgdm9pZCBjYWZlX2N0bHJfcG93ZXJfZG93bihzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSk7Ci0KLXN0YXRpYyBpbnQgY2FmZV9zbWJ1c19zZXR1cChzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKLXsKLQlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXAgPSAmY2FtLT5pMmNfYWRhcHRlcjsKLQlpbnQgcmV0OwotCi0JY2FmZV9zbWJ1c19lbmFibGVfaXJxKGNhbSk7Ci0JYWRhcC0+b3duZXIgPSBUSElTX01PRFVMRTsKLQlhZGFwLT5hbGdvID0gJmNhZmVfc21idXNfYWxnbzsKLQlzdHJjcHkoYWRhcC0+bmFtZSwgImNhZmVfY2NpYyIpOwotCWFkYXAtPmRldi5wYXJlbnQgPSAmY2FtLT5wZGV2LT5kZXY7Ci0JaTJjX3NldF9hZGFwZGF0YShhZGFwLCAmY2FtLT52NGwyX2Rldik7Ci0JcmV0ID0gaTJjX2FkZF9hZGFwdGVyKGFkYXApOwotCWlmIChyZXQpCi0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIHJlZ2lzdGVyIGNhZmUgaTJjIGFkYXB0ZXJcbiIpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGNhZmVfc21idXNfc2h1dGRvd24oc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCi17Ci0JaTJjX2RlbF9hZGFwdGVyKCZjYW0tPmkyY19hZGFwdGVyKTsKLX0KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgotICogRGVhbCB3aXRoIHRoZSBjb250cm9sbGVyLgotICovCi0KLS8qCi0gKiBEbyBldmVyeXRoaW5nIHdlIHRoaW5rIHdlIG5lZWQgdG8gaGF2ZSB0aGUgaW50ZXJmYWNlIG9wZXJhdGluZwotICogYWNjb3JkaW5nIHRvIHRoZSBkZXNpcmVkIGZvcm1hdC4KLSAqLwotc3RhdGljIHZvaWQgY2FmZV9jdGxyX2RtYShzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKLXsKLQkvKgotCSAqIFN0b3JlIHRoZSBmaXJzdCB0d28gWSBidWZmZXJzICh3ZSBhcmVuJ3Qgc3VwcG9ydGluZwotCSAqIHBsYW5hciBmb3JtYXRzIGZvciBub3csIHNvIG5vIFVWIGJ1ZnMpLiAgVGhlbiBlaXRoZXIKLQkgKiBzZXQgdGhlIHRoaXJkIGlmIGl0IGV4aXN0cywgb3IgdGVsbCB0aGUgY29udHJvbGxlcgotCSAqIHRvIGp1c3QgdXNlIHR3by4KLQkgKi8KLQljYWZlX3JlZ193cml0ZShjYW0sIFJFR19ZMEJBUiwgY2FtLT5kbWFfaGFuZGxlc1swXSk7Ci0JY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfWTFCQVIsIGNhbS0+ZG1hX2hhbmRsZXNbMV0pOwotCWlmIChjYW0tPm5idWZzID4gMikgewotCQljYWZlX3JlZ193cml0ZShjYW0sIFJFR19ZMkJBUiwgY2FtLT5kbWFfaGFuZGxlc1syXSk7Ci0JCWNhZmVfcmVnX2NsZWFyX2JpdChjYW0sIFJFR19DVFJMMSwgQzFfVFdPQlVGUyk7Ci0JfQotCWVsc2UKLQkJY2FmZV9yZWdfc2V0X2JpdChjYW0sIFJFR19DVFJMMSwgQzFfVFdPQlVGUyk7Ci0JY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfVUJBUiwgMCk7IC8qIDMyIGJpdHMgb25seSBmb3Igbm93ICovCi19Ci0KLXN0YXRpYyB2b2lkIGNhZmVfY3Rscl9pbWFnZShzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKLXsKLQlpbnQgaW1nc3o7Ci0Jc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqZm10ID0gJmNhbS0+cGl4X2Zvcm1hdDsKLQotCWltZ3N6ID0gKChmbXQtPmhlaWdodCA8PCBJTUdTWl9WX1NISUZUKSAmIElNR1NaX1ZfTUFTSykgfAotCQkoZm10LT5ieXRlc3BlcmxpbmUgJiBJTUdTWl9IX01BU0spOwotCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX0lNR1NJWkUsIGltZ3N6KTsKLQljYWZlX3JlZ193cml0ZShjYW0sIFJFR19JTUdPRkZTRVQsIDApOwotCS8qIFlQSVRDSCBqdXN0IGRyb3BzIHRoZSBsYXN0IHR3byBiaXRzICovCi0JY2FmZV9yZWdfd3JpdGVfbWFzayhjYW0sIFJFR19JTUdQSVRDSCwgZm10LT5ieXRlc3BlcmxpbmUsCi0JCQlJTUdQX1lQX01BU0spOwotCS8qCi0JICogVGVsbCB0aGUgY29udHJvbGxlciBhYm91dCB0aGUgaW1hZ2UgZm9ybWF0IHdlIGFyZSB1c2luZy4KLQkgKi8KLQlzd2l0Y2ggKGNhbS0+cGl4X2Zvcm1hdC5waXhlbGZvcm1hdCkgewotCWNhc2UgVjRMMl9QSVhfRk1UX1lVWVY6Ci0JICAgIGNhZmVfcmVnX3dyaXRlX21hc2soY2FtLCBSRUdfQ1RSTDAsCi0JCQkgICAgQzBfREZfWVVWfEMwX1lVVl9QQUNLRUR8QzBfWVVWRV9ZVVlWLAotCQkJICAgIEMwX0RGX01BU0spOwotCSAgICBicmVhazsKLQotCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjQ0NDoKLQkgICAgY2FmZV9yZWdfd3JpdGVfbWFzayhjYW0sIFJFR19DVFJMMCwKLQkJCSAgICBDMF9ERl9SR0J8QzBfUkdCRl80NDR8QzBfUkdCNF9YUkdCLAotCQkJICAgIEMwX0RGX01BU0spOwotCQkvKiBBbHBoYSB2YWx1ZT8gKi8KLQkgICAgYnJlYWs7Ci0KLQljYXNlIFY0TDJfUElYX0ZNVF9SR0I1NjU6Ci0JICAgIGNhZmVfcmVnX3dyaXRlX21hc2soY2FtLCBSRUdfQ1RSTDAsCi0JCQkgICAgQzBfREZfUkdCfEMwX1JHQkZfNTY1fEMwX1JHQjVfQkdHUiwKLQkJCSAgICBDMF9ERl9NQVNLKTsKLQkgICAgYnJlYWs7Ci0KLQlkZWZhdWx0OgotCSAgICBjYW1fZXJyKGNhbSwgIlVua25vd24gZm9ybWF0ICV4XG4iLCBjYW0tPnBpeF9mb3JtYXQucGl4ZWxmb3JtYXQpOwotCSAgICBicmVhazsKLQl9Ci0JLyoKLQkgKiBNYWtlIHN1cmUgaXQga25vd3Mgd2Ugd2FudCB0byB1c2UgaHN5bmMvdnN5bmMuCi0JICovCi0JY2FmZV9yZWdfd3JpdGVfbWFzayhjYW0sIFJFR19DVFJMMCwgQzBfU0lGX0hWU1lOQywKLQkJCUMwX1NJRk1fTUFTSyk7Ci19Ci0KLQotLyoKLSAqIENvbmZpZ3VyZSB0aGUgY29udHJvbGxlciBmb3Igb3BlcmF0aW9uOyBjYWxsZXIgaG9sZHMgdGhlCi0gKiBkZXZpY2UgbXV0ZXguCi0gKi8KLXN0YXRpYyBpbnQgY2FmZV9jdGxyX2NvbmZpZ3VyZShzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQljYWZlX2N0bHJfZG1hKGNhbSk7Ci0JY2FmZV9jdGxyX2ltYWdlKGNhbSk7Ci0JY2FmZV9zZXRfY29uZmlnX25lZWRlZChjYW0sIDApOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgY2FmZV9jdGxyX2lycV9lbmFibGUoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCi17Ci0JLyoKLQkgKiBDbGVhciBhbnkgcGVuZGluZyBpbnRlcnJ1cHRzLCBzaW5jZSB3ZSBkbyBub3QKLQkgKiBleHBlY3QgdG8gaGF2ZSBJL08gYWN0aXZlIHByaW9yIHRvIGVuYWJsaW5nLgotCSAqLwotCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX0lSUVNUQVQsIEZSQU1FSVJRUyk7Ci0JY2FmZV9yZWdfc2V0X2JpdChjYW0sIFJFR19JUlFNQVNLLCBGUkFNRUlSUVMpOwotfQotCi1zdGF0aWMgdm9pZCBjYWZlX2N0bHJfaXJxX2Rpc2FibGUoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCi17Ci0JY2FmZV9yZWdfY2xlYXJfYml0KGNhbSwgUkVHX0lSUU1BU0ssIEZSQU1FSVJRUyk7Ci19Ci0KLS8qCi0gKiBNYWtlIHRoZSBjb250cm9sbGVyIHN0YXJ0IGdyYWJiaW5nIGltYWdlcy4gIEV2ZXJ5dGhpbmcgbXVzdAotICogYmUgc2V0IHVwIGJlZm9yZSBkb2luZyB0aGlzLgotICovCi1zdGF0aWMgdm9pZCBjYWZlX2N0bHJfc3RhcnQoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCi17Ci0JLyogc2V0X2JpdCBwZXJmb3JtcyBhIHJlYWQsIHNvIG5vIG90aGVyIGJhcnJpZXIgc2hvdWxkIGJlCi0JICAgbmVlZGVkIGhlcmUgKi8KLQljYWZlX3JlZ19zZXRfYml0KGNhbSwgUkVHX0NUUkwwLCBDMF9FTkFCTEUpOwotfQotCi1zdGF0aWMgdm9pZCBjYWZlX2N0bHJfc3RvcChzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKLXsKLQljYWZlX3JlZ19jbGVhcl9iaXQoY2FtLCBSRUdfQ1RSTDAsIEMwX0VOQUJMRSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNhZmVfY3Rscl9pbml0KHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCS8qCi0JICogQWRkZWQgbWFnaWMgdG8gYnJpbmcgdXAgdGhlIGhhcmR3YXJlIG9uIHRoZSBCLVRlc3QgYm9hcmQKLQkgKi8KLQljYWZlX3JlZ193cml0ZShjYW0sIDB4MzAzOCwgMHg4KTsKLQljYWZlX3JlZ193cml0ZShjYW0sIDB4MzE1YywgMHg4MDAwOCk7Ci0JLyoKLQkgKiBHbyB0aHJvdWdoIHRoZSBkYW5jZSBuZWVkZWQgdG8gd2FrZSB0aGUgZGV2aWNlIHVwLgotCSAqIE5vdGUgdGhhdCB0aGVzZSByZWdpc3RlcnMgYXJlIGdsb2JhbCBhbmQgc2hhcmVkCi0JICogd2l0aCB0aGUgTkFORCBhbmQgU0QgZGV2aWNlcy4gIEludGVyYWN0aW9uIGJldHdlZW4gdGhlCi0JICogdGhyZWUgc3RpbGwgbmVlZHMgdG8gYmUgZXhhbWluZWQuCi0JICovCi0JY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfR0xfQ1NSLCBHQ1NSX1NSU3xHQ1NSX01SUyk7IC8qIE5lZWRlZD8gKi8KLQljYWZlX3JlZ193cml0ZShjYW0sIFJFR19HTF9DU1IsIEdDU1JfU1JDfEdDU1JfTVJDKTsKLQljYWZlX3JlZ193cml0ZShjYW0sIFJFR19HTF9DU1IsIEdDU1JfU1JDfEdDU1JfTVJTKTsKLQkvKgotCSAqIEhlcmUgd2UgbXVzdCB3YWl0IGEgYml0IGZvciB0aGUgY29udHJvbGxlciB0byBjb21lIGFyb3VuZC4KLQkgKi8KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0JbXNsZWVwKDUpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0KLQljYWZlX3JlZ193cml0ZShjYW0sIFJFR19HTF9DU1IsIEdDU1JfQ0NJQ19FTnxHQ1NSX1NSQ3xHQ1NSX01SQyk7Ci0JY2FmZV9yZWdfc2V0X2JpdChjYW0sIFJFR19HTF9JTUFTSywgR0lNU0tfQ0NJQ19FTik7Ci0JLyoKLQkgKiBNYWtlIHN1cmUgaXQncyBub3QgcG93ZXJlZCBkb3duLgotCSAqLwotCWNhZmVfcmVnX2NsZWFyX2JpdChjYW0sIFJFR19DVFJMMSwgQzFfUFdSRFdOKTsKLQkvKgotCSAqIFR1cm4gb2ZmIHRoZSBlbmFibGUgYml0LiAgSXQgc3VyZSBzaG91bGQgYmUgb2ZmIGFueXdheSwKLQkgKiBidXQgaXQncyBnb29kIHRvIGJlIHN1cmUuCi0JICovCi0JY2FmZV9yZWdfY2xlYXJfYml0KGNhbSwgUkVHX0NUUkwwLCBDMF9FTkFCTEUpOwotCS8qCi0JICogTWFzayBhbGwgaW50ZXJydXB0cy4KLQkgKi8KLQljYWZlX3JlZ193cml0ZShjYW0sIFJFR19JUlFNQVNLLCAwKTsKLQkvKgotCSAqIENsb2NrIHRoZSBzZW5zb3IgYXBwcm9wcmlhdGVseS4gIENvbnRyb2xsZXIgY2xvY2sgc2hvdWxkCi0JICogYmUgNDhNSHosIHNlbnNvciAidHlwaWNhbCIgdmFsdWUgaXMgaGFsZiB0aGF0LgotCSAqLwotCWNhZmVfcmVnX3dyaXRlX21hc2soY2FtLCBSRUdfQ0xLQ1RSTCwgMiwgQ0xLX0RJVl9NQVNLKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci19Ci0KLQotLyoKLSAqIFN0b3AgdGhlIGNvbnRyb2xsZXIsIGFuZCBkb24ndCByZXR1cm4gdW50aWwgd2UncmUgcmVhbGx5IHN1cmUgdGhhdCBubwotICogZnVydGhlciBETUEgaXMgZ29pbmcgb24uCi0gKi8KLXN0YXRpYyB2b2lkIGNhZmVfY3Rscl9zdG9wX2RtYShzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyoKLQkgKiBUaGVvcnk6IHN0b3AgdGhlIGNhbWVyYSBjb250cm9sbGVyICh3aGV0aGVyIGl0IGlzIG9wZXJhdGluZwotCSAqIG9yIG5vdCkuICBEZWxheSBicmllZmx5IGp1c3QgaW4gY2FzZSB3ZSByYWNlIHdpdGggdGhlIFNPRgotCSAqIGludGVycnVwdCwgdGhlbiB3YWl0IHVudGlsIG5vIERNQSBpcyBhY3RpdmUuCi0JICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQljYWZlX2N0bHJfc3RvcChjYW0pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQltZGVsYXkoMSk7Ci0Jd2FpdF9ldmVudF90aW1lb3V0KGNhbS0+aW93YWl0LAotCQkJIXRlc3RfYml0KENGX0RNQV9BQ1RJVkUsICZjYW0tPmZsYWdzKSwgSFopOwotCWlmICh0ZXN0X2JpdChDRl9ETUFfQUNUSVZFLCAmY2FtLT5mbGFncykpCi0JCWNhbV9lcnIoY2FtLCAiVGltZW91dCB3YWl0aW5nIGZvciBETUEgdG8gZW5kXG4iKTsKLQkJLyogVGhpcyB3b3VsZCBiZSBiYWQgbmV3cyAtIHdoYXQgbm93PyAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0JY2FtLT5zdGF0ZSA9IFNfSURMRTsKLQljYWZlX2N0bHJfaXJxX2Rpc2FibGUoY2FtKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci19Ci0KLS8qCi0gKiBQb3dlciB1cCBhbmQgZG93bi4KLSAqLwotc3RhdGljIHZvaWQgY2FmZV9jdGxyX3Bvd2VyX3VwKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCWNhZmVfcmVnX2NsZWFyX2JpdChjYW0sIFJFR19DVFJMMSwgQzFfUFdSRFdOKTsKLQkvKgotCSAqIFBhcnQgb25lIG9mIHRoZSBzZW5zb3IgZGFuY2U6IHR1cm4gdGhlIGdsb2JhbAotCSAqIEdQSU8gc2lnbmFsIG9uLgotCSAqLwotCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX0dMX0ZDUiwgR0ZDUl9HUElPX09OKTsKLQljYWZlX3JlZ193cml0ZShjYW0sIFJFR19HTF9HUElPUiwgR0dQSU9fT1VUfEdHUElPX1ZBTCk7Ci0JLyoKLQkgKiBQdXQgdGhlIHNlbnNvciBpbnRvIG9wZXJhdGlvbmFsIG1vZGUgKGFzc3VtZXMgT0xQQy1zdHlsZQotCSAqIHdpcmluZykuICBDb250cm9sIDAgaXMgcmVzZXQgLSBzZXQgdG8gMSB0byBvcGVyYXRlLgotCSAqIENvbnRyb2wgMSBpcyBwb3dlciBkb3duLCBzZXQgdG8gMCB0byBvcGVyYXRlLgotCSAqLwotCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX0dQUiwgR1BSX0MxRU58R1BSX0MwRU4pOyAvKiBwd3IgdXAsIHJlc2V0ICovCi0vKgltZGVsYXkoMSk7ICovIC8qIE1hcnZlbGwgc2F5cyAxbXMgd2lsbCBkbyBpdCAqLwotCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX0dQUiwgR1BSX0MxRU58R1BSX0MwRU58R1BSX0MwKTsKLS8qCW1kZWxheSgxKTsgKi8gLyogRW5vdWdoPyAqLwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQltc2xlZXAoNSk7IC8qIEp1c3QgdG8gYmUgc3VyZSAqLwotfQotCi1zdGF0aWMgdm9pZCBjYWZlX2N0bHJfcG93ZXJfZG93bihzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQljYWZlX3JlZ193cml0ZShjYW0sIFJFR19HUFIsIEdQUl9DMUVOfEdQUl9DMEVOfEdQUl9DMSk7Ci0JY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfR0xfRkNSLCBHRkNSX0dQSU9fT04pOwotCWNhZmVfcmVnX3dyaXRlKGNhbSwgUkVHX0dMX0dQSU9SLCBHR1BJT19PVVQpOwotCWNhZmVfcmVnX3NldF9iaXQoY2FtLCBSRUdfQ1RSTDEsIEMxX1BXUkRXTik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoKLSAqIENvbW11bmljYXRpb25zIHdpdGggdGhlIHNlbnNvci4KLSAqLwotCi1zdGF0aWMgaW50IF9fY2FmZV9jYW1fcmVzZXQoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCi17Ci0JcmV0dXJuIHNlbnNvcl9jYWxsKGNhbSwgY29yZSwgcmVzZXQsIDApOwotfQotCi0vKgotICogV2UgaGF2ZSBmb3VuZCB0aGUgc2Vuc29yIG9uIHRoZSBpMmMuICBMZXQncyB0cnkgdG8gaGF2ZSBhCi0gKiBjb252ZXJzYXRpb24uCi0gKi8KLXN0YXRpYyBpbnQgY2FmZV9jYW1faW5pdChzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKLXsKLQlzdHJ1Y3QgdjRsMl9kYmdfY2hpcF9pZGVudCBjaGlwOwotCWludCByZXQ7Ci0KLQltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCWlmIChjYW0tPnN0YXRlICE9IFNfTk9UUkVBRFkpCi0JCWNhbV93YXJuKGNhbSwgIkNhbSBpbml0IHdpdGggZGV2aWNlIGluIGZ1bmt5IHN0YXRlICVkIiwKLQkJCQljYW0tPnN0YXRlKTsKLQlyZXQgPSBfX2NhZmVfY2FtX3Jlc2V0KGNhbSk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXQ7Ci0JY2hpcC5pZGVudCA9IFY0TDJfSURFTlRfTk9ORTsKLQljaGlwLm1hdGNoLnR5cGUgPSBWNEwyX0NISVBfTUFUQ0hfSTJDX0FERFI7Ci0JY2hpcC5tYXRjaC5hZGRyID0gY2FtLT5zZW5zb3JfYWRkcjsKLQlyZXQgPSBzZW5zb3JfY2FsbChjYW0sIGNvcmUsIGdfY2hpcF9pZGVudCwgJmNoaXApOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCWNhbS0+c2Vuc29yX3R5cGUgPSBjaGlwLmlkZW50OwotCWlmIChjYW0tPnNlbnNvcl90eXBlICE9IFY0TDJfSURFTlRfT1Y3NjcwKSB7Ci0JCWNhbV9lcnIoY2FtLCAiVW5zdXBwb3J0ZWQgc2Vuc29yIHR5cGUgMHgleCIsIGNhbS0+c2Vuc29yX3R5cGUpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0vKiBHZXQvc2V0IHBhcmFtZXRlcnM/ICovCi0JcmV0ID0gMDsKLQljYW0tPnN0YXRlID0gU19JRExFOwotICBvdXQ6Ci0JY2FmZV9jdGxyX3Bvd2VyX2Rvd24oY2FtKTsKLQltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKLSAqIENvbmZpZ3VyZSB0aGUgc2Vuc29yIHRvIG1hdGNoIHRoZSBwYXJhbWV0ZXJzIHdlIGhhdmUuICBDYWxsZXIgc2hvdWxkCi0gKiBob2xkIHNfbXV0ZXgKLSAqLwotc3RhdGljIGludCBjYWZlX2NhbV9zZXRfZmxpcChzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKLXsKLQlzdHJ1Y3QgdjRsMl9jb250cm9sIGN0cmw7Ci0KLQltZW1zZXQoJmN0cmwsIDAsIHNpemVvZihjdHJsKSk7Ci0JY3RybC5pZCA9IFY0TDJfQ0lEX1ZGTElQOwotCWN0cmwudmFsdWUgPSBmbGlwOwotCXJldHVybiBzZW5zb3JfY2FsbChjYW0sIGNvcmUsIHNfY3RybCwgJmN0cmwpOwotfQotCi0KLXN0YXRpYyBpbnQgY2FmZV9jYW1fY29uZmlndXJlKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQotewotCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgbWJ1c19mbXQ7Ci0JaW50IHJldDsKLQotCXY0bDJfZmlsbF9tYnVzX2Zvcm1hdCgmbWJ1c19mbXQsICZjYW0tPnBpeF9mb3JtYXQsIGNhbS0+bWJ1c19jb2RlKTsKLQlyZXQgPSBzZW5zb3JfY2FsbChjYW0sIGNvcmUsIGluaXQsIDApOwotCWlmIChyZXQgPT0gMCkKLQkJcmV0ID0gc2Vuc29yX2NhbGwoY2FtLCB2aWRlbywgc19tYnVzX2ZtdCwgJm1idXNfZm10KTsKLQkvKgotCSAqIE9WNzY3MCBkb2VzIHdlaXJkIHRoaW5ncyBpZiBmbGlwIGlzIHNldCAqYmVmb3JlKiBmb3JtYXQuLi4KLQkgKi8KLQlyZXQgKz0gY2FmZV9jYW1fc2V0X2ZsaXAoY2FtKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoKLSAqIERNQSBidWZmZXIgbWFuYWdlbWVudC4gIFRoZXNlIGZ1bmN0aW9ucyBuZWVkIHNfbXV0ZXggaGVsZC4KLSAqLwotCi0vKiBGSVhNRTogdGhpcyBpcyBpbmVmZmljaWVudCBhcyBoZWxsLCBzaW5jZSBkbWFfYWxsb2NfY29oZXJlbnQganVzdAotICogZG9lcyBhIGdldF9mcmVlX3BhZ2VzKCkgY2FsbCwgYW5kIHdlIHdhc3RlIGEgZ29vZCBjaHVuayBvZiBhbiBvcmRlck4KLSAqIGFsbG9jYXRpb24uICBTaG91bGQgdHJ5IHRvIGFsbG9jYXRlIHRoZSB3aG9sZSBzZXQgaW4gb25lIGNodW5rLgotICovCi1zdGF0aWMgaW50IGNhZmVfYWxsb2NfZG1hX2J1ZnMoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0sIGludCBsb2FkdGltZSkKLXsKLQlpbnQgaTsKLQotCWNhZmVfc2V0X2NvbmZpZ19uZWVkZWQoY2FtLCAxKTsKLQlpZiAobG9hZHRpbWUpCi0JCWNhbS0+ZG1hX2J1Zl9zaXplID0gZG1hX2J1Zl9zaXplOwotCWVsc2UKLQkJY2FtLT5kbWFfYnVmX3NpemUgPSBjYW0tPnBpeF9mb3JtYXQuc2l6ZWltYWdlOwotCWlmIChuX2RtYV9idWZzID4gMykKLQkJbl9kbWFfYnVmcyA9IDM7Ci0KLQljYW0tPm5idWZzID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgbl9kbWFfYnVmczsgaSsrKSB7Ci0JCWNhbS0+ZG1hX2J1ZnNbaV0gPSBkbWFfYWxsb2NfY29oZXJlbnQoJmNhbS0+cGRldi0+ZGV2LAotCQkJCWNhbS0+ZG1hX2J1Zl9zaXplLCBjYW0tPmRtYV9oYW5kbGVzICsgaSwKLQkJCQlHRlBfS0VSTkVMKTsKLQkJaWYgKGNhbS0+ZG1hX2J1ZnNbaV0gPT0gTlVMTCkgewotCQkJY2FtX3dhcm4oY2FtLCAiRmFpbGVkIHRvIGFsbG9jYXRlIERNQSBidWZmZXJcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJLyogRm9yIGRlYnVnLCByZW1vdmUgZXZlbnR1YWxseSAqLwotCQltZW1zZXQoY2FtLT5kbWFfYnVmc1tpXSwgMHhjYywgY2FtLT5kbWFfYnVmX3NpemUpOwotCQkoY2FtLT5uYnVmcykrKzsKLQl9Ci0KLQlzd2l0Y2ggKGNhbS0+bmJ1ZnMpIHsKLQljYXNlIDE6Ci0JICAgIGRtYV9mcmVlX2NvaGVyZW50KCZjYW0tPnBkZXYtPmRldiwgY2FtLT5kbWFfYnVmX3NpemUsCi0JCQkgICAgY2FtLT5kbWFfYnVmc1swXSwgY2FtLT5kbWFfaGFuZGxlc1swXSk7Ci0JICAgIGNhbS0+bmJ1ZnMgPSAwOwotCWNhc2UgMDoKLQkgICAgY2FtX2VycihjYW0sICJJbnN1ZmZpY2llbnQgRE1BIGJ1ZmZlcnMsIGNhbm5vdCBvcGVyYXRlXG4iKTsKLQkgICAgcmV0dXJuIC1FTk9NRU07Ci0KLQljYXNlIDI6Ci0JICAgIGlmIChuX2RtYV9idWZzID4gMikKLQkJICAgIGNhbV93YXJuKGNhbSwgIldpbGwgbGltcCBhbG9uZyB3aXRoIG9ubHkgMiBidWZmZXJzXG4iKTsKLQkgICAgYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBjYWZlX2ZyZWVfZG1hX2J1ZnMoc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgY2FtLT5uYnVmczsgaSsrKSB7Ci0JCWRtYV9mcmVlX2NvaGVyZW50KCZjYW0tPnBkZXYtPmRldiwgY2FtLT5kbWFfYnVmX3NpemUsCi0JCQkJY2FtLT5kbWFfYnVmc1tpXSwgY2FtLT5kbWFfaGFuZGxlc1tpXSk7Ci0JCWNhbS0+ZG1hX2J1ZnNbaV0gPSBOVUxMOwotCX0KLQljYW0tPm5idWZzID0gMDsKLX0KLQotCi0KLQotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoKLSAqIEhlcmUgc3RhcnRzIHRoZSBWNEwyIGludGVyZmFjZSBjb2RlLgotICovCi0KLS8qCi0gKiBSZWFkIGFuIGltYWdlIGZyb20gdGhlIGRldmljZS4KLSAqLwotc3RhdGljIHNzaXplX3QgY2FmZV9kZWxpdmVyX2J1ZmZlcihzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSwKLQkJY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGxlbiwgbG9mZl90ICpwb3MpCi17Ci0JaW50IGJ1Zm5vOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCWlmIChjYW0tPm5leHRfYnVmIDwgMCkgewotCQljYW1fZXJyKGNhbSwgImRlbGl2ZXJfYnVmZmVyOiBObyBuZXh0IGJ1ZmZlclxuIik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCWJ1Zm5vID0gY2FtLT5uZXh0X2J1ZjsKLQljbGVhcl9iaXQoYnVmbm8sICZjYW0tPmZsYWdzKTsKLQlpZiAoKysoY2FtLT5uZXh0X2J1ZikgPj0gY2FtLT5uYnVmcykKLQkJY2FtLT5uZXh0X2J1ZiA9IDA7Ci0JaWYgKCEgdGVzdF9iaXQoY2FtLT5uZXh0X2J1ZiwgJmNhbS0+ZmxhZ3MpKQotCQljYW0tPm5leHRfYnVmID0gLTE7Ci0JY2FtLT5zcGVjZnJhbWVzID0gMDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0KLQlpZiAobGVuID4gY2FtLT5waXhfZm9ybWF0LnNpemVpbWFnZSkKLQkJbGVuID0gY2FtLT5waXhfZm9ybWF0LnNpemVpbWFnZTsKLQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgY2FtLT5kbWFfYnVmc1tidWZub10sIGxlbikpCi0JCXJldHVybiAtRUZBVUxUOwotCSgqcG9zKSArPSBsZW47Ci0JcmV0dXJuIGxlbjsKLX0KLQotLyoKLSAqIEdldCBldmVyeXRoaW5nIHJlYWR5LCBhbmQgc3RhcnQgZ3JhYmJpbmcgZnJhbWVzLgotICovCi1zdGF0aWMgaW50IGNhZmVfcmVhZF9zZXR1cChzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSwgZW51bSBjYWZlX3N0YXRlIHN0YXRlKQotewotCWludCByZXQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qCi0JICogQ29uZmlndXJhdGlvbi4gIElmIHdlIHN0aWxsIGRvbid0IGhhdmUgRE1BIGJ1ZmZlcnMsCi0JICogbWFrZSBvbmUgbGFzdCwgZGVzcGVyYXRlIGF0dGVtcHQuCi0JICovCi0JaWYgKGNhbS0+bmJ1ZnMgPT0gMCkKLQkJaWYgKGNhZmVfYWxsb2NfZG1hX2J1ZnMoY2FtLCAwKSkKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKGNhZmVfbmVlZHNfY29uZmlnKGNhbSkpIHsKLQkJY2FmZV9jYW1fY29uZmlndXJlKGNhbSk7Ci0JCXJldCA9IGNhZmVfY3Rscl9jb25maWd1cmUoY2FtKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCi0JLyoKLQkgKiBUdXJuIGl0IGxvb3NlLgotCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0JY2FmZV9yZXNldF9idWZmZXJzKGNhbSk7Ci0JY2FmZV9jdGxyX2lycV9lbmFibGUoY2FtKTsKLQljYW0tPnN0YXRlID0gc3RhdGU7Ci0JY2FmZV9jdGxyX3N0YXJ0KGNhbSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBzc2l6ZV90IGNhZmVfdjRsX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsCi0JCWNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBsZW4sIGxvZmZfdCAqcG9zKQotewotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWludCByZXQgPSAwOwotCi0JLyoKLQkgKiBQZXJoYXBzIHdlJ3JlIGluIHNwZWN1bGF0aXZlIHJlYWQgbW9kZSBhbmQgYWxyZWFkeQotCSAqIGhhdmUgZGF0YT8KLQkgKi8KLQltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCWlmIChjYW0tPnN0YXRlID09IFNfU1BFQ1JFQUQpIHsKLQkJaWYgKGNhbS0+bmV4dF9idWYgPj0gMCkgewotCQkJcmV0ID0gY2FmZV9kZWxpdmVyX2J1ZmZlcihjYW0sIGJ1ZmZlciwgbGVuLCBwb3MpOwotCQkJaWYgKHJldCAhPSAwKQotCQkJCWdvdG8gb3V0X3VubG9jazsKLQkJfQotCX0gZWxzZSBpZiAoY2FtLT5zdGF0ZSA9PSBTX0ZMQUtFRCB8fCBjYW0tPnN0YXRlID09IFNfTk9UUkVBRFkpIHsKLQkJcmV0ID0gLUVJTzsKLQkJZ290byBvdXRfdW5sb2NrOwotCX0gZWxzZSBpZiAoY2FtLT5zdGF0ZSAhPSBTX0lETEUpIHsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCi0JLyoKLQkgKiB2NGwyOiBtdWx0aXBsZSBwcm9jZXNzZXMgY2FuIG9wZW4gdGhlIGRldmljZSwgYnV0IG9ubHkKLQkgKiBvbmUgZ2V0cyB0byBncmFiIGRhdGEgZnJvbSBpdC4KLQkgKi8KLQlpZiAoY2FtLT5vd25lciAmJiBjYW0tPm93bmVyICE9IGZpbHApIHsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCWNhbS0+b3duZXIgPSBmaWxwOwotCi0JLyoKLQkgKiBEbyBzZXR1cCBpZiBuZWVkIGJlLgotCSAqLwotCWlmIChjYW0tPnN0YXRlICE9IFNfU1BFQ1JFQUQpIHsKLQkJcmV0ID0gY2FmZV9yZWFkX3NldHVwKGNhbSwgU19TSU5HTEVSRUFEKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gb3V0X3VubG9jazsKLQl9Ci0JLyoKLQkgKiBXYWl0IGZvciBzb21ldGhpbmcgdG8gaGFwcGVuLiAgVGhpcyBzaG91bGQgcHJvYmFibHkKLQkgKiBiZSBpbnRlcnJ1cHRpYmxlIChGSVhNRSkuCi0JICovCi0Jd2FpdF9ldmVudF90aW1lb3V0KGNhbS0+aW93YWl0LCBjYW0tPm5leHRfYnVmID49IDAsIEhaKTsKLQlpZiAoY2FtLT5uZXh0X2J1ZiA8IDApIHsKLQkJY2FtX2VycihjYW0sICJyZWFkKCkgb3BlcmF0aW9uIHRpbWVkIG91dFxuIik7Ci0JCWNhZmVfY3Rscl9zdG9wX2RtYShjYW0pOwotCQlyZXQgPSAtRUlPOwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfQotCS8qCi0JICogR2l2ZSB0aGVtIHRoZWlyIGRhdGEgYW5kIHdlIHNob3VsZCBiZSBkb25lLgotCSAqLwotCXJldCA9IGNhZmVfZGVsaXZlcl9idWZmZXIoY2FtLCBidWZmZXIsIGxlbiwgcG9zKTsKLQotICBvdXRfdW5sb2NrOgotCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotCi0KLQotCi0KLQotCi0KLS8qCi0gKiBTdHJlYW1pbmcgSS9PIHN1cHBvcnQuCi0gKi8KLQotCi0KLXN0YXRpYyBpbnQgY2FmZV92aWRpb2Nfc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCi0JCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlKQotewotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWludCByZXQgPSAtRUlOVkFMOwotCi0JaWYgKHR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQotCQlnb3RvIG91dDsKLQltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCWlmIChjYW0tPnN0YXRlICE9IFNfSURMRSB8fCBjYW0tPm5fc2J1ZnMgPT0gMCkKLQkJZ290byBvdXRfdW5sb2NrOwotCi0JY2FtLT5zZXF1ZW5jZSA9IDA7Ci0JcmV0ID0gY2FmZV9yZWFkX3NldHVwKGNhbSwgU19TVFJFQU1JTkcpOwotCi0gIG91dF91bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOwotICBvdXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgaW50IGNhZmVfdmlkaW9jX3N0cmVhbW9mZihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKLQkJZW51bSB2NGwyX2J1Zl90eXBlIHR5cGUpCi17Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0KLQlpZiAodHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCWdvdG8gb3V0OwotCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7Ci0JaWYgKGNhbS0+c3RhdGUgIT0gU19TVFJFQU1JTkcpCi0JCWdvdG8gb3V0X3VubG9jazsKLQotCWNhZmVfY3Rscl9zdG9wX2RtYShjYW0pOwotCXJldCA9IDA7Ci0KLSAgb3V0X3VubG9jazoKLQltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7Ci0gIG91dDoKLQlyZXR1cm4gcmV0OwotfQotCi0KLQotc3RhdGljIGludCBjYWZlX3NldHVwX3Npb2J1ZihzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSwgaW50IGluZGV4KQotewotCXN0cnVjdCBjYWZlX3Npb19idWZmZXIgKmJ1ZiA9IGNhbS0+c2JfYnVmcyArIGluZGV4OwotCi0JSU5JVF9MSVNUX0hFQUQoJmJ1Zi0+bGlzdCk7Ci0JYnVmLT52NGxidWYubGVuZ3RoID0gUEFHRV9BTElHTihjYW0tPnBpeF9mb3JtYXQuc2l6ZWltYWdlKTsKLQlidWYtPmJ1ZmZlciA9IHZtYWxsb2NfdXNlcihidWYtPnY0bGJ1Zi5sZW5ndGgpOwotCWlmIChidWYtPmJ1ZmZlciA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQlidWYtPm1hcGNvdW50ID0gMDsKLQlidWYtPmNhbSA9IGNhbTsKLQotCWJ1Zi0+djRsYnVmLmluZGV4ID0gaW5kZXg7Ci0JYnVmLT52NGxidWYudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQlidWYtPnY0bGJ1Zi5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKLQlidWYtPnY0bGJ1Zi5tZW1vcnkgPSBWNEwyX01FTU9SWV9NTUFQOwotCS8qCi0JICogT2Zmc2V0OiBtdXN0IGJlIDMyLWJpdCBldmVuIG9uIGEgNjQtYml0IHN5c3RlbS4gIHZpZGVvYnVmLWRtYS1zZwotCSAqIGp1c3QgdXNlcyB0aGUgbGVuZ3RoIHRpbWVzIHRoZSBpbmRleCwgYnV0IHRoZSBzcGVjIHdhcm5zCi0JICogYWdhaW5zdCBkb2luZyBqdXN0IHRoYXQgLSB2bWEgbWVyZ2luZyBwcm9ibGVtcy4gIFNvIHdlCi0JICogbGVhdmUgYSBnYXAgYmV0d2VlbiBlYWNoIHBhaXIgb2YgYnVmZmVycy4KLQkgKi8KLQlidWYtPnY0bGJ1Zi5tLm9mZnNldCA9IDIqaW5kZXgqYnVmLT52NGxidWYubGVuZ3RoOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNhZmVfZnJlZV9zaW9fYnVmZmVycyhzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKLXsKLQlpbnQgaTsKLQotCS8qCi0JICogSWYgYW55IGJ1ZmZlcnMgYXJlIG1hcHBlZCwgd2UgY2Fubm90IGZyZWUgdGhlbSBhdCBhbGwuCi0JICovCi0JZm9yIChpID0gMDsgaSA8IGNhbS0+bl9zYnVmczsgaSsrKQotCQlpZiAoY2FtLT5zYl9idWZzW2ldLm1hcGNvdW50ID4gMCkKLQkJCXJldHVybiAtRUJVU1k7Ci0JLyoKLQkgKiBPSywgbGV0J3MgZG8gaXQuCi0JICovCi0JZm9yIChpID0gMDsgaSA8IGNhbS0+bl9zYnVmczsgaSsrKQotCQl2ZnJlZShjYW0tPnNiX2J1ZnNbaV0uYnVmZmVyKTsKLQljYW0tPm5fc2J1ZnMgPSAwOwotCWtmcmVlKGNhbS0+c2JfYnVmcyk7Ci0JY2FtLT5zYl9idWZzID0gTlVMTDsKLQlJTklUX0xJU1RfSEVBRCgmY2FtLT5zYl9hdmFpbCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmNhbS0+c2JfZnVsbCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotCi1zdGF0aWMgaW50IGNhZmVfdmlkaW9jX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCi0JCXN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpyZXEpCi17Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0JaW50IHJldCA9IDA7ICAvKiBTaWxlbmNlIHdhcm5pbmcgKi8KLQotCS8qCi0JICogTWFrZSBzdXJlIGl0J3Mgc29tZXRoaW5nIHdlIGNhbiBkby4gIFVzZXIgcG9pbnRlcnMgY291bGQgYmUKLQkgKiBpbXBsZW1lbnRlZCB3aXRob3V0IGdyZWF0IHBhaW4sIGJ1dCB0aGF0J3Mgbm90IGJlZW4gZG9uZSB5ZXQuCi0JICovCi0JaWYgKHJlcS0+bWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVApCi0JCXJldHVybiAtRUlOVkFMOwotCS8qCi0JICogSWYgdGhleSBhc2sgZm9yIHplcm8gYnVmZmVycywgdGhleSByZWFsbHkgd2FudCB1cyB0byBzdG9wIHN0cmVhbWluZwotCSAqIChpZiBpdCdzIGhhcHBlbmluZykgYW5kIGZyZWUgZXZlcnl0aGluZy4gIFNob3VsZCB3ZSBjaGVjayBvd25lcj8KLQkgKi8KLQltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCWlmIChyZXEtPmNvdW50ID09IDApIHsKLQkJaWYgKGNhbS0+c3RhdGUgPT0gU19TVFJFQU1JTkcpCi0JCQljYWZlX2N0bHJfc3RvcF9kbWEoY2FtKTsKLQkJcmV0ID0gY2FmZV9mcmVlX3Npb19idWZmZXJzIChjYW0pOwotCQlnb3RvIG91dDsKLQl9Ci0JLyoKLQkgKiBEZXZpY2UgbmVlZHMgdG8gYmUgaWRsZSBhbmQgd29ya2luZy4gIFdlICpjb3VsZCogdHJ5IHRvIGRvIHRoZQotCSAqIHJpZ2h0IHRoaW5nIGluIFNfU1BFQ1JFQUQgYnkgc2h1dHRpbmcgdGhpbmdzIGRvd24sIGJ1dCBpdAotCSAqIHByb2JhYmx5IGRvZXNuJ3QgbWF0dGVyLgotCSAqLwotCWlmIChjYW0tPnN0YXRlICE9IFNfSURMRSB8fCAoY2FtLT5vd25lciAmJiBjYW0tPm93bmVyICE9IGZpbHApKSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBvdXQ7Ci0JfQotCWNhbS0+b3duZXIgPSBmaWxwOwotCi0JaWYgKHJlcS0+Y291bnQgPCBtaW5fYnVmZmVycykKLQkJcmVxLT5jb3VudCA9IG1pbl9idWZmZXJzOwotCWVsc2UgaWYgKHJlcS0+Y291bnQgPiBtYXhfYnVmZmVycykKLQkJcmVxLT5jb3VudCA9IG1heF9idWZmZXJzOwotCWlmIChjYW0tPm5fc2J1ZnMgPiAwKSB7Ci0JCXJldCA9IGNhZmVfZnJlZV9zaW9fYnVmZmVycyhjYW0pOwotCQlpZiAocmV0KQotCQkJZ290byBvdXQ7Ci0JfQotCi0JY2FtLT5zYl9idWZzID0ga3phbGxvYyhyZXEtPmNvdW50KnNpemVvZihzdHJ1Y3QgY2FmZV9zaW9fYnVmZmVyKSwKLQkJCUdGUF9LRVJORUwpOwotCWlmIChjYW0tPnNiX2J1ZnMgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0JZm9yIChjYW0tPm5fc2J1ZnMgPSAwOyBjYW0tPm5fc2J1ZnMgPCByZXEtPmNvdW50OyAoY2FtLT5uX3NidWZzKyspKSB7Ci0JCXJldCA9IGNhZmVfc2V0dXBfc2lvYnVmKGNhbSwgY2FtLT5uX3NidWZzKTsKLQkJaWYgKHJldCkKLQkJCWJyZWFrOwotCX0KLQotCWlmIChjYW0tPm5fc2J1ZnMgPT0gMCkgIC8qIG5vIGx1Y2sgYXQgYWxsIC0gcmV0IGFscmVhZHkgc2V0ICovCi0JCWtmcmVlKGNhbS0+c2JfYnVmcyk7Ci0JcmVxLT5jb3VudCA9IGNhbS0+bl9zYnVmczsgIC8qIEluIGNhc2Ugb2YgcGFydGlhbCBzdWNjZXNzICovCi0KLSAgb3V0OgotCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBpbnQgY2FmZV92aWRpb2NfcXVlcnlidWYoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCi0JCXN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQotewotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCWludCByZXQgPSAtRUlOVkFMOwotCi0JbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKLQlpZiAoYnVmLT5pbmRleCA+PSBjYW0tPm5fc2J1ZnMpCi0JCWdvdG8gb3V0OwotCSpidWYgPSBjYW0tPnNiX2J1ZnNbYnVmLT5pbmRleF0udjRsYnVmOwotCXJldCA9IDA7Ci0gIG91dDoKLQltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBjYWZlX3ZpZGlvY19xYnVmKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAotCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgY2FmZV9zaW9fYnVmZmVyICpzYnVmOwotCWludCByZXQgPSAtRUlOVkFMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCWlmIChidWYtPmluZGV4ID49IGNhbS0+bl9zYnVmcykKLQkJZ290byBvdXQ7Ci0Jc2J1ZiA9IGNhbS0+c2JfYnVmcyArIGJ1Zi0+aW5kZXg7Ci0JaWYgKHNidWYtPnY0bGJ1Zi5mbGFncyAmIFY0TDJfQlVGX0ZMQUdfUVVFVUVEKSB7Ci0JCXJldCA9IDA7IC8qIEFscmVhZHkgcXVldWVkPz8gKi8KLQkJZ290byBvdXQ7Ci0JfQotCWlmIChzYnVmLT52NGxidWYuZmxhZ3MgJiBWNEwyX0JVRl9GTEFHX0RPTkUpIHsKLQkJLyogU3BlYyBkb2Vzbid0IHNheSBhbnl0aGluZywgc2VlbXMgYXBwcm9wcmlhdGUgdGhvICovCi0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBvdXQ7Ci0JfQotCXNidWYtPnY0bGJ1Zi5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX1FVRVVFRDsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCWxpc3RfYWRkKCZzYnVmLT5saXN0LCAmY2FtLT5zYl9hdmFpbCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCXJldCA9IDA7Ci0gIG91dDoKLQltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBjYWZlX3ZpZGlvY19kcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKLQkJc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCi17Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBmaWxwLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGNhZmVfc2lvX2J1ZmZlciAqc2J1ZjsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKLQlpZiAoY2FtLT5zdGF0ZSAhPSBTX1NUUkVBTUlORykKLQkJZ290byBvdXRfdW5sb2NrOwotCWlmIChsaXN0X2VtcHR5KCZjYW0tPnNiX2Z1bGwpICYmIGZpbHAtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7Ci0JCXJldCA9IC1FQUdBSU47Ci0JCWdvdG8gb3V0X3VubG9jazsKLQl9Ci0KLQl3aGlsZSAobGlzdF9lbXB0eSgmY2FtLT5zYl9mdWxsKSAmJiBjYW0tPnN0YXRlID09IFNfU1RSRUFNSU5HKSB7Ci0JCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKLQkJaWYgKHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShjYW0tPmlvd2FpdCwKLQkJCQkJCSFsaXN0X2VtcHR5KCZjYW0tPnNiX2Z1bGwpKSkgewotCQkJcmV0ID0gLUVSRVNUQVJUU1lTOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKLQl9Ci0KLQlpZiAoY2FtLT5zdGF0ZSAhPSBTX1NUUkVBTUlORykKLQkJcmV0ID0gLUVJTlRSOwotCWVsc2UgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotCQkvKiBTaG91bGQgcHJvYmFibHkgcmVjaGVjayAhbGlzdF9lbXB0eSgpIGhlcmUgKi8KLQkJc2J1ZiA9IGxpc3RfZW50cnkoY2FtLT5zYl9mdWxsLm5leHQsCi0JCQkJc3RydWN0IGNhZmVfc2lvX2J1ZmZlciwgbGlzdCk7Ci0JCWxpc3RfZGVsX2luaXQoJnNidWYtPmxpc3QpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0JCXNidWYtPnY0bGJ1Zi5mbGFncyAmPSB+VjRMMl9CVUZfRkxBR19ET05FOwotCQkqYnVmID0gc2J1Zi0+djRsYnVmOwotCQlyZXQgPSAwOwotCX0KLQotICBvdXRfdW5sb2NrOgotCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKLSAgb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLQotCi1zdGF0aWMgdm9pZCBjYWZlX3Y0bF92bV9vcGVuKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCXN0cnVjdCBjYWZlX3Npb19idWZmZXIgKnNidWYgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKLQkvKgotCSAqIExvY2tpbmc6IGRvbmUgdW5kZXIgbW1hcF9zZW0sIHNvIHdlIGRvbid0IG5lZWQgdG8KLQkgKiBnbyBiYWNrIHRvIHRoZSBjYW1lcmEgbG9jayBoZXJlLgotCSAqLwotCXNidWYtPm1hcGNvdW50Kys7Ci19Ci0KLQotc3RhdGljIHZvaWQgY2FmZV92NGxfdm1fY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCi17Ci0Jc3RydWN0IGNhZmVfc2lvX2J1ZmZlciAqc2J1ZiA9IHZtYS0+dm1fcHJpdmF0ZV9kYXRhOwotCi0JbXV0ZXhfbG9jaygmc2J1Zi0+Y2FtLT5zX211dGV4KTsKLQlzYnVmLT5tYXBjb3VudC0tOwotCS8qIERvY3Mgc2F5IHdlIHNob3VsZCBzdG9wIEkvTyB0b28uLi4gKi8KLQlpZiAoc2J1Zi0+bWFwY291bnQgPT0gMCkKLQkJc2J1Zi0+djRsYnVmLmZsYWdzICY9IH5WNEwyX0JVRl9GTEFHX01BUFBFRDsKLQltdXRleF91bmxvY2soJnNidWYtPmNhbS0+c19tdXRleCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgY2FmZV92NGxfdm1fb3BzID0gewotCS5vcGVuID0gY2FmZV92NGxfdm1fb3BlbiwKLQkuY2xvc2UgPSBjYWZlX3Y0bF92bV9jbG9zZQotfTsKLQotCi1zdGF0aWMgaW50IGNhZmVfdjRsX21tYXAoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQotewotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOwotCWludCByZXQgPSAtRUlOVkFMOwotCWludCBpOwotCXN0cnVjdCBjYWZlX3Npb19idWZmZXIgKnNidWYgPSBOVUxMOwotCi0JaWYgKCEgKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkgfHwgISAodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkpCi0JCXJldHVybiAtRUlOVkFMOwotCS8qCi0JICogRmluZCB0aGUgYnVmZmVyIHRoZXkgYXJlIGxvb2tpbmcgZm9yLgotCSAqLwotCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7Ci0JZm9yIChpID0gMDsgaSA8IGNhbS0+bl9zYnVmczsgaSsrKQotCQlpZiAoY2FtLT5zYl9idWZzW2ldLnY0bGJ1Zi5tLm9mZnNldCA9PSBvZmZzZXQpIHsKLQkJCXNidWYgPSBjYW0tPnNiX2J1ZnMgKyBpOwotCQkJYnJlYWs7Ci0JCX0KLQlpZiAoc2J1ZiA9PSBOVUxMKQotCQlnb3RvIG91dDsKLQotCXJldCA9IHJlbWFwX3ZtYWxsb2NfcmFuZ2Uodm1hLCBzYnVmLT5idWZmZXIsIDApOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCXZtYS0+dm1fZmxhZ3MgfD0gVk1fRE9OVEVYUEFORDsKLQl2bWEtPnZtX3ByaXZhdGVfZGF0YSA9IHNidWY7Ci0Jdm1hLT52bV9vcHMgPSAmY2FmZV92NGxfdm1fb3BzOwotCXNidWYtPnY0bGJ1Zi5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX01BUFBFRDsKLQljYWZlX3Y0bF92bV9vcGVuKHZtYSk7Ci0JcmV0ID0gMDsKLSAgb3V0OgotCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotCi0KLQotc3RhdGljIGludCBjYWZlX3Y0bF9vcGVuKHN0cnVjdCBmaWxlICpmaWxwKQotewotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gdmlkZW9fZHJ2ZGF0YShmaWxwKTsKLQotCWZpbHAtPnByaXZhdGVfZGF0YSA9IGNhbTsKLQotCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7Ci0JaWYgKGNhbS0+dXNlcnMgPT0gMCkgewotCQljYWZlX2N0bHJfcG93ZXJfdXAoY2FtKTsKLQkJX19jYWZlX2NhbV9yZXNldChjYW0pOwotCQljYWZlX3NldF9jb25maWdfbmVlZGVkKGNhbSwgMSk7Ci0JLyogRklYTUUgbWFrZSBzdXJlIHRoaXMgaXMgY29tcGxldGUgKi8KLQl9Ci0JKGNhbS0+dXNlcnMpKys7Ci0JbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgY2FmZV92NGxfcmVsZWFzZShzdHJ1Y3QgZmlsZSAqZmlscCkKLXsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQotCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7Ci0JKGNhbS0+dXNlcnMpLS07Ci0JaWYgKGZpbHAgPT0gY2FtLT5vd25lcikgewotCQljYWZlX2N0bHJfc3RvcF9kbWEoY2FtKTsKLQkJY2FmZV9mcmVlX3Npb19idWZmZXJzKGNhbSk7Ci0JCWNhbS0+b3duZXIgPSBOVUxMOwotCX0KLQlpZiAoY2FtLT51c2VycyA9PSAwKSB7Ci0JCWNhZmVfY3Rscl9wb3dlcl9kb3duKGNhbSk7Ci0JCWlmIChhbGxvY19idWZzX2F0X3JlYWQpCi0JCQljYWZlX2ZyZWVfZG1hX2J1ZnMoY2FtKTsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCXJldHVybiAwOwotfQotCi0KLQotc3RhdGljIHVuc2lnbmVkIGludCBjYWZlX3Y0bF9wb2xsKHN0cnVjdCBmaWxlICpmaWxwLAotCQlzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKnB0KQotewotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gZmlscC0+cHJpdmF0ZV9kYXRhOwotCi0JcG9sbF93YWl0KGZpbHAsICZjYW0tPmlvd2FpdCwgcHQpOwotCWlmIChjYW0tPm5leHRfYnVmID49IDApCi0JCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOwotCXJldHVybiAwOwotfQotCi0KLQotc3RhdGljIGludCBjYWZlX3ZpZGlvY19xdWVyeWN0cmwoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCi0JCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMpCi17Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBwcml2OwotCWludCByZXQ7Ci0KLQltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCXJldCA9IHNlbnNvcl9jYWxsKGNhbSwgY29yZSwgcXVlcnljdHJsLCBxYyk7Ci0JbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci0KLQotc3RhdGljIGludCBjYWZlX3ZpZGlvY19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCi0JCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCi17Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBwcml2OwotCWludCByZXQ7Ci0KLQltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCXJldCA9IHNlbnNvcl9jYWxsKGNhbSwgY29yZSwgZ19jdHJsLCBjdHJsKTsKLQltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgaW50IGNhZmVfdmlkaW9jX3NfY3RybChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKLQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKLXsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IHByaXY7Ci0JaW50IHJldDsKLQotCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7Ci0JcmV0ID0gc2Vuc29yX2NhbGwoY2FtLCBjb3JlLCBzX2N0cmwsIGN0cmwpOwotCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotCi0KLQotCi0KLXN0YXRpYyBpbnQgY2FmZV92aWRpb2NfcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKmNhcCkKLXsKLQlzdHJjcHkoY2FwLT5kcml2ZXIsICJjYWZlX2NjaWMiKTsKLQlzdHJjcHkoY2FwLT5jYXJkLCAiY2FmZV9jY2ljIik7Ci0JY2FwLT52ZXJzaW9uID0gQ0FGRV9WRVJTSU9OOwotCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8Ci0JCVY0TDJfQ0FQX1JFQURXUklURSB8IFY0TDJfQ0FQX1NUUkVBTUlORzsKLQlyZXR1cm4gMDsKLX0KLQotCi0vKgotICogVGhlIGRlZmF1bHQgZm9ybWF0IHdlIHVzZSB1bnRpbCBzb21lYm9keSBzYXlzIG90aGVyd2lzZS4KLSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgY2FmZV9kZWZfcGl4X2Zvcm1hdCA9IHsKLQkud2lkdGgJCT0gVkdBX1dJRFRILAotCS5oZWlnaHQJCT0gVkdBX0hFSUdIVCwKLQkucGl4ZWxmb3JtYXQJPSBWNEwyX1BJWF9GTVRfWVVZViwKLQkuZmllbGQJCT0gVjRMMl9GSUVMRF9OT05FLAotCS5ieXRlc3BlcmxpbmUJPSBWR0FfV0lEVEgqMiwKLQkuc2l6ZWltYWdlCT0gVkdBX1dJRFRIKlZHQV9IRUlHSFQqMiwKLX07Ci0KLXN0YXRpYyBjb25zdCBlbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgY2FmZV9kZWZfbWJ1c19jb2RlID0KLQkJCQkJVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDg7Ci0KLXN0YXRpYyBpbnQgY2FmZV92aWRpb2NfZW51bV9mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlscCwKLQkJdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfZm10ZGVzYyAqZm10KQotewotCWlmIChmbXQtPmluZGV4ID49IE5fQ0FGRV9GTVRTKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlzdHJsY3B5KGZtdC0+ZGVzY3JpcHRpb24sIGNhZmVfZm9ybWF0c1tmbXQtPmluZGV4XS5kZXNjLAotCQkJc2l6ZW9mKGZtdC0+ZGVzY3JpcHRpb24pKTsKLQlmbXQtPnBpeGVsZm9ybWF0ID0gY2FmZV9mb3JtYXRzW2ZtdC0+aW5kZXhdLnBpeGVsZm9ybWF0OwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNhZmVfdmlkaW9jX3RyeV9mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKLQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQpCi17Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBwcml2OwotCXN0cnVjdCBjYWZlX2Zvcm1hdF9zdHJ1Y3QgKmY7Ci0Jc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4ID0gJmZtdC0+Zm10LnBpeDsKLQlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IG1idXNfZm10OwotCWludCByZXQ7Ci0KLQlmID0gY2FmZV9maW5kX2Zvcm1hdChwaXgtPnBpeGVsZm9ybWF0KTsKLQlwaXgtPnBpeGVsZm9ybWF0ID0gZi0+cGl4ZWxmb3JtYXQ7Ci0JdjRsMl9maWxsX21idXNfZm9ybWF0KCZtYnVzX2ZtdCwgcGl4LCBmLT5tYnVzX2NvZGUpOwotCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7Ci0JcmV0ID0gc2Vuc29yX2NhbGwoY2FtLCB2aWRlbywgdHJ5X21idXNfZm10LCAmbWJ1c19mbXQpOwotCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKLQl2NGwyX2ZpbGxfcGl4X2Zvcm1hdChwaXgsICZtYnVzX2ZtdCk7Ci0JcGl4LT5ieXRlc3BlcmxpbmUgPSBwaXgtPndpZHRoICogZi0+YnBwOwotCXBpeC0+c2l6ZWltYWdlID0gcGl4LT5oZWlnaHQgKiBwaXgtPmJ5dGVzcGVybGluZTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGNhZmVfdmlkaW9jX3NfZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCi0JCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10KQotewotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gcHJpdjsKLQlzdHJ1Y3QgY2FmZV9mb3JtYXRfc3RydWN0ICpmOwotCWludCByZXQ7Ci0KLQkvKgotCSAqIENhbid0IGRvIGFueXRoaW5nIGlmIHRoZSBkZXZpY2UgaXMgbm90IGlkbGUKLQkgKiBBbHNvIGNhbid0IGlmIHRoZXJlIGFyZSBzdHJlYW1pbmcgYnVmZmVycyBpbiBwbGFjZS4KLQkgKi8KLQlpZiAoY2FtLT5zdGF0ZSAhPSBTX0lETEUgfHwgY2FtLT5uX3NidWZzID4gMCkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCWYgPSBjYWZlX2ZpbmRfZm9ybWF0KGZtdC0+Zm10LnBpeC5waXhlbGZvcm1hdCk7Ci0KLQkvKgotCSAqIFNlZSBpZiB0aGUgZm9ybWF0dGluZyB3b3JrcyBpbiBwcmluY2lwbGUuCi0JICovCi0JcmV0ID0gY2FmZV92aWRpb2NfdHJ5X2ZtdF92aWRfY2FwKGZpbHAsIHByaXYsIGZtdCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQkvKgotCSAqIE5vdyB3ZSBzdGFydCB0byBjaGFuZ2UgdGhpbmdzIGZvciByZWFsLCBzbyBsZXQncyBkbyBpdAotCSAqIHVuZGVyIGxvY2suCi0JICovCi0JbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKLQljYW0tPnBpeF9mb3JtYXQgPSBmbXQtPmZtdC5waXg7Ci0JY2FtLT5tYnVzX2NvZGUgPSBmLT5tYnVzX2NvZGU7Ci0KLQkvKgotCSAqIE1ha2Ugc3VyZSB3ZSBoYXZlIGFwcHJvcHJpYXRlIERNQSBidWZmZXJzLgotCSAqLwotCXJldCA9IC1FTk9NRU07Ci0JaWYgKGNhbS0+bmJ1ZnMgPiAwICYmIGNhbS0+ZG1hX2J1Zl9zaXplIDwgY2FtLT5waXhfZm9ybWF0LnNpemVpbWFnZSkKLQkJY2FmZV9mcmVlX2RtYV9idWZzKGNhbSk7Ci0JaWYgKGNhbS0+bmJ1ZnMgPT0gMCkgewotCQlpZiAoY2FmZV9hbGxvY19kbWFfYnVmcyhjYW0sIDApKQotCQkJZ290byBvdXQ7Ci0JfQotCS8qCi0JICogSXQgbG9va3MgbGlrZSB0aGlzIG1pZ2h0IHdvcmssIHNvIGxldCdzIHByb2dyYW0gdGhlIHNlbnNvci4KLQkgKi8KLQlyZXQgPSBjYWZlX2NhbV9jb25maWd1cmUoY2FtKTsKLQlpZiAoISByZXQpCi0JCXJldCA9IGNhZmVfY3Rscl9jb25maWd1cmUoY2FtKTsKLSAgb3V0OgotCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKgotICogUmV0dXJuIG91ciBzdG9yZWQgbm90aW9uIG9mIGhvdyB0aGUgY2FtZXJhIGlzL3Nob3VsZCBiZSBjb25maWd1cmVkLgotICogVGhlIFY0bDIgc3BlYyB3YW50cyB1cyB0byBiZSBzbWFydGVyLCBhbmQgYWN0dWFsbHkgZ2V0IHRoaXMgZnJvbQotICogdGhlIGNhbWVyYSAoYW5kIG5vdCBtZXNzIHdpdGggaXQgYXQgb3BlbiB0aW1lKS4gIFNvbWVkYXkuCi0gKi8KLXN0YXRpYyBpbnQgY2FmZV92aWRpb2NfZ19mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKLQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmKQotewotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gcHJpdjsKLQotCWYtPmZtdC5waXggPSBjYW0tPnBpeF9mb3JtYXQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBXZSBvbmx5IGhhdmUgb25lIGlucHV0IC0gdGhlIHNlbnNvciAtIHNvIG1pbmltaXplIHRoZSBub25zZW5zZSBoZXJlLgotICovCi1zdGF0aWMgaW50IGNhZmVfdmlkaW9jX2VudW1faW5wdXQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCi0JCXN0cnVjdCB2NGwyX2lucHV0ICppbnB1dCkKLXsKLQlpZiAoaW5wdXQtPmluZGV4ICE9IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaW5wdXQtPnR5cGUgPSBWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBOwotCWlucHV0LT5zdGQgPSBWNEwyX1NURF9BTEw7IC8qIE5vdCBzdXJlIHdoYXQgc2hvdWxkIGdvIGhlcmUgKi8KLQlzdHJjcHkoaW5wdXQtPm5hbWUsICJDYW1lcmEiKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjYWZlX3ZpZGlvY19nX2lucHV0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgKmkpCi17Ci0JKmkgPSAwOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNhZmVfdmlkaW9jX3NfaW5wdXQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCBpKQotewotCWlmIChpICE9IDApCi0JCXJldHVybiAtRUlOVkFMOwotCXJldHVybiAwOwotfQotCi0vKiBmcm9tIHZpdmkuYyAqLwotc3RhdGljIGludCBjYWZlX3ZpZGlvY19zX3N0ZChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwgdjRsMl9zdGRfaWQgKmEpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBHL1NfUEFSTS4gIE1vc3Qgb2YgdGhpcyBpcyBkb25lIGJ5IHRoZSBzZW5zb3IsIGJ1dCB3ZSBhcmUKLSAqIHRoZSBsZXZlbCB3aGljaCBjb250cm9scyB0aGUgbnVtYmVyIG9mIHJlYWQgYnVmZmVycy4KLSAqLwotc3RhdGljIGludCBjYWZlX3ZpZGlvY19nX3Bhcm0oc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCi0JCXN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnBhcm1zKQotewotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gcHJpdjsKLQlpbnQgcmV0OwotCi0JbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKLQlyZXQgPSBzZW5zb3JfY2FsbChjYW0sIHZpZGVvLCBnX3Bhcm0sIHBhcm1zKTsKLQltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7Ci0JcGFybXMtPnBhcm0uY2FwdHVyZS5yZWFkYnVmZmVycyA9IG5fZG1hX2J1ZnM7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBjYWZlX3ZpZGlvY19zX3Bhcm0oc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCi0JCXN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKnBhcm1zKQotewotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gcHJpdjsKLQlpbnQgcmV0OwotCi0JbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKLQlyZXQgPSBzZW5zb3JfY2FsbChjYW0sIHZpZGVvLCBzX3Bhcm0sIHBhcm1zKTsKLQltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7Ci0JcGFybXMtPnBhcm0uY2FwdHVyZS5yZWFkYnVmZmVycyA9IG5fZG1hX2J1ZnM7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBjYWZlX3ZpZGlvY19nX2NoaXBfaWRlbnQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCi0JCXN0cnVjdCB2NGwyX2RiZ19jaGlwX2lkZW50ICpjaGlwKQotewotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gcHJpdjsKLQotCWNoaXAtPmlkZW50ID0gVjRMMl9JREVOVF9OT05FOwotCWNoaXAtPnJldmlzaW9uID0gMDsKLQlpZiAodjRsMl9jaGlwX21hdGNoX2hvc3QoJmNoaXAtPm1hdGNoKSkgewotCQljaGlwLT5pZGVudCA9IFY0TDJfSURFTlRfQ0FGRTsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiBzZW5zb3JfY2FsbChjYW0sIGNvcmUsIGdfY2hpcF9pZGVudCwgY2hpcCk7Ci19Ci0KLXN0YXRpYyBpbnQgY2FmZV92aWRpb2NfZW51bV9mcmFtZXNpemVzKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAotCQlzdHJ1Y3QgdjRsMl9mcm1zaXplZW51bSAqc2l6ZXMpCi17Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBwcml2OwotCWludCByZXQ7Ci0KLQltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCXJldCA9IHNlbnNvcl9jYWxsKGNhbSwgdmlkZW8sIGVudW1fZnJhbWVzaXplcywgc2l6ZXMpOwotCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGNhZmVfdmlkaW9jX2VudW1fZnJhbWVpbnRlcnZhbHMoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCi0JCXN0cnVjdCB2NGwyX2ZybWl2YWxlbnVtICppbnRlcnZhbCkKLXsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IHByaXY7Ci0JaW50IHJldDsKLQotCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7Ci0JcmV0ID0gc2Vuc29yX2NhbGwoY2FtLCB2aWRlbywgZW51bV9mcmFtZWludGVydmFscywgaW50ZXJ2YWwpOwotCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKLQlyZXR1cm4gcmV0OwotfQotCi0jaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwotc3RhdGljIGludCBjYWZlX3ZpZGlvY19nX3JlZ2lzdGVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAotCQlzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIgKnJlZykKLXsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IHByaXY7Ci0KLQlpZiAodjRsMl9jaGlwX21hdGNoX2hvc3QoJnJlZy0+bWF0Y2gpKSB7Ci0JCXJlZy0+dmFsID0gY2FmZV9yZWdfcmVhZChjYW0sIHJlZy0+cmVnKTsKLQkJcmVnLT5zaXplID0gNDsKLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiBzZW5zb3JfY2FsbChjYW0sIGNvcmUsIGdfcmVnaXN0ZXIsIHJlZyk7Ci19Ci0KLXN0YXRpYyBpbnQgY2FmZV92aWRpb2Nfc19yZWdpc3RlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJc3RydWN0IHY0bDJfZGJnX3JlZ2lzdGVyICpyZWcpCi17Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBwcml2OwotCi0JaWYgKHY0bDJfY2hpcF9tYXRjaF9ob3N0KCZyZWctPm1hdGNoKSkgewotCQljYWZlX3JlZ193cml0ZShjYW0sIHJlZy0+cmVnLCByZWctPnZhbCk7Ci0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gc2Vuc29yX2NhbGwoY2FtLCBjb3JlLCBzX3JlZ2lzdGVyLCByZWcpOwotfQotI2VuZGlmCi0KLS8qCi0gKiBUaGlzIHRlbXBsYXRlIGRldmljZSBob2xkcyBhbGwgb2YgdGhvc2UgdjRsMiBtZXRob2RzOyB3ZQotICogY2xvbmUgaXQgZm9yIHNwZWNpZmljIHJlYWwgZGV2aWNlcy4KLSAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIGNhZmVfdjRsX2ZvcHMgPSB7Ci0JLm93bmVyID0gVEhJU19NT0RVTEUsCi0JLm9wZW4gPSBjYWZlX3Y0bF9vcGVuLAotCS5yZWxlYXNlID0gY2FmZV92NGxfcmVsZWFzZSwKLQkucmVhZCA9IGNhZmVfdjRsX3JlYWQsCi0JLnBvbGwgPSBjYWZlX3Y0bF9wb2xsLAotCS5tbWFwID0gY2FmZV92NGxfbW1hcCwKLQkudW5sb2NrZWRfaW9jdGwgPSB2aWRlb19pb2N0bDIsCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfaW9jdGxfb3BzIGNhZmVfdjRsX2lvY3RsX29wcyA9IHsKLQkudmlkaW9jX3F1ZXJ5Y2FwIAk9IGNhZmVfdmlkaW9jX3F1ZXJ5Y2FwLAotCS52aWRpb2NfZW51bV9mbXRfdmlkX2NhcCA9IGNhZmVfdmlkaW9jX2VudW1fZm10X3ZpZF9jYXAsCi0JLnZpZGlvY190cnlfZm10X3ZpZF9jYXAJPSBjYWZlX3ZpZGlvY190cnlfZm10X3ZpZF9jYXAsCi0JLnZpZGlvY19zX2ZtdF92aWRfY2FwCT0gY2FmZV92aWRpb2Nfc19mbXRfdmlkX2NhcCwKLQkudmlkaW9jX2dfZm10X3ZpZF9jYXAJPSBjYWZlX3ZpZGlvY19nX2ZtdF92aWRfY2FwLAotCS52aWRpb2NfZW51bV9pbnB1dAk9IGNhZmVfdmlkaW9jX2VudW1faW5wdXQsCi0JLnZpZGlvY19nX2lucHV0CQk9IGNhZmVfdmlkaW9jX2dfaW5wdXQsCi0JLnZpZGlvY19zX2lucHV0CQk9IGNhZmVfdmlkaW9jX3NfaW5wdXQsCi0JLnZpZGlvY19zX3N0ZAkJPSBjYWZlX3ZpZGlvY19zX3N0ZCwKLQkudmlkaW9jX3JlcWJ1ZnMJCT0gY2FmZV92aWRpb2NfcmVxYnVmcywKLQkudmlkaW9jX3F1ZXJ5YnVmCT0gY2FmZV92aWRpb2NfcXVlcnlidWYsCi0JLnZpZGlvY19xYnVmCQk9IGNhZmVfdmlkaW9jX3FidWYsCi0JLnZpZGlvY19kcWJ1ZgkJPSBjYWZlX3ZpZGlvY19kcWJ1ZiwKLQkudmlkaW9jX3N0cmVhbW9uCT0gY2FmZV92aWRpb2Nfc3RyZWFtb24sCi0JLnZpZGlvY19zdHJlYW1vZmYJPSBjYWZlX3ZpZGlvY19zdHJlYW1vZmYsCi0JLnZpZGlvY19xdWVyeWN0cmwJPSBjYWZlX3ZpZGlvY19xdWVyeWN0cmwsCi0JLnZpZGlvY19nX2N0cmwJCT0gY2FmZV92aWRpb2NfZ19jdHJsLAotCS52aWRpb2Nfc19jdHJsCQk9IGNhZmVfdmlkaW9jX3NfY3RybCwKLQkudmlkaW9jX2dfcGFybQkJPSBjYWZlX3ZpZGlvY19nX3Bhcm0sCi0JLnZpZGlvY19zX3Bhcm0JCT0gY2FmZV92aWRpb2Nfc19wYXJtLAotCS52aWRpb2NfZW51bV9mcmFtZXNpemVzID0gY2FmZV92aWRpb2NfZW51bV9mcmFtZXNpemVzLAotCS52aWRpb2NfZW51bV9mcmFtZWludGVydmFscyA9IGNhZmVfdmlkaW9jX2VudW1fZnJhbWVpbnRlcnZhbHMsCi0JLnZpZGlvY19nX2NoaXBfaWRlbnQgICAgPSBjYWZlX3ZpZGlvY19nX2NoaXBfaWRlbnQsCi0jaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwotCS52aWRpb2NfZ19yZWdpc3RlciAJPSBjYWZlX3ZpZGlvY19nX3JlZ2lzdGVyLAotCS52aWRpb2Nfc19yZWdpc3RlciAJPSBjYWZlX3ZpZGlvY19zX3JlZ2lzdGVyLAotI2VuZGlmCi19OwotCi1zdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBjYWZlX3Y0bF90ZW1wbGF0ZSA9IHsKLQkubmFtZSA9ICJjYWZlIiwKLQkudHZub3JtcyA9IFY0TDJfU1REX05UU0NfTSwKLQkuY3VycmVudF9ub3JtID0gVjRMMl9TVERfTlRTQ19NLCAgLyogbWFrZSBtcGxheWVyIGhhcHB5ICovCi0KLQkuZm9wcyA9ICZjYWZlX3Y0bF9mb3BzLAotCS5pb2N0bF9vcHMgPSAmY2FmZV92NGxfaW9jdGxfb3BzLAotCS5yZWxlYXNlID0gdmlkZW9fZGV2aWNlX3JlbGVhc2VfZW1wdHksCi19OwotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCi0gKiBJbnRlcnJ1cHQgaGFuZGxlciBzdHVmZgotICovCi0KLQotCi1zdGF0aWMgdm9pZCBjYWZlX2ZyYW1lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gKHN0cnVjdCBjYWZlX2NhbWVyYSAqKSBkYXRhOwotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGNhZmVfc2lvX2J1ZmZlciAqc2J1ZjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0JZm9yIChpID0gMDsgaSA8IGNhbS0+bmJ1ZnM7IGkrKykgewotCQlpbnQgYnVmbm8gPSBjYW0tPm5leHRfYnVmOwotCQlpZiAoYnVmbm8gPCAwKSB7ICAvKiAid2lsbCBuZXZlciBoYXBwZW4iICovCi0JCQljYW1fZXJyKGNhbSwgIk5vIHZhbGlkIGJ1ZnMgaW4gdGFza2xldCFcbiIpOwotCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKCsrKGNhbS0+bmV4dF9idWYpID49IGNhbS0+bmJ1ZnMpCi0JCQljYW0tPm5leHRfYnVmID0gMDsKLQkJaWYgKCEgdGVzdF9iaXQoYnVmbm8sICZjYW0tPmZsYWdzKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAobGlzdF9lbXB0eSgmY2FtLT5zYl9hdmFpbCkpCi0JCQlicmVhazsgIC8qIExlYXZlIGl0IHZhbGlkLCBob3BlIGZvciBiZXR0ZXIgbGF0ZXIgKi8KLQkJY2xlYXJfYml0KGJ1Zm5vLCAmY2FtLT5mbGFncyk7Ci0JCXNidWYgPSBsaXN0X2VudHJ5KGNhbS0+c2JfYXZhaWwubmV4dCwKLQkJCQlzdHJ1Y3QgY2FmZV9zaW9fYnVmZmVyLCBsaXN0KTsKLQkJLyoKLQkJICogRHJvcCB0aGUgbG9jayBkdXJpbmcgdGhlIGJpZyBjb3B5LiAgVGhpcyAqc2hvdWxkKiBiZSBzYWZlLi4uCi0JCSAqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Ci0JCW1lbWNweShzYnVmLT5idWZmZXIsIGNhbS0+ZG1hX2J1ZnNbYnVmbm9dLAotCQkJCWNhbS0+cGl4X2Zvcm1hdC5zaXplaW1hZ2UpOwotCQlzYnVmLT52NGxidWYuYnl0ZXN1c2VkID0gY2FtLT5waXhfZm9ybWF0LnNpemVpbWFnZTsKLQkJc2J1Zi0+djRsYnVmLnNlcXVlbmNlID0gY2FtLT5idWZfc2VxW2J1Zm5vXTsKLQkJc2J1Zi0+djRsYnVmLmZsYWdzICY9IH5WNEwyX0JVRl9GTEFHX1FVRVVFRDsKLQkJc2J1Zi0+djRsYnVmLmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfRE9ORTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKLQkJbGlzdF9tb3ZlX3RhaWwoJnNidWYtPmxpc3QsICZjYW0tPnNiX2Z1bGwpOwotCX0KLQlpZiAoISBsaXN0X2VtcHR5KCZjYW0tPnNiX2Z1bGwpKQotCQl3YWtlX3VwKCZjYW0tPmlvd2FpdCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOwotfQotCi0KLQotc3RhdGljIHZvaWQgY2FmZV9mcmFtZV9jb21wbGV0ZShzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSwgaW50IGZyYW1lKQotewotCS8qCi0JICogQmFzaWMgZnJhbWUgaG91c2VrZWVwaW5nLgotCSAqLwotCWlmICh0ZXN0X2JpdChmcmFtZSwgJmNhbS0+ZmxhZ3MpICYmIHByaW50a19yYXRlbGltaXQoKSkKLQkJY2FtX2VycihjYW0sICJGcmFtZSBvdmVycnVuIG9uICVkLCBmcmFtZXMgbG9zdFxuIiwgZnJhbWUpOwotCXNldF9iaXQoZnJhbWUsICZjYW0tPmZsYWdzKTsKLQljbGVhcl9iaXQoQ0ZfRE1BX0FDVElWRSwgJmNhbS0+ZmxhZ3MpOwotCWlmIChjYW0tPm5leHRfYnVmIDwgMCkKLQkJY2FtLT5uZXh0X2J1ZiA9IGZyYW1lOwotCWNhbS0+YnVmX3NlcVtmcmFtZV0gPSArKyhjYW0tPnNlcXVlbmNlKTsKLQotCXN3aXRjaCAoY2FtLT5zdGF0ZSkgewotCS8qCi0JICogSWYgaW4gc2luZ2xlIHJlYWQgbW9kZSwgdHJ5IGdvaW5nIHNwZWN1bGF0aXZlLgotCSAqLwotCSAgICBjYXNlIFNfU0lOR0xFUkVBRDoKLQkJY2FtLT5zdGF0ZSA9IFNfU1BFQ1JFQUQ7Ci0JCWNhbS0+c3BlY2ZyYW1lcyA9IDA7Ci0JCXdha2VfdXAoJmNhbS0+aW93YWl0KTsKLQkJYnJlYWs7Ci0KLQkvKgotCSAqIElmIHdlIGFyZSBhbHJlYWR5IGRvaW5nIHNwZWN1bGF0aXZlIHJlYWRzLCBhbmQgbm9ib2R5IGlzCi0JICogcmVhZGluZyB0aGVtLCBqdXN0IHN0b3AuCi0JICovCi0JICAgIGNhc2UgU19TUEVDUkVBRDoKLQkJaWYgKCsrKGNhbS0+c3BlY2ZyYW1lcykgPj0gY2FtLT5uYnVmcykgewotCQkJY2FmZV9jdGxyX3N0b3AoY2FtKTsKLQkJCWNhZmVfY3Rscl9pcnFfZGlzYWJsZShjYW0pOwotCQkJY2FtLT5zdGF0ZSA9IFNfSURMRTsKLQkJfQotCQl3YWtlX3VwKCZjYW0tPmlvd2FpdCk7Ci0JCWJyZWFrOwotCS8qCi0JICogRm9yIHRoZSBzdHJlYW1pbmcgY2FzZSwgd2UgZGVmZXIgdGhlIHJlYWwgd29yayB0byB0aGUKLQkgKiBjYW1lcmEgdGFza2xldC4KLQkgKgotCSAqIEZJWE1FOiBpZiB0aGUgYXBwbGljYXRpb24gaXMgbm90IGNvbnN1bWluZyB0aGUgYnVmZmVycywKLQkgKiB3ZSBzaG91bGQgZXZlbnR1YWxseSBwdXQgdGhpbmdzIG9uIGhvbGQgYW5kIHJlc3RhcnQgaW4KLQkgKiB2aWRpb2NfZHFidWYoKS4KLQkgKi8KLQkgICAgY2FzZSBTX1NUUkVBTUlORzoKLQkJdGFza2xldF9zY2hlZHVsZSgmY2FtLT5zX3Rhc2tsZXQpOwotCQlicmVhazsKLQotCSAgICBkZWZhdWx0OgotCQljYW1fZXJyKGNhbSwgIkZyYW1lIGludGVycnVwdCBpbiBub24tb3BlcmF0aW9uYWwgc3RhdGVcbiIpOwotCQlicmVhazsKLQl9Ci19Ci0KLQotCi0KLXN0YXRpYyB2b2lkIGNhZmVfZnJhbWVfaXJxKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtLCB1bnNpZ25lZCBpbnQgaXJxcykKLXsKLQl1bnNpZ25lZCBpbnQgZnJhbWU7Ci0KLQljYWZlX3JlZ193cml0ZShjYW0sIFJFR19JUlFTVEFULCBGUkFNRUlSUVMpOyAvKiBDbGVhcidlbSBhbGwgKi8KLQkvKgotCSAqIEhhbmRsZSBhbnkgZnJhbWUgY29tcGxldGlvbnMuICBUaGVyZSByZWFsbHkgc2hvdWxkCi0JICogbm90IGJlIG1vcmUgdGhhbiBvbmUgb2YgdGhlc2UsIG9yIHdlIGhhdmUgZmFsbGVuCi0JICogZmFyIGJlaGluZC4KLQkgKi8KLQlmb3IgKGZyYW1lID0gMDsgZnJhbWUgPCBjYW0tPm5idWZzOyBmcmFtZSsrKQotCQlpZiAoaXJxcyAmIChJUlFfRU9GMCA8PCBmcmFtZSkpCi0JCQljYWZlX2ZyYW1lX2NvbXBsZXRlKGNhbSwgZnJhbWUpOwotCS8qCi0JICogSWYgYSBmcmFtZSBzdGFydHMsIG5vdGUgdGhhdCB3ZSBoYXZlIERNQSBhY3RpdmUuICBUaGlzCi0JICogY29kZSBhc3N1bWVzIHRoYXQgd2Ugd29uJ3QgZ2V0IG11bHRpcGxlIGZyYW1lIGludGVycnVwdHMKLQkgKiBhdCBvbmNlOyBtYXkgd2FudCB0byByZXRoaW5rIHRoYXQuCi0JICovCi0JaWYgKGlycXMgJiAoSVJRX1NPRjAgfCBJUlFfU09GMSB8IElSUV9TT0YyKSkKLQkJc2V0X2JpdChDRl9ETUFfQUNUSVZFLCAmY2FtLT5mbGFncyk7Ci19Ci0KLQotCi1zdGF0aWMgaXJxcmV0dXJuX3QgY2FmZV9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSA9IGRhdGE7Ci0JdW5zaWduZWQgaW50IGlycXM7Ci0KLQlzcGluX2xvY2soJmNhbS0+ZGV2X2xvY2spOwotCWlycXMgPSBjYWZlX3JlZ19yZWFkKGNhbSwgUkVHX0lSUVNUQVQpOwotCWlmICgoaXJxcyAmIEFMTElSUVMpID09IDApIHsKLQkJc3Bpbl91bmxvY2soJmNhbS0+ZGV2X2xvY2spOwotCQlyZXR1cm4gSVJRX05PTkU7Ci0JfQotCWlmIChpcnFzICYgRlJBTUVJUlFTKQotCQljYWZlX2ZyYW1lX2lycShjYW0sIGlycXMpOwotCWlmIChpcnFzICYgVFdTSUlSUVMpIHsKLQkJY2FmZV9yZWdfd3JpdGUoY2FtLCBSRUdfSVJRU1RBVCwgVFdTSUlSUVMpOwotCQl3YWtlX3VwKCZjYW0tPnNtYnVzX3dhaXQpOwotCX0KLQlzcGluX3VubG9jaygmY2FtLT5kZXZfbG9jayk7Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgotICogUENJIGludGVyZmFjZSBzdHVmZi4KLSAqLwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgb2xwY194bzFfZG1pW10gPSB7Ci0JewotCQkubWF0Y2hlcyA9IHsKLQkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIk9MUEMiKSwKLQkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9OQU1FLCAiWE8iKSwKLQkJCURNSV9NQVRDSChETUlfUFJPRFVDVF9WRVJTSU9OLCAiMSIpLAotCQl9LAotCX0sCi0JeyB9Ci19OwotCi1zdGF0aWMgaW50IGNhZmVfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAotCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbTsKLQlzdHJ1Y3Qgb3Y3NjcwX2NvbmZpZyBzZW5zb3JfY2ZnID0gewotCQkvKiBUaGlzIGNvbnRyb2xsZXIgb25seSBkb2VzIFNNQlVTICovCi0JCS51c2Vfc21idXMgPSB0cnVlLAotCi0JCS8qCi0JCSAqIEV4Y2x1ZGUgUUNJRiBtb2RlLCBiZWNhdXNlIGl0IG9ubHkgY2FwdHVyZXMgYSB0aW55IHBvcnRpb24KLQkJICogb2YgdGhlIHNlbnNvciBGT1YKLQkJICovCi0JCS5taW5fd2lkdGggPSAzMjAsCi0JCS5taW5faGVpZ2h0ID0gMjQwLAotCX07Ci0Jc3RydWN0IGkyY19ib2FyZF9pbmZvIG92NzY3MF9pbmZvID0gewotCQkudHlwZSA9ICJvdjc2NzAiLAotCQkuYWRkciA9IDB4NDIsCi0JCS5wbGF0Zm9ybV9kYXRhID0gJnNlbnNvcl9jZmcsCi0JfTsKLQotCS8qCi0JICogU3RhcnQgcHV0dGluZyB0b2dldGhlciBvbmUgb2Ygb3VyIGJpZyBjYW1lcmEgc3RydWN0dXJlcy4KLQkgKi8KLQlyZXQgPSAtRU5PTUVNOwotCWNhbSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjYWZlX2NhbWVyYSksIEdGUF9LRVJORUwpOwotCWlmIChjYW0gPT0gTlVMTCkKLQkJZ290byBvdXQ7Ci0JcmV0ID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXIoJnBkZXYtPmRldiwgJmNhbS0+djRsMl9kZXYpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0X2ZyZWU7Ci0KLQltdXRleF9pbml0KCZjYW0tPnNfbXV0ZXgpOwotCXNwaW5fbG9ja19pbml0KCZjYW0tPmRldl9sb2NrKTsKLQljYW0tPnN0YXRlID0gU19OT1RSRUFEWTsKLQljYWZlX3NldF9jb25maWdfbmVlZGVkKGNhbSwgMSk7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmY2FtLT5zbWJ1c193YWl0KTsKLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYW0tPmlvd2FpdCk7Ci0JY2FtLT5wZGV2ID0gcGRldjsKLQljYW0tPnBpeF9mb3JtYXQgPSBjYWZlX2RlZl9waXhfZm9ybWF0OwotCWNhbS0+bWJ1c19jb2RlID0gY2FmZV9kZWZfbWJ1c19jb2RlOwotCUlOSVRfTElTVF9IRUFEKCZjYW0tPmRldl9saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmY2FtLT5zYl9hdmFpbCk7Ci0JSU5JVF9MSVNUX0hFQUQoJmNhbS0+c2JfZnVsbCk7Ci0JdGFza2xldF9pbml0KCZjYW0tPnNfdGFza2xldCwgY2FmZV9mcmFtZV90YXNrbGV0LCAodW5zaWduZWQgbG9uZykgY2FtKTsKLQkvKgotCSAqIEdldCBzZXQgdXAgb24gdGhlIFBDSSBidXMuCi0JICovCi0JcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7Ci0JaWYgKHJldCkKLQkJZ290byBvdXRfdW5yZWc7Ci0JcGNpX3NldF9tYXN0ZXIocGRldik7Ci0KLQlyZXQgPSAtRUlPOwotCWNhbS0+cmVncyA9IHBjaV9pb21hcChwZGV2LCAwLCAwKTsKLQlpZiAoISBjYW0tPnJlZ3MpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gaW9yZW1hcCBjYWZlLWNjaWMgcmVnc1xuIik7Ci0JCWdvdG8gb3V0X3VucmVnOwotCX0KLQlyZXQgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIGNhZmVfaXJxLCBJUlFGX1NIQVJFRCwgImNhZmUtY2NpYyIsIGNhbSk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXRfaW91bm1hcDsKLQkvKgotCSAqIEluaXRpYWxpemUgdGhlIGNvbnRyb2xsZXIgYW5kIGxlYXZlIGl0IHBvd2VyZWQgdXAuICBJdCB3aWxsCi0JICogc3RheSB0aGF0IHdheSB1bnRpbCB0aGUgc2Vuc29yIGRyaXZlciBzaG93cyB1cC4KLQkgKi8KLQljYWZlX2N0bHJfaW5pdChjYW0pOwotCWNhZmVfY3Rscl9wb3dlcl91cChjYW0pOwotCS8qCi0JICogU2V0IHVwIEkyQy9TTUJVUyBjb21tdW5pY2F0aW9ucy4gIFdlIGhhdmUgdG8gZHJvcCB0aGUgbXV0ZXggaGVyZQotCSAqIGJlY2F1c2UgdGhlIHNlbnNvciBjb3VsZCBhdHRhY2ggaW4gdGhpcyBjYWxsIGNoYWluLCBsZWFkaW5nIHRvCi0JICogdW5zaWdodGx5IGRlYWRsb2Nrcy4KLQkgKi8KLQlyZXQgPSBjYWZlX3NtYnVzX3NldHVwKGNhbSk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXRfZnJlZWlycTsKLQotCS8qIEFwcGx5IFhPLTEgY2xvY2sgc3BlZWQgKi8KLQlpZiAoZG1pX2NoZWNrX3N5c3RlbShvbHBjX3hvMV9kbWkpKQotCQlzZW5zb3JfY2ZnLmNsb2NrX3NwZWVkID0gNDU7Ci0KLQljYW0tPnNlbnNvcl9hZGRyID0gb3Y3NjcwX2luZm8uYWRkcjsKLQljYW0tPnNlbnNvciA9IHY0bDJfaTJjX25ld19zdWJkZXZfYm9hcmQoJmNhbS0+djRsMl9kZXYsICZjYW0tPmkyY19hZGFwdGVyLAotCQkJJm92NzY3MF9pbmZvLCBOVUxMKTsKLQlpZiAoY2FtLT5zZW5zb3IgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIG91dF9zbWJ1czsKLQl9Ci0KLQlyZXQgPSBjYWZlX2NhbV9pbml0KGNhbSk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXRfc21idXM7Ci0KLQkvKgotCSAqIEdldCB0aGUgdjRsMiBzZXR1cCBkb25lLgotCSAqLwotCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7Ci0JY2FtLT52ZGV2ID0gY2FmZV92NGxfdGVtcGxhdGU7Ci0JY2FtLT52ZGV2LmRlYnVnID0gMDsKLS8qCWNhbS0+dmRldi5kZWJ1ZyA9IFY0TDJfREVCVUdfSU9DVExfQVJHOyovCi0JY2FtLT52ZGV2LnY0bDJfZGV2ID0gJmNhbS0+djRsMl9kZXY7Ci0JcmV0ID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZjYW0tPnZkZXYsIFZGTF9UWVBFX0dSQUJCRVIsIC0xKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dF91bmxvY2s7Ci0JdmlkZW9fc2V0X2RydmRhdGEoJmNhbS0+dmRldiwgY2FtKTsKLQotCS8qCi0JICogSWYgc28gcmVxdWVzdGVkLCB0cnkgdG8gZ2V0IG91ciBETUEgYnVmZmVycyBub3cuCi0JICovCi0JaWYgKCFhbGxvY19idWZzX2F0X3JlYWQpIHsKLQkJaWYgKGNhZmVfYWxsb2NfZG1hX2J1ZnMoY2FtLCAxKSkKLQkJCWNhbV93YXJuKGNhbSwgIlVuYWJsZSB0byBhbGxvYyBETUEgYnVmZmVycyBhdCBsb2FkIgotCQkJCQkiIHdpbGwgdHJ5IGFnYWluIGxhdGVyLiIpOwotCX0KLQotCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKLQlyZXR1cm4gMDsKLQotb3V0X3VubG9jazoKLQltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7Ci1vdXRfc21idXM6Ci0JY2FmZV9zbWJ1c19zaHV0ZG93bihjYW0pOwotb3V0X2ZyZWVpcnE6Ci0JY2FmZV9jdGxyX3Bvd2VyX2Rvd24oY2FtKTsKLQlmcmVlX2lycShwZGV2LT5pcnEsIGNhbSk7Ci1vdXRfaW91bm1hcDoKLQlwY2lfaW91bm1hcChwZGV2LCBjYW0tPnJlZ3MpOwotb3V0X2ZyZWU6Ci0JdjRsMl9kZXZpY2VfdW5yZWdpc3RlcigmY2FtLT52NGwyX2Rldik7Ci1vdXRfdW5yZWc6Ci0Ja2ZyZWUoY2FtKTsKLW91dDoKLQlyZXR1cm4gcmV0OwotfQotCi0KLS8qCi0gKiBTaHV0IGRvd24gYW4gaW5pdGlhbGl6ZWQgZGV2aWNlCi0gKi8KLXN0YXRpYyB2b2lkIGNhZmVfc2h1dGRvd24oc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCi17Ci0vKiBGSVhNRTogTWFrZSBzdXJlIHdlIHRha2UgY2FyZSBvZiBldmVyeXRoaW5nIGhlcmUgKi8KLQlpZiAoY2FtLT5uX3NidWZzID4gMCkKLQkJLyogV2hhdCBpZiB0aGV5IGFyZSBzdGlsbCBtYXBwZWQ/ICBTaG91bGRuJ3QgYmUsIGJ1dC4uLiAqLwotCQljYWZlX2ZyZWVfc2lvX2J1ZmZlcnMoY2FtKTsKLQljYWZlX2N0bHJfc3RvcF9kbWEoY2FtKTsKLQljYWZlX2N0bHJfcG93ZXJfZG93bihjYW0pOwotCWNhZmVfc21idXNfc2h1dGRvd24oY2FtKTsKLQljYWZlX2ZyZWVfZG1hX2J1ZnMoY2FtKTsKLQlmcmVlX2lycShjYW0tPnBkZXYtPmlycSwgY2FtKTsKLQlwY2lfaW91bm1hcChjYW0tPnBkZXYsIGNhbS0+cmVncyk7Ci0JdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJmNhbS0+dmRldik7Ci19Ci0KLQotc3RhdGljIHZvaWQgY2FmZV9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXYgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSB0b19jYW0odjRsMl9kZXYpOwotCi0JaWYgKGNhbSA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInBjaV9yZW1vdmUgb24gdW5rbm93biBwZGV2ICVwXG4iLCBwZGV2KTsKLQkJcmV0dXJuOwotCX0KLQltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOwotCWlmIChjYW0tPnVzZXJzID4gMCkKLQkJY2FtX3dhcm4oY2FtLCAiUmVtb3ZpbmcgYSBkZXZpY2Ugd2l0aCB1c2VycyFcbiIpOwotCWNhZmVfc2h1dGRvd24oY2FtKTsKLQl2NGwyX2RldmljZV91bnJlZ2lzdGVyKCZjYW0tPnY0bDJfZGV2KTsKLQlrZnJlZShjYW0pOwotLyogTm8gdW5sb2NrIC0gaXQgbm8gbG9uZ2VyIGV4aXN0cyAqLwotfQotCi0KLSNpZmRlZiBDT05GSUdfUE0KLS8qCi0gKiBCYXNpYyBwb3dlciBtYW5hZ2VtZW50LgotICovCi1zdGF0aWMgaW50IGNhZmVfcGNpX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKLXsKLQlzdHJ1Y3QgdjRsMl9kZXZpY2UgKnY0bDJfZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOwotCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gdG9fY2FtKHY0bDJfZGV2KTsKLQlpbnQgcmV0OwotCWVudW0gY2FmZV9zdGF0ZSBjc3RhdGU7Ci0KLQlyZXQgPSBwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCWNzdGF0ZSA9IGNhbS0+c3RhdGU7IC8qIEhBQ0sgLSBzdG9wX2RtYSBzZXRzIHRvIGlkbGUgKi8KLQljYWZlX2N0bHJfc3RvcF9kbWEoY2FtKTsKLQljYWZlX2N0bHJfcG93ZXJfZG93bihjYW0pOwotCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKLQljYW0tPnN0YXRlID0gY3N0YXRlOwotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgY2FmZV9wY2lfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXYgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7Ci0Jc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSB0b19jYW0odjRsMl9kZXYpOwotCWludCByZXQgPSAwOwotCi0JcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7Ci0JcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7Ci0KLQlpZiAocmV0KSB7Ci0JCWNhbV93YXJuKGNhbSwgIlVuYWJsZSB0byByZS1lbmFibGUgZGV2aWNlIG9uIHJlc3VtZSFcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQljYWZlX2N0bHJfaW5pdChjYW0pOwotCi0JbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKLQlpZiAoY2FtLT51c2VycyA+IDApIHsKLQkJY2FmZV9jdGxyX3Bvd2VyX3VwKGNhbSk7Ci0JCV9fY2FmZV9jYW1fcmVzZXQoY2FtKTsKLQl9IGVsc2UgewotCQljYWZlX2N0bHJfcG93ZXJfZG93bihjYW0pOwotCX0KLQltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7Ci0KLQlzZXRfYml0KENGX0NPTkZJR19ORUVERUQsICZjYW0tPmZsYWdzKTsKLQlpZiAoY2FtLT5zdGF0ZSA9PSBTX1NQRUNSRUFEKQotCQljYW0tPnN0YXRlID0gU19JRExFOyAgLyogRG9uJ3QgYm90aGVyIHJlc3RhcnRpbmcgKi8KLQllbHNlIGlmIChjYW0tPnN0YXRlID09IFNfU0lOR0xFUkVBRCB8fCBjYW0tPnN0YXRlID09IFNfU1RSRUFNSU5HKQotCQlyZXQgPSBjYWZlX3JlYWRfc2V0dXAoY2FtLCBjYW0tPnN0YXRlKTsKLQlyZXR1cm4gcmV0OwotfQotCi0jZW5kaWYgIC8qIENPTkZJR19QTSAqLwotCi0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjYWZlX2lkc1tdID0gewotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX01BUlZFTEwsCi0JCSAgICAgUENJX0RFVklDRV9JRF9NQVJWRUxMXzg4QUxQMDFfQ0NJQykgfSwKLQl7IDAsIH0KLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBjYWZlX2lkcyk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBjYWZlX3BjaV9kcml2ZXIgPSB7Ci0JLm5hbWUgPSAiY2FmZTEwMDAtY2NpYyIsCi0JLmlkX3RhYmxlID0gY2FmZV9pZHMsCi0JLnByb2JlID0gY2FmZV9wY2lfcHJvYmUsCi0JLnJlbW92ZSA9IGNhZmVfcGNpX3JlbW92ZSwKLSNpZmRlZiBDT05GSUdfUE0KLQkuc3VzcGVuZCA9IGNhZmVfcGNpX3N1c3BlbmQsCi0JLnJlc3VtZSA9IGNhZmVfcGNpX3Jlc3VtZSwKLSNlbmRpZgotfTsKLQotCi0KLQotc3RhdGljIGludCBfX2luaXQgY2FmZV9pbml0KHZvaWQpCi17Ci0JaW50IHJldDsKLQotCXByaW50ayhLRVJOX05PVElDRSAiTWFydmVsbCBNODhBTFAwMSAnQ0FGRScgQ2FtZXJhIENvbnRyb2xsZXIgdmVyc2lvbiAlZFxuIiwKLQkJCUNBRkVfVkVSU0lPTik7Ci0JcmV0ID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmY2FmZV9wY2lfZHJpdmVyKTsKLQlpZiAocmV0KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIHJlZ2lzdGVyIGNhZmVfY2NpYyBkcml2ZXJcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0JcmV0ID0gMDsKLQotICBvdXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgY2FmZV9leGl0KHZvaWQpCi17Ci0JcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZjYWZlX3BjaV9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChjYWZlX2luaXQpOwotbW9kdWxlX2V4aXQoY2FmZV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYTIvY3BpYTIuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYTIvY3BpYTIuaAppbmRleCA2ZDZkMTg0Li5hYjI1MjE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEyL2NwaWEyLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhMi9jcGlhMi5oCkBAIC0zMSw3ICszMSw2IEBACiAjaWZuZGVmIF9fQ1BJQTJfSF9fCiAjZGVmaW5lIF9fQ1BJQTJfSF9fCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KQEAgLTQzLDEwICs0Miw2IEBACiAvKiBkZWZpbmUgZm9yIHZlcmJvc2UgZGVidWcgb3V0cHV0ICovCiAvLyNkZWZpbmUgX0NQSUEyX0RFQlVHXwogCi0jZGVmaW5lIENQSUEyX01BSl9WRVIJMwotI2RlZmluZSBDUElBMl9NSU5fVkVSICAgMAotI2RlZmluZSBDUElBMl9QQVRDSF9WRVIJMAotCiAvKioqCiAgKiBJbWFnZSBkZWZpbmVzCiAgKioqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhMi9jcGlhMl92NGwuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3BpYTIvY3BpYTJfdjRsLmMKaW5kZXggNDBlYjYzMi4uMDc3ZWIxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jcGlhMi9jcGlhMl92NGwuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2NwaWEyL2NwaWEyX3Y0bC5jCkBAIC0yOSw4ICsyOSw3IEBACiAgKgkJQWxhbiBDb3ggPGFsYW5AbHhvcmd1ay51a3V1Lm9yZy51az4KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgotCisjZGVmaW5lIENQSUFfVkVSU0lPTiAiMy4wLjEiCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+CkBAIC04MCw2ICs3OSw3IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIlY0TC1kcml2ZXIgZm9yIFNUTWljcm9lbGVjdHJvbmljcyBDUGlBMiBiYXNlZCBjYW1lcmFzIik7CiBNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgidmlkZW8iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKENQSUFfVkVSU0lPTik7CiAKICNkZWZpbmUgQUJPVVQgIlY0TC1Ecml2ZXIgZm9yIFZpc2lvbiBDUGlBMiBiYXNlZCBjYW1lcmFzIgogCkBAIC00NjUsOSArNDY1LDYgQEAKIAlpZiAodXNiX21ha2VfcGF0aChjYW0tPmRldiwgdmMtPmJ1c19pbmZvLCBzaXplb2YodmMtPmJ1c19pbmZvKSkgPDApCiAJCW1lbXNldCh2Yy0+YnVzX2luZm8sMCwgc2l6ZW9mKHZjLT5idXNfaW5mbykpOwogCi0JdmMtPnZlcnNpb24gPSBLRVJORUxfVkVSU0lPTihDUElBMl9NQUpfVkVSLCBDUElBMl9NSU5fVkVSLAotCQkJCSAgICAgQ1BJQTJfUEFUQ0hfVkVSKTsKLQogCXZjLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKIAkJCSAgIFY0TDJfQ0FQX1JFQURXUklURSB8CiAJCQkgICBWNEwyX0NBUF9TVFJFQU1JTkc7CkBAIC0xNTU4LDggKzE1NTUsOCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIGludCBfX2luaXQgY3BpYTJfaW5pdCh2b2lkKQogewotCUxPRygiJXMgdiVkLiVkLiVkXG4iLAotCSAgICBBQk9VVCwgQ1BJQTJfTUFKX1ZFUiwgQ1BJQTJfTUlOX1ZFUiwgQ1BJQTJfUEFUQ0hfVkVSKTsKKwlMT0coIiVzIHYlc1xuIiwKKwkgICAgQUJPVVQsIENQSUFfVkVSU0lPTik7CiAJY2hlY2tfcGFyYW1ldGVycygpOwogCWNwaWEyX3VzYl9pbml0KCk7CiAJcmV0dXJuIDA7CkBAIC0xNTc5LDQgKzE1NzYsMyBAQAogCiBtb2R1bGVfaW5pdChjcGlhMl9pbml0KTsKIG1vZHVsZV9leGl0KGNwaWEyX2V4aXQpOwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1hbHNhLW1haW4uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWFsc2EtbWFpbi5jCmluZGV4IGQ1MGQ2OWQuLmExZTZjMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWFsc2EtbWFpbi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWFsc2EtbWFpbi5jCkBAIC0xOTIsNiArMTkyLDcgQEAKIGVycl9leGl0X2ZyZWU6CiAJaWYgKHNjICE9IE5VTEwpCiAJCXNuZF9jYXJkX2ZyZWUoc2MpOworCWtmcmVlKGN4c2MpOwogZXJyX2V4aXQ6CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWRyaXZlci5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZHJpdmVyLmgKaW5kZXggMDg2NDI3Mi4uMTgzNDIwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZHJpdmVyLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtZHJpdmVyLmgKQEAgLTI1LDcgKzI1LDYgQEAKICNpZm5kZWYgQ1gxOF9EUklWRVJfSAogI2RlZmluZSBDWDE4X0RSSVZFUl9ICiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1pb2N0bC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtaW9jdGwuYwppbmRleCBlODAxMzRmLi5hZmUwYTI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC1pb2N0bC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LWlvY3RsLmMKQEAgLTQ2OSw3ICs0NjksNiBAQAogCXN0cmxjcHkodmNhcC0+Y2FyZCwgY3gtPmNhcmRfbmFtZSwgc2l6ZW9mKHZjYXAtPmNhcmQpKTsKIAlzbnByaW50Zih2Y2FwLT5idXNfaW5mbywgc2l6ZW9mKHZjYXAtPmJ1c19pbmZvKSwKIAkJICJQQ0k6JXMiLCBwY2lfbmFtZShjeC0+cGNpX2RldikpOwotCXZjYXAtPnZlcnNpb24gPSBDWDE4X0RSSVZFUl9WRVJTSU9OOyAJICAgIC8qIHZlcnNpb24gKi8KIAl2Y2FwLT5jYXBhYmlsaXRpZXMgPSBjeC0+djRsMl9jYXA7IAkgICAgLyogY2FwYWJpbGl0aWVzICovCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC12ZXJzaW9uLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MTgvY3gxOC12ZXJzaW9uLmgKaW5kZXggY2QxODliNi4uZmVkNDhiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDE4L2N4MTgtdmVyc2lvbi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gxOC9jeDE4LXZlcnNpb24uaApAQCAtMjMsMTIgKzIzLDYgQEAKICNkZWZpbmUgQ1gxOF9WRVJTSU9OX0gKIAogI2RlZmluZSBDWDE4X0RSSVZFUl9OQU1FICJjeDE4IgotI2RlZmluZSBDWDE4X0RSSVZFUl9WRVJTSU9OX01BSk9SIDEKLSNkZWZpbmUgQ1gxOF9EUklWRVJfVkVSU0lPTl9NSU5PUiA1Ci0jZGVmaW5lIENYMThfRFJJVkVSX1ZFUlNJT05fUEFUQ0hMRVZFTCAwCi0KLSNkZWZpbmUgQ1gxOF9WRVJTSU9OIF9fc3RyaW5naWZ5KENYMThfRFJJVkVSX1ZFUlNJT05fTUFKT1IpICIuIiBfX3N0cmluZ2lmeShDWDE4X0RSSVZFUl9WRVJTSU9OX01JTk9SKSAiLiIgX19zdHJpbmdpZnkoQ1gxOF9EUklWRVJfVkVSU0lPTl9QQVRDSExFVkVMKQotI2RlZmluZSBDWDE4X0RSSVZFUl9WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKENYMThfRFJJVkVSX1ZFUlNJT05fTUFKT1IsIFwKLQlDWDE4X0RSSVZFUl9WRVJTSU9OX01JTk9SLCBDWDE4X0RSSVZFUl9WRVJTSU9OX1BBVENITEVWRUwpCisjZGVmaW5lIENYMThfVkVSU0lPTiAiMS41LjEiCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzMXh4L2N4MjMxeHgtYXZjb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjMxeHgvY3gyMzF4eC1hdmNvcmUuYwppbmRleCA4ZDc4MTM0Li41M2ZmMjZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjMxeHgvY3gyMzF4eC1hdmNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjMxeHgvY3gyMzF4eC1hdmNvcmUuYwpAQCAtMzU1LDYgKzM1NSw4IEBACiAJY2FzZSBDWDIzMVhYX0JPQVJEX0hBVVBQQVVHRV9FWEVURVI6CiAJY2FzZSBDWDIzMVhYX0JPQVJEX0hBVVBQQVVHRV9VU0JMSVZFMjoKIAljYXNlIENYMjMxWFhfQk9BUkRfUFZfUExBWVRWX1VTQl9IWUJSSUQ6CisJY2FzZSBDWDIzMVhYX0JPQVJEX0hBVVBQQVVHRV9VU0IyX0ZNX1BBTDoKKwljYXNlIENYMjMxWFhfQk9BUkRfSEFVUFBBVUdFX1VTQjJfRk1fTlRTQzoKIAkJaWYgKGF2bW9kZSA9PSBQT0xBUklTX0FWTU9ERV9BTkFMT0dUX1RWKSB7CiAJCQl3aGlsZSAoYWZlX3Bvd2VyX3N0YXR1cyAhPSAoRkxEX1BXUkROX1RVTklOR19CSUFTIHwKIAkJCQkJCUZMRF9QV1JETl9FTkFCTEVfUExMKSkgewpAQCAtMTczMyw2ICsxNzM1LDggQEAKIAkJYnJlYWs7CiAJY2FzZSBDWDIzMVhYX0JPQVJEX0NOWFRfUkRFXzI1M1M6CiAJY2FzZSBDWDIzMVhYX0JPQVJEX0NOWFRfUkRVXzI1M1M6CisJY2FzZSBDWDIzMVhYX0JPQVJEX0hBVVBQQVVHRV9VU0IyX0ZNX1BBTDoKKwljYXNlIENYMjMxWFhfQk9BUkRfSEFVUFBBVUdFX1VTQjJfRk1fTlRTQzoKIAkJZnVuY19tb2RlID0gMHgwMTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzF4eC9jeDIzMXh4LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjMxeHgvY3gyMzF4eC1jYXJkcy5jCmluZGV4IDIyNzAzODEuLjUzZGFlMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzF4eC9jeDIzMXh4LWNhcmRzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzMXh4L2N4MjMxeHgtY2FyZHMuYwpAQCAtMzg3LDYgKzM4Nyw3IEBACiAJCS5ub3JtID0gVjRMMl9TVERfTlRTQywKIAkJLm5vX2FsdF92YW5jID0gMSwKIAkJLmV4dGVybmFsX2F2ID0gMSwKKwkJLmRvbnRfdXNlX3BvcnRfMyA9IDEsCiAJCS5pbnB1dCA9IHt7CiAJCQkudHlwZSA9IENYMjMxWFhfVk1VWF9DT01QT1NJVEUxLAogCQkJLnZtdXggPSBDWDIzMVhYX1ZJTl8yXzEsCkBAIC01MzIsNiArNTMzLDc2IEBACiAJCQkuZ3BpbyA9IE5VTEwsCiAJCX0gfSwKIAl9LAorCVtDWDIzMVhYX0JPQVJEX0hBVVBQQVVHRV9VU0IyX0ZNX1BBTF0gPSB7CisJCS5uYW1lID0gIkhhdXBwYXVnZSBXaW5UViBVU0IyIEZNIChQQUwpIiwKKwkJLnR1bmVyX3R5cGUgPSBUVU5FUl9OWFBfVERBMTgyNzEsCisJCS50dW5lcl9hZGRyID0gMHg2MCwKKwkJLnR1bmVyX2dwaW8gPSBSREUyNTBfWENWX1RVTkVSLAorCQkudHVuZXJfc2lmX2dwaW8gPSAweDA1LAorCQkudHVuZXJfc2NsX2dwaW8gPSAweDFhLAorCQkudHVuZXJfc2RhX2dwaW8gPSAweDFiLAorCQkuZGVjb2RlciA9IENYMjMxWFhfQVZERUNPREVSLAorCQkub3V0cHV0X21vZGUgPSBPVVRfTU9ERV9WSVAxMSwKKwkJLmN0bF9waW5fc3RhdHVzX21hc2sgPSAweEZGRkZGRkM0LAorCQkuYWdjX2FuYWxvZ19kaWdpdGFsX3NlbGVjdF9ncGlvID0gMHgwYywKKwkJLmdwaW9fcGluX3N0YXR1c19tYXNrID0gMHg0MDAxMDAwLAorCQkudHVuZXJfaTJjX21hc3RlciA9IDEsCisJCS5ub3JtID0gVjRMMl9TVERfUEFMLAorCisJCS5pbnB1dCA9IHt7CisJCQkudHlwZSA9IENYMjMxWFhfVk1VWF9URUxFVklTSU9OLAorCQkJLnZtdXggPSBDWDIzMVhYX1ZJTl8zXzEsCisJCQkuYW11eCA9IENYMjMxWFhfQU1VWF9WSURFTywKKwkJCS5ncGlvID0gTlVMTCwKKwkJfSwgeworCQkJLnR5cGUgPSBDWDIzMVhYX1ZNVVhfQ09NUE9TSVRFMSwKKwkJCS52bXV4ID0gQ1gyMzFYWF9WSU5fMl8xLAorCQkJLmFtdXggPSBDWDIzMVhYX0FNVVhfTElORV9JTiwKKwkJCS5ncGlvID0gTlVMTCwKKwkJfSwgeworCQkJLnR5cGUgPSBDWDIzMVhYX1ZNVVhfU1ZJREVPLAorCQkJLnZtdXggPSBDWDIzMVhYX1ZJTl8xXzEgfAorCQkJCShDWDIzMVhYX1ZJTl8xXzIgPDwgOCkgfAorCQkJCUNYMjU4NDBfU1ZJREVPX09OLAorCQkJLmFtdXggPSBDWDIzMVhYX0FNVVhfTElORV9JTiwKKwkJCS5ncGlvID0gTlVMTCwKKwkJfSB9LAorCX0sCisJW0NYMjMxWFhfQk9BUkRfSEFVUFBBVUdFX1VTQjJfRk1fTlRTQ10gPSB7CisJCS5uYW1lID0gIkhhdXBwYXVnZSBXaW5UViBVU0IyIEZNIChOVFNDKSIsCisJCS50dW5lcl90eXBlID0gVFVORVJfTlhQX1REQTE4MjcxLAorCQkudHVuZXJfYWRkciA9IDB4NjAsCisJCS50dW5lcl9ncGlvID0gUkRFMjUwX1hDVl9UVU5FUiwKKwkJLnR1bmVyX3NpZl9ncGlvID0gMHgwNSwKKwkJLnR1bmVyX3NjbF9ncGlvID0gMHgxYSwKKwkJLnR1bmVyX3NkYV9ncGlvID0gMHgxYiwKKwkJLmRlY29kZXIgPSBDWDIzMVhYX0FWREVDT0RFUiwKKwkJLm91dHB1dF9tb2RlID0gT1VUX01PREVfVklQMTEsCisJCS5jdGxfcGluX3N0YXR1c19tYXNrID0gMHhGRkZGRkZDNCwKKwkJLmFnY19hbmFsb2dfZGlnaXRhbF9zZWxlY3RfZ3BpbyA9IDB4MGMsCisJCS5ncGlvX3Bpbl9zdGF0dXNfbWFzayA9IDB4NDAwMTAwMCwKKwkJLnR1bmVyX2kyY19tYXN0ZXIgPSAxLAorCQkubm9ybSA9IFY0TDJfU1REX05UU0MsCisKKwkJLmlucHV0ID0ge3sKKwkJCS50eXBlID0gQ1gyMzFYWF9WTVVYX1RFTEVWSVNJT04sCisJCQkudm11eCA9IENYMjMxWFhfVklOXzNfMSwKKwkJCS5hbXV4ID0gQ1gyMzFYWF9BTVVYX1ZJREVPLAorCQkJLmdwaW8gPSBOVUxMLAorCQl9LCB7CisJCQkudHlwZSA9IENYMjMxWFhfVk1VWF9DT01QT1NJVEUxLAorCQkJLnZtdXggPSBDWDIzMVhYX1ZJTl8yXzEsCisJCQkuYW11eCA9IENYMjMxWFhfQU1VWF9MSU5FX0lOLAorCQkJLmdwaW8gPSBOVUxMLAorCQl9LCB7CisJCQkudHlwZSA9IENYMjMxWFhfVk1VWF9TVklERU8sCisJCQkudm11eCA9IENYMjMxWFhfVklOXzFfMSB8CisJCQkJKENYMjMxWFhfVklOXzFfMiA8PCA4KSB8CisJCQkJQ1gyNTg0MF9TVklERU9fT04sCisJCQkuYW11eCA9IENYMjMxWFhfQU1VWF9MSU5FX0lOLAorCQkJLmdwaW8gPSBOVUxMLAorCQl9IH0sCisJfSwKIH07CiBjb25zdCB1bnNpZ25lZCBpbnQgY3gyMzF4eF9iY291bnQgPSBBUlJBWV9TSVpFKGN4MjMxeHhfYm9hcmRzKTsKIApAQCAtNTUzLDYgKzYyNCwxMCBAQAogCSAuZHJpdmVyX2luZm8gPSBDWDIzMVhYX0JPQVJEX0NOWFRfUkRFXzI1MH0sCiAJe1VTQl9ERVZJQ0UoMHgwNTcyLCAweDU4QTApLAogCSAuZHJpdmVyX2luZm8gPSBDWDIzMVhYX0JPQVJEX0NOWFRfUkRVXzI1MH0sCisJe1VTQl9ERVZJQ0UoMHgyMDQwLCAweGIxMTApLAorCSAuZHJpdmVyX2luZm8gPSBDWDIzMVhYX0JPQVJEX0hBVVBQQVVHRV9VU0IyX0ZNX1BBTH0sCisJe1VTQl9ERVZJQ0UoMHgyMDQwLCAweGIxMTEpLAorCSAuZHJpdmVyX2luZm8gPSBDWDIzMVhYX0JPQVJEX0hBVVBQQVVHRV9VU0IyX0ZNX05UU0N9LAogCXtVU0JfREVWSUNFKDB4MjA0MCwgMHhiMTIwKSwKIAkgLmRyaXZlcl9pbmZvID0gQ1gyMzFYWF9CT0FSRF9IQVVQUEFVR0VfRVhFVEVSfSwKIAl7VVNCX0RFVklDRSgweDIwNDAsIDB4YjE0MCksCkBAIC0xMDUxLDYgKzExMjYsOSBAQAogCWlmIChhc3NvY19kZXNjLT5iRmlyc3RJbnRlcmZhY2UgIT0gaWZudW0pIHsKIAkJY3gyMzF4eF9lcnIoRFJJVkVSX05BTUUgIjogTm90IGZvdW5kICIKIAkJCSAgICAibWF0Y2hpbmcgSUFEIGludGVyZmFjZVxuIik7CisJCWN4MjMxeHhfZGV2dXNlZCAmPSB+KDEgPDwgbnIpOworCQlrZnJlZShkZXYpOworCQlkZXYgPSBOVUxMOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzF4eC9jeDIzMXh4LWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzF4eC9jeDIzMXh4LWNvcmUuYwppbmRleCBhYmU1MDBmLi5kNDQ1N2Y5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjMxeHgvY3gyMzF4eC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzMXh4L2N4MjMxeHgtY29yZS5jCkBAIC03NDIsNiArNzQyLDggQEAKIAkJY2FzZSBDWDIzMVhYX0JPQVJEX0NOWFRfUkRVXzI1M1M6CiAJCWNhc2UgQ1gyMzFYWF9CT0FSRF9IQVVQUEFVR0VfRVhFVEVSOgogCQljYXNlIENYMjMxWFhfQk9BUkRfUFZfUExBWVRWX1VTQl9IWUJSSUQ6CisJCWNhc2UgQ1gyMzFYWF9CT0FSRF9IQVVQUEFVR0VfVVNCMl9GTV9QQUw6CisJCWNhc2UgQ1gyMzFYWF9CT0FSRF9IQVVQUEFVR0VfVVNCMl9GTV9OVFNDOgogCQllcnJDb2RlID0gY3gyMzF4eF9zZXRfYWdjX2FuYWxvZ19kaWdpdGFsX211eF9zZWxlY3QoZGV2LCAwKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgpAQCAtMTM4MSw2ICsxMzgzLDggQEAKIAljYXNlIENYMjMxWFhfQk9BUkRfQ05YVF9SRFVfMjUzUzoKIAljYXNlIENYMjMxWFhfQk9BUkRfSEFVUFBBVUdFX0VYRVRFUjoKIAljYXNlIENYMjMxWFhfQk9BUkRfUFZfUExBWVRWX1VTQl9IWUJSSUQ6CisJY2FzZSBDWDIzMVhYX0JPQVJEX0hBVVBQQVVHRV9VU0IyX0ZNX1BBTDoKKwljYXNlIENYMjMxWFhfQk9BUkRfSEFVUFBBVUdFX1VTQjJfRk1fTlRTQzoKIAllcnJDb2RlID0gY3gyMzF4eF9zZXRfYWdjX2FuYWxvZ19kaWdpdGFsX211eF9zZWxlY3QoZGV2LCAwKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzF4eC9jeDIzMXh4LXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjMxeHgvY3gyMzF4eC12aWRlby5jCmluZGV4IGE2OWMyNGQuLjZlODFmOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzF4eC9jeDIzMXh4LXZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzMXh4L2N4MjMxeHgtdmlkZW8uYwpAQCAtMjksNyArMjksNiBAQAogI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtNDUsNyArNDQsNyBAQAogI2luY2x1ZGUgImN4MjMxeHguaCIKICNpbmNsdWRlICJjeDIzMXh4LXZiaS5oIgogCi0jZGVmaW5lIENYMjMxWFhfVkVSU0lPTl9DT0RFICAgICAgICAgICAgS0VSTkVMX1ZFUlNJT04oMCwgMCwgMSkKKyNkZWZpbmUgQ1gyMzFYWF9WRVJTSU9OICIwLjAuMiIKIAogI2RlZmluZSBEUklWRVJfQVVUSE9SICAgIlNyaW5pdmFzYSBEZWV2aSA8c3Jpbml2YXNhLmRlZXZpQGNvbmV4YW50LmNvbT4iCiAjZGVmaW5lIERSSVZFUl9ERVNDICAgICAiQ29uZXhhbnQgY3gyMzF4eCBiYXNlZCBVU0IgdmlkZW8gZGV2aWNlIGRyaXZlciIKQEAgLTcwLDYgKzY5LDcgQEAKIE1PRFVMRV9BVVRIT1IoRFJJVkVSX0FVVEhPUik7CiBNT0RVTEVfREVTQ1JJUFRJT04oRFJJVkVSX0RFU0MpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oQ1gyMzFYWF9WRVJTSU9OKTsKIAogc3RhdGljIHVuc2lnbmVkIGludCBjYXJkW10gICAgID0ge1swIC4uLiAoQ1gyMzFYWF9NQVhCT0FSRFMgLSAxKV0gPSBVTlNFVCB9Owogc3RhdGljIHVuc2lnbmVkIGludCB2aWRlb19ucltdID0ge1swIC4uLiAoQ1gyMzFYWF9NQVhCT0FSRFMgLSAxKV0gPSBVTlNFVCB9OwpAQCAtMTE3OSw3ICsxMTc5LDggQEAKIHsKIAlzdHJ1Y3QgY3gyMzF4eF9maCAqZmggPSBwcml2OwogCXN0cnVjdCBjeDIzMXh4ICpkZXYgPSBmaC0+ZGV2OwotCXVuc2lnbmVkIGludCBuOworCXUzMiBnZW5fc3RhdDsKKwl1bnNpZ25lZCBpbnQgcmV0LCBuOwogCiAJbiA9IGktPmluZGV4OwogCWlmIChuID49IE1BWF9DWDIzMVhYX0lOUFVUKQpAQCAtMTE5OCw2ICsxMTk5LDE4IEBACiAKIAlpLT5zdGQgPSBkZXYtPnZkZXYtPnR2bm9ybXM7CiAKKwkvKiBJZiB0aGV5IGFyZSBhc2tpbmcgYWJvdXQgdGhlIGFjdGl2ZSBpbnB1dCwgcmVhZCBzaWduYWwgc3RhdHVzICovCisJaWYgKG4gPT0gZGV2LT52aWRlb19pbnB1dCkgeworCQlyZXQgPSBjeDIzMXh4X3JlYWRfaTJjX2RhdGEoZGV2LCBWSURfQkxLX0kyQ19BRERSRVNTLAorCQkJCQkgICAgR0VOX1NUQVQsIDIsICZnZW5fc3RhdCwgNCk7CisJCWlmIChyZXQgPiAwKSB7CisJCQlpZiAoKGdlbl9zdGF0ICYgRkxEX1ZQUkVTKSA9PSAweDAwKQorCQkJCWktPnN0YXR1cyB8PSBWNEwyX0lOX1NUX05PX1NJR05BTDsKKwkJCWlmICgoZ2VuX3N0YXQgJiBGTERfSExPQ0spID09IDB4MDApCisJCQkJaS0+c3RhdHVzIHw9IFY0TDJfSU5fU1RfTk9fSF9MT0NLOworCQl9CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE4NjksOCArMTg4Miw2IEBACiAJc3RybGNweShjYXAtPmNhcmQsIGN4MjMxeHhfYm9hcmRzW2Rldi0+bW9kZWxdLm5hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKIAl1c2JfbWFrZV9wYXRoKGRldi0+dWRldiwgY2FwLT5idXNfaW5mbywgc2l6ZW9mKGNhcC0+YnVzX2luZm8pKTsKIAotCWNhcC0+dmVyc2lvbiA9IENYMjMxWFhfVkVSU0lPTl9DT0RFOwotCiAJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WQklfQ0FQVFVSRSB8CiAjaWYgMAogCQlWNEwyX0NBUF9TTElDRURfVkJJX0NBUFRVUkUgfApAQCAtMjA1Nyw3ICsyMDY4LDYgQEAKIAlzdHJsY3B5KGNhcC0+Y2FyZCwgY3gyMzF4eF9ib2FyZHNbZGV2LT5tb2RlbF0ubmFtZSwgc2l6ZW9mKGNhcC0+Y2FyZCkpOwogCXVzYl9tYWtlX3BhdGgoZGV2LT51ZGV2LCBjYXAtPmJ1c19pbmZvLCBzaXplb2YoY2FwLT5idXNfaW5mbykpOwogCi0JY2FwLT52ZXJzaW9uID0gQ1gyMzFYWF9WRVJTSU9OX0NPREU7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUjsKIAlyZXR1cm4gMDsKIH0KQEAgLTI1NzAsMTEgKzI1ODAsOCBAQAogewogCWludCByZXQ7CiAKLQljeDIzMXh4X2luZm8oIiVzOiB2NGwyIGRyaXZlciB2ZXJzaW9uICVkLiVkLiVkXG4iLAotCQkgICAgIGRldi0+bmFtZSwKLQkJICAgICAoQ1gyMzFYWF9WRVJTSU9OX0NPREUgPj4gMTYpICYgMHhmZiwKLQkJICAgICAoQ1gyMzFYWF9WRVJTSU9OX0NPREUgPj4gOCkgJiAweGZmLAotCQkgICAgIENYMjMxWFhfVkVSU0lPTl9DT0RFICYgMHhmZik7CisJY3gyMzF4eF9pbmZvKCIlczogdjRsMiBkcml2ZXIgdmVyc2lvbiAlc1xuIiwKKwkJICAgICBkZXYtPm5hbWUsIENYMjMxWFhfVkVSU0lPTik7CiAKIAkvKiBzZXQgZGVmYXVsdCBub3JtICovCiAJLypkZXYtPm5vcm0gPSBjeDIzMXh4X3ZpZGVvX3RlbXBsYXRlLmN1cnJlbnRfbm9ybTsgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzF4eC9jeDIzMXh4LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjMxeHgvY3gyMzF4eC5oCmluZGV4IDQ2ZGQ4NDAuLjIwMDBiYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzF4eC9jeDIzMXh4LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzMXh4L2N4MjMxeHguaApAQCAtNDMsNyArNDMsNyBAQAogI2luY2x1ZGUgImN4MjMxeHgtY29uZi1yZWcuaCIKIAogI2RlZmluZSBEUklWRVJfTkFNRSAgICAgICAgICAgICAgICAgICAgICJjeDIzMXh4IgotI2RlZmluZSBQV1JfU0xFRVBfSU5URVJWQUwgICAgICAgICAgICAgIDUKKyNkZWZpbmUgUFdSX1NMRUVQX0lOVEVSVkFMICAgICAgICAgICAgICAxMAogCiAvKiBJMkMgYWRkcmVzc2VzIGZvciBjb250cm9sIGJsb2NrIGluIEN4MjMxeHggKi8KICNkZWZpbmUgICAgIEFGRV9ERVZJQ0VfQUREUkVTUwkJMHg2MApAQCAtNjcsNiArNjcsOCBAQAogI2RlZmluZSBDWDIzMVhYX0JPQVJEX1BWX1hDQVBUVVJFX1VTQiAxMQogI2RlZmluZSBDWDIzMVhYX0JPQVJEX0tXT1JMRF9VQjQzMF9VU0JfSFlCUklEIDEyCiAjZGVmaW5lIENYMjMxWFhfQk9BUkRfSUNPTkJJVF9VMTAwIDEzCisjZGVmaW5lIENYMjMxWFhfQk9BUkRfSEFVUFBBVUdFX1VTQjJfRk1fUEFMIDE0CisjZGVmaW5lIENYMjMxWFhfQk9BUkRfSEFVUFBBVUdFX1VTQjJfRk1fTlRTQyAxNQogCiAvKiBMaW1pdHMgbWluaW11bSBhbmQgZGVmYXVsdCBudW1iZXIgb2YgYnVmZmVycyAqLwogI2RlZmluZSBDWDIzMVhYX01JTl9CVUYgICAgICAgICAgICAgICAgIDQKQEAgLTExMiw3ICsxMTQsNiBAQAogCVY0TDJfU1REX1BBTF9CRyB8ICBWNEwyX1NURF9QQUxfREsgICAgfCAgVjRMMl9TVERfUEFMX0kgICAgfCBcCiAJVjRMMl9TVERfUEFMX00gIHwgIFY0TDJfU1REX1BBTF9OICAgICB8ICBWNEwyX1NURF9QQUxfTmMgICB8IFwKIAlWNEwyX1NURF9QQUxfNjAgfCAgVjRMMl9TVERfU0VDQU1fTCAgIHwgIFY0TDJfU1REX1NFQ0FNX0RLKQotI2RlZmluZSBDWDIzMXh4X1ZFUlNJT05fQ09ERSBLRVJORUxfVkVSU0lPTigwLCAwLCAyKQogCiAjZGVmaW5lIFNMRUVQX1M1SDE0MzIgICAgMzAKICNkZWZpbmUgQ1gyMzQxN19PU0NfRU4gICA4CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvYWx0ZXJhLWNpLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvYWx0ZXJhLWNpLmMKaW5kZXggNjc4NTM5Yi4uMWZhODkyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2FsdGVyYS1jaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9hbHRlcmEtY2kuYwpAQCAtNTIsNyArNTIsNiBAQAogICogfCAgREFUQTd8ICBEQVRBNnwgIERBVEE1fCAgREFUQTR8ICBEQVRBM3wgIERBVEEyfCAgREFUQTF8ICBEQVRBMHwKICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCiAgKi8KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYtZG1hLXNnLmg+CiAjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYtZHZiLmg+CiAjaW5jbHVkZSAiYWx0ZXJhLWNpLmgiCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS00MTcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LTQxNy5jCmluZGV4IDlhOThkYzUuLjY3YzRhNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LTQxNy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LTQxNy5jCkBAIC0xMzU5LDcgKzEzNTksNiBAQAogCXN0cmxjcHkoY2FwLT5jYXJkLCBjeDIzODg1X2JvYXJkc1t0c3BvcnQtPmRldi0+Ym9hcmRdLm5hbWUsCiAJCXNpemVvZihjYXAtPmNhcmQpKTsKIAlzcHJpbnRmKGNhcC0+YnVzX2luZm8sICJQQ0k6JXMiLCBwY2lfbmFtZShkZXYtPnBjaSkpOwotCWNhcC0+dmVyc2lvbiA9IENYMjM4ODVfVkVSU0lPTl9DT0RFOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0KIAkJVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8CiAJCVY0TDJfQ0FQX1JFQURXUklURSAgICAgfApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWNhcmRzLmMKaW5kZXggOTM0MTg1Yy4uNzZiNzU2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1jYXJkcy5jCkBAIC0yOSwxMSArMjksMTcgQEAKICNpbmNsdWRlICIuLi8uLi8uLi9zdGFnaW5nL2FsdGVyYS1zdGFwbC9hbHRlcmEuaCIKICNpbmNsdWRlICJjeDIzODg1LmgiCiAjaW5jbHVkZSAidHVuZXIteGMyMDI4LmgiCisjaW5jbHVkZSAibmV0dXAtZWVwcm9tLmgiCiAjaW5jbHVkZSAibmV0dXAtaW5pdC5oIgogI2luY2x1ZGUgImFsdGVyYS1jaS5oIgorI2luY2x1ZGUgInhjNDAwMC5oIgogI2luY2x1ZGUgInhjNTAwMC5oIgogI2luY2x1ZGUgImN4MjM4ODgtaXIuaCIKIAorc3RhdGljIHVuc2lnbmVkIGludCBuZXR1cF9jYXJkX3JldiA9IDE7Cittb2R1bGVfcGFyYW0obmV0dXBfY2FyZF9yZXYsIGludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKG5ldHVwX2NhcmRfcmV2LAorCQkiTmV0VVAgRHVhbCBEVkItVC9DIENJIGNhcmQgcmV2aXNpb24iKTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZW5hYmxlXzg4NV9pcjsKIG1vZHVsZV9wYXJhbShlbmFibGVfODg1X2lyLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhlbmFibGVfODg1X2lyLApAQCAtMTc1LDYgKzE4MSwzNCBAQAogCQkubmFtZQkJPSAiTGVhZHRlayBXaW5mYXN0IFB4RFZSMzIwMCBIIiwKIAkJLnBvcnRjCQk9IENYMjM4ODVfTVBFR19EVkIsCiAJfSwKKwlbQ1gyMzg4NV9CT0FSRF9MRUFEVEVLX1dJTkZBU1RfUFhEVlIzMjAwX0hfWEM0MDAwXSA9IHsKKwkJLm5hbWUJCT0gIkxlYWR0ZWsgV2luZmFzdCBQeERWUjMyMDAgSCBYQzQwMDAiLAorCQkucG9ydGEJCT0gQ1gyMzg4NV9BTkFMT0dfVklERU8sCisJCS5wb3J0YwkJPSBDWDIzODg1X01QRUdfRFZCLAorCQkudHVuZXJfdHlwZQk9IFRVTkVSX1hDNDAwMCwKKwkJLnR1bmVyX2FkZHIJPSAweDYxLAorCQkucmFkaW9fdHlwZQk9IFRVTkVSX1hDNDAwMCwKKwkJLnJhZGlvX2FkZHIJPSAweDYxLAorCQkuaW5wdXQJCT0ge3sKKwkJCS50eXBlCT0gQ1gyMzg4NV9WTVVYX1RFTEVWSVNJT04sCisJCQkudm11eAk9IENYMjU4NDBfVklOMl9DSDEgfAorCQkJCSAgQ1gyNTg0MF9WSU41X0NIMiB8CisJCQkJICBDWDI1ODQwX05PTkUwX0NIMywKKwkJfSwgeworCQkJLnR5cGUJPSBDWDIzODg1X1ZNVVhfQ09NUE9TSVRFMSwKKwkJCS52bXV4CT0gQ1gyNTg0MF9DT01QT1NJVEUxLAorCQl9LCB7CisJCQkudHlwZQk9IENYMjM4ODVfVk1VWF9TVklERU8sCisJCQkudm11eAk9IENYMjU4NDBfU1ZJREVPX0xVTUEzIHwKKwkJCQkgIENYMjU4NDBfU1ZJREVPX0NIUk9NQTQsCisJCX0sIHsKKwkJCS50eXBlCT0gQ1gyMzg4NV9WTVVYX0NPTVBPTkVOVCwKKwkJCS52bXV4CT0gQ1gyNTg0MF9WSU43X0NIMSB8CisJCQkJICBDWDI1ODQwX1ZJTjZfQ0gyIHwKKwkJCQkgIENYMjU4NDBfVklOOF9DSDMgfAorCQkJCSAgQ1gyNTg0MF9DT01QT05FTlRfT04sCisJCX0gfSwKKwl9LAogCVtDWDIzODg1X0JPQVJEX0NPTVBST19WSURFT01BVEVfRTY1MEZdID0gewogCQkubmFtZQkJPSAiQ29tcHJvIFZpZGVvTWF0ZSBFNjUwRiIsCiAJCS5wb3J0YwkJPSBDWDIzODg1X01QRUdfRFZCLApAQCAtNDMzLDYgKzQ2NywxMCBAQAogCQkuc3ViZGV2aWNlID0gMHg2NjgxLAogCQkuY2FyZCAgICAgID0gQ1gyMzg4NV9CT0FSRF9MRUFEVEVLX1dJTkZBU1RfUFhEVlIzMjAwX0gsCiAJfSwgeworCQkuc3VidmVuZG9yID0gMHgxMDdkLAorCQkuc3ViZGV2aWNlID0gMHg2ZjM5LAorCQkuY2FyZAkgICA9IENYMjM4ODVfQk9BUkRfTEVBRFRFS19XSU5GQVNUX1BYRFZSMzIwMF9IX1hDNDAwMCwKKwl9LCB7CiAJCS5zdWJ2ZW5kb3IgPSAweDE4NWIsCiAJCS5zdWJkZXZpY2UgPSAweGU4MDAsCiAJCS5jYXJkICAgICAgPSBDWDIzODg1X0JPQVJEX0NPTVBST19WSURFT01BVEVfRTY1MEYsCkBAIC03NDksNiArNzg3LDcgQEAKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE1MDA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxNTAwUToKIAljYXNlIENYMjM4ODVfQk9BUkRfTEVBRFRFS19XSU5GQVNUX1BYRFZSMzIwMF9IOgorCWNhc2UgQ1gyMzg4NV9CT0FSRF9MRUFEVEVLX1dJTkZBU1RfUFhEVlIzMjAwX0hfWEM0MDAwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9DT01QUk9fVklERU9NQVRFX0U2NTBGOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9DT01QUk9fVklERU9NQVRFX0U4MDA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0xFQURURUtfV0lORkFTVF9QWFRWMTIwMDoKQEAgLTkwOSw2ICs5NDgsNyBAQAogCQljeF9zZXQoR1AwX0lPLCAweDAwMGYwMDBmKTsKIAkJYnJlYWs7CiAJY2FzZSBDWDIzODg1X0JPQVJEX0xFQURURUtfV0lORkFTVF9QWERWUjMyMDBfSDoKKwljYXNlIENYMjM4ODVfQk9BUkRfTEVBRFRFS19XSU5GQVNUX1BYRFZSMzIwMF9IX1hDNDAwMDoKIAljYXNlIENYMjM4ODVfQk9BUkRfQ09NUFJPX1ZJREVPTUFURV9FNjUwRjoKIAljYXNlIENYMjM4ODVfQk9BUkRfQ09NUFJPX1ZJREVPTUFURV9FODAwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9MRUFEVEVLX1dJTkZBU1RfUFhUVjEyMDA6CkBAIC0xMDk3LDEyICsxMTM3LDE5IEBACiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxODAwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTIwMDoKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE0MDA6Ci0JY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjcwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTI3NToKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyNTU6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjEwOgogCQkvKiBGSVhNRTogSW1wbGVtZW50IG1lICovCiAJCWJyZWFrOworCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTI3MDoKKwkJcmV0ID0gY3gyMzg4OF9pcl9wcm9iZShkZXYpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJCWRldi0+c2RfaXIgPSBjeDIzODg1X2ZpbmRfaHcoZGV2LCBDWDIzODg1X0hXXzg4OF9JUik7CisJCXY0bDJfc3ViZGV2X2NhbGwoZGV2LT5zZF9jeDI1ODQwLCBjb3JlLCBzX2lvX3Bpbl9jb25maWcsCisJCQkJIGlyX3J4X3Bpbl9jZmdfY291bnQsIGlyX3J4X3Bpbl9jZmcpOworCQlicmVhazsKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE4NTA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjkwOgogCQlyZXQgPSBjeDIzODg4X2lyX3Byb2JlKGRldik7CkBAIC0xMTU2LDYgKzEyMDMsNyBAQAogdm9pZCBjeDIzODg1X2lyX2Zpbmkoc3RydWN0IGN4MjM4ODVfZGV2ICpkZXYpCiB7CiAJc3dpdGNoIChkZXYtPmJvYXJkKSB7CisJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjcwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTg1MDoKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyOTA6CiAJCWN4MjM4ODVfaXJxX3JlbW92ZShkZXYsIFBDSV9NU0tfSVIpOwpAQCAtMTE5OSw2ICsxMjQ3LDcgQEAKIHZvaWQgY3gyMzg4NV9pcl9wY2lfaW50X2VuYWJsZShzdHJ1Y3QgY3gyMzg4NV9kZXYgKmRldikKIHsKIAlzd2l0Y2ggKGRldi0+Ym9hcmQpIHsKKwljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyNzA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxODUwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTI5MDoKIAkJaWYgKGRldi0+c2RfaXIpCkBAIC0xMzI1LDYgKzEzNzQsNyBAQAogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTcwMDoKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE0MDA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0xFQURURUtfV0lORkFTVF9QWERWUjMyMDBfSDoKKwljYXNlIENYMjM4ODVfQk9BUkRfTEVBRFRFS19XSU5GQVNUX1BYRFZSMzIwMF9IX1hDNDAwMDoKIAljYXNlIENYMjM4ODVfQk9BUkRfQ09NUFJPX1ZJREVPTUFURV9FNjUwRjoKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyNzA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjc1OgpAQCAtMTM1MywxMCArMTQwMywxMiBAQAogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTgwMGxwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTcwMDoKIAljYXNlIENYMjM4ODVfQk9BUkRfTEVBRFRFS19XSU5GQVNUX1BYRFZSMzIwMF9IOgorCWNhc2UgQ1gyMzg4NV9CT0FSRF9MRUFEVEVLX1dJTkZBU1RfUFhEVlIzMjAwX0hfWEM0MDAwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9DT01QUk9fVklERU9NQVRFX0U2NTBGOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9ORVRVUF9EVUFMX0RWQlMyX0NJOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9ORVRVUF9EVUFMX0RWQl9UX0NfQ0lfUkY6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0NPTVBST19WSURFT01BVEVfRTgwMDoKKwljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyNzA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxODUwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9NWUdJQ0FfWDg1MDY6CiAJY2FzZSBDWDIzODg1X0JPQVJEX01BR0lDUFJPX1BST0hEVFZFMjoKQEAgLTEzODMsNiArMTQzNSw3IEBACiAJCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CiAJCWNvbnN0IGNoYXIgKmZpbGVuYW1lID0gImR2Yi1uZXR1cC1hbHRlcmEtMDEuZnciOwogCQljaGFyICphY3Rpb24gPSAiY29uZmlndXJlIjsKKwkJc3RhdGljIHN0cnVjdCBuZXR1cF9jYXJkX2luZm8gY2luZm87CiAJCXN0cnVjdCBhbHRlcmFfY29uZmlnIG5ldHVwX2NvbmZpZyA9IHsKIAkJCS5kZXYgPSBkZXYsCiAJCQkuYWN0aW9uID0gYWN0aW9uLApAQCAtMTM5MSw2ICsxNDQ0LDIxIEBACiAKIAkJbmV0dXBfaW5pdGlhbGl6ZShkZXYpOwogCisJCW5ldHVwX2dldF9jYXJkX2luZm8oJmRldi0+aTJjX2J1c1swXS5pMmNfYWRhcCwgJmNpbmZvKTsKKwkJaWYgKG5ldHVwX2NhcmRfcmV2KQorCQkJY2luZm8ucmV2ID0gbmV0dXBfY2FyZF9yZXY7CisKKwkJc3dpdGNoIChjaW5mby5yZXYpIHsKKwkJY2FzZSAweDQ6CisJCQlmaWxlbmFtZSA9ICJkdmItbmV0dXAtYWx0ZXJhLTA0LmZ3IjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZmlsZW5hbWUgPSAiZHZiLW5ldHVwLWFsdGVyYS0wMS5mdyI7CisJCQlicmVhazsKKwkJfQorCQlwcmludGsoS0VSTl9JTkZPICJOZXRVUCBjYXJkIHJldj0weCV4IGZ3X2ZpbGVuYW1lPSVzXG4iLAorCQkJCWNpbmZvLnJldiwgZmlsZW5hbWUpOworCiAJCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmaWxlbmFtZSwgJmRldi0+cGNpLT5kZXYpOwogCQlpZiAocmV0ICE9IDApCiAJCQlwcmludGsoS0VSTl9FUlIgImRpZCBub3QgZmluZCB0aGUgZmlybXdhcmUgZmlsZS4gKCVzKSAiCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1jb3JlLmMKaW5kZXggNDE5Nzc3YS4uZWU0MWE4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWNvcmUuYwpAQCAtNDIsNiArNDIsNyBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIGN4MjM4ODUgYmFzZWQgVFYgY2FyZHMiKTsKIE1PRFVMRV9BVVRIT1IoIlN0ZXZlbiBUb3RoIDxzdG90aEBsaW51eHR2Lm9yZz4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKENYMjM4ODVfVkVSU0lPTik7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZGVidWc7CiBtb2R1bGVfcGFyYW0oZGVidWcsIGludCwgMDY0NCk7CkBAIC0yMTQ3LDE0ICsyMTQ4LDggQEAKIAogc3RhdGljIGludCBfX2luaXQgY3gyMzg4NV9pbml0KHZvaWQpCiB7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiY3gyMzg4NSBkcml2ZXIgdmVyc2lvbiAlZC4lZC4lZCBsb2FkZWRcbiIsCi0JICAgICAgIChDWDIzODg1X1ZFUlNJT05fQ09ERSA+PiAxNikgJiAweGZmLAotCSAgICAgICAoQ1gyMzg4NV9WRVJTSU9OX0NPREUgPj4gIDgpICYgMHhmZiwKLQkgICAgICAgQ1gyMzg4NV9WRVJTSU9OX0NPREUgJiAweGZmKTsKLSNpZmRlZiBTTkFQU0hPVAotCXByaW50ayhLRVJOX0lORk8gImN4MjM4ODU6IHNuYXBzaG90IGRhdGUgJTA0ZC0lMDJkLSUwMmRcbiIsCi0JICAgICAgIFNOQVBTSE9ULzEwMDAwLCAoU05BUFNIT1QvMTAwKSUxMDAsIFNOQVBTSE9UJTEwMCk7Ci0jZW5kaWYKKwlwcmludGsoS0VSTl9JTkZPICJjeDIzODg1IGRyaXZlciB2ZXJzaW9uICVzIGxvYWRlZFxuIiwKKwkJQ1gyMzg4NV9WRVJTSU9OKTsKIAlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmY3gyMzg4NV9wY2lfZHJpdmVyKTsKIH0KIApAQCAtMjE2NSw1ICsyMTYwLDMgQEAKIAogbW9kdWxlX2luaXQoY3gyMzg4NV9pbml0KTsKIG1vZHVsZV9leGl0KGN4MjM4ODVfZmluaSk7Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWR2Yi5jCmluZGV4IDNjMzE1ZjkuLmFhODNmMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWR2Yi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWR2Yi5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSAidGRhODI5MC5oIgogI2luY2x1ZGUgInRkYTE4MjcxLmgiCiAjaW5jbHVkZSAibGdkdDMzMHguaCIKKyNpbmNsdWRlICJ4YzQwMDAuaCIKICNpbmNsdWRlICJ4YzUwMDAuaCIKICNpbmNsdWRlICJtYXgyMTY1LmgiCiAjaW5jbHVkZSAidGRhMTAwNDguaCIKQEAgLTkyMSw2ICs5MjIsMjYgQEAKIAkJCQlmZS0+b3BzLnR1bmVyX29wcy5zZXRfY29uZmlnKGZlLCAmY3RsKTsKIAkJfQogCQlicmVhazsKKwljYXNlIENYMjM4ODVfQk9BUkRfTEVBRFRFS19XSU5GQVNUX1BYRFZSMzIwMF9IX1hDNDAwMDoKKwkJaTJjX2J1cyA9ICZkZXYtPmkyY19idXNbMF07CisKKwkJZmUwLT5kdmIuZnJvbnRlbmQgPSBkdmJfYXR0YWNoKHpsMTAzNTNfYXR0YWNoLAorCQkJCQkgICAgICAgJmR2aWNvX2Z1c2lvbmhkdHZfeGMzMDI4LAorCQkJCQkgICAgICAgJmkyY19idXMtPmkyY19hZGFwKTsKKwkJaWYgKGZlMC0+ZHZiLmZyb250ZW5kICE9IE5VTEwpIHsKKwkJCXN0cnVjdCBkdmJfZnJvbnRlbmQJKmZlOworCQkJc3RydWN0IHhjNDAwMF9jb25maWcJY2ZnID0geworCQkJCS5pMmNfYWRkcmVzcwkgID0gMHg2MSwKKwkJCQkuZGVmYXVsdF9wbQkgID0gMCwKKwkJCQkuZHZiX2FtcGxpdHVkZQkgID0gMTM0LAorCQkJCS5zZXRfc21vb3RoZWRjdmJzID0gMSwKKwkJCQkuaWZfa2h6CQkgID0gNDU2MAorCQkJfTsKKworCQkJZmUgPSBkdmJfYXR0YWNoKHhjNDAwMF9hdHRhY2gsIGZlMC0+ZHZiLmZyb250ZW5kLAorCQkJCQkmZGV2LT5pMmNfYnVzWzFdLmkyY19hZGFwLCAmY2ZnKTsKKwkJfQorCQlicmVhazsKIAljYXNlIENYMjM4ODVfQk9BUkRfVEJTXzY5MjA6CiAJCWkyY19idXMgPSAmZGV2LT5pMmNfYnVzWzFdOwogCkBAIC0xMjQ5LDcgKzEyNzAsNyBAQAogCSAqIGltcGxlbWVudCBNRkUgc3VwcG9ydC4KIAkgKi8KIAlmZTAgPSB2aWRlb2J1Zl9kdmJfZ2V0X2Zyb250ZW5kKCZwb3J0LT5mcm9udGVuZHMsIDEpOwotCWlmIChmZTAtPmR2Yi5mcm9udGVuZCkKKwlpZiAoZmUwICYmIGZlMC0+ZHZiLmZyb250ZW5kKQogCQl2aWRlb2J1Zl9kdmJfdW5yZWdpc3Rlcl9idXMoJnBvcnQtPmZyb250ZW5kcyk7CiAKIAlzd2l0Y2ggKHBvcnQtPmRldi0+Ym9hcmQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWlucHV0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS1pbnB1dC5jCmluZGV4IGU5N2NhZmQuLmNlNzY1ZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LWlucHV0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtaW5wdXQuYwpAQCAtODIsNiArODIsNyBAQAogCQlyZXR1cm47CiAKIAlzd2l0Y2ggKGRldi0+Ym9hcmQpIHsKKwljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyNzA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxODUwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTI5MDoKIAljYXNlIENYMjM4ODVfQk9BUkRfVEVWSUlfUzQ3MDoKQEAgLTEzMyw2ICsxMzQsNyBAQAogCiAJdjRsMl9zdWJkZXZfY2FsbChkZXYtPnNkX2lyLCBpciwgcnhfZ19wYXJhbWV0ZXJzLCAmcGFyYW1zKTsKIAlzd2l0Y2ggKGRldi0+Ym9hcmQpIHsKKwljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyNzA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxODUwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTI5MDoKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjEyNTA6CkBAIC0yMjksNiArMjMxLDkgQEAKIAkJdjRsMl9zdWJkZXZfY2FsbChkZXYtPnNkX2lyLCBpciwgcnhfc19wYXJhbWV0ZXJzLCAmcGFyYW1zKTsKIAkJdjRsMl9zdWJkZXZfY2FsbChkZXYtPnNkX2lyLCBpciwgcnhfZ19wYXJhbWV0ZXJzLCAmcGFyYW1zKTsKIAl9CisJZmx1c2hfd29ya19zeW5jKCZkZXYtPmN4MjU4NDBfd29yayk7CisJZmx1c2hfd29ya19zeW5jKCZkZXYtPmlyX3J4X3dvcmspOworCWZsdXNoX3dvcmtfc3luYygmZGV2LT5pcl90eF93b3JrKTsKIH0KIAogc3RhdGljIHZvaWQgY3gyMzg4NV9pbnB1dF9pcl9jbG9zZShzdHJ1Y3QgcmNfZGV2ICpyYykKQEAgLTI1Nyw2ICsyNjIsNyBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXN3aXRjaCAoZGV2LT5ib2FyZCkgeworCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTI3MDoKIAljYXNlIENYMjM4ODVfQk9BUkRfSEFVUFBBVUdFX0hWUjE4NTA6CiAJY2FzZSBDWDIzODg1X0JPQVJEX0hBVVBQQVVHRV9IVlIxMjkwOgogCWNhc2UgQ1gyMzg4NV9CT0FSRF9IQVVQUEFVR0VfSFZSMTI1MDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS12aWRlby5jCmluZGV4IGVlNTdmNmIuLjg5NmJiMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LXZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUtdmlkZW8uYwpAQCAtMTAwMCw3ICsxMDAwLDYgQEAKIAlzdHJsY3B5KGNhcC0+Y2FyZCwgY3gyMzg4NV9ib2FyZHNbZGV2LT5ib2FyZF0ubmFtZSwKIAkJc2l6ZW9mKGNhcC0+Y2FyZCkpOwogCXNwcmludGYoY2FwLT5idXNfaW5mbywgIlBDSWU6JXMiLCBwY2lfbmFtZShkZXYtPnBjaSkpOwotCWNhcC0+dmVyc2lvbiA9IENYMjM4ODVfVkVSU0lPTl9DT0RFOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0KIAkJVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8CiAJCVY0TDJfQ0FQX1JFQURXUklURSAgICAgfApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3gyMzg4NS9jeDIzODg1LmgKaW5kZXggYzE4NjQ3My4uZDg2YmMwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDIzODg1L2N4MjM4ODUuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4MjM4ODUvY3gyMzg4NS5oCkBAIC0zNiwxMCArMzYsOSBAQAogI2luY2x1ZGUgImN4MjM4ODUtcmVnLmgiCiAjaW5jbHVkZSAibWVkaWEvY3gyMzQxeC5oIgogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAKLSNkZWZpbmUgQ1gyMzg4NV9WRVJTSU9OX0NPREUgS0VSTkVMX1ZFUlNJT04oMCwgMCwgMikKKyNkZWZpbmUgQ1gyMzg4NV9WRVJTSU9OICIwLjAuMyIKIAogI2RlZmluZSBVTlNFVCAoLTFVKQogCkBAIC04Niw2ICs4NSw3IEBACiAjZGVmaW5lIENYMjM4ODVfQk9BUkRfTEVBRFRFS19XSU5GQVNUX1BYVFYxMjAwIDI4CiAjZGVmaW5lIENYMjM4ODVfQk9BUkRfR09UVklFV19YNV8zRF9IWUJSSUQgICAgIDI5CiAjZGVmaW5lIENYMjM4ODVfQk9BUkRfTkVUVVBfRFVBTF9EVkJfVF9DX0NJX1JGIDMwCisjZGVmaW5lIENYMjM4ODVfQk9BUkRfTEVBRFRFS19XSU5GQVNUX1BYRFZSMzIwMF9IX1hDNDAwMCAzMQogCiAjZGVmaW5lIEdQSU9fMCAweDAwMDAwMDAxCiAjZGVmaW5lIEdQSU9fMSAweDAwMDAwMDAyCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1hbHNhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1hbHNhLmMKaW5kZXggNDIzYzFhZi4uNjhkMTI0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtYWxzYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWFsc2EuYwpAQCAtMTEzLDYgKzExMyw4IEBACiBNT0RVTEVfQVVUSE9SKCJSaWNhcmRvIENlcnF1ZWlyYSIpOwogTU9EVUxFX0FVVEhPUigiTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihDWDg4X1ZFUlNJT04pOworCiBNT0RVTEVfU1VQUE9SVEVEX0RFVklDRSgie3tDb25leGFudCwyMzg4MX0sIgogCQkJInt7Q29uZXhhbnQsMjM4ODJ9LCIKIAkJCSJ7e0NvbmV4YW50LDIzODgzfSIpOwpAQCAtOTczLDE0ICs5NzUsOCBAQAogICovCiBzdGF0aWMgaW50IF9faW5pdCBjeDg4X2F1ZGlvX2luaXQodm9pZCkKIHsKLQlwcmludGsoS0VSTl9JTkZPICJjeDIzODh4IGFsc2EgZHJpdmVyIHZlcnNpb24gJWQuJWQuJWQgbG9hZGVkXG4iLAotCSAgICAgICAoQ1g4OF9WRVJTSU9OX0NPREUgPj4gMTYpICYgMHhmZiwKLQkgICAgICAgKENYODhfVkVSU0lPTl9DT0RFID4+ICA4KSAmIDB4ZmYsCi0JICAgICAgIENYODhfVkVSU0lPTl9DT0RFICYgMHhmZik7Ci0jaWZkZWYgU05BUFNIT1QKLQlwcmludGsoS0VSTl9JTkZPICJjeDIzODh4OiBzbmFwc2hvdCBkYXRlICUwNGQtJTAyZC0lMDJkXG4iLAotCSAgICAgICBTTkFQU0hPVC8xMDAwMCwgKFNOQVBTSE9ULzEwMCklMTAwLCBTTkFQU0hPVCUxMDApOwotI2VuZGlmCisJcHJpbnRrKEtFUk5fSU5GTyAiY3gyMzg4eCBhbHNhIGRyaXZlciB2ZXJzaW9uICVzIGxvYWRlZFxuIiwKKwkgICAgICAgQ1g4OF9WRVJTSU9OKTsKIAlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmY3g4OF9hdWRpb19wY2lfZHJpdmVyKTsKIH0KIApAQCAtOTk0LDEwICs5OTAsMyBAQAogCiBtb2R1bGVfaW5pdChjeDg4X2F1ZGlvX2luaXQpOwogbW9kdWxlX2V4aXQoY3g4OF9hdWRpb19maW5pKTsKLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KLS8qCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWJhc2ljLW9mZnNldDogOAotICogRW5kOgotICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1ibGFja2JpcmQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWJsYWNrYmlyZC5jCmluZGV4IDExZTQ5YmIuLmU0NjQ0NmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWJsYWNrYmlyZC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWJsYWNrYmlyZC5jCkBAIC00Miw2ICs0Miw3IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oImRyaXZlciBmb3IgY3gyMzg4eC9jeDIzNDE2IGJhc2VkIG1wZWcgZW5jb2RlciBjYXJkcyIpOwogTU9EVUxFX0FVVEhPUigiSmVsbGUgRm9rcyA8amVsbGVAZm9rcy51cz4sIEdlcmQgS25vcnIgPGtyYXhlbEBieXRlc2V4Lm9yZz4gW1N1U0UgTGFic10iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKENYODhfVkVSU0lPTik7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbXBlZ2J1ZnMgPSAzMjsKIG1vZHVsZV9wYXJhbShtcGVnYnVmcyxpbnQsMDY0NCk7CkBAIC03MzAsNyArNzMxLDYgQEAKIAlzdHJjcHkoY2FwLT5kcml2ZXIsICJjeDg4X2JsYWNrYmlyZCIpOwogCXN0cmxjcHkoY2FwLT5jYXJkLCBjb3JlLT5ib2FyZC5uYW1lLCBzaXplb2YoY2FwLT5jYXJkKSk7CiAJc3ByaW50ZihjYXAtPmJ1c19pbmZvLCJQQ0k6JXMiLHBjaV9uYW1lKGRldi0+cGNpKSk7Ci0JY2FwLT52ZXJzaW9uID0gQ1g4OF9WRVJTSU9OX0NPREU7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPQogCQlWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKIAkJVjRMMl9DQVBfUkVBRFdSSVRFICAgICB8CkBAIC0xMzY4LDE0ICsxMzY4LDggQEAKIAogc3RhdGljIGludCBfX2luaXQgYmxhY2tiaXJkX2luaXQodm9pZCkKIHsKLQlwcmludGsoS0VSTl9JTkZPICJjeDIzODh4IGJsYWNrYmlyZCBkcml2ZXIgdmVyc2lvbiAlZC4lZC4lZCBsb2FkZWRcbiIsCi0JICAgICAgIChDWDg4X1ZFUlNJT05fQ09ERSA+PiAxNikgJiAweGZmLAotCSAgICAgICAoQ1g4OF9WRVJTSU9OX0NPREUgPj4gIDgpICYgMHhmZiwKLQkgICAgICAgQ1g4OF9WRVJTSU9OX0NPREUgJiAweGZmKTsKLSNpZmRlZiBTTkFQU0hPVAotCXByaW50ayhLRVJOX0lORk8gImN4MjM4OHg6IHNuYXBzaG90IGRhdGUgJTA0ZC0lMDJkLSUwMmRcbiIsCi0JICAgICAgIFNOQVBTSE9ULzEwMDAwLCAoU05BUFNIT1QvMTAwKSUxMDAsIFNOQVBTSE9UJTEwMCk7Ci0jZW5kaWYKKwlwcmludGsoS0VSTl9JTkZPICJjeDIzODh4IGJsYWNrYmlyZCBkcml2ZXIgdmVyc2lvbiAlcyBsb2FkZWRcbiIsCisJICAgICAgIENYODhfVkVSU0lPTik7CiAJcmV0dXJuIGN4ODgwMl9yZWdpc3Rlcl9kcml2ZXIoJmN4ODgwMl9ibGFja2JpcmRfZHJpdmVyKTsKIH0KIApAQCAtMTM4OSwxMSArMTM4MywzIEBACiAKIG1vZHVsZV9wYXJhbV9uYW1lZCh2aWRlb19kZWJ1ZyxjeDg4MDJfbXBlZ190ZW1wbGF0ZS5kZWJ1ZywgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZGVidWcsImVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyBbdmlkZW9dIik7Ci0KLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0vKgotICogTG9jYWwgdmFyaWFibGVzOgotICogYy1iYXNpYy1vZmZzZXQ6IDgKLSAqIEVuZDoKLSAqIGthdGU6IGVvbCAidW5peCI7IGluZGVudC13aWR0aCAzOyByZW1vdmUtdHJhaWxpbmctc3BhY2Ugb247IHJlcGxhY2UtdHJhaWxpbmctc3BhY2Utc2F2ZSBvbjsgdGFiLXdpZHRoIDg7IHJlcGxhY2UtdGFicyBvZmY7IHNwYWNlLWluZGVudCBvZmY7IG1peGVkLWluZGVudCBvZmYKLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWNhcmRzLmMKaW5kZXggMjcyMjJjOS4uMGQ3MTlmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jYXJkcy5jCkBAIC0yOCw2ICsyOCw3IEBACiAKICNpbmNsdWRlICJjeDg4LmgiCiAjaW5jbHVkZSAidGVhNTc2Ny5oIgorI2luY2x1ZGUgInhjNDAwMC5oIgogCiBzdGF0aWMgdW5zaWduZWQgaW50IHR1bmVyW10gPSB7WzAgLi4uIChDWDg4X01BWEJPQVJEUyAtIDEpXSA9IFVOU0VUIH07CiBzdGF0aWMgdW5zaWduZWQgaW50IHJhZGlvW10gPSB7WzAgLi4uIChDWDg4X01BWEJPQVJEUyAtIDEpXSA9IFVOU0VUIH07CkBAIC0yMTE5LDYgKzIxMjAsOTkgQEAKIAkJfSwKIAkJLm1wZWcgICAgICAgICAgID0gQ1g4OF9NUEVHX0RWQiwKIAl9LAorCVtDWDg4X0JPQVJEX1dJTkZBU1RfRFRWMTgwMEhfWEM0MDAwXSA9IHsKKwkJLm5hbWUJCT0gIkxlYWR0ZWsgV2luRmFzdCBEVFYxODAwIEggKFhDNDAwMCkiLAorCQkudHVuZXJfdHlwZQk9IFRVTkVSX1hDNDAwMCwKKwkJLnJhZGlvX3R5cGUJPSBUVU5FUl9YQzQwMDAsCisJCS50dW5lcl9hZGRyCT0gMHg2MSwKKwkJLnJhZGlvX2FkZHIJPSAweDYxLAorCQkvKgorCQkgKiBHUElPIHNldHRpbmcKKwkJICoKKwkJICogIDI6IG11dGUgKDA9b2ZmLDE9b24pCisJCSAqIDEyOiB0dW5lciByZXNldCBwaW4KKwkJICogMTM6IGF1ZGlvIHNvdXJjZSAoMD10dW5lciBhdWRpbywxPWxpbmUgaW4pCisJCSAqIDE0OiBGTSAoMD1vbiwxPW9mZiA/Pz8pCisJCSAqLworCQkuaW5wdXQJCT0ge3sKKwkJCS50eXBlCT0gQ1g4OF9WTVVYX1RFTEVWSVNJT04sCisJCQkudm11eAk9IDAsCisJCQkuZ3BpbzAJPSAweDA0MDAsCS8qIHBpbiAyID0gMCAqLworCQkJLmdwaW8xCT0gMHg2MDQwLAkvKiBwaW4gMTMgPSAwLCBwaW4gMTQgPSAxICovCisJCQkuZ3BpbzIJPSAweDAwMDAsCisJCX0sIHsKKwkJCS50eXBlCT0gQ1g4OF9WTVVYX0NPTVBPU0lURTEsCisJCQkudm11eAk9IDEsCisJCQkuZ3BpbzAJPSAweDA0MDAsCS8qIHBpbiAyID0gMCAqLworCQkJLmdwaW8xCT0gMHg2MDYwLAkvKiBwaW4gMTMgPSAxLCBwaW4gMTQgPSAxICovCisJCQkuZ3BpbzIJPSAweDAwMDAsCisJCX0sIHsKKwkJCS50eXBlCT0gQ1g4OF9WTVVYX1NWSURFTywKKwkJCS52bXV4CT0gMiwKKwkJCS5ncGlvMAk9IDB4MDQwMCwJLyogcGluIDIgPSAwICovCisJCQkuZ3BpbzEJPSAweDYwNjAsCS8qIHBpbiAxMyA9IDEsIHBpbiAxNCA9IDEgKi8KKwkJCS5ncGlvMgk9IDB4MDAwMCwKKwkJfX0sCisJCS5yYWRpbyA9IHsKKwkJCS50eXBlCT0gQ1g4OF9SQURJTywKKwkJCS5ncGlvMAk9IDB4MDQwMCwJLyogcGluIDIgPSAwICovCisJCQkuZ3BpbzEJPSAweDYwMDAsCS8qIHBpbiAxMyA9IDAsIHBpbiAxNCA9IDAgKi8KKwkJCS5ncGlvMgk9IDB4MDAwMCwKKwkJfSwKKwkJLm1wZWcJCT0gQ1g4OF9NUEVHX0RWQiwKKwl9LAorCVtDWDg4X0JPQVJEX1dJTkZBU1RfRFRWMjAwMEhfUExVU10gPSB7CisJCS5uYW1lCQk9ICJMZWFkdGVrIFdpbkZhc3QgRFRWMjAwMCBIIFBMVVMiLAorCQkudHVuZXJfdHlwZQk9IFRVTkVSX1hDNDAwMCwKKwkJLnJhZGlvX3R5cGUJPSBUVU5FUl9YQzQwMDAsCisJCS50dW5lcl9hZGRyCT0gMHg2MSwKKwkJLnJhZGlvX2FkZHIJPSAweDYxLAorCQkvKgorCQkgKiBHUElPCisJCSAqICAgMjogMTogbXV0ZSBhdWRpbworCQkgKiAgMTI6IDA6IHJlc2V0IFhDNDAwMAorCQkgKiAgMTM6IDE6IGF1ZGlvIGlucHV0IGlzIGxpbmUgaW4gKDA6IHR1bmVyKQorCQkgKiAgMTQ6IDA6IEZNIHJhZGlvCisJCSAqICAxNjogMDogUkYgaW5wdXQgaXMgY2FibGUKKwkJICovCisJCS5pbnB1dAkJPSB7eworCQkJLnR5cGUJPSBDWDg4X1ZNVVhfVEVMRVZJU0lPTiwKKwkJCS52bXV4CT0gMCwKKwkJCS5ncGlvMAk9IDB4MDQwMywKKwkJCS5ncGlvMQk9IDB4RjBENywKKwkJCS5ncGlvMgk9IDB4MDEwMSwKKwkJCS5ncGlvMwk9IDB4MDAwMCwKKwkJfSwgeworCQkJLnR5cGUJPSBDWDg4X1ZNVVhfQ0FCTEUsCisJCQkudm11eAk9IDAsCisJCQkuZ3BpbzAJPSAweDA0MDMsCisJCQkuZ3BpbzEJPSAweEYwRDcsCisJCQkuZ3BpbzIJPSAweDAxMDAsCisJCQkuZ3BpbzMJPSAweDAwMDAsCisJCX0sIHsKKwkJCS50eXBlCT0gQ1g4OF9WTVVYX0NPTVBPU0lURTEsCisJCQkudm11eAk9IDEsCisJCQkuZ3BpbzAJPSAweDA0MDMsCS8qIHdhcyAweDA0MDcgKi8KKwkJCS5ncGlvMQk9IDB4RjBGNywKKwkJCS5ncGlvMgk9IDB4MDEwMSwKKwkJCS5ncGlvMwk9IDB4MDAwMCwKKwkJfSwgeworCQkJLnR5cGUJPSBDWDg4X1ZNVVhfU1ZJREVPLAorCQkJLnZtdXgJPSAyLAorCQkJLmdwaW8wCT0gMHgwNDAzLAkvKiB3YXMgMHgwNDA3ICovCisJCQkuZ3BpbzEJPSAweEYwRjcsCisJCQkuZ3BpbzIJPSAweDAxMDEsCisJCQkuZ3BpbzMJPSAweDAwMDAsCisJCX19LAorCQkucmFkaW8gPSB7CisJCQkudHlwZQk9IENYODhfUkFESU8sCisJCQkuZ3BpbzAJPSAweDA0MDMsCisJCQkuZ3BpbzEJPSAweEYwOTcsCisJCQkuZ3BpbzIJPSAweDAxMDAsCisJCQkuZ3BpbzMJPSAweDAwMDAsCisJCX0sCisJCS5tcGVnCQk9IENYODhfTVBFR19EVkIsCisJfSwKIAlbQ1g4OF9CT0FSRF9QUk9GXzczMDFdID0gewogCQkubmFtZSAgICAgICAgICAgPSAiUHJvZiA3MzAxIERWQi1TL1MyIiwKIAkJLnR1bmVyX3R5cGUgICAgID0gVU5TRVQsCkBAIC0yNTgxLDYgKzI2NzUsMTUgQEAKIAkJLnN1YmRldmljZSA9IDB4NjY1NCwKIAkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfV0lORkFTVF9EVFYxODAwSCwKIAl9LCB7CisJCS8qIFdpbkZhc3QgRFRWMTgwMCBIIHdpdGggWEM0MDAwIHR1bmVyICovCisJCS5zdWJ2ZW5kb3IgPSAweDEwN2QsCisJCS5zdWJkZXZpY2UgPSAweDZmMzgsCisJCS5jYXJkICAgICAgPSBDWDg4X0JPQVJEX1dJTkZBU1RfRFRWMTgwMEhfWEM0MDAwLAorCX0sIHsKKwkJLnN1YnZlbmRvciA9IDB4MTA3ZCwKKwkJLnN1YmRldmljZSA9IDB4NmY0MiwKKwkJLmNhcmQgICAgICA9IENYODhfQk9BUkRfV0lORkFTVF9EVFYyMDAwSF9QTFVTLAorCX0sIHsKIAkJLyogUFZSMjAwMCBQQUwgTW9kZWwgWzEwN2Q6NjYzMF0gKi8KIAkJLnN1YnZlbmRvciA9IDB4MTA3ZCwKIAkJLnN1YmRldmljZSA9IDB4NjYzMCwKQEAgLTI4NDYsNiArMjk0OSwyMyBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCitzdGF0aWMgaW50IGN4ODhfeGM0MDAwX3dpbmZhc3QyMDAwaF9wbHVzX2NhbGxiYWNrKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsCisJCQkJCQkgIGludCBjb21tYW5kLCBpbnQgYXJnKQoreworCXN3aXRjaCAoY29tbWFuZCkgeworCWNhc2UgWEM0MDAwX1RVTkVSX1JFU0VUOgorCQkvKiBHUElPIDEyICh4YzQwMDAgdHVuZXIgcmVzZXQpICovCisJCWN4X3NldChNT19HUDFfSU8sIDB4MTAxMCk7CisJCW1kZWxheSg1MCk7CisJCWN4X2NsZWFyKE1PX0dQMV9JTywgMHgxMCk7CisJCW1kZWxheSg3NSk7CisJCWN4X3NldChNT19HUDFfSU8sIDB4MTApOworCQltZGVsYXkoNzUpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIHNvbWUgRGl2Y28gc3BlY2lmaWMgc3R1ZmYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIHN0YXRpYyBpbnQgY3g4OF9wdl84MDAwZ3RfY2FsbGJhY2soc3RydWN0IGN4ODhfY29yZSAqY29yZSwKQEAgLTI5NDgsNiArMzA2OCwxOSBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCitzdGF0aWMgaW50IGN4ODhfeGM0MDAwX3R1bmVyX2NhbGxiYWNrKHN0cnVjdCBjeDg4X2NvcmUgKmNvcmUsCisJCQkJICAgICAgaW50IGNvbW1hbmQsIGludCBhcmcpCit7CisJLyogQm9hcmQtc3BlY2lmaWMgY2FsbGJhY2tzICovCisJc3dpdGNoIChjb3JlLT5ib2FyZG5yKSB7CisJY2FzZSBDWDg4X0JPQVJEX1dJTkZBU1RfRFRWMTgwMEhfWEM0MDAwOgorCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjIwMDBIX1BMVVM6CisJCXJldHVybiBjeDg4X3hjNDAwMF93aW5mYXN0MjAwMGhfcGx1c19jYWxsYmFjayhjb3JlLAorCQkJCQkJCSAgICAgIGNvbW1hbmQsIGFyZyk7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogLyogVHVuZXIgY2FsbGJhY2sgZnVuY3Rpb24uIEN1cnJlbnRseSBvbmx5IG5lZWRlZCBmb3IgdGhlIFBpbm5hY2xlIAkgICAqCiAgKiBQQ1RWIEhEIDgwMGkgd2l0aCBhbiB4YzUwMDAgc2lsbGljb24gdHVuZXIuIFRoaXMgaXMgdXNlZCBmb3IgYm90aAkgICAqCkBAIC0zMDIyLDYgKzMxNTUsOSBAQAogCQljYXNlIFRVTkVSX1hDMjAyODoKIAkJCWluZm9fcHJpbnRrKGNvcmUsICJDYWxsaW5nIFhDMjAyOC8zMDI4IGNhbGxiYWNrXG4iKTsKIAkJCXJldHVybiBjeDg4X3hjMjAyOF90dW5lcl9jYWxsYmFjayhjb3JlLCBjb21tYW5kLCBhcmcpOworCQljYXNlIFRVTkVSX1hDNDAwMDoKKwkJCWluZm9fcHJpbnRrKGNvcmUsICJDYWxsaW5nIFhDNDAwMCBjYWxsYmFja1xuIik7CisJCQlyZXR1cm4gY3g4OF94YzQwMDBfdHVuZXJfY2FsbGJhY2soY29yZSwgY29tbWFuZCwgYXJnKTsKIAkJY2FzZSBUVU5FUl9YQzUwMDA6CiAJCQlpbmZvX3ByaW50ayhjb3JlLCAiQ2FsbGluZyBYQzUwMDAgY2FsbGJhY2tcbiIpOwogCQkJcmV0dXJuIGN4ODhfeGM1MDAwX3R1bmVyX2NhbGxiYWNrKGNvcmUsIGNvbW1hbmQsIGFyZyk7CkBAIC0zMTA5LDEzICszMjQ1LDEzIEBACiAKIAljYXNlIENYODhfQk9BUkRfV0lORkFTVF9UVjIwMDBfWFBfR0xPQkFMOgogCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjE4MDBIOgotCQkvKiBHUElPIDEyICh4YzMwMjggdHVuZXIgcmVzZXQpICovCi0JCWN4X3NldChNT19HUDFfSU8sIDB4MTAxMCk7Ci0JCW1kZWxheSg1MCk7Ci0JCWN4X2NsZWFyKE1PX0dQMV9JTywgMHgxMCk7Ci0JCW1kZWxheSg1MCk7Ci0JCWN4X3NldChNT19HUDFfSU8sIDB4MTApOwotCQltZGVsYXkoNTApOworCQljeDg4X3hjMzAyOF93aW5mYXN0MTgwMGhfY2FsbGJhY2soY29yZSwgWEMyMDI4X1RVTkVSX1JFU0VULCAwKTsKKwkJYnJlYWs7CisKKwljYXNlIENYODhfQk9BUkRfV0lORkFTVF9EVFYxODAwSF9YQzQwMDA6CisJY2FzZSBDWDg4X0JPQVJEX1dJTkZBU1RfRFRWMjAwMEhfUExVUzoKKwkJY3g4OF94YzQwMDBfd2luZmFzdDIwMDBoX3BsdXNfY2FsbGJhY2soY29yZSwKKwkJCQkJCSAgICAgICBYQzQwMDBfVFVORVJfUkVTRVQsIDApOwogCQlicmVhazsKIAogCWNhc2UgQ1g4OF9CT0FSRF9UV0lOSEFOX1ZQMTAyN19EVkJTOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY29yZS5jCmluZGV4IDJlMTQ1ZjBhLi5mYmNhYTFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtY29yZS5jCkBAIC02MzYsNiArNjM2LDkgQEAKIAljeF93cml0ZShNT19QQ0lfSU5UU1RBVCwgICAweEZGRkZGRkZGKTsgLy8gQ2xlYXIgUENJIGludAogCWN4X3dyaXRlKE1PX0lOVDFfU1RBVCwgICAgIDB4RkZGRkZGRkYpOyAvLyBDbGVhciBSSVNDIGludAogCisJLyogc2V0IGRlZmF1bHQgbm90Y2ggZmlsdGVyICovCisJY3hfYW5kb3IoTU9fSFRPVEFMLCAweDE4MDAsIChITE5vdGNoRmlsdGVyNHhGc2MgPDwgMTEpKTsKKwogCS8qIFJlc2V0IG9uLWJvYXJkIHBhcnRzICovCiAJY3hfd3JpdGUoTU9fU1JTVF9JTywgMCk7CiAJbXNsZWVwKDEwKTsKQEAgLTc1OSw4ICs3NjIsOCBAQAogCWlmIChub2NvbWIpCiAJCXZhbHVlIHw9ICgzIDw8IDUpOyAvLyBkaXNhYmxlIGNvbWIgZmlsdGVyCiAKLQljeF93cml0ZShNT19GSUxURVJfRVZFTiwgIHZhbHVlKTsKLQljeF93cml0ZShNT19GSUxURVJfT0RELCAgIHZhbHVlKTsKKwljeF9hbmRvcihNT19GSUxURVJfRVZFTiwgIDB4N2ZmYzdmLCB2YWx1ZSk7IC8qIHByZXNlcnZlIFBFQUtFTiwgUFNFTCAqLworCWN4X2FuZG9yKE1PX0ZJTFRFUl9PREQsICAgMHg3ZmZjN2YsIHZhbHVlKTsKIAlkcHJpbnRrKDEsInNldF9zY2FsZTogZmlsdGVyICAweCUwNHhcbiIsIHZhbHVlKTsKIAogCXJldHVybiAwOwpAQCAtOTk0LDEwICs5OTcsMTAgQEAKIAkvLyBodG90YWwKIAl0bXA2NCA9IG5vcm1faHRvdGFsKG5vcm0pICogKHU2NCl2ZGVjX2Nsb2NrOwogCWRvX2Rpdih0bXA2NCwgZnNjOCk7Ci0JaHRvdGFsID0gKHUzMil0bXA2NCB8IChITE5vdGNoRmlsdGVyNHhGc2MgPDwgMTEpOworCWh0b3RhbCA9ICh1MzIpdG1wNjQ7CiAJZHByaW50aygxLCJzZXRfdHZub3JtOiBNT19IVE9UQUwgICAgICAgIDB4JTA4eCBbb2xkPTB4JTA4eCxodG90YWw9JWRdXG4iLAogCQlodG90YWwsIGN4X3JlYWQoTU9fSFRPVEFMKSwgKHUzMil0bXA2NCk7Ci0JY3hfd3JpdGUoTU9fSFRPVEFMLCBodG90YWwpOworCWN4X2FuZG9yKE1PX0hUT1RBTCwgMHgwN2ZmLCBodG90YWwpOwogCiAJLy8gdmJpIHN0dWZmLCBzZXQgdmJpIG9mZnNldCB0byAxMCAoZm9yIDIwIENsayoyIHBpeGVscyksIHRoaXMgbWFrZXMKIAkvLyB0aGUgZWZmZWN0aXZlIHZiaSBvZmZzZXQgfjI0NCBzYW1wbGVzLCB0aGUgc2FtZSBhcyB0aGUgQnQ4eDgKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWR2Yi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtZHZiLmMKaW5kZXggYzY5ZGY3ZS4uY2YzZDMzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtZHZiLmMKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlICJvcjUxMTMyLmgiCiAjaW5jbHVkZSAibGdkdDMzMHguaCIKICNpbmNsdWRlICJzNWgxNDA5LmgiCisjaW5jbHVkZSAieGM0MDAwLmgiCiAjaW5jbHVkZSAieGM1MDAwLmgiCiAjaW5jbHVkZSAibnh0MjAweC5oIgogI2luY2x1ZGUgImN4MjQxMjMuaCIKQEAgLTYzLDYgKzY0LDcgQEAKIE1PRFVMRV9BVVRIT1IoIkNocmlzIFBhc2NvZSA8Yy5wYXNjb2VAaXRlZS51cS5lZHUuYXU+Iik7CiBNT0RVTEVfQVVUSE9SKCJHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+IFtTdVNFIExhYnNdIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihDWDg4X1ZFUlNJT04pOwogCiBzdGF0aWMgdW5zaWduZWQgaW50IGRlYnVnOwogbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOwpAQCAtNjA1LDYgKzYwNywzOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGF0dGFjaF94YzQwMDAoc3RydWN0IGN4ODgwMl9kZXYgKmRldiwgc3RydWN0IHhjNDAwMF9jb25maWcgKmNmZykKK3sKKwlzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZTsKKwlzdHJ1Y3QgdmlkZW9idWZfZHZiX2Zyb250ZW5kICpmZTAgPSBOVUxMOworCisJLyogR2V0IHRoZSBmaXJzdCBmcm9udGVuZCAqLworCWZlMCA9IHZpZGVvYnVmX2R2Yl9nZXRfZnJvbnRlbmQoJmRldi0+ZnJvbnRlbmRzLCAxKTsKKwlpZiAoIWZlMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWZlMC0+ZHZiLmZyb250ZW5kKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXMvMjogZHZiIGZyb250ZW5kIG5vdCBhdHRhY2hlZC4gIgorCQkJCSJDYW4ndCBhdHRhY2ggeGM0MDAwXG4iLAorCQkgICAgICAgZGV2LT5jb3JlLT5uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZmUgPSBkdmJfYXR0YWNoKHhjNDAwMF9hdHRhY2gsIGZlMC0+ZHZiLmZyb250ZW5kLCAmZGV2LT5jb3JlLT5pMmNfYWRhcCwKKwkJCWNmZyk7CisJaWYgKCFmZSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzLzI6IHhjNDAwMCBhdHRhY2ggZmFpbGVkXG4iLAorCQkgICAgICAgZGV2LT5jb3JlLT5uYW1lKTsKKwkJZHZiX2Zyb250ZW5kX2RldGFjaChmZTAtPmR2Yi5mcm9udGVuZCk7CisJCWR2Yl91bnJlZ2lzdGVyX2Zyb250ZW5kKGZlMC0+ZHZiLmZyb250ZW5kKTsKKwkJZmUwLT5kdmIuZnJvbnRlbmQgPSBOVUxMOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICIlcy8yOiB4YzQwMDAgYXR0YWNoZWRcbiIsIGRldi0+Y29yZS0+bmFtZSk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBjeDI0MTE2X3NldF90c19wYXJhbShzdHJ1Y3QgZHZiX2Zyb250ZW5kICpmZSwKIAlpbnQgaXNfcHVuY3R1cmVkKQogewpAQCAtMTI5NCw3ICsxMzI5LDI1IEBACiAJCQkJZ290byBmcm9udGVuZF9kZXRhY2g7CiAJCX0KIAkJYnJlYWs7Ci0JIGNhc2UgQ1g4OF9CT0FSRF9HRU5JQVRFQ0hfWDgwMDBfTVQ6CisJY2FzZSBDWDg4X0JPQVJEX1dJTkZBU1RfRFRWMTgwMEhfWEM0MDAwOgorCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjIwMDBIX1BMVVM6CisJCWZlMC0+ZHZiLmZyb250ZW5kID0gZHZiX2F0dGFjaCh6bDEwMzUzX2F0dGFjaCwKKwkJCQkJICAgICAgICZjeDg4X3Bpbm5hY2xlX2h5YnJpZF9wY3R2LAorCQkJCQkgICAgICAgJmNvcmUtPmkyY19hZGFwKTsKKwkJaWYgKGZlMC0+ZHZiLmZyb250ZW5kKSB7CisJCQlzdHJ1Y3QgeGM0MDAwX2NvbmZpZyBjZmcgPSB7CisJCQkJLmkyY19hZGRyZXNzCSAgPSAweDYxLAorCQkJCS5kZWZhdWx0X3BtCSAgPSAwLAorCQkJCS5kdmJfYW1wbGl0dWRlCSAgPSAxMzQsCisJCQkJLnNldF9zbW9vdGhlZGN2YnMgPSAxLAorCQkJCS5pZl9raHoJCSAgPSA0NTYwCisJCQl9OworCQkJZmUwLT5kdmIuZnJvbnRlbmQtPm9wcy5pMmNfZ2F0ZV9jdHJsID0gTlVMTDsKKwkJCWlmIChhdHRhY2hfeGM0MDAwKGRldiwgJmNmZykgPCAwKQorCQkJCWdvdG8gZnJvbnRlbmRfZGV0YWNoOworCQl9CisJCWJyZWFrOworCWNhc2UgQ1g4OF9CT0FSRF9HRU5JQVRFQ0hfWDgwMDBfTVQ6CiAJCWRldi0+dHNfZ2VuX2NudHJsID0gMHgwMDsKIAogCQlmZTAtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2goemwxMDM1M19hdHRhY2gsCkBAIC0xNTc3LDYgKzE2MzAsMTEgQEAKIAkJdWRlbGF5KDEwMDApOwogCQlicmVhazsKIAorCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjIwMDBIX1BMVVM6CisJCS8qIHNldCBSRiBpbnB1dCB0byBBSVIgZm9yIERWQi1UIChHUElPIDE2KSAqLworCQljeF93cml0ZShNT19HUDJfSU8sIDB4MDEwMSk7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJZXJyID0gLUVOT0RFVjsKIAl9CkBAIC0xNjkyLDE0ICsxNzUwLDggQEAKIAogc3RhdGljIGludCBfX2luaXQgZHZiX2luaXQodm9pZCkKIHsKLQlwcmludGsoS0VSTl9JTkZPICJjeDg4LzI6IGN4MjM4OHggZHZiIGRyaXZlciB2ZXJzaW9uICVkLiVkLiVkIGxvYWRlZFxuIiwKLQkgICAgICAgKENYODhfVkVSU0lPTl9DT0RFID4+IDE2KSAmIDB4ZmYsCi0JICAgICAgIChDWDg4X1ZFUlNJT05fQ09ERSA+PiAgOCkgJiAweGZmLAotCSAgICAgICBDWDg4X1ZFUlNJT05fQ09ERSAmIDB4ZmYpOwotI2lmZGVmIFNOQVBTSE9UCi0JcHJpbnRrKEtFUk5fSU5GTyAiY3gyMzg4eDogc25hcHNob3QgZGF0ZSAlMDRkLSUwMmQtJTAyZFxuIiwKLQkgICAgICAgU05BUFNIT1QvMTAwMDAsIChTTkFQU0hPVC8xMDApJTEwMCwgU05BUFNIT1QlMTAwKTsKLSNlbmRpZgorCXByaW50ayhLRVJOX0lORk8gImN4ODgvMjogY3gyMzg4eCBkdmIgZHJpdmVyIHZlcnNpb24gJXMgbG9hZGVkXG4iLAorCSAgICAgICBDWDg4X1ZFUlNJT04pOwogCXJldHVybiBjeDg4MDJfcmVnaXN0ZXJfZHJpdmVyKCZjeDg4MDJfZHZiX2RyaXZlcik7CiB9CiAKQEAgLTE3MTAsMTAgKzE3NjIsMyBAQAogCiBtb2R1bGVfaW5pdChkdmJfaW5pdCk7CiBtb2R1bGVfZXhpdChkdmJfZmluaSk7Ci0KLS8qCi0gKiBMb2NhbCB2YXJpYWJsZXM6Ci0gKiBjLWJhc2ljLW9mZnNldDogOAotICogY29tcGlsZS1jb21tYW5kOiAibWFrZSBEVkI9MSIKLSAqIEVuZDoKLSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaW5wdXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LWlucHV0LmMKaW5kZXggM2Y0NDIwMC4uZTYxNDIwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtaW5wdXQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1pbnB1dC5jCkBAIC0xMDAsNiArMTAwLDggQEAKIAkJYnJlYWs7CiAJY2FzZSBDWDg4X0JPQVJEX1dJTkZBU1RfRFRWMTAwMDoKIAljYXNlIENYODhfQk9BUkRfV0lORkFTVF9EVFYxODAwSDoKKwljYXNlIENYODhfQk9BUkRfV0lORkFTVF9EVFYxODAwSF9YQzQwMDA6CisJY2FzZSBDWDg4X0JPQVJEX1dJTkZBU1RfRFRWMjAwMEhfUExVUzoKIAljYXNlIENYODhfQk9BUkRfV0lORkFTVF9UVjIwMDBfWFBfR0xPQkFMOgogCQlncGlvID0gKGdwaW8gJiAweDZmZikgfCAoKGN4X3JlYWQoTU9fR1AxX0lPKSA8PCA4KSAmIDB4OTAwKTsKIAkJYXV4Z3BpbyA9IGdwaW87CkBAIC0yODksNiArMjkxLDggQEAKIAljYXNlIENYODhfQk9BUkRfV0lORkFTVF9EVFYyMDAwSDoKIAljYXNlIENYODhfQk9BUkRfV0lORkFTVF9EVFYyMDAwSF9KOgogCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjE4MDBIOgorCWNhc2UgQ1g4OF9CT0FSRF9XSU5GQVNUX0RUVjE4MDBIX1hDNDAwMDoKKwljYXNlIENYODhfQk9BUkRfV0lORkFTVF9EVFYyMDAwSF9QTFVTOgogCQlpcl9jb2RlcyA9IFJDX01BUF9XSU5GQVNUOwogCQlpci0+Z3Bpb19hZGRyID0gTU9fR1AwX0lPOwogCQlpci0+bWFza19rZXljb2RlID0gMHg4Zjg7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1tcGVnLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC1tcGVnLmMKaW5kZXggMWE3Yjk4My4uY2Q1Mzg2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtbXBlZy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LW1wZWcuYwpAQCAtMzksNiArMzksNyBAQAogTU9EVUxFX0FVVEhPUigiQ2hyaXMgUGFzY29lIDxjLnBhc2NvZUBpdGVlLnVxLmVkdS5hdT4iKTsKIE1PRFVMRV9BVVRIT1IoIkdlcmQgS25vcnIgPGtyYXhlbEBieXRlc2V4Lm9yZz4gW1N1U0UgTGFic10iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKENYODhfVkVSU0lPTik7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZGVidWc7CiBtb2R1bGVfcGFyYW0oZGVidWcsaW50LDA2NDQpOwpAQCAtNjEzLDEzICs2MTQsMTcgQEAKIAkgICAgY29yZS0+YWN0aXZlX3R5cGVfaWQgIT0gZHJ2LT50eXBlX2lkKQogCQlyZXR1cm4gLUVCVVNZOwogCi0JY29yZS0+aW5wdXQgPSAwOwotCWZvciAoaSA9IDA7Ci0JICAgICBpIDwgKHNpemVvZihjb3JlLT5ib2FyZC5pbnB1dCkgLyBzaXplb2Yoc3RydWN0IGN4ODhfaW5wdXQpKTsKLQkgICAgIGkrKykgewotCQlpZiAoY29yZS0+Ym9hcmQuaW5wdXRbaV0udHlwZSA9PSBDWDg4X1ZNVVhfRFZCKSB7Ci0JCQljb3JlLT5pbnB1dCA9IGk7Ci0JCQlicmVhazsKKwlpZiAoZHJ2LT50eXBlX2lkID09IENYODhfTVBFR19EVkIpIHsKKwkJLyogV2hlbiBzd2l0Y2hpbmcgdG8gRFZCLCBhbHdheXMgc2V0IHRoZSBpbnB1dCB0byB0aGUgdHVuZXIgKi8KKwkJY29yZS0+bGFzdF9hbmFsb2dfaW5wdXQgPSBjb3JlLT5pbnB1dDsKKwkJY29yZS0+aW5wdXQgPSAwOworCQlmb3IgKGkgPSAwOworCQkgICAgIGkgPCAoc2l6ZW9mKGNvcmUtPmJvYXJkLmlucHV0KSAvIHNpemVvZihzdHJ1Y3QgY3g4OF9pbnB1dCkpOworCQkgICAgIGkrKykgeworCQkJaWYgKGNvcmUtPmJvYXJkLmlucHV0W2ldLnR5cGUgPT0gQ1g4OF9WTVVYX0RWQikgeworCQkJCWNvcmUtPmlucHV0ID0gaTsKKwkJCQlicmVhazsKKwkJCX0KIAkJfQogCX0KIApAQCAtNjQ0LDYgKzY0OSwxMiBAQAogCiAJaWYgKGRydi0+YWR2aXNlX3JlbGVhc2UgJiYgLS1jb3JlLT5hY3RpdmVfcmVmID09IDApCiAJeworCQlpZiAoZHJ2LT50eXBlX2lkID09IENYODhfTVBFR19EVkIpIHsKKwkJCS8qIElmIHRoZSBEVkIgZHJpdmVyIGlzIHJlbGVhc2luZywgcmVzZXQgdGhlIGlucHV0CisJCQkgICBzdGF0ZSB0byB0aGUgbGFzdCBjb25maWd1cmVkIGFuYWxvZyBpbnB1dCAqLworCQkJY29yZS0+aW5wdXQgPSBjb3JlLT5sYXN0X2FuYWxvZ19pbnB1dDsKKwkJfQorCiAJCWRydi0+YWR2aXNlX3JlbGVhc2UoZHJ2KTsKIAkJY29yZS0+YWN0aXZlX3R5cGVfaWQgPSBDWDg4X0JPQVJEX05PTkU7CiAJCW1wZWdfZGJnKDEsIiVzKCkgUG9zdCByZWxlYXNlIEdQSU89JXhcbiIsIF9fZnVuY19fLCBjeF9yZWFkKE1PX0dQMF9JTykpOwpAQCAtODkwLDE0ICs5MDEsOCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBjeDg4MDJfaW5pdCh2b2lkKQogewotCXByaW50ayhLRVJOX0lORk8gImN4ODgvMjogY3gyMzg4eCBNUEVHLVRTIERyaXZlciBNYW5hZ2VyIHZlcnNpb24gJWQuJWQuJWQgbG9hZGVkXG4iLAotCSAgICAgICAoQ1g4OF9WRVJTSU9OX0NPREUgPj4gMTYpICYgMHhmZiwKLQkgICAgICAgKENYODhfVkVSU0lPTl9DT0RFID4+ICA4KSAmIDB4ZmYsCi0JICAgICAgIENYODhfVkVSU0lPTl9DT0RFICYgMHhmZik7Ci0jaWZkZWYgU05BUFNIT1QKLQlwcmludGsoS0VSTl9JTkZPICJjeDIzODh4OiBzbmFwc2hvdCBkYXRlICUwNGQtJTAyZC0lMDJkXG4iLAotCSAgICAgICBTTkFQU0hPVC8xMDAwMCwgKFNOQVBTSE9ULzEwMCklMTAwLCBTTkFQU0hPVCUxMDApOwotI2VuZGlmCisJcHJpbnRrKEtFUk5fSU5GTyAiY3g4OC8yOiBjeDIzODh4IE1QRUctVFMgRHJpdmVyIE1hbmFnZXIgdmVyc2lvbiAlcyBsb2FkZWRcbiIsCisJICAgICAgIENYODhfVkVSU0lPTik7CiAJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmN4ODgwMl9wY2lfZHJpdmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmlkZW8uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LXZpZGVvLmMKaW5kZXggY2VmNGYyOC4uNjBkMjhmZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODgtdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC12aWRlby5jCkBAIC00NSw2ICs0NSw3IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oInY0bDIgZHJpdmVyIG1vZHVsZSBmb3IgY3gyMzg4eCBiYXNlZCBUViBjYXJkcyIpOwogTU9EVUxFX0FVVEhPUigiR2VyZCBLbm9yciA8a3JheGVsQGJ5dGVzZXgub3JnPiBbU3VTRSBMYWJzXSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oQ1g4OF9WRVJTSU9OKTsKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTIyMCw3ICsyMjEsMjMgQEAKIAkJLnJlZyAgICAgICAgICAgICAgICAgICA9IE1PX1VWX1NBVFVSQVRJT04sCiAJCS5tYXNrICAgICAgICAgICAgICAgICAgPSAweDAwZmYsCiAJCS5zaGlmdCAgICAgICAgICAgICAgICAgPSAwLAotCX0seworCX0sIHsKKwkJLnYgPSB7CisJCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX1NIQVJQTkVTUywKKwkJCS5uYW1lICAgICAgICAgID0gIlNoYXJwbmVzcyIsCisJCQkubWluaW11bSAgICAgICA9IDAsCisJCQkubWF4aW11bSAgICAgICA9IDQsCisJCQkuc3RlcCAgICAgICAgICA9IDEsCisJCQkuZGVmYXVsdF92YWx1ZSA9IDB4MCwKKwkJCS50eXBlICAgICAgICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJfSwKKwkJLm9mZiAgICAgICAgICAgICAgICAgICA9IDAsCisJCS8qIE5PVEU6IHRoZSB2YWx1ZSBpcyBjb252ZXJ0ZWQgYW5kIHdyaXR0ZW4gdG8gYm90aCBldmVuCisJCSAgIGFuZCBvZGQgcmVnaXN0ZXJzIGluIHRoZSBjb2RlICovCisJCS5yZWcgICAgICAgICAgICAgICAgICAgPSBNT19GSUxURVJfT0RELAorCQkubWFzayAgICAgICAgICAgICAgICAgID0gNyA8PCA3LAorCQkuc2hpZnQgICAgICAgICAgICAgICAgID0gNywKKwl9LCB7CiAJCS52ID0gewogCQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9DSFJPTUFfQUdDLAogCQkJLm5hbWUgICAgICAgICAgPSAiQ2hyb21hIEFHQyIsCkBAIC0yNDUsNiArMjYyLDIwIEBACiAJCS5tYXNrICAgICAgICAgICAgICAgICAgPSAxIDw8IDksCiAJCS5zaGlmdCAgICAgICAgICAgICAgICAgPSA5LAogCX0sIHsKKwkJLnYgPSB7CisJCQkuaWQgICAgICAgICAgICA9IFY0TDJfQ0lEX0JBTkRfU1RPUF9GSUxURVIsCisJCQkubmFtZSAgICAgICAgICA9ICJOb3RjaCBmaWx0ZXIiLAorCQkJLm1pbmltdW0gICAgICAgPSAwLAorCQkJLm1heGltdW0gICAgICAgPSAzLAorCQkJLnN0ZXAgICAgICAgICAgPSAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAweDAsCisJCQkudHlwZSAgICAgICAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCX0sCisJCS5vZmYgICAgICAgICAgICAgICAgICAgPSAwLAorCQkucmVnICAgICAgICAgICAgICAgICAgID0gTU9fSFRPVEFMLAorCQkubWFzayAgICAgICAgICAgICAgICAgID0gMyA8PCAxMSwKKwkJLnNoaWZ0ICAgICAgICAgICAgICAgICA9IDExLAorCX0sIHsKIAkvKiAtLS0gYXVkaW8gLS0tICovCiAJCS52ID0gewogCQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9BVURJT19NVVRFLApAQCAtMzAwLDggKzMzMSwxMCBAQAogCVY0TDJfQ0lEX0FVRElPX1ZPTFVNRSwKIAlWNEwyX0NJRF9BVURJT19CQUxBTkNFLAogCVY0TDJfQ0lEX0FVRElPX01VVEUsCisJVjRMMl9DSURfU0hBUlBORVNTLAogCVY0TDJfQ0lEX0NIUk9NQV9BR0MsCiAJVjRMMl9DSURfQ09MT1JfS0lMTEVSLAorCVY0TDJfQ0lEX0JBTkRfU1RPUF9GSUxURVIsCiAJMAogfTsKIEVYUE9SVF9TWU1CT0woY3g4OF91c2VyX2N0cmxzKTsKQEAgLTk2Miw2ICs5OTUsMTAgQEAKIAljYXNlIFY0TDJfQ0lEX0FVRElPX1ZPTFVNRToKIAkJY3RsLT52YWx1ZSA9IDB4M2YgLSAodmFsdWUgJiAweDNmKTsKIAkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9TSEFSUE5FU1M6CisJCWN0bC0+dmFsdWUgPSAoKHZhbHVlICYgMHgwMjAwKSA/ICgoKHZhbHVlICYgMHgwMTgwKSA+PiA3KSArIDEpCisJCQkJCQkgOiAwKTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJY3RsLT52YWx1ZSA9ICgodmFsdWUgKyAoYy0+b2ZmIDw8IGMtPnNoaWZ0KSkgJiBjLT5tYXNrKSA+PiBjLT5zaGlmdDsKIAkJYnJlYWs7CkBAIC0xMDM5LDYgKzEwNzYsMTIgQEAKIAkJfQogCQltYXNrPTB4ZmZmZjsKIAkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9TSEFSUE5FU1M6CisJCS8qIDBiMDAwLCAwYjEwMCwgMGIxMDEsIDBiMTEwLCBvciAwYjExMSAqLworCQl2YWx1ZSA9IChjdGwtPnZhbHVlIDwgMSA/IDAgOiAoKGN0bC0+dmFsdWUgKyAzKSA8PCA3KSk7CisJCS8qIG5lZWRzIHRvIGJlIHNldCBmb3IgYm90aCBmaWVsZHMgKi8KKwkJY3hfYW5kb3IoTU9fRklMVEVSX0VWRU4sIG1hc2ssIHZhbHVlKTsKKwkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9DSFJPTUFfQUdDOgogCQkvKiBEbyBub3QgYWxsb3cgY2hyb21hIEFHQyB0byBiZSBlbmFibGVkIGZvciBTRUNBTSAqLwogCQl2YWx1ZSA9ICgoY3RsLT52YWx1ZSAtIGMtPm9mZikgPDwgYy0+c2hpZnQpICYgYy0+bWFzazsKQEAgLTExNjEsNyArMTIwNCw2IEBACiAJc3RyY3B5KGNhcC0+ZHJpdmVyLCAiY3g4ODAwIik7CiAJc3RybGNweShjYXAtPmNhcmQsIGNvcmUtPmJvYXJkLm5hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKIAlzcHJpbnRmKGNhcC0+YnVzX2luZm8sIlBDSTolcyIscGNpX25hbWUoZGV2LT5wY2kpKTsKLQljYXAtPnZlcnNpb24gPSBDWDg4X1ZFUlNJT05fQ09ERTsKIAljYXAtPmNhcGFiaWxpdGllcyA9CiAJCVY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfAogCQlWNEwyX0NBUF9SRUFEV1JJVEUgICAgIHwKQEAgLTE0ODAsNyArMTUyMiw2IEBACiAJc3RyY3B5KGNhcC0+ZHJpdmVyLCAiY3g4ODAwIik7CiAJc3RybGNweShjYXAtPmNhcmQsIGNvcmUtPmJvYXJkLm5hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKIAlzcHJpbnRmKGNhcC0+YnVzX2luZm8sIlBDSTolcyIsIHBjaV9uYW1lKGRldi0+cGNpKSk7Ci0JY2FwLT52ZXJzaW9uID0gQ1g4OF9WRVJTSU9OX0NPREU7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUjsKIAlyZXR1cm4gMDsKIH0KQEAgLTIxMzksMTQgKzIxODAsOCBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBjeDg4MDBfaW5pdCh2b2lkKQogewotCXByaW50ayhLRVJOX0lORk8gImN4ODgvMDogY3gyMzg4eCB2NGwyIGRyaXZlciB2ZXJzaW9uICVkLiVkLiVkIGxvYWRlZFxuIiwKLQkgICAgICAgKENYODhfVkVSU0lPTl9DT0RFID4+IDE2KSAmIDB4ZmYsCi0JICAgICAgIChDWDg4X1ZFUlNJT05fQ09ERSA+PiAgOCkgJiAweGZmLAotCSAgICAgICBDWDg4X1ZFUlNJT05fQ09ERSAmIDB4ZmYpOwotI2lmZGVmIFNOQVBTSE9UCi0JcHJpbnRrKEtFUk5fSU5GTyAiY3gyMzg4eDogc25hcHNob3QgZGF0ZSAlMDRkLSUwMmQtJTAyZFxuIiwKLQkgICAgICAgU05BUFNIT1QvMTAwMDAsIChTTkFQU0hPVC8xMDApJTEwMCwgU05BUFNIT1QlMTAwKTsKLSNlbmRpZgorCXByaW50ayhLRVJOX0lORk8gImN4ODgvMDogY3gyMzg4eCB2NGwyIGRyaXZlciB2ZXJzaW9uICVzIGxvYWRlZFxuIiwKKwkgICAgICAgQ1g4OF9WRVJTSU9OKTsKIAlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmY3g4ODAwX3BjaV9kcml2ZXIpOwogfQogCkBAIC0yMTU3LDExICsyMTkyLDMgQEAKIAogbW9kdWxlX2luaXQoY3g4ODAwX2luaXQpOwogbW9kdWxlX2V4aXQoY3g4ODAwX2ZpbmkpOwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotLyoKLSAqIExvY2FsIHZhcmlhYmxlczoKLSAqIGMtYmFzaWMtb2Zmc2V0OiA4Ci0gKiBFbmQ6Ci0gKiBrYXRlOiBlb2wgInVuaXgiOyBpbmRlbnQtd2lkdGggMzsgcmVtb3ZlLXRyYWlsaW5nLXNwYWNlIG9uOyByZXBsYWNlLXRyYWlsaW5nLXNwYWNlLXNhdmUgb247IHRhYi13aWR0aCA4OyByZXBsYWNlLXRhYnMgb2ZmOyBzcGFjZS1pbmRlbnQgb2ZmOyBtaXhlZC1pbmRlbnQgb2ZmCi0gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2N4ODgvY3g4OC5oCmluZGV4IGEzOTlhOGIuLmZhOGQzMDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vY3g4OC9jeDg4LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9jeDg4L2N4ODguaApAQCAtMzksOSArMzksOSBAQAogI2luY2x1ZGUgImN4ODgtcmVnLmgiCiAjaW5jbHVkZSAidHVuZXIteGMyMDI4LmgiCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNkZWZpbmUgQ1g4OF9WRVJTSU9OX0NPREUgS0VSTkVMX1ZFUlNJT04oMCwgMCwgOCkKKworI2RlZmluZSBDWDg4X1ZFUlNJT04gIjAuMC45IgogCiAjZGVmaW5lIFVOU0VUICgtMVUpCiAKQEAgLTI0Miw2ICsyNDIsOCBAQAogI2RlZmluZSBDWDg4X0JPQVJEX1NBTVNVTkdfU01UXzcwMjAgICAgICAgIDg0CiAjZGVmaW5lIENYODhfQk9BUkRfVFdJTkhBTl9WUDEwMjdfRFZCUyAgICAgODUKICNkZWZpbmUgQ1g4OF9CT0FSRF9URVZJSV9TNDY0ICAgICAgICAgICAgICA4NgorI2RlZmluZSBDWDg4X0JPQVJEX1dJTkZBU1RfRFRWMjAwMEhfUExVUyAgIDg3CisjZGVmaW5lIENYODhfQk9BUkRfV0lORkFTVF9EVFYxODAwSF9YQzQwMDAgODgKIAogZW51bSBjeDg4X2l0eXBlIHsKIAlDWDg4X1ZNVVhfQ09NUE9TSVRFMSA9IDEsCkBAIC0zNzUsNiArMzc3LDcgQEAKIAl1MzIgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb21vZGVfbWFudWFsOwogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvbW9kZV9jdXJyZW50OwogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OworCXUzMiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfYW5hbG9nX2lucHV0OwogCXUzMiAgICAgICAgICAgICAgICAgICAgICAgIGFzdGF0OwogCXUzMgkJCSAgIHVzZV9uaWNhbTsKIAl1bnNpZ25lZCBsb25nCQkgICBsYXN0X2NoYW5nZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL0tjb25maWcKaW5kZXggNmIxOTU0MC4uNjBhNDU2ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL0tjb25maWcKQEAgLTkxLDMgKzkxLDI2IEBACiAKIAkgICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgdnBmZS4KKworY29uZmlnIFZJREVPX0RNNjQ0WF9WUEJFCisJdHJpc3RhdGUgIkRNNjQ0WCBWUEJFIEhXIG1vZHVsZSIKKwlkZXBlbmRzIG9uIEFSQ0hfREFWSU5DSV9ETTY0NHgKKwlzZWxlY3QgVklERU9fVlBTU19TWVNURU0KKwlzZWxlY3QgVklERU9CVUZfRE1BX0NPTlRJRworCWhlbHAKKwkgICAgRW5hYmxlcyBWUEJFIG1vZHVsZXMgdXNlZCBmb3IgZGlzcGxheSBvbiBhIERNNjQ0eAorCSAgICBTb0MuCisKKwkgICAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICAgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB2cGJlLgorCisKK2NvbmZpZyBWSURFT19WUEJFX0RJU1BMQVkKKwl0cmlzdGF0ZSAiVlBCRSBWNEwyIERpc3BsYXkgZHJpdmVyIgorCWRlcGVuZHMgb24gQVJDSF9EQVZJTkNJX0RNNjQ0eAorCXNlbGVjdCBWSURFT19ETTY0NFhfVlBCRQorCWhlbHAKKwkgICAgRW5hYmxlcyBWUEJFIFY0TDIgRGlzcGxheSBkcml2ZXIgb24gYSBETTY0NHggZGV2aWNlCisKKwkgICAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICAgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCB2cGJlX2Rpc3BsYXkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvTWFrZWZpbGUKaW5kZXggYTM3OTU1Ny4uYWU3ZGFmYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS9NYWtlZmlsZQpAQCAtMTYsMyArMTYsNSBAQAogb2JqLSQoQ09ORklHX1ZJREVPX0RNNjQ0Nl9DQ0RDKSArPSBkbTY0NHhfY2NkYy5vCiBvYmotJChDT05GSUdfVklERU9fRE0zNTVfQ0NEQykgKz0gZG0zNTVfY2NkYy5vCiBvYmotJChDT05GSUdfVklERU9fSVNJRikgKz0gaXNpZi5vCitvYmotJChDT05GSUdfVklERU9fRE02NDRYX1ZQQkUpICs9IHZwYmUubyB2cGJlX29zZC5vIHZwYmVfdmVuYy5vCitvYmotJChDT05GSUdfVklERU9fVlBCRV9ESVNQTEFZKSArPSB2cGJlX2Rpc3BsYXkubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc3M2QzMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlLmMKQEAgLTAsMCArMSw4NjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3ZwYmVfdHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3ZwYmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3Zwc3MuaD4KKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3ZwYmVfdmVuYy5oPgorCisjZGVmaW5lIFZQQkVfREVGQVVMVF9PVVRQVVQJIkNvbXBvc2l0ZSIKKyNkZWZpbmUgVlBCRV9ERUZBVUxUX01PREUJIm50c2MiCisKK3N0YXRpYyBjaGFyICpkZWZfb3V0cHV0ID0gVlBCRV9ERUZBVUxUX09VVFBVVDsKK3N0YXRpYyBjaGFyICpkZWZfbW9kZSA9IFZQQkVfREVGQVVMVF9NT0RFOworc3RhdGljIGludCBkZWJ1ZzsKKworbW9kdWxlX3BhcmFtKGRlZl9vdXRwdXQsIGNoYXJwLCBTX0lSVUdPKTsKK21vZHVsZV9wYXJhbShkZWZfbW9kZSwgY2hhcnAsIFNfSVJVR08pOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOworCitNT0RVTEVfUEFSTV9ERVNDKGRlZl9vdXRwdXQsICJ2cGJlIG91dHB1dCBuYW1lIChkZWZhdWx0OkNvbXBvc2l0ZSkiKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVmX21vZGUsICJ2cGJlIG91dHB1dCBtb2RlIG5hbWUgKGRlZmF1bHQ6bnRzYyIpOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGxldmVsIDAtMSIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlRJIERNWFhYIFZQQkUgRGlzcGxheSBjb250cm9sbGVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJUZXhhcyBJbnN0cnVtZW50cyIpOworCisvKioKKyAqIHZwYmVfY3VycmVudF9lbmNvZGVyX2luZm8gLSBHZXQgY29uZmlnIGluZm8gZm9yIGN1cnJlbnQgZW5jb2RlcgorICogQHZwYmVfZGV2IC0gdnBiZSBkZXZpY2UgcHRyCisgKgorICogUmV0dXJuIHB0ciB0byBjdXJyZW50IGVuY29kZXIgY29uZmlnIGluZm8KKyAqLworc3RhdGljIHN0cnVjdCBlbmNvZGVyX2NvbmZpZ19pbmZvKgordnBiZV9jdXJyZW50X2VuY29kZXJfaW5mbyhzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2KQoreworCXN0cnVjdCB2cGJlX2NvbmZpZyAqY2ZnID0gdnBiZV9kZXYtPmNmZzsKKwlpbnQgaW5kZXggPSB2cGJlX2Rldi0+Y3VycmVudF9zZF9pbmRleDsKKworCXJldHVybiAoKGluZGV4ID09IDApID8gJmNmZy0+dmVuYyA6CisJCQkJJmNmZy0+ZXh0X2VuY29kZXJzW2luZGV4LTFdKTsKK30KKworLyoqCisgKiB2cGJlX2ZpbmRfZW5jb2Rlcl9zZF9pbmRleCAtIEdpdmVuIGEgbmFtZSBmaW5kIGVuY29kZXIgc2QgaW5kZXgKKyAqCisgKiBAdnBiZV9jb25maWcgLSBwdHIgdG8gdnBiZSBjZmcKKyAqIEBvdXRwdXRfaW5kZXggLSBpbmRleCB1c2VkIGJ5IGFwcGxpY2F0aW9uCisgKgorICogUmV0dXJuIHNkIGluZGV4IG9mIHRoZSBlbmNvZGVyCisgKi8KK3N0YXRpYyBpbnQgdnBiZV9maW5kX2VuY29kZXJfc2RfaW5kZXgoc3RydWN0IHZwYmVfY29uZmlnICpjZmcsCisJCQkgICAgIGludCBpbmRleCkKK3sKKwljaGFyICplbmNvZGVyX25hbWUgPSBjZmctPm91dHB1dHNbaW5kZXhdLnN1YmRldl9uYW1lOworCWludCBpOworCisJLyogVmVuYyBpcyBhbHdheXMgZmlyc3QJKi8KKwlpZiAoIXN0cmNtcChlbmNvZGVyX25hbWUsIGNmZy0+dmVuYy5tb2R1bGVfbmFtZSkpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgaSA8IGNmZy0+bnVtX2V4dF9lbmNvZGVyczsgaSsrKSB7CisJCWlmICghc3RyY21wKGVuY29kZXJfbmFtZSwKKwkJICAgICBjZmctPmV4dF9lbmNvZGVyc1tpXS5tb2R1bGVfbmFtZSkpCisJCQlyZXR1cm4gaSsxOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCisvKioKKyAqIHZwYmVfZ19jcm9wY2FwIC0gR2V0IGNyb3AgY2FwYWJpbGl0aWVzIG9mIHRoZSBkaXNwbGF5CisgKiBAdnBiZV9kZXYgLSB2cGJlIGRldmljZSBwdHIKKyAqIEBjcm9wY2FwIC0gY3JvcGNhcCBpcyBhIHB0ciB0byBzdHJ1Y3QgdjRsMl9jcm9wY2FwCisgKgorICogVXBkYXRlIHRoZSBjcm9wIGNhcGFiaWxpdGllcyBpbiBjcm9wIGNhcCBmb3IgY3VycmVudAorICogbW9kZQorICovCitzdGF0aWMgaW50IHZwYmVfZ19jcm9wY2FwKHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYsCisJCQkgIHN0cnVjdCB2NGwyX2Nyb3BjYXAgKmNyb3BjYXApCit7CisJaWYgKE5VTEwgPT0gY3JvcGNhcCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJY3JvcGNhcC0+Ym91bmRzLmxlZnQgPSAwOworCWNyb3BjYXAtPmJvdW5kcy50b3AgPSAwOworCWNyb3BjYXAtPmJvdW5kcy53aWR0aCA9IHZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MueHJlczsKKwljcm9wY2FwLT5ib3VuZHMuaGVpZ2h0ID0gdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy55cmVzOworCWNyb3BjYXAtPmRlZnJlY3QgPSBjcm9wY2FwLT5ib3VuZHM7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB2cGJlX2VudW1fb3V0cHV0cyAtIGVudW1lcmF0ZSBvdXRwdXRzCisgKiBAdnBiZV9kZXYgLSB2cGJlIGRldmljZSBwdHIKKyAqIEBvdXRwdXQgLSBwdHIgdG8gdjRsMl9vdXRwdXQgc3RydWN0dXJlCisgKgorICogRW51bWVyYXRlcyB0aGUgb3V0cHV0cyBhdmFpbGFibGUgYXQgdGhlIHZwYmUgZGlzcGxheQorICogcmV0dXJucyB0aGUgc3RhdHVzLCAtRUlOVkFMIGlmIGVuZCBvZiBvdXRwdXQgbGlzdAorICovCitzdGF0aWMgaW50IHZwYmVfZW51bV9vdXRwdXRzKHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYsCisJCQkgICAgIHN0cnVjdCB2NGwyX291dHB1dCAqb3V0cHV0KQoreworCXN0cnVjdCB2cGJlX2NvbmZpZyAqY2ZnID0gdnBiZV9kZXYtPmNmZzsKKwlpbnQgdGVtcF9pbmRleCA9IG91dHB1dC0+aW5kZXg7CisKKwlpZiAodGVtcF9pbmRleCA+PSBjZmctPm51bV9vdXRwdXRzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSpvdXRwdXQgPSBjZmctPm91dHB1dHNbdGVtcF9pbmRleF0ub3V0cHV0OworCW91dHB1dC0+aW5kZXggPSB0ZW1wX2luZGV4OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnBiZV9nZXRfbW9kZV9pbmZvKHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYsIGNoYXIgKm1vZGUpCit7CisJc3RydWN0IHZwYmVfY29uZmlnICpjZmcgPSB2cGJlX2Rldi0+Y2ZnOworCXN0cnVjdCB2cGJlX2VuY19tb2RlX2luZm8gdmFyOworCWludCBjdXJyX291dHB1dCA9IHZwYmVfZGV2LT5jdXJyZW50X291dF9pbmRleDsKKwlpbnQgaTsKKworCWlmIChOVUxMID09IG1vZGUpCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChpID0gMDsgaSA8IGNmZy0+b3V0cHV0c1tjdXJyX291dHB1dF0ubnVtX21vZGVzOyBpKyspIHsKKwkJdmFyID0gY2ZnLT5vdXRwdXRzW2N1cnJfb3V0cHV0XS5tb2Rlc1tpXTsKKwkJaWYgKCFzdHJjbXAobW9kZSwgdmFyLm5hbWUpKSB7CisJCQl2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzID0gdmFyOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCB2cGJlX2dldF9jdXJyZW50X21vZGVfaW5mbyhzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2LAorCQkJCSAgICAgIHN0cnVjdCB2cGJlX2VuY19tb2RlX2luZm8gKm1vZGVfaW5mbykKK3sKKwlpZiAoTlVMTCA9PSBtb2RlX2luZm8pCisJCXJldHVybiAtRUlOVkFMOworCisJKm1vZGVfaW5mbyA9IHZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3M7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cGJlX2dldF9kdl9wcmVzZXRfaW5mbyhzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2LAorCQkJCSAgIHVuc2lnbmVkIGludCBkdl9wcmVzZXQpCit7CisJc3RydWN0IHZwYmVfY29uZmlnICpjZmcgPSB2cGJlX2Rldi0+Y2ZnOworCXN0cnVjdCB2cGJlX2VuY19tb2RlX2luZm8gdmFyOworCWludCBjdXJyX291dHB1dCA9IHZwYmVfZGV2LT5jdXJyZW50X291dF9pbmRleDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCB2cGJlX2Rldi0+Y2ZnLT5vdXRwdXRzW2N1cnJfb3V0cHV0XS5udW1fbW9kZXM7IGkrKykgeworCQl2YXIgPSBjZmctPm91dHB1dHNbY3Vycl9vdXRwdXRdLm1vZGVzW2ldOworCQlpZiAoKHZhci50aW1pbmdzX3R5cGUgJiBWUEJFX0VOQ19EVl9QUkVTRVQpICYmCisJCSAgKHZhci50aW1pbmdzLmR2X3ByZXNldCA9PSBkdl9wcmVzZXQpKSB7CisJCQl2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzID0gdmFyOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogR2V0IHN0ZCBieSBzdGQgaWQgKi8KK3N0YXRpYyBpbnQgdnBiZV9nZXRfc3RkX2luZm8oc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiwKKwkJCSAgICAgdjRsMl9zdGRfaWQgc3RkX2lkKQoreworCXN0cnVjdCB2cGJlX2NvbmZpZyAqY2ZnID0gdnBiZV9kZXYtPmNmZzsKKwlzdHJ1Y3QgdnBiZV9lbmNfbW9kZV9pbmZvIHZhcjsKKwlpbnQgY3Vycl9vdXRwdXQgPSB2cGJlX2Rldi0+Y3VycmVudF9vdXRfaW5kZXg7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgdnBiZV9kZXYtPmNmZy0+b3V0cHV0c1tjdXJyX291dHB1dF0ubnVtX21vZGVzOyBpKyspIHsKKwkJdmFyID0gY2ZnLT5vdXRwdXRzW2N1cnJfb3V0cHV0XS5tb2Rlc1tpXTsKKwkJaWYgKCh2YXIudGltaW5nc190eXBlICYgVlBCRV9FTkNfU1REKSAmJgorCQkgICh2YXIudGltaW5ncy5zdGRfaWQgJiBzdGRfaWQpKSB7CisJCQl2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzID0gdmFyOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCB2cGJlX2dldF9zdGRfaW5mb19ieV9uYW1lKHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYsCisJCQkJY2hhciAqc3RkX25hbWUpCit7CisJc3RydWN0IHZwYmVfY29uZmlnICpjZmcgPSB2cGJlX2Rldi0+Y2ZnOworCXN0cnVjdCB2cGJlX2VuY19tb2RlX2luZm8gdmFyOworCWludCBjdXJyX291dHB1dCA9IHZwYmVfZGV2LT5jdXJyZW50X291dF9pbmRleDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCB2cGJlX2Rldi0+Y2ZnLT5vdXRwdXRzW2N1cnJfb3V0cHV0XS5udW1fbW9kZXM7IGkrKykgeworCQl2YXIgPSBjZmctPm91dHB1dHNbY3Vycl9vdXRwdXRdLm1vZGVzW2ldOworCQlpZiAoIXN0cmNtcCh2YXIubmFtZSwgc3RkX25hbWUpKSB7CisJCQl2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzID0gdmFyOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoqCisgKiB2cGJlX3NldF9vdXRwdXQgLSBTZXQgb3V0cHV0CisgKiBAdnBiZV9kZXYgLSB2cGJlIGRldmljZSBwdHIKKyAqIEBpbmRleCAtIGluZGV4IG9mIG91dHB1dAorICoKKyAqIFNldCB2cGJlIG91dHB1dCB0byB0aGUgb3V0cHV0IHNwZWNpZmllZCBieSB0aGUgaW5kZXgKKyAqLworc3RhdGljIGludCB2cGJlX3NldF9vdXRwdXQoc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiwgaW50IGluZGV4KQoreworCXN0cnVjdCBlbmNvZGVyX2NvbmZpZ19pbmZvICpjdXJyX2VuY19pbmZvID0KKwkJCXZwYmVfY3VycmVudF9lbmNvZGVyX2luZm8odnBiZV9kZXYpOworCXN0cnVjdCB2cGJlX2NvbmZpZyAqY2ZnID0gdnBiZV9kZXYtPmNmZzsKKwlpbnQgZW5jX291dF9pbmRleDsKKwlpbnQgc2RfaW5kZXg7CisJaW50IHJldCA9IDA7CisKKwlpZiAoaW5kZXggPj0gY2ZnLT5udW1fb3V0cHV0cykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZ2cGJlX2Rldi0+bG9jayk7CisKKwlzZF9pbmRleCA9IHZwYmVfZGV2LT5jdXJyZW50X3NkX2luZGV4OworCWVuY19vdXRfaW5kZXggPSBjZmctPm91dHB1dHNbaW5kZXhdLm91dHB1dC5pbmRleDsKKwkvKgorCSAqIEN1cnJlbnRseSB3ZSBzd2l0Y2ggdGhlIGVuY29kZXIgYmFzZWQgb24gb3V0cHV0IHNlbGVjdGVkCisJICogYnkgdGhlIGFwcGxpY2F0aW9uLiBJZiBtZWRpYSBjb250cm9sbGVyIGlzIGltcGxlbWVudGVkIGxhdGVyCisJICogdGhlcmUgaXMgd2lsbCBiZSBhbiBBUEkgYWRkZWQgdG8gc2V0dXBfbGluayBiZXR3ZWVuIHZlbmMKKwkgKiBhbmQgZXh0ZXJuYWwgZW5jb2Rlci4gU28gaW4gdGhhdCBjYXNlIGJlbG93IGNvbXBhcmlzb24gYWx3YXlzCisJICogbWF0Y2ggYW5kIGVuY29kZXIgd2lsbCBub3QgYmUgc3dpdGNoZWQuIEJ1dCBpZiBhcHBsaWNhdGlvbgorCSAqIGNob3NlIG5vdCB0byB1c2UgbWVkaWEgY29udHJvbGxlciwgdGhlbiB0aGlzIHByb3ZpZGVzIGN1cnJlbnQKKwkgKiB3YXkgb2Ygc3dpdGNoaW5nIGVuY29kZXIgYXQgdGhlIHZlbmMgb3V0cHV0LgorCSAqLworCWlmIChzdHJjbXAoY3Vycl9lbmNfaW5mby0+bW9kdWxlX25hbWUsCisJCSAgIGNmZy0+b3V0cHV0c1tpbmRleF0uc3ViZGV2X25hbWUpKSB7CisJCS8qIE5lZWQgdG8gc3dpdGNoIHRoZSBlbmNvZGVyIGF0IHRoZSBvdXRwdXQgKi8KKwkJc2RfaW5kZXggPSB2cGJlX2ZpbmRfZW5jb2Rlcl9zZF9pbmRleChjZmcsIGluZGV4KTsKKwkJaWYgKHNkX2luZGV4IDwgMCkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKHJldCkKKwkJCWdvdG8gb3V0OworCX0KKworCS8qIFNldCBvdXRwdXQgYXQgdGhlIGVuY29kZXIgKi8KKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHZwYmVfZGV2LT5lbmNvZGVyc1tzZF9pbmRleF0sIHZpZGVvLAorCQkJCSAgICAgICBzX3JvdXRpbmcsIDAsIGVuY19vdXRfaW5kZXgsIDApOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBJdCBpcyBhc3N1bWVkIHRoYXQgdmVuYyBvciBleHRlbmFsIGVuY29kZXIgd2lsbCBzZXQgYSBkZWZhdWx0CisJICogbW9kZSBpbiB0aGUgc3ViIGRldmljZS4gRm9yIGV4dGVybmFsIGVuY29kZXIgb3IgTENEIHBhbm5lbCBvdXRwdXQsCisJICogd2UgYWxzbyBuZWVkIHRvIHNldCB1cCB0aGUgbGNkIHBvcnQgZm9yIHRoZSByZXF1aXJlZCBtb2RlLiBTbyBzZXR1cAorCSAqIHRoZSBsY2QgcG9ydCBmb3IgdGhlIGRlZmF1bHQgbW9kZSB0aGF0IGlzIGNvbmZpZ3VyZWQgaW4gdGhlIGJvYXJkCisJICogYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtMzU1LWV2bS5zZXR1cCBmaWxlIGZvciB0aGUgZXh0ZXJuYWwKKwkgKiBlbmNvZGVyLgorCSAqLworCXJldCA9IHZwYmVfZ2V0X21vZGVfaW5mbyh2cGJlX2RldiwKKwkJCQkgY2ZnLT5vdXRwdXRzW2luZGV4XS5kZWZhdWx0X21vZGUpOworCWlmICghcmV0KSB7CisJCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZF9kZXZpY2UgPSB2cGJlX2Rldi0+b3NkX2RldmljZTsKKworCQlvc2RfZGV2aWNlLT5vcHMuc2V0X2xlZnRfbWFyZ2luKG9zZF9kZXZpY2UsCisJCQl2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLmxlZnRfbWFyZ2luKTsKKwkJb3NkX2RldmljZS0+b3BzLnNldF90b3BfbWFyZ2luKG9zZF9kZXZpY2UsCisJCXZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MudXBwZXJfbWFyZ2luKTsKKwkJdnBiZV9kZXYtPmN1cnJlbnRfc2RfaW5kZXggPSBzZF9pbmRleDsKKwkJdnBiZV9kZXYtPmN1cnJlbnRfb3V0X2luZGV4ID0gaW5kZXg7CisJfQorb3V0OgorCW11dGV4X3VubG9jaygmdnBiZV9kZXYtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdnBiZV9zZXRfZGVmYXVsdF9vdXRwdXQoc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldikKK3sKKwlzdHJ1Y3QgdnBiZV9jb25maWcgKmNmZyA9IHZwYmVfZGV2LT5jZmc7CisJaW50IHJldCA9IDA7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2ZnLT5udW1fb3V0cHV0czsgaSsrKSB7CisJCWlmICghc3RyY21wKGRlZl9vdXRwdXQsCisJCQkgICAgY2ZnLT5vdXRwdXRzW2ldLm91dHB1dC5uYW1lKSkgeworCQkJcmV0ID0gdnBiZV9zZXRfb3V0cHV0KHZwYmVfZGV2LCBpKTsKKwkJCWlmICghcmV0KQorCQkJCXZwYmVfZGV2LT5jdXJyZW50X291dF9pbmRleCA9IGk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogdnBiZV9nZXRfb3V0cHV0IC0gR2V0IG91dHB1dAorICogQHZwYmVfZGV2IC0gdnBiZSBkZXZpY2UgcHRyCisgKgorICogcmV0dXJuIGN1cnJlbnQgdnBiZSBvdXRwdXQgdG8gdGhlIHRoZSBpbmRleAorICovCitzdGF0aWMgdW5zaWduZWQgaW50IHZwYmVfZ2V0X291dHB1dChzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2KQoreworCXJldHVybiB2cGJlX2Rldi0+Y3VycmVudF9vdXRfaW5kZXg7Cit9CisKKy8qKgorICogdnBiZV9zX2R2X3ByZXNldCAtIFNldCB0aGUgZ2l2ZW4gcHJlc2V0IHRpbWluZ3MgaW4gdGhlIGVuY29kZXIKKyAqCisgKiBTZXRzIHRoZSBwcmVzZXQgaWYgc3VwcG9ydGVkIGJ5IHRoZSBjdXJyZW50IGVuY29kZXIuIFJldHVybiB0aGUgc3RhdHVzLgorICogMCAtIHN1Y2Nlc3MgJiAtRUlOVkFMIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgdnBiZV9zX2R2X3ByZXNldChzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2LAorCQkgICAgIHN0cnVjdCB2NGwyX2R2X3ByZXNldCAqZHZfcHJlc2V0KQoreworCXN0cnVjdCB2cGJlX2NvbmZpZyAqY2ZnID0gdnBiZV9kZXYtPmNmZzsKKwlpbnQgb3V0X2luZGV4ID0gdnBiZV9kZXYtPmN1cnJlbnRfb3V0X2luZGV4OworCWludCBzZF9pbmRleCA9IHZwYmVfZGV2LT5jdXJyZW50X3NkX2luZGV4OworCWludCByZXQ7CisKKworCWlmICghKGNmZy0+b3V0cHV0c1tvdXRfaW5kZXhdLm91dHB1dC5jYXBhYmlsaXRpZXMgJgorCSAgICBWNEwyX09VVF9DQVBfUFJFU0VUUykpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gdnBiZV9nZXRfZHZfcHJlc2V0X2luZm8odnBiZV9kZXYsIGR2X3ByZXNldC0+cHJlc2V0KTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwltdXRleF9sb2NrKCZ2cGJlX2Rldi0+bG9jayk7CisKKworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwodnBiZV9kZXYtPmVuY29kZXJzW3NkX2luZGV4XSwgdmlkZW8sCisJCQkJCXNfZHZfcHJlc2V0LCBkdl9wcmVzZXQpOworCS8qIHNldCB0aGUgbGNkIGNvbnRyb2xsZXIgb3V0cHV0IGZvciB0aGUgZ2l2ZW4gbW9kZSAqLworCWlmICghcmV0KSB7CisJCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZF9kZXZpY2UgPSB2cGJlX2Rldi0+b3NkX2RldmljZTsKKworCQlvc2RfZGV2aWNlLT5vcHMuc2V0X2xlZnRfbWFyZ2luKG9zZF9kZXZpY2UsCisJCXZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MubGVmdF9tYXJnaW4pOworCQlvc2RfZGV2aWNlLT5vcHMuc2V0X3RvcF9tYXJnaW4ob3NkX2RldmljZSwKKwkJdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy51cHBlcl9tYXJnaW4pOworCX0KKwltdXRleF91bmxvY2soJnZwYmVfZGV2LT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogdnBiZV9nX2R2X3ByZXNldCAtIEdldCB0aGUgcHJlc2V0IGluIHRoZSBjdXJyZW50IGVuY29kZXIKKyAqCisgKiBHZXQgdGhlIHByZXNldCBpbiB0aGUgY3VycmVudCBlbmNvZGVyLiBSZXR1cm4gdGhlIHN0YXR1cy4gMCAtIHN1Y2Nlc3MKKyAqIC1FSU5WQUwgb24gZXJyb3IKKyAqLworc3RhdGljIGludCB2cGJlX2dfZHZfcHJlc2V0KHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYsCisJCSAgICAgc3RydWN0IHY0bDJfZHZfcHJlc2V0ICpkdl9wcmVzZXQpCit7CisJaWYgKHZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MudGltaW5nc190eXBlICYKKwkgIFZQQkVfRU5DX0RWX1BSRVNFVCkgeworCQlkdl9wcmVzZXQtPnByZXNldCA9IHZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MudGltaW5ncy5kdl9wcmVzZXQ7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCisvKioKKyAqIHZwYmVfZW51bV9kdl9wcmVzZXRzIC0gRW51bWVyYXRlIHRoZSBkdiBwcmVzZXRzIGluIHRoZSBjdXJyZW50IGVuY29kZXIKKyAqCisgKiBHZXQgdGhlIHByZXNldCBpbiB0aGUgY3VycmVudCBlbmNvZGVyLiBSZXR1cm4gdGhlIHN0YXR1cy4gMCAtIHN1Y2Nlc3MKKyAqIC1FSU5WQUwgb24gZXJyb3IKKyAqLworc3RhdGljIGludCB2cGJlX2VudW1fZHZfcHJlc2V0cyhzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2LAorCQkJIHN0cnVjdCB2NGwyX2R2X2VudW1fcHJlc2V0ICpwcmVzZXRfaW5mbykKK3sKKwlzdHJ1Y3QgdnBiZV9jb25maWcgKmNmZyA9IHZwYmVfZGV2LT5jZmc7CisJaW50IG91dF9pbmRleCA9IHZwYmVfZGV2LT5jdXJyZW50X291dF9pbmRleDsKKwlzdHJ1Y3QgdnBiZV9vdXRwdXQgKm91dHB1dCA9ICZjZmctPm91dHB1dHNbb3V0X2luZGV4XTsKKwlpbnQgaiA9IDA7CisJaW50IGk7CisKKwlpZiAoIShvdXRwdXQtPm91dHB1dC5jYXBhYmlsaXRpZXMgJiBWNEwyX09VVF9DQVBfUFJFU0VUUykpCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChpID0gMDsgaSA8IG91dHB1dC0+bnVtX21vZGVzOyBpKyspIHsKKwkJaWYgKG91dHB1dC0+bW9kZXNbaV0udGltaW5nc190eXBlID09IFZQQkVfRU5DX0RWX1BSRVNFVCkgeworCQkJaWYgKGogPT0gcHJlc2V0X2luZm8tPmluZGV4KQorCQkJCWJyZWFrOworCQkJaisrOworCQl9CisJfQorCisJaWYgKGkgPT0gb3V0cHV0LT5udW1fbW9kZXMpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHY0bF9maWxsX2R2X3ByZXNldF9pbmZvKG91dHB1dC0+bW9kZXNbaV0udGltaW5ncy5kdl9wcmVzZXQsCisJCQkJCXByZXNldF9pbmZvKTsKK30KKworLyoqCisgKiB2cGJlX3Nfc3RkIC0gU2V0IHRoZSBnaXZlbiBzdGFuZGFyZCBpbiB0aGUgZW5jb2RlcgorICoKKyAqIFNldHMgdGhlIHN0YW5kYXJkIGlmIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBlbmNvZGVyLiBSZXR1cm4gdGhlIHN0YXR1cy4KKyAqIDAgLSBzdWNjZXNzICYgLUVJTlZBTCBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IHZwYmVfc19zdGQoc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiwgdjRsMl9zdGRfaWQgKnN0ZF9pZCkKK3sKKwlzdHJ1Y3QgdnBiZV9jb25maWcgKmNmZyA9IHZwYmVfZGV2LT5jZmc7CisJaW50IG91dF9pbmRleCA9IHZwYmVfZGV2LT5jdXJyZW50X291dF9pbmRleDsKKwlpbnQgc2RfaW5kZXggPSB2cGJlX2Rldi0+Y3VycmVudF9zZF9pbmRleDsKKwlpbnQgcmV0OworCisJaWYgKCEoY2ZnLT5vdXRwdXRzW291dF9pbmRleF0ub3V0cHV0LmNhcGFiaWxpdGllcyAmCisJCVY0TDJfT1VUX0NBUF9TVEQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IHZwYmVfZ2V0X3N0ZF9pbmZvKHZwYmVfZGV2LCAqc3RkX2lkKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJbXV0ZXhfbG9jaygmdnBiZV9kZXYtPmxvY2spOworCisJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbCh2cGJlX2Rldi0+ZW5jb2RlcnNbc2RfaW5kZXhdLCB2aWRlbywKKwkJCSAgICAgICBzX3N0ZF9vdXRwdXQsICpzdGRfaWQpOworCS8qIHNldCB0aGUgbGNkIGNvbnRyb2xsZXIgb3V0cHV0IGZvciB0aGUgZ2l2ZW4gbW9kZSAqLworCWlmICghcmV0KSB7CisJCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZF9kZXZpY2UgPSB2cGJlX2Rldi0+b3NkX2RldmljZTsKKworCQlvc2RfZGV2aWNlLT5vcHMuc2V0X2xlZnRfbWFyZ2luKG9zZF9kZXZpY2UsCisJCXZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MubGVmdF9tYXJnaW4pOworCQlvc2RfZGV2aWNlLT5vcHMuc2V0X3RvcF9tYXJnaW4ob3NkX2RldmljZSwKKwkJdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy51cHBlcl9tYXJnaW4pOworCX0KKwltdXRleF91bmxvY2soJnZwYmVfZGV2LT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogdnBiZV9nX3N0ZCAtIEdldCB0aGUgc3RhbmRhcmQgaW4gdGhlIGN1cnJlbnQgZW5jb2RlcgorICoKKyAqIEdldCB0aGUgc3RhbmRhcmQgaW4gdGhlIGN1cnJlbnQgZW5jb2Rlci4gUmV0dXJuIHRoZSBzdGF0dXMuIDAgLSBzdWNjZXNzCisgKiAtRUlOVkFMIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgdnBiZV9nX3N0ZChzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2LCB2NGwyX3N0ZF9pZCAqc3RkX2lkKQoreworCXN0cnVjdCB2cGJlX2VuY19tb2RlX2luZm8gY3VyX3RpbWluZ3MgPSB2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzOworCisJaWYgKGN1cl90aW1pbmdzLnRpbWluZ3NfdHlwZSAmIFZQQkVfRU5DX1NURCkgeworCQkqc3RkX2lkID0gY3VyX3RpbWluZ3MudGltaW5ncy5zdGRfaWQ7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCisvKioKKyAqIHZwYmVfc2V0X21vZGUgLSBTZXQgbW9kZSBpbiB0aGUgY3VycmVudCBlbmNvZGVyIHVzaW5nIG1vZGUgaW5mbworICoKKyAqIFVzZSB0aGUgbW9kZSBzdHJpbmcgdG8gZGVjaWRlIHdoYXQgdGltaW5ncyB0byBzZXQgaW4gdGhlIGVuY29kZXIKKyAqIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWZ1bCB3aGVuIGZic2V0IGNvbW1hbmQgaXMgdXNlZCB0byBjaGFuZ2UgdGhlIGN1cnJlbnQKKyAqIHRpbWluZ3MgYnkgc3BlY2lmeWluZyBhIHN0cmluZyB0byBpbmRpY2F0ZSB0aGUgdGltaW5ncy4KKyAqLworc3RhdGljIGludCB2cGJlX3NldF9tb2RlKHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYsCisJCQkgc3RydWN0IHZwYmVfZW5jX21vZGVfaW5mbyAqbW9kZV9pbmZvKQoreworCXN0cnVjdCB2cGJlX2VuY19tb2RlX2luZm8gKnByZXNldF9tb2RlID0gTlVMTDsKKwlzdHJ1Y3QgdnBiZV9jb25maWcgKmNmZyA9IHZwYmVfZGV2LT5jZmc7CisJc3RydWN0IHY0bDJfZHZfcHJlc2V0IGR2X3ByZXNldDsKKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2RfZGV2aWNlOworCWludCBvdXRfaW5kZXggPSB2cGJlX2Rldi0+Y3VycmVudF9vdXRfaW5kZXg7CisJaW50IHJldCA9IDA7CisJaW50IGk7CisKKwlpZiAoKE5VTEwgPT0gbW9kZV9pbmZvKSB8fCAoTlVMTCA9PSBtb2RlX2luZm8tPm5hbWUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBjZmctPm91dHB1dHNbb3V0X2luZGV4XS5udW1fbW9kZXM7IGkrKykgeworCQlpZiAoIXN0cmNtcChtb2RlX2luZm8tPm5hbWUsCisJCSAgICAgY2ZnLT5vdXRwdXRzW291dF9pbmRleF0ubW9kZXNbaV0ubmFtZSkpIHsKKwkJCXByZXNldF9tb2RlID0gJmNmZy0+b3V0cHV0c1tvdXRfaW5kZXhdLm1vZGVzW2ldOworCQkJLyoKKwkJCSAqIGl0IG1heSBiZSBvbmUgb2YgdGhlIDMgdGltaW5ncyB0eXBlLiBDaGVjayBhbmQKKwkJCSAqIGludm9rZSByaWdodCBBUEkKKwkJCSAqLworCQkJaWYgKHByZXNldF9tb2RlLT50aW1pbmdzX3R5cGUgJiBWUEJFX0VOQ19TVEQpCisJCQkJcmV0dXJuIHZwYmVfc19zdGQodnBiZV9kZXYsCisJCQkJCQkgJnByZXNldF9tb2RlLT50aW1pbmdzLnN0ZF9pZCk7CisJCQlpZiAocHJlc2V0X21vZGUtPnRpbWluZ3NfdHlwZSAmIFZQQkVfRU5DX0RWX1BSRVNFVCkgeworCQkJCWR2X3ByZXNldC5wcmVzZXQgPQorCQkJCQlwcmVzZXRfbW9kZS0+dGltaW5ncy5kdl9wcmVzZXQ7CisJCQkJcmV0dXJuIHZwYmVfc19kdl9wcmVzZXQodnBiZV9kZXYsICZkdl9wcmVzZXQpOworCQkJfQorCQl9CisJfQorCisJLyogT25seSBjdXN0b20gdGltaW5nIHNob3VsZCByZWFjaCBoZXJlICovCisJaWYgKHByZXNldF9tb2RlID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmdnBiZV9kZXYtPmxvY2spOworCisJb3NkX2RldmljZSA9IHZwYmVfZGV2LT5vc2RfZGV2aWNlOworCXZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MgPSAqcHJlc2V0X21vZGU7CisJb3NkX2RldmljZS0+b3BzLnNldF9sZWZ0X21hcmdpbihvc2RfZGV2aWNlLAorCQl2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLmxlZnRfbWFyZ2luKTsKKwlvc2RfZGV2aWNlLT5vcHMuc2V0X3RvcF9tYXJnaW4ob3NkX2RldmljZSwKKwkJdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy51cHBlcl9tYXJnaW4pOworCisJbXV0ZXhfdW5sb2NrKCZ2cGJlX2Rldi0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZwYmVfc2V0X2RlZmF1bHRfbW9kZShzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2KQoreworCWludCByZXQ7CisKKwlyZXQgPSB2cGJlX2dldF9zdGRfaW5mb19ieV9uYW1lKHZwYmVfZGV2LCBkZWZfbW9kZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIHNldCB0aGUgZGVmYXVsdCBtb2RlIGluIHRoZSBlbmNvZGVyICovCisJcmV0dXJuIHZwYmVfc2V0X21vZGUodnBiZV9kZXYsICZ2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzKTsKK30KKworc3RhdGljIGludCBwbGF0Zm9ybV9kZXZpY2VfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGRhdGE7CisKKwlpZiAoc3RyY21wKCJ2cGJlLW9zZCIsIHBkZXYtPm5hbWUpID09IDApCisJCXZwYmVfZGV2LT5vc2RfZGV2aWNlID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB2cGJlX2luaXRpYWxpemUoKSAtIEluaXRpYWxpemUgdGhlIHZwYmUgZGlzcGxheSBjb250cm9sbGVyCisgKiBAdnBiZV9kZXYgLSB2cGJlIGRldmljZSBwdHIKKyAqCisgKiBNYXN0ZXIgZnJhbWUgYnVmZmVyIGRldmljZSBkcml2ZXJzIGNhbGxzIHRoaXMgdG8gaW5pdGlhbGl6ZSB2cGJlCisgKiBkaXNwbGF5IGNvbnRyb2xsZXIuIFRoaXMgd2lsbCB0aGVuIHJlZ2lzdGVycyB2NGwyIGRldmljZSBhbmQgdGhlIHN1YgorICogZGV2aWNlcyBhbmQgc2V0cyBhIGN1cnJlbnQgZW5jb2RlciBzdWIgZGV2aWNlIGZvciBkaXNwbGF5LiB2NGwyIGRpc3BsYXkKKyAqIGRldmljZSBkcml2ZXIgaXMgdGhlIG1hc3RlciBhbmQgZnJhbWUgYnVmZmVyIGRpc3BsYXkgZGV2aWNlIGRyaXZlciBpcworICogdGhlIHNsYXZlLiBGcmFtZSBidWZmZXIgZGlzcGxheSBkcml2ZXIgY2hlY2tzIHRoZSBpbml0aWFsaXplZCBkdXJpbmcKKyAqIHByb2JlIGFuZCBleGl0IGlmIG5vdCBpbml0aWFsaXplZC4gUmV0dXJucyBzdGF0dXMuCisgKi8KK3N0YXRpYyBpbnQgdnBiZV9pbml0aWFsaXplKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldikKK3sKKwlzdHJ1Y3QgZW5jb2Rlcl9jb25maWdfaW5mbyAqZW5jX2luZm87CisJc3RydWN0IHY0bDJfc3ViZGV2ICoqZW5jX3N1YmRldjsKKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2RfZGV2aWNlOworCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjX2FkYXA7CisJaW50IG91dHB1dF9pbmRleDsKKwlpbnQgbnVtX2VuY29kZXJzOworCWludCByZXQgPSAwOworCWludCBlcnI7CisJaW50IGk7CisKKwkvKgorCSAqIHY0bDIgYWJkIEZCRGV2IGZyYW1lIGJ1ZmZlciBkZXZpY2VzIHdpbGwgZ2V0IHRoZSB2cGJlX2RldiBwb2ludGVyCisJICogZnJvbSB0aGUgcGxhdGZvcm0gZGV2aWNlIGJ5IGl0ZXJhdGlvbiBvZiBwbGF0Zm9ybSBkcml2ZXJzIGFuZAorCSAqIG1hdGNoaW5nIHdpdGggZGV2aWNlIG5hbWUKKwkgKi8KKwlpZiAoTlVMTCA9PSB2cGJlX2RldiB8fCBOVUxMID09IGRldikgeworCQlwcmludGsoS0VSTl9FUlIgIk51bGwgZGV2aWNlIHBvaW50ZXJzLlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICh2cGJlX2Rldi0+aW5pdGlhbGl6ZWQpCisJCXJldHVybiAwOworCisJbXV0ZXhfbG9jaygmdnBiZV9kZXYtPmxvY2spOworCisJaWYgKHN0cmNtcCh2cGJlX2Rldi0+Y2ZnLT5tb2R1bGVfbmFtZSwgImRtNjQ0eC12cGJlLWRpc3BsYXkiKSAhPSAwKSB7CisJCS8qIFdlIGhhdmUgZGFjIGNsb2NrIGF2YWlsYWJsZSBmb3IgcGxhdGZvcm0gKi8KKwkJdnBiZV9kZXYtPmRhY19jbGsgPSBjbGtfZ2V0KHZwYmVfZGV2LT5wZGV2LCAidnBzc19kYWMiKTsKKwkJaWYgKElTX0VSUih2cGJlX2Rldi0+ZGFjX2NsaykpIHsKKwkJCXJldCA9ICBQVFJfRVJSKHZwYmVfZGV2LT5kYWNfY2xrKTsKKwkJCWdvdG8gdnBiZV91bmxvY2s7CisJCX0KKwkJaWYgKGNsa19lbmFibGUodnBiZV9kZXYtPmRhY19jbGspKSB7CisJCQlyZXQgPSAgLUVOT0RFVjsKKwkJCWdvdG8gdnBiZV91bmxvY2s7CisJCX0KKwl9CisKKwkvKiBmaXJzdCBlbmFibGUgdnBzcyBjbG9ja3MgKi8KKwl2cHNzX2VuYWJsZV9jbG9jayhWUFNTX1ZQQkVfQ0xPQ0ssIDEpOworCisJLyogRmlyc3QgcmVnaXN0ZXIgYSB2NGwyIGRldmljZSAqLworCXJldCA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyKGRldiwgJnZwYmVfZGV2LT52NGwyX2Rldik7CisJaWYgKHJldCkgeworCQl2NGwyX2VycihkZXYtPmRyaXZlciwKKwkJCSJVbmFibGUgdG8gcmVnaXN0ZXIgdjRsMiBkZXZpY2UuXG4iKTsKKwkJZ290byB2cGJlX2ZhaWxfY2xvY2s7CisJfQorCXY0bDJfaW5mbygmdnBiZV9kZXYtPnY0bDJfZGV2LCAidnBiZSB2NGwyIGRldmljZSByZWdpc3RlcmVkXG4iKTsKKworCWVyciA9IGJ1c19mb3JfZWFjaF9kZXYoJnBsYXRmb3JtX2J1c190eXBlLCBOVUxMLCB2cGJlX2RldiwKKwkJCSAgICAgICBwbGF0Zm9ybV9kZXZpY2VfZ2V0KTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXZwYmVfZGV2LT52ZW5jID0gdmVuY19zdWJfZGV2X2luaXQoJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCQkJICAgdnBiZV9kZXYtPmNmZy0+dmVuYy5tb2R1bGVfbmFtZSk7CisJLyogcmVnaXN0ZXIgdmVuYyBzdWIgZGV2aWNlICovCisJaWYgKHZwYmVfZGV2LT52ZW5jID09IE5VTEwpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCSJ2cGJlIHVuYWJsZSB0byBpbml0IHZlbmMgc3ViIGRldmljZVxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gdnBiZV9mYWlsX3Y0bDJfZGV2aWNlOworCX0KKwkvKiBpbml0aWFsaXplIG9zZCBkZXZpY2UgKi8KKwlvc2RfZGV2aWNlID0gdnBiZV9kZXYtPm9zZF9kZXZpY2U7CisKKwlpZiAoTlVMTCAhPSBvc2RfZGV2aWNlLT5vcHMuaW5pdGlhbGl6ZSkgeworCQllcnIgPSBvc2RfZGV2aWNlLT5vcHMuaW5pdGlhbGl6ZShvc2RfZGV2aWNlKTsKKwkJaWYgKGVycikgeworCQkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCQkgInVuYWJsZSB0byBpbml0aWFsaXplIHRoZSBPU0QgZGV2aWNlIik7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byB2cGJlX2ZhaWxfdjRsMl9kZXZpY2U7CisJCX0KKwl9CisKKwkvKgorCSAqIFJlZ2lzdGVyIGFueSBleHRlcm5hbCBlbmNvZGVycyB0aGF0IGFyZSBjb25maWd1cmVkLiBBdCBpbmRleCAwIHdlCisJICogc3RvcmUgdmVuYyBzZCBpbmRleC4KKwkgKi8KKwludW1fZW5jb2RlcnMgPSB2cGJlX2Rldi0+Y2ZnLT5udW1fZXh0X2VuY29kZXJzICsgMTsKKwl2cGJlX2Rldi0+ZW5jb2RlcnMgPSBrbWFsbG9jKAorCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9zdWJkZXYgKikqbnVtX2VuY29kZXJzLAorCQkJCUdGUF9LRVJORUwpOworCWlmIChOVUxMID09IHZwYmVfZGV2LT5lbmNvZGVycykgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJInVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGVuY29kZXJzIHN1YiBkZXZpY2VzIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gdnBiZV9mYWlsX3Y0bDJfZGV2aWNlOworCX0KKworCWkyY19hZGFwID0gaTJjX2dldF9hZGFwdGVyKHZwYmVfZGV2LT5jZmctPmkyY19hZGFwdGVyX2lkKTsKKwlmb3IgKGkgPSAwOyBpIDwgKHZwYmVfZGV2LT5jZmctPm51bV9leHRfZW5jb2RlcnMgKyAxKTsgaSsrKSB7CisJCWlmIChpID09IDApIHsKKwkJCS8qIHZlbmMgaXMgYXQgaW5kZXggMCAqLworCQkJZW5jX3N1YmRldiA9ICZ2cGJlX2Rldi0+ZW5jb2RlcnNbaV07CisJCQkqZW5jX3N1YmRldiA9IHZwYmVfZGV2LT52ZW5jOworCQkJY29udGludWU7CisJCX0KKwkJZW5jX2luZm8gPSAmdnBiZV9kZXYtPmNmZy0+ZXh0X2VuY29kZXJzW2ldOworCQlpZiAoZW5jX2luZm8tPmlzX2kyYykgeworCQkJZW5jX3N1YmRldiA9ICZ2cGJlX2Rldi0+ZW5jb2RlcnNbaV07CisJCQkqZW5jX3N1YmRldiA9IHY0bDJfaTJjX25ld19zdWJkZXZfYm9hcmQoCisJCQkJCQkmdnBiZV9kZXYtPnY0bDJfZGV2LCBpMmNfYWRhcCwKKwkJCQkJCSZlbmNfaW5mby0+Ym9hcmRfaW5mbywgTlVMTCk7CisJCQlpZiAoKmVuY19zdWJkZXYpCisJCQkJdjRsMl9pbmZvKCZ2cGJlX2Rldi0+djRsMl9kZXYsCisJCQkJCSAgInY0bDIgc3ViIGRldmljZSAlcyByZWdpc3RlcmVkXG4iLAorCQkJCQkgIGVuY19pbmZvLT5tb2R1bGVfbmFtZSk7CisJCQllbHNlIHsKKwkJCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiZW5jb2RlciAlcyIKKwkJCQkJICIgZmFpbGVkIHRvIHJlZ2lzdGVyIiwKKwkJCQkJIGVuY19pbmZvLT5tb2R1bGVfbmFtZSk7CisJCQkJcmV0ID0gLUVOT0RFVjsKKwkJCQlnb3RvIHZwYmVfZmFpbF9zZF9yZWdpc3RlcjsKKwkJCX0KKwkJfSBlbHNlCisJCQl2NGwyX3dhcm4oJnZwYmVfZGV2LT52NGwyX2RldiwgIm5vbi1pMmMgZW5jb2RlcnMiCisJCQkJICIgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQiKTsKKwl9CisKKwkvKiBzZXQgdGhlIGN1cnJlbnQgZW5jb2RlciBhbmQgb3V0cHV0IHRvIHRoYXQgb2YgdmVuYyBieSBkZWZhdWx0ICovCisJdnBiZV9kZXYtPmN1cnJlbnRfc2RfaW5kZXggPSAwOworCXZwYmVfZGV2LT5jdXJyZW50X291dF9pbmRleCA9IDA7CisJb3V0cHV0X2luZGV4ID0gMDsKKworCW11dGV4X3VubG9jaygmdnBiZV9kZXYtPmxvY2spOworCisJcHJpbnRrKEtFUk5fTk9USUNFICJTZXR0aW5nIGRlZmF1bHQgb3V0cHV0IHRvICVzXG4iLCBkZWZfb3V0cHV0KTsKKwlyZXQgPSB2cGJlX3NldF9kZWZhdWx0X291dHB1dCh2cGJlX2Rldik7CisJaWYgKHJldCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiRmFpbGVkIHRvIHNldCBkZWZhdWx0IG91dHB1dCAlcyIsCisJCQkgZGVmX291dHB1dCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcHJpbnRrKEtFUk5fTk9USUNFICJTZXR0aW5nIGRlZmF1bHQgbW9kZSB0byAlc1xuIiwgZGVmX21vZGUpOworCXJldCA9IHZwYmVfc2V0X2RlZmF1bHRfbW9kZSh2cGJlX2Rldik7CisJaWYgKHJldCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiRmFpbGVkIHRvIHNldCBkZWZhdWx0IG1vZGUgJXMiLAorCQkJIGRlZl9tb2RlKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJdnBiZV9kZXYtPmluaXRpYWxpemVkID0gMTsKKwkvKiBUQkQgaGFuZGxpbmcgb2YgYm9vdGFyZ3MgZm9yIGRlZmF1bHQgb3V0cHV0IGFuZCBtb2RlICovCisJcmV0dXJuIDA7CisKK3ZwYmVfZmFpbF9zZF9yZWdpc3RlcjoKKwlrZnJlZSh2cGJlX2Rldi0+ZW5jb2RlcnMpOwordnBiZV9mYWlsX3Y0bDJfZGV2aWNlOgorCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJnZwYmVfZGV2LT52NGwyX2Rldik7Cit2cGJlX2ZhaWxfY2xvY2s6CisJaWYgKHN0cmNtcCh2cGJlX2Rldi0+Y2ZnLT5tb2R1bGVfbmFtZSwgImRtNjQ0eC12cGJlLWRpc3BsYXkiKSAhPSAwKQorCQljbGtfcHV0KHZwYmVfZGV2LT5kYWNfY2xrKTsKK3ZwYmVfdW5sb2NrOgorCW11dGV4X3VubG9jaygmdnBiZV9kZXYtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogdnBiZV9kZWluaXRpYWxpemUoKSAtIGRlLWluaXRpYWxpemUgdGhlIHZwYmUgZGlzcGxheSBjb250cm9sbGVyCisgKiBAZGV2IC0gTWFzdGVyIGFuZCBzbGF2ZSBkZXZpY2UgcHRyCisgKgorICogdnBiZV9tYXN0ZXIgYW5kIHNsYXZlIGZyYW1lIGJ1ZmZlciBkZXZpY2VzIGNhbGxzIHRoaXMgdG8gZGUtaW5pdGlhbGl6ZQorICogdGhlIGRpc3BsYXkgY29udHJvbGxlci4gSXQgaXMgY2FsbGVkIHdoZW4gbWFzdGVyIGFuZCBzbGF2ZSBkZXZpY2UKKyAqIGRyaXZlciBtb2R1bGVzIGFyZSByZW1vdmVkIGFuZCBubyBsb25nZXIgcmVxdWlyZXMgdGhlIGRpc3BsYXkgY29udHJvbGxlci4KKyAqLworc3RhdGljIHZvaWQgdnBiZV9kZWluaXRpYWxpemUoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2KQoreworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJnZwYmVfZGV2LT52NGwyX2Rldik7CisJaWYgKHN0cmNtcCh2cGJlX2Rldi0+Y2ZnLT5tb2R1bGVfbmFtZSwgImRtNjQ0eC12cGJlLWRpc3BsYXkiKSAhPSAwKQorCQljbGtfcHV0KHZwYmVfZGV2LT5kYWNfY2xrKTsKKworCWtmcmVlKHZwYmVfZGV2LT5lbmNvZGVycyk7CisJdnBiZV9kZXYtPmluaXRpYWxpemVkID0gMDsKKwkvKiBkaXNhYmxlIHZwc3MgY2xvY2tzICovCisJdnBzc19lbmFibGVfY2xvY2soVlBTU19WUEJFX0NMT0NLLCAwKTsKK30KKworc3RhdGljIHN0cnVjdCB2cGJlX2RldmljZV9vcHMgdnBiZV9kZXZfb3BzID0geworCS5nX2Nyb3BjYXAgPSB2cGJlX2dfY3JvcGNhcCwKKwkuZW51bV9vdXRwdXRzID0gdnBiZV9lbnVtX291dHB1dHMsCisJLnNldF9vdXRwdXQgPSB2cGJlX3NldF9vdXRwdXQsCisJLmdldF9vdXRwdXQgPSB2cGJlX2dldF9vdXRwdXQsCisJLnNfZHZfcHJlc2V0ID0gdnBiZV9zX2R2X3ByZXNldCwKKwkuZ19kdl9wcmVzZXQgPSB2cGJlX2dfZHZfcHJlc2V0LAorCS5lbnVtX2R2X3ByZXNldHMgPSB2cGJlX2VudW1fZHZfcHJlc2V0cywKKwkuc19zdGQgPSB2cGJlX3Nfc3RkLAorCS5nX3N0ZCA9IHZwYmVfZ19zdGQsCisJLmluaXRpYWxpemUgPSB2cGJlX2luaXRpYWxpemUsCisJLmRlaW5pdGlhbGl6ZSA9IHZwYmVfZGVpbml0aWFsaXplLAorCS5nZXRfbW9kZV9pbmZvID0gdnBiZV9nZXRfY3VycmVudF9tb2RlX2luZm8sCisJLnNldF9tb2RlID0gdnBiZV9zZXRfbW9kZSwKK307CisKK3N0YXRpYyBfX2RldmluaXQgaW50IHZwYmVfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2OworCXN0cnVjdCB2cGJlX2NvbmZpZyAqY2ZnOworCWludCByZXQgPSAtRUlOVkFMOworCisJaWYgKHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhID09IE5VTEwpIHsKKwkJdjRsMl9lcnIocGRldi0+ZGV2LmRyaXZlciwgIk5vIHBsYXRmb3JtIGRhdGFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJY2ZnID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlpZiAoIWNmZy0+bW9kdWxlX25hbWVbMF0gfHwKKwkgICAgIWNmZy0+b3NkLm1vZHVsZV9uYW1lWzBdIHx8CisJICAgICFjZmctPnZlbmMubW9kdWxlX25hbWVbMF0pIHsKKwkJdjRsMl9lcnIocGRldi0+ZGV2LmRyaXZlciwgInZwYmUgZGlzcGxheSBtb2R1bGUgbmFtZXMgbm90IgorCQkJICIgZGVmaW5lZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJdnBiZV9kZXYgPSBremFsbG9jKHNpemVvZigqdnBiZV9kZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAodnBiZV9kZXYgPT0gTlVMTCkgeworCQl2NGwyX2VycihwZGV2LT5kZXYuZHJpdmVyLCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSIKKwkJCSAiIGZvciB2cGJlX2RldmljZVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwl2cGJlX2Rldi0+Y2ZnID0gY2ZnOworCXZwYmVfZGV2LT5vcHMgPSB2cGJlX2Rldl9vcHM7CisJdnBiZV9kZXYtPnBkZXYgPSAmcGRldi0+ZGV2OworCisJaWYgKGNmZy0+b3V0cHV0cy0+bnVtX21vZGVzID4gMCkKKwkJdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncyA9IHZwYmVfZGV2LT5jZmctPm91dHB1dHNbMF0ubW9kZXNbMF07CisJZWxzZQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIHNldCB0aGUgZHJpdmVyIGRhdGEgaW4gcGxhdGZvcm0gZGV2aWNlICovCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgdnBiZV9kZXYpOworCW11dGV4X2luaXQoJnZwYmVfZGV2LT5sb2NrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwYmVfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldmljZSkKK3sKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2aWNlKTsKKworCWtmcmVlKHZwYmVfZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB2cGJlX2RyaXZlciA9IHsKKwkuZHJpdmVyCT0geworCQkubmFtZQk9ICJ2cGJlX2NvbnRyb2xsZXIiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IHZwYmVfcHJvYmUsCisJLnJlbW92ZSA9IHZwYmVfcmVtb3ZlLAorfTsKKworLyoqCisgKiB2cGJlX2luaXQ6IGluaXRpYWxpemUgdGhlIHZwYmUgZHJpdmVyCisgKgorICogVGhpcyBmdW5jdGlvbiByZWdpc3RlcnMgZGV2aWNlIGFuZCBkcml2ZXIgdG8gdGhlIGtlcm5lbAorICovCitzdGF0aWMgX19pbml0IGludCB2cGJlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ2cGJlX2RyaXZlcik7Cit9CisKKy8qKgorICogdnBiZV9jbGVhbnVwIDogY2xlYW51cCBmdW5jdGlvbiBmb3IgdnBiZSBkcml2ZXIKKyAqCisgKiBUaGlzIHdpbGwgdW4tcmVnaXN0ZXJzIHRoZSBkZXZpY2UgYW5kIGRyaXZlciB0byB0aGUga2VybmVsCisgKi8KK3N0YXRpYyB2b2lkIHZwYmVfY2xlYW51cCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ2cGJlX2RyaXZlcik7Cit9CisKKy8qIEZ1bmN0aW9uIGZvciBtb2R1bGUgaW5pdGlhbGl6YXRpb24gYW5kIGNsZWFudXAgKi8KK21vZHVsZV9pbml0KHZwYmVfaW5pdCk7Cittb2R1bGVfZXhpdCh2cGJlX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfZGlzcGxheS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfZGlzcGxheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMWQ4M2EKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBiZV9kaXNwbGF5LmMKQEAgLTAsMCArMSwxODYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRleGFzIEluc3RydW1lbnRzIEluY29ycG9yYXRlZCAtIGh0dHA6Ly93d3cudGkuY29tLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIFdJVEhPVVQgQU5ZIFdBUlJBTlRZIG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQ7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eQorICogb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8bWFjaC9jcHV0eXBlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvZGF2aW5jaS92cGJlX2Rpc3BsYXkuaD4KKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3ZwYmVfdHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3ZwYmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3ZwYmVfdmVuYy5oPgorI2luY2x1ZGUgPG1lZGlhL2RhdmluY2kvdnBiZV9vc2QuaD4KKyNpbmNsdWRlICJ2cGJlX3ZlbmNfcmVncy5oIgorCisjZGVmaW5lIFZQQkVfRElTUExBWV9EUklWRVIgInZwYmUtdjRsMiIKKworc3RhdGljIGludCBkZWJ1ZzsKKworI2RlZmluZSBWUEJFX0RJU1BMQVlfU0RfQlVGX1NJWkUgKDcyMCo1NzYqMikKKyNkZWZpbmUgVlBCRV9ERUZBVUxUX05VTV9CVUZTIDMKKworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDA2NDQpOworCitzdGF0aWMgaW50IHZlbmNfaXNfc2Vjb25kX2ZpZWxkKHN0cnVjdCB2cGJlX2Rpc3BsYXkgKmRpc3BfZGV2KQoreworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBkaXNwX2Rldi0+dnBiZV9kZXY7CisJaW50IHJldDsKKwlpbnQgdmFsOworCisJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbCh2cGJlX2Rldi0+dmVuYywKKwkJCSAgICAgICBjb3JlLAorCQkJICAgICAgIGlvY3RsLAorCQkJICAgICAgIFZFTkNfR0VUX0ZMRCwKKwkJCSAgICAgICAmdmFsKTsKKwlpZiAocmV0IDwgMCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJICJFcnJvciBpbiBnZXR0aW5nIEZpZWxkIElEIDBcbiIpOworCX0KKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCB2cGJlX2lzcl9ldmVuX2ZpZWxkKHN0cnVjdCB2cGJlX2Rpc3BsYXkgKmRpc3Bfb2JqLAorCQkJCXN0cnVjdCB2cGJlX2xheWVyICpsYXllcikKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgdGltZXZhbHVlOworCisJaWYgKGxheWVyLT5jdXJfZnJtID09IGxheWVyLT5uZXh0X2ZybSkKKwkJcmV0dXJuOworCWt0aW1lX2dldF90cygmdGltZXZhbHVlKTsKKwlsYXllci0+Y3VyX2ZybS0+dHMudHZfc2VjID0gdGltZXZhbHVlLnR2X3NlYzsKKwlsYXllci0+Y3VyX2ZybS0+dHMudHZfdXNlYyA9IHRpbWV2YWx1ZS50dl9uc2VjIC8gTlNFQ19QRVJfVVNFQzsKKwlsYXllci0+Y3VyX2ZybS0+c3RhdGUgPSBWSURFT0JVRl9ET05FOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbGF5ZXItPmN1cl9mcm0tPmRvbmUpOworCS8qIE1ha2UgY3VyX2ZybSBwb2ludGluZyB0byBuZXh0X2ZybSAqLworCWxheWVyLT5jdXJfZnJtID0gbGF5ZXItPm5leHRfZnJtOworfQorCitzdGF0aWMgdm9pZCB2cGJlX2lzcl9vZGRfZmllbGQoc3RydWN0IHZwYmVfZGlzcGxheSAqZGlzcF9vYmosCisJCQkJc3RydWN0IHZwYmVfbGF5ZXIgKmxheWVyKQoreworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZF9kZXZpY2UgPSBkaXNwX29iai0+b3NkX2RldmljZTsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisKKwlzcGluX2xvY2soJmRpc3Bfb2JqLT5kbWFfcXVldWVfbG9jayk7CisJaWYgKGxpc3RfZW1wdHkoJmxheWVyLT5kbWFfcXVldWUpIHx8CisJCShsYXllci0+Y3VyX2ZybSAhPSBsYXllci0+bmV4dF9mcm0pKSB7CisJCXNwaW5fdW5sb2NrKCZkaXNwX29iai0+ZG1hX3F1ZXVlX2xvY2spOworCQlyZXR1cm47CisJfQorCS8qCisJICogb25lIGZpZWxkIGlzIGRpc3BsYXllZCBjb25maWd1cmUKKwkgKiB0aGUgbmV4dCBmcmFtZSBpZiBpdCBpcyBhdmFpbGFibGUKKwkgKiBvdGhlcndpc2UgaG9sZCBvbiBjdXJyZW50IGZyYW1lCisJICogR2V0IG5leHQgZnJvbSB0aGUgYnVmZmVyIHF1ZXVlCisJICovCisJbGF5ZXItPm5leHRfZnJtID0gbGlzdF9lbnRyeSgKKwkJCQlsYXllci0+ZG1hX3F1ZXVlLm5leHQsCisJCQkJc3RydWN0ICB2aWRlb2J1Zl9idWZmZXIsCisJCQkJcXVldWUpOworCS8qIFJlbW92ZSB0aGF0IGZyb20gdGhlIGJ1ZmZlciBxdWV1ZSAqLworCWxpc3RfZGVsKCZsYXllci0+bmV4dF9mcm0tPnF1ZXVlKTsKKwlzcGluX3VubG9jaygmZGlzcF9vYmotPmRtYV9xdWV1ZV9sb2NrKTsKKwkvKiBNYXJrIHN0YXRlIG9mIHRoZSBmcmFtZSB0byBhY3RpdmUgKi8KKwlsYXllci0+bmV4dF9mcm0tPnN0YXRlID0gVklERU9CVUZfQUNUSVZFOworCWFkZHIgPSB2aWRlb2J1Zl90b19kbWFfY29udGlnKGxheWVyLT5uZXh0X2ZybSk7CisJb3NkX2RldmljZS0+b3BzLnN0YXJ0X2xheWVyKG9zZF9kZXZpY2UsCisJCQlsYXllci0+bGF5ZXJfaW5mby5pZCwKKwkJCWFkZHIsCisJCQlkaXNwX29iai0+Y2Jjcl9vZnN0KTsKK30KKworLyogaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZSAqLworc3RhdGljIGlycXJldHVybl90IHZlbmNfaXNyKGludCBpcnEsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgdnBiZV9kaXNwbGF5ICpkaXNwX2RldiA9IChzdHJ1Y3QgdnBiZV9kaXNwbGF5ICopYXJnOworCXN0cnVjdCB2cGJlX2xheWVyICpsYXllcjsKKwlzdGF0aWMgdW5zaWduZWQgbGFzdF9ldmVudDsKKwl1bnNpZ25lZCBldmVudCA9IDA7CisJaW50IGZpZDsKKwlpbnQgaTsKKworCWlmICgoTlVMTCA9PSBhcmcpIHx8IChOVUxMID09IGRpc3BfZGV2LT5kZXZbMF0pKQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKKwlpZiAodmVuY19pc19zZWNvbmRfZmllbGQoZGlzcF9kZXYpKQorCQlldmVudCB8PSBWRU5DX1NFQ09ORF9GSUVMRDsKKwllbHNlCisJCWV2ZW50IHw9IFZFTkNfRklSU1RfRklFTEQ7CisKKwlpZiAoZXZlbnQgPT0gKGxhc3RfZXZlbnQgJiB+VkVOQ19FTkRfT0ZfRlJBTUUpKSB7CisJCS8qCisJCSogSWYgdGhlIGRpc3BsYXkgaXMgbm9uLWludGVybGFjZWQsIHRoZW4gd2UgbmVlZCB0byBmbGFnIHRoZQorCQkqIGVuZC1vZi1mcmFtZSBldmVudCBhdCBldmVyeSBpbnRlcnJ1cHQgcmVnYXJkbGVzcyBvZiB0aGUKKwkJKiB2YWx1ZSBvZiB0aGUgRklEU1QgYml0LiAgV2UgY2FuIGNvbmNsdWRlIHRoYXQgdGhlIGRpc3BsYXkgaXMKKwkJKiBub24taW50ZXJsYWNlZCBpZiB0aGUgdmFsdWUgb2YgdGhlIEZJRFNUIGJpdCBpcyB1bmNoYW5nZWQKKwkJKiBmcm9tIHRoZSBwcmV2aW91cyBpbnRlcnJ1cHQuCisJCSovCisJCWV2ZW50IHw9IFZFTkNfRU5EX09GX0ZSQU1FOworCX0gZWxzZSBpZiAoZXZlbnQgPT0gVkVOQ19TRUNPTkRfRklFTEQpIHsKKwkJLyogZW5kLW9mLWZyYW1lIGZvciBpbnRlcmxhY2VkIGRpc3BsYXkgKi8KKwkJZXZlbnQgfD0gVkVOQ19FTkRfT0ZfRlJBTUU7CisJfQorCWxhc3RfZXZlbnQgPSBldmVudDsKKworCWZvciAoaSA9IDA7IGkgPCBWUEJFX0RJU1BMQVlfTUFYX0RFVklDRVM7IGkrKykgeworCQlsYXllciA9IGRpc3BfZGV2LT5kZXZbaV07CisJCS8qIElmIHN0cmVhbWluZyBpcyBzdGFydGVkIGluIHRoaXMgbGF5ZXIgKi8KKwkJaWYgKCFsYXllci0+c3RhcnRlZCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChsYXllci0+bGF5ZXJfZmlyc3RfaW50KSB7CisJCQlsYXllci0+bGF5ZXJfZmlyc3RfaW50ID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIENoZWNrIHRoZSBmaWVsZCBmb3JtYXQgKi8KKwkJaWYgKChWNEwyX0ZJRUxEX05PTkUgPT0gbGF5ZXItPnBpeF9mbXQuZmllbGQpICYmCisJCQkoZXZlbnQgJiBWRU5DX0VORF9PRl9GUkFNRSkpIHsKKwkJCS8qIFByb2dyZXNzaXZlIG1vZGUgKi8KKworCQkJdnBiZV9pc3JfZXZlbl9maWVsZChkaXNwX2RldiwgbGF5ZXIpOworCQkJdnBiZV9pc3Jfb2RkX2ZpZWxkKGRpc3BfZGV2LCBsYXllcik7CisJCX0gZWxzZSB7CisJCS8qIEludGVybGFjZWQgbW9kZSAqLworCisJCQlsYXllci0+ZmllbGRfaWQgXj0gMTsKKwkJCWlmIChldmVudCAmIFZFTkNfRklSU1RfRklFTEQpCisJCQkJZmlkID0gMDsKKwkJCWVsc2UKKwkJCQlmaWQgPSAxOworCisJCQkvKgorCQkJKiBJZiBmaWVsZCBpZCBkb2VzIG5vdCBtYXRjaCB3aXRoIHN0b3JlCisJCQkqIGZpZWxkIGlkCisJCQkqLworCQkJaWYgKGZpZCAhPSBsYXllci0+ZmllbGRfaWQpIHsKKwkJCQkvKiBNYWtlIHRoZW0gaW4gc3luYyAqLworCQkJCWxheWVyLT5maWVsZF9pZCA9IGZpZDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qCisJCQkqIGRldmljZSBmaWVsZCBpZCBhbmQgbG9jYWwgZmllbGQgaWQgYXJlCisJCQkqIGluIHN5bmMuIElmIHRoaXMgaXMgZXZlbiBmaWVsZAorCQkJKi8KKwkJCWlmICgwID09IGZpZCkKKwkJCQl2cGJlX2lzcl9ldmVuX2ZpZWxkKGRpc3BfZGV2LCBsYXllcik7CisJCQllbHNlICAvKiBvZGQgZmllbGQgKi8KKwkJCQl2cGJlX2lzcl9vZGRfZmllbGQoZGlzcF9kZXYsIGxheWVyKTsKKwkJfQorCX0KKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoKKyAqIHZwYmVfYnVmZmVyX3ByZXBhcmUoKQorICogVGhpcyBpcyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIGZyb20gdmlkZW9idWZfcWJ1ZigpIGZ1bmN0aW9uCisgKiB0aGUgYnVmZmVyIGlzIHByZXBhcmVkIGFuZCB1c2VyIHNwYWNlIHZpcnR1YWwgYWRkcmVzcyBpcyBjb252ZXJ0ZWQgaW50bworICogcGh5c2ljYWwgYWRkcmVzcworICovCitzdGF0aWMgaW50IHZwYmVfYnVmZmVyX3ByZXBhcmUoc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxLAorCQkJCSAgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIsCisJCQkJICBlbnVtIHY0bDJfZmllbGQgZmllbGQpCit7CisJc3RydWN0IHZwYmVfZmggKmZoID0gcS0+cHJpdl9kYXRhOworCXN0cnVjdCB2cGJlX2xheWVyICpsYXllciA9IGZoLT5sYXllcjsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZmgtPmRpc3BfZGV2LT52cGJlX2RldjsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJaW50IHJldDsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJCSJ2cGJlX2J1ZmZlcl9wcmVwYXJlXG4iKTsKKworCS8qIElmIGJ1ZmZlciBpcyBub3QgaW5pdGlhbGl6ZWQsIGluaXRpYWxpemUgaXQgKi8KKwlpZiAoVklERU9CVUZfTkVFRFNfSU5JVCA9PSB2Yi0+c3RhdGUpIHsKKwkJdmItPndpZHRoID0gbGF5ZXItPnBpeF9mbXQud2lkdGg7CisJCXZiLT5oZWlnaHQgPSBsYXllci0+cGl4X2ZtdC5oZWlnaHQ7CisJCXZiLT5zaXplID0gbGF5ZXItPnBpeF9mbXQuc2l6ZWltYWdlOworCQl2Yi0+ZmllbGQgPSBmaWVsZDsKKworCQlyZXQgPSB2aWRlb2J1Zl9pb2xvY2socSwgdmIsIE5VTEwpOworCQlpZiAocmV0IDwgMCkgeworCQkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgIkZhaWxlZCB0byBtYXAgXAorCQkJCXVzZXIgYWRkcmVzc1xuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWFkZHIgPSB2aWRlb2J1Zl90b19kbWFfY29udGlnKHZiKTsKKworCQlpZiAocS0+c3RyZWFtaW5nKSB7CisJCQlpZiAoIUlTX0FMSUdORUQoYWRkciwgOCkpIHsKKwkJCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJCQkiYnVmZmVyX3ByZXBhcmU6b2Zmc2V0IGlzIFwKKwkJCQkJbm90IGFsaWduZWQgdG8gMzIgYnl0ZXNcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJCXZiLT5zdGF0ZSA9IFZJREVPQlVGX1BSRVBBUkVEOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHZwYmVfYnVmZmVyX3NldHVwKCkKKyAqIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIG1lbW9yeSBmb3IgdGhlIGJ1ZmZlcnMKKyAqLworc3RhdGljIGludCB2cGJlX2J1ZmZlcl9zZXR1cChzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsCisJCQkJdW5zaWduZWQgaW50ICpjb3VudCwKKwkJCQl1bnNpZ25lZCBpbnQgKnNpemUpCit7CisJLyogR2V0IHRoZSBmaWxlIGhhbmRsZSBvYmplY3QgYW5kIGxheWVyIG9iamVjdCAqLworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IHEtPnByaXZfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwgInZwYmVfYnVmZmVyX3NldHVwXG4iKTsKKworCSpzaXplID0gbGF5ZXItPnBpeF9mbXQuc2l6ZWltYWdlOworCisJLyogU3RvcmUgbnVtYmVyIG9mIGJ1ZmZlcnMgYWxsb2NhdGVkIGluIG51bWJ1ZmZlciBtZW1iZXIgKi8KKwlpZiAoKmNvdW50IDwgVlBCRV9ERUZBVUxUX05VTV9CVUZTKQorCQkqY291bnQgPSBsYXllci0+bnVtYnVmZmVycyA9IFZQQkVfREVGQVVMVF9OVU1fQlVGUzsKKworCXJldHVybiAwOworfQorCisvKgorICogdnBiZV9idWZmZXJfcXVldWUoKQorICogVGhpcyBmdW5jdGlvbiBhZGRzIHRoZSBidWZmZXIgdG8gRE1BIHF1ZXVlCisgKi8KK3N0YXRpYyB2b2lkIHZwYmVfYnVmZmVyX3F1ZXVlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwKKwkJCQkgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCit7CisJLyogR2V0IHRoZSBmaWxlIGhhbmRsZSBvYmplY3QgYW5kIGxheWVyIG9iamVjdCAqLworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IHEtPnByaXZfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisJc3RydWN0IHZwYmVfZGlzcGxheSAqZGlzcCA9IGZoLT5kaXNwX2RldjsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZmgtPmRpc3BfZGV2LT52cGJlX2RldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsCisJCQkidnBiZV9idWZmZXJfcXVldWVcbiIpOworCisJLyogYWRkIHRoZSBidWZmZXIgdG8gdGhlIERNQSBxdWV1ZSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkaXNwLT5kbWFfcXVldWVfbG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3RhaWwoJnZiLT5xdWV1ZSwgJmxheWVyLT5kbWFfcXVldWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpc3AtPmRtYV9xdWV1ZV9sb2NrLCBmbGFncyk7CisJLyogQ2hhbmdlIHN0YXRlIG9mIHRoZSBidWZmZXIgKi8KKwl2Yi0+c3RhdGUgPSBWSURFT0JVRl9RVUVVRUQ7Cit9CisKKy8qCisgKiB2cGJlX2J1ZmZlcl9yZWxlYXNlKCkKKyAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20gdGhlIHZpZGVvYnVmIGxheWVyIHRvIGZyZWUgbWVtb3J5IGFsbG9jYXRlZCB0bworICogdGhlIGJ1ZmZlcnMKKyAqLworc3RhdGljIHZvaWQgdnBiZV9idWZmZXJfcmVsZWFzZShzdHJ1Y3QgdmlkZW9idWZfcXVldWUgKnEsCisJCQkJICAgc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCit7CisJLyogR2V0IHRoZSBmaWxlIGhhbmRsZSBvYmplY3QgYW5kIGxheWVyIG9iamVjdCAqLworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IHEtPnByaXZfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCSJ2cGJlX2J1ZmZlcl9yZWxlYXNlXG4iKTsKKworCWlmIChWNEwyX01FTU9SWV9VU0VSUFRSICE9IGxheWVyLT5tZW1vcnkpCisJCXZpZGVvYnVmX2RtYV9jb250aWdfZnJlZShxLCB2Yik7CisKKwl2Yi0+c3RhdGUgPSBWSURFT0JVRl9ORUVEU19JTklUOworfQorCitzdGF0aWMgc3RydWN0IHZpZGVvYnVmX3F1ZXVlX29wcyB2aWRlb19xb3BzID0geworCS5idWZfc2V0dXAgPSB2cGJlX2J1ZmZlcl9zZXR1cCwKKwkuYnVmX3ByZXBhcmUgPSB2cGJlX2J1ZmZlcl9wcmVwYXJlLAorCS5idWZfcXVldWUgPSB2cGJlX2J1ZmZlcl9xdWV1ZSwKKwkuYnVmX3JlbGVhc2UgPSB2cGJlX2J1ZmZlcl9yZWxlYXNlLAorfTsKKworc3RhdGljCitzdHJ1Y3QgdnBiZV9sYXllcioKK192cGJlX2Rpc3BsYXlfZ2V0X290aGVyX3dpbl9sYXllcihzdHJ1Y3QgdnBiZV9kaXNwbGF5ICpkaXNwX2RldiwKKwkJCXN0cnVjdCB2cGJlX2xheWVyICpsYXllcikKK3sKKwllbnVtIHZwYmVfZGlzcGxheV9kZXZpY2VfaWQgdGhpc3dpbiwgb3RoZXJ3aW47CisJdGhpc3dpbiA9IGxheWVyLT5kZXZpY2VfaWQ7CisKKwlvdGhlcndpbiA9ICh0aGlzd2luID09IFZQQkVfRElTUExBWV9ERVZJQ0VfMCkgPworCVZQQkVfRElTUExBWV9ERVZJQ0VfMSA6IFZQQkVfRElTUExBWV9ERVZJQ0VfMDsKKwlyZXR1cm4gZGlzcF9kZXYtPmRldltvdGhlcndpbl07Cit9CisKK3N0YXRpYyBpbnQgdnBiZV9zZXRfb3NkX2Rpc3BsYXlfcGFyYW1zKHN0cnVjdCB2cGJlX2Rpc3BsYXkgKmRpc3BfZGV2LAorCQkJc3RydWN0IHZwYmVfbGF5ZXIgKmxheWVyKQoreworCXN0cnVjdCBvc2RfbGF5ZXJfY29uZmlnICpjZmcgID0gJmxheWVyLT5sYXllcl9pbmZvLmNvbmZpZzsKKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2RfZGV2aWNlID0gZGlzcF9kZXYtPm9zZF9kZXZpY2U7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGRpc3BfZGV2LT52cGJlX2RldjsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJaW50IHJldDsKKworCWFkZHIgPSB2aWRlb2J1Zl90b19kbWFfY29udGlnKGxheWVyLT5jdXJfZnJtKTsKKwkvKiBTZXQgYWRkcmVzcyBpbiB0aGUgZGlzcGxheSByZWdpc3RlcnMgKi8KKwlvc2RfZGV2aWNlLT5vcHMuc3RhcnRfbGF5ZXIob3NkX2RldmljZSwKKwkJCQkgICAgbGF5ZXItPmxheWVyX2luZm8uaWQsCisJCQkJICAgIGFkZHIsCisJCQkJICAgIGRpc3BfZGV2LT5jYmNyX29mc3QpOworCisJcmV0ID0gb3NkX2RldmljZS0+b3BzLmVuYWJsZV9sYXllcihvc2RfZGV2aWNlLAorCQkJCWxheWVyLT5sYXllcl9pbmZvLmlkLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJIkVycm9yIGluIGVuYWJsaW5nIG9zZCB3aW5kb3cgbGF5ZXIgMFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBFbmFibGUgdGhlIHdpbmRvdyAqLworCWxheWVyLT5sYXllcl9pbmZvLmVuYWJsZSA9IDE7CisJaWYgKGNmZy0+cGl4Zm10ID09IFBJWEZNVF9OVjEyKSB7CisJCXN0cnVjdCB2cGJlX2xheWVyICpvdGhlcmxheWVyID0KKwkJCV92cGJlX2Rpc3BsYXlfZ2V0X290aGVyX3dpbl9sYXllcihkaXNwX2RldiwgbGF5ZXIpOworCisJCXJldCA9IG9zZF9kZXZpY2UtPm9wcy5lbmFibGVfbGF5ZXIob3NkX2RldmljZSwKKwkJCQlvdGhlcmxheWVyLT5sYXllcl9pbmZvLmlkLCAxKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXY0bDJfZXJyKCZ2cGJlX2Rldi0+djRsMl9kZXYsCisJCQkJIkVycm9yIGluIGVuYWJsaW5nIG9zZCB3aW5kb3cgbGF5ZXIgMVxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJb3RoZXJsYXllci0+bGF5ZXJfaW5mby5lbmFibGUgPSAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3ZwYmVfZGlzcF9jYWxjdWxhdGVfc2NhbGVfZmFjdG9yKHN0cnVjdCB2cGJlX2Rpc3BsYXkgKmRpc3BfZGV2LAorCQkJc3RydWN0IHZwYmVfbGF5ZXIgKmxheWVyLAorCQkJaW50IGV4cGVjdGVkX3hzaXplLCBpbnQgZXhwZWN0ZWRfeXNpemUpCit7CisJc3RydWN0IGRpc3BsYXlfbGF5ZXJfaW5mbyAqbGF5ZXJfaW5mbyA9ICZsYXllci0+bGF5ZXJfaW5mbzsKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXhmbXQgPSAmbGF5ZXItPnBpeF9mbXQ7CisJc3RydWN0IG9zZF9sYXllcl9jb25maWcgKmNmZyAgPSAmbGF5ZXItPmxheWVyX2luZm8uY29uZmlnOworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBkaXNwX2Rldi0+dnBiZV9kZXY7CisJaW50IGNhbGN1bGF0ZWRfeHNpemU7CisJaW50IGhfZXhwID0gMDsKKwlpbnQgdl9leHAgPSAwOworCWludCBoX3NjYWxlOworCWludCB2X3NjYWxlOworCisJdjRsMl9zdGRfaWQgc3RhbmRhcmRfaWQgPSB2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLnRpbWluZ3Muc3RkX2lkOworCisJLyoKKwkgKiBBcHBsaWNhdGlvbiBpbml0aWFsbHkgc2V0IHRoZSBpbWFnZSBmb3JtYXQuIEN1cnJlbnQgZGlzcGxheQorCSAqIHNpemUgaXMgb2J0YWluZWQgZnJvbSB0aGUgdnBiZSBkaXNwbGF5IGNvbnRyb2xsZXIuIGV4cGVjdGVkX3hzaXplCisJICogYW5kIGV4cGVjdGVkX3lzaXplIGFyZSBzZXQgdGhyb3VnaCBTX0NST1AgaW9jdGwuIEJhc2VkIG9uIHRoaXMsCisJICogZHJpdmVyIHdpbGwgY2FsY3VsYXRlIHRoZSBzY2FsZSBmYWN0b3JzIGZvciB2ZXJ0aWNhbCBhbmQKKwkgKiBob3Jpem9udGFsIGRpcmVjdGlvbiBzbyB0aGF0IHRoZSBpbWFnZSBpcyBkaXNwbGF5ZWQgc2NhbGVkCisJICogYW5kIGV4cGFuZGVkLiBBcHBsaWNhdGlvbiB1c2VzIGV4cGFuc2lvbiB0byBkaXNwbGF5IHRoZSBpbWFnZQorCSAqIGluIGEgc3F1YXJlIHBpeGVsLiBPdGhlcndpc2UgaXQgaXMgZGlzcGxheWVkIHVzaW5nIGRpc3BsYXlzCisJICogcGl4ZWwgYXNwZWN0IHJhdGlvLkl0IGlzIGV4cGVjdGVkIHRoYXQgYXBwbGljYXRpb24gY2hvb3NlcworCSAqIHRoZSBjcm9wIGNvb3JkaW5hdGVzIGZvciBjcm9wcGVkIG9yIHNjYWxlZCBkaXNwbGF5LiBpZiBjcm9wCisJICogc2l6ZSBpcyBsZXNzIHRoYW4gdGhlIGltYWdlIHNpemUsIGl0IGlzIGRpc3BsYXllZCBjcm9wcGVkIG9yCisJICogaXQgaXMgZGlzcGxheWVkIHNjYWxlZCBhbmQvb3IgZXhwYW5kZWQuCisJICoKKwkgKiB0byBiZWdpbiB3aXRoLCBzZXQgdGhlIGNyb3Agd2luZG93IHNhbWUgYXMgZXhwZWN0ZWQuIExhdGVyIHdlCisJICogd2lsbCBvdmVycmlkZSB3aXRoIHNjYWxlZCB3aW5kb3cgc2l6ZQorCSAqLworCisJY2ZnLT54c2l6ZSA9IHBpeGZtdC0+d2lkdGg7CisJY2ZnLT55c2l6ZSA9IHBpeGZtdC0+aGVpZ2h0OworCWxheWVyX2luZm8tPmhfem9vbSA9IFpPT01fWDE7CS8qIG5vIGhvcml6b250YWwgem9vbSAqLworCWxheWVyX2luZm8tPnZfem9vbSA9IFpPT01fWDE7CS8qIG5vIGhvcml6b250YWwgem9vbSAqLworCWxheWVyX2luZm8tPmhfZXhwID0gSF9FWFBfT0ZGOwkvKiBubyBob3Jpem9udGFsIHpvb20gKi8KKwlsYXllcl9pbmZvLT52X2V4cCA9IFZfRVhQX09GRjsJLyogbm8gaG9yaXpvbnRhbCB6b29tICovCisKKwlpZiAocGl4Zm10LT53aWR0aCA8IGV4cGVjdGVkX3hzaXplKSB7CisJCWhfc2NhbGUgPSB2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLnhyZXMgLyBwaXhmbXQtPndpZHRoOworCQlpZiAoaF9zY2FsZSA8IDIpCisJCQloX3NjYWxlID0gMTsKKwkJZWxzZSBpZiAoaF9zY2FsZSA+PSA0KQorCQkJaF9zY2FsZSA9IDQ7CisJCWVsc2UKKwkJCWhfc2NhbGUgPSAyOworCQljZmctPnhzaXplICo9IGhfc2NhbGU7CisJCWlmIChjZmctPnhzaXplIDwgZXhwZWN0ZWRfeHNpemUpIHsKKwkJCWlmICgoc3RhbmRhcmRfaWQgJiBWNEwyX1NURF81MjVfNjApIHx8CisJCQkoc3RhbmRhcmRfaWQgJiBWNEwyX1NURF82MjVfNTApKSB7CisJCQkJY2FsY3VsYXRlZF94c2l6ZSA9IChjZmctPnhzaXplICoKKwkJCQkJVlBCRV9ESVNQTEFZX0hfRVhQX1JBVElPX04pIC8KKwkJCQkJVlBCRV9ESVNQTEFZX0hfRVhQX1JBVElPX0Q7CisJCQkJaWYgKGNhbGN1bGF0ZWRfeHNpemUgPD0gZXhwZWN0ZWRfeHNpemUpIHsKKwkJCQkJaF9leHAgPSAxOworCQkJCQljZmctPnhzaXplID0gY2FsY3VsYXRlZF94c2l6ZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKGhfc2NhbGUgPT0gMikKKwkJCWxheWVyX2luZm8tPmhfem9vbSA9IFpPT01fWDI7CisJCWVsc2UgaWYgKGhfc2NhbGUgPT0gNCkKKwkJCWxheWVyX2luZm8tPmhfem9vbSA9IFpPT01fWDQ7CisJCWlmIChoX2V4cCkKKwkJCWxheWVyX2luZm8tPmhfZXhwID0gSF9FWFBfOV9PVkVSXzg7CisJfSBlbHNlIHsKKwkJLyogbm8gc2NhbGluZywgb25seSBjcm9wcGluZy4gU2V0IGRpc3BsYXkgYXJlYSB0byBjcm9wIGFyZWEgKi8KKwkJY2ZnLT54c2l6ZSA9IGV4cGVjdGVkX3hzaXplOworCX0KKworCWlmIChwaXhmbXQtPmhlaWdodCA8IGV4cGVjdGVkX3lzaXplKSB7CisJCXZfc2NhbGUgPSBleHBlY3RlZF95c2l6ZSAvIHBpeGZtdC0+aGVpZ2h0OworCQlpZiAodl9zY2FsZSA8IDIpCisJCQl2X3NjYWxlID0gMTsKKwkJZWxzZSBpZiAodl9zY2FsZSA+PSA0KQorCQkJdl9zY2FsZSA9IDQ7CisJCWVsc2UKKwkJCXZfc2NhbGUgPSAyOworCQljZmctPnlzaXplICo9IHZfc2NhbGU7CisJCWlmIChjZmctPnlzaXplIDwgZXhwZWN0ZWRfeXNpemUpIHsKKwkJCWlmICgoc3RhbmRhcmRfaWQgJiBWNEwyX1NURF82MjVfNTApKSB7CisJCQkJY2FsY3VsYXRlZF94c2l6ZSA9IChjZmctPnlzaXplICoKKwkJCQkJVlBCRV9ESVNQTEFZX1ZfRVhQX1JBVElPX04pIC8KKwkJCQkJVlBCRV9ESVNQTEFZX1ZfRVhQX1JBVElPX0Q7CisJCQkJaWYgKGNhbGN1bGF0ZWRfeHNpemUgPD0gZXhwZWN0ZWRfeXNpemUpIHsKKwkJCQkJdl9leHAgPSAxOworCQkJCQljZmctPnlzaXplID0gY2FsY3VsYXRlZF94c2l6ZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHZfc2NhbGUgPT0gMikKKwkJCWxheWVyX2luZm8tPnZfem9vbSA9IFpPT01fWDI7CisJCWVsc2UgaWYgKHZfc2NhbGUgPT0gNCkKKwkJCWxheWVyX2luZm8tPnZfem9vbSA9IFpPT01fWDQ7CisJCWlmICh2X2V4cCkKKwkJCWxheWVyX2luZm8tPmhfZXhwID0gVl9FWFBfNl9PVkVSXzU7CisJfSBlbHNlIHsKKwkJLyogbm8gc2NhbGluZywgb25seSBjcm9wcGluZy4gU2V0IGRpc3BsYXkgYXJlYSB0byBjcm9wIGFyZWEgKi8KKwkJY2ZnLT55c2l6ZSA9IGV4cGVjdGVkX3lzaXplOworCX0KKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJImNyb3AgZGlzcGxheSB4c2l6ZSA9ICVkLCB5c2l6ZSA9ICVkXG4iLAorCQljZmctPnhzaXplLCBjZmctPnlzaXplKTsKK30KKworc3RhdGljIHZvaWQgdnBiZV9kaXNwX2Fkal9wb3NpdGlvbihzdHJ1Y3QgdnBiZV9kaXNwbGF5ICpkaXNwX2RldiwKKwkJCXN0cnVjdCB2cGJlX2xheWVyICpsYXllciwKKwkJCWludCB0b3AsIGludCBsZWZ0KQoreworCXN0cnVjdCBvc2RfbGF5ZXJfY29uZmlnICpjZmcgPSAmbGF5ZXItPmxheWVyX2luZm8uY29uZmlnOworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBkaXNwX2Rldi0+dnBiZV9kZXY7CisKKwljZmctPnhwb3MgPSBtaW4oKHVuc2lnbmVkIGludClsZWZ0LAorCQkJdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy54cmVzIC0gY2ZnLT54c2l6ZSk7CisJY2ZnLT55cG9zID0gbWluKCh1bnNpZ25lZCBpbnQpdG9wLAorCQkJdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy55cmVzIC0gY2ZnLT55c2l6ZSk7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJIm5ldyB4cG9zID0gJWQsIHlwb3MgPSAlZFxuIiwKKwkJY2ZnLT54cG9zLCBjZmctPnlwb3MpOworfQorCitzdGF0aWMgdm9pZCB2cGJlX2Rpc3BfY2hlY2tfd2luZG93X3BhcmFtcyhzdHJ1Y3QgdnBiZV9kaXNwbGF5ICpkaXNwX2RldiwKKwkJCXN0cnVjdCB2NGwyX3JlY3QgKmMpCit7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGRpc3BfZGV2LT52cGJlX2RldjsKKworCWlmICgoYy0+d2lkdGggPT0gMCkgfHwKKwkgICgoYy0+d2lkdGggKyBjLT5sZWZ0KSA+IHZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MueHJlcykpCisJCWMtPndpZHRoID0gdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy54cmVzIC0gYy0+bGVmdDsKKworCWlmICgoYy0+aGVpZ2h0ID09IDApIHx8ICgoYy0+aGVpZ2h0ICsgYy0+dG9wKSA+CisJICB2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLnlyZXMpKQorCQljLT5oZWlnaHQgPSB2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLnlyZXMgLSBjLT50b3A7CisKKwkvKiB3aW5kb3cgaGVpZ2h0IG11c3QgYmUgZXZlbiBmb3IgaW50ZXJsYWNlZCBkaXNwbGF5ICovCisJaWYgKHZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MuaW50ZXJsYWNlZCkKKwkJYy0+aGVpZ2h0ICY9ICh+MHgwMSk7CisKK30KKworLyoqCisgKiB2cGJlX3RyeV9mb3JtYXQoKQorICogSWYgdXNlciBhcHBsaWNhdGlvbiBwcm92aWRlcyB3aWR0aCBhbmQgaGVpZ2h0LCBhbmQgaGF2ZSBieXRlc3BlcmxpbmUgc2V0CisgKiB0byB6ZXJvLCBkcml2ZXIgY2FsY3VsYXRlcyBieXRlc3BlcmxpbmUgYW5kIHNpemVpbWFnZSBiYXNlZCBvbiBoYXJkd2FyZQorICogbGltaXRzLgorICovCitzdGF0aWMgaW50IHZwYmVfdHJ5X2Zvcm1hdChzdHJ1Y3QgdnBiZV9kaXNwbGF5ICpkaXNwX2RldiwKKwkJCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeGZtdCwgaW50IGNoZWNrKQoreworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBkaXNwX2Rldi0+dnBiZV9kZXY7CisJaW50IG1pbl9oZWlnaHQgPSAxOworCWludCBtaW5fd2lkdGggPSAzMjsKKwlpbnQgbWF4X2hlaWdodDsKKwlpbnQgbWF4X3dpZHRoOworCWludCBicHA7CisKKwlpZiAoKHBpeGZtdC0+cGl4ZWxmb3JtYXQgIT0gVjRMMl9QSVhfRk1UX1VZVlkpICYmCisJICAgIChwaXhmbXQtPnBpeGVsZm9ybWF0ICE9IFY0TDJfUElYX0ZNVF9OVjEyKSkKKwkJLyogY2hvb3NlIGRlZmF1bHQgYXMgVjRMMl9QSVhfRk1UX1VZVlkgKi8KKwkJcGl4Zm10LT5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9VWVZZOworCisJLyogQ2hlY2sgdGhlIGZpZWxkIGZvcm1hdCAqLworCWlmICgocGl4Zm10LT5maWVsZCAhPSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQpICYmCisJCShwaXhmbXQtPmZpZWxkICE9IFY0TDJfRklFTERfTk9ORSkpIHsKKwkJaWYgKHZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MuaW50ZXJsYWNlZCkKKwkJCXBpeGZtdC0+ZmllbGQgPSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ7CisJCWVsc2UKKwkJCXBpeGZtdC0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJfQorCisJaWYgKHBpeGZtdC0+ZmllbGQgPT0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEKQorCQltaW5faGVpZ2h0ID0gMjsKKworCWlmIChwaXhmbXQtPnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9OVjEyKQorCQlicHAgPSAxOworCWVsc2UKKwkJYnBwID0gMjsKKworCW1heF93aWR0aCA9IHZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MueHJlczsKKwltYXhfaGVpZ2h0ID0gdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy55cmVzOworCisJbWluX3dpZHRoIC89IGJwcDsKKworCWlmICghcGl4Zm10LT53aWR0aCB8fCAocGl4Zm10LT53aWR0aCA8IG1pbl93aWR0aCkgfHwKKwkJKHBpeGZtdC0+d2lkdGggPiBtYXhfd2lkdGgpKSB7CisJCXBpeGZtdC0+d2lkdGggPSB2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLnhyZXM7CisJfQorCisJaWYgKCFwaXhmbXQtPmhlaWdodCB8fCAocGl4Zm10LT5oZWlnaHQgIDwgbWluX2hlaWdodCkgfHwKKwkJKHBpeGZtdC0+aGVpZ2h0ICA+IG1heF9oZWlnaHQpKSB7CisJCXBpeGZtdC0+aGVpZ2h0ID0gdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy55cmVzOworCX0KKworCWlmIChwaXhmbXQtPmJ5dGVzcGVybGluZSA8IChwaXhmbXQtPndpZHRoICogYnBwKSkKKwkJcGl4Zm10LT5ieXRlc3BlcmxpbmUgPSBwaXhmbXQtPndpZHRoICogYnBwOworCisJLyogTWFrZSB0aGUgYnl0ZXNwZXJsaW5lIDMyIGJ5dGUgYWxpZ25lZCAqLworCXBpeGZtdC0+Ynl0ZXNwZXJsaW5lID0gKChwaXhmbXQtPndpZHRoICogYnBwICsgMzEpICYgfjMxKTsKKworCWlmIChwaXhmbXQtPnBpeGVsZm9ybWF0ID09IFY0TDJfUElYX0ZNVF9OVjEyKQorCQlwaXhmbXQtPnNpemVpbWFnZSA9IHBpeGZtdC0+Ynl0ZXNwZXJsaW5lICogcGl4Zm10LT5oZWlnaHQgKworCQkJCShwaXhmbXQtPmJ5dGVzcGVybGluZSAqIHBpeGZtdC0+aGVpZ2h0ID4+IDEpOworCWVsc2UKKwkJcGl4Zm10LT5zaXplaW1hZ2UgPSBwaXhmbXQtPmJ5dGVzcGVybGluZSAqIHBpeGZtdC0+aGVpZ2h0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X2dfcHJpb3JpdHkoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJZW51bSB2NGwyX3ByaW9yaXR5ICpwKQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisKKwkqcCA9IHY0bDJfcHJpb19tYXgoJmxheWVyLT5wcmlvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwYmVfZGlzcGxheV9zX3ByaW9yaXR5KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCWVudW0gdjRsMl9wcmlvcml0eSBwKQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisJaW50IHJldDsKKworCXJldCA9IHY0bDJfcHJpb19jaGFuZ2UoJmxheWVyLT5wcmlvLCAmZmgtPnByaW8sIHApOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2cGJlX2Rpc3BsYXlfcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgICpwcml2LAorCQkJICAgICAgIHN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKmNhcCkKK3sKKwlzdHJ1Y3QgdnBiZV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisKKwljYXAtPnZlcnNpb24gPSBWUEJFX0RJU1BMQVlfVkVSU0lPTl9DT0RFOworCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fT1VUUFVUIHwgVjRMMl9DQVBfU1RSRUFNSU5HOworCXN0cmxjcHkoY2FwLT5kcml2ZXIsIFZQQkVfRElTUExBWV9EUklWRVIsIHNpemVvZihjYXAtPmRyaXZlcikpOworCXN0cmxjcHkoY2FwLT5idXNfaW5mbywgInBsYXRmb3JtIiwgc2l6ZW9mKGNhcC0+YnVzX2luZm8pKTsKKwlzdHJsY3B5KGNhcC0+Y2FyZCwgdnBiZV9kZXYtPmNmZy0+bW9kdWxlX25hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwYmVfZGlzcGxheV9zX2Nyb3Aoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICAgIHN0cnVjdCB2NGwyX2Nyb3AgKmNyb3ApCit7CisJc3RydWN0IHZwYmVfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB2cGJlX2xheWVyICpsYXllciA9IGZoLT5sYXllcjsKKwlzdHJ1Y3QgdnBiZV9kaXNwbGF5ICpkaXNwX2RldiA9IGZoLT5kaXNwX2RldjsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZGlzcF9kZXYtPnZwYmVfZGV2OworCXN0cnVjdCBvc2RfbGF5ZXJfY29uZmlnICpjZmcgPSAmbGF5ZXItPmxheWVyX2luZm8uY29uZmlnOworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZF9kZXZpY2UgPSBkaXNwX2Rldi0+b3NkX2RldmljZTsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICpyZWN0ID0gJmNyb3AtPmM7CisJaW50IHJldDsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkiVklESU9DX1NfQ1JPUCwgbGF5ZXIgaWQgPSAlZFxuIiwgbGF5ZXItPmRldmljZV9pZCk7CisKKwlpZiAoY3JvcC0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiSW52YWxpZCBidWYgdHlwZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChyZWN0LT50b3AgPCAwKQorCQlyZWN0LT50b3AgPSAwOworCWlmIChyZWN0LT5sZWZ0IDwgMCkKKwkJcmVjdC0+bGVmdCA9IDA7CisKKwl2cGJlX2Rpc3BfY2hlY2tfd2luZG93X3BhcmFtcyhkaXNwX2RldiwgcmVjdCk7CisKKwlvc2RfZGV2aWNlLT5vcHMuZ2V0X2xheWVyX2NvbmZpZyhvc2RfZGV2aWNlLAorCQkJbGF5ZXItPmxheWVyX2luZm8uaWQsIGNmZyk7CisKKwl2cGJlX2Rpc3BfY2FsY3VsYXRlX3NjYWxlX2ZhY3RvcihkaXNwX2RldiwgbGF5ZXIsCisJCQkJCXJlY3QtPndpZHRoLAorCQkJCQlyZWN0LT5oZWlnaHQpOworCXZwYmVfZGlzcF9hZGpfcG9zaXRpb24oZGlzcF9kZXYsIGxheWVyLCByZWN0LT50b3AsCisJCQkJCXJlY3QtPmxlZnQpOworCXJldCA9IG9zZF9kZXZpY2UtPm9wcy5zZXRfbGF5ZXJfY29uZmlnKG9zZF9kZXZpY2UsCisJCQkJbGF5ZXItPmxheWVyX2luZm8uaWQsIGNmZyk7CisJaWYgKHJldCA8IDApIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCSJFcnJvciBpbiBzZXQgbGF5ZXIgY29uZmlnOlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGFwcGx5IHpvb21pbmcgYW5kIGggb3IgdiBleHBhbnNpb24gKi8KKwlvc2RfZGV2aWNlLT5vcHMuc2V0X3pvb20ob3NkX2RldmljZSwKKwkJCWxheWVyLT5sYXllcl9pbmZvLmlkLAorCQkJbGF5ZXItPmxheWVyX2luZm8uaF96b29tLAorCQkJbGF5ZXItPmxheWVyX2luZm8udl96b29tKTsKKwlyZXQgPSBvc2RfZGV2aWNlLT5vcHMuc2V0X3ZpZF9leHBhbnNpb24ob3NkX2RldmljZSwKKwkJCWxheWVyLT5sYXllcl9pbmZvLmhfZXhwLAorCQkJbGF5ZXItPmxheWVyX2luZm8udl9leHApOworCWlmIChyZXQgPCAwKSB7CisJCXY0bDJfZXJyKCZ2cGJlX2Rldi0+djRsMl9kZXYsCisJCSJFcnJvciBpbiBzZXQgdmlkIGV4cGFuc2lvbjpcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoKGxheWVyLT5sYXllcl9pbmZvLmhfem9vbSAhPSBaT09NX1gxKSB8fAorCQkobGF5ZXItPmxheWVyX2luZm8udl96b29tICE9IFpPT01fWDEpIHx8CisJCShsYXllci0+bGF5ZXJfaW5mby5oX2V4cCAhPSBIX0VYUF9PRkYpIHx8CisJCShsYXllci0+bGF5ZXJfaW5mby52X2V4cCAhPSBWX0VYUF9PRkYpKQorCQkvKiBFbmFibGUgZXhwYW5zaW9uIGZpbHRlciAqLworCQlvc2RfZGV2aWNlLT5vcHMuc2V0X2ludGVycG9sYXRpb25fZmlsdGVyKG9zZF9kZXZpY2UsIDEpOworCWVsc2UKKwkJb3NkX2RldmljZS0+b3BzLnNldF9pbnRlcnBvbGF0aW9uX2ZpbHRlcihvc2RfZGV2aWNlLCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwYmVfZGlzcGxheV9nX2Nyb3Aoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICAgIHN0cnVjdCB2NGwyX2Nyb3AgKmNyb3ApCit7CisJc3RydWN0IHZwYmVfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB2cGJlX2xheWVyICpsYXllciA9IGZoLT5sYXllcjsKKwlzdHJ1Y3Qgb3NkX2xheWVyX2NvbmZpZyAqY2ZnID0gJmxheWVyLT5sYXllcl9pbmZvLmNvbmZpZzsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZmgtPmRpc3BfZGV2LT52cGJlX2RldjsKKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2RfZGV2aWNlID0gZmgtPmRpc3BfZGV2LT5vc2RfZGV2aWNlOworCXN0cnVjdCB2NGwyX3JlY3QgKnJlY3QgPSAmY3JvcC0+YzsKKwlpbnQgcmV0OworCisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsCisJCQkiVklESU9DX0dfQ1JPUCwgbGF5ZXIgaWQgPSAlZFxuIiwKKwkJCWxheWVyLT5kZXZpY2VfaWQpOworCisJaWYgKGNyb3AtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgIkludmFsaWQgYnVmIHR5cGVcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKwlvc2RfZGV2aWNlLT5vcHMuZ2V0X2xheWVyX2NvbmZpZyhvc2RfZGV2aWNlLAorCQkJCWxheWVyLT5sYXllcl9pbmZvLmlkLCBjZmcpOworCXJlY3QtPnRvcCA9IGNmZy0+eXBvczsKKwlyZWN0LT5sZWZ0ID0gY2ZnLT54cG9zOworCXJlY3QtPndpZHRoID0gY2ZnLT54c2l6ZTsKKwlyZWN0LT5oZWlnaHQgPSBjZmctPnlzaXplOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X2Nyb3BjYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICAgICBzdHJ1Y3QgdjRsMl9jcm9wY2FwICpjcm9wY2FwKQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZmgtPmRpc3BfZGV2LT52cGJlX2RldjsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LCAiVklESU9DX0NST1BDQVAgaW9jdGxcbiIpOworCisJY3JvcGNhcC0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUOworCWNyb3BjYXAtPmJvdW5kcy5sZWZ0ID0gMDsKKwljcm9wY2FwLT5ib3VuZHMudG9wID0gMDsKKwljcm9wY2FwLT5ib3VuZHMud2lkdGggPSB2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLnhyZXM7CisJY3JvcGNhcC0+Ym91bmRzLmhlaWdodCA9IHZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MueXJlczsKKwljcm9wY2FwLT5waXhlbGFzcGVjdCA9IHZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MuYXNwZWN0OworCWNyb3BjYXAtPmRlZnJlY3QgPSBjcm9wY2FwLT5ib3VuZHM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X2dfZm10KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZm10KQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCSJWSURJT0NfR19GTVQsIGxheWVyIGlkID0gJWRcbiIsCisJCQlsYXllci0+ZGV2aWNlX2lkKTsKKworCS8qIElmIGJ1ZmZlciB0eXBlIGlzIHZpZGVvIG91dHB1dCAqLworCWlmIChWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCAhPSBmbXQtPnR5cGUpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgImludmFsaWQgdHlwZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKiBGaWxsIGluIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBmb3JtYXQgKi8KKwlmbXQtPmZtdC5waXggPSBsYXllci0+cGl4X2ZtdDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZwYmVfZGlzcGxheV9lbnVtX2ZtdChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAgKnByaXYsCisJCQkJICAgc3RydWN0IHY0bDJfZm10ZGVzYyAqZm10KQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisJdW5zaWduZWQgaW50IGluZGV4ID0gMDsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJCSJWSURJT0NfRU5VTV9GTVQsIGxheWVyIGlkID0gJWRcbiIsCisJCQkJbGF5ZXItPmRldmljZV9pZCk7CisJaWYgKGZtdC0+aW5kZXggPiAxKSB7CisJCXY0bDJfZXJyKCZ2cGJlX2Rldi0+djRsMl9kZXYsICJJbnZhbGlkIGZvcm1hdCBpbmRleFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEZpbGwgaW4gdGhlIGluZm9ybWF0aW9uIGFib3V0IGZvcm1hdCAqLworCWluZGV4ID0gZm10LT5pbmRleDsKKwltZW1zZXQoZm10LCAwLCBzaXplb2YoKmZtdCkpOworCWZtdC0+aW5kZXggPSBpbmRleDsKKwlmbXQtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDsKKwlpZiAoaW5kZXggPT0gMCkgeworCQlzdHJjcHkoZm10LT5kZXNjcmlwdGlvbiwgIllVViA0OjI6MiAtIFVZVlkiKTsKKwkJZm10LT5waXhlbGZvcm1hdCA9IFY0TDJfUElYX0ZNVF9VWVZZOworCX0gZWxzZSB7CisJCXN0cmNweShmbXQtPmRlc2NyaXB0aW9uLCAiWS9DYkNyIDQ6MjowIik7CisJCWZtdC0+cGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfTlYxMjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cGJlX2Rpc3BsYXlfc19mbXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQpCit7CisJc3RydWN0IHZwYmVfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB2cGJlX2xheWVyICpsYXllciA9IGZoLT5sYXllcjsKKwlzdHJ1Y3QgdnBiZV9kaXNwbGF5ICpkaXNwX2RldiA9IGZoLT5kaXNwX2RldjsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZGlzcF9kZXYtPnZwYmVfZGV2OworCXN0cnVjdCBvc2RfbGF5ZXJfY29uZmlnICpjZmcgID0gJmxheWVyLT5sYXllcl9pbmZvLmNvbmZpZzsKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXhmbXQgPSAmZm10LT5mbXQucGl4OworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZF9kZXZpY2UgPSBkaXNwX2Rldi0+b3NkX2RldmljZTsKKwlpbnQgcmV0OworCisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsCisJCQkiVklESU9DX1NfRk1ULCBsYXllciBpZCA9ICVkXG4iLAorCQkJbGF5ZXItPmRldmljZV9pZCk7CisKKwkvKiBJZiBzdHJlYW1pbmcgaXMgc3RhcnRlZCwgcmV0dXJuIGVycm9yICovCisJaWYgKGxheWVyLT5zdGFydGVkKSB7CisJCXY0bDJfZXJyKCZ2cGJlX2Rldi0+djRsMl9kZXYsICJTdHJlYW1pbmcgaXMgc3RhcnRlZFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWlmIChWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCAhPSBmbXQtPnR5cGUpIHsKKwkJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsICJpbnZhbGlkIHR5cGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJLyogQ2hlY2sgZm9yIHZhbGlkIHBpeGVsIGZvcm1hdCAqLworCXJldCA9IHZwYmVfdHJ5X2Zvcm1hdChkaXNwX2RldiwgcGl4Zm10LCAxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogWVVWNDIwIGlzIHJlcXVlc3RlZCwgY2hlY2sgYXZhaWxhYmlsaXR5IG9mIHRoZQorCW90aGVyIHZpZGVvIHdpbmRvdyAqLworCisJbGF5ZXItPnBpeF9mbXQgPSAqcGl4Zm10OworCisJLyogR2V0IG9zZCBsYXllciBjb25maWcgKi8KKwlvc2RfZGV2aWNlLT5vcHMuZ2V0X2xheWVyX2NvbmZpZyhvc2RfZGV2aWNlLAorCQkJbGF5ZXItPmxheWVyX2luZm8uaWQsIGNmZyk7CisJLyogU3RvcmUgdGhlIHBpeGVsIGZvcm1hdCBpbiB0aGUgbGF5ZXIgb2JqZWN0ICovCisJY2ZnLT54c2l6ZSA9IHBpeGZtdC0+d2lkdGg7CisJY2ZnLT55c2l6ZSA9IHBpeGZtdC0+aGVpZ2h0OworCWNmZy0+bGluZV9sZW5ndGggPSBwaXhmbXQtPmJ5dGVzcGVybGluZTsKKwljZmctPnlwb3MgPSAwOworCWNmZy0+eHBvcyA9IDA7CisJY2ZnLT5pbnRlcmxhY2VkID0gdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy5pbnRlcmxhY2VkOworCisJaWYgKFY0TDJfUElYX0ZNVF9VWVZZID09IHBpeGZtdC0+cGl4ZWxmb3JtYXQpCisJCWNmZy0+cGl4Zm10ID0gUElYRk1UX1lDYkNySTsKKworCS8qIENoYW5nZSBvZiB0aGUgZGVmYXVsdCBwaXhlbCBmb3JtYXQgZm9yIGJvdGggdmlkZW8gd2luZG93cyAqLworCWlmIChWNEwyX1BJWF9GTVRfTlYxMiA9PSBwaXhmbXQtPnBpeGVsZm9ybWF0KSB7CisJCXN0cnVjdCB2cGJlX2xheWVyICpvdGhlcmxheWVyOworCQljZmctPnBpeGZtdCA9IFBJWEZNVF9OVjEyOworCQlvdGhlcmxheWVyID0gX3ZwYmVfZGlzcGxheV9nZXRfb3RoZXJfd2luX2xheWVyKGRpc3BfZGV2LAorCQkJCQkJCQlsYXllcik7CisJCW90aGVybGF5ZXItPmxheWVyX2luZm8uY29uZmlnLnBpeGZtdCA9IFBJWEZNVF9OVjEyOworCX0KKworCS8qIFNldCB0aGUgbGF5ZXIgY29uZmlnIGluIHRoZSBvc2Qgd2luZG93ICovCisJcmV0ID0gb3NkX2RldmljZS0+b3BzLnNldF9sYXllcl9jb25maWcob3NkX2RldmljZSwKKwkJCQlsYXllci0+bGF5ZXJfaW5mby5pZCwgY2ZnKTsKKwlpZiAocmV0IDwgMCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJCSJFcnJvciBpbiBTX0ZNVCBwYXJhbXM6XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogUmVhZGJhY2sgYW5kIGZpbGwgdGhlIGxvY2FsIGNvcHkgb2YgY3VycmVudCBwaXggZm9ybWF0ICovCisJb3NkX2RldmljZS0+b3BzLmdldF9sYXllcl9jb25maWcob3NkX2RldmljZSwKKwkJCWxheWVyLT5sYXllcl9pbmZvLmlkLCBjZmcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X3RyeV9mbXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCkKK3sKKwlzdHJ1Y3QgdnBiZV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZwYmVfZGlzcGxheSAqZGlzcF9kZXYgPSBmaC0+ZGlzcF9kZXY7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4Zm10ID0gJmZtdC0+Zm10LnBpeDsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LCAiVklESU9DX1RSWV9GTVRcbiIpOworCisJaWYgKFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUICE9IGZtdC0+dHlwZSkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiaW52YWxpZCB0eXBlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogQ2hlY2sgZm9yIHZhbGlkIGZpZWxkIGZvcm1hdCAqLworCXJldHVybiAgdnBiZV90cnlfZm9ybWF0KGRpc3BfZGV2LCBwaXhmbXQsIDApOworCit9CisKKy8qKgorICogdnBiZV9kaXNwbGF5X3Nfc3RkIC0gU2V0IHRoZSBnaXZlbiBzdGFuZGFyZCBpbiB0aGUgZW5jb2RlcgorICoKKyAqIFNldHMgdGhlIHN0YW5kYXJkIGlmIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBlbmNvZGVyLiBSZXR1cm4gdGhlIHN0YXR1cy4KKyAqIDAgLSBzdWNjZXNzICYgLUVJTlZBTCBvbiBlcnJvcgorICovCitzdGF0aWMgaW50IHZwYmVfZGlzcGxheV9zX3N0ZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQl2NGwyX3N0ZF9pZCAqc3RkX2lkKQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IHZwYmVfbGF5ZXIgKmxheWVyID0gZmgtPmxheWVyOworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBmaC0+ZGlzcF9kZXYtPnZwYmVfZGV2OworCWludCByZXQ7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwgIlZJRElPQ19TX1NURFxuIik7CisKKwkvKiBJZiBzdHJlYW1pbmcgaXMgc3RhcnRlZCwgcmV0dXJuIGVycm9yICovCisJaWYgKGxheWVyLT5zdGFydGVkKSB7CisJCXY0bDJfZXJyKCZ2cGJlX2Rldi0+djRsMl9kZXYsICJTdHJlYW1pbmcgaXMgc3RhcnRlZFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWlmIChOVUxMICE9IHZwYmVfZGV2LT5vcHMuc19zdGQpIHsKKwkJcmV0ID0gdnBiZV9kZXYtPm9wcy5zX3N0ZCh2cGJlX2Rldiwgc3RkX2lkKTsKKwkJaWYgKHJldCkgeworCQkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCSJGYWlsZWQgdG8gc2V0IHN0YW5kYXJkIGZvciBzdWIgZGV2aWNlc1xuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSB7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHZwYmVfZGlzcGxheV9nX3N0ZCAtIEdldCB0aGUgc3RhbmRhcmQgaW4gdGhlIGN1cnJlbnQgZW5jb2RlcgorICoKKyAqIEdldCB0aGUgc3RhbmRhcmQgaW4gdGhlIGN1cnJlbnQgZW5jb2Rlci4gUmV0dXJuIHRoZSBzdGF0dXMuIDAgLSBzdWNjZXNzCisgKiAtRUlOVkFMIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X2dfc3RkKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXY0bDJfc3RkX2lkICpzdGRfaWQpCit7CisJc3RydWN0IHZwYmVfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZmgtPmRpc3BfZGV2LT52cGJlX2RldjsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LAkiVklESU9DX0dfU1REXG4iKTsKKworCS8qIEdldCB0aGUgc3RhbmRhcmQgZnJvbSB0aGUgY3VycmVudCBlbmNvZGVyICovCisJaWYgKHZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MudGltaW5nc190eXBlICYgVlBCRV9FTkNfU1REKSB7CisJCSpzdGRfaWQgPSB2cGJlX2Rldi0+Y3VycmVudF90aW1pbmdzLnRpbWluZ3Muc3RkX2lkOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyoqCisgKiB2cGJlX2Rpc3BsYXlfZW51bV9vdXRwdXQgLSBlbnVtZXJhdGUgb3V0cHV0cworICoKKyAqIEVudW1lcmF0ZXMgdGhlIG91dHB1dHMgYXZhaWxhYmxlIGF0IHRoZSB2cGJlIGRpc3BsYXkKKyAqIHJldHVybnMgdGhlIHN0YXR1cywgLUVJTlZBTCBpZiBlbmQgb2Ygb3V0cHV0IGxpc3QKKyAqLworc3RhdGljIGludCB2cGJlX2Rpc3BsYXlfZW51bV9vdXRwdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJICAgIHN0cnVjdCB2NGwyX291dHB1dCAqb3V0cHV0KQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisJaW50IHJldDsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LAkiVklESU9DX0VOVU1fT1VUUFVUXG4iKTsKKworCS8qIEVudW1lcmF0ZSBvdXRwdXRzICovCisKKwlpZiAoTlVMTCA9PSB2cGJlX2Rldi0+b3BzLmVudW1fb3V0cHV0cykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSB2cGJlX2Rldi0+b3BzLmVudW1fb3V0cHV0cyh2cGJlX2Rldiwgb3V0cHV0KTsKKwlpZiAocmV0KSB7CisJCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJIkZhaWxlZCB0byBlbnVtZXJhdGUgb3V0cHV0c1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHZwYmVfZGlzcGxheV9zX291dHB1dCAtIFNldCBvdXRwdXQgdG8KKyAqIHRoZSBvdXRwdXQgc3BlY2lmaWVkIGJ5IHRoZSBpbmRleAorICovCitzdGF0aWMgaW50IHZwYmVfZGlzcGxheV9zX291dHB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQl1bnNpZ25lZCBpbnQgaSkKK3sKKwlzdHJ1Y3QgdnBiZV9maCAqZmggPSBwcml2OworCXN0cnVjdCB2cGJlX2xheWVyICpsYXllciA9IGZoLT5sYXllcjsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZmgtPmRpc3BfZGV2LT52cGJlX2RldjsKKwlpbnQgcmV0OworCisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsCSJWSURJT0NfU19PVVRQVVRcbiIpOworCS8qIElmIHN0cmVhbWluZyBpcyBzdGFydGVkLCByZXR1cm4gZXJyb3IgKi8KKwlpZiAobGF5ZXItPnN0YXJ0ZWQpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgIlN0cmVhbWluZyBpcyBzdGFydGVkXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJaWYgKE5VTEwgPT0gdnBiZV9kZXYtPm9wcy5zZXRfb3V0cHV0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IHZwYmVfZGV2LT5vcHMuc2V0X291dHB1dCh2cGJlX2RldiwgaSk7CisJaWYgKHJldCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJIkZhaWxlZCB0byBzZXQgb3V0cHV0IGZvciBzdWIgZGV2aWNlc1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKioKKyAqIHZwYmVfZGlzcGxheV9nX291dHB1dCAtIEdldCBvdXRwdXQgZnJvbSBzdWJkZXZpY2UKKyAqIGZvciBhIGdpdmVuIGJ5IHRoZSBpbmRleAorICovCitzdGF0aWMgaW50IHZwYmVfZGlzcGxheV9nX291dHB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQl1bnNpZ25lZCBpbnQgKmkpCit7CisJc3RydWN0IHZwYmVfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZmgtPmRpc3BfZGV2LT52cGJlX2RldjsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LCAiVklESU9DX0dfT1VUUFVUXG4iKTsKKwkvKiBHZXQgdGhlIHN0YW5kYXJkIGZyb20gdGhlIGN1cnJlbnQgZW5jb2RlciAqLworCSppID0gdnBiZV9kZXYtPmN1cnJlbnRfb3V0X2luZGV4OworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdnBiZV9kaXNwbGF5X2VudW1fZHZfcHJlc2V0cyAtIEVudW1lcmF0ZSB0aGUgZHYgcHJlc2V0cworICoKKyAqIGVudW0gdGhlIHByZXNldCBpbiB0aGUgY3VycmVudCBlbmNvZGVyLiBSZXR1cm4gdGhlIHN0YXR1cy4gMCAtIHN1Y2Nlc3MKKyAqIC1FSU5WQUwgb24gZXJyb3IKKyAqLworc3RhdGljIGludAordnBiZV9kaXNwbGF5X2VudW1fZHZfcHJlc2V0cyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCXN0cnVjdCB2NGwyX2R2X2VudW1fcHJlc2V0ICpwcmVzZXQpCit7CisJc3RydWN0IHZwYmVfZmggKmZoID0gcHJpdjsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZmgtPmRpc3BfZGV2LT52cGJlX2RldjsKKwlpbnQgcmV0OworCisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsICJWSURJT0NfRU5VTV9EVl9QUkVTRVRTXG4iKTsKKworCS8qIEVudW1lcmF0ZSBvdXRwdXRzICovCisJaWYgKE5VTEwgPT0gdnBiZV9kZXYtPm9wcy5lbnVtX2R2X3ByZXNldHMpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gdnBiZV9kZXYtPm9wcy5lbnVtX2R2X3ByZXNldHModnBiZV9kZXYsIHByZXNldCk7CisJaWYgKHJldCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJIkZhaWxlZCB0byBlbnVtZXJhdGUgZHYgcHJlc2V0cyBpbmZvXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogdnBiZV9kaXNwbGF5X3NfZHZfcHJlc2V0IC0gU2V0IHRoZSBkdiBwcmVzZXRzCisgKgorICogU2V0IHRoZSBwcmVzZXQgaW4gdGhlIGN1cnJlbnQgZW5jb2Rlci4gUmV0dXJuIHRoZSBzdGF0dXMuIDAgLSBzdWNjZXNzCisgKiAtRUlOVkFMIG9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQKK3ZwYmVfZGlzcGxheV9zX2R2X3ByZXNldChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQlzdHJ1Y3QgdjRsMl9kdl9wcmVzZXQgKnByZXNldCkKK3sKKwlzdHJ1Y3QgdnBiZV9maCAqZmggPSBwcml2OworCXN0cnVjdCB2cGJlX2xheWVyICpsYXllciA9IGZoLT5sYXllcjsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZmgtPmRpc3BfZGV2LT52cGJlX2RldjsKKwlpbnQgcmV0OworCisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsICJWSURJT0NfU19EVl9QUkVTRVRTXG4iKTsKKworCisJLyogSWYgc3RyZWFtaW5nIGlzIHN0YXJ0ZWQsIHJldHVybiBlcnJvciAqLworCWlmIChsYXllci0+c3RhcnRlZCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiU3RyZWFtaW5nIGlzIHN0YXJ0ZWRcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCS8qIFNldCB0aGUgZ2l2ZW4gc3RhbmRhcmQgaW4gdGhlIGVuY29kZXIgKi8KKwlpZiAoTlVMTCAhPSB2cGJlX2Rldi0+b3BzLnNfZHZfcHJlc2V0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IHZwYmVfZGV2LT5vcHMuc19kdl9wcmVzZXQodnBiZV9kZXYsIHByZXNldCk7CisJaWYgKHJldCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJIkZhaWxlZCB0byBzZXQgdGhlIGR2IHByZXNldHMgaW5mb1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKiBzZXQgdGhlIGN1cnJlbnQgbm9ybSB0byB6ZXJvIHRvIGJlIGNvbnNpc3RlbnQuIElmIFNURCBpcyB1c2VkCisJICogdjRsMiBsYXllciB3aWxsIHNldCB0aGUgbm9ybSBwcm9wZXJseSBvbiBzdWNjZXNzZnVsIHNfc3RkIGNhbGwKKwkgKi8KKwlsYXllci0+dmlkZW9fZGV2LmN1cnJlbnRfbm9ybSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiB2cGJlX2Rpc3BsYXlfZ19kdl9wcmVzZXQgLSBTZXQgdGhlIGR2IHByZXNldHMKKyAqCisgKiBHZXQgdGhlIHByZXNldCBpbiB0aGUgY3VycmVudCBlbmNvZGVyLiBSZXR1cm4gdGhlIHN0YXR1cy4gMCAtIHN1Y2Nlc3MKKyAqIC1FSU5WQUwgb24gZXJyb3IKKyAqLworc3RhdGljIGludAordnBiZV9kaXNwbGF5X2dfZHZfcHJlc2V0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCXN0cnVjdCB2NGwyX2R2X3ByZXNldCAqZHZfcHJlc2V0KQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IHByaXY7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwgIlZJRElPQ19HX0RWX1BSRVNFVFNcbiIpOworCisJLyogR2V0IHRoZSBnaXZlbiBzdGFuZGFyZCBpbiB0aGUgZW5jb2RlciAqLworCisJaWYgKHZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MudGltaW5nc190eXBlICYKKwkJCQlWUEJFX0VOQ19EVl9QUkVTRVQpIHsKKwkJZHZfcHJlc2V0LT5wcmVzZXQgPQorCQkJdnBiZV9kZXYtPmN1cnJlbnRfdGltaW5ncy50aW1pbmdzLmR2X3ByZXNldDsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2cGJlX2Rpc3BsYXlfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJCWVudW0gdjRsMl9idWZfdHlwZSBidWZfdHlwZSkKK3sKKwlzdHJ1Y3QgdnBiZV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZwYmVfbGF5ZXIgKmxheWVyID0gZmgtPmxheWVyOworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBmaC0+ZGlzcF9kZXYtPnZwYmVfZGV2OworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZF9kZXZpY2UgPSBmaC0+ZGlzcF9kZXYtPm9zZF9kZXZpY2U7CisJaW50IHJldDsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJIlZJRElPQ19TVFJFQU1PRkYsbGF5ZXIgaWQgPSAlZFxuIiwKKwkJCWxheWVyLT5kZXZpY2VfaWQpOworCisJaWYgKFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUICE9IGJ1Zl90eXBlKSB7CisJCXY0bDJfZXJyKCZ2cGJlX2Rldi0+djRsMl9kZXYsICJJbnZhbGlkIGJ1ZmZlciB0eXBlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogSWYgaW8gaXMgYWxsb3dlZCBmb3IgdGhpcyBmaWxlIGhhbmRsZSwgcmV0dXJuIGVycm9yICovCisJaWYgKCFmaC0+aW9fYWxsb3dlZCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiTm8gaW9fYWxsb3dlZFxuIik7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCS8qIElmIHN0cmVhbWluZyBpcyBub3Qgc3RhcnRlZCwgcmV0dXJuIGVycm9yICovCisJaWYgKCFsYXllci0+c3RhcnRlZCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAic3RyZWFtaW5nIG5vdCBzdGFydGVkIGluIGxheWVyIgorCQkJIiBpZCA9ICVkXG4iLCBsYXllci0+ZGV2aWNlX2lkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJb3NkX2RldmljZS0+b3BzLmRpc2FibGVfbGF5ZXIob3NkX2RldmljZSwKKwkJCWxheWVyLT5sYXllcl9pbmZvLmlkKTsKKwlsYXllci0+c3RhcnRlZCA9IDA7CisJcmV0ID0gdmlkZW9idWZfc3RyZWFtb2ZmKCZsYXllci0+YnVmZmVyX3F1ZXVlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJIGVudW0gdjRsMl9idWZfdHlwZSBidWZfdHlwZSkKK3sKKwlzdHJ1Y3QgdnBiZV9maCAqZmggPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHZwYmVfbGF5ZXIgKmxheWVyID0gZmgtPmxheWVyOworCXN0cnVjdCB2cGJlX2Rpc3BsYXkgKmRpc3BfZGV2ID0gZmgtPmRpc3BfZGV2OworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBmaC0+ZGlzcF9kZXYtPnZwYmVfZGV2OworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZF9kZXZpY2UgPSBkaXNwX2Rldi0+b3NkX2RldmljZTsKKwlpbnQgcmV0OworCisJb3NkX2RldmljZS0+b3BzLmRpc2FibGVfbGF5ZXIob3NkX2RldmljZSwKKwkJCWxheWVyLT5sYXllcl9pbmZvLmlkKTsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LCAiVklESU9DX1NUUkVBTU9OLCBsYXllcmlkPSVkXG4iLAorCQkJCQkJbGF5ZXItPmRldmljZV9pZCk7CisKKwlpZiAoVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQgIT0gYnVmX3R5cGUpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgIkludmFsaWQgYnVmZmVyIHR5cGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBJZiBmaWxlIGhhbmRsZSBpcyBub3QgYWxsb3dlZCBJTywgcmV0dXJuIGVycm9yICovCisJaWYgKCFmaC0+aW9fYWxsb3dlZCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiTm8gaW9fYWxsb3dlZFxuIik7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKwkvKiBJZiBTdHJlYW1pbmcgaXMgYWxyZWFkeSBzdGFydGVkLCByZXR1cm4gZXJyb3IgKi8KKwlpZiAobGF5ZXItPnN0YXJ0ZWQpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgImxheWVyIGlzIGFscmVhZHkgc3RyZWFtaW5nXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKgorCSAqIENhbGwgdmlkZW9idWZfc3RyZWFtb24gdG8gc3RhcnQgc3RyZWFtaW5nCisJICogaW4gdmlkZW9idWYKKwkgKi8KKwlyZXQgPSB2aWRlb2J1Zl9zdHJlYW1vbigmbGF5ZXItPmJ1ZmZlcl9xdWV1ZSk7CisJaWYgKHJldCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkiZXJyb3IgaW4gdmlkZW9idWZfc3RyZWFtb25cbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwkvKiBJZiBidWZmZXIgcXVldWUgaXMgZW1wdHksIHJldHVybiBlcnJvciAqLworCWlmIChsaXN0X2VtcHR5KCZsYXllci0+ZG1hX3F1ZXVlKSkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiYnVmZmVyIHF1ZXVlIGlzIGVtcHR5XG4iKTsKKwkJZ290byBzdHJlYW1vZmY7CisJfQorCS8qIEdldCB0aGUgbmV4dCBmcmFtZSBmcm9tIHRoZSBidWZmZXIgcXVldWUgKi8KKwlsYXllci0+bmV4dF9mcm0gPSBsYXllci0+Y3VyX2ZybSA9IGxpc3RfZW50cnkobGF5ZXItPmRtYV9xdWV1ZS5uZXh0LAorCQkJCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIsIHF1ZXVlKTsKKwkvKiBSZW1vdmUgYnVmZmVyIGZyb20gdGhlIGJ1ZmZlciBxdWV1ZSAqLworCWxpc3RfZGVsKCZsYXllci0+Y3VyX2ZybS0+cXVldWUpOworCS8qIE1hcmsgc3RhdGUgb2YgdGhlIGN1cnJlbnQgZnJhbWUgdG8gYWN0aXZlICovCisJbGF5ZXItPmN1cl9mcm0tPnN0YXRlID0gVklERU9CVUZfQUNUSVZFOworCS8qIEluaXRpYWxpemUgZmllbGRfaWQgYW5kIHN0YXJ0ZWQgbWVtYmVyICovCisJbGF5ZXItPmZpZWxkX2lkID0gMDsKKworCS8qIFNldCBwYXJhbWV0ZXJzIGluIE9TRCBhbmQgVkVOQyAqLworCXJldCA9IHZwYmVfc2V0X29zZF9kaXNwbGF5X3BhcmFtcyhkaXNwX2RldiwgbGF5ZXIpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIHN0cmVhbW9mZjsKKworCS8qCisJICogaWYgcmVxdWVzdCBmb3JtYXQgaXMgeXV2NDIwIHNlbWlwbGFuYXIsIG5lZWQgdG8KKwkgKiBlbmFibGUgYm90aCB2aWRlbyB3aW5kb3dzCisJICovCisJbGF5ZXItPnN0YXJ0ZWQgPSAxOworCisJbGF5ZXItPmxheWVyX2ZpcnN0X2ludCA9IDE7CisKKwlyZXR1cm4gcmV0Oworc3RyZWFtb2ZmOgorCXJldCA9IHZpZGVvYnVmX3N0cmVhbW9mZigmbGF5ZXItPmJ1ZmZlcl9xdWV1ZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2cGJlX2Rpc3BsYXlfZHFidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCSAgICAgIHN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisJaW50IHJldDsKKworCXY0bDJfZGJnKDEsIGRlYnVnLCAmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkiVklESU9DX0RRQlVGLCBsYXllciBpZCA9ICVkXG4iLAorCQlsYXllci0+ZGV2aWNlX2lkKTsKKworCWlmIChWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCAhPSBidWYtPnR5cGUpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgIkludmFsaWQgYnVmZmVyIHR5cGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJLyogSWYgdGhpcyBmaWxlIGhhbmRsZSBpcyBub3QgYWxsb3dlZCB0byBkbyBJTywgcmV0dXJuIGVycm9yICovCisJaWYgKCFmaC0+aW9fYWxsb3dlZCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiTm8gaW9fYWxsb3dlZFxuIik7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCS8qIENhbGwgdmlkZW9idWZfZHFidWYgZm9yIG5vbiBibG9ja2luZyBtb2RlICovCisJCXJldCA9IHZpZGVvYnVmX2RxYnVmKCZsYXllci0+YnVmZmVyX3F1ZXVlLCBidWYsIDEpOworCWVsc2UKKwkJLyogQ2FsbCB2aWRlb2J1Zl9kcWJ1ZiBmb3IgYmxvY2tpbmcgbW9kZSAqLworCQlyZXQgPSB2aWRlb2J1Zl9kcWJ1ZigmbGF5ZXItPmJ1ZmZlcl9xdWV1ZSwgYnVmLCAwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X3FidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCSAgICAgc3RydWN0IHY0bDJfYnVmZmVyICpwKQoreworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJIlZJRElPQ19RQlVGLCBsYXllciBpZCA9ICVkXG4iLAorCQlsYXllci0+ZGV2aWNlX2lkKTsKKworCWlmIChWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCAhPSBwLT50eXBlKSB7CisJCXY0bDJfZXJyKCZ2cGJlX2Rldi0+djRsMl9kZXYsICJJbnZhbGlkIGJ1ZmZlciB0eXBlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogSWYgdGhpcyBmaWxlIGhhbmRsZSBpcyBub3QgYWxsb3dlZCB0byBkbyBJTywgcmV0dXJuIGVycm9yICovCisJaWYgKCFmaC0+aW9fYWxsb3dlZCkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiTm8gaW9fYWxsb3dlZFxuIik7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCXJldHVybiB2aWRlb2J1Zl9xYnVmKCZsYXllci0+YnVmZmVyX3F1ZXVlLCBwKTsKK30KKworc3RhdGljIGludCB2cGJlX2Rpc3BsYXlfcXVlcnlidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCit7CisJc3RydWN0IHZwYmVfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB2cGJlX2xheWVyICpsYXllciA9IGZoLT5sYXllcjsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZmgtPmRpc3BfZGV2LT52cGJlX2RldjsKKwlpbnQgcmV0OworCisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsCisJCSJWSURJT0NfUVVFUllCVUYsIGxheWVyIGlkID0gJWRcbiIsCisJCWxheWVyLT5kZXZpY2VfaWQpOworCisJaWYgKFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUICE9IGJ1Zi0+dHlwZSkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiSW52YWxpZCBidWZmZXIgdHlwZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIENhbGwgdmlkZW9idWZfcXVlcnlidWYgdG8gZ2V0IGluZm9ybWF0aW9uICovCisJcmV0ID0gdmlkZW9idWZfcXVlcnlidWYoJmxheWVyLT5idWZmZXJfcXVldWUsIGJ1Zik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZwYmVfZGlzcGxheV9yZXFidWZzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnJlcV9idWYpCit7CisJc3RydWN0IHZwYmVfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB2cGJlX2xheWVyICpsYXllciA9IGZoLT5sYXllcjsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZmgtPmRpc3BfZGV2LT52cGJlX2RldjsKKwlpbnQgcmV0OworCisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsICJ2cGJlX2Rpc3BsYXlfcmVxYnVmc1xuIik7CisKKwlpZiAoVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQgIT0gcmVxX2J1Zi0+dHlwZSkgeworCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LCAiSW52YWxpZCBidWZmZXIgdHlwZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIElmIGlvIHVzZXJzIG9mIHRoZSBsYXllciBpcyBub3QgemVybywgcmV0dXJuIGVycm9yICovCisJaWYgKDAgIT0gbGF5ZXItPmlvX3VzcnMpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwgIm5vdCBJTyB1c2VyXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJLyogSW5pdGlhbGl6ZSB2aWRlb2J1ZiBxdWV1ZSBhcyBwZXIgdGhlIGJ1ZmZlciB0eXBlICovCisJdmlkZW9idWZfcXVldWVfZG1hX2NvbnRpZ19pbml0KCZsYXllci0+YnVmZmVyX3F1ZXVlLAorCQkJCSZ2aWRlb19xb3BzLAorCQkJCXZwYmVfZGV2LT5wZGV2LAorCQkJCSZsYXllci0+aXJxbG9jaywKKwkJCQlWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCwKKwkJCQlsYXllci0+cGl4X2ZtdC5maWVsZCwKKwkJCQlzaXplb2Yoc3RydWN0IHZpZGVvYnVmX2J1ZmZlciksCisJCQkJZmgsIE5VTEwpOworCisJLyogU2V0IGlvIGFsbG93ZWQgbWVtYmVyIG9mIGZpbGUgaGFuZGxlIHRvIFRSVUUgKi8KKwlmaC0+aW9fYWxsb3dlZCA9IDE7CisJLyogSW5jcmVtZW50IGlvIHVzcnMgbWVtYmVyIG9mIGxheWVyIG9iamVjdCB0byAxICovCisJbGF5ZXItPmlvX3VzcnMgPSAxOworCS8qIFN0b3JlIHR5cGUgb2YgbWVtb3J5IHJlcXVlc3RlZCBpbiBsYXllciBvYmplY3QgKi8KKwlsYXllci0+bWVtb3J5ID0gcmVxX2J1Zi0+bWVtb3J5OworCS8qIEluaXRpYWxpemUgYnVmZmVyIHF1ZXVlICovCisJSU5JVF9MSVNUX0hFQUQoJmxheWVyLT5kbWFfcXVldWUpOworCS8qIEFsbG9jYXRlIGJ1ZmZlcnMgKi8KKwlyZXQgPSB2aWRlb2J1Zl9yZXFidWZzKCZsYXllci0+YnVmZmVyX3F1ZXVlLCByZXFfYnVmKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB2cGJlX2Rpc3BsYXlfbW1hcCgpCisgKiBJdCBpcyB1c2VkIHRvIG1hcCBrZXJuZWwgc3BhY2UgYnVmZmVycyBpbnRvIHVzZXIgc3BhY2VzCisgKi8KK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X21tYXAoc3RydWN0IGZpbGUgKmZpbGVwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwkvKiBHZXQgdGhlIGxheWVyIG9iamVjdCBhbmQgZmlsZSBoYW5kbGUgb2JqZWN0ICovCisJc3RydWN0IHZwYmVfZmggKmZoID0gZmlsZXAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwgInZwYmVfZGlzcGxheV9tbWFwXG4iKTsKKworCXJldHVybiB2aWRlb2J1Zl9tbWFwX21hcHBlcigmbGF5ZXItPmJ1ZmZlcl9xdWV1ZSwgdm1hKTsKK30KKworLyogdnBiZV9kaXNwbGF5X3BvbGwoKTogSXQgaXMgdXNlZCBmb3Igc2VsZWN0L3BvbGwgc3lzdGVtIGNhbGwKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCB2cGJlX2Rpc3BsYXlfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZXAsIHBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IHZwYmVfZmggKmZoID0gZmlsZXAtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiA9IGZoLT5kaXNwX2Rldi0+dnBiZV9kZXY7CisJdW5zaWduZWQgaW50IGVyciA9IDA7CisKKwl2NGwyX2RiZygxLCBkZWJ1ZywgJnZwYmVfZGV2LT52NGwyX2RldiwgInZwYmVfZGlzcGxheV9wb2xsXG4iKTsKKwlpZiAobGF5ZXItPnN0YXJ0ZWQpCisJCWVyciA9IHZpZGVvYnVmX3BvbGxfc3RyZWFtKGZpbGVwLCAmbGF5ZXItPmJ1ZmZlcl9xdWV1ZSwgd2FpdCk7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIHZwYmVfZGlzcGxheV9vcGVuKCkKKyAqIEl0IGNyZWF0ZXMgb2JqZWN0IG9mIGZpbGUgaGFuZGxlIHN0cnVjdHVyZSBhbmQgc3RvcmVzIGl0IGluIHByaXZhdGVfZGF0YQorICogbWVtYmVyIG9mIGZpbGVwb2ludGVyCisgKi8KK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X29wZW4oc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHZwYmVfZmggKmZoID0gTlVMTDsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCXN0cnVjdCB2cGJlX2Rpc3BsYXkgKmRpc3BfZGV2ID0gbGF5ZXItPmRpc3BfZGV2OworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBkaXNwX2Rldi0+dnBiZV9kZXY7CisJc3RydWN0IG9zZF9zdGF0ZSAqb3NkX2RldmljZSA9IGRpc3BfZGV2LT5vc2RfZGV2aWNlOworCWludCBlcnI7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSBmaWxlIGhhbmRsZSBvYmplY3QgKi8KKwlmaCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB2cGJlX2ZoKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGZoID09IE5VTEwpIHsKKwkJdjRsMl9lcnIoJnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCSJ1bmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBmaWxlIGhhbmRsZSBvYmplY3RcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsCisJCQkidnBiZSBkaXNwbGF5IG9wZW4gcGxhbmUgPSAlZFxuIiwKKwkJCWxheWVyLT5kZXZpY2VfaWQpOworCisJLyogc3RvcmUgcG9pbnRlciB0byBmaCBpbiBwcml2YXRlX2RhdGEgbWVtYmVyIG9mIGZpbGVwICovCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZmg7CisJZmgtPmxheWVyID0gbGF5ZXI7CisJZmgtPmRpc3BfZGV2ID0gZGlzcF9kZXY7CisKKwlpZiAoIWxheWVyLT51c3JzKSB7CisKKwkJLyogRmlyc3QgY2xhaW0gdGhlIGxheWVyIGZvciB0aGlzIGRldmljZSAqLworCQllcnIgPSBvc2RfZGV2aWNlLT5vcHMucmVxdWVzdF9sYXllcihvc2RfZGV2aWNlLAorCQkJCQkJbGF5ZXItPmxheWVyX2luZm8uaWQpOworCQlpZiAoZXJyIDwgMCkgeworCQkJLyogQ291bGRuJ3QgZ2V0IGxheWVyICovCisJCQl2NGwyX2VycigmdnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJCSJEaXNwbGF5IE1hbmFnZXIgZmFpbGVkIHRvIGFsbG9jYXRlIGxheWVyXG4iKTsKKwkJCWtmcmVlKGZoKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCS8qIEluY3JlbWVudCBsYXllciB1c3JzIGNvdW50ZXIgKi8KKwlsYXllci0+dXNycysrOworCS8qIFNldCBpb19hbGxvd2VkIG1lbWJlciB0byBmYWxzZSAqLworCWZoLT5pb19hbGxvd2VkID0gMDsKKwkvKiBJbml0aWFsaXplIHByaW9yaXR5IG9mIHRoaXMgaW5zdGFuY2UgdG8gZGVmYXVsdCBwcmlvcml0eSAqLworCWZoLT5wcmlvID0gVjRMMl9QUklPUklUWV9VTlNFVDsKKwl2NGwyX3ByaW9fb3BlbigmbGF5ZXItPnByaW8sICZmaC0+cHJpbyk7CisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsCisJCQkidnBiZSBkaXNwbGF5IGRldmljZSBvcGVuZWQgc3VjY2Vzc2Z1bGx5XG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHZwYmVfZGlzcGxheV9yZWxlYXNlKCkKKyAqIFRoaXMgZnVuY3Rpb24gZGVsZXRlcyBidWZmZXIgcXVldWUsIGZyZWVzIHRoZSBidWZmZXJzIGFuZCB0aGUgZGF2aW5jaQorICogZGlzcGxheSBmaWxlICogaGFuZGxlCisgKi8KK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X3JlbGVhc2Uoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJLyogR2V0IHRoZSBsYXllciBvYmplY3QgYW5kIGZpbGUgaGFuZGxlIG9iamVjdCAqLworCXN0cnVjdCB2cGJlX2ZoICpmaCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXIgPSBmaC0+bGF5ZXI7CisJc3RydWN0IG9zZF9sYXllcl9jb25maWcgKmNmZyAgPSAmbGF5ZXItPmxheWVyX2luZm8uY29uZmlnOworCXN0cnVjdCB2cGJlX2Rpc3BsYXkgKmRpc3BfZGV2ID0gZmgtPmRpc3BfZGV2OworCXN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYgPSBkaXNwX2Rldi0+dnBiZV9kZXY7CisJc3RydWN0IG9zZF9zdGF0ZSAqb3NkX2RldmljZSA9IGRpc3BfZGV2LT5vc2RfZGV2aWNlOworCisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsICJ2cGJlX2Rpc3BsYXlfcmVsZWFzZVxuIik7CisKKwkvKiBpZiB0aGlzIGluc3RhbmNlIGlzIGRvaW5nIElPICovCisJaWYgKGZoLT5pb19hbGxvd2VkKSB7CisJCS8qIFJlc2V0IGlvX3VzcnMgbWVtYmVyIG9mIGxheWVyIG9iamVjdCAqLworCQlsYXllci0+aW9fdXNycyA9IDA7CisKKwkJb3NkX2RldmljZS0+b3BzLmRpc2FibGVfbGF5ZXIob3NkX2RldmljZSwKKwkJCQlsYXllci0+bGF5ZXJfaW5mby5pZCk7CisJCWxheWVyLT5zdGFydGVkID0gMDsKKwkJLyogRnJlZSBidWZmZXJzIGFsbG9jYXRlZCAqLworCQl2aWRlb2J1Zl9xdWV1ZV9jYW5jZWwoJmxheWVyLT5idWZmZXJfcXVldWUpOworCQl2aWRlb2J1Zl9tbWFwX2ZyZWUoJmxheWVyLT5idWZmZXJfcXVldWUpOworCX0KKworCS8qIERlY3JlbWVudCBsYXllciB1c3JzIGNvdW50ZXIgKi8KKwlsYXllci0+dXNycy0tOworCS8qIElmIHRoaXMgZmlsZSBoYW5kbGUgaGFzIGluaXRpYWxpemUgZW5jb2RlciBkZXZpY2UsIHJlc2V0IGl0ICovCisJaWYgKCFsYXllci0+dXNycykgeworCQlpZiAoY2ZnLT5waXhmbXQgPT0gUElYRk1UX05WMTIpIHsKKwkJCXN0cnVjdCB2cGJlX2xheWVyICpvdGhlcmxheWVyOworCQkJb3RoZXJsYXllciA9CisJCQlfdnBiZV9kaXNwbGF5X2dldF9vdGhlcl93aW5fbGF5ZXIoZGlzcF9kZXYsIGxheWVyKTsKKwkJCW9zZF9kZXZpY2UtPm9wcy5kaXNhYmxlX2xheWVyKG9zZF9kZXZpY2UsCisJCQkJCW90aGVybGF5ZXItPmxheWVyX2luZm8uaWQpOworCQkJb3NkX2RldmljZS0+b3BzLnJlbGVhc2VfbGF5ZXIob3NkX2RldmljZSwKKwkJCQkJb3RoZXJsYXllci0+bGF5ZXJfaW5mby5pZCk7CisJCX0KKwkJb3NkX2RldmljZS0+b3BzLmRpc2FibGVfbGF5ZXIob3NkX2RldmljZSwKKwkJCQlsYXllci0+bGF5ZXJfaW5mby5pZCk7CisJCW9zZF9kZXZpY2UtPm9wcy5yZWxlYXNlX2xheWVyKG9zZF9kZXZpY2UsCisJCQkJbGF5ZXItPmxheWVyX2luZm8uaWQpOworCX0KKwkvKiBDbG9zZSB0aGUgcHJpb3JpdHkgKi8KKwl2NGwyX3ByaW9fY2xvc2UoJmxheWVyLT5wcmlvLCBmaC0+cHJpbyk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKworCS8qIEZyZWUgbWVtb3J5IGFsbG9jYXRlZCB0byBmaWxlIGhhbmRsZSBvYmplY3QgKi8KKwlrZnJlZShmaCk7CisKKwlkaXNwX2Rldi0+Y2Jjcl9vZnN0ID0gMDsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworc3RhdGljIGludCB2cGJlX2Rpc3BsYXlfZ19yZWdpc3RlcihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCXN0cnVjdCB2NGwyX2RiZ19yZWdpc3RlciAqcmVnKQoreworCXN0cnVjdCB2NGwyX2RiZ19tYXRjaCAqbWF0Y2ggPSAmcmVnLT5tYXRjaDsKKworCWlmIChtYXRjaC0+dHlwZSA+PSAyKSB7CisJCXY0bDJfc3ViZGV2X2NhbGwodnBiZV9kZXYtPnZlbmMsCisJCQkJIGNvcmUsCisJCQkJIGdfcmVnaXN0ZXIsCisJCQkJIHJlZyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X3NfcmVnaXN0ZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQlzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIgKnJlZykKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiB2cGJlIGNhcHR1cmUgaW9jdGwgb3BlcmF0aW9ucyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyB2cGJlX2lvY3RsX29wcyA9IHsKKwkudmlkaW9jX3F1ZXJ5Y2FwCSA9IHZwYmVfZGlzcGxheV9xdWVyeWNhcCwKKwkudmlkaW9jX2dfZm10X3ZpZF9vdXQgICAgPSB2cGJlX2Rpc3BsYXlfZ19mbXQsCisJLnZpZGlvY19lbnVtX2ZtdF92aWRfb3V0ID0gdnBiZV9kaXNwbGF5X2VudW1fZm10LAorCS52aWRpb2Nfc19mbXRfdmlkX291dCAgICA9IHZwYmVfZGlzcGxheV9zX2ZtdCwKKwkudmlkaW9jX3RyeV9mbXRfdmlkX291dCAgPSB2cGJlX2Rpc3BsYXlfdHJ5X2ZtdCwKKwkudmlkaW9jX3JlcWJ1ZnMJCSA9IHZwYmVfZGlzcGxheV9yZXFidWZzLAorCS52aWRpb2NfcXVlcnlidWYJID0gdnBiZV9kaXNwbGF5X3F1ZXJ5YnVmLAorCS52aWRpb2NfcWJ1ZgkJID0gdnBiZV9kaXNwbGF5X3FidWYsCisJLnZpZGlvY19kcWJ1ZgkJID0gdnBiZV9kaXNwbGF5X2RxYnVmLAorCS52aWRpb2Nfc3RyZWFtb24JID0gdnBiZV9kaXNwbGF5X3N0cmVhbW9uLAorCS52aWRpb2Nfc3RyZWFtb2ZmCSA9IHZwYmVfZGlzcGxheV9zdHJlYW1vZmYsCisJLnZpZGlvY19jcm9wY2FwCQkgPSB2cGJlX2Rpc3BsYXlfY3JvcGNhcCwKKwkudmlkaW9jX2dfY3JvcAkJID0gdnBiZV9kaXNwbGF5X2dfY3JvcCwKKwkudmlkaW9jX3NfY3JvcAkJID0gdnBiZV9kaXNwbGF5X3NfY3JvcCwKKwkudmlkaW9jX2dfcHJpb3JpdHkJID0gdnBiZV9kaXNwbGF5X2dfcHJpb3JpdHksCisJLnZpZGlvY19zX3ByaW9yaXR5CSA9IHZwYmVfZGlzcGxheV9zX3ByaW9yaXR5LAorCS52aWRpb2Nfc19zdGQJCSA9IHZwYmVfZGlzcGxheV9zX3N0ZCwKKwkudmlkaW9jX2dfc3RkCQkgPSB2cGJlX2Rpc3BsYXlfZ19zdGQsCisJLnZpZGlvY19lbnVtX291dHB1dAkgPSB2cGJlX2Rpc3BsYXlfZW51bV9vdXRwdXQsCisJLnZpZGlvY19zX291dHB1dAkgPSB2cGJlX2Rpc3BsYXlfc19vdXRwdXQsCisJLnZpZGlvY19nX291dHB1dAkgPSB2cGJlX2Rpc3BsYXlfZ19vdXRwdXQsCisJLnZpZGlvY19zX2R2X3ByZXNldAkgPSB2cGJlX2Rpc3BsYXlfc19kdl9wcmVzZXQsCisJLnZpZGlvY19nX2R2X3ByZXNldAkgPSB2cGJlX2Rpc3BsYXlfZ19kdl9wcmVzZXQsCisJLnZpZGlvY19lbnVtX2R2X3ByZXNldHMJID0gdnBiZV9kaXNwbGF5X2VudW1fZHZfcHJlc2V0cywKKyNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCisJLnZpZGlvY19nX3JlZ2lzdGVyCSA9IHZwYmVfZGlzcGxheV9nX3JlZ2lzdGVyLAorCS52aWRpb2Nfc19yZWdpc3RlcgkgPSB2cGJlX2Rpc3BsYXlfc19yZWdpc3RlciwKKyNlbmRpZgorfTsKKworc3RhdGljIHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyB2cGJlX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLm9wZW4gPSB2cGJlX2Rpc3BsYXlfb3BlbiwKKwkucmVsZWFzZSA9IHZwYmVfZGlzcGxheV9yZWxlYXNlLAorCS51bmxvY2tlZF9pb2N0bCA9IHZpZGVvX2lvY3RsMiwKKwkubW1hcCA9IHZwYmVfZGlzcGxheV9tbWFwLAorCS5wb2xsID0gdnBiZV9kaXNwbGF5X3BvbGwKK307CisKK3N0YXRpYyBpbnQgdnBiZV9kZXZpY2VfZ2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHZwYmVfZGlzcGxheSAqdnBiZV9kaXNwICA9IGRhdGE7CisKKwlpZiAoc3RyY21wKCJ2cGJlX2NvbnRyb2xsZXIiLCBwZGV2LT5uYW1lKSA9PSAwKQorCQl2cGJlX2Rpc3AtPnZwYmVfZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAoc3RyY21wKCJ2cGJlLW9zZCIsIHBkZXYtPm5hbWUpID09IDApCisJCXZwYmVfZGlzcC0+b3NkX2RldmljZSA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2RldmluaXQgaW50IGluaXRfdnBiZV9sYXllcihpbnQgaSwgc3RydWN0IHZwYmVfZGlzcGxheSAqZGlzcF9kZXYsCisJCQkJICAgICBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB2cGJlX2xheWVyICp2cGJlX2Rpc3BsYXlfbGF5ZXIgPSBOVUxMOworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZiZCA9IE5VTEw7CisKKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGZvdXIgcGxhbmUgZGlzcGxheSBvYmplY3RzICovCisKKwlkaXNwX2Rldi0+ZGV2W2ldID0KKwkJa3phbGxvYyhzaXplb2Yoc3RydWN0IHZwYmVfbGF5ZXIpLCBHRlBfS0VSTkVMKTsKKworCS8qIElmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLCByZXR1cm4gZXJyb3IgKi8KKwlpZiAoIWRpc3BfZGV2LT5kZXZbaV0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJyYW4gb3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybiAgLUVOT01FTTsKKwl9CisJc3Bpbl9sb2NrX2luaXQoJmRpc3BfZGV2LT5kZXZbaV0tPmlycWxvY2spOworCW11dGV4X2luaXQoJmRpc3BfZGV2LT5kZXZbaV0tPm9wc2xvY2spOworCisJLyogR2V0IHRoZSBwb2ludGVyIHRvIHRoZSBsYXllciBvYmplY3QgKi8KKwl2cGJlX2Rpc3BsYXlfbGF5ZXIgPSBkaXNwX2Rldi0+ZGV2W2ldOworCXZiZCA9ICZ2cGJlX2Rpc3BsYXlfbGF5ZXItPnZpZGVvX2RldjsKKwkvKiBJbml0aWFsaXplIGZpZWxkIG9mIHZpZGVvIGRldmljZSAqLworCXZiZC0+cmVsZWFzZQk9IHZpZGVvX2RldmljZV9yZWxlYXNlX2VtcHR5OworCXZiZC0+Zm9wcwk9ICZ2cGJlX2ZvcHM7CisJdmJkLT5pb2N0bF9vcHMJPSAmdnBiZV9pb2N0bF9vcHM7CisJdmJkLT5taW5vcgk9IC0xOworCXZiZC0+djRsMl9kZXYgICA9ICZkaXNwX2Rldi0+dnBiZV9kZXYtPnY0bDJfZGV2OworCXZiZC0+bG9jawk9ICZ2cGJlX2Rpc3BsYXlfbGF5ZXItPm9wc2xvY2s7CisKKwlpZiAoZGlzcF9kZXYtPnZwYmVfZGV2LT5jdXJyZW50X3RpbWluZ3MudGltaW5nc190eXBlICYKKwkJCVZQQkVfRU5DX1NURCkgeworCQl2YmQtPnR2bm9ybXMgPSAoVjRMMl9TVERfNTI1XzYwIHwgVjRMMl9TVERfNjI1XzUwKTsKKwkJdmJkLT5jdXJyZW50X25vcm0gPQorCQkJZGlzcF9kZXYtPnZwYmVfZGV2LT4KKwkJCWN1cnJlbnRfdGltaW5ncy50aW1pbmdzLnN0ZF9pZDsKKwl9IGVsc2UKKwkJdmJkLT5jdXJyZW50X25vcm0gPSAwOworCisJc25wcmludGYodmJkLT5uYW1lLCBzaXplb2YodmJkLT5uYW1lKSwKKwkJCSJEYVZpbmNpX1ZQQkUgRGlzcGxheV9EUklWRVJfViVkLiVkLiVkIiwKKwkJCShWUEJFX0RJU1BMQVlfVkVSU0lPTl9DT0RFID4+IDE2KSAmIDB4ZmYsCisJCQkoVlBCRV9ESVNQTEFZX1ZFUlNJT05fQ09ERSA+PiA4KSAmIDB4ZmYsCisJCQkoVlBCRV9ESVNQTEFZX1ZFUlNJT05fQ09ERSkgJiAweGZmKTsKKworCXZwYmVfZGlzcGxheV9sYXllci0+ZGV2aWNlX2lkID0gaTsKKworCXZwYmVfZGlzcGxheV9sYXllci0+bGF5ZXJfaW5mby5pZCA9CisJCSgoaSA9PSBWUEJFX0RJU1BMQVlfREVWSUNFXzApID8gV0lOX1ZJRDAgOiBXSU5fVklEMSk7CisKKwkvKiBJbml0aWFsaXplIHByaW8gbWVtYmVyIG9mIGxheWVyIG9iamVjdCAqLworCXY0bDJfcHJpb19pbml0KCZ2cGJlX2Rpc3BsYXlfbGF5ZXItPnByaW8pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2RldmluaXQgaW50IHJlZ2lzdGVyX2RldmljZShzdHJ1Y3QgdnBiZV9sYXllciAqdnBiZV9kaXNwbGF5X2xheWVyLAorCQkJCQlzdHJ1Y3QgdnBiZV9kaXNwbGF5ICpkaXNwX2RldiwKKwkJCQkJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikgeworCWludCBlcnI7CisKKwl2NGwyX2luZm8oJmRpc3BfZGV2LT52cGJlX2Rldi0+djRsMl9kZXYsCisJCSAgIlRyeWluZyB0byByZWdpc3RlciBWUEJFIGRpc3BsYXkgZGV2aWNlLlxuIik7CisJdjRsMl9pbmZvKCZkaXNwX2Rldi0+dnBiZV9kZXYtPnY0bDJfZGV2LAorCQkgICJsYXllcj0leCxsYXllci0+dmlkZW9fZGV2PSV4XG4iLAorCQkgIChpbnQpdnBiZV9kaXNwbGF5X2xheWVyLAorCQkgIChpbnQpJnZwYmVfZGlzcGxheV9sYXllci0+dmlkZW9fZGV2KTsKKworCWVyciA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmdnBiZV9kaXNwbGF5X2xheWVyLT52aWRlb19kZXYsCisJCQkJICAgIFZGTF9UWVBFX0dSQUJCRVIsCisJCQkJICAgIC0xKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXZwYmVfZGlzcGxheV9sYXllci0+ZGlzcF9kZXYgPSBkaXNwX2RldjsKKwkvKiBzZXQgdGhlIGRyaXZlciBkYXRhIGluIHBsYXRmb3JtIGRldmljZSAqLworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRpc3BfZGV2KTsKKwl2aWRlb19zZXRfZHJ2ZGF0YSgmdnBiZV9kaXNwbGF5X2xheWVyLT52aWRlb19kZXYsCisJCQkgIHZwYmVfZGlzcGxheV9sYXllcik7CisKKwlyZXR1cm4gMDsKK30KKworCisKKy8qCisgKiB2cGJlX2Rpc3BsYXlfcHJvYmUoKQorICogVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGRldmljZSBlbnRyaWVzIGJ5IHJlZ2lzdGVyIGl0c2VsZiB0byB0aGUgVjRMMiBkcml2ZXIKKyAqIGFuZCBpbml0aWFsaXplcyBmaWVsZHMgb2YgZWFjaCBsYXllciBvYmplY3RzCisgKi8KK3N0YXRpYyBfX2RldmluaXQgaW50IHZwYmVfZGlzcGxheV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB2cGJlX2xheWVyICp2cGJlX2Rpc3BsYXlfbGF5ZXI7CisJc3RydWN0IHZwYmVfZGlzcGxheSAqZGlzcF9kZXY7CisJc3RydWN0IHJlc291cmNlICpyZXMgPSBOVUxMOworCWludCBrOworCWludCBpOworCWludCBlcnI7CisJaW50IGlycTsKKworCXByaW50ayhLRVJOX0RFQlVHICJ2cGJlX2Rpc3BsYXlfcHJvYmVcbiIpOworCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgdnBiZV9kaXNwbGF5ICovCisJZGlzcF9kZXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdnBiZV9kaXNwbGF5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkaXNwX2RldikgeworCQlwcmludGsoS0VSTl9FUlIgInJhbiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3Bpbl9sb2NrX2luaXQoJmRpc3BfZGV2LT5kbWFfcXVldWVfbG9jayk7CisJLyoKKwkgKiBTY2FuIGFsbCB0aGUgcGxhdGZvcm0gZGV2aWNlcyB0byBmaW5kIHRoZSB2cGJlCisJICogY29udHJvbGxlciBkZXZpY2UgYW5kIGdldCB0aGUgdnBiZV9kZXYgb2JqZWN0CisJICovCisJZXJyID0gYnVzX2Zvcl9lYWNoX2RldigmcGxhdGZvcm1fYnVzX3R5cGUsIE5VTEwsIGRpc3BfZGV2LAorCQkJdnBiZV9kZXZpY2VfZ2V0KTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKwkvKiBJbml0aWFsaXplIHRoZSB2cGJlIGRpc3BsYXkgY29udHJvbGxlciAqLworCWlmIChOVUxMICE9IGRpc3BfZGV2LT52cGJlX2Rldi0+b3BzLmluaXRpYWxpemUpIHsKKwkJZXJyID0gZGlzcF9kZXYtPnZwYmVfZGV2LT5vcHMuaW5pdGlhbGl6ZSgmcGRldi0+ZGV2LAorCQkJCQkJCSBkaXNwX2Rldi0+dnBiZV9kZXYpOworCQlpZiAoZXJyKSB7CisJCQl2NGwyX2VycigmZGlzcF9kZXYtPnZwYmVfZGV2LT52NGwyX2RldiwKKwkJCQkJIkVycm9yIGluaXRpbmcgdnBiZVxuIik7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBwcm9iZV9vdXQ7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVlBCRV9ESVNQTEFZX01BWF9ERVZJQ0VTOyBpKyspIHsKKwkJaWYgKGluaXRfdnBiZV9sYXllcihpLCBkaXNwX2RldiwgcGRldikpIHsKKwkJCWVyciA9IC1FTk9ERVY7CisJCQlnb3RvIHByb2JlX291dDsKKwkJfQorCX0KKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX0lSUSwgMCk7CisJaWYgKCFyZXMpIHsKKwkJdjRsMl9lcnIoJmRpc3BfZGV2LT52cGJlX2Rldi0+djRsMl9kZXYsCisJCQkgIlVuYWJsZSB0byBnZXQgVkVOQyBpbnRlcnJ1cHQgcmVzb3VyY2VcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIHByb2JlX291dDsKKwl9CisKKwlpcnEgPSByZXMtPnN0YXJ0OworCWlmIChyZXF1ZXN0X2lycShpcnEsIHZlbmNfaXNyLCAgSVJRRl9ESVNBQkxFRCwgVlBCRV9ESVNQTEFZX0RSSVZFUiwKKwkJZGlzcF9kZXYpKSB7CisJCXY0bDJfZXJyKCZkaXNwX2Rldi0+dnBiZV9kZXYtPnY0bDJfZGV2LAorCQkJCSJVbmFibGUgdG8gcmVxdWVzdCBpbnRlcnJ1cHRcbiIpOworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIHByb2JlX291dDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVlBCRV9ESVNQTEFZX01BWF9ERVZJQ0VTOyBpKyspIHsKKwkJaWYgKHJlZ2lzdGVyX2RldmljZShkaXNwX2Rldi0+ZGV2W2ldLCBkaXNwX2RldiwgcGRldikpIHsKKwkJCWVyciA9IC1FTk9ERVY7CisJCQlnb3RvIHByb2JlX291dDsKKwkJfQorCX0KKworCXByaW50ayhLRVJOX0RFQlVHICJTdWNjZXNzZnVsbHkgY29tcGxldGVkIHRoZSBwcm9iaW5nIG9mIHZwYmUgdjRsMiBkZXZpY2VcbiIpOworCXJldHVybiAwOworCitwcm9iZV9vdXQ6CisJZnJlZV9pcnEocmVzLT5zdGFydCwgZGlzcF9kZXYpOworCWZvciAoayA9IDA7IGsgPCBWUEJFX0RJU1BMQVlfTUFYX0RFVklDRVM7IGsrKykgeworCQkvKiBHZXQgdGhlIHBvaW50ZXIgdG8gdGhlIGxheWVyIG9iamVjdCAqLworCQl2cGJlX2Rpc3BsYXlfbGF5ZXIgPSBkaXNwX2Rldi0+ZGV2W2tdOworCQkvKiBVbnJlZ2lzdGVyIHZpZGVvIGRldmljZSAqLworCQlpZiAodnBiZV9kaXNwbGF5X2xheWVyKSB7CisJCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgKKwkJCQkmdnBiZV9kaXNwbGF5X2xheWVyLT52aWRlb19kZXYpOworCQkJCWtmcmVlKGRpc3BfZGV2LT5kZXZba10pOworCQl9CisJfQorCWtmcmVlKGRpc3BfZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogdnBiZV9kaXNwbGF5X3JlbW92ZSgpCisgKiBJdCB1bi1yZWdpc3RlciBoYXJkd2FyZSBsYXllciBmcm9tIFY0TDIgZHJpdmVyCisgKi8KK3N0YXRpYyBpbnQgdnBiZV9kaXNwbGF5X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB2cGJlX2xheWVyICp2cGJlX2Rpc3BsYXlfbGF5ZXI7CisJc3RydWN0IHZwYmVfZGlzcGxheSAqZGlzcF9kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2ID0gZGlzcF9kZXYtPnZwYmVfZGV2OworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBpOworCisJdjRsMl9kYmcoMSwgZGVidWcsICZ2cGJlX2Rldi0+djRsMl9kZXYsICJ2cGJlX2Rpc3BsYXlfcmVtb3ZlXG4iKTsKKworCS8qIHVucmVnaXN0ZXIgaXJxICovCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCAwKTsKKwlmcmVlX2lycShyZXMtPnN0YXJ0LCBkaXNwX2Rldik7CisKKwkvKiBkZWluaXRpYWxpemUgdGhlIHZwYmUgZGlzcGxheSBjb250cm9sbGVyICovCisJaWYgKE5VTEwgIT0gdnBiZV9kZXYtPm9wcy5kZWluaXRpYWxpemUpCisJCXZwYmVfZGV2LT5vcHMuZGVpbml0aWFsaXplKCZwZGV2LT5kZXYsIHZwYmVfZGV2KTsKKwkvKiB1bi1yZWdpc3RlciBkZXZpY2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgVlBCRV9ESVNQTEFZX01BWF9ERVZJQ0VTOyBpKyspIHsKKwkJLyogR2V0IHRoZSBwb2ludGVyIHRvIHRoZSBsYXllciBvYmplY3QgKi8KKwkJdnBiZV9kaXNwbGF5X2xheWVyID0gZGlzcF9kZXYtPmRldltpXTsKKwkJLyogVW5yZWdpc3RlciB2aWRlbyBkZXZpY2UgKi8KKwkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJnZwYmVfZGlzcGxheV9sYXllci0+dmlkZW9fZGV2KTsKKworCX0KKwlmb3IgKGkgPSAwOyBpIDwgVlBCRV9ESVNQTEFZX01BWF9ERVZJQ0VTOyBpKyspIHsKKwkJa2ZyZWUoZGlzcF9kZXYtPmRldltpXSk7CisJCWRpc3BfZGV2LT5kZXZbaV0gPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB2cGJlX2Rpc3BsYXlfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gVlBCRV9ESVNQTEFZX0RSSVZFUiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5idXMgPSAmcGxhdGZvcm1fYnVzX3R5cGUsCisJfSwKKwkucHJvYmUgPSB2cGJlX2Rpc3BsYXlfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHZwYmVfZGlzcGxheV9yZW1vdmUpLAorfTsKKworLyoKKyAqIHZwYmVfZGlzcGxheV9pbml0KCkKKyAqIFRoaXMgZnVuY3Rpb24gcmVnaXN0ZXJzIGRldmljZSBhbmQgZHJpdmVyIHRvIHRoZSBrZXJuZWwsIHJlcXVlc3RzIGlycQorICogaGFuZGxlciBhbmQgYWxsb2NhdGVzIG1lbW9yeSBmb3IgbGF5ZXIgb2JqZWN0cworICovCitzdGF0aWMgX19kZXZpbml0IGludCB2cGJlX2Rpc3BsYXlfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwlwcmludGsoS0VSTl9ERUJVRyAidnBiZV9kaXNwbGF5X2luaXRcbiIpOworCisJLyogUmVnaXN0ZXIgZHJpdmVyIHRvIHRoZSBrZXJuZWwgKi8KKwllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnZwYmVfZGlzcGxheV9kcml2ZXIpOworCWlmICgwICE9IGVycikKKwkJcmV0dXJuIGVycjsKKworCXByaW50ayhLRVJOX0RFQlVHICJ2cGJlX2Rpc3BsYXlfaW5pdDoiCisJCQkiVlBCRSBWNEwyIERpc3BsYXkgRHJpdmVyIFYxLjAgbG9hZGVkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHZwYmVfZGlzcGxheV9jbGVhbnVwKCkKKyAqIFRoaXMgZnVuY3Rpb24gdW4tcmVnaXN0ZXJzIGRldmljZSBhbmQgZHJpdmVyIHRvIHRoZSBrZXJuZWwsIGZyZWVzIHJlcXVlc3RlZAorICogaXJxIGhhbmRsZXIgYW5kIGRlLWFsbG9jYXRlcyBtZW1vcnkgYWxsb2NhdGVkIGZvciBsYXllciBvYmplY3RzLgorICovCitzdGF0aWMgdm9pZCB2cGJlX2Rpc3BsYXlfY2xlYW51cCh2b2lkKQoreworCXByaW50ayhLRVJOX0RFQlVHICJ2cGJlX2Rpc3BsYXlfY2xlYW51cFxuIik7CisKKwkvKiBwbGF0Zm9ybSBkcml2ZXIgdW5yZWdpc3RlciAqLworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ2cGJlX2Rpc3BsYXlfZHJpdmVyKTsKK30KKworLyogRnVuY3Rpb24gZm9yIG1vZHVsZSBpbml0aWFsaXphdGlvbiBhbmQgY2xlYW51cCAqLworbW9kdWxlX2luaXQodnBiZV9kaXNwbGF5X2luaXQpOworbW9kdWxlX2V4aXQodnBiZV9kaXNwbGF5X2NsZWFudXApOworCitNT0RVTEVfREVTQ1JJUFRJT04oIlRJIERNNjQ0eC9ETTM1NS9ETTM2NSBWUEJFIERpc3BsYXkgY29udHJvbGxlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiVGV4YXMgSW5zdHJ1bWVudHMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlX29zZC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfb3NkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM1Mjg4NAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlX29zZC5jCkBAIC0wLDAgKzEsMTIzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDEwIFRleGFzIEluc3RydW1lbnRzIEluYworICogQ29weXJpZ2h0IChDKSAyMDA3IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqCisgKiBBbmR5IExvd2UgKGFsb3dlQG12aXN0YS5jb20pLCBNb250YVZpc3RhIFNvZnR3YXJlCisgKiAtIEluaXRpYWwgdmVyc2lvbgorICogTXVyYWxpIEthcmljaGVyaSAobWthcmljaGVyaUBnbWFpbC5jb20pLCBUZXhhcyBJbnN0cnVtZW50cyBMdGQuCisgKiAtIHBvcnRlZCB0byBzdWIgZGV2aWNlIGludGVyZmFjZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxtYWNoL2lvLmg+CisjaW5jbHVkZSA8bWFjaC9jcHV0eXBlLmg+CisjaW5jbHVkZSA8bWFjaC9oYXJkd2FyZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvZGF2aW5jaS92cHNzLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3ZwYmVfdHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3ZwYmVfb3NkLmg+CisKKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgInZwYmVfb3NkX3JlZ3MuaCIKKworI2RlZmluZSBNT0RVTEVfTkFNRQlWUEJFX09TRF9TVUJERVZfTkFNRQorCisvKiByZWdpc3RlciBhY2Nlc3Mgcm91dGluZXMgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIG9zZF9yZWFkKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCB1MzIgb2Zmc2V0KQoreworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZCA9IHNkOworCisJcmV0dXJuIHJlYWRsKG9zZC0+b3NkX2Jhc2UgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBvc2Rfd3JpdGUoc3RydWN0IG9zZF9zdGF0ZSAqc2QsIHUzMiB2YWwsIHUzMiBvZmZzZXQpCit7CisJc3RydWN0IG9zZF9zdGF0ZSAqb3NkID0gc2Q7CisKKwl3cml0ZWwodmFsLCBvc2QtPm9zZF9iYXNlICsgb2Zmc2V0KTsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG9zZF9zZXQoc3RydWN0IG9zZF9zdGF0ZSAqc2QsIHUzMiBtYXNrLCB1MzIgb2Zmc2V0KQoreworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZCA9IHNkOworCisJdTMyIGFkZHIgPSBvc2QtPm9zZF9iYXNlICsgb2Zmc2V0OworCXUzMiB2YWwgPSByZWFkbChhZGRyKSB8IG1hc2s7CisKKwl3cml0ZWwodmFsLCBhZGRyKTsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG9zZF9jbGVhcihzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwgdTMyIG1hc2ssIHUzMiBvZmZzZXQpCit7CisJc3RydWN0IG9zZF9zdGF0ZSAqb3NkID0gc2Q7CisKKwl1MzIgYWRkciA9IG9zZC0+b3NkX2Jhc2UgKyBvZmZzZXQ7CisJdTMyIHZhbCA9IHJlYWRsKGFkZHIpICYgfm1hc2s7CisKKwl3cml0ZWwodmFsLCBhZGRyKTsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIG9zZF9tb2RpZnkoc3RydWN0IG9zZF9zdGF0ZSAqc2QsIHUzMiBtYXNrLCB1MzIgdmFsLAorCQkJCSB1MzIgb2Zmc2V0KQoreworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZCA9IHNkOworCisJdTMyIGFkZHIgPSBvc2QtPm9zZF9iYXNlICsgb2Zmc2V0OworCXUzMiBuZXdfdmFsID0gKHJlYWRsKGFkZHIpICYgfm1hc2spIHwgKHZhbCAmIG1hc2spOworCisJd3JpdGVsKG5ld192YWwsIGFkZHIpOworCisJcmV0dXJuIG5ld192YWw7Cit9CisKKy8qIGRlZmluZSBzb21lIG1hY3JvcyBmb3IgbGF5ZXIgYW5kIHBpeGZtdCBjbGFzc2lmaWNhdGlvbiAqLworI2RlZmluZSBpc19vc2Rfd2luKGxheWVyKSAoKChsYXllcikgPT0gV0lOX09TRDApIHx8ICgobGF5ZXIpID09IFdJTl9PU0QxKSkKKyNkZWZpbmUgaXNfdmlkX3dpbihsYXllcikgKCgobGF5ZXIpID09IFdJTl9WSUQwKSB8fCAoKGxheWVyKSA9PSBXSU5fVklEMSkpCisjZGVmaW5lIGlzX3JnYl9waXhmbXQocGl4Zm10KSBcCisJKCgocGl4Zm10KSA9PSBQSVhGTVRfUkdCNTY1KSB8fCAoKHBpeGZtdCkgPT0gUElYRk1UX1JHQjg4OCkpCisjZGVmaW5lIGlzX3ljX3BpeGZtdChwaXhmbXQpIFwKKwkoKChwaXhmbXQpID09IFBJWEZNVF9ZQ2JDckkpIHx8ICgocGl4Zm10KSA9PSBQSVhGTVRfWUNyQ2JJKSB8fCBcCisJKChwaXhmbXQpID09IFBJWEZNVF9OVjEyKSkKKyNkZWZpbmUgTUFYX1dJTl9TSVpFIE9TRF9WSURXSU4wWFBfVjBYCisjZGVmaW5lIE1BWF9MSU5FX0xFTkdUSCAoT1NEX1ZJRFdJTjBPRlNUX1YwTE8gPDwgNSkKKworLyoqCisgKiBfb3NkX2RtNjQ0Nl92aWQwX3Bpbmdwb25nKCkgLSBmaWVsZCBpbnZlcnNpb24gZml4IGZvciBETTY0NDYKKyAqIEBzZCAtIHB0ciB0byBzdHJ1Y3Qgb3NkX3N0YXRlCisgKiBAZmllbGRfaW52ZXJzaW9uIC0gaW52ZXJzaW9uIGZsYWcKKyAqIEBmYl9iYXNlX3BoeXMgLSBmcmFtZSBidWZmZXIgYWRkcmVzcworICogQGxjb25maWcgLSBwdHIgdG8gbGF5ZXIgY29uZmlnCisgKgorICogVGhpcyByb3V0aW5lIGltcGxlbWVudHMgYSB3b3JrYXJvdW5kIGZvciB0aGUgZmllbGQgc2lnbmFsIGludmVyc2lvbiBzaWxpY29uCisgKiBlcnJhdHVtIGRlc2NyaWJlZCBpbiBBZHZpc29yeSAxLjMuOCBmb3IgdGhlIERNNjQ0Ni4gIFRoZSBmYl9iYXNlX3BoeXMgYW5kCisgKiBsY29uZmlnIHBhcmFtZXRlcnMgYXBwbHkgdG8gdGhlIHZpZDAgd2luZG93LiAgVGhpcyByb3V0aW5lIHNob3VsZCBiZSBjYWxsZWQKKyAqIHdoZW5ldmVyIHRoZSB2aWQwIGxheWVyIGNvbmZpZ3VyYXRpb24gb3Igc3RhcnQgYWRkcmVzcyBpcyBtb2RpZmllZCwgb3Igd2hlbgorICogdGhlIE9TRCBmaWVsZCBpbnZlcnNpb24gc2V0dGluZyBpcyBtb2RpZmllZC4KKyAqIFJldHVybnM6IDEgaWYgdGhlIHBpbmctcG9uZyBidWZmZXJzIG5lZWQgdG8gYmUgdG9nZ2xlZCBpbiB0aGUgdnN5bmMgaXNyLCBvcgorICogICAgICAgICAgMCBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBfb3NkX2RtNjQ0Nl92aWQwX3Bpbmdwb25nKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLAorCQkJCSAgICAgaW50IGZpZWxkX2ludmVyc2lvbiwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgZmJfYmFzZV9waHlzLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IG9zZF9sYXllcl9jb25maWcgKmxjb25maWcpCit7CisJc3RydWN0IG9zZF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKworCXBkYXRhID0gKHN0cnVjdCBvc2RfcGxhdGZvcm1fZGF0YSAqKXNkLT5kZXYtPnBsYXRmb3JtX2RhdGE7CisJaWYgKHBkYXRhLT5maWVsZF9pbnZfd2FfZW5hYmxlKSB7CisKKwkJaWYgKCFmaWVsZF9pbnZlcnNpb24gfHwgIWxjb25maWctPmludGVybGFjZWQpIHsKKwkJCW9zZF93cml0ZShzZCwgZmJfYmFzZV9waHlzICYgfjB4MUYsIE9TRF9WSURXSU4wQURSKTsKKwkJCW9zZF93cml0ZShzZCwgZmJfYmFzZV9waHlzICYgfjB4MUYsIE9TRF9QUFZXSU4wQURSKTsKKwkJCW9zZF9tb2RpZnkoc2QsIE9TRF9NSVNDQ1RMX1BQU1cgfCBPU0RfTUlTQ0NUTF9QUFJWLCAwLAorCQkJCSAgIE9TRF9NSVNDQ1RMKTsKKwkJCXJldHVybiAwOworCQl9IGVsc2UgeworCQkJdW5zaWduZWQgbWlzY2N0bCA9IE9TRF9NSVNDQ1RMX1BQUlY7CisKKwkJCW9zZF93cml0ZShzZCwKKwkJCQkoZmJfYmFzZV9waHlzICYgfjB4MUYpIC0gbGNvbmZpZy0+bGluZV9sZW5ndGgsCisJCQkJT1NEX1ZJRFdJTjBBRFIpOworCQkJb3NkX3dyaXRlKHNkLAorCQkJCShmYl9iYXNlX3BoeXMgJiB+MHgxRikgKyBsY29uZmlnLT5saW5lX2xlbmd0aCwKKwkJCQlPU0RfUFBWV0lOMEFEUik7CisJCQlvc2RfbW9kaWZ5KHNkLAorCQkJCU9TRF9NSVNDQ1RMX1BQU1cgfCBPU0RfTUlTQ0NUTF9QUFJWLCBtaXNjY3RsLAorCQkJCU9TRF9NSVNDQ1RMKTsKKworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX29zZF9zZXRfZmllbGRfaW52ZXJzaW9uKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCBpbnQgZW5hYmxlKQoreworCXVuc2lnbmVkIGZzaW52ID0gMDsKKworCWlmIChlbmFibGUpCisJCWZzaW52ID0gT1NEX01PREVfRlNJTlY7CisKKwlvc2RfbW9kaWZ5KHNkLCBPU0RfTU9ERV9GU0lOViwgZnNpbnYsIE9TRF9NT0RFKTsKK30KKworc3RhdGljIHZvaWQgX29zZF9zZXRfYmxpbmtfYXR0cmlidXRlKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCBpbnQgZW5hYmxlLAorCQkJCSAgICAgZW51bSBvc2RfYmxpbmtfaW50ZXJ2YWwgYmxpbmspCit7CisJdTMyIG9zZGF0cm1kID0gMDsKKworCWlmIChlbmFibGUpIHsKKwkJb3NkYXRybWQgfD0gT1NEX09TREFUUk1EX0JMTks7CisJCW9zZGF0cm1kIHw9IGJsaW5rIDw8IE9TRF9PU0RBVFJNRF9CTE5LSU5UX1NISUZUOworCX0KKwkvKiBjYWxsZXIgbXVzdCBlbnN1cmUgdGhhdCBPU0QxIGlzIGNvbmZpZ3VyZWQgaW4gYXR0cmlidXRlIG1vZGUgKi8KKwlvc2RfbW9kaWZ5KHNkLCBPU0RfT1NEQVRSTURfQkxOS0lOVCB8IE9TRF9PU0RBVFJNRF9CTE5LLCBvc2RhdHJtZCwKKwkJICBPU0RfT1NEQVRSTUQpOworfQorCitzdGF0aWMgdm9pZCBfb3NkX3NldF9yb21fY2x1dChzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwKKwkJCSAgICAgIGVudW0gb3NkX3JvbV9jbHV0IHJvbV9jbHV0KQoreworCWlmIChyb21fY2x1dCA9PSBST01fQ0xVVDApCisJCW9zZF9jbGVhcihzZCwgT1NEX01JU0NDVExfUlNFTCwgT1NEX01JU0NDVEwpOworCWVsc2UKKwkJb3NkX3NldChzZCwgT1NEX01JU0NDVExfUlNFTCwgT1NEX01JU0NDVEwpOworfQorCitzdGF0aWMgdm9pZCBfb3NkX3NldF9wYWxldHRlX21hcChzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwKKwkJCQkgZW51bSBvc2Rfd2luX2xheWVyIG9zZHdpbiwKKwkJCQkgdW5zaWduZWQgY2hhciBwaXhlbF92YWx1ZSwKKwkJCQkgdW5zaWduZWQgY2hhciBjbHV0X2luZGV4LAorCQkJCSBlbnVtIG9zZF9waXhfZm9ybWF0IHBpeGZtdCkKK3sKKwlzdGF0aWMgY29uc3QgaW50IG1hcF8yYnBwW10gPSB7IDAsIDUsIDEwLCAxNSB9OworCXN0YXRpYyBjb25zdCBpbnQgbWFwXzFicHBbXSA9IHsgMCwgMTUgfTsKKwlpbnQgYm1wX29mZnNldDsKKwlpbnQgYm1wX3NoaWZ0OworCWludCBibXBfbWFzazsKKwlpbnQgYm1wX3JlZzsKKworCXN3aXRjaCAocGl4Zm10KSB7CisJY2FzZSBQSVhGTVRfMUJQUDoKKwkJYm1wX3JlZyA9IG1hcF8xYnBwW3BpeGVsX3ZhbHVlICYgMHgxXTsKKwkJYnJlYWs7CisJY2FzZSBQSVhGTVRfMkJQUDoKKwkJYm1wX3JlZyA9IG1hcF8yYnBwW3BpeGVsX3ZhbHVlICYgMHgzXTsKKwkJYnJlYWs7CisJY2FzZSBQSVhGTVRfNEJQUDoKKwkJYm1wX3JlZyA9IHBpeGVsX3ZhbHVlICYgMHhmOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChvc2R3aW4pIHsKKwljYXNlIE9TRFdJTl9PU0QwOgorCQlibXBfb2Zmc2V0ID0gT1NEX1cwQk1QMDEgKyAoYm1wX3JlZyA+PiAxKSAqIHNpemVvZih1MzIpOworCQlicmVhazsKKwljYXNlIE9TRFdJTl9PU0QxOgorCQlibXBfb2Zmc2V0ID0gT1NEX1cxQk1QMDEgKyAoYm1wX3JlZyA+PiAxKSAqIHNpemVvZih1MzIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJfQorCisJaWYgKGJtcF9yZWcgJiAxKSB7CisJCWJtcF9zaGlmdCA9IDg7CisJCWJtcF9tYXNrID0gMHhmZiA8PCA4OworCX0gZWxzZSB7CisJCWJtcF9zaGlmdCA9IDA7CisJCWJtcF9tYXNrID0gMHhmZjsKKwl9CisKKwlvc2RfbW9kaWZ5KHNkLCBibXBfbWFzaywgY2x1dF9pbmRleCA8PCBibXBfc2hpZnQsIGJtcF9vZmZzZXQpOworfQorCitzdGF0aWMgdm9pZCBfb3NkX3NldF9yZWM2MDFfYXR0ZW51YXRpb24oc3RydWN0IG9zZF9zdGF0ZSAqc2QsCisJCQkJCWVudW0gb3NkX3dpbl9sYXllciBvc2R3aW4sIGludCBlbmFibGUpCit7CisJc3dpdGNoIChvc2R3aW4pIHsKKwljYXNlIE9TRFdJTl9PU0QwOgorCQlvc2RfbW9kaWZ5KHNkLCBPU0RfT1NEV0lOME1EX0FUTjBFLAorCQkJICBlbmFibGUgPyBPU0RfT1NEV0lOME1EX0FUTjBFIDogMCwKKwkJCSAgT1NEX09TRFdJTjBNRCk7CisJCWJyZWFrOworCWNhc2UgT1NEV0lOX09TRDE6CisJCW9zZF9tb2RpZnkoc2QsIE9TRF9PU0RXSU4xTURfQVROMUUsCisJCQkgIGVuYWJsZSA/IE9TRF9PU0RXSU4xTURfQVROMUUgOiAwLAorCQkJICBPU0RfT1NEV0lOMU1EKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBfb3NkX3NldF9ibGVuZGluZ19mYWN0b3Ioc3RydWN0IG9zZF9zdGF0ZSAqc2QsCisJCQkJICAgICBlbnVtIG9zZF93aW5fbGF5ZXIgb3Nkd2luLAorCQkJCSAgICAgZW51bSBvc2RfYmxlbmRpbmdfZmFjdG9yIGJsZW5kKQoreworCXN3aXRjaCAob3Nkd2luKSB7CisJY2FzZSBPU0RXSU5fT1NEMDoKKwkJb3NkX21vZGlmeShzZCwgT1NEX09TRFdJTjBNRF9CTE5EMCwKKwkJCSAgYmxlbmQgPDwgT1NEX09TRFdJTjBNRF9CTE5EMF9TSElGVCwgT1NEX09TRFdJTjBNRCk7CisJCWJyZWFrOworCWNhc2UgT1NEV0lOX09TRDE6CisJCW9zZF9tb2RpZnkoc2QsIE9TRF9PU0RXSU4xTURfQkxORDEsCisJCQkgIGJsZW5kIDw8IE9TRF9PU0RXSU4xTURfQkxORDFfU0hJRlQsIE9TRF9PU0RXSU4xTUQpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9vc2RfZW5hYmxlX2NvbG9yX2tleShzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwKKwkJCQkgIGVudW0gb3NkX3dpbl9sYXllciBvc2R3aW4sCisJCQkJICB1bnNpZ25lZCBjb2xvcmtleSwKKwkJCQkgIGVudW0gb3NkX3BpeF9mb3JtYXQgcGl4Zm10KQoreworCXN3aXRjaCAocGl4Zm10KSB7CisJY2FzZSBQSVhGTVRfUkdCNTY1OgorCQlvc2Rfd3JpdGUoc2QsIGNvbG9ya2V5ICYgT1NEX1RSQU5TUFZBTF9SR0JUUkFOUywKKwkJCSAgT1NEX1RSQU5TUFZBTCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAob3Nkd2luKSB7CisJY2FzZSBPU0RXSU5fT1NEMDoKKwkJb3NkX3NldChzZCwgT1NEX09TRFdJTjBNRF9URTAsIE9TRF9PU0RXSU4wTUQpOworCQlicmVhazsKKwljYXNlIE9TRFdJTl9PU0QxOgorCQlvc2Rfc2V0KHNkLCBPU0RfT1NEV0lOMU1EX1RFMSwgT1NEX09TRFdJTjFNRCk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgX29zZF9kaXNhYmxlX2NvbG9yX2tleShzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwKKwkJCQkgICBlbnVtIG9zZF93aW5fbGF5ZXIgb3Nkd2luKQoreworCXN3aXRjaCAob3Nkd2luKSB7CisJY2FzZSBPU0RXSU5fT1NEMDoKKwkJb3NkX2NsZWFyKHNkLCBPU0RfT1NEV0lOME1EX1RFMCwgT1NEX09TRFdJTjBNRCk7CisJCWJyZWFrOworCWNhc2UgT1NEV0lOX09TRDE6CisJCW9zZF9jbGVhcihzZCwgT1NEX09TRFdJTjFNRF9URTEsIE9TRF9PU0RXSU4xTUQpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9vc2Rfc2V0X29zZF9jbHV0KHN0cnVjdCBvc2Rfc3RhdGUgKnNkLAorCQkJICAgICAgZW51bSBvc2Rfd2luX2xheWVyIG9zZHdpbiwKKwkJCSAgICAgIGVudW0gb3NkX2NsdXQgY2x1dCkKK3sKKwl1MzIgd2lubWQgPSAwOworCisJc3dpdGNoIChvc2R3aW4pIHsKKwljYXNlIE9TRFdJTl9PU0QwOgorCQlpZiAoY2x1dCA9PSBSQU1fQ0xVVCkKKwkJCXdpbm1kIHw9IE9TRF9PU0RXSU4wTURfQ0xVVFMwOworCQlvc2RfbW9kaWZ5KHNkLCBPU0RfT1NEV0lOME1EX0NMVVRTMCwgd2lubWQsIE9TRF9PU0RXSU4wTUQpOworCQlicmVhazsKKwljYXNlIE9TRFdJTl9PU0QxOgorCQlpZiAoY2x1dCA9PSBSQU1fQ0xVVCkKKwkJCXdpbm1kIHw9IE9TRF9PU0RXSU4xTURfQ0xVVFMxOworCQlvc2RfbW9kaWZ5KHNkLCBPU0RfT1NEV0lOMU1EX0NMVVRTMSwgd2lubWQsIE9TRF9PU0RXSU4xTUQpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9vc2Rfc2V0X3pvb20oc3RydWN0IG9zZF9zdGF0ZSAqc2QsIGVudW0gb3NkX2xheWVyIGxheWVyLAorCQkJICBlbnVtIG9zZF96b29tX2ZhY3RvciBoX3pvb20sCisJCQkgIGVudW0gb3NkX3pvb21fZmFjdG9yIHZfem9vbSkKK3sKKwl1MzIgd2lubWQgPSAwOworCisJc3dpdGNoIChsYXllcikgeworCWNhc2UgV0lOX09TRDA6CisJCXdpbm1kIHw9IChoX3pvb20gPDwgT1NEX09TRFdJTjBNRF9PSFowX1NISUZUKTsKKwkJd2lubWQgfD0gKHZfem9vbSA8PCBPU0RfT1NEV0lOME1EX09WWjBfU0hJRlQpOworCQlvc2RfbW9kaWZ5KHNkLCBPU0RfT1NEV0lOME1EX09IWjAgfCBPU0RfT1NEV0lOME1EX09WWjAsIHdpbm1kLAorCQkJICBPU0RfT1NEV0lOME1EKTsKKwkJYnJlYWs7CisJY2FzZSBXSU5fVklEMDoKKwkJd2lubWQgfD0gKGhfem9vbSA8PCBPU0RfVklEV0lOTURfVkhaMF9TSElGVCk7CisJCXdpbm1kIHw9ICh2X3pvb20gPDwgT1NEX1ZJRFdJTk1EX1ZWWjBfU0hJRlQpOworCQlvc2RfbW9kaWZ5KHNkLCBPU0RfVklEV0lOTURfVkhaMCB8IE9TRF9WSURXSU5NRF9WVlowLCB3aW5tZCwKKwkJCSAgT1NEX1ZJRFdJTk1EKTsKKwkJYnJlYWs7CisJY2FzZSBXSU5fT1NEMToKKwkJd2lubWQgfD0gKGhfem9vbSA8PCBPU0RfT1NEV0lOMU1EX09IWjFfU0hJRlQpOworCQl3aW5tZCB8PSAodl96b29tIDw8IE9TRF9PU0RXSU4xTURfT1ZaMV9TSElGVCk7CisJCW9zZF9tb2RpZnkoc2QsIE9TRF9PU0RXSU4xTURfT0haMSB8IE9TRF9PU0RXSU4xTURfT1ZaMSwgd2lubWQsCisJCQkgIE9TRF9PU0RXSU4xTUQpOworCQlicmVhazsKKwljYXNlIFdJTl9WSUQxOgorCQl3aW5tZCB8PSAoaF96b29tIDw8IE9TRF9WSURXSU5NRF9WSFoxX1NISUZUKTsKKwkJd2lubWQgfD0gKHZfem9vbSA8PCBPU0RfVklEV0lOTURfVlZaMV9TSElGVCk7CisJCW9zZF9tb2RpZnkoc2QsIE9TRF9WSURXSU5NRF9WSFoxIHwgT1NEX1ZJRFdJTk1EX1ZWWjEsIHdpbm1kLAorCQkJICBPU0RfVklEV0lOTUQpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9vc2RfZGlzYWJsZV9sYXllcihzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwgZW51bSBvc2RfbGF5ZXIgbGF5ZXIpCit7CisJc3dpdGNoIChsYXllcikgeworCWNhc2UgV0lOX09TRDA6CisJCW9zZF9jbGVhcihzZCwgT1NEX09TRFdJTjBNRF9PQUNUMCwgT1NEX09TRFdJTjBNRCk7CisJCWJyZWFrOworCWNhc2UgV0lOX1ZJRDA6CisJCW9zZF9jbGVhcihzZCwgT1NEX1ZJRFdJTk1EX0FDVDAsIE9TRF9WSURXSU5NRCk7CisJCWJyZWFrOworCWNhc2UgV0lOX09TRDE6CisJCS8qIGRpc2FibGUgYXR0cmlidXRlIG1vZGUgYXMgd2VsbCBhcyBkaXNhYmxpbmcgdGhlIHdpbmRvdyAqLworCQlvc2RfY2xlYXIoc2QsIE9TRF9PU0RXSU4xTURfT0FTVyB8IE9TRF9PU0RXSU4xTURfT0FDVDEsCisJCQkgIE9TRF9PU0RXSU4xTUQpOworCQlicmVhazsKKwljYXNlIFdJTl9WSUQxOgorCQlvc2RfY2xlYXIoc2QsIE9TRF9WSURXSU5NRF9BQ1QxLCBPU0RfVklEV0lOTUQpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9zZF9kaXNhYmxlX2xheWVyKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCBlbnVtIG9zZF9sYXllciBsYXllcikKK3sKKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2QgPSBzZDsKKwlzdHJ1Y3Qgb3NkX3dpbmRvd19zdGF0ZSAqd2luID0gJm9zZC0+d2luW2xheWVyXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm9zZC0+bG9jaywgZmxhZ3MpOworCisJaWYgKCF3aW4tPmlzX2VuYWJsZWQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3NkLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisJd2luLT5pc19lbmFibGVkID0gMDsKKworCV9vc2RfZGlzYWJsZV9sYXllcihzZCwgbGF5ZXIpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3NkLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIF9vc2RfZW5hYmxlX2F0dHJpYnV0ZV9tb2RlKHN0cnVjdCBvc2Rfc3RhdGUgKnNkKQoreworCS8qIGVuYWJsZSBhdHRyaWJ1dGUgbW9kZSBmb3IgT1NEMSAqLworCW9zZF9zZXQoc2QsIE9TRF9PU0RXSU4xTURfT0FTVywgT1NEX09TRFdJTjFNRCk7Cit9CisKK3N0YXRpYyB2b2lkIF9vc2RfZW5hYmxlX2xheWVyKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCBlbnVtIG9zZF9sYXllciBsYXllcikKK3sKKwlzd2l0Y2ggKGxheWVyKSB7CisJY2FzZSBXSU5fT1NEMDoKKwkJb3NkX3NldChzZCwgT1NEX09TRFdJTjBNRF9PQUNUMCwgT1NEX09TRFdJTjBNRCk7CisJCWJyZWFrOworCWNhc2UgV0lOX1ZJRDA6CisJCW9zZF9zZXQoc2QsIE9TRF9WSURXSU5NRF9BQ1QwLCBPU0RfVklEV0lOTUQpOworCQlicmVhazsKKwljYXNlIFdJTl9PU0QxOgorCQkvKiBlbmFibGUgT1NEMSBhbmQgZGlzYWJsZSBhdHRyaWJ1dGUgbW9kZSAqLworCQlvc2RfbW9kaWZ5KHNkLCBPU0RfT1NEV0lOMU1EX09BU1cgfCBPU0RfT1NEV0lOMU1EX09BQ1QxLAorCQkJICBPU0RfT1NEV0lOMU1EX09BQ1QxLCBPU0RfT1NEV0lOMU1EKTsKKwkJYnJlYWs7CisJY2FzZSBXSU5fVklEMToKKwkJb3NkX3NldChzZCwgT1NEX1ZJRFdJTk1EX0FDVDEsIE9TRF9WSURXSU5NRCk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBvc2RfZW5hYmxlX2xheWVyKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCBlbnVtIG9zZF9sYXllciBsYXllciwKKwkJCSAgICBpbnQgb3RoZXJ3aW4pCit7CisJc3RydWN0IG9zZF9zdGF0ZSAqb3NkID0gc2Q7CisJc3RydWN0IG9zZF93aW5kb3dfc3RhdGUgKndpbiA9ICZvc2QtPndpbltsYXllcl07CisJc3RydWN0IG9zZF9sYXllcl9jb25maWcgKmNmZyA9ICZ3aW4tPmxjb25maWc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZvc2QtPmxvY2ssIGZsYWdzKTsKKworCS8qCisJICogdXNlIG90aGVyd2luIGZsYWcgdG8ga25vdyB0aGlzIGlzIHRoZSBvdGhlciB2aWQgd2luZG93CisJICogaW4gWVVWNDIwIG1vZGUsIGlmIGlzLCBza2lwIHRoaXMgY2hlY2sKKwkgKi8KKwlpZiAoIW90aGVyd2luICYmICghd2luLT5pc19hbGxvY2F0ZWQgfHwKKwkJCSF3aW4tPmZiX2Jhc2VfcGh5cyB8fAorCQkJIWNmZy0+bGluZV9sZW5ndGggfHwKKwkJCSFjZmctPnhzaXplIHx8CisJCQkhY2ZnLT55c2l6ZSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3NkLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAod2luLT5pc19lbmFibGVkKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9zZC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisJd2luLT5pc19lbmFibGVkID0gMTsKKworCWlmIChjZmctPnBpeGZtdCAhPSBQSVhGTVRfT1NEX0FUVFIpCisJCV9vc2RfZW5hYmxlX2xheWVyKHNkLCBsYXllcik7CisJZWxzZSB7CisJCV9vc2RfZW5hYmxlX2F0dHJpYnV0ZV9tb2RlKHNkKTsKKwkJX29zZF9zZXRfYmxpbmtfYXR0cmlidXRlKHNkLCBvc2QtPmlzX2JsaW5raW5nLCBvc2QtPmJsaW5rKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvc2QtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfb3NkX3N0YXJ0X2xheWVyKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCBlbnVtIG9zZF9sYXllciBsYXllciwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBmYl9iYXNlX3BoeXMsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgY2Jjcl9vZnN0KQoreworCXN3aXRjaCAobGF5ZXIpIHsKKwljYXNlIFdJTl9PU0QwOgorCQlvc2Rfd3JpdGUoc2QsIGZiX2Jhc2VfcGh5cyAmIH4weDFGLCBPU0RfT1NEV0lOMEFEUik7CisJCWJyZWFrOworCWNhc2UgV0lOX1ZJRDA6CisJCW9zZF93cml0ZShzZCwgZmJfYmFzZV9waHlzICYgfjB4MUYsIE9TRF9WSURXSU4wQURSKTsKKwkJYnJlYWs7CisJY2FzZSBXSU5fT1NEMToKKwkJb3NkX3dyaXRlKHNkLCBmYl9iYXNlX3BoeXMgJiB+MHgxRiwgT1NEX09TRFdJTjFBRFIpOworCQlicmVhazsKKwljYXNlIFdJTl9WSUQxOgorCQlvc2Rfd3JpdGUoc2QsIGZiX2Jhc2VfcGh5cyAmIH4weDFGLCBPU0RfVklEV0lOMUFEUik7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgb3NkX3N0YXJ0X2xheWVyKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCBlbnVtIG9zZF9sYXllciBsYXllciwKKwkJCSAgICB1bnNpZ25lZCBsb25nIGZiX2Jhc2VfcGh5cywKKwkJCSAgICB1bnNpZ25lZCBsb25nIGNiY3Jfb2ZzdCkKK3sKKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2QgPSBzZDsKKwlzdHJ1Y3Qgb3NkX3dpbmRvd19zdGF0ZSAqd2luID0gJm9zZC0+d2luW2xheWVyXTsKKwlzdHJ1Y3Qgb3NkX2xheWVyX2NvbmZpZyAqY2ZnID0gJndpbi0+bGNvbmZpZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm9zZC0+bG9jaywgZmxhZ3MpOworCisJd2luLT5mYl9iYXNlX3BoeXMgPSBmYl9iYXNlX3BoeXMgJiB+MHgxRjsKKwlfb3NkX3N0YXJ0X2xheWVyKHNkLCBsYXllciwgZmJfYmFzZV9waHlzLCBjYmNyX29mc3QpOworCisJaWYgKGxheWVyID09IFdJTl9WSUQwKSB7CisJCW9zZC0+cGluZ3BvbmcgPQorCQkgICAgX29zZF9kbTY0NDZfdmlkMF9waW5ncG9uZyhzZCwgb3NkLT5maWVsZF9pbnZlcnNpb24sCisJCQkJCQkgICAgICAgd2luLT5mYl9iYXNlX3BoeXMsCisJCQkJCQkgICAgICAgY2ZnKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvc2QtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgb3NkX2dldF9sYXllcl9jb25maWcoc3RydWN0IG9zZF9zdGF0ZSAqc2QsIGVudW0gb3NkX2xheWVyIGxheWVyLAorCQkJCSBzdHJ1Y3Qgb3NkX2xheWVyX2NvbmZpZyAqbGNvbmZpZykKK3sKKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2QgPSBzZDsKKwlzdHJ1Y3Qgb3NkX3dpbmRvd19zdGF0ZSAqd2luID0gJm9zZC0+d2luW2xheWVyXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm9zZC0+bG9jaywgZmxhZ3MpOworCisJKmxjb25maWcgPSB3aW4tPmxjb25maWc7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvc2QtPmxvY2ssIGZsYWdzKTsKK30KKworLyoqCisgKiB0cnlfbGF5ZXJfY29uZmlnKCkgLSBUcnkgYSBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGZvciB0aGUgbGF5ZXIKKyAqIEBzZCAgLSBwdHIgdG8gc3RydWN0IG9zZF9zdGF0ZQorICogQGxheWVyIC0gbGF5ZXIgdG8gY29uZmlndXJlCisgKiBAbGNvbmZpZyAtIGxheWVyIGNvbmZpZ3VyYXRpb24gdG8gdHJ5CisgKgorICogSWYgdGhlIHJlcXVlc3RlZCBsY29uZmlnIGlzIGNvbXBsZXRlbHkgcmVqZWN0ZWQgYW5kIHRoZSB2YWx1ZSBvZiBsY29uZmlnIG9uCisgKiBleGl0IGlzIHRoZSBjdXJyZW50IGxjb25maWcsIHRoZW4gdHJ5X2xheWVyX2NvbmZpZygpIHJldHVybnMgMS4gIE90aGVyd2lzZSwKKyAqIHRyeV9sYXllcl9jb25maWcoKSByZXR1cm5zIDAuICBBIHJldHVybiB2YWx1ZSBvZiAwIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG1lYW4KKyAqIHRoYXQgdGhlIHZhbHVlIG9mIGxjb25maWcgb24gZXhpdCBpcyBpZGVudGljYWwgdG8gdGhlIHZhbHVlIG9mIGxjb25maWcgb24KKyAqIGVudHJ5LCBidXQgbWVyZWx5IHRoYXQgaXQgcmVwcmVzZW50cyBhIGNoYW5nZSBmcm9tIHRoZSBjdXJyZW50IGxjb25maWcuCisgKi8KK3N0YXRpYyBpbnQgdHJ5X2xheWVyX2NvbmZpZyhzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwgZW51bSBvc2RfbGF5ZXIgbGF5ZXIsCisJCQkgICAgc3RydWN0IG9zZF9sYXllcl9jb25maWcgKmxjb25maWcpCit7CisJc3RydWN0IG9zZF9zdGF0ZSAqb3NkID0gc2Q7CisJc3RydWN0IG9zZF93aW5kb3dfc3RhdGUgKndpbiA9ICZvc2QtPndpbltsYXllcl07CisJaW50IGJhZF9jb25maWc7CisKKwkvKiB2ZXJpZnkgdGhhdCB0aGUgcGl4ZWwgZm9ybWF0IGlzIGNvbXBhdGlibGUgd2l0aCB0aGUgbGF5ZXIgKi8KKwlzd2l0Y2ggKGxjb25maWctPnBpeGZtdCkgeworCWNhc2UgUElYRk1UXzFCUFA6CisJY2FzZSBQSVhGTVRfMkJQUDoKKwljYXNlIFBJWEZNVF80QlBQOgorCWNhc2UgUElYRk1UXzhCUFA6CisJY2FzZSBQSVhGTVRfUkdCNTY1OgorCQliYWRfY29uZmlnID0gIWlzX29zZF93aW4obGF5ZXIpOworCQlicmVhazsKKwljYXNlIFBJWEZNVF9ZQ2JDckk6CisJY2FzZSBQSVhGTVRfWUNyQ2JJOgorCQliYWRfY29uZmlnID0gIWlzX3ZpZF93aW4obGF5ZXIpOworCQlicmVhazsKKwljYXNlIFBJWEZNVF9SR0I4ODg6CisJCWJhZF9jb25maWcgPSAhaXNfdmlkX3dpbihsYXllcik7CisJCWJyZWFrOworCWNhc2UgUElYRk1UX05WMTI6CisJCWJhZF9jb25maWcgPSAxOworCQlicmVhazsKKwljYXNlIFBJWEZNVF9PU0RfQVRUUjoKKwkJYmFkX2NvbmZpZyA9IChsYXllciAhPSBXSU5fT1NEMSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJhZF9jb25maWcgPSAxOworCQlicmVhazsKKwl9CisJaWYgKGJhZF9jb25maWcpIHsKKwkJLyoKKwkJICogVGhlIHJlcXVlc3RlZCBwaXhlbCBmb3JtYXQgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIGxheWVyLAorCQkgKiBzbyBrZWVwIHRoZSBjdXJyZW50IGxheWVyIGNvbmZpZ3VyYXRpb24uCisJCSAqLworCQkqbGNvbmZpZyA9IHdpbi0+bGNvbmZpZzsKKwkJcmV0dXJuIGJhZF9jb25maWc7CisJfQorCisJLyogRE02NDQ2OiAqLworCS8qIG9ubHkgb25lIE9TRCB3aW5kb3cgYXQgYSB0aW1lIGNhbiB1c2UgUkdCIHBpeGVsIGZvcm1hdHMgKi8KKwlpZiAoaXNfb3NkX3dpbihsYXllcikgJiYgaXNfcmdiX3BpeGZtdChsY29uZmlnLT5waXhmbXQpKSB7CisJCWVudW0gb3NkX3BpeF9mb3JtYXQgcGl4Zm10OworCQlpZiAobGF5ZXIgPT0gV0lOX09TRDApCisJCQlwaXhmbXQgPSBvc2QtPndpbltXSU5fT1NEMV0ubGNvbmZpZy5waXhmbXQ7CisJCWVsc2UKKwkJCXBpeGZtdCA9IG9zZC0+d2luW1dJTl9PU0QwXS5sY29uZmlnLnBpeGZtdDsKKworCQlpZiAoaXNfcmdiX3BpeGZtdChwaXhmbXQpKSB7CisJCQkvKgorCQkJICogVGhlIG90aGVyIE9TRCB3aW5kb3cgaXMgYWxyZWFkeSBjb25maWd1cmVkIGZvciBhbgorCQkJICogUkdCLCBzbyBrZWVwIHRoZSBjdXJyZW50IGxheWVyIGNvbmZpZ3VyYXRpb24uCisJCQkgKi8KKwkJCSpsY29uZmlnID0gd2luLT5sY29uZmlnOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwkvKiBETTY0NDY6IG9ubHkgb25lIHZpZGVvIHdpbmRvdyBhdCBhIHRpbWUgY2FuIHVzZSBSR0I4ODggKi8KKwlpZiAoaXNfdmlkX3dpbihsYXllcikgJiYgbGNvbmZpZy0+cGl4Zm10ID09IFBJWEZNVF9SR0I4ODgpIHsKKwkJZW51bSBvc2RfcGl4X2Zvcm1hdCBwaXhmbXQ7CisKKwkJaWYgKGxheWVyID09IFdJTl9WSUQwKQorCQkJcGl4Zm10ID0gb3NkLT53aW5bV0lOX1ZJRDFdLmxjb25maWcucGl4Zm10OworCQllbHNlCisJCQlwaXhmbXQgPSBvc2QtPndpbltXSU5fVklEMF0ubGNvbmZpZy5waXhmbXQ7CisKKwkJaWYgKHBpeGZtdCA9PSBQSVhGTVRfUkdCODg4KSB7CisJCQkvKgorCQkJICogVGhlIG90aGVyIHZpZGVvIHdpbmRvdyBpcyBhbHJlYWR5IGNvbmZpZ3VyZWQgZm9yCisJCQkgKiBSR0I4ODgsIHNvIGtlZXAgdGhlIGN1cnJlbnQgbGF5ZXIgY29uZmlndXJhdGlvbi4KKwkJCSAqLworCQkJKmxjb25maWcgPSB3aW4tPmxjb25maWc7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCS8qIHdpbmRvdyBkaW1lbnNpb25zIG11c3QgYmUgbm9uLXplcm8gKi8KKwlpZiAoIWxjb25maWctPmxpbmVfbGVuZ3RoIHx8ICFsY29uZmlnLT54c2l6ZSB8fCAhbGNvbmZpZy0+eXNpemUpIHsKKwkJKmxjb25maWcgPSB3aW4tPmxjb25maWc7CisJCXJldHVybiAxOworCX0KKworCS8qIHJvdW5kIGxpbmVfbGVuZ3RoIHVwIHRvIGEgbXVsdGlwbGUgb2YgMzIgKi8KKwlsY29uZmlnLT5saW5lX2xlbmd0aCA9ICgobGNvbmZpZy0+bGluZV9sZW5ndGggKyAzMSkgLyAzMikgKiAzMjsKKwlsY29uZmlnLT5saW5lX2xlbmd0aCA9CisJICAgIG1pbihsY29uZmlnLT5saW5lX2xlbmd0aCwgKHVuc2lnbmVkKU1BWF9MSU5FX0xFTkdUSCk7CisJbGNvbmZpZy0+eHNpemUgPSBtaW4obGNvbmZpZy0+eHNpemUsICh1bnNpZ25lZClNQVhfV0lOX1NJWkUpOworCWxjb25maWctPnlzaXplID0gbWluKGxjb25maWctPnlzaXplLCAodW5zaWduZWQpTUFYX1dJTl9TSVpFKTsKKwlsY29uZmlnLT54cG9zID0gbWluKGxjb25maWctPnhwb3MsICh1bnNpZ25lZClNQVhfV0lOX1NJWkUpOworCWxjb25maWctPnlwb3MgPSBtaW4obGNvbmZpZy0+eXBvcywgKHVuc2lnbmVkKU1BWF9XSU5fU0laRSk7CisJbGNvbmZpZy0+aW50ZXJsYWNlZCA9IChsY29uZmlnLT5pbnRlcmxhY2VkICE9IDApOworCWlmIChsY29uZmlnLT5pbnRlcmxhY2VkKSB7CisJCS8qIHlzaXplIGFuZCB5cG9zIG11c3QgYmUgZXZlbiBmb3IgaW50ZXJsYWNlZCBkaXNwbGF5cyAqLworCQlsY29uZmlnLT55c2l6ZSAmPSB+MTsKKwkJbGNvbmZpZy0+eXBvcyAmPSB+MTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX29zZF9kaXNhYmxlX3ZpZF9yZ2I4ODgoc3RydWN0IG9zZF9zdGF0ZSAqc2QpCit7CisJLyoKKwkgKiBUaGUgRE02NDQ2IHN1cHBvcnRzIFJHQjg4OCBwaXhlbCBmb3JtYXQgaW4gYSBzaW5nbGUgdmlkZW8gd2luZG93LgorCSAqIFRoaXMgcm91dGluZSBkaXNhYmxlcyBSR0I4ODggcGl4ZWwgZm9ybWF0IGZvciBib3RoIHZpZGVvIHdpbmRvd3MuCisJICogVGhlIGNhbGxlciBtdXN0IGVuc3VyZSB0aGF0IG5laXRoZXIgdmlkZW8gd2luZG93IGlzIGN1cnJlbnRseQorCSAqIGNvbmZpZ3VyZWQgZm9yIFJHQjg4OCBwaXhlbCBmb3JtYXQuCisJICovCisJb3NkX2NsZWFyKHNkLCBPU0RfTUlTQ0NUTF9SR0JFTiwgT1NEX01JU0NDVEwpOworfQorCitzdGF0aWMgdm9pZCBfb3NkX2VuYWJsZV92aWRfcmdiODg4KHN0cnVjdCBvc2Rfc3RhdGUgKnNkLAorCQkJCSAgIGVudW0gb3NkX2xheWVyIGxheWVyKQoreworCS8qCisJICogVGhlIERNNjQ0NiBzdXBwb3J0cyBSR0I4ODggcGl4ZWwgZm9ybWF0IGluIGEgc2luZ2xlIHZpZGVvIHdpbmRvdy4KKwkgKiBUaGlzIHJvdXRpbmUgZW5hYmxlcyBSR0I4ODggcGl4ZWwgZm9ybWF0IGZvciB0aGUgc3BlY2lmaWVkIHZpZGVvCisJICogd2luZG93LiAgVGhlIGNhbGxlciBtdXN0IGVuc3VyZSB0aGF0IHRoZSBvdGhlciB2aWRlbyB3aW5kb3cgaXMgbm90CisJICogY3VycmVudGx5IGNvbmZpZ3VyZWQgZm9yIFJHQjg4OCBwaXhlbCBmb3JtYXQsIGFzIHRoaXMgcm91dGluZSB3aWxsCisJICogZGlzYWJsZSBSR0I4ODggcGl4ZWwgZm9ybWF0IGZvciB0aGUgb3RoZXIgd2luZG93LgorCSAqLworCWlmIChsYXllciA9PSBXSU5fVklEMCkgeworCQlvc2RfbW9kaWZ5KHNkLCBPU0RfTUlTQ0NUTF9SR0JFTiB8IE9TRF9NSVNDQ1RMX1JHQldJTiwKKwkJCSAgT1NEX01JU0NDVExfUkdCRU4sIE9TRF9NSVNDQ1RMKTsKKwl9IGVsc2UgaWYgKGxheWVyID09IFdJTl9WSUQxKSB7CisJCW9zZF9tb2RpZnkoc2QsIE9TRF9NSVNDQ1RMX1JHQkVOIHwgT1NEX01JU0NDVExfUkdCV0lOLAorCQkJICBPU0RfTUlTQ0NUTF9SR0JFTiB8IE9TRF9NSVNDQ1RMX1JHQldJTiwKKwkJCSAgT1NEX01JU0NDVEwpOworCX0KK30KKworc3RhdGljIHZvaWQgX29zZF9zZXRfY2Jjcl9vcmRlcihzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwKKwkJCQllbnVtIG9zZF9waXhfZm9ybWF0IHBpeGZtdCkKK3sKKwkvKgorCSAqIFRoZSBjYWxsZXIgbXVzdCBlbnN1cmUgdGhhdCBhbGwgd2luZG93cyB1c2luZyBZQyBwaXhmbXQgdXNlIHRoZSBzYW1lCisJICogQ2IvQ3Igb3JkZXIuCisJICovCisJaWYgKHBpeGZtdCA9PSBQSVhGTVRfWUNiQ3JJKQorCQlvc2RfY2xlYXIoc2QsIE9TRF9NT0RFX0NTLCBPU0RfTU9ERSk7CisJZWxzZSBpZiAocGl4Zm10ID09IFBJWEZNVF9ZQ3JDYkkpCisJCW9zZF9zZXQoc2QsIE9TRF9NT0RFX0NTLCBPU0RfTU9ERSk7Cit9CisKK3N0YXRpYyB2b2lkIF9vc2Rfc2V0X2xheWVyX2NvbmZpZyhzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwgZW51bSBvc2RfbGF5ZXIgbGF5ZXIsCisJCQkJICBjb25zdCBzdHJ1Y3Qgb3NkX2xheWVyX2NvbmZpZyAqbGNvbmZpZykKK3sKKwl1MzIgd2lubWQgPSAwLCB3aW5tZF9tYXNrID0gMCwgYm13ID0gMDsKKworCV9vc2Rfc2V0X2NiY3Jfb3JkZXIoc2QsIGxjb25maWctPnBpeGZtdCk7CisKKwlzd2l0Y2ggKGxheWVyKSB7CisJY2FzZSBXSU5fT1NEMDoKKwkJd2lubWRfbWFzayB8PSBPU0RfT1NEV0lOME1EX1JHQjBFOworCQlpZiAobGNvbmZpZy0+cGl4Zm10ID09IFBJWEZNVF9SR0I1NjUpCisJCQl3aW5tZCB8PSBPU0RfT1NEV0lOME1EX1JHQjBFOworCisJCXdpbm1kX21hc2sgfD0gT1NEX09TRFdJTjBNRF9CTVcwIHwgT1NEX09TRFdJTjBNRF9PRkYwOworCisJCXN3aXRjaCAobGNvbmZpZy0+cGl4Zm10KSB7CisJCWNhc2UgUElYRk1UXzFCUFA6CisJCQlibXcgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgUElYRk1UXzJCUFA6CisJCQlibXcgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgUElYRk1UXzRCUFA6CisJCQlibXcgPSAyOworCQkJYnJlYWs7CisJCWNhc2UgUElYRk1UXzhCUFA6CisJCQlibXcgPSAzOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCQl3aW5tZCB8PSAoYm13IDw8IE9TRF9PU0RXSU4wTURfQk1XMF9TSElGVCk7CisKKwkJaWYgKGxjb25maWctPmludGVybGFjZWQpCisJCQl3aW5tZCB8PSBPU0RfT1NEV0lOME1EX09GRjA7CisKKwkJb3NkX21vZGlmeShzZCwgd2lubWRfbWFzaywgd2lubWQsIE9TRF9PU0RXSU4wTUQpOworCQlvc2Rfd3JpdGUoc2QsIGxjb25maWctPmxpbmVfbGVuZ3RoID4+IDUsIE9TRF9PU0RXSU4wT0ZTVCk7CisJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eHBvcywgT1NEX09TRFdJTjBYUCk7CisJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eHNpemUsIE9TRF9PU0RXSU4wWEwpOworCQlpZiAobGNvbmZpZy0+aW50ZXJsYWNlZCkgeworCQkJb3NkX3dyaXRlKHNkLCBsY29uZmlnLT55cG9zID4+IDEsIE9TRF9PU0RXSU4wWVApOworCQkJb3NkX3dyaXRlKHNkLCBsY29uZmlnLT55c2l6ZSA+PiAxLCBPU0RfT1NEV0lOMFlMKTsKKwkJfSBlbHNlIHsKKwkJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eXBvcywgT1NEX09TRFdJTjBZUCk7CisJCQlvc2Rfd3JpdGUoc2QsIGxjb25maWctPnlzaXplLCBPU0RfT1NEV0lOMFlMKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFdJTl9WSUQwOgorCQl3aW5tZF9tYXNrIHw9IE9TRF9WSURXSU5NRF9WRkYwOworCQlpZiAobGNvbmZpZy0+aW50ZXJsYWNlZCkKKwkJCXdpbm1kIHw9IE9TRF9WSURXSU5NRF9WRkYwOworCisJCW9zZF9tb2RpZnkoc2QsIHdpbm1kX21hc2ssIHdpbm1kLCBPU0RfVklEV0lOTUQpOworCQlvc2Rfd3JpdGUoc2QsIGxjb25maWctPmxpbmVfbGVuZ3RoID4+IDUsIE9TRF9WSURXSU4wT0ZTVCk7CisJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eHBvcywgT1NEX1ZJRFdJTjBYUCk7CisJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eHNpemUsIE9TRF9WSURXSU4wWEwpOworCQkvKgorCQkgKiBGb3IgWVVWNDIwUCBmb3JtYXQgdGhlIHJlZ2lzdGVyIGNvbnRlbnRzIGFyZQorCQkgKiBkdXBsaWNhdGVkIGluIGJvdGggVklEIHJlZ2lzdGVycworCQkgKi8KKwkJaWYgKGxjb25maWctPmludGVybGFjZWQpIHsKKwkJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eXBvcyA+PiAxLCBPU0RfVklEV0lOMFlQKTsKKwkJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eXNpemUgPj4gMSwgT1NEX1ZJRFdJTjBZTCk7CisJCX0gZWxzZSB7CisJCQlvc2Rfd3JpdGUoc2QsIGxjb25maWctPnlwb3MsIE9TRF9WSURXSU4wWVApOworCQkJb3NkX3dyaXRlKHNkLCBsY29uZmlnLT55c2l6ZSwgT1NEX1ZJRFdJTjBZTCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBXSU5fT1NEMToKKwkJLyoKKwkJICogVGhlIGNhbGxlciBtdXN0IGVuc3VyZSB0aGF0IE9TRDEgaXMgZGlzYWJsZWQgcHJpb3IgdG8KKwkJICogc3dpdGNoaW5nIGZyb20gYSBub3JtYWwgbW9kZSB0byBhdHRyaWJ1dGUgbW9kZSBvciBmcm9tCisJCSAqIGF0dHJpYnV0ZSBtb2RlIHRvIGEgbm9ybWFsIG1vZGUuCisJCSAqLworCQlpZiAobGNvbmZpZy0+cGl4Zm10ID09IFBJWEZNVF9PU0RfQVRUUikgeworCQkJd2lubWRfbWFzayB8PQorCQkJICAgIE9TRF9PU0RXSU4xTURfQVROMUUgfCBPU0RfT1NEV0lOMU1EX1JHQjFFIHwKKwkJCSAgICBPU0RfT1NEV0lOMU1EX0NMVVRTMSB8CisJCQkgICAgT1NEX09TRFdJTjFNRF9CTE5EMSB8IE9TRF9PU0RXSU4xTURfVEUxOworCQl9IGVsc2UgeworCQkJd2lubWRfbWFzayB8PSBPU0RfT1NEV0lOMU1EX1JHQjFFOworCQkJaWYgKGxjb25maWctPnBpeGZtdCA9PSBQSVhGTVRfUkdCNTY1KQorCQkJCXdpbm1kIHw9IE9TRF9PU0RXSU4xTURfUkdCMUU7CisKKwkJCXdpbm1kX21hc2sgfD0gT1NEX09TRFdJTjFNRF9CTVcxOworCQkJc3dpdGNoIChsY29uZmlnLT5waXhmbXQpIHsKKwkJCWNhc2UgUElYRk1UXzFCUFA6CisJCQkJYm13ID0gMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgUElYRk1UXzJCUFA6CisJCQkJYm13ID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUElYRk1UXzRCUFA6CisJCQkJYm13ID0gMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgUElYRk1UXzhCUFA6CisJCQkJYm13ID0gMzsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCQl3aW5tZCB8PSAoYm13IDw8IE9TRF9PU0RXSU4xTURfQk1XMV9TSElGVCk7CisJCX0KKworCQl3aW5tZF9tYXNrIHw9IE9TRF9PU0RXSU4xTURfT0ZGMTsKKwkJaWYgKGxjb25maWctPmludGVybGFjZWQpCisJCQl3aW5tZCB8PSBPU0RfT1NEV0lOMU1EX09GRjE7CisKKwkJb3NkX21vZGlmeShzZCwgd2lubWRfbWFzaywgd2lubWQsIE9TRF9PU0RXSU4xTUQpOworCQlvc2Rfd3JpdGUoc2QsIGxjb25maWctPmxpbmVfbGVuZ3RoID4+IDUsIE9TRF9PU0RXSU4xT0ZTVCk7CisJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eHBvcywgT1NEX09TRFdJTjFYUCk7CisJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eHNpemUsIE9TRF9PU0RXSU4xWEwpOworCQlpZiAobGNvbmZpZy0+aW50ZXJsYWNlZCkgeworCQkJb3NkX3dyaXRlKHNkLCBsY29uZmlnLT55cG9zID4+IDEsIE9TRF9PU0RXSU4xWVApOworCQkJb3NkX3dyaXRlKHNkLCBsY29uZmlnLT55c2l6ZSA+PiAxLCBPU0RfT1NEV0lOMVlMKTsKKwkJfSBlbHNlIHsKKwkJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eXBvcywgT1NEX09TRFdJTjFZUCk7CisJCQlvc2Rfd3JpdGUoc2QsIGxjb25maWctPnlzaXplLCBPU0RfT1NEV0lOMVlMKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFdJTl9WSUQxOgorCQl3aW5tZF9tYXNrIHw9IE9TRF9WSURXSU5NRF9WRkYxOworCQlpZiAobGNvbmZpZy0+aW50ZXJsYWNlZCkKKwkJCXdpbm1kIHw9IE9TRF9WSURXSU5NRF9WRkYxOworCisJCW9zZF9tb2RpZnkoc2QsIHdpbm1kX21hc2ssIHdpbm1kLCBPU0RfVklEV0lOTUQpOworCQlvc2Rfd3JpdGUoc2QsIGxjb25maWctPmxpbmVfbGVuZ3RoID4+IDUsIE9TRF9WSURXSU4xT0ZTVCk7CisJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eHBvcywgT1NEX1ZJRFdJTjFYUCk7CisJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eHNpemUsIE9TRF9WSURXSU4xWEwpOworCQkvKgorCQkgKiBGb3IgWVVWNDIwUCBmb3JtYXQgdGhlIHJlZ2lzdGVyIGNvbnRlbnRzIGFyZQorCQkgKiBkdXBsaWNhdGVkIGluIGJvdGggVklEIHJlZ2lzdGVycworCQkgKi8KKwkJb3NkX21vZGlmeShzZCwgT1NEX01JU0NDVExfUzQyMEQsIH5PU0RfTUlTQ0NUTF9TNDIwRCwKKwkJCSAgIE9TRF9NSVNDQ1RMKTsKKworCQlpZiAobGNvbmZpZy0+aW50ZXJsYWNlZCkgeworCQkJb3NkX3dyaXRlKHNkLCBsY29uZmlnLT55cG9zID4+IDEsIE9TRF9WSURXSU4xWVApOworCQkJb3NkX3dyaXRlKHNkLCBsY29uZmlnLT55c2l6ZSA+PiAxLCBPU0RfVklEV0lOMVlMKTsKKwkJfSBlbHNlIHsKKwkJCW9zZF93cml0ZShzZCwgbGNvbmZpZy0+eXBvcywgT1NEX1ZJRFdJTjFZUCk7CisJCQlvc2Rfd3JpdGUoc2QsIGxjb25maWctPnlzaXplLCBPU0RfVklEV0lOMVlMKTsKKwkJfQorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgb3NkX3NldF9sYXllcl9jb25maWcoc3RydWN0IG9zZF9zdGF0ZSAqc2QsIGVudW0gb3NkX2xheWVyIGxheWVyLAorCQkJCXN0cnVjdCBvc2RfbGF5ZXJfY29uZmlnICpsY29uZmlnKQoreworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZCA9IHNkOworCXN0cnVjdCBvc2Rfd2luZG93X3N0YXRlICp3aW4gPSAmb3NkLT53aW5bbGF5ZXJdOworCXN0cnVjdCBvc2RfbGF5ZXJfY29uZmlnICpjZmcgPSAmd2luLT5sY29uZmlnOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJlamVjdF9jb25maWc7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb3NkLT5sb2NrLCBmbGFncyk7CisKKwlyZWplY3RfY29uZmlnID0gdHJ5X2xheWVyX2NvbmZpZyhzZCwgbGF5ZXIsIGxjb25maWcpOworCWlmIChyZWplY3RfY29uZmlnKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9zZC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcmVqZWN0X2NvbmZpZzsKKwl9CisKKwkvKiB1cGRhdGUgdGhlIGN1cnJlbnQgQ2IvQ3Igb3JkZXIgKi8KKwlpZiAoaXNfeWNfcGl4Zm10KGxjb25maWctPnBpeGZtdCkpCisJCW9zZC0+eWNfcGl4Zm10ID0gbGNvbmZpZy0+cGl4Zm10OworCisJLyoKKwkgKiBJZiB3ZSBhcmUgc3dpdGNoaW5nIE9TRDEgZnJvbSBub3JtYWwgbW9kZSB0byBhdHRyaWJ1dGUgbW9kZSBvciBmcm9tCisJICogYXR0cmlidXRlIG1vZGUgdG8gbm9ybWFsIG1vZGUsIHRoZW4gd2UgbXVzdCBkaXNhYmxlIHRoZSB3aW5kb3cuCisJICovCisJaWYgKGxheWVyID09IFdJTl9PU0QxKSB7CisJCWlmICgoKGxjb25maWctPnBpeGZtdCA9PSBQSVhGTVRfT1NEX0FUVFIpICYmCisJCSAgKGNmZy0+cGl4Zm10ICE9IFBJWEZNVF9PU0RfQVRUUikpIHx8CisJCSAgKChsY29uZmlnLT5waXhmbXQgIT0gUElYRk1UX09TRF9BVFRSKSAmJgorCQkgIChjZmctPnBpeGZtdCA9PSBQSVhGTVRfT1NEX0FUVFIpKSkgeworCQkJd2luLT5pc19lbmFibGVkID0gMDsKKwkJCV9vc2RfZGlzYWJsZV9sYXllcihzZCwgbGF5ZXIpOworCQl9CisJfQorCisJX29zZF9zZXRfbGF5ZXJfY29uZmlnKHNkLCBsYXllciwgbGNvbmZpZyk7CisKKwlpZiAobGF5ZXIgPT0gV0lOX09TRDEpIHsKKwkJc3RydWN0IG9zZF9vc2R3aW5fc3RhdGUgKm9zZHdpbl9zdGF0ZSA9CisJCSAgICAmb3NkLT5vc2R3aW5bT1NEV0lOX09TRDFdOworCisJCWlmICgobGNvbmZpZy0+cGl4Zm10ICE9IFBJWEZNVF9PU0RfQVRUUikgJiYKKwkJICAoY2ZnLT5waXhmbXQgPT0gUElYRk1UX09TRF9BVFRSKSkgeworCQkJLyoKKwkJCSAqIFdlIGp1c3Qgc3dpdGNoZWQgT1NEMSBmcm9tIGF0dHJpYnV0ZSBtb2RlIHRvIG5vcm1hbAorCQkJICogbW9kZSwgc28gd2UgbXVzdCBpbml0aWFsaXplIHRoZSBDTFVUIHNlbGVjdCwgdGhlCisJCQkgKiBibGVuZCBmYWN0b3IsIHRyYW5zcGFyZW5jeSBjb2xvcmtleSBlbmFibGUsIGFuZAorCQkJICogYXR0ZW51YXRpb24gZW5hYmxlIChETTY0NDYgb25seSkgYml0cyBpbiB0aGUKKwkJCSAqIE9TRFdJTjFNRCByZWdpc3Rlci4KKwkJCSAqLworCQkJX29zZF9zZXRfb3NkX2NsdXQoc2QsIE9TRFdJTl9PU0QxLAorCQkJCQkJICAgb3Nkd2luX3N0YXRlLT5jbHV0KTsKKwkJCV9vc2Rfc2V0X2JsZW5kaW5nX2ZhY3RvcihzZCwgT1NEV0lOX09TRDEsCisJCQkJCQkJICBvc2R3aW5fc3RhdGUtPmJsZW5kKTsKKwkJCWlmIChvc2R3aW5fc3RhdGUtPmNvbG9ya2V5X2JsZW5kaW5nKSB7CisJCQkJX29zZF9lbmFibGVfY29sb3Jfa2V5KHNkLCBPU0RXSU5fT1NEMSwKKwkJCQkJCQkgICAgICAgb3Nkd2luX3N0YXRlLT4KKwkJCQkJCQkgICAgICAgY29sb3JrZXksCisJCQkJCQkJICAgICAgIGxjb25maWctPnBpeGZtdCk7CisJCQl9IGVsc2UKKwkJCQlfb3NkX2Rpc2FibGVfY29sb3Jfa2V5KHNkLCBPU0RXSU5fT1NEMSk7CisJCQlfb3NkX3NldF9yZWM2MDFfYXR0ZW51YXRpb24oc2QsIE9TRFdJTl9PU0QxLAorCQkJCQkJICAgIG9zZHdpbl9zdGF0ZS0+CisJCQkJCQkgICAgcmVjNjAxX2F0dGVudWF0aW9uKTsKKwkJfSBlbHNlIGlmICgobGNvbmZpZy0+cGl4Zm10ID09IFBJWEZNVF9PU0RfQVRUUikgJiYKKwkJICAoY2ZnLT5waXhmbXQgIT0gUElYRk1UX09TRF9BVFRSKSkgeworCQkJLyoKKwkJCSAqIFdlIGp1c3Qgc3dpdGNoZWQgT1NEMSBmcm9tIG5vcm1hbCBtb2RlIHRvIGF0dHJpYnV0ZQorCQkJICogbW9kZSwgc28gd2UgbXVzdCBpbml0aWFsaXplIHRoZSBibGluayBlbmFibGUgYW5kCisJCQkgKiBibGluayBpbnRlcnZhbCBiaXRzIGluIHRoZSBPU0RBVFJNRCByZWdpc3Rlci4KKwkJCSAqLworCQkJX29zZF9zZXRfYmxpbmtfYXR0cmlidXRlKHNkLCBvc2QtPmlzX2JsaW5raW5nLAorCQkJCQkJCSAgb3NkLT5ibGluayk7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIHdlIGp1c3Qgc3dpdGNoZWQgdG8gYSAxLSwgMi0sIG9yIDQtYml0cy1wZXItcGl4ZWwgYml0bWFwIGZvcm1hdAorCSAqIHRoZW4gY29uZmlndXJlIGEgZGVmYXVsdCBwYWxldHRlIG1hcC4KKwkgKi8KKwlpZiAoKGxjb25maWctPnBpeGZtdCAhPSBjZmctPnBpeGZtdCkgJiYKKwkgICgobGNvbmZpZy0+cGl4Zm10ID09IFBJWEZNVF8xQlBQKSB8fAorCSAgKGxjb25maWctPnBpeGZtdCA9PSBQSVhGTVRfMkJQUCkgfHwKKwkgIChsY29uZmlnLT5waXhmbXQgPT0gUElYRk1UXzRCUFApKSkgeworCQllbnVtIG9zZF93aW5fbGF5ZXIgb3Nkd2luID0KKwkJICAgICgobGF5ZXIgPT0gV0lOX09TRDApID8gT1NEV0lOX09TRDAgOiBPU0RXSU5fT1NEMSk7CisJCXN0cnVjdCBvc2Rfb3Nkd2luX3N0YXRlICpvc2R3aW5fc3RhdGUgPQorCQkgICAgJm9zZC0+b3Nkd2luW29zZHdpbl07CisJCXVuc2lnbmVkIGNoYXIgY2x1dF9pbmRleDsKKwkJdW5zaWduZWQgY2hhciBjbHV0X2VudHJpZXMgPSAwOworCisJCXN3aXRjaCAobGNvbmZpZy0+cGl4Zm10KSB7CisJCWNhc2UgUElYRk1UXzFCUFA6CisJCQljbHV0X2VudHJpZXMgPSAyOworCQkJYnJlYWs7CisJCWNhc2UgUElYRk1UXzJCUFA6CisJCQljbHV0X2VudHJpZXMgPSA0OworCQkJYnJlYWs7CisJCWNhc2UgUElYRk1UXzRCUFA6CisJCQljbHV0X2VudHJpZXMgPSAxNjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJLyoKKwkJICogVGhlIGRlZmF1bHQgcGFsZXR0ZSBtYXAgbWFwcyB0aGUgcGl4ZWwgdmFsdWUgdG8gdGhlIGNsdXQKKwkJICogaW5kZXgsIGkuZS4gcGl4ZWwgdmFsdWUgMCBtYXBzIHRvIGNsdXQgZW50cnkgMCwgcGl4ZWwgdmFsdWUKKwkJICogMSBtYXBzIHRvIGNsdXQgZW50cnkgMSwgZXRjLgorCQkgKi8KKwkJZm9yIChjbHV0X2luZGV4ID0gMDsgY2x1dF9pbmRleCA8IDE2OyBjbHV0X2luZGV4KyspIHsKKwkJCW9zZHdpbl9zdGF0ZS0+cGFsZXR0ZV9tYXBbY2x1dF9pbmRleF0gPSBjbHV0X2luZGV4OworCQkJaWYgKGNsdXRfaW5kZXggPCBjbHV0X2VudHJpZXMpIHsKKwkJCQlfb3NkX3NldF9wYWxldHRlX21hcChzZCwgb3Nkd2luLCBjbHV0X2luZGV4LAorCQkJCQkJICAgICBjbHV0X2luZGV4LAorCQkJCQkJICAgICBsY29uZmlnLT5waXhmbXQpOworCQkJfQorCQl9CisJfQorCisJKmNmZyA9ICpsY29uZmlnOworCS8qIERNNjQ0NjogY29uZmlndXJlIHRoZSBSR0I4ODggZW5hYmxlIGFuZCB3aW5kb3cgc2VsZWN0aW9uICovCisJaWYgKG9zZC0+d2luW1dJTl9WSUQwXS5sY29uZmlnLnBpeGZtdCA9PSBQSVhGTVRfUkdCODg4KQorCQlfb3NkX2VuYWJsZV92aWRfcmdiODg4KHNkLCBXSU5fVklEMCk7CisJZWxzZSBpZiAob3NkLT53aW5bV0lOX1ZJRDFdLmxjb25maWcucGl4Zm10ID09IFBJWEZNVF9SR0I4ODgpCisJCV9vc2RfZW5hYmxlX3ZpZF9yZ2I4ODgoc2QsIFdJTl9WSUQxKTsKKwllbHNlCisJCV9vc2RfZGlzYWJsZV92aWRfcmdiODg4KHNkKTsKKworCWlmIChsYXllciA9PSBXSU5fVklEMCkgeworCQlvc2QtPnBpbmdwb25nID0KKwkJICAgIF9vc2RfZG02NDQ2X3ZpZDBfcGluZ3Bvbmcoc2QsIG9zZC0+ZmllbGRfaW52ZXJzaW9uLAorCQkJCQkJICAgICAgIHdpbi0+ZmJfYmFzZV9waHlzLAorCQkJCQkJICAgICAgIGNmZyk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3NkLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgb3NkX2luaXRfbGF5ZXIoc3RydWN0IG9zZF9zdGF0ZSAqc2QsIGVudW0gb3NkX2xheWVyIGxheWVyKQoreworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZCA9IHNkOworCXN0cnVjdCBvc2Rfd2luZG93X3N0YXRlICp3aW4gPSAmb3NkLT53aW5bbGF5ZXJdOworCWVudW0gb3NkX3dpbl9sYXllciBvc2R3aW47CisJc3RydWN0IG9zZF9vc2R3aW5fc3RhdGUgKm9zZHdpbl9zdGF0ZTsKKwlzdHJ1Y3Qgb3NkX2xheWVyX2NvbmZpZyAqY2ZnID0gJndpbi0+bGNvbmZpZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm9zZC0+bG9jaywgZmxhZ3MpOworCisJd2luLT5pc19lbmFibGVkID0gMDsKKwlfb3NkX2Rpc2FibGVfbGF5ZXIoc2QsIGxheWVyKTsKKworCXdpbi0+aF96b29tID0gWk9PTV9YMTsKKwl3aW4tPnZfem9vbSA9IFpPT01fWDE7CisJX29zZF9zZXRfem9vbShzZCwgbGF5ZXIsIHdpbi0+aF96b29tLCB3aW4tPnZfem9vbSk7CisKKwl3aW4tPmZiX2Jhc2VfcGh5cyA9IDA7CisJX29zZF9zdGFydF9sYXllcihzZCwgbGF5ZXIsIHdpbi0+ZmJfYmFzZV9waHlzLCAwKTsKKworCWNmZy0+bGluZV9sZW5ndGggPSAwOworCWNmZy0+eHNpemUgPSAwOworCWNmZy0+eXNpemUgPSAwOworCWNmZy0+eHBvcyA9IDA7CisJY2ZnLT55cG9zID0gMDsKKwljZmctPmludGVybGFjZWQgPSAwOworCXN3aXRjaCAobGF5ZXIpIHsKKwljYXNlIFdJTl9PU0QwOgorCWNhc2UgV0lOX09TRDE6CisJCW9zZHdpbiA9IChsYXllciA9PSBXSU5fT1NEMCkgPyBPU0RXSU5fT1NEMCA6IE9TRFdJTl9PU0QxOworCQlvc2R3aW5fc3RhdGUgPSAmb3NkLT5vc2R3aW5bb3Nkd2luXTsKKwkJLyoKKwkJICogT3RoZXIgY29kZSByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCBPU0Qgd2luZG93cyBkZWZhdWx0IHRvIGEKKwkJICogYml0bWFwIHBpeGVsIGZvcm1hdCB3aGVuIHRoZXkgYXJlIGRlYWxsb2NhdGVkLCBzbyBkb24ndAorCQkgKiBjaGFuZ2UgdGhpcyBkZWZhdWx0IHBpeGVsIGZvcm1hdC4KKwkJICovCisJCWNmZy0+cGl4Zm10ID0gUElYRk1UXzhCUFA7CisJCV9vc2Rfc2V0X2xheWVyX2NvbmZpZyhzZCwgbGF5ZXIsIGNmZyk7CisJCW9zZHdpbl9zdGF0ZS0+Y2x1dCA9IFJBTV9DTFVUOworCQlfb3NkX3NldF9vc2RfY2x1dChzZCwgb3Nkd2luLCBvc2R3aW5fc3RhdGUtPmNsdXQpOworCQlvc2R3aW5fc3RhdGUtPmNvbG9ya2V5X2JsZW5kaW5nID0gMDsKKwkJX29zZF9kaXNhYmxlX2NvbG9yX2tleShzZCwgb3Nkd2luKTsKKwkJb3Nkd2luX3N0YXRlLT5ibGVuZCA9IE9TRF84X1ZJRF8wOworCQlfb3NkX3NldF9ibGVuZGluZ19mYWN0b3Ioc2QsIG9zZHdpbiwgb3Nkd2luX3N0YXRlLT5ibGVuZCk7CisJCW9zZHdpbl9zdGF0ZS0+cmVjNjAxX2F0dGVudWF0aW9uID0gMDsKKwkJX29zZF9zZXRfcmVjNjAxX2F0dGVudWF0aW9uKHNkLCBvc2R3aW4sCisJCQkJCQkgICAgIG9zZHdpbl9zdGF0ZS0+CisJCQkJCQkgICAgIHJlYzYwMV9hdHRlbnVhdGlvbik7CisJCWlmIChvc2R3aW4gPT0gT1NEV0lOX09TRDEpIHsKKwkJCW9zZC0+aXNfYmxpbmtpbmcgPSAwOworCQkJb3NkLT5ibGluayA9IEJMSU5LX1gxOworCQl9CisJCWJyZWFrOworCWNhc2UgV0lOX1ZJRDA6CisJY2FzZSBXSU5fVklEMToKKwkJY2ZnLT5waXhmbXQgPSBvc2QtPnljX3BpeGZtdDsKKwkJX29zZF9zZXRfbGF5ZXJfY29uZmlnKHNkLCBsYXllciwgY2ZnKTsKKwkJYnJlYWs7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3NkLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIG9zZF9yZWxlYXNlX2xheWVyKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCBlbnVtIG9zZF9sYXllciBsYXllcikKK3sKKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2QgPSBzZDsKKwlzdHJ1Y3Qgb3NkX3dpbmRvd19zdGF0ZSAqd2luID0gJm9zZC0+d2luW2xheWVyXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm9zZC0+bG9jaywgZmxhZ3MpOworCisJaWYgKCF3aW4tPmlzX2FsbG9jYXRlZCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvc2QtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9zZC0+bG9jaywgZmxhZ3MpOworCW9zZF9pbml0X2xheWVyKHNkLCBsYXllcik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm9zZC0+bG9jaywgZmxhZ3MpOworCisJd2luLT5pc19hbGxvY2F0ZWQgPSAwOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3NkLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgb3NkX3JlcXVlc3RfbGF5ZXIoc3RydWN0IG9zZF9zdGF0ZSAqc2QsIGVudW0gb3NkX2xheWVyIGxheWVyKQoreworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZCA9IHNkOworCXN0cnVjdCBvc2Rfd2luZG93X3N0YXRlICp3aW4gPSAmb3NkLT53aW5bbGF5ZXJdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmb3NkLT5sb2NrLCBmbGFncyk7CisKKwlpZiAod2luLT5pc19hbGxvY2F0ZWQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3NkLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtMTsKKwl9CisJd2luLT5pc19hbGxvY2F0ZWQgPSAxOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3NkLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX29zZF9pbml0KHN0cnVjdCBvc2Rfc3RhdGUgKnNkKQoreworCW9zZF93cml0ZShzZCwgMCwgT1NEX01PREUpOworCW9zZF93cml0ZShzZCwgMCwgT1NEX1ZJRFdJTk1EKTsKKwlvc2Rfd3JpdGUoc2QsIDAsIE9TRF9PU0RXSU4wTUQpOworCW9zZF93cml0ZShzZCwgMCwgT1NEX09TRFdJTjFNRCk7CisJb3NkX3dyaXRlKHNkLCAwLCBPU0RfUkVDVENVUik7CisJb3NkX3dyaXRlKHNkLCAwLCBPU0RfTUlTQ0NUTCk7Cit9CisKK3N0YXRpYyB2b2lkIG9zZF9zZXRfbGVmdF9tYXJnaW4oc3RydWN0IG9zZF9zdGF0ZSAqc2QsIHUzMiB2YWwpCit7CisJb3NkX3dyaXRlKHNkLCB2YWwsIE9TRF9CQVNFUFgpOworfQorCitzdGF0aWMgdm9pZCBvc2Rfc2V0X3RvcF9tYXJnaW4oc3RydWN0IG9zZF9zdGF0ZSAqc2QsIHUzMiB2YWwpCit7CisJb3NkX3dyaXRlKHNkLCB2YWwsIE9TRF9CQVNFUFkpOworfQorCitzdGF0aWMgaW50IG9zZF9pbml0aWFsaXplKHN0cnVjdCBvc2Rfc3RhdGUgKm9zZCkKK3sKKwlpZiAob3NkID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCV9vc2RfaW5pdChvc2QpOworCisJLyogc2V0IGRlZmF1bHQgQ2IvQ3Igb3JkZXIgKi8KKwlvc2QtPnljX3BpeGZtdCA9IFBJWEZNVF9ZQ2JDckk7CisKKwlfb3NkX3NldF9maWVsZF9pbnZlcnNpb24ob3NkLCBvc2QtPmZpZWxkX2ludmVyc2lvbik7CisJX29zZF9zZXRfcm9tX2NsdXQob3NkLCBvc2QtPnJvbV9jbHV0KTsKKworCW9zZF9pbml0X2xheWVyKG9zZCwgV0lOX09TRDApOworCW9zZF9pbml0X2xheWVyKG9zZCwgV0lOX1ZJRDApOworCW9zZF9pbml0X2xheWVyKG9zZCwgV0lOX09TRDEpOworCW9zZF9pbml0X2xheWVyKG9zZCwgV0lOX1ZJRDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdnBiZV9vc2Rfb3BzIG9zZF9vcHMgPSB7CisJLmluaXRpYWxpemUgPSBvc2RfaW5pdGlhbGl6ZSwKKwkucmVxdWVzdF9sYXllciA9IG9zZF9yZXF1ZXN0X2xheWVyLAorCS5yZWxlYXNlX2xheWVyID0gb3NkX3JlbGVhc2VfbGF5ZXIsCisJLmVuYWJsZV9sYXllciA9IG9zZF9lbmFibGVfbGF5ZXIsCisJLmRpc2FibGVfbGF5ZXIgPSBvc2RfZGlzYWJsZV9sYXllciwKKwkuc2V0X2xheWVyX2NvbmZpZyA9IG9zZF9zZXRfbGF5ZXJfY29uZmlnLAorCS5nZXRfbGF5ZXJfY29uZmlnID0gb3NkX2dldF9sYXllcl9jb25maWcsCisJLnN0YXJ0X2xheWVyID0gb3NkX3N0YXJ0X2xheWVyLAorCS5zZXRfbGVmdF9tYXJnaW4gPSBvc2Rfc2V0X2xlZnRfbWFyZ2luLAorCS5zZXRfdG9wX21hcmdpbiA9IG9zZF9zZXRfdG9wX21hcmdpbiwKK307CisKK3N0YXRpYyBpbnQgb3NkX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG9zZF9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2Q7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IHJldCA9IDA7CisKKwlvc2QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgb3NkX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKG9zZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW9zZC0+ZGV2ID0gJnBkZXYtPmRldjsKKwlwZGF0YSA9IChzdHJ1Y3Qgb3NkX3BsYXRmb3JtX2RhdGEgKilwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlvc2QtPnZwYmVfdHlwZSA9IChlbnVtIHZwYmVfdmVyc2lvbilwZGF0YS0+dnBiZV90eXBlOworCWlmIChOVUxMID09IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKSB7CisJCWRldl9lcnIob3NkLT5kZXYsICJObyBwbGF0Zm9ybSBkYXRhIGRlZmluZWQgZm9yIE9TRCIKKwkJCSIgc3ViIGRldmljZVxuIik7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gZnJlZV9tZW07CisJfQorCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykgeworCQlkZXZfZXJyKG9zZC0+ZGV2LCAiVW5hYmxlIHRvIGdldCBPU0QgcmVnaXN0ZXIgYWRkcmVzcyBtYXBcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGZyZWVfbWVtOworCX0KKwlvc2QtPm9zZF9iYXNlX3BoeXMgPSByZXMtPnN0YXJ0OworCW9zZC0+b3NkX3NpemUgPSByZXMtPmVuZCAtIHJlcy0+c3RhcnQgKyAxOworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKG9zZC0+b3NkX2Jhc2VfcGh5cywgb3NkLT5vc2Rfc2l6ZSwKKwkJCQlNT0RVTEVfTkFNRSkpIHsKKwkJZGV2X2Vycihvc2QtPmRldiwgIlVuYWJsZSB0byByZXNlcnZlIE9TRCBNTUlPIHJlZ2lvblxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZnJlZV9tZW07CisJfQorCW9zZC0+b3NkX2Jhc2UgPSAodW5zaWduZWQgbG9uZylpb3JlbWFwX25vY2FjaGUocmVzLT5zdGFydCwKKwkJCQkJCQlvc2QtPm9zZF9zaXplKTsKKwlpZiAoIW9zZC0+b3NkX2Jhc2UpIHsKKwkJZGV2X2Vycihvc2QtPmRldiwgIlVuYWJsZSB0byBtYXAgdGhlIE9TRCByZWdpb25cbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIHJlbGVhc2VfbWVtX3JlZ2lvbjsKKwl9CisJc3Bpbl9sb2NrX2luaXQoJm9zZC0+bG9jayk7CisJb3NkLT5vcHMgPSBvc2Rfb3BzOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG9zZCk7CisJZGV2X25vdGljZShvc2QtPmRldiwgIk9TRCBzdWIgZGV2aWNlIHByb2JlIHN1Y2Nlc3NcbiIpOworCXJldHVybiByZXQ7CisKK3JlbGVhc2VfbWVtX3JlZ2lvbjoKKwlyZWxlYXNlX21lbV9yZWdpb24ob3NkLT5vc2RfYmFzZV9waHlzLCBvc2QtPm9zZF9zaXplKTsKK2ZyZWVfbWVtOgorCWtmcmVlKG9zZCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvc2RfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG9zZF9zdGF0ZSAqb3NkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpb3VubWFwKCh2b2lkICopb3NkLT5vc2RfYmFzZSk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKG9zZC0+b3NkX2Jhc2VfcGh5cywgb3NkLT5vc2Rfc2l6ZSk7CisJa2ZyZWUob3NkKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb3NkX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gb3NkX3Byb2JlLAorCS5yZW1vdmUJCT0gb3NkX3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSBNT0RVTEVfTkFNRSwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgb3NkX2luaXQodm9pZCkKK3sKKwlpZiAocGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZvc2RfZHJpdmVyKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byByZWdpc3RlciBkYXZpbmNpIG9zZCBkcml2ZXJcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgb3NkX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmb3NkX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KG9zZF9pbml0KTsKK21vZHVsZV9leGl0KG9zZF9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEYVZpbmNpIE9TRCBNYW5hZ2VyIERyaXZlciIpOworTU9EVUxFX0FVVEhPUigiVGV4YXMgSW5zdHJ1bWVudHMiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGJlX29zZF9yZWdzLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBiZV9vc2RfcmVncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NDUyMGYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBiZV9vc2RfcmVncy5oCkBAIC0wLDAgKzEsMzY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMTAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaWZuZGVmIF9WUEJFX09TRF9SRUdTX0gKKyNkZWZpbmUgX1ZQQkVfT1NEX1JFR1NfSAorCisvKiBWUEJFIEdsb2JhbCBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgVlBCRV9QSUQJCQkJMHgwCisjZGVmaW5lIFZQQkVfUENSCQkJCTB4NAorCisvKiBWUFNTIENMb2NrIFJlZ2lzdGVycyAqLworI2RlZmluZSBWUFNTQ0xLX1BJRAkJCQkweDAwCisjZGVmaW5lIFZQU1NDTEtfQ0xLQ1RSTAkJCQkweDA0CisKKy8qIFZQU1MgQnVmZmVyIExvZ2ljIFJlZ2lzdGVycyAqLworI2RlZmluZSBWUFNTQkxfUElECQkJCTB4MDAKKyNkZWZpbmUgVlBTU0JMX1BDUgkJCQkweDA0CisjZGVmaW5lIFZQU1NCTF9CQ1IJCQkJMHgwOAorI2RlZmluZSBWUFNTQkxfSU5UU1RBVAkJCQkweDBDCisjZGVmaW5lIFZQU1NCTF9JTlRTRUwJCQkJMHgxMAorI2RlZmluZSBWUFNTQkxfRVZUU0VMCQkJCTB4MTQKKyNkZWZpbmUgVlBTU0JMX01FTUNUUkwJCQkJMHgxOAorI2RlZmluZSBWUFNTQkxfQ0NEQ01VWAkJCQkweDFDCisKKy8qIERNMzY1IElTUDUgc3lzdGVtIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgSVNQNV9QSUQJCQkJMHgwCisjZGVmaW5lIElTUDVfUENDUgkJCQkweDQKKyNkZWZpbmUgSVNQNV9CQ1IJCQkJMHg4CisjZGVmaW5lIElTUDVfSU5UU1RBVAkJCQkweEMKKyNkZWZpbmUgSVNQNV9JTlRTRUwxCQkJCTB4MTAKKyNkZWZpbmUgSVNQNV9JTlRTRUwyCQkJCTB4MTQKKyNkZWZpbmUgSVNQNV9JTlRTRUwzCQkJCTB4MTgKKyNkZWZpbmUgSVNQNV9FVlRTRUwJCQkJMHgxYworI2RlZmluZSBJU1A1X0NDRENNVVgJCQkJMHgyMAorCisvKiBWUEJFIE9uLVNjcmVlbiBEaXNwbGF5IFN1YnN5c3RlbSBSZWdpc3RlcnMgKE9TRCkgKi8KKyNkZWZpbmUgT1NEX01PREUJCQkJMHgwMAorI2RlZmluZSBPU0RfVklEV0lOTUQJCQkJMHgwNAorI2RlZmluZSBPU0RfT1NEV0lOME1ECQkJCTB4MDgKKyNkZWZpbmUgT1NEX09TRFdJTjFNRAkJCQkweDBDCisjZGVmaW5lIE9TRF9PU0RBVFJNRAkJCQkweDBDCisjZGVmaW5lIE9TRF9SRUNUQ1VSCQkJCTB4MTAKKyNkZWZpbmUgT1NEX1ZJRFdJTjBPRlNUCQkJCTB4MTgKKyNkZWZpbmUgT1NEX1ZJRFdJTjFPRlNUCQkJCTB4MUMKKyNkZWZpbmUgT1NEX09TRFdJTjBPRlNUCQkJCTB4MjAKKyNkZWZpbmUgT1NEX09TRFdJTjFPRlNUCQkJCTB4MjQKKyNkZWZpbmUgT1NEX1ZJRFdJTkFESAkJCQkweDI4CisjZGVmaW5lIE9TRF9WSURXSU4wQURMCQkJCTB4MkMKKyNkZWZpbmUgT1NEX1ZJRFdJTjBBRFIJCQkJMHgyQworI2RlZmluZSBPU0RfVklEV0lOMUFETAkJCQkweDMwCisjZGVmaW5lIE9TRF9WSURXSU4xQURSCQkJCTB4MzAKKyNkZWZpbmUgT1NEX09TRFdJTkFESAkJCQkweDM0CisjZGVmaW5lIE9TRF9PU0RXSU4wQURMCQkJCTB4MzgKKyNkZWZpbmUgT1NEX09TRFdJTjBBRFIJCQkJMHgzOAorI2RlZmluZSBPU0RfT1NEV0lOMUFETAkJCQkweDNDCisjZGVmaW5lIE9TRF9PU0RXSU4xQURSCQkJCTB4M0MKKyNkZWZpbmUgT1NEX0JBU0VQWAkJCQkweDQwCisjZGVmaW5lIE9TRF9CQVNFUFkJCQkJMHg0NAorI2RlZmluZSBPU0RfVklEV0lOMFhQCQkJCTB4NDgKKyNkZWZpbmUgT1NEX1ZJRFdJTjBZUAkJCQkweDRDCisjZGVmaW5lIE9TRF9WSURXSU4wWEwJCQkJMHg1MAorI2RlZmluZSBPU0RfVklEV0lOMFlMCQkJCTB4NTQKKyNkZWZpbmUgT1NEX1ZJRFdJTjFYUAkJCQkweDU4CisjZGVmaW5lIE9TRF9WSURXSU4xWVAJCQkJMHg1QworI2RlZmluZSBPU0RfVklEV0lOMVhMCQkJCTB4NjAKKyNkZWZpbmUgT1NEX1ZJRFdJTjFZTAkJCQkweDY0CisjZGVmaW5lIE9TRF9PU0RXSU4wWFAJCQkJMHg2OAorI2RlZmluZSBPU0RfT1NEV0lOMFlQCQkJCTB4NkMKKyNkZWZpbmUgT1NEX09TRFdJTjBYTAkJCQkweDcwCisjZGVmaW5lIE9TRF9PU0RXSU4wWUwJCQkJMHg3NAorI2RlZmluZSBPU0RfT1NEV0lOMVhQCQkJCTB4NzgKKyNkZWZpbmUgT1NEX09TRFdJTjFZUAkJCQkweDdDCisjZGVmaW5lIE9TRF9PU0RXSU4xWEwJCQkJMHg4MAorI2RlZmluZSBPU0RfT1NEV0lOMVlMCQkJCTB4ODQKKyNkZWZpbmUgT1NEX0NVUlhQCQkJCTB4ODgKKyNkZWZpbmUgT1NEX0NVUllQCQkJCTB4OEMKKyNkZWZpbmUgT1NEX0NVUlhMCQkJCTB4OTAKKyNkZWZpbmUgT1NEX0NVUllMCQkJCTB4OTQKKyNkZWZpbmUgT1NEX1cwQk1QMDEJCQkJMHhBMAorI2RlZmluZSBPU0RfVzBCTVAyMwkJCQkweEE0CisjZGVmaW5lIE9TRF9XMEJNUDQ1CQkJCTB4QTgKKyNkZWZpbmUgT1NEX1cwQk1QNjcJCQkJMHhBQworI2RlZmluZSBPU0RfVzBCTVA4OQkJCQkweEIwCisjZGVmaW5lIE9TRF9XMEJNUEFCCQkJCTB4QjQKKyNkZWZpbmUgT1NEX1cwQk1QQ0QJCQkJMHhCOAorI2RlZmluZSBPU0RfVzBCTVBFRgkJCQkweEJDCisjZGVmaW5lIE9TRF9XMUJNUDAxCQkJCTB4QzAKKyNkZWZpbmUgT1NEX1cxQk1QMjMJCQkJMHhDNAorI2RlZmluZSBPU0RfVzFCTVA0NQkJCQkweEM4CisjZGVmaW5lIE9TRF9XMUJNUDY3CQkJCTB4Q0MKKyNkZWZpbmUgT1NEX1cxQk1QODkJCQkJMHhEMAorI2RlZmluZSBPU0RfVzFCTVBBQgkJCQkweEQ0CisjZGVmaW5lIE9TRF9XMUJNUENECQkJCTB4RDgKKyNkZWZpbmUgT1NEX1cxQk1QRUYJCQkJMHhEQworI2RlZmluZSBPU0RfVkJORFJZCQkJCTB4RTAKKyNkZWZpbmUgT1NEX0VYVE1PREUJCQkJMHhFNAorI2RlZmluZSBPU0RfTUlTQ0NUTAkJCQkweEU4CisjZGVmaW5lIE9TRF9DTFVUUkFNWUNCCQkJCTB4RUMKKyNkZWZpbmUgT1NEX0NMVVRSQU1DUgkJCQkweEYwCisjZGVmaW5lIE9TRF9UUkFOU1BWQUwJCQkJMHhGNAorI2RlZmluZSBPU0RfVFJBTlNQVkFMTAkJCQkweEY0CisjZGVmaW5lIE9TRF9UUkFOU1BWQUxVCQkJCTB4RjgKKyNkZWZpbmUgT1NEX1RSQU5TUEJNUElEWAkJCTB4RkMKKyNkZWZpbmUgT1NEX1BQVldJTjBBRFIJCQkJMHhGQworCisvKiBiaXQgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgVlBCRV9QQ1JfVkVOQ19ESVYJCQkoMSA8PCAxKQorI2RlZmluZSBWUEJFX1BDUl9DTEtfT0ZGCQkJKDEgPDwgMCkKKworI2RlZmluZSBWUFNTQkxfSU5UU1RBVF9IU1NJSU5UCQkJKDEgPDwgMTQpCisjZGVmaW5lIFZQU1NCTF9JTlRTVEFUX0NGQUxESU5UCQkJKDEgPDwgMTMpCisjZGVmaW5lIFZQU1NCTF9JTlRTVEFUX0lQSVBFX0lOVDUJCSgxIDw8IDEyKQorI2RlZmluZSBWUFNTQkxfSU5UU1RBVF9JUElQRV9JTlQ0CQkoMSA8PCAxMSkKKyNkZWZpbmUgVlBTU0JMX0lOVFNUQVRfSVBJUEVfSU5UMwkJKDEgPDwgMTApCisjZGVmaW5lIFZQU1NCTF9JTlRTVEFUX0lQSVBFX0lOVDIJCSgxIDw8IDkpCisjZGVmaW5lIFZQU1NCTF9JTlRTVEFUX0lQSVBFX0lOVDEJCSgxIDw8IDgpCisjZGVmaW5lIFZQU1NCTF9JTlRTVEFUX0lQSVBFX0lOVDAJCSgxIDw8IDcpCisjZGVmaW5lIFZQU1NCTF9JTlRTVEFUX0lQSVBFSUZJTlQJCSgxIDw8IDYpCisjZGVmaW5lIFZQU1NCTF9JTlRTVEFUX09TRElOVAkJCSgxIDw8IDUpCisjZGVmaW5lIFZQU1NCTF9JTlRTVEFUX1ZFTkNJTlQJCQkoMSA8PCA0KQorI2RlZmluZSBWUFNTQkxfSU5UU1RBVF9IM0FJTlQJCQkoMSA8PCAzKQorI2RlZmluZSBWUFNTQkxfSU5UU1RBVF9DQ0RDX1ZESU5UMgkJKDEgPDwgMikKKyNkZWZpbmUgVlBTU0JMX0lOVFNUQVRfQ0NEQ19WRElOVDEJCSgxIDw8IDEpCisjZGVmaW5lIFZQU1NCTF9JTlRTVEFUX0NDRENfVkRJTlQwCQkoMSA8PCAwKQorCisvKiBETTM2NSBJU1A1IGJpdCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBJU1A1X0lOVFNUQVRfVkVOQ0lOVAkJCSgxIDw8IDIxKQorI2RlZmluZSBJU1A1X0lOVFNUQVRfT1NESU5UCQkJKDEgPDwgMjApCisKKy8qIFZNT0QgVFZUWVAgb3B0aW9ucyBmb3IgSERNRD0wICovCisjZGVmaW5lIFNEVFZfTlRTQwkJCQkwCisjZGVmaW5lIFNEVFZfUEFMCQkJCTEKKy8qIFZNT0QgVFZUWVAgb3B0aW9ucyBmb3IgSERNRD0xICovCisjZGVmaW5lIEhEVFZfNTI1UAkJCQkwCisjZGVmaW5lIEhEVFZfNjI1UAkJCQkxCisjZGVmaW5lIEhEVFZfMTA4MEkJCQkJMgorI2RlZmluZSBIRFRWXzcyMFAJCQkJMworCisjZGVmaW5lIE9TRF9NT0RFX0NTCQkJCSgxIDw8IDE1KQorI2RlZmluZSBPU0RfTU9ERV9PVlJTWgkJCQkoMSA8PCAxNCkKKyNkZWZpbmUgT1NEX01PREVfT0hSU1oJCQkJKDEgPDwgMTMpCisjZGVmaW5lIE9TRF9NT0RFX0VGCQkJCSgxIDw8IDEyKQorI2RlZmluZSBPU0RfTU9ERV9WVlJTWgkJCQkoMSA8PCAxMSkKKyNkZWZpbmUgT1NEX01PREVfVkhSU1oJCQkJKDEgPDwgMTApCisjZGVmaW5lIE9TRF9NT0RFX0ZTSU5WCQkJCSgxIDw8IDkpCisjZGVmaW5lIE9TRF9NT0RFX0JDTFVUCQkJCSgxIDw8IDgpCisjZGVmaW5lIE9TRF9NT0RFX0NBQkdfU0hJRlQJCQkwCisjZGVmaW5lIE9TRF9NT0RFX0NBQkcJCQkJKDB4ZmYgPDwgMCkKKworI2RlZmluZSBPU0RfVklEV0lOTURfVkZJTlYJCQkoMSA8PCAxNSkKKyNkZWZpbmUgT1NEX1ZJRFdJTk1EX1YxRUZDCQkJKDEgPDwgMTQpCisjZGVmaW5lIE9TRF9WSURXSU5NRF9WSFoxX1NISUZUCQkJMTIKKyNkZWZpbmUgT1NEX1ZJRFdJTk1EX1ZIWjEJCQkoMyA8PCAxMikKKyNkZWZpbmUgT1NEX1ZJRFdJTk1EX1ZWWjFfU0hJRlQJCQkxMAorI2RlZmluZSBPU0RfVklEV0lOTURfVlZaMQkJCSgzIDw8IDEwKQorI2RlZmluZSBPU0RfVklEV0lOTURfVkZGMQkJCSgxIDw8IDkpCisjZGVmaW5lIE9TRF9WSURXSU5NRF9BQ1QxCQkJKDEgPDwgOCkKKyNkZWZpbmUgT1NEX1ZJRFdJTk1EX1YwRUZDCQkJKDEgPDwgNikKKyNkZWZpbmUgT1NEX1ZJRFdJTk1EX1ZIWjBfU0hJRlQJCQk0CisjZGVmaW5lIE9TRF9WSURXSU5NRF9WSFowCQkJKDMgPDwgNCkKKyNkZWZpbmUgT1NEX1ZJRFdJTk1EX1ZWWjBfU0hJRlQJCQkyCisjZGVmaW5lIE9TRF9WSURXSU5NRF9WVlowCQkJKDMgPDwgMikKKyNkZWZpbmUgT1NEX1ZJRFdJTk1EX1ZGRjAJCQkoMSA8PCAxKQorI2RlZmluZSBPU0RfVklEV0lOTURfQUNUMAkJCSgxIDw8IDApCisKKyNkZWZpbmUgT1NEX09TRFdJTjBNRF9BVE4wRQkJCSgxIDw8IDE0KQorI2RlZmluZSBPU0RfT1NEV0lOME1EX1JHQjBFCQkJKDEgPDwgMTMpCisjZGVmaW5lIE9TRF9PU0RXSU4wTURfQk1QME1EX1NISUZUCQkxMworI2RlZmluZSBPU0RfT1NEV0lOME1EX0JNUDBNRAkJCSgzIDw8IDEzKQorI2RlZmluZSBPU0RfT1NEV0lOME1EX0NMVVRTMAkJCSgxIDw8IDEyKQorI2RlZmluZSBPU0RfT1NEV0lOME1EX09IWjBfU0hJRlQJCTEwCisjZGVmaW5lIE9TRF9PU0RXSU4wTURfT0haMAkJCSgzIDw8IDEwKQorI2RlZmluZSBPU0RfT1NEV0lOME1EX09WWjBfU0hJRlQJCTgKKyNkZWZpbmUgT1NEX09TRFdJTjBNRF9PVlowCQkJKDMgPDwgOCkKKyNkZWZpbmUgT1NEX09TRFdJTjBNRF9CTVcwX1NISUZUCQk2CisjZGVmaW5lIE9TRF9PU0RXSU4wTURfQk1XMAkJCSgzIDw8IDYpCisjZGVmaW5lIE9TRF9PU0RXSU4wTURfQkxORDBfU0hJRlQJCTMKKyNkZWZpbmUgT1NEX09TRFdJTjBNRF9CTE5EMAkJCSg3IDw8IDMpCisjZGVmaW5lIE9TRF9PU0RXSU4wTURfVEUwCQkJKDEgPDwgMikKKyNkZWZpbmUgT1NEX09TRFdJTjBNRF9PRkYwCQkJKDEgPDwgMSkKKyNkZWZpbmUgT1NEX09TRFdJTjBNRF9PQUNUMAkJCSgxIDw8IDApCisKKyNkZWZpbmUgT1NEX09TRFdJTjFNRF9PQVNXCQkJKDEgPDwgMTUpCisjZGVmaW5lIE9TRF9PU0RXSU4xTURfQVROMUUJCQkoMSA8PCAxNCkKKyNkZWZpbmUgT1NEX09TRFdJTjFNRF9SR0IxRQkJCSgxIDw8IDEzKQorI2RlZmluZSBPU0RfT1NEV0lOMU1EX0JNUDFNRF9TSElGVAkJMTMKKyNkZWZpbmUgT1NEX09TRFdJTjFNRF9CTVAxTUQJCQkoMyA8PCAxMykKKyNkZWZpbmUgT1NEX09TRFdJTjFNRF9DTFVUUzEJCQkoMSA8PCAxMikKKyNkZWZpbmUgT1NEX09TRFdJTjFNRF9PSFoxX1NISUZUCQkxMAorI2RlZmluZSBPU0RfT1NEV0lOMU1EX09IWjEJCQkoMyA8PCAxMCkKKyNkZWZpbmUgT1NEX09TRFdJTjFNRF9PVloxX1NISUZUCQk4CisjZGVmaW5lIE9TRF9PU0RXSU4xTURfT1ZaMQkJCSgzIDw8IDgpCisjZGVmaW5lIE9TRF9PU0RXSU4xTURfQk1XMV9TSElGVAkJNgorI2RlZmluZSBPU0RfT1NEV0lOMU1EX0JNVzEJCQkoMyA8PCA2KQorI2RlZmluZSBPU0RfT1NEV0lOMU1EX0JMTkQxX1NISUZUCQkzCisjZGVmaW5lIE9TRF9PU0RXSU4xTURfQkxORDEJCQkoNyA8PCAzKQorI2RlZmluZSBPU0RfT1NEV0lOMU1EX1RFMQkJCSgxIDw8IDIpCisjZGVmaW5lIE9TRF9PU0RXSU4xTURfT0ZGMQkJCSgxIDw8IDEpCisjZGVmaW5lIE9TRF9PU0RXSU4xTURfT0FDVDEJCQkoMSA8PCAwKQorCisjZGVmaW5lIE9TRF9PU0RBVFJNRF9PQVNXCQkJKDEgPDwgMTUpCisjZGVmaW5lIE9TRF9PU0RBVFJNRF9PSFpBX1NISUZUCQkJMTAKKyNkZWZpbmUgT1NEX09TREFUUk1EX09IWkEJCQkoMyA8PCAxMCkKKyNkZWZpbmUgT1NEX09TREFUUk1EX09WWkFfU0hJRlQJCQk4CisjZGVmaW5lIE9TRF9PU0RBVFJNRF9PVlpBCQkJKDMgPDwgOCkKKyNkZWZpbmUgT1NEX09TREFUUk1EX0JMTktJTlRfU0hJRlQJCTYKKyNkZWZpbmUgT1NEX09TREFUUk1EX0JMTktJTlQJCQkoMyA8PCA2KQorI2RlZmluZSBPU0RfT1NEQVRSTURfT0ZGQQkJCSgxIDw8IDEpCisjZGVmaW5lIE9TRF9PU0RBVFJNRF9CTE5LCQkJKDEgPDwgMCkKKworI2RlZmluZSBPU0RfUkVDVENVUl9SQ0FEX1NISUZUCQkJOAorI2RlZmluZSBPU0RfUkVDVENVUl9SQ0FECQkJKDB4ZmYgPDwgOCkKKyNkZWZpbmUgT1NEX1JFQ1RDVVJfQ0xVVFNSCQkJKDEgPDwgNykKKyNkZWZpbmUgT1NEX1JFQ1RDVVJfUkNIV19TSElGVAkJCTQKKyNkZWZpbmUgT1NEX1JFQ1RDVVJfUkNIVwkJCSg3IDw8IDQpCisjZGVmaW5lIE9TRF9SRUNUQ1VSX1JDVldfU0hJRlQJCQkxCisjZGVmaW5lIE9TRF9SRUNUQ1VSX1JDVlcJCQkoNyA8PCAxKQorI2RlZmluZSBPU0RfUkVDVENVUl9SQ0FDVAkJCSgxIDw8IDApCisKKyNkZWZpbmUgT1NEX1ZJRFdJTjBPRlNUX1YwTE8JCQkoMHgxZmYgPDwgMCkKKworI2RlZmluZSBPU0RfVklEV0lOMU9GU1RfVjFMTwkJCSgweDFmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9PU0RXSU4wT0ZTVF9PMExPCQkJKDB4MWZmIDw8IDApCisKKyNkZWZpbmUgT1NEX09TRFdJTjFPRlNUX08xTE8JCQkoMHgxZmYgPDwgMCkKKworI2RlZmluZSBPU0RfV0lOT0ZTVF9BSF9TSElGVAkJCTkKKworI2RlZmluZSBPU0RfVklEV0lOME9GU1RfVjBBSAkJCSgweGYgPDwgOSkKKyNkZWZpbmUgT1NEX1ZJRFdJTjFPRlNUX1YxQUgJCQkoMHhmIDw8IDkpCisjZGVmaW5lIE9TRF9PU0RXSU4wT0ZTVF9PMEFICQkJKDB4ZiA8PCA5KQorI2RlZmluZSBPU0RfT1NEV0lOMU9GU1RfTzFBSAkJCSgweGYgPDwgOSkKKworI2RlZmluZSBPU0RfVklEV0lOQURIX1YxQUhfU0hJRlQJCTgKKyNkZWZpbmUgT1NEX1ZJRFdJTkFESF9WMUFICQkJKDB4N2YgPDwgOCkKKyNkZWZpbmUgT1NEX1ZJRFdJTkFESF9WMEFIX1NISUZUCQkwCisjZGVmaW5lIE9TRF9WSURXSU5BREhfVjBBSAkJCSgweDdmIDw8IDApCisKKyNkZWZpbmUgT1NEX1ZJRFdJTjBBRExfVjBBTAkJCSgweGZmZmYgPDwgMCkKKworI2RlZmluZSBPU0RfVklEV0lOMUFETF9WMUFMCQkJKDB4ZmZmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9PU0RXSU5BREhfTzFBSF9TSElGVAkJOAorI2RlZmluZSBPU0RfT1NEV0lOQURIX08xQUgJCQkoMHg3ZiA8PCA4KQorI2RlZmluZSBPU0RfT1NEV0lOQURIX08wQUhfU0hJRlQJCTAKKyNkZWZpbmUgT1NEX09TRFdJTkFESF9PMEFICQkJKDB4N2YgPDwgMCkKKworI2RlZmluZSBPU0RfT1NEV0lOMEFETF9PMEFMCQkJKDB4ZmZmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9PU0RXSU4xQURMX08xQUwJCQkoMHhmZmZmIDw8IDApCisKKyNkZWZpbmUgT1NEX0JBU0VQWF9CUFgJCQkJKDB4M2ZmIDw8IDApCisKKyNkZWZpbmUgT1NEX0JBU0VQWV9CUFkJCQkJKDB4MWZmIDw8IDApCisKKyNkZWZpbmUgT1NEX1ZJRFdJTjBYUF9WMFgJCQkoMHg3ZmYgPDwgMCkKKworI2RlZmluZSBPU0RfVklEV0lOMFlQX1YwWQkJCSgweDdmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9WSURXSU4wWExfVjBXCQkJKDB4N2ZmIDw8IDApCisKKyNkZWZpbmUgT1NEX1ZJRFdJTjBZTF9WMEgJCQkoMHg3ZmYgPDwgMCkKKworI2RlZmluZSBPU0RfVklEV0lOMVhQX1YxWAkJCSgweDdmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9WSURXSU4xWVBfVjFZCQkJKDB4N2ZmIDw8IDApCisKKyNkZWZpbmUgT1NEX1ZJRFdJTjFYTF9WMVcJCQkoMHg3ZmYgPDwgMCkKKworI2RlZmluZSBPU0RfVklEV0lOMVlMX1YxSAkJCSgweDdmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9PU0RXSU4wWFBfVzBYCQkJKDB4N2ZmIDw8IDApCisKKyNkZWZpbmUgT1NEX09TRFdJTjBZUF9XMFkJCQkoMHg3ZmYgPDwgMCkKKworI2RlZmluZSBPU0RfT1NEV0lOMFhMX1cwVwkJCSgweDdmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9PU0RXSU4wWUxfVzBICQkJKDB4N2ZmIDw8IDApCisKKyNkZWZpbmUgT1NEX09TRFdJTjFYUF9XMVgJCQkoMHg3ZmYgPDwgMCkKKworI2RlZmluZSBPU0RfT1NEV0lOMVlQX1cxWQkJCSgweDdmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9PU0RXSU4xWExfVzFXCQkJKDB4N2ZmIDw8IDApCisKKyNkZWZpbmUgT1NEX09TRFdJTjFZTF9XMUgJCQkoMHg3ZmYgPDwgMCkKKworI2RlZmluZSBPU0RfQ1VSWFBfUkNTWAkJCQkoMHg3ZmYgPDwgMCkKKworI2RlZmluZSBPU0RfQ1VSWVBfUkNTWQkJCQkoMHg3ZmYgPDwgMCkKKworI2RlZmluZSBPU0RfQ1VSWExfUkNTVwkJCQkoMHg3ZmYgPDwgMCkKKworI2RlZmluZSBPU0RfQ1VSWUxfUkNTSAkJCQkoMHg3ZmYgPDwgMCkKKworI2RlZmluZSBPU0RfRVhUTU9ERV9FWFBNRFNFTAkJCSgxIDw8IDE1KQorI2RlZmluZSBPU0RfRVhUTU9ERV9TQ1JOSEVYUF9TSElGVAkJMTMKKyNkZWZpbmUgT1NEX0VYVE1PREVfU0NSTkhFWFAJCQkoMyA8PCAxMykKKyNkZWZpbmUgT1NEX0VYVE1PREVfU0NSTlZFWFAJCQkoMSA8PCAxMikKKyNkZWZpbmUgT1NEX0VYVE1PREVfT1NEMUJMRENIUgkJCSgxIDw8IDExKQorI2RlZmluZSBPU0RfRVhUTU9ERV9PU0QwQkxEQ0hSCQkJKDEgPDwgMTApCisjZGVmaW5lIE9TRF9FWFRNT0RFX0FUTk9TRDFFTgkJCSgxIDw8IDkpCisjZGVmaW5lIE9TRF9FWFRNT0RFX0FUTk9TRDBFTgkJCSgxIDw8IDgpCisjZGVmaW5lIE9TRF9FWFRNT0RFX09TREhSU1oxNQkJCSgxIDw8IDcpCisjZGVmaW5lIE9TRF9FWFRNT0RFX1ZJREhSU1oxNQkJCSgxIDw8IDYpCisjZGVmaW5lIE9TRF9FWFRNT0RFX1pNRklMVjFIRU4JCQkoMSA8PCA1KQorI2RlZmluZSBPU0RfRVhUTU9ERV9aTUZJTFYxVkVOCQkJKDEgPDwgNCkKKyNkZWZpbmUgT1NEX0VYVE1PREVfWk1GSUxWMEhFTgkJCSgxIDw8IDMpCisjZGVmaW5lIE9TRF9FWFRNT0RFX1pNRklMVjBWRU4JCQkoMSA8PCAyKQorI2RlZmluZSBPU0RfRVhUTU9ERV9FWFBGSUxIRU4JCQkoMSA8PCAxKQorI2RlZmluZSBPU0RfRVhUTU9ERV9FWFBGSUxWRU4JCQkoMSA8PCAwKQorCisjZGVmaW5lIE9TRF9NSVNDQ1RMX0JMRFNFTAkJCSgxIDw8IDE1KQorI2RlZmluZSBPU0RfTUlTQ0NUTF9TNDIwRAkJCSgxIDw8IDE0KQorI2RlZmluZSBPU0RfTUlTQ0NUTF9CTUFQVAkJCSgxIDw8IDEzKQorI2RlZmluZSBPU0RfTUlTQ0NUTF9ETTM2NU0JCQkoMSA8PCAxMikKKyNkZWZpbmUgT1NEX01JU0NDVExfUkdCRU4JCQkoMSA8PCA3KQorI2RlZmluZSBPU0RfTUlTQ0NUTF9SR0JXSU4JCQkoMSA8PCA2KQorI2RlZmluZSBPU0RfTUlTQ0NUTF9ETUFORwkJCSgxIDw8IDYpCisjZGVmaW5lIE9TRF9NSVNDQ1RMX1RNT04JCQkoMSA8PCA1KQorI2RlZmluZSBPU0RfTUlTQ0NUTF9SU0VMCQkJKDEgPDwgNCkKKyNkZWZpbmUgT1NEX01JU0NDVExfQ1BCU1kJCQkoMSA8PCAzKQorI2RlZmluZSBPU0RfTUlTQ0NUTF9QUFNXCQkJKDEgPDwgMikKKyNkZWZpbmUgT1NEX01JU0NDVExfUFBSVgkJCSgxIDw8IDEpCisKKyNkZWZpbmUgT1NEX0NMVVRSQU1ZQ0JfWV9TSElGVAkJCTgKKyNkZWZpbmUgT1NEX0NMVVRSQU1ZQ0JfWQkJCSgweGZmIDw8IDgpCisjZGVmaW5lIE9TRF9DTFVUUkFNWUNCX0NCX1NISUZUCQkJMAorI2RlZmluZSBPU0RfQ0xVVFJBTVlDQl9DQgkJCSgweGZmIDw8IDApCisKKyNkZWZpbmUgT1NEX0NMVVRSQU1DUl9DUl9TSElGVAkJCTgKKyNkZWZpbmUgT1NEX0NMVVRSQU1DUl9DUgkJCSgweGZmIDw8IDgpCisjZGVmaW5lIE9TRF9DTFVUUkFNQ1JfQ0FERFJfU0hJRlQJCTAKKyNkZWZpbmUgT1NEX0NMVVRSQU1DUl9DQUREUgkJCSgweGZmIDw8IDApCisKKyNkZWZpbmUgT1NEX1RSQU5TUFZBTF9SR0JUUkFOUwkJCSgweGZmZmYgPDwgMCkKKworI2RlZmluZSBPU0RfVFJBTlNQVkFMTF9SR0JMCQkJKDB4ZmZmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9UUkFOU1BWQUxVX1lfU0hJRlQJCQk4CisjZGVmaW5lIE9TRF9UUkFOU1BWQUxVX1kJCQkoMHhmZiA8PCA4KQorI2RlZmluZSBPU0RfVFJBTlNQVkFMVV9SR0JVX1NISUZUCQkwCisjZGVmaW5lIE9TRF9UUkFOU1BWQUxVX1JHQlUJCQkoMHhmZiA8PCAwKQorCisjZGVmaW5lIE9TRF9UUkFOU1BCTVBJRFhfQk1QMV9TSElGVAkJOAorI2RlZmluZSBPU0RfVFJBTlNQQk1QSURYX0JNUDEJCQkoMHhmZiA8PCA4KQorI2RlZmluZSBPU0RfVFJBTlNQQk1QSURYX0JNUDBfU0hJRlQJCTAKKyNkZWZpbmUgT1NEX1RSQU5TUEJNUElEWF9CTVAwCQkJMHhmZgorCisjZW5kaWYJCQkJLyogX0RBVklOQ0lfVlBCRV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfdmVuYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfdmVuYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYTNlNWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBiZV92ZW5jLmMKQEAgLTAsMCArMSw1NjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8bWFjaC9tdXguaD4KKyNpbmNsdWRlIDxtYWNoL2lvLmg+CisjaW5jbHVkZSA8bWFjaC9pMmMuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3ZwYmVfdHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3ZwYmVfdmVuYy5oPgorI2luY2x1ZGUgPG1lZGlhL2RhdmluY2kvdnBzcy5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CisKKyNpbmNsdWRlICJ2cGJlX3ZlbmNfcmVncy5oIgorCisjZGVmaW5lIE1PRFVMRV9OQU1FCVZQQkVfVkVOQ19TVUJERVZfTkFNRQorCitzdGF0aWMgaW50IGRlYnVnID0gMjsKK21vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBsZXZlbCAwLTIiKTsKKworc3RydWN0IHZlbmNfc3RhdGUgeworCXN0cnVjdCB2NGwyX3N1YmRldiBzZDsKKwlzdHJ1Y3QgdmVuY19jYWxsYmFjayAqY2FsbGJhY2s7CisJc3RydWN0IHZlbmNfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisJc3RydWN0IGRldmljZSAqcGRldjsKKwl1MzIgb3V0cHV0OworCXY0bDJfc3RkX2lkIHN0ZDsKKwlzcGlubG9ja190IGxvY2s7CisJdm9pZCBfX2lvbWVtICp2ZW5jX2Jhc2U7CisJdm9pZCBfX2lvbWVtICp2ZGFjY2ZnX3JlZzsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHZlbmNfc3RhdGUgKnRvX3N0YXRlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IHZlbmNfc3RhdGUsIHNkKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgdmVuY19yZWFkKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiBvZmZzZXQpCit7CisJc3RydWN0IHZlbmNfc3RhdGUgKnZlbmMgPSB0b19zdGF0ZShzZCk7CisKKwlyZXR1cm4gcmVhZGwodmVuYy0+dmVuY19iYXNlICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB1MzIgdmVuY193cml0ZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB1MzIgb2Zmc2V0LCB1MzIgdmFsKQoreworCXN0cnVjdCB2ZW5jX3N0YXRlICp2ZW5jID0gdG9fc3RhdGUoc2QpOworCisJd3JpdGVsKHZhbCwgKHZlbmMtPnZlbmNfYmFzZSArIG9mZnNldCkpOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSB1MzIgdmVuY19tb2RpZnkoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTMyIG9mZnNldCwKKwkJCQkgdTMyIHZhbCwgdTMyIG1hc2spCit7CisJdTMyIG5ld192YWwgPSAodmVuY19yZWFkKHNkLCBvZmZzZXQpICYgfm1hc2spIHwgKHZhbCAmIG1hc2spOworCisJdmVuY193cml0ZShzZCwgb2Zmc2V0LCBuZXdfdmFsKTsKKworCXJldHVybiBuZXdfdmFsOworfQorCitzdGF0aWMgaW5saW5lIHUzMiB2ZGFjY2ZnX3dyaXRlKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiB2YWwpCit7CisJc3RydWN0IHZlbmNfc3RhdGUgKnZlbmMgPSB0b19zdGF0ZShzZCk7CisKKwl3cml0ZWwodmFsLCB2ZW5jLT52ZGFjY2ZnX3JlZyk7CisKKwl2YWwgPSByZWFkbCh2ZW5jLT52ZGFjY2ZnX3JlZyk7CisKKwlyZXR1cm4gdmFsOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHNldHMgdGhlIGRhYyBvZiB0aGUgVlBCRSBmb3IgdmFyaW91cyBvdXRwdXRzCisgKi8KK3N0YXRpYyBpbnQgdmVuY19zZXRfZGFjKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiBvdXRfaW5kZXgpCit7CisJc3dpdGNoIChvdXRfaW5kZXgpIHsKKwljYXNlIDA6CisJCXY0bDJfZGJnKGRlYnVnLCAxLCBzZCwgIlNldHRpbmcgb3V0cHV0IHRvIENvbXBvc2l0ZVxuIik7CisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfREFDU0VMLCAwKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQl2NGwyX2RiZyhkZWJ1ZywgMSwgc2QsICJTZXR0aW5nIG91dHB1dCB0byBTLVZpZGVvXG4iKTsKKwkJdmVuY193cml0ZShzZCwgVkVOQ19EQUNTRUwsIDB4MjEwKTsKKwkJYnJlYWs7CisJY2FzZSAgMjoKKwkJdmVuY193cml0ZShzZCwgVkVOQ19EQUNTRUwsIDB4NTQzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZlbmNfZW5hYmxlZGlnaXRhbG91dHB1dChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgYmVuYWJsZSkKK3sKKwl2NGwyX2RiZyhkZWJ1ZywgMiwgc2QsICJ2ZW5jX2VuYWJsZWRpZ2l0YWxvdXRwdXRcbiIpOworCisJaWYgKGJlbmFibGUpIHsKKwkJdmVuY193cml0ZShzZCwgVkVOQ19WTU9ELCAwKTsKKwkJdmVuY193cml0ZShzZCwgVkVOQ19DVkJTLCAwKTsKKwkJdmVuY193cml0ZShzZCwgVkVOQ19MQ0RPVVQsIDApOworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX0hTUExTLCAwKTsKKwkJdmVuY193cml0ZShzZCwgVkVOQ19IU1RBUlQsIDApOworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX0hWQUxJRCwgMCk7CisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfSElOVCwgMCk7CisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfVlNQTFMsIDApOworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX1ZTVEFSVCwgMCk7CisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfVlZBTElELCAwKTsKKwkJdmVuY193cml0ZShzZCwgVkVOQ19WSU5ULCAwKTsKKwkJdmVuY193cml0ZShzZCwgVkVOQ19ZQ0NDVEwsIDApOworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX0RBQ1NFTCwgMCk7CisKKwl9IGVsc2UgeworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX1ZNT0QsIDApOworCQkvKiBkaXNhYmxlIFZDTEsgb3V0cHV0IHBpbiBlbmFibGUgKi8KKwkJdmVuY193cml0ZShzZCwgVkVOQ19WSURDVEwsIDB4MTQxKTsKKworCQkvKiBEaXNhYmxlIG91dHB1dCBzeW5jIHBpbnMgKi8KKwkJdmVuY193cml0ZShzZCwgVkVOQ19TWU5DQ1RMLCAwKTsKKworCQkvKiBEaXNhYmxlIERDTE9DSyAqLworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX0RDTEtDVEwsIDApOworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX0RSR0JYMSwgMHgwMDAwMDU3Qyk7CisKKwkJLyogRGlzYWJsZSBMQ0Qgb3V0cHV0IGNvbnRyb2wgKGFjY2VwdGluZyBkZWZhdWx0IHBvbGFyaXR5KSAqLworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX0xDRE9VVCwgMCk7CisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfQ01QTlQsIDB4MTAwKTsKKwkJdmVuY193cml0ZShzZCwgVkVOQ19IU1BMUywgMCk7CisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfSElOVCwgMCk7CisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfSFNUQVJULCAwKTsKKwkJdmVuY193cml0ZShzZCwgVkVOQ19IVkFMSUQsIDApOworCisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfVlNQTFMsIDApOworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX1ZJTlQsIDApOworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX1ZTVEFSVCwgMCk7CisJCXZlbmNfd3JpdGUoc2QsIFZFTkNfVlZBTElELCAwKTsKKworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX0hTRExZLCAwKTsKKwkJdmVuY193cml0ZShzZCwgVkVOQ19WU0RMWSwgMCk7CisKKwkJdmVuY193cml0ZShzZCwgVkVOQ19ZQ0NDVEwsIDApOworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX1ZTVEFSVEEsIDApOworCisJCS8qIFNldCBPU0QgY2xvY2sgYW5kIE9TRCBTeW5jIEFkYXZhbmNlIHJlZ2lzdGVycyAqLworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX09TRENMSzAsIDEpOworCQl2ZW5jX3dyaXRlKHNkLCBWRU5DX09TRENMSzEsIDIpOworCX0KK30KKworLyoKKyAqIHNldHRpbmcgTlRTQyBtb2RlCisgKi8KK3N0YXRpYyBpbnQgdmVuY19zZXRfbnRzYyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXN0cnVjdCB2ZW5jX3N0YXRlICp2ZW5jID0gdG9fc3RhdGUoc2QpOworCXN0cnVjdCB2ZW5jX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gdmVuYy0+cGRhdGE7CisKKwl2NGwyX2RiZyhkZWJ1ZywgMiwgc2QsICJ2ZW5jX3NldF9udHNjXG4iKTsKKworCS8qIFNldHVwIGNsb2NrIGF0IFZQU1MgJiBWRU5DIGZvciBTRCAqLworCXZwc3NfZW5hYmxlX2Nsb2NrKFZQU1NfVkVOQ19DTE9DS19TRUwsIDEpOworCWlmIChwZGF0YS0+c2V0dXBfY2xvY2soVlBCRV9FTkNfU1RELCBWNEwyX1NURF81MjVfNjApIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2ZW5jX2VuYWJsZWRpZ2l0YWxvdXRwdXQoc2QsIDApOworCisJLyogdG8gc2V0IFZFTkMgQ0xLIERJViB0byAxIC0gZmluYWwgY2xvY2sgaXMgNTQgTUh6ICovCisJdmVuY19tb2RpZnkoc2QsIFZFTkNfVklEQ1RMLCAwLCAxIDw8IDEpOworCS8qIFNldCBSRUM2NTYgTW9kZSAqLworCXZlbmNfd3JpdGUoc2QsIFZFTkNfWUNDQ1RMLCAweDEpOworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZEUFJPLCAwLCBWRU5DX1ZEUFJPX0RBRlJRKTsKKwl2ZW5jX21vZGlmeShzZCwgVkVOQ19WRFBSTywgMCwgVkVOQ19WRFBST19EQVVQUyk7CisKKwl2ZW5jX3dyaXRlKHNkLCBWRU5DX1ZNT0QsIDApOworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZNT0QsICgxIDw8IFZFTkNfVk1PRF9WSUVfU0hJRlQpLAorCQkJVkVOQ19WTU9EX1ZJRSk7CisJdmVuY19tb2RpZnkoc2QsIFZFTkNfVk1PRCwgKDAgPDwgVkVOQ19WTU9EX1ZNRCksIFZFTkNfVk1PRF9WTUQpOworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZNT0QsICgwIDw8IFZFTkNfVk1PRF9UVlRZUF9TSElGVCksCisJCQlWRU5DX1ZNT0RfVFZUWVApOworCXZlbmNfd3JpdGUoc2QsIFZFTkNfREFDVFNULCAweDApOworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZNT0QsIFZFTkNfVk1PRF9WRU5DLCBWRU5DX1ZNT0RfVkVOQyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHNldHRpbmcgUEFMIG1vZGUKKyAqLworc3RhdGljIGludCB2ZW5jX3NldF9wYWwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCkKK3sKKwlzdHJ1Y3QgdmVuY19zdGF0ZSAqdmVuYyA9IHRvX3N0YXRlKHNkKTsKKworCXY0bDJfZGJnKGRlYnVnLCAyLCBzZCwgInZlbmNfc2V0X3BhbFxuIik7CisKKwkvKiBTZXR1cCBjbG9jayBhdCBWUFNTICYgVkVOQyBmb3IgU0QgKi8KKwl2cHNzX2VuYWJsZV9jbG9jayhWUFNTX1ZFTkNfQ0xPQ0tfU0VMLCAxKTsKKwlpZiAodmVuYy0+cGRhdGEtPnNldHVwX2Nsb2NrKFZQQkVfRU5DX1NURCwgVjRMMl9TVERfNjI1XzUwKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJdmVuY19lbmFibGVkaWdpdGFsb3V0cHV0KHNkLCAwKTsKKworCS8qIHRvIHNldCBWRU5DIENMSyBESVYgdG8gMSAtIGZpbmFsIGNsb2NrIGlzIDU0IE1IeiAqLworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZJRENUTCwgMCwgMSA8PCAxKTsKKwkvKiBTZXQgUkVDNjU2IE1vZGUgKi8KKwl2ZW5jX3dyaXRlKHNkLCBWRU5DX1lDQ0NUTCwgMHgxKTsKKworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1NZTkNDVEwsIDEgPDwgVkVOQ19TWU5DQ1RMX09WRF9TSElGVCwKKwkJCVZFTkNfU1lOQ0NUTF9PVkQpOworCXZlbmNfd3JpdGUoc2QsIFZFTkNfVk1PRCwgMCk7CisJdmVuY19tb2RpZnkoc2QsIFZFTkNfVk1PRCwKKwkJCSgxIDw8IFZFTkNfVk1PRF9WSUVfU0hJRlQpLAorCQkJVkVOQ19WTU9EX1ZJRSk7CisJdmVuY19tb2RpZnkoc2QsIFZFTkNfVk1PRCwKKwkJCSgwIDw8IFZFTkNfVk1PRF9WTUQpLCBWRU5DX1ZNT0RfVk1EKTsKKwl2ZW5jX21vZGlmeShzZCwgVkVOQ19WTU9ELAorCQkJKDEgPDwgVkVOQ19WTU9EX1RWVFlQX1NISUZUKSwKKwkJCVZFTkNfVk1PRF9UVlRZUCk7CisJdmVuY193cml0ZShzZCwgVkVOQ19EQUNUU1QsIDB4MCk7CisJdmVuY19tb2RpZnkoc2QsIFZFTkNfVk1PRCwgVkVOQ19WTU9EX1ZFTkMsIFZFTkNfVk1PRF9WRU5DKTsKKworCXJldHVybiAwOworfQorCisvKgorICogdmVuY19zZXRfNDgwcDU5Xzk0CisgKgorICogVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSB2aWRlbyBlbmNvZGVyIHRvIEVEVFYoNTI1cCkgY29tcG9uZW50IHNldHRpbmcuCisgKi8KK3N0YXRpYyBpbnQgdmVuY19zZXRfNDgwcDU5Xzk0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCit7CisJc3RydWN0IHZlbmNfc3RhdGUgKnZlbmMgPSB0b19zdGF0ZShzZCk7CisJc3RydWN0IHZlbmNfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSB2ZW5jLT5wZGF0YTsKKworCXY0bDJfZGJnKGRlYnVnLCAyLCBzZCwgInZlbmNfc2V0XzQ4MHA1OV85NFxuIik7CisKKwkvKiBTZXR1cCBjbG9jayBhdCBWUFNTICYgVkVOQyBmb3IgU0QgKi8KKwlpZiAocGRhdGEtPnNldHVwX2Nsb2NrKFZQQkVfRU5DX0RWX1BSRVNFVCwgVjRMMl9EVl80ODBQNTlfOTQpIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2ZW5jX2VuYWJsZWRpZ2l0YWxvdXRwdXQoc2QsIDApOworCisJdmVuY193cml0ZShzZCwgVkVOQ19PU0RDTEswLCAwKTsKKwl2ZW5jX3dyaXRlKHNkLCBWRU5DX09TRENMSzEsIDEpOworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZEUFJPLCBWRU5DX1ZEUFJPX0RBRlJRLAorCQkgICAgVkVOQ19WRFBST19EQUZSUSk7CisJdmVuY19tb2RpZnkoc2QsIFZFTkNfVkRQUk8sIFZFTkNfVkRQUk9fREFVUFMsCisJCSAgICBWRU5DX1ZEUFJPX0RBVVBTKTsKKwl2ZW5jX3dyaXRlKHNkLCBWRU5DX1ZNT0QsIDApOworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZNT0QsICgxIDw8IFZFTkNfVk1PRF9WSUVfU0hJRlQpLAorCQkgICAgVkVOQ19WTU9EX1ZJRSk7CisJdmVuY19tb2RpZnkoc2QsIFZFTkNfVk1PRCwgVkVOQ19WTU9EX0hETUQsIFZFTkNfVk1PRF9IRE1EKTsKKwl2ZW5jX21vZGlmeShzZCwgVkVOQ19WTU9ELCAoSERUVl81MjVQIDw8IFZFTkNfVk1PRF9UVlRZUF9TSElGVCksCisJCSAgICBWRU5DX1ZNT0RfVFZUWVApOworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZNT0QsIFZFTkNfVk1PRF9WRE1EX1lDQkNSOCA8PAorCQkgICAgVkVOQ19WTU9EX1ZETURfU0hJRlQsIFZFTkNfVk1PRF9WRE1EKTsKKworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZNT0QsIFZFTkNfVk1PRF9WRU5DLCBWRU5DX1ZNT0RfVkVOQyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHZlbmNfc2V0XzYyNXAKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgdGhlIHZpZGVvIGVuY29kZXIgdG8gSERUVig2MjVwKSBjb21wb25lbnQgc2V0dGluZworICovCitzdGF0aWMgaW50IHZlbmNfc2V0XzU3NnA1MChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXN0cnVjdCB2ZW5jX3N0YXRlICp2ZW5jID0gdG9fc3RhdGUoc2QpOworCXN0cnVjdCB2ZW5jX3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gdmVuYy0+cGRhdGE7CisKKwl2NGwyX2RiZyhkZWJ1ZywgMiwgc2QsICJ2ZW5jX3NldF81NzZwNTBcbiIpOworCisJLyogU2V0dXAgY2xvY2sgYXQgVlBTUyAmIFZFTkMgZm9yIFNEICovCisJaWYgKHBkYXRhLT5zZXR1cF9jbG9jayhWUEJFX0VOQ19EVl9QUkVTRVQsIFY0TDJfRFZfNTc2UDUwKSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJdmVuY19lbmFibGVkaWdpdGFsb3V0cHV0KHNkLCAwKTsKKworCXZlbmNfd3JpdGUoc2QsIFZFTkNfT1NEQ0xLMCwgMCk7CisJdmVuY193cml0ZShzZCwgVkVOQ19PU0RDTEsxLCAxKTsKKworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZEUFJPLCBWRU5DX1ZEUFJPX0RBRlJRLAorCQkgICAgVkVOQ19WRFBST19EQUZSUSk7CisJdmVuY19tb2RpZnkoc2QsIFZFTkNfVkRQUk8sIFZFTkNfVkRQUk9fREFVUFMsCisJCSAgICBWRU5DX1ZEUFJPX0RBVVBTKTsKKworCXZlbmNfd3JpdGUoc2QsIFZFTkNfVk1PRCwgMCk7CisJdmVuY19tb2RpZnkoc2QsIFZFTkNfVk1PRCwgKDEgPDwgVkVOQ19WTU9EX1ZJRV9TSElGVCksCisJCSAgICBWRU5DX1ZNT0RfVklFKTsKKwl2ZW5jX21vZGlmeShzZCwgVkVOQ19WTU9ELCBWRU5DX1ZNT0RfSERNRCwgVkVOQ19WTU9EX0hETUQpOworCXZlbmNfbW9kaWZ5KHNkLCBWRU5DX1ZNT0QsIChIRFRWXzYyNVAgPDwgVkVOQ19WTU9EX1RWVFlQX1NISUZUKSwKKwkJICAgIFZFTkNfVk1PRF9UVlRZUCk7CisKKwl2ZW5jX21vZGlmeShzZCwgVkVOQ19WTU9ELCBWRU5DX1ZNT0RfVkRNRF9ZQ0JDUjggPDwKKwkJICAgIFZFTkNfVk1PRF9WRE1EX1NISUZULCBWRU5DX1ZNT0RfVkRNRCk7CisJdmVuY19tb2RpZnkoc2QsIFZFTkNfVk1PRCwgVkVOQ19WTU9EX1ZFTkMsIFZFTkNfVk1PRF9WRU5DKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZlbmNfc19zdGRfb3V0cHV0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHY0bDJfc3RkX2lkIG5vcm0pCit7CisJdjRsMl9kYmcoZGVidWcsIDEsIHNkLCAidmVuY19zX3N0ZF9vdXRwdXRcbiIpOworCisJaWYgKG5vcm0gJiBWNEwyX1NURF81MjVfNjApCisJCXJldHVybiB2ZW5jX3NldF9udHNjKHNkKTsKKwllbHNlIGlmIChub3JtICYgVjRMMl9TVERfNjI1XzUwKQorCQlyZXR1cm4gdmVuY19zZXRfcGFsKHNkKTsKKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHZlbmNfc19kdl9wcmVzZXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCSAgICBzdHJ1Y3QgdjRsMl9kdl9wcmVzZXQgKmR2X3ByZXNldCkKK3sKKwl2NGwyX2RiZyhkZWJ1ZywgMSwgc2QsICJ2ZW5jX3NfZHZfcHJlc2V0XG4iKTsKKworCWlmIChkdl9wcmVzZXQtPnByZXNldCA9PSBWNEwyX0RWXzU3NlA1MCkKKwkJcmV0dXJuIHZlbmNfc2V0XzU3NnA1MChzZCk7CisJZWxzZSBpZiAoZHZfcHJlc2V0LT5wcmVzZXQgPT0gVjRMMl9EVl80ODBQNTlfOTQpCisJCXJldHVybiB2ZW5jX3NldF80ODBwNTlfOTQoc2QpOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdmVuY19zX3JvdXRpbmcoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTMyIGlucHV0LCB1MzIgb3V0cHV0LAorCQkJICB1MzIgY29uZmlnKQoreworCXN0cnVjdCB2ZW5jX3N0YXRlICp2ZW5jID0gdG9fc3RhdGUoc2QpOworCWludCByZXQ7CisKKwl2NGwyX2RiZyhkZWJ1ZywgMSwgc2QsICJ2ZW5jX3Nfcm91dGluZ1xuIik7CisKKwlyZXQgPSB2ZW5jX3NldF9kYWMoc2QsIG91dHB1dCk7CisJaWYgKCFyZXQpCisJCXZlbmMtPm91dHB1dCA9IG91dHB1dDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBsb25nIHZlbmNfaW9jdGwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCXVuc2lnbmVkIGludCBjbWQsCisJCQl2b2lkICphcmcpCit7CisJdTMyIHZhbDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBWRU5DX0dFVF9GTEQ6CisJCXZhbCA9IHZlbmNfcmVhZChzZCwgVkVOQ19WU1RBVCk7CisJCSooKGludCAqKWFyZykgPSAoKHZhbCAmIFZFTkNfVlNUQVRfRklEU1QpID09CisJCVZFTkNfVlNUQVRfRklEU1QpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl2NGwyX2VycihzZCwgIldyb25nIElPQ1RMIGNtZFxuIik7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIHZlbmNfY29yZV9vcHMgPSB7CisJLmlvY3RsICAgICAgPSB2ZW5jX2lvY3RsLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl92aWRlb19vcHMgdmVuY192aWRlb19vcHMgPSB7CisJLnNfcm91dGluZyA9IHZlbmNfc19yb3V0aW5nLAorCS5zX3N0ZF9vdXRwdXQgPSB2ZW5jX3Nfc3RkX291dHB1dCwKKwkuc19kdl9wcmVzZXQgPSB2ZW5jX3NfZHZfcHJlc2V0LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgdmVuY19vcHMgPSB7CisJLmNvcmUgPSAmdmVuY19jb3JlX29wcywKKwkudmlkZW8gPSAmdmVuY192aWRlb19vcHMsCit9OworCitzdGF0aWMgaW50IHZlbmNfaW5pdGlhbGl6ZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQoreworCXN0cnVjdCB2ZW5jX3N0YXRlICp2ZW5jID0gdG9fc3RhdGUoc2QpOworCWludCByZXQ7CisKKwkvKiBTZXQgZGVmYXVsdCB0byBvdXRwdXQgdG8gY29tcG9zaXRlIGFuZCBzdGQgdG8gTlRTQyAqLworCXZlbmMtPm91dHB1dCA9IDA7CisJdmVuYy0+c3RkID0gVjRMMl9TVERfNTI1XzYwOworCisJcmV0ID0gdmVuY19zX3JvdXRpbmcoc2QsIDAsIHZlbmMtPm91dHB1dCwgMCk7CisJaWYgKHJldCA8IDApIHsKKwkJdjRsMl9lcnIoc2QsICJFcnJvciBzZXR0aW5nIG91dHB1dCBkdXJpbmcgaW5pdFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IHZlbmNfc19zdGRfb3V0cHV0KHNkLCB2ZW5jLT5zdGQpOworCWlmIChyZXQgPCAwKSB7CisJCXY0bDJfZXJyKHNkLCAiRXJyb3Igc2V0dGluZyBzdGQgZHVyaW5nIGluaXRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZlbmNfZGV2aWNlX2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCB2ZW5jX3N0YXRlICoqdmVuYyA9IGRhdGE7CisKKwlpZiAoc3RyY21wKE1PRFVMRV9OQU1FLCBwZGV2LT5uYW1lKSA9PSAwKQorCQkqdmVuYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCB2NGwyX3N1YmRldiAqdmVuY19zdWJfZGV2X2luaXQoc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldiwKKwkJY29uc3QgY2hhciAqdmVuY19uYW1lKQoreworCXN0cnVjdCB2ZW5jX3N0YXRlICp2ZW5jOworCWludCBlcnI7CisKKwllcnIgPSBidXNfZm9yX2VhY2hfZGV2KCZwbGF0Zm9ybV9idXNfdHlwZSwgTlVMTCwgJnZlbmMsCisJCQl2ZW5jX2RldmljZV9nZXQpOworCWlmICh2ZW5jID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJdjRsMl9zdWJkZXZfaW5pdCgmdmVuYy0+c2QsICZ2ZW5jX29wcyk7CisKKwlzdHJjcHkodmVuYy0+c2QubmFtZSwgdmVuY19uYW1lKTsKKwlpZiAodjRsMl9kZXZpY2VfcmVnaXN0ZXJfc3ViZGV2KHY0bDJfZGV2LCAmdmVuYy0+c2QpIDwgMCkgeworCQl2NGwyX2Vycih2NGwyX2RldiwKKwkJCSJ2cGJlIHVuYWJsZSB0byByZWdpc3RlciB2ZW5jIHN1YiBkZXZpY2VcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKHZlbmNfaW5pdGlhbGl6ZSgmdmVuYy0+c2QpKSB7CisJCXY0bDJfZXJyKHY0bDJfZGV2LAorCQkJInZwYmUgdmVuYyBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gJnZlbmMtPnNkOworfQorRVhQT1JUX1NZTUJPTCh2ZW5jX3N1Yl9kZXZfaW5pdCk7CisKK3N0YXRpYyBpbnQgdmVuY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB2ZW5jX3N0YXRlICp2ZW5jOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCByZXQ7CisKKwl2ZW5jID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHZlbmNfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAodmVuYyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXZlbmMtPnBkZXYgPSAmcGRldi0+ZGV2OworCXZlbmMtPnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJaWYgKE5VTEwgPT0gdmVuYy0+cGRhdGEpIHsKKwkJZGV2X2Vycih2ZW5jLT5wZGV2LCAiVW5hYmxlIHRvIGdldCBwbGF0Zm9ybSBkYXRhIGZvciIKKwkJCSIgVkVOQyBzdWIgZGV2aWNlIik7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gZnJlZV9tZW07CisJfQorCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKCFyZXMpIHsKKwkJZGV2X2Vycih2ZW5jLT5wZGV2LAorCQkJIlVuYWJsZSB0byBnZXQgVkVOQyByZWdpc3RlciBhZGRyZXNzIG1hcFxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZnJlZV9tZW07CisJfQorCisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpLCAidmVuYyIpKSB7CisJCWRldl9lcnIodmVuYy0+cGRldiwgIlVuYWJsZSB0byByZXNlcnZlIFZFTkMgTU1JTyByZWdpb25cbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGZyZWVfbWVtOworCX0KKworCXZlbmMtPnZlbmNfYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmICghdmVuYy0+dmVuY19iYXNlKSB7CisJCWRldl9lcnIodmVuYy0+cGRldiwgIlVuYWJsZSB0byBtYXAgVkVOQyBJTyBzcGFjZVxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gcmVsZWFzZV92ZW5jX21lbV9yZWdpb247CisJfQorCisJc3Bpbl9sb2NrX2luaXQoJnZlbmMtPmxvY2spOworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHZlbmMpOworCWRldl9ub3RpY2UodmVuYy0+cGRldiwgIlZFTkMgc3ViIGRldmljZSBwcm9iZSBzdWNjZXNzXG4iKTsKKwlyZXR1cm4gMDsKKworcmVsZWFzZV92ZW5jX21lbV9yZWdpb246CisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKK2ZyZWVfbWVtOgorCWtmcmVlKHZlbmMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdmVuY19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdmVuY19zdGF0ZSAqdmVuYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpb3VubWFwKCh2b2lkICopdmVuYy0+dmVuY19iYXNlKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlrZnJlZSh2ZW5jKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB2ZW5jX2RyaXZlciA9IHsKKwkucHJvYmUJCT0gdmVuY19wcm9iZSwKKwkucmVtb3ZlCQk9IHZlbmNfcmVtb3ZlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9IE1PRFVMRV9OQU1FLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKworc3RhdGljIGludCB2ZW5jX2luaXQodm9pZCkKK3sKKwlpZiAocGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ2ZW5jX2RyaXZlcikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gcmVnaXN0ZXIgdmVuYyBkcml2ZXJcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZlbmNfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ2ZW5jX2RyaXZlcik7CisJcmV0dXJuOworfQorCittb2R1bGVfaW5pdCh2ZW5jX2luaXQpOworbW9kdWxlX2V4aXQodmVuY19leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJWUEJFIFZFTkMgRHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJUZXhhcyBJbnN0cnVtZW50cyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfdmVuY19yZWdzLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBiZV92ZW5jX3JlZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDdjYjE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwYmVfdmVuY19yZWdzLmgKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCBUZXhhcyBJbnN0cnVtZW50cyBJbmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyLi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaWZuZGVmIF9WUEJFX1ZFTkNfUkVHU19ICisjZGVmaW5lIF9WUEJFX1ZFTkNfUkVHU19ICisKKy8qIFZQQkUgVmlkZW8gRW5jb2RlciAvIERpZ2l0YWwgTENEIFN1YnN5c3RlbSBSZWdpc3RlcnMgKFZFTkMpICovCisjZGVmaW5lIFZFTkNfVk1PRAkJCQkweDAwCisjZGVmaW5lIFZFTkNfVklEQ1RMCQkJCTB4MDQKKyNkZWZpbmUgVkVOQ19WRFBSTwkJCQkweDA4CisjZGVmaW5lIFZFTkNfU1lOQ0NUTAkJCQkweDBDCisjZGVmaW5lIFZFTkNfSFNQTFMJCQkJMHgxMAorI2RlZmluZSBWRU5DX1ZTUExTCQkJCTB4MTQKKyNkZWZpbmUgVkVOQ19ISU5UCQkJCTB4MTgKKyNkZWZpbmUgVkVOQ19IU1RBUlQJCQkJMHgxQworI2RlZmluZSBWRU5DX0hWQUxJRAkJCQkweDIwCisjZGVmaW5lIFZFTkNfVklOVAkJCQkweDI0CisjZGVmaW5lIFZFTkNfVlNUQVJUCQkJCTB4MjgKKyNkZWZpbmUgVkVOQ19WVkFMSUQJCQkJMHgyQworI2RlZmluZSBWRU5DX0hTRExZCQkJCTB4MzAKKyNkZWZpbmUgVkVOQ19WU0RMWQkJCQkweDM0CisjZGVmaW5lIFZFTkNfWUNDQ1RMCQkJCTB4MzgKKyNkZWZpbmUgVkVOQ19SR0JDVEwJCQkJMHgzQworI2RlZmluZSBWRU5DX1JHQkNMUAkJCQkweDQwCisjZGVmaW5lIFZFTkNfTElORUNUTAkJCQkweDQ0CisjZGVmaW5lIFZFTkNfQ1VMTExJTkUJCQkJMHg0OAorI2RlZmluZSBWRU5DX0xDRE9VVAkJCQkweDRDCisjZGVmaW5lIFZFTkNfQlJUUwkJCQkweDUwCisjZGVmaW5lIFZFTkNfQlJUVwkJCQkweDU0CisjZGVmaW5lIFZFTkNfQUNDVEwJCQkJMHg1OAorI2RlZmluZSBWRU5DX1BXTVAJCQkJMHg1QworI2RlZmluZSBWRU5DX1BXTVcJCQkJMHg2MAorI2RlZmluZSBWRU5DX0RDTEtDVEwJCQkJMHg2NAorI2RlZmluZSBWRU5DX0RDTEtQVE4wCQkJCTB4NjgKKyNkZWZpbmUgVkVOQ19EQ0xLUFROMQkJCQkweDZDCisjZGVmaW5lIFZFTkNfRENMS1BUTjIJCQkJMHg3MAorI2RlZmluZSBWRU5DX0RDTEtQVE4zCQkJCTB4NzQKKyNkZWZpbmUgVkVOQ19EQ0xLUFROMEEJCQkJMHg3OAorI2RlZmluZSBWRU5DX0RDTEtQVE4xQQkJCQkweDdDCisjZGVmaW5lIFZFTkNfRENMS1BUTjJBCQkJCTB4ODAKKyNkZWZpbmUgVkVOQ19EQ0xLUFROM0EJCQkJMHg4NAorI2RlZmluZSBWRU5DX0RDTEtIUwkJCQkweDg4CisjZGVmaW5lIFZFTkNfRENMS0hTQQkJCQkweDhDCisjZGVmaW5lIFZFTkNfRENMS0hSCQkJCTB4OTAKKyNkZWZpbmUgVkVOQ19EQ0xLVlMJCQkJMHg5NAorI2RlZmluZSBWRU5DX0RDTEtWUgkJCQkweDk4CisjZGVmaW5lIFZFTkNfQ0FQQ1RMCQkJCTB4OUMKKyNkZWZpbmUgVkVOQ19DQVBETwkJCQkweEEwCisjZGVmaW5lIFZFTkNfQ0FQREUJCQkJMHhBNAorI2RlZmluZSBWRU5DX0FUUjAJCQkJMHhBOAorI2RlZmluZSBWRU5DX0FUUjEJCQkJMHhBQworI2RlZmluZSBWRU5DX0FUUjIJCQkJMHhCMAorI2RlZmluZSBWRU5DX1ZTVEFUCQkJCTB4QjgKKyNkZWZpbmUgVkVOQ19SQU1BRFIJCQkJMHhCQworI2RlZmluZSBWRU5DX1JBTVBPUlQJCQkJMHhDMAorI2RlZmluZSBWRU5DX0RBQ1RTVAkJCQkweEM0CisjZGVmaW5lIFZFTkNfWUNPTFZMCQkJCTB4QzgKKyNkZWZpbmUgVkVOQ19TQ1BST0cJCQkJMHhDQworI2RlZmluZSBWRU5DX0NWQlMJCQkJMHhEQworI2RlZmluZSBWRU5DX0NNUE5UCQkJCTB4RTAKKyNkZWZpbmUgVkVOQ19FVE1HMAkJCQkweEU0CisjZGVmaW5lIFZFTkNfRVRNRzEJCQkJMHhFOAorI2RlZmluZSBWRU5DX0VUTUcyCQkJCTB4RUMKKyNkZWZpbmUgVkVOQ19FVE1HMwkJCQkweEYwCisjZGVmaW5lIFZFTkNfREFDU0VMCQkJCTB4RjQKKyNkZWZpbmUgVkVOQ19BUkdCWDAJCQkJMHgxMDAKKyNkZWZpbmUgVkVOQ19BUkdCWDEJCQkJMHgxMDQKKyNkZWZpbmUgVkVOQ19BUkdCWDIJCQkJMHgxMDgKKyNkZWZpbmUgVkVOQ19BUkdCWDMJCQkJMHgxMEMKKyNkZWZpbmUgVkVOQ19BUkdCWDQJCQkJMHgxMTAKKyNkZWZpbmUgVkVOQ19EUkdCWDAJCQkJMHgxMTQKKyNkZWZpbmUgVkVOQ19EUkdCWDEJCQkJMHgxMTgKKyNkZWZpbmUgVkVOQ19EUkdCWDIJCQkJMHgxMUMKKyNkZWZpbmUgVkVOQ19EUkdCWDMJCQkJMHgxMjAKKyNkZWZpbmUgVkVOQ19EUkdCWDQJCQkJMHgxMjQKKyNkZWZpbmUgVkVOQ19WU1RBUlRBCQkJCTB4MTI4CisjZGVmaW5lIFZFTkNfT1NEQ0xLMAkJCQkweDEyQworI2RlZmluZSBWRU5DX09TRENMSzEJCQkJMHgxMzAKKyNkZWZpbmUgVkVOQ19IVkxEQ0wwCQkJCTB4MTM0CisjZGVmaW5lIFZFTkNfSFZMRENMMQkJCQkweDEzOAorI2RlZmluZSBWRU5DX09TREhBRFYJCQkJMHgxM0MKKyNkZWZpbmUgVkVOQ19DTEtDVEwJCQkJMHgxNDAKKyNkZWZpbmUgVkVOQ19HQU1DVEwJCQkJMHgxNDQKKyNkZWZpbmUgVkVOQ19YSElOVFZMCQkJCTB4MTc0CisKKy8qIGJpdCBkZWZpbml0aW9ucyAqLworI2RlZmluZSBWUEJFX1BDUl9WRU5DX0RJVgkJCSgxIDw8IDEpCisjZGVmaW5lIFZQQkVfUENSX0NMS19PRkYJCQkoMSA8PCAwKQorCisjZGVmaW5lIFZFTkNfVk1PRF9WRE1EX1NISUZUCQkJMTIKKyNkZWZpbmUgVkVOQ19WTU9EX1ZETURfWUNCQ1IxNgkJCTAKKyNkZWZpbmUgVkVOQ19WTU9EX1ZETURfWUNCQ1I4CQkJMQorI2RlZmluZSBWRU5DX1ZNT0RfVkRNRF9SR0I2NjYJCQkyCisjZGVmaW5lIFZFTkNfVk1PRF9WRE1EX1JHQjgJCQkzCisjZGVmaW5lIFZFTkNfVk1PRF9WRE1EX0VQU09OCQkJNAorI2RlZmluZSBWRU5DX1ZNT0RfVkRNRF9DQVNJTwkJCTUKKyNkZWZpbmUgVkVOQ19WTU9EX1ZETURfVURJU1BRVkdBCQk2CisjZGVmaW5lIFZFTkNfVk1PRF9WRE1EX1NUTkxDRAkJCTcKKyNkZWZpbmUgVkVOQ19WTU9EX1ZJRV9TSElGVAkJCTEKKyNkZWZpbmUgVkVOQ19WTU9EX1ZETUQJCQkJKDcgPDwgMTIpCisjZGVmaW5lIFZFTkNfVk1PRF9JVExDTAkJCQkoMSA8PCAxMSkKKyNkZWZpbmUgVkVOQ19WTU9EX0lUTEMJCQkJKDEgPDwgMTApCisjZGVmaW5lIFZFTkNfVk1PRF9OU0lUCQkJCSgxIDw8IDkpCisjZGVmaW5lIFZFTkNfVk1PRF9IRE1ECQkJCSgxIDw8IDgpCisjZGVmaW5lIFZFTkNfVk1PRF9UVlRZUF9TSElGVAkJCTYKKyNkZWZpbmUgVkVOQ19WTU9EX1RWVFlQCQkJCSgzIDw8IDYpCisjZGVmaW5lIFZFTkNfVk1PRF9TTEFWRQkJCQkoMSA8PCA1KQorI2RlZmluZSBWRU5DX1ZNT0RfVk1ECQkJCSgxIDw8IDQpCisjZGVmaW5lIFZFTkNfVk1PRF9CTE5LCQkJCSgxIDw8IDMpCisjZGVmaW5lIFZFTkNfVk1PRF9WSUUJCQkJKDEgPDwgMSkKKyNkZWZpbmUgVkVOQ19WTU9EX1ZFTkMJCQkJKDEgPDwgMCkKKworLyogVk1PRCBUVlRZUCBvcHRpb25zIGZvciBIRE1EPTAgKi8KKyNkZWZpbmUgU0RUVl9OVFNDCQkJCTAKKyNkZWZpbmUgU0RUVl9QQUwJCQkJMQorLyogVk1PRCBUVlRZUCBvcHRpb25zIGZvciBIRE1EPTEgKi8KKyNkZWZpbmUgSERUVl81MjVQCQkJCTAKKyNkZWZpbmUgSERUVl82MjVQCQkJCTEKKyNkZWZpbmUgSERUVl8xMDgwSQkJCQkyCisjZGVmaW5lIEhEVFZfNzIwUAkJCQkzCisKKyNkZWZpbmUgVkVOQ19WSURDVExfVkNMS1AJCQkoMSA8PCAxNCkKKyNkZWZpbmUgVkVOQ19WSURDVExfVkNMS0VfU0hJRlQJCQkxMworI2RlZmluZSBWRU5DX1ZJRENUTF9WQ0xLRQkJCSgxIDw8IDEzKQorI2RlZmluZSBWRU5DX1ZJRENUTF9WQ0xLWl9TSElGVAkJCTEyCisjZGVmaW5lIFZFTkNfVklEQ1RMX1ZDTEtaCQkJKDEgPDwgMTIpCisjZGVmaW5lIFZFTkNfVklEQ1RMX1NZRElSX1NISUZUCQkJOAorI2RlZmluZSBWRU5DX1ZJRENUTF9TWURJUgkJCSgxIDw8IDgpCisjZGVmaW5lIFZFTkNfVklEQ1RMX0RPTURfU0hJRlQJCQk0CisjZGVmaW5lIFZFTkNfVklEQ1RMX0RPTUQJCQkoMyA8PCA0KQorI2RlZmluZSBWRU5DX1ZJRENUTF9ZQ0RJUl9TSElGVAkJCTAKKyNkZWZpbmUgVkVOQ19WSURDVExfWUNESVIJCQkoMSA8PCAwKQorCisjZGVmaW5lIFZFTkNfVkRQUk9fQVRZQ0NfU0hJRlQJCQk1CisjZGVmaW5lIFZFTkNfVkRQUk9fQVRZQ0MJCQkoMSA8PCA1KQorI2RlZmluZSBWRU5DX1ZEUFJPX0FUQ09NX1NISUZUCQkJNAorI2RlZmluZSBWRU5DX1ZEUFJPX0FUQ09NCQkJKDEgPDwgNCkKKyNkZWZpbmUgVkVOQ19WRFBST19EQUZSUQkJCSgxIDw8IDMpCisjZGVmaW5lIFZFTkNfVkRQUk9fREFVUFMJCQkoMSA8PCAyKQorI2RlZmluZSBWRU5DX1ZEUFJPX0NVUFMJCQkJKDEgPDwgMSkKKyNkZWZpbmUgVkVOQ19WRFBST19ZVVBTCQkJCSgxIDw8IDApCisKKyNkZWZpbmUgVkVOQ19TWU5DQ1RMX1ZQTF9TSElGVAkJCTMKKyNkZWZpbmUgVkVOQ19TWU5DQ1RMX1ZQTAkJCSgxIDw8IDMpCisjZGVmaW5lIFZFTkNfU1lOQ0NUTF9IUExfU0hJRlQJCQkyCisjZGVmaW5lIFZFTkNfU1lOQ0NUTF9IUEwJCQkoMSA8PCAyKQorI2RlZmluZSBWRU5DX1NZTkNDVExfU1lFVl9TSElGVAkJCTEKKyNkZWZpbmUgVkVOQ19TWU5DQ1RMX1NZRVYJCQkoMSA8PCAxKQorI2RlZmluZSBWRU5DX1NZTkNDVExfU1lFSF9TSElGVAkJCTAKKyNkZWZpbmUgVkVOQ19TWU5DQ1RMX1NZRUgJCQkoMSA8PCAwKQorI2RlZmluZSBWRU5DX1NZTkNDVExfT1ZEX1NISUZUCQkJMTQKKyNkZWZpbmUgVkVOQ19TWU5DQ1RMX09WRAkJCSgxIDw8IDE0KQorCisjZGVmaW5lIFZFTkNfRENMS0NUTF9EQ0tFQ19TSElGVAkJMTEKKyNkZWZpbmUgVkVOQ19EQ0xLQ1RMX0RDS0VDCQkJKDEgPDwgMTEpCisjZGVmaW5lIFZFTkNfRENMS0NUTF9EQ0tQV19TSElGVAkJMAorI2RlZmluZSBWRU5DX0RDTEtDVExfRENLUFcJCQkoMHgzZiA8PCAwKQorCisjZGVmaW5lIFZFTkNfVlNUQVRfRklEU1QJCQkoMSA8PCA0KQorCisjZGVmaW5lIFZFTkNfQ01QTlRfTVJHQl9TSElGVAkJCTE0CisjZGVmaW5lIFZFTkNfQ01QTlRfTVJHQgkJCQkoMSA8PCAxNCkKKworI2VuZGlmCQkJCS8qIF9WUEJFX1ZFTkNfUkVHU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBpZl9jYXB0dXJlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBpZl9jYXB0dXJlLmMKaW5kZXggZDkzYWQ3NC4uNDllNGRlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwaWZfY2FwdHVyZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGlmX2NhcHR1cmUuYwpAQCAtMzMsNyArMzMsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KQEAgLTQ0LDYgKzQzLDcgQEAKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJUSSBEYVZpbmNpIFZQSUYgQ2FwdHVyZSBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKFZQSUZfQ0FQVFVSRV9WRVJTSU9OKTsKIAogI2RlZmluZSB2cGlmX2VycihmbXQsIGFyZy4uLikJdjRsMl9lcnIoJnZwaWZfb2JqLnY0bDJfZGV2LCBmbXQsICMjIGFyZykKICNkZWZpbmUgdnBpZl9kYmcobGV2ZWwsIGRlYnVnLCBmbXQsIGFyZy4uLikJXApAQCAtMTY3Nyw3ICsxNjc3LDYgQEAKIHsKIAlzdHJ1Y3QgdnBpZl9jYXB0dXJlX2NvbmZpZyAqY29uZmlnID0gdnBpZl9kZXYtPnBsYXRmb3JtX2RhdGE7CiAKLQljYXAtPnZlcnNpb24gPSBWUElGX0NBUFRVUkVfVkVSU0lPTl9DT0RFOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1NUUkVBTUlORzsKIAlzdHJsY3B5KGNhcC0+ZHJpdmVyLCAidnBpZiBjYXB0dXJlIiwgc2l6ZW9mKGNhcC0+ZHJpdmVyKSk7CiAJc3RybGNweShjYXAtPmJ1c19pbmZvLCAiRE02NDZ4IFBsYXRmb3JtIiwgc2l6ZW9mKGNhcC0+YnVzX2luZm8pKTsKQEAgLTIyMTEsMTAgKzIyMTAsOCBAQAogCQl2ZmQtPnY0bDJfZGV2ID0gJnZwaWZfb2JqLnY0bDJfZGV2OwogCQl2ZmQtPnJlbGVhc2UgPSB2aWRlb19kZXZpY2VfcmVsZWFzZTsKIAkJc25wcmludGYodmZkLT5uYW1lLCBzaXplb2YodmZkLT5uYW1lKSwKLQkJCSAiRE02NDZ4X1ZQSUZDYXB0dXJlX0RSSVZFUl9WJWQuJWQuJWQiLAotCQkJIChWUElGX0NBUFRVUkVfVkVSU0lPTl9DT0RFID4+IDE2KSAmIDB4ZmYsCi0JCQkgKFZQSUZfQ0FQVFVSRV9WRVJTSU9OX0NPREUgPj4gOCkgJiAweGZmLAotCQkJIChWUElGX0NBUFRVUkVfVkVSU0lPTl9DT0RFKSAmIDB4ZmYpOworCQkJICJETTY0NnhfVlBJRkNhcHR1cmVfRFJJVkVSX1YlcyIsCisJCQkgVlBJRl9DQVBUVVJFX1ZFUlNJT04pOwogCQkvKiBTZXQgdmlkZW9fZGV2IHRvIHRoZSB2aWRlbyBkZXZpY2UgKi8KIAkJY2gtPnZpZGVvX2RldiA9IHZmZDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBpZl9jYXB0dXJlLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBpZl9jYXB0dXJlLmgKaW5kZXggN2E0MTk2ZC4uMDY0NTUwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwaWZfY2FwdHVyZS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGlmX2NhcHR1cmUuaApAQCAtMjMsNyArMjMsNiBAQAogCiAvKiBIZWFkZXIgZmlsZXMgKi8KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmLWNvcmUuaD4KQEAgLTMzLDExICszMiw3IEBACiAjaW5jbHVkZSAidnBpZi5oIgogCiAvKiBNYWNyb3MgKi8KLSNkZWZpbmUgVlBJRl9NQUpPUl9SRUxFQVNFCQkwCi0jZGVmaW5lIFZQSUZfTUlOT1JfUkVMRUFTRQkJMAotI2RlZmluZSBWUElGX0JVSUxECQkJMQotI2RlZmluZSBWUElGX0NBUFRVUkVfVkVSU0lPTl9DT0RFCSgoVlBJRl9NQUpPUl9SRUxFQVNFIDw8IDE2KSB8IFwKLQkoVlBJRl9NSU5PUl9SRUxFQVNFIDw8IDgpIHwgVlBJRl9CVUlMRCkKKyNkZWZpbmUgVlBJRl9DQVBUVVJFX1ZFUlNJT04JCSIwLjAuMiIKIAogI2RlZmluZSBWUElGX1ZBTElEX0ZJRUxEKGZpZWxkKQkJKCgoVjRMMl9GSUVMRF9BTlkgPT0gZmllbGQpIHx8IFwKIAkoVjRMMl9GSUVMRF9OT05FID09IGZpZWxkKSkgfHwgXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwaWZfZGlzcGxheS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwaWZfZGlzcGxheS5jCmluZGV4IGNkZjY1OWEuLjI4NmYwMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGlmX2Rpc3BsYXkuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBpZl9kaXNwbGF5LmMKQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlIDxhc20vaXJxLmg+CkBAIC00Nyw2ICs0Niw3IEBACiAKIE1PRFVMRV9ERVNDUklQVElPTigiVEkgRGFWaW5jaSBWUElGIERpc3BsYXkgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihWUElGX0RJU1BMQVlfVkVSU0lPTik7CiAKICNkZWZpbmUgRE02NDZYX1Y0TDJfU1REIChWNEwyX1NURF81MjVfNjAgfCBWNEwyX1NURF82MjVfNTApCiAKQEAgLTcwMSw3ICs3MDEsNiBAQAogewogCXN0cnVjdCB2cGlmX2Rpc3BsYXlfY29uZmlnICpjb25maWcgPSB2cGlmX2Rldi0+cGxhdGZvcm1fZGF0YTsKIAotCWNhcC0+dmVyc2lvbiA9IFZQSUZfRElTUExBWV9WRVJTSU9OX0NPREU7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19PVVRQVVQgfCBWNEwyX0NBUF9TVFJFQU1JTkc7CiAJc3RybGNweShjYXAtPmRyaXZlciwgInZwaWYgZGlzcGxheSIsIHNpemVvZihjYXAtPmRyaXZlcikpOwogCXN0cmxjcHkoY2FwLT5idXNfaW5mbywgIlBsYXRmb3JtIiwgc2l6ZW9mKGNhcC0+YnVzX2luZm8pKTsKQEAgLTE3NDAsMTAgKzE3MzksOCBAQAogCQl2ZmQtPnY0bDJfZGV2ID0gJnZwaWZfb2JqLnY0bDJfZGV2OwogCQl2ZmQtPnJlbGVhc2UgPSB2aWRlb19kZXZpY2VfcmVsZWFzZTsKIAkJc25wcmludGYodmZkLT5uYW1lLCBzaXplb2YodmZkLT5uYW1lKSwKLQkJCSAiRE02NDZ4X1ZQSUZEaXNwbGF5X0RSSVZFUl9WJWQuJWQuJWQiLAotCQkJIChWUElGX0RJU1BMQVlfVkVSU0lPTl9DT0RFID4+IDE2KSAmIDB4ZmYsCi0JCQkgKFZQSUZfRElTUExBWV9WRVJTSU9OX0NPREUgPj4gOCkgJiAweGZmLAotCQkJIChWUElGX0RJU1BMQVlfVkVSU0lPTl9DT0RFKSAmIDB4ZmYpOworCQkJICJETTY0NnhfVlBJRkRpc3BsYXlfRFJJVkVSX1YlcyIsCisJCQkgVlBJRl9ESVNQTEFZX1ZFUlNJT04pOwogCiAJCS8qIFNldCB2aWRlb19kZXYgdG8gdGhlIHZpZGVvIGRldmljZSAqLwogCQljaC0+dmlkZW9fZGV2ID0gdmZkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwaWZfZGlzcGxheS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9kYXZpbmNpL3ZwaWZfZGlzcGxheS5oCmluZGV4IGI1M2FhYTguLjVkMTkzNmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZGF2aW5jaS92cGlmX2Rpc3BsYXkuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2RhdmluY2kvdnBpZl9kaXNwbGF5LmgKQEAgLTE4LDcgKzE4LDYgQEAKIAogLyogSGVhZGVyIGZpbGVzICovCiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92aWRlb2J1Zi1jb3JlLmg+CkBAIC0yNywxMiArMjYsNyBAQAogI2luY2x1ZGUgInZwaWYuaCIKIAogLyogTWFjcm9zICovCi0jZGVmaW5lIFZQSUZfTUFKT1JfUkVMRUFTRQkoMCkKLSNkZWZpbmUgVlBJRl9NSU5PUl9SRUxFQVNFCSgwKQotI2RlZmluZSBWUElGX0JVSUxECQkoMSkKLQotI2RlZmluZSBWUElGX0RJU1BMQVlfVkVSU0lPTl9DT0RFIFwKLQkoKFZQSUZfTUFKT1JfUkVMRUFTRSA8PCAxNikgfCAoVlBJRl9NSU5PUl9SRUxFQVNFIDw8IDgpIHwgVlBJRl9CVUlMRCkKKyNkZWZpbmUgVlBJRl9ESVNQTEFZX1ZFUlNJT04JIjAuMC4yIgogCiAjZGVmaW5lIFZQSUZfVkFMSURfRklFTEQoZmllbGQpIFwKIAkoKChWNEwyX0ZJRUxEX0FOWSA9PSBmaWVsZCkgfHwgKFY0TDJfRklFTERfTk9ORSA9PSBmaWVsZCkpIHx8IFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9LY29uZmlnCmluZGV4IDNjYjc4ZjIuLjI4MWVlNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvS2NvbmZpZwpAQCAtMyw3ICszLDYgQEAKIAlkZXBlbmRzIG9uIFZJREVPX0RFViAmJiBJMkMKIAlzZWxlY3QgVklERU9fVFVORVIKIAlzZWxlY3QgVklERU9fVFZFRVBST00KLQlkZXBlbmRzIG9uIFJDX0NPUkUKIAlzZWxlY3QgVklERU9CVUZfVk1BTExPQwogCXNlbGVjdCBWSURFT19TQUE3MTFYIGlmIFZJREVPX0hFTFBFUl9DSElQU19BVVRPCiAJc2VsZWN0IFZJREVPX1RWUDUxNTAgaWYgVklERU9fSEVMUEVSX0NISVBTX0FVVE8KQEAgLTQwLDcgKzM5LDE4IEBACiAJc2VsZWN0IERWQl9TOTIxIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9EUlhEIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IERWQl9DWEQyODIwUiBpZiAhRFZCX0ZFX0NVU1RPTUlTRQorCXNlbGVjdCBEVkJfRFJYSyBpZiAhRFZCX0ZFX0NVU1RPTUlTRQorCXNlbGVjdCBEVkJfVERBMTgyNzFDMkREIGlmICFEVkJfRkVfQ1VTVE9NSVNFCiAJc2VsZWN0IFZJREVPQlVGX0RWQgogCS0tLWhlbHAtLS0KIAkgIFRoaXMgYWRkcyBzdXBwb3J0IGZvciBEVkIgY2FyZHMgYmFzZWQgb24gdGhlCiAJICBFbXBpYXRlY2ggZW0yOHh4IGNoaXBzLgorCitjb25maWcgVklERU9fRU0yOFhYX1JDCisgICAgICAgIGJvb2wgIkVNMjhYWCBSZW1vdGUgQ29udHJvbGxlciBzdXBwb3J0IgorICAgICAgICBkZXBlbmRzIG9uIFJDX0NPUkUKKyAgICAgICAgZGVwZW5kcyBvbiBWSURFT19FTTI4WFgKKyAgICAgICAgZGVwZW5kcyBvbiAhKFJDX0NPUkU9bSAmJiBWSURFT19FTTI4WFg9eSkKKyAgICAgICAgZGVmYXVsdCB5CisgICAgICAgIC0tLWhlbHAtLS0KKyAgICAgICAgICBFbmFibGVzIFJlbW90ZSBDb250cm9sbGVyIHN1cHBvcnQgb24gZW0yOHh4IGRyaXZlci4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L01ha2VmaWxlIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvTWFrZWZpbGUKaW5kZXggZDBmMDkzZC4uMzhhYWEwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvTWFrZWZpbGUKQEAgLTEsNSArMSw3IEBACi1lbTI4eHgtb2JqcyAgICAgOj0gZW0yOHh4LXZpZGVvLm8gZW0yOHh4LWkyYy5vIGVtMjh4eC1jYXJkcy5vIGVtMjh4eC1jb3JlLm8gXAotCQkgICBlbTI4eHgtaW5wdXQubyBlbTI4eHgtdmJpLm8KK2VtMjh4eC15IDo9CWVtMjh4eC12aWRlby5vIGVtMjh4eC1pMmMubyBlbTI4eHgtY2FyZHMubworZW0yOHh4LXkgKz0JZW0yOHh4LWNvcmUubyAgZW0yOHh4LXZiaS5vCisKK2VtMjh4eC0kKENPTkZJR19WSURFT19FTTI4WFhfUkMpICs9IGVtMjh4eC1pbnB1dC5vCiAKIGVtMjh4eC1hbHNhLW9ianMgOj0gZW0yOHh4LWF1ZGlvLm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWF1ZGlvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtYXVkaW8uYwppbmRleCAzYzQ4YTcyLi5jZmYwNzY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtYXVkaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtYXVkaW8uYwpAQCAtMyw5ICszLDkgQEAKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAyMDA2IE1hcmt1cyBSZWNoYmVyZ2VyIDxtcmVjaGJlcmdlckBnbWFpbC5jb20+CiAgKgotICogIENvcHlyaWdodCAoQykgMjAwNyBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDctMjAxMSBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAcmVkaGF0LmNvbT4KICAqCS0gUG9ydCB0byB3b3JrIHdpdGggdGhlIGluLWtlcm5lbCBkcml2ZXIKLSAqCS0gU2V2ZXJhbCBjbGVhbnVwcworICoJLSBDbGVhbnVwcywgZml4ZXMsIGFsc2EtY29udHJvbHMsIGV0Yy4KICAqCiAgKiAgVGhpcyBkcml2ZXIgaXMgYmFzZWQgb24gbXkgcHJldmlvdXMgYXU2MDAgdXNiIHBzdG4gYXVkaW8gZHJpdmVyCiAgKiAgYW5kIGluaGVyaXRzIGFsbCB0aGUgY29weXJpZ2h0cwpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgPHNvdW5kL2luZm8uaD4KICNpbmNsdWRlIDxzb3VuZC9pbml0dmFsLmg+CiAjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUgPHNvdW5kL3Rsdi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSAiZW0yOHh4LmgiCiAKQEAgLTIxMiw5ICsyMTMsMTIgQEAKIAlmb3IgKGkgPSAwOyBpIDwgRU0yOFhYX0FVRElPX0JVRlM7IGkrKykgewogCQllcnJDb2RlID0gdXNiX3N1Ym1pdF91cmIoZGV2LT5hZGV2LnVyYltpXSwgR0ZQX0FUT01JQyk7CiAJCWlmIChlcnJDb2RlKSB7CisJCQllbTI4eHhfZXJyZGV2KCJzdWJtaXQgb2YgYXVkaW8gdXJiIGZhaWxlZFxuIik7CiAJCQllbTI4eHhfZGVpbml0X2lzb2NfYXVkaW8oZGV2KTsKKwkJCWF0b21pY19zZXQoJmRldi0+c3RyZWFtX3N0YXJ0ZWQsIDApOwogCQkJcmV0dXJuIGVyckNvZGU7CiAJCX0KKwogCX0KIAogCXJldHVybiAwOwpAQCAtMjQ1LDYgKzI0OSw3IEBACiAJLmluZm8gPSBTTkRSVl9QQ01fSU5GT19CTE9DS19UUkFOU0ZFUiB8CiAJCVNORFJWX1BDTV9JTkZPX01NQVAgICAgICAgICAgIHwKIAkJU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgICAgfAorCQlTTkRSVl9QQ01fSU5GT19CQVRDSAkgICAgICB8CiAJCVNORFJWX1BDTV9JTkZPX01NQVBfVkFMSUQsCiAKIAkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLApAQCAtMjc2LDI0ICsyODEsMjcgQEAKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JLyogU2V0cyB2b2x1bWUsIG11dGUsIGV0YyAqLwotCi0JZGV2LT5tdXRlID0gMDsKLQltdXRleF9sb2NrKCZkZXYtPmxvY2spOwotCXJldCA9IGVtMjh4eF9hdWRpb19hbmFsb2dfc2V0KGRldik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyOwotCiAJcnVudGltZS0+aHcgPSBzbmRfZW0yOHh4X2h3X2NhcHR1cmU7Ci0JaWYgKGRldi0+YWx0ID09IDAgJiYgZGV2LT5hZGV2LnVzZXJzID09IDApIHsKLQkJaW50IGVyckNvZGU7Ci0JCWRldi0+YWx0ID0gNzsKLQkJZHByaW50aygiY2hhbmdpbmcgYWx0ZXJuYXRlIG51bWJlciB0byA3XG4iKTsKLQkJZXJyQ29kZSA9IHVzYl9zZXRfaW50ZXJmYWNlKGRldi0+dWRldiwgMCwgNyk7Ci0JfQorCWlmICgoZGV2LT5hbHQgPT0gMCB8fCBkZXYtPmF1ZGlvX2lmbnVtKSAmJiBkZXYtPmFkZXYudXNlcnMgPT0gMCkgeworCQlpZiAoZGV2LT5hdWRpb19pZm51bSkKKwkJCWRldi0+YWx0ID0gMTsKKwkJZWxzZQorCQkJZGV2LT5hbHQgPSA3OwogCi0JZGV2LT5hZGV2LnVzZXJzKys7Ci0JbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCQlkcHJpbnRrKCJjaGFuZ2luZyBhbHRlcm5hdGUgbnVtYmVyIG9uIGludGVyZmFjZSAlZCB0byAlZFxuIiwKKwkJCWRldi0+YXVkaW9faWZudW0sIGRldi0+YWx0KTsKKwkJdXNiX3NldF9pbnRlcmZhY2UoZGV2LT51ZGV2LCBkZXYtPmF1ZGlvX2lmbnVtLCBkZXYtPmFsdCk7CisKKwkJLyogU2V0cyB2b2x1bWUsIG11dGUsIGV0YyAqLworCQlkZXYtPm11dGUgPSAwOworCQltdXRleF9sb2NrKCZkZXYtPmxvY2spOworCQlyZXQgPSBlbTI4eHhfYXVkaW9fYW5hbG9nX3NldChkZXYpOworCQlpZiAocmV0IDwgMCkKKwkJCWdvdG8gZXJyOworCisJCWRldi0+YWRldi51c2VycysrOworCQltdXRleF91bmxvY2soJmRldi0+bG9jayk7CisJfQogCiAJc25kX3BjbV9od19jb25zdHJhaW50X2ludGVnZXIocnVudGltZSwgU05EUlZfUENNX0hXX1BBUkFNX1BFUklPRFMpOwogCWRldi0+YWRldi5jYXB0dXJlX3BjbV9zdWJzdHJlYW0gPSBzdWJzdHJlYW07CkBAIC0zNDIsNiArMzUwLDggQEAKIAogCXJldCA9IHNuZF9wY21fYWxsb2Nfdm1hbGxvY19idWZmZXIoc3Vic3RyZWFtLAogCQkJCXBhcmFtc19idWZmZXJfYnl0ZXMoaHdfcGFyYW1zKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAJZm9ybWF0ID0gcGFyYW1zX2Zvcm1hdChod19wYXJhbXMpOwogCXJhdGUgPSBwYXJhbXNfcmF0ZShod19wYXJhbXMpOwogCWNoYW5uZWxzID0gcGFyYW1zX2NoYW5uZWxzKGh3X3BhcmFtcyk7CkBAIC0zOTMsMjAgKzQwMywyNCBAQAogCQkJCSAgICAgIGludCBjbWQpCiB7CiAJc3RydWN0IGVtMjh4eCAqZGV2ID0gc25kX3BjbV9zdWJzdHJlYW1fY2hpcChzdWJzdHJlYW0pOwotCWludCByZXR2YWw7CisJaW50IHJldHZhbCA9IDA7CiAKIAlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfUEFVU0VfUkVMRUFTRTogLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9SRVNVTUU6IC8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1RBUlQ6CiAJCWF0b21pY19zZXQoJmRldi0+c3RyZWFtX3N0YXJ0ZWQsIDEpOwogCQlicmVhazsKKwljYXNlIFNORFJWX1BDTV9UUklHR0VSX1BBVVNFX1BVU0g6IC8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgU05EUlZfUENNX1RSSUdHRVJfU1VTUEVORDogLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBTTkRSVl9QQ01fVFJJR0dFUl9TVE9QOgotCQlhdG9taWNfc2V0KCZkZXYtPnN0cmVhbV9zdGFydGVkLCAxKTsKKwkJYXRvbWljX3NldCgmZGV2LT5zdHJlYW1fc3RhcnRlZCwgMCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHZhbCA9IC1FSU5WQUw7CiAJfQogCXNjaGVkdWxlX3dvcmsoJmRldi0+d3FfdHJpZ2dlcik7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHJldHZhbDsKIH0KIAogc3RhdGljIHNuZF9wY21fdWZyYW1lc190IHNuZF9lbTI4eHhfY2FwdHVyZV9wb2ludGVyKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbQpAQCAtNDMyLDYgKzQ0NiwxNzkgQEAKIAlyZXR1cm4gdm1hbGxvY190b19wYWdlKHBhZ2VwdHIpOwogfQogCisvKgorICogQUM5NyB2b2x1bWUgY29udHJvbCBzdXBwb3J0CisgKi8KK3N0YXRpYyBpbnQgZW0yOHh4X3ZvbF9pbmZvKHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjb250cm9sLAorCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqaW5mbykKK3sKKwlpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCWluZm8tPmNvdW50ID0gMjsKKwlpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJaW5mby0+dmFsdWUuaW50ZWdlci5tYXggPSAweDFmOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW0yOHh4X3ZvbF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdmFsdWUpCit7CisJc3RydWN0IGVtMjh4eCAqZGV2ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCXUxNiB2YWwgPSAoMHgxZiAtICh2YWx1ZS0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSAmIDB4MWYpKSB8CisJCSAgKDB4MWYgLSAodmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMV0gJiAweDFmKSkgPDwgODsKKwlpbnQgcmM7CisKKwltdXRleF9sb2NrKCZkZXYtPmxvY2spOworCXJjID0gZW0yOHh4X3JlYWRfYWM5NyhkZXYsIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGVycjsKKworCXZhbCB8PSByYyAmIDB4ODAwMDsJLyogUHJlc2VydmUgdGhlIG11dGUgZmxhZyAqLworCisJcmMgPSBlbTI4eHhfd3JpdGVfYWM5NyhkZXYsIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlLCB2YWwpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyOworCisJZHByaW50aygiJXNsZWZ0IHZvbCAlZCwgcmlnaHQgdm9sICVkICgweCUwNHgpIHRvIGFjOTcgdm9sdW1lIGNvbnRyb2wgMHglMDR4XG4iLAorCQkodmFsICYgMHg4MDAwKSA/ICJtdXRlZCAiIDogIiIsCisJCTB4MWYgLSAoKHZhbCA+PiA4KSAmIDB4MWYpLCAweDFmIC0gKHZhbCAmIDB4MWYpLAorCQl2YWwsIChpbnQpa2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpOworCitlcnI6CisJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBlbTI4eHhfdm9sX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKK3sKKwlzdHJ1Y3QgZW0yOHh4ICpkZXYgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJaW50IHZhbDsKKworCW11dGV4X2xvY2soJmRldi0+bG9jayk7CisJdmFsID0gZW0yOHh4X3JlYWRfYWM5NyhkZXYsIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKKwltdXRleF91bmxvY2soJmRldi0+bG9jayk7CisJaWYgKHZhbCA8IDApCisJCXJldHVybiB2YWw7CisKKwlkcHJpbnRrKCIlc2xlZnQgdm9sICVkLCByaWdodCB2b2wgJWQgKDB4JTA0eCkgZnJvbSBhYzk3IHZvbHVtZSBjb250cm9sIDB4JTA0eFxuIiwKKwkJKHZhbCAmIDB4ODAwMCkgPyAibXV0ZWQgIiA6ICIiLAorCQkweDFmIC0gKCh2YWwgPj4gOCkgJiAweDFmKSwgMHgxZiAtICh2YWwgJiAweDFmKSwKKwkJdmFsLCAoaW50KWtjb250cm9sLT5wcml2YXRlX3ZhbHVlKTsKKworCXZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0gMHgxZiAtICh2YWwgJiAweDFmKTsKKwl2YWx1ZS0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSA9IDB4MWYgLSAoKHZhbCA8PCA4KSAmIDB4MWYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW0yOHh4X3ZvbF9wdXRfbXV0ZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCSAgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp2YWx1ZSkKK3sKKwlzdHJ1Y3QgZW0yOHh4ICpkZXYgPSBzbmRfa2NvbnRyb2xfY2hpcChrY29udHJvbCk7CisJdTE2IHZhbCA9IHZhbHVlLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCWludCByYzsKKworCW11dGV4X2xvY2soJmRldi0+bG9jayk7CisJcmMgPSBlbTI4eHhfcmVhZF9hYzk3KGRldiwga2NvbnRyb2wtPnByaXZhdGVfdmFsdWUpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyOworCisJaWYgKHZhbCkKKwkJcmMgJj0gMHgxZjFmOworCWVsc2UKKwkJcmMgfD0gMHg4MDAwOworCisJcmMgPSBlbTI4eHhfd3JpdGVfYWM5NyhkZXYsIGtjb250cm9sLT5wcml2YXRlX3ZhbHVlLCByYyk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBlcnI7CisKKwlkcHJpbnRrKCIlc2xlZnQgdm9sICVkLCByaWdodCB2b2wgJWQgKDB4JTA0eCkgdG8gYWM5NyB2b2x1bWUgY29udHJvbCAweCUwNHhcbiIsCisJCSh2YWwgJiAweDgwMDApID8gIm11dGVkICIgOiAiIiwKKwkJMHgxZiAtICgodmFsID4+IDgpICYgMHgxZiksIDB4MWYgLSAodmFsICYgMHgxZiksCisJCXZhbCwgKGludClrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7CisKK2VycjoKKwltdXRleF91bmxvY2soJmRldi0+bG9jayk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGVtMjh4eF92b2xfZ2V0X211dGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkgICAgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdmFsdWUpCit7CisJc3RydWN0IGVtMjh4eCAqZGV2ID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCB2YWw7CisKKwltdXRleF9sb2NrKCZkZXYtPmxvY2spOworCXZhbCA9IGVtMjh4eF9yZWFkX2FjOTcoZGV2LCBrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7CisJbXV0ZXhfdW5sb2NrKCZkZXYtPmxvY2spOworCWlmICh2YWwgPCAwKQorCQlyZXR1cm4gdmFsOworCisJaWYgKHZhbCAmIDB4ODAwMCkKKwkJdmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAwOworCWVsc2UKKwkJdmFsdWUtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gPSAxOworCisJZHByaW50aygiJXNsZWZ0IHZvbCAlZCwgcmlnaHQgdm9sICVkICgweCUwNHgpIGZyb20gYWM5NyB2b2x1bWUgY29udHJvbCAweCUwNHhcbiIsCisJCSh2YWwgJiAweDgwMDApID8gIm11dGVkICIgOiAiIiwKKwkJMHgxZiAtICgodmFsID4+IDgpICYgMHgxZiksIDB4MWYgLSAodmFsICYgMHgxZiksCisJCXZhbCwgKGludClrY29udHJvbC0+cHJpdmF0ZV92YWx1ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IERFQ0xBUkVfVExWX0RCX1NDQUxFKGVtMjh4eF9kYl9zY2FsZSwgLTM0NTAsIDE1MCwgMCk7CisKK3N0YXRpYyBpbnQgZW0yOHh4X2N2b2xfbmV3KHN0cnVjdCBzbmRfY2FyZCAqY2FyZCwgc3RydWN0IGVtMjh4eCAqZGV2LAorCQkJICAgY2hhciAqbmFtZSwgaW50IGlkKQoreworCWludCBlcnI7CisJY2hhciBjdGxfbmFtZVs0NF07CisJc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bDsKKwlzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyB0bXA7CisKKwltZW1zZXQgKCZ0bXAsIDAsIHNpemVvZih0bXApKTsKKwl0bXAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwl0bXAucHJpdmF0ZV92YWx1ZSA9IGlkLAorCXRtcC5uYW1lICA9IGN0bF9uYW1lLAorCisJLyogQWRkIE11dGUgQ29udHJvbCAqLworCXNwcmludGYoY3RsX25hbWUsICIlcyBTd2l0Y2giLCBuYW1lKTsKKwl0bXAuZ2V0ICA9IGVtMjh4eF92b2xfZ2V0X211dGU7CisJdG1wLnB1dCAgPSBlbTI4eHhfdm9sX3B1dF9tdXRlOworCXRtcC5pbmZvID0gc25kX2N0bF9ib29sZWFuX21vbm9faW5mbzsKKwlrY3RsID0gc25kX2N0bF9uZXcxKCZ0bXAsIGRldik7CisJZXJyID0gc25kX2N0bF9hZGQoY2FyZCwga2N0bCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisJZHByaW50aygiQWRkZWQgY29udHJvbCAlcyBmb3IgYWM5NyB2b2x1bWUgY29udHJvbCAweCUwNHhcbiIsCisJCWN0bF9uYW1lLCBpZCk7CisKKwltZW1zZXQgKCZ0bXAsIDAsIHNpemVvZih0bXApKTsKKwl0bXAuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9NSVhFUiwKKwl0bXAucHJpdmF0ZV92YWx1ZSA9IGlkLAorCXRtcC5uYW1lICA9IGN0bF9uYW1lLAorCisJLyogQWRkIFZvbHVtZSBDb250cm9sICovCisJc3ByaW50ZihjdGxfbmFtZSwgIiVzIFZvbHVtZSIsIG5hbWUpOworCXRtcC5nZXQgICA9IGVtMjh4eF92b2xfZ2V0OworCXRtcC5wdXQgICA9IGVtMjh4eF92b2xfcHV0OworCXRtcC5pbmZvICA9IGVtMjh4eF92b2xfaW5mbzsKKwl0bXAudGx2LnAgPSBlbTI4eHhfZGJfc2NhbGUsCisJa2N0bCA9IHNuZF9jdGxfbmV3MSgmdG1wLCBkZXYpOworCWVyciA9IHNuZF9jdGxfYWRkKGNhcmQsIGtjdGwpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWRwcmludGsoIkFkZGVkIGNvbnRyb2wgJXMgZm9yIGFjOTcgdm9sdW1lIGNvbnRyb2wgMHglMDR4XG4iLAorCQljdGxfbmFtZSwgaWQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiByZWdpc3Rlci91bnJlZ2lzdGVyIGNvZGUgYW5kIGRhdGEKKyAqLwogc3RhdGljIHN0cnVjdCBzbmRfcGNtX29wcyBzbmRfZW0yOHh4X3BjbV9jYXB0dXJlID0gewogCS5vcGVuICAgICAgPSBzbmRfZW0yOHh4X2NhcHR1cmVfb3BlbiwKIAkuY2xvc2UgICAgID0gc25kX2VtMjh4eF9wY21fY2xvc2UsCkBAIC00NTIsMTcgKzYzOSwxNyBAQAogCXN0YXRpYyBpbnQgICAgICAgICAgZGV2bnI7CiAJaW50ICAgICAgICAgICAgICAgICBlcnI7CiAKLQlpZiAoZGV2LT5oYXNfYWxzYV9hdWRpbyAhPSAxKSB7CisJaWYgKCFkZXYtPmhhc19hbHNhX2F1ZGlvIHx8IGRldi0+YXVkaW9faWZudW0gPCAwKSB7CiAJCS8qIFRoaXMgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgdGhlIGV4dGVuc2lvbiAoaW4gdGhpcyBjYXNlCiAJCSAgIHRoZSBkZXZpY2UgaXMgZXhwZWN0aW5nIHRoZSBzbmQtdXNiLWF1ZGlvIG1vZHVsZSBvcgogCQkgICBkb2Vzbid0IGhhdmUgYW5hbG9nIGF1ZGlvIHN1cHBvcnQgYXQgYWxsKSAqLwogCQlyZXR1cm4gMDsKIAl9CiAKLQlwcmludGsoS0VSTl9JTkZPICJlbTI4eHgtYXVkaW8uYzogcHJvYmluZyBmb3IgZW0yOHgxICIKLQkJCSAibm9uIHN0YW5kYXJkIHVzYmF1ZGlvXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJlbTI4eHgtYXVkaW8uYzogcHJvYmluZyBmb3IgZW0yOHh4IEF1ZGlvIFZlbmRvciBDbGFzc1xuIik7CiAJcHJpbnRrKEtFUk5fSU5GTyAiZW0yOHh4LWF1ZGlvLmM6IENvcHlyaWdodCAoQykgMjAwNiBNYXJrdXMgIgogCQkJICJSZWNoYmVyZ2VyXG4iKTsKKwlwcmludGsoS0VSTl9JTkZPICJlbTI4eHgtYXVkaW8uYzogQ29weXJpZ2h0IChDKSAyMDA3LTIwMTEgTWF1cm8gQ2FydmFsaG8gQ2hlaGFiXG4iKTsKIAogCWVyciA9IHNuZF9jYXJkX2NyZWF0ZShpbmRleFtkZXZucl0sICJFbTI4eHggQXVkaW8iLCBUSElTX01PRFVMRSwgMCwKIAkJCSAgICAgICZjYXJkKTsKQEAgLTQ4OCw2ICs2NzUsMjIgQEAKIAogCUlOSVRfV09SSygmZGV2LT53cV90cmlnZ2VyLCBhdWRpb190cmlnZ2VyKTsKIAorCWlmIChkZXYtPmF1ZGlvX21vZGUuYWM5NyAhPSBFTTI4WFhfTk9fQUM5NykgeworCQllbTI4eHhfY3ZvbF9uZXcoY2FyZCwgZGV2LCAiVmlkZW8iLCBBQzk3X1ZJREVPX1ZPTCk7CisJCWVtMjh4eF9jdm9sX25ldyhjYXJkLCBkZXYsICJMaW5lIEluIiwgQUM5N19MSU5FSU5fVk9MKTsKKwkJZW0yOHh4X2N2b2xfbmV3KGNhcmQsIGRldiwgIlBob25lIiwgQUM5N19QSE9ORV9WT0wpOworCQllbTI4eHhfY3ZvbF9uZXcoY2FyZCwgZGV2LCAiTWljcm9waG9uZSIsIEFDOTdfUEhPTkVfVk9MKTsKKwkJZW0yOHh4X2N2b2xfbmV3KGNhcmQsIGRldiwgIkNEIiwgQUM5N19DRF9WT0wpOworCQllbTI4eHhfY3ZvbF9uZXcoY2FyZCwgZGV2LCAiQVVYIiwgQUM5N19BVVhfVk9MKTsKKwkJZW0yOHh4X2N2b2xfbmV3KGNhcmQsIGRldiwgIlBDTSIsIEFDOTdfUENNX09VVF9WT0wpOworCisJCWVtMjh4eF9jdm9sX25ldyhjYXJkLCBkZXYsICJNYXN0ZXIiLCBBQzk3X01BU1RFUl9WT0wpOworCQllbTI4eHhfY3ZvbF9uZXcoY2FyZCwgZGV2LCAiTGluZSIsIEFDOTdfTElORV9MRVZFTF9WT0wpOworCQllbTI4eHhfY3ZvbF9uZXcoY2FyZCwgZGV2LCAiTW9ubyIsIEFDOTdfTUFTVEVSX01PTk9fVk9MKTsKKwkJZW0yOHh4X2N2b2xfbmV3KGNhcmQsIGRldiwgIkxGRSIsIEFDOTdfTEZFX01BU1RFUl9WT0wpOworCQllbTI4eHhfY3ZvbF9uZXcoY2FyZCwgZGV2LCAiU3Vycm91bmQiLCBBQzk3X1NVUlJfTUFTVEVSX1ZPTCk7CisJfQorCiAJZXJyID0gc25kX2NhcmRfcmVnaXN0ZXIoY2FyZCk7CiAJaWYgKGVyciA8IDApIHsKIAkJc25kX2NhcmRfZnJlZShjYXJkKTsKQEAgLTUzOCw3ICs3NDEsNyBAQAogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJNYXJrdXMgUmVjaGJlcmdlciA8bXJlY2hiZXJnZXJAZ21haWwuY29tPiIpOwotTU9EVUxFX0FVVEhPUigiTWF1cm8gQ2FydmFsaG8gQ2hlaGFiIDxtY2hlaGFiQGluZnJhZGVhZC5vcmc+Iik7CitNT0RVTEVfQVVUSE9SKCJNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAcmVkaGF0LmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiRW0yOHh4IEF1ZGlvIGRyaXZlciIpOwogCiBtb2R1bGVfaW5pdChlbTI4eHhfYWxzYV9yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY2FyZHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jYXJkcy5jCmluZGV4IDRlMzczNzUuLjNlMzk1OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jYXJkcy5jCkBAIC0yODksNyArMjg5LDcgQEAKIAl7CS0xLAkJLTEsCS0xLAktMX0sCiB9OwogCi0vKiAyMDEzOjAyNGYgUENUViBTeXN0ZW1zIG5hbm9TdGljayBUMiAyOTBlCisvKiAyMDEzOjAyNGYgUENUViBuYW5vU3RpY2sgVDIgMjkwZQogICogR1BJT182IC0gZGVtb2QgcmVzZXQKICAqIEdQSU9fNyAtIExFRAogICovCkBAIC0zMDAsNiArMzAwLDIzIEBACiAJey0xLAkJCS0xLAktMSwJCS0xfSwKIH07CiAKKyNpZiAwCitzdGF0aWMgc3RydWN0IGVtMjh4eF9yZWdfc2VxIHRlcnJhdGVjX2g1X2dwaW9bXSA9IHsKKwl7RU0yOFhYX1IwOF9HUElPLAkweGZmLAkweGZmLAkxMH0sCisJe0VNMjg3NF9SODBfR1BJTywJMHhmNiwJMHhmZiwJMTAwfSwKKwl7RU0yODc0X1I4MF9HUElPLAkweGYyLAkweGZmLAk1MH0sCisJe0VNMjg3NF9SODBfR1BJTywJMHhmNiwJMHhmZiwJNTB9LAorCXsgLTEsCQkJLTEsCS0xLAktMX0sCit9OworCitzdGF0aWMgc3RydWN0IGVtMjh4eF9yZWdfc2VxIHRlcnJhdGVjX2g1X2RpZ2l0YWxbXSA9IHsKKwl7RU0yODc0X1I4MF9HUElPLAkweGY2LAkweGZmLAkxMH0sCisJe0VNMjg3NF9SODBfR1BJTywJMHhlNiwJMHhmZiwJMTAwfSwKKwl7RU0yODc0X1I4MF9HUElPLAkweGE2LAkweGZmLAkxMH0sCisJeyAtMSwJCQktMSwJLTEsCS0xfSwKK307CisjZW5kaWYKKwogLyoKICAqICBCb2FyZCBkZWZpbml0aW9ucwogICovCkBAIC04NDMsNiArODYwLDE5IEBACiAJCQkuZ3BpbyAgICAgPSB0ZXJyYXRlY19jaW5lcmd5X1VTQl9YU19GUl9hbmFsb2csCiAJCX0gfSwKIAl9LAorCVtFTTI4ODRfQk9BUkRfVEVSUkFURUNfSDVdID0geworCQkubmFtZSAgICAgICAgID0gIlRlcnJhdGVjIENpbmVyZ3kgSDUiLAorCQkuaGFzX2R2YiAgICAgID0gMSwKKyNpZiAwCisJCS50dW5lcl90eXBlICAgPSBUVU5FUl9QSElMSVBTX1REQTgyOTAsCisJCS50dW5lcl9hZGRyICAgPSAweDQxLAorCQkuZHZiX2dwaW8gICAgID0gdGVycmF0ZWNfaDVfZGlnaXRhbCwgLyogRklYTUU6IHByb2JhYmx5IHdyb25nICovCisJCS50dW5lcl9ncGlvICAgPSB0ZXJyYXRlY19oNV9ncGlvLAorI2VuZGlmCisJCS5pMmNfc3BlZWQgICAgPSBFTTI4NzRfSTJDX1NFQ09OREFSWV9CVVNfU0VMRUNUIHwKKwkJCQlFTTI4WFhfSTJDX0NMS19XQUlUX0VOQUJMRSB8CisJCQkJRU0yOFhYX0kyQ19GUkVRXzQwMF9LSFosCisJfSwKIAlbRU0yODgwX0JPQVJEX0hBVVBQQVVHRV9XSU5UVl9IVlJfOTAwXSA9IHsKIAkJLm5hbWUgICAgICAgICA9ICJIYXVwcGF1Z2UgV2luVFYgSFZSIDkwMCIsCiAJCS50ZGE5ODg3X2NvbmYgPSBUREE5ODg3X1BSRVNFTlQsCkBAIC0xMjU5LDcgKzEyODksNyBAQAogCQl9IH0sCiAJfSwKIAotCVtFTTI4NzRfTEVBREVSU0hJUF9JU0RCVF0gPSB7CisJW0VNMjg3NF9CT0FSRF9MRUFERVJTSElQX0lTREJUXSA9IHsKIAkJLmkyY19zcGVlZCAgICAgID0gRU0yODc0X0kyQ19TRUNPTkRBUllfQlVTX1NFTEVDVCB8CiAJCQkJICBFTTI4WFhfSTJDX0NMS19XQUlUX0VOQUJMRSB8CiAJCQkJICBFTTI4WFhfSTJDX0ZSRVFfMTAwX0tIWiwKQEAgLTEzMTksNyArMTM0OSw2IEBACiAJfSwKIAlbRU0yODgwX0JPQVJEX0tXT1JMRF9EVkJfMzA1VV0gPSB7CiAJCS5uYW1lCSAgICAgID0gIktXb3JsZCBEVkItVCAzMDVVIiwKLQkJLnZhbGlkICAgICAgICA9IEVNMjhYWF9CT0FSRF9OT1RfVkFMSURBVEVELAogCQkudHVuZXJfdHlwZSAgID0gVFVORVJfWEMyMDI4LAogCQkudHVuZXJfZ3BpbyAgID0gZGVmYXVsdF90dW5lcl9ncGlvLAogCQkuZGVjb2RlciAgICAgID0gRU0yOFhYX1RWUDUxNTAsCkBAIC0xNzcwLDE2ICsxNzk5LDE2IEBACiAJCS5kdmJfZ3BpbyAgID0ga3dvcmxkX2EzNDBfZGlnaXRhbCwKIAkJLnR1bmVyX2dwaW8gPSBkZWZhdWx0X3R1bmVyX2dwaW8sCiAJfSwKLQkvKiAyMDEzOjAyNGYgUENUViBTeXN0ZW1zIG5hbm9TdGljayBUMiAyOTBlLgorCS8qIDIwMTM6MDI0ZiBQQ1RWIG5hbm9TdGljayBUMiAyOTBlLgogCSAqIEVtcGlhIEVNMjgxNzQsIFNvbnkgQ1hEMjgyMFIgYW5kIE5YUCBUREExODI3MUhEL0MyICovCiAJW0VNMjgxNzRfQk9BUkRfUENUVl8yOTBFXSA9IHsKKwkJLm5hbWUgICAgICAgICAgPSAiUENUViBuYW5vU3RpY2sgVDIgMjkwZSIsCiAJCS5pMmNfc3BlZWQgICAgICA9IEVNMjg3NF9JMkNfU0VDT05EQVJZX0JVU19TRUxFQ1QgfAogCQkJRU0yOFhYX0kyQ19DTEtfV0FJVF9FTkFCTEUgfCBFTTI4WFhfSTJDX0ZSRVFfMTAwX0tIWiwKLQkJLnhjbGsgICAgICAgICAgPSBFTTI4WFhfWENMS19GUkVRVUVOQ1lfMTJNSFosCi0JCS5uYW1lICAgICAgICAgID0gIlBDVFYgU3lzdGVtcyBuYW5vU3RpY2sgVDIgMjkwZSIsCiAJCS50dW5lcl90eXBlICAgID0gVFVORVJfQUJTRU5ULAogCQkudHVuZXJfZ3BpbyAgICA9IHBjdHZfMjkwZSwKIAkJLmhhc19kdmIgICAgICAgPSAxLAorCQkuaXJfY29kZXMgICAgICA9IFJDX01BUF9QSU5OQUNMRV9QQ1RWX0hELAogCX0sCiB9OwogY29uc3QgdW5zaWduZWQgaW50IGVtMjh4eF9iY291bnQgPSBBUlJBWV9TSVpFKGVtMjh4eF9ib2FyZHMpOwpAQCAtMTg1NSw4ICsxODg0LDEwIEBACiAJeyBVU0JfREVWSUNFKDB4MGNjZCwgMHgwMDQyKSwKIAkJCS5kcml2ZXJfaW5mbyA9IEVNMjg4Ml9CT0FSRF9URVJSQVRFQ19IWUJSSURfWFMgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwY2NkLCAweDAwNDMpLAotCQkJLmRyaXZlcl9pbmZvID0gRU0yODcwX0JPQVJEX1RFUlJBVEVDX1hTIH0sCi0JeyBVU0JfREVWSUNFKDB4MGNjZCwgMHgwMDQ3KSwKKwkJCS5kcml2ZXJfaW5mbyA9IEVNMjg4NF9CT0FSRF9URVJSQVRFQ19INSB9LAorCXsgVVNCX0RFVklDRSgweDBjY2QsIDB4MTBhMiksCS8qIFJldi4gMSAqLworCQkJLmRyaXZlcl9pbmZvID0gRU0yODg0X0JPQVJEX1RFUlJBVEVDX0g1IH0sCisJeyBVU0JfREVWSUNFKDB4MGNjZCwgMHgxMGFkKSwJLyogUmV2LiAyICovCiAJCQkuZHJpdmVyX2luZm8gPSBFTTI4ODBfQk9BUkRfVEVSUkFURUNfUFJPRElHWV9YUyB9LAogCXsgVVNCX0RFVklDRSgweDBjY2QsIDB4MDA4NCksCiAJCQkuZHJpdmVyX2luZm8gPSBFTTI4NjBfQk9BUkRfVEVSUkFURUNfQVYzNTAgfSwKQEAgLTE5MzcsNyArMTk2OCw3IEBACiAJezB4Nzc4MDAwODAsIEVNMjg2MF9CT0FSRF9UVlA1MTUwX1JFRkVSRU5DRV9ERVNJR04sIFRVTkVSX0FCU0VOVH0sCiAJezB4YzUxMjAwZTMsIEVNMjgyMF9CT0FSRF9HQURNRUlfVFZSMjAwLCBUVU5FUl9MR19QQUxfTkVXX1RBUEN9LAogCXsweDRiYTUwMDgwLCBFTTI4NjFfQk9BUkRfR0FETUVJX1VUVjMzMFBMVVMsIFRVTkVSX1RORl81MzM1TUZ9LAotCXsweDZiODAwMDgwLCBFTTI4NzRfTEVBREVSU0hJUF9JU0RCVCwgVFVORVJfQUJTRU5UfSwKKwl7MHg2YjgwMDA4MCwgRU0yODc0X0JPQVJEX0xFQURFUlNISVBfSVNEQlQsIFRVTkVSX0FCU0VOVH0sCiB9OwogCiAvKiBJMkMgcG9zc2libGUgYWRkcmVzcyB0byBzYWE3MTE1LCB0dnA1MTUwLCBtc3AzNDAwLCB0dmF1ZGlvICovCkBAIC0yNjYwLDEwICsyNjkxLDkgQEAKIAkJCS5hZGRyID0gMHhiYSA+PiAxLAogCQkJLnBsYXRmb3JtX2RhdGEgPSAmcGRhdGEsCiAJCX07Ci0JCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7CiAKIAkJcGRhdGEueHRhbCA9IGRldi0+c2Vuc29yX3h0YWw7Ci0JCXNkID0gdjRsMl9pMmNfbmV3X3N1YmRldl9ib2FyZCgmZGV2LT52NGwyX2RldiwgJmRldi0+aTJjX2FkYXAsCisJCXY0bDJfaTJjX25ld19zdWJkZXZfYm9hcmQoJmRldi0+djRsMl9kZXYsICZkZXYtPmkyY19hZGFwLAogCQkJCSZtdDl2MDExX2luZm8sIE5VTEwpOwogCX0KIApAQCAtMjg0MiwxMSArMjg3MiwyNiBAQAogCQkJZW0yOHh4X2luZm8oImNoaXAgSUQgaXMgZW0yODgyL2VtMjg4M1xuIik7CiAJCQlkZXYtPndhaXRfYWZ0ZXJfd3JpdGUgPSAwOwogCQkJYnJlYWs7CisJCWNhc2UgQ0hJUF9JRF9FTTI4ODQ6CisJCQllbTI4eHhfaW5mbygiY2hpcCBJRCBpcyBlbTI4ODRcbiIpOworCQkJZGV2LT5yZWdfZ3Bpb19udW0gPSBFTTI4NzRfUjgwX0dQSU87CisJCQlkZXYtPndhaXRfYWZ0ZXJfd3JpdGUgPSAwOworCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQllbTI4eHhfaW5mbygiZW0yOHh4IGNoaXAgSUQgPSAlZFxuIiwgZGV2LT5jaGlwX2lkKTsKIAkJfQogCX0KIAorCWlmIChkZXYtPmlzX2F1ZGlvX29ubHkpIHsKKwkJZXJyQ29kZSA9IGVtMjh4eF9hdWRpb19zZXR1cChkZXYpOworCQlpZiAoZXJyQ29kZSkKKwkJCXJldHVybiAtRU5PREVWOworCQllbTI4eHhfYWRkX2ludG9fZGV2bGlzdChkZXYpOworCQllbTI4eHhfaW5pdF9leHRlbnNpb24oZGV2KTsKKworCQlyZXR1cm4gMDsKKwl9CisKIAkvKiBQcmVwb3B1bGF0ZSBjYWNoZWQgR1BPIHJlZ2lzdGVyIGNvbnRlbnQgKi8KIAlyZXR2YWwgPSBlbTI4eHhfcmVhZF9yZWcoZGV2LCBkZXYtPnJlZ19ncG9fbnVtKTsKIAlpZiAocmV0dmFsID49IDApCkBAIC0yOTQ3LDYgKzI5OTIsOSBAQAogCXJldHVybiByZXR2YWw7CiB9CiAKKy8qIGhpZ2ggYmFuZHdpZHRoIG11bHRpcGxpZXIsIGFzIGVuY29kZWQgaW4gaGlnaHNwZWVkIGVuZHBvaW50IGRlc2NyaXB0b3JzICovCisjZGVmaW5lIGhiX211bHQod01heFBhY2tldFNpemUpICgxICsgKCgod01heFBhY2tldFNpemUpID4+IDExKSAmIDB4MDMpKQorCiAvKgogICogZW0yOHh4X3VzYl9wcm9iZSgpCiAgKiBjaGVja3MgZm9yIHN1cHBvcnRlZCBkZXZpY2VzCkBAIC0yOTU2LDE1ICszMDA0LDE1IEBACiB7CiAJY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplbmRwb2ludDsKIAlzdHJ1Y3QgdXNiX2RldmljZSAqdWRldjsKLQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqdWlmOwogCXN0cnVjdCBlbTI4eHggKmRldiA9IE5VTEw7CiAJaW50IHJldHZhbDsKLQlpbnQgaSwgbnIsIGlmbnVtLCBpc29jX3BpcGU7CisJYm9vbCBpc19hdWRpb19vbmx5ID0gZmFsc2UsIGhhc19hdWRpbyA9IGZhbHNlOworCWludCBpLCBuciwgaXNvY19waXBlOworCWNvbnN0IGludCBpZm51bSA9IGludGVyZmFjZS0+YWx0c2V0dGluZ1swXS5kZXNjLmJJbnRlcmZhY2VOdW1iZXI7CiAJY2hhciAqc3BlZWQ7CiAJY2hhciBkZXNjclsyNTVdID0gIiI7CiAKIAl1ZGV2ID0gdXNiX2dldF9kZXYoaW50ZXJmYWNlX3RvX3VzYmRldihpbnRlcmZhY2UpKTsKLQlpZm51bSA9IGludGVyZmFjZS0+YWx0c2V0dGluZ1swXS5kZXNjLmJJbnRlcmZhY2VOdW1iZXI7CiAKIAkvKiBDaGVjayB0byBzZWUgbmV4dCBmcmVlIGRldmljZSBhbmQgbWFyayBhcyB1c2VkICovCiAJbnIgPSBmaW5kX2ZpcnN0X3plcm9fYml0KCZlbTI4eHhfZGV2dXNlZCwgRU0yOFhYX01BWEJPQVJEUyk7CkBAIC0yOTg0LDYgKzMwMzIsMTkgQEAKIAkJZ290byBlcnI7CiAJfQogCisJLyogR2V0IGVuZHBvaW50cyAqLworCWZvciAoaSA9IDA7IGkgPCBpbnRlcmZhY2UtPm51bV9hbHRzZXR0aW5nOyBpKyspIHsKKwkJaW50IGVwOworCisJCWZvciAoZXAgPSAwOyBlcCA8IGludGVyZmFjZS0+YWx0c2V0dGluZ1tpXS5kZXNjLmJOdW1FbmRwb2ludHM7IGVwKyspIHsKKwkJCXN0cnVjdCB1c2JfaG9zdF9lbmRwb2ludAkqZTsKKwkJCWUgPSAmaW50ZXJmYWNlLT5hbHRzZXR0aW5nW2ldLmVuZHBvaW50W2VwXTsKKworCQkJaWYgKGUtPmRlc2MuYkVuZHBvaW50QWRkcmVzcyA9PSAweDgzKQorCQkJCWhhc19hdWRpbyA9IHRydWU7CisJCX0KKwl9CisKIAllbmRwb2ludCA9ICZpbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nLT5lbmRwb2ludFswXS5kZXNjOwogCiAJLyogY2hlY2sgaWYgdGhlIGRldmljZSBoYXMgdGhlIGlzbyBpbiBlbmRwb2ludCBhdCB0aGUgY29ycmVjdCBwbGFjZSAqLwpAQCAtMzAwMywxOSArMzA2NCwyMiBAQAogCQkJY2hlY2tfaW50ZXJmYWNlID0gMDsKIAogCQlpZiAoIWNoZWNrX2ludGVyZmFjZSkgewotCQkJZW0yOHh4X2VycihEUklWRVJfTkFNRSAiIHZpZGVvIGRldmljZSAoJTA0eDolMDR4KTogIgotCQkJCSJpbnRlcmZhY2UgJWksIGNsYXNzICVpIGZvdW5kLlxuIiwKLQkJCQlsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKSwKLQkJCQlsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCksCi0JCQkJaWZudW0sCi0JCQkJaW50ZXJmYWNlLT5hbHRzZXR0aW5nWzBdLmRlc2MuYkludGVyZmFjZUNsYXNzKTsKKwkJCWlmIChoYXNfYXVkaW8pIHsKKwkJCQlpc19hdWRpb19vbmx5ID0gdHJ1ZTsKKwkJCX0gZWxzZSB7CisJCQkJZW0yOHh4X2VycihEUklWRVJfTkFNRSAiIHZpZGVvIGRldmljZSAoJTA0eDolMDR4KTogIgorCQkJCQkiaW50ZXJmYWNlICVpLCBjbGFzcyAlaSBmb3VuZC5cbiIsCisJCQkJCWxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpLAorCQkJCQlsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCksCisJCQkJCWlmbnVtLAorCQkJCQlpbnRlcmZhY2UtPmFsdHNldHRpbmdbMF0uZGVzYy5iSW50ZXJmYWNlQ2xhc3MpOworCQkJCWVtMjh4eF9lcnIoRFJJVkVSX05BTUUgIiBUaGlzIGlzIGFuIGFuY2lsaWFyeSAiCisJCQkJCSJpbnRlcmZhY2Ugbm90IHVzZWQgYnkgdGhlIGRyaXZlclxuIik7CiAKLQkJCWVtMjh4eF9lcnIoRFJJVkVSX05BTUUgIiBUaGlzIGlzIGFuIGFuY2lsaWFyeSAiCi0JCQkJImludGVyZmFjZSBub3QgdXNlZCBieSB0aGUgZHJpdmVyXG4iKTsKLQotCQkJZW0yOHh4X2RldnVzZWQgJj0gfigxPDxucik7Ci0JCQlyZXR2YWwgPSAtRU5PREVWOwotCQkJZ290byBlcnI7CisJCQkJZW0yOHh4X2RldnVzZWQgJj0gfigxPDxucik7CisJCQkJcmV0dmFsID0gLUVOT0RFVjsKKwkJCQlnb3RvIGVycjsKKwkJCX0KIAkJfQogCX0KIApAQCAtMzA0NSw4ICszMTA5LDggQEAKIAlpZiAoKmRlc2NyKQogCQlzdHJsY2F0KGRlc2NyLCAiICIsIHNpemVvZihkZXNjcikpOwogCi0JcHJpbnRrKERSSVZFUl9OQU1FICI6IE5ldyBkZXZpY2UgJXNAICVzIE1icHMgIgotCQkiKCUwNHg6JTA0eCwgaW50ZXJmYWNlICVkLCBjbGFzcyAlZClcbiIsCisJcHJpbnRrKEtFUk5fSU5GTyBEUklWRVJfTkFNRQorCQkiOiBOZXcgZGV2aWNlICVzQCAlcyBNYnBzICglMDR4OiUwNHgsIGludGVyZmFjZSAlZCwgY2xhc3MgJWQpXG4iLAogCQlkZXNjciwKIAkJc3BlZWQsCiAJCWxlMTZfdG9fY3B1KHVkZXYtPmRlc2NyaXB0b3IuaWRWZW5kb3IpLApAQCAtMzA1NCw2ICszMTE4LDExIEBACiAJCWlmbnVtLAogCQlpbnRlcmZhY2UtPmFsdHNldHRpbmctPmRlc2MuYkludGVyZmFjZU51bWJlcik7CiAKKwlpZiAoaGFzX2F1ZGlvKQorCQlwcmludGsoS0VSTl9JTkZPIERSSVZFUl9OQU1FCisJCSAgICAgICAiOiBBdWRpbyBWZW5kb3IgQ2xhc3MgaW50ZXJmYWNlICVpIGZvdW5kXG4iLAorCQkgICAgICAgaWZudW0pOworCiAJLyoKIAkgKiBNYWtlIHN1cmUgd2UgaGF2ZSA0ODAgTWJwcyBvZiBiYW5kd2lkdGgsIG90aGVyd2lzZSB0aGluZ3MgbGlrZQogCSAqIHZpZGVvIHN0cmVhbSB3b3VsZG4ndCBsaWtlbHkgd29yaywgc2luY2UgMTIgTWJwcyBpcyBnZW5lcmFsbHkKQEAgLTMwODksMTAgKzMxNTgsMTMgQEAKIAlkZXYtPmRldm5vID0gbnI7CiAJZGV2LT5tb2RlbCA9IGlkLT5kcml2ZXJfaW5mbzsKIAlkZXYtPmFsdCAgID0gLTE7CisJZGV2LT5pc19hdWRpb19vbmx5ID0gaXNfYXVkaW9fb25seTsKKwlkZXYtPmhhc19hbHNhX2F1ZGlvID0gaGFzX2F1ZGlvOworCWRldi0+YXVkaW9faWZudW0gPSBpZm51bTsKIAogCS8qIENoZWNrcyBpZiBhdWRpbyBpcyBwcm92aWRlZCBieSBzb21lIGludGVyZmFjZSAqLwogCWZvciAoaSA9IDA7IGkgPCB1ZGV2LT5jb25maWctPmRlc2MuYk51bUludGVyZmFjZXM7IGkrKykgewotCQl1aWYgPSB1ZGV2LT5jb25maWctPmludGVyZmFjZVtpXTsKKwkJc3RydWN0IHVzYl9pbnRlcmZhY2UgKnVpZiA9IHVkZXYtPmNvbmZpZy0+aW50ZXJmYWNlW2ldOwogCQlpZiAodWlmLT5hbHRzZXR0aW5nWzBdLmRlc2MuYkludGVyZmFjZUNsYXNzID09IFVTQl9DTEFTU19BVURJTykgewogCQkJZGV2LT5oYXNfYXVkaW9fY2xhc3MgPSAxOwogCQkJYnJlYWs7CkBAIC0zMTAwLDkgKzMxNzIsNyBAQAogCX0KIAogCS8qIGNvbXB1dGUgYWx0ZXJuYXRlIG1heCBwYWNrZXQgc2l6ZXMgKi8KLQl1aWYgPSB1ZGV2LT5hY3Rjb25maWctPmludGVyZmFjZVswXTsKLQotCWRldi0+bnVtX2FsdCA9IHVpZi0+bnVtX2FsdHNldHRpbmc7CisJZGV2LT5udW1fYWx0ID0gaW50ZXJmYWNlLT5udW1fYWx0c2V0dGluZzsKIAlkZXYtPmFsdF9tYXhfcGt0X3NpemUgPSBrbWFsbG9jKDMyICogZGV2LT5udW1fYWx0LCBHRlBfS0VSTkVMKTsKIAogCWlmIChkZXYtPmFsdF9tYXhfcGt0X3NpemUgPT0gTlVMTCkgewpAQCAtMzExNCwxNCArMzE4NCwyMSBAQAogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBkZXYtPm51bV9hbHQgOyBpKyspIHsKLQkJdTE2IHRtcCA9IGxlMTZfdG9fY3B1KHVpZi0+YWx0c2V0dGluZ1tpXS5lbmRwb2ludFtpc29jX3BpcGVdLmRlc2Mud01heFBhY2tldFNpemUpOwotCQlkZXYtPmFsdF9tYXhfcGt0X3NpemVbaV0gPQotCQkgICAgKHRtcCAmIDB4MDdmZikgKiAoKCh0bXAgJiAweDE4MDApID4+IDExKSArIDEpOworCQl1MTYgdG1wID0gbGUxNl90b19jcHUoaW50ZXJmYWNlLT5hbHRzZXR0aW5nW2ldLmVuZHBvaW50W2lzb2NfcGlwZV0uZGVzYy53TWF4UGFja2V0U2l6ZSk7CisJCXVuc2lnbmVkIGludCBzaXplID0gdG1wICYgMHg3ZmY7CisKKwkJaWYgKHVkZXYtPnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKQorCQkJc2l6ZSA9IHNpemUgKiBoYl9tdWx0KHRtcCk7CisKKwkJZGV2LT5hbHRfbWF4X3BrdF9zaXplW2ldID0gc2l6ZTsKIAl9CiAKIAlpZiAoKGNhcmRbbnJdID49IDApICYmIChjYXJkW25yXSA8IGVtMjh4eF9iY291bnQpKQogCQlkZXYtPm1vZGVsID0gY2FyZFtucl07CiAKKwkvKiBzYXZlIG91ciBkYXRhIHBvaW50ZXIgaW4gdGhpcyBpbnRlcmZhY2UgZGV2aWNlICovCisJdXNiX3NldF9pbnRmZGF0YShpbnRlcmZhY2UsIGRldik7CisKIAkvKiBhbGxvY2F0ZSBkZXZpY2Ugc3RydWN0ICovCiAJbXV0ZXhfaW5pdCgmZGV2LT5sb2NrKTsKIAltdXRleF9sb2NrKCZkZXYtPmxvY2spOwpAQCAtMzEzMyw5ICszMjEwLDYgQEAKIAkJZ290byBlcnI7CiAJfQogCi0JLyogc2F2ZSBvdXIgZGF0YSBwb2ludGVyIGluIHRoaXMgaW50ZXJmYWNlIGRldmljZSAqLwotCXVzYl9zZXRfaW50ZmRhdGEoaW50ZXJmYWNlLCBkZXYpOwotCiAJcmVxdWVzdF9tb2R1bGVzKGRldik7CiAKIAkvKiBTaG91bGQgYmUgdGhlIGxhc3QgdGhpbmcgdG8gZG8sIHRvIGF2b2lkIG5ld2VyIHVkZXYncyB0bwpAQCAtMzE2NCw2ICszMjM4LDEzIEBACiAJaWYgKCFkZXYpCiAJCXJldHVybjsKIAorCWlmIChkZXYtPmlzX2F1ZGlvX29ubHkpIHsKKwkJbXV0ZXhfbG9jaygmZGV2LT5sb2NrKTsKKwkJZW0yOHh4X2Nsb3NlX2V4dGVuc2lvbihkZXYpOworCQltdXRleF91bmxvY2soJmRldi0+bG9jayk7CisJCXJldHVybjsKKwl9CisKIAllbTI4eHhfaW5mbygiZGlzY29ubmVjdGluZyAlc1xuIiwgZGV2LT52ZGV2LT5uYW1lKTsKIAogCWZsdXNoX3JlcXVlc3RfbW9kdWxlcyhkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1jb3JlLmMKaW5kZXggZTMzZjE0NS4uNTdiMWI1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtY29yZS5jCkBAIC0yMTEsNiArMjExLDcgQEAKIHsKIAlyZXR1cm4gZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCByZWcsICZ2YWwsIDEpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoZW0yOHh4X3dyaXRlX3JlZyk7CiAKIC8qCiAgKiBlbTI4eHhfd3JpdGVfcmVnX2JpdHMoKQpAQCAtMjg2LDYgKzI4Nyw3IEBACiAJCXJldHVybiByZXQ7CiAJcmV0dXJuIGxlMTZfdG9fY3B1KHZhbCk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChlbTI4eHhfcmVhZF9hYzk3KTsKIAogLyoKICAqIGVtMjh4eF93cml0ZV9hYzk3KCkKQEAgLTMxMywxMyArMzE1LDE0IEBACiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGVtMjh4eF93cml0ZV9hYzk3KTsKIAotc3RydWN0IGVtMjh4eF92b2xfdGFibGUgeworc3RydWN0IGVtMjh4eF92b2xfaXRhYmxlIHsKIAllbnVtIGVtMjh4eF9hbXV4IG11eDsKIAl1OAkJIHJlZzsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgZW0yOHh4X3ZvbF90YWJsZSBpbnB1dHNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgZW0yOHh4X3ZvbF9pdGFibGUgaW5wdXRzW10gPSB7CiAJeyBFTTI4WFhfQU1VWF9WSURFTywgCUFDOTdfVklERU9fVk9MICAgfSwKIAl7IEVNMjhYWF9BTVVYX0xJTkVfSU4sCUFDOTdfTElORUlOX1ZPTCAgfSwKIAl7IEVNMjhYWF9BTVVYX1BIT05FLAlBQzk3X1BIT05FX1ZPTCAgIH0sCkBAIC00MDMsNyArNDA2LDEyIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBlbTI4eHhfdm9sX3RhYmxlIG91dHB1dHNbXSA9IHsKK3N0cnVjdCBlbTI4eHhfdm9sX290YWJsZSB7CisJZW51bSBlbTI4eHhfYW91dCBtdXg7CisJdTgJCSByZWc7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGVtMjh4eF92b2xfb3RhYmxlIG91dHB1dHNbXSA9IHsKIAl7IEVNMjhYWF9BT1VUX01BU1RFUiwgQUM5N19NQVNURVJfVk9MICAgICAgfSwKIAl7IEVNMjhYWF9BT1VUX0xJTkUsICAgQUM5N19MSU5FX0xFVkVMX1ZPTCAgfSwKIAl7IEVNMjhYWF9BT1VUX01PTk8sICAgQUM5N19NQVNURVJfTU9OT19WT0wgfSwKQEAgLTQ5MiwxNyArNTAwLDEzIEBACiAJaWYgKGRldi0+Y2hpcF9pZCA9PSBDSElQX0lEX0VNMjg3MCB8fCBkZXYtPmNoaXBfaWQgPT0gQ0hJUF9JRF9FTTI4NzQKIAkJfHwgZGV2LT5jaGlwX2lkID09IENISVBfSURfRU0yODE3NCkgewogCQkvKiBEaWdpdGFsIG9ubHkgZGV2aWNlIC0gZG9uJ3QgbG9hZCBhbnkgYWxzYSBtb2R1bGUgKi8KLQkJZGV2LT5hdWRpb19tb2RlLmhhc19hdWRpbyA9IDA7Ci0JCWRldi0+aGFzX2F1ZGlvX2NsYXNzID0gMDsKLQkJZGV2LT5oYXNfYWxzYV9hdWRpbyA9IDA7CisJCWRldi0+YXVkaW9fbW9kZS5oYXNfYXVkaW8gPSBmYWxzZTsKKwkJZGV2LT5oYXNfYXVkaW9fY2xhc3MgPSBmYWxzZTsKKwkJZGV2LT5oYXNfYWxzYV9hdWRpbyA9IGZhbHNlOwogCQlyZXR1cm4gMDsKIAl9CiAKLQkvKiBJZiBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IFVzYiBBdWRpbyBDbGFzcywgdXNlIHZlbmRvciBjbGFzcyAqLwotCWlmICghZGV2LT5oYXNfYXVkaW9fY2xhc3MpCi0JCWRldi0+aGFzX2Fsc2FfYXVkaW8gPSAxOwotCi0JZGV2LT5hdWRpb19tb2RlLmhhc19hdWRpbyA9IDE7CisJZGV2LT5hdWRpb19tb2RlLmhhc19hdWRpbyA9IHRydWU7CiAKIAkvKiBTZWUgaG93IHRoaXMgZGV2aWNlIGlzIGNvbmZpZ3VyZWQgKi8KIAljZmcgPSBlbTI4eHhfcmVhZF9yZWcoZGV2LCBFTTI4WFhfUjAwX0NISVBDRkcpOwpAQCAtNTEyLDggKzUxNiw4IEBACiAJCWNmZyA9IEVNMjhYWF9DSElQQ0ZHX0FDOTc7IC8qIEJlIGNvbnNlcnZhdGl2ZSAqLwogCX0gZWxzZSBpZiAoKGNmZyAmIEVNMjhYWF9DSElQQ0ZHX0FVRElPTUFTSykgPT0gMHgwMCkgewogCQkvKiBUaGUgZGV2aWNlIGRvZXNuJ3QgaGF2ZSB2ZW5kb3IgYXVkaW8gYXQgYWxsICovCi0JCWRldi0+aGFzX2Fsc2FfYXVkaW8gPSAwOwotCQlkZXYtPmF1ZGlvX21vZGUuaGFzX2F1ZGlvID0gMDsKKwkJZGV2LT5oYXNfYWxzYV9hdWRpbyA9IGZhbHNlOworCQlkZXYtPmF1ZGlvX21vZGUuaGFzX2F1ZGlvID0gZmFsc2U7CiAJCXJldHVybiAwOwogCX0gZWxzZSBpZiAoKGNmZyAmIEVNMjhYWF9DSElQQ0ZHX0FVRElPTUFTSykgPT0KIAkJICAgRU0yOFhYX0NISVBDRkdfSTJTXzNfU0FNUFJBVEVTKSB7CkBAIC01NDIsOCArNTQ2LDggQEAKIAkJICovCiAJCWVtMjh4eF93YXJuKCJBQzk3IGNoaXAgdHlwZSBjb3VsZG4ndCBiZSBkZXRlcm1pbmVkXG4iKTsKIAkJZGV2LT5hdWRpb19tb2RlLmFjOTcgPSBFTTI4WFhfTk9fQUM5NzsKLQkJZGV2LT5oYXNfYWxzYV9hdWRpbyA9IDA7Ci0JCWRldi0+YXVkaW9fbW9kZS5oYXNfYXVkaW8gPSAwOworCQlkZXYtPmhhc19hbHNhX2F1ZGlvID0gZmFsc2U7CisJCWRldi0+YXVkaW9fbW9kZS5oYXNfYXVkaW8gPSBmYWxzZTsKIAkJZ290byBpbml0X2F1ZGlvOwogCX0KIApAQCAtNjE1LDcgKzYxOSw5IEBACiB7CiAJaW50IHJjOwogCi0JaWYgKGRldi0+Y2hpcF9pZCA9PSBDSElQX0lEX0VNMjg3NCB8fCBkZXYtPmNoaXBfaWQgPT0gQ0hJUF9JRF9FTTI4MTc0KSB7CisJaWYgKGRldi0+Y2hpcF9pZCA9PSBDSElQX0lEX0VNMjg3NCB8fAorCSAgICBkZXYtPmNoaXBfaWQgPT0gQ0hJUF9JRF9FTTI4ODQgfHwKKwkgICAgZGV2LT5jaGlwX2lkID09IENISVBfSURfRU0yODE3NCkgewogCQkvKiBUaGUgVHJhbnNwb3J0IFN0cmVhbSBFbmFibGUgUmVnaXN0ZXIgbW92ZWQgaW4gZW0yODc0ICovCiAJCWlmICghc3RhcnQpIHsKIAkJCXJjID0gZW0yOHh4X3dyaXRlX3JlZ19iaXRzKGRldiwgRU0yODc0X1I1Rl9UU19FTkFCTEUsCkBAIC04ODQsNiArODkwLDcgQEAKIAl9CiAJcmV0dXJuIHJjOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoZW0yOHh4X2dwaW9fc2V0KTsKIAogaW50IGVtMjh4eF9zZXRfbW9kZShzdHJ1Y3QgZW0yOHh4ICpkZXYsIGVudW0gZW0yOHh4X21vZGUgc2V0X21vZGUpCiB7CkBAIC05MTcsNyArOTI0LDcgQEAKIHN0YXRpYyB2b2lkIGVtMjh4eF9pcnFfY2FsbGJhY2soc3RydWN0IHVyYiAqdXJiKQogewogCXN0cnVjdCBlbTI4eHggKmRldiA9IHVyYi0+Y29udGV4dDsKLQlpbnQgcmMsIGk7CisJaW50IGk7CiAKIAlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CiAJY2FzZSAwOiAgICAgICAgICAgICAvKiBzdWNjZXNzICovCkBAIC05MzQsNyArOTQxLDcgQEAKIAogCS8qIENvcHkgZGF0YSBmcm9tIFVSQiAqLwogCXNwaW5fbG9jaygmZGV2LT5zbG9jayk7Ci0JcmMgPSBkZXYtPmlzb2NfY3RsLmlzb2NfY29weShkZXYsIHVyYik7CisJZGV2LT5pc29jX2N0bC5pc29jX2NvcHkoZGV2LCB1cmIpOwogCXNwaW5fdW5sb2NrKCZkZXYtPnNsb2NrKTsKIAogCS8qIFJlc2V0IHVyYiBidWZmZXJzICovCkBAIC0xMTA2LDE3ICsxMTEzLDE5IEBACiBpbnQgZW0yOHh4X2lzb2NfZHZiX21heF9wYWNrZXRzaXplKHN0cnVjdCBlbTI4eHggKmRldikKIHsKIAl1bnNpZ25lZCBpbnQgY2hpcF9jZmcyOwotCXVuc2lnbmVkIGludCBwYWNrZXRfc2l6ZSA9IDU2NDsKKwl1bnNpZ25lZCBpbnQgcGFja2V0X3NpemU7CiAKLQlpZiAoZGV2LT5jaGlwX2lkID09IENISVBfSURfRU0yODc0KSB7Ci0JCS8qIEZJWE1FIC0gZm9yIG5vdyBhc3N1bWUgNTY0IGxpa2UgaXQgd2FzIGJlZm9yZSwgYnV0IHRoZQotCQkgICBlbTI4NzQgY29kZSBzaG91bGQgYmUgYWRkZWQgdG8gcmV0dXJuIHRoZSBwcm9wZXIgdmFsdWUuLi4gKi8KLQkJcGFja2V0X3NpemUgPSA1NjQ7Ci0JfSBlbHNlIGlmIChkZXYtPmNoaXBfaWQgPT0gQ0hJUF9JRF9FTTI4MTc0KSB7Ci0JCS8qIEZJWE1FIHNhbWUgYXMgZW0yODc0LiA1NjQgd2FzIGVub3VnaCBmb3IgMjIgTWJpdCBEVkItVAotCQkgICBidXQgdG9vIG11Y2ggZm9yIDQ0IE1iaXQgRFZCLUMuICovCi0JCXBhY2tldF9zaXplID0gNzUyOwotCX0gZWxzZSB7CisJc3dpdGNoIChkZXYtPmNoaXBfaWQpIHsKKwljYXNlIENISVBfSURfRU0yNzEwOgorCWNhc2UgQ0hJUF9JRF9FTTI3NTA6CisJY2FzZSBDSElQX0lEX0VNMjgwMDoKKwljYXNlIENISVBfSURfRU0yODIwOgorCWNhc2UgQ0hJUF9JRF9FTTI4NDA6CisJY2FzZSBDSElQX0lEX0VNMjg2MDoKKwkJLyogTm8gRFZCIHN1cHBvcnQgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBDSElQX0lEX0VNMjg3MDoKKwljYXNlIENISVBfSURfRU0yODgzOgogCQkvKiBUUyBtYXggcGFja2V0IHNpemUgc3RvcmVkIGluIGJpdHMgMS0wIG9mIFIwMSAqLwogCQljaGlwX2NmZzIgPSBlbTI4eHhfcmVhZF9yZWcoZGV2LCBFTTI4WFhfUjAxX0NISVBDRkcyKTsKIAkJc3dpdGNoIChjaGlwX2NmZzIgJiBFTTI4WFhfQ0hJUENGRzJfVFNfUEFDS0VUU0laRV9NQVNLKSB7CkBAIC0xMTMzLDkgKzExNDIsMjQgQEAKIAkJCXBhY2tldF9zaXplID0gNzUyOwogCQkJYnJlYWs7CiAJCX0KKwkJYnJlYWs7CisJY2FzZSBDSElQX0lEX0VNMjg3NDoKKwkJLyoKKwkJICogRklYTUU6IGZvciBub3cgYXNzdW1lcyA1NjQgbGlrZSBpdCB3YXMgYmVmb3JlLCBidXQgdGhlCisJCSAqIGVtMjg3NCBjb2RlIHNob3VsZCBiZSBhZGRlZCB0byByZXR1cm4gdGhlIHByb3BlciB2YWx1ZQorCQkgKi8KKwkJcGFja2V0X3NpemUgPSA1NjQ7CisJCWJyZWFrOworCWNhc2UgQ0hJUF9JRF9FTTI4ODQ6CisJY2FzZSBDSElQX0lEX0VNMjgxNzQ6CisJZGVmYXVsdDoKKwkJLyoKKwkJICogRklYTUU6IHNhbWUgYXMgZW0yODc0LiA1NjQgd2FzIGVub3VnaCBmb3IgMjIgTWJpdCBEVkItVAorCQkgKiBidXQgbm90IGVub3VnaCBmb3IgNDQgTWJpdCBEVkItQy4KKwkJICovCisJCXBhY2tldF9zaXplID0gNzUyOwogCX0KIAotCWVtMjh4eF9jb3JlZGJnKCJkdmIgbWF4IHBhY2tldCBzaXplPSVkXG4iLCBwYWNrZXRfc2l6ZSk7CiAJcmV0dXJuIHBhY2tldF9zaXplOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoZW0yOHh4X2lzb2NfZHZiX21heF9wYWNrZXRzaXplKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1kdmIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1kdmIuYwppbmRleCA3OTA0Y2E0Li5lNTkxNmRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtZHZiLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWR2Yi5jCkBAIC0xLDcgKzEsNyBAQAogLyoKICBEVkIgZGV2aWNlIGRyaXZlciBmb3IgZW0yOHh4CiAKLSAoYykgMjAwOCBNYXVybyBDYXJ2YWxobyBDaGVoYWIgPG1jaGVoYWJAaW5mcmFkZWFkLm9yZz4KKyAoYykgMjAwOC0yMDExIE1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPgogCiAgKGMpIDIwMDggRGV2aW4gSGVpdG11ZWxsZXIgPGRldmluLmhlaXRtdWVsbGVyQGdtYWlsLmNvbT4KIAktIEZpeGVzIGZvciB0aGUgZHJpdmVyIHRvIHByb3Blcmx5IHdvcmsgd2l0aCBIVlItOTUwCkBAIC00MCw2ICs0MCw4IEBACiAjaW5jbHVkZSAiczkyMS5oIgogI2luY2x1ZGUgImRyeGQuaCIKICNpbmNsdWRlICJjeGQyODIwci5oIgorI2luY2x1ZGUgInRkYTE4MjcxYzJkZC5oIgorI2luY2x1ZGUgImRyeGsuaCIKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJkcml2ZXIgZm9yIGVtMjh4eCBiYXNlZCBEVkIgY2FyZHMiKTsKIE1PRFVMRV9BVVRIT1IoIk1hdXJvIENhcnZhbGhvIENoZWhhYiA8bWNoZWhhYkBpbmZyYWRlYWQub3JnPiIpOwpAQCAtNzMsNiArNzUsMTEgQEAKIAlzdHJ1Y3QgZG14X2Zyb250ZW5kICAgICAgICBmZV9odzsKIAlzdHJ1Y3QgZG14X2Zyb250ZW5kICAgICAgICBmZV9tZW07CiAJc3RydWN0IGR2Yl9uZXQgICAgICAgICAgICAgbmV0OworCisJLyogRHVlIHRvIERSWC1LIC0gcHJvYmFibHkgbmVlZCBjaGFuZ2VzICovCisJaW50ICgqZ2F0ZV9jdHJsKShzdHJ1Y3QgZHZiX2Zyb250ZW5kICosIGludCk7CisJc3RydWN0IHNlbWFwaG9yZSAgICAgIHBsbF9tdXRleDsKKwlib29sCQkJZG9udF9hdHRhY2hfZmUxOwogfTsKIAogCkBAIC0xNjAsNiArMTY3LDExIEBACiAJCXJldHVybiByYzsKIAogCW1heF9kdmJfcGFja2V0X3NpemUgPSBlbTI4eHhfaXNvY19kdmJfbWF4X3BhY2tldHNpemUoZGV2KTsKKwlpZiAobWF4X2R2Yl9wYWNrZXRfc2l6ZSA8IDApCisJCXJldHVybiBtYXhfZHZiX3BhY2tldF9zaXplOworCWRwcmludGsoMSwgIlVzaW5nICVkIGJ1ZmZlcnMgZWFjaCB3aXRoICVkIGJ5dGVzXG4iLAorCQlFTTI4WFhfRFZCX05VTV9CVUZTLAorCQltYXhfZHZiX3BhY2tldF9zaXplKTsKIAogCXJldHVybiBlbTI4eHhfaW5pdF9pc29jKGRldiwgRU0yOFhYX0RWQl9NQVhfUEFDS0VUUywKIAkJCQlFTTI4WFhfRFZCX05VTV9CVUZTLCBtYXhfZHZiX3BhY2tldF9zaXplLApAQCAtMjk1LDYgKzMwNyw3OSBAQAogCS5kaXNhYmxlX2kyY19nYXRlX2N0cmwgPSAxLAogfTsKIAorc3RydWN0IGRyeGtfY29uZmlnIHRlcnJhdGVjX2g1X2RyeGsgPSB7CisJLmFkciA9IDB4MjksCisJLnNpbmdsZV9tYXN0ZXIgPSAxLAorCS5ub19pMmNfYnJpZGdlID0gMSwKKwkubWljcm9jb2RlX25hbWUgPSAiZHZiLXVzYi10ZXJyYXRlYy1oNS1kcnhrLmZ3IiwKK307CisKK3N0YXRpYyBpbnQgZHJ4a19nYXRlX2N0cmwoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUsIGludCBlbmFibGUpCit7CisJc3RydWN0IGVtMjh4eF9kdmIgKmR2YiA9IGZlLT5zZWNfcHJpdjsKKwlpbnQgc3RhdHVzOworCisJaWYgKCFkdmIpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGVuYWJsZSkgeworCQlkb3duKCZkdmItPnBsbF9tdXRleCk7CisJCXN0YXR1cyA9IGR2Yi0+Z2F0ZV9jdHJsKGZlLCAxKTsKKwl9IGVsc2UgeworCQlzdGF0dXMgPSBkdmItPmdhdGVfY3RybChmZSwgMCk7CisJCXVwKCZkdmItPnBsbF9tdXRleCk7CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkIHRlcnJhdGVjX2g1X2luaXQoc3RydWN0IGVtMjh4eCAqZGV2KQoreworCWludCBpOworCXN0cnVjdCBlbTI4eHhfcmVnX3NlcSB0ZXJyYXRlY19oNV9pbml0W10gPSB7CisJCXtFTTI4WFhfUjA4X0dQSU8sCTB4ZmYsCTB4ZmYsCTEwfSwKKwkJe0VNMjg3NF9SODBfR1BJTywJMHhmNiwJMHhmZiwJMTAwfSwKKwkJe0VNMjg3NF9SODBfR1BJTywJMHhmMiwJMHhmZiwJNTB9LAorCQl7RU0yODc0X1I4MF9HUElPLAkweGY2LAkweGZmLAkxMDB9LAorCQl7IC0xLCAgICAgICAgICAgICAgICAgICAtMSwgICAgIC0xLCAgICAgLTF9LAorCX07CisJc3RydWN0IGVtMjh4eF9yZWdfc2VxIHRlcnJhdGVjX2g1X2VuZFtdID0geworCQl7RU0yODc0X1I4MF9HUElPLAkweGU2LAkweGZmLAkxMDB9LAorCQl7RU0yODc0X1I4MF9HUElPLAkweGE2LAkweGZmLAk1MH0sCisJCXtFTTI4NzRfUjgwX0dQSU8sCTB4ZTYsCTB4ZmYsCTEwMH0sCisJCXsgLTEsICAgICAgICAgICAgICAgICAgIC0xLCAgICAgLTEsICAgICAtMX0sCisJfTsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIHJbNF07CisJCWludCBsZW47CisJfSByZWdzW10gPSB7CisJCXt7IDB4MDYsIDB4MDIsIDB4MDAsIDB4MzEgfSwgNH0sCisJCXt7IDB4MDEsIDB4MDIgfSwgMn0sCisJCXt7IDB4MDEsIDB4MDIsIDB4MDAsIDB4YzYgfSwgNH0sCisJCXt7IDB4MDEsIDB4MDAgfSwgMn0sCisJCXt7IDB4MDEsIDB4MDAsIDB4ZmYsIDB4YWYgfSwgNH0sCisJCXt7IDB4MDEsIDB4MDAsIDB4MDMsIDB4YTAgfSwgNH0sCisJCXt7IDB4MDEsIDB4MDAgfSwgMn0sCisJCXt7IDB4MDEsIDB4MDAsIDB4NzMsIDB4YWYgfSwgNH0sCisJCXt7IDB4MDQsIDB4MDAgfSwgMn0sCisJCXt7IDB4MDAsIDB4MDQgfSwgMn0sCisJCXt7IDB4MDAsIDB4MDQsIDB4MDAsIDB4MGEgfSwgNH0sCisJCXt7IDB4MDQsIDB4MTQgfSwgMn0sCisJCXt7IDB4MDQsIDB4MTQsIDB4MDAsIDB4MDAgfSwgNH0sCisJfTsKKworCWVtMjh4eF9ncGlvX3NldChkZXYsIHRlcnJhdGVjX2g1X2luaXQpOworCWVtMjh4eF93cml0ZV9yZWcoZGV2LCBFTTI4WFhfUjA2X0kyQ19DTEssIDB4NDApOworCW1zbGVlcCgxMCk7CisJZW0yOHh4X3dyaXRlX3JlZyhkZXYsIEVNMjhYWF9SMDZfSTJDX0NMSywgMHg0NSk7CisJbXNsZWVwKDEwKTsKKworCWRldi0+aTJjX2NsaWVudC5hZGRyID0gMHg4MiA+PiAxOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmVncyk7IGkrKykKKwkJaTJjX21hc3Rlcl9zZW5kKCZkZXYtPmkyY19jbGllbnQsIHJlZ3NbaV0uciwgcmVnc1tpXS5sZW4pOworCWVtMjh4eF9ncGlvX3NldChkZXYsIHRlcnJhdGVjX2g1X2VuZCk7Cit9OworCiBzdGF0aWMgaW50IG10MzUyX3RlcnJhdGVjX3hzX2luaXQoc3RydWN0IGR2Yl9mcm9udGVuZCAqZmUpCiB7CiAJLyogVmFsdWVzIGV4dHJhY3RlZCBmcm9tIGEgVVNCIHRyYWNlIG9mIHRoZSBUZXJyYXRlYyBXaW5kb3dzIGRyaXZlciAqLwpAQCAtNTE2LDcgKzYwMSw3IEBACiAJaWYgKGR2Yi0+ZmVbMV0pCiAJCWR2Yl91bnJlZ2lzdGVyX2Zyb250ZW5kKGR2Yi0+ZmVbMV0pOwogCWR2Yl91bnJlZ2lzdGVyX2Zyb250ZW5kKGR2Yi0+ZmVbMF0pOwotCWlmIChkdmItPmZlWzFdKQorCWlmIChkdmItPmZlWzFdICYmICFkdmItPmRvbnRfYXR0YWNoX2ZlMSkKIAkJZHZiX2Zyb250ZW5kX2RldGFjaChkdmItPmZlWzFdKTsKIAlkdmJfZnJvbnRlbmRfZGV0YWNoKGR2Yi0+ZmVbMF0pOwogCWR2Yl91bnJlZ2lzdGVyX2FkYXB0ZXIoJmR2Yi0+YWRhcHRlcik7CkBAIC01NDYsNyArNjMxLDcgQEAKIAllbTI4eHhfc2V0X21vZGUoZGV2LCBFTTI4WFhfRElHSVRBTF9NT0RFKTsKIAkvKiBpbml0IGZyb250ZW5kICovCiAJc3dpdGNoIChkZXYtPm1vZGVsKSB7Ci0JY2FzZSBFTTI4NzRfTEVBREVSU0hJUF9JU0RCVDoKKwljYXNlIEVNMjg3NF9CT0FSRF9MRUFERVJTSElQX0lTREJUOgogCQlkdmItPmZlWzBdID0gZHZiX2F0dGFjaChzOTIxX2F0dGFjaCwKIAkJCQkmc2hhcnBfaXNkYnQsICZkZXYtPmkyY19hZGFwKTsKIApAQCAtNjg5LDYgKzc3NCw0MSBAQAogCQkJfQogCQl9CiAJCWJyZWFrOworCWNhc2UgRU0yODg0X0JPQVJEX1RFUlJBVEVDX0g1OgorCQl0ZXJyYXRlY19oNV9pbml0KGRldik7CisKKwkJZHZiLT5kb250X2F0dGFjaF9mZTEgPSAxOworCisJCWR2Yi0+ZmVbMF0gPSBkdmJfYXR0YWNoKGRyeGtfYXR0YWNoLCAmdGVycmF0ZWNfaDVfZHJ4aywgJmRldi0+aTJjX2FkYXAsICZkdmItPmZlWzFdKTsKKwkJaWYgKCFkdmItPmZlWzBdKSB7CisJCQlyZXN1bHQgPSAtRUlOVkFMOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCisJCS8qIEZJWE1FOiBkbyB3ZSBuZWVkIGEgcGxsIHNlbWFwaG9yZT8gKi8KKwkJZHZiLT5mZVswXS0+c2VjX3ByaXYgPSBkdmI7CisJCXNlbWFfaW5pdCgmZHZiLT5wbGxfbXV0ZXgsIDEpOworCQlkdmItPmdhdGVfY3RybCA9IGR2Yi0+ZmVbMF0tPm9wcy5pMmNfZ2F0ZV9jdHJsOworCQlkdmItPmZlWzBdLT5vcHMuaTJjX2dhdGVfY3RybCA9IGRyeGtfZ2F0ZV9jdHJsOworCQlkdmItPmZlWzFdLT5pZCA9IDE7CisKKwkJLyogQXR0YWNoIHRkYTE4MjcxIHRvIERWQi1DIGZyb250ZW5kICovCisJCWlmIChkdmItPmZlWzBdLT5vcHMuaTJjX2dhdGVfY3RybCkKKwkJCWR2Yi0+ZmVbMF0tPm9wcy5pMmNfZ2F0ZV9jdHJsKGR2Yi0+ZmVbMF0sIDEpOworCQlpZiAoIWR2Yl9hdHRhY2godGRhMTgyNzFjMmRkX2F0dGFjaCwgZHZiLT5mZVswXSwgJmRldi0+aTJjX2FkYXAsIDB4NjApKSB7CisJCQlyZXN1bHQgPSAtRUlOVkFMOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCQlpZiAoZHZiLT5mZVswXS0+b3BzLmkyY19nYXRlX2N0cmwpCisJCQlkdmItPmZlWzBdLT5vcHMuaTJjX2dhdGVfY3RybChkdmItPmZlWzBdLCAwKTsKKworCQkvKiBIYWNrIC0gbmVlZGVkIGJ5IGRyeGsvdGRhMTgyNzFjMmRkICovCisJCWR2Yi0+ZmVbMV0tPnR1bmVyX3ByaXYgPSBkdmItPmZlWzBdLT50dW5lcl9wcml2OworCQltZW1jcHkoJmR2Yi0+ZmVbMV0tPm9wcy50dW5lcl9vcHMsCisJCSAgICAgICAmZHZiLT5mZVswXS0+b3BzLnR1bmVyX29wcywKKwkJICAgICAgIHNpemVvZihkdmItPmZlWzBdLT5vcHMudHVuZXJfb3BzKSk7CisKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZW0yOHh4X2VycmRldigiLzI6IFRoZSBmcm9udGVuZCBvZiB5b3VyIERWQi9BVFNDIGNhcmQiCiAJCQkJIiBpc24ndCBzdXBwb3J0ZWQgeWV0XG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pMmMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pMmMuYwppbmRleCA0NzM5ZmM3Li4zNmY1YTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtaTJjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LWkyYy5jCkBAIC0xODEsMTYgKzE4MSwyNSBAQAogCiAvKgogICogZW0yOHh4X2kyY19zZW5kX2J5dGVzKCkKLSAqIHVudGVzdGVkIGZvciBtb3JlIHRoYW4gNCBieXRlcwogICovCiBzdGF0aWMgaW50IGVtMjh4eF9pMmNfc2VuZF9ieXRlcyh2b2lkICpkYXRhLCB1bnNpZ25lZCBjaGFyIGFkZHIsIGNoYXIgKmJ1ZiwKIAkJCQkgc2hvcnQgbGVuLCBpbnQgc3RvcCkKIHsKIAlpbnQgd3Jjb3VudCA9IDA7CiAJc3RydWN0IGVtMjh4eCAqZGV2ID0gKHN0cnVjdCBlbTI4eHggKilkYXRhOworCWludCB3cml0ZV90aW1lb3V0LCByZXQ7CiAKIAl3cmNvdW50ID0gZGV2LT5lbTI4eHhfd3JpdGVfcmVnc19yZXEoZGV2LCBzdG9wID8gMiA6IDMsIGFkZHIsIGJ1ZiwgbGVuKTsKIAorCS8qIFNlZW1zIHRvIGJlIHJlcXVpcmVkIGFmdGVyIGEgd3JpdGUgKi8KKwlmb3IgKHdyaXRlX3RpbWVvdXQgPSBFTTI4MDBfSTJDX1dSSVRFX1RJTUVPVVQ7IHdyaXRlX3RpbWVvdXQgPiAwOworCSAgICAgd3JpdGVfdGltZW91dCAtPSA1KSB7CisJCXJldCA9IGRldi0+ZW0yOHh4X3JlYWRfcmVnKGRldiwgMHgwNSk7CisJCWlmICghcmV0KQorCQkJYnJlYWs7CisJCW1zbGVlcCg1KTsKKwl9CisKIAlyZXR1cm4gd3Jjb3VudDsKIH0KIApAQCAtMjE4LDkgKzIyNyw3IEBACiAgKi8KIHN0YXRpYyBpbnQgZW0yOHh4X2kyY19jaGVja19mb3JfZGV2aWNlKHN0cnVjdCBlbTI4eHggKmRldiwgdW5zaWduZWQgY2hhciBhZGRyKQogewotCWNoYXIgbXNnOwogCWludCByZXQ7Ci0JbXNnID0gYWRkcjsKIAogCXJldCA9IGRldi0+ZW0yOHh4X3JlYWRfcmVnX3JlcShkZXYsIDIsIGFkZHIpOwogCWlmIChyZXQgPCAwKSB7CkBAIC0zMzIsNyArMzM5LDkgQEAKIAlzdHJ1Y3QgZW0yOHh4X2VlcHJvbSAqZW1fZWVwcm9tID0gKHZvaWQgKillZWRhdGE7CiAJaW50IGksIGVyciwgc2l6ZSA9IGxlbiwgYmxvY2s7CiAKLQlpZiAoZGV2LT5jaGlwX2lkID09IENISVBfSURfRU0yODc0IHx8IGRldi0+Y2hpcF9pZCA9PSBDSElQX0lEX0VNMjgxNzQpIHsKKwlpZiAoZGV2LT5jaGlwX2lkID09IENISVBfSURfRU0yODc0IHx8CisJICAgIGRldi0+Y2hpcF9pZCA9PSBDSElQX0lEX0VNMjgxNzQgfHwKKwkgICAgZGV2LT5jaGlwX2lkID09IENISVBfSURfRU0yODg0KSB7CiAJCS8qIEVtcGlhIHN3aXRjaGVkIHRvIGEgMTYtYml0IGFkZHJlc3NhYmxlIGVlcHJvbSBpbiBuZXdlcgogCQkgICBkZXZpY2VzLiAgV2hpbGUgd2UgY291bGQgY2VydGFpbmx5IHdyaXRlIGEgcm91dGluZSB0byByZWFkCiAJCSAgIHRoZSBlZXByb20sIHRoZXJlIGlzIG5vdGhpbmcgb2YgdXNlIGluIHRoZXJlIHRoYXQgY2Fubm90IGJlCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtaW5wdXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pbnB1dC5jCmluZGV4IGJhMWJhODYuLjVkMTJiMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pbnB1dC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1pbnB1dC5jCkBAIC0zNzIsNiArMzcyLDcgQEAKIAkJaXItPmdldF9rZXkgPSBkZWZhdWx0X3BvbGxpbmdfZ2V0a2V5OwogCQlicmVhazsKIAljYXNlIENISVBfSURfRU0yODc0OgorCWNhc2UgQ0hJUF9JRF9FTTI4MTc0OgogCQlpci0+Z2V0X2tleSA9IGVtMjg3NF9wb2xsaW5nX2dldGtleTsKIAkJZW0yOHh4X3dyaXRlX3JlZ3MoZGV2LCBFTTI4NzRfUjUwX0lSX0NPTkZJRywgJmlyX2NvbmZpZywgMSk7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LXJlZy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LXJlZy5oCmluZGV4IGU5MmEyOGUuLjY2Zjc5MjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC1yZWcuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtcmVnLmgKQEAgLTIwMSw2ICsyMDEsNyBAQAogCUNISVBfSURfRU0yODcwID0gMzUsCiAJQ0hJUF9JRF9FTTI4ODMgPSAzNiwKIAlDSElQX0lEX0VNMjg3NCA9IDY1LAorCUNISVBfSURfRU0yODg0ID0gNjgsCiAJQ0hJUF9JRF9FTTI4MTc0ID0gMTEzLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtdmlkZW8uYwppbmRleCA3YjY0NjFkLi5kMTc2ZGMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2VtMjh4eC9lbTI4eHgtdmlkZW8uYwpAQCAtMzIsNyArMzIsNiBAQAogI2luY2x1ZGUgPGxpbnV4L2JpdG1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtNTAsNyArNDksOCBAQAogCQkgICAgICAiU2FzY2hhIFNvbW1lciA8c2FzY2hhc29tbWVyQGZyZWVuZXQuZGU+IgogCiAjZGVmaW5lIERSSVZFUl9ERVNDICAgICAgICAgIkVtcGlhIGVtMjh4eCBiYXNlZCBVU0IgdmlkZW8gZGV2aWNlIGRyaXZlciIKLSNkZWZpbmUgRU0yOFhYX1ZFUlNJT05fQ09ERSAgS0VSTkVMX1ZFUlNJT04oMCwgMSwgMikKKworI2RlZmluZSBFTTI4WFhfVkVSU0lPTiAiMC4xLjMiCiAKICNkZWZpbmUgZW0yOHh4X3ZpZGVvZGJnKGZtdCwgYXJnLi4uKSBkbyB7XAogCWlmICh2aWRlb19kZWJ1ZykgXApAQCAtNzIsNiArNzIsNyBAQAogTU9EVUxFX0FVVEhPUihEUklWRVJfQVVUSE9SKTsKIE1PRFVMRV9ERVNDUklQVElPTihEUklWRVJfREVTQyk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTihFTTI4WFhfVkVSU0lPTik7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgdmlkZW9fbnJbXSA9IHtbMCAuLi4gKEVNMjhYWF9NQVhCT0FSRFMgLSAxKV0gPSBVTlNFVCB9Owogc3RhdGljIHVuc2lnbmVkIGludCB2YmlfbnJbXSAgID0ge1swIC4uLiAoRU0yOFhYX01BWEJPQVJEUyAtIDEpXSA9IFVOU0VUIH07CkBAIC0xNzU3LDggKzE3NTgsNiBAQAogCXN0cmxjcHkoY2FwLT5jYXJkLCBlbTI4eHhfYm9hcmRzW2Rldi0+bW9kZWxdLm5hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKIAl1c2JfbWFrZV9wYXRoKGRldi0+dWRldiwgY2FwLT5idXNfaW5mbywgc2l6ZW9mKGNhcC0+YnVzX2luZm8pKTsKIAotCWNhcC0+dmVyc2lvbiA9IEVNMjhYWF9WRVJTSU9OX0NPREU7Ci0KIAljYXAtPmNhcGFiaWxpdGllcyA9CiAJCQlWNEwyX0NBUF9TTElDRURfVkJJX0NBUFRVUkUgfAogCQkJVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8CkBAIC0xOTc2LDcgKzE5NzUsNiBAQAogCXN0cmxjcHkoY2FwLT5jYXJkLCBlbTI4eHhfYm9hcmRzW2Rldi0+bW9kZWxdLm5hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKIAl1c2JfbWFrZV9wYXRoKGRldi0+dWRldiwgY2FwLT5idXNfaW5mbywgc2l6ZW9mKGNhcC0+YnVzX2luZm8pKTsKIAotCWNhcC0+dmVyc2lvbiA9IEVNMjhYWF9WRVJTSU9OX0NPREU7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9UVU5FUjsKIAlyZXR1cm4gMDsKIH0KQEAgLTI0NTAsMTAgKzI0NDgsOCBAQAogICAgICAgdTggdmFsOwogCWludCByZXQ7CiAKLQlwcmludGsoS0VSTl9JTkZPICIlczogdjRsMiBkcml2ZXIgdmVyc2lvbiAlZC4lZC4lZFxuIiwKLQkJZGV2LT5uYW1lLAotCQkoRU0yOFhYX1ZFUlNJT05fQ09ERSA+PiAxNikgJiAweGZmLAotCQkoRU0yOFhYX1ZFUlNJT05fQ09ERSA+PiA4KSAmIDB4ZmYsIEVNMjhYWF9WRVJTSU9OX0NPREUgJiAweGZmKTsKKwlwcmludGsoS0VSTl9JTkZPICIlczogdjRsMiBkcml2ZXIgdmVyc2lvbiAlc1xuIiwKKwkJZGV2LT5uYW1lLCBFTTI4WFhfVkVSU0lPTik7CiAKIAkvKiBzZXQgZGVmYXVsdCBub3JtICovCiAJZGV2LT5ub3JtID0gZW0yOHh4X3ZpZGVvX3RlbXBsYXRlLmN1cnJlbnRfbm9ybTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZW0yOHh4L2VtMjh4eC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LmgKaW5kZXggM2NjYTMzMS4uZDgwNjU4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9lbTI4eHgvZW0yOHh4LmgKQEAgLTExNyw5ICsxMTcsOSBAQAogI2RlZmluZSBFTTI4MDBfQk9BUkRfVkMyMTFBCQkJICA3NAogI2RlZmluZSBFTTI4ODJfQk9BUkRfRElLT01fREszMDAJCSAgNzUKICNkZWZpbmUgRU0yODcwX0JPQVJEX0tXT1JMRF9BMzQwCQkgIDc2Ci0jZGVmaW5lIEVNMjg3NF9MRUFERVJTSElQX0lTREJUCQkJICA3NworI2RlZmluZSBFTTI4NzRfQk9BUkRfTEVBREVSU0hJUF9JU0RCVAkJICA3NwogI2RlZmluZSBFTTI4MTc0X0JPQVJEX1BDVFZfMjkwRSAgICAgICAgICAgICAgICAgICA3OAotCisjZGVmaW5lIEVNMjg4NF9CT0FSRF9URVJSQVRFQ19INQkJICA3OQogCiAvKiBMaW1pdHMgbWluaW11bSBhbmQgZGVmYXVsdCBudW1iZXIgb2YgYnVmZmVycyAqLwogI2RlZmluZSBFTTI4WFhfTUlOX0JVRiA0CkBAIC00ODcsNiArNDg3LDggQEAKIAlpbnQgZGV2bm87CQkvKiBtYXJrcyB0aGUgbnVtYmVyIG9mIHRoaXMgZGV2aWNlICovCiAJZW51bSBlbTI4eHhfY2hpcF9pZCBjaGlwX2lkOwogCisJaW50IGF1ZGlvX2lmbnVtOworCiAJc3RydWN0IHY0bDJfZGV2aWNlIHY0bDJfZGV2OwogCXN0cnVjdCBlbTI4eHhfYm9hcmQgYm9hcmQ7CiAKQEAgLTUwMyw2ICs1MDUsNyBAQAogCiAJdW5zaWduZWQgaW50IGhhc19hdWRpb19jbGFzczoxOwogCXVuc2lnbmVkIGludCBoYXNfYWxzYV9hdWRpbzoxOworCXVuc2lnbmVkIGludCBpc19hdWRpb19vbmx5OjE7CiAKIAkvKiBDb250cm9scyBhdWRpbyBzdHJlYW1pbmcgKi8KIAlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd3FfdHJpZ2dlcjsgICAgICAgICAgICAgIC8qIFRyaWdnZXIgdG8gc3RhcnQvc3RvcCBhdWRpbyBmb3IgYWxzYSBtb2R1bGUgKi8KQEAgLTY5Nyw2ICs3MDAsOSBAQAogdm9pZCBlbTI4eHhfcmVsZWFzZV9yZXNvdXJjZXMoc3RydWN0IGVtMjh4eCAqZGV2KTsKIAogLyogUHJvdmlkZWQgYnkgZW0yOHh4LWlucHV0LmMgKi8KKworI2lmZGVmIENPTkZJR19WSURFT19FTTI4WFhfUkMKKwogaW50IGVtMjh4eF9nZXRfa2V5X3RlcnJhdGVjKHN0cnVjdCBJUl9pMmMgKmlyLCB1MzIgKmlyX2tleSwgdTMyICppcl9yYXcpOwogaW50IGVtMjh4eF9nZXRfa2V5X2VtX2hhdXAoc3RydWN0IElSX2kyYyAqaXIsIHUzMiAqaXJfa2V5LCB1MzIgKmlyX3Jhdyk7CiBpbnQgZW0yOHh4X2dldF9rZXlfcGlubmFjbGVfdXNiX2dyZXkoc3RydWN0IElSX2kyYyAqaXIsIHUzMiAqaXJfa2V5LApAQCAtNzA5LDYgKzcxNSwyMCBAQAogaW50IGVtMjh4eF9pcl9pbml0KHN0cnVjdCBlbTI4eHggKmRldik7CiBpbnQgZW0yOHh4X2lyX2Zpbmkoc3RydWN0IGVtMjh4eCAqZGV2KTsKIAorI2Vsc2UKKworI2RlZmluZSBlbTI4eHhfZ2V0X2tleV90ZXJyYXRlYwkJCU5VTEwKKyNkZWZpbmUgZW0yOHh4X2dldF9rZXlfZW1faGF1cAkJCU5VTEwKKyNkZWZpbmUgZW0yOHh4X2dldF9rZXlfcGlubmFjbGVfdXNiX2dyZXkJTlVMTAorI2RlZmluZSBlbTI4eHhfZ2V0X2tleV93aW5mYXN0X3VzYmlpX2RlbHV4ZQlOVUxMCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbTI4eHhfcmVnaXN0ZXJfc25hcHNob3RfYnV0dG9uKHN0cnVjdCBlbTI4eHggKmRldikge30KK3N0YXRpYyBpbmxpbmUgdm9pZCBlbTI4eHhfZGVyZWdpc3Rlcl9zbmFwc2hvdF9idXR0b24oc3RydWN0IGVtMjh4eCAqZGV2KSB7fQorc3RhdGljIGlubGluZSBpbnQgZW0yOHh4X2lyX2luaXQoc3RydWN0IGVtMjh4eCAqZGV2KSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBlbTI4eHhfaXJfZmluaShzdHJ1Y3QgZW0yOHh4ICpkZXYpIHsgcmV0dXJuIDA7IH0KKworI2VuZGlmCisKIC8qIFByb3ZpZGVkIGJ5IGVtMjh4eC12YmkuYyAqLwogZXh0ZXJuIHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZV9vcHMgZW0yOHh4X3ZiaV9xb3BzOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL2V0NjF4MjUxLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2V0NjF4MjUxL2V0NjF4MjUxLmgKaW5kZXggYmY2NjE4OS4uMTRiYjkwNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9ldDYxeDI1MS9ldDYxeDI1MS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvZXQ2MXgyNTEuaApAQCAtMjEsNyArMjEsNiBAQAogI2lmbmRlZiBfRVQ2MVgyNTFfSF8KICNkZWZpbmUgX0VUNjFYMjUxX0hfCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZXQ2MXgyNTEvZXQ2MXgyNTFfY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9ldDYxeDI1MS9ldDYxeDI1MV9jb3JlLmMKaW5kZXggYTk4Mjc1MC4uOWExZTgwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9ldDYxeDI1MS9ldDYxeDI1MV9jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9ldDYxeDI1MS9ldDYxeDI1MV9jb3JlLmMKQEAgLTE4LDYgKzE4LDcgQEAKICAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLiAgICAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgpAQCAtNDgsOCArNDksNyBAQAogI2RlZmluZSBFVDYxWDI1MV9NT0RVTEVfQVVUSE9SICAiKEMpIDIwMDYtMjAwNyBMdWNhIFJpc29saWEiCiAjZGVmaW5lIEVUNjFYMjUxX0FVVEhPUl9FTUFJTCAgICI8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4iCiAjZGVmaW5lIEVUNjFYMjUxX01PRFVMRV9MSUNFTlNFICJHUEwiCi0jZGVmaW5lIEVUNjFYMjUxX01PRFVMRV9WRVJTSU9OICIxOjEuMDkiCi0jZGVmaW5lIEVUNjFYMjUxX01PRFVMRV9WRVJTSU9OX0NPREUgIEtFUk5FTF9WRVJTSU9OKDEsIDEsIDkpCisjZGVmaW5lIEVUNjFYMjUxX01PRFVMRV9WRVJTSU9OICIxLjEuMTAiCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApAQCAtMTU3OSw3ICsxNTc5LDcgQEAKIHsKIAlzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5IGNhcCA9IHsKIAkJLmRyaXZlciA9ICJldDYxeDI1MSIsCi0JCS52ZXJzaW9uID0gRVQ2MVgyNTFfTU9EVUxFX1ZFUlNJT05fQ09ERSwKKwkJLnZlcnNpb24gPSBMSU5VWF9WRVJTSU9OX0NPREUsCiAJCS5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwgVjRMMl9DQVBfUkVBRFdSSVRFIHwKIAkJCQlWNEwyX0NBUF9TVFJFQU1JTkcsCiAJfTsKQEAgLTI0ODAsMTYgKzI0ODAsOCBAQAogCWNhc2UgVklESU9DX1NfUEFSTToKIAkJcmV0dXJuIGV0NjF4MjUxX3ZpZGlvY19zX3Bhcm0oY2FtLCBhcmcpOwogCi0JY2FzZSBWSURJT0NfR19TVEQ6Ci0JY2FzZSBWSURJT0NfU19TVEQ6Ci0JY2FzZSBWSURJT0NfUVVFUllTVEQ6Ci0JY2FzZSBWSURJT0NfRU5VTVNURDoKLQljYXNlIFZJRElPQ19RVUVSWU1FTlU6Ci0JY2FzZSBWSURJT0NfRU5VTV9GUkFNRUlOVEVSVkFMUzoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KIAlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIC1FTk9UVFk7CiAKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2ZzbC12aXUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZnNsLXZpdS5jCmluZGV4IDkwOGQ3MDEuLjI3Y2IxOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZnNsLXZpdS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZnNsLXZpdS5jCkBAIC0yMywxOSArMjMsMTMgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNvbW1vbi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgogI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmLWRtYS1jb250aWcuaD4KIAogI2RlZmluZSBEUlZfTkFNRQkJImZzbF92aXUiCi0jZGVmaW5lIFZJVV9NQUpPUl9WRVJTSU9OCTAKLSNkZWZpbmUgVklVX01JTk9SX1ZFUlNJT04JNQotI2RlZmluZSBWSVVfUkVMRUFTRQkJMAotI2RlZmluZSBWSVVfVkVSU0lPTgkJS0VSTkVMX1ZFUlNJT04oVklVX01BSk9SX1ZFUlNJT04sIFwKLQkJCQkJICAgICAgIFZJVV9NSU5PUl9WRVJTSU9OLCBcCi0JCQkJCSAgICAgICBWSVVfUkVMRUFTRSkKKyNkZWZpbmUgVklVX1ZFUlNJT04JCSIwLjUuMSIKIAogI2RlZmluZSBCVUZGRVJfVElNRU9VVAkJbXNlY3NfdG9famlmZmllcyg1MDApICAvKiAwLjUgc2Vjb25kcyAqLwogCkBAIC02MTAsNyArNjA0LDYgQEAKIHsKIAlzdHJjcHkoY2FwLT5kcml2ZXIsICJ2aXUiKTsKIAlzdHJjcHkoY2FwLT5jYXJkLCAidml1Iik7Ci0JY2FwLT52ZXJzaW9uID0gVklVX1ZFUlNJT047CiAJY2FwLT5jYXBhYmlsaXRpZXMgPQlWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKIAkJCQlWNEwyX0NBUF9TVFJFQU1JTkcgICAgIHwKIAkJCQlWNEwyX0NBUF9WSURFT19PVkVSTEFZIHwKQEAgLTE2ODQsMyArMTY3Nyw0IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIkZyZWVzY2FsZSBWaWRlby1JbihWSVUpIik7CiBNT0RVTEVfQVVUSE9SKCJIb25nanVuIENoZW4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKFZJVV9WRVJTSU9OKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvS2NvbmZpZwppbmRleCAzNGFlMmMyLi40M2Q5YTIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9LY29uZmlnCkBAIC0xNzksNiArMTc5LDE2IEBACiAJICBUbyBjb21waWxlIHRoaXMgZHJpdmVyIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUKIAkgIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBnc3BjYV9wYWM3MzExLgogCitjb25maWcgVVNCX0dTUENBX1NFNDAxCisJdHJpc3RhdGUgIlNFNDAxIFVTQiBDYW1lcmEgRHJpdmVyIgorCWRlcGVuZHMgb24gVklERU9fVjRMMiAmJiBVU0JfR1NQQ0EKKwloZWxwCisJIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgY2FtZXJhcyBiYXNlZCBvbiB0aGUKKwkgRW5kcG9pbnRzIChmb3JtZXJseSBrbm93biBhcyBBT1gpIHNlNDAxIGNoaXAuCisKKwkgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBnc3BjYV9zZTQwMS4KKwogY29uZmlnIFVTQl9HU1BDQV9TTjlDMjAyOAogCXRyaXN0YXRlICJTT05JWCBEdWFsLU1vZGUgVVNCIENhbWVyYSBEcml2ZXIiCiAJZGVwZW5kcyBvbiBWSURFT19WNEwyICYmIFVTQl9HU1BDQQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvTWFrZWZpbGUKaW5kZXggODAyZmJlMS4uZDYzNjRhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL01ha2VmaWxlCkBAIC0xNiw2ICsxNiw3IEBACiBvYmotJChDT05GSUdfVVNCX0dTUENBX1BBQzIwNykgICArPSBnc3BjYV9wYWMyMDcubwogb2JqLSQoQ09ORklHX1VTQl9HU1BDQV9QQUM3MzAyKSAgKz0gZ3NwY2FfcGFjNzMwMi5vCiBvYmotJChDT05GSUdfVVNCX0dTUENBX1BBQzczMTEpICArPSBnc3BjYV9wYWM3MzExLm8KK29iai0kKENPTkZJR19VU0JfR1NQQ0FfU0U0MDEpICAgICs9IGdzcGNhX3NlNDAxLm8KIG9iai0kKENPTkZJR19VU0JfR1NQQ0FfU045QzIwMjgpICs9IGdzcGNhX3NuOWMyMDI4Lm8KIG9iai0kKENPTkZJR19VU0JfR1NQQ0FfU045QzIwWCkgICs9IGdzcGNhX3NuOWMyMHgubwogb2JqLSQoQ09ORklHX1VTQl9HU1BDQV9TT05JWEIpICAgKz0gZ3NwY2Ffc29uaXhiLm8KQEAgLTU4LDYgKzU5LDcgQEAKIGdzcGNhX3BhYzIwNy1vYmpzICAgOj0gcGFjMjA3Lm8KIGdzcGNhX3BhYzczMDItb2JqcyAgOj0gcGFjNzMwMi5vCiBnc3BjYV9wYWM3MzExLW9ianMgIDo9IHBhYzczMTEubworZ3NwY2Ffc2U0MDEtb2JqcyAgICA6PSBzZTQwMS5vCiBnc3BjYV9zbjljMjAyOC1vYmpzIDo9IHNuOWMyMDI4Lm8KIGdzcGNhX3NuOWMyMHgtb2JqcyAgOj0gc245YzIweC5vCiBnc3BjYV9zb25peGItb2JqcyAgIDo9IHNvbml4Yi5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dsODYwL2dsODYwLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dsODYwL2dsODYwLmgKaW5kZXggNDlhZDRhYy4uMDMzMGEwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nbDg2MC9nbDg2MC5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ2w4NjAvZ2w4NjAuaApAQCAtMTgsNyArMTgsNiBAQAogICovCiAjaWZuZGVmIEdMODYwX0RFVl9ICiAjZGVmaW5lIEdMODYwX0RFVl9ICi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogCiAjaW5jbHVkZSAiZ3NwY2EuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nc3BjYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nc3BjYS5jCmluZGV4IDA4Y2U5OTQuLjVkYTQ4NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ3NwY2EuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dzcGNhLmMKQEAgLTI0LDcgKzI0LDYgQEAKICNkZWZpbmUgTU9EVUxFX05BTUUgImdzcGNhIgogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgpAQCAtNTEsMTEgKzUwLDEyIEBACiAjZXJyb3IgIkRFRl9OVVJCUyB0b28gYmlnIgogI2VuZGlmCiAKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT05fTlVNQkVSCSIyLjEzLjAiCisKIE1PRFVMRV9BVVRIT1IoIkplYW4tRnJhbsOnb2lzIE1vaW5lIDxodHRwOi8vbW9pbmVqZi5mcmVlLmZyPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJHU1BDQSBVU0IgQ2FtZXJhIERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OX05VTUJFUglLRVJORUxfVkVSU0lPTigyLCAxMywgMCkKK01PRFVMRV9WRVJTSU9OKERSSVZFUl9WRVJTSU9OX05VTUJFUik7CiAKICNpZmRlZiBHU1BDQV9ERUJVRwogaW50IGdzcGNhX2RlYnVnID0gRF9FUlIgfCBEX1BST0JFOwpAQCAtNDQzLDggKzQ0MywxMSBAQAogCX0gZWxzZSB7CiAJCXN3aXRjaCAoZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlKSB7CiAJCWNhc2UgRElTQ0FSRF9QQUNLRVQ6Ci0JCQlpZiAocGFja2V0X3R5cGUgPT0gTEFTVF9QQUNLRVQpCisJCQlpZiAocGFja2V0X3R5cGUgPT0gTEFTVF9QQUNLRVQpIHsKIAkJCQlnc3BjYV9kZXYtPmxhc3RfcGFja2V0X3R5cGUgPSBwYWNrZXRfdHlwZTsKKwkJCQlnc3BjYV9kZXYtPmltYWdlID0gTlVMTDsKKwkJCQlnc3BjYV9kZXYtPmltYWdlX2xlbiA9IDA7CisJCQl9CiAJCQlyZXR1cm47CiAJCWNhc2UgTEFTVF9QQUNLRVQ6CiAJCQlyZXR1cm47CkBAIC0xMjc4LDEwICsxMjgxLDEwIEBACiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gb3V0OwogCX0KLQlzdHJuY3B5KChjaGFyICopIGNhcC0+ZHJpdmVyLCBnc3BjYV9kZXYtPnNkX2Rlc2MtPm5hbWUsCisJc3RybGNweSgoY2hhciAqKSBjYXAtPmRyaXZlciwgZ3NwY2FfZGV2LT5zZF9kZXNjLT5uYW1lLAogCQkJc2l6ZW9mIGNhcC0+ZHJpdmVyKTsKIAlpZiAoZ3NwY2FfZGV2LT5kZXYtPnByb2R1Y3QgIT0gTlVMTCkgewotCQlzdHJuY3B5KChjaGFyICopIGNhcC0+Y2FyZCwgZ3NwY2FfZGV2LT5kZXYtPnByb2R1Y3QsCisJCXN0cmxjcHkoKGNoYXIgKikgY2FwLT5jYXJkLCBnc3BjYV9kZXYtPmRldi0+cHJvZHVjdCwKIAkJCXNpemVvZiBjYXAtPmNhcmQpOwogCX0gZWxzZSB7CiAJCXNucHJpbnRmKChjaGFyICopIGNhcC0+Y2FyZCwgc2l6ZW9mIGNhcC0+Y2FyZCwKQEAgLTEyOTEsNyArMTI5NCw2IEBACiAJfQogCXVzYl9tYWtlX3BhdGgoZ3NwY2FfZGV2LT5kZXYsIChjaGFyICopIGNhcC0+YnVzX2luZm8sCiAJCQlzaXplb2YoY2FwLT5idXNfaW5mbykpOwotCWNhcC0+dmVyc2lvbiA9IERSSVZFUl9WRVJTSU9OX05VTUJFUjsKIAljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUKIAkJCSAgfCBWNEwyX0NBUF9TVFJFQU1JTkcKIAkJCSAgfCBWNEwyX0NBUF9SRUFEV1JJVEU7CkBAIC0xNDYwLDcgKzE0NjIsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlpbnB1dC0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9DQU1FUkE7CiAJaW5wdXQtPnN0YXR1cyA9IGdzcGNhX2Rldi0+Y2FtLmlucHV0X2ZsYWdzOwotCXN0cm5jcHkoaW5wdXQtPm5hbWUsIGdzcGNhX2Rldi0+c2RfZGVzYy0+bmFtZSwKKwlzdHJsY3B5KGlucHV0LT5uYW1lLCBnc3BjYV9kZXYtPnNkX2Rlc2MtPm5hbWUsCiAJCXNpemVvZiBpbnB1dC0+bmFtZSk7CiAJcmV0dXJuIDA7CiB9CkBAIC0yNDc4LDEwICsyNDgwLDcgQEAKIC8qIC0tIG1vZHVsZSBpbnNlcnQgLyByZW1vdmUgLS0gKi8KIHN0YXRpYyBpbnQgX19pbml0IGdzcGNhX2luaXQodm9pZCkKIHsKLQlpbmZvKCJ2JWQuJWQuJWQgcmVnaXN0ZXJlZCIsCi0JCShEUklWRVJfVkVSU0lPTl9OVU1CRVIgPj4gMTYpICYgMHhmZiwKLQkJKERSSVZFUl9WRVJTSU9OX05VTUJFUiA+PiA4KSAmIDB4ZmYsCi0JCURSSVZFUl9WRVJTSU9OX05VTUJFUiAmIDB4ZmYpOworCWluZm8oInYiIERSSVZFUl9WRVJTSU9OX05VTUJFUiAiIHJlZ2lzdGVyZWQiKTsKIAlyZXR1cm4gMDsKIH0KIHN0YXRpYyB2b2lkIF9fZXhpdCBnc3BjYV9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL292NTE5LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL292NTE5LmMKaW5kZXggMDU3ZTI4Ny4uMDgwMDQzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9vdjUxOS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evb3Y1MTkuYwpAQCAtMTM0LDYgKzEzNCw3IEBACiAJU0VOX09WNzY3MCwKIAlTRU5fT1Y3NkJFLAogCVNFTl9PVjg2MTAsCisJU0VOX09WOTYwMCwKIH07CiAKIC8qIE5vdGUgdGhpcyBpcyBhIGJpdCBvZiBhIGhhY2ssIGJ1dCB0aGUgdzk5NjhjZiBkcml2ZXIgbmVlZHMgdGhlIGNvZGUgZm9yIGFsbApAQCAtMzQwLDYgKzM0MSwxMCBAQAogCQkJKDEgPDwgRVhQT1NVUkUpIHwKIAkJCSgxIDw8IEFVVE9HQUlOKSB8CiAJCQkoMSA8PCBGUkVRKSwKK1tTRU5fT1Y5NjAwXSA9CQkoKDEgPDwgTkNUUkwpIC0gMSkJLyogbm8gY29udHJvbCAqLworCQkJXiAoKDEgPDwgRVhQT1NVUkUpCS8qIGJ1dCBleHBvc3VyZSAqLworCQkJIHwgKDEgPDwgQVVUT0dBSU4pKSwJLyogYW5kIGF1dG9nYWluICovCisKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IG92NTE5X3ZnYV9tb2RlW10gPSB7CkBAIC01MjUsNiArNTMwLDE3IEBACiAJCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0IsCiAJCS5wcml2ID0gMH0sCiB9Oworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgb3ZmeDJfb3Y5NjAwX21vZGVbXSA9IHsKKwl7NjQwLCA0ODAsIFY0TDJfUElYX0ZNVF9TQkdHUjgsIFY0TDJfRklFTERfTk9ORSwKKwkJLmJ5dGVzcGVybGluZSA9IDY0MCwKKwkJLnNpemVpbWFnZSA9IDY0MCAqIDQ4MCwKKwkJLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQiwKKwkJLnByaXYgPSAxfSwKKwl7MTI4MCwgMTAyNCwgVjRMMl9QSVhfRk1UX1NCR0dSOCwgVjRMMl9GSUVMRF9OT05FLAorCQkuYnl0ZXNwZXJsaW5lID0gMTI4MCwKKwkJLnNpemVpbWFnZSA9IDEyODAgKiAxMDI0LAorCQkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCfSwKK307CiAKIC8qIFJlZ2lzdGVycyBjb21tb24gdG8gT1Y1MTEgLyBPVjUxOCAqLwogI2RlZmluZSBSNTF4X0ZJRk9fUFNJWkUJCQkweDMwCS8qIDIgYnl0ZXMgd2lkZSB3LyBPVjUxOCgrKSAqLwpAQCAtMTgwNyw2ICsxODIzLDIyIEBACiAJCQl8IE9WNzY3MF9DT004X0FFQ30sCiAJezB4YTEsIDB4Yzh9CiB9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBvdl9pMmNfcmVndmFscyBub3JtXzk2MDBbXSA9IHsKKwl7MHgxMiwgMHg4MH0sCisJezB4MGMsIDB4Mjh9LAorCXsweDExLCAweDgwfSwKKwl7MHgxMywgMHhiNX0sCisJezB4MTQsIDB4M2V9LAorCXsweDFiLCAweDA0fSwKKwl7MHgyNCwgMHhiMH0sCisJezB4MjUsIDB4OTB9LAorCXsweDI2LCAweDk0fSwKKwl7MHgzNSwgMHg5MH0sCisJezB4MzcsIDB4MDd9LAorCXsweDM4LCAweDA4fSwKKwl7MHgwMSwgMHg4ZX0sCisJezB4MDIsIDB4ODV9Cit9OwogCiAvKiA3NjcwLiBEZWZhdWx0cyB0YWtlbiBmcm9tIE9tbmlWaXNpb24gcHJvdmlkZWQgZGF0YSwKICogIGFzIHByb3ZpZGVkIGJ5IEpvbmF0aGFuIENvcmJldCBvZiBPTFBDCQkqLwpAQCAtMjQwMCw5ICsyNDMyLDEyIEBACiAKIAkvKiBJbml0aWF0ZSAyLWJ5dGUgd3JpdGUgY3ljbGUgKi8KIAlyZWdfdyhzZCwgUjUxOF9JMkNfQ1RMLCAweDAzKTsKKwlyZWdfcjgoc2QsIFI1MThfSTJDX0NUTCk7CiAKIAkvKiBJbml0aWF0ZSAyLWJ5dGUgcmVhZCBjeWNsZSAqLwogCXJlZ193KHNkLCBSNTE4X0kyQ19DVEwsIDB4MDUpOworCXJlZ19yOChzZCwgUjUxOF9JMkNfQ1RMKTsKKwogCXZhbHVlID0gcmVnX3Ioc2QsIFI1MXhfSTJDX0RBVEEpOwogCVBERUJVRyhEX1VTQkksICJvdjUxOF9pMmNfciAlMDJ4ICUwMngiLCByZWcsIHZhbHVlKTsKIAlyZXR1cm4gdmFsdWU7CkBAIC0yNjg2LDcgKzI3MjEsNyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qIFRoaXMgaW5pdGlhbGl6ZXMgdGhlIE9WMngxMCAvIE9WMzYxMCAvIE9WMzYyMCAqLworLyogVGhpcyBpbml0aWFsaXplcyB0aGUgT1YyeDEwIC8gT1YzNjEwIC8gT1YzNjIwIC8gT1Y5NjAwICovCiBzdGF0aWMgdm9pZCBvdl9oaXJlc19jb25maWd1cmUoc3RydWN0IHNkICpzZCkKIHsKIAlpbnQgaGlnaCwgbG93OwpAQCAtMjcwMiwxOSArMjczNywzMiBAQAogCWhpZ2ggPSBpMmNfcihzZCwgMHgwYSk7CiAJbG93ID0gaTJjX3Ioc2QsIDB4MGIpOwogCS8qIGluZm8oIiV4LCAleCIsIGhpZ2gsIGxvdyk7ICovCi0JaWYgKGhpZ2ggPT0gMHg5NiAmJiBsb3cgPT0gMHg0MCkgewotCQlQREVCVUcoRF9QUk9CRSwgIlNlbnNvciBpcyBhbiBPVjI2MTAiKTsKLQkJc2QtPnNlbnNvciA9IFNFTl9PVjI2MTA7Ci0JfSBlbHNlIGlmIChoaWdoID09IDB4OTYgJiYgbG93ID09IDB4NDEpIHsKLQkJUERFQlVHKERfUFJPQkUsICJTZW5zb3IgaXMgYW4gT1YyNjEwQUUiKTsKLQkJc2QtPnNlbnNvciA9IFNFTl9PVjI2MTBBRTsKLQl9IGVsc2UgaWYgKGhpZ2ggPT0gMHgzNiAmJiAobG93ICYgMHgwZikgPT0gMHgwMCkgewotCQlQREVCVUcoRF9QUk9CRSwgIlNlbnNvciBpcyBhbiBPVjM2MTAiKTsKLQkJc2QtPnNlbnNvciA9IFNFTl9PVjM2MTA7Ci0JfSBlbHNlIHsKLQkJZXJyKCJFcnJvciB1bmtub3duIHNlbnNvciB0eXBlOiAlMDJ4JTAyeCIsCi0JCQloaWdoLCBsb3cpOworCXN3aXRjaCAoaGlnaCkgeworCWNhc2UgMHg5NjoKKwkJc3dpdGNoIChsb3cpIHsKKwkJY2FzZSAweDQwOgorCQkJUERFQlVHKERfUFJPQkUsICJTZW5zb3IgaXMgYSBPVjI2MTAiKTsKKwkJCXNkLT5zZW5zb3IgPSBTRU5fT1YyNjEwOworCQkJcmV0dXJuOworCQljYXNlIDB4NDE6CisJCQlQREVCVUcoRF9QUk9CRSwgIlNlbnNvciBpcyBhIE9WMjYxMEFFIik7CisJCQlzZC0+c2Vuc29yID0gU0VOX09WMjYxMEFFOworCQkJcmV0dXJuOworCQljYXNlIDB4YjE6CisJCQlQREVCVUcoRF9QUk9CRSwgIlNlbnNvciBpcyBhIE9WOTYwMCIpOworCQkJc2QtPnNlbnNvciA9IFNFTl9PVjk2MDA7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisJY2FzZSAweDM2OgorCQlpZiAoKGxvdyAmIDB4MGYpID09IDB4MDApIHsKKwkJCVBERUJVRyhEX1BST0JFLCAiU2Vuc29yIGlzIGEgT1YzNjEwIik7CisJCQlzZC0+c2Vuc29yID0gU0VOX09WMzYxMDsKKwkJCXJldHVybjsKKwkJfQorCQlicmVhazsKIAl9CisJZXJyKCJFcnJvciB1bmtub3duIHNlbnNvciB0eXBlOiAlMDJ4JTAyeCIsIGhpZ2gsIGxvdyk7CiB9CiAKIC8qIFRoaXMgaW5pdGlhbGl6ZXMgdGhlIE9WODExMCwgT1Y4NjEwIHNlbnNvci4gVGhlIE9WODExMCB1c2VzCkBAIC0zNDAwLDYgKzM0NDgsMTAgQEAKIAkJCWNhbS0+Y2FtX21vZGUgPSBvdmZ4Ml9vdjM2MTBfbW9kZTsKIAkJCWNhbS0+bm1vZGVzID0gQVJSQVlfU0laRShvdmZ4Ml9vdjM2MTBfbW9kZSk7CiAJCQlicmVhazsKKwkJY2FzZSBTRU5fT1Y5NjAwOgorCQkJY2FtLT5jYW1fbW9kZSA9IG92ZngyX292OTYwMF9tb2RlOworCQkJY2FtLT5ubW9kZXMgPSBBUlJBWV9TSVpFKG92ZngyX292OTYwMF9tb2RlKTsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJaWYgKHNkLT5zaWYpIHsKIAkJCQljYW0tPmNhbV9tb2RlID0gb3Y1MTlfc2lmX21vZGU7CkBAIC0zNDk3LDYgKzM1NDksMTIgQEAKIAljYXNlIFNFTl9PVjg2MTA6CiAJCXdyaXRlX2kyY19yZWd2YWxzKHNkLCBub3JtXzg2MTAsIEFSUkFZX1NJWkUobm9ybV84NjEwKSk7CiAJCWJyZWFrOworCWNhc2UgU0VOX09WOTYwMDoKKwkJd3JpdGVfaTJjX3JlZ3ZhbHMoc2QsIG5vcm1fOTYwMCwgQVJSQVlfU0laRShub3JtXzk2MDApKTsKKworCQkvKiBlbmFibGUgYXV0b2V4cG8gKi8KKy8qCQlpMmNfd19tYXNrKHNkLCAweDEzLCAweDA1LCAweDA1KTsgKi8KKwkJYnJlYWs7CiAJfQogCXJldHVybiBnc3BjYV9kZXYtPnVzYl9lcnI7CiBlcnJvcjoKQEAgLTQwODUsNiArNDE0MywzMyBAQAogCQlpMmNfd19tYXNrKHNkLCAweDE0LCBxdmdhID8gMHgyMCA6IDB4MDAsIDB4MjApOwogCQlpMmNfd19tYXNrKHNkLCAweDEyLCAweDA0LCAweDA2KTsgLyogQVdCOiAxIFRlc3QgcGF0dGVybjogMCAqLwogCQlicmVhazsKKwljYXNlIFNFTl9PVjk2MDA6IHsKKwkJY29uc3Qgc3RydWN0IG92X2kyY19yZWd2YWxzICp2YWxzOworCQlzdGF0aWMgY29uc3Qgc3RydWN0IG92X2kyY19yZWd2YWxzIHN4Z2FfMTVbXSA9IHsKKwkJCXsweDExLCAweDgwfSwgezB4MTQsIDB4M2V9LCB7MHgyNCwgMHg4NX0sIHsweDI1LCAweDc1fQorCQl9OworCQlzdGF0aWMgY29uc3Qgc3RydWN0IG92X2kyY19yZWd2YWxzIHN4Z2FfN181W10gPSB7CisJCQl7MHgxMSwgMHg4MX0sIHsweDE0LCAweDNlfSwgezB4MjQsIDB4ODV9LCB7MHgyNSwgMHg3NX0KKwkJfTsKKwkJc3RhdGljIGNvbnN0IHN0cnVjdCBvdl9pMmNfcmVndmFscyB2Z2FfMzBbXSA9IHsKKwkJCXsweDExLCAweDgxfSwgezB4MTQsIDB4N2V9LCB7MHgyNCwgMHg3MH0sIHsweDI1LCAweDYwfQorCQl9OworCQlzdGF0aWMgY29uc3Qgc3RydWN0IG92X2kyY19yZWd2YWxzIHZnYV8xNVtdID0geworCQkJezB4MTEsIDB4ODN9LCB7MHgxNCwgMHgzZX0sIHsweDI0LCAweDgwfSwgezB4MjUsIDB4NzB9CisJCX07CisKKwkJLyogZnJhbWUgcmF0ZXM6CisJCSAqCTE1ZnBzIC8gNy41IGZwcyBmb3IgMTI4MHgxMDI0CisJCSAqCTMwZnBzIC8gMTVmcHMgZm9yIDY0MHg0ODAKKwkJICovCisJCWkyY193X21hc2soc2QsIDB4MTIsIHF2Z2EgPyAweDQwIDogMHgwMCwgMHg0MCk7CisJCWlmIChxdmdhKQorCQkJdmFscyA9IHNkLT5mcmFtZV9yYXRlIDwgMzAgPyB2Z2FfMTUgOiB2Z2FfMzA7CisJCWVsc2UKKwkJCXZhbHMgPSBzZC0+ZnJhbWVfcmF0ZSA8IDE1ID8gc3hnYV83XzUgOiBzeGdhXzE1OworCQl3cml0ZV9pMmNfcmVndmFscyhzZCwgdmFscywgQVJSQVlfU0laRShzeGdhXzE1KSk7CisJCXJldHVybjsKKwkgICAgfQogCWRlZmF1bHQ6CiAJCXJldHVybjsKIAl9CkBAIC00MTIwLDYgKzQyMDUsNyBAQAogCWNhc2UgU0VOX09WMjYxMEFFOgogCWNhc2UgU0VOX09WMzYxMDoKIAljYXNlIFNFTl9PVjc2NzA6CisJY2FzZSBTRU5fT1Y5NjAwOgogCQltb2RlX2luaXRfb3Zfc2Vuc29yX3JlZ3Moc2QpOwogCQlyZXR1cm47CiAJY2FzZSBTRU5fT1Y3NjYwOgpAQCAtNDkyMCw3ICs1MDA2LDggQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCBkZXZpY2VfdGFibGVbXSA9IHsKIAl7VVNCX0RFVklDRSgweDA0MWUsIDB4NDAwMyksIC5kcml2ZXJfaW5mbyA9IEJSSURHRV9XOTk2OENGIH0sCiAJe1VTQl9ERVZJQ0UoMHgwNDFlLCAweDQwNTIpLCAuZHJpdmVyX2luZm8gPSBCUklER0VfT1Y1MTkgfSwKLQl7VVNCX0RFVklDRSgweDA0MWUsIDB4NDA1ZiksIC5kcml2ZXJfaW5mbyA9IEJSSURHRV9PVjUxOSB9LAorCXtVU0JfREVWSUNFKDB4MDQxZSwgMHg0MDVmKSwKKwkJLmRyaXZlcl9pbmZvID0gQlJJREdFX09WNTE5IHwgQlJJREdFX0lOVkVSVF9MRUQgfSwKIAl7VVNCX0RFVklDRSgweDA0MWUsIDB4NDA2MCksIC5kcml2ZXJfaW5mbyA9IEJSSURHRV9PVjUxOSB9LAogCXtVU0JfREVWSUNFKDB4MDQxZSwgMHg0MDYxKSwgLmRyaXZlcl9pbmZvID0gQlJJREdFX09WNTE5IH0sCiAJe1VTQl9ERVZJQ0UoMHgwNDFlLCAweDQwNjQpLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zZTQwMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zZTQwMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMjgzYzIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NlNDAxLmMKQEAgLTAsMCArMSw3NzQgQEAKKy8qCisgKiBHU1BDQSBFbmRwb2ludHMgKGZvcm1lcmx5IGtub3duIGFzIEFPWCkgc2U0MDEgVVNCIENhbWVyYSBzdWIgRHJpdmVyCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIEhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+CisgKgorICogQmFzZWQgb24gdGhlIHY0bDEgc2U0MDEgZHJpdmVyIHdoaWNoIGlzOgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMCBKZXJvZW4gQi4gVnJlZWtlbiAocGUxcnhxQGFtc2F0Lm9yZykKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKgorICovCisKKyNkZWZpbmUgTU9EVUxFX05BTUUgInNlNDAxIgorCisjZGVmaW5lIEJVTEtfU0laRSA0MDk2CisjZGVmaW5lIFBBQ0tFVF9TSVpFIDEwMjQKKyNkZWZpbmUgUkVBRF9SRVFfU0laRSA2NAorI2RlZmluZSBNQVhfTU9ERVMgKChSRUFEX1JFUV9TSVpFIC0gNikgLyA0KQorLyogVGhlIHNlNDAxIGNvbXByZXNzaW9uIGFsZ29yaXRobSB1c2VzIGEgZml4ZWQgcXVhbnQgZmFjdG9yLCB3aGljaAorICAgY2FuIGJlIGNvbmZpZ3VyZWQgYnkgc2V0dGluZyB0aGUgaGlnaCBuaWJibGUgb2YgdGhlIFNFNDAxX09QRVJBVElOR01PREUKKyAgIGZlYXR1cmUuIFRoaXMgbmVlZHMgdG8gZXhhY3RseSBtYXRjaCB3aGF0IGlzIGluIGxpYnY0bCEgKi8KKyNkZWZpbmUgU0U0MDFfUVVBTlRfRkFDVCA4CisKKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlICJnc3BjYS5oIgorI2luY2x1ZGUgInNlNDAxLmgiCisKK01PRFVMRV9BVVRIT1IoIkhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkVuZHBvaW50cyBzZTQwMSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKiBjb250cm9scyAqLworZW51bSBlX2N0cmwgeworCUJSSUdIVE5FU1MsCisJR0FJTiwKKwlFWFBPU1VSRSwKKwlGUkVRLAorCU5DVFJMCS8qIG51bWJlciBvZiBjb250cm9scyAqLworfTsKKworLyogZXhwb3N1cmUgY2hhbmdlIHN0YXRlIG1hY2hpbmUgc3RhdGVzICovCitlbnVtIHsKKwlFWFBPX0NIQU5HRUQsCisJRVhQT19EUk9QX0ZSQU1FLAorCUVYUE9fTk9fQ0hBTkdFLAorfTsKKworLyogc3BlY2lmaWMgd2ViY2FtIGRlc2NyaXB0b3IgKi8KK3N0cnVjdCBzZCB7CisJc3RydWN0IGdzcGNhX2RldiBnc3BjYV9kZXY7CS8qICEhIG11c3QgYmUgdGhlIGZpcnN0IGl0ZW0gKi8KKwlzdHJ1Y3QgZ3NwY2FfY3RybCBjdHJsc1tOQ1RSTF07CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCBmbXRzW01BWF9NT0RFU107CisJaW50IHBpeGVsc19yZWFkOworCWludCBwYWNrZXRfcmVhZDsKKwl1OCBwYWNrZXRbUEFDS0VUX1NJWkVdOworCXU4IHJlc3RhcnRfc3RyZWFtOworCXU4IGJ1dHRvbl9zdGF0ZTsKKwl1OCByZXNldGxldmVsOworCXU4IHJlc2V0bGV2ZWxfZnJhbWVfY291bnQ7CisJaW50IHJlc2V0bGV2ZWxfYWRqdXN0X2RpcjsKKwlpbnQgZXhwb19jaGFuZ2Vfc3RhdGU7Cit9OworCitzdGF0aWMgdm9pZCBzZXRicmlnaHRuZXNzKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2Rldik7CitzdGF0aWMgdm9pZCBzZXRnYWluKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2Rldik7CitzdGF0aWMgdm9pZCBzZXRleHBvc3VyZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IGN0cmwgc2RfY3RybHNbTkNUUkxdID0geworW0JSSUdIVE5FU1NdID0geworCQl7CisJCQkuaWQgICAgICA9IFY0TDJfQ0lEX0JSSUdIVE5FU1MsCisJCQkudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSAgICA9ICJCcmlnaHRuZXNzIiwKKwkJCS5taW5pbXVtID0gMCwKKwkJCS5tYXhpbXVtID0gMjU1LAorCQkJLnN0ZXAgICAgPSAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAxNSwKKwkJfSwKKwkJLnNldF9jb250cm9sID0gc2V0YnJpZ2h0bmVzcworCX0sCitbR0FJTl0gPSB7CisJCXsKKwkJCS5pZCAgICAgID0gVjRMMl9DSURfR0FJTiwKKwkJCS50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJCS5uYW1lICAgID0gIkdhaW4iLAorCQkJLm1pbmltdW0gPSAwLAorCQkJLm1heGltdW0gPSA1MCwgLyogUmVhbGx5IDYzIGJ1dCA+IDUwIGlzIG5vdCBwcmV0dHkgKi8KKwkJCS5zdGVwICAgID0gMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMjUsCisJCX0sCisJCS5zZXRfY29udHJvbCA9IHNldGdhaW4KKwl9LAorW0VYUE9TVVJFXSA9IHsKKwkJeworCQkJLmlkID0gVjRMMl9DSURfRVhQT1NVUkUsCisJCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCQkubmFtZSA9ICJFeHBvc3VyZSIsCisJCQkubWluaW11bSA9IDAsCisJCQkubWF4aW11bSA9IDMyNzY3LAorCQkJLnN0ZXAgPSAxLAorCQkJLmRlZmF1bHRfdmFsdWUgPSAxNTAwMCwKKwkJfSwKKwkJLnNldF9jb250cm9sID0gc2V0ZXhwb3N1cmUKKwl9LAorW0ZSRVFdID0geworCQl7CisJCQkuaWQJID0gVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1ksCisJCQkudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX01FTlUsCisJCQkubmFtZSAgICA9ICJMaWdodCBmcmVxdWVuY3kgZmlsdGVyIiwKKwkJCS5taW5pbXVtID0gMCwKKwkJCS5tYXhpbXVtID0gMiwKKwkJCS5zdGVwICAgID0gMSwKKwkJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwkJfSwKKwkJLnNldF9jb250cm9sID0gc2V0ZXhwb3N1cmUKKwl9LAorfTsKKworc3RhdGljIHZvaWQgc2U0MDFfd3JpdGVfcmVxKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldiwgdTE2IHJlcSwgdTE2IHZhbHVlLAorCQkJICAgIGludCBzaWxlbnQpCit7CisJaW50IGVycjsKKworCWlmIChnc3BjYV9kZXYtPnVzYl9lcnIgPCAwKQorCQlyZXR1cm47CisKKwllcnIgPSB1c2JfY29udHJvbF9tc2coZ3NwY2FfZGV2LT5kZXYsCisJCQkgICAgICB1c2Jfc25kY3RybHBpcGUoZ3NwY2FfZGV2LT5kZXYsIDApLCByZXEsCisJCQkgICAgICBVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJCQkgICAgICB2YWx1ZSwgMCwgTlVMTCwgMCwgMTAwMCk7CisJaWYgKGVyciA8IDApIHsKKwkJaWYgKCFzaWxlbnQpCisJCQllcnIoIndyaXRlIHJlcSBmYWlsZWQgcmVxICUjMDR4IHZhbCAlIzA0eCBlcnJvciAlZCIsCisJCQkgICAgcmVxLCB2YWx1ZSwgZXJyKTsKKwkJZ3NwY2FfZGV2LT51c2JfZXJyID0gZXJyOworCX0KK30KKworc3RhdGljIHZvaWQgc2U0MDFfcmVhZF9yZXEoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCB1MTYgcmVxLCBpbnQgc2lsZW50KQoreworCWludCBlcnI7CisKKwlpZiAoZ3NwY2FfZGV2LT51c2JfZXJyIDwgMCkKKwkJcmV0dXJuOworCisJaWYgKFVTQl9CVUZfU1ogPCBSRUFEX1JFUV9TSVpFKSB7CisJCWVycigiVVNCX0JVRl9TWiB0b28gc21hbGwhISIpOworCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSAtRU5PQlVGUzsKKwkJcmV0dXJuOworCX0KKworCWVyciA9IHVzYl9jb250cm9sX21zZyhnc3BjYV9kZXYtPmRldiwKKwkJCSAgICAgIHVzYl9yY3ZjdHJscGlwZShnc3BjYV9kZXYtPmRldiwgMCksIHJlcSwKKwkJCSAgICAgIFVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAorCQkJICAgICAgMCwgMCwgZ3NwY2FfZGV2LT51c2JfYnVmLCBSRUFEX1JFUV9TSVpFLCAxMDAwKTsKKwlpZiAoZXJyIDwgMCkgeworCQlpZiAoIXNpbGVudCkKKwkJCWVycigicmVhZCByZXEgZmFpbGVkIHJlcSAlIzA0eCBlcnJvciAlZCIsIHJlcSwgZXJyKTsKKwkJZ3NwY2FfZGV2LT51c2JfZXJyID0gZXJyOworCX0KK30KKworc3RhdGljIHZvaWQgc2U0MDFfc2V0X2ZlYXR1cmUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQkJICAgICAgdTE2IHNlbGVjdG9yLCB1MTYgcGFyYW0pCit7CisJaW50IGVycjsKKworCWlmIChnc3BjYV9kZXYtPnVzYl9lcnIgPCAwKQorCQlyZXR1cm47CisKKwllcnIgPSB1c2JfY29udHJvbF9tc2coZ3NwY2FfZGV2LT5kZXYsCisJCQkgICAgICB1c2Jfc25kY3RybHBpcGUoZ3NwY2FfZGV2LT5kZXYsIDApLAorCQkJICAgICAgU0U0MDFfUkVRX1NFVF9FWFRfRkVBVFVSRSwKKwkJCSAgICAgIFVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKKwkJCSAgICAgIHBhcmFtLCBzZWxlY3RvciwgTlVMTCwgMCwgMTAwMCk7CisJaWYgKGVyciA8IDApIHsKKwkJZXJyKCJzZXQgZmVhdHVyZSBmYWlsZWQgc2VsICUjMDR4IHBhcmFtICUjMDR4IGVycm9yICVkIiwKKwkJICAgIHNlbGVjdG9yLCBwYXJhbSwgZXJyKTsKKwkJZ3NwY2FfZGV2LT51c2JfZXJyID0gZXJyOworCX0KK30KKworc3RhdGljIGludCBzZTQwMV9nZXRfZmVhdHVyZShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIHUxNiBzZWxlY3RvcikKK3sKKwlpbnQgZXJyOworCisJaWYgKGdzcGNhX2Rldi0+dXNiX2VyciA8IDApCisJCXJldHVybiBnc3BjYV9kZXYtPnVzYl9lcnI7CisKKwlpZiAoVVNCX0JVRl9TWiA8IDIpIHsKKwkJZXJyKCJVU0JfQlVGX1NaIHRvbyBzbWFsbCEhIik7CisJCWdzcGNhX2Rldi0+dXNiX2VyciA9IC1FTk9CVUZTOworCQlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfZXJyOworCX0KKworCWVyciA9IHVzYl9jb250cm9sX21zZyhnc3BjYV9kZXYtPmRldiwKKwkJCSAgICAgIHVzYl9yY3ZjdHJscGlwZShnc3BjYV9kZXYtPmRldiwgMCksCisJCQkgICAgICBTRTQwMV9SRVFfR0VUX0VYVF9GRUFUVVJFLAorCQkJICAgICAgVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiB8IFVTQl9SRUNJUF9ERVZJQ0UsCisJCQkgICAgICAwLCBzZWxlY3RvciwgZ3NwY2FfZGV2LT51c2JfYnVmLCAyLCAxMDAwKTsKKwlpZiAoZXJyIDwgMCkgeworCQllcnIoImdldCBmZWF0dXJlIGZhaWxlZCBzZWwgJSMwNHggZXJyb3IgJWQiLCBzZWxlY3RvciwgZXJyKTsKKwkJZ3NwY2FfZGV2LT51c2JfZXJyID0gZXJyOworCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfYnVmWzBdIHwgKGdzcGNhX2Rldi0+dXNiX2J1ZlsxXSA8PCA4KTsKK30KKworc3RhdGljIHZvaWQgc2V0YnJpZ2h0bmVzcyhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCisJaWYgKGdzcGNhX2Rldi0+Y3RybF9kaXMgJiAoMSA8PCBCUklHSFRORVNTKSkKKwkJcmV0dXJuOworCisJLyogSERHOiB0aGlzIGRvZXMgbm90IHNlZW0gdG8gZG8gYW55dGhpbmcgb24gbXkgY2FtICovCisJc2U0MDFfd3JpdGVfcmVxKGdzcGNhX2RldiwgU0U0MDFfUkVRX1NFVF9CUlQsCisJCQlzZC0+Y3RybHNbQlJJR0hUTkVTU10udmFsLCAwKTsKK30KKworc3RhdGljIHZvaWQgc2V0Z2FpbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKikgZ3NwY2FfZGV2OworCXUxNiBnYWluID0gNjMgLSBzZC0+Y3RybHNbR0FJTl0udmFsOworCisJLyogcmVkIGNvbG9yIGdhaW4gKi8KKwlzZTQwMV9zZXRfZmVhdHVyZShnc3BjYV9kZXYsIEhWNzEzMV9SRUdfQVJDRywgZ2Fpbik7CisJLyogZ3JlZW4gY29sb3IgZ2FpbiAqLworCXNlNDAxX3NldF9mZWF0dXJlKGdzcGNhX2RldiwgSFY3MTMxX1JFR19BR0NHLCBnYWluKTsKKwkvKiBibHVlIGNvbG9yIGdhaW4gKi8KKwlzZTQwMV9zZXRfZmVhdHVyZShnc3BjYV9kZXYsIEhWNzEzMV9SRUdfQUJDRywgZ2Fpbik7Cit9CisKK3N0YXRpYyB2b2lkIHNldGV4cG9zdXJlKHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKSBnc3BjYV9kZXY7CisJaW50IGludGVncmF0aW9uID0gc2QtPmN0cmxzW0VYUE9TVVJFXS52YWwgPDwgNjsKKwl1OCBleHBvc2VfaCwgZXhwb3NlX20sIGV4cG9zZV9sOworCisJLyogRG8gdGhpcyBiZWZvcmUgdGhlIHNldF9mZWF0dXJlIGNhbGxzLCBmb3IgcHJvcGVyIHRpbWluZyB3cnQKKwkgICB0aGUgaW50ZXJydXB0IGRyaXZlbiBwa3Rfc2Nhbi4gTm90ZSB3ZSBtYXkgc3RpbGwgcmFjZSBidXQgdGhhdAorCSAgIGlzIG5vdCBhIGJpZyBpc3N1ZSwgdGhlIGV4cG8gY2hhbmdlIHN0YXRlIG1hY2hpbmUgaXMgbWVyZWx5IGZvcgorCSAgIGF2b2lkaW5nIHVuZGVyZXhwb3NlZCBmcmFtZXMgZ2V0dGluZyBzZW5kIG91dCwgaWYgb25lIHNuZWFrcworCSAgIHRocm91Z2ggc28gYmUgaXQgKi8KKwlzZC0+ZXhwb19jaGFuZ2Vfc3RhdGUgPSBFWFBPX0NIQU5HRUQ7CisKKwlpZiAoc2QtPmN0cmxzW0ZSRVFdLnZhbCA9PSBWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWV81MEhaKQorCQlpbnRlZ3JhdGlvbiA9IGludGVncmF0aW9uIC0gaW50ZWdyYXRpb24gJSAxMDY2Njc7CisJaWYgKHNkLT5jdHJsc1tGUkVRXS52YWwgPT0gVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1lfNjBIWikKKwkJaW50ZWdyYXRpb24gPSBpbnRlZ3JhdGlvbiAtIGludGVncmF0aW9uICUgODg4ODk7CisKKwlleHBvc2VfaCA9IChpbnRlZ3JhdGlvbiA+PiAxNik7CisJZXhwb3NlX20gPSAoaW50ZWdyYXRpb24gPj4gOCk7CisJZXhwb3NlX2wgPSBpbnRlZ3JhdGlvbjsKKworCS8qIGludGVncmF0aW9uIHRpbWUgbG93ICovCisJc2U0MDFfc2V0X2ZlYXR1cmUoZ3NwY2FfZGV2LCBIVjcxMzFfUkVHX1RJVEwsIGV4cG9zZV9sKTsKKwkvKiBpbnRlZ3JhdGlvbiB0aW1lIG1pZCAqLworCXNlNDAxX3NldF9mZWF0dXJlKGdzcGNhX2RldiwgSFY3MTMxX1JFR19USVRNLCBleHBvc2VfbSk7CisJLyogaW50ZWdyYXRpb24gdGltZSBoaWdoICovCisJc2U0MDFfc2V0X2ZlYXR1cmUoZ3NwY2FfZGV2LCBIVjcxMzFfUkVHX1RJVFUsIGV4cG9zZV9oKTsKK30KKworc3RhdGljIGludCBzZF9jb25maWcoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQkJY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopZ3NwY2FfZGV2OworCXN0cnVjdCBjYW0gKmNhbSA9ICZnc3BjYV9kZXYtPmNhbTsKKwl1OCAqY2QgPSBnc3BjYV9kZXYtPnVzYl9idWY7CisJaW50IGksIGosIG47CisJaW50IHdpZHRoc1tNQVhfTU9ERVNdLCBoZWlnaHRzW01BWF9NT0RFU107CisKKwkvKiBSZWFkIHRoZSBjYW1lcmEgZGVzY3JpcHRvciAqLworCXNlNDAxX3JlYWRfcmVxKGdzcGNhX2RldiwgU0U0MDFfUkVRX0dFVF9DQU1FUkFfREVTQ1JJUFRPUiwgMSk7CisJaWYgKGdzcGNhX2Rldi0+dXNiX2VycikgeworCQkvKiBTb21ldGltZXMgYWZ0ZXIgYmVpbmcgaWRsZSBmb3IgYSB3aGlsZSB0aGUgc2U0MDEgd29uJ3QKKwkJICAgcmVzcG9uZCBhbmQgbmVlZHMgYSBnb29kIGtpY2tpbmcgICovCisJCXVzYl9yZXNldF9kZXZpY2UoZ3NwY2FfZGV2LT5kZXYpOworCQlnc3BjYV9kZXYtPnVzYl9lcnIgPSAwOworCQlzZTQwMV9yZWFkX3JlcShnc3BjYV9kZXYsIFNFNDAxX1JFUV9HRVRfQ0FNRVJBX0RFU0NSSVBUT1IsIDApOworCX0KKworCS8qIFNvbWUgY2FtZXJhcyBzdGFydCB3aXRoIHRoZWlyIExFRCBvbiAqLworCXNlNDAxX3dyaXRlX3JlcShnc3BjYV9kZXYsIFNFNDAxX1JFUV9MRURfQ09OVFJPTCwgMCwgMCk7CisJaWYgKGdzcGNhX2Rldi0+dXNiX2VycikKKwkJcmV0dXJuIGdzcGNhX2Rldi0+dXNiX2VycjsKKworCWlmIChjZFsxXSAhPSAweDQxKSB7CisJCWVycigiV3JvbmcgZGVzY3JpcHRvciB0eXBlIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICghKGNkWzJdICYgU0U0MDFfRk9STUFUX0JBWUVSKSkgeworCQllcnIoIkJheWVyIGZvcm1hdCBub3Qgc3VwcG9ydGVkISIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoY2RbM10pCisJCWluZm8oIkV4dHJhRmVhdHVyZXM6ICVkIiwgY2RbM10pOworCisJbiA9IGNkWzRdIHwgKGNkWzVdIDw8IDgpOworCWlmIChuID4gTUFYX01PREVTKSB7CisJCWVycigiVG9vIG1hbnkgZnJhbWUgc2l6ZXMiKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG4gOyBpKyspIHsKKwkJd2lkdGhzW2ldID0gY2RbNiArIGkgKiA0ICsgMF0gfCAoY2RbNiArIGkgKiA0ICsgMV0gPDwgOCk7CisJCWhlaWdodHNbaV0gPSBjZFs2ICsgaSAqIDQgKyAyXSB8IChjZFs2ICsgaSAqIDQgKyAzXSA8PCA4KTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbiA7IGkrKykgeworCQlzZC0+Zm10c1tpXS53aWR0aCA9IHdpZHRoc1tpXTsKKwkJc2QtPmZtdHNbaV0uaGVpZ2h0ID0gaGVpZ2h0c1tpXTsKKwkJc2QtPmZtdHNbaV0uZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJCXNkLT5mbXRzW2ldLmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQjsKKwkJc2QtPmZtdHNbaV0ucHJpdiA9IDE7CisKKwkJLyogamFuZ2d1IGNvbXByZXNzaW9uIG9ubHkgd29ya3MgZm9yIDEvNHRoIG9yIDEvMTZ0aCByZXMgKi8KKwkJZm9yIChqID0gMDsgaiA8IG47IGorKykgeworCQkJaWYgKHdpZHRoc1tqXSAvIDIgPT0gd2lkdGhzW2ldICYmCisJCQkgICAgaGVpZ2h0c1tqXSAvIDIgPT0gaGVpZ2h0c1tpXSkgeworCQkJCXNkLT5mbXRzW2ldLnByaXYgPSAyOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8qIDEvMTZ0aCBpZiBhdmFpbGFibGUgdG9vIGlzIGJldHRlciB0aGVuIDEvNHRoLCBiZWNhdXNlCisJCSAgIHdlIHRoZW4gdXNlIGEgbGFyZ2VyIGFyZWEgb2YgdGhlIHNlbnNvciAqLworCQlmb3IgKGogPSAwOyBqIDwgbjsgaisrKSB7CisJCQlpZiAod2lkdGhzW2pdIC8gNCA9PSB3aWR0aHNbaV0gJiYKKwkJCSAgICBoZWlnaHRzW2pdIC8gNCA9PSBoZWlnaHRzW2ldKSB7CisJCQkJc2QtPmZtdHNbaV0ucHJpdiA9IDQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoc2QtPmZtdHNbaV0ucHJpdiA9PSAxKSB7CisJCQkvKiBOb3QgYSAxLzR0aCBvciAxLzE2dGggcmVzLCB1c2UgYmF5ZXIgKi8KKwkJCXNkLT5mbXRzW2ldLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1NCR0dSODsKKwkJCXNkLT5mbXRzW2ldLmJ5dGVzcGVybGluZSA9IHdpZHRoc1tpXTsKKwkJCXNkLT5mbXRzW2ldLnNpemVpbWFnZSA9IHdpZHRoc1tpXSAqIGhlaWdodHNbaV07CisJCQlpbmZvKCJGcmFtZSBzaXplOiAlZHglZCBiYXllciIsIHdpZHRoc1tpXSwgaGVpZ2h0c1tpXSk7CisJCX0gZWxzZSB7CisJCQkvKiBGb3VuZCBhIG1hdGNoIHVzZSBqYW5nZ3UgY29tcHJlc3Npb24gKi8KKwkJCXNkLT5mbXRzW2ldLnBpeGVsZm9ybWF0ID0gVjRMMl9QSVhfRk1UX1NFNDAxOworCQkJc2QtPmZtdHNbaV0uYnl0ZXNwZXJsaW5lID0gMDsKKwkJCXNkLT5mbXRzW2ldLnNpemVpbWFnZSA9IHdpZHRoc1tpXSAqIGhlaWdodHNbaV0gKiAzOworCQkJaW5mbygiRnJhbWUgc2l6ZTogJWR4JWQgMS8lZHRoIGphbmdndSIsCisJCQkgICAgIHdpZHRoc1tpXSwgaGVpZ2h0c1tpXSwKKwkJCSAgICAgc2QtPmZtdHNbaV0ucHJpdiAqIHNkLT5mbXRzW2ldLnByaXYpOworCQl9CisJfQorCisJY2FtLT5jYW1fbW9kZSA9IHNkLT5mbXRzOworCWNhbS0+bm1vZGVzID0gbjsKKwljYW0tPmJ1bGsgPSAxOworCWNhbS0+YnVsa19zaXplID0gQlVMS19TSVpFOworCWNhbS0+YnVsa19udXJicyA9IDQ7CisJY2FtLT5jdHJscyA9IHNkLT5jdHJsczsKKwlnc3BjYV9kZXYtPm5iYWx0ID0gMTsgIC8qIElnbm9yZSB0aGUgYm9ndXMgaXNvYyBhbHQgc2V0dGluZ3MgKi8KKwlzZC0+cmVzZXRsZXZlbCA9IDB4MmQ7IC8qIFNldCBpbml0aWFsIHJlc2V0bGV2ZWwgKi8KKworCS8qIFNlZSBpZiB0aGUgY2FtZXJhIHN1cHBvcnRzIGJyaWdodG5lc3MgKi8KKwlzZTQwMV9yZWFkX3JlcShnc3BjYV9kZXYsIFNFNDAxX1JFUV9HRVRfQlJULCAxKTsKKwlpZiAoZ3NwY2FfZGV2LT51c2JfZXJyKSB7CisJCWdzcGNhX2Rldi0+Y3RybF9kaXMgPSAoMSA8PCBCUklHSFRORVNTKTsKKwkJZ3NwY2FfZGV2LT51c2JfZXJyID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgcHJvYmUgYW5kIHJlc3VtZSB0aW1lICovCitzdGF0aWMgaW50IHNkX2luaXQoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2KQoreworCXJldHVybiAwOworfQorCisvKiAtLSBzdGFydCB0aGUgY2FtZXJhIC0tICovCitzdGF0aWMgaW50IHNkX3N0YXJ0KHN0cnVjdCBnc3BjYV9kZXYgKmdzcGNhX2RldikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKWdzcGNhX2RldjsKKwlpbnQgbXVsdCA9IGdzcGNhX2Rldi0+Y2FtLmNhbV9tb2RlW2dzcGNhX2Rldi0+Y3Vycl9tb2RlXS5wcml2OworCWludCBtb2RlID0gMDsKKworCXNlNDAxX3dyaXRlX3JlcShnc3BjYV9kZXYsIFNFNDAxX1JFUV9DQU1FUkFfUE9XRVIsIDEsIDEpOworCWlmIChnc3BjYV9kZXYtPnVzYl9lcnIpIHsKKwkJLyogU29tZXRpbWVzIGFmdGVyIGJlaW5nIGlkbGUgZm9yIGEgd2hpbGUgdGhlIHNlNDAxIHdvbid0CisJCSAgIHJlc3BvbmQgYW5kIG5lZWRzIGEgZ29vZCBraWNraW5nICAqLworCQl1c2JfcmVzZXRfZGV2aWNlKGdzcGNhX2Rldi0+ZGV2KTsKKwkJZ3NwY2FfZGV2LT51c2JfZXJyID0gMDsKKwkJc2U0MDFfd3JpdGVfcmVxKGdzcGNhX2RldiwgU0U0MDFfUkVRX0NBTUVSQV9QT1dFUiwgMSwgMCk7CisJfQorCXNlNDAxX3dyaXRlX3JlcShnc3BjYV9kZXYsIFNFNDAxX1JFUV9MRURfQ09OVFJPTCwgMSwgMCk7CisKKwlzZTQwMV9zZXRfZmVhdHVyZShnc3BjYV9kZXYsIEhWNzEzMV9SRUdfTU9ERV9CLCAweDA1KTsKKworCS8qIHNldCBzaXplICsgbW9kZSAqLworCXNlNDAxX3dyaXRlX3JlcShnc3BjYV9kZXYsIFNFNDAxX1JFUV9TRVRfV0lEVEgsCisJCQlnc3BjYV9kZXYtPndpZHRoICogbXVsdCwgMCk7CisJc2U0MDFfd3JpdGVfcmVxKGdzcGNhX2RldiwgU0U0MDFfUkVRX1NFVF9IRUlHSFQsCisJCQlnc3BjYV9kZXYtPmhlaWdodCAqIG11bHQsIDApOworCS8qCisJICogSERHOiBkaXNhYmxlZCB0aGlzIGFzIGl0IGRvZXMgbm90IHNlZW0gdG8gZG8gYW55dGhpbmcKKwkgKiBzZTQwMV93cml0ZV9yZXEoZ3NwY2FfZGV2LCBTRTQwMV9SRVFfU0VUX09VVFBVVF9NT0RFLAorCSAqCQkgICBTRTQwMV9GT1JNQVRfQkFZRVIsIDApOworCSAqLworCisJc3dpdGNoIChtdWx0KSB7CisJY2FzZSAxOiAvKiBSYXcgYmF5ZXIgKi8KKwkJbW9kZSA9IDB4MDM7IGJyZWFrOworCWNhc2UgMjogLyogMS80dGggamFuZ2d1ICovCisJCW1vZGUgPSBTRTQwMV9RVUFOVF9GQUNUIDw8IDQ7IGJyZWFrOworCWNhc2UgNDogLyogMS8xNnRoIGphbmdndSAqLworCQltb2RlID0gKFNFNDAxX1FVQU5UX0ZBQ1QgPDwgNCkgfCAweDAyOyBicmVhazsKKwl9CisJc2U0MDFfc2V0X2ZlYXR1cmUoZ3NwY2FfZGV2LCBTRTQwMV9PUEVSQVRJTkdNT0RFLCBtb2RlKTsKKworCXNldGJyaWdodG5lc3MoZ3NwY2FfZGV2KTsKKwlzZXRnYWluKGdzcGNhX2Rldik7CisJc2V0ZXhwb3N1cmUoZ3NwY2FfZGV2KTsKKwlzZTQwMV9zZXRfZmVhdHVyZShnc3BjYV9kZXYsIEhWNzEzMV9SRUdfQVJMViwgc2QtPnJlc2V0bGV2ZWwpOworCisJc2QtPnBhY2tldF9yZWFkID0gMDsKKwlzZC0+cGl4ZWxzX3JlYWQgPSAwOworCXNkLT5yZXN0YXJ0X3N0cmVhbSA9IDA7CisJc2QtPnJlc2V0bGV2ZWxfZnJhbWVfY291bnQgPSAwOworCXNkLT5yZXNldGxldmVsX2FkanVzdF9kaXIgPSAwOworCXNkLT5leHBvX2NoYW5nZV9zdGF0ZSA9IEVYUE9fTk9fQ0hBTkdFOworCisJc2U0MDFfd3JpdGVfcmVxKGdzcGNhX2RldiwgU0U0MDFfUkVRX1NUQVJUX0NPTlRJTlVPVVNfQ0FQVFVSRSwgMCwgMCk7CisKKwlyZXR1cm4gZ3NwY2FfZGV2LT51c2JfZXJyOworfQorCitzdGF0aWMgdm9pZCBzZF9zdG9wTihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc2U0MDFfd3JpdGVfcmVxKGdzcGNhX2RldiwgU0U0MDFfUkVRX1NUT1BfQ09OVElOVU9VU19DQVBUVVJFLCAwLCAwKTsKKwlzZTQwMV93cml0ZV9yZXEoZ3NwY2FfZGV2LCBTRTQwMV9SRVFfTEVEX0NPTlRST0wsIDAsIDApOworCXNlNDAxX3dyaXRlX3JlcShnc3BjYV9kZXYsIFNFNDAxX1JFUV9DQU1FUkFfUE9XRVIsIDAsIDApOworfQorCitzdGF0aWMgdm9pZCBzZF9kcV9jYWxsYmFjayhzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYpCit7CisJc3RydWN0IHNkICpzZCA9IChzdHJ1Y3Qgc2QgKilnc3BjYV9kZXY7CisJdW5zaWduZWQgaW50IGFocmMsIGFscmM7CisJaW50IG9sZHJlc2V0LCBhZGp1c3RfZGlyOworCisJLyogUmVzdGFydCB0aGUgc3RyZWFtIGlmIHJlcXVlc3RlZCBkbyBzbyBieSBwa3Rfc2NhbiAqLworCWlmIChzZC0+cmVzdGFydF9zdHJlYW0pIHsKKwkJc2Rfc3RvcE4oZ3NwY2FfZGV2KTsKKwkJc2Rfc3RhcnQoZ3NwY2FfZGV2KTsKKwkJc2QtPnJlc3RhcnRfc3RyZWFtID0gMDsKKwl9CisKKwkvKiBBdXRvbWF0aWNhbGx5IGFkanVzdCBzZW5zb3IgcmVzZXQgbGV2ZWwKKwkgICBIeXVuZGFpIGhhdmUgc29tZSByZWFsbHkgbmljZSBkb2NzIGFib3V0IHRoaXMgYW5kIG90aGVyIHNlbnNvcgorCSAgIHJlbGF0ZWQgc3R1ZmYgb24gdGhlaXIgaG9tZXBhZ2U6IHd3dy5oZWkuY28ua3IgKi8KKwlzZC0+cmVzZXRsZXZlbF9mcmFtZV9jb3VudCsrOworCWlmIChzZC0+cmVzZXRsZXZlbF9mcmFtZV9jb3VudCA8IDIwKQorCQlyZXR1cm47CisKKwkvKiBGb3Igc29tZSByZWFzb24gdGhpcyBub3JtYWxseSByZWFkLW9ubHkgcmVnaXN0ZXIgZG9lc24ndCBnZXQgcmVzZXQKKwkgICB0byB6ZXJvIGFmdGVyIHJlYWRpbmcgdGhlbSBqdXN0IG9uY2UuLi4gKi8KKwlzZTQwMV9nZXRfZmVhdHVyZShnc3BjYV9kZXYsIEhWNzEzMV9SRUdfSElSRUZOT0gpOworCXNlNDAxX2dldF9mZWF0dXJlKGdzcGNhX2RldiwgSFY3MTMxX1JFR19ISVJFRk5PTCk7CisJc2U0MDFfZ2V0X2ZlYXR1cmUoZ3NwY2FfZGV2LCBIVjcxMzFfUkVHX0xPUkVGTk9IKTsKKwlzZTQwMV9nZXRfZmVhdHVyZShnc3BjYV9kZXYsIEhWNzEzMV9SRUdfTE9SRUZOT0wpOworCWFocmMgPSAyNTYqc2U0MDFfZ2V0X2ZlYXR1cmUoZ3NwY2FfZGV2LCBIVjcxMzFfUkVHX0hJUkVGTk9IKSArCisJICAgIHNlNDAxX2dldF9mZWF0dXJlKGdzcGNhX2RldiwgSFY3MTMxX1JFR19ISVJFRk5PTCk7CisJYWxyYyA9IDI1NipzZTQwMV9nZXRfZmVhdHVyZShnc3BjYV9kZXYsIEhWNzEzMV9SRUdfTE9SRUZOT0gpICsKKwkgICAgc2U0MDFfZ2V0X2ZlYXR1cmUoZ3NwY2FfZGV2LCBIVjcxMzFfUkVHX0xPUkVGTk9MKTsKKworCS8qIE5vdCBhbiBleGFjdCBzY2llbmNlLCBidXQgaXQgc2VlbXMgdG8gd29yayBwcmV0dHkgd2VsbC4uLiAqLworCW9sZHJlc2V0ID0gc2QtPnJlc2V0bGV2ZWw7CisJaWYgKGFscmMgPiAxMCkgeworCQl3aGlsZSAoYWxyYyA+PSAxMCAmJiBzZC0+cmVzZXRsZXZlbCA8IDYzKSB7CisJCQlzZC0+cmVzZXRsZXZlbCsrOworCQkJYWxyYyAvPSAyOworCQl9CisJfSBlbHNlIGlmIChhaHJjID4gMjApIHsKKwkJd2hpbGUgKGFocmMgPj0gMjAgJiYgc2QtPnJlc2V0bGV2ZWwgPiAwKSB7CisJCQlzZC0+cmVzZXRsZXZlbC0tOworCQkJYWhyYyAvPSAyOworCQl9CisJfQorCS8qIERldGVjdCBwaW5nLXBvbmctaW5nIGFuZCBoYWx2ZSBhZGp1c3RtZW50IHRvIGF2b2lkIG92ZXJzaG9vdCAqLworCWlmIChzZC0+cmVzZXRsZXZlbCA+IG9sZHJlc2V0KQorCQlhZGp1c3RfZGlyID0gMTsKKwllbHNlCisJCWFkanVzdF9kaXIgPSAtMTsKKwlpZiAoc2QtPnJlc2V0bGV2ZWxfYWRqdXN0X2RpciAmJgorCSAgICBzZC0+cmVzZXRsZXZlbF9hZGp1c3RfZGlyICE9IGFkanVzdF9kaXIpCisJCXNkLT5yZXNldGxldmVsID0gb2xkcmVzZXQgKyAoc2QtPnJlc2V0bGV2ZWwgLSBvbGRyZXNldCkgLyAyOworCisJaWYgKHNkLT5yZXNldGxldmVsICE9IG9sZHJlc2V0KSB7CisJCXNkLT5yZXNldGxldmVsX2FkanVzdF9kaXIgPSBhZGp1c3RfZGlyOworCQlzZTQwMV9zZXRfZmVhdHVyZShnc3BjYV9kZXYsIEhWNzEzMV9SRUdfQVJMViwgc2QtPnJlc2V0bGV2ZWwpOworCX0KKworCXNkLT5yZXNldGxldmVsX2ZyYW1lX2NvdW50ID0gMDsKK30KKworc3RhdGljIHZvaWQgc2RfY29tcGxldGVfZnJhbWUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCB1OCAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc2QgKnNkID0gKHN0cnVjdCBzZCAqKWdzcGNhX2RldjsKKworCXN3aXRjaCAoc2QtPmV4cG9fY2hhbmdlX3N0YXRlKSB7CisJY2FzZSBFWFBPX0NIQU5HRUQ6CisJCS8qIFRoZSBleHBvc3VyZSB3YXMgY2hhbmdlZCB3aGlsZSB0aGlzIGZyYW1lCisJCSAgIHdhcyBiZWluZyBzZW5kLCBzbyB0aGlzIGZyYW1lIGlzIG9rICovCisJCXNkLT5leHBvX2NoYW5nZV9zdGF0ZSA9IEVYUE9fRFJPUF9GUkFNRTsKKwkJYnJlYWs7CisJY2FzZSBFWFBPX0RST1BfRlJBTUU6CisJCS8qIFRoZSBleHBvc3VyZSB3YXMgY2hhbmdlZCB3aGlsZSB0aGlzIGZyYW1lCisJCSAgIHdhcyBiZWluZyBjYXB0dXJlZCwgZHJvcCBpdCEgKi8KKwkJZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlID0gRElTQ0FSRF9QQUNLRVQ7CisJCXNkLT5leHBvX2NoYW5nZV9zdGF0ZSA9IEVYUE9fTk9fQ0hBTkdFOworCQlicmVhazsKKwljYXNlIEVYUE9fTk9fQ0hBTkdFOgorCQlicmVhazsKKwl9CisJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgTEFTVF9QQUNLRVQsIGRhdGEsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIHNkX3BrdF9zY2FuX2phbmdndShzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIHU4ICpkYXRhLCBpbnQgbGVuKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopZ3NwY2FfZGV2OworCWludCBpbWFnZXNpemUgPSBnc3BjYV9kZXYtPndpZHRoICogZ3NwY2FfZGV2LT5oZWlnaHQ7CisJaW50IGksIHBsZW4sIGJpdHMsIHBpeGVscywgaW5mbywgY291bnQ7CisKKwlpZiAoc2QtPnJlc3RhcnRfc3RyZWFtKQorCQlyZXR1cm47CisKKwkvKiBTb21ldGltZXMgYSAxMDI0IGJ5dGVzIGdhcmJhZ2UgYnVsayBwYWNrZXQgaXMgc2VuZCBiZXR3ZWVuIGZyYW1lcyAqLworCWlmIChnc3BjYV9kZXYtPmxhc3RfcGFja2V0X3R5cGUgPT0gTEFTVF9QQUNLRVQgJiYgbGVuID09IDEwMjQpIHsKKwkJZ3NwY2FfZGV2LT5sYXN0X3BhY2tldF90eXBlID0gRElTQ0FSRF9QQUNLRVQ7CisJCXJldHVybjsKKwl9CisKKwlpID0gMDsKKwl3aGlsZSAoaSA8IGxlbikgeworCQkvKiBSZWFkIGhlYWRlciBpZiBub3QgYWxyZWFkeSBiZSBwcmVzZW50IGZyb20gcHJldiBidWxrIHBrdCAqLworCQlpZiAoc2QtPnBhY2tldF9yZWFkIDwgNCkgeworCQkJY291bnQgPSA0IC0gc2QtPnBhY2tldF9yZWFkOworCQkJaWYgKGNvdW50ID4gbGVuIC0gaSkKKwkJCQljb3VudCA9IGxlbiAtIGk7CisJCQltZW1jcHkoJnNkLT5wYWNrZXRbc2QtPnBhY2tldF9yZWFkXSwgJmRhdGFbaV0sIGNvdW50KTsKKwkJCXNkLT5wYWNrZXRfcmVhZCArPSBjb3VudDsKKwkJCWkgKz0gY291bnQ7CisJCQlpZiAoc2QtPnBhY2tldF9yZWFkIDwgNCkKKwkJCQlicmVhazsKKwkJfQorCQliaXRzICAgPSBzZC0+cGFja2V0WzNdICsgKHNkLT5wYWNrZXRbMl0gPDwgOCk7CisJCXBpeGVscyA9IHNkLT5wYWNrZXRbMV0gKyAoKHNkLT5wYWNrZXRbMF0gJiAweDNmKSA8PCA4KTsKKwkJaW5mbyAgID0gKHNkLT5wYWNrZXRbMF0gJiAweGMwKSA+PiA2OworCQlwbGVuICAgPSAoKGJpdHMgKyA0NykgPj4gNCkgPDwgMTsKKwkJLyogU2FuaXR5IGNoZWNrcyAqLworCQlpZiAocGxlbiA+IDEwMjQpIHsKKwkJCWVycigiaW52YWxpZCBwYWNrZXQgbGVuICVkIHJlc3RhcnRpbmcgc3RyZWFtIiwgcGxlbik7CisJCQlnb3RvIGVycm9yOworCQl9CisJCWlmIChpbmZvID09IDMpIHsKKwkJCWVycigidW5rbm93biBmcmFtZSBpbmZvIHZhbHVlIHJlc3RhcnRpbmcgc3RyZWFtIik7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJLyogUmVhZCAocmVtYWluZGVyIG9mKSBwYWNrZXQgY29udGVudHMgKi8KKwkJY291bnQgPSBwbGVuIC0gc2QtPnBhY2tldF9yZWFkOworCQlpZiAoY291bnQgPiBsZW4gLSBpKQorCQkJY291bnQgPSBsZW4gLSBpOworCQltZW1jcHkoJnNkLT5wYWNrZXRbc2QtPnBhY2tldF9yZWFkXSwgJmRhdGFbaV0sIGNvdW50KTsKKwkJc2QtPnBhY2tldF9yZWFkICs9IGNvdW50OworCQlpICs9IGNvdW50OworCQlpZiAoc2QtPnBhY2tldF9yZWFkIDwgcGxlbikKKwkJCWJyZWFrOworCisJCXNkLT5waXhlbHNfcmVhZCArPSBwaXhlbHM7CisJCXNkLT5wYWNrZXRfcmVhZCA9IDA7CisKKwkJc3dpdGNoIChpbmZvKSB7CisJCWNhc2UgMDogLyogRnJhbWUgZGF0YSAqLworCQkJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULCBzZC0+cGFja2V0LAorCQkJCQlwbGVuKTsKKwkJCWJyZWFrOworCQljYXNlIDE6IC8qIEVPRiAqLworCQkJaWYgKHNkLT5waXhlbHNfcmVhZCAhPSBpbWFnZXNpemUpIHsKKwkJCQllcnIoImZyYW1lIHNpemUgJWQgZXhwZWN0ZWQgJWQiLAorCQkJCSAgICBzZC0+cGl4ZWxzX3JlYWQsIGltYWdlc2l6ZSk7CisJCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJCXNkX2NvbXBsZXRlX2ZyYW1lKGdzcGNhX2Rldiwgc2QtPnBhY2tldCwgcGxlbik7CisJCQlyZXR1cm47IC8qIERpc2NhcmQgdGhlIHJlc3Qgb2YgdGhlIGJ1bGsgcGFja2V0ICEhICovCisJCWNhc2UgMjogLyogU09GICovCisJCQlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsIHNkLT5wYWNrZXQsCisJCQkJCXBsZW4pOworCQkJc2QtPnBpeGVsc19yZWFkID0gcGl4ZWxzOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuOworCitlcnJvcjoKKwlzZC0+cmVzdGFydF9zdHJlYW0gPSAxOworCS8qIEdpdmUgdXNlcnNwYWNlIGEgMCBieXRlcyBmcmFtZSwgc28gb3VyIGRxIGNhbGxiYWNrIGdldHMKKwkgICBjYWxsZWQgYW5kIGl0IGNhbiByZXN0YXJ0IHRoZSBzdHJlYW0gKi8KKwlnc3BjYV9mcmFtZV9hZGQoZ3NwY2FfZGV2LCBGSVJTVF9QQUNLRVQsIE5VTEwsIDApOworCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIExBU1RfUEFDS0VULCBOVUxMLCAwKTsKK30KKworc3RhdGljIHZvaWQgc2RfcGt0X3NjYW5fYmF5ZXIoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LCB1OCAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgY2FtICpjYW0gPSAmZ3NwY2FfZGV2LT5jYW07CisJaW50IGltYWdlc2l6ZSA9IGNhbS0+Y2FtX21vZGVbZ3NwY2FfZGV2LT5jdXJyX21vZGVdLnNpemVpbWFnZTsKKworCWlmIChnc3BjYV9kZXYtPmltYWdlX2xlbiA9PSAwKSB7CisJCWdzcGNhX2ZyYW1lX2FkZChnc3BjYV9kZXYsIEZJUlNUX1BBQ0tFVCwgZGF0YSwgbGVuKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChnc3BjYV9kZXYtPmltYWdlX2xlbiArIGxlbiA+PSBpbWFnZXNpemUpIHsKKwkJc2RfY29tcGxldGVfZnJhbWUoZ3NwY2FfZGV2LCBkYXRhLCBsZW4pOworCQlyZXR1cm47CisJfQorCisJZ3NwY2FfZnJhbWVfYWRkKGdzcGNhX2RldiwgSU5URVJfUEFDS0VULCBkYXRhLCBsZW4pOworfQorCitzdGF0aWMgdm9pZCBzZF9wa3Rfc2NhbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIHU4ICpkYXRhLCBpbnQgbGVuKQoreworCWludCBtdWx0ID0gZ3NwY2FfZGV2LT5jYW0uY2FtX21vZGVbZ3NwY2FfZGV2LT5jdXJyX21vZGVdLnByaXY7CisKKwlpZiAobGVuID09IDApCisJCXJldHVybjsKKworCWlmIChtdWx0ID09IDEpIC8qIG11bHQgPT0gMSBtZWFucyByYXcgYmF5ZXIgKi8KKwkJc2RfcGt0X3NjYW5fYmF5ZXIoZ3NwY2FfZGV2LCBkYXRhLCBsZW4pOworCWVsc2UKKwkJc2RfcGt0X3NjYW5famFuZ2d1KGdzcGNhX2RldiwgZGF0YSwgbGVuKTsKK30KKworc3RhdGljIGludCBzZF9xdWVyeW1lbnUoc3RydWN0IGdzcGNhX2RldiAqZ3NwY2FfZGV2LAorCQkJc3RydWN0IHY0bDJfcXVlcnltZW51ICptZW51KQoreworCXN3aXRjaCAobWVudS0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX1BPV0VSX0xJTkVfRlJFUVVFTkNZOgorCQlzd2l0Y2ggKG1lbnUtPmluZGV4KSB7CisJCWNhc2UgVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1lfRElTQUJMRUQ6CisJCQlzdHJjcHkoKGNoYXIgKikgbWVudS0+bmFtZSwgIk5vRmxpa2VyIik7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBWNEwyX0NJRF9QT1dFUl9MSU5FX0ZSRVFVRU5DWV81MEhaOgorCQkJc3RyY3B5KChjaGFyICopIG1lbnUtPm5hbWUsICI1MCBIeiIpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgVjRMMl9DSURfUE9XRVJfTElORV9GUkVRVUVOQ1lfNjBIWjoKKwkJCXN0cmNweSgoY2hhciAqKSBtZW51LT5uYW1lLCAiNjAgSHoiKTsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX0lOUFVUKSB8fCBkZWZpbmVkKENPTkZJR19JTlBVVF9NT0RVTEUpCitzdGF0aWMgaW50IHNkX2ludF9wa3Rfc2NhbihzdHJ1Y3QgZ3NwY2FfZGV2ICpnc3BjYV9kZXYsIHU4ICpkYXRhLCBpbnQgbGVuKQoreworCXN0cnVjdCBzZCAqc2QgPSAoc3RydWN0IHNkICopZ3NwY2FfZGV2OworCXU4IHN0YXRlOworCisJaWYgKGxlbiAhPSAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoZGF0YVswXSkgeworCWNhc2UgMDoKKwljYXNlIDE6CisJCXN0YXRlID0gZGF0YVswXTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChzZC0+YnV0dG9uX3N0YXRlICE9IHN0YXRlKSB7CisJCWlucHV0X3JlcG9ydF9rZXkoZ3NwY2FfZGV2LT5pbnB1dF9kZXYsIEtFWV9DQU1FUkEsIHN0YXRlKTsKKwkJaW5wdXRfc3luYyhnc3BjYV9kZXYtPmlucHV0X2Rldik7CisJCXNkLT5idXR0b25fc3RhdGUgPSBzdGF0ZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiBzdWItZHJpdmVyIGRlc2NyaXB0aW9uICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHNkX2Rlc2Mgc2RfZGVzYyA9IHsKKwkubmFtZSA9IE1PRFVMRV9OQU1FLAorCS5jdHJscyA9IHNkX2N0cmxzLAorCS5uY3RybHMgPSBBUlJBWV9TSVpFKHNkX2N0cmxzKSwKKwkuY29uZmlnID0gc2RfY29uZmlnLAorCS5pbml0ID0gc2RfaW5pdCwKKwkuc3RhcnQgPSBzZF9zdGFydCwKKwkuc3RvcE4gPSBzZF9zdG9wTiwKKwkuZHFfY2FsbGJhY2sgPSBzZF9kcV9jYWxsYmFjaywKKwkucGt0X3NjYW4gPSBzZF9wa3Rfc2NhbiwKKwkucXVlcnltZW51ID0gc2RfcXVlcnltZW51LAorI2lmIGRlZmluZWQoQ09ORklHX0lOUFVUKSB8fCBkZWZpbmVkKENPTkZJR19JTlBVVF9NT0RVTEUpCisJLmludF9wa3Rfc2NhbiA9IHNkX2ludF9wa3Rfc2NhbiwKKyNlbmRpZgorfTsKKworLyogLS0gbW9kdWxlIGluaXRpYWxpc2F0aW9uIC0tICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgZGV2aWNlX3RhYmxlW10gPSB7CisJe1VTQl9ERVZJQ0UoMHgwM2U4LCAweDAwMDQpfSwgLyogRW5kcG9pbnRzL0FveCBTRTQwMSAqLworCXtVU0JfREVWSUNFKDB4MDQ3MSwgMHgwMzBiKX0sIC8qIFBoaWxpcHMgUENWQzY2NUsgKi8KKwl7VVNCX0RFVklDRSgweDA0N2QsIDB4NTAwMSl9LCAvKiBLZW5zaW5ndG9uIDY3MDE0ICovCisJe1VTQl9ERVZJQ0UoMHgwNDdkLCAweDUwMDIpfSwgLyogS2Vuc2luZ3RvbiA2NzAxKDUvNykgKi8KKwl7VVNCX0RFVklDRSgweDA0N2QsIDB4NTAwMyl9LCAvKiBLZW5zaW5ndG9uIDY3MDE2ICovCisJe30KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgZGV2aWNlX3RhYmxlKTsKKworLyogLS0gZGV2aWNlIGNvbm5lY3QgLS0gKi8KK3N0YXRpYyBpbnQgc2RfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYsCisJCQljb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpCit7CisJcmV0dXJuIGdzcGNhX2Rldl9wcm9iZShpbnRmLCBpZCwgJnNkX2Rlc2MsIHNpemVvZihzdHJ1Y3Qgc2QpLAorCQkJCVRISVNfTU9EVUxFKTsKK30KKworc3RhdGljIGludCBzZF9wcmVfcmVzZXQoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2RfcG9zdF9yZXNldChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHNkX2RyaXZlciA9IHsKKwkubmFtZSA9IE1PRFVMRV9OQU1FLAorCS5pZF90YWJsZSA9IGRldmljZV90YWJsZSwKKwkucHJvYmUgPSBzZF9wcm9iZSwKKwkuZGlzY29ubmVjdCA9IGdzcGNhX2Rpc2Nvbm5lY3QsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPSBnc3BjYV9zdXNwZW5kLAorCS5yZXN1bWUgPSBnc3BjYV9yZXN1bWUsCisjZW5kaWYKKwkucHJlX3Jlc2V0ID0gc2RfcHJlX3Jlc2V0LAorCS5wb3N0X3Jlc2V0ID0gc2RfcG9zdF9yZXNldCwKK307CisKKy8qIC0tIG1vZHVsZSBpbnNlcnQgLyByZW1vdmUgLS0gKi8KK3N0YXRpYyBpbnQgX19pbml0IHNkX21vZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHVzYl9yZWdpc3Rlcigmc2RfZHJpdmVyKTsKK30KK3N0YXRpYyB2b2lkIF9fZXhpdCBzZF9tb2RfZXhpdCh2b2lkKQoreworCXVzYl9kZXJlZ2lzdGVyKCZzZF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChzZF9tb2RfaW5pdCk7Cittb2R1bGVfZXhpdChzZF9tb2RfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NlNDAxLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3NlNDAxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZkOGViZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc2U0MDEuaApAQCAtMCwwICsxLDkwIEBACisvKgorICogR1NQQ0EgRW5kcG9pbnRzIChmb3JtZXJseSBrbm93biBhcyBBT1gpIHNlNDAxIFVTQiBDYW1lcmEgc3ViIERyaXZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPgorICoKKyAqIEJhc2VkIG9uIHRoZSB2NGwxIHNlNDAxIGRyaXZlciB3aGljaCBpczoKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAgSmVyb2VuIEIuIFZyZWVrZW4gKHBlMXJ4cUBhbXNhdC5vcmcpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICoKKyAqLworCisjZGVmaW5lIFNFNDAxX1JFUV9HRVRfQ0FNRVJBX0RFU0NSSVBUT1IJCTB4MDYKKyNkZWZpbmUgU0U0MDFfUkVRX1NUQVJUX0NPTlRJTlVPVVNfQ0FQVFVSRQkweDQxCisjZGVmaW5lIFNFNDAxX1JFUV9TVE9QX0NPTlRJTlVPVVNfQ0FQVFVSRQkweDQyCisjZGVmaW5lIFNFNDAxX1JFUV9DQVBUVVJFX0ZSQU1FCQkJMHg0MworI2RlZmluZSBTRTQwMV9SRVFfR0VUX0JSVAkJCTB4NDQKKyNkZWZpbmUgU0U0MDFfUkVRX1NFVF9CUlQJCQkweDQ1CisjZGVmaW5lIFNFNDAxX1JFUV9HRVRfV0lEVEgJCQkweDRjCisjZGVmaW5lIFNFNDAxX1JFUV9TRVRfV0lEVEgJCQkweDRkCisjZGVmaW5lIFNFNDAxX1JFUV9HRVRfSEVJR0hUCQkJMHg0ZQorI2RlZmluZSBTRTQwMV9SRVFfU0VUX0hFSUdIVAkJCTB4NGYKKyNkZWZpbmUgU0U0MDFfUkVRX0dFVF9PVVRQVVRfTU9ERQkJMHg1MAorI2RlZmluZSBTRTQwMV9SRVFfU0VUX09VVFBVVF9NT0RFCQkweDUxCisjZGVmaW5lIFNFNDAxX1JFUV9HRVRfRVhUX0ZFQVRVUkUJCTB4NTIKKyNkZWZpbmUgU0U0MDFfUkVRX1NFVF9FWFRfRkVBVFVSRQkJMHg1MworI2RlZmluZSBTRTQwMV9SRVFfQ0FNRVJBX1BPV0VSCQkJMHg1NgorI2RlZmluZSBTRTQwMV9SRVFfTEVEX0NPTlRST0wJCQkweDU3CisjZGVmaW5lIFNFNDAxX1JFUV9CSU9TCQkJCTB4ZmYKKworI2RlZmluZSBTRTQwMV9CSU9TX1JFQUQJCQkJMHgwNworCisjZGVmaW5lIFNFNDAxX0ZPUk1BVF9CQVlFUgkweDQwCisKKy8qIEh5dW5kYWkgaHY3MTMxYiByZWdpc3RlcnMKKyAgIDcxMjEgYW5kIDcxNDEgc2hvdWxkIGJlIHRoZSBzYW1lIChoYXZlbid0IHJlYWxseSBjaGVja2VkLi4uKSAqLworLyogTW9kZSByZWdpc3RlcnM6ICovCisjZGVmaW5lIEhWNzEzMV9SRUdfTU9ERV9BCQkweDAwCisjZGVmaW5lIEhWNzEzMV9SRUdfTU9ERV9CCQkweDAxCisjZGVmaW5lIEhWNzEzMV9SRUdfTU9ERV9DCQkweDAyCisvKiBGcmFtZSByZWdpc3RlcnM6ICovCisjZGVmaW5lIEhWNzEzMV9SRUdfRlJTVQkJMHgxMAorI2RlZmluZSBIVjcxMzFfUkVHX0ZSU0wJCTB4MTEKKyNkZWZpbmUgSFY3MTMxX1JFR19GQ1NVCQkweDEyCisjZGVmaW5lIEhWNzEzMV9SRUdfRkNTTAkJMHgxMworI2RlZmluZSBIVjcxMzFfUkVHX0ZXSFUJCTB4MTQKKyNkZWZpbmUgSFY3MTMxX1JFR19GV0hMCQkweDE1CisjZGVmaW5lIEhWNzEzMV9SRUdfRldXVQkJMHgxNgorI2RlZmluZSBIVjcxMzFfUkVHX0ZXV0wJCTB4MTcKKy8qIFRpbWluZyByZWdpc3RlcnM6ICovCisjZGVmaW5lIEhWNzEzMV9SRUdfVEhCVQkJMHgyMAorI2RlZmluZSBIVjcxMzFfUkVHX1RIQkwJCTB4MjEKKyNkZWZpbmUgSFY3MTMxX1JFR19UVkJVCQkweDIyCisjZGVmaW5lIEhWNzEzMV9SRUdfVFZCTAkJMHgyMworI2RlZmluZSBIVjcxMzFfUkVHX1RJVFUJCTB4MjUKKyNkZWZpbmUgSFY3MTMxX1JFR19USVRNCQkweDI2CisjZGVmaW5lIEhWNzEzMV9SRUdfVElUTAkJMHgyNworI2RlZmluZSBIVjcxMzFfUkVHX1RNQ0QJCTB4MjgKKy8qIEFkanVzdCBSZWdpc3RlcnM6ICovCisjZGVmaW5lIEhWNzEzMV9SRUdfQVJMVgkJMHgzMAorI2RlZmluZSBIVjcxMzFfUkVHX0FSQ0cJCTB4MzEKKyNkZWZpbmUgSFY3MTMxX1JFR19BR0NHCQkweDMyCisjZGVmaW5lIEhWNzEzMV9SRUdfQUJDRwkJMHgzMworI2RlZmluZSBIVjcxMzFfUkVHX0FQQlYJCTB4MzQKKyNkZWZpbmUgSFY3MTMxX1JFR19BU0xQCQkweDU0CisvKiBPZmZzZXQgUmVnaXN0ZXJzOiAqLworI2RlZmluZSBIVjcxMzFfUkVHX09GU1IJCTB4NTAKKyNkZWZpbmUgSFY3MTMxX1JFR19PRlNHCQkweDUxCisjZGVmaW5lIEhWNzEzMV9SRUdfT0ZTQgkJMHg1MgorLyogUkVzZXQgbGV2ZWwgc3RhdGlzdGljcyByZWdpc3RlcnM6ICovCisjZGVmaW5lIEhWNzEzMV9SRUdfTE9SRUZOT0gJMHg1NworI2RlZmluZSBIVjcxMzFfUkVHX0xPUkVGTk9MCTB4NTgKKyNkZWZpbmUgSFY3MTMxX1JFR19ISVJFRk5PSAkweDU5CisjZGVmaW5lIEhWNzEzMV9SRUdfSElSRUZOT0wJMHg1YQorCisvKiBzZTQwMSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgU0U0MDFfT1BFUkFUSU5HTU9ERQkweDIwMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2Evc3VucGx1cy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdW5wbHVzLmMKaW5kZXggYjA4OWMwZC4uNmVjMjMyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdW5wbHVzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9zdW5wbHVzLmMKQEAgLTI0Nyw3ICsyNDcsNiBAQAogCXsweDMwLCAweDAwMDQsIDB4MDAwYX0sCiAJezB4YjAsIDB4MDAwMSwgMHgwMDAwfSwKIAotCiAJezB4YTEsIDB4MDA4MCwgMHgwMDAxfSwKIAl7MHgzMCwgMHgwMDQ5LCAweDAwMDB9LAogCXsweDMwLCAweDAwNjAsIDB4MDAwNX0sCkBAIC0yNTYsOCArMjU1LDYgQEAKIAl7MHgwMCwgMHgwMDAwLCAweDIwMDB9LAogCXsweDAwLCAweDAwMTMsIDB4MjMwMX0sCiAJezB4MDAsIDB4MDAwMywgMHgyMDAwfSwKLQl7MHgwMCwgMHgwMDAwLCAweDIwMDB9LAotCiB9OwogCiAvKiBjbGlja3NtYXJ0IDQyMCBvcGVuIGRhdGEgPyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS90NjEzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Q2MTMuYwppbmRleCA3ZTc2MmQ1Li5kMWQ3MzNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Q2MTMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL3Q2MTMuYwpAQCAtMTM4Nyw3ICsxMzg3LDcgQEAKIAkJcmV0dXJuIDA7CiAJY2FzZSBWNEwyX0NJRF9FRkZFQ1RTOgogCQlpZiAoKHVuc2lnbmVkKSBtZW51LT5pbmRleCA8IEFSUkFZX1NJWkUoZWZmZWN0c19jb250cm9sKSkgewotCQkJc3RybmNweSgoY2hhciAqKSBtZW51LT5uYW1lLAorCQkJc3RybGNweSgoY2hhciAqKSBtZW51LT5uYW1lLAogCQkJCWVmZmVjdHNfY29udHJvbFttZW51LT5pbmRleF0sCiAJCQkJc2l6ZW9mIG1lbnUtPm5hbWUpOwogCQkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2hkcHZyL2hkcHZyLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGRwdnIvaGRwdnItY29yZS5jCmluZGV4IDVmMWRiNDYuLjQ0MWRhY2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGRwdnIvaGRwdnItY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGRwdnIvaGRwdnItY29yZS5jCkBAIC00NzQsNSArNDc0LDYgQEAKIG1vZHVsZV9leGl0KGhkcHZyX2V4aXQpOwogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiMC4yLjEiKTsKIE1PRFVMRV9BVVRIT1IoIkphbm5lIEdydW5hdSIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJIYXVwcGF1Z2UgSEQgUFZSIGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9oZHB2ci9oZHB2ci12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9oZHB2ci9oZHB2ci12aWRlby5jCmluZGV4IDUxNGFlYTcuLjA4N2Y3YzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGRwdnIvaGRwdnItdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2hkcHZyL2hkcHZyLXZpZGVvLmMKQEAgLTE3LDcgKzE3LDYgQEAKICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAKICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KQEAgLTU3NCw3ICs1NzMsNiBAQAogCXN0cmNweShjYXAtPmRyaXZlciwgImhkcHZyIik7CiAJc3RyY3B5KGNhcC0+Y2FyZCwgIkhhdXBwYXVnZSBIRCBQVlIiKTsKIAl1c2JfbWFrZV9wYXRoKGRldi0+dWRldiwgY2FwLT5idXNfaW5mbywgc2l6ZW9mKGNhcC0+YnVzX2luZm8pKTsKLQljYXAtPnZlcnNpb24gPSBIRFBWUl9WRVJTSU9OOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0gICAgIFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfAogCQkJCVY0TDJfQ0FQX0FVRElPICAgICAgICAgfAogCQkJCVY0TDJfQ0FQX1JFQURXUklURTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGRwdnIvaGRwdnIuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaGRwdnIvaGRwdnIuaAppbmRleCAwNzJmMjNjLi5kNjQzOWRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2hkcHZyL2hkcHZyLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9oZHB2ci9oZHB2ci5oCkBAIC0xOCwxMiArMTgsNiBAQAogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvaXIta2JkLWkyYy5oPgogCi0jZGVmaW5lIEhEUFZSX01BSk9SX1ZFUlNJT04gMAotI2RlZmluZSBIRFBWUl9NSU5PUl9WRVJTSU9OIDIKLSNkZWZpbmUgSERQVlJfUkVMRUFTRSAwCi0jZGVmaW5lIEhEUFZSX1ZFUlNJT04gXAotCUtFUk5FTF9WRVJTSU9OKEhEUFZSX01BSk9SX1ZFUlNJT04sIEhEUFZSX01JTk9SX1ZFUlNJT04sIEhEUFZSX1JFTEVBU0UpCi0KICNkZWZpbmUgSERQVlJfTUFYIDgKICNkZWZpbmUgSERQVlJfSTJDX01BWF9TSVpFIDEyOAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1kcml2ZXIuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWRyaXZlci5oCmluZGV4IDg0YmRmMGYuLjhmOWNjMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWRyaXZlci5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWRyaXZlci5oCkBAIC0zNiw3ICszNiw2IEBACiAgKiAgICAgICAgICAgICAgICB1c2luZyBpbmZvcm1hdGlvbiBwcm92aWRlZCBieSBKaXVuLUt1ZWkgSnVuZyBAIEFWZXJNZWRpYS4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZmlsZW9wcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtZmlsZW9wcy5jCmluZGV4IGE3ZjU0YjAuLjM4ZjA1MjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWZpbGVvcHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1maWxlb3BzLmMKQEAgLTcyMiw4ICs3MjIsOCBAQAogCiAJLyogSWYgdGhlcmUgYXJlIHN1YnNjcmliZWQgZXZlbnRzLCB0aGVuIG9ubHkgdXNlIHRoZSBuZXcgZXZlbnQKIAkgICBBUEkgaW5zdGVhZCBvZiB0aGUgb2xkIHZpZGVvLmggYmFzZWQgQVBJLiAqLwotCWlmICghbGlzdF9lbXB0eSgmaWQtPmZoLmV2ZW50cy0+c3Vic2NyaWJlZCkpIHsKLQkJcG9sbF93YWl0KGZpbHAsICZpZC0+ZmguZXZlbnRzLT53YWl0LCB3YWl0KTsKKwlpZiAoIWxpc3RfZW1wdHkoJmlkLT5maC5zdWJzY3JpYmVkKSkgeworCQlwb2xsX3dhaXQoZmlscCwgJmlkLT5maC53YWl0LCB3YWl0KTsKIAkJLyogVHVybiBvZmYgdGhlIG9sZC1zdHlsZSB2c3luYyBldmVudHMgKi8KIAkJY2xlYXJfYml0KElWVFZfRl9JX0VWX1ZTWU5DX0VOQUJMRUQsICZpdHYtPmlfZmxhZ3MpOwogCQlpZiAodjRsMl9ldmVudF9wZW5kaW5nKCZpZC0+ZmgpKQpAQCAtNzUwLDYgKzc1MCw3IEBACiAJc3RydWN0IGl2dHYgKml0diA9IGlkLT5pdHY7CiAJc3RydWN0IGl2dHZfc3RyZWFtICpzID0gJml0di0+c3RyZWFtc1tpZC0+dHlwZV07CiAJaW50IGVvZiA9IHRlc3RfYml0KElWVFZfRl9TX1NUUkVBTU9GRiwgJnMtPnNfZmxhZ3MpOworCXVuc2lnbmVkIHJlcyA9IDA7CiAKIAkvKiBTdGFydCBhIGNhcHR1cmUgaWYgdGhlcmUgaXMgbm9uZSAqLwogCWlmICghZW9mICYmICF0ZXN0X2JpdChJVlRWX0ZfU19TVFJFQU1JTkcsICZzLT5zX2ZsYWdzKSkgewpAQCAtNzY5LDEyICs3NzAsMTYgQEAKIAkvKiBhZGQgc3RyZWFtJ3Mgd2FpdHEgdG8gdGhlIHBvbGwgbGlzdCAqLwogCUlWVFZfREVCVUdfSElfRklMRSgiRW5jb2RlciBwb2xsXG4iKTsKIAlwb2xsX3dhaXQoZmlscCwgJnMtPndhaXRxLCB3YWl0KTsKKwlpZiAodjRsMl9ldmVudF9wZW5kaW5nKCZpZC0+ZmgpKQorCQlyZXMgfD0gUE9MTFBSSTsKKwllbHNlCisJCXBvbGxfd2FpdChmaWxwLCAmaWQtPmZoLndhaXQsIHdhaXQpOwogCiAJaWYgKHMtPnFfZnVsbC5sZW5ndGggfHwgcy0+cV9pby5sZW5ndGgpCi0JCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOworCQlyZXR1cm4gcmVzIHwgUE9MTElOIHwgUE9MTFJETk9STTsKIAlpZiAoZW9mKQotCQlyZXR1cm4gUE9MTEhVUDsKLQlyZXR1cm4gMDsKKwkJcmV0dXJuIHJlcyB8IFBPTExIVVA7CisJcmV0dXJuIHJlczsKIH0KIAogdm9pZCBpdnR2X3N0b3BfY2FwdHVyZShzdHJ1Y3QgaXZ0dl9vcGVuX2lkICppZCwgaW50IGdvcF9lbmQpCkBAIC05NjEsMTAgKzk2Niw2IEBACiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAl2NGwyX2ZoX2luaXQoJml0ZW0tPmZoLCBzLT52ZGV2KTsKLQlpZiAocy0+dHlwZSA9PSBJVlRWX0RFQ19TVFJFQU1fVFlQRV9ZVVYgfHwKLQkgICAgcy0+dHlwZSA9PSBJVlRWX0RFQ19TVFJFQU1fVFlQRV9NUEcpIHsKLQkJcmVzID0gdjRsMl9ldmVudF9hbGxvYygmaXRlbS0+ZmgsIDYwKTsKLQl9CiAJaWYgKHJlcyA8IDApIHsKIAkJdjRsMl9maF9leGl0KCZpdGVtLT5maCk7CiAJCWtmcmVlKGl0ZW0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaW9jdGwuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LWlvY3RsLmMKaW5kZXggMTIwYzdkOC4uM2U1YzA5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtaW9jdGwuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di1pb2N0bC5jCkBAIC03NTcsNyArNzU3LDYgQEAKIAlzdHJsY3B5KHZjYXAtPmRyaXZlciwgSVZUVl9EUklWRVJfTkFNRSwgc2l6ZW9mKHZjYXAtPmRyaXZlcikpOwogCXN0cmxjcHkodmNhcC0+Y2FyZCwgaXR2LT5jYXJkX25hbWUsIHNpemVvZih2Y2FwLT5jYXJkKSk7CiAJc25wcmludGYodmNhcC0+YnVzX2luZm8sIHNpemVvZih2Y2FwLT5idXNfaW5mbyksICJQQ0k6JXMiLCBwY2lfbmFtZShpdHYtPnBkZXYpKTsKLQl2Y2FwLT52ZXJzaW9uID0gSVZUVl9EUklWRVJfVkVSU0lPTjsgCSAgICAvKiB2ZXJzaW9uICovCiAJdmNhcC0+Y2FwYWJpbGl0aWVzID0gaXR2LT52NGwyX2NhcDsgCSAgICAvKiBjYXBhYmlsaXRpZXMgKi8KIAlyZXR1cm4gMDsKIH0KQEAgLTE0NTEsMTEgKzE0NTAsMTEgQEAKIAlzd2l0Y2ggKHN1Yi0+dHlwZSkgewogCWNhc2UgVjRMMl9FVkVOVF9WU1lOQzoKIAljYXNlIFY0TDJfRVZFTlRfRU9TOgotCQlicmVhazsKKwljYXNlIFY0TDJfRVZFTlRfQ1RSTDoKKwkJcmV0dXJuIHY0bDJfZXZlbnRfc3Vic2NyaWJlKGZoLCBzdWIsIDApOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRUlOVkFMOwogCX0KLQlyZXR1cm4gdjRsMl9ldmVudF9zdWJzY3JpYmUoZmgsIHN1Yik7CiB9CiAKIHN0YXRpYyBpbnQgaXZ0dl9sb2dfc3RhdHVzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXZlcnNpb24uaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vaXZ0di9pdnR2LXZlcnNpb24uaAppbmRleCBiNjdhNDA0Li5hMjBmMzQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2l2dHYvaXZ0di12ZXJzaW9uLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9pdnR2L2l2dHYtdmVyc2lvbi5oCkBAIC0yMSwxMSArMjEsNiBAQAogI2RlZmluZSBJVlRWX1ZFUlNJT05fSAogCiAjZGVmaW5lIElWVFZfRFJJVkVSX05BTUUgIml2dHYiCi0jZGVmaW5lIElWVFZfRFJJVkVSX1ZFUlNJT05fTUFKT1IgMQotI2RlZmluZSBJVlRWX0RSSVZFUl9WRVJTSU9OX01JTk9SIDQKLSNkZWZpbmUgSVZUVl9EUklWRVJfVkVSU0lPTl9QQVRDSExFVkVMIDIKLQotI2RlZmluZSBJVlRWX1ZFUlNJT04gX19zdHJpbmdpZnkoSVZUVl9EUklWRVJfVkVSU0lPTl9NQUpPUikgIi4iIF9fc3RyaW5naWZ5KElWVFZfRFJJVkVSX1ZFUlNJT05fTUlOT1IpICIuIiBfX3N0cmluZ2lmeShJVlRWX0RSSVZFUl9WRVJTSU9OX1BBVENITEVWRUwpCi0jZGVmaW5lIElWVFZfRFJJVkVSX1ZFUlNJT04gS0VSTkVMX1ZFUlNJT04oSVZUVl9EUklWRVJfVkVSU0lPTl9NQUpPUixJVlRWX0RSSVZFUl9WRVJTSU9OX01JTk9SLElWVFZfRFJJVkVSX1ZFUlNJT05fUEFUQ0hMRVZFTCkKKyNkZWZpbmUgSVZUVl9WRVJTSU9OICIxLjQuMyIKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHNfY2FwdHVyZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tNW1vbHMvbTVtb2xzX2NhcHR1cmUuYwppbmRleCBhNDVkOGYwLi4zMjQ4YWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHNfY2FwdHVyZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbTVtb2xzL201bW9sc19jYXB0dXJlLmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHNfY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tNW1vbHMvbTVtb2xzX2NvcmUuYwppbmRleCA0M2M2OGY1Li5mYjhlNGE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHNfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbTVtb2xzL201bW9sc19jb3JlLmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21hcnZlbGwtY2NpYy9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS92aWRlby9tYXJ2ZWxsLWNjaWMvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjczOWUzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tYXJ2ZWxsLWNjaWMvS2NvbmZpZwpAQCAtMCwwICsxLDIzIEBACitjb25maWcgVklERU9fQ0FGRV9DQ0lDCisJdHJpc3RhdGUgIk1hcnZlbGwgODhBTFAwMSAoQ2FmZSkgQ01PUyBDYW1lcmEgQ29udHJvbGxlciBzdXBwb3J0IgorCWRlcGVuZHMgb24gUENJICYmIEkyQyAmJiBWSURFT19WNEwyCisJc2VsZWN0IFZJREVPX09WNzY3MAorCXNlbGVjdCBWSURFT0JVRjJfVk1BTExPQworCXNlbGVjdCBWSURFT0JVRjJfRE1BX0NPTlRJRworCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSB2aWRlbzRsaW51eDIgZHJpdmVyIGZvciB0aGUgTWFydmVsbCA4OEFMUDAxIGludGVncmF0ZWQKKwkgIENNT1MgY2FtZXJhIGNvbnRyb2xsZXIuICBUaGlzIGlzIHRoZSBjb250cm9sbGVyIGZvdW5kIG9uIGZpcnN0LQorCSAgZ2VuZXJhdGlvbiBPTFBDIHN5c3RlbXMuCisKK2NvbmZpZyBWSURFT19NTVBfQ0FNRVJBCisJdHJpc3RhdGUgIk1hcnZlbGwgQXJtYWRhIDYxMCBpbnRlZ3JhdGVkIGNhbWVyYSBjb250cm9sbGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBUkNIX01NUCAmJiBJMkMgJiYgVklERU9fVjRMMgorCXNlbGVjdCBWSURFT19PVjc2NzAKKwlzZWxlY3QgSTJDX0dQSU8KKwlzZWxlY3QgVklERU9CVUYyX0RNQV9TRworCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgYSBWaWRlbzRMaW51eDIgZHJpdmVyIGZvciB0aGUgaW50ZWdyYXRlZCBjYW1lcmEKKwkgIGNvbnRyb2xsZXIgZm91bmQgb24gTWFydmVsbCBBcm1hZGEgNjEwIGFwcGxpY2F0aW9uCisJICBwcm9jZXNzb3JzIChhbmQgbGlrZWx5IGJleW9uZCkuICBUaGlzIGlzIHRoZSBjb250cm9sbGVyIGZvdW5kCisJICBpbiBPTFBDIFhPIDEuNzUgc3lzdGVtcy4KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tYXJ2ZWxsLWNjaWMvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21hcnZlbGwtY2NpYy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWE3OTJjNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWFydmVsbC1jY2ljL01ha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorb2JqLSQoQ09ORklHX1ZJREVPX0NBRkVfQ0NJQykgKz0gY2FmZV9jY2ljLm8KK2NhZmVfY2NpYy15IDo9IGNhZmUtZHJpdmVyLm8gbWNhbS1jb3JlLm8KKworb2JqLSQoQ09ORklHX1ZJREVPX01NUF9DQU1FUkEpICs9IG1tcF9jYW1lcmEubworbW1wX2NhbWVyYS15IDo9IG1tcC1kcml2ZXIubyBtY2FtLWNvcmUubworCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21hcnZlbGwtY2NpYy9jYWZlLWRyaXZlci5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tYXJ2ZWxsLWNjaWMvY2FmZS1kcml2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDMwZjliCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tYXJ2ZWxsLWNjaWMvY2FmZS1kcml2ZXIuYwpAQCAtMCwwICsxLDY1NCBAQAorLyoKKyAqIEEgZHJpdmVyIGZvciB0aGUgQ01PUyBjYW1lcmEgY29udHJvbGxlciBpbiB0aGUgTWFydmVsbCA4OEFMUDAxICJjYWZlIgorICogbXVsdGlmdW5jdGlvbiBjaGlwLiAgQ3VycmVudGx5IHdvcmtzIHdpdGggdGhlIE9tbml2aXNpb24gT1Y3NjcwCisgKiBzZW5zb3IuCisgKgorICogVGhlIGRhdGEgc2hlZXQgZm9yIHRoaXMgZGV2aWNlIGNhbiBiZSBmb3VuZCBhdDoKKyAqICAgIGh0dHA6Ly93d3cubWFydmVsbC5jb20vcHJvZHVjdHMvcGNfY29ubmVjdGl2aXR5Lzg4YWxwMDEvCisgKgorICogQ29weXJpZ2h0IDIwMDYtMTEgT25lIExhcHRvcCBQZXIgQ2hpbGQgQXNzb2NpYXRpb24sIEluYy4KKyAqIENvcHlyaWdodCAyMDA2LTExIEpvbmF0aGFuIENvcmJldCA8Y29yYmV0QGx3bi5uZXQ+CisgKgorICogV3JpdHRlbiBieSBKb25hdGhhbiBDb3JiZXQsIGNvcmJldEBsd24ubmV0LgorICoKKyAqIHY0bDJfZGV2aWNlL3Y0bDJfc3ViZGV2IGNvbnZlcnNpb24gYnk6CisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgSGFucyBWZXJrdWlsIDxodmVya3VpbEB4czRhbGwubmw+CisgKgorICogVGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jaGlwLWlkZW50Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgIm1jYW0tY29yZS5oIgorCisjZGVmaW5lIENBRkVfVkVSU0lPTiAweDAwMDAwMgorCisKKy8qCisgKiBQYXJhbWV0ZXJzLgorICovCitNT0RVTEVfQVVUSE9SKCJKb25hdGhhbiBDb3JiZXQgPGNvcmJldEBsd24ubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJNYXJ2ZWxsIDg4QUxQMDEgQ01PUyBDYW1lcmEgQ29udHJvbGxlciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9TVVBQT1JURURfREVWSUNFKCJWaWRlbyIpOworCisKKworCitzdHJ1Y3QgY2FmZV9jYW1lcmEgeworCWludCByZWdpc3RlcmVkOwkJCS8qIEZ1bGx5IGluaXRpYWxpemVkPyAqLworCXN0cnVjdCBtY2FtX2NhbWVyYSBtY2FtOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXdhaXRfcXVldWVfaGVhZF90IHNtYnVzX3dhaXQ7CS8qIFdhaXRpbmcgb24gaTJjIGV2ZW50cyAqLworfTsKKworLyoKKyAqIE1vc3Qgb2YgdGhlIGNhbWVyYSBjb250cm9sbGVyIHJlZ2lzdGVycyBhcmUgZGVmaW5lZCBpbiBtY2FtLWNvcmUuaCwKKyAqIGJ1dCB0aGUgQ2FmZSBwbGF0Zm9ybSBoYXMgc29tZSBhZGRpdGlvbmFsIHJlZ2lzdGVycyBvZiBpdHMgb3duOworICogdGhleSBhcmUgZGVzY3JpYmVkIGhlcmUuCisgKi8KKworLyoKKyAqICJHZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIiIGhhcyBhIGNvdXBsZSBvZiBHUElPcyB1c2VkIGZvciBzZW5zb3IKKyAqIHBvd2VyIGFuZCByZXNldCBvbiBPTFBDIFhPIDEuMCBzeXN0ZW1zLgorICovCisjZGVmaW5lIFJFR19HUFIJCTB4YjQKKyNkZWZpbmUJICBHUFJfQzFFTgkgIDB4MDAwMDAwMjAJLyogUGFkIDEgKHBvd2VyIGRvd24pIGVuYWJsZSAqLworI2RlZmluZQkgIEdQUl9DMEVOCSAgMHgwMDAwMDAxMAkvKiBQYWQgMCAocmVzZXQpIGVuYWJsZSAqLworI2RlZmluZQkgIEdQUl9DMQkgIDB4MDAwMDAwMDIJLyogQ29udHJvbCAxIHZhbHVlICovCisvKgorICogQ29udHJvbCAwIGlzIHdpcmVkIHRvIHJlc2V0IG9uIE9MUEMgbWFjaGluZXMuICBGb3Igb3Y3eCBzZW5zb3JzLAorICogaXQgaXMgYWN0aXZlIGxvdy4KKyAqLworI2RlZmluZQkgIEdQUl9DMAkgIDB4MDAwMDAwMDEJLyogQ29udHJvbCAwIHZhbHVlICovCisKKy8qCisgKiBUaGVzZSByZWdpc3RlcnMgY29udHJvbCB0aGUgU01CVVMgbW9kdWxlIGZvciBjb21tdW5pY2F0aW5nCisgKiB3aXRoIHRoZSBzZW5zb3IuCisgKi8KKyNkZWZpbmUgUkVHX1RXU0lDMAkweGI4CS8qIFRXU0kgKHNtYnVzKSBjb250cm9sIDAgKi8KKyNkZWZpbmUJICBUV1NJQzBfRU4JICAweDAwMDAwMDAxCS8qIFRXU0kgZW5hYmxlICovCisjZGVmaW5lCSAgVFdTSUMwX01PREUJICAweDAwMDAwMDAyCS8qIDEgPSAxNi1iaXQsIDAgPSA4LWJpdCAqLworI2RlZmluZQkgIFRXU0lDMF9TSUQJICAweDAwMDAwM2ZjCS8qIFNsYXZlIElEICovCisvKgorICogU3VidGxlIHRyaWNrZXJ5OiB0aGUgc2xhdmUgSUQgZmllbGQgc3RhcnRzIHdpdGggYml0IDIuICBCdXQgdGhlCisgKiBMaW51eCBpMmMgc3RhY2sgd2FudHMgdG8gdHJlYXQgdGhlIGJvdHRvbW1vc3QgYml0IGFzIGEgc2VwYXJhdGUKKyAqIHJlYWQvd3JpdGUgYml0LCB3aGljaCBpcyB3aHkgc2xhdmUgSUQncyBhcmUgdXN1YWxseSBwcmVzZW50ZWQKKyAqID4+MS4gIEZvciBjb25zaXN0ZW5jeSB3aXRoIHRoYXQgYmVoYXZpb3IsIHdlIHNoaWZ0IG92ZXIgdGhyZWUKKyAqIGJpdHMgaW5zdGVhZCBvZiB0d28uCisgKi8KKyNkZWZpbmUJICBUV1NJQzBfU0lEX1NISUZUIDMKKyNkZWZpbmUJICBUV1NJQzBfQ0xLRElWCSAgMHgwMDA3ZmMwMAkvKiBDbG9jayBkaXZpZGVyICovCisjZGVmaW5lCSAgVFdTSUMwX01BU0tBQ0sgIDB4MDA0MDAwMDAJLyogTWFzayBhY2sgZnJvbSBzZW5zb3IgKi8KKyNkZWZpbmUJICBUV1NJQzBfT1ZNQUdJQyAgMHgwMDgwMDAwMAkvKiBNYWtlIGl0IHdvcmsgb24gT1Ygc2Vuc29ycyAqLworCisjZGVmaW5lIFJFR19UV1NJQzEJMHhiYwkvKiBUV1NJIGNvbnRyb2wgMSAqLworI2RlZmluZQkgIFRXU0lDMV9EQVRBCSAgMHgwMDAwZmZmZgkvKiBEYXRhIHRvL2Zyb20gY2FtY2hpcCAqLworI2RlZmluZQkgIFRXU0lDMV9BRERSCSAgMHgwMGZmMDAwMAkvKiBBZGRyZXNzIChyZWdpc3RlcikgKi8KKyNkZWZpbmUJICBUV1NJQzFfQUREUl9TSElGVCAxNgorI2RlZmluZQkgIFRXU0lDMV9SRUFECSAgMHgwMTAwMDAwMAkvKiBTZXQgZm9yIHJlYWQgb3AgKi8KKyNkZWZpbmUJICBUV1NJQzFfV1NUQVQJICAweDAyMDAwMDAwCS8qIFdyaXRlIHN0YXR1cyAqLworI2RlZmluZQkgIFRXU0lDMV9SVkFMSUQJICAweDA0MDAwMDAwCS8qIFJlYWQgZGF0YSB2YWxpZCAqLworI2RlZmluZQkgIFRXU0lDMV9FUlJPUgkgIDB4MDgwMDAwMDAJLyogU29tZXRoaW5nIHNjcmV3ZWQgdXAgKi8KKworLyoKKyAqIEhlcmUncyB0aGUgd2VpcmQgZ2xvYmFsIGNvbnRyb2wgcmVnaXN0ZXJzCisgKi8KKyNkZWZpbmUgUkVHX0dMX0NTUiAgICAgMHgzMDA0ICAvKiBDb250cm9sL3N0YXR1cyByZWdpc3RlciAqLworI2RlZmluZQkgIEdDU1JfU1JTCSAweDAwMDAwMDAxCS8qIFNXIFJlc2V0IHNldCAqLworI2RlZmluZQkgIEdDU1JfU1JDCSAweDAwMDAwMDAyCS8qIFNXIFJlc2V0IGNsZWFyICovCisjZGVmaW5lCSAgR0NTUl9NUlMJIDB4MDAwMDAwMDQJLyogTWFzdGVyIHJlc2V0IHNldCAqLworI2RlZmluZQkgIEdDU1JfTVJDCSAweDAwMDAwMDA4CS8qIEhXIFJlc2V0IGNsZWFyICovCisjZGVmaW5lCSAgR0NTUl9DQ0lDX0VOCSAweDAwMDA0MDAwICAgIC8qIENDSUMgQ2xvY2sgZW5hYmxlICovCisjZGVmaW5lIFJFR19HTF9JTUFTSyAgIDB4MzAwYyAgLyogSW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJICBHSU1TS19DQ0lDX0VOCQkgMHgwMDAwMDAwNCAgICAvKiBDQ0lDIEludGVycnVwdCBlbmFibGUgKi8KKworI2RlZmluZSBSRUdfR0xfRkNSCTB4MzAzOAkvKiBHUElPIGZ1bmN0aW9uYWwgY29udHJvbCByZWdpc3RlciAqLworI2RlZmluZQkgIEdGQ1JfR1BJT19PTgkgIDB4MDgJCS8qIENhbWVyYSBHUElPIGVuYWJsZWQgKi8KKyNkZWZpbmUgUkVHX0dMX0dQSU9SCTB4MzE1YwkvKiBHUElPIHJlZ2lzdGVyICovCisjZGVmaW5lCSAgR0dQSU9fT1VUCQkweDgwMDAwCS8qIEdQSU8gb3V0cHV0ICovCisjZGVmaW5lCSAgR0dQSU9fVkFMCQkweDAwMDA4CS8qIE91dHB1dCBwaW4gdmFsdWUgKi8KKworI2RlZmluZSBSRUdfTEVOCQkgICAgICAgKFJFR19HTF9JTUFTSyArIDQpCisKKworLyoKKyAqIERlYnVnZ2luZyBhbmQgcmVsYXRlZC4KKyAqLworI2RlZmluZSBjYW1fZXJyKGNhbSwgZm10LCBhcmcuLi4pIFwKKwlkZXZfZXJyKCYoY2FtKS0+cGRldi0+ZGV2LCBmbXQsICMjYXJnKTsKKyNkZWZpbmUgY2FtX3dhcm4oY2FtLCBmbXQsIGFyZy4uLikgXAorCWRldl93YXJuKCYoY2FtKS0+cGRldi0+ZGV2LCBmbXQsICMjYXJnKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qCisgKiBUaGUgSTJDL1NNQlVTIGludGVyZmFjZSB0byB0aGUgY2FtZXJhIGl0c2VsZiBzdGFydHMgaGVyZS4gIFRoZQorICogY29udHJvbGxlciBoYW5kbGVzIFNNQlVTIGl0c2VsZiwgcHJlc2VudGluZyBhIHJlbGF0aXZlbHkgc2ltcGxlIHJlZ2lzdGVyCisgKiBpbnRlcmZhY2U7IGFsbCB3ZSBoYXZlIHRvIGRvIGlzIHRvIHRlbGwgaXQgd2hlcmUgdG8gcm91dGUgdGhlIGRhdGEuCisgKi8KKyNkZWZpbmUgQ0FGRV9TTUJVU19USU1FT1VUIChIWikgIC8qIGdlbmVyb3VzICovCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNhZmVfY2FtZXJhICp0b19jYW0oc3RydWN0IHY0bDJfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICptID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IG1jYW1fY2FtZXJhLCB2NGwyX2Rldik7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihtLCBzdHJ1Y3QgY2FmZV9jYW1lcmEsIG1jYW0pOworfQorCisKK3N0YXRpYyBpbnQgY2FmZV9zbWJ1c193cml0ZV9kb25lKHN0cnVjdCBtY2FtX2NhbWVyYSAqbWNhbSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjMTsKKworCS8qCisJICogV2UgbXVzdCBkZWxheSBhZnRlciB0aGUgaW50ZXJydXB0LCBvciB0aGUgY29udHJvbGxlciBnZXRzIGNvbmZ1c2VkCisJICogYW5kIG5ldmVyIGRvZXMgZ2l2ZSB1cyBnb29kIHN0YXR1cy4gIEZvcnR1bmF0ZWx5LCB3ZSBkb24ndCBkbyB0aGlzCisJICogb2Z0ZW4uCisJICovCisJdWRlbGF5KDIwKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwljMSA9IG1jYW1fcmVnX3JlYWQobWNhbSwgUkVHX1RXU0lDMSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gKGMxICYgKFRXU0lDMV9XU1RBVHxUV1NJQzFfRVJST1IpKSAhPSBUV1NJQzFfV1NUQVQ7Cit9CisKK3N0YXRpYyBpbnQgY2FmZV9zbWJ1c193cml0ZV9kYXRhKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtLAorCQl1MTYgYWRkciwgdTggY29tbWFuZCwgdTggdmFsdWUpCit7CisJdW5zaWduZWQgaW50IHJ2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKm1jYW0gPSAmY2FtLT5tY2FtOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1jYW0tPmRldl9sb2NrLCBmbGFncyk7CisJcnZhbCA9IFRXU0lDMF9FTiB8ICgoYWRkciA8PCBUV1NJQzBfU0lEX1NISUZUKSAmIFRXU0lDMF9TSUQpOworCXJ2YWwgfD0gVFdTSUMwX09WTUFHSUM7ICAvKiBNYWtlIE9WIHNlbnNvcnMgd29yayAqLworCS8qCisJICogTWFydmVsbCBzZXogc2V0IGNsa2RpdiB0byBhbGwgMSdzIGZvciBub3cuCisJICovCisJcnZhbCB8PSBUV1NJQzBfQ0xLRElWOworCW1jYW1fcmVnX3dyaXRlKG1jYW0sIFJFR19UV1NJQzAsIHJ2YWwpOworCSh2b2lkKSBtY2FtX3JlZ19yZWFkKG1jYW0sIFJFR19UV1NJQzEpOyAvKiBmb3JjZSB3cml0ZSAqLworCXJ2YWwgPSB2YWx1ZSB8ICgoY29tbWFuZCA8PCBUV1NJQzFfQUREUl9TSElGVCkgJiBUV1NJQzFfQUREUik7CisJbWNhbV9yZWdfd3JpdGUobWNhbSwgUkVHX1RXU0lDMSwgcnZhbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKworCS8qIFVuZm9ydHVuYXRlbHksIHJlYWRpbmcgVFdTSUMxIHRvbyBzb29uIGFmdGVyIHNlbmRpbmcgYSBjb21tYW5kCisJICogY2F1c2VzIHRoZSBkZXZpY2UgdG8gZGllLgorCSAqIFVzZSBhIGJ1c3ktd2FpdCBiZWNhdXNlIHdlIG9mdGVuIHNlbmQgYSBsYXJnZSBxdWFudGl0eSBvZiBzbWFsbAorCSAqIGNvbW1hbmRzIGF0LW9uY2U7IHVzaW5nIG1zbGVlcCgpIHdvdWxkIGNhdXNlIGEgbG90IG9mIGNvbnRleHQKKwkgKiBzd2l0Y2hlcyB3aGljaCB0YWtlIGxvbmdlciB0aGFuIDJtcywgcmVzdWx0aW5nIGluIGEgbm90aWNlYWJsZQorCSAqIGJvb3QtdGltZSBhbmQgY2FwdHVyZS1zdGFydCBkZWxheXMuCisJICovCisJbWRlbGF5KDIpOworCisJLyoKKwkgKiBBbm90aGVyIHNhZCBmYWN0IGlzIHRoYXQgc29tZXRpbWVzLCBjb21tYW5kcyBzaWxlbnRseSBjb21wbGV0ZSBidXQKKwkgKiBjYWZlX3NtYnVzX3dyaXRlX2RvbmUoKSBuZXZlciBiZWNvbWVzIGF3YXJlIG9mIHRoaXMuCisJICogVGhpcyBoYXBwZW5zIGF0IHJhbmRvbSBhbmQgYXBwZWFycyB0byBwb3NzaWJsZSBvY2N1ciB3aXRoIGFueQorCSAqIGNvbW1hbmQuCisJICogV2UgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgdGhpcyBpcy4gV2Ugd29yayBhcm91bmQgdGhpcyBpc3N1ZQorCSAqIHdpdGggdGhlIHRpbWVvdXQgaW4gdGhlIHdhaXQgYmVsb3csIGFzc3VtaW5nIHRoYXQgYWxsIGNvbW1hbmRzCisJICogY29tcGxldGUgd2l0aGluIHRoZSB0aW1lb3V0LgorCSAqLworCXdhaXRfZXZlbnRfdGltZW91dChjYW0tPnNtYnVzX3dhaXQsIGNhZmVfc21idXNfd3JpdGVfZG9uZShtY2FtKSwKKwkJCUNBRkVfU01CVVNfVElNRU9VVCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwlydmFsID0gbWNhbV9yZWdfcmVhZChtY2FtLCBSRUdfVFdTSUMxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCisJaWYgKHJ2YWwgJiBUV1NJQzFfV1NUQVQpIHsKKwkJY2FtX2VycihjYW0sICJTTUJVUyB3cml0ZSAoJTAyeC8lMDJ4LyUwMngpIHRpbWVkIG91dFxuIiwgYWRkciwKKwkJCQljb21tYW5kLCB2YWx1ZSk7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAocnZhbCAmIFRXU0lDMV9FUlJPUikgeworCQljYW1fZXJyKGNhbSwgIlNNQlVTIHdyaXRlICglMDJ4LyUwMngvJTAyeCkgZXJyb3JcbiIsIGFkZHIsCisJCQkJY29tbWFuZCwgdmFsdWUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworCitzdGF0aWMgaW50IGNhZmVfc21idXNfcmVhZF9kb25lKHN0cnVjdCBtY2FtX2NhbWVyYSAqbWNhbSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjMTsKKworCS8qCisJICogV2UgbXVzdCBkZWxheSBhZnRlciB0aGUgaW50ZXJydXB0LCBvciB0aGUgY29udHJvbGxlciBnZXRzIGNvbmZ1c2VkCisJICogYW5kIG5ldmVyIGRvZXMgZ2l2ZSB1cyBnb29kIHN0YXR1cy4gIEZvcnR1bmF0ZWx5LCB3ZSBkb24ndCBkbyB0aGlzCisJICogb2Z0ZW4uCisJICovCisJdWRlbGF5KDIwKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwljMSA9IG1jYW1fcmVnX3JlYWQobWNhbSwgUkVHX1RXU0lDMSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gYzEgJiAoVFdTSUMxX1JWQUxJRHxUV1NJQzFfRVJST1IpOworfQorCisKKworc3RhdGljIGludCBjYWZlX3NtYnVzX3JlYWRfZGF0YShzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSwKKwkJdTE2IGFkZHIsIHU4IGNvbW1hbmQsIHU4ICp2YWx1ZSkKK3sKKwl1bnNpZ25lZCBpbnQgcnZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBtY2FtX2NhbWVyYSAqbWNhbSA9ICZjYW0tPm1jYW07CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwlydmFsID0gVFdTSUMwX0VOIHwgKChhZGRyIDw8IFRXU0lDMF9TSURfU0hJRlQpICYgVFdTSUMwX1NJRCk7CisJcnZhbCB8PSBUV1NJQzBfT1ZNQUdJQzsgLyogTWFrZSBPViBzZW5zb3JzIHdvcmsgKi8KKwkvKgorCSAqIE1hcnZlbCBzZXogc2V0IGNsa2RpdiB0byBhbGwgMSdzIGZvciBub3cuCisJICovCisJcnZhbCB8PSBUV1NJQzBfQ0xLRElWOworCW1jYW1fcmVnX3dyaXRlKG1jYW0sIFJFR19UV1NJQzAsIHJ2YWwpOworCSh2b2lkKSBtY2FtX3JlZ19yZWFkKG1jYW0sIFJFR19UV1NJQzEpOyAvKiBmb3JjZSB3cml0ZSAqLworCXJ2YWwgPSBUV1NJQzFfUkVBRCB8ICgoY29tbWFuZCA8PCBUV1NJQzFfQUREUl9TSElGVCkgJiBUV1NJQzFfQUREUik7CisJbWNhbV9yZWdfd3JpdGUobWNhbSwgUkVHX1RXU0lDMSwgcnZhbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKworCXdhaXRfZXZlbnRfdGltZW91dChjYW0tPnNtYnVzX3dhaXQsCisJCQljYWZlX3NtYnVzX3JlYWRfZG9uZShtY2FtKSwgQ0FGRV9TTUJVU19USU1FT1VUKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwlydmFsID0gbWNhbV9yZWdfcmVhZChtY2FtLCBSRUdfVFdTSUMxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCisJaWYgKHJ2YWwgJiBUV1NJQzFfRVJST1IpIHsKKwkJY2FtX2VycihjYW0sICJTTUJVUyByZWFkICglMDJ4LyUwMngpIGVycm9yXG4iLCBhZGRyLCBjb21tYW5kKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmICghKHJ2YWwgJiBUV1NJQzFfUlZBTElEKSkgeworCQljYW1fZXJyKGNhbSwgIlNNQlVTIHJlYWQgKCUwMngvJTAyeCkgdGltZWQgb3V0XG4iLCBhZGRyLAorCQkJCWNvbW1hbmQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJKnZhbHVlID0gcnZhbCAmIDB4ZmY7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQZXJmb3JtIGEgdHJhbnNmZXIgb3ZlciBTTUJVUy4gIFRoaXMgdGhpbmcgaXMgY2FsbGVkIHVuZGVyCisgKiB0aGUgaTJjIGJ1cyBsb2NrLCBzbyB3ZSBzaG91bGRuJ3QgcmFjZSB3aXRoIG91cnNlbHZlcy4uLgorICovCitzdGF0aWMgaW50IGNhZmVfc21idXNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIHUxNiBhZGRyLAorCQl1bnNpZ25lZCBzaG9ydCBmbGFncywgY2hhciBydywgdTggY29tbWFuZCwKKwkJaW50IHNpemUsIHVuaW9uIGkyY19zbWJ1c19kYXRhICpkYXRhKQoreworCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gaTJjX2dldF9hZGFwZGF0YShhZGFwdGVyKTsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKworCS8qCisJICogVGhpcyBpbnRlcmZhY2Ugd291bGQgYXBwZWFyIHRvIG9ubHkgZG8gYnl0ZSBkYXRhIG9wcy4gIE9LCisJICogaXQgY2FuIGRvIHdvcmQgdG9vLCBidXQgdGhlIGNhbSBjaGlwIGhhcyBubyB1c2UgZm9yIHRoYXQuCisJICovCisJaWYgKHNpemUgIT0gSTJDX1NNQlVTX0JZVEVfREFUQSkgeworCQljYW1fZXJyKGNhbSwgImZ1bmt5IHhmZXIgc2l6ZSAlZFxuIiwgc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChydyA9PSBJMkNfU01CVVNfV1JJVEUpCisJCXJldCA9IGNhZmVfc21idXNfd3JpdGVfZGF0YShjYW0sIGFkZHIsIGNvbW1hbmQsIGRhdGEtPmJ5dGUpOworCWVsc2UgaWYgKHJ3ID09IEkyQ19TTUJVU19SRUFEKQorCQlyZXQgPSBjYWZlX3NtYnVzX3JlYWRfZGF0YShjYW0sIGFkZHIsIGNvbW1hbmQsICZkYXRhLT5ieXRlKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB2b2lkIGNhZmVfc21idXNfZW5hYmxlX2lycShzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+bWNhbS5kZXZfbG9jaywgZmxhZ3MpOworCW1jYW1fcmVnX3NldF9iaXQoJmNhbS0+bWNhbSwgUkVHX0lSUU1BU0ssIFRXU0lJUlFTKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPm1jYW0uZGV2X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHUzMiBjYWZlX3NtYnVzX2Z1bmMoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKQoreworCXJldHVybiBJMkNfRlVOQ19TTUJVU19SRUFEX0JZVEVfREFUQSAgfAorCSAgICAgICBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFX0RBVEE7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBjYWZlX3NtYnVzX2FsZ28gPSB7CisJLnNtYnVzX3hmZXIgPSBjYWZlX3NtYnVzX3hmZXIsCisJLmZ1bmN0aW9uYWxpdHkgPSBjYWZlX3NtYnVzX2Z1bmMKK307CisKK3N0YXRpYyBpbnQgY2FmZV9zbWJ1c19zZXR1cChzdHJ1Y3QgY2FmZV9jYW1lcmEgKmNhbSkKK3sKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXA7CisJaW50IHJldDsKKworCWFkYXAgPSBremFsbG9jKHNpemVvZigqYWRhcCksIEdGUF9LRVJORUwpOworCWlmIChhZGFwID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCWNhbS0+bWNhbS5pMmNfYWRhcHRlciA9IGFkYXA7CisJY2FmZV9zbWJ1c19lbmFibGVfaXJxKGNhbSk7CisJYWRhcC0+b3duZXIgPSBUSElTX01PRFVMRTsKKwlhZGFwLT5hbGdvID0gJmNhZmVfc21idXNfYWxnbzsKKwlzdHJjcHkoYWRhcC0+bmFtZSwgImNhZmVfY2NpYyIpOworCWFkYXAtPmRldi5wYXJlbnQgPSAmY2FtLT5wZGV2LT5kZXY7CisJaTJjX3NldF9hZGFwZGF0YShhZGFwLCBjYW0pOworCXJldCA9IGkyY19hZGRfYWRhcHRlcihhZGFwKTsKKwlpZiAocmV0KQorCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byByZWdpc3RlciBjYWZlIGkyYyBhZGFwdGVyXG4iKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBjYWZlX3NtYnVzX3NodXRkb3duKHN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtKQoreworCWkyY19kZWxfYWRhcHRlcihjYW0tPm1jYW0uaTJjX2FkYXB0ZXIpOworCWtmcmVlKGNhbS0+bWNhbS5pMmNfYWRhcHRlcik7Cit9CisKKworLyoKKyAqIENvbnRyb2xsZXItbGV2ZWwgc3R1ZmYKKyAqLworCitzdGF0aWMgdm9pZCBjYWZlX2N0bHJfaW5pdChzdHJ1Y3QgbWNhbV9jYW1lcmEgKm1jYW0pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCS8qCisJICogQWRkZWQgbWFnaWMgdG8gYnJpbmcgdXAgdGhlIGhhcmR3YXJlIG9uIHRoZSBCLVRlc3QgYm9hcmQKKwkgKi8KKwltY2FtX3JlZ193cml0ZShtY2FtLCAweDMwMzgsIDB4OCk7CisJbWNhbV9yZWdfd3JpdGUobWNhbSwgMHgzMTVjLCAweDgwMDA4KTsKKwkvKgorCSAqIEdvIHRocm91Z2ggdGhlIGRhbmNlIG5lZWRlZCB0byB3YWtlIHRoZSBkZXZpY2UgdXAuCisJICogTm90ZSB0aGF0IHRoZXNlIHJlZ2lzdGVycyBhcmUgZ2xvYmFsIGFuZCBzaGFyZWQKKwkgKiB3aXRoIHRoZSBOQU5EIGFuZCBTRCBkZXZpY2VzLiAgSW50ZXJhY3Rpb24gYmV0d2VlbiB0aGUKKwkgKiB0aHJlZSBzdGlsbCBuZWVkcyB0byBiZSBleGFtaW5lZC4KKwkgKi8KKwltY2FtX3JlZ193cml0ZShtY2FtLCBSRUdfR0xfQ1NSLCBHQ1NSX1NSU3xHQ1NSX01SUyk7IC8qIE5lZWRlZD8gKi8KKwltY2FtX3JlZ193cml0ZShtY2FtLCBSRUdfR0xfQ1NSLCBHQ1NSX1NSQ3xHQ1NSX01SQyk7CisJbWNhbV9yZWdfd3JpdGUobWNhbSwgUkVHX0dMX0NTUiwgR0NTUl9TUkN8R0NTUl9NUlMpOworCS8qCisJICogSGVyZSB3ZSBtdXN0IHdhaXQgYSBiaXQgZm9yIHRoZSBjb250cm9sbGVyIHRvIGNvbWUgYXJvdW5kLgorCSAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1jYW0tPmRldl9sb2NrLCBmbGFncyk7CisJbXNsZWVwKDUpOworCXNwaW5fbG9ja19pcnFzYXZlKCZtY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCisJbWNhbV9yZWdfd3JpdGUobWNhbSwgUkVHX0dMX0NTUiwgR0NTUl9DQ0lDX0VOfEdDU1JfU1JDfEdDU1JfTVJDKTsKKwltY2FtX3JlZ19zZXRfYml0KG1jYW0sIFJFR19HTF9JTUFTSywgR0lNU0tfQ0NJQ19FTik7CisJLyoKKwkgKiBNYXNrIGFsbCBpbnRlcnJ1cHRzLgorCSAqLworCW1jYW1fcmVnX3dyaXRlKG1jYW0sIFJFR19JUlFNQVNLLCAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworfQorCisKK3N0YXRpYyB2b2lkIGNhZmVfY3Rscl9wb3dlcl91cChzdHJ1Y3QgbWNhbV9jYW1lcmEgKm1jYW0pCit7CisJLyoKKwkgKiBQYXJ0IG9uZSBvZiB0aGUgc2Vuc29yIGRhbmNlOiB0dXJuIHRoZSBnbG9iYWwKKwkgKiBHUElPIHNpZ25hbCBvbi4KKwkgKi8KKwltY2FtX3JlZ193cml0ZShtY2FtLCBSRUdfR0xfRkNSLCBHRkNSX0dQSU9fT04pOworCW1jYW1fcmVnX3dyaXRlKG1jYW0sIFJFR19HTF9HUElPUiwgR0dQSU9fT1VUfEdHUElPX1ZBTCk7CisJLyoKKwkgKiBQdXQgdGhlIHNlbnNvciBpbnRvIG9wZXJhdGlvbmFsIG1vZGUgKGFzc3VtZXMgT0xQQy1zdHlsZQorCSAqIHdpcmluZykuICBDb250cm9sIDAgaXMgcmVzZXQgLSBzZXQgdG8gMSB0byBvcGVyYXRlLgorCSAqIENvbnRyb2wgMSBpcyBwb3dlciBkb3duLCBzZXQgdG8gMCB0byBvcGVyYXRlLgorCSAqLworCW1jYW1fcmVnX3dyaXRlKG1jYW0sIFJFR19HUFIsIEdQUl9DMUVOfEdQUl9DMEVOKTsgLyogcHdyIHVwLCByZXNldCAqLworCW1jYW1fcmVnX3dyaXRlKG1jYW0sIFJFR19HUFIsIEdQUl9DMUVOfEdQUl9DMEVOfEdQUl9DMCk7Cit9CisKK3N0YXRpYyB2b2lkIGNhZmVfY3Rscl9wb3dlcl9kb3duKHN0cnVjdCBtY2FtX2NhbWVyYSAqbWNhbSkKK3sKKwltY2FtX3JlZ193cml0ZShtY2FtLCBSRUdfR1BSLCBHUFJfQzFFTnxHUFJfQzBFTnxHUFJfQzEpOworCW1jYW1fcmVnX3dyaXRlKG1jYW0sIFJFR19HTF9GQ1IsIEdGQ1JfR1BJT19PTik7CisJbWNhbV9yZWdfd3JpdGUobWNhbSwgUkVHX0dMX0dQSU9SLCBHR1BJT19PVVQpOworfQorCisKKworLyoKKyAqIFRoZSBwbGF0Zm9ybSBpbnRlcnJ1cHQgaGFuZGxlci4KKyAqLworc3RhdGljIGlycXJldHVybl90IGNhZmVfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSBkYXRhOworCXN0cnVjdCBtY2FtX2NhbWVyYSAqbWNhbSA9ICZjYW0tPm1jYW07CisJdW5zaWduZWQgaW50IGlycXMsIGhhbmRsZWQ7CisKKwlzcGluX2xvY2soJm1jYW0tPmRldl9sb2NrKTsKKwlpcnFzID0gbWNhbV9yZWdfcmVhZChtY2FtLCBSRUdfSVJRU1RBVCk7CisJaGFuZGxlZCA9IGNhbS0+cmVnaXN0ZXJlZCAmJiBtY2NpY19pcnEobWNhbSwgaXJxcyk7CisJaWYgKGlycXMgJiBUV1NJSVJRUykgeworCQltY2FtX3JlZ193cml0ZShtY2FtLCBSRUdfSVJRU1RBVCwgVFdTSUlSUVMpOworCQl3YWtlX3VwKCZjYW0tPnNtYnVzX3dhaXQpOworCQloYW5kbGVkID0gMTsKKwl9CisJc3Bpbl91bmxvY2soJm1jYW0tPmRldl9sb2NrKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFBDSSBpbnRlcmZhY2Ugc3R1ZmYuCisgKi8KKworc3RhdGljIGludCBjYWZlX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQoreworCWludCByZXQ7CisJc3RydWN0IGNhZmVfY2FtZXJhICpjYW07CisJc3RydWN0IG1jYW1fY2FtZXJhICptY2FtOworCisJLyoKKwkgKiBTdGFydCBwdXR0aW5nIHRvZ2V0aGVyIG9uZSBvZiBvdXIgYmlnIGNhbWVyYSBzdHJ1Y3R1cmVzLgorCSAqLworCXJldCA9IC1FTk9NRU07CisJY2FtID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNhZmVfY2FtZXJhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNhbSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwljYW0tPnBkZXYgPSBwZGV2OworCW1jYW0gPSAmY2FtLT5tY2FtOworCW1jYW0tPmNoaXBfaWQgPSBWNEwyX0lERU5UX0NBRkU7CisJc3Bpbl9sb2NrX2luaXQoJm1jYW0tPmRldl9sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYW0tPnNtYnVzX3dhaXQpOworCW1jYW0tPnBsYXRfcG93ZXJfdXAgPSBjYWZlX2N0bHJfcG93ZXJfdXA7CisJbWNhbS0+cGxhdF9wb3dlcl9kb3duID0gY2FmZV9jdGxyX3Bvd2VyX2Rvd247CisJbWNhbS0+ZGV2ID0gJnBkZXYtPmRldjsKKwkvKgorCSAqIFNldCB0aGUgY2xvY2sgc3BlZWQgZm9yIHRoZSBYTyAxOyBJIGRvbid0IGJlbGlldmUgdGhpcworCSAqIGRyaXZlciBoYXMgZXZlciBydW4gYW55d2hlcmUgZWxzZS4KKwkgKi8KKwltY2FtLT5jbG9ja19zcGVlZCA9IDQ1OworCW1jYW0tPnVzZV9zbWJ1cyA9IDE7CisJLyoKKwkgKiBWbWFsbG9jIG1vZGUgZm9yIGJ1ZmZlcnMgaXMgdHJhZGl0aW9uYWwgd2l0aCB0aGlzIGRyaXZlci4KKwkgKiBXZSAqbWlnaHQqIGJlIGFibGUgdG8gcnVuIERNQV9jb250aWcsIGVzcGVjaWFsbHkgb24gYSBzeXN0ZW0KKwkgKiB3aXRoIENNQSBpbiBpdC4KKwkgKi8KKwltY2FtLT5idWZmZXJfbW9kZSA9IEJfdm1hbGxvYzsKKwkvKgorCSAqIEdldCBzZXQgdXAgb24gdGhlIFBDSSBidXMuCisJICovCisJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZnJlZTsKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCXJldCA9IC1FSU87CisJbWNhbS0+cmVncyA9IHBjaV9pb21hcChwZGV2LCAwLCAwKTsKKwlpZiAoIW1jYW0tPnJlZ3MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gaW9yZW1hcCBjYWZlLWNjaWMgcmVnc1xuIik7CisJCWdvdG8gb3V0X2Rpc2FibGU7CisJfQorCXJldCA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgY2FmZV9pcnEsIElSUUZfU0hBUkVELCAiY2FmZS1jY2ljIiwgY2FtKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9pb3VubWFwOworCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBjb250cm9sbGVyIGFuZCBsZWF2ZSBpdCBwb3dlcmVkIHVwLiAgSXQgd2lsbAorCSAqIHN0YXkgdGhhdCB3YXkgdW50aWwgdGhlIHNlbnNvciBkcml2ZXIgc2hvd3MgdXAuCisJICovCisJY2FmZV9jdGxyX2luaXQobWNhbSk7CisJY2FmZV9jdGxyX3Bvd2VyX3VwKG1jYW0pOworCS8qCisJICogU2V0IHVwIEkyQy9TTUJVUyBjb21tdW5pY2F0aW9ucy4gIFdlIGhhdmUgdG8gZHJvcCB0aGUgbXV0ZXggaGVyZQorCSAqIGJlY2F1c2UgdGhlIHNlbnNvciBjb3VsZCBhdHRhY2ggaW4gdGhpcyBjYWxsIGNoYWluLCBsZWFkaW5nIHRvCisJICogdW5zaWdodGx5IGRlYWRsb2Nrcy4KKwkgKi8KKwlyZXQgPSBjYWZlX3NtYnVzX3NldHVwKGNhbSk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfcGRvd247CisKKwlyZXQgPSBtY2NpY19yZWdpc3RlcihtY2FtKTsKKwlpZiAocmV0ID09IDApIHsKKwkJY2FtLT5yZWdpc3RlcmVkID0gMTsKKwkJcmV0dXJuIDA7CisJfQorCisJY2FmZV9zbWJ1c19zaHV0ZG93bihjYW0pOworb3V0X3Bkb3duOgorCWNhZmVfY3Rscl9wb3dlcl9kb3duKG1jYW0pOworCWZyZWVfaXJxKHBkZXYtPmlycSwgY2FtKTsKK291dF9pb3VubWFwOgorCXBjaV9pb3VubWFwKHBkZXYsIG1jYW0tPnJlZ3MpOworb3V0X2Rpc2FibGU6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworb3V0X2ZyZWU6CisJa2ZyZWUoY2FtKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisKKy8qCisgKiBTaHV0IGRvd24gYW4gaW5pdGlhbGl6ZWQgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIGNhZmVfc2h1dGRvd24oc3RydWN0IGNhZmVfY2FtZXJhICpjYW0pCit7CisJbWNjaWNfc2h1dGRvd24oJmNhbS0+bWNhbSk7CisJY2FmZV9zbWJ1c19zaHV0ZG93bihjYW0pOworCWZyZWVfaXJxKGNhbS0+cGRldi0+aXJxLCBjYW0pOworCXBjaV9pb3VubWFwKGNhbS0+cGRldiwgY2FtLT5tY2FtLnJlZ3MpOworfQorCisKK3N0YXRpYyB2b2lkIGNhZmVfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgdjRsMl9kZXZpY2UgKnY0bDJfZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCXN0cnVjdCBjYWZlX2NhbWVyYSAqY2FtID0gdG9fY2FtKHY0bDJfZGV2KTsKKworCWlmIChjYW0gPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJwY2lfcmVtb3ZlIG9uIHVua25vd24gcGRldiAlcFxuIiwgcGRldik7CisJCXJldHVybjsKKwl9CisJY2FmZV9zaHV0ZG93bihjYW0pOworCWtmcmVlKGNhbSk7Cit9CisKKworI2lmZGVmIENPTkZJR19QTQorLyoKKyAqIEJhc2ljIHBvd2VyIG1hbmFnZW1lbnQuCisgKi8KK3N0YXRpYyBpbnQgY2FmZV9wY2lfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXYgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSB0b19jYW0odjRsMl9kZXYpOworCWludCByZXQ7CisKKwlyZXQgPSBwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCW1jY2ljX3N1c3BlbmQoJmNhbS0+bWNhbSk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgY2FmZV9wY2lfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQoreworCXN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXYgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJc3RydWN0IGNhZmVfY2FtZXJhICpjYW0gPSB0b19jYW0odjRsMl9kZXYpOworCWludCByZXQgPSAwOworCisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7CisKKwlpZiAocmV0KSB7CisJCWNhbV93YXJuKGNhbSwgIlVuYWJsZSB0byByZS1lbmFibGUgZGV2aWNlIG9uIHJlc3VtZSFcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwljYWZlX2N0bHJfaW5pdCgmY2FtLT5tY2FtKTsKKwlyZXR1cm4gbWNjaWNfcmVzdW1lKCZjYW0tPm1jYW0pOworfQorCisjZW5kaWYgIC8qIENPTkZJR19QTSAqLworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgY2FmZV9pZHNbXSA9IHsKKwl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9NQVJWRUxMLAorCQkgICAgIFBDSV9ERVZJQ0VfSURfTUFSVkVMTF84OEFMUDAxX0NDSUMpIH0sCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgY2FmZV9pZHMpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgY2FmZV9wY2lfZHJpdmVyID0geworCS5uYW1lID0gImNhZmUxMDAwLWNjaWMiLAorCS5pZF90YWJsZSA9IGNhZmVfaWRzLAorCS5wcm9iZSA9IGNhZmVfcGNpX3Byb2JlLAorCS5yZW1vdmUgPSBjYWZlX3BjaV9yZW1vdmUsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPSBjYWZlX3BjaV9zdXNwZW5kLAorCS5yZXN1bWUgPSBjYWZlX3BjaV9yZXN1bWUsCisjZW5kaWYKK307CisKKworCisKK3N0YXRpYyBpbnQgX19pbml0IGNhZmVfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlwcmludGsoS0VSTl9OT1RJQ0UgIk1hcnZlbGwgTTg4QUxQMDEgJ0NBRkUnIENhbWVyYSBDb250cm9sbGVyIHZlcnNpb24gJWRcbiIsCisJCQlDQUZFX1ZFUlNJT04pOworCXJldCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmNhZmVfcGNpX2RyaXZlcik7CisJaWYgKHJldCkgeworCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byByZWdpc3RlciBjYWZlX2NjaWMgZHJpdmVyXG4iKTsKKwkJZ290byBvdXQ7CisJfQorCXJldCA9IDA7CisKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjYWZlX2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmNhZmVfcGNpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGNhZmVfaW5pdCk7Cittb2R1bGVfZXhpdChjYWZlX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tYXJ2ZWxsLWNjaWMvbWNhbS1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21hcnZlbGwtY2NpYy9tY2FtLWNvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2MxNDUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tYXJ2ZWxsLWNjaWMvbWNhbS1jb3JlLmMKQEAgLTAsMCArMSwxODQzIEBACisvKgorICogVGhlIE1hcnZlbGwgY2FtZXJhIGNvcmUuICBUaGlzIGRldmljZSBhcHBlYXJzIGluIGEgbnVtYmVyIG9mIHNldHRpbmdzLAorICogc28gaXQgbmVlZHMgcGxhdGZvcm0tc3BlY2lmaWMgc3VwcG9ydCBvdXRzaWRlIG9mIHRoZSBjb3JlLgorICoKKyAqIENvcHlyaWdodCAyMDExIEpvbmF0aGFuIENvcmJldCBjb3JiZXRAbHduLm5ldAorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgorI2luY2x1ZGUgPG1lZGlhL292NzY3MC5oPgorI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi12bWFsbG9jLmg+CisjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYyLWRtYS1jb250aWcuaD4KKyNpbmNsdWRlIDxtZWRpYS92aWRlb2J1ZjItZG1hLXNnLmg+CisKKyNpbmNsdWRlICJtY2FtLWNvcmUuaCIKKworLyoKKyAqIEJhc2ljIGZyYW1lIHN0YXRzIC0gdG8gYmUgZGVsZXRlZCBzaG9ydGx5CisgKi8KK3N0YXRpYyBpbnQgZnJhbWVzOworc3RhdGljIGludCBzaW5nbGVzOworc3RhdGljIGludCBkZWxpdmVyZWQ7CisKKyNpZmRlZiBNQ0FNX01PREVfVk1BTExPQworLyoKKyAqIEludGVybmFsIERNQSBidWZmZXIgbWFuYWdlbWVudC4gIFNpbmNlIHRoZSBjb250cm9sbGVyIGNhbm5vdCBkbyBTL0cgSS9PLAorICogd2UgbXVzdCBoYXZlIHBoeXNpY2FsbHkgY29udGlndW91cyBidWZmZXJzIHRvIGJyaW5nIGZyYW1lcyBpbnRvLgorICogVGhlc2UgcGFyYW1ldGVycyBjb250cm9sIGhvdyBtYW55IGJ1ZmZlcnMgd2UgdXNlLCB3aGV0aGVyIHdlCisgKiBhbGxvY2F0ZSB0aGVtIGF0IGxvYWQgdGltZSAoYmV0dGVyIGNoYW5jZSBvZiBzdWNjZXNzLCBidXQgbmFpbHMgZG93bgorICogbWVtb3J5KSBvciB3aGVuIHNvbWVib2R5IHRyaWVzIHRvIHVzZSB0aGUgY2FtZXJhIChyaXNraWVyKSwgYW5kLAorICogZm9yIGxvYWQtdGltZSBhbGxvY2F0aW9uLCBob3cgYmlnIHRoZXkgc2hvdWxkIGJlLgorICoKKyAqIFRoZSBjb250cm9sbGVyIGNhbiBjeWNsZSB0aHJvdWdoIHRocmVlIGJ1ZmZlcnMuICBXZSBjb3VsZCB1c2UKKyAqIG1vcmUgYnkgZmxpcHBpbmcgcG9pbnRlcnMgYXJvdW5kLCBidXQgaXQgcHJvYmFibHkgbWFrZXMgbGl0dGxlCisgKiBzZW5zZS4KKyAqLworCitzdGF0aWMgaW50IGFsbG9jX2J1ZnNfYXRfcmVhZDsKK21vZHVsZV9wYXJhbShhbGxvY19idWZzX2F0X3JlYWQsIGJvb2wsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhhbGxvY19idWZzX2F0X3JlYWQsCisJCSJOb24temVybyB2YWx1ZSBjYXVzZXMgRE1BIGJ1ZmZlcnMgdG8gYmUgYWxsb2NhdGVkIHdoZW4gdGhlICIKKwkJInZpZGVvIGNhcHR1cmUgZGV2aWNlIGlzIHJlYWQsIHJhdGhlciB0aGFuIGF0IG1vZHVsZSBsb2FkICIKKwkJInRpbWUuICBUaGlzIHNhdmVzIG1lbW9yeSwgYnV0IGRlY3JlYXNlcyB0aGUgY2hhbmNlcyBvZiAiCisJCSJzdWNjZXNzZnVsbHkgZ2V0dGluZyB0aG9zZSBidWZmZXJzLiAgVGhpcyBwYXJhbWV0ZXIgaXMgIgorCQkib25seSB1c2VkIGluIHRoZSB2bWFsbG9jIGJ1ZmZlciBtb2RlIik7CisKK3N0YXRpYyBpbnQgbl9kbWFfYnVmcyA9IDM7Cittb2R1bGVfcGFyYW0obl9kbWFfYnVmcywgdWludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKG5fZG1hX2J1ZnMsCisJCSJUaGUgbnVtYmVyIG9mIERNQSBidWZmZXJzIHRvIGFsbG9jYXRlLiAgQ2FuIGJlIGVpdGhlciB0d28gIgorCQkiKHNhdmVzIG1lbW9yeSwgbWFrZXMgdGltaW5nIHRpZ2h0ZXIpIG9yIHRocmVlLiIpOworCitzdGF0aWMgaW50IGRtYV9idWZfc2l6ZSA9IFZHQV9XSURUSCAqIFZHQV9IRUlHSFQgKiAyOyAgLyogV29yc3QgY2FzZSAqLworbW9kdWxlX3BhcmFtKGRtYV9idWZfc2l6ZSwgdWludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRtYV9idWZfc2l6ZSwKKwkJIlRoZSBzaXplIG9mIHRoZSBhbGxvY2F0ZWQgRE1BIGJ1ZmZlcnMuICBJZiBhY3R1YWwgb3BlcmF0aW5nICIKKwkJInBhcmFtZXRlcnMgcmVxdWlyZSBsYXJnZXIgYnVmZmVycywgYW4gYXR0ZW1wdCB0byByZWFsbG9jYXRlICIKKwkJIndpbGwgYmUgbWFkZS4iKTsKKyNlbHNlIC8qIE1DQU1fTU9ERV9WTUFMTE9DICovCitzdGF0aWMgY29uc3QgaW50IGFsbG9jX2J1ZnNfYXRfcmVhZCA9IDA7CitzdGF0aWMgY29uc3QgaW50IG5fZG1hX2J1ZnMgPSAzOyAgLyogVXNlZCBieSBTL0dfUEFSTSAqLworI2VuZGlmIC8qIE1DQU1fTU9ERV9WTUFMTE9DICovCisKK3N0YXRpYyBpbnQgZmxpcDsKK21vZHVsZV9wYXJhbShmbGlwLCBib29sLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZmxpcCwKKwkJIklmIHNldCwgdGhlIHNlbnNvciB3aWxsIGJlIGluc3RydWN0ZWQgdG8gZmxpcCB0aGUgaW1hZ2UgIgorCQkidmVydGljYWxseS4iKTsKKworc3RhdGljIGludCBidWZmZXJfbW9kZSA9IC0xOworbW9kdWxlX3BhcmFtKGJ1ZmZlcl9tb2RlLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhidWZmZXJfbW9kZSwKKwkJIlNldCB0aGUgYnVmZmVyIG1vZGUgdG8gYmUgdXNlZDsgZGVmYXVsdCBpcyB0byBnbyB3aXRoIHdoYXQgIgorCQkidGhlIHBsYXRmb3JtIGRyaXZlciBhc2tzIGZvci4gIFNldCB0byAwIGZvciB2bWFsbG9jLCAxIGZvciAiCisJCSJETUEgY29udGlndW91cy4iKTsKKworLyoKKyAqIFN0YXR1cyBmbGFncy4gIEFsd2F5cyBtYW5pcHVsYXRlZCB3aXRoIGJpdCBvcGVyYXRpb25zLgorICovCisjZGVmaW5lIENGX0JVRjBfVkFMSUQJIDAJLyogQnVmZmVycyB2YWxpZCAtIGZpcnN0IHRocmVlICovCisjZGVmaW5lIENGX0JVRjFfVkFMSUQJIDEKKyNkZWZpbmUgQ0ZfQlVGMl9WQUxJRAkgMgorI2RlZmluZSBDRl9ETUFfQUNUSVZFCSAzCS8qIEEgZnJhbWUgaXMgaW5jb21pbmcgKi8KKyNkZWZpbmUgQ0ZfQ09ORklHX05FRURFRCA0CS8qIE11c3QgY29uZmlndXJlIGhhcmR3YXJlICovCisjZGVmaW5lIENGX1NJTkdMRV9CVUZGRVIgNQkvKiBSdW5uaW5nIHdpdGggYSBzaW5nbGUgYnVmZmVyICovCisjZGVmaW5lIENGX1NHX1JFU1RBUlQJIDYJLyogU0cgcmVzdGFydCBuZWVkZWQgKi8KKworI2RlZmluZSBzZW5zb3JfY2FsbChjYW0sIG8sIGYsIGFyZ3MuLi4pIFwKKwl2NGwyX3N1YmRldl9jYWxsKGNhbS0+c2Vuc29yLCBvLCBmLCAjI2FyZ3MpCisKK3N0YXRpYyBzdHJ1Y3QgbWNhbV9mb3JtYXRfc3RydWN0IHsKKwlfX3U4ICpkZXNjOworCV9fdTMyIHBpeGVsZm9ybWF0OworCWludCBicHA7ICAgLyogQnl0ZXMgcGVyIHBpeGVsICovCisJZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlIG1idXNfY29kZTsKK30gbWNhbV9mb3JtYXRzW10gPSB7CisJeworCQkuZGVzYwkJPSAiWVVZViA0OjI6MiIsCisJCS5waXhlbGZvcm1hdAk9IFY0TDJfUElYX0ZNVF9ZVVlWLAorCQkubWJ1c19jb2RlCT0gVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDgsCisJCS5icHAJCT0gMiwKKwl9LAorCXsKKwkJLmRlc2MJCT0gIlJHQiA0NDQiLAorCQkucGl4ZWxmb3JtYXQJPSBWNEwyX1BJWF9GTVRfUkdCNDQ0LAorCQkubWJ1c19jb2RlCT0gVjRMMl9NQlVTX0ZNVF9SR0I0NDRfMlg4X1BBREhJX0xFLAorCQkuYnBwCQk9IDIsCisJfSwKKwl7CisJCS5kZXNjCQk9ICJSR0IgNTY1IiwKKwkJLnBpeGVsZm9ybWF0CT0gVjRMMl9QSVhfRk1UX1JHQjU2NSwKKwkJLm1idXNfY29kZQk9IFY0TDJfTUJVU19GTVRfUkdCNTY1XzJYOF9MRSwKKwkJLmJwcAkJPSAyLAorCX0sCisJeworCQkuZGVzYwkJPSAiUmF3IFJHQiBCYXllciIsCisJCS5waXhlbGZvcm1hdAk9IFY0TDJfUElYX0ZNVF9TQkdHUjgsCisJCS5tYnVzX2NvZGUJPSBWNEwyX01CVVNfRk1UX1NCR0dSOF8xWDgsCisJCS5icHAJCT0gMQorCX0sCit9OworI2RlZmluZSBOX01DQU1fRk1UUyBBUlJBWV9TSVpFKG1jYW1fZm9ybWF0cykKKworc3RhdGljIHN0cnVjdCBtY2FtX2Zvcm1hdF9zdHJ1Y3QgKm1jYW1fZmluZF9mb3JtYXQodTMyIHBpeGVsZm9ybWF0KQoreworCXVuc2lnbmVkIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTl9NQ0FNX0ZNVFM7IGkrKykKKwkJaWYgKG1jYW1fZm9ybWF0c1tpXS5waXhlbGZvcm1hdCA9PSBwaXhlbGZvcm1hdCkKKwkJCXJldHVybiBtY2FtX2Zvcm1hdHMgKyBpOworCS8qIE5vdCBmb3VuZD8gVGhlbiByZXR1cm4gdGhlIGZpcnN0IGZvcm1hdC4gKi8KKwlyZXR1cm4gbWNhbV9mb3JtYXRzOworfQorCisvKgorICogVGhlIGRlZmF1bHQgZm9ybWF0IHdlIHVzZSB1bnRpbCBzb21lYm9keSBzYXlzIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgbWNhbV9kZWZfcGl4X2Zvcm1hdCA9IHsKKwkud2lkdGgJCT0gVkdBX1dJRFRILAorCS5oZWlnaHQJCT0gVkdBX0hFSUdIVCwKKwkucGl4ZWxmb3JtYXQJPSBWNEwyX1BJWF9GTVRfWVVZViwKKwkuZmllbGQJCT0gVjRMMl9GSUVMRF9OT05FLAorCS5ieXRlc3BlcmxpbmUJPSBWR0FfV0lEVEgqMiwKKwkuc2l6ZWltYWdlCT0gVkdBX1dJRFRIKlZHQV9IRUlHSFQqMiwKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgbWNhbV9kZWZfbWJ1c19jb2RlID0KKwkJCQkJVjRMMl9NQlVTX0ZNVF9ZVVlWOF8yWDg7CisKKworLyoKKyAqIFRoZSB0d28td29yZCBETUEgZGVzY3JpcHRvciBmb3JtYXQgdXNlZCBieSB0aGUgQXJtYWRhIDYxMCBhbmQgbGlrZS4gIFRoZXJlCisgKiBJcyBhIHRocmVlLXdvcmQgZm9ybWF0IGFzIHdlbGwgKHNldCBDMV9ERVNDXzNXT1JEKSB3aGVyZSB0aGUgdGhpcmQKKyAqIHdvcmQgaXMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IGRlc2NyaXB0b3IsIGJ1dCB3ZSBkb24ndCB1c2UgaXQuICBUd28td29yZAorICogZGVzY3JpcHRvcnMgaGF2ZSB0byBiZSBjb250aWd1b3VzIGluIG1lbW9yeS4KKyAqLworc3RydWN0IG1jYW1fZG1hX2Rlc2MgeworCXUzMiBkbWFfYWRkcjsKKwl1MzIgc2VnbWVudF9sZW47Cit9OworCisvKgorICogT3VyIGJ1ZmZlciB0eXBlIGZvciB3b3JraW5nIHdpdGggdmlkZW9idWYyLiAgTm90ZSB0aGF0IHRoZSB2YjIKKyAqIGRldmVsb3BlcnMgaGF2ZSBkZWNyZWVkIHRoYXQgc3RydWN0IHZiMl9idWZmZXIgbXVzdCBiZSBhdCB0aGUKKyAqIGJlZ2lubmluZyBvZiB0aGlzIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IG1jYW1fdmJfYnVmZmVyIHsKKwlzdHJ1Y3QgdmIyX2J1ZmZlciB2Yl9idWY7CisJc3RydWN0IGxpc3RfaGVhZCBxdWV1ZTsKKwlzdHJ1Y3QgbWNhbV9kbWFfZGVzYyAqZG1hX2Rlc2M7CS8qIERlc2NyaXB0b3IgdmlydHVhbCBhZGRyZXNzICovCisJZG1hX2FkZHJfdCBkbWFfZGVzY19wYTsJCS8qIERlc2NyaXB0b3IgcGh5c2ljYWwgYWRkcmVzcyAqLworCWludCBkbWFfZGVzY19uZW50OwkJLyogTnVtYmVyIG9mIG1hcHBlZCBkZXNjcmlwdG9ycyAqLworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbWNhbV92Yl9idWZmZXIgKnZiX3RvX212YihzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IG1jYW1fdmJfYnVmZmVyLCB2Yl9idWYpOworfQorCisvKgorICogSGFuZCBhIGNvbXBsZXRlZCBidWZmZXIgYmFjayB0byB1c2VyIHNwYWNlLgorICovCitzdGF0aWMgdm9pZCBtY2FtX2J1ZmZlcl9kb25lKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtLCBpbnQgZnJhbWUsCisJCXN0cnVjdCB2YjJfYnVmZmVyICp2YnVmKQoreworCXZidWYtPnY0bDJfYnVmLmJ5dGVzdXNlZCA9IGNhbS0+cGl4X2Zvcm1hdC5zaXplaW1hZ2U7CisJdmJ1Zi0+djRsMl9idWYuc2VxdWVuY2UgPSBjYW0tPmJ1Zl9zZXFbZnJhbWVdOworCXZiMl9zZXRfcGxhbmVfcGF5bG9hZCh2YnVmLCAwLCBjYW0tPnBpeF9mb3JtYXQuc2l6ZWltYWdlKTsKKwl2YjJfYnVmZmVyX2RvbmUodmJ1ZiwgVkIyX0JVRl9TVEFURV9ET05FKTsKK30KKworCisKKy8qCisgKiBEZWJ1Z2dpbmcgYW5kIHJlbGF0ZWQuCisgKi8KKyNkZWZpbmUgY2FtX2VycihjYW0sIGZtdCwgYXJnLi4uKSBcCisJZGV2X2VycigoY2FtKS0+ZGV2LCBmbXQsICMjYXJnKTsKKyNkZWZpbmUgY2FtX3dhcm4oY2FtLCBmbXQsIGFyZy4uLikgXAorCWRldl93YXJuKChjYW0pLT5kZXYsIGZtdCwgIyNhcmcpOworI2RlZmluZSBjYW1fZGJnKGNhbSwgZm10LCBhcmcuLi4pIFwKKwlkZXZfZGJnKChjYW0pLT5kZXYsIGZtdCwgIyNhcmcpOworCisKKy8qCisgKiBGbGFnIG1hbmlwdWxhdGlvbiBoZWxwZXJzCisgKi8KK3N0YXRpYyB2b2lkIG1jYW1fcmVzZXRfYnVmZmVycyhzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwlpbnQgaTsKKworCWNhbS0+bmV4dF9idWYgPSAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgY2FtLT5uYnVmczsgaSsrKQorCQljbGVhcl9iaXQoaSwgJmNhbS0+ZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIGludCBtY2FtX25lZWRzX2NvbmZpZyhzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwlyZXR1cm4gdGVzdF9iaXQoQ0ZfQ09ORklHX05FRURFRCwgJmNhbS0+ZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBtY2FtX3NldF9jb25maWdfbmVlZGVkKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtLCBpbnQgbmVlZGVkKQoreworCWlmIChuZWVkZWQpCisJCXNldF9iaXQoQ0ZfQ09ORklHX05FRURFRCwgJmNhbS0+ZmxhZ3MpOworCWVsc2UKKwkJY2xlYXJfYml0KENGX0NPTkZJR19ORUVERUQsICZjYW0tPmZsYWdzKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIE1ha2UgdGhlIGNvbnRyb2xsZXIgc3RhcnQgZ3JhYmJpbmcgaW1hZ2VzLiAgRXZlcnl0aGluZyBtdXN0CisgKiBiZSBzZXQgdXAgYmVmb3JlIGRvaW5nIHRoaXMuCisgKi8KK3N0YXRpYyB2b2lkIG1jYW1fY3Rscl9zdGFydChzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwkvKiBzZXRfYml0IHBlcmZvcm1zIGEgcmVhZCwgc28gbm8gb3RoZXIgYmFycmllciBzaG91bGQgYmUKKwkgICBuZWVkZWQgaGVyZSAqLworCW1jYW1fcmVnX3NldF9iaXQoY2FtLCBSRUdfQ1RSTDAsIEMwX0VOQUJMRSk7Cit9CisKK3N0YXRpYyB2b2lkIG1jYW1fY3Rscl9zdG9wKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKQoreworCW1jYW1fcmVnX2NsZWFyX2JpdChjYW0sIFJFR19DVFJMMCwgQzBfRU5BQkxFKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgTUNBTV9NT0RFX1ZNQUxMT0MKKy8qCisgKiBDb2RlIHNwZWNpZmljIHRvIHRoZSB2bWFsbG9jIGJ1ZmZlciBtb2RlLgorICovCisKKy8qCisgKiBBbGxvY2F0ZSBpbi1rZXJuZWwgRE1BIGJ1ZmZlcnMgZm9yIHZtYWxsb2MgbW9kZS4KKyAqLworc3RhdGljIGludCBtY2FtX2FsbG9jX2RtYV9idWZzKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtLCBpbnQgbG9hZHRpbWUpCit7CisJaW50IGk7CisKKwltY2FtX3NldF9jb25maWdfbmVlZGVkKGNhbSwgMSk7CisJaWYgKGxvYWR0aW1lKQorCQljYW0tPmRtYV9idWZfc2l6ZSA9IGRtYV9idWZfc2l6ZTsKKwllbHNlCisJCWNhbS0+ZG1hX2J1Zl9zaXplID0gY2FtLT5waXhfZm9ybWF0LnNpemVpbWFnZTsKKwlpZiAobl9kbWFfYnVmcyA+IDMpCisJCW5fZG1hX2J1ZnMgPSAzOworCisJY2FtLT5uYnVmcyA9IDA7CisJZm9yIChpID0gMDsgaSA8IG5fZG1hX2J1ZnM7IGkrKykgeworCQljYW0tPmRtYV9idWZzW2ldID0gZG1hX2FsbG9jX2NvaGVyZW50KGNhbS0+ZGV2LAorCQkJCWNhbS0+ZG1hX2J1Zl9zaXplLCBjYW0tPmRtYV9oYW5kbGVzICsgaSwKKwkJCQlHRlBfS0VSTkVMKTsKKwkJaWYgKGNhbS0+ZG1hX2J1ZnNbaV0gPT0gTlVMTCkgeworCQkJY2FtX3dhcm4oY2FtLCAiRmFpbGVkIHRvIGFsbG9jYXRlIERNQSBidWZmZXJcbiIpOworCQkJYnJlYWs7CisJCX0KKwkJKGNhbS0+bmJ1ZnMpKys7CisJfQorCisJc3dpdGNoIChjYW0tPm5idWZzKSB7CisJY2FzZSAxOgorCQlkbWFfZnJlZV9jb2hlcmVudChjYW0tPmRldiwgY2FtLT5kbWFfYnVmX3NpemUsCisJCQkJY2FtLT5kbWFfYnVmc1swXSwgY2FtLT5kbWFfaGFuZGxlc1swXSk7CisJCWNhbS0+bmJ1ZnMgPSAwOworCWNhc2UgMDoKKwkJY2FtX2VycihjYW0sICJJbnN1ZmZpY2llbnQgRE1BIGJ1ZmZlcnMsIGNhbm5vdCBvcGVyYXRlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisKKwljYXNlIDI6CisJCWlmIChuX2RtYV9idWZzID4gMikKKwkJCWNhbV93YXJuKGNhbSwgIldpbGwgbGltcCBhbG9uZyB3aXRoIG9ubHkgMiBidWZmZXJzXG4iKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtY2FtX2ZyZWVfZG1hX2J1ZnMoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2FtLT5uYnVmczsgaSsrKSB7CisJCWRtYV9mcmVlX2NvaGVyZW50KGNhbS0+ZGV2LCBjYW0tPmRtYV9idWZfc2l6ZSwKKwkJCQljYW0tPmRtYV9idWZzW2ldLCBjYW0tPmRtYV9oYW5kbGVzW2ldKTsKKwkJY2FtLT5kbWFfYnVmc1tpXSA9IE5VTEw7CisJfQorCWNhbS0+bmJ1ZnMgPSAwOworfQorCisKKy8qCisgKiBTZXQgdXAgRE1BIGJ1ZmZlcnMgd2hlbiBvcGVyYXRpbmcgaW4gdm1hbGxvYyBtb2RlCisgKi8KK3N0YXRpYyB2b2lkIG1jYW1fY3Rscl9kbWFfdm1hbGxvYyhzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwkvKgorCSAqIFN0b3JlIHRoZSBmaXJzdCB0d28gWSBidWZmZXJzICh3ZSBhcmVuJ3Qgc3VwcG9ydGluZworCSAqIHBsYW5hciBmb3JtYXRzIGZvciBub3csIHNvIG5vIFVWIGJ1ZnMpLiAgVGhlbiBlaXRoZXIKKwkgKiBzZXQgdGhlIHRoaXJkIGlmIGl0IGV4aXN0cywgb3IgdGVsbCB0aGUgY29udHJvbGxlcgorCSAqIHRvIGp1c3QgdXNlIHR3by4KKwkgKi8KKwltY2FtX3JlZ193cml0ZShjYW0sIFJFR19ZMEJBUiwgY2FtLT5kbWFfaGFuZGxlc1swXSk7CisJbWNhbV9yZWdfd3JpdGUoY2FtLCBSRUdfWTFCQVIsIGNhbS0+ZG1hX2hhbmRsZXNbMV0pOworCWlmIChjYW0tPm5idWZzID4gMikgeworCQltY2FtX3JlZ193cml0ZShjYW0sIFJFR19ZMkJBUiwgY2FtLT5kbWFfaGFuZGxlc1syXSk7CisJCW1jYW1fcmVnX2NsZWFyX2JpdChjYW0sIFJFR19DVFJMMSwgQzFfVFdPQlVGUyk7CisJfSBlbHNlCisJCW1jYW1fcmVnX3NldF9iaXQoY2FtLCBSRUdfQ1RSTDEsIEMxX1RXT0JVRlMpOworCWlmIChjYW0tPmNoaXBfaWQgPT0gVjRMMl9JREVOVF9DQUZFKQorCQltY2FtX3JlZ193cml0ZShjYW0sIFJFR19VQkFSLCAwKTsgLyogMzIgYml0cyBvbmx5ICovCit9CisKKy8qCisgKiBDb3B5IGRhdGEgb3V0IHRvIHVzZXIgc3BhY2UgaW4gdGhlIHZtYWxsb2MgY2FzZQorICovCitzdGF0aWMgdm9pZCBtY2FtX2ZyYW1lX3Rhc2tsZXQodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gKHN0cnVjdCBtY2FtX2NhbWVyYSAqKSBkYXRhOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG1jYW1fdmJfYnVmZmVyICpidWY7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBjYW0tPm5idWZzOyBpKyspIHsKKwkJaW50IGJ1Zm5vID0gY2FtLT5uZXh0X2J1ZjsKKworCQlpZiAoY2FtLT5zdGF0ZSAhPSBTX1NUUkVBTUlORyB8fCBidWZubyA8IDApCisJCQlicmVhazsgIC8qIEkvTyBnb3Qgc3RvcHBlZCAqLworCQlpZiAoKysoY2FtLT5uZXh0X2J1ZikgPj0gY2FtLT5uYnVmcykKKwkJCWNhbS0+bmV4dF9idWYgPSAwOworCQlpZiAoIXRlc3RfYml0KGJ1Zm5vLCAmY2FtLT5mbGFncykpCisJCQljb250aW51ZTsKKwkJaWYgKGxpc3RfZW1wdHkoJmNhbS0+YnVmZmVycykpIHsKKwkJCXNpbmdsZXMrKzsKKwkJCWJyZWFrOyAgLyogTGVhdmUgaXQgdmFsaWQsIGhvcGUgZm9yIGJldHRlciBsYXRlciAqLworCQl9CisJCWRlbGl2ZXJlZCsrOworCQljbGVhcl9iaXQoYnVmbm8sICZjYW0tPmZsYWdzKTsKKwkJYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmY2FtLT5idWZmZXJzLCBzdHJ1Y3QgbWNhbV92Yl9idWZmZXIsCisJCQkJcXVldWUpOworCQlsaXN0X2RlbF9pbml0KCZidWYtPnF1ZXVlKTsKKwkJLyoKKwkJICogRHJvcCB0aGUgbG9jayBkdXJpbmcgdGhlIGJpZyBjb3B5LiAgVGhpcyAqc2hvdWxkKiBiZSBzYWZlLi4uCisJCSAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7CisJCW1lbWNweSh2YjJfcGxhbmVfdmFkZHIoJmJ1Zi0+dmJfYnVmLCAwKSwgY2FtLT5kbWFfYnVmc1tidWZub10sCisJCQkJY2FtLT5waXhfZm9ybWF0LnNpemVpbWFnZSk7CisJCW1jYW1fYnVmZmVyX2RvbmUoY2FtLCBidWZubywgJmJ1Zi0+dmJfYnVmKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworfQorCisKKy8qCisgKiBNYWtlIHN1cmUgb3VyIGFsbG9jYXRlZCBidWZmZXJzIGFyZSB1cCB0byB0aGUgdGFzay4KKyAqLworc3RhdGljIGludCBtY2FtX2NoZWNrX2RtYV9idWZmZXJzKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKQoreworCWlmIChjYW0tPm5idWZzID4gMCAmJiBjYW0tPmRtYV9idWZfc2l6ZSA8IGNhbS0+cGl4X2Zvcm1hdC5zaXplaW1hZ2UpCisJCQltY2FtX2ZyZWVfZG1hX2J1ZnMoY2FtKTsKKwlpZiAoY2FtLT5uYnVmcyA9PSAwKQorCQlyZXR1cm4gbWNhbV9hbGxvY19kbWFfYnVmcyhjYW0sIDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtY2FtX3ZtYWxsb2NfZG9uZShzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSwgaW50IGZyYW1lKQoreworCXRhc2tsZXRfc2NoZWR1bGUoJmNhbS0+c190YXNrbGV0KTsKK30KKworI2Vsc2UgLyogTUNBTV9NT0RFX1ZNQUxMT0MgKi8KKworc3RhdGljIGlubGluZSBpbnQgbWNhbV9hbGxvY19kbWFfYnVmcyhzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSwgaW50IGxvYWR0aW1lKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWNhbV9mcmVlX2RtYV9idWZzKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKQoreworCXJldHVybjsKK30KKworc3RhdGljIGlubGluZSBpbnQgbWNhbV9jaGVja19kbWFfYnVmZmVycyhzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwlyZXR1cm4gMDsKK30KKworCisKKyNlbmRpZiAvKiBNQ0FNX01PREVfVk1BTExPQyAqLworCisKKyNpZmRlZiBNQ0FNX01PREVfRE1BX0NPTlRJRworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIERNQS1jb250aWd1b3VzIGNvZGUuCisgKi8KKy8qCisgKiBTZXQgdXAgYSBjb250aWd1b3VzIGJ1ZmZlciBmb3IgdGhlIGdpdmVuIGZyYW1lLiAgSGVyZSBhbHNvIGlzIHdoZXJlCisgKiB0aGUgdW5kZXJydW4gc3RyYXRlZ3kgaXMgc2V0OiBpZiB0aGVyZSBpcyBubyBidWZmZXIgYXZhaWxhYmxlLCByZXVzZQorICogdGhlIGJ1ZmZlciBmcm9tIHRoZSBvdGhlciBCQVIgYW5kIHNldCB0aGUgQ0ZfU0lOR0xFX0JVRkZFUiBmbGFnIHRvCisgKiBrZWVwIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBmcm9tIGdpdmluZyB0aGF0IGJ1ZmZlciBiYWNrIHRvIHVzZXIKKyAqIHNwYWNlLiAgSW4gdGhpcyB3YXksIHdlIGFsd2F5cyBoYXZlIGEgYnVmZmVyIHRvIERNQSB0byBhbmQgZG9uJ3QKKyAqIGhhdmUgdG8gdHJ5IHRvIHBsYXkgZ2FtZXMgc3RvcHBpbmcgYW5kIHJlc3RhcnRpbmcgdGhlIGNvbnRyb2xsZXIuCisgKi8KK3N0YXRpYyB2b2lkIG1jYW1fc2V0X2NvbnRpZ19idWZmZXIoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0sIGludCBmcmFtZSkKK3sKKwlzdHJ1Y3QgbWNhbV92Yl9idWZmZXIgKmJ1ZjsKKwkvKgorCSAqIElmIHRoZXJlIGFyZSBubyBhdmFpbGFibGUgYnVmZmVycywgZ28gaW50byBzaW5nbGUgbW9kZQorCSAqLworCWlmIChsaXN0X2VtcHR5KCZjYW0tPmJ1ZmZlcnMpKSB7CisJCWJ1ZiA9IGNhbS0+dmJfYnVmc1tmcmFtZSBeIDB4MV07CisJCWNhbS0+dmJfYnVmc1tmcmFtZV0gPSBidWY7CisJCW1jYW1fcmVnX3dyaXRlKGNhbSwgZnJhbWUgPT0gMCA/IFJFR19ZMEJBUiA6IFJFR19ZMUJBUiwKKwkJCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcigmYnVmLT52Yl9idWYsIDApKTsKKwkJc2V0X2JpdChDRl9TSU5HTEVfQlVGRkVSLCAmY2FtLT5mbGFncyk7CisJCXNpbmdsZXMrKzsKKwkJcmV0dXJuOworCX0KKwkvKgorCSAqIE9LLCB3ZSBoYXZlIGEgYnVmZmVyIHdlIGNhbiB1c2UuCisJICovCisJYnVmID0gbGlzdF9maXJzdF9lbnRyeSgmY2FtLT5idWZmZXJzLCBzdHJ1Y3QgbWNhbV92Yl9idWZmZXIsIHF1ZXVlKTsKKwlsaXN0X2RlbF9pbml0KCZidWYtPnF1ZXVlKTsKKwltY2FtX3JlZ193cml0ZShjYW0sIGZyYW1lID09IDAgPyBSRUdfWTBCQVIgOiBSRUdfWTFCQVIsCisJCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcigmYnVmLT52Yl9idWYsIDApKTsKKwljYW0tPnZiX2J1ZnNbZnJhbWVdID0gYnVmOworCWNsZWFyX2JpdChDRl9TSU5HTEVfQlVGRkVSLCAmY2FtLT5mbGFncyk7Cit9CisKKy8qCisgKiBJbml0aWFsIEJfRE1BX2NvbnRpZyBzZXR1cC4KKyAqLworc3RhdGljIHZvaWQgbWNhbV9jdGxyX2RtYV9jb250aWcoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pCit7CisJbWNhbV9yZWdfc2V0X2JpdChjYW0sIFJFR19DVFJMMSwgQzFfVFdPQlVGUyk7CisJY2FtLT5uYnVmcyA9IDI7CisJbWNhbV9zZXRfY29udGlnX2J1ZmZlcihjYW0sIDApOworCW1jYW1fc2V0X2NvbnRpZ19idWZmZXIoY2FtLCAxKTsKK30KKworLyoKKyAqIEZyYW1lIGNvbXBsZXRpb24gaGFuZGxpbmcuCisgKi8KK3N0YXRpYyB2b2lkIG1jYW1fZG1hX2NvbnRpZ19kb25lKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtLCBpbnQgZnJhbWUpCit7CisJc3RydWN0IG1jYW1fdmJfYnVmZmVyICpidWYgPSBjYW0tPnZiX2J1ZnNbZnJhbWVdOworCisJaWYgKCF0ZXN0X2JpdChDRl9TSU5HTEVfQlVGRkVSLCAmY2FtLT5mbGFncykpIHsKKwkJZGVsaXZlcmVkKys7CisJCW1jYW1fYnVmZmVyX2RvbmUoY2FtLCBmcmFtZSwgJmJ1Zi0+dmJfYnVmKTsKKwl9CisJbWNhbV9zZXRfY29udGlnX2J1ZmZlcihjYW0sIGZyYW1lKTsKK30KKworI2VuZGlmIC8qIE1DQU1fTU9ERV9ETUFfQ09OVElHICovCisKKyNpZmRlZiBNQ0FNX01PREVfRE1BX1NHCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogU2NhdHRlci9nYXRoZXItc3BlY2lmaWMgY29kZS4KKyAqLworCisvKgorICogU2V0IHVwIHRoZSBuZXh0IGJ1ZmZlciBmb3IgUy9HIEkvTzsgY2FsbGVyIHNob3VsZCBiZSBzdXJlIHRoYXQKKyAqIHRoZSBjb250cm9sbGVyIGlzIHN0b3BwZWQgYW5kIGEgYnVmZmVyIGlzIGF2YWlsYWJsZS4KKyAqLworc3RhdGljIHZvaWQgbWNhbV9zZ19uZXh0X2J1ZmZlcihzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwlzdHJ1Y3QgbWNhbV92Yl9idWZmZXIgKmJ1ZjsKKworCWJ1ZiA9IGxpc3RfZmlyc3RfZW50cnkoJmNhbS0+YnVmZmVycywgc3RydWN0IG1jYW1fdmJfYnVmZmVyLCBxdWV1ZSk7CisJbGlzdF9kZWxfaW5pdCgmYnVmLT5xdWV1ZSk7CisJbWNhbV9yZWdfd3JpdGUoY2FtLCBSRUdfRE1BX0RFU0NfWSwgYnVmLT5kbWFfZGVzY19wYSk7CisJbWNhbV9yZWdfd3JpdGUoY2FtLCBSRUdfREVTQ19MRU5fWSwKKwkJCWJ1Zi0+ZG1hX2Rlc2NfbmVudCpzaXplb2Yoc3RydWN0IG1jYW1fZG1hX2Rlc2MpKTsKKwltY2FtX3JlZ193cml0ZShjYW0sIFJFR19ERVNDX0xFTl9VLCAwKTsKKwltY2FtX3JlZ193cml0ZShjYW0sIFJFR19ERVNDX0xFTl9WLCAwKTsKKwljYW0tPnZiX2J1ZnNbMF0gPSBidWY7Cit9CisKKy8qCisgKiBJbml0aWFsIEJfRE1BX3NnIHNldHVwCisgKi8KK3N0YXRpYyB2b2lkIG1jYW1fY3Rscl9kbWFfc2coc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pCit7CisJbWNhbV9yZWdfY2xlYXJfYml0KGNhbSwgUkVHX0NUUkwxLCBDMV9ERVNDXzNXT1JEKTsKKwltY2FtX3NnX25leHRfYnVmZmVyKGNhbSk7CisJbWNhbV9yZWdfc2V0X2JpdChjYW0sIFJFR19DVFJMMSwgQzFfREVTQ19FTkEpOworCWNhbS0+bmJ1ZnMgPSAzOworfQorCisKKy8qCisgKiBGcmFtZSBjb21wbGV0aW9uIHdpdGggUy9HIGlzIHRyaWNraWVyLiAgV2UgY2FuJ3QgbXVjayB3aXRoCisgKiBhIGRlc2NyaXB0b3IgY2hhaW4gb24gdGhlIGZseSwgc2luY2UgdGhlIGNvbnRyb2xsZXIgYnVmZmVycyBpdAorICogaW50ZXJuYWxseS4gIFNvIHdlIGhhdmUgdG8gYWN0dWFsbHkgc3RvcCBhbmQgcmVzdGFydDsgTWFydmVsbAorICogc2F5cyB0aGlzIGlzIHRoZSB3YXkgdG8gZG8gaXQuCisgKgorICogT2YgY291cnNlLCBzdG9wcGluZyBpcyBlYXNpZXIgc2FpZCB0aGFuIGRvbmU7IGV4cGVyaWVuY2Ugc2hvd3MKKyAqIHRoYXQgdGhlIGNvbnRyb2xsZXIgY2FuIHN0YXJ0IGEgZnJhbWUgKmFmdGVyKiBDMF9FTkFCTEUgaGFzIGJlZW4KKyAqIGNsZWFyZWQuICBTbyB3aGVuIHJ1bm5pbmcgaW4gUy9HIG1vZGUsIHRoZSBjb250cm9sbGVyIGlzICJzdG9wcGVkIgorICogb24gcmVjZWlwdCBvZiB0aGUgc3RhcnQtb2YtZnJhbWUgaW50ZXJydXB0LiAgVGhhdCBtZWFucyB3ZSBjYW4KKyAqIHNhZmVseSBjaGFuZ2UgdGhlIERNQSBkZXNjcmlwdG9yIGFycmF5IGhlcmUgYW5kIHJlc3RhcnQgdGhpbmdzCisgKiAoYXNzdW1pbmcgdGhlcmUncyBhbm90aGVyIGJ1ZmZlciB3YWl0aW5nIHRvIGdvKS4KKyAqLworc3RhdGljIHZvaWQgbWNhbV9kbWFfc2dfZG9uZShzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSwgaW50IGZyYW1lKQoreworCXN0cnVjdCBtY2FtX3ZiX2J1ZmZlciAqYnVmID0gY2FtLT52Yl9idWZzWzBdOworCisJLyoKKwkgKiBWZXJ5IEJhZCBOb3QgR29vZCBUaGluZ3MgaGFwcGVuIGlmIHlvdSBkb24ndCBjbGVhcgorCSAqIEMxX0RFU0NfRU5BIGJlZm9yZSBtYWtpbmcgYW55IGRlc2NyaXB0b3IgY2hhbmdlcy4KKwkgKi8KKwltY2FtX3JlZ19jbGVhcl9iaXQoY2FtLCBSRUdfQ1RSTDEsIEMxX0RFU0NfRU5BKTsKKwkvKgorCSAqIElmIHdlIGhhdmUgYW5vdGhlciBidWZmZXIgYXZhaWxhYmxlLCBwdXQgaXQgaW4gYW5kCisJICogcmVzdGFydCB0aGUgZW5naW5lLgorCSAqLworCWlmICghbGlzdF9lbXB0eSgmY2FtLT5idWZmZXJzKSkgeworCQltY2FtX3NnX25leHRfYnVmZmVyKGNhbSk7CisJCW1jYW1fcmVnX3NldF9iaXQoY2FtLCBSRUdfQ1RSTDEsIEMxX0RFU0NfRU5BKTsKKwkJbWNhbV9jdGxyX3N0YXJ0KGNhbSk7CisJLyoKKwkgKiBPdGhlcndpc2Ugc2V0IENGX1NHX1JFU1RBUlQgYW5kIHRoZSBjb250cm9sbGVyIHdpbGwKKwkgKiBiZSByZXN0YXJ0ZWQgb25jZSBhbm90aGVyIGJ1ZmZlciBzaG93cyB1cC4KKwkgKi8KKwl9IGVsc2UgeworCQlzZXRfYml0KENGX1NHX1JFU1RBUlQsICZjYW0tPmZsYWdzKTsKKwkJc2luZ2xlcysrOworCX0KKwkvKgorCSAqIE5vdyB3ZSBjYW4gZ2l2ZSB0aGUgY29tcGxldGVkIGZyYW1lIGJhY2sgdG8gdXNlciBzcGFjZS4KKwkgKi8KKwlkZWxpdmVyZWQrKzsKKwltY2FtX2J1ZmZlcl9kb25lKGNhbSwgZnJhbWUsICZidWYtPnZiX2J1Zik7Cit9CisKKworLyoKKyAqIFNjYXR0ZXIvZ2F0aGVyIG1vZGUgcmVxdWlyZXMgc3RvcHBpbmcgdGhlIGNvbnRyb2xsZXIgYmV0d2VlbgorICogZnJhbWVzIHNvIHdlIGNhbiBwdXQgaW4gYSBuZXcgRE1BIGRlc2NyaXB0b3IgYXJyYXkuICBJZiBubyBuZXcKKyAqIGJ1ZmZlciBleGlzdHMgYXQgZnJhbWUgY29tcGxldGlvbiwgdGhlIGNvbnRyb2xsZXIgaXMgbGVmdCBzdG9wcGVkOworICogdGhpcyBmdW5jdGlvbiBpcyBjaGFyZ2VkIHdpdGggZ2V0dGlnIHRoaW5ncyBnb2luZyBhZ2Fpbi4KKyAqLworc3RhdGljIHZvaWQgbWNhbV9zZ19yZXN0YXJ0KHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKQoreworCW1jYW1fY3Rscl9kbWFfc2coY2FtKTsKKwltY2FtX2N0bHJfc3RhcnQoY2FtKTsKKwljbGVhcl9iaXQoQ0ZfU0dfUkVTVEFSVCwgJmNhbS0+ZmxhZ3MpOworfQorCisjZWxzZSAvKiBNQ0FNX01PREVfRE1BX1NHICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtY2FtX3NnX3Jlc3RhcnQoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pCit7CisJcmV0dXJuOworfQorCisjZW5kaWYgLyogTUNBTV9NT0RFX0RNQV9TRyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogQnVmZmVyLW1vZGUtaW5kZXBlbmRlbnQgY29udHJvbGxlciBjb2RlLgorICovCisKKy8qCisgKiBJbWFnZSBmb3JtYXQgc2V0dXAKKyAqLworc3RhdGljIHZvaWQgbWNhbV9jdGxyX2ltYWdlKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKQoreworCWludCBpbWdzejsKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpmbXQgPSAmY2FtLT5waXhfZm9ybWF0OworCisJaW1nc3ogPSAoKGZtdC0+aGVpZ2h0IDw8IElNR1NaX1ZfU0hJRlQpICYgSU1HU1pfVl9NQVNLKSB8CisJCShmbXQtPmJ5dGVzcGVybGluZSAmIElNR1NaX0hfTUFTSyk7CisJbWNhbV9yZWdfd3JpdGUoY2FtLCBSRUdfSU1HU0laRSwgaW1nc3opOworCW1jYW1fcmVnX3dyaXRlKGNhbSwgUkVHX0lNR09GRlNFVCwgMCk7CisJLyogWVBJVENIIGp1c3QgZHJvcHMgdGhlIGxhc3QgdHdvIGJpdHMgKi8KKwltY2FtX3JlZ193cml0ZV9tYXNrKGNhbSwgUkVHX0lNR1BJVENILCBmbXQtPmJ5dGVzcGVybGluZSwKKwkJCUlNR1BfWVBfTUFTSyk7CisJLyoKKwkgKiBUZWxsIHRoZSBjb250cm9sbGVyIGFib3V0IHRoZSBpbWFnZSBmb3JtYXQgd2UgYXJlIHVzaW5nLgorCSAqLworCXN3aXRjaCAoY2FtLT5waXhfZm9ybWF0LnBpeGVsZm9ybWF0KSB7CisJY2FzZSBWNEwyX1BJWF9GTVRfWVVZVjoKKwkgICAgbWNhbV9yZWdfd3JpdGVfbWFzayhjYW0sIFJFR19DVFJMMCwKKwkJCSAgICBDMF9ERl9ZVVZ8QzBfWVVWX1BBQ0tFRHxDMF9ZVVZFX1lVWVYsCisJCQkgICAgQzBfREZfTUFTSyk7CisJICAgIGJyZWFrOworCisJY2FzZSBWNEwyX1BJWF9GTVRfUkdCNDQ0OgorCSAgICBtY2FtX3JlZ193cml0ZV9tYXNrKGNhbSwgUkVHX0NUUkwwLAorCQkJICAgIEMwX0RGX1JHQnxDMF9SR0JGXzQ0NHxDMF9SR0I0X1hSR0IsCisJCQkgICAgQzBfREZfTUFTSyk7CisJCS8qIEFscGhhIHZhbHVlPyAqLworCSAgICBicmVhazsKKworCWNhc2UgVjRMMl9QSVhfRk1UX1JHQjU2NToKKwkgICAgbWNhbV9yZWdfd3JpdGVfbWFzayhjYW0sIFJFR19DVFJMMCwKKwkJCSAgICBDMF9ERl9SR0J8QzBfUkdCRl81NjV8QzBfUkdCNV9CR0dSLAorCQkJICAgIEMwX0RGX01BU0spOworCSAgICBicmVhazsKKworCWRlZmF1bHQ6CisJICAgIGNhbV9lcnIoY2FtLCAiVW5rbm93biBmb3JtYXQgJXhcbiIsIGNhbS0+cGl4X2Zvcm1hdC5waXhlbGZvcm1hdCk7CisJICAgIGJyZWFrOworCX0KKwkvKgorCSAqIE1ha2Ugc3VyZSBpdCBrbm93cyB3ZSB3YW50IHRvIHVzZSBoc3luYy92c3luYy4KKwkgKi8KKwltY2FtX3JlZ193cml0ZV9tYXNrKGNhbSwgUkVHX0NUUkwwLCBDMF9TSUZfSFZTWU5DLAorCQkJQzBfU0lGTV9NQVNLKTsKK30KKworCisvKgorICogQ29uZmlndXJlIHRoZSBjb250cm9sbGVyIGZvciBvcGVyYXRpb247IGNhbGxlciBob2xkcyB0aGUKKyAqIGRldmljZSBtdXRleC4KKyAqLworc3RhdGljIGludCBtY2FtX2N0bHJfY29uZmlndXJlKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCWNhbS0+ZG1hX3NldHVwKGNhbSk7CisJbWNhbV9jdGxyX2ltYWdlKGNhbSk7CisJbWNhbV9zZXRfY29uZmlnX25lZWRlZChjYW0sIDApOworCWNsZWFyX2JpdChDRl9TR19SRVNUQVJULCAmY2FtLT5mbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtY2FtX2N0bHJfaXJxX2VuYWJsZShzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwkvKgorCSAqIENsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdHMsIHNpbmNlIHdlIGRvIG5vdAorCSAqIGV4cGVjdCB0byBoYXZlIEkvTyBhY3RpdmUgcHJpb3IgdG8gZW5hYmxpbmcuCisJICovCisJbWNhbV9yZWdfd3JpdGUoY2FtLCBSRUdfSVJRU1RBVCwgRlJBTUVJUlFTKTsKKwltY2FtX3JlZ19zZXRfYml0KGNhbSwgUkVHX0lSUU1BU0ssIEZSQU1FSVJRUyk7Cit9CisKK3N0YXRpYyB2b2lkIG1jYW1fY3Rscl9pcnFfZGlzYWJsZShzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwltY2FtX3JlZ19jbGVhcl9iaXQoY2FtLCBSRUdfSVJRTUFTSywgRlJBTUVJUlFTKTsKK30KKworCisKK3N0YXRpYyB2b2lkIG1jYW1fY3Rscl9pbml0KHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCS8qCisJICogTWFrZSBzdXJlIGl0J3Mgbm90IHBvd2VyZWQgZG93bi4KKwkgKi8KKwltY2FtX3JlZ19jbGVhcl9iaXQoY2FtLCBSRUdfQ1RSTDEsIEMxX1BXUkRXTik7CisJLyoKKwkgKiBUdXJuIG9mZiB0aGUgZW5hYmxlIGJpdC4gIEl0IHN1cmUgc2hvdWxkIGJlIG9mZiBhbnl3YXksCisJICogYnV0IGl0J3MgZ29vZCB0byBiZSBzdXJlLgorCSAqLworCW1jYW1fcmVnX2NsZWFyX2JpdChjYW0sIFJFR19DVFJMMCwgQzBfRU5BQkxFKTsKKwkvKgorCSAqIENsb2NrIHRoZSBzZW5zb3IgYXBwcm9wcmlhdGVseS4gIENvbnRyb2xsZXIgY2xvY2sgc2hvdWxkCisJICogYmUgNDhNSHosIHNlbnNvciAidHlwaWNhbCIgdmFsdWUgaXMgaGFsZiB0aGF0LgorCSAqLworCW1jYW1fcmVnX3dyaXRlX21hc2soY2FtLCBSRUdfQ0xLQ1RSTCwgMiwgQ0xLX0RJVl9NQVNLKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7Cit9CisKKworLyoKKyAqIFN0b3AgdGhlIGNvbnRyb2xsZXIsIGFuZCBkb24ndCByZXR1cm4gdW50aWwgd2UncmUgcmVhbGx5IHN1cmUgdGhhdCBubworICogZnVydGhlciBETUEgaXMgZ29pbmcgb24uCisgKi8KK3N0YXRpYyB2b2lkIG1jYW1fY3Rscl9zdG9wX2RtYShzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBUaGVvcnk6IHN0b3AgdGhlIGNhbWVyYSBjb250cm9sbGVyICh3aGV0aGVyIGl0IGlzIG9wZXJhdGluZworCSAqIG9yIG5vdCkuICBEZWxheSBicmllZmx5IGp1c3QgaW4gY2FzZSB3ZSByYWNlIHdpdGggdGhlIFNPRgorCSAqIGludGVycnVwdCwgdGhlbiB3YWl0IHVudGlsIG5vIERNQSBpcyBhY3RpdmUuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwljbGVhcl9iaXQoQ0ZfU0dfUkVTVEFSVCwgJmNhbS0+ZmxhZ3MpOworCW1jYW1fY3Rscl9zdG9wKGNhbSk7CisJY2FtLT5zdGF0ZSA9IFNfSURMRTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7CisJbXNsZWVwKDQwKTsKKwlpZiAodGVzdF9iaXQoQ0ZfRE1BX0FDVElWRSwgJmNhbS0+ZmxhZ3MpKQorCQljYW1fZXJyKGNhbSwgIlRpbWVvdXQgd2FpdGluZyBmb3IgRE1BIHRvIGVuZFxuIik7CisJCS8qIFRoaXMgd291bGQgYmUgYmFkIG5ld3MgLSB3aGF0IG5vdz8gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCW1jYW1fY3Rscl9pcnFfZGlzYWJsZShjYW0pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIFBvd2VyIHVwIGFuZCBkb3duLgorICovCitzdGF0aWMgdm9pZCBtY2FtX2N0bHJfcG93ZXJfdXAoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7CisJY2FtLT5wbGF0X3Bvd2VyX3VwKGNhbSk7CisJbWNhbV9yZWdfY2xlYXJfYml0KGNhbSwgUkVHX0NUUkwxLCBDMV9QV1JEV04pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwltc2xlZXAoNSk7IC8qIEp1c3QgdG8gYmUgc3VyZSAqLworfQorCitzdGF0aWMgdm9pZCBtY2FtX2N0bHJfcG93ZXJfZG93bihzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwkvKgorCSAqIFNjaG9vbCBvZiBoYXJkIGtub2NrcyBkZXBhcnRtZW50OiBiZSBzdXJlIHdlIGRvIGFueSByZWdpc3RlcgorCSAqIHR3aWRkbGluZyBvbiB0aGUgY29udHJvbGxlciAqYmVmb3JlKiBjYWxsaW5nIHRoZSBwbGF0Zm9ybQorCSAqIHBvd2VyIGRvd24gcm91dGluZS4KKwkgKi8KKwltY2FtX3JlZ19zZXRfYml0KGNhbSwgUkVHX0NUUkwxLCBDMV9QV1JEV04pOworCWNhbS0+cGxhdF9wb3dlcl9kb3duKGNhbSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIENvbW11bmljYXRpb25zIHdpdGggdGhlIHNlbnNvci4KKyAqLworCitzdGF0aWMgaW50IF9fbWNhbV9jYW1fcmVzZXQoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pCit7CisJcmV0dXJuIHNlbnNvcl9jYWxsKGNhbSwgY29yZSwgcmVzZXQsIDApOworfQorCisvKgorICogV2UgaGF2ZSBmb3VuZCB0aGUgc2Vuc29yIG9uIHRoZSBpMmMuICBMZXQncyB0cnkgdG8gaGF2ZSBhCisgKiBjb252ZXJzYXRpb24uCisgKi8KK3N0YXRpYyBpbnQgbWNhbV9jYW1faW5pdChzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwlzdHJ1Y3QgdjRsMl9kYmdfY2hpcF9pZGVudCBjaGlwOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCWlmIChjYW0tPnN0YXRlICE9IFNfTk9UUkVBRFkpCisJCWNhbV93YXJuKGNhbSwgIkNhbSBpbml0IHdpdGggZGV2aWNlIGluIGZ1bmt5IHN0YXRlICVkIiwKKwkJCQljYW0tPnN0YXRlKTsKKwlyZXQgPSBfX21jYW1fY2FtX3Jlc2V0KGNhbSk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisJY2hpcC5pZGVudCA9IFY0TDJfSURFTlRfTk9ORTsKKwljaGlwLm1hdGNoLnR5cGUgPSBWNEwyX0NISVBfTUFUQ0hfSTJDX0FERFI7CisJY2hpcC5tYXRjaC5hZGRyID0gY2FtLT5zZW5zb3JfYWRkcjsKKwlyZXQgPSBzZW5zb3JfY2FsbChjYW0sIGNvcmUsIGdfY2hpcF9pZGVudCwgJmNoaXApOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCWNhbS0+c2Vuc29yX3R5cGUgPSBjaGlwLmlkZW50OworCWlmIChjYW0tPnNlbnNvcl90eXBlICE9IFY0TDJfSURFTlRfT1Y3NjcwKSB7CisJCWNhbV9lcnIoY2FtLCAiVW5zdXBwb3J0ZWQgc2Vuc29yIHR5cGUgMHgleCIsIGNhbS0+c2Vuc29yX3R5cGUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisvKiBHZXQvc2V0IHBhcmFtZXRlcnM/ICovCisJcmV0ID0gMDsKKwljYW0tPnN0YXRlID0gU19JRExFOworb3V0OgorCW1jYW1fY3Rscl9wb3dlcl9kb3duKGNhbSk7CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBDb25maWd1cmUgdGhlIHNlbnNvciB0byBtYXRjaCB0aGUgcGFyYW1ldGVycyB3ZSBoYXZlLiAgQ2FsbGVyIHNob3VsZAorICogaG9sZCBzX211dGV4CisgKi8KK3N0YXRpYyBpbnQgbWNhbV9jYW1fc2V0X2ZsaXAoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pCit7CisJc3RydWN0IHY0bDJfY29udHJvbCBjdHJsOworCisJbWVtc2V0KCZjdHJsLCAwLCBzaXplb2YoY3RybCkpOworCWN0cmwuaWQgPSBWNEwyX0NJRF9WRkxJUDsKKwljdHJsLnZhbHVlID0gZmxpcDsKKwlyZXR1cm4gc2Vuc29yX2NhbGwoY2FtLCBjb3JlLCBzX2N0cmwsICZjdHJsKTsKK30KKworCitzdGF0aWMgaW50IG1jYW1fY2FtX2NvbmZpZ3VyZShzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IG1idXNfZm10OworCWludCByZXQ7CisKKwl2NGwyX2ZpbGxfbWJ1c19mb3JtYXQoJm1idXNfZm10LCAmY2FtLT5waXhfZm9ybWF0LCBjYW0tPm1idXNfY29kZSk7CisJcmV0ID0gc2Vuc29yX2NhbGwoY2FtLCBjb3JlLCBpbml0LCAwKTsKKwlpZiAocmV0ID09IDApCisJCXJldCA9IHNlbnNvcl9jYWxsKGNhbSwgdmlkZW8sIHNfbWJ1c19mbXQsICZtYnVzX2ZtdCk7CisJLyoKKwkgKiBPVjc2NzAgZG9lcyB3ZWlyZCB0aGluZ3MgaWYgZmxpcCBpcyBzZXQgKmJlZm9yZSogZm9ybWF0Li4uCisJICovCisJcmV0ICs9IG1jYW1fY2FtX3NldF9mbGlwKGNhbSk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEdldCBldmVyeXRoaW5nIHJlYWR5LCBhbmQgc3RhcnQgZ3JhYmJpbmcgZnJhbWVzLgorICovCitzdGF0aWMgaW50IG1jYW1fcmVhZF9zZXR1cChzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqIENvbmZpZ3VyYXRpb24uICBJZiB3ZSBzdGlsbCBkb24ndCBoYXZlIERNQSBidWZmZXJzLAorCSAqIG1ha2Ugb25lIGxhc3QsIGRlc3BlcmF0ZSBhdHRlbXB0LgorCSAqLworCWlmIChjYW0tPmJ1ZmZlcl9tb2RlID09IEJfdm1hbGxvYyAmJiBjYW0tPm5idWZzID09IDAgJiYKKwkJCW1jYW1fYWxsb2NfZG1hX2J1ZnMoY2FtLCAwKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAobWNhbV9uZWVkc19jb25maWcoY2FtKSkgeworCQltY2FtX2NhbV9jb25maWd1cmUoY2FtKTsKKwkJcmV0ID0gbWNhbV9jdGxyX2NvbmZpZ3VyZShjYW0pOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwkvKgorCSAqIFR1cm4gaXQgbG9vc2UuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwltY2FtX3Jlc2V0X2J1ZmZlcnMoY2FtKTsKKwltY2FtX2N0bHJfaXJxX2VuYWJsZShjYW0pOworCWNhbS0+c3RhdGUgPSBTX1NUUkVBTUlORzsKKwltY2FtX2N0bHJfc3RhcnQoY2FtKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogVmlkZW9idWYyIGludGVyZmFjZSBjb2RlLgorICovCisKK3N0YXRpYyBpbnQgbWNhbV92Yl9xdWV1ZV9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICp2cSwgdW5zaWduZWQgaW50ICpuYnVmcywKKwkJdW5zaWduZWQgaW50ICpudW1fcGxhbmVzLCB1bnNpZ25lZCBsb25nIHNpemVzW10sCisJCXZvaWQgKmFsbG9jX2N0eHNbXSkKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IHZiMl9nZXRfZHJ2X3ByaXYodnEpOworCWludCBtaW5idWZzID0gKGNhbS0+YnVmZmVyX21vZGUgPT0gQl9ETUFfY29udGlnKSA/IDMgOiAyOworCisJc2l6ZXNbMF0gPSBjYW0tPnBpeF9mb3JtYXQuc2l6ZWltYWdlOworCSpudW1fcGxhbmVzID0gMTsgLyogU29tZWRheSB3ZSBoYXZlIHRvIHN1cHBvcnQgcGxhbmFyIGZvcm1hdHMuLi4gKi8KKwlpZiAoKm5idWZzIDwgbWluYnVmcykKKwkJKm5idWZzID0gbWluYnVmczsKKwlpZiAoY2FtLT5idWZmZXJfbW9kZSA9PSBCX0RNQV9jb250aWcpCisJCWFsbG9jX2N0eHNbMF0gPSBjYW0tPnZiX2FsbG9jX2N0eDsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBtY2FtX3ZiX2J1Zl9xdWV1ZShzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IG1jYW1fdmJfYnVmZmVyICptdmIgPSB2Yl90b19tdmIodmIpOworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gdmIyX2dldF9kcnZfcHJpdih2Yi0+dmIyX3F1ZXVlKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBzdGFydDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7CisJc3RhcnQgPSAoY2FtLT5zdGF0ZSA9PSBTX0JVRldBSVQpICYmICFsaXN0X2VtcHR5KCZjYW0tPmJ1ZmZlcnMpOworCWxpc3RfYWRkKCZtdmItPnF1ZXVlLCAmY2FtLT5idWZmZXJzKTsKKwlpZiAodGVzdF9iaXQoQ0ZfU0dfUkVTVEFSVCwgJmNhbS0+ZmxhZ3MpKQorCQltY2FtX3NnX3Jlc3RhcnQoY2FtKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYW0tPmRldl9sb2NrLCBmbGFncyk7CisJaWYgKHN0YXJ0KQorCQltY2FtX3JlYWRfc2V0dXAoY2FtKTsKK30KKworCisvKgorICogdmIyIHVzZXMgdGhlc2UgdG8gcmVsZWFzZSB0aGUgbXV0ZXggd2hlbiB3YWl0aW5nIGluIGRxYnVmLiAgSSdtCisgKiBub3QgYWN0dWFsbHkgc3VyZSB3ZSBuZWVkIHRvIGRvIHRoaXMgKEknbSBub3Qgc3VyZSB0aGF0IHZiMl9kcWJ1ZigpIG5lZWRzCisgKiB0byBiZSBjYWxsZWQgd2l0aCB0aGUgbXV0ZXggaGVsZCksIGJ1dCBiZXR0ZXIgc2FmZSB0aGFuIHNvcnJ5LgorICovCitzdGF0aWMgdm9pZCBtY2FtX3ZiX3dhaXRfcHJlcGFyZShzdHJ1Y3QgdmIyX3F1ZXVlICp2cSkKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IHZiMl9nZXRfZHJ2X3ByaXYodnEpOworCisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBtY2FtX3ZiX3dhaXRfZmluaXNoKHN0cnVjdCB2YjJfcXVldWUgKnZxKQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gdmIyX2dldF9kcnZfcHJpdih2cSk7CisKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworfQorCisvKgorICogVGhlc2UgbmVlZCB0byBiZSBjYWxsZWQgd2l0aCB0aGUgbXV0ZXggaGVsZCBmcm9tIHZiMgorICovCitzdGF0aWMgaW50IG1jYW1fdmJfc3RhcnRfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnZxKQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gdmIyX2dldF9kcnZfcHJpdih2cSk7CisKKwlpZiAoY2FtLT5zdGF0ZSAhPSBTX0lETEUpCisJCXJldHVybiAtRUlOVkFMOworCWNhbS0+c2VxdWVuY2UgPSAwOworCS8qCisJICogVmlkZW9idWYyIHNuZWFraWx5IGhvYXJkcyBhbGwgdGhlIGJ1ZmZlcnMgYW5kIHdvbid0CisJICogZ2l2ZSB0aGVtIHRvIHVzIHVudGlsICphZnRlciogc3RyZWFtaW5nIHN0YXJ0cy4gIEJ1dAorCSAqIHdlIGNhbid0IGFjdHVhbGx5IHN0YXJ0IHN0cmVhbWluZyB1bnRpbCB3ZSBoYXZlIGEKKwkgKiBkZXN0aW5hdGlvbi4gIFNvIGdvIGludG8gYSB3YWl0IHN0YXRlIGFuZCBob3BlIHRoZXkKKwkgKiBnaXZlIHVzIGJ1ZmZlcnMgc29vbi4KKwkgKi8KKwlpZiAoY2FtLT5idWZmZXJfbW9kZSAhPSBCX3ZtYWxsb2MgJiYgbGlzdF9lbXB0eSgmY2FtLT5idWZmZXJzKSkgeworCQljYW0tPnN0YXRlID0gU19CVUZXQUlUOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIG1jYW1fcmVhZF9zZXR1cChjYW0pOworfQorCitzdGF0aWMgaW50IG1jYW1fdmJfc3RvcF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqdnEpCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSB2YjJfZ2V0X2Rydl9wcml2KHZxKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGNhbS0+c3RhdGUgPT0gU19CVUZXQUlUKSB7CisJCS8qIFRoZXkgbmV2ZXIgZ2F2ZSB1cyBidWZmZXJzICovCisJCWNhbS0+c3RhdGUgPSBTX0lETEU7CisJCXJldHVybiAwOworCX0KKwlpZiAoY2FtLT5zdGF0ZSAhPSBTX1NUUkVBTUlORykKKwkJcmV0dXJuIC1FSU5WQUw7CisJbWNhbV9jdGxyX3N0b3BfZG1hKGNhbSk7CisJLyoKKwkgKiBWQjIgcmVjbGFpbXMgdGhlIGJ1ZmZlcnMsIHNvIHdlIG5lZWQgdG8gZm9yZ2V0CisJICogYWJvdXQgdGhlbS4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FtLT5kZXZfbG9jaywgZmxhZ3MpOworCUlOSVRfTElTVF9IRUFEKCZjYW0tPmJ1ZmZlcnMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhbS0+ZGV2X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IHZiMl9vcHMgbWNhbV92YjJfb3BzID0geworCS5xdWV1ZV9zZXR1cAkJPSBtY2FtX3ZiX3F1ZXVlX3NldHVwLAorCS5idWZfcXVldWUJCT0gbWNhbV92Yl9idWZfcXVldWUsCisJLnN0YXJ0X3N0cmVhbWluZwk9IG1jYW1fdmJfc3RhcnRfc3RyZWFtaW5nLAorCS5zdG9wX3N0cmVhbWluZwkJPSBtY2FtX3ZiX3N0b3Bfc3RyZWFtaW5nLAorCS53YWl0X3ByZXBhcmUJCT0gbWNhbV92Yl93YWl0X3ByZXBhcmUsCisJLndhaXRfZmluaXNoCQk9IG1jYW1fdmJfd2FpdF9maW5pc2gsCit9OworCisKKyNpZmRlZiBNQ0FNX01PREVfRE1BX1NHCisvKgorICogU2NhdHRlci9nYXRoZXIgbW9kZSB1c2VzIGFsbCBvZiB0aGUgYWJvdmUgZnVuY3Rpb25zIHBsdXMgYQorICogZmV3IGV4dHJhcyB0byBkZWFsIHdpdGggRE1BIG1hcHBpbmcuCisgKi8KK3N0YXRpYyBpbnQgbWNhbV92Yl9zZ19idWZfaW5pdChzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IG1jYW1fdmJfYnVmZmVyICptdmIgPSB2Yl90b19tdmIodmIpOworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gdmIyX2dldF9kcnZfcHJpdih2Yi0+dmIyX3F1ZXVlKTsKKwlpbnQgbmRlc2MgPSBjYW0tPnBpeF9mb3JtYXQuc2l6ZWltYWdlL1BBR0VfU0laRSArIDE7CisKKwltdmItPmRtYV9kZXNjID0gZG1hX2FsbG9jX2NvaGVyZW50KGNhbS0+ZGV2LAorCQkJbmRlc2MgKiBzaXplb2Yoc3RydWN0IG1jYW1fZG1hX2Rlc2MpLAorCQkJJm12Yi0+ZG1hX2Rlc2NfcGEsIEdGUF9LRVJORUwpOworCWlmIChtdmItPmRtYV9kZXNjID09IE5VTEwpIHsKKwkJY2FtX2VycihjYW0sICJVbmFibGUgdG8gZ2V0IERNQSBkZXNjcmlwdG9yIGFycmF5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1jYW1fdmJfc2dfYnVmX3ByZXBhcmUoc3RydWN0IHZiMl9idWZmZXIgKnZiKQoreworCXN0cnVjdCBtY2FtX3ZiX2J1ZmZlciAqbXZiID0gdmJfdG9fbXZiKHZiKTsKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IHZiMl9nZXRfZHJ2X3ByaXYodmItPnZiMl9xdWV1ZSk7CisJc3RydWN0IHZiMl9kbWFfc2dfZGVzYyAqc2dkID0gdmIyX2RtYV9zZ19wbGFuZV9kZXNjKHZiLCAwKTsKKwlzdHJ1Y3QgbWNhbV9kbWFfZGVzYyAqZGVzYyA9IG12Yi0+ZG1hX2Rlc2M7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwlpbnQgaTsKKworCW12Yi0+ZG1hX2Rlc2NfbmVudCA9IGRtYV9tYXBfc2coY2FtLT5kZXYsIHNnZC0+c2dsaXN0LCBzZ2QtPm51bV9wYWdlcywKKwkJCURNQV9GUk9NX0RFVklDRSk7CisJaWYgKG12Yi0+ZG1hX2Rlc2NfbmVudCA8PSAwKQorCQlyZXR1cm4gLUVJTzsgIC8qIE5vdCBzdXJlIHdoYXQncyByaWdodCBoZXJlICovCisJZm9yX2VhY2hfc2coc2dkLT5zZ2xpc3QsIHNnLCBtdmItPmRtYV9kZXNjX25lbnQsIGkpIHsKKwkJZGVzYy0+ZG1hX2FkZHIgPSBzZ19kbWFfYWRkcmVzcyhzZyk7CisJCWRlc2MtPnNlZ21lbnRfbGVuID0gc2dfZG1hX2xlbihzZyk7CisJCWRlc2MrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWNhbV92Yl9zZ19idWZfZmluaXNoKHN0cnVjdCB2YjJfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IHZiMl9nZXRfZHJ2X3ByaXYodmItPnZiMl9xdWV1ZSk7CisJc3RydWN0IHZiMl9kbWFfc2dfZGVzYyAqc2dkID0gdmIyX2RtYV9zZ19wbGFuZV9kZXNjKHZiLCAwKTsKKworCWRtYV91bm1hcF9zZyhjYW0tPmRldiwgc2dkLT5zZ2xpc3QsIHNnZC0+bnVtX3BhZ2VzLCBETUFfRlJPTV9ERVZJQ0UpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBtY2FtX3ZiX3NnX2J1Zl9jbGVhbnVwKHN0cnVjdCB2YjJfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IHZiMl9nZXRfZHJ2X3ByaXYodmItPnZiMl9xdWV1ZSk7CisJc3RydWN0IG1jYW1fdmJfYnVmZmVyICptdmIgPSB2Yl90b19tdmIodmIpOworCWludCBuZGVzYyA9IGNhbS0+cGl4X2Zvcm1hdC5zaXplaW1hZ2UvUEFHRV9TSVpFICsgMTsKKworCWRtYV9mcmVlX2NvaGVyZW50KGNhbS0+ZGV2LCBuZGVzYyAqIHNpemVvZihzdHJ1Y3QgbWNhbV9kbWFfZGVzYyksCisJCQltdmItPmRtYV9kZXNjLCBtdmItPmRtYV9kZXNjX3BhKTsKK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IHZiMl9vcHMgbWNhbV92YjJfc2dfb3BzID0geworCS5xdWV1ZV9zZXR1cAkJPSBtY2FtX3ZiX3F1ZXVlX3NldHVwLAorCS5idWZfaW5pdAkJPSBtY2FtX3ZiX3NnX2J1Zl9pbml0LAorCS5idWZfcHJlcGFyZQkJPSBtY2FtX3ZiX3NnX2J1Zl9wcmVwYXJlLAorCS5idWZfcXVldWUJCT0gbWNhbV92Yl9idWZfcXVldWUsCisJLmJ1Zl9maW5pc2gJCT0gbWNhbV92Yl9zZ19idWZfZmluaXNoLAorCS5idWZfY2xlYW51cAkJPSBtY2FtX3ZiX3NnX2J1Zl9jbGVhbnVwLAorCS5zdGFydF9zdHJlYW1pbmcJPSBtY2FtX3ZiX3N0YXJ0X3N0cmVhbWluZywKKwkuc3RvcF9zdHJlYW1pbmcJCT0gbWNhbV92Yl9zdG9wX3N0cmVhbWluZywKKwkud2FpdF9wcmVwYXJlCQk9IG1jYW1fdmJfd2FpdF9wcmVwYXJlLAorCS53YWl0X2ZpbmlzaAkJPSBtY2FtX3ZiX3dhaXRfZmluaXNoLAorfTsKKworI2VuZGlmIC8qIE1DQU1fTU9ERV9ETUFfU0cgKi8KKworc3RhdGljIGludCBtY2FtX3NldHVwX3ZiMihzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwlzdHJ1Y3QgdmIyX3F1ZXVlICp2cSA9ICZjYW0tPnZiX3F1ZXVlOworCisJbWVtc2V0KHZxLCAwLCBzaXplb2YoKnZxKSk7CisJdnEtPnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJdnEtPmRydl9wcml2ID0gY2FtOworCUlOSVRfTElTVF9IRUFEKCZjYW0tPmJ1ZmZlcnMpOworCXN3aXRjaCAoY2FtLT5idWZmZXJfbW9kZSkgeworCWNhc2UgQl9ETUFfY29udGlnOgorI2lmZGVmIE1DQU1fTU9ERV9ETUFfQ09OVElHCisJCXZxLT5vcHMgPSAmbWNhbV92YjJfb3BzOworCQl2cS0+bWVtX29wcyA9ICZ2YjJfZG1hX2NvbnRpZ19tZW1vcHM7CisJCWNhbS0+dmJfYWxsb2NfY3R4ID0gdmIyX2RtYV9jb250aWdfaW5pdF9jdHgoY2FtLT5kZXYpOworCQl2cS0+aW9fbW9kZXMgPSBWQjJfTU1BUCB8IFZCMl9VU0VSUFRSOworCQljYW0tPmRtYV9zZXR1cCA9IG1jYW1fY3Rscl9kbWFfY29udGlnOworCQljYW0tPmZyYW1lX2NvbXBsZXRlID0gbWNhbV9kbWFfY29udGlnX2RvbmU7CisjZW5kaWYKKwkJYnJlYWs7CisJY2FzZSBCX0RNQV9zZzoKKyNpZmRlZiBNQ0FNX01PREVfRE1BX1NHCisJCXZxLT5vcHMgPSAmbWNhbV92YjJfc2dfb3BzOworCQl2cS0+bWVtX29wcyA9ICZ2YjJfZG1hX3NnX21lbW9wczsKKwkJdnEtPmlvX21vZGVzID0gVkIyX01NQVAgfCBWQjJfVVNFUlBUUjsKKwkJY2FtLT5kbWFfc2V0dXAgPSBtY2FtX2N0bHJfZG1hX3NnOworCQljYW0tPmZyYW1lX2NvbXBsZXRlID0gbWNhbV9kbWFfc2dfZG9uZTsKKyNlbmRpZgorCQlicmVhazsKKwljYXNlIEJfdm1hbGxvYzoKKyNpZmRlZiBNQ0FNX01PREVfVk1BTExPQworCQl0YXNrbGV0X2luaXQoJmNhbS0+c190YXNrbGV0LCBtY2FtX2ZyYW1lX3Rhc2tsZXQsCisJCQkJKHVuc2lnbmVkIGxvbmcpIGNhbSk7CisJCXZxLT5vcHMgPSAmbWNhbV92YjJfb3BzOworCQl2cS0+bWVtX29wcyA9ICZ2YjJfdm1hbGxvY19tZW1vcHM7CisJCXZxLT5idWZfc3RydWN0X3NpemUgPSBzaXplb2Yoc3RydWN0IG1jYW1fdmJfYnVmZmVyKTsKKwkJdnEtPmlvX21vZGVzID0gVkIyX01NQVA7CisJCWNhbS0+ZG1hX3NldHVwID0gbWNhbV9jdGxyX2RtYV92bWFsbG9jOworCQljYW0tPmZyYW1lX2NvbXBsZXRlID0gbWNhbV92bWFsbG9jX2RvbmU7CisjZW5kaWYKKwkJYnJlYWs7CisJfQorCXJldHVybiB2YjJfcXVldWVfaW5pdCh2cSk7Cit9CisKK3N0YXRpYyB2b2lkIG1jYW1fY2xlYW51cF92YjIoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pCit7CisJdmIyX3F1ZXVlX3JlbGVhc2UoJmNhbS0+dmJfcXVldWUpOworI2lmZGVmIE1DQU1fTU9ERV9ETUFfQ09OVElHCisJaWYgKGNhbS0+YnVmZmVyX21vZGUgPT0gQl9ETUFfY29udGlnKQorCQl2YjJfZG1hX2NvbnRpZ19jbGVhbnVwX2N0eChjYW0tPnZiX2FsbG9jX2N0eCk7CisjZW5kaWYKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogVGhlIGxvbmcgbGlzdCBvZiBWNEwyIGlvY3RsKCkgb3BlcmF0aW9ucy4KKyAqLworCitzdGF0aWMgaW50IG1jYW1fdmlkaW9jX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAorCQllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXQgPSB2YjJfc3RyZWFtb24oJmNhbS0+dmJfcXVldWUsIHR5cGUpOworCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgbWNhbV92aWRpb2Nfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAorCQllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXQgPSB2YjJfc3RyZWFtb2ZmKCZjYW0tPnZiX3F1ZXVlLCB0eXBlKTsKKwltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IG1jYW1fdmlkaW9jX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzICpyZXEpCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7CisJcmV0ID0gdmIyX3JlcWJ1ZnMoJmNhbS0+dmJfcXVldWUsIHJlcSk7CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBtY2FtX3ZpZGlvY19xdWVyeWJ1ZihzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7CisJcmV0ID0gdmIyX3F1ZXJ5YnVmKCZjYW0tPnZiX3F1ZXVlLCBidWYpOworCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1jYW1fdmlkaW9jX3FidWYoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldCA9IHZiMl9xYnVmKCZjYW0tPnZiX3F1ZXVlLCBidWYpOworCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1jYW1fdmlkaW9jX2RxYnVmKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAorCQlzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXQgPSB2YjJfZHFidWYoJmNhbS0+dmJfcXVldWUsIGJ1ZiwgZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCisKKworc3RhdGljIGludCBtY2FtX3ZpZGlvY19xdWVyeWN0cmwoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMpCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSBwcml2OworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldCA9IHNlbnNvcl9jYWxsKGNhbSwgY29yZSwgcXVlcnljdHJsLCBxYyk7CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBtY2FtX3ZpZGlvY19nX2N0cmwoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSBwcml2OworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldCA9IHNlbnNvcl9jYWxsKGNhbSwgY29yZSwgZ19jdHJsLCBjdHJsKTsKKwltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50IG1jYW1fdmlkaW9jX3NfY3RybChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IHByaXY7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7CisJcmV0ID0gc2Vuc29yX2NhbGwoY2FtLCBjb3JlLCBzX2N0cmwsIGN0cmwpOworCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgbWNhbV92aWRpb2NfcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKmNhcCkKK3sKKwlzdHJjcHkoY2FwLT5kcml2ZXIsICJtYXJ2ZWxsX2NjaWMiKTsKKwlzdHJjcHkoY2FwLT5jYXJkLCAibWFydmVsbF9jY2ljIik7CisJY2FwLT52ZXJzaW9uID0gMTsKKwljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfAorCQlWNEwyX0NBUF9SRUFEV1JJVEUgfCBWNEwyX0NBUF9TVFJFQU1JTkc7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBtY2FtX3ZpZGlvY19lbnVtX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxwLAorCQl2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmbXQpCit7CisJaWYgKGZtdC0+aW5kZXggPj0gTl9NQ0FNX0ZNVFMpCisJCXJldHVybiAtRUlOVkFMOworCXN0cmxjcHkoZm10LT5kZXNjcmlwdGlvbiwgbWNhbV9mb3JtYXRzW2ZtdC0+aW5kZXhdLmRlc2MsCisJCQlzaXplb2YoZm10LT5kZXNjcmlwdGlvbikpOworCWZtdC0+cGl4ZWxmb3JtYXQgPSBtY2FtX2Zvcm1hdHNbZm10LT5pbmRleF0ucGl4ZWxmb3JtYXQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWNhbV92aWRpb2NfdHJ5X2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAorCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmZtdCkKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IHByaXY7CisJc3RydWN0IG1jYW1fZm9ybWF0X3N0cnVjdCAqZjsKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXggPSAmZm10LT5mbXQucGl4OworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgbWJ1c19mbXQ7CisJaW50IHJldDsKKworCWYgPSBtY2FtX2ZpbmRfZm9ybWF0KHBpeC0+cGl4ZWxmb3JtYXQpOworCXBpeC0+cGl4ZWxmb3JtYXQgPSBmLT5waXhlbGZvcm1hdDsKKwl2NGwyX2ZpbGxfbWJ1c19mb3JtYXQoJm1idXNfZm10LCBwaXgsIGYtPm1idXNfY29kZSk7CisJbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXQgPSBzZW5zb3JfY2FsbChjYW0sIHZpZGVvLCB0cnlfbWJ1c19mbXQsICZtYnVzX2ZtdCk7CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXY0bDJfZmlsbF9waXhfZm9ybWF0KHBpeCwgJm1idXNfZm10KTsKKwlwaXgtPmJ5dGVzcGVybGluZSA9IHBpeC0+d2lkdGggKiBmLT5icHA7CisJcGl4LT5zaXplaW1hZ2UgPSBwaXgtPmhlaWdodCAqIHBpeC0+Ynl0ZXNwZXJsaW5lOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWNhbV92aWRpb2Nfc19mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfZm9ybWF0ICpmbXQpCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSBwcml2OworCXN0cnVjdCBtY2FtX2Zvcm1hdF9zdHJ1Y3QgKmY7CisJaW50IHJldDsKKworCS8qCisJICogQ2FuJ3QgZG8gYW55dGhpbmcgaWYgdGhlIGRldmljZSBpcyBub3QgaWRsZQorCSAqIEFsc28gY2FuJ3QgaWYgdGhlcmUgYXJlIHN0cmVhbWluZyBidWZmZXJzIGluIHBsYWNlLgorCSAqLworCWlmIChjYW0tPnN0YXRlICE9IFNfSURMRSB8fCBjYW0tPnZiX3F1ZXVlLm51bV9idWZmZXJzID4gMCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWYgPSBtY2FtX2ZpbmRfZm9ybWF0KGZtdC0+Zm10LnBpeC5waXhlbGZvcm1hdCk7CisKKwkvKgorCSAqIFNlZSBpZiB0aGUgZm9ybWF0dGluZyB3b3JrcyBpbiBwcmluY2lwbGUuCisJICovCisJcmV0ID0gbWNhbV92aWRpb2NfdHJ5X2ZtdF92aWRfY2FwKGZpbHAsIHByaXYsIGZtdCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwkvKgorCSAqIE5vdyB3ZSBzdGFydCB0byBjaGFuZ2UgdGhpbmdzIGZvciByZWFsLCBzbyBsZXQncyBkbyBpdAorCSAqIHVuZGVyIGxvY2suCisJICovCisJbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKKwljYW0tPnBpeF9mb3JtYXQgPSBmbXQtPmZtdC5waXg7CisJY2FtLT5tYnVzX2NvZGUgPSBmLT5tYnVzX2NvZGU7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB3ZSBoYXZlIGFwcHJvcHJpYXRlIERNQSBidWZmZXJzLgorCSAqLworCWlmIChjYW0tPmJ1ZmZlcl9tb2RlID09IEJfdm1hbGxvYykgeworCQlyZXQgPSBtY2FtX2NoZWNrX2RtYV9idWZmZXJzKGNhbSk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9CisJbWNhbV9zZXRfY29uZmlnX25lZWRlZChjYW0sIDEpOworCXJldCA9IDA7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZXR1cm4gb3VyIHN0b3JlZCBub3Rpb24gb2YgaG93IHRoZSBjYW1lcmEgaXMvc2hvdWxkIGJlIGNvbmZpZ3VyZWQuCisgKiBUaGUgVjRsMiBzcGVjIHdhbnRzIHVzIHRvIGJlIHNtYXJ0ZXIsIGFuZCBhY3R1YWxseSBnZXQgdGhpcyBmcm9tCisgKiB0aGUgY2FtZXJhIChhbmQgbm90IG1lc3Mgd2l0aCBpdCBhdCBvcGVuIHRpbWUpLiAgU29tZWRheS4KKyAqLworc3RhdGljIGludCBtY2FtX3ZpZGlvY19nX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LAorCQlzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSBwcml2OworCisJZi0+Zm10LnBpeCA9IGNhbS0+cGl4X2Zvcm1hdDsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFdlIG9ubHkgaGF2ZSBvbmUgaW5wdXQgLSB0aGUgc2Vuc29yIC0gc28gbWluaW1pemUgdGhlIG5vbnNlbnNlIGhlcmUuCisgKi8KK3N0YXRpYyBpbnQgbWNhbV92aWRpb2NfZW51bV9pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfaW5wdXQgKmlucHV0KQoreworCWlmIChpbnB1dC0+aW5kZXggIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpbnB1dC0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9DQU1FUkE7CisJaW5wdXQtPnN0ZCA9IFY0TDJfU1REX0FMTDsgLyogTm90IHN1cmUgd2hhdCBzaG91bGQgZ28gaGVyZSAqLworCXN0cmNweShpbnB1dC0+bmFtZSwgIkNhbWVyYSIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1jYW1fdmlkaW9jX2dfaW5wdXQoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCAqaSkKK3sKKwkqaSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWNhbV92aWRpb2Nfc19pbnB1dChzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwgdW5zaWduZWQgaW50IGkpCit7CisJaWYgKGkgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisKKy8qIGZyb20gdml2aS5jICovCitzdGF0aWMgaW50IG1jYW1fdmlkaW9jX3Nfc3RkKHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LCB2NGwyX3N0ZF9pZCAqYSkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEcvU19QQVJNLiAgTW9zdCBvZiB0aGlzIGlzIGRvbmUgYnkgdGhlIHNlbnNvciwgYnV0IHdlIGFyZQorICogdGhlIGxldmVsIHdoaWNoIGNvbnRyb2xzIHRoZSBudW1iZXIgb2YgcmVhZCBidWZmZXJzLgorICovCitzdGF0aWMgaW50IG1jYW1fdmlkaW9jX2dfcGFybShzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqcGFybXMpCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSBwcml2OworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldCA9IHNlbnNvcl9jYWxsKGNhbSwgdmlkZW8sIGdfcGFybSwgcGFybXMpOworCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKKwlwYXJtcy0+cGFybS5jYXB0dXJlLnJlYWRidWZmZXJzID0gbl9kbWFfYnVmczsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1jYW1fdmlkaW9jX3NfcGFybShzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqcGFybXMpCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSBwcml2OworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldCA9IHNlbnNvcl9jYWxsKGNhbSwgdmlkZW8sIHNfcGFybSwgcGFybXMpOworCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKKwlwYXJtcy0+cGFybS5jYXB0dXJlLnJlYWRidWZmZXJzID0gbl9kbWFfYnVmczsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1jYW1fdmlkaW9jX2dfY2hpcF9pZGVudChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfZGJnX2NoaXBfaWRlbnQgKmNoaXApCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICpjYW0gPSBwcml2OworCisJY2hpcC0+aWRlbnQgPSBWNEwyX0lERU5UX05PTkU7CisJY2hpcC0+cmV2aXNpb24gPSAwOworCWlmICh2NGwyX2NoaXBfbWF0Y2hfaG9zdCgmY2hpcC0+bWF0Y2gpKSB7CisJCWNoaXAtPmlkZW50ID0gY2FtLT5jaGlwX2lkOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIHNlbnNvcl9jYWxsKGNhbSwgY29yZSwgZ19jaGlwX2lkZW50LCBjaGlwKTsKK30KKworc3RhdGljIGludCBtY2FtX3ZpZGlvY19lbnVtX2ZyYW1lc2l6ZXMoc3RydWN0IGZpbGUgKmZpbHAsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX2ZybXNpemVlbnVtICpzaXplcykKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IHByaXY7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7CisJcmV0ID0gc2Vuc29yX2NhbGwoY2FtLCB2aWRlbywgZW51bV9mcmFtZXNpemVzLCBzaXplcyk7CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbWNhbV92aWRpb2NfZW51bV9mcmFtZWludGVydmFscyhzdHJ1Y3QgZmlsZSAqZmlscCwgdm9pZCAqcHJpdiwKKwkJc3RydWN0IHY0bDJfZnJtaXZhbGVudW0gKmludGVydmFsKQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gcHJpdjsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXQgPSBzZW5zb3JfY2FsbChjYW0sIHZpZGVvLCBlbnVtX2ZyYW1laW50ZXJ2YWxzLCBpbnRlcnZhbCk7CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCitzdGF0aWMgaW50IG1jYW1fdmlkaW9jX2dfcmVnaXN0ZXIoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCXN0cnVjdCB2NGwyX2RiZ19yZWdpc3RlciAqcmVnKQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gcHJpdjsKKworCWlmICh2NGwyX2NoaXBfbWF0Y2hfaG9zdCgmcmVnLT5tYXRjaCkpIHsKKwkJcmVnLT52YWwgPSBtY2FtX3JlZ19yZWFkKGNhbSwgcmVnLT5yZWcpOworCQlyZWctPnNpemUgPSA0OworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIHNlbnNvcl9jYWxsKGNhbSwgY29yZSwgZ19yZWdpc3RlciwgcmVnKTsKK30KKworc3RhdGljIGludCBtY2FtX3ZpZGlvY19zX3JlZ2lzdGVyKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQlzdHJ1Y3QgdjRsMl9kYmdfcmVnaXN0ZXIgKnJlZykKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IHByaXY7CisKKwlpZiAodjRsMl9jaGlwX21hdGNoX2hvc3QoJnJlZy0+bWF0Y2gpKSB7CisJCW1jYW1fcmVnX3dyaXRlKGNhbSwgcmVnLT5yZWcsIHJlZy0+dmFsKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBzZW5zb3JfY2FsbChjYW0sIGNvcmUsIHNfcmVnaXN0ZXIsIHJlZyk7Cit9CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyBtY2FtX3Y0bF9pb2N0bF9vcHMgPSB7CisJLnZpZGlvY19xdWVyeWNhcAk9IG1jYW1fdmlkaW9jX3F1ZXJ5Y2FwLAorCS52aWRpb2NfZW51bV9mbXRfdmlkX2NhcCA9IG1jYW1fdmlkaW9jX2VudW1fZm10X3ZpZF9jYXAsCisJLnZpZGlvY190cnlfZm10X3ZpZF9jYXAJPSBtY2FtX3ZpZGlvY190cnlfZm10X3ZpZF9jYXAsCisJLnZpZGlvY19zX2ZtdF92aWRfY2FwCT0gbWNhbV92aWRpb2Nfc19mbXRfdmlkX2NhcCwKKwkudmlkaW9jX2dfZm10X3ZpZF9jYXAJPSBtY2FtX3ZpZGlvY19nX2ZtdF92aWRfY2FwLAorCS52aWRpb2NfZW51bV9pbnB1dAk9IG1jYW1fdmlkaW9jX2VudW1faW5wdXQsCisJLnZpZGlvY19nX2lucHV0CQk9IG1jYW1fdmlkaW9jX2dfaW5wdXQsCisJLnZpZGlvY19zX2lucHV0CQk9IG1jYW1fdmlkaW9jX3NfaW5wdXQsCisJLnZpZGlvY19zX3N0ZAkJPSBtY2FtX3ZpZGlvY19zX3N0ZCwKKwkudmlkaW9jX3JlcWJ1ZnMJCT0gbWNhbV92aWRpb2NfcmVxYnVmcywKKwkudmlkaW9jX3F1ZXJ5YnVmCT0gbWNhbV92aWRpb2NfcXVlcnlidWYsCisJLnZpZGlvY19xYnVmCQk9IG1jYW1fdmlkaW9jX3FidWYsCisJLnZpZGlvY19kcWJ1ZgkJPSBtY2FtX3ZpZGlvY19kcWJ1ZiwKKwkudmlkaW9jX3N0cmVhbW9uCT0gbWNhbV92aWRpb2Nfc3RyZWFtb24sCisJLnZpZGlvY19zdHJlYW1vZmYJPSBtY2FtX3ZpZGlvY19zdHJlYW1vZmYsCisJLnZpZGlvY19xdWVyeWN0cmwJPSBtY2FtX3ZpZGlvY19xdWVyeWN0cmwsCisJLnZpZGlvY19nX2N0cmwJCT0gbWNhbV92aWRpb2NfZ19jdHJsLAorCS52aWRpb2Nfc19jdHJsCQk9IG1jYW1fdmlkaW9jX3NfY3RybCwKKwkudmlkaW9jX2dfcGFybQkJPSBtY2FtX3ZpZGlvY19nX3Bhcm0sCisJLnZpZGlvY19zX3Bhcm0JCT0gbWNhbV92aWRpb2Nfc19wYXJtLAorCS52aWRpb2NfZW51bV9mcmFtZXNpemVzID0gbWNhbV92aWRpb2NfZW51bV9mcmFtZXNpemVzLAorCS52aWRpb2NfZW51bV9mcmFtZWludGVydmFscyA9IG1jYW1fdmlkaW9jX2VudW1fZnJhbWVpbnRlcnZhbHMsCisJLnZpZGlvY19nX2NoaXBfaWRlbnQJPSBtY2FtX3ZpZGlvY19nX2NoaXBfaWRlbnQsCisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworCS52aWRpb2NfZ19yZWdpc3Rlcgk9IG1jYW1fdmlkaW9jX2dfcmVnaXN0ZXIsCisJLnZpZGlvY19zX3JlZ2lzdGVyCT0gbWNhbV92aWRpb2Nfc19yZWdpc3RlciwKKyNlbmRpZgorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIE91ciB2YXJpb3VzIGZpbGUgb3BlcmF0aW9ucy4KKyAqLworc3RhdGljIGludCBtY2FtX3Y0bF9vcGVuKHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gdmlkZW9fZHJ2ZGF0YShmaWxwKTsKKwlpbnQgcmV0ID0gMDsKKworCWZpbHAtPnByaXZhdGVfZGF0YSA9IGNhbTsKKworCWZyYW1lcyA9IHNpbmdsZXMgPSBkZWxpdmVyZWQgPSAwOworCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7CisJaWYgKGNhbS0+dXNlcnMgPT0gMCkgeworCQlyZXQgPSBtY2FtX3NldHVwX3ZiMihjYW0pOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJCW1jYW1fY3Rscl9wb3dlcl91cChjYW0pOworCQlfX21jYW1fY2FtX3Jlc2V0KGNhbSk7CisJCW1jYW1fc2V0X2NvbmZpZ19uZWVkZWQoY2FtLCAxKTsKKwl9CisJKGNhbS0+dXNlcnMpKys7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBtY2FtX3Y0bF9yZWxlYXNlKHN0cnVjdCBmaWxlICpmaWxwKQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCisJY2FtX2VycihjYW0sICJSZWxlYXNlLCAlZCBmcmFtZXMsICVkIHNpbmdsZXMsICVkIGRlbGl2ZXJlZFxuIiwgZnJhbWVzLAorCQkJc2luZ2xlcywgZGVsaXZlcmVkKTsKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCShjYW0tPnVzZXJzKS0tOworCWlmIChmaWxwID09IGNhbS0+b3duZXIpIHsKKwkJbWNhbV9jdGxyX3N0b3BfZG1hKGNhbSk7CisJCWNhbS0+b3duZXIgPSBOVUxMOworCX0KKwlpZiAoY2FtLT51c2VycyA9PSAwKSB7CisJCW1jYW1fY2xlYW51cF92YjIoY2FtKTsKKwkJbWNhbV9jdGxyX3Bvd2VyX2Rvd24oY2FtKTsKKwkJaWYgKGNhbS0+YnVmZmVyX21vZGUgPT0gQl92bWFsbG9jICYmIGFsbG9jX2J1ZnNfYXRfcmVhZCkKKwkJCW1jYW1fZnJlZV9kbWFfYnVmcyhjYW0pOworCX0KKwltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1jYW1fdjRsX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsCisJCWNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBsZW4sIGxvZmZfdCAqcG9zKQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldCA9IHZiMl9yZWFkKCZjYW0tPnZiX3F1ZXVlLCBidWZmZXIsIGxlbiwgcG9zLAorCQkJZmlscC0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCW11dGV4X3VubG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXR1cm4gcmV0OworfQorCisKKworc3RhdGljIHVuc2lnbmVkIGludCBtY2FtX3Y0bF9wb2xsKHN0cnVjdCBmaWxlICpmaWxwLAorCQlzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKnB0KQoreworCXN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldCA9IHZiMl9wb2xsKCZjYW0tPnZiX3F1ZXVlLCBmaWxwLCBwdCk7CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBtY2FtX3Y0bF9tbWFwKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmY2FtLT5zX211dGV4KTsKKwlyZXQgPSB2YjJfbW1hcCgmY2FtLT52Yl9xdWV1ZSwgdm1hKTsKKwltdXRleF91bmxvY2soJmNhbS0+c19tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9maWxlX29wZXJhdGlvbnMgbWNhbV92NGxfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IG1jYW1fdjRsX29wZW4sCisJLnJlbGVhc2UgPSBtY2FtX3Y0bF9yZWxlYXNlLAorCS5yZWFkID0gbWNhbV92NGxfcmVhZCwKKwkucG9sbCA9IG1jYW1fdjRsX3BvbGwsCisJLm1tYXAgPSBtY2FtX3Y0bF9tbWFwLAorCS51bmxvY2tlZF9pb2N0bCA9IHZpZGVvX2lvY3RsMiwKK307CisKKworLyoKKyAqIFRoaXMgdGVtcGxhdGUgZGV2aWNlIGhvbGRzIGFsbCBvZiB0aG9zZSB2NGwyIG1ldGhvZHM7IHdlCisgKiBjbG9uZSBpdCBmb3Igc3BlY2lmaWMgcmVhbCBkZXZpY2VzLgorICovCitzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSBtY2FtX3Y0bF90ZW1wbGF0ZSA9IHsKKwkubmFtZSA9ICJtY2FtIiwKKwkudHZub3JtcyA9IFY0TDJfU1REX05UU0NfTSwKKwkuY3VycmVudF9ub3JtID0gVjRMMl9TVERfTlRTQ19NLCAgLyogbWFrZSBtcGxheWVyIGhhcHB5ICovCisKKwkuZm9wcyA9ICZtY2FtX3Y0bF9mb3BzLAorCS5pb2N0bF9vcHMgPSAmbWNhbV92NGxfaW9jdGxfb3BzLAorCS5yZWxlYXNlID0gdmlkZW9fZGV2aWNlX3JlbGVhc2VfZW1wdHksCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKgorICogSW50ZXJydXB0IGhhbmRsZXIgc3R1ZmYKKyAqLworc3RhdGljIHZvaWQgbWNhbV9mcmFtZV9jb21wbGV0ZShzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSwgaW50IGZyYW1lKQoreworCS8qCisJICogQmFzaWMgZnJhbWUgaG91c2VrZWVwaW5nLgorCSAqLworCXNldF9iaXQoZnJhbWUsICZjYW0tPmZsYWdzKTsKKwljbGVhcl9iaXQoQ0ZfRE1BX0FDVElWRSwgJmNhbS0+ZmxhZ3MpOworCWNhbS0+bmV4dF9idWYgPSBmcmFtZTsKKwljYW0tPmJ1Zl9zZXFbZnJhbWVdID0gKysoY2FtLT5zZXF1ZW5jZSk7CisJZnJhbWVzKys7CisJLyoKKwkgKiAiVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIgorCSAqLworCWlmIChjYW0tPnN0YXRlICE9IFNfU1RSRUFNSU5HKQorCQlyZXR1cm47CisJLyoKKwkgKiBQcm9jZXNzIHRoZSBmcmFtZSBhbmQgc2V0IHVwIHRoZSBuZXh0IG9uZS4KKwkgKi8KKwljYW0tPmZyYW1lX2NvbXBsZXRlKGNhbSwgZnJhbWUpOworfQorCisKKy8qCisgKiBUaGUgaW50ZXJydXB0IGhhbmRsZXI7IHRoaXMgbmVlZHMgdG8gYmUgY2FsbGVkIGZyb20gdGhlCisgKiBwbGF0Zm9ybSBpcnEgaGFuZGxlciB3aXRoIHRoZSBsb2NrIGhlbGQuCisgKi8KK2ludCBtY2NpY19pcnEoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0sIHVuc2lnbmVkIGludCBpcnFzKQoreworCXVuc2lnbmVkIGludCBmcmFtZSwgaGFuZGxlZCA9IDA7CisKKwltY2FtX3JlZ193cml0ZShjYW0sIFJFR19JUlFTVEFULCBGUkFNRUlSUVMpOyAvKiBDbGVhcidlbSBhbGwgKi8KKwkvKgorCSAqIEhhbmRsZSBhbnkgZnJhbWUgY29tcGxldGlvbnMuICBUaGVyZSByZWFsbHkgc2hvdWxkCisJICogbm90IGJlIG1vcmUgdGhhbiBvbmUgb2YgdGhlc2UsIG9yIHdlIGhhdmUgZmFsbGVuCisJICogZmFyIGJlaGluZC4KKwkgKgorCSAqIFdoZW4gcnVubmluZyBpbiBTL0cgbW9kZSwgdGhlIGZyYW1lIG51bWJlciBsYWNrcyBhbnkKKwkgKiByZWFsIG1lYW5pbmcgLSB0aGVyZSdzIG9ubHkgb25lIGRlc2NyaXB0b3IgYXJyYXkgLSBidXQKKwkgKiB0aGUgY29udHJvbGxlciBzdGlsbCBwaWNrcyBhIGRpZmZlcmVudCBvbmUgdG8gc2lnbmFsCisJICogZWFjaCB0aW1lLgorCSAqLworCWZvciAoZnJhbWUgPSAwOyBmcmFtZSA8IGNhbS0+bmJ1ZnM7IGZyYW1lKyspCisJCWlmIChpcnFzICYgKElSUV9FT0YwIDw8IGZyYW1lKSkgeworCQkJbWNhbV9mcmFtZV9jb21wbGV0ZShjYW0sIGZyYW1lKTsKKwkJCWhhbmRsZWQgPSAxOworCQl9CisJLyoKKwkgKiBJZiBhIGZyYW1lIHN0YXJ0cywgbm90ZSB0aGF0IHdlIGhhdmUgRE1BIGFjdGl2ZS4gIFRoaXMKKwkgKiBjb2RlIGFzc3VtZXMgdGhhdCB3ZSB3b24ndCBnZXQgbXVsdGlwbGUgZnJhbWUgaW50ZXJydXB0cworCSAqIGF0IG9uY2U7IG1heSB3YW50IHRvIHJldGhpbmsgdGhhdC4KKwkgKi8KKwlpZiAoaXJxcyAmIChJUlFfU09GMCB8IElSUV9TT0YxIHwgSVJRX1NPRjIpKSB7CisJCXNldF9iaXQoQ0ZfRE1BX0FDVElWRSwgJmNhbS0+ZmxhZ3MpOworCQloYW5kbGVkID0gMTsKKwkJaWYgKGNhbS0+YnVmZmVyX21vZGUgPT0gQl9ETUFfc2cpCisJCQltY2FtX2N0bHJfc3RvcChjYW0pOworCX0KKwlyZXR1cm4gaGFuZGxlZDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAqIFJlZ2lzdHJhdGlvbiBhbmQgc3VjaC4KKyAqLworc3RhdGljIHN0cnVjdCBvdjc2NzBfY29uZmlnIHNlbnNvcl9jZmcgPSB7CisJLyoKKwkgKiBFeGNsdWRlIFFDSUYgbW9kZSwgYmVjYXVzZSBpdCBvbmx5IGNhcHR1cmVzIGEgdGlueSBwb3J0aW9uCisJICogb2YgdGhlIHNlbnNvciBGT1YKKwkgKi8KKwkubWluX3dpZHRoID0gMzIwLAorCS5taW5faGVpZ2h0ID0gMjQwLAorfTsKKworCitpbnQgbWNjaWNfcmVnaXN0ZXIoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pCit7CisJc3RydWN0IGkyY19ib2FyZF9pbmZvIG92NzY3MF9pbmZvID0geworCQkudHlwZSA9ICJvdjc2NzAiLAorCQkuYWRkciA9IDB4NDIgPj4gMSwKKwkJLnBsYXRmb3JtX2RhdGEgPSAmc2Vuc29yX2NmZywKKwl9OworCWludCByZXQ7CisKKwkvKgorCSAqIFZhbGlkYXRlIHRoZSByZXF1ZXN0ZWQgYnVmZmVyIG1vZGUuCisJICovCisJaWYgKGJ1ZmZlcl9tb2RlID49IDApCisJCWNhbS0+YnVmZmVyX21vZGUgPSBidWZmZXJfbW9kZTsKKwlpZiAoY2FtLT5idWZmZXJfbW9kZSA9PSBCX0RNQV9zZyAmJgorCQkJY2FtLT5jaGlwX2lkID09IFY0TDJfSURFTlRfQ0FGRSkgeworCQlwcmludGsoS0VSTl9FUlIgIm1hcnZlbGwtY2FtOiBDYWZlIGNhbid0IGRvIFMvRyBJL08sICIKKwkJCSJhdHRlbXB0aW5nIHZtYWxsb2MgbW9kZSBpbnN0ZWFkXG4iKTsKKwkJY2FtLT5idWZmZXJfbW9kZSA9IEJfdm1hbGxvYzsKKwl9CisJaWYgKCFtY2FtX2J1ZmZlcl9tb2RlX3N1cHBvcnRlZChjYW0tPmJ1ZmZlcl9tb2RlKSkgeworCQlwcmludGsoS0VSTl9FUlIgIm1hcnZlbGwtY2FtOiBidWZmZXIgbW9kZSAlZCB1bnN1cHBvcnRlZFxuIiwKKwkJCQljYW0tPmJ1ZmZlcl9tb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qCisJICogUmVnaXN0ZXIgd2l0aCBWNEwKKwkgKi8KKwlyZXQgPSB2NGwyX2RldmljZV9yZWdpc3RlcihjYW0tPmRldiwgJmNhbS0+djRsMl9kZXYpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwltdXRleF9pbml0KCZjYW0tPnNfbXV0ZXgpOworCWNhbS0+c3RhdGUgPSBTX05PVFJFQURZOworCW1jYW1fc2V0X2NvbmZpZ19uZWVkZWQoY2FtLCAxKTsKKwljYW0tPnBpeF9mb3JtYXQgPSBtY2FtX2RlZl9waXhfZm9ybWF0OworCWNhbS0+bWJ1c19jb2RlID0gbWNhbV9kZWZfbWJ1c19jb2RlOworCUlOSVRfTElTVF9IRUFEKCZjYW0tPmJ1ZmZlcnMpOworCW1jYW1fY3Rscl9pbml0KGNhbSk7CisKKwkvKgorCSAqIFRyeSB0byBmaW5kIHRoZSBzZW5zb3IuCisJICovCisJc2Vuc29yX2NmZy5jbG9ja19zcGVlZCA9IGNhbS0+Y2xvY2tfc3BlZWQ7CisJc2Vuc29yX2NmZy51c2Vfc21idXMgPSBjYW0tPnVzZV9zbWJ1czsKKwljYW0tPnNlbnNvcl9hZGRyID0gb3Y3NjcwX2luZm8uYWRkcjsKKwljYW0tPnNlbnNvciA9IHY0bDJfaTJjX25ld19zdWJkZXZfYm9hcmQoJmNhbS0+djRsMl9kZXYsCisJCQljYW0tPmkyY19hZGFwdGVyLCAmb3Y3NjcwX2luZm8sIE5VTEwpOworCWlmIChjYW0tPnNlbnNvciA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X3VucmVnaXN0ZXI7CisJfQorCisJcmV0ID0gbWNhbV9jYW1faW5pdChjYW0pOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3VucmVnaXN0ZXI7CisJLyoKKwkgKiBHZXQgdGhlIHY0bDIgc2V0dXAgZG9uZS4KKwkgKi8KKwltdXRleF9sb2NrKCZjYW0tPnNfbXV0ZXgpOworCWNhbS0+dmRldiA9IG1jYW1fdjRsX3RlbXBsYXRlOworCWNhbS0+dmRldi5kZWJ1ZyA9IDA7CisJY2FtLT52ZGV2LnY0bDJfZGV2ID0gJmNhbS0+djRsMl9kZXY7CisJcmV0ID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZjYW0tPnZkZXYsIFZGTF9UWVBFX0dSQUJCRVIsIC0xKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKwl2aWRlb19zZXRfZHJ2ZGF0YSgmY2FtLT52ZGV2LCBjYW0pOworCisJLyoKKwkgKiBJZiBzbyByZXF1ZXN0ZWQsIHRyeSB0byBnZXQgb3VyIERNQSBidWZmZXJzIG5vdy4KKwkgKi8KKwlpZiAoY2FtLT5idWZmZXJfbW9kZSA9PSBCX3ZtYWxsb2MgJiYgIWFsbG9jX2J1ZnNfYXRfcmVhZCkgeworCQlpZiAobWNhbV9hbGxvY19kbWFfYnVmcyhjYW0sIDEpKQorCQkJY2FtX3dhcm4oY2FtLCAiVW5hYmxlIHRvIGFsbG9jIERNQSBidWZmZXJzIGF0IGxvYWQiCisJCQkJCSIgd2lsbCB0cnkgYWdhaW4gbGF0ZXIuIik7CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCXJldHVybiByZXQ7CitvdXRfdW5yZWdpc3RlcjoKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyKCZjYW0tPnY0bDJfZGV2KTsKKwlyZXR1cm4gcmV0OworfQorCisKK3ZvaWQgbWNjaWNfc2h1dGRvd24oc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pCit7CisJLyoKKwkgKiBJZiB3ZSBoYXZlIG5vIHVzZXJzIChhbmQgd2UgcmVhbGx5LCByZWFsbHkgc2hvdWxkIGhhdmUgbm8KKwkgKiB1c2VycykgdGhlIGRldmljZSB3aWxsIGFscmVhZHkgYmUgcG93ZXJlZCBkb3duLiAgVHJ5aW5nIHRvCisJICogdGFrZSBpdCBkb3duIGFnYWluIHdpbGwgd2VkZ2UgdGhlIG1hY2hpbmUsIHdoaWNoIGlzIGZyb3duZWQKKwkgKiB1cG9uLgorCSAqLworCWlmIChjYW0tPnVzZXJzID4gMCkgeworCQljYW1fd2FybihjYW0sICJSZW1vdmluZyBhIGRldmljZSB3aXRoIHVzZXJzIVxuIik7CisJCW1jYW1fY3Rscl9wb3dlcl9kb3duKGNhbSk7CisJfQorCXZiMl9xdWV1ZV9yZWxlYXNlKCZjYW0tPnZiX3F1ZXVlKTsKKwlpZiAoY2FtLT5idWZmZXJfbW9kZSA9PSBCX3ZtYWxsb2MpCisJCW1jYW1fZnJlZV9kbWFfYnVmcyhjYW0pOworCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKCZjYW0tPnZkZXYpOworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJmNhbS0+djRsMl9kZXYpOworfQorCisvKgorICogUG93ZXIgbWFuYWdlbWVudAorICovCisjaWZkZWYgQ09ORklHX1BNCisKK3ZvaWQgbWNjaWNfc3VzcGVuZChzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwllbnVtIG1jYW1fc3RhdGUgY3N0YXRlID0gY2FtLT5zdGF0ZTsKKworCW1jYW1fY3Rscl9zdG9wX2RtYShjYW0pOworCW1jYW1fY3Rscl9wb3dlcl9kb3duKGNhbSk7CisJY2FtLT5zdGF0ZSA9IGNzdGF0ZTsKK30KKworaW50IG1jY2ljX3Jlc3VtZShzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSkKK3sKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJmNhbS0+c19tdXRleCk7CisJaWYgKGNhbS0+dXNlcnMgPiAwKSB7CisJCW1jYW1fY3Rscl9wb3dlcl91cChjYW0pOworCQlfX21jYW1fY2FtX3Jlc2V0KGNhbSk7CisJfSBlbHNlIHsKKwkJbWNhbV9jdGxyX3Bvd2VyX2Rvd24oY2FtKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZjYW0tPnNfbXV0ZXgpOworCisJc2V0X2JpdChDRl9DT05GSUdfTkVFREVELCAmY2FtLT5mbGFncyk7CisJaWYgKGNhbS0+c3RhdGUgPT0gU19TVFJFQU1JTkcpCisJCXJldCA9IG1jYW1fcmVhZF9zZXR1cChjYW0pOworCXJldHVybiByZXQ7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL21hcnZlbGwtY2NpYy9tY2FtLWNvcmUuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWFydmVsbC1jY2ljL21jYW0tY29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNzIwMGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21hcnZlbGwtY2NpYy9tY2FtLWNvcmUuaApAQCAtMCwwICsxLDMyMyBAQAorLyoKKyAqIE1hcnZlbGwgY2FtZXJhIGNvcmUgc3RydWN0dXJlcy4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBKb25hdGhhbiBDb3JiZXQgY29yYmV0QGx3bi5uZXQKKyAqLworI2lmbmRlZiBfTUNBTV9DT1JFX0gKKyNkZWZpbmUgX01DQU1fQ09SRV9ICisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgorI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi1jb3JlLmg+CisKKy8qCisgKiBDcmVhdGUgb3VyIG93biBzeW1ib2xzIGZvciB0aGUgc3VwcG9ydGVkIGJ1ZmZlciBtb2RlcywgYnV0LCBmb3Igbm93LAorICogYmFzZSB0aGVtIGVudGlyZWx5IG9uIHdoaWNoIHZpZGVvYnVmMiBvcHRpb25zIGhhdmUgYmVlbiBzZWxlY3RlZC4KKyAqLworI2lmIGRlZmluZWQoQ09ORklHX1ZJREVPQlVGMl9WTUFMTE9DKSB8fCBkZWZpbmVkKENPTkZJR19WSURFT0JVRjJfVk1BTExPQ19NT0RVTEUpCisjZGVmaW5lIE1DQU1fTU9ERV9WTUFMTE9DIDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfVklERU9CVUYyX0RNQV9DT05USUcpIHx8IGRlZmluZWQoQ09ORklHX1ZJREVPQlVGMl9ETUFfQ09OVElHX01PRFVMRSkKKyNkZWZpbmUgTUNBTV9NT0RFX0RNQV9DT05USUcgMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKENPTkZJR19WSURFT0JVRjJfRE1BX1NHKSB8fCBkZWZpbmVkKENPTkZJR19WSURFT0JVRjJfRE1BX1NHX01PRFVMRSkKKyNkZWZpbmUgTUNBTV9NT0RFX0RNQV9TRyAxCisjZW5kaWYKKworI2lmICFkZWZpbmVkKE1DQU1fTU9ERV9WTUFMTE9DKSAmJiAhZGVmaW5lZChNQ0FNX01PREVfRE1BX0NPTlRJRykgJiYgXAorCSFkZWZpbmVkKE1DQU1fTU9ERV9ETUFfU0cpCisjZXJyb3IgT25lIG9mIHRoZSB2aWRlb2J1ZiBidWZmZXIgbW9kZXMgbXVzdCBiZSBzZWxlY3RlZCBpbiB0aGUgY29uZmlnCisjZW5kaWYKKworCitlbnVtIG1jYW1fc3RhdGUgeworCVNfTk9UUkVBRFksCS8qIE5vdCB5ZXQgaW5pdGlhbGl6ZWQgKi8KKwlTX0lETEUsCQkvKiBKdXN0IGhhbmdpbmcgYXJvdW5kICovCisJU19GTEFLRUQsCS8qIFNvbWUgc29ydCBvZiBwcm9ibGVtICovCisJU19TVFJFQU1JTkcsCS8qIFN0cmVhbWluZyBkYXRhICovCisJU19CVUZXQUlUCS8qIHN0cmVhbWluZyByZXF1ZXN0ZWQgYnV0IG5vIGJ1ZmZlcnMgeWV0ICovCit9OworI2RlZmluZSBNQVhfRE1BX0JVRlMgMworCisvKgorICogRGlmZmVyZW50IHBsYXRmb3JtcyB3b3JrIGJlc3Qgd2l0aCBkaWZmZXJlbnQgYnVmZmVyIG1vZGVzLCBzbyB3ZQorICogbGV0IHRoZSBwbGF0Zm9ybSBwaWNrLgorICovCitlbnVtIG1jYW1fYnVmZmVyX21vZGUgeworCUJfdm1hbGxvYyA9IDAsCisJQl9ETUFfY29udGlnID0gMSwKKwlCX0RNQV9zZyA9IDIKK307CisKKy8qCisgKiBJcyBhIGdpdmVuIGJ1ZmZlciBtb2RlIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBrZXJuZWwgY29uZmlndXJhdGlvbj8KKyAqLworc3RhdGljIGlubGluZSBpbnQgbWNhbV9idWZmZXJfbW9kZV9zdXBwb3J0ZWQoZW51bSBtY2FtX2J1ZmZlcl9tb2RlIG1vZGUpCit7CisJc3dpdGNoIChtb2RlKSB7CisjaWZkZWYgTUNBTV9NT0RFX1ZNQUxMT0MKKwljYXNlIEJfdm1hbGxvYzoKKyNlbmRpZgorI2lmZGVmIE1DQU1fTU9ERV9ETUFfQ09OVElHCisJY2FzZSBCX0RNQV9jb250aWc6CisjZW5kaWYKKyNpZmRlZiBNQ0FNX01PREVfRE1BX1NHCisJY2FzZSBCX0RNQV9zZzoKKyNlbmRpZgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKKworLyoKKyAqIEEgZGVzY3JpcHRpb24gb2Ygb25lIG9mIG91ciBkZXZpY2VzLgorICogTG9ja2luZzogY29udHJvbGxlZCBieSBzX211dGV4LiAgQ2VydGFpbiBmaWVsZHMsIGhvd2V2ZXIsIHJlcXVpcmUKKyAqICAgICAgICAgIHRoZSBkZXZfbG9jayBzcGlubG9jazsgdGhleSBhcmUgbWFya2VkIGFzIHN1Y2ggYnkgY29tbWVudHMuCisgKiAgICAgICAgICBkZXZfbG9jayBpcyBhbHNvIHJlcXVpcmVkIGZvciBhY2Nlc3MgdG8gZGV2aWNlIHJlZ2lzdGVycy4KKyAqLworc3RydWN0IG1jYW1fY2FtZXJhIHsKKwkvKgorCSAqIFRoZXNlIGZpZWxkcyBzaG91bGQgYmUgc2V0IGJ5IHRoZSBwbGF0Zm9ybSBjb2RlIHByaW9yIHRvCisJICogY2FsbGluZyBtY2FtX3JlZ2lzdGVyKCkuCisJICovCisJc3RydWN0IGkyY19hZGFwdGVyICppMmNfYWRhcHRlcjsKKwl1bnNpZ25lZCBjaGFyIF9faW9tZW0gKnJlZ3M7CisJc3BpbmxvY2tfdCBkZXZfbG9jazsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7IC8qIEZvciBtZXNzYWdlcywgZG1hIGFsbG9jICovCisJdW5zaWduZWQgaW50IGNoaXBfaWQ7CisJc2hvcnQgaW50IGNsb2NrX3NwZWVkOwkvKiBTZW5zb3IgY2xvY2sgc3BlZWQsIGRlZmF1bHQgMzAgKi8KKwlzaG9ydCBpbnQgdXNlX3NtYnVzOwkvKiBTTUJVUyBvciBzdHJhaWdodCBJMmM/ICovCisJZW51bSBtY2FtX2J1ZmZlcl9tb2RlIGJ1ZmZlcl9tb2RlOworCS8qCisJICogQ2FsbGJhY2tzIGZyb20gdGhlIGNvcmUgdG8gdGhlIHBsYXRmb3JtIGNvZGUuCisJICovCisJdm9pZCAoKnBsYXRfcG93ZXJfdXApIChzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSk7CisJdm9pZCAoKnBsYXRfcG93ZXJfZG93bikgKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKTsKKworCS8qCisJICogRXZlcnl0aGluZyBiZWxvdyBoZXJlIGlzIHByaXZhdGUgdG8gdGhlIG1jYW0gY29yZSBhbmQKKwkgKiBzaG91bGQgbm90IGJlIHRvdWNoZWQgYnkgdGhlIHBsYXRmb3JtIGNvZGUuCisJICovCisJc3RydWN0IHY0bDJfZGV2aWNlIHY0bDJfZGV2OworCWVudW0gbWNhbV9zdGF0ZSBzdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwkJLyogQnVmZmVyIHN0YXR1cywgbWFpbmx5IChkZXZfbG9jaykgKi8KKwlpbnQgdXNlcnM7CQkJLyogSG93IG1hbnkgb3BlbiBGRHMgKi8KKwlzdHJ1Y3QgZmlsZSAqb3duZXI7CQkvKiBXaG8gaGFzIGRhdGEgYWNjZXNzICh2NGwyKSAqLworCisJLyoKKwkgKiBTdWJzeXN0ZW0gc3RydWN0dXJlcy4KKwkgKi8KKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlIHZkZXY7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZW5zb3I7CisJdW5zaWduZWQgc2hvcnQgc2Vuc29yX2FkZHI7CisKKwkvKiBWaWRlb2J1ZjIgc3R1ZmYgKi8KKwlzdHJ1Y3QgdmIyX3F1ZXVlIHZiX3F1ZXVlOworCXN0cnVjdCBsaXN0X2hlYWQgYnVmZmVyczsJLyogQXZhaWxhYmxlIGZyYW1lcyAqLworCisJdW5zaWduZWQgaW50IG5idWZzOwkJLyogSG93IG1hbnkgYXJlIGFsbG9jJ2QgKi8KKwlpbnQgbmV4dF9idWY7CQkJLyogTmV4dCB0byBjb25zdW1lIChkZXZfbG9jaykgKi8KKworCS8qIERNQSBidWZmZXJzIC0gdm1hbGxvYyBtb2RlICovCisjaWZkZWYgTUNBTV9NT0RFX1ZNQUxMT0MKKwl1bnNpZ25lZCBpbnQgZG1hX2J1Zl9zaXplOwkvKiBhbGxvY2F0ZWQgc2l6ZSAqLworCXZvaWQgKmRtYV9idWZzW01BWF9ETUFfQlVGU107CS8qIEludGVybmFsIGJ1ZmZlciBhZGRyZXNzZXMgKi8KKwlkbWFfYWRkcl90IGRtYV9oYW5kbGVzW01BWF9ETUFfQlVGU107IC8qIEJ1ZmZlciBidXMgYWRkcmVzc2VzICovCisJc3RydWN0IHRhc2tsZXRfc3RydWN0IHNfdGFza2xldDsKKyNlbmRpZgorCXVuc2lnbmVkIGludCBzZXF1ZW5jZTsJCS8qIEZyYW1lIHNlcXVlbmNlIG51bWJlciAqLworCXVuc2lnbmVkIGludCBidWZfc2VxW01BWF9ETUFfQlVGU107IC8qIFNlcXVlbmNlIGZvciBpbmRpdmlkdWFsIGJ1ZnMgKi8KKworCS8qIERNQSBidWZmZXJzIC0gRE1BIG1vZGVzICovCisJc3RydWN0IG1jYW1fdmJfYnVmZmVyICp2Yl9idWZzW01BWF9ETUFfQlVGU107CisJc3RydWN0IHZiMl9hbGxvY19jdHggKnZiX2FsbG9jX2N0eDsKKworCS8qIE1vZGUtc3BlY2lmaWMgb3BzLCBzZXQgYXQgb3BlbiB0aW1lICovCisJdm9pZCAoKmRtYV9zZXR1cCkoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0pOworCXZvaWQgKCpmcmFtZV9jb21wbGV0ZSkoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0sIGludCBmcmFtZSk7CisKKwkvKiBDdXJyZW50IG9wZXJhdGluZyBwYXJhbWV0ZXJzICovCisJdTMyIHNlbnNvcl90eXBlOwkJLyogQ3VycmVudGx5IG92NzY3MCBvbmx5ICovCisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCBwaXhfZm9ybWF0OworCWVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBtYnVzX2NvZGU7CisKKwkvKiBMb2NrcyAqLworCXN0cnVjdCBtdXRleCBzX211dGV4OyAvKiBBY2Nlc3MgdG8gdGhpcyBzdHJ1Y3R1cmUgKi8KK307CisKKworLyoKKyAqIFJlZ2lzdGVyIEkvTyBmdW5jdGlvbnMuICBUaGVzZSBhcmUgaGVyZSBiZWNhdXNlIHRoZSBwbGF0Zm9ybSBjb2RlCisgKiBtYXkgbGVnaXRpbWF0ZWx5IG5lZWQgdG8gbWVzcyB3aXRoIHRoZSByZWdpc3RlciBzcGFjZS4KKyAqLworLyoKKyAqIERldmljZSByZWdpc3RlciBJL08KKyAqLworc3RhdGljIGlubGluZSB2b2lkIG1jYW1fcmVnX3dyaXRlKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtLCB1bnNpZ25lZCBpbnQgcmVnLAorCQl1bnNpZ25lZCBpbnQgdmFsKQoreworCWlvd3JpdGUzMih2YWwsIGNhbS0+cmVncyArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IG1jYW1fcmVnX3JlYWQoc3RydWN0IG1jYW1fY2FtZXJhICpjYW0sCisJCXVuc2lnbmVkIGludCByZWcpCit7CisJcmV0dXJuIGlvcmVhZDMyKGNhbS0+cmVncyArIHJlZyk7Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIG1jYW1fcmVnX3dyaXRlX21hc2soc3RydWN0IG1jYW1fY2FtZXJhICpjYW0sIHVuc2lnbmVkIGludCByZWcsCisJCXVuc2lnbmVkIGludCB2YWwsIHVuc2lnbmVkIGludCBtYXNrKQoreworCXVuc2lnbmVkIGludCB2ID0gbWNhbV9yZWdfcmVhZChjYW0sIHJlZyk7CisKKwl2ID0gKHYgJiB+bWFzaykgfCAodmFsICYgbWFzayk7CisJbWNhbV9yZWdfd3JpdGUoY2FtLCByZWcsIHYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbWNhbV9yZWdfY2xlYXJfYml0KHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtLAorCQl1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCW1jYW1fcmVnX3dyaXRlX21hc2soY2FtLCByZWcsIDAsIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtY2FtX3JlZ19zZXRfYml0KHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtLAorCQl1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCW1jYW1fcmVnX3dyaXRlX21hc2soY2FtLCByZWcsIHZhbCwgdmFsKTsKK30KKworLyoKKyAqIEZ1bmN0aW9ucyBmb3IgdXNlIGJ5IHBsYXRmb3JtIGNvZGUuCisgKi8KK2ludCBtY2NpY19yZWdpc3RlcihzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSk7CitpbnQgbWNjaWNfaXJxKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtLCB1bnNpZ25lZCBpbnQgaXJxcyk7Cit2b2lkIG1jY2ljX3NodXRkb3duKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKTsKKyNpZmRlZiBDT05GSUdfUE0KK3ZvaWQgbWNjaWNfc3VzcGVuZChzdHJ1Y3QgbWNhbV9jYW1lcmEgKmNhbSk7CitpbnQgbWNjaWNfcmVzdW1lKHN0cnVjdCBtY2FtX2NhbWVyYSAqY2FtKTsKKyNlbmRpZgorCisvKgorICogUmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9yIHRoZSBtODhhbHAwMSBjYW1lcmEgaW50ZXJmYWNlLiAgT2Zmc2V0cyBpbiBieXRlcworICogYXMgZ2l2ZW4gaW4gdGhlIHNwZWMuCisgKi8KKyNkZWZpbmUgUkVHX1kwQkFSCTB4MDAKKyNkZWZpbmUgUkVHX1kxQkFSCTB4MDQKKyNkZWZpbmUgUkVHX1kyQkFSCTB4MDgKKy8qIC4uLiAqLworCisjZGVmaW5lIFJFR19JTUdQSVRDSAkweDI0CS8qIEltYWdlIHBpdGNoIHJlZ2lzdGVyICovCisjZGVmaW5lICAgSU1HUF9ZUF9TSEZUCSAgMgkJLyogWSBwaXRjaCBwYXJhbXMgKi8KKyNkZWZpbmUgICBJTUdQX1lQX01BU0sJICAweDAwMDAzZmZjCS8qIFkgcGl0Y2ggZmllbGQgKi8KKyNkZWZpbmUJICBJTUdQX1VWUF9TSEZUCSAgMTgJCS8qIFVWIHBpdGNoIChwbGFuYXIpICovCisjZGVmaW5lICAgSU1HUF9VVlBfTUFTSyAgIDB4M2ZmYzAwMDAKKyNkZWZpbmUgUkVHX0lSUVNUQVRSQVcJMHgyOAkvKiBSQVcgSVJRIFN0YXR1cyAqLworI2RlZmluZSAgIElSUV9FT0YwCSAgMHgwMDAwMDAwMQkvKiBFbmQgb2YgZnJhbWUgMCAqLworI2RlZmluZSAgIElSUV9FT0YxCSAgMHgwMDAwMDAwMgkvKiBFbmQgb2YgZnJhbWUgMSAqLworI2RlZmluZSAgIElSUV9FT0YyCSAgMHgwMDAwMDAwNAkvKiBFbmQgb2YgZnJhbWUgMiAqLworI2RlZmluZSAgIElSUV9TT0YwCSAgMHgwMDAwMDAwOAkvKiBTdGFydCBvZiBmcmFtZSAwICovCisjZGVmaW5lICAgSVJRX1NPRjEJICAweDAwMDAwMDEwCS8qIFN0YXJ0IG9mIGZyYW1lIDEgKi8KKyNkZWZpbmUgICBJUlFfU09GMgkgIDB4MDAwMDAwMjAJLyogU3RhcnQgb2YgZnJhbWUgMiAqLworI2RlZmluZSAgIElSUV9PVkVSRkxPVwkgIDB4MDAwMDAwNDAJLyogRklGTyBvdmVyZmxvdyAqLworI2RlZmluZSAgIElSUV9UV1NJVwkgIDB4MDAwMTAwMDAJLyogVFdTSSAoc21idXMpIHdyaXRlICovCisjZGVmaW5lICAgSVJRX1RXU0lSCSAgMHgwMDAyMDAwMAkvKiBUV1NJIHJlYWQgKi8KKyNkZWZpbmUgICBJUlFfVFdTSUUJICAweDAwMDQwMDAwCS8qIFRXU0kgZXJyb3IgKi8KKyNkZWZpbmUgICBUV1NJSVJRUyAoSVJRX1RXU0lXfElSUV9UV1NJUnxJUlFfVFdTSUUpCisjZGVmaW5lICAgRlJBTUVJUlFTIChJUlFfRU9GMHxJUlFfRU9GMXxJUlFfRU9GMnxJUlFfU09GMHxJUlFfU09GMXxJUlFfU09GMikKKyNkZWZpbmUgICBBTExJUlFTIChUV1NJSVJRU3xGUkFNRUlSUVN8SVJRX09WRVJGTE9XKQorI2RlZmluZSBSRUdfSVJRTUFTSwkweDJjCS8qIElSUSBtYXNrIC0gc2FtZSBiaXRzIGFzIElSUVNUQVQgKi8KKyNkZWZpbmUgUkVHX0lSUVNUQVQJMHgzMAkvKiBJUlEgc3RhdHVzIC8gY2xlYXIgKi8KKworI2RlZmluZSBSRUdfSU1HU0laRQkweDM0CS8qIEltYWdlIHNpemUgKi8KKyNkZWZpbmUgIElNR1NaX1ZfTUFTSwkgIDB4MWZmZjAwMDAKKyNkZWZpbmUgIElNR1NaX1ZfU0hJRlQJICAxNgorI2RlZmluZQkgSU1HU1pfSF9NQVNLCSAgMHgwMDAwM2ZmZgorI2RlZmluZSBSRUdfSU1HT0ZGU0VUCTB4MzgJLyogSU1hZ2Ugb2Zmc2V0ICovCisKKyNkZWZpbmUgUkVHX0NUUkwwCTB4M2MJLyogQ29udHJvbCAwICovCisjZGVmaW5lICAgQzBfRU5BQkxFCSAgMHgwMDAwMDAwMQkvKiBNYWtlcyB0aGUgd2hvbGUgdGhpbmcgZ28gKi8KKworLyogTWFzayBmb3IgYWxsIHRoZSBmb3JtYXQgYml0cyAqLworI2RlZmluZSAgIEMwX0RGX01BU0sJICAweDAwZmZmZmZjICAgIC8qIEJpdHMgMi0yMyAqLworCisvKiBSR0Igb3JkZXJpbmcgKi8KKyNkZWZpbmUJICBDMF9SR0I0X1JHQlgJICAweDAwMDAwMDAwCisjZGVmaW5lCSAgQzBfUkdCNF9YUkdCCSAgMHgwMDAwMDAwNAorI2RlZmluZQkgIEMwX1JHQjRfQkdSWAkgIDB4MDAwMDAwMDgKKyNkZWZpbmUJICBDMF9SR0I0X1hCR1IJICAweDAwMDAwMDBjCisjZGVmaW5lCSAgQzBfUkdCNV9SR0dCCSAgMHgwMDAwMDAwMAorI2RlZmluZQkgIEMwX1JHQjVfR1JCRwkgIDB4MDAwMDAwMDQKKyNkZWZpbmUJICBDMF9SR0I1X0dCUkcJICAweDAwMDAwMDA4CisjZGVmaW5lCSAgQzBfUkdCNV9CR0dSCSAgMHgwMDAwMDAwYworCisvKiBTcGVjIGhhcyB0d28gZmllbGRzIGZvciBESU4gYW5kIERPVVQsIGJ1dCB0aGV5IG11c3QgbWF0Y2gsIHNvCisgICBjb21iaW5lIHRoZW0gaGVyZS4gKi8KKyNkZWZpbmUJICBDMF9ERl9ZVVYJICAweDAwMDAwMDAwCS8qIERhdGEgaXMgWVVWCSAgICAqLworI2RlZmluZQkgIEMwX0RGX1JHQgkgIDB4MDAwMDAwYTAJLyogLi4uIFJHQgkJICAgICovCisjZGVmaW5lCSAgQzBfREZfQkFZRVIJICAweDAwMDAwMTQwCS8qIC4uLiBCYXllcgkJICAgICovCisvKiA4LTgtOCBtdXN0IGJlIG1pc3NpbmcgZnJvbSB0aGUgYmVsb3cgLSBhc2sgKi8KKyNkZWZpbmUJICBDMF9SR0JGXzU2NQkgIDB4MDAwMDAwMDAKKyNkZWZpbmUJICBDMF9SR0JGXzQ0NAkgIDB4MDAwMDA4MDAKKyNkZWZpbmUJICBDMF9SR0JfQkdSCSAgMHgwMDAwMTAwMAkvKiBCbHVlIGNvbWVzIGZpcnN0ICovCisjZGVmaW5lCSAgQzBfWVVWX1BMQU5BUgkgIDB4MDAwMDAwMDAJLyogWVVWIDQyMiBwbGFuYXIgZm9ybWF0ICovCisjZGVmaW5lCSAgQzBfWVVWX1BBQ0tFRAkgIDB4MDAwMDgwMDAJLyogWVVWIDQyMiBwYWNrZWQJKi8KKyNkZWZpbmUJICBDMF9ZVVZfNDIwUEwJICAweDAwMDBhMDAwCS8qIFlVViA0MjAgcGxhbmFyCSovCisvKiBUaGluayB0aGF0IDQyMCBwYWNrZWQgbXVzdCBiZSAxMTEgLSBhc2sgKi8KKyNkZWZpbmUJICBDMF9ZVVZFX1lVWVYJICAweDAwMDAwMDAwCS8qIFkxQ2JZMENyCQkqLworI2RlZmluZQkgIEMwX1lVVkVfWVZZVQkgIDB4MDAwMTAwMDAJLyogWTFDclkwQ2IJCSovCisjZGVmaW5lCSAgQzBfWVVWRV9WWVVZCSAgMHgwMDAyMDAwMAkvKiBDclkxQ2JZMAkJKi8KKyNkZWZpbmUJICBDMF9ZVVZFX1VZVlkJICAweDAwMDMwMDAwCS8qIENiWTFDclkwCQkqLworI2RlZmluZQkgIEMwX1lVVkVfWFlVVgkgIDB4MDAwMDAwMDAJLyogNDIwOiAuWVVWCQkqLworI2RlZmluZQkgIEMwX1lVVkVfWFlWVQkgIDB4MDAwMTAwMDAJLyogNDIwOiAuWVZVCQkqLworI2RlZmluZQkgIEMwX1lVVkVfWFVWWQkgIDB4MDAwMjAwMDAJLyogNDIwOiAuVVZZCQkqLworI2RlZmluZQkgIEMwX1lVVkVfWFZVWQkgIDB4MDAwMzAwMDAJLyogNDIwOiAuVlVZCQkqLworLyogQmF5ZXIgYml0cyAxOCwxOSBpZiBuZWVkZWQgKi8KKyNkZWZpbmUJICBDMF9IUE9MX0xPVwkgIDB4MDEwMDAwMDAJLyogSFNZTkMgcG9sYXJpdHkgYWN0aXZlIGxvdyAqLworI2RlZmluZQkgIEMwX1ZQT0xfTE9XCSAgMHgwMjAwMDAwMAkvKiBWU1lOQyBwb2xhcml0eSBhY3RpdmUgbG93ICovCisjZGVmaW5lCSAgQzBfVkNMS19MT1cJICAweDA0MDAwMDAwCS8qIFZDTEsgb24gZmFsbGluZyBlZGdlICovCisjZGVmaW5lCSAgQzBfRE9XTlNDQUxFCSAgMHgwODAwMDAwMAkvKiBFbmFibGUgZG93bnNjYWxlciAqLworI2RlZmluZQkgIEMwX1NJRk1fTUFTSwkgIDB4YzAwMDAwMDAJLyogU0lGIG1vZGUgYml0cyAqLworI2RlZmluZQkgIEMwX1NJRl9IVlNZTkMJICAweDAwMDAwMDAwCS8qIFVzZSBIL1ZTWU5DICovCisjZGVmaW5lCSAgQ09fU09GX05PU1lOQwkgIDB4NDAwMDAwMDAJLyogVXNlIGluYmFuZCBhY3RpdmUgc2lnbmFsaW5nICovCisKKy8qIEJpdHMgYmVsb3cgQzFfNDQ0QUxQSEEgYXJlIG5vdCBwcmVzZW50IGluIENhZmUgKi8KKyNkZWZpbmUgUkVHX0NUUkwxCTB4NDAJLyogQ29udHJvbCAxICovCisjZGVmaW5lCSAgQzFfQ0xLR0FURQkgIDB4MDAwMDAwMDEJLyogU2Vuc29yIGNsb2NrIGdhdGUgKi8KKyNkZWZpbmUgICBDMV9ERVNDX0VOQQkgIDB4MDAwMDAxMDAJLyogRE1BIGRlc2NyaXB0b3IgZW5hYmxlICovCisjZGVmaW5lICAgQzFfREVTQ18zV09SRCAgIDB4MDAwMDAyMDAJLyogVGhyZWUtd29yZCBkZXNjcmlwdG9ycyB1c2VkICovCisjZGVmaW5lCSAgQzFfNDQ0QUxQSEEJICAweDAwZjAwMDAwCS8qIEFscGhhIGZpZWxkIGluIFJHQjQ0NCAqLworI2RlZmluZQkgIEMxX0FMUEhBX1NIRlQJICAyMAorI2RlZmluZQkgIEMxX0RNQUIzMgkgIDB4MDAwMDAwMDAJLyogMzItYnl0ZSBETUEgYnVyc3QgKi8KKyNkZWZpbmUJICBDMV9ETUFCMTYJICAweDAyMDAwMDAwCS8qIDE2LWJ5dGUgRE1BIGJ1cnN0ICovCisjZGVmaW5lCSAgQzFfRE1BQjY0CSAgMHgwNDAwMDAwMAkvKiA2NC1ieXRlIERNQSBidXJzdCAqLworI2RlZmluZQkgIEMxX0RNQUJfTUFTSwkgIDB4MDYwMDAwMDAKKyNkZWZpbmUJICBDMV9UV09CVUZTCSAgMHgwODAwMDAwMAkvKiBVc2Ugb25seSB0d28gRE1BIGJ1ZmZlcnMgKi8KKyNkZWZpbmUJICBDMV9QV1JEV04JICAweDEwMDAwMDAwCS8qIFBvd2VyIGRvd24gKi8KKworI2RlZmluZSBSRUdfQ0xLQ1RSTAkweDg4CS8qIENsb2NrIGNvbnRyb2wgKi8KKyNkZWZpbmUJICBDTEtfRElWX01BU0sJICAweDAwMDBmZmZmCS8qIFVwcGVyIGJpdHMgUlcgInJlc2VydmVkIiAqLworCisvKiBUaGlzIGFwcGVhcnMgdG8gYmUgYSBDYWZlLW9ubHkgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUkVHX1VCQVIJMHhjNAkvKiBVcHBlciBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgKi8KKworLyogQXJtYWRhIDYxMCBETUEgZGVzY3JpcHRvciByZWdpc3RlcnMgKi8KKyNkZWZpbmUJUkVHX0RNQV9ERVNDX1kJMHgyMDAKKyNkZWZpbmUJUkVHX0RNQV9ERVNDX1UJMHgyMDQKKyNkZWZpbmUJUkVHX0RNQV9ERVNDX1YJMHgyMDgKKyNkZWZpbmUgUkVHX0RFU0NfTEVOX1kJMHgyMGMJLyogTGVuZ3RocyBhcmUgaW4gYnl0ZXMgKi8KKyNkZWZpbmUJUkVHX0RFU0NfTEVOX1UJMHgyMTAKKyNkZWZpbmUgUkVHX0RFU0NfTEVOX1YJMHgyMTQKKworLyoKKyAqIFVzZWZ1bCBzdHVmZiB0aGF0IHByb2JhYmx5IGJlbG9uZ3Mgc29tZXdoZXJlIGdsb2JhbC4KKyAqLworI2RlZmluZSBWR0FfV0lEVEgJNjQwCisjZGVmaW5lIFZHQV9IRUlHSFQJNDgwCisKKyNlbmRpZiAvKiBfTUNBTV9DT1JFX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWFydmVsbC1jY2ljL21tcC1kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWFydmVsbC1jY2ljL21tcC1kcml2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmI3NjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tYXJ2ZWxsLWNjaWMvbW1wLWRyaXZlci5jCkBAIC0wLDAgKzEsMzQwIEBACisvKgorICogU3VwcG9ydCBmb3IgdGhlIGNhbWVyYSBkZXZpY2UgZm91bmQgb24gTWFydmVsbCBNTVAgcHJvY2Vzc29yczsga25vd24KKyAqIHRvIHdvcmsgd2l0aCB0aGUgQXJtYWRhIDYxMCBhcyB1c2VkIGluIHRoZSBPTFBDIDEuNzUgc3lzdGVtLgorICoKKyAqIENvcHlyaWdodCAyMDExIEpvbmF0aGFuIENvcmJldCA8Y29yYmV0QGx3bi5uZXQ+CisgKgorICogVGhpcyBmaWxlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLWdwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY2hpcC1pZGVudC5oPgorI2luY2x1ZGUgPG1lZGlhL21tcC1jYW1lcmEuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKworI2luY2x1ZGUgIm1jYW0tY29yZS5oIgorCitNT0RVTEVfQVVUSE9SKCJKb25hdGhhbiBDb3JiZXQgPGNvcmJldEBsd24ubmV0PiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdHJ1Y3QgbW1wX2NhbWVyYSB7CisJdm9pZCAqcG93ZXJfcmVnczsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCXN0cnVjdCBtY2FtX2NhbWVyYSBtY2FtOworCXN0cnVjdCBsaXN0X2hlYWQgZGV2bGlzdDsKKwlpbnQgaXJxOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbW1wX2NhbWVyYSAqbWNhbV90b19jYW0oc3RydWN0IG1jYW1fY2FtZXJhICptY2FtKQoreworCXJldHVybiBjb250YWluZXJfb2YobWNhbSwgc3RydWN0IG1tcF9jYW1lcmEsIG1jYW0pOworfQorCisvKgorICogQSBzaWxseSBsaXR0bGUgaW5mcmFzdHJ1Y3R1cmUgc28gd2UgY2FuIGtlZXAgdHJhY2sgb2Ygb3VyIGRldmljZXMuCisgKiBDaGFuY2VzIGFyZSB0aGF0IHdlIHdpbGwgbmV2ZXIgaGF2ZSBtb3JlIHRoYW4gb25lIG9mIHRoZW0sIGJ1dAorICogdGhlIEFybWFkYSA2MTAgKmRvZXMqIGhhdmUgdHdvIGNvbnRyb2xsZXJzLi4uCisgKi8KKworc3RhdGljIExJU1RfSEVBRChtbXBjYW1fZGV2aWNlcyk7CitzdGF0aWMgc3RydWN0IG11dGV4IG1tcGNhbV9kZXZpY2VzX2xvY2s7CisKK3N0YXRpYyB2b2lkIG1tcGNhbV9hZGRfZGV2aWNlKHN0cnVjdCBtbXBfY2FtZXJhICpjYW0pCit7CisJbXV0ZXhfbG9jaygmbW1wY2FtX2RldmljZXNfbG9jayk7CisJbGlzdF9hZGQoJmNhbS0+ZGV2bGlzdCwgJm1tcGNhbV9kZXZpY2VzKTsKKwltdXRleF91bmxvY2soJm1tcGNhbV9kZXZpY2VzX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBtbXBjYW1fcmVtb3ZlX2RldmljZShzdHJ1Y3QgbW1wX2NhbWVyYSAqY2FtKQoreworCW11dGV4X2xvY2soJm1tcGNhbV9kZXZpY2VzX2xvY2spOworCWxpc3RfZGVsKCZjYW0tPmRldmxpc3QpOworCW11dGV4X3VubG9jaygmbW1wY2FtX2RldmljZXNfbG9jayk7Cit9CisKKy8qCisgKiBQbGF0Zm9ybSBkZXYgcmVtb3ZlIHBhc3NlcyB1cyBhIHBsYXRmb3JtX2RldmljZSwgYW5kIHRoZXJlJ3MKKyAqIG5vIGhhbmR5IHVudXNlZCBkcnZkYXRhIHRvIHN0YXNoIGEgYmFja3BvaW50ZXIgaW4uICBTbyBqdXN0CisgKiBkaWcgaXQgb3V0IG9mIG91ciBsaXN0LgorICovCitzdGF0aWMgc3RydWN0IG1tcF9jYW1lcmEgKm1tcGNhbV9maW5kX2RldmljZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtbXBfY2FtZXJhICpjYW07CisKKwltdXRleF9sb2NrKCZtbXBjYW1fZGV2aWNlc19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNhbSwgJm1tcGNhbV9kZXZpY2VzLCBkZXZsaXN0KSB7CisJCWlmIChjYW0tPnBkZXYgPT0gcGRldikgeworCQkJbXV0ZXhfdW5sb2NrKCZtbXBjYW1fZGV2aWNlc19sb2NrKTsKKwkJCXJldHVybiBjYW07CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZtbXBjYW1fZGV2aWNlc19sb2NrKTsKKwlyZXR1cm4gTlVMTDsKK30KKworCisKKworLyoKKyAqIFBvd2VyLXJlbGF0ZWQgcmVnaXN0ZXJzOyB0aGlzIGFsbW9zdCBjZXJ0YWlubHkgYmVsb25ncworICogc29tZXdoZXJlIGVsc2UuCisgKgorICogQVJNQURBIDYxMCByZWdpc3RlciBtYW51YWwsIHNlYyA3LjIuMSwgcDE4NDIuCisgKi8KKyNkZWZpbmUgQ1BVX1NVQlNZU19QTVVfQkFTRQkweGQ0MjgyODAwCisjZGVmaW5lIFJFR19DQ0lDX0RDR0NSCQkweDI4CS8qIENDSUMgZHluIGNsb2NrIGdhdGUgY3RybCByZWcgKi8KKyNkZWZpbmUgUkVHX0NDSUNfQ1JDUgkJMHg1MAkvKiBDQ0lDIGNsayByZXNldCBjdHJsIHJlZwkqLworCisvKgorICogUG93ZXIgY29udHJvbC4KKyAqLworc3RhdGljIHZvaWQgbW1wY2FtX3Bvd2VyX3VwKHN0cnVjdCBtY2FtX2NhbWVyYSAqbWNhbSkKK3sKKwlzdHJ1Y3QgbW1wX2NhbWVyYSAqY2FtID0gbWNhbV90b19jYW0obWNhbSk7CisJc3RydWN0IG1tcF9jYW1lcmFfcGxhdGZvcm1fZGF0YSAqcGRhdGE7CisvKgorICogVHVybiBvbiBwb3dlciBhbmQgY2xvY2tzIHRvIHRoZSBjb250cm9sbGVyLgorICovCisJaW93cml0ZTMyKDB4M2YsIGNhbS0+cG93ZXJfcmVncyArIFJFR19DQ0lDX0RDR0NSKTsKKwlpb3dyaXRlMzIoMHgzODA1YiwgY2FtLT5wb3dlcl9yZWdzICsgUkVHX0NDSUNfQ1JDUik7CisJbWRlbGF5KDEpOworLyoKKyAqIFByb3ZpZGUgcG93ZXIgdG8gdGhlIHNlbnNvci4KKyAqLworCW1jYW1fcmVnX3dyaXRlKG1jYW0sIFJFR19DTEtDVFJMLCAweDYwMDAwMDAyKTsKKwlwZGF0YSA9IGNhbS0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJZ3Bpb19zZXRfdmFsdWUocGRhdGEtPnNlbnNvcl9wb3dlcl9ncGlvLCAxKTsKKwltZGVsYXkoNSk7CisJbWNhbV9yZWdfY2xlYXJfYml0KG1jYW0sIFJFR19DVFJMMSwgMHgxMDAwMDAwMCk7CisJZ3Bpb19zZXRfdmFsdWUocGRhdGEtPnNlbnNvcl9yZXNldF9ncGlvLCAwKTsgLyogcmVzZXQgaXMgYWN0aXZlIGxvdyAqLworCW1kZWxheSg1KTsKKwlncGlvX3NldF92YWx1ZShwZGF0YS0+c2Vuc29yX3Jlc2V0X2dwaW8sIDEpOyAvKiByZXNldCBpcyBhY3RpdmUgbG93ICovCisJbWRlbGF5KDUpOworfQorCitzdGF0aWMgdm9pZCBtbXBjYW1fcG93ZXJfZG93bihzdHJ1Y3QgbWNhbV9jYW1lcmEgKm1jYW0pCit7CisJc3RydWN0IG1tcF9jYW1lcmEgKmNhbSA9IG1jYW1fdG9fY2FtKG1jYW0pOworCXN0cnVjdCBtbXBfY2FtZXJhX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworLyoKKyAqIFR1cm4gb2ZmIGNsb2NrcyBhbmQgc2V0IHJlc2V0IGxpbmVzCisgKi8KKwlpb3dyaXRlMzIoMCwgY2FtLT5wb3dlcl9yZWdzICsgUkVHX0NDSUNfRENHQ1IpOworCWlvd3JpdGUzMigwLCBjYW0tPnBvd2VyX3JlZ3MgKyBSRUdfQ0NJQ19DUkNSKTsKKy8qCisgKiBTaHV0IGRvd24gdGhlIHNlbnNvci4KKyAqLworCXBkYXRhID0gY2FtLT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlncGlvX3NldF92YWx1ZShwZGF0YS0+c2Vuc29yX3Bvd2VyX2dwaW8sIDApOworCWdwaW9fc2V0X3ZhbHVlKHBkYXRhLT5zZW5zb3JfcmVzZXRfZ3BpbywgMCk7Cit9CisKKworc3RhdGljIGlycXJldHVybl90IG1tcGNhbV9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbWNhbV9jYW1lcmEgKm1jYW0gPSBkYXRhOworCXVuc2lnbmVkIGludCBpcnFzLCBoYW5kbGVkOworCisJc3Bpbl9sb2NrKCZtY2FtLT5kZXZfbG9jayk7CisJaXJxcyA9IG1jYW1fcmVnX3JlYWQobWNhbSwgUkVHX0lSUVNUQVQpOworCWhhbmRsZWQgPSBtY2NpY19pcnEobWNhbSwgaXJxcyk7CisJc3Bpbl91bmxvY2soJm1jYW0tPmRldl9sb2NrKTsKKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworCitzdGF0aWMgaW50IG1tcGNhbV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtbXBfY2FtZXJhICpjYW07CisJc3RydWN0IG1jYW1fY2FtZXJhICptY2FtOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXN0cnVjdCBtbXBfY2FtZXJhX3BsYXRmb3JtX2RhdGEgKnBkYXRhOworCWludCByZXQ7CisKKwljYW0gPSBremFsbG9jKHNpemVvZigqY2FtKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNhbSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwljYW0tPnBkZXYgPSBwZGV2OworCUlOSVRfTElTVF9IRUFEKCZjYW0tPmRldmxpc3QpOworCisJbWNhbSA9ICZjYW0tPm1jYW07CisJbWNhbS0+cGxhdGZvcm0gPSBNSFBfQXJtYWRhNjEwOworCW1jYW0tPnBsYXRfcG93ZXJfdXAgPSBtbXBjYW1fcG93ZXJfdXA7CisJbWNhbS0+cGxhdF9wb3dlcl9kb3duID0gbW1wY2FtX3Bvd2VyX2Rvd247CisJbWNhbS0+ZGV2ID0gJnBkZXYtPmRldjsKKwltY2FtLT51c2Vfc21idXMgPSAwOworCW1jYW0tPmNoaXBfaWQgPSBWNEwyX0lERU5UX0FSTUFEQTYxMDsKKwltY2FtLT5idWZmZXJfbW9kZSA9IEJfRE1BX3NnOworCXNwaW5fbG9ja19pbml0KCZtY2FtLT5kZXZfbG9jayk7CisJLyoKKwkgKiBHZXQgb3VyIEkvTyBtZW1vcnkuCisJICovCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAocmVzID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gaW9tZW0gcmVzb3VyY2UhXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisJbWNhbS0+cmVncyA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlpZiAobWNhbS0+cmVncyA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk1NSU8gaW9yZW1hcCBmYWlsXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXRfZnJlZTsKKwl9CisJLyoKKwkgKiBQb3dlci9jbG9jayBtZW1vcnkgaXMgZWxzZXdoZXJlOyBnZXQgaXQgdG9vLiAgUGVyaGFwcyB0aGlzCisJICogc2hvdWxkIHJlYWxseSBiZSBtYW5hZ2VkIG91dHNpZGUgb2YgdGhpcyBkcml2ZXI/CisJICovCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKKwlpZiAocmVzID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAibm8gcG93ZXIgcmVzb3VyY2UhXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXRfdW5tYXAxOworCX0KKwljYW0tPnBvd2VyX3JlZ3MgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKGNhbS0+cG93ZXJfcmVncyA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgInBvd2VyIE1NSU8gaW9yZW1hcCBmYWlsXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBvdXRfdW5tYXAxOworCX0KKwkvKgorCSAqIEZpbmQgdGhlIGkyYyBhZGFwdGVyLiAgVGhpcyBhc3N1bWVzLCBvZiBjb3Vyc2UsIHRoYXQgdGhlCisJICogaTJjIGJ1cyBpcyBhbHJlYWR5IHVwIGFuZCBmdW5jdGlvbmluZy4KKwkgKi8KKwlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCW1jYW0tPmkyY19hZGFwdGVyID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRhdGEtPmkyY19kZXZpY2UpOworCWlmIChtY2FtLT5pMmNfYWRhcHRlciA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIGkyYyBhZGFwdGVyXG4iKTsKKwkJZ290byBvdXRfdW5tYXAyOworCX0KKwkvKgorCSAqIFNlbnNvciBHUElPIHBpbnMuCisJICovCisJcmV0ID0gZ3Bpb19yZXF1ZXN0KHBkYXRhLT5zZW5zb3JfcG93ZXJfZ3BpbywgImNhbS1wb3dlciIpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2FuJ3QgZ2V0IHNlbnNvciBwb3dlciBncGlvICVkIiwKKwkJCQlwZGF0YS0+c2Vuc29yX3Bvd2VyX2dwaW8pOworCQlnb3RvIG91dF91bm1hcDI7CisJfQorCWdwaW9fZGlyZWN0aW9uX291dHB1dChwZGF0YS0+c2Vuc29yX3Bvd2VyX2dwaW8sIDApOworCXJldCA9IGdwaW9fcmVxdWVzdChwZGF0YS0+c2Vuc29yX3Jlc2V0X2dwaW8sICJjYW0tcmVzZXQiKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbid0IGdldCBzZW5zb3IgcmVzZXQgZ3BpbyAlZCIsCisJCQkJcGRhdGEtPnNlbnNvcl9yZXNldF9ncGlvKTsKKwkJZ290byBvdXRfZ3BpbzsKKwl9CisJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KHBkYXRhLT5zZW5zb3JfcmVzZXRfZ3BpbywgMCk7CisJLyoKKwkgKiBQb3dlciB0aGUgZGV2aWNlIHVwIGFuZCBoYW5kIGl0IG9mZiB0byB0aGUgY29yZS4KKwkgKi8KKwltbXBjYW1fcG93ZXJfdXAobWNhbSk7CisJcmV0ID0gbWNjaWNfcmVnaXN0ZXIobWNhbSk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZ3BpbzI7CisJLyoKKwkgKiBGaW5hbGx5LCBzZXQgdXAgb3VyIElSUSBub3cgdGhhdCB0aGUgY29yZSBpcyByZWFkeSB0bworCSAqIGRlYWwgd2l0aCBpdC4KKwkgKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JUlEsIDApOworCWlmIChyZXMgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIG91dF91bnJlZ2lzdGVyOworCX0KKwljYW0tPmlycSA9IHJlcy0+c3RhcnQ7CisJcmV0ID0gcmVxdWVzdF9pcnEoY2FtLT5pcnEsIG1tcGNhbV9pcnEsIElSUUZfU0hBUkVELAorCQkJIm1tcC1jYW1lcmEiLCBtY2FtKTsKKwlpZiAocmV0ID09IDApIHsKKwkJbW1wY2FtX2FkZF9kZXZpY2UoY2FtKTsKKwkJcmV0dXJuIDA7CisJfQorCitvdXRfdW5yZWdpc3RlcjoKKwltY2NpY19zaHV0ZG93bihtY2FtKTsKK291dF9ncGlvMjoKKwltbXBjYW1fcG93ZXJfZG93bihtY2FtKTsKKwlncGlvX2ZyZWUocGRhdGEtPnNlbnNvcl9yZXNldF9ncGlvKTsKK291dF9ncGlvOgorCWdwaW9fZnJlZShwZGF0YS0+c2Vuc29yX3Bvd2VyX2dwaW8pOworb3V0X3VubWFwMjoKKwlpb3VubWFwKGNhbS0+cG93ZXJfcmVncyk7CitvdXRfdW5tYXAxOgorCWlvdW5tYXAobWNhbS0+cmVncyk7CitvdXRfZnJlZToKKwlrZnJlZShjYW0pOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBtbXBjYW1fcmVtb3ZlKHN0cnVjdCBtbXBfY2FtZXJhICpjYW0pCit7CisJc3RydWN0IG1jYW1fY2FtZXJhICptY2FtID0gJmNhbS0+bWNhbTsKKwlzdHJ1Y3QgbW1wX2NhbWVyYV9wbGF0Zm9ybV9kYXRhICpwZGF0YTsKKworCW1tcGNhbV9yZW1vdmVfZGV2aWNlKGNhbSk7CisJZnJlZV9pcnEoY2FtLT5pcnEsIG1jYW0pOworCW1jY2ljX3NodXRkb3duKG1jYW0pOworCW1tcGNhbV9wb3dlcl9kb3duKG1jYW0pOworCXBkYXRhID0gY2FtLT5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlncGlvX2ZyZWUocGRhdGEtPnNlbnNvcl9yZXNldF9ncGlvKTsKKwlncGlvX2ZyZWUocGRhdGEtPnNlbnNvcl9wb3dlcl9ncGlvKTsKKwlpb3VubWFwKGNhbS0+cG93ZXJfcmVncyk7CisJaW91bm1hcChtY2FtLT5yZWdzKTsKKwlrZnJlZShjYW0pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1tcGNhbV9wbGF0Zm9ybV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbW1wX2NhbWVyYSAqY2FtID0gbW1wY2FtX2ZpbmRfZGV2aWNlKHBkZXYpOworCisJaWYgKGNhbSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlyZXR1cm4gbW1wY2FtX3JlbW92ZShjYW0pOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1tcGNhbV9kcml2ZXIgPSB7CisJLnByb2JlCQk9IG1tcGNhbV9wcm9iZSwKKwkucmVtb3ZlCQk9IG1tcGNhbV9wbGF0Zm9ybV9yZW1vdmUsCisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAibW1wLWNhbWVyYSIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFCisJfQorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBtbXBjYW1faW5pdF9tb2R1bGUodm9pZCkKK3sKKwltdXRleF9pbml0KCZtbXBjYW1fZGV2aWNlc19sb2NrKTsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtbXBjYW1fZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG1tcGNhbV9leGl0X21vZHVsZSh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtbXBjYW1fZHJpdmVyKTsKKwkvKgorCSAqIHBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCkgc2hvdWxkIGhhdmUgZW1wdGllZCB0aGUgbGlzdAorCSAqLworCWlmICghbGlzdF9lbXB0eSgmbW1wY2FtX2RldmljZXMpKQorCQlwcmludGsoS0VSTl9FUlIgIm1tcF9jYW1lcmEgbGVhdmluZyBkZXZpY2VzIGJlaGluZFxuIik7Cit9CisKK21vZHVsZV9pbml0KG1tcGNhbV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChtbXBjYW1fZXhpdF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tZW0ybWVtX3Rlc3RkZXYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbWVtMm1lbV90ZXN0ZGV2LmMKaW5kZXggYjAzZDc0ZS4uMTY2YmY5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tZW0ybWVtX3Rlc3RkZXYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL21lbTJtZW1fdGVzdGRldi5jCkBAIC0xOSw3ICsxOSw2IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgpAQCAtMzUsNyArMzQsNyBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJWaXJ0dWFsIGRldmljZSBmb3IgbWVtMm1lbSBmcmFtZXdvcmsgdGVzdGluZyIpOwogTU9EVUxFX0FVVEhPUigiUGF3ZWwgT3NjaWFrLCA8cGF3ZWxAb3NjaWFrLmNvbT4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQorTU9EVUxFX1ZFUlNJT04oIjAuMS4xIik7CiAKICNkZWZpbmUgTUlOX1cgMzIKICNkZWZpbmUgTUlOX0ggMzIKQEAgLTM4MCw3ICszNzksNiBAQAogCXN0cm5jcHkoY2FwLT5kcml2ZXIsIE1FTTJNRU1fTkFNRSwgc2l6ZW9mKGNhcC0+ZHJpdmVyKSAtIDEpOwogCXN0cm5jcHkoY2FwLT5jYXJkLCBNRU0yTUVNX05BTUUsIHNpemVvZihjYXAtPmNhcmQpIC0gMSk7CiAJY2FwLT5idXNfaW5mb1swXSA9IDA7Ci0JY2FwLT52ZXJzaW9uID0gS0VSTkVMX1ZFUlNJT04oMCwgMSwgMCk7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwgVjRMMl9DQVBfVklERU9fT1VUUFVUCiAJCQkgIHwgVjRMMl9DQVBfU1RSRUFNSU5HOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OW0wMDEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5bTAwMS5jCmluZGV4IGUyYmJkOGMuLjRkYTljY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5bTAwMS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5bTAwMS5jCkBAIC02MDMsMTMgKzYwMyw5IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0OwogCi0JLyoKLQkgKiBXZSBtdXN0IGhhdmUgYSBwYXJlbnQgYnkgbm93LiBBbmQgaXQgY2Fubm90IGJlIGEgd3Jvbmcgb25lLgotCSAqIFNvIHRoaXMgZW50aXJlIHRlc3QgaXMgY29tcGxldGVseSByZWR1bmRhbnQuCi0JICovCi0JaWYgKCFpY2QtPmRldi5wYXJlbnQgfHwKLQkgICAgdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCktPm5yICE9IGljZC0+aWZhY2UpCi0JCXJldHVybiAtRU5PREVWOworCS8qIFdlIG11c3QgaGF2ZSBhIHBhcmVudCBieSBub3cuIEFuZCBpdCBjYW5ub3QgYmUgYSB3cm9uZyBvbmUuICovCisJQlVHX09OKCFpY2QtPnBhcmVudCB8fAorCSAgICAgICB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpLT5uciAhPSBpY2QtPmlmYWNlKTsKIAogCS8qIEVuYWJsZSB0aGUgY2hpcCAqLwogCWRhdGEgPSByZWdfd3JpdGUoY2xpZW50LCBNVDlNMDAxX0NISVBfRU5BQkxFLCAxKTsKQEAgLTY3NSw4ICs2NzEsOCBAQAogewogCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHRvX3NvY19jYW1lcmFfbGluayhpY2QpOwogCi0JZGV2X2RiZygmaWNkLT5kZXYsICJWaWRlbyByZW1vdmVkOiAlcCwgJXBcbiIsCi0JCWljZC0+ZGV2LnBhcmVudCwgaWNkLT52ZGV2KTsKKwlkZXZfZGJnKGljZC0+cGRldiwgIlZpZGVvIHJlbW92ZWQ6ICVwLCAlcFxuIiwKKwkJaWNkLT5wYXJlbnQsIGljZC0+dmRldik7CiAJaWYgKGljbC0+ZnJlZV9idXMpCiAJCWljbC0+ZnJlZV9idXMoaWNsKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5bTExMS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDltMTExLmMKaW5kZXggZWJlYmVkOS4uYTM1N2FhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDltMTExLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDltMTExLmMKQEAgLTYzLDYgKzYzLDEyIEBACiAjZGVmaW5lIE1UOU0xMTFfUkVTRVRfUkVTVEFSVF9GUkFNRQkoMSA8PCAxKQogI2RlZmluZSBNVDlNMTExX1JFU0VUX1JFU0VUX01PREUJKDEgPDwgMCkKIAorI2RlZmluZSBNVDlNMTExX1JNX0ZVTExfUE9XRVJfUkQJKDAgPDwgMTApCisjZGVmaW5lIE1UOU0xMTFfUk1fTE9XX1BPV0VSX1JECQkoMSA8PCAxMCkKKyNkZWZpbmUgTVQ5TTExMV9STV9DT0xfU0tJUF80WAkJKDEgPDwgNSkKKyNkZWZpbmUgTVQ5TTExMV9STV9ST1dfU0tJUF80WAkJKDEgPDwgNCkKKyNkZWZpbmUgTVQ5TTExMV9STV9DT0xfU0tJUF8yWAkJKDEgPDwgMykKKyNkZWZpbmUgTVQ5TTExMV9STV9ST1dfU0tJUF8yWAkJKDEgPDwgMikKICNkZWZpbmUgTVQ5TTExMV9STUJfTUlSUk9SX0NPTFMJCSgxIDw8IDEpCiAjZGVmaW5lIE1UOU0xMTFfUk1CX01JUlJPUl9ST1dTCQkoMSA8PCAwKQogI2RlZmluZSBNVDlNMTExX0NUWFRfQ1RSTF9SRVNUQVJUCSgxIDw8IDE1KQpAQCAtOTUsNyArMTAxLDggQEAKIAogI2RlZmluZSBNVDlNMTExX09QTU9ERV9BVVRPRVhQT19FTgkoMSA8PCAxNCkKICNkZWZpbmUgTVQ5TTExMV9PUE1PREVfQVVUT1dISVRFQkFMX0VOCSgxIDw8IDEpCi0KKyNkZWZpbmUgTVQ5TTExMV9PVVRGTVRfRkxJUF9CQVlFUl9DT0wJKDEgPDwgOSkKKyNkZWZpbmUgTVQ5TTExMV9PVVRGTVRfRkxJUF9CQVlFUl9ST1cJKDEgPDwgOCkKICNkZWZpbmUgTVQ5TTExMV9PVVRGTVRfUFJPQ0VTU0VEX0JBWUVSCSgxIDw8IDE0KQogI2RlZmluZSBNVDlNMTExX09VVEZNVF9CWVBBU1NfSUZQCSgxIDw8IDEwKQogI2RlZmluZSBNVDlNMTExX09VVEZNVF9JTlZfUElYX0NMT0NLCSgxIDw8IDkpCkBAIC0xMTAsOSArMTE3LDggQEAKICNkZWZpbmUgTVQ5TTExMV9PVVRGTVRfVFNUX1JBTVBfRlJBTUUJKDMgPDwgNCkKICNkZWZpbmUgTVQ5TTExMV9PVVRGTVRfU0hJRlRfM19VUAkoMSA8PCAzKQogI2RlZmluZSBNVDlNMTExX09VVEZNVF9BVkdfQ0hST01BCSgxIDw8IDIpCi0jZGVmaW5lIE1UOU0xMTFfT1VURk1UX1NXQVBfWUNiQ3JfQ19ZCSgxIDw8IDEpCi0jZGVmaW5lIE1UOU0xMTFfT1VURk1UX1NXQVBfUkdCX0VWRU4JKDEgPDwgMSkKLSNkZWZpbmUgTVQ5TTExMV9PVVRGTVRfU1dBUF9ZQ2JDcl9DYl9DcgkoMSA8PCAwKQorI2RlZmluZSBNVDlNMTExX09VVEZNVF9TV0FQX1lDYkNyX0NfWV9SR0JfRVZFTgkoMSA8PCAxKQorI2RlZmluZSBNVDlNMTExX09VVEZNVF9TV0FQX1lDYkNyX0NiX0NyX1JHQl9SX0IJKDEgPDwgMCkKIAogLyoKICAqIENhbWVyYSBjb250cm9sIHJlZ2lzdGVyIGFkZHJlc3NlcyAoMHgyMDAuLjB4MmZmIG5vdCBpbXBsZW1lbnRlZCkKQEAgLTEyMiw2ICsxMjgsOCBAQAogI2RlZmluZSByZWdfd3JpdGUocmVnLCB2YWwpIG10OW0xMTFfcmVnX3dyaXRlKGNsaWVudCwgTVQ5TTExMV8jI3JlZywgKHZhbCkpCiAjZGVmaW5lIHJlZ19zZXQocmVnLCB2YWwpIG10OW0xMTFfcmVnX3NldChjbGllbnQsIE1UOU0xMTFfIyNyZWcsICh2YWwpKQogI2RlZmluZSByZWdfY2xlYXIocmVnLCB2YWwpIG10OW0xMTFfcmVnX2NsZWFyKGNsaWVudCwgTVQ5TTExMV8jI3JlZywgKHZhbCkpCisjZGVmaW5lIHJlZ19tYXNrKHJlZywgdmFsLCBtYXNrKSBtdDltMTExX3JlZ19tYXNrKGNsaWVudCwgTVQ5TTExMV8jI3JlZywgXAorCQkodmFsKSwgKG1hc2spKQogCiAjZGVmaW5lIE1UOU0xMTFfTUlOX0RBUktfUk9XUwk4CiAjZGVmaW5lIE1UOU0xMTFfTUlOX0RBUktfQ09MUwkyNgpAQCAtMTUzLDcgKzE2MSwxMSBAQAogCXtWNEwyX01CVVNfRk1UX1VZVlk4XzJYOCwgVjRMMl9DT0xPUlNQQUNFX0pQRUd9LAogCXtWNEwyX01CVVNfRk1UX1ZZVVk4XzJYOCwgVjRMMl9DT0xPUlNQQUNFX0pQRUd9LAogCXtWNEwyX01CVVNfRk1UX1JHQjU1NV8yWDhfUEFESElfTEUsIFY0TDJfQ09MT1JTUEFDRV9TUkdCfSwKKwl7VjRMMl9NQlVTX0ZNVF9SR0I1NTVfMlg4X1BBREhJX0JFLCBWNEwyX0NPTE9SU1BBQ0VfU1JHQn0sCiAJe1Y0TDJfTUJVU19GTVRfUkdCNTY1XzJYOF9MRSwgVjRMMl9DT0xPUlNQQUNFX1NSR0J9LAorCXtWNEwyX01CVVNfRk1UX1JHQjU2NV8yWDhfQkUsIFY0TDJfQ09MT1JTUEFDRV9TUkdCfSwKKwl7VjRMMl9NQlVTX0ZNVF9CR1I1NjVfMlg4X0xFLCBWNEwyX0NPTE9SU1BBQ0VfU1JHQn0sCisJe1Y0TDJfTUJVU19GTVRfQkdSNTY1XzJYOF9CRSwgVjRMMl9DT0xPUlNQQUNFX1NSR0J9LAogCXtWNEwyX01CVVNfRk1UX1NCR0dSOF8xWDgsIFY0TDJfQ09MT1JTUEFDRV9TUkdCfSwKIAl7VjRMMl9NQlVTX0ZNVF9TQkdHUjEwXzJYOF9QQURISV9MRSwgVjRMMl9DT0xPUlNQQUNFX1NSR0J9LAogfTsKQEAgLTE2OSw2ICsxODEsOCBAQAogCQkJICogZnJvbSB2NGwyLWNoaXAtaWRlbnQuaCAqLwogCWVudW0gbXQ5bTExMV9jb250ZXh0IGNvbnRleHQ7CiAJc3RydWN0IHY0bDJfcmVjdCByZWN0OworCXN0cnVjdCBtdXRleCBwb3dlcl9sb2NrOyAvKiBsb2NrIHRvIHByb3RlY3QgcG93ZXJfY291bnQgKi8KKwlpbnQgcG93ZXJfY291bnQ7CiAJY29uc3Qgc3RydWN0IG10OW0xMTFfZGF0YWZtdCAqZm10OwogCXVuc2lnbmVkIGludCBnYWluOwogCXVuc2lnbmVkIGNoYXIgYXV0b2V4cG9zdXJlOwpAQCAtMTc2LDEwICsxOTAsNiBAQAogCXVuc2lnbmVkIGludCBwb3dlcmVkOjE7CiAJdW5zaWduZWQgaW50IGhmbGlwOjE7CiAJdW5zaWduZWQgaW50IHZmbGlwOjE7Ci0JdW5zaWduZWQgaW50IHN3YXBfcmdiX2V2ZW5fb2RkOjE7Ci0JdW5zaWduZWQgaW50IHN3YXBfcmdiX3JlZF9ibHVlOjE7Ci0JdW5zaWduZWQgaW50IHN3YXBfeXV2X3lfY2hyb21hczoxOwotCXVuc2lnbmVkIGludCBzd2FwX3l1dl9jYl9jcjoxOwogCXVuc2lnbmVkIGludCBhdXRvd2hpdGViYWxhbmNlOjE7CiB9OwogCkBAIC0yNDgsMTIgKzI1OCwyNiBAQAogCWludCByZXQ7CiAKIAlyZXQgPSBtdDltMTExX3JlZ19yZWFkKGNsaWVudCwgcmVnKTsKLQlyZXR1cm4gbXQ5bTExMV9yZWdfd3JpdGUoY2xpZW50LCByZWcsIHJldCAmIH5kYXRhKTsKKwlpZiAocmV0ID49IDApCisJCXJldCA9IG10OW0xMTFfcmVnX3dyaXRlKGNsaWVudCwgcmVnLCByZXQgJiB+ZGF0YSk7CisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBtdDltMTExX3NldF9jb250ZXh0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCitzdGF0aWMgaW50IG10OW0xMTFfcmVnX21hc2soc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgY29uc3QgdTE2IHJlZywKKwkJCSAgICBjb25zdCB1MTYgZGF0YSwgY29uc3QgdTE2IG1hc2spCit7CisJaW50IHJldDsKKworCXJldCA9IG10OW0xMTFfcmVnX3JlYWQoY2xpZW50LCByZWcpOworCWlmIChyZXQgPj0gMCkKKwkJcmV0ID0gbXQ5bTExMV9yZWdfd3JpdGUoY2xpZW50LCByZWcsIChyZXQgJiB+bWFzaykgfCBkYXRhKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG10OW0xMTFfc2V0X2NvbnRleHQoc3RydWN0IG10OW0xMTEgKm10OW0xMTEsCiAJCQkgICAgICAgZW51bSBtdDltMTExX2NvbnRleHQgY3R4dCkKIHsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmbXQ5bTExMS0+c3ViZGV2KTsKIAlpbnQgdmFsQiA9IE1UOU0xMTFfQ1RYVF9DVFJMX1JFU1RBUlQgfCBNVDlNMTExX0NUWFRfQ1RSTF9ERUZFQ1RDT1JfQgogCQl8IE1UOU0xMTFfQ1RYVF9DVFJMX1JFU0laRV9CIHwgTVQ5TTExMV9DVFhUX0NUUkxfQ1RSTDJfQgogCQl8IE1UOU0xMTFfQ1RYVF9DVFJMX0dBTU1BX0IgfCBNVDlNMTExX0NUWFRfQ1RSTF9SRUFEX01PREVfQgpAQCAtMjY3LDEwICsyOTEsMTAgQEAKIAkJcmV0dXJuIHJlZ193cml0ZShDT05URVhUX0NPTlRST0wsIHZhbEEpOwogfQogCi1zdGF0aWMgaW50IG10OW0xMTFfc2V0dXBfcmVjdChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorc3RhdGljIGludCBtdDltMTExX3NldHVwX3JlY3Qoc3RydWN0IG10OW0xMTEgKm10OW0xMTEsCiAJCQkgICAgICBzdHJ1Y3QgdjRsMl9yZWN0ICpyZWN0KQogewotCXN0cnVjdCBtdDltMTExICptdDltMTExID0gdG9fbXQ5bTExMShjbGllbnQpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZtdDltMTExLT5zdWJkZXYpOwogCWludCByZXQsIGlzX3Jhd19mb3JtYXQ7CiAJaW50IHdpZHRoID0gcmVjdC0+d2lkdGg7CiAJaW50IGhlaWdodCA9IHJlY3QtPmhlaWdodDsKQEAgLTMxMiw4MSArMzM2LDkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IG10OW0xMTFfc2V0dXBfcGl4Zm10KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUxNiBvdXRmbXQpCitzdGF0aWMgaW50IG10OW0xMTFfZW5hYmxlKHN0cnVjdCBtdDltMTExICptdDltMTExKQogewotCWludCByZXQ7Ci0JdTE2IG1hc2sgPSBNVDlNMTExX09VVEZNVF9QUk9DRVNTRURfQkFZRVIgfCBNVDlNMTExX09VVEZNVF9SR0IgfAotCQlNVDlNMTExX09VVEZNVF9CWVBBU1NfSUZQIHwgTVQ5TTExMV9PVVRGTVRfU1dBUF9SR0JfRVZFTiB8Ci0JCU1UOU0xMTFfT1VURk1UX1JHQjU2NSB8IE1UOU0xMTFfT1VURk1UX1JHQjU1NSB8Ci0JCU1UOU0xMTFfT1VURk1UX1NXQVBfWUNiQ3JfQ2JfQ3IgfAotCQlNVDlNMTExX09VVEZNVF9TV0FQX1lDYkNyX0NfWTsKLQotCXJldCA9IHJlZ19yZWFkKE9VVFBVVF9GT1JNQVRfQ1RSTDJfQSk7Ci0JaWYgKHJldCA+PSAwKQotCQlyZXQgPSByZWdfd3JpdGUoT1VUUFVUX0ZPUk1BVF9DVFJMMl9BLCAocmV0ICYgfm1hc2spIHwgb3V0Zm10KTsKLQlpZiAoIXJldCkKLQkJcmV0ID0gcmVnX3JlYWQoT1VUUFVUX0ZPUk1BVF9DVFJMMl9CKTsKLQlpZiAocmV0ID49IDApCi0JCXJldCA9IHJlZ193cml0ZShPVVRQVVRfRk9STUFUX0NUUkwyX0IsIChyZXQgJiB+bWFzaykgfCBvdXRmbXQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBtdDltMTExX3NldGZtdF9iYXllcjgoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlyZXR1cm4gbXQ5bTExMV9zZXR1cF9waXhmbXQoY2xpZW50LCBNVDlNMTExX09VVEZNVF9QUk9DRVNTRURfQkFZRVIgfAotCQkJCSAgICBNVDlNMTExX09VVEZNVF9SR0IpOwotfQotCi1zdGF0aWMgaW50IG10OW0xMTFfc2V0Zm10X2JheWVyMTAoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlyZXR1cm4gbXQ5bTExMV9zZXR1cF9waXhmbXQoY2xpZW50LCBNVDlNMTExX09VVEZNVF9CWVBBU1NfSUZQKTsKLX0KLQotc3RhdGljIGludCBtdDltMTExX3NldGZtdF9yZ2I1NjUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IHRvX210OW0xMTEoY2xpZW50KTsKLQlpbnQgdmFsID0gMDsKLQotCWlmIChtdDltMTExLT5zd2FwX3JnYl9yZWRfYmx1ZSkKLQkJdmFsIHw9IE1UOU0xMTFfT1VURk1UX1NXQVBfWUNiQ3JfQ2JfQ3I7Ci0JaWYgKG10OW0xMTEtPnN3YXBfcmdiX2V2ZW5fb2RkKQotCQl2YWwgfD0gTVQ5TTExMV9PVVRGTVRfU1dBUF9SR0JfRVZFTjsKLQl2YWwgfD0gTVQ5TTExMV9PVVRGTVRfUkdCIHwgTVQ5TTExMV9PVVRGTVRfUkdCNTY1OwotCi0JcmV0dXJuIG10OW0xMTFfc2V0dXBfcGl4Zm10KGNsaWVudCwgdmFsKTsKLX0KLQotc3RhdGljIGludCBtdDltMTExX3NldGZtdF9yZ2I1NTUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IHRvX210OW0xMTEoY2xpZW50KTsKLQlpbnQgdmFsID0gMDsKLQotCWlmIChtdDltMTExLT5zd2FwX3JnYl9yZWRfYmx1ZSkKLQkJdmFsIHw9IE1UOU0xMTFfT1VURk1UX1NXQVBfWUNiQ3JfQ2JfQ3I7Ci0JaWYgKG10OW0xMTEtPnN3YXBfcmdiX2V2ZW5fb2RkKQotCQl2YWwgfD0gTVQ5TTExMV9PVVRGTVRfU1dBUF9SR0JfRVZFTjsKLQl2YWwgfD0gTVQ5TTExMV9PVVRGTVRfUkdCIHwgTVQ5TTExMV9PVVRGTVRfUkdCNTU1OwotCi0JcmV0dXJuIG10OW0xMTFfc2V0dXBfcGl4Zm10KGNsaWVudCwgdmFsKTsKLX0KLQotc3RhdGljIGludCBtdDltMTExX3NldGZtdF95dXYoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKLXsKLQlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IHRvX210OW0xMTEoY2xpZW50KTsKLQlpbnQgdmFsID0gMDsKLQotCWlmIChtdDltMTExLT5zd2FwX3l1dl9jYl9jcikKLQkJdmFsIHw9IE1UOU0xMTFfT1VURk1UX1NXQVBfWUNiQ3JfQ2JfQ3I7Ci0JaWYgKG10OW0xMTEtPnN3YXBfeXV2X3lfY2hyb21hcykKLQkJdmFsIHw9IE1UOU0xMTFfT1VURk1UX1NXQVBfWUNiQ3JfQ19ZOwotCi0JcmV0dXJuIG10OW0xMTFfc2V0dXBfcGl4Zm10KGNsaWVudCwgdmFsKTsKLX0KLQotc3RhdGljIGludCBtdDltMTExX2VuYWJsZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQotewotCXN0cnVjdCBtdDltMTExICptdDltMTExID0gdG9fbXQ5bTExMShjbGllbnQpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZtdDltMTExLT5zdWJkZXYpOwogCWludCByZXQ7CiAKIAlyZXQgPSByZWdfc2V0KFJFU0VULCBNVDlNMTExX1JFU0VUX0NISVBfRU5BQkxFKTsKQEAgLTM5NSw4ICszNDcsOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgbXQ5bTExMV9yZXNldChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIGludCBtdDltMTExX3Jlc2V0KHN0cnVjdCBtdDltMTExICptdDltMTExKQogeworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZtdDltMTExLT5zdWJkZXYpOwogCWludCByZXQ7CiAKIAlyZXQgPSByZWdfc2V0KFJFU0VULCBNVDlNMTExX1JFU0VUX1JFU0VUX01PREUpOwpAQCAtNDI0LDExICszNzcsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IG10OW0xMTFfbWFrZV9yZWN0KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCitzdGF0aWMgaW50IG10OW0xMTFfbWFrZV9yZWN0KHN0cnVjdCBtdDltMTExICptdDltMTExLAogCQkJICAgICBzdHJ1Y3QgdjRsMl9yZWN0ICpyZWN0KQogewotCXN0cnVjdCBtdDltMTExICptdDltMTExID0gdG9fbXQ5bTExMShjbGllbnQpOwotCiAJaWYgKG10OW0xMTEtPmZtdC0+Y29kZSA9PSBWNEwyX01CVVNfRk1UX1NCR0dSOF8xWDggfHwKIAkgICAgbXQ5bTExMS0+Zm10LT5jb2RlID09IFY0TDJfTUJVU19GTVRfU0JHR1IxMF8yWDhfUEFESElfTEUpIHsKIAkJLyogQmF5ZXIgZm9ybWF0IC0gZXZlbiBzaXplIGxlbmd0aHMgKi8KQEAgLTQ0NCwxNCArMzk1LDE0IEBACiAJc29jX2NhbWVyYV9saW1pdF9zaWRlKCZyZWN0LT50b3AsICZyZWN0LT5oZWlnaHQsCiAJCSAgICAgTVQ5TTExMV9NSU5fREFSS19ST1dTLCAyLCBNVDlNMTExX01BWF9IRUlHSFQpOwogCi0JcmV0dXJuIG10OW0xMTFfc2V0dXBfcmVjdChjbGllbnQsIHJlY3QpOworCXJldHVybiBtdDltMTExX3NldHVwX3JlY3QobXQ5bTExMSwgcmVjdCk7CiB9CiAKIHN0YXRpYyBpbnQgbXQ5bTExMV9zX2Nyb3Aoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY3JvcCAqYSkKIHsKIAlzdHJ1Y3QgdjRsMl9yZWN0IHJlY3QgPSBhLT5jOwogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IHRvX210OW0xMTEoY2xpZW50KTsKKwlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IG10OW0xMTEsIHN1YmRldik7CiAJaW50IHJldDsKIAogCWRldl9kYmcoJmNsaWVudC0+ZGV2LCAiJXMgbGVmdD0lZCwgdG9wPSVkLCB3aWR0aD0lZCwgaGVpZ2h0PSVkXG4iLApAQCAtNDYwLDcgKzQxMSw3IEBACiAJaWYgKGEtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldCA9IG10OW0xMTFfbWFrZV9yZWN0KGNsaWVudCwgJnJlY3QpOworCXJldCA9IG10OW0xMTFfbWFrZV9yZWN0KG10OW0xMTEsICZyZWN0KTsKIAlpZiAoIXJldCkKIAkJbXQ5bTExMS0+cmVjdCA9IHJlY3Q7CiAJcmV0dXJuIHJldDsKQEAgLTQ2OCw4ICs0MTksNyBAQAogCiBzdGF0aWMgaW50IG10OW0xMTFfZ19jcm9wKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2Nyb3AgKmEpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwotCXN0cnVjdCBtdDltMTExICptdDltMTExID0gdG9fbXQ5bTExMShjbGllbnQpOworCXN0cnVjdCBtdDltMTExICptdDltMTExID0gY29udGFpbmVyX29mKHNkLCBzdHJ1Y3QgbXQ5bTExMSwgc3ViZGV2KTsKIAogCWEtPmMJPSBtdDltMTExLT5yZWN0OwogCWEtPnR5cGUJPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CkBAIC00OTYsOCArNDQ2LDcgQEAKIHN0YXRpYyBpbnQgbXQ5bTExMV9nX2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAogCQkJIHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mKQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IHRvX210OW0xMTEoY2xpZW50KTsKKwlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IG10OW0xMTEsIHN1YmRldik7CiAKIAltZi0+d2lkdGgJPSBtdDltMTExLT5yZWN0LndpZHRoOwogCW1mLT5oZWlnaHQJPSBtdDltMTExLT5yZWN0LmhlaWdodDsKQEAgLTUwOCw1MSArNDU3LDczIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbXQ5bTExMV9zZXRfcGl4Zm10KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCitzdGF0aWMgaW50IG10OW0xMTFfc2V0X3BpeGZtdChzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSwKIAkJCSAgICAgIGVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBjb2RlKQogewotCXN0cnVjdCBtdDltMTExICptdDltMTExID0gdG9fbXQ5bTExMShjbGllbnQpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZtdDltMTExLT5zdWJkZXYpOworCXUxNiBkYXRhX291dGZtdDIsIG1hc2tfb3V0Zm10MiA9IE1UOU0xMTFfT1VURk1UX1BST0NFU1NFRF9CQVlFUiB8CisJCU1UOU0xMTFfT1VURk1UX0JZUEFTU19JRlAgfCBNVDlNMTExX09VVEZNVF9SR0IgfAorCQlNVDlNMTExX09VVEZNVF9SR0I1NjUgfCBNVDlNMTExX09VVEZNVF9SR0I1NTUgfAorCQlNVDlNMTExX09VVEZNVF9SR0I0NDR4IHwgTVQ5TTExMV9PVVRGTVRfUkdCeDQ0NCB8CisJCU1UOU0xMTFfT1VURk1UX1NXQVBfWUNiQ3JfQ19ZX1JHQl9FVkVOIHwKKwkJTVQ5TTExMV9PVVRGTVRfU1dBUF9ZQ2JDcl9DYl9Dcl9SR0JfUl9COwogCWludCByZXQ7CiAKIAlzd2l0Y2ggKGNvZGUpIHsKIAljYXNlIFY0TDJfTUJVU19GTVRfU0JHR1I4XzFYODoKLQkJcmV0ID0gbXQ5bTExMV9zZXRmbXRfYmF5ZXI4KGNsaWVudCk7CisJCWRhdGFfb3V0Zm10MiA9IE1UOU0xMTFfT1VURk1UX1BST0NFU1NFRF9CQVlFUiB8CisJCQlNVDlNMTExX09VVEZNVF9SR0I7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9NQlVTX0ZNVF9TQkdHUjEwXzJYOF9QQURISV9MRToKLQkJcmV0ID0gbXQ5bTExMV9zZXRmbXRfYmF5ZXIxMChjbGllbnQpOworCQlkYXRhX291dGZtdDIgPSBNVDlNMTExX09VVEZNVF9CWVBBU1NfSUZQIHwgTVQ5TTExMV9PVVRGTVRfUkdCOwogCQlicmVhazsKIAljYXNlIFY0TDJfTUJVU19GTVRfUkdCNTU1XzJYOF9QQURISV9MRToKLQkJcmV0ID0gbXQ5bTExMV9zZXRmbXRfcmdiNTU1KGNsaWVudCk7CisJCWRhdGFfb3V0Zm10MiA9IE1UOU0xMTFfT1VURk1UX1JHQiB8IE1UOU0xMTFfT1VURk1UX1JHQjU1NSB8CisJCQlNVDlNMTExX09VVEZNVF9TV0FQX1lDYkNyX0NfWV9SR0JfRVZFTjsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX01CVVNfRk1UX1JHQjU1NV8yWDhfUEFESElfQkU6CisJCWRhdGFfb3V0Zm10MiA9IE1UOU0xMTFfT1VURk1UX1JHQiB8IE1UOU0xMTFfT1VURk1UX1JHQjU1NTsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX01CVVNfRk1UX1JHQjU2NV8yWDhfTEU6Ci0JCXJldCA9IG10OW0xMTFfc2V0Zm10X3JnYjU2NShjbGllbnQpOworCQlkYXRhX291dGZtdDIgPSBNVDlNMTExX09VVEZNVF9SR0IgfCBNVDlNMTExX09VVEZNVF9SR0I1NjUgfAorCQkJTVQ5TTExMV9PVVRGTVRfU1dBUF9ZQ2JDcl9DX1lfUkdCX0VWRU47CisJCWJyZWFrOworCWNhc2UgVjRMMl9NQlVTX0ZNVF9SR0I1NjVfMlg4X0JFOgorCQlkYXRhX291dGZtdDIgPSBNVDlNMTExX09VVEZNVF9SR0IgfCBNVDlNMTExX09VVEZNVF9SR0I1NjU7CisJCWJyZWFrOworCWNhc2UgVjRMMl9NQlVTX0ZNVF9CR1I1NjVfMlg4X0JFOgorCQlkYXRhX291dGZtdDIgPSBNVDlNMTExX09VVEZNVF9SR0IgfCBNVDlNMTExX09VVEZNVF9SR0I1NjUgfAorCQkJTVQ5TTExMV9PVVRGTVRfU1dBUF9ZQ2JDcl9DYl9Dcl9SR0JfUl9COworCQlicmVhazsKKwljYXNlIFY0TDJfTUJVU19GTVRfQkdSNTY1XzJYOF9MRToKKwkJZGF0YV9vdXRmbXQyID0gTVQ5TTExMV9PVVRGTVRfUkdCIHwgTVQ5TTExMV9PVVRGTVRfUkdCNTY1IHwKKwkJCU1UOU0xMTFfT1VURk1UX1NXQVBfWUNiQ3JfQ19ZX1JHQl9FVkVOIHwKKwkJCU1UOU0xMTFfT1VURk1UX1NXQVBfWUNiQ3JfQ2JfQ3JfUkdCX1JfQjsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX01CVVNfRk1UX1VZVlk4XzJYODoKLQkJbXQ5bTExMS0+c3dhcF95dXZfeV9jaHJvbWFzID0gMDsKLQkJbXQ5bTExMS0+c3dhcF95dXZfY2JfY3IgPSAwOwotCQlyZXQgPSBtdDltMTExX3NldGZtdF95dXYoY2xpZW50KTsKKwkJZGF0YV9vdXRmbXQyID0gMDsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX01CVVNfRk1UX1ZZVVk4XzJYODoKLQkJbXQ5bTExMS0+c3dhcF95dXZfeV9jaHJvbWFzID0gMDsKLQkJbXQ5bTExMS0+c3dhcF95dXZfY2JfY3IgPSAxOwotCQlyZXQgPSBtdDltMTExX3NldGZtdF95dXYoY2xpZW50KTsKKwkJZGF0YV9vdXRmbXQyID0gTVQ5TTExMV9PVVRGTVRfU1dBUF9ZQ2JDcl9DYl9Dcl9SR0JfUl9COwogCQlicmVhazsKIAljYXNlIFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4OgotCQltdDltMTExLT5zd2FwX3l1dl95X2Nocm9tYXMgPSAxOwotCQltdDltMTExLT5zd2FwX3l1dl9jYl9jciA9IDA7Ci0JCXJldCA9IG10OW0xMTFfc2V0Zm10X3l1dihjbGllbnQpOworCQlkYXRhX291dGZtdDIgPSBNVDlNMTExX09VVEZNVF9TV0FQX1lDYkNyX0NfWV9SR0JfRVZFTjsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX01CVVNfRk1UX1lWWVU4XzJYODoKLQkJbXQ5bTExMS0+c3dhcF95dXZfeV9jaHJvbWFzID0gMTsKLQkJbXQ5bTExMS0+c3dhcF95dXZfY2JfY3IgPSAxOwotCQlyZXQgPSBtdDltMTExX3NldGZtdF95dXYoY2xpZW50KTsKKwkJZGF0YV9vdXRmbXQyID0gTVQ5TTExMV9PVVRGTVRfU1dBUF9ZQ2JDcl9DX1lfUkdCX0VWRU4gfAorCQkJTVQ5TTExMV9PVVRGTVRfU1dBUF9ZQ2JDcl9DYl9Dcl9SR0JfUl9COwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIlBpeGVsIGZvcm1hdCBub3QgaGFuZGxlZCA6ICV4XG4iLAotCQkJY29kZSk7Ci0JCXJldCA9IC1FSU5WQUw7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiUGl4ZWwgZm9ybWF0IG5vdCBoYW5kbGVkOiAleFxuIiwgY29kZSk7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCXJldCA9IHJlZ19tYXNrKE9VVFBVVF9GT1JNQVRfQ1RSTDJfQSwgZGF0YV9vdXRmbXQyLAorCQkgICAgICAgbWFza19vdXRmbXQyKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmVnX21hc2soT1VUUFVUX0ZPUk1BVF9DVFJMMl9CLCBkYXRhX291dGZtdDIsCisJCQkgICAgICAgbWFza19vdXRmbXQyKTsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTU2MSw3ICs1MzIsNyBAQAogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKIAljb25zdCBzdHJ1Y3QgbXQ5bTExMV9kYXRhZm10ICpmbXQ7Ci0Jc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSB0b19tdDltMTExKGNsaWVudCk7CisJc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCBtdDltMTExLCBzdWJkZXYpOwogCXN0cnVjdCB2NGwyX3JlY3QgcmVjdCA9IHsKIAkJLmxlZnQJPSBtdDltMTExLT5yZWN0LmxlZnQsCiAJCS50b3AJPSBtdDltMTExLT5yZWN0LnRvcCwKQEAgLTU3OSw5ICs1NTAsOSBAQAogCQkiJXMgY29kZT0leCBsZWZ0PSVkLCB0b3A9JWQsIHdpZHRoPSVkLCBoZWlnaHQ9JWRcbiIsIF9fZnVuY19fLAogCQltZi0+Y29kZSwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQpOwogCi0JcmV0ID0gbXQ5bTExMV9tYWtlX3JlY3QoY2xpZW50LCAmcmVjdCk7CisJcmV0ID0gbXQ5bTExMV9tYWtlX3JlY3QobXQ5bTExMSwgJnJlY3QpOwogCWlmICghcmV0KQotCQlyZXQgPSBtdDltMTExX3NldF9waXhmbXQoY2xpZW50LCBtZi0+Y29kZSk7CisJCXJldCA9IG10OW0xMTFfc2V0X3BpeGZtdChtdDltMTExLCBtZi0+Y29kZSk7CiAJaWYgKCFyZXQpIHsKIAkJbXQ5bTExMS0+cmVjdAk9IHJlY3Q7CiAJCW10OW0xMTEtPmZtdAk9IGZtdDsKQEAgLTU5NCw4ICs1NjUsNyBAQAogc3RhdGljIGludCBtdDltMTExX3RyeV9mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKIAkJCSAgIHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mKQogewotCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKLQlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IHRvX210OW0xMTEoY2xpZW50KTsKKwlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IG10OW0xMTEsIHN1YmRldik7CiAJY29uc3Qgc3RydWN0IG10OW0xMTFfZGF0YWZtdCAqZm10OwogCWJvb2wgYmF5ZXIgPSBtZi0+Y29kZSA9PSBWNEwyX01CVVNfRk1UX1NCR0dSOF8xWDggfHwKIAkJbWYtPmNvZGUgPT0gVjRMMl9NQlVTX0ZNVF9TQkdHUjEwXzJYOF9QQURISV9MRTsKQEAgLTYzNSw3ICs2MDUsNyBAQAogCQkJCXN0cnVjdCB2NGwyX2RiZ19jaGlwX2lkZW50ICppZCkKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0Jc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSB0b19tdDltMTExKGNsaWVudCk7CisJc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCBtdDltMTExLCBzdWJkZXYpOwogCiAJaWYgKGlkLT5tYXRjaC50eXBlICE9IFY0TDJfQ0hJUF9NQVRDSF9JMkNfQUREUikKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC03MjYsMjEgKzY5NiwxNiBAQAogCX0KIH07CiAKLXN0YXRpYyBpbnQgbXQ5bTExMV9yZXN1bWUoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpOwotc3RhdGljIGludCBtdDltMTExX3N1c3BlbmQoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7Ci0KIHN0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9vcHMgbXQ5bTExMV9vcHMgPSB7Ci0JLnN1c3BlbmQJCT0gbXQ5bTExMV9zdXNwZW5kLAotCS5yZXN1bWUJCQk9IG10OW0xMTFfcmVzdW1lLAogCS5xdWVyeV9idXNfcGFyYW0JPSBtdDltMTExX3F1ZXJ5X2J1c19wYXJhbSwKIAkuc2V0X2J1c19wYXJhbQkJPSBtdDltMTExX3NldF9idXNfcGFyYW0sCiAJLmNvbnRyb2xzCQk9IG10OW0xMTFfY29udHJvbHMsCiAJLm51bV9jb250cm9scwkJPSBBUlJBWV9TSVpFKG10OW0xMTFfY29udHJvbHMpLAogfTsKIAotc3RhdGljIGludCBtdDltMTExX3NldF9mbGlwKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBmbGlwLCBpbnQgbWFzaykKK3N0YXRpYyBpbnQgbXQ5bTExMV9zZXRfZmxpcChzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSwgaW50IGZsaXAsIGludCBtYXNrKQogewotCXN0cnVjdCBtdDltMTExICptdDltMTExID0gdG9fbXQ5bTExMShjbGllbnQpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZtdDltMTExLT5zdWJkZXYpOwogCWludCByZXQ7CiAKIAlpZiAobXQ5bTExMS0+Y29udGV4dCA9PSBISUdIUE9XRVIpIHsKQEAgLTc1OCw4ICs3MjMsOSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgbXQ5bTExMV9nZXRfZ2xvYmFsX2dhaW4oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3N0YXRpYyBpbnQgbXQ5bTExMV9nZXRfZ2xvYmFsX2dhaW4oc3RydWN0IG10OW0xMTEgKm10OW0xMTEpCiB7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJm10OW0xMTEtPnN1YmRldik7CiAJaW50IGRhdGE7CiAKIAlkYXRhID0gcmVnX3JlYWQoR0xPQkFMX0dBSU4pOwpAQCAtNzY5LDkgKzczNSw5IEBACiAJcmV0dXJuIGRhdGE7CiB9CiAKLXN0YXRpYyBpbnQgbXQ5bTExMV9zZXRfZ2xvYmFsX2dhaW4oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IGdhaW4pCitzdGF0aWMgaW50IG10OW0xMTFfc2V0X2dsb2JhbF9nYWluKHN0cnVjdCBtdDltMTExICptdDltMTExLCBpbnQgZ2FpbikKIHsKLQlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IHRvX210OW0xMTEoY2xpZW50KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmbXQ5bTExMS0+c3ViZGV2KTsKIAl1MTYgdmFsOwogCiAJaWYgKGdhaW4gPiA2MyAqIDIgKiAyKQpAQCAtNzg4LDkgKzc1NCw5IEBACiAJcmV0dXJuIHJlZ193cml0ZShHTE9CQUxfR0FJTiwgdmFsKTsKIH0KIAotc3RhdGljIGludCBtdDltMTExX3NldF9hdXRvZXhwb3N1cmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgaW50IG9uKQorc3RhdGljIGludCBtdDltMTExX3NldF9hdXRvZXhwb3N1cmUoc3RydWN0IG10OW0xMTEgKm10OW0xMTEsIGludCBvbikKIHsKLQlzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSA9IHRvX210OW0xMTEoY2xpZW50KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmbXQ5bTExMS0+c3ViZGV2KTsKIAlpbnQgcmV0OwogCiAJaWYgKG9uKQpAQCAtODA0LDkgKzc3MCw5IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBtdDltMTExX3NldF9hdXRvd2hpdGViYWxhbmNlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIGludCBvbikKK3N0YXRpYyBpbnQgbXQ5bTExMV9zZXRfYXV0b3doaXRlYmFsYW5jZShzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSwgaW50IG9uKQogewotCXN0cnVjdCBtdDltMTExICptdDltMTExID0gdG9fbXQ5bTExMShjbGllbnQpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKCZtdDltMTExLT5zdWJkZXYpOwogCWludCByZXQ7CiAKIAlpZiAob24pCkBAIC04MjMsNyArNzg5LDcgQEAKIHN0YXRpYyBpbnQgbXQ5bTExMV9nX2N0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0Jc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSB0b19tdDltMTExKGNsaWVudCk7CisJc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCBtdDltMTExLCBzdWJkZXYpOwogCWludCBkYXRhOwogCiAJc3dpdGNoIChjdHJsLT5pZCkgewpAQCAtODQ4LDcgKzgxNCw3IEBACiAJCWN0cmwtPnZhbHVlID0gISEoZGF0YSAmIE1UOU0xMTFfUk1CX01JUlJPUl9DT0xTKTsKIAkJYnJlYWs7CiAJY2FzZSBWNEwyX0NJRF9HQUlOOgotCQlkYXRhID0gbXQ5bTExMV9nZXRfZ2xvYmFsX2dhaW4oY2xpZW50KTsKKwkJZGF0YSA9IG10OW0xMTFfZ2V0X2dsb2JhbF9nYWluKG10OW0xMTEpOwogCQlpZiAoZGF0YSA8IDApCiAJCQlyZXR1cm4gZGF0YTsKIAkJY3RybC0+dmFsdWUgPSBkYXRhOwpAQCAtODY1LDggKzgzMSw3IEBACiAKIHN0YXRpYyBpbnQgbXQ5bTExMV9zX2N0cmwoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0Jc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSB0b19tdDltMTExKGNsaWVudCk7CisJc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCBtdDltMTExLCBzdWJkZXYpOwogCWNvbnN0IHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWN0cmw7CiAJaW50IHJldDsKIApAQCAtODc3LDIyICs4NDIsMjIgQEAKIAlzd2l0Y2ggKGN0cmwtPmlkKSB7CiAJY2FzZSBWNEwyX0NJRF9WRkxJUDoKIAkJbXQ5bTExMS0+dmZsaXAgPSBjdHJsLT52YWx1ZTsKLQkJcmV0ID0gbXQ5bTExMV9zZXRfZmxpcChjbGllbnQsIGN0cmwtPnZhbHVlLAorCQlyZXQgPSBtdDltMTExX3NldF9mbGlwKG10OW0xMTEsIGN0cmwtPnZhbHVlLAogCQkJCQlNVDlNMTExX1JNQl9NSVJST1JfUk9XUyk7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfSEZMSVA6CiAJCW10OW0xMTEtPmhmbGlwID0gY3RybC0+dmFsdWU7Ci0JCXJldCA9IG10OW0xMTFfc2V0X2ZsaXAoY2xpZW50LCBjdHJsLT52YWx1ZSwKKwkJcmV0ID0gbXQ5bTExMV9zZXRfZmxpcChtdDltMTExLCBjdHJsLT52YWx1ZSwKIAkJCQkJTVQ5TTExMV9STUJfTUlSUk9SX0NPTFMpOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX0dBSU46Ci0JCXJldCA9IG10OW0xMTFfc2V0X2dsb2JhbF9nYWluKGNsaWVudCwgY3RybC0+dmFsdWUpOworCQlyZXQgPSBtdDltMTExX3NldF9nbG9iYWxfZ2FpbihtdDltMTExLCBjdHJsLT52YWx1ZSk7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfRVhQT1NVUkVfQVVUTzoKLQkJcmV0ID0gIG10OW0xMTFfc2V0X2F1dG9leHBvc3VyZShjbGllbnQsIGN0cmwtPnZhbHVlKTsKKwkJcmV0ID0gIG10OW0xMTFfc2V0X2F1dG9leHBvc3VyZShtdDltMTExLCBjdHJsLT52YWx1ZSk7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFOgotCQlyZXQgPSAgbXQ5bTExMV9zZXRfYXV0b3doaXRlYmFsYW5jZShjbGllbnQsIGN0cmwtPnZhbHVlKTsKKwkJcmV0ID0gIG10OW0xMTFfc2V0X2F1dG93aGl0ZWJhbGFuY2UobXQ5bTExMSwgY3RybC0+dmFsdWUpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXQgPSAtRUlOVkFMOwpAQCAtOTAxLDYwICs4NjYsNTIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IG10OW0xMTFfc3VzcGVuZChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBtdDltMTExX3N1c3BlbmQoc3RydWN0IG10OW0xMTEgKm10OW0xMTEpCiB7Ci0Jc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHRvX2kyY19jbGllbnQodG9fc29jX2NhbWVyYV9jb250cm9sKGljZCkpOwotCXN0cnVjdCBtdDltMTExICptdDltMTExID0gdG9fbXQ5bTExMShjbGllbnQpOwotCi0JbXQ5bTExMS0+Z2FpbiA9IG10OW0xMTFfZ2V0X2dsb2JhbF9nYWluKGNsaWVudCk7CisJbXQ5bTExMS0+Z2FpbiA9IG10OW0xMTFfZ2V0X2dsb2JhbF9nYWluKG10OW0xMTEpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgbXQ5bTExMV9yZXN0b3JlX3N0YXRlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCitzdGF0aWMgdm9pZCBtdDltMTExX3Jlc3RvcmVfc3RhdGUoc3RydWN0IG10OW0xMTEgKm10OW0xMTEpCiB7Ci0Jc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSB0b19tdDltMTExKGNsaWVudCk7Ci0KLQltdDltMTExX3NldF9jb250ZXh0KGNsaWVudCwgbXQ5bTExMS0+Y29udGV4dCk7Ci0JbXQ5bTExMV9zZXRfcGl4Zm10KGNsaWVudCwgbXQ5bTExMS0+Zm10LT5jb2RlKTsKLQltdDltMTExX3NldHVwX3JlY3QoY2xpZW50LCAmbXQ5bTExMS0+cmVjdCk7Ci0JbXQ5bTExMV9zZXRfZmxpcChjbGllbnQsIG10OW0xMTEtPmhmbGlwLCBNVDlNMTExX1JNQl9NSVJST1JfQ09MUyk7Ci0JbXQ5bTExMV9zZXRfZmxpcChjbGllbnQsIG10OW0xMTEtPnZmbGlwLCBNVDlNMTExX1JNQl9NSVJST1JfUk9XUyk7Ci0JbXQ5bTExMV9zZXRfZ2xvYmFsX2dhaW4oY2xpZW50LCBtdDltMTExLT5nYWluKTsKLQltdDltMTExX3NldF9hdXRvZXhwb3N1cmUoY2xpZW50LCBtdDltMTExLT5hdXRvZXhwb3N1cmUpOwotCW10OW0xMTFfc2V0X2F1dG93aGl0ZWJhbGFuY2UoY2xpZW50LCBtdDltMTExLT5hdXRvd2hpdGViYWxhbmNlKTsKLQlyZXR1cm4gMDsKKwltdDltMTExX3NldF9jb250ZXh0KG10OW0xMTEsIG10OW0xMTEtPmNvbnRleHQpOworCW10OW0xMTFfc2V0X3BpeGZtdChtdDltMTExLCBtdDltMTExLT5mbXQtPmNvZGUpOworCW10OW0xMTFfc2V0dXBfcmVjdChtdDltMTExLCAmbXQ5bTExMS0+cmVjdCk7CisJbXQ5bTExMV9zZXRfZmxpcChtdDltMTExLCBtdDltMTExLT5oZmxpcCwgTVQ5TTExMV9STUJfTUlSUk9SX0NPTFMpOworCW10OW0xMTFfc2V0X2ZsaXAobXQ5bTExMSwgbXQ5bTExMS0+dmZsaXAsIE1UOU0xMTFfUk1CX01JUlJPUl9ST1dTKTsKKwltdDltMTExX3NldF9nbG9iYWxfZ2FpbihtdDltMTExLCBtdDltMTExLT5nYWluKTsKKwltdDltMTExX3NldF9hdXRvZXhwb3N1cmUobXQ5bTExMSwgbXQ5bTExMS0+YXV0b2V4cG9zdXJlKTsKKwltdDltMTExX3NldF9hdXRvd2hpdGViYWxhbmNlKG10OW0xMTEsIG10OW0xMTEtPmF1dG93aGl0ZWJhbGFuY2UpOwogfQogCi1zdGF0aWMgaW50IG10OW0xMTFfcmVzdW1lKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQorc3RhdGljIGludCBtdDltMTExX3Jlc3VtZShzdHJ1Y3QgbXQ5bTExMSAqbXQ5bTExMSkKIHsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdG9faTJjX2NsaWVudCh0b19zb2NfY2FtZXJhX2NvbnRyb2woaWNkKSk7Ci0Jc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSB0b19tdDltMTExKGNsaWVudCk7CiAJaW50IHJldCA9IDA7CiAKIAlpZiAobXQ5bTExMS0+cG93ZXJlZCkgewotCQlyZXQgPSBtdDltMTExX2VuYWJsZShjbGllbnQpOworCQlyZXQgPSBtdDltMTExX2VuYWJsZShtdDltMTExKTsKIAkJaWYgKCFyZXQpCi0JCQlyZXQgPSBtdDltMTExX3Jlc2V0KGNsaWVudCk7CisJCQlyZXQgPSBtdDltMTExX3Jlc2V0KG10OW0xMTEpOwogCQlpZiAoIXJldCkKLQkJCXJldCA9IG10OW0xMTFfcmVzdG9yZV9zdGF0ZShjbGllbnQpOworCQkJbXQ5bTExMV9yZXN0b3JlX3N0YXRlKG10OW0xMTEpOwogCX0KIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IG10OW0xMTFfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQorc3RhdGljIGludCBtdDltMTExX2luaXQoc3RydWN0IG10OW0xMTEgKm10OW0xMTEpCiB7Ci0Jc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSB0b19tdDltMTExKGNsaWVudCk7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJm10OW0xMTEtPnN1YmRldik7CiAJaW50IHJldDsKIAogCW10OW0xMTEtPmNvbnRleHQgPSBISUdIUE9XRVI7Ci0JcmV0ID0gbXQ5bTExMV9lbmFibGUoY2xpZW50KTsKKwlyZXQgPSBtdDltMTExX2VuYWJsZShtdDltMTExKTsKIAlpZiAoIXJldCkKLQkJcmV0ID0gbXQ5bTExMV9yZXNldChjbGllbnQpOworCQlyZXQgPSBtdDltMTExX3Jlc2V0KG10OW0xMTEpOwogCWlmICghcmV0KQotCQlyZXQgPSBtdDltMTExX3NldF9jb250ZXh0KGNsaWVudCwgbXQ5bTExMS0+Y29udGV4dCk7CisJCXJldCA9IG10OW0xMTFfc2V0X2NvbnRleHQobXQ5bTExMSwgbXQ5bTExMS0+Y29udGV4dCk7CiAJaWYgKCFyZXQpCi0JCXJldCA9IG10OW0xMTFfc2V0X2F1dG9leHBvc3VyZShjbGllbnQsIG10OW0xMTEtPmF1dG9leHBvc3VyZSk7CisJCXJldCA9IG10OW0xMTFfc2V0X2F1dG9leHBvc3VyZShtdDltMTExLCBtdDltMTExLT5hdXRvZXhwb3N1cmUpOwogCWlmIChyZXQpCiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAibXQ5bTExMSBpbml0IGZhaWxlZDogJWRcbiIsIHJldCk7CiAJcmV0dXJuIHJldDsKQEAgLTk3MSwyMCArOTI4LDEzIEBACiAJczMyIGRhdGE7CiAJaW50IHJldDsKIAotCS8qCi0JICogV2UgbXVzdCBoYXZlIGEgcGFyZW50IGJ5IG5vdy4gQW5kIGl0IGNhbm5vdCBiZSBhIHdyb25nIG9uZS4KLQkgKiBTbyB0aGlzIGVudGlyZSB0ZXN0IGlzIGNvbXBsZXRlbHkgcmVkdW5kYW50LgotCSAqLwotCWlmICghaWNkLT5kZXYucGFyZW50IHx8Ci0JICAgIHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpLT5uciAhPSBpY2QtPmlmYWNlKQotCQlyZXR1cm4gLUVOT0RFVjsKKwkvKiBXZSBtdXN0IGhhdmUgYSBwYXJlbnQgYnkgbm93LiBBbmQgaXQgY2Fubm90IGJlIGEgd3Jvbmcgb25lLiAqLworCUJVR19PTighaWNkLT5wYXJlbnQgfHwKKwkgICAgICAgdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KS0+bnIgIT0gaWNkLT5pZmFjZSk7CiAKIAltdDltMTExLT5hdXRvZXhwb3N1cmUgPSAxOwogCW10OW0xMTEtPmF1dG93aGl0ZWJhbGFuY2UgPSAxOwogCi0JbXQ5bTExMS0+c3dhcF9yZ2JfZXZlbl9vZGQgPSAxOwotCW10OW0xMTEtPnN3YXBfcmdiX3JlZF9ibHVlID0gMTsKLQogCWRhdGEgPSByZWdfcmVhZChDSElQX1ZFUlNJT04pOwogCiAJc3dpdGNoIChkYXRhKSB7CkBAIC0xMDA1LDE2ICs5NTUsNTEgQEAKIAkJZ290byBlaTJjOwogCX0KIAotCXJldCA9IG10OW0xMTFfaW5pdChjbGllbnQpOworCXJldCA9IG10OW0xMTFfaW5pdChtdDltMTExKTsKIAogZWkyYzoKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IG10OW0xMTFfc19wb3dlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgb24pCit7CisJc3RydWN0IG10OW0xMTEgKm10OW0xMTEgPSBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCBtdDltMTExLCBzdWJkZXYpOworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlpbnQgcmV0ID0gMDsKKworCW11dGV4X2xvY2soJm10OW0xMTEtPnBvd2VyX2xvY2spOworCisJLyoKKwkgKiBJZiB0aGUgcG93ZXIgY291bnQgaXMgbW9kaWZpZWQgZnJvbSAwIHRvICE9IDAgb3IgZnJvbSAhPSAwIHRvIDAsCisJICogdXBkYXRlIHRoZSBwb3dlciBzdGF0ZS4KKwkgKi8KKwlpZiAobXQ5bTExMS0+cG93ZXJfY291bnQgPT0gIW9uKSB7CisJCWlmIChvbikgeworCQkJcmV0ID0gbXQ5bTExMV9yZXN1bWUobXQ5bTExMSk7CisJCQlpZiAocmV0KSB7CisJCQkJZGV2X2VycigmY2xpZW50LT5kZXYsCisJCQkJCSJGYWlsZWQgdG8gcmVzdW1lIHRoZSBzZW5zb3I6ICVkXG4iLCByZXQpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9IGVsc2UgeworCQkJbXQ5bTExMV9zdXNwZW5kKG10OW0xMTEpOworCQl9CisJfQorCisJLyogVXBkYXRlIHRoZSBwb3dlciBjb3VudC4gKi8KKwltdDltMTExLT5wb3dlcl9jb3VudCArPSBvbiA/IDEgOiAtMTsKKwlXQVJOX09OKG10OW0xMTEtPnBvd2VyX2NvdW50IDwgMCk7CisKK291dDoKKwltdXRleF91bmxvY2soJm10OW0xMTEtPnBvd2VyX2xvY2spOworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgbXQ5bTExMV9zdWJkZXZfY29yZV9vcHMgPSB7CiAJLmdfY3RybAkJPSBtdDltMTExX2dfY3RybCwKIAkuc19jdHJsCQk9IG10OW0xMTFfc19jdHJsLAogCS5nX2NoaXBfaWRlbnQJPSBtdDltMTExX2dfY2hpcF9pZGVudCwKKwkuc19wb3dlcgk9IG10OW0xMTFfc19wb3dlciwKICNpZmRlZiBDT05GSUdfVklERU9fQURWX0RFQlVHCiAJLmdfcmVnaXN0ZXIJPSBtdDltMTExX2dfcmVnaXN0ZXIsCiAJLnNfcmVnaXN0ZXIJPSBtdDltMTExX3NfcmVnaXN0ZXIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXQwMzEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5dDAzMS5jCmluZGV4IDdjZTI3OWMuLjMwNTQ3Y2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5dDAzMS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5dDAzMS5jCkBAIC03MDAsOCArNzAwLDcgQEAKIHN0YXRpYyBpbnQgbXQ5dDAzMV9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHRvX3ZpZGVvX2RldmljZShkZXYpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gY29udGFpbmVyX29mKHZkZXYtPnBhcmVudCwKLQkJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlLCBkZXYpOworCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gZGV2X2dldF9kcnZkYXRhKHZkZXYtPnBhcmVudCk7CiAJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOwogCXN0cnVjdCBtdDl0MDMxICptdDl0MDMxID0gdG9fbXQ5dDAzMShjbGllbnQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDl0MTEyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXQxMTIuYwppbmRleCBiZmZhOWVlLi5kMmUwYTUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXQxMTIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXQxMTIuYwpAQCAtMTA1NywxMyArMTA1Nyw5IEBACiAJY29uc3QgY2hhciAgICAgICAgICAqZGV2bmFtZTsKIAlpbnQgICAgICAgICAgICAgICAgICBjaGlwaWQ7CiAKLQkvKgotCSAqIFdlIG11c3QgaGF2ZSBhIHBhcmVudCBieSBub3cuIEFuZCBpdCBjYW5ub3QgYmUgYSB3cm9uZyBvbmUuCi0JICogU28gdGhpcyBlbnRpcmUgdGVzdCBpcyBjb21wbGV0ZWx5IHJlZHVuZGFudC4KLQkgKi8KLQlpZiAoIWljZC0+ZGV2LnBhcmVudCB8fAotCSAgICB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KS0+bnIgIT0gaWNkLT5pZmFjZSkKLQkJcmV0dXJuIC1FTk9ERVY7CisJLyogV2UgbXVzdCBoYXZlIGEgcGFyZW50IGJ5IG5vdy4gQW5kIGl0IGNhbm5vdCBiZSBhIHdyb25nIG9uZS4gKi8KKwlCVUdfT04oIWljZC0+cGFyZW50IHx8CisJICAgICAgIHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCktPm5yICE9IGljZC0+aWZhY2UpOwogCiAJLyoKIAkgKiBjaGVjayBhbmQgc2hvdyBjaGlwIElECmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXYwMTEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5djAxMS5jCmluZGV4IDQ5MDRkMjUuLjg5M2E4YjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5djAxMS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5djAxMS5jCkBAIC01NCwxMSArNTQsMjAgQEAKIAkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAogCQkubmFtZSA9ICJHYWluIiwKIAkJLm1pbmltdW0gPSAwLAotCQkubWF4aW11bSA9ICgxIDw8IDEwKSAtIDEsCisJCS5tYXhpbXVtID0gKDEgPDwgMTIpIC0gMSAtIDB4MDAyMCwKIAkJLnN0ZXAgPSAxLAogCQkuZGVmYXVsdF92YWx1ZSA9IDB4MDAyMCwKIAkJLmZsYWdzID0gMCwKIAl9LCB7CisJCS5pZCA9IFY0TDJfQ0lEX0VYUE9TVVJFLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lID0gIkV4cG9zdXJlIiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDIwNDcsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAweDAxZmMsCisJCS5mbGFncyA9IDAsCisJfSwgewogCQkuaWQgPSBWNEwyX0NJRF9SRURfQkFMQU5DRSwKIAkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAogCQkubmFtZSA9ICJSZWQgQmFsYW5jZSIsCkBAIC0xMDUsNyArMTE0LDggQEAKIAl1bnNpZ25lZCBoZmxpcDoxOwogCXVuc2lnbmVkIHZmbGlwOjE7CiAKLQl1MTYgZ2xvYmFsX2dhaW4sIHJlZF9iYWwsIGJsdWVfYmFsOworCXUxNiBnbG9iYWxfZ2FpbiwgZXhwb3N1cmU7CisJczE2IHJlZF9iYWwsIGJsdWVfYmFsOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgbXQ5djAxMSAqdG9fbXQ5djAxMShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQpAQCAtMTgwLDI0ICsxOTAsNjggQEAKIAkJeyBSMDdfTVQ5VjAxMV9PVVRfQ1RSTCwgMHgwMDAyIH0sCS8qIGNoaXAgZW5hYmxlICovCiB9OwogCisKK3N0YXRpYyB1MTYgY2FsY19tdDl2MDExX2dhaW4oczE2IGxpbmVhcmdhaW4pCit7CisKKwl1MTYgZGlnaXRhbGdhaW4gPSAwOworCXUxNiBhbmFsb2dtdWx0ID0gMDsKKwl1MTYgYW5hbG9naW5pdCA9IDA7CisKKwlpZiAobGluZWFyZ2FpbiA8IDApCisJCWxpbmVhcmdhaW4gPSAwOworCisJLyogcmVjb21tZW5kZWQgbWluaW11bSAqLworCWxpbmVhcmdhaW4gKz0gMHgwMDIwOworCisJaWYgKGxpbmVhcmdhaW4gPiAyMDQ3KQorCQlsaW5lYXJnYWluID0gMjA0NzsKKworCWlmIChsaW5lYXJnYWluID4gMTAyMykgeworCQlkaWdpdGFsZ2FpbiA9IDM7CisJCWFuYWxvZ211bHQgPSAzOworCQlhbmFsb2dpbml0ID0gbGluZWFyZ2FpbiAvIDE2OworCX0gZWxzZSBpZiAobGluZWFyZ2FpbiA+IDUxMSkgeworCQlkaWdpdGFsZ2FpbiA9IDE7CisJCWFuYWxvZ211bHQgPSAzOworCQlhbmFsb2dpbml0ID0gbGluZWFyZ2FpbiAvIDg7CisJfSBlbHNlIGlmIChsaW5lYXJnYWluID4gMjU1KSB7CisJCWFuYWxvZ211bHQgPSAzOworCQlhbmFsb2dpbml0ID0gbGluZWFyZ2FpbiAvIDQ7CisJfSBlbHNlIGlmIChsaW5lYXJnYWluID4gMTI3KSB7CisJCWFuYWxvZ211bHQgPSAxOworCQlhbmFsb2dpbml0ID0gbGluZWFyZ2FpbiAvIDI7CisJfSBlbHNlCisJCWFuYWxvZ2luaXQgPSBsaW5lYXJnYWluOworCisJcmV0dXJuIGFuYWxvZ2luaXQgKyAoYW5hbG9nbXVsdCA8PCA3KSArIChkaWdpdGFsZ2FpbiA8PCA5KTsKKworfQorCiBzdGF0aWMgdm9pZCBzZXRfYmFsYW5jZShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQogewogCXN0cnVjdCBtdDl2MDExICpjb3JlID0gdG9fbXQ5djAxMShzZCk7Ci0JdTE2IGdyZWVuMV9nYWluLCBncmVlbjJfZ2FpbiwgYmx1ZV9nYWluLCByZWRfZ2FpbjsKKwl1MTYgZ3JlZW5fZ2FpbiwgYmx1ZV9nYWluLCByZWRfZ2FpbjsKKwl1MTYgZXhwb3N1cmU7CisJczE2IGJhbDsKIAotCWdyZWVuMV9nYWluID0gY29yZS0+Z2xvYmFsX2dhaW47Ci0JZ3JlZW4yX2dhaW4gPSBjb3JlLT5nbG9iYWxfZ2FpbjsKKwlleHBvc3VyZSA9IGNvcmUtPmV4cG9zdXJlOwogCi0JYmx1ZV9nYWluID0gY29yZS0+Z2xvYmFsX2dhaW4gKwotCQkgICAgY29yZS0+Z2xvYmFsX2dhaW4gKiBjb3JlLT5ibHVlX2JhbCAvICgxIDw8IDkpOworCWdyZWVuX2dhaW4gPSBjYWxjX210OXYwMTFfZ2Fpbihjb3JlLT5nbG9iYWxfZ2Fpbik7CiAKLQlyZWRfZ2FpbiA9IGNvcmUtPmdsb2JhbF9nYWluICsKLQkJICAgY29yZS0+Z2xvYmFsX2dhaW4gKiBjb3JlLT5ibHVlX2JhbCAvICgxIDw8IDkpOworCWJhbCA9IGNvcmUtPmdsb2JhbF9nYWluOworCWJhbCArPSAoY29yZS0+Ymx1ZV9iYWwgKiBjb3JlLT5nbG9iYWxfZ2FpbiAvICgxIDw8IDcpKTsKKwlibHVlX2dhaW4gPSBjYWxjX210OXYwMTFfZ2FpbihiYWwpOwogCi0JbXQ5djAxMV93cml0ZShzZCwgUjJCX01UOVYwMTFfR1JFRU5fMV9HQUlOLCBncmVlbjFfZ2Fpbik7Ci0JbXQ5djAxMV93cml0ZShzZCwgUjJFX01UOVYwMTFfR1JFRU5fMl9HQUlOLCAgZ3JlZW4xX2dhaW4pOworCWJhbCA9IGNvcmUtPmdsb2JhbF9nYWluOworCWJhbCArPSAoY29yZS0+cmVkX2JhbCAqIGNvcmUtPmdsb2JhbF9nYWluIC8gKDEgPDwgNykpOworCXJlZF9nYWluID0gY2FsY19tdDl2MDExX2dhaW4oYmFsKTsKKworCW10OXYwMTFfd3JpdGUoc2QsIFIyQl9NVDlWMDExX0dSRUVOXzFfR0FJTiwgZ3JlZW5fZ2Fpbik7CisJbXQ5djAxMV93cml0ZShzZCwgUjJFX01UOVYwMTFfR1JFRU5fMl9HQUlOLCBncmVlbl9nYWluKTsKIAltdDl2MDExX3dyaXRlKHNkLCBSMkNfTVQ5VjAxMV9CTFVFX0dBSU4sIGJsdWVfZ2Fpbik7CiAJbXQ5djAxMV93cml0ZShzZCwgUjJEX01UOVYwMTFfUkVEX0dBSU4sIHJlZF9nYWluKTsKKwltdDl2MDExX3dyaXRlKHNkLCBSMDlfTVQ5VjAxMV9TSFVUVEVSX1dJRFRILCBleHBvc3VyZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGNhbGNfZnBzKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiAqbnVtZXJhdG9yLCB1MzIgKmRlbm9taW5hdG9yKQpAQCAtMjg2LDcgKzM0MCw3IEBACiAJICogYmUgbWlzc2luZy4KIAkgKi8KIAotCWhzdGFydCA9IDE0ICsgKDY0MCAtIGNvcmUtPndpZHRoKSAvIDI7CisJaHN0YXJ0ID0gMjAgKyAoNjQwIC0gY29yZS0+d2lkdGgpIC8gMjsKIAltdDl2MDExX3dyaXRlKHNkLCBSMDJfTVQ5VjAxMV9DT0xTVEFSVCwgaHN0YXJ0KTsKIAltdDl2MDExX3dyaXRlKHNkLCBSMDRfTVQ5VjAxMV9XSURUSCwgY29yZS0+d2lkdGgpOwogCW10OXYwMTFfd3JpdGUoc2QsIFIwNV9NVDlWMDExX0hCTEFOSywgNzcxIC0gY29yZS0+d2lkdGgpOwpAQCAtMzM4LDYgKzM5Miw5IEBACiAJY2FzZSBWNEwyX0NJRF9HQUlOOgogCQljdHJsLT52YWx1ZSA9IGNvcmUtPmdsb2JhbF9nYWluOwogCQlyZXR1cm4gMDsKKwljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgorCQljdHJsLT52YWx1ZSA9IGNvcmUtPmV4cG9zdXJlOworCQlyZXR1cm4gMDsKIAljYXNlIFY0TDJfQ0lEX1JFRF9CQUxBTkNFOgogCQljdHJsLT52YWx1ZSA9IGNvcmUtPnJlZF9iYWw7CiAJCXJldHVybiAwOwpAQCAtMzkyLDYgKzQ0OSw5IEBACiAJY2FzZSBWNEwyX0NJRF9HQUlOOgogCQljb3JlLT5nbG9iYWxfZ2FpbiA9IGN0cmwtPnZhbHVlOwogCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgorCQljb3JlLT5leHBvc3VyZSA9IGN0cmwtPnZhbHVlOworCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX1JFRF9CQUxBTkNFOgogCQljb3JlLT5yZWRfYmFsID0gY3RybC0+dmFsdWU7CiAJCWJyZWFrOwpAQCAtNTk4LDYgKzY1OCw3IEBACiAJfQogCiAJY29yZS0+Z2xvYmFsX2dhaW4gPSAweDAwMjQ7CisJY29yZS0+ZXhwb3N1cmUgPSAweDAxZmM7CiAJY29yZS0+d2lkdGggID0gNjQwOwogCWNvcmUtPmhlaWdodCA9IDQ4MDsKIAljb3JlLT54dGFsID0gMjcwMDAwMDA7CS8qIEh6ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXYwMjIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5djAyMi5jCmluZGV4IGZjNzZlZDEuLjUxYjBmY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5djAyMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5djAyMi5jCkBAIC03MjgsOSArNzI4LDkgQEAKIAlpbnQgcmV0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoIWljZC0+ZGV2LnBhcmVudCB8fAotCSAgICB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KS0+bnIgIT0gaWNkLT5pZmFjZSkKLQkJcmV0dXJuIC1FTk9ERVY7CisJLyogV2UgbXVzdCBoYXZlIGEgcGFyZW50IGJ5IG5vdy4gQW5kIGl0IGNhbm5vdCBiZSBhIHdyb25nIG9uZS4gKi8KKwlCVUdfT04oIWljZC0+cGFyZW50IHx8CisJICAgICAgIHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCktPm5yICE9IGljZC0+aWZhY2UpOwogCiAJLyogUmVhZCBvdXQgdGhlIGNoaXAgdmVyc2lvbiByZWdpc3RlciAqLwogCWRhdGEgPSByZWdfcmVhZChjbGllbnQsIE1UOVYwMjJfQ0hJUF9WRVJTSU9OKTsKQEAgLTgwOSw4ICs4MDksOCBAQAogewogCXN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCA9IHRvX3NvY19jYW1lcmFfbGluayhpY2QpOwogCi0JZGV2X2RiZygmaWNkLT5kZXYsICJWaWRlbyByZW1vdmVkOiAlcCwgJXBcbiIsCi0JCWljZC0+ZGV2LnBhcmVudCwgaWNkLT52ZGV2KTsKKwlkZXZfZGJnKGljZC0+cGRldiwgIlZpZGVvIHJlbW92ZWQ6ICVwLCAlcFxuIiwKKwkJaWNkLT5wYXJlbnQsIGljZC0+dmRldik7CiAJaWYgKGljbC0+ZnJlZV9idXMpCiAJCWljbC0+ZnJlZV9idXMoaWNsKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5djAzMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDl2MDMyLmMKaW5kZXggMTMxOWMyYy4uYzY0ZTFkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9tdDl2MDMyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9tdDl2MDMyLmMKQEAgLTMxLDE0ICszMSwxNCBAQAogI2RlZmluZSBNVDlWMDMyX0NISVBfVkVSU0lPTgkJCQkweDAwCiAjZGVmaW5lCQlNVDlWMDMyX0NISVBfSURfUkVWMQkJCTB4MTMxMQogI2RlZmluZQkJTVQ5VjAzMl9DSElQX0lEX1JFVjMJCQkweDEzMTMKLSNkZWZpbmUgTVQ5VjAzMl9ST1dfU1RBUlQJCQkJMHgwMQotI2RlZmluZQkJTVQ5VjAzMl9ST1dfU1RBUlRfTUlOCQkJNAotI2RlZmluZQkJTVQ5VjAzMl9ST1dfU1RBUlRfREVGCQkJMTAKLSNkZWZpbmUJCU1UOVYwMzJfUk9XX1NUQVJUX01BWAkJCTQ4MgotI2RlZmluZSBNVDlWMDMyX0NPTFVNTl9TVEFSVAkJCQkweDAyCisjZGVmaW5lIE1UOVYwMzJfQ09MVU1OX1NUQVJUCQkJCTB4MDEKICNkZWZpbmUJCU1UOVYwMzJfQ09MVU1OX1NUQVJUX01JTgkJMQotI2RlZmluZQkJTVQ5VjAzMl9DT0xVTU5fU1RBUlRfREVGCQkyCisjZGVmaW5lCQlNVDlWMDMyX0NPTFVNTl9TVEFSVF9ERUYJCTEKICNkZWZpbmUJCU1UOVYwMzJfQ09MVU1OX1NUQVJUX01BWAkJNzUyCisjZGVmaW5lIE1UOVYwMzJfUk9XX1NUQVJUCQkJCTB4MDIKKyNkZWZpbmUJCU1UOVYwMzJfUk9XX1NUQVJUX01JTgkJCTQKKyNkZWZpbmUJCU1UOVYwMzJfUk9XX1NUQVJUX0RFRgkJCTUKKyNkZWZpbmUJCU1UOVYwMzJfUk9XX1NUQVJUX01BWAkJCTQ4MgogI2RlZmluZSBNVDlWMDMyX1dJTkRPV19IRUlHSFQJCQkJMHgwMwogI2RlZmluZQkJTVQ5VjAzMl9XSU5ET1dfSEVJR0hUX01JTgkJMQogI2RlZmluZQkJTVQ5VjAzMl9XSU5ET1dfSEVJR0hUX0RFRgkJNDgwCkBAIC00MjAsMTMgKzQyMCwxMyBAQAogCXN0cnVjdCB2NGwyX3JlY3QgKl9fY3JvcDsKIAlzdHJ1Y3QgdjRsMl9yZWN0IHJlY3Q7CiAKLQkvKiBDbGFtcCB0aGUgY3JvcCByZWN0YW5nbGUgYm91bmRhcmllcyBhbmQgYWxpZ24gdGhlbSB0byBhIG11bHRpcGxlIG9mIDIKLQkgKiBwaXhlbHMuCisJLyogQ2xhbXAgdGhlIGNyb3AgcmVjdGFuZ2xlIGJvdW5kYXJpZXMgYW5kIGFsaWduIHRoZW0gdG8gYSBub24gbXVsdGlwbGUKKwkgKiBvZiAyIHBpeGVscyB0byBlbnN1cmUgYSBHUkJHIEJheWVyIHBhdHRlcm4uCiAJICovCi0JcmVjdC5sZWZ0ID0gY2xhbXAoQUxJR04oY3JvcC0+cmVjdC5sZWZ0LCAyKSwKKwlyZWN0LmxlZnQgPSBjbGFtcChBTElHTihjcm9wLT5yZWN0LmxlZnQgKyAxLCAyKSAtIDEsCiAJCQkgIE1UOVYwMzJfQ09MVU1OX1NUQVJUX01JTiwKIAkJCSAgTVQ5VjAzMl9DT0xVTU5fU1RBUlRfTUFYKTsKLQlyZWN0LnRvcCA9IGNsYW1wKEFMSUdOKGNyb3AtPnJlY3QudG9wLCAyKSwKKwlyZWN0LnRvcCA9IGNsYW1wKEFMSUdOKGNyb3AtPnJlY3QudG9wICsgMSwgMikgLSAxLAogCQkJIE1UOVYwMzJfUk9XX1NUQVJUX01JTiwKIAkJCSBNVDlWMDMyX1JPV19TVEFSVF9NQVgpOwogCXJlY3Qud2lkdGggPSBjbGFtcChBTElHTihjcm9wLT5yZWN0LndpZHRoLCAyKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXgxX2NhbWVyYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9teDFfY2FtZXJhLmMKaW5kZXggNjNmOGEwYy4uMDg3ZGIxMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9teDFfY2FtZXJhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9teDFfY2FtZXJhLmMKQEAgLTMxLDcgKzMxLDYgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc29jX2NhbWVyYS5oPgpAQCAtNzMsNyArNzIsNyBAQAogI2RlZmluZSBDU0lTUl9TT0ZfSU5UCQkoMSA8PCAxNikKICNkZWZpbmUgQ1NJU1JfRFJEWQkJKDEgPDwgMCkKIAotI2RlZmluZSBWRVJTSU9OX0NPREUgS0VSTkVMX1ZFUlNJT04oMCwgMCwgMSkKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjAuMC4yIgogI2RlZmluZSBEUklWRVJfTkFNRSAibXgxLWNhbWVyYSIKIAogI2RlZmluZSBDU0lfSVJRX01BU0sJKENTSVNSX1NGRl9PUl9JTlQgfCBDU0lTUl9SRkZfT1JfSU5UIHwgXApAQCAtMTQyLDcgKzE0MSw3IEBACiAJaWYgKCpzaXplICogKmNvdW50ID4gTUFYX1ZJREVPX01FTSAqIDEwMjQgKiAxMDI0KQogCQkqY291bnQgPSAoTUFYX1ZJREVPX01FTSAqIDEwMjQgKiAxMDI0KSAvICpzaXplOwogCi0JZGV2X2RiZyhpY2QtPmRldi5wYXJlbnQsICJjb3VudD0lZCwgc2l6ZT0lZFxuIiwgKmNvdW50LCAqc2l6ZSk7CisJZGV2X2RiZyhpY2QtPnBhcmVudCwgImNvdW50PSVkLCBzaXplPSVkXG4iLCAqY291bnQsICpzaXplKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTU0LDcgKzE1Myw3IEBACiAKIAlCVUdfT04oaW5faW50ZXJydXB0KCkpOwogCi0JZGV2X2RiZyhpY2QtPmRldi5wYXJlbnQsICIlcyAodmI9MHglcCkgMHglMDhseCAlZFxuIiwgX19mdW5jX18sCisJZGV2X2RiZyhpY2QtPnBhcmVudCwgIiVzICh2Yj0weCVwKSAweCUwOGx4ICVkXG4iLCBfX2Z1bmNfXywKIAkJdmIsIHZiLT5iYWRkciwgdmItPmJzaXplKTsKIAogCS8qCkBAIC0xNzksNyArMTc4LDcgQEAKIAlpZiAoYnl0ZXNfcGVyX2xpbmUgPCAwKQogCQlyZXR1cm4gYnl0ZXNfcGVyX2xpbmU7CiAKLQlkZXZfZGJnKGljZC0+ZGV2LnBhcmVudCwgIiVzICh2Yj0weCVwKSAweCUwOGx4ICVkXG4iLCBfX2Z1bmNfXywKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiJXMgKHZiPTB4JXApIDB4JTA4bHggJWRcbiIsIF9fZnVuY19fLAogCQl2YiwgdmItPmJhZGRyLCB2Yi0+YnNpemUpOwogCiAJLyogQWRkZWQgbGlzdCBoZWFkIGluaXRpYWxpemF0aW9uIG9uIGFsbG9jICovCkBAIC0yMzIsNyArMjMxLDcgQEAKIHN0YXRpYyBpbnQgbXgxX2NhbWVyYV9zZXR1cF9kbWEoc3RydWN0IG14MV9jYW1lcmFfZGV2ICpwY2RldikKIHsKIAlzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YnVmID0gJnBjZGV2LT5hY3RpdmUtPnZiOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IHBjZGV2LT5pY2QtPmRldi5wYXJlbnQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gcGNkZXYtPmljZC0+cGFyZW50OwogCWludCByZXQ7CiAKIAlpZiAodW5saWtlbHkoIXBjZGV2LT5hY3RpdmUpKSB7CkBAIC0yNTYsMTEgKzI1NSwxMSBAQAogCQkJCQkJc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSB2cS0+cHJpdl9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IG14MV9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAlzdHJ1Y3QgbXgxX2J1ZmZlciAqYnVmID0gY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgbXgxX2J1ZmZlciwgdmIpOwogCi0JZGV2X2RiZyhpY2QtPmRldi5wYXJlbnQsICIlcyAodmI9MHglcCkgMHglMDhseCAlZFxuIiwgX19mdW5jX18sCisJZGV2X2RiZyhpY2QtPnBhcmVudCwgIiVzICh2Yj0weCVwKSAweCUwOGx4ICVkXG4iLCBfX2Z1bmNfXywKIAkJdmIsIHZiLT5iYWRkciwgdmItPmJzaXplKTsKIAogCWxpc3RfYWRkX3RhaWwoJnZiLT5xdWV1ZSwgJnBjZGV2LT5jYXB0dXJlKTsKQEAgLTI4Nyw3ICsyODYsNyBAQAogCXN0cnVjdCBteDFfYnVmZmVyICpidWYgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBteDFfYnVmZmVyLCB2Yik7CiAjaWZkZWYgREVCVUcKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHZxLT5wcml2X2RhdGE7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5kZXYucGFyZW50OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGljZC0+cGFyZW50OwogCiAJZGV2X2RiZyhkZXYsICIlcyAodmI9MHglcCkgMHglMDhseCAlZFxuIiwgX19mdW5jX18sCiAJCXZiLCB2Yi0+YmFkZHIsIHZiLT5ic2l6ZSk7CkBAIC0zNDMsNyArMzQyLDcgQEAKIHN0YXRpYyB2b2lkIG14MV9jYW1lcmFfZG1hX2lycShpbnQgY2hhbm5lbCwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgbXgxX2NhbWVyYV9kZXYgKnBjZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBwY2Rldi0+aWNkLT5kZXYucGFyZW50OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHBjZGV2LT5pY2QtPnBhcmVudDsKIAlzdHJ1Y3QgbXgxX2J1ZmZlciAqYnVmOwogCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0zNzgsMTAgKzM3NywxMCBAQAogc3RhdGljIHZvaWQgbXgxX2NhbWVyYV9pbml0X3ZpZGVvYnVmKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwKIAkJCQkgICAgIHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IG14MV9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAotCXZpZGVvYnVmX3F1ZXVlX2RtYV9jb250aWdfaW5pdChxLCAmbXgxX3ZpZGVvYnVmX29wcywgaWNkLT5kZXYucGFyZW50LAorCXZpZGVvYnVmX3F1ZXVlX2RtYV9jb250aWdfaW5pdChxLCAmbXgxX3ZpZGVvYnVmX29wcywgaWNkLT5wYXJlbnQsCiAJCQkJJnBjZGV2LT5sb2NrLCBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsCiAJCQkJVjRMMl9GSUVMRF9OT05FLAogCQkJCXNpemVvZihzdHJ1Y3QgbXgxX2J1ZmZlciksIGljZCwgJmljZC0+dmlkZW9fbG9jayk7CkBAIC00MDEsNyArNDAwLDcgQEAKIAkgKi8KIAlkaXYgPSAobGNkY2xrICsgMiAqIG1jbGsgLSAxKSAvICgyICogbWNsaykgLSAxOwogCi0JZGV2X2RiZyhwY2Rldi0+aWNkLT5kZXYucGFyZW50LAorCWRldl9kYmcocGNkZXYtPmljZC0+cGFyZW50LAogCQkiU3lzdGVtIGNsb2NrICVsdWtIeiwgdGFyZ2V0IGZyZXEgJWRrSHosIGRpdmlzb3IgJWx1XG4iLAogCQlsY2RjbGsgLyAxMDAwLCBtY2xrIC8gMTAwMCwgZGl2KTsKIApAQCAtNDEyLDcgKzQxMSw3IEBACiB7CiAJdW5zaWduZWQgaW50IGNzaWNyMSA9IENTSUNSMV9FTjsKIAotCWRldl9kYmcocGNkZXYtPmljZC0+ZGV2LnBhcmVudCwgIkFjdGl2YXRlIGRldmljZVxuIik7CisJZGV2X2RiZyhwY2Rldi0+aWNkLT5wYXJlbnQsICJBY3RpdmF0ZSBkZXZpY2VcbiIpOwogCiAJY2xrX2VuYWJsZShwY2Rldi0+Y2xrKTsKIApAQCAtNDI4LDcgKzQyNyw3IEBACiAKIHN0YXRpYyB2b2lkIG14MV9jYW1lcmFfZGVhY3RpdmF0ZShzdHJ1Y3QgbXgxX2NhbWVyYV9kZXYgKnBjZGV2KQogewotCWRldl9kYmcocGNkZXYtPmljZC0+ZGV2LnBhcmVudCwgIkRlYWN0aXZhdGUgZGV2aWNlXG4iKTsKKwlkZXZfZGJnKHBjZGV2LT5pY2QtPnBhcmVudCwgIkRlYWN0aXZhdGUgZGV2aWNlXG4iKTsKIAogCS8qIERpc2FibGUgYWxsIENTSSBpbnRlcmZhY2UgKi8KIAlfX3Jhd193cml0ZWwoMHgwMCwgcGNkZXYtPmJhc2UgKyBDU0lDUjEpOwpAQCAtNDQyLDEzICs0NDEsMTMgQEAKICAqLwogc3RhdGljIGludCBteDFfY2FtZXJhX2FkZF9kZXZpY2Uoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgxX2NhbWVyYV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCiAJaWYgKHBjZGV2LT5pY2QpCiAJCXJldHVybiAtRUJVU1k7CiAKLQlkZXZfaW5mbyhpY2QtPmRldi5wYXJlbnQsICJNWDEgQ2FtZXJhIGRyaXZlciBhdHRhY2hlZCB0byBjYW1lcmEgJWRcbiIsCisJZGV2X2luZm8oaWNkLT5wYXJlbnQsICJNWDEgQ2FtZXJhIGRyaXZlciBhdHRhY2hlZCB0byBjYW1lcmEgJWRcbiIsCiAJCSBpY2QtPmRldm51bSk7CiAKIAlteDFfY2FtZXJhX2FjdGl2YXRlKHBjZGV2KTsKQEAgLTQ2MCw3ICs0NTksNyBAQAogCiBzdGF0aWMgdm9pZCBteDFfY2FtZXJhX3JlbW92ZV9kZXZpY2Uoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgxX2NhbWVyYV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCXVuc2lnbmVkIGludCBjc2ljcjE7CiAKQEAgLTQ3Myw3ICs0NzIsNyBAQAogCS8qIFN0b3AgRE1BIGVuZ2luZSAqLwogCWlteF9kbWFfZGlzYWJsZShwY2Rldi0+ZG1hX2NoYW4pOwogCi0JZGV2X2luZm8oaWNkLT5kZXYucGFyZW50LCAiTVgxIENhbWVyYSBkcml2ZXIgZGV0YWNoZWQgZnJvbSBjYW1lcmEgJWRcbiIsCisJZGV2X2luZm8oaWNkLT5wYXJlbnQsICJNWDEgQ2FtZXJhIGRyaXZlciBkZXRhY2hlZCBmcm9tIGNhbWVyYSAlZFxuIiwKIAkJIGljZC0+ZGV2bnVtKTsKIAogCW14MV9jYW1lcmFfZGVhY3RpdmF0ZShwY2Rldik7CkBAIC00OTEsNyArNDkwLDcgQEAKIAogc3RhdGljIGludCBteDFfY2FtZXJhX3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsIF9fdTMyIHBpeGZtdCkKIHsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBteDFfY2FtZXJhX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAJdW5zaWduZWQgbG9uZyBjYW1lcmFfZmxhZ3MsIGNvbW1vbl9mbGFnczsKIAl1bnNpZ25lZCBpbnQgY3NpY3IxOwpAQCAtNTYyLDE0ICs1NjEsMTQgQEAKIAogCXhsYXRlID0gc29jX2NhbWVyYV94bGF0ZV9ieV9mb3VyY2MoaWNkLCBwaXgtPnBpeGVsZm9ybWF0KTsKIAlpZiAoIXhsYXRlKSB7Ci0JCWRldl93YXJuKGljZC0+ZGV2LnBhcmVudCwgIkZvcm1hdCAleCBub3QgZm91bmRcbiIsCisJCWRldl93YXJuKGljZC0+cGFyZW50LCAiRm9ybWF0ICV4IG5vdCBmb3VuZFxuIiwKIAkJCSBwaXgtPnBpeGVsZm9ybWF0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJYnVzd2lkdGggPSB4bGF0ZS0+aG9zdF9mbXQtPmJpdHNfcGVyX3NhbXBsZTsKIAlpZiAoYnVzd2lkdGggPiA4KSB7Ci0JCWRldl93YXJuKGljZC0+ZGV2LnBhcmVudCwKKwkJZGV2X3dhcm4oaWNkLT5wYXJlbnQsCiAJCQkgImJpdHMtcGVyLXNhbXBsZSAlZCBmb3IgZm9ybWF0ICV4IHVuc3VwcG9ydGVkXG4iLAogCQkJIGJ1c3dpZHRoLCBwaXgtPnBpeGVsZm9ybWF0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC02MDksNyArNjA4LDcgQEAKIAogCXhsYXRlID0gc29jX2NhbWVyYV94bGF0ZV9ieV9mb3VyY2MoaWNkLCBwaXgtPnBpeGVsZm9ybWF0KTsKIAlpZiAoIXhsYXRlKSB7Ci0JCWRldl93YXJuKGljZC0+ZGV2LnBhcmVudCwgIkZvcm1hdCAleCBub3QgZm91bmRcbiIsCisJCWRldl93YXJuKGljZC0+cGFyZW50LCAiRm9ybWF0ICV4IG5vdCBmb3VuZFxuIiwKIAkJCSBwaXgtPnBpeGVsZm9ybWF0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNjc2LDcgKzY3NSw2IEBACiB7CiAJLyogY2FwLT5uYW1lIGlzIHNldCBieSB0aGUgZnJpZW5kbHkgY2FsbGVyOi0+ICovCiAJc3RybGNweShjYXAtPmNhcmQsICJpLk1YMS9pLk1YTCBDYW1lcmEiLCBzaXplb2YoY2FwLT5jYXJkKSk7Ci0JY2FwLT52ZXJzaW9uID0gVkVSU0lPTl9DT0RFOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1NUUkVBTUlORzsKIAogCXJldHVybiAwOwpAQCAtODgzLDQgKzg4MSw1IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oImkuTVgxL2kuTVhMIFNvQyBDYW1lcmEgSG9zdCBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIlBhdWxpdXMgWmFsZWNrYXMgPHBhdWxpdXMuemFsZWNrYXNAdGVsdG9uaWthLmx0PiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX1ZFUlNJT04oRFJJVkVSX1ZFUlNJT04pOwogTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybToiIERSSVZFUl9OQU1FKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXgyX2NhbWVyYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9teDJfY2FtZXJhLmMKaW5kZXggNGVhYjFjNi4uZWMyNDEwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9teDJfY2FtZXJhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9teDJfY2FtZXJhLmMKQEAgLTIzLDcgKzIzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgpAQCAtNDcsNyArNDYsNyBAQAogI2luY2x1ZGUgPGFzbS9kbWEuaD4KIAogI2RlZmluZSBNWDJfQ0FNX0RSVl9OQU1FICJteDItY2FtZXJhIgotI2RlZmluZSBNWDJfQ0FNX1ZFUlNJT05fQ09ERSBLRVJORUxfVkVSU0lPTigwLCAwLCA1KQorI2RlZmluZSBNWDJfQ0FNX1ZFUlNJT04gIjAuMC42IgogI2RlZmluZSBNWDJfQ0FNX0RSSVZFUl9ERVNDUklQVElPTiAiaS5NWDJ4X0NhbWVyYSIKIAogLyogcmVzZXQgdmFsdWVzICovCkBAIC0yNzgsNyArMjc3LDcgQEAKICAqLwogc3RhdGljIGludCBteDJfY2FtZXJhX2FkZF9kZXZpY2Uoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgyX2NhbWVyYV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCWludCByZXQ7CiAJdTMyIGNzaWNyMTsKQEAgLTMwMyw3ICszMDIsNyBAQAogCiAJcGNkZXYtPmljZCA9IGljZDsKIAotCWRldl9pbmZvKGljZC0+ZGV2LnBhcmVudCwgIkNhbWVyYSBkcml2ZXIgYXR0YWNoZWQgdG8gY2FtZXJhICVkXG4iLAorCWRldl9pbmZvKGljZC0+cGFyZW50LCAiQ2FtZXJhIGRyaXZlciBhdHRhY2hlZCB0byBjYW1lcmEgJWRcbiIsCiAJCSBpY2QtPmRldm51bSk7CiAKIAlyZXR1cm4gMDsKQEAgLTMxMSwxMiArMzEwLDEyIEBACiAKIHN0YXRpYyB2b2lkIG14Ml9jYW1lcmFfcmVtb3ZlX2RldmljZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKIHsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBteDJfY2FtZXJhX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAKIAlCVUdfT04oaWNkICE9IHBjZGV2LT5pY2QpOwogCi0JZGV2X2luZm8oaWNkLT5kZXYucGFyZW50LCAiQ2FtZXJhIGRyaXZlciBkZXRhY2hlZCBmcm9tIGNhbWVyYSAlZFxuIiwKKwlkZXZfaW5mbyhpY2QtPnBhcmVudCwgIkNhbWVyYSBkcml2ZXIgZGV0YWNoZWQgZnJvbSBjYW1lcmEgJWRcbiIsCiAJCSBpY2QtPmRldm51bSk7CiAKIAlteDJfY2FtZXJhX2RlYWN0aXZhdGUocGNkZXYpOwpAQCAtNDM3LDcgKzQzNiw3IEBACiAJaW50IGJ5dGVzX3Blcl9saW5lID0gc29jX21idXNfYnl0ZXNfcGVyX2xpbmUoaWNkLT51c2VyX3dpZHRoLAogCQkJaWNkLT5jdXJyZW50X2ZtdC0+aG9zdF9mbXQpOwogCi0JZGV2X2RiZygmaWNkLT5kZXYsICJjb3VudD0lZCwgc2l6ZT0lZFxuIiwgKmNvdW50LCAqc2l6ZSk7CisJZGV2X2RiZyhpY2QtPnBhcmVudCwgImNvdW50PSVkLCBzaXplPSVkXG4iLCAqY291bnQsICpzaXplKTsKIAogCWlmIChieXRlc19wZXJfbGluZSA8IDApCiAJCXJldHVybiBieXRlc19wZXJfbGluZTsKQEAgLTQ1Nyw3ICs0NTYsNyBAQAogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gdnEtPnByaXZfZGF0YTsKIAlzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YiA9ICZidWYtPnZiOwogCi0JZGV2X2RiZygmaWNkLT5kZXYsICIlcyAodmI9MHglcCkgMHglMDhseCAlZFxuIiwgX19mdW5jX18sCisJZGV2X2RiZyhpY2QtPnBhcmVudCwgIiVzICh2Yj0weCVwKSAweCUwOGx4ICVkXG4iLCBfX2Z1bmNfXywKIAkJdmIsIHZiLT5iYWRkciwgdmItPmJzaXplKTsKIAogCS8qCkBAIC00NjcsNyArNDY2LDcgQEAKIAl2aWRlb2J1Zl93YWl0b24odnEsIHZiLCAwLCAwKTsKIAogCXZpZGVvYnVmX2RtYV9jb250aWdfZnJlZSh2cSwgdmIpOwotCWRldl9kYmcoJmljZC0+ZGV2LCAiJXMgZnJlZWRcbiIsIF9fZnVuY19fKTsKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiJXMgZnJlZWRcbiIsIF9fZnVuY19fKTsKIAogCXZiLT5zdGF0ZSA9IFZJREVPQlVGX05FRURTX0lOSVQ7CiB9CkBAIC00ODEsNyArNDgwLDcgQEAKIAkJCWljZC0+Y3VycmVudF9mbXQtPmhvc3RfZm10KTsKIAlpbnQgcmV0ID0gMDsKIAotCWRldl9kYmcoJmljZC0+ZGV2LCAiJXMgKHZiPTB4JXApIDB4JTA4bHggJWRcbiIsIF9fZnVuY19fLAorCWRldl9kYmcoaWNkLT5wYXJlbnQsICIlcyAodmI9MHglcCkgMHglMDhseCAlZFxuIiwgX19mdW5jX18sCiAJCXZiLCB2Yi0+YmFkZHIsIHZiLT5ic2l6ZSk7CiAKIAlpZiAoYnl0ZXNfcGVyX2xpbmUgPCAwKQpAQCAtNTMzLDEyICs1MzIsMTIgQEAKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHZxLT5wcml2X2RhdGE7CiAJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0KLQkJdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJCXRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IG14Ml9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAlzdHJ1Y3QgbXgyX2J1ZmZlciAqYnVmID0gY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgbXgyX2J1ZmZlciwgdmIpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlkZXZfZGJnKCZpY2QtPmRldiwgIiVzICh2Yj0weCVwKSAweCUwOGx4ICVkXG4iLCBfX2Z1bmNfXywKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiJXMgKHZiPTB4JXApIDB4JTA4bHggJWRcbiIsIF9fZnVuY19fLAogCQl2YiwgdmItPmJhZGRyLCB2Yi0+YnNpemUpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBjZGV2LT5sb2NrLCBmbGFncyk7CkBAIC02MTEsMjcgKzYxMCwyNyBAQAogCQkJCSBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHZxLT5wcml2X2RhdGE7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgyX2NhbWVyYV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCXN0cnVjdCBteDJfYnVmZmVyICpidWYgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBteDJfYnVmZmVyLCB2Yik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogI2lmZGVmIERFQlVHCi0JZGV2X2RiZygmaWNkLT5kZXYsICIlcyAodmI9MHglcCkgMHglMDhseCAlZFxuIiwgX19mdW5jX18sCisJZGV2X2RiZyhpY2QtPnBhcmVudCwgIiVzICh2Yj0weCVwKSAweCUwOGx4ICVkXG4iLCBfX2Z1bmNfXywKIAkJdmIsIHZiLT5iYWRkciwgdmItPmJzaXplKTsKIAogCXN3aXRjaCAodmItPnN0YXRlKSB7CiAJY2FzZSBWSURFT0JVRl9BQ1RJVkU6Ci0JCWRldl9pbmZvKCZpY2QtPmRldiwgIiVzIChhY3RpdmUpXG4iLCBfX2Z1bmNfXyk7CisJCWRldl9pbmZvKGljZC0+cGFyZW50LCAiJXMgKGFjdGl2ZSlcbiIsIF9fZnVuY19fKTsKIAkJYnJlYWs7CiAJY2FzZSBWSURFT0JVRl9RVUVVRUQ6Ci0JCWRldl9pbmZvKCZpY2QtPmRldiwgIiVzIChxdWV1ZWQpXG4iLCBfX2Z1bmNfXyk7CisJCWRldl9pbmZvKGljZC0+cGFyZW50LCAiJXMgKHF1ZXVlZClcbiIsIF9fZnVuY19fKTsKIAkJYnJlYWs7CiAJY2FzZSBWSURFT0JVRl9QUkVQQVJFRDoKLQkJZGV2X2luZm8oJmljZC0+ZGV2LCAiJXMgKHByZXBhcmVkKVxuIiwgX19mdW5jX18pOworCQlkZXZfaW5mbyhpY2QtPnBhcmVudCwgIiVzIChwcmVwYXJlZClcbiIsIF9fZnVuY19fKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2luZm8oJmljZC0+ZGV2LCAiJXMgKHVua25vd24pICVkXG4iLCBfX2Z1bmNfXywKKwkJZGV2X2luZm8oaWNkLT5wYXJlbnQsICIlcyAodW5rbm93bikgJWRcbiIsIF9fZnVuY19fLAogCQkJCXZiLT5zdGF0ZSk7CiAJCWJyZWFrOwogCX0KQEAgLTY3OCw3ICs2NzcsNyBAQAogc3RhdGljIHZvaWQgbXgyX2NhbWVyYV9pbml0X3ZpZGVvYnVmKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwKIAkJCSAgICAgIHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IG14Ml9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAogCXZpZGVvYnVmX3F1ZXVlX2RtYV9jb250aWdfaW5pdChxLCAmbXgyX3ZpZGVvYnVmX29wcywgcGNkZXYtPmRldiwKQEAgLTcxOSw3ICs3MTgsNyBAQAogCQlpbnQgYnl0ZXNwZXJsaW5lKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9Ci0JCXRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCQl0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBteDJfY2FtZXJhX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAKIAl3cml0ZWwocGNkZXYtPmRpc2NhcmRfYnVmZmVyX2RtYSwKQEAgLTc3Miw3ICs3NzEsNyBAQAogCQlfX3UzMiBwaXhmbXQpCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0KLQkJdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJCXRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IG14Ml9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAl1bnNpZ25lZCBsb25nIGNhbWVyYV9mbGFncywgY29tbW9uX2ZsYWdzOwogCWludCByZXQgPSAwOwpAQCAtODkxLDcgKzg5MCw3IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlkZXZfZGJnKGljZC0+ZGV2LnBhcmVudCwgIlNlbnNvciBjcm9wcGVkICVkeCVkXG4iLAorCWRldl9kYmcoaWNkLT5wYXJlbnQsICJTZW5zb3IgY3JvcHBlZCAlZHglZFxuIiwKIAkJbWYud2lkdGgsIG1mLmhlaWdodCk7CiAKIAlpY2QtPnVzZXJfd2lkdGgJCT0gbWYud2lkdGg7CkBAIC05MTEsNyArOTEwLDcgQEAKIAogCXhsYXRlID0gc29jX2NhbWVyYV94bGF0ZV9ieV9mb3VyY2MoaWNkLCBwaXgtPnBpeGVsZm9ybWF0KTsKIAlpZiAoIXhsYXRlKSB7Ci0JCWRldl93YXJuKGljZC0+ZGV2LnBhcmVudCwgIkZvcm1hdCAleCBub3QgZm91bmRcbiIsCisJCWRldl93YXJuKGljZC0+cGFyZW50LCAiRm9ybWF0ICV4IG5vdCBmb3VuZFxuIiwKIAkJCQlwaXgtPnBpeGVsZm9ybWF0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtOTUxLDcgKzk1MCw3IEBACiAKIAl4bGF0ZSA9IHNvY19jYW1lcmFfeGxhdGVfYnlfZm91cmNjKGljZCwgcGl4Zm10KTsKIAlpZiAocGl4Zm10ICYmICF4bGF0ZSkgewotCQlkZXZfd2FybihpY2QtPmRldi5wYXJlbnQsICJGb3JtYXQgJXggbm90IGZvdW5kXG4iLCBwaXhmbXQpOworCQlkZXZfd2FybihpY2QtPnBhcmVudCwgIkZvcm1hdCAleCBub3QgZm91bmRcbiIsIHBpeGZtdCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtOTc0LDExICs5NzMsMTYgQEAKIAkJaWYgKHBpeC0+Ynl0ZXNwZXJsaW5lIDwgMCkKIAkJCXJldHVybiBwaXgtPmJ5dGVzcGVybGluZTsKIAkJcGl4LT5zaXplaW1hZ2UgPSBwaXgtPmhlaWdodCAqIHBpeC0+Ynl0ZXNwZXJsaW5lOwotCQlpZiAocGl4LT5zaXplaW1hZ2UgPiAoNCAqIDB4M2ZmZmYpKSB7IC8qIENTSVJYQ05UIGxpbWl0ICovCi0JCQlkZXZfd2FybihpY2QtPmRldi5wYXJlbnQsCi0JCQkJCSJJbWFnZSBzaXplICgldSkgYWJvdmUgbGltaXRcbiIsCi0JCQkJCXBpeC0+c2l6ZWltYWdlKTsKLQkJCXJldHVybiAtRUlOVkFMOworCQkvKiBDaGVjayBhZ2FpbnN0IHRoZSBDU0lSWENOVCBsaW1pdCAqLworCQlpZiAocGl4LT5zaXplaW1hZ2UgPiA0ICogMHgzZmZmZikgeworCQkJLyogQWRqdXN0IGdlb21ldHJ5LCBwcmVzZXJ2ZSBhc3BlY3QgcmF0aW8gKi8KKwkJCXVuc2lnbmVkIGludCBuZXdfaGVpZ2h0ID0gaW50X3NxcnQoNCAqIDB4M2ZmZmYgKgorCQkJCQlwaXgtPmhlaWdodCAvIHBpeC0+Ynl0ZXNwZXJsaW5lKTsKKwkJCXBpeC0+d2lkdGggPSBuZXdfaGVpZ2h0ICogcGl4LT53aWR0aCAvIHBpeC0+aGVpZ2h0OworCQkJcGl4LT5oZWlnaHQgPSBuZXdfaGVpZ2h0OworCQkJcGl4LT5ieXRlc3BlcmxpbmUgPSBzb2NfbWJ1c19ieXRlc19wZXJfbGluZShwaXgtPndpZHRoLAorCQkJCQkJCXhsYXRlLT5ob3N0X2ZtdCk7CisJCQlCVUdfT04ocGl4LT5ieXRlc3BlcmxpbmUgPCAwKTsKIAkJfQogCX0KIApAQCAtOTk2LDcgKzEwMDAsNyBAQAogCWlmIChtZi5maWVsZCA9PSBWNEwyX0ZJRUxEX0FOWSkKIAkJbWYuZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CiAJaWYgKG1mLmZpZWxkICE9IFY0TDJfRklFTERfTk9ORSkgewotCQlkZXZfZXJyKGljZC0+ZGV2LnBhcmVudCwgIkZpZWxkIHR5cGUgJWQgdW5zdXBwb3J0ZWQuXG4iLAorCQlkZXZfZXJyKGljZC0+cGFyZW50LCAiRmllbGQgdHlwZSAlZCB1bnN1cHBvcnRlZC5cbiIsCiAJCQkJbWYuZmllbGQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xMDE0LDcgKzEwMTgsNiBAQAogewogCS8qIGNhcC0+bmFtZSBpcyBzZXQgYnkgdGhlIGZyaWVuZGx5IGNhbGxlcjotPiAqLwogCXN0cmxjcHkoY2FwLT5jYXJkLCBNWDJfQ0FNX0RSSVZFUl9ERVNDUklQVElPTiwgc2l6ZW9mKGNhcC0+Y2FyZCkpOwotCWNhcC0+dmVyc2lvbiA9IE1YMl9DQU1fVkVSU0lPTl9DT0RFOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1NUUkVBTUlORzsKIAogCXJldHVybiAwOwpAQCAtMTUyMywzICsxNTI2LDQgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiaS5NWDI3L2kuTVgyNSBTb0MgQ2FtZXJhIEhvc3QgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJTYXNjaGEgSGF1ZXIgPHNoYUBwZW5ndXRyb25peC5kZT4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKE1YMl9DQU1fVkVSU0lPTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL214M19jYW1lcmEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXgzX2NhbWVyYS5jCmluZGV4IGM3NjgwZWIuLmMwNDViNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXgzX2NhbWVyYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXgzX2NhbWVyYS5jCkBAIC0xMSw3ICsxMSw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgpAQCAtMTk1LDcgKzE5NCw3IEBACiAJCQl1bnNpZ25lZCBsb25nIHNpemVzW10sIHZvaWQgKmFsbG9jX2N0eHNbXSkKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHNvY19jYW1lcmFfZnJvbV92YjJxKHZxKTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBteDNfY2FtZXJhX2RldiAqbXgzX2NhbSA9IGljaS0+cHJpdjsKIAlpbnQgYnl0ZXNfcGVyX2xpbmUgPSBzb2NfbWJ1c19ieXRlc19wZXJfbGluZShpY2QtPnVzZXJfd2lkdGgsCiAJCQkJCQlpY2QtPmN1cnJlbnRfZm10LT5ob3N0X2ZtdCk7CkBAIC0yMjQsNyArMjIzLDcgQEAKIHN0YXRpYyBpbnQgbXgzX3ZpZGVvYnVmX3ByZXBhcmUoc3RydWN0IHZiMl9idWZmZXIgKnZiKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gc29jX2NhbWVyYV9mcm9tX3ZiMnEodmItPnZiMl9xdWV1ZSk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgzX2NhbWVyYV9kZXYgKm14M19jYW0gPSBpY2ktPnByaXY7CiAJc3RydWN0IGlkbWFjX2NoYW5uZWwgKmljaGFuID0gbXgzX2NhbS0+aWRtYWNfY2hhbm5lbFswXTsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwpAQCAtMjQyLDcgKzI0MSw3IEBACiAJbmV3X3NpemUgPSBieXRlc19wZXJfbGluZSAqIGljZC0+dXNlcl9oZWlnaHQ7CiAKIAlpZiAodmIyX3BsYW5lX3NpemUodmIsIDApIDwgbmV3X3NpemUpIHsKLQkJZGV2X2VycihpY2QtPmRldi5wYXJlbnQsICJCdWZmZXIgdG9vIHNtYWxsICglbHUgPCAlenUpXG4iLAorCQlkZXZfZXJyKGljZC0+cGFyZW50LCAiQnVmZmVyIHRvbyBzbWFsbCAoJWx1IDwgJXp1KVxuIiwKIAkJCXZiMl9wbGFuZV9zaXplKHZiLCAwKSwgbmV3X3NpemUpOwogCQlyZXR1cm4gLUVOT0JVRlM7CiAJfQpAQCAtMjg0LDcgKzI4Myw3IEBACiBzdGF0aWMgdm9pZCBteDNfdmlkZW9idWZfcXVldWUoc3RydWN0IHZiMl9idWZmZXIgKnZiKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gc29jX2NhbWVyYV9mcm9tX3ZiMnEodmItPnZiMl9xdWV1ZSk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgzX2NhbWVyYV9kZXYgKm14M19jYW0gPSBpY2ktPnByaXY7CiAJc3RydWN0IG14M19jYW1lcmFfYnVmZmVyICpidWYgPSB0b19teDNfdmIodmIpOwogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHhkID0gYnVmLT50eGQ7CkBAIC0zMzcsNyArMzM2LDcgQEAKIAlzcGluX3VubG9ja19pcnEoJm14M19jYW0tPmxvY2spOwogCiAJY29va2llID0gdHhkLT50eF9zdWJtaXQodHhkKTsKLQlkZXZfZGJnKGljZC0+ZGV2LnBhcmVudCwgIlN1Ym1pdHRlZCBjb29raWUgJWQgRE1BIDB4JTA4eFxuIiwKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiU3VibWl0dGVkIGNvb2tpZSAlZCBETUEgMHglMDh4XG4iLAogCQljb29raWUsIHNnX2RtYV9hZGRyZXNzKCZidWYtPnNnKSk7CiAKIAlpZiAoY29va2llID49IDApCkBAIC0zNTgsMTMgKzM1NywxMyBAQAogc3RhdGljIHZvaWQgbXgzX3ZpZGVvYnVmX3JlbGVhc2Uoc3RydWN0IHZiMl9idWZmZXIgKnZiKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gc29jX2NhbWVyYV9mcm9tX3ZiMnEodmItPnZiMl9xdWV1ZSk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgzX2NhbWVyYV9kZXYgKm14M19jYW0gPSBpY2ktPnByaXY7CiAJc3RydWN0IG14M19jYW1lcmFfYnVmZmVyICpidWYgPSB0b19teDNfdmIodmIpOwogCXN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdHhkID0gYnVmLT50eGQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWRldl9kYmcoaWNkLT5kZXYucGFyZW50LAorCWRldl9kYmcoaWNkLT5wYXJlbnQsCiAJCSJSZWxlYXNlJXMgRE1BIDB4JTA4eCwgcXVldWUgJXNlbXB0eVxuIiwKIAkJbXgzX2NhbS0+YWN0aXZlID09IGJ1ZiA/ICIgYWN0aXZlIiA6ICIiLCBzZ19kbWFfYWRkcmVzcygmYnVmLT5zZyksCiAJCWxpc3RfZW1wdHkoJmJ1Zi0+cXVldWUpID8gIiIgOiAibm90ICIpOwpAQCAtNDAzLDcgKzQwMiw3IEBACiBzdGF0aWMgaW50IG14M19zdG9wX3N0cmVhbWluZyhzdHJ1Y3QgdmIyX3F1ZXVlICpxKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gc29jX2NhbWVyYV9mcm9tX3ZiMnEocSk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgzX2NhbWVyYV9kZXYgKm14M19jYW0gPSBpY2ktPnByaXY7CiAJc3RydWN0IGlkbWFjX2NoYW5uZWwgKmljaGFuID0gbXgzX2NhbS0+aWRtYWNfY2hhbm5lbFswXTsKIAlzdHJ1Y3QgZG1hX2NoYW4gKmNoYW47CkBAIC00OTksNyArNDk4LDcgQEAKIAogCWNsa19lbmFibGUobXgzX2NhbS0+Y2xrKTsKIAlyYXRlID0gY2xrX3JvdW5kX3JhdGUobXgzX2NhbS0+Y2xrLCBteDNfY2FtLT5tY2xrKTsKLQlkZXZfZGJnKGljZC0+ZGV2LnBhcmVudCwgIlNldCBTRU5TX0NPTkYgdG8gJXgsIHJhdGUgJWxkXG4iLCBjb25mLCByYXRlKTsKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiU2V0IFNFTlNfQ09ORiB0byAleCwgcmF0ZSAlbGRcbiIsIGNvbmYsIHJhdGUpOwogCWlmIChyYXRlKQogCQljbGtfc2V0X3JhdGUobXgzX2NhbS0+Y2xrLCByYXRlKTsKIH0KQEAgLTUwNyw3ICs1MDYsNyBAQAogLyogQ2FsbGVkIHdpdGggLnZpZGVvX2xvY2sgaGVsZCAqLwogc3RhdGljIGludCBteDNfY2FtZXJhX2FkZF9kZXZpY2Uoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgzX2NhbWVyYV9kZXYgKm14M19jYW0gPSBpY2ktPnByaXY7CiAKIAlpZiAobXgzX2NhbS0+aWNkKQpAQCAtNTE3LDcgKzUxNiw3IEBACiAKIAlteDNfY2FtLT5pY2QgPSBpY2Q7CiAKLQlkZXZfaW5mbyhpY2QtPmRldi5wYXJlbnQsICJNWDMgQ2FtZXJhIGRyaXZlciBhdHRhY2hlZCB0byBjYW1lcmEgJWRcbiIsCisJZGV2X2luZm8oaWNkLT5wYXJlbnQsICJNWDMgQ2FtZXJhIGRyaXZlciBhdHRhY2hlZCB0byBjYW1lcmEgJWRcbiIsCiAJCSBpY2QtPmRldm51bSk7CiAKIAlyZXR1cm4gMDsKQEAgLTUyNiw3ICs1MjUsNyBAQAogLyogQ2FsbGVkIHdpdGggLnZpZGVvX2xvY2sgaGVsZCAqLwogc3RhdGljIHZvaWQgbXgzX2NhbWVyYV9yZW1vdmVfZGV2aWNlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IG14M19jYW1lcmFfZGV2ICpteDNfY2FtID0gaWNpLT5wcml2OwogCXN0cnVjdCBpZG1hY19jaGFubmVsICoqaWNoYW4gPSAmbXgzX2NhbS0+aWRtYWNfY2hhbm5lbFswXTsKIApAQCAtNTQxLDcgKzU0MCw3IEBACiAKIAlteDNfY2FtLT5pY2QgPSBOVUxMOwogCi0JZGV2X2luZm8oaWNkLT5kZXYucGFyZW50LCAiTVgzIENhbWVyYSBkcml2ZXIgZGV0YWNoZWQgZnJvbSBjYW1lcmEgJWRcbiIsCisJZGV2X2luZm8oaWNkLT5wYXJlbnQsICJNWDMgQ2FtZXJhIGRyaXZlciBkZXRhY2hlZCBmcm9tIGNhbWVyYSAlZFxuIiwKIAkJIGljZC0+ZGV2bnVtKTsKIH0KIApAQCAtNjA4LDEyICs2MDcsMTIgQEAKIHN0YXRpYyBpbnQgbXgzX2NhbWVyYV90cnlfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAogCQkJCSAgICBjb25zdCB1bnNpZ25lZCBpbnQgZGVwdGgpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgzX2NhbWVyYV9kZXYgKm14M19jYW0gPSBpY2ktPnByaXY7CiAJdW5zaWduZWQgbG9uZyBidXNfZmxhZ3MsIGNhbWVyYV9mbGFnczsKIAlpbnQgcmV0ID0gdGVzdF9wbGF0Zm9ybV9wYXJhbShteDNfY2FtLCBkZXB0aCwgJmJ1c19mbGFncyk7CiAKLQlkZXZfZGJnKGljZC0+ZGV2LnBhcmVudCwgInJlcXVlc3QgYnVzIHdpZHRoICVkIGJpdDogJWRcbiIsIGRlcHRoLCByZXQpOworCWRldl9kYmcoaWNkLT5wYXJlbnQsICJyZXF1ZXN0IGJ1cyB3aWR0aCAlZCBiaXQ6ICVkXG4iLCBkZXB0aCwgcmV0KTsKIAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwpAQCAtNjIyLDcgKzYyMSw3IEBACiAKIAlyZXQgPSBzb2NfY2FtZXJhX2J1c19wYXJhbV9jb21wYXRpYmxlKGNhbWVyYV9mbGFncywgYnVzX2ZsYWdzKTsKIAlpZiAocmV0IDwgMCkKLQkJZGV2X3dhcm4oaWNkLT5kZXYucGFyZW50LAorCQlkZXZfd2FybihpY2QtPnBhcmVudCwKIAkJCSAiRmxhZ3MgaW5jb21wYXRpYmxlOiBjYW1lcmEgJWx4LCBob3N0ICVseFxuIiwKIAkJCSBjYW1lcmFfZmxhZ3MsIGJ1c19mbGFncyk7CiAKQEAgLTY3Niw3ICs2NzUsNyBAQAogCQkJCSAgc3RydWN0IHNvY19jYW1lcmFfZm9ybWF0X3hsYXRlICp4bGF0ZSkKIHsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpY2QtPmRldi5wYXJlbnQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5wYXJlbnQ7CiAJaW50IGZvcm1hdHMgPSAwLCByZXQ7CiAJZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlIGNvZGU7CiAJY29uc3Qgc3RydWN0IHNvY19tYnVzX3BpeGVsZm10ICpmbXQ7CkBAIC02ODgsNyArNjg3LDcgQEAKIAogCWZtdCA9IHNvY19tYnVzX2dldF9mbXRkZXNjKGNvZGUpOwogCWlmICghZm10KSB7Ci0JCWRldl93YXJuKGljZC0+ZGV2LnBhcmVudCwKKwkJZGV2X3dhcm4oaWNkLT5wYXJlbnQsCiAJCQkgIlVuc3VwcG9ydGVkIGZvcm1hdCBjb2RlICMldTogJWRcbiIsIGlkeCwgY29kZSk7CiAJCXJldHVybiAwOwogCX0KQEAgLTgxNiw3ICs4MTUsNyBAQAogCQkJICAgICAgIHN0cnVjdCB2NGwyX2Nyb3AgKmEpCiB7CiAJc3RydWN0IHY0bDJfcmVjdCAqcmVjdCA9ICZhLT5jOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IG14M19jYW1lcmFfZGV2ICpteDNfY2FtID0gaWNpLT5wcml2OwogCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOwogCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgbWY7CkBAIC04NDksNyArODQ4LDcgQEAKIAkJY29uZmlndXJlX2dlb21ldHJ5KG14M19jYW0sIG1mLndpZHRoLCBtZi5oZWlnaHQsCiAJCQkJICAgaWNkLT5jdXJyZW50X2ZtdC0+aG9zdF9mbXQpOwogCi0JZGV2X2RiZyhpY2QtPmRldi5wYXJlbnQsICJTZW5zb3IgY3JvcHBlZCAlZHglZFxuIiwKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiU2Vuc29yIGNyb3BwZWQgJWR4JWRcbiIsCiAJCW1mLndpZHRoLCBtZi5oZWlnaHQpOwogCiAJaWNkLT51c2VyX3dpZHRoCQk9IG1mLndpZHRoOwpAQCAtODYxLDcgKzg2MCw3IEBACiBzdGF0aWMgaW50IG14M19jYW1lcmFfc2V0X2ZtdChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKIAkJCSAgICAgIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKIHsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBteDNfY2FtZXJhX2RldiAqbXgzX2NhbSA9IGljaS0+cHJpdjsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKIAljb25zdCBzdHJ1Y3Qgc29jX2NhbWVyYV9mb3JtYXRfeGxhdGUgKnhsYXRlOwpAQCAtODcxLDEzICs4NzAsMTMgQEAKIAogCXhsYXRlID0gc29jX2NhbWVyYV94bGF0ZV9ieV9mb3VyY2MoaWNkLCBwaXgtPnBpeGVsZm9ybWF0KTsKIAlpZiAoIXhsYXRlKSB7Ci0JCWRldl93YXJuKGljZC0+ZGV2LnBhcmVudCwgIkZvcm1hdCAleCBub3QgZm91bmRcbiIsCisJCWRldl93YXJuKGljZC0+cGFyZW50LCAiRm9ybWF0ICV4IG5vdCBmb3VuZFxuIiwKIAkJCSBwaXgtPnBpeGVsZm9ybWF0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJc3RyaWRlX2FsaWduKCZwaXgtPndpZHRoKTsKLQlkZXZfZGJnKGljZC0+ZGV2LnBhcmVudCwgIlNldCBmb3JtYXQgJWR4JWRcbiIsIHBpeC0+d2lkdGgsIHBpeC0+aGVpZ2h0KTsKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiU2V0IGZvcm1hdCAlZHglZFxuIiwgcGl4LT53aWR0aCwgcGl4LT5oZWlnaHQpOwogCiAJLyoKIAkgKiBNaWdodCBoYXZlIHRvIHBlcmZvcm0gYSBjb21wbGV0ZSBpbnRlcmZhY2UgaW5pdGlhbGlzYXRpb24gbGlrZSBpbgpAQCAtOTEzLDEzICs5MTIsNyBAQAogCXBpeC0+Y29sb3JzcGFjZQkJPSBtZi5jb2xvcnNwYWNlOwogCWljZC0+Y3VycmVudF9mbXQJPSB4bGF0ZTsKIAotCXBpeC0+Ynl0ZXNwZXJsaW5lID0gc29jX21idXNfYnl0ZXNfcGVyX2xpbmUocGl4LT53aWR0aCwKLQkJCQkJCSAgICB4bGF0ZS0+aG9zdF9mbXQpOwotCWlmIChwaXgtPmJ5dGVzcGVybGluZSA8IDApCi0JCXJldHVybiBwaXgtPmJ5dGVzcGVybGluZTsKLQlwaXgtPnNpemVpbWFnZSA9IHBpeC0+aGVpZ2h0ICogcGl4LT5ieXRlc3BlcmxpbmU7Ci0KLQlkZXZfZGJnKGljZC0+ZGV2LnBhcmVudCwgIlNlbnNvciBzZXQgJWR4JWRcbiIsIHBpeC0+d2lkdGgsIHBpeC0+aGVpZ2h0KTsKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiU2Vuc29yIHNldCAlZHglZFxuIiwgcGl4LT53aWR0aCwgcGl4LT5oZWlnaHQpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTkzNiw3ICs5MjksNyBAQAogCiAJeGxhdGUgPSBzb2NfY2FtZXJhX3hsYXRlX2J5X2ZvdXJjYyhpY2QsIHBpeGZtdCk7CiAJaWYgKHBpeGZtdCAmJiAheGxhdGUpIHsKLQkJZGV2X3dhcm4oaWNkLT5kZXYucGFyZW50LCAiRm9ybWF0ICV4IG5vdCBmb3VuZFxuIiwgcGl4Zm10KTsKKwkJZGV2X3dhcm4oaWNkLT5wYXJlbnQsICJGb3JtYXQgJXggbm90IGZvdW5kXG4iLCBwaXhmbXQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTk0NiwxMiArOTM5LDYgQEAKIAlpZiAocGl4LT53aWR0aCA+IDQwOTYpCiAJCXBpeC0+d2lkdGggPSA0MDk2OwogCi0JcGl4LT5ieXRlc3BlcmxpbmUgPSBzb2NfbWJ1c19ieXRlc19wZXJfbGluZShwaXgtPndpZHRoLAotCQkJCQkJICAgIHhsYXRlLT5ob3N0X2ZtdCk7Ci0JaWYgKHBpeC0+Ynl0ZXNwZXJsaW5lIDwgMCkKLQkJcmV0dXJuIHBpeC0+Ynl0ZXNwZXJsaW5lOwotCXBpeC0+c2l6ZWltYWdlID0gcGl4LT5oZWlnaHQgKiBwaXgtPmJ5dGVzcGVybGluZTsKLQogCS8qIGxpbWl0IHRvIHNlbnNvciBjYXBhYmlsaXRpZXMgKi8KIAltZi53aWR0aAk9IHBpeC0+d2lkdGg7CiAJbWYuaGVpZ2h0CT0gcGl4LT5oZWlnaHQ7CkBAIC05NzQsNyArOTYxLDcgQEAKIAljYXNlIFY0TDJfRklFTERfTk9ORToKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZGV2X2VycihpY2QtPmRldi5wYXJlbnQsICJGaWVsZCB0eXBlICVkIHVuc3VwcG9ydGVkLlxuIiwKKwkJZGV2X2VycihpY2QtPnBhcmVudCwgIkZpZWxkIHR5cGUgJWQgdW5zdXBwb3J0ZWQuXG4iLAogCQkJbWYuZmllbGQpOwogCQlyZXQgPSAtRUlOVkFMOwogCX0KQEAgLTEwMDAsNyArOTg3LDYgQEAKIHsKIAkvKiBjYXAtPm5hbWUgaXMgc2V0IGJ5IHRoZSBmaXJlbmRseSBjYWxsZXI6LT4gKi8KIAlzdHJsY3B5KGNhcC0+Y2FyZCwgImkuTVgzeCBDYW1lcmEiLCBzaXplb2YoY2FwLT5jYXJkKSk7Ci0JY2FwLT52ZXJzaW9uID0gS0VSTkVMX1ZFUlNJT04oMCwgMiwgMik7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwgVjRMMl9DQVBfU1RSRUFNSU5HOwogCiAJcmV0dXJuIDA7CkBAIC0xMDA4LDcgKzk5NCw3IEBACiAKIHN0YXRpYyBpbnQgbXgzX2NhbWVyYV9zZXRfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLCBfX3UzMiBwaXhmbXQpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgbXgzX2NhbWVyYV9kZXYgKm14M19jYW0gPSBpY2ktPnByaXY7CiAJdW5zaWduZWQgbG9uZyBidXNfZmxhZ3MsIGNhbWVyYV9mbGFncywgY29tbW9uX2ZsYWdzOwogCXUzMiBkdywgc2Vuc19jb25mOwpAQCAtMTAxNiw3ICsxMDAyLDcgQEAKIAlpbnQgYnVzd2lkdGg7CiAJaW50IHJldDsKIAljb25zdCBzdHJ1Y3Qgc29jX2NhbWVyYV9mb3JtYXRfeGxhdGUgKnhsYXRlOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGljZC0+ZGV2LnBhcmVudDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpY2QtPnBhcmVudDsKIAogCWZtdCA9IHNvY19tYnVzX2dldF9mbXRkZXNjKGljZC0+Y3VycmVudF9mbXQtPmNvZGUpOwogCWlmICghZm10KQpAQCAtMTMyNSw0ICsxMzExLDUgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiaS5NWDN4IFNvQyBDYW1lcmEgSG9zdCBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIkd1ZW5uYWRpIExpYWtob3ZldHNraSA8bGdAZGVueC5kZT4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9WRVJTSU9OKCIwLjIuMyIpOwogTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybToiIE1YM19DQU1fRFJWX05BTUUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL0tjb25maWcgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvS2NvbmZpZwppbmRleCBlNjMyMzNmZC4uMzkwYWIwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL0tjb25maWcKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL0tjb25maWcKQEAgLTEsMTEgKzEsMTQgQEAKK2NvbmZpZyBWSURFT19PTUFQMl9WT1VUX1ZSRkIKKwlib29sCisKIGNvbmZpZyBWSURFT19PTUFQMl9WT1VUCiAJdHJpc3RhdGUgIk9NQVAyL09NQVAzIFY0TDItRGlzcGxheSBkcml2ZXIiCiAJZGVwZW5kcyBvbiBBUkNIX09NQVAyIHx8IEFSQ0hfT01BUDMKIAlzZWxlY3QgVklERU9CVUZfR0VOCiAJc2VsZWN0IFZJREVPQlVGX0RNQV9DT05USUcKIAlzZWxlY3QgT01BUDJfRFNTCi0Jc2VsZWN0IE9NQVAyX1ZSQU0KLQlzZWxlY3QgT01BUDJfVlJGQgorCXNlbGVjdCBPTUFQMl9WUkZCIGlmIEFSQ0hfT01BUDIgfHwgQVJDSF9PTUFQMworCXNlbGVjdCBWSURFT19PTUFQMl9WT1VUX1ZSRkIgaWYgVklERU9fT01BUDJfVk9VVCAmJiBPTUFQMl9WUkZCCiAJZGVmYXVsdCBuCiAJLS0taGVscC0tLQogCSAgVjRMMiBEaXNwbGF5IGRyaXZlciBzdXBwb3J0IGZvciBPTUFQMi8zIGJhc2VkIGJvYXJkcy4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9NYWtlZmlsZQppbmRleCBiMjg3ODgwNy4uZmM0MTBiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9NYWtlZmlsZQpAQCAtNCw0ICs0LDUgQEAKIAogIyBPTUFQMi8zIERpc3BsYXkgZHJpdmVyCiBvbWFwLXZvdXQteSA6PSBvbWFwX3ZvdXQubyBvbWFwX3ZvdXRsaWIubworb21hcC12b3V0LSQoQ09ORklHX1ZJREVPX09NQVAyX1ZPVVRfVlJGQikgKz0gb21hcF92b3V0X3ZyZmIubwogb2JqLSQoQ09ORklHX1ZJREVPX09NQVAyX1ZPVVQpICs9IG9tYXAtdm91dC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvb21hcF92b3V0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvb21hcF92b3V0LmMKaW5kZXggYTY0Nzg5NC4uYjVlZjM2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL29tYXBfdm91dC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9vbWFwX3ZvdXQuYwpAQCAtMzUsMjggKzM1LDI2IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAKICNpbmNsdWRlIDxtZWRpYS92aWRlb2J1Zi1kbWEtY29udGlnLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CiAKICNpbmNsdWRlIDxwbGF0L2RtYS5oPgotI2luY2x1ZGUgPHBsYXQvdnJhbS5oPgogI2luY2x1ZGUgPHBsYXQvdnJmYi5oPgogI2luY2x1ZGUgPHZpZGVvL29tYXBkc3MuaD4KIAogI2luY2x1ZGUgIm9tYXBfdm91dGxpYi5oIgogI2luY2x1ZGUgIm9tYXBfdm91dGRlZi5oIgorI2luY2x1ZGUgIm9tYXBfdm91dF92cmZiLmgiCiAKIE1PRFVMRV9BVVRIT1IoIlRleGFzIEluc3RydW1lbnRzIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIk9NQVAgVmlkZW8gZm9yIExpbnV4IFZpZGVvIG91dCBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAotCiAvKiBEcml2ZXIgQ29uZmlndXJhdGlvbiBtYWNyb3MgKi8KICNkZWZpbmUgVk9VVF9OQU1FCQkib21hcF92b3V0IgogCkBAIC02NSwzMSArNjMsNiBAQAogCU9NQVBfVklERU8yLAogfTsKIAotZW51bSBkbWFfY2hhbm5lbF9zdGF0ZSB7Ci0JRE1BX0NIQU5fTk9UX0FMTE9URUQsCi0JRE1BX0NIQU5fQUxMT1RFRCwKLX07Ci0KLSNkZWZpbmUgUVFWR0FfV0lEVEgJCTE2MAotI2RlZmluZSBRUVZHQV9IRUlHSFQJCTEyMAotCi0vKiBNYXggUmVzb2x1dGlvbiBzdXBwb3J0ZWQgYnkgdGhlIGRyaXZlciAqLwotI2RlZmluZSBWSURfTUFYX1dJRFRICQkxMjgwCS8qIExhcmdlc3Qgd2lkdGggKi8KLSNkZWZpbmUgVklEX01BWF9IRUlHSFQJCTcyMAkvKiBMYXJnZXN0IGhlaWdodCAqLwotCi0vKiBNaW1pbXVtIHJlcXVpcmVtZW50IGlzIDJ4MiBmb3IgRFNTICovCi0jZGVmaW5lIFZJRF9NSU5fV0lEVEgJCTIKLSNkZWZpbmUgVklEX01JTl9IRUlHSFQJCTIKLQotLyogMjA0OCB4IDIwNDggaXMgbWF4IHJlcyBzdXBwb3J0ZWQgYnkgT01BUCBkaXNwbGF5IGNvbnRyb2xsZXIgKi8KLSNkZWZpbmUgTUFYX1BJWEVMU19QRVJfTElORSAgICAgMjA0OAotCi0jZGVmaW5lIFZSRkJfVFhfVElNRU9VVCAgICAgICAgIDEwMDAKLSNkZWZpbmUgVlJGQl9OVU1fQlVGUwkJNAotCi0vKiBNYXggYnVmZmVyIHNpemUgdG9iZSBhbGxvY2F0ZWQgZHVyaW5nIGluaXQgKi8KLSNkZWZpbmUgT01BUF9WT1VUX01BWF9CVUZfU0laRSAoVklEX01BWF9XSURUSCpWSURfTUFYX0hFSUdIVCo0KQotCiBzdGF0aWMgc3RydWN0IHZpZGVvYnVmX3F1ZXVlX29wcyB2aWRlb192YnFfb3BzOwogLyogVmFyaWFibGVzIGNvbmZpZ3VyYWJsZSB0aHJvdWdoIG1vZHVsZSBwYXJhbXMqLwogc3RhdGljIHUzMiB2aWRlbzFfbnVtYnVmZmVycyA9IDM7CkBAIC0xNzIsODQgKzE0NSw2IEBACiAjZGVmaW5lIE5VTV9PVVRQVVRfRk9STUFUUyAoQVJSQVlfU0laRShvbWFwX2Zvcm1hdHMpKQogCiAvKgotICogQWxsb2NhdGUgYnVmZmVycwotICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBvbWFwX3ZvdXRfYWxsb2NfYnVmZmVyKHUzMiBidWZfc2l6ZSwgdTMyICpwaHlzX2FkZHIpCi17Ci0JdTMyIG9yZGVyLCBzaXplOwotCXVuc2lnbmVkIGxvbmcgdmlydF9hZGRyLCBhZGRyOwotCi0Jc2l6ZSA9IFBBR0VfQUxJR04oYnVmX3NpemUpOwotCW9yZGVyID0gZ2V0X29yZGVyKHNpemUpOwotCXZpcnRfYWRkciA9IF9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCB8IEdGUF9ETUEsIG9yZGVyKTsKLQlhZGRyID0gdmlydF9hZGRyOwotCi0JaWYgKHZpcnRfYWRkcikgewotCQl3aGlsZSAoc2l6ZSA+IDApIHsKLQkJCVNldFBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2UoYWRkcikpOwotCQkJYWRkciArPSBQQUdFX1NJWkU7Ci0JCQlzaXplIC09IFBBR0VfU0laRTsKLQkJfQotCX0KLQkqcGh5c19hZGRyID0gKHUzMikgdmlydF90b19waHlzKCh2b2lkICopIHZpcnRfYWRkcik7Ci0JcmV0dXJuIHZpcnRfYWRkcjsKLX0KLQotLyoKLSAqIEZyZWUgYnVmZmVycwotICovCi1zdGF0aWMgdm9pZCBvbWFwX3ZvdXRfZnJlZV9idWZmZXIodW5zaWduZWQgbG9uZyB2aXJ0YWRkciwgdTMyIGJ1Zl9zaXplKQotewotCXUzMiBvcmRlciwgc2l6ZTsKLQl1bnNpZ25lZCBsb25nIGFkZHIgPSB2aXJ0YWRkcjsKLQotCXNpemUgPSBQQUdFX0FMSUdOKGJ1Zl9zaXplKTsKLQlvcmRlciA9IGdldF9vcmRlcihzaXplKTsKLQotCXdoaWxlIChzaXplID4gMCkgewotCQlDbGVhclBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2UoYWRkcikpOwotCQlhZGRyICs9IFBBR0VfU0laRTsKLQkJc2l6ZSAtPSBQQUdFX1NJWkU7Ci0JfQotCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIHZpcnRhZGRyLCBvcmRlcik7Ci19Ci0KLS8qCi0gKiBGdW5jdGlvbiBmb3IgYWxsb2NhdGluZyB2aWRlbyBidWZmZXJzCi0gKi8KLXN0YXRpYyBpbnQgb21hcF92b3V0X2FsbG9jYXRlX3ZyZmJfYnVmZmVycyhzdHJ1Y3Qgb21hcF92b3V0X2RldmljZSAqdm91dCwKLQkJdW5zaWduZWQgaW50ICpjb3VudCwgaW50IHN0YXJ0aW5kZXgpCi17Ci0JaW50IGksIGo7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgKmNvdW50OyBpKyspIHsKLQkJaWYgKCF2b3V0LT5zbXNzaGFkb192aXJ0X2FkZHJbaV0pIHsKLQkJCXZvdXQtPnNtc3NoYWRvX3ZpcnRfYWRkcltpXSA9Ci0JCQkJb21hcF92b3V0X2FsbG9jX2J1ZmZlcih2b3V0LT5zbXNzaGFkb19zaXplLAotCQkJCQkJJnZvdXQtPnNtc3NoYWRvX3BoeV9hZGRyW2ldKTsKLQkJfQotCQlpZiAoIXZvdXQtPnNtc3NoYWRvX3ZpcnRfYWRkcltpXSAmJiBzdGFydGluZGV4ICE9IC0xKSB7Ci0JCQlpZiAoVjRMMl9NRU1PUllfTU1BUCA9PSB2b3V0LT5tZW1vcnkgJiYgaSA+PSBzdGFydGluZGV4KQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmICghdm91dC0+c21zc2hhZG9fdmlydF9hZGRyW2ldKSB7Ci0JCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKSB7Ci0JCQkJb21hcF92b3V0X2ZyZWVfYnVmZmVyKAotCQkJCQkJdm91dC0+c21zc2hhZG9fdmlydF9hZGRyW2pdLAotCQkJCQkJdm91dC0+c21zc2hhZG9fc2l6ZSk7Ci0JCQkJdm91dC0+c21zc2hhZG9fdmlydF9hZGRyW2pdID0gMDsKLQkJCQl2b3V0LT5zbXNzaGFkb19waHlfYWRkcltqXSA9IDA7Ci0JCQl9Ci0JCQkqY291bnQgPSAwOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQkJbWVtc2V0KCh2b2lkICopIHZvdXQtPnNtc3NoYWRvX3ZpcnRfYWRkcltpXSwgMCwKLQkJCQl2b3V0LT5zbXNzaGFkb19zaXplKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCiAgKiBUcnkgZm9ybWF0CiAgKi8KIHN0YXRpYyBpbnQgb21hcF92b3V0X3RyeV9mb3JtYXQoc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4KQpAQCAtMzQyLDczICsyMzcsOSBAQAogfQogCiAvKgotICogV2FrZXMgdXAgdGhlIGFwcGxpY2F0aW9uIG9uY2UgdGhlIERNQSB0cmFuc2ZlciB0byBWUkZCIHNwYWNlIGlzIGNvbXBsZXRlZC4KLSAqLwotc3RhdGljIHZvaWQgb21hcF92b3V0X3ZyZmJfZG1hX3R4X2NhbGxiYWNrKGludCBsY2gsIHUxNiBjaF9zdGF0dXMsIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHZpZF92cmZiX2RtYSAqdCA9IChzdHJ1Y3QgdmlkX3ZyZmJfZG1hICopIGRhdGE7Ci0KLQl0LT50eF9zdGF0dXMgPSAxOwotCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdC0+d2FpdCk7Ci19Ci0KLS8qCi0gKiBSZWxlYXNlIHRoZSBWUkZCIGNvbnRleHQgb25jZSB0aGUgbW9kdWxlIGV4aXRzCi0gKi8KLXN0YXRpYyB2b2lkIG9tYXBfdm91dF9yZWxlYXNlX3ZyZmIoc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgVlJGQl9OVU1fQlVGUzsgaSsrKQotCQlvbWFwX3ZyZmJfcmVsZWFzZV9jdHgoJnZvdXQtPnZyZmJfY29udGV4dFtpXSk7Ci0KLQlpZiAodm91dC0+dnJmYl9kbWFfdHgucmVxX3N0YXR1cyA9PSBETUFfQ0hBTl9BTExPVEVEKSB7Ci0JCXZvdXQtPnZyZmJfZG1hX3R4LnJlcV9zdGF0dXMgPSBETUFfQ0hBTl9OT1RfQUxMT1RFRDsKLQkJb21hcF9mcmVlX2RtYSh2b3V0LT52cmZiX2RtYV90eC5kbWFfY2gpOwotCX0KLX0KLQotLyoKLSAqIFJldHVybiB0cnVlIGlmIHJvdGF0aW9uIGlzIDkwIG9yIDI3MAotICovCi1zdGF0aWMgaW5saW5lIGludCByb3RhdGVfOTBfb3JfMjcwKGNvbnN0IHN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0KQotewotCXJldHVybiAodm91dC0+cm90YXRpb24gPT0gZHNzX3JvdGF0aW9uXzkwX2RlZ3JlZSB8fAotCQkJdm91dC0+cm90YXRpb24gPT0gZHNzX3JvdGF0aW9uXzI3MF9kZWdyZWUpOwotfQotCi0vKgotICogUmV0dXJuIHRydWUgaWYgcm90YXRpb24gaXMgZW5hYmxlZAotICovCi1zdGF0aWMgaW5saW5lIGludCByb3RhdGlvbl9lbmFibGVkKGNvbnN0IHN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0KQotewotCXJldHVybiB2b3V0LT5yb3RhdGlvbiB8fCB2b3V0LT5taXJyb3I7Ci19Ci0KLS8qCi0gKiBSZXZlcnNlIHRoZSByb3RhdGlvbiBkZWdyZWUgaWYgbWlycm9yaW5nIGlzIGVuYWJsZWQKLSAqLwotc3RhdGljIGlubGluZSBpbnQgY2FsY19yb3RhdGlvbihjb25zdCBzdHJ1Y3Qgb21hcF92b3V0X2RldmljZSAqdm91dCkKLXsKLQlpZiAoIXZvdXQtPm1pcnJvcikKLQkJcmV0dXJuIHZvdXQtPnJvdGF0aW9uOwotCi0Jc3dpdGNoICh2b3V0LT5yb3RhdGlvbikgewotCWNhc2UgZHNzX3JvdGF0aW9uXzkwX2RlZ3JlZToKLQkJcmV0dXJuIGRzc19yb3RhdGlvbl8yNzBfZGVncmVlOwotCWNhc2UgZHNzX3JvdGF0aW9uXzI3MF9kZWdyZWU6Ci0JCXJldHVybiBkc3Nfcm90YXRpb25fOTBfZGVncmVlOwotCWNhc2UgZHNzX3JvdGF0aW9uXzE4MF9kZWdyZWU6Ci0JCXJldHVybiBkc3Nfcm90YXRpb25fMF9kZWdyZWU7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIGRzc19yb3RhdGlvbl8xODBfZGVncmVlOwotCX0KLX0KLQotLyoKICAqIEZyZWUgdGhlIFY0TDIgYnVmZmVycwogICovCi1zdGF0aWMgdm9pZCBvbWFwX3ZvdXRfZnJlZV9idWZmZXJzKHN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0KQordm9pZCBvbWFwX3ZvdXRfZnJlZV9idWZmZXJzKHN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0KQogewogCWludCBpLCBudW1idWZmZXJzOwogCkBAIC00MjUsNTIgKzI1Niw2IEBACiB9CiAKIC8qCi0gKiBGcmVlIFZSRkIgYnVmZmVycwotICovCi1zdGF0aWMgdm9pZCBvbWFwX3ZvdXRfZnJlZV92cmZiX2J1ZmZlcnMoc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQpCi17Ci0JaW50IGo7Ci0KLQlmb3IgKGogPSAwOyBqIDwgVlJGQl9OVU1fQlVGUzsgaisrKSB7Ci0JCW9tYXBfdm91dF9mcmVlX2J1ZmZlcih2b3V0LT5zbXNzaGFkb192aXJ0X2FkZHJbal0sCi0JCQkJdm91dC0+c21zc2hhZG9fc2l6ZSk7Ci0JCXZvdXQtPnNtc3NoYWRvX3ZpcnRfYWRkcltqXSA9IDA7Ci0JCXZvdXQtPnNtc3NoYWRvX3BoeV9hZGRyW2pdID0gMDsKLQl9Ci19Ci0KLS8qCi0gKiBBbGxvY2F0ZSB0aGUgYnVmZmVycyBmb3IgdGhlIFZSRkIgc3BhY2UuICBEYXRhIGlzIGNvcGllZCBmcm9tIFY0TDIKLSAqIGJ1ZmZlcnMgdG8gdGhlIFZSRkIgYnVmZmVycyB1c2luZyB0aGUgRE1BIGVuZ2luZS4KLSAqLwotc3RhdGljIGludCBvbWFwX3ZvdXRfdnJmYl9idWZmZXJfc2V0dXAoc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQsCi0JCQkgIHVuc2lnbmVkIGludCAqY291bnQsIHVuc2lnbmVkIGludCBzdGFydGluZGV4KQotewotCWludCBpOwotCWJvb2wgeXV2X21vZGU7Ci0KLQkvKiBBbGxvY2F0ZSB0aGUgVlJGQiBidWZmZXJzIG9ubHkgaWYgdGhlIGJ1ZmZlcnMgYXJlIG5vdAotCSAqIGFsbG9jYXRlZCBkdXJpbmcgaW5pdCB0aW1lLgotCSAqLwotCWlmICgocm90YXRpb25fZW5hYmxlZCh2b3V0KSkgJiYgIXZvdXQtPnZyZmJfc3RhdGljX2FsbG9jYXRpb24pCi0JCWlmIChvbWFwX3ZvdXRfYWxsb2NhdGVfdnJmYl9idWZmZXJzKHZvdXQsIGNvdW50LCBzdGFydGluZGV4KSkKLQkJCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKHZvdXQtPmRzc19tb2RlID09IE9NQVBfRFNTX0NPTE9SX1lVVjIgfHwKLQkJCXZvdXQtPmRzc19tb2RlID09IE9NQVBfRFNTX0NPTE9SX1VZVlkpCi0JCXl1dl9tb2RlID0gdHJ1ZTsKLQllbHNlCi0JCXl1dl9tb2RlID0gZmFsc2U7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgKmNvdW50OyBpKyspCi0JCW9tYXBfdnJmYl9zZXR1cCgmdm91dC0+dnJmYl9jb250ZXh0W2ldLAotCQkJCXZvdXQtPnNtc3NoYWRvX3BoeV9hZGRyW2ldLCB2b3V0LT5waXgud2lkdGgsCi0JCQkJdm91dC0+cGl4LmhlaWdodCwgdm91dC0+YnBwLCB5dXZfbW9kZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoKICAqIENvbnZlcnQgVjRMMiByb3RhdGlvbiB0byBEU1Mgcm90YXRpb24KICAqCVY0TDIgdW5kZXJzdGFuZCAwLCA5MCwgMTgwLCAyNzAuCiAgKglDb252ZXJ0IHRvIDAsIDEsIDIgYW5kIDMgcmVzcGVjdGl2ZWx5IGZvciBEU1MKQEAgLTQ5OSwxMjQgKzI4NCwzOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qCi0gKiBDYWxjdWxhdGUgdGhlIGJ1ZmZlciBvZmZzZXRzIGZyb20gd2hpY2ggdGhlIHN0cmVhbWluZyBzaG91bGQKLSAqIHN0YXJ0LiBUaGlzIG9mZnNldCBjYWxjdWxhdGlvbiBpcyBtYWlubHkgcmVxdWlyZWQgYmVjYXVzZSBvZgotICogdGhlIFZSRkIgMzIgcGl4ZWxzIGFsaWdubWVudCB3aXRoIHJvdGF0aW9uLgotICovCiBzdGF0aWMgaW50IG9tYXBfdm91dF9jYWxjdWxhdGVfb2Zmc2V0KHN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0KQogewotCXN0cnVjdCBvbWFwX292ZXJsYXkgKm92bDsKLQllbnVtIGRzc19yb3RhdGlvbiByb3RhdGlvbjsKIAlzdHJ1Y3Qgb21hcHZpZGVvX2luZm8gKm92aWQ7Ci0JYm9vbCBtaXJyb3JpbmcgPSB2b3V0LT5taXJyb3I7Ci0Jc3RydWN0IG9tYXBfZHNzX2RldmljZSAqY3VyX2Rpc3BsYXk7CiAJc3RydWN0IHY0bDJfcmVjdCAqY3JvcCA9ICZ2b3V0LT5jcm9wOwogCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeCA9ICZ2b3V0LT5waXg7CiAJaW50ICpjcm9wcGVkX29mZnNldCA9ICZ2b3V0LT5jcm9wcGVkX29mZnNldDsKLQlpbnQgdnJfcHMgPSAxLCBwcyA9IDIsIHRlbXBfcHMgPSAyOwotCWludCBvZmZzZXQgPSAwLCBjdG9wID0gMCwgY2xlZnQgPSAwLCBsaW5lX2xlbmd0aCA9IDA7CisJaW50IHBzID0gMiwgbGluZV9sZW5ndGggPSAwOwogCiAJb3ZpZCA9ICZ2b3V0LT52aWRfaW5mbzsKLQlvdmwgPSBvdmlkLT5vdmVybGF5c1swXTsKLQkvKiBnZXQgdGhlIGRpc3BsYXkgZGV2aWNlIGF0dGFjaGVkIHRvIHRoZSBvdmVybGF5ICovCi0JaWYgKCFvdmwtPm1hbmFnZXIgfHwgIW92bC0+bWFuYWdlci0+ZGV2aWNlKQotCQlyZXR1cm4gLTE7CiAKLQljdXJfZGlzcGxheSA9IG92bC0+bWFuYWdlci0+ZGV2aWNlOwotCXJvdGF0aW9uID0gY2FsY19yb3RhdGlvbih2b3V0KTsKLQotCWlmIChWNEwyX1BJWF9GTVRfWVVZViA9PSBwaXgtPnBpeGVsZm9ybWF0IHx8Ci0JCQlWNEwyX1BJWF9GTVRfVVlWWSA9PSBwaXgtPnBpeGVsZm9ybWF0KSB7Ci0JCWlmIChyb3RhdGlvbl9lbmFibGVkKHZvdXQpKSB7Ci0JCQkvKgotCQkJICogcHMgICAgLSBBY3R1YWwgcGl4ZWwgc2l6ZSBmb3IgWVVZVi9VWVZZIGZvcgotCQkJICogICAgICAgICBWUkZCL01pcnJvcmluZyBpcyA0IGJ5dGVzCi0JCQkgKiB2cl9wcyAtIFZpcnR1YWxseSBwaXhlbCBzaXplIGZvciBZVVlWL1VZVlkgaXMKLQkJCSAqICAgICAgICAgMiBieXRlcwotCQkJICovCi0JCQlwcyA9IDQ7Ci0JCQl2cl9wcyA9IDI7Ci0JCX0gZWxzZSB7Ci0JCQlwcyA9IDI7CS8qIG90aGVyd2lzZSB0aGUgcGl4ZWwgc2l6ZSBpcyAyIGJ5dGUgKi8KLQkJfQotCX0gZWxzZSBpZiAoVjRMMl9QSVhfRk1UX1JHQjMyID09IHBpeC0+cGl4ZWxmb3JtYXQpIHsKLQkJcHMgPSA0OwotCX0gZWxzZSBpZiAoVjRMMl9QSVhfRk1UX1JHQjI0ID09IHBpeC0+cGl4ZWxmb3JtYXQpIHsKLQkJcHMgPSAzOwotCX0KLQl2b3V0LT5wcyA9IHBzOwotCXZvdXQtPnZyX3BzID0gdnJfcHM7Ci0KLQlpZiAocm90YXRpb25fZW5hYmxlZCh2b3V0KSkgewotCQlsaW5lX2xlbmd0aCA9IE1BWF9QSVhFTFNfUEVSX0xJTkU7Ci0JCWN0b3AgPSAocGl4LT5oZWlnaHQgLSBjcm9wLT5oZWlnaHQpIC0gY3JvcC0+dG9wOwotCQljbGVmdCA9IChwaXgtPndpZHRoIC0gY3JvcC0+d2lkdGgpIC0gY3JvcC0+bGVmdDsKKwlpZiAob3ZpZC0+cm90YXRpb25fdHlwZSA9PSBWT1VUX1JPVF9WUkZCKSB7CisJCW9tYXBfdm91dF9jYWxjdWxhdGVfdnJmYl9vZmZzZXQodm91dCk7CiAJfSBlbHNlIHsKLQkJbGluZV9sZW5ndGggPSBwaXgtPndpZHRoOwotCX0KLQl2b3V0LT5saW5lX2xlbmd0aCA9IGxpbmVfbGVuZ3RoOwotCXN3aXRjaCAocm90YXRpb24pIHsKLQljYXNlIGRzc19yb3RhdGlvbl85MF9kZWdyZWU6Ci0JCW9mZnNldCA9IHZvdXQtPnZyZmJfY29udGV4dFswXS55b2Zmc2V0ICoKLQkJCXZvdXQtPnZyZmJfY29udGV4dFswXS5ieXRlc3BwOwotCQl0ZW1wX3BzID0gcHMgLyB2cl9wczsKLQkJaWYgKG1pcnJvcmluZyA9PSAwKSB7Ci0JCQkqY3JvcHBlZF9vZmZzZXQgPSBvZmZzZXQgKyBsaW5lX2xlbmd0aCAqCi0JCQkJdGVtcF9wcyAqIGNsZWZ0ICsgY3JvcC0+dG9wICogdGVtcF9wczsKLQkJfSBlbHNlIHsKLQkJCSpjcm9wcGVkX29mZnNldCA9IG9mZnNldCArIGxpbmVfbGVuZ3RoICogdGVtcF9wcyAqCi0JCQkJY2xlZnQgKyBjcm9wLT50b3AgKiB0ZW1wX3BzICsgKGxpbmVfbGVuZ3RoICoKLQkJCQkoKGNyb3AtPndpZHRoIC8gKHZyX3BzKSkgLSAxKSAqIHBzKTsKLQkJfQotCQlicmVhazsKLQljYXNlIGRzc19yb3RhdGlvbl8xODBfZGVncmVlOgotCQlvZmZzZXQgPSAoKE1BWF9QSVhFTFNfUEVSX0xJTkUgKiB2b3V0LT52cmZiX2NvbnRleHRbMF0ueW9mZnNldCAqCi0JCQl2b3V0LT52cmZiX2NvbnRleHRbMF0uYnl0ZXNwcCkgKwotCQkJKHZvdXQtPnZyZmJfY29udGV4dFswXS54b2Zmc2V0ICoKLQkJCXZvdXQtPnZyZmJfY29udGV4dFswXS5ieXRlc3BwKSk7Ci0JCWlmIChtaXJyb3JpbmcgPT0gMCkgewotCQkJKmNyb3BwZWRfb2Zmc2V0ID0gb2Zmc2V0ICsgKGxpbmVfbGVuZ3RoICogcHMgKiBjdG9wKSArCi0JCQkJKGNsZWZ0IC8gdnJfcHMpICogcHM7CisJCXZvdXQtPmxpbmVfbGVuZ3RoID0gbGluZV9sZW5ndGggPSBwaXgtPndpZHRoOwogCi0JCX0gZWxzZSB7Ci0JCQkqY3JvcHBlZF9vZmZzZXQgPSBvZmZzZXQgKyAobGluZV9sZW5ndGggKiBwcyAqIGN0b3ApICsKLQkJCQkoY2xlZnQgLyB2cl9wcykgKiBwcyArIChsaW5lX2xlbmd0aCAqCi0JCQkJKGNyb3AtPmhlaWdodCAtIDEpICogcHMpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgZHNzX3JvdGF0aW9uXzI3MF9kZWdyZWU6Ci0JCW9mZnNldCA9IE1BWF9QSVhFTFNfUEVSX0xJTkUgKiB2b3V0LT52cmZiX2NvbnRleHRbMF0ueG9mZnNldCAqCi0JCQl2b3V0LT52cmZiX2NvbnRleHRbMF0uYnl0ZXNwcDsKLQkJdGVtcF9wcyA9IHBzIC8gdnJfcHM7Ci0JCWlmIChtaXJyb3JpbmcgPT0gMCkgewotCQkJKmNyb3BwZWRfb2Zmc2V0ID0gb2Zmc2V0ICsgbGluZV9sZW5ndGggKgotCQkJICAgIHRlbXBfcHMgKiBjcm9wLT5sZWZ0ICsgY3RvcCAqIHBzOwotCQl9IGVsc2UgewotCQkJKmNyb3BwZWRfb2Zmc2V0ID0gb2Zmc2V0ICsgbGluZV9sZW5ndGggKgotCQkJCXRlbXBfcHMgKiBjcm9wLT5sZWZ0ICsgY3RvcCAqIHBzICsKLQkJCQkobGluZV9sZW5ndGggKiAoKGNyb3AtPndpZHRoIC8gdnJfcHMpIC0gMSkgKgotCQkJCSBwcyk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBkc3Nfcm90YXRpb25fMF9kZWdyZWU6Ci0JCWlmIChtaXJyb3JpbmcgPT0gMCkgewotCQkJKmNyb3BwZWRfb2Zmc2V0ID0gKGxpbmVfbGVuZ3RoICogcHMpICoKLQkJCQljcm9wLT50b3AgKyAoY3JvcC0+bGVmdCAvIHZyX3BzKSAqIHBzOwotCQl9IGVsc2UgewotCQkJKmNyb3BwZWRfb2Zmc2V0ID0gKGxpbmVfbGVuZ3RoICogcHMpICoKLQkJCQljcm9wLT50b3AgKyAoY3JvcC0+bGVmdCAvIHZyX3BzKSAqIHBzICsKLQkJCQkobGluZV9sZW5ndGggKiAoY3JvcC0+aGVpZ2h0IC0gMSkgKiBwcyk7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJKmNyb3BwZWRfb2Zmc2V0ID0gKGxpbmVfbGVuZ3RoICogcHMgKiBjcm9wLT50b3ApIC8KLQkJCXZyX3BzICsgKGNyb3AtPmxlZnQgKiBwcykgLyB2cl9wcyArCi0JCQkoKGNyb3AtPndpZHRoIC8gdnJfcHMpIC0gMSkgKiBwczsKLQkJYnJlYWs7CisJCWlmIChWNEwyX1BJWF9GTVRfWVVZViA9PSBwaXgtPnBpeGVsZm9ybWF0IHx8CisJCQlWNEwyX1BJWF9GTVRfVVlWWSA9PSBwaXgtPnBpeGVsZm9ybWF0KQorCQkJcHMgPSAyOworCQllbHNlIGlmIChWNEwyX1BJWF9GTVRfUkdCMzIgPT0gcGl4LT5waXhlbGZvcm1hdCkKKwkJCXBzID0gNDsKKwkJZWxzZSBpZiAoVjRMMl9QSVhfRk1UX1JHQjI0ID09IHBpeC0+cGl4ZWxmb3JtYXQpCisJCQlwcyA9IDM7CisKKwkJdm91dC0+cHMgPSBwczsKKworCQkqY3JvcHBlZF9vZmZzZXQgPSAobGluZV9sZW5ndGggKiBwcykgKgorCQkJY3JvcC0+dG9wICsgY3JvcC0+bGVmdCAqIHBzOwogCX0KKwogCXY0bDJfZGJnKDEsIGRlYnVnLCAmdm91dC0+dmlkX2Rldi0+djRsMl9kZXYsICIlcyBPZmZzZXQ6JXhcbiIsCi0JCQlfX2Z1bmNfXywgKmNyb3BwZWRfb2Zmc2V0KTsKKwkJCV9fZnVuY19fLCB2b3V0LT5jcm9wcGVkX29mZnNldCk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjY0LDcgKzM2Myw3IEBACiAvKgogICogU2V0dXAgdGhlIG92ZXJsYXkKICAqLwotaW50IG9tYXB2aWRfc2V0dXBfb3ZlcmxheShzdHJ1Y3Qgb21hcF92b3V0X2RldmljZSAqdm91dCwKK3N0YXRpYyBpbnQgb21hcHZpZF9zZXR1cF9vdmVybGF5KHN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0LAogCQlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmwsIGludCBwb3N4LCBpbnQgcG9zeSwgaW50IG91dHcsCiAJCWludCBvdXRoLCB1MzIgYWRkcikKIHsKQEAgLTY4Nyw3ICszODYsNyBAQAogCS8qIFNldHVwIHRoZSBpbnB1dCBwbGFuZSBwYXJhbWV0ZXJzIGFjY29yZGluZyB0bwogCSAqIHJvdGF0aW9uIHZhbHVlIHNlbGVjdGVkLgogCSAqLwotCWlmIChyb3RhdGVfOTBfb3JfMjcwKHZvdXQpKSB7CisJaWYgKGlzX3JvdGF0aW9uXzkwX29yXzI3MCh2b3V0KSkgewogCQljcm9waGVpZ2h0ID0gdm91dC0+Y3JvcC53aWR0aDsKIAkJY3JvcHdpZHRoID0gdm91dC0+Y3JvcC5oZWlnaHQ7CiAJCXBpeGhlaWdodCA9IHZvdXQtPnBpeC53aWR0aDsKQEAgLTcxMSw3ICs0MTAsNyBAQAogCWluZm8ub3V0X3dpZHRoID0gb3V0dzsKIAlpbmZvLm91dF9oZWlnaHQgPSBvdXRoOwogCWluZm8uZ2xvYmFsX2FscGhhID0gdm91dC0+d2luLmdsb2JhbF9hbHBoYTsKLQlpZiAoIXJvdGF0aW9uX2VuYWJsZWQodm91dCkpIHsKKwlpZiAoIWlzX3JvdGF0aW9uX2VuYWJsZWQodm91dCkpIHsKIAkJaW5mby5yb3RhdGlvbiA9IDA7CiAJCWluZm8ucm90YXRpb25fdHlwZSA9IE9NQVBfRFNTX1JPVF9ETUE7CiAJCWluZm8uc2NyZWVuX3dpZHRoID0gcGl4d2lkdGg7CkBAIC03NDQsNyArNDQzLDcgQEAKIC8qCiAgKiBJbml0aWFsaXplIHRoZSBvdmVybGF5IHN0cnVjdHVyZQogICovCi1pbnQgb21hcHZpZF9pbml0KHN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0LCB1MzIgYWRkcikKK3N0YXRpYyBpbnQgb21hcHZpZF9pbml0KHN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0LCB1MzIgYWRkcikKIHsKIAlpbnQgcmV0ID0gMCwgaTsKIAlzdHJ1Y3QgdjRsMl93aW5kb3cgKndpbjsKQEAgLTgwOSw3ICs1MDgsNyBAQAogLyoKICAqIEFwcGx5IHRoZSBjaGFuZ2VzIHNldCB0aGUgZ28gYml0IG9mIERTUwogICovCi1pbnQgb21hcHZpZF9hcHBseV9jaGFuZ2VzKHN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0KQorc3RhdGljIGludCBvbWFwdmlkX2FwcGx5X2NoYW5nZXMoc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQpCiB7CiAJaW50IGk7CiAJc3RydWN0IG9tYXBfb3ZlcmxheSAqb3ZsOwpAQCAtODI1LDcgKzUyNCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgb21hcF92b3V0X2lzcih2b2lkICphcmcsIHVuc2lnbmVkIGludCBpcnFzdGF0dXMpCitzdGF0aWMgdm9pZCBvbWFwX3ZvdXRfaXNyKHZvaWQgKmFyZywgdW5zaWduZWQgaW50IGlycXN0YXR1cykKIHsKIAlpbnQgcmV0OwogCXUzMiBhZGRyLCBmaWQ7CkBAIC04NDgsMTAgKzU0NywyMCBAQAogCiAJc3Bpbl9sb2NrKCZ2b3V0LT52YnFfbG9jayk7CiAJZG9fZ2V0dGltZW9mZGF5KCZ0aW1ldmFsdWUpOwotCWlmIChjdXJfZGlzcGxheS0+dHlwZSA9PSBPTUFQX0RJU1BMQVlfVFlQRV9EUEkpIHsKLQkJaWYgKCEoaXJxc3RhdHVzICYgRElTUENfSVJRX1ZTWU5DKSkKLQkJCWdvdG8gdm91dF9pc3JfZXJyOwogCisJaWYgKGN1cl9kaXNwbGF5LT50eXBlICE9IE9NQVBfRElTUExBWV9UWVBFX1ZFTkMpIHsKKwkJc3dpdGNoIChjdXJfZGlzcGxheS0+dHlwZSkgeworCQljYXNlIE9NQVBfRElTUExBWV9UWVBFX0RQSToKKwkJCWlmICghKGlycXN0YXR1cyAmIChESVNQQ19JUlFfVlNZTkMgfCBESVNQQ19JUlFfVlNZTkMyKSkpCisJCQkJZ290byB2b3V0X2lzcl9lcnI7CisJCQlicmVhazsKKwkJY2FzZSBPTUFQX0RJU1BMQVlfVFlQRV9IRE1JOgorCQkJaWYgKCEoaXJxc3RhdHVzICYgRElTUENfSVJRX0VWU1lOQ19FVkVOKSkKKwkJCQlnb3RvIHZvdXRfaXNyX2VycjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZ290byB2b3V0X2lzcl9lcnI7CisJCX0KIAkJaWYgKCF2b3V0LT5maXJzdF9pbnQgJiYgKHZvdXQtPmN1cl9mcm0gIT0gdm91dC0+bmV4dF9mcm0pKSB7CiAJCQl2b3V0LT5jdXJfZnJtLT50cyA9IHRpbWV2YWx1ZTsKIAkJCXZvdXQtPmN1cl9mcm0tPnN0YXRlID0gVklERU9CVUZfRE9ORTsKQEAgLTg3NSw3ICs1ODQsNyBAQAogCQlyZXQgPSBvbWFwdmlkX2luaXQodm91dCwgYWRkcik7CiAJCWlmIChyZXQpCiAJCQlwcmludGsoS0VSTl9FUlIgVk9VVF9OQU1FCi0JCQkJCSJmYWlsZWQgdG8gc2V0IG92ZXJsYXkgaW5mb1xuIik7CisJCQkJImZhaWxlZCB0byBzZXQgb3ZlcmxheSBpbmZvXG4iKTsKIAkJLyogRW5hYmxlIHRoZSBwaXBlbGluZSBhbmQgc2V0IHRoZSBHbyBiaXQgKi8KIAkJcmV0ID0gb21hcHZpZF9hcHBseV9jaGFuZ2VzKHZvdXQpOwogCQlpZiAocmV0KQpAQCAtOTU0LDYgKzY2Myw3IEBACiAJaW50IHN0YXJ0aW5kZXggPSAwLCBpLCBqOwogCXUzMiBwaHlfYWRkciA9IDAsIHZpcnRfYWRkciA9IDA7CiAJc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQgPSBxLT5wcml2X2RhdGE7CisJc3RydWN0IG9tYXB2aWRlb19pbmZvICpvdmlkID0gJnZvdXQtPnZpZF9pbmZvOwogCiAJaWYgKCF2b3V0KQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTk2NiwxMyArNjc2LDEwIEBACiAJaWYgKFY0TDJfTUVNT1JZX01NQVAgPT0gdm91dC0+bWVtb3J5ICYmICpjb3VudCA8IHN0YXJ0aW5kZXgpCiAJCSpjb3VudCA9IHN0YXJ0aW5kZXg7CiAKLQlpZiAoKHJvdGF0aW9uX2VuYWJsZWQodm91dCkpICYmICpjb3VudCA+IFZSRkJfTlVNX0JVRlMpCi0JCSpjb3VudCA9IFZSRkJfTlVNX0JVRlM7Ci0KLQkvKiBJZiByb3RhdGlvbiBpcyBlbmFibGVkLCBhbGxvY2F0ZSBtZW1vcnkgZm9yIFZSRkIgc3BhY2UgYWxzbyAqLwotCWlmIChyb3RhdGlvbl9lbmFibGVkKHZvdXQpKQorCWlmIChvdmlkLT5yb3RhdGlvbl90eXBlID09IFZPVVRfUk9UX1ZSRkIpIHsKIAkJaWYgKG9tYXBfdm91dF92cmZiX2J1ZmZlcl9zZXR1cCh2b3V0LCBjb3VudCwgc3RhcnRpbmRleCkpCiAJCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAKIAlpZiAoVjRMMl9NRU1PUllfTU1BUCAhPSB2b3V0LT5tZW1vcnkpCiAJCXJldHVybiAwOwpAQCAtOTk2LDggKzcwMywxMSBAQAogCQl2aXJ0X2FkZHIgPSBvbWFwX3ZvdXRfYWxsb2NfYnVmZmVyKHZvdXQtPmJ1ZmZlcl9zaXplLAogCQkJCSZwaHlfYWRkcik7CiAJCWlmICghdmlydF9hZGRyKSB7Ci0JCQlpZiAoIXJvdGF0aW9uX2VuYWJsZWQodm91dCkpCisJCQlpZiAob3ZpZC0+cm90YXRpb25fdHlwZSA9PSBWT1VUX1JPVF9OT05FKSB7CiAJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCWlmICghaXNfcm90YXRpb25fZW5hYmxlZCh2b3V0KSkKKwkJCQkJYnJlYWs7CiAJCQkvKiBGcmVlIHRoZSBWUkZCIGJ1ZmZlcnMgaWYgbm8gc3BhY2UgZm9yIFY0TDIgYnVmZmVycyAqLwogCQkJZm9yIChqID0gaTsgaiA8ICpjb3VudDsgaisrKSB7CiAJCQkJb21hcF92b3V0X2ZyZWVfYnVmZmVyKApAQCAtMTAwNSw2ICs3MTUsNyBAQAogCQkJCQkJdm91dC0+c21zc2hhZG9fc2l6ZSk7CiAJCQkJdm91dC0+c21zc2hhZG9fdmlydF9hZGRyW2pdID0gMDsKIAkJCQl2b3V0LT5zbXNzaGFkb19waHlfYWRkcltqXSA9IDA7CisJCQkJfQogCQkJfQogCQl9CiAJCXZvdXQtPmJ1Zl92aXJ0X2FkZHJbaV0gPSB2aXJ0X2FkZHI7CkBAIC0xMDE3LDkgKzcyOCw5IEBACiAKIC8qCiAgKiBGcmVlIHRoZSBWNEwyIGJ1ZmZlcnMgYWRkaXRpb25hbGx5IGFsbG9jYXRlZCB0aGFuIGRlZmF1bHQKLSAqIG51bWJlciBvZiBidWZmZXJzIGFuZCBmcmVlIGFsbCB0aGUgVlJGQiBidWZmZXJzCisgKiBudW1iZXIgb2YgYnVmZmVycwogICovCi1zdGF0aWMgdm9pZCBvbWFwX3ZvdXRfZnJlZV9hbGxidWZmZXJzKHN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0KQorc3RhdGljIHZvaWQgb21hcF92b3V0X2ZyZWVfZXh0cmFfYnVmZmVycyhzdHJ1Y3Qgb21hcF92b3V0X2RldmljZSAqdm91dCkKIHsKIAlpbnQgbnVtX2J1ZmZlcnMgPSAwLCBpOwogCkBAIC0xMDM0LDIwICs3NDUsNiBAQAogCQl2b3V0LT5idWZfdmlydF9hZGRyW2ldID0gMDsKIAkJdm91dC0+YnVmX3BoeV9hZGRyW2ldID0gMDsKIAl9Ci0JLyogRnJlZSB0aGUgVlJGQiBidWZmZXJzIG9ubHkgaWYgdGhleSBhcmUgYWxsb2NhdGVkCi0JICogZHVyaW5nIHJlcWJ1ZnMuICBEb24ndCBmcmVlIGlmIGluaXQgdGltZSBhbGxvY2F0ZWQKLQkgKi8KLQlpZiAoIXZvdXQtPnZyZmJfc3RhdGljX2FsbG9jYXRpb24pIHsKLQkJZm9yIChpID0gMDsgaSA8IFZSRkJfTlVNX0JVRlM7IGkrKykgewotCQkJaWYgKHZvdXQtPnNtc3NoYWRvX3ZpcnRfYWRkcltpXSkgewotCQkJCW9tYXBfdm91dF9mcmVlX2J1ZmZlcigKLQkJCQkJCXZvdXQtPnNtc3NoYWRvX3ZpcnRfYWRkcltpXSwKLQkJCQkJCXZvdXQtPnNtc3NoYWRvX3NpemUpOwotCQkJCXZvdXQtPnNtc3NoYWRvX3ZpcnRfYWRkcltpXSA9IDA7Ci0JCQkJdm91dC0+c21zc2hhZG9fcGh5X2FkZHJbaV0gPSAwOwotCQkJfQotCQl9Ci0JfQogCXZvdXQtPmJ1ZmZlcl9hbGxvY2F0ZWQgPSBudW1fYnVmZmVyczsKIH0KIApAQCAtMTA1OSwxNiArNzU2LDExIEBACiAgKiBidWZmZXIgaW50byBWUkZCIG1lbW9yeSBzcGFjZSBiZWZvcmUgZ2l2aW5nIGl0IHRvIHRoZSBEU1MuCiAgKi8KIHN0YXRpYyBpbnQgb21hcF92b3V0X2J1ZmZlcl9wcmVwYXJlKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwKLQkJCSAgICBzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YiwKLQkJCSAgICBlbnVtIHY0bDJfZmllbGQgZmllbGQpCisJCQlzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YiwKKwkJCWVudW0gdjRsMl9maWVsZCBmaWVsZCkKIHsKLQlkbWFfYWRkcl90IGRtYWJ1ZjsKLQlzdHJ1Y3QgdmlkX3ZyZmJfZG1hICp0eDsKLQllbnVtIGRzc19yb3RhdGlvbiByb3RhdGlvbjsKIAlzdHJ1Y3Qgb21hcF92b3V0X2RldmljZSAqdm91dCA9IHEtPnByaXZfZGF0YTsKLQl1MzIgZGVzdF9mcmFtZV9pbmRleCA9IDAsIHNyY19lbGVtZW50X2luZGV4ID0gMDsKLQl1MzIgZGVzdF9lbGVtZW50X2luZGV4ID0gMCwgc3JjX2ZyYW1lX2luZGV4ID0gMDsKLQl1MzIgZWxlbV9jb3VudCA9IDAsIGZyYW1lX2NvdW50ID0gMCwgcGl4c2l6ZSA9IDI7CisJc3RydWN0IG9tYXB2aWRlb19pbmZvICpvdmlkID0gJnZvdXQtPnZpZF9pbmZvOwogCiAJaWYgKFZJREVPQlVGX05FRURTX0lOSVQgPT0gdmItPnN0YXRlKSB7CiAJCXZiLT53aWR0aCA9IHZvdXQtPnBpeC53aWR0aDsKQEAgLTEwODcsNjYgKzc3OSwyNCBAQAogCQl2b3V0LT5xdWV1ZWRfYnVmX2FkZHJbdmItPmldID0gKHU4ICopCiAJCQlvbWFwX3ZvdXRfdXNlcnZpcnRfdG9fcGh5cyh2Yi0+YmFkZHIpOwogCX0gZWxzZSB7CisJCXUzMiBhZGRyLCBkbWFfYWRkcjsKKwkJdW5zaWduZWQgbG9uZyBzaXplOworCisJCWFkZHIgPSAodW5zaWduZWQgbG9uZykgdm91dC0+YnVmX3ZpcnRfYWRkclt2Yi0+aV07CisJCXNpemUgPSAodW5zaWduZWQgbG9uZykgdmItPnNpemU7CisKKwkJZG1hX2FkZHIgPSBkbWFfbWFwX3NpbmdsZSh2b3V0LT52aWRfZGV2LT52NGwyX2Rldi5kZXYsICh2b2lkICopIGFkZHIsCisJCQkJc2l6ZSwgRE1BX1RPX0RFVklDRSk7CisJCWlmIChkbWFfbWFwcGluZ19lcnJvcih2b3V0LT52aWRfZGV2LT52NGwyX2Rldi5kZXYsIGRtYV9hZGRyKSkKKwkJCXY0bDJfZXJyKCZ2b3V0LT52aWRfZGV2LT52NGwyX2RldiwgImRtYV9tYXBfc2luZ2xlIGZhaWxlZFxuIik7CisKIAkJdm91dC0+cXVldWVkX2J1Zl9hZGRyW3ZiLT5pXSA9ICh1OCAqKXZvdXQtPmJ1Zl9waHlfYWRkclt2Yi0+aV07CiAJfQogCi0JaWYgKCFyb3RhdGlvbl9lbmFibGVkKHZvdXQpKQorCWlmIChvdmlkLT5yb3RhdGlvbl90eXBlID09IFZPVVRfUk9UX1ZSRkIpCisJCXJldHVybiBvbWFwX3ZvdXRfcHJlcGFyZV92cmZiKHZvdXQsIHZiKTsKKwllbHNlCiAJCXJldHVybiAwOwotCi0JZG1hYnVmID0gdm91dC0+YnVmX3BoeV9hZGRyW3ZiLT5pXTsKLQkvKiBJZiByb3RhdGlvbiBpcyBlbmFibGVkLCBjb3B5IGlucHV0IGJ1ZmZlciBpbnRvIFZSRkIKLQkgKiBtZW1vcnkgc3BhY2UgdXNpbmcgRE1BLiBXZSBhcmUgY29weWluZyBpbnB1dCBidWZmZXIKLQkgKiBpbnRvIFZSRkIgbWVtb3J5IHNwYWNlIG9mIGRlc2lyZWQgYW5nbGUgYW5kIERTUyB3aWxsCi0JICogcmVhZCBpbWFnZSBWUkZCIG1lbW9yeSBmb3IgMCBkZWdyZWUgYW5nbGUKLQkgKi8KLQlwaXhzaXplID0gdm91dC0+YnBwICogdm91dC0+dnJmYl9icHA7Ci0JLyoKLQkgKiBETUEgdHJhbnNmZXIgaW4gZG91YmxlIGluZGV4IG1vZGUKLQkgKi8KLQotCS8qIEZyYW1lIGluZGV4ICovCi0JZGVzdF9mcmFtZV9pbmRleCA9ICgoTUFYX1BJWEVMU19QRVJfTElORSAqIHBpeHNpemUpIC0KLQkJCSh2b3V0LT5waXgud2lkdGggKiB2b3V0LT5icHApKSArIDE7Ci0KLQkvKiBTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHBhcmFtZXRlcnMgKi8KLQlzcmNfZWxlbWVudF9pbmRleCA9IDA7Ci0Jc3JjX2ZyYW1lX2luZGV4ID0gMDsKLQlkZXN0X2VsZW1lbnRfaW5kZXggPSAxOwotCS8qIE51bWJlciBvZiBlbGVtZW50cyBwZXIgZnJhbWUgKi8KLQllbGVtX2NvdW50ID0gdm91dC0+cGl4LndpZHRoICogdm91dC0+YnBwOwotCWZyYW1lX2NvdW50ID0gdm91dC0+cGl4LmhlaWdodDsKLQl0eCA9ICZ2b3V0LT52cmZiX2RtYV90eDsKLQl0eC0+dHhfc3RhdHVzID0gMDsKLQlvbWFwX3NldF9kbWFfdHJhbnNmZXJfcGFyYW1zKHR4LT5kbWFfY2gsIE9NQVBfRE1BX0RBVEFfVFlQRV9TMzIsCi0JCQkoZWxlbV9jb3VudCAvIDQpLCBmcmFtZV9jb3VudCwgT01BUF9ETUFfU1lOQ19FTEVNRU5ULAotCQkJdHgtPmRldl9pZCwgMHgwKTsKLQkvKiBzcmNfcG9ydCByZXF1aXJlZCBvbmx5IGZvciBPTUFQMSAqLwotCW9tYXBfc2V0X2RtYV9zcmNfcGFyYW1zKHR4LT5kbWFfY2gsIDAsIE9NQVBfRE1BX0FNT0RFX1BPU1RfSU5DLAotCQkJZG1hYnVmLCBzcmNfZWxlbWVudF9pbmRleCwgc3JjX2ZyYW1lX2luZGV4KTsKLQkvKnNldCBkbWEgc291cmNlIGJ1cnN0IG1vZGUgZm9yIFZSRkIgKi8KLQlvbWFwX3NldF9kbWFfc3JjX2J1cnN0X21vZGUodHgtPmRtYV9jaCwgT01BUF9ETUFfREFUQV9CVVJTVF8xNik7Ci0Jcm90YXRpb24gPSBjYWxjX3JvdGF0aW9uKHZvdXQpOwotCi0JLyogZGVzdF9wb3J0IHJlcXVpcmVkIG9ubHkgZm9yIE9NQVAxICovCi0Jb21hcF9zZXRfZG1hX2Rlc3RfcGFyYW1zKHR4LT5kbWFfY2gsIDAsIE9NQVBfRE1BX0FNT0RFX0RPVUJMRV9JRFgsCi0JCQl2b3V0LT52cmZiX2NvbnRleHRbdmItPmldLnBhZGRyWzBdLCBkZXN0X2VsZW1lbnRfaW5kZXgsCi0JCQlkZXN0X2ZyYW1lX2luZGV4KTsKLQkvKnNldCBkbWEgZGVzdCBidXJzdCBtb2RlIGZvciBWUkZCICovCi0Jb21hcF9zZXRfZG1hX2Rlc3RfYnVyc3RfbW9kZSh0eC0+ZG1hX2NoLCBPTUFQX0RNQV9EQVRBX0JVUlNUXzE2KTsKLQlvbWFwX2RtYV9zZXRfZ2xvYmFsX3BhcmFtcyhETUFfREVGQVVMVF9BUkJfUkFURSwgMHgyMCwgMCk7Ci0KLQlvbWFwX3N0YXJ0X2RtYSh0eC0+ZG1hX2NoKTsKLQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoJnR4LT53YWl0LCBWUkZCX1RYX1RJTUVPVVQpOwotCi0JaWYgKHR4LT50eF9zdGF0dXMgPT0gMCkgewotCQlvbWFwX3N0b3BfZG1hKHR4LT5kbWFfY2gpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JLyogU3RvcmUgYnVmZmVycyBwaHlzaWNhbCBhZGRyZXNzIGludG8gYW4gYXJyYXkuIEFkZHJlc3NlcwotCSAqIGZyb20gdGhpcyBhcnJheSB3aWxsIGJlIHVzZWQgdG8gY29uZmlndXJlIERTUyAqLwotCXZvdXQtPnF1ZXVlZF9idWZfYWRkclt2Yi0+aV0gPSAodTggKikKLQkJdm91dC0+dnJmYl9jb250ZXh0W3ZiLT5pXS5wYWRkcltyb3RhdGlvbl07Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xMjk4LDcgKzk0OCwxNSBAQAogCQkJCSJVbmFibGUgdG8gYXBwbHkgY2hhbmdlc1xuIik7CiAKIAkvKiBGcmVlIGFsbCBidWZmZXJzICovCi0Jb21hcF92b3V0X2ZyZWVfYWxsYnVmZmVycyh2b3V0KTsKKwlvbWFwX3ZvdXRfZnJlZV9leHRyYV9idWZmZXJzKHZvdXQpOworCisJLyogRnJlZSB0aGUgVlJGQiBidWZmZXJzIG9ubHkgaWYgdGhleSBhcmUgYWxsb2NhdGVkCisJICogZHVyaW5nIHJlcWJ1ZnMuICBEb24ndCBmcmVlIGlmIGluaXQgdGltZSBhbGxvY2F0ZWQKKwkgKi8KKwlpZiAob3ZpZC0+cm90YXRpb25fdHlwZSA9PSBWT1VUX1JPVF9WUkZCKSB7CisJCWlmICghdm91dC0+dnJmYl9zdGF0aWNfYWxsb2NhdGlvbikKKwkJCW9tYXBfdm91dF9mcmVlX3ZyZmJfYnVmZmVycyh2b3V0KTsKKwl9CiAJdmlkZW9idWZfbW1hcF9mcmVlKHEpOwogCiAJLyogRXZlbiBpZiBhcHBseSBjaGFuZ2VzIGZhaWxzIHdlIHNob3VsZCBjb250aW51ZQpAQCAtMTMwNyw3ICs5NjUsNyBAQAogCQl1MzIgbWFzayA9IDA7CiAKIAkJbWFzayA9IERJU1BDX0lSUV9WU1lOQyB8IERJU1BDX0lSUV9FVlNZTkNfRVZFTiB8Ci0JCQlESVNQQ19JUlFfRVZTWU5DX09ERDsKKwkJCURJU1BDX0lSUV9FVlNZTkNfT0REIHwgRElTUENfSVJRX1ZTWU5DMjsKIAkJb21hcF9kaXNwY191bnJlZ2lzdGVyX2lzcihvbWFwX3ZvdXRfaXNyLCB2b3V0LCBtYXNrKTsKIAkJdm91dC0+c3RyZWFtaW5nID0gMDsKIApAQCAtMTM4MywxMCArMTA0MSw3IEBACiAJCQlzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmbXQpCiB7CiAJaW50IGluZGV4ID0gZm10LT5pbmRleDsKLQllbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSA9IGZtdC0+dHlwZTsKIAotCWZtdC0+aW5kZXggPSBpbmRleDsKLQlmbXQtPnR5cGUgPSB0eXBlOwogCWlmIChpbmRleCA+PSBOVU1fT1VUUFVUX0ZPUk1BVFMpCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC0xNDU3LDcgKzExMTIsNyBAQAogCiAJLyogV2UgZG9udCBzdXBwb3J0IFJHQjI0LXBhY2tlZCBtb2RlIGlmIHZyZmIgcm90YXRpb24KIAkgKiBpcyBlbmFibGVkKi8KLQlpZiAoKHJvdGF0aW9uX2VuYWJsZWQodm91dCkpICYmCisJaWYgKChpc19yb3RhdGlvbl9lbmFibGVkKHZvdXQpKSAmJgogCQkJZi0+Zm10LnBpeC5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfUkdCMjQpIHsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBzX2ZtdF92aWRfb3V0X2V4aXQ7CkBAIC0xNDY1LDcgKzExMjAsNyBAQAogCiAJLyogZ2V0IHRoZSBmcmFtZWJ1ZmZlciBwYXJhbWV0ZXJzICovCiAKLQlpZiAocm90YXRlXzkwX29yXzI3MCh2b3V0KSkgeworCWlmIChpc19yb3RhdGlvbl85MF9vcl8yNzAodm91dCkpIHsKIAkJdm91dC0+ZmJ1Zi5mbXQuaGVpZ2h0ID0gdGltaW5nLT54X3JlczsKIAkJdm91dC0+ZmJ1Zi5mbXQud2lkdGggPSB0aW1pbmctPnlfcmVzOwogCX0gZWxzZSB7CkBAIC0xNTU1LDEwICsxMjEwLDcgQEAKIAkJCXN0cnVjdCB2NGwyX2ZtdGRlc2MgKmZtdCkKIHsKIAlpbnQgaW5kZXggPSBmbXQtPmluZGV4OwotCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlID0gZm10LT50eXBlOwogCi0JZm10LT5pbmRleCA9IGluZGV4OwotCWZtdC0+dHlwZSA9IHR5cGU7CiAJaWYgKGluZGV4ID49IE5VTV9PVVRQVVRfRk9STUFUUykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKQEAgLTE2NDUsNyArMTI5Nyw3IEBACiAJLyogZ2V0IHRoZSBkaXNwbGF5IGRldmljZSBhdHRhY2hlZCB0byB0aGUgb3ZlcmxheSAqLwogCXRpbWluZyA9ICZvdmwtPm1hbmFnZXItPmRldmljZS0+cGFuZWwudGltaW5nczsKIAotCWlmIChyb3RhdGVfOTBfb3JfMjcwKHZvdXQpKSB7CisJaWYgKGlzX3JvdGF0aW9uXzkwX29yXzI3MCh2b3V0KSkgewogCQl2b3V0LT5mYnVmLmZtdC5oZWlnaHQgPSB0aW1pbmctPnhfcmVzOwogCQl2b3V0LT5mYnVmLmZtdC53aWR0aCA9IHRpbWluZy0+eV9yZXM7CiAJfSBlbHNlIHsKQEAgLTE3MjUsOSArMTM3NywxNyBAQAogCXN3aXRjaCAoYS0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX1JPVEFURToKIAl7CisJCXN0cnVjdCBvbWFwdmlkZW9faW5mbyAqb3ZpZDsKIAkJaW50IHJvdGF0aW9uID0gYS0+dmFsdWU7CiAKKwkJb3ZpZCA9ICZ2b3V0LT52aWRfaW5mbzsKKwogCQltdXRleF9sb2NrKCZ2b3V0LT5sb2NrKTsKKwkJaWYgKHJvdGF0aW9uICYmIG92aWQtPnJvdGF0aW9uX3R5cGUgPT0gVk9VVF9ST1RfTk9ORSkgeworCQkJbXV0ZXhfdW5sb2NrKCZ2b3V0LT5sb2NrKTsKKwkJCXJldCA9IC1FUkFOR0U7CisJCQlicmVhazsKKwkJfQogCiAJCWlmIChyb3RhdGlvbiAmJiB2b3V0LT5waXgucGl4ZWxmb3JtYXQgPT0gVjRMMl9QSVhfRk1UX1JHQjI0KSB7CiAJCQltdXRleF91bmxvY2soJnZvdXQtPmxvY2spOwpAQCAtMTc4Myw2ICsxNDQzLDExIEBACiAJCW92bCA9IG92aWQtPm92ZXJsYXlzWzBdOwogCiAJCW11dGV4X2xvY2soJnZvdXQtPmxvY2spOworCQlpZiAobWlycm9yICYmIG92aWQtPnJvdGF0aW9uX3R5cGUgPT0gVk9VVF9ST1RfTk9ORSkgeworCQkJbXV0ZXhfdW5sb2NrKCZ2b3V0LT5sb2NrKTsKKwkJCXJldCA9IC1FUkFOR0U7CisJCQlicmVhazsKKwkJfQogCiAJCWlmIChtaXJyb3IgICYmIHZvdXQtPnBpeC5waXhlbGZvcm1hdCA9PSBWNEwyX1BJWF9GTVRfUkdCMjQpIHsKIAkJCW11dGV4X3VubG9jaygmdm91dC0+bG9jayk7CkBAIC0xODkzLDcgKzE1NTgsNyBAQAogCQl9CiAJfQogCi0JaWYgKChyb3RhdGlvbl9lbmFibGVkKHZvdXQpKSAmJgorCWlmICgoaXNfcm90YXRpb25fZW5hYmxlZCh2b3V0KSkgJiYKIAkJCXZvdXQtPnZyZmJfZG1hX3R4LnJlcV9zdGF0dXMgPT0gRE1BX0NIQU5fTk9UX0FMTE9URUQpIHsKIAkJdjRsMl93YXJuKCZ2b3V0LT52aWRfZGV2LT52NGwyX2RldiwKIAkJCQkiRE1BIENoYW5uZWwgbm90IGFsbG9jYXRlZCBmb3IgUm90YXRpb25cbiIpOwpAQCAtMTkwOCwxNSArMTU3MywyOCBAQAogCXN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0ID0gZmg7CiAJc3RydWN0IHZpZGVvYnVmX3F1ZXVlICpxID0gJnZvdXQtPnZicTsKIAorCWludCByZXQ7CisJdTMyIGFkZHI7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiOworCisJdmIgPSBxLT5idWZzW2ItPmluZGV4XTsKKwogCWlmICghdm91dC0+c3RyZWFtaW5nKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKIAkJLyogQ2FsbCB2aWRlb2J1Zl9kcWJ1ZiBmb3Igbm9uIGJsb2NraW5nIG1vZGUgKi8KLQkJcmV0dXJuIHZpZGVvYnVmX2RxYnVmKHEsIChzdHJ1Y3QgdjRsMl9idWZmZXIgKiliLCAxKTsKKwkJcmV0ID0gdmlkZW9idWZfZHFidWYocSwgKHN0cnVjdCB2NGwyX2J1ZmZlciAqKWIsIDEpOwogCWVsc2UKIAkJLyogQ2FsbCB2aWRlb2J1Zl9kcWJ1ZiBmb3IgIGJsb2NraW5nIG1vZGUgKi8KLQkJcmV0dXJuIHZpZGVvYnVmX2RxYnVmKHEsIChzdHJ1Y3QgdjRsMl9idWZmZXIgKiliLCAwKTsKKwkJcmV0ID0gdmlkZW9idWZfZHFidWYocSwgKHN0cnVjdCB2NGwyX2J1ZmZlciAqKWIsIDApOworCisJYWRkciA9ICh1bnNpZ25lZCBsb25nKSB2b3V0LT5idWZfcGh5X2FkZHJbdmItPmldOworCXNpemUgPSAodW5zaWduZWQgbG9uZykgdmItPnNpemU7CisJZG1hX3VubWFwX3NpbmdsZSh2b3V0LT52aWRfZGV2LT52NGwyX2Rldi5kZXYsICBhZGRyLAorCQkJCXNpemUsIERNQV9UT19ERVZJQ0UpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgdmlkaW9jX3N0cmVhbW9uKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgZW51bSB2NGwyX2J1Zl90eXBlIGkpCkBAIC0xOTY1LDcgKzE2NDMsOCBAQAogCWFkZHIgPSAodW5zaWduZWQgbG9uZykgdm91dC0+cXVldWVkX2J1Zl9hZGRyW3ZvdXQtPmN1cl9mcm0tPmldCiAJCSsgdm91dC0+Y3JvcHBlZF9vZmZzZXQ7CiAKLQltYXNrID0gRElTUENfSVJRX1ZTWU5DIHwgRElTUENfSVJRX0VWU1lOQ19FVkVOIHwgRElTUENfSVJRX0VWU1lOQ19PREQ7CisJbWFzayA9IERJU1BDX0lSUV9WU1lOQyB8IERJU1BDX0lSUV9FVlNZTkNfRVZFTiB8IERJU1BDX0lSUV9FVlNZTkNfT0RECisJCXwgRElTUENfSVJRX1ZTWU5DMjsKIAogCW9tYXBfZGlzcGNfcmVnaXN0ZXJfaXNyKG9tYXBfdm91dF9pc3IsIHZvdXQsIG1hc2spOwogCkBAIC0yMDE1LDcgKzE2OTQsOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXZvdXQtPnN0cmVhbWluZyA9IDA7Ci0JbWFzayA9IERJU1BDX0lSUV9WU1lOQyB8IERJU1BDX0lSUV9FVlNZTkNfRVZFTiB8IERJU1BDX0lSUV9FVlNZTkNfT0REOworCW1hc2sgPSBESVNQQ19JUlFfVlNZTkMgfCBESVNQQ19JUlFfRVZTWU5DX0VWRU4gfCBESVNQQ19JUlFfRVZTWU5DX09ERAorCQl8IERJU1BDX0lSUV9WU1lOQzI7CiAKIAlvbWFwX2Rpc3BjX3VucmVnaXN0ZXJfaXNyKG9tYXBfdm91dF9pc3IsIHZvdXQsIG1hc2spOwogCkBAIC0yMjI4LDcgKzE5MDgsOCBAQAogCXZvdXQtPm1pcnJvciA9IDA7CiAJdm91dC0+Y29udHJvbFsyXS5pZCA9IFY0TDJfQ0lEX0hGTElQOwogCXZvdXQtPmNvbnRyb2xbMl0udmFsdWUgPSAwOwotCXZvdXQtPnZyZmJfYnBwID0gMjsKKwlpZiAodm91dC0+dmlkX2luZm8ucm90YXRpb25fdHlwZSA9PSBWT1VUX1JPVF9WUkZCKQorCQl2b3V0LT52cmZiX2JwcCA9IDI7CiAKIAljb250cm9sWzFdLmlkID0gVjRMMl9DSURfQkdfQ09MT1I7CiAJY29udHJvbFsxXS52YWx1ZSA9IDA7CkBAIC0yMjYwLDE3ICsxOTQxLDE1IEBACiAJCWludCB2aWRfbnVtKQogewogCXUzMiBudW1idWZmZXJzOwotCWludCByZXQgPSAwLCBpLCBqOwotCWludCBpbWFnZV93aWR0aCwgaW1hZ2VfaGVpZ2h0OwotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZmZDsKKwlpbnQgcmV0ID0gMCwgaTsKKwlzdHJ1Y3Qgb21hcHZpZGVvX2luZm8gKm92aWQ7CiAJc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQ7Ci0JaW50IHN0YXRpY192cmZiX2FsbG9jYXRpb24gPSAwLCB2cmZiX251bV9idWZzID0gVlJGQl9OVU1fQlVGUzsKIAlzdHJ1Y3QgdjRsMl9kZXZpY2UgKnY0bDJfZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IG9tYXAydmlkZW9fZGV2aWNlICp2aWRfZGV2ID0KIAkJY29udGFpbmVyX29mKHY0bDJfZGV2LCBzdHJ1Y3Qgb21hcDJ2aWRlb19kZXZpY2UsIHY0bDJfZGV2KTsKIAogCXZvdXQgPSB2aWRfZGV2LT52b3V0c1t2aWRfbnVtXTsKLQl2ZmQgPSB2b3V0LT52ZmQ7CisJb3ZpZCA9ICZ2b3V0LT52aWRfaW5mbzsKIAogCW51bWJ1ZmZlcnMgPSAodmlkX251bSA9PSAwKSA/IHZpZGVvMV9udW1idWZmZXJzIDogdmlkZW8yX251bWJ1ZmZlcnM7CiAJdm91dC0+YnVmZmVyX3NpemUgPSAodmlkX251bSA9PSAwKSA/IHZpZGVvMV9idWZzaXplIDogdmlkZW8yX2J1ZnNpemU7CkBAIC0yMjg3LDY2ICsxOTY2LDE2IEBACiAJCX0KIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgVlJGQl9OVU1fQlVGUzsgaSsrKSB7Ci0JCWlmIChvbWFwX3ZyZmJfcmVxdWVzdF9jdHgoJnZvdXQtPnZyZmJfY29udGV4dFtpXSkpIHsKLQkJCWRldl9pbmZvKCZwZGV2LT5kZXYsICI6IFZSRkIgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwotCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykKLQkJCQlvbWFwX3ZyZmJfcmVsZWFzZV9jdHgoJnZvdXQtPnZyZmJfY29udGV4dFtqXSk7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBmcmVlX2J1ZmZlcnM7Ci0JCX0KLQl9CiAJdm91dC0+Y3JvcHBlZF9vZmZzZXQgPSAwOwogCi0JLyogQ2FsY3VsYXRlIFZSRkIgbWVtb3J5IHNpemUgKi8KLQkvKiBhbGxvY2F0ZSBmb3Igd29yc3QgY2FzZSBzaXplICovCi0JaW1hZ2Vfd2lkdGggPSBWSURfTUFYX1dJRFRIIC8gVElMRV9TSVpFOwotCWlmIChWSURfTUFYX1dJRFRIICUgVElMRV9TSVpFKQotCQlpbWFnZV93aWR0aCsrOwotCi0JaW1hZ2Vfd2lkdGggPSBpbWFnZV93aWR0aCAqIFRJTEVfU0laRTsKLQlpbWFnZV9oZWlnaHQgPSBWSURfTUFYX0hFSUdIVCAvIFRJTEVfU0laRTsKLQotCWlmIChWSURfTUFYX0hFSUdIVCAlIFRJTEVfU0laRSkKLQkJaW1hZ2VfaGVpZ2h0Kys7Ci0KLQlpbWFnZV9oZWlnaHQgPSBpbWFnZV9oZWlnaHQgKiBUSUxFX1NJWkU7Ci0Jdm91dC0+c21zc2hhZG9fc2l6ZSA9IFBBR0VfQUxJR04oaW1hZ2Vfd2lkdGggKiBpbWFnZV9oZWlnaHQgKiAyICogMik7Ci0KLQkvKgotCSAqIFJlcXVlc3QgYW5kIEluaXRpYWxpemUgRE1BLCBmb3IgRE1BIGJhc2VkIFZSRkIgdHJhbnNmZXIKLQkgKi8KLQl2b3V0LT52cmZiX2RtYV90eC5kZXZfaWQgPSBPTUFQX0RNQV9OT19ERVZJQ0U7Ci0Jdm91dC0+dnJmYl9kbWFfdHguZG1hX2NoID0gLTE7Ci0Jdm91dC0+dnJmYl9kbWFfdHgucmVxX3N0YXR1cyA9IERNQV9DSEFOX0FMTE9URUQ7Ci0JcmV0ID0gb21hcF9yZXF1ZXN0X2RtYSh2b3V0LT52cmZiX2RtYV90eC5kZXZfaWQsICJWUkZCIERNQSBUWCIsCi0JCQlvbWFwX3ZvdXRfdnJmYl9kbWFfdHhfY2FsbGJhY2ssCi0JCQkodm9pZCAqKSAmdm91dC0+dnJmYl9kbWFfdHgsICZ2b3V0LT52cmZiX2RtYV90eC5kbWFfY2gpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXZvdXQtPnZyZmJfZG1hX3R4LnJlcV9zdGF0dXMgPSBETUFfQ0hBTl9OT1RfQUxMT1RFRDsKLQkJZGV2X2luZm8oJnBkZXYtPmRldiwgIjogZmFpbGVkIHRvIGFsbG9jYXRlIERNQSBDaGFubmVsIGZvciIKLQkJCQkiIHZpZGVvJWRcbiIsIHZmZC0+bWlub3IpOworCWlmIChvdmlkLT5yb3RhdGlvbl90eXBlID09IFZPVVRfUk9UX1ZSRkIpIHsKKwkJaW50IHN0YXRpY192cmZiX2FsbG9jYXRpb24gPSAodmlkX251bSA9PSAwKSA/CisJCQl2aWQxX3N0YXRpY192cmZiX2FsbG9jIDogdmlkMl9zdGF0aWNfdnJmYl9hbGxvYzsKKwkJcmV0ID0gb21hcF92b3V0X3NldHVwX3ZyZmJfYnVmcyhwZGV2LCB2aWRfbnVtLAorCQkJCXN0YXRpY192cmZiX2FsbG9jYXRpb24pOwogCX0KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ2b3V0LT52cmZiX2RtYV90eC53YWl0KTsKIAotCS8qIEFsbG9jYXRlIFZSRkIgYnVmZmVycyBpZiBzZWxlY3RlZCB0aHJvdWdoIGJvb3RhcmdzICovCi0Jc3RhdGljX3ZyZmJfYWxsb2NhdGlvbiA9ICh2aWRfbnVtID09IDApID8KLQkJdmlkMV9zdGF0aWNfdnJmYl9hbGxvYyA6IHZpZDJfc3RhdGljX3ZyZmJfYWxsb2M7Ci0KLQkvKiBzdGF0aWNhbGx5IGFsbG9jYXRlZCB0aGUgVlJGQiBidWZmZXIgaXMgZG9uZSB0aHJvdWdoCi0JICAgY29tbWFuZHMgbGluZSBhcnVtZW50cyAqLwotCWlmIChzdGF0aWNfdnJmYl9hbGxvY2F0aW9uKSB7Ci0JCWlmIChvbWFwX3ZvdXRfYWxsb2NhdGVfdnJmYl9idWZmZXJzKHZvdXQsICZ2cmZiX251bV9idWZzLCAtMSkpIHsKLQkJCXJldCA9ICAtRU5PTUVNOwotCQkJZ290byByZWxlYXNlX3ZyZmJfY3R4OwotCQl9Ci0JCXZvdXQtPnZyZmJfc3RhdGljX2FsbG9jYXRpb24gPSAxOwotCX0KLQlyZXR1cm4gMDsKLQotcmVsZWFzZV92cmZiX2N0eDoKLQlmb3IgKGogPSAwOyBqIDwgVlJGQl9OVU1fQlVGUzsgaisrKQotCQlvbWFwX3ZyZmJfcmVsZWFzZV9jdHgoJnZvdXQtPnZyZmJfY29udGV4dFtqXSk7CisJcmV0dXJuIHJldDsKIAogZnJlZV9idWZmZXJzOgogCWZvciAoaSA9IDA7IGkgPCBudW1idWZmZXJzOyBpKyspIHsKQEAgLTIzODksNiArMjAxOCwxMCBAQAogCQl2b3V0LT52aWRfaW5mby5udW1fb3ZlcmxheXMgPSAxOwogCQl2b3V0LT52aWRfaW5mby5pZCA9IGsgKyAxOwogCisJCS8qIFNldCBWUkZCIGFzIHJvdGF0aW9uX3R5cGUgZm9yIG9tYXAyIGFuZCBvbWFwMyAqLworCQlpZiAoY3B1X2lzX29tYXAyNHh4KCkgfHwgY3B1X2lzX29tYXAzNHh4KCkpCisJCQl2b3V0LT52aWRfaW5mby5yb3RhdGlvbl90eXBlID0gVk9VVF9ST1RfVlJGQjsKKwogCQkvKiBTZXR1cCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciB0aGUgdmlkZW8gZGV2aWNlcwogCQkgKi8KIAkJaWYgKG9tYXBfdm91dF9zZXR1cF92aWRlb19kYXRhKHZvdXQpICE9IDApIHsKQEAgLTI0MjIsNyArMjA1NSw4IEBACiAJCQlnb3RvIHN1Y2Nlc3M7CiAKIGVycm9yMjoKLQkJb21hcF92b3V0X3JlbGVhc2VfdnJmYih2b3V0KTsKKwkJaWYgKHZvdXQtPnZpZF9pbmZvLnJvdGF0aW9uX3R5cGUgPT0gVk9VVF9ST1RfVlJGQikKKwkJCW9tYXBfdm91dF9yZWxlYXNlX3ZyZmIodm91dCk7CiAJCW9tYXBfdm91dF9mcmVlX2J1ZmZlcnModm91dCk7CiBlcnJvcjE6CiAJCXZpZGVvX2RldmljZV9yZWxlYXNlKHZmZCk7CkBAIC0yNDQzLDExICsyMDc3LDEzIEBACiBzdGF0aWMgdm9pZCBvbWFwX3ZvdXRfY2xlYW51cF9kZXZpY2Uoc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQpCiB7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmZkOworCXN0cnVjdCBvbWFwdmlkZW9faW5mbyAqb3ZpZDsKIAogCWlmICghdm91dCkKIAkJcmV0dXJuOwogCiAJdmZkID0gdm91dC0+dmZkOworCW92aWQgPSAmdm91dC0+dmlkX2luZm87CiAJaWYgKHZmZCkgewogCQlpZiAoIXZpZGVvX2lzX3JlZ2lzdGVyZWQodmZkKSkgewogCQkJLyoKQEAgLTI0NjMsMTQgKzIwOTksMTUgQEAKIAkJCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKHZmZCk7CiAJCX0KIAl9Ci0KLQlvbWFwX3ZvdXRfcmVsZWFzZV92cmZiKHZvdXQpOworCWlmIChvdmlkLT5yb3RhdGlvbl90eXBlID09IFZPVVRfUk9UX1ZSRkIpIHsKKwkJb21hcF92b3V0X3JlbGVhc2VfdnJmYih2b3V0KTsKKwkJLyogRnJlZSB0aGUgVlJGQiBidWZmZXIgaWYgYWxsb2NhdGVkCisJCSAqIGluaXQgdGltZQorCQkgKi8KKwkJaWYgKHZvdXQtPnZyZmJfc3RhdGljX2FsbG9jYXRpb24pCisJCQlvbWFwX3ZvdXRfZnJlZV92cmZiX2J1ZmZlcnModm91dCk7CisJfQogCW9tYXBfdm91dF9mcmVlX2J1ZmZlcnModm91dCk7Ci0JLyogRnJlZSB0aGUgVlJGQiBidWZmZXIgaWYgYWxsb2NhdGVkCi0JICogaW5pdCB0aW1lCi0JICovCi0JaWYgKHZvdXQtPnZyZmJfc3RhdGljX2FsbG9jYXRpb24pCi0JCW9tYXBfdm91dF9mcmVlX3ZyZmJfYnVmZmVycyh2b3V0KTsKIAogCWtmcmVlKHZvdXQpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL29tYXBfdm91dF92cmZiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvb21hcF92b3V0X3ZyZmIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmViY2FjNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9vbWFwX3ZvdXRfdnJmYi5jCkBAIC0wLDAgKzEsMzkwIEBACisvKgorICogb21hcF92b3V0X3ZyZmIuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUZXhhcyBJbnN0cnVtZW50cy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyLiBUaGlzIHByb2dyYW0gaXMgbGljZW5zZWQgImFzIGlzIiB3aXRob3V0IGFueSB3YXJyYW50eSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKworI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmLWRtYS1jb250aWcuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgorCisjaW5jbHVkZSA8cGxhdC9kbWEuaD4KKyNpbmNsdWRlIDxwbGF0L3ZyZmIuaD4KKworI2luY2x1ZGUgIm9tYXBfdm91dGRlZi5oIgorI2luY2x1ZGUgIm9tYXBfdm91dGxpYi5oIgorCisvKgorICogRnVuY3Rpb24gZm9yIGFsbG9jYXRpbmcgdmlkZW8gYnVmZmVycworICovCitzdGF0aWMgaW50IG9tYXBfdm91dF9hbGxvY2F0ZV92cmZiX2J1ZmZlcnMoc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQsCisJCXVuc2lnbmVkIGludCAqY291bnQsIGludCBzdGFydGluZGV4KQoreworCWludCBpLCBqOworCisJZm9yIChpID0gMDsgaSA8ICpjb3VudDsgaSsrKSB7CisJCWlmICghdm91dC0+c21zc2hhZG9fdmlydF9hZGRyW2ldKSB7CisJCQl2b3V0LT5zbXNzaGFkb192aXJ0X2FkZHJbaV0gPQorCQkJCW9tYXBfdm91dF9hbGxvY19idWZmZXIodm91dC0+c21zc2hhZG9fc2l6ZSwKKwkJCQkJCSZ2b3V0LT5zbXNzaGFkb19waHlfYWRkcltpXSk7CisJCX0KKwkJaWYgKCF2b3V0LT5zbXNzaGFkb192aXJ0X2FkZHJbaV0gJiYgc3RhcnRpbmRleCAhPSAtMSkgeworCQkJaWYgKFY0TDJfTUVNT1JZX01NQVAgPT0gdm91dC0+bWVtb3J5ICYmIGkgPj0gc3RhcnRpbmRleCkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoIXZvdXQtPnNtc3NoYWRvX3ZpcnRfYWRkcltpXSkgeworCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykgeworCQkJCW9tYXBfdm91dF9mcmVlX2J1ZmZlcigKKwkJCQkJCXZvdXQtPnNtc3NoYWRvX3ZpcnRfYWRkcltqXSwKKwkJCQkJCXZvdXQtPnNtc3NoYWRvX3NpemUpOworCQkJCXZvdXQtPnNtc3NoYWRvX3ZpcnRfYWRkcltqXSA9IDA7CisJCQkJdm91dC0+c21zc2hhZG9fcGh5X2FkZHJbal0gPSAwOworCQkJfQorCQkJKmNvdW50ID0gMDsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCW1lbXNldCgodm9pZCAqKSB2b3V0LT5zbXNzaGFkb192aXJ0X2FkZHJbaV0sIDAsCisJCQkJdm91dC0+c21zc2hhZG9fc2l6ZSk7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogV2FrZXMgdXAgdGhlIGFwcGxpY2F0aW9uIG9uY2UgdGhlIERNQSB0cmFuc2ZlciB0byBWUkZCIHNwYWNlIGlzIGNvbXBsZXRlZC4KKyAqLworc3RhdGljIHZvaWQgb21hcF92b3V0X3ZyZmJfZG1hX3R4X2NhbGxiYWNrKGludCBsY2gsIHUxNiBjaF9zdGF0dXMsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHZpZF92cmZiX2RtYSAqdCA9IChzdHJ1Y3QgdmlkX3ZyZmJfZG1hICopIGRhdGE7CisKKwl0LT50eF9zdGF0dXMgPSAxOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmdC0+d2FpdCk7Cit9CisKKy8qCisgKiBGcmVlIFZSRkIgYnVmZmVycworICovCit2b2lkIG9tYXBfdm91dF9mcmVlX3ZyZmJfYnVmZmVycyhzdHJ1Y3Qgb21hcF92b3V0X2RldmljZSAqdm91dCkKK3sKKwlpbnQgajsKKworCWZvciAoaiA9IDA7IGogPCBWUkZCX05VTV9CVUZTOyBqKyspIHsKKwkJb21hcF92b3V0X2ZyZWVfYnVmZmVyKHZvdXQtPnNtc3NoYWRvX3ZpcnRfYWRkcltqXSwKKwkJCQl2b3V0LT5zbXNzaGFkb19zaXplKTsKKwkJdm91dC0+c21zc2hhZG9fdmlydF9hZGRyW2pdID0gMDsKKwkJdm91dC0+c21zc2hhZG9fcGh5X2FkZHJbal0gPSAwOworCX0KK30KKworaW50IG9tYXBfdm91dF9zZXR1cF92cmZiX2J1ZnMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgaW50IHZpZF9udW0sCisJCQl1MzIgc3RhdGljX3ZyZmJfYWxsb2NhdGlvbikKK3sKKwlpbnQgcmV0ID0gMCwgaSwgajsKKwlzdHJ1Y3Qgb21hcF92b3V0X2RldmljZSAqdm91dDsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQ7CisJaW50IGltYWdlX3dpZHRoLCBpbWFnZV9oZWlnaHQ7CisJaW50IHZyZmJfbnVtX2J1ZnMgPSBWUkZCX05VTV9CVUZTOworCXN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgb21hcDJ2aWRlb19kZXZpY2UgKnZpZF9kZXYgPQorCQljb250YWluZXJfb2YodjRsMl9kZXYsIHN0cnVjdCBvbWFwMnZpZGVvX2RldmljZSwgdjRsMl9kZXYpOworCisJdm91dCA9IHZpZF9kZXYtPnZvdXRzW3ZpZF9udW1dOworCXZmZCA9IHZvdXQtPnZmZDsKKworCWZvciAoaSA9IDA7IGkgPCBWUkZCX05VTV9CVUZTOyBpKyspIHsKKwkJaWYgKG9tYXBfdnJmYl9yZXF1ZXN0X2N0eCgmdm91dC0+dnJmYl9jb250ZXh0W2ldKSkgeworCQkJZGV2X2luZm8oJnBkZXYtPmRldiwgIjogVlJGQiBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCQlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQorCQkJCW9tYXBfdnJmYl9yZWxlYXNlX2N0eCgmdm91dC0+dnJmYl9jb250ZXh0W2pdKTsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIGZyZWVfYnVmZmVyczsKKwkJfQorCX0KKworCS8qIENhbGN1bGF0ZSBWUkZCIG1lbW9yeSBzaXplICovCisJLyogYWxsb2NhdGUgZm9yIHdvcnN0IGNhc2Ugc2l6ZSAqLworCWltYWdlX3dpZHRoID0gVklEX01BWF9XSURUSCAvIFRJTEVfU0laRTsKKwlpZiAoVklEX01BWF9XSURUSCAlIFRJTEVfU0laRSkKKwkJaW1hZ2Vfd2lkdGgrKzsKKworCWltYWdlX3dpZHRoID0gaW1hZ2Vfd2lkdGggKiBUSUxFX1NJWkU7CisJaW1hZ2VfaGVpZ2h0ID0gVklEX01BWF9IRUlHSFQgLyBUSUxFX1NJWkU7CisKKwlpZiAoVklEX01BWF9IRUlHSFQgJSBUSUxFX1NJWkUpCisJCWltYWdlX2hlaWdodCsrOworCisJaW1hZ2VfaGVpZ2h0ID0gaW1hZ2VfaGVpZ2h0ICogVElMRV9TSVpFOworCXZvdXQtPnNtc3NoYWRvX3NpemUgPSBQQUdFX0FMSUdOKGltYWdlX3dpZHRoICogaW1hZ2VfaGVpZ2h0ICogMiAqIDIpOworCisJLyoKKwkgKiBSZXF1ZXN0IGFuZCBJbml0aWFsaXplIERNQSwgZm9yIERNQSBiYXNlZCBWUkZCIHRyYW5zZmVyCisJICovCisJdm91dC0+dnJmYl9kbWFfdHguZGV2X2lkID0gT01BUF9ETUFfTk9fREVWSUNFOworCXZvdXQtPnZyZmJfZG1hX3R4LmRtYV9jaCA9IC0xOworCXZvdXQtPnZyZmJfZG1hX3R4LnJlcV9zdGF0dXMgPSBETUFfQ0hBTl9BTExPVEVEOworCXJldCA9IG9tYXBfcmVxdWVzdF9kbWEodm91dC0+dnJmYl9kbWFfdHguZGV2X2lkLCAiVlJGQiBETUEgVFgiLAorCQkJb21hcF92b3V0X3ZyZmJfZG1hX3R4X2NhbGxiYWNrLAorCQkJKHZvaWQgKikgJnZvdXQtPnZyZmJfZG1hX3R4LCAmdm91dC0+dnJmYl9kbWFfdHguZG1hX2NoKTsKKwlpZiAocmV0IDwgMCkgeworCQl2b3V0LT52cmZiX2RtYV90eC5yZXFfc3RhdHVzID0gRE1BX0NIQU5fTk9UX0FMTE9URUQ7CisJCWRldl9pbmZvKCZwZGV2LT5kZXYsICI6IGZhaWxlZCB0byBhbGxvY2F0ZSBETUEgQ2hhbm5lbCBmb3IiCisJCQkJIiB2aWRlbyVkXG4iLCB2ZmQtPm1pbm9yKTsKKwl9CisJaW5pdF93YWl0cXVldWVfaGVhZCgmdm91dC0+dnJmYl9kbWFfdHgud2FpdCk7CisKKwkvKiBzdGF0aWNhbGx5IGFsbG9jYXRlZCB0aGUgVlJGQiBidWZmZXIgaXMgZG9uZSB0aHJvdWdoCisJICAgY29tbWFuZHMgbGluZSBhcnVtZW50cyAqLworCWlmIChzdGF0aWNfdnJmYl9hbGxvY2F0aW9uKSB7CisJCWlmIChvbWFwX3ZvdXRfYWxsb2NhdGVfdnJmYl9idWZmZXJzKHZvdXQsICZ2cmZiX251bV9idWZzLCAtMSkpIHsKKwkJCXJldCA9ICAtRU5PTUVNOworCQkJZ290byByZWxlYXNlX3ZyZmJfY3R4OworCQl9CisJCXZvdXQtPnZyZmJfc3RhdGljX2FsbG9jYXRpb24gPSAxOworCX0KKwlyZXR1cm4gMDsKKworcmVsZWFzZV92cmZiX2N0eDoKKwlmb3IgKGogPSAwOyBqIDwgVlJGQl9OVU1fQlVGUzsgaisrKQorCQlvbWFwX3ZyZmJfcmVsZWFzZV9jdHgoJnZvdXQtPnZyZmJfY29udGV4dFtqXSk7CitmcmVlX2J1ZmZlcnM6CisJb21hcF92b3V0X2ZyZWVfYnVmZmVycyh2b3V0KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZWxlYXNlIHRoZSBWUkZCIGNvbnRleHQgb25jZSB0aGUgbW9kdWxlIGV4aXRzCisgKi8KK3ZvaWQgb21hcF92b3V0X3JlbGVhc2VfdnJmYihzdHJ1Y3Qgb21hcF92b3V0X2RldmljZSAqdm91dCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBWUkZCX05VTV9CVUZTOyBpKyspCisJCW9tYXBfdnJmYl9yZWxlYXNlX2N0eCgmdm91dC0+dnJmYl9jb250ZXh0W2ldKTsKKworCWlmICh2b3V0LT52cmZiX2RtYV90eC5yZXFfc3RhdHVzID09IERNQV9DSEFOX0FMTE9URUQpIHsKKwkJdm91dC0+dnJmYl9kbWFfdHgucmVxX3N0YXR1cyA9IERNQV9DSEFOX05PVF9BTExPVEVEOworCQlvbWFwX2ZyZWVfZG1hKHZvdXQtPnZyZmJfZG1hX3R4LmRtYV9jaCk7CisJfQorfQorCisvKgorICogQWxsb2NhdGUgdGhlIGJ1ZmZlcnMgZm9yIHRoZSBWUkZCIHNwYWNlLiAgRGF0YSBpcyBjb3BpZWQgZnJvbSBWNEwyCisgKiBidWZmZXJzIHRvIHRoZSBWUkZCIGJ1ZmZlcnMgdXNpbmcgdGhlIERNQSBlbmdpbmUuCisgKi8KK2ludCBvbWFwX3ZvdXRfdnJmYl9idWZmZXJfc2V0dXAoc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQsCisJCQkgIHVuc2lnbmVkIGludCAqY291bnQsIHVuc2lnbmVkIGludCBzdGFydGluZGV4KQoreworCWludCBpOworCWJvb2wgeXV2X21vZGU7CisKKwlpZiAoIWlzX3JvdGF0aW9uX2VuYWJsZWQodm91dCkpCisJCXJldHVybiAwOworCisJLyogSWYgcm90YXRpb24gaXMgZW5hYmxlZCwgYWxsb2NhdGUgbWVtb3J5IGZvciBWUkZCIHNwYWNlIGFsc28gKi8KKwkqY291bnQgPSAqY291bnQgPiBWUkZCX05VTV9CVUZTID8gVlJGQl9OVU1fQlVGUyA6ICpjb3VudDsKKworCS8qIEFsbG9jYXRlIHRoZSBWUkZCIGJ1ZmZlcnMgb25seSBpZiB0aGUgYnVmZmVycyBhcmUgbm90CisJICogYWxsb2NhdGVkIGR1cmluZyBpbml0IHRpbWUuCisJICovCisJaWYgKCF2b3V0LT52cmZiX3N0YXRpY19hbGxvY2F0aW9uKQorCQlpZiAob21hcF92b3V0X2FsbG9jYXRlX3ZyZmJfYnVmZmVycyh2b3V0LCBjb3VudCwgc3RhcnRpbmRleCkpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICh2b3V0LT5kc3NfbW9kZSA9PSBPTUFQX0RTU19DT0xPUl9ZVVYyIHx8CisJCQl2b3V0LT5kc3NfbW9kZSA9PSBPTUFQX0RTU19DT0xPUl9VWVZZKQorCQl5dXZfbW9kZSA9IHRydWU7CisJZWxzZQorCQl5dXZfbW9kZSA9IGZhbHNlOworCisJZm9yIChpID0gMDsgaSA8ICpjb3VudDsgaSsrKQorCQlvbWFwX3ZyZmJfc2V0dXAoJnZvdXQtPnZyZmJfY29udGV4dFtpXSwKKwkJCQl2b3V0LT5zbXNzaGFkb19waHlfYWRkcltpXSwgdm91dC0+cGl4LndpZHRoLAorCQkJCXZvdXQtPnBpeC5oZWlnaHQsIHZvdXQtPmJwcCwgeXV2X21vZGUpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBvbWFwX3ZvdXRfcHJlcGFyZV92cmZiKHN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0LAorCQkJCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQoreworCWRtYV9hZGRyX3QgZG1hYnVmOworCXN0cnVjdCB2aWRfdnJmYl9kbWEgKnR4OworCWVudW0gZHNzX3JvdGF0aW9uIHJvdGF0aW9uOworCXUzMiBkZXN0X2ZyYW1lX2luZGV4ID0gMCwgc3JjX2VsZW1lbnRfaW5kZXggPSAwOworCXUzMiBkZXN0X2VsZW1lbnRfaW5kZXggPSAwLCBzcmNfZnJhbWVfaW5kZXggPSAwOworCXUzMiBlbGVtX2NvdW50ID0gMCwgZnJhbWVfY291bnQgPSAwLCBwaXhzaXplID0gMjsKKworCWlmICghaXNfcm90YXRpb25fZW5hYmxlZCh2b3V0KSkKKwkJcmV0dXJuIDA7CisKKwlkbWFidWYgPSB2b3V0LT5idWZfcGh5X2FkZHJbdmItPmldOworCS8qIElmIHJvdGF0aW9uIGlzIGVuYWJsZWQsIGNvcHkgaW5wdXQgYnVmZmVyIGludG8gVlJGQgorCSAqIG1lbW9yeSBzcGFjZSB1c2luZyBETUEuIFdlIGFyZSBjb3B5aW5nIGlucHV0IGJ1ZmZlcgorCSAqIGludG8gVlJGQiBtZW1vcnkgc3BhY2Ugb2YgZGVzaXJlZCBhbmdsZSBhbmQgRFNTIHdpbGwKKwkgKiByZWFkIGltYWdlIFZSRkIgbWVtb3J5IGZvciAwIGRlZ3JlZSBhbmdsZQorCSAqLworCXBpeHNpemUgPSB2b3V0LT5icHAgKiB2b3V0LT52cmZiX2JwcDsKKwkvKgorCSAqIERNQSB0cmFuc2ZlciBpbiBkb3VibGUgaW5kZXggbW9kZQorCSAqLworCisJLyogRnJhbWUgaW5kZXggKi8KKwlkZXN0X2ZyYW1lX2luZGV4ID0gKChNQVhfUElYRUxTX1BFUl9MSU5FICogcGl4c2l6ZSkgLQorCQkJKHZvdXQtPnBpeC53aWR0aCAqIHZvdXQtPmJwcCkpICsgMTsKKworCS8qIFNvdXJjZSBhbmQgZGVzdGluYXRpb24gcGFyYW1ldGVycyAqLworCXNyY19lbGVtZW50X2luZGV4ID0gMDsKKwlzcmNfZnJhbWVfaW5kZXggPSAwOworCWRlc3RfZWxlbWVudF9pbmRleCA9IDE7CisJLyogTnVtYmVyIG9mIGVsZW1lbnRzIHBlciBmcmFtZSAqLworCWVsZW1fY291bnQgPSB2b3V0LT5waXgud2lkdGggKiB2b3V0LT5icHA7CisJZnJhbWVfY291bnQgPSB2b3V0LT5waXguaGVpZ2h0OworCXR4ID0gJnZvdXQtPnZyZmJfZG1hX3R4OworCXR4LT50eF9zdGF0dXMgPSAwOworCW9tYXBfc2V0X2RtYV90cmFuc2Zlcl9wYXJhbXModHgtPmRtYV9jaCwgT01BUF9ETUFfREFUQV9UWVBFX1MzMiwKKwkJCShlbGVtX2NvdW50IC8gNCksIGZyYW1lX2NvdW50LCBPTUFQX0RNQV9TWU5DX0VMRU1FTlQsCisJCQl0eC0+ZGV2X2lkLCAweDApOworCS8qIHNyY19wb3J0IHJlcXVpcmVkIG9ubHkgZm9yIE9NQVAxICovCisJb21hcF9zZXRfZG1hX3NyY19wYXJhbXModHgtPmRtYV9jaCwgMCwgT01BUF9ETUFfQU1PREVfUE9TVF9JTkMsCisJCQlkbWFidWYsIHNyY19lbGVtZW50X2luZGV4LCBzcmNfZnJhbWVfaW5kZXgpOworCS8qc2V0IGRtYSBzb3VyY2UgYnVyc3QgbW9kZSBmb3IgVlJGQiAqLworCW9tYXBfc2V0X2RtYV9zcmNfYnVyc3RfbW9kZSh0eC0+ZG1hX2NoLCBPTUFQX0RNQV9EQVRBX0JVUlNUXzE2KTsKKwlyb3RhdGlvbiA9IGNhbGNfcm90YXRpb24odm91dCk7CisKKwkvKiBkZXN0X3BvcnQgcmVxdWlyZWQgb25seSBmb3IgT01BUDEgKi8KKwlvbWFwX3NldF9kbWFfZGVzdF9wYXJhbXModHgtPmRtYV9jaCwgMCwgT01BUF9ETUFfQU1PREVfRE9VQkxFX0lEWCwKKwkJCXZvdXQtPnZyZmJfY29udGV4dFt2Yi0+aV0ucGFkZHJbMF0sIGRlc3RfZWxlbWVudF9pbmRleCwKKwkJCWRlc3RfZnJhbWVfaW5kZXgpOworCS8qc2V0IGRtYSBkZXN0IGJ1cnN0IG1vZGUgZm9yIFZSRkIgKi8KKwlvbWFwX3NldF9kbWFfZGVzdF9idXJzdF9tb2RlKHR4LT5kbWFfY2gsIE9NQVBfRE1BX0RBVEFfQlVSU1RfMTYpOworCW9tYXBfZG1hX3NldF9nbG9iYWxfcGFyYW1zKERNQV9ERUZBVUxUX0FSQl9SQVRFLCAweDIwLCAwKTsKKworCW9tYXBfc3RhcnRfZG1hKHR4LT5kbWFfY2gpOworCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmdHgtPndhaXQsIFZSRkJfVFhfVElNRU9VVCk7CisKKwlpZiAodHgtPnR4X3N0YXR1cyA9PSAwKSB7CisJCW9tYXBfc3RvcF9kbWEodHgtPmRtYV9jaCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkvKiBTdG9yZSBidWZmZXJzIHBoeXNpY2FsIGFkZHJlc3MgaW50byBhbiBhcnJheS4gQWRkcmVzc2VzCisJICogZnJvbSB0aGlzIGFycmF5IHdpbGwgYmUgdXNlZCB0byBjb25maWd1cmUgRFNTICovCisJdm91dC0+cXVldWVkX2J1Zl9hZGRyW3ZiLT5pXSA9ICh1OCAqKQorCQl2b3V0LT52cmZiX2NvbnRleHRbdmItPmldLnBhZGRyW3JvdGF0aW9uXTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENhbGN1bGF0ZSB0aGUgYnVmZmVyIG9mZnNldHMgZnJvbSB3aGljaCB0aGUgc3RyZWFtaW5nIHNob3VsZAorICogc3RhcnQuIFRoaXMgb2Zmc2V0IGNhbGN1bGF0aW9uIGlzIG1haW5seSByZXF1aXJlZCBiZWNhdXNlIG9mCisgKiB0aGUgVlJGQiAzMiBwaXhlbHMgYWxpZ25tZW50IHdpdGggcm90YXRpb24uCisgKi8KK3ZvaWQgb21hcF92b3V0X2NhbGN1bGF0ZV92cmZiX29mZnNldChzdHJ1Y3Qgb21hcF92b3V0X2RldmljZSAqdm91dCkKK3sKKwllbnVtIGRzc19yb3RhdGlvbiByb3RhdGlvbjsKKwlib29sIG1pcnJvcmluZyA9IHZvdXQtPm1pcnJvcjsKKwlzdHJ1Y3QgdjRsMl9yZWN0ICpjcm9wID0gJnZvdXQtPmNyb3A7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4ID0gJnZvdXQtPnBpeDsKKwlpbnQgKmNyb3BwZWRfb2Zmc2V0ID0gJnZvdXQtPmNyb3BwZWRfb2Zmc2V0OworCWludCB2cl9wcyA9IDEsIHBzID0gMiwgdGVtcF9wcyA9IDI7CisJaW50IG9mZnNldCA9IDAsIGN0b3AgPSAwLCBjbGVmdCA9IDAsIGxpbmVfbGVuZ3RoID0gMDsKKworCXJvdGF0aW9uID0gY2FsY19yb3RhdGlvbih2b3V0KTsKKworCWlmIChWNEwyX1BJWF9GTVRfWVVZViA9PSBwaXgtPnBpeGVsZm9ybWF0IHx8CisJCQlWNEwyX1BJWF9GTVRfVVlWWSA9PSBwaXgtPnBpeGVsZm9ybWF0KSB7CisJCWlmIChpc19yb3RhdGlvbl9lbmFibGVkKHZvdXQpKSB7CisJCQkvKgorCQkJICogcHMgICAgLSBBY3R1YWwgcGl4ZWwgc2l6ZSBmb3IgWVVZVi9VWVZZIGZvcgorCQkJICogICAgICAgICBWUkZCL01pcnJvcmluZyBpcyA0IGJ5dGVzCisJCQkgKiB2cl9wcyAtIFZpcnR1YWxseSBwaXhlbCBzaXplIGZvciBZVVlWL1VZVlkgaXMKKwkJCSAqICAgICAgICAgMiBieXRlcworCQkJICovCisJCQlwcyA9IDQ7CisJCQl2cl9wcyA9IDI7CisJCX0gZWxzZSB7CisJCQlwcyA9IDI7CS8qIG90aGVyd2lzZSB0aGUgcGl4ZWwgc2l6ZSBpcyAyIGJ5dGUgKi8KKwkJfQorCX0gZWxzZSBpZiAoVjRMMl9QSVhfRk1UX1JHQjMyID09IHBpeC0+cGl4ZWxmb3JtYXQpIHsKKwkJcHMgPSA0OworCX0gZWxzZSBpZiAoVjRMMl9QSVhfRk1UX1JHQjI0ID09IHBpeC0+cGl4ZWxmb3JtYXQpIHsKKwkJcHMgPSAzOworCX0KKwl2b3V0LT5wcyA9IHBzOworCXZvdXQtPnZyX3BzID0gdnJfcHM7CisKKwlpZiAoaXNfcm90YXRpb25fZW5hYmxlZCh2b3V0KSkgeworCQlsaW5lX2xlbmd0aCA9IE1BWF9QSVhFTFNfUEVSX0xJTkU7CisJCWN0b3AgPSAocGl4LT5oZWlnaHQgLSBjcm9wLT5oZWlnaHQpIC0gY3JvcC0+dG9wOworCQljbGVmdCA9IChwaXgtPndpZHRoIC0gY3JvcC0+d2lkdGgpIC0gY3JvcC0+bGVmdDsKKwl9IGVsc2UgeworCQlsaW5lX2xlbmd0aCA9IHBpeC0+d2lkdGg7CisJfQorCXZvdXQtPmxpbmVfbGVuZ3RoID0gbGluZV9sZW5ndGg7CisJc3dpdGNoIChyb3RhdGlvbikgeworCWNhc2UgZHNzX3JvdGF0aW9uXzkwX2RlZ3JlZToKKwkJb2Zmc2V0ID0gdm91dC0+dnJmYl9jb250ZXh0WzBdLnlvZmZzZXQgKgorCQkJdm91dC0+dnJmYl9jb250ZXh0WzBdLmJ5dGVzcHA7CisJCXRlbXBfcHMgPSBwcyAvIHZyX3BzOworCQlpZiAobWlycm9yaW5nID09IDApIHsKKwkJCSpjcm9wcGVkX29mZnNldCA9IG9mZnNldCArIGxpbmVfbGVuZ3RoICoKKwkJCQl0ZW1wX3BzICogY2xlZnQgKyBjcm9wLT50b3AgKiB0ZW1wX3BzOworCQl9IGVsc2UgeworCQkJKmNyb3BwZWRfb2Zmc2V0ID0gb2Zmc2V0ICsgbGluZV9sZW5ndGggKiB0ZW1wX3BzICoKKwkJCQljbGVmdCArIGNyb3AtPnRvcCAqIHRlbXBfcHMgKyAobGluZV9sZW5ndGggKgorCQkJCSgoY3JvcC0+d2lkdGggLyAodnJfcHMpKSAtIDEpICogcHMpOworCQl9CisJCWJyZWFrOworCWNhc2UgZHNzX3JvdGF0aW9uXzE4MF9kZWdyZWU6CisJCW9mZnNldCA9ICgoTUFYX1BJWEVMU19QRVJfTElORSAqIHZvdXQtPnZyZmJfY29udGV4dFswXS55b2Zmc2V0ICoKKwkJCXZvdXQtPnZyZmJfY29udGV4dFswXS5ieXRlc3BwKSArCisJCQkodm91dC0+dnJmYl9jb250ZXh0WzBdLnhvZmZzZXQgKgorCQkJdm91dC0+dnJmYl9jb250ZXh0WzBdLmJ5dGVzcHApKTsKKwkJaWYgKG1pcnJvcmluZyA9PSAwKSB7CisJCQkqY3JvcHBlZF9vZmZzZXQgPSBvZmZzZXQgKyAobGluZV9sZW5ndGggKiBwcyAqIGN0b3ApICsKKwkJCQkoY2xlZnQgLyB2cl9wcykgKiBwczsKKworCQl9IGVsc2UgeworCQkJKmNyb3BwZWRfb2Zmc2V0ID0gb2Zmc2V0ICsgKGxpbmVfbGVuZ3RoICogcHMgKiBjdG9wKSArCisJCQkJKGNsZWZ0IC8gdnJfcHMpICogcHMgKyAobGluZV9sZW5ndGggKgorCQkJCShjcm9wLT5oZWlnaHQgLSAxKSAqIHBzKTsKKwkJfQorCQlicmVhazsKKwljYXNlIGRzc19yb3RhdGlvbl8yNzBfZGVncmVlOgorCQlvZmZzZXQgPSBNQVhfUElYRUxTX1BFUl9MSU5FICogdm91dC0+dnJmYl9jb250ZXh0WzBdLnhvZmZzZXQgKgorCQkJdm91dC0+dnJmYl9jb250ZXh0WzBdLmJ5dGVzcHA7CisJCXRlbXBfcHMgPSBwcyAvIHZyX3BzOworCQlpZiAobWlycm9yaW5nID09IDApIHsKKwkJCSpjcm9wcGVkX29mZnNldCA9IG9mZnNldCArIGxpbmVfbGVuZ3RoICoKKwkJCSAgICB0ZW1wX3BzICogY3JvcC0+bGVmdCArIGN0b3AgKiBwczsKKwkJfSBlbHNlIHsKKwkJCSpjcm9wcGVkX29mZnNldCA9IG9mZnNldCArIGxpbmVfbGVuZ3RoICoKKwkJCQl0ZW1wX3BzICogY3JvcC0+bGVmdCArIGN0b3AgKiBwcyArCisJCQkJKGxpbmVfbGVuZ3RoICogKChjcm9wLT53aWR0aCAvIHZyX3BzKSAtIDEpICoKKwkJCQkgcHMpOworCQl9CisJCWJyZWFrOworCWNhc2UgZHNzX3JvdGF0aW9uXzBfZGVncmVlOgorCQlpZiAobWlycm9yaW5nID09IDApIHsKKwkJCSpjcm9wcGVkX29mZnNldCA9IChsaW5lX2xlbmd0aCAqIHBzKSAqCisJCQkJY3JvcC0+dG9wICsgKGNyb3AtPmxlZnQgLyB2cl9wcykgKiBwczsKKwkJfSBlbHNlIHsKKwkJCSpjcm9wcGVkX29mZnNldCA9IChsaW5lX2xlbmd0aCAqIHBzKSAqCisJCQkJY3JvcC0+dG9wICsgKGNyb3AtPmxlZnQgLyB2cl9wcykgKiBwcyArCisJCQkJKGxpbmVfbGVuZ3RoICogKGNyb3AtPmhlaWdodCAtIDEpICogcHMpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCSpjcm9wcGVkX29mZnNldCA9IChsaW5lX2xlbmd0aCAqIHBzICogY3JvcC0+dG9wKSAvCisJCQl2cl9wcyArIChjcm9wLT5sZWZ0ICogcHMpIC8gdnJfcHMgKworCQkJKChjcm9wLT53aWR0aCAvIHZyX3BzKSAtIDEpICogcHM7CisJCWJyZWFrOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9vbWFwX3ZvdXRfdnJmYi5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL29tYXBfdm91dF92cmZiLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZkZTc0MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9vbWFwX3ZvdXRfdnJmYi5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBvbWFwX3ZvdXRfdnJmYi5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRleGFzIEluc3RydW1lbnRzLgorICoKKyAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIuIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueQorICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKgorICovCisKKyNpZm5kZWYgT01BUF9WT1VUX1ZSRkJfSAorI2RlZmluZSBPTUFQX1ZPVVRfVlJGQl9ICisKKyNpZmRlZiBDT05GSUdfVklERU9fT01BUDJfVk9VVF9WUkZCCit2b2lkIG9tYXBfdm91dF9mcmVlX3ZyZmJfYnVmZmVycyhzdHJ1Y3Qgb21hcF92b3V0X2RldmljZSAqdm91dCk7CitpbnQgb21hcF92b3V0X3NldHVwX3ZyZmJfYnVmcyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBpbnQgdmlkX251bSwKKwkJCXUzMiBzdGF0aWNfdnJmYl9hbGxvY2F0aW9uKTsKK3ZvaWQgb21hcF92b3V0X3JlbGVhc2VfdnJmYihzdHJ1Y3Qgb21hcF92b3V0X2RldmljZSAqdm91dCk7CitpbnQgb21hcF92b3V0X3ZyZmJfYnVmZmVyX3NldHVwKHN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0LAorCQkJdW5zaWduZWQgaW50ICpjb3VudCwgdW5zaWduZWQgaW50IHN0YXJ0aW5kZXgpOworaW50IG9tYXBfdm91dF9wcmVwYXJlX3ZyZmIoc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQsCisJCQlzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2Yik7Cit2b2lkIG9tYXBfdm91dF9jYWxjdWxhdGVfdnJmYl9vZmZzZXQoc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQpOworI2Vsc2UKK3ZvaWQgb21hcF92b3V0X2ZyZWVfdnJmYl9idWZmZXJzKHN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0KSB7IH0KK2ludCBvbWFwX3ZvdXRfc2V0dXBfdnJmYl9idWZzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIGludCB2aWRfbnVtLAorCQkJdTMyIHN0YXRpY192cmZiX2FsbG9jYXRpb24pCisJCXsgcmV0dXJuIDA7IH0KK3ZvaWQgb21hcF92b3V0X3JlbGVhc2VfdnJmYihzdHJ1Y3Qgb21hcF92b3V0X2RldmljZSAqdm91dCkgeyB9CitpbnQgb21hcF92b3V0X3ZyZmJfYnVmZmVyX3NldHVwKHN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0LAorCQkJdW5zaWduZWQgaW50ICpjb3VudCwgdW5zaWduZWQgaW50IHN0YXJ0aW5kZXgpCisJCXsgcmV0dXJuIDA7IH0KK2ludCBvbWFwX3ZvdXRfcHJlcGFyZV92cmZiKHN0cnVjdCBvbWFwX3ZvdXRfZGV2aWNlICp2b3V0LAorCQkJc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqdmIpCisJCXsgcmV0dXJuIDA7IH0KK3ZvaWQgb21hcF92b3V0X2NhbGN1bGF0ZV92cmZiX29mZnNldChzdHJ1Y3Qgb21hcF92b3V0X2RldmljZSAqdm91dCkgeyB9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvb21hcF92b3V0ZGVmLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvb21hcF92b3V0ZGVmLmgKaW5kZXggNjU5NDk3Yi4uZDc5MzUwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL29tYXBfdm91dGRlZi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9vbWFwX3ZvdXRkZWYuaApAQCAtMTIsNiArMTIsNyBAQAogI2RlZmluZSBPTUFQX1ZPVVRERUZfSAogCiAjaW5jbHVkZSA8dmlkZW8vb21hcGRzcy5oPgorI2luY2x1ZGUgPHBsYXQvdnJmYi5oPgogCiAjZGVmaW5lIFlVWVZfQlBQICAgICAgICAyCiAjZGVmaW5lIFJHQjU2NV9CUFAgICAgICAyCkBAIC0yNyw2ICsyOCwzMSBAQAogI2RlZmluZSBNQVhfRElTUExBWVMJMwogI2RlZmluZSBNQVhfTUFOQUdFUlMJMwogCisjZGVmaW5lIFFRVkdBX1dJRFRICQkxNjAKKyNkZWZpbmUgUVFWR0FfSEVJR0hUCQkxMjAKKworLyogTWF4IFJlc29sdXRpb24gc3VwcG9ydGVkIGJ5IHRoZSBkcml2ZXIgKi8KKyNkZWZpbmUgVklEX01BWF9XSURUSAkJMTI4MAkvKiBMYXJnZXN0IHdpZHRoICovCisjZGVmaW5lIFZJRF9NQVhfSEVJR0hUCQk3MjAJLyogTGFyZ2VzdCBoZWlnaHQgKi8KKworLyogTWltaW11bSByZXF1aXJlbWVudCBpcyAyeDIgZm9yIERTUyAqLworI2RlZmluZSBWSURfTUlOX1dJRFRICQkyCisjZGVmaW5lIFZJRF9NSU5fSEVJR0hUCQkyCisKKy8qIDIwNDggeCAyMDQ4IGlzIG1heCByZXMgc3VwcG9ydGVkIGJ5IE9NQVAgZGlzcGxheSBjb250cm9sbGVyICovCisjZGVmaW5lIE1BWF9QSVhFTFNfUEVSX0xJTkUgICAgIDIwNDgKKworI2RlZmluZSBWUkZCX1RYX1RJTUVPVVQgICAgICAgICAxMDAwCisjZGVmaW5lIFZSRkJfTlVNX0JVRlMJCTQKKworLyogTWF4IGJ1ZmZlciBzaXplIHRvYmUgYWxsb2NhdGVkIGR1cmluZyBpbml0ICovCisjZGVmaW5lIE9NQVBfVk9VVF9NQVhfQlVGX1NJWkUgKFZJRF9NQVhfV0lEVEgqVklEX01BWF9IRUlHSFQqNCkKKworZW51bSBkbWFfY2hhbm5lbF9zdGF0ZSB7CisJRE1BX0NIQU5fTk9UX0FMTE9URUQsCisJRE1BX0NIQU5fQUxMT1RFRCwKK307CisKIC8qIEVudW0gZm9yIFJvdGF0aW9uCiAgKiBEU1MgdW5kZXJzdGFuZHMgcm90YXRpb24gaW4gMCwgMSwgMiwgMyBjb250ZXh0CiAgKiB3aGlsZSBWNEwyIGRyaXZlciB1bmRlcnN0YW5kcyBpdCBhcyAwLCA5MCwgMTgwLCAyNzAKQEAgLTM3LDYgKzYzLDE4IEBACiAJZHNzX3JvdGF0aW9uXzE4MF9kZWdyZWUJPSAyLAogCWRzc19yb3RhdGlvbl8yNzBfZGVncmVlID0gMywKIH07CisKKy8qIEVudW0gZm9yIGNob29zaW5nIHJvdGF0aW9uIHR5cGUgZm9yIHZvdXQKKyAqIERTUzIgZG9lc24ndCB1bmRlcnN0YW5kIG5vIHJvdGF0aW9uIGFzIGFuCisgKiBvcHRpb24gd2hpbGUgVjRMMiBkcml2ZXIgZG9lc24ndCBzdXBwb3J0CisgKiByb3RhdGlvbiBpbiB0aGUgY2FzZSB3aGVyZSBWUkZCIGlzIG5vdCBidWlsdCBpbgorICogdGhlIGtlcm5lbAorICovCitlbnVtIHZvdXRfcm90YWlvbl90eXBlIHsKKwlWT1VUX1JPVF9OT05FCT0gMCwKKwlWT1VUX1JPVF9WUkZCCT0gMSwKK307CisKIC8qCiAgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHN0b3JlIHRoZSBETUEgdHJhbnNmZXIgcGFyYW1ldGVycwogICogZm9yIFZSRkIgaGlkZGVuIGJ1ZmZlcgpAQCAtNTMsNiArOTEsNyBAQAogCWludCBpZDsKIAlpbnQgbnVtX292ZXJsYXlzOwogCXN0cnVjdCBvbWFwX292ZXJsYXkgKm92ZXJsYXlzW01BWF9PVkxTXTsKKwllbnVtIHZvdXRfcm90YWlvbl90eXBlIHJvdGF0aW9uX3R5cGU7CiB9OwogCiBzdHJ1Y3Qgb21hcDJ2aWRlb19kZXZpY2UgewpAQCAtMTQ0LDQgKzE4Myw0MyBAQAogCWludCBpb19hbGxvd2VkOwogCiB9OworCisvKgorICogUmV0dXJuIHRydWUgaWYgcm90YXRpb24gaXMgOTAgb3IgMjcwCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlzX3JvdGF0aW9uXzkwX29yXzI3MChjb25zdCBzdHJ1Y3Qgb21hcF92b3V0X2RldmljZSAqdm91dCkKK3sKKwlyZXR1cm4gKHZvdXQtPnJvdGF0aW9uID09IGRzc19yb3RhdGlvbl85MF9kZWdyZWUgfHwKKwkJCXZvdXQtPnJvdGF0aW9uID09IGRzc19yb3RhdGlvbl8yNzBfZGVncmVlKTsKK30KKworLyoKKyAqIFJldHVybiB0cnVlIGlmIHJvdGF0aW9uIGlzIGVuYWJsZWQKKyAqLworc3RhdGljIGlubGluZSBpbnQgaXNfcm90YXRpb25fZW5hYmxlZChjb25zdCBzdHJ1Y3Qgb21hcF92b3V0X2RldmljZSAqdm91dCkKK3sKKwlyZXR1cm4gdm91dC0+cm90YXRpb24gfHwgdm91dC0+bWlycm9yOworfQorCisvKgorICogUmV2ZXJzZSB0aGUgcm90YXRpb24gZGVncmVlIGlmIG1pcnJvcmluZyBpcyBlbmFibGVkCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNhbGNfcm90YXRpb24oY29uc3Qgc3RydWN0IG9tYXBfdm91dF9kZXZpY2UgKnZvdXQpCit7CisJaWYgKCF2b3V0LT5taXJyb3IpCisJCXJldHVybiB2b3V0LT5yb3RhdGlvbjsKKworCXN3aXRjaCAodm91dC0+cm90YXRpb24pIHsKKwljYXNlIGRzc19yb3RhdGlvbl85MF9kZWdyZWU6CisJCXJldHVybiBkc3Nfcm90YXRpb25fMjcwX2RlZ3JlZTsKKwljYXNlIGRzc19yb3RhdGlvbl8yNzBfZGVncmVlOgorCQlyZXR1cm4gZHNzX3JvdGF0aW9uXzkwX2RlZ3JlZTsKKwljYXNlIGRzc19yb3RhdGlvbl8xODBfZGVncmVlOgorCQlyZXR1cm4gZHNzX3JvdGF0aW9uXzBfZGVncmVlOworCWRlZmF1bHQ6CisJCXJldHVybiBkc3Nfcm90YXRpb25fMTgwX2RlZ3JlZTsKKwl9Cit9CisKK3ZvaWQgb21hcF92b3V0X2ZyZWVfYnVmZmVycyhzdHJ1Y3Qgb21hcF92b3V0X2RldmljZSAqdm91dCk7CiAjZW5kaWYJLyogaWZuZGVmIE9NQVBfVk9VVERFRl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvb21hcF92b3V0bGliLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvb21hcF92b3V0bGliLmMKaW5kZXggOGFlNzQ4MS4uMTE1NDA4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL29tYXBfdm91dGxpYi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9vbWFwX3ZvdXRsaWIuYwpAQCAtMjQsOCArMjQsMTIgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogCisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKwogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAKKyNpbmNsdWRlICJvbWFwX3ZvdXRsaWIuaCIKKwogTU9EVUxFX0FVVEhPUigiVGV4YXMgSW5zdHJ1bWVudHMiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiT01BUCBWaWRlbyBsaWJyYXJ5Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CkBAIC0yOTEsMyArMjk1LDQ1IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChvbWFwX3ZvdXRfbmV3X2Zvcm1hdCk7CiAKKy8qCisgKiBBbGxvY2F0ZSBidWZmZXJzCisgKi8KK3Vuc2lnbmVkIGxvbmcgb21hcF92b3V0X2FsbG9jX2J1ZmZlcih1MzIgYnVmX3NpemUsIHUzMiAqcGh5c19hZGRyKQoreworCXUzMiBvcmRlciwgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHZpcnRfYWRkciwgYWRkcjsKKworCXNpemUgPSBQQUdFX0FMSUdOKGJ1Zl9zaXplKTsKKwlvcmRlciA9IGdldF9vcmRlcihzaXplKTsKKwl2aXJ0X2FkZHIgPSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIG9yZGVyKTsKKwlhZGRyID0gdmlydF9hZGRyOworCisJaWYgKHZpcnRfYWRkcikgeworCQl3aGlsZSAoc2l6ZSA+IDApIHsKKwkJCVNldFBhZ2VSZXNlcnZlZCh2aXJ0X3RvX3BhZ2UoYWRkcikpOworCQkJYWRkciArPSBQQUdFX1NJWkU7CisJCQlzaXplIC09IFBBR0VfU0laRTsKKwkJfQorCX0KKwkqcGh5c19hZGRyID0gKHUzMikgdmlydF90b19waHlzKCh2b2lkICopIHZpcnRfYWRkcik7CisJcmV0dXJuIHZpcnRfYWRkcjsKK30KKworLyoKKyAqIEZyZWUgYnVmZmVycworICovCit2b2lkIG9tYXBfdm91dF9mcmVlX2J1ZmZlcih1bnNpZ25lZCBsb25nIHZpcnRhZGRyLCB1MzIgYnVmX3NpemUpCit7CisJdTMyIG9yZGVyLCBzaXplOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IHZpcnRhZGRyOworCisJc2l6ZSA9IFBBR0VfQUxJR04oYnVmX3NpemUpOworCW9yZGVyID0gZ2V0X29yZGVyKHNpemUpOworCisJd2hpbGUgKHNpemUgPiAwKSB7CisJCUNsZWFyUGFnZVJlc2VydmVkKHZpcnRfdG9fcGFnZShhZGRyKSk7CisJCWFkZHIgKz0gUEFHRV9TSVpFOworCQlzaXplIC09IFBBR0VfU0laRTsKKwl9CisJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgdmlydGFkZHIsIG9yZGVyKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9vbWFwX3ZvdXRsaWIuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9vbWFwX3ZvdXRsaWIuaAppbmRleCBhNjBiMTZlLi5lNTE3NTBhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvb21hcF92b3V0bGliLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL29tYXBfdm91dGxpYi5oCkBAIC0xMiwyMyArMTIsMjUgQEAKICNpZm5kZWYgT01BUF9WT1VUTElCX0gKICNkZWZpbmUgT01BUF9WT1VUTElCX0gKIAotZXh0ZXJuIHZvaWQgb21hcF92b3V0X2RlZmF1bHRfY3JvcChzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXgsCit2b2lkIG9tYXBfdm91dF9kZWZhdWx0X2Nyb3Aoc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4LAogCQlzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlciAqZmJ1Ziwgc3RydWN0IHY0bDJfcmVjdCAqY3JvcCk7CiAKLWV4dGVybiBpbnQgb21hcF92b3V0X25ld19jcm9wKHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeCwKK2ludCBvbWFwX3ZvdXRfbmV3X2Nyb3Aoc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4LAogCQlzdHJ1Y3QgdjRsMl9yZWN0ICpjcm9wLCBzdHJ1Y3QgdjRsMl93aW5kb3cgKndpbiwKIAkJc3RydWN0IHY0bDJfZnJhbWVidWZmZXIgKmZidWYsCiAJCWNvbnN0IHN0cnVjdCB2NGwyX3JlY3QgKm5ld19jcm9wKTsKIAotZXh0ZXJuIGludCBvbWFwX3ZvdXRfdHJ5X3dpbmRvdyhzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlciAqZmJ1ZiwKK2ludCBvbWFwX3ZvdXRfdHJ5X3dpbmRvdyhzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlciAqZmJ1ZiwKIAkJc3RydWN0IHY0bDJfd2luZG93ICpuZXdfd2luKTsKIAotZXh0ZXJuIGludCBvbWFwX3ZvdXRfbmV3X3dpbmRvdyhzdHJ1Y3QgdjRsMl9yZWN0ICpjcm9wLAoraW50IG9tYXBfdm91dF9uZXdfd2luZG93KHN0cnVjdCB2NGwyX3JlY3QgKmNyb3AsCiAJCXN0cnVjdCB2NGwyX3dpbmRvdyAqd2luLCBzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlciAqZmJ1ZiwKIAkJc3RydWN0IHY0bDJfd2luZG93ICpuZXdfd2luKTsKIAotZXh0ZXJuIHZvaWQgb21hcF92b3V0X25ld19mb3JtYXQoc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4LAordm9pZCBvbWFwX3ZvdXRfbmV3X2Zvcm1hdChzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXgsCiAJCXN0cnVjdCB2NGwyX2ZyYW1lYnVmZmVyICpmYnVmLCBzdHJ1Y3QgdjRsMl9yZWN0ICpjcm9wLAogCQlzdHJ1Y3QgdjRsMl93aW5kb3cgKndpbik7Cit1bnNpZ25lZCBsb25nIG9tYXBfdm91dF9hbGxvY19idWZmZXIodTMyIGJ1Zl9zaXplLCB1MzIgKnBoeXNfYWRkcik7Cit2b2lkIG9tYXBfdm91dF9mcmVlX2J1ZmZlcih1bnNpZ25lZCBsb25nIHZpcnRhZGRyLCB1MzIgYnVmX3NpemUpOwogI2VuZGlmCS8qICNpZm5kZWYgT01BUF9WT1VUTElCX0ggKi8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwMV9jYW1lcmEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDFfY2FtZXJhLmMKaW5kZXggZTdjZmM4NS4uOGE5NDdlNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwMV9jYW1lcmEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAxX2NhbWVyYS5jCkBAIC0yNiw3ICsyNiw2IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KIAogI2luY2x1ZGUgPG1lZGlhL29tYXAxX2NhbWVyYS5oPgogI2luY2x1ZGUgPG1lZGlhL3NvY19jYW1lcmEuaD4KQEAgLTM4LDcgKzM3LDcgQEAKIAogCiAjZGVmaW5lIERSSVZFUl9OQU1FCQkib21hcDEtY2FtZXJhIgotI2RlZmluZSBWRVJTSU9OX0NPREUJCUtFUk5FTF9WRVJTSU9OKDAsIDAsIDEpCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OCQkiMC4wLjIiCiAKIAogLyoKQEAgLTIwOCw3ICsyMDcsNyBAQAogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gdnEtPnByaXZfZGF0YTsKIAlpbnQgYnl0ZXNfcGVyX2xpbmUgPSBzb2NfbWJ1c19ieXRlc19wZXJfbGluZShpY2QtPnVzZXJfd2lkdGgsCiAJCQlpY2QtPmN1cnJlbnRfZm10LT5ob3N0X2ZtdCk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3Qgb21hcDFfY2FtX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAKIAlpZiAoYnl0ZXNfcGVyX2xpbmUgPCAwKQpAQCAtMjIyLDcgKzIyMSw3IEBACiAJaWYgKCpzaXplICogKmNvdW50ID4gTUFYX1ZJREVPX01FTSAqIDEwMjQgKiAxMDI0KQogCQkqY291bnQgPSAoTUFYX1ZJREVPX01FTSAqIDEwMjQgKiAxMDI0KSAvICpzaXplOwogCi0JZGV2X2RiZyhpY2QtPmRldi5wYXJlbnQsCisJZGV2X2RiZyhpY2QtPnBhcmVudCwKIAkJCSIlczogY291bnQ9JWQsIHNpemU9JWRcbiIsIF9fZnVuY19fLCAqY291bnQsICpzaXplKTsKIAogCXJldHVybiAwOwpAQCAtMjQxLDcgKzI0MCw3IEBACiAJCXZpZGVvYnVmX2RtYV9jb250aWdfZnJlZSh2cSwgdmIpOwogCX0gZWxzZSB7CiAJCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gdnEtPnByaXZfZGF0YTsKLQkJc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5kZXYucGFyZW50OworCQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpY2QtPnBhcmVudDsKIAkJc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZiAqZG1hID0gdmlkZW9idWZfdG9fZG1hKHZiKTsKIAogCQl2aWRlb2J1Zl9kbWFfdW5tYXAoZGV2LCBkbWEpOwpAQCAtMjU4LDcgKzI1Nyw3IEBACiAJc3RydWN0IG9tYXAxX2NhbV9idWYgKmJ1ZiA9IGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IG9tYXAxX2NhbV9idWYsIHZiKTsKIAlpbnQgYnl0ZXNfcGVyX2xpbmUgPSBzb2NfbWJ1c19ieXRlc19wZXJfbGluZShpY2QtPnVzZXJfd2lkdGgsCiAJCQlpY2QtPmN1cnJlbnRfZm10LT5ob3N0X2ZtdCk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3Qgb21hcDFfY2FtX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAJaW50IHJldDsKIApAQCAtNDkwLDcgKzQ4OSw3IEBACiAJCQkJCQlzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YikKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHZxLT5wcml2X2RhdGE7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3Qgb21hcDFfY2FtX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAJc3RydWN0IG9tYXAxX2NhbV9idWYgKmJ1ZjsKIAl1MzIgbW9kZTsKQEAgLTUxOSw3ICs1MTgsNyBAQAogCXBjZGV2LT5hY3RpdmUgPSBidWY7CiAJcGNkZXYtPnJlYWR5ID0gTlVMTDsKIAotCWRldl9kYmcoaWNkLT5kZXYucGFyZW50LAorCWRldl9kYmcoaWNkLT5wYXJlbnQsCiAJCSIlczogY2FwdHVyZSBub3QgYWN0aXZlLCBzZXR1cCBGSUZPLCBzdGFydCBETUFcbiIsIF9fZnVuY19fKTsKIAltb2RlID0gQ0FNX1JFQURfQ0FDSEUocGNkZXYsIE1PREUpICYgflRIUkVTSE9MRF9NQVNLOwogCW1vZGUgfD0gVEhSRVNIT0xEX0xFVkVMKHBjZGV2LT52Yl9tb2RlKSA8PCBUSFJFU0hPTERfU0hJRlQ7CkBAIC01NDMsOCArNTQyLDggQEAKIAlzdHJ1Y3Qgb21hcDFfY2FtX2J1ZiAqYnVmID0KIAkJCWNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IG9tYXAxX2NhbV9idWYsIHZiKTsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHZxLT5wcml2X2RhdGE7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5kZXYucGFyZW50OwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGljZC0+cGFyZW50OworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChkZXYpOwogCXN0cnVjdCBvbWFwMV9jYW1fZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAogCXN3aXRjaCAodmItPnN0YXRlKSB7CkBAIC01NzMsNyArNTcyLDcgQEAKIHsKIAlzdHJ1Y3Qgb21hcDFfY2FtX2J1ZiAqYnVmID0gcGNkZXYtPmFjdGl2ZTsKIAlzdHJ1Y3QgdmlkZW9idWZfYnVmZmVyICp2YjsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBwY2Rldi0+aWNkLT5kZXYucGFyZW50OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHBjZGV2LT5pY2QtPnBhcmVudDsKIAogCWlmIChXQVJOX09OKCFidWYpKSB7CiAJCXN1c3BlbmRfY2FwdHVyZShwY2Rldik7CkBAIC03OTksNyArNzk4LDcgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBjYW1faXNyKGludCBpcnEsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IG9tYXAxX2NhbV9kZXYgKnBjZGV2ID0gZGF0YTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBwY2Rldi0+aWNkLT5kZXYucGFyZW50OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHBjZGV2LT5pY2QtPnBhcmVudDsKIAlzdHJ1Y3Qgb21hcDFfY2FtX2J1ZiAqYnVmID0gcGNkZXYtPmFjdGl2ZTsKIAl1MzIgaXRfc3RhdHVzOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC05MDksNyArOTA4LDcgQEAKICAqLwogc3RhdGljIGludCBvbWFwMV9jYW1fYWRkX2RldmljZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKIHsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBvbWFwMV9jYW1fZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAl1MzIgY3RybGNsb2NrOwogCkBAIC05NTIsMTQgKzk1MSwxNCBAQAogCiAJcGNkZXYtPmljZCA9IGljZDsKIAotCWRldl9kYmcoaWNkLT5kZXYucGFyZW50LCAiT01BUDEgQ2FtZXJhIGRyaXZlciBhdHRhY2hlZCB0byBjYW1lcmEgJWRcbiIsCisJZGV2X2RiZyhpY2QtPnBhcmVudCwgIk9NQVAxIENhbWVyYSBkcml2ZXIgYXR0YWNoZWQgdG8gY2FtZXJhICVkXG4iLAogCQkJaWNkLT5kZXZudW0pOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBvbWFwMV9jYW1fcmVtb3ZlX2RldmljZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKIHsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBvbWFwMV9jYW1fZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAl1MzIgY3RybGNsb2NrOwogCkBAIC05ODUsNyArOTg0LDcgQEAKIAogCXBjZGV2LT5pY2QgPSBOVUxMOwogCi0JZGV2X2RiZyhpY2QtPmRldi5wYXJlbnQsCisJZGV2X2RiZyhpY2QtPnBhcmVudCwKIAkJIk9NQVAxIENhbWVyYSBkcml2ZXIgZGV0YWNoZWQgZnJvbSBjYW1lcmEgJWRcbiIsIGljZC0+ZGV2bnVtKTsKIH0KIApAQCAtMTA3MCw3ICsxMDY5LDcgQEAKIAkJdW5zaWduZWQgaW50IGlkeCwgc3RydWN0IHNvY19jYW1lcmFfZm9ybWF0X3hsYXRlICp4bGF0ZSkKIHsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpY2QtPmRldi5wYXJlbnQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5wYXJlbnQ7CiAJaW50IGZvcm1hdHMgPSAwLCByZXQ7CiAJZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlIGNvZGU7CiAJY29uc3Qgc3RydWN0IHNvY19tYnVzX3BpeGVsZm10ICpmbXQ7CkBAIC0xMjIyLDkgKzEyMjEsOSBAQAogCXN0cnVjdCB2NGwyX3JlY3QgKnJlY3QgPSAmY3JvcC0+YzsKIAljb25zdCBzdHJ1Y3Qgc29jX2NhbWVyYV9mb3JtYXRfeGxhdGUgKnhsYXRlID0gaWNkLT5jdXJyZW50X2ZtdDsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpY2QtPnBhcmVudDsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoZGV2KTsKIAlzdHJ1Y3Qgb21hcDFfY2FtX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5kZXYucGFyZW50OwogCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgbWY7CiAJaW50IHJldDsKIApAQCAtMTI3MCw4ICsxMjY5LDggQEAKIHsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKIAljb25zdCBzdHJ1Y3Qgc29jX2NhbWVyYV9mb3JtYXRfeGxhdGUgKnhsYXRlOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGljZC0+ZGV2LnBhcmVudDsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpY2QtPnBhcmVudDsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoZGV2KTsKIAlzdHJ1Y3Qgb21hcDFfY2FtX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4ID0gJmYtPmZtdC5waXg7CiAJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCBtZjsKQEAgLTEzMjYsNyArMTMyNSw3IEBACiAKIAl4bGF0ZSA9IHNvY19jYW1lcmFfeGxhdGVfYnlfZm91cmNjKGljZCwgcGl4LT5waXhlbGZvcm1hdCk7CiAJaWYgKCF4bGF0ZSkgewotCQlkZXZfd2FybihpY2QtPmRldi5wYXJlbnQsICJGb3JtYXQgJSN4IG5vdCBmb3VuZFxuIiwKKwkJZGV2X3dhcm4oaWNkLT5wYXJlbnQsICJGb3JtYXQgJSN4IG5vdCBmb3VuZFxuIiwKIAkJCSBwaXgtPnBpeGVsZm9ybWF0KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTM2Miw3ICsxMzYxLDcgQEAKIAkJCQkgIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gcS0+cHJpdl9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IG9tYXAxX2NhbV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCWludCByZXQ7CiAKQEAgLTEzNzcsMTcgKzEzNzYsMTcgQEAKIHN0YXRpYyB2b2lkIG9tYXAxX2NhbV9pbml0X3ZpZGVvYnVmKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwKIAkJCQkgICAgIHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IG9tYXAxX2NhbV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCiAJaWYgKCFzZ19tb2RlKQogCQl2aWRlb2J1Zl9xdWV1ZV9kbWFfY29udGlnX2luaXQocSwgJm9tYXAxX3ZpZGVvYnVmX29wcywKLQkJCQlpY2QtPmRldi5wYXJlbnQsICZwY2Rldi0+bG9jaywKKwkJCQlpY2QtPnBhcmVudCwgJnBjZGV2LT5sb2NrLAogCQkJCVY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwgVjRMMl9GSUVMRF9OT05FLAogCQkJCXNpemVvZihzdHJ1Y3Qgb21hcDFfY2FtX2J1ZiksIGljZCwgJmljZC0+dmlkZW9fbG9jayk7CiAJZWxzZQogCQl2aWRlb2J1Zl9xdWV1ZV9zZ19pbml0KHEsICZvbWFwMV92aWRlb2J1Zl9vcHMsCi0JCQkJaWNkLT5kZXYucGFyZW50LCAmcGNkZXYtPmxvY2ssCisJCQkJaWNkLT5wYXJlbnQsICZwY2Rldi0+bG9jaywKIAkJCQlWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsIFY0TDJfRklFTERfTk9ORSwKIAkJCQlzaXplb2Yoc3RydWN0IG9tYXAxX2NhbV9idWYpLCBpY2QsICZpY2QtPnZpZGVvX2xvY2spOwogCkBAIC0xNDMxLDcgKzE0MzAsNiBAQAogewogCS8qIGNhcC0+bmFtZSBpcyBzZXQgYnkgdGhlIGZyaWVuZGx5IGNhbGxlcjotPiAqLwogCXN0cmxjcHkoY2FwLT5jYXJkLCAiT01BUDEgQ2FtZXJhIiwgc2l6ZW9mKGNhcC0+Y2FyZCkpOwotCWNhcC0+dmVyc2lvbiA9IFZFUlNJT05fQ09ERTsKIAljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfCBWNEwyX0NBUF9TVFJFQU1JTkc7CiAKIAlyZXR1cm4gMDsKQEAgLTE0NDAsOSArMTQzOCw5IEBACiBzdGF0aWMgaW50IG9tYXAxX2NhbV9zZXRfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAogCQlfX3UzMiBwaXhmbXQpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5wYXJlbnQ7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGRldik7CiAJc3RydWN0IG9tYXAxX2NhbV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGljZC0+ZGV2LnBhcmVudDsKIAljb25zdCBzdHJ1Y3Qgc29jX2NhbWVyYV9mb3JtYXRfeGxhdGUgKnhsYXRlOwogCWNvbnN0IHN0cnVjdCBzb2NfbWJ1c19waXhlbGZtdCAqZm10OwogCXVuc2lnbmVkIGxvbmcgY2FtZXJhX2ZsYWdzLCBjb21tb25fZmxhZ3M7CkBAIC0xNzE4LDQgKzE3MTYsNSBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJPTUFQMSBDYW1lcmEgSW50ZXJmYWNlIGRyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiSmFudXN6IEtyenlzenRvZmlrIDxqa3J6eXN6dEB0aXMuaWNuZXQucGw+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CitNT0RVTEVfTElDRU5TRShEUklWRVJfVkVSU0lPTik7CiBNT0RVTEVfQUxJQVMoInBsYXRmb3JtOiIgRFJJVkVSX05BTUUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwMjR4eGNhbS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwMjR4eGNhbS5jCmluZGV4IDY5YjYwYmE1Li5lYjk3YmZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAyNHh4Y2FtLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwMjR4eGNhbS5jCkBAIC0zMSw3ICszMSw2IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CQkvKiBuZWVkZWQgZm9yIHZpZGVvYnVmcyAqLwotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgpAQCAtNDMsNyArNDIsNyBAQAogCiAjaW5jbHVkZSAib21hcDI0eHhjYW0uaCIKIAotI2RlZmluZSBPTUFQMjRYWENBTV9WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKDAsIDAsIDApCisjZGVmaW5lIE9NQVAyNFhYQ0FNX1ZFUlNJT04gIjAuMC4xIgogCiAjZGVmaW5lIFJFU0VUX1RJTUVPVVRfTlMgMTAwMDAKIApAQCAtMzA5LDExICszMDgsMTEgQEAKIAkJCW9yZGVyLS07CiAKIAkJLyogdHJ5IHRvIGFsbG9jYXRlIGFzIG1hbnkgY29udGlndW91cyBwYWdlcyBhcyBwb3NzaWJsZSAqLwotCQlwYWdlID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTCB8IEdGUF9ETUEsIG9yZGVyKTsKKwkJcGFnZSA9IGFsbG9jX3BhZ2VzKEdGUF9LRVJORUwsIG9yZGVyKTsKIAkJLyogaWYgYWxsb2NhdGlvbiBmYWlscywgdHJ5IHRvIGFsbG9jYXRlIHNtYWxsZXIgYW1vdW50ICovCiAJCXdoaWxlIChwYWdlID09IE5VTEwpIHsKIAkJCW9yZGVyLS07Ci0JCQlwYWdlID0gYWxsb2NfcGFnZXMoR0ZQX0tFUk5FTCB8IEdGUF9ETUEsIG9yZGVyKTsKKwkJCXBhZ2UgPSBhbGxvY19wYWdlcyhHRlBfS0VSTkVMLCBvcmRlcik7CiAJCQlpZiAocGFnZSA9PSBOVUxMICYmICFvcmRlcikgewogCQkJCWVyciA9IC1FTk9NRU07CiAJCQkJZ290byBvdXQ7CkBAIC05OTMsNyArOTkyLDYgQEAKIAogCXN0cmxjcHkoY2FwLT5kcml2ZXIsIENBTV9OQU1FLCBzaXplb2YoY2FwLT5kcml2ZXIpKTsKIAlzdHJsY3B5KGNhcC0+Y2FyZCwgY2FtLT52ZmQtPm5hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKLQljYXAtPnZlcnNpb24gPSBPTUFQMjRYWENBTV9WRVJTSU9OOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1NUUkVBTUlORzsKIAogCXJldHVybiAwOwpAQCAtMTg4OCw2ICsxODg2LDcgQEAKIE1PRFVMRV9BVVRIT1IoIlNha2FyaSBBaWx1cyA8c2FrYXJpLmFpbHVzQG5va2lhLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiT01BUDI0eHggVmlkZW8gZm9yIExpbnV4IGNhbWVyYSBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKE9NQVAyNFhYQ0FNX1ZFUlNJT04pOwogbW9kdWxlX3BhcmFtKHZpZGVvX25yLCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyh2aWRlb19uciwKIAkJICJNaW5vciBudW1iZXIgZm9yIHZpZGVvIGRldmljZSAoLTEgPT0+IGF1dG8gYXNzaWduKSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3AuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwLmMKaW5kZXggOTRiNmVkOC4uNWNlYTJiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3AuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcC5jCkBAIC0yMjM0LDMgKzIyMzQsNCBAQAogTU9EVUxFX0FVVEhPUigiTm9raWEgQ29ycG9yYXRpb24iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiVEkgT01BUDMgSVNQIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oSVNQX1ZJREVPX0RSSVZFUl9WRVJTSU9OKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcC5oCmluZGV4IDI2MjBjNDAuLjUyOWU1ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3AuaApAQCAtMTM5LDYgKzEzOSwxMCBAQAogICoJCTMgLSBDQU1FWFRbMTM6Nl0gLT4gQ0FNWzc6MF0KICAqIEBjbGtfcG9sOiBQaXhlbCBjbG9jayBwb2xhcml0eQogICoJCTAgLSBOb24gSW52ZXJ0ZWQsIDEgLSBJbnZlcnRlZAorICogQGhzX3BvbDogSG9yaXpvbnRhbCBzeW5jaHJvbml6YXRpb24gcG9sYXJpdHkKKyAqCQkwIC0gQWN0aXZlIGhpZ2gsIDEgLSBBY3RpdmUgbG93CisgKiBAdnNfcG9sOiBWZXJ0aWNhbCBzeW5jaHJvbml6YXRpb24gcG9sYXJpdHkKKyAqCQkwIC0gQWN0aXZlIGhpZ2gsIDEgLSBBY3RpdmUgbG93CiAgKiBAYnJpZGdlOiBDQ0RDIEJyaWRnZSBpbnB1dCBjb250cm9sCiAgKgkJSVNQQ1RSTF9QQVJfQlJJREdFX0RJU0FCTEUgLSBEaXNhYmxlCiAgKgkJSVNQQ1RSTF9QQVJfQlJJREdFX0xFTkRJQU4gLSBMaXR0bGUgZW5kaWFuCkBAIC0xNDcsNiArMTUxLDggQEAKIHN0cnVjdCBpc3BfcGFyYWxsZWxfcGxhdGZvcm1fZGF0YSB7CiAJdW5zaWduZWQgaW50IGRhdGFfbGFuZV9zaGlmdDoyOwogCXVuc2lnbmVkIGludCBjbGtfcG9sOjE7CisJdW5zaWduZWQgaW50IGhzX3BvbDoxOworCXVuc2lnbmVkIGludCB2c19wb2w6MTsKIAl1bnNpZ25lZCBpbnQgYnJpZGdlOjQ7CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGNjZGMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwY2NkYy5jCmluZGV4IDM5ZDUwMWIuLjlkMzQ1OWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwY2NkYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwY2NkYy5jCkBAIC0xMTQ4LDYgKzExNDgsOCBAQAogCW9tYXAzaXNwX2NvbmZpZ3VyZV9icmlkZ2UoaXNwLCBjY2RjLT5pbnB1dCwgcGRhdGEsIHNoaWZ0KTsKIAogCWNjZGMtPnN5bmNpZi5kYXRzeiA9IGRlcHRoX291dDsKKwljY2RjLT5zeW5jaWYuaGRwb2wgPSBwZGF0YSA/IHBkYXRhLT5oc19wb2wgOiAwOworCWNjZGMtPnN5bmNpZi52ZHBvbCA9IHBkYXRhID8gcGRhdGEtPnZzX3BvbCA6IDA7CiAJY2NkY19jb25maWdfc3luY19pZihjY2RjLCAmY2NkYy0+c3luY2lmKTsKIAogCS8qIENDRENfUEFEX1NJTksgKi8KQEAgLTE2OTEsNyArMTY5Myw3IEBACiAJaWYgKHN1Yi0+dHlwZSAhPSBWNEwyX0VWRU5UX09NQVAzSVNQX0hTX1ZTKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldHVybiB2NGwyX2V2ZW50X3N1YnNjcmliZShmaCwgc3ViKTsKKwlyZXR1cm4gdjRsMl9ldmVudF9zdWJzY3JpYmUoZmgsIHN1YiwgT01BUDNJU1BfQ0NEQ19ORVZFTlRTKTsKIH0KIAogc3RhdGljIGludCBjY2RjX3Vuc3Vic2NyaWJlX2V2ZW50KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2ZoICpmaCwKQEAgLTIxNjIsNyArMjE2NCw2IEBACiAJc2QtPmdycF9pZCA9IDEgPDwgMTY7CS8qIGdyb3VwIElEIGZvciBpc3Agc3ViZGV2cyAqLwogCXY0bDJfc2V0X3N1YmRldmRhdGEoc2QsIGNjZGMpOwogCXNkLT5mbGFncyB8PSBWNEwyX1NVQkRFVl9GTF9IQVNfRVZFTlRTIHwgVjRMMl9TVUJERVZfRkxfSEFTX0RFVk5PREU7Ci0Jc2QtPm5ldmVudHMgPSBPTUFQM0lTUF9DQ0RDX05FVkVOVFM7CiAKIAlwYWRzW0NDRENfUEFEX1NJTktdLmZsYWdzID0gTUVESUFfUEFEX0ZMX1NJTks7CiAJcGFkc1tDQ0RDX1BBRF9TT1VSQ0VfVlBdLmZsYWdzID0gTUVESUFfUEFEX0ZMX1NPVVJDRTsKQEAgLTIyNTcsOCArMjI1OCw2IEBACiAJY2NkYy0+c3luY2lmLmZsZG91dCA9IDA7CiAJY2NkYy0+c3luY2lmLmZsZHBvbCA9IDA7CiAJY2NkYy0+c3luY2lmLmZsZHN0YXQgPSAwOwotCWNjZGMtPnN5bmNpZi5oZHBvbCA9IDA7Ci0JY2NkYy0+c3luY2lmLnZkcG9sID0gMDsKIAogCWNjZGMtPmNsYW1wLm9ibGVuID0gMDsKIAljY2RjLT5jbGFtcC5kY3N1YnZhbCA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGNjcDIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwY2NwMi5jCmluZGV4IDBlMTZjYWIuLmVjOWUzOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwY2NwMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwY2NwMi5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CiAKICNpbmNsdWRlICJpc3AuaCIKICNpbmNsdWRlICJpc3ByZWcuaCIKQEAgLTE2Myw2ICsxNjQsOSBAQAogCXN0cnVjdCBpc3BfcGlwZWxpbmUgKnBpcGUgPSB0b19pc3BfcGlwZWxpbmUoJmNjcDItPnN1YmRldi5lbnRpdHkpOwogCWludCBpOwogCisJaWYgKGVuYWJsZSAmJiBjY3AyLT52ZGRzX2NzaWIpCisJCXJlZ3VsYXRvcl9lbmFibGUoY2NwMi0+dmRkc19jc2liKTsKKwogCS8qIEVuYWJsZS9EaXNhYmxlIGFsbCB0aGUgTEN4IGNoYW5uZWxzICovCiAJZm9yIChpID0gMDsgaSA8IENDUDJfTEN4X0NIQU5TX05VTTsgaSsrKQogCQlpc3BfcmVnX2Nscl9zZXQoaXNwLCBPTUFQM19JU1BfSU9NRU1fQ0NQMiwgSVNQQ0NQMl9MQ3hfQ1RSTChpKSwKQEAgLTE4Niw2ICsxOTAsOSBAQAogCQkJCSAgICBJU1BDQ1AyX0xDMDFfSVJRRU5BQkxFLAogCQkJCSAgICBJU1BDQ1AyX0xDMDFfSVJRU1RBVFVTX0xDMF9GU19JUlEpOwogCX0KKworCWlmICghZW5hYmxlICYmIGNjcDItPnZkZHNfY3NpYikKKwkJcmVndWxhdG9yX2Rpc2FibGUoY2NwMi0+dmRkc19jc2liKTsKIH0KIAogLyoKQEAgLTExMzcsNiArMTE0NCw5IEBACiAgKi8KIHZvaWQgb21hcDNpc3BfY2NwMl9jbGVhbnVwKHN0cnVjdCBpc3BfZGV2aWNlICppc3ApCiB7CisJc3RydWN0IGlzcF9jY3AyX2RldmljZSAqY2NwMiA9ICZpc3AtPmlzcF9jY3AyOworCisJcmVndWxhdG9yX3B1dChjY3AyLT52ZGRzX2NzaWIpOwogfQogCiAvKgpAQCAtMTE1MSwxNCArMTE2MSwyNyBAQAogCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmY2NwMi0+d2FpdCk7CiAKLQkvKiBPbiB0aGUgT01BUDM2eHgsIHRoZSBDQ1AyIHVzZXMgdGhlIENTSSBQSFkxIG9yIFBIWTIsIHNoYXJlZCB3aXRoCisJLyoKKwkgKiBPbiB0aGUgT01BUDM0eHggdGhlIENTSTEgcmVjZWl2ZXIgaXMgb3BlcmF0ZWQgaW4gdGhlIENTSWIgSU8KKwkgKiBjb21wbGV4LCB3aGljaCBpcyBwb3dlcmVkIGJ5IHZkZHNfY3NpYiBwb3dlciByYWlsLiBIZW5jZSB0aGUKKwkgKiByZXF1ZXN0IGZvciB0aGUgcmVndWxhdG9yLgorCSAqCisJICogT24gdGhlIE9NQVAzNnh4LCB0aGUgQ0NQMiB1c2VzIHRoZSBDU0kgUEhZMSBvciBQSFkyLCBzaGFyZWQgd2l0aAogCSAqIHRoZSBDU0kyYyBvciBDU0kyYSByZWNlaXZlcnMuIFRoZSBQSFkgdGhlbiBuZWVkcyB0byBiZSBleHBsaWNpdGx5CiAJICogY29uZmlndXJlZC4KIAkgKgogCSAqIFRPRE86IERvbid0IGhhcmRjb2RlIHRoZSB1c2FnZSBvZiBQSFkxIChzaGFyZWQgd2l0aCBDU0kyYykuCiAJICovCi0JaWYgKGlzcC0+cmV2aXNpb24gPT0gSVNQX1JFVklTSU9OXzE1XzApCisJaWYgKGlzcC0+cmV2aXNpb24gPT0gSVNQX1JFVklTSU9OXzJfMCkgeworCQljY3AyLT52ZGRzX2NzaWIgPSByZWd1bGF0b3JfZ2V0KGlzcC0+ZGV2LCAidmRkc19jc2liIik7CisJCWlmIChJU19FUlIoY2NwMi0+dmRkc19jc2liKSkgeworCQkJZGV2X2RiZyhpc3AtPmRldiwKKwkJCQkiQ291bGQgbm90IGdldCByZWd1bGF0b3IgdmRkc19jc2liXG4iKTsKKwkJCWNjcDItPnZkZHNfY3NpYiA9IE5VTEw7CisJCX0KKwl9IGVsc2UgaWYgKGlzcC0+cmV2aXNpb24gPT0gSVNQX1JFVklTSU9OXzE1XzApIHsKIAkJY2NwMi0+cGh5ID0gJmlzcC0+aXNwX2NzaXBoeTE7CisJfQogCiAJcmV0ID0gY2NwMl9pbml0X2VudGl0aWVzKGNjcDIpOwogCWlmIChyZXQgPCAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BjY3AyLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGNjcDIuaAppbmRleCA1NTA1YTg2Li42Njc0ZTlkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGNjcDIuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGNjcDIuaApAQCAtODEsNiArODEsNyBAQAogCXN0cnVjdCBpc3BfaW50ZXJmYWNlX21lbV9jb25maWcgbWVtX2NmZzsKIAlzdHJ1Y3QgaXNwX3ZpZGVvIHZpZGVvX2luOwogCXN0cnVjdCBpc3BfY3NpcGh5ICpwaHk7CisJc3RydWN0IHJlZ3VsYXRvciAqdmRkc19jc2liOwogCXVuc2lnbmVkIGludCBlcnJvcjsKIAllbnVtIGlzcF9waXBlbGluZV9zdHJlYW1fc3RhdGUgc3RhdGU7CiAJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwc3RhdC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BzdGF0LmMKaW5kZXggYjQ0Y2I2OC4uODA4MDY1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BzdGF0LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3BzdGF0LmMKQEAgLTEwMzIsNyArMTAzMiw2IEBACiAJc25wcmludGYoc3ViZGV2LT5uYW1lLCBWNEwyX1NVQkRFVl9OQU1FX1NJWkUsICJPTUFQMyBJU1AgJXMiLCBuYW1lKTsKIAlzdWJkZXYtPmdycF9pZCA9IDEgPDwgMTY7CS8qIGdyb3VwIElEIGZvciBpc3Agc3ViZGV2cyAqLwogCXN1YmRldi0+ZmxhZ3MgfD0gVjRMMl9TVUJERVZfRkxfSEFTX0VWRU5UUyB8IFY0TDJfU1VCREVWX0ZMX0hBU19ERVZOT0RFOwotCXN1YmRldi0+bmV2ZW50cyA9IFNUQVRfTkVWRU5UUzsKIAl2NGwyX3NldF9zdWJkZXZkYXRhKHN1YmRldiwgc3RhdCk7CiAKIAlzdGF0LT5wYWQuZmxhZ3MgPSBNRURJQV9QQURfRkxfU0lOSzsKQEAgLTEwNTAsNyArMTA0OSw3IEBACiAJaWYgKHN1Yi0+dHlwZSAhPSBzdGF0LT5ldmVudF90eXBlKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldHVybiB2NGwyX2V2ZW50X3N1YnNjcmliZShmaCwgc3ViKTsKKwlyZXR1cm4gdjRsMl9ldmVudF9zdWJzY3JpYmUoZmgsIHN1YiwgU1RBVF9ORVZFTlRTKTsKIH0KIAogaW50IG9tYXAzaXNwX3N0YXRfdW5zdWJzY3JpYmVfZXZlbnQoc3RydWN0IHY0bDJfc3ViZGV2ICpzdWJkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHZpZGVvLmMKaW5kZXggOWNkOGYxYS4uZmQ5NjVhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3B2aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwdmlkZW8uYwpAQCAtNjk1LDcgKzY5NSw2IEBACiAJc3RybGNweShjYXAtPmRyaXZlciwgSVNQX1ZJREVPX0RSSVZFUl9OQU1FLCBzaXplb2YoY2FwLT5kcml2ZXIpKTsKIAlzdHJsY3B5KGNhcC0+Y2FyZCwgdmlkZW8tPnZpZGVvLm5hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKIAlzdHJsY3B5KGNhcC0+YnVzX2luZm8sICJtZWRpYSIsIHNpemVvZihjYXAtPmJ1c19pbmZvKSk7Ci0JY2FwLT52ZXJzaW9uID0gSVNQX1ZJREVPX0RSSVZFUl9WRVJTSU9OOwogCiAJaWYgKHZpZGVvLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKIAkJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwgVjRMMl9DQVBfU1RSRUFNSU5HOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3B2aWRlby5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3B2aWRlby5oCmluZGV4IDkxMWJlYTYuLjUzMTYwYWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwdmlkZW8uaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHZpZGVvLmgKQEAgLTI3LDcgKzI3LDYgQEAKICNkZWZpbmUgT01BUDNfSVNQX1ZJREVPX0gKIAogI2luY2x1ZGUgPGxpbnV4L3Y0bDItbWVkaWFidXMuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWEtZW50aXR5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXYuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWZoLmg+CkBAIC0zNSw3ICszNCw3IEBACiAjaW5jbHVkZSAiaXNwcXVldWUuaCIKIAogI2RlZmluZSBJU1BfVklERU9fRFJJVkVSX05BTUUJCSJpc3B2aWRlbyIKLSNkZWZpbmUgSVNQX1ZJREVPX0RSSVZFUl9WRVJTSU9OCUtFUk5FTF9WRVJTSU9OKDAsIDAsIDEpCisjZGVmaW5lIElTUF9WSURFT19EUklWRVJfVkVSU0lPTgkiMC4wLjIiCiAKIHN0cnVjdCBpc3BfZGV2aWNlOwogc3RydWN0IGlzcF92aWRlbzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3YyNjQwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292MjY0MC5jCmluZGV4IDBjZWEwY2YuLjljZTJmYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3YyNjQwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjI2NDAuYwpAQCAtMTAzMSwxNiArMTAzMSw5IEBACiAJY29uc3QgY2hhciAqZGV2bmFtZTsKIAlpbnQgcmV0OwogCi0JLyoKLQkgKiB3ZSBtdXN0IGhhdmUgYSBwYXJlbnQgYnkgbm93LiBBbmQgaXQgY2Fubm90IGJlIGEgd3Jvbmcgb25lLgotCSAqIFNvIHRoaXMgZW50aXJlIHRlc3QgaXMgY29tcGxldGVseSByZWR1bmRhbnQuCi0JICovCi0JaWYgKCFpY2QtPmRldi5wYXJlbnQgfHwKLQkgICAgdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCktPm5yICE9IGljZC0+aWZhY2UpIHsKLQkJZGV2X2VycigmY2xpZW50LT5kZXYsICJQYXJlbnQgbWlzc2luZyBvciBpbnZhbGlkIVxuIik7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyOwotCX0KKwkvKiBXZSBtdXN0IGhhdmUgYSBwYXJlbnQgYnkgbm93LiBBbmQgaXQgY2Fubm90IGJlIGEgd3Jvbmcgb25lLiAqLworCUJVR19PTighaWNkLT5wYXJlbnQgfHwKKwkgICAgICAgdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KS0+bnIgIT0gaWNkLT5pZmFjZSk7CiAKIAkvKgogCSAqIGNoZWNrIGFuZCBzaG93IHByb2R1Y3QgSUQgYW5kIG1hbnVmYWN0dXJlciBJRApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjU2NDIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y1NjQyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ5YTRhZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y1NjQyLmMKQEAgLTAsMCArMSwxMDEyIEBACisvKgorICogRHJpdmVyIGZvciBPVjU2NDIgQ01PUyBJbWFnZSBTZW5zb3IgZnJvbSBPbW5pdmlzaW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExLCBCYXN0aWFuIEhlY2h0IDxoZWNodGJAZ21haWwuY29tPgorICoKKyAqIEJhc2VkIG9uIFNvbnkgSU1YMDc0IENhbWVyYSBEcml2ZXIKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgR3Vlbm5hZGkgTGlha2hvdmV0c2tpIDxnLmxpYWtob3ZldHNraUBnbXguZGU+CisgKgorICogQmFzZWQgb24gT21uaXZpc2lvbiBPVjc2NzAgQ2FtZXJhIERyaXZlcgorICogQ29weXJpZ2h0IChDKSAyMDA2LTcgSm9uYXRoYW4gQ29yYmV0IDxjb3JiZXRAbHduLm5ldD4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPG1lZGlhL3NvY19jYW1lcmEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zb2NfbWVkaWFidXMuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgorCisvKiBPVjU2NDIgcmVnaXN0ZXJzICovCisjZGVmaW5lIFJFR19DSElQX0lEX0hJR0gJCTB4MzAwYQorI2RlZmluZSBSRUdfQ0hJUF9JRF9MT1cJCQkweDMwMGIKKworI2RlZmluZSBSRUdfV0lORE9XX1NUQVJUX1hfSElHSAkJMHgzODAwCisjZGVmaW5lIFJFR19XSU5ET1dfU1RBUlRfWF9MT1cJCTB4MzgwMQorI2RlZmluZSBSRUdfV0lORE9XX1NUQVJUX1lfSElHSAkJMHgzODAyCisjZGVmaW5lIFJFR19XSU5ET1dfU1RBUlRfWV9MT1cJCTB4MzgwMworI2RlZmluZSBSRUdfV0lORE9XX1dJRFRIX0hJR0gJCTB4MzgwNAorI2RlZmluZSBSRUdfV0lORE9XX1dJRFRIX0xPVwkJMHgzODA1CisjZGVmaW5lIFJFR19XSU5ET1dfSEVJR0hUX0hJR0ggCQkweDM4MDYKKyNkZWZpbmUgUkVHX1dJTkRPV19IRUlHSFRfTE9XCQkweDM4MDcKKyNkZWZpbmUgUkVHX09VVF9XSURUSF9ISUdICQkweDM4MDgKKyNkZWZpbmUgUkVHX09VVF9XSURUSF9MT1cJCTB4MzgwOQorI2RlZmluZSBSRUdfT1VUX0hFSUdIVF9ISUdICQkweDM4MGEKKyNkZWZpbmUgUkVHX09VVF9IRUlHSFRfTE9XCQkweDM4MGIKKyNkZWZpbmUgUkVHX09VVF9UT1RBTF9XSURUSF9ISUdICTB4MzgwYworI2RlZmluZSBSRUdfT1VUX1RPVEFMX1dJRFRIX0xPVwkJMHgzODBkCisjZGVmaW5lIFJFR19PVVRfVE9UQUxfSEVJR0hUX0hJR0gJMHgzODBlCisjZGVmaW5lIFJFR19PVVRfVE9UQUxfSEVJR0hUX0xPVwkweDM4MGYKKworLyoKKyAqIGRlZmluZSBzdGFuZGFyZCByZXNvbHV0aW9uLgorICogV29ya3MgY3VycmVudGx5IG9ubHkgZm9yIHVwIHRvIDcyMCBsaW5lcworICogZWcuIDMyMHgyNDAsIDY0MHg0ODAsIDgwMHg2MDAsIDEyODB4NzIwLCAyMDQ4eDcyMAorICovCisKKyNkZWZpbmUgT1Y1NjQyX1dJRFRICQkxMjgwCisjZGVmaW5lIE9WNTY0Ml9IRUlHSFQJCTcyMAorI2RlZmluZSBPVjU2NDJfVE9UQUxfV0lEVEgJMzIwMAorI2RlZmluZSBPVjU2NDJfVE9UQUxfSEVJR0hUCTIwMDAKKyNkZWZpbmUgT1Y1NjQyX1NFTlNPUl9TSVpFX1gJMjU5MgorI2RlZmluZSBPVjU2NDJfU0VOU09SX1NJWkVfWQkxOTQ0CisKK3N0cnVjdCByZWd2YWxfbGlzdCB7CisJdTE2IHJlZ19udW07CisJdTggdmFsdWU7Cit9OworCitzdGF0aWMgc3RydWN0IHJlZ3ZhbF9saXN0IG92NTY0Ml9kZWZhdWx0X3JlZ3NfaW5pdFtdID0geworCXsgMHgzMTAzLCAweDkzIH0sCisJeyAweDMwMDgsIDB4ODIgfSwKKwl7IDB4MzAxNywgMHg3ZiB9LAorCXsgMHgzMDE4LCAweGZjIH0sCisJeyAweDM4MTAsIDB4YzIgfSwKKwl7IDB4MzYxNSwgMHhmMCB9LAorCXsgMHgzMDAwLCAweDAgIH0sCisJeyAweDMwMDEsIDB4MCAgfSwKKwl7IDB4MzAwMiwgMHgwICB9LAorCXsgMHgzMDAzLCAweDAgIH0sCisJeyAweDMwMDQsIDB4ZmYgfSwKKwl7IDB4MzAzMCwgMHgyYiB9LAorCXsgMHgzMDExLCAweDggIH0sCisJeyAweDMwMTAsIDB4MTAgfSwKKwl7IDB4MzYwNCwgMHg2MCB9LAorCXsgMHgzNjIyLCAweDYwIH0sCisJeyAweDM2MjEsIDB4OSAgfSwKKwl7IDB4MzcwOSwgMHgwICB9LAorCXsgMHg0MDAwLCAweDIxIH0sCisJeyAweDQwMWQsIDB4MjIgfSwKKwl7IDB4MzYwMCwgMHg1NCB9LAorCXsgMHgzNjA1LCAweDQgIH0sCisJeyAweDM2MDYsIDB4M2YgfSwKKwl7IDB4M2MwMSwgMHg4MCB9LAorCXsgMHgzMDBkLCAweDIyIH0sCisJeyAweDM2MjMsIDB4MjIgfSwKKwl7IDB4NTAwMCwgMHg0ZiB9LAorCXsgMHg1MDIwLCAweDQgIH0sCisJeyAweDUxODEsIDB4NzkgfSwKKwl7IDB4NTE4MiwgMHgwICB9LAorCXsgMHg1MTg1LCAweDIyIH0sCisJeyAweDUxOTcsIDB4MSAgfSwKKwl7IDB4NTUwMCwgMHhhICB9LAorCXsgMHg1NTA0LCAweDAgIH0sCisJeyAweDU1MDUsIDB4N2YgfSwKKwl7IDB4NTA4MCwgMHg4ICB9LAorCXsgMHgzMDBlLCAweDE4IH0sCisJeyAweDQ2MTAsIDB4MCAgfSwKKwl7IDB4NDcxZCwgMHg1ICB9LAorCXsgMHg0NzA4LCAweDYgIH0sCisJeyAweDM3MGMsIDB4YTAgfSwKKwl7IDB4NTY4NywgMHg5NCB9LAorCXsgMHg1MDFmLCAweDAgIH0sCisJeyAweDUwMDAsIDB4NGYgfSwKKwl7IDB4NTAwMSwgMHhjZiB9LAorCXsgMHg0MzAwLCAweDMwIH0sCisJeyAweDQzMDAsIDB4MzAgfSwKKwl7IDB4NDYwYiwgMHgzNSB9LAorCXsgMHg0NzFkLCAweDAgIH0sCisJeyAweDMwMDIsIDB4YyAgfSwKKwl7IDB4MzAwMiwgMHgwICB9LAorCXsgMHg0NzEzLCAweDMgIH0sCisJeyAweDQ3MWMsIDB4NTAgfSwKKwl7IDB4NDcyMSwgMHgyICB9LAorCXsgMHg0NDAyLCAweDkwIH0sCisJeyAweDQ2MGMsIDB4MjIgfSwKKwl7IDB4MzgxNSwgMHg0NCB9LAorCXsgMHgzNTAzLCAweDcgIH0sCisJeyAweDM1MDEsIDB4NzMgfSwKKwl7IDB4MzUwMiwgMHg4MCB9LAorCXsgMHgzNTBiLCAweDAgIH0sCisJeyAweDM4MTgsIDB4YzggfSwKKwl7IDB4MzgyNCwgMHgxMSB9LAorCXsgMHgzYTAwLCAweDc4IH0sCisJeyAweDNhMWEsIDB4NCAgfSwKKwl7IDB4M2ExMywgMHgzMCB9LAorCXsgMHgzYTE4LCAweDAgIH0sCisJeyAweDNhMTksIDB4N2MgfSwKKwl7IDB4M2EwOCwgMHgxMiB9LAorCXsgMHgzYTA5LCAweGMwIH0sCisJeyAweDNhMGEsIDB4ZiAgfSwKKwl7IDB4M2EwYiwgMHhhMCB9LAorCXsgMHgzNTBjLCAweDcgIH0sCisJeyAweDM1MGQsIDB4ZDAgfSwKKwl7IDB4M2EwZCwgMHg4ICB9LAorCXsgMHgzYTBlLCAweDYgIH0sCisJeyAweDM1MDAsIDB4MCAgfSwKKwl7IDB4MzUwMSwgMHgwICB9LAorCXsgMHgzNTAyLCAweDAgIH0sCisJeyAweDM1MGEsIDB4MCAgfSwKKwl7IDB4MzUwYiwgMHgwICB9LAorCXsgMHgzNTAzLCAweDAgIH0sCisJeyAweDNhMGYsIDB4M2MgfSwKKwl7IDB4M2ExMCwgMHgzMiB9LAorCXsgMHgzYTFiLCAweDNjIH0sCisJeyAweDNhMWUsIDB4MzIgfSwKKwl7IDB4M2ExMSwgMHg4MCB9LAorCXsgMHgzYTFmLCAweDIwIH0sCisJeyAweDMwMzAsIDB4MmIgfSwKKwl7IDB4M2EwMiwgMHgwICB9LAorCXsgMHgzYTAzLCAweDdkIH0sCisJeyAweDNhMDQsIDB4MCAgfSwKKwl7IDB4M2ExNCwgMHgwICB9LAorCXsgMHgzYTE1LCAweDdkIH0sCisJeyAweDNhMTYsIDB4MCAgfSwKKwl7IDB4M2EwMCwgMHg3OCB9LAorCXsgMHgzYTA4LCAweDkgIH0sCisJeyAweDNhMDksIDB4NjAgfSwKKwl7IDB4M2EwYSwgMHg3ICB9LAorCXsgMHgzYTBiLCAweGQwIH0sCisJeyAweDNhMGQsIDB4MTAgfSwKKwl7IDB4M2EwZSwgMHhkICB9LAorCXsgMHg0NDA3LCAweDQgIH0sCisJeyAweDUxOTMsIDB4NzAgfSwKKwl7IDB4NTg5YiwgMHgwICB9LAorCXsgMHg1ODlhLCAweGMwIH0sCisJeyAweDQwMWUsIDB4MjAgfSwKKwl7IDB4NDAwMSwgMHg0MiB9LAorCXsgMHg0MDFjLCAweDYgIH0sCisJeyAweDM4MjUsIDB4YWMgfSwKKwl7IDB4MzgyNywgMHhjICB9LAorCXsgMHg1MjhhLCAweDEgIH0sCisJeyAweDUyOGIsIDB4NCAgfSwKKwl7IDB4NTI4YywgMHg4ICB9LAorCXsgMHg1MjhkLCAweDEwIH0sCisJeyAweDUyOGUsIDB4MjAgfSwKKwl7IDB4NTI4ZiwgMHgyOCB9LAorCXsgMHg1MjkwLCAweDMwIH0sCisJeyAweDUyOTIsIDB4MCAgfSwKKwl7IDB4NTI5MywgMHgxICB9LAorCXsgMHg1Mjk0LCAweDAgIH0sCisJeyAweDUyOTUsIDB4NCAgfSwKKwl7IDB4NTI5NiwgMHgwICB9LAorCXsgMHg1Mjk3LCAweDggIH0sCisJeyAweDUyOTgsIDB4MCAgfSwKKwl7IDB4NTI5OSwgMHgxMCB9LAorCXsgMHg1MjlhLCAweDAgIH0sCisJeyAweDUyOWIsIDB4MjAgfSwKKwl7IDB4NTI5YywgMHgwICB9LAorCXsgMHg1MjlkLCAweDI4IH0sCisJeyAweDUyOWUsIDB4MCAgfSwKKwl7IDB4NTI5ZiwgMHgzMCB9LAorCXsgMHg1MjgyLCAweDAgIH0sCisJeyAweDUzMDAsIDB4MCAgfSwKKwl7IDB4NTMwMSwgMHgyMCB9LAorCXsgMHg1MzAyLCAweDAgIH0sCisJeyAweDUzMDMsIDB4N2MgfSwKKwl7IDB4NTMwYywgMHgwICB9LAorCXsgMHg1MzBkLCAweGMgIH0sCisJeyAweDUzMGUsIDB4MjAgfSwKKwl7IDB4NTMwZiwgMHg4MCB9LAorCXsgMHg1MzEwLCAweDIwIH0sCisJeyAweDUzMTEsIDB4ODAgfSwKKwl7IDB4NTMwOCwgMHgyMCB9LAorCXsgMHg1MzA5LCAweDQwIH0sCisJeyAweDUzMDQsIDB4MCAgfSwKKwl7IDB4NTMwNSwgMHgzMCB9LAorCXsgMHg1MzA2LCAweDAgIH0sCisJeyAweDUzMDcsIDB4ODAgfSwKKwl7IDB4NTMxNCwgMHg4ICB9LAorCXsgMHg1MzE1LCAweDIwIH0sCisJeyAweDUzMTksIDB4MzAgfSwKKwl7IDB4NTMxNiwgMHgxMCB9LAorCXsgMHg1MzE3LCAweDAgIH0sCisJeyAweDUzMTgsIDB4MiAgfSwKKwl7IDB4NTM4MCwgMHgxICB9LAorCXsgMHg1MzgxLCAweDAgIH0sCisJeyAweDUzODIsIDB4MCAgfSwKKwl7IDB4NTM4MywgMHg0ZSB9LAorCXsgMHg1Mzg0LCAweDAgIH0sCisJeyAweDUzODUsIDB4ZiAgfSwKKwl7IDB4NTM4NiwgMHgwICB9LAorCXsgMHg1Mzg3LCAweDAgIH0sCisJeyAweDUzODgsIDB4MSAgfSwKKwl7IDB4NTM4OSwgMHgxNSB9LAorCXsgMHg1MzhhLCAweDAgIH0sCisJeyAweDUzOGIsIDB4MzEgfSwKKwl7IDB4NTM4YywgMHgwICB9LAorCXsgMHg1MzhkLCAweDAgIH0sCisJeyAweDUzOGUsIDB4MCAgfSwKKwl7IDB4NTM4ZiwgMHhmICB9LAorCXsgMHg1MzkwLCAweDAgIH0sCisJeyAweDUzOTEsIDB4YWIgfSwKKwl7IDB4NTM5MiwgMHgwICB9LAorCXsgMHg1MzkzLCAweGEyIH0sCisJeyAweDUzOTQsIDB4OCAgfSwKKwl7IDB4NTQ4MCwgMHgxNCB9LAorCXsgMHg1NDgxLCAweDIxIH0sCisJeyAweDU0ODIsIDB4MzYgfSwKKwl7IDB4NTQ4MywgMHg1NyB9LAorCXsgMHg1NDg0LCAweDY1IH0sCisJeyAweDU0ODUsIDB4NzEgfSwKKwl7IDB4NTQ4NiwgMHg3ZCB9LAorCXsgMHg1NDg3LCAweDg3IH0sCisJeyAweDU0ODgsIDB4OTEgfSwKKwl7IDB4NTQ4OSwgMHg5YSB9LAorCXsgMHg1NDhhLCAweGFhIH0sCisJeyAweDU0OGIsIDB4YjggfSwKKwl7IDB4NTQ4YywgMHhjZCB9LAorCXsgMHg1NDhkLCAweGRkIH0sCisJeyAweDU0OGUsIDB4ZWEgfSwKKwl7IDB4NTQ4ZiwgMHgxZCB9LAorCXsgMHg1NDkwLCAweDUgIH0sCisJeyAweDU0OTEsIDB4MCAgfSwKKwl7IDB4NTQ5MiwgMHg0ICB9LAorCXsgMHg1NDkzLCAweDIwIH0sCisJeyAweDU0OTQsIDB4MyAgfSwKKwl7IDB4NTQ5NSwgMHg2MCB9LAorCXsgMHg1NDk2LCAweDIgIH0sCisJeyAweDU0OTcsIDB4YjggfSwKKwl7IDB4NTQ5OCwgMHgyICB9LAorCXsgMHg1NDk5LCAweDg2IH0sCisJeyAweDU0OWEsIDB4MiAgfSwKKwl7IDB4NTQ5YiwgMHg1YiB9LAorCXsgMHg1NDljLCAweDIgIH0sCisJeyAweDU0OWQsIDB4M2IgfSwKKwl7IDB4NTQ5ZSwgMHgyICB9LAorCXsgMHg1NDlmLCAweDFjIH0sCisJeyAweDU0YTAsIDB4MiAgfSwKKwl7IDB4NTRhMSwgMHg0ICB9LAorCXsgMHg1NGEyLCAweDEgIH0sCisJeyAweDU0YTMsIDB4ZWQgfSwKKwl7IDB4NTRhNCwgMHgxICB9LAorCXsgMHg1NGE1LCAweGM1IH0sCisJeyAweDU0YTYsIDB4MSAgfSwKKwl7IDB4NTRhNywgMHhhNSB9LAorCXsgMHg1NGE4LCAweDEgIH0sCisJeyAweDU0YTksIDB4NmMgfSwKKwl7IDB4NTRhYSwgMHgxICB9LAorCXsgMHg1NGFiLCAweDQxIH0sCisJeyAweDU0YWMsIDB4MSAgfSwKKwl7IDB4NTRhZCwgMHgyMCB9LAorCXsgMHg1NGFlLCAweDAgIH0sCisJeyAweDU0YWYsIDB4MTYgfSwKKwl7IDB4NTRiMCwgMHgxICB9LAorCXsgMHg1NGIxLCAweDIwIH0sCisJeyAweDU0YjIsIDB4MCAgfSwKKwl7IDB4NTRiMywgMHgxMCB9LAorCXsgMHg1NGI0LCAweDAgIH0sCisJeyAweDU0YjUsIDB4ZjAgfSwKKwl7IDB4NTRiNiwgMHgwICB9LAorCXsgMHg1NGI3LCAweGRmIH0sCisJeyAweDU0MDIsIDB4M2YgfSwKKwl7IDB4NTQwMywgMHgwICB9LAorCXsgMHgzNDA2LCAweDAgIH0sCisJeyAweDUxODAsIDB4ZmYgfSwKKwl7IDB4NTE4MSwgMHg1MiB9LAorCXsgMHg1MTgyLCAweDExIH0sCisJeyAweDUxODMsIDB4MTQgfSwKKwl7IDB4NTE4NCwgMHgyNSB9LAorCXsgMHg1MTg1LCAweDI0IH0sCisJeyAweDUxODYsIDB4NiAgfSwKKwl7IDB4NTE4NywgMHg4ICB9LAorCXsgMHg1MTg4LCAweDggIH0sCisJeyAweDUxODksIDB4N2MgfSwKKwl7IDB4NTE4YSwgMHg2MCB9LAorCXsgMHg1MThiLCAweGIyIH0sCisJeyAweDUxOGMsIDB4YjIgfSwKKwl7IDB4NTE4ZCwgMHg0NCB9LAorCXsgMHg1MThlLCAweDNkIH0sCisJeyAweDUxOGYsIDB4NTggfSwKKwl7IDB4NTE5MCwgMHg0NiB9LAorCXsgMHg1MTkxLCAweGY4IH0sCisJeyAweDUxOTIsIDB4NCAgfSwKKwl7IDB4NTE5MywgMHg3MCB9LAorCXsgMHg1MTk0LCAweGYwIH0sCisJeyAweDUxOTUsIDB4ZjAgfSwKKwl7IDB4NTE5NiwgMHgzICB9LAorCXsgMHg1MTk3LCAweDEgIH0sCisJeyAweDUxOTgsIDB4NCAgfSwKKwl7IDB4NTE5OSwgMHgxMiB9LAorCXsgMHg1MTlhLCAweDQgIH0sCisJeyAweDUxOWIsIDB4MCAgfSwKKwl7IDB4NTE5YywgMHg2ICB9LAorCXsgMHg1MTlkLCAweDgyIH0sCisJeyAweDUxOWUsIDB4MCAgfSwKKwl7IDB4NTAyNSwgMHg4MCB9LAorCXsgMHgzYTBmLCAweDM4IH0sCisJeyAweDNhMTAsIDB4MzAgfSwKKwl7IDB4M2ExYiwgMHgzYSB9LAorCXsgMHgzYTFlLCAweDJlIH0sCisJeyAweDNhMTEsIDB4NjAgfSwKKwl7IDB4M2ExZiwgMHgxMCB9LAorCXsgMHg1Njg4LCAweGE2IH0sCisJeyAweDU2ODksIDB4NmEgfSwKKwl7IDB4NTY4YSwgMHhlYSB9LAorCXsgMHg1NjhiLCAweGFlIH0sCisJeyAweDU2OGMsIDB4YTYgfSwKKwl7IDB4NTY4ZCwgMHg2YSB9LAorCXsgMHg1NjhlLCAweDYyIH0sCisJeyAweDU2OGYsIDB4MjYgfSwKKwl7IDB4NTU4MywgMHg0MCB9LAorCXsgMHg1NTg0LCAweDQwIH0sCisJeyAweDU1ODAsIDB4MiAgfSwKKwl7IDB4NTAwMCwgMHhjZiB9LAorCXsgMHg1ODAwLCAweDI3IH0sCisJeyAweDU4MDEsIDB4MTkgfSwKKwl7IDB4NTgwMiwgMHgxMiB9LAorCXsgMHg1ODAzLCAweGYgIH0sCisJeyAweDU4MDQsIDB4MTAgfSwKKwl7IDB4NTgwNSwgMHgxNSB9LAorCXsgMHg1ODA2LCAweDFlIH0sCisJeyAweDU4MDcsIDB4MmYgfSwKKwl7IDB4NTgwOCwgMHgxNSB9LAorCXsgMHg1ODA5LCAweGQgIH0sCisJeyAweDU4MGEsIDB4YSAgfSwKKwl7IDB4NTgwYiwgMHg5ICB9LAorCXsgMHg1ODBjLCAweGEgIH0sCisJeyAweDU4MGQsIDB4YyAgfSwKKwl7IDB4NTgwZSwgMHgxMiB9LAorCXsgMHg1ODBmLCAweDE5IH0sCisJeyAweDU4MTAsIDB4YiAgfSwKKwl7IDB4NTgxMSwgMHg3ICB9LAorCXsgMHg1ODEyLCAweDQgIH0sCisJeyAweDU4MTMsIDB4MyAgfSwKKwl7IDB4NTgxNCwgMHgzICB9LAorCXsgMHg1ODE1LCAweDYgIH0sCisJeyAweDU4MTYsIDB4YSAgfSwKKwl7IDB4NTgxNywgMHhmICB9LAorCXsgMHg1ODE4LCAweGEgIH0sCisJeyAweDU4MTksIDB4NSAgfSwKKwl7IDB4NTgxYSwgMHgxICB9LAorCXsgMHg1ODFiLCAweDAgIH0sCisJeyAweDU4MWMsIDB4MCAgfSwKKwl7IDB4NTgxZCwgMHgzICB9LAorCXsgMHg1ODFlLCAweDggIH0sCisJeyAweDU4MWYsIDB4YyAgfSwKKwl7IDB4NTgyMCwgMHhhICB9LAorCXsgMHg1ODIxLCAweDUgIH0sCisJeyAweDU4MjIsIDB4MSAgfSwKKwl7IDB4NTgyMywgMHgwICB9LAorCXsgMHg1ODI0LCAweDAgIH0sCisJeyAweDU4MjUsIDB4MyAgfSwKKwl7IDB4NTgyNiwgMHg4ICB9LAorCXsgMHg1ODI3LCAweGMgIH0sCisJeyAweDU4MjgsIDB4ZSAgfSwKKwl7IDB4NTgyOSwgMHg4ICB9LAorCXsgMHg1ODJhLCAweDYgIH0sCisJeyAweDU4MmIsIDB4NCAgfSwKKwl7IDB4NTgyYywgMHg1ICB9LAorCXsgMHg1ODJkLCAweDcgIH0sCisJeyAweDU4MmUsIDB4YiAgfSwKKwl7IDB4NTgyZiwgMHgxMiB9LAorCXsgMHg1ODMwLCAweDE4IH0sCisJeyAweDU4MzEsIDB4MTAgfSwKKwl7IDB4NTgzMiwgMHhjICB9LAorCXsgMHg1ODMzLCAweGEgIH0sCisJeyAweDU4MzQsIDB4YiAgfSwKKwl7IDB4NTgzNSwgMHhlICB9LAorCXsgMHg1ODM2LCAweDE1IH0sCisJeyAweDU4MzcsIDB4MTkgfSwKKwl7IDB4NTgzOCwgMHgzMiB9LAorCXsgMHg1ODM5LCAweDFmIH0sCisJeyAweDU4M2EsIDB4MTggfSwKKwl7IDB4NTgzYiwgMHgxNiB9LAorCXsgMHg1ODNjLCAweDE3IH0sCisJeyAweDU4M2QsIDB4MWUgfSwKKwl7IDB4NTgzZSwgMHgyNiB9LAorCXsgMHg1ODNmLCAweDUzIH0sCisJeyAweDU4NDAsIDB4MTAgfSwKKwl7IDB4NTg0MSwgMHhmICB9LAorCXsgMHg1ODQyLCAweGQgIH0sCisJeyAweDU4NDMsIDB4YyAgfSwKKwl7IDB4NTg0NCwgMHhlICB9LAorCXsgMHg1ODQ1LCAweDkgIH0sCisJeyAweDU4NDYsIDB4MTEgfSwKKwl7IDB4NTg0NywgMHgxMCB9LAorCXsgMHg1ODQ4LCAweDEwIH0sCisJeyAweDU4NDksIDB4MTAgfSwKKwl7IDB4NTg0YSwgMHgxMCB9LAorCXsgMHg1ODRiLCAweGUgIH0sCisJeyAweDU4NGMsIDB4MTAgfSwKKwl7IDB4NTg0ZCwgMHgxMCB9LAorCXsgMHg1ODRlLCAweDExIH0sCisJeyAweDU4NGYsIDB4MTAgfSwKKwl7IDB4NTg1MCwgMHhmICB9LAorCXsgMHg1ODUxLCAweGMgIH0sCisJeyAweDU4NTIsIDB4ZiAgfSwKKwl7IDB4NTg1MywgMHgxMCB9LAorCXsgMHg1ODU0LCAweDEwIH0sCisJeyAweDU4NTUsIDB4ZiAgfSwKKwl7IDB4NTg1NiwgMHhlICB9LAorCXsgMHg1ODU3LCAweGIgIH0sCisJeyAweDU4NTgsIDB4MTAgfSwKKwl7IDB4NTg1OSwgMHhkICB9LAorCXsgMHg1ODVhLCAweGQgIH0sCisJeyAweDU4NWIsIDB4YyAgfSwKKwl7IDB4NTg1YywgMHhjICB9LAorCXsgMHg1ODVkLCAweGMgIH0sCisJeyAweDU4NWUsIDB4YiAgfSwKKwl7IDB4NTg1ZiwgMHhjICB9LAorCXsgMHg1ODYwLCAweGMgIH0sCisJeyAweDU4NjEsIDB4YyAgfSwKKwl7IDB4NTg2MiwgMHhkICB9LAorCXsgMHg1ODYzLCAweDggIH0sCisJeyAweDU4NjQsIDB4MTEgfSwKKwl7IDB4NTg2NSwgMHgxOCB9LAorCXsgMHg1ODY2LCAweDE4IH0sCisJeyAweDU4NjcsIDB4MTkgfSwKKwl7IDB4NTg2OCwgMHgxNyB9LAorCXsgMHg1ODY5LCAweDE5IH0sCisJeyAweDU4NmEsIDB4MTYgfSwKKwl7IDB4NTg2YiwgMHgxMyB9LAorCXsgMHg1ODZjLCAweDEzIH0sCisJeyAweDU4NmQsIDB4MTIgfSwKKwl7IDB4NTg2ZSwgMHgxMyB9LAorCXsgMHg1ODZmLCAweDE2IH0sCisJeyAweDU4NzAsIDB4MTQgfSwKKwl7IDB4NTg3MSwgMHgxMiB9LAorCXsgMHg1ODcyLCAweDEwIH0sCisJeyAweDU4NzMsIDB4MTEgfSwKKwl7IDB4NTg3NCwgMHgxMSB9LAorCXsgMHg1ODc1LCAweDE2IH0sCisJeyAweDU4NzYsIDB4MTQgfSwKKwl7IDB4NTg3NywgMHgxMSB9LAorCXsgMHg1ODc4LCAweDEwIH0sCisJeyAweDU4NzksIDB4ZiAgfSwKKwl7IDB4NTg3YSwgMHgxMCB9LAorCXsgMHg1ODdiLCAweDE0IH0sCisJeyAweDU4N2MsIDB4MTMgfSwKKwl7IDB4NTg3ZCwgMHgxMiB9LAorCXsgMHg1ODdlLCAweDExIH0sCisJeyAweDU4N2YsIDB4MTEgfSwKKwl7IDB4NTg4MCwgMHgxMiB9LAorCXsgMHg1ODgxLCAweDE1IH0sCisJeyAweDU4ODIsIDB4MTQgfSwKKwl7IDB4NTg4MywgMHgxNSB9LAorCXsgMHg1ODg0LCAweDE1IH0sCisJeyAweDU4ODUsIDB4MTUgfSwKKwl7IDB4NTg4NiwgMHgxMyB9LAorCXsgMHg1ODg3LCAweDE3IH0sCisJeyAweDM3MTAsIDB4MTAgfSwKKwl7IDB4MzYzMiwgMHg1MSB9LAorCXsgMHgzNzAyLCAweDEwIH0sCisJeyAweDM3MDMsIDB4YjIgfSwKKwl7IDB4MzcwNCwgMHgxOCB9LAorCXsgMHgzNzBiLCAweDQwIH0sCisJeyAweDM3MGQsIDB4MyAgfSwKKwl7IDB4MzYzMSwgMHgxICB9LAorCXsgMHgzNjMyLCAweDUyIH0sCisJeyAweDM2MDYsIDB4MjQgfSwKKwl7IDB4MzYyMCwgMHg5NiB9LAorCXsgMHg1Nzg1LCAweDcgIH0sCisJeyAweDNhMTMsIDB4MzAgfSwKKwl7IDB4MzYwMCwgMHg1MiB9LAorCXsgMHgzNjA0LCAweDQ4IH0sCisJeyAweDM2MDYsIDB4MWIgfSwKKwl7IDB4MzcwZCwgMHhiICB9LAorCXsgMHgzNzBmLCAweGMwIH0sCisJeyAweDM3MDksIDB4MSAgfSwKKwl7IDB4MzgyMywgMHgwICB9LAorCXsgMHg1MDA3LCAweDAgIH0sCisJeyAweDUwMDksIDB4MCAgfSwKKwl7IDB4NTAxMSwgMHgwICB9LAorCXsgMHg1MDEzLCAweDAgIH0sCisJeyAweDUxOWUsIDB4MCAgfSwKKwl7IDB4NTA4NiwgMHgwICB9LAorCXsgMHg1MDg3LCAweDAgIH0sCisJeyAweDUwODgsIDB4MCAgfSwKKwl7IDB4NTA4OSwgMHgwICB9LAorCXsgMHgzMDJiLCAweDAgIH0sCisJeyAweDM1MDMsIDB4NyAgfSwKKwl7IDB4MzAxMSwgMHg4ICB9LAorCXsgMHgzNTBjLCAweDIgIH0sCisJeyAweDM1MGQsIDB4ZTQgfSwKKwl7IDB4MzYyMSwgMHhjOSB9LAorCXsgMHgzNzBhLCAweDgxIH0sCisJeyAweGZmZmYsIDB4ZmYgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVndmFsX2xpc3Qgb3Y1NjQyX2RlZmF1bHRfcmVnc19maW5hbGlzZVtdID0geworCXsgMHgzODEwLCAweGMyIH0sCisJeyAweDM4MTgsIDB4YzkgfSwKKwl7IDB4MzgxYywgMHgxMCB9LAorCXsgMHgzODFkLCAweGEwIH0sCisJeyAweDM4MWUsIDB4NSAgfSwKKwl7IDB4MzgxZiwgMHhiMCB9LAorCXsgMHgzODIwLCAweDAgIH0sCisJeyAweDM4MjEsIDB4MCAgfSwKKwl7IDB4MzgyNCwgMHgxMSB9LAorCXsgMHgzYTA4LCAweDFiIH0sCisJeyAweDNhMDksIDB4YzAgfSwKKwl7IDB4M2EwYSwgMHgxNyB9LAorCXsgMHgzYTBiLCAweDIwIH0sCisJeyAweDNhMGQsIDB4MiAgfSwKKwl7IDB4M2EwZSwgMHgxICB9LAorCXsgMHg0MDFjLCAweDQgIH0sCisJeyAweDU2ODIsIDB4NSAgfSwKKwl7IDB4NTY4MywgMHgwICB9LAorCXsgMHg1Njg2LCAweDIgIH0sCisJeyAweDU2ODcsIDB4Y2MgfSwKKwl7IDB4NTAwMSwgMHg0ZiB9LAorCXsgMHg1ODliLCAweDYgIH0sCisJeyAweDU4OWEsIDB4YzUgfSwKKwl7IDB4MzUwMywgMHgwICB9LAorCXsgMHg0NjBjLCAweDIwIH0sCisJeyAweDQ2MGIsIDB4MzcgfSwKKwl7IDB4NDcxYywgMHhkMCB9LAorCXsgMHg0NzFkLCAweDUgIH0sCisJeyAweDM4MTUsIDB4MSAgfSwKKwl7IDB4MzgxOCwgMHhjMSB9LAorCXsgMHg1MDFmLCAweDAgIH0sCisJeyAweDUwMDIsIDB4ZTAgfSwKKwl7IDB4NDMwMCwgMHgzMiB9LCAvKiBVWVZZICovCisJeyAweDMwMDIsIDB4MWMgfSwKKwl7IDB4NDgwMCwgMHgxNCB9LAorCXsgMHg0ODAxLCAweGYgIH0sCisJeyAweDMwMDcsIDB4M2IgfSwKKwl7IDB4MzAwZSwgMHg0ICB9LAorCXsgMHg0ODAzLCAweDUwIH0sCisJeyAweDM4MTUsIDB4MSAgfSwKKwl7IDB4NDcxMywgMHgyICB9LAorCXsgMHg0ODQyLCAweDEgIH0sCisJeyAweDMwMGYsIDB4ZSAgfSwKKwl7IDB4MzAwMywgMHgzICB9LAorCXsgMHgzMDAzLCAweDEgIH0sCisJeyAweGZmZmYsIDB4ZmYgfSwKK307CisKK3N0cnVjdCBvdjU2NDJfZGF0YWZtdCB7CisJZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlCWNvZGU7CisJZW51bSB2NGwyX2NvbG9yc3BhY2UJCWNvbG9yc3BhY2U7Cit9OworCitzdHJ1Y3Qgb3Y1NjQyIHsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYJCXN1YmRldjsKKwljb25zdCBzdHJ1Y3Qgb3Y1NjQyX2RhdGFmbXQJKmZtdDsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3Y1NjQyX2RhdGFmbXQgb3Y1NjQyX2NvbG91cl9mbXRzW10gPSB7CisJe1Y0TDJfTUJVU19GTVRfVVlWWThfMlg4LCBWNEwyX0NPTE9SU1BBQ0VfSlBFR30sCit9OworCitzdGF0aWMgc3RydWN0IG92NTY0MiAqdG9fb3Y1NjQyKGNvbnN0IHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSwgc3RydWN0IG92NTY0Miwgc3ViZGV2KTsKK30KKworLyogRmluZCBhIGRhdGEgZm9ybWF0IGJ5IGEgcGl4ZWwgY29kZSBpbiBhbiBhcnJheSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBvdjU2NDJfZGF0YWZtdAorCQkJKm92NTY0Ml9maW5kX2RhdGFmbXQoZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlIGNvZGUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShvdjU2NDJfY29sb3VyX2ZtdHMpOyBpKyspCisJCWlmIChvdjU2NDJfY29sb3VyX2ZtdHNbaV0uY29kZSA9PSBjb2RlKQorCQkJcmV0dXJuIG92NTY0Ml9jb2xvdXJfZm10cyArIGk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCByZWdfcmVhZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MTYgcmVnLCB1OCAqdmFsKQoreworCWludCByZXQ7CisJLyogV2UgaGF2ZSAxNi1iaXQgaTJjIGFkZHJlc3NlcyAtIGNhcmUgZm9yIGVuZGlhbmVzcyAqLworCXVuc2lnbmVkIGNoYXIgZGF0YVsyXSA9IHsgcmVnID4+IDgsIHJlZyAmIDB4ZmYgfTsKKworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGRhdGEsIDIpOworCWlmIChyZXQgPCAyKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6IGkyYyByZWFkIGVycm9yLCByZWc6ICV4XG4iLAorCQkJX19mdW5jX18sIHJlZyk7CisJCXJldHVybiByZXQgPCAwID8gcmV0IDogLUVJTzsKKwl9CisKKwlyZXQgPSBpMmNfbWFzdGVyX3JlY3YoY2xpZW50LCB2YWwsIDEpOworCWlmIChyZXQgPCAxKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6IGkyYyByZWFkIGVycm9yLCByZWc6ICV4XG4iLAorCQkJCV9fZnVuY19fLCByZWcpOworCQlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IC1FSU87CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJlZ193cml0ZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1MTYgcmVnLCB1OCB2YWwpCit7CisJaW50IHJldDsKKwl1bnNpZ25lZCBjaGFyIGRhdGFbM10gPSB7IHJlZyA+PiA4LCByZWcgJiAweGZmLCB2YWwgfTsKKworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGRhdGEsIDMpOworCWlmIChyZXQgPCAzKSB7CisJCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiJXM6IGkyYyB3cml0ZSBlcnJvciwgcmVnOiAleFxuIiwKKwkJCV9fZnVuY19fLCByZWcpOworCQlyZXR1cm4gcmV0IDwgMCA/IHJldCA6IC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworc3RhdGljIGludCBvdjU2NDJfZ2V0X3JlZ2lzdGVyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2RiZ19yZWdpc3RlciAqcmVnKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlpbnQgcmV0OworCXU4IHZhbDsKKworCWlmIChyZWctPnJlZyAmIH4weGZmZmYpCisJCXJldHVybiAtRUlOVkFMOworCisJcmVnLT5zaXplID0gMTsKKworCXJldCA9IHJlZ19yZWFkKGNsaWVudCwgcmVnLT5yZWcsICZ2YWwpOworCWlmICghcmV0KQorCQlyZWctPnZhbCA9IChfX3U2NCl2YWw7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG92NTY0Ml9zZXRfcmVnaXN0ZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfZGJnX3JlZ2lzdGVyICpyZWcpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCisJaWYgKHJlZy0+cmVnICYgfjB4ZmZmZiB8fCByZWctPnZhbCAmIH4weGZmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiByZWdfd3JpdGUoY2xpZW50LCByZWctPnJlZywgcmVnLT52YWwpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgb3Y1NjQyX3dyaXRlX2FycmF5KHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJCQkJc3RydWN0IHJlZ3ZhbF9saXN0ICp2YWxzKQoreworCXdoaWxlICh2YWxzLT5yZWdfbnVtICE9IDB4ZmZmZiB8fCB2YWxzLT52YWx1ZSAhPSAweGZmKSB7CisJCWludCByZXQgPSByZWdfd3JpdGUoY2xpZW50LCB2YWxzLT5yZWdfbnVtLCB2YWxzLT52YWx1ZSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJdmFscysrOworCX0KKwlkZXZfZGJnKCZjbGllbnQtPmRldiwgIlJlZ2lzdGVyIGxpc3QgbG9hZGVkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvdjU2NDJfc2V0X3Jlc29sdXRpb24oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgcmV0OworCXU4IHN0YXJ0X3hfaGlnaCA9ICgoT1Y1NjQyX1NFTlNPUl9TSVpFX1ggLSBPVjU2NDJfV0lEVEgpIC8gMikgPj4gODsKKwl1OCBzdGFydF94X2xvdyAgPSAoKE9WNTY0Ml9TRU5TT1JfU0laRV9YIC0gT1Y1NjQyX1dJRFRIKSAvIDIpICYgMHhmZjsKKwl1OCBzdGFydF95X2hpZ2ggPSAoKE9WNTY0Ml9TRU5TT1JfU0laRV9ZIC0gT1Y1NjQyX0hFSUdIVCkgLyAyKSA+PiA4OworCXU4IHN0YXJ0X3lfbG93ICA9ICgoT1Y1NjQyX1NFTlNPUl9TSVpFX1kgLSBPVjU2NDJfSEVJR0hUKSAvIDIpICYgMHhmZjsKKworCXU4IHdpZHRoX2hpZ2gJPSBPVjU2NDJfV0lEVEggID4+IDg7CisJdTggd2lkdGhfbG93CT0gT1Y1NjQyX1dJRFRIICAmIDB4ZmY7CisJdTggaGVpZ2h0X2hpZ2gJPSBPVjU2NDJfSEVJR0hUID4+IDg7CisJdTggaGVpZ2h0X2xvdwk9IE9WNTY0Ml9IRUlHSFQgJiAweGZmOworCisJdTggdG90YWxfd2lkdGhfaGlnaCAgPSBPVjU2NDJfVE9UQUxfV0lEVEggID4+IDg7CisJdTggdG90YWxfd2lkdGhfbG93ICAgPSBPVjU2NDJfVE9UQUxfV0lEVEggICYgMHhmZjsKKwl1OCB0b3RhbF9oZWlnaHRfaGlnaCA9IE9WNTY0Ml9UT1RBTF9IRUlHSFQgPj4gODsKKwl1OCB0b3RhbF9oZWlnaHRfbG93ICA9IE9WNTY0Ml9UT1RBTF9IRUlHSFQgJiAweGZmOworCisJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUkVHX1dJTkRPV19TVEFSVF9YX0hJR0gsIHN0YXJ0X3hfaGlnaCk7CisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJFR19XSU5ET1dfU1RBUlRfWF9MT1csIHN0YXJ0X3hfbG93KTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUkVHX1dJTkRPV19TVEFSVF9ZX0hJR0gsIHN0YXJ0X3lfaGlnaCk7CisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJFR19XSU5ET1dfU1RBUlRfWV9MT1csIHN0YXJ0X3lfbG93KTsKKworCWlmICghcmV0KQorCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSRUdfV0lORE9XX1dJRFRIX0hJR0gsIHdpZHRoX2hpZ2gpOworCWlmICghcmV0KQorCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSRUdfV0lORE9XX1dJRFRIX0xPVyAsIHdpZHRoX2xvdyk7CisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJFR19XSU5ET1dfSEVJR0hUX0hJR0gsIGhlaWdodF9oaWdoKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUkVHX1dJTkRPV19IRUlHSFRfTE9XLCAgaGVpZ2h0X2xvdyk7CisKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUkVHX09VVF9XSURUSF9ISUdILCB3aWR0aF9oaWdoKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmVnX3dyaXRlKGNsaWVudCwgUkVHX09VVF9XSURUSF9MT1cgLCB3aWR0aF9sb3cpOworCWlmICghcmV0KQorCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSRUdfT1VUX0hFSUdIVF9ISUdILCBoZWlnaHRfaGlnaCk7CisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJFR19PVVRfSEVJR0hUX0xPVywgIGhlaWdodF9sb3cpOworCisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJFR19PVVRfVE9UQUxfV0lEVEhfSElHSCwgdG90YWxfd2lkdGhfaGlnaCk7CisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJFR19PVVRfVE9UQUxfV0lEVEhfTE9XLCB0b3RhbF93aWR0aF9sb3cpOworCWlmICghcmV0KQorCQlyZXQgPSByZWdfd3JpdGUoY2xpZW50LCBSRUdfT1VUX1RPVEFMX0hFSUdIVF9ISUdILCB0b3RhbF9oZWlnaHRfaGlnaCk7CisJaWYgKCFyZXQpCisJCXJldCA9IHJlZ193cml0ZShjbGllbnQsIFJFR19PVVRfVE9UQUxfSEVJR0hUX0xPVywgIHRvdGFsX2hlaWdodF9sb3cpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvdjU2NDJfdHJ5X2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJICBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZikKK3sKKwljb25zdCBzdHJ1Y3Qgb3Y1NjQyX2RhdGFmbXQgKmZtdCA9IG92NTY0Ml9maW5kX2RhdGFmbXQobWYtPmNvZGUpOworCisJZGV2X2RiZyhzZC0+djRsMl9kZXYtPmRldiwgIiVzKCV1KSB3aWR0aDogJXUgaGVpZ3RoOiAldVxuIiwKKwkJCV9fZnVuY19fLCBtZi0+Y29kZSwgbWYtPndpZHRoLCBtZi0+aGVpZ2h0KTsKKworCWlmICghZm10KSB7CisJCW1mLT5jb2RlCT0gb3Y1NjQyX2NvbG91cl9mbXRzWzBdLmNvZGU7CisJCW1mLT5jb2xvcnNwYWNlCT0gb3Y1NjQyX2NvbG91cl9mbXRzWzBdLmNvbG9yc3BhY2U7CisJfQorCisJbWYtPndpZHRoCT0gT1Y1NjQyX1dJRFRIOworCW1mLT5oZWlnaHQJPSBPVjU2NDJfSEVJR0hUOworCW1mLT5maWVsZAk9IFY0TDJfRklFTERfTk9ORTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG92NTY0Ml9zX2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWYpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBvdjU2NDIgKnByaXYgPSB0b19vdjU2NDIoY2xpZW50KTsKKworCWRldl9kYmcoc2QtPnY0bDJfZGV2LT5kZXYsICIlcygldSlcbiIsIF9fZnVuY19fLCBtZi0+Y29kZSk7CisKKwkvKiBNSVBJIENTSSBjb3VsZCBoYXZlIGNoYW5nZWQgdGhlIGZvcm1hdCwgZG91YmxlLWNoZWNrICovCisJaWYgKCFvdjU2NDJfZmluZF9kYXRhZm10KG1mLT5jb2RlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlvdjU2NDJfdHJ5X2ZtdChzZCwgbWYpOworCisJcHJpdi0+Zm10ID0gb3Y1NjQyX2ZpbmRfZGF0YWZtdChtZi0+Y29kZSk7CisKKwlvdjU2NDJfd3JpdGVfYXJyYXkoY2xpZW50LCBvdjU2NDJfZGVmYXVsdF9yZWdzX2luaXQpOworCW92NTY0Ml9zZXRfcmVzb2x1dGlvbihjbGllbnQpOworCW92NTY0Ml93cml0ZV9hcnJheShjbGllbnQsIG92NTY0Ml9kZWZhdWx0X3JlZ3NfZmluYWxpc2UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Y1NjQyX2dfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZikKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IG92NTY0MiAqcHJpdiA9IHRvX292NTY0MihjbGllbnQpOworCisJY29uc3Qgc3RydWN0IG92NTY0Ml9kYXRhZm10ICpmbXQgPSBwcml2LT5mbXQ7CisKKwltZi0+Y29kZQk9IGZtdC0+Y29kZTsKKwltZi0+Y29sb3JzcGFjZQk9IGZtdC0+Y29sb3JzcGFjZTsKKwltZi0+d2lkdGgJPSBPVjU2NDJfV0lEVEg7CisJbWYtPmhlaWdodAk9IE9WNTY0Ml9IRUlHSFQ7CisJbWYtPmZpZWxkCT0gVjRMMl9GSUVMRF9OT05FOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Y1NjQyX2VudW1fZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHVuc2lnbmVkIGludCBpbmRleCwKKwkJCSAgIGVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSAqY29kZSkKK3sKKwlpZiAoaW5kZXggPj0gQVJSQVlfU0laRShvdjU2NDJfY29sb3VyX2ZtdHMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSpjb2RlID0gb3Y1NjQyX2NvbG91cl9mbXRzW2luZGV4XS5jb2RlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG92NTY0Ml9nX2NoaXBfaWRlbnQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCSAgICAgICBzdHJ1Y3QgdjRsMl9kYmdfY2hpcF9pZGVudCAqaWQpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCisJaWYgKGlkLT5tYXRjaC50eXBlICE9IFY0TDJfQ0hJUF9NQVRDSF9JMkNfQUREUikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoaWQtPm1hdGNoLmFkZHIgIT0gY2xpZW50LT5hZGRyKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlkLT5pZGVudAk9IFY0TDJfSURFTlRfT1Y1NjQyOworCWlkLT5yZXZpc2lvbgk9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvdjU2NDJfZ19jcm9wKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2Nyb3AgKmEpCit7CisJc3RydWN0IHY0bDJfcmVjdCAqcmVjdCA9ICZhLT5jOworCisJYS0+dHlwZQkJPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7CisJcmVjdC0+dG9wCT0gMDsKKwlyZWN0LT5sZWZ0CT0gMDsKKwlyZWN0LT53aWR0aAk9IE9WNTY0Ml9XSURUSDsKKwlyZWN0LT5oZWlnaHQJPSBPVjU2NDJfSEVJR0hUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Y1NjQyX2Nyb3BjYXAoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY3JvcGNhcCAqYSkKK3sKKwlhLT5ib3VuZHMubGVmdAkJCT0gMDsKKwlhLT5ib3VuZHMudG9wCQkJPSAwOworCWEtPmJvdW5kcy53aWR0aAkJCT0gT1Y1NjQyX1dJRFRIOworCWEtPmJvdW5kcy5oZWlnaHQJCT0gT1Y1NjQyX0hFSUdIVDsKKwlhLT5kZWZyZWN0CQkJPSBhLT5ib3VuZHM7CisJYS0+dHlwZQkJCQk9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwlhLT5waXhlbGFzcGVjdC5udW1lcmF0b3IJPSAxOworCWEtPnBpeGVsYXNwZWN0LmRlbm9taW5hdG9yCT0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyBvdjU2NDJfc3ViZGV2X3ZpZGVvX29wcyA9IHsKKwkuc19tYnVzX2ZtdAk9IG92NTY0Ml9zX2ZtdCwKKwkuZ19tYnVzX2ZtdAk9IG92NTY0Ml9nX2ZtdCwKKwkudHJ5X21idXNfZm10CT0gb3Y1NjQyX3RyeV9mbXQsCisJLmVudW1fbWJ1c19mbXQJPSBvdjU2NDJfZW51bV9mbXQsCisJLmdfY3JvcAkJPSBvdjU2NDJfZ19jcm9wLAorCS5jcm9wY2FwCT0gb3Y1NjQyX2Nyb3BjYXAsCit9OworCitzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIG92NTY0Ml9zdWJkZXZfY29yZV9vcHMgPSB7CisJLmdfY2hpcF9pZGVudAk9IG92NTY0Ml9nX2NoaXBfaWRlbnQsCisjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRworCS5nX3JlZ2lzdGVyCT0gb3Y1NjQyX2dldF9yZWdpc3RlciwKKwkuc19yZWdpc3Rlcgk9IG92NTY0Ml9zZXRfcmVnaXN0ZXIsCisjZW5kaWYKK307CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIG92NTY0Ml9zdWJkZXZfb3BzID0geworCS5jb3JlCT0gJm92NTY0Ml9zdWJkZXZfY29yZV9vcHMsCisJLnZpZGVvCT0gJm92NTY0Ml9zdWJkZXZfdmlkZW9fb3BzLAorfTsKKworLyoKKyAqIFdlIGhhdmUgdG8gcHJvdmlkZSBzb2MtY2FtZXJhIG9wZXJhdGlvbnMsIGJ1dCB3ZSBkb24ndCBoYXZlIGFueXRoaW5nIHRvIHNheQorICogdGhlcmUuIFRoZSBNSVBJIENTSTIgZHJpdmVyIHdpbGwgcHJvdmlkZSAucXVlcnlfYnVzX3BhcmFtIGFuZCAuc2V0X2J1c19wYXJhbQorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzb2Nfb3Y1NjQyX3F1ZXJ5X2J1c19wYXJhbShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb2Nfb3Y1NjQyX3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCisJCQkJIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9vcHMgc29jX292NTY0Ml9vcHMgPSB7CisJLnF1ZXJ5X2J1c19wYXJhbQk9IHNvY19vdjU2NDJfcXVlcnlfYnVzX3BhcmFtLAorCS5zZXRfYnVzX3BhcmFtCQk9IHNvY19vdjU2NDJfc2V0X2J1c19wYXJhbSwKK307CisKK3N0YXRpYyBpbnQgb3Y1NjQyX3ZpZGVvX3Byb2JlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAorCQkJICAgICAgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpbnQgcmV0OworCXU4IGlkX2hpZ2gsIGlkX2xvdzsKKwl1MTYgaWQ7CisKKwkvKiBSZWFkIHNlbnNvciBNb2RlbCBJRCAqLworCXJldCA9IHJlZ19yZWFkKGNsaWVudCwgUkVHX0NISVBfSURfSElHSCwgJmlkX2hpZ2gpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJaWQgPSBpZF9oaWdoIDw8IDg7CisKKwlyZXQgPSByZWdfcmVhZChjbGllbnQsIFJFR19DSElQX0lEX0xPVywgJmlkX2xvdyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZCB8PSBpZF9sb3c7CisKKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJDaGlwIElEIDB4JTA0eCBkZXRlY3RlZFxuIiwgaWQpOworCisJaWYgKGlkICE9IDB4NTY0MikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvdjU2NDJfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKKwkJCWNvbnN0IHN0cnVjdCBpMmNfZGV2aWNlX2lkICpkaWQpCit7CisJc3RydWN0IG92NTY0MiAqcHJpdjsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGNsaWVudC0+ZGV2LnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsOworCWludCByZXQ7CisKKwlpZiAoIWljZCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIk9WNTY0MjogbWlzc2luZyBzb2MtY2FtZXJhIGRhdGEhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7CisJaWYgKCFpY2wpIHsKKwkJZGV2X2VycigmY2xpZW50LT5kZXYsICJPVjU2NDI6IG1pc3NpbmcgcGxhdGZvcm0gZGF0YSFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlwcml2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG92NTY0MiksIEdGUF9LRVJORUwpOworCWlmICghcHJpdikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl2NGwyX2kyY19zdWJkZXZfaW5pdCgmcHJpdi0+c3ViZGV2LCBjbGllbnQsICZvdjU2NDJfc3ViZGV2X29wcyk7CisKKwlpY2QtPm9wcwk9ICZzb2Nfb3Y1NjQyX29wczsKKwlwcml2LT5mbXQJPSAmb3Y1NjQyX2NvbG91cl9mbXRzWzBdOworCisJcmV0ID0gb3Y1NjQyX3ZpZGVvX3Byb2JlKGljZCwgY2xpZW50KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJvcjsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlpY2QtPm9wcyA9IE5VTEw7CisJa2ZyZWUocHJpdik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvdjU2NDJfcmVtb3ZlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IG92NTY0MiAqcHJpdiA9IHRvX292NTY0MihjbGllbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gY2xpZW50LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKKworCWljZC0+b3BzID0gTlVMTDsKKwlpZiAoaWNsLT5mcmVlX2J1cykKKwkJaWNsLT5mcmVlX2J1cyhpY2wpOworCWtmcmVlKHByaXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBvdjU2NDJfaWRbXSA9IHsKKwl7ICJvdjU2NDIiLCAwIH0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIG92NTY0Ml9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBvdjU2NDJfaTJjX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJvdjU2NDIiLAorCX0sCisJLnByb2JlCQk9IG92NTY0Ml9wcm9iZSwKKwkucmVtb3ZlCQk9IG92NTY0Ml9yZW1vdmUsCisJLmlkX3RhYmxlCT0gb3Y1NjQyX2lkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgb3Y1NjQyX21vZF9pbml0KHZvaWQpCit7CisJcmV0dXJuIGkyY19hZGRfZHJpdmVyKCZvdjU2NDJfaTJjX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBvdjU2NDJfbW9kX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmb3Y1NjQyX2kyY19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChvdjU2NDJfbW9kX2luaXQpOworbW9kdWxlX2V4aXQob3Y1NjQyX21vZF9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJPbW5pdmlzaW9uIE9WNTY0MiBDYW1lcmEgZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJCYXN0aWFuIEhlY2h0IDxoZWNodGJAZ21haWwuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjc2NzAuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y3NjcwLmMKaW5kZXggZDRlN2MxMS4uOGFhMDU4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjc2NzAuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292NzY3MC5jCkBAIC0xOSw4ICsxOSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWNoaXAtaWRlbnQuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLW1lZGlhYnVzLmg+Ci0KLSNpbmNsdWRlICJvdjc2NzAuaCIKKyNpbmNsdWRlIDxtZWRpYS9vdjc2NzAuaD4KIAogTU9EVUxFX0FVVEhPUigiSm9uYXRoYW4gQ29yYmV0IDxjb3JiZXRAbHduLm5ldD4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQSBsb3ctbGV2ZWwgZHJpdmVyIGZvciBPbW5pVmlzaW9uIG92NzY3MCBzZW5zb3JzIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292NzcyeC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjc3MnguYwppbmRleCA0ODg5NWVmLi4zOTc4NzBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292NzcyeC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y3NzJ4LmMKQEAgLTEwMzIsMTMgKzEwMzIsOSBAQAogCXU4ICAgICAgICAgICAgICAgICAgcGlkLCB2ZXI7CiAJY29uc3QgY2hhciAgICAgICAgICpkZXZuYW1lOwogCi0JLyoKLQkgKiBXZSBtdXN0IGhhdmUgYSBwYXJlbnQgYnkgbm93LiBBbmQgaXQgY2Fubm90IGJlIGEgd3Jvbmcgb25lLgotCSAqIFNvIHRoaXMgZW50aXJlIHRlc3QgaXMgY29tcGxldGVseSByZWR1bmRhbnQuCi0JICovCi0JaWYgKCFpY2QtPmRldi5wYXJlbnQgfHwKLQkgICAgdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCktPm5yICE9IGljZC0+aWZhY2UpCi0JCXJldHVybiAtRU5PREVWOworCS8qIFdlIG11c3QgaGF2ZSBhIHBhcmVudCBieSBub3cuIEFuZCBpdCBjYW5ub3QgYmUgYSB3cm9uZyBvbmUuICovCisJQlVHX09OKCFpY2QtPnBhcmVudCB8fAorCSAgICAgICB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpLT5uciAhPSBpY2QtPmlmYWNlKTsKIAogCS8qCiAJICogY2hlY2sgYW5kIHNob3cgcHJvZHVjdCBJRCBhbmQgbWFudWZhY3R1cmVyIElECmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292OTY0MC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjk2NDAuYwppbmRleCA1MTczYWM0Li4zNjgxYTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL292OTY0MC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y5NjQwLmMKQEAgLTY1NywxNiArNjU3LDkgQEAKIAljb25zdCBjaGFyCSpkZXZuYW1lOwogCWludAkJcmV0ID0gMDsKIAotCS8qCi0JICogV2UgbXVzdCBoYXZlIGEgcGFyZW50IGJ5IG5vdy4gQW5kIGl0IGNhbm5vdCBiZSBhIHdyb25nIG9uZS4KLQkgKiBTbyB0aGlzIGVudGlyZSB0ZXN0IGlzIGNvbXBsZXRlbHkgcmVkdW5kYW50LgotCSAqLwotCWlmICghaWNkLT5kZXYucGFyZW50IHx8Ci0JICAgIHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpLT5uciAhPSBpY2QtPmlmYWNlKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiUGFyZW50IG1pc3Npbmcgb3IgaW52YWxpZCFcbiIpOwotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIGVycjsKLQl9CisJLyogV2UgbXVzdCBoYXZlIGEgcGFyZW50IGJ5IG5vdy4gQW5kIGl0IGNhbm5vdCBiZSBhIHdyb25nIG9uZS4gKi8KKwlCVUdfT04oIWljZC0+cGFyZW50IHx8CisJICAgICAgIHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCktPm5yICE9IGljZC0+aWZhY2UpOwogCiAJLyoKIAkgKiBjaGVjayBhbmQgc2hvdyBwcm9kdWN0IElEIGFuZCBtYW51ZmFjdHVyZXIgSUQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y5NzQwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292OTc0MC5jCmluZGV4IDRkNGVlNGYuLmVkZDFmZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y5NzQwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjk3NDAuYwpAQCAtNDQsMTIgKzQ0LDEyIEBACiAjZGVmaW5lIE9WOTc0MF9ZX0FERFJfU1RBUlRfTE8JCTB4MDM0NwogI2RlZmluZSBPVjk3NDBfWF9BRERSX0VORF9ISQkJMHgwMzQ4CiAjZGVmaW5lIE9WOTc0MF9YX0FERFJfRU5EX0xPCQkweDAzNDkKLSNkZWZpbmUgT1Y5NzQwX1lfQUREUl9FTkRfSEkJCTB4MDM0QQotI2RlZmluZSBPVjk3NDBfWV9BRERSX0VORF9MTwkJMHgwMzRCCi0jZGVmaW5lIE9WOTc0MF9YX09VVFBVVF9TSVpFX0hJCQkweDAzNEMKLSNkZWZpbmUgT1Y5NzQwX1hfT1VUUFVUX1NJWkVfTE8JCTB4MDM0RAotI2RlZmluZSBPVjk3NDBfWV9PVVRQVVRfU0laRV9ISQkJMHgwMzRFCi0jZGVmaW5lIE9WOTc0MF9ZX09VVFBVVF9TSVpFX0xPCQkweDAzNEYKKyNkZWZpbmUgT1Y5NzQwX1lfQUREUl9FTkRfSEkJCTB4MDM0YQorI2RlZmluZSBPVjk3NDBfWV9BRERSX0VORF9MTwkJMHgwMzRiCisjZGVmaW5lIE9WOTc0MF9YX09VVFBVVF9TSVpFX0hJCQkweDAzNGMKKyNkZWZpbmUgT1Y5NzQwX1hfT1VUUFVUX1NJWkVfTE8JCTB4MDM0ZAorI2RlZmluZSBPVjk3NDBfWV9PVVRQVVRfU0laRV9ISQkJMHgwMzRlCisjZGVmaW5lIE9WOTc0MF9ZX09VVFBVVF9TSVpFX0xPCQkweDAzNGYKIAogLyogSU8gQ29udHJvbCBSZWdpc3RlcnMgKi8KICNkZWZpbmUgT1Y5NzQwX0lPX0NSRUwwMAkJMHgzMDAyCkBAIC02OCw2ICs2OCw3IEBACiAjZGVmaW5lIE9WOTc0MF9BTkFMT0dfQ1RSTDA0CQkweDM2MDQKICNkZWZpbmUgT1Y5NzQwX0FOQUxPR19DVFJMMTAJCTB4MzYxMAogI2RlZmluZSBPVjk3NDBfQU5BTE9HX0NUUkwxMgkJMHgzNjEyCisjZGVmaW5lIE9WOTc0MF9BTkFMT0dfQ1RSTDE1CQkweDM2MTUKICNkZWZpbmUgT1Y5NzQwX0FOQUxPR19DVFJMMjAJCTB4MzYyMAogI2RlZmluZSBPVjk3NDBfQU5BTE9HX0NUUkwyMQkJMHgzNjIxCiAjZGVmaW5lIE9WOTc0MF9BTkFMT0dfQ1RSTDIyCQkweDM2MjIKQEAgLTg5LDI4ICs5MCwyOCBAQAogI2RlZmluZSBPVjk3NDBfVElNSU5HX0NUUkwzNQkJMHgzODM1CiAKIC8qIEJhbmRpbmcgRmlsdGVyICovCi0jZGVmaW5lIE9WOTc0MF9BRUNfTUFYRVhQT182MF9ICQkweDNBMDIKLSNkZWZpbmUgT1Y5NzQwX0FFQ19NQVhFWFBPXzYwX0wJCTB4M0EwMwotI2RlZmluZSBPVjk3NDBfQUVDX0I1MF9TVEVQX0hJCQkweDNBMDgKLSNkZWZpbmUgT1Y5NzQwX0FFQ19CNTBfU1RFUF9MTwkJMHgzQTA5Ci0jZGVmaW5lIE9WOTc0MF9BRUNfQjYwX1NURVBfSEkJCTB4M0EwQQotI2RlZmluZSBPVjk3NDBfQUVDX0I2MF9TVEVQX0xPCQkweDNBMEIKLSNkZWZpbmUgT1Y5NzQwX0FFQ19DVFJMMEQJCTB4M0EwRAotI2RlZmluZSBPVjk3NDBfQUVDX0NUUkwwRQkJMHgzQTBFCi0jZGVmaW5lIE9WOTc0MF9BRUNfTUFYRVhQT181MF9ICQkweDNBMTQKLSNkZWZpbmUgT1Y5NzQwX0FFQ19NQVhFWFBPXzUwX0wJCTB4M0ExNQorI2RlZmluZSBPVjk3NDBfQUVDX01BWEVYUE9fNjBfSAkJMHgzYTAyCisjZGVmaW5lIE9WOTc0MF9BRUNfTUFYRVhQT182MF9MCQkweDNhMDMKKyNkZWZpbmUgT1Y5NzQwX0FFQ19CNTBfU1RFUF9ISQkJMHgzYTA4CisjZGVmaW5lIE9WOTc0MF9BRUNfQjUwX1NURVBfTE8JCTB4M2EwOQorI2RlZmluZSBPVjk3NDBfQUVDX0I2MF9TVEVQX0hJCQkweDNhMGEKKyNkZWZpbmUgT1Y5NzQwX0FFQ19CNjBfU1RFUF9MTwkJMHgzYTBiCisjZGVmaW5lIE9WOTc0MF9BRUNfQ1RSTDBECQkweDNhMGQKKyNkZWZpbmUgT1Y5NzQwX0FFQ19DVFJMMEUJCTB4M2EwZQorI2RlZmluZSBPVjk3NDBfQUVDX01BWEVYUE9fNTBfSAkJMHgzYTE0CisjZGVmaW5lIE9WOTc0MF9BRUNfTUFYRVhQT181MF9MCQkweDNhMTUKIAogLyogQUVDL0FHQyBDb250cm9sICovCiAjZGVmaW5lIE9WOTc0MF9BRUNfRU5BQkxFCQkweDM1MDMKLSNkZWZpbmUgT1Y5NzQwX0dBSU5fQ0VJTElOR18wMQkJMHgzQTE4Ci0jZGVmaW5lIE9WOTc0MF9HQUlOX0NFSUxJTkdfMDIJCTB4M0ExOQotI2RlZmluZSBPVjk3NDBfQUVDX0hJX1RIUkVTSE9MRAkJMHgzQTExCi0jZGVmaW5lIE9WOTc0MF9BRUNfM0ExQQkJCTB4M0ExQQotI2RlZmluZSBPVjk3NDBfQUVDX0NUUkwxQl9XUFQyCQkweDNBMUIKLSNkZWZpbmUgT1Y5NzQwX0FFQ19DVFJMMEZfV1BUCQkweDNBMEYKLSNkZWZpbmUgT1Y5NzQwX0FFQ19DVFJMMTBfQlBUCQkweDNBMTAKLSNkZWZpbmUgT1Y5NzQwX0FFQ19DVFJMMUVfQlBUMgkJMHgzQTFFCi0jZGVmaW5lIE9WOTc0MF9BRUNfTE9fVEhSRVNIT0xECQkweDNBMUYKKyNkZWZpbmUgT1Y5NzQwX0dBSU5fQ0VJTElOR18wMQkJMHgzYTE4CisjZGVmaW5lIE9WOTc0MF9HQUlOX0NFSUxJTkdfMDIJCTB4M2ExOQorI2RlZmluZSBPVjk3NDBfQUVDX0hJX1RIUkVTSE9MRAkJMHgzYTExCisjZGVmaW5lIE9WOTc0MF9BRUNfM0ExQQkJCTB4M2ExYQorI2RlZmluZSBPVjk3NDBfQUVDX0NUUkwxQl9XUFQyCQkweDNhMWIKKyNkZWZpbmUgT1Y5NzQwX0FFQ19DVFJMMEZfV1BUCQkweDNhMGYKKyNkZWZpbmUgT1Y5NzQwX0FFQ19DVFJMMTBfQlBUCQkweDNhMTAKKyNkZWZpbmUgT1Y5NzQwX0FFQ19DVFJMMUVfQlBUMgkJMHgzYTFlCisjZGVmaW5lIE9WOTc0MF9BRUNfTE9fVEhSRVNIT0xECQkweDNhMWYKIAogLyogQkxDIENvbnRyb2wgKi8KICNkZWZpbmUgT1Y5NzQwX0JMQ19BVVRPX0VOQUJMRQkJMHg0MDAyCkBAIC0xMzIsNyArMTMzLDcgQEAKICNkZWZpbmUgT1Y5NzQwX1ZUX1NZU19DTEtfRElWCQkweDAzMDMKICNkZWZpbmUgT1Y5NzQwX1ZUX1BJWF9DTEtfRElWCQkweDAzMDEKICNkZWZpbmUgT1Y5NzQwX1BMTF9DVFJMMzAxMAkJMHgzMDEwCi0jZGVmaW5lIE9WOTc0MF9WRklGT19DVFJMMDAJCTB4NDYwRQorI2RlZmluZSBPVjk3NDBfVkZJRk9fQ1RSTDAwCQkweDQ2MGUKIAogLyogSVNQIENvbnRyb2wgKi8KICNkZWZpbmUgT1Y5NzQwX0lTUF9DVFJMMDAJCTB4NTAwMApAQCAtMTQxLDkgKzE0Miw5IEBACiAjZGVmaW5lIE9WOTc0MF9JU1BfQ1RSTDA1CQkweDUwMDUKICNkZWZpbmUgT1Y5NzQwX0lTUF9DVFJMMTIJCTB4NTAxMgogI2RlZmluZSBPVjk3NDBfSVNQX0NUUkwxOQkJMHg1MDE5Ci0jZGVmaW5lIE9WOTc0MF9JU1BfQ1RSTDFBCQkweDUwMUEKLSNkZWZpbmUgT1Y5NzQwX0lTUF9DVFJMMUUJCTB4NTAxRQotI2RlZmluZSBPVjk3NDBfSVNQX0NUUkwxRgkJMHg1MDFGCisjZGVmaW5lIE9WOTc0MF9JU1BfQ1RSTDFBCQkweDUwMWEKKyNkZWZpbmUgT1Y5NzQwX0lTUF9DVFJMMUUJCTB4NTAxZQorI2RlZmluZSBPVjk3NDBfSVNQX0NUUkwxRgkJMHg1MDFmCiAjZGVmaW5lIE9WOTc0MF9JU1BfQ1RSTDIwCQkweDUwMjAKICNkZWZpbmUgT1Y5NzQwX0lTUF9DVFJMMjEJCTB4NTAyMQogCkBAIC0xNTgsMTIgKzE1OSwxMiBAQAogI2RlZmluZSBPVjk3NDBfQVdCX0FEVl9DVFJMMDQJCTB4NTE4NwogI2RlZmluZSBPVjk3NDBfQVdCX0FEVl9DVFJMMDUJCTB4NTE4OAogI2RlZmluZSBPVjk3NDBfQVdCX0FEVl9DVFJMMDYJCTB4NTE4OQotI2RlZmluZSBPVjk3NDBfQVdCX0FEVl9DVFJMMDcJCTB4NTE4QQotI2RlZmluZSBPVjk3NDBfQVdCX0FEVl9DVFJMMDgJCTB4NTE4QgotI2RlZmluZSBPVjk3NDBfQVdCX0FEVl9DVFJMMDkJCTB4NTE4QwotI2RlZmluZSBPVjk3NDBfQVdCX0FEVl9DVFJMMTAJCTB4NTE4RAotI2RlZmluZSBPVjk3NDBfQVdCX0FEVl9DVFJMMTEJCTB4NTE4RQotI2RlZmluZSBPVjk3NDBfQVdCX0NUUkwwRgkJMHg1MThGCisjZGVmaW5lIE9WOTc0MF9BV0JfQURWX0NUUkwwNwkJMHg1MThhCisjZGVmaW5lIE9WOTc0MF9BV0JfQURWX0NUUkwwOAkJMHg1MThiCisjZGVmaW5lIE9WOTc0MF9BV0JfQURWX0NUUkwwOQkJMHg1MThjCisjZGVmaW5lIE9WOTc0MF9BV0JfQURWX0NUUkwxMAkJMHg1MThkCisjZGVmaW5lIE9WOTc0MF9BV0JfQURWX0NUUkwxMQkJMHg1MThlCisjZGVmaW5lIE9WOTc0MF9BV0JfQ1RSTDBGCQkweDUxOGYKICNkZWZpbmUgT1Y5NzQwX0FXQl9DVFJMMTAJCTB4NTE5MAogI2RlZmluZSBPVjk3NDBfQVdCX0NUUkwxMQkJMHg1MTkxCiAjZGVmaW5lIE9WOTc0MF9BV0JfQ1RSTDEyCQkweDUxOTIKQEAgLTE4MCwyNyArMTgxLDggQEAKICNkZWZpbmUgT1Y5NzQwX01JUElfQ1RSTF8zMDEyCQkweDMwMTIKICNkZWZpbmUgT1Y5NzQwX1NDX0NNTU1fTUlQSV9DVFIJCTB4MzAxNAogCi0vKiBzdXBwb3J0ZWQgcmVzb2x1dGlvbnMgKi8KLWVudW0gewotCU9WOTc0MF9WR0EsCi0JT1Y5NzQwXzcyMFAsCi19OwotCi1zdHJ1Y3Qgb3Y5NzQwX3Jlc29sdXRpb24gewotCXVuc2lnbmVkIGludCB3aWR0aDsKLQl1bnNpZ25lZCBpbnQgaGVpZ2h0OwotfTsKLQotc3RhdGljIHN0cnVjdCBvdjk3NDBfcmVzb2x1dGlvbiBvdjk3NDBfcmVzb2x1dGlvbnNbXSA9IHsKLQlbT1Y5NzQwX1ZHQV0gPSB7Ci0JCS53aWR0aAk9IDY0MCwKLQkJLmhlaWdodAk9IDQ4MCwKLQl9LAotCVtPVjk3NDBfNzIwUF0gPSB7Ci0JCS53aWR0aAk9IDEyODAsCi0JCS5oZWlnaHQJPSA3MjAsCi0JfSwKLX07CisjZGVmaW5lIE9WOTc0MF9NQVhfV0lEVEgJCTEyODAKKyNkZWZpbmUgT1Y5NzQwX01BWF9IRUlHSFQJCTcyMAogCiAvKiBNaXNjLiBzdHJ1Y3R1cmVzICovCiBzdHJ1Y3Qgb3Y5NzQwX3JlZyB7CkBAIC0yMTksOSArMjAxLDE2IEBACiAKIAlib29sCQkJCWZsYWdfdmZsaXA7CiAJYm9vbAkJCQlmbGFnX2hmbGlwOworCisJLyogRm9yIHN1c3BlbmQvcmVzdW1lLiAqLworCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQJY3VycmVudF9tZjsKKwlib29sCQkJCWN1cnJlbnRfZW5hYmxlOwogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBvdjk3NDBfcmVnIG92OTc0MF9kZWZhdWx0c1tdID0geworCS8qIFNvZnR3YXJlIFJlc2V0ICovCisJeyBPVjk3NDBfU09GVFdBUkVfUkVTRVQsCTB4MDEgfSwKKwogCS8qIEJhbmRpbmcgRmlsdGVyICovCiAJeyBPVjk3NDBfQUVDX0I1MF9TVEVQX0hJLAkweDAwIH0sCiAJeyBPVjk3NDBfQUVDX0I1MF9TVEVQX0xPLAkweGU4IH0sCkBAIC0yNDEsMzYgKzIzMCwzNiBAQAogCS8qIFVuLWRvY3VtZW50ZWQgT1Y5NzQwIHJlZ2lzdGVycyAqLwogCXsgMHg1ODAwLCAweDI5IH0sIHsgMHg1ODAxLCAweDI1IH0sIHsgMHg1ODAyLCAweDIwIH0sIHsgMHg1ODAzLCAweDIxIH0sCiAJeyAweDU4MDQsIDB4MjYgfSwgeyAweDU4MDUsIDB4MmUgfSwgeyAweDU4MDYsIDB4MTEgfSwgeyAweDU4MDcsIDB4MGMgfSwKLQl7IDB4NTgwOCwgMHgwOSB9LCB7IDB4NTgwOSwgMHgwYSB9LCB7IDB4NTgwQSwgMHgwZSB9LCB7IDB4NTgwQiwgMHgxNiB9LAotCXsgMHg1ODBDLCAweDA2IH0sIHsgMHg1ODBELCAweDAyIH0sIHsgMHg1ODBFLCAweDAwIH0sIHsgMHg1ODBGLCAweDAwIH0sCisJeyAweDU4MDgsIDB4MDkgfSwgeyAweDU4MDksIDB4MGEgfSwgeyAweDU4MGEsIDB4MGUgfSwgeyAweDU4MGIsIDB4MTYgfSwKKwl7IDB4NTgwYywgMHgwNiB9LCB7IDB4NTgwZCwgMHgwMiB9LCB7IDB4NTgwZSwgMHgwMCB9LCB7IDB4NTgwZiwgMHgwMCB9LAogCXsgMHg1ODEwLCAweDA0IH0sIHsgMHg1ODExLCAweDBhIH0sIHsgMHg1ODEyLCAweDA1IH0sIHsgMHg1ODEzLCAweDAyIH0sCiAJeyAweDU4MTQsIDB4MDAgfSwgeyAweDU4MTUsIDB4MDAgfSwgeyAweDU4MTYsIDB4MDMgfSwgeyAweDU4MTcsIDB4MDkgfSwKLQl7IDB4NTgxOCwgMHgwZiB9LCB7IDB4NTgxOSwgMHgwYSB9LCB7IDB4NTgxQSwgMHgwNyB9LCB7IDB4NTgxQiwgMHgwOCB9LAotCXsgMHg1ODFDLCAweDBiIH0sIHsgMHg1ODFELCAweDE0IH0sIHsgMHg1ODFFLCAweDI4IH0sIHsgMHg1ODFGLCAweDIzIH0sCisJeyAweDU4MTgsIDB4MGYgfSwgeyAweDU4MTksIDB4MGEgfSwgeyAweDU4MWEsIDB4MDcgfSwgeyAweDU4MWIsIDB4MDggfSwKKwl7IDB4NTgxYywgMHgwYiB9LCB7IDB4NTgxZCwgMHgxNCB9LCB7IDB4NTgxZSwgMHgyOCB9LCB7IDB4NTgxZiwgMHgyMyB9LAogCXsgMHg1ODIwLCAweDFkIH0sIHsgMHg1ODIxLCAweDFlIH0sIHsgMHg1ODIyLCAweDI0IH0sIHsgMHg1ODIzLCAweDJhIH0sCiAJeyAweDU4MjQsIDB4NGYgfSwgeyAweDU4MjUsIDB4NmYgfSwgeyAweDU4MjYsIDB4NWYgfSwgeyAweDU4MjcsIDB4N2YgfSwKLQl7IDB4NTgyOCwgMHg5ZiB9LCB7IDB4NTgyOSwgMHg1ZiB9LCB7IDB4NTgyQSwgMHg4ZiB9LCB7IDB4NTgyQiwgMHg5ZSB9LAotCXsgMHg1ODJDLCAweDhmIH0sIHsgMHg1ODJELCAweDlmIH0sIHsgMHg1ODJFLCAweDRmIH0sIHsgMHg1ODJGLCAweDg3IH0sCisJeyAweDU4MjgsIDB4OWYgfSwgeyAweDU4MjksIDB4NWYgfSwgeyAweDU4MmEsIDB4OGYgfSwgeyAweDU4MmIsIDB4OWUgfSwKKwl7IDB4NTgyYywgMHg4ZiB9LCB7IDB4NTgyZCwgMHg5ZiB9LCB7IDB4NTgyZSwgMHg0ZiB9LCB7IDB4NTgyZiwgMHg4NyB9LAogCXsgMHg1ODMwLCAweDg2IH0sIHsgMHg1ODMxLCAweDk3IH0sIHsgMHg1ODMyLCAweGFlIH0sIHsgMHg1ODMzLCAweDNmIH0sCiAJeyAweDU4MzQsIDB4OGUgfSwgeyAweDU4MzUsIDB4N2MgfSwgeyAweDU4MzYsIDB4N2UgfSwgeyAweDU4MzcsIDB4YWYgfSwKLQl7IDB4NTgzOCwgMHg4ZiB9LCB7IDB4NTgzOSwgMHg4ZiB9LCB7IDB4NTgzQSwgMHg5ZiB9LCB7IDB4NTgzQiwgMHg3ZiB9LAotCXsgMHg1ODNDLCAweDVmIH0sCisJeyAweDU4MzgsIDB4OGYgfSwgeyAweDU4MzksIDB4OGYgfSwgeyAweDU4M2EsIDB4OWYgfSwgeyAweDU4M2IsIDB4N2YgfSwKKwl7IDB4NTgzYywgMHg1ZiB9LAogCiAJLyogWSBHYW1tYSAqLwogCXsgMHg1NDgwLCAweDA3IH0sIHsgMHg1NDgxLCAweDE4IH0sIHsgMHg1NDgyLCAweDJjIH0sIHsgMHg1NDgzLCAweDRlIH0sCiAJeyAweDU0ODQsIDB4NWUgfSwgeyAweDU0ODUsIDB4NmIgfSwgeyAweDU0ODYsIDB4NzcgfSwgeyAweDU0ODcsIDB4ODIgfSwKLQl7IDB4NTQ4OCwgMHg4YyB9LCB7IDB4NTQ4OSwgMHg5NSB9LCB7IDB4NTQ4QSwgMHhhNCB9LCB7IDB4NTQ4QiwgMHhiMSB9LAotCXsgMHg1NDhDLCAweGM2IH0sIHsgMHg1NDhELCAweGQ4IH0sIHsgMHg1NDhFLCAweGU5IH0sCisJeyAweDU0ODgsIDB4OGMgfSwgeyAweDU0ODksIDB4OTUgfSwgeyAweDU0OGEsIDB4YTQgfSwgeyAweDU0OGIsIDB4YjEgfSwKKwl7IDB4NTQ4YywgMHhjNiB9LCB7IDB4NTQ4ZCwgMHhkOCB9LCB7IDB4NTQ4ZSwgMHhlOSB9LAogCiAJLyogVVYgR2FtbWEgKi8KIAl7IDB4NTQ5MCwgMHgwZiB9LCB7IDB4NTQ5MSwgMHhmZiB9LCB7IDB4NTQ5MiwgMHgwZCB9LCB7IDB4NTQ5MywgMHgwNSB9LAogCXsgMHg1NDk0LCAweDA3IH0sIHsgMHg1NDk1LCAweDFhIH0sIHsgMHg1NDk2LCAweDA0IH0sIHsgMHg1NDk3LCAweDAxIH0sCi0JeyAweDU0OTgsIDB4MDMgfSwgeyAweDU0OTksIDB4NTMgfSwgeyAweDU0OUEsIDB4MDIgfSwgeyAweDU0OUIsIDB4ZWIgfSwKLQl7IDB4NTQ5QywgMHgwMiB9LCB7IDB4NTQ5RCwgMHhhMCB9LCB7IDB4NTQ5RSwgMHgwMiB9LCB7IDB4NTQ5RiwgMHg2NyB9LAotCXsgMHg1NEEwLCAweDAyIH0sIHsgMHg1NEExLCAweDNiIH0sIHsgMHg1NEEyLCAweDAyIH0sIHsgMHg1NEEzLCAweDE4IH0sCi0JeyAweDU0QTQsIDB4MDEgfSwgeyAweDU0QTUsIDB4ZTcgfSwgeyAweDU0QTYsIDB4MDEgfSwgeyAweDU0QTcsIDB4YzMgfSwKLQl7IDB4NTRBOCwgMHgwMSB9LCB7IDB4NTRBOSwgMHg5NCB9LCB7IDB4NTRBQSwgMHgwMSB9LCB7IDB4NTRBQiwgMHg3MiB9LAotCXsgMHg1NEFDLCAweDAxIH0sIHsgMHg1NEFELCAweDU3IH0sCisJeyAweDU0OTgsIDB4MDMgfSwgeyAweDU0OTksIDB4NTMgfSwgeyAweDU0OWEsIDB4MDIgfSwgeyAweDU0OWIsIDB4ZWIgfSwKKwl7IDB4NTQ5YywgMHgwMiB9LCB7IDB4NTQ5ZCwgMHhhMCB9LCB7IDB4NTQ5ZSwgMHgwMiB9LCB7IDB4NTQ5ZiwgMHg2NyB9LAorCXsgMHg1NGEwLCAweDAyIH0sIHsgMHg1NGExLCAweDNiIH0sIHsgMHg1NGEyLCAweDAyIH0sIHsgMHg1NGEzLCAweDE4IH0sCisJeyAweDU0YTQsIDB4MDEgfSwgeyAweDU0YTUsIDB4ZTcgfSwgeyAweDU0YTYsIDB4MDEgfSwgeyAweDU0YTcsIDB4YzMgfSwKKwl7IDB4NTRhOCwgMHgwMSB9LCB7IDB4NTRhOSwgMHg5NCB9LCB7IDB4NTRhYSwgMHgwMSB9LCB7IDB4NTRhYiwgMHg3MiB9LAorCXsgMHg1NGFjLCAweDAxIH0sIHsgMHg1NGFkLCAweDU3IH0sCiAKIAkvKiBBV0IgKi8KIAl7IE9WOTc0MF9BV0JfQ1RSTDAwLAkJMHhmMCB9LApAQCAtMjk2LDE4ICsyODUsMTggQEAKIAl7IE9WOTc0MF9BV0JfQ1RSTDE0LAkJMHgwMCB9LAogCiAJLyogQ0lQICovCi0JeyAweDUzMEQsIDB4MTIgfSwKKwl7IDB4NTMwZCwgMHgxMiB9LAogCiAJLyogQ01YICovCiAJeyAweDUzODAsIDB4MDEgfSwgeyAweDUzODEsIDB4MDAgfSwgeyAweDUzODIsIDB4MDAgfSwgeyAweDUzODMsIDB4MTcgfSwKIAl7IDB4NTM4NCwgMHgwMCB9LCB7IDB4NTM4NSwgMHgwMSB9LCB7IDB4NTM4NiwgMHgwMCB9LCB7IDB4NTM4NywgMHgwMCB9LAotCXsgMHg1Mzg4LCAweDAwIH0sIHsgMHg1Mzg5LCAweGUwIH0sIHsgMHg1MzhBLCAweDAwIH0sIHsgMHg1MzhCLCAweDIwIH0sCi0JeyAweDUzOEMsIDB4MDAgfSwgeyAweDUzOEQsIDB4MDAgfSwgeyAweDUzOEUsIDB4MDAgfSwgeyAweDUzOEYsIDB4MTYgfSwKKwl7IDB4NTM4OCwgMHgwMCB9LCB7IDB4NTM4OSwgMHhlMCB9LCB7IDB4NTM4YSwgMHgwMCB9LCB7IDB4NTM4YiwgMHgyMCB9LAorCXsgMHg1MzhjLCAweDAwIH0sIHsgMHg1MzhkLCAweDAwIH0sIHsgMHg1MzhlLCAweDAwIH0sIHsgMHg1MzhmLCAweDE2IH0sCiAJeyAweDUzOTAsIDB4MDAgfSwgeyAweDUzOTEsIDB4OWMgfSwgeyAweDUzOTIsIDB4MDAgfSwgeyAweDUzOTMsIDB4YTAgfSwKIAl7IDB4NTM5NCwgMHgxOCB9LAogCiAJLyogNTAvNjAgRGV0ZWN0aW9uICovCi0JeyAweDNDMEEsIDB4OWMgfSwgeyAweDNDMEIsIDB4M2YgfSwKKwl7IDB4M2MwYSwgMHg5YyB9LCB7IDB4M2MwYiwgMHgzZiB9LAogCiAJLyogT3V0cHV0IFNlbGVjdCAqLwogCXsgT1Y5NzQwX0lPX09VVFBVVF9TRUwwMSwJMHgwMCB9LApAQCAtMzMzLDYgKzMyMiw3IEBACiAJeyBPVjk3NDBfQU5BTE9HX0NUUkwxMCwJCTB4YTEgfSwKIAl7IE9WOTc0MF9BTkFMT0dfQ1RSTDEyLAkJMHgyNCB9LAogCXsgT1Y5NzQwX0FOQUxPR19DVFJMMjIsCQkweDlmIH0sCisJeyBPVjk3NDBfQU5BTE9HX0NUUkwxNSwJCTB4ZjAgfSwKIAogCS8qIFNlbnNvciBDb250cm9sICovCiAJeyBPVjk3NDBfU0VOU09SX0NUUkwwMywJCTB4NDIgfSwKQEAgLTM4NSw3ICszNzUsNyBAQAogCXsgT1Y5NzQwX0xOX0xFTkdUSF9QQ0tfTE8sCTB4NjIgfSwKIAogCS8qIE1JUEkgQ29udHJvbCAqLwotCXsgT1Y5NzQwX01JUElfQ1RSTDAwLAkJMHg0NCB9LAorCXsgT1Y5NzQwX01JUElfQ1RSTDAwLAkJMHg0NCB9LCAvKiAweDY0IGZvciBkaXNjb250aW51b3VzIGNsayAqLwogCXsgT1Y5NzQwX01JUElfMzgzNywJCTB4MDEgfSwKIAl7IE9WOTc0MF9NSVBJX0NUUkwwMSwJCTB4MGYgfSwKIAl7IE9WOTc0MF9NSVBJX0NUUkwwMywJCTB4MDUgfSwKQEAgLTM5Myw1NCArMzgzLDkgQEAKIAl7IE9WOTc0MF9WRklGT19SRF9DVFJMLAkJMHgxNiB9LAogCXsgT1Y5NzQwX01JUElfQ1RSTF8zMDEyLAkweDcwIH0sCiAJeyBPVjk3NDBfU0NfQ01NTV9NSVBJX0NUUiwJMHgwMSB9LAotfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBvdjk3NDBfcmVnIG92OTc0MF9yZWdzX3ZnYVtdID0gewotCXsgT1Y5NzQwX1hfQUREUl9TVEFSVF9ISSwJMHgwMCB9LAotCXsgT1Y5NzQwX1hfQUREUl9TVEFSVF9MTywJMHhhMCB9LAotCXsgT1Y5NzQwX1lfQUREUl9TVEFSVF9ISSwJMHgwMCB9LAotCXsgT1Y5NzQwX1lfQUREUl9TVEFSVF9MTywJMHgwMCB9LAotCXsgT1Y5NzQwX1hfQUREUl9FTkRfSEksCQkweDA0IH0sCi0JeyBPVjk3NDBfWF9BRERSX0VORF9MTywJCTB4NjMgfSwKLQl7IE9WOTc0MF9ZX0FERFJfRU5EX0hJLAkJMHgwMiB9LAotCXsgT1Y5NzQwX1lfQUREUl9FTkRfTE8sCQkweGQzIH0sCi0JeyBPVjk3NDBfWF9PVVRQVVRfU0laRV9ISSwJMHgwMiB9LAotCXsgT1Y5NzQwX1hfT1VUUFVUX1NJWkVfTE8sCTB4ODAgfSwKLQl7IE9WOTc0MF9ZX09VVFBVVF9TSVpFX0hJLAkweDAxIH0sCi0JeyBPVjk3NDBfWV9PVVRQVVRfU0laRV9MTywJMHhlMCB9LAotCXsgT1Y5NzQwX0lTUF9DVFJMMUUsCQkweDAzIH0sCi0JeyBPVjk3NDBfSVNQX0NUUkwxRiwJCTB4YzAgfSwKLQl7IE9WOTc0MF9JU1BfQ1RSTDIwLAkJMHgwMiB9LAotCXsgT1Y5NzQwX0lTUF9DVFJMMjEsCQkweGQwIH0sCi0JeyBPVjk3NDBfVkZJRk9fUkVBRF9TVEFSVF9ISSwJMHgwMSB9LAotCXsgT1Y5NzQwX1ZGSUZPX1JFQURfU1RBUlRfTE8sCTB4NDAgfSwKLQl7IE9WOTc0MF9JU1BfQ1RSTDAwLAkJMHhmZiB9LAotCXsgT1Y5NzQwX0lTUF9DVFJMMDEsCQkweGZmIH0sCi0JeyBPVjk3NDBfSVNQX0NUUkwwMywJCTB4ZmYgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3Y5NzQwX3JlZyBvdjk3NDBfcmVnc183MjBwW10gPSB7Ci0JeyBPVjk3NDBfWF9BRERSX1NUQVJUX0hJLAkweDAwIH0sCi0JeyBPVjk3NDBfWF9BRERSX1NUQVJUX0xPLAkweDAwIH0sCi0JeyBPVjk3NDBfWV9BRERSX1NUQVJUX0hJLAkweDAwIH0sCi0JeyBPVjk3NDBfWV9BRERSX1NUQVJUX0xPLAkweDAwIH0sCi0JeyBPVjk3NDBfWF9BRERSX0VORF9ISSwJCTB4MDUgfSwKLQl7IE9WOTc0MF9YX0FERFJfRU5EX0xPLAkJMHgwMyB9LAotCXsgT1Y5NzQwX1lfQUREUl9FTkRfSEksCQkweDAyIH0sCi0JeyBPVjk3NDBfWV9BRERSX0VORF9MTywJCTB4ZDMgfSwKLQl7IE9WOTc0MF9YX09VVFBVVF9TSVpFX0hJLAkweDA1IH0sCi0JeyBPVjk3NDBfWF9PVVRQVVRfU0laRV9MTywJMHgwMCB9LAotCXsgT1Y5NzQwX1lfT1VUUFVUX1NJWkVfSEksCTB4MDIgfSwKLQl7IE9WOTc0MF9ZX09VVFBVVF9TSVpFX0xPLAkweGQwIH0sCi0JeyBPVjk3NDBfSVNQX0NUUkwxRSwJCTB4MDUgfSwKLQl7IE9WOTc0MF9JU1BfQ1RSTDFGLAkJMHgwMCB9LAotCXsgT1Y5NzQwX0lTUF9DVFJMMjAsCQkweDAyIH0sCi0JeyBPVjk3NDBfSVNQX0NUUkwyMSwJCTB4ZDAgfSwKLQl7IE9WOTc0MF9WRklGT19SRUFEX1NUQVJUX0hJLAkweDAyIH0sCi0JeyBPVjk3NDBfVkZJRk9fUkVBRF9TVEFSVF9MTywJMHgzMCB9LAotCXsgT1Y5NzQwX0lTUF9DVFJMMDAsCQkweGZmIH0sCi0JeyBPVjk3NDBfSVNQX0NUUkwwMSwJCTB4ZWYgfSwKLQl7IE9WOTc0MF9JU1BfQ1RSTDAzLAkJMHhmZiB9LAorCS8qIFlVWVYgb3JkZXIgKi8KKwl7IE9WOTc0MF9JU1BfQ1RSTDE5LAkJMHgwMiB9LAogfTsKIAogc3RhdGljIGVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBvdjk3NDBfY29kZXNbXSA9IHsKQEAgLTUzNyw3ICs0ODIsOCBAQAogCXJldCA9IG92OTc0MF9yZWdfcmVhZChjbGllbnQsIHJlZywgJnZhbCk7CiAJaWYgKHJldCA8IDApIHsKIAkJZGV2X2VycigmY2xpZW50LT5kZXYsCi0JCQkiW1JlYWRdLU1vZGlmeS1Xcml0ZSBvZiByZWdpc3RlciAlMDJ4IGZhaWxlZCFcbiIsIHJlZyk7CisJCQkiW1JlYWRdLU1vZGlmeS1Xcml0ZSBvZiByZWdpc3RlciAweCUwNHggZmFpbGVkIVxuIiwKKwkJCXJlZyk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC01NDcsNyArNDkzLDggQEAKIAlyZXQgPSBvdjk3NDBfcmVnX3dyaXRlKGNsaWVudCwgcmVnLCB2YWwpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAotCQkJIlJlYWQtTW9kaWZ5LVtXcml0ZV0gb2YgcmVnaXN0ZXIgJTAyeCBmYWlsZWQhXG4iLCByZWcpOworCQkJIlJlYWQtTW9kaWZ5LVtXcml0ZV0gb2YgcmVnaXN0ZXIgMHglMDR4IGZhaWxlZCFcbiIsCisJCQlyZWcpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtNjA4LDYgKzU1NSw4IEBACiAJCQkJCSAgICAgICAweDAwKTsKIAl9CiAKKwlwcml2LT5jdXJyZW50X2VuYWJsZSA9IGVuYWJsZTsKKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTYzMCw2ICs1NzksMjE1IEBACiAJcmV0dXJuIHNvY19jYW1lcmFfYXBwbHlfc2Vuc29yX2ZsYWdzKGljbCwgZmxhZ3MpOwogfQogCisvKiBzZWxlY3QgbmVhcmVzdCBoaWdoZXIgcmVzb2x1dGlvbiBmb3IgY2FwdHVyZSAqLworc3RhdGljIHZvaWQgb3Y5NzQwX3Jlc19yb3VuZHVwKHUzMiAqd2lkdGgsIHUzMiAqaGVpZ2h0KQoreworCS8qIFdpZHRoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0IHBpeGVscy4gKi8KKwkqd2lkdGggPSBBTElHTigqd2lkdGgsIDQpOworCisJLyogTWF4IHJlc29sdXRpb24gaXMgMTI4MHg3MjAgKDcyMHApLiAqLworCWlmICgqd2lkdGggPiBPVjk3NDBfTUFYX1dJRFRIKQorCQkqd2lkdGggPSBPVjk3NDBfTUFYX1dJRFRIOworCisJaWYgKCpoZWlnaHQgPiBPVjk3NDBfTUFYX0hFSUdIVCkKKwkJKmhlaWdodCA9IE9WOTc0MF9NQVhfSEVJR0hUOworfQorCisvKiBTZXR1cCByZWdpc3RlcnMgYWNjb3JkaW5nIHRvIHJlc29sdXRpb24gYW5kIGNvbG9yIGVuY29kaW5nICovCitzdGF0aWMgaW50IG92OTc0MF9zZXRfcmVzKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHUzMiB3aWR0aCwgdTMyIGhlaWdodCkKK3sKKwl1MzIgeF9zdGFydDsKKwl1MzIgeV9zdGFydDsKKwl1MzIgeF9lbmQ7CisJdTMyIHlfZW5kOworCWJvb2wgc2NhbGluZyA9IDA7CisJdTMyIHNjYWxlX2lucHV0X3g7CisJdTMyIHNjYWxlX2lucHV0X3k7CisJaW50IHJldDsKKworCWlmICgod2lkdGggIT0gT1Y5NzQwX01BWF9XSURUSCkgfHwgKGhlaWdodCAhPSBPVjk3NDBfTUFYX0hFSUdIVCkpCisJCXNjYWxpbmcgPSAxOworCisJLyoKKwkgKiBUcnkgdG8gdXNlIGFzIG11Y2ggb2YgdGhlIHNlbnNvciBhcmVhIGFzIHBvc3NpYmxlIHdoZW4gc3VwcG9ydGluZworCSAqIHNtYWxsZXIgcmVzb2x1dGlvbnMuICBEZXBlbmRpbmcgb24gdGhlIGFzcGVjdCByYXRpbyBvZiB0aGUKKwkgKiBjaG9zZW4gcmVzb2x1dGlvbiwgd2UgY2FuIGVpdGhlciB1c2UgdGhlIGZ1bGwgd2lkdGggb2YgdGhlIHNlbnNvciwKKwkgKiBvciB0aGUgZnVsbCBoZWlnaHQgb2YgdGhlIHNlbnNvciAob3IgYm90aCBpZiB0aGUgYXNwZWN0IHJhdGlvIGlzCisJICogdGhlIHNhbWUgYXMgMTI4MHg3MjAuCisJICovCisJaWYgKChPVjk3NDBfTUFYX1dJRFRIICogaGVpZ2h0KSA+IChPVjk3NDBfTUFYX0hFSUdIVCAqIHdpZHRoKSkgeworCQlzY2FsZV9pbnB1dF94ID0gKE9WOTc0MF9NQVhfSEVJR0hUICogd2lkdGgpIC8gaGVpZ2h0OworCQlzY2FsZV9pbnB1dF95ID0gT1Y5NzQwX01BWF9IRUlHSFQ7CisJfSBlbHNlIHsKKwkJc2NhbGVfaW5wdXRfeCA9IE9WOTc0MF9NQVhfV0lEVEg7CisJCXNjYWxlX2lucHV0X3kgPSAoT1Y5NzQwX01BWF9XSURUSCAqIGhlaWdodCkgLyB3aWR0aDsKKwl9CisKKwkvKiBUaGVzZSBkZXNjcmliZSB0aGUgYXJlYSBvZiB0aGUgc2Vuc29yIHRvIHVzZS4gKi8KKwl4X3N0YXJ0ID0gKE9WOTc0MF9NQVhfV0lEVEggLSBzY2FsZV9pbnB1dF94KSAvIDI7CisJeV9zdGFydCA9IChPVjk3NDBfTUFYX0hFSUdIVCAtIHNjYWxlX2lucHV0X3kpIC8gMjsKKwl4X2VuZCA9IHhfc3RhcnQgKyBzY2FsZV9pbnB1dF94IC0gMTsKKwl5X2VuZCA9IHlfc3RhcnQgKyBzY2FsZV9pbnB1dF95IC0gMTsKKworCXJldCA9IG92OTc0MF9yZWdfd3JpdGUoY2xpZW50LCBPVjk3NDBfWF9BRERSX1NUQVJUX0hJLCB4X3N0YXJ0ID4+IDgpOworCWlmIChyZXQpCisJCWdvdG8gZG9uZTsKKwlyZXQgPSBvdjk3NDBfcmVnX3dyaXRlKGNsaWVudCwgT1Y5NzQwX1hfQUREUl9TVEFSVF9MTywgeF9zdGFydCAmIDB4ZmYpOworCWlmIChyZXQpCisJCWdvdG8gZG9uZTsKKwlyZXQgPSBvdjk3NDBfcmVnX3dyaXRlKGNsaWVudCwgT1Y5NzQwX1lfQUREUl9TVEFSVF9ISSwgeV9zdGFydCA+PiA4KTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmU7CisJcmV0ID0gb3Y5NzQwX3JlZ193cml0ZShjbGllbnQsIE9WOTc0MF9ZX0FERFJfU1RBUlRfTE8sIHlfc3RhcnQgJiAweGZmKTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmU7CisKKwlyZXQgPSBvdjk3NDBfcmVnX3dyaXRlKGNsaWVudCwgT1Y5NzQwX1hfQUREUl9FTkRfSEksIHhfZW5kID4+IDgpOworCWlmIChyZXQpCisJCWdvdG8gZG9uZTsKKwlyZXQgPSBvdjk3NDBfcmVnX3dyaXRlKGNsaWVudCwgT1Y5NzQwX1hfQUREUl9FTkRfTE8sIHhfZW5kICYgMHhmZik7CisJaWYgKHJldCkKKwkJZ290byBkb25lOworCXJldCA9IG92OTc0MF9yZWdfd3JpdGUoY2xpZW50LCBPVjk3NDBfWV9BRERSX0VORF9ISSwgeV9lbmQgPj4gOCk7CisJaWYgKHJldCkKKwkJZ290byBkb25lOworCXJldCA9IG92OTc0MF9yZWdfd3JpdGUoY2xpZW50LCBPVjk3NDBfWV9BRERSX0VORF9MTywgeV9lbmQgJiAweGZmKTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmU7CisKKwlyZXQgPSBvdjk3NDBfcmVnX3dyaXRlKGNsaWVudCwgT1Y5NzQwX1hfT1VUUFVUX1NJWkVfSEksIHdpZHRoID4+IDgpOworCWlmIChyZXQpCisJCWdvdG8gZG9uZTsKKwlyZXQgPSBvdjk3NDBfcmVnX3dyaXRlKGNsaWVudCwgT1Y5NzQwX1hfT1VUUFVUX1NJWkVfTE8sIHdpZHRoICYgMHhmZik7CisJaWYgKHJldCkKKwkJZ290byBkb25lOworCXJldCA9IG92OTc0MF9yZWdfd3JpdGUoY2xpZW50LCBPVjk3NDBfWV9PVVRQVVRfU0laRV9ISSwgaGVpZ2h0ID4+IDgpOworCWlmIChyZXQpCisJCWdvdG8gZG9uZTsKKwlyZXQgPSBvdjk3NDBfcmVnX3dyaXRlKGNsaWVudCwgT1Y5NzQwX1lfT1VUUFVUX1NJWkVfTE8sIGhlaWdodCAmIDB4ZmYpOworCWlmIChyZXQpCisJCWdvdG8gZG9uZTsKKworCXJldCA9IG92OTc0MF9yZWdfd3JpdGUoY2xpZW50LCBPVjk3NDBfSVNQX0NUUkwxRSwgc2NhbGVfaW5wdXRfeCA+PiA4KTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmU7CisJcmV0ID0gb3Y5NzQwX3JlZ193cml0ZShjbGllbnQsIE9WOTc0MF9JU1BfQ1RSTDFGLCBzY2FsZV9pbnB1dF94ICYgMHhmZik7CisJaWYgKHJldCkKKwkJZ290byBkb25lOworCXJldCA9IG92OTc0MF9yZWdfd3JpdGUoY2xpZW50LCBPVjk3NDBfSVNQX0NUUkwyMCwgc2NhbGVfaW5wdXRfeSA+PiA4KTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmU7CisJcmV0ID0gb3Y5NzQwX3JlZ193cml0ZShjbGllbnQsIE9WOTc0MF9JU1BfQ1RSTDIxLCBzY2FsZV9pbnB1dF95ICYgMHhmZik7CisJaWYgKHJldCkKKwkJZ290byBkb25lOworCisJcmV0ID0gb3Y5NzQwX3JlZ193cml0ZShjbGllbnQsIE9WOTc0MF9WRklGT19SRUFEX1NUQVJUX0hJLAorCQkJICAgICAgIChzY2FsZV9pbnB1dF94IC0gd2lkdGgpID4+IDgpOworCWlmIChyZXQpCisJCWdvdG8gZG9uZTsKKwlyZXQgPSBvdjk3NDBfcmVnX3dyaXRlKGNsaWVudCwgT1Y5NzQwX1ZGSUZPX1JFQURfU1RBUlRfTE8sCisJCQkgICAgICAgKHNjYWxlX2lucHV0X3ggLSB3aWR0aCkgJiAweGZmKTsKKwlpZiAocmV0KQorCQlnb3RvIGRvbmU7CisKKwlyZXQgPSBvdjk3NDBfcmVnX3dyaXRlKGNsaWVudCwgT1Y5NzQwX0lTUF9DVFJMMDAsIDB4ZmYpOworCWlmIChyZXQpCisJCWdvdG8gZG9uZTsKKwlyZXQgPSBvdjk3NDBfcmVnX3dyaXRlKGNsaWVudCwgT1Y5NzQwX0lTUF9DVFJMMDEsIDB4ZWYgfAorCQkJCQkJCSAgKHNjYWxpbmcgPDwgNCkpOworCWlmIChyZXQpCisJCWdvdG8gZG9uZTsKKwlyZXQgPSBvdjk3NDBfcmVnX3dyaXRlKGNsaWVudCwgT1Y5NzQwX0lTUF9DVFJMMDMsIDB4ZmYpOworCitkb25lOgorCXJldHVybiByZXQ7Cit9CisKKy8qIHNldCB0aGUgZm9ybWF0IHdlIHdpbGwgY2FwdHVyZSBpbiAqLworc3RhdGljIGludCBvdjk3NDBfc19mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mKQoreworCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3Qgb3Y5NzQwX3ByaXYgKnByaXYgPSB0b19vdjk3NDAoc2QpOworCWVudW0gdjRsMl9jb2xvcnNwYWNlIGNzcGFjZTsKKwllbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgY29kZSA9IG1mLT5jb2RlOworCWludCByZXQ7CisKKwlvdjk3NDBfcmVzX3JvdW5kdXAoJm1mLT53aWR0aCwgJm1mLT5oZWlnaHQpOworCisJc3dpdGNoIChjb2RlKSB7CisJY2FzZSBWNEwyX01CVVNfRk1UX1lVWVY4XzJYODoKKwkJY3NwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0I7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IG92OTc0MF9yZWdfd3JpdGVfYXJyYXkoY2xpZW50LCBvdjk3NDBfZGVmYXVsdHMsCisJCQkJICAgICBBUlJBWV9TSVpFKG92OTc0MF9kZWZhdWx0cykpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gb3Y5NzQwX3NldF9yZXMoY2xpZW50LCBtZi0+d2lkdGgsIG1mLT5oZWlnaHQpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJbWYtPmNvZGUJPSBjb2RlOworCW1mLT5jb2xvcnNwYWNlCT0gY3NwYWNlOworCisJbWVtY3B5KCZwcml2LT5jdXJyZW50X21mLCBtZiwgc2l6ZW9mKHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQpKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgb3Y5NzQwX3RyeV9mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwkJCSAgc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqbWYpCit7CisJb3Y5NzQwX3Jlc19yb3VuZHVwKCZtZi0+d2lkdGgsICZtZi0+aGVpZ2h0KTsKKworCW1mLT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwltZi0+Y29kZSA9IFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4OworCW1mLT5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0I7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBvdjk3NDBfZW51bV9mbXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdW5zaWduZWQgaW50IGluZGV4LAorCQkJICAgZW51bSB2NGwyX21idXNfcGl4ZWxjb2RlICpjb2RlKQoreworCWlmIChpbmRleCA+PSBBUlJBWV9TSVpFKG92OTc0MF9jb2RlcykpCisJCXJldHVybiAtRUlOVkFMOworCisJKmNvZGUgPSBvdjk3NDBfY29kZXNbaW5kZXhdOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Y5NzQwX2Nyb3BjYXAoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY3JvcGNhcCAqYSkKK3sKKwlhLT5ib3VuZHMubGVmdAkJPSAwOworCWEtPmJvdW5kcy50b3AJCT0gMDsKKwlhLT5ib3VuZHMud2lkdGgJCT0gT1Y5NzQwX01BWF9XSURUSDsKKwlhLT5ib3VuZHMuaGVpZ2h0CT0gT1Y5NzQwX01BWF9IRUlHSFQ7CisJYS0+ZGVmcmVjdAkJPSBhLT5ib3VuZHM7CisJYS0+dHlwZQkJCT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFOworCWEtPnBpeGVsYXNwZWN0Lm51bWVyYXRvcgk9IDE7CisJYS0+cGl4ZWxhc3BlY3QuZGVub21pbmF0b3IJPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3Y5NzQwX2dfY3JvcChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jcm9wICphKQoreworCWEtPmMubGVmdAkJPSAwOworCWEtPmMudG9wCQk9IDA7CisJYS0+Yy53aWR0aAkJPSBPVjk3NDBfTUFYX1dJRFRIOworCWEtPmMuaGVpZ2h0CQk9IE9WOTc0MF9NQVhfSEVJR0hUOworCWEtPnR5cGUJCQk9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKworCXJldHVybiAwOworfQorCiAvKiBHZXQgc3RhdHVzIG9mIGFkZGl0aW9uYWwgY2FtZXJhIGNhcGFiaWxpdGllcyAqLwogc3RhdGljIGludCBvdjk3NDBfZ19jdHJsKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCiB7CkBAIC02ODAsNiArODM4LDI0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgb3Y5NzQwX3NfcG93ZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgaW50IG9uKQoreworCXN0cnVjdCBvdjk3NDBfcHJpdiAqcHJpdiA9IHRvX292OTc0MChzZCk7CisKKwlpZiAoIXByaXYtPmN1cnJlbnRfZW5hYmxlKQorCQlyZXR1cm4gMDsKKworCWlmIChvbikgeworCQlvdjk3NDBfc19mbXQoc2QsICZwcml2LT5jdXJyZW50X21mKTsKKwkJb3Y5NzQwX3Nfc3RyZWFtKHNkLCBwcml2LT5jdXJyZW50X2VuYWJsZSk7CisJfSBlbHNlIHsKKwkJb3Y5NzQwX3Nfc3RyZWFtKHNkLCAwKTsKKwkJcHJpdi0+Y3VycmVudF9lbmFibGUgPSB0cnVlOworCX0KKworCXJldHVybiAwOworfQorCiAjaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwogc3RhdGljIGludCBvdjk3NDBfZ2V0X3JlZ2lzdGVyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCiAJCQkgICAgICAgc3RydWN0IHY0bDJfZGJnX3JlZ2lzdGVyICpyZWcpCkBAIC03MTQsMTI3ICs4OTAsNiBAQAogfQogI2VuZGlmCiAKLS8qIHNlbGVjdCBuZWFyZXN0IGhpZ2hlciByZXNvbHV0aW9uIGZvciBjYXB0dXJlICovCi1zdGF0aWMgdm9pZCBvdjk3NDBfcmVzX3JvdW5kdXAodTMyICp3aWR0aCwgdTMyICpoZWlnaHQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShvdjk3NDBfcmVzb2x1dGlvbnMpOyBpKyspCi0JCWlmICgob3Y5NzQwX3Jlc29sdXRpb25zW2ldLndpZHRoID49ICp3aWR0aCkgJiYKLQkJICAgIChvdjk3NDBfcmVzb2x1dGlvbnNbaV0uaGVpZ2h0ID49ICpoZWlnaHQpKSB7Ci0JCQkqd2lkdGggPSBvdjk3NDBfcmVzb2x1dGlvbnNbaV0ud2lkdGg7Ci0JCQkqaGVpZ2h0ID0gb3Y5NzQwX3Jlc29sdXRpb25zW2ldLmhlaWdodDsKLQkJCXJldHVybjsKLQkJfQotCi0JKndpZHRoID0gb3Y5NzQwX3Jlc29sdXRpb25zW09WOTc0MF83MjBQXS53aWR0aDsKLQkqaGVpZ2h0ID0gb3Y5NzQwX3Jlc29sdXRpb25zW09WOTc0MF83MjBQXS5oZWlnaHQ7Ci19Ci0KLS8qIFNldHVwIHJlZ2lzdGVycyBhY2NvcmRpbmcgdG8gcmVzb2x1dGlvbiBhbmQgY29sb3IgZW5jb2RpbmcgKi8KLXN0YXRpYyBpbnQgb3Y5NzQwX3NldF9yZXMoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgdTMyIHdpZHRoKQotewotCWludCByZXQ7Ci0KLQkvKiBzZWxlY3QgcmVnaXN0ZXIgY29uZmlndXJhdGlvbiBmb3IgZ2l2ZW4gcmVzb2x1dGlvbiAqLwotCWlmICh3aWR0aCA9PSBvdjk3NDBfcmVzb2x1dGlvbnNbT1Y5NzQwX1ZHQV0ud2lkdGgpIHsKLQkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJTZXR0aW5nIGltYWdlIHNpemUgdG8gNjQweDQ4MFxuIik7Ci0JCXJldCA9IG92OTc0MF9yZWdfd3JpdGVfYXJyYXkoY2xpZW50LCBvdjk3NDBfcmVnc192Z2EsCi0JCQkJCSAgICAgQVJSQVlfU0laRShvdjk3NDBfcmVnc192Z2EpKTsKLQl9IGVsc2UgaWYgKHdpZHRoID09IG92OTc0MF9yZXNvbHV0aW9uc1tPVjk3NDBfNzIwUF0ud2lkdGgpIHsKLQkJZGV2X2RiZygmY2xpZW50LT5kZXYsICJTZXR0aW5nIGltYWdlIHNpemUgdG8gMTI4MHg3MjBcbiIpOwotCQlyZXQgPSBvdjk3NDBfcmVnX3dyaXRlX2FycmF5KGNsaWVudCwgb3Y5NzQwX3JlZ3NfNzIwcCwKLQkJCQkJICAgICBBUlJBWV9TSVpFKG92OTc0MF9yZWdzXzcyMHApKTsKLQl9IGVsc2UgewotCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgIkZhaWxlZCB0byBzZWxlY3QgcmVzb2x1dGlvbiFcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0vKiBzZXQgdGhlIGZvcm1hdCB3ZSB3aWxsIGNhcHR1cmUgaW4gKi8KLXN0YXRpYyBpbnQgb3Y5NzQwX3NfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JCQlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZikKLXsKLQlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0JZW51bSB2NGwyX2NvbG9yc3BhY2UgY3NwYWNlOwotCWVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBjb2RlID0gbWYtPmNvZGU7Ci0JaW50IHJldDsKLQotCW92OTc0MF9yZXNfcm91bmR1cCgmbWYtPndpZHRoLCAmbWYtPmhlaWdodCk7Ci0KLQlzd2l0Y2ggKGNvZGUpIHsKLQljYXNlIFY0TDJfTUJVU19GTVRfWVVZVjhfMlg4OgotCQljc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfU1JHQjsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0ID0gb3Y5NzQwX3JlZ193cml0ZV9hcnJheShjbGllbnQsIG92OTc0MF9kZWZhdWx0cywKLQkJCQkgICAgIEFSUkFZX1NJWkUob3Y5NzQwX2RlZmF1bHRzKSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBvdjk3NDBfc2V0X3JlcyhjbGllbnQsIG1mLT53aWR0aCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQltZi0+Y29kZQk9IGNvZGU7Ci0JbWYtPmNvbG9yc3BhY2UJPSBjc3BhY2U7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IG92OTc0MF90cnlfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCi0JCQkgIHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1mKQotewotCW92OTc0MF9yZXNfcm91bmR1cCgmbWYtPndpZHRoLCAmbWYtPmhlaWdodCk7Ci0KLQltZi0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7Ci0JbWYtPmNvZGUgPSBWNEwyX01CVVNfRk1UX1lVWVY4XzJYODsKLQltZi0+Y29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgb3Y5NzQwX2VudW1fZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHVuc2lnbmVkIGludCBpbmRleCwKLQkJCSAgIGVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSAqY29kZSkKLXsKLQlpZiAoaW5kZXggPj0gQVJSQVlfU0laRShvdjk3NDBfY29kZXMpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCSpjb2RlID0gb3Y5NzQwX2NvZGVzW2luZGV4XTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG92OTc0MF9jcm9wY2FwKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2Nyb3BjYXAgKmEpCi17Ci0JYS0+Ym91bmRzLmxlZnQJCT0gMDsKLQlhLT5ib3VuZHMudG9wCQk9IDA7Ci0JYS0+Ym91bmRzLndpZHRoCQk9IG92OTc0MF9yZXNvbHV0aW9uc1tPVjk3NDBfNzIwUF0ud2lkdGg7Ci0JYS0+Ym91bmRzLmhlaWdodAk9IG92OTc0MF9yZXNvbHV0aW9uc1tPVjk3NDBfNzIwUF0uaGVpZ2h0OwotCWEtPmRlZnJlY3QJCT0gYS0+Ym91bmRzOwotCWEtPnR5cGUJCQk9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKLQlhLT5waXhlbGFzcGVjdC5udW1lcmF0b3IJPSAxOwotCWEtPnBpeGVsYXNwZWN0LmRlbm9taW5hdG9yCT0gMTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IG92OTc0MF9nX2Nyb3Aoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgc3RydWN0IHY0bDJfY3JvcCAqYSkKLXsKLQlhLT5jLmxlZnQJCT0gMDsKLQlhLT5jLnRvcAkJPSAwOwotCWEtPmMud2lkdGgJCT0gb3Y5NzQwX3Jlc29sdXRpb25zW09WOTc0MF83MjBQXS53aWR0aDsKLQlhLT5jLmhlaWdodAkJPSBvdjk3NDBfcmVzb2x1dGlvbnNbT1Y5NzQwXzcyMFBdLmhlaWdodDsKLQlhLT50eXBlCQkJPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkU7Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBvdjk3NDBfdmlkZW9fcHJvYmUoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCiAJCQkgICAgICBzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQogewpAQCAtODQzLDE2ICs4OTgsOSBAQAogCXU4IG1vZGVsaGksIG1vZGVsbG87CiAJaW50IHJldDsKIAotCS8qCi0JICogV2UgbXVzdCBoYXZlIGEgcGFyZW50IGJ5IG5vdy4gQW5kIGl0IGNhbm5vdCBiZSBhIHdyb25nIG9uZS4KLQkgKiBTbyB0aGlzIGVudGlyZSB0ZXN0IGlzIGNvbXBsZXRlbHkgcmVkdW5kYW50LgotCSAqLwotCWlmICghaWNkLT5kZXYucGFyZW50IHx8Ci0JICAgIHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpLT5uciAhPSBpY2QtPmlmYWNlKSB7Ci0JCWRldl9lcnIoJmNsaWVudC0+ZGV2LCAiUGFyZW50IG1pc3Npbmcgb3IgaW52YWxpZCFcbiIpOwotCQlyZXQgPSAtRU5PREVWOwotCQlnb3RvIGVycjsKLQl9CisJLyogV2UgbXVzdCBoYXZlIGEgcGFyZW50IGJ5IG5vdy4gQW5kIGl0IGNhbm5vdCBiZSBhIHdyb25nIG9uZS4gKi8KKwlCVUdfT04oIWljZC0+cGFyZW50IHx8CisJICAgICAgIHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCktPm5yICE9IGljZC0+aWZhY2UpOwogCiAJLyoKIAkgKiBjaGVjayBhbmQgc2hvdyBwcm9kdWN0IElEIGFuZCBtYW51ZmFjdHVyZXIgSUQKQEAgLTkwMSwxNyArOTQ5LDYgQEAKIAkubnVtX2NvbnRyb2xzCQk9IEFSUkFZX1NJWkUob3Y5NzQwX2NvbnRyb2xzKSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgb3Y5NzQwX2NvcmVfb3BzID0gewotCS5nX2N0cmwJCQk9IG92OTc0MF9nX2N0cmwsCi0JLnNfY3RybAkJCT0gb3Y5NzQwX3NfY3RybCwKLQkuZ19jaGlwX2lkZW50CQk9IG92OTc0MF9nX2NoaXBfaWRlbnQsCi0jaWZkZWYgQ09ORklHX1ZJREVPX0FEVl9ERUJVRwotCS5nX3JlZ2lzdGVyCQk9IG92OTc0MF9nZXRfcmVnaXN0ZXIsCi0JLnNfcmVnaXN0ZXIJCT0gb3Y5NzQwX3NldF9yZWdpc3RlciwKLSNlbmRpZgotCi19OwotCiBzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyBvdjk3NDBfdmlkZW9fb3BzID0gewogCS5zX3N0cmVhbQkJPSBvdjk3NDBfc19zdHJlYW0sCiAJLnNfbWJ1c19mbXQJCT0gb3Y5NzQwX3NfZm10LApAQCAtOTIxLDYgKzk1OCwxNyBAQAogCS5nX2Nyb3AJCQk9IG92OTc0MF9nX2Nyb3AsCiB9OwogCitzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIG92OTc0MF9jb3JlX29wcyA9IHsKKwkuZ19jdHJsCQkJPSBvdjk3NDBfZ19jdHJsLAorCS5zX2N0cmwJCQk9IG92OTc0MF9zX2N0cmwsCisJLmdfY2hpcF9pZGVudAkJPSBvdjk3NDBfZ19jaGlwX2lkZW50LAorCS5zX3Bvd2VyCQk9IG92OTc0MF9zX3Bvd2VyLAorI2lmZGVmIENPTkZJR19WSURFT19BRFZfREVCVUcKKwkuZ19yZWdpc3RlcgkJPSBvdjk3NDBfZ2V0X3JlZ2lzdGVyLAorCS5zX3JlZ2lzdGVyCQk9IG92OTc0MF9zZXRfcmVnaXN0ZXIsCisjZW5kaWYKK307CisKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfb3BzIG92OTc0MF9zdWJkZXZfb3BzID0gewogCS5jb3JlCQkJPSAmb3Y5NzQwX2NvcmVfb3BzLAogCS52aWRlbwkJCT0gJm92OTc0MF92aWRlb19vcHMsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Btcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wbXMuYwppbmRleCA3NTUxOTA3Li5lNzUzYjVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Btcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcG1zLmMKQEAgLTI4LDcgKzI4LDYgQEAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC0zOSw3ICszOCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCitNT0RVTEVfVkVSU0lPTigiMC4wLjQiKTsKIAogI2RlZmluZSBNT1RPUk9MQQkxCiAjZGVmaW5lIFBISUxJUFMyCTIgICAgICAgICAgICAgICAvKiBTQUE3MTkxICovCkBAIC02NzgsNyArNjc3LDYgQEAKIAlzdHJsY3B5KHZjYXAtPmRyaXZlciwgZGV2LT52NGwyX2Rldi5uYW1lLCBzaXplb2YodmNhcC0+ZHJpdmVyKSk7CiAJc3RybGNweSh2Y2FwLT5jYXJkLCAiTWVkaWF2aXNpb24gUE1TIiwgc2l6ZW9mKHZjYXAtPmNhcmQpKTsKIAlzdHJsY3B5KHZjYXAtPmJ1c19pbmZvLCAiSVNBIiwgc2l6ZW9mKHZjYXAtPmJ1c19pbmZvKSk7Ci0JdmNhcC0+dmVyc2lvbiA9IEtFUk5FTF9WRVJTSU9OKDAsIDAsIDMpOwogCXZjYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfCBWNEwyX0NBUF9SRUFEV1JJVEU7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1tYWluLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi1tYWluLmMKaW5kZXggMjI1NDE5NC4uYzFkOWJiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItbWFpbi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLW1haW4uYwpAQCAtMTY4LDYgKzE2OCw3IEBACiBNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOwogTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKCIwLjkuMSIpOwogCiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi12NGwyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B2cnVzYjIvcHZydXNiMi12NGwyLmMKaW5kZXggMzg3NjExNC4uZTI3ZjhhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wdnJ1c2IyL3B2cnVzYjItdjRsMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHZydXNiMi9wdnJ1c2IyLXY0bDIuYwpAQCAtOTEsNyArOTEsNyBAQAogCS5kcml2ZXIgICAgICAgICA9ICJwdnJ1c2IyIiwKIAkuY2FyZCAgICAgICAgICAgPSAiSGF1cHBhdWdlIFdpblRWIHB2ci11c2IyIiwKIAkuYnVzX2luZm8gICAgICAgPSAidXNiIiwKLQkudmVyc2lvbiAgICAgICAgPSBLRVJORUxfVkVSU0lPTigwLCA5LCAwKSwKKwkudmVyc2lvbiAgICAgICAgPSBMSU5VWF9WRVJTSU9OX0NPREUsCiAJLmNhcGFiaWxpdGllcyAgID0gKFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfAogCQkJICAgVjRMMl9DQVBfVFVORVIgfCBWNEwyX0NBUF9BVURJTyB8IFY0TDJfQ0FQX1JBRElPIHwKIAkJCSAgIFY0TDJfQ0FQX1JFQURXUklURSksCkBAIC0zNjksMTEgKzM2OSw2IEBACiAJCWJyZWFrOwogCX0KIAotCWNhc2UgVklESU9DX1NfQVVESU86Ci0JewotCQlyZXQgPSAtRUlOVkFMOwotCQlicmVhazsKLQl9CiAJY2FzZSBWSURJT0NfR19UVU5FUjoKIAl7CiAJCXN0cnVjdCB2NGwyX3R1bmVyICp2dCA9IChzdHJ1Y3QgdjRsMl90dW5lciAqKWFyZzsKQEAgLTg1MCw3ICs4NDUsNyBAQAogI2VuZGlmCiAKIAlkZWZhdWx0IDoKLQkJcmV0ID0gLUVJTlZBTDsKKwkJcmV0ID0gLUVOT1RUWTsKIAkJYnJlYWs7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9LY29uZmlnIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvS2NvbmZpZwppbmRleCA4ZGE0MmU0Li5kNjNkMGE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL0tjb25maWcKQEAgLTEsNiArMSw3IEBACiBjb25maWcgVVNCX1BXQwogCXRyaXN0YXRlICJVU0IgUGhpbGlwcyBDYW1lcmFzIgogCWRlcGVuZHMgb24gVklERU9fVjRMMgorCXNlbGVjdCBWSURFT0JVRjJfVk1BTExPQwogCS0tLWhlbHAtLS0KIAkgIFNheSBZIG9yIE0gaGVyZSBpZiB5b3Ugd2FudCB0byB1c2Ugb25lIG9mIHRoZXNlIFBoaWxpcHMgJiBPRU0KIAkgIHdlYmNhbXM6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtY3RybC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWN0cmwuYwppbmRleCA3NjBiNGRlLi4zOTc3YWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtY3RybC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1jdHJsLmMKQEAgLTMsNiArMyw3IEBACiAgICB2aWRlbyBtb2Rlcy4KICAgIChDKSAxOTk5LTIwMDMgTmVtb3NvZnQgVW52LgogICAgKEMpIDIwMDQtMjAwNiBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCisgICAoQykgMjAxMSBIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPgogCiAgICBOT1RFOiB0aGlzIHZlcnNpb24gb2YgcHdjIGlzIGFuIHVub2ZmaWNpYWwgKG1vZGlmaWVkKSByZWxlYXNlIG9mIHB3YyAmIHBjd3gKICAgIGRyaXZlciBhbmQgdGh1cyBtYXkgaGF2ZSBidWdzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBvcmlnaW5hbCB2ZXJzaW9uLgpAQCAtNDMsNjEgKzQ0LDEyIEBACiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAKICNpbmNsdWRlICJwd2MuaCIKLSNpbmNsdWRlICJwd2MtdW5jb21wcmVzcy5oIgogI2luY2x1ZGUgInB3Yy1raWFyYS5oIgogI2luY2x1ZGUgInB3Yy10aW1vbi5oIgogI2luY2x1ZGUgInB3Yy1kZWMxLmgiCiAjaW5jbHVkZSAicHdjLWRlYzIzLmgiCiAKLS8qIFJlcXVlc3QgdHlwZXM6IHZpZGVvICovCi0jZGVmaW5lIFNFVF9MVU1fQ1RMCQkJMHgwMQotI2RlZmluZSBHRVRfTFVNX0NUTAkJCTB4MDIKLSNkZWZpbmUgU0VUX0NIUk9NX0NUTAkJCTB4MDMKLSNkZWZpbmUgR0VUX0NIUk9NX0NUTAkJCTB4MDQKLSNkZWZpbmUgU0VUX1NUQVRVU19DVEwJCQkweDA1Ci0jZGVmaW5lIEdFVF9TVEFUVVNfQ1RMCQkJMHgwNgotI2RlZmluZSBTRVRfRVBfU1RSRUFNX0NUTAkJMHgwNwotI2RlZmluZSBHRVRfRVBfU1RSRUFNX0NUTAkJMHgwOAotI2RlZmluZSBHRVRfWFhfQ1RMCQkJMHgwOQotI2RlZmluZSBTRVRfWFhfQ1RMCQkJMHgwQQotI2RlZmluZSBHRVRfWFlfQ1RMCQkJMHgwQgotI2RlZmluZSBTRVRfWFlfQ1RMCQkJMHgwQwotI2RlZmluZSBTRVRfTVBUX0NUTAkJCTB4MEQKLSNkZWZpbmUgR0VUX01QVF9DVEwJCQkweDBFCi0KLS8qIFNlbGVjdG9ycyBmb3IgdGhlIEx1bWluYW5jZSBjb250cm9scyBbR1NdRVRfTFVNX0NUTCAqLwotI2RlZmluZSBBR0NfTU9ERV9GT1JNQVRURVIJCQkweDIwMDAKLSNkZWZpbmUgUFJFU0VUX0FHQ19GT1JNQVRURVIJCQkweDIxMDAKLSNkZWZpbmUgU0hVVFRFUl9NT0RFX0ZPUk1BVFRFUgkJCTB4MjIwMAotI2RlZmluZSBQUkVTRVRfU0hVVFRFUl9GT1JNQVRURVIJCTB4MjMwMAotI2RlZmluZSBQUkVTRVRfQ09OVE9VUl9GT1JNQVRURVIJCTB4MjQwMAotI2RlZmluZSBBVVRPX0NPTlRPVVJfRk9STUFUVEVSCQkJMHgyNTAwCi0jZGVmaW5lIEJBQ0tfTElHSFRfQ09NUEVOU0FUSU9OX0ZPUk1BVFRFUgkweDI2MDAKLSNkZWZpbmUgQ09OVFJBU1RfRk9STUFUVEVSCQkJMHgyNzAwCi0jZGVmaW5lIERZTkFNSUNfTk9JU0VfQ09OVFJPTF9GT1JNQVRURVIJCTB4MjgwMAotI2RlZmluZSBGTElDS0VSTEVTU19NT0RFX0ZPUk1BVFRFUgkJMHgyOTAwCi0jZGVmaW5lIEFFX0NPTlRST0xfU1BFRUQJCQkweDJBMDAKLSNkZWZpbmUgQlJJR0hUTkVTU19GT1JNQVRURVIJCQkweDJCMDAKLSNkZWZpbmUgR0FNTUFfRk9STUFUVEVSCQkJCTB4MkMwMAotCi0vKiBTZWxlY3RvcnMgZm9yIHRoZSBDaHJvbWluYW5jZSBjb250cm9scyBbR1NdRVRfQ0hST01fQ1RMICovCi0jZGVmaW5lIFdCX01PREVfRk9STUFUVEVSCQkJMHgxMDAwCi0jZGVmaW5lIEFXQl9DT05UUk9MX1NQRUVEX0ZPUk1BVFRFUgkJMHgxMTAwCi0jZGVmaW5lIEFXQl9DT05UUk9MX0RFTEFZX0ZPUk1BVFRFUgkJMHgxMjAwCi0jZGVmaW5lIFBSRVNFVF9NQU5VQUxfUkVEX0dBSU5fRk9STUFUVEVSCTB4MTMwMAotI2RlZmluZSBQUkVTRVRfTUFOVUFMX0JMVUVfR0FJTl9GT1JNQVRURVIJMHgxNDAwCi0jZGVmaW5lIENPTE9VUl9NT0RFX0ZPUk1BVFRFUgkJCTB4MTUwMAotI2RlZmluZSBTQVRVUkFUSU9OX01PREVfRk9STUFUVEVSMQkJMHgxNjAwCi0jZGVmaW5lIFNBVFVSQVRJT05fTU9ERV9GT1JNQVRURVIyCQkweDE3MDAKLQotLyogU2VsZWN0b3JzIGZvciB0aGUgU3RhdHVzIGNvbnRyb2xzIFtHU11FVF9TVEFUVVNfQ1RMICovCi0jZGVmaW5lIFNBVkVfVVNFUl9ERUZBVUxUU19GT1JNQVRURVIJCTB4MDIwMAotI2RlZmluZSBSRVNUT1JFX1VTRVJfREVGQVVMVFNfRk9STUFUVEVSCQkweDAzMDAKLSNkZWZpbmUgUkVTVE9SRV9GQUNUT1JZX0RFRkFVTFRTX0ZPUk1BVFRFUgkweDA0MDAKLSNkZWZpbmUgUkVBRF9BR0NfRk9STUFUVEVSCQkJMHgwNTAwCi0jZGVmaW5lIFJFQURfU0hVVFRFUl9GT1JNQVRURVIJCQkweDA2MDAKLSNkZWZpbmUgUkVBRF9SRURfR0FJTl9GT1JNQVRURVIJCQkweDA3MDAKLSNkZWZpbmUgUkVBRF9CTFVFX0dBSU5fRk9STUFUVEVSCQkweDA4MDAKKy8qIFNlbGVjdG9ycyBmb3Igc3RhdHVzIGNvbnRyb2xzIHVzZWQgb25seSBpbiB0aGlzIGZpbGUgKi8KICNkZWZpbmUgR0VUX1NUQVRVU19CMDAJCQkJMHgwQjAwCiAjZGVmaW5lIFNFTlNPUl9UWVBFX0ZPUk1BVFRFUjEJCQkweDBDMDAKICNkZWZpbmUgR0VUX1NUQVRVU18zMDAwCQkJCTB4MzAwMApAQCAtMTE2LDExICs2OCw2IEBACiAvKiBGb3JtYXR0ZXJzIGZvciB0aGUgVmlkZW8gRW5kcG9pbnQgY29udHJvbHMgW0dTXUVUX0VQX1NUUkVBTV9DVEwgKi8KICNkZWZpbmUgVklERU9fT1VUUFVUX0NPTlRST0xfRk9STUFUVEVSCQkweDAxMDAKIAotLyogRm9ybWF0dGVycyBmb3IgdGhlIG1vdG9yaXplZCBwYW4gJiB0aWx0IFtHU11FVF9NUFRfQ1RMICovCi0jZGVmaW5lIFBUX1JFTEFUSVZFX0NPTlRST0xfRk9STUFUVEVSCQkweDAxCi0jZGVmaW5lIFBUX1JFU0VUX0NPTlRST0xfRk9STUFUVEVSCQkweDAyCi0jZGVmaW5lIFBUX1NUQVRVU19GT1JNQVRURVIJCQkweDAzCi0KIHN0YXRpYyBjb25zdCBjaGFyICpzaXplMm5hbWVbUFNaX01BWF0gPQogewogCSJzdWJRQ0lGIiwKQEAgLTE2MCw3ICsxMDcsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIHN0YXRpYyBpbnQgX3NlbmRfY29udHJvbF9tc2coc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsCi0JdTggcmVxdWVzdCwgdTE2IHZhbHVlLCBpbnQgaW5kZXgsIHZvaWQgKmJ1ZiwgaW50IGJ1ZmxlbiwgaW50IHRpbWVvdXQpCisJdTggcmVxdWVzdCwgdTE2IHZhbHVlLCBpbnQgaW5kZXgsIHZvaWQgKmJ1ZiwgaW50IGJ1ZmxlbikKIHsKIAlpbnQgcmM7CiAJdm9pZCAqa2J1ZiA9IE5VTEw7CkBAIC0xNzcsNyArMTI0LDcgQEAKIAkJVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCBVU0JfUkVDSVBfREVWSUNFLAogCQl2YWx1ZSwKIAkJaW5kZXgsCi0JCWtidWYsIGJ1ZmxlbiwgdGltZW91dCk7CisJCWtidWYsIGJ1ZmxlbiwgVVNCX0NUUkxfU0VUX1RJTUVPVVQpOwogCiAJa2ZyZWUoa2J1Zik7CiAJcmV0dXJuIHJjOwpAQCAtMTk3LDkgKzE0NCwxMyBAQAogCQlVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgVVNCX1JFQ0lQX0RFVklDRSwKIAkJdmFsdWUsCiAJCXBkZXYtPnZjaW50ZXJmYWNlLAotCQlrYnVmLCBidWZsZW4sIDUwMCk7CisJCWtidWYsIGJ1ZmxlbiwgVVNCX0NUUkxfR0VUX1RJTUVPVVQpOwogCW1lbWNweShidWYsIGtidWYsIGJ1Zmxlbik7CiAJa2ZyZWUoa2J1Zik7CisKKwlpZiAocmMgPCAwKQorCQlQV0NfRVJST1IoInJlY3ZfY29udHJvbF9tc2cgZXJyb3IgJWQgcmVxICUwMnggdmFsICUwNHhcbiIsCisJCQkgIHJjLCByZXF1ZXN0LCB2YWx1ZSk7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0yMTAsMTggKzE2MSwxNiBAQAogCQlTRVRfRVBfU1RSRUFNX0NUTCwKIAkJVklERU9fT1VUUFVUX0NPTlRST0xfRk9STUFUVEVSLAogCQlpbmRleCwKLQkJYnVmLCBidWZsZW4sIDEwMDApOworCQlidWYsIGJ1Zmxlbik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHNlbmRfY29udHJvbF9tc2coc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsCitpbnQgc2VuZF9jb250cm9sX21zZyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwKIAl1OCByZXF1ZXN0LCB1MTYgdmFsdWUsIHZvaWQgKmJ1ZiwgaW50IGJ1ZmxlbikKIHsKIAlyZXR1cm4gX3NlbmRfY29udHJvbF9tc2cocGRldiwKLQkJcmVxdWVzdCwgdmFsdWUsIHBkZXYtPnZjaW50ZXJmYWNlLCBidWYsIGJ1ZmxlbiwgNTAwKTsKKwkJcmVxdWVzdCwgdmFsdWUsIHBkZXYtPnZjaW50ZXJmYWNlLCBidWYsIGJ1Zmxlbik7CiB9CiAKLQotCiBzdGF0aWMgaW50IHNldF92aWRlb19tb2RlX05hbGEoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBzaXplLCBpbnQgZnJhbWVzKQogewogCXVuc2lnbmVkIGNoYXIgYnVmWzNdOwpAQCAtMjYxLDggKzIxMCwxMSBAQAogCQlQV0NfREVCVUdfTU9EVUxFKCJGYWlsZWQgdG8gc2VuZCB2aWRlbyBjb21tYW5kLi4uICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KLQlpZiAocEVudHJ5LT5jb21wcmVzc2VkICYmIHBkZXYtPnBpeGZtdCA9PSBWNEwyX1BJWF9GTVRfWVVWNDIwKQotCQlwd2NfZGVjMV9pbml0KHBkZXYtPnR5cGUsIHBkZXYtPnJlbGVhc2UsIGJ1ZiwgcGRldi0+ZGVjb21wcmVzc19kYXRhKTsKKwlpZiAocEVudHJ5LT5jb21wcmVzc2VkICYmIHBkZXYtPnBpeGZtdCA9PSBWNEwyX1BJWF9GTVRfWVVWNDIwKSB7CisJCXJldCA9IHB3Y19kZWMxX2luaXQocGRldiwgcGRldi0+dHlwZSwgcGRldi0+cmVsZWFzZSwgYnVmKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KIAogCXBkZXYtPmNtZF9sZW4gPSAzOwogCW1lbWNweShwZGV2LT5jbWRfYnVmLCBidWYsIDMpOwpAQCAtMzIxLDggKzI3MywxMSBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKHBDaG9vc2UtPmJhbmRsZW5ndGggPiAwICYmIHBkZXYtPnBpeGZtdCA9PSBWNEwyX1BJWF9GTVRfWVVWNDIwKQotCQlwd2NfZGVjMjNfaW5pdChwZGV2LCBwZGV2LT50eXBlLCBidWYpOworCWlmIChwQ2hvb3NlLT5iYW5kbGVuZ3RoID4gMCAmJiBwZGV2LT5waXhmbXQgPT0gVjRMMl9QSVhfRk1UX1lVVjQyMCkgeworCQlyZXQgPSBwd2NfZGVjMjNfaW5pdChwZGV2LCBwZGV2LT50eXBlLCBidWYpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQogCiAJcGRldi0+Y21kX2xlbiA9IDEzOwogCW1lbWNweShwZGV2LT5jbWRfYnVmLCBidWYsIDEzKTsKQEAgLTM5NCw4ICszNDksMTEgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCWlmIChwQ2hvb3NlLT5iYW5kbGVuZ3RoID4gMCAmJiBwZGV2LT5waXhmbXQgPT0gVjRMMl9QSVhfRk1UX1lVVjQyMCkKLQkJcHdjX2RlYzIzX2luaXQocGRldiwgcGRldi0+dHlwZSwgYnVmKTsKKwlpZiAocENob29zZS0+YmFuZGxlbmd0aCA+IDAgJiYgcGRldi0+cGl4Zm10ID09IFY0TDJfUElYX0ZNVF9ZVVY0MjApIHsKKwkJcmV0ID0gcHdjX2RlYzIzX2luaXQocGRldiwgcGRldi0+dHlwZSwgYnVmKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KIAogCXBkZXYtPmNtZF9sZW4gPSAxMjsKIAltZW1jcHkocGRldi0+Y21kX2J1ZiwgYnVmLCAxMik7CkBAIC00NTIsNiArNDEwLDcgQEAKIAl9CiAJcGRldi0+dmlldy54ID0gd2lkdGg7CiAJcGRldi0+dmlldy55ID0gaGVpZ2h0OworCXBkZXYtPnZjb21wcmVzc2lvbiA9IGNvbXByZXNzaW9uOwogCXBkZXYtPmZyYW1lX3RvdGFsX3NpemUgPSBwZGV2LT5mcmFtZV9zaXplICsgcGRldi0+ZnJhbWVfaGVhZGVyX3NpemUgKyBwZGV2LT5mcmFtZV90cmFpbGVyX3NpemU7CiAJcHdjX3NldF9pbWFnZV9idWZmZXJfc2l6ZShwZGV2KTsKIAlQV0NfREVCVUdfU0laRSgiU2V0IHZpZXdwb3J0IHRvICVkeCVkLCBpbWFnZSBzaXplIGlzICVkeCVkLlxuIiwgd2lkdGgsIGhlaWdodCwgcHdjX2ltYWdlX3NpemVzW3NpemVdLngsIHB3Y19pbWFnZV9zaXplc1tzaXplXS55KTsKQEAgLTUxMSwxMyArNDcwLDkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0jZGVmaW5lIEJMQUNLX1kgMAotI2RlZmluZSBCTEFDS19VIDEyOAotI2RlZmluZSBCTEFDS19WIDEyOAotCiBzdGF0aWMgdm9pZCBwd2Nfc2V0X2ltYWdlX2J1ZmZlcl9zaXplKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQogewotCWludCBpLCBmYWN0b3IgPSAwOworCWludCBmYWN0b3IgPSAwOwogCiAJLyogZm9yIFY0TDJfUElYX0ZNVF9ZVVY0MjAgKi8KIAlzd2l0Y2ggKHBkZXYtPnBpeGZtdCkgewpAQCAtNTQxLDQ0MiArNDk2LDEwOCBAQAogCSAqLwogCXBkZXYtPm9mZnNldC54ID0gKChwZGV2LT52aWV3LnggLSBwZGV2LT5pbWFnZS54KSAvIDIpICYgMHhGRkZDOwogCXBkZXYtPm9mZnNldC55ID0gKChwZGV2LT52aWV3LnkgLSBwZGV2LT5pbWFnZS55KSAvIDIpICYgMHhGRkZFOwotCi0JLyogRmlsbCBidWZmZXJzIHdpdGggYmxhY2sgY29sb3JzICovCi0JZm9yIChpID0gMDsgaSA8IHB3Y19tYnVmczsgaSsrKSB7Ci0JCXVuc2lnbmVkIGNoYXIgKnAgPSBwZGV2LT5pbWFnZV9kYXRhICsgcGRldi0+aW1hZ2VzW2ldLm9mZnNldDsKLQkJbWVtc2V0KHAsIEJMQUNLX1ksIHBkZXYtPnZpZXcueCAqIHBkZXYtPnZpZXcueSk7Ci0JCXAgKz0gcGRldi0+dmlldy54ICogcGRldi0+dmlldy55OwotCQltZW1zZXQocCwgQkxBQ0tfVSwgcGRldi0+dmlldy54ICogcGRldi0+dmlldy55LzQpOwotCQlwICs9IHBkZXYtPnZpZXcueCAqIHBkZXYtPnZpZXcueS80OwotCQltZW1zZXQocCwgQkxBQ0tfViwgcGRldi0+dmlldy54ICogcGRldi0+dmlldy55LzQpOwotCX0KIH0KIAotCi0KLS8qIEJSSUdIVE5FU1MgKi8KLQotaW50IHB3Y19nZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK2ludCBwd2NfZ2V0X3U4X2N0cmwoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIHU4IHJlcXVlc3QsIHUxNiB2YWx1ZSwgaW50ICpkYXRhKQogewotCWNoYXIgYnVmOwogCWludCByZXQ7CisJdTggYnVmOwogCi0JcmV0ID0gcmVjdl9jb250cm9sX21zZyhwZGV2LAotCQlHRVRfTFVNX0NUTCwgQlJJR0hUTkVTU19GT1JNQVRURVIsICZidWYsIHNpemVvZihidWYpKTsKKwlyZXQgPSByZWN2X2NvbnRyb2xfbXNnKHBkZXYsIHJlcXVlc3QsIHZhbHVlLCAmYnVmLCBzaXplb2YoYnVmKSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JcmV0dXJuIGJ1ZjsKLX0KIAotaW50IHB3Y19zZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHZhbHVlKQotewotCWNoYXIgYnVmOwotCi0JaWYgKHZhbHVlIDwgMCkKLQkJdmFsdWUgPSAwOwotCWlmICh2YWx1ZSA+IDB4ZmZmZikKLQkJdmFsdWUgPSAweGZmZmY7Ci0JYnVmID0gKHZhbHVlID4+IDkpICYgMHg3ZjsKLQlyZXR1cm4gc2VuZF9jb250cm9sX21zZyhwZGV2LAotCQlTRVRfTFVNX0NUTCwgQlJJR0hUTkVTU19GT1JNQVRURVIsICZidWYsIHNpemVvZihidWYpKTsKLX0KLQotLyogQ09OVFJBU1QgKi8KLQotaW50IHB3Y19nZXRfY29udHJhc3Qoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCi17Ci0JY2hhciBidWY7Ci0JaW50IHJldDsKLQotCXJldCA9IHJlY3ZfY29udHJvbF9tc2cocGRldiwKLQkJR0VUX0xVTV9DVEwsIENPTlRSQVNUX0ZPUk1BVFRFUiwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCXJldHVybiBidWY7Ci19Ci0KLWludCBwd2Nfc2V0X2NvbnRyYXN0KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgdmFsdWUpCi17Ci0JY2hhciBidWY7Ci0KLQlpZiAodmFsdWUgPCAwKQotCQl2YWx1ZSA9IDA7Ci0JaWYgKHZhbHVlID4gMHhmZmZmKQotCQl2YWx1ZSA9IDB4ZmZmZjsKLQlidWYgPSAodmFsdWUgPj4gMTApICYgMHgzZjsKLQlyZXR1cm4gc2VuZF9jb250cm9sX21zZyhwZGV2LAotCQlTRVRfTFVNX0NUTCwgQ09OVFJBU1RfRk9STUFUVEVSLCAmYnVmLCBzaXplb2YoYnVmKSk7Ci19Ci0KLS8qIEdBTU1BICovCi0KLWludCBwd2NfZ2V0X2dhbW1hKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQotewotCWNoYXIgYnVmOwotCWludCByZXQ7Ci0KLQlyZXQgPSByZWN2X2NvbnRyb2xfbXNnKHBkZXYsCi0JCUdFVF9MVU1fQ1RMLCBHQU1NQV9GT1JNQVRURVIsICZidWYsIHNpemVvZihidWYpKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQlyZXR1cm4gYnVmOwotfQotCi1pbnQgcHdjX3NldF9nYW1tYShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHZhbHVlKQotewotCWNoYXIgYnVmOwotCi0JaWYgKHZhbHVlIDwgMCkKLQkJdmFsdWUgPSAwOwotCWlmICh2YWx1ZSA+IDB4ZmZmZikKLQkJdmFsdWUgPSAweGZmZmY7Ci0JYnVmID0gKHZhbHVlID4+IDExKSAmIDB4MWY7Ci0JcmV0dXJuIHNlbmRfY29udHJvbF9tc2cocGRldiwKLQkJU0VUX0xVTV9DVEwsIEdBTU1BX0ZPUk1BVFRFUiwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotfQotCi0KLS8qIFNBVFVSQVRJT04gKi8KLQotLyogcmV0dXJuIGEgdmFsdWUgYmV0d2VlbiBbLTEwMCAsIDEwMF0gKi8KLWludCBwd2NfZ2V0X3NhdHVyYXRpb24oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqdmFsdWUpCi17Ci0JY2hhciBidWY7Ci0JaW50IHJldCwgc2F0dXJhdGlvbl9yZWdpc3RlcjsKLQotCWlmIChwZGV2LT50eXBlIDwgNjc1KQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAocGRldi0+dHlwZSA8IDczMCkKLQkJc2F0dXJhdGlvbl9yZWdpc3RlciA9IFNBVFVSQVRJT05fTU9ERV9GT1JNQVRURVIyOwotCWVsc2UKLQkJc2F0dXJhdGlvbl9yZWdpc3RlciA9IFNBVFVSQVRJT05fTU9ERV9GT1JNQVRURVIxOwotCXJldCA9IHJlY3ZfY29udHJvbF9tc2cocGRldiwKLQkJR0VUX0NIUk9NX0NUTCwgc2F0dXJhdGlvbl9yZWdpc3RlciwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCSp2YWx1ZSA9IChzaWduZWQpYnVmOworCSpkYXRhID0gYnVmOwogCXJldHVybiAwOwogfQogCi0vKiBAcGFyYW0gdmFsdWUgc2F0dXJhdGlvbiBjb2xvciBiZXR3ZWVuIFstMTAwICwgMTAwXSAqLwotaW50IHB3Y19zZXRfc2F0dXJhdGlvbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHZhbHVlKQoraW50IHB3Y19zZXRfdThfY3RybChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgdTggcmVxdWVzdCwgdTE2IHZhbHVlLCB1OCBkYXRhKQogewotCWNoYXIgYnVmOwotCWludCBzYXR1cmF0aW9uX3JlZ2lzdGVyOwotCi0JaWYgKHBkZXYtPnR5cGUgPCA2NzUpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICh2YWx1ZSA8IC0xMDApCi0JCXZhbHVlID0gLTEwMDsKLQlpZiAodmFsdWUgPiAxMDApCi0JCXZhbHVlID0gMTAwOwotCWlmIChwZGV2LT50eXBlIDwgNzMwKQotCQlzYXR1cmF0aW9uX3JlZ2lzdGVyID0gU0FUVVJBVElPTl9NT0RFX0ZPUk1BVFRFUjI7Ci0JZWxzZQotCQlzYXR1cmF0aW9uX3JlZ2lzdGVyID0gU0FUVVJBVElPTl9NT0RFX0ZPUk1BVFRFUjE7Ci0JcmV0dXJuIHNlbmRfY29udHJvbF9tc2cocGRldiwKLQkJU0VUX0NIUk9NX0NUTCwgc2F0dXJhdGlvbl9yZWdpc3RlciwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotfQotCi0vKiBBR0MgKi8KLQotaW50IHB3Y19zZXRfYWdjKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgbW9kZSwgaW50IHZhbHVlKQotewotCWNoYXIgYnVmOwogCWludCByZXQ7CiAKLQlpZiAobW9kZSkKLQkJYnVmID0gMHgwOyAvKiBhdXRvICovCi0JZWxzZQotCQlidWYgPSAweGZmOyAvKiBmaXhlZCAqLwotCi0JcmV0ID0gc2VuZF9jb250cm9sX21zZyhwZGV2LAotCQlTRVRfTFVNX0NUTCwgQUdDX01PREVfRk9STUFUVEVSLCAmYnVmLCBzaXplb2YoYnVmKSk7Ci0KLQlpZiAoIW1vZGUgJiYgcmV0ID49IDApIHsKLQkJaWYgKHZhbHVlIDwgMCkKLQkJCXZhbHVlID0gMDsKLQkJaWYgKHZhbHVlID4gMHhmZmZmKQotCQkJdmFsdWUgPSAweGZmZmY7Ci0JCWJ1ZiA9ICh2YWx1ZSA+PiAxMCkgJiAweDNGOwotCQlyZXQgPSBzZW5kX2NvbnRyb2xfbXNnKHBkZXYsCi0JCQlTRVRfTFVNX0NUTCwgUFJFU0VUX0FHQ19GT1JNQVRURVIsICZidWYsIHNpemVvZihidWYpKTsKLQl9CisJcmV0ID0gc2VuZF9jb250cm9sX21zZyhwZGV2LCByZXF1ZXN0LCB2YWx1ZSwgJmRhdGEsIHNpemVvZihkYXRhKSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBwd2NfZ2V0X2FnYyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICp2YWx1ZSkKLXsKLQl1bnNpZ25lZCBjaGFyIGJ1ZjsKLQlpbnQgcmV0OwotCi0JcmV0ID0gcmVjdl9jb250cm9sX21zZyhwZGV2LAotCQlHRVRfTFVNX0NUTCwgQUdDX01PREVfRk9STUFUVEVSLCAmYnVmLCBzaXplb2YoYnVmKSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoYnVmICE9IDApIHsgLyogZml4ZWQgKi8KLQkJcmV0ID0gcmVjdl9jb250cm9sX21zZyhwZGV2LAotCQkJR0VUX0xVTV9DVEwsIFBSRVNFVF9BR0NfRk9STUFUVEVSLCAmYnVmLCBzaXplb2YoYnVmKSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQkJaWYgKGJ1ZiA+IDB4M0YpCi0JCQlidWYgPSAweDNGOwotCQkqdmFsdWUgPSAoYnVmIDw8IDEwKTsKLQl9Ci0JZWxzZSB7IC8qIGF1dG8gKi8KLQkJcmV0ID0gcmVjdl9jb250cm9sX21zZyhwZGV2LAotCQkJR0VUX1NUQVRVU19DVEwsIFJFQURfQUdDX0ZPUk1BVFRFUiwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0JCS8qIEdhaC4uLiB0aGlzIHZhbHVlIHJhbmdlcyBmcm9tIDB4MDAgLi4uIDB4OUYgKi8KLQkJaWYgKGJ1ZiA+IDB4OUYpCi0JCQlidWYgPSAweDlGOwotCQkqdmFsdWUgPSAtKDQ4ICsgYnVmICogNDA5KTsKLQl9CiAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHB3Y19zZXRfc2h1dHRlcl9zcGVlZChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IG1vZGUsIGludCB2YWx1ZSkKK2ludCBwd2NfZ2V0X3M4X2N0cmwoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIHU4IHJlcXVlc3QsIHUxNiB2YWx1ZSwgaW50ICpkYXRhKQogewotCWNoYXIgYnVmWzJdOwotCWludCBzcGVlZCwgcmV0OwotCi0KLQlpZiAobW9kZSkKLQkJYnVmWzBdID0gMHgwOwkvKiBhdXRvICovCi0JZWxzZQotCQlidWZbMF0gPSAweGZmOyAvKiBmaXhlZCAqLwotCi0JcmV0ID0gc2VuZF9jb250cm9sX21zZyhwZGV2LAotCQlTRVRfTFVNX0NUTCwgU0hVVFRFUl9NT0RFX0ZPUk1BVFRFUiwgJmJ1ZiwgMSk7Ci0KLQlpZiAoIW1vZGUgJiYgcmV0ID49IDApIHsKLQkJaWYgKHZhbHVlIDwgMCkKLQkJCXZhbHVlID0gMDsKLQkJaWYgKHZhbHVlID4gMHhmZmZmKQotCQkJdmFsdWUgPSAweGZmZmY7Ci0KLQkJaWYgKERFVklDRV9VU0VfQ09ERUMyKHBkZXYtPnR5cGUpKSB7Ci0JCQkvKiBzcGVlZCByYW5nZXMgZnJvbSAweDAgdG8gMHgyOTAgKDY1NikgKi8KLQkJCXNwZWVkID0gKHZhbHVlIC8gMTAwKTsKLQkJCWJ1ZlsxXSA9IHNwZWVkID4+IDg7Ci0JCQlidWZbMF0gPSBzcGVlZCAmIDB4ZmY7Ci0JCX0gZWxzZSBpZiAoREVWSUNFX1VTRV9DT0RFQzMocGRldi0+dHlwZSkpIHsKLQkJCS8qIHNwZWVkIHNlZW1zIHRvIHJhbmdlIGZyb20gMHgwIHRvIDB4ZmYgKi8KLQkJCWJ1ZlsxXSA9IDA7Ci0JCQlidWZbMF0gPSB2YWx1ZSA+PiA4OwotCQl9Ci0KLQkJcmV0ID0gc2VuZF9jb250cm9sX21zZyhwZGV2LAotCQkJU0VUX0xVTV9DVEwsIFBSRVNFVF9TSFVUVEVSX0ZPUk1BVFRFUiwKLQkJCSZidWYsIHNpemVvZihidWYpKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotLyogVGhpcyBmdW5jdGlvbiBpcyBub3QgZXhwb3J0ZWQgdG8gdjRsMSwgc28gb3V0cHV0IHZhbHVlcyBiZXR3ZWVuIDAgLT4gMjU2ICovCi1pbnQgcHdjX2dldF9zaHV0dGVyX3NwZWVkKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKQotewotCXVuc2lnbmVkIGNoYXIgYnVmWzJdOwogCWludCByZXQ7CisJczggYnVmOwogCi0JcmV0ID0gcmVjdl9jb250cm9sX21zZyhwZGV2LAotCQlHRVRfU1RBVFVTX0NUTCwgUkVBRF9TSFVUVEVSX0ZPUk1BVFRFUiwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOworCXJldCA9IHJlY3ZfY29udHJvbF9tc2cocGRldiwgcmVxdWVzdCwgdmFsdWUsICZidWYsIHNpemVvZihidWYpKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKLQkqdmFsdWUgPSBidWZbMF0gKyAoYnVmWzFdIDw8IDgpOwotCWlmIChERVZJQ0VfVVNFX0NPREVDMihwZGV2LT50eXBlKSkgewotCQkvKiBzcGVlZCByYW5nZXMgZnJvbSAweDAgdG8gMHgyOTAgKDY1NikgKi8KLQkJKnZhbHVlICo9IDI1Ni82NTY7Ci0JfSBlbHNlIGlmIChERVZJQ0VfVVNFX0NPREVDMyhwZGV2LT50eXBlKSkgewotCQkvKiBzcGVlZCBzZWVtcyB0byByYW5nZSBmcm9tIDB4MCB0byAweGZmICovCi0JfQorCisJKmRhdGEgPSBidWY7CiAJcmV0dXJuIDA7CiB9CiAKK2ludCBwd2NfZ2V0X3UxNl9jdHJsKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCB1OCByZXF1ZXN0LCB1MTYgdmFsdWUsIGludCAqZGF0YSkKK3sKKwlpbnQgcmV0OworCXU4IGJ1ZlsyXTsKKworCXJldCA9IHJlY3ZfY29udHJvbF9tc2cocGRldiwgcmVxdWVzdCwgdmFsdWUsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJKmRhdGEgPSAoYnVmWzFdIDw8IDgpIHwgYnVmWzBdOworCXJldHVybiAwOworfQorCitpbnQgcHdjX3NldF91MTZfY3RybChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgdTggcmVxdWVzdCwgdTE2IHZhbHVlLCB1MTYgZGF0YSkKK3sKKwlpbnQgcmV0OworCXU4IGJ1ZlsyXTsKKworCWJ1ZlswXSA9IGRhdGEgJiAweGZmOworCWJ1ZlsxXSA9IGRhdGEgPj4gODsKKwlyZXQgPSBzZW5kX2NvbnRyb2xfbXNnKHBkZXYsIHJlcXVlc3QsIHZhbHVlLCBidWYsIHNpemVvZihidWYpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCitpbnQgcHdjX2J1dHRvbl9jdHJsKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCB1MTYgdmFsdWUpCit7CisJaW50IHJldDsKKworCXJldCA9IHNlbmRfY29udHJvbF9tc2cocGRldiwgU0VUX1NUQVRVU19DVEwsIHZhbHVlLCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQogCiAvKiBQT1dFUiAqLwotCi1pbnQgcHdjX2NhbWVyYV9wb3dlcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHBvd2VyKQordm9pZCBwd2NfY2FtZXJhX3Bvd2VyKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgcG93ZXIpCiB7CiAJY2hhciBidWY7CisJaW50IHI7CisKKwlpZiAoIXBkZXYtPnBvd2VyX3NhdmUpCisJCXJldHVybjsKIAogCWlmIChwZGV2LT50eXBlIDwgNjc1IHx8IChwZGV2LT50eXBlIDwgNzMwICYmIHBkZXYtPnJlbGVhc2UgPCA2KSkKLQkJcmV0dXJuIDA7CS8qIE5vdCBzdXBwb3J0ZWQgYnkgTmFsYSBvciBUaW1vbiA8IHJlbGVhc2UgNiAqLworCQlyZXR1cm47CS8qIE5vdCBzdXBwb3J0ZWQgYnkgTmFsYSBvciBUaW1vbiA8IHJlbGVhc2UgNiAqLwogCiAJaWYgKHBvd2VyKQogCQlidWYgPSAweDAwOyAvKiBhY3RpdmUgKi8KIAllbHNlCiAJCWJ1ZiA9IDB4RkY7IC8qIHBvd2VyIHNhdmUgKi8KLQlyZXR1cm4gc2VuZF9jb250cm9sX21zZyhwZGV2LAorCXIgPSBzZW5kX2NvbnRyb2xfbXNnKHBkZXYsCiAJCVNFVF9TVEFUVVNfQ1RMLCBTRVRfUE9XRVJfU0FWRV9NT0RFX0ZPUk1BVFRFUiwKIAkJJmJ1Ziwgc2l6ZW9mKGJ1ZikpOworCisJaWYgKHIgPCAwKQorCQlQV0NfRVJST1IoIkZhaWxlZCB0byBwb3dlciAlcyBjYW1lcmEgKCVkKVxuIiwKKwkJCSAgcG93ZXIgPyAib24iIDogIm9mZiIsIHIpOwogfQogCi0KLQotLyogcHJpdmF0ZSBjYWxscyAqLwotCi1pbnQgcHdjX3Jlc3RvcmVfdXNlcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKLXsKLQlyZXR1cm4gc2VuZF9jb250cm9sX21zZyhwZGV2LAotCQlTRVRfU1RBVFVTX0NUTCwgUkVTVE9SRV9VU0VSX0RFRkFVTFRTX0ZPUk1BVFRFUiwgTlVMTCwgMCk7Ci19Ci0KLWludCBwd2Nfc2F2ZV91c2VyKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQotewotCXJldHVybiBzZW5kX2NvbnRyb2xfbXNnKHBkZXYsCi0JCVNFVF9TVEFUVVNfQ1RMLCBTQVZFX1VTRVJfREVGQVVMVFNfRk9STUFUVEVSLCBOVUxMLCAwKTsKLX0KLQotaW50IHB3Y19yZXN0b3JlX2ZhY3Rvcnkoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCi17Ci0JcmV0dXJuIHNlbmRfY29udHJvbF9tc2cocGRldiwKLQkJU0VUX1NUQVRVU19DVEwsIFJFU1RPUkVfRkFDVE9SWV9ERUZBVUxUU19GT1JNQVRURVIsIE5VTEwsIDApOwotfQotCi0gLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwotIC8qIFBhdGNoIGJ5IEFsdmFyYWRvOiAobm90IGluIHRoZSBvcmlnaW5hbCB2ZXJzaW9uICAgKi8KLQotIC8qCi0gICogdGhlIGNhbWVyYSByZWNvZ25pemVzIG1vZGVzIGZyb20gMCB0byA0OgotICAqCi0gICogMDA6IGluZG9vciAoaW5jYW5kZXNjYW50IGxpZ2h0aW5nKQotICAqIDAxOiBvdXRkb29yIChzdW5saWdodCkKLSAgKiAwMjogZmx1b3Jlc2NlbnQgbGlnaHRpbmcKLSAgKiAwMzogbWFudWFsCi0gICogMDQ6IGF1dG8KLSAgKi8KLWludCBwd2Nfc2V0X2F3YihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IG1vZGUpCi17Ci0JY2hhciBidWY7Ci0JaW50IHJldDsKLQotCWlmIChtb2RlIDwgMCkKLQkgICAgbW9kZSA9IDA7Ci0KLQlpZiAobW9kZSA+IDQpCi0JICAgIG1vZGUgPSA0OwotCi0JYnVmID0gbW9kZSAmIDB4MDc7IC8qIGp1c3QgdGhlIGxvd2VzdCB0aHJlZSBiaXRzICovCi0KLQlyZXQgPSBzZW5kX2NvbnRyb2xfbXNnKHBkZXYsCi0JCVNFVF9DSFJPTV9DVEwsIFdCX01PREVfRk9STUFUVEVSLCAmYnVmLCBzaXplb2YoYnVmKSk7Ci0KLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQlyZXR1cm4gMDsKLX0KLQotaW50IHB3Y19nZXRfYXdiKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQotewotCXVuc2lnbmVkIGNoYXIgYnVmOwotCWludCByZXQ7Ci0KLQlyZXQgPSByZWN2X2NvbnRyb2xfbXNnKHBkZXYsCi0JCUdFVF9DSFJPTV9DVEwsIFdCX01PREVfRk9STUFUVEVSLCAmYnVmLCBzaXplb2YoYnVmKSk7Ci0KLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQlyZXR1cm4gYnVmOwotfQotCi1pbnQgcHdjX3NldF9yZWRfZ2FpbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHZhbHVlKQotewotCXVuc2lnbmVkIGNoYXIgYnVmOwotCi0JaWYgKHZhbHVlIDwgMCkKLQkJdmFsdWUgPSAwOwotCWlmICh2YWx1ZSA+IDB4ZmZmZikKLQkJdmFsdWUgPSAweGZmZmY7Ci0JLyogb25seSB0aGUgbXNiIGlzIGNvbnNpZGVyZWQgKi8KLQlidWYgPSB2YWx1ZSA+PiA4OwotCXJldHVybiBzZW5kX2NvbnRyb2xfbXNnKHBkZXYsCi0JCVNFVF9DSFJPTV9DVEwsIFBSRVNFVF9NQU5VQUxfUkVEX0dBSU5fRk9STUFUVEVSLAotCQkmYnVmLCBzaXplb2YoYnVmKSk7Ci19Ci0KLWludCBwd2NfZ2V0X3JlZF9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKQotewotCXVuc2lnbmVkIGNoYXIgYnVmOwotCWludCByZXQ7Ci0KLQlyZXQgPSByZWN2X2NvbnRyb2xfbXNnKHBkZXYsCi0JCUdFVF9DSFJPTV9DVEwsIFBSRVNFVF9NQU5VQUxfUkVEX0dBSU5fRk9STUFUVEVSLAotCQkmYnVmLCBzaXplb2YoYnVmKSk7Ci0JaWYgKHJldCA8IDApCi0JICAgIHJldHVybiByZXQ7Ci0JKnZhbHVlID0gYnVmIDw8IDg7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotaW50IHB3Y19zZXRfYmx1ZV9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgdmFsdWUpCi17Ci0JdW5zaWduZWQgY2hhciBidWY7Ci0KLQlpZiAodmFsdWUgPCAwKQotCQl2YWx1ZSA9IDA7Ci0JaWYgKHZhbHVlID4gMHhmZmZmKQotCQl2YWx1ZSA9IDB4ZmZmZjsKLQkvKiBvbmx5IHRoZSBtc2IgaXMgY29uc2lkZXJlZCAqLwotCWJ1ZiA9IHZhbHVlID4+IDg7Ci0JcmV0dXJuIHNlbmRfY29udHJvbF9tc2cocGRldiwKLQkJU0VUX0NIUk9NX0NUTCwgUFJFU0VUX01BTlVBTF9CTFVFX0dBSU5fRk9STUFUVEVSLAotCQkmYnVmLCBzaXplb2YoYnVmKSk7Ci19Ci0KLWludCBwd2NfZ2V0X2JsdWVfZ2FpbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICp2YWx1ZSkKLXsKLQl1bnNpZ25lZCBjaGFyIGJ1ZjsKLQlpbnQgcmV0OwotCi0JcmV0ID0gcmVjdl9jb250cm9sX21zZyhwZGV2LAotCQlHRVRfQ0hST01fQ1RMLCBQUkVTRVRfTUFOVUFMX0JMVUVfR0FJTl9GT1JNQVRURVIsCi0JCSZidWYsIHNpemVvZihidWYpKTsKLQlpZiAocmV0IDwgMCkKLQkgICAgcmV0dXJuIHJldDsKLQkqdmFsdWUgPSBidWYgPDwgODsKLQlyZXR1cm4gMDsKLX0KLQotCi0vKiBUaGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgYXJlIGRpZmZlcmVudCwgc2luY2UgdGhleSBvbmx5IHJlYWQgdGhlCi0gICBpbnRlcm5hbCByZWQvYmx1ZSBnYWlucywgd2hpY2ggbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBtYW51YWwKLSAgIGdhaW5zIHNldCBvciByZWFkIGFib3ZlLgotICovCi1zdGF0aWMgaW50IHB3Y19yZWFkX3JlZF9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKQotewotCXVuc2lnbmVkIGNoYXIgYnVmOwotCWludCByZXQ7Ci0KLQlyZXQgPSByZWN2X2NvbnRyb2xfbXNnKHBkZXYsCi0JCUdFVF9TVEFUVVNfQ1RMLCBSRUFEX1JFRF9HQUlOX0ZPUk1BVFRFUiwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCSp2YWx1ZSA9IGJ1ZiA8PCA4OwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHB3Y19yZWFkX2JsdWVfZ2FpbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICp2YWx1ZSkKLXsKLQl1bnNpZ25lZCBjaGFyIGJ1ZjsKLQlpbnQgcmV0OwotCi0JcmV0ID0gcmVjdl9jb250cm9sX21zZyhwZGV2LAotCQlHRVRfU1RBVFVTX0NUTCwgUkVBRF9CTFVFX0dBSU5fRk9STUFUVEVSLCAmYnVmLCBzaXplb2YoYnVmKSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JKnZhbHVlID0gYnVmIDw8IDg7Ci0JcmV0dXJuIDA7Ci19Ci0KLQogc3RhdGljIGludCBwd2Nfc2V0X3diX3NwZWVkKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgc3BlZWQpCiB7CiAJdW5zaWduZWQgY2hhciBidWY7CkBAIC0xMDI4LDYgKzY0OSw3IEBACiBpbnQgcHdjX3NldF9sZWRzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgb25fdmFsdWUsIGludCBvZmZfdmFsdWUpCiB7CiAJdW5zaWduZWQgY2hhciBidWZbMl07CisJaW50IHI7CiAKIAlpZiAocGRldi0+dHlwZSA8IDczMCkKIAkJcmV0dXJuIDA7CkBAIC0xMDQ1LDggKzY2NywxMiBAQAogCWJ1ZlswXSA9IG9uX3ZhbHVlOwogCWJ1ZlsxXSA9IG9mZl92YWx1ZTsKIAotCXJldHVybiBzZW5kX2NvbnRyb2xfbXNnKHBkZXYsCisJciA9IHNlbmRfY29udHJvbF9tc2cocGRldiwKIAkJU0VUX1NUQVRVU19DVEwsIExFRF9GT1JNQVRURVIsICZidWYsIHNpemVvZihidWYpKTsKKwlpZiAociA8IDApCisJCVBXQ19FUlJPUigiRmFpbGVkIHRvIHNldCBMRUQgb24vb2ZmIHRpbWUgKCVkKVxuIiwgcik7CisKKwlyZXR1cm4gcjsKIH0KIAogc3RhdGljIGludCBwd2NfZ2V0X2xlZHMoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqb25fdmFsdWUsIGludCAqb2ZmX3ZhbHVlKQpAQCAtMTA2OSwxNjQgKzY5NSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBwd2Nfc2V0X2NvbnRvdXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBjb250b3VyKQotewotCXVuc2lnbmVkIGNoYXIgYnVmOwotCWludCByZXQ7Ci0KLQlpZiAoY29udG91ciA8IDApCi0JCWJ1ZiA9IDB4ZmY7IC8qIGF1dG8gY29udG91ciBvbiAqLwotCWVsc2UKLQkJYnVmID0gMHgwOyAvKiBhdXRvIGNvbnRvdXIgb2ZmICovCi0JcmV0ID0gc2VuZF9jb250cm9sX21zZyhwZGV2LAotCQlTRVRfTFVNX0NUTCwgQVVUT19DT05UT1VSX0ZPUk1BVFRFUiwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKGNvbnRvdXIgPCAwKQotCQlyZXR1cm4gMDsKLQlpZiAoY29udG91ciA+IDB4ZmZmZikKLQkJY29udG91ciA9IDB4ZmZmZjsKLQotCWJ1ZiA9IChjb250b3VyID4+IDEwKTsgLyogY29udG91ciBwcmVzZXQgaXMgWzAuLjNmXSAqLwotCXJldCA9IHNlbmRfY29udHJvbF9tc2cocGRldiwKLQkJU0VUX0xVTV9DVEwsIFBSRVNFVF9DT05UT1VSX0ZPUk1BVFRFUiwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCXJldHVybiAwOwotfQotCi1pbnQgcHdjX2dldF9jb250b3VyKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKmNvbnRvdXIpCi17Ci0JdW5zaWduZWQgY2hhciBidWY7Ci0JaW50IHJldDsKLQotCXJldCA9IHJlY3ZfY29udHJvbF9tc2cocGRldiwKLQkJR0VUX0xVTV9DVEwsIEFVVE9fQ09OVE9VUl9GT1JNQVRURVIsICZidWYsIHNpemVvZihidWYpKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWlmIChidWYgPT0gMCkgewotCQkvKiBhdXRvIG1vZGUgb2ZmLCBxdWVyeSBjdXJyZW50IHByZXNldCB2YWx1ZSAqLwotCQlyZXQgPSByZWN2X2NvbnRyb2xfbXNnKHBkZXYsCi0JCQlHRVRfTFVNX0NUTCwgUFJFU0VUX0NPTlRPVVJfRk9STUFUVEVSLAotCQkJJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiByZXQ7Ci0JCSpjb250b3VyID0gYnVmIDw8IDEwOwotCX0KLQllbHNlCi0JCSpjb250b3VyID0gLTE7Ci0JcmV0dXJuIDA7Ci19Ci0KLQotaW50IHB3Y19zZXRfYmFja2xpZ2h0KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgYmFja2xpZ2h0KQotewotCXVuc2lnbmVkIGNoYXIgYnVmOwotCi0JaWYgKGJhY2tsaWdodCkKLQkJYnVmID0gMHhmZjsKLQllbHNlCi0JCWJ1ZiA9IDB4MDsKLQlyZXR1cm4gc2VuZF9jb250cm9sX21zZyhwZGV2LAotCQlTRVRfTFVNX0NUTCwgQkFDS19MSUdIVF9DT01QRU5TQVRJT05fRk9STUFUVEVSLAotCQkmYnVmLCBzaXplb2YoYnVmKSk7Ci19Ci0KLWludCBwd2NfZ2V0X2JhY2tsaWdodChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpiYWNrbGlnaHQpCi17Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBjaGFyIGJ1ZjsKLQotCXJldCA9IHJlY3ZfY29udHJvbF9tc2cocGRldiwKLQkJR0VUX0xVTV9DVEwsIEJBQ0tfTElHSFRfQ09NUEVOU0FUSU9OX0ZPUk1BVFRFUiwKLQkJJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCSpiYWNrbGlnaHQgPSAhIWJ1ZjsKLQlyZXR1cm4gMDsKLX0KLQotaW50IHB3Y19zZXRfY29sb3VyX21vZGUoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBjb2xvdXIpCi17Ci0JdW5zaWduZWQgY2hhciBidWY7Ci0KLQlpZiAoY29sb3VyKQotCQlidWYgPSAweGZmOwotCWVsc2UKLQkJYnVmID0gMHgwOwotCXJldHVybiBzZW5kX2NvbnRyb2xfbXNnKHBkZXYsCi0JCVNFVF9DSFJPTV9DVEwsIENPTE9VUl9NT0RFX0ZPUk1BVFRFUiwgJmJ1Ziwgc2l6ZW9mKGJ1ZikpOwotfQotCi1pbnQgcHdjX2dldF9jb2xvdXJfbW9kZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpjb2xvdXIpCi17Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBjaGFyIGJ1ZjsKLQotCXJldCA9IHJlY3ZfY29udHJvbF9tc2cocGRldiwKLQkJR0VUX0NIUk9NX0NUTCwgQ09MT1VSX01PREVfRk9STUFUVEVSLCAmYnVmLCBzaXplb2YoYnVmKSk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0JKmNvbG91ciA9ICEhYnVmOwotCXJldHVybiAwOwotfQotCi0KLWludCBwd2Nfc2V0X2ZsaWNrZXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBmbGlja2VyKQotewotCXVuc2lnbmVkIGNoYXIgYnVmOwotCi0JaWYgKGZsaWNrZXIpCi0JCWJ1ZiA9IDB4ZmY7Ci0JZWxzZQotCQlidWYgPSAweDA7Ci0JcmV0dXJuIHNlbmRfY29udHJvbF9tc2cocGRldiwKLQkJU0VUX0xVTV9DVEwsIEZMSUNLRVJMRVNTX01PREVfRk9STUFUVEVSLCAmYnVmLCBzaXplb2YoYnVmKSk7Ci19Ci0KLWludCBwd2NfZ2V0X2ZsaWNrZXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqZmxpY2tlcikKLXsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGNoYXIgYnVmOwotCi0JcmV0ID0gcmVjdl9jb250cm9sX21zZyhwZGV2LAotCQlHRVRfTFVNX0NUTCwgRkxJQ0tFUkxFU1NfTU9ERV9GT1JNQVRURVIsICZidWYsIHNpemVvZihidWYpKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQkqZmxpY2tlciA9ICEhYnVmOwotCXJldHVybiAwOwotfQotCi1pbnQgcHdjX3NldF9keW5hbWljX25vaXNlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgbm9pc2UpCi17Ci0JdW5zaWduZWQgY2hhciBidWY7Ci0KLQlpZiAobm9pc2UgPCAwKQotCQlub2lzZSA9IDA7Ci0JaWYgKG5vaXNlID4gMykKLQkJbm9pc2UgPSAzOwotCWJ1ZiA9IG5vaXNlOwotCXJldHVybiBzZW5kX2NvbnRyb2xfbXNnKHBkZXYsCi0JCVNFVF9MVU1fQ1RMLCBEWU5BTUlDX05PSVNFX0NPTlRST0xfRk9STUFUVEVSLAotCQkmYnVmLCBzaXplb2YoYnVmKSk7Ci19Ci0KLWludCBwd2NfZ2V0X2R5bmFtaWNfbm9pc2Uoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqbm9pc2UpCi17Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBjaGFyIGJ1ZjsKLQotCXJldCA9IHJlY3ZfY29udHJvbF9tc2cocGRldiwKLQkJR0VUX0xVTV9DVEwsIERZTkFNSUNfTk9JU0VfQ09OVFJPTF9GT1JNQVRURVIsCi0JCSZidWYsIHNpemVvZihidWYpKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQkqbm9pc2UgPSBidWY7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgX3B3Y19tcHRfcmVzZXQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBmbGFncykKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1ZjsKQEAgLTEzMDksNyArNzc3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotCisjaWZkZWYgQ09ORklHX1VTQl9QV0NfREVCVUcKIGludCBwd2NfZ2V0X2Ntb3Nfc2Vuc29yKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnNlbnNvcikKIHsKIAl1bnNpZ25lZCBjaGFyIGJ1ZjsKQEAgLTEzMzIsNyArODAwLDcgQEAKIAkJKnNlbnNvciA9IGJ1ZjsKIAlyZXR1cm4gMDsKIH0KLQorI2VuZGlmCiAKICAvKiBFbmQgb2YgQWRkLU9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwpAQCAtMTM1NiwzNyArODI0LDQxIEBACiAvKiBjb3B5IGxvY2FsIHZhcmlhYmxlIHRvIGFyZyAqLwogI2RlZmluZSBBUkdfT1VUKEFSR19uYW1lKSAvKiBub3RoaW5nICovCiAKKy8qCisgKiBPdXIgY3RybHMgdXNlIG5hdGl2ZSB2YWx1ZXMsIGJ1dCB0aGUgb2xkIGN1c3RvbSBwd2MgaW9jdGwgaW50ZXJmYWNlIGV4cGVjdHMKKyAqIHZhbHVlcyBmcm9tIDAgLSA2NTUzNSwgZGVmaW5lIDIgaGVscGVyIGZ1bmN0aW9ucyB0byBzY2FsZSB0aGluZ3MuICovCitzdGF0aWMgaW50IHB3Y19pb2N0bF9nX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKK3sKKwlyZXR1cm4gdjRsMl9jdHJsX2dfY3RybChjdHJsKSAqIDY1NTM1IC8gY3RybC0+bWF4aW11bTsKK30KKworc3RhdGljIGludCBwd2NfaW9jdGxfc19jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwsIGludCB2YWwpCit7CisJcmV0dXJuIHY0bDJfY3RybF9zX2N0cmwoY3RybCwgdmFsICogY3RybC0+bWF4aW11bSAvIDY1NTM1KTsKK30KKwogbG9uZyBwd2NfaW9jdGwoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZykKIHsKIAlsb25nIHJldCA9IDA7CiAKIAlzd2l0Y2goY21kKSB7CiAJY2FzZSBWSURJT0NQV0NSVVNFUjoKLQl7Ci0JCWlmIChwd2NfcmVzdG9yZV91c2VyKHBkZXYpKQotCQkJcmV0ID0gLUVJTlZBTDsKKwkJcmV0ID0gcHdjX2J1dHRvbl9jdHJsKHBkZXYsIFJFU1RPUkVfVVNFUl9ERUZBVUxUU19GT1JNQVRURVIpOwogCQlicmVhazsKLQl9CiAKIAljYXNlIFZJRElPQ1BXQ1NVU0VSOgotCXsKLQkJaWYgKHB3Y19zYXZlX3VzZXIocGRldikpCi0JCQlyZXQgPSAtRUlOVkFMOworCQlyZXQgPSBwd2NfYnV0dG9uX2N0cmwocGRldiwgU0FWRV9VU0VSX0RFRkFVTFRTX0ZPUk1BVFRFUik7CiAJCWJyZWFrOwotCX0KIAogCWNhc2UgVklESU9DUFdDRkFDVE9SWToKLQl7Ci0JCWlmIChwd2NfcmVzdG9yZV9mYWN0b3J5KHBkZXYpKQotCQkJcmV0ID0gLUVJTlZBTDsKKwkJcmV0ID0gcHdjX2J1dHRvbl9jdHJsKHBkZXYsIFJFU1RPUkVfRkFDVE9SWV9ERUZBVUxUU19GT1JNQVRURVIpOwogCQlicmVhazsKLQl9CiAKIAljYXNlIFZJRElPQ1BXQ1NDUVVBTDoKIAl7CiAJCUFSR19ERUYoaW50LCBxdWFsKQogCi0JCWlmIChwZGV2LT5pc29faW5pdCkgeworCQlpZiAodmIyX2lzX3N0cmVhbWluZygmcGRldi0+dmJfcXVldWUpKSB7CiAJCQlyZXQgPSAtRUJVU1k7CiAJCQlicmVhazsKIAkJfQpAQCAtMTM5Niw4ICs4NjgsNiBAQAogCQkJcmV0ID0gLUVJTlZBTDsKIAkJZWxzZQogCQkJcmV0ID0gcHdjX3NldF92aWRlb19tb2RlKHBkZXYsIHBkZXYtPnZpZXcueCwgcGRldi0+dmlldy55LCBwZGV2LT52ZnJhbWVzLCBBUkdSKHF1YWwpLCBwZGV2LT52c25hcHNob3QpOwotCQlpZiAocmV0ID49IDApCi0JCQlwZGV2LT52Y29tcHJlc3Npb24gPSBBUkdSKHF1YWwpOwogCQlicmVhazsKIAl9CiAKQEAgLTE0MzIsNzEgKzkwMiw1OSBAQAogCWNhc2UgVklESU9DUFdDU0FHQzoKIAl7CiAJCUFSR19ERUYoaW50LCBhZ2MpCi0KIAkJQVJHX0lOKGFnYykKLQkJaWYgKHB3Y19zZXRfYWdjKHBkZXYsIEFSR1IoYWdjKSA8IDAgPyAxIDogMCwgQVJHUihhZ2MpKSkKLQkJCXJldCA9IC1FSU5WQUw7CisJCXJldCA9IHY0bDJfY3RybF9zX2N0cmwocGRldi0+YXV0b2dhaW4sIEFSR1IoYWdjKSA8IDApOworCQlpZiAocmV0ID09IDAgJiYgQVJHUihhZ2MpID49IDApCisJCQlyZXQgPSBwd2NfaW9jdGxfc19jdHJsKHBkZXYtPmdhaW4sIEFSR1IoYWdjKSk7CiAJCWJyZWFrOwogCX0KIAogCWNhc2UgVklESU9DUFdDR0FHQzoKIAl7CiAJCUFSR19ERUYoaW50LCBhZ2MpCi0KLQkJaWYgKHB3Y19nZXRfYWdjKHBkZXYsIEFSR0EoYWdjKSkpCi0JCQlyZXQgPSAtRUlOVkFMOworCQlpZiAodjRsMl9jdHJsX2dfY3RybChwZGV2LT5hdXRvZ2FpbikpCisJCQlBUkdSKGFnYykgPSAtMTsKKwkJZWxzZQorCQkJQVJHUihhZ2MpID0gcHdjX2lvY3RsX2dfY3RybChwZGV2LT5nYWluKTsKIAkJQVJHX09VVChhZ2MpCiAJCWJyZWFrOwogCX0KIAogCWNhc2UgVklESU9DUFdDU1NIVVRURVI6CiAJewotCQlBUkdfREVGKGludCwgc2h1dHRlcl9zcGVlZCkKLQotCQlBUkdfSU4oc2h1dHRlcl9zcGVlZCkKLQkJcmV0ID0gcHdjX3NldF9zaHV0dGVyX3NwZWVkKHBkZXYsIEFSR1Ioc2h1dHRlcl9zcGVlZCkgPCAwID8gMSA6IDAsIEFSR1Ioc2h1dHRlcl9zcGVlZCkpOworCQlBUkdfREVGKGludCwgc2h1dHRlcikKKwkJQVJHX0lOKHNodXR0ZXIpCisJCXJldCA9IHY0bDJfY3RybF9zX2N0cmwocGRldi0+ZXhwb3N1cmVfYXV0bywKKwkJCQkgICAgICAgLyogTWVudSBpZHggMCA9IGF1dG8sIGlkeCAxID0gbWFudWFsICovCisJCQkJICAgICAgIEFSR1Ioc2h1dHRlcikgPj0gMCk7CisJCWlmIChyZXQgPT0gMCAmJiBBUkdSKHNodXR0ZXIpID49IDApCisJCQlyZXQgPSBwd2NfaW9jdGxfc19jdHJsKHBkZXYtPmV4cG9zdXJlLCBBUkdSKHNodXR0ZXIpKTsKIAkJYnJlYWs7CiAJfQogCiAJY2FzZSBWSURJT0NQV0NTQVdCOgogCXsKIAkJQVJHX0RFRihzdHJ1Y3QgcHdjX3doaXRlYmFsYW5jZSwgd2IpCi0KIAkJQVJHX0lOKHdiKQotCQlyZXQgPSBwd2Nfc2V0X2F3YihwZGV2LCBBUkdSKHdiKS5tb2RlKTsKLQkJaWYgKHJldCA+PSAwICYmIEFSR1Iod2IpLm1vZGUgPT0gUFdDX1dCX01BTlVBTCkgewotCQkJcHdjX3NldF9yZWRfZ2FpbihwZGV2LCBBUkdSKHdiKS5tYW51YWxfcmVkKTsKLQkJCXB3Y19zZXRfYmx1ZV9nYWluKHBkZXYsIEFSR1Iod2IpLm1hbnVhbF9ibHVlKTsKLQkJfQorCQlyZXQgPSB2NGwyX2N0cmxfc19jdHJsKHBkZXYtPmF1dG9fd2hpdGVfYmFsYW5jZSwKKwkJCQkgICAgICAgQVJHUih3YikubW9kZSk7CisJCWlmIChyZXQgPT0gMCAmJiBBUkdSKHdiKS5tb2RlID09IFBXQ19XQl9NQU5VQUwpCisJCQlyZXQgPSBwd2NfaW9jdGxfc19jdHJsKHBkZXYtPnJlZF9iYWxhbmNlLAorCQkJCQkgICAgICAgQVJHUih3YikubWFudWFsX3JlZCk7CisJCWlmIChyZXQgPT0gMCAmJiBBUkdSKHdiKS5tb2RlID09IFBXQ19XQl9NQU5VQUwpCisJCQlyZXQgPSBwd2NfaW9jdGxfc19jdHJsKHBkZXYtPmJsdWVfYmFsYW5jZSwKKwkJCQkJICAgICAgIEFSR1Iod2IpLm1hbnVhbF9ibHVlKTsKIAkJYnJlYWs7CiAJfQogCiAJY2FzZSBWSURJT0NQV0NHQVdCOgogCXsKIAkJQVJHX0RFRihzdHJ1Y3QgcHdjX3doaXRlYmFsYW5jZSwgd2IpCi0KLQkJbWVtc2V0KEFSR0Eod2IpLCAwLCBzaXplb2Yoc3RydWN0IHB3Y193aGl0ZWJhbGFuY2UpKTsKLQkJQVJHUih3YikubW9kZSA9IHB3Y19nZXRfYXdiKHBkZXYpOwotCQlpZiAoQVJHUih3YikubW9kZSA8IDApCi0JCQlyZXQgPSAtRUlOVkFMOwotCQllbHNlIHsKLQkJCWlmIChBUkdSKHdiKS5tb2RlID09IFBXQ19XQl9NQU5VQUwpIHsKLQkJCQlyZXQgPSBwd2NfZ2V0X3JlZF9nYWluKHBkZXYsICZBUkdSKHdiKS5tYW51YWxfcmVkKTsKLQkJCQlpZiAocmV0IDwgMCkKLQkJCQkJYnJlYWs7Ci0JCQkJcmV0ID0gcHdjX2dldF9ibHVlX2dhaW4ocGRldiwgJkFSR1Iod2IpLm1hbnVhbF9ibHVlKTsKLQkJCQlpZiAocmV0IDwgMCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoQVJHUih3YikubW9kZSA9PSBQV0NfV0JfQVVUTykgewotCQkJCXJldCA9IHB3Y19yZWFkX3JlZF9nYWluKHBkZXYsICZBUkdSKHdiKS5yZWFkX3JlZCk7Ci0JCQkJaWYgKHJldCA8IDApCi0JCQkJCWJyZWFrOwotCQkJCXJldCA9IHB3Y19yZWFkX2JsdWVfZ2FpbihwZGV2LCAmQVJHUih3YikucmVhZF9ibHVlKTsKLQkJCQlpZiAocmV0IDwgMCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KKwkJQVJHUih3YikubW9kZSA9IHY0bDJfY3RybF9nX2N0cmwocGRldi0+YXV0b193aGl0ZV9iYWxhbmNlKTsKKwkJQVJHUih3YikubWFudWFsX3JlZCA9IEFSR1Iod2IpLnJlYWRfcmVkID0KKwkJCXB3Y19pb2N0bF9nX2N0cmwocGRldi0+cmVkX2JhbGFuY2UpOworCQlBUkdSKHdiKS5tYW51YWxfYmx1ZSA9IEFSR1Iod2IpLnJlYWRfYmx1ZSA9CisJCQlwd2NfaW9jdGxfZ19jdHJsKHBkZXYtPmJsdWVfYmFsYW5jZSk7CiAJCUFSR19PVVQod2IpCiAJCWJyZWFrOwogCX0KQEAgLTE1NTAsMTcgKzEwMDgsMjAgQEAKIAljYXNlIFZJRElPQ1BXQ1NDT05UT1VSOgogCXsKIAkJQVJHX0RFRihpbnQsIGNvbnRvdXIpCi0KIAkJQVJHX0lOKGNvbnRvdXIpCi0JCXJldCA9IHB3Y19zZXRfY29udG91cihwZGV2LCBBUkdSKGNvbnRvdXIpKTsKKwkJcmV0ID0gdjRsMl9jdHJsX3NfY3RybChwZGV2LT5hdXRvY29udG91ciwgQVJHUihjb250b3VyKSA8IDApOworCQlpZiAocmV0ID09IDAgJiYgQVJHUihjb250b3VyKSA+PSAwKQorCQkJcmV0ID0gcHdjX2lvY3RsX3NfY3RybChwZGV2LT5jb250b3VyLCBBUkdSKGNvbnRvdXIpKTsKIAkJYnJlYWs7CiAJfQogCiAJY2FzZSBWSURJT0NQV0NHQ09OVE9VUjoKIAl7CiAJCUFSR19ERUYoaW50LCBjb250b3VyKQotCi0JCXJldCA9IHB3Y19nZXRfY29udG91cihwZGV2LCBBUkdBKGNvbnRvdXIpKTsKKwkJaWYgKHY0bDJfY3RybF9nX2N0cmwocGRldi0+YXV0b2NvbnRvdXIpKQorCQkJQVJHUihjb250b3VyKSA9IC0xOworCQllbHNlCisJCQlBUkdSKGNvbnRvdXIpID0gcHdjX2lvY3RsX2dfY3RybChwZGV2LT5jb250b3VyKTsKIAkJQVJHX09VVChjb250b3VyKQogCQlicmVhazsKIAl9CkBAIC0xNTY4LDE3ICsxMDI5LDE1IEBACiAJY2FzZSBWSURJT0NQV0NTQkFDS0xJR0hUOgogCXsKIAkJQVJHX0RFRihpbnQsIGJhY2tsaWdodCkKLQogCQlBUkdfSU4oYmFja2xpZ2h0KQotCQlyZXQgPSBwd2Nfc2V0X2JhY2tsaWdodChwZGV2LCBBUkdSKGJhY2tsaWdodCkpOworCQlyZXQgPSB2NGwyX2N0cmxfc19jdHJsKHBkZXYtPmJhY2tsaWdodCwgQVJHUihiYWNrbGlnaHQpKTsKIAkJYnJlYWs7CiAJfQogCiAJY2FzZSBWSURJT0NQV0NHQkFDS0xJR0hUOgogCXsKIAkJQVJHX0RFRihpbnQsIGJhY2tsaWdodCkKLQotCQlyZXQgPSBwd2NfZ2V0X2JhY2tsaWdodChwZGV2LCBBUkdBKGJhY2tsaWdodCkpOworCQlBUkdSKGJhY2tsaWdodCkgPSB2NGwyX2N0cmxfZ19jdHJsKHBkZXYtPmJhY2tsaWdodCk7CiAJCUFSR19PVVQoYmFja2xpZ2h0KQogCQlicmVhazsKIAl9CkBAIC0xNTg2LDE3ICsxMDQ1LDE1IEBACiAJY2FzZSBWSURJT0NQV0NTRkxJQ0tFUjoKIAl7CiAJCUFSR19ERUYoaW50LCBmbGlja2VyKQotCiAJCUFSR19JTihmbGlja2VyKQotCQlyZXQgPSBwd2Nfc2V0X2ZsaWNrZXIocGRldiwgQVJHUihmbGlja2VyKSk7CisJCXJldCA9IHY0bDJfY3RybF9zX2N0cmwocGRldi0+ZmxpY2tlciwgQVJHUihmbGlja2VyKSk7CiAJCWJyZWFrOwogCX0KIAogCWNhc2UgVklESU9DUFdDR0ZMSUNLRVI6CiAJewogCQlBUkdfREVGKGludCwgZmxpY2tlcikKLQotCQlyZXQgPSBwd2NfZ2V0X2ZsaWNrZXIocGRldiwgQVJHQShmbGlja2VyKSk7CisJCUFSR1IoZmxpY2tlcikgPSB2NGwyX2N0cmxfZ19jdHJsKHBkZXYtPmZsaWNrZXIpOwogCQlBUkdfT1VUKGZsaWNrZXIpCiAJCWJyZWFrOwogCX0KQEAgLTE2MDQsMTcgKzEwNjEsMTUgQEAKIAljYXNlIFZJRElPQ1BXQ1NEWU5OT0lTRToKIAl7CiAJCUFSR19ERUYoaW50LCBkeW5ub2lzZSkKLQogCQlBUkdfSU4oZHlubm9pc2UpCi0JCXJldCA9IHB3Y19zZXRfZHluYW1pY19ub2lzZShwZGV2LCBBUkdSKGR5bm5vaXNlKSk7CisJCXJldCA9IHY0bDJfY3RybF9zX2N0cmwocGRldi0+bm9pc2VfcmVkdWN0aW9uLCBBUkdSKGR5bm5vaXNlKSk7CiAJCWJyZWFrOwogCX0KIAogCWNhc2UgVklESU9DUFdDR0RZTk5PSVNFOgogCXsKIAkJQVJHX0RFRihpbnQsIGR5bm5vaXNlKQotCi0JCXJldCA9IHB3Y19nZXRfZHluYW1pY19ub2lzZShwZGV2LCBBUkdBKGR5bm5vaXNlKSk7CisJCUFSR1IoZHlubm9pc2UpID0gdjRsMl9jdHJsX2dfY3RybChwZGV2LT5ub2lzZV9yZWR1Y3Rpb24pOwogCQlBUkdfT1VUKGR5bm5vaXNlKTsKIAkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWRlYzEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1kZWMxLmMKaW5kZXggYzI5NTkzZi4uYmUwZTAyYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWRlYzEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtZGVjMS5jCkBAIC0yMiwyOSArMjIsMTkgQEAKICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwotCi0KLQogI2luY2x1ZGUgInB3Yy1kZWMxLmgiCiAKLQotdm9pZCBwd2NfZGVjMV9pbml0KGludCB0eXBlLCBpbnQgcmVsZWFzZSwgdm9pZCAqYnVmZmVyLCB2b2lkICp0YWJsZSkKK2ludCBwd2NfZGVjMV9pbml0KHN0cnVjdCBwd2NfZGV2aWNlICpwd2MsIGludCB0eXBlLCBpbnQgcmVsZWFzZSwgdm9pZCAqYnVmZmVyKQogeworCXN0cnVjdCBwd2NfZGVjMV9wcml2YXRlICpwZGVjOwogCi19CisJaWYgKHB3Yy0+ZGVjb21wcmVzc19kYXRhID09IE5VTEwpIHsKKwkJcGRlYyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwd2NfZGVjMV9wcml2YXRlKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChwZGVjID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJcHdjLT5kZWNvbXByZXNzX2RhdGEgPSBwZGVjOworCX0KKwlwZGVjID0gcHdjLT5kZWNvbXByZXNzX2RhdGE7CiAKLXZvaWQgcHdjX2RlYzFfZXhpdCh2b2lkKQotewotCi0KLQotfQotCi1pbnQgcHdjX2RlYzFfYWxsb2Moc3RydWN0IHB3Y19kZXZpY2UgKnB3YykKLXsKLQlwd2MtPmRlY29tcHJlc3NfZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwd2NfZGVjMV9wcml2YXRlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHB3Yy0+ZGVjb21wcmVzc19kYXRhID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwogCXJldHVybiAwOwogfQotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtZGVjMS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWRlYzEuaAppbmRleCA4YjYyZGRjLi5hNTdkODYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtZGVjMS5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1kZWMxLmgKQEAgLTIyLDggKzIyLDYgQEAKICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCiAKLQotCiAjaWZuZGVmIFBXQ19ERUMxX0gKICNkZWZpbmUgUFdDX0RFQzFfSAogCkBAIC0zMiwxMiArMzAsOCBAQAogc3RydWN0IHB3Y19kZWMxX3ByaXZhdGUKIHsKIAlpbnQgdmVyc2lvbjsKLQogfTsKIAotaW50ICBwd2NfZGVjMV9hbGxvYyhzdHJ1Y3QgcHdjX2RldmljZSAqcHdjKTsKLXZvaWQgcHdjX2RlYzFfaW5pdChpbnQgdHlwZSwgaW50IHJlbGVhc2UsIHZvaWQgKmJ1ZmZlciwgdm9pZCAqcHJpdmF0ZV9kYXRhKTsKLXZvaWQgcHdjX2RlYzFfZXhpdCh2b2lkKTsKK2ludCBwd2NfZGVjMV9pbml0KHN0cnVjdCBwd2NfZGV2aWNlICpwd2MsIGludCB0eXBlLCBpbnQgcmVsZWFzZSwgdm9pZCAqYnVmZmVyKTsKIAogI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1kZWMyMy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWRlYzIzLmMKaW5kZXggMGM4MDFiOC4uMDZhNGU4NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWRlYzIzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWRlYzIzLmMKQEAgLTkxNiwyNyArOTE2LDUgQEAKIAkJCXBvdXRfcGxhbmFyX3YgKz0gcHdjLT52aWV3Lng7CiAKIAkJfQotCiAJfQotCiB9Ci0KLXZvaWQgcHdjX2RlYzIzX2V4aXQodm9pZCkKLXsKLQkvKiBEbyBub3RoaW5nICovCi0KLX0KLQotLyoqCi0gKiBBbGxvY2F0ZSBhIHByaXZhdGUgc3RydWN0dXJlIHVzZWQgYnkgbG9va3VwIHRhYmxlLgotICogWW91IG11c3QgY2FsbCBrZnJlZSgpIHRvIGZyZWUgdGhlIG1lbW9yeSBhbGxvY2F0ZWQuCi0gKi8KLWludCBwd2NfZGVjMjNfYWxsb2Moc3RydWN0IHB3Y19kZXZpY2UgKnB3YykKLXsKLQlwd2MtPmRlY29tcHJlc3NfZGF0YSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBwd2NfZGVjMjNfcHJpdmF0ZSksIEdGUF9LRVJORUwpOwotCWlmIChwd2MtPmRlY29tcHJlc3NfZGF0YSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQlyZXR1cm4gMDsKLX0KLQotLyogdmltOiBzZXQgY2lubz0gZm9ybWF0b3B0aW9ucz1jcm9xbCBjaW5kZW50IHNoaWZ0d2lkdGg9OCB0YWJzdG9wPTg6ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtZGVjMjMuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1kZWMyMy5oCmluZGV4IDFjNTUyOTguLmEwYWM0ZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1kZWMyMy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1kZWMyMy5oCkBAIC00OSwxOSArNDksOSBAQAogCiB9OwogCi0KLWludCBwd2NfZGVjMjNfYWxsb2Moc3RydWN0IHB3Y19kZXZpY2UgKnB3Yyk7CiBpbnQgcHdjX2RlYzIzX2luaXQoc3RydWN0IHB3Y19kZXZpY2UgKnB3YywgaW50IHR5cGUsIHVuc2lnbmVkIGNoYXIgKmNtZCk7Ci12b2lkIHB3Y19kZWMyM19leGl0KHZvaWQpOwogdm9pZCBwd2NfZGVjMjNfZGVjb21wcmVzcyhjb25zdCBzdHJ1Y3QgcHdjX2RldmljZSAqcHdjLAogCQkJICBjb25zdCB2b2lkICpzcmMsCiAJCQkgIHZvaWQgKmRzdCwKIAkJCSAgaW50IGZsYWdzKTsKLQotCi0KICNlbmRpZgotCi0KLS8qIHZpbTogc2V0IGNpbm89IGZvcm1hdG9wdGlvbnM9Y3JvcWwgY2luZGVudCBzaGlmdHdpZHRoPTggdGFic3RvcD04OiAqLwotCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaWYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1pZi5jCmluZGV4IGIwYmRlNWEuLjUxY2EzNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1pZi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1pZi5jCkBAIC0yLDYgKzIsNyBAQAogICAgVVNCIGFuZCBWaWRlbzRMaW51eCBpbnRlcmZhY2UgcGFydC4KICAgIChDKSAxOTk5LTIwMDQgTmVtb3NvZnQgVW52LgogICAgKEMpIDIwMDQtMjAwNiBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCisgICAoQykgMjAxMSBIYW5zIGRlIEdvZWRlIDxoZGVnb2VkZUByZWRoYXQuY29tPgogCiAgICBOT1RFOiB0aGlzIHZlcnNpb24gb2YgcHdjIGlzIGFuIHVub2ZmaWNpYWwgKG1vZGlmaWVkKSByZWxlYXNlIG9mIHB3YyAmIHBjd3gKICAgIGRyaXZlciBhbmQgdGh1cyBtYXkgaGF2ZSBidWdzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoZSBvcmlnaW5hbCB2ZXJzaW9uLgpAQCAtNzQsNyArNzUsNiBAQAogI2luY2x1ZGUgInB3Yy10aW1vbi5oIgogI2luY2x1ZGUgInB3Yy1kZWMyMy5oIgogI2luY2x1ZGUgInB3Yy1kZWMxLmgiCi0jaW5jbHVkZSAicHdjLXVuY29tcHJlc3MuaCIKIAogLyogRnVuY3Rpb24gcHJvdG90eXBlcyBhbmQgZHJpdmVyIHRlbXBsYXRlcyAqLwogCkBAIC0xMTYsNiArMTE2LDcgQEAKIAogc3RhdGljIGludCB1c2JfcHdjX3Byb2JlKHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAqaWQpOwogc3RhdGljIHZvaWQgdXNiX3B3Y19kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKTsKK3N0YXRpYyB2b2lkIHB3Y19pc29jX2NsZWFudXAoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpOwogCiBzdGF0aWMgc3RydWN0IHVzYl9kcml2ZXIgcHdjX2RyaXZlciA9IHsKIAkubmFtZSA9CQkJIlBoaWxpcHMgd2ViY2FtIiwJLyogbmFtZSAqLwpAQCAtMTI3LDE0ICsxMjgsMTEgQEAKICNkZWZpbmUgTUFYX0RFVl9ISU5UUwkyMAogI2RlZmluZSBNQVhfSVNPQ19FUlJPUlMJMjAKIAotc3RhdGljIGludCBkZWZhdWx0X3NpemUgPSBQU1pfUUNJRjsKIHN0YXRpYyBpbnQgZGVmYXVsdF9mcHMgPSAxMDsKLXN0YXRpYyBpbnQgZGVmYXVsdF9mYnVmcyA9IDM7ICAgLyogRGVmYXVsdCBudW1iZXIgb2YgZnJhbWUgYnVmZmVycyAqLwotCWludCBwd2NfbWJ1ZnMgPSAyOwkvKiBEZWZhdWx0IG51bWJlciBvZiBtbWFwKCkgYnVmZmVycyAqLwogI2lmZGVmIENPTkZJR19VU0JfUFdDX0RFQlVHCiAJaW50IHB3Y190cmFjZSA9IFBXQ19ERUJVR19MRVZFTDsKICNlbmRpZgotc3RhdGljIGludCBwb3dlcl9zYXZlOworc3RhdGljIGludCBwb3dlcl9zYXZlID0gLTE7CiBzdGF0aWMgaW50IGxlZF9vbiA9IDEwMCwgbGVkX29mZjsgLyogZGVmYXVsdHMgdG8gTEVEIHRoYXQgaXMgb24gd2hpbGUgaW4gdXNlICovCiBzdGF0aWMgaW50IHB3Y19wcmVmZXJyZWRfY29tcHJlc3Npb24gPSAxOyAvKiAwLi4zID0gdW5jb21wcmVzc2VkLi5oaWdoICovCiBzdGF0aWMgc3RydWN0IHsKQEAgLTE3MywzODkgKzE3MSwyMCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIFByaXZhdGUgZnVuY3Rpb25zICovCiAKLS8qIEhlcmUgd2Ugd2FudCB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgbWVtb3J5LgotICogVGhpcyBpcyB1c2VkIHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBjb250ZW50cyBvZiB0aGUgYXJlYS4KLSAqLwotCi0KLQotc3RhdGljIHZvaWQgKnB3Y19ydm1hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUpCitzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiAqcHdjX2dldF9uZXh0X2ZpbGxfYnVmKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQogewotCXZvaWQgKiBtZW07Ci0JdW5zaWduZWQgbG9uZyBhZHI7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJc3RydWN0IHB3Y19mcmFtZV9idWYgKmJ1ZiA9IE5VTEw7CiAKLQltZW09dm1hbGxvY18zMihzaXplKTsKLQlpZiAoIW1lbSkKLQkJcmV0dXJuIE5VTEw7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBkZXYtPnF1ZXVlZF9idWZzX2xvY2ssIGZsYWdzKTsKKwlpZiAobGlzdF9lbXB0eSgmcGRldi0+cXVldWVkX2J1ZnMpKQorCQlnb3RvIGxlYXZlOwogCi0JbWVtc2V0KG1lbSwgMCwgc2l6ZSk7IC8qIENsZWFyIHRoZSByYW0gb3V0LCBubyBqdW5rIHRvIHRoZSB1c2VyICovCi0JYWRyPSh1bnNpZ25lZCBsb25nKSBtZW07Ci0Jd2hpbGUgKHNpemUgPiAwKQotCSB7Ci0JICAgU2V0UGFnZVJlc2VydmVkKHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKWFkcikpOwotCSAgIGFkciAgKz0gUEFHRV9TSVpFOwotCSAgIHNpemUgLT0gUEFHRV9TSVpFOwotCSB9Ci0JcmV0dXJuIG1lbTsKLX0KLQotc3RhdGljIHZvaWQgcHdjX3J2ZnJlZSh2b2lkICogbWVtLCB1bnNpZ25lZCBsb25nIHNpemUpCi17Ci0JdW5zaWduZWQgbG9uZyBhZHI7Ci0KLQlpZiAoIW1lbSkKLQkJcmV0dXJuOwotCi0JYWRyPSh1bnNpZ25lZCBsb25nKSBtZW07Ci0Jd2hpbGUgKChsb25nKSBzaXplID4gMCkKLQkgewotCSAgIENsZWFyUGFnZVJlc2VydmVkKHZtYWxsb2NfdG9fcGFnZSgodm9pZCAqKWFkcikpOwotCSAgIGFkciAgKz0gUEFHRV9TSVpFOwotCSAgIHNpemUgLT0gUEFHRV9TSVpFOwotCSB9Ci0JdmZyZWUobWVtKTsKLX0KLQotCi0KLQotc3RhdGljIGludCBwd2NfYWxsb2NhdGVfYnVmZmVycyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKLXsKLQlpbnQgaSwgZXJyOwotCXZvaWQgKmtidWY7Ci0KLQlQV0NfREVCVUdfTUVNT1JZKCI+PiBwd2NfYWxsb2NhdGVfYnVmZmVycyhwZGV2ID0gMHglcClcbiIsIHBkZXYpOwotCi0JaWYgKHBkZXYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTlhJTzsKLQotCS8qIEFsbG9jYXRlIElzb2Nocm9udW91cyBwaXBlIGJ1ZmZlcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0lTT19CVUZTOyBpKyspIHsKLQkJaWYgKHBkZXYtPnNidWZbaV0uZGF0YSA9PSBOVUxMKSB7Ci0JCQlrYnVmID0ga3phbGxvYyhJU09fQlVGRkVSX1NJWkUsIEdGUF9LRVJORUwpOwotCQkJaWYgKGtidWYgPT0gTlVMTCkgewotCQkJCVBXQ19FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIGlzbyBidWZmZXIgJWQuXG4iLCBpKTsKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCX0KLQkJCVBXQ19ERUJVR19NRU1PUlkoIkFsbG9jYXRlZCBpc28gYnVmZmVyIGF0ICVwLlxuIiwga2J1Zik7Ci0JCQlwZGV2LT5zYnVmW2ldLmRhdGEgPSBrYnVmOwotCQl9Ci0JfQotCi0JLyogQWxsb2NhdGUgZnJhbWUgYnVmZmVyIHN0cnVjdHVyZSAqLwotCWlmIChwZGV2LT5mYnVmID09IE5VTEwpIHsKLQkJa2J1ZiA9IGt6YWxsb2MoZGVmYXVsdF9mYnVmcyAqIHNpemVvZihzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiksIEdGUF9LRVJORUwpOwotCQlpZiAoa2J1ZiA9PSBOVUxMKSB7Ci0JCQlQV0NfRVJST1IoIkZhaWxlZCB0byBhbGxvY2F0ZSBmcmFtZSBidWZmZXIgc3RydWN0dXJlLlxuIik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCQlQV0NfREVCVUdfTUVNT1JZKCJBbGxvY2F0ZWQgZnJhbWUgYnVmZmVyIHN0cnVjdHVyZSBhdCAlcC5cbiIsIGtidWYpOwotCQlwZGV2LT5mYnVmID0ga2J1ZjsKLQl9Ci0KLQkvKiBjcmVhdGUgZnJhbWUgYnVmZmVycywgYW5kIG1ha2UgY2lyY3VsYXIgcmluZyAqLwotCWZvciAoaSA9IDA7IGkgPCBkZWZhdWx0X2ZidWZzOyBpKyspIHsKLQkJaWYgKHBkZXYtPmZidWZbaV0uZGF0YSA9PSBOVUxMKSB7Ci0JCQlrYnVmID0gdnphbGxvYyhQV0NfRlJBTUVfU0laRSk7IC8qIG5lZWQgdm1hbGxvYyBzaW5jZSBmcmFtZSBidWZmZXIgPiAxMjhLICovCi0JCQlpZiAoa2J1ZiA9PSBOVUxMKSB7Ci0JCQkJUFdDX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgZnJhbWUgYnVmZmVyICVkLlxuIiwgaSk7Ci0JCQkJcmV0dXJuIC1FTk9NRU07Ci0JCQl9Ci0JCQlQV0NfREVCVUdfTUVNT1JZKCJBbGxvY2F0ZWQgZnJhbWUgYnVmZmVyICVkIGF0ICVwLlxuIiwgaSwga2J1Zik7Ci0JCQlwZGV2LT5mYnVmW2ldLmRhdGEgPSBrYnVmOwotCQl9Ci0JfQotCi0JLyogQWxsb2NhdGUgZGVjb21wcmVzc29yIHRhYmxlIHNwYWNlICovCi0JaWYgKERFVklDRV9VU0VfQ09ERUMxKHBkZXYtPnR5cGUpKQotCQllcnIgPSBwd2NfZGVjMV9hbGxvYyhwZGV2KTsKLQllbHNlCi0JCWVyciA9IHB3Y19kZWMyM19hbGxvYyhwZGV2KTsKLQotCWlmIChlcnIpIHsKLQkJUFdDX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgZGVjb21wcmVzcyB0YWJsZS5cbiIpOwotCQlyZXR1cm4gZXJyOwotCX0KLQotCS8qIEFsbG9jYXRlIGltYWdlIGJ1ZmZlcjsgZG91YmxlIGJ1ZmZlciBmb3IgbW1hcCgpICovCi0Ja2J1ZiA9IHB3Y19ydm1hbGxvYyhwd2NfbWJ1ZnMgKiBwZGV2LT5sZW5fcGVyX2ltYWdlKTsKLQlpZiAoa2J1ZiA9PSBOVUxMKSB7Ci0JCVBXQ19FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIGltYWdlIGJ1ZmZlcihzKS4gbmVlZGVkICglZClcbiIsCi0JCQkJcHdjX21idWZzICogcGRldi0+bGVuX3Blcl9pbWFnZSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlQV0NfREVCVUdfTUVNT1JZKCJBbGxvY2F0ZWQgaW1hZ2UgYnVmZmVyIGF0ICVwLlxuIiwga2J1Zik7Ci0JcGRldi0+aW1hZ2VfZGF0YSA9IGtidWY7Ci0JZm9yIChpID0gMDsgaSA8IHB3Y19tYnVmczsgaSsrKSB7Ci0JCXBkZXYtPmltYWdlc1tpXS5vZmZzZXQgPSBpICogcGRldi0+bGVuX3Blcl9pbWFnZTsKLQkJcGRldi0+aW1hZ2VzW2ldLnZtYV91c2VfY291bnQgPSAwOwotCX0KLQlmb3IgKDsgaSA8IE1BWF9JTUFHRVM7IGkrKykgewotCQlwZGV2LT5pbWFnZXNbaV0ub2Zmc2V0ID0gMDsKLQl9Ci0KLQlrYnVmID0gTlVMTDsKLQotCVBXQ19ERUJVR19NRU1PUlkoIjw8IHB3Y19hbGxvY2F0ZV9idWZmZXJzKClcbiIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBwd2NfZnJlZV9idWZmZXJzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQotewotCWludCBpOwotCi0JUFdDX0RFQlVHX01FTU9SWSgiRW50ZXJpbmcgZnJlZV9idWZmZXJzKCVwKS5cbiIsIHBkZXYpOwotCi0JaWYgKHBkZXYgPT0gTlVMTCkKLQkJcmV0dXJuOwotCS8qIFJlbGVhc2UgSXNvLXBpcGUgYnVmZmVycyAqLwotCWZvciAoaSA9IDA7IGkgPCBNQVhfSVNPX0JVRlM7IGkrKykKLQkJaWYgKHBkZXYtPnNidWZbaV0uZGF0YSAhPSBOVUxMKSB7Ci0JCQlQV0NfREVCVUdfTUVNT1JZKCJGcmVlaW5nIElTTyBidWZmZXIgYXQgJXAuXG4iLCBwZGV2LT5zYnVmW2ldLmRhdGEpOwotCQkJa2ZyZWUocGRldi0+c2J1ZltpXS5kYXRhKTsKLQkJCXBkZXYtPnNidWZbaV0uZGF0YSA9IE5VTEw7Ci0JCX0KLQotCS8qIFRoZSBzYW1lIGZvciBmcmFtZSBidWZmZXJzICovCi0JaWYgKHBkZXYtPmZidWYgIT0gTlVMTCkgewotCQlmb3IgKGkgPSAwOyBpIDwgZGVmYXVsdF9mYnVmczsgaSsrKSB7Ci0JCQlpZiAocGRldi0+ZmJ1ZltpXS5kYXRhICE9IE5VTEwpIHsKLQkJCQlQV0NfREVCVUdfTUVNT1JZKCJGcmVlaW5nIGZyYW1lIGJ1ZmZlciAlZCBhdCAlcC5cbiIsIGksIHBkZXYtPmZidWZbaV0uZGF0YSk7Ci0JCQkJdmZyZWUocGRldi0+ZmJ1ZltpXS5kYXRhKTsKLQkJCQlwZGV2LT5mYnVmW2ldLmRhdGEgPSBOVUxMOwotCQkJfQotCQl9Ci0JCWtmcmVlKHBkZXYtPmZidWYpOwotCQlwZGV2LT5mYnVmID0gTlVMTDsKLQl9Ci0KLQkvKiBJbnRlcm1lZGlhdGUgZGVjb21wcmVzc2lvbiBidWZmZXIgJiB0YWJsZXMgKi8KLQlpZiAocGRldi0+ZGVjb21wcmVzc19kYXRhICE9IE5VTEwpIHsKLQkJUFdDX0RFQlVHX01FTU9SWSgiRnJlZWluZyBkZWNvbXByZXNzaW9uIGJ1ZmZlciBhdCAlcC5cbiIsIHBkZXYtPmRlY29tcHJlc3NfZGF0YSk7Ci0JCWtmcmVlKHBkZXYtPmRlY29tcHJlc3NfZGF0YSk7Ci0JCXBkZXYtPmRlY29tcHJlc3NfZGF0YSA9IE5VTEw7Ci0JfQotCi0JLyogUmVsZWFzZSBpbWFnZSBidWZmZXJzICovCi0JaWYgKHBkZXYtPmltYWdlX2RhdGEgIT0gTlVMTCkgewotCQlQV0NfREVCVUdfTUVNT1JZKCJGcmVlaW5nIGltYWdlIGJ1ZmZlciBhdCAlcC5cbiIsIHBkZXYtPmltYWdlX2RhdGEpOwotCQlwd2NfcnZmcmVlKHBkZXYtPmltYWdlX2RhdGEsIHB3Y19tYnVmcyAqIHBkZXYtPmxlbl9wZXJfaW1hZ2UpOwotCX0KLQlwZGV2LT5pbWFnZV9kYXRhID0gTlVMTDsKLQotCVBXQ19ERUJVR19NRU1PUlkoIkxlYXZpbmcgZnJlZV9idWZmZXJzKCkuXG4iKTsKLX0KLQotLyogVGhlIGZyYW1lICYgaW1hZ2UgYnVmZmVyIG1lc3MuCi0KLSAgIFllcywgdGhpcyBpcyBhIG1lc3MuIFdlbGwsIGl0IHVzZWQgdG8gYmUgc2ltcGxlLCBidXQgYWxhcy4uLiAgSW4gdGhpcwotICAgbW9kdWxlLCAzIGJ1ZmZlcnMgc2NoZW1lcyBhcmUgdXNlZCB0byBnZXQgdGhlIGRhdGEgZnJvbSB0aGUgVVNCIGJ1cyB0bwotICAgdGhlIHVzZXIgcHJvZ3JhbS4gVGhlIGZpcnN0IHNjaGVtZSBpbnZvbHZlcyB0aGUgSVNPIGJ1ZmZlcnMgKGNhbGxlZCB0aHVzCi0gICBzaW5jZSB0aGV5IHRyYW5zcG9ydCBJU08gZGF0YSBmcm9tIHRoZSBVU0IgY29udHJvbGxlciksIGFuZCBub3QgcmVhbGx5Ci0gICBpbnRlcmVzdGluZy4gU3VmZmljZXMgdG8gc2F5IHRoZSBkYXRhIGZyb20gdGhpcyBidWZmZXIgaXMgcXVpY2tseQotICAgZ2F0aGVyZWQgaW4gYW4gaW50ZXJydXB0IGhhbmRsZXIgKHB3Y19pc29jX2hhbmRsZXIpIGFuZCBwbGFjZWQgaW50byB0aGUKLSAgIGZyYW1lIGJ1ZmZlci4KLQotICAgVGhlIGZyYW1lIGJ1ZmZlciBpcyB0aGUgc2Vjb25kIHNjaGVtZSwgYW5kIGlzIHRoZSBjZW50cmFsIGVsZW1lbnQgaGVyZS4KLSAgIEl0IGNvbGxlY3RzIHRoZSBkYXRhIGZyb20gYSBzaW5nbGUgZnJhbWUgZnJvbSB0aGUgY2FtZXJhIChoZW5jZSwgdGhlCi0gICBuYW1lKS4gRnJhbWVzIGFyZSBkZWxpbWl0ZWQgYnkgdGhlIFVTQiBjYW1lcmEgd2l0aCBhIHNob3J0IFVTQiBwYWNrZXQsCi0gICBzbyB0aGF0J3MgZWFzeSB0byBkZXRlY3QuIFRoZSBmcmFtZSBidWZmZXJzIGZvcm0gYSBsaXN0IHRoYXQgaXMgZmlsbGVkCi0gICBieSB0aGUgY2FtZXJhK1VTQiBjb250cm9sbGVyIGFuZCBkcmFpbmVkIGJ5IHRoZSB1c2VyIHByb2Nlc3MgdGhyb3VnaAotICAgZWl0aGVyIHJlYWQoKSBvciBtbWFwKCkuCi0KLSAgIFRoZSBpbWFnZSBidWZmZXIgaXMgdGhlIHRoaXJkIHNjaGVtZSwgaW4gd2hpY2ggZnJhbWVzIGFyZSBkZWNvbXByZXNzZWQKLSAgIGFuZCBjb252ZXJ0ZWQgaW50byBwbGFuYXIgZm9ybWF0LiBGb3IgbW1hcCgpIHRoZXJlIGlzIG1vcmUgdGhhbgotICAgb25lIGltYWdlIGJ1ZmZlciBhdmFpbGFibGUuCi0KLSAgIFRoZSBmcmFtZSBidWZmZXJzIHByb3ZpZGUgdGhlIGltYWdlIGJ1ZmZlcmluZy4gSW4gY2FzZSB0aGUgdXNlciBwcm9jZXNzCi0gICBpcyBhIGJpdCBzbG93LCB0aGlzIGludHJvZHVjZXMgbGFnIGFuZCBzb21lIHVuZGVzaXJlZCBzaWRlLWVmZmVjdHMuCi0gICBUaGUgcHJvYmxlbSBhcmlzZXMgd2hlbiB0aGUgZnJhbWUgYnVmZmVyIGlzIGZ1bGwuIEkgdXNlZCB0byBkcm9wIHRoZSBsYXN0Ci0gICBmcmFtZSwgd2hpY2ggbWFrZXMgdGhlIGRhdGEgaW4gdGhlIHF1ZXVlIHN0YWxlIHZlcnkgcXVpY2tseS4gQnV0IGRyb3BwaW5nCi0gICB0aGUgZnJhbWUgYXQgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlIHByb3ZlZCB0byBiZSBhIGxpdHRlIGJpdCBtb3JlIGRpZmZpY3VsdC4KLSAgIEkgdHJpZWQgYSBjaXJjdWxhciBsaW5rZWQgc2NoZW1lLCBidXQgdGhpcyBpbnRyb2R1Y2VkIG1vcmUgcHJvYmxlbXMgdGhhbgotICAgaXQgc29sdmVkLgotCi0gICBCZWNhdXNlIGZpbGxpbmcgYW5kIGRyYWluaW5nIGFyZSBjb21wbGV0ZWx5IGFzeW5jaHJvbm91cyBwcm9jZXNzZXMsIHRoaXMKLSAgIHJlcXVpcmVzIHNvbWUgZmlkZGxpbmcgd2l0aCBwb2ludGVycyBhbmQgbXV0ZXhlcy4KLQotICAgRXZlbnR1YWxseSwgSSBjYW1lIHVwIHdpdGggYSBzeXN0ZW0gd2l0aCAyIGxpc3RzOiBhbiAnZW1wdHknIGZyYW1lIGxpc3QKLSAgIGFuZCBhICdmdWxsJyBmcmFtZSBsaXN0OgotICAgICAqIEluaXRpYWxseSwgYWxsIGZyYW1lIGJ1ZmZlcnMgYnV0IG9uZSBhcmUgb24gdGhlICdlbXB0eScgbGlzdDsgdGhlIG9uZQotICAgICAgIHJlbWFpbmluZyBidWZmZXIgaXMgb3VyIGluaXRpYWwgZmlsbCBmcmFtZS4KLSAgICAgKiBJZiBhIGZyYW1lIGlzIG5lZWRlZCBmb3IgZmlsbGluZywgd2UgdHJ5IHRvIHRha2UgaXQgZnJvbSB0aGUgJ2VtcHR5JwotICAgICAgIGxpc3QsIHVubGVzcyB0aGF0IGxpc3QgaXMgZW1wdHksIGluIHdoaWNoIGNhc2Ugd2UgdGFrZSB0aGUgYnVmZmVyIGF0Ci0gICAgICAgdGhlIGhlYWQgb2YgdGhlICdmdWxsJyBsaXN0LgotICAgICAqIFdoZW4gb3VyIGZpbGwgYnVmZmVyIGhhcyBiZWVuIGZpbGxlZCwgaXQgaXMgYXBwZW5kZWQgdG8gdGhlICdmdWxsJwotICAgICAgIGxpc3QuCi0gICAgICogSWYgYSBmcmFtZSBpcyBuZWVkZWQgYnkgcmVhZCgpIG9yIG1tYXAoKSwgaXQgaXMgdGFrZW4gZnJvbSB0aGUgaGVhZCBvZgotICAgICAgIHRoZSAnZnVsbCcgbGlzdCwgaGFuZGxlZCwgYW5kIHRoZW4gYXBwZW5kZWQgdG8gdGhlICdlbXB0eScgbGlzdC4gSWYgbm8KLSAgICAgICBidWZmZXIgaXMgcHJlc2VudCBvbiB0aGUgJ2Z1bGwnIGxpc3QsIHdlIHdhaXQuCi0gICBUaGUgYWR2YW50YWdlIGlzIHRoYXQgdGhlIGJ1ZmZlciB0aGF0IGlzIGN1cnJlbnRseSBiZWluZyBkZWNvbXByZXNzZWQvCi0gICBjb252ZXJ0ZWQsIGlzIG9uIG5laXRoZXIgbGlzdCwgYW5kIHRodXMgbm90IGluIG91ciB3YXkgKGFueSBvdGhlciBzY2hlbWUKLSAgIEkgdHJpZWQgaGFkIHRoZSBwcm9ibGVtIG9mIG9sZCBkYXRhIGxpbmdlcmluZyBpbiB0aGUgcXVldWUpLgotCi0gICBXaGF0ZXZlciBzdHJhdGVneSB5b3UgY2hvb3NlLCBpdCBhbHdheXMgcmVtYWlucyBhIHRyYWRlb2ZmOiB3aXRoIG1vcmUKLSAgIGZyYW1lIGJ1ZmZlcnMgdGhlIGNoYW5jZXMgb2YgYSBtaXNzZWQgZnJhbWUgYXJlIHJlZHVjZWQuIE9uIHRoZSBvdGhlcgotICAgaGFuZCwgb24gc2xvd2VyIG1hY2hpbmVzIGl0IGludHJvZHVjZXMgbGFnIGJlY2F1c2UgdGhlIHF1ZXVlIHdpbGwKLSAgIGFsd2F5cyBiZSBmdWxsLgotICovCi0KLS8qKgotICBcYnJpZWYgRmluZCBuZXh0IGZyYW1lIGJ1ZmZlciB0byBmaWxsLiBUYWtlIGZyb20gZW1wdHkgb3IgZnVsbCBsaXN0LCB3aGljaGV2ZXIgY29tZXMgZmlyc3QuCi0gKi8KLXN0YXRpYyBpbnQgcHdjX25leHRfZmlsbF9mcmFtZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKLXsKLQlpbnQgcmV0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlyZXQgPSAwOwotCXNwaW5fbG9ja19pcnFzYXZlKCZwZGV2LT5wdHJsb2NrLCBmbGFncyk7Ci0JaWYgKHBkZXYtPmZpbGxfZnJhbWUgIT0gTlVMTCkgewotCQkvKiBhcHBlbmQgdG8gJ2Z1bGwnIGxpc3QgKi8KLQkJaWYgKHBkZXYtPmZ1bGxfZnJhbWVzID09IE5VTEwpIHsKLQkJCXBkZXYtPmZ1bGxfZnJhbWVzID0gcGRldi0+ZmlsbF9mcmFtZTsKLQkJCXBkZXYtPmZ1bGxfZnJhbWVzX3RhaWwgPSBwZGV2LT5mdWxsX2ZyYW1lczsKLQkJfQotCQllbHNlIHsKLQkJCXBkZXYtPmZ1bGxfZnJhbWVzX3RhaWwtPm5leHQgPSBwZGV2LT5maWxsX2ZyYW1lOwotCQkJcGRldi0+ZnVsbF9mcmFtZXNfdGFpbCA9IHBkZXYtPmZpbGxfZnJhbWU7Ci0JCX0KLQl9Ci0JaWYgKHBkZXYtPmVtcHR5X2ZyYW1lcyAhPSBOVUxMKSB7Ci0JCS8qIFdlIGhhdmUgZW1wdHkgZnJhbWVzIGF2YWlsYWJsZS4gVGhhdCdzIGVhc3kgKi8KLQkJcGRldi0+ZmlsbF9mcmFtZSA9IHBkZXYtPmVtcHR5X2ZyYW1lczsKLQkJcGRldi0+ZW1wdHlfZnJhbWVzID0gcGRldi0+ZW1wdHlfZnJhbWVzLT5uZXh0OwotCX0KLQllbHNlIHsKLQkJLyogSG1tLiBUYWtlIGl0IGZyb20gdGhlIGZ1bGwgbGlzdCAqLwotCQkvKiBzYW5pdHkgY2hlY2sgKi8KLQkJaWYgKHBkZXYtPmZ1bGxfZnJhbWVzID09IE5VTEwpIHsKLQkJCVBXQ19FUlJPUigiTmVpdGhlciBlbXB0eSBvciBmdWxsIGZyYW1lcyBhdmFpbGFibGUhXG4iKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkZXYtPnB0cmxvY2ssIGZsYWdzKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCXBkZXYtPmZpbGxfZnJhbWUgPSBwZGV2LT5mdWxsX2ZyYW1lczsKLQkJcGRldi0+ZnVsbF9mcmFtZXMgPSBwZGV2LT5mdWxsX2ZyYW1lcy0+bmV4dDsKLQkJcmV0ID0gMTsKLQl9Ci0JcGRldi0+ZmlsbF9mcmFtZS0+bmV4dCA9IE5VTEw7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGRldi0+cHRybG9jaywgZmxhZ3MpOwotCXJldHVybiByZXQ7Ci19Ci0KLQotLyoqCi0gIFxicmllZiBSZXNldCBhbGwgYnVmZmVycywgcG9pbnRlcnMgYW5kIGxpc3RzLCBleGNlcHQgZm9yIHRoZSBpbWFnZV91c2VkW10gYnVmZmVyLgotCi0gIElmIHRoZSBpbWFnZV91c2VkW10gYnVmZmVyIGlzIGNsZWFyZWQgdG9vLCBtbWFwKCkvVklESU9DU1lOQyB3aWxsIHJ1biBpbnRvIHRyb3VibGUuCi0gKi8KLXN0YXRpYyB2b2lkIHB3Y19yZXNldF9idWZmZXJzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQotewotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlQV0NfREVCVUdfTUVNT1JZKCI+PiAlcyBfX2VudGVyX19cbiIsIF9fZnVuY19fKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwZGV2LT5wdHJsb2NrLCBmbGFncyk7Ci0JcGRldi0+ZnVsbF9mcmFtZXMgPSBOVUxMOwotCXBkZXYtPmZ1bGxfZnJhbWVzX3RhaWwgPSBOVUxMOwotCWZvciAoaSA9IDA7IGkgPCBkZWZhdWx0X2ZidWZzOyBpKyspIHsKLQkJcGRldi0+ZmJ1ZltpXS5maWxsZWQgPSAwOwotCQlpZiAoaSA+IDApCi0JCQlwZGV2LT5mYnVmW2ldLm5leHQgPSAmcGRldi0+ZmJ1ZltpIC0gMV07Ci0JCWVsc2UKLQkJCXBkZXYtPmZidWYtPm5leHQgPSBOVUxMOwotCX0KLQlwZGV2LT5lbXB0eV9mcmFtZXMgPSAmcGRldi0+ZmJ1ZltkZWZhdWx0X2ZidWZzIC0gMV07Ci0JcGRldi0+ZW1wdHlfZnJhbWVzX3RhaWwgPSBwZGV2LT5mYnVmOwotCXBkZXYtPnJlYWRfZnJhbWUgPSBOVUxMOwotCXBkZXYtPmZpbGxfZnJhbWUgPSBwZGV2LT5lbXB0eV9mcmFtZXM7Ci0JcGRldi0+ZW1wdHlfZnJhbWVzID0gcGRldi0+ZW1wdHlfZnJhbWVzLT5uZXh0OwotCi0JcGRldi0+aW1hZ2VfcmVhZF9wb3MgPSAwOwotCXBkZXYtPmZpbGxfaW1hZ2UgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkZXYtPnB0cmxvY2ssIGZsYWdzKTsKLQotCVBXQ19ERUJVR19NRU1PUlkoIjw8ICVzIF9fbGVhdmluZ19fXG4iLCBfX2Z1bmNfXyk7Ci19Ci0KLQotLyoqCi0gIFxicmllZiBEbyBhbGwgdGhlIGhhbmRsaW5nIGZvciBnZXR0aW5nIG9uZSBmcmFtZTogZ2V0IHBvaW50ZXIsIGRlY29tcHJlc3MsIGFkdmFuY2UgcG9pbnRlcnMuCi0gKi8KLWludCBwd2NfaGFuZGxlX2ZyYW1lKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQotewotCWludCByZXQgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcGRldi0+cHRybG9jaywgZmxhZ3MpOwotCS8qIEZpcnN0IGdyYWIgb3VyIHJlYWRfZnJhbWU7IHRoaXMgaXMgcmVtb3ZlZCBmcm9tIGFsbCBsaXN0cywgc28KLQkgICB3ZSBjYW4gcmVsZWFzZSB0aGUgbG9jayBhZnRlciB0aGlzIHdpdGhvdXQgcHJvYmxlbXMgKi8KLQlpZiAocGRldi0+cmVhZF9mcmFtZSAhPSBOVUxMKSB7Ci0JCS8qIFRoaXMgY2FuJ3QgdGhlb3JldGljYWxseSBoYXBwZW4gKi8KLQkJUFdDX0VSUk9SKCJIdWg/IFJlYWQgZnJhbWUgc3RpbGwgaW4gdXNlP1xuIik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkZXYtPnB0cmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQotCWlmIChwZGV2LT5mdWxsX2ZyYW1lcyA9PSBOVUxMKSB7Ci0JCVBXQ19FUlJPUigiV29vcHMuIE5vIGZyYW1lcyByZWFkeS5cbiIpOwotCX0KLQllbHNlIHsKLQkJcGRldi0+cmVhZF9mcmFtZSA9IHBkZXYtPmZ1bGxfZnJhbWVzOwotCQlwZGV2LT5mdWxsX2ZyYW1lcyA9IHBkZXYtPmZ1bGxfZnJhbWVzLT5uZXh0OwotCQlwZGV2LT5yZWFkX2ZyYW1lLT5uZXh0ID0gTlVMTDsKLQl9Ci0KLQlpZiAocGRldi0+cmVhZF9mcmFtZSAhPSBOVUxMKSB7Ci0JCS8qIERlY29tcHJlc3Npb24gaXMgYSBsZW5ndGh5IHByb2Nlc3MsIHNvIGl0J3Mgb3V0c2lkZSBvZiB0aGUgbG9jay4KLQkJICAgVGhpcyBnaXZlcyB0aGUgaXNvY19oYW5kbGVyIHRoZSBvcHBvcnR1bml0eSB0byBmaWxsIG1vcmUgZnJhbWVzCi0JCSAgIGluIHRoZSBtZWFuIHRpbWUuCi0JCSovCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkZXYtPnB0cmxvY2ssIGZsYWdzKTsKLQkJcmV0ID0gcHdjX2RlY29tcHJlc3MocGRldik7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZwZGV2LT5wdHJsb2NrLCBmbGFncyk7Ci0KLQkJLyogV2UncmUgZG9uZSB3aXRoIHJlYWRfYnVmZmVyLCB0YWNrIGl0IHRvIHRoZSBlbmQgb2YgdGhlIGVtcHR5IGJ1ZmZlciBsaXN0ICovCi0JCWlmIChwZGV2LT5lbXB0eV9mcmFtZXMgPT0gTlVMTCkgewotCQkJcGRldi0+ZW1wdHlfZnJhbWVzID0gcGRldi0+cmVhZF9mcmFtZTsKLQkJCXBkZXYtPmVtcHR5X2ZyYW1lc190YWlsID0gcGRldi0+ZW1wdHlfZnJhbWVzOwotCQl9Ci0JCWVsc2UgewotCQkJcGRldi0+ZW1wdHlfZnJhbWVzX3RhaWwtPm5leHQgPSBwZGV2LT5yZWFkX2ZyYW1lOwotCQkJcGRldi0+ZW1wdHlfZnJhbWVzX3RhaWwgPSBwZGV2LT5yZWFkX2ZyYW1lOwotCQl9Ci0JCXBkZXYtPnJlYWRfZnJhbWUgPSBOVUxMOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZGV2LT5wdHJsb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gIFxicmllZiBBZHZhbmNlIHBvaW50ZXJzIG9mIGltYWdlIGJ1ZmZlciAoYWZ0ZXIgZWFjaCB1c2VyIHJlcXVlc3QpCi0qLwotdm9pZCBwd2NfbmV4dF9pbWFnZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKLXsKLQlwZGV2LT5pbWFnZV91c2VkW3BkZXYtPmZpbGxfaW1hZ2VdID0gMDsKLQlwZGV2LT5maWxsX2ltYWdlID0gKHBkZXYtPmZpbGxfaW1hZ2UgKyAxKSAlIHB3Y19tYnVmczsKLX0KLQotLyoqCi0gKiBQcmludCBkZWJ1ZyBpbmZvcm1hdGlvbiB3aGVuIGEgZnJhbWUgaXMgZGlzY2FyZGVkIGJlY2F1c2UgYWxsIG9mIG91ciBidWZmZXIKLSAqIGlzIGZ1bGwKLSAqLwotc3RhdGljIHZvaWQgcHdjX2ZyYW1lX2R1bXBlZChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKLXsKLQlwZGV2LT52ZnJhbWVzX2R1bXBlZCsrOwotCWlmIChwZGV2LT52ZnJhbWVfY291bnQgPCBGUkFNRV9MT1dNQVJLKQotCQlyZXR1cm47Ci0KLQlpZiAocGRldi0+dmZyYW1lc19kdW1wZWQgPCAyMCkKLQkJUFdDX0RFQlVHX0ZMT1coIkR1bXBpbmcgZnJhbWUgJWRcbiIsIHBkZXYtPnZmcmFtZV9jb3VudCk7Ci0JZWxzZSBpZiAocGRldi0+dmZyYW1lc19kdW1wZWQgPT0gMjApCi0JCVBXQ19ERUJVR19GTE9XKCJEdW1waW5nIGZyYW1lICVkIChsYXN0IG1lc3NhZ2UpXG4iLAotCQkJCXBkZXYtPnZmcmFtZV9jb3VudCk7CisJYnVmID0gbGlzdF9lbnRyeShwZGV2LT5xdWV1ZWRfYnVmcy5uZXh0LCBzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiwgbGlzdCk7CisJbGlzdF9kZWwoJmJ1Zi0+bGlzdCk7CitsZWF2ZToKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZGV2LT5xdWV1ZWRfYnVmc19sb2NrLCBmbGFncyk7CisJcmV0dXJuIGJ1ZjsKIH0KIAogc3RhdGljIHZvaWQgcHdjX3NuYXBzaG90X2J1dHRvbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IGRvd24pCkBAIC01NzUsOSArMjA0LDkgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgaW50IHB3Y19yY3Zfc2hvcnRfcGFja2V0KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBjb25zdCBzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiAqZmJ1ZikKK3N0YXRpYyB2b2lkIHB3Y19mcmFtZV9jb21wbGV0ZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKIHsKLQlpbnQgYXdha2UgPSAwOworCXN0cnVjdCBwd2NfZnJhbWVfYnVmICpmYnVmID0gcGRldi0+ZmlsbF9idWY7CiAKIAkvKiBUaGUgVG9VQ2FtIEZ1biBDTU9TIHNlbnNvciBjYXVzZXMgdGhlIGZpcm13YXJlIHRvIHNlbmQgMiBvciAzIGJvZ3VzCiAJICAgZnJhbWVzIG9uIHRoZSBVU0Igd2lyZSBhZnRlciBhbiBleHBvc3VyZSBjaGFuZ2UuIFRoaXMgY29uZGl0aXRpb24gaXMKQEAgLTU4OSw3ICsyMTgsNiBAQAogCQlpZiAocHRyWzFdID09IDEgJiYgcHRyWzBdICYgMHgxMCkgewogCQkJUFdDX1RSQUNFKCJIeXVuZGFpIENNT1Mgc2Vuc29yIGJ1Zy4gRHJvcHBpbmcgZnJhbWUuXG4iKTsKIAkJCXBkZXYtPmRyb3BfZnJhbWVzICs9IDI7Ci0JCQlwZGV2LT52ZnJhbWVzX2Vycm9yKys7CiAJCX0KIAkJaWYgKChwdHJbMF0gXiBwZGV2LT52bWlycm9yKSAmIDB4MDEpIHsKIAkJCXB3Y19zbmFwc2hvdF9idXR0b24ocGRldiwgcHRyWzBdICYgMHgwMSk7CkBAIC02MTIsOCArMjQwLDcgQEAKIAkJICAgKi8KIAkJaWYgKGZidWYtPmZpbGxlZCA9PSA0KQogCQkJcGRldi0+ZHJvcF9mcmFtZXMrKzsKLQl9Ci0JZWxzZSBpZiAocGRldi0+dHlwZSA9PSA3NDAgfHwgcGRldi0+dHlwZSA9PSA3MjApIHsKKwl9IGVsc2UgaWYgKHBkZXYtPnR5cGUgPT0gNzQwIHx8IHBkZXYtPnR5cGUgPT0gNzIwKSB7CiAJCXVuc2lnbmVkIGNoYXIgKnB0ciA9ICh1bnNpZ25lZCBjaGFyICopZmJ1Zi0+ZGF0YTsKIAkJaWYgKChwdHJbMF0gXiBwZGV2LT52bWlycm9yKSAmIDB4MDEpIHsKIAkJCXB3Y19zbmFwc2hvdF9idXR0b24ocGRldiwgcHRyWzBdICYgMHgwMSk7CkBAIC02MjEsMzMgKzI0OCwyMyBAQAogCQlwZGV2LT52bWlycm9yID0gcHRyWzBdICYgMHgwMzsKIAl9CiAKLQkvKiBJbiBjYXNlIHdlIHdlcmUgaW5zdHJ1Y3RlZCB0byBkcm9wIHRoZSBmcmFtZSwgZG8gc28gc2lsZW50bHkuCi0JICAgVGhlIGJ1ZmZlciBwb2ludGVycyBhcmUgbm90IHVwZGF0ZWQgZWl0aGVyIChidXQgdGhlIGNvdW50ZXJzIGFyZSByZXNldCBiZWxvdykuCi0JICAgKi8KLQlpZiAocGRldi0+ZHJvcF9mcmFtZXMgPiAwKQorCS8qIEluIGNhc2Ugd2Ugd2VyZSBpbnN0cnVjdGVkIHRvIGRyb3AgdGhlIGZyYW1lLCBkbyBzbyBzaWxlbnRseS4gKi8KKwlpZiAocGRldi0+ZHJvcF9mcmFtZXMgPiAwKSB7CiAJCXBkZXYtPmRyb3BfZnJhbWVzLS07Ci0JZWxzZSB7CisJfSBlbHNlIHsKIAkJLyogQ2hlY2sgZm9yIHVuZGVyZmxvdyBmaXJzdCAqLwogCQlpZiAoZmJ1Zi0+ZmlsbGVkIDwgcGRldi0+ZnJhbWVfdG90YWxfc2l6ZSkgewogCQkJUFdDX0RFQlVHX0ZMT1coIkZyYW1lIGJ1ZmZlciB1bmRlcmZsb3cgKCVkIGJ5dGVzKTsiCiAJCQkJICAgICAgICIgZGlzY2FyZGVkLlxuIiwgZmJ1Zi0+ZmlsbGVkKTsKLQkJCXBkZXYtPnZmcmFtZXNfZXJyb3IrKzsKLQkJfQotCQllbHNlIHsKLQkJCS8qIFNlbmQgb25seSBvbmNlIHBlciBFT0YgKi8KLQkJCWF3YWtlID0gMTsgLyogZGVsYXkgd2FrZV91cHMgKi8KLQotCQkJLyogRmluZCBvdXIgbmV4dCBmcmFtZSB0byBmaWxsLiBUaGlzIHdpbGwgYWx3YXlzIHN1Y2NlZWQsIHNpbmNlIHdlCi0JCQkgKiBuaWNrIGEgZnJhbWUgZnJvbSBlaXRoZXIgZW1wdHkgb3IgZnVsbCBsaXN0LCBidXQgaWYgd2UgaGFkIHRvCi0JCQkgKiB0YWtlIGl0IGZyb20gdGhlIGZ1bGwgbGlzdCwgaXQgbWVhbnMgYSBmcmFtZSBnb3QgZHJvcHBlZC4KLQkJCSAqLwotCQkJaWYgKHB3Y19uZXh0X2ZpbGxfZnJhbWUocGRldikpCi0JCQkJcHdjX2ZyYW1lX2R1bXBlZChwZGV2KTsKLQorCQl9IGVsc2UgeworCQkJZmJ1Zi0+dmIudjRsMl9idWYuZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJCQlmYnVmLT52Yi52NGwyX2J1Zi5zZXF1ZW5jZSA9IHBkZXYtPnZmcmFtZV9jb3VudDsKKwkJCXZiMl9idWZmZXJfZG9uZSgmZmJ1Zi0+dmIsIFZCMl9CVUZfU1RBVEVfRE9ORSk7CisJCQlwZGV2LT5maWxsX2J1ZiA9IE5VTEw7CisJCQlwZGV2LT52c3luYyA9IDA7CiAJCX0KIAl9IC8qICFkcm9wX2ZyYW1lcyAqLwogCXBkZXYtPnZmcmFtZV9jb3VudCsrOwotCXJldHVybiBhd2FrZTsKIH0KIAogLyogVGhpcyBnZXRzIGNhbGxlZCBmb3IgdGhlIElzb2Nocm9ub3VzIHBpcGUgKHZpZGVvKS4gVGhpcyBpcyBkb25lIGluCkBAIC02NTUsMjQgKzI3MiwyMCBAQAogICovCiBzdGF0aWMgdm9pZCBwd2NfaXNvY19oYW5kbGVyKHN0cnVjdCB1cmIgKnVyYikKIHsKLQlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldjsKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IChzdHJ1Y3QgcHdjX2RldmljZSAqKXVyYi0+Y29udGV4dDsKIAlpbnQgaSwgZnN0LCBmbGVuOwotCWludCBhd2FrZTsKLQlzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiAqZmJ1ZjsKLQl1bnNpZ25lZCBjaGFyICpmaWxscHRyID0gTlVMTCwgKmlzb19idWYgPSBOVUxMOworCXVuc2lnbmVkIGNoYXIgKmlzb19idWYgPSBOVUxMOwogCi0JYXdha2UgPSAwOwotCXBkZXYgPSAoc3RydWN0IHB3Y19kZXZpY2UgKil1cmItPmNvbnRleHQ7Ci0JaWYgKHBkZXYgPT0gTlVMTCkgewotCQlQV0NfRVJST1IoImlzb2NfaGFuZGxlcigpIGNhbGxlZCB3aXRoIE5VTEwgZGV2aWNlPyFcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHVyYi0+c3RhdHVzID09IC1FTk9FTlQgfHwgdXJiLT5zdGF0dXMgPT0gLUVDT05OUkVTRVQpIHsKKwlpZiAodXJiLT5zdGF0dXMgPT0gLUVOT0VOVCB8fCB1cmItPnN0YXR1cyA9PSAtRUNPTk5SRVNFVCB8fAorCSAgICB1cmItPnN0YXR1cyA9PSAtRVNIVVRET1dOKSB7CiAJCVBXQ19ERUJVR19PUEVOKCJVUkIgKCVwKSB1bmxpbmtlZCAlc3N5bmNocm9udW91c2x5LlxuIiwgdXJiLCB1cmItPnN0YXR1cyA9PSAtRU5PRU5UID8gIiIgOiAiYSIpOwogCQlyZXR1cm47CiAJfQotCWlmICh1cmItPnN0YXR1cyAhPSAtRUlOUFJPR1JFU1MgJiYgdXJiLT5zdGF0dXMgIT0gMCkgeworCisJaWYgKHBkZXYtPmZpbGxfYnVmID09IE5VTEwpCisJCXBkZXYtPmZpbGxfYnVmID0gcHdjX2dldF9uZXh0X2ZpbGxfYnVmKHBkZXYpOworCisJaWYgKHVyYi0+c3RhdHVzICE9IDApIHsKIAkJY29uc3QgY2hhciAqZXJybXNnOwogCiAJCWVycm1zZyA9ICJVbmtub3duIjsKQEAgLTY4NCwyOSArMjk3LDIxIEBACiAJCQljYXNlIC1FSUxTRVE6CQllcnJtc2cgPSAiQ1JDL1RpbWVvdXQgKGNvdWxkIGJlIGFueXRoaW5nKSI7IGJyZWFrOwogCQkJY2FzZSAtRVRJTUU6CQllcnJtc2cgPSAiRGV2aWNlIGRvZXMgbm90IHJlc3BvbmQiOyBicmVhazsKIAkJfQotCQlQV0NfREVCVUdfRkxPVygicHdjX2lzb2NfaGFuZGxlcigpIGNhbGxlZCB3aXRoIHN0YXR1cyAlZCBbJXNdLlxuIiwgdXJiLT5zdGF0dXMsIGVycm1zZyk7Ci0JCS8qIEdpdmUgdXAgYWZ0ZXIgYSBudW1iZXIgb2YgY29udGlndW91cyBlcnJvcnMgb24gdGhlIFVTQiBidXMuCi0JCSAgIEFwcGVhcmFudGx5IHNvbWV0aGluZyBpcyB3cm9uZyBzbyB3ZSBzaW11bGF0ZSBhbiB1bnBsdWcgZXZlbnQuCi0JCSAqLworCQlQV0NfRVJST1IoInB3Y19pc29jX2hhbmRsZXIoKSBjYWxsZWQgd2l0aCBzdGF0dXMgJWQgWyVzXS5cbiIsCisJCQkgIHVyYi0+c3RhdHVzLCBlcnJtc2cpOworCQkvKiBHaXZlIHVwIGFmdGVyIGEgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgZXJyb3JzICovCiAJCWlmICgrK3BkZXYtPnZpc29jX2Vycm9ycyA+IE1BWF9JU09DX0VSUk9SUykKIAkJewotCQkJUFdDX0lORk8oIlRvbyBtYW55IElTT0MgZXJyb3JzLCBiYWlsaW5nIG91dC5cbiIpOwotCQkJcGRldi0+ZXJyb3Jfc3RhdHVzID0gRUlPOwotCQkJYXdha2UgPSAxOwotCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwZGV2LT5mcmFtZXEpOworCQkJUFdDX0VSUk9SKCJUb28gbWFueSBJU09DIGVycm9ycywgYmFpbGluZyBvdXQuXG4iKTsKKwkJCWlmIChwZGV2LT5maWxsX2J1ZikgeworCQkJCXZiMl9idWZmZXJfZG9uZSgmcGRldi0+ZmlsbF9idWYtPnZiLAorCQkJCQkJVkIyX0JVRl9TVEFURV9FUlJPUik7CisJCQkJcGRldi0+ZmlsbF9idWYgPSBOVUxMOworCQkJfQogCQl9Ci0JCWdvdG8gaGFuZGxlcl9lbmQ7IC8vIHVnbHksIGJ1dCBwcmFjdGljYWwKLQl9Ci0KLQlmYnVmID0gcGRldi0+ZmlsbF9mcmFtZTsKLQlpZiAoZmJ1ZiA9PSBOVUxMKSB7Ci0JCVBXQ19FUlJPUigicHdjX2lzb2NfaGFuZGxlciB3aXRob3V0IHZhbGlkIGZpbGwgZnJhbWUuXG4iKTsKLQkJYXdha2UgPSAxOworCQlwZGV2LT52c3luYyA9IDA7IC8qIERyb3AgdGhlIGN1cnJlbnQgZnJhbWUgKi8KIAkJZ290byBoYW5kbGVyX2VuZDsKIAl9Ci0JZWxzZSB7Ci0JCWZpbGxwdHIgPSBmYnVmLT5kYXRhICsgZmJ1Zi0+ZmlsbGVkOwotCX0KIAogCS8qIFJlc2V0IElTT0MgZXJyb3IgY291bnRlci4gV2UgZGlkIGdldCBoZXJlLCBhZnRlciBhbGwuICovCiAJcGRldi0+dmlzb2NfZXJyb3JzID0gMDsKQEAgLTcyMCw4OSArMzI1LDczIEBACiAJCWZzdCAgPSB1cmItPmlzb19mcmFtZV9kZXNjW2ldLnN0YXR1czsKIAkJZmxlbiA9IHVyYi0+aXNvX2ZyYW1lX2Rlc2NbaV0uYWN0dWFsX2xlbmd0aDsKIAkJaXNvX2J1ZiA9IHVyYi0+dHJhbnNmZXJfYnVmZmVyICsgdXJiLT5pc29fZnJhbWVfZGVzY1tpXS5vZmZzZXQ7Ci0JCWlmIChmc3QgPT0gMCkgewotCQkJaWYgKGZsZW4gPiAwKSB7IC8qIGlmIHZhbGlkIGRhdGEuLi4gKi8KLQkJCQlpZiAocGRldi0+dnN5bmMgPiAwKSB7IC8qIC4uLmFuZCB3ZSBhcmUgbm90IHN5bmMtaHVudGluZy4uLiAqLwotCQkJCQlwZGV2LT52c3luYyA9IDI7CisJCWlmIChmc3QgIT0gMCkgeworCQkJUFdDX0VSUk9SKCJJc28gZnJhbWUgJWQgaGFzIGVycm9yICVkXG4iLCBpLCBmc3QpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGZsZW4gPiAwICYmIHBkZXYtPnZzeW5jKSB7CisJCQlzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiAqZmJ1ZiA9IHBkZXYtPmZpbGxfYnVmOwogCi0JCQkJCS8qIC4uLmNvcHkgZGF0YSB0byBmcmFtZSBidWZmZXIsIGlmIHBvc3NpYmxlICovCi0JCQkJCWlmIChmbGVuICsgZmJ1Zi0+ZmlsbGVkID4gcGRldi0+ZnJhbWVfdG90YWxfc2l6ZSkgewotCQkJCQkJUFdDX0RFQlVHX0ZMT1coIkZyYW1lIGJ1ZmZlciBvdmVyZmxvdyAoZmxlbiA9ICVkLCBmcmFtZV90b3RhbF9zaXplID0gJWQpLlxuIiwgZmxlbiwgcGRldi0+ZnJhbWVfdG90YWxfc2l6ZSk7Ci0JCQkJCQlwZGV2LT52c3luYyA9IDA7IC8qIEhtbSwgbGV0J3Mgd2FpdCBmb3IgYW4gRU9GIChlbmQtb2YtZnJhbWUpICovCi0JCQkJCQlwZGV2LT52ZnJhbWVzX2Vycm9yKys7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQltZW1tb3ZlKGZpbGxwdHIsIGlzb19idWYsIGZsZW4pOwotCQkJCQkJZmlsbHB0ciArPSBmbGVuOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZidWYtPmZpbGxlZCArPSBmbGVuOwotCQkJfSAvKiAuLmZsZW4gPiAwICovCi0KLQkJCWlmIChmbGVuIDwgcGRldi0+dmxhc3RfcGFja2V0X3NpemUpIHsKLQkJCQkvKiBTaG9ydGVyIHBhY2tldC4uLiBXZSBwcm9iYWJseSBoYXZlIHRoZSBlbmQgb2YgYW4gaW1hZ2UtZnJhbWU7Ci0JCQkJICAgd2FrZSB1cCByZWFkKCkgcHJvY2VzcyBhbmQgbGV0IHNlbGVjdCgpL3BvbGwoKSBkbyBzb21ldGhpbmcuCi0JCQkJICAgRGVjb21wcmVzc2lvbiBpcyBkb25lIGluIHVzZXIgdGltZSBvdmVyIHRoZXJlLgotCQkJCSAgICovCi0JCQkJaWYgKHBkZXYtPnZzeW5jID09IDIpIHsKLQkJCQkJaWYgKHB3Y19yY3Zfc2hvcnRfcGFja2V0KHBkZXYsIGZidWYpKSB7Ci0JCQkJCQlhd2FrZSA9IDE7Ci0JCQkJCQlmYnVmID0gcGRldi0+ZmlsbF9mcmFtZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmYnVmLT5maWxsZWQgPSAwOwotCQkJCWZpbGxwdHIgPSBmYnVmLT5kYXRhOwotCQkJCXBkZXYtPnZzeW5jID0gMTsKKwkJCWlmIChwZGV2LT52c3luYyA9PSAxKSB7CisJCQkJZG9fZ2V0dGltZW9mZGF5KCZmYnVmLT52Yi52NGwyX2J1Zi50aW1lc3RhbXApOworCQkJCXBkZXYtPnZzeW5jID0gMjsKIAkJCX0KIAotCQkJcGRldi0+dmxhc3RfcGFja2V0X3NpemUgPSBmbGVuOwotCQl9IC8qIC4uc3RhdHVzID09IDAgKi8KLQkJZWxzZSB7Ci0JCQkvKiBUaGlzIGlzIG5vcm1hbGx5IG5vdCBpbnRlcmVzdGluZyB0byB0aGUgdXNlciwgdW5sZXNzCi0JCQkgKiB5b3UgYXJlIHJlYWxseSBkZWJ1Z2dpbmcgc29tZXRoaW5nLCBkZWZhdWx0ID0gMCAqLwotCQkJc3RhdGljIGludCBpc29fZXJyb3I7Ci0JCQlpc29fZXJyb3IrKzsKLQkJCWlmIChpc29fZXJyb3IgPCAyMCkKLQkJCQlQV0NfREVCVUdfRkxPVygiSXNvIGZyYW1lICVkIG9mIFVTQiBoYXMgZXJyb3IgJWRcbiIsIGksIGZzdCk7CisJCQlpZiAoZmxlbiArIGZidWYtPmZpbGxlZCA+IHBkZXYtPmZyYW1lX3RvdGFsX3NpemUpIHsKKwkJCQlQV0NfRVJST1IoIkZyYW1lIG92ZXJmbG93ICglZCA+ICVkKVxuIiwKKwkJCQkJICBmbGVuICsgZmJ1Zi0+ZmlsbGVkLAorCQkJCQkgIHBkZXYtPmZyYW1lX3RvdGFsX3NpemUpOworCQkJCXBkZXYtPnZzeW5jID0gMDsgLyogTGV0J3Mgd2FpdCBmb3IgYW4gRU9GICovCisJCQl9IGVsc2UgeworCQkJCW1lbWNweShmYnVmLT5kYXRhICsgZmJ1Zi0+ZmlsbGVkLCBpc29fYnVmLAorCQkJCSAgICAgICBmbGVuKTsKKwkJCQlmYnVmLT5maWxsZWQgKz0gZmxlbjsKKwkJCX0KIAkJfQorCQlpZiAoZmxlbiA8IHBkZXYtPnZsYXN0X3BhY2tldF9zaXplKSB7CisJCQkvKiBTaG9ydGVyIHBhY2tldC4uLiBlbmQgb2YgZnJhbWUgKi8KKwkJCWlmIChwZGV2LT52c3luYyA9PSAyKQorCQkJCXB3Y19mcmFtZV9jb21wbGV0ZShwZGV2KTsKKwkJCWlmIChwZGV2LT5maWxsX2J1ZiA9PSBOVUxMKQorCQkJCXBkZXYtPmZpbGxfYnVmID0gcHdjX2dldF9uZXh0X2ZpbGxfYnVmKHBkZXYpOworCQkJaWYgKHBkZXYtPmZpbGxfYnVmKSB7CisJCQkJcGRldi0+ZmlsbF9idWYtPmZpbGxlZCA9IDA7CisJCQkJcGRldi0+dnN5bmMgPSAxOworCQkJfQorCQl9CisJCXBkZXYtPnZsYXN0X3BhY2tldF9zaXplID0gZmxlbjsKIAl9CiAKIGhhbmRsZXJfZW5kOgotCWlmIChhd2FrZSkKLQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwZGV2LT5mcmFtZXEpOwotCi0JdXJiLT5kZXYgPSBwZGV2LT51ZGV2OwogCWkgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwogCWlmIChpICE9IDApCiAJCVBXQ19FUlJPUigiRXJyb3IgKCVkKSByZS1zdWJtaXR0aW5nIHVyYiBpbiBwd2NfaXNvY19oYW5kbGVyLlxuIiwgaSk7CiB9CiAKLQotaW50IHB3Y19pc29jX2luaXQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IHB3Y19pc29jX2luaXQoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CiAJc3RydWN0IHVyYiAqdXJiOwogCWludCBpLCBqLCByZXQ7Ci0KIAlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZjsKIAlzdHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICppZGVzYyA9IE5VTEw7CiAKLQlpZiAocGRldiA9PSBOVUxMKQotCQlyZXR1cm4gLUVGQVVMVDsKIAlpZiAocGRldi0+aXNvX2luaXQpCiAJCXJldHVybiAwOworCiAJcGRldi0+dnN5bmMgPSAwOworCXBkZXYtPnZsYXN0X3BhY2tldF9zaXplID0gMDsKKwlwZGV2LT5maWxsX2J1ZiA9IE5VTEw7CisJcGRldi0+dmZyYW1lX2NvdW50ID0gMDsKKwlwZGV2LT52aXNvY19lcnJvcnMgPSAwOwogCXVkZXYgPSBwZGV2LT51ZGV2OwogCiAJLyogR2V0IHRoZSBjdXJyZW50IGFsdGVybmF0ZSBpbnRlcmZhY2UsIGFkanVzdCBwYWNrZXQgc2l6ZSAqLwotCWlmICghdWRldi0+YWN0Y29uZmlnKQotCQlyZXR1cm4gLUVGQVVMVDsKIAlpbnRmID0gdXNiX2lmbnVtX3RvX2lmKHVkZXYsIDApOwogCWlmIChpbnRmKQogCQlpZGVzYyA9IHVzYl9hbHRudW1fdG9fYWx0c2V0dGluZyhpbnRmLCBwZGV2LT52YWx0ZXJuYXRlKTsKLQogCWlmICghaWRlc2MpCi0JCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gLUVJTzsKIAogCS8qIFNlYXJjaCB2aWRlbyBlbmRwb2ludCAqLwogCXBkZXYtPnZtYXhfcGFja2V0X3NpemUgPSAtMTsKQEAgLTgyNSwzNCArNDE0LDMyIEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKKwkvKiBBbGxvY2F0ZSBhbmQgaW5pdCBJc29jaHJvbnVvdXMgdXJicyAqLwogCWZvciAoaSA9IDA7IGkgPCBNQVhfSVNPX0JVRlM7IGkrKykgewogCQl1cmIgPSB1c2JfYWxsb2NfdXJiKElTT19GUkFNRVNfUEVSX0RFU0MsIEdGUF9LRVJORUwpOwogCQlpZiAodXJiID09IE5VTEwpIHsKIAkJCVBXQ19FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIHVyYiAlZFxuIiwgaSk7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJYnJlYWs7CisJCQlwZGV2LT5pc29faW5pdCA9IDE7CisJCQlwd2NfaXNvY19jbGVhbnVwKHBkZXYpOworCQkJcmV0dXJuIC1FTk9NRU07CiAJCX0KLQkJcGRldi0+c2J1ZltpXS51cmIgPSB1cmI7CisJCXBkZXYtPnVyYnNbaV0gPSB1cmI7CiAJCVBXQ19ERUJVR19NRU1PUlkoIkFsbG9jYXRlZCBVUkIgYXQgMHglcFxuIiwgdXJiKTsKLQl9Ci0JaWYgKHJldCkgewotCQkvKiBEZS1hbGxvY2F0ZSBpbiByZXZlcnNlIG9yZGVyICovCi0JCXdoaWxlIChpLS0pIHsKLQkJCXVzYl9mcmVlX3VyYihwZGV2LT5zYnVmW2ldLnVyYik7Ci0JCQlwZGV2LT5zYnVmW2ldLnVyYiA9IE5VTEw7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKiBpbml0IFVSQiBzdHJ1Y3R1cmUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0lTT19CVUZTOyBpKyspIHsKLQkJdXJiID0gcGRldi0+c2J1ZltpXS51cmI7CiAKIAkJdXJiLT5pbnRlcnZhbCA9IDE7IC8vIGRldmlrCiAJCXVyYi0+ZGV2ID0gdWRldjsKIAkJdXJiLT5waXBlID0gdXNiX3Jjdmlzb2NwaXBlKHVkZXYsIHBkZXYtPnZlbmRwb2ludCk7Ci0JCXVyYi0+dHJhbnNmZXJfZmxhZ3MgPSBVUkJfSVNPX0FTQVA7Ci0JCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gcGRldi0+c2J1ZltpXS5kYXRhOworCQl1cmItPnRyYW5zZmVyX2ZsYWdzID0gVVJCX0lTT19BU0FQIHwgVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisJCXVyYi0+dHJhbnNmZXJfYnVmZmVyID0gdXNiX2FsbG9jX2NvaGVyZW50KHVkZXYsCisJCQkJCQkJICBJU09fQlVGRkVSX1NJWkUsCisJCQkJCQkJICBHRlBfS0VSTkVMLAorCQkJCQkJCSAgJnVyYi0+dHJhbnNmZXJfZG1hKTsKKwkJaWYgKHVyYi0+dHJhbnNmZXJfYnVmZmVyID09IE5VTEwpIHsKKwkJCVBXQ19FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIHVyYiBidWZmZXIgJWRcbiIsIGkpOworCQkJcGRldi0+aXNvX2luaXQgPSAxOworCQkJcHdjX2lzb2NfY2xlYW51cChwZGV2KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CiAJCXVyYi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IElTT19CVUZGRVJfU0laRTsKIAkJdXJiLT5jb21wbGV0ZSA9IHB3Y19pc29jX2hhbmRsZXI7CiAJCXVyYi0+Y29udGV4dCA9IHBkZXY7CkBAIC04NjYsMTQgKzQ1MywxNCBAQAogCiAJLyogbGluayAqLwogCWZvciAoaSA9IDA7IGkgPCBNQVhfSVNPX0JVRlM7IGkrKykgewotCQlyZXQgPSB1c2Jfc3VibWl0X3VyYihwZGV2LT5zYnVmW2ldLnVyYiwgR0ZQX0tFUk5FTCk7CisJCXJldCA9IHVzYl9zdWJtaXRfdXJiKHBkZXYtPnVyYnNbaV0sIEdGUF9LRVJORUwpOwogCQlpZiAocmV0KSB7CiAJCQlQV0NfRVJST1IoImlzb2NfaW5pdCgpIHN1Ym1pdF91cmIgJWQgZmFpbGVkIHdpdGggZXJyb3IgJWRcbiIsIGksIHJldCk7CiAJCQlwZGV2LT5pc29faW5pdCA9IDE7CiAJCQlwd2NfaXNvY19jbGVhbnVwKHBkZXYpOwogCQkJcmV0dXJuIHJldDsKIAkJfQotCQlQV0NfREVCVUdfTUVNT1JZKCJVUkIgMHglcCBzdWJtaXR0ZWQuXG4iLCBwZGV2LT5zYnVmW2ldLnVyYik7CisJCVBXQ19ERUJVR19NRU1PUlkoIlVSQiAweCVwIHN1Ym1pdHRlZC5cbiIsIHBkZXYtPnVyYnNbaV0pOwogCX0KIAogCS8qIEFsbCBpcyBkb25lLi4uICovCkBAIC04ODgsMTIgKzQ3NSw5IEBACiAKIAkvKiBVbmxpbmtpbmcgSVNPQyBidWZmZXJzIG9uZSBieSBvbmUgKi8KIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0lTT19CVUZTOyBpKyspIHsKLQkJc3RydWN0IHVyYiAqdXJiOwotCi0JCXVyYiA9IHBkZXYtPnNidWZbaV0udXJiOwotCQlpZiAodXJiKSB7Ci0JCQlQV0NfREVCVUdfTUVNT1JZKCJVbmxpbmtpbmcgVVJCICVwXG4iLCB1cmIpOwotCQkJdXNiX2tpbGxfdXJiKHVyYik7CisJCWlmIChwZGV2LT51cmJzW2ldKSB7CisJCQlQV0NfREVCVUdfTUVNT1JZKCJVbmxpbmtpbmcgVVJCICVwXG4iLCBwZGV2LT51cmJzW2ldKTsKKwkJCXVzYl9raWxsX3VyYihwZGV2LT51cmJzW2ldKTsKIAkJfQogCX0KIH0KQEAgLTkwNCw0MCArNDg4LDUxIEBACiAKIAkvKiBGcmVlaW5nIElTT0MgYnVmZmVycyBvbmUgYnkgb25lICovCiAJZm9yIChpID0gMDsgaSA8IE1BWF9JU09fQlVGUzsgaSsrKSB7Ci0JCXN0cnVjdCB1cmIgKnVyYjsKLQotCQl1cmIgPSBwZGV2LT5zYnVmW2ldLnVyYjsKLQkJaWYgKHVyYikgeworCQlpZiAocGRldi0+dXJic1tpXSkgewogCQkJUFdDX0RFQlVHX01FTU9SWSgiRnJlZWluZyBVUkJcbiIpOwotCQkJdXNiX2ZyZWVfdXJiKHVyYik7Ci0JCQlwZGV2LT5zYnVmW2ldLnVyYiA9IE5VTEw7CisJCQlpZiAocGRldi0+dXJic1tpXS0+dHJhbnNmZXJfYnVmZmVyKSB7CisJCQkJdXNiX2ZyZWVfY29oZXJlbnQocGRldi0+dWRldiwKKwkJCQkJcGRldi0+dXJic1tpXS0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCwKKwkJCQkJcGRldi0+dXJic1tpXS0+dHJhbnNmZXJfYnVmZmVyLAorCQkJCQlwZGV2LT51cmJzW2ldLT50cmFuc2Zlcl9kbWEpOworCQkJfQorCQkJdXNiX2ZyZWVfdXJiKHBkZXYtPnVyYnNbaV0pOworCQkJcGRldi0+dXJic1tpXSA9IE5VTEw7CiAJCX0KIAl9CiB9CiAKLXZvaWQgcHdjX2lzb2NfY2xlYW51cChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK3N0YXRpYyB2b2lkIHB3Y19pc29jX2NsZWFudXAoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCiB7CiAJUFdDX0RFQlVHX09QRU4oIj4+IHB3Y19pc29jX2NsZWFudXAoKVxuIik7Ci0JaWYgKHBkZXYgPT0gTlVMTCkKLQkJcmV0dXJuOworCiAJaWYgKHBkZXYtPmlzb19pbml0ID09IDApCiAJCXJldHVybjsKIAogCXB3Y19pc29fc3RvcChwZGV2KTsKIAlwd2NfaXNvX2ZyZWUocGRldik7Ci0KLQkvKiBTdG9wIGNhbWVyYSwgYnV0IG9ubHkgaWYgd2UgYXJlIHN1cmUgdGhlIGNhbWVyYSBpcyBzdGlsbCB0aGVyZSAodW5wbHVnCi0JICAgaXMgc2lnbmFsbGVkIGJ5IEVQSVBFKQotCSAqLwotCWlmIChwZGV2LT5lcnJvcl9zdGF0dXMgIT0gRVBJUEUpIHsKLQkJUFdDX0RFQlVHX09QRU4oIlNldHRpbmcgYWx0ZXJuYXRlIGludGVyZmFjZSAwLlxuIik7Ci0JCXVzYl9zZXRfaW50ZXJmYWNlKHBkZXYtPnVkZXYsIDAsIDApOwotCX0KKwl1c2Jfc2V0X2ludGVyZmFjZShwZGV2LT51ZGV2LCAwLCAwKTsKIAogCXBkZXYtPmlzb19pbml0ID0gMDsKIAlQV0NfREVCVUdfT1BFTigiPDwgcHdjX2lzb2NfY2xlYW51cCgpXG4iKTsKIH0KIAorLyoKKyAqIFJlbGVhc2UgYWxsIHF1ZXVlZCBidWZmZXJzLCBubyBuZWVkIHRvIHRha2UgcXVldWVkX2J1ZnNfbG9jaywgc2luY2UgYWxsCisgKiBpc28gdXJicyBoYXZlIGJlZW4ga2lsbGVkIHdoZW4gd2UncmUgY2FsbGVkIHNvIHB3Y19pc29jX2hhbmRsZXIgd29uJ3QgcnVuLgorICovCitzdGF0aWMgdm9pZCBwd2NfY2xlYW51cF9xdWV1ZWRfYnVmcyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK3sKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnBkZXYtPnF1ZXVlZF9idWZzKSkgeworCQlzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiAqYnVmOworCisJCWJ1ZiA9IGxpc3RfZW50cnkocGRldi0+cXVldWVkX2J1ZnMubmV4dCwgc3RydWN0IHB3Y19mcmFtZV9idWYsCisJCQkJIGxpc3QpOworCQlsaXN0X2RlbCgmYnVmLT5saXN0KTsKKwkJdmIyX2J1ZmZlcl9kb25lKCZidWYtPnZiLCBWQjJfQlVGX1NUQVRFX0VSUk9SKTsKKwl9Cit9CisKIC8qKioqKioqKioKICAqIHN5c2ZzCiAgKioqKioqKioqLwpAQCAtMTA1MSw5OCArNjQ2LDE1IEBACiAKIHN0YXRpYyBpbnQgcHdjX3ZpZGVvX29wZW4oc3RydWN0IGZpbGUgKmZpbGUpCiB7Ci0JaW50IGksIHJldDsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKIAlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldjsKIAogCVBXQ19ERUJVR19PUEVOKCI+PiB2aWRlb19vcGVuIGNhbGxlZCh2ZGV2ID0gMHglcCkuXG4iLCB2ZGV2KTsKIAogCXBkZXYgPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKLQlCVUdfT04oIXBkZXYpOwotCWlmIChwZGV2LT52b3BlbikgewotCQlQV0NfREVCVUdfT1BFTigiSSdtIGJ1c3ksIHNvbWVvbmUgaXMgdXNpbmcgdGhlIGRldmljZS5cbiIpOwotCQlyZXR1cm4gLUVCVVNZOwotCX0KKwlpZiAoIXBkZXYtPnVkZXYpCisJCXJldHVybiAtRU5PREVWOwogCi0JcHdjX2NvbnN0cnVjdChwZGV2KTsgLyogc2V0IG1pbi9tYXggc2l6ZXMgY29ycmVjdCAqLwotCWlmICghcGRldi0+dXNiX2luaXQpIHsKLQkJUFdDX0RFQlVHX09QRU4oIkRvaW5nIGZpcnN0IHRpbWUgaW5pdGlhbGl6YXRpb24uXG4iKTsKLQkJcGRldi0+dXNiX2luaXQgPSAxOwotCi0JCS8qIFF1ZXJ5IHNlbnNvciB0eXBlICovCi0JCXJldCA9IHB3Y19nZXRfY21vc19zZW5zb3IocGRldiwgJmkpOwotCQlpZiAocmV0ID49IDApCi0JCXsKLQkJCVBXQ19ERUJVR19PUEVOKCJUaGlzICVzIGNhbWVyYSBpcyBlcXVpcHBlZCB3aXRoIGEgJXMgKCVkKS5cbiIsCi0JCQkJCXBkZXYtPnZkZXYubmFtZSwKLQkJCQkJcHdjX3NlbnNvcl90eXBlX3RvX3N0cmluZyhpKSwgaSk7Ci0JCX0KLQl9Ci0KLQkvKiBUdXJuIG9uIGNhbWVyYSAqLwotCWlmIChwb3dlcl9zYXZlKSB7Ci0JCWkgPSBwd2NfY2FtZXJhX3Bvd2VyKHBkZXYsIDEpOwotCQlpZiAoaSA8IDApCi0JCQlQV0NfREVCVUdfT1BFTigiRmFpbGVkIHRvIHJlc3RvcmUgcG93ZXIgdG8gdGhlIGNhbWVyYSEgKCVkKVxuIiwgaSk7Ci0JfQotCS8qIFNldCBMRUQgb24vb2ZmIHRpbWUgKi8KLQlpZiAocHdjX3NldF9sZWRzKHBkZXYsIGxlZF9vbiwgbGVkX29mZikgPCAwKQotCQlQV0NfREVCVUdfT1BFTigiRmFpbGVkIHRvIHNldCBMRUQgb24vb2ZmIHRpbWUuXG4iKTsKLQotCi0JLyogU28gZmFyLCBzbyBnb29kLiBBbGxvY2F0ZSBtZW1vcnkuICovCi0JaSA9IHB3Y19hbGxvY2F0ZV9idWZmZXJzKHBkZXYpOwotCWlmIChpIDwgMCkgewotCQlQV0NfREVCVUdfT1BFTigiRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlcnMgbWVtb3J5LlxuIik7Ci0JCXB3Y19mcmVlX2J1ZmZlcnMocGRldik7Ci0JCXJldHVybiBpOwotCX0KLQotCS8qIFJlc2V0IGJ1ZmZlcnMgJiBwYXJhbWV0ZXJzICovCi0JcHdjX3Jlc2V0X2J1ZmZlcnMocGRldik7Ci0JZm9yIChpID0gMDsgaSA8IHB3Y19tYnVmczsgaSsrKQotCQlwZGV2LT5pbWFnZV91c2VkW2ldID0gMDsKLQlwZGV2LT52ZnJhbWVfY291bnQgPSAwOwotCXBkZXYtPnZmcmFtZXNfZHVtcGVkID0gMDsKLQlwZGV2LT52ZnJhbWVzX2Vycm9yID0gMDsKLQlwZGV2LT52aXNvY19lcnJvcnMgPSAwOwotCXBkZXYtPmVycm9yX3N0YXR1cyA9IDA7Ci0JcHdjX2NvbnN0cnVjdChwZGV2KTsgLyogc2V0IG1pbi9tYXggc2l6ZXMgY29ycmVjdCAqLwotCi0JLyogU2V0IHNvbWUgZGVmYXVsdHMgKi8KLQlwZGV2LT52c25hcHNob3QgPSAwOwotCi0JLyogU2V0IHZpZGVvIHNpemUsIGZpcnN0IHRyeSB0aGUgbGFzdCB1c2VkIHZpZGVvIHNpemUKLQkgICAob3IgdGhlIGRlZmF1bHQgb25lKTsgaWYgdGhhdCBmYWlscyB0cnkgUUNJRi8xMCBvciBRU0lGLzEwOwotCSAgIGl0IHRoYXQgZmFpbHMgdG9vLCBnaXZlIHVwLgotCSAqLwotCWkgPSBwd2Nfc2V0X3ZpZGVvX21vZGUocGRldiwgcHdjX2ltYWdlX3NpemVzW3BkZXYtPnZzaXplXS54LCBwd2NfaW1hZ2Vfc2l6ZXNbcGRldi0+dnNpemVdLnksIHBkZXYtPnZmcmFtZXMsIHBkZXYtPnZjb21wcmVzc2lvbiwgMCk7Ci0JaWYgKGkpCXsKLQkJdW5zaWduZWQgaW50IGRlZmF1bHRfcmVzb2x1dGlvbjsKLQkJUFdDX0RFQlVHX09QRU4oIkZpcnN0IGF0dGVtcHQgYXQgc2V0X3ZpZGVvX21vZGUgZmFpbGVkLlxuIik7Ci0JCWlmIChwZGV2LT50eXBlPj0gNzMwKQotCQkJZGVmYXVsdF9yZXNvbHV0aW9uID0gUFNaX1FTSUY7Ci0JCWVsc2UKLQkJCWRlZmF1bHRfcmVzb2x1dGlvbiA9IFBTWl9RQ0lGOwotCi0JCWkgPSBwd2Nfc2V0X3ZpZGVvX21vZGUocGRldiwKLQkJCQkgICAgICAgcHdjX2ltYWdlX3NpemVzW2RlZmF1bHRfcmVzb2x1dGlvbl0ueCwKLQkJCQkgICAgICAgcHdjX2ltYWdlX3NpemVzW2RlZmF1bHRfcmVzb2x1dGlvbl0ueSwKLQkJCQkgICAgICAgMTAsCi0JCQkJICAgICAgIHBkZXYtPnZjb21wcmVzc2lvbiwKLQkJCQkgICAgICAgMCk7Ci0JfQotCWlmIChpKSB7Ci0JCVBXQ19ERUJVR19PUEVOKCJTZWNvbmQgYXR0ZW1wdCBhdCBzZXRfdmlkZW9fbW9kZSBmYWlsZWQuXG4iKTsKLQkJcHdjX2ZyZWVfYnVmZmVycyhwZGV2KTsKLQkJcmV0dXJuIGk7Ci0JfQotCi0JLyogSW5pdGlhbGl6ZSB0aGUgd2ViY2FtIHRvIHNhbmUgdmFsdWUgKi8KLQlwd2Nfc2V0X2JyaWdodG5lc3MocGRldiwgMHg3ZmZmKTsKLQlwd2Nfc2V0X2FnYyhwZGV2LCAxLCAwKTsKLQotCXBkZXYtPnZvcGVuKys7CiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gdmRldjsKIAlQV0NfREVCVUdfT1BFTigiPDwgdmlkZW9fb3BlbigpIHJldHVybnMgMC5cbiIpOwogCXJldHVybiAwOwpAQCAtMTE1OCwyMzkgKzY3MCwyMTEgQEAKIAkJaWYgKGRldmljZV9oaW50W2hpbnRdLnBkZXYgPT0gcGRldikKIAkJCWRldmljZV9oaW50W2hpbnRdLnBkZXYgPSBOVUxMOwogCisJLyogRnJlZSBpbnRlcm1lZGlhdGUgZGVjb21wcmVzc2lvbiBidWZmZXIgJiB0YWJsZXMgKi8KKwlpZiAocGRldi0+ZGVjb21wcmVzc19kYXRhICE9IE5VTEwpIHsKKwkJUFdDX0RFQlVHX01FTU9SWSgiRnJlZWluZyBkZWNvbXByZXNzaW9uIGJ1ZmZlciBhdCAlcC5cbiIsCisJCQkJIHBkZXYtPmRlY29tcHJlc3NfZGF0YSk7CisJCWtmcmVlKHBkZXYtPmRlY29tcHJlc3NfZGF0YSk7CisJCXBkZXYtPmRlY29tcHJlc3NfZGF0YSA9IE5VTEw7CisJfQorCisJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmcGRldi0+Y3RybF9oYW5kbGVyKTsKKwogCWtmcmVlKHBkZXYpOwogfQogCi0vKiBOb3RlIHRoYXQgYWxsIGNsZWFudXAgaXMgZG9uZSBpbiB0aGUgcmV2ZXJzZSBvcmRlciBhcyBpbiBfb3BlbiAqLwogc3RhdGljIGludCBwd2NfdmlkZW9fY2xvc2Uoc3RydWN0IGZpbGUgKmZpbGUpCiB7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldjsKLQlpbnQgaTsKIAogCVBXQ19ERUJVR19PUEVOKCI+PiB2aWRlb19jbG9zZSBjYWxsZWQodmRldiA9IDB4JXApLlxuIiwgdmRldik7CiAKIAlwZGV2ID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7Ci0JaWYgKHBkZXYtPnZvcGVuID09IDApCi0JCVBXQ19ERUJVR19NT0RVTEUoInZpZGVvX2Nsb3NlKCkgY2FsbGVkIG9uIGNsb3NlZCBkZXZpY2U/XG4iKTsKLQotCS8qIER1bXAgc3RhdGlzdGljcywgYnV0IG9ubHkgaWYgYSByZWFzb25hYmxlIGFtb3VudCBvZiBmcmFtZXMgd2VyZQotCSAgIHByb2Nlc3NlZCAodG8gcHJldmVudCBlbmRsZXNzIGxvZy1lbnRyaWVzIGluIGNhc2Ugb2Ygc25hcC1zaG90Ci0JICAgcHJvZ3JhbXMpCi0JICovCi0JaWYgKHBkZXYtPnZmcmFtZV9jb3VudCA+IDIwKQotCQlQV0NfREVCVUdfTU9EVUxFKCJDbG9zaW5nIHZpZGVvIGRldmljZTogJWQgZnJhbWVzIHJlY2VpdmVkLCBkdW1wZWQgJWQgZnJhbWVzLCAlZCBmcmFtZXMgd2l0aCBlcnJvcnMuXG4iLCBwZGV2LT52ZnJhbWVfY291bnQsIHBkZXYtPnZmcmFtZXNfZHVtcGVkLCBwZGV2LT52ZnJhbWVzX2Vycm9yKTsKLQotCWlmIChERVZJQ0VfVVNFX0NPREVDMShwZGV2LT50eXBlKSkKLQkgICAgcHdjX2RlYzFfZXhpdCgpOwotCWVsc2UKLQkgICAgcHdjX2RlYzIzX2V4aXQoKTsKLQotCXB3Y19pc29jX2NsZWFudXAocGRldik7Ci0JcHdjX2ZyZWVfYnVmZmVycyhwZGV2KTsKLQotCS8qIFR1cm4gb2ZmIExFRFMgYW5kIHBvd2VyIGRvd24gY2FtZXJhLCBidXQgb25seSB3aGVuIG5vdCB1bnBsdWdnZWQgKi8KLQlpZiAoIXBkZXYtPnVucGx1Z2dlZCkgewotCQkvKiBUdXJuIExFRHMgb2ZmICovCi0JCWlmIChwd2Nfc2V0X2xlZHMocGRldiwgMCwgMCkgPCAwKQotCQkJUFdDX0RFQlVHX01PRFVMRSgiRmFpbGVkIHRvIHNldCBMRUQgb24vb2ZmIHRpbWUuXG4iKTsKLQkJaWYgKHBvd2VyX3NhdmUpIHsKLQkJCWkgPSBwd2NfY2FtZXJhX3Bvd2VyKHBkZXYsIDApOwotCQkJaWYgKGkgPCAwKQotCQkJCVBXQ19FUlJPUigiRmFpbGVkIHRvIHBvd2VyIGRvd24gY2FtZXJhICglZClcbiIsIGkpOwotCQl9Ci0JCXBkZXYtPnZvcGVuLS07Ci0JCVBXQ19ERUJVR19PUEVOKCI8PCB2aWRlb19jbG9zZSgpIHZvcGVuPSVkXG4iLCBwZGV2LT52b3Blbik7CisJaWYgKHBkZXYtPmNhcHRfZmlsZSA9PSBmaWxlKSB7CisJCXZiMl9xdWV1ZV9yZWxlYXNlKCZwZGV2LT52Yl9xdWV1ZSk7CisJCXBkZXYtPmNhcHRfZmlsZSA9IE5VTEw7CiAJfQogCisJUFdDX0RFQlVHX09QRU4oIjw8IHZpZGVvX2Nsb3NlKClcbiIpOwogCXJldHVybiAwOwogfQogCi0vKgotICoJRklYTUU6IHdoYXQgYWJvdXQgdHdvIHBhcmFsbGVsIHJlYWRzID8/Pz8KLSAqICAgICAgQU5TV0VSOiBOb3Qgc3VwcG9ydGVkLiBZb3UgY2FuJ3Qgb3BlbiB0aGUgZGV2aWNlIG1vcmUgdGhhbiBvbmNlLAotCQlkZXNwaXRlIHdoYXQgdGhlIFY0TDEgaW50ZXJmYWNlIHNheXMuIEZpcnN0LCBJIGRvbid0IHNlZQotCQl0aGUgbmVlZCwgc2Vjb25kIHRoZXJlJ3Mgbm8gbWVjaGFuaXNtIG9mIGFsZXJ0aW5nIHRoZQotCQkybmQvM3JkLy4uLiBwcm9jZXNzIG9mIGV2ZW50cyBsaWtlIGNoYW5naW5nIGltYWdlIHNpemUuCi0JCUFuZCBJIGRvbid0IHNlZSB0aGUgcG9pbnQgb2YgYmxvY2tpbmcgdGhhdCBmb3IgdGhlCi0JCTJuZC8zcmQvLi4uIHByb2Nlc3MuCi0JCUluIG11bHRpLXRocmVhZGVkIGVudmlyb25tZW50cyByZWFkaW5nIHBhcmFsbGVsIGZyb20gYW55Ci0JCWRldmljZSBpcyB0cmlja3kgYW55aG93LgotICovCi0KIHN0YXRpYyBzc2l6ZV90IHB3Y192aWRlb19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAotCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKKwkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHB3Y19kZXZpY2UgKnBkZXY7Ci0JaW50IG5vYmxvY2sgPSBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSzsKLQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKLQlpbnQgYnl0ZXNfdG9fcmVhZCwgcnYgPSAwOwotCXZvaWQgKmltYWdlX2J1ZmZlcl9hZGRyOworCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7CiAKLQlQV0NfREVCVUdfUkVBRCgicHdjX3ZpZGVvX3JlYWQodmRldj0weCVwLCBidWY9JXAsIGNvdW50PSV6ZCkgY2FsbGVkLlxuIiwKLQkJCXZkZXYsIGJ1ZiwgY291bnQpOwotCWlmICh2ZGV2ID09IE5VTEwpCi0JCXJldHVybiAtRUZBVUxUOwotCXBkZXYgPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKLQlpZiAocGRldiA9PSBOVUxMKQotCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoIXBkZXYtPnVkZXYpCisJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKHBkZXYtPmVycm9yX3N0YXR1cykgewotCQlydiA9IC1wZGV2LT5lcnJvcl9zdGF0dXM7IC8qIFNvbWV0aGluZyBoYXBwZW5lZCwgcmVwb3J0IHdoYXQuICovCi0JCWdvdG8gZXJyX291dDsKLQl9CisJaWYgKHBkZXYtPmNhcHRfZmlsZSAhPSBOVUxMICYmCisJICAgIHBkZXYtPmNhcHRfZmlsZSAhPSBmaWxlKQorCQlyZXR1cm4gLUVCVVNZOwogCi0JLyogU3RhcnQgdGhlIHN0cmVhbSAoaWYgbm90IGFscmVhZHkgc3RhcnRlZCkgKi8KLQlydiA9IHB3Y19pc29jX2luaXQocGRldik7Ci0JaWYgKHJ2KQotCQlnb3RvIGVycl9vdXQ7CisJcGRldi0+Y2FwdF9maWxlID0gZmlsZTsKIAotCS8qIEluIGNhc2Ugd2UncmUgZG9pbmcgcGFydGlhbCByZWFkcywgd2UgZG9uJ3QgaGF2ZSB0byB3YWl0IGZvciBhIGZyYW1lICovCi0JaWYgKHBkZXYtPmltYWdlX3JlYWRfcG9zID09IDApIHsKLQkJLyogRG8gd2FpdCBxdWV1ZWluZyBhY2NvcmRpbmcgdG8gdGhlIChkb2MpYm9vayAqLwotCQlhZGRfd2FpdF9xdWV1ZSgmcGRldi0+ZnJhbWVxLCAmd2FpdCk7Ci0JCXdoaWxlIChwZGV2LT5mdWxsX2ZyYW1lcyA9PSBOVUxMKSB7Ci0JCQkvKiBDaGVjayBmb3IgdW5wbHVnZ2VkL2V0Yy4gaGVyZSAqLwotCQkJaWYgKHBkZXYtPmVycm9yX3N0YXR1cykgewotCQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZwZGV2LT5mcmFtZXEsICZ3YWl0KTsKLQkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCQkJCXJ2ID0gLXBkZXYtPmVycm9yX3N0YXR1cyA7Ci0JCQkJZ290byBlcnJfb3V0OwotCQkJfQotCQkJaWYgKG5vYmxvY2spIHsKLQkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcGRldi0+ZnJhbWVxLCAmd2FpdCk7Ci0JCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQkJCQlydiA9IC1FV09VTERCTE9DSzsKLQkJCQlnb3RvIGVycl9vdXQ7Ci0JCQl9Ci0JCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcGRldi0+ZnJhbWVxLCAmd2FpdCk7Ci0JCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQkJCQlydiA9IC1FUkVTVEFSVFNZUzsKLQkJCQlnb3RvIGVycl9vdXQ7Ci0JCQl9Ci0JCQltdXRleF91bmxvY2soJnBkZXYtPm1vZGxvY2spOwotCQkJc2NoZWR1bGUoKTsKLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCQltdXRleF9sb2NrKCZwZGV2LT5tb2Rsb2NrKTsKLQkJfQotCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcGRldi0+ZnJhbWVxLCAmd2FpdCk7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0KLQkJLyogRGVjb21wcmVzcyBhbmQgcmVsZWFzZSBmcmFtZSAqLwotCQlpZiAocHdjX2hhbmRsZV9mcmFtZShwZGV2KSkgewotCQkJcnYgPSAtRUZBVUxUOwotCQkJZ290byBlcnJfb3V0OwotCQl9Ci0JfQotCi0JUFdDX0RFQlVHX1JFQUQoIkNvcHlpbmcgZGF0YSB0byB1c2VyIHNwYWNlLlxuIik7Ci0JaWYgKHBkZXYtPnBpeGZtdCAhPSBWNEwyX1BJWF9GTVRfWVVWNDIwKQotCQlieXRlc190b19yZWFkID0gcGRldi0+ZnJhbWVfc2l6ZSArIHNpemVvZihzdHJ1Y3QgcHdjX3Jhd19mcmFtZSk7Ci0JZWxzZQotCQlieXRlc190b19yZWFkID0gcGRldi0+dmlldy5zaXplOwotCi0JLyogY29weSBieXRlcyB0byB1c2VyIHNwYWNlOyB3ZSBhbGxvdyBmb3IgcGFydGlhbCByZWFkcyAqLwotCWlmIChjb3VudCArIHBkZXYtPmltYWdlX3JlYWRfcG9zID4gYnl0ZXNfdG9fcmVhZCkKLQkJY291bnQgPSBieXRlc190b19yZWFkIC0gcGRldi0+aW1hZ2VfcmVhZF9wb3M7Ci0JaW1hZ2VfYnVmZmVyX2FkZHIgPSBwZGV2LT5pbWFnZV9kYXRhOwotCWltYWdlX2J1ZmZlcl9hZGRyICs9IHBkZXYtPmltYWdlc1twZGV2LT5maWxsX2ltYWdlXS5vZmZzZXQ7Ci0JaW1hZ2VfYnVmZmVyX2FkZHIgKz0gcGRldi0+aW1hZ2VfcmVhZF9wb3M7Ci0JaWYgKGNvcHlfdG9fdXNlcihidWYsIGltYWdlX2J1ZmZlcl9hZGRyLCBjb3VudCkpIHsKLQkJcnYgPSAtRUZBVUxUOwotCQlnb3RvIGVycl9vdXQ7Ci0JfQotCXBkZXYtPmltYWdlX3JlYWRfcG9zICs9IGNvdW50OwotCWlmIChwZGV2LT5pbWFnZV9yZWFkX3BvcyA+PSBieXRlc190b19yZWFkKSB7IC8qIEFsbCBkYXRhIGhhcyBiZWVuIHJlYWQgKi8KLQkJcGRldi0+aW1hZ2VfcmVhZF9wb3MgPSAwOwotCQlwd2NfbmV4dF9pbWFnZShwZGV2KTsKLQl9Ci0JcmV0dXJuIGNvdW50OwotZXJyX291dDoKLQlyZXR1cm4gcnY7CisJcmV0dXJuIHZiMl9yZWFkKCZwZGV2LT52Yl9xdWV1ZSwgYnVmLCBjb3VudCwgcHBvcywKKwkJCWZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBwd2NfdmlkZW9fcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2OwotCWludCByZXQ7CisJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKIAotCWlmICh2ZGV2ID09IE5VTEwpCi0JCXJldHVybiAtRUZBVUxUOwotCXBkZXYgPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKLQlpZiAocGRldiA9PSBOVUxMKQotCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoIXBkZXYtPnVkZXYpCisJCXJldHVybiBQT0xMX0VSUjsKIAotCS8qIFN0YXJ0IHRoZSBzdHJlYW0gKGlmIG5vdCBhbHJlYWR5IHN0YXJ0ZWQpICovCi0JcmV0ID0gcHdjX2lzb2NfaW5pdChwZGV2KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcG9sbF93YWl0KGZpbGUsICZwZGV2LT5mcmFtZXEsIHdhaXQpOwotCWlmIChwZGV2LT5lcnJvcl9zdGF0dXMpCi0JCXJldHVybiBQT0xMRVJSOwotCWlmIChwZGV2LT5mdWxsX2ZyYW1lcyAhPSBOVUxMKSAvKiB3ZSBoYXZlIGZyYW1lcyB3YWl0aW5nICovCi0JCXJldHVybiAoUE9MTElOIHwgUE9MTFJETk9STSk7Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gdmIyX3BvbGwoJnBkZXYtPnZiX3F1ZXVlLCBmaWxlLCB3YWl0KTsKIH0KIAogc3RhdGljIGludCBwd2NfdmlkZW9fbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCiB7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldjsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0OwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQl1bnNpZ25lZCBsb25nIHBhZ2UsIHBvcyA9IDA7Ci0JaW50IGluZGV4OworCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7CiAKLQlQV0NfREVCVUdfTUVNT1JZKCI+PiAlc1xuIiwgX19mdW5jX18pOwotCXBkZXYgPSB2aWRlb19nZXRfZHJ2ZGF0YSh2ZGV2KTsKLQlzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OwotCXN0YXJ0ID0gdm1hLT52bV9zdGFydDsKKwlpZiAocGRldi0+Y2FwdF9maWxlICE9IGZpbGUpCisJCXJldHVybiAtRUJVU1k7CiAKLQkvKiBGaW5kIHRoZSBpZHggYnVmZmVyIGZvciB0aGlzIG1hcHBpbmcgKi8KLQlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBwd2NfbWJ1ZnM7IGluZGV4KyspIHsKLQkJcG9zID0gcGRldi0+aW1hZ2VzW2luZGV4XS5vZmZzZXQ7Ci0JCWlmICgocG9zPj5QQUdFX1NISUZUKSA9PSB2bWEtPnZtX3Bnb2ZmKQotCQkJYnJlYWs7Ci0JfQotCWlmIChpbmRleCA9PSBNQVhfSU1BR0VTKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoaW5kZXggPT0gMCkgewotCQkvKgotCQkgKiBTcGVjaWFsIGNhc2UgZm9yIHY0bDEuIEluIHY0bDEsIHdlIG1hcCBvbmx5IG9uZSBiaWcgYnVmZmVyLAotCQkgKiBidXQgaW4gdjRsMiBlYWNoIGJ1ZmZlciBpcyBtYXBwZWQKLQkJICovCi0JCXVuc2lnbmVkIGxvbmcgdG90YWxfc2l6ZTsKLQkJdG90YWxfc2l6ZSA9IHB3Y19tYnVmcyAqIHBkZXYtPmxlbl9wZXJfaW1hZ2U7Ci0JCWlmIChzaXplICE9IHBkZXYtPmxlbl9wZXJfaW1hZ2UgJiYgc2l6ZSAhPSB0b3RhbF9zaXplKSB7Ci0JCQlQV0NfRVJST1IoIldyb25nIHNpemUgKCVsdSkgbmVlZGVkIHRvIGJlIGxlbl9wZXJfaW1hZ2U9JWQgb3IgdG90YWxfc2l6ZT0lbHVcbiIsCi0JCQkJICAgc2l6ZSwgcGRldi0+bGVuX3Blcl9pbWFnZSwgdG90YWxfc2l6ZSk7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0gZWxzZSBpZiAoc2l6ZSA+IHBkZXYtPmxlbl9wZXJfaW1hZ2UpCi0JCXJldHVybiAtRUlOVkFMOworCXJldHVybiB2YjJfbW1hcCgmcGRldi0+dmJfcXVldWUsIHZtYSk7Cit9CiAKLQl2bWEtPnZtX2ZsYWdzIHw9IFZNX0lPOwkvKiBmcm9tIDIuNi45LWFjWCAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFZpZGVvYnVmMiBvcGVyYXRpb25zICovCiAKLQlwb3MgKz0gKHVuc2lnbmVkIGxvbmcpcGRldi0+aW1hZ2VfZGF0YTsKLQl3aGlsZSAoc2l6ZSA+IDApIHsKLQkJcGFnZSA9IHZtYWxsb2NfdG9fcGZuKCh2b2lkICopcG9zKTsKLQkJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHN0YXJ0LCBwYWdlLCBQQUdFX1NJWkUsIFBBR0VfU0hBUkVEKSkKLQkJCXJldHVybiAtRUFHQUlOOwotCQlzdGFydCArPSBQQUdFX1NJWkU7Ci0JCXBvcyArPSBQQUdFX1NJWkU7Ci0JCWlmIChzaXplID4gUEFHRV9TSVpFKQotCQkJc2l6ZSAtPSBQQUdFX1NJWkU7Ci0JCWVsc2UKLQkJCXNpemUgPSAwOwotCX0KK3N0YXRpYyBpbnQgcXVldWVfc2V0dXAoc3RydWN0IHZiMl9xdWV1ZSAqdnEsIHVuc2lnbmVkIGludCAqbmJ1ZmZlcnMsCisJCQkJdW5zaWduZWQgaW50ICpucGxhbmVzLCB1bnNpZ25lZCBsb25nIHNpemVzW10sCisJCQkJdm9pZCAqYWxsb2NfY3R4c1tdKQoreworCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gdmIyX2dldF9kcnZfcHJpdih2cSk7CisKKwlpZiAoKm5idWZmZXJzIDwgTUlOX0ZSQU1FUykKKwkJKm5idWZmZXJzID0gTUlOX0ZSQU1FUzsKKwllbHNlIGlmICgqbmJ1ZmZlcnMgPiBNQVhfRlJBTUVTKQorCQkqbmJ1ZmZlcnMgPSBNQVhfRlJBTUVTOworCisJKm5wbGFuZXMgPSAxOworCisJc2l6ZXNbMF0gPSBQQUdFX0FMSUdOKChwZGV2LT5hYnNfbWF4LnggKiBwZGV2LT5hYnNfbWF4LnkgKiAzKSAvIDIpOworCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYnVmZmVyX2luaXQoc3RydWN0IHZiMl9idWZmZXIgKnZiKQoreworCXN0cnVjdCBwd2NfZnJhbWVfYnVmICpidWYgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBwd2NfZnJhbWVfYnVmLCB2Yik7CisKKwkvKiBuZWVkIHZtYWxsb2Mgc2luY2UgZnJhbWUgYnVmZmVyID4gMTI4SyAqLworCWJ1Zi0+ZGF0YSA9IHZ6YWxsb2MoUFdDX0ZSQU1FX1NJWkUpOworCWlmIChidWYtPmRhdGEgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBidWZmZXJfcHJlcGFyZShzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPSB2YjJfZ2V0X2Rydl9wcml2KHZiLT52YjJfcXVldWUpOworCisJLyogRG9uJ3QgYWxsb3cgcXVlaW5nIG5ldyBidWZmZXJzIGFmdGVyIGRldmljZSBkaXNjb25uZWN0aW9uICovCisJaWYgKCFwZGV2LT51ZGV2KQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ1ZmZlcl9maW5pc2goc3RydWN0IHZiMl9idWZmZXIgKnZiKQoreworCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gdmIyX2dldF9kcnZfcHJpdih2Yi0+dmIyX3F1ZXVlKTsKKwlzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiAqYnVmID0gY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiwgdmIpOworCisJLyoKKwkgKiBBcHBsaWNhdGlvbiBoYXMgY2FsbGVkIGRxYnVmIGFuZCBpcyBnZXR0aW5nIGJhY2sgYSBidWZmZXIgd2UndmUKKwkgKiBmaWxsZWQsIHRha2UgdGhlIHB3YyBkYXRhIHdlJ3ZlIHN0b3JlZCBpbiBidWYtPmRhdGEgYW5kIGRlY29tcHJlc3MKKwkgKiBpdCBpbnRvIGEgdXNhYmxlIGZvcm1hdCwgc3RvcmluZyB0aGUgcmVzdWx0IGluIHRoZSB2YjJfYnVmZmVyCisJICovCisJcmV0dXJuIHB3Y19kZWNvbXByZXNzKHBkZXYsIGJ1Zik7Cit9CisKK3N0YXRpYyB2b2lkIGJ1ZmZlcl9jbGVhbnVwKHN0cnVjdCB2YjJfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiAqYnVmID0gY29udGFpbmVyX29mKHZiLCBzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiwgdmIpOworCisJdmZyZWUoYnVmLT5kYXRhKTsKK30KKworc3RhdGljIHZvaWQgYnVmZmVyX3F1ZXVlKHN0cnVjdCB2YjJfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IHZiMl9nZXRfZHJ2X3ByaXYodmItPnZiMl9xdWV1ZSk7CisJc3RydWN0IHB3Y19mcmFtZV9idWYgKmJ1ZiA9IGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IHB3Y19mcmFtZV9idWYsIHZiKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwZGV2LT5xdWV1ZWRfYnVmc19sb2NrLCBmbGFncyk7CisJbGlzdF9hZGRfdGFpbCgmYnVmLT5saXN0LCAmcGRldi0+cXVldWVkX2J1ZnMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkZXYtPnF1ZXVlZF9idWZzX2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBzdGFydF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqdnEpCit7CisJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPSB2YjJfZ2V0X2Rydl9wcml2KHZxKTsKKworCWlmICghcGRldi0+dWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBUdXJuIG9uIGNhbWVyYSBhbmQgc2V0IExFRFMgb24gKi8KKwlwd2NfY2FtZXJhX3Bvd2VyKHBkZXYsIDEpOworCWlmIChwZGV2LT5wb3dlcl9zYXZlKSB7CisJCS8qIFJlc3RvcmUgdmlkZW8gbW9kZSAqLworCQlwd2Nfc2V0X3ZpZGVvX21vZGUocGRldiwgcGRldi0+dmlldy54LCBwZGV2LT52aWV3LnksCisJCQkJICAgcGRldi0+dmZyYW1lcywgcGRldi0+dmNvbXByZXNzaW9uLAorCQkJCSAgIHBkZXYtPnZzbmFwc2hvdCk7CisJfQorCXB3Y19zZXRfbGVkcyhwZGV2LCBsZWRfb24sIGxlZF9vZmYpOworCisJcmV0dXJuIHB3Y19pc29jX2luaXQocGRldik7Cit9CisKK3N0YXRpYyBpbnQgc3RvcF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqdnEpCit7CisJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPSB2YjJfZ2V0X2Rydl9wcml2KHZxKTsKKworCWlmIChwZGV2LT51ZGV2KSB7CisJCXB3Y19zZXRfbGVkcyhwZGV2LCAwLCAwKTsKKwkJcHdjX2NhbWVyYV9wb3dlcihwZGV2LCAwKTsKKwkJcHdjX2lzb2NfY2xlYW51cChwZGV2KTsKKwl9CisJcHdjX2NsZWFudXBfcXVldWVkX2J1ZnMocGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHdjX2xvY2soc3RydWN0IHZiMl9xdWV1ZSAqdnEpCit7CisJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPSB2YjJfZ2V0X2Rydl9wcml2KHZxKTsKKwltdXRleF9sb2NrKCZwZGV2LT5tb2Rsb2NrKTsKK30KKworc3RhdGljIHZvaWQgcHdjX3VubG9jayhzdHJ1Y3QgdmIyX3F1ZXVlICp2cSkKK3sKKwlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IHZiMl9nZXRfZHJ2X3ByaXYodnEpOworCW11dGV4X3VubG9jaygmcGRldi0+bW9kbG9jayk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdmIyX29wcyBwd2NfdmJfcXVldWVfb3BzID0geworCS5xdWV1ZV9zZXR1cAkJPSBxdWV1ZV9zZXR1cCwKKwkuYnVmX2luaXQJCT0gYnVmZmVyX2luaXQsCisJLmJ1Zl9wcmVwYXJlCQk9IGJ1ZmZlcl9wcmVwYXJlLAorCS5idWZfZmluaXNoCQk9IGJ1ZmZlcl9maW5pc2gsCisJLmJ1Zl9jbGVhbnVwCQk9IGJ1ZmZlcl9jbGVhbnVwLAorCS5idWZfcXVldWUJCT0gYnVmZmVyX3F1ZXVlLAorCS5zdGFydF9zdHJlYW1pbmcJPSBzdGFydF9zdHJlYW1pbmcsCisJLnN0b3Bfc3RyZWFtaW5nCQk9IHN0b3Bfc3RyZWFtaW5nLAorCS53YWl0X3ByZXBhcmUJCT0gcHdjX3VubG9jaywKKwkud2FpdF9maW5pc2gJCT0gcHdjX2xvY2ssCit9OworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogVVNCIGZ1bmN0aW9ucyAqLwogCkBAIC0xNDA2LDYgKzg5MCw3IEBACiAJaW50IGhpbnQsIHJjOwogCWludCBmZWF0dXJlcyA9IDA7CiAJaW50IHZpZGVvX25yID0gLTE7IC8qIGRlZmF1bHQ6IHVzZSBuZXh0IGF2YWlsYWJsZSBkZXZpY2UgKi8KKwlpbnQgbXlfcG93ZXJfc2F2ZSA9IHBvd2VyX3NhdmU7CiAJY2hhciBzZXJpYWxfbnVtYmVyWzMwXSwgKm5hbWU7CiAKIAl2ZW5kb3JfaWQgPSBsZTE2X3RvX2NwdSh1ZGV2LT5kZXNjcmlwdG9yLmlkVmVuZG9yKTsKQEAgLTE1MTMsNiArOTk4LDggQEAKIAkJCVBXQ19JTkZPKCJMb2dpdGVjaCBRdWlja0NhbSA0MDAwIFBybyBVU0Igd2ViY2FtIGRldGVjdGVkLlxuIik7CiAJCQluYW1lID0gIkxvZ2l0ZWNoIFF1aWNrQ2FtIFBybyA0MDAwIjsKIAkJCXR5cGVfaWQgPSA3NDA7IC8qIENDRCBzZW5zb3IgKi8KKwkJCWlmIChteV9wb3dlcl9zYXZlID09IC0xKQorCQkJCW15X3Bvd2VyX3NhdmUgPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgMHgwOGIzOgogCQkJUFdDX0lORk8oIkxvZ2l0ZWNoIFF1aWNrQ2FtIFpvb20gVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOwpAQCAtMTUyMywxMiArMTAxMCwxNSBAQAogCQkJUFdDX0lORk8oIkxvZ2l0ZWNoIFF1aWNrQ2FtIFpvb20gKG5ldyBtb2RlbCkgVVNCIHdlYmNhbSBkZXRlY3RlZC5cbiIpOwogCQkJbmFtZSA9ICJMb2dpdGVjaCBRdWlja0NhbSBab29tIjsKIAkJCXR5cGVfaWQgPSA3NDA7IC8qIENDRCBzZW5zb3IgKi8KLQkJCXBvd2VyX3NhdmUgPSAxOworCQkJaWYgKG15X3Bvd2VyX3NhdmUgPT0gLTEpCisJCQkJbXlfcG93ZXJfc2F2ZSA9IDE7CiAJCQlicmVhazsKIAkJY2FzZSAweDA4YjU6CiAJCQlQV0NfSU5GTygiTG9naXRlY2ggUXVpY2tDYW0gT3JiaXQvU3BoZXJlIFVTQiB3ZWJjYW0gZGV0ZWN0ZWQuXG4iKTsKIAkJCW5hbWUgPSAiTG9naXRlY2ggUXVpY2tDYW0gT3JiaXQiOwogCQkJdHlwZV9pZCA9IDc0MDsgLyogQ0NEIHNlbnNvciAqLworCQkJaWYgKG15X3Bvd2VyX3NhdmUgPT0gLTEpCisJCQkJbXlfcG93ZXJfc2F2ZSA9IDE7CiAJCQlmZWF0dXJlcyB8PSBGRUFUVVJFX01PVE9SX1BBTlRJTFQ7CiAJCQlicmVhazsKIAkJY2FzZSAweDA4YjY6CkBAIC0xNTgzLDYgKzEwNzMsOCBAQAogCQkJUFdDX0lORk8oIkNyZWF0aXZlIExhYnMgV2ViY2FtIDUgZGV0ZWN0ZWQuXG4iKTsKIAkJCW5hbWUgPSAiQ3JlYXRpdmUgTGFicyBXZWJjYW0gNSI7CiAJCQl0eXBlX2lkID0gNzMwOworCQkJaWYgKG15X3Bvd2VyX3NhdmUgPT0gLTEpCisJCQkJbXlfcG93ZXJfc2F2ZSA9IDE7CiAJCQlicmVhazsKIAkJY2FzZSAweDQwMTE6CiAJCQlQV0NfSU5GTygiQ3JlYXRpdmUgTGFicyBXZWJjYW0gUHJvIEV4IGRldGVjdGVkLlxuIik7CkBAIC0xNjQwLDYgKzExMzIsOSBAQAogCWVsc2UKIAkJcmV0dXJuIC1FTk9ERVY7IC8qIE5vdCBhbnkgb2YgdGhlIGtub3cgdHlwZXM7IGJ1dCB0aGUgbGlzdCBrZWVwcyBncm93aW5nLiAqLwogCisJaWYgKG15X3Bvd2VyX3NhdmUgPT0gLTEpCisJCW15X3Bvd2VyX3NhdmUgPSAwOworCiAJbWVtc2V0KHNlcmlhbF9udW1iZXIsIDAsIDMwKTsKIAl1c2Jfc3RyaW5nKHVkZXYsIHVkZXYtPmRlc2NyaXB0b3IuaVNlcmlhbE51bWJlciwgc2VyaWFsX251bWJlciwgMjkpOwogCVBXQ19ERUJVR19QUk9CRSgiRGV2aWNlIHNlcmlhbCBudW1iZXIgaXMgJXNcbiIsIHNlcmlhbF9udW1iZXIpOwpAQCAtMTY1NCw3ICsxMTQ5LDYgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXBkZXYtPnR5cGUgPSB0eXBlX2lkOwotCXBkZXYtPnZzaXplID0gZGVmYXVsdF9zaXplOwogCXBkZXYtPnZmcmFtZXMgPSBkZWZhdWx0X2ZwczsKIAlzdHJjcHkocGRldi0+c2VyaWFsLCBzZXJpYWxfbnVtYmVyKTsKIAlwZGV2LT5mZWF0dXJlcyA9IGZlYXR1cmVzOwpAQCAtMTY2OCwxMyArMTE2MiwyNiBAQAogCQlwZGV2LT5hbmdsZV9yYW5nZS50aWx0X21pbiA9IC0zMDAwOwogCQlwZGV2LT5hbmdsZV9yYW5nZS50aWx0X21heCA9ICAyNTAwOwogCX0KKwlwd2NfY29uc3RydWN0KHBkZXYpOyAvKiBzZXQgbWluL21heCBzaXplcyBjb3JyZWN0ICovCiAKIAltdXRleF9pbml0KCZwZGV2LT5tb2Rsb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmcGRldi0+cHRybG9jayk7CisJbXV0ZXhfaW5pdCgmcGRldi0+dWRldmxvY2spOworCXNwaW5fbG9ja19pbml0KCZwZGV2LT5xdWV1ZWRfYnVmc19sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmcGRldi0+cXVldWVkX2J1ZnMpOwogCiAJcGRldi0+dWRldiA9IHVkZXY7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmcGRldi0+ZnJhbWVxKTsKIAlwZGV2LT52Y29tcHJlc3Npb24gPSBwd2NfcHJlZmVycmVkX2NvbXByZXNzaW9uOworCXBkZXYtPnBvd2VyX3NhdmUgPSBteV9wb3dlcl9zYXZlOworCisJLyogSW5pdCB2aWRlb2J1ZjIgcXVldWUgc3RydWN0dXJlICovCisJbWVtc2V0KCZwZGV2LT52Yl9xdWV1ZSwgMCwgc2l6ZW9mKHBkZXYtPnZiX3F1ZXVlKSk7CisJcGRldi0+dmJfcXVldWUudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKKwlwZGV2LT52Yl9xdWV1ZS5pb19tb2RlcyA9IFZCMl9NTUFQIHwgVkIyX1VTRVJQVFIgfCBWQjJfUkVBRDsKKwlwZGV2LT52Yl9xdWV1ZS5kcnZfcHJpdiA9IHBkZXY7CisJcGRldi0+dmJfcXVldWUuYnVmX3N0cnVjdF9zaXplID0gc2l6ZW9mKHN0cnVjdCBwd2NfZnJhbWVfYnVmKTsKKwlwZGV2LT52Yl9xdWV1ZS5vcHMgPSAmcHdjX3ZiX3F1ZXVlX29wczsKKwlwZGV2LT52Yl9xdWV1ZS5tZW1fb3BzID0gJnZiMl92bWFsbG9jX21lbW9wczsKKwl2YjJfcXVldWVfaW5pdCgmcGRldi0+dmJfcXVldWUpOwogCiAJLyogSW5pdCB2aWRlb19kZXZpY2Ugc3RydWN0dXJlICovCiAJbWVtY3B5KCZwZGV2LT52ZGV2LCAmcHdjX3RlbXBsYXRlLCBzaXplb2YocHdjX3RlbXBsYXRlKSk7CkBAIC0xNzA3LDE0ICsxMjE0LDQwIEBACiAJUFdDX0RFQlVHX1BST0JFKCJwcm9iZSgpIGZ1bmN0aW9uIHJldHVybmluZyBzdHJ1Y3QgYXQgMHglcC5cbiIsIHBkZXYpOwogCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgcGRldik7CiAKKyNpZmRlZiBDT05GSUdfVVNCX1BXQ19ERUJVRworCS8qIFF1ZXJ5IHNlbnNvciB0eXBlICovCisJaWYgKHB3Y19nZXRfY21vc19zZW5zb3IocGRldiwgJnJjKSA+PSAwKSB7CisJCVBXQ19ERUJVR19PUEVOKCJUaGlzICVzIGNhbWVyYSBpcyBlcXVpcHBlZCB3aXRoIGEgJXMgKCVkKS5cbiIsCisJCQkJcGRldi0+dmRldi5uYW1lLAorCQkJCXB3Y19zZW5zb3JfdHlwZV90b19zdHJpbmcocmMpLCByYyk7CisJfQorI2VuZGlmCisKIAkvKiBTZXQgdGhlIGxlZHMgb2ZmICovCiAJcHdjX3NldF9sZWRzKHBkZXYsIDAsIDApOworCisJLyogU2V0dXAgaW50aWFsIHZpZGVvbW9kZSAqLworCXJjID0gcHdjX3NldF92aWRlb19tb2RlKHBkZXYsIHBkZXYtPnZpZXdfbWF4LngsIHBkZXYtPnZpZXdfbWF4LnksCisJCQkJcGRldi0+dmZyYW1lcywgcGRldi0+dmNvbXByZXNzaW9uLCAwKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX2ZyZWVfbWVtOworCisJLyogUmVnaXN0ZXIgY29udHJvbHMgKGFuZCByZWFkIGRlZmF1bHQgdmFsdWVzIGZyb20gY2FtZXJhICovCisJcmMgPSBwd2NfaW5pdF9jb250cm9scyhwZGV2KTsKKwlpZiAocmMpIHsKKwkJUFdDX0VSUk9SKCJGYWlsZWQgdG8gcmVnaXN0ZXIgdjRsMiBjb250cm9scyAoJWQpLlxuIiwgcmMpOworCQlnb3RvIGVycl9mcmVlX21lbTsKKwl9CisKKwlwZGV2LT52ZGV2LmN0cmxfaGFuZGxlciA9ICZwZGV2LT5jdHJsX2hhbmRsZXI7CisKKwkvKiBBbmQgcG93ZXJkb3duIHRoZSBjYW1lcmEgdW50aWwgc3RyZWFtaW5nIHN0YXJ0cyAqLwogCXB3Y19jYW1lcmFfcG93ZXIocGRldiwgMCk7CiAKIAlyYyA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZSgmcGRldi0+dmRldiwgVkZMX1RZUEVfR1JBQkJFUiwgdmlkZW9fbnIpOwogCWlmIChyYyA8IDApIHsKIAkJUFdDX0VSUk9SKCJGYWlsZWQgdG8gcmVnaXN0ZXIgYXMgdmlkZW8gZGV2aWNlICglZCkuXG4iLCByYyk7Ci0JCWdvdG8gZXJyX2ZyZWVfbWVtOworCQlnb3RvIGVycl9mcmVlX2NvbnRyb2xzOwogCX0KIAlyYyA9IHB3Y19jcmVhdGVfc3lzZnNfZmlsZXMocGRldik7CiAJaWYgKHJjKQpAQCAtMTc1Nyw3ICsxMjkwLDEwIEBACiAJaWYgKGhpbnQgPCBNQVhfREVWX0hJTlRTKQogCQlkZXZpY2VfaGludFtoaW50XS5wZGV2ID0gTlVMTDsKIAl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgmcGRldi0+dmRldik7CitlcnJfZnJlZV9jb250cm9sczoKKwl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZwZGV2LT5jdHJsX2hhbmRsZXIpOwogZXJyX2ZyZWVfbWVtOgorCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CiAJa2ZyZWUocGRldik7CiAJcmV0dXJuIHJjOwogfQpAQCAtMTc2NywzMyArMTMwMywxNyBAQAogewogCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ICA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CiAKKwltdXRleF9sb2NrKCZwZGV2LT51ZGV2bG9jayk7CiAJbXV0ZXhfbG9jaygmcGRldi0+bW9kbG9jayk7Ci0JdXNiX3NldF9pbnRmZGF0YSAoaW50ZiwgTlVMTCk7Ci0JaWYgKHBkZXYgPT0gTlVMTCkgewotCQlQV0NfRVJST1IoInB3Y19kaXNjb25uZWN0KCkgQ2FsbGVkIHdpdGhvdXQgcHJpdmF0ZSBwb2ludGVyLlxuIik7Ci0JCWdvdG8gZGlzY29ubmVjdF9vdXQ7Ci0JfQotCWlmIChwZGV2LT51ZGV2ID09IE5VTEwpIHsKLQkJUFdDX0VSUk9SKCJwd2NfZGlzY29ubmVjdCgpIGFscmVhZHkgY2FsbGVkIGZvciAlcFxuIiwgcGRldik7Ci0JCWdvdG8gZGlzY29ubmVjdF9vdXQ7Ci0JfQotCWlmIChwZGV2LT51ZGV2ICE9IGludGVyZmFjZV90b191c2JkZXYoaW50ZikpIHsKLQkJUFdDX0VSUk9SKCJwd2NfZGlzY29ubmVjdCgpIFdvb3BzOiBwb2ludGVyIG1pc21hdGNoIHVkZXYvcGRldi5cbiIpOwotCQlnb3RvIGRpc2Nvbm5lY3Rfb3V0OwotCX0KIAotCS8qIFdlIGdvdCB1bnBsdWdnZWQ7IHRoaXMgaXMgc2lnbmFsbGVkIGJ5IGFuIEVQSVBFIGVycm9yIGNvZGUgKi8KLQlwZGV2LT5lcnJvcl9zdGF0dXMgPSBFUElQRTsKLQlwZGV2LT51bnBsdWdnZWQgPSAxOwotCi0JLyogQWxlcnQgd2FpdGluZyBwcm9jZXNzZXMgKi8KLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBkZXYtPmZyYW1lcSk7Ci0KKwl1c2Jfc2V0X2ludGZkYXRhKGludGYsIE5VTEwpOwogCS8qIE5vIG5lZWQgdG8ga2VlcCB0aGUgdXJicyBhcm91bmQgYWZ0ZXIgZGlzY29ubmVjdGlvbiAqLwogCXB3Y19pc29jX2NsZWFudXAocGRldik7CisJcHdjX2NsZWFudXBfcXVldWVkX2J1ZnMocGRldik7CisJcGRldi0+dWRldiA9IE5VTEw7CiAKLWRpc2Nvbm5lY3Rfb3V0OgogCW11dGV4X3VubG9jaygmcGRldi0+bW9kbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZwZGV2LT51ZGV2bG9jayk7CiAKIAlwd2NfcmVtb3ZlX3N5c2ZzX2ZpbGVzKHBkZXYpOwogCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKCZwZGV2LT52ZGV2KTsKQEAgLTE4MDksMzYgKzEzMjksMjcgQEAKICAqIEluaXRpYWxpemF0aW9uIGNvZGUgJiBtb2R1bGUgc3R1ZmYKICAqLwogCi1zdGF0aWMgY2hhciAqc2l6ZTsKIHN0YXRpYyBpbnQgZnBzOwotc3RhdGljIGludCBmYnVmczsKLXN0YXRpYyBpbnQgbWJ1ZnM7CiBzdGF0aWMgaW50IGNvbXByZXNzaW9uID0gLTE7CiBzdGF0aWMgaW50IGxlZHNbMl0gPSB7IC0xLCAtMSB9Owogc3RhdGljIHVuc2lnbmVkIGludCBsZWRzX25hcmdzOwogc3RhdGljIGNoYXIgKmRldl9oaW50W01BWF9ERVZfSElOVFNdOwogc3RhdGljIHVuc2lnbmVkIGludCBkZXZfaGludF9uYXJnczsKIAotbW9kdWxlX3BhcmFtKHNpemUsIGNoYXJwLCAwNDQ0KTsKIG1vZHVsZV9wYXJhbShmcHMsIGludCwgMDQ0NCk7Ci1tb2R1bGVfcGFyYW0oZmJ1ZnMsIGludCwgMDQ0NCk7Ci1tb2R1bGVfcGFyYW0obWJ1ZnMsIGludCwgMDQ0NCk7CiAjaWZkZWYgQ09ORklHX1VTQl9QV0NfREVCVUcKIG1vZHVsZV9wYXJhbV9uYW1lZCh0cmFjZSwgcHdjX3RyYWNlLCBpbnQsIDA2NDQpOwogI2VuZGlmCi1tb2R1bGVfcGFyYW0ocG93ZXJfc2F2ZSwgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbShwb3dlcl9zYXZlLCBpbnQsIDA2NDQpOwogbW9kdWxlX3BhcmFtKGNvbXByZXNzaW9uLCBpbnQsIDA0NDQpOwogbW9kdWxlX3BhcmFtX2FycmF5KGxlZHMsIGludCwgJmxlZHNfbmFyZ3MsIDA0NDQpOwogbW9kdWxlX3BhcmFtX2FycmF5KGRldl9oaW50LCBjaGFycCwgJmRldl9oaW50X25hcmdzLCAwNDQ0KTsKIAotTU9EVUxFX1BBUk1fREVTQyhzaXplLCAiSW5pdGlhbCBpbWFnZSBzaXplLiBPbmUgb2Ygc3FjaWYsIHFzaWYsIHFjaWYsIHNpZiwgY2lmLCB2Z2EiKTsKIE1PRFVMRV9QQVJNX0RFU0MoZnBzLCAiSW5pdGlhbCBmcmFtZXMgcGVyIHNlY29uZC4gVmFyaWVzIHdpdGggbW9kZWwsIHVzZWZ1bCByYW5nZSA1LTMwIik7Ci1NT0RVTEVfUEFSTV9ERVNDKGZidWZzLCAiTnVtYmVyIG9mIGludGVybmFsIGZyYW1lIGJ1ZmZlcnMgdG8gcmVzZXJ2ZSIpOwotTU9EVUxFX1BBUk1fREVTQyhtYnVmcywgIk51bWJlciBvZiBleHRlcm5hbCAobW1hcCgpZWQpIGltYWdlIGJ1ZmZlcnMiKTsKICNpZmRlZiBDT05GSUdfVVNCX1BXQ19ERUJVRwogTU9EVUxFX1BBUk1fREVTQyh0cmFjZSwgIkZvciBkZWJ1Z2dpbmcgcHVycG9zZXMiKTsKICNlbmRpZgotTU9EVUxFX1BBUk1fREVTQyhwb3dlcl9zYXZlLCAiVHVybiBwb3dlciBzYXZlIGZlYXR1cmUgaW4gY2FtZXJhIG9uIG9yIG9mZiIpOworTU9EVUxFX1BBUk1fREVTQyhwb3dlcl9zYXZlLCAiVHVybiBwb3dlciBzYXZpbmcgZm9yIG5ldyBjYW1lcmFzIG9uIG9yIG9mZiIpOwogTU9EVUxFX1BBUk1fREVTQyhjb21wcmVzc2lvbiwgIlByZWZlcnJlZCBjb21wcmVzc2lvbiBxdWFsaXR5LiBSYW5nZSAwICh1bmNvbXByZXNzZWQpIHRvIDMgKGhpZ2ggY29tcHJlc3Npb24pIik7CiBNT0RVTEVfUEFSTV9ERVNDKGxlZHMsICJMRUQgb24sb2ZmIHRpbWUgaW4gbWlsbGlzZWNvbmRzIik7CiBNT0RVTEVfUEFSTV9ERVNDKGRldl9oaW50LCAiRGV2aWNlIG5vZGUgaGludHMiKTsKQEAgLTE4NTEsMTQgKzEzNjIsMTkgQEAKIAogc3RhdGljIGludCBfX2luaXQgdXNiX3B3Y19pbml0KHZvaWQpCiB7Ci0JaW50IGksIHN6OwotCWNoYXIgKnNpemVuYW1lc1tQU1pfTUFYXSA9IHsgInNxY2lmIiwgInFzaWYiLCAicWNpZiIsICJzaWYiLCAiY2lmIiwgInZnYSIgfTsKKwlpbnQgaTsKIAorI2lmZGVmIENPTkZJR19VU0JfUFdDX0RFQlVHCiAJUFdDX0lORk8oIlBoaWxpcHMgd2ViY2FtIG1vZHVsZSB2ZXJzaW9uICIgUFdDX1ZFUlNJT04gIiBsb2FkZWQuXG4iKTsKIAlQV0NfSU5GTygiU3VwcG9ydHMgUGhpbGlwcyBQQ0E2NDUvNjQ2LCBQQ1ZDNjc1LzY4MC82OTAsIFBDVkM3MjBbNDBdLzczMC83NDAvNzUwICYgUENWQzgzMC84NDAuXG4iKTsKIAlQV0NfSU5GTygiQWxzbyBzdXBwb3J0cyB0aGUgQXNrZXkgVkMwMTAsIHZhcmlvdXMgTG9naXRlY2ggUXVpY2tjYW1zLCBTYW1zdW5nIE1QQy1DMTAgYW5kIE1QQy1DMzAsXG4iKTsKIAlQV0NfSU5GTygidGhlIENyZWF0aXZlIFdlYkNhbSA1ICYgUHJvIEV4LCBTT1RFQyBBZmluYSBFeWUgYW5kIFZpc2lvbml0ZSBWQ1MtVUMzMDAgYW5kIFZDUy1VTTEwMC5cbiIpOwogCisJaWYgKHB3Y190cmFjZSA+PSAwKSB7CisJCVBXQ19ERUJVR19NT0RVTEUoIlRyYWNlIG9wdGlvbnM6IDB4JTA0eFxuIiwgcHdjX3RyYWNlKTsKKwl9CisjZW5kaWYKKwogCWlmIChmcHMpIHsKIAkJaWYgKGZwcyA8IDQgfHwgZnBzID4gMzApIHsKIAkJCVBXQ19FUlJPUigiRnJhbWVyYXRlIG91dCBvZiBib3VuZHMgKDQtMzApLlxuIik7CkBAIC0xODY4LDQxICsxMzg0LDYgQEAKIAkJUFdDX0RFQlVHX01PRFVMRSgiRGVmYXVsdCBmcmFtZXJhdGUgc2V0IHRvICVkLlxuIiwgZGVmYXVsdF9mcHMpOwogCX0KIAotCWlmIChzaXplKSB7Ci0JCS8qIHN0cmluZzsgdHJ5IG1hdGNoaW5nIHdpdGggYXJyYXkgKi8KLQkJZm9yIChzeiA9IDA7IHN6IDwgUFNaX01BWDsgc3orKykgewotCQkJaWYgKCFzdHJjbXAoc2l6ZW5hbWVzW3N6XSwgc2l6ZSkpIHsgLyogRm91bmQhICovCi0JCQkJZGVmYXVsdF9zaXplID0gc3o7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKHN6ID09IFBTWl9NQVgpIHsKLQkJCVBXQ19FUlJPUigiU2l6ZSBub3QgcmVjb2duaXplZDsgdHJ5IHNpemU9W3NxY2lmIHwgcXNpZiB8IHFjaWYgfCBzaWYgfCBjaWYgfCB2Z2FdLlxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlQV0NfREVCVUdfTU9EVUxFKCJEZWZhdWx0IGltYWdlIHNpemUgc2V0IHRvICVzIFslZHglZF0uXG4iLCBzaXplbmFtZXNbZGVmYXVsdF9zaXplXSwgcHdjX2ltYWdlX3NpemVzW2RlZmF1bHRfc2l6ZV0ueCwgcHdjX2ltYWdlX3NpemVzW2RlZmF1bHRfc2l6ZV0ueSk7Ci0JfQotCWlmIChtYnVmcykgewotCQlpZiAobWJ1ZnMgPCAxIHx8IG1idWZzID4gTUFYX0lNQUdFUykgewotCQkJUFdDX0VSUk9SKCJJbGxlZ2FsIG51bWJlciBvZiBtbWFwKCkgYnVmZmVyczsgdXNlIGEgbnVtYmVyIGJldHdlZW4gMSBhbmQgJWQuXG4iLCBNQVhfSU1BR0VTKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCXB3Y19tYnVmcyA9IG1idWZzOwotCQlQV0NfREVCVUdfTU9EVUxFKCJOdW1iZXIgb2YgaW1hZ2UgYnVmZmVycyBzZXQgdG8gJWQuXG4iLCBwd2NfbWJ1ZnMpOwotCX0KLQlpZiAoZmJ1ZnMpIHsKLQkJaWYgKGZidWZzIDwgMiB8fCBmYnVmcyA+IE1BWF9GUkFNRVMpIHsKLQkJCVBXQ19FUlJPUigiSWxsZWdhbCBudW1iZXIgb2YgZnJhbWUgYnVmZmVyczsgdXNlIGEgbnVtYmVyIGJldHdlZW4gMiBhbmQgJWQuXG4iLCBNQVhfRlJBTUVTKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCWRlZmF1bHRfZmJ1ZnMgPSBmYnVmczsKLQkJUFdDX0RFQlVHX01PRFVMRSgiTnVtYmVyIG9mIGZyYW1lIGJ1ZmZlcnMgc2V0IHRvICVkLlxuIiwgZGVmYXVsdF9mYnVmcyk7Ci0JfQotI2lmZGVmIENPTkZJR19VU0JfUFdDX0RFQlVHCi0JaWYgKHB3Y190cmFjZSA+PSAwKSB7Ci0JCVBXQ19ERUJVR19NT0RVTEUoIlRyYWNlIG9wdGlvbnM6IDB4JTA0eFxuIiwgcHdjX3RyYWNlKTsKLQl9Ci0jZW5kaWYKIAlpZiAoY29tcHJlc3Npb24gPj0gMCkgewogCQlpZiAoY29tcHJlc3Npb24gPiAzKSB7CiAJCQlQV0NfRVJST1IoIkludmFsaWQgY29tcHJlc3Npb24gc2V0dGluZzsgdXNlIGEgbnVtYmVyIGJldHdlZW4gMCAodW5jb21wcmVzc2VkKSBhbmQgMyAoaGlnaCkuXG4iKTsKQEAgLTE5MTEsOCArMTM5Miw2IEBACiAJCXB3Y19wcmVmZXJyZWRfY29tcHJlc3Npb24gPSBjb21wcmVzc2lvbjsKIAkJUFdDX0RFQlVHX01PRFVMRSgiUHJlZmVycmVkIGNvbXByZXNzaW9uIHNldCB0byAlZC5cbiIsIHB3Y19wcmVmZXJyZWRfY29tcHJlc3Npb24pOwogCX0KLQlpZiAocG93ZXJfc2F2ZSkKLQkJUFdDX0RFQlVHX01PRFVMRSgiRW5hYmxpbmcgcG93ZXIgc2F2ZSBvbiBvcGVuL2Nsb3NlLlxuIik7CiAJaWYgKGxlZHNbMF0gPj0gMCkKIAkJbGVkX29uID0gbGVkc1swXTsKIAlpZiAobGVkc1sxXSA+PSAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWlvY3RsLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaW9jdGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMwY2FlNy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtaW9jdGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0jaWZuZGVmIFBXQ19JT0NUTF9ICi0jZGVmaW5lIFBXQ19JT0NUTF9ICi0KLS8qIChDKSAyMDAxLTIwMDQgTmVtb3NvZnQgVW52LgotICAgKEMpIDIwMDQtMjAwNiBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCi0KLSAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAotICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCi0gICBQbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyBhbmQgc3VwcG9ydCByZXF1ZXN0cyB0byA8bHVjQHNhaWxsYXJkLm9yZz4uCi0gICBUaGUgZGVjb21wcmVzc2lvbiByb3V0aW5lcyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgYnkgcmV2ZXJzZS1lbmdpbmVlcmluZyB0aGUKLSAgIE5lbW9zb2Z0IGJpbmFyeSBwd2N4IG1vZHVsZS4gQ2F2ZWF0IGVtcHRvci4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0qLwotCi0vKiBUaGlzIGlzIHB3Yy1pb2N0bC5oIGJlbG9uZ2luZyB0byBQV0MgMTAuMC4xMAotICAgSXQgY29udGFpbnMgc3RydWN0dXJlcyBhbmQgZGVmaW5lcyB0byBjb21tdW5pY2F0ZSBmcm9tIHVzZXIgc3BhY2UKLSAgIGRpcmVjdGx5IHRvIHRoZSBkcml2ZXIuCi0gKi8KLQotLyoKLSAgIENoYW5nZXMKLSAgIDIwMDEvMDgvMDMgIEFsdmFyYWRvICAgQWRkZWQgaW9jdGwgY29uc3RhbnRzIHRvIGFjY2VzcyBtZXRob2RzIGZvcgotCQkJICBjaGFuZ2luZyB3aGl0ZSBiYWxhbmNlIGFuZCByZWQvYmx1ZSBnYWlucwotICAgMjAwMi8xMi8xNSAgRy4gSC4gRmVybmFuZGV6LVRvcmliaW8gICBWSURJT0NHUkVBTFNJWkUKLSAgIDIwMDMvMTIvMTMgIE5lbW9zZnQgVW52LiBTb21lIG1vZGlmaWNhdGlvbnMgdG8gbWFrZSBpbnRlcmZhY2luZyB0bwotCSAgICAgICBQV0NYIGVhc2llcgotICovCi0KLS8qIFRoZXNlIGFyZSBwcml2YXRlIGlvY3RsKCkgY29tbWFuZHMsIHNwZWNpZmljIGZvciB0aGUgUGhpbGlwcyB3ZWJjYW1zLgotICAgVGhleSBjb250YWluIGZ1bmN0aW9ucyBub3QgZm91bmQgaW4gb3RoZXIgd2ViY2FtcywgYW5kIHNldHRpbmdzIG5vdAotICAgc3BlY2lmaWVkIGluIHRoZSBWaWRlbzRMaW51eCBBUEkuCi0KLSAgIFRoZSAjZGVmaW5lIG5hbWVzIGFyZSBidWlsdCB1cCBsaWtlIGZvbGxvd3M6Ci0gICBWSURJT0MJCVZJRGVvIElPQ3RsIHByZWZpeAotCSBQV0MJCVBoaWxwcyBXZWJDYW0KLQkgICAgRyAgICAgICAgICAgb3B0aW9uYWw6IEdldAotCSAgICBTICAgICAgICAgICBvcHRpb25hbDogU2V0Ci0JICAgICAuLi4gCXRoZSBmdW5jdGlvbgotICovCi0KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLQotIC8qIEVudW1lcmF0aW9uIG9mIGltYWdlIHNpemVzICovCi0jZGVmaW5lIFBTWl9TUUNJRgkweDAwCi0jZGVmaW5lIFBTWl9RU0lGCTB4MDEKLSNkZWZpbmUgUFNaX1FDSUYJMHgwMgotI2RlZmluZSBQU1pfU0lGCQkweDAzCi0jZGVmaW5lIFBTWl9DSUYJCTB4MDQKLSNkZWZpbmUgUFNaX1ZHQQkJMHgwNQotI2RlZmluZSBQU1pfTUFYCQk2Ci0KLQotLyogVGhlIGZyYW1lIHJhdGUgaXMgZW5jb2RlZCBpbiB0aGUgdmlkZW9fd2luZG93LmZsYWdzIHBhcmFtZXRlciB1c2luZwotICAgdGhlIHVwcGVyIDE2IGJpdHMsIHNpbmNlIHNvbWUgZmxhZ3MgYXJlIGRlZmluZWQgbm93YWRheXMuIFRoZSBmb2xsb3dpbmcKLSAgIGRlZmluZXMgcHJvdmlkZSBhIG1hc2sgYW5kIHNoaWZ0IHRvIGZpbHRlciBvdXQgdGhpcyB2YWx1ZS4KLSAgIFRoaXMgdmFsdWUgY2FuIGFsc28gYmUgcGFzc2luZyB1c2luZyB0aGUgcHJpdmF0ZSBmbGFnIHdoZW4gdXNpbmcgdjRsMiBhbmQKLSAgIFZJRElPQ19TX0ZNVCBpb2N0bC4KLQotICAgSW4gJ1NuYXBzaG90JyBtb2RlIHRoZSBjYW1lcmEgZnJlZXplcyBpdHMgYXV0b21hdGljIGV4cG9zdXJlIGFuZCBjb2xvdXIKLSAgIGJhbGFuY2UgY29udHJvbHMuCi0gKi8KLSNkZWZpbmUgUFdDX0ZQU19TSElGVAkJMTYKLSNkZWZpbmUgUFdDX0ZQU19NQVNLCQkweDAwRkYwMDAwCi0jZGVmaW5lIFBXQ19GUFNfRlJNQVNLCQkweDAwM0YwMDAwCi0jZGVmaW5lIFBXQ19GUFNfU05BUFNIT1QJMHgwMDQwMDAwMAotI2RlZmluZSBQV0NfUUxUX01BU0sJCTB4MDMwMDAwMDAKLSNkZWZpbmUgUFdDX1FMVF9TSElGVAkJMjQKLQotCi0vKiBzdHJ1Y3R1cmUgZm9yIHRyYW5zZmVycmluZyB4ICYgeSBjb29yZGluYXRlcyAqLwotc3RydWN0IHB3Y19jb29yZAotewotCWludCB4LCB5OwkJLyogZ3Vlc3Mgd2hhdCAqLwotCWludCBzaXplOwkJLyogc2l6ZSwgb3Igb2Zmc2V0ICovCi19OwotCi0KLS8qIFVzZWQgd2l0aCBWSURJT0NQV0NQUk9CRSAqLwotc3RydWN0IHB3Y19wcm9iZQotewotCWNoYXIgbmFtZVszMl07Ci0JaW50IHR5cGU7Ci19OwotCi1zdHJ1Y3QgcHdjX3NlcmlhbAotewotCWNoYXIgc2VyaWFsWzMwXTsJLyogU3RyaW5nIHdpdGggc2VyaWFsIG51bWJlci4gQ29udGFpbnMgdGVybWluYXRpbmcgMCAqLwotfTsKLQotLyogcHdjX3doaXRlYmFsYW5jZS5tb2RlIHZhbHVlcyAqLwotI2RlZmluZSBQV0NfV0JfSU5ET09SCQkwCi0jZGVmaW5lIFBXQ19XQl9PVVRET09SCQkxCi0jZGVmaW5lIFBXQ19XQl9GTAkJMgotI2RlZmluZSBQV0NfV0JfTUFOVUFMCQkzCi0jZGVmaW5lIFBXQ19XQl9BVVRPCQk0Ci0KLS8qIFVzZWQgd2l0aCBWSURJT0NQV0NbU0ddQVdCIChBdXRvIFdoaXRlIEJhbGFuY2UpLgotICAgU2V0IG1vZGUgdG8gb25lIG9mIHRoZSBQV0NfV0JfKiB2YWx1ZXMgYWJvdmUuCi0gICAqcmVkIGFuZCAqYmx1ZSBhcmUgdGhlIHJlc3BlY3RpdmUgZ2FpbnMgb2YgdGhlc2UgY29sb3VyIGNvbXBvbmVudHMgaW5zaWRlCi0gICB0aGUgY2FtZXJhOyByYW5nZSAwLi42NTUzNQotICAgV2hlbiAnbW9kZScgPT0gUFdDX1dCX01BTlVBTCwgJ21hbnVhbF9yZWQnIGFuZCAnbWFudWFsX2JsdWUnIGFyZSBzZXQgb3IgcmVhZDsKLSAgIG90aGVyd2lzZSB1bmRlZmluZWQuCi0gICAncmVhZF9yZWQnIGFuZCAncmVhZF9ibHVlJyBhcmUgcmVhZC1vbmx5LgotKi8KLXN0cnVjdCBwd2Nfd2hpdGViYWxhbmNlCi17Ci0JaW50IG1vZGU7Ci0JaW50IG1hbnVhbF9yZWQsIG1hbnVhbF9ibHVlOwkvKiBSL1cgKi8KLQlpbnQgcmVhZF9yZWQsIHJlYWRfYmx1ZTsJLyogUi9PICovCi19OwotCi0vKgotICAgJ2NvbnRyb2xfc3BlZWQnIGFuZCAnY29udHJvbF9kZWxheScgYXJlIHVzZWQgaW4gYXV0b21hdGljIHdoaXRlYmFsYW5jZSBtb2RlLAotICAgYW5kIHRlbGwgdGhlIGNhbWVyYSBob3cgZmFzdCBpdCBzaG91bGQgcmVhY3QgdG8gY2hhbmdlcyBpbiBsaWdodGluZywgYW5kCi0gICB3aXRoIGhvdyBtdWNoIGRlbGF5LiBWYWxpZCB2YWx1ZXMgYXJlIDAuLjY1NTM1LgotKi8KLXN0cnVjdCBwd2Nfd2Jfc3BlZWQKLXsKLQlpbnQgY29udHJvbF9zcGVlZDsKLQlpbnQgY29udHJvbF9kZWxheTsKLQotfTsKLQotLyogVXNlZCB3aXRoIFZJRElPQ1BXQ1tTR11MRUQgKi8KLXN0cnVjdCBwd2NfbGVkcwotewotCWludCBsZWRfb247CQkJLyogTGVkIG9uLXRpbWU7IHJhbmdlID0gMC4uMjUwMDAgKi8KLQlpbnQgbGVkX29mZjsJCQkvKiBMZWQgb2ZmLXRpbWU7IHJhbmdlID0gMC4uMjUwMDAgICovCi19OwotCi0vKiBJbWFnZSBzaXplICh1c2VkIHdpdGggR1JFQUxTSVpFKSAqLwotc3RydWN0IHB3Y19pbWFnZXNpemUKLXsKLQlpbnQgd2lkdGg7Ci0JaW50IGhlaWdodDsKLX07Ci0KLS8qIERlZmluZXMgYW5kIHN0cnVjdHVyZXMgZm9yIE1vdG9yaXplZCBQYW4gJiBUaWx0ICovCi0jZGVmaW5lIFBXQ19NUFRfUEFOCQkweDAxCi0jZGVmaW5lIFBXQ19NUFRfVElMVAkJMHgwMgotI2RlZmluZSBQV0NfTVBUX1RJTUVPVVQJCTB4MDQgLyogZm9yIHN0YXR1cyAqLwotCi0vKiBTZXQgYW5nbGVzOyB3aGVuIGFic29sdXRlICE9IDAsIHRoZSBhbmdsZSBpcyBhYnNvbHV0ZSBhbmQgdGhlCi0gICBkcml2ZXIgY2FsY3VsYXRlcyB0aGUgcmVsYXRpdmUgb2Zmc2V0IGZvciB5b3UuIFRoaXMgY2FuIG9ubHkKLSAgIGJlIHVzZWQgd2l0aCBWSURJT0NQV0NTQU5HTEU7IFZJRElPQ1BXQ0dBTkdMRSBhbHdheXMgcmV0dXJucwotICAgYWJzb2x1dGUgYW5nbGVzLgotICovCi1zdHJ1Y3QgcHdjX21wdF9hbmdsZXMKLXsKLQlpbnQgYWJzb2x1dGU7CQkvKiB3cml0ZS1vbmx5ICovCi0JaW50IHBhbjsJCS8qIGRlZ3JlZXMgKiAxMDAgKi8KLQlpbnQgdGlsdDsJCS8qIGRlZ3Jlc3MgKiAxMDAgKi8KLX07Ci0KLS8qIFJhbmdlIG9mIGFuZ2xlcyBvZiB0aGUgY2FtZXJhLCBib3RoIGhvcml6b250YWxseSBhbmQgdmVydGljYWxseS4KLSAqLwotc3RydWN0IHB3Y19tcHRfcmFuZ2UKLXsKLQlpbnQgcGFuX21pbiwgcGFuX21heDsJCS8qIGRlZ3JlZXMgKiAxMDAgKi8KLQlpbnQgdGlsdF9taW4sIHRpbHRfbWF4OwotfTsKLQotc3RydWN0IHB3Y19tcHRfc3RhdHVzCi17Ci0JaW50IHN0YXR1czsKLQlpbnQgdGltZV9wYW47Ci0JaW50IHRpbWVfdGlsdDsKLX07Ci0KLQotLyogVGhpcyBpcyB1c2VkIGZvciBvdXQtb2Yta2VybmVsIGRlY29tcHJlc3Npb24uIFdpdGggaXQsIHlvdSBjYW4gZ2V0Ci0gICBhbGwgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiB0byBpbml0aWFsaXplIGFuZCB1c2UgdGhlIGRlY29tcHJlc3NvcgotICAgcm91dGluZXMgaW4gc3RhbmRhbG9uZSBhcHBsaWNhdGlvbnMuCi0gKi8KLXN0cnVjdCBwd2NfdmlkZW9fY29tbWFuZAotewotCWludCB0eXBlOwkJLyogY2FtZXJhIHR5cGUgKDY0NSwgNjc1LCA3MzAsIGV0Yy4pICovCi0JaW50IHJlbGVhc2U7CQkvKiByZWxlYXNlIG51bWJlciAqLwotCi0JaW50IHNpemU7CQkvKiBvbmUgb2YgUFNaXyogKi8KLQlpbnQgYWx0ZXJuYXRlOwotCWludCBjb21tYW5kX2xlbjsJLyogbGVuZ3RoIG9mIFVTQiB2aWRlbyBjb21tYW5kICovCi0JdW5zaWduZWQgY2hhciBjb21tYW5kX2J1ZlsxM107CS8qIEFjdHVhbCBVU0IgdmlkZW8gY29tbWFuZCAqLwotCWludCBiYW5kbGVuZ3RoOwkJLyogPjAgPSBjb21wcmVzc2VkICovCi0JaW50IGZyYW1lX3NpemU7CQkvKiBTaXplIG9mIG9uZSAodW4pY29tcHJlc3NlZCBmcmFtZSAqLwotfTsKLQotLyogRmxhZ3MgZm9yIFBXQ1ggc3Vicm91dGluZXMuIE5vdCBhbGwgbW9kdWxlcyBob25vdXIgYWxsIGZsYWdzLiAqLwotI2RlZmluZSBQV0NYX0ZMQUdfUExBTkFSCTB4MDAwMQotI2RlZmluZSBQV0NYX0ZMQUdfQkFZRVIJCTB4MDAwOAotCi0KLS8qIElPQ1RMIGRlZmluaXRpb25zICovCi0KLSAvKiBSZXN0b3JlIHVzZXIgc2V0dGluZ3MgKi8KLSNkZWZpbmUgVklESU9DUFdDUlVTRVIJCV9JTygndicsIDE5MikKLSAvKiBTYXZlIHVzZXIgc2V0dGluZ3MgKi8KLSNkZWZpbmUgVklESU9DUFdDU1VTRVIJCV9JTygndicsIDE5MykKLSAvKiBSZXN0b3JlIGZhY3Rvcnkgc2V0dGluZ3MgKi8KLSNkZWZpbmUgVklESU9DUFdDRkFDVE9SWQlfSU8oJ3YnLCAxOTQpCi0KLSAvKiBZb3UgY2FuIG1hbmlwdWxhdGUgdGhlIGNvbXByZXNzaW9uIGZhY3Rvci4gQSBjb21wcmVzc2lvbiBwcmVmZXJlbmNlIG9mIDAKLSAgICBtZWFucyB1c2UgdW5jb21wcmVzc2VkIG1vZGVzIHdoZW4gYXZhaWxhYmxlOyAxIGlzIGxvdyBjb21wcmVzc2lvbiwgMiBpcwotICAgIG1lZGl1bSBhbmQgMyBpcyBoaWdoIGNvbXByZXNzaW9uIHByZWZlcnJlZC4gT2YgY291cnNlLCB0aGUgaGlnaGVyIHRoZQotICAgIGNvbXByZXNzaW9uLCB0aGUgbG93ZXIgdGhlIGJhbmR3aWR0aCB1c2VkIGJ1dCBtb3JlIGNoYW5jZSBvZiBhcnRlZmFjdHMKLSAgICBpbiB0aGUgaW1hZ2UuIFRoZSBkcml2ZXIgYXV0b21hdGljYWxseSBjaG9vc2VzIGEgaGlnaGVyIGNvbXByZXNzaW9uIHdoZW4KLSAgICB0aGUgcHJlZmVycmVkIG1vZGUgaXMgbm90IGF2YWlsYWJsZS4KLSAgKi8KLSAvKiBTZXQgcHJlZmVycmVkIGNvbXByZXNzaW9uIHF1YWxpdHkgKDAgPSB1bmNvbXByZXNzZWQsIDMgPSBoaWdoZXN0IGNvbXByZXNzaW9uKSAqLwotI2RlZmluZSBWSURJT0NQV0NTQ1FVQUwJCV9JT1coJ3YnLCAxOTUsIGludCkKLSAvKiBHZXQgcHJlZmVycmVkIGNvbXByZXNzaW9uIHF1YWxpdHkgKi8KLSNkZWZpbmUgVklESU9DUFdDR0NRVUFMCQlfSU9SKCd2JywgMTk1LCBpbnQpCi0KLQotLyogUmV0cmlldmUgc2VyaWFsIG51bWJlciBvZiBjYW1lcmEgKi8KLSNkZWZpbmUgVklESU9DUFdDR1NFUklBTAlfSU9SKCd2JywgMTk4LCBzdHJ1Y3QgcHdjX3NlcmlhbCkKLQotIC8qIFRoaXMgaXMgYSBwcm9iZSBmdW5jdGlvbjsgc2luY2Ugc28gbWFueSBkZXZpY2VzIGFyZSBzdXBwb3J0ZWQsIGl0Ci0gICAgYmVjb21lcyBkaWZmaWN1bHQgdG8gaW5jbHVkZSBhbGwgdGhlIG5hbWVzIGluIHByb2dyYW1zIHRoYXQgd2FudCB0bwotICAgIGNoZWNrIGZvciB0aGUgZW5oYW5jZWQgUGhpbGlwcyBzdHVmZi4gU28gaW4gc3RlYWQsIHRyeSB0aGlzIFBST0JFOwotICAgIGl0IHJldHVybnMgYSBzdHJ1Y3R1cmUgd2l0aCB0aGUgb3JpZ2luYWwgbmFtZSwgYW5kIHRoZSBjb3JyZXNwb25kaW5nCi0gICAgUGhpbGlwcyB0eXBlLgotICAgIFRvIHVzZSwgZmlsbCB0aGUgc3RydWN0dXJlIHdpdGggemVyb2VzLCBjYWxsIFBST0JFIGFuZCBpZiB0aGF0IHN1Y2NlZWRzLAotICAgIGNvbXBhcmUgdGhlIG5hbWUgd2l0aCB0aGF0IHJldHVybmVkIGZyb20gVklESU9DR0NBUDsgdGhleSBzaG91bGQgYmUgdGhlCi0gICAgc2FtZS4gSWYgc28sIHlvdSBjYW4gYmUgYXNzdXJlZCBpdCBpcyBhIFBoaWxpcHMgKE9FTSkgY2FtIGFuZCB0aGUgdHlwZQotICAgIGlzIHZhbGlkLgotICovCi0jZGVmaW5lIFZJRElPQ1BXQ1BST0JFCQlfSU9SKCd2JywgMTk5LCBzdHJ1Y3QgcHdjX3Byb2JlKQotCi0gLyogU2V0IEFHQyAoQXV0b21hdGljIEdhaW4gQ29udHJvbCk7IGludCA8IDAgPSBhdXRvLCAwLi42NTUzNSA9IGZpeGVkICovCi0jZGVmaW5lIFZJRElPQ1BXQ1NBR0MJCV9JT1coJ3YnLCAyMDAsIGludCkKLSAvKiBHZXQgQUdDOyBpbnQgPCAwID0gYXV0bzsgPj0gMCA9IGZpeGVkLCByYW5nZSAwLi42NTUzNSAqLwotI2RlZmluZSBWSURJT0NQV0NHQUdDCQlfSU9SKCd2JywgMjAwLCBpbnQpCi0gLyogU2V0IHNodXR0ZXIgc3BlZWQ7IGludCA8IDAgPSBhdXRvOyA+PSAwID0gZml4ZWQsIHJhbmdlIDAuLjY1NTM1ICovCi0jZGVmaW5lIFZJRElPQ1BXQ1NTSFVUVEVSCV9JT1coJ3YnLCAyMDEsIGludCkKLQotIC8qIENvbG9yIGNvbXBlbnNhdGlvbiAoQXV0byBXaGl0ZSBCYWxhbmNlKSAqLwotI2RlZmluZSBWSURJT0NQV0NTQVdCICAgICAgICAgICBfSU9XKCd2JywgMjAyLCBzdHJ1Y3QgcHdjX3doaXRlYmFsYW5jZSkKLSNkZWZpbmUgVklESU9DUFdDR0FXQiAgICAgICAgICAgX0lPUigndicsIDIwMiwgc3RydWN0IHB3Y193aGl0ZWJhbGFuY2UpCi0KLSAvKiBBdXRvIFdCIHNwZWVkICovCi0jZGVmaW5lIFZJRElPQ1BXQ1NBV0JTUEVFRAlfSU9XKCd2JywgMjAzLCBzdHJ1Y3QgcHdjX3diX3NwZWVkKQotI2RlZmluZSBWSURJT0NQV0NHQVdCU1BFRUQJX0lPUigndicsIDIwMywgc3RydWN0IHB3Y193Yl9zcGVlZCkKLQotIC8qIExFRHMgb24vb2ZmL2JsaW5rOyBpbnQgcmFuZ2UgMC4uNjU1MzUgKi8KLSNkZWZpbmUgVklESU9DUFdDU0xFRCAgICAgICAgICAgX0lPVygndicsIDIwNSwgc3RydWN0IHB3Y19sZWRzKQotI2RlZmluZSBWSURJT0NQV0NHTEVEICAgICAgICAgICBfSU9SKCd2JywgMjA1LCBzdHJ1Y3QgcHdjX2xlZHMpCi0KLSAgLyogQ29udG91ciAoc2hhcnBuZXNzKTsgaW50IDwgMCA9IGF1dG8sIDAuLjY1NTM2ID0gZml4ZWQgKi8KLSNkZWZpbmUgVklESU9DUFdDU0NPTlRPVVIJX0lPVygndicsIDIwNiwgaW50KQotI2RlZmluZSBWSURJT0NQV0NHQ09OVE9VUglfSU9SKCd2JywgMjA2LCBpbnQpCi0KLSAgLyogQmFja2xpZ2h0IGNvbXBlbnNhdGlvbjsgMCA9IG9mZiwgb3RoZXJ3aXNlIG9uICovCi0jZGVmaW5lIFZJRElPQ1BXQ1NCQUNLTElHSFQJX0lPVygndicsIDIwNywgaW50KQotI2RlZmluZSBWSURJT0NQV0NHQkFDS0xJR0hUCV9JT1IoJ3YnLCAyMDcsIGludCkKLQotICAvKiBGbGlja2VybGVzcyBtb2RlOyA9IDAgb2ZmLCBvdGhlcndpc2Ugb24gKi8KLSNkZWZpbmUgVklESU9DUFdDU0ZMSUNLRVIJX0lPVygndicsIDIwOCwgaW50KQotI2RlZmluZSBWSURJT0NQV0NHRkxJQ0tFUglfSU9SKCd2JywgMjA4LCBpbnQpCi0KLSAgLyogRHluYW1pYyBub2lzZSByZWR1Y3Rpb247IDAgb2ZmLCAzID0gaGlnaCBub2lzZSByZWR1Y3Rpb24gKi8KLSNkZWZpbmUgVklESU9DUFdDU0RZTk5PSVNFCV9JT1coJ3YnLCAyMDksIGludCkKLSNkZWZpbmUgVklESU9DUFdDR0RZTk5PSVNFCV9JT1IoJ3YnLCAyMDksIGludCkKLQotIC8qIFJlYWwgaW1hZ2Ugc2l6ZSBhcyB1c2VkIGJ5IHRoZSBjYW1lcmE7IHRlbGxzIHlvdSB3aGV0aGVyIG9yIG5vdCB0aGVyZSdzIGEgZ3JheSBib3JkZXIgYXJvdW5kIHRoZSBpbWFnZSAqLwotI2RlZmluZSBWSURJT0NQV0NHUkVBTFNJWkUJX0lPUigndicsIDIxMCwgc3RydWN0IHB3Y19pbWFnZXNpemUpCi0KLSAvKiBNb3Rvcml6ZWQgcGFuICYgdGlsdCBmdW5jdGlvbnMgKi8KLSNkZWZpbmUgVklESU9DUFdDTVBUUkVTRVQJX0lPVygndicsIDIxMSwgaW50KQotI2RlZmluZSBWSURJT0NQV0NNUFRHUkFOR0UJX0lPUigndicsIDIxMSwgc3RydWN0IHB3Y19tcHRfcmFuZ2UpCi0jZGVmaW5lIFZJRElPQ1BXQ01QVFNBTkdMRQlfSU9XKCd2JywgMjEyLCBzdHJ1Y3QgcHdjX21wdF9hbmdsZXMpCi0jZGVmaW5lIFZJRElPQ1BXQ01QVEdBTkdMRQlfSU9SKCd2JywgMjEyLCBzdHJ1Y3QgcHdjX21wdF9hbmdsZXMpCi0jZGVmaW5lIFZJRElPQ1BXQ01QVFNUQVRVUwlfSU9SKCd2JywgMjEzLCBzdHJ1Y3QgcHdjX21wdF9zdGF0dXMpCi0KLSAvKiBHZXQgdGhlIFVTQiBzZXQtdmlkZW8gY29tbWFuZDsgbmVlZGVkIGZvciBpbml0aWFsaXppbmcgbGlicHdjeCAqLwotI2RlZmluZSBWSURJT0NQV0NHVklEQ01ECV9JT1IoJ3YnLCAyMTUsIHN0cnVjdCBwd2NfdmlkZW9fY29tbWFuZCkKLXN0cnVjdCBwd2NfdGFibGVfaW5pdF9idWZmZXIgewotICAgaW50IGxlbjsKLSAgIGNoYXIgKmJ1ZmZlcjsKLQotfTsKLSNkZWZpbmUgVklESU9DUFdDR1ZJRFRBQkxFCV9JT1IoJ3YnLCAyMTYsIHN0cnVjdCBwd2NfdGFibGVfaW5pdF9idWZmZXIpCi0KLS8qCi0gKiBUaGlzIGlzIHByaXZhdGUgY29tbWFuZCB1c2VkIHdoZW4gY29tbXVuaWNhdGluZyB3aXRoIHY0bDIuCi0gKiBJbiB0aGUgZnV0dXJlIGFsbCBwcml2YXRlIGlvY3RsIHdpbGwgYmUgcmVtb3ZlL3JlcGxhY2UgdG8KLSAqIHVzZSBpbnRlcmZhY2Ugb2ZmZXIgYnkgdjRsMi4KLSAqLwotCi0jZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfU0FWRV9VU0VSICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAwKQotI2RlZmluZSBWNEwyX0NJRF9QUklWQVRFX1JFU1RPUkVfVVNFUiAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMSkKLSNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9SRVNUT1JFX0ZBQ1RPUlkgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDIpCi0jZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfQ09MT1VSX01PREUgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAzKQotI2RlZmluZSBWNEwyX0NJRF9QUklWQVRFX0FVVE9DT05UT1VSICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNCkKLSNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9DT05UT1VSICAgICAgICAgKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDUpCi0jZGVmaW5lIFY0TDJfQ0lEX1BSSVZBVEVfQkFDS0xJR0hUICAgICAgIChWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA2KQotI2RlZmluZSBWNEwyX0NJRF9QUklWQVRFX0ZMSUNLRVJMRVNTICAgICAoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNykKLSNkZWZpbmUgVjRMMl9DSURfUFJJVkFURV9OT0lTRV9SRURVQ1RJT04gKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDgpCi0KLXN0cnVjdCBwd2NfcmF3X2ZyYW1lIHsKLSAgIF9fbGUxNiB0eXBlOwkJLyogdHlwZSBvZiB0aGUgd2ViY2FtICovCi0gICBfX2xlMTYgdmJhbmRsZW5ndGg7CS8qIFNpemUgb2YgNGxpbmVzIGNvbXByZXNzZWQgKHVzZWQgYnkgdGhlIGRlY29tcHJlc3NvcikgKi8KLSAgIF9fdTggICBjbWRbNF07CS8qIHRoZSBmb3VyIGJ5dGUgb2YgdGhlIGNvbW1hbmQgKGluIGNhc2Ugb2YgbmFsYSwKLQkJCSAgIG9ubHkgdGhlIGZpcnN0IDMgYnl0ZXMgaXMgZmlsbGVkKSAqLwotICAgX191OCAgIHJhd2ZyYW1lWzBdOwkvKiBmcmFtZV9zaXplID0gSC80KnZiYW5kbGVuZ3RoICovCi19IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKLQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1raWFyYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWtpYXJhLmMKaW5kZXggZjRhZTgzYy4uZTVmNGZkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWtpYXJhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLWtpYXJhLmMKQEAgLTQwLDcgKzQwLDYgQEAKIAogCiAjaW5jbHVkZSAicHdjLWtpYXJhLmgiCi0jaW5jbHVkZSAicHdjLXVuY29tcHJlc3MuaCIKIAogY29uc3QgdW5zaWduZWQgaW50IEtpYXJhX2Zwc192ZWN0b3JbUFdDX0ZQU19NQVhfS0lBUkFdID0geyA1LCAxMCwgMTUsIDIwLCAyNSwgMzAgfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLW1pc2MuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy1taXNjLmMKaW5kZXggNmFmNWJiNS4uMGIwMzEzMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLW1pc2MuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtbWlzYy5jCkBAIC0xMjYsOCArMTI2LDQgQEAKIAlwZGV2LT5waXhmbXQgPSBWNEwyX1BJWF9GTVRfWVVWNDIwOyAvKiBkZWZhdWx0ICovCiAJcGRldi0+dmlld19taW4uc2l6ZSA9IHBkZXYtPnZpZXdfbWluLnggKiBwZGV2LT52aWV3X21pbi55OwogCXBkZXYtPnZpZXdfbWF4LnNpemUgPSBwZGV2LT52aWV3X21heC54ICogcGRldi0+dmlld19tYXgueTsKLQkvKiBsZW5ndGggb2YgaW1hZ2UsIGluIFlVViBmb3JtYXQ7IGFsd2F5cyBhbGxvY2F0ZSBlbm91Z2ggbWVtb3J5LiAqLwotCXBkZXYtPmxlbl9wZXJfaW1hZ2UgPSBQQUdFX0FMSUdOKChwZGV2LT5hYnNfbWF4LnggKiBwZGV2LT5hYnNfbWF4LnkgKiAzKSAvIDIpOwogfQotCi0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy11bmNvbXByZXNzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtdW5jb21wcmVzcy5jCmluZGV4IDNiNzNmMjkuLjUxMjY1MDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy11bmNvbXByZXNzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXVuY29tcHJlc3MuYwpAQCAtMzAsMjYgKzMwLDE3IEBACiAjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CiAKICNpbmNsdWRlICJwd2MuaCIKLSNpbmNsdWRlICJwd2MtdW5jb21wcmVzcy5oIgogI2luY2x1ZGUgInB3Yy1kZWMxLmgiCiAjaW5jbHVkZSAicHdjLWRlYzIzLmgiCiAKLWludCBwd2NfZGVjb21wcmVzcyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK2ludCBwd2NfZGVjb21wcmVzcyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgc3RydWN0IHB3Y19mcmFtZV9idWYgKmZidWYpCiB7Ci0Jc3RydWN0IHB3Y19mcmFtZV9idWYgKmZidWY7CiAJaW50IG4sIGxpbmUsIGNvbCwgc3RyaWRlOwogCXZvaWQgKnl1diwgKmltYWdlOwogCXUxNiAqc3JjOwogCXUxNiAqZHN0eSwgKmRzdHUsICpkc3R2OwogCi0JaWYgKHBkZXYgPT0gTlVMTCkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0KLQlmYnVmID0gcGRldi0+cmVhZF9mcmFtZTsKLQlpZiAoZmJ1ZiA9PSBOVUxMKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlpbWFnZSAgPSBwZGV2LT5pbWFnZV9kYXRhOwotCWltYWdlICs9IHBkZXYtPmltYWdlc1twZGV2LT5maWxsX2ltYWdlXS5vZmZzZXQ7CisJaW1hZ2UgPSB2YjJfcGxhbmVfdmFkZHIoJmZidWYtPnZiLCAwKTsKIAogCXl1diA9IGZidWYtPmRhdGEgKyBwZGV2LT5mcmFtZV9oZWFkZXJfc2l6ZTsgIC8qIFNraXAgaGVhZGVyICovCiAKQEAgLTY0LDkgKzU1LDEzIEBACiAJCQkgKiBkZXRlcm1pbmUgdGhpcyB1c2luZyB0aGUgdHlwZSBvZiB0aGUgd2ViY2FtICovCiAJCW1lbWNweShyYXdfZnJhbWUtPmNtZCwgcGRldi0+Y21kX2J1ZiwgNCk7CiAJCW1lbWNweShyYXdfZnJhbWUrMSwgeXV2LCBwZGV2LT5mcmFtZV9zaXplKTsKKwkJdmIyX3NldF9wbGFuZV9wYXlsb2FkKCZmYnVmLT52YiwgMCwKKwkJCXBkZXYtPmZyYW1lX3NpemUgKyBzaXplb2Yoc3RydWN0IHB3Y19yYXdfZnJhbWUpKTsKIAkJcmV0dXJuIDA7CiAJfQogCisJdmIyX3NldF9wbGFuZV9wYXlsb2FkKCZmYnVmLT52YiwgMCwgcGRldi0+dmlldy5zaXplKTsKKwogCWlmIChwZGV2LT52YmFuZGxlbmd0aCA9PSAwKSB7CiAJCS8qIFVuY29tcHJlc3NlZCBtb2RlLgogCQkgKiBXZSBjb3B5IHRoZSBkYXRhIGludG8gdGhlIG91dHB1dCBidWZmZXIsIHVzaW5nIHRoZSB2aWV3cG9ydApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXVuY29tcHJlc3MuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy11bmNvbXByZXNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMDI4ZTcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXVuY29tcHJlc3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qIChDKSAxOTk5LTIwMDMgTmVtb3NvZnQgVW52LgotICAgKEMpIDIwMDQtMjAwNiBMdWMgU2FpbGxhcmQgKGx1Y0BzYWlsbGFyZC5vcmcpCi0KLSAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAotICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCi0gICBQbGVhc2Ugc2VuZCBidWcgcmVwb3J0cyBhbmQgc3VwcG9ydCByZXF1ZXN0cyB0byA8bHVjQHNhaWxsYXJkLm9yZz4uCi0gICBUaGUgZGVjb21wcmVzc2lvbiByb3V0aW5lcyBoYXZlIGJlZW4gaW1wbGVtZW50ZWQgYnkgcmV2ZXJzZS1lbmdpbmVlcmluZyB0aGUKLSAgIE5lbW9zb2Z0IGJpbmFyeSBwd2N4IG1vZHVsZS4gQ2F2ZWF0IGVtcHRvci4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLQotICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQotICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLQotICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCi0qLwotCi0vKiBUaGlzIGZpbGUgaXMgdGhlIGJyaWRnZSBiZXR3ZWVuIHRoZSBrZXJuZWwgbW9kdWxlIGFuZCB0aGUgcGx1Z2luOyBpdAotICAgZGVzY3JpYmVzIHRoZSBzdHJ1Y3R1cmVzIGFuZCBkYXRhdHlwZXMgdXNlZCBpbiBib3RoIG1vZHVsZXMuIEFueQotICAgc2lnbmlmaWNhbnQgY2hhbmdlIHNob3VsZCBiZSByZWZsZWN0ZWQgYnkgaW5jcmVhc2luZyB0aGUKLSAgIHB3Y19kZWNvbXByZXNzb3JfdmVyc2lvbiBtYWpvciBudW1iZXIuCi0gKi8KLSNpZm5kZWYgUFdDX1VOQ09NUFJFU1NfSAotI2RlZmluZSBQV0NfVU5DT01QUkVTU19ICi0KLQotI2luY2x1ZGUgPG1lZGlhL3B3Yy1pb2N0bC5oPgotCi0vKiBmcm9tIHB3Yy1kZWMuaCAqLwotI2RlZmluZSBQV0NYX0ZMQUdfUExBTkFSICAgICAgICAweDAwMDEKLS8qICovCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXY0bC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLXY0bC5jCmluZGV4IGY4NWM1MTIuLmU5YTBlOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy12NGwuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3B3Yy9wd2MtdjRsLmMKQEAgLTIsNiArMiw3IEBACiAgICBVU0IgYW5kIFZpZGVvNExpbnV4IGludGVyZmFjZSBwYXJ0LgogICAgKEMpIDE5OTktMjAwNCBOZW1vc29mdCBVbnYuCiAgICAoQykgMjAwNC0yMDA2IEx1YyBTYWlsbGFyZCAobHVjQHNhaWxsYXJkLm9yZykKKyAgIChDKSAyMDExIEhhbnMgZGUgR29lZGUgPGhkZWdvZWRlQHJlZGhhdC5jb20+CiAKICAgIE5PVEU6IHRoaXMgdmVyc2lvbiBvZiBwd2MgaXMgYW4gdW5vZmZpY2lhbCAobW9kaWZpZWQpIHJlbGVhc2Ugb2YgcHdjICYgcGN3eAogICAgZHJpdmVyIGFuZCB0aHVzIG1heSBoYXZlIGJ1Z3MgdGhhdCBhcmUgbm90IHByZXNlbnQgaW4gdGhlIG9yaWdpbmFsIHZlcnNpb24uCkBAIC0zMSwxODQgKzMyLDMzMCBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogCiAjaW5jbHVkZSAicHdjLmgiCiAKLXN0YXRpYyBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgcHdjX2NvbnRyb2xzW10gPSB7Ci0JewotCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX0JSSUdIVE5FU1MsCi0JICAgIC50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkgICAgLm5hbWUgICAgPSAiQnJpZ2h0bmVzcyIsCi0JICAgIC5taW5pbXVtID0gMCwKLQkgICAgLm1heGltdW0gPSAxMjgsCi0JICAgIC5zdGVwICAgID0gMSwKLQkgICAgLmRlZmF1bHRfdmFsdWUgPSA2NCwKLQl9LAotCXsKLQkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9DT05UUkFTVCwKLQkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCSAgICAubmFtZSAgICA9ICJDb250cmFzdCIsCi0JICAgIC5taW5pbXVtID0gMCwKLQkgICAgLm1heGltdW0gPSA2NCwKLQkgICAgLnN0ZXAgICAgPSAxLAotCSAgICAuZGVmYXVsdF92YWx1ZSA9IDAsCi0JfSwKLQl7Ci0JICAgIC5pZCAgICAgID0gVjRMMl9DSURfU0FUVVJBVElPTiwKLQkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCSAgICAubmFtZSAgICA9ICJTYXR1cmF0aW9uIiwKLQkgICAgLm1pbmltdW0gPSAtMTAwLAotCSAgICAubWF4aW11bSA9IDEwMCwKLQkgICAgLnN0ZXAgICAgPSAxLAotCSAgICAuZGVmYXVsdF92YWx1ZSA9IDAsCi0JfSwKLQl7Ci0JICAgIC5pZCAgICAgID0gVjRMMl9DSURfR0FNTUEsCi0JICAgIC50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkgICAgLm5hbWUgICAgPSAiR2FtbWEiLAotCSAgICAubWluaW11bSA9IDAsCi0JICAgIC5tYXhpbXVtID0gMzIsCi0JICAgIC5zdGVwICAgID0gMSwKLQkgICAgLmRlZmF1bHRfdmFsdWUgPSAwLAotCX0sCi0JewotCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX1JFRF9CQUxBTkNFLAotCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JICAgIC5uYW1lICAgID0gIlJlZCBHYWluIiwKLQkgICAgLm1pbmltdW0gPSAwLAotCSAgICAubWF4aW11bSA9IDI1NiwKLQkgICAgLnN0ZXAgICAgPSAxLAotCSAgICAuZGVmYXVsdF92YWx1ZSA9IDAsCi0JfSwKLQl7Ci0JICAgIC5pZCAgICAgID0gVjRMMl9DSURfQkxVRV9CQUxBTkNFLAotCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JICAgIC5uYW1lICAgID0gIkJsdWUgR2FpbiIsCi0JICAgIC5taW5pbXVtID0gMCwKLQkgICAgLm1heGltdW0gPSAyNTYsCi0JICAgIC5zdGVwICAgID0gMSwKLQkgICAgLmRlZmF1bHRfdmFsdWUgPSAwLAotCX0sCi0JewotCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRSwKLQkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCSAgICAubmFtZSAgICA9ICJBdXRvIFdoaXRlIEJhbGFuY2UiLAotCSAgICAubWluaW11bSA9IDAsCi0JICAgIC5tYXhpbXVtID0gMSwKLQkgICAgLnN0ZXAgICAgPSAxLAotCSAgICAuZGVmYXVsdF92YWx1ZSA9IDAsCi0JfSwKLQl7Ci0JICAgIC5pZCAgICAgID0gVjRMMl9DSURfRVhQT1NVUkUsCi0JICAgIC50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKLQkgICAgLm5hbWUgICAgPSAiU2h1dHRlciBTcGVlZCAoRXhwb3N1cmUpIiwKLQkgICAgLm1pbmltdW0gPSAwLAotCSAgICAubWF4aW11bSA9IDI1NiwKLQkgICAgLnN0ZXAgICAgPSAxLAotCSAgICAuZGVmYXVsdF92YWx1ZSA9IDIwMCwKLQl9LAotCXsKLQkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9BVVRPR0FJTiwKLQkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCSAgICAubmFtZSAgICA9ICJBdXRvIEdhaW4gRW5hYmxlZCIsCi0JICAgIC5taW5pbXVtID0gMCwKLQkgICAgLm1heGltdW0gPSAxLAotCSAgICAuc3RlcCAgICA9IDEsCi0JICAgIC5kZWZhdWx0X3ZhbHVlID0gMSwKLQl9LAotCXsKLQkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9HQUlOLAotCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JICAgIC5uYW1lICAgID0gIkdhaW4gTGV2ZWwiLAotCSAgICAubWluaW11bSA9IDAsCi0JICAgIC5tYXhpbXVtID0gMjU2LAotCSAgICAuc3RlcCAgICA9IDEsCi0JICAgIC5kZWZhdWx0X3ZhbHVlID0gMCwKLQl9LAotCXsKLQkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX1NBVkVfVVNFUiwKLQkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9CVVRUT04sCi0JICAgIC5uYW1lICAgID0gIlNhdmUgVXNlciBTZXR0aW5ncyIsCi0JICAgIC5taW5pbXVtID0gMCwKLQkgICAgLm1heGltdW0gPSAwLAotCSAgICAuc3RlcCAgICA9IDAsCi0JICAgIC5kZWZhdWx0X3ZhbHVlID0gMCwKLQl9LAotCXsKLQkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX1JFU1RPUkVfVVNFUiwKLQkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9CVVRUT04sCi0JICAgIC5uYW1lICAgID0gIlJlc3RvcmUgVXNlciBTZXR0aW5ncyIsCi0JICAgIC5taW5pbXVtID0gMCwKLQkgICAgLm1heGltdW0gPSAwLAotCSAgICAuc3RlcCAgICA9IDAsCi0JICAgIC5kZWZhdWx0X3ZhbHVlID0gMCwKLQl9LAotCXsKLQkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX1JFU1RPUkVfRkFDVE9SWSwKLQkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9CVVRUT04sCi0JICAgIC5uYW1lICAgID0gIlJlc3RvcmUgRmFjdG9yeSBTZXR0aW5ncyIsCi0JICAgIC5taW5pbXVtID0gMCwKLQkgICAgLm1heGltdW0gPSAwLAotCSAgICAuc3RlcCAgICA9IDAsCi0JICAgIC5kZWZhdWx0X3ZhbHVlID0gMCwKLQl9LAotCXsKLQkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX0NPTE9VUl9NT0RFLAotCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCi0JICAgIC5uYW1lICAgID0gIkNvbG91ciBtb2RlIiwKLQkgICAgLm1pbmltdW0gPSAwLAotCSAgICAubWF4aW11bSA9IDEsCi0JICAgIC5zdGVwICAgID0gMSwKLQkgICAgLmRlZmF1bHRfdmFsdWUgPSAwLAotCX0sCi0JewotCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX1BSSVZBVEVfQVVUT0NPTlRPVVIsCi0JICAgIC50eXBlICAgID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKLQkgICAgLm5hbWUgICAgPSAiQXV0byBjb250b3VyIiwKLQkgICAgLm1pbmltdW0gPSAwLAotCSAgICAubWF4aW11bSA9IDEsCi0JICAgIC5zdGVwICAgID0gMSwKLQkgICAgLmRlZmF1bHRfdmFsdWUgPSAwLAotCX0sCi0JewotCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX1BSSVZBVEVfQ09OVE9VUiwKLQkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAotCSAgICAubmFtZSAgICA9ICJDb250b3VyIiwKLQkgICAgLm1pbmltdW0gPSAwLAotCSAgICAubWF4aW11bSA9IDYzLAotCSAgICAuc3RlcCAgICA9IDEsCi0JICAgIC5kZWZhdWx0X3ZhbHVlID0gMCwKLQl9LAotCXsKLQkgICAgLmlkICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX0JBQ0tMSUdIVCwKLQkgICAgLnR5cGUgICAgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCSAgICAubmFtZSAgICA9ICJCYWNrbGlnaHQgY29tcGVuc2F0aW9uIiwKLQkgICAgLm1pbmltdW0gPSAwLAotCSAgICAubWF4aW11bSA9IDEsCi0JICAgIC5zdGVwICAgID0gMSwKLQkgICAgLmRlZmF1bHRfdmFsdWUgPSAwLAotCX0sCi0JewotCSAgLmlkICAgICAgPSBWNEwyX0NJRF9QUklWQVRFX0ZMSUNLRVJMRVNTLAotCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCi0JICAgIC5uYW1lICAgID0gIkZsaWNrZXJsZXNzIiwKLQkgICAgLm1pbmltdW0gPSAwLAotCSAgICAubWF4aW11bSA9IDEsCi0JICAgIC5zdGVwICAgID0gMSwKLQkgICAgLmRlZmF1bHRfdmFsdWUgPSAwLAotCX0sCi0JewotCSAgICAuaWQgICAgICA9IFY0TDJfQ0lEX1BSSVZBVEVfTk9JU0VfUkVEVUNUSU9OLAotCSAgICAudHlwZSAgICA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCi0JICAgIC5uYW1lICAgID0gIk5vaXNlIHJlZHVjdGlvbiIsCi0JICAgIC5taW5pbXVtID0gMCwKLQkgICAgLm1heGltdW0gPSAzLAotCSAgICAuc3RlcCAgICA9IDEsCi0JICAgIC5kZWZhdWx0X3ZhbHVlID0gMCwKLQl9LAorI2RlZmluZSBQV0NfQ0lEX0NVU1RPTShjdHJsKSAoKFY0TDJfQ0lEX1VTRVJfQkFTRSB8IDB4ZjAwMCkgKyBjdXN0b21fICMjIGN0cmwpCisKK3N0YXRpYyBpbnQgcHdjX2dfdm9sYXRpbGVfY3RybChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKTsKK3N0YXRpYyBpbnQgcHdjX3NfY3RybChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfb3BzIHB3Y19jdHJsX29wcyA9IHsKKwkuZ192b2xhdGlsZV9jdHJsID0gcHdjX2dfdm9sYXRpbGVfY3RybCwKKwkuc19jdHJsID0gcHdjX3NfY3RybCwKIH07CiAKK2VudW0geyBhd2JfaW5kb29yLCBhd2Jfb3V0ZG9vciwgYXdiX2ZsLCBhd2JfbWFudWFsLCBhd2JfYXV0byB9OworZW51bSB7IGN1c3RvbV9hdXRvY29udG91ciwgY3VzdG9tX2NvbnRvdXIsIGN1c3RvbV9ub2lzZV9yZWR1Y3Rpb24sCisJY3VzdG9tX3NhdmVfdXNlciwgY3VzdG9tX3Jlc3RvcmVfdXNlciwgY3VzdG9tX3Jlc3RvcmVfZmFjdG9yeSB9OworCitjb25zdCBjaGFyICogY29uc3QgcHdjX2F1dG9fd2hpdGViYWxfcW1lbnVbXSA9IHsKKwkiSW5kb29yIChJbmNhbmRlc2NhbnQgTGlnaHRpbmcpIE1vZGUiLAorCSJPdXRkb29yIChTdW5saWdodCkgTW9kZSIsCisJIkluZG9vciAoRmx1b3Jlc2NlbnQgTGlnaHRpbmcpIE1vZGUiLAorCSJNYW51YWwgTW9kZSIsCisJIkF1dG8gTW9kZSIsCisJTlVMTAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfY29uZmlnIHB3Y19hdXRvX3doaXRlX2JhbGFuY2VfY2ZnID0geworCS5vcHMJPSAmcHdjX2N0cmxfb3BzLAorCS5pZAk9IFY0TDJfQ0lEX0FVVE9fV0hJVEVfQkFMQU5DRSwKKwkudHlwZQk9IFY0TDJfQ1RSTF9UWVBFX01FTlUsCisJLm1heAk9IGF3Yl9hdXRvLAorCS5xbWVudQk9IHB3Y19hdXRvX3doaXRlYmFsX3FtZW51LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfY29uZmlnIHB3Y19hdXRvY29udG91cl9jZmcgPSB7CisJLm9wcwk9ICZwd2NfY3RybF9vcHMsCisJLmlkCT0gUFdDX0NJRF9DVVNUT00oYXV0b2NvbnRvdXIpLAorCS50eXBlCT0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkubmFtZQk9ICJBdXRvIGNvbnRvdXIiLAorCS5taW4JPSAwLAorCS5tYXgJPSAxLAorCS5zdGVwCT0gMSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX2NvbmZpZyBwd2NfY29udG91cl9jZmcgPSB7CisJLm9wcwk9ICZwd2NfY3RybF9vcHMsCisJLmlkCT0gUFdDX0NJRF9DVVNUT00oY29udG91ciksCisJLnR5cGUJPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCS5uYW1lCT0gIkNvbnRvdXIiLAorCS5taW4JPSAwLAorCS5tYXgJPSA2MywKKwkuc3RlcAk9IDEsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9jb25maWcgcHdjX2JhY2tsaWdodF9jZmcgPSB7CisJLm9wcwk9ICZwd2NfY3RybF9vcHMsCisJLmlkCT0gVjRMMl9DSURfQkFDS0xJR0hUX0NPTVBFTlNBVElPTiwKKwkudHlwZQk9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJLm1pbgk9IDAsCisJLm1heAk9IDEsCisJLnN0ZXAJPSAxLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfY29uZmlnIHB3Y19mbGlja2VyX2NmZyA9IHsKKwkub3BzCT0gJnB3Y19jdHJsX29wcywKKwkuaWQJPSBWNEwyX0NJRF9CQU5EX1NUT1BfRklMVEVSLAorCS50eXBlCT0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkubWluCT0gMCwKKwkubWF4CT0gMSwKKwkuc3RlcAk9IDEsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9jb25maWcgcHdjX25vaXNlX3JlZHVjdGlvbl9jZmcgPSB7CisJLm9wcwk9ICZwd2NfY3RybF9vcHMsCisJLmlkCT0gUFdDX0NJRF9DVVNUT00obm9pc2VfcmVkdWN0aW9uKSwKKwkudHlwZQk9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJLm5hbWUJPSAiRHluYW1pYyBOb2lzZSBSZWR1Y3Rpb24iLAorCS5taW4JPSAwLAorCS5tYXgJPSAzLAorCS5zdGVwCT0gMSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX2NvbmZpZyBwd2Nfc2F2ZV91c2VyX2NmZyA9IHsKKwkub3BzCT0gJnB3Y19jdHJsX29wcywKKwkuaWQJPSBQV0NfQ0lEX0NVU1RPTShzYXZlX3VzZXIpLAorCS50eXBlCT0gVjRMMl9DVFJMX1RZUEVfQlVUVE9OLAorCS5uYW1lICAgID0gIlNhdmUgVXNlciBTZXR0aW5ncyIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9jb25maWcgcHdjX3Jlc3RvcmVfdXNlcl9jZmcgPSB7CisJLm9wcwk9ICZwd2NfY3RybF9vcHMsCisJLmlkCT0gUFdDX0NJRF9DVVNUT00ocmVzdG9yZV91c2VyKSwKKwkudHlwZQk9IFY0TDJfQ1RSTF9UWVBFX0JVVFRPTiwKKwkubmFtZSAgICA9ICJSZXN0b3JlIFVzZXIgU2V0dGluZ3MiLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfY29uZmlnIHB3Y19yZXN0b3JlX2ZhY3RvcnlfY2ZnID0geworCS5vcHMJPSAmcHdjX2N0cmxfb3BzLAorCS5pZAk9IFBXQ19DSURfQ1VTVE9NKHJlc3RvcmVfZmFjdG9yeSksCisJLnR5cGUJPSBWNEwyX0NUUkxfVFlQRV9CVVRUT04sCisJLm5hbWUgICAgPSAiUmVzdG9yZSBGYWN0b3J5IFNldHRpbmdzIiwKK307CisKK2ludCBwd2NfaW5pdF9jb250cm9scyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgKmhkbDsKKwlzdHJ1Y3QgdjRsMl9jdHJsX2NvbmZpZyBjZmc7CisJaW50IHIsIGRlZjsKKworCWhkbCA9ICZwZGV2LT5jdHJsX2hhbmRsZXI7CisJciA9IHY0bDJfY3RybF9oYW5kbGVyX2luaXQoaGRsLCAyMCk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJLyogQnJpZ2h0bmVzcywgY29udHJhc3QsIHNhdHVyYXRpb24sIGdhbW1hICovCisJciA9IHB3Y19nZXRfdThfY3RybChwZGV2LCBHRVRfTFVNX0NUTCwgQlJJR0hUTkVTU19GT1JNQVRURVIsICZkZWYpOworCWlmIChyIHx8IGRlZiA+IDEyNykKKwkJZGVmID0gNjM7CisJcGRldi0+YnJpZ2h0bmVzcyA9IHY0bDJfY3RybF9uZXdfc3RkKGhkbCwgJnB3Y19jdHJsX29wcywKKwkJCQlWNEwyX0NJRF9CUklHSFRORVNTLCAwLCAxMjcsIDEsIGRlZik7CisKKwlyID0gcHdjX2dldF91OF9jdHJsKHBkZXYsIEdFVF9MVU1fQ1RMLCBDT05UUkFTVF9GT1JNQVRURVIsICZkZWYpOworCWlmIChyIHx8IGRlZiA+IDYzKQorCQlkZWYgPSAzMTsKKwlwZGV2LT5jb250cmFzdCA9IHY0bDJfY3RybF9uZXdfc3RkKGhkbCwgJnB3Y19jdHJsX29wcywKKwkJCQlWNEwyX0NJRF9DT05UUkFTVCwgMCwgNjMsIDEsIGRlZik7CisKKwlpZiAocGRldi0+dHlwZSA+PSA2NzUpIHsKKwkJaWYgKHBkZXYtPnR5cGUgPCA3MzApCisJCQlwZGV2LT5zYXR1cmF0aW9uX2ZtdCA9IFNBVFVSQVRJT05fTU9ERV9GT1JNQVRURVIyOworCQllbHNlCisJCQlwZGV2LT5zYXR1cmF0aW9uX2ZtdCA9IFNBVFVSQVRJT05fTU9ERV9GT1JNQVRURVIxOworCQlyID0gcHdjX2dldF9zOF9jdHJsKHBkZXYsIEdFVF9DSFJPTV9DVEwsIHBkZXYtPnNhdHVyYXRpb25fZm10LAorCQkJCSAgICAmZGVmKTsKKwkJaWYgKHIgfHwgZGVmIDwgLTEwMCB8fCBkZWYgPiAxMDApCisJCQlkZWYgPSAwOworCQlwZGV2LT5zYXR1cmF0aW9uID0gdjRsMl9jdHJsX25ld19zdGQoaGRsLCAmcHdjX2N0cmxfb3BzLAorCQkJCSAgICAgIFY0TDJfQ0lEX1NBVFVSQVRJT04sIC0xMDAsIDEwMCwgMSwgZGVmKTsKKwl9CisKKwlyID0gcHdjX2dldF91OF9jdHJsKHBkZXYsIEdFVF9MVU1fQ1RMLCBHQU1NQV9GT1JNQVRURVIsICZkZWYpOworCWlmIChyIHx8IGRlZiA+IDMxKQorCQlkZWYgPSAxNTsKKwlwZGV2LT5nYW1tYSA9IHY0bDJfY3RybF9uZXdfc3RkKGhkbCwgJnB3Y19jdHJsX29wcywKKwkJCQlWNEwyX0NJRF9HQU1NQSwgMCwgMzEsIDEsIGRlZik7CisKKwkvKiBhdXRvIHdoaXRlIGJhbGFuY2UsIHJlZCBnYWluLCBibHVlIGdhaW4gKi8KKwlyID0gcHdjX2dldF91OF9jdHJsKHBkZXYsIEdFVF9DSFJPTV9DVEwsIFdCX01PREVfRk9STUFUVEVSLCAmZGVmKTsKKwlpZiAociB8fCBkZWYgPiBhd2JfYXV0bykKKwkJZGVmID0gYXdiX2F1dG87CisJY2ZnID0gcHdjX2F1dG9fd2hpdGVfYmFsYW5jZV9jZmc7CisJY2ZnLm5hbWUgPSB2NGwyX2N0cmxfZ2V0X25hbWUoY2ZnLmlkKTsKKwljZmcuZGVmID0gZGVmOworCXBkZXYtPmF1dG9fd2hpdGVfYmFsYW5jZSA9IHY0bDJfY3RybF9uZXdfY3VzdG9tKGhkbCwgJmNmZywgTlVMTCk7CisJLyogY2hlY2sgYXV0byBjb250cm9scyB0byBhdm9pZCBOVUxMIGRlcmVmIGluIHY0bDJfY3RybF9hdXRvX2NsdXN0ZXIgKi8KKwlpZiAoIXBkZXYtPmF1dG9fd2hpdGVfYmFsYW5jZSkKKwkJcmV0dXJuIGhkbC0+ZXJyb3I7CisKKwlyID0gcHdjX2dldF91OF9jdHJsKHBkZXYsIEdFVF9DSFJPTV9DVEwsCisJCQkgICAgUFJFU0VUX01BTlVBTF9SRURfR0FJTl9GT1JNQVRURVIsICZkZWYpOworCWlmIChyKQorCQlkZWYgPSAxMjc7CisJcGRldi0+cmVkX2JhbGFuY2UgPSB2NGwyX2N0cmxfbmV3X3N0ZChoZGwsICZwd2NfY3RybF9vcHMsCisJCQkJVjRMMl9DSURfUkVEX0JBTEFOQ0UsIDAsIDI1NSwgMSwgZGVmKTsKKworCXIgPSBwd2NfZ2V0X3U4X2N0cmwocGRldiwgR0VUX0NIUk9NX0NUTCwKKwkJCSAgICBQUkVTRVRfTUFOVUFMX0JMVUVfR0FJTl9GT1JNQVRURVIsICZkZWYpOworCWlmIChyKQorCQlkZWYgPSAxMjc7CisJcGRldi0+Ymx1ZV9iYWxhbmNlID0gdjRsMl9jdHJsX25ld19zdGQoaGRsLCAmcHdjX2N0cmxfb3BzLAorCQkJCVY0TDJfQ0lEX0JMVUVfQkFMQU5DRSwgMCwgMjU1LCAxLCBkZWYpOworCisJdjRsMl9jdHJsX2F1dG9fY2x1c3RlcigzLCAmcGRldi0+YXV0b193aGl0ZV9iYWxhbmNlLCBhd2JfbWFudWFsLAorCQkJICAgICAgIHBkZXYtPmF1dG9fd2hpdGVfYmFsYW5jZS0+Y3VyLnZhbCA9PSBhd2JfYXV0byk7CisKKwkvKiBhdXRvZ2FpbiwgZ2FpbiAqLworCXIgPSBwd2NfZ2V0X3U4X2N0cmwocGRldiwgR0VUX0xVTV9DVEwsIEFHQ19NT0RFX0ZPUk1BVFRFUiwgJmRlZik7CisJaWYgKHIgfHwgKGRlZiAhPSAwICYmIGRlZiAhPSAweGZmKSkKKwkJZGVmID0gMDsKKwkvKiBOb3RlIGEgcmVnaXN0ZXIgdmFsdWUgaWYgMCBtZWFucyBhdXRvIGdhaW4gaXMgb24gKi8KKwlwZGV2LT5hdXRvZ2FpbiA9IHY0bDJfY3RybF9uZXdfc3RkKGhkbCwgJnB3Y19jdHJsX29wcywKKwkJCQlWNEwyX0NJRF9BVVRPR0FJTiwgMCwgMSwgMSwgZGVmID09IDApOworCWlmICghcGRldi0+YXV0b2dhaW4pCisJCXJldHVybiBoZGwtPmVycm9yOworCisJciA9IHB3Y19nZXRfdThfY3RybChwZGV2LCBHRVRfTFVNX0NUTCwgUFJFU0VUX0FHQ19GT1JNQVRURVIsICZkZWYpOworCWlmIChyIHx8IGRlZiA+IDYzKQorCQlkZWYgPSAzMTsKKwlwZGV2LT5nYWluID0gdjRsMl9jdHJsX25ld19zdGQoaGRsLCAmcHdjX2N0cmxfb3BzLAorCQkJCVY0TDJfQ0lEX0dBSU4sIDAsIDYzLCAxLCBkZWYpOworCisJLyogYXV0byBleHBvc3VyZSwgZXhwb3N1cmUgKi8KKwlpZiAoREVWSUNFX1VTRV9DT0RFQzIocGRldi0+dHlwZSkpIHsKKwkJciA9IHB3Y19nZXRfdThfY3RybChwZGV2LCBHRVRfTFVNX0NUTCwgU0hVVFRFUl9NT0RFX0ZPUk1BVFRFUiwKKwkJCQkgICAgJmRlZik7CisJCWlmIChyIHx8IChkZWYgIT0gMCAmJiBkZWYgIT0gMHhmZikpCisJCQlkZWYgPSAwOworCQkvKgorCQkgKiBkZWYgPSAwIGF1dG8sIGRlZiA9IGZmIG1hbnVhbAorCQkgKiBtZW51IGlkeCAwID0gYXV0bywgaWR4IDEgPSBtYW51YWwKKwkJICovCisJCXBkZXYtPmV4cG9zdXJlX2F1dG8gPSB2NGwyX2N0cmxfbmV3X3N0ZF9tZW51KGhkbCwKKwkJCQkJJnB3Y19jdHJsX29wcywKKwkJCQkJVjRMMl9DSURfRVhQT1NVUkVfQVVUTywKKwkJCQkJMSwgMCwgZGVmICE9IDApOworCQlpZiAoIXBkZXYtPmV4cG9zdXJlX2F1dG8pCisJCQlyZXR1cm4gaGRsLT5lcnJvcjsKKworCQkvKiBHRVRfTFVNX0NUTCwgUFJFU0VUX1NIVVRURVJfRk9STUFUVEVSIGlzIHVucmVsaWFibGUgKi8KKwkJciA9IHB3Y19nZXRfdTE2X2N0cmwocGRldiwgR0VUX1NUQVRVU19DVEwsCisJCQkJICAgICBSRUFEX1NIVVRURVJfRk9STUFUVEVSLCAmZGVmKTsKKwkJaWYgKHIgfHwgZGVmID4gNjU1KQorCQkJZGVmID0gNjU1OworCQlwZGV2LT5leHBvc3VyZSA9IHY0bDJfY3RybF9uZXdfc3RkKGhkbCwgJnB3Y19jdHJsX29wcywKKwkJCQkJVjRMMl9DSURfRVhQT1NVUkUsIDAsIDY1NSwgMSwgZGVmKTsKKwkJLyogQ09ERUMyOiBzZXBhcmF0ZSBhdXRvIGdhaW4gJiBhdXRvIGV4cG9zdXJlICovCisJCXY0bDJfY3RybF9hdXRvX2NsdXN0ZXIoMiwgJnBkZXYtPmF1dG9nYWluLCAwLCB0cnVlKTsKKwkJdjRsMl9jdHJsX2F1dG9fY2x1c3RlcigyLCAmcGRldi0+ZXhwb3N1cmVfYXV0bywKKwkJCQkgICAgICAgVjRMMl9FWFBPU1VSRV9NQU5VQUwsIHRydWUpOworCX0gZWxzZSBpZiAoREVWSUNFX1VTRV9DT0RFQzMocGRldi0+dHlwZSkpIHsKKwkJLyogR0VUX0xVTV9DVEwsIFBSRVNFVF9TSFVUVEVSX0ZPUk1BVFRFUiBpcyB1bnJlbGlhYmxlICovCisJCXIgPSBwd2NfZ2V0X3UxNl9jdHJsKHBkZXYsIEdFVF9TVEFUVVNfQ1RMLAorCQkJCSAgICAgUkVBRF9TSFVUVEVSX0ZPUk1BVFRFUiwgJmRlZik7CisJCWlmIChyIHx8IGRlZiA+IDI1NSkKKwkJCWRlZiA9IDI1NTsKKwkJcGRldi0+ZXhwb3N1cmUgPSB2NGwyX2N0cmxfbmV3X3N0ZChoZGwsICZwd2NfY3RybF9vcHMsCisJCQkJCVY0TDJfQ0lEX0VYUE9TVVJFLCAwLCAyNTUsIDEsIGRlZik7CisJCS8qIENPREVDMzogYm90aCBnYWluIGFuZCBleHBvc3VyZSBjb250cm9sbGVkIGJ5IGF1dG9nYWluICovCisJCXBkZXYtPmF1dG9nYWluX2V4cG9fY2x1c3RlclswXSA9IHBkZXYtPmF1dG9nYWluOworCQlwZGV2LT5hdXRvZ2Fpbl9leHBvX2NsdXN0ZXJbMV0gPSBwZGV2LT5nYWluOworCQlwZGV2LT5hdXRvZ2Fpbl9leHBvX2NsdXN0ZXJbMl0gPSBwZGV2LT5leHBvc3VyZTsKKwkJdjRsMl9jdHJsX2F1dG9fY2x1c3RlcigzLCBwZGV2LT5hdXRvZ2Fpbl9leHBvX2NsdXN0ZXIsCisJCQkJICAgICAgIDAsIHRydWUpOworCX0KKworCS8qIGNvbG9yIC8gYncgc2V0dGluZyAqLworCXIgPSBwd2NfZ2V0X3U4X2N0cmwocGRldiwgR0VUX0NIUk9NX0NUTCwgQ09MT1VSX01PREVfRk9STUFUVEVSLAorCQkJICZkZWYpOworCWlmIChyIHx8IChkZWYgIT0gMCAmJiBkZWYgIT0gMHhmZikpCisJCWRlZiA9IDB4ZmY7CisJLyogZGVmID0gMCBidywgZGVmID0gZmYgY29sb3IsIG1lbnUgaWR4IDAgPSBjb2xvciwgaWR4IDEgPSBidyAqLworCXBkZXYtPmNvbG9yZnggPSB2NGwyX2N0cmxfbmV3X3N0ZF9tZW51KGhkbCwgJnB3Y19jdHJsX29wcywKKwkJCQlWNEwyX0NJRF9DT0xPUkZYLCAxLCAwLCBkZWYgPT0gMCk7CisKKwkvKiBhdXRvY29udG91ciwgY29udG91ciAqLworCXIgPSBwd2NfZ2V0X3U4X2N0cmwocGRldiwgR0VUX0xVTV9DVEwsIEFVVE9fQ09OVE9VUl9GT1JNQVRURVIsICZkZWYpOworCWlmIChyIHx8IChkZWYgIT0gMCAmJiBkZWYgIT0gMHhmZikpCisJCWRlZiA9IDA7CisJY2ZnID0gcHdjX2F1dG9jb250b3VyX2NmZzsKKwljZmcuZGVmID0gZGVmID09IDA7CisJcGRldi0+YXV0b2NvbnRvdXIgPSB2NGwyX2N0cmxfbmV3X2N1c3RvbShoZGwsICZjZmcsIE5VTEwpOworCWlmICghcGRldi0+YXV0b2NvbnRvdXIpCisJCXJldHVybiBoZGwtPmVycm9yOworCisJciA9IHB3Y19nZXRfdThfY3RybChwZGV2LCBHRVRfTFVNX0NUTCwgUFJFU0VUX0NPTlRPVVJfRk9STUFUVEVSLCAmZGVmKTsKKwlpZiAociB8fCBkZWYgPiA2MykKKwkJZGVmID0gMzE7CisJY2ZnID0gcHdjX2NvbnRvdXJfY2ZnOworCWNmZy5kZWYgPSBkZWY7CisJcGRldi0+Y29udG91ciA9IHY0bDJfY3RybF9uZXdfY3VzdG9tKGhkbCwgJmNmZywgTlVMTCk7CisKKwl2NGwyX2N0cmxfYXV0b19jbHVzdGVyKDIsICZwZGV2LT5hdXRvY29udG91ciwgMCwgZmFsc2UpOworCisJLyogYmFja2xpZ2h0ICovCisJciA9IHB3Y19nZXRfdThfY3RybChwZGV2LCBHRVRfTFVNX0NUTCwKKwkJCSAgICBCQUNLX0xJR0hUX0NPTVBFTlNBVElPTl9GT1JNQVRURVIsICZkZWYpOworCWlmIChyIHx8IChkZWYgIT0gMCAmJiBkZWYgIT0gMHhmZikpCisJCWRlZiA9IDA7CisJY2ZnID0gcHdjX2JhY2tsaWdodF9jZmc7CisJY2ZnLm5hbWUgPSB2NGwyX2N0cmxfZ2V0X25hbWUoY2ZnLmlkKTsKKwljZmcuZGVmID0gZGVmID09IDA7CisJcGRldi0+YmFja2xpZ2h0ID0gdjRsMl9jdHJsX25ld19jdXN0b20oaGRsLCAmY2ZnLCBOVUxMKTsKKworCS8qIGZsaWtrZXIgcmVkaWN0aW9uICovCisJciA9IHB3Y19nZXRfdThfY3RybChwZGV2LCBHRVRfTFVNX0NUTCwKKwkJCSAgICBGTElDS0VSTEVTU19NT0RFX0ZPUk1BVFRFUiwgJmRlZik7CisJaWYgKHIgfHwgKGRlZiAhPSAwICYmIGRlZiAhPSAweGZmKSkKKwkJZGVmID0gMDsKKwljZmcgPSBwd2NfZmxpY2tlcl9jZmc7CisJY2ZnLm5hbWUgPSB2NGwyX2N0cmxfZ2V0X25hbWUoY2ZnLmlkKTsKKwljZmcuZGVmID0gZGVmID09IDA7CisJcGRldi0+ZmxpY2tlciA9IHY0bDJfY3RybF9uZXdfY3VzdG9tKGhkbCwgJmNmZywgTlVMTCk7CisKKwkvKiBEeW5hbWljIG5vaXNlIHJlZHVjdGlvbiAqLworCXIgPSBwd2NfZ2V0X3U4X2N0cmwocGRldiwgR0VUX0xVTV9DVEwsCisJCQkgICAgRFlOQU1JQ19OT0lTRV9DT05UUk9MX0ZPUk1BVFRFUiwgJmRlZik7CisJaWYgKHIgfHwgZGVmID4gMykKKwkJZGVmID0gMjsKKwljZmcgPSBwd2Nfbm9pc2VfcmVkdWN0aW9uX2NmZzsKKwljZmcuZGVmID0gZGVmOworCXBkZXYtPm5vaXNlX3JlZHVjdGlvbiA9IHY0bDJfY3RybF9uZXdfY3VzdG9tKGhkbCwgJmNmZywgTlVMTCk7CisKKwkvKiBTYXZlIC8gUmVzdG9yZSBVc2VyIC8gRmFjdG9yeSBTZXR0aW5ncyAqLworCXBkZXYtPnNhdmVfdXNlciA9IHY0bDJfY3RybF9uZXdfY3VzdG9tKGhkbCwgJnB3Y19zYXZlX3VzZXJfY2ZnLCBOVUxMKTsKKwlwZGV2LT5yZXN0b3JlX3VzZXIgPSB2NGwyX2N0cmxfbmV3X2N1c3RvbShoZGwsICZwd2NfcmVzdG9yZV91c2VyX2NmZywKKwkJCQkJCSAgTlVMTCk7CisJaWYgKHBkZXYtPnJlc3RvcmVfdXNlcikKKwkJcGRldi0+cmVzdG9yZV91c2VyLT5mbGFncyA9IFY0TDJfQ1RSTF9GTEFHX1VQREFURTsKKwlwZGV2LT5yZXN0b3JlX2ZhY3RvcnkgPSB2NGwyX2N0cmxfbmV3X2N1c3RvbShoZGwsCisJCQkJCQkgICAgICZwd2NfcmVzdG9yZV9mYWN0b3J5X2NmZywKKwkJCQkJCSAgICAgTlVMTCk7CisJaWYgKHBkZXYtPnJlc3RvcmVfZmFjdG9yeSkKKwkJcGRldi0+cmVzdG9yZV9mYWN0b3J5LT5mbGFncyA9IFY0TDJfQ1RSTF9GTEFHX1VQREFURTsKKworCWlmICghcGRldi0+ZmVhdHVyZXMgJiBGRUFUVVJFX01PVE9SX1BBTlRJTFQpCisJCXJldHVybiBoZGwtPmVycm9yOworCisJLyogTW90b3IgcGFuIC8gdGlsdCAvIHJlc2V0ICovCisJcGRldi0+bW90b3JfcGFuID0gdjRsMl9jdHJsX25ld19zdGQoaGRsLCAmcHdjX2N0cmxfb3BzLAorCQkJCVY0TDJfQ0lEX1BBTl9SRUxBVElWRSwgLTQ0ODAsIDQ0ODAsIDY0LCAwKTsKKwlpZiAoIXBkZXYtPm1vdG9yX3BhbikKKwkJcmV0dXJuIGhkbC0+ZXJyb3I7CisJcGRldi0+bW90b3JfdGlsdCA9IHY0bDJfY3RybF9uZXdfc3RkKGhkbCwgJnB3Y19jdHJsX29wcywKKwkJCQlWNEwyX0NJRF9USUxUX1JFTEFUSVZFLCAtMTkyMCwgMTkyMCwgNjQsIDApOworCXBkZXYtPm1vdG9yX3Bhbl9yZXNldCA9IHY0bDJfY3RybF9uZXdfc3RkKGhkbCwgJnB3Y19jdHJsX29wcywKKwkJCQlWNEwyX0NJRF9QQU5fUkVTRVQsIDAsIDAsIDAsIDApOworCXBkZXYtPm1vdG9yX3RpbHRfcmVzZXQgPSB2NGwyX2N0cmxfbmV3X3N0ZChoZGwsICZwd2NfY3RybF9vcHMsCisJCQkJVjRMMl9DSURfVElMVF9SRVNFVCwgMCwgMCwgMCwgMCk7CisJdjRsMl9jdHJsX2NsdXN0ZXIoNCwgJnBkZXYtPm1vdG9yX3Bhbik7CisKKwlyZXR1cm4gaGRsLT5lcnJvcjsKK30KIAogc3RhdGljIHZvaWQgcHdjX3ZpZGlvY19maWxsX2ZtdChjb25zdCBzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQogewpAQCAtMjg0LDEwICs0MzEsMjEgQEAKIH0KIAogLyogaW9jdGwoVklESU9DX1NFVF9GTVQpICovCi1zdGF0aWMgaW50IHB3Y192aWRpb2Nfc2V0X2ZtdChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQorCitzdGF0aWMgaW50IHB3Y19zX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQogeworCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAlpbnQgcmV0LCBmcHMsIHNuYXBzaG90LCBjb21wcmVzc2lvbiwgcGl4ZWxmb3JtYXQ7CiAKKwlpZiAoIXBkZXYtPnVkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHBkZXYtPmNhcHRfZmlsZSAhPSBOVUxMICYmCisJICAgIHBkZXYtPmNhcHRfZmlsZSAhPSBmaWxlKQorCQlyZXR1cm4gLUVCVVNZOworCisJcGRldi0+Y2FwdF9maWxlID0gZmlsZTsKKwogCXJldCA9IHB3Y192aWRpb2NfdHJ5X2ZtdChwZGV2LCBmKTsKIAlpZiAocmV0PDApCiAJCXJldHVybiByZXQ7CkBAIC0zMDksNyArNDY3LDcgQEAKIAkgICAgcGl4ZWxmb3JtYXQgIT0gVjRMMl9QSVhfRk1UX1BXQzIpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKHBkZXYtPmlzb19pbml0KQorCWlmICh2YjJfaXNfc3RyZWFtaW5nKCZwZGV2LT52Yl9xdWV1ZSkpCiAJCXJldHVybiAtRUJVU1k7CiAKIAlQV0NfREVCVUdfSU9DVEwoIlRyeWluZyB0byBzZXQgZm9ybWF0IHRvOiB3aWR0aD0lZCBoZWlnaHQ9JWQgZnBzPSVkICIKQEAgLTM0MywxMyArNTAxLDE0IEBACiAKIHN0YXRpYyBpbnQgcHdjX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwKQogewotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwogCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAorCWlmICghcGRldi0+dWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlzdHJjcHkoY2FwLT5kcml2ZXIsIFBXQ19OQU1FKTsKLQlzdHJsY3B5KGNhcC0+Y2FyZCwgdmRldi0+bmFtZSwgc2l6ZW9mKGNhcC0+Y2FyZCkpOworCXN0cmxjcHkoY2FwLT5jYXJkLCBwZGV2LT52ZGV2Lm5hbWUsIHNpemVvZihjYXAtPmNhcmQpKTsKIAl1c2JfbWFrZV9wYXRoKHBkZXYtPnVkZXYsIGNhcC0+YnVzX2luZm8sIHNpemVvZihjYXAtPmJ1c19pbmZvKSk7Ci0JY2FwLT52ZXJzaW9uID0gUFdDX1ZFUlNJT05fQ09ERTsKIAljYXAtPmNhcGFiaWxpdGllcyA9CiAJCVY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUJfAogCQlWNEwyX0NBUF9TVFJFQU1JTkcJfApAQCAtMzc3LDI1NSArNTM2LDM5NiBAQAogCXJldHVybiBpID8gLUVJTlZBTCA6IDA7CiB9CiAKLXN0YXRpYyBpbnQgcHdjX3F1ZXJ5Y3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqYykKK3N0YXRpYyBpbnQgcHdjX2dfdm9sYXRpbGVfY3RybChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKQogewotCWludCBpLCBpZHg7Ci0JdTMyIGlkOworCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0KKwkJY29udGFpbmVyX29mKGN0cmwtPmhhbmRsZXIsIHN0cnVjdCBwd2NfZGV2aWNlLCBjdHJsX2hhbmRsZXIpOworCWludCByZXQgPSAwOwogCi0JaWQgPSBjLT5pZDsKLQlpZiAoaWQgJiBWNEwyX0NUUkxfRkxBR19ORVhUX0NUUkwpIHsKLQkJaWQgJj0gVjRMMl9DVFJMX0lEX01BU0s7Ci0JCWlkKys7Ci0JCWlkeCA9IC0xOwotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwd2NfY29udHJvbHMpOyBpKyspIHsKLQkJCWlmIChwd2NfY29udHJvbHNbaV0uaWQgPCBpZCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChpZHggPj0gMAotCQkJICYmIHB3Y19jb250cm9sc1tpXS5pZCA+IHB3Y19jb250cm9sc1tpZHhdLmlkKQotCQkJCWNvbnRpbnVlOwotCQkJaWR4ID0gaTsKLQkJfQotCQlpZiAoaWR4IDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQltZW1jcHkoYywgJnB3Y19jb250cm9sc1tpZHhdLCBzaXplb2YgcHdjX2NvbnRyb2xzWzBdKTsKLQkJcmV0dXJuIDA7CisJLyoKKwkgKiBTb21ldGltZXMgaXQgY2FuIHRha2UgcXVpdGUgbG9uZyBmb3IgdGhlIHB3YyB0byBjb21wbGV0ZSB1c2IgY29udHJvbAorCSAqIHRyYW5zZmVycywgc28gcmVsZWFzZSB0aGUgbW9kbG9jayB0byBnaXZlIHN0cmVhbWluZyBieSBhbm90aGVyCisJICogcHJvY2VzcyAvIHRocmVhZCB0aGUgY2hhbmNlIHRvIGNvbnRpbnVlIHdpdGggYSBkcWJ1Zi4KKwkgKi8KKwltdXRleF91bmxvY2soJnBkZXYtPm1vZGxvY2spOworCisJLyoKKwkgKiBUYWtlIHRoZSB1ZGV2LWxvY2sgdG8gcHJvdGVjdCBhZ2FpbnN0IHRoZSBkaXNjb25uZWN0IGhhbmRsZXIKKwkgKiBjb21wbGV0aW5nIGFuZCBzZXR0aW5nIGRldi0+dWRldiB0byBOVUxMIHVuZGVybmVhdGggdXMuIE90aGVyIGNvZGUKKwkgKiBkb2VzIG5vdCBuZWVkIHRvIGRvIHRoaXMgc2luY2UgaXQgaXMgcHJvdGVjdGVkIGJ5IHRoZSBtb2Rsb2NrLgorCSAqLworCW11dGV4X2xvY2soJnBkZXYtPnVkZXZsb2NrKTsKKworCWlmICghcGRldi0+dWRldikgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGxlYXZlOwogCX0KLQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHB3Y19jb250cm9scykgLyBzaXplb2Yoc3RydWN0IHY0bDJfcXVlcnljdHJsKTsgaSsrKSB7Ci0JCWlmIChwd2NfY29udHJvbHNbaV0uaWQgPT0gYy0+aWQpIHsKLQkJCVBXQ19ERUJVR19JT0NUTCgiaW9jdGwoVklESU9DX1FVRVJZQ1RSTCkgZm91bmRcbiIpOwotCQkJbWVtY3B5KGMsICZwd2NfY29udHJvbHNbaV0sIHNpemVvZihzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwpKTsKLQkJCXJldHVybiAwOworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFOgorCQlpZiAocGRldi0+Y29sb3JfYmFsX3ZhbGlkICYmIHRpbWVfYmVmb3JlKGppZmZpZXMsCisJCQkJcGRldi0+bGFzdF9jb2xvcl9iYWxfdXBkYXRlICsgSFogLyA0KSkgeworCQkJcGRldi0+cmVkX2JhbGFuY2UtPnZhbCAgPSBwZGV2LT5sYXN0X3JlZF9iYWxhbmNlOworCQkJcGRldi0+Ymx1ZV9iYWxhbmNlLT52YWwgPSBwZGV2LT5sYXN0X2JsdWVfYmFsYW5jZTsKKwkJCWJyZWFrOwogCQl9CisJCXJldCA9IHB3Y19nZXRfdThfY3RybChwZGV2LCBHRVRfU1RBVFVTX0NUTCwKKwkJCQkgICAgICBSRUFEX1JFRF9HQUlOX0ZPUk1BVFRFUiwKKwkJCQkgICAgICAmcGRldi0+cmVkX2JhbGFuY2UtPnZhbCk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwkJcmV0ID0gcHdjX2dldF91OF9jdHJsKHBkZXYsIEdFVF9TVEFUVVNfQ1RMLAorCQkJCSAgICAgIFJFQURfQkxVRV9HQUlOX0ZPUk1BVFRFUiwKKwkJCQkgICAgICAmcGRldi0+Ymx1ZV9iYWxhbmNlLT52YWwpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJCXBkZXYtPmxhc3RfcmVkX2JhbGFuY2UgID0gcGRldi0+cmVkX2JhbGFuY2UtPnZhbDsKKwkJcGRldi0+bGFzdF9ibHVlX2JhbGFuY2UgPSBwZGV2LT5ibHVlX2JhbGFuY2UtPnZhbDsKKwkJcGRldi0+bGFzdF9jb2xvcl9iYWxfdXBkYXRlID0gamlmZmllczsKKwkJcGRldi0+Y29sb3JfYmFsX3ZhbGlkID0gdHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9BVVRPR0FJTjoKKwkJaWYgKHBkZXYtPmdhaW5fdmFsaWQgJiYgdGltZV9iZWZvcmUoamlmZmllcywKKwkJCQlwZGV2LT5sYXN0X2dhaW5fdXBkYXRlICsgSFogLyA0KSkgeworCQkJcGRldi0+Z2Fpbi0+dmFsID0gcGRldi0+bGFzdF9nYWluOworCQkJYnJlYWs7CisJCX0KKwkJcmV0ID0gcHdjX2dldF91OF9jdHJsKHBkZXYsIEdFVF9TVEFUVVNfQ1RMLAorCQkJCSAgICAgIFJFQURfQUdDX0ZPUk1BVFRFUiwgJnBkZXYtPmdhaW4tPnZhbCk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwkJcGRldi0+bGFzdF9nYWluID0gcGRldi0+Z2Fpbi0+dmFsOworCQlwZGV2LT5sYXN0X2dhaW5fdXBkYXRlID0gamlmZmllczsKKwkJcGRldi0+Z2Fpbl92YWxpZCA9IHRydWU7CisJCWlmICghREVWSUNFX1VTRV9DT0RFQzMocGRldi0+dHlwZSkpCisJCQlicmVhazsKKwkJLyogRmFsbCB0aHJvdWdoIGZvciBDT0RFQzMgd2hlcmUgYXV0b2dhaW4gYWxzbyBjb250cm9scyBleHBvICovCisJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRV9BVVRPOgorCQlpZiAocGRldi0+ZXhwb3N1cmVfdmFsaWQgJiYgdGltZV9iZWZvcmUoamlmZmllcywKKwkJCQlwZGV2LT5sYXN0X2V4cG9zdXJlX3VwZGF0ZSArIEhaIC8gNCkpIHsKKwkJCXBkZXYtPmV4cG9zdXJlLT52YWwgPSBwZGV2LT5sYXN0X2V4cG9zdXJlOworCQkJYnJlYWs7CisJCX0KKwkJcmV0ID0gcHdjX2dldF91MTZfY3RybChwZGV2LCBHRVRfU1RBVFVTX0NUTCwKKwkJCQkgICAgICAgUkVBRF9TSFVUVEVSX0ZPUk1BVFRFUiwKKwkJCQkgICAgICAgJnBkZXYtPmV4cG9zdXJlLT52YWwpOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisJCXBkZXYtPmxhc3RfZXhwb3N1cmUgPSBwZGV2LT5leHBvc3VyZS0+dmFsOworCQlwZGV2LT5sYXN0X2V4cG9zdXJlX3VwZGF0ZSA9IGppZmZpZXM7CisJCXBkZXYtPmV4cG9zdXJlX3ZhbGlkID0gdHJ1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKIAl9Ci0JcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocmV0KQorCQlQV0NfRVJST1IoImdfY3RybCAlcyBlcnJvciAlZFxuIiwgY3RybC0+bmFtZSwgcmV0KTsKKworbGVhdmU6CisJbXV0ZXhfdW5sb2NrKCZwZGV2LT51ZGV2bG9jayk7CisJbXV0ZXhfbG9jaygmcGRldi0+bW9kbG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBwd2NfZ19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfY29udHJvbCAqYykKK3N0YXRpYyBpbnQgcHdjX3NldF9hd2Ioc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwotCWludCByZXQ7CisJaW50IHJldCA9IDA7CiAKLQlzd2l0Y2ggKGMtPmlkKSB7Ci0JY2FzZSBWNEwyX0NJRF9CUklHSFRORVNTOgotCQljLT52YWx1ZSA9IHB3Y19nZXRfYnJpZ2h0bmVzcyhwZGV2KTsKLQkJaWYgKGMtPnZhbHVlIDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgotCQljLT52YWx1ZSA9IHB3Y19nZXRfY29udHJhc3QocGRldik7Ci0JCWlmIChjLT52YWx1ZSA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgotCQlyZXQgPSBwd2NfZ2V0X3NhdHVyYXRpb24ocGRldiwgJmMtPnZhbHVlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9HQU1NQToKLQkJYy0+dmFsdWUgPSBwd2NfZ2V0X2dhbW1hKHBkZXYpOwotCQlpZiAoYy0+dmFsdWUgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6Ci0JCXJldCA9IHB3Y19nZXRfcmVkX2dhaW4ocGRldiwgJmMtPnZhbHVlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJYy0+dmFsdWUgPj49IDg7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfQkxVRV9CQUxBTkNFOgotCQlyZXQgPSBwd2NfZ2V0X2JsdWVfZ2FpbihwZGV2LCAmYy0+dmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQljLT52YWx1ZSA+Pj0gODsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0U6Ci0JCXJldCA9IHB3Y19nZXRfYXdiKHBkZXYpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQljLT52YWx1ZSA9IChyZXQgPT0gUFdDX1dCX01BTlVBTCkgPyAwIDogMTsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9HQUlOOgotCQlyZXQgPSBwd2NfZ2V0X2FnYyhwZGV2LCAmYy0+dmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQljLT52YWx1ZSA+Pj0gODsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9BVVRPR0FJTjoKLQkJcmV0ID0gcHdjX2dldF9hZ2MocGRldiwgJmMtPnZhbHVlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJYy0+dmFsdWUgPSAoYy0+dmFsdWUgPCAwKSA/IDEgOiAwOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgotCQlyZXQgPSBwd2NfZ2V0X3NodXR0ZXJfc3BlZWQocGRldiwgJmMtPnZhbHVlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9QUklWQVRFX0NPTE9VUl9NT0RFOgotCQlyZXQgPSBwd2NfZ2V0X2NvbG91cl9tb2RlKHBkZXYsICZjLT52YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfUFJJVkFURV9BVVRPQ09OVE9VUjoKLQkJcmV0ID0gcHdjX2dldF9jb250b3VyKHBkZXYsICZjLT52YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWMtPnZhbHVlID0gKGMtPnZhbHVlID09IC0xID8gMSA6IDApOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfQ09OVE9VUjoKLQkJcmV0ID0gcHdjX2dldF9jb250b3VyKHBkZXYsICZjLT52YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWMtPnZhbHVlID4+PSAxMDsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9QUklWQVRFX0JBQ0tMSUdIVDoKLQkJcmV0ID0gcHdjX2dldF9iYWNrbGlnaHQocGRldiwgJmMtPnZhbHVlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9QUklWQVRFX0ZMSUNLRVJMRVNTOgotCQlyZXQgPSBwd2NfZ2V0X2ZsaWNrZXIocGRldiwgJmMtPnZhbHVlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJYy0+dmFsdWUgPSAoYy0+dmFsdWUgPyAxIDogMCk7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfUFJJVkFURV9OT0lTRV9SRURVQ1RJT046Ci0JCXJldCA9IHB3Y19nZXRfZHluYW1pY19ub2lzZShwZGV2LCAmYy0+dmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gMDsKKwlpZiAocGRldi0+YXV0b193aGl0ZV9iYWxhbmNlLT5pc19uZXcpIHsKKwkJcmV0ID0gcHdjX3NldF91OF9jdHJsKHBkZXYsIFNFVF9DSFJPTV9DVEwsCisJCQkJICAgICAgV0JfTU9ERV9GT1JNQVRURVIsCisJCQkJICAgICAgcGRldi0+YXV0b193aGl0ZV9iYWxhbmNlLT52YWwpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKIAotCWNhc2UgVjRMMl9DSURfUFJJVkFURV9TQVZFX1VTRVI6Ci0JY2FzZSBWNEwyX0NJRF9QUklWQVRFX1JFU1RPUkVfVVNFUjoKLQljYXNlIFY0TDJfQ0lEX1BSSVZBVEVfUkVTVE9SRV9GQUNUT1JZOgotCQlyZXR1cm4gLUVJTlZBTDsKKwkJLyogVXBkYXRlIHZhbCB3aGVuIGNvbWluZyBmcm9tIGF1dG8gb3IgZ29pbmcgdG8gYSBwcmVzZXQgKi8KKwkJaWYgKHBkZXYtPnJlZF9iYWxhbmNlLT5pc192b2xhdGlsZSB8fAorCQkgICAgcGRldi0+YXV0b193aGl0ZV9iYWxhbmNlLT52YWwgPT0gYXdiX2luZG9vciB8fAorCQkgICAgcGRldi0+YXV0b193aGl0ZV9iYWxhbmNlLT52YWwgPT0gYXdiX291dGRvb3IgfHwKKwkJICAgIHBkZXYtPmF1dG9fd2hpdGVfYmFsYW5jZS0+dmFsID09IGF3Yl9mbCkgeworCQkJaWYgKCFwZGV2LT5yZWRfYmFsYW5jZS0+aXNfbmV3KQorCQkJCXB3Y19nZXRfdThfY3RybChwZGV2LCBHRVRfU1RBVFVTX0NUTCwKKwkJCQkJUkVBRF9SRURfR0FJTl9GT1JNQVRURVIsCisJCQkJCSZwZGV2LT5yZWRfYmFsYW5jZS0+dmFsKTsKKwkJCWlmICghcGRldi0+Ymx1ZV9iYWxhbmNlLT5pc19uZXcpCisJCQkJcHdjX2dldF91OF9jdHJsKHBkZXYsIEdFVF9TVEFUVVNfQ1RMLAorCQkJCQlSRUFEX0JMVUVfR0FJTl9GT1JNQVRURVIsCisJCQkJCSZwZGV2LT5ibHVlX2JhbGFuY2UtPnZhbCk7CisJCX0KKwkJaWYgKHBkZXYtPmF1dG9fd2hpdGVfYmFsYW5jZS0+dmFsID09IGF3Yl9hdXRvKSB7CisJCQlwZGV2LT5yZWRfYmFsYW5jZS0+aXNfdm9sYXRpbGUgPSB0cnVlOworCQkJcGRldi0+Ymx1ZV9iYWxhbmNlLT5pc192b2xhdGlsZSA9IHRydWU7CisJCQlwZGV2LT5jb2xvcl9iYWxfdmFsaWQgPSBmYWxzZTsgLyogRm9yY2UgY2FjaGUgdXBkYXRlICovCisJCX0gZWxzZSB7CisJCQlwZGV2LT5yZWRfYmFsYW5jZS0+aXNfdm9sYXRpbGUgPSBmYWxzZTsKKwkJCXBkZXYtPmJsdWVfYmFsYW5jZS0+aXNfdm9sYXRpbGUgPSBmYWxzZTsKKwkJfQogCX0KLQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChyZXQgPT0gMCAmJiBwZGV2LT5yZWRfYmFsYW5jZS0+aXNfbmV3KSB7CisJCWlmIChwZGV2LT5hdXRvX3doaXRlX2JhbGFuY2UtPnZhbCAhPSBhd2JfbWFudWFsKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJcmV0ID0gcHdjX3NldF91OF9jdHJsKHBkZXYsIFNFVF9DSFJPTV9DVEwsCisJCQkJICAgICAgUFJFU0VUX01BTlVBTF9SRURfR0FJTl9GT1JNQVRURVIsCisJCQkJICAgICAgcGRldi0+cmVkX2JhbGFuY2UtPnZhbCk7CisJfQorCisJaWYgKHJldCA9PSAwICYmIHBkZXYtPmJsdWVfYmFsYW5jZS0+aXNfbmV3KSB7CisJCWlmIChwZGV2LT5hdXRvX3doaXRlX2JhbGFuY2UtPnZhbCAhPSBhd2JfbWFudWFsKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJcmV0ID0gcHdjX3NldF91OF9jdHJsKHBkZXYsIFNFVF9DSFJPTV9DVEwsCisJCQkJICAgICAgUFJFU0VUX01BTlVBTF9CTFVFX0dBSU5fRk9STUFUVEVSLAorCQkJCSAgICAgIHBkZXYtPmJsdWVfYmFsYW5jZS0+dmFsKTsKKwl9CisJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBwd2Nfc19jdHJsKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfY29udHJvbCAqYykKKy8qIEZvciBDT0RFQzIgbW9kZWxzIHdoaWNoIGhhdmUgc2VwYXJhdGUgYXV0b2dhaW4gYW5kIGF1dG8gZXhwb3N1cmUgKi8KK3N0YXRpYyBpbnQgcHdjX3NldF9hdXRvZ2FpbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gMDsKIAotCXN3aXRjaCAoYy0+aWQpIHsKLQljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6Ci0JCWMtPnZhbHVlIDw8PSA5OwotCQlyZXQgPSBwd2Nfc2V0X2JyaWdodG5lc3MocGRldiwgYy0+dmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX0NPTlRSQVNUOgotCQljLT52YWx1ZSA8PD0gMTA7Ci0JCXJldCA9IHB3Y19zZXRfY29udHJhc3QocGRldiwgYy0+dmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX1NBVFVSQVRJT046Ci0JCXJldCA9IHB3Y19zZXRfc2F0dXJhdGlvbihwZGV2LCBjLT52YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfR0FNTUE6Ci0JCWMtPnZhbHVlIDw8PSAxMTsKLQkJcmV0ID0gcHdjX3NldF9nYW1tYShwZGV2LCBjLT52YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfUkVEX0JBTEFOQ0U6Ci0JCWMtPnZhbHVlIDw8PSA4OwotCQlyZXQgPSBwd2Nfc2V0X3JlZF9nYWluKHBkZXYsIGMtPnZhbHVlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9CTFVFX0JBTEFOQ0U6Ci0JCWMtPnZhbHVlIDw8PSA4OwotCQlyZXQgPSBwd2Nfc2V0X2JsdWVfZ2FpbihwZGV2LCBjLT52YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfQVVUT19XSElURV9CQUxBTkNFOgotCQljLT52YWx1ZSA9IChjLT52YWx1ZSA9PSAwKSA/IFBXQ19XQl9NQU5VQUwgOiBQV0NfV0JfQVVUTzsKLQkJcmV0ID0gcHdjX3NldF9hd2IocGRldiwgYy0+dmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX0VYUE9TVVJFOgotCQljLT52YWx1ZSA8PD0gODsKLQkJcmV0ID0gcHdjX3NldF9zaHV0dGVyX3NwZWVkKHBkZXYsIGMtPnZhbHVlID8gMCA6IDEsIGMtPnZhbHVlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9BVVRPR0FJTjoKLQkJLyogYXV0b2dhaW4gb2ZmIG1lYW5zIG5vdGhpbmcgd2l0aG91dCBhIGdhaW4gKi8KLQkJaWYgKGMtPnZhbHVlID09IDApCi0JCQlyZXR1cm4gMDsKLQkJcmV0ID0gcHdjX3NldF9hZ2MocGRldiwgYy0+dmFsdWUsIDApOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZXR1cm4gMDsKLQljYXNlIFY0TDJfQ0lEX0dBSU46Ci0JCWMtPnZhbHVlIDw8PSA4OwotCQlyZXQgPSBwd2Nfc2V0X2FnYyhwZGV2LCAwLCBjLT52YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfUFJJVkFURV9TQVZFX1VTRVI6Ci0JCWlmIChwd2Nfc2F2ZV91c2VyKHBkZXYpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfUFJJVkFURV9SRVNUT1JFX1VTRVI6Ci0JCWlmIChwd2NfcmVzdG9yZV91c2VyKHBkZXYpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfUFJJVkFURV9SRVNUT1JFX0ZBQ1RPUlk6Ci0JCWlmIChwd2NfcmVzdG9yZV9mYWN0b3J5KHBkZXYpKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfUFJJVkFURV9DT0xPVVJfTU9ERToKLQkJcmV0ID0gcHdjX3NldF9jb2xvdXJfbW9kZShwZGV2LCBjLT52YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfUFJJVkFURV9BVVRPQ09OVE9VUjoKLQkJYy0+dmFsdWUgPSAoYy0+dmFsdWUgPT0gMSkgPyAtMSA6IDA7Ci0JCXJldCA9IHB3Y19zZXRfY29udG91cihwZGV2LCBjLT52YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfUFJJVkFURV9DT05UT1VSOgotCQljLT52YWx1ZSA8PD0gMTA7Ci0JCXJldCA9IHB3Y19zZXRfY29udG91cihwZGV2LCBjLT52YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiAwOwotCWNhc2UgVjRMMl9DSURfUFJJVkFURV9CQUNLTElHSFQ6Ci0JCXJldCA9IHB3Y19zZXRfYmFja2xpZ2h0KHBkZXYsIGMtPnZhbHVlKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcmV0dXJuIDA7Ci0JY2FzZSBWNEwyX0NJRF9QUklWQVRFX0ZMSUNLRVJMRVNTOgotCQlyZXQgPSBwd2Nfc2V0X2ZsaWNrZXIocGRldiwgYy0+dmFsdWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXJldHVybiAtRUlOVkFMOwotCWNhc2UgVjRMMl9DSURfUFJJVkFURV9OT0lTRV9SRURVQ1RJT046Ci0JCXJldCA9IHB3Y19zZXRfZHluYW1pY19ub2lzZShwZGV2LCBjLT52YWx1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXJldHVybiAwOwotCisJaWYgKHBkZXYtPmF1dG9nYWluLT5pc19uZXcpIHsKKwkJcmV0ID0gcHdjX3NldF91OF9jdHJsKHBkZXYsIFNFVF9MVU1fQ1RMLAorCQkJCSAgICAgIEFHQ19NT0RFX0ZPUk1BVFRFUiwKKwkJCQkgICAgICBwZGV2LT5hdXRvZ2Fpbi0+dmFsID8gMCA6IDB4ZmYpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKHBkZXYtPmF1dG9nYWluLT52YWwpCisJCQlwZGV2LT5nYWluX3ZhbGlkID0gZmFsc2U7IC8qIEZvcmNlIGNhY2hlIHVwZGF0ZSAqLworCQllbHNlIGlmICghcGRldi0+Z2Fpbi0+aXNfbmV3KQorCQkJcHdjX2dldF91OF9jdHJsKHBkZXYsIEdFVF9TVEFUVVNfQ1RMLAorCQkJCQlSRUFEX0FHQ19GT1JNQVRURVIsCisJCQkJCSZwZGV2LT5nYWluLT52YWwpOwogCX0KLQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocmV0ID09IDAgJiYgcGRldi0+Z2Fpbi0+aXNfbmV3KSB7CisJCWlmIChwZGV2LT5hdXRvZ2Fpbi0+dmFsKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJcmV0ID0gcHdjX3NldF91OF9jdHJsKHBkZXYsIFNFVF9MVU1fQ1RMLAorCQkJCSAgICAgIFBSRVNFVF9BR0NfRk9STUFUVEVSLAorCQkJCSAgICAgIHBkZXYtPmdhaW4tPnZhbCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIEZvciBDT0RFQzIgbW9kZWxzIHdoaWNoIGhhdmUgc2VwYXJhdGUgYXV0b2dhaW4gYW5kIGF1dG8gZXhwb3N1cmUgKi8KK3N0YXRpYyBpbnQgcHdjX3NldF9leHBvc3VyZV9hdXRvKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQoreworCWludCByZXQgPSAwOworCWludCBpc19hdXRvID0gcGRldi0+ZXhwb3N1cmVfYXV0by0+dmFsID09IFY0TDJfRVhQT1NVUkVfQVVUTzsKKworCWlmIChwZGV2LT5leHBvc3VyZV9hdXRvLT5pc19uZXcpIHsKKwkJcmV0ID0gcHdjX3NldF91OF9jdHJsKHBkZXYsIFNFVF9MVU1fQ1RMLAorCQkJCSAgICAgIFNIVVRURVJfTU9ERV9GT1JNQVRURVIsCisJCQkJICAgICAgaXNfYXV0byA/IDAgOiAweGZmKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCWlmIChpc19hdXRvKQorCQkJcGRldi0+ZXhwb3N1cmVfdmFsaWQgPSBmYWxzZTsgLyogRm9yY2UgY2FjaGUgdXBkYXRlICovCisJCWVsc2UgaWYgKCFwZGV2LT5leHBvc3VyZS0+aXNfbmV3KQorCQkJcHdjX2dldF91MTZfY3RybChwZGV2LCBHRVRfU1RBVFVTX0NUTCwKKwkJCQkJIFJFQURfU0hVVFRFUl9GT1JNQVRURVIsCisJCQkJCSAmcGRldi0+ZXhwb3N1cmUtPnZhbCk7CisJfQorCWlmIChyZXQgPT0gMCAmJiBwZGV2LT5leHBvc3VyZS0+aXNfbmV3KSB7CisJCWlmIChpc19hdXRvKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJcmV0ID0gcHdjX3NldF91MTZfY3RybChwZGV2LCBTRVRfTFVNX0NUTCwKKwkJCQkgICAgICAgUFJFU0VUX1NIVVRURVJfRk9STUFUVEVSLAorCQkJCSAgICAgICBwZGV2LT5leHBvc3VyZS0+dmFsKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyogRm9yIENPREVDMyBtb2RlbHMgd2hpY2ggaGF2ZSBhdXRvZ2FpbiBjb250cm9sbGluZyBib3RoIGdhaW4gYW5kIGV4cG9zdXJlICovCitzdGF0aWMgaW50IHB3Y19zZXRfYXV0b2dhaW5fZXhwbyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmIChwZGV2LT5hdXRvZ2Fpbi0+aXNfbmV3KSB7CisJCXJldCA9IHB3Y19zZXRfdThfY3RybChwZGV2LCBTRVRfTFVNX0NUTCwKKwkJCQkgICAgICBBR0NfTU9ERV9GT1JNQVRURVIsCisJCQkJICAgICAgcGRldi0+YXV0b2dhaW4tPnZhbCA/IDAgOiAweGZmKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCWlmIChwZGV2LT5hdXRvZ2Fpbi0+dmFsKSB7CisJCQlwZGV2LT5nYWluX3ZhbGlkICAgICA9IGZhbHNlOyAvKiBGb3JjZSBjYWNoZSB1cGRhdGUgKi8KKwkJCXBkZXYtPmV4cG9zdXJlX3ZhbGlkID0gZmFsc2U7IC8qIEZvcmNlIGNhY2hlIHVwZGF0ZSAqLworCQl9IGVsc2UgeworCQkJaWYgKCFwZGV2LT5nYWluLT5pc19uZXcpCisJCQkJcHdjX2dldF91OF9jdHJsKHBkZXYsIEdFVF9TVEFUVVNfQ1RMLAorCQkJCQkJUkVBRF9BR0NfRk9STUFUVEVSLAorCQkJCQkJJnBkZXYtPmdhaW4tPnZhbCk7CisJCQlpZiAoIXBkZXYtPmV4cG9zdXJlLT5pc19uZXcpCisJCQkJcHdjX2dldF91MTZfY3RybChwZGV2LCBHRVRfU1RBVFVTX0NUTCwKKwkJCQkJCSBSRUFEX1NIVVRURVJfRk9STUFUVEVSLAorCQkJCQkJICZwZGV2LT5leHBvc3VyZS0+dmFsKTsKKwkJfQorCX0KKwlpZiAocmV0ID09IDAgJiYgcGRldi0+Z2Fpbi0+aXNfbmV3KSB7CisJCWlmIChwZGV2LT5hdXRvZ2Fpbi0+dmFsKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJcmV0ID0gcHdjX3NldF91OF9jdHJsKHBkZXYsIFNFVF9MVU1fQ1RMLAorCQkJCSAgICAgIFBSRVNFVF9BR0NfRk9STUFUVEVSLAorCQkJCSAgICAgIHBkZXYtPmdhaW4tPnZhbCk7CisJfQorCWlmIChyZXQgPT0gMCAmJiBwZGV2LT5leHBvc3VyZS0+aXNfbmV3KSB7CisJCWlmIChwZGV2LT5hdXRvZ2Fpbi0+dmFsKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJcmV0ID0gcHdjX3NldF91MTZfY3RybChwZGV2LCBTRVRfTFVNX0NUTCwKKwkJCQkgICAgICAgUFJFU0VUX1NIVVRURVJfRk9STUFUVEVSLAorCQkJCSAgICAgICBwZGV2LT5leHBvc3VyZS0+dmFsKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwd2Nfc2V0X21vdG9yKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KQoreworCWludCByZXQ7CisJdTggYnVmWzRdOworCisJYnVmWzBdID0gMDsKKwlpZiAocGRldi0+bW90b3JfcGFuX3Jlc2V0LT5pc19uZXcpCisJCWJ1ZlswXSB8PSAweDAxOworCWlmIChwZGV2LT5tb3Rvcl90aWx0X3Jlc2V0LT5pc19uZXcpCisJCWJ1ZlswXSB8PSAweDAyOworCWlmIChwZGV2LT5tb3Rvcl9wYW5fcmVzZXQtPmlzX25ldyB8fCBwZGV2LT5tb3Rvcl90aWx0X3Jlc2V0LT5pc19uZXcpIHsKKwkJcmV0ID0gc2VuZF9jb250cm9sX21zZyhwZGV2LCBTRVRfTVBUX0NUTCwKKwkJCQkgICAgICAgUFRfUkVTRVRfQ09OVFJPTF9GT1JNQVRURVIsIGJ1ZiwgMSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJaWYgKHBkZXYtPm1vdG9yX3Bhbi0+aXNfbmV3KSB7CisJCWJ1ZlswXSA9IHBkZXYtPm1vdG9yX3Bhbi0+dmFsICYgMHhGRjsKKwkJYnVmWzFdID0gKHBkZXYtPm1vdG9yX3Bhbi0+dmFsID4+IDgpOworCX0KKwlpZiAocGRldi0+bW90b3JfdGlsdC0+aXNfbmV3KSB7CisJCWJ1ZlsyXSA9IHBkZXYtPm1vdG9yX3RpbHQtPnZhbCAmIDB4RkY7CisJCWJ1ZlszXSA9IChwZGV2LT5tb3Rvcl90aWx0LT52YWwgPj4gOCk7CisJfQorCWlmIChwZGV2LT5tb3Rvcl9wYW4tPmlzX25ldyB8fCBwZGV2LT5tb3Rvcl90aWx0LT5pc19uZXcpIHsKKwkJcmV0ID0gc2VuZF9jb250cm9sX21zZyhwZGV2LCBTRVRfTVBUX0NUTCwKKwkJCQkgICAgICAgUFRfUkVMQVRJVkVfQ09OVFJPTF9GT1JNQVRURVIsCisJCQkJICAgICAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHdjX3NfY3RybChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKQoreworCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0KKwkJY29udGFpbmVyX29mKGN0cmwtPmhhbmRsZXIsIHN0cnVjdCBwd2NfZGV2aWNlLCBjdHJsX2hhbmRsZXIpOworCWludCByZXQgPSAwOworCisJLyogU2VlIHRoZSBjb21tZW50cyBvbiBsb2NraW5nIGluIHB3Y19nX3ZvbGF0aWxlX2N0cmwgKi8KKwltdXRleF91bmxvY2soJnBkZXYtPm1vZGxvY2spOworCW11dGV4X2xvY2soJnBkZXYtPnVkZXZsb2NrKTsKKworCWlmICghcGRldi0+dWRldikgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGxlYXZlOworCX0KKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX0JSSUdIVE5FU1M6CisJCXJldCA9IHB3Y19zZXRfdThfY3RybChwZGV2LCBTRVRfTFVNX0NUTCwKKwkJCQkgICAgICBCUklHSFRORVNTX0ZPUk1BVFRFUiwgY3RybC0+dmFsKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9DT05UUkFTVDoKKwkJcmV0ID0gcHdjX3NldF91OF9jdHJsKHBkZXYsIFNFVF9MVU1fQ1RMLAorCQkJCSAgICAgIENPTlRSQVNUX0ZPUk1BVFRFUiwgY3RybC0+dmFsKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9TQVRVUkFUSU9OOgorCQlyZXQgPSBwd2Nfc2V0X3M4X2N0cmwocGRldiwgU0VUX0NIUk9NX0NUTCwKKwkJCQkgICAgICBwZGV2LT5zYXR1cmF0aW9uX2ZtdCwgY3RybC0+dmFsKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9HQU1NQToKKwkJcmV0ID0gcHdjX3NldF91OF9jdHJsKHBkZXYsIFNFVF9MVU1fQ1RMLAorCQkJCSAgICAgIEdBTU1BX0ZPUk1BVFRFUiwgY3RybC0+dmFsKTsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9BVVRPX1dISVRFX0JBTEFOQ0U6CisJCXJldCA9IHB3Y19zZXRfYXdiKHBkZXYpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0FVVE9HQUlOOgorCQlpZiAoREVWSUNFX1VTRV9DT0RFQzIocGRldi0+dHlwZSkpCisJCQlyZXQgPSBwd2Nfc2V0X2F1dG9nYWluKHBkZXYpOworCQllbHNlIGlmIChERVZJQ0VfVVNFX0NPREVDMyhwZGV2LT50eXBlKSkKKwkJCXJldCA9IHB3Y19zZXRfYXV0b2dhaW5fZXhwbyhwZGV2KTsKKwkJZWxzZQorCQkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRV9BVVRPOgorCQlpZiAoREVWSUNFX1VTRV9DT0RFQzIocGRldi0+dHlwZSkpCisJCQlyZXQgPSBwd2Nfc2V0X2V4cG9zdXJlX2F1dG8ocGRldik7CisJCWVsc2UKKwkJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfQ09MT1JGWDoKKwkJcmV0ID0gcHdjX3NldF91OF9jdHJsKHBkZXYsIFNFVF9DSFJPTV9DVEwsCisJCQkJICAgICAgQ09MT1VSX01PREVfRk9STUFUVEVSLAorCQkJCSAgICAgIGN0cmwtPnZhbCA/IDAgOiAweGZmKTsKKwkJYnJlYWs7CisJY2FzZSBQV0NfQ0lEX0NVU1RPTShhdXRvY29udG91cik6CisJCWlmIChwZGV2LT5hdXRvY29udG91ci0+aXNfbmV3KSB7CisJCQlyZXQgPSBwd2Nfc2V0X3U4X2N0cmwocGRldiwgU0VUX0xVTV9DVEwsCisJCQkJCUFVVE9fQ09OVE9VUl9GT1JNQVRURVIsCisJCQkJCXBkZXYtPmF1dG9jb250b3VyLT52YWwgPyAwIDogMHhmZik7CisJCX0KKwkJaWYgKHJldCA9PSAwICYmIHBkZXYtPmNvbnRvdXItPmlzX25ldykgeworCQkJaWYgKHBkZXYtPmF1dG9jb250b3VyLT52YWwpIHsKKwkJCQlyZXQgPSAtRUJVU1k7CisJCQkJYnJlYWs7CisJCQl9CisJCQlyZXQgPSBwd2Nfc2V0X3U4X2N0cmwocGRldiwgU0VUX0xVTV9DVEwsCisJCQkJCSAgICAgIFBSRVNFVF9DT05UT1VSX0ZPUk1BVFRFUiwKKwkJCQkJICAgICAgcGRldi0+Y29udG91ci0+dmFsKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0JBQ0tMSUdIVF9DT01QRU5TQVRJT046CisJCXJldCA9IHB3Y19zZXRfdThfY3RybChwZGV2LCBTRVRfTFVNX0NUTCwKKwkJCQkgICAgICBCQUNLX0xJR0hUX0NPTVBFTlNBVElPTl9GT1JNQVRURVIsCisJCQkJICAgICAgY3RybC0+dmFsID8gMCA6IDB4ZmYpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0JBTkRfU1RPUF9GSUxURVI6CisJCXJldCA9IHB3Y19zZXRfdThfY3RybChwZGV2LCBTRVRfTFVNX0NUTCwKKwkJCQkgICAgICBGTElDS0VSTEVTU19NT0RFX0ZPUk1BVFRFUiwKKwkJCQkgICAgICBjdHJsLT52YWwgPyAwIDogMHhmZik7CisJCWJyZWFrOworCWNhc2UgUFdDX0NJRF9DVVNUT00obm9pc2VfcmVkdWN0aW9uKToKKwkJcmV0ID0gcHdjX3NldF91OF9jdHJsKHBkZXYsIFNFVF9MVU1fQ1RMLAorCQkJCSAgICAgIERZTkFNSUNfTk9JU0VfQ09OVFJPTF9GT1JNQVRURVIsCisJCQkJICAgICAgY3RybC0+dmFsKTsKKwkJYnJlYWs7CisJY2FzZSBQV0NfQ0lEX0NVU1RPTShzYXZlX3VzZXIpOgorCQlyZXQgPSBwd2NfYnV0dG9uX2N0cmwocGRldiwgU0FWRV9VU0VSX0RFRkFVTFRTX0ZPUk1BVFRFUik7CisJCWJyZWFrOworCWNhc2UgUFdDX0NJRF9DVVNUT00ocmVzdG9yZV91c2VyKToKKwkJcmV0ID0gcHdjX2J1dHRvbl9jdHJsKHBkZXYsIFJFU1RPUkVfVVNFUl9ERUZBVUxUU19GT1JNQVRURVIpOworCQlicmVhazsKKwljYXNlIFBXQ19DSURfQ1VTVE9NKHJlc3RvcmVfZmFjdG9yeSk6CisJCXJldCA9IHB3Y19idXR0b25fY3RybChwZGV2LAorCQkJCSAgICAgIFJFU1RPUkVfRkFDVE9SWV9ERUZBVUxUU19GT1JNQVRURVIpOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX1BBTl9SRUxBVElWRToKKwkJcmV0ID0gcHdjX3NldF9tb3RvcihwZGV2KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwlpZiAocmV0KQorCQlQV0NfRVJST1IoInNfY3RybCAlcyBlcnJvciAlZFxuIiwgY3RybC0+bmFtZSwgcmV0KTsKKworbGVhdmU6CisJbXV0ZXhfdW5sb2NrKCZwZGV2LT51ZGV2bG9jayk7CisJbXV0ZXhfbG9jaygmcGRldi0+bW9kbG9jayk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBwd2NfZW51bV9mbXRfdmlkX2NhcChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYpCkBAIC02NjcsMTU3ICs5NjcsNzcgQEAKIAlyZXR1cm4gcHdjX3ZpZGlvY190cnlfZm10KHBkZXYsIGYpOwogfQogCi1zdGF0aWMgaW50IHB3Y19zX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQorc3RhdGljIGludCBwd2NfcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsCisJCSAgICAgICBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqcmIpCiB7CiAJc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOwogCi0JcmV0dXJuIHB3Y192aWRpb2Nfc2V0X2ZtdChwZGV2LCBmKTsKLX0KKwlpZiAocGRldi0+Y2FwdF9maWxlICE9IE5VTEwgJiYKKwkgICAgcGRldi0+Y2FwdF9maWxlICE9IGZpbGUpCisJCXJldHVybiAtRUJVU1k7CiAKLXN0YXRpYyBpbnQgcHdjX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqcmIpCi17Ci0JaW50IG5idWZmZXJzOworCXBkZXYtPmNhcHRfZmlsZSA9IGZpbGU7CiAKLQlQV0NfREVCVUdfSU9DVEwoImlvY3RsKFZJRElPQ19SRVFCVUZTKSBjb3VudD0lZFxuIiwgcmItPmNvdW50KTsKLQlpZiAocmItPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAocmItPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW5idWZmZXJzID0gcmItPmNvdW50OwotCWlmIChuYnVmZmVycyA8IDIpCi0JCW5idWZmZXJzID0gMjsKLQllbHNlIGlmIChuYnVmZmVycyA+IHB3Y19tYnVmcykKLQkJbmJ1ZmZlcnMgPSBwd2NfbWJ1ZnM7Ci0JLyogRm9yY2UgdG8gdXNlIG91ciAjIG9mIGJ1ZmZlcnMgKi8KLQlyYi0+Y291bnQgPSBwd2NfbWJ1ZnM7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIHZiMl9yZXFidWZzKCZwZGV2LT52Yl9xdWV1ZSwgcmIpOwogfQogCiBzdGF0aWMgaW50IHB3Y19xdWVyeWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQogewogCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKLQlpbnQgaW5kZXg7CiAKLQlQV0NfREVCVUdfSU9DVEwoImlvY3RsKFZJRElPQ19RVUVSWUJVRikgaW5kZXg9JWRcbiIsIGJ1Zi0+aW5kZXgpOwotCWlmIChidWYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7Ci0JCVBXQ19ERUJVR19JT0NUTCgiaW9jdGwoVklESU9DX1FVRVJZQlVGKSBCYWQgdHlwZVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlpbmRleCA9IGJ1Zi0+aW5kZXg7Ci0JaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBwd2NfbWJ1ZnMpIHsKLQkJUFdDX0RFQlVHX0lPQ1RMKCJpb2N0bChWSURJT0NfUVVFUllCVUYpIEJhZCBpbmRleCAlZFxuIiwgYnVmLT5pbmRleCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWJ1Zi0+bS5vZmZzZXQgPSBpbmRleCAqIHBkZXYtPmxlbl9wZXJfaW1hZ2U7Ci0JaWYgKHBkZXYtPnBpeGZtdCAhPSBWNEwyX1BJWF9GTVRfWVVWNDIwKQotCQlidWYtPmJ5dGVzdXNlZCA9IHBkZXYtPmZyYW1lX3NpemUgKyBzaXplb2Yoc3RydWN0IHB3Y19yYXdfZnJhbWUpOwotCWVsc2UKLQkJYnVmLT5ieXRlc3VzZWQgPSBwZGV2LT52aWV3LnNpemU7Ci0JYnVmLT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKLQlidWYtPm1lbW9yeSA9IFY0TDJfTUVNT1JZX01NQVA7Ci0JLypidWYtPmZsYWdzID0gVjRMMl9CVUZfRkxBR19NQVBQRUQ7Ki8KLQlidWYtPmxlbmd0aCA9IHBkZXYtPmxlbl9wZXJfaW1hZ2U7Ci0KLQlQV0NfREVCVUdfUkVBRCgiVklESU9DX1FVRVJZQlVGOiBpbmRleD0lZFxuIiwgYnVmLT5pbmRleCk7Ci0JUFdDX0RFQlVHX1JFQUQoIlZJRElPQ19RVUVSWUJVRjogbS5vZmZzZXQ9JWRcbiIsIGJ1Zi0+bS5vZmZzZXQpOwotCVBXQ19ERUJVR19SRUFEKCJWSURJT0NfUVVFUllCVUY6IGJ5dGVzdXNlZD0lZFxuIiwgYnVmLT5ieXRlc3VzZWQpOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHZiMl9xdWVyeWJ1ZigmcGRldi0+dmJfcXVldWUsIGJ1Zik7CiB9CiAKIHN0YXRpYyBpbnQgcHdjX3FidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKIHsKLQlQV0NfREVCVUdfSU9DVEwoImlvY3RsKFZJRElPQ19RQlVGKSBpbmRleD0lZFxuIiwgYnVmLT5pbmRleCk7Ci0JaWYgKGJ1Zi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChidWYtPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9NTUFQKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoYnVmLT5pbmRleCA+PSBwd2NfbWJ1ZnMpCi0JCXJldHVybiAtRUlOVkFMOworCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKIAotCWJ1Zi0+ZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19RVUVVRUQ7Ci0JYnVmLT5mbGFncyAmPSB+VjRMMl9CVUZfRkxBR19ET05FOworCWlmICghcGRldi0+dWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CiAKLQlyZXR1cm4gMDsKKwlpZiAocGRldi0+Y2FwdF9maWxlICE9IGZpbGUpCisJCXJldHVybiAtRUJVU1k7CisKKwlyZXR1cm4gdmIyX3FidWYoJnBkZXYtPnZiX3F1ZXVlLCBidWYpOwogfQogCiBzdGF0aWMgaW50IHB3Y19kcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQogewotCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOwogCXN0cnVjdCBwd2NfZGV2aWNlICpwZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKLQlpbnQgcmV0OwogCi0JUFdDX0RFQlVHX0lPQ1RMKCJpb2N0bChWSURJT0NfRFFCVUYpXG4iKTsKKwlpZiAoIXBkZXYtPnVkZXYpCisJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKGJ1Zi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCi0JCXJldHVybiAtRUlOVkFMOworCWlmIChwZGV2LT5jYXB0X2ZpbGUgIT0gZmlsZSkKKwkJcmV0dXJuIC1FQlVTWTsKIAotCWFkZF93YWl0X3F1ZXVlKCZwZGV2LT5mcmFtZXEsICZ3YWl0KTsKLQl3aGlsZSAocGRldi0+ZnVsbF9mcmFtZXMgPT0gTlVMTCkgewotCQlpZiAocGRldi0+ZXJyb3Jfc3RhdHVzKSB7Ci0JCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcGRldi0+ZnJhbWVxLCAmd2FpdCk7Ci0JCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwotCQkJcmV0dXJuIC1wZGV2LT5lcnJvcl9zdGF0dXM7Ci0JCX0KLQotCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZwZGV2LT5mcmFtZXEsICZ3YWl0KTsKLQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Ci0JCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwotCQl9Ci0JCW11dGV4X3VubG9jaygmcGRldi0+bW9kbG9jayk7Ci0JCXNjaGVkdWxlKCk7Ci0JCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Ci0JCW11dGV4X2xvY2soJnBkZXYtPm1vZGxvY2spOwotCX0KLQlyZW1vdmVfd2FpdF9xdWV1ZSgmcGRldi0+ZnJhbWVxLCAmd2FpdCk7Ci0Jc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKLQotCVBXQ19ERUJVR19JT0NUTCgiVklESU9DX0RRQlVGOiBmcmFtZSByZWFkeS5cbiIpOwotCS8qIERlY29tcHJlc3MgZGF0YSBpbiBwZGV2LT5pbWFnZXNbcGRldi0+ZmlsbF9pbWFnZV0gKi8KLQlyZXQgPSBwd2NfaGFuZGxlX2ZyYW1lKHBkZXYpOwotCWlmIChyZXQpCi0JCXJldHVybiAtRUZBVUxUOwotCVBXQ19ERUJVR19JT0NUTCgiVklESU9DX0RRQlVGOiBhZnRlciBwd2NfaGFuZGxlX2ZyYW1lXG4iKTsKLQotCWJ1Zi0+aW5kZXggPSBwZGV2LT5maWxsX2ltYWdlOwotCWlmIChwZGV2LT5waXhmbXQgIT0gVjRMMl9QSVhfRk1UX1lVVjQyMCkKLQkJYnVmLT5ieXRlc3VzZWQgPSBwZGV2LT5mcmFtZV9zaXplICsgc2l6ZW9mKHN0cnVjdCBwd2NfcmF3X2ZyYW1lKTsKLQllbHNlCi0JCWJ1Zi0+Ynl0ZXN1c2VkID0gcGRldi0+dmlldy5zaXplOwotCWJ1Zi0+ZmxhZ3MgPSBWNEwyX0JVRl9GTEFHX01BUFBFRDsKLQlidWYtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOwotCWRvX2dldHRpbWVvZmRheSgmYnVmLT50aW1lc3RhbXApOwotCWJ1Zi0+c2VxdWVuY2UgPSAwOwotCWJ1Zi0+bWVtb3J5ID0gVjRMMl9NRU1PUllfTU1BUDsKLQlidWYtPm0ub2Zmc2V0ID0gcGRldi0+ZmlsbF9pbWFnZSAqIHBkZXYtPmxlbl9wZXJfaW1hZ2U7Ci0JYnVmLT5sZW5ndGggPSBwZGV2LT5sZW5fcGVyX2ltYWdlOwotCXB3Y19uZXh0X2ltYWdlKHBkZXYpOwotCi0JUFdDX0RFQlVHX0lPQ1RMKCJWSURJT0NfRFFCVUY6IGJ1Zi0+aW5kZXg9JWRcbiIsIGJ1Zi0+aW5kZXgpOwotCVBXQ19ERUJVR19JT0NUTCgiVklESU9DX0RRQlVGOiBidWYtPmxlbmd0aD0lZFxuIiwgYnVmLT5sZW5ndGgpOwotCVBXQ19ERUJVR19JT0NUTCgiVklESU9DX0RRQlVGOiBtLm9mZnNldD0lZFxuIiwgYnVmLT5tLm9mZnNldCk7Ci0JUFdDX0RFQlVHX0lPQ1RMKCJWSURJT0NfRFFCVUY6IGJ5dGVzdXNlZD0lZFxuIiwgYnVmLT5ieXRlc3VzZWQpOwotCVBXQ19ERUJVR19JT0NUTCgiVklESU9DX0RRQlVGOiBsZWF2aW5nXG4iKTsKLQlyZXR1cm4gMDsKLQorCXJldHVybiB2YjJfZHFidWYoJnBkZXYtPnZiX3F1ZXVlLCBidWYsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKIH0KIAogc3RhdGljIGludCBwd2Nfc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBlbnVtIHY0bDJfYnVmX3R5cGUgaSkKIHsKIAlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKLQlyZXR1cm4gcHdjX2lzb2NfaW5pdChwZGV2KTsKKwlpZiAoIXBkZXYtPnVkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHBkZXYtPmNhcHRfZmlsZSAhPSBmaWxlKQorCQlyZXR1cm4gLUVCVVNZOworCisJcmV0dXJuIHZiMl9zdHJlYW1vbigmcGRldi0+dmJfcXVldWUsIGkpOwogfQogCiBzdGF0aWMgaW50IHB3Y19zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBlbnVtIHY0bDJfYnVmX3R5cGUgaSkKIHsKIAlzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CiAKLQlwd2NfaXNvY19jbGVhbnVwKHBkZXYpOwotCXJldHVybiAwOworCWlmICghcGRldi0+dWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAocGRldi0+Y2FwdF9maWxlICE9IGZpbGUpCisJCXJldHVybiAtRUJVU1k7CisKKwlyZXR1cm4gdmIyX3N0cmVhbW9mZigmcGRldi0+dmJfcXVldWUsIGkpOwogfQogCiBzdGF0aWMgaW50IHB3Y19lbnVtX2ZyYW1lc2l6ZXMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLApAQCAtODk2LDkgKzExMTYsNiBAQAogCS52aWRpb2NfZ19mbXRfdmlkX2NhcAkJICAgID0gcHdjX2dfZm10X3ZpZF9jYXAsCiAJLnZpZGlvY19zX2ZtdF92aWRfY2FwCQkgICAgPSBwd2Nfc19mbXRfdmlkX2NhcCwKIAkudmlkaW9jX3RyeV9mbXRfdmlkX2NhcAkJICAgID0gcHdjX3RyeV9mbXRfdmlkX2NhcCwKLQkudmlkaW9jX3F1ZXJ5Y3RybAkJICAgID0gcHdjX3F1ZXJ5Y3RybCwKLQkudmlkaW9jX2dfY3RybAkJCSAgICA9IHB3Y19nX2N0cmwsCi0JLnZpZGlvY19zX2N0cmwJCQkgICAgPSBwd2Nfc19jdHJsLAogCS52aWRpb2NfcmVxYnVmcwkJCSAgICA9IHB3Y19yZXFidWZzLAogCS52aWRpb2NfcXVlcnlidWYJCSAgICA9IHB3Y19xdWVyeWJ1ZiwKIAkudmlkaW9jX3FidWYJCQkgICAgPSBwd2NfcWJ1ZiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHdjL3B3Yy5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLmgKaW5kZXggMDgzZjhiMS4uMGU0ZTJkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLmgKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9wd2MvcHdjLmgKQEAgLTI5LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTM3LDE5ICszNiwxNiBAQAogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItY29tbW9uLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY3RybHMuaD4KKyNpbmNsdWRlIDxtZWRpYS92aWRlb2J1ZjItdm1hbGxvYy5oPgogI2lmZGVmIENPTkZJR19VU0JfUFdDX0lOUFVUX0VWREVWCiAjaW5jbHVkZSA8bGludXgvaW5wdXQuaD4KICNlbmRpZgogCi0jaW5jbHVkZSAicHdjLXVuY29tcHJlc3MuaCIKICNpbmNsdWRlIDxtZWRpYS9wd2MtaW9jdGwuaD4KIAogLyogVmVyc2lvbiBibG9jayAqLwotI2RlZmluZSBQV0NfTUFKT1IJMTAKLSNkZWZpbmUgUFdDX01JTk9SCTAKLSNkZWZpbmUgUFdDX0VYVFJBTUlOT1IJMTIKLSNkZWZpbmUgUFdDX1ZFUlNJT05fQ09ERSBLRVJORUxfVkVSU0lPTihQV0NfTUFKT1IsUFdDX01JTk9SLFBXQ19FWFRSQU1JTk9SKQotI2RlZmluZSBQV0NfVkVSU0lPTgkiMTAuMC4xNCIKKyNkZWZpbmUgUFdDX1ZFUlNJT04JIjEwLjAuMTUiCiAjZGVmaW5lIFBXQ19OQU1FIAkicHdjIgogI2RlZmluZSBQRlgJCVBXQ19OQU1FICI6ICIKIApAQCAtODEsOSArNzcsOSBAQAogI2RlZmluZSBQV0NfREVCVUdfTEVWRUwJKFBXQ19ERUJVR19MRVZFTF9NT0RVTEUpCiAKICNkZWZpbmUgUFdDX0RFQlVHKGxldmVsLCBmbXQsIGFyZ3MuLi4pIGRvIHtcCi0JICBpZiAoKFBXQ19ERUJVR19MRVZFTF8gIyNsZXZlbCkgJiBwd2NfdHJhY2UpIFwKLQkgICAgIHByaW50ayhLRVJOX0RFQlVHIFBGWCBmbXQsICMjYXJncyk7IFwKLQkgIH0gd2hpbGUoMCkKKwlpZiAoKFBXQ19ERUJVR19MRVZFTF8gIyNsZXZlbCkgJiBwd2NfdHJhY2UpIFwKKwkJcHJpbnRrKEtFUk5fREVCVUcgUEZYIGZtdCwgIyNhcmdzKTsgXAorCX0gd2hpbGUgKDApCiAKICNkZWZpbmUgUFdDX0VSUk9SKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fRVJSIFBGWCBmbXQsICMjYXJncykKICNkZWZpbmUgUFdDX1dBUk5JTkcoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HIFBGWCBmbXQsICMjYXJncykKQEAgLTExMCwyNSArMTA2LDIxIEBACiAjZGVmaW5lIEZFQVRVUkVfQ09ERUMxCQkJMHgwMDAyCiAjZGVmaW5lIEZFQVRVUkVfQ09ERUMyCQkJMHgwMDA0CiAKLS8qIFR1cm4gY2VydGFpbiBmZWF0dXJlcyBvbi9vZmYgKi8KLSNkZWZpbmUgUFdDX0lOVF9QSVBFIDAKLQogLyogSWdub3JlIGVycm9ycyBpbiB0aGUgZmlyc3QgTiBmcmFtZXMsIHRvIGFsbG93IGZvciBzdGFydHVwIGRlbGF5cyAqLwogI2RlZmluZSBGUkFNRV9MT1dNQVJLIDUKIAogLyogU2l6ZSBhbmQgbnVtYmVyIG9mIGJ1ZmZlcnMgZm9yIHRoZSBJU08gcGlwZS4gKi8KLSNkZWZpbmUgTUFYX0lTT19CVUZTCQkyCisjZGVmaW5lIE1BWF9JU09fQlVGUwkJMwogI2RlZmluZSBJU09fRlJBTUVTX1BFUl9ERVNDCTEwCiAjZGVmaW5lIElTT19NQVhfRlJBTUVfU0laRQk5NjAKICNkZWZpbmUgSVNPX0JVRkZFUl9TSVpFIAkoSVNPX0ZSQU1FU19QRVJfREVTQyAqIElTT19NQVhfRlJBTUVfU0laRSkKIAotLyogRnJhbWUgYnVmZmVyczogY29udGFpbnMgY29tcHJlc3NlZCBvciB1bmNvbXByZXNzZWQgdmlkZW8gZGF0YS4gKi8KLSNkZWZpbmUgTUFYX0ZSQU1FUwkJNQogLyogTWF4aW11bSBzaXplIGFmdGVyIGRlY29tcHJlc3Npb24gaXMgNjQweDQ4MCBZVVYgZGF0YSwgMS41ICogNjQwICogNDgwICovCiAjZGVmaW5lIFBXQ19GUkFNRV9TSVpFIAkJKDQ2MDgwMCArIFRPVUNBTV9IRUFERVJfU0laRSArIFRPVUNBTV9UUkFJTEVSX1NJWkUpCiAKLS8qIEFic29sdXRlIG1heGltdW0gbnVtYmVyIG9mIGJ1ZmZlcnMgYXZhaWxhYmxlIGZvciBtbWFwKCkgKi8KLSNkZWZpbmUgTUFYX0lNQUdFUyAJCTEwCisvKiBBYnNvbHV0ZSBtaW5pbXVtIGFuZCBtYXhpbXVtIG51bWJlciBvZiBidWZmZXJzIGF2YWlsYWJsZSBmb3IgbW1hcCgpICovCisjZGVmaW5lIE1JTl9GUkFNRVMJCTIKKyNkZWZpbmUgTUFYX0ZSQU1FUwkJMTYKIAogLyogU29tZSBtYWNyb3MgdG8gcXVpY2tseSBmaW5kIHRoZSB0eXBlIG9mIGEgd2ViY2FtICovCiAjZGVmaW5lIERFVklDRV9VU0VfQ09ERUMxKHgpICgoeCk8Njc1KQpAQCAtMTM2LDE0OSArMTI4LDIyMSBAQAogI2RlZmluZSBERVZJQ0VfVVNFX0NPREVDMyh4KSAoKHgpPj03MDApCiAjZGVmaW5lIERFVklDRV9VU0VfQ09ERUMyMyh4KSAoKHgpPj02NzUpCiAKLS8qIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlcyB3ZXJlIGJhc2VkIG9uIGNwaWEuaC4gV2h5IHJlaW52ZW50IHRoZSB3aGVlbD8gOi0pICovCi1zdHJ1Y3QgcHdjX2lzb19idWYKLXsKLQl2b2lkICpkYXRhOwotCWludCAgbGVuZ3RoOwotCWludCAgcmVhZDsKLQlzdHJ1Y3QgdXJiICp1cmI7Ci19OworLyogZnJvbSBwd2MtZGVjLmggKi8KKyNkZWZpbmUgUFdDWF9GTEFHX1BMQU5BUiAgICAgICAgMHgwMDAxCisKKy8qIFJlcXVlc3QgdHlwZXM6IHZpZGVvICovCisjZGVmaW5lIFNFVF9MVU1fQ1RMCQkJMHgwMQorI2RlZmluZSBHRVRfTFVNX0NUTAkJCTB4MDIKKyNkZWZpbmUgU0VUX0NIUk9NX0NUTAkJCTB4MDMKKyNkZWZpbmUgR0VUX0NIUk9NX0NUTAkJCTB4MDQKKyNkZWZpbmUgU0VUX1NUQVRVU19DVEwJCQkweDA1CisjZGVmaW5lIEdFVF9TVEFUVVNfQ1RMCQkJMHgwNgorI2RlZmluZSBTRVRfRVBfU1RSRUFNX0NUTAkJMHgwNworI2RlZmluZSBHRVRfRVBfU1RSRUFNX0NUTAkJMHgwOAorI2RlZmluZSBHRVRfWFhfQ1RMCQkJMHgwOQorI2RlZmluZSBTRVRfWFhfQ1RMCQkJMHgwQQorI2RlZmluZSBHRVRfWFlfQ1RMCQkJMHgwQgorI2RlZmluZSBTRVRfWFlfQ1RMCQkJMHgwQworI2RlZmluZSBTRVRfTVBUX0NUTAkJCTB4MEQKKyNkZWZpbmUgR0VUX01QVF9DVEwJCQkweDBFCisKKy8qIFNlbGVjdG9ycyBmb3IgdGhlIEx1bWluYW5jZSBjb250cm9scyBbR1NdRVRfTFVNX0NUTCAqLworI2RlZmluZSBBR0NfTU9ERV9GT1JNQVRURVIJCQkweDIwMDAKKyNkZWZpbmUgUFJFU0VUX0FHQ19GT1JNQVRURVIJCQkweDIxMDAKKyNkZWZpbmUgU0hVVFRFUl9NT0RFX0ZPUk1BVFRFUgkJCTB4MjIwMAorI2RlZmluZSBQUkVTRVRfU0hVVFRFUl9GT1JNQVRURVIJCTB4MjMwMAorI2RlZmluZSBQUkVTRVRfQ09OVE9VUl9GT1JNQVRURVIJCTB4MjQwMAorI2RlZmluZSBBVVRPX0NPTlRPVVJfRk9STUFUVEVSCQkJMHgyNTAwCisjZGVmaW5lIEJBQ0tfTElHSFRfQ09NUEVOU0FUSU9OX0ZPUk1BVFRFUgkweDI2MDAKKyNkZWZpbmUgQ09OVFJBU1RfRk9STUFUVEVSCQkJMHgyNzAwCisjZGVmaW5lIERZTkFNSUNfTk9JU0VfQ09OVFJPTF9GT1JNQVRURVIJCTB4MjgwMAorI2RlZmluZSBGTElDS0VSTEVTU19NT0RFX0ZPUk1BVFRFUgkJMHgyOTAwCisjZGVmaW5lIEFFX0NPTlRST0xfU1BFRUQJCQkweDJBMDAKKyNkZWZpbmUgQlJJR0hUTkVTU19GT1JNQVRURVIJCQkweDJCMDAKKyNkZWZpbmUgR0FNTUFfRk9STUFUVEVSCQkJCTB4MkMwMAorCisvKiBTZWxlY3RvcnMgZm9yIHRoZSBDaHJvbWluYW5jZSBjb250cm9scyBbR1NdRVRfQ0hST01fQ1RMICovCisjZGVmaW5lIFdCX01PREVfRk9STUFUVEVSCQkJMHgxMDAwCisjZGVmaW5lIEFXQl9DT05UUk9MX1NQRUVEX0ZPUk1BVFRFUgkJMHgxMTAwCisjZGVmaW5lIEFXQl9DT05UUk9MX0RFTEFZX0ZPUk1BVFRFUgkJMHgxMjAwCisjZGVmaW5lIFBSRVNFVF9NQU5VQUxfUkVEX0dBSU5fRk9STUFUVEVSCTB4MTMwMAorI2RlZmluZSBQUkVTRVRfTUFOVUFMX0JMVUVfR0FJTl9GT1JNQVRURVIJMHgxNDAwCisjZGVmaW5lIENPTE9VUl9NT0RFX0ZPUk1BVFRFUgkJCTB4MTUwMAorI2RlZmluZSBTQVRVUkFUSU9OX01PREVfRk9STUFUVEVSMQkJMHgxNjAwCisjZGVmaW5lIFNBVFVSQVRJT05fTU9ERV9GT1JNQVRURVIyCQkweDE3MDAKKworLyogU2VsZWN0b3JzIGZvciB0aGUgU3RhdHVzIGNvbnRyb2xzIFtHU11FVF9TVEFUVVNfQ1RMICovCisjZGVmaW5lIFNBVkVfVVNFUl9ERUZBVUxUU19GT1JNQVRURVIJCTB4MDIwMAorI2RlZmluZSBSRVNUT1JFX1VTRVJfREVGQVVMVFNfRk9STUFUVEVSCQkweDAzMDAKKyNkZWZpbmUgUkVTVE9SRV9GQUNUT1JZX0RFRkFVTFRTX0ZPUk1BVFRFUgkweDA0MDAKKyNkZWZpbmUgUkVBRF9BR0NfRk9STUFUVEVSCQkJMHgwNTAwCisjZGVmaW5lIFJFQURfU0hVVFRFUl9GT1JNQVRURVIJCQkweDA2MDAKKyNkZWZpbmUgUkVBRF9SRURfR0FJTl9GT1JNQVRURVIJCQkweDA3MDAKKyNkZWZpbmUgUkVBRF9CTFVFX0dBSU5fRk9STUFUVEVSCQkweDA4MDAKKworLyogRm9ybWF0dGVycyBmb3IgdGhlIG1vdG9yaXplZCBwYW4gJiB0aWx0IFtHU11FVF9NUFRfQ1RMICovCisjZGVmaW5lIFBUX1JFTEFUSVZFX0NPTlRST0xfRk9STUFUVEVSCQkweDAxCisjZGVmaW5lIFBUX1JFU0VUX0NPTlRST0xfRk9STUFUVEVSCQkweDAyCisjZGVmaW5lIFBUX1NUQVRVU19GT1JNQVRURVIJCQkweDAzCiAKIC8qIGludGVybWVkaWF0ZSBidWZmZXJzIHdpdGggcmF3IGRhdGEgZnJvbSB0aGUgVVNCIGNhbSAqLwogc3RydWN0IHB3Y19mcmFtZV9idWYKIHsKLSAgIHZvaWQgKmRhdGE7Ci0gICB2b2xhdGlsZSBpbnQgZmlsbGVkOwkJLyogbnVtYmVyIG9mIGJ5dGVzIGZpbGxlZCAqLwotICAgc3RydWN0IHB3Y19mcmFtZV9idWYgKm5leHQ7CS8qIGxpc3QgKi8KLX07Ci0KLS8qIGFkZGl0aW9ubmFsIGluZm9ybWF0aW9ucyB1c2VkIHdoZW4gZGVhbGluZyBpbWFnZSBiZXR3ZWVuIGtlcm5lbCBhbmQgdXNlcmxhbmQgKi8KLXN0cnVjdCBwd2NfaW1nYnVmCi17Ci0JdW5zaWduZWQgbG9uZyBvZmZzZXQ7CS8qIG9mZnNldCBvZiB0aGlzIGJ1ZmZlciBpbiB0aGUgYmlnIGFycmF5IG9mIGltYWdlX2RhdGEgKi8KLQlpbnQgICB2bWFfdXNlX2NvdW50OwkvKiBjb3VudCB0aGUgbnVtYmVyIG9mIHRpbWUgdGhpcyBtZW1vcnkgaXMgbWFwcGVkICovCisJc3RydWN0IHZiMl9idWZmZXIgdmI7CS8qIGNvbW1vbiB2NGwgYnVmZmVyIHN0dWZmIC0tIG11c3QgYmUgZmlyc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdm9pZCAqZGF0YTsKKwlpbnQgZmlsbGVkOwkJLyogbnVtYmVyIG9mIGJ5dGVzIGZpbGxlZCAqLwogfTsKIAogc3RydWN0IHB3Y19kZXZpY2UKIHsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlIHZkZXY7CisJc3RydWN0IG11dGV4IG1vZGxvY2s7CiAKLSAgIC8qIFBvaW50ZXIgdG8gb3VyIHVzYl9kZXZpY2UsIG1heSBiZSBOVUxMIGFmdGVyIHVucGx1ZyAqLwotICAgc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CisJLyogUG9pbnRlciB0byBvdXIgdXNiX2RldmljZSwgbWF5IGJlIE5VTEwgYWZ0ZXIgdW5wbHVnICovCisJc3RydWN0IHVzYl9kZXZpY2UgKnVkZXY7CisJLyogUHJvdGVjdHMgdGhlIHNldHRpbmcgb2YgdWRldiB0byBOVUxMIGJ5IG91ciBkaXNjb25uZWN0IGhhbmRsZXIgKi8KKwlzdHJ1Y3QgbXV0ZXggdWRldmxvY2s7CiAKLSAgIGludCB0eXBlOyAgICAgICAgICAgICAgICAgICAgLyogdHlwZSBvZiBjYW0gKDY0NSwgNjQ2LCA2NzUsIDY4MCwgNjkwLCA3MjAsIDczMCwgNzQwLCA3NTApICovCi0gICBpbnQgcmVsZWFzZTsJCQkvKiByZWxlYXNlIG51bWJlciAqLwotICAgaW50IGZlYXR1cmVzOwkJLyogZmVhdHVyZSBiaXRzICovCi0gICBjaGFyIHNlcmlhbFszMF07CQkvKiBzZXJpYWwgbnVtYmVyIChzdHJpbmcpICovCi0gICBpbnQgZXJyb3Jfc3RhdHVzOwkJLyogc2V0IHdoZW4gc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2l0aCB0aGUgY2FtICh1bnBsdWdnZWQsIFVTQiBlcnJvcnMpICovCi0gICBpbnQgdXNiX2luaXQ7CQkvKiBzZXQgd2hlbiB0aGUgY2FtIGhhcyBiZWVuIGluaXRpYWxpemVkIG92ZXIgVVNCICovCisJLyogdHlwZSBvZiBjYW0gKDY0NSwgNjQ2LCA2NzUsIDY4MCwgNjkwLCA3MjAsIDczMCwgNzQwLCA3NTApICovCisJaW50IHR5cGU7CisJaW50IHJlbGVhc2U7CQkvKiByZWxlYXNlIG51bWJlciAqLworCWludCBmZWF0dXJlczsJCS8qIGZlYXR1cmUgYml0cyAqLworCWNoYXIgc2VyaWFsWzMwXTsJLyogc2VyaWFsIG51bWJlciAoc3RyaW5nKSAqLwogCi0gICAvKioqIFZpZGVvIGRhdGEgKioqLwotICAgaW50IHZvcGVuOwkJCS8qIGZsYWcgKi8KLSAgIGludCB2ZW5kcG9pbnQ7CQkvKiB2aWRlbyBpc29jIGVuZHBvaW50ICovCi0gICBpbnQgdmNpbnRlcmZhY2U7CQkvKiB2aWRlbyBjb250cm9sIGludGVyZmFjZSAqLwotICAgaW50IHZhbHRlcm5hdGU7CQkvKiBhbHRlcm5hdGUgaW50ZXJmYWNlIG5lZWRlZCAqLwotICAgaW50IHZmcmFtZXMsIHZzaXplOwkJLyogZnJhbWVzLXBlci1zZWNvbmQgJiBzaXplIChzZWUgUFNaXyopICovCi0gICBpbnQgcGl4Zm10OwkJCS8qIHBpeGVsZm9ybWF0OiBWNEwyX1BJWF9GTVRfWVVWNDIwIG9yIHJhdzogX1BXQzEsIF9QV0MyICovCi0gICBpbnQgdmZyYW1lX2NvdW50OwkJLyogcmVjZWl2ZWQgZnJhbWVzICovCi0gICBpbnQgdmZyYW1lc19kdW1wZWQ7IAkJLyogY291bnRlciBmb3IgZHVtcGVkIGZyYW1lcyAqLwotICAgaW50IHZmcmFtZXNfZXJyb3I7CQkvKiBmcmFtZXMgcmVjZWl2ZWQgaW4gZXJyb3IgKi8KLSAgIGludCB2bWF4X3BhY2tldF9zaXplOwkvKiBVU0IgbWF4cGFja2V0IHNpemUgKi8KLSAgIGludCB2bGFzdF9wYWNrZXRfc2l6ZTsJLyogZm9yIGZyYW1lIHN5bmNocm9uaXNhdGlvbiAqLwotICAgaW50IHZpc29jX2Vycm9yczsJCS8qIG51bWJlciBvZiBjb250aWd1b3VzIElTT0MgZXJyb3JzICovCi0gICBpbnQgdmNvbXByZXNzaW9uOwkJLyogZGVzaXJlZCBjb21wcmVzc2lvbiBmYWN0b3IgKi8KLSAgIGludCB2YmFuZGxlbmd0aDsJCS8qIGNvbXByZXNzZWQgYmFuZCBsZW5ndGg7IDAgaXMgdW5jb21wcmVzc2VkICovCi0gICBjaGFyIHZzbmFwc2hvdDsJCS8qIHNuYXBzaG90IG1vZGUgKi8KLSAgIGNoYXIgdnN5bmM7CQkJLyogdXNlZCBieSBpc29jIGhhbmRsZXIgKi8KLSAgIGNoYXIgdm1pcnJvcjsJCS8qIGZvciBUb1VDYU0gc2VyaWVzICovCi0JY2hhciB1bnBsdWdnZWQ7CisJLyoqKiBWaWRlbyBkYXRhICoqKi8KKwlzdHJ1Y3QgZmlsZSAqY2FwdF9maWxlOwkvKiBmaWxlIGRvaW5nIHZpZGVvIGNhcHR1cmUgKi8KKwlpbnQgdmVuZHBvaW50OwkJLyogdmlkZW8gaXNvYyBlbmRwb2ludCAqLworCWludCB2Y2ludGVyZmFjZTsJLyogdmlkZW8gY29udHJvbCBpbnRlcmZhY2UgKi8KKwlpbnQgdmFsdGVybmF0ZTsJCS8qIGFsdGVybmF0ZSBpbnRlcmZhY2UgbmVlZGVkICovCisJaW50IHZmcmFtZXMsIHZzaXplOwkvKiBmcmFtZXMtcGVyLXNlY29uZCAmIHNpemUgKHNlZSBQU1pfKikgKi8KKwlpbnQgcGl4Zm10OwkJLyogcGl4ZWxmb3JtYXQ6IFY0TDJfUElYX0ZNVF9ZVVY0MjAgb3IgX1BXQ1ggKi8KKwlpbnQgdmZyYW1lX2NvdW50OwkvKiByZWNlaXZlZCBmcmFtZXMgKi8KKwlpbnQgdm1heF9wYWNrZXRfc2l6ZTsJLyogVVNCIG1heHBhY2tldCBzaXplICovCisJaW50IHZsYXN0X3BhY2tldF9zaXplOwkvKiBmb3IgZnJhbWUgc3luY2hyb25pc2F0aW9uICovCisJaW50IHZpc29jX2Vycm9yczsJLyogbnVtYmVyIG9mIGNvbnRpZ3VvdXMgSVNPQyBlcnJvcnMgKi8KKwlpbnQgdmNvbXByZXNzaW9uOwkvKiBkZXNpcmVkIGNvbXByZXNzaW9uIGZhY3RvciAqLworCWludCB2YmFuZGxlbmd0aDsJLyogY29tcHJlc3NlZCBiYW5kIGxlbmd0aDsgMCBpcyB1bmNvbXByZXNzZWQgKi8KKwljaGFyIHZzbmFwc2hvdDsJCS8qIHNuYXBzaG90IG1vZGUgKi8KKwljaGFyIHZzeW5jOwkJLyogdXNlZCBieSBpc29jIGhhbmRsZXIgKi8KKwljaGFyIHZtaXJyb3I7CQkvKiBmb3IgVG9VQ2FNIHNlcmllcyAqLworCWNoYXIgcG93ZXJfc2F2ZTsJLyogRG8gcG93ZXJzYXZpbmcgZm9yIHRoaXMgY2FtICovCiAKLSAgIGludCBjbWRfbGVuOwotICAgdW5zaWduZWQgY2hhciBjbWRfYnVmWzEzXTsKKwlpbnQgY21kX2xlbjsKKwl1bnNpZ25lZCBjaGFyIGNtZF9idWZbMTNdOwogCi0gICAvKiBUaGUgaW1hZ2UgYWNxdWlzaXRpb24gcmVxdWlyZXMgMyB0byA0IHN0ZXBzOgotICAgICAgMS4gZGF0YSBpcyBnYXRoZXJlZCBpbiBzaG9ydCBwYWNrZXRzIGZyb20gdGhlIFVTQiBjb250cm9sbGVyCi0gICAgICAyLiBkYXRhIGlzIHN5bmNocm9uaXplZCBhbmQgcGFja2VkIGludG8gYSBmcmFtZSBidWZmZXIKLSAgICAgIDNhLiBpbiBjYXNlIGRhdGEgaXMgY29tcHJlc3NlZCwgZGVjb21wcmVzcyBpdCBkaXJlY3RseSBpbnRvIGltYWdlIGJ1ZmZlcgotICAgICAgM2IuIGluIGNhc2UgZGF0YSBpcyB1bmNvbXByZXNzZWQsIGNvcHkgaW50byBpbWFnZSBidWZmZXIgd2l0aCB2aWV3cG9ydAotICAgICAgNC4gZGF0YSBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgdXNlciBwcm9jZXNzCisJc3RydWN0IHVyYiAqdXJic1tNQVhfSVNPX0JVRlNdOworCWNoYXIgaXNvX2luaXQ7CiAKLSAgICAgIE5vdGUgdGhhdCBNQVhfSVNPX0JVRlMgIT0gTUFYX0ZSQU1FUyAhPSBNQVhfSU1BR0VTLi4uLgotICAgICAgV2UgaGF2ZSBpbiBlZmZlY3QgYSBiYWNrLXRvLWJhY2stZG91YmxlLWJ1ZmZlciBzeXN0ZW0uCi0gICAgKi8KLSAgIC8qIDE6IGlzb2MgKi8KLSAgIHN0cnVjdCBwd2NfaXNvX2J1ZiBzYnVmW01BWF9JU09fQlVGU107Ci0gICBjaGFyIGlzb19pbml0OworCS8qIHZpZGVvYnVmMiBxdWV1ZSBhbmQgcXVldWVkIGJ1ZmZlcnMgbGlzdCAqLworCXN0cnVjdCB2YjJfcXVldWUgdmJfcXVldWU7CisJc3RydWN0IGxpc3RfaGVhZCBxdWV1ZWRfYnVmczsKKwlzcGlubG9ja190IHF1ZXVlZF9idWZzX2xvY2s7CiAKLSAgIC8qIDI6IGZyYW1lICovCi0gICBzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiAqZmJ1ZjsJLyogYWxsIGZyYW1lcyAqLwotICAgc3RydWN0IHB3Y19mcmFtZV9idWYgKmVtcHR5X2ZyYW1lcywgKmVtcHR5X2ZyYW1lc190YWlsOwkvKiBhbGwgZW1wdHkgZnJhbWVzICovCi0gICBzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiAqZnVsbF9mcmFtZXMsICpmdWxsX2ZyYW1lc190YWlsOwkvKiBhbGwgZmlsbGVkIGZyYW1lcyAqLwotICAgc3RydWN0IHB3Y19mcmFtZV9idWYgKmZpbGxfZnJhbWU7CS8qIGZyYW1lIGN1cnJlbnRseSBiZWluZyBmaWxsZWQgKi8KLSAgIHN0cnVjdCBwd2NfZnJhbWVfYnVmICpyZWFkX2ZyYW1lOwkvKiBmcmFtZSBjdXJyZW50bHkgcmVhZCBieSB1c2VyIHByb2Nlc3MgKi8KLSAgIGludCBmcmFtZV9oZWFkZXJfc2l6ZSwgZnJhbWVfdHJhaWxlcl9zaXplOwotICAgaW50IGZyYW1lX3NpemU7Ci0gICBpbnQgZnJhbWVfdG90YWxfc2l6ZTsgLyogaW5jbHVkaW5nIGhlYWRlciAmIHRyYWlsZXIgKi8KLSAgIGludCBkcm9wX2ZyYW1lczsKKwkvKgorCSAqIEZyYW1lIGN1cnJlbnRseSBiZWluZyBmaWxsZWQsIHRoaXMgb25seSBnZXRzIHRvdWNoZWQgYnkgdGhlCisJICogaXNvYyB1cmIgY29tcGxldGUgaGFuZGxlciwgYW5kIGJ5IHN0cmVhbSBzdGFydCAvIHN0b3Agc2luY2UKKwkgKiBzdGFydCAvIHN0b3AgdG91Y2ggaXQgYmVmb3JlIC8gYWZ0ZXIgc3RhcnRpbmcgLyBraWxsaW5nIHRoZSB1cmJzCisJICogbm8gbG9ja2luZyBpcyBuZWVkZWQgYXJvdW5kIHRoaXMKKwkgKi8KKwlzdHJ1Y3QgcHdjX2ZyYW1lX2J1ZiAqZmlsbF9idWY7CiAKLSAgIC8qIDM6IGRlY29tcHJlc3Npb24gKi8KLSAgIHZvaWQgKmRlY29tcHJlc3NfZGF0YTsJCS8qIHByaXZhdGUgZGF0YSBmb3IgZGVjb21wcmVzc2lvbiBlbmdpbmUgKi8KKwlpbnQgZnJhbWVfaGVhZGVyX3NpemUsIGZyYW1lX3RyYWlsZXJfc2l6ZTsKKwlpbnQgZnJhbWVfc2l6ZTsKKwlpbnQgZnJhbWVfdG90YWxfc2l6ZTsJLyogaW5jbHVkaW5nIGhlYWRlciAmIHRyYWlsZXIgKi8KKwlpbnQgZHJvcF9mcmFtZXM7CiAKLSAgIC8qIDQ6IGltYWdlICovCi0gICAvKiBXZSBoYXZlIGFuICdpbWFnZScgYW5kIGEgJ3ZpZXcnLCB3aGVyZSAnaW1hZ2UnIGlzIHRoZSBmaXhlZC1zaXplIGltYWdlCi0gICAgICBhcyBkZWxpdmVyZWQgYnkgdGhlIGNhbWVyYSwgYW5kICd2aWV3JyBpcyB0aGUgc2l6ZSByZXF1ZXN0ZWQgYnkgdGhlCi0gICAgICBwcm9ncmFtLiBUaGUgY2FtZXJhIGltYWdlIGlzIGNlbnRlcmVkIGluIHRoaXMgdmlld3BvcnQsIGxhY2VkIHdpdGgKLSAgICAgIGEgZ3JheSBvciBibGFjayBib3JkZXIuIHZpZXdfbWluIDw9IGltYWdlIDw9IHZpZXcgPD0gdmlld19tYXg7Ci0gICAgKi8KLSAgIGludCBpbWFnZV9tYXNrOwkJCS8qIGJpdG1hc2sgb2Ygc3VwcG9ydGVkIHNpemVzICovCi0gICBzdHJ1Y3QgcHdjX2Nvb3JkIHZpZXdfbWluLCB2aWV3X21heDsJLyogbWluaW11bSBhbmQgbWF4aW11bSB2aWV3YWJsZSBzaXplcyAqLwotICAgc3RydWN0IHB3Y19jb29yZCBhYnNfbWF4OyAgICAgICAgICAgIC8qIG1heGltdW0gc3VwcG9ydGVkIHNpemUgd2l0aCBjb21wcmVzc2lvbiAqLwotICAgc3RydWN0IHB3Y19jb29yZCBpbWFnZSwgdmlldzsJLyogaW1hZ2UgYW5kIHZpZXdwb3J0IHNpemUgKi8KLSAgIHN0cnVjdCBwd2NfY29vcmQgb2Zmc2V0OwkJLyogb2Zmc2V0IHdpdGhpbiB0aGUgdmlld3BvcnQgKi8KKwl2b2lkICpkZWNvbXByZXNzX2RhdGE7CS8qIHByaXZhdGUgZGF0YSBmb3IgZGVjb21wcmVzc2lvbiBlbmdpbmUgKi8KIAotICAgdm9pZCAqaW1hZ2VfZGF0YTsJCQkvKiB0b3RhbCBidWZmZXIsIHdoaWNoIGlzIHN1YmRpdmlkZWQgaW50byAuLi4gKi8KLSAgIHN0cnVjdCBwd2NfaW1nYnVmIGltYWdlc1tNQVhfSU1BR0VTXTsvKiAuLi5zZXZlcmFsIGltYWdlcy4uLiAqLwotICAgaW50IGZpbGxfaW1hZ2U7CQkJLyogLi4ud2hpY2ggYXJlIHJvdGF0ZWQuICovCi0gICBpbnQgbGVuX3Blcl9pbWFnZTsJCQkvKiBsZW5ndGggcGVyIGltYWdlICovCi0gICBpbnQgaW1hZ2VfcmVhZF9wb3M7CQkJLyogSW4gY2FzZSB3ZSByZWFkIGRhdGEgaW4gcGllY2VzLCBrZWVwIHRyYWNrIG9mIHdlcmUgd2UgYXJlIGluIHRoZSBpbWFnZWJ1ZmZlciAqLwotICAgaW50IGltYWdlX3VzZWRbTUFYX0lNQUdFU107CQkvKiBGb3IgTUNBUFRVUkUgYW5kIFNZTkMgKi8KKwkvKgorCSAqIFdlIGhhdmUgYW4gJ2ltYWdlJyBhbmQgYSAndmlldycsIHdoZXJlICdpbWFnZScgaXMgdGhlIGZpeGVkLXNpemUgaW1nCisJICogYXMgZGVsaXZlcmVkIGJ5IHRoZSBjYW1lcmEsIGFuZCAndmlldycgaXMgdGhlIHNpemUgcmVxdWVzdGVkIGJ5IHRoZQorCSAqIHByb2dyYW0uIFRoZSBjYW1lcmEgaW1hZ2UgaXMgY2VudGVyZWQgaW4gdGhpcyB2aWV3cG9ydCwgbGFjZWQgd2l0aAorCSAqIGEgZ3JheSBvciBibGFjayBib3JkZXIuIHZpZXdfbWluIDw9IGltYWdlIDw9IHZpZXcgPD0gdmlld19tYXg7CisJICovCisJaW50IGltYWdlX21hc2s7CQkJCS8qIHN1cHBvcnRlZCBzaXplcyAqLworCXN0cnVjdCBwd2NfY29vcmQgdmlld19taW4sIHZpZXdfbWF4OwkvKiBtaW5pbXVtIGFuZCBtYXhpbXVtIHZpZXcgKi8KKwlzdHJ1Y3QgcHdjX2Nvb3JkIGFic19tYXg7CQkvKiBtYXhpbXVtIHN1cHBvcnRlZCBzaXplICovCisJc3RydWN0IHB3Y19jb29yZCBpbWFnZSwgdmlldzsJCS8qIGltYWdlIGFuZCB2aWV3cG9ydCBzaXplICovCisJc3RydWN0IHB3Y19jb29yZCBvZmZzZXQ7CQkvKiBvZmZzZXQgb2YgdGhlIHZpZXdwb3J0ICovCiAKLSAgIHN0cnVjdCBtdXRleCBtb2Rsb2NrOwkJLyogdG8gcHJldmVudCByYWNlcyBpbiB2aWRlb19vcGVuKCksIGV0YyAqLwotICAgc3BpbmxvY2tfdCBwdHJsb2NrOwkJCS8qIGZvciBtYW5pcHVsYXRpbmcgdGhlIGJ1ZmZlciBwb2ludGVycyAqLworCS8qKiogbW90b3JpemVkIHBhbi90aWx0IGZlYXR1cmUgKi8KKwlzdHJ1Y3QgcHdjX21wdF9yYW5nZSBhbmdsZV9yYW5nZTsKKwlpbnQgcGFuX2FuZ2xlOwkJCS8qIGluIGRlZ3JlZXMgKiAxMDAgKi8KKwlpbnQgdGlsdF9hbmdsZTsJCQkvKiBhYnNvbHV0ZSBhbmdsZTsgMCwwIGlzIGhvbWUgKi8KIAotICAgLyoqKiBtb3Rvcml6ZWQgcGFuL3RpbHQgZmVhdHVyZSAqLwotICAgc3RydWN0IHB3Y19tcHRfcmFuZ2UgYW5nbGVfcmFuZ2U7Ci0gICBpbnQgcGFuX2FuZ2xlOwkJCS8qIGluIGRlZ3JlZXMgKiAxMDAgKi8KLSAgIGludCB0aWx0X2FuZ2xlOwkJCS8qIGFic29sdXRlIGFuZ2xlOyAwLDAgaXMgaG9tZSBwb3NpdGlvbiAqLwotICAgaW50IHNuYXBzaG90X2J1dHRvbl9zdGF0dXM7CQkvKiBzZXQgdG8gMSB3aGVuIHRoZSB1c2VyIHB1c2ggdGhlIGJ1dHRvbiwgcmVzZXQgdG8gMCB3aGVuIHRoaXMgdmFsdWUgaXMgcmVhZCAqLworCS8qCisJICogU2V0IHRvIDEgd2hlbiB0aGUgdXNlciBwdXNoIHRoZSBidXR0b24sIHJlc2V0IHRvIDAKKwkgKiB3aGVuIHRoaXMgdmFsdWUgaXMgcmVhZCBmcm9tIHN5c2ZzLgorCSAqLworCWludCBzbmFwc2hvdF9idXR0b25fc3RhdHVzOwogI2lmZGVmIENPTkZJR19VU0JfUFdDX0lOUFVUX0VWREVWCi0gICBzdHJ1Y3QgaW5wdXRfZGV2ICpidXR0b25fZGV2OwkvKiB3ZWJjYW0gc25hcHNob3QgYnV0dG9uIGlucHV0ICovCi0gICBjaGFyIGJ1dHRvbl9waHlzWzY0XTsKKwlzdHJ1Y3QgaW5wdXRfZGV2ICpidXR0b25fZGV2OwkvKiB3ZWJjYW0gc25hcHNob3QgYnV0dG9uIGlucHV0ICovCisJY2hhciBidXR0b25fcGh5c1s2NF07CiAjZW5kaWYKIAotICAgLyoqKiBNaXNjLiBkYXRhICoqKi8KLSAgIHdhaXRfcXVldWVfaGVhZF90IGZyYW1lcTsJCS8qIFdoZW4gd2FpdGluZyBmb3IgYSBmcmFtZSB0byBmaW5pc2guLi4gKi8KLSNpZiBQV0NfSU5UX1BJUEUKLSAgIHZvaWQgKnVzYl9pbnRfaGFuZGxlcjsJCS8qIGZvciB0aGUgaW50ZXJydXB0IGVuZHBvaW50ICovCi0jZW5kaWYKKwkvKiBjb250cm9scyAqLworCXN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlcgljdHJsX2hhbmRsZXI7CisJdTE2CQkJCXNhdHVyYXRpb25fZm10OworCXN0cnVjdCB2NGwyX2N0cmwJCSpicmlnaHRuZXNzOworCXN0cnVjdCB2NGwyX2N0cmwJCSpjb250cmFzdDsKKwlzdHJ1Y3QgdjRsMl9jdHJsCQkqc2F0dXJhdGlvbjsKKwlzdHJ1Y3QgdjRsMl9jdHJsCQkqZ2FtbWE7CisJc3RydWN0IHsKKwkJLyogYXdiIC8gcmVkLWJsdWUgYmFsYW5jZSBjbHVzdGVyICovCisJCXN0cnVjdCB2NGwyX2N0cmwJKmF1dG9fd2hpdGVfYmFsYW5jZTsKKwkJc3RydWN0IHY0bDJfY3RybAkqcmVkX2JhbGFuY2U7CisJCXN0cnVjdCB2NGwyX2N0cmwJKmJsdWVfYmFsYW5jZTsKKwkJLyogdXNiIGN0cmwgdHJhbnNmZXJzIGFyZSBzbG93LCBzbyB3ZSBjYWNoZSB0aGluZ3MgKi8KKwkJaW50CQkJY29sb3JfYmFsX3ZhbGlkOworCQl1bnNpZ25lZCBsb25nCQlsYXN0X2NvbG9yX2JhbF91cGRhdGU7IC8qIEluIGppZmZpZXMgKi8KKwkJczMyCQkJbGFzdF9yZWRfYmFsYW5jZTsKKwkJczMyCQkJbGFzdF9ibHVlX2JhbGFuY2U7CisJfTsKKwlzdHJ1Y3QgeworCQkvKiBhdXRvZ2FpbiAvIGdhaW4gY2x1c3RlciAqLworCQlzdHJ1Y3QgdjRsMl9jdHJsCSphdXRvZ2FpbjsKKwkJc3RydWN0IHY0bDJfY3RybAkqZ2FpbjsKKwkJaW50CQkJZ2Fpbl92YWxpZDsKKwkJdW5zaWduZWQgbG9uZwkJbGFzdF9nYWluX3VwZGF0ZTsgLyogSW4gamlmZmllcyAqLworCQlzMzIJCQlsYXN0X2dhaW47CisJfTsKKwlzdHJ1Y3QgeworCQkvKiBleHBvc3VyZV9hdXRvIC8gZXhwb3N1cmUgY2x1c3RlciAqLworCQlzdHJ1Y3QgdjRsMl9jdHJsCSpleHBvc3VyZV9hdXRvOworCQlzdHJ1Y3QgdjRsMl9jdHJsCSpleHBvc3VyZTsKKwkJaW50CQkJZXhwb3N1cmVfdmFsaWQ7CisJCXVuc2lnbmVkIGxvbmcJCWxhc3RfZXhwb3N1cmVfdXBkYXRlOyAvKiBJbiBqaWZmaWVzICovCisJCXMzMgkJCWxhc3RfZXhwb3N1cmU7CisJfTsKKwlzdHJ1Y3QgdjRsMl9jdHJsCQkqY29sb3JmeDsKKwlzdHJ1Y3QgeworCQkvKiBhdXRvY29udG91ci9jb250b3VyIGNsdXN0ZXIgKi8KKwkJc3RydWN0IHY0bDJfY3RybAkqYXV0b2NvbnRvdXI7CisJCXN0cnVjdCB2NGwyX2N0cmwJKmNvbnRvdXI7CisJfTsKKwlzdHJ1Y3QgdjRsMl9jdHJsCQkqYmFja2xpZ2h0OworCXN0cnVjdCB2NGwyX2N0cmwJCSpmbGlja2VyOworCXN0cnVjdCB2NGwyX2N0cmwJCSpub2lzZV9yZWR1Y3Rpb247CisJc3RydWN0IHY0bDJfY3RybAkJKnNhdmVfdXNlcjsKKwlzdHJ1Y3QgdjRsMl9jdHJsCQkqcmVzdG9yZV91c2VyOworCXN0cnVjdCB2NGwyX2N0cmwJCSpyZXN0b3JlX2ZhY3Rvcnk7CisJc3RydWN0IHsKKwkJLyogbW90b3IgY29udHJvbCBjbHVzdGVyICovCisJCXN0cnVjdCB2NGwyX2N0cmwJKm1vdG9yX3BhbjsKKwkJc3RydWN0IHY0bDJfY3RybAkqbW90b3JfdGlsdDsKKwkJc3RydWN0IHY0bDJfY3RybAkqbW90b3JfcGFuX3Jlc2V0OworCQlzdHJ1Y3QgdjRsMl9jdHJsCSptb3Rvcl90aWx0X3Jlc2V0OworCX07CisJLyogQ09ERUMzIG1vZGVscyBoYXZlIGJvdGggZ2FpbiBhbmQgZXhwb3N1cmUgY29udHJvbGxlZCBieSBhdXRvZ2FpbiAqLworCXN0cnVjdCB2NGwyX2N0cmwJCSphdXRvZ2Fpbl9leHBvX2NsdXN0ZXJbM107CiB9OwogCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KIC8qIEdsb2JhbCB2YXJpYWJsZXMgKi8KICNpZmRlZiBDT05GSUdfVVNCX1BXQ19ERUJVRwogZXh0ZXJuIGludCBwd2NfdHJhY2U7CiAjZW5kaWYKLWV4dGVybiBpbnQgcHdjX21idWZzOwotCi0vKiogZnVuY3Rpb25zIGluIHB3Yy1pZi5jICovCi1pbnQgcHdjX2hhbmRsZV9mcmFtZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldik7Ci12b2lkIHB3Y19uZXh0X2ltYWdlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KTsKLWludCBwd2NfaXNvY19pbml0KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KTsKLXZvaWQgcHdjX2lzb2NfY2xlYW51cChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldik7CiAKIC8qKiBGdW5jdGlvbnMgaW4gcHdjLW1pc2MuYyAqLwogLyogc2l6ZXMgaW4gcGl4ZWxzICovCkBAIC0yOTEsNTAgKzM1NSwyNSBAQAogLyogUmVxdWVzdCBhIGNlcnRhaW4gdmlkZW8gbW9kZS4gUmV0dXJucyA8IDAgaWYgbm90IHBvc3NpYmxlICovCiBleHRlcm4gaW50IHB3Y19zZXRfdmlkZW9fbW9kZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZnJhbWVzLCBpbnQgY29tcHJlc3Npb24sIGludCBzbmFwc2hvdCk7CiBleHRlcm4gdW5zaWduZWQgaW50IHB3Y19nZXRfZnBzKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCB1bnNpZ25lZCBpbnQgaW5kZXgsIHVuc2lnbmVkIGludCBzaXplKTsKLS8qIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHBlciBpbWFnZSAobm90IGZyYW1lKSAqLwogZXh0ZXJuIGludCBwd2NfbXB0X3Jlc2V0KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgZmxhZ3MpOwogZXh0ZXJuIGludCBwd2NfbXB0X3NldF9hbmdsZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHBhbiwgaW50IHRpbHQpOwotCi0vKiBWYXJpb3VzIGNvbnRyb2xzOyBzaG91bGQgYmUgb2J2aW91cy4gVmFsdWUgMC4uNjU1MzUsIG9yIDwgMCBvbiBlcnJvciAqLwotZXh0ZXJuIGludCBwd2NfZ2V0X2JyaWdodG5lc3Moc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpOwotZXh0ZXJuIGludCBwd2Nfc2V0X2JyaWdodG5lc3Moc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCB2YWx1ZSk7Ci1leHRlcm4gaW50IHB3Y19nZXRfY29udHJhc3Qoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpOwotZXh0ZXJuIGludCBwd2Nfc2V0X2NvbnRyYXN0KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgdmFsdWUpOwotZXh0ZXJuIGludCBwd2NfZ2V0X2dhbW1hKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KTsKLWV4dGVybiBpbnQgcHdjX3NldF9nYW1tYShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHZhbHVlKTsKLWV4dGVybiBpbnQgcHdjX2dldF9zYXR1cmF0aW9uKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKTsKLWV4dGVybiBpbnQgcHdjX3NldF9zYXR1cmF0aW9uKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgdmFsdWUpOwogZXh0ZXJuIGludCBwd2Nfc2V0X2xlZHMoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBvbl92YWx1ZSwgaW50IG9mZl92YWx1ZSk7CiBleHRlcm4gaW50IHB3Y19nZXRfY21vc19zZW5zb3Ioc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqc2Vuc29yKTsKLWV4dGVybiBpbnQgcHdjX3Jlc3RvcmVfdXNlcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldik7Ci1leHRlcm4gaW50IHB3Y19zYXZlX3VzZXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpOwotZXh0ZXJuIGludCBwd2NfcmVzdG9yZV9mYWN0b3J5KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2KTsKK2V4dGVybiBpbnQgc2VuZF9jb250cm9sX21zZyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwKKwkJCSAgICB1OCByZXF1ZXN0LCB1MTYgdmFsdWUsIHZvaWQgKmJ1ZiwgaW50IGJ1Zmxlbik7CiAKLS8qIGV4cG9ydGVkIGZvciB1c2UgYnkgdjRsMiBjb250cm9scyAqLwotZXh0ZXJuIGludCBwd2NfZ2V0X3JlZF9nYWluKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKTsKLWV4dGVybiBpbnQgcHdjX3NldF9yZWRfZ2FpbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHZhbHVlKTsKLWV4dGVybiBpbnQgcHdjX2dldF9ibHVlX2dhaW4oc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqdmFsdWUpOwotZXh0ZXJuIGludCBwd2Nfc2V0X2JsdWVfZ2FpbihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHZhbHVlKTsKLWV4dGVybiBpbnQgcHdjX2dldF9hd2Ioc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpOwotZXh0ZXJuIGludCBwd2Nfc2V0X2F3YihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IG1vZGUpOwotZXh0ZXJuIGludCBwd2Nfc2V0X2FnYyhzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IG1vZGUsIGludCB2YWx1ZSk7Ci1leHRlcm4gaW50IHB3Y19nZXRfYWdjKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKTsKLWV4dGVybiBpbnQgcHdjX3NldF9zaHV0dGVyX3NwZWVkKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgbW9kZSwgaW50IHZhbHVlKTsKLWV4dGVybiBpbnQgcHdjX2dldF9zaHV0dGVyX3NwZWVkKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKnZhbHVlKTsKLQotZXh0ZXJuIGludCBwd2Nfc2V0X2NvbG91cl9tb2RlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgY29sb3VyKTsKLWV4dGVybiBpbnQgcHdjX2dldF9jb2xvdXJfbW9kZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50ICpjb2xvdXIpOwotZXh0ZXJuIGludCBwd2Nfc2V0X2NvbnRvdXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCBjb250b3VyKTsKLWV4dGVybiBpbnQgcHdjX2dldF9jb250b3VyKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKmNvbnRvdXIpOwotZXh0ZXJuIGludCBwd2Nfc2V0X2JhY2tsaWdodChzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IGJhY2tsaWdodCk7Ci1leHRlcm4gaW50IHB3Y19nZXRfYmFja2xpZ2h0KHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKmJhY2tsaWdodCk7Ci1leHRlcm4gaW50IHB3Y19zZXRfZmxpY2tlcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IGZsaWNrZXIpOwotZXh0ZXJuIGludCBwd2NfZ2V0X2ZsaWNrZXIoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIGludCAqZmxpY2tlcik7Ci1leHRlcm4gaW50IHB3Y19zZXRfZHluYW1pY19ub2lzZShzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IG5vaXNlKTsKLWV4dGVybiBpbnQgcHdjX2dldF9keW5hbWljX25vaXNlKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgKm5vaXNlKTsKKy8qIENvbnRyb2wgZ2V0IC8gc2V0IGhlbHBlcnMgKi8KK2ludCBwd2NfZ2V0X3U4X2N0cmwoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIHU4IHJlcXVlc3QsIHUxNiB2YWx1ZSwgaW50ICpkYXRhKTsKK2ludCBwd2Nfc2V0X3U4X2N0cmwoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIHU4IHJlcXVlc3QsIHUxNiB2YWx1ZSwgdTggZGF0YSk7CitpbnQgcHdjX2dldF9zOF9jdHJsKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCB1OCByZXF1ZXN0LCB1MTYgdmFsdWUsIGludCAqZGF0YSk7CisjZGVmaW5lIHB3Y19zZXRfczhfY3RybCBwd2Nfc2V0X3U4X2N0cmwKK2ludCBwd2NfZ2V0X3UxNl9jdHJsKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCB1OCByZXF1ZXN0LCB1MTYgdmFsdWUsIGludCAqZGF0KTsKK2ludCBwd2Nfc2V0X3UxNl9jdHJsKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCB1OCByZXF1ZXN0LCB1MTYgdmFsdWUsIHUxNiBkYXRhKTsKK2ludCBwd2NfYnV0dG9uX2N0cmwoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIHUxNiB2YWx1ZSk7CitpbnQgcHdjX2luaXRfY29udHJvbHMoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpOwogCiAvKiBQb3dlciBkb3duIG9yIHVwIHRoZSBjYW1lcmE7IG5vdCBzdXBwb3J0ZWQgYnkgYWxsIG1vZGVscyAqLwotZXh0ZXJuIGludCBwd2NfY2FtZXJhX3Bvd2VyKHN0cnVjdCBwd2NfZGV2aWNlICpwZGV2LCBpbnQgcG93ZXIpOworZXh0ZXJuIHZvaWQgcHdjX2NhbWVyYV9wb3dlcihzdHJ1Y3QgcHdjX2RldmljZSAqcGRldiwgaW50IHBvd2VyKTsKIAogLyogUHJpdmF0ZSBpb2N0bCgpczsgc2VlIHB3Yy1pb2N0bC5oICovCiBleHRlcm4gbG9uZyBwd2NfaW9jdGwoc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgKmFyZyk7CkBAIC0zNDMsMTIgKzM4Miw2IEBACiAKIC8qKiBwd2MtdW5jb21wcmVzcy5jICovCiAvKiBFeHBhbmQgZnJhbWUgdG8gaW1hZ2UsIHBvc3NpYmx5IGluY2x1ZGluZyBkZWNvbXByZXNzaW9uLiBVc2VzIHJlYWRfZnJhbWUgYW5kIGZpbGxfaW1hZ2UgKi8KLWV4dGVybiBpbnQgcHdjX2RlY29tcHJlc3Moc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZgotCitpbnQgcHdjX2RlY29tcHJlc3Moc3RydWN0IHB3Y19kZXZpY2UgKnBkZXYsIHN0cnVjdCBwd2NfZnJhbWVfYnVmICpmYnVmKTsKIAogI2VuZGlmCi0vKiB2aW06IHNldCBjaW5vPSBmb3JtYXRvcHRpb25zPWNyb3FsIGNpbmRlbnQgc2hpZnR3aWR0aD04IHRhYnN0b3A9ODogKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHhhX2NhbWVyYS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9weGFfY2FtZXJhLmMKaW5kZXggYjQyYmZhNS4uZDA3ZGYyMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHhhX2NhbWVyYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vcHhhX2NhbWVyYS5jCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CkBAIC00MCw3ICszOSw3IEBACiAjaW5jbHVkZSA8bWFjaC9kbWEuaD4KICNpbmNsdWRlIDxtYWNoL2NhbWVyYS5oPgogCi0jZGVmaW5lIFBYQV9DQU1fVkVSU0lPTl9DT0RFIEtFUk5FTF9WRVJTSU9OKDAsIDAsIDUpCisjZGVmaW5lIFBYQV9DQU1fVkVSU0lPTiAiMC4wLjYiCiAjZGVmaW5lIFBYQV9DQU1fRFJWX05BTUUgInB4YTI3eC1jYW1lcmEiCiAKIC8qIENhbWVyYSBJbnRlcmZhY2UgKi8KQEAgLTI0Nyw3ICsyNDYsNyBAQAogCWlmIChieXRlc19wZXJfbGluZSA8IDApCiAJCXJldHVybiBieXRlc19wZXJfbGluZTsKIAotCWRldl9kYmcoaWNkLT5kZXYucGFyZW50LCAiY291bnQ9JWQsIHNpemU9JWRcbiIsICpjb3VudCwgKnNpemUpOworCWRldl9kYmcoaWNkLT5wYXJlbnQsICJjb3VudD0lZCwgc2l6ZT0lZFxuIiwgKmNvdW50LCAqc2l6ZSk7CiAKIAkqc2l6ZSA9IGJ5dGVzX3Blcl9saW5lICogaWNkLT51c2VyX2hlaWdodDsKIApAQCAtMjYyLDEzICsyNjEsMTMgQEAKIHN0YXRpYyB2b2lkIGZyZWVfYnVmZmVyKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqdnEsIHN0cnVjdCBweGFfYnVmZmVyICpidWYpCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSB2cS0+cHJpdl9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHZpZGVvYnVmX2RtYWJ1ZiAqZG1hID0gdmlkZW9idWZfdG9fZG1hKCZidWYtPnZiKTsKIAlpbnQgaTsKIAogCUJVR19PTihpbl9pbnRlcnJ1cHQoKSk7CiAKLQlkZXZfZGJnKGljZC0+ZGV2LnBhcmVudCwgIiVzICh2Yj0weCVwKSAweCUwOGx4ICVkXG4iLCBfX2Z1bmNfXywKKwlkZXZfZGJnKGljZC0+cGFyZW50LCAiJXMgKHZiPTB4JXApIDB4JTA4bHggJWRcbiIsIF9fZnVuY19fLAogCQkmYnVmLT52YiwgYnVmLT52Yi5iYWRkciwgYnVmLT52Yi5ic2l6ZSk7CiAKIAkvKgpAQCAtNDI5LDcgKzQyOCw3IEBACiAJCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiLCBlbnVtIHY0bDJfZmllbGQgZmllbGQpCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSB2cS0+cHJpdl9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHB4YV9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBwY2Rldi0+c29jX2hvc3QudjRsMl9kZXYuZGV2OwogCXN0cnVjdCBweGFfYnVmZmVyICpidWYgPSBjb250YWluZXJfb2YodmIsIHN0cnVjdCBweGFfYnVmZmVyLCB2Yik7CkBAIC02MzYsMTEgKzYzNSwxMSBAQAogCQkJICAgICAgIHN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKnZiKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gdnEtPnByaXZfZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBweGFfY2FtZXJhX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAJc3RydWN0IHB4YV9idWZmZXIgKmJ1ZiA9IGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IHB4YV9idWZmZXIsIHZiKTsKIAotCWRldl9kYmcoaWNkLT5kZXYucGFyZW50LCAiJXMgKHZiPTB4JXApIDB4JTA4bHggJWQgYWN0aXZlPSVwXG4iLAorCWRldl9kYmcoaWNkLT5wYXJlbnQsICIlcyAodmI9MHglcCkgMHglMDhseCAlZCBhY3RpdmU9JXBcbiIsCiAJCV9fZnVuY19fLCB2YiwgdmItPmJhZGRyLCB2Yi0+YnNpemUsIHBjZGV2LT5hY3RpdmUpOwogCiAJbGlzdF9hZGRfdGFpbCgmdmItPnF1ZXVlLCAmcGNkZXYtPmNhcHR1cmUpOwpAQCAtNjU4LDcgKzY1Nyw3IEBACiAJc3RydWN0IHB4YV9idWZmZXIgKmJ1ZiA9IGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IHB4YV9idWZmZXIsIHZiKTsKICNpZmRlZiBERUJVRwogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gdnEtPnByaXZfZGF0YTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpY2QtPmRldi5wYXJlbnQ7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5wYXJlbnQ7CiAKIAlkZXZfZGJnKGRldiwgIiVzICh2Yj0weCVwKSAweCUwOGx4ICVkXG4iLCBfX2Z1bmNfXywKIAkJdmIsIHZiLT5iYWRkciwgdmItPmJzaXplKTsKQEAgLTg0Myw3ICs4NDIsNyBAQAogc3RhdGljIHZvaWQgcHhhX2NhbWVyYV9pbml0X3ZpZGVvYnVmKHN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSAqcSwKIAkJCSAgICAgIHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHB4YV9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAogCS8qCkBAIC05NzIsNyArOTcxLDcgQEAKICAqLwogc3RhdGljIGludCBweGFfY2FtZXJhX2FkZF9kZXZpY2Uoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgcHhhX2NhbWVyYV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCiAJaWYgKHBjZGV2LT5pY2QpCkBAIC05ODIsNyArOTgxLDcgQEAKIAogCXBjZGV2LT5pY2QgPSBpY2Q7CiAKLQlkZXZfaW5mbyhpY2QtPmRldi5wYXJlbnQsICJQWEEgQ2FtZXJhIGRyaXZlciBhdHRhY2hlZCB0byBjYW1lcmEgJWRcbiIsCisJZGV2X2luZm8oaWNkLT5wYXJlbnQsICJQWEEgQ2FtZXJhIGRyaXZlciBhdHRhY2hlZCB0byBjYW1lcmEgJWRcbiIsCiAJCSBpY2QtPmRldm51bSk7CiAKIAlyZXR1cm4gMDsKQEAgLTk5MSwxMiArOTkwLDEyIEBACiAvKiBDYWxsZWQgd2l0aCAudmlkZW9fbG9jayBoZWxkICovCiBzdGF0aWMgdm9pZCBweGFfY2FtZXJhX3JlbW92ZV9kZXZpY2Uoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgcHhhX2NhbWVyYV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCiAJQlVHX09OKGljZCAhPSBwY2Rldi0+aWNkKTsKIAotCWRldl9pbmZvKGljZC0+ZGV2LnBhcmVudCwgIlBYQSBDYW1lcmEgZHJpdmVyIGRldGFjaGVkIGZyb20gY2FtZXJhICVkXG4iLAorCWRldl9pbmZvKGljZC0+cGFyZW50LCAiUFhBIENhbWVyYSBkcml2ZXIgZGV0YWNoZWQgZnJvbSBjYW1lcmEgJWRcbiIsCiAJCSBpY2QtPmRldm51bSk7CiAKIAkvKiBkaXNhYmxlIGNhcHR1cmUsIGRpc2FibGUgaW50ZXJydXB0cyAqLwpAQCAtMTA1Nyw3ICsxMDU2LDcgQEAKIHN0YXRpYyB2b2lkIHB4YV9jYW1lcmFfc2V0dXBfY2ljcihzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKIAkJCQkgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIF9fdTMyIHBpeGZtdCkKIHsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBweGFfY2FtZXJhX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7CiAJdW5zaWduZWQgbG9uZyBkdywgYnBwOwpAQCAtMTE1Miw3ICsxMTUxLDcgQEAKIAogc3RhdGljIGludCBweGFfY2FtZXJhX3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsIF9fdTMyIHBpeGZtdCkKIHsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBweGFfY2FtZXJhX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAJdW5zaWduZWQgbG9uZyBidXNfZmxhZ3MsIGNhbWVyYV9mbGFncywgY29tbW9uX2ZsYWdzOwogCWludCByZXQ7CkBAIC0xMjEwLDcgKzEyMDksNyBAQAogc3RhdGljIGludCBweGFfY2FtZXJhX3RyeV9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCiAJCQkJICAgIHVuc2lnbmVkIGNoYXIgYnVzd2lkdGgpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgcHhhX2NhbWVyYV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCXVuc2lnbmVkIGxvbmcgYnVzX2ZsYWdzLCBjYW1lcmFfZmxhZ3M7CiAJaW50IHJldCA9IHRlc3RfcGxhdGZvcm1fcGFyYW0ocGNkZXYsIGJ1c3dpZHRoLCAmYnVzX2ZsYWdzKTsKQEAgLTEyNDcsNyArMTI0Niw3IEBACiAJCQkJICBzdHJ1Y3Qgc29jX2NhbWVyYV9mb3JtYXRfeGxhdGUgKnhsYXRlKQogewogCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGljZC0+ZGV2LnBhcmVudDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpY2QtPnBhcmVudDsKIAlpbnQgZm9ybWF0cyA9IDAsIHJldDsKIAlzdHJ1Y3QgcHhhX2NhbSAqY2FtOwogCWVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBjb2RlOwpAQCAtMTMzNSw5ICsxMzM0LDkgQEAKIAkJCSAgICAgICBzdHJ1Y3QgdjRsMl9jcm9wICphKQogewogCXN0cnVjdCB2NGwyX3JlY3QgKnJlY3QgPSAmYS0+YzsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpY2QtPnBhcmVudDsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoZGV2KTsKIAlzdHJ1Y3QgcHhhX2NhbWVyYV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGljZC0+ZGV2LnBhcmVudDsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9zZW5zZSBzZW5zZSA9IHsKIAkJLm1hc3Rlcl9jbG9jayA9IHBjZGV2LT5tY2xrLApAQCAtMTM3OSw3ICsxMzc4LDcgQEAKIAkJCXJldHVybiByZXQ7CiAKIAkJaWYgKHB4YV9jYW1lcmFfY2hlY2tfZnJhbWUobWYud2lkdGgsIG1mLmhlaWdodCkpIHsKLQkJCWRldl93YXJuKGljZC0+ZGV2LnBhcmVudCwKKwkJCWRldl93YXJuKGljZC0+cGFyZW50LAogCQkJCSAiSW5jb25zaXN0ZW50IHN0YXRlLiBVc2UgU19GTVQgdG8gcmVwYWlyXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CkBAIC0xNDA2LDkgKzE0MDUsOSBAQAogc3RhdGljIGludCBweGFfY2FtZXJhX3NldF9mbXQoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCiAJCQkgICAgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5wYXJlbnQ7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGRldik7CiAJc3RydWN0IHB4YV9jYW1lcmFfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpY2QtPmRldi5wYXJlbnQ7CiAJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7CiAJY29uc3Qgc3RydWN0IHNvY19jYW1lcmFfZm9ybWF0X3hsYXRlICp4bGF0ZSA9IE5VTEw7CiAJc3RydWN0IHNvY19jYW1lcmFfc2Vuc2Ugc2Vuc2UgPSB7CkBAIC0xNDg1LDcgKzE0ODQsNyBAQAogCiAJeGxhdGUgPSBzb2NfY2FtZXJhX3hsYXRlX2J5X2ZvdXJjYyhpY2QsIHBpeGZtdCk7CiAJaWYgKCF4bGF0ZSkgewotCQlkZXZfd2FybihpY2QtPmRldi5wYXJlbnQsICJGb3JtYXQgJXggbm90IGZvdW5kXG4iLCBwaXhmbXQpOworCQlkZXZfd2FybihpY2QtPnBhcmVudCwgIkZvcm1hdCAleCBub3QgZm91bmRcbiIsIHBpeGZtdCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtMTQ5OSwxNiArMTQ5OCwxMSBAQAogCQkJICAgICAgJnBpeC0+aGVpZ2h0LCAzMiwgMjA0OCwgMCwKIAkJCSAgICAgIHBpeGZtdCA9PSBWNEwyX1BJWF9GTVRfWVVWNDIyUCA/IDQgOiAwKTsKIAotCXBpeC0+Ynl0ZXNwZXJsaW5lID0gc29jX21idXNfYnl0ZXNfcGVyX2xpbmUocGl4LT53aWR0aCwKLQkJCQkJCSAgICB4bGF0ZS0+aG9zdF9mbXQpOwotCWlmIChwaXgtPmJ5dGVzcGVybGluZSA8IDApCi0JCXJldHVybiBwaXgtPmJ5dGVzcGVybGluZTsKLQlwaXgtPnNpemVpbWFnZSA9IHBpeC0+aGVpZ2h0ICogcGl4LT5ieXRlc3BlcmxpbmU7Ci0KIAkvKiBsaW1pdCB0byBzZW5zb3IgY2FwYWJpbGl0aWVzICovCiAJbWYud2lkdGgJPSBwaXgtPndpZHRoOwogCW1mLmhlaWdodAk9IHBpeC0+aGVpZ2h0OwotCW1mLmZpZWxkCT0gcGl4LT5maWVsZDsKKwkvKiBPbmx5IHByb2dyZXNzaXZlIHZpZGVvIHN1cHBvcnRlZCBzbyBmYXIgKi8KKwltZi5maWVsZAk9IFY0TDJfRklFTERfTk9ORTsKIAltZi5jb2xvcnNwYWNlCT0gcGl4LT5jb2xvcnNwYWNlOwogCW1mLmNvZGUJCT0geGxhdGUtPmNvZGU7CiAKQEAgLTE1MjcsNyArMTUyMSw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCS8qIFRPRE86IHN1cHBvcnQgaW50ZXJsYWNlZCBhdCBsZWFzdCBpbiBwYXNzLXRocm91Z2ggbW9kZSAqLwotCQlkZXZfZXJyKGljZC0+ZGV2LnBhcmVudCwgIkZpZWxkIHR5cGUgJWQgdW5zdXBwb3J0ZWQuXG4iLAorCQlkZXZfZXJyKGljZC0+cGFyZW50LCAiRmllbGQgdHlwZSAlZCB1bnN1cHBvcnRlZC5cbiIsCiAJCQltZi5maWVsZCk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTE1NzgsMTUgKzE1NzIsMTQgQEAKIHsKIAkvKiBjYXAtPm5hbWUgaXMgc2V0IGJ5IHRoZSBmaXJlbmRseSBjYWxsZXI6LT4gKi8KIAlzdHJsY3B5KGNhcC0+Y2FyZCwgcHhhX2NhbV9kcml2ZXJfZGVzY3JpcHRpb24sIHNpemVvZihjYXAtPmNhcmQpKTsKLQljYXAtPnZlcnNpb24gPSBQWEFfQ0FNX1ZFUlNJT05fQ09ERTsKIAljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfCBWNEwyX0NBUF9TVFJFQU1JTkc7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBweGFfY2FtZXJhX3N1c3BlbmQoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyBpbnQgcHhhX2NhbWVyYV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoZGV2KTsKIAlzdHJ1Y3QgcHhhX2NhbWVyYV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCWludCBpID0gMCwgcmV0ID0gMDsKIApAQCAtMTU5NiwxNSArMTU4OSwxOSBAQAogCXBjZGV2LT5zYXZlX2NpY3JbaSsrXSA9IF9fcmF3X3JlYWRsKHBjZGV2LT5iYXNlICsgQ0lDUjMpOwogCXBjZGV2LT5zYXZlX2NpY3JbaSsrXSA9IF9fcmF3X3JlYWRsKHBjZGV2LT5iYXNlICsgQ0lDUjQpOwogCi0JaWYgKChwY2Rldi0+aWNkKSAmJiAocGNkZXYtPmljZC0+b3BzLT5zdXNwZW5kKSkKLQkJcmV0ID0gcGNkZXYtPmljZC0+b3BzLT5zdXNwZW5kKHBjZGV2LT5pY2QsIHN0YXRlKTsKKwlpZiAocGNkZXYtPmljZCkgeworCQlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gc29jX2NhbWVyYV90b19zdWJkZXYocGNkZXYtPmljZCk7CisJCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIGNvcmUsIHNfcG93ZXIsIDApOworCQlpZiAocmV0ID09IC1FTk9JT0NUTENNRCkKKwkJCXJldCA9IDA7CisJfQogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBweGFfY2FtZXJhX3Jlc3VtZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKK3N0YXRpYyBpbnQgcHhhX2NhbWVyYV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChkZXYpOwogCXN0cnVjdCBweGFfY2FtZXJhX2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAJaW50IGkgPSAwLCByZXQgPSAwOwogCkBAIC0xNjE4LDggKzE2MTUsMTIgQEAKIAlfX3Jhd193cml0ZWwocGNkZXYtPnNhdmVfY2ljcltpKytdLCBwY2Rldi0+YmFzZSArIENJQ1IzKTsKIAlfX3Jhd193cml0ZWwocGNkZXYtPnNhdmVfY2ljcltpKytdLCBwY2Rldi0+YmFzZSArIENJQ1I0KTsKIAotCWlmICgocGNkZXYtPmljZCkgJiYgKHBjZGV2LT5pY2QtPm9wcy0+cmVzdW1lKSkKLQkJcmV0ID0gcGNkZXYtPmljZC0+b3BzLT5yZXN1bWUocGNkZXYtPmljZCk7CisJaWYgKHBjZGV2LT5pY2QpIHsKKwkJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KHBjZGV2LT5pY2QpOworCQlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHNkLCBjb3JlLCBzX3Bvd2VyLCAxKTsKKwkJaWYgKHJldCA9PSAtRU5PSU9DVExDTUQpCisJCQlyZXQgPSAwOworCX0KIAogCS8qIFJlc3RhcnQgZnJhbWUgY2FwdHVyZSBpZiBhY3RpdmUgYnVmZmVyIGV4aXN0cyAqLwogCWlmICghcmV0ICYmIHBjZGV2LT5hY3RpdmUpCkBAIC0xNjMyLDggKzE2MzMsNiBAQAogCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAkuYWRkCQk9IHB4YV9jYW1lcmFfYWRkX2RldmljZSwKIAkucmVtb3ZlCQk9IHB4YV9jYW1lcmFfcmVtb3ZlX2RldmljZSwKLQkuc3VzcGVuZAk9IHB4YV9jYW1lcmFfc3VzcGVuZCwKLQkucmVzdW1lCQk9IHB4YV9jYW1lcmFfcmVzdW1lLAogCS5zZXRfY3JvcAk9IHB4YV9jYW1lcmFfc2V0X2Nyb3AsCiAJLmdldF9mb3JtYXRzCT0gcHhhX2NhbWVyYV9nZXRfZm9ybWF0cywKIAkucHV0X2Zvcm1hdHMJPSBweGFfY2FtZXJhX3B1dF9mb3JtYXRzLApAQCAtMTgxOCw5ICsxODE3LDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgZGV2X3BtX29wcyBweGFfY2FtZXJhX3BtID0geworCS5zdXNwZW5kCT0gcHhhX2NhbWVyYV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gcHhhX2NhbWVyYV9yZXN1bWUsCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBweGFfY2FtZXJhX2RyaXZlciA9IHsKIAkuZHJpdmVyIAk9IHsKIAkJLm5hbWUJPSBQWEFfQ0FNX0RSVl9OQU1FLAorCQkucG0JPSAmcHhhX2NhbWVyYV9wbSwKIAl9LAogCS5wcm9iZQkJPSBweGFfY2FtZXJhX3Byb2JlLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3AocHhhX2NhbWVyYV9yZW1vdmUpLApAQCAtMTg0Myw0ICsxODQ4LDUgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiUFhBMjd4IFNvQyBDYW1lcmEgSG9zdCBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIkd1ZW5uYWRpIExpYWtob3ZldHNraSA8a2VybmVsQHBlbmd1dHJvbml4LmRlPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oUFhBX0NBTV9WRVJTSU9OKTsKIE1PRFVMRV9BTElBUygicGxhdGZvcm06IiBQWEFfQ0FNX0RSVl9OQU1FKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vcmo1NG4xY2IwYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9yajU0bjFjYjBjLmMKaW5kZXggNTdlMTFiNi4uODQ3Y2NjMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9yajU0bjFjYjBjLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9yajU0bjFjYjBjLmMKQEAgLTEzNjQsMTAgKzEzNjQsOSBAQAogCWludCBkYXRhMSwgZGF0YTI7CiAJaW50IHJldDsKIAotCS8qIFRoaXMgY291bGQgYmUgYSBCVUdfT04oKSBvciBhIFdBUk5fT04oKSwgb3IgcmVtb3ZlIGl0IGNvbXBsZXRlbHkgKi8KLQlpZiAoIWljZC0+ZGV2LnBhcmVudCB8fAotCSAgICB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KS0+bnIgIT0gaWNkLT5pZmFjZSkKLQkJcmV0dXJuIC1FTk9ERVY7CisJLyogV2UgbXVzdCBoYXZlIGEgcGFyZW50IGJ5IG5vdy4gQW5kIGl0IGNhbm5vdCBiZSBhIHdyb25nIG9uZS4gKi8KKwlCVUdfT04oIWljZC0+cGFyZW50IHx8CisJICAgICAgIHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCktPm5yICE9IGljZC0+aWZhY2UpOwogCiAJLyogUmVhZCBvdXQgdGhlIGNoaXAgdmVyc2lvbiByZWdpc3RlciAqLwogCWRhdGExID0gcmVnX3JlYWQoY2xpZW50LCBSSjU0TjFfREVWX0NPREUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zMjI1NWRydi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zMjI1NWRydi5jCmluZGV4IDViOWRjZTguLjgwM2M5YzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczIyNTVkcnYuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3MyMjU1ZHJ2LmMKQEAgLTE2LDE1ICsxNiwxMCBAQAogICogRXhhbXBsZSBtYXhpbXVtIGJhbmR3aWR0aCB1dGlsaXphdGlvbjoKICAqCiAgKiAtZnVsbCBzaXplLCBjb2xvciBtb2RlIFlVWVYgb3IgWVVWNDIyUDogMiBjaGFubmVscyBhdCBvbmNlCi0gKgogICogLWZ1bGwgb3IgaGFsZiBzaXplIEdyZXkgc2NhbGU6IGFsbCA0IGNoYW5uZWxzIGF0IG9uY2UKLSAqCiAgKiAtaGFsZiBzaXplLCBjb2xvciBtb2RlIFlVWVYgb3IgWVVWNDIyUDogYWxsIDQgY2hhbm5lbHMgYXQgb25jZQotICoKICAqIC1mdWxsIHNpemUsIGNvbG9yIG1vZGUgWVVZViBvciBZVVY0MjJQIDEvMiBmcmFtZSByYXRlOiBhbGwgNCBjaGFubmVscwogICogIGF0IG9uY2UuCi0gKiAgKFRPRE86IEluY29ycG9yYXRlIHZpZGVvZGV2MiBmcmFtZSByYXRlKEZSKSBlbnVtZXJhdGlvbiwKLSAqICB3aGljaCBpcyBjdXJyZW50bHkgZXhwZXJpbWVudGFsLikKICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTQ3LDcgKzQyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxtZWRpYS92aWRlb2J1Zi12bWFsbG9jLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KQEAgLTU2LDEyICs1MCw3IEBACiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgogCi0jZGVmaW5lIFMyMjU1X01BSk9SX1ZFUlNJT04JMQotI2RlZmluZSBTMjI1NV9NSU5PUl9WRVJTSU9OCTIxCi0jZGVmaW5lIFMyMjU1X1JFTEVBU0UJCTAKLSNkZWZpbmUgUzIyNTVfVkVSU0lPTgkJS0VSTkVMX1ZFUlNJT04oUzIyNTVfTUFKT1JfVkVSU0lPTiwgXAotCQkJCQkgICAgICAgUzIyNTVfTUlOT1JfVkVSU0lPTiwgXAotCQkJCQkgICAgICAgUzIyNTVfUkVMRUFTRSkKKyNkZWZpbmUgUzIyNTVfVkVSU0lPTgkJIjEuMjIuMSIKICNkZWZpbmUgRklSTVdBUkVfRklMRV9OQU1FICJmMjI1NXVzYi5iaW4iCiAKIC8qIGRlZmF1bHQgSlBFRyBxdWFsaXR5ICovCkBAIC0xMjYsNyArMTE1LDcgQEAKICNkZWZpbmUgTUFTS19DT0xPUiAgICAgICAweDAwMDAwMGZmCiAjZGVmaW5lIE1BU0tfSlBHX1FVQUxJVFkgMHgwMDAwZmYwMAogI2RlZmluZSBNQVNLX0lOUFVUX1RZUEUgIDB4MDAwZjAwMDAKLS8qIGZyYW1lIGRlY2ltYXRpb24uIE5vdCBpbXBsZW1lbnRlZCBieSBWNEwgeWV0KGV4cGVyaW1lbnRhbCBpbiBWNEwpICovCisvKiBmcmFtZSBkZWNpbWF0aW9uLiAqLwogI2RlZmluZSBGREVDXzEJCTEJLyogY2FwdHVyZSBldmVyeSBmcmFtZS4gZGVmYXVsdCAqLwogI2RlZmluZSBGREVDXzIJCTIJLyogY2FwdHVyZSBldmVyeSAybmQgZnJhbWUgKi8KICNkZWZpbmUgRkRFQ18zCQkzCS8qIGNhcHR1cmUgZXZlcnkgM3JkIGZyYW1lICovCkBAIC0zMTIsOSArMzAxLDkgQEAKIH07CiAKIC8qIGN1cnJlbnQgY3lwcmVzcyBFRVBST00gZmlybXdhcmUgdmVyc2lvbiAqLwotI2RlZmluZSBTMjI1NV9DVVJfVVNCX0ZXVkVSCSgoMyA8PCA4KSB8IDExKQorI2RlZmluZSBTMjI1NV9DVVJfVVNCX0ZXVkVSCSgoMyA8PCA4KSB8IDEyKQogLyogY3VycmVudCBEU1AgRlcgdmVyc2lvbiAqLwotI2RlZmluZSBTMjI1NV9DVVJfRFNQX0ZXVkVSICAgICAxMDEwMgorI2RlZmluZSBTMjI1NV9DVVJfRFNQX0ZXVkVSICAgICAxMDEwNAogLyogTmVlZCBEU1AgdmVyc2lvbiA1KyBmb3IgdmlkZW8gc3RhdHVzIGZlYXR1cmUgKi8KICNkZWZpbmUgUzIyNTVfTUlOX0RTUF9TVEFUVVMgICAgICA1CiAjZGVmaW5lIFMyMjU1X01JTl9EU1BfQ09MT1JGSUxURVIgOApAQCAtNTAyLDcgKzQ5MSw3IEBACiAKIHN0YXRpYyB2b2lkIHMyMjU1X3Jlc2V0X2RzcHBvd2VyKHN0cnVjdCBzMjI1NV9kZXYgKmRldikKIHsKLQlzMjI1NV92ZW5kb3JfcmVxKGRldiwgMHg0MCwgMHgwYjBiLCAweDBiMDEsIE5VTEwsIDAsIDEpOworCXMyMjU1X3ZlbmRvcl9yZXEoZGV2LCAweDQwLCAweDAwMDAsIDB4MDAwMSwgTlVMTCwgMCwgMSk7CiAJbXNsZWVwKDEwKTsKIAlzMjI1NV92ZW5kb3JfcmVxKGRldiwgMHg1MCwgMHgwMDAwLCAweDAwMDAsIE5VTEwsIDAsIDEpOwogCW1zbGVlcCg2MDApOwpAQCAtODU2LDcgKzg0NSw2IEBACiAJc3RybGNweShjYXAtPmRyaXZlciwgInMyMjU1Iiwgc2l6ZW9mKGNhcC0+ZHJpdmVyKSk7CiAJc3RybGNweShjYXAtPmNhcmQsICJzMjI1NSIsIHNpemVvZihjYXAtPmNhcmQpKTsKIAl1c2JfbWFrZV9wYXRoKGRldi0+dWRldiwgY2FwLT5idXNfaW5mbywgc2l6ZW9mKGNhcC0+YnVzX2luZm8pKTsKLQljYXAtPnZlcnNpb24gPSBTMjI1NV9WRVJTSU9OOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1NUUkVBTUlORzsKIAlyZXR1cm4gMDsKIH0KQEAgLTE5ODQsOSArMTk3Miw4IEBACiAJCQkgIHZpZGVvX2RldmljZV9ub2RlX25hbWUoJmNoYW5uZWwtPnZkZXYpKTsKIAogCX0KLQlwcmludGsoS0VSTl9JTkZPICJTZW5zb3JheSAyMjU1IFY0TCBkcml2ZXIgUmV2aXNpb246ICVkLiVkXG4iLAotCSAgICAgICBTMjI1NV9NQUpPUl9WRVJTSU9OLAotCSAgICAgICBTMjI1NV9NSU5PUl9WRVJTSU9OKTsKKwlwcmludGsoS0VSTl9JTkZPICJTZW5zb3JheSAyMjU1IFY0TCBkcml2ZXIgUmV2aXNpb246ICVzXG4iLAorCSAgICAgICBTMjI1NV9WRVJTSU9OKTsKIAkvKiBpZiBubyBjaGFubmVscyByZWdpc3RlcmVkLCByZXR1cm4gZXJyb3IgYW5kIHByb2JlIHdpbGwgZmFpbCovCiAJaWYgKGF0b21pY19yZWFkKCZkZXYtPm51bV9jaGFubmVscykgPT0gMCkgewogCQl2NGwyX2RldmljZV91bnJlZ2lzdGVyKCZkZXYtPnY0bDJfZGV2KTsKQEAgLTIzMDIsMTUgKzIyODksMTIgQEAKIAkvKiBxdWVyeSB0aGUgZmlybXdhcmUgKi8KIAlmd192ZXIgPSBzMjI1NV9nZXRfZngyZncoZGV2KTsKIAotCXByaW50ayhLRVJOX0lORk8gIjIyNTUgdXNiIGZpcm13YXJlIHZlcnNpb24gJWQuJWRcbiIsCisJcHJpbnRrKEtFUk5fSU5GTyAiczIyNTU6IHVzYiBmaXJtd2FyZSB2ZXJzaW9uICVkLiVkXG4iLAogCSAgICAgICAoZndfdmVyID4+IDgpICYgMHhmZiwKIAkgICAgICAgZndfdmVyICYgMHhmZik7CiAKIAlpZiAoZndfdmVyIDwgUzIyNTVfQ1VSX1VTQl9GV1ZFUikKLQkJZGV2X2VycigmZGV2LT51ZGV2LT5kZXYsCi0JCQkidXNiIGZpcm13YXJlIG5vdCB1cCB0byBkYXRlICVkLiVkXG4iLAotCQkJKGZ3X3ZlciA+PiA4KSAmIDB4ZmYsCi0JCQlmd192ZXIgJiAweGZmKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiczIyNTU6IG5ld2VyIFVTQiBmaXJtd2FyZSBhdmFpbGFibGVcbiIpOwogCiAJZm9yIChqID0gMDsgaiA8IE1BWF9DSEFOTkVMUzsgaisrKSB7CiAJCXN0cnVjdCBzMjI1NV9jaGFubmVsICpjaGFubmVsID0gJmRldi0+Y2hhbm5lbFtqXTsKQEAgLTI3MjEsMyArMjcwNSw0IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIlNlbnNvcmF5IDIyNTUgVmlkZW8gZm9yIExpbnV4IGRyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiRGVhbiBBbmRlcnNvbiAoU2Vuc29yYXkgQ29tcGFueSBJbmMuKSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oUzIyNTVfVkVSU0lPTik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtY2FwdHVyZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLWNhcHR1cmUuYwppbmRleCA4MWI0YTgyLi4wZDczMGU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtY2FwdHVyZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1jYXB0dXJlLmMKQEAgLTExLDcgKzExLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvYnVnLmg+CkBAIC00NTEsNyArNDUwLDYgQEAKIAlzdHJuY3B5KGNhcC0+ZHJpdmVyLCBmaW1jLT5wZGV2LT5uYW1lLCBzaXplb2YoY2FwLT5kcml2ZXIpIC0gMSk7CiAJc3RybmNweShjYXAtPmNhcmQsIGZpbWMtPnBkZXYtPm5hbWUsIHNpemVvZihjYXAtPmNhcmQpIC0gMSk7CiAJY2FwLT5idXNfaW5mb1swXSA9IDA7Ci0JY2FwLT52ZXJzaW9uID0gS0VSTkVMX1ZFUlNJT04oMSwgMCwgMCk7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9TVFJFQU1JTkcgfCBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKIAkJCSAgICBWNEwyX0NBUF9WSURFT19DQVBUVVJFX01QTEFORTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLWNvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1jb3JlLmMKaW5kZXggYmRmMTlhZC4uYWE1NTA2NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLWNvcmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtY29yZS5jCkBAIC0xMiw3ICsxMiw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2J1Zy5oPgpAQCAtNzc0LDcgKzc3Myw2IEBACiAJc3RybmNweShjYXAtPmRyaXZlciwgZmltYy0+cGRldi0+bmFtZSwgc2l6ZW9mKGNhcC0+ZHJpdmVyKSAtIDEpOwogCXN0cm5jcHkoY2FwLT5jYXJkLCBmaW1jLT5wZGV2LT5uYW1lLCBzaXplb2YoY2FwLT5jYXJkKSAtIDEpOwogCWNhcC0+YnVzX2luZm9bMF0gPSAwOwotCWNhcC0+dmVyc2lvbiA9IEtFUk5FTF9WRVJTSU9OKDEsIDAsIDApOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfU1RSRUFNSU5HIHwKIAkJVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1ZJREVPX09VVFBVVCB8CiAJCVY0TDJfQ0FQX1ZJREVPX0NBUFRVUkVfTVBMQU5FIHwgVjRMMl9DQVBfVklERU9fT1VUUFVUX01QTEFORTsKQEAgLTE5MzcsMyArMTkzNSw0IEBACiBNT0RVTEVfQVVUSE9SKCJTeWx3ZXN0ZXIgTmF3cm9ja2kgPHMubmF3cm9ja2lAc2Ftc3VuZy5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlM1UCBGSU1DIGNhbWVyYSBob3N0IGludGVyZmFjZS92aWRlbyBwb3N0cHJvY2Vzc29yIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oIjEuMC4xIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvTWFrZWZpbGUgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA2NjM0MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9NYWtlZmlsZQpAQCAtMCwwICsxLDUgQEAKK29iai0kKENPTkZJR19WSURFT19TQU1TVU5HX1M1UF9NRkMpIDo9IHM1cC1tZmMubworczVwLW1mYy15ICs9IHM1cF9tZmMubyBzNXBfbWZjX2ludHIubyBzNXBfbWZjX29wci5vCitzNXAtbWZjLXkgKz0gczVwX21mY19kZWMubyBzNXBfbWZjX2VuYy5vCitzNXAtbWZjLXkgKz0gczVwX21mY19jdHJsLm8gczVwX21mY19jbWQubworczVwLW1mYy15ICs9IHM1cF9tZmNfcG0ubyBzNXBfbWZjX3NobS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvcmVncy1tZmMuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9yZWdzLW1mYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1M2E4YTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvcmVncy1tZmMuaApAQCAtMCwwICsxLDQxMyBAQAorLyoKKyAqIFJlZ2lzdGVyIGRlZmluaXRpb24gZmlsZSBmb3IgU2Ftc3VuZyBNRkMgVjUuMSBJbnRlcmZhY2UgKEZJTVYpIGRyaXZlcgorICoKKyAqIEthbWlsIERlYnNraSwgQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqIGh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpZm5kZWYgX1JFR1NfRklNVl9ICisjZGVmaW5lIF9SRUdTX0ZJTVZfSAorCisjZGVmaW5lIFM1UF9GSU1WX1JFR19TSVpFCShTNVBfRklNVl9FTkRfQUREUiAtIFM1UF9GSU1WX1NUQVJUX0FERFIpCisjZGVmaW5lIFM1UF9GSU1WX1JFR19DT1VOVAkoKFM1UF9GSU1WX0VORF9BRERSIC0gUzVQX0ZJTVZfU1RBUlRfQUREUikgLyA0KQorCisvKiBOdW1iZXIgb2YgYml0cyB0aGF0IHRoZSBidWZmZXIgYWRkcmVzcyBzaG91bGQgYmUgc2hpZnRlZCBmb3IgcGFydGljdWxhcgorICogTUZDIGJ1ZmZlcnMuICAqLworI2RlZmluZSBTNVBfRklNVl9TVEFSVF9BRERSCQkweDAwMDAKKyNkZWZpbmUgUzVQX0ZJTVZfRU5EX0FERFIJCTB4ZTAwOAorCisjZGVmaW5lIFM1UF9GSU1WX1NXX1JFU0VUCQkweDAwMDAKKyNkZWZpbmUgUzVQX0ZJTVZfUklTQ19IT1NUX0lOVAkJMHgwMDA4CisKKy8qIENvbW1hbmQgZnJvbSBIT1NUIHRvIFJJU0MgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfSE9TVDJSSVNDX0NNRAkJMHgwMDMwCisjZGVmaW5lIFM1UF9GSU1WX0hPU1QyUklTQ19BUkcxCQkweDAwMzQKKyNkZWZpbmUgUzVQX0ZJTVZfSE9TVDJSSVNDX0FSRzIJCTB4MDAzOAorI2RlZmluZSBTNVBfRklNVl9IT1NUMlJJU0NfQVJHMwkJMHgwMDNjCisjZGVmaW5lIFM1UF9GSU1WX0hPU1QyUklTQ19BUkc0CQkweDAwNDAKKworLyogQ29tbWFuZCBmcm9tIFJJU0MgdG8gSE9TVCAqLworI2RlZmluZSBTNVBfRklNVl9SSVNDMkhPU1RfQ01ECQkweDAwNDQKKyNkZWZpbmUgUzVQX0ZJTVZfUklTQzJIT1NUX0NNRF9NQVNLCTB4MUZGRkYKKyNkZWZpbmUgUzVQX0ZJTVZfUklTQzJIT1NUX0FSRzEJCTB4MDA0OAorI2RlZmluZSBTNVBfRklNVl9SSVNDMkhPU1RfQVJHMgkJMHgwMDRjCisjZGVmaW5lIFM1UF9GSU1WX1JJU0MySE9TVF9BUkczCQkweDAwNTAKKyNkZWZpbmUgUzVQX0ZJTVZfUklTQzJIT1NUX0FSRzQJCTB4MDA1NAorCisjZGVmaW5lIFM1UF9GSU1WX0ZXX1ZFUlNJT04JCTB4MDA1OAorI2RlZmluZSBTNVBfRklNVl9TWVNfTUVNX1NaCQkweDAwNWMKKyNkZWZpbmUgUzVQX0ZJTVZfRldfU1RBVFVTCQkweDAwODAKKworLyogTWVtb3J5IGNvbnRyb2xsZXIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfTUNfRFJBTUJBU0VfQURSX0EJMHgwNTA4CisjZGVmaW5lIFM1UF9GSU1WX01DX0RSQU1CQVNFX0FEUl9CCTB4MDUwYworI2RlZmluZSBTNVBfRklNVl9NQ19TVEFUVVMJCTB4MDUxMAorCisvKiBDb21tb24gcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfQ09NTU9OX0JBU0VfQQkJMHgwNjAwCisjZGVmaW5lIFM1UF9GSU1WX0NPTU1PTl9CQVNFX0IJCTB4MDcwMAorCisvKiBEZWNvZGVyICovCisjZGVmaW5lIFM1UF9GSU1WX0RFQ19DSFJPTUFfQURSCQkoUzVQX0ZJTVZfQ09NTU9OX0JBU0VfQSkKKyNkZWZpbmUgUzVQX0ZJTVZfREVDX0xVTUFfQURSCQkoUzVQX0ZJTVZfQ09NTU9OX0JBU0VfQikKKworLyogSC4yNjQgZGVjb2RpbmcgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfSDI2NF9WRVJUX05CX01WX0FEUgkoUzVQX0ZJTVZfQ09NTU9OX0JBU0VfQSArIDB4OGMpCisJCQkJCS8qIHZlcnRpY2FsIG5laWdoYm9yIG1vdGlvbiB2ZWN0b3IgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfSDI2NF9OQl9JUF9BRFIJCShTNVBfRklNVl9DT01NT05fQkFTRV9BICsgMHg5MCkKKwkJCQkJLyogbmVpZ2hib3IgcGl4ZWxzIGZvciBpbnRyYSBwcmVkICovCisjZGVmaW5lIFM1UF9GSU1WX0gyNjRfTVZfQURSCQkoUzVQX0ZJTVZfQ09NTU9OX0JBU0VfQiArIDB4ODApCisJCQkJCS8qIEgyNjQgbW90aW9uIHZlY3RvciAqLworCisvKiBNUEVHNCBkZWNvZGluZyAqLworI2RlZmluZSBTNVBfRklNVl9NUEVHNF9OQl9EQ0FDX0FEUgkoUzVQX0ZJTVZfQ09NTU9OX0JBU0VfQSArIDB4OGMpCisJCQkJCS8qIG5laWdoYm9yIEFDL0RDIGNvZWZmLiAqLworI2RlZmluZSBTNVBfRklNVl9NUEVHNF9VUF9OQl9NVl9BRFIJKFM1UF9GSU1WX0NPTU1PTl9CQVNFX0EgKyAweDkwKQorCQkJCQkvKiB1cHBlciBuZWlnaGJvciBtb3Rpb24gdmVjdG9yICovCisjZGVmaW5lIFM1UF9GSU1WX01QRUc0X1NBX01WX0FEUgkoUzVQX0ZJTVZfQ09NTU9OX0JBU0VfQSArIDB4OTQpCisJCQkJCS8qIHN1YnNlcS4gYW5jaG9yIG1vdGlvbiB2ZWN0b3IgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfTVBFRzRfT1RfTElORV9BRFIJKFM1UF9GSU1WX0NPTU1PTl9CQVNFX0EgKyAweDk4KQorCQkJCQkvKiBvdmVybGFwIHRyYW5zZm9ybSBsaW5lICovCisjZGVmaW5lIFM1UF9GSU1WX01QRUc0X1NQX0FEUgkJKFM1UF9GSU1WX0NPTU1PTl9CQVNFX0EgKyAweGE4KQorCQkJCQkvKiBzeW50YXggcGFyc2VyICovCisKKy8qIEguMjYzIGRlY29kaW5nICovCisjZGVmaW5lIFM1UF9GSU1WX0gyNjNfTkJfRENBQ19BRFIJKFM1UF9GSU1WX0NPTU1PTl9CQVNFX0EgKyAweDhjKQorI2RlZmluZSBTNVBfRklNVl9IMjYzX1VQX05CX01WX0FEUgkoUzVQX0ZJTVZfQ09NTU9OX0JBU0VfQSArIDB4OTApCisjZGVmaW5lIFM1UF9GSU1WX0gyNjNfU0FfTVZfQURSCQkoUzVQX0ZJTVZfQ09NTU9OX0JBU0VfQSArIDB4OTQpCisjZGVmaW5lIFM1UF9GSU1WX0gyNjNfT1RfTElORV9BRFIJKFM1UF9GSU1WX0NPTU1PTl9CQVNFX0EgKyAweDk4KQorCisvKiBWQy0xIGRlY29kaW5nICovCisjZGVmaW5lIFM1UF9GSU1WX1ZDMV9OQl9EQ0FDX0FEUgkoUzVQX0ZJTVZfQ09NTU9OX0JBU0VfQSArIDB4OGMpCisjZGVmaW5lIFM1UF9GSU1WX1ZDMV9VUF9OQl9NVl9BRFIJKFM1UF9GSU1WX0NPTU1PTl9CQVNFX0EgKyAweDkwKQorI2RlZmluZSBTNVBfRklNVl9WQzFfU0FfTVZfQURSCQkoUzVQX0ZJTVZfQ09NTU9OX0JBU0VfQSArIDB4OTQpCisjZGVmaW5lIFM1UF9GSU1WX1ZDMV9PVF9MSU5FX0FEUgkoUzVQX0ZJTVZfQ09NTU9OX0JBU0VfQSArIDB4OTgpCisjZGVmaW5lIFM1UF9GSU1WX1ZDMV9CSVRQTEFORTNfQURSCShTNVBfRklNVl9DT01NT05fQkFTRV9BICsgMHg5YykKKwkJCQkJLyogYml0cGxhbmUzICovCisjZGVmaW5lIFM1UF9GSU1WX1ZDMV9CSVRQTEFORTJfQURSCShTNVBfRklNVl9DT01NT05fQkFTRV9BICsgMHhhMCkKKwkJCQkJLyogYml0cGxhbmUyICovCisjZGVmaW5lIFM1UF9GSU1WX1ZDMV9CSVRQTEFORTFfQURSCShTNVBfRklNVl9DT01NT05fQkFTRV9BICsgMHhhNCkKKwkJCQkJLyogYml0cGxhbmUxICovCisKKy8qIEVuY29kZXIgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1JFRjBfTFVNQV9BRFIJKFM1UF9GSU1WX0NPTU1PTl9CQVNFX0EgKyAweDFjKQorI2RlZmluZSBTNVBfRklNVl9FTkNfUkVGMV9MVU1BX0FEUgkoUzVQX0ZJTVZfQ09NTU9OX0JBU0VfQSArIDB4MjApCisJCQkJCS8qIHJlY29uc3RydWN0ZWQgbHVtYSAqLworI2RlZmluZSBTNVBfRklNVl9FTkNfUkVGMF9DSFJPTUFfQURSCShTNVBfRklNVl9DT01NT05fQkFTRV9CKQorI2RlZmluZSBTNVBfRklNVl9FTkNfUkVGMV9DSFJPTUFfQURSCShTNVBfRklNVl9DT01NT05fQkFTRV9CICsgMHgwNCkKKwkJCQkJLyogcmVjb25zdHJ1Y3RlZCBjaHJvbWEgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1JFRjJfTFVNQV9BRFIJKFM1UF9GSU1WX0NPTU1PTl9CQVNFX0IgKyAweDEwKQorI2RlZmluZSBTNVBfRklNVl9FTkNfUkVGMl9DSFJPTUFfQURSCShTNVBfRklNVl9DT01NT05fQkFTRV9CICsgMHgwOCkKKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1JFRjNfTFVNQV9BRFIJKFM1UF9GSU1WX0NPTU1PTl9CQVNFX0IgKyAweDE0KQorI2RlZmluZSBTNVBfRklNVl9FTkNfUkVGM19DSFJPTUFfQURSCShTNVBfRklNVl9DT01NT05fQkFTRV9CICsgMHgwYykKKworLyogSC4yNjQgZW5jb2RpbmcgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfSDI2NF9VUF9NVl9BRFIJCShTNVBfRklNVl9DT01NT05fQkFTRV9BKQorCQkJCQkvKiB1cHBlciBtb3Rpb24gdmVjdG9yICovCisjZGVmaW5lIFM1UF9GSU1WX0gyNjRfTkJPUl9JTkZPX0FEUgkoUzVQX0ZJTVZfQ09NTU9OX0JBU0VfQSArIDB4MDQpCisJCQkJCS8qIGVudHJvcHkgZW5naW5lJ3MgbmVpZ2hib3IgaW5mby4gKi8KKyNkZWZpbmUgUzVQX0ZJTVZfSDI2NF9VUF9JTlRSQV9NRF9BRFIJKFM1UF9GSU1WX0NPTU1PTl9CQVNFX0EgKyAweDA4KQorCQkJCQkvKiB1cHBlciBpbnRyYSBNRCAqLworI2RlZmluZSBTNVBfRklNVl9IMjY0X0NPWkVST19GTEFHX0FEUgkoUzVQX0ZJTVZfQ09NTU9OX0JBU0VfQSArIDB4MTApCisJCQkJCS8qIGRpcmVjdCBjb3plcm8gZmxhZyAqLworI2RlZmluZSBTNVBfRklNVl9IMjY0X1VQX0lOVFJBX1BSRURfQURSCShTNVBfRklNVl9DT01NT05fQkFTRV9CICsgMHg0MCkKKwkJCQkJLyogdXBwZXIgaW50cmEgUFJFRCAqLworCisvKiBILjI2MyBlbmNvZGluZyAqLworI2RlZmluZSBTNVBfRklNVl9IMjYzX1VQX01WX0FEUgkJKFM1UF9GSU1WX0NPTU1PTl9CQVNFX0EpCisJCQkJCS8qIHVwcGVyIG1vdGlvbiB2ZWN0b3IgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfSDI2M19BQ0RDX0NPRUZfQURSCShTNVBfRklNVl9DT01NT05fQkFTRV9BICsgMHgwNCkKKwkJCQkJLyogdXBwZXIgUSBjb2VmZi4gKi8KKworLyogTVBFRzQgZW5jb2RpbmcgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfTVBFRzRfVVBfTVZfQURSCShTNVBfRklNVl9DT01NT05fQkFTRV9BKQorCQkJCQkvKiB1cHBlciBtb3Rpb24gdmVjdG9yICovCisjZGVmaW5lIFM1UF9GSU1WX01QRUc0X0FDRENfQ09FRl9BRFIJKFM1UF9GSU1WX0NPTU1PTl9CQVNFX0EgKyAweDA0KQorCQkJCQkvKiB1cHBlciBRIGNvZWZmLiAqLworI2RlZmluZSBTNVBfRklNVl9NUEVHNF9DT1pFUk9fRkxBR19BRFIJKFM1UF9GSU1WX0NPTU1PTl9CQVNFX0EgKyAweDEwKQorCQkJCQkvKiBkaXJlY3QgY296ZXJvIGZsYWcgKi8KKworI2RlZmluZSBTNVBfRklNVl9FTkNfUkVGX0JfTFVNQV9BRFIgICAgIDB4MDYyYyAvKiByZWYgQiBMdW1hIGFkZHIgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1JFRl9CX0NIUk9NQV9BRFIgICAweDA2MzAgLyogcmVmIEIgQ2hyb21hIGFkZHIgKi8KKworI2RlZmluZSBTNVBfRklNVl9FTkNfQ1VSX0xVTUFfQURSCTB4MDcxOCAvKiBjdXJyZW50IEx1bWEgYWRkciAqLworI2RlZmluZSBTNVBfRklNVl9FTkNfQ1VSX0NIUk9NQV9BRFIJMHgwNzFDIC8qIGN1cnJlbnQgQ2hyb21hIGFkZHIgKi8KKworLyogQ29kZWMgY29tbW9uIHJlZ2lzdGVyICovCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19IU0laRV9QWAkJMHgwODE4IC8qIGZyYW1lIHdpZHRoIGF0IGVuY29kZXIgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1ZTSVpFX1BYCQkweDA4MWMgLyogZnJhbWUgaGVpZ2h0IGF0IGVuY29kZXIgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1BST0ZJTEUJCTB4MDgzMCAvKiBwcm9maWxlIHJlZ2lzdGVyICovCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19QUk9GSUxFX0gyNjRfTUFJTgkJCTAKKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1BST0ZJTEVfSDI2NF9ISUdICQkJMQorI2RlZmluZSBTNVBfRklNVl9FTkNfUFJPRklMRV9IMjY0X0JBU0VMSU5FCQkyCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19QUk9GSUxFX01QRUc0X1NJTVBMRQkJMAorI2RlZmluZSBTNVBfRklNVl9FTkNfUFJPRklMRV9NUEVHNF9BRFZBTkNFRF9TSU1QTEUJMQorI2RlZmluZSBTNVBfRklNVl9FTkNfUElDX1NUUlVDVAkJMHgwODNjIC8qIHBpY3R1cmUgZmllbGQvZnJhbWUgZmxhZyAqLworI2RlZmluZSBTNVBfRklNVl9FTkNfTEZfQ1RSTAkJMHgwODQ4IC8qIGxvb3AgZmlsdGVyIGNvbnRyb2wgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX0FMUEhBX09GRgkJMHgwODRjIC8qIGxvb3AgZmlsdGVyIGFscGhhIG9mZnNldCAqLworI2RlZmluZSBTNVBfRklNVl9FTkNfQkVUQV9PRkYJCTB4MDg1MCAvKiBsb29wIGZpbHRlciBiZXRhIG9mZnNldCAqLworI2RlZmluZSBTNVBfRklNVl9NUl9CVVNJRl9DVFJMCQkweDA4NTQgLyogaGlkZGVuLCBidXMgaW50ZXJmYWNlIGN0cmwgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1BYTF9DQUNIRV9DVFJMCTB4MGEwMCAvKiBwaXhlbCBjYWNoZSBjb250cm9sICovCisKKy8qIENoYW5uZWwgJiBzdHJlYW0gaW50ZXJmYWNlIHJlZ2lzdGVyICovCisjZGVmaW5lIFM1UF9GSU1WX1NJX1JUTl9DSElECQkweDIwMDAgLyogUmV0dXJuIENIIGluc3QgSUQgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfU0lfQ0gwX0lOU1RfSUQJCTB4MjA0MCAvKiBjb2RlYyBpbnN0YW5jZSBJRCAqLworI2RlZmluZSBTNVBfRklNVl9TSV9DSDFfSU5TVF9JRAkJMHgyMDgwIC8qIGNvZGVjIGluc3RhbmNlIElEICovCisvKiBEZWNvZGVyICovCisjZGVmaW5lIFM1UF9GSU1WX1NJX1ZSRVNPTAkJMHgyMDA0IC8qIHZlcnRpY2FsIHJlcyBvZiBkZWNvZGVyICovCisjZGVmaW5lIFM1UF9GSU1WX1NJX0hSRVNPTAkJMHgyMDA4IC8qIGhvcml6b250YWwgcmVzIG9mIGRlY29kZXIgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfU0lfQlVGX05VTUJFUgkJMHgyMDBjIC8qIG51bWJlciBvZiBmcmFtZXMgaW4gdGhlCisJCQkJCQkJCWRlY29kZWQgcGljICovCisjZGVmaW5lIFM1UF9GSU1WX1NJX0RJU1BMQVlfWV9BRFIJMHgyMDEwIC8qIGx1bWEgYWRkciBvZiBkaXNwbGF5ZWQgcGljICovCisjZGVmaW5lIFM1UF9GSU1WX1NJX0RJU1BMQVlfQ19BRFIJMHgyMDE0IC8qIGNocm9tYSBhZGRyb2YgZGlzcGxheWVkIHBpYyAqLworI2RlZmluZSBTNVBfRklNVl9TSV9DT05TVU1FRF9CWVRFUwkweDIwMTggLyogQ29uc3VtZWQgbnVtYmVyIG9mIGJ5dGVzIHRvCisJCQkJCQkJZGVjb2RlIGEgZnJhbWUgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfU0lfRElTUExBWV9TVEFUVVMJMHgyMDFjIC8qIHN0YXR1cyBvZiBkZWNvZGVkIHBpY3R1cmUgKi8KKworI2RlZmluZSBTNVBfRklNVl9TSV9DSDBfU0JfU1RfQURSCTB4MjA0NCAvKiBzdGFydCBhZGRyIG9mIHN0cmVhbSBidWYgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfU0lfQ0gwX1NCX0ZSTV9TSVpFCTB4MjA0OCAvKiBzaXplIG9mIHN0cmVhbSBidWYgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfU0lfQ0gwX0RFU0NfQURSCTB4MjA0YyAvKiBhZGRyIG9mIGRlc2NyaXB0b3IgYnVmICovCisjZGVmaW5lIFM1UF9GSU1WX1NJX0NIMF9DUEJfU0laRQkweDIwNTggLyogbWF4IHNpemUgb2YgY29kZWQgcGljLiBidWYgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfU0lfQ0gwX0RFU0NfU0laRQkweDIwNWMgLyogbWF4IHNpemUgb2YgZGVzY3JpcHRvciBidWYgKi8KKworI2RlZmluZSBTNVBfRklNVl9TSV9DSDFfU0JfU1RfQURSCTB4MjA4NCAvKiBzdGFydCBhZGRyIG9mIHN0cmVhbSBidWYgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfU0lfQ0gxX1NCX0ZSTV9TSVpFCTB4MjA4OCAvKiBzaXplIG9mIHN0cmVhbSBidWYgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfU0lfQ0gxX0RFU0NfQURSCTB4MjA4YyAvKiBhZGRyIG9mIGRlc2NyaXB0b3IgYnVmICovCisjZGVmaW5lIFM1UF9GSU1WX1NJX0NIMV9DUEJfU0laRQkweDIwOTggLyogbWF4IHNpemUgb2YgY29kZWQgcGljLiBidWYgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfU0lfQ0gxX0RFU0NfU0laRQkweDIwOWMgLyogbWF4IHNpemUgb2YgZGVzY3JpcHRvciBidWYgKi8KKworI2RlZmluZSBTNVBfRklNVl9DUkNfTFVNQTAJCTB4MjAzMCAvKiBsdW1hIGNyYyBkYXRhIHBlciBmcmFtZQorCQkJCQkJCQkodG9wIGZpZWxkKSAqLworI2RlZmluZSBTNVBfRklNVl9DUkNfQ0hST01BMAkJMHgyMDM0IC8qIGNocm9tYSBjcmMgZGF0YSBwZXIgZnJhbWUKKwkJCQkJCQkJKHRvcCBmaWVsZCkgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfQ1JDX0xVTUExCQkweDIwMzggLyogbHVtYSBjcmMgZGF0YSBwZXIgYm90dG9tCisJCQkJCQkJCWZpZWxkICovCisjZGVmaW5lIFM1UF9GSU1WX0NSQ19DSFJPTUExCQkweDIwM2MgLyogY2hyb21hIGNyYyBkYXRhIHBlciBib3R0b20KKwkJCQkJCQkJZmllbGQgKi8KKworLyogRGlzcGxheSBzdGF0dXMgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfREVDX1NUQVRVU19ERUNPRElOR19PTkxZCQkwCisjZGVmaW5lIFM1UF9GSU1WX0RFQ19TVEFUVVNfREVDT0RJTkdfRElTUExBWQkJMQorI2RlZmluZSBTNVBfRklNVl9ERUNfU1RBVFVTX0RJU1BMQVlfT05MWQkJMgorI2RlZmluZSBTNVBfRklNVl9ERUNfU1RBVFVTX0RFQ09ESU5HX0VNUFRZCQkzCisjZGVmaW5lIFM1UF9GSU1WX0RFQ19TVEFUVVNfREVDT0RJTkdfU1RBVFVTX01BU0sJNworI2RlZmluZSBTNVBfRklNVl9ERUNfU1RBVFVTX1BST0dSRVNTSVZFCQkJKDA8PDMpCisjZGVmaW5lIFM1UF9GSU1WX0RFQ19TVEFUVVNfSU5URVJMQUNFCQkJKDE8PDMpCisjZGVmaW5lIFM1UF9GSU1WX0RFQ19TVEFUVVNfSU5URVJMQUNFX01BU0sJCSgxPDwzKQorI2RlZmluZSBTNVBfRklNVl9ERUNfU1RBVFVTX0NSQ19OVU1CRVJfVFdPCQkoMDw8NCkKKyNkZWZpbmUgUzVQX0ZJTVZfREVDX1NUQVRVU19DUkNfTlVNQkVSX0ZPVVIJCSgxPDw0KQorI2RlZmluZSBTNVBfRklNVl9ERUNfU1RBVFVTX0NSQ19OVU1CRVJfTUFTSwkJKDE8PDQpCisjZGVmaW5lIFM1UF9GSU1WX0RFQ19TVEFUVVNfQ1JDX0dFTkVSQVRFRAkJKDE8PDUpCisjZGVmaW5lIFM1UF9GSU1WX0RFQ19TVEFUVVNfQ1JDX05PVF9HRU5FUkFURUQJCSgwPDw1KQorI2RlZmluZSBTNVBfRklNVl9ERUNfU1RBVFVTX0NSQ19NQVNLCQkJKDE8PDUpCisKKyNkZWZpbmUgUzVQX0ZJTVZfREVDX1NUQVRVU19SRVNPTFVUSU9OX01BU0sJCSgzPDw0KQorI2RlZmluZSBTNVBfRklNVl9ERUNfU1RBVFVTX1JFU09MVVRJT05fSU5DCQkoMTw8NCkKKyNkZWZpbmUgUzVQX0ZJTVZfREVDX1NUQVRVU19SRVNPTFVUSU9OX0RFQwkJKDI8PDQpCisKKy8qIERlY29kZSBmcmFtZSBhZGRyZXNzICovCisjZGVmaW5lIFM1UF9GSU1WX0RFQ09ERV9ZX0FEUgkJCTB4MjAyNAorI2RlZmluZSBTNVBfRklNVl9ERUNPREVfQ19BRFIJCQkweDIwMjgKKworLyogRGVjb2RlZCBmcmFtZSB0cGUgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfREVDT0RFX0ZSQU1FX1RZUEUJCTB4MjAyMAorI2RlZmluZSBTNVBfRklNVl9ERUNPREVfRlJBTUVfTUFTSwkJNworCisjZGVmaW5lIFM1UF9GSU1WX0RFQ09ERV9GUkFNRV9TS0lQUEVECQkwCisjZGVmaW5lIFM1UF9GSU1WX0RFQ09ERV9GUkFNRV9JX0ZSQU1FCQkxCisjZGVmaW5lIFM1UF9GSU1WX0RFQ09ERV9GUkFNRV9QX0ZSQU1FCQkyCisjZGVmaW5lIFM1UF9GSU1WX0RFQ09ERV9GUkFNRV9CX0ZSQU1FCQkzCisjZGVmaW5lIFM1UF9GSU1WX0RFQ09ERV9GUkFNRV9PVEhFUl9GUkFNRQk0CisKKy8qIFNpemVzIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGRlY29kaW5nICovCisjZGVmaW5lIFM1UF9GSU1WX0RFQ19OQl9JUF9TSVpFCQkJKDMyICogMTAyNCkKKyNkZWZpbmUgUzVQX0ZJTVZfREVDX1ZFUlRfTkJfTVZfU0laRQkJKDE2ICogMTAyNCkKKyNkZWZpbmUgUzVQX0ZJTVZfREVDX05CX0RDQUNfU0laRQkJKDE2ICogMTAyNCkKKyNkZWZpbmUgUzVQX0ZJTVZfREVDX1VQTkJfTVZfU0laRQkJKDY4ICogMTAyNCkKKyNkZWZpbmUgUzVQX0ZJTVZfREVDX1NVQl9BTkNIT1JfTVZfU0laRQkJKDEzNiAqIDEwMjQpCisjZGVmaW5lIFM1UF9GSU1WX0RFQ19PVkVSTEFQX1RSQU5TRk9STV9TSVpFICAgICAoMzIgKiAxMDI0KQorI2RlZmluZSBTNVBfRklNVl9ERUNfVkMxX0JJVFBMQU5FX1NJWkUJCSgyICogMTAyNCkKKyNkZWZpbmUgUzVQX0ZJTVZfREVDX1NUWF9QQVJTRVJfU0laRQkJKDY4ICogMTAyNCkKKworI2RlZmluZSBTNVBfRklNVl9ERUNfQlVGX0FMSUdOCQkJKDggKiAxMDI0KQorI2RlZmluZSBTNVBfRklNVl9FTkNfQlVGX0FMSUdOCQkJKDggKiAxMDI0KQorI2RlZmluZSBTNVBfRklNVl9OVjEyTV9IQUxJR04JCQkxNgorI2RlZmluZSBTNVBfRklNVl9OVjEyTV9MVkFMSUdOCQkJMTYKKyNkZWZpbmUgUzVQX0ZJTVZfTlYxMk1fQ1ZBTElHTgkJCTgKKyNkZWZpbmUgUzVQX0ZJTVZfTlYxMk1UX0hBTElHTgkJCTEyOAorI2RlZmluZSBTNVBfRklNVl9OVjEyTVRfVkFMSUdOCQkJMzIKKyNkZWZpbmUgUzVQX0ZJTVZfTlYxMk1fU0FMSUdOCQkJMjA0OAorI2RlZmluZSBTNVBfRklNVl9OVjEyTVRfU0FMSUdOCQkJODE5MgorCisvKiBTaXplcyBvZiBidWZmZXJzIHJlcXVpcmVkIGZvciBlbmNvZGluZyAqLworI2RlZmluZSBTNVBfRklNVl9FTkNfVVBNVl9TSVpFCQkweDEwMDAwCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19DT0xGTEdfU0laRQkweDEwMDAwCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19JTlRSQU1EX1NJWkUJMHgxMDAwMAorI2RlZmluZSBTNVBfRklNVl9FTkNfSU5UUkFQUkVEX1NJWkUJMHg0MDAwCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19OQk9SSU5GT19TSVpFCTB4MTAwMDAKKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX0FDRENDT0VGX1NJWkUJMHgxMDAwMAorCisvKiBFbmNvZGVyICovCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19TSV9TVFJNX1NJWkUJMHgyMDA0IC8qIHN0cmVhbSBzaXplICovCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19TSV9QSUNfQ05UCQkweDIwMDggLyogcGljdHVyZSBjb3VudCAqLworI2RlZmluZSBTNVBfRklNVl9FTkNfU0lfV1JJVEVfUFRSCTB4MjAwYyAvKiB3cml0ZSBwb2ludGVyICovCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19TSV9TTElDRV9UWVBFCTB4MjAxMCAvKiBzbGljZSB0eXBlKEkvUC9CL0lEUikgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1NJX1NMSUNFX1RZUEVfTk9OX0NPREVECTAKKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1NJX1NMSUNFX1RZUEVfSQkJMQorI2RlZmluZSBTNVBfRklNVl9FTkNfU0lfU0xJQ0VfVFlQRV9QCQkyCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19TSV9TTElDRV9UWVBFX0IJCTMKKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1NJX1NMSUNFX1RZUEVfU0tJUFBFRAk0CisjZGVmaW5lIFM1UF9GSU1WX0VOQ19TSV9TTElDRV9UWVBFX09USEVSUwk1CisjZGVmaW5lIFM1UF9GSU1WX0VOQ09ERURfWV9BRERSICAgICAgICAgMHgyMDE0IC8qIHRoZSBhZGRyIG9mIHRoZSBlbmNvZGVkCisJCQkJCQkJCWx1bWEgcGljICovCisjZGVmaW5lIFM1UF9GSU1WX0VOQ09ERURfQ19BRERSICAgICAgICAgMHgyMDE4IC8qIHRoZSBhZGRyIG9mIHRoZSBlbmNvZGVkCisJCQkJCQkJCWNocm9tYSBwaWMgKi8KKworI2RlZmluZSBTNVBfRklNVl9FTkNfU0lfQ0gwX1NCX0FEUgkweDIwNDQgLyogYWRkciBvZiBzdHJlYW0gYnVmICovCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19TSV9DSDBfU0JfU0laRQkweDIwNGMgLyogc2l6ZSBvZiBzdHJlYW0gYnVmICovCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19TSV9DSDBfQ1VSX1lfQURSCTB4MjA1MCAvKiBjdXJyZW50IEx1bWEgYWRkciAqLworI2RlZmluZSBTNVBfRklNVl9FTkNfU0lfQ0gwX0NVUl9DX0FEUgkweDIwNTQgLyogY3VycmVudCBDaHJvbWEgYWRkciAqLworI2RlZmluZSBTNVBfRklNVl9FTkNfU0lfQ0gwX0ZSQU1FX0lOUwkweDIwNTggLyogZnJhbWUgaW5zZXJ0aW9uICovCisKKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1NJX0NIMV9TQl9BRFIJMHgyMDg0IC8qIGFkZHIgb2Ygc3RyZWFtIGJ1ZiAqLworI2RlZmluZSBTNVBfRklNVl9FTkNfU0lfQ0gxX1NCX1NJWkUJMHgyMDhjIC8qIHNpemUgb2Ygc3RyZWFtIGJ1ZiAqLworI2RlZmluZSBTNVBfRklNVl9FTkNfU0lfQ0gxX0NVUl9ZX0FEUgkweDIwOTAgLyogY3VycmVudCBMdW1hIGFkZHIgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1NJX0NIMV9DVVJfQ19BRFIJMHgyMDk0IC8qIGN1cnJlbnQgQ2hyb21hIGFkZHIgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1NJX0NIMV9GUkFNRV9JTlMJMHgyMDk4IC8qIGZyYW1lIGluc2VydGlvbiAqLworCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19QSUNfVFlQRV9DVFJMCTB4YzUwNCAvKiBwaWMgdHlwZSBsZXZlbCBjb250cm9sICovCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19CX1JFQ09OX1dSSVRFX09OCTB4YzUwOCAvKiBCIGZyYW1lIHJlY29uIHdyaXRlIGN0cmwgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX01TTElDRV9DVFJMCTB4YzUwYyAvKiBtdWx0aSBzbGljZSBjb250cm9sICovCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19NU0xJQ0VfTUIJCTB4YzUxMCAvKiBNQiBudW1iZXIgaW4gdGhlIG9uZSBzbGljZSAqLworI2RlZmluZSBTNVBfRklNVl9FTkNfTVNMSUNFX0JJVAkJMHhjNTE0IC8qIGJpdCBjb3VudCBmb3Igb25lIHNsaWNlICovCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19DSVJfQ1RSTAkJMHhjNTE4IC8qIG51bWJlciBvZiBpbnRyYSByZWZyZXNoIE1CICovCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19NQVBfRk9SX0NVUgkweGM1MWMgLyogbGluZWFyIG9yIHRpbGVkIG1vZGUgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1BBRERJTkdfQ1RSTAkweGM1MjAgLyogcGFkZGluZyBjb250cm9sICovCisKKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1JDX0NPTkZJRwkJMHhjNWEwIC8qIFJDIGNvbmZpZyAqLworI2RlZmluZSBTNVBfRklNVl9FTkNfUkNfQklUX1JBVEUJMHhjNWE4IC8qIGJpdCByYXRlICovCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19SQ19RQk9VTkQJCTB4YzVhYyAvKiBtYXgvbWluIFFQICovCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19SQ19SUEFSQQkJMHhjNWIwIC8qIHJhdGUgY29udHJvbCByZWFjdGlvbiBjb2VmZiAqLworI2RlZmluZSBTNVBfRklNVl9FTkNfUkNfTUJfQ1RSTAkJMHhjNWI0IC8qIE1CIGFkYXB0aXZlIHNjYWxpbmcgKi8KKworLyogRW5jb2RlciBmb3IgSDI2NCBvbmx5ICovCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19IMjY0X0VOVFJPUFlfTU9ERQkweGQwMDQgLyogQ0FWTEMgb3IgQ0FCQUMgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX0gyNjRfQUxQSEFfT0ZGCTB4ZDAwOCAvKiBsb29wIGZpbHRlciBhbHBoYSBvZmZzZXQgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX0gyNjRfQkVUQV9PRkYJMHhkMDBjIC8qIGxvb3AgZmlsdGVyIGJldGEgb2Zmc2V0ICovCisjZGVmaW5lIFM1UF9GSU1WX0VOQ19IMjY0X05VTV9PRl9SRUYJMHhkMDEwIC8qIG51bWJlciBvZiByZWZlcmVuY2UgZm9yIFAvQiAqLworI2RlZmluZSBTNVBfRklNVl9FTkNfSDI2NF9UUkFOU19GTEFHCTB4ZDAzNCAvKiA4eDggdHJhbnNmb3JtIGZsYWcgaW4gUFBTICYKKwkJCQkJCQkJaGlnaCBwcm9maWxlICovCisKKyNkZWZpbmUgUzVQX0ZJTVZfRU5DX1JDX0ZSQU1FX1JBVEUJMHhkMGQwIC8qIGZyYW1lIHJhdGUgKi8KKworLyogRW5jb2RlciBmb3IgTVBFRzQgb25seSAqLworI2RlZmluZSBTNVBfRklNVl9FTkNfTVBFRzRfUVVBUlRfUFhMCTB4ZTAwOCAvKiBxcGVsIGludGVycG9sYXRpb24gY3RybCAqLworCisvKiBBZGRpdGlvbmFsICovCisjZGVmaW5lIFM1UF9GSU1WX1NJX0NIMF9EUEJfQ09ORl9DVFJMICAgMHgyMDY4IC8qIERQQiBDb25maWcgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBTNVBfRklNVl9TTElDRV9JTlRfTUFTSwkJMQorI2RlZmluZSBTNVBfRklNVl9TTElDRV9JTlRfU0hJRlQJMzEKKyNkZWZpbmUgUzVQX0ZJTVZfRERFTEFZX0VOQV9TSElGVAkzMAorI2RlZmluZSBTNVBfRklNVl9EREVMQVlfVkFMX01BU0sJMHhmZgorI2RlZmluZSBTNVBfRklNVl9EREVMQVlfVkFMX1NISUZUCTE2CisjZGVmaW5lIFM1UF9GSU1WX0RQQl9DT1VOVF9NQVNLCQkweGZmZmYKKyNkZWZpbmUgUzVQX0ZJTVZfRFBCX0ZMVVNIX01BU0sJCTEKKyNkZWZpbmUgUzVQX0ZJTVZfRFBCX0ZMVVNIX1NISUZUCTE0CisKKworI2RlZmluZSBTNVBfRklNVl9TSV9DSDBfUkVMRUFTRV9CVUYgICAgIDB4MjA2MCAvKiBEUEIgcmVsZWFzZSBidWZmZXIgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfU0lfQ0gwX0hPU1RfV1JfQURSCTB4MjA2NCAvKiBhZGRyZXNzIG9mIHNoYXJlZCBtZW1vcnkgKi8KKworLyogQ29kZWMgbnVtYmVycyAgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfQ09ERUNfTk9ORQkJLTEKKworI2RlZmluZSBTNVBfRklNVl9DT0RFQ19IMjY0X0RFQwkJMAorI2RlZmluZSBTNVBfRklNVl9DT0RFQ19WQzFfREVDCQkxCisjZGVmaW5lIFM1UF9GSU1WX0NPREVDX01QRUc0X0RFQwkyCisjZGVmaW5lIFM1UF9GSU1WX0NPREVDX01QRUcyX0RFQwkzCisjZGVmaW5lIFM1UF9GSU1WX0NPREVDX0gyNjNfREVDCQk0CisjZGVmaW5lIFM1UF9GSU1WX0NPREVDX1ZDMVJDVl9ERUMJNQorCisjZGVmaW5lIFM1UF9GSU1WX0NPREVDX0gyNjRfRU5DCQkxNgorI2RlZmluZSBTNVBfRklNVl9DT0RFQ19NUEVHNF9FTkMJMTcKKyNkZWZpbmUgUzVQX0ZJTVZfQ09ERUNfSDI2M19FTkMJCTE4CisKKy8qIENoYW5uZWwgQ29udHJvbCBSZWdpc3RlciAqLworI2RlZmluZSBTNVBfRklNVl9DSF9TRVFfSEVBREVSCQkxCisjZGVmaW5lIFM1UF9GSU1WX0NIX0ZSQU1FX1NUQVJUCQkyCisjZGVmaW5lIFM1UF9GSU1WX0NIX0xBU1RfRlJBTUUJCTMKKyNkZWZpbmUgUzVQX0ZJTVZfQ0hfSU5JVF9CVUZTCQk0CisjZGVmaW5lIFM1UF9GSU1WX0NIX0ZSQU1FX1NUQVJUX1JFQUxMT0MJNQorI2RlZmluZSBTNVBfRklNVl9DSF9NQVNLCQk3CisjZGVmaW5lIFM1UF9GSU1WX0NIX1NISUZUCQkxNgorCisKKy8qIEhvc3QgdG8gUklTQyBjb21tYW5kICovCisjZGVmaW5lIFM1UF9GSU1WX0gyUl9DTURfRU1QVFkJCTAKKyNkZWZpbmUgUzVQX0ZJTVZfSDJSX0NNRF9PUEVOX0lOU1RBTkNFCTEKKyNkZWZpbmUgUzVQX0ZJTVZfSDJSX0NNRF9DTE9TRV9JTlNUQU5DRQkyCisjZGVmaW5lIFM1UF9GSU1WX0gyUl9DTURfU1lTX0lOSVQJMworI2RlZmluZSBTNVBfRklNVl9IMlJfQ01EX0ZMVVNICQk0CisjZGVmaW5lIFM1UF9GSU1WX0gyUl9DTURfU0xFRVAJCTUKKyNkZWZpbmUgUzVQX0ZJTVZfSDJSX0NNRF9XQUtFVVAJCTYKKworI2RlZmluZSBTNVBfRklNVl9SMkhfQ01EX0VNUFRZCQkJMAorI2RlZmluZSBTNVBfRklNVl9SMkhfQ01EX09QRU5fSU5TVEFOQ0VfUkVUCTEKKyNkZWZpbmUgUzVQX0ZJTVZfUjJIX0NNRF9DTE9TRV9JTlNUQU5DRV9SRVQJMgorI2RlZmluZSBTNVBfRklNVl9SMkhfQ01EX1JTVl9SRVQJCTMKKyNkZWZpbmUgUzVQX0ZJTVZfUjJIX0NNRF9TRVFfRE9ORV9SRVQJCTQKKyNkZWZpbmUgUzVQX0ZJTVZfUjJIX0NNRF9GUkFNRV9ET05FX1JFVAkJNQorI2RlZmluZSBTNVBfRklNVl9SMkhfQ01EX1NMSUNFX0RPTkVfUkVUCQk2CisjZGVmaW5lIFM1UF9GSU1WX1IySF9DTURfRU5DX0NPTVBMRVRFX1JFVAk3CisjZGVmaW5lIFM1UF9GSU1WX1IySF9DTURfU1lTX0lOSVRfUkVUCQk4CisjZGVmaW5lIFM1UF9GSU1WX1IySF9DTURfRldfU1RBVFVTX1JFVAkJOQorI2RlZmluZSBTNVBfRklNVl9SMkhfQ01EX1NMRUVQX1JFVAkJMTAKKyNkZWZpbmUgUzVQX0ZJTVZfUjJIX0NNRF9XQUtFVVBfUkVUCQkxMQorI2RlZmluZSBTNVBfRklNVl9SMkhfQ01EX0ZMVVNIX1JFVAkJMTIKKyNkZWZpbmUgUzVQX0ZJTVZfUjJIX0NNRF9JTklUX0JVRkZFUlNfUkVUCTE1CisjZGVmaW5lIFM1UF9GSU1WX1IySF9DTURfRURGVV9JTklUX1JFVAkJMTYKKyNkZWZpbmUgUzVQX0ZJTVZfUjJIX0NNRF9FUlJfUkVUCQkzMgorCisvKiBFcnJvciBoYW5kbGluZyBkZWZpbmVzICovCisjZGVmaW5lIFM1UF9GSU1WX0VSUl9XQVJOSU5HU19TVEFSVAkJMTQ1CisjZGVmaW5lIFM1UF9GSU1WX0VSUl9ERUNfTUFTSwkJCTB4RkZGRgorI2RlZmluZSBTNVBfRklNVl9FUlJfREVDX1NISUZUCQkJMAorI2RlZmluZSBTNVBfRklNVl9FUlJfRFNQTF9NQVNLCQkJMHhGRkZGMDAwMAorI2RlZmluZSBTNVBfRklNVl9FUlJfRFNQTF9TSElGVAkJCTE2CisKKy8qIFNoYXJlZCBtZW1vcnkgcmVnaXN0ZXJzJyBvZmZzZXRzICovCisKKy8qIEFuIG9mZnNldCBvZiB0aGUgc3RhcnQgcG9zaXRpb24gaW4gdGhlIHN0cmVhbSB3aGVuCisgKiB0aGUgc3RhcnQgcG9zaXRpb24gaXMgbm90IGFsaWduZWQgKi8KKyNkZWZpbmUgUzVQX0ZJTVZfU0hBUkVEX0NST1BfSU5GT19ICQkweDAwMjAKKyNkZWZpbmUgUzVQX0ZJTVZfU0hBUkVEX0NST1BfTEVGVF9NQVNLCQkweEZGRkYKKyNkZWZpbmUgUzVQX0ZJTVZfU0hBUkVEX0NST1BfTEVGVF9TSElGVAkJMAorI2RlZmluZSBTNVBfRklNVl9TSEFSRURfQ1JPUF9SSUdIVF9NQVNLCQkweEZGRkYwMDAwCisjZGVmaW5lIFM1UF9GSU1WX1NIQVJFRF9DUk9QX1JJR0hUX1NISUZUCTE2CisjZGVmaW5lIFM1UF9GSU1WX1NIQVJFRF9DUk9QX0lORk9fVgkJMHgwMDI0CisjZGVmaW5lIFM1UF9GSU1WX1NIQVJFRF9DUk9QX1RPUF9NQVNLCQkweEZGRkYKKyNkZWZpbmUgUzVQX0ZJTVZfU0hBUkVEX0NST1BfVE9QX1NISUZUCQkwCisjZGVmaW5lIFM1UF9GSU1WX1NIQVJFRF9DUk9QX0JPVFRPTV9NQVNLCTB4RkZGRjAwMDAKKyNkZWZpbmUgUzVQX0ZJTVZfU0hBUkVEX0NST1BfQk9UVE9NX1NISUZUCTE2CisjZGVmaW5lIFM1UF9GSU1WX1NIQVJFRF9TRVRfRlJBTUVfVEFHCQkweDAwMDQKKyNkZWZpbmUgUzVQX0ZJTVZfU0hBUkVEX0dFVF9GUkFNRV9UQUdfVE9QCTB4MDAwOAorI2RlZmluZSBTNVBfRklNVl9TSEFSRURfR0VUX0ZSQU1FX1RBR19CT1QJMHgwMDBDCisjZGVmaW5lIFM1UF9GSU1WX1NIQVJFRF9TVEFSVF9CWVRFX05VTQkJMHgwMDE4CisjZGVmaW5lIFM1UF9GSU1WX1NIQVJFRF9SQ19WT1BfVElNSU5HCQkweDAwMzAKKyNkZWZpbmUgUzVQX0ZJTVZfU0hBUkVEX0xVTUFfRFBCX1NJWkUJCTB4MDA2NAorI2RlZmluZSBTNVBfRklNVl9TSEFSRURfQ0hST01BX0RQQl9TSVpFCQkweDAwNjgKKyNkZWZpbmUgUzVQX0ZJTVZfU0hBUkVEX01WX1NJWkUJCQkweDAwNkMKKyNkZWZpbmUgUzVQX0ZJTVZfU0hBUkVEX1BJQ19USU1FX1RPUAkJMHgwMDEwCisjZGVmaW5lIFM1UF9GSU1WX1NIQVJFRF9QSUNfVElNRV9CT1RUT00JCTB4MDAxNAorI2RlZmluZSBTNVBfRklNVl9TSEFSRURfRVhUX0VOQ19DT05UUk9MCQkweDAwMjgKKyNkZWZpbmUgUzVQX0ZJTVZfU0hBUkVEX1BfQl9GUkFNRV9RUAkJMHgwMDcwCisjZGVmaW5lIFM1UF9GSU1WX1NIQVJFRF9BU1BFQ1RfUkFUSU9fSURDCTB4MDA3NAorI2RlZmluZSBTNVBfRklNVl9TSEFSRURfRVhURU5ERURfU0FSCQkweDAwNzgKKyNkZWZpbmUgUzVQX0ZJTVZfU0hBUkVEX0gyNjRfSV9QRVJJT0QJCTB4MDA5QworI2RlZmluZSBTNVBfRklNVl9TSEFSRURfUkNfQ09OVFJPTF9DT05GSUcJMHgwMEEwCisKKyNlbmRpZiAvKiBfUkVHU19GSU1WX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYzdlYWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mYy5jCkBAIC0wLDAgKzEsMTI3NCBAQAorLyoKKyAqIFNhbXN1bmcgUzVQIE11bHRpIEZvcm1hdCBDb2RlYyB2IDUuMQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICogS2FtaWwgRGVic2tpLCA8ay5kZWJza2lAc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxtZWRpYS92aWRlb2J1ZjItY29yZS5oPgorI2luY2x1ZGUgInJlZ3MtbWZjLmgiCisjaW5jbHVkZSAiczVwX21mY19jdHJsLmgiCisjaW5jbHVkZSAiczVwX21mY19kZWJ1Zy5oIgorI2luY2x1ZGUgInM1cF9tZmNfZGVjLmgiCisjaW5jbHVkZSAiczVwX21mY19lbmMuaCIKKyNpbmNsdWRlICJzNXBfbWZjX2ludHIuaCIKKyNpbmNsdWRlICJzNXBfbWZjX29wci5oIgorI2luY2x1ZGUgInM1cF9tZmNfcG0uaCIKKyNpbmNsdWRlICJzNXBfbWZjX3NobS5oIgorCisjZGVmaW5lIFM1UF9NRkNfTkFNRQkJInM1cC1tZmMiCisjZGVmaW5lIFM1UF9NRkNfREVDX05BTUUJInM1cC1tZmMtZGVjIgorI2RlZmluZSBTNVBfTUZDX0VOQ19OQU1FCSJzNXAtbWZjLWVuYyIKKworaW50IGRlYnVnOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJEZWJ1ZyBsZXZlbCAtIGhpZ2hlciB2YWx1ZSBwcm9kdWNlcyBtb3JlIHZlcmJvc2UgbWVzc2FnZXMiKTsKKworLyogSGVscGVyIGZ1bmN0aW9ucyBmb3IgaW50ZXJydXB0IHByb2Nlc3NpbmcgKi8KKy8qIFJlbW92ZSBmcm9tIGh3IGV4ZWN1dGlvbiByb3VuZCByb2JpbiAqLworc3RhdGljIHZvaWQgY2xlYXJfd29ya19iaXQoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKworCXNwaW5fbG9jaygmZGV2LT5jb25kbG9jayk7CisJY2xlYXJfYml0KGN0eC0+bnVtLCAmZGV2LT5jdHhfd29ya19iaXRzKTsKKwlzcGluX3VubG9jaygmZGV2LT5jb25kbG9jayk7Cit9CisKKy8qIFdha2UgdXAgY29udGV4dCB3YWl0X3F1ZXVlICovCitzdGF0aWMgdm9pZCB3YWtlX3VwX2N0eChzdHJ1Y3QgczVwX21mY19jdHggKmN0eCwgdW5zaWduZWQgaW50IHJlYXNvbiwKKwkJCXVuc2lnbmVkIGludCBlcnIpCit7CisJY3R4LT5pbnRfY29uZCA9IDE7CisJY3R4LT5pbnRfdHlwZSA9IHJlYXNvbjsKKwljdHgtPmludF9lcnIgPSBlcnI7CisJd2FrZV91cCgmY3R4LT5xdWV1ZSk7Cit9CisKKy8qIFdha2UgdXAgZGV2aWNlIHdhaXRfcXVldWUgKi8KK3N0YXRpYyB2b2lkIHdha2VfdXBfZGV2KHN0cnVjdCBzNXBfbWZjX2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgcmVhc29uLAorCQkJdW5zaWduZWQgaW50IGVycikKK3sKKwlkZXYtPmludF9jb25kID0gMTsKKwlkZXYtPmludF90eXBlID0gcmVhc29uOworCWRldi0+aW50X2VyciA9IGVycjsKKwl3YWtlX3VwKCZkZXYtPnF1ZXVlKTsKK30KKwordm9pZCBzNXBfbWZjX3dhdGNoZG9nKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gKHN0cnVjdCBzNXBfbWZjX2RldiAqKWFyZzsKKworCWlmICh0ZXN0X2JpdCgwLCAmZGV2LT5od19sb2NrKSkKKwkJYXRvbWljX2luYygmZGV2LT53YXRjaGRvZ19jbnQpOworCWlmIChhdG9taWNfcmVhZCgmZGV2LT53YXRjaGRvZ19jbnQpID49IE1GQ19XQVRDSERPR19DTlQpIHsKKwkJLyogVGhpcyBtZWFucyB0aGF0IGh3IGlzIGJ1c3kgYW5kIG5vIGludGVycnVwdHMgd2VyZQorCQkgKiBnZW5lcmF0ZWQgYnkgaHcgZm9yIHRoZSBOdGggdGltZSBvZiBydW5uaW5nIHRoaXMKKwkJICogd2F0Y2hkb2cgdGltZXIuIFRoaXMgdXN1YWxseSBtZWFucyBhIHNlcmlvdXMgaHcKKwkJICogZXJyb3IuIE5vdyBpdCBpcyB0aW1lIHRvIGtpbGwgYWxsIGluc3RhbmNlcyBhbmQKKwkJICogcmVzZXQgdGhlIE1GQy4gKi8KKwkJbWZjX2VycigiVGltZSBvdXQgZHVyaW5nIHdhaXRpbmcgZm9yIEhXXG4iKTsKKwkJcXVldWVfd29yayhkZXYtPndhdGNoZG9nX3dvcmtxdWV1ZSwgJmRldi0+d2F0Y2hkb2dfd29yayk7CisJfQorCWRldi0+d2F0Y2hkb2dfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKworCQkJCQltc2Vjc190b19qaWZmaWVzKE1GQ19XQVRDSERPR19JTlRFUlZBTCk7CisJYWRkX3RpbWVyKCZkZXYtPndhdGNoZG9nX3RpbWVyKTsKK30KKworc3RhdGljIHZvaWQgczVwX21mY193YXRjaGRvZ193b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2OworCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IG11dGV4X2xvY2tlZDsKKwlpbnQgaSwgcmV0OworCisJZGV2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzNXBfbWZjX2Rldiwgd2F0Y2hkb2dfd29yayk7CisKKwltZmNfZXJyKCJEcml2ZXIgdGltZW91dCBlcnJvciBoYW5kbGluZ1xuIik7CisJLyogTG9jayB0aGUgbXV0ZXggdGhhdCBwcm90ZWN0cyBvcGVuIGFuZCByZWxlYXNlLgorCSAqIFRoaXMgaXMgbmVjZXNzYXJ5IGFzIHRoZXkgbWF5IGxvYWQgYW5kIHVubG9hZCBmaXJtd2FyZS4gKi8KKwltdXRleF9sb2NrZWQgPSBtdXRleF90cnlsb2NrKCZkZXYtPm1mY19tdXRleCk7CisJaWYgKCFtdXRleF9sb2NrZWQpCisJCW1mY19lcnIoIkVycm9yOiBzb21lIGluc3RhbmNlIG1heSBiZSBjbG9zaW5nL29wZW5pbmdcbiIpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKworCXM1cF9tZmNfY2xvY2tfb2ZmKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUZDX05VTV9DT05URVhUUzsgaSsrKSB7CisJCWN0eCA9IGRldi0+Y3R4W2ldOworCQlpZiAoIWN0eCkKKwkJCWNvbnRpbnVlOworCQljdHgtPnN0YXRlID0gTUZDSU5TVF9FUlJPUjsKKwkJczVwX21mY19jbGVhbnVwX3F1ZXVlKCZjdHgtPmRzdF9xdWV1ZSwgJmN0eC0+dnFfZHN0KTsKKwkJczVwX21mY19jbGVhbnVwX3F1ZXVlKCZjdHgtPnNyY19xdWV1ZSwgJmN0eC0+dnFfc3JjKTsKKwkJY2xlYXJfd29ya19iaXQoY3R4KTsKKwkJd2FrZV91cF9jdHgoY3R4LCBTNVBfRklNVl9SMkhfQ01EX0VSUl9SRVQsIDApOworCX0KKwljbGVhcl9iaXQoMCwgJmRldi0+aHdfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CisJLyogRG91YmxlIGNoZWNrIGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBpbnN0YW5jZSBydW5uaW5nLgorCSAqIElmIG5vIGluc3RhbmNlIGlzIGluIG1lbW9yeSB0aGFuIG5vIGZpcm13YXJlIHNob3VsZCBiZSBwcmVzZW50ICovCisJaWYgKGRldi0+bnVtX2luc3QgPiAwKSB7CisJCXJldCA9IHM1cF9tZmNfcmVsb2FkX2Zpcm13YXJlKGRldik7CisJCWlmIChyZXQpIHsKKwkJCW1mY19lcnIoIkZhaWxlZCB0byByZWxvYWQgRldcbiIpOworCQkJZ290byB1bmxvY2s7CisJCX0KKwkJczVwX21mY19jbG9ja19vbigpOworCQlyZXQgPSBzNXBfbWZjX2luaXRfaHcoZGV2KTsKKwkJaWYgKHJldCkKKwkJCW1mY19lcnIoIkZhaWxlZCB0byByZWluaXQgRldcbiIpOworCX0KK3VubG9jazoKKwlpZiAobXV0ZXhfbG9ja2VkKQorCQltdXRleF91bmxvY2soJmRldi0+bWZjX211dGV4KTsKK30KKworc3RhdGljIGVudW0gczVwX21mY19ub2RlX3R5cGUgczVwX21mY19nZXRfbm9kZV90eXBlKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCisJaWYgKCF2ZGV2KSB7CisJCW1mY19lcnIoImZhaWxlZCB0byBnZXQgdmlkZW9fZGV2aWNlIik7CisJCXJldHVybiBNRkNOT0RFX0lOVkFMSUQ7CisJfQorCWlmICh2ZGV2LT5pbmRleCA9PSAwKQorCQlyZXR1cm4gTUZDTk9ERV9ERUNPREVSOworCWVsc2UgaWYgKHZkZXYtPmluZGV4ID09IDEpCisJCXJldHVybiBNRkNOT0RFX0VOQ09ERVI7CisJcmV0dXJuIE1GQ05PREVfSU5WQUxJRDsKK30KKworc3RhdGljIHZvaWQgczVwX21mY19jbGVhcl9pbnRfZmxhZ3Moc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYpCit7CisJbWZjX3dyaXRlKGRldiwgMCwgUzVQX0ZJTVZfUklTQ19IT1NUX0lOVCk7CisJbWZjX3dyaXRlKGRldiwgMCwgUzVQX0ZJTVZfUklTQzJIT1NUX0NNRCk7CisJbWZjX3dyaXRlKGRldiwgMHhmZmZmLCBTNVBfRklNVl9TSV9SVE5fQ0hJRCk7Cit9CisKK3N0YXRpYyB2b2lkIHM1cF9tZmNfaGFuZGxlX2ZyYW1lX2FsbF9leHRyYWN0ZWQoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJc3RydWN0IHM1cF9tZmNfYnVmICpkc3RfYnVmOworCisJY3R4LT5zdGF0ZSA9IE1GQ0lOU1RfRklOSVNIRUQ7CisJY3R4LT5zZXF1ZW5jZSsrOworCXdoaWxlICghbGlzdF9lbXB0eSgmY3R4LT5kc3RfcXVldWUpKSB7CisJCWRzdF9idWYgPSBsaXN0X2VudHJ5KGN0eC0+ZHN0X3F1ZXVlLm5leHQsCisJCQkJICAgICBzdHJ1Y3QgczVwX21mY19idWYsIGxpc3QpOworCQltZmNfZGVidWcoMiwgIkNsZWFuaW5nIHVwIGJ1ZmZlcjogJWRcbiIsCisJCQkJCSAgZHN0X2J1Zi0+Yi0+djRsMl9idWYuaW5kZXgpOworCQl2YjJfc2V0X3BsYW5lX3BheWxvYWQoZHN0X2J1Zi0+YiwgMCwgMCk7CisJCXZiMl9zZXRfcGxhbmVfcGF5bG9hZChkc3RfYnVmLT5iLCAxLCAwKTsKKwkJbGlzdF9kZWwoJmRzdF9idWYtPmxpc3QpOworCQljdHgtPmRzdF9xdWV1ZV9jbnQtLTsKKwkJZHN0X2J1Zi0+Yi0+djRsMl9idWYuc2VxdWVuY2UgPSAoY3R4LT5zZXF1ZW5jZSsrKTsKKworCQlpZiAoczVwX21mY19yZWFkX3NobShjdHgsIFBJQ19USU1FX1RPUCkgPT0KKwkJCXM1cF9tZmNfcmVhZF9zaG0oY3R4LCBQSUNfVElNRV9CT1QpKQorCQkJZHN0X2J1Zi0+Yi0+djRsMl9idWYuZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJCWVsc2UKKwkJCWRzdF9idWYtPmItPnY0bDJfYnVmLmZpZWxkID0gVjRMMl9GSUVMRF9JTlRFUkxBQ0VEOworCisJCWN0eC0+ZGVjX2RzdF9mbGFnICY9IH4oMSA8PCBkc3RfYnVmLT5iLT52NGwyX2J1Zi5pbmRleCk7CisJCXZiMl9idWZmZXJfZG9uZShkc3RfYnVmLT5iLCBWQjJfQlVGX1NUQVRFX0RPTkUpOworCX0KK30KKworc3RhdGljIHZvaWQgczVwX21mY19oYW5kbGVfZnJhbWVfY29weV90aW1lKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisJc3RydWN0IHM1cF9tZmNfYnVmICAqZHN0X2J1ZiwgKnNyY19idWY7CisJc2l6ZV90IGRlY195X2FkZHIgPSBzNXBfbWZjX2dldF9kZWNfeV9hZHIoKTsKKwl1bnNpZ25lZCBpbnQgZnJhbWVfdHlwZSA9IHM1cF9tZmNfZ2V0X2ZyYW1lX3R5cGUoKTsKKworCS8qIENvcHkgdGltZXN0YW1wIC8gdGltZWNvZGUgZnJvbSBkZWNvZGVkIHNyYyB0byBkc3QgYW5kIHNldAorCSAgIGFwcHJvcHJhaXRlIGZsYWdzICovCisJc3JjX2J1ZiA9IGxpc3RfZW50cnkoY3R4LT5zcmNfcXVldWUubmV4dCwgc3RydWN0IHM1cF9tZmNfYnVmLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRzdF9idWYsICZjdHgtPmRzdF9xdWV1ZSwgbGlzdCkgeworCQlpZiAodmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIoZHN0X2J1Zi0+YiwgMCkgPT0gZGVjX3lfYWRkcikgeworCQkJbWVtY3B5KCZkc3RfYnVmLT5iLT52NGwyX2J1Zi50aW1lY29kZSwKKwkJCQkmc3JjX2J1Zi0+Yi0+djRsMl9idWYudGltZWNvZGUsCisJCQkJc2l6ZW9mKHN0cnVjdCB2NGwyX3RpbWVjb2RlKSk7CisJCQltZW1jcHkoJmRzdF9idWYtPmItPnY0bDJfYnVmLnRpbWVzdGFtcCwKKwkJCQkmc3JjX2J1Zi0+Yi0+djRsMl9idWYudGltZXN0YW1wLAorCQkJCXNpemVvZihzdHJ1Y3QgdGltZXZhbCkpOworCQkJc3dpdGNoIChmcmFtZV90eXBlKSB7CisJCQljYXNlIFM1UF9GSU1WX0RFQ09ERV9GUkFNRV9JX0ZSQU1FOgorCQkJCWRzdF9idWYtPmItPnY0bDJfYnVmLmZsYWdzIHw9CisJCQkJCQlWNEwyX0JVRl9GTEFHX0tFWUZSQU1FOworCQkJCWJyZWFrOworCQkJY2FzZSBTNVBfRklNVl9ERUNPREVfRlJBTUVfUF9GUkFNRToKKwkJCQlkc3RfYnVmLT5iLT52NGwyX2J1Zi5mbGFncyB8PQorCQkJCQkJVjRMMl9CVUZfRkxBR19QRlJBTUU7CisJCQkJYnJlYWs7CisJCQljYXNlIFM1UF9GSU1WX0RFQ09ERV9GUkFNRV9CX0ZSQU1FOgorCQkJCWRzdF9idWYtPmItPnY0bDJfYnVmLmZsYWdzIHw9CisJCQkJCQlWNEwyX0JVRl9GTEFHX0JGUkFNRTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBzNXBfbWZjX2hhbmRsZV9mcmFtZV9uZXcoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgsIHVuc2lnbmVkIGludCBlcnIpCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKwlzdHJ1Y3QgczVwX21mY19idWYgICpkc3RfYnVmOworCXNpemVfdCBkc3BsX3lfYWRkciA9IHM1cF9tZmNfZ2V0X2RzcGxfeV9hZHIoKTsKKwl1bnNpZ25lZCBpbnQgZnJhbWVfdHlwZSA9IHM1cF9tZmNfZ2V0X2ZyYW1lX3R5cGUoKTsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisKKwkvKiBJZiBmcmFtZSBpcyBzYW1lIGFzIHByZXZpb3VzIHRoZW4gc2tpcCBhbmQgZG8gbm90IGRlcXVldWUgKi8KKwlpZiAoZnJhbWVfdHlwZSA9PSBTNVBfRklNVl9ERUNPREVfRlJBTUVfU0tJUFBFRCkgeworCQlpZiAoIWN0eC0+YWZ0ZXJfcGFja2VkX3BiKQorCQkJY3R4LT5zZXF1ZW5jZSsrOworCQljdHgtPmFmdGVyX3BhY2tlZF9wYiA9IDA7CisJCXJldHVybjsKKwl9CisJY3R4LT5zZXF1ZW5jZSsrOworCS8qIFRoZSBNRkMgcmV0dXJucyBhZGRyZXNzIG9mIHRoZSBidWZmZXIsIG5vdyB3ZSBoYXZlIHRvCisJICogY2hlY2sgd2hpY2ggdmlkZW9idWYgZG9lcyBpdCBjb3JyZXNwb25kIHRvICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkc3RfYnVmLCAmY3R4LT5kc3RfcXVldWUsIGxpc3QpIHsKKwkJLyogQ2hlY2sgaWYgdGhpcyBpcyB0aGUgYnVmZmVyIHdlJ3JlIGxvb2tpbmcgZm9yICovCisJCWlmICh2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcihkc3RfYnVmLT5iLCAwKSA9PSBkc3BsX3lfYWRkcikgeworCQkJbGlzdF9kZWwoJmRzdF9idWYtPmxpc3QpOworCQkJY3R4LT5kc3RfcXVldWVfY250LS07CisJCQlkc3RfYnVmLT5iLT52NGwyX2J1Zi5zZXF1ZW5jZSA9IGN0eC0+c2VxdWVuY2U7CisJCQlpZiAoczVwX21mY19yZWFkX3NobShjdHgsIFBJQ19USU1FX1RPUCkgPT0KKwkJCQlzNXBfbWZjX3JlYWRfc2htKGN0eCwgUElDX1RJTUVfQk9UKSkKKwkJCQlkc3RfYnVmLT5iLT52NGwyX2J1Zi5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwkJCWVsc2UKKwkJCQlkc3RfYnVmLT5iLT52NGwyX2J1Zi5maWVsZCA9CisJCQkJCQkJVjRMMl9GSUVMRF9JTlRFUkxBQ0VEOworCQkJdmIyX3NldF9wbGFuZV9wYXlsb2FkKGRzdF9idWYtPmIsIDAsIGN0eC0+bHVtYV9zaXplKTsKKwkJCXZiMl9zZXRfcGxhbmVfcGF5bG9hZChkc3RfYnVmLT5iLCAxLCBjdHgtPmNocm9tYV9zaXplKTsKKwkJCWNsZWFyX2JpdChkc3RfYnVmLT5iLT52NGwyX2J1Zi5pbmRleCwKKwkJCQkJCQkmY3R4LT5kZWNfZHN0X2ZsYWcpOworCisJCQl2YjJfYnVmZmVyX2RvbmUoZHN0X2J1Zi0+YiwKKwkJCQllcnIgPyBWQjJfQlVGX1NUQVRFX0VSUk9SIDogVkIyX0JVRl9TVEFURV9ET05FKTsKKworCQkJaW5kZXggPSBkc3RfYnVmLT5iLT52NGwyX2J1Zi5pbmRleDsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisvKiBIYW5kbGUgZnJhbWUgZGVjb2RpbmcgaW50ZXJydXB0ICovCitzdGF0aWMgdm9pZCBzNXBfbWZjX2hhbmRsZV9mcmFtZShzdHJ1Y3QgczVwX21mY19jdHggKmN0eCwKKwkJCQkJdW5zaWduZWQgaW50IHJlYXNvbiwgdW5zaWduZWQgaW50IGVycikKK3sKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IGN0eC0+ZGV2OworCXVuc2lnbmVkIGludCBkc3RfZnJhbWVfc3RhdHVzOworCXN0cnVjdCBzNXBfbWZjX2J1ZiAqc3JjX2J1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCByZXNfY2hhbmdlOworCisJdW5zaWduZWQgaW50IGluZGV4OworCisJZHN0X2ZyYW1lX3N0YXR1cyA9IHM1cF9tZmNfZ2V0X2RzcGxfc3RhdHVzKCkKKwkJCQkmIFM1UF9GSU1WX0RFQ19TVEFUVVNfREVDT0RJTkdfU1RBVFVTX01BU0s7CisJcmVzX2NoYW5nZSA9IHM1cF9tZmNfZ2V0X2RzcGxfc3RhdHVzKCkKKwkJCQkmIFM1UF9GSU1WX0RFQ19TVEFUVVNfUkVTT0xVVElPTl9NQVNLOworCW1mY19kZWJ1ZygyLCAiRnJhbWUgU3RhdHVzOiAleFxuIiwgZHN0X2ZyYW1lX3N0YXR1cyk7CisJaWYgKGN0eC0+c3RhdGUgPT0gTUZDSU5TVF9SRVNfQ0hBTkdFX0lOSVQpCisJCWN0eC0+c3RhdGUgPSBNRkNJTlNUX1JFU19DSEFOR0VfRkxVU0g7CisJaWYgKHJlc19jaGFuZ2UpIHsKKwkJY3R4LT5zdGF0ZSA9IE1GQ0lOU1RfUkVTX0NIQU5HRV9JTklUOworCQlzNXBfbWZjX2NsZWFyX2ludF9mbGFncyhkZXYpOworCQl3YWtlX3VwX2N0eChjdHgsIHJlYXNvbiwgZXJyKTsKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdCgwLCAmZGV2LT5od19sb2NrKSA9PSAwKQorCQkJQlVHKCk7CisJCXM1cF9tZmNfY2xvY2tfb2ZmKCk7CisJCXM1cF9tZmNfdHJ5X3J1bihkZXYpOworCQlyZXR1cm47CisJfQorCWlmIChjdHgtPmRwYl9mbHVzaF9mbGFnKQorCQljdHgtPmRwYl9mbHVzaF9mbGFnID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwkvKiBBbGwgZnJhbWVzIHJlbWFpbmluZyBpbiB0aGUgYnVmZmVyIGhhdmUgYmVlbiBleHRyYWN0ZWQgICovCisJaWYgKGRzdF9mcmFtZV9zdGF0dXMgPT0gUzVQX0ZJTVZfREVDX1NUQVRVU19ERUNPRElOR19FTVBUWSkgeworCQlpZiAoY3R4LT5zdGF0ZSA9PSBNRkNJTlNUX1JFU19DSEFOR0VfRkxVU0gpIHsKKwkJCXM1cF9tZmNfaGFuZGxlX2ZyYW1lX2FsbF9leHRyYWN0ZWQoY3R4KTsKKwkJCWN0eC0+c3RhdGUgPSBNRkNJTlNUX1JFU19DSEFOR0VfRU5EOworCQkJZ290byBsZWF2ZV9oYW5kbGVfZnJhbWU7CisJCX0gZWxzZSB7CisJCQlzNXBfbWZjX2hhbmRsZV9mcmFtZV9hbGxfZXh0cmFjdGVkKGN0eCk7CisJCX0KKwl9CisKKwlpZiAoZHN0X2ZyYW1lX3N0YXR1cyA9PSBTNVBfRklNVl9ERUNfU1RBVFVTX0RFQ09ESU5HX0RJU1BMQVkgfHwKKwkJZHN0X2ZyYW1lX3N0YXR1cyA9PSBTNVBfRklNVl9ERUNfU1RBVFVTX0RFQ09ESU5HX09OTFkpCisJCXM1cF9tZmNfaGFuZGxlX2ZyYW1lX2NvcHlfdGltZShjdHgpOworCisJLyogQSBmcmFtZSBoYXMgYmVlbiBkZWNvZGVkIGFuZCBpcyBpbiB0aGUgYnVmZmVyICAqLworCWlmIChkc3RfZnJhbWVfc3RhdHVzID09IFM1UF9GSU1WX0RFQ19TVEFUVVNfRElTUExBWV9PTkxZIHx8CisJICAgIGRzdF9mcmFtZV9zdGF0dXMgPT0gUzVQX0ZJTVZfREVDX1NUQVRVU19ERUNPRElOR19ESVNQTEFZKSB7CisJCXM1cF9tZmNfaGFuZGxlX2ZyYW1lX25ldyhjdHgsIGVycik7CisJfSBlbHNlIHsKKwkJbWZjX2RlYnVnKDIsICJObyBmcmFtZSBkZWNvZGVcbiIpOworCX0KKwkvKiBNYXJrIHNvdXJjZSBidWZmZXIgYXMgY29tcGxldGUgKi8KKwlpZiAoZHN0X2ZyYW1lX3N0YXR1cyAhPSBTNVBfRklNVl9ERUNfU1RBVFVTX0RJU1BMQVlfT05MWQorCQkmJiAhbGlzdF9lbXB0eSgmY3R4LT5zcmNfcXVldWUpKSB7CisJCXNyY19idWYgPSBsaXN0X2VudHJ5KGN0eC0+c3JjX3F1ZXVlLm5leHQsIHN0cnVjdCBzNXBfbWZjX2J1ZiwKKwkJCQkJCQkJbGlzdCk7CisJCWN0eC0+Y29uc3VtZWRfc3RyZWFtICs9IHM1cF9tZmNfZ2V0X2NvbnN1bWVkX3N0cmVhbSgpOworCQlpZiAoY3R4LT5jb2RlY19tb2RlICE9IFM1UF9GSU1WX0NPREVDX0gyNjRfREVDICYmCisJCQlzNXBfbWZjX2dldF9mcmFtZV90eXBlKCkgPT0gUzVQX0ZJTVZfREVDT0RFX0ZSQU1FX1BfRlJBTUUKKwkJCQkJJiYgY3R4LT5jb25zdW1lZF9zdHJlYW0gKyBTVFVGRl9CWVRFIDwKKwkJCQkJc3JjX2J1Zi0+Yi0+djRsMl9wbGFuZXNbMF0uYnl0ZXN1c2VkKSB7CisJCQkvKiBSdW4gTUZDIGFnYWluIG9uIHRoZSBzYW1lIGJ1ZmZlciAqLworCQkJbWZjX2RlYnVnKDIsICJSdW5uaW5nIGFnYWluIHRoZSBzYW1lIGJ1ZmZlclxuIik7CisJCQljdHgtPmFmdGVyX3BhY2tlZF9wYiA9IDE7CisJCX0gZWxzZSB7CisJCQlpbmRleCA9IHNyY19idWYtPmItPnY0bDJfYnVmLmluZGV4OworCQkJbWZjX2RlYnVnKDIsICJNRkMgbmVlZHMgbmV4dCBidWZmZXJcbiIpOworCQkJY3R4LT5jb25zdW1lZF9zdHJlYW0gPSAwOworCQkJbGlzdF9kZWwoJnNyY19idWYtPmxpc3QpOworCQkJY3R4LT5zcmNfcXVldWVfY250LS07CisJCQlpZiAoczVwX21mY19lcnJfZGVjKGVycikgPiAwKQorCQkJCXZiMl9idWZmZXJfZG9uZShzcmNfYnVmLT5iLCBWQjJfQlVGX1NUQVRFX0VSUk9SKTsKKwkJCWVsc2UKKwkJCQl2YjJfYnVmZmVyX2RvbmUoc3JjX2J1Zi0+YiwgVkIyX0JVRl9TVEFURV9ET05FKTsKKwkJfQorCX0KK2xlYXZlX2hhbmRsZV9mcmFtZToKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwlpZiAoKGN0eC0+c3JjX3F1ZXVlX2NudCA9PSAwICYmIGN0eC0+c3RhdGUgIT0gTUZDSU5TVF9GSU5JU0hJTkcpCisJCQkJICAgIHx8IGN0eC0+ZHN0X3F1ZXVlX2NudCA8IGN0eC0+ZHBiX2NvdW50KQorCQljbGVhcl93b3JrX2JpdChjdHgpOworCXM1cF9tZmNfY2xlYXJfaW50X2ZsYWdzKGRldik7CisJd2FrZV91cF9jdHgoY3R4LCByZWFzb24sIGVycik7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdCgwLCAmZGV2LT5od19sb2NrKSA9PSAwKQorCQlCVUcoKTsKKwlzNXBfbWZjX2Nsb2NrX29mZigpOworCXM1cF9tZmNfdHJ5X3J1bihkZXYpOworfQorCisvKiBFcnJvciBoYW5kbGluZyBmb3IgaW50ZXJydXB0ICovCitzdGF0aWMgdm9pZCBzNXBfbWZjX2hhbmRsZV9lcnJvcihzdHJ1Y3QgczVwX21mY19jdHggKmN0eCwKKwkJCQkgdW5zaWduZWQgaW50IHJlYXNvbiwgdW5zaWduZWQgaW50IGVycikKK3sKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogSWYgbm8gY29udGV4dCBpcyBhdmFpbGFibGUgdGhlbiBhbGwgbmVjZXNzYXJ5CisJICogcHJvY2Vzc2luZyBoYXMgYmVlbiBkb25lLiAqLworCWlmIChjdHggPT0gMCkKKwkJcmV0dXJuOworCisJZGV2ID0gY3R4LT5kZXY7CisJbWZjX2VycigiSW50ZXJydXB0IEVycm9yOiAlMDh4XG4iLCBlcnIpOworCXM1cF9tZmNfY2xlYXJfaW50X2ZsYWdzKGRldik7CisJd2FrZV91cF9kZXYoZGV2LCByZWFzb24sIGVycik7CisKKwkvKiBFcnJvciByZWNvdmVyeSBpcyBkZXBlbmRlbnQgb24gdGhlIHN0YXRlIG9mIGNvbnRleHQgKi8KKwlzd2l0Y2ggKGN0eC0+c3RhdGUpIHsKKwljYXNlIE1GQ0lOU1RfSU5JVDoKKwkJLyogVGhpcyBlcnJvciBoYWQgdG8gaGFwcGVuIHdoaWxlIGFjcXVpcmVpbmcgaW5zdGFuY2UgKi8KKwljYXNlIE1GQ0lOU1RfR09UX0lOU1Q6CisJCS8qIFRoaXMgZXJyb3IgaGFkIHRvIGhhcHBlbiB3aGlsZSBwYXJzaW5nIHRoZSBoZWFkZXIgKi8KKwljYXNlIE1GQ0lOU1RfSEVBRF9QQVJTRUQ6CisJCS8qIFRoaXMgZXJyb3IgaGFkIHRvIGhhcHBlbiB3aGlsZSBzZXR0aW5nIGRzdCBidWZmZXJzICovCisJY2FzZSBNRkNJTlNUX1JFVFVSTl9JTlNUOgorCQkvKiBUaGlzIGVycm9yIGhhZCB0byBoYXBwZW4gd2hpbGUgcmVsZWFzaW5nIGluc3RhbmNlICovCisJCWNsZWFyX3dvcmtfYml0KGN0eCk7CisJCXdha2VfdXBfY3R4KGN0eCwgcmVhc29uLCBlcnIpOworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KDAsICZkZXYtPmh3X2xvY2spID09IDApCisJCQlCVUcoKTsKKwkJczVwX21mY19jbG9ja19vZmYoKTsKKwkJY3R4LT5zdGF0ZSA9IE1GQ0lOU1RfRVJST1I7CisJCWJyZWFrOworCWNhc2UgTUZDSU5TVF9GSU5JU0hJTkc6CisJY2FzZSBNRkNJTlNUX0ZJTklTSEVEOgorCWNhc2UgTUZDSU5TVF9SVU5OSU5HOgorCQkvKiBJdCBpcyBoaWdseSBwcm9iYWJsZSB0aGF0IGFuIGVycm9yIG9jY3VyZWQKKwkJICogd2hpbGUgZGVjb2RpbmcgYSBmcmFtZSAqLworCQljbGVhcl93b3JrX2JpdChjdHgpOworCQljdHgtPnN0YXRlID0gTUZDSU5TVF9FUlJPUjsKKwkJLyogTWFyayBhbGwgZHN0IGJ1ZmZlcnMgYXMgaGF2aW5nIGFuIGVycm9yICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwkJczVwX21mY19jbGVhbnVwX3F1ZXVlKCZjdHgtPmRzdF9xdWV1ZSwgJmN0eC0+dnFfZHN0KTsKKwkJLyogTWFyayBhbGwgc3JjIGJ1ZmZlcnMgYXMgaGF2aW5nIGFuIGVycm9yICovCisJCXM1cF9tZmNfY2xlYW51cF9xdWV1ZSgmY3R4LT5zcmNfcXVldWUsICZjdHgtPnZxX3NyYyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KDAsICZkZXYtPmh3X2xvY2spID09IDApCisJCQlCVUcoKTsKKwkJczVwX21mY19jbG9ja19vZmYoKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbWZjX2VycigiRW5jb3VudGVyZWQgYW4gZXJyb3IgaW50ZXJydXB0IHdoaWNoIGhhZCBub3QgYmVlbiBoYW5kbGVkXG4iKTsKKwkJYnJlYWs7CisJfQorCXJldHVybjsKK30KKworLyogSGVhZGVyIHBhcnNpbmcgaW50ZXJydXB0IGhhbmRsaW5nICovCitzdGF0aWMgdm9pZCBzNXBfbWZjX2hhbmRsZV9zZXFfZG9uZShzdHJ1Y3QgczVwX21mY19jdHggKmN0eCwKKwkJCQkgdW5zaWduZWQgaW50IHJlYXNvbiwgdW5zaWduZWQgaW50IGVycikKK3sKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldjsKKwl1bnNpZ25lZCBpbnQgZ3VhcmRfd2lkdGgsIGd1YXJkX2hlaWdodDsKKworCWlmIChjdHggPT0gMCkKKwkJcmV0dXJuOworCWRldiA9IGN0eC0+ZGV2OworCWlmIChjdHgtPmNfb3BzLT5wb3N0X3NlcV9zdGFydCkgeworCQlpZiAoY3R4LT5jX29wcy0+cG9zdF9zZXFfc3RhcnQoY3R4KSkKKwkJCW1mY19lcnIoInBvc3Rfc2VxX3N0YXJ0KCkgZmFpbGVkXG4iKTsKKwl9IGVsc2UgeworCQljdHgtPmltZ193aWR0aCA9IHM1cF9tZmNfZ2V0X2ltZ193aWR0aCgpOworCQljdHgtPmltZ19oZWlnaHQgPSBzNXBfbWZjX2dldF9pbWdfaGVpZ2h0KCk7CisKKwkJY3R4LT5idWZfd2lkdGggPSBBTElHTihjdHgtPmltZ193aWR0aCwKKwkJCQkJCVM1UF9GSU1WX05WMTJNVF9IQUxJR04pOworCQljdHgtPmJ1Zl9oZWlnaHQgPSBBTElHTihjdHgtPmltZ19oZWlnaHQsCisJCQkJCQlTNVBfRklNVl9OVjEyTVRfVkFMSUdOKTsKKwkJbWZjX2RlYnVnKDIsICJTRVEgRG9uZTogTW92aWUgZGltZW5zaW9ucyAlZHglZCwgIgorCQkJImJ1ZmZlciBkaW1lbnNpb25zOiAlZHglZFxuIiwgY3R4LT5pbWdfd2lkdGgsCisJCQkJY3R4LT5pbWdfaGVpZ2h0LCBjdHgtPmJ1Zl93aWR0aCwKKwkJCQkJCWN0eC0+YnVmX2hlaWdodCk7CisJCWlmIChjdHgtPmNvZGVjX21vZGUgPT0gUzVQX0ZJTVZfQ09ERUNfSDI2NF9ERUMpIHsKKwkJCWN0eC0+bHVtYV9zaXplID0gQUxJR04oY3R4LT5idWZfd2lkdGggKgorCQkJCWN0eC0+YnVmX2hlaWdodCwgUzVQX0ZJTVZfREVDX0JVRl9BTElHTik7CisJCQljdHgtPmNocm9tYV9zaXplID0gQUxJR04oY3R4LT5idWZfd2lkdGggKgorCQkJCQkgQUxJR04oKGN0eC0+aW1nX2hlaWdodCA+PiAxKSwKKwkJCQkJICAgICAgIFM1UF9GSU1WX05WMTJNVF9WQUxJR04pLAorCQkJCQkgICAgICAgUzVQX0ZJTVZfREVDX0JVRl9BTElHTik7CisJCQljdHgtPm12X3NpemUgPSBBTElHTihjdHgtPmJ1Zl93aWR0aCAqCisJCQkJCUFMSUdOKChjdHgtPmJ1Zl9oZWlnaHQgPj4gMiksCisJCQkJCVM1UF9GSU1WX05WMTJNVF9WQUxJR04pLAorCQkJCQlTNVBfRklNVl9ERUNfQlVGX0FMSUdOKTsKKwkJfSBlbHNlIHsKKwkJCWd1YXJkX3dpZHRoID0gQUxJR04oY3R4LT5pbWdfd2lkdGggKyAyNCwKKwkJCQkJUzVQX0ZJTVZfTlYxMk1UX0hBTElHTik7CisJCQlndWFyZF9oZWlnaHQgPSBBTElHTihjdHgtPmltZ19oZWlnaHQgKyAxNiwKKwkJCQkJCVM1UF9GSU1WX05WMTJNVF9WQUxJR04pOworCQkJY3R4LT5sdW1hX3NpemUgPSBBTElHTihndWFyZF93aWR0aCAqCisJCQkJZ3VhcmRfaGVpZ2h0LCBTNVBfRklNVl9ERUNfQlVGX0FMSUdOKTsKKwkJCWd1YXJkX3dpZHRoID0gQUxJR04oY3R4LT5pbWdfd2lkdGggKyAxNiwKKwkJCQkJCVM1UF9GSU1WX05WMTJNVF9IQUxJR04pOworCQkJZ3VhcmRfaGVpZ2h0ID0gQUxJR04oKGN0eC0+aW1nX2hlaWdodCA+PiAxKSArIDQsCisJCQkJCQlTNVBfRklNVl9OVjEyTVRfVkFMSUdOKTsKKwkJCWN0eC0+Y2hyb21hX3NpemUgPSBBTElHTihndWFyZF93aWR0aCAqCisJCQkJZ3VhcmRfaGVpZ2h0LCBTNVBfRklNVl9ERUNfQlVGX0FMSUdOKTsKKwkJCWN0eC0+bXZfc2l6ZSA9IDA7CisJCX0KKwkJY3R4LT5kcGJfY291bnQgPSBzNXBfbWZjX2dldF9kcGJfY291bnQoKTsKKwkJaWYgKGN0eC0+aW1nX3dpZHRoID09IDAgfHwgY3R4LT5pbWdfd2lkdGggPT0gMCkKKwkJCWN0eC0+c3RhdGUgPSBNRkNJTlNUX0VSUk9SOworCQllbHNlCisJCQljdHgtPnN0YXRlID0gTUZDSU5TVF9IRUFEX1BBUlNFRDsKKwl9CisJczVwX21mY19jbGVhcl9pbnRfZmxhZ3MoZGV2KTsKKwljbGVhcl93b3JrX2JpdChjdHgpOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoMCwgJmRldi0+aHdfbG9jaykgPT0gMCkKKwkJQlVHKCk7CisJczVwX21mY19jbG9ja19vZmYoKTsKKwlzNXBfbWZjX3RyeV9ydW4oZGV2KTsKKwl3YWtlX3VwX2N0eChjdHgsIHJlYXNvbiwgZXJyKTsKK30KKworLyogSGVhZGVyIHBhcnNpbmcgaW50ZXJydXB0IGhhbmRsaW5nICovCitzdGF0aWMgdm9pZCBzNXBfbWZjX2hhbmRsZV9pbml0X2J1ZmZlcnMoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgsCisJCQkJIHVuc2lnbmVkIGludCByZWFzb24sIHVuc2lnbmVkIGludCBlcnIpCit7CisJc3RydWN0IHM1cF9tZmNfYnVmICpzcmNfYnVmOworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoY3R4ID09IDApCisJCXJldHVybjsKKwlkZXYgPSBjdHgtPmRldjsKKwlzNXBfbWZjX2NsZWFyX2ludF9mbGFncyhkZXYpOworCWN0eC0+aW50X3R5cGUgPSByZWFzb247CisJY3R4LT5pbnRfZXJyID0gZXJyOworCWN0eC0+aW50X2NvbmQgPSAxOworCXNwaW5fbG9jaygmZGV2LT5jb25kbG9jayk7CisJY2xlYXJfYml0KGN0eC0+bnVtLCAmZGV2LT5jdHhfd29ya19iaXRzKTsKKwlzcGluX3VubG9jaygmZGV2LT5jb25kbG9jayk7CisJaWYgKGVyciA9PSAwKSB7CisJCWN0eC0+c3RhdGUgPSBNRkNJTlNUX1JVTk5JTkc7CisJCWlmICghY3R4LT5kcGJfZmx1c2hfZmxhZykgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOworCQkJaWYgKCFsaXN0X2VtcHR5KCZjdHgtPnNyY19xdWV1ZSkpIHsKKwkJCQlzcmNfYnVmID0gbGlzdF9lbnRyeShjdHgtPnNyY19xdWV1ZS5uZXh0LAorCQkJCQkgICAgIHN0cnVjdCBzNXBfbWZjX2J1ZiwgbGlzdCk7CisJCQkJbGlzdF9kZWwoJnNyY19idWYtPmxpc3QpOworCQkJCWN0eC0+c3JjX3F1ZXVlX2NudC0tOworCQkJCXZiMl9idWZmZXJfZG9uZShzcmNfYnVmLT5iLAorCQkJCQkJVkIyX0JVRl9TVEFURV9ET05FKTsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOworCQl9IGVsc2UgeworCQkJY3R4LT5kcGJfZmx1c2hfZmxhZyA9IDA7CisJCX0KKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdCgwLCAmZGV2LT5od19sb2NrKSA9PSAwKQorCQkJQlVHKCk7CisKKwkJczVwX21mY19jbG9ja19vZmYoKTsKKworCQl3YWtlX3VwKCZjdHgtPnF1ZXVlKTsKKwkJczVwX21mY190cnlfcnVuKGRldik7CisJfSBlbHNlIHsKKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdCgwLCAmZGV2LT5od19sb2NrKSA9PSAwKQorCQkJQlVHKCk7CisKKwkJczVwX21mY19jbG9ja19vZmYoKTsKKworCQl3YWtlX3VwKCZjdHgtPnF1ZXVlKTsKKwl9Cit9CisKKy8qIEludGVycnVwdCBwcm9jZXNzaW5nICovCitzdGF0aWMgaXJxcmV0dXJuX3QgczVwX21mY19pcnEoaW50IGlycSwgdm9pZCAqcHJpdikKK3sKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IHByaXY7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHg7CisJdW5zaWduZWQgaW50IHJlYXNvbjsKKwl1bnNpZ25lZCBpbnQgZXJyOworCisJbWZjX2RlYnVnX2VudGVyKCk7CisJLyogUmVzZXQgdGhlIHRpbWVvdXQgd2F0Y2hkb2cgKi8KKwlhdG9taWNfc2V0KCZkZXYtPndhdGNoZG9nX2NudCwgMCk7CisJY3R4ID0gZGV2LT5jdHhbZGV2LT5jdXJyX2N0eF07CisJLyogR2V0IHRoZSByZWFzb24gb2YgaW50ZXJydXB0IGFuZCB0aGUgZXJyb3IgY29kZSAqLworCXJlYXNvbiA9IHM1cF9tZmNfZ2V0X2ludF9yZWFzb24oKTsKKwllcnIgPSBzNXBfbWZjX2dldF9pbnRfZXJyKCk7CisJbWZjX2RlYnVnKDEsICJJbnQgcmVhc29uOiAlZCAoZXJyOiAlMDh4KVxuIiwgcmVhc29uLCBlcnIpOworCXN3aXRjaCAocmVhc29uKSB7CisJY2FzZSBTNVBfRklNVl9SMkhfQ01EX0VSUl9SRVQ6CisJCS8qIEFuIGVycm9yIGhhcyBvY2N1cmVkICovCisJCWlmIChjdHgtPnN0YXRlID09IE1GQ0lOU1RfUlVOTklORyAmJgorCQkJczVwX21mY19lcnJfZGVjKGVycikgPj0gUzVQX0ZJTVZfRVJSX1dBUk5JTkdTX1NUQVJUKQorCQkJczVwX21mY19oYW5kbGVfZnJhbWUoY3R4LCByZWFzb24sIGVycik7CisJCWVsc2UKKwkJCXM1cF9tZmNfaGFuZGxlX2Vycm9yKGN0eCwgcmVhc29uLCBlcnIpOworCQljbGVhcl9iaXQoMCwgJmRldi0+ZW50ZXJfc3VzcGVuZCk7CisJCWJyZWFrOworCisJY2FzZSBTNVBfRklNVl9SMkhfQ01EX1NMSUNFX0RPTkVfUkVUOgorCWNhc2UgUzVQX0ZJTVZfUjJIX0NNRF9GUkFNRV9ET05FX1JFVDoKKwkJaWYgKGN0eC0+Y19vcHMtPnBvc3RfZnJhbWVfc3RhcnQpIHsKKwkJCWlmIChjdHgtPmNfb3BzLT5wb3N0X2ZyYW1lX3N0YXJ0KGN0eCkpCisJCQkJbWZjX2VycigicG9zdF9mcmFtZV9zdGFydCgpIGZhaWxlZFxuIik7CisJCQlzNXBfbWZjX2NsZWFyX2ludF9mbGFncyhkZXYpOworCQkJd2FrZV91cF9jdHgoY3R4LCByZWFzb24sIGVycik7CisJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KDAsICZkZXYtPmh3X2xvY2spID09IDApCisJCQkJQlVHKCk7CisJCQlzNXBfbWZjX2Nsb2NrX29mZigpOworCQkJczVwX21mY190cnlfcnVuKGRldik7CisJCX0gZWxzZSB7CisJCQlzNXBfbWZjX2hhbmRsZV9mcmFtZShjdHgsIHJlYXNvbiwgZXJyKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUzVQX0ZJTVZfUjJIX0NNRF9TRVFfRE9ORV9SRVQ6CisJCXM1cF9tZmNfaGFuZGxlX3NlcV9kb25lKGN0eCwgcmVhc29uLCBlcnIpOworCQlicmVhazsKKworCWNhc2UgUzVQX0ZJTVZfUjJIX0NNRF9PUEVOX0lOU1RBTkNFX1JFVDoKKwkJY3R4LT5pbnN0X25vID0gczVwX21mY19nZXRfaW5zdF9ubygpOworCQljdHgtPnN0YXRlID0gTUZDSU5TVF9HT1RfSU5TVDsKKwkJY2xlYXJfd29ya19iaXQoY3R4KTsKKwkJd2FrZV91cCgmY3R4LT5xdWV1ZSk7CisJCWdvdG8gaXJxX2NsZWFudXBfaHc7CisKKwljYXNlIFM1UF9GSU1WX1IySF9DTURfQ0xPU0VfSU5TVEFOQ0VfUkVUOgorCQljbGVhcl93b3JrX2JpdChjdHgpOworCQljdHgtPnN0YXRlID0gTUZDSU5TVF9GUkVFOworCQl3YWtlX3VwKCZjdHgtPnF1ZXVlKTsKKwkJZ290byBpcnFfY2xlYW51cF9odzsKKworCWNhc2UgUzVQX0ZJTVZfUjJIX0NNRF9TWVNfSU5JVF9SRVQ6CisJY2FzZSBTNVBfRklNVl9SMkhfQ01EX0ZXX1NUQVRVU19SRVQ6CisJY2FzZSBTNVBfRklNVl9SMkhfQ01EX1NMRUVQX1JFVDoKKwljYXNlIFM1UF9GSU1WX1IySF9DTURfV0FLRVVQX1JFVDoKKwkJaWYgKGN0eCkKKwkJCWNsZWFyX3dvcmtfYml0KGN0eCk7CisJCXM1cF9tZmNfY2xlYXJfaW50X2ZsYWdzKGRldik7CisJCXdha2VfdXBfZGV2KGRldiwgcmVhc29uLCBlcnIpOworCQljbGVhcl9iaXQoMCwgJmRldi0+aHdfbG9jayk7CisJCWNsZWFyX2JpdCgwLCAmZGV2LT5lbnRlcl9zdXNwZW5kKTsKKwkJYnJlYWs7CisKKwljYXNlIFM1UF9GSU1WX1IySF9DTURfSU5JVF9CVUZGRVJTX1JFVDoKKwkJczVwX21mY19oYW5kbGVfaW5pdF9idWZmZXJzKGN0eCwgcmVhc29uLCBlcnIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQltZmNfZGVidWcoMiwgIlVua25vd24gaW50IHJlYXNvblxuIik7CisJCXM1cF9tZmNfY2xlYXJfaW50X2ZsYWdzKGRldik7CisJfQorCW1mY19kZWJ1Z19sZWF2ZSgpOworCXJldHVybiBJUlFfSEFORExFRDsKK2lycV9jbGVhbnVwX2h3OgorCXM1cF9tZmNfY2xlYXJfaW50X2ZsYWdzKGRldik7CisJY3R4LT5pbnRfdHlwZSA9IHJlYXNvbjsKKwljdHgtPmludF9lcnIgPSBlcnI7CisJY3R4LT5pbnRfY29uZCA9IDE7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdCgwLCAmZGV2LT5od19sb2NrKSA9PSAwKQorCQltZmNfZXJyKCJGYWlsZWQgdG8gdW5sb2NrIGh3XG4iKTsKKworCXM1cF9tZmNfY2xvY2tfb2ZmKCk7CisKKwlzNXBfbWZjX3RyeV9ydW4oZGV2KTsKKwltZmNfZGVidWcoMiwgIkV4aXQgdmlhIGlycV9jbGVhbnVwX2h3XG4iKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIE9wZW4gYW4gTUZDIG5vZGUgKi8KK3N0YXRpYyBpbnQgczVwX21mY19vcGVuKHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgczVwX21mY19jdHggKmN0eCA9IE5VTEw7CisJc3RydWN0IHZiMl9xdWV1ZSAqcTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJbWZjX2RlYnVnX2VudGVyKCk7CisJZGV2LT5udW1faW5zdCsrOwkvKiBJdCBpcyBndWFyZGVkIGJ5IG1mY19tdXRleCBpbiB2ZmQgKi8KKwkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGNvbnRleHQgKi8KKwljdHggPSBremFsbG9jKHNpemVvZiAqY3R4LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWN0eCkgeworCQltZmNfZXJyKCJOb3QgZW5vdWdoIG1lbW9yeVxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2FsbG9jOworCX0KKwl2NGwyX2ZoX2luaXQoJmN0eC0+ZmgsIHZpZGVvX2RldmRhdGEoZmlsZSkpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9ICZjdHgtPmZoOworCXY0bDJfZmhfYWRkKCZjdHgtPmZoKTsKKwljdHgtPmRldiA9IGRldjsKKwlJTklUX0xJU1RfSEVBRCgmY3R4LT5zcmNfcXVldWUpOworCUlOSVRfTElTVF9IRUFEKCZjdHgtPmRzdF9xdWV1ZSk7CisJY3R4LT5zcmNfcXVldWVfY250ID0gMDsKKwljdHgtPmRzdF9xdWV1ZV9jbnQgPSAwOworCS8qIEdldCBjb250ZXh0IG51bWJlciAqLworCWN0eC0+bnVtID0gMDsKKwl3aGlsZSAoZGV2LT5jdHhbY3R4LT5udW1dKSB7CisJCWN0eC0+bnVtKys7CisJCWlmIChjdHgtPm51bSA+PSBNRkNfTlVNX0NPTlRFWFRTKSB7CisJCQltZmNfZXJyKCJUb28gbWFueSBvcGVuIGNvbnRleHRzXG4iKTsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCWdvdG8gZXJyX25vX2N0eDsKKwkJfQorCX0KKwkvKiBNYXJrIGNvbnRleHQgYXMgaWRsZSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmNvbmRsb2NrLCBmbGFncyk7CisJY2xlYXJfYml0KGN0eC0+bnVtLCAmZGV2LT5jdHhfd29ya19iaXRzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmNvbmRsb2NrLCBmbGFncyk7CisJZGV2LT5jdHhbY3R4LT5udW1dID0gY3R4OworCWlmIChzNXBfbWZjX2dldF9ub2RlX3R5cGUoZmlsZSkgPT0gTUZDTk9ERV9ERUNPREVSKSB7CisJCWN0eC0+dHlwZSA9IE1GQ0lOU1RfREVDT0RFUjsKKwkJY3R4LT5jX29wcyA9IGdldF9kZWNfY29kZWNfb3BzKCk7CisJCS8qIFNldHVwIGN0cmwgaGFuZGxlciAqLworCQlyZXQgPSBzNXBfbWZjX2RlY19jdHJsc19zZXR1cChjdHgpOworCQlpZiAocmV0KSB7CisJCQltZmNfZXJyKCJGYWlsZWQgdG8gc2V0dXAgbWZjIGNvbnRyb2xzXG4iKTsKKwkJCWdvdG8gZXJyX2N0cmxzX3NldHVwOworCQl9CisJfSBlbHNlIGlmIChzNXBfbWZjX2dldF9ub2RlX3R5cGUoZmlsZSkgPT0gTUZDTk9ERV9FTkNPREVSKSB7CisJCWN0eC0+dHlwZSA9IE1GQ0lOU1RfRU5DT0RFUjsKKwkJY3R4LT5jX29wcyA9IGdldF9lbmNfY29kZWNfb3BzKCk7CisJCS8qIG9ubHkgZm9yIGVuY29kZXIgKi8KKwkJSU5JVF9MSVNUX0hFQUQoJmN0eC0+cmVmX3F1ZXVlKTsKKwkJY3R4LT5yZWZfcXVldWVfY250ID0gMDsKKwkJLyogU2V0dXAgY3RybCBoYW5kbGVyICovCisJCXJldCA9IHM1cF9tZmNfZW5jX2N0cmxzX3NldHVwKGN0eCk7CisJCWlmIChyZXQpIHsKKwkJCW1mY19lcnIoIkZhaWxlZCB0byBzZXR1cCBtZmMgY29udHJvbHNcbiIpOworCQkJZ290byBlcnJfY3RybHNfc2V0dXA7CisJCX0KKwl9IGVsc2UgeworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIGVycl9iYWRfbm9kZTsKKwl9CisJY3R4LT5maC5jdHJsX2hhbmRsZXIgPSAmY3R4LT5jdHJsX2hhbmRsZXI7CisJY3R4LT5pbnN0X25vID0gLTE7CisJLyogTG9hZCBmaXJtd2FyZSBpZiB0aGlzIGlzIHRoZSBmaXJzdCBpbnN0YW5jZSAqLworCWlmIChkZXYtPm51bV9pbnN0ID09IDEpIHsKKwkJZGV2LT53YXRjaGRvZ190aW1lci5leHBpcmVzID0gamlmZmllcyArCisJCQkJCW1zZWNzX3RvX2ppZmZpZXMoTUZDX1dBVENIRE9HX0lOVEVSVkFMKTsKKwkJYWRkX3RpbWVyKCZkZXYtPndhdGNoZG9nX3RpbWVyKTsKKwkJcmV0ID0gczVwX21mY19wb3dlcl9vbigpOworCQlpZiAocmV0IDwgMCkgeworCQkJbWZjX2VycigicG93ZXIgb24gZmFpbGVkXG4iKTsKKwkJCWdvdG8gZXJyX3B3cl9lbmFibGU7CisJCX0KKwkJczVwX21mY19jbG9ja19vbigpOworCQlyZXQgPSBzNXBfbWZjX2FsbG9jX2FuZF9sb2FkX2Zpcm13YXJlKGRldik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9hbGxvY19mdzsKKwkJLyogSW5pdCB0aGUgRlcgKi8KKwkJcmV0ID0gczVwX21mY19pbml0X2h3KGRldik7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycl9pbml0X2h3OworCQlzNXBfbWZjX2Nsb2NrX29mZigpOworCX0KKwkvKiBJbml0IHZpZGVvYnVmMiBxdWV1ZSBmb3IgQ0FQVFVSRSAqLworCXEgPSAmY3R4LT52cV9kc3Q7CisJcS0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkU7CisJcS0+ZHJ2X3ByaXYgPSAmY3R4LT5maDsKKwlpZiAoczVwX21mY19nZXRfbm9kZV90eXBlKGZpbGUpID09IE1GQ05PREVfREVDT0RFUikgeworCQlxLT5pb19tb2RlcyA9IFZCMl9NTUFQOworCQlxLT5vcHMgPSBnZXRfZGVjX3F1ZXVlX29wcygpOworCX0gZWxzZSBpZiAoczVwX21mY19nZXRfbm9kZV90eXBlKGZpbGUpID09IE1GQ05PREVfRU5DT0RFUikgeworCQlxLT5pb19tb2RlcyA9IFZCMl9NTUFQIHwgVkIyX1VTRVJQVFI7CisJCXEtPm9wcyA9IGdldF9lbmNfcXVldWVfb3BzKCk7CisJfSBlbHNlIHsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBlcnJfcXVldWVfaW5pdDsKKwl9CisJcS0+bWVtX29wcyA9IChzdHJ1Y3QgdmIyX21lbV9vcHMgKikmdmIyX2RtYV9jb250aWdfbWVtb3BzOworCXJldCA9IHZiMl9xdWV1ZV9pbml0KHEpOworCWlmIChyZXQpIHsKKwkJbWZjX2VycigiRmFpbGVkIHRvIGluaXRpYWxpemUgdmlkZW9idWYyIHF1ZXVlKGNhcHR1cmUpXG4iKTsKKwkJZ290byBlcnJfcXVldWVfaW5pdDsKKwl9CisJLyogSW5pdCB2aWRlb2J1ZjIgcXVldWUgZm9yIE9VVFBVVCAqLworCXEgPSAmY3R4LT52cV9zcmM7CisJcS0+dHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORTsKKwlxLT5pb19tb2RlcyA9IFZCMl9NTUFQOworCXEtPmRydl9wcml2ID0gJmN0eC0+Zmg7CisJaWYgKHM1cF9tZmNfZ2V0X25vZGVfdHlwZShmaWxlKSA9PSBNRkNOT0RFX0RFQ09ERVIpIHsKKwkJcS0+aW9fbW9kZXMgPSBWQjJfTU1BUDsKKwkJcS0+b3BzID0gZ2V0X2RlY19xdWV1ZV9vcHMoKTsKKwl9IGVsc2UgaWYgKHM1cF9tZmNfZ2V0X25vZGVfdHlwZShmaWxlKSA9PSBNRkNOT0RFX0VOQ09ERVIpIHsKKwkJcS0+aW9fbW9kZXMgPSBWQjJfTU1BUCB8IFZCMl9VU0VSUFRSOworCQlxLT5vcHMgPSBnZXRfZW5jX3F1ZXVlX29wcygpOworCX0gZWxzZSB7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyX3F1ZXVlX2luaXQ7CisJfQorCXEtPm1lbV9vcHMgPSAoc3RydWN0IHZiMl9tZW1fb3BzICopJnZiMl9kbWFfY29udGlnX21lbW9wczsKKwlyZXQgPSB2YjJfcXVldWVfaW5pdChxKTsKKwlpZiAocmV0KSB7CisJCW1mY19lcnIoIkZhaWxlZCB0byBpbml0aWFsaXplIHZpZGVvYnVmMiBxdWV1ZShvdXRwdXQpXG4iKTsKKwkJZ290byBlcnJfcXVldWVfaW5pdDsKKwl9CisJaW5pdF93YWl0cXVldWVfaGVhZCgmY3R4LT5xdWV1ZSk7CisJbWZjX2RlYnVnX2xlYXZlKCk7CisJcmV0dXJuIHJldDsKKwkvKiBEZWluaXQgd2hlbiBmYWlsdXJlIG9jY3VyZWQgKi8KK2Vycl9xdWV1ZV9pbml0OgorZXJyX2luaXRfaHc6CisJczVwX21mY19yZWxlYXNlX2Zpcm13YXJlKGRldik7CitlcnJfYWxsb2NfZnc6CisJZGV2LT5jdHhbY3R4LT5udW1dID0gMDsKKwlkZWxfdGltZXJfc3luYygmZGV2LT53YXRjaGRvZ190aW1lcik7CisJczVwX21mY19jbG9ja19vZmYoKTsKK2Vycl9wd3JfZW5hYmxlOgorCWlmIChkZXYtPm51bV9pbnN0ID09IDEpIHsKKwkJaWYgKHM1cF9tZmNfcG93ZXJfb2ZmKCkgPCAwKQorCQkJbWZjX2VycigicG93ZXIgb2ZmIGZhaWxlZFxuIik7CisJCXM1cF9tZmNfcmVsZWFzZV9maXJtd2FyZShkZXYpOworCX0KK2Vycl9jdHJsc19zZXR1cDoKKwlzNXBfbWZjX2RlY19jdHJsc19kZWxldGUoY3R4KTsKK2Vycl9iYWRfbm9kZToKK2Vycl9ub19jdHg6CisJdjRsMl9maF9kZWwoJmN0eC0+ZmgpOworCXY0bDJfZmhfZXhpdCgmY3R4LT5maCk7CisJa2ZyZWUoY3R4KTsKK2Vycl9hbGxvYzoKKwlkZXYtPm51bV9pbnN0LS07CisJbWZjX2RlYnVnX2xlYXZlKCk7CisJcmV0dXJuIHJldDsKK30KKworLyogUmVsZWFzZSBNRkMgY29udGV4dCAqLworc3RhdGljIGludCBzNXBfbWZjX3JlbGVhc2Uoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBmaF90b19jdHgoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IGN0eC0+ZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwltZmNfZGVidWdfZW50ZXIoKTsKKwlzNXBfbWZjX2Nsb2NrX29uKCk7CisJdmIyX3F1ZXVlX3JlbGVhc2UoJmN0eC0+dnFfc3JjKTsKKwl2YjJfcXVldWVfcmVsZWFzZSgmY3R4LT52cV9kc3QpOworCS8qIE1hcmsgY29udGV4dCBhcyBpZGxlICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+Y29uZGxvY2ssIGZsYWdzKTsKKwljbGVhcl9iaXQoY3R4LT5udW0sICZkZXYtPmN0eF93b3JrX2JpdHMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+Y29uZGxvY2ssIGZsYWdzKTsKKwkvKiBJZiBpbnN0YW5jZSB3YXMgaW5pdGlhbGlzZWQgdGhlbgorCSAqIHJldHVybiBpbnN0YW5jZSBhbmQgZnJlZSByZW9zdXJjZXMgKi8KKwlpZiAoY3R4LT5pbnN0X25vICE9IE1GQ19OT19JTlNUQU5DRV9TRVQpIHsKKwkJbWZjX2RlYnVnKDIsICJIYXMgdG8gZnJlZSBpbnN0YW5jZVxuIik7CisJCWN0eC0+c3RhdGUgPSBNRkNJTlNUX1JFVFVSTl9JTlNUOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5jb25kbG9jaywgZmxhZ3MpOworCQlzZXRfYml0KGN0eC0+bnVtLCAmZGV2LT5jdHhfd29ya19iaXRzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5jb25kbG9jaywgZmxhZ3MpOworCQlzNXBfbWZjX2NsZWFuX2N0eF9pbnRfZmxhZ3MoY3R4KTsKKwkJczVwX21mY190cnlfcnVuKGRldik7CisJCS8qIFdhaXQgdW50aWwgaW5zdGFuY2UgaXMgcmV0dXJuZWQgb3IgdGltZW91dCBvY2N1cmVkICovCisJCWlmIChzNXBfbWZjX3dhaXRfZm9yX2RvbmVfY3R4CisJCSAgICAoY3R4LCBTNVBfRklNVl9SMkhfQ01EX0NMT1NFX0lOU1RBTkNFX1JFVCwgMCkpIHsKKwkJCXM1cF9tZmNfY2xvY2tfb2ZmKCk7CisJCQltZmNfZXJyKCJFcnIgcmV0dXJuaW5nIGluc3RhbmNlXG4iKTsKKwkJfQorCQltZmNfZGVidWcoMiwgIkFmdGVyIGZyZWUgaW5zdGFuY2VcbiIpOworCQkvKiBGcmVlIHJlc291cmNlcyAqLworCQlzNXBfbWZjX3JlbGVhc2VfY29kZWNfYnVmZmVycyhjdHgpOworCQlzNXBfbWZjX3JlbGVhc2VfaW5zdGFuY2VfYnVmZmVyKGN0eCk7CisJCWlmIChjdHgtPnR5cGUgPT0gTUZDSU5TVF9ERUNPREVSKQorCQkJczVwX21mY19yZWxlYXNlX2RlY19kZXNjX2J1ZmZlcihjdHgpOworCisJCWN0eC0+aW5zdF9ubyA9IE1GQ19OT19JTlNUQU5DRV9TRVQ7CisJfQorCS8qIGhhcmR3YXJlIGxvY2tpbmcgc2NoZW1lICovCisJaWYgKGRldi0+Y3Vycl9jdHggPT0gY3R4LT5udW0pCisJCWNsZWFyX2JpdCgwLCAmZGV2LT5od19sb2NrKTsKKwlkZXYtPm51bV9pbnN0LS07CisJaWYgKGRldi0+bnVtX2luc3QgPT0gMCkgeworCQltZmNfZGVidWcoMiwgIkxhc3QgaW5zdGFuY2UgLSByZWxlYXNlIGZpcm13YXJlXG4iKTsKKwkJLyogcmVzZXQgPC0+IEYvVyByZWxlYXNlICovCisJCXM1cF9tZmNfcmVzZXQoZGV2KTsKKwkJczVwX21mY19yZWxlYXNlX2Zpcm13YXJlKGRldik7CisJCWRlbF90aW1lcl9zeW5jKCZkZXYtPndhdGNoZG9nX3RpbWVyKTsKKwkJaWYgKHM1cF9tZmNfcG93ZXJfb2ZmKCkgPCAwKQorCQkJbWZjX2VycigiUG93ZXIgb2ZmIGZhaWxlZFxuIik7CisJfQorCW1mY19kZWJ1ZygyLCAiU2h1dHRpbmcgZG93biBjbG9ja1xuIik7CisJczVwX21mY19jbG9ja19vZmYoKTsKKwlkZXYtPmN0eFtjdHgtPm51bV0gPSAwOworCXM1cF9tZmNfZGVjX2N0cmxzX2RlbGV0ZShjdHgpOworCXY0bDJfZmhfZGVsKCZjdHgtPmZoKTsKKwl2NGwyX2ZoX2V4aXQoJmN0eC0+ZmgpOworCWtmcmVlKGN0eCk7CisJbWZjX2RlYnVnX2xlYXZlKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFBvbGwgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgczVwX21mY19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBmaF90b19jdHgoZmlsZS0+cHJpdmF0ZV9kYXRhKTsKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IGN0eC0+ZGV2OworCXN0cnVjdCB2YjJfcXVldWUgKnNyY19xLCAqZHN0X3E7CisJc3RydWN0IHZiMl9idWZmZXIgKnNyY192YiA9IE5VTEwsICpkc3RfdmIgPSBOVUxMOworCXVuc2lnbmVkIGludCByYyA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNyY19xID0gJmN0eC0+dnFfc3JjOworCWRzdF9xID0gJmN0eC0+dnFfZHN0OworCS8qCisJICogVGhlcmUgaGFzIHRvIGJlIGF0IGxlYXN0IG9uZSBidWZmZXIgcXVldWVkIG9uIGVhY2ggcXVldWVkX2xpc3QsIHdoaWNoCisJICogbWVhbnMgZWl0aGVyIGluIGRyaXZlciBhbHJlYWR5IG9yIHdhaXRpbmcgZm9yIGRyaXZlciB0byBjbGFpbSBpdAorCSAqIGFuZCBzdGFydCBwcm9jZXNzaW5nLgorCSAqLworCWlmICgoIXNyY19xLT5zdHJlYW1pbmcgfHwgbGlzdF9lbXB0eSgmc3JjX3EtPnF1ZXVlZF9saXN0KSkKKwkJJiYgKCFkc3RfcS0+c3RyZWFtaW5nIHx8IGxpc3RfZW1wdHkoJmRzdF9xLT5xdWV1ZWRfbGlzdCkpKSB7CisJCXJjID0gUE9MTEVSUjsKKwkJZ290byBlbmQ7CisJfQorCW11dGV4X3VubG9jaygmZGV2LT5tZmNfbXV0ZXgpOworCXBvbGxfd2FpdChmaWxlLCAmc3JjX3EtPmRvbmVfd3EsIHdhaXQpOworCXBvbGxfd2FpdChmaWxlLCAmZHN0X3EtPmRvbmVfd3EsIHdhaXQpOworCW11dGV4X2xvY2soJmRldi0+bWZjX211dGV4KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3JjX3EtPmRvbmVfbG9jaywgZmxhZ3MpOworCWlmICghbGlzdF9lbXB0eSgmc3JjX3EtPmRvbmVfbGlzdCkpCisJCXNyY192YiA9IGxpc3RfZmlyc3RfZW50cnkoJnNyY19xLT5kb25lX2xpc3QsIHN0cnVjdCB2YjJfYnVmZmVyLAorCQkJCQkJCQlkb25lX2VudHJ5KTsKKwlpZiAoc3JjX3ZiICYmIChzcmNfdmItPnN0YXRlID09IFZCMl9CVUZfU1RBVEVfRE9ORQorCQkJCXx8IHNyY192Yi0+c3RhdGUgPT0gVkIyX0JVRl9TVEFURV9FUlJPUikpCisJCXJjIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNyY19xLT5kb25lX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZHN0X3EtPmRvbmVfbG9jaywgZmxhZ3MpOworCWlmICghbGlzdF9lbXB0eSgmZHN0X3EtPmRvbmVfbGlzdCkpCisJCWRzdF92YiA9IGxpc3RfZmlyc3RfZW50cnkoJmRzdF9xLT5kb25lX2xpc3QsIHN0cnVjdCB2YjJfYnVmZmVyLAorCQkJCQkJCQlkb25lX2VudHJ5KTsKKwlpZiAoZHN0X3ZiICYmIChkc3RfdmItPnN0YXRlID09IFZCMl9CVUZfU1RBVEVfRE9ORQorCQkJCXx8IGRzdF92Yi0+c3RhdGUgPT0gVkIyX0JVRl9TVEFURV9FUlJPUikpCisJCXJjIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHN0X3EtPmRvbmVfbG9jaywgZmxhZ3MpOworZW5kOgorCXJldHVybiByYzsKK30KKworLyogTW1hcCAqLworc3RhdGljIGludCBzNXBfbWZjX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KGZpbGUtPnByaXZhdGVfZGF0YSk7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSB2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQ7CisJaW50IHJldDsKKwlpZiAob2Zmc2V0IDwgRFNUX1FVRVVFX09GRl9CQVNFKSB7CisJCW1mY19kZWJ1ZygyLCAibW1hcGluZyBzb3VyY2VcbiIpOworCQlyZXQgPSB2YjJfbW1hcCgmY3R4LT52cV9zcmMsIHZtYSk7CisJfSBlbHNlIHsJCS8qIGNhcHR1cmUgKi8KKwkJbWZjX2RlYnVnKDIsICJtbWFwaW5nIGRlc3RpbmF0aW9uXG4iKTsKKwkJdm1hLT52bV9wZ29mZiAtPSAoRFNUX1FVRVVFX09GRl9CQVNFID4+IFBBR0VfU0hJRlQpOworCQlyZXQgPSB2YjJfbW1hcCgmY3R4LT52cV9kc3QsIHZtYSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIHY0bDIgb3BzICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfZmlsZV9vcGVyYXRpb25zIHM1cF9tZmNfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IHM1cF9tZmNfb3BlbiwKKwkucmVsZWFzZSA9IHM1cF9tZmNfcmVsZWFzZSwKKwkucG9sbCA9IHM1cF9tZmNfcG9sbCwKKwkudW5sb2NrZWRfaW9jdGwgPSB2aWRlb19pb2N0bDIsCisJLm1tYXAgPSBzNXBfbWZjX21tYXAsCit9OworCitzdGF0aWMgaW50IG1hdGNoX2NoaWxkKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKK3sKKwlpZiAoIWRldl9uYW1lKGRldikpCisJCXJldHVybiAwOworCXJldHVybiAhc3RyY21wKGRldl9uYW1lKGRldiksIChjaGFyICopZGF0YSk7Cit9CisKKworLyogTUZDIHByb2JlIGZ1bmN0aW9uICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzNXBfbWZjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXY7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmZkOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCByZXQ7CisKKwlwcl9kZWJ1ZygiJXMrK1xuIiwgX19mdW5jX18pOworCWRldiA9IGt6YWxsb2Moc2l6ZW9mICpkZXYsIEdGUF9LRVJORUwpOworCWlmICghZGV2KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vdCBlbm91Z2ggbWVtb3J5IGZvciBNRkMgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3Bpbl9sb2NrX2luaXQoJmRldi0+aXJxbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmRldi0+Y29uZGxvY2spOworCWRldi0+cGxhdF9kZXYgPSBwZGV2OworCWlmICghZGV2LT5wbGF0X2RldikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBwbGF0Zm9ybSBkYXRhIHNwZWNpZmllZFxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2RldjsKKwl9CisKKwlyZXQgPSBzNXBfbWZjX2luaXRfcG0oZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IG1mYyBjbG9jayBzb3VyY2VcbiIpOworCQlnb3RvIGVycl9jbGs7CisJfQorCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAocmVzID09IE5VTEwpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBtZW1vcnkgcmVnaW9uIHJlc291cmNlXG4iKTsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBlcnJfcmVzOworCX0KKworCWRldi0+bWZjX21lbSA9IHJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcyksCisJCQkJCSAgcGRldi0+bmFtZSk7CisJaWYgKGRldi0+bWZjX21lbSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgbWVtb3J5IHJlZ2lvblxuIik7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyX21lbV9yZWc7CisJfQorCWRldi0+cmVnc19iYXNlID0gaW9yZW1hcChkZXYtPm1mY19tZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKGRldi0+bWZjX21lbSkpOworCWlmIChkZXYtPnJlZ3NfYmFzZSA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byBpb3JlbWFwIGFkZHJlc3MgcmVnaW9uXG4iKTsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBlcnJfaW9yZW1hcDsKKwl9CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JUlEsIDApOworCWlmIChyZXMgPT0gTlVMTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gZ2V0IGlycSByZXNvdXJjZVxuIik7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyX2dldF9yZXM7CisJfQorCWRldi0+aXJxID0gcmVzLT5zdGFydDsKKwlyZXQgPSByZXF1ZXN0X2lycShkZXYtPmlycSwgczVwX21mY19pcnEsIElSUUZfRElTQUJMRUQsIHBkZXYtPm5hbWUsCisJCQkJCQkJCQlkZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGluc3RhbGwgaXJxICglZClcbiIsIHJldCk7CisJCWdvdG8gZXJyX3JlcV9pcnE7CisJfQorCisJZGV2LT5tZW1fZGV2X2wgPSBkZXZpY2VfZmluZF9jaGlsZCgmZGV2LT5wbGF0X2Rldi0+ZGV2LCAiczVwLW1mYy1sIiwKKwkJCQkJICAgbWF0Y2hfY2hpbGQpOworCWlmICghZGV2LT5tZW1fZGV2X2wpIHsKKwkJbWZjX2VycigiTWVtIGNoaWxkIChMKSBkZXZpY2UgZ2V0IGZhaWxlZFxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2ZpbmRfY2hpbGQ7CisJfQorCWRldi0+bWVtX2Rldl9yID0gZGV2aWNlX2ZpbmRfY2hpbGQoJmRldi0+cGxhdF9kZXYtPmRldiwgInM1cC1tZmMtciIsCisJCQkJCSAgIG1hdGNoX2NoaWxkKTsKKwlpZiAoIWRldi0+bWVtX2Rldl9yKSB7CisJCW1mY19lcnIoIk1lbSBjaGlsZCAoUikgZGV2aWNlIGdldCBmYWlsZWRcbiIpOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycl9maW5kX2NoaWxkOworCX0KKworCWRldi0+YWxsb2NfY3R4WzBdID0gdmIyX2RtYV9jb250aWdfaW5pdF9jdHgoZGV2LT5tZW1fZGV2X2wpOworCWlmIChJU19FUlJfT1JfTlVMTChkZXYtPmFsbG9jX2N0eFswXSkpIHsKKwkJcmV0ID0gUFRSX0VSUihkZXYtPmFsbG9jX2N0eFswXSk7CisJCWdvdG8gZXJyX21lbV9pbml0X2N0eF8wOworCX0KKwlkZXYtPmFsbG9jX2N0eFsxXSA9IHZiMl9kbWFfY29udGlnX2luaXRfY3R4KGRldi0+bWVtX2Rldl9yKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoZGV2LT5hbGxvY19jdHhbMV0pKSB7CisJCXJldCA9IFBUUl9FUlIoZGV2LT5hbGxvY19jdHhbMV0pOworCQlnb3RvIGVycl9tZW1faW5pdF9jdHhfMTsKKwl9CisKKwltdXRleF9pbml0KCZkZXYtPm1mY19tdXRleCk7CisKKwlyZXQgPSB2NGwyX2RldmljZV9yZWdpc3RlcigmcGRldi0+ZGV2LCAmZGV2LT52NGwyX2Rldik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfdjRsMl9kZXZfcmVnOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRldi0+cXVldWUpOworCisJLyogZGVjb2RlciAqLworCXZmZCA9IHZpZGVvX2RldmljZV9hbGxvYygpOworCWlmICghdmZkKSB7CisJCXY0bDJfZXJyKCZkZXYtPnY0bDJfZGV2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIHZpZGVvIGRldmljZVxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2RlY19hbGxvYzsKKwl9CisJdmZkLT5mb3BzCT0gJnM1cF9tZmNfZm9wcywKKwl2ZmQtPmlvY3RsX29wcwk9IGdldF9kZWNfdjRsMl9pb2N0bF9vcHMoKTsKKwl2ZmQtPnJlbGVhc2UJPSB2aWRlb19kZXZpY2VfcmVsZWFzZSwKKwl2ZmQtPmxvY2sJPSAmZGV2LT5tZmNfbXV0ZXg7CisJdmZkLT52NGwyX2Rldgk9ICZkZXYtPnY0bDJfZGV2OworCXNucHJpbnRmKHZmZC0+bmFtZSwgc2l6ZW9mKHZmZC0+bmFtZSksICIlcyIsIFM1UF9NRkNfREVDX05BTUUpOworCWRldi0+dmZkX2RlYwk9IHZmZDsKKwlyZXQgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UodmZkLCBWRkxfVFlQRV9HUkFCQkVSLCAwKTsKKwlpZiAocmV0KSB7CisJCXY0bDJfZXJyKCZkZXYtPnY0bDJfZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHZpZGVvIGRldmljZVxuIik7CisJCXZpZGVvX2RldmljZV9yZWxlYXNlKHZmZCk7CisJCWdvdG8gZXJyX2RlY19yZWc7CisJfQorCXY0bDJfaW5mbygmZGV2LT52NGwyX2RldiwKKwkJICAiZGVjb2RlciByZWdpc3RlcmVkIGFzIC9kZXYvdmlkZW8lZFxuIiwgdmZkLT5udW0pOworCXZpZGVvX3NldF9kcnZkYXRhKHZmZCwgZGV2KTsKKworCS8qIGVuY29kZXIgKi8KKwl2ZmQgPSB2aWRlb19kZXZpY2VfYWxsb2MoKTsKKwlpZiAoIXZmZCkgeworCQl2NGwyX2VycigmZGV2LT52NGwyX2RldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSB2aWRlbyBkZXZpY2VcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9lbmNfYWxsb2M7CisJfQorCXZmZC0+Zm9wcwk9ICZzNXBfbWZjX2ZvcHMsCisJdmZkLT5pb2N0bF9vcHMJPSBnZXRfZW5jX3Y0bDJfaW9jdGxfb3BzKCk7CisJdmZkLT5yZWxlYXNlCT0gdmlkZW9fZGV2aWNlX3JlbGVhc2UsCisJdmZkLT5sb2NrCT0gJmRldi0+bWZjX211dGV4OworCXZmZC0+djRsMl9kZXYJPSAmZGV2LT52NGwyX2RldjsKKwlzbnByaW50Zih2ZmQtPm5hbWUsIHNpemVvZih2ZmQtPm5hbWUpLCAiJXMiLCBTNVBfTUZDX0VOQ19OQU1FKTsKKwlkZXYtPnZmZF9lbmMJPSB2ZmQ7CisJcmV0ID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHZmZCwgVkZMX1RZUEVfR1JBQkJFUiwgMCk7CisJaWYgKHJldCkgeworCQl2NGwyX2VycigmZGV2LT52NGwyX2RldiwgIkZhaWxlZCB0byByZWdpc3RlciB2aWRlbyBkZXZpY2VcbiIpOworCQl2aWRlb19kZXZpY2VfcmVsZWFzZSh2ZmQpOworCQlnb3RvIGVycl9lbmNfcmVnOworCX0KKwl2NGwyX2luZm8oJmRldi0+djRsMl9kZXYsCisJCSAgImVuY29kZXIgcmVnaXN0ZXJlZCBhcyAvZGV2L3ZpZGVvJWRcbiIsIHZmZC0+bnVtKTsKKwl2aWRlb19zZXRfZHJ2ZGF0YSh2ZmQsIGRldik7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCWRldi0+aHdfbG9jayA9IDA7CisJZGV2LT53YXRjaGRvZ193b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZShTNVBfTUZDX05BTUUpOworCUlOSVRfV09SSygmZGV2LT53YXRjaGRvZ193b3JrLCBzNXBfbWZjX3dhdGNoZG9nX3dvcmtlcik7CisJYXRvbWljX3NldCgmZGV2LT53YXRjaGRvZ19jbnQsIDApOworCWluaXRfdGltZXIoJmRldi0+d2F0Y2hkb2dfdGltZXIpOworCWRldi0+d2F0Y2hkb2dfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWRldjsKKwlkZXYtPndhdGNoZG9nX3RpbWVyLmZ1bmN0aW9uID0gczVwX21mY193YXRjaGRvZzsKKworCXByX2RlYnVnKCIlcy0tXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7CisKKy8qIERlaW5pdCBNRkMgaWYgcHJvYmUgaGFkIGZhaWxlZCAqLworZXJyX2VuY19yZWc6CisJdmlkZW9fZGV2aWNlX3JlbGVhc2UoZGV2LT52ZmRfZW5jKTsKK2Vycl9lbmNfYWxsb2M6CisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoZGV2LT52ZmRfZGVjKTsKK2Vycl9kZWNfcmVnOgorCXZpZGVvX2RldmljZV9yZWxlYXNlKGRldi0+dmZkX2RlYyk7CitlcnJfZGVjX2FsbG9jOgorCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJmRldi0+djRsMl9kZXYpOworZXJyX3Y0bDJfZGV2X3JlZzoKKwl2YjJfZG1hX2NvbnRpZ19jbGVhbnVwX2N0eChkZXYtPmFsbG9jX2N0eFsxXSk7CitlcnJfbWVtX2luaXRfY3R4XzE6CisJdmIyX2RtYV9jb250aWdfY2xlYW51cF9jdHgoZGV2LT5hbGxvY19jdHhbMF0pOworZXJyX21lbV9pbml0X2N0eF8wOgorZXJyX2ZpbmRfY2hpbGQ6CisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CitlcnJfcmVxX2lycToKK2Vycl9nZXRfcmVzOgorCWlvdW5tYXAoZGV2LT5yZWdzX2Jhc2UpOworCWRldi0+cmVnc19iYXNlID0gTlVMTDsKK2Vycl9pb3JlbWFwOgorCXJlbGVhc2VfcmVzb3VyY2UoZGV2LT5tZmNfbWVtKTsKKwlrZnJlZShkZXYtPm1mY19tZW0pOworZXJyX21lbV9yZWc6CitlcnJfcmVzOgorCXM1cF9tZmNfZmluYWxfcG0oZGV2KTsKK2Vycl9jbGs6CitlcnJfZGV2OgorCWtmcmVlKGRldik7CisJcHJfZGVidWcoIiVzLS0gd2l0aCBlcnJvclxuIiwgX19mdW5jX18pOworCXJldHVybiByZXQ7CisKK30KKworLyogUmVtb3ZlIHRoZSBkcml2ZXIgKi8KK3N0YXRpYyBpbnQgX19kZXZleGl0IHM1cF9tZmNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXY0bDJfaW5mbygmZGV2LT52NGwyX2RldiwgIlJlbW92aW5nICVzXG4iLCBwZGV2LT5uYW1lKTsKKworCWRlbF90aW1lcl9zeW5jKCZkZXYtPndhdGNoZG9nX3RpbWVyKTsKKwlmbHVzaF93b3JrcXVldWUoZGV2LT53YXRjaGRvZ193b3JrcXVldWUpOworCWRlc3Ryb3lfd29ya3F1ZXVlKGRldi0+d2F0Y2hkb2dfd29ya3F1ZXVlKTsKKworCXZpZGVvX3VucmVnaXN0ZXJfZGV2aWNlKGRldi0+dmZkX2VuYyk7CisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoZGV2LT52ZmRfZGVjKTsKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyKCZkZXYtPnY0bDJfZGV2KTsKKwl2YjJfZG1hX2NvbnRpZ19jbGVhbnVwX2N0eChkZXYtPmFsbG9jX2N0eFswXSk7CisJdmIyX2RtYV9jb250aWdfY2xlYW51cF9jdHgoZGV2LT5hbGxvY19jdHhbMV0pOworCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJaW91bm1hcChkZXYtPnJlZ3NfYmFzZSk7CisJaWYgKGRldi0+bWZjX21lbSkgeworCQlyZWxlYXNlX3Jlc291cmNlKGRldi0+bWZjX21lbSk7CisJCWtmcmVlKGRldi0+bWZjX21lbSk7CisJCWRldi0+bWZjX21lbSA9IE5VTEw7CisJfQorCXM1cF9tZmNfZmluYWxfcG0oZGV2KTsKKwlrZnJlZShkZXYpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCisKK3N0YXRpYyBpbnQgczVwX21mY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHM1cF9tZmNfZGV2ICptX2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCWludCByZXQ7CisKKwlpZiAobV9kZXYtPm51bV9pbnN0ID09IDApCisJCXJldHVybiAwOworCXJldHVybiBzNXBfbWZjX3NsZWVwKG1fZGV2KTsKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmbV9kZXYtPmVudGVyX3N1c3BlbmQpICE9IDApIHsKKwkJbWZjX2VycigiRXJyb3I6IGdvaW5nIHRvIHN1c3BlbmQgZm9yIGEgc2Vjb25kIHRpbWVcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBDaGVjayBpZiB3ZSdyZSBwcm9jZXNzaW5nIHRoZW4gd2FpdCBpZiBpdCBuZWNlc3NhcnkuICovCisJd2hpbGUgKHRlc3RfYW5kX3NldF9iaXQoMCwgJm1fZGV2LT5od19sb2NrKSAhPSAwKSB7CisJCS8qIFRyeSBhbmQgbG9jayB0aGUgSFcgKi8KKwkJLyogV2FpdCBvbiB0aGUgaW50ZXJydXB0IHdhaXRxdWV1ZSAqLworCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChtX2Rldi0+cXVldWUsCisJCQltX2Rldi0+aW50X2NvbmQgfHwgbV9kZXYtPmN0eFttX2Rldi0+Y3Vycl9jdHhdLT5pbnRfY29uZCwKKwkJCW1zZWNzX3RvX2ppZmZpZXMoTUZDX0lOVF9USU1FT1VUKSk7CisKKwkJaWYgKHJldCA9PSAwKSB7CisJCQltZmNfZXJyKCJXYWl0aW5nIGZvciBoYXJkd2FyZSB0byBmaW5pc2ggdGltZWQgb3V0XG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHM1cF9tZmNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2ID0gdG9fcGxhdGZvcm1fZGV2aWNlKGRldik7CisJc3RydWN0IHM1cF9tZmNfZGV2ICptX2RldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKG1fZGV2LT5udW1faW5zdCA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gczVwX21mY193YWtldXAobV9kZXYpOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUE1fUlVOVElNRQorc3RhdGljIGludCBzNXBfbWZjX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBzNXBfbWZjX2RldiAqbV9kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCWF0b21pY19zZXQoJm1fZGV2LT5wbS5wb3dlciwgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczVwX21mY19ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkZXYpOworCXN0cnVjdCBzNXBfbWZjX2RldiAqbV9kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlpbnQgcHJlX3Bvd2VyOworCisJaWYgKCFtX2Rldi0+YWxsb2NfY3R4KQorCQlyZXR1cm4gMDsKKwlwcmVfcG93ZXIgPSBhdG9taWNfcmVhZCgmbV9kZXYtPnBtLnBvd2VyKTsKKwlhdG9taWNfc2V0KCZtX2Rldi0+cG0ucG93ZXIsIDEpOworCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qIFBvd2VyIG1hbmFnZW1lbnQgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBzNXBfbWZjX3BtX29wcyA9IHsKKwlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhzNXBfbWZjX3N1c3BlbmQsIHM1cF9tZmNfcmVzdW1lKQorCVNFVF9SVU5USU1FX1BNX09QUyhzNXBfbWZjX3J1bnRpbWVfc3VzcGVuZCwgczVwX21mY19ydW50aW1lX3Jlc3VtZSwKKwkJCSAgIE5VTEwpCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzNXBfbWZjX3BkcnYgPSB7CisJLnByb2JlCT0gczVwX21mY19wcm9iZSwKKwkucmVtb3ZlCT0gX19kZXZleGl0X3AoczVwX21mY19yZW1vdmUpLAorCS5kcml2ZXIJPSB7CisJCS5uYW1lCT0gUzVQX01GQ19OQU1FLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLnBtCT0gJnM1cF9tZmNfcG1fb3BzCisJfSwKK307CisKK3N0YXRpYyBjaGFyIGJhbm5lcltdIF9faW5pdGRhdGEgPQorCQkJIlM1UCBNRkMgVjRMMiBEcml2ZXIsIChDKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3NcbiI7CisKK3N0YXRpYyBpbnQgX19pbml0IHM1cF9tZmNfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlwcl9pbmZvKCIlcyIsIGJhbm5lcik7CisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzNXBfbWZjX3BkcnYpOworCWlmIChyZXQpCisJCXByX2VycigiUGxhdGZvcm0gZGV2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWQuXG4iKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgczVwX21mY19leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnM1cF9tZmNfcGRydik7Cit9CisKK21vZHVsZV9pbml0KHM1cF9tZmNfaW5pdCk7Cittb2R1bGVfZXhpdChzNXBfbWZjX2V4aXQpOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJLYW1pbCBEZWJza2kgPGsuZGVic2tpQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTYW1zdW5nIFM1UCBNdWx0aSBGb3JtYXQgQ29kZWMgVjRMMiBkcml2ZXIiKTsKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfY21kLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19jbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDY2NWVkCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfY21kLmMKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19jbWQuYworICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSAicmVncy1tZmMuaCIKKyNpbmNsdWRlICJzNXBfbWZjX2NtZC5oIgorI2luY2x1ZGUgInM1cF9tZmNfY29tbW9uLmgiCisjaW5jbHVkZSAiczVwX21mY19kZWJ1Zy5oIgorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2VuZCBhIGNvbW1hbmQgdG8gdGhlIE1GQyAqLworc3RhdGljIGludCBzNXBfbWZjX2NtZF9ob3N0MnJpc2Moc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYsIGludCBjbWQsCisJCQkJCQlzdHJ1Y3QgczVwX21mY19jbWRfYXJncyAqYXJncykKK3sKKwlpbnQgY3VyX2NtZDsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisKKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoTUZDX0JXX1RJTUVPVVQpOworCS8qIHdhaXQgdW50aWwgaG9zdCB0byByaXNjIGNvbW1hbmQgcmVnaXN0ZXIgYmVjb21lcyAnSDJSX0NNRF9FTVBUWScgKi8KKwlkbyB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQltZmNfZXJyKCJUaW1lb3V0IHdoaWxlIHdhaXRpbmcgZm9yIGhhcmR3YXJlXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWN1cl9jbWQgPSBtZmNfcmVhZChkZXYsIFM1UF9GSU1WX0hPU1QyUklTQ19DTUQpOworCX0gd2hpbGUgKGN1cl9jbWQgIT0gUzVQX0ZJTVZfSDJSX0NNRF9FTVBUWSk7CisJbWZjX3dyaXRlKGRldiwgYXJncy0+YXJnWzBdLCBTNVBfRklNVl9IT1NUMlJJU0NfQVJHMSk7CisJbWZjX3dyaXRlKGRldiwgYXJncy0+YXJnWzFdLCBTNVBfRklNVl9IT1NUMlJJU0NfQVJHMik7CisJbWZjX3dyaXRlKGRldiwgYXJncy0+YXJnWzJdLCBTNVBfRklNVl9IT1NUMlJJU0NfQVJHMyk7CisJbWZjX3dyaXRlKGRldiwgYXJncy0+YXJnWzNdLCBTNVBfRklNVl9IT1NUMlJJU0NfQVJHNCk7CisJLyogSXNzdWUgdGhlIGNvbW1hbmQgKi8KKwltZmNfd3JpdGUoZGV2LCBjbWQsIFM1UF9GSU1WX0hPU1QyUklTQ19DTUQpOworCXJldHVybiAwOworfQorCisvKiBJbml0aWFsaXplIHRoZSBNRkMgKi8KK2ludCBzNXBfbWZjX3N5c19pbml0X2NtZChzdHJ1Y3QgczVwX21mY19kZXYgKmRldikKK3sKKwlzdHJ1Y3QgczVwX21mY19jbWRfYXJncyBoMnJfYXJnczsKKworCW1lbXNldCgmaDJyX2FyZ3MsIDAsIHNpemVvZihzdHJ1Y3QgczVwX21mY19jbWRfYXJncykpOworCWgycl9hcmdzLmFyZ1swXSA9IGRldi0+Zndfc2l6ZTsKKwlyZXR1cm4gczVwX21mY19jbWRfaG9zdDJyaXNjKGRldiwgUzVQX0ZJTVZfSDJSX0NNRF9TWVNfSU5JVCwgJmgycl9hcmdzKTsKK30KKworLyogU3VzcGVuZCB0aGUgTUZDIGhhcmR3YXJlICovCitpbnQgczVwX21mY19zbGVlcF9jbWQoc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYpCit7CisJc3RydWN0IHM1cF9tZmNfY21kX2FyZ3MgaDJyX2FyZ3M7CisKKwltZW1zZXQoJmgycl9hcmdzLCAwLCBzaXplb2Yoc3RydWN0IHM1cF9tZmNfY21kX2FyZ3MpKTsKKwlyZXR1cm4gczVwX21mY19jbWRfaG9zdDJyaXNjKGRldiwgUzVQX0ZJTVZfSDJSX0NNRF9TTEVFUCwgJmgycl9hcmdzKTsKK30KKworLyogV2FrZSB1cCB0aGUgTUZDIGhhcmR3YXJlICovCitpbnQgczVwX21mY193YWtldXBfY21kKHN0cnVjdCBzNXBfbWZjX2RldiAqZGV2KQoreworCXN0cnVjdCBzNXBfbWZjX2NtZF9hcmdzIGgycl9hcmdzOworCisJbWVtc2V0KCZoMnJfYXJncywgMCwgc2l6ZW9mKHN0cnVjdCBzNXBfbWZjX2NtZF9hcmdzKSk7CisJcmV0dXJuIHM1cF9tZmNfY21kX2hvc3QycmlzYyhkZXYsIFM1UF9GSU1WX0gyUl9DTURfV0FLRVVQLCAmaDJyX2FyZ3MpOworfQorCisKK2ludCBzNXBfbWZjX29wZW5faW5zdF9jbWQoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKwlzdHJ1Y3QgczVwX21mY19jbWRfYXJncyBoMnJfYXJnczsKKwlpbnQgcmV0OworCisJLyogUHJlcGFyaW5nIGRlY29kaW5nIC0gZ2V0dGluZyBpbnN0YW5jZSBudW1iZXIgKi8KKwltZmNfZGVidWcoMiwgIkdldHRpbmcgaW5zdGFuY2UgbnVtYmVyIChjb2RlYzogJWQpXG4iLCBjdHgtPmNvZGVjX21vZGUpOworCWRldi0+Y3Vycl9jdHggPSBjdHgtPm51bTsKKwltZW1zZXQoJmgycl9hcmdzLCAwLCBzaXplb2Yoc3RydWN0IHM1cF9tZmNfY21kX2FyZ3MpKTsKKwloMnJfYXJncy5hcmdbMF0gPSBjdHgtPmNvZGVjX21vZGU7CisJaDJyX2FyZ3MuYXJnWzFdID0gMDsgLyogbm8gY3JjICYgbm8gcGl4ZWxjYWNoZSAqLworCWgycl9hcmdzLmFyZ1syXSA9IGN0eC0+Y3R4X29mczsKKwloMnJfYXJncy5hcmdbM10gPSBjdHgtPmN0eF9zaXplOworCXJldCA9IHM1cF9tZmNfY21kX2hvc3QycmlzYyhkZXYsIFM1UF9GSU1WX0gyUl9DTURfT1BFTl9JTlNUQU5DRSwKKwkJCQkJCQkJJmgycl9hcmdzKTsKKwlpZiAocmV0KSB7CisJCW1mY19lcnIoIkZhaWxlZCB0byBjcmVhdGUgYSBuZXcgaW5zdGFuY2VcbiIpOworCQljdHgtPnN0YXRlID0gTUZDSU5TVF9FUlJPUjsKKwl9CisJcmV0dXJuIHJldDsKK30KKworaW50IHM1cF9tZmNfY2xvc2VfaW5zdF9jbWQoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKwlzdHJ1Y3QgczVwX21mY19jbWRfYXJncyBoMnJfYXJnczsKKwlpbnQgcmV0OworCisJaWYgKGN0eC0+c3RhdGUgPT0gTUZDSU5TVF9GUkVFKSB7CisJCW1mY19lcnIoIkluc3RhbmNlIGFscmVhZHkgcmV0dXJuZWRcbiIpOworCQljdHgtPnN0YXRlID0gTUZDSU5TVF9FUlJPUjsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIENsb3NpbmcgZGVjb2RpbmcgaW5zdGFuY2UgICovCisJbWZjX2RlYnVnKDIsICJSZXR1cm5pbmcgaW5zdGFuY2UgbnVtYmVyICVkXG4iLCBjdHgtPmluc3Rfbm8pOworCWRldi0+Y3Vycl9jdHggPSBjdHgtPm51bTsKKwltZW1zZXQoJmgycl9hcmdzLCAwLCBzaXplb2Yoc3RydWN0IHM1cF9tZmNfY21kX2FyZ3MpKTsKKwloMnJfYXJncy5hcmdbMF0gPSBjdHgtPmluc3Rfbm87CisJcmV0ID0gczVwX21mY19jbWRfaG9zdDJyaXNjKGRldiwgUzVQX0ZJTVZfSDJSX0NNRF9DTE9TRV9JTlNUQU5DRSwKKwkJCQkJCQkJJmgycl9hcmdzKTsKKwlpZiAocmV0KSB7CisJCW1mY19lcnIoIkZhaWxlZCB0byByZXR1cm4gYW4gaW5zdGFuY2VcbiIpOworCQljdHgtPnN0YXRlID0gTUZDSU5TVF9FUlJPUjsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19jbWQuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2NtZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZWViZmUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19jbWQuaApAQCAtMCwwICsxLDMwIEBACisvKgorICogbGludXgvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfY21kLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBTNVBfTUZDX0NNRF9IXworI2RlZmluZSBTNVBfTUZDX0NNRF9IXworCisjaW5jbHVkZSAiczVwX21mY19jb21tb24uaCIKKworI2RlZmluZSBNQVhfSDJSX0FSRwk0CisKK3N0cnVjdCBzNXBfbWZjX2NtZF9hcmdzIHsKKwl1bnNpZ25lZCBpbnQJYXJnW01BWF9IMlJfQVJHXTsKK307CisKK2ludCBzNXBfbWZjX3N5c19pbml0X2NtZChzdHJ1Y3QgczVwX21mY19kZXYgKmRldik7CitpbnQgczVwX21mY19zbGVlcF9jbWQoc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYpOworaW50IHM1cF9tZmNfd2FrZXVwX2NtZChzdHJ1Y3QgczVwX21mY19kZXYgKmRldik7CitpbnQgczVwX21mY19vcGVuX2luc3RfY21kKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KTsKK2ludCBzNXBfbWZjX2Nsb3NlX2luc3RfY21kKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KTsKKworI2VuZGlmIC8qIFM1UF9NRkNfQ01EX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19jb21tb24uaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMTQ2ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19jb21tb24uaApAQCAtMCwwICsxLDU3MiBAQAorLyoKKyAqIFNhbXN1bmcgUzVQIE11bHRpIEZvcm1hdCBDb2RlYyB2IDUuMAorICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyBvZiBlbnVtcyBhbmQgc3RydWN0cyB1c2VkIGJ5IHRoZSBjb2RlYworICogZHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICogS2FtaWwgRGVic2tpLCA8ay5kZWJza2lAc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZQorICogTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgorICovCisKKyNpZm5kZWYgUzVQX01GQ19DT01NT05fSF8KKyNkZWZpbmUgUzVQX01GQ19DT01NT05fSF8KKworI2luY2x1ZGUgInJlZ3MtbWZjLmgiCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgorI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi1jb3JlLmg+CisKKy8qIERlZmluaXRpb25zIHJlbGF0ZWQgdG8gTUZDIG1lbW9yeSAqLworCisvKiBPZmZzZXQgYmFzZSB1c2VkIHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBDQVBUVVJFIGFuZCBPVVRQVVQKKyogIHdoaWxlIG1tYXBpbmcgKi8KKyNkZWZpbmUgRFNUX1FVRVVFX09GRl9CQVNFICAgICAgKFRBU0tfU0laRSAvIDIpCisKKy8qIE9mZnNldCB1c2VkIGJ5IHRoZSBoYXJkd2FyZSB0byBzdG9yZSBhZGRyZXNzZXMgKi8KKyNkZWZpbmUgTUZDX09GRlNFVF9TSElGVAkxMQorCisjZGVmaW5lIEZJUk1XQVJFX0FMSUdOCQkweDIwMDAwCQkvKiAxMjhLQiAqLworI2RlZmluZSBNRkNfSDI2NF9DVFhfQlVGX1NJWkUJMHg5NjAwMAkJLyogNjAwS0IgcGVyIEgyNjQgaW5zdGFuY2UgKi8KKyNkZWZpbmUgTUZDX0NUWF9CVUZfU0laRQkweDI4MDAJCS8qIDEwS0IgcGVyIGluc3RhbmNlICovCisjZGVmaW5lIERFU0NfQlVGX1NJWkUJCTB4MjAwMDAJCS8qIDEyOEtCIGZvciBERVNDIGJ1ZmZlciAqLworI2RlZmluZSBTSEFSRURfQlVGX1NJWkUJCTB4MjAwMAkJLyogOEtCIGZvciBzaGFyZWQgYnVmZmVyICovCisKKyNkZWZpbmUgREVGX0NQQl9TSVpFCQkweDQwMDAwCQkvKiA1MTJLQiAqLworCisjZGVmaW5lIE1GQ19CQU5LMV9BTExPQ19DVFgJMAorI2RlZmluZSBNRkNfQkFOSzJfQUxMT0NfQ1RYCTEKKworI2RlZmluZSBNRkNfQkFOSzFfQUxJR05fT1JERVIJMTMKKyNkZWZpbmUgTUZDX0JBTksyX0FMSUdOX09SREVSCTEzCisjZGVmaW5lIE1GQ19CQVNFX0FMSUdOX09SREVSCTE3CisKKyNpbmNsdWRlIDxtZWRpYS92aWRlb2J1ZjItZG1hLWNvbnRpZy5oPgorCitzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QgczVwX21mY19tZW1fY29va2llKHZvaWQgKmEsIHZvaWQgKmIpCit7CisJLyogU2FtZSBmdW5jdGlvbmFsaXR5IGFzIHRoZSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkciAqLworCWRtYV9hZGRyX3QgKnBhZGRyID0gdmIyX2RtYV9jb250aWdfbWVtb3BzLmNvb2tpZShiKTsKKworCXJldHVybiAqcGFkZHI7Cit9CisKKy8qIE1GQyBkZWZpbml0aW9ucyAqLworI2RlZmluZSBNRkNfTUFYX0VYVFJBX0RQQiAgICAgICA1CisjZGVmaW5lIE1GQ19NQVhfQlVGRkVSUwkJMzIKKyNkZWZpbmUgTUZDX05VTV9DT05URVhUUwk0CisvKiBJbnRlcnJ1cHQgdGltZW91dCAqLworI2RlZmluZSBNRkNfSU5UX1RJTUVPVVQJCTIwMDAKKy8qIEJ1c3kgd2FpdCB0aW1lb3V0ICovCisjZGVmaW5lIE1GQ19CV19USU1FT1VUCQk1MDAKKy8qIFdhdGNoZG9nIGludGVydmFsICovCisjZGVmaW5lIE1GQ19XQVRDSERPR19JTlRFUlZBTCAgIDEwMDAKKy8qIEFmdGVyIGhvdyBtYW55IGV4ZWN1dGlvbnMgd2F0Y2hkb2cgc2hvdWxkIGFzc3VtZSBsb2NrIHVwICovCisjZGVmaW5lIE1GQ19XQVRDSERPR19DTlQgICAgICAgIDEwCisjZGVmaW5lIE1GQ19OT19JTlNUQU5DRV9TRVQJLTEKKyNkZWZpbmUgTUZDX0VOQ19DQVBfUExBTkVfQ09VTlQJMQorI2RlZmluZSBNRkNfRU5DX09VVF9QTEFORV9DT1VOVAkyCisjZGVmaW5lIFNUVUZGX0JZVEUJCTQKKyNkZWZpbmUgTUZDX01BWF9DVFJMUwkJNjQKKworI2RlZmluZSBtZmNfcmVhZChkZXYsIG9mZnNldCkJCXJlYWRsKGRldi0+cmVnc19iYXNlICsgKG9mZnNldCkpCisjZGVmaW5lIG1mY193cml0ZShkZXYsIGRhdGEsIG9mZnNldCkJd3JpdGVsKChkYXRhKSwgZGV2LT5yZWdzX2Jhc2UgKyBcCisJCQkJCQkJCShvZmZzZXQpKQorCisvKioKKyAqIGVudW0gczVwX21mY19mbXRfdHlwZSAtIHR5cGUgb2YgdGhlIHBpeGVsZm9ybWF0CisgKi8KK2VudW0gczVwX21mY19mbXRfdHlwZSB7CisJTUZDX0ZNVF9ERUMsCisJTUZDX0ZNVF9FTkMsCisJTUZDX0ZNVF9SQVcsCit9OworCisvKioKKyAqIGVudW0gczVwX21mY19ub2RlX3R5cGUgLSBUaGUgdHlwZSBvZiBhbiBNRkMgZGV2aWNlIG5vZGUuCisgKi8KK2VudW0gczVwX21mY19ub2RlX3R5cGUgeworCU1GQ05PREVfSU5WQUxJRCA9IC0xLAorCU1GQ05PREVfREVDT0RFUiA9IDAsCisJTUZDTk9ERV9FTkNPREVSID0gMSwKK307CisKKy8qKgorICogZW51bSBzNXBfbWZjX2luc3RfdHlwZSAtIFRoZSB0eXBlIG9mIGFuIE1GQyBpbnN0YW5jZS4KKyAqLworZW51bSBzNXBfbWZjX2luc3RfdHlwZSB7CisJTUZDSU5TVF9JTlZBTElELAorCU1GQ0lOU1RfREVDT0RFUiwKKwlNRkNJTlNUX0VOQ09ERVIsCit9OworCisvKioKKyAqIGVudW0gczVwX21mY19pbnN0X3N0YXRlIC0gVGhlIHN0YXRlIG9mIGFuIE1GQyBpbnN0YW5jZS4KKyAqLworZW51bSBzNXBfbWZjX2luc3Rfc3RhdGUgeworCU1GQ0lOU1RfRlJFRSA9IDAsCisJTUZDSU5TVF9JTklUID0gMTAwLAorCU1GQ0lOU1RfR09UX0lOU1QsCisJTUZDSU5TVF9IRUFEX1BBUlNFRCwKKwlNRkNJTlNUX0JVRlNfU0VULAorCU1GQ0lOU1RfUlVOTklORywKKwlNRkNJTlNUX0ZJTklTSElORywKKwlNRkNJTlNUX0ZJTklTSEVELAorCU1GQ0lOU1RfUkVUVVJOX0lOU1QsCisJTUZDSU5TVF9FUlJPUiwKKwlNRkNJTlNUX0FCT1JULAorCU1GQ0lOU1RfUkVTX0NIQU5HRV9JTklULAorCU1GQ0lOU1RfUkVTX0NIQU5HRV9GTFVTSCwKKwlNRkNJTlNUX1JFU19DSEFOR0VfRU5ELAorfTsKKworLyoqCisgKiBlbnVtIHM1cF9tZmNfcXVldWVfc3RhdGUgLSBUaGUgc3RhdGUgb2YgYnVmZmVyIHF1ZXVlLgorICovCitlbnVtIHM1cF9tZmNfcXVldWVfc3RhdGUgeworCVFVRVVFX0ZSRUUsCisJUVVFVUVfQlVGU19SRVFVRVNURUQsCisJUVVFVUVfQlVGU19RVUVSSUVELAorCVFVRVVFX0JVRlNfTU1BUEVELAorfTsKKworLyoqCisgKiBlbnVtIHM1cF9tZmNfZGVjb2RlX2FyZyAtIHR5cGUgb2YgZnJhbWUgZGVjb2RpbmcKKyAqLworZW51bSBzNXBfbWZjX2RlY29kZV9hcmcgeworCU1GQ19ERUNfRlJBTUUsCisJTUZDX0RFQ19MQVNUX0ZSQU1FLAorCU1GQ19ERUNfUkVTX0NIQU5HRSwKK307CisKK3N0cnVjdCBzNXBfbWZjX2N0eDsKKworLyoqCisgKiBzdHJ1Y3QgczVwX21mY19idWYgLSBNRkMgYnVmZmVyCisgKi8KK3N0cnVjdCBzNXBfbWZjX2J1ZiB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCB2YjJfYnVmZmVyICpiOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXNpemVfdCBsdW1hOworCQkJc2l6ZV90IGNocm9tYTsKKwkJfSByYXc7CisJCXNpemVfdCBzdHJlYW07CisJfSBjb29raWU7CisJaW50IHVzZWQ7Cit9OworCisvKioKKyAqIHN0cnVjdCBzNXBfbWZjX3BtIC0gcG93ZXIgbWFuYWdlbWVudCBkYXRhIHN0cnVjdHVyZQorICovCitzdHJ1Y3QgczVwX21mY19wbSB7CisJc3RydWN0IGNsawkqY2xvY2s7CisJc3RydWN0IGNsawkqY2xvY2tfZ2F0ZTsKKwlhdG9taWNfdAlwb3dlcjsKKwlzdHJ1Y3QgZGV2aWNlCSpkZXZpY2U7Cit9OworCisvKioKKyAqIHN0cnVjdCBzNXBfbWZjX2RldiAtIFRoZSBzdHJ1Y3QgY29udGFpbmluZyBkcml2ZXIgaW50ZXJuYWwgcGFyYW1ldGVycy4KKyAqCisgKiBAdjRsMl9kZXY6CQl2NGwyX2RldmljZQorICogQHZmZF9kZWM6CQl2aWRlbyBkZXZpY2UgZm9yIGRlY29kaW5nCisgKiBAdmZkX2VuYzoJCXZpZGVvIGRldmljZSBmb3IgZW5jb2RpbmcKKyAqIEBwbGF0X2RldjoJCXBsYXRmb3JtIGRldmljZQorICogQG1lbV9kZXZfbDoJCWNoaWxkIGRldmljZSBvZiB0aGUgbGVmdCBtZW1vcnkgYmFuayAoMCkKKyAqIEBtZW1fZGV2X3I6CQljaGlsZCBkZXZpY2Ugb2YgdGhlIHJpZ2h0IG1lbW9yeSBiYW5rICgxKQorICogQHJlZ3NfYmFzZToJCWJhc2UgYWRkcmVzcyBvZiB0aGUgTUZDIGh3IHJlZ2lzdGVycworICogQGlycToJCWlycSByZXNvdXJjZQorICogQG1mY19tZW06CQlNRkMgcmVnaXN0ZXJzIG1lbW9yeSByZXNvdXJjZQorICogQGRlY19jdHJsX2hhbmRsZXI6CWNvbnRyb2wgZnJhbWV3b3JrIGhhbmRsZXIgZm9yIGRlY29kaW5nCisgKiBAZW5jX2N0cmxfaGFuZGxlcjoJY29udHJvbCBmcmFtZXdvcmsgaGFuZGxlciBmb3IgZW5jb2RpbmcKKyAqIEBwbToJCQlwb3dlciBtYW5hZ2VtZW50IGNvbnRyb2wKKyAqIEBudW1faW5zdDoJCWNvdXRlciBvZiBhY3RpdmUgTUZDIGluc3RhbmNlcworICogQGlycWxvY2s6CQlsb2NrIGZvciBvcGVyYXRpb25zIG9uIHZpZGVvYnVmMiBxdWV1ZXMKKyAqIEBjb25kbG9jazoJCWxvY2sgZm9yIGNoYW5naW5nL2NoZWNraW5nIGlmIGEgY29udGV4dCBpcyByZWFkeSB0byBiZQorICoJCQlwcm9jZXNzZWQKKyAqIEBtZmNfbXV0ZXg6CQlsb2NrIGZvciB2aWRlb19kZXZpY2UKKyAqIEBpbnRfY29uZDoJCXZhcmlhYmxlIHVzZWQgYnkgdGhlIHdhaXRxdWV1ZQorICogQGludF90eXBlOgkJdHlwZSBvZiBsYXN0IGludGVycnVwdAorICogQGludF9lcnI6CQllcnJvciBudW1iZXIgZm9yIGxhc3QgaW50ZXJydXB0CisgKiBAcXVldWU6CQl3YWl0cXVldWUgZm9yIHdhaXRpbmcgZm9yIGNvbXBsZXRpb24gb2YgZGV2aWNlIGNvbW1hbmRzCisgKiBAZndfc2l6ZToJCXNpemUgb2YgZmlybXdhcmUKKyAqIEBiYW5rMToJCWFkZHJlc3Mgb2YgdGhlIGJlZ2dpbmluZyBvZiBiYW5rIDEgbWVtb3J5CisgKiBAYmFuazI6CQlhZGRyZXNzIG9mIHRoZSBiZWdnaW5pbmcgb2YgYmFuayAyIG1lbW9yeQorICogQGh3X2xvY2s6CQl1c2VkIGZvciBoYXJkd2FyZSBsb2NraW5nCisgKiBAY3R4OgkJYXJyYXkgb2YgZHJpdmVyIGNvbnRleHRzCisgKiBAY3Vycl9jdHg6CQludW1iZXIgb2YgdGhlIGN1cnJlbnRseSBydW5uaW5nIGNvbnRleHQKKyAqIEBjdHhfd29ya19iaXRzOgl1c2VkIHRvIG1hcmsgd2hpY2ggY29udGV4dHMgYXJlIHdhaXRpbmcgZm9yIGhhcmR3YXJlCisgKiBAd2F0Y2hkb2dfY250Ogljb3VudGVyIGZvciB0aGUgd2F0Y2hkb2cKKyAqIEB3YXRjaGRvZ193b3JrcXVldWU6CXdvcmtxdWV1ZSBmb3IgdGhlIHdhdGNoZG9nCisgKiBAd2F0Y2hkb2dfd29yazoJd29ya2VyIGZvciB0aGUgd2F0Y2hkb2cKKyAqIEBhbGxvY19jdHg6CQl2aWRlb2J1ZjIgYWxsb2NhdG9yIGNvbnRleHRzIGZvciB0d28gbWVtb3J5IGJhbmtzCisgKiBAZW50ZXJfc3VzcGVuZDoJZmxhZyBzZXQgd2hlbiBlbnRlcmluZyBzdXNwZW5kCisgKgorICovCitzdHJ1Y3QgczVwX21mY19kZXYgeworCXN0cnVjdCB2NGwyX2RldmljZQl2NGwyX2RldjsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlCSp2ZmRfZGVjOworCXN0cnVjdCB2aWRlb19kZXZpY2UJKnZmZF9lbmM7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZQkqcGxhdF9kZXY7CisJc3RydWN0IGRldmljZQkJKm1lbV9kZXZfbDsKKwlzdHJ1Y3QgZGV2aWNlCQkqbWVtX2Rldl9yOworCXZvaWQgX19pb21lbQkJKnJlZ3NfYmFzZTsKKwlpbnQJCQlpcnE7CisJc3RydWN0IHJlc291cmNlCQkqbWZjX21lbTsKKwlzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgZGVjX2N0cmxfaGFuZGxlcjsKKwlzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgZW5jX2N0cmxfaGFuZGxlcjsKKwlzdHJ1Y3QgczVwX21mY19wbQlwbTsKKwlpbnQgbnVtX2luc3Q7CisJc3BpbmxvY2tfdCBpcnFsb2NrOwkvKiBsb2NrIHdoZW4gb3BlcmF0aW5nIG9uIHZpZGVvYnVmMiBxdWV1ZXMgKi8KKwlzcGlubG9ja190IGNvbmRsb2NrOwkvKiBsb2NrIHdoZW4gY2hhbmdpbmcvY2hlY2tpbmcgaWYgYSBjb250ZXh0IGlzCisJCQkJCXJlYWR5IHRvIGJlIHByb2Nlc3NlZCAqLworCXN0cnVjdCBtdXRleCBtZmNfbXV0ZXg7IC8qIHZpZGVvX2RldmljZSBsb2NrICovCisJaW50IGludF9jb25kOworCWludCBpbnRfdHlwZTsKKwl1bnNpZ25lZCBpbnQgaW50X2VycjsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBxdWV1ZTsKKwlzaXplX3QgZndfc2l6ZTsKKwlzaXplX3QgYmFuazE7CisJc2l6ZV90IGJhbmsyOworCXVuc2lnbmVkIGxvbmcgaHdfbG9jazsKKwlzdHJ1Y3QgczVwX21mY19jdHggKmN0eFtNRkNfTlVNX0NPTlRFWFRTXTsKKwlpbnQgY3Vycl9jdHg7CisJdW5zaWduZWQgbG9uZyBjdHhfd29ya19iaXRzOworCWF0b21pY190IHdhdGNoZG9nX2NudDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB3YXRjaGRvZ190aW1lcjsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd2F0Y2hkb2dfd29ya3F1ZXVlOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3YXRjaGRvZ193b3JrOworCXZvaWQgKmFsbG9jX2N0eFsyXTsKKwl1bnNpZ25lZCBsb25nIGVudGVyX3N1c3BlbmQ7Cit9OworCisvKioKKyAqIHN0cnVjdCBzNXBfbWZjX2gyNjRfZW5jX3BhcmFtcyAtIGVuY29kaW5nIHBhcmFtZXRlcnMgZm9yIGgyNjQKKyAqLworc3RydWN0IHM1cF9tZmNfaDI2NF9lbmNfcGFyYW1zIHsKKwllbnVtIHY0bDJfbXBlZ192aWRlb19oMjY0X3Byb2ZpbGUgcHJvZmlsZTsKKwllbnVtIHY0bDJfbXBlZ192aWRlb19oMjY0X2xvb3BfZmlsdGVyX21vZGUgbG9vcF9maWx0ZXJfbW9kZTsKKwlzOCBsb29wX2ZpbHRlcl9hbHBoYTsKKwlzOCBsb29wX2ZpbHRlcl9iZXRhOworCWVudW0gdjRsMl9tcGVnX3ZpZGVvX2gyNjRfZW50cm9weV9tb2RlIGVudHJvcHlfbW9kZTsKKwl1OCBtYXhfcmVmX3BpYzsKKwl1OCBudW1fcmVmX3BpY180cDsKKwlpbnQgXzh4OF90cmFuc2Zvcm07CisJaW50IHJjX21iOworCWludCByY19tYl9kYXJrOworCWludCByY19tYl9zbW9vdGg7CisJaW50IHJjX21iX3N0YXRpYzsKKwlpbnQgcmNfbWJfYWN0aXZpdHk7CisJaW50IHZ1aV9zYXI7CisJdTggdnVpX3Nhcl9pZGM7CisJdTE2IHZ1aV9leHRfc2FyX3dpZHRoOworCXUxNiB2dWlfZXh0X3Nhcl9oZWlnaHQ7CisJaW50IG9wZW5fZ29wOworCXUxNiBvcGVuX2dvcF9zaXplOworCXU4IHJjX2ZyYW1lX3FwOworCXU4IHJjX21pbl9xcDsKKwl1OCByY19tYXhfcXA7CisJdTggcmNfcF9mcmFtZV9xcDsKKwl1OCByY19iX2ZyYW1lX3FwOworCWVudW0gdjRsMl9tcGVnX3ZpZGVvX2gyNjRfbGV2ZWwgbGV2ZWxfdjRsMjsKKwlpbnQgbGV2ZWw7CisJdTE2IGNwYl9zaXplOworfTsKKworLyoqCisgKiBzdHJ1Y3QgczVwX21mY19tcGVnNF9lbmNfcGFyYW1zIC0gZW5jb2RpbmcgcGFyYW1ldGVycyBmb3IgaDI2MyBhbmQgbXBlZzQKKyAqLworc3RydWN0IHM1cF9tZmNfbXBlZzRfZW5jX3BhcmFtcyB7CisJLyogTVBFRzQgT25seSAqLworCWVudW0gdjRsMl9tcGVnX3ZpZGVvX21wZWc0X3Byb2ZpbGUgcHJvZmlsZTsKKwlpbnQgcXVhcnRlcl9waXhlbDsKKwkvKiBDb21tb24gZm9yIE1QRUc0LCBIMjYzICovCisJdTE2IHZvcF90aW1lX3JlczsKKwl1MTYgdm9wX2ZybV9kZWx0YTsKKwl1OCByY19mcmFtZV9xcDsKKwl1OCByY19taW5fcXA7CisJdTggcmNfbWF4X3FwOworCXU4IHJjX3BfZnJhbWVfcXA7CisJdTggcmNfYl9mcmFtZV9xcDsKKwllbnVtIHY0bDJfbXBlZ192aWRlb19tcGVnNF9sZXZlbCBsZXZlbF92NGwyOworCWludCBsZXZlbDsKK307CisKKy8qKgorICogc3RydWN0IHM1cF9tZmNfZW5jX3BhcmFtcyAtIGdlbmVyYWwgZW5jb2RpbmcgcGFyYW1ldGVycworICovCitzdHJ1Y3QgczVwX21mY19lbmNfcGFyYW1zIHsKKwl1MTYgd2lkdGg7CisJdTE2IGhlaWdodDsKKworCXUxNiBnb3Bfc2l6ZTsKKwllbnVtIHY0bDJfbXBlZ192aWRlb19tdWx0aV9zbGljZV9tb2RlIHNsaWNlX21vZGU7CisJdTE2IHNsaWNlX21iOworCXUzMiBzbGljZV9iaXQ7CisJdTE2IGludHJhX3JlZnJlc2hfbWI7CisJaW50IHBhZDsKKwl1OCBwYWRfbHVtYTsKKwl1OCBwYWRfY2I7CisJdTggcGFkX2NyOworCWludCByY19mcmFtZTsKKwl1MzIgcmNfYml0cmF0ZTsKKwl1MTYgcmNfcmVhY3Rpb25fY29lZmY7CisJdTE2IHZidl9zaXplOworCisJZW51bSB2NGwyX21wZWdfdmlkZW9faGVhZGVyX21vZGUgc2VxX2hkcl9tb2RlOworCWVudW0gdjRsMl9tcGVnX21mYzUxX3ZpZGVvX2ZyYW1lX3NraXBfbW9kZSBmcmFtZV9za2lwX21vZGU7CisJaW50IGZpeGVkX3RhcmdldF9iaXQ7CisKKwl1OCBudW1fYl9mcmFtZTsKKwl1MzIgcmNfZnJhbWVyYXRlX251bTsKKwl1MzIgcmNfZnJhbWVyYXRlX2Rlbm9tOworCWludCBpbnRlcmxhY2U7CisKKwl1bmlvbiB7CisJCXN0cnVjdCBzNXBfbWZjX2gyNjRfZW5jX3BhcmFtcyBoMjY0OworCQlzdHJ1Y3QgczVwX21mY19tcGVnNF9lbmNfcGFyYW1zIG1wZWc0OworCX0gY29kZWM7CisKK307CisKKy8qKgorICogc3RydWN0IHM1cF9tZmNfY29kZWNfb3BzIC0gY29kZWMgb3BzLCB1c2VkIGJ5IGVuY29kaW5nCisgKi8KK3N0cnVjdCBzNXBfbWZjX2NvZGVjX29wcyB7CisJLyogaW5pdGlhbGl6YXRpb24gcm91dGluZXMgKi8KKwlpbnQgKCpwcmVfc2VxX3N0YXJ0KSAoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpOworCWludCAoKnBvc3Rfc2VxX3N0YXJ0KSAoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpOworCS8qIGV4ZWN1dGlvbiByb3V0aW5lcyAqLworCWludCAoKnByZV9mcmFtZV9zdGFydCkgKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KTsKKwlpbnQgKCpwb3N0X2ZyYW1lX3N0YXJ0KSAoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpOworfTsKKworI2RlZmluZSBjYWxsX2NvcChjLCBvcCwgYXJncy4uLikJCQkJXAorCSgoKGMpLT5jX29wcy0+b3ApID8JCQkJCVwKKwkJKChjKS0+Y19vcHMtPm9wKGFyZ3MpKSA6IDApCisKKy8qKgorICogc3RydWN0IHM1cF9tZmNfY3R4IC0gVGhpcyBzdHJ1Y3QgY29udGFpbnMgdGhlIGluc3RhbmNlIGNvbnRleHQKKyAqCisgKiBAZGV2OgkJcG9pbnRlciB0byB0aGUgczVwX21mY19kZXYgb2YgdGhlIGRldmljZQorICogQGZoOgkJCXN0cnVjdCB2NGwyX2ZoCisgKiBAbnVtOgkJbnVtYmVyIG9mIHRoZSBjb250ZXh0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzCisgKiBAaW50X2NvbmQ6CQl2YXJpYWJsZSB1c2VkIGJ5IHRoZSB3YWl0cXVldWUKKyAqIEBpbnRfdHlwZToJCXR5cGUgb2YgdGhlIGxhc3QgaW50ZXJydXB0CisgKiBAaW50X2VycjoJCWVycm9yIG51bWJlciByZWNlaXZlZCBmcm9tIE1GQyBodyBpbiB0aGUgaW50ZXJydXB0CisgKiBAcXVldWU6CQl3YWl0cXVldWUgdGhhdCBjYW4gYmUgdXNlZCB0byB3YWl0IGZvciB0aGlzIGNvbnRleHQgdG8KKyAqCQkJZmluaXNoCisgKiBAc3JjX2ZtdDoJCXNvdXJjZSBwaXhlbGZvcm1hdCBpbmZvcm1hdGlvbgorICogQGRzdF9mbXQ6CQlkZXN0aW5hdGlvbiBwaXhlbGZvcm1hdCBpbmZvcm1hdGlvbgorICogQHZxX3NyYzoJCXZiMiBxdWV1ZSBmb3Igc291cmNlIGJ1ZmZlcnMKKyAqIEB2cV9kc3Q6CQl2YjIgcXVldWUgZm9yIGRlc3RpbmF0aW9uIGJ1ZmZlcnMKKyAqIEBzcmNfcXVldWU6CQlkcml2ZXIgaW50ZXJuYWwgcXVldWUgZm9yIHNvdXJjZSBidWZmZXJzCisgKiBAZHN0X3F1ZXVlOgkJZHJpdmVyIGludGVybmFsIHF1ZXVlIGZvciBkZXN0aW5hdGlvbiBidWZmZXJzCisgKiBAc3JjX3F1ZXVlX2NudDoJbnVtYmVyIG9mIGJ1ZmZlcnMgcXVldWVkIG9uIHRoZSBzb3VyY2UgaW50ZXJuYWwgcXVldWUKKyAqIEBkc3RfcXVldWVfY250OgludW1iZXIgb2YgYnVmZmVycyBxdWV1ZWQgb24gdGhlIGRlc3QgaW50ZXJuYWwgcXVldWUKKyAqIEB0eXBlOgkJdHlwZSBvZiB0aGUgaW5zdGFuY2UgLSBkZWNvZGVyIG9yIGVuY29kZXIKKyAqIEBzdGF0ZToJCXN0YXRlIG9mIHRoZSBjb250ZXh0CisgKiBAaW5zdF9ubzoJCW51bWJlciBvZiBodyBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRleHQKKyAqIEBpbWdfd2lkdGg6CQl3aWR0aCBvZiB0aGUgaW1hZ2UgdGhhdCBpcyBkZWNvZGVkIG9yIGVuY29kZWQKKyAqIEBpbWdfaGVpZ2h0OgkJaGVpZ2h0IG9mIHRoZSBpbWFnZSB0aGF0IGlzIGRlY29kZWQgb3IgZW5jb2RlZAorICogQGJ1Zl93aWR0aDoJCXdpZHRoIG9mIHRoZSBidWZmZXIgZm9yIHByb2Nlc3NlZCBpbWFnZQorICogQGJ1Zl9oZWlnaHQ6CQloZWlnaHQgb2YgdGhlIGJ1ZmZlciBmb3IgcHJvY2Vzc2VkIGltYWdlCisgKiBAbHVtYV9zaXplOgkJc2l6ZSBvZiBhIGx1bWEgcGxhbmUKKyAqIEBjaHJvbWFfc2l6ZToJc2l6ZSBvZiBhIGNocm9tYSBwbGFuZQorICogQG12X3NpemU6CQlzaXplIG9mIGEgbW90aW9uIHZlY3RvcnMgYnVmZmVyCisgKiBAY29uc3VtZWRfc3RyZWFtOgludW1iZXIgb2YgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gdXNlZCBzbyBmYXIgZnJvbSB0aGUKKyAqCQkJZGVjb2RpbmcgYnVmZmVyCisgKiBAZHBiX2ZsdXNoX2ZsYWc6CWZsYWcgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGEgRFBCIGJ1ZmZlcnMgYXJlIGJlaW5nCisgKgkJCWZsdXNoZWQKKyAqIEBiYW5rMV9idWY6CQloYW5kbGUgdG8gbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGVtcG9yYXJ5IGJ1ZmZlcnMgZnJvbQorICoJCQltZW1vcnkgYmFuayAxCisgKiBAYmFuazFfcGh5czoJCWFkZHJlc3Mgb2YgdGhlIHRlbXBvcmFyeSBidWZmZXJzIGZyb20gbWVtb3J5IGJhbmsgMQorICogQGJhbmsxX3NpemU6CQlzaXplIG9mIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0ZW1wb3JhcnkgYnVmZmVycyBmcm9tCisgKgkJCW1lbW9yeSBiYW5rIDEKKyAqIEBiYW5rMl9idWY6CQloYW5kbGUgdG8gbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGVtcG9yYXJ5IGJ1ZmZlcnMgZnJvbQorICoJCQltZW1vcnkgYmFuayAyCisgKiBAYmFuazJfcGh5czoJCWFkZHJlc3Mgb2YgdGhlIHRlbXBvcmFyeSBidWZmZXJzIGZyb20gbWVtb3J5IGJhbmsgMgorICogQGJhbmsyX3NpemU6CQlzaXplIG9mIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0ZW1wb3JhcnkgYnVmZmVycyBmcm9tCisgKgkJCW1lbW9yeSBiYW5rIDIKKyAqIEBjYXB0dXJlX3N0YXRlOglzdGF0ZSBvZiB0aGUgY2FwdHVyZSBidWZmZXJzIHF1ZXVlCisgKiBAb3V0cHV0X3N0YXRlOglzdGF0ZSBvZiB0aGUgb3V0cHV0IGJ1ZmZlcnMgcXVldWUKKyAqIEBzcmNfYnVmczoJCWluZm9ybWF0aW9uIG9uIGFsbG9jYXRlZCBzb3VyY2UgYnVmZmVycworICogQGRzdF9idWZzOgkJaW5mb3JtYXRpb24gb24gYWxsb2NhdGVkIGRlc3RpbmF0aW9uIGJ1ZmZlcnMKKyAqIEBzZXF1ZW5jZToJCWNvdW50ZXIgZm9yIHRoZSBzZXF1ZW5jZSBudW1iZXIgZm9yIHY0bDIKKyAqIEBkZWNfZHN0X2ZsYWc6CWZsYWdzIGZvciBidWZmZXJzIHF1ZXVlZCBpbiB0aGUgaGFyZHdhcmUKKyAqIEBkZWNfc3JjX2J1Zl9zaXplOglzaXplIG9mIHRoZSBidWZmZXIgZm9yIHNvdXJjZSBidWZmZXJzIGluIGRlY29kaW5nCisgKiBAY29kZWNfbW9kZToJCW51bWJlciBvZiBjb2RlYyBtb2RlIHVzZWQgYnkgTUZDIGh3CisgKiBAc2xpY2VfaW50ZXJmYWNlOglzbGljZSBpbnRlcmZhY2UgZmxhZworICogQGxvb3BfZmlsdGVyX21wZWc0Oglsb29wIGZpbHRlciBmb3IgTVBFRzQgZmxhZworICogQGRpc3BsYXlfZGVsYXk6CXZhbHVlIG9mIHRoZSBkaXNwbGF5IGRlbGF5IGZvciBIMjY0CisgKiBAZGlzcGxheV9kZWxheV9lbmFibGU6CWRpc3BsYXkgZGVsYXkgZm9yIEgyNjQgZW5hYmxlIGZsYWcKKyAqIEBhZnRlcl9wYWNrZWRfcGI6CWZsYWcgdXNlZCB0byB0cmFjayBidWZmZXIgd2hlbiBzdHJlYW0gaXMgaW4KKyAqCQkJUGFja2VkIFBCIGZvcm1hdAorICogQGRwYl9jb3VudDoJCWNvdW50IG9mIHRoZSBEUEIgYnVmZmVycyByZXF1aXJlZCBieSBNRkMgaHcKKyAqIEB0b3RhbF9kcGJfY291bnQ6CWNvdW50IG9mIERQQiBidWZmZXJzIHdpdGggYWRkaXRpb25hbCBidWZmZXJzCisgKgkJCXJlcXVlc3RlZCBieSB0aGUgYXBwbGljYXRpb24KKyAqIEBjdHhfYnVmOgkJaGFuZGxlIHRvIHRoZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udGV4dAorICogQGN0eF9waHlzOgkJYWRkcmVzcyBvZiB0aGUgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRleHQKKyAqIEBjdHhfc2l6ZToJCXNpemUgb2YgdGhlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb250ZXh0CisgKiBAZGVzY19idWY6CQlkZXNjcmlwdGlvbiBidWZmZXIgZm9yIGRlY29kaW5nIGhhbmRsZQorICogQGRlc2NfcGh5czoJCWRlc2NyaXB0aW9uIGJ1ZmZlciBmb3IgZGVjb2RpbmcgYWRkcmVzcworICogQHNobV9hbGxvYzoJCWhhbmRsZSBmb3IgdGhlIHNoYXJlZCBtZW1vcnkgYnVmZmVyCisgKiBAc2htOgkJdmlydHVhbCBhZGRyZXNzIGZvciB0aGUgc2hhcmVkIG1lbW9yeSBidWZmZXIKKyAqIEBzaG1fb2ZzOgkJYWRkcmVzcyBvZmZzZXQgZm9yIHNoYXJlZCBtZW1vcnkKKyAqIEBlbmNfcGFyYW1zOgkJZW5jb2RpbmcgcGFyYW1ldGVycyBmb3IgTUZDCisgKiBAZW5jX2RzdF9idWZfc2l6ZToJc2l6ZSBvZiB0aGUgYnVmZmVycyBmb3IgZW5jb2RlciBvdXRwdXQKKyAqIEBmcmFtZV90eXBlOgkJdXNlZCB0byBmb3JjZSB0aGUgdHlwZSBvZiB0aGUgbmV4dCBlbmNvZGVkIGZyYW1lCisgKiBAcmVmX3F1ZXVlOgkJbGlzdCBvZiB0aGUgcmVmZXJlbmNlIGJ1ZmZlcnMgZm9yIGVuY29kaW5nCisgKiBAcmVmX3F1ZXVlX2NudDoJbnVtYmVyIG9mIHRoZSBidWZmZXJzIGluIHRoZSByZWZlcmVuY2UgbGlzdAorICogQGNfb3BzOgkJb3BzIGZvciBlbmNvZGluZworICogQGN0cmxzOgkJYXJyYXkgb2YgY29udHJvbHMsIHVzZWQgd2hlbiBhZGRpbmcgY29udHJvbHMgdG8gdGhlCisgKgkJCXY0bDIgY29udHJvbCBmcmFtZXdvcmsKKyAqIEBjdHJsX2hhbmRsZXI6CWhhbmRsZXIgZm9yIHY0bDIgZnJhbWV3b3JrCisgKi8KK3N0cnVjdCBzNXBfbWZjX2N0eCB7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXY7CisJc3RydWN0IHY0bDJfZmggZmg7CisKKwlpbnQgbnVtOworCisJaW50IGludF9jb25kOworCWludCBpbnRfdHlwZTsKKwl1bnNpZ25lZCBpbnQgaW50X2VycjsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBxdWV1ZTsKKworCXN0cnVjdCBzNXBfbWZjX2ZtdCAqc3JjX2ZtdDsKKwlzdHJ1Y3QgczVwX21mY19mbXQgKmRzdF9mbXQ7CisKKwlzdHJ1Y3QgdmIyX3F1ZXVlIHZxX3NyYzsKKwlzdHJ1Y3QgdmIyX3F1ZXVlIHZxX2RzdDsKKworCXN0cnVjdCBsaXN0X2hlYWQgc3JjX3F1ZXVlOworCXN0cnVjdCBsaXN0X2hlYWQgZHN0X3F1ZXVlOworCisJdW5zaWduZWQgaW50IHNyY19xdWV1ZV9jbnQ7CisJdW5zaWduZWQgaW50IGRzdF9xdWV1ZV9jbnQ7CisKKwllbnVtIHM1cF9tZmNfaW5zdF90eXBlIHR5cGU7CisJZW51bSBzNXBfbWZjX2luc3Rfc3RhdGUgc3RhdGU7CisJaW50IGluc3Rfbm87CisKKwkvKiBJbWFnZSBwYXJhbWV0ZXJzICovCisJaW50IGltZ193aWR0aDsKKwlpbnQgaW1nX2hlaWdodDsKKwlpbnQgYnVmX3dpZHRoOworCWludCBidWZfaGVpZ2h0OworCisJaW50IGx1bWFfc2l6ZTsKKwlpbnQgY2hyb21hX3NpemU7CisJaW50IG12X3NpemU7CisKKwl1bnNpZ25lZCBsb25nIGNvbnN1bWVkX3N0cmVhbTsKKworCXVuc2lnbmVkIGludCBkcGJfZmx1c2hfZmxhZzsKKworCS8qIEJ1ZmZlcnMgKi8KKwl2b2lkICpiYW5rMV9idWY7CisJc2l6ZV90IGJhbmsxX3BoeXM7CisJc2l6ZV90IGJhbmsxX3NpemU7CisKKwl2b2lkICpiYW5rMl9idWY7CisJc2l6ZV90IGJhbmsyX3BoeXM7CisJc2l6ZV90IGJhbmsyX3NpemU7CisKKwllbnVtIHM1cF9tZmNfcXVldWVfc3RhdGUgY2FwdHVyZV9zdGF0ZTsKKwllbnVtIHM1cF9tZmNfcXVldWVfc3RhdGUgb3V0cHV0X3N0YXRlOworCisJc3RydWN0IHM1cF9tZmNfYnVmIHNyY19idWZzW01GQ19NQVhfQlVGRkVSU107CisJaW50IHNyY19idWZzX2NudDsKKwlzdHJ1Y3QgczVwX21mY19idWYgZHN0X2J1ZnNbTUZDX01BWF9CVUZGRVJTXTsKKwlpbnQgZHN0X2J1ZnNfY250OworCisJdW5zaWduZWQgaW50IHNlcXVlbmNlOworCXVuc2lnbmVkIGxvbmcgZGVjX2RzdF9mbGFnOworCXNpemVfdCBkZWNfc3JjX2J1Zl9zaXplOworCisJLyogQ29udHJvbCB2YWx1ZXMgKi8KKwlpbnQgY29kZWNfbW9kZTsKKwlpbnQgc2xpY2VfaW50ZXJmYWNlOworCWludCBsb29wX2ZpbHRlcl9tcGVnNDsKKwlpbnQgZGlzcGxheV9kZWxheTsKKwlpbnQgZGlzcGxheV9kZWxheV9lbmFibGU7CisJaW50IGFmdGVyX3BhY2tlZF9wYjsKKworCWludCBkcGJfY291bnQ7CisJaW50IHRvdGFsX2RwYl9jb3VudDsKKworCS8qIEJ1ZmZlcnMgKi8KKwl2b2lkICpjdHhfYnVmOworCXNpemVfdCBjdHhfcGh5czsKKwlzaXplX3QgY3R4X29mczsKKwlzaXplX3QgY3R4X3NpemU7CisKKwl2b2lkICpkZXNjX2J1ZjsKKwlzaXplX3QgZGVzY19waHlzOworCisKKwl2b2lkICpzaG1fYWxsb2M7CisJdm9pZCAqc2htOworCXNpemVfdCBzaG1fb2ZzOworCisJc3RydWN0IHM1cF9tZmNfZW5jX3BhcmFtcyBlbmNfcGFyYW1zOworCisJc2l6ZV90IGVuY19kc3RfYnVmX3NpemU7CisKKwllbnVtIHY0bDJfbXBlZ19tZmM1MV92aWRlb19mb3JjZV9mcmFtZV90eXBlIGZvcmNlX2ZyYW1lX3R5cGU7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJlZl9xdWV1ZTsKKwl1bnNpZ25lZCBpbnQgcmVmX3F1ZXVlX2NudDsKKworCXN0cnVjdCBzNXBfbWZjX2NvZGVjX29wcyAqY19vcHM7CisKKwlzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsc1tNRkNfTUFYX0NUUkxTXTsKKwlzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgY3RybF9oYW5kbGVyOworfTsKKworLyoKKyAqIHN0cnVjdCBzNXBfbWZjX2ZtdCAtCXN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IHBpeGVsZm9ybWF0cworICoJCQl1c2VkIGJ5IHRoZSBNRkMKKyAqLworc3RydWN0IHM1cF9tZmNfZm10IHsKKwljaGFyICpuYW1lOworCXUzMiBmb3VyY2M7CisJdTMyIGNvZGVjX21vZGU7CisJZW51bSBzNXBfbWZjX2ZtdF90eXBlIHR5cGU7CisJdTMyIG51bV9wbGFuZXM7Cit9OworCisvKioKKyAqIHN0cnVjdCBtZmNfY29udHJvbCAtCXN0cnVjdHVyZSB1c2VkIHRvIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IE1GQyBjb250cm9scworICoJCQlpdCBpcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGNvbnRyb2wgZnJhbWV3b3JrLgorICovCitzdHJ1Y3QgbWZjX2NvbnRyb2wgeworCV9fdTMyCQkJaWQ7CisJZW51bSB2NGwyX2N0cmxfdHlwZQl0eXBlOworCV9fdTgJCQluYW1lWzMyXTsgIC8qIFdoYXRldmVyICovCisJX19zMzIJCQltaW5pbXVtOyAgIC8qIE5vdGUgc2lnbmVkbmVzcyAqLworCV9fczMyCQkJbWF4aW11bTsKKwlfX3MzMgkJCXN0ZXA7CisJX191MzIJCQltZW51X3NraXBfbWFzazsKKwlfX3MzMgkJCWRlZmF1bHRfdmFsdWU7CisJX191MzIJCQlmbGFnczsKKwlfX3UzMgkJCXJlc2VydmVkWzJdOworCV9fdTgJCQlpc192b2xhdGlsZTsKK307CisKKworI2RlZmluZSBmaF90b19jdHgoX19maCkgY29udGFpbmVyX29mKF9fZmgsIHN0cnVjdCBzNXBfbWZjX2N0eCwgZmgpCisjZGVmaW5lIGN0cmxfdG9fY3R4KF9fY3RybCkgXAorCWNvbnRhaW5lcl9vZigoX19jdHJsKS0+aGFuZGxlciwgc3RydWN0IHM1cF9tZmNfY3R4LCBjdHJsX2hhbmRsZXIpCisKKyNlbmRpZiAvKiBTNVBfTUZDX0NPTU1PTl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfY3RybC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfY3RybC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNGRhODAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19jdHJsLmMKQEAgLTAsMCArMSwzNDMgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19jdHJsLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlICJyZWdzLW1mYy5oIgorI2luY2x1ZGUgInM1cF9tZmNfY21kLmgiCisjaW5jbHVkZSAiczVwX21mY19jb21tb24uaCIKKyNpbmNsdWRlICJzNXBfbWZjX2RlYnVnLmgiCisjaW5jbHVkZSAiczVwX21mY19pbnRyLmgiCisjaW5jbHVkZSAiczVwX21mY19wbS5oIgorCitzdGF0aWMgdm9pZCAqczVwX21mY19iaXRwcm9jX2J1ZjsKK3N0YXRpYyBzaXplX3QgczVwX21mY19iaXRwcm9jX3BoeXM7CitzdGF0aWMgdW5zaWduZWQgY2hhciAqczVwX21mY19iaXRwcm9jX3ZpcnQ7CisKKy8qIEFsbG9jYXRlIGFuZCBsb2FkIGZpcm13YXJlICovCitpbnQgczVwX21mY19hbGxvY19hbmRfbG9hZF9maXJtd2FyZShzdHJ1Y3QgczVwX21mY19kZXYgKmRldikKK3sKKwlzdHJ1Y3QgZmlybXdhcmUgKmZ3X2Jsb2I7CisJc2l6ZV90IGJhbmsyX2Jhc2VfcGh5czsKKwl2b2lkICpiX2Jhc2U7CisJaW50IGVycjsKKworCS8qIEZpcm1hcmUgaGFzIHRvIGJlIHByZXNlbnQgYXMgYSBzZXBhcmF0ZSBmaWxlIG9yIGNvbXBpbGVkCisJICogaW50byBrZXJuZWwuICovCisJbWZjX2RlYnVnX2VudGVyKCk7CisJZXJyID0gcmVxdWVzdF9maXJtd2FyZSgoY29uc3Qgc3RydWN0IGZpcm13YXJlICoqKSZmd19ibG9iLAorCQkJCSAgICAgInM1cGMxMTAtbWZjLmZ3IiwgZGV2LT52NGwyX2Rldi5kZXYpOworCWlmIChlcnIgIT0gMCkgeworCQltZmNfZXJyKCJGaXJtd2FyZSBpcyBub3QgcHJlc2VudCBpbiB0aGUgL2xpYi9maXJtd2FyZSBkaXJlY3Rvcnkgbm9yIGNvbXBpbGVkIGluIGtlcm5lbFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlkZXYtPmZ3X3NpemUgPSBBTElHTihmd19ibG9iLT5zaXplLCBGSVJNV0FSRV9BTElHTik7CisJaWYgKHM1cF9tZmNfYml0cHJvY19idWYpIHsKKwkJbWZjX2VycigiQXR0ZW1wdGluZyB0byBhbGxvY2F0ZSBmaXJtd2FyZSB3aGVuIGl0IHNlZW1zIHRoYXQgaXQgaXMgYWxyZWFkeSBsb2FkZWRcbiIpOworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3X2Jsb2IpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJczVwX21mY19iaXRwcm9jX2J1ZiA9IHZiMl9kbWFfY29udGlnX21lbW9wcy5hbGxvYygKKwkJZGV2LT5hbGxvY19jdHhbTUZDX0JBTksxX0FMTE9DX0NUWF0sIGRldi0+Zndfc2l6ZSk7CisJaWYgKElTX0VSUihzNXBfbWZjX2JpdHByb2NfYnVmKSkgeworCQlzNXBfbWZjX2JpdHByb2NfYnVmID0gMDsKKwkJbWZjX2VycigiQWxsb2NhdGluZyBiaXRwcm9jZXNzb3IgYnVmZmVyIGZhaWxlZFxuIik7CisJCXJlbGVhc2VfZmlybXdhcmUoZndfYmxvYik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlzNXBfbWZjX2JpdHByb2NfcGh5cyA9IHM1cF9tZmNfbWVtX2Nvb2tpZSgKKwkJZGV2LT5hbGxvY19jdHhbTUZDX0JBTksxX0FMTE9DX0NUWF0sIHM1cF9tZmNfYml0cHJvY19idWYpOworCWlmIChzNXBfbWZjX2JpdHByb2NfcGh5cyAmICgoMSA8PCBNRkNfQkFTRV9BTElHTl9PUkRFUikgLSAxKSkgeworCQltZmNfZXJyKCJUaGUgYmFzZSBtZW1vcnkgZm9yIGJhbmsgMSBpcyBub3QgYWxpZ25lZCB0byAxMjhLQlxuIik7CisJCXZiMl9kbWFfY29udGlnX21lbW9wcy5wdXQoczVwX21mY19iaXRwcm9jX2J1Zik7CisJCXM1cF9tZmNfYml0cHJvY19waHlzID0gMDsKKwkJczVwX21mY19iaXRwcm9jX2J1ZiA9IDA7CisJCXJlbGVhc2VfZmlybXdhcmUoZndfYmxvYik7CisJCXJldHVybiAtRUlPOworCX0KKwlzNXBfbWZjX2JpdHByb2NfdmlydCA9IHZiMl9kbWFfY29udGlnX21lbW9wcy52YWRkcihzNXBfbWZjX2JpdHByb2NfYnVmKTsKKwlpZiAoIXM1cF9tZmNfYml0cHJvY192aXJ0KSB7CisJCW1mY19lcnIoIkJpdHByb2Nlc3NvciBtZW1vcnkgcmVtYXAgZmFpbGVkXG4iKTsKKwkJdmIyX2RtYV9jb250aWdfbWVtb3BzLnB1dChzNXBfbWZjX2JpdHByb2NfYnVmKTsKKwkJczVwX21mY19iaXRwcm9jX3BoeXMgPSAwOworCQlzNXBfbWZjX2JpdHByb2NfYnVmID0gMDsKKwkJcmVsZWFzZV9maXJtd2FyZShmd19ibG9iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWRldi0+YmFuazEgPSBzNXBfbWZjX2JpdHByb2NfcGh5czsKKwliX2Jhc2UgPSB2YjJfZG1hX2NvbnRpZ19tZW1vcHMuYWxsb2MoCisJCWRldi0+YWxsb2NfY3R4W01GQ19CQU5LMl9BTExPQ19DVFhdLCAxIDw8IE1GQ19CQU5LMl9BTElHTl9PUkRFUik7CisJaWYgKElTX0VSUihiX2Jhc2UpKSB7CisJCXZiMl9kbWFfY29udGlnX21lbW9wcy5wdXQoczVwX21mY19iaXRwcm9jX2J1Zik7CisJCXM1cF9tZmNfYml0cHJvY19waHlzID0gMDsKKwkJczVwX21mY19iaXRwcm9jX2J1ZiA9IDA7CisJCW1mY19lcnIoIkFsbG9jYXRpbmcgYmFuazIgYmFzZSBmYWlsZWRcbiIpOworCXJlbGVhc2VfZmlybXdhcmUoZndfYmxvYik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwliYW5rMl9iYXNlX3BoeXMgPSBzNXBfbWZjX21lbV9jb29raWUoCisJCWRldi0+YWxsb2NfY3R4W01GQ19CQU5LMl9BTExPQ19DVFhdLCBiX2Jhc2UpOworCXZiMl9kbWFfY29udGlnX21lbW9wcy5wdXQoYl9iYXNlKTsKKwlpZiAoYmFuazJfYmFzZV9waHlzICYgKCgxIDw8IE1GQ19CQVNFX0FMSUdOX09SREVSKSAtIDEpKSB7CisJCW1mY19lcnIoIlRoZSBiYXNlIG1lbW9yeSBmb3IgYmFuayAyIGlzIG5vdCBhbGlnbmVkIHRvIDEyOEtCXG4iKTsKKwkJdmIyX2RtYV9jb250aWdfbWVtb3BzLnB1dChzNXBfbWZjX2JpdHByb2NfYnVmKTsKKwkJczVwX21mY19iaXRwcm9jX3BoeXMgPSAwOworCQlzNXBfbWZjX2JpdHByb2NfYnVmID0gMDsKKwkJcmVsZWFzZV9maXJtd2FyZShmd19ibG9iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWRldi0+YmFuazIgPSBiYW5rMl9iYXNlX3BoeXM7CisJbWVtY3B5KHM1cF9tZmNfYml0cHJvY192aXJ0LCBmd19ibG9iLT5kYXRhLCBmd19ibG9iLT5zaXplKTsKKwl3bWIoKTsKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3X2Jsb2IpOworCW1mY19kZWJ1Z19sZWF2ZSgpOworCXJldHVybiAwOworfQorCisvKiBSZWxvYWQgZmlybXdhcmUgdG8gTUZDICovCitpbnQgczVwX21mY19yZWxvYWRfZmlybXdhcmUoc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYpCit7CisJc3RydWN0IGZpcm13YXJlICpmd19ibG9iOworCWludCBlcnI7CisKKwkvKiBGaXJtYXJlIGhhcyB0byBiZSBwcmVzZW50IGFzIGEgc2VwYXJhdGUgZmlsZSBvciBjb21waWxlZAorCSAqIGludG8ga2VybmVsLiAqLworCW1mY19kZWJ1Z19lbnRlcigpOworCWVyciA9IHJlcXVlc3RfZmlybXdhcmUoKGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqKikmZndfYmxvYiwKKwkJCQkgICAgICJzNXBjMTEwLW1mYy5mdyIsIGRldi0+djRsMl9kZXYuZGV2KTsKKwlpZiAoZXJyICE9IDApIHsKKwkJbWZjX2VycigiRmlybXdhcmUgaXMgbm90IHByZXNlbnQgaW4gdGhlIC9saWIvZmlybXdhcmUgZGlyZWN0b3J5IG5vciBjb21waWxlZCBpbiBrZXJuZWxcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGZ3X2Jsb2ItPnNpemUgPiBkZXYtPmZ3X3NpemUpIHsKKwkJbWZjX2VycigiTUZDIGZpcm13YXJlIGlzIHRvbyBiaWcgdG8gYmUgbG9hZGVkXG4iKTsKKwkJcmVsZWFzZV9maXJtd2FyZShmd19ibG9iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWlmIChzNXBfbWZjX2JpdHByb2NfYnVmID09IDAgfHwgczVwX21mY19iaXRwcm9jX3BoeXMgPT0gMCkgeworCQltZmNfZXJyKCJNRkMgZmlybXdhcmUgaXMgbm90IGFsbG9jYXRlZCBvciB3YXMgbm90IG1hcHBlZCBjb3JyZWN0bHlcbiIpOworCQlyZWxlYXNlX2Zpcm13YXJlKGZ3X2Jsb2IpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbWVtY3B5KHM1cF9tZmNfYml0cHJvY192aXJ0LCBmd19ibG9iLT5kYXRhLCBmd19ibG9iLT5zaXplKTsKKwl3bWIoKTsKKwlyZWxlYXNlX2Zpcm13YXJlKGZ3X2Jsb2IpOworCW1mY19kZWJ1Z19sZWF2ZSgpOworCXJldHVybiAwOworfQorCisvKiBSZWxlYXNlIGZpcm13YXJlIG1lbW9yeSAqLworaW50IHM1cF9tZmNfcmVsZWFzZV9maXJtd2FyZShzdHJ1Y3QgczVwX21mY19kZXYgKmRldikKK3sKKwkvKiBCZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uIG9uZSBoYXMgdG8gbWFrZSBzdXJlCisJICogdGhhdCBNRkMgaXMgbm8gbG9uZ2VyIHByb2Nlc3NpbmcgKi8KKwlpZiAoIXM1cF9tZmNfYml0cHJvY19idWYpCisJCXJldHVybiAtRUlOVkFMOworCXZiMl9kbWFfY29udGlnX21lbW9wcy5wdXQoczVwX21mY19iaXRwcm9jX2J1Zik7CisJczVwX21mY19iaXRwcm9jX3ZpcnQgPSAgMDsKKwlzNXBfbWZjX2JpdHByb2NfcGh5cyA9IDA7CisJczVwX21mY19iaXRwcm9jX2J1ZiA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qIFJlc2V0IHRoZSBkZXZpY2UgKi8KK2ludCBzNXBfbWZjX3Jlc2V0KHN0cnVjdCBzNXBfbWZjX2RldiAqZGV2KQoreworCXVuc2lnbmVkIGludCBtY19zdGF0dXM7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJbWZjX2RlYnVnX2VudGVyKCk7CisJLyogU3RvcCBwcm9jZWR1cmUgKi8KKwkvKiAgcmVzZXQgUklTQyAqLworCW1mY193cml0ZShkZXYsIDB4M2Y2LCBTNVBfRklNVl9TV19SRVNFVCk7CisJLyogIEFsbCByZXNldCBleGNlcHQgZm9yIE1DICovCisJbWZjX3dyaXRlKGRldiwgMHgzZTIsIFM1UF9GSU1WX1NXX1JFU0VUKTsKKwltZGVsYXkoMTApOworCisJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKE1GQ19CV19USU1FT1VUKTsKKwkvKiBDaGVjayBNQyBzdGF0dXMgKi8KKwlkbyB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCQltZmNfZXJyKCJUaW1lb3V0IHdoaWxlIHJlc2V0dGluZyBNRkNcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQltY19zdGF0dXMgPSBtZmNfcmVhZChkZXYsIFM1UF9GSU1WX01DX1NUQVRVUyk7CisKKwl9IHdoaWxlIChtY19zdGF0dXMgJiAweDMpOworCisJbWZjX3dyaXRlKGRldiwgMHgwLCBTNVBfRklNVl9TV19SRVNFVCk7CisJbWZjX3dyaXRlKGRldiwgMHgzZmUsIFM1UF9GSU1WX1NXX1JFU0VUKTsKKwltZmNfZGVidWdfbGVhdmUoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHM1cF9tZmNfaW5pdF9tZW1jdHJsKHN0cnVjdCBzNXBfbWZjX2RldiAqZGV2KQoreworCW1mY193cml0ZShkZXYsIGRldi0+YmFuazEsIFM1UF9GSU1WX01DX0RSQU1CQVNFX0FEUl9BKTsKKwltZmNfd3JpdGUoZGV2LCBkZXYtPmJhbmsyLCBTNVBfRklNVl9NQ19EUkFNQkFTRV9BRFJfQik7CisJbWZjX2RlYnVnKDIsICJCYW5rMTogJTA4eCwgQmFuazI6ICUwOHhcbiIsIGRldi0+YmFuazEsIGRldi0+YmFuazIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgczVwX21mY19jbGVhcl9jbWRzKHN0cnVjdCBzNXBfbWZjX2RldiAqZGV2KQoreworCW1mY193cml0ZShkZXYsIDB4ZmZmZmZmZmYsIFM1UF9GSU1WX1NJX0NIMF9JTlNUX0lEKTsKKwltZmNfd3JpdGUoZGV2LCAweGZmZmZmZmZmLCBTNVBfRklNVl9TSV9DSDFfSU5TVF9JRCk7CisJbWZjX3dyaXRlKGRldiwgMCwgUzVQX0ZJTVZfUklTQzJIT1NUX0NNRCk7CisJbWZjX3dyaXRlKGRldiwgMCwgUzVQX0ZJTVZfSE9TVDJSSVNDX0NNRCk7Cit9CisKKy8qIEluaXRpYWxpemUgaGFyZHdhcmUgKi8KK2ludCBzNXBfbWZjX2luaXRfaHcoc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYpCit7CisJdW5zaWduZWQgaW50IHZlcjsKKwlpbnQgcmV0OworCisJbWZjX2RlYnVnX2VudGVyKCk7CisJaWYgKCFzNXBfbWZjX2JpdHByb2NfYnVmKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIDAuIE1GQyByZXNldCAqLworCW1mY19kZWJ1ZygyLCAiTUZDIHJlc2V0Li5cbiIpOworCXM1cF9tZmNfY2xvY2tfb24oKTsKKwlyZXQgPSBzNXBfbWZjX3Jlc2V0KGRldik7CisJaWYgKHJldCkgeworCQltZmNfZXJyKCJGYWlsZWQgdG8gcmVzZXQgTUZDIC0gdGltZW91dFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCW1mY19kZWJ1ZygyLCAiRG9uZSBNRkMgcmVzZXQuLlxuIik7CisJLyogMS4gU2V0IERSQU0gYmFzZSBBZGRyICovCisJczVwX21mY19pbml0X21lbWN0cmwoZGV2KTsKKwkvKiAyLiBJbml0aWFsaXplIHJlZ2lzdGVycyBvZiBjaGFubmVsIEkvRiAqLworCXM1cF9tZmNfY2xlYXJfY21kcyhkZXYpOworCS8qIDMuIFJlbGVhc2UgcmVzZXQgc2lnbmFsIHRvIHRoZSBSSVNDICovCisJczVwX21mY19jbGVhbl9kZXZfaW50X2ZsYWdzKGRldik7CisJbWZjX3dyaXRlKGRldiwgMHgzZmYsIFM1UF9GSU1WX1NXX1JFU0VUKTsKKwltZmNfZGVidWcoMiwgIldpbGwgbm93IHdhaXQgZm9yIGNvbXBsZXRpb24gb2YgZmlybXdhcmUgdHJhbnNmZXJcbiIpOworCWlmIChzNXBfbWZjX3dhaXRfZm9yX2RvbmVfZGV2KGRldiwgUzVQX0ZJTVZfUjJIX0NNRF9GV19TVEFUVVNfUkVUKSkgeworCQltZmNfZXJyKCJGYWlsZWQgdG8gbG9hZCBmaXJtd2FyZVxuIik7CisJCXM1cF9tZmNfcmVzZXQoZGV2KTsKKwkJczVwX21mY19jbG9ja19vZmYoKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXM1cF9tZmNfY2xlYW5fZGV2X2ludF9mbGFncyhkZXYpOworCS8qIDQuIEluaXRpYWxpemUgZmlybXdhcmUgKi8KKwlyZXQgPSBzNXBfbWZjX3N5c19pbml0X2NtZChkZXYpOworCWlmIChyZXQpIHsKKwkJbWZjX2VycigiRmFpbGVkIHRvIHNlbmQgY29tbWFuZCB0byBNRkMgLSB0aW1lb3V0XG4iKTsKKwkJczVwX21mY19yZXNldChkZXYpOworCQlzNXBfbWZjX2Nsb2NrX29mZigpOworCQlyZXR1cm4gcmV0OworCX0KKwltZmNfZGVidWcoMiwgIk9rLCBub3cgd2lsbCB3cml0ZSBhIGNvbW1hbmQgdG8gaW5pdCB0aGUgc3lzdGVtXG4iKTsKKwlpZiAoczVwX21mY193YWl0X2Zvcl9kb25lX2RldihkZXYsIFM1UF9GSU1WX1IySF9DTURfU1lTX0lOSVRfUkVUKSkgeworCQltZmNfZXJyKCJGYWlsZWQgdG8gbG9hZCBmaXJtd2FyZVxuIik7CisJCXM1cF9tZmNfcmVzZXQoZGV2KTsKKwkJczVwX21mY19jbG9ja19vZmYoKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWRldi0+aW50X2NvbmQgPSAwOworCWlmIChkZXYtPmludF9lcnIgIT0gMCB8fCBkZXYtPmludF90eXBlICE9CisJCQkJCVM1UF9GSU1WX1IySF9DTURfU1lTX0lOSVRfUkVUKSB7CisJCS8qIEZhaWx1cmUuICovCisJCW1mY19lcnIoIkZhaWxlZCB0byBpbml0IGZpcm13YXJlIC0gZXJyb3I6ICVkIGludDogJWRcbiIsCisJCQkJCQlkZXYtPmludF9lcnIsIGRldi0+aW50X3R5cGUpOworCQlzNXBfbWZjX3Jlc2V0KGRldik7CisJCXM1cF9tZmNfY2xvY2tfb2ZmKCk7CisJCXJldHVybiAtRUlPOworCX0KKwl2ZXIgPSBtZmNfcmVhZChkZXYsIFM1UF9GSU1WX0ZXX1ZFUlNJT04pOworCW1mY19kZWJ1ZygyLCAiTUZDIEYvVyB2ZXJzaW9uIDogJTAyeHl5LCAlMDJ4bW0sICUwMnhkZFxuIiwKKwkJKHZlciA+PiAxNikgJiAweEZGLCAodmVyID4+IDgpICYgMHhGRiwgdmVyICYgMHhGRik7CisJczVwX21mY19jbG9ja19vZmYoKTsKKwltZmNfZGVidWdfbGVhdmUoKTsKKwlyZXR1cm4gMDsKK30KKworCitpbnQgczVwX21mY19zbGVlcChzdHJ1Y3QgczVwX21mY19kZXYgKmRldikKK3sKKwlpbnQgcmV0OworCisJbWZjX2RlYnVnX2VudGVyKCk7CisJczVwX21mY19jbG9ja19vbigpOworCXM1cF9tZmNfY2xlYW5fZGV2X2ludF9mbGFncyhkZXYpOworCXJldCA9IHM1cF9tZmNfc2xlZXBfY21kKGRldik7CisJaWYgKHJldCkgeworCQltZmNfZXJyKCJGYWlsZWQgdG8gc2VuZCBjb21tYW5kIHRvIE1GQyAtIHRpbWVvdXRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKwlpZiAoczVwX21mY193YWl0X2Zvcl9kb25lX2RldihkZXYsIFM1UF9GSU1WX1IySF9DTURfU0xFRVBfUkVUKSkgeworCQltZmNfZXJyKCJGYWlsZWQgdG8gc2xlZXBcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJczVwX21mY19jbG9ja19vZmYoKTsKKwlkZXYtPmludF9jb25kID0gMDsKKwlpZiAoZGV2LT5pbnRfZXJyICE9IDAgfHwgZGV2LT5pbnRfdHlwZSAhPQorCQkJCQkJUzVQX0ZJTVZfUjJIX0NNRF9TTEVFUF9SRVQpIHsKKwkJLyogRmFpbHVyZS4gKi8KKwkJbWZjX2VycigiRmFpbGVkIHRvIHNsZWVwIC0gZXJyb3I6ICVkIGludDogJWRcbiIsIGRldi0+aW50X2VyciwKKwkJCQkJCQkJZGV2LT5pbnRfdHlwZSk7CisJCXJldHVybiAtRUlPOworCX0KKwltZmNfZGVidWdfbGVhdmUoKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgczVwX21mY193YWtldXAoc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYpCit7CisJaW50IHJldDsKKworCW1mY19kZWJ1Z19lbnRlcigpOworCS8qIDAuIE1GQyByZXNldCAqLworCW1mY19kZWJ1ZygyLCAiTUZDIHJlc2V0Li5cbiIpOworCXM1cF9tZmNfY2xvY2tfb24oKTsKKwlyZXQgPSBzNXBfbWZjX3Jlc2V0KGRldik7CisJaWYgKHJldCkgeworCQltZmNfZXJyKCJGYWlsZWQgdG8gcmVzZXQgTUZDIC0gdGltZW91dFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCW1mY19kZWJ1ZygyLCAiRG9uZSBNRkMgcmVzZXQuLlxuIik7CisJLyogMS4gU2V0IERSQU0gYmFzZSBBZGRyICovCisJczVwX21mY19pbml0X21lbWN0cmwoZGV2KTsKKwkvKiAyLiBJbml0aWFsaXplIHJlZ2lzdGVycyBvZiBjaGFubmVsIEkvRiAqLworCXM1cF9tZmNfY2xlYXJfY21kcyhkZXYpOworCXM1cF9tZmNfY2xlYW5fZGV2X2ludF9mbGFncyhkZXYpOworCS8qIDMuIEluaXRpYWxpemUgZmlybXdhcmUgKi8KKwlyZXQgPSBzNXBfbWZjX3dha2V1cF9jbWQoZGV2KTsKKwlpZiAocmV0KSB7CisJCW1mY19lcnIoIkZhaWxlZCB0byBzZW5kIGNvbW1hbmQgdG8gTUZDIC0gdGltZW91dFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCS8qIDQuIFJlbGVhc2UgcmVzZXQgc2lnbmFsIHRvIHRoZSBSSVNDICovCisJbWZjX3dyaXRlKGRldiwgMHgzZmYsIFM1UF9GSU1WX1NXX1JFU0VUKTsKKwltZmNfZGVidWcoMiwgIk9rLCBub3cgd2lsbCB3cml0ZSBhIGNvbW1hbmQgdG8gd2FrZXVwIHRoZSBzeXN0ZW1cbiIpOworCWlmIChzNXBfbWZjX3dhaXRfZm9yX2RvbmVfZGV2KGRldiwgUzVQX0ZJTVZfUjJIX0NNRF9XQUtFVVBfUkVUKSkgeworCQltZmNfZXJyKCJGYWlsZWQgdG8gbG9hZCBmaXJtd2FyZVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlzNXBfbWZjX2Nsb2NrX29mZigpOworCWRldi0+aW50X2NvbmQgPSAwOworCWlmIChkZXYtPmludF9lcnIgIT0gMCB8fCBkZXYtPmludF90eXBlICE9CisJCQkJCQlTNVBfRklNVl9SMkhfQ01EX1dBS0VVUF9SRVQpIHsKKwkJLyogRmFpbHVyZS4gKi8KKwkJbWZjX2VycigiRmFpbGVkIHRvIHdha2V1cCAtIGVycm9yOiAlZCBpbnQ6ICVkXG4iLCBkZXYtPmludF9lcnIsCisJCQkJCQkJCWRldi0+aW50X3R5cGUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJbWZjX2RlYnVnX2xlYXZlKCk7CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2N0cmwuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2N0cmwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWRjMjNiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfY3RybC5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19jdHJsLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBTNVBfTUZDX0NUUkxfSAorI2RlZmluZSBTNVBfTUZDX0NUUkxfSAorCisjaW5jbHVkZSAiczVwX21mY19jb21tb24uaCIKKworaW50IHM1cF9tZmNfcmVsZWFzZV9maXJtd2FyZShzdHJ1Y3QgczVwX21mY19kZXYgKmRldik7CitpbnQgczVwX21mY19hbGxvY19hbmRfbG9hZF9maXJtd2FyZShzdHJ1Y3QgczVwX21mY19kZXYgKmRldik7CitpbnQgczVwX21mY19yZWxvYWRfZmlybXdhcmUoc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYpOworCitpbnQgczVwX21mY19pbml0X2h3KHN0cnVjdCBzNXBfbWZjX2RldiAqZGV2KTsKKworaW50IHM1cF9tZmNfc2xlZXAoc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYpOworaW50IHM1cF9tZmNfd2FrZXVwKHN0cnVjdCBzNXBfbWZjX2RldiAqZGV2KTsKKworaW50IHM1cF9tZmNfcmVzZXQoc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYpOworCisjZW5kaWYgLyogUzVQX01GQ19DVFJMX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2RlYnVnLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19kZWJ1Zy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjYjg2MTYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19kZWJ1Zy5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBkcml2ZXJzL21lZGlhL3ZpZGVvL3NhbXN1bmcvbWZjNS9zNXBfbWZjX2RlYnVnLmgKKyAqCisgKiBIZWFkZXIgZmlsZSBmb3IgU2Ftc3VuZyBNRkMgKE11bHRpIEZ1bmN0aW9uIENvZGVjIC0gRklNVikgZHJpdmVyCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZGVidWcgbWFjcm9zCisgKgorICogS2FtaWwgRGVic2tpLCBDb3B5cmlnaHQgKGMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcworICogaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpZm5kZWYgUzVQX01GQ19ERUJVR19IXworI2RlZmluZSBTNVBfTUZDX0RFQlVHX0hfCisKKyNkZWZpbmUgREVCVUcKKworI2lmZGVmIERFQlVHCitleHRlcm4gaW50IGRlYnVnOworCisjZGVmaW5lIG1mY19kZWJ1ZyhsZXZlbCwgZm10LCBhcmdzLi4uKQkJCQlcCisJZG8gewkJCQkJCQlcCisJCWlmIChkZWJ1ZyA+PSBsZXZlbCkJCQkJXAorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiVkOiAiIGZtdCwJXAorCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgIyNhcmdzKTsJXAorCX0gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBtZmNfZGVidWcobGV2ZWwsIGZtdCwgYXJncy4uLikKKyNlbmRpZgorCisjZGVmaW5lIG1mY19kZWJ1Z19lbnRlcigpIG1mY19kZWJ1Zyg1LCAiZW50ZXIiKQorI2RlZmluZSBtZmNfZGVidWdfbGVhdmUoKSBtZmNfZGVidWcoNSwgImxlYXZlIikKKworI2RlZmluZSBtZmNfZXJyKGZtdCwgYXJncy4uLikJCQkJXAorCWRvIHsJCQkJCQlcCisJCXByaW50ayhLRVJOX0VSUiAiJXM6JWQ6ICIgZm10LAkJXAorCQkgICAgICAgX19mdW5jX18sIF9fTElORV9fLCAjI2FyZ3MpOwlcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBtZmNfaW5mbyhmbXQsIGFyZ3MuLi4pCQkJCVwKKwlkbyB7CQkJCQkJXAorCQlwcmludGsoS0VSTl9JTkZPICIlczolZDogIiBmbXQsCQlcCisJCSAgICAgICBfX2Z1bmNfXywgX19MSU5FX18sICMjYXJncyk7CVwKKwl9IHdoaWxlICgwKQorCisjZW5kaWYgLyogUzVQX01GQ19ERUJVR19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfZGVjLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19kZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmM1MDUyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfZGVjLmMKQEAgLTAsMCArMSwxMDM2IEBACisvKgorICogbGludXgvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfZGVjLmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLworICogS2FtaWwgRGVic2tpLCA8ay5kZWJza2lAc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgorI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi1jb3JlLmg+CisjaW5jbHVkZSAicmVncy1tZmMuaCIKKyNpbmNsdWRlICJzNXBfbWZjX2NvbW1vbi5oIgorI2luY2x1ZGUgInM1cF9tZmNfZGVidWcuaCIKKyNpbmNsdWRlICJzNXBfbWZjX2RlYy5oIgorI2luY2x1ZGUgInM1cF9tZmNfaW50ci5oIgorI2luY2x1ZGUgInM1cF9tZmNfb3ByLmgiCisjaW5jbHVkZSAiczVwX21mY19wbS5oIgorI2luY2x1ZGUgInM1cF9tZmNfc2htLmgiCisKK3N0YXRpYyBzdHJ1Y3QgczVwX21mY19mbXQgZm9ybWF0c1tdID0geworCXsKKwkJLm5hbWUJCT0gIjQ6MjowIDIgUGxhbmVzIDY0eDMyIFRpbGVzIiwKKwkJLmZvdXJjYwkJPSBWNEwyX1BJWF9GTVRfTlYxMk1ULAorCQkuY29kZWNfbW9kZQk9IFM1UF9GSU1WX0NPREVDX05PTkUsCisJCS50eXBlCQk9IE1GQ19GTVRfUkFXLAorCQkubnVtX3BsYW5lcwk9IDIsCisJIH0sCisJeworCQkubmFtZSA9ICI0OjI6MCAyIFBsYW5lcyIsCisJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfTlYxMk0sCisJCS5jb2RlY19tb2RlID0gUzVQX0ZJTVZfQ09ERUNfTk9ORSwKKwkJLnR5cGUgPSBNRkNfRk1UX1JBVywKKwkJLm51bV9wbGFuZXMgPSAyLAorCX0sCisJeworCQkubmFtZSA9ICJIMjY0IEVuY29kZWQgU3RyZWFtIiwKKwkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9IMjY0LAorCQkuY29kZWNfbW9kZSA9IFM1UF9GSU1WX0NPREVDX0gyNjRfREVDLAorCQkudHlwZSA9IE1GQ19GTVRfREVDLAorCQkubnVtX3BsYW5lcyA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gIkgyNjMgRW5jb2RlZCBTdHJlYW0iLAorCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX0gyNjMsCisJCS5jb2RlY19tb2RlID0gUzVQX0ZJTVZfQ09ERUNfSDI2M19ERUMsCisJCS50eXBlID0gTUZDX0ZNVF9ERUMsCisJCS5udW1fcGxhbmVzID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTVBFRzEgRW5jb2RlZCBTdHJlYW0iLAorCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX01QRUcxLAorCQkuY29kZWNfbW9kZSA9IFM1UF9GSU1WX0NPREVDX01QRUcyX0RFQywKKwkJLnR5cGUgPSBNRkNfRk1UX0RFQywKKwkJLm51bV9wbGFuZXMgPSAxLAorCX0sCisJeworCQkubmFtZSA9ICJNUEVHMiBFbmNvZGVkIFN0cmVhbSIsCisJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfTVBFRzIsCisJCS5jb2RlY19tb2RlID0gUzVQX0ZJTVZfQ09ERUNfTVBFRzJfREVDLAorCQkudHlwZSA9IE1GQ19GTVRfREVDLAorCQkubnVtX3BsYW5lcyA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gIk1QRUc0IEVuY29kZWQgU3RyZWFtIiwKKwkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9NUEVHNCwKKwkJLmNvZGVjX21vZGUgPSBTNVBfRklNVl9DT0RFQ19NUEVHNF9ERUMsCisJCS50eXBlID0gTUZDX0ZNVF9ERUMsCisJCS5udW1fcGxhbmVzID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiWHZpRCBFbmNvZGVkIFN0cmVhbSIsCisJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfWFZJRCwKKwkJLmNvZGVjX21vZGUgPSBTNVBfRklNVl9DT0RFQ19NUEVHNF9ERUMsCisJCS50eXBlID0gTUZDX0ZNVF9ERUMsCisJCS5udW1fcGxhbmVzID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiVkMxIEVuY29kZWQgU3RyZWFtIiwKKwkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9WQzFfQU5ORVhfRywKKwkJLmNvZGVjX21vZGUgPSBTNVBfRklNVl9DT0RFQ19WQzFfREVDLAorCQkudHlwZSA9IE1GQ19GTVRfREVDLAorCQkubnVtX3BsYW5lcyA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gIlZDMSBSQ1YgRW5jb2RlZCBTdHJlYW0iLAorCQkuZm91cmNjID0gVjRMMl9QSVhfRk1UX1ZDMV9BTk5FWF9MLAorCQkuY29kZWNfbW9kZSA9IFM1UF9GSU1WX0NPREVDX1ZDMVJDVl9ERUMsCisJCS50eXBlID0gTUZDX0ZNVF9ERUMsCisJCS5udW1fcGxhbmVzID0gMSwKKwl9LAorfTsKKworI2RlZmluZSBOVU1fRk9STUFUUyBBUlJBWV9TSVpFKGZvcm1hdHMpCisKKy8qIEZpbmQgc2VsZWN0ZWQgZm9ybWF0IGRlc2NyaXB0aW9uICovCitzdGF0aWMgc3RydWN0IHM1cF9tZmNfZm10ICpmaW5kX2Zvcm1hdChzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYsIHVuc2lnbmVkIGludCB0KQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9GT1JNQVRTOyBpKyspIHsKKwkJaWYgKGZvcm1hdHNbaV0uZm91cmNjID09IGYtPmZtdC5waXhfbXAucGl4ZWxmb3JtYXQgJiYKKwkJICAgIGZvcm1hdHNbaV0udHlwZSA9PSB0KQorCQkJcmV0dXJuICZmb3JtYXRzW2ldOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBtZmNfY29udHJvbCBjb250cm9sc1tdID0geworCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19ERUNPREVSX0gyNjRfRElTUExBWV9ERUxBWSwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSA9ICJIMjY0IERpc3BsYXkgRGVsYXkiLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gMTYzODMsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAwLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0RFQ09ERVJfSDI2NF9ESVNQTEFZX0RFTEFZX0VOQUJMRSwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCQkubmFtZSA9ICJIMjY0IERpc3BsYXkgRGVsYXkgRW5hYmxlIiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDEsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAwLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX0RFQ09ERVJfTVBFRzRfREVCTE9DS19GSUxURVIsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJLm5hbWUgPSAiTXBlZzQgTG9vcCBGaWx0ZXIgRW5hYmxlIiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDEsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAwLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX0RFQ09ERVJfU0xJQ0VfSU5URVJGQUNFLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCS5uYW1lID0gIlNsaWNlIEludGVyZmFjZSBFbmFibGUiLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gMSwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01JTl9CVUZGRVJTX0ZPUl9DQVBUVVJFLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lID0gIk1pbmltdW0gbnVtYmVyIG9mIGNhcCBidWZzIiwKKwkJLm1pbmltdW0gPSAxLAorCQkubWF4aW11bSA9IDMyLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMSwKKwkJLmlzX3ZvbGF0aWxlID0gMSwKKwl9LAorfTsKKworI2RlZmluZSBOVU1fQ1RSTFMgQVJSQVlfU0laRShjb250cm9scykKKworLyogQ2hlY2sgd2hldGhlciBhIGNvbnRleHQgc2hvdWxkIGJlIHJ1biBvbiBoYXJkd2FyZSAqLworc3RhdGljIGludCBzNXBfbWZjX2N0eF9yZWFkeShzdHJ1Y3QgczVwX21mY19jdHggKmN0eCkKK3sKKwkvKiBDb250ZXh0IGlzIHRvIHBhcnNlIGhlYWRlciAqLworCWlmIChjdHgtPnNyY19xdWV1ZV9jbnQgPj0gMSAmJiBjdHgtPnN0YXRlID09IE1GQ0lOU1RfR09UX0lOU1QpCisJCXJldHVybiAxOworCS8qIENvbnRleHQgaXMgdG8gZGVjb2RlIGEgZnJhbWUgKi8KKwlpZiAoY3R4LT5zcmNfcXVldWVfY250ID49IDEgJiYKKwkgICAgY3R4LT5zdGF0ZSA9PSBNRkNJTlNUX1JVTk5JTkcgJiYKKwkgICAgY3R4LT5kc3RfcXVldWVfY250ID49IGN0eC0+ZHBiX2NvdW50KQorCQlyZXR1cm4gMTsKKwkvKiBDb250ZXh0IGlzIHRvIHJldHVybiBsYXN0IGZyYW1lICovCisJaWYgKGN0eC0+c3RhdGUgPT0gTUZDSU5TVF9GSU5JU0hJTkcgJiYKKwkgICAgY3R4LT5kc3RfcXVldWVfY250ID49IGN0eC0+ZHBiX2NvdW50KQorCQlyZXR1cm4gMTsKKwkvKiBDb250ZXh0IGlzIHRvIHNldCBidWZmZXJzICovCisJaWYgKGN0eC0+c3JjX3F1ZXVlX2NudCA+PSAxICYmCisJICAgIGN0eC0+c3RhdGUgPT0gTUZDSU5TVF9IRUFEX1BBUlNFRCAmJgorCSAgICBjdHgtPmNhcHR1cmVfc3RhdGUgPT0gUVVFVUVfQlVGU19NTUFQRUQpCisJCXJldHVybiAxOworCS8qIFJlc29sdXRpb24gY2hhbmdlICovCisJaWYgKChjdHgtPnN0YXRlID09IE1GQ0lOU1RfUkVTX0NIQU5HRV9JTklUIHx8CisJCWN0eC0+c3RhdGUgPT0gTUZDSU5TVF9SRVNfQ0hBTkdFX0ZMVVNIKSAmJgorCQljdHgtPmRzdF9xdWV1ZV9jbnQgPj0gY3R4LT5kcGJfY291bnQpCisJCXJldHVybiAxOworCWlmIChjdHgtPnN0YXRlID09IE1GQ0lOU1RfUkVTX0NIQU5HRV9FTkQgJiYKKwkJY3R4LT5zcmNfcXVldWVfY250ID49IDEpCisJCXJldHVybiAxOworCW1mY19kZWJ1ZygyLCAiY3R4IGlzIG5vdCByZWFkeVxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgczVwX21mY19jb2RlY19vcHMgZGVjb2Rlcl9jb2RlY19vcHMgPSB7CisJLnByZV9zZXFfc3RhcnQJCT0gTlVMTCwKKwkucG9zdF9zZXFfc3RhcnQJCT0gTlVMTCwKKwkucHJlX2ZyYW1lX3N0YXJ0CT0gTlVMTCwKKwkucG9zdF9mcmFtZV9zdGFydAk9IE5VTEwsCit9OworCisvKiBRdWVyeSBjYXBhYmlsaXRpZXMgb2YgdGhlIGRldmljZSAqLworc3RhdGljIGludCB2aWRpb2NfcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXApCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCisJc3RybmNweShjYXAtPmRyaXZlciwgZGV2LT5wbGF0X2Rldi0+bmFtZSwgc2l6ZW9mKGNhcC0+ZHJpdmVyKSAtIDEpOworCXN0cm5jcHkoY2FwLT5jYXJkLCBkZXYtPnBsYXRfZGV2LT5uYW1lLCBzaXplb2YoY2FwLT5jYXJkKSAtIDEpOworCWNhcC0+YnVzX2luZm9bMF0gPSAwOworCWNhcC0+dmVyc2lvbiA9IEtFUk5FTF9WRVJTSU9OKDEsIDAsIDApOworCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1ZJREVPX09VVFBVVAorCQkJCQkJICAgIHwgVjRMMl9DQVBfU1RSRUFNSU5HOworCXJldHVybiAwOworfQorCisvKiBFbnVtZXJhdGUgZm9ybWF0ICovCitzdGF0aWMgaW50IHZpZGlvY19lbnVtX2ZtdChzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmLCBib29sIG1wbGFuZSwgYm9vbCBvdXQpCit7CisJc3RydWN0IHM1cF9tZmNfZm10ICpmbXQ7CisJaW50IGksIGogPSAwOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZm9ybWF0cyk7ICsraSkgeworCQlpZiAobXBsYW5lICYmIGZvcm1hdHNbaV0ubnVtX3BsYW5lcyA9PSAxKQorCQkJY29udGludWU7CisJCWVsc2UgaWYgKCFtcGxhbmUgJiYgZm9ybWF0c1tpXS5udW1fcGxhbmVzID4gMSkKKwkJCWNvbnRpbnVlOworCQlpZiAob3V0ICYmIGZvcm1hdHNbaV0udHlwZSAhPSBNRkNfRk1UX0RFQykKKwkJCWNvbnRpbnVlOworCQllbHNlIGlmICghb3V0ICYmIGZvcm1hdHNbaV0udHlwZSAhPSBNRkNfRk1UX1JBVykKKwkJCWNvbnRpbnVlOworCisJCWlmIChqID09IGYtPmluZGV4KQorCQkJYnJlYWs7CisJCSsrajsKKwl9CisJaWYgKGkgPT0gQVJSQVlfU0laRShmb3JtYXRzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZm10ID0gJmZvcm1hdHNbaV07CisJc3RybGNweShmLT5kZXNjcmlwdGlvbiwgZm10LT5uYW1lLCBzaXplb2YoZi0+ZGVzY3JpcHRpb24pKTsKKwlmLT5waXhlbGZvcm1hdCA9IGZtdC0+Zm91cmNjOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19lbnVtX2ZtdF92aWRfY2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwaXJ2LAorCQkJCQkJCXN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYpCit7CisJcmV0dXJuIHZpZGlvY19lbnVtX2ZtdChmLCBmYWxzZSwgZmFsc2UpOworfQorCitzdGF0aWMgaW50IHZpZGlvY19lbnVtX2ZtdF92aWRfY2FwX21wbGFuZShzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcGlydiwKKwkJCQkJCQlzdHJ1Y3QgdjRsMl9mbXRkZXNjICpmKQoreworCXJldHVybiB2aWRpb2NfZW51bV9mbXQoZiwgdHJ1ZSwgZmFsc2UpOworfQorCitzdGF0aWMgaW50IHZpZGlvY19lbnVtX2ZtdF92aWRfb3V0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcm92LAorCQkJCQkJCXN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYpCit7CisJcmV0dXJuIHZpZGlvY19lbnVtX2ZtdChmLCBmYWxzZSwgdHJ1ZSk7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2VudW1fZm10X3ZpZF9vdXRfbXBsYW5lKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcm92LAorCQkJCQkJCXN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYpCit7CisJcmV0dXJuIHZpZGlvY19lbnVtX2ZtdChmLCB0cnVlLCB0cnVlKTsKK30KKworLyogR2V0IGZvcm1hdCAqLworc3RhdGljIGludCB2aWRpb2NfZ19mbXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3QgczVwX21mY19jdHggKmN0eCA9IGZoX3RvX2N0eChwcml2KTsKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0X21wbGFuZSAqcGl4X21wOworCisJbWZjX2RlYnVnX2VudGVyKCk7CisJcGl4X21wID0gJmYtPmZtdC5waXhfbXA7CisJaWYgKGYtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSAmJgorCSAgICAoY3R4LT5zdGF0ZSA9PSBNRkNJTlNUX0dPVF9JTlNUIHx8IGN0eC0+c3RhdGUgPT0KKwkJCQkJCU1GQ0lOU1RfUkVTX0NIQU5HRV9FTkQpKSB7CisJCS8qIElmIHRoZSBNRkMgaXMgcGFyc2luZyB0aGUgaGVhZGVyLAorCQkgKiBzbyB3YWl0IHVudGlsIGl0IGlzIGZpbmlzaGVkICovCisJCXM1cF9tZmNfY2xlYW5fY3R4X2ludF9mbGFncyhjdHgpOworCQlzNXBfbWZjX3dhaXRfZm9yX2RvbmVfY3R4KGN0eCwgUzVQX0ZJTVZfUjJIX0NNRF9TRVFfRE9ORV9SRVQsCisJCQkJCQkJCQkwKTsKKwl9CisJaWYgKGYtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSAmJgorCSAgICBjdHgtPnN0YXRlID49IE1GQ0lOU1RfSEVBRF9QQVJTRUQgJiYKKwkgICAgY3R4LT5zdGF0ZSA8IE1GQ0lOU1RfQUJPUlQpIHsKKwkJLyogVGhpcyBpcyBydW4gb24gQ0FQVFVSRSAoZGVjb2RlIG91dHB1dCkgKi8KKwkJLyogV2lkdGggYW5kIGhlaWdodCBhcmUgc2V0IHRvIHRoZSBkaW1lbnNpb25zCisJCSAgIG9mIHRoZSBtb3ZpZSwgdGhlIGJ1ZmZlciBpcyBiaWdnZXIgYW5kCisJCSAgIGZ1cnRoZXIgcHJvY2Vzc2luZyBzdGFnZXMgc2hvdWxkIGNyb3AgdG8gdGhpcworCQkgICByZWN0YW5nbGUuICovCisJCXBpeF9tcC0+d2lkdGggPSBjdHgtPmJ1Zl93aWR0aDsKKwkJcGl4X21wLT5oZWlnaHQgPSBjdHgtPmJ1Zl9oZWlnaHQ7CisJCXBpeF9tcC0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJCXBpeF9tcC0+bnVtX3BsYW5lcyA9IDI7CisJCS8qIFNldCBwaXhlbGZvcm1hdCB0byB0aGUgZm9ybWF0IGluIHdoaWNoIE1GQworCQkgICBvdXRwdXRzIHRoZSBkZWNvZGVkIGZyYW1lICovCisJCXBpeF9tcC0+cGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfTlYxMk1UOworCQlwaXhfbXAtPnBsYW5lX2ZtdFswXS5ieXRlc3BlcmxpbmUgPSBjdHgtPmJ1Zl93aWR0aDsKKwkJcGl4X21wLT5wbGFuZV9mbXRbMF0uc2l6ZWltYWdlID0gY3R4LT5sdW1hX3NpemU7CisJCXBpeF9tcC0+cGxhbmVfZm10WzFdLmJ5dGVzcGVybGluZSA9IGN0eC0+YnVmX3dpZHRoOworCQlwaXhfbXAtPnBsYW5lX2ZtdFsxXS5zaXplaW1hZ2UgPSBjdHgtPmNocm9tYV9zaXplOworCX0gZWxzZSBpZiAoZi0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpIHsKKwkJLyogVGhpcyBpcyBydW4gb24gT1VUUFVUCisJCSAgIFRoZSBidWZmZXIgY29udGFpbnMgY29tcHJlc3NlZCBpbWFnZQorCQkgICBzbyB3aWR0aCBhbmQgaGVpZ2h0IGhhdmUgbm8gbWVhbmluZyAqLworCQlwaXhfbXAtPndpZHRoID0gMDsKKwkJcGl4X21wLT5oZWlnaHQgPSAwOworCQlwaXhfbXAtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOworCQlwaXhfbXAtPnBsYW5lX2ZtdFswXS5ieXRlc3BlcmxpbmUgPSBjdHgtPmRlY19zcmNfYnVmX3NpemU7CisJCXBpeF9tcC0+cGxhbmVfZm10WzBdLnNpemVpbWFnZSA9IGN0eC0+ZGVjX3NyY19idWZfc2l6ZTsKKwkJcGl4X21wLT5waXhlbGZvcm1hdCA9IGN0eC0+c3JjX2ZtdC0+Zm91cmNjOworCQlwaXhfbXAtPm51bV9wbGFuZXMgPSBjdHgtPnNyY19mbXQtPm51bV9wbGFuZXM7CisJfSBlbHNlIHsKKwkJbWZjX2VycigiRm9ybWF0IGNvdWxkIG5vdCBiZSByZWFkXG4iKTsKKwkJbWZjX2RlYnVnKDIsICIlcy0tIHdpdGggZXJyb3JcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1mY19kZWJ1Z19sZWF2ZSgpOworCXJldHVybiAwOworfQorCisvKiBUcnkgZm9ybWF0ICovCitzdGF0aWMgaW50IHZpZGlvY190cnlfZm10KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IHM1cF9tZmNfZm10ICpmbXQ7CisKKwlpZiAoZi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpIHsKKwkJbWZjX2VycigiVGhpcyBub2RlIHN1cHBvcnRzIGRlY29kaW5nIG9ubHlcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZm10ID0gZmluZF9mb3JtYXQoZiwgTUZDX0ZNVF9ERUMpOworCWlmICghZm10KSB7CisJCW1mY19lcnIoIlVuc3VwcG9ydGVkIGZvcm1hdFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoZm10LT50eXBlICE9IE1GQ19GTVRfREVDKSB7CisJCW1mY19lcnIoIlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogU2V0IGZvcm1hdCAqLworc3RhdGljIGludCB2aWRpb2Nfc19mbXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBmaF90b19jdHgocHJpdik7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHM1cF9tZmNfZm10ICpmbXQ7CisJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdF9tcGxhbmUgKnBpeF9tcDsKKworCW1mY19kZWJ1Z19lbnRlcigpOworCXJldCA9IHZpZGlvY190cnlfZm10KGZpbGUsIHByaXYsIGYpOworCXBpeF9tcCA9ICZmLT5mbXQucGl4X21wOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJaWYgKGN0eC0+dnFfc3JjLnN0cmVhbWluZyB8fCBjdHgtPnZxX2RzdC5zdHJlYW1pbmcpIHsKKwkJdjRsMl9lcnIoJmRldi0+djRsMl9kZXYsICIlcyBxdWV1ZSBidXN5XG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCWZtdCA9IGZpbmRfZm9ybWF0KGYsIE1GQ19GTVRfREVDKTsKKwlpZiAoIWZtdCB8fCBmbXQtPmNvZGVjX21vZGUgPT0gUzVQX0ZJTVZfQ09ERUNfTk9ORSkgeworCQltZmNfZXJyKCJVbmtub3duIGNvZGVjXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCWlmIChmbXQtPnR5cGUgIT0gTUZDX0ZNVF9ERUMpIHsKKwkJbWZjX2VycigiV3JvbmcgZm9ybWF0IHNlbGVjdGVkLCB5b3Ugc2hvdWxkIGNob29zZSAiCisJCQkJCSJmb3JtYXQgZm9yIGRlY29kaW5nXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCWN0eC0+c3JjX2ZtdCA9IGZtdDsKKwljdHgtPmNvZGVjX21vZGUgPSBmbXQtPmNvZGVjX21vZGU7CisJbWZjX2RlYnVnKDIsICJUaGUgY29kZWMgbnVtYmVyIGlzOiAlZFxuIiwgY3R4LT5jb2RlY19tb2RlKTsKKwlwaXhfbXAtPmhlaWdodCA9IDA7CisJcGl4X21wLT53aWR0aCA9IDA7CisJaWYgKHBpeF9tcC0+cGxhbmVfZm10WzBdLnNpemVpbWFnZSkKKwkJY3R4LT5kZWNfc3JjX2J1Zl9zaXplID0gcGl4X21wLT5wbGFuZV9mbXRbMF0uc2l6ZWltYWdlOworCWVsc2UKKwkJcGl4X21wLT5wbGFuZV9mbXRbMF0uc2l6ZWltYWdlID0gY3R4LT5kZWNfc3JjX2J1Zl9zaXplID0KKwkJCQkJCQkJREVGX0NQQl9TSVpFOworCXBpeF9tcC0+cGxhbmVfZm10WzBdLmJ5dGVzcGVybGluZSA9IDA7CisJY3R4LT5zdGF0ZSA9IE1GQ0lOU1RfSU5JVDsKK291dDoKKwltZmNfZGVidWdfbGVhdmUoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBSZXFldXN0IGJ1ZmZlcnMgKi8KK3N0YXRpYyBpbnQgdmlkaW9jX3JlcWJ1ZnMoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCSAgc3RydWN0IHY0bDJfcmVxdWVzdGJ1ZmZlcnMgKnJlcWJ1ZnMpCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHByaXYpOworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAocmVxYnVmcy0+bWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVApIHsKKwkJbWZjX2VycigiT25seSBWNEwyX01FTU9SWV9NQVAgaXMgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChyZXFidWZzLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSkgeworCQkvKiBDYW4gb25seSByZXF1ZXN0IGJ1ZmZlcnMgYWZ0ZXIgYW4gaW5zdGFuY2UgaGFzIGJlZW4gb3BlbmVkLiovCisJCWlmIChjdHgtPnN0YXRlID09IE1GQ0lOU1RfSU5JVCkgeworCQkJY3R4LT5zcmNfYnVmc19jbnQgPSAwOworCQkJaWYgKHJlcWJ1ZnMtPmNvdW50ID09IDApIHsKKwkJCQltZmNfZGVidWcoMiwgIkZyZWVpbmcgYnVmZmVyc1xuIik7CisJCQkJczVwX21mY19jbG9ja19vbigpOworCQkJCXJldCA9IHZiMl9yZXFidWZzKCZjdHgtPnZxX3NyYywgcmVxYnVmcyk7CisJCQkJczVwX21mY19jbG9ja19vZmYoKTsKKwkJCQlyZXR1cm4gcmV0OworCQkJfQorCQkJLyogRGVjb2RpbmcgKi8KKwkJCWlmIChjdHgtPm91dHB1dF9zdGF0ZSAhPSBRVUVVRV9GUkVFKSB7CisJCQkJbWZjX2VycigiQnVmcyBoYXZlIGFscmVhZHkgYmVlbiByZXF1ZXN0ZWRcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJczVwX21mY19jbG9ja19vbigpOworCQkJcmV0ID0gdmIyX3JlcWJ1ZnMoJmN0eC0+dnFfc3JjLCByZXFidWZzKTsKKwkJCXM1cF9tZmNfY2xvY2tfb2ZmKCk7CisJCQlpZiAocmV0KSB7CisJCQkJbWZjX2VycigidmIyX3JlcWJ1ZnMgb24gb3V0cHV0IGZhaWxlZFxuIik7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJCW1mY19kZWJ1ZygyLCAidmIyX3JlcWJ1ZnM6ICVkXG4iLCByZXQpOworCQkJY3R4LT5vdXRwdXRfc3RhdGUgPSBRVUVVRV9CVUZTX1JFUVVFU1RFRDsKKwkJfQorCX0gZWxzZSBpZiAocmVxYnVmcy0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKSB7CisJCWN0eC0+ZHN0X2J1ZnNfY250ID0gMDsKKwkJaWYgKHJlcWJ1ZnMtPmNvdW50ID09IDApIHsKKwkJCW1mY19kZWJ1ZygyLCAiRnJlZWluZyBidWZmZXJzXG4iKTsKKwkJCXM1cF9tZmNfY2xvY2tfb24oKTsKKwkJCXJldCA9IHZiMl9yZXFidWZzKCZjdHgtPnZxX2RzdCwgcmVxYnVmcyk7CisJCQlzNXBfbWZjX2Nsb2NrX29mZigpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlpZiAoY3R4LT5jYXB0dXJlX3N0YXRlICE9IFFVRVVFX0ZSRUUpIHsKKwkJCW1mY19lcnIoIkJ1ZnMgaGF2ZSBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWN0eC0+Y2FwdHVyZV9zdGF0ZSA9IFFVRVVFX0JVRlNfUkVRVUVTVEVEOworCQlzNXBfbWZjX2Nsb2NrX29uKCk7CisJCXJldCA9IHZiMl9yZXFidWZzKCZjdHgtPnZxX2RzdCwgcmVxYnVmcyk7CisJCXM1cF9tZmNfY2xvY2tfb2ZmKCk7CisJCWlmIChyZXQpIHsKKwkJCW1mY19lcnIoInZiMl9yZXFidWZzIG9uIGNhcHR1cmUgZmFpbGVkXG4iKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJaWYgKHJlcWJ1ZnMtPmNvdW50IDwgY3R4LT5kcGJfY291bnQpIHsKKwkJCW1mY19lcnIoIk5vdCBlbm91Z2ggYnVmZmVycyBhbGxvY2F0ZWRcbiIpOworCQkJcmVxYnVmcy0+Y291bnQgPSAwOworCQkJczVwX21mY19jbG9ja19vbigpOworCQkJcmV0ID0gdmIyX3JlcWJ1ZnMoJmN0eC0+dnFfZHN0LCByZXFidWZzKTsKKwkJCXM1cF9tZmNfY2xvY2tfb2ZmKCk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQljdHgtPnRvdGFsX2RwYl9jb3VudCA9IHJlcWJ1ZnMtPmNvdW50OworCQlyZXQgPSBzNXBfbWZjX2FsbG9jX2NvZGVjX2J1ZmZlcnMoY3R4KTsKKwkJaWYgKHJldCkgeworCQkJbWZjX2VycigiRmFpbGVkIHRvIGFsbG9jYXRlIGRlY29kaW5nIGJ1ZmZlcnNcbiIpOworCQkJcmVxYnVmcy0+Y291bnQgPSAwOworCQkJczVwX21mY19jbG9ja19vbigpOworCQkJcmV0ID0gdmIyX3JlcWJ1ZnMoJmN0eC0+dnFfZHN0LCByZXFidWZzKTsKKwkJCXM1cF9tZmNfY2xvY2tfb2ZmKCk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlpZiAoY3R4LT5kc3RfYnVmc19jbnQgPT0gY3R4LT50b3RhbF9kcGJfY291bnQpIHsKKwkJCWN0eC0+Y2FwdHVyZV9zdGF0ZSA9IFFVRVVFX0JVRlNfTU1BUEVEOworCQl9IGVsc2UgeworCQkJbWZjX2VycigiTm90IGFsbCBidWZmZXJzIHBhc3NlZCB0byBidWZfaW5pdFxuIik7CisJCQlyZXFidWZzLT5jb3VudCA9IDA7CisJCQlzNXBfbWZjX2Nsb2NrX29uKCk7CisJCQlyZXQgPSB2YjJfcmVxYnVmcygmY3R4LT52cV9kc3QsIHJlcWJ1ZnMpOworCQkJczVwX21mY19yZWxlYXNlX2NvZGVjX2J1ZmZlcnMoY3R4KTsKKwkJCXM1cF9tZmNfY2xvY2tfb2ZmKCk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlpZiAoczVwX21mY19jdHhfcmVhZHkoY3R4KSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+Y29uZGxvY2ssIGZsYWdzKTsKKwkJCXNldF9iaXQoY3R4LT5udW0sICZkZXYtPmN0eF93b3JrX2JpdHMpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5jb25kbG9jaywgZmxhZ3MpOworCQl9CisJCXM1cF9tZmNfdHJ5X3J1bihkZXYpOworCQlzNXBfbWZjX3dhaXRfZm9yX2RvbmVfY3R4KGN0eCwKKwkJCQkJIFM1UF9GSU1WX1IySF9DTURfSU5JVF9CVUZGRVJTX1JFVCwgMCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIFF1ZXJ5IGJ1ZmZlciAqLworc3RhdGljIGludCB2aWRpb2NfcXVlcnlidWYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkJCQkgICBzdHJ1Y3QgdjRsMl9idWZmZXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgczVwX21mY19jdHggKmN0eCA9IGZoX3RvX2N0eChwcml2KTsKKwlpbnQgcmV0OworCWludCBpOworCisJaWYgKGJ1Zi0+bWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVApIHsKKwkJbWZjX2VycigiT25seSBtbWFwZWQgYnVmZmVycyBjYW4gYmUgdXNlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwltZmNfZGVidWcoMiwgIlN0YXRlOiAlZCwgYnVmLT50eXBlOiAlZFxuIiwgY3R4LT5zdGF0ZSwgYnVmLT50eXBlKTsKKwlpZiAoY3R4LT5zdGF0ZSA9PSBNRkNJTlNUX0lOSVQgJiYKKwkJCWJ1Zi0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpIHsKKwkJcmV0ID0gdmIyX3F1ZXJ5YnVmKCZjdHgtPnZxX3NyYywgYnVmKTsKKwl9IGVsc2UgaWYgKGN0eC0+c3RhdGUgPT0gTUZDSU5TVF9SVU5OSU5HICYmCisJCQlidWYtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkgeworCQlyZXQgPSB2YjJfcXVlcnlidWYoJmN0eC0+dnFfZHN0LCBidWYpOworCQlmb3IgKGkgPSAwOyBpIDwgYnVmLT5sZW5ndGg7IGkrKykKKwkJCWJ1Zi0+bS5wbGFuZXNbaV0ubS5tZW1fb2Zmc2V0ICs9IERTVF9RVUVVRV9PRkZfQkFTRTsKKwl9IGVsc2UgeworCQltZmNfZXJyKCJ2aWRpb2NfcXVlcnlidWYgY2FsbGVkIGluIGFuIGluYXBwcm9wcmlhdGUgc3RhdGVcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKwltZmNfZGVidWdfbGVhdmUoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBRdWV1ZSBhIGJ1ZmZlciAqLworc3RhdGljIGludCB2aWRpb2NfcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCit7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBmaF90b19jdHgocHJpdik7CisKKwlpZiAoY3R4LT5zdGF0ZSA9PSBNRkNJTlNUX0VSUk9SKSB7CisJCW1mY19lcnIoIkNhbGwgb24gUUJVRiBhZnRlciB1bnJlY292ZXJhYmxlIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmIChidWYtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKQorCQlyZXR1cm4gdmIyX3FidWYoJmN0eC0+dnFfc3JjLCBidWYpOworCWVsc2UgaWYgKGJ1Zi0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKQorCQlyZXR1cm4gdmIyX3FidWYoJmN0eC0+dnFfZHN0LCBidWYpOworCXJldHVybiAtRUlOVkFMOworfQorCisvKiBEZXF1ZXVlIGEgYnVmZmVyICovCitzdGF0aWMgaW50IHZpZGlvY19kcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCit7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBmaF90b19jdHgocHJpdik7CisKKwlpZiAoY3R4LT5zdGF0ZSA9PSBNRkNJTlNUX0VSUk9SKSB7CisJCW1mY19lcnIoIkNhbGwgb24gRFFCVUYgYWZ0ZXIgdW5yZWNvdmVyYWJsZSBlcnJvclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAoYnVmLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSkKKwkJcmV0dXJuIHZiMl9kcWJ1ZigmY3R4LT52cV9zcmMsIGJ1ZiwgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCWVsc2UgaWYgKGJ1Zi0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKQorCQlyZXR1cm4gdmIyX2RxYnVmKCZjdHgtPnZxX2RzdCwgYnVmLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qIFN0cmVhbSBvbiAqLworc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgczVwX21mY19jdHggKmN0eCA9IGZoX3RvX2N0eChwcml2KTsKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IGN0eC0+ZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwltZmNfZGVidWdfZW50ZXIoKTsKKwlpZiAodHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpIHsKKworCQlpZiAoY3R4LT5zdGF0ZSA9PSBNRkNJTlNUX0lOSVQpIHsKKwkJCWN0eC0+ZHN0X2J1ZnNfY250ID0gMDsKKwkJCWN0eC0+c3JjX2J1ZnNfY250ID0gMDsKKwkJCWN0eC0+Y2FwdHVyZV9zdGF0ZSA9IFFVRVVFX0ZSRUU7CisJCQljdHgtPm91dHB1dF9zdGF0ZSA9IFFVRVVFX0ZSRUU7CisJCQlzNXBfbWZjX2FsbG9jX2luc3RhbmNlX2J1ZmZlcihjdHgpOworCQkJczVwX21mY19hbGxvY19kZWNfdGVtcF9idWZmZXJzKGN0eCk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5jb25kbG9jaywgZmxhZ3MpOworCQkJc2V0X2JpdChjdHgtPm51bSwgJmRldi0+Y3R4X3dvcmtfYml0cyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmNvbmRsb2NrLCBmbGFncyk7CisJCQlzNXBfbWZjX2NsZWFuX2N0eF9pbnRfZmxhZ3MoY3R4KTsKKwkJCXM1cF9tZmNfdHJ5X3J1bihkZXYpOworCisJCQlpZiAoczVwX21mY193YWl0X2Zvcl9kb25lX2N0eChjdHgsCisJCQkJUzVQX0ZJTVZfUjJIX0NNRF9PUEVOX0lOU1RBTkNFX1JFVCwgMCkpIHsKKwkJCQkvKiBFcnJvciBvciB0aW1lb3V0ICovCisJCQkJbWZjX2VycigiRXJyb3IgZ2V0dGluZyBpbnN0YW5jZSBmcm9tIGhhcmR3YXJlXG4iKTsKKwkJCQlzNXBfbWZjX3JlbGVhc2VfaW5zdGFuY2VfYnVmZmVyKGN0eCk7CisJCQkJczVwX21mY19yZWxlYXNlX2RlY19kZXNjX2J1ZmZlcihjdHgpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJbWZjX2RlYnVnKDIsICJHb3QgaW5zdGFuY2UgbnVtYmVyOiAlZFxuIiwgY3R4LT5pbnN0X25vKTsKKwkJfQorCQlyZXQgPSB2YjJfc3RyZWFtb24oJmN0eC0+dnFfc3JjLCB0eXBlKTsKKwkJfQorCWVsc2UgaWYgKHR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkKKwkJcmV0ID0gdmIyX3N0cmVhbW9uKCZjdHgtPnZxX2RzdCwgdHlwZSk7CisJbWZjX2RlYnVnX2xlYXZlKCk7CisJcmV0dXJuIHJldDsKK30KKworLyogU3RyZWFtIG9mZiwgd2hpY2ggZXF1YWxzIHRvIGEgcGF1c2UgKi8KK3N0YXRpYyBpbnQgdmlkaW9jX3N0cmVhbW9mZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCSAgICBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgczVwX21mY19jdHggKmN0eCA9IGZoX3RvX2N0eChwcml2KTsKKworCWlmICh0eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSkKKwkJcmV0dXJuIHZiMl9zdHJlYW1vZmYoJmN0eC0+dnFfc3JjLCB0eXBlKTsKKwllbHNlIGlmICh0eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpCisJCXJldHVybiB2YjJfc3RyZWFtb2ZmKCZjdHgtPnZxX2RzdCwgdHlwZSk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qIFNldCBjb250cm9scyAtIHY0bDIgY29udHJvbCBmcmFtZXdvcmsgKi8KK3N0YXRpYyBpbnQgczVwX21mY19kZWNfc19jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCit7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBjdHJsX3RvX2N0eChjdHJsKTsKKworCXN3aXRjaCAoY3RybC0+aWQpIHsKKwljYXNlIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fREVDT0RFUl9IMjY0X0RJU1BMQVlfREVMQVk6CisJCWN0eC0+bG9vcF9maWx0ZXJfbXBlZzQgPSBjdHJsLT52YWw7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19ERUNPREVSX0gyNjRfRElTUExBWV9ERUxBWV9FTkFCTEU6CisJCWN0eC0+ZGlzcGxheV9kZWxheV9lbmFibGUgPSBjdHJsLT52YWw7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19ERUNPREVSX01QRUc0X0RFQkxPQ0tfRklMVEVSOgorCQljdHgtPmRpc3BsYXlfZGVsYXkgPSBjdHJsLT52YWw7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19ERUNPREVSX1NMSUNFX0lOVEVSRkFDRToKKwkJY3R4LT5zbGljZV9pbnRlcmZhY2UgPSBjdHJsLT52YWw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCW1mY19lcnIoIkludmFsaWQgY29udHJvbCAweCUwOHhcbiIsIGN0cmwtPmlkKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHM1cF9tZmNfZGVjX2dfdl9jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCit7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBjdHJsX3RvX2N0eChjdHJsKTsKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IGN0eC0+ZGV2OworCisJc3dpdGNoIChjdHJsLT5pZCkgeworCWNhc2UgVjRMMl9DSURfTUlOX0JVRkZFUlNfRk9SX0NBUFRVUkU6CisJCWlmIChjdHgtPnN0YXRlID49IE1GQ0lOU1RfSEVBRF9QQVJTRUQgJiYKKwkJICAgIGN0eC0+c3RhdGUgPCBNRkNJTlNUX0FCT1JUKSB7CisJCQljdHJsLT52YWwgPSBjdHgtPmRwYl9jb3VudDsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKGN0eC0+c3RhdGUgIT0gTUZDSU5TVF9JTklUKSB7CisJCQl2NGwyX2VycigmZGV2LT52NGwyX2RldiwgIkRlY29kaW5nIG5vdCBpbml0aWFsaXNlZFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkvKiBTaG91bGQgd2FpdCBmb3IgdGhlIGhlYWRlciB0byBiZSBwYXJzZWQgKi8KKwkJczVwX21mY19jbGVhbl9jdHhfaW50X2ZsYWdzKGN0eCk7CisJCXM1cF9tZmNfd2FpdF9mb3JfZG9uZV9jdHgoY3R4LAorCQkJCVM1UF9GSU1WX1IySF9DTURfU0VRX0RPTkVfUkVULCAwKTsKKwkJaWYgKGN0eC0+c3RhdGUgPj0gTUZDSU5TVF9IRUFEX1BBUlNFRCAmJgorCQkgICAgY3R4LT5zdGF0ZSA8IE1GQ0lOU1RfQUJPUlQpIHsKKwkJCWN0cmwtPnZhbCA9IGN0eC0+ZHBiX2NvdW50OworCQl9IGVsc2UgeworCQkJdjRsMl9lcnIoJmRldi0+djRsMl9kZXYsICJEZWNvZGluZyBub3QgaW5pdGlhbGlzZWRcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX29wcyBzNXBfbWZjX2RlY19jdHJsX29wcyA9IHsKKwkuc19jdHJsID0gczVwX21mY19kZWNfc19jdHJsLAorCS5nX3ZvbGF0aWxlX2N0cmwgPSBzNXBfbWZjX2RlY19nX3ZfY3RybCwKK307CisKKy8qIEdldCBjcm9wcGluZyBpbmZvcm1hdGlvbiAqLworc3RhdGljIGludCB2aWRpb2NfZ19jcm9wKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQlzdHJ1Y3QgdjRsMl9jcm9wICpjcikKK3sKKwlzdHJ1Y3QgczVwX21mY19jdHggKmN0eCA9IGZoX3RvX2N0eChwcml2KTsKKwl1MzIgbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tOworCisJaWYgKGN0eC0+c3RhdGUgIT0gTUZDSU5TVF9IRUFEX1BBUlNFRCAmJgorCWN0eC0+c3RhdGUgIT0gTUZDSU5TVF9SVU5OSU5HICYmIGN0eC0+c3RhdGUgIT0gTUZDSU5TVF9GSU5JU0hJTkcKKwkJCQkJJiYgY3R4LT5zdGF0ZSAhPSBNRkNJTlNUX0ZJTklTSEVEKSB7CisJCQltZmNfZXJyKCJDYW5ub250IHNldCBjcm9wXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJaWYgKGN0eC0+c3JjX2ZtdC0+Zm91cmNjID09IFY0TDJfUElYX0ZNVF9IMjY0KSB7CisJCWxlZnQgPSBzNXBfbWZjX3JlYWRfc2htKGN0eCwgQ1JPUF9JTkZPX0gpOworCQlyaWdodCA9IGxlZnQgPj4gUzVQX0ZJTVZfU0hBUkVEX0NST1BfUklHSFRfU0hJRlQ7CisJCWxlZnQgPSBsZWZ0ICYgUzVQX0ZJTVZfU0hBUkVEX0NST1BfTEVGVF9NQVNLOworCQl0b3AgPSBzNXBfbWZjX3JlYWRfc2htKGN0eCwgQ1JPUF9JTkZPX1YpOworCQlib3R0b20gPSB0b3AgPj4gUzVQX0ZJTVZfU0hBUkVEX0NST1BfQk9UVE9NX1NISUZUOworCQl0b3AgPSB0b3AgJiBTNVBfRklNVl9TSEFSRURfQ1JPUF9UT1BfTUFTSzsKKwkJY3ItPmMubGVmdCA9IGxlZnQ7CisJCWNyLT5jLnRvcCA9IHRvcDsKKwkJY3ItPmMud2lkdGggPSBjdHgtPmltZ193aWR0aCAtIGxlZnQgLSByaWdodDsKKwkJY3ItPmMuaGVpZ2h0ID0gY3R4LT5pbWdfaGVpZ2h0IC0gdG9wIC0gYm90dG9tOworCQltZmNfZGVidWcoMiwgIkNyb3BwaW5nIGluZm8gW2gyNjRdOiBsPSVkIHQ9JWQgIgorCQkJInc9JWQgaD0lZCAocj0lZCBiPSVkIGZ3PSVkIGZoPSVkXG4iLCBsZWZ0LCB0b3AsCisJCQljci0+Yy53aWR0aCwgY3ItPmMuaGVpZ2h0LCByaWdodCwgYm90dG9tLAorCQkJY3R4LT5idWZfd2lkdGgsIGN0eC0+YnVmX2hlaWdodCk7CisJfSBlbHNlIHsKKwkJY3ItPmMubGVmdCA9IDA7CisJCWNyLT5jLnRvcCA9IDA7CisJCWNyLT5jLndpZHRoID0gY3R4LT5pbWdfd2lkdGg7CisJCWNyLT5jLmhlaWdodCA9IGN0eC0+aW1nX2hlaWdodDsKKwkJbWZjX2RlYnVnKDIsICJDcm9wcGluZyBpbmZvOiB3PSVkIGg9JWQgZnc9JWQgIgorCQkJImZoPSVkXG4iLCBjci0+Yy53aWR0aCwJY3ItPmMuaGVpZ2h0LCBjdHgtPmJ1Zl93aWR0aCwKKwkJCQkJCQljdHgtPmJ1Zl9oZWlnaHQpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogdjRsMl9pb2N0bF9vcHMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgczVwX21mY19kZWNfaW9jdGxfb3BzID0geworCS52aWRpb2NfcXVlcnljYXAgPSB2aWRpb2NfcXVlcnljYXAsCisJLnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwID0gdmlkaW9jX2VudW1fZm10X3ZpZF9jYXAsCisJLnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwX21wbGFuZSA9IHZpZGlvY19lbnVtX2ZtdF92aWRfY2FwX21wbGFuZSwKKwkudmlkaW9jX2VudW1fZm10X3ZpZF9vdXQgPSB2aWRpb2NfZW51bV9mbXRfdmlkX291dCwKKwkudmlkaW9jX2VudW1fZm10X3ZpZF9vdXRfbXBsYW5lID0gdmlkaW9jX2VudW1fZm10X3ZpZF9vdXRfbXBsYW5lLAorCS52aWRpb2NfZ19mbXRfdmlkX2NhcF9tcGxhbmUgPSB2aWRpb2NfZ19mbXQsCisJLnZpZGlvY19nX2ZtdF92aWRfb3V0X21wbGFuZSA9IHZpZGlvY19nX2ZtdCwKKwkudmlkaW9jX3RyeV9mbXRfdmlkX2NhcF9tcGxhbmUgPSB2aWRpb2NfdHJ5X2ZtdCwKKwkudmlkaW9jX3RyeV9mbXRfdmlkX291dF9tcGxhbmUgPSB2aWRpb2NfdHJ5X2ZtdCwKKwkudmlkaW9jX3NfZm10X3ZpZF9jYXBfbXBsYW5lID0gdmlkaW9jX3NfZm10LAorCS52aWRpb2Nfc19mbXRfdmlkX291dF9tcGxhbmUgPSB2aWRpb2Nfc19mbXQsCisJLnZpZGlvY19yZXFidWZzID0gdmlkaW9jX3JlcWJ1ZnMsCisJLnZpZGlvY19xdWVyeWJ1ZiA9IHZpZGlvY19xdWVyeWJ1ZiwKKwkudmlkaW9jX3FidWYgPSB2aWRpb2NfcWJ1ZiwKKwkudmlkaW9jX2RxYnVmID0gdmlkaW9jX2RxYnVmLAorCS52aWRpb2Nfc3RyZWFtb24gPSB2aWRpb2Nfc3RyZWFtb24sCisJLnZpZGlvY19zdHJlYW1vZmYgPSB2aWRpb2Nfc3RyZWFtb2ZmLAorCS52aWRpb2NfZ19jcm9wID0gdmlkaW9jX2dfY3JvcCwKK307CisKK3N0YXRpYyBpbnQgczVwX21mY19xdWV1ZV9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICp2cSwgdW5zaWduZWQgaW50ICpidWZfY291bnQsCisJCQkgICAgICAgdW5zaWduZWQgaW50ICpwbGFuZV9jb3VudCwgdW5zaWduZWQgbG9uZyBwc2l6ZVtdLAorCQkJICAgICAgIHZvaWQgKmFsbG9jYXRvcnNbXSkKK3sKKwlzdHJ1Y3QgczVwX21mY19jdHggKmN0eCA9IGZoX3RvX2N0eCh2cS0+ZHJ2X3ByaXYpOworCisJLyogVmlkZW8gb3V0cHV0IGZvciBkZWNvZGluZyAoc291cmNlKQorCSAqIHRoaXMgY2FuIGJlIHNldCBhZnRlciBnZXR0aW5nIGFuIGluc3RhbmNlICovCisJaWYgKGN0eC0+c3RhdGUgPT0gTUZDSU5TVF9JTklUICYmCisJICAgIHZxLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSkgeworCQkvKiBBIHNpbmdsZSBwbGFuZSBpcyByZXF1aXJlZCBmb3IgaW5wdXQgKi8KKwkJKnBsYW5lX2NvdW50ID0gMTsKKwkJaWYgKCpidWZfY291bnQgPCAxKQorCQkJKmJ1Zl9jb3VudCA9IDE7CisJCWlmICgqYnVmX2NvdW50ID4gTUZDX01BWF9CVUZGRVJTKQorCQkJKmJ1Zl9jb3VudCA9IE1GQ19NQVhfQlVGRkVSUzsKKwkvKiBWaWRlbyBjYXB0dXJlIGZvciBkZWNvZGluZyAoZGVzdGluYXRpb24pCisJICogdGhpcyBjYW4gYmUgc2V0IGFmdGVyIHRoZSBoZWFkZXIgd2FzIHBhcnNlZCAqLworCX0gZWxzZSBpZiAoY3R4LT5zdGF0ZSA9PSBNRkNJTlNUX0hFQURfUEFSU0VEICYmCisJCSAgIHZxLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpIHsKKwkJLyogT3V0cHV0IHBsYW5lIGNvdW50IGlzIDIgLSBvbmUgZm9yIFkgYW5kIG9uZSBmb3IgQ2JDciAqLworCQkqcGxhbmVfY291bnQgPSAyOworCQkvKiBTZXR1cCBidWZmZXIgY291bnQgKi8KKwkJaWYgKCpidWZfY291bnQgPCBjdHgtPmRwYl9jb3VudCkKKwkJCSpidWZfY291bnQgPSBjdHgtPmRwYl9jb3VudDsKKwkJaWYgKCpidWZfY291bnQgPiBjdHgtPmRwYl9jb3VudCArIE1GQ19NQVhfRVhUUkFfRFBCKQorCQkJKmJ1Zl9jb3VudCA9IGN0eC0+ZHBiX2NvdW50ICsgTUZDX01BWF9FWFRSQV9EUEI7CisJCWlmICgqYnVmX2NvdW50ID4gTUZDX01BWF9CVUZGRVJTKQorCQkJKmJ1Zl9jb3VudCA9IE1GQ19NQVhfQlVGRkVSUzsKKwl9IGVsc2UgeworCQltZmNfZXJyKCJTdGF0ZSBzZWVtcyBpbnZhbGlkLiBTdGF0ZSA9ICVkLCB2cS0+dHlwZSA9ICVkXG4iLAorCQkJCQkJCWN0eC0+c3RhdGUsIHZxLT50eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1mY19kZWJ1ZygyLCAiQnVmZmVyIGNvdW50PSVkLCBwbGFuZSBjb3VudD0lZFxuIiwKKwkJCQkJCSpidWZfY291bnQsICpwbGFuZV9jb3VudCk7CisJaWYgKGN0eC0+c3RhdGUgPT0gTUZDSU5TVF9IRUFEX1BBUlNFRCAmJgorCSAgICB2cS0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKSB7CisJCXBzaXplWzBdID0gY3R4LT5sdW1hX3NpemU7CisJCXBzaXplWzFdID0gY3R4LT5jaHJvbWFfc2l6ZTsKKwkJYWxsb2NhdG9yc1swXSA9IGN0eC0+ZGV2LT5hbGxvY19jdHhbTUZDX0JBTksyX0FMTE9DX0NUWF07CisJCWFsbG9jYXRvcnNbMV0gPSBjdHgtPmRldi0+YWxsb2NfY3R4W01GQ19CQU5LMV9BTExPQ19DVFhdOworCX0gZWxzZSBpZiAodnEtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FICYmCisJCSAgIGN0eC0+c3RhdGUgPT0gTUZDSU5TVF9JTklUKSB7CisJCXBzaXplWzBdID0gY3R4LT5kZWNfc3JjX2J1Zl9zaXplOworCQlhbGxvY2F0b3JzWzBdID0gY3R4LT5kZXYtPmFsbG9jX2N0eFtNRkNfQkFOSzFfQUxMT0NfQ1RYXTsKKwl9IGVsc2UgeworCQltZmNfZXJyKCJUaGlzIHZpZGVvIG5vZGUgaXMgZGVkaWNhdGVkIHRvIGRlY29kaW5nLiBEZWNvZGluZyBub3QgaW5pdGFsaXNlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgczVwX21mY191bmxvY2soc3RydWN0IHZiMl9xdWV1ZSAqcSkKK3sKKwlzdHJ1Y3QgczVwX21mY19jdHggKmN0eCA9IGZoX3RvX2N0eChxLT5kcnZfcHJpdik7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKworCW11dGV4X3VubG9jaygmZGV2LT5tZmNfbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBzNXBfbWZjX2xvY2soc3RydWN0IHZiMl9xdWV1ZSAqcSkKK3sKKwlzdHJ1Y3QgczVwX21mY19jdHggKmN0eCA9IGZoX3RvX2N0eChxLT5kcnZfcHJpdik7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKworCW11dGV4X2xvY2soJmRldi0+bWZjX211dGV4KTsKK30KKworc3RhdGljIGludCBzNXBfbWZjX2J1Zl9pbml0KHN0cnVjdCB2YjJfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3QgdmIyX3F1ZXVlICp2cSA9IHZiLT52YjJfcXVldWU7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBmaF90b19jdHgodnEtPmRydl9wcml2KTsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmICh2cS0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKSB7CisJCWlmIChjdHgtPmNhcHR1cmVfc3RhdGUgPT0gUVVFVUVfQlVGU19NTUFQRUQpCisJCQlyZXR1cm4gMDsKKwkJZm9yIChpID0gMDsgaSA8PSBjdHgtPnNyY19mbXQtPm51bV9wbGFuZXMgOyBpKyspIHsKKwkJCWlmIChJU19FUlJfT1JfTlVMTChFUlJfUFRSKAorCQkJCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcih2YiwgaSkpKSkgeworCQkJCW1mY19lcnIoIlBsYW5lIG1lbSBub3QgYWxsb2NhdGVkXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCQlpZiAodmIyX3BsYW5lX3NpemUodmIsIDApIDwgY3R4LT5sdW1hX3NpemUgfHwKKwkJCXZiMl9wbGFuZV9zaXplKHZiLCAxKSA8IGN0eC0+Y2hyb21hX3NpemUpIHsKKwkJCW1mY19lcnIoIlBsYW5lIGJ1ZmZlciAoQ0FQVFVSRSkgaXMgdG9vIHNtYWxsXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWkgPSB2Yi0+djRsMl9idWYuaW5kZXg7CisJCWN0eC0+ZHN0X2J1ZnNbaV0uYiA9IHZiOworCQljdHgtPmRzdF9idWZzW2ldLmNvb2tpZS5yYXcubHVtYSA9CisJCQkJCXZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKHZiLCAwKTsKKwkJY3R4LT5kc3RfYnVmc1tpXS5jb29raWUucmF3LmNocm9tYSA9CisJCQkJCXZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKHZiLCAxKTsKKwkJY3R4LT5kc3RfYnVmc19jbnQrKzsKKwl9IGVsc2UgaWYgKHZxLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSkgeworCQlpZiAoSVNfRVJSX09SX05VTEwoRVJSX1BUUigKKwkJCQkJdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIodmIsIDApKSkpIHsKKwkJCW1mY19lcnIoIlBsYW5lIG1lbW9yeSBub3QgYWxsb2NhdGVkXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmICh2YjJfcGxhbmVfc2l6ZSh2YiwgMCkgPCBjdHgtPmRlY19zcmNfYnVmX3NpemUpIHsKKwkJCW1mY19lcnIoIlBsYW5lIGJ1ZmZlciAoT1VUUFVUKSBpcyB0b28gc21hbGxcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlpID0gdmItPnY0bDJfYnVmLmluZGV4OworCQljdHgtPnNyY19idWZzW2ldLmIgPSB2YjsKKwkJY3R4LT5zcmNfYnVmc1tpXS5jb29raWUuc3RyZWFtID0KKwkJCQkJdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIodmIsIDApOworCQljdHgtPnNyY19idWZzX2NudCsrOworCX0gZWxzZSB7CisJCW1mY19lcnIoInM1cF9tZmNfYnVmX2luaXQ6IHVua25vd24gcXVldWUgdHlwZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNXBfbWZjX3N0YXJ0X3N0cmVhbWluZyhzdHJ1Y3QgdmIyX3F1ZXVlICpxKQoreworCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHEtPmRydl9wcml2KTsKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IGN0eC0+ZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl2NGwyX2N0cmxfaGFuZGxlcl9zZXR1cCgmY3R4LT5jdHJsX2hhbmRsZXIpOworCWlmIChjdHgtPnN0YXRlID09IE1GQ0lOU1RfRklOSVNISU5HIHx8CisJCWN0eC0+c3RhdGUgPT0gTUZDSU5TVF9GSU5JU0hFRCkKKwkJY3R4LT5zdGF0ZSA9IE1GQ0lOU1RfUlVOTklORzsKKwkvKiBJZiBjb250ZXh0IGlzIHJlYWR5IHRoZW4gZGV2ID0gd29yay0+ZGF0YTtzY2hlZHVsZSBpdCB0byBydW4gKi8KKwlpZiAoczVwX21mY19jdHhfcmVhZHkoY3R4KSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5jb25kbG9jaywgZmxhZ3MpOworCQlzZXRfYml0KGN0eC0+bnVtLCAmZGV2LT5jdHhfd29ya19iaXRzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5jb25kbG9jaywgZmxhZ3MpOworCX0KKwlzNXBfbWZjX3RyeV9ydW4oZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNXBfbWZjX3N0b3Bfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgczVwX21mY19jdHggKmN0eCA9IGZoX3RvX2N0eChxLT5kcnZfcHJpdik7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKwlpbnQgYWJvcnRlZCA9IDA7CisKKwlpZiAoKGN0eC0+c3RhdGUgPT0gTUZDSU5TVF9GSU5JU0hJTkcgfHwKKwkJY3R4LT5zdGF0ZSA9PSAgTUZDSU5TVF9SVU5OSU5HKSAmJgorCQlkZXYtPmN1cnJfY3R4ID09IGN0eC0+bnVtICYmIGRldi0+aHdfbG9jaykgeworCQljdHgtPnN0YXRlID0gTUZDSU5TVF9BQk9SVDsKKwkJczVwX21mY193YWl0X2Zvcl9kb25lX2N0eChjdHgsCisJCQkJCVM1UF9GSU1WX1IySF9DTURfRlJBTUVfRE9ORV9SRVQsIDApOworCQlhYm9ydGVkID0gMTsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOworCWlmIChxLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpIHsKKwkJczVwX21mY19jbGVhbnVwX3F1ZXVlKCZjdHgtPmRzdF9xdWV1ZSwgJmN0eC0+dnFfZHN0KTsKKwkJSU5JVF9MSVNUX0hFQUQoJmN0eC0+ZHN0X3F1ZXVlKTsKKwkJY3R4LT5kc3RfcXVldWVfY250ID0gMDsKKwkJY3R4LT5kcGJfZmx1c2hfZmxhZyA9IDE7CisJCWN0eC0+ZGVjX2RzdF9mbGFnID0gMDsKKwl9CisJaWYgKHEtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKSB7CisJCXM1cF9tZmNfY2xlYW51cF9xdWV1ZSgmY3R4LT5zcmNfcXVldWUsICZjdHgtPnZxX3NyYyk7CisJCUlOSVRfTElTVF9IRUFEKCZjdHgtPnNyY19xdWV1ZSk7CisJCWN0eC0+c3JjX3F1ZXVlX2NudCA9IDA7CisJfQorCWlmIChhYm9ydGVkKQorCQljdHgtPnN0YXRlID0gTUZDSU5TVF9SVU5OSU5HOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHM1cF9tZmNfYnVmX3F1ZXVlKHN0cnVjdCB2YjJfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3QgdmIyX3F1ZXVlICp2cSA9IHZiLT52YjJfcXVldWU7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBmaF90b19jdHgodnEtPmRydl9wcml2KTsKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IGN0eC0+ZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHM1cF9tZmNfYnVmICptZmNfYnVmOworCisJaWYgKHZxLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSkgeworCQltZmNfYnVmID0gJmN0eC0+c3JjX2J1ZnNbdmItPnY0bDJfYnVmLmluZGV4XTsKKwkJbWZjX2J1Zi0+dXNlZCA9IDA7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwkJbGlzdF9hZGRfdGFpbCgmbWZjX2J1Zi0+bGlzdCwgJmN0eC0+c3JjX3F1ZXVlKTsKKwkJY3R4LT5zcmNfcXVldWVfY250Kys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOworCX0gZWxzZSBpZiAodnEtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkgeworCQltZmNfYnVmID0gJmN0eC0+ZHN0X2J1ZnNbdmItPnY0bDJfYnVmLmluZGV4XTsKKwkJbWZjX2J1Zi0+dXNlZCA9IDA7CisJCS8qIE1hcmsgZGVzdGluYXRpb24gYXMgYXZhaWxhYmxlIGZvciB1c2UgYnkgTUZDICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwkJc2V0X2JpdCh2Yi0+djRsMl9idWYuaW5kZXgsICZjdHgtPmRlY19kc3RfZmxhZyk7CisJCWxpc3RfYWRkX3RhaWwoJm1mY19idWYtPmxpc3QsICZjdHgtPmRzdF9xdWV1ZSk7CisJCWN0eC0+ZHN0X3F1ZXVlX2NudCsrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwl9IGVsc2UgeworCQltZmNfZXJyKCJVbnN1cHBvcnRlZCBidWZmZXIgdHlwZSAoJWQpXG4iLCB2cS0+dHlwZSk7CisJfQorCWlmIChzNXBfbWZjX2N0eF9yZWFkeShjdHgpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmNvbmRsb2NrLCBmbGFncyk7CisJCXNldF9iaXQoY3R4LT5udW0sICZkZXYtPmN0eF93b3JrX2JpdHMpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmNvbmRsb2NrLCBmbGFncyk7CisJfQorCXM1cF9tZmNfdHJ5X3J1bihkZXYpOworfQorCitzdGF0aWMgc3RydWN0IHZiMl9vcHMgczVwX21mY19kZWNfcW9wcyA9IHsKKwkucXVldWVfc2V0dXAJCT0gczVwX21mY19xdWV1ZV9zZXR1cCwKKwkud2FpdF9wcmVwYXJlCQk9IHM1cF9tZmNfdW5sb2NrLAorCS53YWl0X2ZpbmlzaAkJPSBzNXBfbWZjX2xvY2ssCisJLmJ1Zl9pbml0CQk9IHM1cF9tZmNfYnVmX2luaXQsCisJLnN0YXJ0X3N0cmVhbWluZwk9IHM1cF9tZmNfc3RhcnRfc3RyZWFtaW5nLAorCS5zdG9wX3N0cmVhbWluZwkJPSBzNXBfbWZjX3N0b3Bfc3RyZWFtaW5nLAorCS5idWZfcXVldWUJCT0gczVwX21mY19idWZfcXVldWUsCit9OworCitzdHJ1Y3QgczVwX21mY19jb2RlY19vcHMgKmdldF9kZWNfY29kZWNfb3BzKHZvaWQpCit7CisJcmV0dXJuICZkZWNvZGVyX2NvZGVjX29wczsKK30KKworc3RydWN0IHZiMl9vcHMgKmdldF9kZWNfcXVldWVfb3BzKHZvaWQpCit7CisJcmV0dXJuICZzNXBfbWZjX2RlY19xb3BzOworfQorCitjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgKmdldF9kZWNfdjRsMl9pb2N0bF9vcHModm9pZCkKK3sKKwlyZXR1cm4gJnM1cF9tZmNfZGVjX2lvY3RsX29wczsKK30KKworI2RlZmluZSBJU19NRkM1MV9QUklWKHgpICgoVjRMMl9DVFJMX0lEMkNMQVNTKHgpID09IFY0TDJfQ1RSTF9DTEFTU19NUEVHKSBcCisJCQkJCQkmJiBWNEwyX0NUUkxfRFJJVkVSX1BSSVYoeCkpCisKK2ludCBzNXBfbWZjX2RlY19jdHJsc19zZXR1cChzdHJ1Y3QgczVwX21mY19jdHggKmN0eCkKK3sKKwlzdHJ1Y3QgdjRsMl9jdHJsX2NvbmZpZyBjZmc7CisJaW50IGk7CisKKwl2NGwyX2N0cmxfaGFuZGxlcl9pbml0KCZjdHgtPmN0cmxfaGFuZGxlciwgTlVNX0NUUkxTKTsKKwlpZiAoY3R4LT5jdHJsX2hhbmRsZXIuZXJyb3IpIHsKKwkJbWZjX2VycigidjRsMl9jdHJsX2hhbmRsZXJfaW5pdCBmYWlsZWRcbiIpOworCQlyZXR1cm4gY3R4LT5jdHJsX2hhbmRsZXIuZXJyb3I7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE5VTV9DVFJMUzsgaSsrKSB7CisJCWlmIChJU19NRkM1MV9QUklWKGNvbnRyb2xzW2ldLmlkKSkgeworCQkJY2ZnLm9wcyA9ICZzNXBfbWZjX2RlY19jdHJsX29wczsKKwkJCWNmZy5pZCA9IGNvbnRyb2xzW2ldLmlkOworCQkJY2ZnLm1pbiA9IGNvbnRyb2xzW2ldLm1pbmltdW07CisJCQljZmcubWF4ID0gY29udHJvbHNbaV0ubWF4aW11bTsKKwkJCWNmZy5kZWYgPSBjb250cm9sc1tpXS5kZWZhdWx0X3ZhbHVlOworCQkJY2ZnLm5hbWUgPSBjb250cm9sc1tpXS5uYW1lOworCQkJY2ZnLnR5cGUgPSBjb250cm9sc1tpXS50eXBlOworCisJCQljZmcuc3RlcCA9IGNvbnRyb2xzW2ldLnN0ZXA7CisJCQljZmcubWVudV9za2lwX21hc2sgPSAwOworCisJCQljdHgtPmN0cmxzW2ldID0gdjRsMl9jdHJsX25ld19jdXN0b20oJmN0eC0+Y3RybF9oYW5kbGVyLAorCQkJCQkmY2ZnLCBOVUxMKTsKKwkJfSBlbHNlIHsKKwkJCWN0eC0+Y3RybHNbaV0gPSB2NGwyX2N0cmxfbmV3X3N0ZCgmY3R4LT5jdHJsX2hhbmRsZXIsCisJCQkJCSZzNXBfbWZjX2RlY19jdHJsX29wcywKKwkJCQkJY29udHJvbHNbaV0uaWQsIGNvbnRyb2xzW2ldLm1pbmltdW0sCisJCQkJCWNvbnRyb2xzW2ldLm1heGltdW0sIGNvbnRyb2xzW2ldLnN0ZXAsCisJCQkJCWNvbnRyb2xzW2ldLmRlZmF1bHRfdmFsdWUpOworCQl9CisJCWlmIChjdHgtPmN0cmxfaGFuZGxlci5lcnJvcikgeworCQkJbWZjX2VycigiQWRkaW5nIGNvbnRyb2wgKCVkKSBmYWlsZWRcbiIsIGkpOworCQkJcmV0dXJuIGN0eC0+Y3RybF9oYW5kbGVyLmVycm9yOworCQl9CisJCWlmIChjb250cm9sc1tpXS5pc192b2xhdGlsZSAmJiBjdHgtPmN0cmxzW2ldKQorCQkJY3R4LT5jdHJsc1tpXS0+aXNfdm9sYXRpbGUgPSAxOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBzNXBfbWZjX2RlY19jdHJsc19kZWxldGUoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJaW50IGk7CisKKwl2NGwyX2N0cmxfaGFuZGxlcl9mcmVlKCZjdHgtPmN0cmxfaGFuZGxlcik7CisJZm9yIChpID0gMDsgaSA8IE5VTV9DVFJMUzsgaSsrKQorCQljdHgtPmN0cmxzW2ldID0gTlVMTDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfZGVjLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19kZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjhiMjE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfZGVjLmgKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2RlYy5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgUzVQX01GQ19ERUNfSF8KKyNkZWZpbmUgUzVQX01GQ19ERUNfSF8KKworc3RydWN0IHM1cF9tZmNfY29kZWNfb3BzICpnZXRfZGVjX2NvZGVjX29wcyh2b2lkKTsKK3N0cnVjdCB2YjJfb3BzICpnZXRfZGVjX3F1ZXVlX29wcyh2b2lkKTsKK2NvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyAqZ2V0X2RlY192NGwyX2lvY3RsX29wcyh2b2lkKTsKK3N0cnVjdCBzNXBfbWZjX2ZtdCAqZ2V0X2RlY19kZWZfZm10KGJvb2wgc3JjKTsKK2ludCBzNXBfbWZjX2RlY19jdHJsc19zZXR1cChzdHJ1Y3QgczVwX21mY19jdHggKmN0eCk7Cit2b2lkIHM1cF9tZmNfZGVjX2N0cmxzX2RlbGV0ZShzdHJ1Y3QgczVwX21mY19jdHggKmN0eCk7CisKKyNlbmRpZiAvKiBTNVBfTUZDX0RFQ19IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfZW5jLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19lbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWUwOTRhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfZW5jLmMKQEAgLTAsMCArMSwxODI5IEBACisvKgorICogbGludXgvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfZW5jLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCisgKgorICogSmVvbmd0YWUgUGFyawk8anRwLnBhcmtAc2Ftc3VuZy5jb20+CisgKiBLYW1pbCBEZWJza2kJCTxrLmRlYnNraUBzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItY3RybHMuaD4KKyNpbmNsdWRlIDxtZWRpYS92aWRlb2J1ZjItY29yZS5oPgorI2luY2x1ZGUgInJlZ3MtbWZjLmgiCisjaW5jbHVkZSAiczVwX21mY19jb21tb24uaCIKKyNpbmNsdWRlICJzNXBfbWZjX2RlYnVnLmgiCisjaW5jbHVkZSAiczVwX21mY19lbmMuaCIKKyNpbmNsdWRlICJzNXBfbWZjX2ludHIuaCIKKyNpbmNsdWRlICJzNXBfbWZjX29wci5oIgorCitzdGF0aWMgc3RydWN0IHM1cF9tZmNfZm10IGZvcm1hdHNbXSA9IHsKKwl7CisJCS5uYW1lID0gIjQ6MjowIDIgUGxhbmVzIDY0eDMyIFRpbGVzIiwKKwkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9OVjEyTVQsCisJCS5jb2RlY19tb2RlID0gUzVQX0ZJTVZfQ09ERUNfTk9ORSwKKwkJLnR5cGUgPSBNRkNfRk1UX1JBVywKKwkJLm51bV9wbGFuZXMgPSAyLAorCX0sCisJeworCQkubmFtZSA9ICI0OjI6MCAyIFBsYW5lcyIsCisJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfTlYxMk0sCisJCS5jb2RlY19tb2RlID0gUzVQX0ZJTVZfQ09ERUNfTk9ORSwKKwkJLnR5cGUgPSBNRkNfRk1UX1JBVywKKwkJLm51bV9wbGFuZXMgPSAyLAorCX0sCisJeworCQkubmFtZSA9ICJIMjY0IEVuY29kZWQgU3RyZWFtIiwKKwkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9IMjY0LAorCQkuY29kZWNfbW9kZSA9IFM1UF9GSU1WX0NPREVDX0gyNjRfRU5DLAorCQkudHlwZSA9IE1GQ19GTVRfRU5DLAorCQkubnVtX3BsYW5lcyA9IDEsCisJfSwKKwl7CisJCS5uYW1lID0gIk1QRUc0IEVuY29kZWQgU3RyZWFtIiwKKwkJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9NUEVHNCwKKwkJLmNvZGVjX21vZGUgPSBTNVBfRklNVl9DT0RFQ19NUEVHNF9FTkMsCisJCS50eXBlID0gTUZDX0ZNVF9FTkMsCisJCS5udW1fcGxhbmVzID0gMSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiSDI2NCBFbmNvZGVkIFN0cmVhbSIsCisJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfSDI2MywKKwkJLmNvZGVjX21vZGUgPSBTNVBfRklNVl9DT0RFQ19IMjYzX0VOQywKKwkJLnR5cGUgPSBNRkNfRk1UX0VOQywKKwkJLm51bV9wbGFuZXMgPSAxLAorCX0sCit9OworCisjZGVmaW5lIE5VTV9GT1JNQVRTIEFSUkFZX1NJWkUoZm9ybWF0cykKK3N0YXRpYyBzdHJ1Y3QgczVwX21mY19mbXQgKmZpbmRfZm9ybWF0KHN0cnVjdCB2NGwyX2Zvcm1hdCAqZiwgdW5zaWduZWQgaW50IHQpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0ZPUk1BVFM7IGkrKykgeworCQlpZiAoZm9ybWF0c1tpXS5mb3VyY2MgPT0gZi0+Zm10LnBpeF9tcC5waXhlbGZvcm1hdCAmJgorCQkgICAgZm9ybWF0c1tpXS50eXBlID09IHQpCisJCQlyZXR1cm4gJmZvcm1hdHNbaV07CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IG1mY19jb250cm9sIGNvbnRyb2xzW10gPSB7CisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9TSVpFLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSAoMSA8PCAxNikgLSAxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19NVUxUSV9TTElDRV9NT0RFLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX01FTlUsCisJCS5taW5pbXVtID0gVjRMMl9NUEVHX1ZJREVPX01VTFRJX1NMSUNFX01PREVfU0lOR0xFLAorCQkubWF4aW11bSA9IFY0TDJfTVBFR19WSURFT19NVUxUSV9TSUNFX01PREVfTUFYX0JZVEVTLAorCQkuZGVmYXVsdF92YWx1ZSA9IFY0TDJfTVBFR19WSURFT19NVUxUSV9TTElDRV9NT0RFX1NJTkdMRSwKKwkJLm1lbnVfc2tpcF9tYXNrID0gMCwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19NVUxUSV9TTElDRV9NQVhfTUIsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm1pbmltdW0gPSAxLAorCQkubWF4aW11bSA9ICgxIDw8IDE2KSAtIDEsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAxLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VTFRJX1NMSUNFX01BWF9CWVRFUywKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubWluaW11bSA9IDE5MDAsCisJCS5tYXhpbXVtID0gKDEgPDwgMzApIC0gMSwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDE5MDAsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fQ1lDTElDX0lOVFJBX1JFRlJFU0hfTUIsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9ICgxIDw8IDE2KSAtIDEsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAwLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX1BBRERJTkcsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJLm5hbWUgPSAiUGFkZGluZyBDb250cm9sIEVuYWJsZSIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSAxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19QQURESU5HX1lVViwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSA9ICJQYWRkaW5nIENvbG9yIFlVViBWYWx1ZSIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSAoMSA8PCAyNSkgLSAxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19GUkFNRV9SQ19FTkFCTEUsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDEsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAwLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JJVFJBVEUsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm1pbmltdW0gPSAxLAorCQkubWF4aW11bSA9ICgxIDw8IDMwKSAtIDEsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAxLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX1JDX1JFQUNUSU9OX0NPRUZGLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lID0gIlJhdGUgQ29udHJvbCBSZWFjdGlvbiBDb2VmZi4iLAorCQkubWluaW11bSA9IDEsCisJCS5tYXhpbXVtID0gKDEgPDwgMTYpIC0gMSwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDEsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fRk9SQ0VfRlJBTUVfVFlQRSwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9NRU5VLAorCQkubmFtZSA9ICJGb3JjZSBmcmFtZSB0eXBlIiwKKwkJLm1pbmltdW0gPSBWNEwyX01QRUdfTUZDNTFfVklERU9fRk9SQ0VfRlJBTUVfVFlQRV9ESVNBQkxFRCwKKwkJLm1heGltdW0gPSBWNEwyX01QRUdfTUZDNTFfVklERU9fRk9SQ0VfRlJBTUVfVFlQRV9OT1RfQ09ERUQsCisJCS5kZWZhdWx0X3ZhbHVlID0gVjRMMl9NUEVHX01GQzUxX1ZJREVPX0ZPUkNFX0ZSQU1FX1RZUEVfRElTQUJMRUQsCisJCS5tZW51X3NraXBfbWFzayA9IDAsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fVkJWX1NJWkUsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9ICgxIDw8IDE2KSAtIDEsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAwLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfQ1BCX1NJWkUsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9ICgxIDw8IDE2KSAtIDEsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAwLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX0hFQURFUl9NT0RFLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX01FTlUsCisJCS5taW5pbXVtID0gVjRMMl9NUEVHX1ZJREVPX0hFQURFUl9NT0RFX1NFUEFSQVRFLAorCQkubWF4aW11bSA9IFY0TDJfTVBFR19WSURFT19IRUFERVJfTU9ERV9KT0lORURfV0lUSF8xU1RfRlJBTUUsCisJCS5kZWZhdWx0X3ZhbHVlID0gVjRMMl9NUEVHX1ZJREVPX0hFQURFUl9NT0RFX1NFUEFSQVRFLAorCQkubWVudV9za2lwX21hc2sgPSAwLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0ZSQU1FX1NLSVBfTU9ERSwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9NRU5VLAorCQkubmFtZSA9ICJGcmFtZSBTa2lwIEVuYWJsZSIsCisJCS5taW5pbXVtID0gVjRMMl9NUEVHX01GQzUxX1ZJREVPX0ZSQU1FX1NLSVBfTU9ERV9ESVNBQkxFRCwKKwkJLm1heGltdW0gPSBWNEwyX01QRUdfTUZDNTFfVklERU9fRlJBTUVfU0tJUF9NT0RFX0JVRl9MSU1JVCwKKwkJLm1lbnVfc2tpcF9tYXNrID0gMCwKKwkJLmRlZmF1bHRfdmFsdWUgPSBWNEwyX01QRUdfTUZDNTFfVklERU9fRlJBTUVfU0tJUF9NT0RFX0RJU0FCTEVELAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX1JDX0ZJWEVEX1RBUkdFVF9CSVQsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJLm5hbWUgPSAiRml4ZWQgVGFyZ2V0IEJpdCBFbmFibGUiLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAwLAorCQkubWVudV9za2lwX21hc2sgPSAwLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX0JfRlJBTUVTLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSAyLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1BST0ZJTEUsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfTUVOVSwKKwkJLm1pbmltdW0gPSBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0JBU0VMSU5FLAorCQkubWF4aW11bSA9IFY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfTVVMVElWSUVXX0hJR0gsCisJCS5kZWZhdWx0X3ZhbHVlID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9CQVNFTElORSwKKwkJLm1lbnVfc2tpcF9tYXNrID0gfigKKwkJCQkoMSA8PCBWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0JBU0VMSU5FKSB8CisJCQkJKDEgPDwgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9NQUlOKSB8CisJCQkJKDEgPDwgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIKQorCQkJCSksCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MRVZFTCwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9NRU5VLAorCQkubWluaW11bSA9IFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMCwKKwkJLm1heGltdW0gPSBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF80XzAsCisJCS5kZWZhdWx0X3ZhbHVlID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMV8wLAorCQkubWVudV9za2lwX21hc2sgPSB+KAorCQkJCSgxIDw8IFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzRfMSkgfAorCQkJCSgxIDw8IFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzRfMikgfAorCQkJCSgxIDw8IFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzVfMCkgfAorCQkJCSgxIDw8IFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzVfMSkKKwkJCQkpLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X0xFVkVMLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX01FTlUsCisJCS5taW5pbXVtID0gVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzAsCisJCS5tYXhpbXVtID0gVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzUsCisJCS5kZWZhdWx0X3ZhbHVlID0gVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzAsCisJCS5tZW51X3NraXBfbWFzayA9IDAsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9NT0RFLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX01FTlUsCisJCS5taW5pbXVtID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfTE9PUF9GSUxURVJfTU9ERV9FTkFCTEVELAorCQkubWF4aW11bSA9IFY0TDJfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX01PREVfRElTQUJMRURfQVRfU0xJQ0VfQk9VTkRBUlksCisJCS5kZWZhdWx0X3ZhbHVlID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfTE9PUF9GSUxURVJfTU9ERV9FTkFCTEVELAorCQkubWVudV9za2lwX21hc2sgPSAwLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTE9PUF9GSUxURVJfQUxQSEEsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm1pbmltdW0gPSAtNiwKKwkJLm1heGltdW0gPSA2LAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX0JFVEEsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm1pbmltdW0gPSAtNiwKKwkJLm1heGltdW0gPSA2LAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0VOVFJPUFlfTU9ERSwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9NRU5VLAorCQkubWluaW11bSA9IFY0TDJfTVBFR19WSURFT19IMjY0X0VOVFJPUFlfTU9ERV9DQVZMQywKKwkJLm1heGltdW0gPSBWNEwyX01QRUdfVklERU9fSDI2NF9FTlRST1BZX01PREVfQ0FCQUMsCisJCS5kZWZhdWx0X3ZhbHVlID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfRU5UUk9QWV9NT0RFX0NBVkxDLAorCQkubWVudV9za2lwX21hc2sgPSAwLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0gyNjRfTlVNX1JFRl9QSUNfRk9SX1AsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgPSAiVGhlIE51bWJlciBvZiBSZWYuIFBpYyBmb3IgUCIsCisJCS5taW5pbXVtID0gMSwKKwkJLm1heGltdW0gPSAyLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMSwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19IMjY0XzhYOF9UUkFOU0ZPUk0sCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDEsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAwLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX01CX1JDX0VOQUJMRSwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gMSwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9JX0ZSQU1FX1FQLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSA1MSwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDEsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9NSU5fUVAsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDUxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMSwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19IMjY0X01BWF9RUCwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gNTEsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAxLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfUF9GUkFNRV9RUCwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gNTEsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAxLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfQl9GUkFNRV9RUCwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gNTEsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAxLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjNfSV9GUkFNRV9RUCwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSA9ICJIMjYzIEktRnJhbWUgUVAgdmFsdWUiLAorCQkubWluaW11bSA9IDEsCisJCS5tYXhpbXVtID0gMzEsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAxLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjNfTUlOX1FQLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lID0gIkgyNjMgTWluaW11bSBRUCB2YWx1ZSIsCisJCS5taW5pbXVtID0gMSwKKwkJLm1heGltdW0gPSAzMSwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDEsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19NQVhfUVAsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgPSAiSDI2MyBNYXhpbXVtIFFQIHZhbHVlIiwKKwkJLm1pbmltdW0gPSAxLAorCQkubWF4aW11bSA9IDMxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMSwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19IMjYzX1BfRlJBTUVfUVAsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgPSAiSDI2MyBQIGZyYW1lIFFQIHZhbHVlIiwKKwkJLm1pbmltdW0gPSAxLAorCQkubWF4aW11bSA9IDMxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMSwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19IMjYzX0JfRlJBTUVfUVAsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgPSAiSDI2MyBCIGZyYW1lIFFQIHZhbHVlIiwKKwkJLm1pbmltdW0gPSAxLAorCQkubWF4aW11bSA9IDMxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMSwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9JX0ZSQU1FX1FQLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lID0gIk1QRUc0IEktRnJhbWUgUVAgdmFsdWUiLAorCQkubWluaW11bSA9IDEsCisJCS5tYXhpbXVtID0gMzEsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAxLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X01JTl9RUCwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSA9ICJNUEVHNCBNaW5pbXVtIFFQIHZhbHVlIiwKKwkJLm1pbmltdW0gPSAxLAorCQkubWF4aW11bSA9IDMxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMSwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9NQVhfUVAsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm5hbWUgPSAiTVBFRzQgTWF4aW11bSBRUCB2YWx1ZSIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSA1MSwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDEsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfUF9GUkFNRV9RUCwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubmFtZSA9ICJNUEVHNCBQIGZyYW1lIFFQIHZhbHVlIiwKKwkJLm1pbmltdW0gPSAxLAorCQkubWF4aW11bSA9IDMxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMSwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9CX0ZSQU1FX1FQLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5uYW1lID0gIk1QRUc0IEIgZnJhbWUgUVAgdmFsdWUiLAorCQkubWluaW11bSA9IDEsCisJCS5tYXhpbXVtID0gMzEsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAxLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0gyNjRfQURBUFRJVkVfUkNfREFSSywKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCQkubmFtZSA9ICJIMjY0IERhcmsgUmVnIEFkYXB0aXZlIFJDIiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDEsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAwLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0gyNjRfQURBUFRJVkVfUkNfU01PT1RILAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCS5uYW1lID0gIkgyNjQgU21vb3RoIFJlZyBBZGFwdGl2ZSBSQyIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSAxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19IMjY0X0FEQVBUSVZFX1JDX1NUQVRJQywKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCQkubmFtZSA9ICJIMjY0IFN0YXRpYyBSZWcgQWRhcHRpdmUgUkMiLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gMSwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fSDI2NF9BREFQVElWRV9SQ19BQ1RJVklUWSwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCQkubmFtZSA9ICJIMjY0IEFjdGl2aXR5IFJlZyBBZGFwdGl2ZSBSQyIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSAxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfRU5BQkxFLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4sCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSAxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDLAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX01FTlUsCisJCS5taW5pbXVtID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfVU5TUEVDSUZJRUQsCisJCS5tYXhpbXVtID0gVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfRVhURU5ERUQsCisJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwkJLm1lbnVfc2tpcF9tYXNrID0gMCwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1ZVSV9FWFRfU0FSX1dJRFRILAorCQkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVIsCisJCS5taW5pbXVtID0gMCwKKwkJLm1heGltdW0gPSAoMSA8PCAxNikgLSAxLAorCQkuc3RlcCA9IDEsCisJCS5kZWZhdWx0X3ZhbHVlID0gMCwKKwl9LAorCXsKKwkJLmlkID0gVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1ZVSV9FWFRfU0FSX0hFSUdIVCwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gKDEgPDwgMTYpIC0gMSwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fR09QX0NMT1NVUkUsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfQk9PTEVBTiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9IDEsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAxLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfSV9QRVJJT0QsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiwKKwkJLm1pbmltdW0gPSAwLAorCQkubWF4aW11bSA9ICgxIDw8IDE2KSAtIDEsCisJCS5zdGVwID0gMSwKKwkJLmRlZmF1bHRfdmFsdWUgPSAwLAorCX0sCisJeworCQkuaWQgPSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEUsCisJCS50eXBlID0gVjRMMl9DVFJMX1RZUEVfTUVOVSwKKwkJLm1pbmltdW0gPSBWNEwyX01QRUdfVklERU9fTVBFRzRfUFJPRklMRV9TSU1QTEUsCisJCS5tYXhpbXVtID0gVjRMMl9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEVfQURWQU5DRURfU0lNUExFLAorCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJCS5tZW51X3NraXBfbWFzayA9IDAsCisJfSwKKwl7CisJCS5pZCA9IFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfUVBFTCwKKwkJLnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAorCQkubWluaW11bSA9IDAsCisJCS5tYXhpbXVtID0gMSwKKwkJLnN0ZXAgPSAxLAorCQkuZGVmYXVsdF92YWx1ZSA9IDAsCisJfSwKK307CisKKyNkZWZpbmUgTlVNX0NUUkxTIEFSUkFZX1NJWkUoY29udHJvbHMpCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0ICptZmM1MV9nZXRfbWVudSh1MzIgaWQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtZmM1MV92aWRlb19mcmFtZV9za2lwW10gPSB7CisJCSJEaXNhYmxlZCIsCisJCSJMZXZlbCBMaW1pdCIsCisJCSJWQlYvQ1BCIExpbWl0IiwKKwkJTlVMTCwKKwl9OworCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbWZjNTFfdmlkZW9fZm9yY2VfZnJhbWVbXSA9IHsKKwkJIkRpc2FibGVkIiwKKwkJIkkgRnJhbWUiLAorCQkiTm90IENvZGVkIiwKKwkJTlVMTCwKKwl9OworCXN3aXRjaCAoaWQpIHsKKwljYXNlIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fRlJBTUVfU0tJUF9NT0RFOgorCQlyZXR1cm4gbWZjNTFfdmlkZW9fZnJhbWVfc2tpcDsKKwljYXNlIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fRk9SQ0VfRlJBTUVfVFlQRToKKwkJcmV0dXJuIG1mYzUxX3ZpZGVvX2ZvcmNlX2ZyYW1lOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBzNXBfbWZjX2N0eF9yZWFkeShzdHJ1Y3QgczVwX21mY19jdHggKmN0eCkKK3sKKwltZmNfZGVidWcoMiwgInNyYz0lZCwgZHN0PSVkLCBzdGF0ZT0lZFxuIiwKKwkJICBjdHgtPnNyY19xdWV1ZV9jbnQsIGN0eC0+ZHN0X3F1ZXVlX2NudCwgY3R4LT5zdGF0ZSk7CisJLyogY29udGV4dCBpcyByZWFkeSB0byBtYWtlIGhlYWRlciAqLworCWlmIChjdHgtPnN0YXRlID09IE1GQ0lOU1RfR09UX0lOU1QgJiYgY3R4LT5kc3RfcXVldWVfY250ID49IDEpCisJCXJldHVybiAxOworCS8qIGNvbnRleHQgaXMgcmVhZHkgdG8gZW5jb2RlIGEgZnJhbWUgKi8KKwlpZiAoY3R4LT5zdGF0ZSA9PSBNRkNJTlNUX1JVTk5JTkcgJiYKKwkJY3R4LT5zcmNfcXVldWVfY250ID49IDEgJiYgY3R4LT5kc3RfcXVldWVfY250ID49IDEpCisJCXJldHVybiAxOworCS8qIGNvbnRleHQgaXMgcmVhZHkgdG8gZW5jb2RlIHJlbWFpbiBmcmFtZXMgKi8KKwlpZiAoY3R4LT5zdGF0ZSA9PSBNRkNJTlNUX0ZJTklTSElORyAmJgorCQljdHgtPnNyY19xdWV1ZV9jbnQgPj0gMSAmJiBjdHgtPmRzdF9xdWV1ZV9jbnQgPj0gMSkKKwkJcmV0dXJuIDE7CisJbWZjX2RlYnVnKDIsICJjdHggaXMgbm90IHJlYWR5XG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2xlYW51cF9yZWZfcXVldWUoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJc3RydWN0IHM1cF9tZmNfYnVmICptYl9lbnRyeTsKKwl1bnNpZ25lZCBsb25nIG1iX3lfYWRkciwgbWJfY19hZGRyOworCisJLyogbW92ZSBidWZmZXJzIGluIHJlZiBxdWV1ZSB0byBzcmMgcXVldWUgKi8KKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmN0eC0+cmVmX3F1ZXVlKSkgeworCQltYl9lbnRyeSA9IGxpc3RfZW50cnkoKCZjdHgtPnJlZl9xdWV1ZSktPm5leHQsCisJCQkJCQlzdHJ1Y3QgczVwX21mY19idWYsIGxpc3QpOworCQltYl95X2FkZHIgPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcihtYl9lbnRyeS0+YiwgMCk7CisJCW1iX2NfYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKG1iX2VudHJ5LT5iLCAxKTsKKwkJbGlzdF9kZWwoJm1iX2VudHJ5LT5saXN0KTsKKwkJY3R4LT5yZWZfcXVldWVfY250LS07CisJCWxpc3RfYWRkX3RhaWwoJm1iX2VudHJ5LT5saXN0LCAmY3R4LT5zcmNfcXVldWUpOworCQljdHgtPnNyY19xdWV1ZV9jbnQrKzsKKwl9CisJbWZjX2RlYnVnKDIsICJlbmMgc3JjIGNvdW50OiAlZCwgZW5jIHJlZiBjb3VudDogJWRcbiIsCisJCSAgY3R4LT5zcmNfcXVldWVfY250LCBjdHgtPnJlZl9xdWV1ZV9jbnQpOworCUlOSVRfTElTVF9IRUFEKCZjdHgtPnJlZl9xdWV1ZSk7CisJY3R4LT5yZWZfcXVldWVfY250ID0gMDsKK30KKworc3RhdGljIGludCBlbmNfcHJlX3NlcV9zdGFydChzdHJ1Y3QgczVwX21mY19jdHggKmN0eCkKK3sKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IGN0eC0+ZGV2OworCXN0cnVjdCBzNXBfbWZjX2J1ZiAqZHN0X21iOworCXVuc2lnbmVkIGxvbmcgZHN0X2FkZHI7CisJdW5zaWduZWQgaW50IGRzdF9zaXplOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CisJZHN0X21iID0gbGlzdF9lbnRyeShjdHgtPmRzdF9xdWV1ZS5uZXh0LCBzdHJ1Y3QgczVwX21mY19idWYsIGxpc3QpOworCWRzdF9hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIoZHN0X21iLT5iLCAwKTsKKwlkc3Rfc2l6ZSA9IHZiMl9wbGFuZV9zaXplKGRzdF9tYi0+YiwgMCk7CisJczVwX21mY19zZXRfZW5jX3N0cmVhbV9idWZmZXIoY3R4LCBkc3RfYWRkciwgZHN0X3NpemUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuY19wb3N0X3NlcV9zdGFydChzdHJ1Y3QgczVwX21mY19jdHggKmN0eCkKK3sKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IGN0eC0+ZGV2OworCXN0cnVjdCBzNXBfbWZjX2VuY19wYXJhbXMgKnAgPSAmY3R4LT5lbmNfcGFyYW1zOworCXN0cnVjdCBzNXBfbWZjX2J1ZiAqZHN0X21iOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAocC0+c2VxX2hkcl9tb2RlID09IFY0TDJfTVBFR19WSURFT19IRUFERVJfTU9ERV9TRVBBUkFURSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CisJCWRzdF9tYiA9IGxpc3RfZW50cnkoY3R4LT5kc3RfcXVldWUubmV4dCwKKwkJCQlzdHJ1Y3QgczVwX21mY19idWYsIGxpc3QpOworCQlsaXN0X2RlbCgmZHN0X21iLT5saXN0KTsKKwkJY3R4LT5kc3RfcXVldWVfY250LS07CisJCXZiMl9zZXRfcGxhbmVfcGF5bG9hZChkc3RfbWItPmIsIDAsCisJCQkJCQlzNXBfbWZjX2dldF9lbmNfc3RybV9zaXplKCkpOworCQl2YjJfYnVmZmVyX2RvbmUoZHN0X21iLT5iLCBWQjJfQlVGX1NUQVRFX0RPTkUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwl9CisJY3R4LT5zdGF0ZSA9IE1GQ0lOU1RfUlVOTklORzsKKwlpZiAoczVwX21mY19jdHhfcmVhZHkoY3R4KSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5jb25kbG9jaywgZmxhZ3MpOworCQlzZXRfYml0KGN0eC0+bnVtLCAmZGV2LT5jdHhfd29ya19iaXRzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5jb25kbG9jaywgZmxhZ3MpOworCX0KKwlzNXBfbWZjX3RyeV9ydW4oZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbmNfcHJlX2ZyYW1lX3N0YXJ0KHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisJc3RydWN0IHM1cF9tZmNfYnVmICpkc3RfbWI7CisJc3RydWN0IHM1cF9tZmNfYnVmICpzcmNfbWI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHNyY195X2FkZHIsIHNyY19jX2FkZHIsIGRzdF9hZGRyOworCXVuc2lnbmVkIGludCBkc3Rfc2l6ZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwlzcmNfbWIgPSBsaXN0X2VudHJ5KGN0eC0+c3JjX3F1ZXVlLm5leHQsIHN0cnVjdCBzNXBfbWZjX2J1ZiwgbGlzdCk7CisJc3JjX3lfYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKHNyY19tYi0+YiwgMCk7CisJc3JjX2NfYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKHNyY19tYi0+YiwgMSk7CisJczVwX21mY19zZXRfZW5jX2ZyYW1lX2J1ZmZlcihjdHgsIHNyY195X2FkZHIsIHNyY19jX2FkZHIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOworCWRzdF9tYiA9IGxpc3RfZW50cnkoY3R4LT5kc3RfcXVldWUubmV4dCwgc3RydWN0IHM1cF9tZmNfYnVmLCBsaXN0KTsKKwlkc3RfYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKGRzdF9tYi0+YiwgMCk7CisJZHN0X3NpemUgPSB2YjJfcGxhbmVfc2l6ZShkc3RfbWItPmIsIDApOworCXM1cF9tZmNfc2V0X2VuY19zdHJlYW1fYnVmZmVyKGN0eCwgZHN0X2FkZHIsIGRzdF9zaXplKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuY19wb3N0X2ZyYW1lX3N0YXJ0KHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisJc3RydWN0IHM1cF9tZmNfYnVmICptYl9lbnRyeTsKKwl1bnNpZ25lZCBsb25nIGVuY195X2FkZHIsIGVuY19jX2FkZHI7CisJdW5zaWduZWQgbG9uZyBtYl95X2FkZHIsIG1iX2NfYWRkcjsKKwlpbnQgc2xpY2VfdHlwZTsKKwl1bnNpZ25lZCBpbnQgc3RybV9zaXplOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzbGljZV90eXBlID0gczVwX21mY19nZXRfZW5jX3NsaWNlX3R5cGUoKTsKKwlzdHJtX3NpemUgPSBzNXBfbWZjX2dldF9lbmNfc3RybV9zaXplKCk7CisJbWZjX2RlYnVnKDIsICJFbmNvZGVkIHNsaWNlIHR5cGU6ICVkIiwgc2xpY2VfdHlwZSk7CisJbWZjX2RlYnVnKDIsICJFbmNvZGVkIHN0cmVhbSBzaXplOiAlZCIsIHN0cm1fc2l6ZSk7CisJbWZjX2RlYnVnKDIsICJEaXNwbGF5IG9yZGVyOiAlZCIsCisJCSAgbWZjX3JlYWQoZGV2LCBTNVBfRklNVl9FTkNfU0lfUElDX0NOVCkpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwlpZiAoc2xpY2VfdHlwZSA+PSAwKSB7CisJCXM1cF9tZmNfZ2V0X2VuY19mcmFtZV9idWZmZXIoY3R4LCAmZW5jX3lfYWRkciwgJmVuY19jX2FkZHIpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1iX2VudHJ5LCAmY3R4LT5zcmNfcXVldWUsIGxpc3QpIHsKKwkJCW1iX3lfYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKG1iX2VudHJ5LT5iLCAwKTsKKwkJCW1iX2NfYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKG1iX2VudHJ5LT5iLCAxKTsKKwkJCWlmICgoZW5jX3lfYWRkciA9PSBtYl95X2FkZHIpICYmCisJCQkJCQkoZW5jX2NfYWRkciA9PSBtYl9jX2FkZHIpKSB7CisJCQkJbGlzdF9kZWwoJm1iX2VudHJ5LT5saXN0KTsKKwkJCQljdHgtPnNyY19xdWV1ZV9jbnQtLTsKKwkJCQl2YjJfYnVmZmVyX2RvbmUobWJfZW50cnktPmIsCisJCQkJCQkJVkIyX0JVRl9TVEFURV9ET05FKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1iX2VudHJ5LCAmY3R4LT5yZWZfcXVldWUsIGxpc3QpIHsKKwkJCW1iX3lfYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKG1iX2VudHJ5LT5iLCAwKTsKKwkJCW1iX2NfYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKG1iX2VudHJ5LT5iLCAxKTsKKwkJCWlmICgoZW5jX3lfYWRkciA9PSBtYl95X2FkZHIpICYmCisJCQkJCQkoZW5jX2NfYWRkciA9PSBtYl9jX2FkZHIpKSB7CisJCQkJbGlzdF9kZWwoJm1iX2VudHJ5LT5saXN0KTsKKwkJCQljdHgtPnJlZl9xdWV1ZV9jbnQtLTsKKwkJCQl2YjJfYnVmZmVyX2RvbmUobWJfZW50cnktPmIsCisJCQkJCQkJVkIyX0JVRl9TVEFURV9ET05FKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlpZiAoKGN0eC0+c3JjX3F1ZXVlX2NudCA+IDApICYmIChjdHgtPnN0YXRlID09IE1GQ0lOU1RfUlVOTklORykpIHsKKwkJbWJfZW50cnkgPSBsaXN0X2VudHJ5KGN0eC0+c3JjX3F1ZXVlLm5leHQsIHN0cnVjdCBzNXBfbWZjX2J1ZiwKKwkJCQkJCQkJCWxpc3QpOworCQlpZiAobWJfZW50cnktPnVzZWQpIHsKKwkJCWxpc3RfZGVsKCZtYl9lbnRyeS0+bGlzdCk7CisJCQljdHgtPnNyY19xdWV1ZV9jbnQtLTsKKwkJCWxpc3RfYWRkX3RhaWwoJm1iX2VudHJ5LT5saXN0LCAmY3R4LT5yZWZfcXVldWUpOworCQkJY3R4LT5yZWZfcXVldWVfY250Kys7CisJCX0KKwkJbWZjX2RlYnVnKDIsICJlbmMgc3JjIGNvdW50OiAlZCwgZW5jIHJlZiBjb3VudDogJWRcbiIsCisJCQkgIGN0eC0+c3JjX3F1ZXVlX2NudCwgY3R4LT5yZWZfcXVldWVfY250KTsKKwl9CisJaWYgKHN0cm1fc2l6ZSA+IDApIHsKKwkJLyogYXQgbGVhc3Qgb25lIG1vcmUgZGVzdC4gYnVmZmVycyBleGlzdCBhbHdheXMgICovCisJCW1iX2VudHJ5ID0gbGlzdF9lbnRyeShjdHgtPmRzdF9xdWV1ZS5uZXh0LCBzdHJ1Y3QgczVwX21mY19idWYsCisJCQkJCQkJCQlsaXN0KTsKKwkJbGlzdF9kZWwoJm1iX2VudHJ5LT5saXN0KTsKKwkJY3R4LT5kc3RfcXVldWVfY250LS07CisJCXN3aXRjaCAoc2xpY2VfdHlwZSkgeworCQljYXNlIFM1UF9GSU1WX0VOQ19TSV9TTElDRV9UWVBFX0k6CisJCQltYl9lbnRyeS0+Yi0+djRsMl9idWYuZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19LRVlGUkFNRTsKKwkJCWJyZWFrOworCQljYXNlIFM1UF9GSU1WX0VOQ19TSV9TTElDRV9UWVBFX1A6CisJCQltYl9lbnRyeS0+Yi0+djRsMl9idWYuZmxhZ3MgfD0gVjRMMl9CVUZfRkxBR19QRlJBTUU7CisJCQlicmVhazsKKwkJY2FzZSBTNVBfRklNVl9FTkNfU0lfU0xJQ0VfVFlQRV9COgorCQkJbWJfZW50cnktPmItPnY0bDJfYnVmLmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfQkZSQU1FOworCQkJYnJlYWs7CisJCX0KKwkJdmIyX3NldF9wbGFuZV9wYXlsb2FkKG1iX2VudHJ5LT5iLCAwLCBzdHJtX3NpemUpOworCQl2YjJfYnVmZmVyX2RvbmUobWJfZW50cnktPmIsIFZCMl9CVUZfU1RBVEVfRE9ORSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOworCWlmICgoY3R4LT5zcmNfcXVldWVfY250ID09IDApIHx8IChjdHgtPmRzdF9xdWV1ZV9jbnQgPT0gMCkpIHsKKwkJc3Bpbl9sb2NrKCZkZXYtPmNvbmRsb2NrKTsKKwkJY2xlYXJfYml0KGN0eC0+bnVtLCAmZGV2LT5jdHhfd29ya19iaXRzKTsKKwkJc3Bpbl91bmxvY2soJmRldi0+Y29uZGxvY2spOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzNXBfbWZjX2NvZGVjX29wcyBlbmNvZGVyX2NvZGVjX29wcyA9IHsKKwkucHJlX3NlcV9zdGFydAkJPSBlbmNfcHJlX3NlcV9zdGFydCwKKwkucG9zdF9zZXFfc3RhcnQJCT0gZW5jX3Bvc3Rfc2VxX3N0YXJ0LAorCS5wcmVfZnJhbWVfc3RhcnQJPSBlbmNfcHJlX2ZyYW1lX3N0YXJ0LAorCS5wb3N0X2ZyYW1lX3N0YXJ0CT0gZW5jX3Bvc3RfZnJhbWVfc3RhcnQsCit9OworCisvKiBRdWVyeSBjYXBhYmlsaXRpZXMgb2YgdGhlIGRldmljZSAqLworc3RhdGljIGludCB2aWRpb2NfcXVlcnljYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXApCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCisJc3RybmNweShjYXAtPmRyaXZlciwgZGV2LT5wbGF0X2Rldi0+bmFtZSwgc2l6ZW9mKGNhcC0+ZHJpdmVyKSAtIDEpOworCXN0cm5jcHkoY2FwLT5jYXJkLCBkZXYtPnBsYXRfZGV2LT5uYW1lLCBzaXplb2YoY2FwLT5jYXJkKSAtIDEpOworCWNhcC0+YnVzX2luZm9bMF0gPSAwOworCWNhcC0+dmVyc2lvbiA9IEtFUk5FTF9WRVJTSU9OKDEsIDAsIDApOworCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRQorCQkJICB8IFY0TDJfQ0FQX1ZJREVPX09VVFBVVAorCQkJICB8IFY0TDJfQ0FQX1NUUkVBTUlORzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfZW51bV9mbXQoc3RydWN0IHY0bDJfZm10ZGVzYyAqZiwgYm9vbCBtcGxhbmUsIGJvb2wgb3V0KQoreworCXN0cnVjdCBzNXBfbWZjX2ZtdCAqZm10OworCWludCBpLCBqID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZvcm1hdHMpOyArK2kpIHsKKwkJaWYgKG1wbGFuZSAmJiBmb3JtYXRzW2ldLm51bV9wbGFuZXMgPT0gMSkKKwkJCWNvbnRpbnVlOworCQllbHNlIGlmICghbXBsYW5lICYmIGZvcm1hdHNbaV0ubnVtX3BsYW5lcyA+IDEpCisJCQljb250aW51ZTsKKwkJaWYgKG91dCAmJiBmb3JtYXRzW2ldLnR5cGUgIT0gTUZDX0ZNVF9SQVcpCisJCQljb250aW51ZTsKKwkJZWxzZSBpZiAoIW91dCAmJiBmb3JtYXRzW2ldLnR5cGUgIT0gTUZDX0ZNVF9FTkMpCisJCQljb250aW51ZTsKKwkJaWYgKGogPT0gZi0+aW5kZXgpIHsKKwkJCWZtdCA9ICZmb3JtYXRzW2ldOworCQkJc3RybGNweShmLT5kZXNjcmlwdGlvbiwgZm10LT5uYW1lLAorCQkJCXNpemVvZihmLT5kZXNjcmlwdGlvbikpOworCQkJZi0+cGl4ZWxmb3JtYXQgPSBmbXQtPmZvdXJjYzsKKwkJCXJldHVybiAwOworCQl9CisJCSsrajsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2VudW1fZm10X3ZpZF9jYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnBpcnYsCisJCQkJICAgc3RydWN0IHY0bDJfZm10ZGVzYyAqZikKK3sKKwlyZXR1cm4gdmlkaW9jX2VudW1fZm10KGYsIGZhbHNlLCBmYWxzZSk7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2VudW1fZm10X3ZpZF9jYXBfbXBsYW5lKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwaXJ2LAorCQkJCQkgIHN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYpCit7CisJcmV0dXJuIHZpZGlvY19lbnVtX2ZtdChmLCB0cnVlLCBmYWxzZSk7Cit9CisKK3N0YXRpYyBpbnQgdmlkaW9jX2VudW1fZm10X3ZpZF9vdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByb3YsCisJCQkJICAgc3RydWN0IHY0bDJfZm10ZGVzYyAqZikKK3sKKwlyZXR1cm4gdmlkaW9jX2VudW1fZm10KGYsIGZhbHNlLCB0cnVlKTsKK30KKworc3RhdGljIGludCB2aWRpb2NfZW51bV9mbXRfdmlkX291dF9tcGxhbmUoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByb3YsCisJCQkJCSAgc3RydWN0IHY0bDJfZm10ZGVzYyAqZikKK3sKKwlyZXR1cm4gdmlkaW9jX2VudW1fZm10KGYsIHRydWUsIHRydWUpOworfQorCitzdGF0aWMgaW50IHZpZGlvY19nX2ZtdChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHByaXYpOworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXRfbXBsYW5lICpwaXhfZm10X21wID0gJmYtPmZtdC5waXhfbXA7CisKKwltZmNfZGVidWcoMiwgImYtPnR5cGUgPSAlZCBjdHgtPnN0YXRlID0gJWRcbiIsIGYtPnR5cGUsIGN0eC0+c3RhdGUpOworCWlmIChmLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpIHsKKwkJLyogVGhpcyBpcyBydW4gb24gb3V0cHV0IChlbmNvZGVyIGRlc3QpICovCisJCXBpeF9mbXRfbXAtPndpZHRoID0gMDsKKwkJcGl4X2ZtdF9tcC0+aGVpZ2h0ID0gMDsKKwkJcGl4X2ZtdF9tcC0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJCXBpeF9mbXRfbXAtPnBpeGVsZm9ybWF0ID0gY3R4LT5kc3RfZm10LT5mb3VyY2M7CisJCXBpeF9mbXRfbXAtPm51bV9wbGFuZXMgPSBjdHgtPmRzdF9mbXQtPm51bV9wbGFuZXM7CisKKwkJcGl4X2ZtdF9tcC0+cGxhbmVfZm10WzBdLmJ5dGVzcGVybGluZSA9IGN0eC0+ZW5jX2RzdF9idWZfc2l6ZTsKKwkJcGl4X2ZtdF9tcC0+cGxhbmVfZm10WzBdLnNpemVpbWFnZSA9IGN0eC0+ZW5jX2RzdF9idWZfc2l6ZTsKKwl9IGVsc2UgaWYgKGYtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKSB7CisJCS8qIFRoaXMgaXMgcnVuIG9uIGNhcHR1cmUgKGVuY29kZXIgc3JjKSAqLworCQlwaXhfZm10X21wLT53aWR0aCA9IGN0eC0+aW1nX3dpZHRoOworCQlwaXhfZm10X21wLT5oZWlnaHQgPSBjdHgtPmltZ19oZWlnaHQ7CisKKwkJcGl4X2ZtdF9tcC0+ZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CisJCXBpeF9mbXRfbXAtPnBpeGVsZm9ybWF0ID0gY3R4LT5zcmNfZm10LT5mb3VyY2M7CisJCXBpeF9mbXRfbXAtPm51bV9wbGFuZXMgPSBjdHgtPnNyY19mbXQtPm51bV9wbGFuZXM7CisKKwkJcGl4X2ZtdF9tcC0+cGxhbmVfZm10WzBdLmJ5dGVzcGVybGluZSA9IGN0eC0+YnVmX3dpZHRoOworCQlwaXhfZm10X21wLT5wbGFuZV9mbXRbMF0uc2l6ZWltYWdlID0gY3R4LT5sdW1hX3NpemU7CisJCXBpeF9mbXRfbXAtPnBsYW5lX2ZtdFsxXS5ieXRlc3BlcmxpbmUgPSBjdHgtPmJ1Zl93aWR0aDsKKwkJcGl4X2ZtdF9tcC0+cGxhbmVfZm10WzFdLnNpemVpbWFnZSA9IGN0eC0+Y2hyb21hX3NpemU7CisJfSBlbHNlIHsKKwkJbWZjX2VycigiaW52YWxpZCBidWYgdHlwZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWRpb2NfdHJ5X2ZtdChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXN0cnVjdCBzNXBfbWZjX2ZtdCAqZm10OworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXRfbXBsYW5lICpwaXhfZm10X21wID0gJmYtPmZtdC5waXhfbXA7CisKKwlpZiAoZi0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKSB7CisJCWZtdCA9IGZpbmRfZm9ybWF0KGYsIE1GQ19GTVRfRU5DKTsKKwkJaWYgKCFmbXQpIHsKKwkJCW1mY19lcnIoImZhaWxlZCB0byB0cnkgb3V0cHV0IGZvcm1hdFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChwaXhfZm10X21wLT5wbGFuZV9mbXRbMF0uc2l6ZWltYWdlID09IDApIHsKKwkJCW1mY19lcnIoIm11c3QgYmUgc2V0IGVuY29kaW5nIG91dHB1dCBzaXplXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJcGl4X2ZtdF9tcC0+cGxhbmVfZm10WzBdLmJ5dGVzcGVybGluZSA9CisJCQlwaXhfZm10X21wLT5wbGFuZV9mbXRbMF0uc2l6ZWltYWdlOworCX0gZWxzZSBpZiAoZi0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpIHsKKwkJZm10ID0gZmluZF9mb3JtYXQoZiwgTUZDX0ZNVF9SQVcpOworCQlpZiAoIWZtdCkgeworCQkJbWZjX2VycigiZmFpbGVkIHRvIHRyeSBvdXRwdXQgZm9ybWF0XG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKGZtdC0+bnVtX3BsYW5lcyAhPSBwaXhfZm10X21wLT5udW1fcGxhbmVzKSB7CisJCQltZmNfZXJyKCJmYWlsZWQgdG8gdHJ5IG91dHB1dCBmb3JtYXRcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9IGVsc2UgeworCQltZmNfZXJyKCJpbnZhbGlkIGJ1ZiB0eXBlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZpZGlvY19zX2ZtdChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgczVwX21mY19jdHggKmN0eCA9IGZoX3RvX2N0eChwcml2KTsKKwlzdHJ1Y3QgczVwX21mY19mbXQgKmZtdDsKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0X21wbGFuZSAqcGl4X2ZtdF9tcCA9ICZmLT5mbXQucGl4X21wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSB2aWRpb2NfdHJ5X2ZtdChmaWxlLCBwcml2LCBmKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWlmIChjdHgtPnZxX3NyYy5zdHJlYW1pbmcgfHwgY3R4LT52cV9kc3Quc3RyZWFtaW5nKSB7CisJCXY0bDJfZXJyKCZkZXYtPnY0bDJfZGV2LCAiJXMgcXVldWUgYnVzeVxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKwlpZiAoZi0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKSB7CisJCWZtdCA9IGZpbmRfZm9ybWF0KGYsIE1GQ19GTVRfRU5DKTsKKwkJaWYgKCFmbXQpIHsKKwkJCW1mY19lcnIoImZhaWxlZCB0byBzZXQgY2FwdHVyZSBmb3JtYXRcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJY3R4LT5zdGF0ZSA9IE1GQ0lOU1RfSU5JVDsKKwkJY3R4LT5kc3RfZm10ID0gZm10OworCQljdHgtPmNvZGVjX21vZGUgPSBjdHgtPmRzdF9mbXQtPmNvZGVjX21vZGU7CisJCWN0eC0+ZW5jX2RzdF9idWZfc2l6ZSA9CXBpeF9mbXRfbXAtPnBsYW5lX2ZtdFswXS5zaXplaW1hZ2U7CisJCXBpeF9mbXRfbXAtPnBsYW5lX2ZtdFswXS5ieXRlc3BlcmxpbmUgPSAwOworCQljdHgtPmRzdF9idWZzX2NudCA9IDA7CisJCWN0eC0+Y2FwdHVyZV9zdGF0ZSA9IFFVRVVFX0ZSRUU7CisJCXM1cF9tZmNfYWxsb2NfaW5zdGFuY2VfYnVmZmVyKGN0eCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmNvbmRsb2NrLCBmbGFncyk7CisJCXNldF9iaXQoY3R4LT5udW0sICZkZXYtPmN0eF93b3JrX2JpdHMpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmNvbmRsb2NrLCBmbGFncyk7CisJCXM1cF9tZmNfY2xlYW5fY3R4X2ludF9mbGFncyhjdHgpOworCQlzNXBfbWZjX3RyeV9ydW4oZGV2KTsKKwkJaWYgKHM1cF9tZmNfd2FpdF9mb3JfZG9uZV9jdHgoY3R4LCBcCisJCQkJUzVQX0ZJTVZfUjJIX0NNRF9PUEVOX0lOU1RBTkNFX1JFVCwgMSkpIHsKKwkJCQkvKiBFcnJvciBvciB0aW1lb3V0ICovCisJCQltZmNfZXJyKCJFcnJvciBnZXR0aW5nIGluc3RhbmNlIGZyb20gaGFyZHdhcmVcbiIpOworCQkJczVwX21mY19yZWxlYXNlX2luc3RhbmNlX2J1ZmZlcihjdHgpOworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJCW1mY19kZWJ1ZygyLCAiR290IGluc3RhbmNlIG51bWJlcjogJWRcbiIsIGN0eC0+aW5zdF9ubyk7CisJfSBlbHNlIGlmIChmLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSkgeworCQlmbXQgPSBmaW5kX2Zvcm1hdChmLCBNRkNfRk1UX1JBVyk7CisJCWlmICghZm10KSB7CisJCQltZmNfZXJyKCJmYWlsZWQgdG8gc2V0IG91dHB1dCBmb3JtYXRcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKGZtdC0+bnVtX3BsYW5lcyAhPSBwaXhfZm10X21wLT5udW1fcGxhbmVzKSB7CisJCQltZmNfZXJyKCJmYWlsZWQgdG8gc2V0IG91dHB1dCBmb3JtYXRcbiIpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWN0eC0+c3JjX2ZtdCA9IGZtdDsKKwkJY3R4LT5pbWdfd2lkdGggPSBwaXhfZm10X21wLT53aWR0aDsKKwkJY3R4LT5pbWdfaGVpZ2h0ID0gcGl4X2ZtdF9tcC0+aGVpZ2h0OworCQltZmNfZGVidWcoMiwgImNvZGVjIG51bWJlcjogJWRcbiIsIGN0eC0+c3JjX2ZtdC0+Y29kZWNfbW9kZSk7CisJCW1mY19kZWJ1ZygyLCAiZm10IC0gdzogJWQsIGg6ICVkLCBjdHggLSB3OiAlZCwgaDogJWRcbiIsCisJCQlwaXhfZm10X21wLT53aWR0aCwgcGl4X2ZtdF9tcC0+aGVpZ2h0LAorCQkJY3R4LT5pbWdfd2lkdGgsIGN0eC0+aW1nX2hlaWdodCk7CisJCWlmIChjdHgtPnNyY19mbXQtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfTlYxMk0pIHsKKwkJCWN0eC0+YnVmX3dpZHRoID0gQUxJR04oY3R4LT5pbWdfd2lkdGgsCisJCQkJCQkJUzVQX0ZJTVZfTlYxMk1fSEFMSUdOKTsKKwkJCWN0eC0+bHVtYV9zaXplID0gQUxJR04oY3R4LT5pbWdfd2lkdGgsCisJCQkJUzVQX0ZJTVZfTlYxMk1fSEFMSUdOKSAqIEFMSUdOKGN0eC0+aW1nX2hlaWdodCwKKwkJCQlTNVBfRklNVl9OVjEyTV9MVkFMSUdOKTsKKwkJCWN0eC0+Y2hyb21hX3NpemUgPSBBTElHTihjdHgtPmltZ193aWR0aCwKKwkJCQlTNVBfRklNVl9OVjEyTV9IQUxJR04pICogQUxJR04oKGN0eC0+aW1nX2hlaWdodAorCQkJCT4+IDEpLCBTNVBfRklNVl9OVjEyTV9DVkFMSUdOKTsKKworCQkJY3R4LT5sdW1hX3NpemUgPSBBTElHTihjdHgtPmx1bWFfc2l6ZSwKKwkJCQkJCQlTNVBfRklNVl9OVjEyTV9TQUxJR04pOworCQkJY3R4LT5jaHJvbWFfc2l6ZSA9IEFMSUdOKGN0eC0+Y2hyb21hX3NpemUsCisJCQkJCQkJUzVQX0ZJTVZfTlYxMk1fU0FMSUdOKTsKKworCQkJcGl4X2ZtdF9tcC0+cGxhbmVfZm10WzBdLnNpemVpbWFnZSA9IGN0eC0+bHVtYV9zaXplOworCQkJcGl4X2ZtdF9tcC0+cGxhbmVfZm10WzBdLmJ5dGVzcGVybGluZSA9IGN0eC0+YnVmX3dpZHRoOworCQkJcGl4X2ZtdF9tcC0+cGxhbmVfZm10WzFdLnNpemVpbWFnZSA9IGN0eC0+Y2hyb21hX3NpemU7CisJCQlwaXhfZm10X21wLT5wbGFuZV9mbXRbMV0uYnl0ZXNwZXJsaW5lID0gY3R4LT5idWZfd2lkdGg7CisKKwkJfSBlbHNlIGlmIChjdHgtPnNyY19mbXQtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfTlYxMk1UKSB7CisJCQljdHgtPmJ1Zl93aWR0aCA9IEFMSUdOKGN0eC0+aW1nX3dpZHRoLAorCQkJCQkJCVM1UF9GSU1WX05WMTJNVF9IQUxJR04pOworCQkJY3R4LT5sdW1hX3NpemUgPSBBTElHTihjdHgtPmltZ193aWR0aCwKKwkJCQlTNVBfRklNVl9OVjEyTVRfSEFMSUdOKQkqIEFMSUdOKGN0eC0+aW1nX2hlaWdodCwKKwkJCQlTNVBfRklNVl9OVjEyTVRfVkFMSUdOKTsKKwkJCWN0eC0+Y2hyb21hX3NpemUgPSBBTElHTihjdHgtPmltZ193aWR0aCwKKwkJCQlTNVBfRklNVl9OVjEyTVRfSEFMSUdOKSAqIEFMSUdOKChjdHgtPmltZ19oZWlnaHQKKwkJCQk+PiAxKSwgUzVQX0ZJTVZfTlYxMk1UX1ZBTElHTik7CisJCQljdHgtPmx1bWFfc2l6ZSA9IEFMSUdOKGN0eC0+bHVtYV9zaXplLAorCQkJCQkJCVM1UF9GSU1WX05WMTJNVF9TQUxJR04pOworCQkJY3R4LT5jaHJvbWFfc2l6ZSA9IEFMSUdOKGN0eC0+Y2hyb21hX3NpemUsCisJCQkJCQkJUzVQX0ZJTVZfTlYxMk1UX1NBTElHTik7CisKKwkJCXBpeF9mbXRfbXAtPnBsYW5lX2ZtdFswXS5zaXplaW1hZ2UgPSBjdHgtPmx1bWFfc2l6ZTsKKwkJCXBpeF9mbXRfbXAtPnBsYW5lX2ZtdFswXS5ieXRlc3BlcmxpbmUgPSBjdHgtPmJ1Zl93aWR0aDsKKwkJCXBpeF9mbXRfbXAtPnBsYW5lX2ZtdFsxXS5zaXplaW1hZ2UgPSBjdHgtPmNocm9tYV9zaXplOworCQkJcGl4X2ZtdF9tcC0+cGxhbmVfZm10WzFdLmJ5dGVzcGVybGluZSA9IGN0eC0+YnVmX3dpZHRoOworCQl9CisJCWN0eC0+c3JjX2J1ZnNfY250ID0gMDsKKwkJY3R4LT5vdXRwdXRfc3RhdGUgPSBRVUVVRV9GUkVFOworCX0gZWxzZSB7CisJCW1mY19lcnIoImludmFsaWQgYnVmIHR5cGVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CitvdXQ6CisJbWZjX2RlYnVnX2xlYXZlKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2aWRpb2NfcmVxYnVmcyhzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJICBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqcmVxYnVmcykKK3sKKwlzdHJ1Y3QgczVwX21mY19jdHggKmN0eCA9IGZoX3RvX2N0eChwcml2KTsKKwlpbnQgcmV0ID0gMDsKKworCS8qIGlmIG1lbW9yeSBpcyBub3QgbW1wIG9yIHVzZXJwdHIgcmV0dXJuIGVycm9yICovCisJaWYgKChyZXFidWZzLT5tZW1vcnkgIT0gVjRMMl9NRU1PUllfTU1BUCkgJiYKKwkJKHJlcWJ1ZnMtPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9VU0VSUFRSKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHJlcWJ1ZnMtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkgeworCQlpZiAoY3R4LT5jYXB0dXJlX3N0YXRlICE9IFFVRVVFX0ZSRUUpIHsKKwkJCW1mY19lcnIoImludmFsaWQgY2FwdHVyZSBzdGF0ZTogJWRcbiIsCisJCQkJCQkJY3R4LT5jYXB0dXJlX3N0YXRlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJldCA9IHZiMl9yZXFidWZzKCZjdHgtPnZxX2RzdCwgcmVxYnVmcyk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJbWZjX2VycigiZXJyb3IgaW4gdmIyX3JlcWJ1ZnMoKSBmb3IgRShEKVxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWN0eC0+Y2FwdHVyZV9zdGF0ZSA9IFFVRVVFX0JVRlNfUkVRVUVTVEVEOworCQlyZXQgPSBzNXBfbWZjX2FsbG9jX2NvZGVjX2J1ZmZlcnMoY3R4KTsKKwkJaWYgKHJldCkgeworCQkJbWZjX2VycigiRmFpbGVkIHRvIGFsbG9jYXRlIGVuY29kaW5nIGJ1ZmZlcnNcbiIpOworCQkJcmVxYnVmcy0+Y291bnQgPSAwOworCQkJcmV0ID0gdmIyX3JlcWJ1ZnMoJmN0eC0+dnFfZHN0LCByZXFidWZzKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfSBlbHNlIGlmIChyZXFidWZzLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSkgeworCQlpZiAoY3R4LT5vdXRwdXRfc3RhdGUgIT0gUVVFVUVfRlJFRSkgeworCQkJbWZjX2VycigiaW52YWxpZCBvdXRwdXQgc3RhdGU6ICVkXG4iLAorCQkJCQkJCWN0eC0+b3V0cHV0X3N0YXRlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJldCA9IHZiMl9yZXFidWZzKCZjdHgtPnZxX3NyYywgcmVxYnVmcyk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJbWZjX2VycigiZXJyb3IgaW4gdmIyX3JlcWJ1ZnMoKSBmb3IgRShTKVxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWN0eC0+b3V0cHV0X3N0YXRlID0gUVVFVUVfQlVGU19SRVFVRVNURUQ7CisJfSBlbHNlIHsKKwkJbWZjX2VycigiaW52YWxpZCBidWYgdHlwZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHZpZGlvY19xdWVyeWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKKwkJCQkJCSAgIHN0cnVjdCB2NGwyX2J1ZmZlciAqYnVmKQoreworCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHByaXYpOworCWludCByZXQgPSAwOworCisJLyogaWYgbWVtb3J5IGlzIG5vdCBtbXAgb3IgdXNlcnB0ciByZXR1cm4gZXJyb3IgKi8KKwlpZiAoKGJ1Zi0+bWVtb3J5ICE9IFY0TDJfTUVNT1JZX01NQVApICYmCisJCShidWYtPm1lbW9yeSAhPSBWNEwyX01FTU9SWV9VU0VSUFRSKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGJ1Zi0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKSB7CisJCWlmIChjdHgtPnN0YXRlICE9IE1GQ0lOU1RfR09UX0lOU1QpIHsKKwkJCW1mY19lcnIoImludmFsaWQgY29udGV4dCBzdGF0ZTogJWRcbiIsIGN0eC0+c3RhdGUpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmV0ID0gdmIyX3F1ZXJ5YnVmKCZjdHgtPnZxX2RzdCwgYnVmKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQltZmNfZXJyKCJlcnJvciBpbiB2YjJfcXVlcnlidWYoKSBmb3IgRShEKVxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWJ1Zi0+bS5wbGFuZXNbMF0ubS5tZW1fb2Zmc2V0ICs9IERTVF9RVUVVRV9PRkZfQkFTRTsKKwl9IGVsc2UgaWYgKGJ1Zi0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpIHsKKwkJcmV0ID0gdmIyX3F1ZXJ5YnVmKCZjdHgtPnZxX3NyYywgYnVmKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQltZmNfZXJyKCJlcnJvciBpbiB2YjJfcXVlcnlidWYoKSBmb3IgRShTKVxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfSBlbHNlIHsKKwkJbWZjX2VycigiaW52YWxpZCBidWYgdHlwZVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBRdWV1ZSBhIGJ1ZmZlciAqLworc3RhdGljIGludCB2aWRpb2NfcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCit7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBmaF90b19jdHgocHJpdik7CisKKwlpZiAoY3R4LT5zdGF0ZSA9PSBNRkNJTlNUX0VSUk9SKSB7CisJCW1mY19lcnIoIkNhbGwgb24gUUJVRiBhZnRlciB1bnJlY292ZXJhYmxlIGVycm9yXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmIChidWYtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKQorCQlyZXR1cm4gdmIyX3FidWYoJmN0eC0+dnFfc3JjLCBidWYpOworCWVsc2UgaWYgKGJ1Zi0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKQorCQlyZXR1cm4gdmIyX3FidWYoJmN0eC0+dnFfZHN0LCBidWYpOworCXJldHVybiAtRUlOVkFMOworfQorCisvKiBEZXF1ZXVlIGEgYnVmZmVyICovCitzdGF0aWMgaW50IHZpZGlvY19kcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpidWYpCit7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBmaF90b19jdHgocHJpdik7CisKKwlpZiAoY3R4LT5zdGF0ZSA9PSBNRkNJTlNUX0VSUk9SKSB7CisJCW1mY19lcnIoIkNhbGwgb24gRFFCVUYgYWZ0ZXIgdW5yZWNvdmVyYWJsZSBlcnJvclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlpZiAoYnVmLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSkKKwkJcmV0dXJuIHZiMl9kcWJ1ZigmY3R4LT52cV9zcmMsIGJ1ZiwgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCWVsc2UgaWYgKGJ1Zi0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKQorCQlyZXR1cm4gdmIyX2RxYnVmKCZjdHgtPnZxX2RzdCwgYnVmLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qIFN0cmVhbSBvbiAqLworc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsCisJCQkgICBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgczVwX21mY19jdHggKmN0eCA9IGZoX3RvX2N0eChwcml2KTsKKworCWlmICh0eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSkKKwkJcmV0dXJuIHZiMl9zdHJlYW1vbigmY3R4LT52cV9zcmMsIHR5cGUpOworCWVsc2UgaWYgKHR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkKKwkJcmV0dXJuIHZiMl9zdHJlYW1vbigmY3R4LT52cV9kc3QsIHR5cGUpOworCXJldHVybiAtRUlOVkFMOworfQorCisvKiBTdHJlYW0gb2ZmLCB3aGljaCBlcXVhbHMgdG8gYSBwYXVzZSAqLworc3RhdGljIGludCB2aWRpb2Nfc3RyZWFtb2ZmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgIGVudW0gdjRsMl9idWZfdHlwZSB0eXBlKQoreworCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHByaXYpOworCisJaWYgKHR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKQorCQlyZXR1cm4gdmIyX3N0cmVhbW9mZigmY3R4LT52cV9zcmMsIHR5cGUpOworCWVsc2UgaWYgKHR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkKKwkJcmV0dXJuIHZiMl9zdHJlYW1vZmYoJmN0eC0+dnFfZHN0LCB0eXBlKTsKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaDI2NF9sZXZlbChlbnVtIHY0bDJfbXBlZ192aWRlb19oMjY0X2xldmVsIGx2bCkKK3sKKwlzdGF0aWMgdW5zaWduZWQgaW50IHRbVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfNF8wICsgMV0gPSB7CisJCS8qIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMCAgICovIDEwLAorCQkvKiBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8xQiAgICAqLyA5LAorCQkvKiBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8xXzEgICAqLyAxMSwKKwkJLyogVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMV8yICAgKi8gMTIsCisJCS8qIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMyAgICovIDEzLAorCQkvKiBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8yXzAgICAqLyAyMCwKKwkJLyogVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMl8xICAgKi8gMjEsCisJCS8qIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzJfMiAgICovIDIyLAorCQkvKiBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8zXzAgICAqLyAzMCwKKwkJLyogVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfM18xICAgKi8gMzEsCisJCS8qIFY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzNfMiAgICovIDMyLAorCQkvKiBWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF80XzAgICAqLyA0MCwKKwl9OworCXJldHVybiB0W2x2bF07Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1wZWc0X2xldmVsKGVudW0gdjRsMl9tcGVnX3ZpZGVvX21wZWc0X2xldmVsIGx2bCkKK3sKKwlzdGF0aWMgdW5zaWduZWQgaW50IHRbVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzUgKyAxXSA9IHsKKwkJLyogVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzAgICAgKi8gMCwKKwkJLyogVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzBCICAgKi8gOSwKKwkJLyogVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzEgICAgKi8gMSwKKwkJLyogVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzIgICAgKi8gMiwKKwkJLyogVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzMgICAgKi8gMywKKwkJLyogVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzNCICAgKi8gNywKKwkJLyogVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzQgICAgKi8gNCwKKwkJLyogVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzUgICAgKi8gNSwKKwl9OworCXJldHVybiB0W2x2bF07Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHZ1aV9zYXJfaWRjKGVudW0gdjRsMl9tcGVnX3ZpZGVvX2gyNjRfdnVpX3Nhcl9pZGMgc2FyKQoreworCXN0YXRpYyB1bnNpZ25lZCBpbnQgdFtWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ19FWFRFTkRFRCArIDFdID0geworCQkvKiBWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ19VTlNQRUNJRklFRCAgICAgKi8gMCwKKwkJLyogVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMXgxICAgICAgICAgICAgICovIDEsCisJCS8qIFY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzEyeDExICAgICAgICAgICAqLyAyLAorCQkvKiBWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18xMHgxMSAgICAgICAgICAgKi8gMywKKwkJLyogVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTZ4MTEgICAgICAgICAgICovIDQsCisJCS8qIFY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzQweDMzICAgICAgICAgICAqLyA1LAorCQkvKiBWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18yNHgxMSAgICAgICAgICAgKi8gNiwKKwkJLyogVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMjB4MTEgICAgICAgICAgICovIDcsCisJCS8qIFY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzMyeDExICAgICAgICAgICAqLyA4LAorCQkvKiBWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ184MHgzMyAgICAgICAgICAgKi8gOSwKKwkJLyogVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTh4MTEgICAgICAgICAgICovIDEwLAorCQkvKiBWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18xNXgxMSAgICAgICAgICAgKi8gMTEsCisJCS8qIFY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzY0eDMzICAgICAgICAgICAqLyAxMiwKKwkJLyogVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTYweDk5ICAgICAgICAgICovIDEzLAorCQkvKiBWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ180eDMgICAgICAgICAgICAgKi8gMTQsCisJCS8qIFY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzN4MiAgICAgICAgICAgICAqLyAxNSwKKwkJLyogVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMngxICAgICAgICAgICAgICovIDE2LAorCQkvKiBWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ19FWFRFTkRFRCAgICAgICAgKi8gMjU1LAorCX07CisJcmV0dXJuIHRbc2FyXTsKK30KKworc3RhdGljIGludCBzNXBfbWZjX2VuY19zX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKK3sKKwlzdHJ1Y3QgczVwX21mY19jdHggKmN0eCA9IGN0cmxfdG9fY3R4KGN0cmwpOworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisJc3RydWN0IHM1cF9tZmNfZW5jX3BhcmFtcyAqcCA9ICZjdHgtPmVuY19wYXJhbXM7CisJaW50IHJldCA9IDA7CisKKwlzd2l0Y2ggKGN0cmwtPmlkKSB7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0dPUF9TSVpFOgorCQlwLT5nb3Bfc2l6ZSA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VTFRJX1NMSUNFX01PREU6CisJCXAtPnNsaWNlX21vZGUgPSBjdHJsLT52YWw7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NVUxUSV9TTElDRV9NQVhfTUI6CisJCXAtPnNsaWNlX21iID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fTVVMVElfU0xJQ0VfTUFYX0JZVEVTOgorCQlwLT5zbGljZV9iaXQgPSBjdHJsLT52YWwgKiA4OworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fQ1lDTElDX0lOVFJBX1JFRlJFU0hfTUI6CisJCXAtPmludHJhX3JlZnJlc2hfbWIgPSBjdHJsLT52YWw7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19QQURESU5HOgorCQlwLT5wYWQgPSBjdHJsLT52YWw7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19QQURESU5HX1lVVjoKKwkJcC0+cGFkX2x1bWEgPSAoY3RybC0+dmFsID4+IDE2KSAmIDB4ZmY7CisJCXAtPnBhZF9jYiA9IChjdHJsLT52YWwgPj4gOCkgJiAweGZmOworCQlwLT5wYWRfY3IgPSAoY3RybC0+dmFsID4+IDApICYgMHhmZjsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0ZSQU1FX1JDX0VOQUJMRToKKwkJcC0+cmNfZnJhbWUgPSBjdHJsLT52YWw7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CSVRSQVRFOgorCQlwLT5yY19iaXRyYXRlID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fUkNfUkVBQ1RJT05fQ09FRkY6CisJCXAtPnJjX3JlYWN0aW9uX2NvZWZmID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fRk9SQ0VfRlJBTUVfVFlQRToKKwkJY3R4LT5mb3JjZV9mcmFtZV90eXBlID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fVkJWX1NJWkU6CisJCXAtPnZidl9zaXplID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9DUEJfU0laRToKKwkJcC0+Y29kZWMuaDI2NC5jcGJfc2l6ZSA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0hFQURFUl9NT0RFOgorCQlwLT5zZXFfaGRyX21vZGUgPSBjdHJsLT52YWw7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19GUkFNRV9TS0lQX01PREU6CisJCXAtPmZyYW1lX3NraXBfbW9kZSA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX1JDX0ZJWEVEX1RBUkdFVF9CSVQ6CisJCXAtPmZpeGVkX3RhcmdldF9iaXQgPSBjdHJsLT52YWw7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19CX0ZSQU1FUzoKKwkJcC0+bnVtX2JfZnJhbWUgPSBjdHJsLT52YWw7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1BST0ZJTEU6CisJCXN3aXRjaCAoY3RybC0+dmFsKSB7CisJCWNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9NQUlOOgorCQkJcC0+Y29kZWMuaDI2NC5wcm9maWxlID0KKwkJCQkJUzVQX0ZJTVZfRU5DX1BST0ZJTEVfSDI2NF9NQUlOOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIOgorCQkJcC0+Y29kZWMuaDI2NC5wcm9maWxlID0KKwkJCQkJUzVQX0ZJTVZfRU5DX1BST0ZJTEVfSDI2NF9ISUdIOworCQkJYnJlYWs7CisJCWNhc2UgVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9CQVNFTElORToKKwkJCXAtPmNvZGVjLmgyNjQucHJvZmlsZSA9CisJCQkJUzVQX0ZJTVZfRU5DX1BST0ZJTEVfSDI2NF9CQVNFTElORTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MRVZFTDoKKwkJcC0+Y29kZWMuaDI2NC5sZXZlbF92NGwyID0gY3RybC0+dmFsOworCQlwLT5jb2RlYy5oMjY0LmxldmVsID0gaDI2NF9sZXZlbChjdHJsLT52YWwpOworCQlpZiAocC0+Y29kZWMuaDI2NC5sZXZlbCA8IDApIHsKKwkJCW1mY19lcnIoIkxldmVsIG51bWJlciBpcyB3cm9uZ1xuIik7CisJCQlyZXQgPSBwLT5jb2RlYy5oMjY0LmxldmVsOworCQl9CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9MRVZFTDoKKwkJcC0+Y29kZWMubXBlZzQubGV2ZWxfdjRsMiA9IGN0cmwtPnZhbDsKKwkJcC0+Y29kZWMubXBlZzQubGV2ZWwgPSBtcGVnNF9sZXZlbChjdHJsLT52YWwpOworCQlpZiAocC0+Y29kZWMubXBlZzQubGV2ZWwgPCAwKSB7CisJCQltZmNfZXJyKCJMZXZlbCBudW1iZXIgaXMgd3JvbmdcbiIpOworCQkJcmV0ID0gcC0+Y29kZWMubXBlZzQubGV2ZWw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTE9PUF9GSUxURVJfTU9ERToKKwkJcC0+Y29kZWMuaDI2NC5sb29wX2ZpbHRlcl9tb2RlID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9BTFBIQToKKwkJcC0+Y29kZWMuaDI2NC5sb29wX2ZpbHRlcl9hbHBoYSA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTE9PUF9GSUxURVJfQkVUQToKKwkJcC0+Y29kZWMuaDI2NC5sb29wX2ZpbHRlcl9iZXRhID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9FTlRST1BZX01PREU6CisJCXAtPmNvZGVjLmgyNjQuZW50cm9weV9tb2RlID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fSDI2NF9OVU1fUkVGX1BJQ19GT1JfUDoKKwkJcC0+Y29kZWMuaDI2NC5udW1fcmVmX3BpY180cCA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfOFg4X1RSQU5TRk9STToKKwkJcC0+Y29kZWMuaDI2NC5fOHg4X3RyYW5zZm9ybSA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01CX1JDX0VOQUJMRToKKwkJcC0+Y29kZWMuaDI2NC5yY19tYiA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfSV9GUkFNRV9RUDoKKwkJcC0+Y29kZWMuaDI2NC5yY19mcmFtZV9xcCA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTUlOX1FQOgorCQlwLT5jb2RlYy5oMjY0LnJjX21pbl9xcCA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTUFYX1FQOgorCQlwLT5jb2RlYy5oMjY0LnJjX21heF9xcCA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfUF9GUkFNRV9RUDoKKwkJcC0+Y29kZWMuaDI2NC5yY19wX2ZyYW1lX3FwID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9CX0ZSQU1FX1FQOgorCQlwLT5jb2RlYy5oMjY0LnJjX2JfZnJhbWVfcXAgPSBjdHJsLT52YWw7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9JX0ZSQU1FX1FQOgorCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjYzX0lfRlJBTUVfUVA6CisJCXAtPmNvZGVjLm1wZWc0LnJjX2ZyYW1lX3FwID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfTUlOX1FQOgorCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjYzX01JTl9RUDoKKwkJcC0+Y29kZWMubXBlZzQucmNfbWluX3FwID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfTUFYX1FQOgorCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjYzX01BWF9RUDoKKwkJcC0+Y29kZWMubXBlZzQucmNfbWF4X3FwID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfUF9GUkFNRV9RUDoKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19QX0ZSQU1FX1FQOgorCQlwLT5jb2RlYy5tcGVnNC5yY19wX2ZyYW1lX3FwID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfQl9GUkFNRV9RUDoKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19CX0ZSQU1FX1FQOgorCQlwLT5jb2RlYy5tcGVnNC5yY19iX2ZyYW1lX3FwID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fSDI2NF9BREFQVElWRV9SQ19EQVJLOgorCQlwLT5jb2RlYy5oMjY0LnJjX21iX2RhcmsgPSBjdHJsLT52YWw7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19IMjY0X0FEQVBUSVZFX1JDX1NNT09USDoKKwkJcC0+Y29kZWMuaDI2NC5yY19tYl9zbW9vdGggPSBjdHJsLT52YWw7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19IMjY0X0FEQVBUSVZFX1JDX1NUQVRJQzoKKwkJcC0+Y29kZWMuaDI2NC5yY19tYl9zdGF0aWMgPSBjdHJsLT52YWw7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19IMjY0X0FEQVBUSVZFX1JDX0FDVElWSVRZOgorCQlwLT5jb2RlYy5oMjY0LnJjX21iX2FjdGl2aXR5ID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0VOQUJMRToKKwkJcC0+Y29kZWMuaDI2NC52dWlfc2FyID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQzoKKwkJcC0+Y29kZWMuaDI2NC52dWlfc2FyX2lkYyA9IHZ1aV9zYXJfaWRjKGN0cmwtPnZhbCk7CisJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1ZVSV9FWFRfU0FSX1dJRFRIOgorCQlwLT5jb2RlYy5oMjY0LnZ1aV9leHRfc2FyX3dpZHRoID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9WVUlfRVhUX1NBUl9IRUlHSFQ6CisJCXAtPmNvZGVjLmgyNjQudnVpX2V4dF9zYXJfaGVpZ2h0ID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fR09QX0NMT1NVUkU6CisJCXAtPmNvZGVjLmgyNjQub3Blbl9nb3AgPSAhY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9JX1BFUklPRDoKKwkJcC0+Y29kZWMuaDI2NC5vcGVuX2dvcF9zaXplID0gY3RybC0+dmFsOworCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfUFJPRklMRToKKwkJc3dpdGNoIChjdHJsLT52YWwpIHsKKwkJY2FzZSBWNEwyX01QRUdfVklERU9fTVBFRzRfUFJPRklMRV9TSU1QTEU6CisJCQlwLT5jb2RlYy5tcGVnNC5wcm9maWxlID0KKwkJCQlTNVBfRklNVl9FTkNfUFJPRklMRV9NUEVHNF9TSU1QTEU7CisJCQlicmVhazsKKwkJY2FzZSBWNEwyX01QRUdfVklERU9fTVBFRzRfUFJPRklMRV9BRFZBTkNFRF9TSU1QTEU6CisJCQlwLT5jb2RlYy5tcGVnNC5wcm9maWxlID0KKwkJCVM1UF9GSU1WX0VOQ19QUk9GSUxFX01QRUc0X0FEVkFOQ0VEX1NJTVBMRTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfUVBFTDoKKwkJcC0+Y29kZWMubXBlZzQucXVhcnRlcl9waXhlbCA9IGN0cmwtPnZhbDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJdjRsMl9lcnIoJmRldi0+djRsMl9kZXYsICJJbnZhbGlkIGNvbnRyb2wsIGlkPSVkLCB2YWw9JWRcbiIsCisJCQkJCQkJY3RybC0+aWQsIGN0cmwtPnZhbCk7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX29wcyBzNXBfbWZjX2VuY19jdHJsX29wcyA9IHsKKwkuc19jdHJsID0gczVwX21mY19lbmNfc19jdHJsLAorfTsKKworaW50IHZpZGlvY19zX3Bhcm0oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKmEpCit7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBmaF90b19jdHgocHJpdik7CisKKwlpZiAoYS0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpIHsKKwkJY3R4LT5lbmNfcGFyYW1zLnJjX2ZyYW1lcmF0ZV9udW0gPQorCQkJCQlhLT5wYXJtLm91dHB1dC50aW1lcGVyZnJhbWUuZGVub21pbmF0b3I7CisJCWN0eC0+ZW5jX3BhcmFtcy5yY19mcmFtZXJhdGVfZGVub20gPQorCQkJCQlhLT5wYXJtLm91dHB1dC50aW1lcGVyZnJhbWUubnVtZXJhdG9yOworCX0gZWxzZSB7CisJCW1mY19lcnIoIlNldHRpbmcgRlBTIGlzIG9ubHkgcG9zc2libGUgZm9yIHRoZSBvdXRwdXQgcXVldWVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCB2aWRpb2NfZ19wYXJtKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtICphKQoreworCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHByaXYpOworCisJaWYgKGEtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQpIHsKKwkJYS0+cGFybS5vdXRwdXQudGltZXBlcmZyYW1lLmRlbm9taW5hdG9yID0KKwkJCQkJY3R4LT5lbmNfcGFyYW1zLnJjX2ZyYW1lcmF0ZV9udW07CisJCWEtPnBhcm0ub3V0cHV0LnRpbWVwZXJmcmFtZS5udW1lcmF0b3IgPQorCQkJCQljdHgtPmVuY19wYXJhbXMucmNfZnJhbWVyYXRlX2Rlbm9tOworCX0gZWxzZSB7CisJCW1mY19lcnIoIlNldHRpbmcgRlBTIGlzIG9ubHkgcG9zc2libGUgZm9yIHRoZSBvdXRwdXQgcXVldWVcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgczVwX21mY19lbmNfaW9jdGxfb3BzID0geworCS52aWRpb2NfcXVlcnljYXAgPSB2aWRpb2NfcXVlcnljYXAsCisJLnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwID0gdmlkaW9jX2VudW1fZm10X3ZpZF9jYXAsCisJLnZpZGlvY19lbnVtX2ZtdF92aWRfY2FwX21wbGFuZSA9IHZpZGlvY19lbnVtX2ZtdF92aWRfY2FwX21wbGFuZSwKKwkudmlkaW9jX2VudW1fZm10X3ZpZF9vdXQgPSB2aWRpb2NfZW51bV9mbXRfdmlkX291dCwKKwkudmlkaW9jX2VudW1fZm10X3ZpZF9vdXRfbXBsYW5lID0gdmlkaW9jX2VudW1fZm10X3ZpZF9vdXRfbXBsYW5lLAorCS52aWRpb2NfZ19mbXRfdmlkX2NhcF9tcGxhbmUgPSB2aWRpb2NfZ19mbXQsCisJLnZpZGlvY19nX2ZtdF92aWRfb3V0X21wbGFuZSA9IHZpZGlvY19nX2ZtdCwKKwkudmlkaW9jX3RyeV9mbXRfdmlkX2NhcF9tcGxhbmUgPSB2aWRpb2NfdHJ5X2ZtdCwKKwkudmlkaW9jX3RyeV9mbXRfdmlkX291dF9tcGxhbmUgPSB2aWRpb2NfdHJ5X2ZtdCwKKwkudmlkaW9jX3NfZm10X3ZpZF9jYXBfbXBsYW5lID0gdmlkaW9jX3NfZm10LAorCS52aWRpb2Nfc19mbXRfdmlkX291dF9tcGxhbmUgPSB2aWRpb2Nfc19mbXQsCisJLnZpZGlvY19yZXFidWZzID0gdmlkaW9jX3JlcWJ1ZnMsCisJLnZpZGlvY19xdWVyeWJ1ZiA9IHZpZGlvY19xdWVyeWJ1ZiwKKwkudmlkaW9jX3FidWYgPSB2aWRpb2NfcWJ1ZiwKKwkudmlkaW9jX2RxYnVmID0gdmlkaW9jX2RxYnVmLAorCS52aWRpb2Nfc3RyZWFtb24gPSB2aWRpb2Nfc3RyZWFtb24sCisJLnZpZGlvY19zdHJlYW1vZmYgPSB2aWRpb2Nfc3RyZWFtb2ZmLAorCS52aWRpb2Nfc19wYXJtID0gdmlkaW9jX3NfcGFybSwKKwkudmlkaW9jX2dfcGFybSA9IHZpZGlvY19nX3Bhcm0sCit9OworCitzdGF0aWMgaW50IGNoZWNrX3ZiX3dpdGhfZm10KHN0cnVjdCBzNXBfbWZjX2ZtdCAqZm10LCBzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCit7CisJaW50IGk7CisKKwlpZiAoIWZtdCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGZtdC0+bnVtX3BsYW5lcyAhPSB2Yi0+bnVtX3BsYW5lcykgeworCQltZmNfZXJyKCJpbnZhbGlkIHBsYW5lIG51bWJlciBmb3IgdGhlIGZvcm1hdFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgZm10LT5udW1fcGxhbmVzOyBpKyspIHsKKwkJaWYgKCF2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcih2YiwgaSkpIHsKKwkJCW1mY19lcnIoImZhaWxlZCB0byBnZXQgcGxhbmUgY29va2llXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCW1mY19kZWJ1ZygyLCAiaW5kZXg6ICVkLCBwbGFuZVslZF0gY29va2llOiAweCUwOHp4IiwKKwkJCQl2Yi0+djRsMl9idWYuaW5kZXgsIGksCisJCQkJdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIodmIsIGkpKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczVwX21mY19xdWV1ZV9zZXR1cChzdHJ1Y3QgdmIyX3F1ZXVlICp2cSwKKwkJICAgICAgIHVuc2lnbmVkIGludCAqYnVmX2NvdW50LCB1bnNpZ25lZCBpbnQgKnBsYW5lX2NvdW50LAorCQkgICAgICAgdW5zaWduZWQgbG9uZyBwc2l6ZVtdLCB2b2lkICphbGxvY2F0b3JzW10pCit7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBmaF90b19jdHgodnEtPmRydl9wcml2KTsKKworCWlmIChjdHgtPnN0YXRlICE9IE1GQ0lOU1RfR09UX0lOU1QpIHsKKwkJbWZjX2VycigiaW5hdmxpZCBzdGF0ZTogJWRcbiIsIGN0eC0+c3RhdGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHZxLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpIHsKKwkJaWYgKGN0eC0+ZHN0X2ZtdCkKKwkJCSpwbGFuZV9jb3VudCA9IGN0eC0+ZHN0X2ZtdC0+bnVtX3BsYW5lczsKKwkJZWxzZQorCQkJKnBsYW5lX2NvdW50ID0gTUZDX0VOQ19DQVBfUExBTkVfQ09VTlQ7CisJCWlmICgqYnVmX2NvdW50IDwgMSkKKwkJCSpidWZfY291bnQgPSAxOworCQlpZiAoKmJ1Zl9jb3VudCA+IE1GQ19NQVhfQlVGRkVSUykKKwkJCSpidWZfY291bnQgPSBNRkNfTUFYX0JVRkZFUlM7CisJCXBzaXplWzBdID0gY3R4LT5lbmNfZHN0X2J1Zl9zaXplOworCQlhbGxvY2F0b3JzWzBdID0gY3R4LT5kZXYtPmFsbG9jX2N0eFtNRkNfQkFOSzFfQUxMT0NfQ1RYXTsKKwl9IGVsc2UgaWYgKHZxLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSkgeworCQlpZiAoY3R4LT5zcmNfZm10KQorCQkJKnBsYW5lX2NvdW50ID0gY3R4LT5zcmNfZm10LT5udW1fcGxhbmVzOworCQllbHNlCisJCQkqcGxhbmVfY291bnQgPSBNRkNfRU5DX09VVF9QTEFORV9DT1VOVDsKKworCQlpZiAoKmJ1Zl9jb3VudCA8IDEpCisJCQkqYnVmX2NvdW50ID0gMTsKKwkJaWYgKCpidWZfY291bnQgPiBNRkNfTUFYX0JVRkZFUlMpCisJCQkqYnVmX2NvdW50ID0gTUZDX01BWF9CVUZGRVJTOworCQlwc2l6ZVswXSA9IGN0eC0+bHVtYV9zaXplOworCQlwc2l6ZVsxXSA9IGN0eC0+Y2hyb21hX3NpemU7CisJCWFsbG9jYXRvcnNbMF0gPSBjdHgtPmRldi0+YWxsb2NfY3R4W01GQ19CQU5LMl9BTExPQ19DVFhdOworCQlhbGxvY2F0b3JzWzFdID0gY3R4LT5kZXYtPmFsbG9jX2N0eFtNRkNfQkFOSzJfQUxMT0NfQ1RYXTsKKwl9IGVsc2UgeworCQltZmNfZXJyKCJpbmF2bGlkIHF1ZXVlIHR5cGU6ICVkXG4iLCB2cS0+dHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgczVwX21mY191bmxvY2soc3RydWN0IHZiMl9xdWV1ZSAqcSkKK3sKKwlzdHJ1Y3QgczVwX21mY19jdHggKmN0eCA9IGZoX3RvX2N0eChxLT5kcnZfcHJpdik7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKworCW11dGV4X3VubG9jaygmZGV2LT5tZmNfbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBzNXBfbWZjX2xvY2soc3RydWN0IHZiMl9xdWV1ZSAqcSkKK3sKKwlzdHJ1Y3QgczVwX21mY19jdHggKmN0eCA9IGZoX3RvX2N0eChxLT5kcnZfcHJpdik7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKworCW11dGV4X2xvY2soJmRldi0+bWZjX211dGV4KTsKK30KKworc3RhdGljIGludCBzNXBfbWZjX2J1Zl9pbml0KHN0cnVjdCB2YjJfYnVmZmVyICp2YikKK3sKKwlzdHJ1Y3QgdmIyX3F1ZXVlICp2cSA9IHZiLT52YjJfcXVldWU7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBmaF90b19jdHgodnEtPmRydl9wcml2KTsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQgcmV0OworCisJaWYgKHZxLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpIHsKKwkJcmV0ID0gY2hlY2tfdmJfd2l0aF9mbXQoY3R4LT5kc3RfZm10LCB2Yik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJaSA9IHZiLT52NGwyX2J1Zi5pbmRleDsKKwkJY3R4LT5kc3RfYnVmc1tpXS5iID0gdmI7CisJCWN0eC0+ZHN0X2J1ZnNbaV0uY29va2llLnN0cmVhbSA9CisJCQkJCXZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKHZiLCAwKTsKKwkJY3R4LT5kc3RfYnVmc19jbnQrKzsKKwl9IGVsc2UgaWYgKHZxLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUX01QTEFORSkgeworCQlyZXQgPSBjaGVja192Yl93aXRoX2ZtdChjdHgtPnNyY19mbXQsIHZiKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlpID0gdmItPnY0bDJfYnVmLmluZGV4OworCQljdHgtPnNyY19idWZzW2ldLmIgPSB2YjsKKwkJY3R4LT5zcmNfYnVmc1tpXS5jb29raWUucmF3Lmx1bWEgPQorCQkJCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcih2YiwgMCk7CisJCWN0eC0+c3JjX2J1ZnNbaV0uY29va2llLnJhdy5jaHJvbWEgPQorCQkJCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcih2YiwgMSk7CisJCWN0eC0+c3JjX2J1ZnNfY250Kys7CisJfSBlbHNlIHsKKwkJbWZjX2VycigiaW5hdmxpZCBxdWV1ZSB0eXBlOiAlZFxuIiwgdnEtPnR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczVwX21mY19idWZfcHJlcGFyZShzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IHZiMl9xdWV1ZSAqdnEgPSB2Yi0+dmIyX3F1ZXVlOworCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHZxLT5kcnZfcHJpdik7CisJaW50IHJldDsKKworCWlmICh2cS0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkVfTVBMQU5FKSB7CisJCXJldCA9IGNoZWNrX3ZiX3dpdGhfZm10KGN0eC0+ZHN0X2ZtdCwgdmIpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCW1mY19kZWJ1ZygyLCAicGxhbmUgc2l6ZTogJWxkLCBkc3Qgc2l6ZTogJWRcbiIsCisJCQl2YjJfcGxhbmVfc2l6ZSh2YiwgMCksIGN0eC0+ZW5jX2RzdF9idWZfc2l6ZSk7CisJCWlmICh2YjJfcGxhbmVfc2l6ZSh2YiwgMCkgPCBjdHgtPmVuY19kc3RfYnVmX3NpemUpIHsKKwkJCW1mY19lcnIoInBsYW5lIHNpemUgaXMgdG9vIHNtYWxsIGZvciBjYXB0dXJlXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfSBlbHNlIGlmICh2cS0+dHlwZSA9PSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkUpIHsKKwkJcmV0ID0gY2hlY2tfdmJfd2l0aF9mbXQoY3R4LT5zcmNfZm10LCB2Yik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJbWZjX2RlYnVnKDIsICJwbGFuZSBzaXplOiAlbGQsIGx1bWEgc2l6ZTogJWRcbiIsCisJCQl2YjJfcGxhbmVfc2l6ZSh2YiwgMCksIGN0eC0+bHVtYV9zaXplKTsKKwkJbWZjX2RlYnVnKDIsICJwbGFuZSBzaXplOiAlbGQsIGNocm9tYSBzaXplOiAlZFxuIiwKKwkJCXZiMl9wbGFuZV9zaXplKHZiLCAxKSwgY3R4LT5jaHJvbWFfc2l6ZSk7CisJCWlmICh2YjJfcGxhbmVfc2l6ZSh2YiwgMCkgPCBjdHgtPmx1bWFfc2l6ZSB8fAorCQkgICAgdmIyX3BsYW5lX3NpemUodmIsIDEpIDwgY3R4LT5jaHJvbWFfc2l6ZSkgeworCQkJbWZjX2VycigicGxhbmUgc2l6ZSBpcyB0b28gc21hbGwgZm9yIG91dHB1dFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSB7CisJCW1mY19lcnIoImluYXZsaWQgcXVldWUgdHlwZTogJWRcbiIsIHZxLT50eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHM1cF9tZmNfc3RhcnRfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnEpCit7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBmaF90b19jdHgocS0+ZHJ2X3ByaXYpOworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXY0bDJfY3RybF9oYW5kbGVyX3NldHVwKCZjdHgtPmN0cmxfaGFuZGxlcik7CisJLyogSWYgY29udGV4dCBpcyByZWFkeSB0aGVuIGRldiA9IHdvcmstPmRhdGE7c2NoZWR1bGUgaXQgdG8gcnVuICovCisJaWYgKHM1cF9tZmNfY3R4X3JlYWR5KGN0eCkpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+Y29uZGxvY2ssIGZsYWdzKTsKKwkJc2V0X2JpdChjdHgtPm51bSwgJmRldi0+Y3R4X3dvcmtfYml0cyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+Y29uZGxvY2ssIGZsYWdzKTsKKwl9CisJczVwX21mY190cnlfcnVuKGRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczVwX21mY19zdG9wX3N0cmVhbWluZyhzdHJ1Y3QgdmIyX3F1ZXVlICpxKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHM1cF9tZmNfY3R4ICpjdHggPSBmaF90b19jdHgocS0+ZHJ2X3ByaXYpOworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisKKwlpZiAoKGN0eC0+c3RhdGUgPT0gTUZDSU5TVF9GSU5JU0hJTkcgfHwKKwkJY3R4LT5zdGF0ZSA9PSBNRkNJTlNUX1JVTk5JTkcpICYmCisJCWRldi0+Y3Vycl9jdHggPT0gY3R4LT5udW0gJiYgZGV2LT5od19sb2NrKSB7CisJCWN0eC0+c3RhdGUgPSBNRkNJTlNUX0FCT1JUOworCQlzNXBfbWZjX3dhaXRfZm9yX2RvbmVfY3R4KGN0eCwgUzVQX0ZJTVZfUjJIX0NNRF9GUkFNRV9ET05FX1JFVCwKKwkJCQkJICAwKTsKKwl9CisJY3R4LT5zdGF0ZSA9IE1GQ0lOU1RfRklOSVNIRUQ7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOworCWlmIChxLT50eXBlID09IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRV9NUExBTkUpIHsKKwkJczVwX21mY19jbGVhbnVwX3F1ZXVlKCZjdHgtPmRzdF9xdWV1ZSwgJmN0eC0+dnFfZHN0KTsKKwkJSU5JVF9MSVNUX0hFQUQoJmN0eC0+ZHN0X3F1ZXVlKTsKKwkJY3R4LT5kc3RfcXVldWVfY250ID0gMDsKKwl9CisJaWYgKHEtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKSB7CisJCWNsZWFudXBfcmVmX3F1ZXVlKGN0eCk7CisJCXM1cF9tZmNfY2xlYW51cF9xdWV1ZSgmY3R4LT5zcmNfcXVldWUsICZjdHgtPnZxX3NyYyk7CisJCUlOSVRfTElTVF9IRUFEKCZjdHgtPnNyY19xdWV1ZSk7CisJCWN0eC0+c3JjX3F1ZXVlX2NudCA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzNXBfbWZjX2J1Zl9xdWV1ZShzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IHZiMl9xdWV1ZSAqdnEgPSB2Yi0+dmIyX3F1ZXVlOworCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4ID0gZmhfdG9fY3R4KHZxLT5kcnZfcHJpdik7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzNXBfbWZjX2J1ZiAqbWZjX2J1ZjsKKworCWlmIChjdHgtPnN0YXRlID09IE1GQ0lOU1RfRVJST1IpIHsKKwkJdmIyX2J1ZmZlcl9kb25lKHZiLCBWQjJfQlVGX1NUQVRFX0VSUk9SKTsKKwkJY2xlYW51cF9yZWZfcXVldWUoY3R4KTsKKwkJcmV0dXJuOworCX0KKwlpZiAodnEtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFX01QTEFORSkgeworCQltZmNfYnVmID0gJmN0eC0+ZHN0X2J1ZnNbdmItPnY0bDJfYnVmLmluZGV4XTsKKwkJbWZjX2J1Zi0+dXNlZCA9IDA7CisJCS8qIE1hcmsgZGVzdGluYXRpb24gYXMgYXZhaWxhYmxlIGZvciB1c2UgYnkgTUZDICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwkJbGlzdF9hZGRfdGFpbCgmbWZjX2J1Zi0+bGlzdCwgJmN0eC0+ZHN0X3F1ZXVlKTsKKwkJY3R4LT5kc3RfcXVldWVfY250Kys7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOworCX0gZWxzZSBpZiAodnEtPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FKSB7CisJCW1mY19idWYgPSAmY3R4LT5zcmNfYnVmc1t2Yi0+djRsMl9idWYuaW5kZXhdOworCQltZmNfYnVmLT51c2VkID0gMDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOworCQlpZiAodmItPnY0bDJfcGxhbmVzWzBdLmJ5dGVzdXNlZCA9PSAwKSB7CisJCQltZmNfZGVidWcoMSwgImNoYW5nZSBzdGF0ZSB0byBGSU5JU0hJTkdcbiIpOworCQkJY3R4LT5zdGF0ZSA9IE1GQ0lOU1RfRklOSVNISU5HOworCQkJdmIyX2J1ZmZlcl9kb25lKHZiLCBWQjJfQlVGX1NUQVRFX0RPTkUpOworCQkJY2xlYW51cF9yZWZfcXVldWUoY3R4KTsKKwkJfSBlbHNlIHsKKwkJCWxpc3RfYWRkX3RhaWwoJm1mY19idWYtPmxpc3QsICZjdHgtPnNyY19xdWV1ZSk7CisJCQljdHgtPnNyY19xdWV1ZV9jbnQrKzsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwl9IGVsc2UgeworCQltZmNfZXJyKCJ1bnN1cHBvcnRlZCBidWZmZXIgdHlwZSAoJWQpXG4iLCB2cS0+dHlwZSk7CisJfQorCWlmIChzNXBfbWZjX2N0eF9yZWFkeShjdHgpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmNvbmRsb2NrLCBmbGFncyk7CisJCXNldF9iaXQoY3R4LT5udW0sICZkZXYtPmN0eF93b3JrX2JpdHMpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmNvbmRsb2NrLCBmbGFncyk7CisJfQorCXM1cF9tZmNfdHJ5X3J1bihkZXYpOworfQorCitzdGF0aWMgc3RydWN0IHZiMl9vcHMgczVwX21mY19lbmNfcW9wcyA9IHsKKwkucXVldWVfc2V0dXAJCT0gczVwX21mY19xdWV1ZV9zZXR1cCwKKwkud2FpdF9wcmVwYXJlCQk9IHM1cF9tZmNfdW5sb2NrLAorCS53YWl0X2ZpbmlzaAkJPSBzNXBfbWZjX2xvY2ssCisJLmJ1Zl9pbml0CQk9IHM1cF9tZmNfYnVmX2luaXQsCisJLmJ1Zl9wcmVwYXJlCQk9IHM1cF9tZmNfYnVmX3ByZXBhcmUsCisJLnN0YXJ0X3N0cmVhbWluZwk9IHM1cF9tZmNfc3RhcnRfc3RyZWFtaW5nLAorCS5zdG9wX3N0cmVhbWluZwkJPSBzNXBfbWZjX3N0b3Bfc3RyZWFtaW5nLAorCS5idWZfcXVldWUJCT0gczVwX21mY19idWZfcXVldWUsCit9OworCitzdHJ1Y3QgczVwX21mY19jb2RlY19vcHMgKmdldF9lbmNfY29kZWNfb3BzKHZvaWQpCit7CisJcmV0dXJuICZlbmNvZGVyX2NvZGVjX29wczsKK30KKworc3RydWN0IHZiMl9vcHMgKmdldF9lbmNfcXVldWVfb3BzKHZvaWQpCit7CisJcmV0dXJuICZzNXBfbWZjX2VuY19xb3BzOworfQorCitjb25zdCBzdHJ1Y3QgdjRsMl9pb2N0bF9vcHMgKmdldF9lbmNfdjRsMl9pb2N0bF9vcHModm9pZCkKK3sKKwlyZXR1cm4gJnM1cF9tZmNfZW5jX2lvY3RsX29wczsKK30KKworI2RlZmluZSBJU19NRkM1MV9QUklWKHgpICgoVjRMMl9DVFJMX0lEMkNMQVNTKHgpID09IFY0TDJfQ1RSTF9DTEFTU19NUEVHKSBcCisJCQkJCQkmJiBWNEwyX0NUUkxfRFJJVkVSX1BSSVYoeCkpCisKK2ludCBzNXBfbWZjX2VuY19jdHJsc19zZXR1cChzdHJ1Y3QgczVwX21mY19jdHggKmN0eCkKK3sKKwlzdHJ1Y3QgdjRsMl9jdHJsX2NvbmZpZyBjZmc7CisJaW50IGk7CisKKwl2NGwyX2N0cmxfaGFuZGxlcl9pbml0KCZjdHgtPmN0cmxfaGFuZGxlciwgTlVNX0NUUkxTKTsKKwlpZiAoY3R4LT5jdHJsX2hhbmRsZXIuZXJyb3IpIHsKKwkJbWZjX2VycigidjRsMl9jdHJsX2hhbmRsZXJfaW5pdCBmYWlsZWRcbiIpOworCQlyZXR1cm4gY3R4LT5jdHJsX2hhbmRsZXIuZXJyb3I7CisJfQorCWZvciAoaSA9IDA7IGkgPCBOVU1fQ1RSTFM7IGkrKykgeworCQlpZiAoSVNfTUZDNTFfUFJJVihjb250cm9sc1tpXS5pZCkpIHsKKwkJCWNmZy5vcHMgPSAmczVwX21mY19lbmNfY3RybF9vcHM7CisJCQljZmcuaWQgPSBjb250cm9sc1tpXS5pZDsKKwkJCWNmZy5taW4gPSBjb250cm9sc1tpXS5taW5pbXVtOworCQkJY2ZnLm1heCA9IGNvbnRyb2xzW2ldLm1heGltdW07CisJCQljZmcuZGVmID0gY29udHJvbHNbaV0uZGVmYXVsdF92YWx1ZTsKKwkJCWNmZy5uYW1lID0gY29udHJvbHNbaV0ubmFtZTsKKwkJCWNmZy50eXBlID0gY29udHJvbHNbaV0udHlwZTsKKwkJCWNmZy5mbGFncyA9IDA7CisKKwkJCWlmIChjZmcudHlwZSA9PSBWNEwyX0NUUkxfVFlQRV9NRU5VKSB7CisJCQkJY2ZnLnN0ZXAgPSAwOworCQkJCWNmZy5tZW51X3NraXBfbWFzayA9IGNmZy5tZW51X3NraXBfbWFzazsKKwkJCQljZmcucW1lbnUgPSBtZmM1MV9nZXRfbWVudShjZmcuaWQpOworCQkJfSBlbHNlIHsKKwkJCQljZmcuc3RlcCA9IGNvbnRyb2xzW2ldLnN0ZXA7CisJCQkJY2ZnLm1lbnVfc2tpcF9tYXNrID0gMDsKKwkJCX0KKwkJCWN0eC0+Y3RybHNbaV0gPSB2NGwyX2N0cmxfbmV3X2N1c3RvbSgmY3R4LT5jdHJsX2hhbmRsZXIsCisJCQkJCSZjZmcsIE5VTEwpOworCQl9IGVsc2UgeworCQkJaWYgKGNvbnRyb2xzW2ldLnR5cGUgPT0gVjRMMl9DVFJMX1RZUEVfTUVOVSkgeworCQkJCWN0eC0+Y3RybHNbaV0gPSB2NGwyX2N0cmxfbmV3X3N0ZF9tZW51KAorCQkJCQkmY3R4LT5jdHJsX2hhbmRsZXIsCisJCQkJCSZzNXBfbWZjX2VuY19jdHJsX29wcywgY29udHJvbHNbaV0uaWQsCisJCQkJCWNvbnRyb2xzW2ldLm1heGltdW0sIDAsCisJCQkJCWNvbnRyb2xzW2ldLmRlZmF1bHRfdmFsdWUpOworCQkJfSBlbHNlIHsKKwkJCQljdHgtPmN0cmxzW2ldID0gdjRsMl9jdHJsX25ld19zdGQoCisJCQkJCSZjdHgtPmN0cmxfaGFuZGxlciwKKwkJCQkJJnM1cF9tZmNfZW5jX2N0cmxfb3BzLCBjb250cm9sc1tpXS5pZCwKKwkJCQkJY29udHJvbHNbaV0ubWluaW11bSwKKwkJCQkJY29udHJvbHNbaV0ubWF4aW11bSwgY29udHJvbHNbaV0uc3RlcCwKKwkJCQkJY29udHJvbHNbaV0uZGVmYXVsdF92YWx1ZSk7CisJCQl9CisJCX0KKwkJaWYgKGN0eC0+Y3RybF9oYW5kbGVyLmVycm9yKSB7CisJCQltZmNfZXJyKCJBZGRpbmcgY29udHJvbCAoJWQpIGZhaWxlZFxuIiwgaSk7CisJCQlyZXR1cm4gY3R4LT5jdHJsX2hhbmRsZXIuZXJyb3I7CisJCX0KKwkJaWYgKGNvbnRyb2xzW2ldLmlzX3ZvbGF0aWxlICYmIGN0eC0+Y3RybHNbaV0pCisJCQljdHgtPmN0cmxzW2ldLT5pc192b2xhdGlsZSA9IDE7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIHM1cF9tZmNfZW5jX2N0cmxzX2RlbGV0ZShzdHJ1Y3QgczVwX21mY19jdHggKmN0eCkKK3sKKwlpbnQgaTsKKworCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJmN0eC0+Y3RybF9oYW5kbGVyKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0NUUkxTOyBpKyspCisJCWN0eC0+Y3RybHNbaV0gPSBOVUxMOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfZW5jLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19lbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDViZGQzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfZW5jLmgKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2VuYy5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgUzVQX01GQ19FTkNfSF8KKyNkZWZpbmUgUzVQX01GQ19FTkNfSF8KKworc3RydWN0IHM1cF9tZmNfY29kZWNfb3BzICpnZXRfZW5jX2NvZGVjX29wcyh2b2lkKTsKK3N0cnVjdCB2YjJfb3BzICpnZXRfZW5jX3F1ZXVlX29wcyh2b2lkKTsKK2NvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyAqZ2V0X2VuY192NGwyX2lvY3RsX29wcyh2b2lkKTsKK3N0cnVjdCBzNXBfbWZjX2ZtdCAqZ2V0X2VuY19kZWZfZm10KGJvb2wgc3JjKTsKK2ludCBzNXBfbWZjX2VuY19jdHJsc19zZXR1cChzdHJ1Y3QgczVwX21mY19jdHggKmN0eCk7Cit2b2lkIHM1cF9tZmNfZW5jX2N0cmxzX2RlbGV0ZShzdHJ1Y3QgczVwX21mY19jdHggKmN0eCk7CisKKyNlbmRpZiAvKiBTNVBfTUZDX0VOQ19IXyAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2ludHIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2ludHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjJmOGJmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfaW50ci5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBkcml2ZXJzL21lZGlhL3ZpZGVvL3NhbXN1bmcvbWZjNS9zNXBfbWZjX2ludHIuYworICoKKyAqIEMgZmlsZSBmb3IgU2Ftc3VuZyBNRkMgKE11bHRpIEZ1bmN0aW9uIENvZGVjIC0gRklNVikgZHJpdmVyCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIHVzZWQgdG8gd2FpdCBmb3IgY29tbWFuZCBjb21wbGV0aW9uLgorICoKKyAqIEthbWlsIERlYnNraSwgQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiBodHRwOi8vd3d3LnNhbXN1bmcuY29tLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorI2luY2x1ZGUgInJlZ3MtbWZjLmgiCisjaW5jbHVkZSAiczVwX21mY19jb21tb24uaCIKKyNpbmNsdWRlICJzNXBfbWZjX2RlYnVnLmgiCisjaW5jbHVkZSAiczVwX21mY19pbnRyLmgiCisKK2ludCBzNXBfbWZjX3dhaXRfZm9yX2RvbmVfZGV2KHN0cnVjdCBzNXBfbWZjX2RldiAqZGV2LCBpbnQgY29tbWFuZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoZGV2LT5xdWV1ZSwKKwkJKGRldi0+aW50X2NvbmQgJiYgKGRldi0+aW50X3R5cGUgPT0gY29tbWFuZAorCQl8fCBkZXYtPmludF90eXBlID09IFM1UF9GSU1WX1IySF9DTURfRVJSX1JFVCkpLAorCQltc2Vjc190b19qaWZmaWVzKE1GQ19JTlRfVElNRU9VVCkpOworCWlmIChyZXQgPT0gMCkgeworCQltZmNfZXJyKCJJbnRlcnJ1cHQgKGRldi0+aW50X3R5cGU6JWQsIGNvbW1hbmQ6JWQpIHRpbWVkIG91dFxuIiwKKwkJCQkJCQlkZXYtPmludF90eXBlLCBjb21tYW5kKTsKKwkJcmV0dXJuIDE7CisJfSBlbHNlIGlmIChyZXQgPT0gLUVSRVNUQVJUU1lTKSB7CisJCW1mY19lcnIoIkludGVycnVwdGVkIGJ5IGEgc2lnbmFsXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCW1mY19kZWJ1ZygxLCAiRmluaXNoZWQgd2FpdGluZyAoZGV2LT5pbnRfdHlwZTolZCwgY29tbWFuZDogJWQpXG4iLAorCQkJCQkJCWRldi0+aW50X3R5cGUsIGNvbW1hbmQpOworCWlmIChkZXYtPmludF90eXBlID09IFM1UF9GSU1WX1IySF9DTURfRVJSX1JFVCkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgczVwX21mY19jbGVhbl9kZXZfaW50X2ZsYWdzKHN0cnVjdCBzNXBfbWZjX2RldiAqZGV2KQoreworCWRldi0+aW50X2NvbmQgPSAwOworCWRldi0+aW50X3R5cGUgPSAwOworCWRldi0+aW50X2VyciA9IDA7Cit9CisKK2ludCBzNXBfbWZjX3dhaXRfZm9yX2RvbmVfY3R4KHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4LAorCQkJCSAgICBpbnQgY29tbWFuZCwgaW50IGludGVycnVwdCkKK3sKKwlpbnQgcmV0OworCisJaWYgKGludGVycnVwdCkgeworCQlyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChjdHgtPnF1ZXVlLAorCQkJCShjdHgtPmludF9jb25kICYmIChjdHgtPmludF90eXBlID09IGNvbW1hbmQKKwkJCXx8IGN0eC0+aW50X3R5cGUgPT0gUzVQX0ZJTVZfUjJIX0NNRF9FUlJfUkVUKSksCisJCQkJCW1zZWNzX3RvX2ppZmZpZXMoTUZDX0lOVF9USU1FT1VUKSk7CisJfSBlbHNlIHsKKwkJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KGN0eC0+cXVldWUsCisJCQkJKGN0eC0+aW50X2NvbmQgJiYgKGN0eC0+aW50X3R5cGUgPT0gY29tbWFuZAorCQkJfHwgY3R4LT5pbnRfdHlwZSA9PSBTNVBfRklNVl9SMkhfQ01EX0VSUl9SRVQpKSwKKwkJCQkJbXNlY3NfdG9famlmZmllcyhNRkNfSU5UX1RJTUVPVVQpKTsKKwl9CisJaWYgKHJldCA9PSAwKSB7CisJCW1mY19lcnIoIkludGVycnVwdCAoY3R4LT5pbnRfdHlwZTolZCwgY29tbWFuZDolZCkgdGltZWQgb3V0XG4iLAorCQkJCQkJCWN0eC0+aW50X3R5cGUsIGNvbW1hbmQpOworCQlyZXR1cm4gMTsKKwl9IGVsc2UgaWYgKHJldCA9PSAtRVJFU1RBUlRTWVMpIHsKKwkJbWZjX2VycigiSW50ZXJydXB0ZWQgYnkgYSBzaWduYWxcbiIpOworCQlyZXR1cm4gMTsKKwl9CisJbWZjX2RlYnVnKDEsICJGaW5pc2hlZCB3YWl0aW5nIChjdHgtPmludF90eXBlOiVkLCBjb21tYW5kOiAlZClcbiIsCisJCQkJCQkJY3R4LT5pbnRfdHlwZSwgY29tbWFuZCk7CisJaWYgKGN0eC0+aW50X3R5cGUgPT0gUzVQX0ZJTVZfUjJIX0NNRF9FUlJfUkVUKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzNXBfbWZjX2NsZWFuX2N0eF9pbnRfZmxhZ3Moc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJY3R4LT5pbnRfY29uZCA9IDA7CisJY3R4LT5pbnRfdHlwZSA9IDA7CisJY3R4LT5pbnRfZXJyID0gMDsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfaW50ci5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfaW50ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMmQ3NzMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19pbnRyLmgKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIGRyaXZlcnMvbWVkaWEvdmlkZW8vc2Ftc3VuZy9tZmM1L3M1cF9tZmNfaW50ci5oCisgKgorICogSGVhZGVyIGZpbGUgZm9yIFNhbXN1bmcgTUZDIChNdWx0aSBGdW5jdGlvbiBDb2RlYyAtIEZJTVYpIGRyaXZlcgorICogSXQgY29udGFpbnMgd2FpdGluZyBmdW5jdGlvbnMgZGVjbGFyYXRpb25zLgorICoKKyAqIEthbWlsIERlYnNraSwgQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqIGh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIFM1UF9NRkNfSU5UUl9IXworI2RlZmluZSBTNVBfTUZDX0lOVFJfSF8KKworI2luY2x1ZGUgInM1cF9tZmNfY29tbW9uLmgiCisKK2ludCBzNXBfbWZjX3dhaXRfZm9yX2RvbmVfY3R4KHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4LAorCQkJICAgICAgaW50IGNvbW1hbmQsIGludCBpbnRlcnJ1cHQpOworaW50IHM1cF9tZmNfd2FpdF9mb3JfZG9uZV9kZXYoc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYsIGludCBjb21tYW5kKTsKK3ZvaWQgczVwX21mY19jbGVhbl9jdHhfaW50X2ZsYWdzKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KTsKK3ZvaWQgczVwX21mY19jbGVhbl9kZXZfaW50X2ZsYWdzKHN0cnVjdCBzNXBfbWZjX2RldiAqZGV2KTsKKworI2VuZGlmIC8qIFM1UF9NRkNfSU5UUl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfb3ByLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19vcHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjIzOTE2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfb3ByLmMKQEAgLTAsMCArMSwxMzk3IEBACisvKgorICogZHJpdmVycy9tZWRpYS92aWRlby9zYW1zdW5nL21mYzUvczVwX21mY19vcHIuYworICoKKyAqIFNhbXN1bmcgTUZDIChNdWx0aSBGdW5jdGlvbiBDb2RlYyAtIEZJTVYpIGRyaXZlcgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGh3IHJlbGF0ZWQgZnVuY3Rpb25zLgorICoKKyAqIEthbWlsIERlYnNraSwgQ29weXJpZ2h0IChjKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqIGh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaW5jbHVkZSAicmVncy1tZmMuaCIKKyNpbmNsdWRlICJzNXBfbWZjX2NtZC5oIgorI2luY2x1ZGUgInM1cF9tZmNfY29tbW9uLmgiCisjaW5jbHVkZSAiczVwX21mY19jdHJsLmgiCisjaW5jbHVkZSAiczVwX21mY19kZWJ1Zy5oIgorI2luY2x1ZGUgInM1cF9tZmNfaW50ci5oIgorI2luY2x1ZGUgInM1cF9tZmNfb3ByLmgiCisjaW5jbHVkZSAiczVwX21mY19wbS5oIgorI2luY2x1ZGUgInM1cF9tZmNfc2htLmgiCisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKKyNkZWZpbmUgT0ZGU0VUQSh4KQkJKCgoeCkgLSBkZXYtPmJhbmsxKSA+PiBNRkNfT0ZGU0VUX1NISUZUKQorI2RlZmluZSBPRkZTRVRCKHgpCQkoKCh4KSAtIGRldi0+YmFuazIpID4+IE1GQ19PRkZTRVRfU0hJRlQpCisKKy8qIEFsbG9jYXRlIHRlbXBvcmFyeSBidWZmZXJzIGZvciBkZWNvZGluZyAqLworaW50IHM1cF9tZmNfYWxsb2NfZGVjX3RlbXBfYnVmZmVycyhzdHJ1Y3QgczVwX21mY19jdHggKmN0eCkKK3sKKwl2b2lkICpkZXNjX3ZpcnQ7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKworCWN0eC0+ZGVzY19idWYgPSB2YjJfZG1hX2NvbnRpZ19tZW1vcHMuYWxsb2MoCisJCQlkZXYtPmFsbG9jX2N0eFtNRkNfQkFOSzFfQUxMT0NfQ1RYXSwgREVTQ19CVUZfU0laRSk7CisJaWYgKElTX0VSUl9WQUxVRSgoaW50KWN0eC0+ZGVzY19idWYpKSB7CisJCWN0eC0+ZGVzY19idWYgPSAwOworCQltZmNfZXJyKCJBbGxvY2F0aW5nIERFU0MgYnVmZmVyIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwljdHgtPmRlc2NfcGh5cyA9IHM1cF9tZmNfbWVtX2Nvb2tpZSgKKwkJCWRldi0+YWxsb2NfY3R4W01GQ19CQU5LMV9BTExPQ19DVFhdLCBjdHgtPmRlc2NfYnVmKTsKKwlCVUdfT04oY3R4LT5kZXNjX3BoeXMgJiAoKDEgPDwgTUZDX0JBTksxX0FMSUdOX09SREVSKSAtIDEpKTsKKwlkZXNjX3ZpcnQgPSB2YjJfZG1hX2NvbnRpZ19tZW1vcHMudmFkZHIoY3R4LT5kZXNjX2J1Zik7CisJaWYgKGRlc2NfdmlydCA9PSBOVUxMKSB7CisJCXZiMl9kbWFfY29udGlnX21lbW9wcy5wdXQoY3R4LT5kZXNjX2J1Zik7CisJCWN0eC0+ZGVzY19waHlzID0gMDsKKwkJY3R4LT5kZXNjX2J1ZiA9IDA7CisJCW1mY19lcnIoIlJlbWFwcGluZyBERVNDIGJ1ZmZlciBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGRlc2NfdmlydCwgMCwgREVTQ19CVUZfU0laRSk7CisJd21iKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFJlbGVhc2UgdGVtcG9yYXJ5IGJ1ZmZlcnMgZm9yIGRlY29kaW5nICovCit2b2lkIHM1cF9tZmNfcmVsZWFzZV9kZWNfZGVzY19idWZmZXIoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJaWYgKGN0eC0+ZGVzY19waHlzKSB7CisJCXZiMl9kbWFfY29udGlnX21lbW9wcy5wdXQoY3R4LT5kZXNjX2J1Zik7CisJCWN0eC0+ZGVzY19waHlzID0gMDsKKwkJY3R4LT5kZXNjX2J1ZiA9IDA7CisJfQorfQorCisvKiBBbGxvY2F0ZSBjb2RlYyBidWZmZXJzICovCitpbnQgczVwX21mY19hbGxvY19jb2RlY19idWZmZXJzKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisJdW5zaWduZWQgaW50IGVuY19yZWZfeV9zaXplID0gMDsKKwl1bnNpZ25lZCBpbnQgZW5jX3JlZl9jX3NpemUgPSAwOworCXVuc2lnbmVkIGludCBndWFyZF93aWR0aCwgZ3VhcmRfaGVpZ2h0OworCisJaWYgKGN0eC0+dHlwZSA9PSBNRkNJTlNUX0RFQ09ERVIpIHsKKwkJbWZjX2RlYnVnKDIsICJMdW1hIHNpemU6JWQgQ2hyb21hIHNpemU6JWQgTVYgc2l6ZTolZFxuIiwKKwkJCSAgY3R4LT5sdW1hX3NpemUsIGN0eC0+Y2hyb21hX3NpemUsIGN0eC0+bXZfc2l6ZSk7CisJCW1mY19kZWJ1ZygyLCAiVG90YWxzIGJ1ZnM6ICVkXG4iLCBjdHgtPnRvdGFsX2RwYl9jb3VudCk7CisJfSBlbHNlIGlmIChjdHgtPnR5cGUgPT0gTUZDSU5TVF9FTkNPREVSKSB7CisJCWVuY19yZWZfeV9zaXplID0gQUxJR04oY3R4LT5pbWdfd2lkdGgsIFM1UF9GSU1WX05WMTJNVF9IQUxJR04pCisJCQkqIEFMSUdOKGN0eC0+aW1nX2hlaWdodCwgUzVQX0ZJTVZfTlYxMk1UX1ZBTElHTik7CisJCWVuY19yZWZfeV9zaXplID0gQUxJR04oZW5jX3JlZl95X3NpemUsIFM1UF9GSU1WX05WMTJNVF9TQUxJR04pOworCisJCWlmIChjdHgtPmNvZGVjX21vZGUgPT0gUzVQX0ZJTVZfQ09ERUNfSDI2NF9FTkMpIHsKKwkJCWVuY19yZWZfY19zaXplID0gQUxJR04oY3R4LT5pbWdfd2lkdGgsCisJCQkJCQlTNVBfRklNVl9OVjEyTVRfSEFMSUdOKQorCQkJCQkJKiBBTElHTihjdHgtPmltZ19oZWlnaHQgPj4gMSwKKwkJCQkJCVM1UF9GSU1WX05WMTJNVF9WQUxJR04pOworCQkJZW5jX3JlZl9jX3NpemUgPSBBTElHTihlbmNfcmVmX2Nfc2l6ZSwKKwkJCQkJCQlTNVBfRklNVl9OVjEyTVRfU0FMSUdOKTsKKwkJfSBlbHNlIHsKKwkJCWd1YXJkX3dpZHRoID0gQUxJR04oY3R4LT5pbWdfd2lkdGggKyAxNiwKKwkJCQkJCQlTNVBfRklNVl9OVjEyTVRfSEFMSUdOKTsKKwkJCWd1YXJkX2hlaWdodCA9IEFMSUdOKChjdHgtPmltZ19oZWlnaHQgPj4gMSkgKyA0LAorCQkJCQkJCVM1UF9GSU1WX05WMTJNVF9WQUxJR04pOworCQkJZW5jX3JlZl9jX3NpemUgPSBBTElHTihndWFyZF93aWR0aCAqIGd1YXJkX2hlaWdodCwKKwkJCQkJICAgICAgIFM1UF9GSU1WX05WMTJNVF9TQUxJR04pOworCQl9CisJCW1mY19kZWJ1ZygyLCAicmVjb24gbHVtYSBzaXplOiAlZCBjaHJvbWEgc2l6ZTogJWRcbiIsCisJCQkgIGVuY19yZWZfeV9zaXplLCBlbmNfcmVmX2Nfc2l6ZSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIENvZGVjcyBoYXZlIGRpZmZlcmVudCBtZW1vcnkgcmVxdWlyZW1lbnRzICovCisJc3dpdGNoIChjdHgtPmNvZGVjX21vZGUpIHsKKwljYXNlIFM1UF9GSU1WX0NPREVDX0gyNjRfREVDOgorCQljdHgtPmJhbmsxX3NpemUgPQorCQkgICAgQUxJR04oUzVQX0ZJTVZfREVDX05CX0lQX1NJWkUgKworCQkJCQlTNVBfRklNVl9ERUNfVkVSVF9OQl9NVl9TSVpFLAorCQkJCQlTNVBfRklNVl9ERUNfQlVGX0FMSUdOKTsKKwkJY3R4LT5iYW5rMl9zaXplID0gY3R4LT50b3RhbF9kcGJfY291bnQgKiBjdHgtPm12X3NpemU7CisJCWJyZWFrOworCWNhc2UgUzVQX0ZJTVZfQ09ERUNfTVBFRzRfREVDOgorCQljdHgtPmJhbmsxX3NpemUgPQorCQkgICAgQUxJR04oUzVQX0ZJTVZfREVDX05CX0RDQUNfU0laRSArCisJCQkJICAgICBTNVBfRklNVl9ERUNfVVBOQl9NVl9TSVpFICsKKwkJCQkgICAgIFM1UF9GSU1WX0RFQ19TVUJfQU5DSE9SX01WX1NJWkUgKworCQkJCSAgICAgUzVQX0ZJTVZfREVDX1NUWF9QQVJTRVJfU0laRSArCisJCQkJICAgICBTNVBfRklNVl9ERUNfT1ZFUkxBUF9UUkFOU0ZPUk1fU0laRSwKKwkJCQkgICAgIFM1UF9GSU1WX0RFQ19CVUZfQUxJR04pOworCQljdHgtPmJhbmsyX3NpemUgPSAwOworCQlicmVhazsKKwljYXNlIFM1UF9GSU1WX0NPREVDX1ZDMVJDVl9ERUM6CisJY2FzZSBTNVBfRklNVl9DT0RFQ19WQzFfREVDOgorCQljdHgtPmJhbmsxX3NpemUgPQorCQkgICAgQUxJR04oUzVQX0ZJTVZfREVDX09WRVJMQVBfVFJBTlNGT1JNX1NJWkUgKworCQkJICAgICBTNVBfRklNVl9ERUNfVVBOQl9NVl9TSVpFICsKKwkJCSAgICAgUzVQX0ZJTVZfREVDX1NVQl9BTkNIT1JfTVZfU0laRSArCisJCQkgICAgIFM1UF9GSU1WX0RFQ19OQl9EQ0FDX1NJWkUgKworCQkJICAgICAzICogUzVQX0ZJTVZfREVDX1ZDMV9CSVRQTEFORV9TSVpFLAorCQkJICAgICBTNVBfRklNVl9ERUNfQlVGX0FMSUdOKTsKKwkJY3R4LT5iYW5rMl9zaXplID0gMDsKKwkJYnJlYWs7CisJY2FzZSBTNVBfRklNVl9DT0RFQ19NUEVHMl9ERUM6CisJCWN0eC0+YmFuazFfc2l6ZSA9IDA7CisJCWN0eC0+YmFuazJfc2l6ZSA9IDA7CisJCWJyZWFrOworCWNhc2UgUzVQX0ZJTVZfQ09ERUNfSDI2M19ERUM6CisJCWN0eC0+YmFuazFfc2l6ZSA9CisJCSAgICBBTElHTihTNVBfRklNVl9ERUNfT1ZFUkxBUF9UUkFOU0ZPUk1fU0laRSArCisJCQkgICAgIFM1UF9GSU1WX0RFQ19VUE5CX01WX1NJWkUgKworCQkJICAgICBTNVBfRklNVl9ERUNfU1VCX0FOQ0hPUl9NVl9TSVpFICsKKwkJCSAgICAgUzVQX0ZJTVZfREVDX05CX0RDQUNfU0laRSwKKwkJCSAgICAgUzVQX0ZJTVZfREVDX0JVRl9BTElHTik7CisJCWN0eC0+YmFuazJfc2l6ZSA9IDA7CisJCWJyZWFrOworCWNhc2UgUzVQX0ZJTVZfQ09ERUNfSDI2NF9FTkM6CisJCWN0eC0+YmFuazFfc2l6ZSA9IChlbmNfcmVmX3lfc2l6ZSAqIDIpICsKKwkJCQkgICBTNVBfRklNVl9FTkNfVVBNVl9TSVpFICsKKwkJCQkgICBTNVBfRklNVl9FTkNfQ09MRkxHX1NJWkUgKworCQkJCSAgIFM1UF9GSU1WX0VOQ19JTlRSQU1EX1NJWkUgKworCQkJCSAgIFM1UF9GSU1WX0VOQ19OQk9SSU5GT19TSVpFOworCQljdHgtPmJhbmsyX3NpemUgPSAoZW5jX3JlZl95X3NpemUgKiAyKSArCisJCQkJICAgKGVuY19yZWZfY19zaXplICogNCkgKworCQkJCSAgIFM1UF9GSU1WX0VOQ19JTlRSQVBSRURfU0laRTsKKwkJYnJlYWs7CisJY2FzZSBTNVBfRklNVl9DT0RFQ19NUEVHNF9FTkM6CisJCWN0eC0+YmFuazFfc2l6ZSA9IChlbmNfcmVmX3lfc2l6ZSAqIDIpICsKKwkJCQkgICBTNVBfRklNVl9FTkNfVVBNVl9TSVpFICsKKwkJCQkgICBTNVBfRklNVl9FTkNfQ09MRkxHX1NJWkUgKworCQkJCSAgIFM1UF9GSU1WX0VOQ19BQ0RDQ09FRl9TSVpFOworCQljdHgtPmJhbmsyX3NpemUgPSAoZW5jX3JlZl95X3NpemUgKiAyKSArCisJCQkJICAgKGVuY19yZWZfY19zaXplICogNCk7CisJCWJyZWFrOworCWNhc2UgUzVQX0ZJTVZfQ09ERUNfSDI2M19FTkM6CisJCWN0eC0+YmFuazFfc2l6ZSA9IChlbmNfcmVmX3lfc2l6ZSAqIDIpICsKKwkJCQkgICBTNVBfRklNVl9FTkNfVVBNVl9TSVpFICsKKwkJCQkgICBTNVBfRklNVl9FTkNfQUNEQ0NPRUZfU0laRTsKKwkJY3R4LT5iYW5rMl9zaXplID0gKGVuY19yZWZfeV9zaXplICogMikgKworCQkJCSAgIChlbmNfcmVmX2Nfc2l6ZSAqIDQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJLyogQWxsb2NhdGUgb25seSBpZiBtZW1vcnkgZnJvbSBiYW5rIDEgaXMgbmVjZXNzYXJ5ICovCisJaWYgKGN0eC0+YmFuazFfc2l6ZSA+IDApIHsKKwkJY3R4LT5iYW5rMV9idWYgPSB2YjJfZG1hX2NvbnRpZ19tZW1vcHMuYWxsb2MoCisJCWRldi0+YWxsb2NfY3R4W01GQ19CQU5LMV9BTExPQ19DVFhdLCBjdHgtPmJhbmsxX3NpemUpOworCQlpZiAoSVNfRVJSKGN0eC0+YmFuazFfYnVmKSkgeworCQkJY3R4LT5iYW5rMV9idWYgPSAwOworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAgICAgIkJ1ZiBhbGxvYyBmb3IgZGVjb2RpbmcgZmFpbGVkIChwb3J0IEEpXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWN0eC0+YmFuazFfcGh5cyA9IHM1cF9tZmNfbWVtX2Nvb2tpZSgKKwkJZGV2LT5hbGxvY19jdHhbTUZDX0JBTksxX0FMTE9DX0NUWF0sIGN0eC0+YmFuazFfYnVmKTsKKwkJQlVHX09OKGN0eC0+YmFuazFfcGh5cyAmICgoMSA8PCBNRkNfQkFOSzFfQUxJR05fT1JERVIpIC0gMSkpOworCX0KKwkvKiBBbGxvY2F0ZSBvbmx5IGlmIG1lbW9yeSBmcm9tIGJhbmsgMiBpcyBuZWNlc3NhcnkgKi8KKwlpZiAoY3R4LT5iYW5rMl9zaXplID4gMCkgeworCQljdHgtPmJhbmsyX2J1ZiA9IHZiMl9kbWFfY29udGlnX21lbW9wcy5hbGxvYygKKwkJZGV2LT5hbGxvY19jdHhbTUZDX0JBTksyX0FMTE9DX0NUWF0sIGN0eC0+YmFuazJfc2l6ZSk7CisJCWlmIChJU19FUlIoY3R4LT5iYW5rMl9idWYpKSB7CisJCQljdHgtPmJhbmsyX2J1ZiA9IDA7CisJCQltZmNfZXJyKCJCdWYgYWxsb2MgZm9yIGRlY29kaW5nIGZhaWxlZCAocG9ydCBCKVxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQljdHgtPmJhbmsyX3BoeXMgPSBzNXBfbWZjX21lbV9jb29raWUoCisJCWRldi0+YWxsb2NfY3R4W01GQ19CQU5LMl9BTExPQ19DVFhdLCBjdHgtPmJhbmsyX2J1Zik7CisJCUJVR19PTihjdHgtPmJhbmsyX3BoeXMgJiAoKDEgPDwgTUZDX0JBTksyX0FMSUdOX09SREVSKSAtIDEpKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFJlbGVhc2UgYnVmZmVycyBhbGxvY2F0ZWQgZm9yIGNvZGVjICovCit2b2lkIHM1cF9tZmNfcmVsZWFzZV9jb2RlY19idWZmZXJzKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KQoreworCWlmIChjdHgtPmJhbmsxX2J1ZikgeworCQl2YjJfZG1hX2NvbnRpZ19tZW1vcHMucHV0KGN0eC0+YmFuazFfYnVmKTsKKwkJY3R4LT5iYW5rMV9idWYgPSAwOworCQljdHgtPmJhbmsxX3BoeXMgPSAwOworCQljdHgtPmJhbmsxX3NpemUgPSAwOworCX0KKwlpZiAoY3R4LT5iYW5rMl9idWYpIHsKKwkJdmIyX2RtYV9jb250aWdfbWVtb3BzLnB1dChjdHgtPmJhbmsyX2J1Zik7CisJCWN0eC0+YmFuazJfYnVmID0gMDsKKwkJY3R4LT5iYW5rMl9waHlzID0gMDsKKwkJY3R4LT5iYW5rMl9zaXplID0gMDsKKwl9Cit9CisKKy8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgaW5zdGFuY2UgZGF0YSBidWZmZXIgKi8KK2ludCBzNXBfbWZjX2FsbG9jX2luc3RhbmNlX2J1ZmZlcihzdHJ1Y3QgczVwX21mY19jdHggKmN0eCkKK3sKKwl2b2lkICpjb250ZXh0X3ZpcnQ7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKworCWlmIChjdHgtPmNvZGVjX21vZGUgPT0gUzVQX0ZJTVZfQ09ERUNfSDI2NF9ERUMgfHwKKwkJY3R4LT5jb2RlY19tb2RlID09IFM1UF9GSU1WX0NPREVDX0gyNjRfRU5DKQorCQljdHgtPmN0eF9zaXplID0gTUZDX0gyNjRfQ1RYX0JVRl9TSVpFOworCWVsc2UKKwkJY3R4LT5jdHhfc2l6ZSA9IE1GQ19DVFhfQlVGX1NJWkU7CisJY3R4LT5jdHhfYnVmID0gdmIyX2RtYV9jb250aWdfbWVtb3BzLmFsbG9jKAorCQlkZXYtPmFsbG9jX2N0eFtNRkNfQkFOSzFfQUxMT0NfQ1RYXSwgY3R4LT5jdHhfc2l6ZSk7CisJaWYgKElTX0VSUihjdHgtPmN0eF9idWYpKSB7CisJCW1mY19lcnIoIkFsbG9jYXRpbmcgY29udGV4dCBidWZmZXIgZmFpbGVkXG4iKTsKKwkJY3R4LT5jdHhfcGh5cyA9IDA7CisJCWN0eC0+Y3R4X2J1ZiA9IDA7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwljdHgtPmN0eF9waHlzID0gczVwX21mY19tZW1fY29va2llKAorCQlkZXYtPmFsbG9jX2N0eFtNRkNfQkFOSzFfQUxMT0NfQ1RYXSwgY3R4LT5jdHhfYnVmKTsKKwlCVUdfT04oY3R4LT5jdHhfcGh5cyAmICgoMSA8PCBNRkNfQkFOSzFfQUxJR05fT1JERVIpIC0gMSkpOworCWN0eC0+Y3R4X29mcyA9IE9GRlNFVEEoY3R4LT5jdHhfcGh5cyk7CisJY29udGV4dF92aXJ0ID0gdmIyX2RtYV9jb250aWdfbWVtb3BzLnZhZGRyKGN0eC0+Y3R4X2J1Zik7CisJaWYgKGNvbnRleHRfdmlydCA9PSBOVUxMKSB7CisJCW1mY19lcnIoIlJlbWFwcGluZyBpbnN0YW5jZSBidWZmZXIgZmFpbGVkXG4iKTsKKwkJdmIyX2RtYV9jb250aWdfbWVtb3BzLnB1dChjdHgtPmN0eF9idWYpOworCQljdHgtPmN0eF9waHlzID0gMDsKKwkJY3R4LT5jdHhfYnVmID0gMDsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCS8qIFplcm8gY29udGVudCBvZiB0aGUgYWxsb2NhdGVkIG1lbW9yeSAqLworCW1lbXNldChjb250ZXh0X3ZpcnQsIDAsIGN0eC0+Y3R4X3NpemUpOworCXdtYigpOworCWlmIChzNXBfbWZjX2luaXRfc2htKGN0eCkgPCAwKSB7CisJCXZiMl9kbWFfY29udGlnX21lbW9wcy5wdXQoY3R4LT5jdHhfYnVmKTsKKwkJY3R4LT5jdHhfcGh5cyA9IDA7CisJCWN0eC0+Y3R4X2J1ZiA9IDA7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogUmVsZWFzZSBpbnN0YW5jZSBidWZmZXIgKi8KK3ZvaWQgczVwX21mY19yZWxlYXNlX2luc3RhbmNlX2J1ZmZlcihzdHJ1Y3QgczVwX21mY19jdHggKmN0eCkKK3sKKwlpZiAoY3R4LT5jdHhfYnVmKSB7CisJCXZiMl9kbWFfY29udGlnX21lbW9wcy5wdXQoY3R4LT5jdHhfYnVmKTsKKwkJY3R4LT5jdHhfcGh5cyA9IDA7CisJCWN0eC0+Y3R4X2J1ZiA9IDA7CisJfQorCWlmIChjdHgtPnNobV9hbGxvYykgeworCQl2YjJfZG1hX2NvbnRpZ19tZW1vcHMucHV0KGN0eC0+c2htX2FsbG9jKTsKKwkJY3R4LT5zaG1fYWxsb2MgPSAwOworCQljdHgtPnNobSA9IDA7CisJfQorfQorCisvKiBTZXQgcmVnaXN0ZXJzIGZvciBkZWNvZGluZyB0ZW1wb3JhcnkgYnVmZmVycyAqLwordm9pZCBzNXBfbWZjX3NldF9kZWNfZGVzY19idWZmZXIoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKworCW1mY193cml0ZShkZXYsIE9GRlNFVEEoY3R4LT5kZXNjX3BoeXMpLCBTNVBfRklNVl9TSV9DSDBfREVTQ19BRFIpOworCW1mY193cml0ZShkZXYsIERFU0NfQlVGX1NJWkUsIFM1UF9GSU1WX1NJX0NIMF9ERVNDX1NJWkUpOworfQorCisvKiBTZXQgcmVnaXN0ZXJzIGZvciBzaGFyZWQgYnVmZmVyICovCit2b2lkIHM1cF9tZmNfc2V0X3NoYXJlZF9idWZmZXIoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKwltZmNfd3JpdGUoZGV2LCBjdHgtPnNobV9vZnMsIFM1UF9GSU1WX1NJX0NIMF9IT1NUX1dSX0FEUik7Cit9CisKKy8qIFNldCByZWdpc3RlcnMgZm9yIGRlY29kaW5nIHN0cmVhbSBidWZmZXIgKi8KK2ludCBzNXBfbWZjX3NldF9kZWNfc3RyZWFtX2J1ZmZlcihzdHJ1Y3QgczVwX21mY19jdHggKmN0eCwgaW50IGJ1Zl9hZGRyLAorCQkgIHVuc2lnbmVkIGludCBzdGFydF9udW1fYnl0ZSwgdW5zaWduZWQgaW50IGJ1Zl9zaXplKQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisKKwltZmNfd3JpdGUoZGV2LCBPRkZTRVRBKGJ1Zl9hZGRyKSwgUzVQX0ZJTVZfU0lfQ0gwX1NCX1NUX0FEUik7CisJbWZjX3dyaXRlKGRldiwgY3R4LT5kZWNfc3JjX2J1Zl9zaXplLCBTNVBfRklNVl9TSV9DSDBfQ1BCX1NJWkUpOworCW1mY193cml0ZShkZXYsIGJ1Zl9zaXplLCBTNVBfRklNVl9TSV9DSDBfU0JfRlJNX1NJWkUpOworCXM1cF9tZmNfd3JpdGVfc2htKGN0eCwgc3RhcnRfbnVtX2J5dGUsIFNUQVJUX0JZVEVfTlVNKTsKKwlyZXR1cm4gMDsKK30KKworLyogU2V0IGRlY29kaW5nIGZyYW1lIGJ1ZmZlciAqLworaW50IHM1cF9tZmNfc2V0X2RlY19mcmFtZV9idWZmZXIoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJdW5zaWduZWQgaW50IGZyYW1lX3NpemUsIGk7CisJdW5zaWduZWQgaW50IGZyYW1lX3NpemVfY2gsIGZyYW1lX3NpemVfbXY7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKwl1bnNpZ25lZCBpbnQgZHBiOworCXNpemVfdCBidWZfYWRkcjEsIGJ1Zl9hZGRyMjsKKwlpbnQgYnVmX3NpemUxLCBidWZfc2l6ZTI7CisKKwlidWZfYWRkcjEgPSBjdHgtPmJhbmsxX3BoeXM7CisJYnVmX3NpemUxID0gY3R4LT5iYW5rMV9zaXplOworCWJ1Zl9hZGRyMiA9IGN0eC0+YmFuazJfcGh5czsKKwlidWZfc2l6ZTIgPSBjdHgtPmJhbmsyX3NpemU7CisJZHBiID0gbWZjX3JlYWQoZGV2LCBTNVBfRklNVl9TSV9DSDBfRFBCX0NPTkZfQ1RSTCkgJgorCQkJCQkJflM1UF9GSU1WX0RQQl9DT1VOVF9NQVNLOworCW1mY193cml0ZShkZXYsIGN0eC0+dG90YWxfZHBiX2NvdW50IHwgZHBiLAorCQkJCQkJUzVQX0ZJTVZfU0lfQ0gwX0RQQl9DT05GX0NUUkwpOworCXM1cF9tZmNfc2V0X3NoYXJlZF9idWZmZXIoY3R4KTsKKwlzd2l0Y2ggKGN0eC0+Y29kZWNfbW9kZSkgeworCWNhc2UgUzVQX0ZJTVZfQ09ERUNfSDI2NF9ERUM6CisJCW1mY193cml0ZShkZXYsIE9GRlNFVEEoYnVmX2FkZHIxKSwKKwkJCQkJCVM1UF9GSU1WX0gyNjRfVkVSVF9OQl9NVl9BRFIpOworCQlidWZfYWRkcjEgKz0gUzVQX0ZJTVZfREVDX1ZFUlRfTkJfTVZfU0laRTsKKwkJYnVmX3NpemUxIC09IFM1UF9GSU1WX0RFQ19WRVJUX05CX01WX1NJWkU7CisJCW1mY193cml0ZShkZXYsIE9GRlNFVEEoYnVmX2FkZHIxKSwgUzVQX0ZJTVZfSDI2NF9OQl9JUF9BRFIpOworCQlidWZfYWRkcjEgKz0gUzVQX0ZJTVZfREVDX05CX0lQX1NJWkU7CisJCWJ1Zl9zaXplMSAtPSBTNVBfRklNVl9ERUNfTkJfSVBfU0laRTsKKwkJYnJlYWs7CisJY2FzZSBTNVBfRklNVl9DT0RFQ19NUEVHNF9ERUM6CisJCW1mY193cml0ZShkZXYsIE9GRlNFVEEoYnVmX2FkZHIxKSwgUzVQX0ZJTVZfTVBFRzRfTkJfRENBQ19BRFIpOworCQlidWZfYWRkcjEgKz0gUzVQX0ZJTVZfREVDX05CX0RDQUNfU0laRTsKKwkJYnVmX3NpemUxIC09IFM1UF9GSU1WX0RFQ19OQl9EQ0FDX1NJWkU7CisJCW1mY193cml0ZShkZXYsIE9GRlNFVEEoYnVmX2FkZHIxKSwgUzVQX0ZJTVZfTVBFRzRfVVBfTkJfTVZfQURSKTsKKwkJYnVmX2FkZHIxICs9IFM1UF9GSU1WX0RFQ19VUE5CX01WX1NJWkU7CisJCWJ1Zl9zaXplMSAtPSBTNVBfRklNVl9ERUNfVVBOQl9NVl9TSVpFOworCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRBKGJ1Zl9hZGRyMSksIFM1UF9GSU1WX01QRUc0X1NBX01WX0FEUik7CisJCWJ1Zl9hZGRyMSArPSBTNVBfRklNVl9ERUNfU1VCX0FOQ0hPUl9NVl9TSVpFOworCQlidWZfc2l6ZTEgLT0gUzVQX0ZJTVZfREVDX1NVQl9BTkNIT1JfTVZfU0laRTsKKwkJbWZjX3dyaXRlKGRldiwgT0ZGU0VUQShidWZfYWRkcjEpLCBTNVBfRklNVl9NUEVHNF9TUF9BRFIpOworCQlidWZfYWRkcjEgKz0gUzVQX0ZJTVZfREVDX1NUWF9QQVJTRVJfU0laRTsKKwkJYnVmX3NpemUxIC09IFM1UF9GSU1WX0RFQ19TVFhfUEFSU0VSX1NJWkU7CisJCW1mY193cml0ZShkZXYsIE9GRlNFVEEoYnVmX2FkZHIxKSwgUzVQX0ZJTVZfTVBFRzRfT1RfTElORV9BRFIpOworCQlidWZfYWRkcjEgKz0gUzVQX0ZJTVZfREVDX09WRVJMQVBfVFJBTlNGT1JNX1NJWkU7CisJCWJ1Zl9zaXplMSAtPSBTNVBfRklNVl9ERUNfT1ZFUkxBUF9UUkFOU0ZPUk1fU0laRTsKKwkJYnJlYWs7CisJY2FzZSBTNVBfRklNVl9DT0RFQ19IMjYzX0RFQzoKKwkJbWZjX3dyaXRlKGRldiwgT0ZGU0VUQShidWZfYWRkcjEpLCBTNVBfRklNVl9IMjYzX09UX0xJTkVfQURSKTsKKwkJYnVmX2FkZHIxICs9IFM1UF9GSU1WX0RFQ19PVkVSTEFQX1RSQU5TRk9STV9TSVpFOworCQlidWZfc2l6ZTEgLT0gUzVQX0ZJTVZfREVDX09WRVJMQVBfVFJBTlNGT1JNX1NJWkU7CisJCW1mY193cml0ZShkZXYsIE9GRlNFVEEoYnVmX2FkZHIxKSwgUzVQX0ZJTVZfSDI2M19VUF9OQl9NVl9BRFIpOworCQlidWZfYWRkcjEgKz0gUzVQX0ZJTVZfREVDX1VQTkJfTVZfU0laRTsKKwkJYnVmX3NpemUxIC09IFM1UF9GSU1WX0RFQ19VUE5CX01WX1NJWkU7CisJCW1mY193cml0ZShkZXYsIE9GRlNFVEEoYnVmX2FkZHIxKSwgUzVQX0ZJTVZfSDI2M19TQV9NVl9BRFIpOworCQlidWZfYWRkcjEgKz0gUzVQX0ZJTVZfREVDX1NVQl9BTkNIT1JfTVZfU0laRTsKKwkJYnVmX3NpemUxIC09IFM1UF9GSU1WX0RFQ19TVUJfQU5DSE9SX01WX1NJWkU7CisJCW1mY193cml0ZShkZXYsIE9GRlNFVEEoYnVmX2FkZHIxKSwgUzVQX0ZJTVZfSDI2M19OQl9EQ0FDX0FEUik7CisJCWJ1Zl9hZGRyMSArPSBTNVBfRklNVl9ERUNfTkJfRENBQ19TSVpFOworCQlidWZfc2l6ZTEgLT0gUzVQX0ZJTVZfREVDX05CX0RDQUNfU0laRTsKKwkJYnJlYWs7CisJY2FzZSBTNVBfRklNVl9DT0RFQ19WQzFfREVDOgorCWNhc2UgUzVQX0ZJTVZfQ09ERUNfVkMxUkNWX0RFQzoKKwkJbWZjX3dyaXRlKGRldiwgT0ZGU0VUQShidWZfYWRkcjEpLCBTNVBfRklNVl9WQzFfTkJfRENBQ19BRFIpOworCQlidWZfYWRkcjEgKz0gUzVQX0ZJTVZfREVDX05CX0RDQUNfU0laRTsKKwkJYnVmX3NpemUxIC09IFM1UF9GSU1WX0RFQ19OQl9EQ0FDX1NJWkU7CisJCW1mY193cml0ZShkZXYsIE9GRlNFVEEoYnVmX2FkZHIxKSwgUzVQX0ZJTVZfVkMxX09UX0xJTkVfQURSKTsKKwkJYnVmX2FkZHIxICs9IFM1UF9GSU1WX0RFQ19PVkVSTEFQX1RSQU5TRk9STV9TSVpFOworCQlidWZfc2l6ZTEgLT0gUzVQX0ZJTVZfREVDX09WRVJMQVBfVFJBTlNGT1JNX1NJWkU7CisJCW1mY193cml0ZShkZXYsIE9GRlNFVEEoYnVmX2FkZHIxKSwgUzVQX0ZJTVZfVkMxX1VQX05CX01WX0FEUik7CisJCWJ1Zl9hZGRyMSArPSBTNVBfRklNVl9ERUNfVVBOQl9NVl9TSVpFOworCQlidWZfc2l6ZTEgLT0gUzVQX0ZJTVZfREVDX1VQTkJfTVZfU0laRTsKKwkJbWZjX3dyaXRlKGRldiwgT0ZGU0VUQShidWZfYWRkcjEpLCBTNVBfRklNVl9WQzFfU0FfTVZfQURSKTsKKwkJYnVmX2FkZHIxICs9IFM1UF9GSU1WX0RFQ19TVUJfQU5DSE9SX01WX1NJWkU7CisJCWJ1Zl9zaXplMSAtPSBTNVBfRklNVl9ERUNfU1VCX0FOQ0hPUl9NVl9TSVpFOworCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRBKGJ1Zl9hZGRyMSksIFM1UF9GSU1WX1ZDMV9CSVRQTEFORTNfQURSKTsKKwkJYnVmX2FkZHIxICs9IFM1UF9GSU1WX0RFQ19WQzFfQklUUExBTkVfU0laRTsKKwkJYnVmX3NpemUxIC09IFM1UF9GSU1WX0RFQ19WQzFfQklUUExBTkVfU0laRTsKKwkJbWZjX3dyaXRlKGRldiwgT0ZGU0VUQShidWZfYWRkcjEpLCBTNVBfRklNVl9WQzFfQklUUExBTkUyX0FEUik7CisJCWJ1Zl9hZGRyMSArPSBTNVBfRklNVl9ERUNfVkMxX0JJVFBMQU5FX1NJWkU7CisJCWJ1Zl9zaXplMSAtPSBTNVBfRklNVl9ERUNfVkMxX0JJVFBMQU5FX1NJWkU7CisJCW1mY193cml0ZShkZXYsIE9GRlNFVEEoYnVmX2FkZHIxKSwgUzVQX0ZJTVZfVkMxX0JJVFBMQU5FMV9BRFIpOworCQlidWZfYWRkcjEgKz0gUzVQX0ZJTVZfREVDX1ZDMV9CSVRQTEFORV9TSVpFOworCQlidWZfc2l6ZTEgLT0gUzVQX0ZJTVZfREVDX1ZDMV9CSVRQTEFORV9TSVpFOworCQlicmVhazsKKwljYXNlIFM1UF9GSU1WX0NPREVDX01QRUcyX0RFQzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbWZjX2VycigiVW5rbm93biBjb2RlYyBmb3IgZGVjb2RpbmcgKCV4KVxuIiwKKwkJCWN0eC0+Y29kZWNfbW9kZSk7CisJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwl9CisJZnJhbWVfc2l6ZSA9IGN0eC0+bHVtYV9zaXplOworCWZyYW1lX3NpemVfY2ggPSBjdHgtPmNocm9tYV9zaXplOworCWZyYW1lX3NpemVfbXYgPSBjdHgtPm12X3NpemU7CisJbWZjX2RlYnVnKDIsICJGcm0gc2l6ZTogJWQgY2g6ICVkIG12OiAlZFxuIiwgZnJhbWVfc2l6ZSwgZnJhbWVfc2l6ZV9jaCwKKwkJCQkJCQkJZnJhbWVfc2l6ZV9tdik7CisJZm9yIChpID0gMDsgaSA8IGN0eC0+dG90YWxfZHBiX2NvdW50OyBpKyspIHsKKwkJLyogQmFuazIgKi8KKwkJbWZjX2RlYnVnKDIsICJMdW1hICVkOiAleFxuIiwgaSwKKwkJCQkJY3R4LT5kc3RfYnVmc1tpXS5jb29raWUucmF3Lmx1bWEpOworCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRCKGN0eC0+ZHN0X2J1ZnNbaV0uY29va2llLnJhdy5sdW1hKSwKKwkJCQkJCVM1UF9GSU1WX0RFQ19MVU1BX0FEUiArIGkgKiA0KTsKKwkJbWZjX2RlYnVnKDIsICJcdENocm9tYSAlZDogJXhcbiIsIGksCisJCQkJCWN0eC0+ZHN0X2J1ZnNbaV0uY29va2llLnJhdy5jaHJvbWEpOworCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRBKGN0eC0+ZHN0X2J1ZnNbaV0uY29va2llLnJhdy5jaHJvbWEpLAorCQkJCQkgICAgICAgUzVQX0ZJTVZfREVDX0NIUk9NQV9BRFIgKyBpICogNCk7CisJCWlmIChjdHgtPmNvZGVjX21vZGUgPT0gUzVQX0ZJTVZfQ09ERUNfSDI2NF9ERUMpIHsKKwkJCW1mY19kZWJ1ZygyLCAiXHRCdWYyOiAleCwgc2l6ZTogJWRcbiIsCisJCQkJCQkJYnVmX2FkZHIyLCBidWZfc2l6ZTIpOworCQkJbWZjX3dyaXRlKGRldiwgT0ZGU0VUQihidWZfYWRkcjIpLAorCQkJCQkJUzVQX0ZJTVZfSDI2NF9NVl9BRFIgKyBpICogNCk7CisJCQlidWZfYWRkcjIgKz0gZnJhbWVfc2l6ZV9tdjsKKwkJCWJ1Zl9zaXplMiAtPSBmcmFtZV9zaXplX212OworCQl9CisJfQorCW1mY19kZWJ1ZygyLCAiQnVmMTogJXUsIGJ1Zl9zaXplMTogJWRcbiIsIGJ1Zl9hZGRyMSwgYnVmX3NpemUxKTsKKwltZmNfZGVidWcoMiwgIkJ1ZiAxLzIgc2l6ZSBhZnRlcjogJWQvJWQgKGZyYW1lcyAlZClcbiIsCisJCQlidWZfc2l6ZTEsICBidWZfc2l6ZTIsIGN0eC0+dG90YWxfZHBiX2NvdW50KTsKKwlpZiAoYnVmX3NpemUxIDwgMCB8fCBidWZfc2l6ZTIgPCAwKSB7CisJCW1mY19kZWJ1ZygyLCAiTm90IGVub3VnaCBtZW1vcnkgaGFzIGJlZW4gYWxsb2NhdGVkXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXM1cF9tZmNfd3JpdGVfc2htKGN0eCwgZnJhbWVfc2l6ZSwgQUxMT0NfTFVNQV9EUEJfU0laRSk7CisJczVwX21mY193cml0ZV9zaG0oY3R4LCBmcmFtZV9zaXplX2NoLCBBTExPQ19DSFJPTUFfRFBCX1NJWkUpOworCWlmIChjdHgtPmNvZGVjX21vZGUgPT0gUzVQX0ZJTVZfQ09ERUNfSDI2NF9ERUMpCisJCXM1cF9tZmNfd3JpdGVfc2htKGN0eCwgZnJhbWVfc2l6ZV9tdiwgQUxMT0NfTVZfU0laRSk7CisJbWZjX3dyaXRlKGRldiwgKChTNVBfRklNVl9DSF9JTklUX0JVRlMgJiBTNVBfRklNVl9DSF9NQVNLKQorCQkJCQk8PCBTNVBfRklNVl9DSF9TSElGVCkgfCAoY3R4LT5pbnN0X25vKSwKKwkJCQkJCVM1UF9GSU1WX1NJX0NIMF9JTlNUX0lEKTsKKwlyZXR1cm4gMDsKK30KKworLyogU2V0IHJlZ2lzdGVycyBmb3IgZW5jb2Rpbmcgc3RyZWFtIGJ1ZmZlciAqLworaW50IHM1cF9tZmNfc2V0X2VuY19zdHJlYW1fYnVmZmVyKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4LAorCQl1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGludCBzaXplKQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisKKwltZmNfd3JpdGUoZGV2LCBPRkZTRVRBKGFkZHIpLCBTNVBfRklNVl9FTkNfU0lfQ0gwX1NCX0FEUik7CisJbWZjX3dyaXRlKGRldiwgc2l6ZSwgUzVQX0ZJTVZfRU5DX1NJX0NIMF9TQl9TSVpFKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzNXBfbWZjX3NldF9lbmNfZnJhbWVfYnVmZmVyKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4LAorCQl1bnNpZ25lZCBsb25nIHlfYWRkciwgdW5zaWduZWQgbG9uZyBjX2FkZHIpCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKworCW1mY193cml0ZShkZXYsIE9GRlNFVEIoeV9hZGRyKSwgUzVQX0ZJTVZfRU5DX1NJX0NIMF9DVVJfWV9BRFIpOworCW1mY193cml0ZShkZXYsIE9GRlNFVEIoY19hZGRyKSwgUzVQX0ZJTVZfRU5DX1NJX0NIMF9DVVJfQ19BRFIpOworfQorCit2b2lkIHM1cF9tZmNfZ2V0X2VuY19mcmFtZV9idWZmZXIoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgsCisJCXVuc2lnbmVkIGxvbmcgKnlfYWRkciwgdW5zaWduZWQgbG9uZyAqY19hZGRyKQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisKKwkqeV9hZGRyID0gZGV2LT5iYW5rMiArIChtZmNfcmVhZChkZXYsIFM1UF9GSU1WX0VOQ09ERURfWV9BRERSKQorCQkJCQkJCTw8IE1GQ19PRkZTRVRfU0hJRlQpOworCSpjX2FkZHIgPSBkZXYtPmJhbmsyICsgKG1mY19yZWFkKGRldiwgUzVQX0ZJTVZfRU5DT0RFRF9DX0FERFIpCisJCQkJCQkJPDwgTUZDX09GRlNFVF9TSElGVCk7Cit9CisKKy8qIFNldCBlbmNvZGluZyByZWYgJiBjb2RlYyBidWZmZXIgKi8KK2ludCBzNXBfbWZjX3NldF9lbmNfcmVmX2J1ZmZlcihzdHJ1Y3QgczVwX21mY19jdHggKmN0eCkKK3sKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IGN0eC0+ZGV2OworCXNpemVfdCBidWZfYWRkcjEsIGJ1Zl9hZGRyMjsKKwlzaXplX3QgYnVmX3NpemUxLCBidWZfc2l6ZTI7CisJdW5zaWduZWQgaW50IGVuY19yZWZfeV9zaXplLCBlbmNfcmVmX2Nfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgZ3VhcmRfd2lkdGgsIGd1YXJkX2hlaWdodDsKKwlpbnQgaTsKKworCWJ1Zl9hZGRyMSA9IGN0eC0+YmFuazFfcGh5czsKKwlidWZfc2l6ZTEgPSBjdHgtPmJhbmsxX3NpemU7CisJYnVmX2FkZHIyID0gY3R4LT5iYW5rMl9waHlzOworCWJ1Zl9zaXplMiA9IGN0eC0+YmFuazJfc2l6ZTsKKwllbmNfcmVmX3lfc2l6ZSA9IEFMSUdOKGN0eC0+aW1nX3dpZHRoLCBTNVBfRklNVl9OVjEyTVRfSEFMSUdOKQorCQkqIEFMSUdOKGN0eC0+aW1nX2hlaWdodCwgUzVQX0ZJTVZfTlYxMk1UX1ZBTElHTik7CisJZW5jX3JlZl95X3NpemUgPSBBTElHTihlbmNfcmVmX3lfc2l6ZSwgUzVQX0ZJTVZfTlYxMk1UX1NBTElHTik7CisJaWYgKGN0eC0+Y29kZWNfbW9kZSA9PSBTNVBfRklNVl9DT0RFQ19IMjY0X0VOQykgeworCQllbmNfcmVmX2Nfc2l6ZSA9IEFMSUdOKGN0eC0+aW1nX3dpZHRoLCBTNVBfRklNVl9OVjEyTVRfSEFMSUdOKQorCQkJKiBBTElHTigoY3R4LT5pbWdfaGVpZ2h0ID4+IDEpLCBTNVBfRklNVl9OVjEyTVRfVkFMSUdOKTsKKwkJZW5jX3JlZl9jX3NpemUgPSBBTElHTihlbmNfcmVmX2Nfc2l6ZSwgUzVQX0ZJTVZfTlYxMk1UX1NBTElHTik7CisJfSBlbHNlIHsKKwkJZ3VhcmRfd2lkdGggPSBBTElHTihjdHgtPmltZ193aWR0aCArIDE2LAorCQkJCQkJUzVQX0ZJTVZfTlYxMk1UX0hBTElHTik7CisJCWd1YXJkX2hlaWdodCA9IEFMSUdOKChjdHgtPmltZ19oZWlnaHQgPj4gMSkgKyA0LAorCQkJCQkJUzVQX0ZJTVZfTlYxMk1UX1ZBTElHTik7CisJCWVuY19yZWZfY19zaXplID0gQUxJR04oZ3VhcmRfd2lkdGggKiBndWFyZF9oZWlnaHQsCisJCQkJICAgICAgIFM1UF9GSU1WX05WMTJNVF9TQUxJR04pOworCX0KKwltZmNfZGVidWcoMiwgImJ1Zl9zaXplMTogJWQsIGJ1Zl9zaXplMjogJWRcbiIsIGJ1Zl9zaXplMSwgYnVmX3NpemUyKTsKKwlzd2l0Y2ggKGN0eC0+Y29kZWNfbW9kZSkgeworCWNhc2UgUzVQX0ZJTVZfQ09ERUNfSDI2NF9FTkM6CisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCW1mY193cml0ZShkZXYsIE9GRlNFVEEoYnVmX2FkZHIxKSwKKwkJCQlTNVBfRklNVl9FTkNfUkVGMF9MVU1BX0FEUiArICg0ICogaSkpOworCQkJYnVmX2FkZHIxICs9IGVuY19yZWZfeV9zaXplOworCQkJYnVmX3NpemUxIC09IGVuY19yZWZfeV9zaXplOworCisJCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRCKGJ1Zl9hZGRyMiksCisJCQkJUzVQX0ZJTVZfRU5DX1JFRjJfTFVNQV9BRFIgKyAoNCAqIGkpKTsKKwkJCWJ1Zl9hZGRyMiArPSBlbmNfcmVmX3lfc2l6ZTsKKwkJCWJ1Zl9zaXplMiAtPSBlbmNfcmVmX3lfc2l6ZTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRCKGJ1Zl9hZGRyMiksCisJCQkJUzVQX0ZJTVZfRU5DX1JFRjBfQ0hST01BX0FEUiArICg0ICogaSkpOworCQkJYnVmX2FkZHIyICs9IGVuY19yZWZfY19zaXplOworCQkJYnVmX3NpemUyIC09IGVuY19yZWZfY19zaXplOworCQl9CisJCW1mY193cml0ZShkZXYsIE9GRlNFVEEoYnVmX2FkZHIxKSwgUzVQX0ZJTVZfSDI2NF9VUF9NVl9BRFIpOworCQlidWZfYWRkcjEgKz0gUzVQX0ZJTVZfRU5DX1VQTVZfU0laRTsKKwkJYnVmX3NpemUxIC09IFM1UF9GSU1WX0VOQ19VUE1WX1NJWkU7CisJCW1mY193cml0ZShkZXYsIE9GRlNFVEEoYnVmX2FkZHIxKSwKKwkJCQkJUzVQX0ZJTVZfSDI2NF9DT1pFUk9fRkxBR19BRFIpOworCQlidWZfYWRkcjEgKz0gUzVQX0ZJTVZfRU5DX0NPTEZMR19TSVpFOworCQlidWZfc2l6ZTEgLT0gUzVQX0ZJTVZfRU5DX0NPTEZMR19TSVpFOworCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRBKGJ1Zl9hZGRyMSksCisJCQkJCVM1UF9GSU1WX0gyNjRfVVBfSU5UUkFfTURfQURSKTsKKwkJYnVmX2FkZHIxICs9IFM1UF9GSU1WX0VOQ19JTlRSQU1EX1NJWkU7CisJCWJ1Zl9zaXplMSAtPSBTNVBfRklNVl9FTkNfSU5UUkFNRF9TSVpFOworCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRCKGJ1Zl9hZGRyMiksCisJCQkJCVM1UF9GSU1WX0gyNjRfVVBfSU5UUkFfUFJFRF9BRFIpOworCQlidWZfYWRkcjIgKz0gUzVQX0ZJTVZfRU5DX0lOVFJBUFJFRF9TSVpFOworCQlidWZfc2l6ZTIgLT0gUzVQX0ZJTVZfRU5DX0lOVFJBUFJFRF9TSVpFOworCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRBKGJ1Zl9hZGRyMSksCisJCQkJCVM1UF9GSU1WX0gyNjRfTkJPUl9JTkZPX0FEUik7CisJCWJ1Zl9hZGRyMSArPSBTNVBfRklNVl9FTkNfTkJPUklORk9fU0laRTsKKwkJYnVmX3NpemUxIC09IFM1UF9GSU1WX0VOQ19OQk9SSU5GT19TSVpFOworCQltZmNfZGVidWcoMiwgImJ1Zl9zaXplMTogJWQsIGJ1Zl9zaXplMjogJWRcbiIsCisJCQlidWZfc2l6ZTEsIGJ1Zl9zaXplMik7CisJCWJyZWFrOworCWNhc2UgUzVQX0ZJTVZfQ09ERUNfTVBFRzRfRU5DOgorCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRBKGJ1Zl9hZGRyMSksCisJCQkJUzVQX0ZJTVZfRU5DX1JFRjBfTFVNQV9BRFIgKyAoNCAqIGkpKTsKKwkJCWJ1Zl9hZGRyMSArPSBlbmNfcmVmX3lfc2l6ZTsKKwkJCWJ1Zl9zaXplMSAtPSBlbmNfcmVmX3lfc2l6ZTsKKwkJCW1mY193cml0ZShkZXYsIE9GRlNFVEIoYnVmX2FkZHIyKSwKKwkJCQlTNVBfRklNVl9FTkNfUkVGMl9MVU1BX0FEUiArICg0ICogaSkpOworCQkJYnVmX2FkZHIyICs9IGVuY19yZWZfeV9zaXplOworCQkJYnVmX3NpemUyIC09IGVuY19yZWZfeV9zaXplOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJCW1mY193cml0ZShkZXYsIE9GRlNFVEIoYnVmX2FkZHIyKSwKKwkJCQlTNVBfRklNVl9FTkNfUkVGMF9DSFJPTUFfQURSICsgKDQgKiBpKSk7CisJCQlidWZfYWRkcjIgKz0gZW5jX3JlZl9jX3NpemU7CisJCQlidWZfc2l6ZTIgLT0gZW5jX3JlZl9jX3NpemU7CisJCX0KKwkJbWZjX3dyaXRlKGRldiwgT0ZGU0VUQShidWZfYWRkcjEpLCBTNVBfRklNVl9NUEVHNF9VUF9NVl9BRFIpOworCQlidWZfYWRkcjEgKz0gUzVQX0ZJTVZfRU5DX1VQTVZfU0laRTsKKwkJYnVmX3NpemUxIC09IFM1UF9GSU1WX0VOQ19VUE1WX1NJWkU7CisJCW1mY193cml0ZShkZXYsIE9GRlNFVEEoYnVmX2FkZHIxKSwKKwkJCQkJCVM1UF9GSU1WX01QRUc0X0NPWkVST19GTEFHX0FEUik7CisJCWJ1Zl9hZGRyMSArPSBTNVBfRklNVl9FTkNfQ09MRkxHX1NJWkU7CisJCWJ1Zl9zaXplMSAtPSBTNVBfRklNVl9FTkNfQ09MRkxHX1NJWkU7CisJCW1mY193cml0ZShkZXYsIE9GRlNFVEEoYnVmX2FkZHIxKSwKKwkJCQkJCVM1UF9GSU1WX01QRUc0X0FDRENfQ09FRl9BRFIpOworCQlidWZfYWRkcjEgKz0gUzVQX0ZJTVZfRU5DX0FDRENDT0VGX1NJWkU7CisJCWJ1Zl9zaXplMSAtPSBTNVBfRklNVl9FTkNfQUNEQ0NPRUZfU0laRTsKKwkJbWZjX2RlYnVnKDIsICJidWZfc2l6ZTE6ICVkLCBidWZfc2l6ZTI6ICVkXG4iLAorCQkJYnVmX3NpemUxLCBidWZfc2l6ZTIpOworCQlicmVhazsKKwljYXNlIFM1UF9GSU1WX0NPREVDX0gyNjNfRU5DOgorCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCQltZmNfd3JpdGUoZGV2LCBPRkZTRVRBKGJ1Zl9hZGRyMSksCisJCQkJUzVQX0ZJTVZfRU5DX1JFRjBfTFVNQV9BRFIgKyAoNCAqIGkpKTsKKwkJCWJ1Zl9hZGRyMSArPSBlbmNfcmVmX3lfc2l6ZTsKKwkJCWJ1Zl9zaXplMSAtPSBlbmNfcmVmX3lfc2l6ZTsKKwkJCW1mY193cml0ZShkZXYsIE9GRlNFVEIoYnVmX2FkZHIyKSwKKwkJCQlTNVBfRklNVl9FTkNfUkVGMl9MVU1BX0FEUiArICg0ICogaSkpOworCQkJYnVmX2FkZHIyICs9IGVuY19yZWZfeV9zaXplOworCQkJYnVmX3NpemUyIC09IGVuY19yZWZfeV9zaXplOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJCW1mY193cml0ZShkZXYsIE9GRlNFVEIoYnVmX2FkZHIyKSwKKwkJCQlTNVBfRklNVl9FTkNfUkVGMF9DSFJPTUFfQURSICsgKDQgKiBpKSk7CisJCQlidWZfYWRkcjIgKz0gZW5jX3JlZl9jX3NpemU7CisJCQlidWZfc2l6ZTIgLT0gZW5jX3JlZl9jX3NpemU7CisJCX0KKwkJbWZjX3dyaXRlKGRldiwgT0ZGU0VUQShidWZfYWRkcjEpLCBTNVBfRklNVl9IMjYzX1VQX01WX0FEUik7CisJCWJ1Zl9hZGRyMSArPSBTNVBfRklNVl9FTkNfVVBNVl9TSVpFOworCQlidWZfc2l6ZTEgLT0gUzVQX0ZJTVZfRU5DX1VQTVZfU0laRTsKKwkJbWZjX3dyaXRlKGRldiwgT0ZGU0VUQShidWZfYWRkcjEpLCBTNVBfRklNVl9IMjYzX0FDRENfQ09FRl9BRFIpOworCQlidWZfYWRkcjEgKz0gUzVQX0ZJTVZfRU5DX0FDRENDT0VGX1NJWkU7CisJCWJ1Zl9zaXplMSAtPSBTNVBfRklNVl9FTkNfQUNEQ0NPRUZfU0laRTsKKwkJbWZjX2RlYnVnKDIsICJidWZfc2l6ZTE6ICVkLCBidWZfc2l6ZTI6ICVkXG4iLAorCQkJYnVmX3NpemUxLCBidWZfc2l6ZTIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQltZmNfZXJyKCJVbmtub3duIGNvZGVjIHNldCBmb3IgZW5jb2Rpbmc6ICVkXG4iLAorCQkJY3R4LT5jb2RlY19tb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHM1cF9tZmNfc2V0X2VuY19wYXJhbXMoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKwlzdHJ1Y3QgczVwX21mY19lbmNfcGFyYW1zICpwID0gJmN0eC0+ZW5jX3BhcmFtczsKKwl1bnNpZ25lZCBpbnQgcmVnOworCXVuc2lnbmVkIGludCBzaG07CisKKwkvKiB3aWR0aCAqLworCW1mY193cml0ZShkZXYsIGN0eC0+aW1nX3dpZHRoLCBTNVBfRklNVl9FTkNfSFNJWkVfUFgpOworCS8qIGhlaWdodCAqLworCW1mY193cml0ZShkZXYsIGN0eC0+aW1nX2hlaWdodCwgUzVQX0ZJTVZfRU5DX1ZTSVpFX1BYKTsKKwkvKiBwaWN0eXBlIDogZW5hYmxlLCBJRFIgcGVyaW9kICovCisJcmVnID0gbWZjX3JlYWQoZGV2LCBTNVBfRklNVl9FTkNfUElDX1RZUEVfQ1RSTCk7CisJcmVnIHw9ICgxIDw8IDE4KTsKKwlyZWcgJj0gfigweEZGRkYpOworCXJlZyB8PSBwLT5nb3Bfc2l6ZTsKKwltZmNfd3JpdGUoZGV2LCByZWcsIFM1UF9GSU1WX0VOQ19QSUNfVFlQRV9DVFJMKTsKKwltZmNfd3JpdGUoZGV2LCAwLCBTNVBfRklNVl9FTkNfQl9SRUNPTl9XUklURV9PTik7CisJLyogbXVsdGktc2xpY2UgY29udHJvbCAqLworCS8qIG11bHRpLXNsaWNlIE1CIG51bWJlciBvciBiaXQgc2l6ZSAqLworCW1mY193cml0ZShkZXYsIHAtPnNsaWNlX21vZGUsIFM1UF9GSU1WX0VOQ19NU0xJQ0VfQ1RSTCk7CisJaWYgKHAtPnNsaWNlX21vZGUgPT0gVjRMMl9NUEVHX1ZJREVPX01VTFRJX1NJQ0VfTU9ERV9NQVhfTUIpIHsKKwkJbWZjX3dyaXRlKGRldiwgcC0+c2xpY2VfbWIsIFM1UF9GSU1WX0VOQ19NU0xJQ0VfTUIpOworCX0gZWxzZSBpZiAocC0+c2xpY2VfbW9kZSA9PSBWNEwyX01QRUdfVklERU9fTVVMVElfU0lDRV9NT0RFX01BWF9CWVRFUykgeworCQltZmNfd3JpdGUoZGV2LCBwLT5zbGljZV9iaXQsIFM1UF9GSU1WX0VOQ19NU0xJQ0VfQklUKTsKKwl9IGVsc2UgeworCQltZmNfd3JpdGUoZGV2LCAwLCBTNVBfRklNVl9FTkNfTVNMSUNFX01CKTsKKwkJbWZjX3dyaXRlKGRldiwgMCwgUzVQX0ZJTVZfRU5DX01TTElDRV9CSVQpOworCX0KKwkvKiBjeWNsaWMgaW50cmEgcmVmcmVzaCAqLworCW1mY193cml0ZShkZXYsIHAtPmludHJhX3JlZnJlc2hfbWIsIFM1UF9GSU1WX0VOQ19DSVJfQ1RSTCk7CisJLyogbWVtb3J5IHN0cnVjdHVyZSBjdXIuIGZyYW1lICovCisJaWYgKGN0eC0+c3JjX2ZtdC0+Zm91cmNjID09IFY0TDJfUElYX0ZNVF9OVjEyTSkKKwkJbWZjX3dyaXRlKGRldiwgMCwgUzVQX0ZJTVZfRU5DX01BUF9GT1JfQ1VSKTsKKwllbHNlIGlmIChjdHgtPnNyY19mbXQtPmZvdXJjYyA9PSBWNEwyX1BJWF9GTVRfTlYxMk1UKQorCQltZmNfd3JpdGUoZGV2LCAzLCBTNVBfRklNVl9FTkNfTUFQX0ZPUl9DVVIpOworCS8qIHBhZGRpbmcgY29udHJvbCAmIHZhbHVlICovCisJcmVnID0gbWZjX3JlYWQoZGV2LCBTNVBfRklNVl9FTkNfUEFERElOR19DVFJMKTsKKwlpZiAocC0+cGFkKSB7CisJCS8qKiBlbmFibGUgKi8KKwkJcmVnIHw9ICgxIDw8IDMxKTsKKwkJLyoqIGNyIHZhbHVlICovCisJCXJlZyAmPSB+KDB4RkYgPDwgMTYpOworCQlyZWcgfD0gKHAtPnBhZF9jciA8PCAxNik7CisJCS8qKiBjYiB2YWx1ZSAqLworCQlyZWcgJj0gfigweEZGIDw8IDgpOworCQlyZWcgfD0gKHAtPnBhZF9jYiA8PCA4KTsKKwkJLyoqIHkgdmFsdWUgKi8KKwkJcmVnICY9IH4oMHhGRik7CisJCXJlZyB8PSAocC0+cGFkX2x1bWEpOworCX0gZWxzZSB7CisJCS8qKiBkaXNhYmxlICYgYWxsIHZhbHVlIGNsZWFyICovCisJCXJlZyA9IDA7CisJfQorCW1mY193cml0ZShkZXYsIHJlZywgUzVQX0ZJTVZfRU5DX1BBRERJTkdfQ1RSTCk7CisJLyogcmF0ZSBjb250cm9sIGNvbmZpZy4gKi8KKwlyZWcgPSBtZmNfcmVhZChkZXYsIFM1UF9GSU1WX0VOQ19SQ19DT05GSUcpOworCS8qKiBmcmFtZS1sZXZlbCByYXRlIGNvbnRyb2wgKi8KKwlyZWcgJj0gfigweDEgPDwgOSk7CisJcmVnIHw9IChwLT5yY19mcmFtZSA8PCA5KTsKKwltZmNfd3JpdGUoZGV2LCByZWcsIFM1UF9GSU1WX0VOQ19SQ19DT05GSUcpOworCS8qIGJpdCByYXRlICovCisJaWYgKHAtPnJjX2ZyYW1lKQorCQltZmNfd3JpdGUoZGV2LCBwLT5yY19iaXRyYXRlLAorCQkJUzVQX0ZJTVZfRU5DX1JDX0JJVF9SQVRFKTsKKwllbHNlCisJCW1mY193cml0ZShkZXYsIDAsIFM1UF9GSU1WX0VOQ19SQ19CSVRfUkFURSk7CisJLyogcmVhY3Rpb24gY29lZmZpY2llbnQgKi8KKwlpZiAocC0+cmNfZnJhbWUpCisJCW1mY193cml0ZShkZXYsIHAtPnJjX3JlYWN0aW9uX2NvZWZmLCBTNVBfRklNVl9FTkNfUkNfUlBBUkEpOworCXNobSA9IHM1cF9tZmNfcmVhZF9zaG0oY3R4LCBFWFRfRU5DX0NPTlRST0wpOworCS8qIHNlcSBoZWFkZXIgY3RybCAqLworCXNobSAmPSB+KDB4MSA8PCAzKTsKKwlzaG0gfD0gKHAtPnNlcV9oZHJfbW9kZSA8PCAzKTsKKwkvKiBmcmFtZSBza2lwIG1vZGUgKi8KKwlzaG0gJj0gfigweDMgPDwgMSk7CisJc2htIHw9IChwLT5mcmFtZV9za2lwX21vZGUgPDwgMSk7CisJczVwX21mY193cml0ZV9zaG0oY3R4LCBzaG0sIEVYVF9FTkNfQ09OVFJPTCk7CisJLyogZml4ZWQgdGFyZ2V0IGJpdCAqLworCXM1cF9tZmNfd3JpdGVfc2htKGN0eCwgcC0+Zml4ZWRfdGFyZ2V0X2JpdCwgUkNfQ09OVFJPTF9DT05GSUcpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHM1cF9tZmNfc2V0X2VuY19wYXJhbXNfaDI2NChzdHJ1Y3QgczVwX21mY19jdHggKmN0eCkKK3sKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IGN0eC0+ZGV2OworCXN0cnVjdCBzNXBfbWZjX2VuY19wYXJhbXMgKnAgPSAmY3R4LT5lbmNfcGFyYW1zOworCXN0cnVjdCBzNXBfbWZjX2gyNjRfZW5jX3BhcmFtcyAqcF8yNjQgPSAmcC0+Y29kZWMuaDI2NDsKKwl1bnNpZ25lZCBpbnQgcmVnOworCXVuc2lnbmVkIGludCBzaG07CisKKwlzNXBfbWZjX3NldF9lbmNfcGFyYW1zKGN0eCk7CisJLyogcGljdHlwZSA6IG51bWJlciBvZiBCICovCisJcmVnID0gbWZjX3JlYWQoZGV2LCBTNVBfRklNVl9FTkNfUElDX1RZUEVfQ1RSTCk7CisJLyogbnVtX2JfZnJhbWUgLSAwIH4gMiAqLworCXJlZyAmPSB+KDB4MyA8PCAxNik7CisJcmVnIHw9IChwLT5udW1fYl9mcmFtZSA8PCAxNik7CisJbWZjX3dyaXRlKGRldiwgcmVnLCBTNVBfRklNVl9FTkNfUElDX1RZUEVfQ1RSTCk7CisJLyogcHJvZmlsZSAmIGxldmVsICovCisJcmVnID0gbWZjX3JlYWQoZGV2LCBTNVBfRklNVl9FTkNfUFJPRklMRSk7CisJLyogbGV2ZWwgKi8KKwlyZWcgJj0gfigweEZGIDw8IDgpOworCXJlZyB8PSAocF8yNjQtPmxldmVsIDw8IDgpOworCS8qIHByb2ZpbGUgLSAwIH4gMiAqLworCXJlZyAmPSB+KDB4M0YpOworCXJlZyB8PSBwXzI2NC0+cHJvZmlsZTsKKwltZmNfd3JpdGUoZGV2LCByZWcsIFM1UF9GSU1WX0VOQ19QUk9GSUxFKTsKKwkvKiBpbnRlcmxhY2UgICovCisJbWZjX3dyaXRlKGRldiwgcC0+aW50ZXJsYWNlLCBTNVBfRklNVl9FTkNfUElDX1NUUlVDVCk7CisJLyogaGVpZ2h0ICovCisJaWYgKHAtPmludGVybGFjZSkKKwkJbWZjX3dyaXRlKGRldiwgY3R4LT5pbWdfaGVpZ2h0ID4+IDEsIFM1UF9GSU1WX0VOQ19WU0laRV9QWCk7CisJLyogbG9vcGZpbHRlciBjdHJsICovCisJbWZjX3dyaXRlKGRldiwgcF8yNjQtPmxvb3BfZmlsdGVyX21vZGUsIFM1UF9GSU1WX0VOQ19MRl9DVFJMKTsKKwkvKiBsb29wZmlsdGVyIGFscGhhIG9mZnNldCAqLworCWlmIChwXzI2NC0+bG9vcF9maWx0ZXJfYWxwaGEgPCAwKSB7CisJCXJlZyA9IDB4MTA7CisJCXJlZyB8PSAoMHhGRiAtIHBfMjY0LT5sb29wX2ZpbHRlcl9hbHBoYSkgKyAxOworCX0gZWxzZSB7CisJCXJlZyA9IDB4MDA7CisJCXJlZyB8PSAocF8yNjQtPmxvb3BfZmlsdGVyX2FscGhhICYgMHhGKTsKKwl9CisJbWZjX3dyaXRlKGRldiwgcmVnLCBTNVBfRklNVl9FTkNfQUxQSEFfT0ZGKTsKKwkvKiBsb29wZmlsdGVyIGJldGEgb2Zmc2V0ICovCisJaWYgKHBfMjY0LT5sb29wX2ZpbHRlcl9iZXRhIDwgMCkgeworCQlyZWcgPSAweDEwOworCQlyZWcgfD0gKDB4RkYgLSBwXzI2NC0+bG9vcF9maWx0ZXJfYmV0YSkgKyAxOworCX0gZWxzZSB7CisJCXJlZyA9IDB4MDA7CisJCXJlZyB8PSAocF8yNjQtPmxvb3BfZmlsdGVyX2JldGEgJiAweEYpOworCX0KKwltZmNfd3JpdGUoZGV2LCByZWcsIFM1UF9GSU1WX0VOQ19CRVRBX09GRik7CisJLyogZW50cm9weSBjb2RpbmcgbW9kZSAqLworCWlmIChwXzI2NC0+ZW50cm9weV9tb2RlID09IFY0TDJfTVBFR19WSURFT19IMjY0X0VOVFJPUFlfTU9ERV9DQUJBQykKKwkJbWZjX3dyaXRlKGRldiwgMSwgUzVQX0ZJTVZfRU5DX0gyNjRfRU5UUk9QWV9NT0RFKTsKKwllbHNlCisJCW1mY193cml0ZShkZXYsIDAsIFM1UF9GSU1WX0VOQ19IMjY0X0VOVFJPUFlfTU9ERSk7CisJLyogbnVtYmVyIG9mIHJlZi4gcGljdHVyZSAqLworCXJlZyA9IG1mY19yZWFkKGRldiwgUzVQX0ZJTVZfRU5DX0gyNjRfTlVNX09GX1JFRik7CisJLyogbnVtIG9mIHJlZi4gcGljdHVyZXMgb2YgUCAqLworCXJlZyAmPSB+KDB4MyA8PCA1KTsKKwlyZWcgfD0gKHBfMjY0LT5udW1fcmVmX3BpY180cCA8PCA1KTsKKwkvKiBtYXggbnVtYmVyIG9mIHJlZi4gcGljdHVyZXMgKi8KKwlyZWcgJj0gfigweDFGKTsKKwlyZWcgfD0gcF8yNjQtPm1heF9yZWZfcGljOworCW1mY193cml0ZShkZXYsIHJlZywgUzVQX0ZJTVZfRU5DX0gyNjRfTlVNX09GX1JFRik7CisJLyogOHg4IHRyYW5zZm9ybSBlbmFibGUgKi8KKwltZmNfd3JpdGUoZGV2LCBwXzI2NC0+Xzh4OF90cmFuc2Zvcm0sIFM1UF9GSU1WX0VOQ19IMjY0X1RSQU5TX0ZMQUcpOworCS8qIHJhdGUgY29udHJvbCBjb25maWcuICovCisJcmVnID0gbWZjX3JlYWQoZGV2LCBTNVBfRklNVl9FTkNfUkNfQ09ORklHKTsKKwkvKiBtYWNyb2Jsb2NrIGxldmVsIHJhdGUgY29udHJvbCAqLworCXJlZyAmPSB+KDB4MSA8PCA4KTsKKwlyZWcgfD0gKHBfMjY0LT5yY19tYiA8PCA4KTsKKwkvKiBmcmFtZSBRUCAqLworCXJlZyAmPSB+KDB4M0YpOworCXJlZyB8PSBwXzI2NC0+cmNfZnJhbWVfcXA7CisJbWZjX3dyaXRlKGRldiwgcmVnLCBTNVBfRklNVl9FTkNfUkNfQ09ORklHKTsKKwkvKiBmcmFtZSByYXRlICovCisJaWYgKHAtPnJjX2ZyYW1lICYmIHAtPnJjX2ZyYW1lcmF0ZV9kZW5vbSkKKwkJbWZjX3dyaXRlKGRldiwgcC0+cmNfZnJhbWVyYXRlX251bSAqIDEwMDAKKwkJCS8gcC0+cmNfZnJhbWVyYXRlX2Rlbm9tLCBTNVBfRklNVl9FTkNfUkNfRlJBTUVfUkFURSk7CisJZWxzZQorCQltZmNfd3JpdGUoZGV2LCAwLCBTNVBfRklNVl9FTkNfUkNfRlJBTUVfUkFURSk7CisJLyogbWF4ICYgbWluIHZhbHVlIG9mIFFQICovCisJcmVnID0gbWZjX3JlYWQoZGV2LCBTNVBfRklNVl9FTkNfUkNfUUJPVU5EKTsKKwkvKiBtYXggUVAgKi8KKwlyZWcgJj0gfigweDNGIDw8IDgpOworCXJlZyB8PSAocF8yNjQtPnJjX21heF9xcCA8PCA4KTsKKwkvKiBtaW4gUVAgKi8KKwlyZWcgJj0gfigweDNGKTsKKwlyZWcgfD0gcF8yNjQtPnJjX21pbl9xcDsKKwltZmNfd3JpdGUoZGV2LCByZWcsIFM1UF9GSU1WX0VOQ19SQ19RQk9VTkQpOworCS8qIG1hY3JvYmxvY2sgYWRhcHRpdmUgc2NhbGluZyBmZWF0dXJlcyAqLworCWlmIChwXzI2NC0+cmNfbWIpIHsKKwkJcmVnID0gbWZjX3JlYWQoZGV2LCBTNVBfRklNVl9FTkNfUkNfTUJfQ1RSTCk7CisJCS8qIGRhcmsgcmVnaW9uICovCisJCXJlZyAmPSB+KDB4MSA8PCAzKTsKKwkJcmVnIHw9IChwXzI2NC0+cmNfbWJfZGFyayA8PCAzKTsKKwkJLyogc21vb3RoIHJlZ2lvbiAqLworCQlyZWcgJj0gfigweDEgPDwgMik7CisJCXJlZyB8PSAocF8yNjQtPnJjX21iX3Ntb290aCA8PCAyKTsKKwkJLyogc3RhdGljIHJlZ2lvbiAqLworCQlyZWcgJj0gfigweDEgPDwgMSk7CisJCXJlZyB8PSAocF8yNjQtPnJjX21iX3N0YXRpYyA8PCAxKTsKKwkJLyogaGlnaCBhY3Rpdml0eSByZWdpb24gKi8KKwkJcmVnICY9IH4oMHgxKTsKKwkJcmVnIHw9IHBfMjY0LT5yY19tYl9hY3Rpdml0eTsKKwkJbWZjX3dyaXRlKGRldiwgcmVnLCBTNVBfRklNVl9FTkNfUkNfTUJfQ1RSTCk7CisJfQorCWlmICghcC0+cmNfZnJhbWUgJiYKKwkgICAgIXBfMjY0LT5yY19tYikgeworCQlzaG0gPSBzNXBfbWZjX3JlYWRfc2htKGN0eCwgUF9CX0ZSQU1FX1FQKTsKKwkJc2htICY9IH4oMHhGRkYpOworCQlzaG0gfD0gKChwXzI2NC0+cmNfYl9mcmFtZV9xcCAmIDB4M0YpIDw8IDYpOworCQlzaG0gfD0gKHBfMjY0LT5yY19wX2ZyYW1lX3FwICYgMHgzRik7CisJCXM1cF9tZmNfd3JpdGVfc2htKGN0eCwgc2htLCBQX0JfRlJBTUVfUVApOworCX0KKwkvKiBleHRlbmRlZCBlbmNvZGVyIGN0cmwgKi8KKwlzaG0gPSBzNXBfbWZjX3JlYWRfc2htKGN0eCwgRVhUX0VOQ19DT05UUk9MKTsKKwkvKiBBUiBWVUkgY29udHJvbCAqLworCXNobSAmPSB+KDB4MSA8PCAxNSk7CisJc2htIHw9IChwXzI2NC0+dnVpX3NhciA8PCAxKTsKKwlzNXBfbWZjX3dyaXRlX3NobShjdHgsIHNobSwgRVhUX0VOQ19DT05UUk9MKTsKKwlpZiAocF8yNjQtPnZ1aV9zYXIpIHsKKwkJLyogYXNwZWN0IHJhdGlvbiBJREMgKi8KKwkJc2htID0gczVwX21mY19yZWFkX3NobShjdHgsIFNBTVBMRV9BU1BFQ1RfUkFUSU9fSURDKTsKKwkJc2htICY9IH4oMHhGRik7CisJCXNobSB8PSBwXzI2NC0+dnVpX3Nhcl9pZGM7CisJCXM1cF9tZmNfd3JpdGVfc2htKGN0eCwgc2htLCBTQU1QTEVfQVNQRUNUX1JBVElPX0lEQyk7CisJCWlmIChwXzI2NC0+dnVpX3Nhcl9pZGMgPT0gMHhGRikgeworCQkJLyogc2FtcGxlICBBUiBpbmZvICovCisJCQlzaG0gPSBzNXBfbWZjX3JlYWRfc2htKGN0eCwgRVhURU5ERURfU0FSKTsKKwkJCXNobSAmPSB+KDB4RkZGRkZGRkYpOworCQkJc2htIHw9IHBfMjY0LT52dWlfZXh0X3Nhcl93aWR0aCA8PCAxNjsKKwkJCXNobSB8PSBwXzI2NC0+dnVpX2V4dF9zYXJfaGVpZ2h0OworCQkJczVwX21mY193cml0ZV9zaG0oY3R4LCBzaG0sIEVYVEVOREVEX1NBUik7CisJCX0KKwl9CisJLyogaW50cmEgcGljdHVyZSBwZXJpb2QgZm9yIEguMjY0ICovCisJc2htID0gczVwX21mY19yZWFkX3NobShjdHgsIEgyNjRfSV9QRVJJT0QpOworCS8qIGNvbnRyb2wgKi8KKwlzaG0gJj0gfigweDEgPDwgMTYpOworCXNobSB8PSAocF8yNjQtPm9wZW5fZ29wIDw8IDE2KTsKKwkvKiB2YWx1ZSAqLworCWlmIChwXzI2NC0+b3Blbl9nb3ApIHsKKwkJc2htICY9IH4oMHhGRkZGKTsKKwkJc2htIHw9IHBfMjY0LT5vcGVuX2dvcF9zaXplOworCX0KKwlzNXBfbWZjX3dyaXRlX3NobShjdHgsIHNobSwgSDI2NF9JX1BFUklPRCk7CisJLyogZXh0ZW5kZWQgZW5jb2RlciBjdHJsICovCisJc2htID0gczVwX21mY19yZWFkX3NobShjdHgsIEVYVF9FTkNfQ09OVFJPTCk7CisJLyogdmJ2IGJ1ZmZlciBzaXplICovCisJaWYgKHAtPmZyYW1lX3NraXBfbW9kZSA9PQorCQkJVjRMMl9NUEVHX01GQzUxX1ZJREVPX0ZSQU1FX1NLSVBfTU9ERV9CVUZfTElNSVQpIHsKKwkJc2htICY9IH4oMHhGRkZGIDw8IDE2KTsKKwkJc2htIHw9IChwXzI2NC0+Y3BiX3NpemUgPDwgMTYpOworCX0KKwlzNXBfbWZjX3dyaXRlX3NobShjdHgsIHNobSwgRVhUX0VOQ19DT05UUk9MKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNXBfbWZjX3NldF9lbmNfcGFyYW1zX21wZWc0KHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisJc3RydWN0IHM1cF9tZmNfZW5jX3BhcmFtcyAqcCA9ICZjdHgtPmVuY19wYXJhbXM7CisJc3RydWN0IHM1cF9tZmNfbXBlZzRfZW5jX3BhcmFtcyAqcF9tcGVnNCA9ICZwLT5jb2RlYy5tcGVnNDsKKwl1bnNpZ25lZCBpbnQgcmVnOworCXVuc2lnbmVkIGludCBzaG07CisJdW5zaWduZWQgaW50IGZyYW1lcmF0ZTsKKworCXM1cF9tZmNfc2V0X2VuY19wYXJhbXMoY3R4KTsKKwkvKiBwaWN0eXBlIDogbnVtYmVyIG9mIEIgKi8KKwlyZWcgPSBtZmNfcmVhZChkZXYsIFM1UF9GSU1WX0VOQ19QSUNfVFlQRV9DVFJMKTsKKwkvKiBudW1fYl9mcmFtZSAtIDAgfiAyICovCisJcmVnICY9IH4oMHgzIDw8IDE2KTsKKwlyZWcgfD0gKHAtPm51bV9iX2ZyYW1lIDw8IDE2KTsKKwltZmNfd3JpdGUoZGV2LCByZWcsIFM1UF9GSU1WX0VOQ19QSUNfVFlQRV9DVFJMKTsKKwkvKiBwcm9maWxlICYgbGV2ZWwgKi8KKwlyZWcgPSBtZmNfcmVhZChkZXYsIFM1UF9GSU1WX0VOQ19QUk9GSUxFKTsKKwkvKiBsZXZlbCAqLworCXJlZyAmPSB+KDB4RkYgPDwgOCk7CisJcmVnIHw9IChwX21wZWc0LT5sZXZlbCA8PCA4KTsKKwkvKiBwcm9maWxlIC0gMCB+IDIgKi8KKwlyZWcgJj0gfigweDNGKTsKKwlyZWcgfD0gcF9tcGVnNC0+cHJvZmlsZTsKKwltZmNfd3JpdGUoZGV2LCByZWcsIFM1UF9GSU1WX0VOQ19QUk9GSUxFKTsKKwkvKiBxdWFydGVyX3BpeGVsICovCisJbWZjX3dyaXRlKGRldiwgcF9tcGVnNC0+cXVhcnRlcl9waXhlbCwgUzVQX0ZJTVZfRU5DX01QRUc0X1FVQVJUX1BYTCk7CisJLyogcXAgKi8KKwlpZiAoIXAtPnJjX2ZyYW1lKSB7CisJCXNobSA9IHM1cF9tZmNfcmVhZF9zaG0oY3R4LCBQX0JfRlJBTUVfUVApOworCQlzaG0gJj0gfigweEZGRik7CisJCXNobSB8PSAoKHBfbXBlZzQtPnJjX2JfZnJhbWVfcXAgJiAweDNGKSA8PCA2KTsKKwkJc2htIHw9IChwX21wZWc0LT5yY19wX2ZyYW1lX3FwICYgMHgzRik7CisJCXM1cF9tZmNfd3JpdGVfc2htKGN0eCwgc2htLCBQX0JfRlJBTUVfUVApOworCX0KKwkvKiBmcmFtZSByYXRlICovCisJaWYgKHAtPnJjX2ZyYW1lKSB7CisJCWlmIChwLT5yY19mcmFtZXJhdGVfZGVub20gPiAwKSB7CisJCQlmcmFtZXJhdGUgPSBwLT5yY19mcmFtZXJhdGVfbnVtICogMTAwMCAvCisJCQkJCQlwLT5yY19mcmFtZXJhdGVfZGVub207CisJCQltZmNfd3JpdGUoZGV2LCBmcmFtZXJhdGUsCisJCQkJUzVQX0ZJTVZfRU5DX1JDX0ZSQU1FX1JBVEUpOworCQkJc2htID0gczVwX21mY19yZWFkX3NobShjdHgsIFJDX1ZPUF9USU1JTkcpOworCQkJc2htICY9IH4oMHhGRkZGRkZGRik7CisJCQlzaG0gfD0gKDEgPDwgMzEpOworCQkJc2htIHw9ICgocC0+cmNfZnJhbWVyYXRlX251bSAmIDB4N0ZGRikgPDwgMTYpOworCQkJc2htIHw9IChwLT5yY19mcmFtZXJhdGVfZGVub20gJiAweEZGRkYpOworCQkJczVwX21mY193cml0ZV9zaG0oY3R4LCBzaG0sIFJDX1ZPUF9USU1JTkcpOworCQl9CisJfSBlbHNlIHsKKwkJbWZjX3dyaXRlKGRldiwgMCwgUzVQX0ZJTVZfRU5DX1JDX0ZSQU1FX1JBVEUpOworCX0KKwkvKiByYXRlIGNvbnRyb2wgY29uZmlnLiAqLworCXJlZyA9IG1mY19yZWFkKGRldiwgUzVQX0ZJTVZfRU5DX1JDX0NPTkZJRyk7CisJLyogZnJhbWUgUVAgKi8KKwlyZWcgJj0gfigweDNGKTsKKwlyZWcgfD0gcF9tcGVnNC0+cmNfZnJhbWVfcXA7CisJbWZjX3dyaXRlKGRldiwgcmVnLCBTNVBfRklNVl9FTkNfUkNfQ09ORklHKTsKKwkvKiBtYXggJiBtaW4gdmFsdWUgb2YgUVAgKi8KKwlyZWcgPSBtZmNfcmVhZChkZXYsIFM1UF9GSU1WX0VOQ19SQ19RQk9VTkQpOworCS8qIG1heCBRUCAqLworCXJlZyAmPSB+KDB4M0YgPDwgOCk7CisJcmVnIHw9IChwX21wZWc0LT5yY19tYXhfcXAgPDwgOCk7CisJLyogbWluIFFQICovCisJcmVnICY9IH4oMHgzRik7CisJcmVnIHw9IHBfbXBlZzQtPnJjX21pbl9xcDsKKwltZmNfd3JpdGUoZGV2LCByZWcsIFM1UF9GSU1WX0VOQ19SQ19RQk9VTkQpOworCS8qIGV4dGVuZGVkIGVuY29kZXIgY3RybCAqLworCXNobSA9IHM1cF9tZmNfcmVhZF9zaG0oY3R4LCBFWFRfRU5DX0NPTlRST0wpOworCS8qIHZidiBidWZmZXIgc2l6ZSAqLworCWlmIChwLT5mcmFtZV9za2lwX21vZGUgPT0KKwkJCVY0TDJfTVBFR19NRkM1MV9WSURFT19GUkFNRV9TS0lQX01PREVfQlVGX0xJTUlUKSB7CisJCXNobSAmPSB+KDB4RkZGRiA8PCAxNik7CisJCXNobSB8PSAocC0+dmJ2X3NpemUgPDwgMTYpOworCX0KKwlzNXBfbWZjX3dyaXRlX3NobShjdHgsIHNobSwgRVhUX0VOQ19DT05UUk9MKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNXBfbWZjX3NldF9lbmNfcGFyYW1zX2gyNjMoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKwlzdHJ1Y3QgczVwX21mY19lbmNfcGFyYW1zICpwID0gJmN0eC0+ZW5jX3BhcmFtczsKKwlzdHJ1Y3QgczVwX21mY19tcGVnNF9lbmNfcGFyYW1zICpwX2gyNjMgPSAmcC0+Y29kZWMubXBlZzQ7CisJdW5zaWduZWQgaW50IHJlZzsKKwl1bnNpZ25lZCBpbnQgc2htOworCisJczVwX21mY19zZXRfZW5jX3BhcmFtcyhjdHgpOworCS8qIHFwICovCisJaWYgKCFwLT5yY19mcmFtZSkgeworCQlzaG0gPSBzNXBfbWZjX3JlYWRfc2htKGN0eCwgUF9CX0ZSQU1FX1FQKTsKKwkJc2htICY9IH4oMHhGRkYpOworCQlzaG0gfD0gKHBfaDI2My0+cmNfcF9mcmFtZV9xcCAmIDB4M0YpOworCQlzNXBfbWZjX3dyaXRlX3NobShjdHgsIHNobSwgUF9CX0ZSQU1FX1FQKTsKKwl9CisJLyogZnJhbWUgcmF0ZSAqLworCWlmIChwLT5yY19mcmFtZSAmJiBwLT5yY19mcmFtZXJhdGVfZGVub20pCisJCW1mY193cml0ZShkZXYsIHAtPnJjX2ZyYW1lcmF0ZV9udW0gKiAxMDAwCisJCQkvIHAtPnJjX2ZyYW1lcmF0ZV9kZW5vbSwgUzVQX0ZJTVZfRU5DX1JDX0ZSQU1FX1JBVEUpOworCWVsc2UKKwkJbWZjX3dyaXRlKGRldiwgMCwgUzVQX0ZJTVZfRU5DX1JDX0ZSQU1FX1JBVEUpOworCS8qIHJhdGUgY29udHJvbCBjb25maWcuICovCisJcmVnID0gbWZjX3JlYWQoZGV2LCBTNVBfRklNVl9FTkNfUkNfQ09ORklHKTsKKwkvKiBmcmFtZSBRUCAqLworCXJlZyAmPSB+KDB4M0YpOworCXJlZyB8PSBwX2gyNjMtPnJjX2ZyYW1lX3FwOworCW1mY193cml0ZShkZXYsIHJlZywgUzVQX0ZJTVZfRU5DX1JDX0NPTkZJRyk7CisJLyogbWF4ICYgbWluIHZhbHVlIG9mIFFQICovCisJcmVnID0gbWZjX3JlYWQoZGV2LCBTNVBfRklNVl9FTkNfUkNfUUJPVU5EKTsKKwkvKiBtYXggUVAgKi8KKwlyZWcgJj0gfigweDNGIDw8IDgpOworCXJlZyB8PSAocF9oMjYzLT5yY19tYXhfcXAgPDwgOCk7CisJLyogbWluIFFQICovCisJcmVnICY9IH4oMHgzRik7CisJcmVnIHw9IHBfaDI2My0+cmNfbWluX3FwOworCW1mY193cml0ZShkZXYsIHJlZywgUzVQX0ZJTVZfRU5DX1JDX1FCT1VORCk7CisJLyogZXh0ZW5kZWQgZW5jb2RlciBjdHJsICovCisJc2htID0gczVwX21mY19yZWFkX3NobShjdHgsIEVYVF9FTkNfQ09OVFJPTCk7CisJLyogdmJ2IGJ1ZmZlciBzaXplICovCisJaWYgKHAtPmZyYW1lX3NraXBfbW9kZSA9PQorCQkJVjRMMl9NUEVHX01GQzUxX1ZJREVPX0ZSQU1FX1NLSVBfTU9ERV9CVUZfTElNSVQpIHsKKwkJc2htICY9IH4oMHhGRkZGIDw8IDE2KTsKKwkJc2htIHw9IChwLT52YnZfc2l6ZSA8PCAxNik7CisJfQorCXM1cF9tZmNfd3JpdGVfc2htKGN0eCwgc2htLCBFWFRfRU5DX0NPTlRST0wpOworCXJldHVybiAwOworfQorCisvKiBJbml0aWFsaXplIGRlY29kaW5nICovCitpbnQgczVwX21mY19pbml0X2RlY29kZShzdHJ1Y3QgczVwX21mY19jdHggKmN0eCkKK3sKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IGN0eC0+ZGV2OworCisJczVwX21mY19zZXRfc2hhcmVkX2J1ZmZlcihjdHgpOworCS8qIFNldHVwIGxvb3AgZmlsdGVyLCBmb3IgZGVjb2RpbmcgdGhpcyBpcyBvbmx5IHZhbGlkIGZvciBNUEVHNCAqLworCWlmIChjdHgtPmNvZGVjX21vZGUgPT0gUzVQX0ZJTVZfQ09ERUNfTVBFRzRfREVDKQorCQltZmNfd3JpdGUoZGV2LCBjdHgtPmxvb3BfZmlsdGVyX21wZWc0LCBTNVBfRklNVl9FTkNfTEZfQ1RSTCk7CisJZWxzZQorCQltZmNfd3JpdGUoZGV2LCAwLCBTNVBfRklNVl9FTkNfTEZfQ1RSTCk7CisJbWZjX3dyaXRlKGRldiwgKChjdHgtPnNsaWNlX2ludGVyZmFjZSAmIFM1UF9GSU1WX1NMSUNFX0lOVF9NQVNLKSA8PAorCQlTNVBfRklNVl9TTElDRV9JTlRfU0hJRlQpIHwgKGN0eC0+ZGlzcGxheV9kZWxheV9lbmFibGUgPDwKKwkJUzVQX0ZJTVZfRERFTEFZX0VOQV9TSElGVCkgfCAoKGN0eC0+ZGlzcGxheV9kZWxheSAmCisJCVM1UF9GSU1WX0RERUxBWV9WQUxfTUFTSykgPDwgUzVQX0ZJTVZfRERFTEFZX1ZBTF9TSElGVCksCisJCVM1UF9GSU1WX1NJX0NIMF9EUEJfQ09ORl9DVFJMKTsKKwltZmNfd3JpdGUoZGV2LAorCSgoUzVQX0ZJTVZfQ0hfU0VRX0hFQURFUiAmIFM1UF9GSU1WX0NIX01BU0spIDw8IFM1UF9GSU1WX0NIX1NISUZUKQorCQkJCXwgKGN0eC0+aW5zdF9ubyksIFM1UF9GSU1WX1NJX0NIMF9JTlNUX0lEKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgczVwX21mY19zZXRfZmx1c2goc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgsIGludCBmbHVzaCkKK3sKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IGN0eC0+ZGV2OworCXVuc2lnbmVkIGludCBkcGI7CisKKwlpZiAoZmx1c2gpCisJCWRwYiA9IG1mY19yZWFkKGRldiwgUzVQX0ZJTVZfU0lfQ0gwX0RQQl9DT05GX0NUUkwpIHwgKAorCQkJUzVQX0ZJTVZfRFBCX0ZMVVNIX01BU0sgPDwgUzVQX0ZJTVZfRFBCX0ZMVVNIX1NISUZUKTsKKwllbHNlCisJCWRwYiA9IG1mY19yZWFkKGRldiwgUzVQX0ZJTVZfU0lfQ0gwX0RQQl9DT05GX0NUUkwpICYKKwkJCX4oUzVQX0ZJTVZfRFBCX0ZMVVNIX01BU0sgPDwgUzVQX0ZJTVZfRFBCX0ZMVVNIX1NISUZUKTsKKwltZmNfd3JpdGUoZGV2LCBkcGIsIFM1UF9GSU1WX1NJX0NIMF9EUEJfQ09ORl9DVFJMKTsKK30KKworLyogRGVjb2RlIGEgc2luZ2xlIGZyYW1lICovCitpbnQgczVwX21mY19kZWNvZGVfb25lX2ZyYW1lKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4LAorCQkJCQllbnVtIHM1cF9tZmNfZGVjb2RlX2FyZyBsYXN0X2ZyYW1lKQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisKKwltZmNfd3JpdGUoZGV2LCBjdHgtPmRlY19kc3RfZmxhZywgUzVQX0ZJTVZfU0lfQ0gwX1JFTEVBU0VfQlVGKTsKKwlzNXBfbWZjX3NldF9zaGFyZWRfYnVmZmVyKGN0eCk7CisJczVwX21mY19zZXRfZmx1c2goY3R4LCBjdHgtPmRwYl9mbHVzaF9mbGFnKTsKKwkvKiBJc3N1ZSBkaWZmZXJlbnQgY29tbWFuZHMgdG8gaW5zdGFuY2UgYmFzaW5nIG9uIHdoZXRoZXIgaXQKKwkgKiBpcyB0aGUgbGFzdCBmcmFtZSBvciBub3QuICovCisJc3dpdGNoIChsYXN0X2ZyYW1lKSB7CisJY2FzZSBNRkNfREVDX0ZSQU1FOgorCQltZmNfd3JpdGUoZGV2LCAoKFM1UF9GSU1WX0NIX0ZSQU1FX1NUQVJUICYgUzVQX0ZJTVZfQ0hfTUFTSykgPDwKKwkJUzVQX0ZJTVZfQ0hfU0hJRlQpIHwgKGN0eC0+aW5zdF9ubyksIFM1UF9GSU1WX1NJX0NIMF9JTlNUX0lEKTsKKwkJYnJlYWs7CisJY2FzZSBNRkNfREVDX0xBU1RfRlJBTUU6CisJCW1mY193cml0ZShkZXYsICgoUzVQX0ZJTVZfQ0hfTEFTVF9GUkFNRSAmIFM1UF9GSU1WX0NIX01BU0spIDw8CisJCVM1UF9GSU1WX0NIX1NISUZUKSB8IChjdHgtPmluc3Rfbm8pLCBTNVBfRklNVl9TSV9DSDBfSU5TVF9JRCk7CisJCWJyZWFrOworCWNhc2UgTUZDX0RFQ19SRVNfQ0hBTkdFOgorCQltZmNfd3JpdGUoZGV2LCAoKFM1UF9GSU1WX0NIX0ZSQU1FX1NUQVJUX1JFQUxMT0MgJgorCQlTNVBfRklNVl9DSF9NQVNLKSA8PCBTNVBfRklNVl9DSF9TSElGVCkgfCAoY3R4LT5pbnN0X25vKSwKKwkJUzVQX0ZJTVZfU0lfQ0gwX0lOU1RfSUQpOworCQlicmVhazsKKwl9CisJbWZjX2RlYnVnKDIsICJEZWNvZGluZyBhIHVzdWFsIGZyYW1lXG4iKTsKKwlyZXR1cm4gMDsKK30KKworaW50IHM1cF9tZmNfaW5pdF9lbmNvZGUoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKworCWlmIChjdHgtPmNvZGVjX21vZGUgPT0gUzVQX0ZJTVZfQ09ERUNfSDI2NF9FTkMpCisJCXM1cF9tZmNfc2V0X2VuY19wYXJhbXNfaDI2NChjdHgpOworCWVsc2UgaWYgKGN0eC0+Y29kZWNfbW9kZSA9PSBTNVBfRklNVl9DT0RFQ19NUEVHNF9FTkMpCisJCXM1cF9tZmNfc2V0X2VuY19wYXJhbXNfbXBlZzQoY3R4KTsKKwllbHNlIGlmIChjdHgtPmNvZGVjX21vZGUgPT0gUzVQX0ZJTVZfQ09ERUNfSDI2M19FTkMpCisJCXM1cF9tZmNfc2V0X2VuY19wYXJhbXNfaDI2MyhjdHgpOworCWVsc2UgeworCQltZmNfZXJyKCJVbmtub3duIGNvZGVjIGZvciBlbmNvZGluZyAoJXgpXG4iLAorCQkJY3R4LT5jb2RlY19tb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXM1cF9tZmNfc2V0X3NoYXJlZF9idWZmZXIoY3R4KTsKKwltZmNfd3JpdGUoZGV2LCAoKFM1UF9GSU1WX0NIX1NFUV9IRUFERVIgPDwgMTYpICYgMHg3MDAwMCkgfAorCQkoY3R4LT5pbnN0X25vKSwgUzVQX0ZJTVZfU0lfQ0gwX0lOU1RfSUQpOworCXJldHVybiAwOworfQorCisvKiBFbmNvZGUgYSBzaW5nbGUgZnJhbWUgKi8KK2ludCBzNXBfbWZjX2VuY29kZV9vbmVfZnJhbWUoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKwkvKiBtZW1vcnkgc3RydWN0dXJlIGN1ci4gZnJhbWUgKi8KKwlpZiAoY3R4LT5zcmNfZm10LT5mb3VyY2MgPT0gVjRMMl9QSVhfRk1UX05WMTJNKQorCQltZmNfd3JpdGUoZGV2LCAwLCBTNVBfRklNVl9FTkNfTUFQX0ZPUl9DVVIpOworCWVsc2UgaWYgKGN0eC0+c3JjX2ZtdC0+Zm91cmNjID09IFY0TDJfUElYX0ZNVF9OVjEyTVQpCisJCW1mY193cml0ZShkZXYsIDMsIFM1UF9GSU1WX0VOQ19NQVBfRk9SX0NVUik7CisJczVwX21mY19zZXRfc2hhcmVkX2J1ZmZlcihjdHgpOworCW1mY193cml0ZShkZXYsIChTNVBfRklNVl9DSF9GUkFNRV9TVEFSVCA8PCAxNiAmIDB4NzAwMDApIHwKKwkJKGN0eC0+aW5zdF9ubyksIFM1UF9GSU1WX1NJX0NIMF9JTlNUX0lEKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzNXBfbWZjX2dldF9uZXdfY3R4KHN0cnVjdCBzNXBfbWZjX2RldiAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IG5ld19jdHg7CisJaW50IGNudDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmNvbmRsb2NrLCBmbGFncyk7CisJbmV3X2N0eCA9IChkZXYtPmN1cnJfY3R4ICsgMSkgJSBNRkNfTlVNX0NPTlRFWFRTOworCWNudCA9IDA7CisJd2hpbGUgKCF0ZXN0X2JpdChuZXdfY3R4LCAmZGV2LT5jdHhfd29ya19iaXRzKSkgeworCQluZXdfY3R4ID0gKG5ld19jdHggKyAxKSAlIE1GQ19OVU1fQ09OVEVYVFM7CisJCWlmICgrK2NudCA+IE1GQ19OVU1fQ09OVEVYVFMpIHsKKwkJCS8qIE5vIGNvbnRleHRzIHRvIHJ1biAqLworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5jb25kbG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5jb25kbG9jaywgZmxhZ3MpOworCXJldHVybiBuZXdfY3R4OworfQorCitzdGF0aWMgdm9pZCBzNXBfbWZjX3J1bl9yZXNfY2hhbmdlKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisKKwlzNXBfbWZjX3NldF9kZWNfc3RyZWFtX2J1ZmZlcihjdHgsIDAsIDAsIDApOworCWRldi0+Y3Vycl9jdHggPSBjdHgtPm51bTsKKwlzNXBfbWZjX2NsZWFuX2N0eF9pbnRfZmxhZ3MoY3R4KTsKKwlzNXBfbWZjX2RlY29kZV9vbmVfZnJhbWUoY3R4LCBNRkNfREVDX1JFU19DSEFOR0UpOworfQorCitzdGF0aWMgaW50IHM1cF9tZmNfcnVuX2RlY19mcmFtZShzdHJ1Y3QgczVwX21mY19jdHggKmN0eCwgaW50IGxhc3RfZnJhbWUpCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKwlzdHJ1Y3QgczVwX21mY19idWYgKnRlbXBfdmI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgaW5kZXg7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CisJLyogRnJhbWVzIGFyZSBiZWluZyBkZWNvZGVkICovCisJaWYgKGxpc3RfZW1wdHkoJmN0eC0+c3JjX3F1ZXVlKSkgeworCQltZmNfZGVidWcoMiwgIk5vIHNyYyBidWZmZXJzXG4iKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwkvKiBHZXQgdGhlIG5leHQgc291cmNlIGJ1ZmZlciAqLworCXRlbXBfdmIgPSBsaXN0X2VudHJ5KGN0eC0+c3JjX3F1ZXVlLm5leHQsIHN0cnVjdCBzNXBfbWZjX2J1ZiwgbGlzdCk7CisJdGVtcF92Yi0+dXNlZCA9IDE7CisJczVwX21mY19zZXRfZGVjX3N0cmVhbV9idWZmZXIoY3R4LAorCQl2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcih0ZW1wX3ZiLT5iLCAwKSwgY3R4LT5jb25zdW1lZF9zdHJlYW0sCisJCQkJCXRlbXBfdmItPmItPnY0bDJfcGxhbmVzWzBdLmJ5dGVzdXNlZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CisJaW5kZXggPSB0ZW1wX3ZiLT5iLT52NGwyX2J1Zi5pbmRleDsKKwlkZXYtPmN1cnJfY3R4ID0gY3R4LT5udW07CisJczVwX21mY19jbGVhbl9jdHhfaW50X2ZsYWdzKGN0eCk7CisJaWYgKHRlbXBfdmItPmItPnY0bDJfcGxhbmVzWzBdLmJ5dGVzdXNlZCA9PSAwKSB7CisJCWxhc3RfZnJhbWUgPSBNRkNfREVDX0xBU1RfRlJBTUU7CisJCW1mY19kZWJ1ZygyLCAiU2V0dGluZyBjdHgtPnN0YXRlIHRvIEZJTklTSElOR1xuIik7CisJCWN0eC0+c3RhdGUgPSBNRkNJTlNUX0ZJTklTSElORzsKKwl9CisJczVwX21mY19kZWNvZGVfb25lX2ZyYW1lKGN0eCwgbGFzdF9mcmFtZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgczVwX21mY19ydW5fZW5jX2ZyYW1lKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KQoreworCXN0cnVjdCBzNXBfbWZjX2RldiAqZGV2ID0gY3R4LT5kZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgczVwX21mY19idWYgKmRzdF9tYjsKKwlzdHJ1Y3QgczVwX21mY19idWYgKnNyY19tYjsKKwl1bnNpZ25lZCBsb25nIHNyY195X2FkZHIsIHNyY19jX2FkZHIsIGRzdF9hZGRyOworCXVuc2lnbmVkIGludCBkc3Rfc2l6ZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwlpZiAobGlzdF9lbXB0eSgmY3R4LT5zcmNfcXVldWUpKSB7CisJCW1mY19kZWJ1ZygyLCAibm8gc3JjIGJ1ZmZlcnNcbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCWlmIChsaXN0X2VtcHR5KCZjdHgtPmRzdF9xdWV1ZSkpIHsKKwkJbWZjX2RlYnVnKDIsICJubyBkc3QgYnVmZmVyc1xuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJc3JjX21iID0gbGlzdF9lbnRyeShjdHgtPnNyY19xdWV1ZS5uZXh0LCBzdHJ1Y3QgczVwX21mY19idWYsIGxpc3QpOworCXNyY19tYi0+dXNlZCA9IDE7CisJc3JjX3lfYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKHNyY19tYi0+YiwgMCk7CisJc3JjX2NfYWRkciA9IHZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKHNyY19tYi0+YiwgMSk7CisJczVwX21mY19zZXRfZW5jX2ZyYW1lX2J1ZmZlcihjdHgsIHNyY195X2FkZHIsIHNyY19jX2FkZHIpOworCWRzdF9tYiA9IGxpc3RfZW50cnkoY3R4LT5kc3RfcXVldWUubmV4dCwgc3RydWN0IHM1cF9tZmNfYnVmLCBsaXN0KTsKKwlkc3RfbWItPnVzZWQgPSAxOworCWRzdF9hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIoZHN0X21iLT5iLCAwKTsKKwlkc3Rfc2l6ZSA9IHZiMl9wbGFuZV9zaXplKGRzdF9tYi0+YiwgMCk7CisJczVwX21mY19zZXRfZW5jX3N0cmVhbV9idWZmZXIoY3R4LCBkc3RfYWRkciwgZHN0X3NpemUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOworCWRldi0+Y3Vycl9jdHggPSBjdHgtPm51bTsKKwlzNXBfbWZjX2NsZWFuX2N0eF9pbnRfZmxhZ3MoY3R4KTsKKwlzNXBfbWZjX2VuY29kZV9vbmVfZnJhbWUoY3R4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgczVwX21mY19ydW5faW5pdF9kZWMoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzNXBfbWZjX2J1ZiAqdGVtcF92YjsKKworCS8qIEluaXRpYWxpemluZyBkZWNvZGluZyAtIHBhcnNpbmcgaGVhZGVyICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOworCW1mY19kZWJ1ZygyLCAiUHJlcGFyaW5nIHRvIGluaXQgZGVjb2RpbmdcbiIpOworCXRlbXBfdmIgPSBsaXN0X2VudHJ5KGN0eC0+c3JjX3F1ZXVlLm5leHQsIHN0cnVjdCBzNXBfbWZjX2J1ZiwgbGlzdCk7CisJczVwX21mY19zZXRfZGVjX2Rlc2NfYnVmZmVyKGN0eCk7CisJbWZjX2RlYnVnKDIsICJIZWFkZXIgc2l6ZTogJWRcbiIsIHRlbXBfdmItPmItPnY0bDJfcGxhbmVzWzBdLmJ5dGVzdXNlZCk7CisJczVwX21mY19zZXRfZGVjX3N0cmVhbV9idWZmZXIoY3R4LAorCQkJCXZiMl9kbWFfY29udGlnX3BsYW5lX3BhZGRyKHRlbXBfdmItPmIsIDApLAorCQkJCTAsIHRlbXBfdmItPmItPnY0bDJfcGxhbmVzWzBdLmJ5dGVzdXNlZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CisJZGV2LT5jdXJyX2N0eCA9IGN0eC0+bnVtOworCXM1cF9tZmNfY2xlYW5fY3R4X2ludF9mbGFncyhjdHgpOworCXM1cF9tZmNfaW5pdF9kZWNvZGUoY3R4KTsKK30KKworc3RhdGljIHZvaWQgczVwX21mY19ydW5faW5pdF9lbmMoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBzNXBfbWZjX2J1ZiAqZHN0X21iOworCXVuc2lnbmVkIGxvbmcgZHN0X2FkZHI7CisJdW5zaWduZWQgaW50IGRzdF9zaXplOworCisJczVwX21mY19zZXRfZW5jX3JlZl9idWZmZXIoY3R4KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5pcnFsb2NrLCBmbGFncyk7CisJZHN0X21iID0gbGlzdF9lbnRyeShjdHgtPmRzdF9xdWV1ZS5uZXh0LCBzdHJ1Y3QgczVwX21mY19idWYsIGxpc3QpOworCWRzdF9hZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIoZHN0X21iLT5iLCAwKTsKKwlkc3Rfc2l6ZSA9IHZiMl9wbGFuZV9zaXplKGRzdF9tYi0+YiwgMCk7CisJczVwX21mY19zZXRfZW5jX3N0cmVhbV9idWZmZXIoY3R4LCBkc3RfYWRkciwgZHN0X3NpemUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOworCWRldi0+Y3Vycl9jdHggPSBjdHgtPm51bTsKKwlzNXBfbWZjX2NsZWFuX2N0eF9pbnRfZmxhZ3MoY3R4KTsKKwlzNXBfbWZjX2luaXRfZW5jb2RlKGN0eCk7Cit9CisKK3N0YXRpYyBpbnQgczVwX21mY19ydW5faW5pdF9kZWNfYnVmZmVycyhzdHJ1Y3QgczVwX21mY19jdHggKmN0eCkKK3sKKwlzdHJ1Y3QgczVwX21mY19kZXYgKmRldiA9IGN0eC0+ZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHM1cF9tZmNfYnVmICp0ZW1wX3ZiOworCWludCByZXQ7CisKKwkvKgorCSAqIEhlYWRlciB3YXMgcGFyc2VkIG5vdyBzdGFydGluZyBwcm9jZXNzaW5nCisJICogRmlyc3Qgc2V0IHRoZSBvdXRwdXQgZnJhbWUgYnVmZmVycworCSAqLworCWlmIChjdHgtPmNhcHR1cmVfc3RhdGUgIT0gUVVFVUVfQlVGU19NTUFQRUQpIHsKKwkJbWZjX2VycigiSXQgc2VlbXMgdGhhdCBub3QgYWxsIGRlc3Rpb25hdGlvbiBidWZmZXJzIHdlcmUgIgorCQkJIm1tYXBlZFxuTUZDIHJlcXVpcmVzIHRoYXQgYWxsIGRlc3RpbmF0aW9uIGFyZSBtbWFwZWQgIgorCQkJImJlZm9yZSBzdGFydGluZyBwcm9jZXNzaW5nXG4iKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwlpZiAobGlzdF9lbXB0eSgmY3R4LT5zcmNfcXVldWUpKSB7CisJCW1mY19lcnIoIkhlYWRlciBoYXMgYmVlbiBkZWFsbG9jYXRlZCBpbiB0aGUgbWlkZGxlIG9mIgorCQkJIiBpbml0aWFsaXphdGlvblxuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+aXJxbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJdGVtcF92YiA9IGxpc3RfZW50cnkoY3R4LT5zcmNfcXVldWUubmV4dCwgc3RydWN0IHM1cF9tZmNfYnVmLCBsaXN0KTsKKwltZmNfZGVidWcoMiwgIkhlYWRlciBzaXplOiAlZFxuIiwgdGVtcF92Yi0+Yi0+djRsMl9wbGFuZXNbMF0uYnl0ZXN1c2VkKTsKKwlzNXBfbWZjX3NldF9kZWNfc3RyZWFtX2J1ZmZlcihjdHgsCisJCQkJdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIodGVtcF92Yi0+YiwgMCksCisJCQkJMCwgdGVtcF92Yi0+Yi0+djRsMl9wbGFuZXNbMF0uYnl0ZXN1c2VkKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmlycWxvY2ssIGZsYWdzKTsKKwlkZXYtPmN1cnJfY3R4ID0gY3R4LT5udW07CisJczVwX21mY19jbGVhbl9jdHhfaW50X2ZsYWdzKGN0eCk7CisJcmV0ID0gczVwX21mY19zZXRfZGVjX2ZyYW1lX2J1ZmZlcihjdHgpOworCWlmIChyZXQpIHsKKwkJbWZjX2VycigiRmFpbGVkIHRvIGFsbG9jIGZyYW1lIG1lbVxuIik7CisJCWN0eC0+c3RhdGUgPSBNRkNJTlNUX0VSUk9SOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBUcnkgcnVubmluZyBhbiBvcGVyYXRpb24gb24gaGFyZHdhcmUgKi8KK3ZvaWQgczVwX21mY190cnlfcnVuKHN0cnVjdCBzNXBfbWZjX2RldiAqZGV2KQoreworCXN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4OworCWludCBuZXdfY3R4OworCXVuc2lnbmVkIGludCByZXQgPSAwOworCisJaWYgKHRlc3RfYml0KDAsICZkZXYtPmVudGVyX3N1c3BlbmQpKSB7CisJCW1mY19kZWJ1ZygxLCAiRW50ZXJpbmcgc3VzcGVuZCBzbyBkbyBub3Qgc2NoZWR1bGUgYW55IGpvYnNcbiIpOworCQlyZXR1cm47CisJfQorCS8qIENoZWNrIHdoZXRoZXIgaGFyZHdhcmUgaXMgbm90IHJ1bm5pbmcgKi8KKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmZGV2LT5od19sb2NrKSAhPSAwKSB7CisJCS8qIFRoaXMgaXMgcGVyZmVjdGx5IG9rLCB0aGUgc2NoZWR1bGVkIGN0eCBzaG91bGQgd2FpdCAqLworCQltZmNfZGVidWcoMSwgIkNvdWxkbid0IGxvY2sgSFdcbiIpOworCQlyZXR1cm47CisJfQorCS8qIENob29zZSB0aGUgY29udGV4dCB0byBydW4gKi8KKwluZXdfY3R4ID0gczVwX21mY19nZXRfbmV3X2N0eChkZXYpOworCWlmIChuZXdfY3R4IDwgMCkgeworCQkvKiBObyBjb250ZXh0cyB0byBydW4gKi8KKwkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdCgwLCAmZGV2LT5od19sb2NrKSA9PSAwKSB7CisJCQltZmNfZXJyKCJGYWlsZWQgdG8gdW5sb2NrIGhhcmR3YXJlXG4iKTsKKwkJCXJldHVybjsKKwkJfQorCQltZmNfZGVidWcoMSwgIk5vIGN0eCBpcyBzY2hlZHVsZWQgdG8gYmUgcnVuXG4iKTsKKwkJcmV0dXJuOworCX0KKwljdHggPSBkZXYtPmN0eFtuZXdfY3R4XTsKKwkvKiBHb3QgY29udGV4dCB0byBydW4gaW4gY3R4ICovCisJLyoKKwkgKiBMYXN0IGZyYW1lIGhhcyBhbHJlYWR5IGJlZW4gc2VudCB0byBNRkMuCisJICogTm93IG9idGFpbmluZyBmcmFtZXMgZnJvbSBNRkMgYnVmZmVyCisJICovCisJczVwX21mY19jbG9ja19vbigpOworCWlmIChjdHgtPnR5cGUgPT0gTUZDSU5TVF9ERUNPREVSKSB7CisJCXM1cF9tZmNfc2V0X2RlY19kZXNjX2J1ZmZlcihjdHgpOworCQlzd2l0Y2ggKGN0eC0+c3RhdGUpIHsKKwkJY2FzZSBNRkNJTlNUX0ZJTklTSElORzoKKwkJCXM1cF9tZmNfcnVuX2RlY19mcmFtZShjdHgsIE1GQ19ERUNfTEFTVF9GUkFNRSk7CisJCQlicmVhazsKKwkJY2FzZSBNRkNJTlNUX1JVTk5JTkc6CisJCQlyZXQgPSBzNXBfbWZjX3J1bl9kZWNfZnJhbWUoY3R4LCBNRkNfREVDX0ZSQU1FKTsKKwkJCWJyZWFrOworCQljYXNlIE1GQ0lOU1RfSU5JVDoKKwkJCXM1cF9tZmNfY2xlYW5fY3R4X2ludF9mbGFncyhjdHgpOworCQkJcmV0ID0gczVwX21mY19vcGVuX2luc3RfY21kKGN0eCk7CisJCQlicmVhazsKKwkJY2FzZSBNRkNJTlNUX1JFVFVSTl9JTlNUOgorCQkJczVwX21mY19jbGVhbl9jdHhfaW50X2ZsYWdzKGN0eCk7CisJCQlyZXQgPSBzNXBfbWZjX2Nsb3NlX2luc3RfY21kKGN0eCk7CisJCQlicmVhazsKKwkJY2FzZSBNRkNJTlNUX0dPVF9JTlNUOgorCQkJczVwX21mY19ydW5faW5pdF9kZWMoY3R4KTsKKwkJCWJyZWFrOworCQljYXNlIE1GQ0lOU1RfSEVBRF9QQVJTRUQ6CisJCQlyZXQgPSBzNXBfbWZjX3J1bl9pbml0X2RlY19idWZmZXJzKGN0eCk7CisJCQltZmNfZGVidWcoMSwgImhlYWQgcGFyc2VkXG4iKTsKKwkJCWJyZWFrOworCQljYXNlIE1GQ0lOU1RfUkVTX0NIQU5HRV9JTklUOgorCQkJczVwX21mY19ydW5fcmVzX2NoYW5nZShjdHgpOworCQkJYnJlYWs7CisJCWNhc2UgTUZDSU5TVF9SRVNfQ0hBTkdFX0ZMVVNIOgorCQkJczVwX21mY19ydW5fZGVjX2ZyYW1lKGN0eCwgTUZDX0RFQ19GUkFNRSk7CisJCQlicmVhazsKKwkJY2FzZSBNRkNJTlNUX1JFU19DSEFOR0VfRU5EOgorCQkJbWZjX2RlYnVnKDIsICJGaW5pc2hlZCByZW1haW5pbmcgZnJhbWVzIGFmdGVyIHJlc29sdXRpb24gY2hhbmdlXG4iKTsKKwkJCWN0eC0+Y2FwdHVyZV9zdGF0ZSA9IFFVRVVFX0ZSRUU7CisJCQltZmNfZGVidWcoMiwgIldpbGwgcmUtaW5pdCB0aGUgY29kZWNcbiIpOworCQkJczVwX21mY19ydW5faW5pdF9kZWMoY3R4KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVBR0FJTjsKKwkJfQorCX0gZWxzZSBpZiAoY3R4LT50eXBlID09IE1GQ0lOU1RfRU5DT0RFUikgeworCQlzd2l0Y2ggKGN0eC0+c3RhdGUpIHsKKwkJY2FzZSBNRkNJTlNUX0ZJTklTSElORzoKKwkJY2FzZSBNRkNJTlNUX1JVTk5JTkc6CisJCQlyZXQgPSBzNXBfbWZjX3J1bl9lbmNfZnJhbWUoY3R4KTsKKwkJCWJyZWFrOworCQljYXNlIE1GQ0lOU1RfSU5JVDoKKwkJCXM1cF9tZmNfY2xlYW5fY3R4X2ludF9mbGFncyhjdHgpOworCQkJcmV0ID0gczVwX21mY19vcGVuX2luc3RfY21kKGN0eCk7CisJCQlicmVhazsKKwkJY2FzZSBNRkNJTlNUX1JFVFVSTl9JTlNUOgorCQkJczVwX21mY19jbGVhbl9jdHhfaW50X2ZsYWdzKGN0eCk7CisJCQlyZXQgPSBzNXBfbWZjX2Nsb3NlX2luc3RfY21kKGN0eCk7CisJCQlicmVhazsKKwkJY2FzZSBNRkNJTlNUX0dPVF9JTlNUOgorCQkJczVwX21mY19ydW5faW5pdF9lbmMoY3R4KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVBR0FJTjsKKwkJfQorCX0gZWxzZSB7CisJCW1mY19lcnIoIkludmFsaWQgY29udGV4dCB0eXBlOiAlZFxuIiwgY3R4LT50eXBlKTsKKwkJcmV0ID0gLUVBR0FJTjsKKwl9CisKKwlpZiAocmV0KSB7CisJCS8qIEZyZWUgaGFyZHdhcmUgbG9jayAqLworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KDAsICZkZXYtPmh3X2xvY2spID09IDApCisJCQltZmNfZXJyKCJGYWlsZWQgdG8gdW5sb2NrIGhhcmR3YXJlXG4iKTsKKworCQkvKiBUaGlzIGlzIGluIGRlZWQgaW1wb3JhbnQsIGFzIG5vIG9wZXJhdGlvbiBoYXMgYmVlbgorCQkgKiBzY2hlZHVsZWQsIHJlZHVjZSB0aGUgY2xvY2sgY291bnQgYXMgbm8gb25lIHdpbGwKKwkJICogZXZlciBkbyB0aGlzLCBiZWNhdXNlIG5vIGludGVycnVwdCByZWxhdGVkIHRvIHRoaXMgdHJ5X3J1bgorCQkgKiB3aWxsIGV2ZXIgY29tZSBmcm9tIGhhcmR3YXJlLiAqLworCQlzNXBfbWZjX2Nsb2NrX29mZigpOworCX0KK30KKworCit2b2lkIHM1cF9tZmNfY2xlYW51cF9xdWV1ZShzdHJ1Y3QgbGlzdF9oZWFkICpsaCwgc3RydWN0IHZiMl9xdWV1ZSAqdnEpCit7CisJc3RydWN0IHM1cF9tZmNfYnVmICpiOworCWludCBpOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KGxoKSkgeworCQliID0gbGlzdF9lbnRyeShsaC0+bmV4dCwgc3RydWN0IHM1cF9tZmNfYnVmLCBsaXN0KTsKKwkJZm9yIChpID0gMDsgaSA8IGItPmItPm51bV9wbGFuZXM7IGkrKykKKwkJCXZiMl9zZXRfcGxhbmVfcGF5bG9hZChiLT5iLCBpLCAwKTsKKwkJdmIyX2J1ZmZlcl9kb25lKGItPmIsIFZCMl9CVUZfU1RBVEVfRVJST1IpOworCQlsaXN0X2RlbCgmYi0+bGlzdCk7CisJfQorfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19vcHIuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX29wci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiODM4MzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19vcHIuaApAQCAtMCwwICsxLDkxIEBACisvKgorICogZHJpdmVycy9tZWRpYS92aWRlby9zYW1zdW5nL21mYzUvczVwX21mY19vcHIuaAorICoKKyAqIEhlYWRlciBmaWxlIGZvciBTYW1zdW5nIE1GQyAoTXVsdGkgRnVuY3Rpb24gQ29kZWMgLSBGSU1WKSBkcml2ZXIKKyAqIENvbnRhaW5zIGRlY2xhcmF0aW9ucyBvZiBodyByZWxhdGVkIGZ1bmN0aW9ucy4KKyAqCisgKiBLYW1pbCBEZWJza2ksIENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzCisgKiBodHRwOi8vd3d3LnNhbXN1bmcuY29tLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBTNVBfTUZDX09QUl9IXworI2RlZmluZSBTNVBfTUZDX09QUl9IXworCisjaW5jbHVkZSAiczVwX21mY19jb21tb24uaCIKKworaW50IHM1cF9tZmNfaW5pdF9kZWNvZGUoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpOworaW50IHM1cF9tZmNfaW5pdF9lbmNvZGUoc3RydWN0IHM1cF9tZmNfY3R4ICptZmNfY3R4KTsKKworLyogRGVjb2RpbmcgZnVuY3Rpb25zICovCitpbnQgczVwX21mY19zZXRfZGVjX2ZyYW1lX2J1ZmZlcihzdHJ1Y3QgczVwX21mY19jdHggKmN0eCk7CitpbnQgczVwX21mY19zZXRfZGVjX3N0cmVhbV9idWZmZXIoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgsIGludCBidWZfYWRkciwKKwkJCQkJCSAgdW5zaWduZWQgaW50IHN0YXJ0X251bV9ieXRlLAorCQkJCQkJICB1bnNpZ25lZCBpbnQgYnVmX3NpemUpOworCisvKiBFbmNvZGluZyBmdW5jdGlvbnMgKi8KK3ZvaWQgczVwX21mY19zZXRfZW5jX2ZyYW1lX2J1ZmZlcihzdHJ1Y3QgczVwX21mY19jdHggKmN0eCwKKwkJdW5zaWduZWQgbG9uZyB5X2FkZHIsIHVuc2lnbmVkIGxvbmcgY19hZGRyKTsKK2ludCBzNXBfbWZjX3NldF9lbmNfc3RyZWFtX2J1ZmZlcihzdHJ1Y3QgczVwX21mY19jdHggKmN0eCwKKwkJdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBpbnQgc2l6ZSk7Cit2b2lkIHM1cF9tZmNfZ2V0X2VuY19mcmFtZV9idWZmZXIoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgsCisJCXVuc2lnbmVkIGxvbmcgKnlfYWRkciwgdW5zaWduZWQgbG9uZyAqY19hZGRyKTsKK2ludCBzNXBfbWZjX3NldF9lbmNfcmVmX2J1ZmZlcihzdHJ1Y3QgczVwX21mY19jdHggKm1mY19jdHgpOworCitpbnQgczVwX21mY19kZWNvZGVfb25lX2ZyYW1lKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4LAorCQkJCQllbnVtIHM1cF9tZmNfZGVjb2RlX2FyZyBsYXN0X2ZyYW1lKTsKK2ludCBzNXBfbWZjX2VuY29kZV9vbmVfZnJhbWUoc3RydWN0IHM1cF9tZmNfY3R4ICptZmNfY3R4KTsKKworLyogTWVtb3J5IGFsbG9jYXRpb24gKi8KK2ludCBzNXBfbWZjX2FsbG9jX2RlY190ZW1wX2J1ZmZlcnMoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpOwordm9pZCBzNXBfbWZjX3NldF9kZWNfZGVzY19idWZmZXIoc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpOwordm9pZCBzNXBfbWZjX3JlbGVhc2VfZGVjX2Rlc2NfYnVmZmVyKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KTsKKworaW50IHM1cF9tZmNfYWxsb2NfY29kZWNfYnVmZmVycyhzdHJ1Y3QgczVwX21mY19jdHggKmN0eCk7Cit2b2lkIHM1cF9tZmNfcmVsZWFzZV9jb2RlY19idWZmZXJzKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KTsKKworaW50IHM1cF9tZmNfYWxsb2NfaW5zdGFuY2VfYnVmZmVyKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4KTsKK3ZvaWQgczVwX21mY19yZWxlYXNlX2luc3RhbmNlX2J1ZmZlcihzdHJ1Y3QgczVwX21mY19jdHggKmN0eCk7CisKK3ZvaWQgczVwX21mY190cnlfcnVuKHN0cnVjdCBzNXBfbWZjX2RldiAqZGV2KTsKK3ZvaWQgczVwX21mY19jbGVhbnVwX3F1ZXVlKHN0cnVjdCBsaXN0X2hlYWQgKmxoLCBzdHJ1Y3QgdmIyX3F1ZXVlICp2cSk7CisKKyNkZWZpbmUgczVwX21mY19nZXRfZHNwbF95X2FkcigpCShyZWFkbChkZXYtPnJlZ3NfYmFzZSArIFwKKwkJCQkJUzVQX0ZJTVZfU0lfRElTUExBWV9ZX0FEUikgPDwgXAorCQkJCQlNRkNfT0ZGU0VUX1NISUZUKQorI2RlZmluZSBzNXBfbWZjX2dldF9kZWNfeV9hZHIoKQkJKHJlYWRsKGRldi0+cmVnc19iYXNlICsgXAorCQkJCQlTNVBfRklNVl9TSV9ESVNQTEFZX1lfQURSKSA8PCBcCisJCQkJCU1GQ19PRkZTRVRfU0hJRlQpCisjZGVmaW5lIHM1cF9tZmNfZ2V0X2RzcGxfc3RhdHVzKCkJcmVhZGwoZGV2LT5yZWdzX2Jhc2UgKyBcCisJCQkJCQlTNVBfRklNVl9TSV9ESVNQTEFZX1NUQVRVUykKKyNkZWZpbmUgczVwX21mY19nZXRfZnJhbWVfdHlwZSgpCShyZWFkbChkZXYtPnJlZ3NfYmFzZSArIFwKKwkJCQkJCVM1UF9GSU1WX0RFQ09ERV9GUkFNRV9UWVBFKSBcCisJCQkJCSYgUzVQX0ZJTVZfREVDT0RFX0ZSQU1FX01BU0spCisjZGVmaW5lIHM1cF9tZmNfZ2V0X2NvbnN1bWVkX3N0cmVhbSgpCXJlYWRsKGRldi0+cmVnc19iYXNlICsgXAorCQkJCQkJUzVQX0ZJTVZfU0lfQ09OU1VNRURfQllURVMpCisjZGVmaW5lIHM1cF9tZmNfZ2V0X2ludF9yZWFzb24oKQkocmVhZGwoZGV2LT5yZWdzX2Jhc2UgKyBcCisJCQkJCVM1UF9GSU1WX1JJU0MySE9TVF9DTUQpICYgXAorCQkJCQlTNVBfRklNVl9SSVNDMkhPU1RfQ01EX01BU0spCisjZGVmaW5lIHM1cF9tZmNfZ2V0X2ludF9lcnIoKQkJcmVhZGwoZGV2LT5yZWdzX2Jhc2UgKyBcCisJCQkJCQlTNVBfRklNVl9SSVNDMkhPU1RfQVJHMikKKyNkZWZpbmUgczVwX21mY19lcnJfZGVjKHgpCQkoKCh4KSAmIFM1UF9GSU1WX0VSUl9ERUNfTUFTSykgPj4gXAorCQkJCQkJCVM1UF9GSU1WX0VSUl9ERUNfU0hJRlQpCisjZGVmaW5lIHM1cF9tZmNfZXJyX2RzcGwoeCkJCSgoKHgpICYgUzVQX0ZJTVZfRVJSX0RTUExfTUFTSykgPj4gXAorCQkJCQkJCVM1UF9GSU1WX0VSUl9EU1BMX1NISUZUKQorI2RlZmluZSBzNXBfbWZjX2dldF9pbWdfd2lkdGgoKQkJcmVhZGwoZGV2LT5yZWdzX2Jhc2UgKyBcCisJCQkJCQlTNVBfRklNVl9TSV9IUkVTT0wpCisjZGVmaW5lIHM1cF9tZmNfZ2V0X2ltZ19oZWlnaHQoKQlyZWFkbChkZXYtPnJlZ3NfYmFzZSArIFwKKwkJCQkJCVM1UF9GSU1WX1NJX1ZSRVNPTCkKKyNkZWZpbmUgczVwX21mY19nZXRfZHBiX2NvdW50KCkJCXJlYWRsKGRldi0+cmVnc19iYXNlICsgXAorCQkJCQkJUzVQX0ZJTVZfU0lfQlVGX05VTUJFUikKKyNkZWZpbmUgczVwX21mY19nZXRfaW5zdF9ubygpCQlyZWFkbChkZXYtPnJlZ3NfYmFzZSArIFwKKwkJCQkJCVM1UF9GSU1WX1JJU0MySE9TVF9BUkcxKQorI2RlZmluZSBzNXBfbWZjX2dldF9lbmNfc3RybV9zaXplKCkJcmVhZGwoZGV2LT5yZWdzX2Jhc2UgKyBcCisJCQkJCQlTNVBfRklNVl9FTkNfU0lfU1RSTV9TSVpFKQorI2RlZmluZSBzNXBfbWZjX2dldF9lbmNfc2xpY2VfdHlwZSgpCXJlYWRsKGRldi0+cmVnc19iYXNlICsgXAorCQkJCQkJUzVQX0ZJTVZfRU5DX1NJX1NMSUNFX1RZUEUpCisKKyNlbmRpZiAvKiBTNVBfTUZDX09QUl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfcG0uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX3BtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhMzAzNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX3BtLmMKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19wbS5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpZmRlZiBDT05GSUdfUE1fUlVOVElNRQorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNlbmRpZgorI2luY2x1ZGUgInM1cF9tZmNfY29tbW9uLmgiCisjaW5jbHVkZSAiczVwX21mY19kZWJ1Zy5oIgorI2luY2x1ZGUgInM1cF9tZmNfcG0uaCIKKworI2RlZmluZSBNRkNfQ0xLTkFNRQkJInNjbGtfbWZjIgorI2RlZmluZSBNRkNfR0FURV9DTEtfTkFNRQkibWZjIgorCisjZGVmaW5lIENMS19ERUJVRworCitzdGF0aWMgc3RydWN0IHM1cF9tZmNfcG0gKnBtOworc3RhdGljIHN0cnVjdCBzNXBfbWZjX2RldiAqcF9kZXY7CisKKyNpZmRlZiBDTEtfREVCVUcKK2F0b21pY190IGNsa19yZWY7CisjZW5kaWYKKworaW50IHM1cF9tZmNfaW5pdF9wbShzdHJ1Y3QgczVwX21mY19kZXYgKmRldikKK3sKKwlpbnQgcmV0ID0gMDsKKworCXBtID0gJmRldi0+cG07CisJcF9kZXYgPSBkZXY7CisJcG0tPmNsb2NrX2dhdGUgPSBjbGtfZ2V0KCZkZXYtPnBsYXRfZGV2LT5kZXYsIE1GQ19HQVRFX0NMS19OQU1FKTsKKwlpZiAoSVNfRVJSKHBtLT5jbG9ja19nYXRlKSkgeworCQltZmNfZXJyKCJGYWlsZWQgdG8gZ2V0IGNsb2NrLWdhdGluZyBjb250cm9sXG4iKTsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJZ290byBlcnJfZ19pcF9jbGs7CisJfQorCXBtLT5jbG9jayA9IGNsa19nZXQoJmRldi0+cGxhdF9kZXYtPmRldiwgTUZDX0NMS05BTUUpOworCWlmIChJU19FUlIocG0tPmNsb2NrKSkgeworCQltZmNfZXJyKCJGYWlsZWQgdG8gZ2V0IE1GQyBjbG9ja1xuIik7CisJCXJldCA9IC1FTk9FTlQ7CisJCWdvdG8gZXJyX2dfaXBfY2xrXzI7CisJfQorCWF0b21pY19zZXQoJnBtLT5wb3dlciwgMCk7CisjaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKKwlwbS0+ZGV2aWNlID0gJmRldi0+cGxhdF9kZXYtPmRldjsKKwlwbV9ydW50aW1lX2VuYWJsZShwbS0+ZGV2aWNlKTsKKyNlbmRpZgorI2lmZGVmIENMS19ERUJVRworCWF0b21pY19zZXQoJmNsa19yZWYsIDApOworI2VuZGlmCisJcmV0dXJuIDA7CitlcnJfZ19pcF9jbGtfMjoKKwljbGtfcHV0KHBtLT5jbG9ja19nYXRlKTsKK2Vycl9nX2lwX2NsazoKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIHM1cF9tZmNfZmluYWxfcG0oc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYpCit7CisJY2xrX3B1dChwbS0+Y2xvY2tfZ2F0ZSk7CisJY2xrX3B1dChwbS0+Y2xvY2spOworI2lmZGVmIENPTkZJR19QTV9SVU5USU1FCisJcG1fcnVudGltZV9kaXNhYmxlKHBtLT5kZXZpY2UpOworI2VuZGlmCit9CisKK2ludCBzNXBfbWZjX2Nsb2NrX29uKHZvaWQpCit7CisJaW50IHJldDsKKyNpZmRlZiBDTEtfREVCVUcKKwlhdG9taWNfaW5jKCZjbGtfcmVmKTsKKwltZmNfZGVidWcoMywgIisgJWQiLCBhdG9taWNfcmVhZCgmY2xrX3JlZikpOworI2VuZGlmCisJcmV0ID0gY2xrX2VuYWJsZShwbS0+Y2xvY2tfZ2F0ZSk7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBzNXBfbWZjX2Nsb2NrX29mZih2b2lkKQoreworI2lmZGVmIENMS19ERUJVRworCWF0b21pY19kZWMoJmNsa19yZWYpOworCW1mY19kZWJ1ZygzLCAiLSAlZCIsIGF0b21pY19yZWFkKCZjbGtfcmVmKSk7CisjZW5kaWYKKwljbGtfZGlzYWJsZShwbS0+Y2xvY2tfZ2F0ZSk7Cit9CisKK2ludCBzNXBfbWZjX3Bvd2VyX29uKHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKKwlyZXR1cm4gcG1fcnVudGltZV9nZXRfc3luYyhwbS0+ZGV2aWNlKTsKKyNlbHNlCisJYXRvbWljX3NldCgmcG0tPnBvd2VyLCAxKTsKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCitpbnQgczVwX21mY19wb3dlcl9vZmYodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfUE1fUlVOVElNRQorCXJldHVybiBwbV9ydW50aW1lX3B1dF9zeW5jKHBtLT5kZXZpY2UpOworI2Vsc2UKKwlhdG9taWNfc2V0KCZwbS0+cG93ZXIsIDApOworCXJldHVybiAwOworI2VuZGlmCit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfcG0uaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX3BtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEwNzkxNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX3BtLmgKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX3BtLmgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmbmRlZiBTNVBfTUZDX1BNX0hfCisjZGVmaW5lIFM1UF9NRkNfUE1fSF8KKworaW50IHM1cF9tZmNfaW5pdF9wbShzdHJ1Y3QgczVwX21mY19kZXYgKmRldik7Cit2b2lkIHM1cF9tZmNfZmluYWxfcG0oc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYpOworCitpbnQgczVwX21mY19jbG9ja19vbih2b2lkKTsKK3ZvaWQgczVwX21mY19jbG9ja19vZmYodm9pZCk7CitpbnQgczVwX21mY19wb3dlcl9vbih2b2lkKTsKK2ludCBzNXBfbWZjX3Bvd2VyX29mZih2b2lkKTsKKworI2VuZGlmIC8qIFM1UF9NRkNfUE1fSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX3NobS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfc2htLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFmZGJhYzgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19zaG0uYwpAQCAtMCwwICsxLDQ3IEBACisvKgorICogbGludXgvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfc2htLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCQlodHRwOi8vd3d3LnNhbXN1bmcuY29tLworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2lmZGVmIENPTkZJR19BUkNIX0VYWU5PUzQKKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2VuZGlmCisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlICJzNXBfbWZjX2NvbW1vbi5oIgorI2luY2x1ZGUgInM1cF9tZmNfZGVidWcuaCIKKworaW50IHM1cF9tZmNfaW5pdF9zaG0oc3RydWN0IHM1cF9tZmNfY3R4ICpjdHgpCit7CisJc3RydWN0IHM1cF9tZmNfZGV2ICpkZXYgPSBjdHgtPmRldjsKKwl2b2lkICpzaG1fYWxsb2NfY3R4ID0gZGV2LT5hbGxvY19jdHhbTUZDX0JBTksxX0FMTE9DX0NUWF07CisKKwljdHgtPnNobV9hbGxvYyA9IHZiMl9kbWFfY29udGlnX21lbW9wcy5hbGxvYyhzaG1fYWxsb2NfY3R4LAorCQkJCQkJCVNIQVJFRF9CVUZfU0laRSk7CisJaWYgKElTX0VSUihjdHgtPnNobV9hbGxvYykpIHsKKwkJbWZjX2VycigiZmFpbGVkIHRvIGFsbG9jYXRlIHNoYXJlZCBtZW1vcnlcbiIpOworCQlyZXR1cm4gUFRSX0VSUihjdHgtPnNobV9hbGxvYyk7CisJfQorCS8qIHNobV9vZnMgb25seSBrZWVwcyB0aGUgb2Zmc2V0IGZyb20gYmFzZSAocG9ydCBhKSAqLworCWN0eC0+c2htX29mcyA9IHM1cF9tZmNfbWVtX2Nvb2tpZShzaG1fYWxsb2NfY3R4LCBjdHgtPnNobV9hbGxvYykKKwkJCQkJCQkJLSBkZXYtPmJhbmsxOworCUJVR19PTihjdHgtPnNobV9vZnMgJiAoKDEgPDwgTUZDX0JBTksxX0FMSUdOX09SREVSKSAtIDEpKTsKKwljdHgtPnNobSA9IHZiMl9kbWFfY29udGlnX21lbW9wcy52YWRkcihjdHgtPnNobV9hbGxvYyk7CisJaWYgKCFjdHgtPnNobSkgeworCQl2YjJfZG1hX2NvbnRpZ19tZW1vcHMucHV0KGN0eC0+c2htX2FsbG9jKTsKKwkJY3R4LT5zaG1fb2ZzID0gMDsKKwkJY3R4LT5zaG1fYWxsb2MgPSBOVUxMOworCQltZmNfZXJyKCJmYWlsZWQgdG8gdmlydCBhZGRyIG9mIHNoYXJlZCBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KCh2b2lkICopY3R4LT5zaG0sIDAsIFNIQVJFRF9CVUZfU0laRSk7CisJd21iKCk7CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX3NobS5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfc2htLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY0ZWFjNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX3NobS5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1tZmMvczVwX21mY19zaG0uaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoJCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaWZuZGVmIFM1UF9NRkNfU0hNX0hfCisjZGVmaW5lIFM1UF9NRkNfU0hNX0hfCisKK2VudW0gTUZDX1NITV9PRlMKK3sKKwlFWFRFTkVERURfREVDT0RFX1NUQVRVUwk9IDB4MDAsCS8qIEQgKi8KKwlTRVRfRlJBTUVfVEFHCQk9IDB4MDQsIC8qIEQgKi8KKwlHRVRfRlJBTUVfVEFHX1RPUAk9IDB4MDgsIC8qIEQgKi8KKwlHRVRfRlJBTUVfVEFHX0JPVAk9IDB4MEMsIC8qIEQgKi8KKwlQSUNfVElNRV9UT1AJCT0gMHgxMCwgLyogRCAqLworCVBJQ19USU1FX0JPVAkJPSAweDE0LCAvKiBEICovCisJU1RBUlRfQllURV9OVU0JCT0gMHgxOCwgLyogRCAqLworCisJQ1JPUF9JTkZPX0gJCT0gMHgyMCwgLyogRCAqLworCUNST1BfSU5GT19WCQk9IDB4MjQsIC8qIEQgKi8KKwlFWFRfRU5DX0NPTlRST0wJCT0gMHgyOCwJLyogRSAqLworCUVOQ19QQVJBTV9DSEFOR0UJPSAweDJDLAkvKiBFICovCisJUkNfVk9QX1RJTUlORwkJPSAweDMwLAkvKiBFLCBNUEVHNCAqLworCUhFQ19QRVJJT0QJCT0gMHgzNCwJLyogRSwgTVBFRzQgKi8KKwlNRVRBREFUQV9FTkFCTEUJCT0gMHgzOCwgLyogQyAqLworCU1FVEFEQVRBX1NUQVRVUwkJPSAweDNDLCAvKiBDICovCisJTUVUQURBVEFfRElTUExBWV9JTkRFWAk9IDB4NDAsCS8qIEMgKi8KKwlFWFRfTUVUQURBVEFfU1RBUlRfQUREUgk9IDB4NDQsIC8qIEMgKi8KKwlQVVRfRVhUUkFEQVRBCQk9IDB4NDgsIC8qIEMgKi8KKwlFWFRSQURBVEFfQUREUgkJPSAweDRDLCAvKiBDICovCisKKwlBTExPQ19MVU1BX0RQQl9TSVpFCT0gMHg2NCwJLyogRCAqLworCUFMTE9DX0NIUk9NQV9EUEJfU0laRQk9IDB4NjgsCS8qIEQgKi8KKwlBTExPQ19NVl9TSVpFCQk9IDB4NkMsCS8qIEQgKi8KKwlQX0JfRlJBTUVfUVAJCT0gMHg3MCwJLyogRSAqLworCVNBTVBMRV9BU1BFQ1RfUkFUSU9fSURDCT0gMHg3NCwgLyogRSwgSC4yNjQsIGRlcGVuZCBvbgorCQkJCUFTUEVDVF9SQVRJT19WVUlfRU5BQkxFIGluIEVYVF9FTkNfQ09OVFJPTCAqLworCUVYVEVOREVEX1NBUgkJPSAweDc4LCAvKiBFLCBILjI2NCwgZGVwbmVkIG9uCisJCQkJQVNQRUNUX1JBVElPX1ZVSV9FTkFCTEUgaW4gRVhUX0VOQ19DT05UUk9MICovCisJRElTUF9QSUNfUFJPRklMRQk9IDB4N0MsIC8qIEQgKi8KKwlGTFVTSF9DTURfVFlQRQkJPSAweDgwLCAvKiBDICovCisJRkxVU0hfQ01EX0lOQlVGMQk9IDB4ODQsIC8qIEMgKi8KKwlGTFVTSF9DTURfSU5CVUYyCT0gMHg4OCwgLyogQyAqLworCUZMVVNIX0NNRF9PVVRCVUYJPSAweDhDLCAvKiBFICovCisJTkVXX1JDX0JJVF9SQVRFCQk9IDB4OTAsIC8qIEUsIGZvcm1hdCBhcyBSQ19CSVRfUkFURSgweEM1QTgpCisJCQlkZXBlbmQgb24gUkNfQklUX1JBVEVfQ0hBTkdFIGluIEVOQ19QQVJBTV9DSEFOR0UgKi8KKwlORVdfUkNfRlJBTUVfUkFURQk9IDB4OTQsIC8qIEUsIGZvcm1hdCBhcyBSQ19GUkFNRV9SQVRFKDB4RDBEMCkKKwkJCWRlcGVuZCBvbiBSQ19GUkFNRV9SQVRFX0NIQU5HRSBpbiBFTkNfUEFSQU1fQ0hBTkdFICovCisJTkVXX0lfUEVSSU9ECQk9IDB4OTgsIC8qIEUsIGZvcm1hdCBhcyBJX0ZSTV9DVFJMKDB4QzUwNCkKKwkJCWRlcGVuZCBvbiBJX1BFUklPRF9DSEFOR0UgaW4gRU5DX1BBUkFNX0NIQU5HRSAqLworCUgyNjRfSV9QRVJJT0QJCT0gMHg5QywgLyogRSwgSC4yNjQsIG9wZW4gR09QICovCisJUkNfQ09OVFJPTF9DT05GSUcJPSAweEEwLCAvKiBFICovCisJQkFUQ0hfSU5QVVRfQUREUgk9IDB4QTQsIC8qIEUgKi8KKwlCQVRDSF9PVVRQVVRfQUREUgk9IDB4QTgsIC8qIEUgKi8KKwlCQVRDSF9PVVRQVVRfU0laRQk9IDB4QUMsIC8qIEUgKi8KKwlNSU5fTFVNQV9EUEJfU0laRQk9IDB4QjAsIC8qIEQgKi8KKwlERVZJQ0VfRk9STUFUX0lECT0gMHhCNCwgLyogQyAqLworCUgyNjRfUE9DX1RZUEUJCT0gMHhCOCwgLyogRCAqLworCU1JTl9DSFJPTUFfRFBCX1NJWkUJPSAweEJDLCAvKiBEICovCisJRElTUF9QSUNfRlJBTUVfVFlQRQk9IDB4QzAsIC8qIEQgKi8KKwlGUkVFX0xVTUFfRFBCCQk9IDB4QzQsIC8qIEQsIFZDMSBNUEVHNCAqLworCUFTUEVDVF9SQVRJT19JTkZPCT0gMHhDOCwgLyogRCwgTVBFRzQgKi8KKwlFWFRFTkRFRF9QQVIJCT0gMHhDQywgLyogRCwgTVBFRzQgKi8KKwlEQkdfSElTVE9SWV9JTlBVVDAJPSAweEQwLCAvKiBDICovCisJREJHX0hJU1RPUllfSU5QVVQxCT0gMHhENCwJLyogQyAqLworCURCR19ISVNUT1JZX09VVFBVVAk9IDB4RDgsCS8qIEMgKi8KKwlISUVSQVJDSElDQUxfUF9RUAk9IDB4RTAsIC8qIEUsIEguMjY0ICovCit9OworCitpbnQgczVwX21mY19pbml0X3NobShzdHJ1Y3QgczVwX21mY19jdHggKmN0eCk7CisKKyNkZWZpbmUgczVwX21mY193cml0ZV9zaG0oY3R4LCB4LCBvZnMpCQlcCisJZG8gewkJCQkJXAorCQl3cml0ZWwoeCwgKGN0eC0+c2htICsgb2ZzKSk7CVwKKwkJd21iKCk7CQkJCVwKKwl9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIHUzMiBzNXBfbWZjX3JlYWRfc2htKHN0cnVjdCBzNXBfbWZjX2N0eCAqY3R4LCB1bnNpZ25lZCBpbnQgb2ZzKQoreworCXJtYigpOworCXJldHVybiByZWFkbChjdHgtPnNobSArIG9mcyk7Cit9CisKKyNlbmRpZiAvKiBTNVBfTUZDX1NITV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvS2NvbmZpZyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMzN2RlZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L0tjb25maWcKQEAgLTAsMCArMSw3NiBAQAorIyBkcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9LY29uZmlnCisjCisjIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisjCWh0dHA6Ly93d3cuc2Ftc3VuZy5jb20vCisjIFRvbWFzeiBTdGFuaXNsYXdza2kgPHQuc3RhbmlzbGF3c0BzYW1zdW5nLmNvbT4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMCisKK2NvbmZpZyBWSURFT19TQU1TVU5HX1M1UF9UVgorCWJvb2wgIlNhbXN1bmcgVFYgZHJpdmVyIGZvciBTNVAgcGxhdGZvcm0gKGV4cGVyaW1lbnRhbCkiCisJZGVwZW5kcyBvbiBQTEFUX1M1UAorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCisJZGVmYXVsdCBuCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgc2VsZWN0aW5nIHRoZSBUViBvdXRwdXQgZGV2aWNlcyBmb3IKKwkgIFNhbXN1bmcgUzVQIHBsYXRmb3JtLgorCitpZiBWSURFT19TQU1TVU5HX1M1UF9UVgorCitjb25maWcgVklERU9fU0FNU1VOR19TNVBfSERNSQorCXRyaXN0YXRlICJTYW1zdW5nIEhETUkgRHJpdmVyIgorCWRlcGVuZHMgb24gVklERU9fVjRMMgorCWRlcGVuZHMgb24gVklERU9fU0FNU1VOR19TNVBfVFYKKwlzZWxlY3QgVklERU9fU0FNU1VOR19TNVBfSERNSVBIWQorCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgdGhlIEhETUkgb3V0cHV0CisJICBpbnRlcmZhY2UgaW4gUzVQIFNhbXN1bmcgU29DLiBUaGUgZHJpdmVyIGNhbiBiZSBjb21waWxlZAorCSAgYXMgbW9kdWxlLiBJdCBpcyBhbiBhdXhpbGlhcnkgZHJpdmVyLCB0aGF0IGV4cG9zZXMgYSBWNEwyCisJICBzdWJkZXYgZm9yIHVzZSBieSBvdGhlciBkcml2ZXJzLiBUaGlzIGRyaXZlciByZXF1aXJlcworCSAgaGRtaXBoeSBkcml2ZXIgdG8gd29yayBjb3JyZWN0bHkuCisKK2NvbmZpZyBWSURFT19TQU1TVU5HX1M1UF9IRE1JX0RFQlVHCisJYm9vbCAiRW5hYmxlIGRlYnVnIGZvciBIRE1JIERyaXZlciIKKwlkZXBlbmRzIG9uIFZJREVPX1NBTVNVTkdfUzVQX0hETUkKKwlkZWZhdWx0IG4KKwloZWxwCisJICBFbmFibGVzIGRlYnVnZ2luZyBmb3IgSERNSSBkcml2ZXIuCisKK2NvbmZpZyBWSURFT19TQU1TVU5HX1M1UF9IRE1JUEhZCisJdHJpc3RhdGUgIlNhbXN1bmcgSERNSVBIWSBEcml2ZXIiCisJZGVwZW5kcyBvbiBWSURFT19ERVYgJiYgVklERU9fVjRMMiAmJiBJMkMKKwlkZXBlbmRzIG9uIFZJREVPX1NBTVNVTkdfUzVQX1RWCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciB0aGUgcGh5c2ljYWwgSERNSQorCSAgaW50ZXJmYWNlIGluIFM1UCBTYW1zdW5nIFNvQy4gVGhlIGRyaXZlciBjYW4gYmUgY29tcGlsZWQKKwkgIGFzIG1vZHVsZS4gSXQgaXMgYW4gSTJDIGRyaXZlciwgdGhhdCBleHBvc2VzIGEgVjRMMgorCSAgc3ViZGV2IGZvciB1c2UgYnkgb3RoZXIgZHJpdmVycy4KKworY29uZmlnIFZJREVPX1NBTVNVTkdfUzVQX1NETworCXRyaXN0YXRlICJTYW1zdW5nIEFuYWxvZyBUViBEcml2ZXIiCisJZGVwZW5kcyBvbiBWSURFT19ERVYgJiYgVklERU9fVjRMMgorCWRlcGVuZHMgb24gVklERU9fU0FNU1VOR19TNVBfVFYKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHN1cHBvcnQgZm9yIHRoZSBhbmFsb2cgVFYgb3V0cHV0CisJICBpbnRlcmZhY2UgaW4gUzVQIFNhbXN1bmcgU29DLiBUaGUgZHJpdmVyIGNhbiBiZSBjb21waWxlZAorCSAgYXMgbW9kdWxlLiBJdCBpcyBhbiBhdXhpbGlhcnkgZHJpdmVyLCB0aGF0IGV4cG9zZXMgYSBWNEwyCisJICBzdWJkZXYgZm9yIHVzZSBieSBvdGhlciBkcml2ZXJzLiBUaGlzIGRyaXZlciByZXF1aXJlcworCSAgaGRtaXBoeSBkcml2ZXIgdG8gd29yayBjb3JyZWN0bHkuCisKK2NvbmZpZyBWSURFT19TQU1TVU5HX1M1UF9NSVhFUgorCXRyaXN0YXRlICJTYW1zdW5nIE1peGVyIGFuZCBWaWRlbyBQcm9jZXNzb3IgRHJpdmVyIgorCWRlcGVuZHMgb24gVklERU9fREVWICYmIFZJREVPX1Y0TDIKKwlkZXBlbmRzIG9uIFZJREVPX1NBTVNVTkdfUzVQX1RWCisJc2VsZWN0IFZJREVPQlVGMl9ETUFfQ09OVElHCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCBzdXBwb3J0IGZvciB0aGUgTWl4ZXIgaW4gU2Ftc3VuZyBTNVAgU29Dcy4KKwkgIFRoaXMgZGV2aWNlIHByb2R1Y2UgaW1hZ2UgZGF0YSB0byBvbmUgb2Ygb3V0cHV0IGludGVyZmFjZXMuCisKK2NvbmZpZyBWSURFT19TQU1TVU5HX1M1UF9NSVhFUl9ERUJVRworCWJvb2wgIkVuYWJsZSBkZWJ1ZyBmb3IgTWl4ZXIgRHJpdmVyIgorCWRlcGVuZHMgb24gVklERU9fU0FNU1VOR19TNVBfTUlYRVIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBFbmFibGVzIGRlYnVnZ2luZyBmb3IgTWl4ZXIgZHJpdmVyLgorCitlbmRpZiAjIFZJREVPX1NBTVNVTkdfUzVQX1RWCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9NYWtlZmlsZSBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZTRjMTcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9NYWtlZmlsZQpAQCAtMCwwICsxLDE3IEBACisjIGRyaXZlcnMvbWVkaWEvdmlkZW8vc2Ftc3VuZy90dm91dC9NYWtlZmlsZQorIworIyBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorIwlodHRwOi8vd3d3LnNhbXN1bmcuY29tLworIyBUb21hc3ogU3RhbmlzbGF3c2tpIDx0LnN0YW5pc2xhd3NAc2Ftc3VuZy5jb20+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTAorCitvYmotJChDT05GSUdfVklERU9fU0FNU1VOR19TNVBfSERNSVBIWSkgKz0gczVwLWhkbWlwaHkubworczVwLWhkbWlwaHkteSArPSBoZG1pcGh5X2Rydi5vCitvYmotJChDT05GSUdfVklERU9fU0FNU1VOR19TNVBfSERNSSkgKz0gczVwLWhkbWkubworczVwLWhkbWkteSArPSBoZG1pX2Rydi5vCitvYmotJChDT05GSUdfVklERU9fU0FNU1VOR19TNVBfU0RPKSArPSBzNXAtc2RvLm8KK3M1cC1zZG8teSArPSBzZG9fZHJ2Lm8KK29iai0kKENPTkZJR19WSURFT19TQU1TVU5HX1M1UF9NSVhFUikgKz0gczVwLW1peGVyLm8KK3M1cC1taXhlci15ICs9IG1peGVyX2Rydi5vIG1peGVyX3ZpZGVvLm8gbWl4ZXJfcmVnLm8gbWl4ZXJfZ3JwX2xheWVyLm8gbWl4ZXJfdnBfbGF5ZXIubworCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9oZG1pX2Rydi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvaGRtaV9kcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmQ2NjYzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvaGRtaV9kcnYuYwpAQCAtMCwwICsxLDEwNDIgQEAKKy8qCisgKiBTYW1zdW5nIEhETUkgaW50ZXJmYWNlIGRyaXZlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgorICogVG9tYXN6IFN0YW5pc2xhd3NraSwgPHQuc3RhbmlzbGF3c0BzYW1zdW5nLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kaWF0aW9uLiBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLAorICogb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbgorICovCisKKyNpZmRlZiBDT05GSUdfVklERU9fU0FNU1VOR19TNVBfSERNSV9ERUJVRworI2RlZmluZSBERUJVRworI2VuZGlmCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvYnVnLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgorCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CisKKyNpbmNsdWRlICJyZWdzLWhkbWkuaCIKKworTU9EVUxFX0FVVEhPUigiVG9tYXN6IFN0YW5pc2xhd3NraSwgPHQuc3RhbmlzbGF3c0BzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU2Ftc3VuZyBIRE1JIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qIGRlZmF1bHQgcHJlc2V0IGNvbmZpZ3VyZWQgb24gcHJvYmUgKi8KKyNkZWZpbmUgSERNSV9ERUZBVUxUX1BSRVNFVCBWNEwyX0RWXzEwODBQNjAKKworc3RydWN0IGhkbWlfcmVzb3VyY2VzIHsKKwlzdHJ1Y3QgY2xrICpoZG1pOworCXN0cnVjdCBjbGsgKnNjbGtfaGRtaTsKKwlzdHJ1Y3QgY2xrICpzY2xrX3BpeGVsOworCXN0cnVjdCBjbGsgKnNjbGtfaGRtaXBoeTsKKwlzdHJ1Y3QgY2xrICpoZG1pcGh5OworCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhICpyZWd1bF9idWxrOworCWludCByZWd1bF9jb3VudDsKK307CisKK3N0cnVjdCBoZG1pX2RldmljZSB7CisJLyoqIGJhc2UgYWRkcmVzcyBvZiBIRE1JIHJlZ2lzdGVycyAqLworCXZvaWQgX19pb21lbSAqcmVnczsKKwkvKiogSERNSSBpbnRlcnJ1cHQgKi8KKwl1bnNpZ25lZCBpbnQgaXJxOworCS8qKiBwb2ludGVyIHRvIGRldmljZSBwYXJlbnQgKi8KKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJLyoqIHN1YmRldiBnZW5lcmF0ZWQgYnkgSERNSSBkZXZpY2UgKi8KKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgc2Q7CisJLyoqIFY0TDIgZGV2aWNlIHN0cnVjdHVyZSAqLworCXN0cnVjdCB2NGwyX2RldmljZSB2NGwyX2RldjsKKwkvKiogc3ViZGV2IG9mIEhETUlQSFkgaW50ZXJmYWNlICovCisJc3RydWN0IHY0bDJfc3ViZGV2ICpwaHlfc2Q7CisJLyoqIGNvbmZpZ3VyYXRpb24gb2YgY3VycmVudCBncmFwaGljIG1vZGUgKi8KKwljb25zdCBzdHJ1Y3QgaGRtaV9wcmVzZXRfY29uZiAqY3VyX2NvbmY7CisJLyoqIGN1cnJlbnQgcHJlc2V0ICovCisJdTMyIGN1cl9wcmVzZXQ7CisJLyoqIG90aGVyIHJlc291cmNlcyAqLworCXN0cnVjdCBoZG1pX3Jlc291cmNlcyByZXM7Cit9OworCitzdHJ1Y3QgaGRtaV9kcml2ZXJfZGF0YSB7CisJaW50IGhkbWlwaHlfYnVzOworfTsKKworc3RydWN0IGhkbWlfdGdfcmVncyB7CisJdTggY21kOworCXU4IGhfZnN6X2w7CisJdTggaF9mc3pfaDsKKwl1OCBoYWN0X3N0X2w7CisJdTggaGFjdF9zdF9oOworCXU4IGhhY3Rfc3pfbDsKKwl1OCBoYWN0X3N6X2g7CisJdTggdl9mc3pfbDsKKwl1OCB2X2Zzel9oOworCXU4IHZzeW5jX2w7CisJdTggdnN5bmNfaDsKKwl1OCB2c3luYzJfbDsKKwl1OCB2c3luYzJfaDsKKwl1OCB2YWN0X3N0X2w7CisJdTggdmFjdF9zdF9oOworCXU4IHZhY3Rfc3pfbDsKKwl1OCB2YWN0X3N6X2g7CisJdTggZmllbGRfY2hnX2w7CisJdTggZmllbGRfY2hnX2g7CisJdTggdmFjdF9zdDJfbDsKKwl1OCB2YWN0X3N0Ml9oOworCXU4IHZzeW5jX3RvcF9oZG1pX2w7CisJdTggdnN5bmNfdG9wX2hkbWlfaDsKKwl1OCB2c3luY19ib3RfaGRtaV9sOworCXU4IHZzeW5jX2JvdF9oZG1pX2g7CisJdTggZmllbGRfdG9wX2hkbWlfbDsKKwl1OCBmaWVsZF90b3BfaGRtaV9oOworCXU4IGZpZWxkX2JvdF9oZG1pX2w7CisJdTggZmllbGRfYm90X2hkbWlfaDsKK307CisKK3N0cnVjdCBoZG1pX2NvcmVfcmVncyB7CisJdTggaF9ibGFua1syXTsKKwl1OCB2X2JsYW5rWzNdOworCXU4IGhfdl9saW5lWzNdOworCXU4IHZzeW5jX3BvbFsxXTsKKwl1OCBpbnRfcHJvX21vZGVbMV07CisJdTggdl9ibGFua19mWzNdOworCXU4IGhfc3luY19nZW5bM107CisJdTggdl9zeW5jX2dlbjFbM107CisJdTggdl9zeW5jX2dlbjJbM107CisJdTggdl9zeW5jX2dlbjNbM107Cit9OworCitzdHJ1Y3QgaGRtaV9wcmVzZXRfY29uZiB7CisJc3RydWN0IGhkbWlfY29yZV9yZWdzIGNvcmU7CisJc3RydWN0IGhkbWlfdGdfcmVncyB0ZzsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IG1idXNfZm10OworfTsKKworLyogSTJDIG1vZHVsZSBhbmQgaWQgZm9yIEhETUlQSFkgKi8KK3N0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gaGRtaXBoeV9pbmZvID0geworCUkyQ19CT0FSRF9JTkZPKCJoZG1pcGh5IiwgMHgzOCksCit9OworCitzdGF0aWMgc3RydWN0IGhkbWlfZHJpdmVyX2RhdGEgaGRtaV9kcml2ZXJfZGF0YVtdID0geworCXsgLmhkbWlwaHlfYnVzID0gMyB9LAorCXsgLmhkbWlwaHlfYnVzID0gOCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgaGRtaV9kcml2ZXJfdHlwZXNbXSA9IHsKKwl7CisJCS5uYW1lCQk9ICJzNXB2MjEwLWhkbWkiLAorCQkuZHJpdmVyX2RhdGEJPSAodW5zaWduZWQgbG9uZykmaGRtaV9kcml2ZXJfZGF0YVswXSwKKwl9LCB7CisJCS5uYW1lCQk9ICJleHlub3M0LWhkbWkiLAorCQkuZHJpdmVyX2RhdGEJPSAodW5zaWduZWQgbG9uZykmaGRtaV9kcml2ZXJfZGF0YVsxXSwKKwl9LCB7CisJCS8qIGVuZCBub2RlICovCisJfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgaGRtaV9zZF9vcHM7CisKK3N0YXRpYyBzdHJ1Y3QgaGRtaV9kZXZpY2UgKnNkX3RvX2hkbWlfZGV2KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IGhkbWlfZGV2aWNlLCBzZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgaGRtaV93cml0ZShzdHJ1Y3QgaGRtaV9kZXZpY2UgKmhkZXYsIHUzMiByZWdfaWQsIHUzMiB2YWx1ZSkKK3sKKwl3cml0ZWwodmFsdWUsIGhkZXYtPnJlZ3MgKyByZWdfaWQpOworfQorCitzdGF0aWMgaW5saW5lCit2b2lkIGhkbWlfd3JpdGVfbWFzayhzdHJ1Y3QgaGRtaV9kZXZpY2UgKmhkZXYsIHUzMiByZWdfaWQsIHUzMiB2YWx1ZSwgdTMyIG1hc2spCit7CisJdTMyIG9sZCA9IHJlYWRsKGhkZXYtPnJlZ3MgKyByZWdfaWQpOworCXZhbHVlID0gKHZhbHVlICYgbWFzaykgfCAob2xkICYgfm1hc2spOworCXdyaXRlbCh2YWx1ZSwgaGRldi0+cmVncyArIHJlZ19pZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgaGRtaV93cml0ZWIoc3RydWN0IGhkbWlfZGV2aWNlICpoZGV2LCB1MzIgcmVnX2lkLCB1OCB2YWx1ZSkKK3sKKwl3cml0ZWIodmFsdWUsIGhkZXYtPnJlZ3MgKyByZWdfaWQpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBoZG1pX3JlYWQoc3RydWN0IGhkbWlfZGV2aWNlICpoZGV2LCB1MzIgcmVnX2lkKQoreworCXJldHVybiByZWFkbChoZGV2LT5yZWdzICsgcmVnX2lkKTsKK30KKworc3RhdGljIGlycXJldHVybl90IGhkbWlfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2RhdGEpCit7CisJc3RydWN0IGhkbWlfZGV2aWNlICpoZGV2ID0gZGV2X2RhdGE7CisJdTMyIGludGNfZmxhZzsKKworCSh2b2lkKWlycTsKKwlpbnRjX2ZsYWcgPSBoZG1pX3JlYWQoaGRldiwgSERNSV9JTlRDX0ZMQUcpOworCS8qIGNsZWFyaW5nIGZsYWdzIGZvciBIUEQgcGx1Zy91bnBsdWcgKi8KKwlpZiAoaW50Y19mbGFnICYgSERNSV9JTlRDX0ZMQUdfSFBEX1VOUExVRykgeworCQlwcmludGsoS0VSTl9JTkZPICJ1bnBsdWdnZWRcbiIpOworCQloZG1pX3dyaXRlX21hc2soaGRldiwgSERNSV9JTlRDX0ZMQUcsIH4wLAorCQkJSERNSV9JTlRDX0ZMQUdfSFBEX1VOUExVRyk7CisJfQorCWlmIChpbnRjX2ZsYWcgJiBIRE1JX0lOVENfRkxBR19IUERfUExVRykgeworCQlwcmludGsoS0VSTl9JTkZPICJwbHVnZ2VkXG4iKTsKKwkJaGRtaV93cml0ZV9tYXNrKGhkZXYsIEhETUlfSU5UQ19GTEFHLCB+MCwKKwkJCUhETUlfSU5UQ19GTEFHX0hQRF9QTFVHKTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIGhkbWlfcmVnX2luaXQoc3RydWN0IGhkbWlfZGV2aWNlICpoZGV2KQoreworCS8qIGVuYWJsZSBIUEQgaW50ZXJydXB0cyAqLworCWhkbWlfd3JpdGVfbWFzayhoZGV2LCBIRE1JX0lOVENfQ09OLCB+MCwgSERNSV9JTlRDX0VOX0dMT0JBTCB8CisJCUhETUlfSU5UQ19FTl9IUERfUExVRyB8IEhETUlfSU5UQ19FTl9IUERfVU5QTFVHKTsKKwkvKiBjaG9vc2UgSERNSSBtb2RlICovCisJaGRtaV93cml0ZV9tYXNrKGhkZXYsIEhETUlfTU9ERV9TRUwsCisJCUhETUlfTU9ERV9IRE1JX0VOLCBIRE1JX01PREVfTUFTSyk7CisJLyogZGlzYWJsZSBibHVlc2NyZWVuICovCisJaGRtaV93cml0ZV9tYXNrKGhkZXYsIEhETUlfQ09OXzAsIDAsIEhETUlfQkxVRV9TQ1JfRU4pOworCS8qIGNob29zZSBibHVlc2NyZWVuIChmZWNhbCkgY29sb3IgKi8KKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX0JMVUVfU0NSRUVOXzAsIDB4MTIpOworCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfQkxVRV9TQ1JFRU5fMSwgMHgzNCk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9CTFVFX1NDUkVFTl8yLCAweDU2KTsKKwkvKiBlbmFibGUgQVZJIHBhY2tldCBldmVyeSB2c3luYywgZml4ZXMgcHVycGxlIGxpbmUgcHJvYmxlbSAqLworCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfQVZJX0NPTiwgMHgwMik7CisJLyogZm9yY2UgWVVWNDQ0LCBsb29rIHRvIENFQS04NjEtRCwgdGFibGUgNyBmb3IgbW9yZSBkZXRhaWwgKi8KKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX0FWSV9CWVRFKDApLCAyIDw8IDUpOworCWhkbWlfd3JpdGVfbWFzayhoZGV2LCBIRE1JX0NPTl8xLCAyLCAzIDw8IDUpOworfQorCitzdGF0aWMgdm9pZCBoZG1pX3RpbWluZ19hcHBseShzdHJ1Y3QgaGRtaV9kZXZpY2UgKmhkZXYsCisJY29uc3Qgc3RydWN0IGhkbWlfcHJlc2V0X2NvbmYgKmNvbmYpCit7CisJY29uc3Qgc3RydWN0IGhkbWlfY29yZV9yZWdzICpjb3JlID0gJmNvbmYtPmNvcmU7CisJY29uc3Qgc3RydWN0IGhkbWlfdGdfcmVncyAqdGcgPSAmY29uZi0+dGc7CisKKwkvKiBzZXR0aW5nIGNvcmUgcmVnaXN0ZXJzICovCisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9IX0JMQU5LXzAsIGNvcmUtPmhfYmxhbmtbMF0pOworCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfSF9CTEFOS18xLCBjb3JlLT5oX2JsYW5rWzFdKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1ZfQkxBTktfMCwgY29yZS0+dl9ibGFua1swXSk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9WX0JMQU5LXzEsIGNvcmUtPnZfYmxhbmtbMV0pOworCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfVl9CTEFOS18yLCBjb3JlLT52X2JsYW5rWzJdKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX0hfVl9MSU5FXzAsIGNvcmUtPmhfdl9saW5lWzBdKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX0hfVl9MSU5FXzEsIGNvcmUtPmhfdl9saW5lWzFdKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX0hfVl9MSU5FXzIsIGNvcmUtPmhfdl9saW5lWzJdKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1ZTWU5DX1BPTCwgY29yZS0+dnN5bmNfcG9sWzBdKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX0lOVF9QUk9fTU9ERSwgY29yZS0+aW50X3Byb19tb2RlWzBdKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1ZfQkxBTktfRl8wLCBjb3JlLT52X2JsYW5rX2ZbMF0pOworCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfVl9CTEFOS19GXzEsIGNvcmUtPnZfYmxhbmtfZlsxXSk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9WX0JMQU5LX0ZfMiwgY29yZS0+dl9ibGFua19mWzJdKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX0hfU1lOQ19HRU5fMCwgY29yZS0+aF9zeW5jX2dlblswXSk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9IX1NZTkNfR0VOXzEsIGNvcmUtPmhfc3luY19nZW5bMV0pOworCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfSF9TWU5DX0dFTl8yLCBjb3JlLT5oX3N5bmNfZ2VuWzJdKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1ZfU1lOQ19HRU5fMV8wLCBjb3JlLT52X3N5bmNfZ2VuMVswXSk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9WX1NZTkNfR0VOXzFfMSwgY29yZS0+dl9zeW5jX2dlbjFbMV0pOworCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfVl9TWU5DX0dFTl8xXzIsIGNvcmUtPnZfc3luY19nZW4xWzJdKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1ZfU1lOQ19HRU5fMl8wLCBjb3JlLT52X3N5bmNfZ2VuMlswXSk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9WX1NZTkNfR0VOXzJfMSwgY29yZS0+dl9zeW5jX2dlbjJbMV0pOworCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfVl9TWU5DX0dFTl8yXzIsIGNvcmUtPnZfc3luY19nZW4yWzJdKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1ZfU1lOQ19HRU5fM18wLCBjb3JlLT52X3N5bmNfZ2VuM1swXSk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9WX1NZTkNfR0VOXzNfMSwgY29yZS0+dl9zeW5jX2dlbjNbMV0pOworCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfVl9TWU5DX0dFTl8zXzIsIGNvcmUtPnZfc3luY19nZW4zWzJdKTsKKwkvKiBUaW1pbmcgZ2VuZXJhdG9yIHJlZ2lzdGVycyAqLworCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfVEdfSF9GU1pfTCwgdGctPmhfZnN6X2wpOworCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfVEdfSF9GU1pfSCwgdGctPmhfZnN6X2gpOworCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfVEdfSEFDVF9TVF9MLCB0Zy0+aGFjdF9zdF9sKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1RHX0hBQ1RfU1RfSCwgdGctPmhhY3Rfc3RfaCk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9UR19IQUNUX1NaX0wsIHRnLT5oYWN0X3N6X2wpOworCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfVEdfSEFDVF9TWl9ILCB0Zy0+aGFjdF9zel9oKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1RHX1ZfRlNaX0wsIHRnLT52X2Zzel9sKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1RHX1ZfRlNaX0gsIHRnLT52X2Zzel9oKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1RHX1ZTWU5DX0wsIHRnLT52c3luY19sKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1RHX1ZTWU5DX0gsIHRnLT52c3luY19oKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1RHX1ZTWU5DMl9MLCB0Zy0+dnN5bmMyX2wpOworCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfVEdfVlNZTkMyX0gsIHRnLT52c3luYzJfaCk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9UR19WQUNUX1NUX0wsIHRnLT52YWN0X3N0X2wpOworCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfVEdfVkFDVF9TVF9ILCB0Zy0+dmFjdF9zdF9oKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1RHX1ZBQ1RfU1pfTCwgdGctPnZhY3Rfc3pfbCk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9UR19WQUNUX1NaX0gsIHRnLT52YWN0X3N6X2gpOworCWhkbWlfd3JpdGViKGhkZXYsIEhETUlfVEdfRklFTERfQ0hHX0wsIHRnLT5maWVsZF9jaGdfbCk7CisJaGRtaV93cml0ZWIoaGRldiwgSERNSV9UR19GSUVMRF9DSEdfSCwgdGctPmZpZWxkX2NoZ19oKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1RHX1ZBQ1RfU1QyX0wsIHRnLT52YWN0X3N0Ml9sKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1RHX1ZBQ1RfU1QyX0gsIHRnLT52YWN0X3N0Ml9oKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1RHX1ZTWU5DX1RPUF9IRE1JX0wsIHRnLT52c3luY190b3BfaGRtaV9sKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1RHX1ZTWU5DX1RPUF9IRE1JX0gsIHRnLT52c3luY190b3BfaGRtaV9oKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1RHX1ZTWU5DX0JPVF9IRE1JX0wsIHRnLT52c3luY19ib3RfaGRtaV9sKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1RHX1ZTWU5DX0JPVF9IRE1JX0gsIHRnLT52c3luY19ib3RfaGRtaV9oKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1RHX0ZJRUxEX1RPUF9IRE1JX0wsIHRnLT5maWVsZF90b3BfaGRtaV9sKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1RHX0ZJRUxEX1RPUF9IRE1JX0gsIHRnLT5maWVsZF90b3BfaGRtaV9oKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1RHX0ZJRUxEX0JPVF9IRE1JX0wsIHRnLT5maWVsZF9ib3RfaGRtaV9sKTsKKwloZG1pX3dyaXRlYihoZGV2LCBIRE1JX1RHX0ZJRUxEX0JPVF9IRE1JX0gsIHRnLT5maWVsZF9ib3RfaGRtaV9oKTsKK30KKworc3RhdGljIGludCBoZG1pX2NvbmZfYXBwbHkoc3RydWN0IGhkbWlfZGV2aWNlICpoZG1pX2RldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBoZG1pX2Rldi0+ZGV2OworCWNvbnN0IHN0cnVjdCBoZG1pX3ByZXNldF9jb25mICpjb25mID0gaGRtaV9kZXYtPmN1cl9jb25mOworCXN0cnVjdCB2NGwyX2R2X3ByZXNldCBwcmVzZXQ7CisJaW50IHJldDsKKworCWRldl9kYmcoZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKworCS8qIHJlc2V0IGhkbWlwaHkgKi8KKwloZG1pX3dyaXRlX21hc2soaGRtaV9kZXYsIEhETUlfUEhZX1JTVE9VVCwgfjAsIEhETUlfUEhZX1NXX1JTVE9VVCk7CisJbWRlbGF5KDEwKTsKKwloZG1pX3dyaXRlX21hc2soaGRtaV9kZXYsIEhETUlfUEhZX1JTVE9VVCwgIDAsIEhETUlfUEhZX1NXX1JTVE9VVCk7CisJbWRlbGF5KDEwKTsKKworCS8qIGNvbmZpZ3VyZSBwcmVzZXRzICovCisJcHJlc2V0LnByZXNldCA9IGhkbWlfZGV2LT5jdXJfcHJlc2V0OworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoaGRtaV9kZXYtPnBoeV9zZCwgdmlkZW8sIHNfZHZfcHJlc2V0LCAmcHJlc2V0KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHNldCBwcmVzZXQgKCV1KVxuIiwgcHJlc2V0LnByZXNldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogcmVzZXR0aW5nIEhETUkgY29yZSAqLworCWhkbWlfd3JpdGVfbWFzayhoZG1pX2RldiwgSERNSV9DT1JFX1JTVE9VVCwgIDAsIEhETUlfQ09SRV9TV19SU1RPVVQpOworCW1kZWxheSgxMCk7CisJaGRtaV93cml0ZV9tYXNrKGhkbWlfZGV2LCBIRE1JX0NPUkVfUlNUT1VULCB+MCwgSERNSV9DT1JFX1NXX1JTVE9VVCk7CisJbWRlbGF5KDEwKTsKKworCWhkbWlfcmVnX2luaXQoaGRtaV9kZXYpOworCisJLyogc2V0dGluZyBjb3JlIHJlZ2lzdGVycyAqLworCWhkbWlfdGltaW5nX2FwcGx5KGhkbWlfZGV2LCBjb25mKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoZG1pX2R1bXByZWdzKHN0cnVjdCBoZG1pX2RldmljZSAqaGRldiwgY2hhciAqcHJlZml4KQoreworI2RlZmluZSBEVU1QUkVHKHJlZ19pZCkgXAorCWRldl9kYmcoaGRldi0+ZGV2LCAiJXM6IiAjcmVnX2lkICIgPSAlMDh4XG4iLCBwcmVmaXgsIFwKKwkJcmVhZGwoaGRldi0+cmVncyArIHJlZ19pZCkpCisKKwlkZXZfZGJnKGhkZXYtPmRldiwgIiVzOiAtLS0tIENPTlRST0wgUkVHSVNURVJTIC0tLS1cbiIsIHByZWZpeCk7CisJRFVNUFJFRyhIRE1JX0lOVENfRkxBRyk7CisJRFVNUFJFRyhIRE1JX0lOVENfQ09OKTsKKwlEVU1QUkVHKEhETUlfSFBEX1NUQVRVUyk7CisJRFVNUFJFRyhIRE1JX1BIWV9SU1RPVVQpOworCURVTVBSRUcoSERNSV9QSFlfVlBMTCk7CisJRFVNUFJFRyhIRE1JX1BIWV9DTVUpOworCURVTVBSRUcoSERNSV9DT1JFX1JTVE9VVCk7CisKKwlkZXZfZGJnKGhkZXYtPmRldiwgIiVzOiAtLS0tIENPUkUgUkVHSVNURVJTIC0tLS1cbiIsIHByZWZpeCk7CisJRFVNUFJFRyhIRE1JX0NPTl8wKTsKKwlEVU1QUkVHKEhETUlfQ09OXzEpOworCURVTVBSRUcoSERNSV9DT05fMik7CisJRFVNUFJFRyhIRE1JX1NZU19TVEFUVVMpOworCURVTVBSRUcoSERNSV9QSFlfU1RBVFVTKTsKKwlEVU1QUkVHKEhETUlfU1RBVFVTX0VOKTsKKwlEVU1QUkVHKEhETUlfSFBEKTsKKwlEVU1QUkVHKEhETUlfTU9ERV9TRUwpOworCURVTVBSRUcoSERNSV9IUERfR0VOKTsKKwlEVU1QUkVHKEhETUlfRENfQ09OVFJPTCk7CisJRFVNUFJFRyhIRE1JX1ZJREVPX1BBVFRFUk5fR0VOKTsKKworCWRldl9kYmcoaGRldi0+ZGV2LCAiJXM6IC0tLS0gQ09SRSBTWU5DIFJFR0lTVEVSUyAtLS0tXG4iLCBwcmVmaXgpOworCURVTVBSRUcoSERNSV9IX0JMQU5LXzApOworCURVTVBSRUcoSERNSV9IX0JMQU5LXzEpOworCURVTVBSRUcoSERNSV9WX0JMQU5LXzApOworCURVTVBSRUcoSERNSV9WX0JMQU5LXzEpOworCURVTVBSRUcoSERNSV9WX0JMQU5LXzIpOworCURVTVBSRUcoSERNSV9IX1ZfTElORV8wKTsKKwlEVU1QUkVHKEhETUlfSF9WX0xJTkVfMSk7CisJRFVNUFJFRyhIRE1JX0hfVl9MSU5FXzIpOworCURVTVBSRUcoSERNSV9WU1lOQ19QT0wpOworCURVTVBSRUcoSERNSV9JTlRfUFJPX01PREUpOworCURVTVBSRUcoSERNSV9WX0JMQU5LX0ZfMCk7CisJRFVNUFJFRyhIRE1JX1ZfQkxBTktfRl8xKTsKKwlEVU1QUkVHKEhETUlfVl9CTEFOS19GXzIpOworCURVTVBSRUcoSERNSV9IX1NZTkNfR0VOXzApOworCURVTVBSRUcoSERNSV9IX1NZTkNfR0VOXzEpOworCURVTVBSRUcoSERNSV9IX1NZTkNfR0VOXzIpOworCURVTVBSRUcoSERNSV9WX1NZTkNfR0VOXzFfMCk7CisJRFVNUFJFRyhIRE1JX1ZfU1lOQ19HRU5fMV8xKTsKKwlEVU1QUkVHKEhETUlfVl9TWU5DX0dFTl8xXzIpOworCURVTVBSRUcoSERNSV9WX1NZTkNfR0VOXzJfMCk7CisJRFVNUFJFRyhIRE1JX1ZfU1lOQ19HRU5fMl8xKTsKKwlEVU1QUkVHKEhETUlfVl9TWU5DX0dFTl8yXzIpOworCURVTVBSRUcoSERNSV9WX1NZTkNfR0VOXzNfMCk7CisJRFVNUFJFRyhIRE1JX1ZfU1lOQ19HRU5fM18xKTsKKwlEVU1QUkVHKEhETUlfVl9TWU5DX0dFTl8zXzIpOworCisJZGV2X2RiZyhoZGV2LT5kZXYsICIlczogLS0tLSBURyBSRUdJU1RFUlMgLS0tLVxuIiwgcHJlZml4KTsKKwlEVU1QUkVHKEhETUlfVEdfQ01EKTsKKwlEVU1QUkVHKEhETUlfVEdfSF9GU1pfTCk7CisJRFVNUFJFRyhIRE1JX1RHX0hfRlNaX0gpOworCURVTVBSRUcoSERNSV9UR19IQUNUX1NUX0wpOworCURVTVBSRUcoSERNSV9UR19IQUNUX1NUX0gpOworCURVTVBSRUcoSERNSV9UR19IQUNUX1NaX0wpOworCURVTVBSRUcoSERNSV9UR19IQUNUX1NaX0gpOworCURVTVBSRUcoSERNSV9UR19WX0ZTWl9MKTsKKwlEVU1QUkVHKEhETUlfVEdfVl9GU1pfSCk7CisJRFVNUFJFRyhIRE1JX1RHX1ZTWU5DX0wpOworCURVTVBSRUcoSERNSV9UR19WU1lOQ19IKTsKKwlEVU1QUkVHKEhETUlfVEdfVlNZTkMyX0wpOworCURVTVBSRUcoSERNSV9UR19WU1lOQzJfSCk7CisJRFVNUFJFRyhIRE1JX1RHX1ZBQ1RfU1RfTCk7CisJRFVNUFJFRyhIRE1JX1RHX1ZBQ1RfU1RfSCk7CisJRFVNUFJFRyhIRE1JX1RHX1ZBQ1RfU1pfTCk7CisJRFVNUFJFRyhIRE1JX1RHX1ZBQ1RfU1pfSCk7CisJRFVNUFJFRyhIRE1JX1RHX0ZJRUxEX0NIR19MKTsKKwlEVU1QUkVHKEhETUlfVEdfRklFTERfQ0hHX0gpOworCURVTVBSRUcoSERNSV9UR19WQUNUX1NUMl9MKTsKKwlEVU1QUkVHKEhETUlfVEdfVkFDVF9TVDJfSCk7CisJRFVNUFJFRyhIRE1JX1RHX1ZTWU5DX1RPUF9IRE1JX0wpOworCURVTVBSRUcoSERNSV9UR19WU1lOQ19UT1BfSERNSV9IKTsKKwlEVU1QUkVHKEhETUlfVEdfVlNZTkNfQk9UX0hETUlfTCk7CisJRFVNUFJFRyhIRE1JX1RHX1ZTWU5DX0JPVF9IRE1JX0gpOworCURVTVBSRUcoSERNSV9UR19GSUVMRF9UT1BfSERNSV9MKTsKKwlEVU1QUkVHKEhETUlfVEdfRklFTERfVE9QX0hETUlfSCk7CisJRFVNUFJFRyhIRE1JX1RHX0ZJRUxEX0JPVF9IRE1JX0wpOworCURVTVBSRUcoSERNSV9UR19GSUVMRF9CT1RfSERNSV9IKTsKKyN1bmRlZiBEVU1QUkVHCit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRtaV9wcmVzZXRfY29uZiBoZG1pX2NvbmZfNDgwcCA9IHsKKwkuY29yZSA9IHsKKwkJLmhfYmxhbmsgPSB7MHg4YSwgMHgwMH0sCisJCS52X2JsYW5rID0gezB4MGQsIDB4NmEsIDB4MDF9LAorCQkuaF92X2xpbmUgPSB7MHgwZCwgMHhhMiwgMHgzNX0sCisJCS52c3luY19wb2wgPSB7MHgwMX0sCisJCS5pbnRfcHJvX21vZGUgPSB7MHgwMH0sCisJCS52X2JsYW5rX2YgPSB7MHgwMCwgMHgwMCwgMHgwMH0sCisJCS5oX3N5bmNfZ2VuID0gezB4MGUsIDB4MzAsIDB4MTF9LAorCQkudl9zeW5jX2dlbjEgPSB7MHgwZiwgMHg5MCwgMHgwMH0sCisJCS8qIG90aGVyIGRvbid0IGNhcmUgKi8KKwl9LAorCS50ZyA9IHsKKwkJMHgwMCwgLyogY21kICovCisJCTB4NWEsIDB4MDMsIC8qIGhfZnN6ICovCisJCTB4OGEsIDB4MDAsIDB4ZDAsIDB4MDIsIC8qIGhhY3QgKi8KKwkJMHgwZCwgMHgwMiwgLyogdl9mc3ogKi8KKwkJMHgwMSwgMHgwMCwgMHgzMywgMHgwMiwgLyogdnN5bmMgKi8KKwkJMHgyZCwgMHgwMCwgMHhlMCwgMHgwMSwgLyogdmFjdCAqLworCQkweDMzLCAweDAyLCAvKiBmaWVsZF9jaGcgKi8KKwkJMHg0OSwgMHgwMiwgLyogdmFjdF9zdDIgKi8KKwkJMHgwMSwgMHgwMCwgMHgzMywgMHgwMiwgLyogdnN5bmMgdG9wL2JvdCAqLworCQkweDAxLCAweDAwLCAweDMzLCAweDAyLCAvKiBmaWVsZCB0b3AvYm90ICovCisJfSwKKwkubWJ1c19mbXQgPSB7CisJCS53aWR0aCA9IDcyMCwKKwkJLmhlaWdodCA9IDQ4MCwKKwkJLmNvZGUgPSBWNEwyX01CVVNfRk1UX0ZJWEVELCAvKiBtZWFucyBSR0I4ODggKi8KKwkJLmZpZWxkID0gVjRMMl9GSUVMRF9OT05FLAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkbWlfcHJlc2V0X2NvbmYgaGRtaV9jb25mXzcyMHA2MCA9IHsKKwkuY29yZSA9IHsKKwkJLmhfYmxhbmsgPSB7MHg3MiwgMHgwMX0sCisJCS52X2JsYW5rID0gezB4ZWUsIDB4ZjIsIDB4MDB9LAorCQkuaF92X2xpbmUgPSB7MHhlZSwgMHgyMiwgMHg2N30sCisJCS52c3luY19wb2wgPSB7MHgwMH0sCisJCS5pbnRfcHJvX21vZGUgPSB7MHgwMH0sCisJCS52X2JsYW5rX2YgPSB7MHgwMCwgMHgwMCwgMHgwMH0sIC8qIGRvbid0IGNhcmUgKi8KKwkJLmhfc3luY19nZW4gPSB7MHg2YywgMHg1MCwgMHgwMn0sCisJCS52X3N5bmNfZ2VuMSA9IHsweDBhLCAweDUwLCAweDAwfSwKKwkJLyogb3RoZXIgZG9uJ3QgY2FyZSAqLworCX0sCisJLnRnID0geworCQkweDAwLCAvKiBjbWQgKi8KKwkJMHg3MiwgMHgwNiwgLyogaF9mc3ogKi8KKwkJMHg3MiwgMHgwMSwgMHgwMCwgMHgwNSwgLyogaGFjdCAqLworCQkweGVlLCAweDAyLCAvKiB2X2ZzeiAqLworCQkweDAxLCAweDAwLCAweDMzLCAweDAyLCAvKiB2c3luYyAqLworCQkweDFlLCAweDAwLCAweGQwLCAweDAyLCAvKiB2YWN0ICovCisJCTB4MzMsIDB4MDIsIC8qIGZpZWxkX2NoZyAqLworCQkweDQ5LCAweDAyLCAvKiB2YWN0X3N0MiAqLworCQkweDAxLCAweDAwLCAweDMzLCAweDAyLCAvKiB2c3luYyB0b3AvYm90ICovCisJCTB4MDEsIDB4MDAsIDB4MzMsIDB4MDIsIC8qIGZpZWxkIHRvcC9ib3QgKi8KKwl9LAorCS5tYnVzX2ZtdCA9IHsKKwkJLndpZHRoID0gMTI4MCwKKwkJLmhlaWdodCA9IDcyMCwKKwkJLmNvZGUgPSBWNEwyX01CVVNfRk1UX0ZJWEVELCAvKiBtZWFucyBSR0I4ODggKi8KKwkJLmZpZWxkID0gVjRMMl9GSUVMRF9OT05FLAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGhkbWlfcHJlc2V0X2NvbmYgaGRtaV9jb25mXzEwODBwNTAgPSB7CisJLmNvcmUgPSB7CisJCS5oX2JsYW5rID0gezB4ZDAsIDB4MDJ9LAorCQkudl9ibGFuayA9IHsweDY1LCAweDZjLCAweDAxfSwKKwkJLmhfdl9saW5lID0gezB4NjUsIDB4MDQsIDB4YTV9LAorCQkudnN5bmNfcG9sID0gezB4MDB9LAorCQkuaW50X3Byb19tb2RlID0gezB4MDB9LAorCQkudl9ibGFua19mID0gezB4MDAsIDB4MDAsIDB4MDB9LCAvKiBkb24ndCBjYXJlICovCisJCS5oX3N5bmNfZ2VuID0gezB4MGUsIDB4ZWEsIDB4MDh9LAorCQkudl9zeW5jX2dlbjEgPSB7MHgwOSwgMHg0MCwgMHgwMH0sCisJCS8qIG90aGVyIGRvbid0IGNhcmUgKi8KKwl9LAorCS50ZyA9IHsKKwkJMHgwMCwgLyogY21kICovCisJCTB4OTgsIDB4MDgsIC8qIGhfZnN6ICovCisJCTB4MTgsIDB4MDEsIDB4ODAsIDB4MDcsIC8qIGhhY3QgKi8KKwkJMHg2NSwgMHgwNCwgLyogdl9mc3ogKi8KKwkJMHgwMSwgMHgwMCwgMHgzMywgMHgwMiwgLyogdnN5bmMgKi8KKwkJMHgyZCwgMHgwMCwgMHgzOCwgMHgwNCwgLyogdmFjdCAqLworCQkweDMzLCAweDAyLCAvKiBmaWVsZF9jaGcgKi8KKwkJMHg0OSwgMHgwMiwgLyogdmFjdF9zdDIgKi8KKwkJMHgwMSwgMHgwMCwgMHgzMywgMHgwMiwgLyogdnN5bmMgdG9wL2JvdCAqLworCQkweDAxLCAweDAwLCAweDMzLCAweDAyLCAvKiBmaWVsZCB0b3AvYm90ICovCisJfSwKKwkubWJ1c19mbXQgPSB7CisJCS53aWR0aCA9IDE5MjAsCisJCS5oZWlnaHQgPSAxMDgwLAorCQkuY29kZSA9IFY0TDJfTUJVU19GTVRfRklYRUQsIC8qIG1lYW5zIFJHQjg4OCAqLworCQkuZmllbGQgPSBWNEwyX0ZJRUxEX05PTkUsCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRtaV9wcmVzZXRfY29uZiBoZG1pX2NvbmZfMTA4MHA2MCA9IHsKKwkuY29yZSA9IHsKKwkJLmhfYmxhbmsgPSB7MHgxOCwgMHgwMX0sCisJCS52X2JsYW5rID0gezB4NjUsIDB4NmMsIDB4MDF9LAorCQkuaF92X2xpbmUgPSB7MHg2NSwgMHg4NCwgMHg4OX0sCisJCS52c3luY19wb2wgPSB7MHgwMH0sCisJCS5pbnRfcHJvX21vZGUgPSB7MHgwMH0sCisJCS52X2JsYW5rX2YgPSB7MHgwMCwgMHgwMCwgMHgwMH0sIC8qIGRvbid0IGNhcmUgKi8KKwkJLmhfc3luY19nZW4gPSB7MHg1NiwgMHgwOCwgMHgwMn0sCisJCS52X3N5bmNfZ2VuMSA9IHsweDA5LCAweDQwLCAweDAwfSwKKwkJLyogb3RoZXIgZG9uJ3QgY2FyZSAqLworCX0sCisJLnRnID0geworCQkweDAwLCAvKiBjbWQgKi8KKwkJMHg5OCwgMHgwOCwgLyogaF9mc3ogKi8KKwkJMHgxOCwgMHgwMSwgMHg4MCwgMHgwNywgLyogaGFjdCAqLworCQkweDY1LCAweDA0LCAvKiB2X2ZzeiAqLworCQkweDAxLCAweDAwLCAweDMzLCAweDAyLCAvKiB2c3luYyAqLworCQkweDJkLCAweDAwLCAweDM4LCAweDA0LCAvKiB2YWN0ICovCisJCTB4MzMsIDB4MDIsIC8qIGZpZWxkX2NoZyAqLworCQkweDQ4LCAweDAyLCAvKiB2YWN0X3N0MiAqLworCQkweDAxLCAweDAwLCAweDAxLCAweDAwLCAvKiB2c3luYyB0b3AvYm90ICovCisJCTB4MDEsIDB4MDAsIDB4MzMsIDB4MDIsIC8qIGZpZWxkIHRvcC9ib3QgKi8KKwl9LAorCS5tYnVzX2ZtdCA9IHsKKwkJLndpZHRoID0gMTkyMCwKKwkJLmhlaWdodCA9IDEwODAsCisJCS5jb2RlID0gVjRMMl9NQlVTX0ZNVF9GSVhFRCwgLyogbWVhbnMgUkdCODg4ICovCisJCS5maWVsZCA9IFY0TDJfRklFTERfTk9ORSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJdTMyIHByZXNldDsKKwljb25zdCBzdHJ1Y3QgaGRtaV9wcmVzZXRfY29uZiAqY29uZjsKK30gaGRtaV9jb25mW10gPSB7CisJeyBWNEwyX0RWXzQ4MFA1OV85NCwgJmhkbWlfY29uZl80ODBwIH0sCisJeyBWNEwyX0RWXzcyMFA1OV85NCwgJmhkbWlfY29uZl83MjBwNjAgfSwKKwl7IFY0TDJfRFZfMTA4MFA1MCwgJmhkbWlfY29uZl8xMDgwcDUwIH0sCisJeyBWNEwyX0RWXzEwODBQMzAsICZoZG1pX2NvbmZfMTA4MHA2MCB9LAorCXsgVjRMMl9EVl8xMDgwUDYwLCAmaGRtaV9jb25mXzEwODBwNjAgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaGRtaV9wcmVzZXRfY29uZiAqaGRtaV9wcmVzZXQyY29uZih1MzIgcHJlc2V0KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaGRtaV9jb25mKTsgKytpKQorCQlpZiAoaGRtaV9jb25mW2ldLnByZXNldCA9PSBwcmVzZXQpCisJCQlyZXR1cm4gIGhkbWlfY29uZltpXS5jb25mOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGhkbWlfc3RyZWFtb24oc3RydWN0IGhkbWlfZGV2aWNlICpoZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGhkZXYtPmRldjsKKwlzdHJ1Y3QgaGRtaV9yZXNvdXJjZXMgKnJlcyA9ICZoZGV2LT5yZXM7CisJaW50IHJldCwgdHJpZXM7CisKKwlkZXZfZGJnKGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKGhkZXYtPnBoeV9zZCwgdmlkZW8sIHNfc3RyZWFtLCAxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogd2FpdGluZyBmb3IgSERNSVBIWSdzIFBMTCB0byBnZXQgdG8gc3RlYWR5IHN0YXRlICovCisJZm9yICh0cmllcyA9IDEwMDsgdHJpZXM7IC0tdHJpZXMpIHsKKwkJdTMyIHZhbCA9IGhkbWlfcmVhZChoZGV2LCBIRE1JX1BIWV9TVEFUVVMpOworCQlpZiAodmFsICYgSERNSV9QSFlfU1RBVFVTX1JFQURZKQorCQkJYnJlYWs7CisJCW1kZWxheSgxKTsKKwl9CisJLyogc3RlYWR5IHN0YXRlIG5vdCBhY2hpZXZlZCAqLworCWlmICh0cmllcyA9PSAwKSB7CisJCWRldl9lcnIoZGV2LCAiaGRtaXBoeSdzIHBsbCBjb3VsZCBub3QgcmVhY2ggc3RlYWR5IHN0YXRlLlxuIik7CisJCXY0bDJfc3ViZGV2X2NhbGwoaGRldi0+cGh5X3NkLCB2aWRlbywgc19zdHJlYW0sIDApOworCQloZG1pX2R1bXByZWdzKGhkZXYsICJzX3N0cmVhbSIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBoZG1pcGh5IGNsb2NrIGlzIHVzZWQgZm9yIEhETUkgaW4gc3RyZWFtaW5nIG1vZGUgKi8KKwljbGtfZGlzYWJsZShyZXMtPnNjbGtfaGRtaSk7CisJY2xrX3NldF9wYXJlbnQocmVzLT5zY2xrX2hkbWksIHJlcy0+c2Nsa19oZG1pcGh5KTsKKwljbGtfZW5hYmxlKHJlcy0+c2Nsa19oZG1pKTsKKworCS8qIGVuYWJsZSBIRE1JIGFuZCB0aW1pbmcgZ2VuZXJhdG9yICovCisJaGRtaV93cml0ZV9tYXNrKGhkZXYsIEhETUlfQ09OXzAsIH4wLCBIRE1JX0VOKTsKKwloZG1pX3dyaXRlX21hc2soaGRldiwgSERNSV9UR19DTUQsIH4wLCBIRE1JX1RHX0VOKTsKKwloZG1pX2R1bXByZWdzKGhkZXYsICJzdHJlYW1vbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhkbWlfc3RyZWFtb2ZmKHN0cnVjdCBoZG1pX2RldmljZSAqaGRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBoZGV2LT5kZXY7CisJc3RydWN0IGhkbWlfcmVzb3VyY2VzICpyZXMgPSAmaGRldi0+cmVzOworCisJZGV2X2RiZyhkZXYsICIlc1xuIiwgX19mdW5jX18pOworCisJaGRtaV93cml0ZV9tYXNrKGhkZXYsIEhETUlfQ09OXzAsIDAsIEhETUlfRU4pOworCWhkbWlfd3JpdGVfbWFzayhoZGV2LCBIRE1JX1RHX0NNRCwgMCwgSERNSV9UR19FTik7CisKKwkvKiBwaXhlbCh2cGxsKSBjbG9jayBpcyB1c2VkIGZvciBIRE1JIGluIGNvbmZpZyBtb2RlICovCisJY2xrX2Rpc2FibGUocmVzLT5zY2xrX2hkbWkpOworCWNsa19zZXRfcGFyZW50KHJlcy0+c2Nsa19oZG1pLCByZXMtPnNjbGtfcGl4ZWwpOworCWNsa19lbmFibGUocmVzLT5zY2xrX2hkbWkpOworCisJdjRsMl9zdWJkZXZfY2FsbChoZGV2LT5waHlfc2QsIHZpZGVvLCBzX3N0cmVhbSwgMCk7CisKKwloZG1pX2R1bXByZWdzKGhkZXYsICJzdHJlYW1vZmYiKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZG1pX3Nfc3RyZWFtKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBlbmFibGUpCit7CisJc3RydWN0IGhkbWlfZGV2aWNlICpoZGV2ID0gc2RfdG9faGRtaV9kZXYoc2QpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGhkZXYtPmRldjsKKworCWRldl9kYmcoZGV2LCAiJXMoJWQpXG4iLCBfX2Z1bmNfXywgZW5hYmxlKTsKKwlpZiAoZW5hYmxlKQorCQlyZXR1cm4gaGRtaV9zdHJlYW1vbihoZGV2KTsKKwlyZXR1cm4gaGRtaV9zdHJlYW1vZmYoaGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGhkbWlfcmVzb3VyY2VfcG93ZXJvbihzdHJ1Y3QgaGRtaV9yZXNvdXJjZXMgKnJlcykKK3sKKwkvKiB0dXJuIEhETUkgcG93ZXIgb24gKi8KKwlyZWd1bGF0b3JfYnVsa19lbmFibGUocmVzLT5yZWd1bF9jb3VudCwgcmVzLT5yZWd1bF9idWxrKTsKKwkvKiBwb3dlci1vbiBoZG1pIHBoeXNpY2FsIGludGVyZmFjZSAqLworCWNsa19lbmFibGUocmVzLT5oZG1pcGh5KTsKKwkvKiB1c2UgVlBQIGFzIHBhcmVudCBjbG9jazsgSERNSVBIWSBpcyBub3Qgd29ya2luZyB5ZXQgKi8KKwljbGtfc2V0X3BhcmVudChyZXMtPnNjbGtfaGRtaSwgcmVzLT5zY2xrX3BpeGVsKTsKKwkvKiB0dXJuIGNsb2NrcyBvbiAqLworCWNsa19lbmFibGUocmVzLT5zY2xrX2hkbWkpOworfQorCitzdGF0aWMgdm9pZCBoZG1pX3Jlc291cmNlX3Bvd2Vyb2ZmKHN0cnVjdCBoZG1pX3Jlc291cmNlcyAqcmVzKQoreworCS8qIHR1cm4gY2xvY2tzIG9mZiAqLworCWNsa19kaXNhYmxlKHJlcy0+c2Nsa19oZG1pKTsKKwkvKiBwb3dlci1vZmYgaGRtaXBoeSAqLworCWNsa19kaXNhYmxlKHJlcy0+aGRtaXBoeSk7CisJLyogdHVybiBIRE1JIHBvd2VyIG9mZiAqLworCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUocmVzLT5yZWd1bF9jb3VudCwgcmVzLT5yZWd1bF9idWxrKTsKK30KKworc3RhdGljIGludCBoZG1pX3NfcG93ZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgaW50IG9uKQoreworCXN0cnVjdCBoZG1pX2RldmljZSAqaGRldiA9IHNkX3RvX2hkbWlfZGV2KHNkKTsKKwlpbnQgcmV0OworCisJaWYgKG9uKQorCQlyZXQgPSBwbV9ydW50aW1lX2dldF9zeW5jKGhkZXYtPmRldik7CisJZWxzZQorCQlyZXQgPSBwbV9ydW50aW1lX3B1dF9zeW5jKGhkZXYtPmRldik7CisJLyogb25seSB2YWx1ZXMgPCAwIGluZGljYXRlIGVycm9ycyAqLworCXJldHVybiBJU19FUlJfVkFMVUUocmV0KSA/IHJldCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgaGRtaV9zX2R2X3ByZXNldChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCXN0cnVjdCB2NGwyX2R2X3ByZXNldCAqcHJlc2V0KQoreworCXN0cnVjdCBoZG1pX2RldmljZSAqaGRldiA9IHNkX3RvX2hkbWlfZGV2KHNkKTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBoZGV2LT5kZXY7CisJY29uc3Qgc3RydWN0IGhkbWlfcHJlc2V0X2NvbmYgKmNvbmY7CisKKwljb25mID0gaGRtaV9wcmVzZXQyY29uZihwcmVzZXQtPnByZXNldCk7CisJaWYgKGNvbmYgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgInByZXNldCAoJXUpIG5vdCBzdXBwb3J0ZWRcbiIsIHByZXNldC0+cHJlc2V0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWhkZXYtPmN1cl9jb25mID0gY29uZjsKKwloZGV2LT5jdXJfcHJlc2V0ID0gcHJlc2V0LT5wcmVzZXQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGRtaV9nX2R2X3ByZXNldChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCXN0cnVjdCB2NGwyX2R2X3ByZXNldCAqcHJlc2V0KQoreworCW1lbXNldChwcmVzZXQsIDAsIHNpemVvZigqcHJlc2V0KSk7CisJcHJlc2V0LT5wcmVzZXQgPSBzZF90b19oZG1pX2RldihzZCktPmN1cl9wcmVzZXQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGRtaV9nX21idXNfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJICBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICpmbXQpCit7CisJc3RydWN0IGhkbWlfZGV2aWNlICpoZGV2ID0gc2RfdG9faGRtaV9kZXYoc2QpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGhkZXYtPmRldjsKKworCWRldl9kYmcoZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKwlpZiAoIWhkZXYtPmN1cl9jb25mKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkqZm10ID0gaGRldi0+Y3VyX2NvbmYtPm1idXNfZm10OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhkbWlfZW51bV9kdl9wcmVzZXRzKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJc3RydWN0IHY0bDJfZHZfZW51bV9wcmVzZXQgKnByZXNldCkKK3sKKwlpZiAocHJlc2V0LT5pbmRleCA+PSBBUlJBWV9TSVpFKGhkbWlfY29uZikpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiB2NGxfZmlsbF9kdl9wcmVzZXRfaW5mbyhoZG1pX2NvbmZbcHJlc2V0LT5pbmRleF0ucHJlc2V0LCBwcmVzZXQpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIGhkbWlfc2RfY29yZV9vcHMgPSB7CisJLnNfcG93ZXIgPSBoZG1pX3NfcG93ZXIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyBoZG1pX3NkX3ZpZGVvX29wcyA9IHsKKwkuc19kdl9wcmVzZXQgPSBoZG1pX3NfZHZfcHJlc2V0LAorCS5nX2R2X3ByZXNldCA9IGhkbWlfZ19kdl9wcmVzZXQsCisJLmVudW1fZHZfcHJlc2V0cyA9IGhkbWlfZW51bV9kdl9wcmVzZXRzLAorCS5nX21idXNfZm10ID0gaGRtaV9nX21idXNfZm10LAorCS5zX3N0cmVhbSA9IGhkbWlfc19zdHJlYW0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBoZG1pX3NkX29wcyA9IHsKKwkuY29yZSA9ICZoZG1pX3NkX2NvcmVfb3BzLAorCS52aWRlbyA9ICZoZG1pX3NkX3ZpZGVvX29wcywKK307CisKK3N0YXRpYyBpbnQgaGRtaV9ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgaGRtaV9kZXZpY2UgKmhkZXYgPSBzZF90b19oZG1pX2RldihzZCk7CisKKwlkZXZfZGJnKGRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisJaGRtaV9yZXNvdXJjZV9wb3dlcm9mZigmaGRldi0+cmVzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZG1pX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGhkbWlfZGV2aWNlICpoZGV2ID0gc2RfdG9faGRtaV9kZXYoc2QpOworCWludCByZXQgPSAwOworCisJZGV2X2RiZyhkZXYsICIlc1xuIiwgX19mdW5jX18pOworCisJaGRtaV9yZXNvdXJjZV9wb3dlcm9uKCZoZGV2LT5yZXMpOworCisJcmV0ID0gaGRtaV9jb25mX2FwcGx5KGhkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbDsKKworCWRldl9kYmcoZGV2LCAicG93ZXJvbiBzdWNjZWVkXG4iKTsKKworCXJldHVybiAwOworCitmYWlsOgorCWhkbWlfcmVzb3VyY2VfcG93ZXJvZmYoJmhkZXYtPnJlcyk7CisJZGV2X2VycihkZXYsICJwb3dlcm9uIGZhaWxlZFxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgaGRtaV9wbV9vcHMgPSB7CisJLnJ1bnRpbWVfc3VzcGVuZCA9IGhkbWlfcnVudGltZV9zdXNwZW5kLAorCS5ydW50aW1lX3Jlc3VtZQkgPSBoZG1pX3J1bnRpbWVfcmVzdW1lLAorfTsKKworc3RhdGljIHZvaWQgaGRtaV9yZXNvdXJjZXNfY2xlYW51cChzdHJ1Y3QgaGRtaV9kZXZpY2UgKmhkZXYpCit7CisJc3RydWN0IGhkbWlfcmVzb3VyY2VzICpyZXMgPSAmaGRldi0+cmVzOworCisJZGV2X2RiZyhoZGV2LT5kZXYsICJIRE1JIHJlc291cmNlIGNsZWFudXBcbiIpOworCS8qIHB1dCBjbG9ja3MsIHBvd2VyICovCisJaWYgKHJlcy0+cmVndWxfY291bnQpCisJCXJlZ3VsYXRvcl9idWxrX2ZyZWUocmVzLT5yZWd1bF9jb3VudCwgcmVzLT5yZWd1bF9idWxrKTsKKwkvKiBrZnJlZSBpcyBOVUxMLXNhZmUgKi8KKwlrZnJlZShyZXMtPnJlZ3VsX2J1bGspOworCWlmICghSVNfRVJSX09SX05VTEwocmVzLT5oZG1pcGh5KSkKKwkJY2xrX3B1dChyZXMtPmhkbWlwaHkpOworCWlmICghSVNfRVJSX09SX05VTEwocmVzLT5zY2xrX2hkbWlwaHkpKQorCQljbGtfcHV0KHJlcy0+c2Nsa19oZG1pcGh5KTsKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKHJlcy0+c2Nsa19waXhlbCkpCisJCWNsa19wdXQocmVzLT5zY2xrX3BpeGVsKTsKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKHJlcy0+c2Nsa19oZG1pKSkKKwkJY2xrX3B1dChyZXMtPnNjbGtfaGRtaSk7CisJaWYgKCFJU19FUlJfT1JfTlVMTChyZXMtPmhkbWkpKQorCQljbGtfcHV0KHJlcy0+aGRtaSk7CisJbWVtc2V0KHJlcywgMCwgc2l6ZW9mICpyZXMpOworfQorCitzdGF0aWMgaW50IGhkbWlfcmVzb3VyY2VzX2luaXQoc3RydWN0IGhkbWlfZGV2aWNlICpoZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGhkZXYtPmRldjsKKwlzdHJ1Y3QgaGRtaV9yZXNvdXJjZXMgKnJlcyA9ICZoZGV2LT5yZXM7CisJc3RhdGljIGNoYXIgKnN1cHBseVtdID0geworCQkiaGRtaS1lbiIsCisJCSJ2ZGQiLAorCQkidmRkX29zYyIsCisJCSJ2ZGRfcGxsIiwKKwl9OworCWludCBpLCByZXQ7CisKKwlkZXZfZGJnKGRldiwgIkhETUkgcmVzb3VyY2UgaW5pdFxuIik7CisKKwltZW1zZXQocmVzLCAwLCBzaXplb2YgKnJlcyk7CisJLyogZ2V0IGNsb2NrcywgcG93ZXIgKi8KKworCXJlcy0+aGRtaSA9IGNsa19nZXQoZGV2LCAiaGRtaSIpOworCWlmIChJU19FUlJfT1JfTlVMTChyZXMtPmhkbWkpKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBjbG9jayAnaGRtaSdcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCXJlcy0+c2Nsa19oZG1pID0gY2xrX2dldChkZXYsICJzY2xrX2hkbWkiKTsKKwlpZiAoSVNfRVJSX09SX05VTEwocmVzLT5zY2xrX2hkbWkpKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBjbG9jayAnc2Nsa19oZG1pJ1xuIik7CisJCWdvdG8gZmFpbDsKKwl9CisJcmVzLT5zY2xrX3BpeGVsID0gY2xrX2dldChkZXYsICJzY2xrX3BpeGVsIik7CisJaWYgKElTX0VSUl9PUl9OVUxMKHJlcy0+c2Nsa19waXhlbCkpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IGNsb2NrICdzY2xrX3BpeGVsJ1xuIik7CisJCWdvdG8gZmFpbDsKKwl9CisJcmVzLT5zY2xrX2hkbWlwaHkgPSBjbGtfZ2V0KGRldiwgInNjbGtfaGRtaXBoeSIpOworCWlmIChJU19FUlJfT1JfTlVMTChyZXMtPnNjbGtfaGRtaXBoeSkpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IGNsb2NrICdzY2xrX2hkbWlwaHknXG4iKTsKKwkJZ290byBmYWlsOworCX0KKwlyZXMtPmhkbWlwaHkgPSBjbGtfZ2V0KGRldiwgImhkbWlwaHkiKTsKKwlpZiAoSVNfRVJSX09SX05VTEwocmVzLT5oZG1pcGh5KSkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgY2xvY2sgJ2hkbWlwaHknXG4iKTsKKwkJZ290byBmYWlsOworCX0KKwlyZXMtPnJlZ3VsX2J1bGsgPSBremFsbG9jKEFSUkFZX1NJWkUoc3VwcGx5KSAqCisJCXNpemVvZiByZXMtPnJlZ3VsX2J1bGtbMF0sIEdGUF9LRVJORUwpOworCWlmICghcmVzLT5yZWd1bF9idWxrKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBtZW1vcnkgZm9yIHJlZ3VsYXRvcnNcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN1cHBseSk7ICsraSkgeworCQlyZXMtPnJlZ3VsX2J1bGtbaV0uc3VwcGx5ID0gc3VwcGx5W2ldOworCQlyZXMtPnJlZ3VsX2J1bGtbaV0uY29uc3VtZXIgPSBOVUxMOworCX0KKworCXJldCA9IHJlZ3VsYXRvcl9idWxrX2dldChkZXYsIEFSUkFZX1NJWkUoc3VwcGx5KSwgcmVzLT5yZWd1bF9idWxrKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCByZWd1bGF0b3JzXG4iKTsKKwkJZ290byBmYWlsOworCX0KKwlyZXMtPnJlZ3VsX2NvdW50ID0gQVJSQVlfU0laRShzdXBwbHkpOworCisJcmV0dXJuIDA7CitmYWlsOgorCWRldl9lcnIoZGV2LCAiSERNSSByZXNvdXJjZSBpbml0IC0gZmFpbGVkXG4iKTsKKwloZG1pX3Jlc291cmNlc19jbGVhbnVwKGhkZXYpOworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBoZG1pX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKnBoeV9hZGFwdGVyOworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7CisJc3RydWN0IGhkbWlfZGV2aWNlICpoZG1pX2RldiA9IE5VTEw7CisJc3RydWN0IGhkbWlfZHJpdmVyX2RhdGEgKmRydl9kYXRhOworCWludCByZXQ7CisKKwlkZXZfZGJnKGRldiwgInByb2JlIHN0YXJ0XG4iKTsKKworCWhkbWlfZGV2ID0ga3phbGxvYyhzaXplb2YoKmhkbWlfZGV2KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFoZG1pX2RldikgeworCQlkZXZfZXJyKGRldiwgIm91dCBvZiBtZW1vcnlcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGZhaWw7CisJfQorCisJaGRtaV9kZXYtPmRldiA9IGRldjsKKworCXJldCA9IGhkbWlfcmVzb3VyY2VzX2luaXQoaGRtaV9kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbF9oZGV2OworCisJLyogbWFwcGluZyBIRE1JIHJlZ2lzdGVycyAqLworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKHJlcyA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiZ2V0IG1lbW9yeSByZXNvdXJjZSBmYWlsZWQuXG4iKTsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIGZhaWxfaW5pdDsKKwl9CisKKwloZG1pX2Rldi0+cmVncyA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlpZiAoaGRtaV9kZXYtPnJlZ3MgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgInJlZ2lzdGVyIG1hcHBpbmcgZmFpbGVkLlxuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBmYWlsX2hkZXY7CisJfQorCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfSVJRLCAwKTsKKwlpZiAocmVzID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJnZXQgaW50ZXJydXB0IHJlc291cmNlIGZhaWxlZC5cbiIpOworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gZmFpbF9yZWdzOworCX0KKworCXJldCA9IHJlcXVlc3RfaXJxKHJlcy0+c3RhcnQsIGhkbWlfaXJxX2hhbmRsZXIsIDAsICJoZG1pIiwgaGRtaV9kZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJyZXF1ZXN0IGludGVycnVwdCBmYWlsZWQuXG4iKTsKKwkJZ290byBmYWlsX3JlZ3M7CisJfQorCWhkbWlfZGV2LT5pcnEgPSByZXMtPnN0YXJ0OworCisJLyogc2V0dGluZyB2NGwyIG5hbWUgdG8gcHJldmVudCBXQVJOX09OIGluIHY0bDJfZGV2aWNlX3JlZ2lzdGVyICovCisJc3RybGNweShoZG1pX2Rldi0+djRsMl9kZXYubmFtZSwgZGV2X25hbWUoZGV2KSwKKwkJc2l6ZW9mKGhkbWlfZGV2LT52NGwyX2Rldi5uYW1lKSk7CisJLyogcGFzc2luZyBOVUxMIG93bmVyIHByZXZlbnRzIGRyaXZlciBmcm9tIGVyYXNpbmcgZHJ2ZGF0YSAqLworCXJldCA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyKE5VTEwsICZoZG1pX2Rldi0+djRsMl9kZXYpOworCWlmIChyZXQpIHsKKwkJZGV2X2VycihkZXYsICJjb3VsZCBub3QgcmVnaXN0ZXIgdjRsMiBkZXZpY2UuXG4iKTsKKwkJZ290byBmYWlsX2lycTsKKwl9CisKKwlkcnZfZGF0YSA9IChzdHJ1Y3QgaGRtaV9kcml2ZXJfZGF0YSAqKQorCQlwbGF0Zm9ybV9nZXRfZGV2aWNlX2lkKHBkZXYpLT5kcml2ZXJfZGF0YTsKKwlwaHlfYWRhcHRlciA9IGkyY19nZXRfYWRhcHRlcihkcnZfZGF0YS0+aGRtaXBoeV9idXMpOworCWlmIChwaHlfYWRhcHRlciA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiYWRhcHRlciByZXF1ZXN0IGZhaWxlZFxuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBmYWlsX3ZkZXY7CisJfQorCisJaGRtaV9kZXYtPnBoeV9zZCA9IHY0bDJfaTJjX25ld19zdWJkZXZfYm9hcmQoJmhkbWlfZGV2LT52NGwyX2RldiwKKwkJcGh5X2FkYXB0ZXIsICZoZG1pcGh5X2luZm8sIE5VTEwpOworCS8qIG9uIGZhaWx1cmUgb3Igbm90IGFkYXB0ZXIgaXMgbm8gbG9uZ2VyIHVzZWZ1bCAqLworCWkyY19wdXRfYWRhcHRlcihwaHlfYWRhcHRlcik7CisJaWYgKGhkbWlfZGV2LT5waHlfc2QgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgIm1pc3Npbmcgc3ViZGV2IGZvciBoZG1pcGh5XG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBmYWlsX3ZkZXY7CisJfQorCisJY2xrX2VuYWJsZShoZG1pX2Rldi0+cmVzLmhkbWkpOworCisJcG1fcnVudGltZV9lbmFibGUoZGV2KTsKKworCXNkID0gJmhkbWlfZGV2LT5zZDsKKwl2NGwyX3N1YmRldl9pbml0KHNkLCAmaGRtaV9zZF9vcHMpOworCXNkLT5vd25lciA9IFRISVNfTU9EVUxFOworCisJc3RybGNweShzZC0+bmFtZSwgInM1cC1oZG1pIiwgc2l6ZW9mIHNkLT5uYW1lKTsKKwloZG1pX2Rldi0+Y3VyX3ByZXNldCA9IEhETUlfREVGQVVMVF9QUkVTRVQ7CisJLyogRklYTUU6IG1pc3NpbmcgZmFpbCBwcmVzZXQgaXMgbm90IHN1cHBvcnRlZCAqLworCWhkbWlfZGV2LT5jdXJfY29uZiA9IGhkbWlfcHJlc2V0MmNvbmYoaGRtaV9kZXYtPmN1cl9wcmVzZXQpOworCisJLyogc3RvcmluZyBzdWJkZXYgZm9yIGNhbGwgdGhhdCBoYXZlIG9ubHkgYWNjZXNzIHRvIHN0cnVjdCBkZXZpY2UgKi8KKwlkZXZfc2V0X2RydmRhdGEoZGV2LCBzZCk7CisKKwlkZXZfaW5mbyhkZXYsICJwcm9iZSBzdWNlc3NmdWxcbiIpOworCisJcmV0dXJuIDA7CisKK2ZhaWxfdmRldjoKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyKCZoZG1pX2Rldi0+djRsMl9kZXYpOworCitmYWlsX2lycToKKwlmcmVlX2lycShoZG1pX2Rldi0+aXJxLCBoZG1pX2Rldik7CisKK2ZhaWxfcmVnczoKKwlpb3VubWFwKGhkbWlfZGV2LT5yZWdzKTsKKworZmFpbF9pbml0OgorCWhkbWlfcmVzb3VyY2VzX2NsZWFudXAoaGRtaV9kZXYpOworCitmYWlsX2hkZXY6CisJa2ZyZWUoaGRtaV9kZXYpOworCitmYWlsOgorCWRldl9lcnIoZGV2LCAicHJvYmUgZmFpbGVkXG4iKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBoZG1pX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBoZG1pX2RldmljZSAqaGRtaV9kZXYgPSBzZF90b19oZG1pX2RldihzZCk7CisKKwlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKKwljbGtfZGlzYWJsZShoZG1pX2Rldi0+cmVzLmhkbWkpOworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXIoJmhkbWlfZGV2LT52NGwyX2Rldik7CisJZGlzYWJsZV9pcnEoaGRtaV9kZXYtPmlycSk7CisJZnJlZV9pcnEoaGRtaV9kZXYtPmlycSwgaGRtaV9kZXYpOworCWlvdW5tYXAoaGRtaV9kZXYtPnJlZ3MpOworCWhkbWlfcmVzb3VyY2VzX2NsZWFudXAoaGRtaV9kZXYpOworCWtmcmVlKGhkbWlfZGV2KTsKKwlkZXZfaW5mbyhkZXYsICJyZW1vdmUgc3VjZXNzZnVsXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBoZG1pX2RyaXZlciBfX3JlZmRhdGEgPSB7CisJLnByb2JlID0gaGRtaV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoaGRtaV9yZW1vdmUpLAorCS5pZF90YWJsZSA9IGhkbWlfZHJpdmVyX3R5cGVzLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInM1cC1oZG1pIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5wbSA9ICZoZG1pX3BtX29wcywKKwl9Cit9OworCisvKiBEIFIgSSBWIEUgUiAgIEkgTiBJIFQgSSBBIEwgSSBaIEEgVCBJIE8gTiAqLworCitzdGF0aWMgaW50IF9faW5pdCBoZG1pX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCXN0YXRpYyBjb25zdCBjaGFyIGJhbm5lcltdIF9faW5pdGRhdGEgPSBLRVJOX0lORk8gXAorCQkiU2Ftc3VuZyBIRE1JIG91dHB1dCBkcml2ZXIsICIKKwkJIihjKSAyMDEwLTIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC5cbiI7CisJcHJpbnRrKGJhbm5lcik7CisKKwlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmhkbWlfZHJpdmVyKTsKKwlpZiAocmV0KQorCQlwcmludGsoS0VSTl9FUlIgIkhETUkgcGxhdGZvcm0gZHJpdmVyIHJlZ2lzdGVyIGZhaWxlZFxuIik7CisKKwlyZXR1cm4gcmV0OworfQorbW9kdWxlX2luaXQoaGRtaV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGhkbWlfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZoZG1pX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChoZG1pX2V4aXQpOworCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L2hkbWlwaHlfZHJ2LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9oZG1pcGh5X2Rydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2OTNmNGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9oZG1pcGh5X2Rydi5jCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogU2Ftc3VuZyBIRE1JIFBoeXNpY2FsIGludGVyZmFjZSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLkx0ZAorICogQXV0aG9yOiBUb21hc3ogU3RhbmlzbGF3c2tpIDx0LnN0YW5pc2xhd3NAc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisKKyNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgorCitNT0RVTEVfQVVUSE9SKCJUb21hc3ogU3RhbmlzbGF3c2tpIDx0LnN0YW5pc2xhd3NAc2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNhbXN1bmcgSERNSSBQaHlzaWNhbCBpbnRlcmZhY2UgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0cnVjdCBoZG1pcGh5X2NvbmYgeworCXUzMiBwcmVzZXQ7CisJY29uc3QgdTggKmRhdGE7Cit9OworCitzdGF0aWMgY29uc3QgdTggaGRtaXBoeV9jb25mMjdbMzJdID0geworCTB4MDEsIDB4MDUsIDB4MDAsIDB4RDgsIDB4MTAsIDB4MUMsIDB4MzAsIDB4NDAsCisJMHg2QiwgMHgxMCwgMHgwMiwgMHg1MSwgMHhEZiwgMHhGMiwgMHg1NCwgMHg4NywKKwkweDg0LCAweDAwLCAweDMwLCAweDM4LCAweDAwLCAweDA4LCAweDEwLCAweEUwLAorCTB4MjIsIDB4NDAsIDB4ZTMsIDB4MjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCit9OworCitzdGF0aWMgY29uc3QgdTggaGRtaXBoeV9jb25mNzRfMTc1WzMyXSA9IHsKKwkweDAxLCAweDA1LCAweDAwLCAweEQ4LCAweDEwLCAweDlDLCAweGVmLCAweDVCLAorCTB4NkQsIDB4MTAsIDB4MDEsIDB4NTEsIDB4ZWYsIDB4RjMsIDB4NTQsIDB4YjksCisJMHg4NCwgMHgwMCwgMHgzMCwgMHgzOCwgMHgwMCwgMHgwOCwgMHgxMCwgMHhFMCwKKwkweDIyLCAweDQwLCAweGE1LCAweDI2LCAweDAxLCAweDAwLCAweDAwLCAweDAwLAorfTsKKworc3RhdGljIGNvbnN0IHU4IGhkbWlwaHlfY29uZjc0XzI1WzMyXSA9IHsKKwkweDAxLCAweDA1LCAweDAwLCAweGQ4LCAweDEwLCAweDljLCAweGY4LCAweDQwLAorCTB4NmEsIDB4MTAsIDB4MDEsIDB4NTEsIDB4ZmYsIDB4ZjEsIDB4NTQsIDB4YmEsCisJMHg4NCwgMHgwMCwgMHgzMCwgMHgzOCwgMHgwMCwgMHgwOCwgMHgxMCwgMHhlMCwKKwkweDIyLCAweDQwLCAweGE0LCAweDI2LCAweDAxLCAweDAwLCAweDAwLCAweDAwLAorfTsKKworc3RhdGljIGNvbnN0IHU4IGhkbWlwaHlfY29uZjE0OF81WzMyXSA9IHsKKwkweDAxLCAweDA1LCAweDAwLCAweEQ4LCAweDEwLCAweDlDLCAweGY4LCAweDQwLAorCTB4NkEsIDB4MTgsIDB4MDAsIDB4NTEsIDB4ZmYsIDB4RjEsIDB4NTQsIDB4YmEsCisJMHg4NCwgMHgwMCwgMHgxMCwgMHgzOCwgMHgwMCwgMHgwOCwgMHgxMCwgMHhFMCwKKwkweDIyLCAweDQwLCAweGE0LCAweDI2LCAweDAyLCAweDAwLCAweDAwLCAweDAwLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBoZG1pcGh5X2NvbmYgaGRtaXBoeV9jb25mW10gPSB7CisJeyBWNEwyX0RWXzQ4MFA1OV85NCwgaGRtaXBoeV9jb25mMjcgfSwKKwl7IFY0TDJfRFZfMTA4MFAzMCwgaGRtaXBoeV9jb25mNzRfMTc1IH0sCisJeyBWNEwyX0RWXzcyMFA1OV85NCwgaGRtaXBoeV9jb25mNzRfMTc1IH0sCisJeyBWNEwyX0RWXzcyMFA2MCwgaGRtaXBoeV9jb25mNzRfMjUgfSwKKwl7IFY0TDJfRFZfMTA4MFA1MCwgaGRtaXBoeV9jb25mMTQ4XzUgfSwKKwl7IFY0TDJfRFZfMTA4MFA2MCwgaGRtaXBoeV9jb25mMTQ4XzUgfSwKK307CisKK2NvbnN0IHU4ICpoZG1pcGh5X3ByZXNldDJjb25mKHUzMiBwcmVzZXQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaGRtaXBoeV9jb25mKTsgKytpKQorCQlpZiAoaGRtaXBoeV9jb25mW2ldLnByZXNldCA9PSBwcmVzZXQpCisJCQlyZXR1cm4gaGRtaXBoeV9jb25mW2ldLmRhdGE7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgaGRtaXBoeV9zX3Bvd2VyKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBvbikKK3sKKwkvKiB0byBiZSBpbXBsZW1lbnRlZCAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhkbWlwaHlfc19kdl9wcmVzZXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKKwlzdHJ1Y3QgdjRsMl9kdl9wcmVzZXQgKnByZXNldCkKK3sKKwljb25zdCB1OCAqZGF0YTsKKwl1OCBidWZmZXJbMzJdOworCWludCByZXQ7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZjbGllbnQtPmRldjsKKworCWRldl9pbmZvKGRldiwgInNfZHZfcHJlc2V0KHByZXNldCA9ICVkKVxuIiwgcHJlc2V0LT5wcmVzZXQpOworCWRhdGEgPSBoZG1pcGh5X3ByZXNldDJjb25mKHByZXNldC0+cHJlc2V0KTsKKwlpZiAoIWRhdGEpIHsKKwkJZGV2X2VycihkZXYsICJmb3JtYXQgbm90IHN1cHBvcnRlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHN0b3JpbmcgY29uZmlndXJhdGlvbiB0byB0aGUgZGV2aWNlICovCisJbWVtY3B5KGJ1ZmZlciwgZGF0YSwgMzIpOworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGJ1ZmZlciwgMzIpOworCWlmIChyZXQgIT0gMzIpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gY29uZmlndXJlIEhETUlQSFkgdmlhIEkyQ1xuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhkbWlwaHlfc19zdHJlYW0oc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgaW50IGVuYWJsZSkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmNsaWVudC0+ZGV2OworCXU4IGJ1ZmZlclsyXTsKKwlpbnQgcmV0OworCisJZGV2X2luZm8oZGV2LCAic19zdHJlYW0oJWQpXG4iLCBlbmFibGUpOworCS8qIGdvaW5nIHRvL2Zyb20gY29uZmlndXJhdGlvbiBmcm9tL3RvIG9wZXJhdGlvbiBtb2RlICovCisJYnVmZmVyWzBdID0gMHgxZjsKKwlidWZmZXJbMV0gPSBlbmFibGUgPyAweDgwIDogMHgwMDsKKworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChjbGllbnQsIGJ1ZmZlciwgMik7CisJaWYgKHJldCAhPSAyKSB7CisJCWRldl9lcnIoZGV2LCAic3RyZWFtICglZCkgZmFpbGVkXG4iLCBlbmFibGUpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgaGRtaXBoeV9jb3JlX29wcyA9IHsKKwkuc19wb3dlciA9ICBoZG1pcGh5X3NfcG93ZXIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyBoZG1pcGh5X3ZpZGVvX29wcyA9IHsKKwkuc19kdl9wcmVzZXQgPSBoZG1pcGh5X3NfZHZfcHJlc2V0LAorCS5zX3N0cmVhbSA9ICBoZG1pcGh5X3Nfc3RyZWFtLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX3N1YmRldl9vcHMgaGRtaXBoeV9vcHMgPSB7CisJLmNvcmUgPSAmaGRtaXBoeV9jb3JlX29wcywKKwkudmlkZW8gPSAmaGRtaXBoeV92aWRlb19vcHMsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBoZG1pcGh5X3Byb2JlKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsCisJY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgKmlkKQoreworCXN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXYgc2Q7CisKKwl2NGwyX2kyY19zdWJkZXZfaW5pdCgmc2QsIGNsaWVudCwgJmhkbWlwaHlfb3BzKTsKKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJwcm9iZSBzdWNjZXNzZnVsXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgaGRtaXBoeV9yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlkZXZfaW5mbygmY2xpZW50LT5kZXYsICJyZW1vdmUgc3VjY2Vzc2Z1bFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCBoZG1pcGh5X2lkW10gPSB7CisJeyAiaGRtaXBoeSIsIDAgfSwKKwl7IH0sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShpMmMsIGhkbWlwaHlfaWQpOworCitzdGF0aWMgc3RydWN0IGkyY19kcml2ZXIgaGRtaXBoeV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAiczVwLWhkbWlwaHkiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBoZG1pcGh5X3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoaGRtaXBoeV9yZW1vdmUpLAorCS5pZF90YWJsZSA9IGhkbWlwaHlfaWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBoZG1pcGh5X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJmhkbWlwaHlfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KGhkbWlwaHlfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBoZG1pcGh5X2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmaGRtaXBoeV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQoaGRtaXBoeV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L21peGVyLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMjQyMjQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlci5oCkBAIC0wLDAgKzEsMzU0IEBACisvKgorICogU2Ftc3VuZyBUViBNaXhlciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoKKyAqIFRvbWFzeiBTdGFuaXNsYXdza2ksIDx0LnN0YW5pc2xhd3NAc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGlhdGlvbi4gZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwKKyAqIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KKyAqLworCisjaWZuZGVmIFNBTVNVTkdfTUlYRVJfSAorI2RlZmluZSBTQU1TVU5HX01JWEVSX0gKKworI2lmZGVmIENPTkZJR19WSURFT19TQU1TVU5HX1M1UF9NSVhFUl9ERUJVRworCSNkZWZpbmUgREVCVUcKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvZmIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi1jb3JlLmg+CisKKyNpbmNsdWRlICJyZWdzLW1peGVyLmgiCisKKy8qKiBtYXhpbXVtIG51bWJlciBvZiBvdXRwdXQgaW50ZXJmYWNlcyAqLworI2RlZmluZSBNWFJfTUFYX09VVFBVVFMgMgorLyoqIG1heGltdW0gbnVtYmVyIG9mIGlucHV0IGludGVyZmFjZXMgKGxheWVycykgKi8KKyNkZWZpbmUgTVhSX01BWF9MQVlFUlMgMworI2RlZmluZSBNWFJfRFJJVkVSX05BTUUgInM1cC1taXhlciIKKy8qKiBtYXhpbWFsIG51bWJlciBvZiBwbGFuZXMgZm9yIGV2ZXJ5IGxheWVyICovCisjZGVmaW5lIE1YUl9NQVhfUExBTkVTCTIKKworI2RlZmluZSBNWFJfRU5BQkxFIDEKKyNkZWZpbmUgTVhSX0RJU0FCTEUgMAorCisvKiogZGVzY3JpcHRpb24gb2YgYSBtYWNyb2Jsb2NrIGZvciBwYWNrZWQgZm9ybWF0cyAqLworc3RydWN0IG14cl9ibG9jayB7CisJLyoqIHZlcnRpY2FsIG51bWJlciBvZiBwaXhlbHMgaW4gbWFjcm9ibG9jayAqLworCXVuc2lnbmVkIGludCB3aWR0aDsKKwkvKiogaG9yaXpvbnRhbCBudW1iZXIgb2YgcGl4ZWxzIGluIG1hY3JvYmxvY2sgKi8KKwl1bnNpZ25lZCBpbnQgaGVpZ2h0OworCS8qKiBzaXplIG9mIGJsb2NrIGluIGJ5dGVzICovCisJdW5zaWduZWQgaW50IHNpemU7Cit9OworCisvKiogZGVzY3JpcHRpb24gb2Ygc3VwcG9ydGVkIGZvcm1hdCAqLworc3RydWN0IG14cl9mb3JtYXQgeworCS8qKiBmb3JtYXQgbmFtZS9tbmVtb25pYyAqLworCWNvbnN0IGNoYXIgKm5hbWU7CisJLyoqIGZvdXJjYyBpZGVudGlmaWVyICovCisJdTMyIGZvdXJjYzsKKwkvKiogY29sb3JzcGFjZSBpZGVudGlmaWVyICovCisJZW51bSB2NGwyX2NvbG9yc3BhY2UgY29sb3JzcGFjZTsKKwkvKiogbnVtYmVyIG9mIHBsYW5lcyBpbiBpbWFnZSBkYXRhICovCisJaW50IG51bV9wbGFuZXM7CisJLyoqIGRlc2NyaXB0aW9uIG9mIGJsb2NrIGZvciBlYWNoIHBsYW5lICovCisJc3RydWN0IG14cl9ibG9jayBwbGFuZVtNWFJfTUFYX1BMQU5FU107CisJLyoqIG51bWJlciBvZiBzdWJmcmFtZXMgaW4gaW1hZ2UgZGF0YSAqLworCWludCBudW1fc3ViZnJhbWVzOworCS8qKiBzcGVjaWZpZXMgdG8gd2hpY2ggc3ViZnJhbWUgYmVsb25nIGdpdmVuIHBsYW5lICovCisJaW50IHBsYW5lMnN1YmZyYW1lW01YUl9NQVhfUExBTkVTXTsKKwkvKiogaW50ZXJuYWwgY29kZSwgZHJpdmVyIGRlcGVuZGFudCAqLworCXVuc2lnbmVkIGxvbmcgY29va2llOworfTsKKworLyoqIGRlc2NyaXB0aW9uIG9mIGNyb3AgY29uZmlndXJhdGlvbiBmb3IgaW1hZ2UgKi8KK3N0cnVjdCBteHJfY3JvcCB7CisJLyoqIHdpZHRoIG9mIGxheWVyIGluIHBpeGVscyAqLworCXVuc2lnbmVkIGludCBmdWxsX3dpZHRoOworCS8qKiBoZWlnaHQgb2YgbGF5ZXIgaW4gcGl4ZWxzICovCisJdW5zaWduZWQgaW50IGZ1bGxfaGVpZ2h0OworCS8qKiBob3Jpem9udGFsIG9mZnNldCBvZiBmaXJzdCBwaXhlbCB0byBiZSBkaXNwbGF5ZWQgKi8KKwl1bnNpZ25lZCBpbnQgeF9vZmZzZXQ7CisJLyoqIHZlcnRpY2FsIG9mZnNldCBvZiBmaXJzdCBwaXhlbCB0byBiZSBkaXNwbGF5ZWQgKi8KKwl1bnNpZ25lZCBpbnQgeV9vZmZzZXQ7CisJLyoqIHdpZHRoIG9mIGRpc3BsYXllZCBkYXRhIGluIHBpeGVscyAqLworCXVuc2lnbmVkIGludCB3aWR0aDsKKwkvKiogaGVpZ2h0IG9mIGRpc3BsYXllZCBkYXRhIGluIHBpeGVscyAqLworCXVuc2lnbmVkIGludCBoZWlnaHQ7CisJLyoqIGluZGljYXRlIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCBpbiBidWZmZXIgKi8KKwl1bnNpZ25lZCBpbnQgZmllbGQ7Cit9OworCisvKiogZGVzY3JpcHRpb24gb2YgdHJhbnNmb3JtYXRpb24gZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24gaW1hZ2UgKi8KK3N0cnVjdCBteHJfZ2VvbWV0cnkgeworCS8qKiBjcm9wcGluZyBmb3Igc291cmNlIGltYWdlICovCisJc3RydWN0IG14cl9jcm9wIHNyYzsKKwkvKiogY3JvcHBpbmcgZm9yIGRlc3RpbmF0aW9uIGltYWdlICovCisJc3RydWN0IG14cl9jcm9wIGRzdDsKKwkvKiogbGF5ZXItZGVwZW5kYW50IGRlc2NyaXB0aW9uIG9mIGhvcml6b250YWwgc2NhbGluZyAqLworCXVuc2lnbmVkIGludCB4X3JhdGlvOworCS8qKiBsYXllci1kZXBlbmRhbnQgZGVzY3JpcHRpb24gb2YgdmVydGljYWwgc2NhbGluZyAqLworCXVuc2lnbmVkIGludCB5X3JhdGlvOworfTsKKworLyoqIGluc3RhbmNlIG9mIGEgYnVmZmVyICovCitzdHJ1Y3QgbXhyX2J1ZmZlciB7CisJLyoqIGNvbW1vbiB2NGwgYnVmZmVyIHN0dWZmIC0tIG11c3QgYmUgZmlyc3QgKi8KKwlzdHJ1Y3QgdmIyX2J1ZmZlcgl2YjsKKwkvKiogbm9kZSBmb3IgbGF5ZXIncyBsaXN0cyAqLworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKK307CisKKworLyoqIGludGVybmFsIHN0YXRlcyBvZiBsYXllciAqLworZW51bSBteHJfbGF5ZXJfc3RhdGUgeworCS8qKiBsYXllcnMgaXMgbm90IHNob3duICovCisJTVhSX0xBWUVSX0lETEUgPSAwLAorCS8qKiBzdGF0ZSBiZXR3ZWVuIFNUUkVBTU9OIGFuZCBoYXJkd2FyZSBzdGFydCAqLworCU1YUl9MQVlFUl9TVFJFQU1JTkdfU1RBUlQsCisJLyoqIGxheWVyIGlzIHNob3duICovCisJTVhSX0xBWUVSX1NUUkVBTUlORywKKwkvKiogc3RhdGUgYmVmb3JlIFNUUkVBTU9GRiBpcyBmaW5pc2hlZCAqLworCU1YUl9MQVlFUl9TVFJFQU1JTkdfRklOSVNILAorfTsKKworLyoqIGZvcndhcmQgZGVjbGFyYXRpb25zICovCitzdHJ1Y3QgbXhyX2RldmljZTsKK3N0cnVjdCBteHJfbGF5ZXI7CisKKy8qKiBjYWxsYmFjayBmb3IgbGF5ZXJzIG9wZXJhdGlvbiAqLworc3RydWN0IG14cl9sYXllcl9vcHMgeworCS8qIFRPRE86IHRyeSB0byBwb3J0IGl0IHRvIHN1YmRldiBBUEkgKi8KKwkvKiogaGFuZGxlciBmb3IgcmVzb3VyY2UgcmVsZWFzZSBmdW5jdGlvbiAqLworCXZvaWQgKCpyZWxlYXNlKShzdHJ1Y3QgbXhyX2xheWVyICopOworCS8qKiBzZXR0aW5nIGJ1ZmZlciB0byBIVyAqLworCXZvaWQgKCpidWZmZXJfc2V0KShzdHJ1Y3QgbXhyX2xheWVyICosIHN0cnVjdCBteHJfYnVmZmVyICopOworCS8qKiBzZXR0aW5nIGZvcm1hdCBhbmQgZ2VvbWV0cnkgaW4gSFcgKi8KKwl2b2lkICgqZm9ybWF0X3NldCkoc3RydWN0IG14cl9sYXllciAqKTsKKwkvKiogc3RyZWFtaW5nIHN0b3Avc3RhcnQgKi8KKwl2b2lkICgqc3RyZWFtX3NldCkoc3RydWN0IG14cl9sYXllciAqLCBpbnQpOworCS8qKiBhZGp1c3RpbmcgZ2VvbWV0cnkgKi8KKwl2b2lkICgqZml4X2dlb21ldHJ5KShzdHJ1Y3QgbXhyX2xheWVyICopOworfTsKKworLyoqIGxheWVyIGluc3RhbmNlLCBhIHNpbmdsZSB3aW5kb3cgYW5kIGNvbnRlbnQgZGlzcGxheWVkIG9uIG91dHB1dCAqLworc3RydWN0IG14cl9sYXllciB7CisJLyoqIHBhcmVudCBtaXhlciBkZXZpY2UgKi8KKwlzdHJ1Y3QgbXhyX2RldmljZSAqbWRldjsKKwkvKiogbGF5ZXIgaW5kZXggKHVuaXF1ZSBpZGVudGlmaWVyKSAqLworCWludCBpZHg7CisJLyoqIGNhbGxiYWNrcyBmb3IgbGF5ZXIgbWV0aG9kcyAqLworCXN0cnVjdCBteHJfbGF5ZXJfb3BzIG9wczsKKwkvKiogZm9ybWF0IGFycmF5ICovCisJY29uc3Qgc3RydWN0IG14cl9mb3JtYXQgKipmbXRfYXJyYXk7CisJLyoqIHNpemUgb2YgZm9ybWF0IGFycmF5ICovCisJdW5zaWduZWQgbG9uZyBmbXRfYXJyYXlfc2l6ZTsKKworCS8qKiBsb2NrIGZvciBwcm90ZWN0aW9uIG9mIGxpc3QgYW5kIHN0YXRlIGZpZWxkcyAqLworCXNwaW5sb2NrX3QgZW5xX3Nsb2NrOworCS8qKiBsaXN0IGZvciBlbnF1ZXVlZCBidWZmZXJzICovCisJc3RydWN0IGxpc3RfaGVhZCBlbnFfbGlzdDsKKwkvKiogYnVmZmVyIGN1cnJlbnRseSBvd25lZCBieSBoYXJkd2FyZSBpbiB0ZW1wb3JhcnkgcmVnaXN0ZXJzICovCisJc3RydWN0IG14cl9idWZmZXIgKnVwZGF0ZV9idWY7CisJLyoqIGJ1ZmZlciBjdXJyZW50bHkgb3duZWQgYnkgaGFyZHdhcmUgaW4gc2hhZG93IHJlZ2lzdGVycyAqLworCXN0cnVjdCBteHJfYnVmZmVyICpzaGFkb3dfYnVmOworCS8qKiBzdGF0ZSBvZiBsYXllciBJRExFL1NUUkVBTUlORyAqLworCWVudW0gbXhyX2xheWVyX3N0YXRlIHN0YXRlOworCisJLyoqIG11dGV4IGZvciBwcm90ZWN0aW9uIG9mIGZpZWxkcyBiZWxvdyAqLworCXN0cnVjdCBtdXRleCBtdXRleDsKKwkvKiogaGFuZGxlciBmb3IgdmlkZW8gbm9kZSAqLworCXN0cnVjdCB2aWRlb19kZXZpY2UgdmZkOworCS8qKiBxdWV1ZSBmb3Igb3V0cHV0IGJ1ZmZlcnMgKi8KKwlzdHJ1Y3QgdmIyX3F1ZXVlIHZiX3F1ZXVlOworCS8qKiBjdXJyZW50IGltYWdlIGZvcm1hdCAqLworCWNvbnN0IHN0cnVjdCBteHJfZm9ybWF0ICpmbXQ7CisJLyoqIGN1cnJlbnQgZ2VvbWV0cnkgb2YgaW1hZ2UgKi8KKwlzdHJ1Y3QgbXhyX2dlb21ldHJ5IGdlbzsKK307CisKKy8qKiBkZXNjcmlwdGlvbiBvZiBtaXhlcnMgb3V0cHV0IGludGVyZmFjZSAqLworc3RydWN0IG14cl9vdXRwdXQgeworCS8qKiBuYW1lIG9mIG91dHB1dCAqLworCWNoYXIgbmFtZVszMl07CisJLyoqIG91dHB1dCBzdWJkZXYgKi8KKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkOworCS8qKiBjb29raWUgdXNlZCBmb3IgY29uZmlndXJhdGlvbiBvZiByZWdpc3RlcnMgKi8KKwlpbnQgY29va2llOworfTsKKworLyoqIHNwZWNpZnkgc291cmNlIG9mIG91dHB1dCBzdWJkZXZzICovCitzdHJ1Y3QgbXhyX291dHB1dF9jb25mIHsKKwkvKiogbmFtZSBvZiBvdXRwdXQgKGNvbm5lY3RvcikgKi8KKwljaGFyICpvdXRwdXRfbmFtZTsKKwkvKiogbmFtZSBvZiBtb2R1bGUgdGhhdCBnZW5lcmF0ZXMgb3V0cHV0IHN1YmRldiAqLworCWNoYXIgKm1vZHVsZV9uYW1lOworCS8qKiBjb29raWUgbmVlZCBmb3IgbWl4ZXIgSFcgKi8KKwlpbnQgY29va2llOworfTsKKworc3RydWN0IGNsazsKK3N0cnVjdCByZWd1bGF0b3I7CisKKy8qKiBhdXhpbGlhcnkgcmVzb3VyY2VzIHVzZWQgbXkgbWl4ZXIgKi8KK3N0cnVjdCBteHJfcmVzb3VyY2VzIHsKKwkvKiogaW50ZXJydXB0IGluZGV4ICovCisJaW50IGlycTsKKwkvKiogcG9pbnRlciB0byBNaXhlciByZWdpc3RlcnMgKi8KKwl2b2lkIF9faW9tZW0gKm14cl9yZWdzOworCS8qKiBwb2ludGVyIHRvIFZpZGVvIFByb2Nlc3NvciByZWdpc3RlcnMgKi8KKwl2b2lkIF9faW9tZW0gKnZwX3JlZ3M7CisJLyoqIG90aGVyIHJlc291cmNlcywgc2hvdWxkIHVzZWQgdW5kZXIgbXhyX2RldmljZS5tdXRleCAqLworCXN0cnVjdCBjbGsgKm1peGVyOworCXN0cnVjdCBjbGsgKnZwOworCXN0cnVjdCBjbGsgKnNjbGtfbWl4ZXI7CisJc3RydWN0IGNsayAqc2Nsa19oZG1pOworCXN0cnVjdCBjbGsgKnNjbGtfZGFjOworfTsKKworLyogZXZlbnQgZmxhZ3MgdXNlZCAgKi8KK2VudW0gbXhyX2RldmlkZV9mbGFncyB7CisJTVhSX0VWRU5UX1ZTWU5DID0gMCwKK307CisKKy8qKiBkcml2ZXJzIGluc3RhbmNlICovCitzdHJ1Y3QgbXhyX2RldmljZSB7CisJLyoqIG1hc3RlciBkZXZpY2UgKi8KKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJLyoqIHN0YXRlIG9mIGVhY2ggbGF5ZXIgKi8KKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllcltNWFJfTUFYX0xBWUVSU107CisJLyoqIHN0YXRlIG9mIGVhY2ggb3V0cHV0ICovCisJc3RydWN0IG14cl9vdXRwdXQgKm91dHB1dFtNWFJfTUFYX09VVFBVVFNdOworCS8qKiBudW1iZXIgb2YgcmVnaXN0ZXJlZCBvdXRwdXRzICovCisJaW50IG91dHB1dF9jbnQ7CisKKwkvKiB2aWRlbyByZXNvdXJjZXMgKi8KKworCS8qKiBWNEwyIGRldmljZSAqLworCXN0cnVjdCB2NGwyX2RldmljZSB2NGwyX2RldjsKKwkvKiogY29udGV4dCBvZiBhbGxvY2F0b3IgKi8KKwl2b2lkICphbGxvY19jdHg7CisJLyoqIGV2ZW50IHdhaXQgcXVldWUgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBldmVudF9xdWV1ZTsKKwkvKiogc3RhdGUgZmxhZ3MgKi8KKwl1bnNpZ25lZCBsb25nIGV2ZW50X2ZsYWdzOworCisJLyoqIHNwaW5sb2NrIGZvciBwcm90ZWN0aW9uIG9mIHJlZ2lzdGVycyAqLworCXNwaW5sb2NrX3QgcmVnX3Nsb2NrOworCisJLyoqIG11dGV4IGZvciBwcm90ZWN0aW9uIG9mIGZpZWxkcyBiZWxvdyAqLworCXN0cnVjdCBtdXRleCBtdXRleDsKKwkvKiogbnVtYmVyIG9mIGVudGl0aWVzIGRlcG5kYW50IG9uIG91dHB1dCBjb25maWd1cmF0aW9uICovCisJaW50IG5fb3V0cHV0OworCS8qKiBudW1iZXIgb2YgdXNlcnMgdGhhdCBkbyBzdHJlYW1pbmcgKi8KKwlpbnQgbl9zdHJlYW1lcjsKKwkvKiogaW5kZXggb2YgY3VycmVudCBvdXRwdXQgKi8KKwlpbnQgY3VycmVudF9vdXRwdXQ7CisJLyoqIGF1eGlsaWFyeSByZXNvdXJjZXMgdXNlZCBteSBtaXhlciAqLworCXN0cnVjdCBteHJfcmVzb3VyY2VzIHJlczsKK307CisKKy8qKiB0cmFuc2Zvcm0gZGV2aWNlIHN0cnVjdHVyZSBpbnRvIG1peGVyIGRldmljZSAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgbXhyX2RldmljZSAqdG9fbWRldihzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHY0bDJfZGV2aWNlICp2ZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJcmV0dXJuIGNvbnRhaW5lcl9vZih2ZGV2LCBzdHJ1Y3QgbXhyX2RldmljZSwgdjRsMl9kZXYpOworfQorCisvKiogZ2V0IGN1cnJlbnQgb3V0cHV0IGRhdGEsIHNob3VsZCBiZSBjYWxsZWQgdW5kZXIgbWRldidzIG11dGV4ICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBteHJfb3V0cHV0ICp0b19vdXRwdXQoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYpCit7CisJcmV0dXJuIG1kZXYtPm91dHB1dFttZGV2LT5jdXJyZW50X291dHB1dF07Cit9CisKKy8qKiBnZXQgY3VycmVudCBvdXRwdXQgc3ViZGV2LCBzaG91bGQgYmUgY2FsbGVkIHVuZGVyIG1kZXYncyBtdXRleCAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgdjRsMl9zdWJkZXYgKnRvX291dHNkKHN0cnVjdCBteHJfZGV2aWNlICptZGV2KQoreworCXN0cnVjdCBteHJfb3V0cHV0ICpvdXQgPSB0b19vdXRwdXQobWRldik7CisJcmV0dXJuIG91dCA/IG91dC0+c2QgOiBOVUxMOworfQorCisvKiogZm9yd2FyZCBkZWNsYXJhdGlvbiBmb3IgbWl4ZXIgcGxhdGZvcm0gZGF0YSAqLworc3RydWN0IG14cl9wbGF0Zm9ybV9kYXRhOworCisvKiogYWNxdWlyaW5nIGNvbW1vbiB2aWRlbyByZXNvdXJjZXMgKi8KK2ludCBfX2RldmluaXQgbXhyX2FjcXVpcmVfdmlkZW8oc3RydWN0IG14cl9kZXZpY2UgKm1kZXYsCisJc3RydWN0IG14cl9vdXRwdXRfY29uZiAqb3V0cHV0X2NvbnQsIGludCBvdXRwdXRfY291bnQpOworCisvKiogcmVsZWFzaW5nIGNvbW1vbiB2aWRlbyByZXNvdXJjZXMgKi8KK3ZvaWQgX19kZXZleGl0IG14cl9yZWxlYXNlX3ZpZGVvKHN0cnVjdCBteHJfZGV2aWNlICptZGV2KTsKKworc3RydWN0IG14cl9sYXllciAqbXhyX2dyYXBoX2xheWVyX2NyZWF0ZShzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiwgaW50IGlkeCk7CitzdHJ1Y3QgbXhyX2xheWVyICpteHJfdnBfbGF5ZXJfY3JlYXRlKHN0cnVjdCBteHJfZGV2aWNlICptZGV2LCBpbnQgaWR4KTsKK3N0cnVjdCBteHJfbGF5ZXIgKm14cl9iYXNlX2xheWVyX2NyZWF0ZShzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiwKKwlpbnQgaWR4LCBjaGFyICpuYW1lLCBzdHJ1Y3QgbXhyX2xheWVyX29wcyAqb3BzKTsKKwordm9pZCBteHJfYmFzZV9sYXllcl9yZWxlYXNlKHN0cnVjdCBteHJfbGF5ZXIgKmxheWVyKTsKK3ZvaWQgbXhyX2xheWVyX3JlbGVhc2Uoc3RydWN0IG14cl9sYXllciAqbGF5ZXIpOworCitpbnQgbXhyX2Jhc2VfbGF5ZXJfcmVnaXN0ZXIoc3RydWN0IG14cl9sYXllciAqbGF5ZXIpOwordm9pZCBteHJfYmFzZV9sYXllcl91bnJlZ2lzdGVyKHN0cnVjdCBteHJfbGF5ZXIgKmxheWVyKTsKKwordW5zaWduZWQgbG9uZyBteHJfZ2V0X3BsYW5lX3NpemUoY29uc3Qgc3RydWN0IG14cl9ibG9jayAqYmxrLAorCXVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCk7CisKKy8qKiBhZGRzIG5ldyBjb25zdW1lciBmb3IgbWl4ZXIncyBwb3dlciAqLworaW50IF9fbXVzdF9jaGVjayBteHJfcG93ZXJfZ2V0KHN0cnVjdCBteHJfZGV2aWNlICptZGV2KTsKKy8qKiByZW1vdmVzIGNvbnN1bWVyIGZvciBtaXhlcidzIHBvd2VyICovCit2b2lkIG14cl9wb3dlcl9wdXQoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYpOworLyoqIGFkZCBuZXcgY2xpZW50IGZvciBvdXRwdXQgY29uZmlndXJhdGlvbiAqLwordm9pZCBteHJfb3V0cHV0X2dldChzdHJ1Y3QgbXhyX2RldmljZSAqbWRldik7CisvKiogcmVtb3ZlcyBuZXcgY2xpZW50IGZvciBvdXRwdXQgY29uZmlndXJhdGlvbiAqLwordm9pZCBteHJfb3V0cHV0X3B1dChzdHJ1Y3QgbXhyX2RldmljZSAqbWRldik7CisvKiogYWRkIG5ldyBjbGllbnQgZm9yIHN0cmVhbWluZyAqLwordm9pZCBteHJfc3RyZWFtZXJfZ2V0KHN0cnVjdCBteHJfZGV2aWNlICptZGV2KTsKKy8qKiByZW1vdmVzIG5ldyBjbGllbnQgZm9yIHN0cmVhbWluZyAqLwordm9pZCBteHJfc3RyZWFtZXJfcHV0KHN0cnVjdCBteHJfZGV2aWNlICptZGV2KTsKKy8qKiByZXR1cm5zIGZvcm1hdCBvZiBkYXRhIGRlbGl2YXJlZCB0byBjdXJyZW50IG91dHB1dCAqLwordm9pZCBteHJfZ2V0X21idXNfZm10KHN0cnVjdCBteHJfZGV2aWNlICptZGV2LAorCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1idXNfZm10KTsKKworLyogRGVidWcgKi8KKworI2RlZmluZSBteHJfZXJyKG1kZXYsIGZtdCwgLi4uKSAgZGV2X2VycihtZGV2LT5kZXYsIGZtdCwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgbXhyX3dhcm4obWRldiwgZm10LCAuLi4pIGRldl93YXJuKG1kZXYtPmRldiwgZm10LCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBteHJfaW5mbyhtZGV2LCBmbXQsIC4uLikgZGV2X2luZm8obWRldi0+ZGV2LCBmbXQsICMjX19WQV9BUkdTX18pCisKKyNpZmRlZiBDT05GSUdfVklERU9fU0FNU1VOR19TNVBfTUlYRVJfREVCVUcKKwkjZGVmaW5lIG14cl9kYmcobWRldiwgZm10LCAuLi4pICBkZXZfZGJnKG1kZXYtPmRldiwgZm10LCAjI19fVkFfQVJHU19fKQorI2Vsc2UKKwkjZGVmaW5lIG14cl9kYmcobWRldiwgZm10LCAuLi4pICBkbyB7ICh2b2lkKSBtZGV2OyB9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qIGFjY2Vzc2luZyBNaXhlcidzIGFuZCBWaWRlbyBQcm9jZXNzb3IncyByZWdpc3RlcnMgKi8KKwordm9pZCBteHJfdnN5bmNfc2V0X3VwZGF0ZShzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiwgaW50IGVuKTsKK3ZvaWQgbXhyX3JlZ19yZXNldChzdHJ1Y3QgbXhyX2RldmljZSAqbWRldik7CitpcnFyZXR1cm5fdCBteHJfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2RhdGEpOwordm9pZCBteHJfcmVnX3Nfb3V0cHV0KHN0cnVjdCBteHJfZGV2aWNlICptZGV2LCBpbnQgY29va2llKTsKK3ZvaWQgbXhyX3JlZ19zdHJlYW1vbihzdHJ1Y3QgbXhyX2RldmljZSAqbWRldik7Cit2b2lkIG14cl9yZWdfc3RyZWFtb2ZmKHN0cnVjdCBteHJfZGV2aWNlICptZGV2KTsKK2ludCBteHJfcmVnX3dhaXQ0dnN5bmMoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYpOwordm9pZCBteHJfcmVnX3NldF9tYnVzX2ZtdChzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiwKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICpmbXQpOwordm9pZCBteHJfcmVnX2dyYXBoX2xheWVyX3N0cmVhbShzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiwgaW50IGlkeCwgaW50IGVuKTsKK3ZvaWQgbXhyX3JlZ19ncmFwaF9idWZmZXIoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYsIGludCBpZHgsIGRtYV9hZGRyX3QgYWRkcik7Cit2b2lkIG14cl9yZWdfZ3JhcGhfZm9ybWF0KHN0cnVjdCBteHJfZGV2aWNlICptZGV2LCBpbnQgaWR4LAorCWNvbnN0IHN0cnVjdCBteHJfZm9ybWF0ICpmbXQsIGNvbnN0IHN0cnVjdCBteHJfZ2VvbWV0cnkgKmdlbyk7CisKK3ZvaWQgbXhyX3JlZ192cF9sYXllcl9zdHJlYW0oc3RydWN0IG14cl9kZXZpY2UgKm1kZXYsIGludCBlbik7Cit2b2lkIG14cl9yZWdfdnBfYnVmZmVyKHN0cnVjdCBteHJfZGV2aWNlICptZGV2LAorCWRtYV9hZGRyX3QgbHVtYV9hZGRyWzJdLCBkbWFfYWRkcl90IGNocm9tYV9hZGRyWzJdKTsKK3ZvaWQgbXhyX3JlZ192cF9mb3JtYXQoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYsCisJY29uc3Qgc3RydWN0IG14cl9mb3JtYXQgKmZtdCwgY29uc3Qgc3RydWN0IG14cl9nZW9tZXRyeSAqZ2VvKTsKK3ZvaWQgbXhyX3JlZ19kdW1wKHN0cnVjdCBteHJfZGV2aWNlICptZGV2KTsKKworI2VuZGlmIC8qIFNBTVNVTkdfTUlYRVJfSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlcl9kcnYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L21peGVyX2Rydi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNjQzMDkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlcl9kcnYuYwpAQCAtMCwwICsxLDQ4NyBAQAorLyoKKyAqIFNhbXN1bmcgVFYgTWl4ZXIgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCisgKiBUb21hc3ogU3RhbmlzbGF3c2tpLCA8dC5zdGFuaXNsYXdzQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRpYXRpb24uIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsCisgKiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCisgKi8KKworI2luY2x1ZGUgIm1peGVyLmgiCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisKK01PRFVMRV9BVVRIT1IoIlRvbWFzeiBTdGFuaXNsYXdza2ksIDx0LnN0YW5pc2xhd3NAc2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlNhbXN1bmcgTUlYRVIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyogLS0tLS0tLS0tIERSSVZFUiBQQVJBTUVURVJTIC0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBteHJfb3V0cHV0X2NvbmYgbXhyX291dHB1dF9jb25mW10gPSB7CisJeworCQkub3V0cHV0X25hbWUgPSAiUzVQIEhETUkgY29ubmVjdG9yIiwKKwkJLm1vZHVsZV9uYW1lID0gInM1cC1oZG1pIiwKKwkJLmNvb2tpZSA9IDEsCisJfSwKKwl7CisJCS5vdXRwdXRfbmFtZSA9ICJTNVAgU0RPIGNvbm5lY3RvciIsCisJCS5tb2R1bGVfbmFtZSA9ICJzNXAtc2RvIiwKKwkJLmNvb2tpZSA9IDAsCisJfSwKK307CisKK3ZvaWQgbXhyX2dldF9tYnVzX2ZtdChzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiwKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptYnVzX2ZtdCkKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkOworCWludCByZXQ7CisKKwltdXRleF9sb2NrKCZtZGV2LT5tdXRleCk7CisJc2QgPSB0b19vdXRzZChtZGV2KTsKKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHNkLCB2aWRlbywgZ19tYnVzX2ZtdCwgbWJ1c19mbXQpOworCVdBUk4ocmV0LCAiZmFpbGVkIHRvIGdldCBtYnVzX2ZtdCBmb3Igb3V0cHV0ICVzXG4iLCBzZC0+bmFtZSk7CisJbXV0ZXhfdW5sb2NrKCZtZGV2LT5tdXRleCk7Cit9CisKK3ZvaWQgbXhyX3N0cmVhbWVyX2dldChzdHJ1Y3QgbXhyX2RldmljZSAqbWRldikKK3sKKwltdXRleF9sb2NrKCZtZGV2LT5tdXRleCk7CisJKyttZGV2LT5uX3N0cmVhbWVyOworCW14cl9kYmcobWRldiwgIiVzKCVkKVxuIiwgX19mdW5jX18sIG1kZXYtPm5fc3RyZWFtZXIpOworCWlmIChtZGV2LT5uX3N0cmVhbWVyID09IDEpIHsKKwkJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHRvX291dHNkKG1kZXYpOworCQlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IG1idXNfZm10OworCQlzdHJ1Y3QgbXhyX3Jlc291cmNlcyAqcmVzID0gJm1kZXYtPnJlczsKKwkJaW50IHJldDsKKworCQlpZiAodG9fb3V0cHV0KG1kZXYpLT5jb29raWUgPT0gMCkKKwkJCWNsa19zZXRfcGFyZW50KHJlcy0+c2Nsa19taXhlciwgcmVzLT5zY2xrX2RhYyk7CisJCWVsc2UKKwkJCWNsa19zZXRfcGFyZW50KHJlcy0+c2Nsa19taXhlciwgcmVzLT5zY2xrX2hkbWkpOworCQlteHJfcmVnX3Nfb3V0cHV0KG1kZXYsIHRvX291dHB1dChtZGV2KS0+Y29va2llKTsKKworCQlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHNkLCB2aWRlbywgZ19tYnVzX2ZtdCwgJm1idXNfZm10KTsKKwkJV0FSTihyZXQsICJmYWlsZWQgdG8gZ2V0IG1idXNfZm10IGZvciBvdXRwdXQgJXNcbiIsIHNkLT5uYW1lKTsKKwkJcmV0ID0gdjRsMl9zdWJkZXZfY2FsbChzZCwgdmlkZW8sIHNfc3RyZWFtLCAxKTsKKwkJV0FSTihyZXQsICJzdGFydGluZyBzdHJlYW0gZmFpbGVkIGZvciBvdXRwdXQgJXNcbiIsIHNkLT5uYW1lKTsKKworCQlteHJfcmVnX3NldF9tYnVzX2ZtdChtZGV2LCAmbWJ1c19mbXQpOworCQlteHJfcmVnX3N0cmVhbW9uKG1kZXYpOworCQlyZXQgPSBteHJfcmVnX3dhaXQ0dnN5bmMobWRldik7CisJCVdBUk4ocmV0LCAiZmFpbGVkIHRvIGdldCB2c3luYyAoJWQpIGZyb20gb3V0cHV0XG4iLCByZXQpOworCX0KKwltdXRleF91bmxvY2soJm1kZXYtPm11dGV4KTsKKwlteHJfcmVnX2R1bXAobWRldik7CisJLyogRklYTUU6IHdoYXQgdG8gZG8gd2hlbiBzdHJlYW1pbmcgZmFpbHM/ICovCit9CisKK3ZvaWQgbXhyX3N0cmVhbWVyX3B1dChzdHJ1Y3QgbXhyX2RldmljZSAqbWRldikKK3sKKwltdXRleF9sb2NrKCZtZGV2LT5tdXRleCk7CisJLS1tZGV2LT5uX3N0cmVhbWVyOworCW14cl9kYmcobWRldiwgIiVzKCVkKVxuIiwgX19mdW5jX18sIG1kZXYtPm5fc3RyZWFtZXIpOworCWlmIChtZGV2LT5uX3N0cmVhbWVyID09IDApIHsKKwkJaW50IHJldDsKKwkJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHRvX291dHNkKG1kZXYpOworCisJCW14cl9yZWdfc3RyZWFtb2ZmKG1kZXYpOworCQkvKiB2c3luYyBhcHBsaWVzIE1peGVyIHNldHVwICovCisJCXJldCA9IG14cl9yZWdfd2FpdDR2c3luYyhtZGV2KTsKKwkJV0FSTihyZXQsICJmYWlsZWQgdG8gZ2V0IHZzeW5jICglZCkgZnJvbSBvdXRwdXRcbiIsIHJldCk7CisJCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIHZpZGVvLCBzX3N0cmVhbSwgMCk7CisJCVdBUk4ocmV0LCAic3RvcHBpbmcgc3RyZWFtIGZhaWxlZCBmb3Igb3V0cHV0ICVzXG4iLCBzZC0+bmFtZSk7CisJfQorCVdBUk4obWRldi0+bl9zdHJlYW1lciA8IDAsICJuZWdhdGl2ZSBudW1iZXIgb2Ygc3RyZWFtZXJzICglZClcbiIsCisJCW1kZXYtPm5fc3RyZWFtZXIpOworCW11dGV4X3VubG9jaygmbWRldi0+bXV0ZXgpOworCW14cl9yZWdfZHVtcChtZGV2KTsKK30KKwordm9pZCBteHJfb3V0cHV0X2dldChzdHJ1Y3QgbXhyX2RldmljZSAqbWRldikKK3sKKwltdXRleF9sb2NrKCZtZGV2LT5tdXRleCk7CisJKyttZGV2LT5uX291dHB1dDsKKwlteHJfZGJnKG1kZXYsICIlcyglZClcbiIsIF9fZnVuY19fLCBtZGV2LT5uX291dHB1dCk7CisJLyogdHVybiBvbiBhdXhpbGlhcnkgZHJpdmVyICovCisJaWYgKG1kZXYtPm5fb3V0cHV0ID09IDEpCisJCXY0bDJfc3ViZGV2X2NhbGwodG9fb3V0c2QobWRldiksIGNvcmUsIHNfcG93ZXIsIDEpOworCW11dGV4X3VubG9jaygmbWRldi0+bXV0ZXgpOworfQorCit2b2lkIG14cl9vdXRwdXRfcHV0KHN0cnVjdCBteHJfZGV2aWNlICptZGV2KQoreworCW11dGV4X2xvY2soJm1kZXYtPm11dGV4KTsKKwktLW1kZXYtPm5fb3V0cHV0OworCW14cl9kYmcobWRldiwgIiVzKCVkKVxuIiwgX19mdW5jX18sIG1kZXYtPm5fb3V0cHV0KTsKKwkvKiB0dXJuIG9uIGF1eGlsaWFyeSBkcml2ZXIgKi8KKwlpZiAobWRldi0+bl9vdXRwdXQgPT0gMCkKKwkJdjRsMl9zdWJkZXZfY2FsbCh0b19vdXRzZChtZGV2KSwgY29yZSwgc19wb3dlciwgMCk7CisJV0FSTihtZGV2LT5uX291dHB1dCA8IDAsICJuZWdhdGl2ZSBudW1iZXIgb2Ygb3V0cHV0IHVzZXJzICglZClcbiIsCisJCW1kZXYtPm5fb3V0cHV0KTsKKwltdXRleF91bmxvY2soJm1kZXYtPm11dGV4KTsKK30KKworaW50IG14cl9wb3dlcl9nZXQoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYpCit7CisJaW50IHJldCA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMobWRldi0+ZGV2KTsKKworCS8qIHJldHVybmluZyAxIG1lYW5zIHRoYXQgcG93ZXIgaXMgYWxyZWFkeSBlbmFibGVkLAorCSAqIHNvIHplcm8gc3VjY2VzcyBiZSByZXR1cm5lZCAqLworCWlmIChJU19FUlJfVkFMVUUocmV0KSkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBteHJfcG93ZXJfcHV0KHN0cnVjdCBteHJfZGV2aWNlICptZGV2KQoreworCXBtX3J1bnRpbWVfcHV0X3N5bmMobWRldi0+ZGV2KTsKK30KKworLyogLS0tLS0tLS0tIFJFU09VUkNFIE1BTkFHRU1FTlQgLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG14cl9hY3F1aXJlX3BsYXRfcmVzb3VyY2VzKHN0cnVjdCBteHJfZGV2aWNlICptZGV2LAorCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IHJldDsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRldiwgSU9SRVNPVVJDRV9NRU0sICJteHIiKTsKKwlpZiAocmVzID09IE5VTEwpIHsKKwkJbXhyX2VycihtZGV2LCAiZ2V0IG1lbW9yeSByZXNvdXJjZSBmYWlsZWQuXG4iKTsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIGZhaWw7CisJfQorCisJbWRldi0+cmVzLm14cl9yZWdzID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmIChtZGV2LT5yZXMubXhyX3JlZ3MgPT0gTlVMTCkgeworCQlteHJfZXJyKG1kZXYsICJyZWdpc3RlciBtYXBwaW5nIGZhaWxlZC5cbiIpOworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2VfYnluYW1lKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAidnAiKTsKKwlpZiAocmVzID09IE5VTEwpIHsKKwkJbXhyX2VycihtZGV2LCAiZ2V0IG1lbW9yeSByZXNvdXJjZSBmYWlsZWQuXG4iKTsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIGZhaWxfbXhyX3JlZ3M7CisJfQorCisJbWRldi0+cmVzLnZwX3JlZ3MgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKG1kZXYtPnJlcy52cF9yZWdzID09IE5VTEwpIHsKKwkJbXhyX2VycihtZGV2LCAicmVnaXN0ZXIgbWFwcGluZyBmYWlsZWQuXG4iKTsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIGZhaWxfbXhyX3JlZ3M7CisJfQorCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlX2J5bmFtZShwZGV2LCBJT1JFU09VUkNFX0lSUSwgImlycSIpOworCWlmIChyZXMgPT0gTlVMTCkgeworCQlteHJfZXJyKG1kZXYsICJnZXQgaW50ZXJydXB0IHJlc291cmNlIGZhaWxlZC5cbiIpOworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gZmFpbF92cF9yZWdzOworCX0KKworCXJldCA9IHJlcXVlc3RfaXJxKHJlcy0+c3RhcnQsIG14cl9pcnFfaGFuZGxlciwgMCwgInM1cC1taXhlciIsIG1kZXYpOworCWlmIChyZXQpIHsKKwkJbXhyX2VycihtZGV2LCAicmVxdWVzdCBpbnRlcnJ1cHQgZmFpbGVkLlxuIik7CisJCWdvdG8gZmFpbF92cF9yZWdzOworCX0KKwltZGV2LT5yZXMuaXJxID0gcmVzLT5zdGFydDsKKworCXJldHVybiAwOworCitmYWlsX3ZwX3JlZ3M6CisJaW91bm1hcChtZGV2LT5yZXMudnBfcmVncyk7CisKK2ZhaWxfbXhyX3JlZ3M6CisJaW91bm1hcChtZGV2LT5yZXMubXhyX3JlZ3MpOworCitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG14cl9yZWxlYXNlX3BsYXRfcmVzb3VyY2VzKHN0cnVjdCBteHJfZGV2aWNlICptZGV2KQoreworCWZyZWVfaXJxKG1kZXYtPnJlcy5pcnEsIG1kZXYpOworCWlvdW5tYXAobWRldi0+cmVzLnZwX3JlZ3MpOworCWlvdW5tYXAobWRldi0+cmVzLm14cl9yZWdzKTsKK30KKworc3RhdGljIHZvaWQgbXhyX3JlbGVhc2VfY2xvY2tzKHN0cnVjdCBteHJfZGV2aWNlICptZGV2KQoreworCXN0cnVjdCBteHJfcmVzb3VyY2VzICpyZXMgPSAmbWRldi0+cmVzOworCisJaWYgKCFJU19FUlJfT1JfTlVMTChyZXMtPnNjbGtfZGFjKSkKKwkJY2xrX3B1dChyZXMtPnNjbGtfZGFjKTsKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKHJlcy0+c2Nsa19oZG1pKSkKKwkJY2xrX3B1dChyZXMtPnNjbGtfaGRtaSk7CisJaWYgKCFJU19FUlJfT1JfTlVMTChyZXMtPnNjbGtfbWl4ZXIpKQorCQljbGtfcHV0KHJlcy0+c2Nsa19taXhlcik7CisJaWYgKCFJU19FUlJfT1JfTlVMTChyZXMtPnZwKSkKKwkJY2xrX3B1dChyZXMtPnZwKTsKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKHJlcy0+bWl4ZXIpKQorCQljbGtfcHV0KHJlcy0+bWl4ZXIpOworfQorCitzdGF0aWMgaW50IG14cl9hY3F1aXJlX2Nsb2NrcyhzdHJ1Y3QgbXhyX2RldmljZSAqbWRldikKK3sKKwlzdHJ1Y3QgbXhyX3Jlc291cmNlcyAqcmVzID0gJm1kZXYtPnJlczsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBtZGV2LT5kZXY7CisKKwlyZXMtPm1peGVyID0gY2xrX2dldChkZXYsICJtaXhlciIpOworCWlmIChJU19FUlJfT1JfTlVMTChyZXMtPm1peGVyKSkgeworCQlteHJfZXJyKG1kZXYsICJmYWlsZWQgdG8gZ2V0IGNsb2NrICdtaXhlcidcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCXJlcy0+dnAgPSBjbGtfZ2V0KGRldiwgInZwIik7CisJaWYgKElTX0VSUl9PUl9OVUxMKHJlcy0+dnApKSB7CisJCW14cl9lcnIobWRldiwgImZhaWxlZCB0byBnZXQgY2xvY2sgJ3ZwJ1xuIik7CisJCWdvdG8gZmFpbDsKKwl9CisJcmVzLT5zY2xrX21peGVyID0gY2xrX2dldChkZXYsICJzY2xrX21peGVyIik7CisJaWYgKElTX0VSUl9PUl9OVUxMKHJlcy0+c2Nsa19taXhlcikpIHsKKwkJbXhyX2VycihtZGV2LCAiZmFpbGVkIHRvIGdldCBjbG9jayAnc2Nsa19taXhlcidcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCXJlcy0+c2Nsa19oZG1pID0gY2xrX2dldChkZXYsICJzY2xrX2hkbWkiKTsKKwlpZiAoSVNfRVJSX09SX05VTEwocmVzLT5zY2xrX2hkbWkpKSB7CisJCW14cl9lcnIobWRldiwgImZhaWxlZCB0byBnZXQgY2xvY2sgJ3NjbGtfaGRtaSdcbiIpOworCQlnb3RvIGZhaWw7CisJfQorCXJlcy0+c2Nsa19kYWMgPSBjbGtfZ2V0KGRldiwgInNjbGtfZGFjIik7CisJaWYgKElTX0VSUl9PUl9OVUxMKHJlcy0+c2Nsa19kYWMpKSB7CisJCW14cl9lcnIobWRldiwgImZhaWxlZCB0byBnZXQgY2xvY2sgJ3NjbGtfZGFjJ1xuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyZXR1cm4gMDsKK2ZhaWw6CisJbXhyX3JlbGVhc2VfY2xvY2tzKG1kZXYpOworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBteHJfYWNxdWlyZV9yZXNvdXJjZXMoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYsCisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0OworCXJldCA9IG14cl9hY3F1aXJlX3BsYXRfcmVzb3VyY2VzKG1kZXYsIHBkZXYpOworCisJaWYgKHJldCkKKwkJZ290byBmYWlsOworCisJcmV0ID0gbXhyX2FjcXVpcmVfY2xvY2tzKG1kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbF9wbGF0OworCisJbXhyX2luZm8obWRldiwgInJlc291cmNlcyBhY3F1aXJlZFxuIik7CisJcmV0dXJuIDA7CisKK2ZhaWxfcGxhdDoKKwlteHJfcmVsZWFzZV9wbGF0X3Jlc291cmNlcyhtZGV2KTsKK2ZhaWw6CisJbXhyX2VycihtZGV2LCAicmVzb3VyY2VzIGFjcXVpcmUgZmFpbGVkXG4iKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBteHJfcmVsZWFzZV9yZXNvdXJjZXMoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYpCit7CisJbXhyX3JlbGVhc2VfY2xvY2tzKG1kZXYpOworCW14cl9yZWxlYXNlX3BsYXRfcmVzb3VyY2VzKG1kZXYpOworCW1lbXNldCgmbWRldi0+cmVzLCAwLCBzaXplb2YgbWRldi0+cmVzKTsKK30KKworc3RhdGljIHZvaWQgbXhyX3JlbGVhc2VfbGF5ZXJzKHN0cnVjdCBteHJfZGV2aWNlICptZGV2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWRldi0+bGF5ZXIpOyArK2kpCisJCWlmIChtZGV2LT5sYXllcltpXSkKKwkJCW14cl9sYXllcl9yZWxlYXNlKG1kZXYtPmxheWVyW2ldKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgbXhyX2FjcXVpcmVfbGF5ZXJzKHN0cnVjdCBteHJfZGV2aWNlICptZGV2LAorCXN0cnVjdCBteHJfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCit7CisJbWRldi0+bGF5ZXJbMF0gPSBteHJfZ3JhcGhfbGF5ZXJfY3JlYXRlKG1kZXYsIDApOworCW1kZXYtPmxheWVyWzFdID0gbXhyX2dyYXBoX2xheWVyX2NyZWF0ZShtZGV2LCAxKTsKKwltZGV2LT5sYXllclsyXSA9IG14cl92cF9sYXllcl9jcmVhdGUobWRldiwgMCk7CisKKwlpZiAoIW1kZXYtPmxheWVyWzBdIHx8ICFtZGV2LT5sYXllclsxXSB8fCAhbWRldi0+bGF5ZXJbMl0pIHsKKwkJbXhyX2VycihtZGV2LCAiZmFpbGVkIHRvIGFjcXVpcmUgbGF5ZXJzXG4iKTsKKwkJZ290byBmYWlsOworCX0KKworCXJldHVybiAwOworCitmYWlsOgorCW14cl9yZWxlYXNlX2xheWVycyhtZGV2KTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyogLS0tLS0tLS0tLSBQT1dFUiBNQU5BR0VNRU5UIC0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgbXhyX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiA9IHRvX21kZXYoZGV2KTsKKwlzdHJ1Y3QgbXhyX3Jlc291cmNlcyAqcmVzID0gJm1kZXYtPnJlczsKKworCW14cl9kYmcobWRldiwgInJlc3VtZSAtIHN0YXJ0XG4iKTsKKwltdXRleF9sb2NrKCZtZGV2LT5tdXRleCk7CisJLyogdHVybiBjbG9ja3Mgb24gKi8KKwljbGtfZW5hYmxlKHJlcy0+bWl4ZXIpOworCWNsa19lbmFibGUocmVzLT52cCk7CisJY2xrX2VuYWJsZShyZXMtPnNjbGtfbWl4ZXIpOworCS8qIGFwcGx5IGRlZmF1bHQgY29uZmlndXJhdGlvbiAqLworCW14cl9yZWdfcmVzZXQobWRldik7CisJbXhyX2RiZyhtZGV2LCAicmVzdW1lIC0gZmluaXNoZWRcbiIpOworCisJbXV0ZXhfdW5sb2NrKCZtZGV2LT5tdXRleCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXhyX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG14cl9kZXZpY2UgKm1kZXYgPSB0b19tZGV2KGRldik7CisJc3RydWN0IG14cl9yZXNvdXJjZXMgKnJlcyA9ICZtZGV2LT5yZXM7CisJbXhyX2RiZyhtZGV2LCAic3VzcGVuZCAtIHN0YXJ0XG4iKTsKKwltdXRleF9sb2NrKCZtZGV2LT5tdXRleCk7CisJLyogdHVybiBjbG9ja3Mgb2ZmICovCisJY2xrX2Rpc2FibGUocmVzLT5zY2xrX21peGVyKTsKKwljbGtfZGlzYWJsZShyZXMtPnZwKTsKKwljbGtfZGlzYWJsZShyZXMtPm1peGVyKTsKKwltdXRleF91bmxvY2soJm1kZXYtPm11dGV4KTsKKwlteHJfZGJnKG1kZXYsICJzdXNwZW5kIC0gZmluaXNoZWRcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgbXhyX3BtX29wcyA9IHsKKwkucnVudGltZV9zdXNwZW5kID0gbXhyX3J1bnRpbWVfc3VzcGVuZCwKKwkucnVudGltZV9yZXN1bWUJID0gbXhyX3J1bnRpbWVfcmVzdW1lLAorfTsKKworLyogLS0tLS0tLS0tIERSSVZFUiBJTklUSUFMSVpBVElPTiAtLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG14cl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IG14cl9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldi0+cGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgbXhyX2RldmljZSAqbWRldjsKKwlpbnQgcmV0OworCisJLyogbWRldiBkb2VzIG5vdCBleGlzdCB5ZXQgc28gbm8gbXhyX2RiZyBpcyB1c2VkICovCisJZGV2X2luZm8oZGV2LCAicHJvYmUgc3RhcnRcbiIpOworCisJbWRldiA9IGt6YWxsb2Moc2l6ZW9mICptZGV2LCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1kZXYpIHsKKwkJbXhyX2VycihtZGV2LCAibm90IGVub3VnaCBtZW1vcnkuXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKworCS8qIHNldHVwIHBvaW50ZXIgdG8gbWFzdGVyIGRldmljZSAqLworCW1kZXYtPmRldiA9IGRldjsKKworCW11dGV4X2luaXQoJm1kZXYtPm11dGV4KTsKKwlzcGluX2xvY2tfaW5pdCgmbWRldi0+cmVnX3Nsb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtZGV2LT5ldmVudF9xdWV1ZSk7CisKKwkvKiBhY3F1aXJlIHJlc291cmNlczogcmVncywgaXJxcywgY2xvY2tzLCByZWd1bGF0b3JzICovCisJcmV0ID0gbXhyX2FjcXVpcmVfcmVzb3VyY2VzKG1kZXYsIHBkZXYpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbF9tZW07CisKKwkvKiBjb25maWd1cmUgcmVzb3VyY2VzIGZvciB2aWRlbyBvdXRwdXQgKi8KKwlyZXQgPSBteHJfYWNxdWlyZV92aWRlbyhtZGV2LCBteHJfb3V0cHV0X2NvbmYsCisJCUFSUkFZX1NJWkUobXhyX291dHB1dF9jb25mKSk7CisJaWYgKHJldCkKKwkJZ290byBmYWlsX3Jlc291cmNlczsKKworCS8qIGNvbmZpZ3VyZSBsYXllcnMgKi8KKwlyZXQgPSBteHJfYWNxdWlyZV9sYXllcnMobWRldiwgcGRhdGEpOworCWlmIChyZXQpCisJCWdvdG8gZmFpbF92aWRlbzsKKworCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7CisKKwlteHJfaW5mbyhtZGV2LCAicHJvYmUgc3VjY2Vzc2Z1bFxuIik7CisJcmV0dXJuIDA7CisKK2ZhaWxfdmlkZW86CisJbXhyX3JlbGVhc2VfdmlkZW8obWRldik7CisKK2ZhaWxfcmVzb3VyY2VzOgorCW14cl9yZWxlYXNlX3Jlc291cmNlcyhtZGV2KTsKKworZmFpbF9tZW06CisJa2ZyZWUobWRldik7CisKK2ZhaWw6CisJZGV2X2luZm8oZGV2LCAicHJvYmUgZmFpbGVkXG4iKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBteHJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYtPmRldjsKKwlzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiA9IHRvX21kZXYoZGV2KTsKKworCXBtX3J1bnRpbWVfZGlzYWJsZShkZXYpOworCisJbXhyX3JlbGVhc2VfbGF5ZXJzKG1kZXYpOworCW14cl9yZWxlYXNlX3ZpZGVvKG1kZXYpOworCW14cl9yZWxlYXNlX3Jlc291cmNlcyhtZGV2KTsKKworCWtmcmVlKG1kZXYpOworCisJZGV2X2luZm8oZGV2LCAicmVtb3ZlIHN1Y2Vzc2Z1bFxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG14cl9kcml2ZXIgX19yZWZkYXRhID0geworCS5wcm9iZSA9IG14cl9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AobXhyX3JlbW92ZSksCisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSBNWFJfRFJJVkVSX05BTUUsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCQkucG0gPSAmbXhyX3BtX29wcywKKwl9Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBteHJfaW5pdCh2b2lkKQoreworCWludCBpLCByZXQ7CisJc3RhdGljIGNvbnN0IGNoYXIgYmFubmVyW10gX19pbml0ZGF0YSA9IEtFUk5fSU5GTworCQkiU2Ftc3VuZyBUViBNaXhlciBkcml2ZXIsICIKKwkJIihjKSAyMDEwLTIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC5cbiI7CisJcHJpbnRrKGJhbm5lcik7CisKKwkvKiBMb2FkaW5nIGF1eGlsaWFyeSBtb2R1bGVzICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobXhyX291dHB1dF9jb25mKTsgKytpKQorCQlyZXF1ZXN0X21vZHVsZShteHJfb3V0cHV0X2NvbmZbaV0ubW9kdWxlX25hbWUpOworCisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZteHJfZHJpdmVyKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJyZWdpc3RyYXRpb24gb2YgTUlYRVIgZHJpdmVyIGZhaWxlZFxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJcmV0dXJuIDA7Cit9Cittb2R1bGVfaW5pdChteHJfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBteHJfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZteHJfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KG14cl9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L21peGVyX2dycF9sYXllci5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvbWl4ZXJfZ3JwX2xheWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThmMGJhNAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L21peGVyX2dycF9sYXllci5jCkBAIC0wLDAgKzEsMTg1IEBACisvKgorICogU2Ftc3VuZyBUViBNaXhlciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoKKyAqIFRvbWFzeiBTdGFuaXNsYXdza2ksIDx0LnN0YW5pc2xhd3NAc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGlhdGlvbi4gZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwKKyAqIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KKyAqLworCisjaW5jbHVkZSAibWl4ZXIuaCIKKworI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi1kbWEtY29udGlnLmg+CisKKy8qIEZPUk1BVCBERUZJTklUSU9OUyAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IG14cl9mb3JtYXQgbXhyX2ZiX2ZtdF9yZ2I1NjUgPSB7CisJLm5hbWUgPSAiUkdCNTY1IiwKKwkuZm91cmNjID0gVjRMMl9QSVhfRk1UX1JHQjU2NSwKKwkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCLAorCS5udW1fcGxhbmVzID0gMSwKKwkucGxhbmUgPSB7CisJCXsgLndpZHRoID0gMSwgLmhlaWdodCA9IDEsIC5zaXplID0gMiB9LAorCX0sCisJLm51bV9zdWJmcmFtZXMgPSAxLAorCS5jb29raWUgPSA0LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBteHJfZm9ybWF0IG14cl9mYl9mbXRfYXJnYjE1NTUgPSB7CisJLm5hbWUgPSAiQVJHQjE1NTUiLAorCS5udW1fcGxhbmVzID0gMSwKKwkuZm91cmNjID0gVjRMMl9QSVhfRk1UX1JHQjU1NSwKKwkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9TUkdCLAorCS5wbGFuZSA9IHsKKwkJeyAud2lkdGggPSAxLCAuaGVpZ2h0ID0gMSwgLnNpemUgPSAyIH0sCisJfSwKKwkubnVtX3N1YmZyYW1lcyA9IDEsCisJLmNvb2tpZSA9IDUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG14cl9mb3JtYXQgbXhyX2ZiX2ZtdF9hcmdiNDQ0NCA9IHsKKwkubmFtZSA9ICJBUkdCNDQ0NCIsCisJLm51bV9wbGFuZXMgPSAxLAorCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfUkdCNDQ0LAorCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0IsCisJLnBsYW5lID0geworCQl7IC53aWR0aCA9IDEsIC5oZWlnaHQgPSAxLCAuc2l6ZSA9IDIgfSwKKwl9LAorCS5udW1fc3ViZnJhbWVzID0gMSwKKwkuY29va2llID0gNiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXhyX2Zvcm1hdCBteHJfZmJfZm10X2FyZ2I4ODg4ID0geworCS5uYW1lID0gIkFSR0I4ODg4IiwKKwkuZm91cmNjID0gVjRMMl9QSVhfRk1UX0JHUjMyLAorCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX1NSR0IsCisJLm51bV9wbGFuZXMgPSAxLAorCS5wbGFuZSA9IHsKKwkJeyAud2lkdGggPSAxLCAuaGVpZ2h0ID0gMSwgLnNpemUgPSA0IH0sCisJfSwKKwkubnVtX3N1YmZyYW1lcyA9IDEsCisJLmNvb2tpZSA9IDcsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG14cl9mb3JtYXQgKm14cl9ncmFwaF9mb3JtYXRbXSA9IHsKKwkmbXhyX2ZiX2ZtdF9yZ2I1NjUsCisJJm14cl9mYl9mbXRfYXJnYjE1NTUsCisJJm14cl9mYl9mbXRfYXJnYjQ0NDQsCisJJm14cl9mYl9mbXRfYXJnYjg4ODgsCit9OworCisvKiBBVVhJTElBUlkgQ0FMTEJBQ0tTICovCisKK3N0YXRpYyB2b2lkIG14cl9ncmFwaF9sYXllcl9yZWxlYXNlKHN0cnVjdCBteHJfbGF5ZXIgKmxheWVyKQoreworCW14cl9iYXNlX2xheWVyX3VucmVnaXN0ZXIobGF5ZXIpOworCW14cl9iYXNlX2xheWVyX3JlbGVhc2UobGF5ZXIpOworfQorCitzdGF0aWMgdm9pZCBteHJfZ3JhcGhfYnVmZmVyX3NldChzdHJ1Y3QgbXhyX2xheWVyICpsYXllciwKKwlzdHJ1Y3QgbXhyX2J1ZmZlciAqYnVmKQoreworCWRtYV9hZGRyX3QgYWRkciA9IDA7CisKKwlpZiAoYnVmKQorCQlhZGRyID0gdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIoJmJ1Zi0+dmIsIDApOworCW14cl9yZWdfZ3JhcGhfYnVmZmVyKGxheWVyLT5tZGV2LCBsYXllci0+aWR4LCBhZGRyKTsKK30KKworc3RhdGljIHZvaWQgbXhyX2dyYXBoX3N0cmVhbV9zZXQoc3RydWN0IG14cl9sYXllciAqbGF5ZXIsIGludCBlbikKK3sKKwlteHJfcmVnX2dyYXBoX2xheWVyX3N0cmVhbShsYXllci0+bWRldiwgbGF5ZXItPmlkeCwgZW4pOworfQorCitzdGF0aWMgdm9pZCBteHJfZ3JhcGhfZm9ybWF0X3NldChzdHJ1Y3QgbXhyX2xheWVyICpsYXllcikKK3sKKwlteHJfcmVnX2dyYXBoX2Zvcm1hdChsYXllci0+bWRldiwgbGF5ZXItPmlkeCwKKwkJbGF5ZXItPmZtdCwgJmxheWVyLT5nZW8pOworfQorCitzdGF0aWMgdm9pZCBteHJfZ3JhcGhfZml4X2dlb21ldHJ5KHN0cnVjdCBteHJfbGF5ZXIgKmxheWVyKQoreworCXN0cnVjdCBteHJfZ2VvbWV0cnkgKmdlbyA9ICZsYXllci0+Z2VvOworCisJLyogbGltaXQgdG8gYm91bmRhcnkgc2l6ZSAqLworCWdlby0+c3JjLmZ1bGxfd2lkdGggPSBjbGFtcF92YWwoZ2VvLT5zcmMuZnVsbF93aWR0aCwgMSwgMzI3NjcpOworCWdlby0+c3JjLmZ1bGxfaGVpZ2h0ID0gY2xhbXBfdmFsKGdlby0+c3JjLmZ1bGxfaGVpZ2h0LCAxLCAyMDQ3KTsKKwlnZW8tPnNyYy53aWR0aCA9IGNsYW1wX3ZhbChnZW8tPnNyYy53aWR0aCwgMSwgZ2VvLT5zcmMuZnVsbF93aWR0aCk7CisJZ2VvLT5zcmMud2lkdGggPSBtaW4oZ2VvLT5zcmMud2lkdGgsIDIwNDdVKTsKKwkvKiBub3QgcG9zc2libGUgdG8gY3JvcCBvZiBZIGF4aXMgKi8KKwlnZW8tPnNyYy55X29mZnNldCA9IG1pbihnZW8tPnNyYy55X29mZnNldCwgZ2VvLT5zcmMuZnVsbF9oZWlnaHQgLSAxKTsKKwlnZW8tPnNyYy5oZWlnaHQgPSBnZW8tPnNyYy5mdWxsX2hlaWdodCAtIGdlby0+c3JjLnlfb2Zmc2V0OworCS8qIGxpbWl0dGluZyBvZmZzZXQgKi8KKwlnZW8tPnNyYy54X29mZnNldCA9IG1pbihnZW8tPnNyYy54X29mZnNldCwKKwkJZ2VvLT5zcmMuZnVsbF93aWR0aCAtIGdlby0+c3JjLndpZHRoKTsKKworCS8qIHNldHRpbmcgcG9zaXRpb24gaW4gb3V0cHV0ICovCisJZ2VvLT5kc3Qud2lkdGggPSBtaW4oZ2VvLT5kc3Qud2lkdGgsIGdlby0+ZHN0LmZ1bGxfd2lkdGgpOworCWdlby0+ZHN0LmhlaWdodCA9IG1pbihnZW8tPmRzdC5oZWlnaHQsIGdlby0+ZHN0LmZ1bGxfaGVpZ2h0KTsKKworCS8qIE1peGVyIHN1cHBvcnRzIG9ubHkgMXggYW5kIDJ4IHNjYWxpbmcgKi8KKwlpZiAoZ2VvLT5kc3Qud2lkdGggPj0gMiAqIGdlby0+c3JjLndpZHRoKSB7CisJCWdlby0+eF9yYXRpbyA9IDE7CisJCWdlby0+ZHN0LndpZHRoID0gMiAqIGdlby0+c3JjLndpZHRoOworCX0gZWxzZSB7CisJCWdlby0+eF9yYXRpbyA9IDA7CisJCWdlby0+ZHN0LndpZHRoID0gZ2VvLT5zcmMud2lkdGg7CisJfQorCisJaWYgKGdlby0+ZHN0LmhlaWdodCA+PSAyICogZ2VvLT5zcmMuaGVpZ2h0KSB7CisJCWdlby0+eV9yYXRpbyA9IDE7CisJCWdlby0+ZHN0LmhlaWdodCA9IDIgKiBnZW8tPnNyYy5oZWlnaHQ7CisJfSBlbHNlIHsKKwkJZ2VvLT55X3JhdGlvID0gMDsKKwkJZ2VvLT5kc3QuaGVpZ2h0ID0gZ2VvLT5zcmMuaGVpZ2h0OworCX0KKworCWdlby0+ZHN0Lnhfb2Zmc2V0ID0gbWluKGdlby0+ZHN0Lnhfb2Zmc2V0LAorCQlnZW8tPmRzdC5mdWxsX3dpZHRoIC0gZ2VvLT5kc3Qud2lkdGgpOworCWdlby0+ZHN0Lnlfb2Zmc2V0ID0gbWluKGdlby0+ZHN0Lnlfb2Zmc2V0LAorCQlnZW8tPmRzdC5mdWxsX2hlaWdodCAtIGdlby0+ZHN0LmhlaWdodCk7Cit9CisKKy8qIFBVQkxJQyBBUEkgKi8KKworc3RydWN0IG14cl9sYXllciAqbXhyX2dyYXBoX2xheWVyX2NyZWF0ZShzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiwgaW50IGlkeCkKK3sKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllcjsKKwlpbnQgcmV0OworCXN0cnVjdCBteHJfbGF5ZXJfb3BzIG9wcyA9IHsKKwkJLnJlbGVhc2UgPSBteHJfZ3JhcGhfbGF5ZXJfcmVsZWFzZSwKKwkJLmJ1ZmZlcl9zZXQgPSBteHJfZ3JhcGhfYnVmZmVyX3NldCwKKwkJLnN0cmVhbV9zZXQgPSBteHJfZ3JhcGhfc3RyZWFtX3NldCwKKwkJLmZvcm1hdF9zZXQgPSBteHJfZ3JhcGhfZm9ybWF0X3NldCwKKwkJLmZpeF9nZW9tZXRyeSA9IG14cl9ncmFwaF9maXhfZ2VvbWV0cnksCisJfTsKKwljaGFyIG5hbWVbMzJdOworCisJc3ByaW50ZihuYW1lLCAiZ3JhcGglZCIsIGlkeCk7CisKKwlsYXllciA9IG14cl9iYXNlX2xheWVyX2NyZWF0ZShtZGV2LCBpZHgsIG5hbWUsICZvcHMpOworCWlmIChsYXllciA9PSBOVUxMKSB7CisJCW14cl9lcnIobWRldiwgImZhaWxlZCB0byBpbml0aWFsaXplIGxheWVyKCVkKSBiYXNlXG4iLCBpZHgpOworCQlnb3RvIGZhaWw7CisJfQorCisJbGF5ZXItPmZtdF9hcnJheSA9IG14cl9ncmFwaF9mb3JtYXQ7CisJbGF5ZXItPmZtdF9hcnJheV9zaXplID0gQVJSQVlfU0laRShteHJfZ3JhcGhfZm9ybWF0KTsKKworCXJldCA9IG14cl9iYXNlX2xheWVyX3JlZ2lzdGVyKGxheWVyKTsKKwlpZiAocmV0KQorCQlnb3RvIGZhaWxfbGF5ZXI7CisKKwlyZXR1cm4gbGF5ZXI7CisKK2ZhaWxfbGF5ZXI6CisJbXhyX2Jhc2VfbGF5ZXJfcmVsZWFzZShsYXllcik7CisKK2ZhaWw6CisJcmV0dXJuIE5VTEw7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L21peGVyX3JlZy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvbWl4ZXJfcmVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhkYWM2NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L21peGVyX3JlZy5jCkBAIC0wLDAgKzEsNTQxIEBACisvKgorICogU2Ftc3VuZyBUViBNaXhlciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoKKyAqIFRvbWFzeiBTdGFuaXNsYXdza2ksIDx0LnN0YW5pc2xhd3NAc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGlhdGlvbi4gZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwKKyAqIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KKyAqLworCisjaW5jbHVkZSAibWl4ZXIuaCIKKyNpbmNsdWRlICJyZWdzLW1peGVyLmgiCisjaW5jbHVkZSAicmVncy12cC5oIgorCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworLyogUmVnaXN0ZXIgYWNjZXNzIHN1YnJvdXRpbmVzICovCisKK3N0YXRpYyBpbmxpbmUgdTMyIHZwX3JlYWQoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYsIHUzMiByZWdfaWQpCit7CisJcmV0dXJuIHJlYWRsKG1kZXYtPnJlcy52cF9yZWdzICsgcmVnX2lkKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHZwX3dyaXRlKHN0cnVjdCBteHJfZGV2aWNlICptZGV2LCB1MzIgcmVnX2lkLCB1MzIgdmFsKQoreworCXdyaXRlbCh2YWwsIG1kZXYtPnJlcy52cF9yZWdzICsgcmVnX2lkKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHZwX3dyaXRlX21hc2soc3RydWN0IG14cl9kZXZpY2UgKm1kZXYsIHUzMiByZWdfaWQsCisJdTMyIHZhbCwgdTMyIG1hc2spCit7CisJdTMyIG9sZCA9IHZwX3JlYWQobWRldiwgcmVnX2lkKTsKKworCXZhbCA9ICh2YWwgJiBtYXNrKSB8IChvbGQgJiB+bWFzayk7CisJd3JpdGVsKHZhbCwgbWRldi0+cmVzLnZwX3JlZ3MgKyByZWdfaWQpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiBteHJfcmVhZChzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiwgdTMyIHJlZ19pZCkKK3sKKwlyZXR1cm4gcmVhZGwobWRldi0+cmVzLm14cl9yZWdzICsgcmVnX2lkKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG14cl93cml0ZShzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiwgdTMyIHJlZ19pZCwgdTMyIHZhbCkKK3sKKwl3cml0ZWwodmFsLCBtZGV2LT5yZXMubXhyX3JlZ3MgKyByZWdfaWQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbXhyX3dyaXRlX21hc2soc3RydWN0IG14cl9kZXZpY2UgKm1kZXYsIHUzMiByZWdfaWQsCisJdTMyIHZhbCwgdTMyIG1hc2spCit7CisJdTMyIG9sZCA9IG14cl9yZWFkKG1kZXYsIHJlZ19pZCk7CisKKwl2YWwgPSAodmFsICYgbWFzaykgfCAob2xkICYgfm1hc2spOworCXdyaXRlbCh2YWwsIG1kZXYtPnJlcy5teHJfcmVncyArIHJlZ19pZCk7Cit9CisKK3ZvaWQgbXhyX3ZzeW5jX3NldF91cGRhdGUoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYsIGludCBlbikKK3sKKwkvKiBibG9jayB1cGRhdGUgb24gdnN5bmMgKi8KKwlteHJfd3JpdGVfbWFzayhtZGV2LCBNWFJfU1RBVFVTLCBlbiA/IE1YUl9TVEFUVVNfU1lOQ19FTkFCTEUgOiAwLAorCQlNWFJfU1RBVFVTX1NZTkNfRU5BQkxFKTsKKwl2cF93cml0ZShtZGV2LCBWUF9TSEFET1dfVVBEQVRFLCBlbiA/IFZQX1NIQURPV19VUERBVEVfRU5BQkxFIDogMCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fbXhyX3JlZ192cF9yZXNldChzdHJ1Y3QgbXhyX2RldmljZSAqbWRldikKK3sKKwlpbnQgdHJpZXMgPSAxMDA7CisKKwl2cF93cml0ZShtZGV2LCBWUF9TUkVTRVQsIFZQX1NSRVNFVF9QUk9DRVNTSU5HKTsKKwlmb3IgKHRyaWVzID0gMTAwOyB0cmllczsgLS10cmllcykgeworCQkvKiB3YWl0aW5nIHVudGlsIFZQX1NSRVNFVF9QUk9DRVNTSU5HIGlzIDAgKi8KKwkJaWYgKH52cF9yZWFkKG1kZXYsIFZQX1NSRVNFVCkgJiBWUF9TUkVTRVRfUFJPQ0VTU0lORykKKwkJCWJyZWFrOworCQltZGVsYXkoMTApOworCX0KKwlXQVJOKHRyaWVzID09IDAsICJmYWlsZWQgdG8gcmVzZXQgVmlkZW8gUHJvY2Vzc29yXG4iKTsKK30KKworc3RhdGljIHZvaWQgbXhyX3JlZ192cF9kZWZhdWx0X2ZpbHRlcihzdHJ1Y3QgbXhyX2RldmljZSAqbWRldik7CisKK3ZvaWQgbXhyX3JlZ19yZXNldChzdHJ1Y3QgbXhyX2RldmljZSAqbWRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB2YWw7IC8qIHZhbHVlIHN0b3JlZCB0byByZWdpc3RlciAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPnJlZ19zbG9jaywgZmxhZ3MpOworCW14cl92c3luY19zZXRfdXBkYXRlKG1kZXYsIE1YUl9ESVNBQkxFKTsKKworCS8qIHNldCBvdXRwdXQgaW4gUkdCODg4IG1vZGUgKi8KKwlteHJfd3JpdGUobWRldiwgTVhSX0NGRywgTVhSX0NGR19PVVRfWVVWNDQ0KTsKKworCS8qIDE2IGJlYXQgYnVyc3QgaW4gRE1BICovCisJbXhyX3dyaXRlX21hc2sobWRldiwgTVhSX1NUQVRVUywgTVhSX1NUQVRVU18xNl9CVVJTVCwKKwkJTVhSX1NUQVRVU19CVVJTVF9NQVNLKTsKKworCS8qIHNldHRpbmcgZGVmYXVsdCBsYXllciBwcmlvcml0eTogbGF5ZXIxID4gdmlkZW8gPiBsYXllcjAKKwkgKiBiZWNhdXNlIHR5cGljYWwgdXNhZ2Ugc2NlbmFyaW8gd291bGQgYmUKKwkgKiBsYXllcjAgLSBmcmFtZWJ1ZmZlcgorCSAqIHZpZGVvIC0gdmlkZW8gb3ZlcmxheQorCSAqIGxheWVyMSAtIE9TRAorCSAqLworCXZhbCAgPSBNWFJfTEFZRVJfQ0ZHX0dSUDBfVkFMKDEpOworCXZhbCB8PSBNWFJfTEFZRVJfQ0ZHX1ZQX1ZBTCgyKTsKKwl2YWwgfD0gTVhSX0xBWUVSX0NGR19HUlAxX1ZBTCgzKTsKKwlteHJfd3JpdGUobWRldiwgTVhSX0xBWUVSX0NGRywgdmFsKTsKKworCS8qIHVzZSBkYXJrIGdyYXkgYmFja2dyb3VuZCBjb2xvciAqLworCW14cl93cml0ZShtZGV2LCBNWFJfQkdfQ09MT1IwLCAweDgwODA4MCk7CisJbXhyX3dyaXRlKG1kZXYsIE1YUl9CR19DT0xPUjEsIDB4ODA4MDgwKTsKKwlteHJfd3JpdGUobWRldiwgTVhSX0JHX0NPTE9SMiwgMHg4MDgwODApOworCisJLyogc2V0dGluZyBncmFwaGljYWwgbGF5ZXJzICovCisKKwl2YWwgID0gTVhSX0dSUF9DRkdfQ09MT1JfS0VZX0RJU0FCTEU7IC8qIG5vIGJsYW5rIGtleSAqLworCXZhbCB8PSBNWFJfR1JQX0NGR19CTEVORF9QUkVfTVVMOyAvKiBwcmVtdWwgbW9kZSAqLworCXZhbCB8PSBNWFJfR1JQX0NGR19BTFBIQV9WQUwoMHhmZik7IC8qIG5vbi10cmFuc3BhcmVudCBhbHBoYSAqLworCisJLyogdGhlIHNhbWUgY29uZmlndXJhdGlvbiBmb3IgYm90aCBsYXllcnMgKi8KKwlteHJfd3JpdGUobWRldiwgTVhSX0dSQVBISUNfQ0ZHKDApLCB2YWwpOworCW14cl93cml0ZShtZGV2LCBNWFJfR1JBUEhJQ19DRkcoMSksIHZhbCk7CisKKwkvKiBjb25maWd1cmF0aW9uIG9mIFZpZGVvIFByb2Nlc3NvciBSZWdpc3RlcnMgKi8KKwlfX214cl9yZWdfdnBfcmVzZXQobWRldik7CisJbXhyX3JlZ192cF9kZWZhdWx0X2ZpbHRlcihtZGV2KTsKKworCS8qIGVuYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCW14cl93cml0ZV9tYXNrKG1kZXYsIE1YUl9JTlRfRU4sIH4wLCBNWFJfSU5UX0VOX0FMTCk7CisKKwlteHJfdnN5bmNfc2V0X3VwZGF0ZShtZGV2LCBNWFJfRU5BQkxFKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGV2LT5yZWdfc2xvY2ssIGZsYWdzKTsKK30KKwordm9pZCBteHJfcmVnX2dyYXBoX2Zvcm1hdChzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiwgaW50IGlkeCwKKwljb25zdCBzdHJ1Y3QgbXhyX2Zvcm1hdCAqZm10LCBjb25zdCBzdHJ1Y3QgbXhyX2dlb21ldHJ5ICpnZW8pCit7CisJdTMyIHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPnJlZ19zbG9jaywgZmxhZ3MpOworCW14cl92c3luY19zZXRfdXBkYXRlKG1kZXYsIE1YUl9ESVNBQkxFKTsKKworCS8qIHNldHVwIGZvcm1hdCAqLworCW14cl93cml0ZV9tYXNrKG1kZXYsIE1YUl9HUkFQSElDX0NGRyhpZHgpLAorCQlNWFJfR1JQX0NGR19GT1JNQVRfVkFMKGZtdC0+Y29va2llKSwgTVhSX0dSUF9DRkdfRk9STUFUX01BU0spOworCisJLyogc2V0dXAgZ2VvbWV0cnkgKi8KKwlteHJfd3JpdGUobWRldiwgTVhSX0dSQVBISUNfU1BBTihpZHgpLCBnZW8tPnNyYy5mdWxsX3dpZHRoKTsKKwl2YWwgID0gTVhSX0dSUF9XSF9XSURUSChnZW8tPnNyYy53aWR0aCk7CisJdmFsIHw9IE1YUl9HUlBfV0hfSEVJR0hUKGdlby0+c3JjLmhlaWdodCk7CisJdmFsIHw9IE1YUl9HUlBfV0hfSF9TQ0FMRShnZW8tPnhfcmF0aW8pOworCXZhbCB8PSBNWFJfR1JQX1dIX1ZfU0NBTEUoZ2VvLT55X3JhdGlvKTsKKwlteHJfd3JpdGUobWRldiwgTVhSX0dSQVBISUNfV0goaWR4KSwgdmFsKTsKKworCS8qIHNldHVwIG9mZnNldHMgaW4gc291cmNlIGltYWdlICovCisJdmFsICA9IE1YUl9HUlBfU1hZX1NYKGdlby0+c3JjLnhfb2Zmc2V0KTsKKwl2YWwgfD0gTVhSX0dSUF9TWFlfU1koZ2VvLT5zcmMueV9vZmZzZXQpOworCW14cl93cml0ZShtZGV2LCBNWFJfR1JBUEhJQ19TWFkoaWR4KSwgdmFsKTsKKworCS8qIHNldHVwIG9mZnNldHMgaW4gZGlzcGxheSBpbWFnZSAqLworCXZhbCAgPSBNWFJfR1JQX0RYWV9EWChnZW8tPmRzdC54X29mZnNldCk7CisJdmFsIHw9IE1YUl9HUlBfRFhZX0RZKGdlby0+ZHN0Lnlfb2Zmc2V0KTsKKwlteHJfd3JpdGUobWRldiwgTVhSX0dSQVBISUNfRFhZKGlkeCksIHZhbCk7CisKKwlteHJfdnN5bmNfc2V0X3VwZGF0ZShtZGV2LCBNWFJfRU5BQkxFKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGV2LT5yZWdfc2xvY2ssIGZsYWdzKTsKK30KKwordm9pZCBteHJfcmVnX3ZwX2Zvcm1hdChzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiwKKwljb25zdCBzdHJ1Y3QgbXhyX2Zvcm1hdCAqZm10LCBjb25zdCBzdHJ1Y3QgbXhyX2dlb21ldHJ5ICpnZW8pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtZGV2LT5yZWdfc2xvY2ssIGZsYWdzKTsKKwlteHJfdnN5bmNfc2V0X3VwZGF0ZShtZGV2LCBNWFJfRElTQUJMRSk7CisKKwl2cF93cml0ZV9tYXNrKG1kZXYsIFZQX01PREUsIGZtdC0+Y29va2llLCBWUF9NT0RFX0ZNVF9NQVNLKTsKKworCS8qIHNldHRpbmcgc2l6ZSBvZiBpbnB1dCBpbWFnZSAqLworCXZwX3dyaXRlKG1kZXYsIFZQX0lNR19TSVpFX1ksIFZQX0lNR19IU0laRShnZW8tPnNyYy5mdWxsX3dpZHRoKSB8CisJCVZQX0lNR19WU0laRShnZW8tPnNyYy5mdWxsX2hlaWdodCkpOworCS8qIGNocm9tYSBoZWlnaHQgaGFzIHRvIHJlZHVjZWQgYnkgMiB0byBhdm9pZCBjaHJvbWEgZGlzdG9yaW9ucyAqLworCXZwX3dyaXRlKG1kZXYsIFZQX0lNR19TSVpFX0MsIFZQX0lNR19IU0laRShnZW8tPnNyYy5mdWxsX3dpZHRoKSB8CisJCVZQX0lNR19WU0laRShnZW8tPnNyYy5mdWxsX2hlaWdodCAvIDIpKTsKKworCXZwX3dyaXRlKG1kZXYsIFZQX1NSQ19XSURUSCwgZ2VvLT5zcmMud2lkdGgpOworCXZwX3dyaXRlKG1kZXYsIFZQX1NSQ19IRUlHSFQsIGdlby0+c3JjLmhlaWdodCk7CisJdnBfd3JpdGUobWRldiwgVlBfU1JDX0hfUE9TSVRJT04sCisJCVZQX1NSQ19IX1BPU0lUSU9OX1ZBTChnZW8tPnNyYy54X29mZnNldCkpOworCXZwX3dyaXRlKG1kZXYsIFZQX1NSQ19WX1BPU0lUSU9OLCBnZW8tPnNyYy55X29mZnNldCk7CisKKwl2cF93cml0ZShtZGV2LCBWUF9EU1RfV0lEVEgsIGdlby0+ZHN0LndpZHRoKTsKKwl2cF93cml0ZShtZGV2LCBWUF9EU1RfSF9QT1NJVElPTiwgZ2VvLT5kc3QueF9vZmZzZXQpOworCWlmIChnZW8tPmRzdC5maWVsZCA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQpIHsKKwkJdnBfd3JpdGUobWRldiwgVlBfRFNUX0hFSUdIVCwgZ2VvLT5kc3QuaGVpZ2h0IC8gMik7CisJCXZwX3dyaXRlKG1kZXYsIFZQX0RTVF9WX1BPU0lUSU9OLCBnZW8tPmRzdC55X29mZnNldCAvIDIpOworCX0gZWxzZSB7CisJCXZwX3dyaXRlKG1kZXYsIFZQX0RTVF9IRUlHSFQsIGdlby0+ZHN0LmhlaWdodCk7CisJCXZwX3dyaXRlKG1kZXYsIFZQX0RTVF9WX1BPU0lUSU9OLCBnZW8tPmRzdC55X29mZnNldCk7CisJfQorCisJdnBfd3JpdGUobWRldiwgVlBfSF9SQVRJTywgZ2VvLT54X3JhdGlvKTsKKwl2cF93cml0ZShtZGV2LCBWUF9WX1JBVElPLCBnZW8tPnlfcmF0aW8pOworCisJdnBfd3JpdGUobWRldiwgVlBfRU5ESUFOX01PREUsIFZQX0VORElBTl9NT0RFX0xJVFRMRSk7CisKKwlteHJfdnN5bmNfc2V0X3VwZGF0ZShtZGV2LCBNWFJfRU5BQkxFKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZGV2LT5yZWdfc2xvY2ssIGZsYWdzKTsKKworfQorCit2b2lkIG14cl9yZWdfZ3JhcGhfYnVmZmVyKHN0cnVjdCBteHJfZGV2aWNlICptZGV2LCBpbnQgaWR4LCBkbWFfYWRkcl90IGFkZHIpCit7CisJdTMyIHZhbCA9IGFkZHIgPyB+MCA6IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtZGV2LT5yZWdfc2xvY2ssIGZsYWdzKTsKKwlteHJfdnN5bmNfc2V0X3VwZGF0ZShtZGV2LCBNWFJfRElTQUJMRSk7CisKKwlpZiAoaWR4ID09IDApCisJCW14cl93cml0ZV9tYXNrKG1kZXYsIE1YUl9DRkcsIHZhbCwgTVhSX0NGR19HUlAwX0VOQUJMRSk7CisJZWxzZQorCQlteHJfd3JpdGVfbWFzayhtZGV2LCBNWFJfQ0ZHLCB2YWwsIE1YUl9DRkdfR1JQMV9FTkFCTEUpOworCW14cl93cml0ZShtZGV2LCBNWFJfR1JBUEhJQ19CQVNFKGlkeCksIGFkZHIpOworCisJbXhyX3ZzeW5jX3NldF91cGRhdGUobWRldiwgTVhSX0VOQUJMRSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+cmVnX3Nsb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgbXhyX3JlZ192cF9idWZmZXIoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYsCisJZG1hX2FkZHJfdCBsdW1hX2FkZHJbMl0sIGRtYV9hZGRyX3QgY2hyb21hX2FkZHJbMl0pCit7CisJdTMyIHZhbCA9IGx1bWFfYWRkclswXSA/IH4wIDogMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1kZXYtPnJlZ19zbG9jaywgZmxhZ3MpOworCW14cl92c3luY19zZXRfdXBkYXRlKG1kZXYsIE1YUl9ESVNBQkxFKTsKKworCW14cl93cml0ZV9tYXNrKG1kZXYsIE1YUl9DRkcsIHZhbCwgTVhSX0NGR19WUF9FTkFCTEUpOworCXZwX3dyaXRlX21hc2sobWRldiwgVlBfRU5BQkxFLCB2YWwsIFZQX0VOQUJMRV9PTik7CisJLyogVE9ETzogZml4IHRpbGVkIG1vZGUgKi8KKwl2cF93cml0ZShtZGV2LCBWUF9UT1BfWV9QVFIsIGx1bWFfYWRkclswXSk7CisJdnBfd3JpdGUobWRldiwgVlBfVE9QX0NfUFRSLCBjaHJvbWFfYWRkclswXSk7CisJdnBfd3JpdGUobWRldiwgVlBfQk9UX1lfUFRSLCBsdW1hX2FkZHJbMV0pOworCXZwX3dyaXRlKG1kZXYsIFZQX0JPVF9DX1BUUiwgY2hyb21hX2FkZHJbMV0pOworCisJbXhyX3ZzeW5jX3NldF91cGRhdGUobWRldiwgTVhSX0VOQUJMRSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+cmVnX3Nsb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIG14cl9pcnFfbGF5ZXJfaGFuZGxlKHN0cnVjdCBteHJfbGF5ZXIgKmxheWVyKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmbGF5ZXItPmVucV9saXN0OworCXN0cnVjdCBteHJfYnVmZmVyICpkb25lOworCisJLyogc2tpcCBub24tZXhpc3RpbmcgbGF5ZXIgKi8KKwlpZiAobGF5ZXIgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrKCZsYXllci0+ZW5xX3Nsb2NrKTsKKwlpZiAobGF5ZXItPnN0YXRlID09IE1YUl9MQVlFUl9JRExFKQorCQlnb3RvIGRvbmU7CisKKwlkb25lID0gbGF5ZXItPnNoYWRvd19idWY7CisJbGF5ZXItPnNoYWRvd19idWYgPSBsYXllci0+dXBkYXRlX2J1ZjsKKworCWlmIChsaXN0X2VtcHR5KGhlYWQpKSB7CisJCWlmIChsYXllci0+c3RhdGUgIT0gTVhSX0xBWUVSX1NUUkVBTUlORykKKwkJCWxheWVyLT51cGRhdGVfYnVmID0gTlVMTDsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgbXhyX2J1ZmZlciAqbmV4dDsKKwkJbmV4dCA9IGxpc3RfZmlyc3RfZW50cnkoaGVhZCwgc3RydWN0IG14cl9idWZmZXIsIGxpc3QpOworCQlsaXN0X2RlbCgmbmV4dC0+bGlzdCk7CisJCWxheWVyLT51cGRhdGVfYnVmID0gbmV4dDsKKwl9CisKKwlsYXllci0+b3BzLmJ1ZmZlcl9zZXQobGF5ZXIsIGxheWVyLT51cGRhdGVfYnVmKTsKKworCWlmIChkb25lICYmIGRvbmUgIT0gbGF5ZXItPnNoYWRvd19idWYpCisJCXZiMl9idWZmZXJfZG9uZSgmZG9uZS0+dmIsIFZCMl9CVUZfU1RBVEVfRE9ORSk7CisKK2RvbmU6CisJc3Bpbl91bmxvY2soJmxheWVyLT5lbnFfc2xvY2spOworfQorCitpcnFyZXR1cm5fdCBteHJfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2RhdGEpCit7CisJc3RydWN0IG14cl9kZXZpY2UgKm1kZXYgPSBkZXZfZGF0YTsKKwl1MzIgaSwgdmFsOworCisJc3Bpbl9sb2NrKCZtZGV2LT5yZWdfc2xvY2spOworCXZhbCA9IG14cl9yZWFkKG1kZXYsIE1YUl9JTlRfU1RBVFVTKTsKKworCS8qIHdha2UgdXAgcHJvY2VzcyB3YWl0aW5nIGZvciBWU1lOQyAqLworCWlmICh2YWwgJiBNWFJfSU5UX1NUQVRVU19WU1lOQykgeworCQlzZXRfYml0KE1YUl9FVkVOVF9WU1lOQywgJm1kZXYtPmV2ZW50X2ZsYWdzKTsKKwkJd2FrZV91cCgmbWRldi0+ZXZlbnRfcXVldWUpOworCX0KKworCS8qIGNsZWFyIGludGVycnVwdHMgKi8KKwlpZiAofnZhbCAmIE1YUl9JTlRfRU5fVlNZTkMpIHsKKwkJLyogdnN5bmMgaW50ZXJydXB0IHVzZSBkaWZmZXJlbnQgYml0IGZvciByZWFkIGFuZCBjbGVhciAqLworCQl2YWwgJj0gfk1YUl9JTlRfRU5fVlNZTkM7CisJCXZhbCB8PSBNWFJfSU5UX0NMRUFSX1ZTWU5DOworCX0KKwlteHJfd3JpdGUobWRldiwgTVhSX0lOVF9TVEFUVVMsIHZhbCk7CisKKwlzcGluX3VubG9jaygmbWRldi0+cmVnX3Nsb2NrKTsKKwkvKiBsZWF2ZSBvbiBub24tdnN5bmMgZXZlbnQgKi8KKwlpZiAofnZhbCAmIE1YUl9JTlRfQ0xFQVJfVlNZTkMpCisJCXJldHVybiBJUlFfSEFORExFRDsKKwlmb3IgKGkgPSAwOyBpIDwgTVhSX01BWF9MQVlFUlM7ICsraSkKKwkJbXhyX2lycV9sYXllcl9oYW5kbGUobWRldi0+bGF5ZXJbaV0pOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKwordm9pZCBteHJfcmVnX3Nfb3V0cHV0KHN0cnVjdCBteHJfZGV2aWNlICptZGV2LCBpbnQgY29va2llKQoreworCXUzMiB2YWw7CisKKwl2YWwgPSBjb29raWUgPT0gMCA/IE1YUl9DRkdfRFNUX1NETyA6IE1YUl9DRkdfRFNUX0hETUk7CisJbXhyX3dyaXRlX21hc2sobWRldiwgTVhSX0NGRywgdmFsLCBNWFJfQ0ZHX0RTVF9NQVNLKTsKK30KKwordm9pZCBteHJfcmVnX3N0cmVhbW9uKHN0cnVjdCBteHJfZGV2aWNlICptZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+cmVnX3Nsb2NrLCBmbGFncyk7CisJLyogc2luZ2xlIHdyaXRlIC0+IG5vIG5lZWQgdG8gYmxvY2sgdnN5bmMgdXBkYXRlICovCisKKwkvKiBzdGFydCBNSVhFUiAqLworCW14cl93cml0ZV9tYXNrKG1kZXYsIE1YUl9TVEFUVVMsIH4wLCBNWFJfU1RBVFVTX1JFR19SVU4pOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+cmVnX3Nsb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgbXhyX3JlZ19zdHJlYW1vZmYoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZtZGV2LT5yZWdfc2xvY2ssIGZsYWdzKTsKKwkvKiBzaW5nbGUgd3JpdGUgLT4gbm8gbmVlZCB0byBibG9jayB2c3luYyB1cGRhdGUgKi8KKworCS8qIHN0b3AgTUlYRVIgKi8KKwlteHJfd3JpdGVfbWFzayhtZGV2LCBNWFJfU1RBVFVTLCAwLCBNWFJfU1RBVFVTX1JFR19SVU4pOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWRldi0+cmVnX3Nsb2NrLCBmbGFncyk7Cit9CisKK2ludCBteHJfcmVnX3dhaXQ0dnN5bmMoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYpCit7CisJaW50IHJldDsKKworCWNsZWFyX2JpdChNWFJfRVZFTlRfVlNZTkMsICZtZGV2LT5ldmVudF9mbGFncyk7CisJLyogVE9ETzogY29uc2lkZXIgYWRkaW5nIGludGVycnVwdGlibGUgKi8KKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQobWRldi0+ZXZlbnRfcXVldWUsCisJCXRlc3RfYml0KE1YUl9FVkVOVF9WU1lOQywgJm1kZXYtPmV2ZW50X2ZsYWdzKSwKKwkJbXNlY3NfdG9famlmZmllcygxMDAwKSk7CisJaWYgKHJldCA+IDApCisJCXJldHVybiAwOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCW14cl93YXJuKG1kZXYsICJubyB2c3luYyBkZXRlY3RlZCAtIHRpbWVvdXRcbiIpOworCXJldHVybiAtRVRJTUU7Cit9CisKK3ZvaWQgbXhyX3JlZ19zZXRfbWJ1c19mbXQoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYsCisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm10KQoreworCXUzMiB2YWwgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWRldi0+cmVnX3Nsb2NrLCBmbGFncyk7CisJbXhyX3ZzeW5jX3NldF91cGRhdGUobWRldiwgTVhSX0RJU0FCTEUpOworCisJLyogY2hvb3NpbmcgYmV0d2VlbiBpbnRlcmxhY2UgYW5kIHByb2dyZXNzaXZlIG1vZGUgKi8KKwlpZiAoZm10LT5maWVsZCA9PSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQpCisJCXZhbCB8PSBNWFJfQ0ZHX1NDQU5fSU5URVJMQUNFOworCWVsc2UKKwkJdmFsIHw9IE1YUl9DRkdfU0NBTl9QUk9HUkFTU0lWRTsKKworCS8qIGNob29zaW5nIGJldHdlZW4gcG9ycGVyIEhEIGFuZCBTRCBtb2RlICovCisJaWYgKGZtdC0+aGVpZ2h0ID09IDQ4MCkKKwkJdmFsIHw9IE1YUl9DRkdfU0NBTl9OVFNDIHwgTVhSX0NGR19TQ0FOX1NEOworCWVsc2UgaWYgKGZtdC0+aGVpZ2h0ID09IDU3NikKKwkJdmFsIHw9IE1YUl9DRkdfU0NBTl9QQUwgfCBNWFJfQ0ZHX1NDQU5fU0Q7CisJZWxzZSBpZiAoZm10LT5oZWlnaHQgPT0gNzIwKQorCQl2YWwgfD0gTVhSX0NGR19TQ0FOX0hEXzcyMCB8IE1YUl9DRkdfU0NBTl9IRDsKKwllbHNlIGlmIChmbXQtPmhlaWdodCA9PSAxMDgwKQorCQl2YWwgfD0gTVhSX0NGR19TQ0FOX0hEXzEwODAgfCBNWFJfQ0ZHX1NDQU5fSEQ7CisJZWxzZQorCQlXQVJOKDEsICJ1bnJlY29nbml6ZWQgbWJ1cyBoZWlnaHQgJXUhXG4iLCBmbXQtPmhlaWdodCk7CisKKwlteHJfd3JpdGVfbWFzayhtZGV2LCBNWFJfQ0ZHLCB2YWwsIE1YUl9DRkdfU0NBTl9NQVNLKTsKKworCXZhbCA9IChmbXQtPmZpZWxkID09IFY0TDJfRklFTERfSU5URVJMQUNFRCkgPyB+MCA6IDA7CisJdnBfd3JpdGVfbWFzayhtZGV2LCBWUF9NT0RFLCB2YWwsCisJCVZQX01PREVfTElORV9TS0lQIHwgVlBfTU9ERV9GSUVMRF9JRF9BVVRPX1RPR0dMSU5HKTsKKworCW14cl92c3luY19zZXRfdXBkYXRlKG1kZXYsIE1YUl9FTkFCTEUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1kZXYtPnJlZ19zbG9jaywgZmxhZ3MpOworfQorCit2b2lkIG14cl9yZWdfZ3JhcGhfbGF5ZXJfc3RyZWFtKHN0cnVjdCBteHJfZGV2aWNlICptZGV2LCBpbnQgaWR4LCBpbnQgZW4pCit7CisJLyogbm8gZXh0cmEgYWN0aW9ucyBuZWVkIHRvIGJlIGRvbmUgKi8KK30KKwordm9pZCBteHJfcmVnX3ZwX2xheWVyX3N0cmVhbShzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiwgaW50IGVuKQoreworCS8qIG5vIGV4dHJhIGFjdGlvbnMgbmVlZCB0byBiZSBkb25lICovCit9CisKK3N0YXRpYyBjb25zdCB1OCBmaWx0ZXJfeV9ob3Jpel90YXA4W10gPSB7CisJMCwJLTEsCS0xLAktMSwJLTEsCS0xLAktMSwJLTEsCisJLTEsCS0xLAktMSwJLTEsCS0xLAkwLAkwLAkwLAorCTAsCTIsCTQsCTUsCTYsCTYsCTYsCTYsCisJNiwJNSwJNSwJNCwJMywJMiwJMSwJMSwKKwkwLAktNiwJLTEyLAktMTYsCS0xOCwJLTIwLAktMjEsCS0yMCwKKwktMjAsCS0xOCwJLTE2LAktMTMsCS0xMCwJLTgsCS01LAktMiwKKwkxMjcsCTEyNiwJMTI1LAkxMjEsCTExNCwJMTA3LAk5OSwJODksCisJNzksCTY4LAk1NywJNDYsCTM1LAkyNSwJMTYsCTgsCit9OworCitzdGF0aWMgY29uc3QgdTggZmlsdGVyX3lfdmVydF90YXA0W10gPSB7CisJMCwJLTMsCS02LAktOCwJLTgsCS04LAktOCwJLTcsCisJLTYsCS01LAktNCwJLTMsCS0yLAktMSwJLTEsCTAsCisJMTI3LAkxMjYsCTEyNCwJMTE4LAkxMTEsCTEwMiwJOTIsCTgxLAorCTcwLAk1OSwJNDgsCTM3LAkyNywJMTksCTExLAk1LAorCTAsCTUsCTExLAkxOSwJMjcsCTM3LAk0OCwJNTksCisJNzAsCTgxLAk5MiwJMTAyLAkxMTEsCTExOCwJMTI0LAkxMjYsCisJMCwJMCwJLTEsCS0xLAktMiwJLTMsCS00LAktNSwKKwktNiwJLTcsCS04LAktOCwJLTgsCS04LAktNiwJLTMsCit9OworCitzdGF0aWMgY29uc3QgdTggZmlsdGVyX2NyX2hvcml6X3RhcDRbXSA9IHsKKwkwLAktMywJLTYsCS04LAktOCwJLTgsCS04LAktNywKKwktNiwJLTUsCS00LAktMywJLTIsCS0xLAktMSwJMCwKKwkxMjcsCTEyNiwJMTI0LAkxMTgsCTExMSwJMTAyLAk5MiwJODEsCisJNzAsCTU5LAk0OCwJMzcsCTI3LAkxOSwJMTEsCTUsCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgbXhyX3JlZ192cF9maWx0ZXJfc2V0KHN0cnVjdCBteHJfZGV2aWNlICptZGV2LAorCWludCByZWdfaWQsIGNvbnN0IHU4ICpkYXRhLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwkvKiBhc3N1cmUgNC1ieXRlIGFsaWduICovCisJQlVHX09OKHNpemUgJiAzKTsKKwlmb3IgKDsgc2l6ZTsgc2l6ZSAtPSA0LCByZWdfaWQgKz0gNCwgZGF0YSArPSA0KSB7CisJCXUzMiB2YWwgPSAoZGF0YVswXSA8PCAyNCkgfCAgKGRhdGFbMV0gPDwgMTYpIHwKKwkJCShkYXRhWzJdIDw8IDgpIHwgZGF0YVszXTsKKwkJdnBfd3JpdGUobWRldiwgcmVnX2lkLCB2YWwpOworCX0KK30KKworc3RhdGljIHZvaWQgbXhyX3JlZ192cF9kZWZhdWx0X2ZpbHRlcihzdHJ1Y3QgbXhyX2RldmljZSAqbWRldikKK3sKKwlteHJfcmVnX3ZwX2ZpbHRlcl9zZXQobWRldiwgVlBfUE9MWThfWTBfTEwsCisJCWZpbHRlcl95X2hvcml6X3RhcDgsIHNpemVvZiBmaWx0ZXJfeV9ob3Jpel90YXA4KTsKKwlteHJfcmVnX3ZwX2ZpbHRlcl9zZXQobWRldiwgVlBfUE9MWTRfWTBfTEwsCisJCWZpbHRlcl95X3ZlcnRfdGFwNCwgc2l6ZW9mIGZpbHRlcl95X3ZlcnRfdGFwNCk7CisJbXhyX3JlZ192cF9maWx0ZXJfc2V0KG1kZXYsIFZQX1BPTFk0X0MwX0xMLAorCQlmaWx0ZXJfY3JfaG9yaXpfdGFwNCwgc2l6ZW9mIGZpbHRlcl9jcl9ob3Jpel90YXA0KTsKK30KKworc3RhdGljIHZvaWQgbXhyX3JlZ19teHJfZHVtcChzdHJ1Y3QgbXhyX2RldmljZSAqbWRldikKK3sKKyNkZWZpbmUgRFVNUFJFRyhyZWdfaWQpIFwKK2RvIHsgXAorCW14cl9kYmcobWRldiwgI3JlZ19pZCAiID0gJTA4eFxuIiwgXAorCQkodTMyKXJlYWRsKG1kZXYtPnJlcy5teHJfcmVncyArIHJlZ19pZCkpOyBcCit9IHdoaWxlICgwKQorCisJRFVNUFJFRyhNWFJfU1RBVFVTKTsKKwlEVU1QUkVHKE1YUl9DRkcpOworCURVTVBSRUcoTVhSX0lOVF9FTik7CisJRFVNUFJFRyhNWFJfSU5UX1NUQVRVUyk7CisKKwlEVU1QUkVHKE1YUl9MQVlFUl9DRkcpOworCURVTVBSRUcoTVhSX1ZJREVPX0NGRyk7CisKKwlEVU1QUkVHKE1YUl9HUkFQSElDMF9DRkcpOworCURVTVBSRUcoTVhSX0dSQVBISUMwX0JBU0UpOworCURVTVBSRUcoTVhSX0dSQVBISUMwX1NQQU4pOworCURVTVBSRUcoTVhSX0dSQVBISUMwX1dIKTsKKwlEVU1QUkVHKE1YUl9HUkFQSElDMF9TWFkpOworCURVTVBSRUcoTVhSX0dSQVBISUMwX0RYWSk7CisKKwlEVU1QUkVHKE1YUl9HUkFQSElDMV9DRkcpOworCURVTVBSRUcoTVhSX0dSQVBISUMxX0JBU0UpOworCURVTVBSRUcoTVhSX0dSQVBISUMxX1NQQU4pOworCURVTVBSRUcoTVhSX0dSQVBISUMxX1dIKTsKKwlEVU1QUkVHKE1YUl9HUkFQSElDMV9TWFkpOworCURVTVBSRUcoTVhSX0dSQVBISUMxX0RYWSk7CisjdW5kZWYgRFVNUFJFRworfQorCitzdGF0aWMgdm9pZCBteHJfcmVnX3ZwX2R1bXAoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYpCit7CisjZGVmaW5lIERVTVBSRUcocmVnX2lkKSBcCitkbyB7IFwKKwlteHJfZGJnKG1kZXYsICNyZWdfaWQgIiA9ICUwOHhcbiIsIFwKKwkJKHUzMikgcmVhZGwobWRldi0+cmVzLnZwX3JlZ3MgKyByZWdfaWQpKTsgXAorfSB3aGlsZSAoMCkKKworCisJRFVNUFJFRyhWUF9FTkFCTEUpOworCURVTVBSRUcoVlBfU1JFU0VUKTsKKwlEVU1QUkVHKFZQX1NIQURPV19VUERBVEUpOworCURVTVBSRUcoVlBfRklFTERfSUQpOworCURVTVBSRUcoVlBfTU9ERSk7CisJRFVNUFJFRyhWUF9JTUdfU0laRV9ZKTsKKwlEVU1QUkVHKFZQX0lNR19TSVpFX0MpOworCURVTVBSRUcoVlBfUEVSX1JBVEVfQ1RSTCk7CisJRFVNUFJFRyhWUF9UT1BfWV9QVFIpOworCURVTVBSRUcoVlBfQk9UX1lfUFRSKTsKKwlEVU1QUkVHKFZQX1RPUF9DX1BUUik7CisJRFVNUFJFRyhWUF9CT1RfQ19QVFIpOworCURVTVBSRUcoVlBfRU5ESUFOX01PREUpOworCURVTVBSRUcoVlBfU1JDX0hfUE9TSVRJT04pOworCURVTVBSRUcoVlBfU1JDX1ZfUE9TSVRJT04pOworCURVTVBSRUcoVlBfU1JDX1dJRFRIKTsKKwlEVU1QUkVHKFZQX1NSQ19IRUlHSFQpOworCURVTVBSRUcoVlBfRFNUX0hfUE9TSVRJT04pOworCURVTVBSRUcoVlBfRFNUX1ZfUE9TSVRJT04pOworCURVTVBSRUcoVlBfRFNUX1dJRFRIKTsKKwlEVU1QUkVHKFZQX0RTVF9IRUlHSFQpOworCURVTVBSRUcoVlBfSF9SQVRJTyk7CisJRFVNUFJFRyhWUF9WX1JBVElPKTsKKworI3VuZGVmIERVTVBSRUcKK30KKwordm9pZCBteHJfcmVnX2R1bXAoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYpCit7CisJbXhyX3JlZ19teHJfZHVtcChtZGV2KTsKKwlteHJfcmVnX3ZwX2R1bXAobWRldik7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L21peGVyX3ZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlcl92aWRlby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYWMyMmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlcl92aWRlby5jCkBAIC0wLDAgKzEsMTAwNiBAQAorLyoKKyAqIFNhbXN1bmcgVFYgTWl4ZXIgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCisgKiBUb21hc3ogU3RhbmlzbGF3c2tpLCA8dC5zdGFuaXNsYXdzQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4gZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwKKyAqIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KKyAqLworCisjaW5jbHVkZSAibWl4ZXIuaCIKKworI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi1kbWEtY29udGlnLmg+CisKK3N0YXRpYyBpbnQgZmluZF9yZWdfY2FsbGJhY2soc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpwKQoreworCXN0cnVjdCB2NGwyX3N1YmRldiAqKnNkID0gcDsKKworCSpzZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCS8qIG5vbi16ZXJvIHZhbHVlIHN0b3BzIGl0ZXJhdGlvbiAqLworCXJldHVybiAxOworfQorCitzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2ICpmaW5kX2FuZF9yZWdpc3Rlcl9zdWJkZXYoCisJc3RydWN0IG14cl9kZXZpY2UgKm1kZXYsIGNoYXIgKm1vZHVsZV9uYW1lKQoreworCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnY7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IE5VTEw7CisJaW50IHJldDsKKworCS8qIFRPRE86IGFkZCB3YWl0aW5nIHVudGlsIHByb2JlIGlzIGZpbmlzaGVkICovCisJZHJ2ID0gZHJpdmVyX2ZpbmQobW9kdWxlX25hbWUsICZwbGF0Zm9ybV9idXNfdHlwZSk7CisJaWYgKCFkcnYpIHsKKwkJbXhyX3dhcm4obWRldiwgIm1vZHVsZSAlcyBpcyBtaXNzaW5nXG4iLCBtb2R1bGVfbmFtZSk7CisJCXJldHVybiBOVUxMOworCX0KKwkvKiBkcml2ZXIgcmVmY250IGlzIGluY3JlYXNlZCwgaXQgaXMgc2FmZSB0byBpdGVyYXRlIG92ZXIgZGV2aWNlcyAqLworCXJldCA9IGRyaXZlcl9mb3JfZWFjaF9kZXZpY2UoZHJ2LCBOVUxMLCAmc2QsIGZpbmRfcmVnX2NhbGxiYWNrKTsKKwkvKiByZXQgPT0gMCBtZWFucyB0aGF0IGZpbmRfcmVnX2NhbGxiYWNrIHdhcyBuZXZlciBleGVjdXRlZCAqLworCWlmIChzZCA9PSBOVUxMKSB7CisJCW14cl93YXJuKG1kZXYsICJtb2R1bGUgJXMgcHJvdmlkZXMgbm8gc3ViZGV2IVxuIiwgbW9kdWxlX25hbWUpOworCQlnb3RvIGRvbmU7CisJfQorCS8qIHY0bDJfZGV2aWNlX3JlZ2lzdGVyX3N1YmRldiBkZXRlY3RzIGlmIHNkIGlzIE5VTEwgKi8KKwlyZXQgPSB2NGwyX2RldmljZV9yZWdpc3Rlcl9zdWJkZXYoJm1kZXYtPnY0bDJfZGV2LCBzZCk7CisJaWYgKHJldCkgeworCQlteHJfd2FybihtZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIHN1YmRldiAlc1xuIiwgc2QtPm5hbWUpOworCQlzZCA9IE5VTEw7CisJfQorCitkb25lOgorCXB1dF9kcml2ZXIoZHJ2KTsKKwlyZXR1cm4gc2Q7Cit9CisKK2ludCBfX2RldmluaXQgbXhyX2FjcXVpcmVfdmlkZW8oc3RydWN0IG14cl9kZXZpY2UgKm1kZXYsCisJc3RydWN0IG14cl9vdXRwdXRfY29uZiAqb3V0cHV0X2NvbmYsIGludCBvdXRwdXRfY291bnQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gbWRldi0+ZGV2OworCXN0cnVjdCB2NGwyX2RldmljZSAqdjRsMl9kZXYgPSAmbWRldi0+djRsMl9kZXY7CisJaW50IGk7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZDsKKworCXN0cmxjcHkodjRsMl9kZXYtPm5hbWUsIGRldl9uYW1lKG1kZXYtPmRldiksIHNpemVvZih2NGwyX2Rldi0+bmFtZSkpOworCS8qIHByZXBhcmUgY29udGV4dCBmb3IgVjRMMiBkZXZpY2UgKi8KKwlyZXQgPSB2NGwyX2RldmljZV9yZWdpc3RlcihkZXYsIHY0bDJfZGV2KTsKKwlpZiAocmV0KSB7CisJCW14cl9lcnIobWRldiwgImNvdWxkIG5vdCByZWdpc3RlciB2NGwyIGRldmljZS5cbiIpOworCQlnb3RvIGZhaWw7CisJfQorCisJbWRldi0+YWxsb2NfY3R4ID0gdmIyX2RtYV9jb250aWdfaW5pdF9jdHgobWRldi0+ZGV2KTsKKwlpZiAoSVNfRVJSX09SX05VTEwobWRldi0+YWxsb2NfY3R4KSkgeworCQlteHJfZXJyKG1kZXYsICJjb3VsZCBub3QgYWNxdWlyZSB2YjIgYWxsb2NhdG9yXG4iKTsKKwkJZ290byBmYWlsX3Y0bDJfZGV2OworCX0KKworCS8qIHJlZ2lzdGVyaW5nIG91dHB1dHMgKi8KKwltZGV2LT5vdXRwdXRfY250ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgb3V0cHV0X2NvdW50OyArK2kpIHsKKwkJc3RydWN0IG14cl9vdXRwdXRfY29uZiAqY29uZiA9ICZvdXRwdXRfY29uZltpXTsKKwkJc3RydWN0IG14cl9vdXRwdXQgKm91dDsKKworCQlzZCA9IGZpbmRfYW5kX3JlZ2lzdGVyX3N1YmRldihtZGV2LCBjb25mLT5tb2R1bGVfbmFtZSk7CisJCS8qIHRyeWluZyB0byByZWdpc3RlciBuZXh0IG91dHB1dCAqLworCQlpZiAoc2QgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlvdXQgPSBremFsbG9jKHNpemVvZiAqb3V0LCBHRlBfS0VSTkVMKTsKKwkJaWYgKG91dCA9PSBOVUxMKSB7CisJCQlteHJfZXJyKG1kZXYsICJubyBtZW1vcnkgZm9yICclcydcbiIsCisJCQkJY29uZi0+b3V0cHV0X25hbWUpOworCQkJcmV0ID0gLUVOT01FTTsKKwkJCS8qIHJlZ2lzdGVyZWQgc3ViZGV2cyBhcmUgcmVtb3ZlZCBpbiBmYWlsX3Y0bDJfZGV2ICovCisJCQlnb3RvIGZhaWxfb3V0cHV0OworCQl9CisJCXN0cmxjcHkob3V0LT5uYW1lLCBjb25mLT5vdXRwdXRfbmFtZSwgc2l6ZW9mKG91dC0+bmFtZSkpOworCQlvdXQtPnNkID0gc2Q7CisJCW91dC0+Y29va2llID0gY29uZi0+Y29va2llOworCQltZGV2LT5vdXRwdXRbbWRldi0+b3V0cHV0X2NudCsrXSA9IG91dDsKKwkJbXhyX2luZm8obWRldiwgImFkZGVkIG91dHB1dCAnJXMnIGZyb20gbW9kdWxlICclcydcbiIsCisJCQljb25mLT5vdXRwdXRfbmFtZSwgY29uZi0+bW9kdWxlX25hbWUpOworCQkvKiBjaGVja2luZyBpZiBtYXhpbWFsIG51bWJlciBvZiBvdXRwdXRzIGlzIHJlYWNoZWQgKi8KKwkJaWYgKG1kZXYtPm91dHB1dF9jbnQgPj0gTVhSX01BWF9PVVRQVVRTKQorCQkJYnJlYWs7CisJfQorCisJaWYgKG1kZXYtPm91dHB1dF9jbnQgPT0gMCkgeworCQlteHJfZXJyKG1kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgYW55IG91dHB1dFxuIik7CisJCXJldCA9IC1FTk9ERVY7CisJCS8qIHNraXBwaW5nIGZhaWxfb3V0cHV0IGJlY2F1c2UgdGhlcmUgaXMgbm90aGluZyB0byBmcmVlICovCisJCWdvdG8gZmFpbF92YjJfYWxsb2NhdG9yOworCX0KKworCXJldHVybiAwOworCitmYWlsX291dHB1dDoKKwkvKiBrZnJlZSBpcyBOVUxMLXNhZmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbWRldi0+b3V0cHV0X2NudDsgKytpKQorCQlrZnJlZShtZGV2LT5vdXRwdXRbaV0pOworCW1lbXNldChtZGV2LT5vdXRwdXQsIDAsIHNpemVvZiBtZGV2LT5vdXRwdXQpOworCitmYWlsX3ZiMl9hbGxvY2F0b3I6CisJLyogZnJlZWluZyBhbGxvY2F0b3IgY29udGV4dCAqLworCXZiMl9kbWFfY29udGlnX2NsZWFudXBfY3R4KG1kZXYtPmFsbG9jX2N0eCk7CisKK2ZhaWxfdjRsMl9kZXY6CisJLyogTk9URTogYXV0b21hdGljYWxseSB1bnJlZ2lzdGVyIGFsbCBzdWJkZXZzICovCisJdjRsMl9kZXZpY2VfdW5yZWdpc3Rlcih2NGwyX2Rldik7CisKK2ZhaWw6CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBfX2RldmV4aXQgbXhyX3JlbGVhc2VfdmlkZW8oc3RydWN0IG14cl9kZXZpY2UgKm1kZXYpCit7CisJaW50IGk7CisKKwkvKiBrZnJlZSBpcyBOVUxMLXNhZmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbWRldi0+b3V0cHV0X2NudDsgKytpKQorCQlrZnJlZShtZGV2LT5vdXRwdXRbaV0pOworCisJdmIyX2RtYV9jb250aWdfY2xlYW51cF9jdHgobWRldi0+YWxsb2NfY3R4KTsKKwl2NGwyX2RldmljZV91bnJlZ2lzdGVyKCZtZGV2LT52NGwyX2Rldik7Cit9CisKK3N0YXRpYyBpbnQgbXhyX3F1ZXJ5Y2FwKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgKmNhcCkKK3sKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisKKwlteHJfZGJnKGxheWVyLT5tZGV2LCAiJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlzdHJsY3B5KGNhcC0+ZHJpdmVyLCBNWFJfRFJJVkVSX05BTUUsIHNpemVvZiBjYXAtPmRyaXZlcik7CisJc3RybGNweShjYXAtPmNhcmQsIGxheWVyLT52ZmQubmFtZSwgc2l6ZW9mIGNhcC0+Y2FyZCk7CisJc3ByaW50ZihjYXAtPmJ1c19pbmZvLCAiJWQiLCBsYXllci0+aWR4KTsKKwljYXAtPnZlcnNpb24gPSBLRVJORUxfVkVSU0lPTigwLCAxLCAwKTsKKwljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1NUUkVBTUlORyB8CisJCVY0TDJfQ0FQX1ZJREVPX09VVFBVVCB8IFY0TDJfQ0FQX1ZJREVPX09VVFBVVF9NUExBTkU7CisKKwlyZXR1cm4gMDsKK30KKworLyogR2VvbWV0cnkgaGFuZGxpbmcgKi8KK3N0YXRpYyB2b2lkIG14cl9sYXllcl9nZW9fZml4KHN0cnVjdCBteHJfbGF5ZXIgKmxheWVyKQoreworCXN0cnVjdCBteHJfZGV2aWNlICptZGV2ID0gbGF5ZXItPm1kZXY7CisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCBtYnVzX2ZtdDsKKworCS8qIFRPRE86IGFkZCBzb21lIGRpcnR5IGZsYWcgdG8gYXZvaWQgdW5uZWNlc3NhcnkgYWRqdXN0bWVudHMgKi8KKwlteHJfZ2V0X21idXNfZm10KG1kZXYsICZtYnVzX2ZtdCk7CisJbGF5ZXItPmdlby5kc3QuZnVsbF93aWR0aCA9IG1idXNfZm10LndpZHRoOworCWxheWVyLT5nZW8uZHN0LmZ1bGxfaGVpZ2h0ID0gbWJ1c19mbXQuaGVpZ2h0OworCWxheWVyLT5nZW8uZHN0LmZpZWxkID0gbWJ1c19mbXQuZmllbGQ7CisJbGF5ZXItPm9wcy5maXhfZ2VvbWV0cnkobGF5ZXIpOworfQorCitzdGF0aWMgdm9pZCBteHJfbGF5ZXJfZGVmYXVsdF9nZW8oc3RydWN0IG14cl9sYXllciAqbGF5ZXIpCit7CisJc3RydWN0IG14cl9kZXZpY2UgKm1kZXYgPSBsYXllci0+bWRldjsKKwlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IG1idXNfZm10OworCisJbWVtc2V0KCZsYXllci0+Z2VvLCAwLCBzaXplb2YgbGF5ZXItPmdlbyk7CisKKwlteHJfZ2V0X21idXNfZm10KG1kZXYsICZtYnVzX2ZtdCk7CisKKwlsYXllci0+Z2VvLmRzdC5mdWxsX3dpZHRoID0gbWJ1c19mbXQud2lkdGg7CisJbGF5ZXItPmdlby5kc3QuZnVsbF9oZWlnaHQgPSBtYnVzX2ZtdC5oZWlnaHQ7CisJbGF5ZXItPmdlby5kc3Qud2lkdGggPSBsYXllci0+Z2VvLmRzdC5mdWxsX3dpZHRoOworCWxheWVyLT5nZW8uZHN0LmhlaWdodCA9IGxheWVyLT5nZW8uZHN0LmZ1bGxfaGVpZ2h0OworCWxheWVyLT5nZW8uZHN0LmZpZWxkID0gbWJ1c19mbXQuZmllbGQ7CisKKwlsYXllci0+Z2VvLnNyYy5mdWxsX3dpZHRoID0gbWJ1c19mbXQud2lkdGg7CisJbGF5ZXItPmdlby5zcmMuZnVsbF9oZWlnaHQgPSBtYnVzX2ZtdC5oZWlnaHQ7CisJbGF5ZXItPmdlby5zcmMud2lkdGggPSBsYXllci0+Z2VvLnNyYy5mdWxsX3dpZHRoOworCWxheWVyLT5nZW8uc3JjLmhlaWdodCA9IGxheWVyLT5nZW8uc3JjLmZ1bGxfaGVpZ2h0OworCisJbGF5ZXItPm9wcy5maXhfZ2VvbWV0cnkobGF5ZXIpOworfQorCitzdGF0aWMgdm9pZCBteHJfZ2VvbWV0cnlfZHVtcChzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiwgc3RydWN0IG14cl9nZW9tZXRyeSAqZ2VvKQoreworCW14cl9kYmcobWRldiwgInNyYy5mdWxsX3NpemUgPSAoJXUsICV1KVxuIiwKKwkJZ2VvLT5zcmMuZnVsbF93aWR0aCwgZ2VvLT5zcmMuZnVsbF9oZWlnaHQpOworCW14cl9kYmcobWRldiwgInNyYy5zaXplID0gKCV1LCAldSlcbiIsCisJCWdlby0+c3JjLndpZHRoLCBnZW8tPnNyYy5oZWlnaHQpOworCW14cl9kYmcobWRldiwgInNyYy5vZmZzZXQgPSAoJXUsICV1KVxuIiwKKwkJZ2VvLT5zcmMueF9vZmZzZXQsIGdlby0+c3JjLnlfb2Zmc2V0KTsKKwlteHJfZGJnKG1kZXYsICJkc3QuZnVsbF9zaXplID0gKCV1LCAldSlcbiIsCisJCWdlby0+ZHN0LmZ1bGxfd2lkdGgsIGdlby0+ZHN0LmZ1bGxfaGVpZ2h0KTsKKwlteHJfZGJnKG1kZXYsICJkc3Quc2l6ZSA9ICgldSwgJXUpXG4iLAorCQlnZW8tPmRzdC53aWR0aCwgZ2VvLT5kc3QuaGVpZ2h0KTsKKwlteHJfZGJnKG1kZXYsICJkc3Qub2Zmc2V0ID0gKCV1LCAldSlcbiIsCisJCWdlby0+ZHN0Lnhfb2Zmc2V0LCBnZW8tPmRzdC55X29mZnNldCk7CisJbXhyX2RiZyhtZGV2LCAicmF0aW8gPSAoJXUsICV1KVxuIiwKKwkJZ2VvLT54X3JhdGlvLCBnZW8tPnlfcmF0aW8pOworfQorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXhyX2Zvcm1hdCAqZmluZF9mb3JtYXRfYnlfZm91cmNjKAorCXN0cnVjdCBteHJfbGF5ZXIgKmxheWVyLCB1bnNpZ25lZCBsb25nIGZvdXJjYyk7CitzdGF0aWMgY29uc3Qgc3RydWN0IG14cl9mb3JtYXQgKmZpbmRfZm9ybWF0X2J5X2luZGV4KAorCXN0cnVjdCBteHJfbGF5ZXIgKmxheWVyLCB1bnNpZ25lZCBsb25nIGluZGV4KTsKKworc3RhdGljIGludCBteHJfZW51bV9mbXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgICpwcml2LAorCXN0cnVjdCB2NGwyX2ZtdGRlc2MgKmYpCit7CisJc3RydWN0IG14cl9sYXllciAqbGF5ZXIgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCXN0cnVjdCBteHJfZGV2aWNlICptZGV2ID0gbGF5ZXItPm1kZXY7CisJY29uc3Qgc3RydWN0IG14cl9mb3JtYXQgKmZtdDsKKworCW14cl9kYmcobWRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisJZm10ID0gZmluZF9mb3JtYXRfYnlfaW5kZXgobGF5ZXIsIGYtPmluZGV4KTsKKwlpZiAoZm10ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJc3RybGNweShmLT5kZXNjcmlwdGlvbiwgZm10LT5uYW1lLCBzaXplb2YoZi0+ZGVzY3JpcHRpb24pKTsKKwlmLT5waXhlbGZvcm1hdCA9IGZtdC0+Zm91cmNjOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXhyX3NfZm10KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCXN0cnVjdCB2NGwyX2Zvcm1hdCAqZikKK3sKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJY29uc3Qgc3RydWN0IG14cl9mb3JtYXQgKmZtdDsKKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0X21wbGFuZSAqcGl4OworCXN0cnVjdCBteHJfZGV2aWNlICptZGV2ID0gbGF5ZXItPm1kZXY7CisJc3RydWN0IG14cl9nZW9tZXRyeSAqZ2VvID0gJmxheWVyLT5nZW87CisKKwlteHJfZGJnKG1kZXYsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCXBpeCA9ICZmLT5mbXQucGl4X21wOworCWZtdCA9IGZpbmRfZm9ybWF0X2J5X2ZvdXJjYyhsYXllciwgcGl4LT5waXhlbGZvcm1hdCk7CisJaWYgKGZtdCA9PSBOVUxMKSB7CisJCW14cl93YXJuKG1kZXYsICJub3QgcmVjb2duaXplZCBmb3VyY2M6ICUwOHhcbiIsCisJCQlwaXgtPnBpeGVsZm9ybWF0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWxheWVyLT5mbXQgPSBmbXQ7CisJZ2VvLT5zcmMuZnVsbF93aWR0aCA9IHBpeC0+d2lkdGg7CisJZ2VvLT5zcmMud2lkdGggPSBwaXgtPndpZHRoOworCWdlby0+c3JjLmZ1bGxfaGVpZ2h0ID0gcGl4LT5oZWlnaHQ7CisJZ2VvLT5zcmMuaGVpZ2h0ID0gcGl4LT5oZWlnaHQ7CisJLyogYXNzdXJlIGNvbnNpc3RlbmN5IG9mIGdlb21ldHJ5ICovCisJbXhyX2xheWVyX2dlb19maXgobGF5ZXIpOworCW14cl9kYmcobWRldiwgIndpZHRoPSV1IGhlaWdodD0ldSBzcGFuPSV1XG4iLAorCQlnZW8tPnNyYy53aWR0aCwgZ2VvLT5zcmMuaGVpZ2h0LCBnZW8tPnNyYy5mdWxsX3dpZHRoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGRpdnVwKHVuc2lnbmVkIGludCBkaXZpZGVudCwgdW5zaWduZWQgaW50IGRpdmlzb3IpCit7CisJcmV0dXJuIChkaXZpZGVudCArIGRpdmlzb3IgLSAxKSAvIGRpdmlzb3I7Cit9CisKK3Vuc2lnbmVkIGxvbmcgbXhyX2dldF9wbGFuZV9zaXplKGNvbnN0IHN0cnVjdCBteHJfYmxvY2sgKmJsaywKKwl1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQpCit7CisJdW5zaWduZWQgaW50IGJsX3dpZHRoID0gZGl2dXAod2lkdGgsIGJsay0+d2lkdGgpOworCXVuc2lnbmVkIGludCBibF9oZWlnaHQgPSBkaXZ1cChoZWlnaHQsIGJsay0+aGVpZ2h0KTsKKworCXJldHVybiBibF93aWR0aCAqIGJsX2hlaWdodCAqIGJsay0+c2l6ZTsKK30KKworc3RhdGljIHZvaWQgbXhyX21wbGFuZV9maWxsKHN0cnVjdCB2NGwyX3BsYW5lX3BpeF9mb3JtYXQgKnBsYW5lcywKKwljb25zdCBzdHJ1Y3QgbXhyX2Zvcm1hdCAqZm10LCB1MzIgd2lkdGgsIHUzMiBoZWlnaHQpCit7CisJaW50IGk7CisKKwltZW1zZXQocGxhbmVzLCAwLCBzaXplb2YoKnBsYW5lcykgKiBmbXQtPm51bV9zdWJmcmFtZXMpOworCWZvciAoaSA9IDA7IGkgPCBmbXQtPm51bV9wbGFuZXM7ICsraSkgeworCQlzdHJ1Y3QgdjRsMl9wbGFuZV9waXhfZm9ybWF0ICpwbGFuZSA9IHBsYW5lcworCQkJKyBmbXQtPnBsYW5lMnN1YmZyYW1lW2ldOworCQljb25zdCBzdHJ1Y3QgbXhyX2Jsb2NrICpibGsgPSAmZm10LT5wbGFuZVtpXTsKKwkJdTMyIGJsX3dpZHRoID0gZGl2dXAod2lkdGgsIGJsay0+d2lkdGgpOworCQl1MzIgYmxfaGVpZ2h0ID0gZGl2dXAoaGVpZ2h0LCBibGstPmhlaWdodCk7CisJCXUzMiBzaXplaW1hZ2UgPSBibF93aWR0aCAqIGJsX2hlaWdodCAqIGJsay0+c2l6ZTsKKwkJdTE2IGJ5dGVzcGVybGluZSA9IGJsX3dpZHRoICogYmxrLT5zaXplIC8gYmxrLT5oZWlnaHQ7CisKKwkJcGxhbmUtPnNpemVpbWFnZSArPSBzaXplaW1hZ2U7CisJCXBsYW5lLT5ieXRlc3BlcmxpbmUgPSBtYXgocGxhbmUtPmJ5dGVzcGVybGluZSwgYnl0ZXNwZXJsaW5lKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbXhyX2dfZm10KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICAgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCit7CisJc3RydWN0IG14cl9sYXllciAqbGF5ZXIgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXRfbXBsYW5lICpwaXggPSAmZi0+Zm10LnBpeF9tcDsKKworCW14cl9kYmcobGF5ZXItPm1kZXYsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKworCXBpeC0+d2lkdGggPSBsYXllci0+Z2VvLnNyYy5mdWxsX3dpZHRoOworCXBpeC0+aGVpZ2h0ID0gbGF5ZXItPmdlby5zcmMuZnVsbF9oZWlnaHQ7CisJcGl4LT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKKwlwaXgtPnBpeGVsZm9ybWF0ID0gbGF5ZXItPmZtdC0+Zm91cmNjOworCXBpeC0+Y29sb3JzcGFjZSA9IGxheWVyLT5mbXQtPmNvbG9yc3BhY2U7CisJbXhyX21wbGFuZV9maWxsKHBpeC0+cGxhbmVfZm10LCBsYXllci0+Zm10LCBwaXgtPndpZHRoLCBwaXgtPmhlaWdodCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbXhyX2Nyb3AgKmNob29zZV9jcm9wX2J5X3R5cGUoc3RydWN0IG14cl9nZW9tZXRyeSAqZ2VvLAorCWVudW0gdjRsMl9idWZfdHlwZSB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQ6CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVF9NUExBTkU6CisJCXJldHVybiAmZ2VvLT5kc3Q7CisJY2FzZSBWNEwyX0JVRl9UWVBFX1ZJREVPX09WRVJMQVk6CisJCXJldHVybiAmZ2VvLT5zcmM7CisJZGVmYXVsdDoKKwkJcmV0dXJuIE5VTEw7CisJfQorfQorCitzdGF0aWMgaW50IG14cl9nX2Nyb3Aoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9jcm9wICphKQoreworCXN0cnVjdCBteHJfbGF5ZXIgKmxheWVyID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgbXhyX2Nyb3AgKmNyb3A7CisKKwlteHJfZGJnKGxheWVyLT5tZGV2LCAiJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJY3JvcCA9IGNob29zZV9jcm9wX2J5X3R5cGUoJmxheWVyLT5nZW8sIGEtPnR5cGUpOworCWlmIChjcm9wID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCW14cl9sYXllcl9nZW9fZml4KGxheWVyKTsKKwlhLT5jLmxlZnQgPSBjcm9wLT54X29mZnNldDsKKwlhLT5jLnRvcCA9IGNyb3AtPnlfb2Zmc2V0OworCWEtPmMud2lkdGggPSBjcm9wLT53aWR0aDsKKwlhLT5jLmhlaWdodCA9IGNyb3AtPmhlaWdodDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBteHJfc19jcm9wKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwgc3RydWN0IHY0bDJfY3JvcCAqYSkKK3sKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IG14cl9jcm9wICpjcm9wOworCisJbXhyX2RiZyhsYXllci0+bWRldiwgIiVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCWNyb3AgPSBjaG9vc2VfY3JvcF9ieV90eXBlKCZsYXllci0+Z2VvLCBhLT50eXBlKTsKKwlpZiAoY3JvcCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwljcm9wLT54X29mZnNldCA9IGEtPmMubGVmdDsKKwljcm9wLT55X29mZnNldCA9IGEtPmMudG9wOworCWNyb3AtPndpZHRoID0gYS0+Yy53aWR0aDsKKwljcm9wLT5oZWlnaHQgPSBhLT5jLmhlaWdodDsKKwlteHJfbGF5ZXJfZ2VvX2ZpeChsYXllcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXhyX2Nyb3BjYXAoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCBzdHJ1Y3QgdjRsMl9jcm9wY2FwICphKQoreworCXN0cnVjdCBteHJfbGF5ZXIgKmxheWVyID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgbXhyX2Nyb3AgKmNyb3A7CisKKwlteHJfZGJnKGxheWVyLT5tZGV2LCAiJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJY3JvcCA9IGNob29zZV9jcm9wX2J5X3R5cGUoJmxheWVyLT5nZW8sIGEtPnR5cGUpOworCWlmIChjcm9wID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCW14cl9sYXllcl9nZW9fZml4KGxheWVyKTsKKwlhLT5ib3VuZHMubGVmdCA9IDA7CisJYS0+Ym91bmRzLnRvcCA9IDA7CisJYS0+Ym91bmRzLndpZHRoID0gY3JvcC0+ZnVsbF93aWR0aDsKKwlhLT5ib3VuZHMudG9wID0gY3JvcC0+ZnVsbF9oZWlnaHQ7CisJYS0+ZGVmcmVjdCA9IGEtPmJvdW5kczsKKwkvKiBzZXR0aW5nIHBpeGVsIGFzcGVjdCB0byAxLzEgKi8KKwlhLT5waXhlbGFzcGVjdC5udW1lcmF0b3IgPSAxOworCWEtPnBpeGVsYXNwZWN0LmRlbm9taW5hdG9yID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBteHJfZW51bV9kdl9wcmVzZXRzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwlzdHJ1Y3QgdjRsMl9kdl9lbnVtX3ByZXNldCAqcHJlc2V0KQoreworCXN0cnVjdCBteHJfbGF5ZXIgKmxheWVyID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiA9IGxheWVyLT5tZGV2OworCWludCByZXQ7CisKKwkvKiBsb2NrIHByb3RlY3RzIGZyb20gY2hhbmdpbmcgc2Rfb3V0ICovCisJbXV0ZXhfbG9jaygmbWRldi0+bXV0ZXgpOworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwodG9fb3V0c2QobWRldiksIHZpZGVvLCBlbnVtX2R2X3ByZXNldHMsIHByZXNldCk7CisJbXV0ZXhfdW5sb2NrKCZtZGV2LT5tdXRleCk7CisKKwlyZXR1cm4gcmV0ID8gLUVJTlZBTCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgbXhyX3NfZHZfcHJlc2V0KHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpmaCwKKwlzdHJ1Y3QgdjRsMl9kdl9wcmVzZXQgKnByZXNldCkKK3sKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IG14cl9kZXZpY2UgKm1kZXYgPSBsYXllci0+bWRldjsKKwlpbnQgcmV0OworCisJLyogbG9jayBwcm90ZWN0cyBmcm9tIGNoYW5naW5nIHNkX291dCAqLworCW11dGV4X2xvY2soJm1kZXYtPm11dGV4KTsKKworCS8qIHByZXNldCBjaGFuZ2UgY2Fubm90IGJlIGRvbmUgd2hpbGUgdGhlcmUgaXMgYW4gZW50aXR5CisJICogZGVwZW5kYW50IG9uIG91dHB1dCBjb25maWd1cmF0aW9uCisJICovCisJaWYgKG1kZXYtPm5fb3V0cHV0ID4gMCkgeworCQltdXRleF91bmxvY2soJm1kZXYtPm11dGV4KTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlyZXQgPSB2NGwyX3N1YmRldl9jYWxsKHRvX291dHNkKG1kZXYpLCB2aWRlbywgc19kdl9wcmVzZXQsIHByZXNldCk7CisKKwltdXRleF91bmxvY2soJm1kZXYtPm11dGV4KTsKKworCS8qIGFueSBmYWlsdXJlIHNob3VsZCByZXR1cm4gRUlOVkFMIGFjY29yZGluZyB0byBWNEwyIGRvYyAqLworCXJldHVybiByZXQgPyAtRUlOVkFMIDogMDsKK30KKworc3RhdGljIGludCBteHJfZ19kdl9wcmVzZXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLAorCXN0cnVjdCB2NGwyX2R2X3ByZXNldCAqcHJlc2V0KQoreworCXN0cnVjdCBteHJfbGF5ZXIgKmxheWVyID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiA9IGxheWVyLT5tZGV2OworCWludCByZXQ7CisKKwkvKiBsb2NrIHByb3RlY3RzIGZyb20gY2hhbmdpbmcgc2Rfb3V0ICovCisJbXV0ZXhfbG9jaygmbWRldi0+bXV0ZXgpOworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwodG9fb3V0c2QobWRldiksIHZpZGVvLCBnX2R2X3ByZXNldCwgcHJlc2V0KTsKKwltdXRleF91bmxvY2soJm1kZXYtPm11dGV4KTsKKworCXJldHVybiByZXQgPyAtRUlOVkFMIDogMDsKK30KKworc3RhdGljIGludCBteHJfc19zdGQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCB2NGwyX3N0ZF9pZCAqbm9ybSkKK3sKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IG14cl9kZXZpY2UgKm1kZXYgPSBsYXllci0+bWRldjsKKwlpbnQgcmV0OworCisJLyogbG9jayBwcm90ZWN0cyBmcm9tIGNoYW5naW5nIHNkX291dCAqLworCW11dGV4X2xvY2soJm1kZXYtPm11dGV4KTsKKworCS8qIHN0YW5kYXJkIGNoYW5nZSBjYW5ub3QgYmUgZG9uZSB3aGlsZSB0aGVyZSBpcyBhbiBlbnRpdHkKKwkgKiBkZXBlbmRhbnQgb24gb3V0cHV0IGNvbmZpZ3VyYXRpb24KKwkgKi8KKwlpZiAobWRldi0+bl9vdXRwdXQgPiAwKSB7CisJCW11dGV4X3VubG9jaygmbWRldi0+bXV0ZXgpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwodG9fb3V0c2QobWRldiksIHZpZGVvLCBzX3N0ZF9vdXRwdXQsICpub3JtKTsKKworCW11dGV4X3VubG9jaygmbWRldi0+bXV0ZXgpOworCisJcmV0dXJuIHJldCA/IC1FSU5WQUwgOiAwOworfQorCitzdGF0aWMgaW50IG14cl9nX3N0ZChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHY0bDJfc3RkX2lkICpub3JtKQoreworCXN0cnVjdCBteHJfbGF5ZXIgKmxheWVyID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiA9IGxheWVyLT5tZGV2OworCWludCByZXQ7CisKKwkvKiBsb2NrIHByb3RlY3RzIGZyb20gY2hhbmdpbmcgc2Rfb3V0ICovCisJbXV0ZXhfbG9jaygmbWRldi0+bXV0ZXgpOworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwodG9fb3V0c2QobWRldiksIHZpZGVvLCBnX3N0ZF9vdXRwdXQsIG5vcm0pOworCW11dGV4X3VubG9jaygmbWRldi0+bXV0ZXgpOworCisJcmV0dXJuIHJldCA/IC1FSU5WQUwgOiAwOworfQorCitzdGF0aWMgaW50IG14cl9lbnVtX291dHB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqZmgsIHN0cnVjdCB2NGwyX291dHB1dCAqYSkKK3sKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IG14cl9kZXZpY2UgKm1kZXYgPSBsYXllci0+bWRldjsKKwlzdHJ1Y3QgbXhyX291dHB1dCAqb3V0OworCXN0cnVjdCB2NGwyX3N1YmRldiAqc2Q7CisKKwlpZiAoYS0+aW5kZXggPj0gbWRldi0+b3V0cHV0X2NudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJb3V0ID0gbWRldi0+b3V0cHV0W2EtPmluZGV4XTsKKwlCVUdfT04ob3V0ID09IE5VTEwpOworCXNkID0gb3V0LT5zZDsKKwlzdHJsY3B5KGEtPm5hbWUsIG91dC0+bmFtZSwgc2l6ZW9mKGEtPm5hbWUpKTsKKworCS8qIHRyeSB0byBvYnRhaW4gc3VwcG9ydGVkIHR2IG5vcm1zICovCisJdjRsMl9zdWJkZXZfY2FsbChzZCwgdmlkZW8sIGdfdHZub3Jtc19vdXRwdXQsICZhLT5zdGQpOworCWEtPmNhcGFiaWxpdGllcyA9IDA7CisJaWYgKHNkLT5vcHMtPnZpZGVvICYmIHNkLT5vcHMtPnZpZGVvLT5zX2R2X3ByZXNldCkKKwkJYS0+Y2FwYWJpbGl0aWVzIHw9IFY0TDJfT1VUX0NBUF9QUkVTRVRTOworCWlmIChzZC0+b3BzLT52aWRlbyAmJiBzZC0+b3BzLT52aWRlby0+c19zdGRfb3V0cHV0KQorCQlhLT5jYXBhYmlsaXRpZXMgfD0gVjRMMl9PVVRfQ0FQX1NURDsKKwlhLT50eXBlID0gVjRMMl9PVVRQVVRfVFlQRV9BTkFMT0c7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBteHJfc19vdXRwdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCB1bnNpZ25lZCBpbnQgaSkKK3sKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZmQgPSB2aWRlb19kZXZkYXRhKGZpbGUpOworCXN0cnVjdCBteHJfbGF5ZXIgKmxheWVyID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKwlzdHJ1Y3QgbXhyX2RldmljZSAqbWRldiA9IGxheWVyLT5tZGV2OworCWludCByZXQgPSAwOworCisJaWYgKGkgPj0gbWRldi0+b3V0cHV0X2NudCB8fCBtZGV2LT5vdXRwdXRbaV0gPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZtZGV2LT5tdXRleCk7CisJaWYgKG1kZXYtPm5fb3V0cHV0ID4gMCkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZG9uZTsKKwl9CisJbWRldi0+Y3VycmVudF9vdXRwdXQgPSBpOworCXZmZC0+dHZub3JtcyA9IDA7CisJdjRsMl9zdWJkZXZfY2FsbCh0b19vdXRzZChtZGV2KSwgdmlkZW8sIGdfdHZub3Jtc19vdXRwdXQsCisJCSZ2ZmQtPnR2bm9ybXMpOworCW14cl9kYmcobWRldiwgInR2bm9ybXMgPSAlMDhsbHhcbiIsIHZmZC0+dHZub3Jtcyk7CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZtZGV2LT5tdXRleCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBteHJfZ19vdXRwdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKmZoLCB1bnNpZ25lZCBpbnQgKnApCit7CisJc3RydWN0IG14cl9sYXllciAqbGF5ZXIgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCXN0cnVjdCBteHJfZGV2aWNlICptZGV2ID0gbGF5ZXItPm1kZXY7CisKKwltdXRleF9sb2NrKCZtZGV2LT5tdXRleCk7CisJKnAgPSBtZGV2LT5jdXJyZW50X291dHB1dDsKKwltdXRleF91bmxvY2soJm1kZXYtPm11dGV4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG14cl9yZXFidWZzKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LAorCQkJICBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyAqcCkKK3sKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisKKwlteHJfZGJnKGxheWVyLT5tZGV2LCAiJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcmV0dXJuIHZiMl9yZXFidWZzKCZsYXllci0+dmJfcXVldWUsIHApOworfQorCitzdGF0aWMgaW50IG14cl9xdWVyeWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpwKQoreworCXN0cnVjdCBteHJfbGF5ZXIgKmxheWVyID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKworCW14cl9kYmcobGF5ZXItPm1kZXYsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gdmIyX3F1ZXJ5YnVmKCZsYXllci0+dmJfcXVldWUsIHApOworfQorCitzdGF0aWMgaW50IG14cl9xYnVmKHN0cnVjdCBmaWxlICpmaWxlLCB2b2lkICpwcml2LCBzdHJ1Y3QgdjRsMl9idWZmZXIgKnApCit7CisJc3RydWN0IG14cl9sYXllciAqbGF5ZXIgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCisJbXhyX2RiZyhsYXllci0+bWRldiwgIiVzOiVkKCVkKVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBwLT5pbmRleCk7CisJcmV0dXJuIHZiMl9xYnVmKCZsYXllci0+dmJfcXVldWUsIHApOworfQorCitzdGF0aWMgaW50IG14cl9kcWJ1ZihzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwgc3RydWN0IHY0bDJfYnVmZmVyICpwKQoreworCXN0cnVjdCBteHJfbGF5ZXIgKmxheWVyID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKworCW14cl9kYmcobGF5ZXItPm1kZXYsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gdmIyX2RxYnVmKCZsYXllci0+dmJfcXVldWUsIHAsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKK30KKworc3RhdGljIGludCBteHJfc3RyZWFtb24oc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIGVudW0gdjRsMl9idWZfdHlwZSBpKQoreworCXN0cnVjdCBteHJfbGF5ZXIgKmxheWVyID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKworCW14cl9kYmcobGF5ZXItPm1kZXYsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gdmIyX3N0cmVhbW9uKCZsYXllci0+dmJfcXVldWUsIGkpOworfQorCitzdGF0aWMgaW50IG14cl9zdHJlYW1vZmYoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIGVudW0gdjRsMl9idWZfdHlwZSBpKQoreworCXN0cnVjdCBteHJfbGF5ZXIgKmxheWVyID0gdmlkZW9fZHJ2ZGF0YShmaWxlKTsKKworCW14cl9kYmcobGF5ZXItPm1kZXYsICIlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlyZXR1cm4gdmIyX3N0cmVhbW9mZigmbGF5ZXItPnZiX3F1ZXVlLCBpKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyBteHJfaW9jdGxfb3BzID0geworCS52aWRpb2NfcXVlcnljYXAgPSBteHJfcXVlcnljYXAsCisJLyogZm9ybWF0IGhhbmRsaW5nICovCisJLnZpZGlvY19lbnVtX2ZtdF92aWRfb3V0ID0gbXhyX2VudW1fZm10LAorCS52aWRpb2Nfc19mbXRfdmlkX291dF9tcGxhbmUgPSBteHJfc19mbXQsCisJLnZpZGlvY19nX2ZtdF92aWRfb3V0X21wbGFuZSA9IG14cl9nX2ZtdCwKKwkvKiBidWZmZXIgY29udHJvbCAqLworCS52aWRpb2NfcmVxYnVmcyA9IG14cl9yZXFidWZzLAorCS52aWRpb2NfcXVlcnlidWYgPSBteHJfcXVlcnlidWYsCisJLnZpZGlvY19xYnVmID0gbXhyX3FidWYsCisJLnZpZGlvY19kcWJ1ZiA9IG14cl9kcWJ1ZiwKKwkvKiBTdHJlYW1pbmcgY29udHJvbCAqLworCS52aWRpb2Nfc3RyZWFtb24gPSBteHJfc3RyZWFtb24sCisJLnZpZGlvY19zdHJlYW1vZmYgPSBteHJfc3RyZWFtb2ZmLAorCS8qIFByZXNldCBmdW5jdGlvbnMgKi8KKwkudmlkaW9jX2VudW1fZHZfcHJlc2V0cyA9IG14cl9lbnVtX2R2X3ByZXNldHMsCisJLnZpZGlvY19zX2R2X3ByZXNldCA9IG14cl9zX2R2X3ByZXNldCwKKwkudmlkaW9jX2dfZHZfcHJlc2V0ID0gbXhyX2dfZHZfcHJlc2V0LAorCS8qIGFuYWxvZyBUViBzdGFuZGFyZCBmdW5jdGlvbnMgKi8KKwkudmlkaW9jX3Nfc3RkID0gbXhyX3Nfc3RkLAorCS52aWRpb2NfZ19zdGQgPSBteHJfZ19zdGQsCisJLyogT3V0cHV0IGhhbmRsaW5nICovCisJLnZpZGlvY19lbnVtX291dHB1dCA9IG14cl9lbnVtX291dHB1dCwKKwkudmlkaW9jX3Nfb3V0cHV0ID0gbXhyX3Nfb3V0cHV0LAorCS52aWRpb2NfZ19vdXRwdXQgPSBteHJfZ19vdXRwdXQsCisJLyogQ3JvcCBpb2N0bHMgKi8KKwkudmlkaW9jX2dfY3JvcCA9IG14cl9nX2Nyb3AsCisJLnZpZGlvY19zX2Nyb3AgPSBteHJfc19jcm9wLAorCS52aWRpb2NfY3JvcGNhcCA9IG14cl9jcm9wY2FwLAorfTsKKworc3RhdGljIGludCBteHJfdmlkZW9fb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IG14cl9kZXZpY2UgKm1kZXYgPSBsYXllci0+bWRldjsKKwlpbnQgcmV0ID0gMDsKKworCW14cl9kYmcobWRldiwgIiVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCS8qIGFzc3VyZSBkZXZpY2UgcHJvYmUgaXMgZmluaXNoZWQgKi8KKwl3YWl0X2Zvcl9kZXZpY2VfcHJvYmUoKTsKKwkvKiBjcmVhdGluZyBjb250ZXh0IGZvciBmaWxlIGRlc2NyaXB0b3IgKi8KKwlyZXQgPSB2NGwyX2ZoX29wZW4oZmlsZSk7CisJaWYgKHJldCkgeworCQlteHJfZXJyKG1kZXYsICJ2NGwyX2ZoX29wZW4gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBsZWF2aW5nIGlmIGxheWVyIGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgKi8KKwlpZiAoIXY0bDJfZmhfaXNfc2luZ3VsYXJfZmlsZShmaWxlKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBGSVhNRTogc2hvdWxkIHBvd2VyIGJlIGVuYWJsZWQgb24gb3Blbj8gKi8KKwlyZXQgPSBteHJfcG93ZXJfZ2V0KG1kZXYpOworCWlmIChyZXQpIHsKKwkJbXhyX2VycihtZGV2LCAicG93ZXIgb24gZmFpbGVkXG4iKTsKKwkJZ290byBmYWlsX2ZoX29wZW47CisJfQorCisJcmV0ID0gdmIyX3F1ZXVlX2luaXQoJmxheWVyLT52Yl9xdWV1ZSk7CisJaWYgKHJldCAhPSAwKSB7CisJCW14cl9lcnIobWRldiwgImZhaWxlZCB0byBpbml0aWFsaXplIHZiMiBxdWV1ZVxuIik7CisJCWdvdG8gZmFpbF9wb3dlcjsKKwl9CisJLyogc2V0IGRlZmF1bHQgZm9ybWF0LCBmaXJzdCBvbiB0aGUgbGlzdCAqLworCWxheWVyLT5mbXQgPSBsYXllci0+Zm10X2FycmF5WzBdOworCS8qIHNldHVwIGRlZmF1bHQgZ2VvbWV0cnkgKi8KKwlteHJfbGF5ZXJfZGVmYXVsdF9nZW8obGF5ZXIpOworCisJcmV0dXJuIDA7CisKK2ZhaWxfcG93ZXI6CisJbXhyX3Bvd2VyX3B1dChtZGV2KTsKKworZmFpbF9maF9vcGVuOgorCXY0bDJfZmhfcmVsZWFzZShmaWxlKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK214cl92aWRlb19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IG14cl9sYXllciAqbGF5ZXIgPSB2aWRlb19kcnZkYXRhKGZpbGUpOworCisJbXhyX2RiZyhsYXllci0+bWRldiwgIiVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCisJcmV0dXJuIHZiMl9wb2xsKCZsYXllci0+dmJfcXVldWUsIGZpbGUsIHdhaXQpOworfQorCitzdGF0aWMgaW50IG14cl92aWRlb19tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisKKwlteHJfZGJnKGxheWVyLT5tZGV2LCAiJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisKKwlyZXR1cm4gdmIyX21tYXAoJmxheWVyLT52Yl9xdWV1ZSwgdm1hKTsKK30KKworc3RhdGljIGludCBteHJfdmlkZW9fcmVsZWFzZShzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisKKwlteHJfZGJnKGxheWVyLT5tZGV2LCAiJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJaWYgKHY0bDJfZmhfaXNfc2luZ3VsYXJfZmlsZShmaWxlKSkgeworCQl2YjJfcXVldWVfcmVsZWFzZSgmbGF5ZXItPnZiX3F1ZXVlKTsKKwkJbXhyX3Bvd2VyX3B1dChsYXllci0+bWRldik7CisJfQorCXY0bDJfZmhfcmVsZWFzZShmaWxlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyBteHJfZm9wcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkub3BlbiA9IG14cl92aWRlb19vcGVuLAorCS5wb2xsID0gbXhyX3ZpZGVvX3BvbGwsCisJLm1tYXAgPSBteHJfdmlkZW9fbW1hcCwKKwkucmVsZWFzZSA9IG14cl92aWRlb19yZWxlYXNlLAorCS51bmxvY2tlZF9pb2N0bCA9IHZpZGVvX2lvY3RsMiwKK307CisKK3N0YXRpYyBpbnQgcXVldWVfc2V0dXAoc3RydWN0IHZiMl9xdWV1ZSAqdnEsIHVuc2lnbmVkIGludCAqbmJ1ZmZlcnMsCisJdW5zaWduZWQgaW50ICpucGxhbmVzLCB1bnNpZ25lZCBsb25nIHNpemVzW10sCisJdm9pZCAqYWxsb2NfY3R4c1tdKQoreworCXN0cnVjdCBteHJfbGF5ZXIgKmxheWVyID0gdmIyX2dldF9kcnZfcHJpdih2cSk7CisJY29uc3Qgc3RydWN0IG14cl9mb3JtYXQgKmZtdCA9IGxheWVyLT5mbXQ7CisJaW50IGk7CisJc3RydWN0IG14cl9kZXZpY2UgKm1kZXYgPSBsYXllci0+bWRldjsKKwlzdHJ1Y3QgdjRsMl9wbGFuZV9waXhfZm9ybWF0IHBsYW5lc1szXTsKKworCW14cl9kYmcobWRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisJLyogY2hlY2tpbmcgaWYgZm9ybWF0IHdhcyBjb25maWd1cmVkICovCisJaWYgKGZtdCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlteHJfZGJnKG1kZXYsICJmbXQgPSAlc1xuIiwgZm10LT5uYW1lKTsKKwlteHJfbXBsYW5lX2ZpbGwocGxhbmVzLCBmbXQsIGxheWVyLT5nZW8uc3JjLmZ1bGxfd2lkdGgsCisJCWxheWVyLT5nZW8uc3JjLmZ1bGxfaGVpZ2h0KTsKKworCSpucGxhbmVzID0gZm10LT5udW1fc3ViZnJhbWVzOworCWZvciAoaSA9IDA7IGkgPCBmbXQtPm51bV9zdWJmcmFtZXM7ICsraSkgeworCQlhbGxvY19jdHhzW2ldID0gbGF5ZXItPm1kZXYtPmFsbG9jX2N0eDsKKwkJc2l6ZXNbaV0gPSBQQUdFX0FMSUdOKHBsYW5lc1tpXS5zaXplaW1hZ2UpOworCQlteHJfZGJnKG1kZXYsICJzaXplWyVkXSA9ICUwOGx4XG4iLCBpLCBzaXplc1tpXSk7CisJfQorCisJaWYgKCpuYnVmZmVycyA9PSAwKQorCQkqbmJ1ZmZlcnMgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJ1Zl9xdWV1ZShzdHJ1Y3QgdmIyX2J1ZmZlciAqdmIpCit7CisJc3RydWN0IG14cl9idWZmZXIgKmJ1ZmZlciA9IGNvbnRhaW5lcl9vZih2Yiwgc3RydWN0IG14cl9idWZmZXIsIHZiKTsKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciA9IHZiMl9nZXRfZHJ2X3ByaXYodmItPnZiMl9xdWV1ZSk7CisJc3RydWN0IG14cl9kZXZpY2UgKm1kZXYgPSBsYXllci0+bWRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBtdXN0X3N0YXJ0ID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsYXllci0+ZW5xX3Nsb2NrLCBmbGFncyk7CisJaWYgKGxheWVyLT5zdGF0ZSA9PSBNWFJfTEFZRVJfU1RSRUFNSU5HX1NUQVJUKSB7CisJCWxheWVyLT5zdGF0ZSA9IE1YUl9MQVlFUl9TVFJFQU1JTkc7CisJCW11c3Rfc3RhcnQgPSAxOworCX0KKwlsaXN0X2FkZF90YWlsKCZidWZmZXItPmxpc3QsICZsYXllci0+ZW5xX2xpc3QpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxheWVyLT5lbnFfc2xvY2ssIGZsYWdzKTsKKwlpZiAobXVzdF9zdGFydCkgeworCQlsYXllci0+b3BzLnN0cmVhbV9zZXQobGF5ZXIsIE1YUl9FTkFCTEUpOworCQlteHJfc3RyZWFtZXJfZ2V0KG1kZXYpOworCX0KKworCW14cl9kYmcobWRldiwgInF1ZXVpbmcgYnVmZmVyXG4iKTsKK30KKworc3RhdGljIHZvaWQgd2FpdF9sb2NrKHN0cnVjdCB2YjJfcXVldWUgKnZxKQoreworCXN0cnVjdCBteHJfbGF5ZXIgKmxheWVyID0gdmIyX2dldF9kcnZfcHJpdih2cSk7CisKKwlteHJfZGJnKGxheWVyLT5tZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKwltdXRleF9sb2NrKCZsYXllci0+bXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCB3YWl0X3VubG9jayhzdHJ1Y3QgdmIyX3F1ZXVlICp2cSkKK3sKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciA9IHZiMl9nZXRfZHJ2X3ByaXYodnEpOworCisJbXhyX2RiZyhsYXllci0+bWRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisJbXV0ZXhfdW5sb2NrKCZsYXllci0+bXV0ZXgpOworfQorCitzdGF0aWMgaW50IHN0YXJ0X3N0cmVhbWluZyhzdHJ1Y3QgdmIyX3F1ZXVlICp2cSkKK3sKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciA9IHZiMl9nZXRfZHJ2X3ByaXYodnEpOworCXN0cnVjdCBteHJfZGV2aWNlICptZGV2ID0gbGF5ZXItPm1kZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW14cl9kYmcobWRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisJLyogYmxvY2sgYW55IGNoYW5nZXMgaW4gb3V0cHV0IGNvbmZpZ3VyYXRpb24gKi8KKwlteHJfb3V0cHV0X2dldChtZGV2KTsKKworCS8qIHVwZGF0ZSBsYXllcnMgZ2VvbWV0cnkgKi8KKwlteHJfbGF5ZXJfZ2VvX2ZpeChsYXllcik7CisJbXhyX2dlb21ldHJ5X2R1bXAobWRldiwgJmxheWVyLT5nZW8pOworCisJbGF5ZXItPm9wcy5mb3JtYXRfc2V0KGxheWVyKTsKKwkvKiBlbmFibGluZyBsYXllciBpbiBoYXJkd2FyZSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZsYXllci0+ZW5xX3Nsb2NrLCBmbGFncyk7CisJbGF5ZXItPnN0YXRlID0gTVhSX0xBWUVSX1NUUkVBTUlOR19TVEFSVDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsYXllci0+ZW5xX3Nsb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXhyX3dhdGNoZG9nKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBteHJfbGF5ZXIgKmxheWVyID0gKHN0cnVjdCBteHJfbGF5ZXIgKikgYXJnOworCXN0cnVjdCBteHJfZGV2aWNlICptZGV2ID0gbGF5ZXItPm1kZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW14cl9lcnIobWRldiwgIndhdGNoZG9nIGZpcmVkIGZvciBsYXllciAlc1xuIiwgbGF5ZXItPnZmZC5uYW1lKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsYXllci0+ZW5xX3Nsb2NrLCBmbGFncyk7CisKKwlpZiAobGF5ZXItPnVwZGF0ZV9idWYgPT0gbGF5ZXItPnNoYWRvd19idWYpCisJCWxheWVyLT51cGRhdGVfYnVmID0gTlVMTDsKKwlpZiAobGF5ZXItPnVwZGF0ZV9idWYpIHsKKwkJdmIyX2J1ZmZlcl9kb25lKCZsYXllci0+dXBkYXRlX2J1Zi0+dmIsIFZCMl9CVUZfU1RBVEVfRVJST1IpOworCQlsYXllci0+dXBkYXRlX2J1ZiA9IE5VTEw7CisJfQorCWlmIChsYXllci0+c2hhZG93X2J1ZikgeworCQl2YjJfYnVmZmVyX2RvbmUoJmxheWVyLT5zaGFkb3dfYnVmLT52YiwgVkIyX0JVRl9TVEFURV9FUlJPUik7CisJCWxheWVyLT5zaGFkb3dfYnVmID0gTlVMTDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGF5ZXItPmVucV9zbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHN0b3Bfc3RyZWFtaW5nKHN0cnVjdCB2YjJfcXVldWUgKnZxKQoreworCXN0cnVjdCBteHJfbGF5ZXIgKmxheWVyID0gdmIyX2dldF9kcnZfcHJpdih2cSk7CisJc3RydWN0IG14cl9kZXZpY2UgKm1kZXYgPSBsYXllci0+bWRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB0aW1lcl9saXN0IHdhdGNoZG9nOworCXN0cnVjdCBteHJfYnVmZmVyICpidWYsICpidWZfdG1wOworCisJbXhyX2RiZyhtZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsYXllci0+ZW5xX3Nsb2NrLCBmbGFncyk7CisKKwkvKiByZXNldCBsaXN0ICovCisJbGF5ZXItPnN0YXRlID0gTVhSX0xBWUVSX1NUUkVBTUlOR19GSU5JU0g7CisKKwkvKiBzZXQgYWxsIGJ1ZmZlciB0byBiZSBkb25lICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGJ1ZiwgYnVmX3RtcCwgJmxheWVyLT5lbnFfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmYnVmLT5saXN0KTsKKwkJdmIyX2J1ZmZlcl9kb25lKCZidWYtPnZiLCBWQjJfQlVGX1NUQVRFX0VSUk9SKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsYXllci0+ZW5xX3Nsb2NrLCBmbGFncyk7CisKKwkvKiBnaXZlIDEgc2Vjb25kcyB0byBjb21wbGV0ZSB0byBjb21wbGV0ZSBsYXN0IGJ1ZmZlcnMgKi8KKwlzZXR1cF90aW1lcl9vbl9zdGFjaygmd2F0Y2hkb2csIG14cl93YXRjaGRvZywKKwkJKHVuc2lnbmVkIGxvbmcpbGF5ZXIpOworCW1vZF90aW1lcigmd2F0Y2hkb2csIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMDApKTsKKworCS8qIHdhaXQgdW50aWwgYWxsIGJ1ZmZlcnMgYXJlIGdvZXMgdG8gZG9uZSBzdGF0ZSAqLworCXZiMl93YWl0X2Zvcl9hbGxfYnVmZmVycyh2cSk7CisKKwkvKiBzdG9wIHRpbWVyIGlmIGFsbCBzeW5jaHJvbml6YXRpb24gaXMgZG9uZSAqLworCWRlbF90aW1lcl9zeW5jKCZ3YXRjaGRvZyk7CisJZGVzdHJveV90aW1lcl9vbl9zdGFjaygmd2F0Y2hkb2cpOworCisJLyogc3RvcHBpbmcgaGFyZHdhcmUgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbGF5ZXItPmVucV9zbG9jaywgZmxhZ3MpOworCWxheWVyLT5zdGF0ZSA9IE1YUl9MQVlFUl9JRExFOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxheWVyLT5lbnFfc2xvY2ssIGZsYWdzKTsKKworCS8qIGRpc2FibGluZyBsYXllciBpbiBoYXJkd2FyZSAqLworCWxheWVyLT5vcHMuc3RyZWFtX3NldChsYXllciwgTVhSX0RJU0FCTEUpOworCS8qIHJlbW92ZSBvbmUgc3RyZWFtZXIgKi8KKwlteHJfc3RyZWFtZXJfcHV0KG1kZXYpOworCS8qIGFsbG93IGNoYW5nZXMgaW4gb3V0cHV0IGNvbmZpZ3VyYXRpb24gKi8KKwlteHJfb3V0cHV0X3B1dChtZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB2YjJfb3BzIG14cl92aWRlb19xb3BzID0geworCS5xdWV1ZV9zZXR1cCA9IHF1ZXVlX3NldHVwLAorCS5idWZfcXVldWUgPSBidWZfcXVldWUsCisJLndhaXRfcHJlcGFyZSA9IHdhaXRfdW5sb2NrLAorCS53YWl0X2ZpbmlzaCA9IHdhaXRfbG9jaywKKwkuc3RhcnRfc3RyZWFtaW5nID0gc3RhcnRfc3RyZWFtaW5nLAorCS5zdG9wX3N0cmVhbWluZyA9IHN0b3Bfc3RyZWFtaW5nLAorfTsKKworLyogRklYTUU6IHRyeSB0byBwdXQgdGhpcyBmdW5jdGlvbnMgdG8gbXhyX2Jhc2VfbGF5ZXJfY3JlYXRlICovCitpbnQgbXhyX2Jhc2VfbGF5ZXJfcmVnaXN0ZXIoc3RydWN0IG14cl9sYXllciAqbGF5ZXIpCit7CisJc3RydWN0IG14cl9kZXZpY2UgKm1kZXYgPSBsYXllci0+bWRldjsKKwlpbnQgcmV0OworCisJcmV0ID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZsYXllci0+dmZkLCBWRkxfVFlQRV9HUkFCQkVSLCAtMSk7CisJaWYgKHJldCkKKwkJbXhyX2VycihtZGV2LCAiZmFpbGVkIHRvIHJlZ2lzdGVyIHZpZGVvIGRldmljZVxuIik7CisJZWxzZQorCQlteHJfaW5mbyhtZGV2LCAicmVnaXN0ZXJlZCBsYXllciAlcyBhcyAvZGV2L3ZpZGVvJWRcbiIsCisJCQlsYXllci0+dmZkLm5hbWUsIGxheWVyLT52ZmQubnVtKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIG14cl9iYXNlX2xheWVyX3VucmVnaXN0ZXIoc3RydWN0IG14cl9sYXllciAqbGF5ZXIpCit7CisJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UoJmxheWVyLT52ZmQpOworfQorCit2b2lkIG14cl9sYXllcl9yZWxlYXNlKHN0cnVjdCBteHJfbGF5ZXIgKmxheWVyKQoreworCWlmIChsYXllci0+b3BzLnJlbGVhc2UpCisJCWxheWVyLT5vcHMucmVsZWFzZShsYXllcik7Cit9CisKK3ZvaWQgbXhyX2Jhc2VfbGF5ZXJfcmVsZWFzZShzdHJ1Y3QgbXhyX2xheWVyICpsYXllcikKK3sKKwlrZnJlZShsYXllcik7Cit9CisKK3N0YXRpYyB2b2lkIG14cl92ZmRfcmVsZWFzZShzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2KQoreworCXByaW50ayhLRVJOX0lORk8gInZpZGVvIGRldmljZSByZWxlYXNlXG4iKTsKK30KKworc3RydWN0IG14cl9sYXllciAqbXhyX2Jhc2VfbGF5ZXJfY3JlYXRlKHN0cnVjdCBteHJfZGV2aWNlICptZGV2LAorCWludCBpZHgsIGNoYXIgKm5hbWUsIHN0cnVjdCBteHJfbGF5ZXJfb3BzICpvcHMpCit7CisJc3RydWN0IG14cl9sYXllciAqbGF5ZXI7CisKKwlsYXllciA9IGt6YWxsb2Moc2l6ZW9mICpsYXllciwgR0ZQX0tFUk5FTCk7CisJaWYgKGxheWVyID09IE5VTEwpIHsKKwkJbXhyX2VycihtZGV2LCAibm90IGVub3VnaCBtZW1vcnkgZm9yIGxheWVyLlxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlsYXllci0+bWRldiA9IG1kZXY7CisJbGF5ZXItPmlkeCA9IGlkeDsKKwlsYXllci0+b3BzID0gKm9wczsKKworCXNwaW5fbG9ja19pbml0KCZsYXllci0+ZW5xX3Nsb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmbGF5ZXItPmVucV9saXN0KTsKKwltdXRleF9pbml0KCZsYXllci0+bXV0ZXgpOworCisJbGF5ZXItPnZmZCA9IChzdHJ1Y3QgdmlkZW9fZGV2aWNlKSB7CisJCS5taW5vciA9IC0xLAorCQkucmVsZWFzZSA9IG14cl92ZmRfcmVsZWFzZSwKKwkJLmZvcHMgPSAmbXhyX2ZvcHMsCisJCS5pb2N0bF9vcHMgPSAmbXhyX2lvY3RsX29wcywKKwl9OworCXN0cmxjcHkobGF5ZXItPnZmZC5uYW1lLCBuYW1lLCBzaXplb2YobGF5ZXItPnZmZC5uYW1lKSk7CisJLyogbGV0IGZyYW1ld29yayBjb250cm9sIFBSSU9SSVRZICovCisJc2V0X2JpdChWNEwyX0ZMX1VTRV9GSF9QUklPLCAmbGF5ZXItPnZmZC5mbGFncyk7CisKKwl2aWRlb19zZXRfZHJ2ZGF0YSgmbGF5ZXItPnZmZCwgbGF5ZXIpOworCWxheWVyLT52ZmQubG9jayA9ICZsYXllci0+bXV0ZXg7CisJbGF5ZXItPnZmZC52NGwyX2RldiA9ICZtZGV2LT52NGwyX2RldjsKKworCWxheWVyLT52Yl9xdWV1ZSA9IChzdHJ1Y3QgdmIyX3F1ZXVlKSB7CisJCS50eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVRfTVBMQU5FLAorCQkuaW9fbW9kZXMgPSBWQjJfTU1BUCB8IFZCMl9VU0VSUFRSLAorCQkuZHJ2X3ByaXYgPSBsYXllciwKKwkJLmJ1Zl9zdHJ1Y3Rfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbXhyX2J1ZmZlciksCisJCS5vcHMgPSAmbXhyX3ZpZGVvX3FvcHMsCisJCS5tZW1fb3BzID0gJnZiMl9kbWFfY29udGlnX21lbW9wcywKKwl9OworCisJcmV0dXJuIGxheWVyOworCitmYWlsOgorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG14cl9mb3JtYXQgKmZpbmRfZm9ybWF0X2J5X2ZvdXJjYygKKwlzdHJ1Y3QgbXhyX2xheWVyICpsYXllciwgdW5zaWduZWQgbG9uZyBmb3VyY2MpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGF5ZXItPmZtdF9hcnJheV9zaXplOyArK2kpCisJCWlmIChsYXllci0+Zm10X2FycmF5W2ldLT5mb3VyY2MgPT0gZm91cmNjKQorCQkJcmV0dXJuIGxheWVyLT5mbXRfYXJyYXlbaV07CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXhyX2Zvcm1hdCAqZmluZF9mb3JtYXRfYnlfaW5kZXgoCisJc3RydWN0IG14cl9sYXllciAqbGF5ZXIsIHVuc2lnbmVkIGxvbmcgaW5kZXgpCit7CisJaWYgKGluZGV4ID49IGxheWVyLT5mbXRfYXJyYXlfc2l6ZSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGxheWVyLT5mbXRfYXJyYXlbaW5kZXhdOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlcl92cF9sYXllci5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvbWl4ZXJfdnBfbGF5ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTUwZWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvbWl4ZXJfdnBfbGF5ZXIuYwpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIFNhbXN1bmcgVFYgTWl4ZXIgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4sIEx0ZC4KKyAqCisgKiBUb21hc3ogU3RhbmlzbGF3c2tpLCA8dC5zdGFuaXNsYXdzQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRpYXRpb24uIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsCisgKiBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uCisgKi8KKworI2luY2x1ZGUgIm1peGVyLmgiCisKKyNpbmNsdWRlICJyZWdzLXZwLmgiCisKKyNpbmNsdWRlIDxtZWRpYS92aWRlb2J1ZjItZG1hLWNvbnRpZy5oPgorCisvKiBGT1JNQVQgREVGSU5JVElPTlMgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXhyX2Zvcm1hdCBteHJfZm10X252MTIgPSB7CisJLm5hbWUgPSAiTlYxMiIsCisJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9OVjEyLAorCS5jb2xvcnNwYWNlID0gVjRMMl9DT0xPUlNQQUNFX0pQRUcsCisJLm51bV9wbGFuZXMgPSAyLAorCS5wbGFuZSA9IHsKKwkJeyAud2lkdGggPSAxLCAuaGVpZ2h0ID0gMSwgLnNpemUgPSAxIH0sCisJCXsgLndpZHRoID0gMiwgLmhlaWdodCA9IDIsIC5zaXplID0gMiB9LAorCX0sCisJLm51bV9zdWJmcmFtZXMgPSAxLAorCS5jb29raWUgPSBWUF9NT0RFX05WMTIgfCBWUF9NT0RFX01FTV9MSU5FQVIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG14cl9mb3JtYXQgbXhyX2ZtdF9udjIxID0geworCS5uYW1lID0gIk5WMjEiLAorCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfTlYyMSwKKwkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAorCS5udW1fcGxhbmVzID0gMiwKKwkucGxhbmUgPSB7CisJCXsgLndpZHRoID0gMSwgLmhlaWdodCA9IDEsIC5zaXplID0gMSB9LAorCQl7IC53aWR0aCA9IDIsIC5oZWlnaHQgPSAyLCAuc2l6ZSA9IDIgfSwKKwl9LAorCS5udW1fc3ViZnJhbWVzID0gMSwKKwkuY29va2llID0gVlBfTU9ERV9OVjIxIHwgVlBfTU9ERV9NRU1fTElORUFSLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBteHJfZm9ybWF0IG14cl9mbXRfbnYxMm0gPSB7CisJLm5hbWUgPSAiTlYxMiAobXBsYW5lKSIsCisJLmZvdXJjYyA9IFY0TDJfUElYX0ZNVF9OVjEyTSwKKwkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAorCS5udW1fcGxhbmVzID0gMiwKKwkucGxhbmUgPSB7CisJCXsgLndpZHRoID0gMSwgLmhlaWdodCA9IDEsIC5zaXplID0gMSB9LAorCQl7IC53aWR0aCA9IDIsIC5oZWlnaHQgPSAyLCAuc2l6ZSA9IDIgfSwKKwl9LAorCS5udW1fc3ViZnJhbWVzID0gMiwKKwkucGxhbmUyc3ViZnJhbWUgPSB7MCwgMX0sCisJLmNvb2tpZSA9IFZQX01PREVfTlYxMiB8IFZQX01PREVfTUVNX0xJTkVBUiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbXhyX2Zvcm1hdCBteHJfZm10X252MTJtdCA9IHsKKwkubmFtZSA9ICJOVjEyIHRpbGVkIChtcGxhbmUpIiwKKwkuZm91cmNjID0gVjRMMl9QSVhfRk1UX05WMTJNVCwKKwkuY29sb3JzcGFjZSA9IFY0TDJfQ09MT1JTUEFDRV9KUEVHLAorCS5udW1fcGxhbmVzID0gMiwKKwkucGxhbmUgPSB7CisJCXsgLndpZHRoID0gMTI4LCAuaGVpZ2h0ID0gMzIsIC5zaXplID0gNDA5NiB9LAorCQl7IC53aWR0aCA9IDEyOCwgLmhlaWdodCA9IDMyLCAuc2l6ZSA9IDIwNDggfSwKKwl9LAorCS5udW1fc3ViZnJhbWVzID0gMiwKKwkucGxhbmUyc3ViZnJhbWUgPSB7MCwgMX0sCisJLmNvb2tpZSA9IFZQX01PREVfTlYxMiB8IFZQX01PREVfTUVNX1RJTEVELAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBteHJfZm9ybWF0ICpteHJfdmlkZW9fZm9ybWF0W10gPSB7CisJJm14cl9mbXRfbnYxMiwKKwkmbXhyX2ZtdF9udjIxLAorCSZteHJfZm10X252MTJtLAorCSZteHJfZm10X252MTJtdCwKK307CisKKy8qIEFVWElMSUFSWSBDQUxMQkFDS1MgKi8KKworc3RhdGljIHZvaWQgbXhyX3ZwX2xheWVyX3JlbGVhc2Uoc3RydWN0IG14cl9sYXllciAqbGF5ZXIpCit7CisJbXhyX2Jhc2VfbGF5ZXJfdW5yZWdpc3RlcihsYXllcik7CisJbXhyX2Jhc2VfbGF5ZXJfcmVsZWFzZShsYXllcik7Cit9CisKK3N0YXRpYyB2b2lkIG14cl92cF9idWZmZXJfc2V0KHN0cnVjdCBteHJfbGF5ZXIgKmxheWVyLAorCXN0cnVjdCBteHJfYnVmZmVyICpidWYpCit7CisJZG1hX2FkZHJfdCBsdW1hX2FkZHJbMl0gPSB7MCwgMH07CisJZG1hX2FkZHJfdCBjaHJvbWFfYWRkclsyXSA9IHswLCAwfTsKKworCWlmIChidWYgPT0gTlVMTCkgeworCQlteHJfcmVnX3ZwX2J1ZmZlcihsYXllci0+bWRldiwgbHVtYV9hZGRyLCBjaHJvbWFfYWRkcik7CisJCXJldHVybjsKKwl9CisJbHVtYV9hZGRyWzBdID0gdmIyX2RtYV9jb250aWdfcGxhbmVfcGFkZHIoJmJ1Zi0+dmIsIDApOworCWlmIChsYXllci0+Zm10LT5udW1fc3ViZnJhbWVzID09IDIpIHsKKwkJY2hyb21hX2FkZHJbMF0gPSB2YjJfZG1hX2NvbnRpZ19wbGFuZV9wYWRkcigmYnVmLT52YiwgMSk7CisJfSBlbHNlIHsKKwkJLyogRklYTUU6IG14cl9nZXRfcGxhbmVfc2l6ZSBjb21wdXRlIGludGVnZXIgZGl2aXNpb24sCisJCSAqIHdoaWNoIGlzIHNsb3cgYW5kIHNob3VsZCBub3QgYmUgcGVyZm9ybWVkIGluIGludGVycnVwdCAqLworCQljaHJvbWFfYWRkclswXSA9IGx1bWFfYWRkclswXSArIG14cl9nZXRfcGxhbmVfc2l6ZSgKKwkJCSZsYXllci0+Zm10LT5wbGFuZVswXSwgbGF5ZXItPmdlby5zcmMuZnVsbF93aWR0aCwKKwkJCWxheWVyLT5nZW8uc3JjLmZ1bGxfaGVpZ2h0KTsKKwl9CisJaWYgKGxheWVyLT5mbXQtPmNvb2tpZSAmIFZQX01PREVfTUVNX1RJTEVEKSB7CisJCWx1bWFfYWRkclsxXSA9IGx1bWFfYWRkclswXSArIDB4NDA7CisJCWNocm9tYV9hZGRyWzFdID0gY2hyb21hX2FkZHJbMF0gKyAweDQwOworCX0gZWxzZSB7CisJCWx1bWFfYWRkclsxXSA9IGx1bWFfYWRkclswXSArIGxheWVyLT5nZW8uc3JjLmZ1bGxfd2lkdGg7CisJCWNocm9tYV9hZGRyWzFdID0gY2hyb21hX2FkZHJbMF07CisJfQorCW14cl9yZWdfdnBfYnVmZmVyKGxheWVyLT5tZGV2LCBsdW1hX2FkZHIsIGNocm9tYV9hZGRyKTsKK30KKworc3RhdGljIHZvaWQgbXhyX3ZwX3N0cmVhbV9zZXQoc3RydWN0IG14cl9sYXllciAqbGF5ZXIsIGludCBlbikKK3sKKwlteHJfcmVnX3ZwX2xheWVyX3N0cmVhbShsYXllci0+bWRldiwgZW4pOworfQorCitzdGF0aWMgdm9pZCBteHJfdnBfZm9ybWF0X3NldChzdHJ1Y3QgbXhyX2xheWVyICpsYXllcikKK3sKKwlteHJfcmVnX3ZwX2Zvcm1hdChsYXllci0+bWRldiwgbGF5ZXItPmZtdCwgJmxheWVyLT5nZW8pOworfQorCitzdGF0aWMgdm9pZCBteHJfdnBfZml4X2dlb21ldHJ5KHN0cnVjdCBteHJfbGF5ZXIgKmxheWVyKQoreworCXN0cnVjdCBteHJfZ2VvbWV0cnkgKmdlbyA9ICZsYXllci0+Z2VvOworCisJLyogYWxpZ24gaG9yaXpvbnRhbCBzaXplIHRvIDggcGl4ZWxzICovCisJZ2VvLT5zcmMuZnVsbF93aWR0aCA9IEFMSUdOKGdlby0+c3JjLmZ1bGxfd2lkdGgsIDgpOworCS8qIGxpbWl0IHRvIGJvdW5kYXJ5IHNpemUgKi8KKwlnZW8tPnNyYy5mdWxsX3dpZHRoID0gY2xhbXBfdmFsKGdlby0+c3JjLmZ1bGxfd2lkdGgsIDgsIDgxOTIpOworCWdlby0+c3JjLmZ1bGxfaGVpZ2h0ID0gY2xhbXBfdmFsKGdlby0+c3JjLmZ1bGxfaGVpZ2h0LCAxLCA4MTkyKTsKKwlnZW8tPnNyYy53aWR0aCA9IGNsYW1wX3ZhbChnZW8tPnNyYy53aWR0aCwgMzIsIGdlby0+c3JjLmZ1bGxfd2lkdGgpOworCWdlby0+c3JjLndpZHRoID0gbWluKGdlby0+c3JjLndpZHRoLCAyMDQ3VSk7CisJZ2VvLT5zcmMuaGVpZ2h0ID0gY2xhbXBfdmFsKGdlby0+c3JjLmhlaWdodCwgNCwgZ2VvLT5zcmMuZnVsbF9oZWlnaHQpOworCWdlby0+c3JjLmhlaWdodCA9IG1pbihnZW8tPnNyYy5oZWlnaHQsIDIwNDdVKTsKKworCS8qIHNldHRpbmcgc2l6ZSBvZiBvdXRwdXQgd2luZG93ICovCisJZ2VvLT5kc3Qud2lkdGggPSBjbGFtcF92YWwoZ2VvLT5kc3Qud2lkdGgsIDgsIGdlby0+ZHN0LmZ1bGxfd2lkdGgpOworCWdlby0+ZHN0LmhlaWdodCA9IGNsYW1wX3ZhbChnZW8tPmRzdC5oZWlnaHQsIDEsIGdlby0+ZHN0LmZ1bGxfaGVpZ2h0KTsKKworCS8qIGVuc3VyZSB0aGF0IHNjYWxpbmcgaXMgaW4gcmFuZ2UgMS80eCB0byAxNnggKi8KKwlpZiAoZ2VvLT5zcmMud2lkdGggPj0gNCAqIGdlby0+ZHN0LndpZHRoKQorCQlnZW8tPnNyYy53aWR0aCA9IDQgKiBnZW8tPmRzdC53aWR0aDsKKwlpZiAoZ2VvLT5kc3Qud2lkdGggPj0gMTYgKiBnZW8tPnNyYy53aWR0aCkKKwkJZ2VvLT5kc3Qud2lkdGggPSAxNiAqIGdlby0+c3JjLndpZHRoOworCWlmIChnZW8tPnNyYy5oZWlnaHQgPj0gNCAqIGdlby0+ZHN0LmhlaWdodCkKKwkJZ2VvLT5zcmMuaGVpZ2h0ID0gNCAqIGdlby0+ZHN0LmhlaWdodDsKKwlpZiAoZ2VvLT5kc3QuaGVpZ2h0ID49IDE2ICogZ2VvLT5zcmMuaGVpZ2h0KQorCQlnZW8tPmRzdC5oZWlnaHQgPSAxNiAqIGdlby0+c3JjLmhlaWdodDsKKworCS8qIHNldHRpbmcgc2NhbGluZyByYXRpbyAqLworCWdlby0+eF9yYXRpbyA9IChnZW8tPnNyYy53aWR0aCA8PCAxNikgLyBnZW8tPmRzdC53aWR0aDsKKwlnZW8tPnlfcmF0aW8gPSAoZ2VvLT5zcmMuaGVpZ2h0IDw8IDE2KSAvIGdlby0+ZHN0LmhlaWdodDsKKworCS8qIGFkanVzdCBvZmZzZXRzICovCisJZ2VvLT5zcmMueF9vZmZzZXQgPSBtaW4oZ2VvLT5zcmMueF9vZmZzZXQsCisJCWdlby0+c3JjLmZ1bGxfd2lkdGggLSBnZW8tPnNyYy53aWR0aCk7CisJZ2VvLT5zcmMueV9vZmZzZXQgPSBtaW4oZ2VvLT5zcmMueV9vZmZzZXQsCisJCWdlby0+c3JjLmZ1bGxfaGVpZ2h0IC0gZ2VvLT5zcmMuaGVpZ2h0KTsKKwlnZW8tPmRzdC54X29mZnNldCA9IG1pbihnZW8tPmRzdC54X29mZnNldCwKKwkJZ2VvLT5kc3QuZnVsbF93aWR0aCAtIGdlby0+ZHN0LndpZHRoKTsKKwlnZW8tPmRzdC55X29mZnNldCA9IG1pbihnZW8tPmRzdC55X29mZnNldCwKKwkJZ2VvLT5kc3QuZnVsbF9oZWlnaHQgLSBnZW8tPmRzdC5oZWlnaHQpOworfQorCisvKiBQVUJMSUMgQVBJICovCisKK3N0cnVjdCBteHJfbGF5ZXIgKm14cl92cF9sYXllcl9jcmVhdGUoc3RydWN0IG14cl9kZXZpY2UgKm1kZXYsIGludCBpZHgpCit7CisJc3RydWN0IG14cl9sYXllciAqbGF5ZXI7CisJaW50IHJldDsKKwlzdHJ1Y3QgbXhyX2xheWVyX29wcyBvcHMgPSB7CisJCS5yZWxlYXNlID0gbXhyX3ZwX2xheWVyX3JlbGVhc2UsCisJCS5idWZmZXJfc2V0ID0gbXhyX3ZwX2J1ZmZlcl9zZXQsCisJCS5zdHJlYW1fc2V0ID0gbXhyX3ZwX3N0cmVhbV9zZXQsCisJCS5mb3JtYXRfc2V0ID0gbXhyX3ZwX2Zvcm1hdF9zZXQsCisJCS5maXhfZ2VvbWV0cnkgPSBteHJfdnBfZml4X2dlb21ldHJ5LAorCX07CisJY2hhciBuYW1lWzMyXTsKKworCXNwcmludGYobmFtZSwgInZpZGVvJWQiLCBpZHgpOworCisJbGF5ZXIgPSBteHJfYmFzZV9sYXllcl9jcmVhdGUobWRldiwgaWR4LCBuYW1lLCAmb3BzKTsKKwlpZiAobGF5ZXIgPT0gTlVMTCkgeworCQlteHJfZXJyKG1kZXYsICJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBsYXllciglZCkgYmFzZVxuIiwgaWR4KTsKKwkJZ290byBmYWlsOworCX0KKworCWxheWVyLT5mbXRfYXJyYXkgPSBteHJfdmlkZW9fZm9ybWF0OworCWxheWVyLT5mbXRfYXJyYXlfc2l6ZSA9IEFSUkFZX1NJWkUobXhyX3ZpZGVvX2Zvcm1hdCk7CisKKwlyZXQgPSBteHJfYmFzZV9sYXllcl9yZWdpc3RlcihsYXllcik7CisJaWYgKHJldCkKKwkJZ290byBmYWlsX2xheWVyOworCisJcmV0dXJuIGxheWVyOworCitmYWlsX2xheWVyOgorCW14cl9iYXNlX2xheWVyX3JlbGVhc2UobGF5ZXIpOworCitmYWlsOgorCXJldHVybiBOVUxMOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9yZWdzLWhkbWkuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L3JlZ3MtaGRtaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjOTNhZDYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9yZWdzLWhkbWkuaApAQCAtMCwwICsxLDE0MSBAQAorLyogbGludXgvYXJjaC9hcm0vbWFjaC1leHlub3M0L2luY2x1ZGUvbWFjaC9yZWdzLWhkbWkuaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiBodHRwOi8vd3d3LnNhbXN1bmcuY29tLworICoKKyAqIEhETUkgcmVnaXN0ZXIgaGVhZGVyIGZpbGUgZm9yIFNhbXN1bmcgVFZPVVQgZHJpdmVyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpZm5kZWYgU0FNU1VOR19SRUdTX0hETUlfSAorI2RlZmluZSBTQU1TVU5HX1JFR1NfSERNSV9ICisKKy8qCisgKiBSZWdpc3RlciBwYXJ0CisqLworCisjZGVmaW5lIEhETUlfQ1RSTF9CQVNFKHgpCQkoKHgpICsgMHgwMDAwMDAwMCkKKyNkZWZpbmUgSERNSV9DT1JFX0JBU0UoeCkJCSgoeCkgKyAweDAwMDEwMDAwKQorI2RlZmluZSBIRE1JX1RHX0JBU0UoeCkJCQkoKHgpICsgMHgwMDA1MDAwMCkKKworLyogQ29udHJvbCByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSERNSV9JTlRDX0NPTgkJCUhETUlfQ1RSTF9CQVNFKDB4MDAwMCkKKyNkZWZpbmUgSERNSV9JTlRDX0ZMQUcJCQlIRE1JX0NUUkxfQkFTRSgweDAwMDQpCisjZGVmaW5lIEhETUlfSFBEX1NUQVRVUwkJCUhETUlfQ1RSTF9CQVNFKDB4MDAwQykKKyNkZWZpbmUgSERNSV9QSFlfUlNUT1VUCQkJSERNSV9DVFJMX0JBU0UoMHgwMDE0KQorI2RlZmluZSBIRE1JX1BIWV9WUExMCQkJSERNSV9DVFJMX0JBU0UoMHgwMDE4KQorI2RlZmluZSBIRE1JX1BIWV9DTVUJCQlIRE1JX0NUUkxfQkFTRSgweDAwMUMpCisjZGVmaW5lIEhETUlfQ09SRV9SU1RPVVQJCUhETUlfQ1RSTF9CQVNFKDB4MDAyMCkKKworLyogQ29yZSByZWdpc3RlcnMgKi8KKyNkZWZpbmUgSERNSV9DT05fMAkJCUhETUlfQ09SRV9CQVNFKDB4MDAwMCkKKyNkZWZpbmUgSERNSV9DT05fMQkJCUhETUlfQ09SRV9CQVNFKDB4MDAwNCkKKyNkZWZpbmUgSERNSV9DT05fMgkJCUhETUlfQ09SRV9CQVNFKDB4MDAwOCkKKyNkZWZpbmUgSERNSV9TWVNfU1RBVFVTCQkJSERNSV9DT1JFX0JBU0UoMHgwMDEwKQorI2RlZmluZSBIRE1JX1BIWV9TVEFUVVMJCQlIRE1JX0NPUkVfQkFTRSgweDAwMTQpCisjZGVmaW5lIEhETUlfU1RBVFVTX0VOCQkJSERNSV9DT1JFX0JBU0UoMHgwMDIwKQorI2RlZmluZSBIRE1JX0hQRAkJCUhETUlfQ09SRV9CQVNFKDB4MDAzMCkKKyNkZWZpbmUgSERNSV9NT0RFX1NFTAkJCUhETUlfQ09SRV9CQVNFKDB4MDA0MCkKKyNkZWZpbmUgSERNSV9CTFVFX1NDUkVFTl8wCQlIRE1JX0NPUkVfQkFTRSgweDAwNTApCisjZGVmaW5lIEhETUlfQkxVRV9TQ1JFRU5fMQkJSERNSV9DT1JFX0JBU0UoMHgwMDU0KQorI2RlZmluZSBIRE1JX0JMVUVfU0NSRUVOXzIJCUhETUlfQ09SRV9CQVNFKDB4MDA1OCkKKyNkZWZpbmUgSERNSV9IX0JMQU5LXzAJCQlIRE1JX0NPUkVfQkFTRSgweDAwQTApCisjZGVmaW5lIEhETUlfSF9CTEFOS18xCQkJSERNSV9DT1JFX0JBU0UoMHgwMEE0KQorI2RlZmluZSBIRE1JX1ZfQkxBTktfMAkJCUhETUlfQ09SRV9CQVNFKDB4MDBCMCkKKyNkZWZpbmUgSERNSV9WX0JMQU5LXzEJCQlIRE1JX0NPUkVfQkFTRSgweDAwQjQpCisjZGVmaW5lIEhETUlfVl9CTEFOS18yCQkJSERNSV9DT1JFX0JBU0UoMHgwMEI4KQorI2RlZmluZSBIRE1JX0hfVl9MSU5FXzAJCQlIRE1JX0NPUkVfQkFTRSgweDAwQzApCisjZGVmaW5lIEhETUlfSF9WX0xJTkVfMQkJCUhETUlfQ09SRV9CQVNFKDB4MDBDNCkKKyNkZWZpbmUgSERNSV9IX1ZfTElORV8yCQkJSERNSV9DT1JFX0JBU0UoMHgwMEM4KQorI2RlZmluZSBIRE1JX1ZTWU5DX1BPTAkJCUhETUlfQ09SRV9CQVNFKDB4MDBFNCkKKyNkZWZpbmUgSERNSV9JTlRfUFJPX01PREUJCUhETUlfQ09SRV9CQVNFKDB4MDBFOCkKKyNkZWZpbmUgSERNSV9WX0JMQU5LX0ZfMAkJSERNSV9DT1JFX0JBU0UoMHgwMTEwKQorI2RlZmluZSBIRE1JX1ZfQkxBTktfRl8xCQlIRE1JX0NPUkVfQkFTRSgweDAxMTQpCisjZGVmaW5lIEhETUlfVl9CTEFOS19GXzIJCUhETUlfQ09SRV9CQVNFKDB4MDExOCkKKyNkZWZpbmUgSERNSV9IX1NZTkNfR0VOXzAJCUhETUlfQ09SRV9CQVNFKDB4MDEyMCkKKyNkZWZpbmUgSERNSV9IX1NZTkNfR0VOXzEJCUhETUlfQ09SRV9CQVNFKDB4MDEyNCkKKyNkZWZpbmUgSERNSV9IX1NZTkNfR0VOXzIJCUhETUlfQ09SRV9CQVNFKDB4MDEyOCkKKyNkZWZpbmUgSERNSV9WX1NZTkNfR0VOXzFfMAkJSERNSV9DT1JFX0JBU0UoMHgwMTMwKQorI2RlZmluZSBIRE1JX1ZfU1lOQ19HRU5fMV8xCQlIRE1JX0NPUkVfQkFTRSgweDAxMzQpCisjZGVmaW5lIEhETUlfVl9TWU5DX0dFTl8xXzIJCUhETUlfQ09SRV9CQVNFKDB4MDEzOCkKKyNkZWZpbmUgSERNSV9WX1NZTkNfR0VOXzJfMAkJSERNSV9DT1JFX0JBU0UoMHgwMTQwKQorI2RlZmluZSBIRE1JX1ZfU1lOQ19HRU5fMl8xCQlIRE1JX0NPUkVfQkFTRSgweDAxNDQpCisjZGVmaW5lIEhETUlfVl9TWU5DX0dFTl8yXzIJCUhETUlfQ09SRV9CQVNFKDB4MDE0OCkKKyNkZWZpbmUgSERNSV9WX1NZTkNfR0VOXzNfMAkJSERNSV9DT1JFX0JBU0UoMHgwMTUwKQorI2RlZmluZSBIRE1JX1ZfU1lOQ19HRU5fM18xCQlIRE1JX0NPUkVfQkFTRSgweDAxNTQpCisjZGVmaW5lIEhETUlfVl9TWU5DX0dFTl8zXzIJCUhETUlfQ09SRV9CQVNFKDB4MDE1OCkKKyNkZWZpbmUgSERNSV9BVklfQ09OCQkJSERNSV9DT1JFX0JBU0UoMHgwMzAwKQorI2RlZmluZSBIRE1JX0FWSV9CWVRFKG4pCQlIRE1JX0NPUkVfQkFTRSgweDAzMjAgKyA0ICogKG4pKQorI2RlZmluZQlIRE1JX0RDX0NPTlRST0wJCQlIRE1JX0NPUkVfQkFTRSgweDA1QzApCisjZGVmaW5lIEhETUlfVklERU9fUEFUVEVSTl9HRU4JCUhETUlfQ09SRV9CQVNFKDB4MDVDNCkKKyNkZWZpbmUgSERNSV9IUERfR0VOCQkJSERNSV9DT1JFX0JBU0UoMHgwNUM4KQorCisvKiBUaW1pbmcgZ2VuZXJhdG9yIHJlZ2lzdGVycyAqLworI2RlZmluZSBIRE1JX1RHX0NNRAkJCUhETUlfVEdfQkFTRSgweDAwMDApCisjZGVmaW5lIEhETUlfVEdfSF9GU1pfTAkJCUhETUlfVEdfQkFTRSgweDAwMTgpCisjZGVmaW5lIEhETUlfVEdfSF9GU1pfSAkJCUhETUlfVEdfQkFTRSgweDAwMUMpCisjZGVmaW5lIEhETUlfVEdfSEFDVF9TVF9MCQlIRE1JX1RHX0JBU0UoMHgwMDIwKQorI2RlZmluZSBIRE1JX1RHX0hBQ1RfU1RfSAkJSERNSV9UR19CQVNFKDB4MDAyNCkKKyNkZWZpbmUgSERNSV9UR19IQUNUX1NaX0wJCUhETUlfVEdfQkFTRSgweDAwMjgpCisjZGVmaW5lIEhETUlfVEdfSEFDVF9TWl9ICQlIRE1JX1RHX0JBU0UoMHgwMDJDKQorI2RlZmluZSBIRE1JX1RHX1ZfRlNaX0wJCQlIRE1JX1RHX0JBU0UoMHgwMDMwKQorI2RlZmluZSBIRE1JX1RHX1ZfRlNaX0gJCQlIRE1JX1RHX0JBU0UoMHgwMDM0KQorI2RlZmluZSBIRE1JX1RHX1ZTWU5DX0wJCQlIRE1JX1RHX0JBU0UoMHgwMDM4KQorI2RlZmluZSBIRE1JX1RHX1ZTWU5DX0gJCQlIRE1JX1RHX0JBU0UoMHgwMDNDKQorI2RlZmluZSBIRE1JX1RHX1ZTWU5DMl9MCQlIRE1JX1RHX0JBU0UoMHgwMDQwKQorI2RlZmluZSBIRE1JX1RHX1ZTWU5DMl9ICQlIRE1JX1RHX0JBU0UoMHgwMDQ0KQorI2RlZmluZSBIRE1JX1RHX1ZBQ1RfU1RfTAkJSERNSV9UR19CQVNFKDB4MDA0OCkKKyNkZWZpbmUgSERNSV9UR19WQUNUX1NUX0gJCUhETUlfVEdfQkFTRSgweDAwNEMpCisjZGVmaW5lIEhETUlfVEdfVkFDVF9TWl9MCQlIRE1JX1RHX0JBU0UoMHgwMDUwKQorI2RlZmluZSBIRE1JX1RHX1ZBQ1RfU1pfSAkJSERNSV9UR19CQVNFKDB4MDA1NCkKKyNkZWZpbmUgSERNSV9UR19GSUVMRF9DSEdfTAkJSERNSV9UR19CQVNFKDB4MDA1OCkKKyNkZWZpbmUgSERNSV9UR19GSUVMRF9DSEdfSAkJSERNSV9UR19CQVNFKDB4MDA1QykKKyNkZWZpbmUgSERNSV9UR19WQUNUX1NUMl9MCQlIRE1JX1RHX0JBU0UoMHgwMDYwKQorI2RlZmluZSBIRE1JX1RHX1ZBQ1RfU1QyX0gJCUhETUlfVEdfQkFTRSgweDAwNjQpCisjZGVmaW5lIEhETUlfVEdfVlNZTkNfVE9QX0hETUlfTAlIRE1JX1RHX0JBU0UoMHgwMDc4KQorI2RlZmluZSBIRE1JX1RHX1ZTWU5DX1RPUF9IRE1JX0gJSERNSV9UR19CQVNFKDB4MDA3QykKKyNkZWZpbmUgSERNSV9UR19WU1lOQ19CT1RfSERNSV9MCUhETUlfVEdfQkFTRSgweDAwODApCisjZGVmaW5lIEhETUlfVEdfVlNZTkNfQk9UX0hETUlfSAlIRE1JX1RHX0JBU0UoMHgwMDg0KQorI2RlZmluZSBIRE1JX1RHX0ZJRUxEX1RPUF9IRE1JX0wJSERNSV9UR19CQVNFKDB4MDA4OCkKKyNkZWZpbmUgSERNSV9UR19GSUVMRF9UT1BfSERNSV9ICUhETUlfVEdfQkFTRSgweDAwOEMpCisjZGVmaW5lIEhETUlfVEdfRklFTERfQk9UX0hETUlfTAlIRE1JX1RHX0JBU0UoMHgwMDkwKQorI2RlZmluZSBIRE1JX1RHX0ZJRUxEX0JPVF9IRE1JX0gJSERNSV9UR19CQVNFKDB4MDA5NCkKKworLyoKKyAqIEJpdCBkZWZpbml0aW9uIHBhcnQKKyAqLworCisvKiBIRE1JX0lOVENfQ09OICovCisjZGVmaW5lIEhETUlfSU5UQ19FTl9HTE9CQUwJCSgxIDw8IDYpCisjZGVmaW5lIEhETUlfSU5UQ19FTl9IUERfUExVRwkJKDEgPDwgMykKKyNkZWZpbmUgSERNSV9JTlRDX0VOX0hQRF9VTlBMVUcJCSgxIDw8IDIpCisKKy8qIEhETUlfSU5UQ19GTEFHICovCisjZGVmaW5lIEhETUlfSU5UQ19GTEFHX0hQRF9QTFVHCQkoMSA8PCAzKQorI2RlZmluZSBIRE1JX0lOVENfRkxBR19IUERfVU5QTFVHCSgxIDw8IDIpCisKKy8qIEhETUlfUEhZX1JTVE9VVCAqLworI2RlZmluZSBIRE1JX1BIWV9TV19SU1RPVVQJCSgxIDw8IDApCisKKy8qIEhETUlfQ09SRV9SU1RPVVQgKi8KKyNkZWZpbmUgSERNSV9DT1JFX1NXX1JTVE9VVAkJKDEgPDwgMCkKKworLyogSERNSV9DT05fMCAqLworI2RlZmluZSBIRE1JX0JMVUVfU0NSX0VOCQkoMSA8PCA1KQorI2RlZmluZSBIRE1JX0VOCQkJCSgxIDw8IDApCisKKy8qIEhETUlfUEhZX1NUQVRVUyAqLworI2RlZmluZSBIRE1JX1BIWV9TVEFUVVNfUkVBRFkJCSgxIDw8IDApCisKKy8qIEhETUlfTU9ERV9TRUwgKi8KKyNkZWZpbmUgSERNSV9NT0RFX0hETUlfRU4JCSgxIDw8IDEpCisjZGVmaW5lIEhETUlfTU9ERV9EVklfRU4JCSgxIDw8IDApCisjZGVmaW5lIEhETUlfTU9ERV9NQVNLCQkJKDMgPDwgMCkKKworLyogSERNSV9UR19DTUQgKi8KKyNkZWZpbmUgSERNSV9UR19FTgkJCSgxIDw8IDApCisKKyNlbmRpZiAvKiBTQU1TVU5HX1JFR1NfSERNSV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9yZWdzLW1peGVyLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9yZWdzLW1peGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M4NDQyNgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L3JlZ3MtbWl4ZXIuaApAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKiBodHRwOi8vd3d3LnNhbXN1bmcuY29tLworICoKKyAqIE1peGVyIHJlZ2lzdGVyIGhlYWRlciBmaWxlIGZvciBTYW1zdW5nIE1peGVyIGRyaXZlcgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqLworI2lmbmRlZiBTQU1TVU5HX1JFR1NfTUlYRVJfSAorI2RlZmluZSBTQU1TVU5HX1JFR1NfTUlYRVJfSAorCisvKgorICogUmVnaXN0ZXIgcGFydAorICovCisjZGVmaW5lIE1YUl9TVEFUVVMJCQkweDAwMDAKKyNkZWZpbmUgTVhSX0NGRwkJCQkweDAwMDQKKyNkZWZpbmUgTVhSX0lOVF9FTgkJCTB4MDAwOAorI2RlZmluZSBNWFJfSU5UX1NUQVRVUwkJCTB4MDAwQworI2RlZmluZSBNWFJfTEFZRVJfQ0ZHCQkJMHgwMDEwCisjZGVmaW5lIE1YUl9WSURFT19DRkcJCQkweDAwMTQKKyNkZWZpbmUgTVhSX0dSQVBISUMwX0NGRwkJMHgwMDIwCisjZGVmaW5lIE1YUl9HUkFQSElDMF9CQVNFCQkweDAwMjQKKyNkZWZpbmUgTVhSX0dSQVBISUMwX1NQQU4JCTB4MDAyOAorI2RlZmluZSBNWFJfR1JBUEhJQzBfU1hZCQkweDAwMkMKKyNkZWZpbmUgTVhSX0dSQVBISUMwX1dICQkJMHgwMDMwCisjZGVmaW5lIE1YUl9HUkFQSElDMF9EWFkJCTB4MDAzNAorI2RlZmluZSBNWFJfR1JBUEhJQzBfQkxBTksJCTB4MDAzOAorI2RlZmluZSBNWFJfR1JBUEhJQzFfQ0ZHCQkweDAwNDAKKyNkZWZpbmUgTVhSX0dSQVBISUMxX0JBU0UJCTB4MDA0NAorI2RlZmluZSBNWFJfR1JBUEhJQzFfU1BBTgkJMHgwMDQ4CisjZGVmaW5lIE1YUl9HUkFQSElDMV9TWFkJCTB4MDA0QworI2RlZmluZSBNWFJfR1JBUEhJQzFfV0gJCQkweDAwNTAKKyNkZWZpbmUgTVhSX0dSQVBISUMxX0RYWQkJMHgwMDU0CisjZGVmaW5lIE1YUl9HUkFQSElDMV9CTEFOSwkJMHgwMDU4CisjZGVmaW5lIE1YUl9CR19DRkcJCQkweDAwNjAKKyNkZWZpbmUgTVhSX0JHX0NPTE9SMAkJCTB4MDA2NAorI2RlZmluZSBNWFJfQkdfQ09MT1IxCQkJMHgwMDY4CisjZGVmaW5lIE1YUl9CR19DT0xPUjIJCQkweDAwNkMKKworLyogZm9yIHBhcmFtZXRyaXplZCBhY2Nlc3MgdG8gbGF5ZXIgcmVnaXN0ZXJzICovCisjZGVmaW5lIE1YUl9HUkFQSElDX0NGRyhpKQkJKDB4MDAyMCArIChpKSAqIDB4MjApCisjZGVmaW5lIE1YUl9HUkFQSElDX0JBU0UoaSkJCSgweDAwMjQgKyAoaSkgKiAweDIwKQorI2RlZmluZSBNWFJfR1JBUEhJQ19TUEFOKGkpCQkoMHgwMDI4ICsgKGkpICogMHgyMCkKKyNkZWZpbmUgTVhSX0dSQVBISUNfU1hZKGkpCQkoMHgwMDJDICsgKGkpICogMHgyMCkKKyNkZWZpbmUgTVhSX0dSQVBISUNfV0goaSkJCSgweDAwMzAgKyAoaSkgKiAweDIwKQorI2RlZmluZSBNWFJfR1JBUEhJQ19EWFkoaSkJCSgweDAwMzQgKyAoaSkgKiAweDIwKQorCisvKgorICogQml0IGRlZmluaXRpb24gcGFydAorICovCisKKy8qIGdlbmVyYXRlcyBtYXNrIGZvciByYW5nZSBvZiBiaXRzICovCisjZGVmaW5lIE1YUl9NQVNLKGhpZ2hfYml0LCBsb3dfYml0KSBcCisJKCgoMiA8PCAoKGhpZ2hfYml0KSAtIChsb3dfYml0KSkpIC0gMSkgPDwgKGxvd19iaXQpKQorCisjZGVmaW5lIE1YUl9NQVNLX1ZBTCh2YWwsIGhpZ2hfYml0LCBsb3dfYml0KSBcCisJKCgodmFsKSA8PCAobG93X2JpdCkpICYgTVhSX01BU0soaGlnaF9iaXQsIGxvd19iaXQpKQorCisvKiBiaXRzIGZvciBNWFJfU1RBVFVTICovCisjZGVmaW5lIE1YUl9TVEFUVVNfMTZfQlVSU1QJCSgxIDw8IDcpCisjZGVmaW5lIE1YUl9TVEFUVVNfQlVSU1RfTUFTSwkJKDEgPDwgNykKKyNkZWZpbmUgTVhSX1NUQVRVU19TWU5DX0VOQUJMRQkJKDEgPDwgMikKKyNkZWZpbmUgTVhSX1NUQVRVU19SRUdfUlVOCQkoMSA8PCAwKQorCisvKiBiaXRzIGZvciBNWFJfQ0ZHICovCisjZGVmaW5lIE1YUl9DRkdfT1VUX1lVVjQ0NAkJKDAgPDwgOCkKKyNkZWZpbmUgTVhSX0NGR19PVVRfUkdCODg4CQkoMSA8PCA4KQorI2RlZmluZSBNWFJfQ0ZHX0RTVF9TRE8JCQkoMCA8PCA3KQorI2RlZmluZSBNWFJfQ0ZHX0RTVF9IRE1JCQkoMSA8PCA3KQorI2RlZmluZSBNWFJfQ0ZHX0RTVF9NQVNLCQkoMSA8PCA3KQorI2RlZmluZSBNWFJfQ0ZHX1NDQU5fSERfNzIwCQkoMCA8PCA2KQorI2RlZmluZSBNWFJfQ0ZHX1NDQU5fSERfMTA4MAkJKDEgPDwgNikKKyNkZWZpbmUgTVhSX0NGR19HUlAxX0VOQUJMRQkJKDEgPDwgNSkKKyNkZWZpbmUgTVhSX0NGR19HUlAwX0VOQUJMRQkJKDEgPDwgNCkKKyNkZWZpbmUgTVhSX0NGR19WUF9FTkFCTEUJCSgxIDw8IDMpCisjZGVmaW5lIE1YUl9DRkdfU0NBTl9JTlRFUkxBQ0UJCSgwIDw8IDIpCisjZGVmaW5lIE1YUl9DRkdfU0NBTl9QUk9HUkFTU0lWRQkoMSA8PCAyKQorI2RlZmluZSBNWFJfQ0ZHX1NDQU5fTlRTQwkJKDAgPDwgMSkKKyNkZWZpbmUgTVhSX0NGR19TQ0FOX1BBTAkJKDEgPDwgMSkKKyNkZWZpbmUgTVhSX0NGR19TQ0FOX1NECQkJKDAgPDwgMCkKKyNkZWZpbmUgTVhSX0NGR19TQ0FOX0hECQkJKDEgPDwgMCkKKyNkZWZpbmUgTVhSX0NGR19TQ0FOX01BU0sJCTB4NDcKKworLyogYml0cyBmb3IgTVhSX0dSQVBISUNuX0NGRyAqLworI2RlZmluZSBNWFJfR1JQX0NGR19DT0xPUl9LRVlfRElTQUJMRQkoMSA8PCAyMSkKKyNkZWZpbmUgTVhSX0dSUF9DRkdfQkxFTkRfUFJFX01VTAkoMSA8PCAyMCkKKyNkZWZpbmUgTVhSX0dSUF9DRkdfRk9STUFUX1ZBTCh4KQlNWFJfTUFTS19WQUwoeCwgMTEsIDgpCisjZGVmaW5lIE1YUl9HUlBfQ0ZHX0ZPUk1BVF9NQVNLCQlNWFJfR1JQX0NGR19GT1JNQVRfVkFMKH4wKQorI2RlZmluZSBNWFJfR1JQX0NGR19BTFBIQV9WQUwoeCkJTVhSX01BU0tfVkFMKHgsIDcsIDApCisKKy8qIGJpdHMgZm9yIE1YUl9HUkFQSElDbl9XSCAqLworI2RlZmluZSBNWFJfR1JQX1dIX0hfU0NBTEUoeCkJCU1YUl9NQVNLX1ZBTCh4LCAyOCwgMjgpCisjZGVmaW5lIE1YUl9HUlBfV0hfVl9TQ0FMRSh4KQkJTVhSX01BU0tfVkFMKHgsIDEyLCAxMikKKyNkZWZpbmUgTVhSX0dSUF9XSF9XSURUSCh4KQkJTVhSX01BU0tfVkFMKHgsIDI2LCAxNikKKyNkZWZpbmUgTVhSX0dSUF9XSF9IRUlHSFQoeCkJCU1YUl9NQVNLX1ZBTCh4LCAxMCwgMCkKKworLyogYml0cyBmb3IgTVhSX0dSQVBISUNuX1NYWSAqLworI2RlZmluZSBNWFJfR1JQX1NYWV9TWCh4KQkJTVhSX01BU0tfVkFMKHgsIDI2LCAxNikKKyNkZWZpbmUgTVhSX0dSUF9TWFlfU1koeCkJCU1YUl9NQVNLX1ZBTCh4LCAxMCwgMCkKKworLyogYml0cyBmb3IgTVhSX0dSQVBISUNuX0RYWSAqLworI2RlZmluZSBNWFJfR1JQX0RYWV9EWCh4KQkJTVhSX01BU0tfVkFMKHgsIDI2LCAxNikKKyNkZWZpbmUgTVhSX0dSUF9EWFlfRFkoeCkJCU1YUl9NQVNLX1ZBTCh4LCAxMCwgMCkKKworLyogYml0cyBmb3IgTVhSX0lOVF9FTiAqLworI2RlZmluZSBNWFJfSU5UX0VOX1ZTWU5DCQkoMSA8PCAxMSkKKyNkZWZpbmUgTVhSX0lOVF9FTl9BTEwJCQkoMHgwZiA8PCA4KQorCisvKiBiaXQgZm9yIE1YUl9JTlRfU1RBVFVTICovCisjZGVmaW5lIE1YUl9JTlRfQ0xFQVJfVlNZTkMJCSgxIDw8IDExKQorI2RlZmluZSBNWFJfSU5UX1NUQVRVU19WU1lOQwkJKDEgPDwgMCkKKworLyogYml0IGZvciBNWFJfTEFZRVJfQ0ZHICovCisjZGVmaW5lIE1YUl9MQVlFUl9DRkdfR1JQMV9WQUwoeCkJTVhSX01BU0tfVkFMKHgsIDExLCA4KQorI2RlZmluZSBNWFJfTEFZRVJfQ0ZHX0dSUDBfVkFMKHgpCU1YUl9NQVNLX1ZBTCh4LCA3LCA0KQorI2RlZmluZSBNWFJfTEFZRVJfQ0ZHX1ZQX1ZBTCh4KQkJTVhSX01BU0tfVkFMKHgsIDMsIDApCisKKyNlbmRpZiAvKiBTQU1TVU5HX1JFR1NfTUlYRVJfSCAqLworCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9yZWdzLXNkby5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvcmVncy1zZG8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjdjMmI4YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L3JlZ3Mtc2RvLmgKQEAgLTAsMCArMSw2MyBAQAorLyogZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvcmVncy1zZG8uaAorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBTRE8gcmVnaXN0ZXIgZGVzY3JpcHRpb24gZmlsZQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2lmbmRlZiBTQU1TVU5HX1JFR1NfU0RPX0gKKyNkZWZpbmUgU0FNU1VOR19SRUdTX1NET19ICisKKy8qCisgKiBSZWdpc3RlciBwYXJ0CisgKi8KKworI2RlZmluZSBTRE9fQ0xLQ09OCQkJMHgwMDAwCisjZGVmaW5lIFNET19DT05GSUcJCQkweDAwMDgKKyNkZWZpbmUgU0RPX1ZCSQkJCQkweDAwMTQKKyNkZWZpbmUgU0RPX0RBQwkJCQkweDAwM0MKKyNkZWZpbmUgU0RPX0NDQ09OCQkJMHgwMTgwCisjZGVmaW5lIFNET19JUlEJCQkJMHgwMjgwCisjZGVmaW5lIFNET19JUlFNQVNLCQkJMHgwMjg0CisjZGVmaW5lIFNET19WRVJTSU9OCQkJMHgwM0Q4CisKKy8qCisgKiBCaXQgZGVmaW5pdGlvbiBwYXJ0CisgKi8KKworLyogU0RPIENsb2NrIENvbnRyb2wgUmVnaXN0ZXIgKFNET19DTEtDT04pICovCisjZGVmaW5lIFNET19UVk9VVF9TV19SRVNFVAkJKDEgPDwgNCkKKyNkZWZpbmUgU0RPX1RWT1VUX0NMT0NLX1JFQURZCQkoMSA8PCAxKQorI2RlZmluZSBTRE9fVFZPVVRfQ0xPQ0tfT04JCSgxIDw8IDApCisKKy8qIFNETyBWaWRlbyBTdGFuZGFyZCBDb25maWd1cmF0aW9uIFJlZ2lzdGVyIChTRE9fQ09ORklHKSAqLworI2RlZmluZSBTRE9fUFJPR1JFU1NJVkUJCQkoMSA8PCA0KQorI2RlZmluZSBTRE9fTlRTQ19NCQkJMAorI2RlZmluZSBTRE9fUEFMX00JCQkxCisjZGVmaW5lIFNET19QQUxfQkdISUQJCQkyCisjZGVmaW5lIFNET19QQUxfTgkJCTMKKyNkZWZpbmUgU0RPX1BBTF9OQwkJCTQKKyNkZWZpbmUgU0RPX05UU0NfNDQzCQkJOAorI2RlZmluZSBTRE9fUEFMXzYwCQkJOQorI2RlZmluZSBTRE9fU1RBTkRBUkRfTUFTSwkJMHhmCisKKy8qIFNETyBWQkkgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoU0RPX1ZCSSkgKi8KKyNkZWZpbmUgU0RPX0NWQlNfV1NTX0lOUwkJKDEgPDwgMTQpCisjZGVmaW5lIFNET19DVkJTX0NMT1NFRF9DQVBUSU9OX01BU0sJKDMgPDwgMTIpCisKKy8qIFNETyBEQUMgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoU0RPX0RBQykgKi8KKyNkZWZpbmUgU0RPX1BPV0VSX09OX0RBQwkJKDEgPDwgMCkKKworLyogU0RPIENvbG9yIENvbXBlbnNhdGlvbiBPbi9PZmYgQ29udHJvbCAoU0RPX0NDQ09OKSAqLworI2RlZmluZSBTRE9fQ09NUEVOU0FUSU9OX0JIU19BREpfT0ZGCSgxIDw8IDQpCisjZGVmaW5lIFNET19DT01QRU5TQVRJT05fQ1ZCU19DT01QX09GRgkoMSA8PCAwKQorCisvKiBTRE8gSW50ZXJydXB0IFJlcXVlc3QgUmVnaXN0ZXIgKFNET19JUlEpICovCisjZGVmaW5lIFNET19WU1lOQ19JUlFfUEVORAkJKDEgPDwgMCkKKworI2VuZGlmIC8qIFNBTVNVTkdfUkVHU19TRE9fSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvcmVncy12cC5oIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvcmVncy12cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNjM5ODQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9yZWdzLXZwLmgKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuCisgKgkJaHR0cDovL3d3dy5zYW1zdW5nLmNvbS8KKyAqCisgKiBWaWRlbyBwcm9jZXNzb3IgcmVnaXN0ZXIgaGVhZGVyIGZpbGUgZm9yIFNhbXN1bmcgTWl4ZXIgZHJpdmVyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworCisjaWZuZGVmIFNBTVNVTkdfUkVHU19WUF9ICisjZGVmaW5lIFNBTVNVTkdfUkVHU19WUF9ICisKKy8qCisgKiBSZWdpc3RlciBwYXJ0CisgKi8KKworI2RlZmluZSBWUF9FTkFCTEUJCQkweDAwMDAKKyNkZWZpbmUgVlBfU1JFU0VUCQkJMHgwMDA0CisjZGVmaW5lIFZQX1NIQURPV19VUERBVEUJCTB4MDAwOAorI2RlZmluZSBWUF9GSUVMRF9JRAkJCTB4MDAwQworI2RlZmluZSBWUF9NT0RFCQkJCTB4MDAxMAorI2RlZmluZSBWUF9JTUdfU0laRV9ZCQkJMHgwMDE0CisjZGVmaW5lIFZQX0lNR19TSVpFX0MJCQkweDAwMTgKKyNkZWZpbmUgVlBfUEVSX1JBVEVfQ1RSTAkJMHgwMDFDCisjZGVmaW5lIFZQX1RPUF9ZX1BUUgkJCTB4MDAyOAorI2RlZmluZSBWUF9CT1RfWV9QVFIJCQkweDAwMkMKKyNkZWZpbmUgVlBfVE9QX0NfUFRSCQkJMHgwMDMwCisjZGVmaW5lIFZQX0JPVF9DX1BUUgkJCTB4MDAzNAorI2RlZmluZSBWUF9FTkRJQU5fTU9ERQkJCTB4MDNDQworI2RlZmluZSBWUF9TUkNfSF9QT1NJVElPTgkJMHgwMDQ0CisjZGVmaW5lIFZQX1NSQ19WX1BPU0lUSU9OCQkweDAwNDgKKyNkZWZpbmUgVlBfU1JDX1dJRFRICQkJMHgwMDRDCisjZGVmaW5lIFZQX1NSQ19IRUlHSFQJCQkweDAwNTAKKyNkZWZpbmUgVlBfRFNUX0hfUE9TSVRJT04JCTB4MDA1NAorI2RlZmluZSBWUF9EU1RfVl9QT1NJVElPTgkJMHgwMDU4CisjZGVmaW5lIFZQX0RTVF9XSURUSAkJCTB4MDA1QworI2RlZmluZSBWUF9EU1RfSEVJR0hUCQkJMHgwMDYwCisjZGVmaW5lIFZQX0hfUkFUSU8JCQkweDAwNjQKKyNkZWZpbmUgVlBfVl9SQVRJTwkJCTB4MDA2OAorI2RlZmluZSBWUF9QT0xZOF9ZMF9MTAkJCTB4MDA2QworI2RlZmluZSBWUF9QT0xZNF9ZMF9MTAkJCTB4MDBFQworI2RlZmluZSBWUF9QT0xZNF9DMF9MTAkJCTB4MDEyQworCisvKgorICogQml0IGRlZmluaXRpb24gcGFydAorICovCisKKy8qIGdlbmVyYXRlcyBtYXNrIGZvciByYW5nZSBvZiBiaXRzICovCisKKyNkZWZpbmUgVlBfTUFTSyhoaWdoX2JpdCwgbG93X2JpdCkgXAorCSgoKDIgPDwgKChoaWdoX2JpdCkgLSAobG93X2JpdCkpKSAtIDEpIDw8IChsb3dfYml0KSkKKworI2RlZmluZSBWUF9NQVNLX1ZBTCh2YWwsIGhpZ2hfYml0LCBsb3dfYml0KSBcCisJKCgodmFsKSA8PCAobG93X2JpdCkpICYgVlBfTUFTSyhoaWdoX2JpdCwgbG93X2JpdCkpCisKKyAvKiBWUF9FTkFCTEUgKi8KKyNkZWZpbmUgVlBfRU5BQkxFX09OCQkJKDEgPDwgMCkKKworLyogVlBfU1JFU0VUICovCisjZGVmaW5lIFZQX1NSRVNFVF9QUk9DRVNTSU5HCQkoMSA8PCAwKQorCisvKiBWUF9TSEFET1dfVVBEQVRFICovCisjZGVmaW5lIFZQX1NIQURPV19VUERBVEVfRU5BQkxFCQkoMSA8PCAwKQorCisvKiBWUF9NT0RFICovCisjZGVmaW5lIFZQX01PREVfTlYxMgkJCSgwIDw8IDYpCisjZGVmaW5lIFZQX01PREVfTlYyMQkJCSgxIDw8IDYpCisjZGVmaW5lIFZQX01PREVfTElORV9TS0lQCQkoMSA8PCA1KQorI2RlZmluZSBWUF9NT0RFX01FTV9MSU5FQVIJCSgwIDw8IDQpCisjZGVmaW5lIFZQX01PREVfTUVNX1RJTEVECQkoMSA8PCA0KQorI2RlZmluZSBWUF9NT0RFX0ZNVF9NQVNLCQkoNSA8PCA0KQorI2RlZmluZSBWUF9NT0RFX0ZJRUxEX0lEX0FVVE9fVE9HR0xJTkcJKDEgPDwgMikKKyNkZWZpbmUgVlBfTU9ERV8yRF9JUEMJCQkoMSA8PCAxKQorCisvKiBWUF9JTUdfU0laRV9ZICovCisvKiBWUF9JTUdfU0laRV9DICovCisjZGVmaW5lIFZQX0lNR19IU0laRSh4KQkJCVZQX01BU0tfVkFMKHgsIDI5LCAxNikKKyNkZWZpbmUgVlBfSU1HX1ZTSVpFKHgpCQkJVlBfTUFTS19WQUwoeCwgMTMsIDApCisKKy8qIFZQX1NSQ19IX1BPU0lUSU9OICovCisjZGVmaW5lIFZQX1NSQ19IX1BPU0lUSU9OX1ZBTCh4KQlWUF9NQVNLX1ZBTCh4LCAxNCwgNCkKKworLyogVlBfRU5ESUFOX01PREUgKi8KKyNkZWZpbmUgVlBfRU5ESUFOX01PREVfTElUVExFCQkoMSA8PCAwKQorCisjZW5kaWYgLyogU0FNU1VOR19SRUdTX1ZQX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L3Nkb19kcnYuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L3Nkb19kcnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGRkZDZiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvc2RvX2Rydi5jCkBAIC0wLDAgKzEsNDc5IEBACisvKgorICogU2Ftc3VuZyBTdGFuZGFyZCBEZWZpbml0aW9uIE91dHB1dCAoU0RPKSBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiwgTHRkLgorICoKKyAqIFRvbWFzeiBTdGFuaXNsYXdza2ksIDx0LnN0YW5pc2xhd3NAc2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkCisgKiBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGlhdGlvbi4gZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwKKyAqIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxtZWRpYS92NGwyLXN1YmRldi5oPgorCisjaW5jbHVkZSAicmVncy1zZG8uaCIKKworTU9EVUxFX0FVVEhPUigiVG9tYXN6IFN0YW5pc2xhd3NraSwgPHQuc3RhbmlzbGF3c0BzYW1zdW5nLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU2Ftc3VuZyBTdGFuZGFyZCBEZWZpbml0aW9uIE91dHB1dCAoU0RPKSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIFNET19ERUZBVUxUX1NURAlWNEwyX1NURF9QQUwKKworc3RydWN0IHNkb19mb3JtYXQgeworCXY0bDJfc3RkX2lkIGlkOworCS8qIGFsbCBtb2RlcyBhcmUgNzIwIHBpeGVscyB3aWRlICovCisJdW5zaWduZWQgaW50IGhlaWdodDsKKwl1bnNpZ25lZCBpbnQgY29va2llOworfTsKKworc3RydWN0IHNkb19kZXZpY2UgeworCS8qKiBwb2ludGVyIHRvIGRldmljZSBwYXJlbnQgKi8KKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJLyoqIGJhc2UgYWRkcmVzcyBvZiBTRE8gcmVnaXN0ZXJzICovCisJdm9pZCBfX2lvbWVtICpyZWdzOworCS8qKiBTRE8gaW50ZXJydXB0ICovCisJdW5zaWduZWQgaW50IGlycTsKKwkvKiogREFDIHNvdXJjZSBjbG9jayAqLworCXN0cnVjdCBjbGsgKnNjbGtfZGFjOworCS8qKiBEQUMgY2xvY2sgKi8KKwlzdHJ1Y3QgY2xrICpkYWM7CisJLyoqIERBQyBwaHlzaWNhbCBpbnRlcmZhY2UgKi8KKwlzdHJ1Y3QgY2xrICpkYWNwaHk7CisJLyoqIGNsb2NrIGZvciBjb250cm9sIG9mIFZQTEwgKi8KKwlzdHJ1Y3QgY2xrICpmb3V0X3ZwbGw7CisJLyoqIHJlZ3VsYXRvciBmb3IgU0RPIElQIHBvd2VyICovCisJc3RydWN0IHJlZ3VsYXRvciAqdmRhYzsKKwkvKiogcmVndWxhdG9yIGZvciBTRE8gcGx1ZyBkZXRlY3Rpb24gKi8KKwlzdHJ1Y3QgcmVndWxhdG9yICp2ZGV0OworCS8qKiBzdWJkZXYgdXNlZCBhcyBkZXZpY2UgaW50ZXJmYWNlICovCisJc3RydWN0IHY0bDJfc3ViZGV2IHNkOworCS8qKiBjdXJyZW50IGZvcm1hdCAqLworCWNvbnN0IHN0cnVjdCBzZG9fZm9ybWF0ICpmbXQ7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzZG9fZGV2aWNlICpzZF90b19zZGV2KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihzZCwgc3RydWN0IHNkb19kZXZpY2UsIHNkKTsKK30KKworc3RhdGljIGlubGluZQordm9pZCBzZG9fd3JpdGVfbWFzayhzdHJ1Y3Qgc2RvX2RldmljZSAqc2RldiwgdTMyIHJlZ19pZCwgdTMyIHZhbHVlLCB1MzIgbWFzaykKK3sKKwl1MzIgb2xkID0gcmVhZGwoc2Rldi0+cmVncyArIHJlZ19pZCk7CisJdmFsdWUgPSAodmFsdWUgJiBtYXNrKSB8IChvbGQgJiB+bWFzayk7CisJd3JpdGVsKHZhbHVlLCBzZGV2LT5yZWdzICsgcmVnX2lkKTsKK30KKworc3RhdGljIGlubGluZQordm9pZCBzZG9fd3JpdGUoc3RydWN0IHNkb19kZXZpY2UgKnNkZXYsIHUzMiByZWdfaWQsIHUzMiB2YWx1ZSkKK3sKKwl3cml0ZWwodmFsdWUsIHNkZXYtPnJlZ3MgKyByZWdfaWQpOworfQorCitzdGF0aWMgaW5saW5lCit1MzIgc2RvX3JlYWQoc3RydWN0IHNkb19kZXZpY2UgKnNkZXYsIHUzMiByZWdfaWQpCit7CisJcmV0dXJuIHJlYWRsKHNkZXYtPnJlZ3MgKyByZWdfaWQpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3Qgc2RvX2lycV9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9kYXRhKQoreworCXN0cnVjdCBzZG9fZGV2aWNlICpzZGV2ID0gZGV2X2RhdGE7CisKKwkvKiBjbGVhciBpbnRlcnJ1cHQgKi8KKwlzZG9fd3JpdGVfbWFzayhzZGV2LCBTRE9fSVJRLCB+MCwgU0RPX1ZTWU5DX0lSUV9QRU5EKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHNkb19yZWdfZGVidWcoc3RydWN0IHNkb19kZXZpY2UgKnNkZXYpCit7CisjZGVmaW5lIERCR1JFRyhyZWdfaWQpIFwKKwlkZXZfaW5mbyhzZGV2LT5kZXYsICNyZWdfaWQgIiA9ICUwOHhcbiIsIFwKKwkJc2RvX3JlYWQoc2RldiwgcmVnX2lkKSkKKworCURCR1JFRyhTRE9fQ0xLQ09OKTsKKwlEQkdSRUcoU0RPX0NPTkZJRyk7CisJREJHUkVHKFNET19WQkkpOworCURCR1JFRyhTRE9fREFDKTsKKwlEQkdSRUcoU0RPX0lSUSk7CisJREJHUkVHKFNET19JUlFNQVNLKTsKKwlEQkdSRUcoU0RPX1ZFUlNJT04pOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNkb19mb3JtYXQgc2RvX2Zvcm1hdFtdID0geworCXsgVjRMMl9TVERfUEFMX04sCS5oZWlnaHQgPSA1NzYsIC5jb29raWUgPSBTRE9fUEFMX04gfSwKKwl7IFY0TDJfU1REX1BBTF9OYywJLmhlaWdodCA9IDU3NiwgLmNvb2tpZSA9IFNET19QQUxfTkMgfSwKKwl7IFY0TDJfU1REX1BBTF9NLAkuaGVpZ2h0ID0gNDgwLCAuY29va2llID0gU0RPX1BBTF9NIH0sCisJeyBWNEwyX1NURF9QQUxfNjAsCS5oZWlnaHQgPSA0ODAsIC5jb29raWUgPSBTRE9fUEFMXzYwIH0sCisJeyBWNEwyX1NURF9OVFNDXzQ0MywJLmhlaWdodCA9IDQ4MCwgLmNvb2tpZSA9IFNET19OVFNDXzQ0MyB9LAorCXsgVjRMMl9TVERfUEFMLAkJLmhlaWdodCA9IDU3NiwgLmNvb2tpZSA9IFNET19QQUxfQkdISUQgfSwKKwl7IFY0TDJfU1REX05UU0NfTSwJLmhlaWdodCA9IDQ4MCwgLmNvb2tpZSA9IFNET19OVFNDX00gfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2RvX2Zvcm1hdCAqc2RvX2ZpbmRfZm9ybWF0KHY0bDJfc3RkX2lkIGlkKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNkb19mb3JtYXQpOyArK2kpCisJCWlmIChzZG9fZm9ybWF0W2ldLmlkICYgaWQpCisJCQlyZXR1cm4gJnNkb19mb3JtYXRbaV07CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgc2RvX2dfdHZub3Jtc19vdXRwdXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdjRsMl9zdGRfaWQgKnN0ZCkKK3sKKwkqc3RkID0gVjRMMl9TVERfTlRTQ19NIHwgVjRMMl9TVERfUEFMX00gfCBWNEwyX1NURF9QQUwgfAorCQlWNEwyX1NURF9QQUxfTiB8IFY0TDJfU1REX1BBTF9OYyB8CisJCVY0TDJfU1REX05UU0NfNDQzIHwgVjRMMl9TVERfUEFMXzYwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkb19zX3N0ZF9vdXRwdXQoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdjRsMl9zdGRfaWQgc3RkKQoreworCXN0cnVjdCBzZG9fZGV2aWNlICpzZGV2ID0gc2RfdG9fc2RldihzZCk7CisJY29uc3Qgc3RydWN0IHNkb19mb3JtYXQgKmZtdDsKKwlmbXQgPSBzZG9fZmluZF9mb3JtYXQoc3RkKTsKKwlpZiAoZm10ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCXNkZXYtPmZtdCA9IGZtdDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZG9fZ19zdGRfb3V0cHV0KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHY0bDJfc3RkX2lkICpzdGQpCit7CisJKnN0ZCA9IHNkX3RvX3NkZXYoc2QpLT5mbXQtPmlkOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkb19nX21idXNfZm10KHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm10KQoreworCXN0cnVjdCBzZG9fZGV2aWNlICpzZGV2ID0gc2RfdG9fc2RldihzZCk7CisKKwlpZiAoIXNkZXYtPmZtdCkKKwkJcmV0dXJuIC1FTlhJTzsKKwkvKiBhbGwgbW9kZXMgYXJlIDcyMCBwaXhlbHMgd2lkZSAqLworCWZtdC0+d2lkdGggPSA3MjA7CisJZm10LT5oZWlnaHQgPSBzZGV2LT5mbXQtPmhlaWdodDsKKwlmbXQtPmNvZGUgPSBWNEwyX01CVVNfRk1UX0ZJWEVEOworCWZtdC0+ZmllbGQgPSBWNEwyX0ZJRUxEX0lOVEVSTEFDRUQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2RvX3NfcG93ZXIoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgaW50IG9uKQoreworCXN0cnVjdCBzZG9fZGV2aWNlICpzZGV2ID0gc2RfdG9fc2RldihzZCk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gc2Rldi0+ZGV2OworCWludCByZXQ7CisKKwlkZXZfaW5mbyhkZXYsICJzZG9fc19wb3dlciglZClcbiIsIG9uKTsKKworCWlmIChvbikKKwkJcmV0ID0gcG1fcnVudGltZV9nZXRfc3luYyhkZXYpOworCWVsc2UKKwkJcmV0ID0gcG1fcnVudGltZV9wdXRfc3luYyhkZXYpOworCisJLyogb25seSB2YWx1ZXMgPCAwIGluZGljYXRlIGVycm9ycyAqLworCXJldHVybiBJU19FUlJfVkFMVUUocmV0KSA/IHJldCA6IDA7Cit9CisKK3N0YXRpYyBpbnQgc2RvX3N0cmVhbW9uKHN0cnVjdCBzZG9fZGV2aWNlICpzZGV2KQoreworCS8qIHNldCBwcm9wZXIgY2xvY2sgZm9yIFRpbWluZyBHZW5lcmF0b3IgKi8KKwljbGtfc2V0X3JhdGUoc2Rldi0+Zm91dF92cGxsLCA1NDAwMDAwMCk7CisJZGV2X2luZm8oc2Rldi0+ZGV2LCAiZm91dF92cGxsLnJhdGUgPSAlbHVcbiIsCisJY2xrX2dldF9yYXRlKHNkZXYtPmZvdXRfdnBsbCkpOworCS8qIGVuYWJsZSBjbG9jayBpbiBTRE8gKi8KKwlzZG9fd3JpdGVfbWFzayhzZGV2LCBTRE9fQ0xLQ09OLCB+MCwgU0RPX1RWT1VUX0NMT0NLX09OKTsKKwljbGtfZW5hYmxlKHNkZXYtPmRhY3BoeSk7CisJLyogZW5hYmxlIERBQyAqLworCXNkb193cml0ZV9tYXNrKHNkZXYsIFNET19EQUMsIH4wLCBTRE9fUE9XRVJfT05fREFDKTsKKwlzZG9fcmVnX2RlYnVnKHNkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNkb19zdHJlYW1vZmYoc3RydWN0IHNkb19kZXZpY2UgKnNkZXYpCit7CisJaW50IHRyaWVzOworCisJc2RvX3dyaXRlX21hc2soc2RldiwgU0RPX0RBQywgMCwgU0RPX1BPV0VSX09OX0RBQyk7CisJY2xrX2Rpc2FibGUoc2Rldi0+ZGFjcGh5KTsKKwlzZG9fd3JpdGVfbWFzayhzZGV2LCBTRE9fQ0xLQ09OLCAwLCBTRE9fVFZPVVRfQ0xPQ0tfT04pOworCWZvciAodHJpZXMgPSAxMDA7IHRyaWVzOyAtLXRyaWVzKSB7CisJCWlmIChzZG9fcmVhZChzZGV2LCBTRE9fQ0xLQ09OKSAmIFNET19UVk9VVF9DTE9DS19SRUFEWSkKKwkJCWJyZWFrOworCQltZGVsYXkoMSk7CisJfQorCWlmICh0cmllcyA9PSAwKQorCQlkZXZfZXJyKHNkZXYtPmRldiwgImZhaWxlZCB0byBzdG9wIHN0cmVhbWluZ1xuIik7CisJcmV0dXJuIHRyaWVzID8gMCA6IC1FSU87Cit9CisKK3N0YXRpYyBpbnQgc2RvX3Nfc3RyZWFtKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBvbikKK3sKKwlzdHJ1Y3Qgc2RvX2RldmljZSAqc2RldiA9IHNkX3RvX3NkZXYoc2QpOworCXJldHVybiBvbiA/IHNkb19zdHJlYW1vbihzZGV2KSA6IHNkb19zdHJlYW1vZmYoc2Rldik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgc2RvX3NkX2NvcmVfb3BzID0geworCS5zX3Bvd2VyID0gc2RvX3NfcG93ZXIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X3ZpZGVvX29wcyBzZG9fc2RfdmlkZW9fb3BzID0geworCS5zX3N0ZF9vdXRwdXQgPSBzZG9fc19zdGRfb3V0cHV0LAorCS5nX3N0ZF9vdXRwdXQgPSBzZG9fZ19zdGRfb3V0cHV0LAorCS5nX3R2bm9ybXNfb3V0cHV0ID0gc2RvX2dfdHZub3Jtc19vdXRwdXQsCisJLmdfbWJ1c19mbXQgPSBzZG9fZ19tYnVzX2ZtdCwKKwkuc19zdHJlYW0gPSBzZG9fc19zdHJlYW0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBzZG9fc2Rfb3BzID0geworCS5jb3JlID0gJnNkb19zZF9jb3JlX29wcywKKwkudmlkZW8gPSAmc2RvX3NkX3ZpZGVvX29wcywKK307CisKK3N0YXRpYyBpbnQgc2RvX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBzZG9fZGV2aWNlICpzZGV2ID0gc2RfdG9fc2RldihzZCk7CisKKwlkZXZfaW5mbyhkZXYsICJzdXNwZW5kXG4iKTsKKwlyZWd1bGF0b3JfZGlzYWJsZShzZGV2LT52ZGV0KTsKKwlyZWd1bGF0b3JfZGlzYWJsZShzZGV2LT52ZGFjKTsKKwljbGtfZGlzYWJsZShzZGV2LT5zY2xrX2RhYyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2RvX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHNkb19kZXZpY2UgKnNkZXYgPSBzZF90b19zZGV2KHNkKTsKKworCWRldl9pbmZvKGRldiwgInJlc3VtZVxuIik7CisJY2xrX2VuYWJsZShzZGV2LT5zY2xrX2RhYyk7CisJcmVndWxhdG9yX2VuYWJsZShzZGV2LT52ZGFjKTsKKwlyZWd1bGF0b3JfZW5hYmxlKHNkZXYtPnZkZXQpOworCisJLyogc29mdHdhcmUgcmVzZXQgKi8KKwlzZG9fd3JpdGVfbWFzayhzZGV2LCBTRE9fQ0xLQ09OLCB+MCwgU0RPX1RWT1VUX1NXX1JFU0VUKTsKKwltZGVsYXkoMTApOworCXNkb193cml0ZV9tYXNrKHNkZXYsIFNET19DTEtDT04sIDAsIFNET19UVk9VVF9TV19SRVNFVCk7CisKKwkvKiBzZXR0aW5nIFRWIG1vZGUgKi8KKwlzZG9fd3JpdGVfbWFzayhzZGV2LCBTRE9fQ09ORklHLCBzZGV2LT5mbXQtPmNvb2tpZSwgU0RPX1NUQU5EQVJEX01BU0spOworCS8qIFhYWDogZm9yY2luZyBpbnRlcmxhY2VkIG1vZGUgdXNpbmcgdW5kb2N1bWVudGVkIGJpdCAqLworCXNkb193cml0ZV9tYXNrKHNkZXYsIFNET19DT05GSUcsIDAsIFNET19QUk9HUkVTU0lWRSk7CisJLyogdHVybiBhbGwgVkJJIG9mZiAqLworCXNkb193cml0ZV9tYXNrKHNkZXYsIFNET19WQkksIDAsIFNET19DVkJTX1dTU19JTlMgfAorCQlTRE9fQ1ZCU19DTE9TRURfQ0FQVElPTl9NQVNLKTsKKwkvKiB0dXJuIGFsbCBwb3N0IHByb2Nlc3Npbmcgb2ZmICovCisJc2RvX3dyaXRlX21hc2soc2RldiwgU0RPX0NDQ09OLCB+MCwgU0RPX0NPTVBFTlNBVElPTl9CSFNfQURKX09GRiB8CisJCVNET19DT01QRU5TQVRJT05fQ1ZCU19DT01QX09GRik7CisJc2RvX3JlZ19kZWJ1ZyhzZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHNkb19wbV9vcHMgPSB7CisJLnJ1bnRpbWVfc3VzcGVuZCA9IHNkb19ydW50aW1lX3N1c3BlbmQsCisJLnJ1bnRpbWVfcmVzdW1lCSA9IHNkb19ydW50aW1lX3Jlc3VtZSwKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHNkb19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2LT5kZXY7CisJc3RydWN0IHNkb19kZXZpY2UgKnNkZXY7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGNsayAqc2Nsa192cGxsOworCisJZGV2X2luZm8oZGV2LCAicHJvYmUgc3RhcnRcbiIpOworCXNkZXYgPSBremFsbG9jKHNpemVvZiAqc2RldiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZGV2KSB7CisJCWRldl9lcnIoZGV2LCAibm90IGVub3VnaCBtZW1vcnkuXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBmYWlsOworCX0KKwlzZGV2LT5kZXYgPSBkZXY7CisKKwkvKiBtYXBwaW5nIHJlZ2lzdGVycyAqLworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKHJlcyA9PSBOVUxMKSB7CisJCWRldl9lcnIoZGV2LCAiZ2V0IG1lbW9yeSByZXNvdXJjZSBmYWlsZWQuXG4iKTsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIGZhaWxfc2RldjsKKwl9CisKKwlzZGV2LT5yZWdzID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCWlmIChzZGV2LT5yZWdzID09IE5VTEwpIHsKKwkJZGV2X2VycihkZXYsICJyZWdpc3RlciBtYXBwaW5nIGZhaWxlZC5cbiIpOworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gZmFpbF9zZGV2OworCX0KKworCS8qIGFjcXVpcmluZyBpbnRlcnJ1cHQgKi8KKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9JUlEsIDApOworCWlmIChyZXMgPT0gTlVMTCkgeworCQlkZXZfZXJyKGRldiwgImdldCBpbnRlcnJ1cHQgcmVzb3VyY2UgZmFpbGVkLlxuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBmYWlsX3JlZ3M7CisJfQorCXJldCA9IHJlcXVlc3RfaXJxKHJlcy0+c3RhcnQsIHNkb19pcnFfaGFuZGxlciwgMCwgInM1cC1zZG8iLCBzZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAicmVxdWVzdCBpbnRlcnJ1cHQgZmFpbGVkLlxuIik7CisJCWdvdG8gZmFpbF9yZWdzOworCX0KKwlzZGV2LT5pcnEgPSByZXMtPnN0YXJ0OworCisJLyogYWNxdWlyZSBjbG9ja3MgKi8KKwlzZGV2LT5zY2xrX2RhYyA9IGNsa19nZXQoZGV2LCAic2Nsa19kYWMiKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoc2Rldi0+c2Nsa19kYWMpKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBjbG9jayAnc2Nsa19kYWMnXG4iKTsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIGZhaWxfaXJxOworCX0KKwlzZGV2LT5kYWMgPSBjbGtfZ2V0KGRldiwgImRhYyIpOworCWlmIChJU19FUlJfT1JfTlVMTChzZGV2LT5kYWMpKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBjbG9jayAnZGFjJ1xuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBmYWlsX3NjbGtfZGFjOworCX0KKwlzZGV2LT5kYWNwaHkgPSBjbGtfZ2V0KGRldiwgImRhY3BoeSIpOworCWlmIChJU19FUlJfT1JfTlVMTChzZGV2LT5kYWNwaHkpKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBjbG9jayAnZGFjcGh5J1xuIik7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBmYWlsX2RhYzsKKwl9CisJc2Nsa192cGxsID0gY2xrX2dldChkZXYsICJzY2xrX3ZwbGwiKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoc2Nsa192cGxsKSkgeworCQlkZXZfZXJyKGRldiwgImZhaWxlZCB0byBnZXQgY2xvY2sgJ3NjbGtfdnBsbCdcbiIpOworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gZmFpbF9kYWNwaHk7CisJfQorCWNsa19zZXRfcGFyZW50KHNkZXYtPnNjbGtfZGFjLCBzY2xrX3ZwbGwpOworCWNsa19wdXQoc2Nsa192cGxsKTsKKwlzZGV2LT5mb3V0X3ZwbGwgPSBjbGtfZ2V0KGRldiwgImZvdXRfdnBsbCIpOworCWlmIChJU19FUlJfT1JfTlVMTChzZGV2LT5mb3V0X3ZwbGwpKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCBjbG9jayAnZm91dF92cGxsJ1xuIik7CisJCWdvdG8gZmFpbF9kYWNwaHk7CisJfQorCWRldl9pbmZvKGRldiwgImZvdXRfdnBsbC5yYXRlID0gJWx1XG4iLCBjbGtfZ2V0X3JhdGUoc2Nsa192cGxsKSk7CisKKwkvKiBhY3F1aXJlIHJlZ3VsYXRvciAqLworCXNkZXYtPnZkYWMgPSByZWd1bGF0b3JfZ2V0KGRldiwgInZkZDMzYV9kYWMiKTsKKwlpZiAoSVNfRVJSX09SX05VTEwoc2Rldi0+dmRhYykpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gZ2V0IHJlZ3VsYXRvciAndmRhYydcbiIpOworCQlnb3RvIGZhaWxfZm91dF92cGxsOworCX0KKwlzZGV2LT52ZGV0ID0gcmVndWxhdG9yX2dldChkZXYsICJ2ZGV0Iik7CisJaWYgKElTX0VSUl9PUl9OVUxMKHNkZXYtPnZkZXQpKSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIGdldCByZWd1bGF0b3IgJ3ZkZXQnXG4iKTsKKwkJZ290byBmYWlsX3ZkYWM7CisJfQorCisJLyogZW5hYmxlIGdhdGUgZm9yIGRhYyBjbG9jaywgYmVjYXVzZSBtaXhlciB1c2VzIGl0ICovCisJY2xrX2VuYWJsZShzZGV2LT5kYWMpOworCisJLyogY29uZmlndXJlIHBvd2VyIG1hbmFnZW1lbnQgKi8KKwlwbV9ydW50aW1lX2VuYWJsZShkZXYpOworCisJLyogY29uZmlndXJhdGlvbiBvZiBpbnRlcmZhY2Ugc3ViZGV2aWNlICovCisJdjRsMl9zdWJkZXZfaW5pdCgmc2Rldi0+c2QsICZzZG9fc2Rfb3BzKTsKKwlzZGV2LT5zZC5vd25lciA9IFRISVNfTU9EVUxFOworCXN0cmxjcHkoc2Rldi0+c2QubmFtZSwgInM1cC1zZG8iLCBzaXplb2Ygc2Rldi0+c2QubmFtZSk7CisKKwkvKiBzZXQgZGVmYXVsdCBmb3JtYXQgKi8KKwlzZGV2LT5mbXQgPSBzZG9fZmluZF9mb3JtYXQoU0RPX0RFRkFVTFRfU1REKTsKKwlCVUdfT04oc2Rldi0+Zm10ID09IE5VTEwpOworCisJLyoga2VlcGluZyBzdWJkZXYgaW4gZGV2aWNlJ3MgcHJpdmF0ZSBmb3IgdXNlIGJ5IG90aGVyIGRyaXZlcnMgKi8KKwlkZXZfc2V0X2RydmRhdGEoZGV2LCAmc2Rldi0+c2QpOworCisJZGV2X2luZm8oZGV2LCAicHJvYmUgc3VjY2VlZGVkXG4iKTsKKwlyZXR1cm4gMDsKKworZmFpbF92ZGFjOgorCXJlZ3VsYXRvcl9wdXQoc2Rldi0+dmRhYyk7CitmYWlsX2ZvdXRfdnBsbDoKKwljbGtfcHV0KHNkZXYtPmZvdXRfdnBsbCk7CitmYWlsX2RhY3BoeToKKwljbGtfcHV0KHNkZXYtPmRhY3BoeSk7CitmYWlsX2RhYzoKKwljbGtfcHV0KHNkZXYtPmRhYyk7CitmYWlsX3NjbGtfZGFjOgorCWNsa19wdXQoc2Rldi0+c2Nsa19kYWMpOworZmFpbF9pcnE6CisJZnJlZV9pcnEoc2Rldi0+aXJxLCBzZGV2KTsKK2ZhaWxfcmVnczoKKwlpb3VubWFwKHNkZXYtPnJlZ3MpOworZmFpbF9zZGV2OgorCWtmcmVlKHNkZXYpOworZmFpbDoKKwlkZXZfaW5mbyhkZXYsICJwcm9iZSBmYWlsZWRcbiIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHNkb19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCXN0cnVjdCBzZG9fZGV2aWNlICpzZGV2ID0gc2RfdG9fc2RldihzZCk7CisKKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CisJY2xrX2Rpc2FibGUoc2Rldi0+ZGFjKTsKKwlyZWd1bGF0b3JfcHV0KHNkZXYtPnZkZXQpOworCXJlZ3VsYXRvcl9wdXQoc2Rldi0+dmRhYyk7CisJY2xrX3B1dChzZGV2LT5mb3V0X3ZwbGwpOworCWNsa19wdXQoc2Rldi0+ZGFjcGh5KTsKKwljbGtfcHV0KHNkZXYtPmRhYyk7CisJY2xrX3B1dChzZGV2LT5zY2xrX2RhYyk7CisJZnJlZV9pcnEoc2Rldi0+aXJxLCBzZGV2KTsKKwlpb3VubWFwKHNkZXYtPnJlZ3MpOworCWtmcmVlKHNkZXYpOworCisJZGV2X2luZm8oJnBkZXYtPmRldiwgInJlbW92ZSBzdWNjZXNzZnVsXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2RvX2RyaXZlciBfX3JlZmRhdGEgPSB7CisJLnByb2JlID0gc2RvX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzZG9fcmVtb3ZlKSwKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJzNXAtc2RvIiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5wbSA9ICZzZG9fcG1fb3BzLAorCX0KK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNkb19pbml0KHZvaWQpCit7CisJaW50IHJldDsKKwlzdGF0aWMgY29uc3QgY2hhciBiYW5uZXJbXSBfX2luaXRkYXRhID0gS0VSTl9JTkZPIFwKKwkJIlNhbXN1bmcgU3RhbmRhcmQgRGVmaW5pdGlvbiBPdXRwdXQgKFNETykgZHJpdmVyLCAiCisJCSIoYykgMjAxMC0yMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLCBMdGQuXG4iOworCXByaW50ayhiYW5uZXIpOworCisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzZG9fZHJpdmVyKTsKKwlpZiAocmV0KQorCQlwcmludGsoS0VSTl9FUlIgIlNETyBwbGF0Zm9ybSBkcml2ZXIgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKKworCXJldHVybiByZXQ7Cit9Cittb2R1bGVfaW5pdChzZG9faW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzZG9fZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzZG9fZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHNkb19leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzExNS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTE1LmMKaW5kZXggMGRiOTA5Mi4uZjJhZTQwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTE1LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTE1LmMKQEAgLTc1Nyw4ICs3NTcsOCBAQAogCXN3aXRjaCAoY3RybC0+aWQpIHsKIAljYXNlIFY0TDJfQ0lEX0NIUk9NQV9BR0M6CiAJCS8qIGNocm9tYSBnYWluIGNsdXN0ZXIgKi8KLQkJaWYgKHN0YXRlLT5hZ2MtPmN1ci52YWwpCi0JCQlzdGF0ZS0+Z2Fpbi0+Y3VyLnZhbCA9CisJCWlmIChzdGF0ZS0+YWdjLT52YWwpCisJCQlzdGF0ZS0+Z2Fpbi0+dmFsID0KIAkJCQlzYWE3MTF4X3JlYWQoc2QsIFJfMEZfQ0hST01BX0dBSU5fQ05UTCkgJiAweDdmOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jYXJkcy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY2FyZHMuYwppbmRleCBlMjA2MmIyLi4wZjlmYjk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jYXJkcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNhcmRzLmMKQEAgLTQ5NTEsOCArNDk1MSw5IEBACiAJCS5hdWRpb19jbG9jayAgICA9IDB4MDAxODdkZTcsCiAJCS50dW5lcl90eXBlICAgICA9IFRVTkVSX1hDMjAyOCwKIAkJLnJhZGlvX3R5cGUgICAgID0gVU5TRVQsCi0JCS50dW5lcl9hZGRyCT0gQUREUl9VTlNFVCwKKwkJLnR1bmVyX2FkZHIJPSAweDYxLAogCQkucmFkaW9fYWRkcgk9IEFERFJfVU5TRVQsCisJCS5tcGVnICAgICAgICAgICA9IFNBQTcxMzRfTVBFR19EVkIsCiAJCS5pbnB1dHMgPSB7ewogCQkJLm5hbWUgICA9IG5hbWVfdHYsCiAJCQkudm11eCAgID0gMywKQEAgLTY5OTIsNiArNjk5MywxMSBAQAogCQkJbXNsZWVwKDEwKTsKIAkJCXNhYTcxMzRfc2V0X2dwaW8oZGV2LCAxOCwgMSk7CiAJCWJyZWFrOworCQljYXNlIFNBQTcxMzRfQk9BUkRfVklERU9NQVRFX1Q3NTA6CisJCQlzYWE3MTM0X3NldF9ncGlvKGRldiwgMjAsIDApOworCQkJbXNsZWVwKDEwKTsKKwkJCXNhYTcxMzRfc2V0X2dwaW8oZGV2LCAyMCwgMSk7CisJCWJyZWFrOwogCQl9CiAJcmV0dXJuIDA7CiAJfQpAQCAtNzQ1MSw2ICs3NDU3LDExIEBACiAJCXNhYV9hbmRvcmwoU0FBNzEzNF9HUElPX0dQTU9ERTAgPj4gMiwgICAweDBlMDUwMDAwLCAweDBjMDUwMDAwKTsKIAkJc2FhX2FuZG9ybChTQUE3MTM0X0dQSU9fR1BTVEFUVVMwID4+IDIsIDB4MGUwNTAwMDAsIDB4MGMwNTAwMDApOwogCQlicmVhazsKKwljYXNlIFNBQTcxMzRfQk9BUkRfVklERU9NQVRFX1Q3NTA6CisJCS8qIGVuYWJsZSB0aGUgYW5hbG9nIHR1bmVyICovCisJCXNhYV9hbmRvcmwoU0FBNzEzNF9HUElPX0dQTU9ERTAgPj4gMiwgICAweDAwMDA4MDAwLCAweDAwMDA4MDAwKTsKKwkJc2FhX2FuZG9ybChTQUE3MTM0X0dQSU9fR1BTVEFUVVMwID4+IDIsIDB4MDAwMDgwMDAsIDB4MDAwMDgwMDApOworCQlicmVhazsKIAl9CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jb3JlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1jb3JlLmMKaW5kZXggZjliZTczNy4uY2E2NWNkYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWNvcmUuYwpAQCAtMzksNiArMzksOCBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJ2NGwyIGRyaXZlciBtb2R1bGUgZm9yIHNhYTcxMzAvMzQgYmFzZWQgVFYgY2FyZHMiKTsKIE1PRFVMRV9BVVRIT1IoIkdlcmQgS25vcnIgPGtyYXhlbEBieXRlc2V4Lm9yZz4gW1N1U0UgTGFic10iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKFNBQTcxMzRfVkVSU0lPTik7CisKIAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKQEAgLTEzMzIsMTQgKzEzMzQsOCBAQAogc3RhdGljIGludCBfX2luaXQgc2FhNzEzNF9pbml0KHZvaWQpCiB7CiAJSU5JVF9MSVNUX0hFQUQoJnNhYTcxMzRfZGV2bGlzdCk7Ci0JcHJpbnRrKEtFUk5fSU5GTyAic2FhNzEzMC8zNDogdjRsMiBkcml2ZXIgdmVyc2lvbiAlZC4lZC4lZCBsb2FkZWRcbiIsCi0JICAgICAgIChTQUE3MTM0X1ZFUlNJT05fQ09ERSA+PiAxNikgJiAweGZmLAotCSAgICAgICAoU0FBNzEzNF9WRVJTSU9OX0NPREUgPj4gIDgpICYgMHhmZiwKLQkgICAgICAgU0FBNzEzNF9WRVJTSU9OX0NPREUgJiAweGZmKTsKLSNpZmRlZiBTTkFQU0hPVAotCXByaW50ayhLRVJOX0lORk8gInNhYTcxMzAvMzQ6IHNuYXBzaG90IGRhdGUgJTA0ZC0lMDJkLSUwMmRcbiIsCi0JICAgICAgIFNOQVBTSE9ULzEwMDAwLCAoU05BUFNIT1QvMTAwKSUxMDAsIFNOQVBTSE9UJTEwMCk7Ci0jZW5kaWYKKwlwcmludGsoS0VSTl9JTkZPICJzYWE3MTMwLzM0OiB2NGwyIGRyaXZlciB2ZXJzaW9uICVzIGxvYWRlZFxuIiwKKwkgICAgICAgU0FBNzEzNF9WRVJTSU9OKTsKIAlyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmc2FhNzEzNF9wY2lfZHJpdmVyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZHZiLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1kdmIuYwppbmRleCA5OTZhMjA2Li4xZTRlZjE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1kdmIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1kdmIuYwpAQCAtNTYsNiArNTYsNyBAQAogI2luY2x1ZGUgImxnczhneHguaCIKIAogI2luY2x1ZGUgInpsMTAzNTMuaCIKKyNpbmNsdWRlICJxdDEwMTAuaCIKIAogI2luY2x1ZGUgInpsMTAwMzYuaCIKICNpbmNsdWRlICJ6bDEwMDM5LmgiCkBAIC05MzksNiArOTQwLDE4IEBACiAJLmRpc2FibGVfaTJjX2dhdGVfY3RybCA9IDEsCiB9OwogCitzdGF0aWMgc3RydWN0IHpsMTAzNTNfY29uZmlnIHZpZGVvbWF0ZV90NzUwX3psMTAzNTNfY29uZmlnID0geworCS5kZW1vZF9hZGRyZXNzICAgICAgICAgPSAweDBmLAorCS5ub190dW5lciAgICAgICAgICAgICAgPSAxLAorCS5wYXJhbGxlbF90cyAgICAgICAgICAgPSAxLAorCS5kaXNhYmxlX2kyY19nYXRlX2N0cmwgPSAxLAorfTsKKworc3RhdGljIHN0cnVjdCBxdDEwMTBfY29uZmlnIHZpZGVvbWF0ZV90NzUwX3F0MTAxMF9jb25maWcgPSB7CisJLmkyY19hZGRyZXNzID0gMHg2MgorfTsKKworCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAqIHRkYTEwMDg2IGJhc2VkIERWQi1TIGNhcmRzLCBoZWxwZXIgZnVuY3Rpb25zCiAgKi8KQEAgLTE2NTAsNiArMTY2MywxOCBAQAogCQkJCQlfX2Z1bmNfXyk7CiAKIAkJYnJlYWs7CisJY2FzZSBTQUE3MTM0X0JPQVJEX1ZJREVPTUFURV9UNzUwOgorCQlmZTAtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2goemwxMDM1M19hdHRhY2gsCisJCQkJCQkmdmlkZW9tYXRlX3Q3NTBfemwxMDM1M19jb25maWcsCisJCQkJCQkmZGV2LT5pMmNfYWRhcCk7CisJCWlmIChmZTAtPmR2Yi5mcm9udGVuZCAhPSBOVUxMKSB7CisJCQlpZiAoZHZiX2F0dGFjaChxdDEwMTBfYXR0YWNoLAorCQkJCQlmZTAtPmR2Yi5mcm9udGVuZCwKKwkJCQkJJmRldi0+aTJjX2FkYXAsCisJCQkJCSZ2aWRlb21hdGVfdDc1MF9xdDEwMTBfY29uZmlnKSA9PSBOVUxMKQorCQkJCXdwcmludGsoImVycm9yIGF0dGFjaGluZyBRVDEwMTBcbiIpOworCQl9CisJCWJyZWFrOwogCWNhc2UgU0FBNzEzNF9CT0FSRF9aT0xJRF9IWUJSSURfUENJOgogCQlmZTAtPmR2Yi5mcm9udGVuZCA9IGR2Yl9hdHRhY2godGRhMTAwNDhfYXR0YWNoLAogCQkJCQkgICAgICAgJnpvbGlkX3RkYTEwMDQ4X2NvbmZpZywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWVtcHJlc3MuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LWVtcHJlc3MuYwppbmRleCAxODI5NGRiLi5kZGUzNjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC1lbXByZXNzLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQtZW1wcmVzcy5jCkBAIC0xNzIsNyArMTcyLDYgQEAKIAlzdHJsY3B5KGNhcC0+Y2FyZCwgc2FhNzEzNF9ib2FyZHNbZGV2LT5ib2FyZF0ubmFtZSwKIAkJc2l6ZW9mKGNhcC0+Y2FyZCkpOwogCXNwcmludGYoY2FwLT5idXNfaW5mbywgIlBDSTolcyIsIHBjaV9uYW1lKGRldi0+cGNpKSk7Ci0JY2FwLT52ZXJzaW9uID0gU0FBNzEzNF9WRVJTSU9OX0NPREU7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPQogCQlWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKIAkJVjRMMl9DQVBfUkVBRFdSSVRFIHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC12aWRlby5jCmluZGV4IDc3NmJhMmQuLjljZjc5MTRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC12aWRlby5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LXZpZGVvLmMKQEAgLTE4MTAsNyArMTgxMCw2IEBACiAJc3RybGNweShjYXAtPmNhcmQsIHNhYTcxMzRfYm9hcmRzW2Rldi0+Ym9hcmRdLm5hbWUsCiAJCXNpemVvZihjYXAtPmNhcmQpKTsKIAlzcHJpbnRmKGNhcC0+YnVzX2luZm8sICJQQ0k6JXMiLCBwY2lfbmFtZShkZXYtPnBjaSkpOwotCWNhcC0+dmVyc2lvbiA9IFNBQTcxMzRfVkVSU0lPTl9DT0RFOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0KIAkJVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8CiAJCVY0TDJfQ0FQX1ZCSV9DQVBUVVJFIHwKQEAgLTIzMDcsNyArMjMwNiw2IEBACiAJc3RyY3B5KGNhcC0+ZHJpdmVyLCAic2FhNzEzNCIpOwogCXN0cmxjcHkoY2FwLT5jYXJkLCBzYWE3MTM0X2JvYXJkc1tkZXYtPmJvYXJkXS5uYW1lLCBzaXplb2YoY2FwLT5jYXJkKSk7CiAJc3ByaW50ZihjYXAtPmJ1c19pbmZvLCAiUENJOiVzIiwgcGNpX25hbWUoZGV2LT5wY2kpKTsKLQljYXAtPnZlcnNpb24gPSBTQUE3MTM0X1ZFUlNJT05fQ09ERTsKIAljYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1RVTkVSOwogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LmgKaW5kZXggMjhlYjEwMy4uYmM4ZDZiYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTM0L3NhYTcxMzQuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxMzQvc2FhNzEzNC5oCkBAIC0xOSw4ICsxOSw3IEBACiAgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLSNkZWZpbmUgU0FBNzEzNF9WRVJTSU9OX0NPREUgS0VSTkVMX1ZFUlNJT04oMCwgMiwgMTYpCisjZGVmaW5lIFNBQTcxMzRfVkVSU0lPTiAiMCwgMiwgMTciCiAKICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9zYWE3MTY0LWVuY29kZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9zYWE3MTY0LWVuY29kZXIuYwppbmRleCA0MDAzNjQ1Li4yZmQzOGEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxNjQvc2FhNzE2NC1lbmNvZGVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTY0L3NhYTcxNjQtZW5jb2Rlci5jCkBAIC0xMjQ2LDcgKzEyNDYsNiBAQAogCXN0cnVjdCBzYWE3MTY0X2VuY29kZXJfZmggKmZoID0KIAkJKHN0cnVjdCBzYWE3MTY0X2VuY29kZXJfZmggKilmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHNhYTcxNjRfcG9ydCAqcG9ydCA9IGZoLT5wb3J0OwotCXN0cnVjdCBzYWE3MTY0X3VzZXJfYnVmZmVyICp1YnVmOwogCXVuc2lnbmVkIGludCBtYXNrID0gMDsKIAogCXBvcnQtPmxhc3RfcG9sbF9tc2Vjc19kaWZmID0gcG9ydC0+bGFzdF9wb2xsX21zZWNzOwpAQCAtMTI3OCwxMCArMTI3Nyw3IEBACiAJfQogCiAJLyogUHVsbCB0aGUgZmlyc3QgYnVmZmVyIGZyb20gdGhlIHVzZWQgbGlzdCAqLwotCXVidWYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZwb3J0LT5saXN0X2J1Zl91c2VkLmxpc3QsCi0JCXN0cnVjdCBzYWE3MTY0X3VzZXJfYnVmZmVyLCBsaXN0KTsKLQotCWlmICh1YnVmKQorCWlmICghbGlzdF9lbXB0eSgmcG9ydC0+bGlzdF9idWZfdXNlZC5saXN0KSkKIAkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOwogCiAJcmV0dXJuIG1hc2s7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxNjQvc2FhNzE2NC12YmkuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9zYWE3MTY0LXZiaS5jCmluZGV4IGJjMWZjZWQuLmUyZTAzNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9zYWE3MTY0LXZiaS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9zYWE3MTY0LXZiaS5jCkBAIC0xMTkyLDcgKzExOTIsNiBAQAogewogCXN0cnVjdCBzYWE3MTY0X3ZiaV9maCAqZmggPSAoc3RydWN0IHNhYTcxNjRfdmJpX2ZoICopZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCBzYWE3MTY0X3BvcnQgKnBvcnQgPSBmaC0+cG9ydDsKLQlzdHJ1Y3Qgc2FhNzE2NF91c2VyX2J1ZmZlciAqdWJ1ZjsKIAl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CiAKIAlwb3J0LT5sYXN0X3BvbGxfbXNlY3NfZGlmZiA9IHBvcnQtPmxhc3RfcG9sbF9tc2VjczsKQEAgLTEyMjQsMTAgKzEyMjMsNyBAQAogCX0KIAogCS8qIFB1bGwgdGhlIGZpcnN0IGJ1ZmZlciBmcm9tIHRoZSB1c2VkIGxpc3QgKi8KLQl1YnVmID0gbGlzdF9maXJzdF9lbnRyeSgmcG9ydC0+bGlzdF9idWZfdXNlZC5saXN0LAotCQlzdHJ1Y3Qgc2FhNzE2NF91c2VyX2J1ZmZlciwgbGlzdCk7Ci0KLQlpZiAodWJ1ZikKKwlpZiAoIWxpc3RfZW1wdHkoJnBvcnQtPmxpc3RfYnVmX3VzZWQubGlzdCkpCiAJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKIAogCXJldHVybiBtYXNrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTY0L3NhYTcxNjQuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzE2NC9zYWE3MTY0LmgKaW5kZXggMTY3NDVkMi4uNjY3OGJmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zYWE3MTY0L3NhYTcxNjQuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NhYTcxNjQvc2FhNzE2NC5oCkBAIC00OCw3ICs0OCw2IEBACiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CiAjaW5jbHVkZSA8bGludXgvaTJjLWFsZ28tYml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KICNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX21vYmlsZV9jZXVfY2FtZXJhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX21vYmlsZV9jZXVfY2FtZXJhLmMKaW5kZXggM2FlNWM5Yy4uZTU0MDg5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zaF9tb2JpbGVfY2V1X2NhbWVyYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2hfbW9iaWxlX2NldV9jYW1lcmEuYwpAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KICNpbmNsdWRlIDxsaW51eC90aW1lLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KQEAgLTM5LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgogI2luY2x1ZGUgPG1lZGlhL3NvY19jYW1lcmEuaD4KICNpbmNsdWRlIDxtZWRpYS9zaF9tb2JpbGVfY2V1Lmg+CisjaW5jbHVkZSA8bWVkaWEvc2hfbW9iaWxlX2NzaTIuaD4KICNpbmNsdWRlIDxtZWRpYS92aWRlb2J1ZjItZG1hLWNvbnRpZy5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItbWVkaWFidXMuaD4KICNpbmNsdWRlIDxtZWRpYS9zb2NfbWVkaWFidXMuaD4KQEAgLTk2LDYgKzk2LDcgQEAKIHN0cnVjdCBzaF9tb2JpbGVfY2V1X2RldiB7CiAJc3RydWN0IHNvY19jYW1lcmFfaG9zdCBpY2k7CiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2Q7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqY3NpMl9wZGV2OwogCiAJdW5zaWduZWQgaW50IGlycTsKIAl2b2lkIF9faW9tZW0gKmJhc2U7CkBAIC0yMDUsNyArMjA2LDcgQEAKIAogCiAJaWYgKDIgIT0gc3VjY2VzcykgewotCQlkZXZfd2FybigmaWNkLT5kZXYsICJzb2Z0IHJlc2V0IHRpbWUgb3V0XG4iKTsKKwkJZGV2X3dhcm4oaWNkLT5wZGV2LCAic29mdCByZXNldCB0aW1lIG91dFxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIApAQCAtMjIwLDcgKzIyMSw3IEBACiAJCQl1bnNpZ25lZCBsb25nIHNpemVzW10sIHZvaWQgKmFsbG9jX2N0eHNbXSkKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGNvbnRhaW5lcl9vZih2cSwgc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlLCB2YjJfdmlkcSk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCWludCBieXRlc19wZXJfbGluZSA9IHNvY19tYnVzX2J5dGVzX3Blcl9saW5lKGljZC0+dXNlcl93aWR0aCwKIAkJCQkJCWljZC0+Y3VycmVudF9mbXQtPmhvc3RfZm10KTsKQEAgLTI0Miw3ICsyNDMsNyBAQAogCQkJKmNvdW50ID0gcGNkZXYtPnZpZGVvX2xpbWl0IC8gUEFHRV9BTElHTihzaXplc1swXSk7CiAJfQogCi0JZGV2X2RiZyhpY2QtPmRldi5wYXJlbnQsICJjb3VudD0lZCwgc2l6ZT0lbHVcbiIsICpjb3VudCwgc2l6ZXNbMF0pOworCWRldl9kYmcoaWNkLT5wYXJlbnQsICJjb3VudD0lZCwgc2l6ZT0lbHVcbiIsICpjb3VudCwgc2l6ZXNbMF0pOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zNTEsNyArMzUyLDcgQEAKIAogCWJ1ZiA9IHRvX2NldV92Yih2Yik7CiAKLQlkZXZfZGJnKGljZC0+ZGV2LnBhcmVudCwgIiVzICh2Yj0weCVwKSAweCVwICVsdVxuIiwgX19mdW5jX18sCisJZGV2X2RiZyhpY2QtPnBhcmVudCwgIiVzICh2Yj0weCVwKSAweCVwICVsdVxuIiwgX19mdW5jX18sCiAJCXZiLCB2YjJfcGxhbmVfdmFkZHIodmIsIDApLCB2YjJfZ2V0X3BsYW5lX3BheWxvYWQodmIsIDApKTsKIAogCS8qIEFkZGVkIGxpc3QgaGVhZCBpbml0aWFsaXphdGlvbiBvbiBhbGxvYyAqLwpAQCAtMzcxLDcgKzM3Miw3IEBACiAJc2l6ZSA9IGljZC0+dXNlcl9oZWlnaHQgKiBieXRlc19wZXJfbGluZTsKIAogCWlmICh2YjJfcGxhbmVfc2l6ZSh2YiwgMCkgPCBzaXplKSB7Ci0JCWRldl9lcnIoaWNkLT5kZXYucGFyZW50LCAiQnVmZmVyIHRvbyBzbWFsbCAoJWx1IDwgJWx1KVxuIiwKKwkJZGV2X2VycihpY2QtPnBhcmVudCwgIkJ1ZmZlciB0b28gc21hbGwgKCVsdSA8ICVsdSlcbiIsCiAJCQl2YjJfcGxhbmVfc2l6ZSh2YiwgMCksIHNpemUpOwogCQlyZXR1cm4gLUVOT0JVRlM7CiAJfQpAQCAtMzg0LDExICszODUsMTEgQEAKIHN0YXRpYyB2b2lkIHNoX21vYmlsZV9jZXVfdmlkZW9idWZfcXVldWUoc3RydWN0IHZiMl9idWZmZXIgKnZiKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gY29udGFpbmVyX29mKHZiLT52YjJfcXVldWUsIHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSwgdmIyX3ZpZHEpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9idWZmZXIgKmJ1ZiA9IHRvX2NldV92Yih2Yik7CiAKLQlkZXZfZGJnKGljZC0+ZGV2LnBhcmVudCwgIiVzICh2Yj0weCVwKSAweCVwICVsdVxuIiwgX19mdW5jX18sCisJZGV2X2RiZyhpY2QtPnBhcmVudCwgIiVzICh2Yj0weCVwKSAweCVwICVsdVxuIiwgX19mdW5jX18sCiAJCXZiLCB2YjJfcGxhbmVfdmFkZHIodmIsIDApLCB2YjJfZ2V0X3BsYW5lX3BheWxvYWQodmIsIDApKTsKIAogCXNwaW5fbG9ja19pcnEoJnBjZGV2LT5sb2NrKTsKQEAgLTQwOSw3ICs0MTAsNyBAQAogc3RhdGljIHZvaWQgc2hfbW9iaWxlX2NldV92aWRlb2J1Zl9yZWxlYXNlKHN0cnVjdCB2YjJfYnVmZmVyICp2YikKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGNvbnRhaW5lcl9vZih2Yi0+dmIyX3F1ZXVlLCBzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UsIHZiMl92aWRxKTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBzaF9tb2JpbGVfY2V1X2J1ZmZlciAqYnVmID0gdG9fY2V1X3ZiKHZiKTsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCkBAIC00MjEsOCArNDIyLDEyIEBACiAJCXBjZGV2LT5hY3RpdmUgPSBOVUxMOwogCX0KIAotCS8qIERvZXNuJ3QgaHVydCBhbHNvIGlmIHRoZSBsaXN0IGlzIGVtcHR5ICovCi0JbGlzdF9kZWxfaW5pdCgmYnVmLT5xdWV1ZSk7CisJLyoKKwkgKiBEb2Vzbid0IGh1cnQgYWxzbyBpZiB0aGUgbGlzdCBpcyBlbXB0eSwgYnV0IGl0IGh1cnRzLCBpZiBxdWV1aW5nIHRoZQorCSAqIGJ1ZmZlciBmYWlsZWQsIGFuZCAuYnVmX2luaXQoKSBoYXNuJ3QgYmVlbiBjYWxsZWQKKwkgKi8KKwlpZiAoYnVmLT5xdWV1ZS5uZXh0KQorCQlsaXN0X2RlbF9pbml0KCZidWYtPnF1ZXVlKTsKIAogCXNwaW5fdW5sb2NrX2lycSgmcGNkZXYtPmxvY2spOwogfQpAQCAtNDM3LDcgKzQ0Miw3IEBACiBzdGF0aWMgaW50IHNoX21vYmlsZV9jZXVfc3RvcF9zdHJlYW1pbmcoc3RydWN0IHZiMl9xdWV1ZSAqcSkKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGNvbnRhaW5lcl9vZihxLCBzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UsIHZiMl92aWRxKTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBzaF9tb2JpbGVfY2V1X2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAJc3RydWN0IGxpc3RfaGVhZCAqYnVmX2hlYWQsICp0bXA7CiAKQEAgLTQ5OSwyNSArNTA0LDQ4IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCitzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2ICpmaW5kX2NzaTIoc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwY2RldikKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkOworCisJaWYgKCFwY2Rldi0+Y3NpMl9wZGV2KQorCQlyZXR1cm4gTlVMTDsKKworCXY0bDJfZGV2aWNlX2Zvcl9lYWNoX3N1YmRldihzZCwgJnBjZGV2LT5pY2kudjRsMl9kZXYpCisJCWlmICgmcGNkZXYtPmNzaTJfcGRldi0+ZGV2ID09IHY0bDJfZ2V0X3N1YmRldmRhdGEoc2QpKQorCQkJcmV0dXJuIHNkOworCisJcmV0dXJuIE5VTEw7Cit9CisKIC8qIENhbGxlZCB3aXRoIC52aWRlb19sb2NrIGhlbGQgKi8KIHN0YXRpYyBpbnQgc2hfbW9iaWxlX2NldV9hZGRfZGV2aWNlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKmNzaTJfc2Q7CiAJaW50IHJldDsKIAogCWlmIChwY2Rldi0+aWNkKQogCQlyZXR1cm4gLUVCVVNZOwogCi0JZGV2X2luZm8oaWNkLT5kZXYucGFyZW50LAorCWRldl9pbmZvKGljZC0+cGFyZW50LAogCQkgIlN1cGVySCBNb2JpbGUgQ0VVIGRyaXZlciBhdHRhY2hlZCB0byBjYW1lcmEgJWRcbiIsCiAJCSBpY2QtPmRldm51bSk7CiAKIAlwbV9ydW50aW1lX2dldF9zeW5jKGljaS0+djRsMl9kZXYuZGV2KTsKIAogCXJldCA9IHNoX21vYmlsZV9jZXVfc29mdF9yZXNldChwY2Rldik7Ci0JaWYgKCFyZXQpCisKKwljc2kyX3NkID0gZmluZF9jc2kyKHBjZGV2KTsKKworCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoY3NpMl9zZCwgY29yZSwgc19wb3dlciwgMSk7CisJaWYgKHJldCAhPSAtRU5PREVWICYmIHJldCAhPSAtRU5PSU9DVExDTUQgJiYgcmV0IDwgMCkgeworCQlwbV9ydW50aW1lX3B1dF9zeW5jKGljaS0+djRsMl9kZXYuZGV2KTsKKwl9IGVsc2UgewogCQlwY2Rldi0+aWNkID0gaWNkOworCQlyZXQgPSAwOworCX0KIAogCXJldHVybiByZXQ7CiB9CkBAIC01MjUsMTEgKzU1MywxMyBAQAogLyogQ2FsbGVkIHdpdGggLnZpZGVvX2xvY2sgaGVsZCAqLwogc3RhdGljIHZvaWQgc2hfbW9iaWxlX2NldV9yZW1vdmVfZGV2aWNlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKmNzaTJfc2QgPSBmaW5kX2NzaTIocGNkZXYpOwogCiAJQlVHX09OKGljZCAhPSBwY2Rldi0+aWNkKTsKIAorCXY0bDJfc3ViZGV2X2NhbGwoY3NpMl9zZCwgY29yZSwgc19wb3dlciwgMCk7CiAJLyogZGlzYWJsZSBjYXB0dXJlLCBkaXNhYmxlIGludGVycnVwdHMgKi8KIAljZXVfd3JpdGUocGNkZXYsIENFSUVSLCAwKTsKIAlzaF9tb2JpbGVfY2V1X3NvZnRfcmVzZXQocGNkZXYpOwpAQCAtNTQ1LDcgKzU3NSw3IEBACiAKIAlwbV9ydW50aW1lX3B1dF9zeW5jKGljaS0+djRsMl9kZXYuZGV2KTsKIAotCWRldl9pbmZvKGljZC0+ZGV2LnBhcmVudCwKKwlkZXZfaW5mbyhpY2QtPnBhcmVudCwKIAkJICJTdXBlckggTW9iaWxlIENFVSBkcml2ZXIgZGV0YWNoZWQgZnJvbSBjYW1lcmEgJWRcbiIsCiAJCSBpY2QtPmRldm51bSk7CiAKQEAgLTU4NSwxNCArNjE1LDE0IEBACiAvKiByZWN0IGlzIGd1YXJhbnRlZWQgdG8gbm90IGV4Y2VlZCB0aGUgc2NhbGVkIGNhbWVyYSByZWN0YW5nbGUgKi8KIHN0YXRpYyB2b2lkIHNoX21vYmlsZV9jZXVfc2V0X3JlY3Qoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9jYW0gKmNhbSA9IGljZC0+aG9zdF9wcml2OwogCXN0cnVjdCBzaF9tb2JpbGVfY2V1X2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAJdW5zaWduZWQgaW50IGhlaWdodCwgd2lkdGgsIGNkd2RyX3dpZHRoLCBpbl93aWR0aCwgaW5faGVpZ2h0OwogCXVuc2lnbmVkIGludCBsZWZ0X29mZnNldCwgdG9wX29mZnNldDsKIAl1MzIgY2Ftb3I7CiAKLQlkZXZfZ2VvKGljZC0+ZGV2LnBhcmVudCwgIkNyb3AgJXV4JXVAJXU6JXVcbiIsCisJZGV2X2dlbyhpY2QtPnBhcmVudCwgIkNyb3AgJXV4JXVAJXU6JXVcbiIsCiAJCWljZC0+dXNlcl93aWR0aCwgaWNkLT51c2VyX2hlaWdodCwgY2FtLT5jZXVfbGVmdCwgY2FtLT5jZXVfdG9wKTsKIAogCWxlZnRfb2Zmc2V0CT0gY2FtLT5jZXVfbGVmdDsKQEAgLTY0MSw3ICs2NzEsNyBAQAogCX0KIAogCS8qIENTSTIgc3BlY2lhbCBjb25maWd1cmF0aW9uICovCi0JaWYgKHBjZGV2LT5wZGF0YS0+Y3NpMl9kZXYpIHsKKwlpZiAocGNkZXYtPnBkYXRhLT5jc2kyKSB7CiAJCWluX3dpZHRoID0gKChpbl93aWR0aCAtIDIpICogMik7CiAJCWxlZnRfb2Zmc2V0ICo9IDI7CiAJfQpAQCAtNjQ5LDcgKzY3OSw3IEBACiAJLyogU2V0IENBTU9SLCBDQVBXUiwgQ0ZTWlIsIHRha2UgY2FyZSBvZiBDRFdEUiAqLwogCWNhbW9yID0gbGVmdF9vZmZzZXQgfCAodG9wX29mZnNldCA8PCAxNik7CiAKLQlkZXZfZ2VvKGljZC0+ZGV2LnBhcmVudCwKKwlkZXZfZ2VvKGljZC0+cGFyZW50LAogCQkiQ0FNT1IgMHgleCwgQ0FQV1IgMHgleCwgQ0ZTWlIgMHgleCwgQ0RXRFIgMHgleFxuIiwgY2Ftb3IsCiAJCShpbl9oZWlnaHQgPDwgMTYpIHwgaW5fd2lkdGgsIChoZWlnaHQgPDwgMTYpIHwgd2lkdGgsCiAJCWNkd2RyX3dpZHRoKTsKQEAgLTY5Nyw3ICs3MjcsNyBAQAogc3RhdGljIGludCBzaF9tb2JpbGVfY2V1X3NldF9idXNfcGFyYW0oc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCiAJCQkJICAgICAgIF9fdTMyIHBpeGZtdCkKIHsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCBzaF9tb2JpbGVfY2V1X2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBsb25nIGNhbWVyYV9mbGFncywgY29tbW9uX2ZsYWdzLCB2YWx1ZTsKQEAgLTc4Myw3ICs4MTMsNyBAQAogCXZhbHVlIHw9IHBjZGV2LT5pc18xNmJpdCA/IDEgPDwgMTIgOiAwOwogCiAJLyogQ1NJMiBtb2RlICovCi0JaWYgKHBjZGV2LT5wZGF0YS0+Y3NpMl9kZXYpCisJaWYgKHBjZGV2LT5wZGF0YS0+Y3NpMikKIAkJdmFsdWUgfD0gMyA8PCAxMjsKIAogCWNldV93cml0ZShwY2RldiwgQ0FNQ1IsIHZhbHVlKTsKQEAgLTgwNiw3ICs4MzYsNyBAQAogCXNoX21vYmlsZV9jZXVfc2V0X3JlY3QoaWNkKTsKIAltZGVsYXkoMSk7CiAKLQlkZXZfZ2VvKGljZC0+ZGV2LnBhcmVudCwgIkNGTENSIDB4JXhcbiIsIHBjZGV2LT5jZmxjcik7CisJZGV2X2dlbyhpY2QtPnBhcmVudCwgIkNGTENSIDB4JXhcbiIsIHBjZGV2LT5jZmxjcik7CiAJY2V1X3dyaXRlKHBjZGV2LCBDRkxDUiwgcGNkZXYtPmNmbGNyKTsKIAogCS8qCkBAIC04MjksNyArODU5LDcgQEAKIAljZXVfd3JpdGUocGNkZXYsIENET0NSLCB2YWx1ZSk7CiAJY2V1X3dyaXRlKHBjZGV2LCBDRldDUiwgMCk7IC8qIGtlZXAgImRhdGFmZXRjaCBmaXJld2FsbCIgZGlzYWJsZWQgKi8KIAotCWRldl9kYmcoaWNkLT5kZXYucGFyZW50LCAiU19GTVQgc3VjY2Vzc2Z1bCBmb3IgJWMlYyVjJWMgJXV4JXVcbiIsCisJZGV2X2RiZyhpY2QtPnBhcmVudCwgIlNfRk1UIHN1Y2Nlc3NmdWwgZm9yICVjJWMlYyVjICV1eCV1XG4iLAogCQlwaXhmbXQgJiAweGZmLCAocGl4Zm10ID4+IDgpICYgMHhmZiwKIAkJKHBpeGZtdCA+PiAxNikgJiAweGZmLCAocGl4Zm10ID4+IDI0KSAmIDB4ZmYsCiAJCWljZC0+dXNlcl93aWR0aCwgaWNkLT51c2VyX2hlaWdodCk7CkBAIC04NDMsNyArODczLDcgQEAKIHN0YXRpYyBpbnQgc2hfbW9iaWxlX2NldV90cnlfYnVzX3BhcmFtKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAogCQkJCSAgICAgICB1bnNpZ25lZCBjaGFyIGJ1c3dpZHRoKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAl1bnNpZ25lZCBsb25nIGNhbWVyYV9mbGFncywgY29tbW9uX2ZsYWdzOwogCkBAIC05MDEsNyArOTMxLDcgQEAKIAkJCQkgICAgIHN0cnVjdCBzb2NfY2FtZXJhX2Zvcm1hdF94bGF0ZSAqeGxhdGUpCiB7CiAJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5kZXYucGFyZW50OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGljZC0+cGFyZW50OwogCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChkZXYpOwogCXN0cnVjdCBzaF9tb2JpbGVfY2V1X2RldiAqcGNkZXYgPSBpY2ktPnByaXY7CiAJaW50IHJldCwgaywgbjsKQEAgLTkyMSw3ICs5NTEsNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoIXBjZGV2LT5wZGF0YS0+Y3NpMl9kZXYpIHsKKwlpZiAoIXBjZGV2LT5wZGF0YS0+Y3NpMikgewogCQlyZXQgPSBzaF9tb2JpbGVfY2V1X3RyeV9idXNfcGFyYW0oaWNkLCBmbXQtPmJpdHNfcGVyX3NhbXBsZSk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIDA7CkBAIC0xMjQ0LDcgKzEyNzQsNyBAQAogewogCXN0cnVjdCBzaF9tb2JpbGVfY2V1X2NhbSAqY2FtID0gaWNkLT5ob3N0X3ByaXY7CiAJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5kZXYucGFyZW50OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGljZC0+cGFyZW50OwogCXVuc2lnbmVkIGludCB3aWR0aCA9IG1mLT53aWR0aCwgaGVpZ2h0ID0gbWYtPmhlaWdodCwgdG1wX3csIHRtcF9oOwogCXVuc2lnbmVkIGludCBtYXhfd2lkdGgsIG1heF9oZWlnaHQ7CiAJc3RydWN0IHY0bDJfY3JvcGNhcCBjYXA7CkBAIC0xMzEzLDcgKzEzNDMsNyBAQAogCQkJYm9vbCBjZXVfY2FuX3NjYWxlKQogewogCXN0cnVjdCBzaF9tb2JpbGVfY2V1X2NhbSAqY2FtID0gaWNkLT5ob3N0X3ByaXY7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5kZXYucGFyZW50OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGljZC0+cGFyZW50OwogCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgbWZfdG1wID0gKm1mOwogCXVuc2lnbmVkIGludCBzY2FsZV9oLCBzY2FsZV92OwogCWludCByZXQ7CkBAIC0xMzYzLDEzICsxMzkzLDEzIEBACiAJCQkJICBzdHJ1Y3QgdjRsMl9jcm9wICphKQogewogCXN0cnVjdCB2NGwyX3JlY3QgKnJlY3QgPSAmYS0+YzsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpY2QtPnBhcmVudDsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoZGV2KTsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCXN0cnVjdCB2NGwyX2Nyb3AgY2FtX2Nyb3A7CiAJc3RydWN0IHNoX21vYmlsZV9jZXVfY2FtICpjYW0gPSBpY2QtPmhvc3RfcHJpdjsKIAlzdHJ1Y3QgdjRsMl9yZWN0ICpjYW1fcmVjdCA9ICZjYW1fY3JvcC5jOwogCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGljZC0+ZGV2LnBhcmVudDsKIAlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IG1mOwogCXVuc2lnbmVkIGludCBzY2FsZV9jYW1faCwgc2NhbGVfY2FtX3YsIHNjYWxlX2NldV9oLCBzY2FsZV9jZXVfdiwKIAkJb3V0X3dpZHRoLCBvdXRfaGVpZ2h0OwpAQCAtMTUxMSw3ICsxNTQxLDcgQEAKIAkJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4LCBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZikKIHsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9jYW0gKmNhbSA9IGljZC0+aG9zdF9wcml2OwotCXN0cnVjdCBkZXZpY2UgKmRldiA9IGljZC0+ZGV2LnBhcmVudDsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBpY2QtPnBhcmVudDsKIAlzdHJ1Y3QgdjRsMl9yZWN0ICpjYW1fc3VicmVjdCA9ICZjYW0tPnN1YnJlY3Q7CiAJdW5zaWduZWQgaW50IHNjYWxlX3YsIHNjYWxlX2g7CiAKQEAgLTE1NTUsMTIgKzE1ODUsMTIgQEAKIHN0YXRpYyBpbnQgc2hfbW9iaWxlX2NldV9zZXRfZm10KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAogCQkJCSBzdHJ1Y3QgdjRsMl9mb3JtYXQgKmYpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5wYXJlbnQ7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGRldik7CiAJc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9jYW0gKmNhbSA9IGljZC0+aG9zdF9wcml2OwogCXN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKnBpeCA9ICZmLT5mbXQucGl4OwogCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgbWY7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gaWNkLT5kZXYucGFyZW50OwogCV9fdTMyIHBpeGZtdCA9IHBpeC0+cGl4ZWxmb3JtYXQ7CiAJY29uc3Qgc3RydWN0IHNvY19jYW1lcmFfZm9ybWF0X3hsYXRlICp4bGF0ZTsKIAkvKiBLZWVwIENvbXBpbGVyIEhhcHB5ICovCkBAIC0xNjg0LDEyICsxNzE0LDEyIEBACiAJaW50IHdpZHRoLCBoZWlnaHQ7CiAJaW50IHJldDsKIAotCWRldl9nZW8oaWNkLT5kZXYucGFyZW50LCAiVFJZX0ZNVChwaXg9MHgleCwgJXV4JXUpXG4iLAorCWRldl9nZW8oaWNkLT5wYXJlbnQsICJUUllfRk1UKHBpeD0weCV4LCAldXgldSlcbiIsCiAJCSBwaXhmbXQsIHBpeC0+d2lkdGgsIHBpeC0+aGVpZ2h0KTsKIAogCXhsYXRlID0gc29jX2NhbWVyYV94bGF0ZV9ieV9mb3VyY2MoaWNkLCBwaXhmbXQpOwogCWlmICgheGxhdGUpIHsKLQkJZGV2X3dhcm4oaWNkLT5kZXYucGFyZW50LCAiRm9ybWF0ICV4IG5vdCBmb3VuZFxuIiwgcGl4Zm10KTsKKwkJZGV2X3dhcm4oaWNkLT5wYXJlbnQsICJGb3JtYXQgJXggbm90IGZvdW5kXG4iLCBwaXhmbXQpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTE3MDEsMTEgKzE3MzEsNiBAQAogCXdpZHRoID0gcGl4LT53aWR0aDsKIAloZWlnaHQgPSBwaXgtPmhlaWdodDsKIAotCXBpeC0+Ynl0ZXNwZXJsaW5lID0gc29jX21idXNfYnl0ZXNfcGVyX2xpbmUod2lkdGgsIHhsYXRlLT5ob3N0X2ZtdCk7Ci0JaWYgKChpbnQpcGl4LT5ieXRlc3BlcmxpbmUgPCAwKQotCQlyZXR1cm4gcGl4LT5ieXRlc3BlcmxpbmU7Ci0JcGl4LT5zaXplaW1hZ2UgPSBoZWlnaHQgKiBwaXgtPmJ5dGVzcGVybGluZTsKLQogCS8qIGxpbWl0IHRvIHNlbnNvciBjYXBhYmlsaXRpZXMgKi8KIAltZi53aWR0aAk9IHBpeC0+d2lkdGg7CiAJbWYuaGVpZ2h0CT0gcGl4LT5oZWlnaHQ7CkBAIC0xNzQxLDcgKzE3NjYsNyBAQAogCQkJCQkJCSB0cnlfbWJ1c19mbXQsICZtZik7CiAJCQlpZiAocmV0IDwgMCkgewogCQkJCS8qIFNob3VsZG4ndCBhY3R1YWxseSBoYXBwZW4uLi4gKi8KLQkJCQlkZXZfZXJyKGljZC0+ZGV2LnBhcmVudCwKKwkJCQlkZXZfZXJyKGljZC0+cGFyZW50LAogCQkJCQkiRklYTUU6IGNsaWVudCB0cnlfZm10KCkgPSAlZFxuIiwgcmV0KTsKIAkJCQlyZXR1cm4gcmV0OwogCQkJfQpAQCAtMTc1Myw3ICsxNzc4LDcgQEAKIAkJCXBpeC0+aGVpZ2h0ID0gaGVpZ2h0OwogCX0KIAotCWRldl9nZW8oaWNkLT5kZXYucGFyZW50LCAiJXMoKTogcmV0dXJuICVkLCBmbXQgMHgleCwgJXV4JXVcbiIsCisJZGV2X2dlbyhpY2QtPnBhcmVudCwgIiVzKCk6IHJldHVybiAlZCwgZm10IDB4JXgsICV1eCV1XG4iLAogCQlfX2Z1bmNfXywgcmV0LCBwaXgtPnBpeGVsZm9ybWF0LCBwaXgtPndpZHRoLCBwaXgtPmhlaWdodCk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMTc2Myw3ICsxNzg4LDcgQEAKIAkJCQkgICAgICBzdHJ1Y3QgdjRsMl9jcm9wICphKQogewogCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAl1MzIgb3V0X3dpZHRoID0gaWNkLT51c2VyX3dpZHRoLCBvdXRfaGVpZ2h0ID0gaWNkLT51c2VyX2hlaWdodDsKIAlpbnQgcmV0OwpAQCAtMTc3NSwxMyArMTgwMCwxMyBAQAogCS8qIFN0b3AgdGhlIGNsaWVudCAqLwogCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoc2QsIHZpZGVvLCBzX3N0cmVhbSwgMCk7CiAJaWYgKHJldCA8IDApCi0JCWRldl93YXJuKGljZC0+ZGV2LnBhcmVudCwKKwkJZGV2X3dhcm4oaWNkLT5wYXJlbnQsCiAJCQkgIkNsaWVudCBmYWlsZWQgdG8gc3RvcCB0aGUgc3RyZWFtOiAlZFxuIiwgcmV0KTsKIAllbHNlCiAJCS8qIERvIHRoZSBjcm9wLCBpZiBpdCBmYWlscywgdGhlcmUncyBub3RoaW5nIG1vcmUgd2UgY2FuIGRvICovCiAJCXNoX21vYmlsZV9jZXVfc2V0X2Nyb3AoaWNkLCBhKTsKIAotCWRldl9nZW8oaWNkLT5kZXYucGFyZW50LCAiT3V0cHV0IGFmdGVyIGNyb3A6ICV1eCV1XG4iLCBpY2QtPnVzZXJfd2lkdGgsIGljZC0+dXNlcl9oZWlnaHQpOworCWRldl9nZW8oaWNkLT5wYXJlbnQsICJPdXRwdXQgYWZ0ZXIgY3JvcDogJXV4JXVcbiIsIGljZC0+dXNlcl93aWR0aCwgaWNkLT51c2VyX2hlaWdodCk7CiAKIAlpZiAoaWNkLT51c2VyX3dpZHRoICE9IG91dF93aWR0aCB8fCBpY2QtPnVzZXJfaGVpZ2h0ICE9IG91dF9oZWlnaHQpIHsKIAkJc3RydWN0IHY0bDJfZm9ybWF0IGYgPSB7CkBAIC0xODI3LDcgKzE4NTIsNiBAQAogCQkJCSAgc3RydWN0IHY0bDJfY2FwYWJpbGl0eSAqY2FwKQogewogCXN0cmxjcHkoY2FwLT5jYXJkLCAiU3VwZXJIX01vYmlsZV9DRVUiLCBzaXplb2YoY2FwLT5jYXJkKSk7Ci0JY2FwLT52ZXJzaW9uID0gS0VSTkVMX1ZFUlNJT04oMCwgMCwgNSk7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwgVjRMMl9DQVBfU1RSRUFNSU5HOwogCXJldHVybiAwOwogfQpAQCAtMTg0OCw3ICsxODcyLDcgQEAKIHN0YXRpYyBpbnQgc2hfbW9iaWxlX2NldV9nZXRfY3RybChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKIAkJCQkgIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9kZXYgKnBjZGV2ID0gaWNpLT5wcml2OwogCXUzMiB2YWw7CiAKQEAgLTE4NjQsNyArMTg4OCw3IEBACiBzdGF0aWMgaW50IHNoX21vYmlsZV9jZXVfc2V0X2N0cmwoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QsCiAJCQkJICBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHNoX21vYmlsZV9jZXVfZGV2ICpwY2RldiA9IGljaS0+cHJpdjsKIAogCXN3aXRjaCAoY3RybC0+aWQpIHsKQEAgLTE5NTAsNyArMTk3NCw3IEBACiAJCS5jb21wbGV0aW9uID0gQ09NUExFVElPTl9JTklUSUFMSVpFUl9PTlNUQUNLKHdhaXQuY29tcGxldGlvbiksCiAJCS5ub3RpZmllci5ub3RpZmllcl9jYWxsID0gYnVzX25vdGlmeSwKIAl9OwotCXN0cnVjdCBkZXZpY2UgKmNzaTI7CisJc3RydWN0IHNoX21vYmlsZV9jZXVfY29tcGFuaW9uICpjc2kyOwogCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwpAQCAtMjAyMywyNiArMjA0Nyw2MSBAQAogCXBjZGV2LT5pY2kuZHJ2X25hbWUgPSBkZXZfbmFtZSgmcGRldi0+ZGV2KTsKIAlwY2Rldi0+aWNpLm9wcyA9ICZzaF9tb2JpbGVfY2V1X2hvc3Rfb3BzOwogCisJcGNkZXYtPmFsbG9jX2N0eCA9IHZiMl9kbWFfY29udGlnX2luaXRfY3R4KCZwZGV2LT5kZXYpOworCWlmIChJU19FUlIocGNkZXYtPmFsbG9jX2N0eCkpIHsKKwkJZXJyID0gUFRSX0VSUihwY2Rldi0+YWxsb2NfY3R4KTsKKwkJZ290byBleGl0X2ZyZWVfY2xrOworCX0KKworCWVyciA9IHNvY19jYW1lcmFfaG9zdF9yZWdpc3RlcigmcGNkZXYtPmljaSk7CisJaWYgKGVycikKKwkJZ290byBleGl0X2ZyZWVfY3R4OworCiAJLyogQ1NJMiBpbnRlcmZhY2luZyAqLwotCWNzaTIgPSBwY2Rldi0+cGRhdGEtPmNzaTJfZGV2OworCWNzaTIgPSBwY2Rldi0+cGRhdGEtPmNzaTI7CiAJaWYgKGNzaTIpIHsKLQkJd2FpdC5kZXYgPSBjc2kyOworCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpjc2kyX3BkZXYgPQorCQkJcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJzaC1tb2JpbGUtY3NpMiIsIGNzaTItPmlkKTsKKwkJc3RydWN0IHNoX2NzaTJfcGRhdGEgKmNzaTJfcGRhdGEgPSBjc2kyLT5wbGF0Zm9ybV9kYXRhOworCisJCWlmICghY3NpMl9wZGV2KSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBleGl0X2hvc3RfdW5yZWdpc3RlcjsKKwkJfQorCisJCXBjZGV2LT5jc2kyX3BkZXYJCT0gY3NpMl9wZGV2OworCisJCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGRfZGF0YShjc2kyX3BkZXYsIGNzaTJfcGRhdGEsIHNpemVvZigqY3NpMl9wZGF0YSkpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZXhpdF9wZGV2X3B1dDsKKworCQljc2kyX3BkYXRhCQkJPSBjc2kyX3BkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCQljc2kyX3BkYXRhLT52NGwyX2RldgkJPSAmcGNkZXYtPmljaS52NGwyX2RldjsKKworCQljc2kyX3BkZXYtPnJlc291cmNlCQk9IGNzaTItPnJlc291cmNlOworCQljc2kyX3BkZXYtPm51bV9yZXNvdXJjZXMJPSBjc2kyLT5udW1fcmVzb3VyY2VzOworCisJCWVyciA9IHBsYXRmb3JtX2RldmljZV9hZGQoY3NpMl9wZGV2KTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIGV4aXRfcGRldl9wdXQ7CisKKwkJd2FpdC5kZXYgPSAmY3NpMl9wZGV2LT5kZXY7CiAKIAkJZXJyID0gYnVzX3JlZ2lzdGVyX25vdGlmaWVyKCZwbGF0Zm9ybV9idXNfdHlwZSwgJndhaXQubm90aWZpZXIpOwogCQlpZiAoZXJyIDwgMCkKLQkJCWdvdG8gZXhpdF9mcmVlX2NsazsKKwkJCWdvdG8gZXhpdF9wZGV2X3VucmVnaXN0ZXI7CiAKIAkJLyoKIAkJICogRnJvbSB0aGlzIHBvaW50IHRoZSBkcml2ZXIgbW9kdWxlIHdpbGwgbm90IHVubG9hZCwgdW50aWwKIAkJICogd2UgY29tcGxldGUgdGhlIGNvbXBsZXRpb24uCiAJCSAqLwogCi0JCWlmICghY3NpMi0+ZHJpdmVyKSB7CisJCWlmICghY3NpMl9wZGV2LT5kZXYuZHJpdmVyKSB7CiAJCQljb21wbGV0ZSgmd2FpdC5jb21wbGV0aW9uKTsKIAkJCS8qIEVpdGhlciB0b28gbGF0ZSwgb3IgcHJvYmluZyBmYWlsZWQgKi8KIAkJCWJ1c191bnJlZ2lzdGVyX25vdGlmaWVyKCZwbGF0Zm9ybV9idXNfdHlwZSwgJndhaXQubm90aWZpZXIpOwogCQkJZXJyID0gLUVOWElPOwotCQkJZ290byBleGl0X2ZyZWVfY2xrOworCQkJZ290byBleGl0X3BkZXZfdW5yZWdpc3RlcjsKIAkJfQogCiAJCS8qCkBAIC0yMDUxLDM0ICsyMTEwLDI4IEBACiAJCSAqIHRoZSAib3duZXIiIGlzIHNhZmUhCiAJCSAqLwogCi0JCWVyciA9IHRyeV9tb2R1bGVfZ2V0KGNzaTItPmRyaXZlci0+b3duZXIpOworCQllcnIgPSB0cnlfbW9kdWxlX2dldChjc2kyX3BkZXYtPmRldi5kcml2ZXItPm93bmVyKTsKIAogCQkvKiBMZXQgbm90aWZpZXIgY29tcGxldGUsIGlmIGl0IGhhcyBiZWVuIGxvY2tlZCAqLwogCQljb21wbGV0ZSgmd2FpdC5jb21wbGV0aW9uKTsKIAkJYnVzX3VucmVnaXN0ZXJfbm90aWZpZXIoJnBsYXRmb3JtX2J1c190eXBlLCAmd2FpdC5ub3RpZmllcik7CiAJCWlmICghZXJyKSB7CiAJCQllcnIgPSAtRU5PREVWOwotCQkJZ290byBleGl0X2ZyZWVfY2xrOworCQkJZ290byBleGl0X3BkZXZfdW5yZWdpc3RlcjsKIAkJfQogCX0KIAotCXBjZGV2LT5hbGxvY19jdHggPSB2YjJfZG1hX2NvbnRpZ19pbml0X2N0eCgmcGRldi0+ZGV2KTsKLQlpZiAoSVNfRVJSKHBjZGV2LT5hbGxvY19jdHgpKSB7Ci0JCWVyciA9IFBUUl9FUlIocGNkZXYtPmFsbG9jX2N0eCk7Ci0JCWdvdG8gZXhpdF9tb2R1bGVfcHV0OwotCX0KLQotCWVyciA9IHNvY19jYW1lcmFfaG9zdF9yZWdpc3RlcigmcGNkZXYtPmljaSk7Ci0JaWYgKGVycikKLQkJZ290byBleGl0X2ZyZWVfY3R4OwotCiAJcmV0dXJuIDA7CiAKK2V4aXRfcGRldl91bnJlZ2lzdGVyOgorCXBsYXRmb3JtX2RldmljZV9kZWwocGNkZXYtPmNzaTJfcGRldik7CitleGl0X3BkZXZfcHV0OgorCXBjZGV2LT5jc2kyX3BkZXYtPnJlc291cmNlID0gTlVMTDsKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KHBjZGV2LT5jc2kyX3BkZXYpOworZXhpdF9ob3N0X3VucmVnaXN0ZXI6CisJc29jX2NhbWVyYV9ob3N0X3VucmVnaXN0ZXIoJnBjZGV2LT5pY2kpOwogZXhpdF9mcmVlX2N0eDoKIAl2YjJfZG1hX2NvbnRpZ19jbGVhbnVwX2N0eChwY2Rldi0+YWxsb2NfY3R4KTsKLWV4aXRfbW9kdWxlX3B1dDoKLQlpZiAoY3NpMiAmJiBjc2kyLT5kcml2ZXIpCi0JCW1vZHVsZV9wdXQoY3NpMi0+ZHJpdmVyLT5vd25lcik7CiBleGl0X2ZyZWVfY2xrOgogCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKIAlmcmVlX2lycShwY2Rldi0+aXJxLCBwY2Rldik7CkBAIC0yMDk4LDcgKzIxNTEsNyBAQAogCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKnNvY19ob3N0ID0gdG9fc29jX2NhbWVyYV9ob3N0KCZwZGV2LT5kZXYpOwogCXN0cnVjdCBzaF9tb2JpbGVfY2V1X2RldiAqcGNkZXYgPSBjb250YWluZXJfb2Yoc29jX2hvc3QsCiAJCQkJCXN0cnVjdCBzaF9tb2JpbGVfY2V1X2RldiwgaWNpKTsKLQlzdHJ1Y3QgZGV2aWNlICpjc2kyID0gcGNkZXYtPnBkYXRhLT5jc2kyX2RldjsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpjc2kyX3BkZXYgPSBwY2Rldi0+Y3NpMl9wZGV2OwogCiAJc29jX2NhbWVyYV9ob3N0X3VucmVnaXN0ZXIoc29jX2hvc3QpOwogCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKQEAgLTIxMDcsOCArMjE2MCwxMyBAQAogCQlkbWFfcmVsZWFzZV9kZWNsYXJlZF9tZW1vcnkoJnBkZXYtPmRldik7CiAJaW91bm1hcChwY2Rldi0+YmFzZSk7CiAJdmIyX2RtYV9jb250aWdfY2xlYW51cF9jdHgocGNkZXYtPmFsbG9jX2N0eCk7Ci0JaWYgKGNzaTIgJiYgY3NpMi0+ZHJpdmVyKQotCQltb2R1bGVfcHV0KGNzaTItPmRyaXZlci0+b3duZXIpOworCWlmIChjc2kyX3BkZXYgJiYgY3NpMl9wZGV2LT5kZXYuZHJpdmVyKSB7CisJCXN0cnVjdCBtb2R1bGUgKmNzaTJfZHJ2ID0gY3NpMl9wZGV2LT5kZXYuZHJpdmVyLT5vd25lcjsKKwkJcGxhdGZvcm1fZGV2aWNlX2RlbChjc2kyX3BkZXYpOworCQljc2kyX3BkZXYtPnJlc291cmNlID0gTlVMTDsKKwkJcGxhdGZvcm1fZGV2aWNlX3B1dChjc2kyX3BkZXYpOworCQltb2R1bGVfcHV0KGNzaTJfZHJ2KTsKKwl9CiAJa2ZyZWUocGNkZXYpOwogCiAJcmV0dXJuIDA7CkBAIC0yMTU4LDQgKzIyMTYsNSBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJTdXBlckggTW9iaWxlIENFVSBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIk1hZ251cyBEYW1tIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfVkVSU0lPTigiMC4wLjYiKTsKIE1PRFVMRV9BTElBUygicGxhdGZvcm06c2hfbW9iaWxlX2NldSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zaF9tb2JpbGVfY3NpMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zaF9tb2JpbGVfY3NpMi5jCmluZGV4IDk4Yjg3NDguLjI4OTNhMDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2hfbW9iaWxlX2NzaTIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX21vYmlsZV9jc2kyLmMKQEAgLTE2LDYgKzE2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9zaF9tb2JpbGVfY2V1Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc2hfbW9iaWxlX2NzaTIuaD4KICNpbmNsdWRlIDxtZWRpYS9zb2NfY2FtZXJhLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KQEAgLTMzLDcgKzM0LDYgQEAKIHN0cnVjdCBzaF9jc2kyIHsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYJCXN1YmRldjsKIAlzdHJ1Y3QgbGlzdF9oZWFkCQlsaXN0OwotCXN0cnVjdCBub3RpZmllcl9ibG9jawkJbm90aWZpZXI7CiAJdW5zaWduZWQgaW50CQkJaXJxOwogCXZvaWQgX19pb21lbQkJCSpiYXNlOwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJCSpwZGV2OwpAQCAtMTMyLDEzICsxMzIsNiBAQAogCS50cnlfbWJ1c19mbXQJPSBzaF9jc2kyX3RyeV9mbXQsCiB9OwogCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X2NvcmVfb3BzIHNoX2NzaTJfc3ViZGV2X2NvcmVfb3BzOwotCi1zdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBzaF9jc2kyX3N1YmRldl9vcHMgPSB7Ci0JLmNvcmUJPSAmc2hfY3NpMl9zdWJkZXZfY29yZV9vcHMsCi0JLnZpZGVvCT0gJnNoX2NzaTJfc3ViZGV2X3ZpZGVvX29wcywKLX07Ci0KIHN0YXRpYyB2b2lkIHNoX2NzaTJfaHdpbml0KHN0cnVjdCBzaF9jc2kyICpwcml2KQogewogCXN0cnVjdCBzaF9jc2kyX3BkYXRhICpwZGF0YSA9IHByaXYtPnBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwpAQCAtMTg2LDY1ICsxNzksODQgQEAKIAlyZXR1cm4gc29jX2NhbWVyYV9hcHBseV9zZW5zb3JfZmxhZ3MoaWNsLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBpbnQgc2hfY3NpMl9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKLQkJCSAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IHNoX2NzaTJfY2xpZW50X2Nvbm5lY3Qoc3RydWN0IHNoX2NzaTIgKnByaXYpCiB7Ci0Jc3RydWN0IGRldmljZSAqZGV2ID0gZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHRvX3NvY19jYW1lcmFfZGV2KGRldik7Ci0Jc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYtPnBhcmVudCk7Ci0Jc3RydWN0IHNoX2NzaTIgKnByaXYgPQotCQljb250YWluZXJfb2YobmIsIHN0cnVjdCBzaF9jc2kyLCBub3RpZmllcik7CiAJc3RydWN0IHNoX2NzaTJfcGRhdGEgKnBkYXRhID0gcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaW50IHJldCwgaTsKKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCAqY3NpMl9zZCA9ICZwcml2LT5zdWJkZXY7CisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBOVUxMOworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHY0bDJfZ2V0X3N1YmRldmRhdGEoJnByaXYtPnN1YmRldik7CisJaW50IGk7CisKKwl2NGwyX2RldmljZV9mb3JfZWFjaF9zdWJkZXYoc2QsIGNzaTJfc2QtPnY0bDJfZGV2KQorCQlpZiAoc2QtPmdycF9pZCkgeworCQkJaWNkID0gKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqKXNkLT5ncnBfaWQ7CisJCQlicmVhazsKKwkJfQorCisJaWYgKCFpY2QpCisJCXJldHVybiAtRUlOVkFMOwogCiAJZm9yIChpID0gMDsgaSA8IHBkYXRhLT5udW1fY2xpZW50czsgaSsrKQogCQlpZiAoJnBkYXRhLT5jbGllbnRzW2ldLnBkZXYtPmRldiA9PSBpY2QtPnBkZXYpCiAJCQlicmVhazsKIAotCWRldl9kYmcoZGV2LCAiJXMoJXApOiBhY3Rpb24gPSAlbHUsIGZvdW5kICMlZFxuIiwgX19mdW5jX18sIGRldiwgYWN0aW9uLCBpKTsKKwlkZXZfZGJnKGRldiwgIiVzKCVwKTogZm91bmQgIyVkXG4iLCBfX2Z1bmNfXywgZGV2LCBpKTsKIAogCWlmIChpID09IHBkYXRhLT5udW1fY2xpZW50cykKLQkJcmV0dXJuIE5PVElGWV9ET05FOworCQlyZXR1cm4gLUVOT0RFVjsKIAotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBCVVNfTk9USUZZX0JPVU5EX0RSSVZFUjoKLQkJc25wcmludGYocHJpdi0+c3ViZGV2Lm5hbWUsIFY0TDJfU1VCREVWX05BTUVfU0laRSwgIiVzJXMiLAotCQkJIGRldl9uYW1lKHY0bDJfZGV2LT5kZXYpLCAiLm1pcGktY3NpIik7Ci0JCXByaXYtPnN1YmRldi5ncnBfaWQgPSAobG9uZylpY2Q7Ci0JCXJldCA9IHY0bDJfZGV2aWNlX3JlZ2lzdGVyX3N1YmRldih2NGwyX2RldiwgJnByaXYtPnN1YmRldik7Ci0JCWRldl9kYmcoZGV2LCAiJXMoJXApOiByZXQocmVnaXN0ZXJfc3ViZGV2KSA9ICVkXG4iLCBfX2Z1bmNfXywgcHJpdiwgcmV0KTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gTk9USUZZX0RPTkU7CisJcHJpdi0+Y2xpZW50ID0gcGRhdGEtPmNsaWVudHMgKyBpOwogCi0JCXByaXYtPmNsaWVudCA9IHBkYXRhLT5jbGllbnRzICsgaTsKKwlwcml2LT5zZXRfYnVzX3BhcmFtCQk9IGljZC0+b3BzLT5zZXRfYnVzX3BhcmFtOworCXByaXYtPnF1ZXJ5X2J1c19wYXJhbQkJPSBpY2QtPm9wcy0+cXVlcnlfYnVzX3BhcmFtOworCWljZC0+b3BzLT5zZXRfYnVzX3BhcmFtCQk9IHNoX2NzaTJfc2V0X2J1c19wYXJhbTsKKwlpY2QtPm9wcy0+cXVlcnlfYnVzX3BhcmFtCT0gc2hfY3NpMl9xdWVyeV9idXNfcGFyYW07CiAKLQkJcHJpdi0+c2V0X2J1c19wYXJhbQkJPSBpY2QtPm9wcy0+c2V0X2J1c19wYXJhbTsKLQkJcHJpdi0+cXVlcnlfYnVzX3BhcmFtCQk9IGljZC0+b3BzLT5xdWVyeV9idXNfcGFyYW07Ci0JCWljZC0+b3BzLT5zZXRfYnVzX3BhcmFtCQk9IHNoX2NzaTJfc2V0X2J1c19wYXJhbTsKLQkJaWNkLT5vcHMtPnF1ZXJ5X2J1c19wYXJhbQk9IHNoX2NzaTJfcXVlcnlfYnVzX3BhcmFtOworCWNzaTJfc2QtPmdycF9pZCA9IChsb25nKWljZDsKIAotCQlwbV9ydW50aW1lX2dldF9zeW5jKHY0bDJfZ2V0X3N1YmRldmRhdGEoJnByaXYtPnN1YmRldikpOworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoZGV2KTsKIAotCQlzaF9jc2kyX2h3aW5pdChwcml2KTsKLQkJYnJlYWs7Ci0JY2FzZSBCVVNfTk9USUZZX1VOQklORF9EUklWRVI6Ci0JCXByaXYtPmNsaWVudCA9IE5VTEw7CisJc2hfY3NpMl9od2luaXQocHJpdik7CiAKLQkJLyogRHJpdmVyIGlzIGFib3V0IHRvIGJlIHVuYm91bmQgKi8KLQkJaWNkLT5vcHMtPnNldF9idXNfcGFyYW0JCT0gcHJpdi0+c2V0X2J1c19wYXJhbTsKLQkJaWNkLT5vcHMtPnF1ZXJ5X2J1c19wYXJhbQk9IHByaXYtPnF1ZXJ5X2J1c19wYXJhbTsKLQkJcHJpdi0+c2V0X2J1c19wYXJhbQkJPSBOVUxMOwotCQlwcml2LT5xdWVyeV9idXNfcGFyYW0JCT0gTlVMTDsKLQotCQl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldigmcHJpdi0+c3ViZGV2KTsKLQotCQlwbV9ydW50aW1lX3B1dCh2NGwyX2dldF9zdWJkZXZkYXRhKCZwcml2LT5zdWJkZXYpKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIE5PVElGWV9PSzsKKwlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgc2hfY3NpMl9jbGllbnRfZGlzY29ubmVjdChzdHJ1Y3Qgc2hfY3NpMiAqcHJpdikKK3sKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKilwcml2LT5zdWJkZXYuZ3JwX2lkOworCisJcHJpdi0+Y2xpZW50ID0gTlVMTDsKKwlwcml2LT5zdWJkZXYuZ3JwX2lkID0gMDsKKworCS8qIERyaXZlciBpcyBhYm91dCB0byBiZSB1bmJvdW5kICovCisJaWNkLT5vcHMtPnNldF9idXNfcGFyYW0JCT0gcHJpdi0+c2V0X2J1c19wYXJhbTsKKwlpY2QtPm9wcy0+cXVlcnlfYnVzX3BhcmFtCT0gcHJpdi0+cXVlcnlfYnVzX3BhcmFtOworCXByaXYtPnNldF9idXNfcGFyYW0JCT0gTlVMTDsKKwlwcml2LT5xdWVyeV9idXNfcGFyYW0JCT0gTlVMTDsKKworCXBtX3J1bnRpbWVfcHV0KHY0bDJfZ2V0X3N1YmRldmRhdGEoJnByaXYtPnN1YmRldikpOworfQorCitzdGF0aWMgaW50IHNoX2NzaTJfc19wb3dlcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgb24pCit7CisJc3RydWN0IHNoX2NzaTIgKnByaXYgPSBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCBzaF9jc2kyLCBzdWJkZXYpOworCisJaWYgKG9uKQorCQlyZXR1cm4gc2hfY3NpMl9jbGllbnRfY29ubmVjdChwcml2KTsKKworCXNoX2NzaTJfY2xpZW50X2Rpc2Nvbm5lY3QocHJpdik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgc2hfY3NpMl9zdWJkZXZfY29yZV9vcHMgPSB7CisJLnNfcG93ZXIJPSBzaF9jc2kyX3NfcG93ZXIsCit9OworCitzdGF0aWMgc3RydWN0IHY0bDJfc3ViZGV2X29wcyBzaF9jc2kyX3N1YmRldl9vcHMgPSB7CisJLmNvcmUJPSAmc2hfY3NpMl9zdWJkZXZfY29yZV9vcHMsCisJLnZpZGVvCT0gJnNoX2NzaTJfc3ViZGV2X3ZpZGVvX29wcywKK307CisKIHN0YXRpYyBfX2RldmluaXQgaW50IHNoX2NzaTJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKQEAgLTI3NCwxNCArMjg2LDYgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlwcml2LT5pcnEgPSBpcnE7Ci0JcHJpdi0+bm90aWZpZXIubm90aWZpZXJfY2FsbCA9IHNoX2NzaTJfbm90aWZ5OwotCi0JLyogV2UgTVVTVCBhdHRhY2ggYWZ0ZXIgdGhlIE1JUEkgc2Vuc29yICovCi0JcmV0ID0gYnVzX3JlZ2lzdGVyX25vdGlmaWVyKCZzb2NfY2FtZXJhX2J1c190eXBlLCAmcHJpdi0+bm90aWZpZXIpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJnBkZXYtPmRldiwgIkNTSTIgY2Fubm90IHJlZ2lzdGVyIG5vdGlmaWVyXG4iKTsKLQkJZ290byBlcm5vdGlmeTsKLQl9CiAKIAlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcyksIHBkZXYtPm5hbWUpKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNTSTIgcmVnaXN0ZXIgcmVnaW9uIGFscmVhZHkgY2xhaW1lZFxuIik7CkBAIC0yOTcsMTEgKzMwMSwxNyBAQAogCX0KIAogCXByaXYtPnBkZXYgPSBwZGV2OworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHByaXYpOwogCiAJdjRsMl9zdWJkZXZfaW5pdCgmcHJpdi0+c3ViZGV2LCAmc2hfY3NpMl9zdWJkZXZfb3BzKTsKIAl2NGwyX3NldF9zdWJkZXZkYXRhKCZwcml2LT5zdWJkZXYsICZwZGV2LT5kZXYpOwogCi0JcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcHJpdik7CisJc25wcmludGYocHJpdi0+c3ViZGV2Lm5hbWUsIFY0TDJfU1VCREVWX05BTUVfU0laRSwgIiVzLm1pcGktY3NpIiwKKwkJIGRldl9uYW1lKHBkYXRhLT52NGwyX2Rldi0+ZGV2KSk7CisJcmV0ID0gdjRsMl9kZXZpY2VfcmVnaXN0ZXJfc3ViZGV2KHBkYXRhLT52NGwyX2RldiwgJnByaXYtPnN1YmRldik7CisJZGV2X2RiZygmcGRldi0+ZGV2LCAiJXMoJXApOiByZXQocmVnaXN0ZXJfc3ViZGV2KSA9ICVkXG4iLCBfX2Z1bmNfXywgcHJpdiwgcmV0KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlc2RyZWc7CiAKIAlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKIApAQCAtMzA5LDExICszMTksMTEgQEAKIAogCXJldHVybiAwOwogCitlc2RyZWc6CisJaW91bm1hcChwcml2LT5iYXNlKTsKIGVyZW1hcDoKIAlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKIGVyZXFyZWc6Ci0JYnVzX3VucmVnaXN0ZXJfbm90aWZpZXIoJnNvY19jYW1lcmFfYnVzX3R5cGUsICZwcml2LT5ub3RpZmllcik7Ci1lcm5vdGlmeToKIAlrZnJlZShwcml2KTsKIAogCXJldHVybiByZXQ7CkBAIC0zMjQsNyArMzM0LDcgQEAKIAlzdHJ1Y3Qgc2hfY3NpMiAqcHJpdiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAotCWJ1c191bnJlZ2lzdGVyX25vdGlmaWVyKCZzb2NfY2FtZXJhX2J1c190eXBlLCAmcHJpdi0+bm90aWZpZXIpOworCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KCZwcml2LT5zdWJkZXYpOwogCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKIAlpb3VubWFwKHByaXYtPmJhc2UpOwogCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwpAQCAtMzM1LDggKzM0NSw5IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIF9fcmVmZGF0YSBzaF9jc2kyX3BkcnYgPSB7Ci0JLnJlbW92ZSAgPSBfX2RldmV4aXRfcChzaF9jc2kyX3JlbW92ZSksCi0JLmRyaXZlciAgPSB7CisJLnJlbW92ZQk9IF9fZGV2ZXhpdF9wKHNoX2NzaTJfcmVtb3ZlKSwKKwkucHJvYmUJPSBzaF9jc2kyX3Byb2JlLAorCS5kcml2ZXIJPSB7CiAJCS5uYW1lCT0gInNoLW1vYmlsZS1jc2kyIiwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJfSwKQEAgLTM0NCw3ICszNTUsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBzaF9jc2kyX2luaXQodm9pZCkKIHsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZzaF9jc2kyX3BkcnYsIHNoX2NzaTJfcHJvYmUpOworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNoX2NzaTJfcGRydik7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBzaF9jc2kyX2V4aXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2hfdm91LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX3ZvdS5jCmluZGV4IDA3Y2YwYzYuLjZhNzI5ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2hfdm91LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zaF92b3UuYwpAQCAtMTksNyArMTksNiBAQAogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc2hfdm91Lmg+CkBAIC0zOTMsNyArMzkyLDYgQEAKIAlkZXZfZGJnKHZvdV9maWxlLT52YnEuZGV2LCAiJXMoKVxuIiwgX19mdW5jX18pOwogCiAJc3RybGNweShjYXAtPmNhcmQsICJTdXBlckggVk9VIiwgc2l6ZW9mKGNhcC0+Y2FyZCkpOwotCWNhcC0+dmVyc2lvbiA9IEtFUk5FTF9WRVJTSU9OKDAsIDEsIDApOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fT1VUUFVUIHwgVjRMMl9DQVBfU1RSRUFNSU5HOwogCXJldHVybiAwOwogfQpAQCAtMTQ5MCw0ICsxNDg4LDUgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiU3VwZXJIIFZPVSBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIkd1ZW5uYWRpIExpYWtob3ZldHNraSA8Zy5saWFraG92ZXRza2lAZ214LmRlPiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX1ZFUlNJT04oIjAuMS4wIik7CiBNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnNoLXZvdSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDIuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyLmgKaW5kZXggY2JmYzQ0NC4uMjJlYTIxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDIuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NuOWMxMDIvc245YzEwMi5oCkBAIC0yMSw3ICsyMSw2IEBACiAjaWZuZGVmIF9TTjlDMTAyX0hfCiAjZGVmaW5lIF9TTjlDMTAyX0hfCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvdXNiLmg+CiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2NvcmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2NvcmUuYwppbmRleCAwZTA3YzQ5Li4xNmNiMDdjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zbjljMTAyL3NuOWMxMDJfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc245YzEwMi9zbjljMTAyX2NvcmUuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZS1mbGFncy5oPgogI2luY2x1ZGUgPGFzbS9ieXRlb3JkZXIuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgpAQCAtNDcsOCArNDgsNyBAQAogI2RlZmluZSBTTjlDMTAyX01PRFVMRV9BVVRIT1IgICAiKEMpIDIwMDQtMjAwNyBMdWNhIFJpc29saWEiCiAjZGVmaW5lIFNOOUMxMDJfQVVUSE9SX0VNQUlMICAgICI8bHVjYS5yaXNvbGlhQHN0dWRpby51bmliby5pdD4iCiAjZGVmaW5lIFNOOUMxMDJfTU9EVUxFX0xJQ0VOU0UgICJHUEwiCi0jZGVmaW5lIFNOOUMxMDJfTU9EVUxFX1ZFUlNJT04gICIxOjEuNDdwcmU0OSIKLSNkZWZpbmUgU045QzEwMl9NT0RVTEVfVkVSU0lPTl9DT0RFICBLRVJORUxfVkVSU0lPTigxLCAxLCA0NykKKyNkZWZpbmUgU045QzEwMl9NT0RVTEVfVkVSU0lPTiAgIjE6MS40OCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC0yMTU4LDcgKzIxNTgsNyBAQAogewogCXN0cnVjdCB2NGwyX2NhcGFiaWxpdHkgY2FwID0gewogCQkuZHJpdmVyID0gInNuOWMxMDIiLAotCQkudmVyc2lvbiA9IFNOOUMxMDJfTU9EVUxFX1ZFUlNJT05fQ09ERSwKKwkJLnZlcnNpb24gPSBMSU5VWF9WRVJTSU9OX0NPREUsCiAJCS5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwgVjRMMl9DQVBfUkVBRFdSSVRFIHwKIAkJCQlWNEwyX0NBUF9TVFJFQU1JTkcsCiAJfTsKQEAgLTMxODcsMTYgKzMxODcsOCBAQAogCWNhc2UgVklESU9DX1NfQVVESU86CiAJCXJldHVybiBzbjljMTAyX3ZpZGlvY19zX2F1ZGlvKGNhbSwgYXJnKTsKIAotCWNhc2UgVklESU9DX0dfU1REOgotCWNhc2UgVklESU9DX1NfU1REOgotCWNhc2UgVklESU9DX1FVRVJZU1REOgotCWNhc2UgVklESU9DX0VOVU1TVEQ6Ci0JY2FzZSBWSURJT0NfUVVFUllNRU5VOgotCWNhc2UgVklESU9DX0VOVU1fRlJBTUVJTlRFUlZBTFM6Ci0JCXJldHVybiAtRUlOVkFMOwotCiAJZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiAtRU5PVFRZOwogCiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zb2NfY2FtZXJhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NvY19jYW1lcmEuYwppbmRleCA0ZTRkNDEyLi41YmRmZTdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NvY19jYW1lcmEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NvY19jYW1lcmEuYwpAQCAtNjAsMTQgKzYwLDE0IEBACiAJCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShpY2wtPm51bV9yZWd1bGF0b3JzLAogCQkJCQkgICAgaWNsLT5yZWd1bGF0b3JzKTsKIAkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIoJmljZC0+ZGV2LCAiQ2Fubm90IGVuYWJsZSByZWd1bGF0b3JzXG4iKTsKKwkJCWRldl9lcnIoaWNkLT5wZGV2LCAiQ2Fubm90IGVuYWJsZSByZWd1bGF0b3JzXG4iKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAogCQlpZiAoaWNsLT5wb3dlcikKIAkJCXJldCA9IGljbC0+cG93ZXIoaWNkLT5wZGV2LCBwb3dlcl9vbik7CiAJCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKCZpY2QtPmRldiwKKwkJCWRldl9lcnIoaWNkLT5wZGV2LAogCQkJCSJQbGF0Zm9ybSBmYWlsZWQgdG8gcG93ZXItb24gdGhlIGNhbWVyYS5cbiIpOwogCiAJCQlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKGljbC0+bnVtX3JlZ3VsYXRvcnMsCkBAIC03OSw3ICs3OSw3IEBACiAJCWlmIChpY2wtPnBvd2VyKQogCQkJcmV0ID0gaWNsLT5wb3dlcihpY2QtPnBkZXYsIDApOwogCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycigmaWNkLT5kZXYsCisJCQlkZXZfZXJyKGljZC0+cGRldiwKIAkJCQkiUGxhdGZvcm0gZmFpbGVkIHRvIHBvd2VyLW9mZiB0aGUgY2FtZXJhLlxuIik7CiAJCQlyZXR1cm4gcmV0OwogCQl9CkBAIC04Nyw3ICs4Nyw3IEBACiAJCXJldCA9IHJlZ3VsYXRvcl9idWxrX2Rpc2FibGUoaWNsLT5udW1fcmVndWxhdG9ycywKIAkJCQkJICAgICBpY2wtPnJlZ3VsYXRvcnMpOwogCQlpZiAocmV0IDwgMCkgewotCQkJZGV2X2VycigmaWNkLT5kZXYsICJDYW5ub3QgZGlzYWJsZSByZWd1bGF0b3JzXG4iKTsKKwkJCWRldl9lcnIoaWNkLT5wZGV2LCAiQ2Fubm90IGRpc2FibGUgcmVndWxhdG9yc1xuIik7CiAJCQlyZXR1cm4gcmV0OwogCQl9CiAJfQpAQCAtMTQ3LDExICsxNDcsMTEgQEAKIHN0YXRpYyBpbnQgc29jX2NhbWVyYV90cnlfZm10KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAogCQkJICAgICAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4ID0gJmYtPmZtdC5waXg7CiAJaW50IHJldDsKIAotCWRldl9kYmcoJmljZC0+ZGV2LCAiVFJZX0ZNVCglYyVjJWMlYywgJXV4JXUpXG4iLAorCWRldl9kYmcoaWNkLT5wZGV2LCAiVFJZX0ZNVCglYyVjJWMlYywgJXV4JXUpXG4iLAogCQlwaXhmbXRzdHIocGl4LT5waXhlbGZvcm1hdCksIHBpeC0+d2lkdGgsIHBpeC0+aGVpZ2h0KTsKIAogCXBpeC0+Ynl0ZXNwZXJsaW5lID0gMDsKQEAgLTE5OSwyMiArMTk5LDE1IEBACiBzdGF0aWMgaW50IHNvY19jYW1lcmFfZW51bV9pbnB1dChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKIAkJCQkgc3RydWN0IHY0bDJfaW5wdXQgKmlucCkKIHsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcmV0ID0gMDsKLQogCWlmIChpbnAtPmluZGV4ICE9IDApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGljZC0+b3BzLT5lbnVtX2lucHV0KQotCQlyZXQgPSBpY2QtPm9wcy0+ZW51bV9pbnB1dChpY2QsIGlucCk7Ci0JZWxzZSB7Ci0JCS8qIGRlZmF1bHQgaXMgY2FtZXJhICovCi0JCWlucC0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9DQU1FUkE7Ci0JCWlucC0+c3RkICA9IFY0TDJfU1REX1VOS05PV047Ci0JCXN0cmNweShpbnAtPm5hbWUsICJDYW1lcmEiKTsKLQl9CisJLyogZGVmYXVsdCBpcyBjYW1lcmEgKi8KKwlpbnAtPnR5cGUgPSBWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBOworCWlucC0+c3RkICA9IFY0TDJfU1REX1VOS05PV047CisJc3RyY3B5KGlucC0+bmFtZSwgIkNhbWVyYSIpOwogCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzb2NfY2FtZXJhX2dfaW5wdXQoc3RydWN0IGZpbGUgKmZpbGUsIHZvaWQgKnByaXYsIHVuc2lnbmVkIGludCAqaSkKQEAgLTI0NCw3ICsyMzcsNyBAQAogCQkJCQkgc3RydWN0IHY0bDJfZnJtc2l6ZWVudW0gKmZzaXplKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAKIAlyZXR1cm4gaWNpLT5vcHMtPmVudW1fZnNpemVzKGljZCwgZnNpemUpOwogfQpAQCAtMjU0LDcgKzI0Nyw3IEBACiB7CiAJaW50IHJldDsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCiAJV0FSTl9PTihwcml2ICE9IGZpbGUtPnByaXZhdGVfZGF0YSk7CiAKQEAgLTI4MSw3ICsyNzQsNyBAQAogCQkJICAgICAgIHN0cnVjdCB2NGwyX2J1ZmZlciAqcCkKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCiAJV0FSTl9PTihwcml2ICE9IGZpbGUtPnByaXZhdGVfZGF0YSk7CiAKQEAgLTI5NSw3ICsyODgsNyBAQAogCQkJICAgc3RydWN0IHY0bDJfYnVmZmVyICpwKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAKIAlXQVJOX09OKHByaXYgIT0gZmlsZS0+cHJpdmF0ZV9kYXRhKTsKIApAQCAtMzEyLDcgKzMwNSw3IEBACiAJCQkgICAgc3RydWN0IHY0bDJfYnVmZmVyICpwKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAKIAlXQVJOX09OKHByaXYgIT0gZmlsZS0+cHJpdmF0ZV9kYXRhKTsKIApAQCAtMzI5LDcgKzMyMiw3IEBACiBzdGF0aWMgaW50IHNvY19jYW1lcmFfaW5pdF91c2VyX2Zvcm1hdHMoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7CiAJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAl1bnNpZ25lZCBpbnQgaSwgZm10cyA9IDAsIHJhd19mbXRzID0gMDsKIAlpbnQgcmV0OwogCWVudW0gdjRsMl9tYnVzX3BpeGVsY29kZSBjb2RlOwpAQCAtMzYzLDcgKzM1Niw3IEBACiAJaWYgKCFpY2QtPnVzZXJfZm9ybWF0cykKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlkZXZfZGJnKCZpY2QtPmRldiwgIkZvdW5kICVkIHN1cHBvcnRlZCBmb3JtYXRzLlxuIiwgZm10cyk7CisJZGV2X2RiZyhpY2QtPnBkZXYsICJGb3VuZCAlZCBzdXBwb3J0ZWQgZm9ybWF0cy5cbiIsIGZtdHMpOwogCiAJLyogU2Vjb25kIHBhc3MgLSBhY3R1YWxseSBmaWxsIGRhdGEgZm9ybWF0cyAqLwogCWZtdHMgPSAwOwpAQCAtMzk1LDcgKzM4OCw3IEBACiAvKiBBbHdheXMgZW50ZXJlZCB3aXRoIC52aWRlb19sb2NrIGhlbGQgKi8KIHN0YXRpYyB2b2lkIHNvY19jYW1lcmFfZnJlZV91c2VyX2Zvcm1hdHMoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QpCiB7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAogCWlmIChpY2ktPm9wcy0+cHV0X2Zvcm1hdHMpCiAJCWljaS0+b3BzLT5wdXRfZm9ybWF0cyhpY2QpOwpAQCAtNDA5LDExICs0MDIsMTEgQEAKIHN0YXRpYyBpbnQgc29jX2NhbWVyYV9zZXRfZm10KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAogCQkJICAgICAgc3RydWN0IHY0bDJfZm9ybWF0ICpmKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHY0bDJfcGl4X2Zvcm1hdCAqcGl4ID0gJmYtPmZtdC5waXg7CiAJaW50IHJldDsKIAotCWRldl9kYmcoJmljZC0+ZGV2LCAiU19GTVQoJWMlYyVjJWMsICV1eCV1KVxuIiwKKwlkZXZfZGJnKGljZC0+cGRldiwgIlNfRk1UKCVjJWMlYyVjLCAldXgldSlcbiIsCiAJCXBpeGZtdHN0cihwaXgtPnBpeGVsZm9ybWF0KSwgcGl4LT53aWR0aCwgcGl4LT5oZWlnaHQpOwogCiAJLyogV2UgYWx3YXlzIGNhbGwgdHJ5X2ZtdCgpIGJlZm9yZSBzZXRfZm10KCkgb3Igc2V0X2Nyb3AoKSAqLwpAQCAtNDI2LDcgKzQxOSw3IEBACiAJCXJldHVybiByZXQ7CiAJfSBlbHNlIGlmICghaWNkLT5jdXJyZW50X2ZtdCB8fAogCQkgICBpY2QtPmN1cnJlbnRfZm10LT5ob3N0X2ZtdC0+Zm91cmNjICE9IHBpeC0+cGl4ZWxmb3JtYXQpIHsKLQkJZGV2X2VycigmaWNkLT5kZXYsCisJCWRldl9lcnIoaWNkLT5wZGV2LAogCQkJIkhvc3QgZHJpdmVyIGhhc24ndCBzZXQgdXAgY3VycmVudCBmb3JtYXQgY29ycmVjdGx5IVxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTQ0MCw3ICs0MzMsNyBAQAogCWlmIChpY2ktPm9wcy0+aW5pdF92aWRlb2J1ZikKIAkJaWNkLT52Yl92aWRxLmZpZWxkID0gcGl4LT5maWVsZDsKIAotCWRldl9kYmcoJmljZC0+ZGV2LCAic2V0IHdpZHRoOiAlZCBoZWlnaHQ6ICVkXG4iLAorCWRldl9kYmcoaWNkLT5wZGV2LCAic2V0IHdpZHRoOiAlZCBoZWlnaHQ6ICVkXG4iLAogCQlpY2QtPnVzZXJfd2lkdGgsIGljZC0+dXNlcl9oZWlnaHQpOwogCiAJLyogc2V0IHBoeXNpY2FsIGJ1cyBwYXJhbWV0ZXJzICovCkBAIC00NTAsOSArNDQzLDcgQEAKIHN0YXRpYyBpbnQgc29jX2NhbWVyYV9vcGVuKHN0cnVjdCBmaWxlICpmaWxlKQogewogCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSB2aWRlb19kZXZkYXRhKGZpbGUpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gY29udGFpbmVyX29mKHZkZXYtPnBhcmVudCwKLQkJCQkJCSAgICAgc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlLAotCQkJCQkJICAgICBkZXYpOworCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gZGV2X2dldF9kcnZkYXRhKHZkZXYtPnBhcmVudCk7CiAJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7CiAJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpOwogCWludCByZXQ7CkBAIC00NjEsMTAgKzQ1MiwxMCBAQAogCQkvKiBObyBkZXZpY2UgZHJpdmVyIGF0dGFjaGVkICovCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAogCWlmICghdHJ5X21vZHVsZV9nZXQoaWNpLT5vcHMtPm93bmVyKSkgewotCQlkZXZfZXJyKCZpY2QtPmRldiwgIkNvdWxkbid0IGxvY2sgY2FwdHVyZSBidXMgZHJpdmVyLlxuIik7CisJCWRldl9lcnIoaWNkLT5wZGV2LCAiQ291bGRuJ3QgbG9jayBjYXB0dXJlIGJ1cyBkcml2ZXIuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC00OTUsNyArNDg2LDcgQEAKIAogCQlyZXQgPSBpY2ktPm9wcy0+YWRkKGljZCk7CiAJCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKCZpY2QtPmRldiwgIkNvdWxkbid0IGFjdGl2YXRlIHRoZSBjYW1lcmE6ICVkXG4iLCByZXQpOworCQkJZGV2X2VycihpY2QtPnBkZXYsICJDb3VsZG4ndCBhY3RpdmF0ZSB0aGUgY2FtZXJhOiAlZFxuIiwgcmV0KTsKIAkJCWdvdG8gZWljaWFkZDsKIAkJfQogCkBAIC01MjQsNyArNTE1LDcgQEAKIAl9CiAKIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBpY2Q7Ci0JZGV2X2RiZygmaWNkLT5kZXYsICJjYW1lcmEgZGV2aWNlIG9wZW5cbiIpOworCWRldl9kYmcoaWNkLT5wZGV2LCAiY2FtZXJhIGRldmljZSBvcGVuXG4iKTsKIAogCXJldHVybiAwOwogCkBAIC01NDksNyArNTQwLDcgQEAKIHN0YXRpYyBpbnQgc29jX2NhbWVyYV9jbG9zZShzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCiAJaWNkLT51c2VfY291bnQtLTsKIAlpZiAoIWljZC0+dXNlX2NvdW50KSB7CkBAIC01NzAsNyArNTYxLDcgQEAKIAogCW1vZHVsZV9wdXQoaWNpLT5vcHMtPm93bmVyKTsKIAotCWRldl9kYmcoJmljZC0+ZGV2LCAiY2FtZXJhIGRldmljZSBjbG9zZVxuIik7CisJZGV2X2RiZyhpY2QtPnBkZXYsICJjYW1lcmEgZGV2aWNlIGNsb3NlXG4iKTsKIAogCXJldHVybiAwOwogfQpAQCAtNTgxLDcgKzU3Miw3IEBACiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJaW50IGVyciA9IC1FSU5WQUw7CiAKLQlkZXZfZXJyKCZpY2QtPmRldiwgImNhbWVyYSBkZXZpY2UgcmVhZCBub3QgaW1wbGVtZW50ZWRcbiIpOworCWRldl9lcnIoaWNkLT5wZGV2LCAiY2FtZXJhIGRldmljZSByZWFkIG5vdCBpbXBsZW1lbnRlZFxuIik7CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtNTg5LDEwICs1ODAsMTAgQEAKIHN0YXRpYyBpbnQgc29jX2NhbWVyYV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCWludCBlcnI7CiAKLQlkZXZfZGJnKCZpY2QtPmRldiwgIm1tYXAgY2FsbGVkLCB2bWE9MHglMDhseFxuIiwgKHVuc2lnbmVkIGxvbmcpdm1hKTsKKwlkZXZfZGJnKGljZC0+cGRldiwgIm1tYXAgY2FsbGVkLCB2bWE9MHglMDhseFxuIiwgKHVuc2lnbmVkIGxvbmcpdm1hKTsKIAogCWlmIChpY2QtPnN0cmVhbWVyICE9IGZpbGUpCiAJCXJldHVybiAtRUJVU1k7CkBAIC02MDIsNyArNTkzLDcgQEAKIAllbHNlCiAJCWVyciA9IHZiMl9tbWFwKCZpY2QtPnZiMl92aWRxLCB2bWEpOwogCi0JZGV2X2RiZygmaWNkLT5kZXYsICJ2bWEgc3RhcnQ9MHglMDhseCwgc2l6ZT0lbGQsIHJldD0lZFxuIiwKKwlkZXZfZGJnKGljZC0+cGRldiwgInZtYSBzdGFydD0weCUwOGx4LCBzaXplPSVsZCwgcmV0PSVkXG4iLAogCQkodW5zaWduZWQgbG9uZyl2bWEtPnZtX3N0YXJ0LAogCQkodW5zaWduZWQgbG9uZyl2bWEtPnZtX2VuZCAtICh1bnNpZ25lZCBsb25nKXZtYS0+dm1fc3RhcnQsCiAJCWVycik7CkBAIC02MTMsMTMgKzYwNCwxMyBAQAogc3RhdGljIHVuc2lnbmVkIGludCBzb2NfY2FtZXJhX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKnB0KQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAKIAlpZiAoaWNkLT5zdHJlYW1lciAhPSBmaWxlKQogCQlyZXR1cm4gLUVCVVNZOwogCiAJaWYgKGljaS0+b3BzLT5pbml0X3ZpZGVvYnVmICYmIGxpc3RfZW1wdHkoJmljZC0+dmJfdmlkcS5zdHJlYW0pKSB7Ci0JCWRldl9lcnIoJmljZC0+ZGV2LCAiVHJ5aW5nIHRvIHBvbGwgd2l0aCBubyBxdWV1ZWQgYnVmZmVycyFcbiIpOworCQlkZXZfZXJyKGljZC0+cGRldiwgIlRyeWluZyB0byBwb2xsIHdpdGggbm8gcXVldWVkIGJ1ZmZlcnMhXG4iKTsKIAkJcmV0dXJuIFBPTExFUlI7CiAJfQogCkBAIC02NTksMTUgKzY1MCwxNSBAQAogCVdBUk5fT04ocHJpdiAhPSBmaWxlLT5wcml2YXRlX2RhdGEpOwogCiAJaWYgKGYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKSB7Ci0JCWRldl93YXJuKCZpY2QtPmRldiwgIldyb25nIGJ1Zi10eXBlICVkXG4iLCBmLT50eXBlKTsKKwkJZGV2X3dhcm4oaWNkLT5wZGV2LCAiV3JvbmcgYnVmLXR5cGUgJWRcbiIsIGYtPnR5cGUpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlpZiAoaWNkLT5zdHJlYW1lciAmJiBpY2QtPnN0cmVhbWVyICE9IGZpbGUpCiAJCXJldHVybiAtRUJVU1k7CiAKLQlpZiAoaXNfc3RyZWFtaW5nKHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpLCBpY2QpKSB7Ci0JCWRldl9lcnIoJmljZC0+ZGV2LCAiU19GTVQgZGVuaWVkOiBxdWV1ZSBpbml0aWFsaXNlZFxuIik7CisJaWYgKGlzX3N0cmVhbWluZyh0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpLCBpY2QpKSB7CisJCWRldl9lcnIoaWNkLT5wZGV2LCAiU19GTVQgZGVuaWVkOiBxdWV1ZSBpbml0aWFsaXNlZFxuIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCkBAIC03MTYsNyArNzA3LDcgQEAKIAlwaXgtPmZpZWxkCQk9IGljZC0+ZmllbGQ7CiAJcGl4LT5waXhlbGZvcm1hdAk9IGljZC0+Y3VycmVudF9mbXQtPmhvc3RfZm10LT5mb3VyY2M7CiAJcGl4LT5jb2xvcnNwYWNlCQk9IGljZC0+Y29sb3JzcGFjZTsKLQlkZXZfZGJnKCZpY2QtPmRldiwgImN1cnJlbnRfZm10LT5mb3VyY2M6IDB4JTA4eFxuIiwKKwlkZXZfZGJnKGljZC0+cGRldiwgImN1cnJlbnRfZm10LT5mb3VyY2M6IDB4JTA4eFxuIiwKIAkJaWNkLT5jdXJyZW50X2ZtdC0+aG9zdF9mbXQtPmZvdXJjYyk7CiAJcmV0dXJuIDA7CiB9CkBAIC03MjUsNyArNzE2LDcgQEAKIAkJCSAgICAgICBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5ICpjYXApCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAogCVdBUk5fT04ocHJpdiAhPSBmaWxlLT5wcml2YXRlX2RhdGEpOwogCkBAIC03MzcsNyArNzI4LDcgQEAKIAkJCSAgICAgICBlbnVtIHY0bDJfYnVmX3R5cGUgaSkKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOwogCWludCByZXQ7CiAKQEAgLTc2Niw3ICs3NTcsNyBAQAogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAKIAlXQVJOX09OKHByaXYgIT0gZmlsZS0+cHJpdmF0ZV9kYXRhKTsKIApAQCAtNzk0LDcgKzc4NSw3IEBACiAJCQkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYykKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCWludCBpOwogCiAJV0FSTl9PTihwcml2ICE9IGZpbGUtPnByaXZhdGVfZGF0YSk7CkBAIC04MjUsNyArODE2LDcgQEAKIAkJCSAgICAgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCXN0cnVjdCB2NGwyX3N1YmRldiAqc2QgPSBzb2NfY2FtZXJhX3RvX3N1YmRldihpY2QpOwogCWludCByZXQ7CiAKQEAgLTg0NCw3ICs4MzUsNyBAQAogCQkJICAgICBzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHY0bDJfc3ViZGV2ICpzZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7CiAJaW50IHJldDsKIApAQCAtODYzLDcgKzg1NCw3IEBACiAJCQkgICAgICBzdHJ1Y3QgdjRsMl9jcm9wY2FwICphKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAKIAlyZXR1cm4gaWNpLT5vcHMtPmNyb3BjYXAoaWNkLCBhKTsKIH0KQEAgLTg3Miw3ICs4NjMsNyBAQAogCQkJICAgICBzdHJ1Y3QgdjRsMl9jcm9wICphKQogewogCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJaW50IHJldDsKIAogCXJldCA9IGljaS0+b3BzLT5nZXRfY3JvcChpY2QsIGEpOwpAQCAtODg5LDcgKzg4MCw3IEBACiAJCQkgICAgIHN0cnVjdCB2NGwyX2Nyb3AgKmEpCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAlzdHJ1Y3QgdjRsMl9yZWN0ICpyZWN0ID0gJmEtPmM7CiAJc3RydWN0IHY0bDJfY3JvcCBjdXJyZW50X2Nyb3A7CiAJaW50IHJldDsKQEAgLTg5Nyw3ICs4ODgsNyBAQAogCWlmIChhLT50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlkZXZfZGJnKCZpY2QtPmRldiwgIlNfQ1JPUCgldXgldUAldToldSlcbiIsCisJZGV2X2RiZyhpY2QtPnBkZXYsICJTX0NST1AoJXV4JXVAJXU6JXUpXG4iLAogCQlyZWN0LT53aWR0aCwgcmVjdC0+aGVpZ2h0LCByZWN0LT5sZWZ0LCByZWN0LT50b3ApOwogCiAJLyogSWYgZ2V0X2Nyb3AgZmFpbHMsIHdlJ2xsIGxldCBob3N0IGFuZCAvIG9yIGNsaWVudCBkcml2ZXJzIGRlY2lkZSAqLwpAQCAtOTA1LDcgKzg5Niw3IEBACiAKIAkvKiBQcm9oaWJpdCB3aW5kb3cgc2l6ZSBjaGFuZ2Ugd2l0aCBpbml0aWFsaXNlZCBidWZmZXJzICovCiAJaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmaWNkLT5kZXYsCisJCWRldl9lcnIoaWNkLT5wZGV2LAogCQkJIlNfQ1JPUCBkZW5pZWQ6IGdldHRpbmcgY3VycmVudCBjcm9wIGZhaWxlZFxuIik7CiAJfSBlbHNlIGlmICgoYS0+Yy53aWR0aCA9PSBjdXJyZW50X2Nyb3AuYy53aWR0aCAmJgogCQkgICAgYS0+Yy5oZWlnaHQgPT0gY3VycmVudF9jcm9wLmMuaGVpZ2h0KSB8fApAQCAtOTE1LDcgKzkwNiw3IEBACiAJfSBlbHNlIGlmIChpY2ktPm9wcy0+c2V0X2xpdmVjcm9wKSB7CiAJCXJldCA9IGljaS0+b3BzLT5zZXRfbGl2ZWNyb3AoaWNkLCBhKTsKIAl9IGVsc2UgewotCQlkZXZfZXJyKCZpY2QtPmRldiwKKwkJZGV2X2VycihpY2QtPnBkZXYsCiAJCQkiU19DUk9QIGRlbmllZDogcXVldWUgaW5pdGlhbGlzZWQgYW5kIHNpemVzIGRpZmZlclxuIik7CiAJCXJldCA9IC1FQlVTWTsKIAl9CkBAIC05MjcsNyArOTE4LDcgQEAKIAkJCSAgICAgc3RydWN0IHY0bDJfc3RyZWFtcGFybSAqYSkKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5wYXJlbnQpOwogCiAJaWYgKGljaS0+b3BzLT5nZXRfcGFybSkKIAkJcmV0dXJuIGljaS0+b3BzLT5nZXRfcGFybShpY2QsIGEpOwpAQCAtOTM5LDcgKzkzMCw3IEBACiAJCQkgICAgIHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0gKmEpCiB7CiAJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAogCWlmIChpY2ktPm9wcy0+c2V0X3Bhcm0pCiAJCXJldHVybiBpY2ktPm9wcy0+c2V0X3Bhcm0oaWNkLCBhKTsKQEAgLTk3Niw2ICs5NjcsOCBAQAogfQogI2VuZGlmCiAKK3N0YXRpYyBpbnQgc29jX2NhbWVyYV9wcm9iZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCk7CisKIC8qIFNvIGZhciB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBmYWlsICovCiBzdGF0aWMgdm9pZCBzY2FuX2FkZF9ob3N0KHN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSkKIHsKQEAgLTk4NiwxNSArOTc5LDkgQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGljZCwgJmRldmljZXMsIGxpc3QpIHsKIAkJaWYgKGljZC0+aWZhY2UgPT0gaWNpLT5ucikgewogCQkJaW50IHJldDsKLQkJCWljZC0+ZGV2LnBhcmVudCA9IGljaS0+djRsMl9kZXYuZGV2OwotCQkJZGV2X3NldF9uYW1lKCZpY2QtPmRldiwgIiV1LSV1IiwgaWNkLT5pZmFjZSwKLQkJCQkgICAgIGljZC0+ZGV2bnVtKTsKLQkJCXJldCA9IGRldmljZV9yZWdpc3RlcigmaWNkLT5kZXYpOwotCQkJaWYgKHJldCA8IDApIHsKLQkJCQlpY2QtPmRldi5wYXJlbnQgPSBOVUxMOwotCQkJCWRldl9lcnIoJmljZC0+ZGV2LAotCQkJCQkiQ2Fubm90IHJlZ2lzdGVyIGRldmljZTogJWRcbiIsIHJldCk7Ci0JCQl9CisKKwkJCWljZC0+cGFyZW50ID0gaWNpLT52NGwyX2Rldi5kZXY7CisJCQlyZXQgPSBzb2NfY2FtZXJhX3Byb2JlKGljZCk7CiAJCX0KIAl9CiAKQEAgLTEwMDYsMTIgKzk5MywxMiBAQAogCQkJICAgICAgIHN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKmljbCkKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50OwotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwID0gaTJjX2dldF9hZGFwdGVyKGljbC0+aTJjX2FkYXB0ZXJfaWQpOwogCXN0cnVjdCB2NGwyX3N1YmRldiAqc3ViZGV2OwogCiAJaWYgKCFhZGFwKSB7Ci0JCWRldl9lcnIoJmljZC0+ZGV2LCAiQ2Fubm90IGdldCBJMkMgYWRhcHRlciAjJWQuIE5vIGRyaXZlcj9cbiIsCisJCWRldl9lcnIoaWNkLT5wZGV2LCAiQ2Fubm90IGdldCBJMkMgYWRhcHRlciAjJWQuIE5vIGRyaXZlcj9cbiIsCiAJCQlpY2wtPmkyY19hZGFwdGVyX2lkKTsKIAkJZ290byBlaTJjZ2E7CiAJfQpAQCAtMTAyNiw3ICsxMDEzLDcgQEAKIAljbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHN1YmRldik7CiAKIAkvKiBVc2UgdG9faTJjX2NsaWVudChkZXYpIHRvIHJlY292ZXIgdGhlIGkyYyBjbGllbnQgKi8KLQlkZXZfc2V0X2RydmRhdGEoJmljZC0+ZGV2LCAmY2xpZW50LT5kZXYpOworCWljZC0+Y29udHJvbCA9ICZjbGllbnQtPmRldjsKIAogCXJldHVybiAwOwogZWkyY25kOgpAQCAtMTA0MCw3ICsxMDI3LDggQEAKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0KIAkJdG9faTJjX2NsaWVudCh0b19zb2NfY2FtZXJhX2NvbnRyb2woaWNkKSk7CiAJc3RydWN0IGkyY19hZGFwdGVyICphZGFwID0gY2xpZW50LT5hZGFwdGVyOwotCWRldl9zZXRfZHJ2ZGF0YSgmaWNkLT5kZXYsIE5VTEwpOworCisJaWNkLT5jb250cm9sID0gTlVMTDsKIAl2NGwyX2RldmljZV91bnJlZ2lzdGVyX3N1YmRldihpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KSk7CiAJaTJjX3VucmVnaXN0ZXJfZGV2aWNlKGNsaWVudCk7CiAJaTJjX3B1dF9hZGFwdGVyKGFkYXApOwpAQCAtMTA1MywxNyArMTA0MSwxNiBAQAogc3RhdGljIGludCBzb2NfY2FtZXJhX3ZpZGVvX3N0YXJ0KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKTsKIHN0YXRpYyBpbnQgdmlkZW9fZGV2X2NyZWF0ZShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCk7CiAvKiBDYWxsZWQgZHVyaW5nIGhvc3QtZHJpdmVyIHByb2JlICovCi1zdGF0aWMgaW50IHNvY19jYW1lcmFfcHJvYmUoc3RydWN0IGRldmljZSAqZGV2KQorc3RhdGljIGludCBzb2NfY2FtZXJhX3Byb2JlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gdG9fc29jX2NhbWVyYV9kZXYoZGV2KTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoZGV2LT5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsID0gdG9fc29jX2NhbWVyYV9saW5rKGljZCk7CiAJc3RydWN0IGRldmljZSAqY29udHJvbCA9IE5VTEw7CiAJc3RydWN0IHY0bDJfc3ViZGV2ICpzZDsKIAlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IG1mOwogCWludCByZXQ7CiAKLQlkZXZfaW5mbyhkZXYsICJQcm9iaW5nICVzXG4iLCBkZXZfbmFtZShkZXYpKTsKKwlkZXZfaW5mbyhpY2QtPnBkZXYsICJQcm9iaW5nICVzXG4iLCBkZXZfbmFtZShpY2QtPnBkZXYpKTsKIAogCXJldCA9IHJlZ3VsYXRvcl9idWxrX2dldChpY2QtPnBkZXYsIGljbC0+bnVtX3JlZ3VsYXRvcnMsCiAJCQkJIGljbC0+cmVndWxhdG9ycyk7CkBAIC0xMDk5LDcgKzEwODYsNyBAQAogCQlpZiAoaWNsLT5tb2R1bGVfbmFtZSkKIAkJCXJldCA9IHJlcXVlc3RfbW9kdWxlKGljbC0+bW9kdWxlX25hbWUpOwogCi0JCXJldCA9IGljbC0+YWRkX2RldmljZShpY2wsICZpY2QtPmRldik7CisJCXJldCA9IGljbC0+YWRkX2RldmljZShpY2QpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gZWFkZGRldjsKIApAQCAtMTExMCw3ICsxMDk3LDcgQEAKIAkJY29udHJvbCA9IHRvX3NvY19jYW1lcmFfY29udHJvbChpY2QpOwogCQlpZiAoIWNvbnRyb2wgfHwgIWNvbnRyb2wtPmRyaXZlciB8fCAhZGV2X2dldF9kcnZkYXRhKGNvbnRyb2wpIHx8CiAJCSAgICAhdHJ5X21vZHVsZV9nZXQoY29udHJvbC0+ZHJpdmVyLT5vd25lcikpIHsKLQkJCWljbC0+ZGVsX2RldmljZShpY2wpOworCQkJaWNsLT5kZWxfZGV2aWNlKGljZCk7CiAJCQlnb3RvIGVub2RydjsKIAkJfQogCX0KQEAgLTExMjUsOCArMTExMiw2IEBACiAKIAlpY2QtPmZpZWxkID0gVjRMMl9GSUVMRF9BTlk7CiAKLQlpY2QtPnZkZXYtPmxvY2sgPSAmaWNkLT52aWRlb19sb2NrOwotCiAJLyoKIAkgKiAuLi5fdmlkZW9fc3RhcnQoKSB3aWxsIGNyZWF0ZSBhIGRldmljZSBub2RlLCB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoKQogCSAqIGl0c2VsZiBpcyBwcm90ZWN0ZWQgYWdhaW5zdCBjb25jdXJyZW50IG9wZW4oKSBjYWxscywgYnV0IHdlIGFsc28gaGF2ZQpAQCAtMTE0NiwxMSArMTEzMSw2IEBACiAJCWljZC0+ZmllbGQJCT0gbWYuZmllbGQ7CiAJfQogCi0JLyogRG8gd2UgaGF2ZSB0byBzeXNmc19yZW1vdmVfbGluaygpIGJlZm9yZSBkZXZpY2VfdW5yZWdpc3RlcigpPyAqLwotCWlmIChzeXNmc19jcmVhdGVfbGluaygmaWNkLT5kZXYua29iaiwgJnRvX3NvY19jYW1lcmFfY29udHJvbChpY2QpLT5rb2JqLAotCQkJICAgICAgImNvbnRyb2wiKSkKLQkJZGV2X3dhcm4oJmljZC0+ZGV2LCAiRmFpbGVkIGNyZWF0aW5nIHRoZSBjb250cm9sIHN5bWxpbmtcbiIpOwotCiAJaWNpLT5vcHMtPnJlbW92ZShpY2QpOwogCiAJc29jX2NhbWVyYV9wb3dlcl9zZXQoaWNkLCBpY2wsIDApOwpAQCAtMTE2Niw3ICsxMTQ2LDcgQEAKIAlpZiAoaWNsLT5ib2FyZF9pbmZvKSB7CiAJCXNvY19jYW1lcmFfZnJlZV9pMmMoaWNkKTsKIAl9IGVsc2UgewotCQlpY2wtPmRlbF9kZXZpY2UoaWNsKTsKKwkJaWNsLT5kZWxfZGV2aWNlKGljZCk7CiAJCW1vZHVsZV9wdXQoY29udHJvbC0+ZHJpdmVyLT5vd25lcik7CiAJfQogZW5vZHJ2OgpAQCAtMTE4NiwxMyArMTE2NiwxMiBAQAogICogVGhpcyBpcyBjYWxsZWQgb24gZGV2aWNlX3VucmVnaXN0ZXIsIHdoaWNoIG9ubHkgbWVhbnMgd2UgaGF2ZSB0byBkaXNjb25uZWN0CiAgKiBmcm9tIHRoZSBob3N0LCBidXQgbm90IHJlbW92ZSBvdXJzZWx2ZXMgZnJvbSB0aGUgZGV2aWNlIGxpc3QKICAqLwotc3RhdGljIGludCBzb2NfY2FtZXJhX3JlbW92ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHNvY19jYW1lcmFfcmVtb3ZlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gdG9fc29jX2NhbWVyYV9kZXYoZGV2KTsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICppY2wgPSB0b19zb2NfY2FtZXJhX2xpbmsoaWNkKTsKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gaWNkLT52ZGV2OwogCi0JQlVHX09OKCFkZXYtPnBhcmVudCk7CisJQlVHX09OKCFpY2QtPnBhcmVudCk7CiAKIAlpZiAodmRldikgewogCQl2aWRlb191bnJlZ2lzdGVyX2RldmljZSh2ZGV2KTsKQEAgLTEyMDIsMTAgKzExODEsOSBAQAogCWlmIChpY2wtPmJvYXJkX2luZm8pIHsKIAkJc29jX2NhbWVyYV9mcmVlX2kyYyhpY2QpOwogCX0gZWxzZSB7Ci0JCXN0cnVjdCBkZXZpY2VfZHJpdmVyICpkcnYgPSB0b19zb2NfY2FtZXJhX2NvbnRyb2woaWNkKSA/Ci0JCQl0b19zb2NfY2FtZXJhX2NvbnRyb2woaWNkKS0+ZHJpdmVyIDogTlVMTDsKKwkJc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiA9IHRvX3NvY19jYW1lcmFfY29udHJvbChpY2QpLT5kcml2ZXI7CiAJCWlmIChkcnYpIHsKLQkJCWljbC0+ZGVsX2RldmljZShpY2wpOworCQkJaWNsLT5kZWxfZGV2aWNlKGljZCk7CiAJCQltb2R1bGVfcHV0KGRydi0+b3duZXIpOwogCQl9CiAJfQpAQCAtMTIxNiw0OSArMTE5NCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc29jX2NhbWVyYV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQotewotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gdG9fc29jX2NhbWVyYV9kZXYoZGV2KTsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppY2kgPSB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KTsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChpY2ktPm9wcy0+c3VzcGVuZCkKLQkJcmV0ID0gaWNpLT5vcHMtPnN1c3BlbmQoaWNkLCBzdGF0ZSk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHNvY19jYW1lcmFfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHRvX3NvY19jYW1lcmFfZGV2KGRldik7Ci0Jc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoaWNpLT5vcHMtPnJlc3VtZSkKLQkJcmV0ID0gaWNpLT5vcHMtPnJlc3VtZShpY2QpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RydWN0IGJ1c190eXBlIHNvY19jYW1lcmFfYnVzX3R5cGUgPSB7Ci0JLm5hbWUJCT0gInNvYy1jYW1lcmEiLAotCS5wcm9iZQkJPSBzb2NfY2FtZXJhX3Byb2JlLAotCS5yZW1vdmUJCT0gc29jX2NhbWVyYV9yZW1vdmUsCi0JLnN1c3BlbmQJPSBzb2NfY2FtZXJhX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBzb2NfY2FtZXJhX3Jlc3VtZSwKLX07Ci1FWFBPUlRfU1lNQk9MX0dQTChzb2NfY2FtZXJhX2J1c190eXBlKTsKLQotc3RhdGljIHN0cnVjdCBkZXZpY2VfZHJpdmVyIGljX2RydiA9IHsKLQkubmFtZQk9ICJjYW1lcmEiLAotCS5idXMJPSAmc29jX2NhbWVyYV9idXNfdHlwZSwKLQkub3duZXIJPSBUSElTX01PRFVMRSwKLX07Ci0KLXN0YXRpYyB2b2lkIGR1bW15X3JlbGVhc2Uoc3RydWN0IGRldmljZSAqZGV2KQotewotfQotCiBzdGF0aWMgaW50IGRlZmF1bHRfY3JvcGNhcChzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCwKIAkJCSAgIHN0cnVjdCB2NGwyX2Nyb3BjYXAgKmEpCiB7CkBAIC0xMzE3LDEzICsxMjUyLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgc29jX2NhbWVyYV9kZXZpY2VfaW5pdChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnBkYXRhKQotewotCWRldi0+cGxhdGZvcm1fZGF0YQk9IHBkYXRhOwotCWRldi0+YnVzCQk9ICZzb2NfY2FtZXJhX2J1c190eXBlOwotCWRldi0+cmVsZWFzZQkJPSBkdW1teV9yZWxlYXNlOwotfQotCiBpbnQgc29jX2NhbWVyYV9ob3N0X3JlZ2lzdGVyKHN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSkKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9ob3N0ICppeDsKQEAgLTEzODksMjQgKzEzMTcsOSBAQAogCW11dGV4X2xvY2soJmxpc3RfbG9jayk7CiAKIAlsaXN0X2RlbCgmaWNpLT5saXN0KTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoaWNkLCAmZGV2aWNlcywgbGlzdCkgewotCQlpZiAoaWNkLT5pZmFjZSA9PSBpY2ktPm5yKSB7Ci0JCQl2b2lkICpwZGF0YSA9IGljZC0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JCQkvKiBUaGUgYnVzLT5yZW1vdmUgd2lsbCBiZSBjYWxsZWQgKi8KLQkJCWRldmljZV91bnJlZ2lzdGVyKCZpY2QtPmRldik7Ci0JCQkvKgotCQkJICogTm90IGJlZm9yZSBkZXZpY2VfdW5yZWdpc3RlcigpLCAucmVtb3ZlCi0JCQkgKiBuZWVkcyBwYXJlbnQgdG8gY2FsbCBpY2ktPm9wcy0+cmVtb3ZlKCkuCi0JCQkgKiBJZiB0aGUgaG9zdCBtb2R1bGUgaXMgbG9hZGVkIGFnYWluLCBkZXZpY2VfcmVnaXN0ZXIoKQotCQkJICogd291bGQgY29tcGxhaW4gImFscmVhZHkgaW5pdGlhbGlzZWQsIiBzaW5jZSAyLjYuMzIKLQkJCSAqIHRoaXMgaXMgYWxzbyBuZWVkZWQgdG8gcHJldmVudCB1c2UtYWZ0ZXItZnJlZSBvZiB0aGUKLQkJCSAqIGRldmljZSBwcml2YXRlIGRhdGEuCi0JCQkgKi8KLQkJCW1lbXNldCgmaWNkLT5kZXYsIDAsIHNpemVvZihpY2QtPmRldikpOwotCQkJc29jX2NhbWVyYV9kZXZpY2VfaW5pdCgmaWNkLT5kZXYsIHBkYXRhKTsKLQkJfQotCX0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGljZCwgJmRldmljZXMsIGxpc3QpCisJCWlmIChpY2QtPmlmYWNlID09IGljaS0+bnIgJiYgdG9fc29jX2NhbWVyYV9jb250cm9sKGljZCkpCisJCQlzb2NfY2FtZXJhX3JlbW92ZShpY2QpOwogCiAJbXV0ZXhfdW5sb2NrKCZsaXN0X2xvY2spOwogCkBAIC0xNDQ4LDExICsxMzYxLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgc29jX2NhbWVyYV9kZXZpY2VfdW5yZWdpc3RlcihzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKLXsKLQlsaXN0X2RlbCgmaWNkLT5saXN0KTsKLX0KLQogc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyBzb2NfY2FtZXJhX2lvY3RsX29wcyA9IHsKIAkudmlkaW9jX3F1ZXJ5Y2FwCSA9IHNvY19jYW1lcmFfcXVlcnljYXAsCiAJLnZpZGlvY19nX2ZtdF92aWRfY2FwICAgID0gc29jX2NhbWVyYV9nX2ZtdF92aWRfY2FwLApAQCAtMTQ4Nyw3ICsxMzk1LDcgQEAKIAogc3RhdGljIGludCB2aWRlb19kZXZfY3JlYXRlKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkKQogewotCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPmRldi5wYXJlbnQpOworCXN0cnVjdCBzb2NfY2FtZXJhX2hvc3QgKmljaSA9IHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCk7CiAJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IHZpZGVvX2RldmljZV9hbGxvYygpOwogCiAJaWYgKCF2ZGV2KQpAQCAtMTQ5NSwxMiArMTQwMywxMyBAQAogCiAJc3RybGNweSh2ZGV2LT5uYW1lLCBpY2ktPmRydl9uYW1lLCBzaXplb2YodmRldi0+bmFtZSkpOwogCi0JdmRldi0+cGFyZW50CQk9ICZpY2QtPmRldjsKKwl2ZGV2LT5wYXJlbnQJCT0gaWNkLT5wZGV2OwogCXZkZXYtPmN1cnJlbnRfbm9ybQk9IFY0TDJfU1REX1VOS05PV047CiAJdmRldi0+Zm9wcwkJPSAmc29jX2NhbWVyYV9mb3BzOwogCXZkZXYtPmlvY3RsX29wcwkJPSAmc29jX2NhbWVyYV9pb2N0bF9vcHM7CiAJdmRldi0+cmVsZWFzZQkJPSB2aWRlb19kZXZpY2VfcmVsZWFzZTsKIAl2ZGV2LT50dm5vcm1zCQk9IFY0TDJfU1REX1VOS05PV047CisJdmRldi0+bG9jawkJPSAmaWNkLT52aWRlb19sb2NrOwogCiAJaWNkLT52ZGV2ID0gdmRldjsKIApAQCAtMTUxNSw3ICsxNDI0LDcgQEAKIAljb25zdCBzdHJ1Y3QgZGV2aWNlX3R5cGUgKnR5cGUgPSBpY2QtPnZkZXYtPmRldi50eXBlOwogCWludCByZXQ7CiAKLQlpZiAoIWljZC0+ZGV2LnBhcmVudCkKKwlpZiAoIWljZC0+cGFyZW50KQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmICghaWNkLT5vcHMgfHwKQEAgLTE1MjUsNyArMTQzNCw3IEBACiAKIAlyZXQgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoaWNkLT52ZGV2LCBWRkxfVFlQRV9HUkFCQkVSLCAtMSk7CiAJaWYgKHJldCA8IDApIHsKLQkJZGV2X2VycigmaWNkLT5kZXYsICJ2aWRlb19yZWdpc3Rlcl9kZXZpY2UgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJZGV2X2VycihpY2QtPnBkZXYsICJ2aWRlb19yZWdpc3Rlcl9kZXZpY2UgZmFpbGVkOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTE1NDksNiArMTQ1OCw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJaWNkLT5pZmFjZSA9IGljbC0+YnVzX2lkOworCWljZC0+bGluayA9IGljbDsKIAlpY2QtPnBkZXYgPSAmcGRldi0+ZGV2OwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGljZCk7CiAKQEAgLTE1NTYsOCArMTQ2Niw2IEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXNjZGV2cmVnOwogCi0Jc29jX2NhbWVyYV9kZXZpY2VfaW5pdCgmaWNkLT5kZXYsIGljbCk7Ci0KIAlpY2QtPnVzZXJfd2lkdGgJCT0gREVGQVVMVF9XSURUSDsKIAlpY2QtPnVzZXJfaGVpZ2h0CT0gREVGQVVMVF9IRUlHSFQ7CiAKQEAgLTE1ODEsNyArMTQ4OSw3IEBACiAJaWYgKCFpY2QpCiAJCXJldHVybiAtRUlOVkFMOwogCi0Jc29jX2NhbWVyYV9kZXZpY2VfdW5yZWdpc3RlcihpY2QpOworCWxpc3RfZGVsKCZpY2QtPmxpc3QpOwogCiAJa2ZyZWUoaWNkKTsKIApAQCAtMTU5OCwzMSArMTUwNiwxMiBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBzb2NfY2FtZXJhX2luaXQodm9pZCkKIHsKLQlpbnQgcmV0ID0gYnVzX3JlZ2lzdGVyKCZzb2NfY2FtZXJhX2J1c190eXBlKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCXJldCA9IGRyaXZlcl9yZWdpc3RlcigmaWNfZHJ2KTsKLQlpZiAocmV0KQotCQlnb3RvIGVkcnZyOwotCi0JcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZzb2NfY2FtZXJhX3BkcnYsIHNvY19jYW1lcmFfcGRydl9wcm9iZSk7Ci0JaWYgKHJldCkKLQkJZ290byBlcGRyOwotCi0JcmV0dXJuIDA7Ci0KLWVwZHI6Ci0JZHJpdmVyX3VucmVnaXN0ZXIoJmljX2Rydik7Ci1lZHJ2cjoKLQlidXNfdW5yZWdpc3Rlcigmc29jX2NhbWVyYV9idXNfdHlwZSk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3Byb2JlKCZzb2NfY2FtZXJhX3BkcnYsIHNvY19jYW1lcmFfcGRydl9wcm9iZSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBzb2NfY2FtZXJhX2V4aXQodm9pZCkKIHsKIAlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc29jX2NhbWVyYV9wZHJ2KTsKLQlkcml2ZXJfdW5yZWdpc3RlcigmaWNfZHJ2KTsKLQlidXNfdW5yZWdpc3Rlcigmc29jX2NhbWVyYV9idXNfdHlwZSk7CiB9CiAKIG1vZHVsZV9pbml0KHNvY19jYW1lcmFfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NvY19jYW1lcmFfcGxhdGZvcm0uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc29jX2NhbWVyYV9wbGF0Zm9ybS5jCmluZGV4IGJmNDA2ZTguLjgwNjljZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc29jX2NhbWVyYV9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc29jX2NhbWVyYV9wbGF0Zm9ybS5jCkBAIC0xNDYsNyArMTQ2LDcgQEAKIAlpZiAoIXApCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKCFwLT5kZXYpIHsKKwlpZiAoIXAtPmljZCkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsCiAJCQkiUGxhdGZvcm0gaGFzIG5vdCBzZXQgc29jX2NhbWVyYV9kZXZpY2UgcG9pbnRlciFcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTE1NiwxNiArMTU2LDE2IEBACiAJaWYgKCFwcml2KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWljZCA9IHRvX3NvY19jYW1lcmFfZGV2KHAtPmRldik7CisJaWNkID0gcC0+aWNkOwogCiAJLyogc29jLWNhbWVyYSBjb252ZW50aW9uOiBjb250cm9sJ3MgZHJ2ZGF0YSBwb2ludHMgdG8gdGhlIHN1YmRldiAqLwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsICZwcml2LT5zdWJkZXYpOwogCS8qIFNldCB0aGUgY29udHJvbCBkZXZpY2UgcmVmZXJlbmNlICovCi0JZGV2X3NldF9kcnZkYXRhKCZpY2QtPmRldiwgJnBkZXYtPmRldik7CisJaWNkLT5jb250cm9sID0gJnBkZXYtPmRldjsKIAogCWljZC0+b3BzID0gJnNvY19jYW1lcmFfcGxhdGZvcm1fb3BzOwogCi0JaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+ZGV2LnBhcmVudCk7CisJaWNpID0gdG9fc29jX2NhbWVyYV9ob3N0KGljZC0+cGFyZW50KTsKIAogCXY0bDJfc3ViZGV2X2luaXQoJnByaXYtPnN1YmRldiwgJnBsYXRmb3JtX3N1YmRldl9vcHMpOwogCXY0bDJfc2V0X3N1YmRldmRhdGEoJnByaXYtPnN1YmRldiwgcCk7CkBAIC0xODgsNyArMTg4LDcgQEAKIHsKIAlzdHJ1Y3Qgc29jX2NhbWVyYV9wbGF0Zm9ybV9wcml2ICpwcml2ID0gZ2V0X3ByaXYocGRldik7CiAJc3RydWN0IHNvY19jYW1lcmFfcGxhdGZvcm1faW5mbyAqcCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gdG9fc29jX2NhbWVyYV9kZXYocC0+ZGV2KTsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHAtPmljZDsKIAogCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KCZwcml2LT5zdWJkZXYpOwogCWljZC0+b3BzID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc3IwMzBwYzMwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NyMDMwcGMzMC5jCmluZGV4IGM5MDE3MjEuLjhhZmIwZTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc3IwMzBwYzMwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zcjAzMHBjMzAuYwpAQCAtNzI2LDggKzcyNiwxMCBAQAogCWNvbnN0IHN0cnVjdCBzcjAzMHBjMzBfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBpbmZvLT5wZGF0YTsKIAlpbnQgcmV0OwogCi0JaWYgKFdBUk4ocGRhdGEgPT0gTlVMTCwgIk5vIHBsYXRmb3JtIGRhdGEhXG4iKSkKLQkJcmV0dXJuIC1FTk9NRU07CisJaWYgKHBkYXRhID09IE5VTEwpIHsKKwkJV0FSTigxLCAiTm8gcGxhdGZvcm0gZGF0YSFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAkvKgogCSAqIFB1dCBzZW5zb3IgaW50byBwb3dlciBzbGVlcCBtb2RlIGJlZm9yZSBzd2l0Y2hpbmcgb2ZmCkBAIC03NDYsNiArNzQ4LDcgQEAKIAlpZiAob24pIHsKIAkJcmV0ID0gc3IwMzBwYzMwX2Jhc2VfY29uZmlnKHNkKTsKIAl9IGVsc2UgeworCQlyZXQgPSAwOwogCQlpbmZvLT5jdXJyX3dpbiA9IE5VTEw7CiAJCWluZm8tPmN1cnJfZm10ID0gTlVMTDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RkYTc0MzIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhNzQzMi5jCmluZGV4IDM5NDFmOTUuLmJkMjE4NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhNzQzMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGRhNzQzMi5jCkBAIC00OSwxMCArNDksMTEgQEAKIHN0YXRpYyBpbnQgbG91ZG5lc3M7IC8qIGRpc2FibGUgbG91ZG5lc3MgYnkgZGVmYXVsdCAqLwogc3RhdGljIGludCBkZWJ1ZzsJIC8qIGluc21vZCBwYXJhbWV0ZXIgKi8KIG1vZHVsZV9wYXJhbShkZWJ1ZywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7CitNT0RVTEVfUEFSTV9ERVNDKGRlYnVnLCAiU2V0IGRlYnVnZ2luZyBsZXZlbCBmcm9tIDAgdG8gMy4gRGVmYXVsdCBpcyBvZmYoMCkuIik7CiBtb2R1bGVfcGFyYW0obG91ZG5lc3MsIGludCwgU19JUlVHTyk7Ci1NT0RVTEVfUEFSTV9ERVNDKG1heHZvbCwiU2V0IG1heGltaXVtIHZvbHVtZSB0byArMjBkYiAoMCksIGRlZmF1bHQgaXMgMGRiKDEpIik7CitNT0RVTEVfUEFSTV9ERVNDKGxvdWRuZXNzLCAiVHVybiBsb3VkbmVzcyBvbigxKSBlbHNlIG9mZigwKS4gRGVmYXVsdCBpcyBvZmYoMCkuIik7CiBtb2R1bGVfcGFyYW0obWF4dm9sLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKLQorTU9EVUxFX1BBUk1fREVTQyhtYXh2b2wsICJTZXQgbWF4aW1pdW0gdm9sdW1lIHRvICsyMGRCKDApIGVsc2UgKzBkQigxKS4gRGVmYXVsdCBpcyArMjBkQigwKS4iKTsKIAogCiAvKiBTdHJ1Y3R1cmUgb2YgYWRkcmVzcyBhbmQgc3ViYWRkcmVzc2VzIGZvciB0aGUgdGRhNzQzMiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90aW1ibG9naXcuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGltYmxvZ2l3LmMKaW5kZXggZmM2MTFlYi4uODRjZDFiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90aW1ibG9naXcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RpbWJsb2dpdy5jCkBAIC0yMCw3ICsyMCw2IEBACiAgKiBUaW1iZXJkYWxlIEZQR0EgTG9naVdpbiBWaWRlbyBJbgogICovCiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90bGcyMzAwL3BkLWNvbW1vbi5oIGIvZHJpdmVycy9tZWRpYS92aWRlby90bGcyMzAwL3BkLWNvbW1vbi5oCmluZGV4IDQ2MDY2YmQuLjU2NTY0ZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGxnMjMwMC9wZC1jb21tb24uaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RsZzIzMDAvcGQtY29tbW9uLmgKQEAgLTEsNyArMSw2IEBACiAjaWZuZGVmIFBEX0NPTU1PTl9ICiAjZGVmaW5lIFBEX0NPTU1PTl9ICiAKLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90bGcyMzAwL3BkLW1haW4uYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdGxnMjMwMC9wZC1tYWluLmMKaW5kZXggOTljODFhOS4uMTI5ZjEzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90bGcyMzAwL3BkLW1haW4uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RsZzIzMDAvcGQtbWFpbi5jCkBAIC01MzEsMyArNTMxLDQgQEAKIE1PRFVMRV9BVVRIT1IoIlRlbGVnZW50IFN5c3RlbXMiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiRm9yIHRsZzIzMDAtYmFzZWQgVVNCIGRldmljZSAiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKCIwLjAuMiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby90bGcyMzAwL3BkLXJhZGlvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RsZzIzMDAvcGQtcmFkaW8uYwppbmRleCBmYWU4NGMyLi40ZmFkMWRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3RsZzIzMDAvcGQtcmFkaW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3RsZzIzMDAvcGQtcmFkaW8uYwpAQCAtNiw3ICs2LDYgQEAKICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC9pMmMuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgpAQCAtMTQ5LDcgKzE0OCw2IEBACiAJc3RybGNweSh2LT5kcml2ZXIsICJ0ZWxlLXJhZGlvIiwgc2l6ZW9mKHYtPmRyaXZlcikpOwogCXN0cmxjcHkodi0+Y2FyZCwgIlRlbGVnZW50IFBvc2VpZG9uIiwgc2l6ZW9mKHYtPmNhcmQpKTsKIAl1c2JfbWFrZV9wYXRoKHAtPnVkZXYsIHYtPmJ1c19pbmZvLCBzaXplb2Yodi0+YnVzX2luZm8pKTsKLQl2LT52ZXJzaW9uID0gS0VSTkVMX1ZFUlNJT04oMCwgMCwgMSk7CiAJdi0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVFVORVIgfCBWNEwyX0NBUF9SQURJTzsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHVuZXItY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci1jb3JlLmMKaW5kZXggYTAzOTQ1YS4uMTFjYzk4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci1jb3JlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby90dW5lci1jb3JlLmMKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlICJ0ZGE5ODg3LmgiCiAjaW5jbHVkZSAieGM1MDAwLmgiCiAjaW5jbHVkZSAidGRhMTgyNzEuaCIKKyNpbmNsdWRlICJ4YzQwMDAuaCIKIAogI2RlZmluZSBVTlNFVCAoLTFVKQogCkBAIC0zOTEsNiArMzkyLDIzIEBACiAJCXR1bmVfbm93ID0gMDsKIAkJYnJlYWs7CiAJfQorCWNhc2UgVFVORVJfWEM0MDAwOgorCXsKKwkJc3RydWN0IHhjNDAwMF9jb25maWcgeGM0MDAwX2NmZyA9IHsKKwkJCS5pMmNfYWRkcmVzcwkgID0gdC0+aTJjLT5hZGRyLAorCQkJLyogRklYTUU6IHRoZSBjb3JyZWN0IHBhcmFtZXRlcnMgd2lsbCBiZSBzZXQgKi8KKwkJCS8qIG9ubHkgd2hlbiB0aGUgZGlnaXRhbCBkdmJfYXR0YWNoKCkgb2NjdXJzICovCisJCQkuZGVmYXVsdF9wbQkgID0gMCwKKwkJCS5kdmJfYW1wbGl0dWRlCSAgPSAwLAorCQkJLnNldF9zbW9vdGhlZGN2YnMgPSAwLAorCQkJLmlmX2toegkJICA9IDAKKwkJfTsKKwkJaWYgKCFkdmJfYXR0YWNoKHhjNDAwMF9hdHRhY2gsCisJCQkJJnQtPmZlLCB0LT5pMmMtPmFkYXB0ZXIsICZ4YzQwMDBfY2ZnKSkKKwkJCWdvdG8gYXR0YWNoX2ZhaWxlZDsKKwkJdHVuZV9ub3cgPSAwOworCQlicmVhazsKKwl9CiAJZGVmYXVsdDoKIAkJaWYgKCFkdmJfYXR0YWNoKHNpbXBsZV90dW5lcl9hdHRhY2gsICZ0LT5mZSwKIAkJCQl0LT5pMmMtPmFkYXB0ZXIsIHQtPmkyYy0+YWRkciwgdC0+dHlwZSkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R3OTkxMC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby90dzk5MTAuYwppbmRleCAwMzQ3YmJlLi43NDI0ODJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3R3OTkxMC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdHc5OTEwLmMKQEAgLTU1MiwxNiArNTUyLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHR3OTkxMF9lbnVtX2lucHV0KHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAotCQkJICAgICBzdHJ1Y3QgdjRsMl9pbnB1dCAqaW5wKQotewotCWlucC0+dHlwZSA9IFY0TDJfSU5QVVRfVFlQRV9UVU5FUjsKLQlpbnAtPnN0ZCAgPSBWNEwyX1NURF9VTktOT1dOOwotCXN0cmNweShpbnAtPm5hbWUsICJWaWRlbyIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgdHc5OTEwX2dfY2hpcF9pZGVudChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAogCQkJICAgICAgIHN0cnVjdCB2NGwyX2RiZ19jaGlwX2lkZW50ICppZCkKIHsKQEAgLTg0NiwxMyArODM2LDkgQEAKIAlzdHJ1Y3QgdHc5OTEwX3ByaXYgKnByaXYgPSB0b190dzk5MTAoY2xpZW50KTsKIAlzMzIgaWQ7CiAKLQkvKgotCSAqIFdlIG11c3QgaGF2ZSBhIHBhcmVudCBieSBub3cuIEFuZCBpdCBjYW5ub3QgYmUgYSB3cm9uZyBvbmUuCi0JICogU28gdGhpcyBlbnRpcmUgdGVzdCBpcyBjb21wbGV0ZWx5IHJlZHVuZGFudC4KLQkgKi8KLQlpZiAoIWljZC0+ZGV2LnBhcmVudCB8fAotCSAgICB0b19zb2NfY2FtZXJhX2hvc3QoaWNkLT5kZXYucGFyZW50KS0+bnIgIT0gaWNkLT5pZmFjZSkKLQkJcmV0dXJuIC1FTk9ERVY7CisJLyogV2UgbXVzdCBoYXZlIGEgcGFyZW50IGJ5IG5vdy4gQW5kIGl0IGNhbm5vdCBiZSBhIHdyb25nIG9uZS4gKi8KKwlCVUdfT04oIWljZC0+cGFyZW50IHx8CisJICAgICAgIHRvX3NvY19jYW1lcmFfaG9zdChpY2QtPnBhcmVudCktPm5yICE9IGljZC0+aWZhY2UpOwogCiAJLyoKIAkgKiB0dzk5MTAgb25seSB1c2UgOCBvciAxNiBiaXQgYnVzIHdpZHRoCkBAIC04OTEsNyArODc3LDYgQEAKIHN0YXRpYyBzdHJ1Y3Qgc29jX2NhbWVyYV9vcHMgdHc5OTEwX29wcyA9IHsKIAkuc2V0X2J1c19wYXJhbQkJPSB0dzk5MTBfc2V0X2J1c19wYXJhbSwKIAkucXVlcnlfYnVzX3BhcmFtCT0gdHc5OTEwX3F1ZXJ5X2J1c19wYXJhbSwKLQkuZW51bV9pbnB1dAkJPSB0dzk5MTBfZW51bV9pbnB1dCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJkZXZfY29yZV9vcHMgdHc5OTEwX3N1YmRldl9jb3JlX29wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXNidmlzaW9uL3VzYnZpc2lvbi12aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLXZpZGVvLmMKaW5kZXggZWE4ZWE4YS4uNWE3NGY1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLXZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91c2J2aXNpb24vdXNidmlzaW9uLXZpZGVvLmMKQEAgLTQ1LDcgKzQ1LDYgQEAKICAqCiAgKi8KIAotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KQEAgLTc3LDE1ICs3Niw3IEBACiAjZGVmaW5lIERSSVZFUl9BTElBUyAiVVNCVmlzaW9uIgogI2RlZmluZSBEUklWRVJfREVTQyAiVVNCVmlzaW9uIFVTQiBWaWRlbyBEZXZpY2UgRHJpdmVyIGZvciBMaW51eCIKICNkZWZpbmUgRFJJVkVSX0xJQ0VOU0UgIkdQTCIKLSNkZWZpbmUgVVNCVklTSU9OX0RSSVZFUl9WRVJTSU9OX01BSk9SIDAKLSNkZWZpbmUgVVNCVklTSU9OX0RSSVZFUl9WRVJTSU9OX01JTk9SIDkKLSNkZWZpbmUgVVNCVklTSU9OX0RSSVZFUl9WRVJTSU9OX1BBVENITEVWRUwgMTAKLSNkZWZpbmUgVVNCVklTSU9OX0RSSVZFUl9WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKFVTQlZJU0lPTl9EUklWRVJfVkVSU0lPTl9NQUpPUixcCi1VU0JWSVNJT05fRFJJVkVSX1ZFUlNJT05fTUlOT1IsXAotVVNCVklTSU9OX0RSSVZFUl9WRVJTSU9OX1BBVENITEVWRUwpCi0jZGVmaW5lIFVTQlZJU0lPTl9WRVJTSU9OX1NUUklORyBfX3N0cmluZ2lmeShVU0JWSVNJT05fRFJJVkVSX1ZFUlNJT05fTUFKT1IpIFwKLSIuIiBfX3N0cmluZ2lmeShVU0JWSVNJT05fRFJJVkVSX1ZFUlNJT05fTUlOT1IpIFwKLSIuIiBfX3N0cmluZ2lmeShVU0JWSVNJT05fRFJJVkVSX1ZFUlNJT05fUEFUQ0hMRVZFTCkKKyNkZWZpbmUgVVNCVklTSU9OX1ZFUlNJT05fU1RSSU5HICIwLjkuMTEiCiAKICNkZWZpbmUJRU5BQkxFX0hFWERVTVAJMAkvKiBFbmFibGUgaWYgeW91IG5lZWQgaXQgKi8KIApAQCAtNTE2LDcgKzUwNyw2IEBACiAJCXVzYnZpc2lvbl9kZXZpY2VfZGF0YVt1c2J2aXNpb24tPmRldl9tb2RlbF0ubW9kZWxfc3RyaW5nLAogCQlzaXplb2YodmMtPmNhcmQpKTsKIAl1c2JfbWFrZV9wYXRoKHVzYnZpc2lvbi0+ZGV2LCB2Yy0+YnVzX2luZm8sIHNpemVvZih2Yy0+YnVzX2luZm8pKTsKLQl2Yy0+dmVyc2lvbiA9IFVTQlZJU0lPTl9EUklWRVJfVkVSU0lPTjsKIAl2Yy0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8CiAJCVY0TDJfQ0FQX0FVRElPIHwKIAkJVjRMMl9DQVBfUkVBRFdSSVRFIHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19jdHJsLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfY3RybC5jCmluZGV4IDJjODk1NGUuLjEwYzIzNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19jdHJsLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX2N0cmwuYwpAQCAtMTY2NCw4ICsxNjY0LDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JLyogU2VhcmNoIGZvciB0aGUgbWF0Y2hpbmcgKEdVSUQvQ1MpIGNvbnRyb2wgaW4gdGhlIGdpdmVuIGRldmljZSAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50aXR5LCAmZGV2LT5lbnRpdGllcywgbGlzdCkgeworCS8qIFNlYXJjaCBmb3IgdGhlIG1hdGNoaW5nIChHVUlEL0NTKSBjb250cm9sIG9uIHRoZSBjdXJyZW50IGNoYWluICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRpdHksICZjaGFpbi0+ZW50aXRpZXMsIGNoYWluKSB7CiAJCXVuc2lnbmVkIGludCBpOwogCiAJCWlmIChVVkNfRU5USVRZX1RZUEUoZW50aXR5KSAhPSBVVkNfVkNfRVhURU5TSU9OX1VOSVQgfHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y19kcml2ZXIuYwppbmRleCBiNmVhZTQ4Li5kMjlmOWMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfZHJpdmVyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX2RyaXZlci5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIApAQCAtMTg1Nyw3ICsxODU4LDcgQEAKIAkJCXNpemVvZihkZXYtPm1kZXYuc2VyaWFsKSk7CiAJc3RyY3B5KGRldi0+bWRldi5idXNfaW5mbywgdWRldi0+ZGV2cGF0aCk7CiAJZGV2LT5tZGV2Lmh3X3JldmlzaW9uID0gbGUxNl90b19jcHUodWRldi0+ZGVzY3JpcHRvci5iY2REZXZpY2UpOwotCWRldi0+bWRldi5kcml2ZXJfdmVyc2lvbiA9IERSSVZFUl9WRVJTSU9OX05VTUJFUjsKKwlkZXYtPm1kZXYuZHJpdmVyX3ZlcnNpb24gPSBMSU5VWF9WRVJTSU9OX0NPREU7CiAJaWYgKG1lZGlhX2RldmljZV9yZWdpc3RlcigmZGV2LT5tZGV2KSA8IDApCiAJCWdvdG8gZXJyb3I7CiAKQEAgLTIxMzAsNiArMjEzMSwxNSBAQAogCSAgLmJJbnRlcmZhY2VQcm90b2NvbAk9IDAsCiAJICAuZHJpdmVyX2luZm8gCQk9IFVWQ19RVUlSS19QUk9CRV9NSU5NQVgKIAkJCQl8IFVWQ19RVUlSS19CVUlMVElOX0lTSUdIVCB9LAorCS8qIEZveGxpbmsgKCJIUCBXZWJjYW0iIG9uIEhQIE1pbmkgNTEwMykgKi8KKwl7IC5tYXRjaF9mbGFncwkJPSBVU0JfREVWSUNFX0lEX01BVENIX0RFVklDRQorCQkJCXwgVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfSU5GTywKKwkgIC5pZFZlbmRvcgkJPSAweDA1YzgsCisJICAuaWRQcm9kdWN0CQk9IDB4MDQwMywKKwkgIC5iSW50ZXJmYWNlQ2xhc3MJPSBVU0JfQ0xBU1NfVklERU8sCisJICAuYkludGVyZmFjZVN1YkNsYXNzCT0gMSwKKwkgIC5iSW50ZXJmYWNlUHJvdG9jb2wJPSAwLAorCSAgLmRyaXZlcl9pbmZvCQk9IFVWQ19RVUlSS19GSVhfQkFORFdJRFRIIH0sCiAJLyogR2VuZXN5cyBMb2dpYyBVU0IgMi4wIFBDIENhbWVyYSAqLwogCXsgLm1hdGNoX2ZsYWdzCQk9IFVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWSUNFCiAJCQkJfCBVU0JfREVWSUNFX0lEX01BVENIX0lOVF9JTkZPLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX3Y0bDIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y192NGwyLmMKaW5kZXggZGRlNjUzMy4uZWE3MWQ1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjX3Y0bDIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmNfdjRsMi5jCkBAIC04Myw3ICs4Myw3IEBACiAJZGVmYXVsdDoKIAkJdXZjX3RyYWNlKFVWQ19UUkFDRV9DT05UUk9MLCAiVW5zdXBwb3J0ZWQgVjRMMiBjb250cm9sIHR5cGUgIgogCQkJICAiJXUuXG4iLCB4bWFwLT52NGwyX3R5cGUpOwotCQlyZXQgPSAtRUlOVkFMOworCQlyZXQgPSAtRU5PVFRZOwogCQlnb3RvIGRvbmU7CiAJfQogCkBAIC01NzEsNyArNTcxLDcgQEAKIAkJc3RybGNweShjYXAtPmNhcmQsIHZkZXYtPm5hbWUsIHNpemVvZiBjYXAtPmNhcmQpOwogCQl1c2JfbWFrZV9wYXRoKHN0cmVhbS0+ZGV2LT51ZGV2LAogCQkJICAgICAgY2FwLT5idXNfaW5mbywgc2l6ZW9mKGNhcC0+YnVzX2luZm8pKTsKLQkJY2FwLT52ZXJzaW9uID0gRFJJVkVSX1ZFUlNJT05fTlVNQkVSOworCQljYXAtPnZlcnNpb24gPSBMSU5VWF9WRVJTSU9OX0NPREU7CiAJCWlmIChzdHJlYW0tPnR5cGUgPT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQogCQkJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFCiAJCQkJCSAgfCBWNEwyX0NBUF9TVFJFQU1JTkc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmN2aWRlby5oIGIvZHJpdmVycy9tZWRpYS92aWRlby91dmMvdXZjdmlkZW8uaAppbmRleCAyMDEwN2ZkLi5kZjMyYTQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3V2Yy91dmN2aWRlby5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdXZjL3V2Y3ZpZGVvLmgKQEAgLTE4Myw4ICsxODMsNyBAQAogICogRHJpdmVyIHNwZWNpZmljIGNvbnN0YW50cy4KICAqLwogCi0jZGVmaW5lIERSSVZFUl9WRVJTSU9OX05VTUJFUglLRVJORUxfVkVSU0lPTigxLCAxLCAwKQotI2RlZmluZSBEUklWRVJfVkVSU0lPTgkJInYxLjEuMCIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04JCSIxLjEuMSIKIAogLyogTnVtYmVyIG9mIGlzb2Nocm9ub3VzIFVSQnMuICovCiAjZGVmaW5lIFVWQ19VUkJTCQk1CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY29tbW9uLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY29tbW9uLmMKaW5kZXggMDZiOWY5Zi4uNWM2MTAwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWNvbW1vbi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jb21tb24uYwpAQCAtMTA1LDYgKzEwNSw5IEBACiAJCSAgICBtZW51X2l0ZW1zW2N0cmwtPnZhbHVlXVswXSA9PSAnXDAnKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQorCWlmIChxY3RybC0+dHlwZSA9PSBWNEwyX0NUUkxfVFlQRV9CSVRNQVNLICYmCisJCQkoY3RybC0+dmFsdWUgJiB+cWN0cmwtPm1heGltdW0pKQorCQlyZXR1cm4gLUVSQU5HRTsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0wodjRsMl9jdHJsX2NoZWNrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1jb21wYXQtaW9jdGwzMi5jIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWNvbXBhdC1pb2N0bDMyLmMKaW5kZXggN2MyNjk0Ny4uNjE5NzliNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWNvbXBhdC1pb2N0bDMyLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWNvbXBhdC1pb2N0bDMyLmMKQEAgLTY2Miw2ICs2NjIsMzIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RydWN0IHY0bDJfZXZlbnQzMiB7CisJX191MzIJCQkJdHlwZTsKKwl1bmlvbiB7CisJCV9fdTgJCQlkYXRhWzY0XTsKKwl9IHU7CisJX191MzIJCQkJcGVuZGluZzsKKwlfX3UzMgkJCQlzZXF1ZW5jZTsKKwlzdHJ1Y3QgY29tcGF0X3RpbWVzcGVjCQl0aW1lc3RhbXA7CisJX191MzIJCQkJaWQ7CisJX191MzIJCQkJcmVzZXJ2ZWRbOF07Cit9OworCitzdGF0aWMgaW50IHB1dF92NGwyX2V2ZW50MzIoc3RydWN0IHY0bDJfZXZlbnQgKmtwLCBzdHJ1Y3QgdjRsMl9ldmVudDMyIF9fdXNlciAqdXApCit7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCB1cCwgc2l6ZW9mKHN0cnVjdCB2NGwyX2V2ZW50MzIpKSB8fAorCQlwdXRfdXNlcihrcC0+dHlwZSwgJnVwLT50eXBlKSB8fAorCQljb3B5X3RvX3VzZXIoJnVwLT51LCAma3AtPnUsIHNpemVvZihrcC0+dSkpIHx8CisJCXB1dF91c2VyKGtwLT5wZW5kaW5nLCAmdXAtPnBlbmRpbmcpIHx8CisJCXB1dF91c2VyKGtwLT5zZXF1ZW5jZSwgJnVwLT5zZXF1ZW5jZSkgfHwKKwkJcHV0X2NvbXBhdF90aW1lc3BlYygma3AtPnRpbWVzdGFtcCwgJnVwLT50aW1lc3RhbXApIHx8CisJCXB1dF91c2VyKGtwLT5pZCwgJnVwLT5pZCkgfHwKKwkJY29weV90b191c2VyKHVwLT5yZXNlcnZlZCwga3AtPnJlc2VydmVkLCA4ICogc2l6ZW9mKF9fdTMyKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKwogI2RlZmluZSBWSURJT0NfR19GTVQzMgkJX0lPV1IoJ1YnLCAgNCwgc3RydWN0IHY0bDJfZm9ybWF0MzIpCiAjZGVmaW5lIFZJRElPQ19TX0ZNVDMyCQlfSU9XUignVicsICA1LCBzdHJ1Y3QgdjRsMl9mb3JtYXQzMikKICNkZWZpbmUgVklESU9DX1FVRVJZQlVGMzIJX0lPV1IoJ1YnLCAgOSwgc3RydWN0IHY0bDJfYnVmZmVyMzIpCkBAIC02NzUsNiArNzAxLDcgQEAKICNkZWZpbmUgVklESU9DX0dfRVhUX0NUUkxTMzIgICAgX0lPV1IoJ1YnLCA3MSwgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzMzIpCiAjZGVmaW5lIFZJRElPQ19TX0VYVF9DVFJMUzMyICAgIF9JT1dSKCdWJywgNzIsIHN0cnVjdCB2NGwyX2V4dF9jb250cm9sczMyKQogI2RlZmluZSBWSURJT0NfVFJZX0VYVF9DVFJMUzMyICBfSU9XUignVicsIDczLCBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMzMikKKyNkZWZpbmUJVklESU9DX0RRRVZFTlQzMglfSU9SICgnVicsIDg5LCBzdHJ1Y3QgdjRsMl9ldmVudDMyKQogCiAjZGVmaW5lIFZJRElPQ19PVkVSTEFZMzIJX0lPVyAoJ1YnLCAxNCwgczMyKQogI2RlZmluZSBWSURJT0NfU1RSRUFNT04zMglfSU9XICgnVicsIDE4LCBzMzIpCkBAIC02OTMsNiArNzIwLDcgQEAKIAkJc3RydWN0IHY0bDJfaW5wdXQgdjJpOwogCQlzdHJ1Y3QgdjRsMl9zdGFuZGFyZCB2MnM7CiAJCXN0cnVjdCB2NGwyX2V4dF9jb250cm9scyB2MmVjczsKKwkJc3RydWN0IHY0bDJfZXZlbnQgdjJldjsKIAkJdW5zaWduZWQgbG9uZyB2eDsKIAkJaW50IHZpOwogCX0ga2FyZzsKQEAgLTcxNSw2ICs3NDMsNyBAQAogCWNhc2UgVklESU9DX0dfRVhUX0NUUkxTMzI6IGNtZCA9IFZJRElPQ19HX0VYVF9DVFJMUzsgYnJlYWs7CiAJY2FzZSBWSURJT0NfU19FWFRfQ1RSTFMzMjogY21kID0gVklESU9DX1NfRVhUX0NUUkxTOyBicmVhazsKIAljYXNlIFZJRElPQ19UUllfRVhUX0NUUkxTMzI6IGNtZCA9IFZJRElPQ19UUllfRVhUX0NUUkxTOyBicmVhazsKKwljYXNlIFZJRElPQ19EUUVWRU5UMzI6IGNtZCA9IFZJRElPQ19EUUVWRU5UOyBicmVhazsKIAljYXNlIFZJRElPQ19PVkVSTEFZMzI6IGNtZCA9IFZJRElPQ19PVkVSTEFZOyBicmVhazsKIAljYXNlIFZJRElPQ19TVFJFQU1PTjMyOiBjbWQgPSBWSURJT0NfU1RSRUFNT047IGJyZWFrOwogCWNhc2UgVklESU9DX1NUUkVBTU9GRjMyOiBjbWQgPSBWSURJT0NfU1RSRUFNT0ZGOyBicmVhazsKQEAgLTc3OCw2ICs4MDcsOSBAQAogCQllcnIgPSBnZXRfdjRsMl9leHRfY29udHJvbHMzMigma2FyZy52MmVjcywgdXApOwogCQljb21wYXRpYmxlX2FyZyA9IDA7CiAJCWJyZWFrOworCWNhc2UgVklESU9DX0RRRVZFTlQ6CisJCWNvbXBhdGlibGVfYXJnID0gMDsKKwkJYnJlYWs7CiAJfQogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CkBAIC04MTgsNiArODUwLDEwIEBACiAJCWVyciA9IHB1dF92NGwyX2ZyYW1lYnVmZmVyMzIoJmthcmcudjJmYiwgdXApOwogCQlicmVhazsKIAorCWNhc2UgVklESU9DX0RRRVZFTlQ6CisJCWVyciA9IHB1dF92NGwyX2V2ZW50MzIoJmthcmcudjJldiwgdXApOworCQlicmVhazsKKwogCWNhc2UgVklESU9DX0dfRk1UOgogCWNhc2UgVklESU9DX1NfRk1UOgogCWNhc2UgVklESU9DX1RSWV9GTVQ6CkBAIC05MjAsNiArOTU2LDcgQEAKIAljYXNlIFZJRElPQ19TX0RWX1RJTUlOR1M6CiAJY2FzZSBWSURJT0NfR19EVl9USU1JTkdTOgogCWNhc2UgVklESU9DX0RRRVZFTlQ6CisJY2FzZSBWSURJT0NfRFFFVkVOVDMyOgogCWNhc2UgVklESU9DX1NVQlNDUklCRV9FVkVOVDoKIAljYXNlIFZJRElPQ19VTlNVQlNDUklCRV9FVkVOVDoKIAkJcmV0ID0gZG9fdmlkZW9faW9jdGwoZmlsZSwgY21kLCBhcmcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWN0cmxzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY3RybHMuYwppbmRleCAyNDEyZjA4Li4wNmI2MDE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY3RybHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItY3RybHMuYwpAQCAtMjMsMTcgKzIzLDM5IEBACiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1pb2N0bC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItZXZlbnQuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldi5oPgogCisjZGVmaW5lIGhhc19vcChtYXN0ZXIsIG9wKSBcCisJKG1hc3Rlci0+b3BzICYmIG1hc3Rlci0+b3BzLT5vcCkKKyNkZWZpbmUgY2FsbF9vcChtYXN0ZXIsIG9wKSBcCisJKGhhc19vcChtYXN0ZXIsIG9wKSA/IG1hc3Rlci0+b3BzLT5vcChtYXN0ZXIpIDogMCkKKwogLyogSW50ZXJuYWwgdGVtcG9yYXJ5IGhlbHBlciBzdHJ1Y3QsIG9uZSBmb3IgZWFjaCB2NGwyX2V4dF9jb250cm9sICovCi1zdHJ1Y3QgY3RybF9oZWxwZXIgeworc3RydWN0IHY0bDJfY3RybF9oZWxwZXIgeworCS8qIFBvaW50ZXIgdG8gdGhlIGNvbnRyb2wgcmVmZXJlbmNlIG9mIHRoZSBtYXN0ZXIgY29udHJvbCAqLworCXN0cnVjdCB2NGwyX2N0cmxfcmVmICptcmVmOwogCS8qIFRoZSBjb250cm9sIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHY0bDJfZXh0X2NvbnRyb2wgSUQgZmllbGQuICovCiAJc3RydWN0IHY0bDJfY3RybCAqY3RybDsKLQkvKiBVc2VkIGludGVybmFsbHkgdG8gbWFyayB3aGV0aGVyIHRoaXMgY29udHJvbCB3YXMgYWxyZWFkeQotCSAgIHByb2Nlc3NlZC4gKi8KLQlib29sIGhhbmRsZWQ7CisJLyogdjRsMl9leHRfY29udHJvbCBpbmRleCBvZiB0aGUgbmV4dCBjb250cm9sIGJlbG9uZ2luZyB0byB0aGUKKwkgICBzYW1lIGNsdXN0ZXIsIG9yIDAgaWYgdGhlcmUgaXNuJ3QgYW55LiAqLworCXUzMiBuZXh0OwogfTsKIAorLyogU21hbGwgaGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSBpZiB0aGUgYXV0b2NsdXN0ZXIgaXMgc2V0IHRvIG1hbnVhbAorICAgbW9kZS4gSW4gdGhhdCBjYXNlIHRoZSBpc192b2xhdGlsZSBmbGFnIHNob3VsZCBiZSBpZ25vcmVkLiAqLworc3RhdGljIGJvb2wgaXNfY3VyX21hbnVhbChjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsICptYXN0ZXIpCit7CisJcmV0dXJuIG1hc3Rlci0+aXNfYXV0byAmJiBtYXN0ZXItPmN1ci52YWwgPT0gbWFzdGVyLT5tYW51YWxfbW9kZV92YWx1ZTsKK30KKworLyogU2FtZSBhcyBhYm92ZSwgYnV0IHRoaXMgY2hlY2tzIHRoZSBhZ2FpbnN0IHRoZSBuZXcgdmFsdWUgaW5zdGVhZCBvZiB0aGUKKyAgIGN1cnJlbnQgdmFsdWUuICovCitzdGF0aWMgYm9vbCBpc19uZXdfbWFudWFsKGNvbnN0IHN0cnVjdCB2NGwyX2N0cmwgKm1hc3RlcikKK3sKKwlyZXR1cm4gbWFzdGVyLT5pc19hdXRvICYmIG1hc3Rlci0+dmFsID09IG1hc3Rlci0+bWFudWFsX21vZGVfdmFsdWU7Cit9CisKIC8qIFJldHVybnMgTlVMTCBvciBhIGNoYXJhY3RlciBwb2ludGVyIGFycmF5IGNvbnRhaW5pbmcgdGhlIG1lbnUgZm9yCiAgICB0aGUgZ2l2ZW4gY29udHJvbCBJRC4gVGhlIHBvaW50ZXIgYXJyYXkgZW5kcyB3aXRoIGEgTlVMTCBwb2ludGVyLgogICAgQW4gZW1wdHkgc3RyaW5nIHNpZ25pZmllcyBhIG1lbnUgZW50cnkgdGhhdCBpcyBpbnZhbGlkLiBUaGlzIGFsbG93cwpAQCAtMTgxLDcgKzIwMyw3IEBACiAJfTsKIAlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1wZWdfc3RyZWFtX3ZiaV9mbXRbXSA9IHsKIAkJIk5vIFZCSSIsCi0JCSJQcml2YXRlIHBhY2tldCwgSVZUViBmb3JtYXQiLAorCQkiUHJpdmF0ZSBQYWNrZXQsIElWVFYgRm9ybWF0IiwKIAkJTlVMTAogCX07CiAJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjYW1lcmFfcG93ZXJfbGluZV9mcmVxdWVuY3lbXSA9IHsKQEAgLTIwNCwxOCArMjI2LDEzMCBAQAogCQkiTmVnYXRpdmUiLAogCQkiRW1ib3NzIiwKIAkJIlNrZXRjaCIsCi0JCSJTa3kgYmx1ZSIsCi0JCSJHcmFzcyBncmVlbiIsCi0JCSJTa2luIHdoaXRlbiIsCisJCSJTa3kgQmx1ZSIsCisJCSJHcmFzcyBHcmVlbiIsCisJCSJTa2luIFdoaXRlbiIsCiAJCSJWaXZpZCIsCiAJCU5VTEwKIAl9OwogCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdHVuZV9wcmVlbXBoYXNpc1tdID0gewotCQkiTm8gcHJlZW1waGFzaXMiLAorCQkiTm8gUHJlZW1waGFzaXMiLAogCQkiNTAgdXNlY29uZHMiLAogCQkiNzUgdXNlY29uZHMiLAogCQlOVUxMLAogCX07CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBoZWFkZXJfbW9kZVtdID0geworCQkiU2VwYXJhdGUgQnVmZmVyIiwKKwkJIkpvaW5lZCBXaXRoIDFzdCBGcmFtZSIsCisJCU5VTEwsCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG11bHRpX3NsaWNlW10gPSB7CisJCSJTaW5nbGUiLAorCQkiTWF4IE1hY3JvYmxvY2tzIiwKKwkJIk1heCBCeXRlcyIsCisJCU5VTEwsCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGVudHJvcHlfbW9kZVtdID0geworCQkiQ0FWTEMiLAorCQkiQ0FCQUMiLAorCQlOVUxMLAorCX07CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBtcGVnX2gyNjRfbGV2ZWxbXSA9IHsKKwkJIjEiLAorCQkiMWIiLAorCQkiMS4xIiwKKwkJIjEuMiIsCisJCSIxLjMiLAorCQkiMiIsCisJCSIyLjEiLAorCQkiMi4yIiwKKwkJIjMiLAorCQkiMy4xIiwKKwkJIjMuMiIsCisJCSI0IiwKKwkJIjQuMSIsCisJCSI0LjIiLAorCQkiNSIsCisJCSI1LjEiLAorCQlOVUxMLAorCX07CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBoMjY0X2xvb3BfZmlsdGVyW10gPSB7CisJCSJFbmFibGVkIiwKKwkJIkRpc2FibGVkIiwKKwkJIkRpc2FibGVkIGF0IFNsaWNlIEJvdW5kYXJ5IiwKKwkJTlVMTCwKKwl9OworCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaDI2NF9wcm9maWxlW10gPSB7CisJCSJCYXNlbGluZSIsCisJCSJDb25zdHJhaW5lZCBCYXNlbGluZSIsCisJCSJNYWluIiwKKwkJIkV4dGVuZGVkIiwKKwkJIkhpZ2giLAorCQkiSGlnaCAxMCIsCisJCSJIaWdoIDQyMiIsCisJCSJIaWdoIDQ0NCBQcmVkaWN0aXZlIiwKKwkJIkhpZ2ggMTAgSW50cmEiLAorCQkiSGlnaCA0MjIgSW50cmEiLAorCQkiSGlnaCA0NDQgSW50cmEiLAorCQkiQ0FWTEMgNDQ0IEludHJhIiwKKwkJIlNjYWxhYmxlIEJhc2VsaW5lIiwKKwkJIlNjYWxhYmxlIEhpZ2giLAorCQkiU2NhbGFibGUgSGlnaCBJbnRyYSIsCisJCSJNdWx0aXZpZXcgSGlnaCIsCisJCU5VTEwsCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZ1aV9zYXJfaWRjW10gPSB7CisJCSJVbnNwZWNpZmllZCIsCisJCSIxOjEiLAorCQkiMTI6MTEiLAorCQkiMTA6MTEiLAorCQkiMTY6MTEiLAorCQkiNDA6MzMiLAorCQkiMjQ6MTEiLAorCQkiMjA6MTEiLAorCQkiMzI6MTEiLAorCQkiODA6MzMiLAorCQkiMTg6MTEiLAorCQkiMTU6MTEiLAorCQkiNjQ6MzMiLAorCQkiMTYwOjk5IiwKKwkJIjQ6MyIsCisJCSIzOjIiLAorCQkiMjoxIiwKKwkJIkV4dGVuZGVkIFNBUiIsCisJCU5VTEwsCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG1wZWdfbXBlZzRfbGV2ZWxbXSA9IHsKKwkJIjAiLAorCQkiMGIiLAorCQkiMSIsCisJCSIyIiwKKwkJIjMiLAorCQkiM2IiLAorCQkiNCIsCisJCSI1IiwKKwkJTlVMTCwKKwl9OworCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbXBlZzRfcHJvZmlsZVtdID0geworCQkiU2ltcGxlIiwKKwkJIkFkY2FudmVkIFNpbXBsZSIsCisJCSJDb3JlIiwKKwkJIlNpbXBsZSBTY2FsYWJsZSIsCisJCSJBZHZhbmNlZCBDb2RpbmcgRWZmaWNlbmN5IiwKKwkJTlVMTCwKKwl9OworCisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBmbGFzaF9sZWRfbW9kZVtdID0geworCQkiT2ZmIiwKKwkJIkZsYXNoIiwKKwkJIlRvcmNoIiwKKwkJTlVMTCwKKwl9OworCXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgZmxhc2hfc3Ryb2JlX3NvdXJjZVtdID0geworCQkiU29mdHdhcmUiLAorCQkiRXh0ZXJuYWwiLAorCQlOVUxMLAorCX07CiAKIAlzd2l0Y2ggKGlkKSB7CiAJY2FzZSBWNEwyX0NJRF9NUEVHX0FVRElPX1NBTVBMSU5HX0ZSRVE6CkBAIC0yNTYsNiArMzkwLDI4IEBACiAJCXJldHVybiBjb2xvcmZ4OwogCWNhc2UgVjRMMl9DSURfVFVORV9QUkVFTVBIQVNJUzoKIAkJcmV0dXJuIHR1bmVfcHJlZW1waGFzaXM7CisJY2FzZSBWNEwyX0NJRF9GTEFTSF9MRURfTU9ERToKKwkJcmV0dXJuIGZsYXNoX2xlZF9tb2RlOworCWNhc2UgVjRMMl9DSURfRkxBU0hfU1RST0JFX1NPVVJDRToKKwkJcmV0dXJuIGZsYXNoX3N0cm9iZV9zb3VyY2U7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0hFQURFUl9NT0RFOgorCQlyZXR1cm4gaGVhZGVyX21vZGU7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VTFRJX1NMSUNFX01PREU6CisJCXJldHVybiBtdWx0aV9zbGljZTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9FTlRST1BZX01PREU6CisJCXJldHVybiBlbnRyb3B5X21vZGU7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTEVWRUw6CisJCXJldHVybiBtcGVnX2gyNjRfbGV2ZWw7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTE9PUF9GSUxURVJfTU9ERToKKwkJcmV0dXJuIGgyNjRfbG9vcF9maWx0ZXI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRToKKwkJcmV0dXJuIGgyNjRfcHJvZmlsZTsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQzoKKwkJcmV0dXJuIHZ1aV9zYXJfaWRjOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9MRVZFTDoKKwkJcmV0dXJuIG1wZWdfbXBlZzRfbGV2ZWw7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEU6CisJCXJldHVybiBtcGVnNF9wcm9maWxlOwogCWRlZmF1bHQ6CiAJCXJldHVybiBOVUxMOwogCX0KQEAgLTMwNyw2ICs0NjMsOCBAQAogCWNhc2UgVjRMMl9DSURfQ0hST01BX0dBSU46CQlyZXR1cm4gIkNocm9tYSBHYWluIjsKIAljYXNlIFY0TDJfQ0lEX0lMTFVNSU5BVE9SU18xOgkJcmV0dXJuICJJbGx1bWluYXRvciAxIjsKIAljYXNlIFY0TDJfQ0lEX0lMTFVNSU5BVE9SU18yOgkJcmV0dXJuICJJbGx1bWluYXRvciAyIjsKKwljYXNlIFY0TDJfQ0lEX01JTl9CVUZGRVJTX0ZPUl9DQVBUVVJFOglyZXR1cm4gIk1pbmltdW0gTnVtYmVyIG9mIENhcHR1cmUgQnVmZmVycyI7CisJY2FzZSBWNEwyX0NJRF9NSU5fQlVGRkVSU19GT1JfT1VUUFVUOglyZXR1cm4gIk1pbmltdW0gTnVtYmVyIG9mIE91dHB1dCBCdWZmZXJzIjsKIAogCS8qIE1QRUcgY29udHJvbHMgKi8KIAkvKiBLZWVwIHRoZSBvcmRlciBvZiB0aGUgJ2Nhc2UncyB0aGUgc2FtZSBhcyBpbiB2aWRlb2RldjIuaCEgKi8KQEAgLTM0Myw2ICs1MDEsNDggQEAKIAljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fVEVNUE9SQUxfREVDSU1BVElPTjogcmV0dXJuICJWaWRlbyBUZW1wb3JhbCBEZWNpbWF0aW9uIjsKIAljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fTVVURToJCXJldHVybiAiVmlkZW8gTXV0ZSI7CiAJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VVEVfWVVWOglyZXR1cm4gIlZpZGVvIE11dGUgWVVWIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fREVDT0RFUl9TTElDRV9JTlRFUkZBQ0U6CXJldHVybiAiRGVjb2RlciBTbGljZSBJbnRlcmZhY2UiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19ERUNPREVSX01QRUc0X0RFQkxPQ0tfRklMVEVSOglyZXR1cm4gIk1QRUc0IExvb3AgRmlsdGVyIEVuYWJsZSI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0NZQ0xJQ19JTlRSQV9SRUZSRVNIX01COglyZXR1cm4gIlRoZSBOdW1iZXIgb2YgSW50cmEgUmVmcmVzaCBNQnMiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19GUkFNRV9SQ19FTkFCTEU6CQlyZXR1cm4gIkZyYW1lIExldmVsIFJhdGUgQ29udHJvbCBFbmFibGUiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NQl9SQ19FTkFCTEU6CQkJcmV0dXJuICJIMjY0IE1CIExldmVsIFJhdGUgQ29udHJvbCI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0hFQURFUl9NT0RFOgkJCXJldHVybiAiU2VxdWVuY2UgSGVhZGVyIE1vZGUiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NQVhfUkVGX1BJQzoJCQlyZXR1cm4gIlRoZSBNYXggTnVtYmVyIG9mIFJlZmVyZW5jZSBQaWN0dXJlIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19JX0ZSQU1FX1FQOgkJcmV0dXJuICJIMjYzIEktRnJhbWUgUVAgVmFsdWUiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjYzX1BfRlJBTUVfUVA6CQlyZXR1cm4gIkgyNjMgUCBmcmFtZSBRUCBWYWx1ZSI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjNfQl9GUkFNRV9RUDoJCXJldHVybiAiSDI2MyBCIGZyYW1lIFFQIFZhbHVlIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19NSU5fUVA6CQkJcmV0dXJuICJIMjYzIE1pbmltdW0gUVAgVmFsdWUiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjYzX01BWF9RUDoJCQlyZXR1cm4gIkgyNjMgTWF4aW11bSBRUCBWYWx1ZSI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfSV9GUkFNRV9RUDoJCXJldHVybiAiSDI2NCBJLUZyYW1lIFFQIFZhbHVlIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9QX0ZSQU1FX1FQOgkJcmV0dXJuICJIMjY0IFAgZnJhbWUgUVAgVmFsdWUiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0JfRlJBTUVfUVA6CQlyZXR1cm4gIkgyNjQgQiBmcmFtZSBRUCBWYWx1ZSI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTUFYX1FQOgkJCXJldHVybiAiSDI2NCBNYXhpbXVtIFFQIFZhbHVlIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9NSU5fUVA6CQkJcmV0dXJuICJIMjY0IE1pbmltdW0gUVAgVmFsdWUiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjY0XzhYOF9UUkFOU0ZPUk06CQlyZXR1cm4gIkgyNjQgOHg4IFRyYW5zZm9ybSBFbmFibGUiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0NQQl9TSVpFOgkJCXJldHVybiAiSDI2NCBDUEIgQnVmZmVyIFNpemUiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0VOVFJPUFlfTU9ERToJCXJldHVybiAiSDI2NCBFbnRvcnB5IE1vZGUiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0lfUEVSSU9EOgkJCXJldHVybiAiSDI2NCBJIFBlcmlvZCI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTEVWRUw6CQkJcmV0dXJuICJIMjY0IExldmVsIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9BTFBIQToJcmV0dXJuICJIMjY0IExvb3AgRmlsdGVyIEFscGhhIE9mZnNldCI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTE9PUF9GSUxURVJfQkVUQToJCXJldHVybiAiSDI2NCBMb29wIEZpbHRlciBCZXRhIE9mZnNldCI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTE9PUF9GSUxURVJfTU9ERToJCXJldHVybiAiSDI2NCBMb29wIEZpbHRlciBNb2RlIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9QUk9GSUxFOgkJCXJldHVybiAiSDI2NCBQcm9maWxlIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9WVUlfRVhUX1NBUl9IRUlHSFQ6CXJldHVybiAiVmVydGljYWwgU2l6ZSBvZiBTQVIiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1ZVSV9FWFRfU0FSX1dJRFRIOglyZXR1cm4gIkhvcml6b250YWwgU2l6ZSBvZiBTQVIiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfRU5BQkxFOgkJcmV0dXJuICJBc3BlY3QgUmF0aW8gVlVJIEVuYWJsZSI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JREM6CQlyZXR1cm4gIlZVSSBBc3BlY3QgUmF0aW8gSURDIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfSV9GUkFNRV9RUDoJCXJldHVybiAiTVBFRzQgSS1GcmFtZSBRUCBWYWx1ZSI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X1BfRlJBTUVfUVA6CQlyZXR1cm4gIk1QRUc0IFAgZnJhbWUgUVAgVmFsdWUiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9CX0ZSQU1FX1FQOgkJcmV0dXJuICJNUEVHNCBCIGZyYW1lIFFQIFZhbHVlIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfTUlOX1FQOgkJCXJldHVybiAiTVBFRzQgTWluaW11bSBRUCBWYWx1ZSI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X01BWF9RUDoJCQlyZXR1cm4gIk1QRUc0IE1heGltdW0gUVAgVmFsdWUiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9MRVZFTDoJCQlyZXR1cm4gIk1QRUc0IExldmVsIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfUFJPRklMRToJCQlyZXR1cm4gIk1QRUc0IFByb2ZpbGUiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9RUEVMOgkJCXJldHVybiAiUXVhcnRlciBQaXhlbCBTZWFyY2ggRW5hYmxlIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fTVVMVElfU0xJQ0VfTUFYX0JZVEVTOgkJcmV0dXJuICJUaGUgTWF4aW11bSBCeXRlcyBQZXIgU2xpY2UiOworCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NVUxUSV9TTElDRV9NQVhfTUI6CQlyZXR1cm4gIlRoZSBOdW1iZXIgb2YgTUIgaW4gYSBTbGljZSI7CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VTFRJX1NMSUNFX01PREU6CQlyZXR1cm4gIlRoZSBTbGljZSBQYXJ0aXRpb25pbmcgTWV0aG9kIjsKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fVkJWX1NJWkU6CQkJcmV0dXJuICJWQlYgQnVmZmVyIFNpemUiOwogCiAJLyogQ0FNRVJBIGNvbnRyb2xzICovCiAJLyogS2VlcCB0aGUgb3JkZXIgb2YgdGhlICdjYXNlJ3MgdGhlIHNhbWUgYXMgaW4gdmlkZW9kZXYyLmghICovCkBAIC0zODksNiArNTg5LDIxIEBACiAJY2FzZSBWNEwyX0NJRF9UVU5FX1BPV0VSX0xFVkVMOgkJcmV0dXJuICJUdW5lIFBvd2VyIExldmVsIjsKIAljYXNlIFY0TDJfQ0lEX1RVTkVfQU5URU5OQV9DQVBBQ0lUT1I6CXJldHVybiAiVHVuZSBBbnRlbm5hIENhcGFjaXRvciI7CiAKKwkvKiBGbGFzaCBjb250cm9scyAqLworCWNhc2UgVjRMMl9DSURfRkxBU0hfQ0xBU1M6CQlyZXR1cm4gIkZsYXNoIGNvbnRyb2xzIjsKKwljYXNlIFY0TDJfQ0lEX0ZMQVNIX0xFRF9NT0RFOgkJcmV0dXJuICJMRUQgbW9kZSI7CisJY2FzZSBWNEwyX0NJRF9GTEFTSF9TVFJPQkVfU09VUkNFOglyZXR1cm4gIlN0cm9iZSBzb3VyY2UiOworCWNhc2UgVjRMMl9DSURfRkxBU0hfU1RST0JFOgkJcmV0dXJuICJTdHJvYmUiOworCWNhc2UgVjRMMl9DSURfRkxBU0hfU1RST0JFX1NUT1A6CXJldHVybiAiU3RvcCBzdHJvYmUiOworCWNhc2UgVjRMMl9DSURfRkxBU0hfU1RST0JFX1NUQVRVUzoJcmV0dXJuICJTdHJvYmUgc3RhdHVzIjsKKwljYXNlIFY0TDJfQ0lEX0ZMQVNIX1RJTUVPVVQ6CQlyZXR1cm4gIlN0cm9iZSB0aW1lb3V0IjsKKwljYXNlIFY0TDJfQ0lEX0ZMQVNIX0lOVEVOU0lUWToJCXJldHVybiAiSW50ZW5zaXR5LCBmbGFzaCBtb2RlIjsKKwljYXNlIFY0TDJfQ0lEX0ZMQVNIX1RPUkNIX0lOVEVOU0lUWToJcmV0dXJuICJJbnRlbnNpdHksIHRvcmNoIG1vZGUiOworCWNhc2UgVjRMMl9DSURfRkxBU0hfSU5ESUNBVE9SX0lOVEVOU0lUWTogcmV0dXJuICJJbnRlbnNpdHksIGluZGljYXRvciI7CisJY2FzZSBWNEwyX0NJRF9GTEFTSF9GQVVMVDoJCXJldHVybiAiRmF1bHRzIjsKKwljYXNlIFY0TDJfQ0lEX0ZMQVNIX0NIQVJHRToJCXJldHVybiAiQ2hhcmdlIjsKKwljYXNlIFY0TDJfQ0lEX0ZMQVNIX1JFQURZOgkJcmV0dXJuICJSZWFkeSB0byBzdHJvYmUiOworCiAJZGVmYXVsdDoKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtNDIzLDEyICs2MzgsMjQgQEAKIAljYXNlIFY0TDJfQ0lEX1BJTE9UX1RPTkVfRU5BQkxFRDoKIAljYXNlIFY0TDJfQ0lEX0lMTFVNSU5BVE9SU18xOgogCWNhc2UgVjRMMl9DSURfSUxMVU1JTkFUT1JTXzI6CisJY2FzZSBWNEwyX0NJRF9GTEFTSF9TVFJPQkVfU1RBVFVTOgorCWNhc2UgVjRMMl9DSURfRkxBU0hfQ0hBUkdFOgorCWNhc2UgVjRMMl9DSURfRkxBU0hfUkVBRFk6CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0RFQ09ERVJfTVBFRzRfREVCTE9DS19GSUxURVI6CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0RFQ09ERVJfU0xJQ0VfSU5URVJGQUNFOgorCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19GUkFNRV9SQ19FTkFCTEU6CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01CX1JDX0VOQUJMRToKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF84WDhfVFJBTlNGT1JNOgorCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfRU5BQkxFOgorCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9RUEVMOgogCQkqdHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU47CiAJCSptaW4gPSAwOwogCQkqbWF4ID0gKnN0ZXAgPSAxOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ0lEX1BBTl9SRVNFVDoKIAljYXNlIFY0TDJfQ0lEX1RJTFRfUkVTRVQ6CisJY2FzZSBWNEwyX0NJRF9GTEFTSF9TVFJPQkU6CisJY2FzZSBWNEwyX0NJRF9GTEFTSF9TVFJPQkVfU1RPUDoKIAkJKnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9CVVRUT047CiAJCSpmbGFncyB8PSBWNEwyX0NUUkxfRkxBR19XUklURV9PTkxZOwogCQkqbWluID0gKm1heCA9ICpzdGVwID0gKmRlZiA9IDA7CkBAIC00NTIsNiArNjc5LDE3IEBACiAJY2FzZSBWNEwyX0NJRF9FWFBPU1VSRV9BVVRPOgogCWNhc2UgVjRMMl9DSURfQ09MT1JGWDoKIAljYXNlIFY0TDJfQ0lEX1RVTkVfUFJFRU1QSEFTSVM6CisJY2FzZSBWNEwyX0NJRF9GTEFTSF9MRURfTU9ERToKKwljYXNlIFY0TDJfQ0lEX0ZMQVNIX1NUUk9CRV9TT1VSQ0U6CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0hFQURFUl9NT0RFOgorCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NVUxUSV9TTElDRV9NT0RFOgorCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0VOVFJPUFlfTU9ERToKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MRVZFTDoKKwljYXNlIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MT09QX0ZJTFRFUl9NT0RFOgorCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1BST0ZJTEU6CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JREM6CisJY2FzZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X0xFVkVMOgorCWNhc2UgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9QUk9GSUxFOgogCQkqdHlwZSA9IFY0TDJfQ1RSTF9UWVBFX01FTlU7CiAJCWJyZWFrOwogCWNhc2UgVjRMMl9DSURfUkRTX1RYX1BTX05BTUU6CkBAIC00NjIsNiArNzAwLDcgQEAKIAljYXNlIFY0TDJfQ0lEX0NBTUVSQV9DTEFTUzoKIAljYXNlIFY0TDJfQ0lEX01QRUdfQ0xBU1M6CiAJY2FzZSBWNEwyX0NJRF9GTV9UWF9DTEFTUzoKKwljYXNlIFY0TDJfQ0lEX0ZMQVNIX0NMQVNTOgogCQkqdHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0NUUkxfQ0xBU1M7CiAJCS8qIFlvdSBjYW4gbmVpdGhlciByZWFkIG5vdCB3cml0ZSB0aGVzZSAqLwogCQkqZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfUkVBRF9PTkxZIHwgVjRMMl9DVFJMX0ZMQUdfV1JJVEVfT05MWTsKQEAgLTQ3NCw2ICs3MTMsMTQgQEAKIAkJLyogTWF4IGlzIGNhbGN1bGF0ZWQgYXMgUkdCODg4IHRoYXQgaXMgMl4yNCAqLwogCQkqbWF4ID0gMHhGRkZGRkY7CiAJCWJyZWFrOworCWNhc2UgVjRMMl9DSURfRkxBU0hfRkFVTFQ6CisJCSp0eXBlID0gVjRMMl9DVFJMX1RZUEVfQklUTUFTSzsKKwkJYnJlYWs7CisJY2FzZSBWNEwyX0NJRF9NSU5fQlVGRkVSU19GT1JfQ0FQVFVSRToKKwljYXNlIFY0TDJfQ0lEX01JTl9CVUZGRVJTX0ZPUl9PVVRQVVQ6CisJCSp0eXBlID0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUjsKKwkJKmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX1JFQURfT05MWTsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJKnR5cGUgPSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSOwogCQlicmVhazsKQEAgLTUxOSw2ICs3NjYsMTAgQEAKIAljYXNlIFY0TDJfQ0lEX1pPT01fUkVMQVRJVkU6CiAJCSpmbGFncyB8PSBWNEwyX0NUUkxfRkxBR19XUklURV9PTkxZOwogCQlicmVhazsKKwljYXNlIFY0TDJfQ0lEX0ZMQVNIX1NUUk9CRV9TVEFUVVM6CisJY2FzZSBWNEwyX0NJRF9GTEFTSF9SRUFEWToKKwkJKmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX1JFQURfT05MWTsKKwkJYnJlYWs7CiAJfQogfQogRVhQT1JUX1NZTUJPTCh2NGwyX2N0cmxfZmlsbCk7CkBAIC01MzcsNiArNzg4LDQyIEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBmaWxsX2V2ZW50KHN0cnVjdCB2NGwyX2V2ZW50ICpldiwgc3RydWN0IHY0bDJfY3RybCAqY3RybCwgdTMyIGNoYW5nZXMpCit7CisJbWVtc2V0KGV2LT5yZXNlcnZlZCwgMCwgc2l6ZW9mKGV2LT5yZXNlcnZlZCkpOworCWV2LT50eXBlID0gVjRMMl9FVkVOVF9DVFJMOworCWV2LT5pZCA9IGN0cmwtPmlkOworCWV2LT51LmN0cmwuY2hhbmdlcyA9IGNoYW5nZXM7CisJZXYtPnUuY3RybC50eXBlID0gY3RybC0+dHlwZTsKKwlldi0+dS5jdHJsLmZsYWdzID0gY3RybC0+ZmxhZ3M7CisJaWYgKGN0cmwtPnR5cGUgPT0gVjRMMl9DVFJMX1RZUEVfU1RSSU5HKQorCQlldi0+dS5jdHJsLnZhbHVlNjQgPSAwOworCWVsc2UKKwkJZXYtPnUuY3RybC52YWx1ZTY0ID0gY3RybC0+Y3VyLnZhbDY0OworCWV2LT51LmN0cmwubWluaW11bSA9IGN0cmwtPm1pbmltdW07CisJZXYtPnUuY3RybC5tYXhpbXVtID0gY3RybC0+bWF4aW11bTsKKwlpZiAoY3RybC0+dHlwZSA9PSBWNEwyX0NUUkxfVFlQRV9NRU5VKQorCQlldi0+dS5jdHJsLnN0ZXAgPSAxOworCWVsc2UKKwkJZXYtPnUuY3RybC5zdGVwID0gY3RybC0+c3RlcDsKKwlldi0+dS5jdHJsLmRlZmF1bHRfdmFsdWUgPSBjdHJsLT5kZWZhdWx0X3ZhbHVlOworfQorCitzdGF0aWMgdm9pZCBzZW5kX2V2ZW50KHN0cnVjdCB2NGwyX2ZoICpmaCwgc3RydWN0IHY0bDJfY3RybCAqY3RybCwgdTMyIGNoYW5nZXMpCit7CisJc3RydWN0IHY0bDJfZXZlbnQgZXY7CisJc3RydWN0IHY0bDJfc3Vic2NyaWJlZF9ldmVudCAqc2V2OworCisJaWYgKGxpc3RfZW1wdHkoJmN0cmwtPmV2X3N1YnMpKQorCQlyZXR1cm47CisJZmlsbF9ldmVudCgmZXYsIGN0cmwsIGNoYW5nZXMpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzZXYsICZjdHJsLT5ldl9zdWJzLCBub2RlKQorCQlpZiAoc2V2LT5maCAmJiAoc2V2LT5maCAhPSBmaCB8fAorCQkJCShzZXYtPmZsYWdzICYgVjRMMl9FVkVOVF9TVUJfRkxfQUxMT1dfRkVFREJBQ0spKSkKKwkJCXY0bDJfZXZlbnRfcXVldWVfZmgoc2V2LT5maCwgJmV2KTsKK30KKwogLyogSGVscGVyIGZ1bmN0aW9uOiBjb3B5IHRoZSBjdXJyZW50IGNvbnRyb2wgdmFsdWUgYmFjayB0byB0aGUgY2FsbGVyICovCiBzdGF0aWMgaW50IGN1cl90b191c2VyKHN0cnVjdCB2NGwyX2V4dF9jb250cm9sICpjLAogCQkgICAgICAgc3RydWN0IHY0bDJfY3RybCAqY3RybCkKQEAgLTYyNCwyMiArOTExLDQ1IEBACiB9CiAKIC8qIENvcHkgdGhlIG5ldyB2YWx1ZSB0byB0aGUgY3VycmVudCB2YWx1ZS4gKi8KLXN0YXRpYyB2b2lkIG5ld190b19jdXIoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKK3N0YXRpYyB2b2lkIG5ld190b19jdXIoc3RydWN0IHY0bDJfZmggKmZoLCBzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsLAorCQkJCQkJYm9vbCB1cGRhdGVfaW5hY3RpdmUpCiB7CisJYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisKIAlpZiAoY3RybCA9PSBOVUxMKQogCQlyZXR1cm47CiAJc3dpdGNoIChjdHJsLT50eXBlKSB7CisJY2FzZSBWNEwyX0NUUkxfVFlQRV9CVVRUT046CisJCWNoYW5nZWQgPSB0cnVlOworCQlicmVhazsKIAljYXNlIFY0TDJfQ1RSTF9UWVBFX1NUUklORzoKIAkJLyogc3RyaW5ncyBhcmUgYWx3YXlzIDAtdGVybWluYXRlZCAqLworCQljaGFuZ2VkID0gc3RyY21wKGN0cmwtPnN0cmluZywgY3RybC0+Y3VyLnN0cmluZyk7CiAJCXN0cmNweShjdHJsLT5jdXIuc3RyaW5nLCBjdHJsLT5zdHJpbmcpOwogCQlicmVhazsKIAljYXNlIFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVI2NDoKKwkJY2hhbmdlZCA9IGN0cmwtPnZhbDY0ICE9IGN0cmwtPmN1ci52YWw2NDsKIAkJY3RybC0+Y3VyLnZhbDY0ID0gY3RybC0+dmFsNjQ7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CisJCWNoYW5nZWQgPSBjdHJsLT52YWwgIT0gY3RybC0+Y3VyLnZhbDsKIAkJY3RybC0+Y3VyLnZhbCA9IGN0cmwtPnZhbDsKIAkJYnJlYWs7CiAJfQorCWlmICh1cGRhdGVfaW5hY3RpdmUpIHsKKwkJY3RybC0+ZmxhZ3MgJj0gflY0TDJfQ1RSTF9GTEFHX0lOQUNUSVZFOworCQlpZiAoIWlzX2N1cl9tYW51YWwoY3RybC0+Y2x1c3RlclswXSkpCisJCQljdHJsLT5mbGFncyB8PSBWNEwyX0NUUkxfRkxBR19JTkFDVElWRTsKKwl9CisJaWYgKGNoYW5nZWQgfHwgdXBkYXRlX2luYWN0aXZlKSB7CisJCS8qIElmIGEgY29udHJvbCB3YXMgY2hhbmdlZCB0aGF0IHdhcyBub3Qgb25lIG9mIHRoZSBjb250cm9scworCQkgICBtb2RpZmllZCBieSB0aGUgYXBwbGljYXRpb24sIHRoZW4gc2VuZCB0aGUgZXZlbnQgdG8gYWxsLiAqLworCQlpZiAoIWN0cmwtPmlzX25ldykKKwkJCWZoID0gTlVMTDsKKwkJc2VuZF9ldmVudChmaCwgY3RybCwKKwkJCShjaGFuZ2VkID8gVjRMMl9FVkVOVF9DVFJMX0NIX1ZBTFVFIDogMCkgfAorCQkJKHVwZGF0ZV9pbmFjdGl2ZSA/IFY0TDJfRVZFTlRfQ1RSTF9DSF9GTEFHUyA6IDApKTsKKwl9CiB9CiAKIC8qIENvcHkgdGhlIGN1cnJlbnQgdmFsdWUgdG8gdGhlIG5ldyB2YWx1ZSAqLwpAQCAtNjkyLDEzICsxMDAyLDExIEBACiAJcmV0dXJuIGRpZmY7CiB9CiAKLS8qIFZhbGlkYXRlIGEgbmV3IGNvbnRyb2wgKi8KLXN0YXRpYyBpbnQgdmFsaWRhdGVfbmV3KHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpCisvKiBWYWxpZGF0ZSBpbnRlZ2VyLXR5cGUgY29udHJvbCAqLworc3RhdGljIGludCB2YWxpZGF0ZV9uZXdfaW50KGNvbnN0IHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwsIHMzMiAqcHZhbCkKIHsKLQlzMzIgdmFsID0gY3RybC0+dmFsOwotCWNoYXIgKnMgPSBjdHJsLT5zdHJpbmc7CisJczMyIHZhbCA9ICpwdmFsOwogCXUzMiBvZmZzZXQ7Ci0Jc2l6ZV90IGxlbjsKIAogCXN3aXRjaCAoY3RybC0+dHlwZSkgewogCWNhc2UgVjRMMl9DVFJMX1RZUEVfSU5URUdFUjoKQEAgLTcxMSwxMSArMTAxOSwxMSBAQAogCQlvZmZzZXQgPSB2YWwgLSBjdHJsLT5taW5pbXVtOwogCQlvZmZzZXQgPSBjdHJsLT5zdGVwICogKG9mZnNldCAvIGN0cmwtPnN0ZXApOwogCQl2YWwgPSBjdHJsLT5taW5pbXVtICsgb2Zmc2V0OwotCQljdHJsLT52YWwgPSB2YWw7CisJCSpwdmFsID0gdmFsOwogCQlyZXR1cm4gMDsKIAogCWNhc2UgVjRMMl9DVFJMX1RZUEVfQk9PTEVBTjoKLQkJY3RybC0+dmFsID0gISFjdHJsLT52YWw7CisJCSpwdmFsID0gISF2YWw7CiAJCXJldHVybiAwOwogCiAJY2FzZSBWNEwyX0NUUkxfVFlQRV9NRU5VOgpAQCAtNzI2LDExICsxMDM0LDM1IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJcmV0dXJuIDA7CiAKKwljYXNlIFY0TDJfQ1RSTF9UWVBFX0JJVE1BU0s6CisJCSpwdmFsICY9IGN0cmwtPm1heGltdW07CisJCXJldHVybiAwOworCiAJY2FzZSBWNEwyX0NUUkxfVFlQRV9CVVRUT046CiAJY2FzZSBWNEwyX0NUUkxfVFlQRV9DVFJMX0NMQVNTOgotCQljdHJsLT52YWw2NCA9IDA7CisJCSpwdmFsID0gMDsKIAkJcmV0dXJuIDA7CiAKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKKy8qIFZhbGlkYXRlIGEgbmV3IGNvbnRyb2wgKi8KK3N0YXRpYyBpbnQgdmFsaWRhdGVfbmV3KGNvbnN0IHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwsIHN0cnVjdCB2NGwyX2V4dF9jb250cm9sICpjKQoreworCWNoYXIgKnMgPSBjLT5zdHJpbmc7CisJc2l6ZV90IGxlbjsKKworCXN3aXRjaCAoY3RybC0+dHlwZSkgeworCWNhc2UgVjRMMl9DVFJMX1RZUEVfSU5URUdFUjoKKwljYXNlIFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU46CisJY2FzZSBWNEwyX0NUUkxfVFlQRV9NRU5VOgorCWNhc2UgVjRMMl9DVFJMX1RZUEVfQklUTUFTSzoKKwljYXNlIFY0TDJfQ1RSTF9UWVBFX0JVVFRPTjoKKwljYXNlIFY0TDJfQ1RSTF9UWVBFX0NUUkxfQ0xBU1M6CisJCXJldHVybiB2YWxpZGF0ZV9uZXdfaW50KGN0cmwsICZjLT52YWx1ZSk7CisKIAljYXNlIFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVI2NDoKIAkJcmV0dXJuIDA7CiAKQEAgLTc4MCw2ICsxMTEyLDcgQEAKIHsKIAlzdHJ1Y3QgdjRsMl9jdHJsX3JlZiAqcmVmLCAqbmV4dF9yZWY7CiAJc3RydWN0IHY0bDJfY3RybCAqY3RybCwgKm5leHRfY3RybDsKKwlzdHJ1Y3QgdjRsMl9zdWJzY3JpYmVkX2V2ZW50ICpzZXYsICpuZXh0X3NldjsKIAogCWlmIChoZGwgPT0gTlVMTCB8fCBoZGwtPmJ1Y2tldHMgPT0gTlVMTCkKIAkJcmV0dXJuOwpAQCAtNzkzLDYgKzExMjYsOCBAQAogCS8qIEZyZWUgYWxsIGNvbnRyb2xzIG93bmVkIGJ5IHRoZSBoYW5kbGVyICovCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGN0cmwsIG5leHRfY3RybCwgJmhkbC0+Y3RybHMsIG5vZGUpIHsKIAkJbGlzdF9kZWwoJmN0cmwtPm5vZGUpOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc2V2LCBuZXh0X3NldiwgJmN0cmwtPmV2X3N1YnMsIG5vZGUpCisJCQlsaXN0X2RlbCgmc2V2LT5ub2RlKTsKIAkJa2ZyZWUoY3RybCk7CiAJfQogCWtmcmVlKGhkbC0+YnVja2V0cyk7CkBAIC05NjIsMTMgKzEyOTcsMTcgQEAKIAogCS8qIFNhbml0eSBjaGVja3MgKi8KIAlpZiAoaWQgPT0gMCB8fCBuYW1lID09IE5VTEwgfHwgaWQgPj0gVjRMMl9DSURfUFJJVkFURV9CQVNFIHx8Ci0JICAgIG1heCA8IG1pbiB8fAogCSAgICAodHlwZSA9PSBWNEwyX0NUUkxfVFlQRV9JTlRFR0VSICYmIHN0ZXAgPT0gMCkgfHwKKwkgICAgKHR5cGUgPT0gVjRMMl9DVFJMX1RZUEVfQklUTUFTSyAmJiBtYXggPT0gMCkgfHwKIAkgICAgKHR5cGUgPT0gVjRMMl9DVFJMX1RZUEVfTUVOVSAmJiBxbWVudSA9PSBOVUxMKSB8fAogCSAgICAodHlwZSA9PSBWNEwyX0NUUkxfVFlQRV9TVFJJTkcgJiYgbWF4ID09IDApKSB7CiAJCWhhbmRsZXJfc2V0X2VycihoZGwsIC1FUkFOR0UpOwogCQlyZXR1cm4gTlVMTDsKIAl9CisJaWYgKHR5cGUgIT0gVjRMMl9DVFJMX1RZUEVfQklUTUFTSyAmJiBtYXggPCBtaW4pIHsKKwkJaGFuZGxlcl9zZXRfZXJyKGhkbCwgLUVSQU5HRSk7CisJCXJldHVybiBOVUxMOworCX0KIAlpZiAoKHR5cGUgPT0gVjRMMl9DVFJMX1RZUEVfSU5URUdFUiB8fAogCSAgICAgdHlwZSA9PSBWNEwyX0NUUkxfVFlQRV9NRU5VIHx8CiAJICAgICB0eXBlID09IFY0TDJfQ1RSTF9UWVBFX0JPT0xFQU4pICYmCkBAIC05NzYsNiArMTMxNSwxMCBAQAogCQloYW5kbGVyX3NldF9lcnIoaGRsLCAtRVJBTkdFKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQorCWlmICh0eXBlID09IFY0TDJfQ1RSTF9UWVBFX0JJVE1BU0sgJiYgKChkZWYgJiB+bWF4KSB8fCBtaW4gfHwgc3RlcCkpIHsKKwkJaGFuZGxlcl9zZXRfZXJyKGhkbCwgLUVSQU5HRSk7CisJCXJldHVybiBOVUxMOworCX0KIAogCWlmICh0eXBlID09IFY0TDJfQ1RSTF9UWVBFX0JVVFRPTikKIAkJZmxhZ3MgfD0gVjRMMl9DVFJMX0ZMQUdfV1JJVEVfT05MWTsKQEAgLTk5MSw2ICsxMzM0LDcgQEAKIAl9CiAKIAlJTklUX0xJU1RfSEVBRCgmY3RybC0+bm9kZSk7CisJSU5JVF9MSVNUX0hFQUQoJmN0cmwtPmV2X3N1YnMpOwogCWN0cmwtPmhhbmRsZXIgPSBoZGw7CiAJY3RybC0+b3BzID0gb3BzOwogCWN0cmwtPmlkID0gaWQ7CkBAIC0xMTMyLDYgKzE0NzYsOSBAQAogCQkvKiBTa2lwIGhhbmRsZXItcHJpdmF0ZSBjb250cm9scy4gKi8KIAkJaWYgKGN0cmwtPmlzX3ByaXZhdGUpCiAJCQljb250aW51ZTsKKwkJLyogQW5kIGNvbnRyb2wgY2xhc3NlcyAqLworCQlpZiAoY3RybC0+dHlwZSA9PSBWNEwyX0NUUkxfVFlQRV9DVFJMX0NMQVNTKQorCQkJY29udGludWU7CiAJCXJldCA9IGhhbmRsZXJfbmV3X3JlZihoZGwsIGN0cmwpOwogCQlpZiAocmV0KQogCQkJYnJlYWs7CkBAIC0xMTQ3LDcgKzE0OTQsNyBAQAogCWludCBpOwogCiAJLyogVGhlIGZpcnN0IGNvbnRyb2wgaXMgdGhlIG1hc3RlciBjb250cm9sIGFuZCBpdCBtdXN0IG5vdCBiZSBOVUxMICovCi0JQlVHX09OKGNvbnRyb2xzWzBdID09IE5VTEwpOworCUJVR19PTihuY29udHJvbHMgPT0gMCB8fCBjb250cm9sc1swXSA9PSBOVUxMKTsKIAogCWZvciAoaSA9IDA7IGkgPCBuY29udHJvbHM7IGkrKykgewogCQlpZiAoY29udHJvbHNbaV0pIHsKQEAgLTExNTgsMTggKzE1MDUsNDcgQEAKIH0KIEVYUE9SVF9TWU1CT0wodjRsMl9jdHJsX2NsdXN0ZXIpOwogCit2b2lkIHY0bDJfY3RybF9hdXRvX2NsdXN0ZXIodW5zaWduZWQgbmNvbnRyb2xzLCBzdHJ1Y3QgdjRsMl9jdHJsICoqY29udHJvbHMsCisJCQkgICAgdTggbWFudWFsX3ZhbCwgYm9vbCBzZXRfdm9sYXRpbGUpCit7CisJc3RydWN0IHY0bDJfY3RybCAqbWFzdGVyID0gY29udHJvbHNbMF07CisJdTMyIGZsYWc7CisJaW50IGk7CisKKwl2NGwyX2N0cmxfY2x1c3RlcihuY29udHJvbHMsIGNvbnRyb2xzKTsKKwlXQVJOX09OKG5jb250cm9scyA8PSAxKTsKKwlXQVJOX09OKG1hbnVhbF92YWwgPCBtYXN0ZXItPm1pbmltdW0gfHwgbWFudWFsX3ZhbCA+IG1hc3Rlci0+bWF4aW11bSk7CisJbWFzdGVyLT5pc19hdXRvID0gdHJ1ZTsKKwltYXN0ZXItPm1hbnVhbF9tb2RlX3ZhbHVlID0gbWFudWFsX3ZhbDsKKwltYXN0ZXItPmZsYWdzIHw9IFY0TDJfQ1RSTF9GTEFHX1VQREFURTsKKwlmbGFnID0gaXNfY3VyX21hbnVhbChtYXN0ZXIpID8gMCA6IFY0TDJfQ1RSTF9GTEFHX0lOQUNUSVZFOworCisJZm9yIChpID0gMTsgaSA8IG5jb250cm9sczsgaSsrKQorCQlpZiAoY29udHJvbHNbaV0pIHsKKwkJCWNvbnRyb2xzW2ldLT5pc192b2xhdGlsZSA9IHNldF92b2xhdGlsZTsKKwkJCWNvbnRyb2xzW2ldLT5mbGFncyB8PSBmbGFnOworCQl9Cit9CitFWFBPUlRfU1lNQk9MKHY0bDJfY3RybF9hdXRvX2NsdXN0ZXIpOworCiAvKiBBY3RpdmF0ZS9kZWFjdGl2YXRlIGEgY29udHJvbC4gKi8KIHZvaWQgdjRsMl9jdHJsX2FjdGl2YXRlKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwsIGJvb2wgYWN0aXZlKQogeworCS8qIGludmVydCBzaW5jZSB0aGUgYWN0dWFsIGZsYWcgaXMgY2FsbGVkICdpbmFjdGl2ZScgKi8KKwlib29sIGluYWN0aXZlID0gIWFjdGl2ZTsKKwlib29sIG9sZDsKKwogCWlmIChjdHJsID09IE5VTEwpCiAJCXJldHVybjsKIAotCWlmICghYWN0aXZlKQorCWlmIChpbmFjdGl2ZSkKIAkJLyogc2V0IFY0TDJfQ1RSTF9GTEFHX0lOQUNUSVZFICovCi0JCXNldF9iaXQoNCwgJmN0cmwtPmZsYWdzKTsKKwkJb2xkID0gdGVzdF9hbmRfc2V0X2JpdCg0LCAmY3RybC0+ZmxhZ3MpOwogCWVsc2UKIAkJLyogY2xlYXIgVjRMMl9DVFJMX0ZMQUdfSU5BQ1RJVkUgKi8KLQkJY2xlYXJfYml0KDQsICZjdHJsLT5mbGFncyk7CisJCW9sZCA9IHRlc3RfYW5kX2NsZWFyX2JpdCg0LCAmY3RybC0+ZmxhZ3MpOworCWlmIChvbGQgIT0gaW5hY3RpdmUpCisJCXNlbmRfZXZlbnQoTlVMTCwgY3RybCwgVjRMMl9FVkVOVF9DVFJMX0NIX0ZMQUdTKTsKIH0KIEVYUE9SVF9TWU1CT0wodjRsMl9jdHJsX2FjdGl2YXRlKTsKIApAQCAtMTE4MSwxNSArMTU1NywyMSBAQAogICAgdGhlc2UgY29udHJvbHMuICovCiB2b2lkIHY0bDJfY3RybF9ncmFiKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwsIGJvb2wgZ3JhYmJlZCkKIHsKKwlib29sIG9sZDsKKwogCWlmIChjdHJsID09IE5VTEwpCiAJCXJldHVybjsKIAorCXY0bDJfY3RybF9sb2NrKGN0cmwpOwogCWlmIChncmFiYmVkKQogCQkvKiBzZXQgVjRMMl9DVFJMX0ZMQUdfR1JBQkJFRCAqLwotCQlzZXRfYml0KDEsICZjdHJsLT5mbGFncyk7CisJCW9sZCA9IHRlc3RfYW5kX3NldF9iaXQoMSwgJmN0cmwtPmZsYWdzKTsKIAllbHNlCiAJCS8qIGNsZWFyIFY0TDJfQ1RSTF9GTEFHX0dSQUJCRUQgKi8KLQkJY2xlYXJfYml0KDEsICZjdHJsLT5mbGFncyk7CisJCW9sZCA9IHRlc3RfYW5kX2NsZWFyX2JpdCgxLCAmY3RybC0+ZmxhZ3MpOworCWlmIChvbGQgIT0gZ3JhYmJlZCkKKwkJc2VuZF9ldmVudChOVUxMLCBjdHJsLCBWNEwyX0VWRU5UX0NUUkxfQ0hfRkxBR1MpOworCXY0bDJfY3RybF91bmxvY2soY3RybCk7CiB9CiBFWFBPUlRfU1lNQk9MKHY0bDJfY3RybF9ncmFiKTsKIApAQCAtMTIxNyw2ICsxNTk5LDkgQEAKIAljYXNlIFY0TDJfQ1RSTF9UWVBFX01FTlU6CiAJCXByaW50ayhLRVJOX0NPTlQgIiVzIiwgY3RybC0+cW1lbnVbY3RybC0+Y3VyLnZhbF0pOwogCQlicmVhazsKKwljYXNlIFY0TDJfQ1RSTF9UWVBFX0JJVE1BU0s6CisJCXByaW50ayhLRVJOX0NPTlQgIjB4JTA4eCIsIGN0cmwtPmN1ci52YWwpOworCQlicmVhazsKIAljYXNlIFY0TDJfQ1RSTF9UWVBFX0lOVEVHRVI2NDoKIAkJcHJpbnRrKEtFUk5fQ09OVCAiJWxsZCIsIGN0cmwtPmN1ci52YWw2NCk7CiAJCWJyZWFrOwpAQCAtMTI3NywyNiArMTY2MiwyMSBAQAogCQlpbnQgaTsKIAogCQkvKiBTa2lwIGlmIHRoaXMgY29udHJvbCB3YXMgYWxyZWFkeSBoYW5kbGVkIGJ5IGEgY2x1c3Rlci4gKi8KLQkJaWYgKGN0cmwtPmRvbmUpCisJCS8qIFNraXAgYnV0dG9uIGNvbnRyb2xzIGFuZCByZWFkLW9ubHkgY29udHJvbHMuICovCisJCWlmIChjdHJsLT5kb25lIHx8IGN0cmwtPnR5cGUgPT0gVjRMMl9DVFJMX1RZUEVfQlVUVE9OIHx8CisJCSAgICAoY3RybC0+ZmxhZ3MgJiBWNEwyX0NUUkxfRkxBR19SRUFEX09OTFkpKQogCQkJY29udGludWU7CiAKIAkJZm9yIChpID0gMDsgaSA8IG1hc3Rlci0+bmNvbnRyb2xzOyBpKyspIHsKIAkJCWlmIChtYXN0ZXItPmNsdXN0ZXJbaV0pIHsKIAkJCQljdXJfdG9fbmV3KG1hc3Rlci0+Y2x1c3RlcltpXSk7CiAJCQkJbWFzdGVyLT5jbHVzdGVyW2ldLT5pc19uZXcgPSAxOworCQkJCW1hc3Rlci0+Y2x1c3RlcltpXS0+ZG9uZSA9IHRydWU7CiAJCQl9CiAJCX0KLQotCQkvKiBTa2lwIGJ1dHRvbiBjb250cm9scyBhbmQgcmVhZC1vbmx5IGNvbnRyb2xzLiAqLwotCQlpZiAoY3RybC0+dHlwZSA9PSBWNEwyX0NUUkxfVFlQRV9CVVRUT04gfHwKLQkJICAgIChjdHJsLT5mbGFncyAmIFY0TDJfQ1RSTF9GTEFHX1JFQURfT05MWSkpCi0JCQljb250aW51ZTsKLQkJcmV0ID0gbWFzdGVyLT5vcHMtPnNfY3RybChtYXN0ZXIpOworCQlyZXQgPSBjYWxsX29wKG1hc3Rlciwgc19jdHJsKTsKIAkJaWYgKHJldCkKIAkJCWJyZWFrOwotCQlmb3IgKGkgPSAwOyBpIDwgbWFzdGVyLT5uY29udHJvbHM7IGkrKykKLQkJCWlmIChtYXN0ZXItPmNsdXN0ZXJbaV0pCi0JCQkJbWFzdGVyLT5jbHVzdGVyW2ldLT5kb25lID0gdHJ1ZTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZoZGwtPmxvY2spOwogCXJldHVybiByZXQ7CkBAIC0xNDQ3LDE4ICsxODI3LDE5IEBACiAgICBGaW5kIHRoZSBjb250cm9scyBpbiB0aGUgY29udHJvbCBhcnJheSBhbmQgZG8gc29tZSBiYXNpYyBjaGVja3MuICovCiBzdGF0aWMgaW50IHByZXBhcmVfZXh0X2N0cmxzKHN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciAqaGRsLAogCQkJICAgICBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgKmNzLAotCQkJICAgICBzdHJ1Y3QgY3RybF9oZWxwZXIgKmhlbHBlcnMsCi0JCQkgICAgIGJvb2wgdHJ5KQorCQkJICAgICBzdHJ1Y3QgdjRsMl9jdHJsX2hlbHBlciAqaGVscGVycykKIHsKKwlzdHJ1Y3QgdjRsMl9jdHJsX2hlbHBlciAqaDsKKwlib29sIGhhdmVfY2x1c3RlcnMgPSBmYWxzZTsKIAl1MzIgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBjcy0+Y291bnQ7IGkrKykgeworCWZvciAoaSA9IDAsIGggPSBoZWxwZXJzOyBpIDwgY3MtPmNvdW50OyBpKyssIGgrKykgewogCQlzdHJ1Y3QgdjRsMl9leHRfY29udHJvbCAqYyA9ICZjcy0+Y29udHJvbHNbaV07CisJCXN0cnVjdCB2NGwyX2N0cmxfcmVmICpyZWY7CiAJCXN0cnVjdCB2NGwyX2N0cmwgKmN0cmw7CiAJCXUzMiBpZCA9IGMtPmlkICYgVjRMMl9DVFJMX0lEX01BU0s7CiAKLQkJaWYgKHRyeSkKLQkJCWNzLT5lcnJvcl9pZHggPSBpOworCQljcy0+ZXJyb3JfaWR4ID0gaTsKIAogCQlpZiAoY3MtPmN0cmxfY2xhc3MgJiYgVjRMMl9DVFJMX0lEMkNMQVNTKGlkKSAhPSBjcy0+Y3RybF9jbGFzcykKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtMTQ2Nyw1NSArMTg0OCw2MSBAQAogCQkgICBleHRlbmRlZCBjb250cm9scyAqLwogCQlpZiAoaWQgPj0gVjRMMl9DSURfUFJJVkFURV9CQVNFKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWN0cmwgPSB2NGwyX2N0cmxfZmluZChoZGwsIGlkKTsKLQkJaWYgKGN0cmwgPT0gTlVMTCkKKwkJcmVmID0gZmluZF9yZWZfbG9jayhoZGwsIGlkKTsKKwkJaWYgKHJlZiA9PSBOVUxMKQogCQkJcmV0dXJuIC1FSU5WQUw7CisJCWN0cmwgPSByZWYtPmN0cmw7CiAJCWlmIChjdHJsLT5mbGFncyAmIFY0TDJfQ1RSTF9GTEFHX0RJU0FCTEVEKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJaGVscGVyc1tpXS5jdHJsID0gY3RybDsKLQkJaGVscGVyc1tpXS5oYW5kbGVkID0gZmFsc2U7CisJCWlmIChjdHJsLT5jbHVzdGVyWzBdLT5uY29udHJvbHMgPiAxKQorCQkJaGF2ZV9jbHVzdGVycyA9IHRydWU7CisJCWlmIChjdHJsLT5jbHVzdGVyWzBdICE9IGN0cmwpCisJCQlyZWYgPSBmaW5kX3JlZl9sb2NrKGhkbCwgY3RybC0+Y2x1c3RlclswXS0+aWQpOworCQkvKiBTdG9yZSB0aGUgcmVmIHRvIHRoZSBtYXN0ZXIgY29udHJvbCBvZiB0aGUgY2x1c3RlciAqLworCQloLT5tcmVmID0gcmVmOworCQloLT5jdHJsID0gY3RybDsKKwkJLyogSW5pdGlhbGx5IHNldCBuZXh0IHRvIDAsIG1lYW5pbmcgdGhhdCB0aGVyZSBpcyBubyBvdGhlcgorCQkgICBjb250cm9sIGluIHRoaXMgaGVscGVyIGFycmF5IGJlbG9uZ2luZyB0byB0aGUgc2FtZQorCQkgICBjbHVzdGVyICovCisJCWgtPm5leHQgPSAwOwogCX0KKworCS8qIFdlIGFyZSBkb25lIGlmIHRoZXJlIHdlcmUgbm8gY29udHJvbHMgdGhhdCBiZWxvbmcgdG8gYSBtdWx0aS0KKwkgICBjb250cm9sIGNsdXN0ZXIuICovCisJaWYgKCFoYXZlX2NsdXN0ZXJzKQorCQlyZXR1cm4gMDsKKworCS8qIFRoZSBjb2RlIGJlbG93IGZpZ3VyZXMgb3V0IGluIE8obikgdGltZSB3aGljaCBjb250cm9scyBpbiB0aGUgbGlzdAorCSAgIGJlbG9uZyB0byB0aGUgc2FtZSBjbHVzdGVyLiAqLworCisJLyogVGhpcyBoYXMgdG8gYmUgZG9uZSB3aXRoIHRoZSBoYW5kbGVyIGxvY2sgdGFrZW4uICovCisJbXV0ZXhfbG9jaygmaGRsLT5sb2NrKTsKKworCS8qIEZpcnN0IHplcm8gdGhlIGhlbHBlciBmaWVsZCBpbiB0aGUgbWFzdGVyIGNvbnRyb2wgcmVmZXJlbmNlcyAqLworCWZvciAoaSA9IDA7IGkgPCBjcy0+Y291bnQ7IGkrKykKKwkJaGVscGVyc1tpXS5tcmVmLT5oZWxwZXIgPSAwOworCWZvciAoaSA9IDAsIGggPSBoZWxwZXJzOyBpIDwgY3MtPmNvdW50OyBpKyssIGgrKykgeworCQlzdHJ1Y3QgdjRsMl9jdHJsX3JlZiAqbXJlZiA9IGgtPm1yZWY7CisKKwkJLyogSWYgdGhlIG1yZWYtPmhlbHBlciBpcyBzZXQsIHRoZW4gaXQgcG9pbnRzIHRvIGFuIGVhcmxpZXIKKwkJICAgaGVscGVyIHRoYXQgYmVsb25ncyB0byB0aGUgc2FtZSBjbHVzdGVyLiAqLworCQlpZiAobXJlZi0+aGVscGVyKSB7CisJCQkvKiBTZXQgdGhlIG5leHQgZmllbGQgb2YgbXJlZi0+aGVscGVyIHRvIHRoZSBjdXJyZW50CisJCQkgICBpbmRleDogdGhpcyBtZWFucyB0aGF0IHRoYXQgZWFybGllciBoZWxwZXIgbm93CisJCQkgICBwb2ludHMgdG8gdGhlIG5leHQgaGVscGVyIGluIHRoZSBzYW1lIGNsdXN0ZXIuICovCisJCQltcmVmLT5oZWxwZXItPm5leHQgPSBpOworCQkJLyogbXJlZiBzaG91bGQgYmUgc2V0IG9ubHkgZm9yIHRoZSBmaXJzdCBoZWxwZXIgaW4gdGhlCisJCQkgICBjbHVzdGVyLCBjbGVhciB0aGUgb3RoZXJzLiAqLworCQkJaC0+bXJlZiA9IE5VTEw7CisJCX0KKwkJLyogUG9pbnQgdGhlIG1yZWYgaGVscGVyIHRvIHRoZSBjdXJyZW50IGhlbHBlciBzdHJ1Y3QuICovCisJCW1yZWYtPmhlbHBlciA9IGg7CisJfQorCW11dGV4X3VubG9jaygmaGRsLT5sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIAotdHlwZWRlZiBpbnQgKCpjbHVzdGVyX2Z1bmMpKHN0cnVjdCB2NGwyX2V4dF9jb250cm9sICpjLAotCQkJICAgIHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpOwotCi0vKiBXYWxrIG92ZXIgYWxsIGNvbnRyb2xzIGluIHY0bDJfZXh0X2NvbnRyb2xzIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBjbHVzdGVyCi0gICBhbmQgY2FsbCB0aGUgcHJvdmlkZWQgZnVuY3Rpb24uICovCi1zdGF0aWMgaW50IGNsdXN0ZXJfd2Fsayh1bnNpZ25lZCBmcm9tLAotCQkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpjcywKLQkJCXN0cnVjdCBjdHJsX2hlbHBlciAqaGVscGVycywKLQkJCWNsdXN0ZXJfZnVuYyBmKQotewotCXN0cnVjdCB2NGwyX2N0cmwgKipjbHVzdGVyID0gaGVscGVyc1tmcm9tXS5jdHJsLT5jbHVzdGVyOwotCWludCByZXQgPSAwOwotCWludCBpOwotCi0JLyogRmluZCBhbnkgY29udHJvbHMgZnJvbSB0aGUgc2FtZSBjbHVzdGVyIGFuZCBjYWxsIHRoZSBmdW5jdGlvbiAqLwotCWZvciAoaSA9IGZyb207ICFyZXQgJiYgaSA8IGNzLT5jb3VudDsgaSsrKSB7Ci0JCXN0cnVjdCB2NGwyX2N0cmwgKmN0cmwgPSBoZWxwZXJzW2ldLmN0cmw7Ci0KLQkJaWYgKCFoZWxwZXJzW2ldLmhhbmRsZWQgJiYgY3RybC0+Y2x1c3RlciA9PSBjbHVzdGVyKQotCQkJcmV0ID0gZigmY3MtPmNvbnRyb2xzW2ldLCBjdHJsKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgY2x1c3Rlcl9kb25lKHVuc2lnbmVkIGZyb20sCi0JCQkgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpjcywKLQkJCSBzdHJ1Y3QgY3RybF9oZWxwZXIgKmhlbHBlcnMpCi17Ci0Jc3RydWN0IHY0bDJfY3RybCAqKmNsdXN0ZXIgPSBoZWxwZXJzW2Zyb21dLmN0cmwtPmNsdXN0ZXI7Ci0JaW50IGk7Ci0KLQkvKiBGaW5kIGFueSBjb250cm9scyBmcm9tIHRoZSBzYW1lIGNsdXN0ZXIgYW5kIG1hcmsgdGhlbSBhcyBoYW5kbGVkICovCi0JZm9yIChpID0gZnJvbTsgaSA8IGNzLT5jb3VudDsgaSsrKQotCQlpZiAoaGVscGVyc1tpXS5jdHJsLT5jbHVzdGVyID09IGNsdXN0ZXIpCi0JCQloZWxwZXJzW2ldLmhhbmRsZWQgPSB0cnVlOwotfQotCiAvKiBIYW5kbGVzIHRoZSBjb3JuZXIgY2FzZSB3aGVyZSBjcy0+Y291bnQgPT0gMC4gSXQgY2hlY2tzIHdoZXRoZXIgdGhlCiAgICBzcGVjaWZpZWQgY29udHJvbCBjbGFzcyBleGlzdHMuIElmIHRoYXQgY2xhc3MgSUQgaXMgMCwgdGhlbiBpdCBjaGVja3MKICAgIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBjb250cm9scyBhdCBhbGwuICovCkBAIC0xNTMxLDEwICsxOTE4LDEwIEBACiAvKiBHZXQgZXh0ZW5kZWQgY29udHJvbHMuIEFsbG9jYXRlcyB0aGUgaGVscGVycyBhcnJheSBpZiBuZWVkZWQuICovCiBpbnQgdjRsMl9nX2V4dF9jdHJscyhzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgKmhkbCwgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpjcykKIHsKLQlzdHJ1Y3QgY3RybF9oZWxwZXIgaGVscGVyWzRdOwotCXN0cnVjdCBjdHJsX2hlbHBlciAqaGVscGVycyA9IGhlbHBlcjsKKwlzdHJ1Y3QgdjRsMl9jdHJsX2hlbHBlciBoZWxwZXJbNF07CisJc3RydWN0IHY0bDJfY3RybF9oZWxwZXIgKmhlbHBlcnMgPSBoZWxwZXI7CiAJaW50IHJldDsKLQlpbnQgaTsKKwlpbnQgaSwgajsKIAogCWNzLT5lcnJvcl9pZHggPSBjcy0+Y291bnQ7CiAJY3MtPmN0cmxfY2xhc3MgPSBWNEwyX0NUUkxfSUQyQ0xBU1MoY3MtPmN0cmxfY2xhc3MpOwpAQCAtMTU1MSwzMCArMTkzOCw0NiBAQAogCQkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JcmV0ID0gcHJlcGFyZV9leHRfY3RybHMoaGRsLCBjcywgaGVscGVycywgZmFsc2UpOworCXJldCA9IHByZXBhcmVfZXh0X2N0cmxzKGhkbCwgY3MsIGhlbHBlcnMpOworCWNzLT5lcnJvcl9pZHggPSBjcy0+Y291bnQ7CiAKIAlmb3IgKGkgPSAwOyAhcmV0ICYmIGkgPCBjcy0+Y291bnQ7IGkrKykKIAkJaWYgKGhlbHBlcnNbaV0uY3RybC0+ZmxhZ3MgJiBWNEwyX0NUUkxfRkxBR19XUklURV9PTkxZKQogCQkJcmV0ID0gLUVBQ0NFUzsKIAogCWZvciAoaSA9IDA7ICFyZXQgJiYgaSA8IGNzLT5jb3VudDsgaSsrKSB7Ci0JCXN0cnVjdCB2NGwyX2N0cmwgKmN0cmwgPSBoZWxwZXJzW2ldLmN0cmw7Ci0JCXN0cnVjdCB2NGwyX2N0cmwgKm1hc3RlciA9IGN0cmwtPmNsdXN0ZXJbMF07CisJCWludCAoKmN0cmxfdG9fdXNlcikoc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wgKmMsCisJCQkJICAgIHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwpID0gY3VyX3RvX3VzZXI7CisJCXN0cnVjdCB2NGwyX2N0cmwgKm1hc3RlcjsKIAotCQlpZiAoaGVscGVyc1tpXS5oYW5kbGVkKQorCQlpZiAoaGVscGVyc1tpXS5tcmVmID09IE5VTEwpCiAJCQljb250aW51ZTsKIAorCQltYXN0ZXIgPSBoZWxwZXJzW2ldLm1yZWYtPmN0cmw7CiAJCWNzLT5lcnJvcl9pZHggPSBpOwogCiAJCXY0bDJfY3RybF9sb2NrKG1hc3Rlcik7Ci0JCS8qIGdfdm9sYXRpbGVfY3RybCB3aWxsIHVwZGF0ZSB0aGUgY3VycmVudCBjb250cm9sIHZhbHVlcyAqLwotCQlpZiAoY3RybC0+aXNfdm9sYXRpbGUgJiYgbWFzdGVyLT5vcHMtPmdfdm9sYXRpbGVfY3RybCkKLQkJCXJldCA9IG1hc3Rlci0+b3BzLT5nX3ZvbGF0aWxlX2N0cmwobWFzdGVyKTsKLQkJLyogSWYgT0ssIHRoZW4gY29weSB0aGUgY3VycmVudCBjb250cm9sIHZhbHVlcyB0byB0aGUgY2FsbGVyICovCi0JCWlmICghcmV0KQotCQkJcmV0ID0gY2x1c3Rlcl93YWxrKGksIGNzLCBoZWxwZXJzLCBjdXJfdG9fdXNlcik7CisKKwkJLyogZ192b2xhdGlsZV9jdHJsIHdpbGwgdXBkYXRlIHRoZSBuZXcgY29udHJvbCB2YWx1ZXMgKi8KKwkJaWYgKGhhc19vcChtYXN0ZXIsIGdfdm9sYXRpbGVfY3RybCkgJiYgIWlzX2N1cl9tYW51YWwobWFzdGVyKSkgeworCQkJZm9yIChqID0gMDsgaiA8IG1hc3Rlci0+bmNvbnRyb2xzOyBqKyspCisJCQkJY3VyX3RvX25ldyhtYXN0ZXItPmNsdXN0ZXJbal0pOworCQkJcmV0ID0gY2FsbF9vcChtYXN0ZXIsIGdfdm9sYXRpbGVfY3RybCk7CisJCQljdHJsX3RvX3VzZXIgPSBuZXdfdG9fdXNlcjsKKwkJfQorCQkvKiBJZiBPSywgdGhlbiBjb3B5IHRoZSBjdXJyZW50IChmb3Igbm9uLXZvbGF0aWxlIGNvbnRyb2xzKQorCQkgICBvciB0aGUgbmV3IChmb3Igdm9sYXRpbGUgY29udHJvbHMpIGNvbnRyb2wgdmFsdWVzIHRvIHRoZQorCQkgICBjYWxsZXIgKi8KKwkJaWYgKCFyZXQpIHsKKwkJCXUzMiBpZHggPSBpOworCisJCQlkbyB7CisJCQkJcmV0ID0gY3RybF90b191c2VyKGNzLT5jb250cm9scyArIGlkeCwKKwkJCQkJCSAgIGhlbHBlcnNbaWR4XS5jdHJsKTsKKwkJCQlpZHggPSBoZWxwZXJzW2lkeF0ubmV4dDsKKwkJCX0gd2hpbGUgKCFyZXQgJiYgaWR4KTsKKwkJfQogCQl2NGwyX2N0cmxfdW5sb2NrKG1hc3Rlcik7Ci0JCWNsdXN0ZXJfZG9uZShpLCBjcywgaGVscGVycyk7CiAJfQogCiAJaWYgKGNzLT5jb3VudCA+IEFSUkFZX1NJWkUoaGVscGVyKSkKQEAgLTE1OTQsMTUgKzE5OTcsMjEgQEAKIHsKIAlzdHJ1Y3QgdjRsMl9jdHJsICptYXN0ZXIgPSBjdHJsLT5jbHVzdGVyWzBdOwogCWludCByZXQgPSAwOworCWludCBpOwogCiAJaWYgKGN0cmwtPmZsYWdzICYgVjRMMl9DVFJMX0ZMQUdfV1JJVEVfT05MWSkKIAkJcmV0dXJuIC1FQUNDRVM7CiAKIAl2NGwyX2N0cmxfbG9jayhtYXN0ZXIpOwogCS8qIGdfdm9sYXRpbGVfY3RybCB3aWxsIHVwZGF0ZSB0aGUgY3VycmVudCBjb250cm9sIHZhbHVlcyAqLwotCWlmIChjdHJsLT5pc192b2xhdGlsZSAmJiBtYXN0ZXItPm9wcy0+Z192b2xhdGlsZV9jdHJsKQotCQlyZXQgPSBtYXN0ZXItPm9wcy0+Z192b2xhdGlsZV9jdHJsKG1hc3Rlcik7Ci0JKnZhbCA9IGN0cmwtPmN1ci52YWw7CisJaWYgKGN0cmwtPmlzX3ZvbGF0aWxlICYmICFpc19jdXJfbWFudWFsKG1hc3RlcikpIHsKKwkJZm9yIChpID0gMDsgaSA8IG1hc3Rlci0+bmNvbnRyb2xzOyBpKyspCisJCQljdXJfdG9fbmV3KG1hc3Rlci0+Y2x1c3RlcltpXSk7CisJCXJldCA9IGNhbGxfb3AobWFzdGVyLCBnX3ZvbGF0aWxlX2N0cmwpOworCQkqdmFsID0gY3RybC0+dmFsOworCX0gZWxzZSB7CisJCSp2YWwgPSBjdHJsLT5jdXIudmFsOworCX0KIAl2NGwyX2N0cmxfdW5sb2NrKG1hc3Rlcik7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE2MzgsNzIgKzIwNDcsNjEgQEAKIC8qIENvcmUgZnVuY3Rpb24gdGhhdCBjYWxscyB0cnkvc19jdHJsIGFuZCBlbnN1cmVzIHRoYXQgdGhlIG5ldyB2YWx1ZSBpcwogICAgY29waWVkIHRvIHRoZSBjdXJyZW50IHZhbHVlIG9uIGEgc2V0LgogICAgTXVzdCBiZSBjYWxsZWQgd2l0aCBjdHJsLT5oYW5kbGVyLT5sb2NrIGhlbGQuICovCi1zdGF0aWMgaW50IHRyeV9vcl9zZXRfY29udHJvbF9jbHVzdGVyKHN0cnVjdCB2NGwyX2N0cmwgKm1hc3RlciwgYm9vbCBzZXQpCitzdGF0aWMgaW50IHRyeV9vcl9zZXRfY2x1c3RlcihzdHJ1Y3QgdjRsMl9maCAqZmgsCisJCQkgICAgICBzdHJ1Y3QgdjRsMl9jdHJsICptYXN0ZXIsIGJvb2wgc2V0KQogewotCWJvb2wgdHJ5ID0gIXNldDsKLQlpbnQgcmV0ID0gMDsKKwlib29sIHVwZGF0ZV9mbGFnOworCWludCByZXQ7CiAJaW50IGk7CiAKIAkvKiBHbyB0aHJvdWdoIHRoZSBjbHVzdGVyIGFuZCBlaXRoZXIgdmFsaWRhdGUgdGhlIG5ldyB2YWx1ZSBvcgogCSAgIChpZiBubyBuZXcgdmFsdWUgd2FzIHNldCksIGNvcHkgdGhlIGN1cnJlbnQgdmFsdWUgdG8gdGhlIG5ldwogCSAgIHZhbHVlLCBlbnN1cmluZyBhIGNvbnNpc3RlbnQgdmlldyBmb3IgdGhlIGNvbnRyb2wgb3BzIHdoZW4KIAkgICBjYWxsZWQuICovCi0JZm9yIChpID0gMDsgIXJldCAmJiBpIDwgbWFzdGVyLT5uY29udHJvbHM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBtYXN0ZXItPm5jb250cm9sczsgaSsrKSB7CiAJCXN0cnVjdCB2NGwyX2N0cmwgKmN0cmwgPSBtYXN0ZXItPmNsdXN0ZXJbaV07CiAKIAkJaWYgKGN0cmwgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwogCi0JCWlmIChjdHJsLT5pc19uZXcpIHsKLQkJCS8qIERvdWJsZSBjaGVjayB0aGlzOiBpdCBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZQotCQkJICAgbGFzdCBjaGVjayBpbiB0cnlfb3Jfc2V0X2V4dF9jdHJscygpLiAqLwotCQkJaWYgKHNldCAmJiAoY3RybC0+ZmxhZ3MgJiBWNEwyX0NUUkxfRkxBR19HUkFCQkVEKSkKLQkJCQlyZXR1cm4gLUVCVVNZOwotCi0JCQkvKiBWYWxpZGF0ZSBpZiByZXF1aXJlZCAqLwotCQkJaWYgKCFzZXQpCi0JCQkJcmV0ID0gdmFsaWRhdGVfbmV3KGN0cmwpOworCQlpZiAoIWN0cmwtPmlzX25ldykgeworCQkJY3VyX3RvX25ldyhjdHJsKTsKIAkJCWNvbnRpbnVlOwogCQl9Ci0JCS8qIE5vIG5ldyB2YWx1ZSB3YXMgc2V0LCBzbyBjb3B5IHRoZSBjdXJyZW50IGFuZCBmb3JjZQotCQkgICBhIGNhbGwgdG8gdHJ5X2N0cmwgbGF0ZXIsIHNpbmNlIHRoZSB2YWx1ZXMgZm9yIHRoZSBjbHVzdGVyCi0JCSAgIG1heSBub3cgaGF2ZSBjaGFuZ2VkIGFuZCB0aGUgZW5kIHJlc3VsdCBtaWdodCBiZSBpbnZhbGlkLiAqLwotCQl0cnkgPSB0cnVlOwotCQljdXJfdG9fbmV3KGN0cmwpOworCQkvKiBDaGVjayBhZ2FpbjogaXQgbWF5IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUKKwkJICAgcHJldmlvdXMgY2hlY2sgaW4gdHJ5X29yX3NldF9leHRfY3RybHMoKS4gKi8KKwkJaWYgKHNldCAmJiAoY3RybC0+ZmxhZ3MgJiBWNEwyX0NUUkxfRkxBR19HUkFCQkVEKSkKKwkJCXJldHVybiAtRUJVU1k7CiAJfQogCi0JLyogRm9yIGxhcmdlciBjbHVzdGVycyB5b3UgaGF2ZSB0byBjYWxsIHRyeV9jdHJsIGFnYWluIHRvCi0JICAgdmVyaWZ5IHRoYXQgdGhlIGNvbnRyb2xzIGFyZSBzdGlsbCB2YWxpZCBhZnRlciB0aGUKLQkgICAnY3VyX3RvX25ldycgYWJvdmUuICovCi0JaWYgKCFyZXQgJiYgbWFzdGVyLT5vcHMtPnRyeV9jdHJsICYmIHRyeSkKLQkJcmV0ID0gbWFzdGVyLT5vcHMtPnRyeV9jdHJsKG1hc3Rlcik7CisJcmV0ID0gY2FsbF9vcChtYXN0ZXIsIHRyeV9jdHJsKTsKIAogCS8qIERvbid0IHNldCBpZiB0aGVyZSBpcyBubyBjaGFuZ2UgKi8KLQlpZiAoIXJldCAmJiBzZXQgJiYgY2x1c3Rlcl9jaGFuZ2VkKG1hc3RlcikpIHsKLQkJcmV0ID0gbWFzdGVyLT5vcHMtPnNfY3RybChtYXN0ZXIpOwotCQkvKiBJZiBPSywgdGhlbiBtYWtlIHRoZSBuZXcgdmFsdWVzIHBlcm1hbmVudC4gKi8KLQkJaWYgKCFyZXQpCi0JCQlmb3IgKGkgPSAwOyBpIDwgbWFzdGVyLT5uY29udHJvbHM7IGkrKykKLQkJCQluZXdfdG9fY3VyKG1hc3Rlci0+Y2x1c3RlcltpXSk7Ci0JfQotCXJldHVybiByZXQ7CisJaWYgKHJldCB8fCAhc2V0IHx8ICFjbHVzdGVyX2NoYW5nZWQobWFzdGVyKSkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBjYWxsX29wKG1hc3Rlciwgc19jdHJsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogSWYgT0ssIHRoZW4gbWFrZSB0aGUgbmV3IHZhbHVlcyBwZXJtYW5lbnQuICovCisJdXBkYXRlX2ZsYWcgPSBpc19jdXJfbWFudWFsKG1hc3RlcikgIT0gaXNfbmV3X21hbnVhbChtYXN0ZXIpOworCWZvciAoaSA9IDA7IGkgPCBtYXN0ZXItPm5jb250cm9sczsgaSsrKQorCQluZXdfdG9fY3VyKGZoLCBtYXN0ZXItPmNsdXN0ZXJbaV0sIHVwZGF0ZV9mbGFnICYmIGkgPiAwKTsKKwlyZXR1cm4gMDsKIH0KIAotLyogVHJ5IG9yIHNldCBjb250cm9scy4gKi8KLXN0YXRpYyBpbnQgdHJ5X29yX3NldF9leHRfY3RybHMoc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyICpoZGwsCi0JCQkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpjcywKLQkJCQlzdHJ1Y3QgY3RybF9oZWxwZXIgKmhlbHBlcnMsCi0JCQkJYm9vbCBzZXQpCisvKiBWYWxpZGF0ZSBjb250cm9scy4gKi8KK3N0YXRpYyBpbnQgdmFsaWRhdGVfY3RybHMoc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpjcywKKwkJCSAgc3RydWN0IHY0bDJfY3RybF9oZWxwZXIgKmhlbHBlcnMsIGJvb2wgc2V0KQogewotCXVuc2lnbmVkIGksIGo7CisJdW5zaWduZWQgaTsKIAlpbnQgcmV0ID0gMDsKIAogCWNzLT5lcnJvcl9pZHggPSBjcy0+Y291bnQ7CiAJZm9yIChpID0gMDsgaSA8IGNzLT5jb3VudDsgaSsrKSB7CiAJCXN0cnVjdCB2NGwyX2N0cmwgKmN0cmwgPSBoZWxwZXJzW2ldLmN0cmw7CiAKLQkJaWYgKCFzZXQpCi0JCQljcy0+ZXJyb3JfaWR4ID0gaTsKKwkJY3MtPmVycm9yX2lkeCA9IGk7CiAKIAkJaWYgKGN0cmwtPmZsYWdzICYgVjRMMl9DVFJMX0ZMQUdfUkVBRF9PTkxZKQogCQkJcmV0dXJuIC1FQUNDRVM7CkBAIC0xNzE1LDUwICsyMTEzLDIyIEBACiAJCSAgIGJlc3QtZWZmb3J0IHRvIGF2b2lkIHRoYXQuICovCiAJCWlmIChzZXQgJiYgKGN0cmwtPmZsYWdzICYgVjRMMl9DVFJMX0ZMQUdfR1JBQkJFRCkpCiAJCQlyZXR1cm4gLUVCVVNZOworCQlyZXQgPSB2YWxpZGF0ZV9uZXcoY3RybCwgJmNzLT5jb250cm9sc1tpXSk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCX0KLQotCWZvciAoaSA9IDA7ICFyZXQgJiYgaSA8IGNzLT5jb3VudDsgaSsrKSB7Ci0JCXN0cnVjdCB2NGwyX2N0cmwgKmN0cmwgPSBoZWxwZXJzW2ldLmN0cmw7Ci0JCXN0cnVjdCB2NGwyX2N0cmwgKm1hc3RlciA9IGN0cmwtPmNsdXN0ZXJbMF07Ci0KLQkJY3MtPmVycm9yX2lkeCA9IGk7Ci0KLQkJaWYgKGhlbHBlcnNbaV0uaGFuZGxlZCkKLQkJCWNvbnRpbnVlOwotCi0JCXY0bDJfY3RybF9sb2NrKGN0cmwpOwotCi0JCS8qIFJlc2V0IHRoZSAnaXNfbmV3JyBmbGFncyBvZiB0aGUgY2x1c3RlciAqLwotCQlmb3IgKGogPSAwOyBqIDwgbWFzdGVyLT5uY29udHJvbHM7IGorKykKLQkJCWlmIChtYXN0ZXItPmNsdXN0ZXJbal0pCi0JCQkJbWFzdGVyLT5jbHVzdGVyW2pdLT5pc19uZXcgPSAwOwotCi0JCS8qIENvcHkgdGhlIG5ldyBjYWxsZXItc3VwcGxpZWQgY29udHJvbCB2YWx1ZXMuCi0JCSAgIHVzZXJfdG9fbmV3KCkgc2V0cyAnaXNfbmV3JyB0byAxLiAqLwotCQlyZXQgPSBjbHVzdGVyX3dhbGsoaSwgY3MsIGhlbHBlcnMsIHVzZXJfdG9fbmV3KTsKLQotCQlpZiAoIXJldCkKLQkJCXJldCA9IHRyeV9vcl9zZXRfY29udHJvbF9jbHVzdGVyKG1hc3Rlciwgc2V0KTsKLQotCQkvKiBDb3B5IHRoZSBuZXcgdmFsdWVzIGJhY2sgdG8gdXNlcnNwYWNlLiAqLwotCQlpZiAoIXJldCkKLQkJCXJldCA9IGNsdXN0ZXJfd2FsayhpLCBjcywgaGVscGVycywgbmV3X3RvX3VzZXIpOwotCi0JCXY0bDJfY3RybF91bmxvY2soY3RybCk7Ci0JCWNsdXN0ZXJfZG9uZShpLCBjcywgaGVscGVycyk7Ci0JfQotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIC8qIFRyeSBvciB0cnktYW5kLXNldCBjb250cm9scyAqLwotc3RhdGljIGludCB0cnlfc2V0X2V4dF9jdHJscyhzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgKmhkbCwKK3N0YXRpYyBpbnQgdHJ5X3NldF9leHRfY3RybHMoc3RydWN0IHY0bDJfZmggKmZoLCBzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgKmhkbCwKIAkJCSAgICAgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpjcywKIAkJCSAgICAgYm9vbCBzZXQpCiB7Ci0Jc3RydWN0IGN0cmxfaGVscGVyIGhlbHBlcls0XTsKLQlzdHJ1Y3QgY3RybF9oZWxwZXIgKmhlbHBlcnMgPSBoZWxwZXI7CisJc3RydWN0IHY0bDJfY3RybF9oZWxwZXIgaGVscGVyWzRdOworCXN0cnVjdCB2NGwyX2N0cmxfaGVscGVyICpoZWxwZXJzID0gaGVscGVyOworCXVuc2lnbmVkIGksIGo7CiAJaW50IHJldDsKLQlpbnQgaTsKIAogCWNzLT5lcnJvcl9pZHggPSBjcy0+Y291bnQ7CiAJY3MtPmN0cmxfY2xhc3MgPSBWNEwyX0NUUkxfSUQyQ0xBU1MoY3MtPmN0cmxfY2xhc3MpOwpAQCAtMTc3NCwyNSArMjE0NCw0OSBAQAogCQlpZiAoIWhlbHBlcnMpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JcmV0ID0gcHJlcGFyZV9leHRfY3RybHMoaGRsLCBjcywgaGVscGVycywgIXNldCk7Ci0JaWYgKHJldCkKLQkJZ290byBmcmVlOwotCi0JLyogRmlyc3QgJ3RyeScgYWxsIGNvbnRyb2xzIGFuZCBhYm9ydCBvbiBlcnJvciAqLwotCXJldCA9IHRyeV9vcl9zZXRfZXh0X2N0cmxzKGhkbCwgY3MsIGhlbHBlcnMsIGZhbHNlKTsKLQkvKiBJZiB0aGlzIGlzIGEgJ3NldCcgb3BlcmF0aW9uIGFuZCB0aGUgaW5pdGlhbCAndHJ5JyBmYWlsZWQsCi0JICAgdGhlbiBzZXQgZXJyb3JfaWR4IHRvIGNvdW50IHRvIHRlbGwgdGhlIGFwcGxpY2F0aW9uIHRoYXQgbm8KLQkgICBjb250cm9scyBjaGFuZ2VkIHZhbHVlIHlldC4gKi8KLQlpZiAoc2V0KQorCXJldCA9IHByZXBhcmVfZXh0X2N0cmxzKGhkbCwgY3MsIGhlbHBlcnMpOworCWlmICghcmV0KQorCQlyZXQgPSB2YWxpZGF0ZV9jdHJscyhjcywgaGVscGVycywgc2V0KTsKKwlpZiAocmV0ICYmIHNldCkKIAkJY3MtPmVycm9yX2lkeCA9IGNzLT5jb3VudDsKLQlpZiAoIXJldCAmJiBzZXQpIHsKLQkJLyogUmVzZXQgJ2hhbmRsZWQnIHN0YXRlICovCi0JCWZvciAoaSA9IDA7IGkgPCBjcy0+Y291bnQ7IGkrKykKLQkJCWhlbHBlcnNbaV0uaGFuZGxlZCA9IGZhbHNlOwotCQlyZXQgPSB0cnlfb3Jfc2V0X2V4dF9jdHJscyhoZGwsIGNzLCBoZWxwZXJzLCB0cnVlKTsKKwlmb3IgKGkgPSAwOyAhcmV0ICYmIGkgPCBjcy0+Y291bnQ7IGkrKykgeworCQlzdHJ1Y3QgdjRsMl9jdHJsICptYXN0ZXI7CisJCXUzMiBpZHggPSBpOworCisJCWlmIChoZWxwZXJzW2ldLm1yZWYgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCWNzLT5lcnJvcl9pZHggPSBpOworCQltYXN0ZXIgPSBoZWxwZXJzW2ldLm1yZWYtPmN0cmw7CisJCXY0bDJfY3RybF9sb2NrKG1hc3Rlcik7CisKKwkJLyogUmVzZXQgdGhlICdpc19uZXcnIGZsYWdzIG9mIHRoZSBjbHVzdGVyICovCisJCWZvciAoaiA9IDA7IGogPCBtYXN0ZXItPm5jb250cm9sczsgaisrKQorCQkJaWYgKG1hc3Rlci0+Y2x1c3RlcltqXSkKKwkJCQltYXN0ZXItPmNsdXN0ZXJbal0tPmlzX25ldyA9IDA7CisKKwkJLyogQ29weSB0aGUgbmV3IGNhbGxlci1zdXBwbGllZCBjb250cm9sIHZhbHVlcy4KKwkJICAgdXNlcl90b19uZXcoKSBzZXRzICdpc19uZXcnIHRvIDEuICovCisJCWRvIHsKKwkJCXJldCA9IHVzZXJfdG9fbmV3KGNzLT5jb250cm9scyArIGlkeCwgaGVscGVyc1tpZHhdLmN0cmwpOworCQkJaWR4ID0gaGVscGVyc1tpZHhdLm5leHQ7CisJCX0gd2hpbGUgKCFyZXQgJiYgaWR4KTsKKworCQlpZiAoIXJldCkKKwkJCXJldCA9IHRyeV9vcl9zZXRfY2x1c3RlcihmaCwgbWFzdGVyLCBzZXQpOworCisJCS8qIENvcHkgdGhlIG5ldyB2YWx1ZXMgYmFjayB0byB1c2Vyc3BhY2UuICovCisJCWlmICghcmV0KSB7CisJCQlpZHggPSBpOworCQkJZG8geworCQkJCXJldCA9IG5ld190b191c2VyKGNzLT5jb250cm9scyArIGlkeCwKKwkJCQkJCWhlbHBlcnNbaWR4XS5jdHJsKTsKKwkJCQlpZHggPSBoZWxwZXJzW2lkeF0ubmV4dDsKKwkJCX0gd2hpbGUgKCFyZXQgJiYgaWR4KTsKKwkJfQorCQl2NGwyX2N0cmxfdW5sb2NrKG1hc3Rlcik7CiAJfQogCi1mcmVlOgogCWlmIChjcy0+Y291bnQgPiBBUlJBWV9TSVpFKGhlbHBlcikpCiAJCWtmcmVlKGhlbHBlcnMpOwogCXJldHVybiByZXQ7CkBAIC0xODAwLDM3ICsyMTk0LDM5IEBACiAKIGludCB2NGwyX3RyeV9leHRfY3RybHMoc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyICpoZGwsIHN0cnVjdCB2NGwyX2V4dF9jb250cm9scyAqY3MpCiB7Ci0JcmV0dXJuIHRyeV9zZXRfZXh0X2N0cmxzKGhkbCwgY3MsIGZhbHNlKTsKKwlyZXR1cm4gdHJ5X3NldF9leHRfY3RybHMoTlVMTCwgaGRsLCBjcywgZmFsc2UpOwogfQogRVhQT1JUX1NZTUJPTCh2NGwyX3RyeV9leHRfY3RybHMpOwogCi1pbnQgdjRsMl9zX2V4dF9jdHJscyhzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgKmhkbCwgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpjcykKK2ludCB2NGwyX3NfZXh0X2N0cmxzKHN0cnVjdCB2NGwyX2ZoICpmaCwgc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyICpoZGwsCisJCQkJCXN0cnVjdCB2NGwyX2V4dF9jb250cm9scyAqY3MpCiB7Ci0JcmV0dXJuIHRyeV9zZXRfZXh0X2N0cmxzKGhkbCwgY3MsIHRydWUpOworCXJldHVybiB0cnlfc2V0X2V4dF9jdHJscyhmaCwgaGRsLCBjcywgdHJ1ZSk7CiB9CiBFWFBPUlRfU1lNQk9MKHY0bDJfc19leHRfY3RybHMpOwogCiBpbnQgdjRsMl9zdWJkZXZfdHJ5X2V4dF9jdHJscyhzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgKmNzKQogewotCXJldHVybiB0cnlfc2V0X2V4dF9jdHJscyhzZC0+Y3RybF9oYW5kbGVyLCBjcywgZmFsc2UpOworCXJldHVybiB0cnlfc2V0X2V4dF9jdHJscyhOVUxMLCBzZC0+Y3RybF9oYW5kbGVyLCBjcywgZmFsc2UpOwogfQogRVhQT1JUX1NZTUJPTCh2NGwyX3N1YmRldl90cnlfZXh0X2N0cmxzKTsKIAogaW50IHY0bDJfc3ViZGV2X3NfZXh0X2N0cmxzKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHN0cnVjdCB2NGwyX2V4dF9jb250cm9scyAqY3MpCiB7Ci0JcmV0dXJuIHRyeV9zZXRfZXh0X2N0cmxzKHNkLT5jdHJsX2hhbmRsZXIsIGNzLCB0cnVlKTsKKwlyZXR1cm4gdHJ5X3NldF9leHRfY3RybHMoTlVMTCwgc2QtPmN0cmxfaGFuZGxlciwgY3MsIHRydWUpOwogfQogRVhQT1JUX1NZTUJPTCh2NGwyX3N1YmRldl9zX2V4dF9jdHJscyk7CiAKIC8qIEhlbHBlciBmdW5jdGlvbiBmb3IgVklESU9DX1NfQ1RSTCBjb21wYXRpYmlsaXR5ICovCi1zdGF0aWMgaW50IHNldF9jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwsIHMzMiAqdmFsKQorc3RhdGljIGludCBzZXRfY3RybChzdHJ1Y3QgdjRsMl9maCAqZmgsIHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwsIHMzMiAqdmFsKQogewogCXN0cnVjdCB2NGwyX2N0cmwgKm1hc3RlciA9IGN0cmwtPmNsdXN0ZXJbMF07CiAJaW50IHJldDsKIAlpbnQgaTsKIAotCWlmIChjdHJsLT5mbGFncyAmIFY0TDJfQ1RSTF9GTEFHX1JFQURfT05MWSkKLQkJcmV0dXJuIC1FQUNDRVM7CisJcmV0ID0gdmFsaWRhdGVfbmV3X2ludChjdHJsLCB2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKIAl2NGwyX2N0cmxfbG9jayhjdHJsKTsKIApAQCAtMTg0MSwyOCArMjIzNywzMCBAQAogCiAJY3RybC0+dmFsID0gKnZhbDsKIAljdHJsLT5pc19uZXcgPSAxOwotCXJldCA9IHRyeV9vcl9zZXRfY29udHJvbF9jbHVzdGVyKG1hc3RlciwgZmFsc2UpOwotCWlmICghcmV0KQotCQlyZXQgPSB0cnlfb3Jfc2V0X2NvbnRyb2xfY2x1c3RlcihtYXN0ZXIsIHRydWUpOworCXJldCA9IHRyeV9vcl9zZXRfY2x1c3RlcihmaCwgbWFzdGVyLCB0cnVlKTsKIAkqdmFsID0gY3RybC0+Y3VyLnZhbDsKIAl2NGwyX2N0cmxfdW5sb2NrKGN0cmwpOwogCXJldHVybiByZXQ7CiB9CiAKLWludCB2NGwyX3NfY3RybChzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgKmhkbCwgc3RydWN0IHY0bDJfY29udHJvbCAqY29udHJvbCkKK2ludCB2NGwyX3NfY3RybChzdHJ1Y3QgdjRsMl9maCAqZmgsIHN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciAqaGRsLAorCQkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjb250cm9sKQogewogCXN0cnVjdCB2NGwyX2N0cmwgKmN0cmwgPSB2NGwyX2N0cmxfZmluZChoZGwsIGNvbnRyb2wtPmlkKTsKIAogCWlmIChjdHJsID09IE5VTEwgfHwgIXR5cGVfaXNfaW50KGN0cmwpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldHVybiBzZXRfY3RybChjdHJsLCAmY29udHJvbC0+dmFsdWUpOworCWlmIChjdHJsLT5mbGFncyAmIFY0TDJfQ1RSTF9GTEFHX1JFQURfT05MWSkKKwkJcmV0dXJuIC1FQUNDRVM7CisKKwlyZXR1cm4gc2V0X2N0cmwoZmgsIGN0cmwsICZjb250cm9sLT52YWx1ZSk7CiB9CiBFWFBPUlRfU1lNQk9MKHY0bDJfc19jdHJsKTsKIAogaW50IHY0bDJfc3ViZGV2X3NfY3RybChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jb250cm9sICpjb250cm9sKQogewotCXJldHVybiB2NGwyX3NfY3RybChzZC0+Y3RybF9oYW5kbGVyLCBjb250cm9sKTsKKwlyZXR1cm4gdjRsMl9zX2N0cmwoTlVMTCwgc2QtPmN0cmxfaGFuZGxlciwgY29udHJvbCk7CiB9CiBFWFBPUlRfU1lNQk9MKHY0bDJfc3ViZGV2X3NfY3RybCk7CiAKQEAgLTE4NzAsNiArMjI2OCwzNCBAQAogewogCS8qIEl0J3MgYSBkcml2ZXIgYnVnIGlmIHRoaXMgaGFwcGVucy4gKi8KIAlXQVJOX09OKCF0eXBlX2lzX2ludChjdHJsKSk7Ci0JcmV0dXJuIHNldF9jdHJsKGN0cmwsICZ2YWwpOworCXJldHVybiBzZXRfY3RybChOVUxMLCBjdHJsLCAmdmFsKTsKIH0KIEVYUE9SVF9TWU1CT0wodjRsMl9jdHJsX3NfY3RybCk7CisKK3ZvaWQgdjRsMl9jdHJsX2FkZF9ldmVudChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsLAorCQkJCXN0cnVjdCB2NGwyX3N1YnNjcmliZWRfZXZlbnQgKnNldikKK3sKKwl2NGwyX2N0cmxfbG9jayhjdHJsKTsKKwlsaXN0X2FkZF90YWlsKCZzZXYtPm5vZGUsICZjdHJsLT5ldl9zdWJzKTsKKwlpZiAoY3RybC0+dHlwZSAhPSBWNEwyX0NUUkxfVFlQRV9DVFJMX0NMQVNTICYmCisJICAgIChzZXYtPmZsYWdzICYgVjRMMl9FVkVOVF9TVUJfRkxfU0VORF9JTklUSUFMKSkgeworCQlzdHJ1Y3QgdjRsMl9ldmVudCBldjsKKwkJdTMyIGNoYW5nZXMgPSBWNEwyX0VWRU5UX0NUUkxfQ0hfRkxBR1M7CisKKwkJaWYgKCEoY3RybC0+ZmxhZ3MgJiBWNEwyX0NUUkxfRkxBR19XUklURV9PTkxZKSkKKwkJCWNoYW5nZXMgfD0gVjRMMl9FVkVOVF9DVFJMX0NIX1ZBTFVFOworCQlmaWxsX2V2ZW50KCZldiwgY3RybCwgY2hhbmdlcyk7CisJCXY0bDJfZXZlbnRfcXVldWVfZmgoc2V2LT5maCwgJmV2KTsKKwl9CisJdjRsMl9jdHJsX3VubG9jayhjdHJsKTsKK30KK0VYUE9SVF9TWU1CT0wodjRsMl9jdHJsX2FkZF9ldmVudCk7CisKK3ZvaWQgdjRsMl9jdHJsX2RlbF9ldmVudChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsLAorCQkJCXN0cnVjdCB2NGwyX3N1YnNjcmliZWRfZXZlbnQgKnNldikKK3sKKwl2NGwyX2N0cmxfbG9jayhjdHJsKTsKKwlsaXN0X2RlbCgmc2V2LT5ub2RlKTsKKwl2NGwyX2N0cmxfdW5sb2NrKGN0cmwpOworfQorRVhQT1JUX1NZTUJPTCh2NGwyX2N0cmxfZGVsX2V2ZW50KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1kZXZpY2UuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1kZXZpY2UuYwppbmRleCA0YWFlNTAxLi5jNzI4NTZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZGV2aWNlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWRldmljZS5jCkBAIC0yMDksNiArMjA5LDcgQEAKIAkJdmRldi0+djRsMl9kZXYgPSB2NGwyX2RldjsKIAkJdmRldi0+Zm9wcyA9ICZ2NGwyX3N1YmRldl9mb3BzOwogCQl2ZGV2LT5yZWxlYXNlID0gdmlkZW9fZGV2aWNlX3JlbGVhc2VfZW1wdHk7CisJCXZkZXYtPmN0cmxfaGFuZGxlciA9IHNkLT5jdHJsX2hhbmRsZXI7CiAJCWVyciA9IF9fdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHZkZXYsIFZGTF9UWVBFX1NVQkRFViwgLTEsIDEsCiAJCQkJCSAgICAgIHNkLT5vd25lcik7CiAJCWlmIChlcnIgPCAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWV2ZW50LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZXZlbnQuYwppbmRleCA2OWZkMzQzLi41M2IxOTBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZXZlbnQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZXZlbnQuYwpAQCAtMjUsMTAwICsyNSwzOSBAQAogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1maC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZXZlbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWN0cmxzLmg+CiAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAotaW50IHY0bDJfZXZlbnRfaW5pdChzdHJ1Y3QgdjRsMl9maCAqZmgpCitzdGF0aWMgdW5zaWduZWQgc2V2X3Bvcyhjb25zdCBzdHJ1Y3QgdjRsMl9zdWJzY3JpYmVkX2V2ZW50ICpzZXYsIHVuc2lnbmVkIGlkeCkKIHsKLQlmaC0+ZXZlbnRzID0ga3phbGxvYyhzaXplb2YoKmZoLT5ldmVudHMpLCBHRlBfS0VSTkVMKTsKLQlpZiAoZmgtPmV2ZW50cyA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZoLT5ldmVudHMtPndhaXQpOwotCi0JSU5JVF9MSVNUX0hFQUQoJmZoLT5ldmVudHMtPmZyZWUpOwotCUlOSVRfTElTVF9IRUFEKCZmaC0+ZXZlbnRzLT5hdmFpbGFibGUpOwotCUlOSVRfTElTVF9IRUFEKCZmaC0+ZXZlbnRzLT5zdWJzY3JpYmVkKTsKLQotCWZoLT5ldmVudHMtPnNlcXVlbmNlID0gLTE7Ci0KLQlyZXR1cm4gMDsKKwlpZHggKz0gc2V2LT5maXJzdDsKKwlyZXR1cm4gaWR4ID49IHNldi0+ZWxlbXMgPyBpZHggLSBzZXYtPmVsZW1zIDogaWR4OwogfQotRVhQT1JUX1NZTUJPTF9HUEwodjRsMl9ldmVudF9pbml0KTsKLQotaW50IHY0bDJfZXZlbnRfYWxsb2Moc3RydWN0IHY0bDJfZmggKmZoLCB1bnNpZ25lZCBpbnQgbikKLXsKLQlzdHJ1Y3QgdjRsMl9ldmVudHMgKmV2ZW50cyA9IGZoLT5ldmVudHM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghZXZlbnRzKSB7Ci0JCVdBUk5fT04oMSk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXdoaWxlIChldmVudHMtPm5hbGxvY2F0ZWQgPCBuKSB7Ci0JCXN0cnVjdCB2NGwyX2tldmVudCAqa2V2OwotCi0JCWtldiA9IGt6YWxsb2Moc2l6ZW9mKCprZXYpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKGtldiA9PSBOVUxMKQotCQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmZoLT52ZGV2LT5maF9sb2NrLCBmbGFncyk7Ci0JCWxpc3RfYWRkX3RhaWwoJmtldi0+bGlzdCwgJmV2ZW50cy0+ZnJlZSk7Ci0JCWV2ZW50cy0+bmFsbG9jYXRlZCsrOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaC0+dmRldi0+ZmhfbG9jaywgZmxhZ3MpOwotCX0KLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodjRsMl9ldmVudF9hbGxvYyk7Ci0KLSNkZWZpbmUgbGlzdF9rZnJlZShsaXN0LCB0eXBlLCBtZW1iZXIpCQkJCVwKLQl3aGlsZSAoIWxpc3RfZW1wdHkobGlzdCkpIHsJCQkJXAotCQl0eXBlICpoaTsJCQkJCVwKLQkJaGkgPSBsaXN0X2ZpcnN0X2VudHJ5KGxpc3QsIHR5cGUsIG1lbWJlcik7CVwKLQkJbGlzdF9kZWwoJmhpLT5tZW1iZXIpOwkJCQlcCi0JCWtmcmVlKGhpKTsJCQkJCVwKLQl9Ci0KLXZvaWQgdjRsMl9ldmVudF9mcmVlKHN0cnVjdCB2NGwyX2ZoICpmaCkKLXsKLQlzdHJ1Y3QgdjRsMl9ldmVudHMgKmV2ZW50cyA9IGZoLT5ldmVudHM7Ci0KLQlpZiAoIWV2ZW50cykKLQkJcmV0dXJuOwotCi0JbGlzdF9rZnJlZSgmZXZlbnRzLT5mcmVlLCBzdHJ1Y3QgdjRsMl9rZXZlbnQsIGxpc3QpOwotCWxpc3Rfa2ZyZWUoJmV2ZW50cy0+YXZhaWxhYmxlLCBzdHJ1Y3QgdjRsMl9rZXZlbnQsIGxpc3QpOwotCWxpc3Rfa2ZyZWUoJmV2ZW50cy0+c3Vic2NyaWJlZCwgc3RydWN0IHY0bDJfc3Vic2NyaWJlZF9ldmVudCwgbGlzdCk7Ci0KLQlrZnJlZShldmVudHMpOwotCWZoLT5ldmVudHMgPSBOVUxMOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodjRsMl9ldmVudF9mcmVlKTsKIAogc3RhdGljIGludCBfX3Y0bDJfZXZlbnRfZGVxdWV1ZShzdHJ1Y3QgdjRsMl9maCAqZmgsIHN0cnVjdCB2NGwyX2V2ZW50ICpldmVudCkKIHsKLQlzdHJ1Y3QgdjRsMl9ldmVudHMgKmV2ZW50cyA9IGZoLT5ldmVudHM7CiAJc3RydWN0IHY0bDJfa2V2ZW50ICprZXY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZmaC0+dmRldi0+ZmhfbG9jaywgZmxhZ3MpOwogCi0JaWYgKGxpc3RfZW1wdHkoJmV2ZW50cy0+YXZhaWxhYmxlKSkgeworCWlmIChsaXN0X2VtcHR5KCZmaC0+YXZhaWxhYmxlKSkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaC0+dmRldi0+ZmhfbG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQlXQVJOX09OKGV2ZW50cy0+bmF2YWlsYWJsZSA9PSAwKTsKKwlXQVJOX09OKGZoLT5uYXZhaWxhYmxlID09IDApOwogCi0Ja2V2ID0gbGlzdF9maXJzdF9lbnRyeSgmZXZlbnRzLT5hdmFpbGFibGUsIHN0cnVjdCB2NGwyX2tldmVudCwgbGlzdCk7Ci0JbGlzdF9tb3ZlKCZrZXYtPmxpc3QsICZldmVudHMtPmZyZWUpOwotCWV2ZW50cy0+bmF2YWlsYWJsZS0tOworCWtldiA9IGxpc3RfZmlyc3RfZW50cnkoJmZoLT5hdmFpbGFibGUsIHN0cnVjdCB2NGwyX2tldmVudCwgbGlzdCk7CisJbGlzdF9kZWwoJmtldi0+bGlzdCk7CisJZmgtPm5hdmFpbGFibGUtLTsKIAotCWtldi0+ZXZlbnQucGVuZGluZyA9IGV2ZW50cy0+bmF2YWlsYWJsZTsKKwlrZXYtPmV2ZW50LnBlbmRpbmcgPSBmaC0+bmF2YWlsYWJsZTsKIAkqZXZlbnQgPSBrZXYtPmV2ZW50OworCWtldi0+c2V2LT5maXJzdCA9IHNldl9wb3Moa2V2LT5zZXYsIDEpOworCWtldi0+c2V2LT5pbl91c2UtLTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZoLT52ZGV2LT5maF9sb2NrLCBmbGFncyk7CiAKQEAgLTEyOCw3ICs2Nyw2IEBACiBpbnQgdjRsMl9ldmVudF9kZXF1ZXVlKHN0cnVjdCB2NGwyX2ZoICpmaCwgc3RydWN0IHY0bDJfZXZlbnQgKmV2ZW50LAogCQkgICAgICAgaW50IG5vbmJsb2NraW5nKQogewotCXN0cnVjdCB2NGwyX2V2ZW50cyAqZXZlbnRzID0gZmgtPmV2ZW50czsKIAlpbnQgcmV0OwogCiAJaWYgKG5vbmJsb2NraW5nKQpAQCAtMTM5LDggKzc3LDggQEAKIAkJbXV0ZXhfdW5sb2NrKGZoLT52ZGV2LT5sb2NrKTsKIAogCWRvIHsKLQkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGV2ZW50cy0+d2FpdCwKLQkJCQkJICAgICAgIGV2ZW50cy0+bmF2YWlsYWJsZSAhPSAwKTsKKwkJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGZoLT53YWl0LAorCQkJCQkgICAgICAgZmgtPm5hdmFpbGFibGUgIT0gMCk7CiAJCWlmIChyZXQgPCAwKQogCQkJYnJlYWs7CiAKQEAgLTE1NCwyMyArOTIsNzIgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHY0bDJfZXZlbnRfZGVxdWV1ZSk7CiAKLS8qIENhbGxlciBtdXN0IGhvbGQgZmgtPmV2ZW50LT5sb2NrISAqLworLyogQ2FsbGVyIG11c3QgaG9sZCBmaC0+dmRldi0+ZmhfbG9jayEgKi8KIHN0YXRpYyBzdHJ1Y3QgdjRsMl9zdWJzY3JpYmVkX2V2ZW50ICp2NGwyX2V2ZW50X3N1YnNjcmliZWQoCi0Jc3RydWN0IHY0bDJfZmggKmZoLCB1MzIgdHlwZSkKKwkJc3RydWN0IHY0bDJfZmggKmZoLCB1MzIgdHlwZSwgdTMyIGlkKQogewotCXN0cnVjdCB2NGwyX2V2ZW50cyAqZXZlbnRzID0gZmgtPmV2ZW50czsKIAlzdHJ1Y3QgdjRsMl9zdWJzY3JpYmVkX2V2ZW50ICpzZXY7CiAKIAlhc3NlcnRfc3Bpbl9sb2NrZWQoJmZoLT52ZGV2LT5maF9sb2NrKTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoc2V2LCAmZXZlbnRzLT5zdWJzY3JpYmVkLCBsaXN0KSB7Ci0JCWlmIChzZXYtPnR5cGUgPT0gdHlwZSkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNldiwgJmZoLT5zdWJzY3JpYmVkLCBsaXN0KQorCQlpZiAoc2V2LT50eXBlID09IHR5cGUgJiYgc2V2LT5pZCA9PSBpZCkKIAkJCXJldHVybiBzZXY7Ci0JfQogCiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyB2b2lkIF9fdjRsMl9ldmVudF9xdWV1ZV9maChzdHJ1Y3QgdjRsMl9maCAqZmgsIGNvbnN0IHN0cnVjdCB2NGwyX2V2ZW50ICpldiwKKwkJY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0cykKK3sKKwlzdHJ1Y3QgdjRsMl9zdWJzY3JpYmVkX2V2ZW50ICpzZXY7CisJc3RydWN0IHY0bDJfa2V2ZW50ICprZXY7CisJYm9vbCBjb3B5X3BheWxvYWQgPSB0cnVlOworCisJLyogQXJlIHdlIHN1YnNjcmliZWQ/ICovCisJc2V2ID0gdjRsMl9ldmVudF9zdWJzY3JpYmVkKGZoLCBldi0+dHlwZSwgZXYtPmlkKTsKKwlpZiAoc2V2ID09IE5VTEwpCisJCXJldHVybjsKKworCS8qIEluY3JlYXNlIGV2ZW50IHNlcXVlbmNlIG51bWJlciBvbiBmaC4gKi8KKwlmaC0+c2VxdWVuY2UrKzsKKworCS8qIERvIHdlIGhhdmUgYW55IGZyZWUgZXZlbnRzPyAqLworCWlmIChzZXYtPmluX3VzZSA9PSBzZXYtPmVsZW1zKSB7CisJCS8qIG5vLCByZW1vdmUgdGhlIG9sZGVzdCBvbmUgKi8KKwkJa2V2ID0gc2V2LT5ldmVudHMgKyBzZXZfcG9zKHNldiwgMCk7CisJCWxpc3RfZGVsKCZrZXYtPmxpc3QpOworCQlzZXYtPmluX3VzZS0tOworCQlzZXYtPmZpcnN0ID0gc2V2X3BvcyhzZXYsIDEpOworCQlmaC0+bmF2YWlsYWJsZS0tOworCQlpZiAoc2V2LT5lbGVtcyA9PSAxKSB7CisJCQlpZiAoc2V2LT5yZXBsYWNlKSB7CisJCQkJc2V2LT5yZXBsYWNlKCZrZXYtPmV2ZW50LCBldik7CisJCQkJY29weV9wYXlsb2FkID0gZmFsc2U7CisJCQl9CisJCX0gZWxzZSBpZiAoc2V2LT5tZXJnZSkgeworCQkJc3RydWN0IHY0bDJfa2V2ZW50ICpzZWNvbmRfb2xkZXN0ID0KKwkJCQlzZXYtPmV2ZW50cyArIHNldl9wb3Moc2V2LCAwKTsKKwkJCXNldi0+bWVyZ2UoJmtldi0+ZXZlbnQsICZzZWNvbmRfb2xkZXN0LT5ldmVudCk7CisJCX0KKwl9CisKKwkvKiBUYWtlIG9uZSBhbmQgZmlsbCBpdC4gKi8KKwlrZXYgPSBzZXYtPmV2ZW50cyArIHNldl9wb3Moc2V2LCBzZXYtPmluX3VzZSk7CisJa2V2LT5ldmVudC50eXBlID0gZXYtPnR5cGU7CisJaWYgKGNvcHlfcGF5bG9hZCkKKwkJa2V2LT5ldmVudC51ID0gZXYtPnU7CisJa2V2LT5ldmVudC5pZCA9IGV2LT5pZDsKKwlrZXYtPmV2ZW50LnRpbWVzdGFtcCA9ICp0czsKKwlrZXYtPmV2ZW50LnNlcXVlbmNlID0gZmgtPnNlcXVlbmNlOworCXNldi0+aW5fdXNlKys7CisJbGlzdF9hZGRfdGFpbCgma2V2LT5saXN0LCAmZmgtPmF2YWlsYWJsZSk7CisKKwlmaC0+bmF2YWlsYWJsZSsrOworCisJd2FrZV91cF9hbGwoJmZoLT53YWl0KTsKK30KKwogdm9pZCB2NGwyX2V2ZW50X3F1ZXVlKHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYsIGNvbnN0IHN0cnVjdCB2NGwyX2V2ZW50ICpldikKIHsKIAlzdHJ1Y3QgdjRsMl9maCAqZmg7CkBAIC0xODEsODEgKzE2OCw5NSBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnZkZXYtPmZoX2xvY2ssIGZsYWdzKTsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoZmgsICZ2ZGV2LT5maF9saXN0LCBsaXN0KSB7Ci0JCXN0cnVjdCB2NGwyX2V2ZW50cyAqZXZlbnRzID0gZmgtPmV2ZW50czsKLQkJc3RydWN0IHY0bDJfa2V2ZW50ICprZXY7Ci0KLQkJLyogQXJlIHdlIHN1YnNjcmliZWQ/ICovCi0JCWlmICghdjRsMl9ldmVudF9zdWJzY3JpYmVkKGZoLCBldi0+dHlwZSkpCi0JCQljb250aW51ZTsKLQotCQkvKiBJbmNyZWFzZSBldmVudCBzZXF1ZW5jZSBudW1iZXIgb24gZmguICovCi0JCWV2ZW50cy0+c2VxdWVuY2UrKzsKLQotCQkvKiBEbyB3ZSBoYXZlIGFueSBmcmVlIGV2ZW50cz8gKi8KLQkJaWYgKGxpc3RfZW1wdHkoJmV2ZW50cy0+ZnJlZSkpCi0JCQljb250aW51ZTsKLQotCQkvKiBUYWtlIG9uZSBhbmQgZmlsbCBpdC4gKi8KLQkJa2V2ID0gbGlzdF9maXJzdF9lbnRyeSgmZXZlbnRzLT5mcmVlLCBzdHJ1Y3QgdjRsMl9rZXZlbnQsIGxpc3QpOwotCQlrZXYtPmV2ZW50LnR5cGUgPSBldi0+dHlwZTsKLQkJa2V2LT5ldmVudC51ID0gZXYtPnU7Ci0JCWtldi0+ZXZlbnQudGltZXN0YW1wID0gdGltZXN0YW1wOwotCQlrZXYtPmV2ZW50LnNlcXVlbmNlID0gZXZlbnRzLT5zZXF1ZW5jZTsKLQkJbGlzdF9tb3ZlX3RhaWwoJmtldi0+bGlzdCwgJmV2ZW50cy0+YXZhaWxhYmxlKTsKLQotCQlldmVudHMtPm5hdmFpbGFibGUrKzsKLQotCQl3YWtlX3VwX2FsbCgmZXZlbnRzLT53YWl0KTsKLQl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeShmaCwgJnZkZXYtPmZoX2xpc3QsIGxpc3QpCisJCV9fdjRsMl9ldmVudF9xdWV1ZV9maChmaCwgZXYsICZ0aW1lc3RhbXApOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmRldi0+ZmhfbG9jaywgZmxhZ3MpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodjRsMl9ldmVudF9xdWV1ZSk7CiAKK3ZvaWQgdjRsMl9ldmVudF9xdWV1ZV9maChzdHJ1Y3QgdjRsMl9maCAqZmgsIGNvbnN0IHN0cnVjdCB2NGwyX2V2ZW50ICpldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB0aW1lc3BlYyB0aW1lc3RhbXA7CisKKwlrdGltZV9nZXRfdHMoJnRpbWVzdGFtcCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZmgtPnZkZXYtPmZoX2xvY2ssIGZsYWdzKTsKKwlfX3Y0bDJfZXZlbnRfcXVldWVfZmgoZmgsIGV2LCAmdGltZXN0YW1wKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaC0+dmRldi0+ZmhfbG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodjRsMl9ldmVudF9xdWV1ZV9maCk7CisKIGludCB2NGwyX2V2ZW50X3BlbmRpbmcoc3RydWN0IHY0bDJfZmggKmZoKQogewotCXJldHVybiBmaC0+ZXZlbnRzLT5uYXZhaWxhYmxlOworCXJldHVybiBmaC0+bmF2YWlsYWJsZTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHY0bDJfZXZlbnRfcGVuZGluZyk7CiAKLWludCB2NGwyX2V2ZW50X3N1YnNjcmliZShzdHJ1Y3QgdjRsMl9maCAqZmgsCi0JCQkgc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uICpzdWIpCitzdGF0aWMgdm9pZCBjdHJsc19yZXBsYWNlKHN0cnVjdCB2NGwyX2V2ZW50ICpvbGQsIGNvbnN0IHN0cnVjdCB2NGwyX2V2ZW50ICpuZXcpCiB7Ci0Jc3RydWN0IHY0bDJfZXZlbnRzICpldmVudHMgPSBmaC0+ZXZlbnRzOwotCXN0cnVjdCB2NGwyX3N1YnNjcmliZWRfZXZlbnQgKnNldjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBvbGRfY2hhbmdlcyA9IG9sZC0+dS5jdHJsLmNoYW5nZXM7CiAKLQlpZiAoZmgtPmV2ZW50cyA9PSBOVUxMKSB7Ci0JCVdBUk5fT04oMSk7Ci0JCXJldHVybiAtRU5PTUVNOworCW9sZC0+dS5jdHJsID0gbmV3LT51LmN0cmw7CisJb2xkLT51LmN0cmwuY2hhbmdlcyB8PSBvbGRfY2hhbmdlczsKK30KKworc3RhdGljIHZvaWQgY3RybHNfbWVyZ2UoY29uc3Qgc3RydWN0IHY0bDJfZXZlbnQgKm9sZCwgc3RydWN0IHY0bDJfZXZlbnQgKm5ldykKK3sKKwluZXctPnUuY3RybC5jaGFuZ2VzIHw9IG9sZC0+dS5jdHJsLmNoYW5nZXM7Cit9CisKK2ludCB2NGwyX2V2ZW50X3N1YnNjcmliZShzdHJ1Y3QgdjRsMl9maCAqZmgsCisJCQkgc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uICpzdWIsIHVuc2lnbmVkIGVsZW1zKQoreworCXN0cnVjdCB2NGwyX3N1YnNjcmliZWRfZXZlbnQgKnNldiwgKmZvdW5kX2V2OworCXN0cnVjdCB2NGwyX2N0cmwgKmN0cmwgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaTsKKworCWlmIChlbGVtcyA8IDEpCisJCWVsZW1zID0gMTsKKwlpZiAoc3ViLT50eXBlID09IFY0TDJfRVZFTlRfQ1RSTCkgeworCQljdHJsID0gdjRsMl9jdHJsX2ZpbmQoZmgtPmN0cmxfaGFuZGxlciwgc3ViLT5pZCk7CisJCWlmIChjdHJsID09IE5VTEwpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlzZXYgPSBrbWFsbG9jKHNpemVvZigqc2V2KSwgR0ZQX0tFUk5FTCk7CisJc2V2ID0ga3phbGxvYyhzaXplb2YoKnNldikgKyBzaXplb2Yoc3RydWN0IHY0bDJfa2V2ZW50KSAqIGVsZW1zLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXNldikKIAkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZmgtPnZkZXYtPmZoX2xvY2ssIGZsYWdzKTsKLQotCWlmICh2NGwyX2V2ZW50X3N1YnNjcmliZWQoZmgsIHN1Yi0+dHlwZSkgPT0gTlVMTCkgewotCQlJTklUX0xJU1RfSEVBRCgmc2V2LT5saXN0KTsKLQkJc2V2LT50eXBlID0gc3ViLT50eXBlOwotCi0JCWxpc3RfYWRkKCZzZXYtPmxpc3QsICZldmVudHMtPnN1YnNjcmliZWQpOwotCQlzZXYgPSBOVUxMOworCWZvciAoaSA9IDA7IGkgPCBlbGVtczsgaSsrKQorCQlzZXYtPmV2ZW50c1tpXS5zZXYgPSBzZXY7CisJc2V2LT50eXBlID0gc3ViLT50eXBlOworCXNldi0+aWQgPSBzdWItPmlkOworCXNldi0+ZmxhZ3MgPSBzdWItPmZsYWdzOworCXNldi0+ZmggPSBmaDsKKwlzZXYtPmVsZW1zID0gZWxlbXM7CisJaWYgKGN0cmwpIHsKKwkJc2V2LT5yZXBsYWNlID0gY3RybHNfcmVwbGFjZTsKKwkJc2V2LT5tZXJnZSA9IGN0cmxzX21lcmdlOwogCX0KIAorCXNwaW5fbG9ja19pcnFzYXZlKCZmaC0+dmRldi0+ZmhfbG9jaywgZmxhZ3MpOworCWZvdW5kX2V2ID0gdjRsMl9ldmVudF9zdWJzY3JpYmVkKGZoLCBzdWItPnR5cGUsIHN1Yi0+aWQpOworCWlmICghZm91bmRfZXYpCisJCWxpc3RfYWRkKCZzZXYtPmxpc3QsICZmaC0+c3Vic2NyaWJlZCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmgtPnZkZXYtPmZoX2xvY2ssIGZsYWdzKTsKIAotCWtmcmVlKHNldik7CisJLyogdjRsMl9jdHJsX2FkZF9ldmVudCB1c2VzIGEgbXV0ZXgsIHNvIGRvIHRoaXMgb3V0c2lkZSB0aGUgc3BpbiBsb2NrICovCisJaWYgKGZvdW5kX2V2KQorCQlrZnJlZShzZXYpOworCWVsc2UgaWYgKGN0cmwpCisJCXY0bDJfY3RybF9hZGRfZXZlbnQoY3RybCwgc2V2KTsKIAogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodjRsMl9ldmVudF9zdWJzY3JpYmUpOwogCi1zdGF0aWMgdm9pZCB2NGwyX2V2ZW50X3Vuc3Vic2NyaWJlX2FsbChzdHJ1Y3QgdjRsMl9maCAqZmgpCit2b2lkIHY0bDJfZXZlbnRfdW5zdWJzY3JpYmVfYWxsKHN0cnVjdCB2NGwyX2ZoICpmaCkKIHsKLQlzdHJ1Y3QgdjRsMl9ldmVudHMgKmV2ZW50cyA9IGZoLT5ldmVudHM7CisJc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uIHN1YjsKIAlzdHJ1Y3QgdjRsMl9zdWJzY3JpYmVkX2V2ZW50ICpzZXY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMjYzLDE1ICsyNjQsMTggQEAKIAkJc2V2ID0gTlVMTDsKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmZmgtPnZkZXYtPmZoX2xvY2ssIGZsYWdzKTsKLQkJaWYgKCFsaXN0X2VtcHR5KCZldmVudHMtPnN1YnNjcmliZWQpKSB7Ci0JCQlzZXYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZldmVudHMtPnN1YnNjcmliZWQsCi0JCQkJICAgICAgIHN0cnVjdCB2NGwyX3N1YnNjcmliZWRfZXZlbnQsIGxpc3QpOwotCQkJbGlzdF9kZWwoJnNldi0+bGlzdCk7CisJCWlmICghbGlzdF9lbXB0eSgmZmgtPnN1YnNjcmliZWQpKSB7CisJCQlzZXYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZmaC0+c3Vic2NyaWJlZCwKKwkJCQkJc3RydWN0IHY0bDJfc3Vic2NyaWJlZF9ldmVudCwgbGlzdCk7CisJCQlzdWIudHlwZSA9IHNldi0+dHlwZTsKKwkJCXN1Yi5pZCA9IHNldi0+aWQ7CiAJCX0KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmgtPnZkZXYtPmZoX2xvY2ssIGZsYWdzKTsKLQkJa2ZyZWUoc2V2KTsKKwkJaWYgKHNldikKKwkJCXY0bDJfZXZlbnRfdW5zdWJzY3JpYmUoZmgsICZzdWIpOwogCX0gd2hpbGUgKHNldik7CiB9CitFWFBPUlRfU1lNQk9MX0dQTCh2NGwyX2V2ZW50X3Vuc3Vic2NyaWJlX2FsbCk7CiAKIGludCB2NGwyX2V2ZW50X3Vuc3Vic2NyaWJlKHN0cnVjdCB2NGwyX2ZoICpmaCwKIAkJCSAgIHN0cnVjdCB2NGwyX2V2ZW50X3N1YnNjcmlwdGlvbiAqc3ViKQpAQCAtMjg2LDExICsyOTAsMTkgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZmaC0+dmRldi0+ZmhfbG9jaywgZmxhZ3MpOwogCi0Jc2V2ID0gdjRsMl9ldmVudF9zdWJzY3JpYmVkKGZoLCBzdWItPnR5cGUpOwotCWlmIChzZXYgIT0gTlVMTCkKKwlzZXYgPSB2NGwyX2V2ZW50X3N1YnNjcmliZWQoZmgsIHN1Yi0+dHlwZSwgc3ViLT5pZCk7CisJaWYgKHNldiAhPSBOVUxMKSB7CiAJCWxpc3RfZGVsKCZzZXYtPmxpc3QpOworCQlzZXYtPmZoID0gTlVMTDsKKwl9CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmaC0+dmRldi0+ZmhfbG9jaywgZmxhZ3MpOworCWlmIChzZXYgJiYgc2V2LT50eXBlID09IFY0TDJfRVZFTlRfQ1RSTCkgeworCQlzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsID0gdjRsMl9jdHJsX2ZpbmQoZmgtPmN0cmxfaGFuZGxlciwgc2V2LT5pZCk7CisKKwkJaWYgKGN0cmwpCisJCQl2NGwyX2N0cmxfZGVsX2V2ZW50KGN0cmwsIHNldik7CisJfQogCiAJa2ZyZWUoc2V2KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWZoLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZmguYwppbmRleCA3MTdmNzFlLi4xMjI4MjJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZmguYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItZmguYwpAQCAtMjksMjMgKzI5LDE4IEBACiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1ldmVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KIAotaW50IHY0bDJfZmhfaW5pdChzdHJ1Y3QgdjRsMl9maCAqZmgsIHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYpCit2b2lkIHY0bDJfZmhfaW5pdChzdHJ1Y3QgdjRsMl9maCAqZmgsIHN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYpCiB7CiAJZmgtPnZkZXYgPSB2ZGV2OworCS8qIEluaGVyaXQgZnJvbSB2aWRlb19kZXZpY2UuIE1heSBiZSBvdmVycmlkZGVuIGJ5IHRoZSBkcml2ZXIuICovCisJZmgtPmN0cmxfaGFuZGxlciA9IHZkZXYtPmN0cmxfaGFuZGxlcjsKIAlJTklUX0xJU1RfSEVBRCgmZmgtPmxpc3QpOwogCXNldF9iaXQoVjRMMl9GTF9VU0VTX1Y0TDJfRkgsICZmaC0+dmRldi0+ZmxhZ3MpOwogCWZoLT5wcmlvID0gVjRMMl9QUklPUklUWV9VTlNFVDsKLQotCS8qCi0JICogZmgtPmV2ZW50cyBvbmx5IG5lZWRzIHRvIGJlIGluaXRpYWxpemVkIGlmIHRoZSBkcml2ZXIKLQkgKiBzdXBwb3J0cyB0aGUgVklESU9DX1NVQlNDUklCRV9FVkVOVCBpb2N0bC4KLQkgKi8KLQlpZiAodmRldi0+aW9jdGxfb3BzICYmIHZkZXYtPmlvY3RsX29wcy0+dmlkaW9jX3N1YnNjcmliZV9ldmVudCkKLQkJcmV0dXJuIHY0bDJfZXZlbnRfaW5pdChmaCk7Ci0KLQlmaC0+ZXZlbnRzID0gTlVMTDsKLQotCXJldHVybiAwOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmZoLT53YWl0KTsKKwlJTklUX0xJU1RfSEVBRCgmZmgtPmF2YWlsYWJsZSk7CisJSU5JVF9MSVNUX0hFQUQoJmZoLT5zdWJzY3JpYmVkKTsKKwlmaC0+c2VxdWVuY2UgPSAtMTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHY0bDJfZmhfaW5pdCk7CiAKQEAgLTkxLDEwICs4Niw4IEBACiB7CiAJaWYgKGZoLT52ZGV2ID09IE5VTEwpCiAJCXJldHVybjsKLQorCXY0bDJfZXZlbnRfdW5zdWJzY3JpYmVfYWxsKGZoKTsKIAlmaC0+dmRldiA9IE5VTEw7Ci0KLQl2NGwyX2V2ZW50X2ZyZWUoZmgpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodjRsMl9maF9leGl0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLWlvY3RsLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItaW9jdGwuYwppbmRleCA2OWU4YzZmLi4wMDJjZTEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItaW9jdGwuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItaW9jdGwuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KIAogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogCkBAIC01NDIsMTIgKzU0MywxMiBAQAogCXN0cnVjdCB2NGwyX2ZoICp2ZmggPSBOVUxMOwogCXN0cnVjdCB2NGwyX2Zvcm1hdCBmX2NvcHk7CiAJaW50IHVzZV9maF9wcmlvID0gMDsKLQlsb25nIHJldCA9IC1FSU5WQUw7CisJbG9uZyByZXQgPSAtRU5PVFRZOwogCiAJaWYgKG9wcyA9PSBOVUxMKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgInZpZGVvZGV2OiBcIiVzXCIgaGFzIG5vIGlvY3RsX29wcy5cbiIsCiAJCQkJdmZkLT5uYW1lKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiByZXQ7CiAJfQogCiAJaWYgKCh2ZmQtPmRlYnVnICYgVjRMMl9ERUJVR19JT0NUTCkgJiYKQEAgLTYwNSw2ICs2MDYsNyBAQAogCQlpZiAoIW9wcy0+dmlkaW9jX3F1ZXJ5Y2FwKQogCQkJYnJlYWs7CiAKKwkJY2FwLT52ZXJzaW9uID0gTElOVVhfVkVSU0lPTl9DT0RFOwogCQlyZXQgPSBvcHMtPnZpZGlvY19xdWVyeWNhcChmaWxlLCBmaCwgY2FwKTsKIAkJaWYgKCFyZXQpCiAJCQlkYmdhcmcoY21kLCAiZHJpdmVyPSVzLCBjYXJkPSVzLCBidXM9JXMsICIKQEAgLTE0MTgsNyArMTQyMCw5IEBACiAJewogCQlzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKnAgPSBhcmc7CiAKLQkJaWYgKHZmZC0+Y3RybF9oYW5kbGVyKQorCQlpZiAodmZoICYmIHZmaC0+Y3RybF9oYW5kbGVyKQorCQkJcmV0ID0gdjRsMl9xdWVyeWN0cmwodmZoLT5jdHJsX2hhbmRsZXIsIHApOworCQllbHNlIGlmICh2ZmQtPmN0cmxfaGFuZGxlcikKIAkJCXJldCA9IHY0bDJfcXVlcnljdHJsKHZmZC0+Y3RybF9oYW5kbGVyLCBwKTsKIAkJZWxzZSBpZiAob3BzLT52aWRpb2NfcXVlcnljdHJsKQogCQkJcmV0ID0gb3BzLT52aWRpb2NfcXVlcnljdHJsKGZpbGUsIGZoLCBwKTsKQEAgLTE0MzgsNyArMTQ0Miw5IEBACiAJewogCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpwID0gYXJnOwogCi0JCWlmICh2ZmQtPmN0cmxfaGFuZGxlcikKKwkJaWYgKHZmaCAmJiB2ZmgtPmN0cmxfaGFuZGxlcikKKwkJCXJldCA9IHY0bDJfZ19jdHJsKHZmaC0+Y3RybF9oYW5kbGVyLCBwKTsKKwkJZWxzZSBpZiAodmZkLT5jdHJsX2hhbmRsZXIpCiAJCQlyZXQgPSB2NGwyX2dfY3RybCh2ZmQtPmN0cmxfaGFuZGxlciwgcCk7CiAJCWVsc2UgaWYgKG9wcy0+dmlkaW9jX2dfY3RybCkKIAkJCXJldCA9IG9wcy0+dmlkaW9jX2dfY3RybChmaWxlLCBmaCwgcCk7CkBAIC0xNDcwLDE0ICsxNDc2LDE4IEBACiAJCXN0cnVjdCB2NGwyX2V4dF9jb250cm9scyBjdHJsczsKIAkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2wgY3RybDsKIAotCQlpZiAoIXZmZC0+Y3RybF9oYW5kbGVyICYmCisJCWlmICghKHZmaCAmJiB2ZmgtPmN0cmxfaGFuZGxlcikgJiYgIXZmZC0+Y3RybF9oYW5kbGVyICYmCiAJCQkhb3BzLT52aWRpb2Nfc19jdHJsICYmICFvcHMtPnZpZGlvY19zX2V4dF9jdHJscykKIAkJCWJyZWFrOwogCiAJCWRiZ2FyZyhjbWQsICJpZD0weCV4LCB2YWx1ZT0lZFxuIiwgcC0+aWQsIHAtPnZhbHVlKTsKIAorCQlpZiAodmZoICYmIHZmaC0+Y3RybF9oYW5kbGVyKSB7CisJCQlyZXQgPSB2NGwyX3NfY3RybCh2ZmgsIHZmaC0+Y3RybF9oYW5kbGVyLCBwKTsKKwkJCWJyZWFrOworCQl9CiAJCWlmICh2ZmQtPmN0cmxfaGFuZGxlcikgewotCQkJcmV0ID0gdjRsMl9zX2N0cmwodmZkLT5jdHJsX2hhbmRsZXIsIHApOworCQkJcmV0ID0gdjRsMl9zX2N0cmwoTlVMTCwgdmZkLT5jdHJsX2hhbmRsZXIsIHApOwogCQkJYnJlYWs7CiAJCX0KIAkJaWYgKG9wcy0+dmlkaW9jX3NfY3RybCkgewpAQCAtMTUwMSw3ICsxNTExLDkgQEAKIAkJc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpwID0gYXJnOwogCiAJCXAtPmVycm9yX2lkeCA9IHAtPmNvdW50OwotCQlpZiAodmZkLT5jdHJsX2hhbmRsZXIpCisJCWlmICh2ZmggJiYgdmZoLT5jdHJsX2hhbmRsZXIpCisJCQlyZXQgPSB2NGwyX2dfZXh0X2N0cmxzKHZmaC0+Y3RybF9oYW5kbGVyLCBwKTsKKwkJZWxzZSBpZiAodmZkLT5jdHJsX2hhbmRsZXIpCiAJCQlyZXQgPSB2NGwyX2dfZXh0X2N0cmxzKHZmZC0+Y3RybF9oYW5kbGVyLCBwKTsKIAkJZWxzZSBpZiAob3BzLT52aWRpb2NfZ19leHRfY3RybHMgJiYgY2hlY2tfZXh0X2N0cmxzKHAsIDApKQogCQkJcmV0ID0gb3BzLT52aWRpb2NfZ19leHRfY3RybHMoZmlsZSwgZmgsIHApOwpAQCAtMTUxNSwxMSArMTUyNywxNCBAQAogCQlzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgKnAgPSBhcmc7CiAKIAkJcC0+ZXJyb3JfaWR4ID0gcC0+Y291bnQ7Ci0JCWlmICghdmZkLT5jdHJsX2hhbmRsZXIgJiYgIW9wcy0+dmlkaW9jX3NfZXh0X2N0cmxzKQorCQlpZiAoISh2ZmggJiYgdmZoLT5jdHJsX2hhbmRsZXIpICYmICF2ZmQtPmN0cmxfaGFuZGxlciAmJgorCQkJCSFvcHMtPnZpZGlvY19zX2V4dF9jdHJscykKIAkJCWJyZWFrOwogCQl2NGxfcHJpbnRfZXh0X2N0cmxzKGNtZCwgdmZkLCBwLCAxKTsKLQkJaWYgKHZmZC0+Y3RybF9oYW5kbGVyKQotCQkJcmV0ID0gdjRsMl9zX2V4dF9jdHJscyh2ZmQtPmN0cmxfaGFuZGxlciwgcCk7CisJCWlmICh2ZmggJiYgdmZoLT5jdHJsX2hhbmRsZXIpCisJCQlyZXQgPSB2NGwyX3NfZXh0X2N0cmxzKHZmaCwgdmZoLT5jdHJsX2hhbmRsZXIsIHApOworCQllbHNlIGlmICh2ZmQtPmN0cmxfaGFuZGxlcikKKwkJCXJldCA9IHY0bDJfc19leHRfY3RybHMoTlVMTCwgdmZkLT5jdHJsX2hhbmRsZXIsIHApOwogCQllbHNlIGlmIChjaGVja19leHRfY3RybHMocCwgMCkpCiAJCQlyZXQgPSBvcHMtPnZpZGlvY19zX2V4dF9jdHJscyhmaWxlLCBmaCwgcCk7CiAJCWJyZWFrOwpAQCAtMTUyOSwxMCArMTU0NCwxMyBAQAogCQlzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgKnAgPSBhcmc7CiAKIAkJcC0+ZXJyb3JfaWR4ID0gcC0+Y291bnQ7Ci0JCWlmICghdmZkLT5jdHJsX2hhbmRsZXIgJiYgIW9wcy0+dmlkaW9jX3RyeV9leHRfY3RybHMpCisJCWlmICghKHZmaCAmJiB2ZmgtPmN0cmxfaGFuZGxlcikgJiYgIXZmZC0+Y3RybF9oYW5kbGVyICYmCisJCQkJIW9wcy0+dmlkaW9jX3RyeV9leHRfY3RybHMpCiAJCQlicmVhazsKIAkJdjRsX3ByaW50X2V4dF9jdHJscyhjbWQsIHZmZCwgcCwgMSk7Ci0JCWlmICh2ZmQtPmN0cmxfaGFuZGxlcikKKwkJaWYgKHZmaCAmJiB2ZmgtPmN0cmxfaGFuZGxlcikKKwkJCXJldCA9IHY0bDJfdHJ5X2V4dF9jdHJscyh2ZmgtPmN0cmxfaGFuZGxlciwgcCk7CisJCWVsc2UgaWYgKHZmZC0+Y3RybF9oYW5kbGVyKQogCQkJcmV0ID0gdjRsMl90cnlfZXh0X2N0cmxzKHZmZC0+Y3RybF9oYW5kbGVyLCBwKTsKIAkJZWxzZSBpZiAoY2hlY2tfZXh0X2N0cmxzKHAsIDApKQogCQkJcmV0ID0gb3BzLT52aWRpb2NfdHJ5X2V4dF9jdHJscyhmaWxlLCBmaCwgcCk7CkBAIC0xNTQyLDcgKzE1NjAsOSBAQAogCXsKIAkJc3RydWN0IHY0bDJfcXVlcnltZW51ICpwID0gYXJnOwogCi0JCWlmICh2ZmQtPmN0cmxfaGFuZGxlcikKKwkJaWYgKHZmaCAmJiB2ZmgtPmN0cmxfaGFuZGxlcikKKwkJCXJldCA9IHY0bDJfcXVlcnltZW51KHZmaC0+Y3RybF9oYW5kbGVyLCBwKTsKKwkJZWxzZSBpZiAodmZkLT5jdHJsX2hhbmRsZXIpCiAJCQlyZXQgPSB2NGwyX3F1ZXJ5bWVudSh2ZmQtPmN0cmxfaGFuZGxlciwgcCk7CiAJCWVsc2UgaWYgKG9wcy0+dmlkaW9jX3F1ZXJ5bWVudSkKIAkJCXJldCA9IG9wcy0+dmlkaW9jX3F1ZXJ5bWVudShmaWxlLCBmaCwgcCk7CkBAIC0yMjc2LDcgKzIyOTYsNyBAQAogCQkJCWJyZWFrOwogCQkJfQogCQkJKnVzZXJfcHRyID0gKHZvaWQgX191c2VyICopYnVmLT5tLnBsYW5lczsKLQkJCSprZXJuZWxfcHRyID0gKHZvaWQgKiopJmJ1Zi0+bS5wbGFuZXM7CisJCQkqa2VybmVsX3B0ciA9ICh2b2lkICopJmJ1Zi0+bS5wbGFuZXM7CiAJCQkqYXJyYXlfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdjRsMl9wbGFuZSkgKiBidWYtPmxlbmd0aDsKIAkJCXJldCA9IDE7CiAJCX0KQEAgLTIyOTAsNyArMjMxMCw3IEBACiAKIAkJaWYgKGN0cmxzLT5jb3VudCAhPSAwKSB7CiAJCQkqdXNlcl9wdHIgPSAodm9pZCBfX3VzZXIgKiljdHJscy0+Y29udHJvbHM7Ci0JCQkqa2VybmVsX3B0ciA9ICh2b2lkICoqKSZjdHJscy0+Y29udHJvbHM7CisJCQkqa2VybmVsX3B0ciA9ICh2b2lkICopJmN0cmxzLT5jb250cm9sczsKIAkJCSphcnJheV9zaXplID0gc2l6ZW9mKHN0cnVjdCB2NGwyX2V4dF9jb250cm9sKQogCQkJCSAgICAqIGN0cmxzLT5jb3VudDsKIAkJCXJldCA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItc3ViZGV2LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Y0bDItc3ViZGV2LmMKaW5kZXggODEyNzI5ZS4uYjc5NjdjOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92NGwyLXN1YmRldi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdjRsMi1zdWJkZXYuYwpAQCAtNzUsMjAgKzc1LDcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSB2NGwyX2ZoX2luaXQoJnN1YmRldl9maC0+dmZoLCB2ZGV2KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycjsKLQotCWlmIChzZC0+ZmxhZ3MgJiBWNEwyX1NVQkRFVl9GTF9IQVNfRVZFTlRTKSB7Ci0JCXJldCA9IHY0bDJfZXZlbnRfaW5pdCgmc3ViZGV2X2ZoLT52ZmgpOwotCQlpZiAocmV0KQotCQkJZ290byBlcnI7Ci0KLQkJcmV0ID0gdjRsMl9ldmVudF9hbGxvYygmc3ViZGV2X2ZoLT52ZmgsIHNkLT5uZXZlbnRzKTsKLQkJaWYgKHJldCkKLQkJCWdvdG8gZXJyOwotCX0KLQorCXY0bDJfZmhfaW5pdCgmc3ViZGV2X2ZoLT52ZmgsIHZkZXYpOwogCXY0bDJfZmhfYWRkKCZzdWJkZXZfZmgtPnZmaCk7CiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gJnN1YmRldl9maC0+dmZoOwogI2lmIGRlZmluZWQoQ09ORklHX01FRElBX0NPTlRST0xMRVIpCkBAIC0xNTUsMjUgKzE0MiwyNSBAQAogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFZJRElPQ19RVUVSWUNUUkw6Ci0JCXJldHVybiB2NGwyX3F1ZXJ5Y3RybChzZC0+Y3RybF9oYW5kbGVyLCBhcmcpOworCQlyZXR1cm4gdjRsMl9xdWVyeWN0cmwodmZoLT5jdHJsX2hhbmRsZXIsIGFyZyk7CiAKIAljYXNlIFZJRElPQ19RVUVSWU1FTlU6Ci0JCXJldHVybiB2NGwyX3F1ZXJ5bWVudShzZC0+Y3RybF9oYW5kbGVyLCBhcmcpOworCQlyZXR1cm4gdjRsMl9xdWVyeW1lbnUodmZoLT5jdHJsX2hhbmRsZXIsIGFyZyk7CiAKIAljYXNlIFZJRElPQ19HX0NUUkw6Ci0JCXJldHVybiB2NGwyX2dfY3RybChzZC0+Y3RybF9oYW5kbGVyLCBhcmcpOworCQlyZXR1cm4gdjRsMl9nX2N0cmwodmZoLT5jdHJsX2hhbmRsZXIsIGFyZyk7CiAKIAljYXNlIFZJRElPQ19TX0NUUkw6Ci0JCXJldHVybiB2NGwyX3NfY3RybChzZC0+Y3RybF9oYW5kbGVyLCBhcmcpOworCQlyZXR1cm4gdjRsMl9zX2N0cmwodmZoLCB2ZmgtPmN0cmxfaGFuZGxlciwgYXJnKTsKIAogCWNhc2UgVklESU9DX0dfRVhUX0NUUkxTOgotCQlyZXR1cm4gdjRsMl9nX2V4dF9jdHJscyhzZC0+Y3RybF9oYW5kbGVyLCBhcmcpOworCQlyZXR1cm4gdjRsMl9nX2V4dF9jdHJscyh2ZmgtPmN0cmxfaGFuZGxlciwgYXJnKTsKIAogCWNhc2UgVklESU9DX1NfRVhUX0NUUkxTOgotCQlyZXR1cm4gdjRsMl9zX2V4dF9jdHJscyhzZC0+Y3RybF9oYW5kbGVyLCBhcmcpOworCQlyZXR1cm4gdjRsMl9zX2V4dF9jdHJscyh2ZmgsIHZmaC0+Y3RybF9oYW5kbGVyLCBhcmcpOwogCiAJY2FzZSBWSURJT0NfVFJZX0VYVF9DVFJMUzoKLQkJcmV0dXJuIHY0bDJfdHJ5X2V4dF9jdHJscyhzZC0+Y3RybF9oYW5kbGVyLCBhcmcpOworCQlyZXR1cm4gdjRsMl90cnlfZXh0X2N0cmxzKHZmaC0+Y3RybF9oYW5kbGVyLCBhcmcpOwogCiAJY2FzZSBWSURJT0NfRFFFVkVOVDoKIAkJaWYgKCEoc2QtPmZsYWdzICYgVjRMMl9TVUJERVZfRkxfSEFTX0VWRU5UUykpCkBAIC0yOTcsNyArMjg0LDcgQEAKIAlpZiAoIShzZC0+ZmxhZ3MgJiBWNEwyX1NVQkRFVl9GTF9IQVNfRVZFTlRTKSkKIAkJcmV0dXJuIFBPTExFUlI7CiAKLQlwb2xsX3dhaXQoZmlsZSwgJmZoLT5ldmVudHMtPndhaXQsIHdhaXQpOworCXBvbGxfd2FpdChmaWxlLCAmZmgtPndhaXQsIHdhaXQpOwogCiAJaWYgKHY0bDJfZXZlbnRfcGVuZGluZyhmaCkpCiAJCXJldHVybiBQT0xMUFJJOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1Zi1kbWEtc2cuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYtZG1hLXNnLmMKaW5kZXggZGRiOGY0Yi4uZjMwMGRlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1Zi1kbWEtc2cuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmLWRtYS1zZy5jCkBAIC0xMDgsOCArMTA4LDkgQEAKIAlpZiAoUGFnZUhpZ2hNZW0ocGFnZXNbMF0pKQogCQkvKiBETUEgdG8gaGlnaG1lbSBwYWdlcyBtaWdodCBub3Qgd29yayAqLwogCQlnb3RvIGhpZ2htZW07Ci0Jc2dfc2V0X3BhZ2UoJnNnbGlzdFswXSwgcGFnZXNbMF0sIFBBR0VfU0laRSAtIG9mZnNldCwgb2Zmc2V0KTsKLQlzaXplIC09IFBBR0VfU0laRSAtIG9mZnNldDsKKwlzZ19zZXRfcGFnZSgmc2dsaXN0WzBdLCBwYWdlc1swXSwKKwkJCW1pbl90KHNpemVfdCwgUEFHRV9TSVpFIC0gb2Zmc2V0LCBzaXplKSwgb2Zmc2V0KTsKKwlzaXplIC09IG1pbl90KHNpemVfdCwgUEFHRV9TSVpFIC0gb2Zmc2V0LCBzaXplKTsKIAlmb3IgKGkgPSAxOyBpIDwgbnJfcGFnZXM7IGkrKykgewogCQlpZiAoTlVMTCA9PSBwYWdlc1tpXSkKIAkJCWdvdG8gbm9wYWdlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aWRlb2J1ZjItZG1hLXNnLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmMi1kbWEtc2cuYwppbmRleCAxMGEyMGQ5Li4wNjVmNDY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmMi1kbWEtc2cuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmMi1kbWEtc2cuYwpAQCAtNDgsMTIgKzQ4LDEwIEBACiAJYnVmLT5zZ19kZXNjLnNpemUgPSBzaXplOwogCWJ1Zi0+c2dfZGVzYy5udW1fcGFnZXMgPSAoc2l6ZSArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7CiAKLQlidWYtPnNnX2Rlc2Muc2dsaXN0ID0gdm1hbGxvYyhidWYtPnNnX2Rlc2MubnVtX3BhZ2VzICoKKwlidWYtPnNnX2Rlc2Muc2dsaXN0ID0gdnphbGxvYyhidWYtPnNnX2Rlc2MubnVtX3BhZ2VzICoKIAkJCQkgICAgICBzaXplb2YoKmJ1Zi0+c2dfZGVzYy5zZ2xpc3QpKTsKIAlpZiAoIWJ1Zi0+c2dfZGVzYy5zZ2xpc3QpCiAJCWdvdG8gZmFpbF9zZ2xpc3RfYWxsb2M7Ci0JbWVtc2V0KGJ1Zi0+c2dfZGVzYy5zZ2xpc3QsIDAsIGJ1Zi0+c2dfZGVzYy5udW1fcGFnZXMgKgotCSAgICAgICBzaXplb2YoKmJ1Zi0+c2dfZGVzYy5zZ2xpc3QpKTsKIAlzZ19pbml0X3RhYmxlKGJ1Zi0+c2dfZGVzYy5zZ2xpc3QsIGJ1Zi0+c2dfZGVzYy5udW1fcGFnZXMpOwogCiAJYnVmLT5wYWdlcyA9IGt6YWxsb2MoYnVmLT5zZ19kZXNjLm51bV9wYWdlcyAqIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSwKQEAgLTEzNiwxMyArMTM0LDExIEBACiAJbGFzdCAgPSAoKHZhZGRyICsgc2l6ZSAtIDEpICYgUEFHRV9NQVNLKSA+PiBQQUdFX1NISUZUOwogCWJ1Zi0+c2dfZGVzYy5udW1fcGFnZXMgPSBsYXN0IC0gZmlyc3QgKyAxOwogCi0JYnVmLT5zZ19kZXNjLnNnbGlzdCA9IHZtYWxsb2MoCisJYnVmLT5zZ19kZXNjLnNnbGlzdCA9IHZ6YWxsb2MoCiAJCWJ1Zi0+c2dfZGVzYy5udW1fcGFnZXMgKiBzaXplb2YoKmJ1Zi0+c2dfZGVzYy5zZ2xpc3QpKTsKIAlpZiAoIWJ1Zi0+c2dfZGVzYy5zZ2xpc3QpCiAJCWdvdG8gdXNlcnB0cl9mYWlsX3NnbGlzdF9hbGxvYzsKIAotCW1lbXNldChidWYtPnNnX2Rlc2Muc2dsaXN0LCAwLAotCQlidWYtPnNnX2Rlc2MubnVtX3BhZ2VzICogc2l6ZW9mKCpidWYtPnNnX2Rlc2Muc2dsaXN0KSk7CiAJc2dfaW5pdF90YWJsZShidWYtPnNnX2Rlc2Muc2dsaXN0LCBidWYtPnNnX2Rlc2MubnVtX3BhZ2VzKTsKIAogCWJ1Zi0+cGFnZXMgPSBremFsbG9jKGJ1Zi0+c2dfZGVzYy5udW1fcGFnZXMgKiBzaXplb2Yoc3RydWN0IHBhZ2UgKiksCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpZGVvYnVmMi1tZW1vcHMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYyLW1lbW9wcy5jCmluZGV4IGIwM2MzYWUuLjU2OWVlYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYyLW1lbW9wcy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdmlkZW9idWYyLW1lbW9wcy5jCkBAIC0xNzYsNyArMTc2LDcgQEAKIAogCXZtYS0+dm1fb3BzLT5vcGVuKHZtYSk7CiAKLQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IG1hcHBlZCBwYWRkciAweCUwOGx4IGF0IDB4JTA4bHgsIHNpemUgJWxkXG4iLAorCXByX2RlYnVnKCIlczogbWFwcGVkIHBhZGRyIDB4JTA4bHggYXQgMHglMDhseCwgc2l6ZSAlbGRcbiIsCiAJCQlfX2Z1bmNfXywgcGFkZHIsIHZtYS0+dm1fc3RhcnQsIHNpemUpOwogCiAJcmV0dXJuIDA7CkBAIC0xOTQsNyArMTk0LDcgQEAKIHsKIAlzdHJ1Y3QgdmIyX3ZtYXJlYV9oYW5kbGVyICpoID0gdm1hLT52bV9wcml2YXRlX2RhdGE7CiAKLQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICVwLCByZWZjb3VudDogJWQsIHZtYTogJTA4bHgtJTA4bHhcbiIsCisJcHJfZGVidWcoIiVzOiAlcCwgcmVmY291bnQ6ICVkLCB2bWE6ICUwOGx4LSUwOGx4XG4iLAogCSAgICAgICBfX2Z1bmNfXywgaCwgYXRvbWljX3JlYWQoaC0+cmVmY291bnQpLCB2bWEtPnZtX3N0YXJ0LAogCSAgICAgICB2bWEtPnZtX2VuZCk7CiAKQEAgLTIxMiw3ICsyMTIsNyBAQAogewogCXN0cnVjdCB2YjJfdm1hcmVhX2hhbmRsZXIgKmggPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKIAotCXByaW50ayhLRVJOX0RFQlVHICIlczogJXAsIHJlZmNvdW50OiAlZCwgdm1hOiAlMDhseC0lMDhseFxuIiwKKwlwcl9kZWJ1ZygiJXM6ICVwLCByZWZjb3VudDogJWQsIHZtYTogJTA4bHgtJTA4bHhcbiIsCiAJICAgICAgIF9fZnVuY19fLCBoLCBhdG9taWNfcmVhZChoLT5yZWZjb3VudCksIHZtYS0+dm1fc3RhcnQsCiAJICAgICAgIHZtYS0+dm1fZW5kKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby92aW5vLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Zpbm8uYwppbmRleCBkNjNlOWQ5Li41MmEwYTM3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3Zpbm8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3Zpbm8uYwpAQCAtMzYsNyArMzYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KLSNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CiAjaW5jbHVkZSA8bGludXgva21vZC5oPgogCiAjaW5jbHVkZSA8bGludXgvaTJjLmg+CkBAIC02MSw4ICs2MCw3IEBACiAvLyAjZGVmaW5lIFZJTk9fREVCVUcKIC8vICNkZWZpbmUgVklOT19ERUJVR19JTlQKIAotI2RlZmluZSBWSU5PX01PRFVMRV9WRVJTSU9OICIwLjAuNiIKLSNkZWZpbmUgVklOT19WRVJTSU9OX0NPREUgS0VSTkVMX1ZFUlNJT04oMCwgMCwgNikKKyNkZWZpbmUgVklOT19NT0RVTEVfVkVSU0lPTiAiMC4wLjciCiAKIE1PRFVMRV9ERVNDUklQVElPTigiU0dJIFZJTk8gVmlkZW80TGludXgyIGRyaXZlciIpOwogTU9EVUxFX1ZFUlNJT04oVklOT19NT0RVTEVfVkVSU0lPTik7CkBAIC0yOTM0LDcgKzI5MzIsNiBAQAogCXN0cmNweShjYXAtPmRyaXZlciwgdmlub19kcml2ZXJfbmFtZSk7CiAJc3RyY3B5KGNhcC0+Y2FyZCwgdmlub19kcml2ZXJfZGVzY3JpcHRpb24pOwogCXN0cmNweShjYXAtPmJ1c19pbmZvLCB2aW5vX2J1c19uYW1lKTsKLQljYXAtPnZlcnNpb24gPSBWSU5PX1ZFUlNJT05fQ09ERTsKIAljYXAtPmNhcGFiaWxpdGllcyA9CiAJCVY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfAogCQlWNEwyX0NBUF9TVFJFQU1JTkc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3ZpdmkuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdml2aS5jCmluZGV4IDIyMzhhNjEuLmE4NDhiZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vdml2aS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdml2aS5jCkBAIC0yMiw3ICsyMiw2IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZm9udC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KQEAgLTMyLDYgKzMxLDcgQEAKICNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZmguaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWV2ZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KIAogI2RlZmluZSBWSVZJX01PRFVMRV9OQU1FICJ2aXZpIgpAQCAtNDQsMTUgKzQ0LDEyIEBACiAjZGVmaW5lIE1BWF9XSURUSCAxOTIwCiAjZGVmaW5lIE1BWF9IRUlHSFQgMTIwMAogCi0jZGVmaW5lIFZJVklfTUFKT1JfVkVSU0lPTiAwCi0jZGVmaW5lIFZJVklfTUlOT1JfVkVSU0lPTiA4Ci0jZGVmaW5lIFZJVklfUkVMRUFTRSAwCi0jZGVmaW5lIFZJVklfVkVSU0lPTiBcCi0JS0VSTkVMX1ZFUlNJT04oVklWSV9NQUpPUl9WRVJTSU9OLCBWSVZJX01JTk9SX1ZFUlNJT04sIFZJVklfUkVMRUFTRSkKKyNkZWZpbmUgVklWSV9WRVJTSU9OICIwLjguMSIKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJWaWRlbyBUZWNobm9sb2d5IE1hZ2F6aW5lIFZpcnR1YWwgVmlkZW8gQ2FwdHVyZSBCb2FyZCIpOwogTU9EVUxFX0FVVEhPUigiTWF1cm8gQ2FydmFsaG8gQ2hlaGFiLCBUZWQgV2FsdGhlciBhbmQgSm9obiBTb2tvbCIpOwogTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOworTU9EVUxFX1ZFUlNJT04oVklWSV9WRVJTSU9OKTsKIAogc3RhdGljIHVuc2lnbmVkIHZpZGVvX25yID0gLTE7CiBtb2R1bGVfcGFyYW0odmlkZW9fbnIsIHVpbnQsIDA2NDQpOwpAQCAtMTY3LDYgKzE2NCwxMSBAQAogCXN0cnVjdCB2NGwyX2N0cmwJICAgKmNvbnRyYXN0OwogCXN0cnVjdCB2NGwyX2N0cmwJICAgKnNhdHVyYXRpb247CiAJc3RydWN0IHY0bDJfY3RybAkgICAqaHVlOworCXN0cnVjdCB7CisJCS8qIGF1dG9nYWluL2dhaW4gY2x1c3RlciAqLworCQlzdHJ1Y3QgdjRsMl9jdHJsCSAgICphdXRvZ2FpbjsKKwkJc3RydWN0IHY0bDJfY3RybAkgICAqZ2FpbjsKKwl9OwogCXN0cnVjdCB2NGwyX2N0cmwJICAgKnZvbHVtZTsKIAlzdHJ1Y3QgdjRsMl9jdHJsCSAgICpidXR0b247CiAJc3RydWN0IHY0bDJfY3RybAkgICAqYm9vbGVhbjsKQEAgLTE3NCw2ICsxNzYsNyBAQAogCXN0cnVjdCB2NGwyX2N0cmwJICAgKmludDY0OwogCXN0cnVjdCB2NGwyX2N0cmwJICAgKm1lbnU7CiAJc3RydWN0IHY0bDJfY3RybAkgICAqc3RyaW5nOworCXN0cnVjdCB2NGwyX2N0cmwJICAgKmJpdG1hc2s7CiAKIAlzcGlubG9ja190ICAgICAgICAgICAgICAgICBzbG9jazsKIAlzdHJ1Y3QgbXV0ZXgJCSAgIG11dGV4OwpAQCAtNDU3LDYgKzQ2MCw3IEBACiAJdW5zaWduZWQgbXM7CiAJY2hhciBzdHJbMTAwXTsKIAlpbnQgaCwgbGluZSA9IDE7CisJczMyIGdhaW47CiAKIAlpZiAoIXZidWYpCiAJCXJldHVybjsKQEAgLTQ3OSw2ICs0ODMsNyBAQAogCQkJZGV2LT53aWR0aCwgZGV2LT5oZWlnaHQsIGRldi0+aW5wdXQpOwogCWdlbl90ZXh0KGRldiwgdmJ1ZiwgbGluZSsrICogMTYsIDE2LCBzdHIpOwogCisJZ2FpbiA9IHY0bDJfY3RybF9nX2N0cmwoZGV2LT5nYWluKTsKIAltdXRleF9sb2NrKCZkZXYtPmN0cmxfaGFuZGxlci5sb2NrKTsKIAlzbnByaW50ZihzdHIsIHNpemVvZihzdHIpLCAiIGJyaWdodG5lc3MgJTNkLCBjb250cmFzdCAlM2QsIHNhdHVyYXRpb24gJTNkLCBodWUgJWQgIiwKIAkJCWRldi0+YnJpZ2h0bmVzcy0+Y3VyLnZhbCwKQEAgLTQ4NiwxMSArNDkxLDEzIEBACiAJCQlkZXYtPnNhdHVyYXRpb24tPmN1ci52YWwsCiAJCQlkZXYtPmh1ZS0+Y3VyLnZhbCk7CiAJZ2VuX3RleHQoZGV2LCB2YnVmLCBsaW5lKysgKiAxNiwgMTYsIHN0cik7Ci0Jc25wcmludGYoc3RyLCBzaXplb2Yoc3RyKSwgIiB2b2x1bWUgJTNkICIsIGRldi0+dm9sdW1lLT5jdXIudmFsKTsKKwlzbnByaW50ZihzdHIsIHNpemVvZihzdHIpLCAiIGF1dG9nYWluICVkLCBnYWluICUzZCwgdm9sdW1lICUzZCAiLAorCQkJZGV2LT5hdXRvZ2Fpbi0+Y3VyLnZhbCwgZ2FpbiwgZGV2LT52b2x1bWUtPmN1ci52YWwpOwogCWdlbl90ZXh0KGRldiwgdmJ1ZiwgbGluZSsrICogMTYsIDE2LCBzdHIpOwotCXNucHJpbnRmKHN0ciwgc2l6ZW9mKHN0ciksICIgaW50MzIgJWQsIGludDY0ICVsbGQgIiwKKwlzbnByaW50ZihzdHIsIHNpemVvZihzdHIpLCAiIGludDMyICVkLCBpbnQ2NCAlbGxkLCBiaXRtYXNrICUwOHggIiwKIAkJCWRldi0+aW50MzItPmN1ci52YWwsCi0JCQlkZXYtPmludDY0LT5jdXIudmFsNjQpOworCQkJZGV2LT5pbnQ2NC0+Y3VyLnZhbDY0LAorCQkJZGV2LT5iaXRtYXNrLT5jdXIudmFsKTsKIAlnZW5fdGV4dChkZXYsIHZidWYsIGxpbmUrKyAqIDE2LCAxNiwgc3RyKTsKIAlzbnByaW50ZihzdHIsIHNpemVvZihzdHIpLCAiIGJvb2xlYW4gJWQsIG1lbnUgJXMsIHN0cmluZyBcIiVzXCIgIiwKIAkJCWRldi0+Ym9vbGVhbi0+Y3VyLnZhbCwKQEAgLTUyNCwxMSArNTMxLDEzIEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+c2xvY2ssIGZsYWdzKTsKIAlpZiAobGlzdF9lbXB0eSgmZG1hX3EtPmFjdGl2ZSkpIHsKIAkJZHByaW50ayhkZXYsIDEsICJObyBhY3RpdmUgcXVldWUgdG8gc2VydmVcbiIpOwotCQlnb3RvIHVubG9jazsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zbG9jaywgZmxhZ3MpOworCQlyZXR1cm47CiAJfQogCiAJYnVmID0gbGlzdF9lbnRyeShkbWFfcS0+YWN0aXZlLm5leHQsIHN0cnVjdCB2aXZpX2J1ZmZlciwgbGlzdCk7CiAJbGlzdF9kZWwoJmJ1Zi0+bGlzdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5zbG9jaywgZmxhZ3MpOwogCiAJZG9fZ2V0dGltZW9mZGF5KCZidWYtPnZiLnY0bDJfYnVmLnRpbWVzdGFtcCk7CiAKQEAgLTUzOCw4ICs1NDcsNiBAQAogCiAJdmIyX2J1ZmZlcl9kb25lKCZidWYtPnZiLCBWQjJfQlVGX1NUQVRFX0RPTkUpOwogCWRwcmludGsoZGV2LCAyLCAiWyVwLyVkXSBkb25lXG4iLCBidWYsIGJ1Zi0+dmIudjRsMl9idWYuaW5kZXgpOwotdW5sb2NrOgotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+c2xvY2ssIGZsYWdzKTsKIH0KIAogI2RlZmluZSBmcmFtZXNfdG9fbXMoZnJhbWVzKQkJCQkJXApAQCAtODEyLDcgKzgxOSw2IEBACiAJc3RyY3B5KGNhcC0+ZHJpdmVyLCAidml2aSIpOwogCXN0cmNweShjYXAtPmNhcmQsICJ2aXZpIik7CiAJc3RybGNweShjYXAtPmJ1c19pbmZvLCBkZXYtPnY0bDJfZGV2Lm5hbWUsIHNpemVvZihjYXAtPmJ1c19pbmZvKSk7Ci0JY2FwLT52ZXJzaW9uID0gVklWSV9WRVJTSU9OOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8IFY0TDJfQ0FQX1NUUkVBTUlORyB8IFwKIAkJCSAgICBWNEwyX0NBUF9SRUFEV1JJVEU7CiAJcmV0dXJuIDA7CkBAIC05NzUsMTQgKzk4MSwzNyBAQAogCWlmIChpID49IE5VTV9JTlBVVFMpCiAJCXJldHVybiAtRUlOVkFMOwogCisJaWYgKGkgPT0gZGV2LT5pbnB1dCkKKwkJcmV0dXJuIDA7CisKIAlkZXYtPmlucHV0ID0gaTsKIAlwcmVjYWxjdWxhdGVfYmFycyhkZXYpOwogCXByZWNhbGN1bGF0ZV9saW5lKGRldik7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgdmlkaW9jX3N1YnNjcmliZV9ldmVudChzdHJ1Y3QgdjRsMl9maCAqZmgsCisJCQkJc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uICpzdWIpCit7CisJc3dpdGNoIChzdWItPnR5cGUpIHsKKwljYXNlIFY0TDJfRVZFTlRfQ1RSTDoKKwkJcmV0dXJuIHY0bDJfZXZlbnRfc3Vic2NyaWJlKGZoLCBzdWIsIDApOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKwogLyogLS0tIGNvbnRyb2xzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAorc3RhdGljIGludCB2aXZpX2dfdm9sYXRpbGVfY3RybChzdHJ1Y3QgdjRsMl9jdHJsICpjdHJsKQoreworCXN0cnVjdCB2aXZpX2RldiAqZGV2ID0gY29udGFpbmVyX29mKGN0cmwtPmhhbmRsZXIsIHN0cnVjdCB2aXZpX2RldiwgY3RybF9oYW5kbGVyKTsKKworCWlmIChjdHJsID09IGRldi0+YXV0b2dhaW4pCisJCWRldi0+Z2Fpbi0+dmFsID0gamlmZmllcyAmIDB4ZmY7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgdml2aV9zX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKIHsKIAlzdHJ1Y3Qgdml2aV9kZXYgKmRldiA9IGNvbnRhaW5lcl9vZihjdHJsLT5oYW5kbGVyLCBzdHJ1Y3Qgdml2aV9kZXYsIGN0cmxfaGFuZGxlcik7CkBAIC0xMDEwLDEwICsxMDM5LDE3IEBACiB2aXZpX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKIHsKIAlzdHJ1Y3Qgdml2aV9kZXYgKmRldiA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IHY0bDJfZmggKmZoID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwogCXN0cnVjdCB2YjJfcXVldWUgKnEgPSAmZGV2LT52Yl92aWRxOworCXVuc2lnbmVkIGludCByZXM7CiAKIAlkcHJpbnRrKGRldiwgMSwgIiVzXG4iLCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIHZiMl9wb2xsKHEsIGZpbGUsIHdhaXQpOworCXJlcyA9IHZiMl9wb2xsKHEsIGZpbGUsIHdhaXQpOworCWlmICh2NGwyX2V2ZW50X3BlbmRpbmcoZmgpKQorCQlyZXMgfD0gUE9MTFBSSTsKKwllbHNlCisJCXBvbGxfd2FpdChmaWxlLCAmZmgtPndhaXQsIHdhaXQpOworCXJldHVybiByZXM7CiB9CiAKIHN0YXRpYyBpbnQgdml2aV9jbG9zZShzdHJ1Y3QgZmlsZSAqZmlsZSkKQEAgLTEwNDUsNiArMTA4MSw3IEBACiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX29wcyB2aXZpX2N0cmxfb3BzID0geworCS5nX3ZvbGF0aWxlX2N0cmwgPSB2aXZpX2dfdm9sYXRpbGVfY3RybCwKIAkuc19jdHJsID0gdml2aV9zX2N0cmwsCiB9OwogCkBAIC0xMTE3LDkgKzExNTQsMjAgQEAKIAkuc3RlcCA9IDEsCiB9OwogCitzdGF0aWMgY29uc3Qgc3RydWN0IHY0bDJfY3RybF9jb25maWcgdml2aV9jdHJsX2JpdG1hc2sgPSB7CisJLm9wcyA9ICZ2aXZpX2N0cmxfb3BzLAorCS5pZCA9IFZJVklfQ0lEX0NVU1RPTV9CQVNFICsgNiwKKwkubmFtZSA9ICJCaXRtYXNrIiwKKwkudHlwZSA9IFY0TDJfQ1RSTF9UWVBFX0JJVE1BU0ssCisJLmRlZiA9IDB4ODAwMDIwMDAsCisJLm1pbiA9IDAsCisJLm1heCA9IDB4ODA0MDIwMTAsCisJLnN0ZXAgPSAwLAorfTsKKwogc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyB2aXZpX2ZvcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuCQk9IHY0bDJfZmhfb3BlbiwKKwkub3BlbiAgICAgICAgICAgPSB2NGwyX2ZoX29wZW4sCiAJLnJlbGVhc2UgICAgICAgID0gdml2aV9jbG9zZSwKIAkucmVhZCAgICAgICAgICAgPSB2aXZpX3JlYWQsCiAJLnBvbGwJCT0gdml2aV9wb2xsLApAQCAtMTE0Myw2ICsxMTkxLDggQEAKIAkudmlkaW9jX3NfaW5wdXQgICAgICAgPSB2aWRpb2Nfc19pbnB1dCwKIAkudmlkaW9jX3N0cmVhbW9uICAgICAgPSB2aWRpb2Nfc3RyZWFtb24sCiAJLnZpZGlvY19zdHJlYW1vZmYgICAgID0gdmlkaW9jX3N0cmVhbW9mZiwKKwkudmlkaW9jX3N1YnNjcmliZV9ldmVudCA9IHZpZGlvY19zdWJzY3JpYmVfZXZlbnQsCisJLnZpZGlvY191bnN1YnNjcmliZV9ldmVudCA9IHY0bDJfZXZlbnRfdW5zdWJzY3JpYmUsCiB9OwogCiBzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSB2aXZpX3RlbXBsYXRlID0gewpAQCAtMTIxMywxNiArMTI2MywyMiBAQAogCQkJVjRMMl9DSURfU0FUVVJBVElPTiwgMCwgMjU1LCAxLCAxMjcpOwogCWRldi0+aHVlID0gdjRsMl9jdHJsX25ld19zdGQoaGRsLCAmdml2aV9jdHJsX29wcywKIAkJCVY0TDJfQ0lEX0hVRSwgLTEyOCwgMTI3LCAxLCAwKTsKKwlkZXYtPmF1dG9nYWluID0gdjRsMl9jdHJsX25ld19zdGQoaGRsLCAmdml2aV9jdHJsX29wcywKKwkJCVY0TDJfQ0lEX0FVVE9HQUlOLCAwLCAxLCAxLCAxKTsKKwlkZXYtPmdhaW4gPSB2NGwyX2N0cmxfbmV3X3N0ZChoZGwsICZ2aXZpX2N0cmxfb3BzLAorCQkJVjRMMl9DSURfR0FJTiwgMCwgMjU1LCAxLCAxMDApOwogCWRldi0+YnV0dG9uID0gdjRsMl9jdHJsX25ld19jdXN0b20oaGRsLCAmdml2aV9jdHJsX2J1dHRvbiwgTlVMTCk7CiAJZGV2LT5pbnQzMiA9IHY0bDJfY3RybF9uZXdfY3VzdG9tKGhkbCwgJnZpdmlfY3RybF9pbnQzMiwgTlVMTCk7CiAJZGV2LT5pbnQ2NCA9IHY0bDJfY3RybF9uZXdfY3VzdG9tKGhkbCwgJnZpdmlfY3RybF9pbnQ2NCwgTlVMTCk7CiAJZGV2LT5ib29sZWFuID0gdjRsMl9jdHJsX25ld19jdXN0b20oaGRsLCAmdml2aV9jdHJsX2Jvb2xlYW4sIE5VTEwpOwogCWRldi0+bWVudSA9IHY0bDJfY3RybF9uZXdfY3VzdG9tKGhkbCwgJnZpdmlfY3RybF9tZW51LCBOVUxMKTsKIAlkZXYtPnN0cmluZyA9IHY0bDJfY3RybF9uZXdfY3VzdG9tKGhkbCwgJnZpdmlfY3RybF9zdHJpbmcsIE5VTEwpOworCWRldi0+Yml0bWFzayA9IHY0bDJfY3RybF9uZXdfY3VzdG9tKGhkbCwgJnZpdmlfY3RybF9iaXRtYXNrLCBOVUxMKTsKIAlpZiAoaGRsLT5lcnJvcikgewogCQlyZXQgPSBoZGwtPmVycm9yOwogCQlnb3RvIHVucmVnX2RldjsKIAl9CisJdjRsMl9jdHJsX2F1dG9fY2x1c3RlcigyLCAmZGV2LT5hdXRvZ2FpbiwgMCwgdHJ1ZSk7CiAJZGV2LT52NGwyX2Rldi5jdHJsX2hhbmRsZXIgPSBoZGw7CiAKIAkvKiBpbml0aWFsaXplIGxvY2tzICovCkBAIC0xMzI1LDkgKzEzODEsOCBAQAogCX0KIAogCXByaW50ayhLRVJOX0lORk8gIlZpZGVvIFRlY2hub2xvZ3kgTWFnYXppbmUgVmlydHVhbCBWaWRlbyAiCi0JCQkiQ2FwdHVyZSBCb2FyZCB2ZXIgJXUuJXUuJXUgc3VjY2Vzc2Z1bGx5IGxvYWRlZC5cbiIsCi0JCQkoVklWSV9WRVJTSU9OID4+IDE2KSAmIDB4RkYsIChWSVZJX1ZFUlNJT04gPj4gOCkgJiAweEZGLAotCQkJVklWSV9WRVJTSU9OICYgMHhGRik7CisJCQkiQ2FwdHVyZSBCb2FyZCB2ZXIgJXMgc3VjY2Vzc2Z1bGx5IGxvYWRlZC5cbiIsCisJCQlWSVZJX1ZFUlNJT04pOwogCiAJLyogbl9kZXZzIHdpbGwgcmVmbGVjdCB0aGUgYWN0dWFsIG51bWJlciBvZiBhbGxvY2F0ZWQgZGV2aWNlcyAqLwogCW5fZGV2cyA9IGk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3c5OTY2LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3c5OTY2LmMKaW5kZXggZmEzNTYzOS4uNDUzZGJiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby93OTk2Ni5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vdzk5NjYuYwpAQCAtNTcsNyArNTcsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KQEAgLTEyNyw3ICsxMjYsNyBAQAogTU9EVUxFX0FVVEhPUigiSmFrb2IgS2VtaSA8amFrb2Iua2VtaUBwb3N0LnV0Zm9ycy5zZT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiV2luYm9uZCB3OTk2NmNmIFdlYkNhbSBkcml2ZXIgKDAuMzIpIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KK01PRFVMRV9WRVJTSU9OKCIwLjMzLjEiKTsKIAogI2lmZGVmIE1PRFVMRQogc3RhdGljIGNvbnN0IGNoYXIgKnBhcmRldltdID0ge1swIC4uLiBXOTk2Nl9NQVhDQU1TXSA9ICIifTsKQEAgLTU2OCw3ICs1NjcsNiBAQAogCXN0cmxjcHkodmNhcC0+ZHJpdmVyLCBjYW0tPnY0bDJfZGV2Lm5hbWUsIHNpemVvZih2Y2FwLT5kcml2ZXIpKTsKIAlzdHJsY3B5KHZjYXAtPmNhcmQsIFc5OTY2X0RSSVZFUk5BTUUsIHNpemVvZih2Y2FwLT5jYXJkKSk7CiAJc3RybGNweSh2Y2FwLT5idXNfaW5mbywgInBhcnBvcnQiLCBzaXplb2YodmNhcC0+YnVzX2luZm8pKTsKLQl2Y2FwLT52ZXJzaW9uID0gS0VSTkVMX1ZFUlNJT04oMCwgMzMsIDApOwogCXZjYXAtPmNhcGFiaWxpdGllcyA9IFY0TDJfQ0FQX1ZJREVPX0NBUFRVUkUgfCBWNEwyX0NBUF9SRUFEV1JJVEU7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pvcmFuLmggYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pvcmFuLmgKaW5kZXggZjNmNjQwMC4uZDcxNjZhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96b3Jhbi5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4vem9yYW4uaApAQCAtNDEsMTAgKzQxLDYgQEAKIH07CiAKIAotI2RlZmluZSBNQUpPUl9WRVJTSU9OIDAJCS8qIGRyaXZlciBtYWpvciB2ZXJzaW9uICovCi0jZGVmaW5lIE1JTk9SX1ZFUlNJT04gMTAJLyogZHJpdmVyIG1pbm9yIHZlcnNpb24gKi8KLSNkZWZpbmUgUkVMRUFTRV9WRVJTSU9OIDAJLyogcmVsZWFzZSB2ZXJzaW9uICovCi0KICNkZWZpbmUgWk9SQU5fTkFNRSAgICAiWk9SQU4iCS8qIG5hbWUgb2YgdGhlIGRldmljZSAqLwogCiAjZGVmaW5lIFpSX0RFVk5BTUUoenIpICgoenIpLT5uYW1lKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96b3Jhbl9jYXJkLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pvcmFuX2NhcmQuYwppbmRleCA3OWIwNGFjLi5jMzYwMmQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pvcmFuX2NhcmQuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pvcmFuX2NhcmQuYwpAQCAtMTIzLDkgKzEyMywxMiBAQAogbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCB6cjM2MDY3X2RlYnVnLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgIkRlYnVnIGxldmVsICgwLTUpIik7CiAKKyNkZWZpbmUgWk9SQU5fVkVSU0lPTiAiMC4xMC4xIgorCiBNT0RVTEVfREVTQ1JJUFRJT04oIlpvcmFuLTM2MDU3LzM2MDY3IEpQRUcgY29kZWMgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJTZXJndWVpIE1pcmlkb25vdiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX1ZFUlNJT04oWk9SQU5fVkVSU0lPTik7CiAKICNkZWZpbmUgWlJfREVWSUNFKHN1YnZlbiwgc3ViZGV2LCBkYXRhKQl7IFwKIAkudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9aT1JBTiwgLmRldmljZSA9IFBDSV9ERVZJQ0VfSURfWk9SQU5fMzYwNTcsIFwKQEAgLTE0NTksOCArMTQ2Miw4IEBACiB7CiAJaW50IHJlczsKIAotCXByaW50ayhLRVJOX0lORk8gIlpvcmFuIE1KUEVHIGJvYXJkIGRyaXZlciB2ZXJzaW9uICVkLiVkLiVkXG4iLAotCSAgICAgICBNQUpPUl9WRVJTSU9OLCBNSU5PUl9WRVJTSU9OLCBSRUxFQVNFX1ZFUlNJT04pOworCXByaW50ayhLRVJOX0lORk8gIlpvcmFuIE1KUEVHIGJvYXJkIGRyaXZlciB2ZXJzaW9uICVzXG4iLAorCSAgICAgICBaT1JBTl9WRVJTSU9OKTsKIAogCS8qIGNoZWNrIHRoZSBwYXJhbWV0ZXJzIHdlIGhhdmUgYmVlbiBnaXZlbiwgYWRqdXN0IGlmIG5lY2Vzc2FyeSAqLwogCWlmICh2NGxfbmJ1ZnMgPCAyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96b3Jhbl9kcml2ZXIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vem9yYW4vem9yYW5fZHJpdmVyLmMKaW5kZXggMjc3MWQ4MS4uZDRkMDVkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96b3Jhbi96b3Jhbl9kcml2ZXIuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3pvcmFuL3pvcmFuX2RyaXZlci5jCkBAIC00NCw3ICs0NCw2IEBACiAgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICAqLwogCi0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgpAQCAtMTUzOCw4ICsxNTM3LDYgQEAKIAlzdHJuY3B5KGNhcC0+ZHJpdmVyLCAiem9yYW4iLCBzaXplb2YoY2FwLT5kcml2ZXIpLTEpOwogCXNucHJpbnRmKGNhcC0+YnVzX2luZm8sIHNpemVvZihjYXAtPmJ1c19pbmZvKSwgIlBDSTolcyIsCiAJCSBwY2lfbmFtZSh6ci0+cGNpX2RldikpOwotCWNhcC0+dmVyc2lvbiA9IEtFUk5FTF9WRVJTSU9OKE1BSk9SX1ZFUlNJT04sIE1JTk9SX1ZFUlNJT04sCi0JCQkgICBSRUxFQVNFX1ZFUlNJT04pOwogCWNhcC0+Y2FwYWJpbGl0aWVzID0gVjRMMl9DQVBfU1RSRUFNSU5HIHwgVjRMMl9DQVBfVklERU9fQ0FQVFVSRSB8CiAJCQkgICAgVjRMMl9DQVBfVklERU9fT1VUUFVUIHwgVjRMMl9DQVBfVklERU9fT1ZFUkxBWTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8venIzNjR4eC5jIGIvZHJpdmVycy9tZWRpYS92aWRlby96cjM2NHh4LmMKaW5kZXggN2RmYjAxZS4uYzQ5Mjg0NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby96cjM2NHh4LmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby96cjM2NHh4LmMKQEAgLTI5LDcgKzI5LDYgQEAKIAogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC91c2IuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CkBAIC00Miw4ICs0MSw3IEBACiAKIAogLyogVmVyc2lvbiBJbmZvcm1hdGlvbiAqLwotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjAuNzMiCi0jZGVmaW5lIFpSMzY0WFhfVkVSU0lPTl9DT0RFIEtFUk5FTF9WRVJTSU9OKDAsIDcsIDMpCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICIwLjcuNCIKICNkZWZpbmUgRFJJVkVSX0FVVEhPUiAiQW50b2luZSBKYWNxdWV0LCBodHRwOi8vcm95YWxlLnplcmV6by5jb20vIgogI2RlZmluZSBEUklWRVJfREVTQyAiWm9yYW4gMzY0eHgiCiAKQEAgLTc0NCw3ICs3NDIsNiBAQAogCXN0cmxjcHkoY2FwLT5jYXJkLCBjYW0tPnVkZXYtPnByb2R1Y3QsIHNpemVvZihjYXAtPmNhcmQpKTsKIAlzdHJsY3B5KGNhcC0+YnVzX2luZm8sIGRldl9uYW1lKCZjYW0tPnVkZXYtPmRldiksCiAJCXNpemVvZihjYXAtPmJ1c19pbmZvKSk7Ci0JY2FwLT52ZXJzaW9uID0gWlIzNjRYWF9WRVJTSU9OX0NPREU7CiAJY2FwLT5jYXBhYmlsaXRpZXMgPSBWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwKIAkJCSAgICBWNEwyX0NBUF9SRUFEV1JJVEUgfAogCQkJICAgIFY0TDJfQ0FQX1NUUkVBTUlORzsKQEAgLTE3MjEsMyArMTcxOCw0IEBACiBNT0RVTEVfQVVUSE9SKERSSVZFUl9BVVRIT1IpOwogTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9WRVJTSU9OKERSSVZFUl9WRVJTSU9OKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguYyBiL2RyaXZlcnMvbWVzc2FnZS9mdXNpb24vbXB0c2NzaWguYwppbmRleCBhMWQ0ZWU2Li5jZTYxYTU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lc3NhZ2UvZnVzaW9uL21wdHNjc2loLmMKKysrIGIvZHJpdmVycy9tZXNzYWdlL2Z1c2lvbi9tcHRzY3NpaC5jCkBAIC04MjcsNyArODI3LDcgQEAKIAkJCQkgKiBESURfU09GVF9FUlJPUiBpcyBzZXQuCiAJCQkJICovCiAJCQkJaWYgKGlvYy0+YnVzX3R5cGUgPT0gU1BJKSB7Ci0JCQkJCWlmIChwU2NzaVJlcS0+Q0RCWzBdID09IFJFQURfNiAgfHwKKwkJCQkJaWYgKChwU2NzaVJlcS0+Q0RCWzBdID09IFJFQURfNiAgJiYgKChwU2NzaVJlcS0+Q0RCWzFdICYgMHgwMikgPT0gMCkpIHx8CiAJCQkJCSAgICBwU2NzaVJlcS0+Q0RCWzBdID09IFJFQURfMTAgfHwKIAkJCQkJICAgIHBTY3NpUmVxLT5DREJbMF0gPT0gUkVBRF8xMiB8fAogCQkJCQkgICAgcFNjc2lSZXEtPkNEQlswXSA9PSBSRUFEXzE2IHx8CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9LY29uZmlnIGIvZHJpdmVycy9tZmQvS2NvbmZpZwppbmRleCAzN2I4M2ViLi4yMTU3NGJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbWZkL0tjb25maWcKQEAgLTE3MSw2ICsxNzEsMzcgQEAKIAkgIFRoaXMgZHJpdmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKIAkgIHdpbGwgYmUgY2FsbGVkIHRwczY1ODZ4LgogCitjb25maWcgTUZEX1RQUzY1OTEwCisJYm9vbCAiVFBTNjU5MTAgUG93ZXIgTWFuYWdlbWVudCBjaGlwIgorCWRlcGVuZHMgb24gSTJDPXkgJiYgR1BJT0xJQgorCXNlbGVjdCBNRkRfQ09SRQorCXNlbGVjdCBHUElPX1RQUzY1OTEwCisJaGVscAorCSAgaWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBUUFM2NTkxMCBzZXJpZXMgb2YKKwkgIFBvd2VyIE1hbmFnZW1lbnQgY2hpcHMuCisKK2NvbmZpZyBNRkRfVFBTNjU5MTIKKwlib29sCisJZGVwZW5kcyBvbiBHUElPTElCCisKK2NvbmZpZyBNRkRfVFBTNjU5MTJfSTJDCisJYm9vbCAiVFBTOTU2MTIgUG93ZXIgTWFuYWdlbWVudCBjaGlwIHdpdGggSTJDIgorCXNlbGVjdCBNRkRfQ09SRQorCXNlbGVjdCBNRkRfVFBTNjU5MTIKKwlkZXBlbmRzIG9uIEkyQz15ICYmIEdQSU9MSUIKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFRQUzY1OTEyIHNlcmllcyBvZgorCSAgUE0gY2hpcHMgd2l0aCBJMkMgaW50ZXJmYWNlLgorCitjb25maWcgTUZEX1RQUzY1OTEyX1NQSQorCWJvb2wgIlRQUzY1OTEyIFBvd2VyIE1hbmFnZW1lbnQgY2hpcCB3aXRoIFNQSSIKKwlzZWxlY3QgTUZEX0NPUkUKKwlzZWxlY3QgTUZEX1RQUzY1OTEyCisJZGVwZW5kcyBvbiBTUElfTUFTVEVSICYmIEdQSU9MSUIKKwloZWxwCisJICBJZiB5b3Ugc2F5IHllcyBoZXJlIHlvdSBnZXQgc3VwcG9ydCBmb3IgdGhlIFRQUzY1OTEyIHNlcmllcyBvZgorCSAgUE0gY2hpcHMgd2l0aCBTUEkgaW50ZXJmYWNlLgorCiBjb25maWcgTUVORUxBVVMKIAlib29sICJUZXhhcyBJbnN0cnVtZW50cyBUV0w5MjMzMC9NZW5lbGF1cyBQTSBjaGlwIgogCWRlcGVuZHMgb24gSTJDPXkgJiYgQVJDSF9PTUFQMgpAQCAtNjYyLDggKzY5Myw5IEBACiAJICBDQU4gYW5kIEdQSU8gY29udHJvbGxlcnMuCiAKIGNvbmZpZyBNRkRfSlo0NzQwX0FEQwotCXRyaXN0YXRlICJTdXBwb3J0IGZvciB0aGUgSlo0NzQwIFNvQyBBREMgY29yZSIKKwlib29sICJTdXBwb3J0IGZvciB0aGUgSlo0NzQwIFNvQyBBREMgY29yZSIKIAlzZWxlY3QgTUZEX0NPUkUKKwlzZWxlY3QgR0VORVJJQ19JUlFfQ0hJUAogCWRlcGVuZHMgb24gTUFDSF9KWjQ3NDAKIAloZWxwCiAJICBTYXkgeWVzIGhlcmUgaWYgeW91IHdhbnQgc3VwcG9ydCBmb3IgdGhlIEFEQyB1bml0IGluIHRoZSBKWjQ3NDAgU29DLgpAQCAtNzI1LDE4ICs3NTcsMTkgQEAKIAkgIFRoaXMgaXMgcmVxdWlyZWQgdG8gdXNlIGNlcnRhaW4gb3RoZXIgUE0gOHh4eCBmZWF0dXJlcywgc3VjaCBhcyBHUElPCiAJICBhbmQgTVBQLgogCi1jb25maWcgTUZEX1RQUzY1OTEwCi0JYm9vbCAiVFBTNjU5MTAgUG93ZXIgTWFuYWdlbWVudCBjaGlwIgotCWRlcGVuZHMgb24gSTJDPXkgJiYgR1BJT0xJQgotCXNlbGVjdCBNRkRfQ09SRQotCXNlbGVjdCBHUElPX1RQUzY1OTEwCi0JaGVscAotCSAgaWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBUUFM2NTkxMCBzZXJpZXMgb2YKLQkgIFBvd2VyIE1hbmFnZW1lbnQgY2hpcHMuCi0KIGNvbmZpZyBUUFM2NTkxMV9DT01QQVJBVE9SCiAJdHJpc3RhdGUKIAorY29uZmlnIE1GRF9BQVQyODcwX0NPUkUKKwlib29sICJTdXBwb3J0IGZvciB0aGUgQW5hbG9naWNUZWNoIEFBVDI4NzAiCisJc2VsZWN0IE1GRF9DT1JFCisJZGVwZW5kcyBvbiBJMkM9eSAmJiBHUElPTElCCisJaGVscAorCSAgSWYgeW91IHNheSB5ZXMgaGVyZSB5b3UgZ2V0IHN1cHBvcnQgZm9yIHRoZSBBQVQyODcwLgorCSAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgY29tbW9uIHN1cHBvcnQgZm9yIGFjY2Vzc2luZyB0aGUgZGV2aWNlLAorCSAgYWRkaXRpb25hbCBkcml2ZXJzIG11c3QgYmUgZW5hYmxlZCBpbiBvcmRlciB0byB1c2UgdGhlCisJICBmdW5jdGlvbmFsaXR5IG9mIHRoZSBkZXZpY2UuCisKIGVuZGlmICMgTUZEX1NVUFBPUlQKIAogbWVudSAiTXVsdGltZWRpYSBDYXBhYmlsaXRpZXMgUG9ydCBkcml2ZXJzIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvTWFrZWZpbGUgYi9kcml2ZXJzL21mZC9NYWtlZmlsZQppbmRleCAyMmEyODBmLi5jNTgwMjAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL21mZC9NYWtlZmlsZQpAQCAtMjMsNiArMjMsNyBAQAogCiBvYmotJChDT05GSUdfTUZEX1dNODQwMCkJKz0gd204NDAwLWNvcmUubwogd204MzF4LW9ianMJCQk6PSB3bTgzMXgtY29yZS5vIHdtODMxeC1pcnEubyB3bTgzMXgtb3RwLm8KK3dtODMxeC1vYmpzCQkJKz0gd204MzF4LWF1eGFkYy5vCiBvYmotJChDT05GSUdfTUZEX1dNODMxWCkJKz0gd204MzF4Lm8KIG9iai0kKENPTkZJR19NRkRfV004MzFYX0kyQykJKz0gd204MzF4LWkyYy5vCiBvYmotJChDT05GSUdfTUZEX1dNODMxWF9TUEkpCSs9IHdtODMxeC1zcGkubwpAQCAtMzUsNiArMzYsMTEgQEAKIG9iai0kKENPTkZJR19UUFM2MTA1WCkJCSs9IHRwczYxMDV4Lm8KIG9iai0kKENPTkZJR19UUFM2NTAxMCkJCSs9IHRwczY1MDEwLm8KIG9iai0kKENPTkZJR19UUFM2NTA3WCkJCSs9IHRwczY1MDd4Lm8KK29iai0kKENPTkZJR19NRkRfVFBTNjU5MTApCSs9IHRwczY1OTEwLm8gdHBzNjU5MTAtaXJxLm8KK3RwczY1OTEyLW9ianMgICAgICAgICAgICAgICAgICAgOj0gdHBzNjU5MTItY29yZS5vIHRwczY1OTEyLWlycS5vCitvYmotJChDT05GSUdfTUZEX1RQUzY1OTEyKQkrPSB0cHM2NTkxMi5vCitvYmotJChDT05GSUdfTUZEX1RQUzY1OTEyX0kyQykJKz0gdHBzNjU5MTItaTJjLm8KK29iai0kKENPTkZJR19NRkRfVFBTNjU5MTJfU1BJKSAgKz0gdHBzNjU5MTItc3BpLm8KIG9iai0kKENPTkZJR19NRU5FTEFVUykJCSs9IG1lbmVsYXVzLm8KIAogb2JqLSQoQ09ORklHX1RXTDQwMzBfQ09SRSkJKz0gdHdsLWNvcmUubyB0d2w0MDMwLWlycS5vIHR3bDYwMzAtaXJxLm8KQEAgLTk0LDUgKzEwMCw1IEBACiBvYmotJChDT05GSUdfTUZEX09NQVBfVVNCX0hPU1QpCSs9IG9tYXAtdXNiLWhvc3Qubwogb2JqLSQoQ09ORklHX01GRF9QTTg5MjFfQ09SRSkgCSs9IHBtODkyMS1jb3JlLm8KIG9iai0kKENPTkZJR19NRkRfUE04WFhYX0lSUSkgCSs9IHBtOHh4eC1pcnEubwotb2JqLSQoQ09ORklHX01GRF9UUFM2NTkxMCkJKz0gdHBzNjU5MTAubyB0cHM2NTkxMC1pcnEubwogb2JqLSQoQ09ORklHX1RQUzY1OTExX0NPTVBBUkFUT1IpCSs9IHRwczY1OTExLWNvbXBhcmF0b3Iubworb2JqLSQoQ09ORklHX01GRF9BQVQyODcwX0NPUkUpCSs9IGFhdDI4NzAtY29yZS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9hYXQyODcwLWNvcmUuYyBiL2RyaXZlcnMvbWZkL2FhdDI4NzAtY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NWRjNjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21mZC9hYXQyODcwLWNvcmUuYwpAQCAtMCwwICsxLDUzNSBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvbWZkL2FhdDI4NzAtY29yZS5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExLCBOVklESUEgQ29ycG9yYXRpb24uCisgKiBBdXRob3I6IEppbiBQYXJrIDxqaW55b3VuZ3BAbnZpZGlhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9hYXQyODcwLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KKworc3RhdGljIHN0cnVjdCBhYXQyODcwX3JlZ2lzdGVyIGFhdDI4NzBfcmVnc1tBQVQyODcwX1JFR19OVU1dID0geworCS8qIHJlYWRhYmxlLCB3cml0ZWFibGUsIHZhbHVlICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MDAgQUFUMjg3MF9CTF9DSF9FTiAqLworCXsgMCwgMSwgMHgxNiB9LAkvKiAweDAxIEFBVDI4NzBfQkxNICovCisJeyAwLCAxLCAweDE2IH0sCS8qIDB4MDIgQUFUMjg3MF9CTFMgKi8KKwl7IDAsIDEsIDB4NTYgfSwJLyogMHgwMyBBQVQyODcwX0JMMSAqLworCXsgMCwgMSwgMHg1NiB9LAkvKiAweDA0IEFBVDI4NzBfQkwyICovCisJeyAwLCAxLCAweDU2IH0sCS8qIDB4MDUgQUFUMjg3MF9CTDMgKi8KKwl7IDAsIDEsIDB4NTYgfSwJLyogMHgwNiBBQVQyODcwX0JMNCAqLworCXsgMCwgMSwgMHg1NiB9LAkvKiAweDA3IEFBVDI4NzBfQkw1ICovCisJeyAwLCAxLCAweDU2IH0sCS8qIDB4MDggQUFUMjg3MF9CTDYgKi8KKwl7IDAsIDEsIDB4NTYgfSwJLyogMHgwOSBBQVQyODcwX0JMNyAqLworCXsgMCwgMSwgMHg1NiB9LAkvKiAweDBBIEFBVDI4NzBfQkw4ICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MEIgQUFUMjg3MF9GTFIgKi8KKwl7IDAsIDEsIDB4MDMgfSwJLyogMHgwQyBBQVQyODcwX0ZNICovCisJeyAwLCAxLCAweDAzIH0sCS8qIDB4MEQgQUFUMjg3MF9GUyAqLworCXsgMCwgMSwgMHgxMCB9LAkvKiAweDBFIEFBVDI4NzBfQUxTX0NGRzAgKi8KKwl7IDAsIDEsIDB4MDYgfSwJLyogMHgwRiBBQVQyODcwX0FMU19DRkcxICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MTAgQUFUMjg3MF9BTFNfQ0ZHMiAqLworCXsgMSwgMCwgMHgwMCB9LAkvKiAweDExIEFBVDI4NzBfQU1CICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MTIgQUFUMjg3MF9BTFMwICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MTMgQUFUMjg3MF9BTFMxICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MTQgQUFUMjg3MF9BTFMyICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MTUgQUFUMjg3MF9BTFMzICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MTYgQUFUMjg3MF9BTFM0ICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MTcgQUFUMjg3MF9BTFM1ICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MTggQUFUMjg3MF9BTFM2ICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MTkgQUFUMjg3MF9BTFM3ICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MUEgQUFUMjg3MF9BTFM4ICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MUIgQUFUMjg3MF9BTFM5ICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MUMgQUFUMjg3MF9BTFNBICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MUQgQUFUMjg3MF9BTFNCICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MUUgQUFUMjg3MF9BTFNDICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MUYgQUFUMjg3MF9BTFNEICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MjAgQUFUMjg3MF9BTFNFICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MjEgQUFUMjg3MF9BTFNGICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MjIgQUFUMjg3MF9TVUJfU0VUICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MjMgQUFUMjg3MF9TVUJfQ1RSTCAqLworCXsgMCwgMSwgMHgwMCB9LAkvKiAweDI0IEFBVDI4NzBfTERPX0FCICovCisJeyAwLCAxLCAweDAwIH0sCS8qIDB4MjUgQUFUMjg3MF9MRE9fQ0QgKi8KKwl7IDAsIDEsIDB4MDAgfSwJLyogMHgyNiBBQVQyODcwX0xET19FTiAqLworfTsKKworc3RhdGljIHN0cnVjdCBtZmRfY2VsbCBhYXQyODcwX2RldnNbXSA9IHsKKwl7CisJCS5uYW1lID0gImFhdDI4NzAtYmFja2xpZ2h0IiwKKwkJLmlkID0gQUFUMjg3MF9JRF9CTCwKKwkJLnBkYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGFhdDI4NzBfYmxfcGxhdGZvcm1fZGF0YSksCisJfSwKKwl7CisJCS5uYW1lID0gImFhdDI4NzAtcmVndWxhdG9yIiwKKwkJLmlkID0gQUFUMjg3MF9JRF9MRE9BLAorCQkucGRhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSksCisJfSwKKwl7CisJCS5uYW1lID0gImFhdDI4NzAtcmVndWxhdG9yIiwKKwkJLmlkID0gQUFUMjg3MF9JRF9MRE9CLAorCQkucGRhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSksCisJfSwKKwl7CisJCS5uYW1lID0gImFhdDI4NzAtcmVndWxhdG9yIiwKKwkJLmlkID0gQUFUMjg3MF9JRF9MRE9DLAorCQkucGRhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSksCisJfSwKKwl7CisJCS5uYW1lID0gImFhdDI4NzAtcmVndWxhdG9yIiwKKwkJLmlkID0gQUFUMjg3MF9JRF9MRE9ELAorCQkucGRhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSksCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19hYXQyODcwX3JlYWQoc3RydWN0IGFhdDI4NzBfZGF0YSAqYWF0Mjg3MCwgdTggYWRkciwgdTggKnZhbCkKK3sKKwlpbnQgcmV0OworCisJaWYgKGFkZHIgPj0gQUFUMjg3MF9SRUdfTlVNKSB7CisJCWRldl9lcnIoYWF0Mjg3MC0+ZGV2LCAiSW52YWxpZCBhZGRyZXNzLCAweCUwMnhcbiIsIGFkZHIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWFhdDI4NzAtPnJlZ19jYWNoZVthZGRyXS5yZWFkYWJsZSkgeworCQkqdmFsID0gYWF0Mjg3MC0+cmVnX2NhY2hlW2FkZHJdLnZhbHVlOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSBpMmNfbWFzdGVyX3NlbmQoYWF0Mjg3MC0+Y2xpZW50LCAmYWRkciwgMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJaWYgKHJldCAhPSAxKQorCQlyZXR1cm4gLUVJTzsKKworCXJldCA9IGkyY19tYXN0ZXJfcmVjdihhYXQyODcwLT5jbGllbnQsIHZhbCwgMSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisJaWYgKHJldCAhPSAxKQorCQlyZXR1cm4gLUVJTzsKKworb3V0OgorCWRldl9kYmcoYWF0Mjg3MC0+ZGV2LCAicmVhZDogYWRkcj0weCUwMngsIHZhbD0weCUwMnhcbiIsIGFkZHIsICp2YWwpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fYWF0Mjg3MF93cml0ZShzdHJ1Y3QgYWF0Mjg3MF9kYXRhICphYXQyODcwLCB1OCBhZGRyLCB1OCB2YWwpCit7CisJdTggbXNnWzJdOworCWludCByZXQ7CisKKwlpZiAoYWRkciA+PSBBQVQyODcwX1JFR19OVU0pIHsKKwkJZGV2X2VycihhYXQyODcwLT5kZXYsICJJbnZhbGlkIGFkZHJlc3MsIDB4JTAyeFxuIiwgYWRkcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghYWF0Mjg3MC0+cmVnX2NhY2hlW2FkZHJdLndyaXRlYWJsZSkgeworCQlkZXZfZXJyKGFhdDI4NzAtPmRldiwgIkFkZHJlc3MgMHglMDJ4IGlzIG5vdCB3cml0ZWFibGVcbiIsCisJCQlhZGRyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXNnWzBdID0gYWRkcjsKKwltc2dbMV0gPSB2YWw7CisJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGFhdDI4NzAtPmNsaWVudCwgbXNnLCAyKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAocmV0ICE9IDIpCisJCXJldHVybiAtRUlPOworCisJYWF0Mjg3MC0+cmVnX2NhY2hlW2FkZHJdLnZhbHVlID0gdmFsOworCisJZGV2X2RiZyhhYXQyODcwLT5kZXYsICJ3cml0ZTogYWRkcj0weCUwMngsIHZhbD0weCUwMnhcbiIsIGFkZHIsIHZhbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWF0Mjg3MF9yZWFkKHN0cnVjdCBhYXQyODcwX2RhdGEgKmFhdDI4NzAsIHU4IGFkZHIsIHU4ICp2YWwpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmFhdDI4NzAtPmlvX2xvY2spOworCXJldCA9IF9fYWF0Mjg3MF9yZWFkKGFhdDI4NzAsIGFkZHIsIHZhbCk7CisJbXV0ZXhfdW5sb2NrKCZhYXQyODcwLT5pb19sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWF0Mjg3MF93cml0ZShzdHJ1Y3QgYWF0Mjg3MF9kYXRhICphYXQyODcwLCB1OCBhZGRyLCB1OCB2YWwpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmFhdDI4NzAtPmlvX2xvY2spOworCXJldCA9IF9fYWF0Mjg3MF93cml0ZShhYXQyODcwLCBhZGRyLCB2YWwpOworCW11dGV4X3VubG9jaygmYWF0Mjg3MC0+aW9fbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGFhdDI4NzBfdXBkYXRlKHN0cnVjdCBhYXQyODcwX2RhdGEgKmFhdDI4NzAsIHU4IGFkZHIsIHU4IG1hc2ssCisJCQkgIHU4IHZhbCkKK3sKKwlpbnQgY2hhbmdlOworCXU4IG9sZF92YWwsIG5ld192YWw7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJmFhdDI4NzAtPmlvX2xvY2spOworCisJcmV0ID0gX19hYXQyODcwX3JlYWQoYWF0Mjg3MCwgYWRkciwgJm9sZF92YWwpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3VubG9jazsKKworCW5ld192YWwgPSAob2xkX3ZhbCAmIH5tYXNrKSB8ICh2YWwgJiBtYXNrKTsKKwljaGFuZ2UgPSBvbGRfdmFsICE9IG5ld192YWw7CisJaWYgKGNoYW5nZSkKKwkJcmV0ID0gX19hYXQyODcwX3dyaXRlKGFhdDI4NzAsIGFkZHIsIG5ld192YWwpOworCitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmYWF0Mjg3MC0+aW9fbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWF0Mjg3MF9lbmFibGUoc3RydWN0IGFhdDI4NzBfZGF0YSAqYWF0Mjg3MCkKK3sKKwlpZiAoYWF0Mjg3MC0+ZW5fcGluID49IDApCisJCWdwaW9fc2V0X3ZhbHVlKGFhdDI4NzAtPmVuX3BpbiwgMSk7CisKKwlhYXQyODcwLT5pc19lbmFibGUgPSAxOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWF0Mjg3MF9kaXNhYmxlKHN0cnVjdCBhYXQyODcwX2RhdGEgKmFhdDI4NzApCit7CisJaWYgKGFhdDI4NzAtPmVuX3BpbiA+PSAwKQorCQlncGlvX3NldF92YWx1ZShhYXQyODcwLT5lbl9waW4sIDApOworCisJYWF0Mjg3MC0+aXNfZW5hYmxlID0gMDsKK30KKworI2lmZGVmIENPTkZJR19ERUJVR19GUworc3RhdGljIHNzaXplX3QgYWF0Mjg3MF9kdW1wX3JlZyhzdHJ1Y3QgYWF0Mjg3MF9kYXRhICphYXQyODcwLCBjaGFyICpidWYpCit7CisJdTggYWRkciwgdmFsOworCXNzaXplX3QgY291bnQgPSAwOworCWludCByZXQ7CisKKwljb3VudCArPSBzcHJpbnRmKGJ1ZiwgImFhdDI4NzAgcmVnaXN0ZXJzXG4iKTsKKwlmb3IgKGFkZHIgPSAwOyBhZGRyIDwgQUFUMjg3MF9SRUdfTlVNOyBhZGRyKyspIHsKKwkJY291bnQgKz0gc3ByaW50ZihidWYgKyBjb3VudCwgIjB4JTAyeDogIiwgYWRkcik7CisJCWlmIChjb3VudCA+PSBQQUdFX1NJWkUgLSAxKQorCQkJYnJlYWs7CisKKwkJcmV0ID0gYWF0Mjg3MC0+cmVhZChhYXQyODcwLCBhZGRyLCAmdmFsKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJY291bnQgKz0gc25wcmludGYoYnVmICsgY291bnQsIFBBR0VfU0laRSAtIGNvdW50LAorCQkJCQkgICIweCUwMngiLCB2YWwpOworCQllbHNlCisJCQljb3VudCArPSBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsCisJCQkJCSAgIjxyZWFkIGZhaWw6ICVkPiIsIHJldCk7CisKKwkJaWYgKGNvdW50ID49IFBBR0VfU0laRSAtIDEpCisJCQlicmVhazsKKworCQljb3VudCArPSBzbnByaW50ZihidWYgKyBjb3VudCwgUEFHRV9TSVpFIC0gY291bnQsICJcbiIpOworCQlpZiAoY291bnQgPj0gUEFHRV9TSVpFIC0gMSkKKwkJCWJyZWFrOworCX0KKworCS8qIFRydW5jYXRlIGNvdW50OyBtaW4oKSB3b3VsZCBjYXVzZSBhIHdhcm5pbmcgKi8KKwlpZiAoY291bnQgPj0gUEFHRV9TSVpFKQorCQljb3VudCA9IFBBR0VfU0laRSAtIDE7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgYWF0Mjg3MF9yZWdfb3Blbl9maWxlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QgYWF0Mjg3MF9yZWdfcmVhZF9maWxlKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYWF0Mjg3MF9kYXRhICphYXQyODcwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgKmJ1ZjsKKwlzc2l6ZV90IHJldDsKKworCWJ1ZiA9IGttYWxsb2MoUEFHRV9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBhYXQyODcwX2R1bXBfcmVnKGFhdDI4NzAsIGJ1Zik7CisJaWYgKHJldCA+PSAwKQorCQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcmV0KTsKKworCWtmcmVlKGJ1Zik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBhYXQyODcwX3JlZ193cml0ZV9maWxlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1Ziwgc2l6ZV90IGNvdW50LAorCQkJCSAgICAgIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYWF0Mjg3MF9kYXRhICphYXQyODcwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgYnVmWzMyXTsKKwlpbnQgYnVmX3NpemU7CisJY2hhciAqc3RhcnQgPSBidWY7CisJdW5zaWduZWQgbG9uZyBhZGRyLCB2YWw7CisJaW50IHJldDsKKworCWJ1Zl9zaXplID0gbWluKGNvdW50LCAoc2l6ZW9mKGJ1ZiktMSkpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBidWZfc2l6ZSkpIHsKKwkJZGV2X2VycihhYXQyODcwLT5kZXYsICJGYWlsZWQgdG8gY29weSBmcm9tIHVzZXJcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJYnVmW2J1Zl9zaXplXSA9IDA7CisKKwl3aGlsZSAoKnN0YXJ0ID09ICcgJykKKwkJc3RhcnQrKzsKKworCWFkZHIgPSBzaW1wbGVfc3RydG91bChzdGFydCwgJnN0YXJ0LCAxNik7CisJaWYgKGFkZHIgPj0gQUFUMjg3MF9SRUdfTlVNKSB7CisJCWRldl9lcnIoYWF0Mjg3MC0+ZGV2LCAiSW52YWxpZCBhZGRyZXNzLCAweCVseFxuIiwgYWRkcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXdoaWxlICgqc3RhcnQgPT0gJyAnKQorCQlzdGFydCsrOworCisJaWYgKHN0cmljdF9zdHJ0b3VsKHN0YXJ0LCAxNiwgJnZhbCkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0ID0gYWF0Mjg3MC0+d3JpdGUoYWF0Mjg3MCwgKHU4KWFkZHIsICh1OCl2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gYnVmX3NpemU7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFhdDI4NzBfcmVnX2ZvcHMgPSB7CisJLm9wZW4gPSBhYXQyODcwX3JlZ19vcGVuX2ZpbGUsCisJLnJlYWQgPSBhYXQyODcwX3JlZ19yZWFkX2ZpbGUsCisJLndyaXRlID0gYWF0Mjg3MF9yZWdfd3JpdGVfZmlsZSwKK307CisKK3N0YXRpYyB2b2lkIGFhdDI4NzBfaW5pdF9kZWJ1Z2ZzKHN0cnVjdCBhYXQyODcwX2RhdGEgKmFhdDI4NzApCit7CisJYWF0Mjg3MC0+ZGVudHJ5X3Jvb3QgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImFhdDI4NzAiLCBOVUxMKTsKKwlpZiAoIWFhdDI4NzAtPmRlbnRyeV9yb290KSB7CisJCWRldl93YXJuKGFhdDI4NzAtPmRldiwKKwkJCSAiRmFpbGVkIHRvIGNyZWF0ZSBkZWJ1Z2ZzIHJvb3QgZGlyZWN0b3J5XG4iKTsKKwkJcmV0dXJuOworCX0KKworCWFhdDI4NzAtPmRlbnRyeV9yZWcgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyZWdzIiwgMDY0NCwKKwkJCQkJCSAgYWF0Mjg3MC0+ZGVudHJ5X3Jvb3QsCisJCQkJCQkgIGFhdDI4NzAsICZhYXQyODcwX3JlZ19mb3BzKTsKKwlpZiAoIWFhdDI4NzAtPmRlbnRyeV9yZWcpCisJCWRldl93YXJuKGFhdDI4NzAtPmRldiwKKwkJCSAiRmFpbGVkIHRvIGNyZWF0ZSBkZWJ1Z2ZzIHJlZ2lzdGVyIGZpbGVcbiIpOworfQorCitzdGF0aWMgdm9pZCBhYXQyODcwX3VuaW5pdF9kZWJ1Z2ZzKHN0cnVjdCBhYXQyODcwX2RhdGEgKmFhdDI4NzApCit7CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGFhdDI4NzAtPmRlbnRyeV9yb290KTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgYWF0Mjg3MF9pbml0X2RlYnVnZnMoc3RydWN0IGFhdDI4NzBfZGF0YSAqYWF0Mjg3MCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFhdDI4NzBfdW5pbml0X2RlYnVnZnMoc3RydWN0IGFhdDI4NzBfZGF0YSAqYWF0Mjg3MCkKK3sKK30KKyNlbmRpZiAvKiBDT05GSUdfREVCVUdfRlMgKi8KKworc3RhdGljIGludCBhYXQyODcwX2kyY19wcm9iZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJICAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IGFhdDI4NzBfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBjbGllbnQtPmRldi5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBhYXQyODcwX2RhdGEgKmFhdDI4NzA7CisJaW50IGksIGo7CisJaW50IHJldCA9IDA7CisKKwlhYXQyODcwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFhdDI4NzBfZGF0YSksIEdGUF9LRVJORUwpOworCWlmICghYWF0Mjg3MCkgeworCQlkZXZfZXJyKCZjbGllbnQtPmRldiwKKwkJCSJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBhYXQyODcwXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJYWF0Mjg3MC0+ZGV2ID0gJmNsaWVudC0+ZGV2OworCWRldl9zZXRfZHJ2ZGF0YShhYXQyODcwLT5kZXYsIGFhdDI4NzApOworCisJYWF0Mjg3MC0+Y2xpZW50ID0gY2xpZW50OworCWkyY19zZXRfY2xpZW50ZGF0YShjbGllbnQsIGFhdDI4NzApOworCisJYWF0Mjg3MC0+cmVnX2NhY2hlID0gYWF0Mjg3MF9yZWdzOworCisJaWYgKHBkYXRhLT5lbl9waW4gPCAwKQorCQlhYXQyODcwLT5lbl9waW4gPSAtMTsKKwllbHNlCisJCWFhdDI4NzAtPmVuX3BpbiA9IHBkYXRhLT5lbl9waW47CisKKwlhYXQyODcwLT5pbml0ID0gcGRhdGEtPmluaXQ7CisJYWF0Mjg3MC0+dW5pbml0ID0gcGRhdGEtPnVuaW5pdDsKKwlhYXQyODcwLT5yZWFkID0gYWF0Mjg3MF9yZWFkOworCWFhdDI4NzAtPndyaXRlID0gYWF0Mjg3MF93cml0ZTsKKwlhYXQyODcwLT51cGRhdGUgPSBhYXQyODcwX3VwZGF0ZTsKKworCW11dGV4X2luaXQoJmFhdDI4NzAtPmlvX2xvY2spOworCisJaWYgKGFhdDI4NzAtPmluaXQpCisJCWFhdDI4NzAtPmluaXQoYWF0Mjg3MCk7CisKKwlpZiAoYWF0Mjg3MC0+ZW5fcGluID49IDApIHsKKwkJcmV0ID0gZ3Bpb19yZXF1ZXN0KGFhdDI4NzAtPmVuX3BpbiwgImFhdDI4NzAtZW4iKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIoJmNsaWVudC0+ZGV2LAorCQkJCSJGYWlsZWQgdG8gcmVxdWVzdCBHUElPICVkXG4iLCBhYXQyODcwLT5lbl9waW4pOworCQkJZ290byBvdXRfa2ZyZWU7CisJCX0KKwkJZ3Bpb19kaXJlY3Rpb25fb3V0cHV0KGFhdDI4NzAtPmVuX3BpbiwgMSk7CisJfQorCisJYWF0Mjg3MF9lbmFibGUoYWF0Mjg3MCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGRhdGEtPm51bV9zdWJkZXZzOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUoYWF0Mjg3MF9kZXZzKTsgaisrKSB7CisJCQlpZiAoKHBkYXRhLT5zdWJkZXZzW2ldLmlkID09IGFhdDI4NzBfZGV2c1tqXS5pZCkgJiYKKwkJCQkJIXN0cmNtcChwZGF0YS0+c3ViZGV2c1tpXS5uYW1lLAorCQkJCQkJYWF0Mjg3MF9kZXZzW2pdLm5hbWUpKSB7CisJCQkJYWF0Mjg3MF9kZXZzW2pdLnBsYXRmb3JtX2RhdGEgPQorCQkJCQlwZGF0YS0+c3ViZGV2c1tpXS5wbGF0Zm9ybV9kYXRhOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcmV0ID0gbWZkX2FkZF9kZXZpY2VzKGFhdDI4NzAtPmRldiwgMCwgYWF0Mjg3MF9kZXZzLAorCQkJICAgICAgQVJSQVlfU0laRShhYXQyODcwX2RldnMpLCBOVUxMLCAwKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycihhYXQyODcwLT5kZXYsICJGYWlsZWQgdG8gYWRkIHN1YmRldjogJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0X2Rpc2FibGU7CisJfQorCisJYWF0Mjg3MF9pbml0X2RlYnVnZnMoYWF0Mjg3MCk7CisKKwlyZXR1cm4gMDsKKworb3V0X2Rpc2FibGU6CisJYWF0Mjg3MF9kaXNhYmxlKGFhdDI4NzApOworCWlmIChhYXQyODcwLT5lbl9waW4gPj0gMCkKKwkJZ3Bpb19mcmVlKGFhdDI4NzAtPmVuX3Bpbik7CitvdXRfa2ZyZWU6CisJa2ZyZWUoYWF0Mjg3MCk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhYXQyODcwX2kyY19yZW1vdmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlzdHJ1Y3QgYWF0Mjg3MF9kYXRhICphYXQyODcwID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CisKKwlhYXQyODcwX3VuaW5pdF9kZWJ1Z2ZzKGFhdDI4NzApOworCisJbWZkX3JlbW92ZV9kZXZpY2VzKGFhdDI4NzAtPmRldik7CisJYWF0Mjg3MF9kaXNhYmxlKGFhdDI4NzApOworCWlmIChhYXQyODcwLT5lbl9waW4gPj0gMCkKKwkJZ3Bpb19mcmVlKGFhdDI4NzAtPmVuX3Bpbik7CisJaWYgKGFhdDI4NzAtPnVuaW5pdCkKKwkJYWF0Mjg3MC0+dW5pbml0KGFhdDI4NzApOworCWtmcmVlKGFhdDI4NzApOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgYWF0Mjg3MF9pMmNfc3VzcGVuZChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IGFhdDI4NzBfZGF0YSAqYWF0Mjg3MCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCisJYWF0Mjg3MF9kaXNhYmxlKGFhdDI4NzApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWF0Mjg3MF9pMmNfcmVzdW1lKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQpCit7CisJc3RydWN0IGFhdDI4NzBfZGF0YSAqYWF0Mjg3MCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOworCXN0cnVjdCBhYXQyODcwX3JlZ2lzdGVyICpyZWcgPSBOVUxMOworCWludCBpOworCisJYWF0Mjg3MF9lbmFibGUoYWF0Mjg3MCk7CisKKwkvKiByZXN0b3JlIHJlZ2lzdGVycyAqLworCWZvciAoaSA9IDA7IGkgPCBBQVQyODcwX1JFR19OVU07IGkrKykgeworCQlyZWcgPSAmYWF0Mjg3MC0+cmVnX2NhY2hlW2ldOworCQlpZiAocmVnLT53cml0ZWFibGUpCisJCQlhYXQyODcwLT53cml0ZShhYXQyODcwLCBpLCByZWctPnZhbHVlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCisjZGVmaW5lIGFhdDI4NzBfaTJjX3N1c3BlbmQJTlVMTAorI2RlZmluZSBhYXQyODcwX2kyY19yZXN1bWUJTlVMTAorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCitzdGF0aWMgc3RydWN0IGkyY19kZXZpY2VfaWQgYWF0Mjg3MF9pMmNfaWRfdGFibGVbXSA9IHsKKwl7ICJhYXQyODcwIiwgMCB9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaTJjLCBhYXQyODcwX2kyY19pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2RyaXZlciBhYXQyODcwX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAiYWF0Mjg3MCIsCisJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCX0sCisJLnByb2JlCQk9IGFhdDI4NzBfaTJjX3Byb2JlLAorCS5yZW1vdmUJCT0gYWF0Mjg3MF9pMmNfcmVtb3ZlLAorCS5zdXNwZW5kCT0gYWF0Mjg3MF9pMmNfc3VzcGVuZCwKKwkucmVzdW1lCQk9IGFhdDI4NzBfaTJjX3Jlc3VtZSwKKwkuaWRfdGFibGUJPSBhYXQyODcwX2kyY19pZF90YWJsZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFhdDI4NzBfaW5pdCh2b2lkKQoreworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmYWF0Mjg3MF9pMmNfZHJpdmVyKTsKK30KK3N1YnN5c19pbml0Y2FsbChhYXQyODcwX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgYWF0Mjg3MF9leGl0KHZvaWQpCit7CisJaTJjX2RlbF9kcml2ZXIoJmFhdDI4NzBfaTJjX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhYXQyODcwX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkNvcmUgc3VwcG9ydCBmb3IgdGhlIEFuYWxvZ2ljVGVjaCBBQVQyODcwIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJKaW4gUGFyayA8amlueW91bmdwQG52aWRpYS5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9hYjM1NTAtY29yZS5jIGIvZHJpdmVycy9tZmQvYWIzNTUwLWNvcmUuYwppbmRleCAzZDdkY2U2Li41NmJhMTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9hYjM1NTAtY29yZS5jCisrKyBiL2RyaXZlcnMvbWZkL2FiMzU1MC1jb3JlLmMKQEAgLTg3OSwyMCArODc5LDEzIEBACiAJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IGFiMzU1MCAqYWIgPSAoKHN0cnVjdCBzZXFfZmlsZSAqKShmaWxlLT5wcml2YXRlX2RhdGEpKS0+cHJpdmF0ZTsKLQljaGFyIGJ1ZlszMl07Ci0JaW50IGJ1Zl9zaXplOwogCXVuc2lnbmVkIGxvbmcgdXNlcl9iYW5rOwogCWludCBlcnI7CiAKIAkvKiBHZXQgdXNlcnNwYWNlIHN0cmluZyBhbmQgYXNzdXJlIHRlcm1pbmF0aW9uICovCi0JYnVmX3NpemUgPSBtaW4oY291bnQsIChzaXplb2YoYnVmKSAtIDEpKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlidWZbYnVmX3NpemVdID0gMDsKLQotCWVyciA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJnVzZXJfYmFuayk7CisJZXJyID0ga3N0cnRvdWxfZnJvbV91c2VyKHVzZXJfYnVmLCBjb3VudCwgMCwgJnVzZXJfYmFuayk7CiAJaWYgKGVycikKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBlcnI7CiAKIAlpZiAodXNlcl9iYW5rID49IEFCMzU1MF9OVU1fQkFOS1MpIHsKIAkJZGV2X2VycigmYWItPmkyY19jbGllbnRbMF0tPmRldiwKQEAgLTkwMiw3ICs4OTUsNyBAQAogCiAJYWItPmRlYnVnX2JhbmsgPSB1c2VyX2Jhbms7CiAKLQlyZXR1cm4gYnVmX3NpemU7CisJcmV0dXJuIGNvdW50OwogfQogCiBzdGF0aWMgaW50IGFiMzU1MF9hZGRyZXNzX3ByaW50KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqcCkKQEAgLTkyMywyNyArOTE2LDIxIEBACiAJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IGFiMzU1MCAqYWIgPSAoKHN0cnVjdCBzZXFfZmlsZSAqKShmaWxlLT5wcml2YXRlX2RhdGEpKS0+cHJpdmF0ZTsKLQljaGFyIGJ1ZlszMl07Ci0JaW50IGJ1Zl9zaXplOwogCXVuc2lnbmVkIGxvbmcgdXNlcl9hZGRyZXNzOwogCWludCBlcnI7CiAKIAkvKiBHZXQgdXNlcnNwYWNlIHN0cmluZyBhbmQgYXNzdXJlIHRlcm1pbmF0aW9uICovCi0JYnVmX3NpemUgPSBtaW4oY291bnQsIChzaXplb2YoYnVmKSAtIDEpKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlidWZbYnVmX3NpemVdID0gMDsKLQotCWVyciA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJnVzZXJfYWRkcmVzcyk7CisJZXJyID0ga3N0cnRvdWxfZnJvbV91c2VyKHVzZXJfYnVmLCBjb3VudCwgMCwgJnVzZXJfYWRkcmVzcyk7CiAJaWYgKGVycikKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBlcnI7CisKIAlpZiAodXNlcl9hZGRyZXNzID4gMHhmZikgewogCQlkZXZfZXJyKCZhYi0+aTJjX2NsaWVudFswXS0+ZGV2LAogCQkJImRlYnVnZnMgZXJyb3IgaW5wdXQgPiAweGZmXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWFiLT5kZWJ1Z19hZGRyZXNzID0gdXNlcl9hZGRyZXNzOwotCXJldHVybiBidWZfc2l6ZTsKKwlyZXR1cm4gY291bnQ7CiB9CiAKIHN0YXRpYyBpbnQgYWIzNTUwX3ZhbF9wcmludChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnApCkBAIC05NzEsMjEgKzk1OCwxNSBAQAogCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBhYjM1NTAgKmFiID0gKChzdHJ1Y3Qgc2VxX2ZpbGUgKikoZmlsZS0+cHJpdmF0ZV9kYXRhKSktPnByaXZhdGU7Ci0JY2hhciBidWZbMzJdOwotCWludCBidWZfc2l6ZTsKIAl1bnNpZ25lZCBsb25nIHVzZXJfdmFsOwogCWludCBlcnI7CiAJdTggcmVndmFsdWU7CiAKIAkvKiBHZXQgdXNlcnNwYWNlIHN0cmluZyBhbmQgYXNzdXJlIHRlcm1pbmF0aW9uICovCi0JYnVmX3NpemUgPSBtaW4oY291bnQsIChzaXplb2YoYnVmKS0xKSk7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGJ1Zl9zaXplKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JYnVmW2J1Zl9zaXplXSA9IDA7Ci0KLQllcnIgPSBzdHJpY3Rfc3RydG91bChidWYsIDAsICZ1c2VyX3ZhbCk7CisJZXJyID0ga3N0cnRvdWxfZnJvbV91c2VyKHVzZXJfYnVmLCBjb3VudCwgMCwgJnVzZXJfdmFsKTsKIAlpZiAoZXJyKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIGVycjsKKwogCWlmICh1c2VyX3ZhbCA+IDB4ZmYpIHsKIAkJZGV2X2VycigmYWItPmkyY19jbGllbnRbMF0tPmRldiwKIAkJCSJkZWJ1Z2ZzIGVycm9yIGlucHV0ID4gMHhmZlxuIik7CkBAIC0xMDAyLDcgKzk4Myw3IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gYnVmX3NpemU7CisJcmV0dXJuIGNvdW50OwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhYjM1NTBfYmFua19mb3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvYWI4NTAwLWNvcmUuYyBiL2RyaXZlcnMvbWZkL2FiODUwMC1jb3JlLmMKaW5kZXggZmMwYzFhZi4uMzg3NzA1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvYWI4NTAwLWNvcmUuYworKysgYi9kcml2ZXJzL21mZC9hYjg1MDAtY29yZS5jCkBAIC0zNjMsNyArMzYzLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYWI4NTAwX2dwaW9fcmVzb3VyY2VzW10gPSB7CitzdGF0aWMgc3RydWN0IHJlc291cmNlIF9fZGV2aW5pdGRhdGEgYWI4NTAwX2dwaW9fcmVzb3VyY2VzW10gPSB7CiAJewogCQkubmFtZQk9ICJHUElPX0lOVDYiLAogCQkuc3RhcnQJPSBBQjg1MDBfSU5UX0dQSU82UiwKQEAgLTM3Miw3ICszNzIsNyBAQAogCX0KIH07CiAKLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgYWI4NTAwX2dwYWRjX3Jlc291cmNlc1tdID0geworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBfX2RldmluaXRkYXRhIGFiODUwMF9ncGFkY19yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5uYW1lCT0gIkhXX0NPTlZfRU5EIiwKIAkJLnN0YXJ0CT0gQUI4NTAwX0lOVF9HUF9IV19BRENfQ09OVl9FTkQsCkBAIC0zODcsNyArMzg3LDcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhYjg1MDBfcnRjX3Jlc291cmNlc1tdID0geworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBfX2RldmluaXRkYXRhIGFiODUwMF9ydGNfcmVzb3VyY2VzW10gPSB7CiAJewogCQkubmFtZQk9ICI2MFMiLAogCQkuc3RhcnQJPSBBQjg1MDBfSU5UX1JUQ182MFMsCkBAIC00MDIsNyArNDAyLDcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhYjg1MDBfcG93ZXJvbmtleV9kYl9yZXNvdXJjZXNbXSA9IHsKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgX19kZXZpbml0ZGF0YSBhYjg1MDBfcG93ZXJvbmtleV9kYl9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5uYW1lCT0gIk9OS0VZX0RCRiIsCiAJCS5zdGFydAk9IEFCODUwMF9JTlRfUE9OX0tFWTFEQl9GLApAQCAtNDE3LDIwICs0MTcsNDcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhYjg1MDBfYm1fcmVzb3VyY2VzW10gPSB7CitzdGF0aWMgc3RydWN0IHJlc291cmNlIF9fZGV2aW5pdGRhdGEgYWI4NTAwX2F2X2FjY19kZXRlY3RfcmVzb3VyY2VzW10gPSB7CiAJewotCQkubmFtZSA9ICJNQUlOX0VYVF9DSF9OT1RfT0siLAotCQkuc3RhcnQgPSBBQjg1MDBfSU5UX01BSU5fRVhUX0NIX05PVF9PSywKLQkJLmVuZCA9IEFCODUwMF9JTlRfTUFJTl9FWFRfQ0hfTk9UX09LLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwkgICAgICAgLm5hbWUgPSAiQUNDX0RFVEVDVF8xREJfRiIsCisJICAgICAgIC5zdGFydCA9IEFCODUwMF9JTlRfQUNDX0RFVEVDVF8xREJfRiwKKwkgICAgICAgLmVuZCA9IEFCODUwMF9JTlRfQUNDX0RFVEVDVF8xREJfRiwKKwkgICAgICAgLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7Ci0JCS5uYW1lID0gIkJBVFRfT1ZWIiwKLQkJLnN0YXJ0ID0gQUI4NTAwX0lOVF9CQVRUX09WViwKLQkJLmVuZCA9IEFCODUwMF9JTlRfQkFUVF9PVlYsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCSAgICAgICAubmFtZSA9ICJBQ0NfREVURUNUXzFEQl9SIiwKKwkgICAgICAgLnN0YXJ0ID0gQUI4NTAwX0lOVF9BQ0NfREVURUNUXzFEQl9SLAorCSAgICAgICAuZW5kID0gQUI4NTAwX0lOVF9BQ0NfREVURUNUXzFEQl9SLAorCSAgICAgICAuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKKwkgICAgICAgLm5hbWUgPSAiQUNDX0RFVEVDVF8yMURCX0YiLAorCSAgICAgICAuc3RhcnQgPSBBQjg1MDBfSU5UX0FDQ19ERVRFQ1RfMjFEQl9GLAorCSAgICAgICAuZW5kID0gQUI4NTAwX0lOVF9BQ0NfREVURUNUXzIxREJfRiwKKwkgICAgICAgLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJICAgICAgIC5uYW1lID0gIkFDQ19ERVRFQ1RfMjFEQl9SIiwKKwkgICAgICAgLnN0YXJ0ID0gQUI4NTAwX0lOVF9BQ0NfREVURUNUXzIxREJfUiwKKwkgICAgICAgLmVuZCA9IEFCODUwMF9JTlRfQUNDX0RFVEVDVF8yMURCX1IsCisJICAgICAgIC5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCSAgICAgICAubmFtZSA9ICJBQ0NfREVURUNUXzIyREJfRiIsCisJICAgICAgIC5zdGFydCA9IEFCODUwMF9JTlRfQUNDX0RFVEVDVF8yMkRCX0YsCisJICAgICAgIC5lbmQgPSBBQjg1MDBfSU5UX0FDQ19ERVRFQ1RfMjJEQl9GLAorCSAgICAgICAuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkgICAgICAgLm5hbWUgPSAiQUNDX0RFVEVDVF8yMkRCX1IiLAorCSAgICAgICAuc3RhcnQgPSBBQjg1MDBfSU5UX0FDQ19ERVRFQ1RfMjJEQl9SLAorCSAgICAgICAuZW5kID0gQUI4NTAwX0lOVF9BQ0NfREVURUNUXzIyREJfUiwKKwkgICAgICAgLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgX19kZXZpbml0ZGF0YSBhYjg1MDBfY2hhcmdlcl9yZXNvdXJjZXNbXSA9IHsKKwl7CiAJCS5uYW1lID0gIk1BSU5fQ0hfVU5QTFVHX0RFVCIsCiAJCS5zdGFydCA9IEFCODUwMF9JTlRfTUFJTl9DSF9VTlBMVUdfREVULAogCQkuZW5kID0gQUI4NTAwX0lOVF9NQUlOX0NIX1VOUExVR19ERVQsCkBAIC00NDMsMjcgKzQ3MCwyNyBAQAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKLQkJLm5hbWUgPSAiVkJVU19ERVRfRiIsCi0JCS5zdGFydCA9IEFCODUwMF9JTlRfVkJVU19ERVRfRiwKLQkJLmVuZCA9IEFCODUwMF9JTlRfVkJVU19ERVRfRiwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLQl7CiAJCS5uYW1lID0gIlZCVVNfREVUX1IiLAogCQkuc3RhcnQgPSBBQjg1MDBfSU5UX1ZCVVNfREVUX1IsCiAJCS5lbmQgPSBBQjg1MDBfSU5UX1ZCVVNfREVUX1IsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewotCQkubmFtZSA9ICJCQVRfQ1RSTF9JTkRCIiwKLQkJLnN0YXJ0ID0gQUI4NTAwX0lOVF9CQVRfQ1RSTF9JTkRCLAotCQkuZW5kID0gQUI4NTAwX0lOVF9CQVRfQ1RSTF9JTkRCLAorCQkubmFtZSA9ICJWQlVTX0RFVF9GIiwKKwkJLnN0YXJ0ID0gQUI4NTAwX0lOVF9WQlVTX0RFVF9GLAorCQkuZW5kID0gQUI4NTAwX0lOVF9WQlVTX0RFVF9GLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKLQkJLm5hbWUgPSAiQ0hfV0RfRVhQIiwKLQkJLnN0YXJ0ID0gQUI4NTAwX0lOVF9DSF9XRF9FWFAsCi0JCS5lbmQgPSBBQjg1MDBfSU5UX0NIX1dEX0VYUCwKKwkJLm5hbWUgPSAiVVNCX0xJTktfU1RBVFVTIiwKKwkJLnN0YXJ0ID0gQUI4NTAwX0lOVF9VU0JfTElOS19TVEFUVVMsCisJCS5lbmQgPSBBQjg1MDBfSU5UX1VTQl9MSU5LX1NUQVRVUywKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5uYW1lID0gIlVTQl9DSEFSR0VfREVUX0RPTkUiLAorCQkuc3RhcnQgPSBBQjg1MDBfSU5UX1VTQl9DSEdfREVUX0RPTkUsCisJCS5lbmQgPSBBQjg1MDBfSU5UX1VTQl9DSEdfREVUX0RPTkUsCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewpAQCAtNDczLDIxICs1MDAsNjAgQEAKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7Ci0JCS5uYW1lID0gIk5DT05WX0FDQ1UiLAotCQkuc3RhcnQgPSBBQjg1MDBfSU5UX0NDTl9DT05WX0FDQywKLQkJLmVuZCA9IEFCODUwMF9JTlRfQ0NOX0NPTlZfQUNDLAorCQkubmFtZSA9ICJVU0JfQ0hfVEhfUFJPVF9SIiwKKwkJLnN0YXJ0ID0gQUI4NTAwX0lOVF9VU0JfQ0hfVEhfUFJPVF9SLAorCQkuZW5kID0gQUI4NTAwX0lOVF9VU0JfQ0hfVEhfUFJPVF9SLAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKLQkJLm5hbWUgPSAiTE9XX0JBVF9GIiwKLQkJLnN0YXJ0ID0gQUI4NTAwX0lOVF9MT1dfQkFUX0YsCi0JCS5lbmQgPSBBQjg1MDBfSU5UX0xPV19CQVRfRiwKKwkJLm5hbWUgPSAiVVNCX0NIX1RIX1BST1RfRiIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfVVNCX0NIX1RIX1BST1RfRiwKKwkJLmVuZCA9IEFCODUwMF9JTlRfVVNCX0NIX1RIX1BST1RfRiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7Ci0JCS5uYW1lID0gIkxPV19CQVRfUiIsCi0JCS5zdGFydCA9IEFCODUwMF9JTlRfTE9XX0JBVF9SLAotCQkuZW5kID0gQUI4NTAwX0lOVF9MT1dfQkFUX1IsCisJCS5uYW1lID0gIk1BSU5fRVhUX0NIX05PVF9PSyIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfTUFJTl9FWFRfQ0hfTk9UX09LLAorCQkuZW5kID0gQUI4NTAwX0lOVF9NQUlOX0VYVF9DSF9OT1RfT0ssCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkubmFtZSA9ICJNQUlOX0NIX1RIX1BST1RfUiIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfTUFJTl9DSF9USF9QUk9UX1IsCisJCS5lbmQgPSBBQjg1MDBfSU5UX01BSU5fQ0hfVEhfUFJPVF9SLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTUFJTl9DSF9USF9QUk9UX0YiLAorCQkuc3RhcnQgPSBBQjg1MDBfSU5UX01BSU5fQ0hfVEhfUFJPVF9GLAorCQkuZW5kID0gQUI4NTAwX0lOVF9NQUlOX0NIX1RIX1BST1RfRiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5uYW1lID0gIlVTQl9DSEFSR0VSX05PVF9PS1IiLAorCQkuc3RhcnQgPSBBQjg1MDBfSU5UX1VTQl9DSEFSR0VSX05PVF9PSywKKwkJLmVuZCA9IEFCODUwMF9JTlRfVVNCX0NIQVJHRVJfTk9UX09LLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiVVNCX0NIQVJHRVJfTk9UX09LRiIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfVVNCX0NIQVJHRVJfTk9UX09LRiwKKwkJLmVuZCA9IEFCODUwMF9JTlRfVVNCX0NIQVJHRVJfTk9UX09LRiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5uYW1lID0gIkNIX1dEX0VYUCIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfQ0hfV0RfRVhQLAorCQkuZW5kID0gQUI4NTAwX0lOVF9DSF9XRF9FWFAsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIF9fZGV2aW5pdGRhdGEgYWI4NTAwX2J0ZW1wX3Jlc291cmNlc1tdID0geworCXsKKwkJLm5hbWUgPSAiQkFUX0NUUkxfSU5EQiIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfQkFUX0NUUkxfSU5EQiwKKwkJLmVuZCA9IEFCODUwMF9JTlRfQkFUX0NUUkxfSU5EQiwKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKIAl7CkBAIC01MDMsMzggKzU2OSw1NSBAQAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogCXsKLQkJLm5hbWUgPSAiVVNCX0NIQVJHRVJfTk9UX09LUiIsCi0JCS5zdGFydCA9IEFCODUwMF9JTlRfVVNCX0NIQVJHRVJfTk9UX09LLAotCQkuZW5kID0gQUI4NTAwX0lOVF9VU0JfQ0hBUkdFUl9OT1RfT0ssCisJCS5uYW1lID0gIkJURU1QX0xPV19NRURJVU0iLAorCQkuc3RhcnQgPSBBQjg1MDBfSU5UX0JURU1QX0xPV19NRURJVU0sCisJCS5lbmQgPSBBQjg1MDBfSU5UX0JURU1QX0xPV19NRURJVU0sCiAJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAogCX0sCiAJewotCQkubmFtZSA9ICJVU0JfQ0hBUkdFX0RFVF9ET05FIiwKLQkJLnN0YXJ0ID0gQUI4NTAwX0lOVF9VU0JfQ0hHX0RFVF9ET05FLAotCQkuZW5kID0gQUI4NTAwX0lOVF9VU0JfQ0hHX0RFVF9ET05FLAotCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKLQl9LAotCXsKLQkJLm5hbWUgPSAiVVNCX0NIX1RIX1BST1RfUiIsCi0JCS5zdGFydCA9IEFCODUwMF9JTlRfVVNCX0NIX1RIX1BST1RfUiwKLQkJLmVuZCA9IEFCODUwMF9JTlRfVVNCX0NIX1RIX1BST1RfUiwKLQkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCi0JfSwKLQl7Ci0JCS5uYW1lID0gIk1BSU5fQ0hfVEhfUFJPVF9SIiwKLQkJLnN0YXJ0ID0gQUI4NTAwX0lOVF9NQUlOX0NIX1RIX1BST1RfUiwKLQkJLmVuZCA9IEFCODUwMF9JTlRfTUFJTl9DSF9USF9QUk9UX1IsCi0JCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAotCX0sCi0JewotCQkubmFtZSA9ICJVU0JfQ0hBUkdFUl9OT1RfT0tGIiwKLQkJLnN0YXJ0ID0gQUI4NTAwX0lOVF9VU0JfQ0hBUkdFUl9OT1RfT0tGLAotCQkuZW5kID0gQUI4NTAwX0lOVF9VU0JfQ0hBUkdFUl9OT1RfT0tGLAorCQkubmFtZSA9ICJCVEVNUF9NRURJVU1fSElHSCIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfQlRFTVBfTUVESVVNX0hJR0gsCisJCS5lbmQgPSBBQjg1MDBfSU5UX0JURU1QX01FRElVTV9ISUdILAogCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhYjg1MDBfZGVidWdfcmVzb3VyY2VzW10gPSB7CitzdGF0aWMgc3RydWN0IHJlc291cmNlIF9fZGV2aW5pdGRhdGEgYWI4NTAwX2ZnX3Jlc291cmNlc1tdID0geworCXsKKwkJLm5hbWUgPSAiTkNPTlZfQUNDVSIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfQ0NOX0NPTlZfQUNDLAorCQkuZW5kID0gQUI4NTAwX0lOVF9DQ05fQ09OVl9BQ0MsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkubmFtZSA9ICJCQVRUX09WViIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfQkFUVF9PVlYsCisJCS5lbmQgPSBBQjg1MDBfSU5UX0JBVFRfT1ZWLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTE9XX0JBVF9GIiwKKwkJLnN0YXJ0ID0gQUI4NTAwX0lOVF9MT1dfQkFUX0YsCisJCS5lbmQgPSBBQjg1MDBfSU5UX0xPV19CQVRfRiwKKwkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCisJfSwKKwl7CisJCS5uYW1lID0gIkxPV19CQVRfUiIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfTE9XX0JBVF9SLAorCQkuZW5kID0gQUI4NTAwX0lOVF9MT1dfQkFUX1IsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCisJeworCQkubmFtZSA9ICJDQ19JTlRfQ0FMSUIiLAorCQkuc3RhcnQgPSBBQjg1MDBfSU5UX0NDX0lOVF9DQUxJQiwKKwkJLmVuZCA9IEFCODUwMF9JTlRfQ0NfSU5UX0NBTElCLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBfX2RldmluaXRkYXRhIGFiODUwMF9jaGFyZ2FsZ19yZXNvdXJjZXNbXSA9IHt9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIF9fZGV2aW5pdGRhdGEgYWI4NTAwX2RlYnVnX3Jlc291cmNlc1tdID0gewogCXsKIAkJLm5hbWUJPSAiSVJRX0ZJUlNUIiwKIAkJLnN0YXJ0CT0gQUI4NTAwX0lOVF9NQUlOX0VYVF9DSF9OT1RfT0ssCkBAIC01NDksNyArNjMyLDcgQEAKIAl9LAogfTsKIAotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBhYjg1MDBfdXNiX3Jlc291cmNlc1tdID0geworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBfX2RldmluaXRkYXRhIGFiODUwMF91c2JfcmVzb3VyY2VzW10gPSB7CiAJewogCQkubmFtZSA9ICJJRF9XQUtFVVBfUiIsCiAJCS5zdGFydCA9IEFCODUwMF9JTlRfSURfV0FLRVVQX1IsCkBAIC01ODAsOSArNjYzLDIxIEBACiAJCS5lbmQgPSBBQjg1MDBfSU5UX1VTQl9MSU5LX1NUQVRVUywKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JUlEsCiAJfSwKKwl7CisJCS5uYW1lID0gIlVTQl9BRFBfUFJPQkVfUExVRyIsCisJCS5zdGFydCA9IEFCODUwMF9JTlRfQURQX1BST0JFX1BMVUcsCisJCS5lbmQgPSBBQjg1MDBfSU5UX0FEUF9QUk9CRV9QTFVHLAorCQkuZmxhZ3MgPSBJT1JFU09VUkNFX0lSUSwKKwl9LAorCXsKKwkJLm5hbWUgPSAiVVNCX0FEUF9QUk9CRV9VTlBMVUciLAorCQkuc3RhcnQgPSBBQjg1MDBfSU5UX0FEUF9QUk9CRV9VTlBMVUcsCisJCS5lbmQgPSBBQjg1MDBfSU5UX0FEUF9QUk9CRV9VTlBMVUcsCisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSVJRLAorCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IHJlc291cmNlIGFiODUwMF90ZW1wX3Jlc291cmNlc1tdID0geworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBfX2RldmluaXRkYXRhIGFiODUwMF90ZW1wX3Jlc291cmNlc1tdID0gewogCXsKIAkJLm5hbWUgID0gIkFCODUwMF9URU1QX1dBUk0iLAogCQkuc3RhcnQgPSBBQjg1MDBfSU5UX1RFTVBfV0FSTSwKQEAgLTU5MSw3ICs2ODYsNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgc3RydWN0IG1mZF9jZWxsIGFiODUwMF9kZXZzW10gPSB7CitzdGF0aWMgc3RydWN0IG1mZF9jZWxsIF9fZGV2aW5pdGRhdGEgYWI4NTAwX2RldnNbXSA9IHsKICNpZmRlZiBDT05GSUdfREVCVUdfRlMKIAl7CiAJCS5uYW1lID0gImFiODUwMC1kZWJ1ZyIsCkBAIC02MjEsMTEgKzcxNiwzMyBAQAogCQkucmVzb3VyY2VzID0gYWI4NTAwX3J0Y19yZXNvdXJjZXMsCiAJfSwKIAl7Ci0JCS5uYW1lID0gImFiODUwMC1ibSIsCi0JCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShhYjg1MDBfYm1fcmVzb3VyY2VzKSwKLQkJLnJlc291cmNlcyA9IGFiODUwMF9ibV9yZXNvdXJjZXMsCisJCS5uYW1lID0gImFiODUwMC1jaGFyZ2VyIiwKKwkJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGFiODUwMF9jaGFyZ2VyX3Jlc291cmNlcyksCisJCS5yZXNvdXJjZXMgPSBhYjg1MDBfY2hhcmdlcl9yZXNvdXJjZXMsCiAJfSwKLQl7IC5uYW1lID0gImFiODUwMC1jb2RlYyIsIH0sCisJeworCQkubmFtZSA9ICJhYjg1MDAtYnRlbXAiLAorCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYWI4NTAwX2J0ZW1wX3Jlc291cmNlcyksCisJCS5yZXNvdXJjZXMgPSBhYjg1MDBfYnRlbXBfcmVzb3VyY2VzLAorCX0sCisJeworCQkubmFtZSA9ICJhYjg1MDAtZmciLAorCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYWI4NTAwX2ZnX3Jlc291cmNlcyksCisJCS5yZXNvdXJjZXMgPSBhYjg1MDBfZmdfcmVzb3VyY2VzLAorCX0sCisJeworCQkubmFtZSA9ICJhYjg1MDAtY2hhcmdhbGciLAorCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUoYWI4NTAwX2NoYXJnYWxnX3Jlc291cmNlcyksCisJCS5yZXNvdXJjZXMgPSBhYjg1MDBfY2hhcmdhbGdfcmVzb3VyY2VzLAorCX0sCisJeworCQkubmFtZSA9ICJhYjg1MDAtYWNjLWRldCIsCisJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRShhYjg1MDBfYXZfYWNjX2RldGVjdF9yZXNvdXJjZXMpLAorCQkucmVzb3VyY2VzID0gYWI4NTAwX2F2X2FjY19kZXRlY3RfcmVzb3VyY2VzLAorCX0sCisJeworCQkubmFtZSA9ICJhYjg1MDAtY29kZWMiLAorCX0sCiAJewogCQkubmFtZSA9ICJhYjg1MDAtdXNiIiwKIAkJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKGFiODUwMF91c2JfcmVzb3VyY2VzKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2FiODUwMC1kZWJ1Z2ZzLmMgYi9kcml2ZXJzL21mZC9hYjg1MDAtZGVidWdmcy5jCmluZGV4IDY0NzQ4ZTQuLjY0YmRlZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL2FiODUwMC1kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9tZmQvYWI4NTAwLWRlYnVnZnMuYwpAQCAtNDE5LDIwICs0MTksMTMgQEAKIAlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAoKHN0cnVjdCBzZXFfZmlsZSAqKShmaWxlLT5wcml2YXRlX2RhdGEpKS0+cHJpdmF0ZTsKLQljaGFyIGJ1ZlszMl07Ci0JaW50IGJ1Zl9zaXplOwogCXVuc2lnbmVkIGxvbmcgdXNlcl9iYW5rOwogCWludCBlcnI7CiAKIAkvKiBHZXQgdXNlcnNwYWNlIHN0cmluZyBhbmQgYXNzdXJlIHRlcm1pbmF0aW9uICovCi0JYnVmX3NpemUgPSBtaW4oY291bnQsIChzaXplb2YoYnVmKSAtIDEpKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlidWZbYnVmX3NpemVdID0gMDsKLQotCWVyciA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJnVzZXJfYmFuayk7CisJZXJyID0ga3N0cnRvdWxfZnJvbV91c2VyKHVzZXJfYnVmLCBjb3VudCwgMCwgJnVzZXJfYmFuayk7CiAJaWYgKGVycikKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBlcnI7CiAKIAlpZiAodXNlcl9iYW5rID49IEFCODUwMF9OVU1fQkFOS1MpIHsKIAkJZGV2X2VycihkZXYsICJkZWJ1Z2ZzIGVycm9yIGlucHV0ID4gbnVtYmVyIG9mIGJhbmtzXG4iKTsKQEAgLTQ0MSw3ICs0MzQsNyBAQAogCiAJZGVidWdfYmFuayA9IHVzZXJfYmFuazsKIAotCXJldHVybiBidWZfc2l6ZTsKKwlyZXR1cm4gY291bnQ7CiB9CiAKIHN0YXRpYyBpbnQgYWI4NTAwX2FkZHJlc3NfcHJpbnQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwKQpAQCAtNDU5LDI2ICs0NTIsMjAgQEAKIAlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAoKHN0cnVjdCBzZXFfZmlsZSAqKShmaWxlLT5wcml2YXRlX2RhdGEpKS0+cHJpdmF0ZTsKLQljaGFyIGJ1ZlszMl07Ci0JaW50IGJ1Zl9zaXplOwogCXVuc2lnbmVkIGxvbmcgdXNlcl9hZGRyZXNzOwogCWludCBlcnI7CiAKIAkvKiBHZXQgdXNlcnNwYWNlIHN0cmluZyBhbmQgYXNzdXJlIHRlcm1pbmF0aW9uICovCi0JYnVmX3NpemUgPSBtaW4oY291bnQsIChzaXplb2YoYnVmKSAtIDEpKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlidWZbYnVmX3NpemVdID0gMDsKLQotCWVyciA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJnVzZXJfYWRkcmVzcyk7CisJZXJyID0ga3N0cnRvdWxfZnJvbV91c2VyKHVzZXJfYnVmLCBjb3VudCwgMCwgJnVzZXJfYWRkcmVzcyk7CiAJaWYgKGVycikKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBlcnI7CisKIAlpZiAodXNlcl9hZGRyZXNzID4gMHhmZikgewogCQlkZXZfZXJyKGRldiwgImRlYnVnZnMgZXJyb3IgaW5wdXQgPiAweGZmXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWRlYnVnX2FkZHJlc3MgPSB1c2VyX2FkZHJlc3M7Ci0JcmV0dXJuIGJ1Zl9zaXplOworCXJldHVybiBjb3VudDsKIH0KIAogc3RhdGljIGludCBhYjg1MDBfdmFsX3ByaW50KHN0cnVjdCBzZXFfZmlsZSAqcywgdm9pZCAqcCkKQEAgLTUwOSwyMCArNDk2LDE0IEBACiAJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gKChzdHJ1Y3Qgc2VxX2ZpbGUgKikoZmlsZS0+cHJpdmF0ZV9kYXRhKSktPnByaXZhdGU7Ci0JY2hhciBidWZbMzJdOwotCWludCBidWZfc2l6ZTsKIAl1bnNpZ25lZCBsb25nIHVzZXJfdmFsOwogCWludCBlcnI7CiAKIAkvKiBHZXQgdXNlcnNwYWNlIHN0cmluZyBhbmQgYXNzdXJlIHRlcm1pbmF0aW9uICovCi0JYnVmX3NpemUgPSBtaW4oY291bnQsIChzaXplb2YoYnVmKS0xKSk7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGJ1Zl9zaXplKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JYnVmW2J1Zl9zaXplXSA9IDA7Ci0KLQllcnIgPSBzdHJpY3Rfc3RydG91bChidWYsIDAsICZ1c2VyX3ZhbCk7CisJZXJyID0ga3N0cnRvdWxfZnJvbV91c2VyKHVzZXJfYnVmLCBjb3VudCwgMCwgJnVzZXJfdmFsKTsKIAlpZiAoZXJyKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIGVycjsKKwogCWlmICh1c2VyX3ZhbCA+IDB4ZmYpIHsKIAkJZGV2X2VycihkZXYsICJkZWJ1Z2ZzIGVycm9yIGlucHV0ID4gMHhmZlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNTM0LDcgKzUxNSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXJldHVybiBidWZfc2l6ZTsKKwlyZXR1cm4gY291bnQ7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGFiODUwMF9iYW5rX2ZvcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9qejQ3NDAtYWRjLmMgYi9kcml2ZXJzL21mZC9qejQ3NDAtYWRjLmMKaW5kZXggYTBiZDBjZi4uMjExMzFjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvano0NzQwLWFkYy5jCisrKyBiL2RyaXZlcnMvbWZkL2p6NDc0MC1hZGMuYwpAQCAtNTYsNyArNTYsNyBAQAogCXZvaWQgX19pb21lbSAqYmFzZTsKIAogCWludCBpcnE7Ci0JaW50IGlycV9iYXNlOworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYzsKIAogCXN0cnVjdCBjbGsgKmNsazsKIAlhdG9taWNfdCBjbGtfcmVmOwpAQCAtNjQsNjMgKzY0LDE3IEBACiAJc3BpbmxvY2tfdCBsb2NrOwogfTsKIAotc3RhdGljIGlubGluZSB2b2lkIGp6NDc0MF9hZGNfaXJxX3NldF9tYXNrZWQoc3RydWN0IGp6NDc0MF9hZGMgKmFkYywgaW50IGlycSwKLQlib29sIG1hc2tlZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVpbnQ4X3QgdmFsOwotCi0JaXJxIC09IGFkYy0+aXJxX2Jhc2U7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRjLT5sb2NrLCBmbGFncyk7Ci0KLQl2YWwgPSByZWFkYihhZGMtPmJhc2UgKyBKWl9SRUdfQURDX0NUUkwpOwotCWlmIChtYXNrZWQpCi0JCXZhbCB8PSBCSVQoaXJxKTsKLQllbHNlCi0JCXZhbCAmPSB+QklUKGlycSk7Ci0Jd3JpdGViKHZhbCwgYWRjLT5iYXNlICsgSlpfUkVHX0FEQ19DVFJMKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYy0+bG9jaywgZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBqejQ3NDBfYWRjX2lycV9tYXNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKLXsKLQlzdHJ1Y3Qgano0NzQwX2FkYyAqYWRjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7Ci0Jano0NzQwX2FkY19pcnFfc2V0X21hc2tlZChhZGMsIGRhdGEtPmlycSwgdHJ1ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGp6NDc0MF9hZGNfaXJxX3VubWFzayhzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEpCi17Ci0Jc3RydWN0IGp6NDc0MF9hZGMgKmFkYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOwotCWp6NDc0MF9hZGNfaXJxX3NldF9tYXNrZWQoYWRjLCBkYXRhLT5pcnEsIGZhbHNlKTsKLX0KLQotc3RhdGljIHZvaWQgano0NzQwX2FkY19pcnFfYWNrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKLXsKLQlzdHJ1Y3Qgano0NzQwX2FkYyAqYWRjID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7Ci0JdW5zaWduZWQgaW50IGlycSA9IGRhdGEtPmlycSAtIGFkYy0+aXJxX2Jhc2U7Ci0Jd3JpdGViKEJJVChpcnEpLCBhZGMtPmJhc2UgKyBKWl9SRUdfQURDX1NUQVRVUyk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgano0NzQwX2FkY19pcnFfY2hpcCA9IHsKLQkubmFtZSA9ICJqejQ3NDAtYWRjIiwKLQkuaXJxX21hc2sgPSBqejQ3NDBfYWRjX2lycV9tYXNrLAotCS5pcnFfdW5tYXNrID0gano0NzQwX2FkY19pcnFfdW5tYXNrLAotCS5pcnFfYWNrID0gano0NzQwX2FkY19pcnFfYWNrLAotfTsKLQogc3RhdGljIHZvaWQgano0NzQwX2FkY19pcnFfZGVtdXgodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQogewotCXN0cnVjdCBqejQ3NDBfYWRjICphZGMgPSBpcnFfZGVzY19nZXRfaGFuZGxlcl9kYXRhKGRlc2MpOworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYyA9IGlycV9kZXNjX2dldF9oYW5kbGVyX2RhdGEoZGVzYyk7CiAJdWludDhfdCBzdGF0dXM7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlzdGF0dXMgPSByZWFkYihhZGMtPmJhc2UgKyBKWl9SRUdfQURDX1NUQVRVUyk7CisJc3RhdHVzID0gcmVhZGIoZ2MtPnJlZ19iYXNlICsgSlpfUkVHX0FEQ19TVEFUVVMpOwogCiAJZm9yIChpID0gMDsgaSA8IDU7ICsraSkgewogCQlpZiAoc3RhdHVzICYgQklUKGkpKQotCQkJZ2VuZXJpY19oYW5kbGVfaXJxKGFkYy0+aXJxX2Jhc2UgKyBpKTsKKwkJCWdlbmVyaWNfaGFuZGxlX2lycShnYy0+aXJxX2Jhc2UgKyBpKTsKIAl9CiB9CiAKQEAgLTI0OSwxMCArMjAzLDEyIEBACiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGp6NDc0MF9hZGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlpbnQgcmV0OworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYzsKKwlzdHJ1Y3QgaXJxX2NoaXBfdHlwZSAqY3Q7CiAJc3RydWN0IGp6NDc0MF9hZGMgKmFkYzsKIAlzdHJ1Y3QgcmVzb3VyY2UgKm1lbV9iYXNlOwotCWludCBpcnE7CisJaW50IHJldDsKKwlpbnQgaXJxX2Jhc2U7CiAKIAlhZGMgPSBrbWFsbG9jKHNpemVvZigqYWRjKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFhZGMpIHsKQEAgLTI2Nyw5ICsyMjMsOSBAQAogCQlnb3RvIGVycl9mcmVlOwogCX0KIAotCWFkYy0+aXJxX2Jhc2UgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDEpOwotCWlmIChhZGMtPmlycV9iYXNlIDwgMCkgewotCQlyZXQgPSBhZGMtPmlycV9iYXNlOworCWlycV9iYXNlID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAxKTsKKwlpZiAoaXJxX2Jhc2UgPCAwKSB7CisJCXJldCA9IGlycV9iYXNlOwogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IGlycSBiYXNlOiAlZFxuIiwgcmV0KTsKIAkJZ290byBlcnJfZnJlZTsKIAl9CkBAIC0zMDksMjAgKzI2NSwyOCBAQAogCiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgYWRjKTsKIAotCWZvciAoaXJxID0gYWRjLT5pcnFfYmFzZTsgaXJxIDwgYWRjLT5pcnFfYmFzZSArIDU7ICsraXJxKSB7Ci0JCWlycV9zZXRfY2hpcF9kYXRhKGlycSwgYWRjKTsKLQkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGlycSwgJmp6NDc0MF9hZGNfaXJxX2NoaXAsCi0JCQkJCSBoYW5kbGVfbGV2ZWxfaXJxKTsKLQl9CisJZ2MgPSBpcnFfYWxsb2NfZ2VuZXJpY19jaGlwKCJJTlRDIiwgMSwgaXJxX2Jhc2UsIGFkYy0+YmFzZSwKKwkJaGFuZGxlX2xldmVsX2lycSk7CiAKLQlpcnFfc2V0X2hhbmRsZXJfZGF0YShhZGMtPmlycSwgYWRjKTsKKwljdCA9IGdjLT5jaGlwX3R5cGVzOworCWN0LT5yZWdzLm1hc2sgPSBKWl9SRUdfQURDX0NUUkw7CisJY3QtPnJlZ3MuYWNrID0gSlpfUkVHX0FEQ19TVEFUVVM7CisJY3QtPmNoaXAuaXJxX21hc2sgPSBpcnFfZ2NfbWFza19zZXRfYml0OworCWN0LT5jaGlwLmlycV91bm1hc2sgPSBpcnFfZ2NfbWFza19jbHJfYml0OworCWN0LT5jaGlwLmlycV9hY2sgPSBpcnFfZ2NfYWNrOworCisJaXJxX3NldHVwX2dlbmVyaWNfY2hpcChnYywgSVJRX01TSyg1KSwgMCwgMCwgSVJRX05PUFJPQkUgfCBJUlFfTEVWRUwpOworCisJYWRjLT5nYyA9IGdjOworCisJaXJxX3NldF9oYW5kbGVyX2RhdGEoYWRjLT5pcnEsIGdjKTsKIAlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihhZGMtPmlycSwgano0NzQwX2FkY19pcnFfZGVtdXgpOwogCiAJd3JpdGViKDB4MDAsIGFkYy0+YmFzZSArIEpaX1JFR19BRENfRU5BQkxFKTsKIAl3cml0ZWIoMHhmZiwgYWRjLT5iYXNlICsgSlpfUkVHX0FEQ19DVFJMKTsKIAogCXJldCA9IG1mZF9hZGRfZGV2aWNlcygmcGRldi0+ZGV2LCAwLCBqejQ3NDBfYWRjX2NlbGxzLAotCQlBUlJBWV9TSVpFKGp6NDc0MF9hZGNfY2VsbHMpLCBtZW1fYmFzZSwgYWRjLT5pcnFfYmFzZSk7CisJCUFSUkFZX1NJWkUoano0NzQwX2FkY19jZWxscyksIG1lbV9iYXNlLCBpcnFfYmFzZSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyX2Nsa19wdXQ7CiAKQEAgLTM0Nyw2ICszMTEsOCBAQAogCiAJbWZkX3JlbW92ZV9kZXZpY2VzKCZwZGV2LT5kZXYpOwogCisJaXJxX3JlbW92ZV9nZW5lcmljX2NoaXAoYWRjLT5nYywgSVJRX01TSyg1KSwgSVJRX05PUFJPQkUgfCBJUlFfTEVWRUwsIDApOworCWtmcmVlKGFkYy0+Z2MpOwogCWlycV9zZXRfaGFuZGxlcl9kYXRhKGFkYy0+aXJxLCBOVUxMKTsKIAlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihhZGMtPmlycSwgTlVMTCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2xwY19zY2guYyBiL2RyaXZlcnMvbWZkL2xwY19zY2guYwppbmRleCBlYTNmNTJjLi5lYTExNjliIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9scGNfc2NoLmMKKysrIGIvZHJpdmVycy9tZmQvbHBjX3NjaC5jCkBAIC0zNyw2ICszNyw5IEBACiAjZGVmaW5lIEdQSU9CQVNFCTB4NDQKICNkZWZpbmUgR1BJT19JT19TSVpFCTY0CiAKKyNkZWZpbmUgV0RUQkFTRQkJMHg4NAorI2RlZmluZSBXRFRfSU9fU0laRQk2NAorCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHNtYnVzX3NjaF9yZXNvdXJjZSA9IHsKIAkJLmZsYWdzID0gSU9SRVNPVVJDRV9JTywKIH07CkBAIC01OSw2ICs2MiwxOCBAQAogCX0sCiB9OwogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHdkdF9zY2hfcmVzb3VyY2UgPSB7CisJCS5mbGFncyA9IElPUkVTT1VSQ0VfSU8sCit9OworCitzdGF0aWMgc3RydWN0IG1mZF9jZWxsIHR1bm5lbGNyZWVrX2NlbGxzW10gPSB7CisJeworCQkubmFtZSA9ICJ0dW5uZWxjcmVla193ZHQiLAorCQkubnVtX3Jlc291cmNlcyA9IDEsCisJCS5yZXNvdXJjZXMgPSAmd2R0X3NjaF9yZXNvdXJjZSwKKwl9LAorfTsKKwogc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGxwY19zY2hfaWRzW10gPSB7CiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfU0NIX0xQQykgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JVENfTFBDKSB9LApAQCAtNzIsNiArODcsNyBAQAogCXVuc2lnbmVkIGludCBiYXNlX2FkZHJfY2ZnOwogCXVuc2lnbmVkIHNob3J0IGJhc2VfYWRkcjsKIAlpbnQgaTsKKwlpbnQgcmV0OwogCiAJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgU01CQVNFLCAmYmFzZV9hZGRyX2NmZyk7CiAJaWYgKCEoYmFzZV9hZGRyX2NmZyAmICgxIDw8IDMxKSkpIHsKQEAgLTEwNCw4ICsxMjAsMzkgQEAKIAlmb3IgKGk9MDsgaSA8IEFSUkFZX1NJWkUobHBjX3NjaF9jZWxscyk7IGkrKykKIAkJbHBjX3NjaF9jZWxsc1tpXS5pZCA9IGlkLT5kZXZpY2U7CiAKLQlyZXR1cm4gbWZkX2FkZF9kZXZpY2VzKCZkZXYtPmRldiwgMCwKKwlyZXQgPSBtZmRfYWRkX2RldmljZXMoJmRldi0+ZGV2LCAwLAogCQkJbHBjX3NjaF9jZWxscywgQVJSQVlfU0laRShscGNfc2NoX2NlbGxzKSwgTlVMTCwgMCk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZGV2OworCisJaWYgKGlkLT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF9JVENfTFBDKSB7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIFdEVEJBU0UsICZiYXNlX2FkZHJfY2ZnKTsKKwkJaWYgKCEoYmFzZV9hZGRyX2NmZyAmICgxIDw8IDMxKSkpIHsKKwkJCWRldl9lcnIoJmRldi0+ZGV2LCAiRGVjb2RlIG9mIHRoZSBXRFQgSS9PIHJhbmdlIGRpc2FibGVkXG4iKTsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIG91dF9kZXY7CisJCX0KKwkJYmFzZV9hZGRyID0gKHVuc2lnbmVkIHNob3J0KWJhc2VfYWRkcl9jZmc7CisJCWlmIChiYXNlX2FkZHIgPT0gMCkgeworCQkJZGV2X2VycigmZGV2LT5kZXYsICJJL08gc3BhY2UgZm9yIFdEVCB1bmluaXRpYWxpemVkXG4iKTsKKwkJCXJldCA9IC1FTk9ERVY7CisJCQlnb3RvIG91dF9kZXY7CisJCX0KKworCQl3ZHRfc2NoX3Jlc291cmNlLnN0YXJ0ID0gYmFzZV9hZGRyOworCQl3ZHRfc2NoX3Jlc291cmNlLmVuZCA9IGJhc2VfYWRkciArIFdEVF9JT19TSVpFIC0gMTsKKworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0dW5uZWxjcmVla19jZWxscyk7IGkrKykKKwkJCXR1bm5lbGNyZWVrX2NlbGxzW2ldLmlkID0gaWQtPmRldmljZTsKKworCQlyZXQgPSBtZmRfYWRkX2RldmljZXMoJmRldi0+ZGV2LCAwLCB0dW5uZWxjcmVla19jZWxscywKKwkJCUFSUkFZX1NJWkUodHVubmVsY3JlZWtfY2VsbHMpLCBOVUxMLCAwKTsKKwl9CisKKwlyZXR1cm4gcmV0Oworb3V0X2RldjoKKwltZmRfcmVtb3ZlX2RldmljZXMoJmRldi0+ZGV2KTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgbHBjX3NjaF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL21heDg5OTctaXJxLmMgYi9kcml2ZXJzL21mZC9tYXg4OTk3LWlycS5jCmluZGV4IDYzOGJmN2UuLjA5Mjc0Y2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL21heDg5OTctaXJxLmMKKysrIGIvZHJpdmVycy9tZmQvbWF4ODk5Ny1pcnEuYwpAQCAtNTgsOCArNTgsNiBAQAogCWRlZmF1bHQ6CiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCX0KLQotCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogfQogCiBzdHJ1Y3QgbWF4ODk5N19pcnFfZGF0YSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9tYXg4OTk4LmMgYi9kcml2ZXJzL21mZC9tYXg4OTk4LmMKaW5kZXggOWVjNzU3MC4uZGU0MDk2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvbWF4ODk5OC5jCisrKyBiL2RyaXZlcnMvbWZkL21heDg5OTguYwpAQCAtMzksNiArMzksOCBAQAogCQkubmFtZSA9ICJtYXg4OTk4LXBtaWMiLAogCX0sIHsKIAkJLm5hbWUgPSAibWF4ODk5OC1ydGMiLAorCX0sIHsKKwkJLm5hbWUgPSAibWF4ODk5OC1iYXR0ZXJ5IiwKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvb21hcC11c2ItaG9zdC5jIGIvZHJpdmVycy9tZmQvb21hcC11c2ItaG9zdC5jCmluZGV4IDE3MTcxNDQuLjI5NjAxZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL29tYXAtdXNiLWhvc3QuYworKysgYi9kcml2ZXJzL21mZC9vbWFwLXVzYi1ob3N0LmMKQEAgLTk5OCw5ICs5OTgsOSBAQAogCiAJaWYgKGlzX29tYXBfdXNiaHNfcmV2MihvbWFwKSkgewogCQlpZiAoaXNfZWhjaV90bGxfbW9kZShwZGF0YS0+cG9ydF9tb2RlWzBdKSkKLQkJCWNsa19lbmFibGUob21hcC0+dXNidGxsX3AxX2Zjayk7CisJCQljbGtfZGlzYWJsZShvbWFwLT51c2J0bGxfcDFfZmNrKTsKIAkJaWYgKGlzX2VoY2lfdGxsX21vZGUocGRhdGEtPnBvcnRfbW9kZVsxXSkpCi0JCQljbGtfZW5hYmxlKG9tYXAtPnVzYnRsbF9wMl9mY2spOworCQkJY2xrX2Rpc2FibGUob21hcC0+dXNidGxsX3AyX2Zjayk7CiAJCWNsa19kaXNhYmxlKG9tYXAtPnV0bWlfcDJfZmNrKTsKIAkJY2xrX2Rpc2FibGUob21hcC0+dXRtaV9wMV9mY2spOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3N0bXBlLmMgYi9kcml2ZXJzL21mZC9zdG1wZS5jCmluZGV4IDdhYjc3NDYuLjI5NjM2ODljIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9zdG1wZS5jCisrKyBiL2RyaXZlcnMvbWZkL3N0bXBlLmMKQEAgLTIyOCw3ICsyMjgsNyBAQAogRVhQT1JUX1NZTUJPTF9HUEwoc3RtcGVfYmxvY2tfd3JpdGUpOwogCiAvKioKLSAqIHN0bXBlX3NldF9hbHRmdW5jOiBzZXQgdGhlIGFsdGVybmF0ZSBmdW5jdGlvbiBmb3IgU1RNUEUgcGlucworICogc3RtcGVfc2V0X2FsdGZ1bmMoKS0gc2V0IHRoZSBhbHRlcm5hdGUgZnVuY3Rpb24gZm9yIFNUTVBFIHBpbnMKICAqIEBzdG1wZToJRGV2aWNlIHRvIGNvbmZpZ3VyZQogICogQHBpbnM6CUJpdG1hc2sgb2YgcGlucyB0byBhZmZlY3QKICAqIEBibG9jazoJYmxvY2sgdG8gZW5hYmxlIGFsdGVybmF0ZSBmdW5jdGlvbnMgZm9yCmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9zdG1wZS5oIGIvZHJpdmVycy9tZmQvc3RtcGUuaAppbmRleCAwZGJkYzRlLi5lNGVlMzg5NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvc3RtcGUuaAorKysgYi9kcml2ZXJzL21mZC9zdG1wZS5oCkBAIC00Miw2ICs0Miw3IEBACiAgKiBAaWRfbWFzazoJYml0cyB2YWxpZCBpbiBDSElQSUQgcmVnaXN0ZXIgZm9yIGNvbXBhcmlzb24gd2l0aCBpZF92YWwKICAqIEBudW1fZ3Bpb3M6CW51bWJlciBvZiBHUElPUwogICogQGFmX2JpdHM6CW51bWJlciBvZiBiaXRzIHVzZWQgdG8gc3BlY2lmeSB0aGUgYWx0ZXJuYXRlIGZ1bmN0aW9uCisgKiBAcmVnczogdmFyaWFudCBzcGVjaWZpYyByZWdpc3RlcnMuCiAgKiBAYmxvY2tzOglsaXN0IG9mIGJsb2NrcyBwcmVzZW50IG9uIHRoaXMgZGV2aWNlCiAgKiBAbnVtX2Jsb2NrczoJbnVtYmVyIG9mIGJsb2NrcyBwcmVzZW50IG9uIHRoaXMgZGV2aWNlCiAgKiBAbnVtX2lycXM6CW51bWJlciBvZiBpbnRlcm5hbCBJUlFzIGF2YWlsYWJsZSBvbiB0aGlzIGRldmljZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdGltYmVyZGFsZS5jIGIvZHJpdmVycy9tZmQvdGltYmVyZGFsZS5jCmluZGV4IDY5MjcyZTQuLjY5Njg3OWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3RpbWJlcmRhbGUuYworKysgYi9kcml2ZXJzL21mZC90aW1iZXJkYWxlLmMKQEAgLTI4NywxMiArMjg3LDggQEAKIHN0YXRpYyBfX2RldmluaXRkYXRhIHN0cnVjdCB0aW1iX3JhZGlvX3BsYXRmb3JtX2RhdGEKIAl0aW1iZXJkYWxlX3JhZGlvX3BsYXRmb3JtX2RhdGEgPSB7CiAJLmkyY19hZGFwdGVyID0gMCwKLQkudHVuZXIgPSB7Ci0JCS5pbmZvID0gJnRpbWJlcmRhbGVfdGVmNjg2OF9pMmNfYm9hcmRfaW5mbwotCX0sCi0JLmRzcCA9IHsKLQkJLmluZm8gPSAmdGltYmVyZGFsZV9zYWE3NzA2X2kyY19ib2FyZF9pbmZvCi0JfQorCS50dW5lciA9ICZ0aW1iZXJkYWxlX3RlZjY4NjhfaTJjX2JvYXJkX2luZm8sCisJLmRzcCA9ICZ0aW1iZXJkYWxlX3NhYTc3MDZfaTJjX2JvYXJkX2luZm8KIH07CiAKIHN0YXRpYyBjb25zdCBfX2RldmluaXRjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgdGltYmVyZGFsZV92aWRlb19yZXNvdXJjZXNbXSA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3RwczY1OTEwLmMgYi9kcml2ZXJzL21mZC90cHM2NTkxMC5jCmluZGV4IDIyMjllNjYuLjZmNWI4Y2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3RwczY1OTEwLmMKKysrIGIvZHJpdmVycy9tZmQvdHBzNjU5MTAuYwpAQCAtMTQ3LDEyICsxNDcsMTEgQEAKIAlpZiAoaW5pdF9kYXRhID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaW5pdF9kYXRhLT5pcnEgPSBwbWljX3BsYXRfZGF0YS0+aXJxOwotCWluaXRfZGF0YS0+aXJxX2Jhc2UgPSBwbWljX3BsYXRfZGF0YS0+aXJxOwotCiAJdHBzNjU5MTAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdHBzNjU5MTApLCBHRlBfS0VSTkVMKTsKLQlpZiAodHBzNjU5MTAgPT0gTlVMTCkKKwlpZiAodHBzNjU5MTAgPT0gTlVMTCkgeworCQlrZnJlZShpbml0X2RhdGEpOwogCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAKIAlpMmNfc2V0X2NsaWVudGRhdGEoaTJjLCB0cHM2NTkxMCk7CiAJdHBzNjU5MTAtPmRldiA9ICZpMmMtPmRldjsKQEAgLTE2OCwxNyArMTY3LDIyIEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gZXJyOwogCisJaW5pdF9kYXRhLT5pcnEgPSBwbWljX3BsYXRfZGF0YS0+aXJxOworCWluaXRfZGF0YS0+aXJxX2Jhc2UgPSBwbWljX3BsYXRfZGF0YS0+aXJxOworCiAJdHBzNjU5MTBfZ3Bpb19pbml0KHRwczY1OTEwLCBwbWljX3BsYXRfZGF0YS0+Z3Bpb19iYXNlKTsKIAogCXJldCA9IHRwczY1OTEwX2lycV9pbml0KHRwczY1OTEwLCBpbml0X2RhdGEtPmlycSwgaW5pdF9kYXRhKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBlcnI7CiAKKwlrZnJlZShpbml0X2RhdGEpOwogCXJldHVybiByZXQ7CiAKIGVycjoKIAltZmRfcmVtb3ZlX2RldmljZXModHBzNjU5MTAtPmRldik7CiAJa2ZyZWUodHBzNjU5MTApOworCWtmcmVlKGluaXRfZGF0YSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTg3LDYgKzE5MSw3IEBACiAJc3RydWN0IHRwczY1OTEwICp0cHM2NTkxMCA9IGkyY19nZXRfY2xpZW50ZGF0YShpMmMpOwogCiAJbWZkX3JlbW92ZV9kZXZpY2VzKHRwczY1OTEwLT5kZXYpOworCXRwczY1OTEwX2lycV9leGl0KHRwczY1OTEwKTsKIAlrZnJlZSh0cHM2NTkxMCk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3RwczY1OTExLWNvbXBhcmF0b3IuYyBiL2RyaXZlcnMvbWZkL3RwczY1OTExLWNvbXBhcmF0b3IuYwppbmRleCAyODNhYzY3Li5lN2ZmNzgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC90cHM2NTkxMS1jb21wYXJhdG9yLmMKKysrIGIvZHJpdmVycy9tZmQvdHBzNjU5MTEtY29tcGFyYXRvci5jCkBAIC0xNTcsNiArMTU3LDggQEAKIAlzdHJ1Y3QgdHBzNjU5MTAgKnRwczY1OTEwOwogCiAJdHBzNjU5MTAgPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CisJZGV2aWNlX3JlbW92ZV9maWxlKCZwZGV2LT5kZXYsICZkZXZfYXR0cl9jb21wMl90aHJlc2hvbGQpOworCWRldmljZV9yZW1vdmVfZmlsZSgmcGRldi0+ZGV2LCAmZGV2X2F0dHJfY29tcDFfdGhyZXNob2xkKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdHBzNjU5MTItY29yZS5jIGIvZHJpdmVycy9tZmQvdHBzNjU5MTItY29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1NWJjMDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21mZC90cHM2NTkxMi1jb3JlLmMKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiB0cHM2NTkxMi1jb3JlLmMgIC0tICBUSSBUUFM2NTkxMngKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBUZXhhcyBJbnN0cnVtZW50cyBJbmMuCisgKgorICogQXV0aG9yOiBNYXJnYXJpdGEgT2xheWEgQ2FicmVyYSA8bWFnaUBzbGltbG9naWMuY28udWs+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIHdtODM1MCBpbXBsZW1lbnRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC90cHM2NTkxMi5oPgorCitzdGF0aWMgc3RydWN0IG1mZF9jZWxsIHRwczY1OTEyc1tdID0geworCXsKKwkJLm5hbWUgPSAidHBzNjU5MTItcG1pYyIsCisJfSwKK307CisKK2ludCB0cHM2NTkxMl9zZXRfYml0cyhzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyLCB1OCByZWcsIHU4IG1hc2spCit7CisJdTggZGF0YTsKKwlpbnQgZXJyOworCisJbXV0ZXhfbG9jaygmdHBzNjU5MTItPmlvX211dGV4KTsKKworCWVyciA9IHRwczY1OTEyLT5yZWFkKHRwczY1OTEyLCByZWcsIDEsICZkYXRhKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIodHBzNjU5MTItPmRldiwgIlJlYWQgZnJvbSByZWcgMHgleCBmYWlsZWRcbiIsIHJlZyk7CisJCWdvdG8gb3V0OworCX0KKworCWRhdGEgfD0gbWFzazsKKwllcnIgPSB0cHM2NTkxMi0+d3JpdGUodHBzNjU5MTIsIHJlZywgMSwgJmRhdGEpOworCWlmIChlcnIpCisJCWRldl9lcnIodHBzNjU5MTItPmRldiwgIldyaXRlIHRvIHJlZyAweCV4IGZhaWxlZFxuIiwgcmVnKTsKKworb3V0OgorCW11dGV4X3VubG9jaygmdHBzNjU5MTItPmlvX211dGV4KTsKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTF9HUEwodHBzNjU5MTJfc2V0X2JpdHMpOworCitpbnQgdHBzNjU5MTJfY2xlYXJfYml0cyhzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyLCB1OCByZWcsIHU4IG1hc2spCit7CisJdTggZGF0YTsKKwlpbnQgZXJyOworCisJbXV0ZXhfbG9jaygmdHBzNjU5MTItPmlvX211dGV4KTsKKwllcnIgPSB0cHM2NTkxMi0+cmVhZCh0cHM2NTkxMiwgcmVnLCAxLCAmZGF0YSk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKHRwczY1OTEyLT5kZXYsICJSZWFkIGZyb20gcmVnIDB4JXggZmFpbGVkXG4iLCByZWcpOworCQlnb3RvIG91dDsKKwl9CisKKwlkYXRhICY9IH5tYXNrOworCWVyciA9IHRwczY1OTEyLT53cml0ZSh0cHM2NTkxMiwgcmVnLCAxLCAmZGF0YSk7CisJaWYgKGVycikKKwkJZGV2X2Vycih0cHM2NTkxMi0+ZGV2LCAiV3JpdGUgdG8gcmVnIDB4JXggZmFpbGVkXG4iLCByZWcpOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ0cHM2NTkxMi0+aW9fbXV0ZXgpOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0cHM2NTkxMl9jbGVhcl9iaXRzKTsKKworc3RhdGljIGlubGluZSBpbnQgdHBzNjU5MTJfcmVhZChzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyLCB1OCByZWcpCit7CisJdTggdmFsOworCWludCBlcnI7CisKKwllcnIgPSB0cHM2NTkxMi0+cmVhZCh0cHM2NTkxMiwgcmVnLCAxLCAmdmFsKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRwczY1OTEyX3dyaXRlKHN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTIsIHU4IHJlZywgdTggdmFsKQoreworCXJldHVybiB0cHM2NTkxMi0+d3JpdGUodHBzNjU5MTIsIHJlZywgMSwgJnZhbCk7Cit9CisKK2ludCB0cHM2NTkxMl9yZWdfcmVhZChzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyLCB1OCByZWcpCit7CisJaW50IGRhdGE7CisKKwltdXRleF9sb2NrKCZ0cHM2NTkxMi0+aW9fbXV0ZXgpOworCisJZGF0YSA9IHRwczY1OTEyX3JlYWQodHBzNjU5MTIsIHJlZyk7CisJaWYgKGRhdGEgPCAwKQorCQlkZXZfZXJyKHRwczY1OTEyLT5kZXYsICJSZWFkIGZyb20gcmVnIDB4JXggZmFpbGVkXG4iLCByZWcpOworCisJbXV0ZXhfdW5sb2NrKCZ0cHM2NTkxMi0+aW9fbXV0ZXgpOworCXJldHVybiBkYXRhOworfQorRVhQT1JUX1NZTUJPTF9HUEwodHBzNjU5MTJfcmVnX3JlYWQpOworCitpbnQgdHBzNjU5MTJfcmVnX3dyaXRlKHN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTIsIHU4IHJlZywgdTggdmFsKQoreworCWludCBlcnI7CisKKwltdXRleF9sb2NrKCZ0cHM2NTkxMi0+aW9fbXV0ZXgpOworCisJZXJyID0gdHBzNjU5MTJfd3JpdGUodHBzNjU5MTIsIHJlZywgdmFsKTsKKwlpZiAoZXJyIDwgMCkKKwkJZGV2X2Vycih0cHM2NTkxMi0+ZGV2LCAiV3JpdGUgZm9yIHJlZyAweCV4IGZhaWxlZFxuIiwgcmVnKTsKKworCW11dGV4X3VubG9jaygmdHBzNjU5MTItPmlvX211dGV4KTsKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTF9HUEwodHBzNjU5MTJfcmVnX3dyaXRlKTsKKworaW50IHRwczY1OTEyX2RldmljZV9pbml0KHN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTIpCit7CisJc3RydWN0IHRwczY1OTEyX2JvYXJkICpwbWljX3BsYXRfZGF0YSA9IHRwczY1OTEyLT5kZXYtPnBsYXRmb3JtX2RhdGE7CisJc3RydWN0IHRwczY1OTEyX3BsYXRmb3JtX2RhdGEgKmluaXRfZGF0YTsKKwlpbnQgcmV0LCBkY2RjX2F2cywgdmFsdWU7CisKKwlpbml0X2RhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdHBzNjU5MTJfcGxhdGZvcm1fZGF0YSksIEdGUF9LRVJORUwpOworCWlmIChpbml0X2RhdGEgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpbml0X2RhdGEtPmlycSA9IHBtaWNfcGxhdF9kYXRhLT5pcnE7CisJaW5pdF9kYXRhLT5pcnFfYmFzZSA9IHBtaWNfcGxhdF9kYXRhLT5pcnE7CisKKwltdXRleF9pbml0KCZ0cHM2NTkxMi0+aW9fbXV0ZXgpOworCWRldl9zZXRfZHJ2ZGF0YSh0cHM2NTkxMi0+ZGV2LCB0cHM2NTkxMik7CisKKwlkY2RjX2F2cyA9IChwbWljX3BsYXRfZGF0YS0+aXNfZGNkYzFfYXZzIDw8IDAgfAorCQkJcG1pY19wbGF0X2RhdGEtPmlzX2RjZGMyX2F2cyAgPDwgMSB8CisJCQkJcG1pY19wbGF0X2RhdGEtPmlzX2RjZGMzX2F2cyA8PCAyIHwKKwkJCQkJcG1pY19wbGF0X2RhdGEtPmlzX2RjZGM0X2F2cyA8PCAzKTsKKwlpZiAoZGNkY19hdnMpIHsKKwkJdHBzNjU5MTItPnJlYWQodHBzNjU5MTIsIFRQUzY1OTEyX0kyQ19TUElfQ0ZHLCAxLCAmdmFsdWUpOworCQlkY2RjX2F2cyB8PSB2YWx1ZTsKKwkJdHBzNjU5MTItPndyaXRlKHRwczY1OTEyLCBUUFM2NTkxMl9JMkNfU1BJX0NGRywgMSwgJmRjZGNfYXZzKTsKKwl9CisKKwlyZXQgPSBtZmRfYWRkX2RldmljZXModHBzNjU5MTItPmRldiwgLTEsCisJCQkgICAgICB0cHM2NTkxMnMsIEFSUkFZX1NJWkUodHBzNjU5MTJzKSwKKwkJCSAgICAgIE5VTEwsIDApOworCWlmIChyZXQgPCAwKQorCQlnb3RvIGVycjsKKworCXJldCA9IHRwczY1OTEyX2lycV9pbml0KHRwczY1OTEyLCBpbml0X2RhdGEtPmlycSwgaW5pdF9kYXRhKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnI7CisKKwlyZXR1cm4gcmV0OworCitlcnI6CisJa2ZyZWUoaW5pdF9kYXRhKTsKKwltZmRfcmVtb3ZlX2RldmljZXModHBzNjU5MTItPmRldik7CisJa2ZyZWUodHBzNjU5MTIpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgdHBzNjU5MTJfZGV2aWNlX2V4aXQoc3RydWN0IHRwczY1OTEyICp0cHM2NTkxMikKK3sKKwltZmRfcmVtb3ZlX2RldmljZXModHBzNjU5MTItPmRldik7CisJa2ZyZWUodHBzNjU5MTIpOworfQorCitNT0RVTEVfQVVUSE9SKCJNYXJnYXJpdGEgT2xheWEJPG1hZ2lAc2xpbWxvZ2ljLmNvLnVrPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUUFM2NTkxMnggY2hpcCBmYW1pbHkgbXVsdGktZnVuY3Rpb24gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC90cHM2NTkxMi1pMmMuYyBiL2RyaXZlcnMvbWZkL3RwczY1OTEyLWkyYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNDFmMmMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21mZC90cHM2NTkxMi1pMmMuYwpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIHRwczY1OTEyLWkyYy5jICAtLSAgSTJDIGFjY2VzcyBmb3IgVEkgVFBTNjU5MTJ4IFBNSUMKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBUZXhhcyBJbnN0cnVtZW50cyBJbmMuCisgKgorICogQXV0aG9yOiBNYXJnYXJpdGEgT2xheWEgQ2FicmVyYSA8bWFnaUBzbGltbG9naWMuY28udWs+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIHdtODM1MCBpbXBsZW1lbnRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC90cHM2NTkxMi5oPgorCitzdGF0aWMgaW50IHRwczY1OTEyX2kyY19yZWFkKHN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTIsIHU4IHJlZywKKwkJCQkgIGludCBieXRlcywgdm9pZCAqZGVzdCkKK3sKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjID0gdHBzNjU5MTItPmNvbnRyb2xfZGF0YTsKKwlzdHJ1Y3QgaTJjX21zZyB4ZmVyWzJdOworCWludCByZXQ7CisKKwkvKiBXcml0ZSByZWdpc3RlciAqLworCXhmZXJbMF0uYWRkciA9IGkyYy0+YWRkcjsKKwl4ZmVyWzBdLmZsYWdzID0gMDsKKwl4ZmVyWzBdLmxlbiA9IDE7CisJeGZlclswXS5idWYgPSAmcmVnOworCisJLyogUmVhZCBkYXRhICovCisJeGZlclsxXS5hZGRyID0gaTJjLT5hZGRyOworCXhmZXJbMV0uZmxhZ3MgPSBJMkNfTV9SRDsKKwl4ZmVyWzFdLmxlbiA9IGJ5dGVzOworCXhmZXJbMV0uYnVmID0gZGVzdDsKKworCXJldCA9IGkyY190cmFuc2ZlcihpMmMtPmFkYXB0ZXIsIHhmZXIsIDIpOworCWlmIChyZXQgPT0gMikKKwkJcmV0ID0gMDsKKwllbHNlIGlmIChyZXQgPj0gMCkKKwkJcmV0ID0gLUVJTzsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRwczY1OTEyX2kyY193cml0ZShzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyLCB1OCByZWcsCisJCQkJICAgaW50IGJ5dGVzLCB2b2lkICpzcmMpCit7CisJc3RydWN0IGkyY19jbGllbnQgKmkyYyA9IHRwczY1OTEyLT5jb250cm9sX2RhdGE7CisJLyogd2UgYWRkIDEgYnl0ZSBmb3IgZGV2aWNlIHJlZ2lzdGVyICovCisJdTggbXNnW1RQUzY1OTFYX01BWF9SRUdJU1RFUiArIDFdOworCWludCByZXQ7CisKKwlpZiAoYnl0ZXMgPiBUUFM2NTkxWF9NQVhfUkVHSVNURVIpCisJCXJldHVybiAtRUlOVkFMOworCisJbXNnWzBdID0gcmVnOworCW1lbWNweSgmbXNnWzFdLCBzcmMsIGJ5dGVzKTsKKworCXJldCA9IGkyY19tYXN0ZXJfc2VuZChpMmMsIG1zZywgYnl0ZXMgKyAxKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlpZiAocmV0ICE9IGJ5dGVzICsgMSkKKwkJcmV0dXJuIC1FSU87CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0cHM2NTkxMl9pMmNfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmkyYywKKwkJCSAgICBjb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCit7CisJc3RydWN0IHRwczY1OTEyICp0cHM2NTkxMjsKKworCXRwczY1OTEyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRwczY1OTEyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHRwczY1OTEyID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJaTJjX3NldF9jbGllbnRkYXRhKGkyYywgdHBzNjU5MTIpOworCXRwczY1OTEyLT5kZXYgPSAmaTJjLT5kZXY7CisJdHBzNjU5MTItPmNvbnRyb2xfZGF0YSA9IGkyYzsKKwl0cHM2NTkxMi0+cmVhZCA9IHRwczY1OTEyX2kyY19yZWFkOworCXRwczY1OTEyLT53cml0ZSA9IHRwczY1OTEyX2kyY193cml0ZTsKKworCXJldHVybiB0cHM2NTkxMl9kZXZpY2VfaW5pdCh0cHM2NTkxMik7Cit9CisKK3N0YXRpYyBpbnQgdHBzNjU5MTJfaTJjX3JlbW92ZShzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjKQoreworCXN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTIgPSBpMmNfZ2V0X2NsaWVudGRhdGEoaTJjKTsKKworCXRwczY1OTEyX2RldmljZV9leGl0KHRwczY1OTEyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19kZXZpY2VfaWQgdHBzNjU5MTJfaTJjX2lkW10gPSB7CisJeyJ0cHM2NTkxMiIsIDAgfSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKGkyYywgdHBzNjU5MTJfaTJjX2lkKTsKKworc3RhdGljIHN0cnVjdCBpMmNfZHJpdmVyIHRwczY1OTEyX2kyY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJICAgLm5hbWUgPSAidHBzNjU5MTIiLAorCQkgICAub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IHRwczY1OTEyX2kyY19wcm9iZSwKKwkucmVtb3ZlID0gdHBzNjU5MTJfaTJjX3JlbW92ZSwKKwkuaWRfdGFibGUgPSB0cHM2NTkxMl9pMmNfaWQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB0cHM2NTkxMl9pMmNfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBpMmNfYWRkX2RyaXZlcigmdHBzNjU5MTJfaTJjX2RyaXZlcik7CisJaWYgKHJldCAhPSAwKQorCQlwcl9lcnIoIkZhaWxlZCB0byByZWdpc3RlciBUUFM2NTkxMiBJMkMgZHJpdmVyOiAlZFxuIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisvKiBpbml0IGVhcmx5IHNvIGNvbnN1bWVyIGRldmljZXMgY2FuIGNvbXBsZXRlIHN5c3RlbSBib290ICovCitzdWJzeXNfaW5pdGNhbGwodHBzNjU5MTJfaTJjX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgdHBzNjU5MTJfaTJjX2V4aXQodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmdHBzNjU5MTJfaTJjX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdCh0cHM2NTkxMl9pMmNfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIk1hcmdhcml0YSBPbGF5YQk8bWFnaUBzbGltbG9naWMuY28udWs+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlRQUzY1OTF4IGNoaXAgZmFtaWx5IG11bHRpLWZ1bmN0aW9uIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdHBzNjU5MTItaXJxLmMgYi9kcml2ZXJzL21mZC90cHM2NTkxMi1pcnEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzYwYTgzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZmQvdHBzNjU5MTItaXJxLmMKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiB0cHM2NTkxMi1pcnEuYyAgLS0gIFRJIFRQUzY1OTF4CisgKgorICogQ29weXJpZ2h0IDIwMTEgVGV4YXMgSW5zdHJ1bWVudHMgSW5jLgorICoKKyAqIEF1dGhvcjogTWFyZ2FyaXRhIE9sYXlhIDxtYWdpQHNsaW1sb2dpYy5jby51az4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiB3bTgzNTAgaW1wbGVtZW50YXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9idWcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3RwczY1OTEyLmg+CisKK3N0YXRpYyBpbmxpbmUgaW50IGlycV90b190cHM2NTkxMl9pcnEoc3RydWN0IHRwczY1OTEyICp0cHM2NTkxMiwKKwkJCQkJCQlpbnQgaXJxKQoreworCXJldHVybiBpcnEgLSB0cHM2NTkxMi0+aXJxX2Jhc2U7Cit9CisKKy8qCisgKiBUaGlzIGlzIGEgdGhyZWFkZWQgSVJRIGhhbmRsZXIgc28gY2FuIGFjY2VzcyBJMkMvU1BJLiAgU2luY2UgdGhlCisgKiBJUlEgaGFuZGxlciBleHBsaWNpdGx5IGNsZWFycyB0aGUgSVJRIGl0IGhhbmRsZXMgdGhlIElSUSBsaW5lCisgKiB3aWxsIGJlIHJlYXNzZXJ0ZWQgYW5kIHRoZSBwaHlzaWNhbCBJUlEgd2lsbCBiZSBoYW5kbGVkIGFnYWluIGlmCisgKiBhbm90aGVyIGludGVycnVwdCBpcyBhc3NlcnRlZCB3aGlsZSB3ZSBydW4gLSBpbiB0aGUgbm9ybWFsIGNvdXJzZQorICogb2YgZXZlbnRzIHRoaXMgaXMgYSByYXJlIG9jY3VycmVuY2Ugc28gd2Ugc2F2ZSBJMkMvU1BJIHJlYWRzLiBXZSdyZQorICogYWxzbyBhc3N1bWluZyB0aGF0IGl0J3MgcmFyZSB0byBnZXQgbG90cyBvZiBpbnRlcnJ1cHRzIGZpcmluZworICogc2ltdWx0YW5lb3VzbHkgc28gdHJ5IHRvIG1pbmltaXNlIEkvTy4KKyAqLworc3RhdGljIGlycXJldHVybl90IHRwczY1OTEyX2lycShpbnQgaXJxLCB2b2lkICppcnFfZGF0YSkKK3sKKwlzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyID0gaXJxX2RhdGE7CisJdTMyIGlycV9zdHM7CisJdTMyIGlycV9tYXNrOworCXU4IHJlZzsKKwlpbnQgaTsKKworCisJdHBzNjU5MTItPnJlYWQodHBzNjU5MTIsIFRQUzY1OTEyX0lOVF9TVFMsIDEsICZyZWcpOworCWlycV9zdHMgPSByZWc7CisJdHBzNjU5MTItPnJlYWQodHBzNjU5MTIsIFRQUzY1OTEyX0lOVF9TVFMyLCAxLCAmcmVnKTsKKwlpcnFfc3RzIHw9IHJlZyA8PCA4OworCXRwczY1OTEyLT5yZWFkKHRwczY1OTEyLCBUUFM2NTkxMl9JTlRfU1RTMywgMSwgJnJlZyk7CisJaXJxX3N0cyB8PSByZWcgPDwgMTY7CisJdHBzNjU5MTItPnJlYWQodHBzNjU5MTIsIFRQUzY1OTEyX0lOVF9TVFM0LCAxLCAmcmVnKTsKKwlpcnFfc3RzIHw9IHJlZyA8PCAyNDsKKworCXRwczY1OTEyLT5yZWFkKHRwczY1OTEyLCBUUFM2NTkxMl9JTlRfTVNLLCAxLCAmcmVnKTsKKwlpcnFfbWFzayA9IHJlZzsKKwl0cHM2NTkxMi0+cmVhZCh0cHM2NTkxMiwgVFBTNjU5MTJfSU5UX01TSzIsIDEsICZyZWcpOworCWlycV9tYXNrIHw9IHJlZyA8PCA4OworCXRwczY1OTEyLT5yZWFkKHRwczY1OTEyLCBUUFM2NTkxMl9JTlRfTVNLMywgMSwgJnJlZyk7CisJaXJxX21hc2sgfD0gcmVnIDw8IDE2OworCXRwczY1OTEyLT5yZWFkKHRwczY1OTEyLCBUUFM2NTkxMl9JTlRfTVNLNCwgMSwgJnJlZyk7CisJaXJxX21hc2sgfD0gcmVnIDw8IDI0OworCisJaXJxX3N0cyAmPSB+aXJxX21hc2s7CisJaWYgKCFpcnFfc3RzKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlmb3IgKGkgPSAwOyBpIDwgdHBzNjU5MTItPmlycV9udW07IGkrKykgeworCQlpZiAoIShpcnFfc3RzICYgKDEgPDwgaSkpKQorCQkJY29udGludWU7CisKKwkJaGFuZGxlX25lc3RlZF9pcnEodHBzNjU5MTItPmlycV9iYXNlICsgaSk7CisJfQorCisJLyogV3JpdGUgdGhlIFNUUyByZWdpc3RlciBiYWNrIHRvIGNsZWFyIElSUXMgd2UgaGFuZGxlZCAqLworCXJlZyA9IGlycV9zdHMgJiAweEZGOworCWlycV9zdHMgPj49IDg7CisJaWYgKHJlZykKKwkJdHBzNjU5MTItPndyaXRlKHRwczY1OTEyLCBUUFM2NTkxMl9JTlRfU1RTLCAxLCAmcmVnKTsKKwlyZWcgPSBpcnFfc3RzICYgMHhGRjsKKwlpcnFfc3RzID4+PSA4OworCWlmIChyZWcpCisJCXRwczY1OTEyLT53cml0ZSh0cHM2NTkxMiwgVFBTNjU5MTJfSU5UX1NUUzIsIDEsICZyZWcpOworCXJlZyA9IGlycV9zdHMgJiAweEZGOworCWlycV9zdHMgPj49IDg7CisJaWYgKHJlZykKKwkJdHBzNjU5MTItPndyaXRlKHRwczY1OTEyLCBUUFM2NTkxMl9JTlRfU1RTMywgMSwgJnJlZyk7CisJcmVnID0gaXJxX3N0cyAmIDB4RkY7CisJaWYgKHJlZykKKwkJdHBzNjU5MTItPndyaXRlKHRwczY1OTEyLCBUUFM2NTkxMl9JTlRfU1RTNCwgMSwgJnJlZyk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHRwczY1OTEyX2lycV9sb2NrKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisKKwltdXRleF9sb2NrKCZ0cHM2NTkxMi0+aXJxX2xvY2spOworfQorCitzdGF0aWMgdm9pZCB0cHM2NTkxMl9pcnFfc3luY191bmxvY2soc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCXN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTIgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKwl1MzIgcmVnX21hc2s7CisJdTggcmVnOworCisJdHBzNjU5MTItPnJlYWQodHBzNjU5MTIsIFRQUzY1OTEyX0lOVF9NU0ssIDEsICZyZWcpOworCXJlZ19tYXNrID0gcmVnOworCXRwczY1OTEyLT5yZWFkKHRwczY1OTEyLCBUUFM2NTkxMl9JTlRfTVNLMiwgMSwgJnJlZyk7CisJcmVnX21hc2sgfD0gcmVnIDw8IDg7CisJdHBzNjU5MTItPnJlYWQodHBzNjU5MTIsIFRQUzY1OTEyX0lOVF9NU0szLCAxLCAmcmVnKTsKKwlyZWdfbWFzayB8PSByZWcgPDwgMTY7CisJdHBzNjU5MTItPnJlYWQodHBzNjU5MTIsIFRQUzY1OTEyX0lOVF9NU0s0LCAxLCAmcmVnKTsKKwlyZWdfbWFzayB8PSByZWcgPDwgMjQ7CisKKwlpZiAodHBzNjU5MTItPmlycV9tYXNrICE9IHJlZ19tYXNrKSB7CisJCXJlZyA9IHRwczY1OTEyLT5pcnFfbWFzayAmIDB4RkY7CisJCXRwczY1OTEyLT53cml0ZSh0cHM2NTkxMiwgVFBTNjU5MTJfSU5UX01TSywgMSwgJnJlZyk7CisJCXJlZyA9IHRwczY1OTEyLT5pcnFfbWFzayA+PiA4ICYgMHhGRjsKKwkJdHBzNjU5MTItPndyaXRlKHRwczY1OTEyLCBUUFM2NTkxMl9JTlRfTVNLMiwgMSwgJnJlZyk7CisJCXJlZyA9IHRwczY1OTEyLT5pcnFfbWFzayA+PiAxNiAmIDB4RkY7CisJCXRwczY1OTEyLT53cml0ZSh0cHM2NTkxMiwgVFBTNjU5MTJfSU5UX01TSzMsIDEsICZyZWcpOworCQlyZWcgPSB0cHM2NTkxMi0+aXJxX21hc2sgPj4gMjQgJiAweEZGOworCQl0cHM2NTkxMi0+d3JpdGUodHBzNjU5MTIsIFRQUzY1OTEyX0lOVF9NU0s0LCAxLCAmcmVnKTsKKwl9CisKKwltdXRleF91bmxvY2soJnRwczY1OTEyLT5pcnFfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHRwczY1OTEyX2lycV9lbmFibGUoc3RydWN0IGlycV9kYXRhICpkYXRhKQoreworCXN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTIgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkYXRhKTsKKworCXRwczY1OTEyLT5pcnFfbWFzayAmPSB+KDEgPDwgaXJxX3RvX3RwczY1OTEyX2lycSh0cHM2NTkxMiwgZGF0YS0+aXJxKSk7Cit9CisKK3N0YXRpYyB2b2lkIHRwczY1OTEyX2lycV9kaXNhYmxlKHN0cnVjdCBpcnFfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CisKKwl0cHM2NTkxMi0+aXJxX21hc2sgfD0gKDEgPDwgaXJxX3RvX3RwczY1OTEyX2lycSh0cHM2NTkxMiwgZGF0YS0+aXJxKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgdHBzNjU5MTJfaXJxX2NoaXAgPSB7CisJLm5hbWUgPSAidHBzNjU5MTIiLAorCS5pcnFfYnVzX2xvY2sgPSB0cHM2NTkxMl9pcnFfbG9jaywKKwkuaXJxX2J1c19zeW5jX3VubG9jayA9IHRwczY1OTEyX2lycV9zeW5jX3VubG9jaywKKwkuaXJxX2Rpc2FibGUgPSB0cHM2NTkxMl9pcnFfZGlzYWJsZSwKKwkuaXJxX2VuYWJsZSA9IHRwczY1OTEyX2lycV9lbmFibGUsCit9OworCitpbnQgdHBzNjU5MTJfaXJxX2luaXQoc3RydWN0IHRwczY1OTEyICp0cHM2NTkxMiwgaW50IGlycSwKKwkJCSAgICBzdHJ1Y3QgdHBzNjU5MTJfcGxhdGZvcm1fZGF0YSAqcGRhdGEpCit7CisJaW50IHJldCwgY3VyX2lycTsKKwlpbnQgZmxhZ3MgPSBJUlFGX09ORVNIT1Q7CisJdTggcmVnOworCisJaWYgKCFpcnEpIHsKKwkJZGV2X3dhcm4odHBzNjU5MTItPmRldiwgIk5vIGludGVycnVwdCBzdXBwb3J0LCBubyBjb3JlIElSUVxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghcGRhdGEgfHwgIXBkYXRhLT5pcnFfYmFzZSkgeworCQlkZXZfd2Fybih0cHM2NTkxMi0+ZGV2LCAiTm8gaW50ZXJydXB0IHN1cHBvcnQsIG5vIElSUSBiYXNlXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ2xlYXIgdW5hdHRlbmRlZCBpbnRlcnJ1cHRzICovCisJdHBzNjU5MTItPnJlYWQodHBzNjU5MTIsIFRQUzY1OTEyX0lOVF9TVFMsIDEsICZyZWcpOworCXRwczY1OTEyLT53cml0ZSh0cHM2NTkxMiwgVFBTNjU5MTJfSU5UX1NUUywgMSwgJnJlZyk7CisJdHBzNjU5MTItPnJlYWQodHBzNjU5MTIsIFRQUzY1OTEyX0lOVF9TVFMyLCAxLCAmcmVnKTsKKwl0cHM2NTkxMi0+d3JpdGUodHBzNjU5MTIsIFRQUzY1OTEyX0lOVF9TVFMyLCAxLCAmcmVnKTsKKwl0cHM2NTkxMi0+cmVhZCh0cHM2NTkxMiwgVFBTNjU5MTJfSU5UX1NUUzMsIDEsICZyZWcpOworCXRwczY1OTEyLT53cml0ZSh0cHM2NTkxMiwgVFBTNjU5MTJfSU5UX1NUUzMsIDEsICZyZWcpOworCXRwczY1OTEyLT5yZWFkKHRwczY1OTEyLCBUUFM2NTkxMl9JTlRfU1RTNCwgMSwgJnJlZyk7CisJdHBzNjU5MTItPndyaXRlKHRwczY1OTEyLCBUUFM2NTkxMl9JTlRfU1RTNCwgMSwgJnJlZyk7CisKKwkvKiBNYXNrIHRvcCBsZXZlbCBpbnRlcnJ1cHRzICovCisJdHBzNjU5MTItPmlycV9tYXNrID0gMHhGRkZGRkZGRjsKKworCW11dGV4X2luaXQoJnRwczY1OTEyLT5pcnFfbG9jayk7CisJdHBzNjU5MTItPmNoaXBfaXJxID0gaXJxOworCXRwczY1OTEyLT5pcnFfYmFzZSA9IHBkYXRhLT5pcnFfYmFzZTsKKworCXRwczY1OTEyLT5pcnFfbnVtID0gVFBTNjU5MTJfTlVNX0lSUTsKKworCS8qIFJlZ2lzdGVyIHdpdGggZ2VuaXJxICovCisJZm9yIChjdXJfaXJxID0gdHBzNjU5MTItPmlycV9iYXNlOworCSAgICAgY3VyX2lycSA8IHRwczY1OTEyLT5pcnFfbnVtICsgdHBzNjU5MTItPmlycV9iYXNlOworCSAgICAgY3VyX2lycSsrKSB7CisJCWlycV9zZXRfY2hpcF9kYXRhKGN1cl9pcnEsIHRwczY1OTEyKTsKKwkJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKGN1cl9pcnEsICZ0cHM2NTkxMl9pcnFfY2hpcCwKKwkJCQkJIGhhbmRsZV9lZGdlX2lycSk7CisJCWlycV9zZXRfbmVzdGVkX3RocmVhZChjdXJfaXJxLCAxKTsKKwkJLyogQVJNIG5lZWRzIHVzIHRvIGV4cGxpY2l0bHkgZmxhZyB0aGUgSVJRIGFzIHZhbGlkCisJCSAqIGFuZCB3aWxsIHNldCB0aGVtIG5vcHJvYmUgd2hlbiB3ZSBkbyBzby4gKi8KKyNpZmRlZiBDT05GSUdfQVJNCisJCXNldF9pcnFfZmxhZ3MoY3VyX2lycSwgSVJRRl9WQUxJRCk7CisjZWxzZQorCQlpcnFfc2V0X25vcHJvYmUoY3VyX2lycSk7CisjZW5kaWYKKwl9CisKKwlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycShpcnEsIE5VTEwsIHRwczY1OTEyX2lycSwgZmxhZ3MsCisJCQkJICAgInRwczY1OTEyIiwgdHBzNjU5MTIpOworCisJaXJxX3NldF9pcnFfdHlwZShpcnEsIElSUV9UWVBFX0xFVkVMX0xPVyk7CisJaWYgKHJldCAhPSAwKQorCQlkZXZfZXJyKHRwczY1OTEyLT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBJUlE6ICVkXG4iLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworaW50IHRwczY1OTEyX2lycV9leGl0KHN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTIpCit7CisJZnJlZV9pcnEodHBzNjU5MTItPmNoaXBfaXJxLCB0cHM2NTkxMik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC90cHM2NTkxMi1zcGkuYyBiL2RyaXZlcnMvbWZkL3RwczY1OTEyLXNwaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNzFlMGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21mZC90cHM2NTkxMi1zcGkuYwpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIHRwczY1OTEyLXNwaS5jICAtLSAgU1BJIGFjY2VzcyBmb3IgVEkgVFBTNjU5MTJ4IFBNSUMKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBUZXhhcyBJbnN0cnVtZW50cyBJbmMuCisgKgorICogQXV0aG9yOiBNYXJnYXJpdGEgT2xheWEgQ2FicmVyYSA8bWFnaUBzbGltbG9naWMuY28udWs+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICogIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgZHJpdmVyIGlzIGJhc2VkIG9uIHdtODM1MCBpbXBsZW1lbnRhdGlvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvdHBzNjU5MTIuaD4KKworc3RhdGljIGludCB0cHM2NTkxMl9zcGlfd3JpdGUoc3RydWN0IHRwczY1OTEyICp0cHM2NTkxMiwgdTggYWRkciwKKwkJCQkJCQlpbnQgYnl0ZXMsIHZvaWQgKnNyYykKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdHBzNjU5MTItPmNvbnRyb2xfZGF0YTsKKwl1OCAqZGF0YSA9ICh1OCAqKSBzcmM7CisJaW50IHJldDsKKwkvKiBiaXQgMjMgaXMgdGhlIHJlYWQvd3JpdGUgYml0ICovCisJdW5zaWduZWQgbG9uZyBzcGlfZGF0YSA9IDEgPDwgMjMgfCBhZGRyIDw8IDE1IHwgKmRhdGE7CisJc3RydWN0IHNwaV90cmFuc2ZlciB4ZmVyOworCXN0cnVjdCBzcGlfbWVzc2FnZSBtc2c7CisJdTMyIHR4X2J1ZiwgcnhfYnVmOworCisJdHhfYnVmID0gc3BpX2RhdGE7CisJcnhfYnVmID0gMDsKKworCXhmZXIudHhfYnVmCT0gJnR4X2J1ZjsKKwl4ZmVyLnJ4X2J1Zgk9IE5VTEw7CisJeGZlci5sZW4JPSBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJeGZlci5iaXRzX3Blcl93b3JkID0gMjQ7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtc2cpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ4ZmVyLCAmbXNnKTsKKworCXJldCA9IHNwaV9zeW5jKHNwaSwgJm1zZyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0cHM2NTkxMl9zcGlfcmVhZChzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyLCB1OCBhZGRyLAorCQkJCQkJCWludCBieXRlcywgdm9pZCAqZGVzdCkKK3sKKwlzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpID0gdHBzNjU5MTItPmNvbnRyb2xfZGF0YTsKKwkvKiBiaXQgMjMgaXMgdGhlIHJlYWQvd3JpdGUgYml0ICovCisJdW5zaWduZWQgbG9uZyBzcGlfZGF0YSA9IDAgPDwgMjMgfCBhZGRyIDw8IDE1OworCXN0cnVjdCBzcGlfdHJhbnNmZXIgeGZlcjsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbXNnOworCWludCByZXQ7CisJdTggKmRhdGEgPSAodTggKikgZGVzdDsKKwl1MzIgdHhfYnVmLCByeF9idWY7CisKKwl0eF9idWYgPSBzcGlfZGF0YTsKKwlyeF9idWYgPSAwOworCisJeGZlci50eF9idWYJPSAmdHhfYnVmOworCXhmZXIucnhfYnVmCT0gJnJ4X2J1ZjsKKwl4ZmVyLmxlbgk9IHNpemVvZih1bnNpZ25lZCBsb25nKTsKKwl4ZmVyLmJpdHNfcGVyX3dvcmQgPSAyNDsKKworCXNwaV9tZXNzYWdlX2luaXQoJm1zZyk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnhmZXIsICZtc2cpOworCisJaWYgKHNwaSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXJldCA9IHNwaV9zeW5jKHNwaSwgJm1zZyk7CisJaWYgKHJldCA9PSAwKQorCQkqZGF0YSA9ICh1OCkgKHJ4X2J1ZiAmIDB4RkYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHRwczY1OTEyX3NwaV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTI7CisKKwl0cHM2NTkxMiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0cHM2NTkxMiksIEdGUF9LRVJORUwpOworCWlmICh0cHM2NTkxMiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXRwczY1OTEyLT5kZXYgPSAmc3BpLT5kZXY7CisJdHBzNjU5MTItPmNvbnRyb2xfZGF0YSA9IHNwaTsKKwl0cHM2NTkxMi0+cmVhZCA9IHRwczY1OTEyX3NwaV9yZWFkOworCXRwczY1OTEyLT53cml0ZSA9IHRwczY1OTEyX3NwaV93cml0ZTsKKworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIHRwczY1OTEyKTsKKworCXJldHVybiB0cHM2NTkxMl9kZXZpY2VfaW5pdCh0cHM2NTkxMik7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHRwczY1OTEyX3NwaV9yZW1vdmUoc3RydWN0IHNwaV9kZXZpY2UgKnNwaSkKK3sKKwlzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CisKKwl0cHM2NTkxMl9kZXZpY2VfZXhpdCh0cHM2NTkxMik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIHRwczY1OTEyX3NwaV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAidHBzNjU5MTIiLAorCQkuYnVzID0gJnNwaV9idXNfdHlwZSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUJPSB0cHM2NTkxMl9zcGlfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHRwczY1OTEyX3NwaV9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgdHBzNjU5MTJfc3BpX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gc3BpX3JlZ2lzdGVyX2RyaXZlcigmdHBzNjU5MTJfc3BpX2RyaXZlcik7CisJaWYgKHJldCAhPSAwKQorCQlwcl9lcnIoIkZhaWxlZCB0byByZWdpc3RlciBUUFM2NTkxMiBTUEkgZHJpdmVyOiAlZFxuIiwgcmV0KTsKKworCXJldHVybiAwOworfQorLyogaW5pdCBlYXJseSBzbyBjb25zdW1lciBkZXZpY2VzIGNhbiBjb21wbGV0ZSBzeXN0ZW0gYm9vdCAqLworc3Vic3lzX2luaXRjYWxsKHRwczY1OTEyX3NwaV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHRwczY1OTEyX3NwaV9leGl0KHZvaWQpCit7CisJc3BpX3VucmVnaXN0ZXJfZHJpdmVyKCZ0cHM2NTkxMl9zcGlfZHJpdmVyKTsKK30KK21vZHVsZV9leGl0KHRwczY1OTEyX3NwaV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiTWFyZ2FyaXRhIE9sYXlhCTxtYWdpQHNsaW1sb2dpYy5jby51az4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiU1BJIHN1cHBvcnQgZm9yIFRQUzY1OTEyIGNoaXAgZmFtaWx5IG1mZCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdHdsLWNvcmUuYyBiL2RyaXZlcnMvbWZkL3R3bC1jb3JlLmMKaW5kZXggYTJlZGRjNzAuLjAxZWNmZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3R3bC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvdHdsLWNvcmUuYwpAQCAtMTI4Myw2ICsxMjgzLDggQEAKIAl7ICJ0cHM2NTk1MCIsIDAgfSwJCS8qIGNhdGFsb2cgdmVyc2lvbiBvZiB0d2w1MDMwICovCiAJeyAidHBzNjU5MzAiLCBUUFNfU1VCU0VUIH0sCS8qIGZld2VyIExET3MgYW5kIERBQ3M7IG5vIGNoYXJnZXIgKi8KIAl7ICJ0cHM2NTkyMCIsIFRQU19TVUJTRVQgfSwJLyogZmV3ZXIgTERPczsgbm8gY29kZWMgb3IgY2hhcmdlciAqLworCXsgInRwczY1OTIxIiwgVFBTX1NVQlNFVCB9LAkvKiBmZXdlciBMRE9zOyBubyBjb2RlYywgbm8gTEVECisJCQkJCSAgIGFuZCB2aWJyYXRvci4gQ2hhcmdlciBpbiBVU0IgbW9kdWxlKi8KIAl7ICJ0d2w2MDMwIiwgVFdMNjAzMF9DTEFTUyB9LAkvKiAiUGhvZW5peCBwb3dlciBjaGlwIiAqLwogCXsgInR3bDYwMjUiLCBUV0w2MDMwX0NMQVNTIHwgVFdMNjAyNV9TVUJDTEFTUyB9LCAvKiAiUGhvZW5peCBsaXRlIiAqLwogCXsgLyogZW5kIG9mIGxpc3QgKi8gfSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3R3bDQwMzAtbWFkYy5jIGIvZHJpdmVycy9tZmQvdHdsNDAzMC1tYWRjLmMKaW5kZXggMzk0MWRkYy4uYjVkNTk4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvdHdsNDAzMC1tYWRjLmMKKysrIGIvZHJpdmVycy9tZmQvdHdsNDAzMC1tYWRjLmMKQEAgLTUzMCwxMyArNTMwLDEzIEBACiAJaWYgKHJldCkgewogCQlkZXZfZXJyKHR3bDQwMzBfbWFkYy0+ZGV2LAogCQkJInVuYWJsZSB0byB3cml0ZSBzZWwgcmVnaXN0ZXIgMHglWFxuIiwgbWV0aG9kLT5zZWwgKyAxKTsKLQkJcmV0dXJuIHJldDsKKwkJZ290byBvdXQ7CiAJfQogCXJldCA9IHR3bF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfTUFEQywgY2hfbHNiLCBtZXRob2QtPnNlbCk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKHR3bDQwMzBfbWFkYy0+ZGV2LAogCQkJInVuYWJsZSB0byB3cml0ZSBzZWwgcmVnaXN0ZXIgMHglWFxuIiwgbWV0aG9kLT5zZWwgKyAxKTsKLQkJcmV0dXJuIHJldDsKKwkJZ290byBvdXQ7CiAJfQogCS8qIFNlbGVjdCBhdmVyYWdpbmcgZm9yIGFsbCBjaGFubmVscyBpZiBkb19hdmcgaXMgc2V0ICovCiAJaWYgKHJlcS0+ZG9fYXZnKSB7CkBAIC01NDYsNyArNTQ2LDcgQEAKIAkJCWRldl9lcnIodHdsNDAzMF9tYWRjLT5kZXYsCiAJCQkJInVuYWJsZSB0byB3cml0ZSBhdmcgcmVnaXN0ZXIgMHglWFxuIiwKIAkJCQltZXRob2QtPmF2ZyArIDEpOwotCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8gb3V0OwogCQl9CiAJCXJldCA9IHR3bF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfTUFEQywKIAkJCQkgICAgICAgY2hfbHNiLCBtZXRob2QtPmF2Zyk7CkBAIC01NTQsNyArNTU0LDcgQEAKIAkJCWRldl9lcnIodHdsNDAzMF9tYWRjLT5kZXYsCiAJCQkJInVuYWJsZSB0byB3cml0ZSBzZWwgcmVnIDB4JVhcbiIsCiAJCQkJbWV0aG9kLT5zZWwgKyAxKTsKLQkJCXJldHVybiByZXQ7CisJCQlnb3RvIG91dDsKIAkJfQogCX0KIAlpZiAocmVxLT50eXBlID09IFRXTDQwMzBfTUFEQ19JUlFfT05FU0hPVCAmJiByZXEtPmZ1bmNfY2IgIT0gTlVMTCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdHdsNjAzMC1wd20uYyBiL2RyaXZlcnMvbWZkL3R3bDYwMzAtcHdtLmMKaW5kZXggNWQyNWJkYy4uZThmZWUxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvdHdsNjAzMC1wd20uYworKysgYi9kcml2ZXJzL21mZC90d2w2MDMwLXB3bS5jCkBAIC0xNjEsMyArMTYxLDUgQEAKIAlrZnJlZShwd20pOwogfQogRVhQT1JUX1NZTUJPTChwd21fZnJlZSk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3dtODMxeC1hdXhhZGMuYyBiL2RyaXZlcnMvbWZkL3dtODMxeC1hdXhhZGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzIxMDk1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9tZmQvd204MzF4LWF1eGFkYy5jCkBAIC0wLDAgKzEsMjk5IEBACisvKgorICogd204MzF4LWF1eGFkYy5jICAtLSAgQVVYQURDIGZvciBXb2xmc29uIFdNODMxeCBQTUlDcworICoKKyAqIENvcHlyaWdodCAyMDA5LTIwMTEgV29sZnNvbiBNaWNyb2VsZWN0cm9uaWNzIFBMQy4KKyAqCisgKiBBdXRob3I6IE1hcmsgQnJvd24gPGJyb29uaWVAb3BlbnNvdXJjZS53b2xmc29ubWljcm8uY29tPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvY29yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzF4L2NvcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzF4L3BkYXRhLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3dtODMxeC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvd204MzF4L2F1eGFkYy5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC93bTgzMXgvb3RwLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3dtODMxeC9yZWd1bGF0b3IuaD4KKworc3RydWN0IHdtODMxeF9hdXhhZGNfcmVxIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJZW51bSB3bTgzMXhfYXV4YWRjIGlucHV0OworCWludCB2YWw7CisJc3RydWN0IGNvbXBsZXRpb24gZG9uZTsKK307CisKK3N0YXRpYyBpbnQgd204MzF4X2F1eGFkY19yZWFkX2lycShzdHJ1Y3Qgd204MzF4ICp3bTgzMXgsCisJCQkJICBlbnVtIHdtODMxeF9hdXhhZGMgaW5wdXQpCit7CisJc3RydWN0IHdtODMxeF9hdXhhZGNfcmVxICpyZXE7CisJaW50IHJldDsKKwlib29sIGVuYSA9IGZhbHNlOworCisJcmVxID0ga3phbGxvYyhzaXplb2YoKnJlcSksIEdGUF9LRVJORUwpOworCWlmICghcmVxKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWluaXRfY29tcGxldGlvbigmcmVxLT5kb25lKTsKKwlyZXEtPmlucHV0ID0gaW5wdXQ7CisJcmVxLT52YWwgPSAtRVRJTUVET1VUOworCisJbXV0ZXhfbG9jaygmd204MzF4LT5hdXhhZGNfbG9jayk7CisKKwkvKiBFbnF1ZXVlIHRoZSByZXF1ZXN0ICovCisJbGlzdF9hZGQoJnJlcS0+bGlzdCwgJndtODMxeC0+YXV4YWRjX3BlbmRpbmcpOworCisJZW5hID0gIXdtODMxeC0+YXV4YWRjX2FjdGl2ZTsKKworCWlmIChlbmEpIHsKKwkJcmV0ID0gd204MzF4X3NldF9iaXRzKHdtODMxeCwgV004MzFYX0FVWEFEQ19DT05UUk9MLAorCQkJCSAgICAgIFdNODMxWF9BVVhfRU5BLCBXTTgzMVhfQVVYX0VOQSk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJZGV2X2Vycih3bTgzMXgtPmRldiwgIkZhaWxlZCB0byBlbmFibGUgQVVYQURDOiAlZFxuIiwKKwkJCQlyZXQpOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKiBFbmFibGUgdGhlIGNvbnZlcnNpb24gaWYgbm90IGFscmVhZHkgcnVubmluZyAqLworCWlmICghKHdtODMxeC0+YXV4YWRjX2FjdGl2ZSAmICgxIDw8IGlucHV0KSkpIHsKKwkJcmV0ID0gd204MzF4X3NldF9iaXRzKHdtODMxeCwgV004MzFYX0FVWEFEQ19TT1VSQ0UsCisJCQkJICAgICAgMSA8PCBpbnB1dCwgMSA8PCBpbnB1dCk7CisJCWlmIChyZXQgIT0gMCkgeworCQkJZGV2X2Vycih3bTgzMXgtPmRldiwKKwkJCQkiRmFpbGVkIHRvIHNldCBBVVhBREMgc291cmNlOiAlZFxuIiwgcmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJd204MzF4LT5hdXhhZGNfYWN0aXZlIHw9IDEgPDwgaW5wdXQ7CisJfQorCisJLyogV2UgY29udmVydCBhdCB0aGUgZmFzdGVzdCByYXRlIHBvc3NpYmxlICovCisJaWYgKGVuYSkgeworCQlyZXQgPSB3bTgzMXhfc2V0X2JpdHMod204MzF4LCBXTTgzMVhfQVVYQURDX0NPTlRST0wsCisJCQkJICAgICAgV004MzFYX0FVWF9DVlRfRU5BIHwKKwkJCQkgICAgICBXTTgzMVhfQVVYX1JBVEVfTUFTSywKKwkJCQkgICAgICBXTTgzMVhfQVVYX0NWVF9FTkEgfAorCQkJCSAgICAgIFdNODMxWF9BVVhfUkFURV9NQVNLKTsKKwkJaWYgKHJldCAhPSAwKSB7CisJCQlkZXZfZXJyKHdtODMxeC0+ZGV2LCAiRmFpbGVkIHRvIHN0YXJ0IEFVWEFEQzogJWRcbiIsCisJCQkJcmV0KTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJbXV0ZXhfdW5sb2NrKCZ3bTgzMXgtPmF1eGFkY19sb2NrKTsKKworCS8qIFdhaXQgZm9yIGFuIGludGVycnVwdCAqLworCXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmcmVxLT5kb25lLCBtc2Vjc190b19qaWZmaWVzKDUwMCkpOworCisJbXV0ZXhfbG9jaygmd204MzF4LT5hdXhhZGNfbG9jayk7CisKKwlsaXN0X2RlbCgmcmVxLT5saXN0KTsKKwlyZXQgPSByZXEtPnZhbDsKKworb3V0OgorCW11dGV4X3VubG9jaygmd204MzF4LT5hdXhhZGNfbG9jayk7CisKKwlrZnJlZShyZXEpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlycXJldHVybl90IHdtODMxeF9hdXhhZGNfaXJxKGludCBpcnEsIHZvaWQgKmlycV9kYXRhKQoreworCXN0cnVjdCB3bTgzMXggKndtODMxeCA9IGlycV9kYXRhOworCXN0cnVjdCB3bTgzMXhfYXV4YWRjX3JlcSAqcmVxOworCWludCByZXQsIGlucHV0LCB2YWw7CisKKwlyZXQgPSB3bTgzMXhfcmVnX3JlYWQod204MzF4LCBXTTgzMVhfQVVYQURDX0RBVEEpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIod204MzF4LT5kZXYsCisJCQkiRmFpbGVkIHRvIHJlYWQgQVVYQURDIGRhdGE6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gSVJRX05PTkU7CisJfQorCisJaW5wdXQgPSAoKHJldCAmIFdNODMxWF9BVVhfREFUQV9TUkNfTUFTSykKKwkJID4+IFdNODMxWF9BVVhfREFUQV9TUkNfU0hJRlQpIC0gMTsKKworCWlmIChpbnB1dCA9PSAxNCkKKwkJaW5wdXQgPSBXTTgzMVhfQVVYX0NBTDsKKworCXZhbCA9IHJldCAmIFdNODMxWF9BVVhfREFUQV9NQVNLOworCisJbXV0ZXhfbG9jaygmd204MzF4LT5hdXhhZGNfbG9jayk7CisKKwkvKiBEaXNhYmxlIHRoaXMgY29udmVyc2lvbiwgd2UncmUgYWJvdXQgdG8gY29tcGxldGUgYWxsIHVzZXJzICovCisJd204MzF4X3NldF9iaXRzKHdtODMxeCwgV004MzFYX0FVWEFEQ19TT1VSQ0UsCisJCQkxIDw8IGlucHV0LCAwKTsKKwl3bTgzMXgtPmF1eGFkY19hY3RpdmUgJj0gfigxIDw8IGlucHV0KTsKKworCS8qIFR1cm4gb2ZmIHRoZSBlbnRpcmUgY29udmVydG9yIGlmIGlkbGUgKi8KKwlpZiAoIXdtODMxeC0+YXV4YWRjX2FjdGl2ZSkKKwkJd204MzF4X3JlZ193cml0ZSh3bTgzMXgsIFdNODMxWF9BVVhBRENfQ09OVFJPTCwgMCk7CisKKwkvKiBXYWtlIHVwIGFueSB0aHJlYWRzIHdhaXRpbmcgZm9yIHRoaXMgcmVxdWVzdCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVxLCAmd204MzF4LT5hdXhhZGNfcGVuZGluZywgbGlzdCkgeworCQlpZiAocmVxLT5pbnB1dCA9PSBpbnB1dCkgeworCQkJcmVxLT52YWwgPSB2YWw7CisJCQljb21wbGV0ZSgmcmVxLT5kb25lKTsKKwkJfQorCX0KKworCW11dGV4X3VubG9jaygmd204MzF4LT5hdXhhZGNfbG9jayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQgd204MzF4X2F1eGFkY19yZWFkX3BvbGxlZChzdHJ1Y3Qgd204MzF4ICp3bTgzMXgsCisJCQkJICAgICBlbnVtIHdtODMxeF9hdXhhZGMgaW5wdXQpCit7CisJaW50IHJldCwgc3JjLCB0aW1lb3V0OworCisJbXV0ZXhfbG9jaygmd204MzF4LT5hdXhhZGNfbG9jayk7CisKKwlyZXQgPSB3bTgzMXhfc2V0X2JpdHMod204MzF4LCBXTTgzMVhfQVVYQURDX0NPTlRST0wsCisJCQkgICAgICBXTTgzMVhfQVVYX0VOQSwgV004MzFYX0FVWF9FTkEpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIod204MzF4LT5kZXYsICJGYWlsZWQgdG8gZW5hYmxlIEFVWEFEQzogJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFdlIGZvcmNlIGEgc2luZ2xlIHNvdXJjZSBhdCBwcmVzZW50ICovCisJc3JjID0gaW5wdXQ7CisJcmV0ID0gd204MzF4X3JlZ193cml0ZSh3bTgzMXgsIFdNODMxWF9BVVhBRENfU09VUkNFLAorCQkJICAgICAgIDEgPDwgc3JjKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHdtODMxeC0+ZGV2LCAiRmFpbGVkIHRvIHNldCBBVVhBREMgc291cmNlOiAlZFxuIiwgcmV0KTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gd204MzF4X3NldF9iaXRzKHdtODMxeCwgV004MzFYX0FVWEFEQ19DT05UUk9MLAorCQkJICAgICAgV004MzFYX0FVWF9DVlRfRU5BLCBXTTgzMVhfQVVYX0NWVF9FTkEpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIod204MzF4LT5kZXYsICJGYWlsZWQgdG8gc3RhcnQgQVVYQURDOiAlZFxuIiwgcmV0KTsKKwkJZ290byBkaXNhYmxlOworCX0KKworCS8qIElmIHdlJ3JlIG5vdCB1c2luZyBpbnRlcnJ1cHRzIHRoZW4gcG9sbCB0aGUKKwkgKiBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyICovCisJdGltZW91dCA9IDU7CisJd2hpbGUgKHRpbWVvdXQpIHsKKwkJbXNsZWVwKDEpOworCisJCXJldCA9IHdtODMxeF9yZWdfcmVhZCh3bTgzMXgsCisJCQkJICAgICAgV004MzFYX0lOVEVSUlVQVF9TVEFUVVNfMSk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlkZXZfZXJyKHdtODMxeC0+ZGV2LAorCQkJCSJJU1IgMSByZWFkIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCQlnb3RvIGRpc2FibGU7CisJCX0KKworCQkvKiBEaWQgaXQgY29tcGxldGU/ICovCisJCWlmIChyZXQgJiBXTTgzMVhfQVVYQURDX0RBVEFfRUlOVCkgeworCQkJd204MzF4X3JlZ193cml0ZSh3bTgzMXgsCisJCQkJCSBXTTgzMVhfSU5URVJSVVBUX1NUQVRVU18xLAorCQkJCQkgV004MzFYX0FVWEFEQ19EQVRBX0VJTlQpOworCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlkZXZfZXJyKHdtODMxeC0+ZGV2LAorCQkJCSJBVVhBREMgY29udmVyc2lvbiB0aW1lb3V0XG4iKTsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCWdvdG8gZGlzYWJsZTsKKwkJfQorCX0KKworCXJldCA9IHdtODMxeF9yZWdfcmVhZCh3bTgzMXgsIFdNODMxWF9BVVhBRENfREFUQSk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2Vycih3bTgzMXgtPmRldiwKKwkJCSJGYWlsZWQgdG8gcmVhZCBBVVhBREMgZGF0YTogJWRcbiIsIHJldCk7CisJCWdvdG8gZGlzYWJsZTsKKwl9CisKKwlzcmMgPSAoKHJldCAmIFdNODMxWF9BVVhfREFUQV9TUkNfTUFTSykKKwkgICAgICAgPj4gV004MzFYX0FVWF9EQVRBX1NSQ19TSElGVCkgLSAxOworCisJaWYgKHNyYyA9PSAxNCkKKwkJc3JjID0gV004MzFYX0FVWF9DQUw7CisKKwlpZiAoc3JjICE9IGlucHV0KSB7CisJCWRldl9lcnIod204MzF4LT5kZXYsICJEYXRhIGZyb20gc291cmNlICVkIG5vdCAlZFxuIiwKKwkJCXNyYywgaW5wdXQpOworCQlyZXQgPSAtRUlOVkFMOworCX0gZWxzZSB7CisJCXJldCAmPSBXTTgzMVhfQVVYX0RBVEFfTUFTSzsKKwl9CisKK2Rpc2FibGU6CisJd204MzF4X3NldF9iaXRzKHdtODMxeCwgV004MzFYX0FVWEFEQ19DT05UUk9MLCBXTTgzMVhfQVVYX0VOQSwgMCk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZ3bTgzMXgtPmF1eGFkY19sb2NrKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHdtODMxeF9hdXhhZGNfcmVhZDogUmVhZCBhIHZhbHVlIGZyb20gdGhlIFdNODMxeCBBVVhBREMKKyAqCisgKiBAd204MzF4OiBEZXZpY2UgdG8gcmVhZCBmcm9tLgorICogQGlucHV0OiBBVVhBREMgaW5wdXQgdG8gcmVhZC4KKyAqLworaW50IHdtODMxeF9hdXhhZGNfcmVhZChzdHJ1Y3Qgd204MzF4ICp3bTgzMXgsIGVudW0gd204MzF4X2F1eGFkYyBpbnB1dCkKK3sKKwlyZXR1cm4gd204MzF4LT5hdXhhZGNfcmVhZCh3bTgzMXgsIGlucHV0KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdtODMxeF9hdXhhZGNfcmVhZCk7CisKKy8qKgorICogd204MzF4X2F1eGFkY19yZWFkX3V2OiBSZWFkIGEgdm9sdGFnZSBmcm9tIHRoZSBXTTgzMXggQVVYQURDCisgKgorICogQHdtODMxeDogRGV2aWNlIHRvIHJlYWQgZnJvbS4KKyAqIEBpbnB1dDogQVVYQURDIGlucHV0IHRvIHJlYWQuCisgKi8KK2ludCB3bTgzMXhfYXV4YWRjX3JlYWRfdXYoc3RydWN0IHdtODMxeCAqd204MzF4LCBlbnVtIHdtODMxeF9hdXhhZGMgaW5wdXQpCit7CisJaW50IHJldDsKKworCXJldCA9IHdtODMxeF9hdXhhZGNfcmVhZCh3bTgzMXgsIGlucHV0KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCAqPSAxNDY1OworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHdtODMxeF9hdXhhZGNfcmVhZF91dik7CisKK3ZvaWQgd204MzF4X2F1eGFkY19pbml0KHN0cnVjdCB3bTgzMXggKndtODMxeCkKK3sKKwlpbnQgcmV0OworCisJbXV0ZXhfaW5pdCgmd204MzF4LT5hdXhhZGNfbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJndtODMxeC0+YXV4YWRjX3BlbmRpbmcpOworCisJaWYgKHdtODMxeC0+aXJxICYmIHdtODMxeC0+aXJxX2Jhc2UpIHsKKwkJd204MzF4LT5hdXhhZGNfcmVhZCA9IHdtODMxeF9hdXhhZGNfcmVhZF9pcnE7CisKKwkJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEod204MzF4LT5pcnFfYmFzZSArCisJCQkJCSAgIFdNODMxWF9JUlFfQVVYQURDX0RBVEEsCisJCQkJCSAgIE5VTEwsIHdtODMxeF9hdXhhZGNfaXJxLCAwLAorCQkJCQkgICAiYXV4YWRjIiwgd204MzF4KTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWRldl9lcnIod204MzF4LT5kZXYsICJBVVhBREMgSVJRIHJlcXVlc3QgZmFpbGVkOiAlZFxuIiwKKwkJCQlyZXQpOworCQkJd204MzF4LT5hdXhhZGNfcmVhZCA9IE5VTEw7CisJCX0KKwl9CisKKwlpZiAoIXdtODMxeC0+YXV4YWRjX3JlYWQpCisJCXdtODMxeC0+YXV4YWRjX3JlYWQgPSB3bTgzMXhfYXV4YWRjX3JlYWRfcG9sbGVkOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvd204MzF4LWNvcmUuYyBiL2RyaXZlcnMvbWZkL3dtODMxeC1jb3JlLmMKaW5kZXggMjY1Zjc1Zi4uMjgyZTc2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvd204MzF4LWNvcmUuYworKysgYi9kcml2ZXJzL21mZC93bTgzMXgtY29yZS5jCkBAIC0yOTUsNyArMjk1LDcgQEAKIAkJZ290byBvdXQ7CiAKIAlyICY9IH5tYXNrOwotCXIgfD0gdmFsOworCXIgfD0gdmFsICYgbWFzazsKIAogCXJldCA9IHdtODMxeF93cml0ZSh3bTgzMXgsIHJlZywgMiwgJnIpOwogCkBAIC0zMDYsMTQ2ICszMDYsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwod204MzF4X3NldF9iaXRzKTsKIAotLyoqCi0gKiB3bTgzMXhfYXV4YWRjX3JlYWQ6IFJlYWQgYSB2YWx1ZSBmcm9tIHRoZSBXTTgzMXggQVVYQURDCi0gKgotICogQHdtODMxeDogRGV2aWNlIHRvIHJlYWQgZnJvbS4KLSAqIEBpbnB1dDogQVVYQURDIGlucHV0IHRvIHJlYWQuCi0gKi8KLWludCB3bTgzMXhfYXV4YWRjX3JlYWQoc3RydWN0IHdtODMxeCAqd204MzF4LCBlbnVtIHdtODMxeF9hdXhhZGMgaW5wdXQpCi17Ci0JaW50IHJldCwgc3JjLCBpcnFfbWFza2VkLCB0aW1lb3V0OwotCi0JLyogQXJlIHdlIHVzaW5nIHRoZSBpbnRlcnJ1cHQ/ICovCi0JaXJxX21hc2tlZCA9IHdtODMxeF9yZWdfcmVhZCh3bTgzMXgsIFdNODMxWF9JTlRFUlJVUFRfU1RBVFVTXzFfTUFTSyk7Ci0JaXJxX21hc2tlZCAmPSBXTTgzMVhfQVVYQURDX0RBVEFfRUlOVDsKLQotCW11dGV4X2xvY2soJndtODMxeC0+YXV4YWRjX2xvY2spOwotCi0JcmV0ID0gd204MzF4X3NldF9iaXRzKHdtODMxeCwgV004MzFYX0FVWEFEQ19DT05UUk9MLAotCQkJICAgICAgV004MzFYX0FVWF9FTkEsIFdNODMxWF9BVVhfRU5BKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHdtODMxeC0+ZGV2LCAiRmFpbGVkIHRvIGVuYWJsZSBBVVhBREM6ICVkXG4iLCByZXQpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBXZSBmb3JjZSBhIHNpbmdsZSBzb3VyY2UgYXQgcHJlc2VudCAqLwotCXNyYyA9IGlucHV0OwotCXJldCA9IHdtODMxeF9yZWdfd3JpdGUod204MzF4LCBXTTgzMVhfQVVYQURDX1NPVVJDRSwKLQkJCSAgICAgICAxIDw8IHNyYyk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycih3bTgzMXgtPmRldiwgIkZhaWxlZCB0byBzZXQgQVVYQURDIHNvdXJjZTogJWRcbiIsIHJldCk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIENsZWFyIGFueSBub3RpZmljYXRpb24gZnJvbSBhIHZlcnkgbGF0ZSBhcnJpdmluZyBpbnRlcnJ1cHQgKi8KLQl0cnlfd2FpdF9mb3JfY29tcGxldGlvbigmd204MzF4LT5hdXhhZGNfZG9uZSk7Ci0KLQlyZXQgPSB3bTgzMXhfc2V0X2JpdHMod204MzF4LCBXTTgzMVhfQVVYQURDX0NPTlRST0wsCi0JCQkgICAgICBXTTgzMVhfQVVYX0NWVF9FTkEsIFdNODMxWF9BVVhfQ1ZUX0VOQSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJZGV2X2Vycih3bTgzMXgtPmRldiwgIkZhaWxlZCB0byBzdGFydCBBVVhBREM6ICVkXG4iLCByZXQpOwotCQlnb3RvIGRpc2FibGU7Ci0JfQotCi0JaWYgKGlycV9tYXNrZWQpIHsKLQkJLyogSWYgd2UncmUgbm90IHVzaW5nIGludGVycnVwdHMgdGhlbiBwb2xsIHRoZQotCQkgKiBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyICovCi0JCXRpbWVvdXQgPSA1OwotCQl3aGlsZSAodGltZW91dCkgewotCQkJbXNsZWVwKDEpOwotCi0JCQlyZXQgPSB3bTgzMXhfcmVnX3JlYWQod204MzF4LAotCQkJCQkgICAgICBXTTgzMVhfSU5URVJSVVBUX1NUQVRVU18xKTsKLQkJCWlmIChyZXQgPCAwKSB7Ci0JCQkJZGV2X2Vycih3bTgzMXgtPmRldiwKLQkJCQkJIklTUiAxIHJlYWQgZmFpbGVkOiAlZFxuIiwgcmV0KTsKLQkJCQlnb3RvIGRpc2FibGU7Ci0JCQl9Ci0KLQkJCS8qIERpZCBpdCBjb21wbGV0ZT8gKi8KLQkJCWlmIChyZXQgJiBXTTgzMVhfQVVYQURDX0RBVEFfRUlOVCkgewotCQkJCXdtODMxeF9yZWdfd3JpdGUod204MzF4LAotCQkJCQkJIFdNODMxWF9JTlRFUlJVUFRfU1RBVFVTXzEsCi0JCQkJCQkgV004MzFYX0FVWEFEQ19EQVRBX0VJTlQpOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQlkZXZfZXJyKHdtODMxeC0+ZGV2LAotCQkJCQkiQVVYQURDIGNvbnZlcnNpb24gdGltZW91dFxuIik7Ci0JCQkJcmV0ID0gLUVCVVNZOwotCQkJCWdvdG8gZGlzYWJsZTsKLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCS8qIElmIHdlIGFyZSB1c2luZyBpbnRlcnJ1cHRzIHRoZW4gd2FpdCBmb3IgdGhlCi0JCSAqIGludGVycnVwdCB0byBjb21wbGV0ZS4gIFVzZSBhbiBleHRyZW1lbHkgbG9uZwotCQkgKiB0aW1lb3V0IHRvIGhhbmRsZSBzaXR1YXRpb25zIHdpdGggaGVhdnkgbG9hZCB3aGVyZQotCQkgKiB0aGUgbm90aWZpY2F0aW9uIG9mIHRoZSBpbnRlcnJ1cHQgbWF5IGJlIGRlbGF5ZWQgYnkKLQkJICogdGhyZWFkZWQgSVJRIGhhbmRsaW5nLiAqLwotCQlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmd204MzF4LT5hdXhhZGNfZG9uZSwKLQkJCQkJCSBtc2Vjc190b19qaWZmaWVzKDUwMCkpKSB7Ci0JCQlkZXZfZXJyKHdtODMxeC0+ZGV2LCAiVGltZWQgb3V0IHdhaXRpbmcgZm9yIEFVWEFEQ1xuIik7Ci0JCQlyZXQgPSAtRUJVU1k7Ci0JCQlnb3RvIGRpc2FibGU7Ci0JCX0KLQl9Ci0KLQlyZXQgPSB3bTgzMXhfcmVnX3JlYWQod204MzF4LCBXTTgzMVhfQVVYQURDX0RBVEEpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIod204MzF4LT5kZXYsICJGYWlsZWQgdG8gcmVhZCBBVVhBREMgZGF0YTogJWRcbiIsIHJldCk7Ci0JfSBlbHNlIHsKLQkJc3JjID0gKChyZXQgJiBXTTgzMVhfQVVYX0RBVEFfU1JDX01BU0spCi0JCSAgICAgICA+PiBXTTgzMVhfQVVYX0RBVEFfU1JDX1NISUZUKSAtIDE7Ci0KLQkJaWYgKHNyYyA9PSAxNCkKLQkJCXNyYyA9IFdNODMxWF9BVVhfQ0FMOwotCi0JCWlmIChzcmMgIT0gaW5wdXQpIHsKLQkJCWRldl9lcnIod204MzF4LT5kZXYsICJEYXRhIGZyb20gc291cmNlICVkIG5vdCAlZFxuIiwKLQkJCQlzcmMsIGlucHV0KTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXQgJj0gV004MzFYX0FVWF9EQVRBX01BU0s7Ci0JCX0KLQl9Ci0KLWRpc2FibGU6Ci0Jd204MzF4X3NldF9iaXRzKHdtODMxeCwgV004MzFYX0FVWEFEQ19DT05UUk9MLCBXTTgzMVhfQVVYX0VOQSwgMCk7Ci1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZ3bTgzMXgtPmF1eGFkY19sb2NrKTsKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTF9HUEwod204MzF4X2F1eGFkY19yZWFkKTsKLQotc3RhdGljIGlycXJldHVybl90IHdtODMxeF9hdXhhZGNfaXJxKGludCBpcnEsIHZvaWQgKmlycV9kYXRhKQotewotCXN0cnVjdCB3bTgzMXggKndtODMxeCA9IGlycV9kYXRhOwotCi0JY29tcGxldGUoJndtODMxeC0+YXV4YWRjX2RvbmUpOwotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKioKLSAqIHdtODMxeF9hdXhhZGNfcmVhZF91djogUmVhZCBhIHZvbHRhZ2UgZnJvbSB0aGUgV004MzF4IEFVWEFEQwotICoKLSAqIEB3bTgzMXg6IERldmljZSB0byByZWFkIGZyb20uCi0gKiBAaW5wdXQ6IEFVWEFEQyBpbnB1dCB0byByZWFkLgotICovCi1pbnQgd204MzF4X2F1eGFkY19yZWFkX3V2KHN0cnVjdCB3bTgzMXggKndtODMxeCwgZW51bSB3bTgzMXhfYXV4YWRjIGlucHV0KQotewotCWludCByZXQ7Ci0KLQlyZXQgPSB3bTgzMXhfYXV4YWRjX3JlYWQod204MzF4LCBpbnB1dCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgKj0gMTQ2NTsKLQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh3bTgzMXhfYXV4YWRjX3JlYWRfdXYpOwotCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHdtODMxeF9kY2RjMV9yZXNvdXJjZXNbXSA9IHsKIAl7CiAJCS5zdGFydCA9IFdNODMxWF9EQzFfQ09OVFJPTF8xLApAQCAtODcyLDYgKzczMiw5IEBACiAJCS5yZXNvdXJjZXMgPSB3bTgzMXhfZGNkYzRfcmVzb3VyY2VzLAogCX0sCiAJeworCQkubmFtZSA9ICJ3bTgzMXgtY2xrIiwKKwl9LAorCXsKIAkJLm5hbWUgPSAid204MzF4LWVwZSIsCiAJCS5pZCA9IDEsCiAJfSwKQEAgLTk3NiwxMSArODM5LDYgQEAKIAkJLnJlc291cmNlcyA9IHdtODMxeF9wb3dlcl9yZXNvdXJjZXMsCiAJfSwKIAl7Ci0JCS5uYW1lID0gIndtODMxeC1ydGMiLAotCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUod204MzF4X3J0Y19yZXNvdXJjZXMpLAotCQkucmVzb3VyY2VzID0gd204MzF4X3J0Y19yZXNvdXJjZXMsCi0JfSwKLQl7CiAJCS5uYW1lID0gIndtODMxeC1zdGF0dXMiLAogCQkuaWQgPSAxLAogCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUod204MzF4X3N0YXR1czFfcmVzb3VyY2VzKSwKQEAgLTEwMjgsNiArODg2LDkgQEAKIAkJLnJlc291cmNlcyA9IHdtODMxeF9kY2RjNF9yZXNvdXJjZXMsCiAJfSwKIAl7CisJCS5uYW1lID0gIndtODMxeC1jbGsiLAorCX0sCisJewogCQkubmFtZSA9ICJ3bTgzMXgtZXBlIiwKIAkJLmlkID0gMSwKIAl9LApAQCAtMTEwOCwxMSArOTY5LDYgQEAKIAkJLnJlc291cmNlcyA9IHdtODMxeF9wb3dlcl9yZXNvdXJjZXMsCiAJfSwKIAl7Ci0JCS5uYW1lID0gIndtODMxeC1ydGMiLAotCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUod204MzF4X3J0Y19yZXNvdXJjZXMpLAotCQkucmVzb3VyY2VzID0gd204MzF4X3J0Y19yZXNvdXJjZXMsCi0JfSwKLQl7CiAJCS5uYW1lID0gIndtODMxeC1zdGF0dXMiLAogCQkuaWQgPSAxLAogCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUod204MzF4X3N0YXR1czFfcmVzb3VyY2VzKSwKQEAgLTExMjUsMTEgKzk4MSw2IEBACiAJCS5yZXNvdXJjZXMgPSB3bTgzMXhfc3RhdHVzMl9yZXNvdXJjZXMsCiAJfSwKIAl7Ci0JCS5uYW1lID0gIndtODMxeC10b3VjaCIsCi0JCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfdG91Y2hfcmVzb3VyY2VzKSwKLQkJLnJlc291cmNlcyA9IHdtODMxeF90b3VjaF9yZXNvdXJjZXMsCi0JfSwKLQl7CiAJCS5uYW1lID0gIndtODMxeC13YXRjaGRvZyIsCiAJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfd2R0X3Jlc291cmNlcyksCiAJCS5yZXNvdXJjZXMgPSB3bTgzMXhfd2R0X3Jlc291cmNlcywKQEAgLTExNjUsNiArMTAxNiw5IEBACiAJCS5yZXNvdXJjZXMgPSB3bTgzMXhfZGNkYzRfcmVzb3VyY2VzLAogCX0sCiAJeworCQkubmFtZSA9ICJ3bTgzMXgtY2xrIiwKKwl9LAorCXsKIAkJLm5hbWUgPSAid204MzF4LWVwZSIsCiAJCS5pZCA9IDEsCiAJfSwKQEAgLTEyNjksMTEgKzExMjMsNiBAQAogCQkucmVzb3VyY2VzID0gd204MzF4X3Bvd2VyX3Jlc291cmNlcywKIAl9LAogCXsKLQkJLm5hbWUgPSAid204MzF4LXJ0YyIsCi0JCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfcnRjX3Jlc291cmNlcyksCi0JCS5yZXNvdXJjZXMgPSB3bTgzMXhfcnRjX3Jlc291cmNlcywKLQl9LAotCXsKIAkJLm5hbWUgPSAid204MzF4LXN0YXR1cyIsCiAJCS5pZCA9IDEsCiAJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfc3RhdHVzMV9yZXNvdXJjZXMpLApAQCAtMTI4NiwxMSArMTEzNSw2IEBACiAJCS5yZXNvdXJjZXMgPSB3bTgzMXhfc3RhdHVzMl9yZXNvdXJjZXMsCiAJfSwKIAl7Ci0JCS5uYW1lID0gIndtODMxeC10b3VjaCIsCi0JCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfdG91Y2hfcmVzb3VyY2VzKSwKLQkJLnJlc291cmNlcyA9IHdtODMxeF90b3VjaF9yZXNvdXJjZXMsCi0JfSwKLQl7CiAJCS5uYW1lID0gIndtODMxeC13YXRjaGRvZyIsCiAJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfd2R0X3Jlc291cmNlcyksCiAJCS5yZXNvdXJjZXMgPSB3bTgzMXhfd2R0X3Jlc291cmNlcywKQEAgLTEzMjYsNiArMTE3MCw5IEBACiAJCS5yZXNvdXJjZXMgPSB3bTgzMjBfZGNkYzRfYnVja19yZXNvdXJjZXMsCiAJfSwKIAl7CisJCS5uYW1lID0gIndtODMxeC1jbGsiLAorCX0sCisJewogCQkubmFtZSA9ICJ3bTgzMXgtZ3BpbyIsCiAJCS5udW1fcmVzb3VyY2VzID0gQVJSQVlfU0laRSh3bTgzMXhfZ3Bpb19yZXNvdXJjZXMpLAogCQkucmVzb3VyY2VzID0gd204MzF4X2dwaW9fcmVzb3VyY2VzLApAQCAtMTQwNSwxMSArMTI1Miw2IEBACiAJCS5yZXNvdXJjZXMgPSB3bTgzMXhfb25fcmVzb3VyY2VzLAogCX0sCiAJewotCQkubmFtZSA9ICJ3bTgzMXgtcnRjIiwKLQkJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHdtODMxeF9ydGNfcmVzb3VyY2VzKSwKLQkJLnJlc291cmNlcyA9IHdtODMxeF9ydGNfcmVzb3VyY2VzLAotCX0sCi0JewogCQkubmFtZSA9ICJ3bTgzMXgtc3RhdHVzIiwKIAkJLmlkID0gMSwKIAkJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHdtODMxeF9zdGF0dXMxX3Jlc291cmNlcyksCkBAIC0xNDI4LDYgKzEyNzAsMjIgQEAKIAl9LAogfTsKIAorc3RhdGljIHN0cnVjdCBtZmRfY2VsbCB0b3VjaF9kZXZzW10gPSB7CisJeworCQkubmFtZSA9ICJ3bTgzMXgtdG91Y2giLAorCQkubnVtX3Jlc291cmNlcyA9IEFSUkFZX1NJWkUod204MzF4X3RvdWNoX3Jlc291cmNlcyksCisJCS5yZXNvdXJjZXMgPSB3bTgzMXhfdG91Y2hfcmVzb3VyY2VzLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IG1mZF9jZWxsIHJ0Y19kZXZzW10gPSB7CisJeworCQkubmFtZSA9ICJ3bTgzMXgtcnRjIiwKKwkJLm51bV9yZXNvdXJjZXMgPSBBUlJBWV9TSVpFKHdtODMxeF9ydGNfcmVzb3VyY2VzKSwKKwkJLnJlc291cmNlcyA9IHdtODMxeF9ydGNfcmVzb3VyY2VzLAorCX0sCit9OworCiBzdGF0aWMgc3RydWN0IG1mZF9jZWxsIGJhY2tsaWdodF9kZXZzW10gPSB7CiAJewogCQkubmFtZSA9ICJ3bTgzMXgtYmFja2xpZ2h0IiwKQEAgLTE0NDAsMTQgKzEyOTgsMTIgQEAKIGludCB3bTgzMXhfZGV2aWNlX2luaXQoc3RydWN0IHdtODMxeCAqd204MzF4LCB1bnNpZ25lZCBsb25nIGlkLCBpbnQgaXJxKQogewogCXN0cnVjdCB3bTgzMXhfcGRhdGEgKnBkYXRhID0gd204MzF4LT5kZXYtPnBsYXRmb3JtX2RhdGE7Ci0JaW50IHJldjsKKwlpbnQgcmV2LCB3bTgzMXhfbnVtOwogCWVudW0gd204MzF4X3BhcmVudCBwYXJlbnQ7CiAJaW50IHJldCwgaTsKIAogCW11dGV4X2luaXQoJndtODMxeC0+aW9fbG9jayk7CiAJbXV0ZXhfaW5pdCgmd204MzF4LT5rZXlfbG9jayk7Ci0JbXV0ZXhfaW5pdCgmd204MzF4LT5hdXhhZGNfbG9jayk7Ci0JaW5pdF9jb21wbGV0aW9uKCZ3bTgzMXgtPmF1eGFkY19kb25lKTsKIAlkZXZfc2V0X2RydmRhdGEod204MzF4LT5kZXYsIHdtODMxeCk7CiAKIAlyZXQgPSB3bTgzMXhfcmVnX3JlYWQod204MzF4LCBXTTgzMVhfUEFSRU5UX0lEKTsKQEAgLTE1OTIsNDUgKzE0NDgsNTEgQEAKIAkJfQogCX0KIAorCS8qIE11bHRpcGx5IGJ5IDEwIGFzIHdlIGhhdmUgbWFueSBzdWJkZXZpY2VzIG9mIHRoZSBzYW1lIHR5cGUgKi8KKwlpZiAocGRhdGEgJiYgcGRhdGEtPndtODMxeF9udW0pCisJCXdtODMxeF9udW0gPSBwZGF0YS0+d204MzF4X251bSAqIDEwOworCWVsc2UKKwkJd204MzF4X251bSA9IC0xOworCiAJcmV0ID0gd204MzF4X2lycV9pbml0KHdtODMxeCwgaXJxKTsKIAlpZiAocmV0ICE9IDApCiAJCWdvdG8gZXJyOwogCi0JaWYgKHdtODMxeC0+aXJxX2Jhc2UpIHsKLQkJcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEod204MzF4LT5pcnFfYmFzZSArCi0JCQkJCSAgIFdNODMxWF9JUlFfQVVYQURDX0RBVEEsCi0JCQkJCSAgIE5VTEwsIHdtODMxeF9hdXhhZGNfaXJxLCAwLAotCQkJCQkgICAiYXV4YWRjIiwgd204MzF4KTsKLQkJaWYgKHJldCA8IDApCi0JCQlkZXZfZXJyKHdtODMxeC0+ZGV2LCAiQVVYQURDIElSUSByZXF1ZXN0IGZhaWxlZDogJWRcbiIsCi0JCQkJcmV0KTsKLQl9CisJd204MzF4X2F1eGFkY19pbml0KHdtODMxeCk7CiAKIAkvKiBUaGUgY29yZSBkZXZpY2UgaXMgdXAsIGluc3RhbnRpYXRlIHRoZSBzdWJkZXZpY2VzLiAqLwogCXN3aXRjaCAocGFyZW50KSB7CiAJY2FzZSBXTTgzMTA6Ci0JCXJldCA9IG1mZF9hZGRfZGV2aWNlcyh3bTgzMXgtPmRldiwgLTEsCisJCXJldCA9IG1mZF9hZGRfZGV2aWNlcyh3bTgzMXgtPmRldiwgd204MzF4X251bSwKIAkJCQkgICAgICB3bTgzMTBfZGV2cywgQVJSQVlfU0laRSh3bTgzMTBfZGV2cyksCiAJCQkJICAgICAgTlVMTCwgd204MzF4LT5pcnFfYmFzZSk7CiAJCWJyZWFrOwogCiAJY2FzZSBXTTgzMTE6Ci0JCXJldCA9IG1mZF9hZGRfZGV2aWNlcyh3bTgzMXgtPmRldiwgLTEsCisJCXJldCA9IG1mZF9hZGRfZGV2aWNlcyh3bTgzMXgtPmRldiwgd204MzF4X251bSwKIAkJCQkgICAgICB3bTgzMTFfZGV2cywgQVJSQVlfU0laRSh3bTgzMTFfZGV2cyksCiAJCQkJICAgICAgTlVMTCwgd204MzF4LT5pcnFfYmFzZSk7CisJCWlmICghcGRhdGEgfHwgIXBkYXRhLT5kaXNhYmxlX3RvdWNoKQorCQkJbWZkX2FkZF9kZXZpY2VzKHdtODMxeC0+ZGV2LCB3bTgzMXhfbnVtLAorCQkJCQl0b3VjaF9kZXZzLCBBUlJBWV9TSVpFKHRvdWNoX2RldnMpLAorCQkJCQlOVUxMLCB3bTgzMXgtPmlycV9iYXNlKTsKIAkJYnJlYWs7CiAKIAljYXNlIFdNODMxMjoKLQkJcmV0ID0gbWZkX2FkZF9kZXZpY2VzKHdtODMxeC0+ZGV2LCAtMSwKKwkJcmV0ID0gbWZkX2FkZF9kZXZpY2VzKHdtODMxeC0+ZGV2LCB3bTgzMXhfbnVtLAogCQkJCSAgICAgIHdtODMxMl9kZXZzLCBBUlJBWV9TSVpFKHdtODMxMl9kZXZzKSwKIAkJCQkgICAgICBOVUxMLCB3bTgzMXgtPmlycV9iYXNlKTsKKwkJaWYgKCFwZGF0YSB8fCAhcGRhdGEtPmRpc2FibGVfdG91Y2gpCisJCQltZmRfYWRkX2RldmljZXMod204MzF4LT5kZXYsIHdtODMxeF9udW0sCisJCQkJCXRvdWNoX2RldnMsIEFSUkFZX1NJWkUodG91Y2hfZGV2cyksCisJCQkJCU5VTEwsIHdtODMxeC0+aXJxX2Jhc2UpOwogCQlicmVhazsKIAogCWNhc2UgV004MzIwOgogCWNhc2UgV004MzIxOgogCWNhc2UgV004MzI1OgogCWNhc2UgV004MzI2OgotCQlyZXQgPSBtZmRfYWRkX2RldmljZXMod204MzF4LT5kZXYsIC0xLAorCQlyZXQgPSBtZmRfYWRkX2RldmljZXMod204MzF4LT5kZXYsIHdtODMxeF9udW0sCiAJCQkJICAgICAgd204MzIwX2RldnMsIEFSUkFZX1NJWkUod204MzIwX2RldnMpLAogCQkJCSAgICAgIE5VTEwsIHdtODMxeC0+aXJxX2Jhc2UpOwogCQlicmVhazsKQEAgLTE2NDUsOSArMTUwNywzMCBAQAogCQlnb3RvIGVycl9pcnE7CiAJfQogCisJLyogVGhlIFJUQyBjYW4gb25seSBiZSB1c2VkIGlmIHRoZSAzMi43NjhrSHogY3J5c3RhbCBpcworCSAqIGVuYWJsZWQ7IHRoaXMgY2FuJ3QgYmUgY29udHJvbGxlZCBieSBzb2Z0d2FyZSBhdCBydW50aW1lLgorCSAqLworCXJldCA9IHdtODMxeF9yZWdfcmVhZCh3bTgzMXgsIFdNODMxWF9DTE9DS19DT05UUk9MXzIpOworCWlmIChyZXQgPCAwKSB7CisJCWRldl9lcnIod204MzF4LT5kZXYsICJGYWlsZWQgdG8gcmVhZCBjbG9jayBzdGF0dXM6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9pcnE7CisJfQorCisJaWYgKHJldCAmIFdNODMxWF9YVEFMX0VOQSkgeworCQlyZXQgPSBtZmRfYWRkX2RldmljZXMod204MzF4LT5kZXYsIHdtODMxeF9udW0sCisJCQkJICAgICAgcnRjX2RldnMsIEFSUkFZX1NJWkUocnRjX2RldnMpLAorCQkJCSAgICAgIE5VTEwsIHdtODMxeC0+aXJxX2Jhc2UpOworCQlpZiAocmV0ICE9IDApIHsKKwkJCWRldl9lcnIod204MzF4LT5kZXYsICJGYWlsZWQgdG8gYWRkIFJUQzogJWRcbiIsIHJldCk7CisJCQlnb3RvIGVycl9pcnE7CisJCX0KKwl9IGVsc2UgeworCQlkZXZfaW5mbyh3bTgzMXgtPmRldiwgIjMyLjc2OGtIeiBjbG9jayBkaXNhYmxlZCwgbm8gUlRDXG4iKTsKKwl9CisKIAlpZiAocGRhdGEgJiYgcGRhdGEtPmJhY2tsaWdodCkgewogCQkvKiBUcmVhdCBlcnJvcnMgYXMgbm9uLWNyaXRpY2FsICovCi0JCXJldCA9IG1mZF9hZGRfZGV2aWNlcyh3bTgzMXgtPmRldiwgLTEsIGJhY2tsaWdodF9kZXZzLAorCQlyZXQgPSBtZmRfYWRkX2RldmljZXMod204MzF4LT5kZXYsIHdtODMxeF9udW0sIGJhY2tsaWdodF9kZXZzLAogCQkJCSAgICAgIEFSUkFZX1NJWkUoYmFja2xpZ2h0X2RldnMpLCBOVUxMLAogCQkJCSAgICAgIHdtODMxeC0+aXJxX2Jhc2UpOwogCQlpZiAocmV0IDwgMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3dtODMxeC1pcnEuYyBiL2RyaXZlcnMvbWZkL3dtODMxeC1pcnEuYwppbmRleCA0MmI5MjhlLi5hZGExODM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC93bTgzMXgtaXJxLmMKKysrIGIvZHJpdmVycy9tZmQvd204MzF4LWlycS5jCkBAIC0zNDgsNiArMzQ4LDE1IEBACiAJc3RydWN0IHdtODMxeCAqd204MzF4ID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZGF0YSk7CiAJaW50IGk7CiAKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTgzMXgtPmdwaW9fdXBkYXRlKTsgaSsrKSB7CisJCWlmICh3bTgzMXgtPmdwaW9fdXBkYXRlW2ldKSB7CisJCQl3bTgzMXhfc2V0X2JpdHMod204MzF4LCBXTTgzMVhfR1BJTzFfQ09OVFJPTCArIGksCisJCQkJCVdNODMxWF9HUE5fSU5UX01PREUgfCBXTTgzMVhfR1BOX1BPTCwKKwkJCQkJd204MzF4LT5ncGlvX3VwZGF0ZVtpXSk7CisJCQl3bTgzMXgtPmdwaW9fdXBkYXRlW2ldID0gMDsKKwkJfQorCX0KKwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODMxeC0+aXJxX21hc2tzX2N1cik7IGkrKykgewogCQkvKiBJZiB0aGVyZSdzIGJlZW4gYSBjaGFuZ2UgaW4gdGhlIG1hc2sgd3JpdGUgaXQgYmFjawogCQkgKiB0byB0aGUgaGFyZHdhcmUuICovCkBAIC0zODcsNyArMzk2LDcgQEAKIHN0YXRpYyBpbnQgd204MzF4X2lycV9zZXRfdHlwZShzdHJ1Y3QgaXJxX2RhdGEgKmRhdGEsIHVuc2lnbmVkIGludCB0eXBlKQogewogCXN0cnVjdCB3bTgzMXggKndtODMxeCA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGRhdGEpOwotCWludCB2YWwsIGlycTsKKwlpbnQgaXJxOwogCiAJaXJxID0gZGF0YS0+aXJxIC0gd204MzF4LT5pcnFfYmFzZTsKIApAQCAtMzk5LDIyICs0MDgsMzAgQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCX0KIAorCS8qIFJlYmFzZSB0aGUgSVJRIGludG8gdGhlIEdQSU8gcmFuZ2Ugc28gd2UndmUgZ290IGEgc2Vuc2libGUgYXJyYXkKKwkgKiBpbmRleC4KKwkgKi8KKwlpcnEgLT0gV004MzFYX0lSUV9HUElPXzE7CisKKwkvKiBXZSBzZXQgdGhlIGhpZ2ggYml0IHRvIGZsYWcgdGhhdCB3ZSBuZWVkIGFuIHVwZGF0ZTsgZG9uJ3QKKwkgKiBkbyB0aGUgdXBkYXRlIGhlcmUgYXMgd2UgY2FuIGJlIGNhbGxlZCB3aXRoIHRoZSBidXMgbG9jaworCSAqIGhlbGQuCisJICovCiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBJUlFfVFlQRV9FREdFX0JPVEg6Ci0JCXZhbCA9IFdNODMxWF9HUE5fSU5UX01PREU7CisJCXdtODMxeC0+Z3Bpb191cGRhdGVbaXJxXSA9IDB4MTAwMDAgfCBXTTgzMVhfR1BOX0lOVF9NT0RFOwogCQlicmVhazsKIAljYXNlIElSUV9UWVBFX0VER0VfUklTSU5HOgotCQl2YWwgPSBXTTgzMVhfR1BOX1BPTDsKKwkJd204MzF4LT5ncGlvX3VwZGF0ZVtpcnFdID0gMHgxMDAwMCB8IFdNODMxWF9HUE5fUE9MOwogCQlicmVhazsKIAljYXNlIElSUV9UWVBFX0VER0VfRkFMTElORzoKLQkJdmFsID0gMDsKKwkJd204MzF4LT5ncGlvX3VwZGF0ZVtpcnFdID0gMHgxMDAwMDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JcmV0dXJuIHdtODMxeF9zZXRfYml0cyh3bTgzMXgsIFdNODMxWF9HUElPMV9DT05UUk9MICsgaXJxLAotCQkJICAgICAgIFdNODMxWF9HUE5fSU5UX01PREUgfCBXTTgzMVhfR1BOX1BPTCwgdmFsKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCB3bTgzMXhfaXJxX2NoaXAgPSB7CkBAIC00MzIsNyArNDQ5LDcgQEAKIHsKIAlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBkYXRhOwogCXVuc2lnbmVkIGludCBpOwotCWludCBwcmltYXJ5OworCWludCBwcmltYXJ5LCBzdGF0dXNfYWRkcjsKIAlpbnQgc3RhdHVzX3JlZ3NbV004MzFYX05VTV9JUlFfUkVHU10gPSB7IDAgfTsKIAlpbnQgcmVhZFtXTTgzMVhfTlVNX0lSUV9SRUdTXSA9IHsgMCB9OwogCWludCAqc3RhdHVzOwpAQCAtNDY3LDggKzQ4NCw5IEBACiAJCS8qIEhvcGVmdWxseSB0aGVyZSBzaG91bGQgb25seSBiZSBvbmUgcmVnaXN0ZXIgdG8gcmVhZAogCQkgKiBlYWNoIHRpbWUgb3RoZXJ3aXNlIHdlIG91Z2h0IHRvIGRvIGEgYmxvY2sgcmVhZC4gKi8KIAkJaWYgKCFyZWFkW29mZnNldF0pIHsKLQkJCSpzdGF0dXMgPSB3bTgzMXhfcmVnX3JlYWQod204MzF4LAotCQkJCSAgICAgaXJxX2RhdGFfdG9fc3RhdHVzX3JlZygmd204MzF4X2lycXNbaV0pKTsKKwkJCXN0YXR1c19hZGRyID0gaXJxX2RhdGFfdG9fc3RhdHVzX3JlZygmd204MzF4X2lycXNbaV0pOworCisJCQkqc3RhdHVzID0gd204MzF4X3JlZ19yZWFkKHdtODMxeCwgc3RhdHVzX2FkZHIpOwogCQkJaWYgKCpzdGF0dXMgPCAwKSB7CiAJCQkJZGV2X2Vycih3bTgzMXgtPmRldiwKIAkJCQkJIkZhaWxlZCB0byByZWFkIElSUSBzdGF0dXM6ICVkXG4iLApAQCAtNDc3LDI2ICs0OTUsMjEgQEAKIAkJCX0KIAogCQkJcmVhZFtvZmZzZXRdID0gMTsKKworCQkJLyogSWdub3JlIGFueSBiaXRzIHRoYXQgd2UgZG9uJ3QgdGhpbmsgYXJlIG1hc2tlZCAqLworCQkJKnN0YXR1cyAmPSB+d204MzF4LT5pcnFfbWFza3NfY3VyW29mZnNldF07CisKKwkJCS8qIEFja25vd2xlZGdlIG5vdyBzbyB3ZSBkb24ndCBtaXNzCisJCQkgKiBub3RpZmljYXRpb25zIHdoaWxlIHdlIGhhbmRsZS4KKwkJCSAqLworCQkJd204MzF4X3JlZ193cml0ZSh3bTgzMXgsIHN0YXR1c19hZGRyLCAqc3RhdHVzKTsKIAkJfQogCi0JCS8qIFJlcG9ydCBpdCBpZiBpdCBpc24ndCBtYXNrZWQsIG9yIGZvcmdldCB0aGUgc3RhdHVzLiAqLwotCQlpZiAoKCpzdGF0dXMgJiB+d204MzF4LT5pcnFfbWFza3NfY3VyW29mZnNldF0pCi0JCSAgICAmIHdtODMxeF9pcnFzW2ldLm1hc2spCisJCWlmICgqc3RhdHVzICYgd204MzF4X2lycXNbaV0ubWFzaykKIAkJCWhhbmRsZV9uZXN0ZWRfaXJxKHdtODMxeC0+aXJxX2Jhc2UgKyBpKTsKLQkJZWxzZQotCQkJKnN0YXR1cyAmPSB+d204MzF4X2lycXNbaV0ubWFzazsKIAl9CiAKIG91dDoKLQkvKiBUb3VjaHNjcmVlbiBpbnRlcnJ1cHRzIGFyZSBoYW5kbGVkIHNwZWNpYWxseSBpbiB0aGUgZHJpdmVyICovCi0Jc3RhdHVzX3JlZ3NbMF0gJj0gfihXTTgzMVhfVENIREFUQV9FSU5UIHwgV004MzFYX1RDSFBEX0VJTlQpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoc3RhdHVzX3JlZ3MpOyBpKyspIHsKLQkJaWYgKHN0YXR1c19yZWdzW2ldKQotCQkJd204MzF4X3JlZ193cml0ZSh3bTgzMXgsIFdNODMxWF9JTlRFUlJVUFRfU1RBVFVTXzEgKyBpLAotCQkJCQkgc3RhdHVzX3JlZ3NbaV0pOwotCX0KLQogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtNTE1LDEzICs1MjgsMjIgQEAKIAkJCQkgMHhmZmZmKTsKIAl9CiAKLQlpZiAoIXBkYXRhIHx8ICFwZGF0YS0+aXJxX2Jhc2UpIHsKLQkJZGV2X2Vycih3bTgzMXgtPmRldiwKLQkJCSJObyBpbnRlcnJ1cHQgYmFzZSBzcGVjaWZpZWQsIG5vIGludGVycnVwdHNcbiIpOworCS8qIFRyeSB0byBkeW5hbWljYWxseSBhbGxvY2F0ZSBJUlFzIGlmIG5vIGJhc2UgaXMgc3BlY2lmaWVkICovCisJaWYgKCFwZGF0YSB8fCAhcGRhdGEtPmlycV9iYXNlKQorCQl3bTgzMXgtPmlycV9iYXNlID0gLTE7CisJZWxzZQorCQl3bTgzMXgtPmlycV9iYXNlID0gcGRhdGEtPmlycV9iYXNlOworCisJd204MzF4LT5pcnFfYmFzZSA9IGlycV9hbGxvY19kZXNjcyh3bTgzMXgtPmlycV9iYXNlLCAwLAorCQkJCQkgICBXTTgzMVhfTlVNX0lSUVMsIDApOworCWlmICh3bTgzMXgtPmlycV9iYXNlIDwgMCkgeworCQlkZXZfd2Fybih3bTgzMXgtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBJUlFzOiAlZFxuIiwKKwkJCSB3bTgzMXgtPmlycV9iYXNlKTsKKwkJd204MzF4LT5pcnFfYmFzZSA9IDA7CiAJCXJldHVybiAwOwogCX0KIAotCWlmIChwZGF0YS0+aXJxX2Ntb3MpCisJaWYgKHBkYXRhICYmIHBkYXRhLT5pcnFfY21vcykKIAkJaSA9IDA7CiAJZWxzZQogCQlpID0gV004MzFYX0lSUV9PRDsKQEAgLTU0MSw3ICs1NjMsNiBAQAogCX0KIAogCXdtODMxeC0+aXJxID0gaXJxOwotCXdtODMxeC0+aXJxX2Jhc2UgPSBwZGF0YS0+aXJxX2Jhc2U7CiAKIAkvKiBSZWdpc3RlciB0aGVtIHdpdGggZ2VuaXJxICovCiAJZm9yIChjdXJfaXJxID0gd204MzF4LT5pcnFfYmFzZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3dtODM1MC1pcnEuYyBiL2RyaXZlcnMvbWZkL3dtODM1MC1pcnEuYwppbmRleCBlZDRiMjJhLi44YTFmYWZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC93bTgzNTAtaXJxLmMKKysrIGIvZHJpdmVycy9tZmQvd204MzUwLWlycS5jCkBAIC00NzMsMTcgKzQ3MywxMyBAQAogewogCWludCByZXQsIGN1cl9pcnEsIGk7CiAJaW50IGZsYWdzID0gSVJRRl9PTkVTSE9UOworCWludCBpcnFfYmFzZSA9IC0xOwogCiAJaWYgKCFpcnEpIHsKIAkJZGV2X3dhcm4od204MzUwLT5kZXYsICJObyBpbnRlcnJ1cHQgc3VwcG9ydCwgbm8gY29yZSBJUlFcbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKLQlpZiAoIXBkYXRhIHx8ICFwZGF0YS0+aXJxX2Jhc2UpIHsKLQkJZGV2X3dhcm4od204MzUwLT5kZXYsICJObyBpbnRlcnJ1cHQgc3VwcG9ydCwgbm8gSVJRIGJhc2VcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KIAkvKiBNYXNrIHRvcCBsZXZlbCBpbnRlcnJ1cHRzICovCiAJd204MzUwX3JlZ193cml0ZSh3bTgzNTAsIFdNODM1MF9TWVNURU1fSU5URVJSVVBUU19NQVNLLCAweEZGRkYpOwogCkBAIC01MDIsNyArNDk4LDE3IEBACiAJd204MzUwLT5jaGlwX2lycSA9IGlycTsKIAl3bTgzNTAtPmlycV9iYXNlID0gcGRhdGEtPmlycV9iYXNlOwogCi0JaWYgKHBkYXRhLT5pcnFfaGlnaCkgeworCWlmIChwZGF0YSAmJiBwZGF0YS0+aXJxX2Jhc2UgPiAwKQorCQlpcnFfYmFzZSA9IHBkYXRhLT5pcnFfYmFzZTsKKworCXdtODM1MC0+aXJxX2Jhc2UgPSBpcnFfYWxsb2NfZGVzY3MoaXJxX2Jhc2UsIDAsIEFSUkFZX1NJWkUod204MzUwX2lycXMpLCAwKTsKKwlpZiAod204MzUwLT5pcnFfYmFzZSA8IDApIHsKKwkJZGV2X3dhcm4od204MzUwLT5kZXYsICJBbGxvY2F0aW5nIGlycXMgZmFpbGVkIHdpdGggJWRcbiIsCisJCQl3bTgzNTAtPmlycV9iYXNlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHBkYXRhICYmIHBkYXRhLT5pcnFfaGlnaCkgewogCQlmbGFncyB8PSBJUlFGX1RSSUdHRVJfSElHSDsKIAogCQl3bTgzNTBfc2V0X2JpdHMod204MzUwLCBXTTgzNTBfU1lTVEVNX0NPTlRST0xfMSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3dtODk5NC1jb3JlLmMgYi9kcml2ZXJzL21mZC93bTg5OTQtY29yZS5jCmluZGV4IGUxOThkNDAuLjk2NDc5YzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3dtODk5NC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvd204OTk0LWNvcmUuYwpAQCAtMzE2LDcgKzMxNiw3IEBACiBzdGF0aWMgaW50IHdtODk5NF9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCB3bTg5OTQgKndtODk5NCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCWludCByZXQ7CisJaW50IHJldCwgaTsKIAogCS8qIFdlIG1heSBoYXZlIGxpZWQgdG8gdGhlIFBNIGNvcmUgYWJvdXQgc3VzcGVuZGluZyAqLwogCWlmICghd204OTk0LT5zdXNwZW5kZWQpCkBAIC0zMjksMTAgKzMyOSwxNiBAQAogCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldCA9IHdtODk5NF93cml0ZSh3bTg5OTQsIFdNODk5NF9JTlRFUlJVUFRfU1RBVFVTXzFfTUFTSywKLQkJCSAgIFdNODk5NF9OVU1fSVJRX1JFR1MgKiAyLCAmd204OTk0LT5pcnFfbWFza3NfY3VyKTsKLQlpZiAocmV0IDwgMCkKLQkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gcmVzdG9yZSBpbnRlcnJ1cHQgbWFza3M6ICVkXG4iLCByZXQpOworCS8qIFdyaXRlIHJlZ2lzdGVyIGF0IGEgdGltZSBhcyB3ZSB1c2UgdGhlIGNhY2hlIG9uIHRoZSBDUFUgc28gc3RvcmUKKwkgKiBpdCBpbiBuYXRpdmUgZW5kaWFuLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHdtODk5NC0+aXJxX21hc2tzX2N1cik7IGkrKykgeworCQlyZXQgPSB3bTg5OTRfcmVnX3dyaXRlKHdtODk5NCwgV004OTk0X0lOVEVSUlVQVF9TVEFUVVNfMV9NQVNLCisJCQkJICAgICAgICsgaSwgd204OTk0LT5pcnFfbWFza3NfY3VyW2ldKTsKKwkJaWYgKHJldCA8IDApCisJCQlkZXZfZXJyKGRldiwgIkZhaWxlZCB0byByZXN0b3JlIGludGVycnVwdCBtYXNrczogJWRcbiIsCisJCQkJcmV0KTsKKwl9CiAKIAlyZXQgPSB3bTg5OTRfd3JpdGUod204OTk0LCBXTTg5OTRfTERPXzEsIFdNODk5NF9OVU1fTERPX1JFR1MgKiAyLAogCQkJICAgJndtODk5NC0+bGRvX3JlZ3MpOwpAQCAtNDAzLDcgKzQwOSw3IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUJVRygpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJZ290byBlcnI7CiAJfQogCiAJd204OTk0LT5zdXBwbGllcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhKSAqCkBAIC00MjUsNyArNDMxLDcgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQlVHKCk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlnb3RvIGVycjsKIAl9CiAJCQogCXJldCA9IHJlZ3VsYXRvcl9idWxrX2dldCh3bTg5OTQtPmRldiwgd204OTk0LT5udW1fc3VwcGxpZXMsCkBAIC00NzYsMTMgKzQ4MiwxOCBAQAogCQlnb3RvIGVycl9lbmFibGU7CiAJfQogCi0Jc3dpdGNoIChyZXQpIHsKLQljYXNlIDA6Ci0JY2FzZSAxOgotCQlpZiAod204OTk0LT50eXBlID09IFdNODk5NCkKKwlzd2l0Y2ggKHdtODk5NC0+dHlwZSkgeworCWNhc2UgV004OTk0OgorCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIDA6CisJCWNhc2UgMToKIAkJCWRldl93YXJuKHdtODk5NC0+ZGV2LAogCQkJCSAicmV2aXNpb24gJWMgbm90IGZ1bGx5IHN1cHBvcnRlZFxuIiwKIAkJCQkgJ0EnICsgcmV0KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC93bTg5OTQtaXJxLmMgYi9kcml2ZXJzL21mZC93bTg5OTQtaXJxLmMKaW5kZXggNzFjNmU4Zi4uZDY4MmY3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvd204OTk0LWlycS5jCisrKyBiL2RyaXZlcnMvbWZkL3dtODk5NC1pcnEuYwpAQCAtMjMxLDEyICsyMzEsNiBAQAogCQlzdGF0dXNbaV0gJj0gfndtODk5NC0+aXJxX21hc2tzX2N1cltpXTsKIAl9CiAKLQkvKiBSZXBvcnQgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh3bTg5OTRfaXJxcyk7IGkrKykgewotCQlpZiAoc3RhdHVzW3dtODk5NF9pcnFzW2ldLnJlZyAtIDFdICYgd204OTk0X2lycXNbaV0ubWFzaykKLQkJCWhhbmRsZV9uZXN0ZWRfaXJxKHdtODk5NC0+aXJxX2Jhc2UgKyBpKTsKLQl9Ci0KIAkvKiBBY2sgYW55IHVubWFza2VkIElSUXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdGF0dXMpOyBpKyspIHsKIAkJaWYgKHN0YXR1c1tpXSkKQEAgLTI0NCw2ICsyMzgsMTIgQEAKIAkJCQkJIHN0YXR1c1tpXSk7CiAJfQogCisJLyogUmVwb3J0ICovCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUod204OTk0X2lycXMpOyBpKyspIHsKKwkJaWYgKHN0YXR1c1t3bTg5OTRfaXJxc1tpXS5yZWcgLSAxXSAmIHdtODk5NF9pcnFzW2ldLm1hc2spCisJCQloYW5kbGVfbmVzdGVkX2lycSh3bTg5OTQtPmlycV9iYXNlICsgaSk7CisJfQorCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWVzZGhjLWlteC5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1lc2RoYy1pbXguYwppbmRleCA3MTBiNzA2Li45ZWJmYjRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWVzZGhjLWlteC5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktZXNkaGMtaW14LmMKQEAgLTIwLDcgKzIwLDkgQEAKICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9tbWMuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpby5oPgotI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KICNpbmNsdWRlIDxtYWNoL2VzZGhjLmg+CiAjaW5jbHVkZSAic2RoY2ktcGx0Zm0uaCIKICNpbmNsdWRlICJzZGhjaS1lc2RoYy5oIgpAQCAtMjksNyArMzEsNiBAQAogI2RlZmluZSBTREhDSV9WRU5ET1JfU1BFQwkJMHhDMAogI2RlZmluZSAgU0RIQ0lfVkVORE9SX1NQRUNfU0RJT19RVUlSSwkweDAwMDAwMDAyCiAKLSNkZWZpbmUgRVNESENfRkxBR19HUElPX0ZPUl9DRAkJKDEgPDwgMCkKIC8qCiAgKiBUaGUgQ01EVFlQRSBvZiB0aGUgQ01EIHJlZ2lzdGVyIChvZmZzZXQgMHhFKSBzaG91bGQgYmUgc2V0IHRvCiAgKiAiMTEiIHdoZW4gdGhlIFNUT1AgQ01EMTIgaXMgaXNzdWVkIG9uIGlteDUzIHRvIGFib3J0IG9uZQpAQCAtNDMsMTEgKzQ0LDY4IEBACiAgKi8KICNkZWZpbmUgRVNESENfRkxBR19NVUxUSUJMS19OT19JTlQJKDEgPDwgMSkKIAorZW51bSBpbXhfZXNkaGNfdHlwZSB7CisJSU1YMjVfRVNESEMsCisJSU1YMzVfRVNESEMsCisJSU1YNTFfRVNESEMsCisJSU1YNTNfRVNESEMsCit9OworCiBzdHJ1Y3QgcGx0Zm1faW14X2RhdGEgewogCWludCBmbGFnczsKIAl1MzIgc2NyYXRjaHBhZDsKKwllbnVtIGlteF9lc2RoY190eXBlIGRldnR5cGU7CisJc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgYm9hcmRkYXRhOwogfTsKIAorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgaW14X2VzZGhjX2RldnR5cGVbXSA9IHsKKwl7CisJCS5uYW1lID0gInNkaGNpLWVzZGhjLWlteDI1IiwKKwkJLmRyaXZlcl9kYXRhID0gSU1YMjVfRVNESEMsCisJfSwgeworCQkubmFtZSA9ICJzZGhjaS1lc2RoYy1pbXgzNSIsCisJCS5kcml2ZXJfZGF0YSA9IElNWDM1X0VTREhDLAorCX0sIHsKKwkJLm5hbWUgPSAic2RoY2ktZXNkaGMtaW14NTEiLAorCQkuZHJpdmVyX2RhdGEgPSBJTVg1MV9FU0RIQywKKwl9LCB7CisJCS5uYW1lID0gInNkaGNpLWVzZGhjLWlteDUzIiwKKwkJLmRyaXZlcl9kYXRhID0gSU1YNTNfRVNESEMsCisJfSwgeworCQkvKiBzZW50aW5lbCAqLworCX0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBsYXRmb3JtLCBpbXhfZXNkaGNfZGV2dHlwZSk7CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGlteF9lc2RoY19kdF9pZHNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXgyNS1lc2RoYyIsIC5kYXRhID0gJmlteF9lc2RoY19kZXZ0eXBlW0lNWDI1X0VTREhDXSwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXgzNS1lc2RoYyIsIC5kYXRhID0gJmlteF9lc2RoY19kZXZ0eXBlW0lNWDM1X0VTREhDXSwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg1MS1lc2RoYyIsIC5kYXRhID0gJmlteF9lc2RoY19kZXZ0eXBlW0lNWDUxX0VTREhDXSwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXg1My1lc2RoYyIsIC5kYXRhID0gJmlteF9lc2RoY19kZXZ0eXBlW0lNWDUzX0VTREhDXSwgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBpbXhfZXNkaGNfZHRfaWRzKTsKKworc3RhdGljIGlubGluZSBpbnQgaXNfaW14MjVfZXNkaGMoc3RydWN0IHBsdGZtX2lteF9kYXRhICpkYXRhKQoreworCXJldHVybiBkYXRhLT5kZXZ0eXBlID09IElNWDI1X0VTREhDOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19pbXgzNV9lc2RoYyhzdHJ1Y3QgcGx0Zm1faW14X2RhdGEgKmRhdGEpCit7CisJcmV0dXJuIGRhdGEtPmRldnR5cGUgPT0gSU1YMzVfRVNESEM7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2lteDUxX2VzZGhjKHN0cnVjdCBwbHRmbV9pbXhfZGF0YSAqZGF0YSkKK3sKKwlyZXR1cm4gZGF0YS0+ZGV2dHlwZSA9PSBJTVg1MV9FU0RIQzsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfaW14NTNfZXNkaGMoc3RydWN0IHBsdGZtX2lteF9kYXRhICpkYXRhKQoreworCXJldHVybiBkYXRhLT5kZXZ0eXBlID09IElNWDUzX0VTREhDOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgZXNkaGNfY2xyc2V0X2xlKHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0LCB1MzIgbWFzaywgdTMyIHZhbCwgaW50IHJlZykKIHsKIAl2b2lkIF9faW9tZW0gKmJhc2UgPSBob3N0LT5pb2FkZHIgKyAocmVnICYgfjB4Myk7CkBAIC02MCwxNyArMTE4LDE0IEBACiB7CiAJc3RydWN0IHNkaGNpX3BsdGZtX2hvc3QgKnBsdGZtX2hvc3QgPSBzZGhjaV9wcml2KGhvc3QpOwogCXN0cnVjdCBwbHRmbV9pbXhfZGF0YSAqaW14X2RhdGEgPSBwbHRmbV9ob3N0LT5wcml2OworCXN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhICpib2FyZGRhdGEgPSAmaW14X2RhdGEtPmJvYXJkZGF0YTsKIAotCS8qIGZha2UgQ0FSRF9QUkVTRU5UIGZsYWcgb24gbXgyNS8zNSAqLworCS8qIGZha2UgQ0FSRF9QUkVTRU5UIGZsYWcgKi8KIAl1MzIgdmFsID0gcmVhZGwoaG9zdC0+aW9hZGRyICsgcmVnKTsKIAogCWlmICh1bmxpa2VseSgocmVnID09IFNESENJX1BSRVNFTlRfU1RBVEUpCi0JCQkmJiAoaW14X2RhdGEtPmZsYWdzICYgRVNESENfRkxBR19HUElPX0ZPUl9DRCkpKSB7Ci0JCXN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhICpib2FyZGRhdGEgPQotCQkJCWhvc3QtPm1tYy0+cGFyZW50LT5wbGF0Zm9ybV9kYXRhOwotCi0JCWlmIChib2FyZGRhdGEgJiYgZ3Bpb19pc192YWxpZChib2FyZGRhdGEtPmNkX2dwaW8pCi0JCQkJJiYgZ3Bpb19nZXRfdmFsdWUoYm9hcmRkYXRhLT5jZF9ncGlvKSkKKwkJCSYmIGdwaW9faXNfdmFsaWQoYm9hcmRkYXRhLT5jZF9ncGlvKSkpIHsKKwkJaWYgKGdwaW9fZ2V0X3ZhbHVlKGJvYXJkZGF0YS0+Y2RfZ3BpbykpCiAJCQkvKiBubyBjYXJkLCBpZiBhIHZhbGlkIGdwaW8gc2F5cyBzby4uLiAqLwogCQkJdmFsICY9IH5TREhDSV9DQVJEX1BSRVNFTlQ7CiAJCWVsc2UKQEAgLTg1LDEyICsxNDAsMTIgQEAKIHsKIAlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdCA9IHNkaGNpX3ByaXYoaG9zdCk7CiAJc3RydWN0IHBsdGZtX2lteF9kYXRhICppbXhfZGF0YSA9IHBsdGZtX2hvc3QtPnByaXY7CisJc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgKmJvYXJkZGF0YSA9ICZpbXhfZGF0YS0+Ym9hcmRkYXRhOwogCiAJaWYgKHVubGlrZWx5KChyZWcgPT0gU0RIQ0lfSU5UX0VOQUJMRSB8fCByZWcgPT0gU0RIQ0lfU0lHTkFMX0VOQUJMRSkKLQkJCSYmIChpbXhfZGF0YS0+ZmxhZ3MgJiBFU0RIQ19GTEFHX0dQSU9fRk9SX0NEKSkpCisJCQkmJiAoYm9hcmRkYXRhLT5jZF90eXBlID09IEVTREhDX0NEX0dQSU8pKSkKIAkJLyoKIAkJICogdGhlc2UgaW50ZXJydXB0cyB3b24ndCB3b3JrIHdpdGggYSBjdXN0b20gY2FyZF9kZXRlY3QgZ3BpbwotCQkgKiAob25seSBhcHBsaWVkIHRvIG14MjUvMzUpCiAJCSAqLwogCQl2YWwgJj0gfihTREhDSV9JTlRfQ0FSRF9SRU1PVkUgfCBTREhDSV9JTlRfQ0FSRF9JTlNFUlQpOwogCkBAIC0xNzMsNiArMjI4LDE3IEBACiAJCXJldHVybjsKIAl9CiAJZXNkaGNfY2xyc2V0X2xlKGhvc3QsIDB4ZmYsIHZhbCwgcmVnKTsKKworCS8qCisJICogVGhlIGVzZGhjIGhhcyBhIGRlc2lnbiB2aW9sYXRpb24gdG8gU0RIQyBzcGVjIHdoaWNoIHRlbGxzCisJICogdGhhdCBzb2Z0d2FyZSByZXNldCBzaG91bGQgbm90IGFmZmVjdCBjYXJkIGRldGVjdGlvbiBjaXJjdWl0LgorCSAqIEJ1dCBlc2RoYyBjbGVhcnMgaXRzIFNZU0NUTCByZWdpc3RlciBiaXRzIFswLi4yXSBkdXJpbmcgdGhlCisJICogc29mdHdhcmUgcmVzZXQuICBUaGlzIHdpbGwgc3RvcCB0aG9zZSBjbG9ja3MgdGhhdCBjYXJkIGRldGVjdGlvbgorCSAqIGNpcmN1aXQgcmVsaWVzIG9uLiAgVG8gd29yayBhcm91bmQgaXQsIHdlIHR1cm4gdGhlIGNsb2NrcyBvbiBiYWNrCisJICogdG8ga2VlcCBjYXJkIGRldGVjdGlvbiBjaXJjdWl0IGZ1bmN0aW9uYWwuCisJICovCisJaWYgKChyZWcgPT0gU0RIQ0lfU09GVFdBUkVfUkVTRVQpICYmICh2YWwgJiAxKSkKKwkJZXNkaGNfY2xyc2V0X2xlKGhvc3QsIDB4NywgMHg3LCBFU0RIQ19TWVNURU1fQ09OVFJPTCk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgZXNkaGNfcGx0Zm1fZ2V0X21heF9jbG9jayhzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCkKQEAgLTE4OSw2ICsyNTUsMjYgQEAKIAlyZXR1cm4gY2xrX2dldF9yYXRlKHBsdGZtX2hvc3QtPmNsaykgLyAyNTYgLyAxNjsKIH0KIAorc3RhdGljIHVuc2lnbmVkIGludCBlc2RoY19wbHRmbV9nZXRfcm8oc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QpCit7CisJc3RydWN0IHNkaGNpX3BsdGZtX2hvc3QgKnBsdGZtX2hvc3QgPSBzZGhjaV9wcml2KGhvc3QpOworCXN0cnVjdCBwbHRmbV9pbXhfZGF0YSAqaW14X2RhdGEgPSBwbHRmbV9ob3N0LT5wcml2OworCXN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhICpib2FyZGRhdGEgPSAmaW14X2RhdGEtPmJvYXJkZGF0YTsKKworCXN3aXRjaCAoYm9hcmRkYXRhLT53cF90eXBlKSB7CisJY2FzZSBFU0RIQ19XUF9HUElPOgorCQlpZiAoZ3Bpb19pc192YWxpZChib2FyZGRhdGEtPndwX2dwaW8pKQorCQkJcmV0dXJuIGdwaW9fZ2V0X3ZhbHVlKGJvYXJkZGF0YS0+d3BfZ3Bpbyk7CisJY2FzZSBFU0RIQ19XUF9DT05UUk9MTEVSOgorCQlyZXR1cm4gIShyZWFkbChob3N0LT5pb2FkZHIgKyBTREhDSV9QUkVTRU5UX1NUQVRFKSAmCisJCQkgICAgICAgU0RIQ0lfV1JJVEVfUFJPVEVDVCk7CisJY2FzZSBFU0RIQ19XUF9OT05FOgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gLUVOT1NZUzsKK30KKwogc3RhdGljIHN0cnVjdCBzZGhjaV9vcHMgc2RoY2lfZXNkaGNfb3BzID0gewogCS5yZWFkX2wgPSBlc2RoY19yZWFkbF9sZSwKIAkucmVhZF93ID0gZXNkaGNfcmVhZHdfbGUsCkBAIC0xOTgsNiArMjg0LDcgQEAKIAkuc2V0X2Nsb2NrID0gZXNkaGNfc2V0X2Nsb2NrLAogCS5nZXRfbWF4X2Nsb2NrID0gZXNkaGNfcGx0Zm1fZ2V0X21heF9jbG9jaywKIAkuZ2V0X21pbl9jbG9jayA9IGVzZGhjX3BsdGZtX2dldF9taW5fY2xvY2ssCisJLmdldF9ybyA9IGVzZGhjX3BsdGZtX2dldF9ybywKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc2RoY2lfcGx0Zm1fZGF0YSBzZGhjaV9lc2RoY19pbXhfcGRhdGEgPSB7CkBAIC0yMDcsMTcgKzI5NCw2IEBACiAJLm9wcyA9ICZzZGhjaV9lc2RoY19vcHMsCiB9OwogCi1zdGF0aWMgdW5zaWduZWQgaW50IGVzZGhjX3BsdGZtX2dldF9ybyhzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCkKLXsKLQlzdHJ1Y3QgZXNkaGNfcGxhdGZvcm1fZGF0YSAqYm9hcmRkYXRhID0KLQkJCWhvc3QtPm1tYy0+cGFyZW50LT5wbGF0Zm9ybV9kYXRhOwotCi0JaWYgKGJvYXJkZGF0YSAmJiBncGlvX2lzX3ZhbGlkKGJvYXJkZGF0YS0+d3BfZ3BpbykpCi0JCXJldHVybiBncGlvX2dldF92YWx1ZShib2FyZGRhdGEtPndwX2dwaW8pOwotCWVsc2UKLQkJcmV0dXJuIC1FTk9TWVM7Ci19Ci0KIHN0YXRpYyBpcnFyZXR1cm5fdCBjZF9pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgc2RoY2lfaG9zdCAqc2Rob3N0ID0gKHN0cnVjdCBzZGhjaV9ob3N0ICopZGF0YTsKQEAgLTIyNiw4ICszMDIsNDggQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9OwogCisjaWZkZWYgQ09ORklHX09GCitzdGF0aWMgaW50IF9fZGV2aW5pdAorc2RoY2lfZXNkaGNfaW14X3Byb2JlX2R0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkgc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgKmJvYXJkZGF0YSkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisKKwlpZiAoIW5wKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJmc2wsY2FyZC13aXJlZCIsIE5VTEwpKQorCQlib2FyZGRhdGEtPmNkX3R5cGUgPSBFU0RIQ19DRF9QRVJNQU5FTlQ7CisKKwlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZnNsLGNkLWNvbnRyb2xsZXIiLCBOVUxMKSkKKwkJYm9hcmRkYXRhLT5jZF90eXBlID0gRVNESENfQ0RfQ09OVFJPTExFUjsKKworCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJmc2wsd3AtY29udHJvbGxlciIsIE5VTEwpKQorCQlib2FyZGRhdGEtPndwX3R5cGUgPSBFU0RIQ19XUF9DT05UUk9MTEVSOworCisJYm9hcmRkYXRhLT5jZF9ncGlvID0gb2ZfZ2V0X25hbWVkX2dwaW8obnAsICJjZC1ncGlvcyIsIDApOworCWlmIChncGlvX2lzX3ZhbGlkKGJvYXJkZGF0YS0+Y2RfZ3BpbykpCisJCWJvYXJkZGF0YS0+Y2RfdHlwZSA9IEVTREhDX0NEX0dQSU87CisKKwlib2FyZGRhdGEtPndwX2dwaW8gPSBvZl9nZXRfbmFtZWRfZ3BpbyhucCwgIndwLWdwaW9zIiwgMCk7CisJaWYgKGdwaW9faXNfdmFsaWQoYm9hcmRkYXRhLT53cF9ncGlvKSkKKwkJYm9hcmRkYXRhLT53cF90eXBlID0gRVNESENfV1BfR1BJTzsKKworCXJldHVybiAwOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50CitzZGhjaV9lc2RoY19pbXhfcHJvYmVfZHQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCSBzdHJ1Y3QgZXNkaGNfcGxhdGZvcm1fZGF0YSAqYm9hcmRkYXRhKQoreworCXJldHVybiAtRU5PREVWOworfQorI2VuZGlmCisKIHN0YXRpYyBpbnQgX19kZXZpbml0IHNkaGNpX2VzZGhjX2lteF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2lkID0KKwkJCW9mX21hdGNoX2RldmljZShpbXhfZXNkaGNfZHRfaWRzLCAmcGRldi0+ZGV2KTsKIAlzdHJ1Y3Qgc2RoY2lfcGx0Zm1faG9zdCAqcGx0Zm1faG9zdDsKIAlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdDsKIAlzdHJ1Y3QgZXNkaGNfcGxhdGZvcm1fZGF0YSAqYm9hcmRkYXRhOwpAQCAtMjQyLDggKzM1OCwxNCBAQAogCXBsdGZtX2hvc3QgPSBzZGhjaV9wcml2KGhvc3QpOwogCiAJaW14X2RhdGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcGx0Zm1faW14X2RhdGEpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWlteF9kYXRhKQotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoIWlteF9kYXRhKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2lteF9kYXRhOworCX0KKworCWlmIChvZl9pZCkKKwkJcGRldi0+aWRfZW50cnkgPSBvZl9pZC0+ZGF0YTsKKwlpbXhfZGF0YS0+ZGV2dHlwZSA9IHBkZXYtPmlkX2VudHJ5LT5kcml2ZXJfZGF0YTsKIAlwbHRmbV9ob3N0LT5wcml2ID0gaW14X2RhdGE7CiAKIAljbGsgPSBjbGtfZ2V0KG1tY19kZXYoaG9zdC0+bW1jKSwgTlVMTCk7CkBAIC0yNTUsNTAgKzM3Nyw3MiBAQAogCWNsa19lbmFibGUoY2xrKTsKIAlwbHRmbV9ob3N0LT5jbGsgPSBjbGs7CiAKLQlpZiAoIWNwdV9pc19teDI1KCkpCisJaWYgKCFpc19pbXgyNV9lc2RoYyhpbXhfZGF0YSkpCiAJCWhvc3QtPnF1aXJrcyB8PSBTREhDSV9RVUlSS19CUk9LRU5fVElNRU9VVF9WQUw7CiAKLQlpZiAoY3B1X2lzX214MjUoKSB8fCBjcHVfaXNfbXgzNSgpKSB7CisJaWYgKGlzX2lteDI1X2VzZGhjKGlteF9kYXRhKSB8fCBpc19pbXgzNV9lc2RoYyhpbXhfZGF0YSkpCiAJCS8qIEZpeCBlcnJhdGEgRU5HY20wNzIwNyBwcmVzZW50IG9uIGkuTVgyNSBhbmQgaS5NWDM1ICovCiAJCWhvc3QtPnF1aXJrcyB8PSBTREhDSV9RVUlSS19OT19NVUxUSUJMT0NLOwotCQkvKiB3cml0ZV9wcm90ZWN0IGNhbid0IGJlIHJvdXRlZCB0byBjb250cm9sbGVyLCB1c2UgZ3BpbyAqLwotCQlzZGhjaV9lc2RoY19vcHMuZ2V0X3JvID0gZXNkaGNfcGx0Zm1fZ2V0X3JvOwotCX0KIAotCWlmICghKGNwdV9pc19teDI1KCkgfHwgY3B1X2lzX214MzUoKSB8fCBjcHVfaXNfbXg1MSgpKSkKKwlpZiAoaXNfaW14NTNfZXNkaGMoaW14X2RhdGEpKQogCQlpbXhfZGF0YS0+ZmxhZ3MgfD0gRVNESENfRkxBR19NVUxUSUJMS19OT19JTlQ7CiAKLQlib2FyZGRhdGEgPSBob3N0LT5tbWMtPnBhcmVudC0+cGxhdGZvcm1fZGF0YTsKLQlpZiAoYm9hcmRkYXRhKSB7CisJYm9hcmRkYXRhID0gJmlteF9kYXRhLT5ib2FyZGRhdGE7CisJaWYgKHNkaGNpX2VzZGhjX2lteF9wcm9iZV9kdChwZGV2LCBib2FyZGRhdGEpIDwgMCkgeworCQlpZiAoIWhvc3QtPm1tYy0+cGFyZW50LT5wbGF0Zm9ybV9kYXRhKSB7CisJCQlkZXZfZXJyKG1tY19kZXYoaG9zdC0+bW1jKSwgIm5vIGJvYXJkIGRhdGEhXG4iKTsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIG5vX2JvYXJkX2RhdGE7CisJCX0KKwkJaW14X2RhdGEtPmJvYXJkZGF0YSA9ICooKHN0cnVjdCBlc2RoY19wbGF0Zm9ybV9kYXRhICopCisJCQkJCWhvc3QtPm1tYy0+cGFyZW50LT5wbGF0Zm9ybV9kYXRhKTsKKwl9CisKKwkvKiB3cml0ZV9wcm90ZWN0ICovCisJaWYgKGJvYXJkZGF0YS0+d3BfdHlwZSA9PSBFU0RIQ19XUF9HUElPKSB7CiAJCWVyciA9IGdwaW9fcmVxdWVzdF9vbmUoYm9hcmRkYXRhLT53cF9ncGlvLCBHUElPRl9JTiwgIkVTREhDX1dQIik7CiAJCWlmIChlcnIpIHsKIAkJCWRldl93YXJuKG1tY19kZXYoaG9zdC0+bW1jKSwKLQkJCQkibm8gd3JpdGUtcHJvdGVjdCBwaW4gYXZhaWxhYmxlIVxuIik7Ci0JCQlib2FyZGRhdGEtPndwX2dwaW8gPSBlcnI7CisJCQkJICJubyB3cml0ZS1wcm90ZWN0IHBpbiBhdmFpbGFibGUhXG4iKTsKKwkJCWJvYXJkZGF0YS0+d3BfZ3BpbyA9IC1FSU5WQUw7CiAJCX0KKwl9IGVsc2UgeworCQlib2FyZGRhdGEtPndwX2dwaW8gPSAtRUlOVkFMOworCX0KIAorCS8qIGNhcmRfZGV0ZWN0ICovCisJaWYgKGJvYXJkZGF0YS0+Y2RfdHlwZSAhPSBFU0RIQ19DRF9HUElPKQorCQlib2FyZGRhdGEtPmNkX2dwaW8gPSAtRUlOVkFMOworCisJc3dpdGNoIChib2FyZGRhdGEtPmNkX3R5cGUpIHsKKwljYXNlIEVTREhDX0NEX0dQSU86CiAJCWVyciA9IGdwaW9fcmVxdWVzdF9vbmUoYm9hcmRkYXRhLT5jZF9ncGlvLCBHUElPRl9JTiwgIkVTREhDX0NEIik7CiAJCWlmIChlcnIpIHsKLQkJCWRldl93YXJuKG1tY19kZXYoaG9zdC0+bW1jKSwKKwkJCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLAogCQkJCSJubyBjYXJkLWRldGVjdCBwaW4gYXZhaWxhYmxlIVxuIik7CiAJCQlnb3RvIG5vX2NhcmRfZGV0ZWN0X3BpbjsKIAkJfQogCi0JCS8qIGkuTVg1eCBoYXMgaXNzdWVzIHRvIGJlIHJlc2VhcmNoZWQgKi8KLQkJaWYgKCFjcHVfaXNfbXgyNSgpICYmICFjcHVfaXNfbXgzNSgpKQotCQkJZ290byBub3Rfc3VwcG9ydGVkOwotCiAJCWVyciA9IHJlcXVlc3RfaXJxKGdwaW9fdG9faXJxKGJvYXJkZGF0YS0+Y2RfZ3BpbyksIGNkX2lycSwKIAkJCQkgSVJRRl9UUklHR0VSX0ZBTExJTkcgfCBJUlFGX1RSSUdHRVJfUklTSU5HLAogCQkJCSBtbWNfaG9zdG5hbWUoaG9zdC0+bW1jKSwgaG9zdCk7CiAJCWlmIChlcnIpIHsKLQkJCWRldl93YXJuKG1tY19kZXYoaG9zdC0+bW1jKSwgInJlcXVlc3QgaXJxIGVycm9yXG4iKTsKKwkJCWRldl9lcnIobW1jX2Rldihob3N0LT5tbWMpLCAicmVxdWVzdCBpcnEgZXJyb3JcbiIpOwogCQkJZ290byBub19jYXJkX2RldGVjdF9pcnE7CiAJCX0KKwkJLyogZmFsbCB0aHJvdWdoICovCiAKLQkJaW14X2RhdGEtPmZsYWdzIHw9IEVTREhDX0ZMQUdfR1BJT19GT1JfQ0Q7Ci0JCS8qIE5vdyB3ZSBoYXZlIGEgd29ya2luZyBjYXJkX2RldGVjdCBhZ2FpbiAqLworCWNhc2UgRVNESENfQ0RfQ09OVFJPTExFUjoKKwkJLyogd2UgaGF2ZSBhIHdvcmtpbmcgY2FyZF9kZXRlY3QgYmFjayAqLwogCQlob3N0LT5xdWlya3MgJj0gflNESENJX1FVSVJLX0JST0tFTl9DQVJEX0RFVEVDVElPTjsKKwkJYnJlYWs7CisKKwljYXNlIEVTREhDX0NEX1BFUk1BTkVOVDoKKwkJaG9zdC0+bW1jLT5jYXBzID0gTU1DX0NBUF9OT05SRU1PVkFCTEU7CisJCWJyZWFrOworCisJY2FzZSBFU0RIQ19DRF9OT05FOgorCQlicmVhazsKIAl9CiAKIAllcnIgPSBzZGhjaV9hZGRfaG9zdChob3N0KTsKQEAgLTMwNywxNiArNDUxLDIxIEBACiAKIAlyZXR1cm4gMDsKIAotIG5vX2NhcmRfZGV0ZWN0X2lycToKLQlncGlvX2ZyZWUoYm9hcmRkYXRhLT5jZF9ncGlvKTsKLSBub19jYXJkX2RldGVjdF9waW46Ci0JYm9hcmRkYXRhLT5jZF9ncGlvID0gZXJyOwotIG5vdF9zdXBwb3J0ZWQ6Ci0Ja2ZyZWUoaW14X2RhdGEpOwotIGVycl9hZGRfaG9zdDoKK2Vycl9hZGRfaG9zdDoKKwlpZiAoZ3Bpb19pc192YWxpZChib2FyZGRhdGEtPmNkX2dwaW8pKQorCQlmcmVlX2lycShncGlvX3RvX2lycShib2FyZGRhdGEtPmNkX2dwaW8pLCBob3N0KTsKK25vX2NhcmRfZGV0ZWN0X2lycToKKwlpZiAoZ3Bpb19pc192YWxpZChib2FyZGRhdGEtPmNkX2dwaW8pKQorCQlncGlvX2ZyZWUoYm9hcmRkYXRhLT5jZF9ncGlvKTsKKwlpZiAoZ3Bpb19pc192YWxpZChib2FyZGRhdGEtPndwX2dwaW8pKQorCQlncGlvX2ZyZWUoYm9hcmRkYXRhLT53cF9ncGlvKTsKK25vX2NhcmRfZGV0ZWN0X3BpbjoKK25vX2JvYXJkX2RhdGE6CiAJY2xrX2Rpc2FibGUocGx0Zm1faG9zdC0+Y2xrKTsKIAljbGtfcHV0KHBsdGZtX2hvc3QtPmNsayk7Ci0gZXJyX2Nsa19nZXQ6CitlcnJfY2xrX2dldDoKKwlrZnJlZShpbXhfZGF0YSk7CitlcnJfaW14X2RhdGE6CiAJc2RoY2lfcGx0Zm1fZnJlZShwZGV2KTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMzI1LDIwICs0NzQsMTggQEAKIHsKIAlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9ob3N0ID0gc2RoY2lfcHJpdihob3N0KTsKLQlzdHJ1Y3QgZXNkaGNfcGxhdGZvcm1fZGF0YSAqYm9hcmRkYXRhID0gaG9zdC0+bW1jLT5wYXJlbnQtPnBsYXRmb3JtX2RhdGE7CiAJc3RydWN0IHBsdGZtX2lteF9kYXRhICppbXhfZGF0YSA9IHBsdGZtX2hvc3QtPnByaXY7CisJc3RydWN0IGVzZGhjX3BsYXRmb3JtX2RhdGEgKmJvYXJkZGF0YSA9ICZpbXhfZGF0YS0+Ym9hcmRkYXRhOwogCWludCBkZWFkID0gKHJlYWRsKGhvc3QtPmlvYWRkciArIFNESENJX0lOVF9TVEFUVVMpID09IDB4ZmZmZmZmZmYpOwogCiAJc2RoY2lfcmVtb3ZlX2hvc3QoaG9zdCwgZGVhZCk7CiAKLQlpZiAoYm9hcmRkYXRhICYmIGdwaW9faXNfdmFsaWQoYm9hcmRkYXRhLT53cF9ncGlvKSkKKwlpZiAoZ3Bpb19pc192YWxpZChib2FyZGRhdGEtPndwX2dwaW8pKQogCQlncGlvX2ZyZWUoYm9hcmRkYXRhLT53cF9ncGlvKTsKIAotCWlmIChib2FyZGRhdGEgJiYgZ3Bpb19pc192YWxpZChib2FyZGRhdGEtPmNkX2dwaW8pKSB7CisJaWYgKGdwaW9faXNfdmFsaWQoYm9hcmRkYXRhLT5jZF9ncGlvKSkgeworCQlmcmVlX2lycShncGlvX3RvX2lycShib2FyZGRhdGEtPmNkX2dwaW8pLCBob3N0KTsKIAkJZ3Bpb19mcmVlKGJvYXJkZGF0YS0+Y2RfZ3Bpbyk7Ci0KLQkJaWYgKCEoaG9zdC0+cXVpcmtzICYgU0RIQ0lfUVVJUktfQlJPS0VOX0NBUkRfREVURUNUSU9OKSkKLQkJCWZyZWVfaXJxKGdwaW9fdG9faXJxKGJvYXJkZGF0YS0+Y2RfZ3BpbyksIGhvc3QpOwogCX0KIAogCWNsa19kaXNhYmxlKHBsdGZtX2hvc3QtPmNsayk7CkBAIC0zNTQsNyArNTAxLDkgQEAKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAic2RoY2ktZXNkaGMtaW14IiwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJCS5vZl9tYXRjaF90YWJsZSA9IGlteF9lc2RoY19kdF9pZHMsCiAJfSwKKwkuaWRfdGFibGUJPSBpbXhfZXNkaGNfZGV2dHlwZSwKIAkucHJvYmUJCT0gc2RoY2lfZXNkaGNfaW14X3Byb2JlLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc2RoY2lfZXNkaGNfaW14X3JlbW92ZSksCiAjaWZkZWYgQ09ORklHX1BNCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBsdGZtLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBsdGZtLmMKaW5kZXggNzFjMGNlMS4uNjQxNGVmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wbHRmbS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGx0Zm0uYwpAQCAtODUsNiArODUsNyBAQAogewogCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0OwogCXN0cnVjdCBzZGhjaV9wbHRmbV9ob3N0ICpwbHRmbV9ob3N0OworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKmlvbWVtOwogCWludCByZXQ7CiAKQEAgLTk4LDcgKzk5LDcgQEAKIAkJZGV2X2VycigmcGRldi0+ZGV2LCAiSW52YWxpZCBpb21lbSBzaXplIVxuIik7CiAKIAkvKiBTb21lIFBDSS1iYXNlZCBNRkQgbmVlZCB0aGUgcGFyZW50IGhlcmUgKi8KLQlpZiAocGRldi0+ZGV2LnBhcmVudCAhPSAmcGxhdGZvcm1fYnVzKQorCWlmIChwZGV2LT5kZXYucGFyZW50ICE9ICZwbGF0Zm9ybV9idXMgJiYgIW5wKQogCQlob3N0ID0gc2RoY2lfYWxsb2NfaG9zdChwZGV2LT5kZXYucGFyZW50LCBzaXplb2YoKnBsdGZtX2hvc3QpKTsKIAllbHNlCiAJCWhvc3QgPSBzZGhjaV9hbGxvY19ob3N0KCZwZGV2LT5kZXYsIHNpemVvZigqcGx0Zm1faG9zdCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZmVjLmMgYi9kcml2ZXJzL25ldC9mZWMuYwppbmRleCA1YjYzMWZlLi5lODI2NmNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9mZWMuYworKysgYi9kcml2ZXJzL25ldC9mZWMuYwpAQCAtNDQsNiArNDQsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9waHkuaD4KICNpbmNsdWRlIDxsaW51eC9mZWMuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9uZXQuaD4KIAogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAKQEAgLTY2LDE3ICs3MCw0MiBAQAogI2RlZmluZSBGRUNfUVVJUktfRU5FVF9NQUMJCSgxIDw8IDApCiAvKiBDb250cm9sbGVyIG5lZWRzIGRyaXZlciB0byBzd2FwIGZyYW1lICovCiAjZGVmaW5lIEZFQ19RVUlSS19TV0FQX0ZSQU1FCQkoMSA8PCAxKQorLyogQ29udHJvbGxlciB1c2VzIGdhc2tldCAqLworI2RlZmluZSBGRUNfUVVJUktfVVNFX0dBU0tFVAkJKDEgPDwgMikKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2VfaWQgZmVjX2RldnR5cGVbXSA9IHsKIAl7CisJCS8qIGtlZXAgaXQgZm9yIGNvbGRmaXJlICovCiAJCS5uYW1lID0gRFJJVkVSX05BTUUsCiAJCS5kcml2ZXJfZGF0YSA9IDAsCiAJfSwgeworCQkubmFtZSA9ICJpbXgyNS1mZWMiLAorCQkuZHJpdmVyX2RhdGEgPSBGRUNfUVVJUktfVVNFX0dBU0tFVCwKKwl9LCB7CisJCS5uYW1lID0gImlteDI3LWZlYyIsCisJCS5kcml2ZXJfZGF0YSA9IDAsCisJfSwgewogCQkubmFtZSA9ICJpbXgyOC1mZWMiLAogCQkuZHJpdmVyX2RhdGEgPSBGRUNfUVVJUktfRU5FVF9NQUMgfCBGRUNfUVVJUktfU1dBUF9GUkFNRSwKLQl9LAotCXsgfQorCX0sIHsKKwkJLyogc2VudGluZWwgKi8KKwl9CiB9OworTU9EVUxFX0RFVklDRV9UQUJMRShwbGF0Zm9ybSwgZmVjX2RldnR5cGUpOworCitlbnVtIGlteF9mZWNfdHlwZSB7CisJSU1YMjVfRkVDID0gMSwgCS8qIHJ1bnMgb24gaS5teDI1LzUwLzUzICovCisJSU1YMjdfRkVDLAkvKiBydW5zIG9uIGkubXgyNy8zNS81MSAqLworCUlNWDI4X0ZFQywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGZlY19kdF9pZHNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXgyNS1mZWMiLCAuZGF0YSA9ICZmZWNfZGV2dHlwZVtJTVgyNV9GRUNdLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDI3LWZlYyIsIC5kYXRhID0gJmZlY19kZXZ0eXBlW0lNWDI3X0ZFQ10sIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14MjgtZmVjIiwgLmRhdGEgPSAmZmVjX2RldnR5cGVbSU1YMjhfRkVDXSwgfSwKKwl7IC8qIHNlbnRpbmVsICovIH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBmZWNfZHRfaWRzKTsKIAogc3RhdGljIHVuc2lnbmVkIGNoYXIgbWFjYWRkcltFVEhfQUxFTl07CiBtb2R1bGVfcGFyYW1fYXJyYXkobWFjYWRkciwgYnl0ZSwgTlVMTCwgMCk7CkBAIC00MjcsNyArNDU2LDcgQEAKIAogCX0gZWxzZSB7CiAjaWZkZWYgRkVDX01JSUdTS19FTlIKLQkJaWYgKGZlcC0+cGh5X2ludGVyZmFjZSA9PSBQSFlfSU5URVJGQUNFX01PREVfUk1JSSkgeworCQlpZiAoaWRfZW50cnktPmRyaXZlcl9kYXRhICYgRkVDX1FVSVJLX1VTRV9HQVNLRVQpIHsKIAkJCS8qIGRpc2FibGUgdGhlIGdhc2tldCBhbmQgd2FpdCAqLwogCQkJd3JpdGVsKDAsIGZlcC0+aHdwICsgRkVDX01JSUdTS19FTlIpOwogCQkJd2hpbGUgKHJlYWRsKGZlcC0+aHdwICsgRkVDX01JSUdTS19FTlIpICYgNCkKQEAgLTQzNiw4ICs0NjUsMTEgQEAKIAkJCS8qCiAJCQkgKiBjb25maWd1cmUgdGhlIGdhc2tldDoKIAkJCSAqICAgUk1JSSwgNTAgTUh6LCBubyBsb29wYmFjaywgbm8gZWNobworCQkJICogICBNSUksIDI1IE1Ieiwgbm8gbG9vcGJhY2ssIG5vIGVjaG8KIAkJCSAqLwotCQkJd3JpdGVsKDEsIGZlcC0+aHdwICsgRkVDX01JSUdTS19DRkdSKTsKKwkJCXdyaXRlbCgoZmVwLT5waHlfaW50ZXJmYWNlID09IFBIWV9JTlRFUkZBQ0VfTU9ERV9STUlJKSA/CisJCQkJCTEgOiAwLCBmZXAtPmh3cCArIEZFQ19NSUlHU0tfQ0ZHUik7CisKIAogCQkJLyogcmUtZW5hYmxlIHRoZSBnYXNrZXQgKi8KIAkJCXdyaXRlbCgyLCBmZXAtPmh3cCArIEZFQ19NSUlHU0tfRU5SKTsKQEAgLTczNCw4ICs3NjYsMjIgQEAKIAkgKi8KIAlpYXAgPSBtYWNhZGRyOwogCisjaWZkZWYgQ09ORklHX09GCiAJLyoKLQkgKiAyKSBmcm9tIGZsYXNoIG9yIGZ1c2UgKHZpYSBwbGF0Zm9ybSBkYXRhKQorCSAqIDIpIGZyb20gZGV2aWNlIHRyZWUgZGF0YQorCSAqLworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihpYXApKSB7CisJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBmZXAtPnBkZXYtPmRldi5vZl9ub2RlOworCQlpZiAobnApIHsKKwkJCWNvbnN0IGNoYXIgKm1hYyA9IG9mX2dldF9tYWNfYWRkcmVzcyhucCk7CisJCQlpZiAobWFjKQorCQkJCWlhcCA9ICh1bnNpZ25lZCBjaGFyICopIG1hYzsKKwkJfQorCX0KKyNlbmRpZgorCisJLyoKKwkgKiAzKSBmcm9tIGZsYXNoIG9yIGZ1c2UgKHZpYSBwbGF0Zm9ybSBkYXRhKQogCSAqLwogCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihpYXApKSB7CiAjaWZkZWYgQ09ORklHX001MjcyCkBAIC03NDgsNyArNzk0LDcgQEAKIAl9CiAKIAkvKgotCSAqIDMpIEZFQyBtYWMgcmVnaXN0ZXJzIHNldCBieSBib290bG9hZGVyCisJICogNCkgRkVDIG1hYyByZWdpc3RlcnMgc2V0IGJ5IGJvb3Rsb2FkZXIKIAkgKi8KIAlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoaWFwKSkgewogCQkqKCh1bnNpZ25lZCBsb25nICopICZ0bXBhZGRyWzBdKSA9CkBAIC0xMzU0LDYgKzE0MDAsNTIgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19PRgorc3RhdGljIGludCBfX2RldmluaXQgZmVjX2dldF9waHlfbW9kZV9kdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBwZGV2LT5kZXYub2Zfbm9kZTsKKworCWlmIChucCkKKwkJcmV0dXJuIG9mX2dldF9waHlfbW9kZShucCk7CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgZmVjX3Jlc2V0X3BoeShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCBlcnIsIHBoeV9yZXNldDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisKKwlpZiAoIW5wKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXBoeV9yZXNldCA9IG9mX2dldF9uYW1lZF9ncGlvKG5wLCAicGh5LXJlc2V0LWdwaW9zIiwgMCk7CisJZXJyID0gZ3Bpb19yZXF1ZXN0X29uZShwaHlfcmVzZXQsIEdQSU9GX09VVF9JTklUX0xPVywgInBoeS1yZXNldCIpOworCWlmIChlcnIpIHsKKwkJcHJfd2FybigiRkVDOiBmYWlsZWQgdG8gZ2V0IGdwaW8gcGh5LXJlc2V0OiAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJbXNsZWVwKDEpOworCWdwaW9fc2V0X3ZhbHVlKHBoeV9yZXNldCwgMSk7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlIC8qIENPTkZJR19PRiAqLworc3RhdGljIGlubGluZSBpbnQgZmVjX2dldF9waHlfbW9kZV9kdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW5saW5lIGludCBmZWNfcmVzZXRfcGh5KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJLyoKKwkgKiBJbiBjYXNlIG9mIHBsYXRmb3JtIHByb2JlLCB0aGUgcmVzZXQgaGFzIGJlZW4gZG9uZQorCSAqIGJ5IG1hY2hpbmUgY29kZS4KKwkgKi8KKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfT0YgKi8KKwogc3RhdGljIGludCBfX2RldmluaXQKIGZlY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewpAQCAtMTM2Miw2ICsxNDU0LDExIEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CiAJaW50IGksIGlycSwgcmV0ID0gMDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnI7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQ7CisKKwlvZl9pZCA9IG9mX21hdGNoX2RldmljZShmZWNfZHRfaWRzLCAmcGRldi0+ZGV2KTsKKwlpZiAob2ZfaWQpCisJCXBkZXYtPmlkX2VudHJ5ID0gb2ZfaWQtPmRhdGE7CiAKIAlyID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlpZiAoIXIpCkBAIC0xMzkzLDkgKzE0OTAsMTggQEAKIAogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG5kZXYpOwogCi0JcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlpZiAocGRhdGEpCi0JCWZlcC0+cGh5X2ludGVyZmFjZSA9IHBkYXRhLT5waHk7CisJcmV0ID0gZmVjX2dldF9waHlfbW9kZV9kdChwZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCQlpZiAocGRhdGEpCisJCQlmZXAtPnBoeV9pbnRlcmZhY2UgPSBwZGF0YS0+cGh5OworCQllbHNlCisJCQlmZXAtPnBoeV9pbnRlcmZhY2UgPSBQSFlfSU5URVJGQUNFX01PREVfTUlJOworCX0gZWxzZSB7CisJCWZlcC0+cGh5X2ludGVyZmFjZSA9IHJldDsKKwl9CisKKwlmZWNfcmVzZXRfcGh5KHBkZXYpOwogCiAJLyogVGhpcyBkZXZpY2UgaGFzIHVwIHRvIHRocmVlIGlycXMgb24gc29tZSBwbGF0Zm9ybXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CkBAIC0xNTMwLDYgKzE2MzYsNyBAQAogI2lmZGVmIENPTkZJR19QTQogCQkucG0JPSAmZmVjX3BtX29wcywKICNlbmRpZgorCQkub2ZfbWF0Y2hfdGFibGUgPSBmZWNfZHRfaWRzLAogCX0sCiAJLmlkX3RhYmxlID0gZmVjX2RldnR5cGUsCiAJLnByb2JlCT0gZmVjX3Byb2JlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvY29yZS5jIGIvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvY29yZS5jCmluZGV4IDcyNTM5OWUuLjcwY2I3ZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL2NvcmUuYworKysgYi9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9jb3JlLmMKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX25ldC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KQEAgLTI1MDYsMTggKzI1MDcsNiBAQAogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mZGV2LT5kZXYub2Zfbm9kZTsKIAljb25zdCB2b2lkICpwOwotCXVuc2lnbmVkIGludCBwbGVuOwotCWNvbnN0IGNoYXIgKnBtLCAqcGh5X21vZGVzW10gPSB7Ci0JCVtQSFlfTU9ERV9OQV0gPSAiIiwKLQkJW1BIWV9NT0RFX01JSV0gPSAibWlpIiwKLQkJW1BIWV9NT0RFX1JNSUldID0gInJtaWkiLAotCQlbUEhZX01PREVfU01JSV0gPSAic21paSIsCi0JCVtQSFlfTU9ERV9SR01JSV0gPSAicmdtaWkiLAotCQlbUEhZX01PREVfVEJJXSA9ICJ0YmkiLAotCQlbUEhZX01PREVfR01JSV0gPSAiZ21paSIsCi0JCVtQSFlfTU9ERV9SVEJJXSA9ICJydGJpIiwKLQkJW1BIWV9NT0RFX1NHTUlJXSA9ICJzZ21paSIsCi0JfTsKIAogCS8qIFJlYWQgY29uZmlnIGZyb20gZGV2aWNlLXRyZWUgKi8KIAlpZiAoZW1hY19yZWFkX3VpbnRfcHJvcChucCwgIm1hbC1kZXZpY2UiLCAmZGV2LT5tYWxfcGgsIDEpKQpAQCAtMjU2NiwyMyArMjU1NSw5IEBACiAJCWRldi0+bWFsX2J1cnN0X3NpemUgPSAyNTY7CiAKIAkvKiBQSFkgbW9kZSBuZWVkcyBzb21lIGRlY29kaW5nICovCi0JZGV2LT5waHlfbW9kZSA9IFBIWV9NT0RFX05BOwotCXBtID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicGh5LW1vZGUiLCAmcGxlbik7Ci0JaWYgKHBtICE9IE5VTEwpIHsKLQkJaW50IGk7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBoeV9tb2Rlcyk7IGkrKykKLQkJCWlmICghc3RyY2FzZWNtcChwbSwgcGh5X21vZGVzW2ldKSkgewotCQkJCWRldi0+cGh5X21vZGUgPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCX0KLQotCS8qIEJhY2t3YXJkIGNvbXBhdCB3aXRoIG5vbi1maW5hbCBEVCAqLwotCWlmIChkZXYtPnBoeV9tb2RlID09IFBIWV9NT0RFX05BICYmIHBtICE9IE5VTEwgJiYgcGxlbiA9PSA0KSB7Ci0JCXUzMiBubW9kZSA9ICooY29uc3QgdTMyICopcG07Ci0JCWlmIChubW9kZSA+IFBIWV9NT0RFX05BICYmIG5tb2RlIDw9IFBIWV9NT0RFX1NHTUlJKQotCQkJZGV2LT5waHlfbW9kZSA9IG5tb2RlOwotCX0KKwlkZXYtPnBoeV9tb2RlID0gb2ZfZ2V0X3BoeV9tb2RlKG5wKTsKKwlpZiAoZGV2LT5waHlfbW9kZSA8IDApCisJCWRldi0+cGh5X21vZGUgPSBQSFlfTU9ERV9OQTsKIAogCS8qIENoZWNrIEVNQUMgdmVyc2lvbiAqLwogCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImlibSxlbWFjNHN5bmMiKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvZW1hYy5oIGIvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvZW1hYy5oCmluZGV4IDhhNjFiNTkuLjE1NjgyNzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2libV9uZXdlbWFjL2VtYWMuaAorKysgYi9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9lbWFjLmgKQEAgLTI2LDYgKzI2LDcgQEAKICNkZWZpbmUgX19JQk1fTkVXRU1BQ19ICiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgogCiAvKiBFTUFDIHJlZ2lzdGVycyAJCQlXcml0ZSBBY2Nlc3MgcnVsZXMgKi8KIHN0cnVjdCBlbWFjX3JlZ3MgewpAQCAtMTA2LDE1ICsxMDcsMTUgQEAKIC8qCiAgKiBQSFkgbW9kZSBzZXR0aW5ncyAoRU1BQyA8LT4gWk1JSS9SR01JSSBicmlkZ2UgPC0+IFBIWSkKICAqLwotI2RlZmluZSBQSFlfTU9ERV9OQQkwCi0jZGVmaW5lIFBIWV9NT0RFX01JSQkxCi0jZGVmaW5lIFBIWV9NT0RFX1JNSUkJMgotI2RlZmluZSBQSFlfTU9ERV9TTUlJCTMKLSNkZWZpbmUgUEhZX01PREVfUkdNSUkJNAotI2RlZmluZSBQSFlfTU9ERV9UQkkJNQotI2RlZmluZSBQSFlfTU9ERV9HTUlJCTYKLSNkZWZpbmUgUEhZX01PREVfUlRCSQk3Ci0jZGVmaW5lIFBIWV9NT0RFX1NHTUlJCTgKKyNkZWZpbmUgUEhZX01PREVfTkEJUEhZX0lOVEVSRkFDRV9NT0RFX05BCisjZGVmaW5lIFBIWV9NT0RFX01JSQlQSFlfSU5URVJGQUNFX01PREVfTUlJCisjZGVmaW5lIFBIWV9NT0RFX1JNSUkJUEhZX0lOVEVSRkFDRV9NT0RFX1JNSUkKKyNkZWZpbmUgUEhZX01PREVfU01JSQlQSFlfSU5URVJGQUNFX01PREVfU01JSQorI2RlZmluZSBQSFlfTU9ERV9SR01JSQlQSFlfSU5URVJGQUNFX01PREVfUkdNSUkKKyNkZWZpbmUgUEhZX01PREVfVEJJCVBIWV9JTlRFUkZBQ0VfTU9ERV9UQkkKKyNkZWZpbmUgUEhZX01PREVfR01JSQlQSFlfSU5URVJGQUNFX01PREVfR01JSQorI2RlZmluZSBQSFlfTU9ERV9SVEJJCVBIWV9JTlRFUkZBQ0VfTU9ERV9SVEJJCisjZGVmaW5lIFBIWV9NT0RFX1NHTUlJCVBIWV9JTlRFUkZBQ0VfTU9ERV9TR01JSQogCiAvKiBFTUFDeF9NUjAgKi8KICNkZWZpbmUgRU1BQ19NUjBfUlhJCQkJMHg4MDAwMDAwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWJtX25ld2VtYWMvcGh5LmMgYi9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9waHkuYwppbmRleCBhYzlkOTY0Li5hYjRlNTk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9waHkuYworKysgYi9kcml2ZXJzL25ldC9pYm1fbmV3ZW1hYy9waHkuYwpAQCAtMjgsMTIgKzI4LDE1IEBACiAjaW5jbHVkZSAiZW1hYy5oIgogI2luY2x1ZGUgInBoeS5oIgogCi1zdGF0aWMgaW5saW5lIGludCBwaHlfcmVhZChzdHJ1Y3QgbWlpX3BoeSAqcGh5LCBpbnQgcmVnKQorI2RlZmluZSBwaHlfcmVhZCBfcGh5X3JlYWQKKyNkZWZpbmUgcGh5X3dyaXRlIF9waHlfd3JpdGUKKworc3RhdGljIGlubGluZSBpbnQgX3BoeV9yZWFkKHN0cnVjdCBtaWlfcGh5ICpwaHksIGludCByZWcpCiB7CiAJcmV0dXJuIHBoeS0+bWRpb19yZWFkKHBoeS0+ZGV2LCBwaHktPmFkZHJlc3MsIHJlZyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBwaHlfd3JpdGUoc3RydWN0IG1paV9waHkgKnBoeSwgaW50IHJlZywgaW50IHZhbCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBfcGh5X3dyaXRlKHN0cnVjdCBtaWlfcGh5ICpwaHksIGludCByZWcsIGludCB2YWwpCiB7CiAJcGh5LT5tZGlvX3dyaXRlKHBoeS0+ZGV2LCBwaHktPmFkZHJlc3MsIHJlZywgdmFsKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BjbWNpYS9zbWM5MWM5Ml9jcy5jIGIvZHJpdmVycy9uZXQvcGNtY2lhL3NtYzkxYzkyX2NzLmMKaW5kZXggMWNkOTM5NC4uY2ZmYmMwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGNtY2lhL3NtYzkxYzkyX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvcGNtY2lhL3NtYzkxYzkyX2NzLmMKQEAgLTgwOSw3ICs4MDksNyBAQAogICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBsaW5rLT5wcml2OwogICAgIHN0cnVjdCBzbWNfcHJpdmF0ZSAqc21jID0gbmV0ZGV2X3ByaXYoZGV2KTsKICAgICBjaGFyICpuYW1lOwotICAgIGludCBpLCBqLCByZXY7CisgICAgaW50IGksIHJldiwgaiA9IDA7CiAgICAgdW5zaWduZWQgaW50IGlvYWRkcjsKICAgICB1X2xvbmcgbWlyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9zdW5nZW0uYyBiL2RyaXZlcnMvbmV0L3N1bmdlbS5jCmluZGV4IGJlNzQ1YWUuLmFkZTM1ZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3N1bmdlbS5jCisrKyBiL2RyaXZlcnMvbmV0L3N1bmdlbS5jCkBAIC00NiwxNCArNDYsMTUgQEAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb20uaD4KIAogI2lmZGVmIENPTkZJR19TUEFSQwogI2luY2x1ZGUgPGFzbS9pZHByb20uaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfUFBDX1BNQUMKICNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KICNpbmNsdWRlIDxhc20vcG1hY19mZWF0dXJlLmg+CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfY3MuYwppbmRleCBjMDUyYTBkLi41NDQxYWQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9jcy5jCkBAIC02NDgsNiArNjQ4LDggQEAKIAkJCQkJIDB4NzRjNWU0MGQpLAogCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEX1BST0RfSUQxKDB4MDE1NiwgMHgwMDAyLCAiSW50ZXJzaWwiLAogCQkJCQkgMHg0YjgwMWExNyksCisJUENNQ0lBX0RFVklDRV9NQU5GX0NBUkRfUFJPRF9JRDMoMHgwMTU2LCAweDAwMDIsICJWZXJzaW9uIDAxLjAyIiwKKwkJCQkJIDB4NGI3NGJhYTApLAogCVBDTUNJQV9NRkNfREVWSUNFX1BST0RfSUQxMigwLCAiU2FuRGlzayIsICJDb25uZWN0UGx1cyIsCiAJCQkJICAgIDB4N2E5NTRiZDksIDB4NzRiZTAwYzYpLAogCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vb3Jpbm9jb19jcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9vcmlub2NvX2NzLmMKaW5kZXggM2Y3ZmM0YS4uZDdkYmMwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9vcmlub2NvX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9vcmlub2NvX2NzLmMKQEAgLTIzOSw3ICsyMzksNiBAQAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHBjbWNpYV9kZXZpY2VfaWQgb3Jpbm9jb19jc19pZHNbXSA9IHsKIAlQQ01DSUFfREVWSUNFX01BTkZfQ0FSRCgweDAxMDEsIDB4MDc3NyksIC8qIDNDb20gQWlyQ29ubmVjdCBQQ0kgNzc3QSAqLwotCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDE1NiwgMHgwMDAyKSwgLyogTHVjZW50IE9yaW5vY28gYW5kIG9sZCBJbnRlcnNpbCAqLwogCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDE2YiwgMHgwMDAxKSwgLyogRXJpY3Nzb24gV0xBTiBDYXJkIEMxMSAqLwogCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDFlYiwgMHgwODBhKSwgLyogTm9ydGVsIE5ldHdvcmtzIGVNb2JpbGl0eSA4MDIuMTEgV2lyZWxlc3MgQWRhcHRlciAqLwogCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDI2MSwgMHgwMDAyKSwgLyogQWlyV2F5IDgwMi4xMSBBZGFwdGVyIChQQ01DSUEpICovCkBAIC0yNzIsNiArMjcxLDcgQEAKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiUFJPWElNIiwgIkxBTiBQQ0kgQ0FSRCBIQVJNT05ZIDgwMjExQiIsIDB4YzY1MzZhNWUsIDB4OWY0OTRlMjYpLAogCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyKCJTQU1TVU5HIiwgIjExTWJwcyBXTEFOIENhcmQiLCAweDQzZDc0Y2I0LCAweDU3OWJkOTFiKSwKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxMigiU3ltYm9sIFRlY2hub2xvZ2llcyIsICJMQTQxMTEgU3BlY3RydW0yNCBXaXJlbGVzcyBMQU4gUEMgQ2FyZCIsIDB4M2YwMmI0ZDYsIDB4MzY2M2NiMGUpLAorCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEX1BST0RfSUQzKDB4MDE1NiwgMHgwMDAyLCAiVmVyc2lvbiAwMS4wMSIsIDB4ZDI3ZGViMWEpLCAvKiBMdWNlbnQgT3Jpbm9jbyAqLwogI2lmZGVmIENPTkZJR19IRVJNRVNfUFJJU00KIAkvKiBPbmx5IGVudHJpZXMgdGhhdCBjZXJ0YWlubHkgaWRlbnRpZnkgUHJpc20gY2hpcHNldCAqLwogCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDAwYiwgMHg3MTAwKSwgLyogU29uaWNXQUxMIExvbmcgUmFuZ2UgV2lyZWxlc3MgQ2FyZCAqLwpAQCAtMzIxLDYgKzMyMSw5IEBACiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMygiSVNMMzcxMDBQIiwgMHg2MzBkNTJiMiksCiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMygiSVNMMzcxMDFQLTEwIiwgMHhkZDk3YTI2YiksCiAJUENNQ0lBX0RFVklDRV9QUk9EX0lEMygiSVNMMzczMDBQIiwgMHhjOTA0OWEzOSksCisKKwkvKiBUaGlzIG1heSBiZSBBZ2VyZSBvciBJbnRlcnNpbCBGaXJtd2FyZSAqLworCVBDTUNJQV9ERVZJQ0VfTUFORl9DQVJEKDB4MDE1NiwgMHgwMDAyKSwKICNlbmRpZgogCVBDTUNJQV9ERVZJQ0VfTlVMTCwKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL2FkZHJlc3MuYyBiL2RyaXZlcnMvb2YvYWRkcmVzcy5jCmluZGV4IGRhMWY0YjkuLjcyYzMzZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvb2YvYWRkcmVzcy5jCisrKyBiL2RyaXZlcnMvb2YvYWRkcmVzcy5jCkBAIC02MTAsNiArNjEwLDYgQEAKIAlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgaW5kZXgsICZyZXMpKQogCQlyZXR1cm4gTlVMTDsKIAotCXJldHVybiBpb3JlbWFwKHJlcy5zdGFydCwgMSArIHJlcy5lbmQgLSByZXMuc3RhcnQpOworCXJldHVybiBpb3JlbWFwKHJlcy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcmVzKSk7CiB9CiBFWFBPUlRfU1lNQk9MKG9mX2lvbWFwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb2YvYmFzZS5jIGIvZHJpdmVycy9vZi9iYXNlLmMKaW5kZXggMDJlZDM2Ny4uM2ZmMjJlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9iYXNlLmMKKysrIGIvZHJpdmVycy9vZi9iYXNlLmMKQEAgLTYxMCw4ICs2MTAsOSBAQAogICoKICAqIFRoZSBvdXRfdmFsdWUgaXMgbW9kaWZpZWQgb25seSBpZiBhIHZhbGlkIHUzMiB2YWx1ZSBjYW4gYmUgZGVjb2RlZC4KICAqLwotaW50IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsIGNoYXIgKnByb3BuYW1lLAotCQkJICAgICAgIHUzMiAqb3V0X3ZhbHVlcywgc2l6ZV90IHN6KQoraW50IG9mX3Byb3BlcnR5X3JlYWRfdTMyX2FycmF5KGNvbnN0IHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkgICAgICAgY29uc3QgY2hhciAqcHJvcG5hbWUsIHUzMiAqb3V0X3ZhbHVlcywKKwkJCSAgICAgICBzaXplX3Qgc3opCiB7CiAJc3RydWN0IHByb3BlcnR5ICpwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShucCwgcHJvcG5hbWUsIE5VTEwpOwogCWNvbnN0IF9fYmUzMiAqdmFsOwpAQCAtNjQ1LDcgKzY0Niw3IEBACiAgKgogICogVGhlIG91dF9zdHJpbmcgcG9pbnRlciBpcyBtb2RpZmllZCBvbmx5IGlmIGEgdmFsaWQgc3RyaW5nIGNhbiBiZSBkZWNvZGVkLgogICovCi1pbnQgb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcoc3RydWN0IGRldmljZV9ub2RlICpucCwgY2hhciAqcHJvcG5hbWUsCitpbnQgb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcoc3RydWN0IGRldmljZV9ub2RlICpucCwgY29uc3QgY2hhciAqcHJvcG5hbWUsCiAJCQkJY29uc3QgY2hhciAqKm91dF9zdHJpbmcpCiB7CiAJc3RydWN0IHByb3BlcnR5ICpwcm9wID0gb2ZfZmluZF9wcm9wZXJ0eShucCwgcHJvcG5hbWUsIE5VTEwpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9ncGlvLmMgYi9kcml2ZXJzL29mL2dwaW8uYwppbmRleCAzMDA3NjYyLi5lZjAxMDVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL29mL2dwaW8uYworKysgYi9kcml2ZXJzL29mL2dwaW8uYwpAQCAtMTI3LDggKzEyNyw4IEBACiAgKiBncGlvIGNoaXBzLiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIG9ubHkgb25lIHNhbml0eSBjaGVjazogd2hldGhlciBncGlvCiAgKiBpcyBsZXNzIHRoYW4gbmdwaW9zICh0aGF0IGlzIHNwZWNpZmllZCBpbiB0aGUgZ3Bpb19jaGlwKS4KICAqLwotc3RhdGljIGludCBvZl9ncGlvX3NpbXBsZV94bGF0ZShzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCQljb25zdCB2b2lkICpncGlvX3NwZWMsIHUzMiAqZmxhZ3MpCitpbnQgb2ZfZ3Bpb19zaW1wbGVfeGxhdGUoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkgY29uc3Qgdm9pZCAqZ3Bpb19zcGVjLCB1MzIgKmZsYWdzKQogewogCWNvbnN0IF9fYmUzMiAqZ3BpbyA9IGdwaW9fc3BlYzsKIAljb25zdCB1MzIgbiA9IGJlMzJfdG9fY3B1cChncGlvKTsKQEAgLTE1Miw2ICsxNTIsNyBAQAogCiAJcmV0dXJuIG47CiB9CitFWFBPUlRfU1lNQk9MKG9mX2dwaW9fc2ltcGxlX3hsYXRlKTsKIAogLyoqCiAgKiBvZl9tbV9ncGlvY2hpcF9hZGQgLSBBZGQgbWVtb3J5IG1hcHBlZCBHUElPIGNoaXAgKGJhbmspCmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL29mX25ldC5jIGIvZHJpdmVycy9vZi9vZl9uZXQuYwppbmRleCA4NmYzMzRhLi5iYjE4NDcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL29mL29mX25ldC5jCisrKyBiL2RyaXZlcnMvb2Yvb2ZfbmV0LmMKQEAgLTgsNiArOCw1MSBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfbmV0Lmg+CisjaW5jbHVkZSA8bGludXgvcGh5Lmg+CisKKy8qKgorICogSXQgbWFwcyAnZW51bSBwaHlfaW50ZXJmYWNlX3QnIGZvdW5kIGluIGluY2x1ZGUvbGludXgvcGh5LmgKKyAqIGludG8gdGhlIGRldmljZSB0cmVlIGJpbmRpbmcgb2YgJ3BoeS1tb2RlJywgc28gdGhhdCBFdGhlcm5ldAorICogZGV2aWNlIGRyaXZlciBjYW4gZ2V0IHBoeSBpbnRlcmZhY2UgZnJvbSBkZXZpY2UgdHJlZS4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKnBoeV9tb2Rlc1tdID0geworCVtQSFlfSU5URVJGQUNFX01PREVfTkFdCQk9ICIiLAorCVtQSFlfSU5URVJGQUNFX01PREVfTUlJXQk9ICJtaWkiLAorCVtQSFlfSU5URVJGQUNFX01PREVfR01JSV0JPSAiZ21paSIsCisJW1BIWV9JTlRFUkZBQ0VfTU9ERV9TR01JSV0JPSAic2dtaWkiLAorCVtQSFlfSU5URVJGQUNFX01PREVfVEJJXQk9ICJ0YmkiLAorCVtQSFlfSU5URVJGQUNFX01PREVfUk1JSV0JPSAicm1paSIsCisJW1BIWV9JTlRFUkZBQ0VfTU9ERV9SR01JSV0JPSAicmdtaWkiLAorCVtQSFlfSU5URVJGQUNFX01PREVfUkdNSUlfSURdCT0gInJnbWlpLWlkIiwKKwlbUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJX1JYSURdCT0gInJnbWlpLXJ4aWQiLAorCVtQSFlfSU5URVJGQUNFX01PREVfUkdNSUlfVFhJRF0gPSAicmdtaWktdHhpZCIsCisJW1BIWV9JTlRFUkZBQ0VfTU9ERV9SVEJJXQk9ICJydGJpIiwKKwlbUEhZX0lOVEVSRkFDRV9NT0RFX1NNSUldCT0gInNtaWkiLAorfTsKKworLyoqCisgKiBvZl9nZXRfcGh5X21vZGUgLSBHZXQgcGh5IG1vZGUgZm9yIGdpdmVuIGRldmljZV9ub2RlCisgKiBAbnA6CVBvaW50ZXIgdG8gdGhlIGdpdmVuIGRldmljZV9ub2RlCisgKgorICogVGhlIGZ1bmN0aW9uIGdldHMgcGh5IGludGVyZmFjZSBzdHJpbmcgZnJvbSBwcm9wZXJ0eSAncGh5LW1vZGUnLAorICogYW5kIHJldHVybiBpdHMgaW5kZXggaW4gcGh5X21vZGVzIHRhYmxlLCBvciBlcnJubyBpbiBlcnJvciBjYXNlLgorICovCitjb25zdCBpbnQgb2ZfZ2V0X3BoeV9tb2RlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApCit7CisJY29uc3QgY2hhciAqcG07CisJaW50IGVyciwgaTsKKworCWVyciA9IG9mX3Byb3BlcnR5X3JlYWRfc3RyaW5nKG5wLCAicGh5LW1vZGUiLCAmcG0pOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGh5X21vZGVzKTsgaSsrKQorCQlpZiAoIXN0cmNhc2VjbXAocG0sIHBoeV9tb2Rlc1tpXSkpCisJCQlyZXR1cm4gaTsKKworCXJldHVybiAtRU5PREVWOworfQorRVhQT1JUX1NZTUJPTF9HUEwob2ZfZ2V0X3BoeV9tb2RlKTsKIAogLyoqCiAgKiBTZWFyY2ggdGhlIGRldmljZSB0cmVlIGZvciB0aGUgYmVzdCBNQUMgYWRkcmVzcyB0byB1c2UuICAnbWFjLWFkZHJlc3MnIGlzCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlfcGNpaHAuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaV9wY2locC5jCmluZGV4IDhmM2ZhZjMuLjA5NWYyOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaV9wY2locC5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaV9wY2locC5jCkBAIC00MDgsNyArNDA4LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woYWNwaV9nZXRfaHBfaHdfY29udHJvbF9mcm9tX2Zpcm13YXJlKTsKIAotc3RhdGljIGludCBpc19lamVjdGFibGUoYWNwaV9oYW5kbGUgaGFuZGxlKQorc3RhdGljIGludCBwY2locF9pc19lamVjdGFibGUoYWNwaV9oYW5kbGUgaGFuZGxlKQogewogCWFjcGlfc3RhdHVzIHN0YXR1czsKIAlhY3BpX2hhbmRsZSB0bXA7CkBAIC00NDIsNyArNDQyLDcgQEAKIAkJcmV0dXJuIDA7CiAJaWYgKGJyaWRnZV9oYW5kbGUgIT0gcGFyZW50X2hhbmRsZSkKIAkJcmV0dXJuIDA7Ci0JcmV0dXJuIGlzX2VqZWN0YWJsZShoYW5kbGUpOworCXJldHVybiBwY2locF9pc19lamVjdGFibGUoaGFuZGxlKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGFjcGlfcGNpX2NoZWNrX2VqZWN0YWJsZSk7CiAKQEAgLTQ1MCw3ICs0NTAsNyBAQAogY2hlY2tfaG90cGx1ZyhhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBsdmwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipydikKIHsKIAlpbnQgKmZvdW5kID0gKGludCAqKWNvbnRleHQ7Ci0JaWYgKGlzX2VqZWN0YWJsZShoYW5kbGUpKSB7CisJaWYgKHBjaWhwX2lzX2VqZWN0YWJsZShoYW5kbGUpKSB7CiAJCSpmb3VuZCA9IDE7CiAJCXJldHVybiBBRV9DVFJMX1RFUk1JTkFURTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYwppbmRleCBhNzBmYTg5Li4yMjAyODU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jCisrKyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMKQEAgLTExMCw3ICsxMTAsNyBAQAogfQogCiAKLXN0YXRpYyBzdHJ1Y3QgYWNwaV9kb2NrX29wcyBhY3BpcGhwX2RvY2tfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2RvY2tfb3BzIGFjcGlwaHBfZG9ja19vcHMgPSB7CiAJLmhhbmRsZXIgPSBoYW5kbGVfaG90cGx1Z19ldmVudF9mdW5jLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfY29yZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9jcHFwaHBfY29yZS5jCmluZGV4IDQ5NTJjM2IuLmYxY2U5OWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvY3BxcGhwX2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2NwcXBocF9jb3JlLmMKQEAgLTg0MCw4ICs4NDAsOSBAQAogCS8qIE5lZWQgdG8gcmVhZCBWSUQgZWFybHkgYi9jIGl0J3MgdXNlZCB0byBkaWZmZXJlbnRpYXRlIENQUSBhbmQgSU5UQwogCSAqIGRpc2NvdmVyeQogCSAqLwotCXJjID0gcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX1ZFTkRPUl9JRCwgJnZlbmRvcl9pZCk7Ci0JaWYgKHJjIHx8ICgodmVuZG9yX2lkICE9IFBDSV9WRU5ET1JfSURfQ09NUEFRKSAmJiAodmVuZG9yX2lkICE9IFBDSV9WRU5ET1JfSURfSU5URUwpKSkgeworCXZlbmRvcl9pZCA9IHBkZXYtPnZlbmRvcjsKKwlpZiAoKHZlbmRvcl9pZCAhPSBQQ0lfVkVORE9SX0lEX0NPTVBBUSkgJiYKKwkgICAgKHZlbmRvcl9pZCAhPSBQQ0lfVkVORE9SX0lEX0lOVEVMKSkgewogCQllcnIobXNnX0hQQ19ub25fY29tcGFxX29yX2ludGVsKTsKIAkJcmMgPSAtRU5PREVWOwogCQlnb3RvIGVycl9kaXNhYmxlX2RldmljZTsKQEAgLTg2OCwxMSArODY5LDcgQEAKIAkvKiBUT0RPOiBUaGlzIGNvZGUgY2FuIGJlIG1hZGUgdG8gc3VwcG9ydCBub24tQ29tcGFxIG9yIEludGVsCiAJICogc3Vic3lzdGVtIElEcwogCSAqLwotCXJjID0gcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQsICZzdWJzeXN0ZW1fdmlkKTsKLQlpZiAocmMpIHsKLQkJZXJyKCIlcyA6IHBjaV9yZWFkX2NvbmZpZ193b3JkIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGVycl9kaXNhYmxlX2RldmljZTsKLQl9CisJc3Vic3lzdGVtX3ZpZCA9IHBkZXYtPnN1YnN5c3RlbV92ZW5kb3I7CiAJZGJnKCJTdWJzeXN0ZW0gVmVuZG9yIElEOiAleFxuIiwgc3Vic3lzdGVtX3ZpZCk7CiAJaWYgKChzdWJzeXN0ZW1fdmlkICE9IFBDSV9WRU5ET1JfSURfQ09NUEFRKSAmJiAoc3Vic3lzdGVtX3ZpZCAhPSBQQ0lfVkVORE9SX0lEX0lOVEVMKSkgewogCQllcnIobXNnX0hQQ19ub25fY29tcGFxX29yX2ludGVsKTsKQEAgLTg4NywxMSArODg0LDcgQEAKIAkJZ290byBlcnJfZGlzYWJsZV9kZXZpY2U7CiAJfQogCi0JcmMgPSBwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfU1VCU1lTVEVNX0lELCAmc3Vic3lzdGVtX2RldmljZWlkKTsKLQlpZiAocmMpIHsKLQkJZXJyKCIlcyA6IHBjaV9yZWFkX2NvbmZpZ193b3JkIGZhaWxlZFxuIiwgX19mdW5jX18pOwotCQlnb3RvIGVycl9mcmVlX2N0cmw7Ci0JfQorCXN1YnN5c3RlbV9kZXZpY2VpZCA9IHBkZXYtPnN1YnN5c3RlbV9kZXZpY2U7CiAKIAlpbmZvKCJIb3QgUGx1ZyBTdWJzeXN0ZW0gRGV2aWNlIElEOiAleFxuIiwgc3Vic3lzdGVtX2RldmljZWlkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY3RybC5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfY3RybC5jCmluZGV4IDA4NWRiYjUuLjFlOWM5YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2N0cmwuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL3BjaWVocF9jdHJsLmMKQEAgLTIxMyw2ICsyMTMsOSBAQAogCQlnb3RvIGVycl9leGl0OwogCX0KIAorCS8qIFdhaXQgZm9yIDEgc2Vjb25kIGFmdGVyIGNoZWNraW5nIGxpbmsgdHJhaW5pbmcgc3RhdHVzICovCisJbXNsZWVwKDEwMDApOworCiAJLyogQ2hlY2sgZm9yIGEgcG93ZXIgZmF1bHQgKi8KIAlpZiAoY3RybC0+cG93ZXJfZmF1bHRfZGV0ZWN0ZWQgfHwgcGNpZWhwX3F1ZXJ5X3Bvd2VyX2ZhdWx0KHBfc2xvdCkpIHsKIAkJY3RybF9lcnIoY3RybCwgIlBvd2VyIGZhdWx0IG9uIHNsb3QgJXNcbiIsIHNsb3RfbmFtZShwX3Nsb3QpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvcGNpZWhwX2hwYy5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfaHBjLmMKaW5kZXggNTBhMjNkYS4uOTZkYzQ3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfaHBjLmMKKysrIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9wY2llaHBfaHBjLmMKQEAgLTI3NSwxNiArMjc1LDkgQEAKICAgICAgICAgICogaG90LXBsdWcgY2FwYWJsZSBkb3duc3RyZWFtIHBvcnQuIEJ1dCBvbGQgY29udHJvbGxlciBtaWdodAogICAgICAgICAgKiBub3QgaW1wbGVtZW50IGl0LiBJbiB0aGlzIGNhc2UsIHdlIHdhaXQgZm9yIDEwMDAgbXMuCiAgICAgICAgICAqLwotICAgICAgICBpZiAoY3RybC0+bGlua19hY3RpdmVfcmVwb3J0aW5nKXsKLSAgICAgICAgICAgICAgICAvKiBXYWl0IGZvciBEYXRhIExpbmsgTGF5ZXIgTGluayBBY3RpdmUgYml0IHRvIGJlIHNldCAqLworICAgICAgICBpZiAoY3RybC0+bGlua19hY3RpdmVfcmVwb3J0aW5nKQogICAgICAgICAgICAgICAgIHBjaWVfd2FpdF9saW5rX2FjdGl2ZShjdHJsKTsKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIFdlIG11c3Qgd2FpdCBmb3IgMTAwIG1zIGFmdGVyIHRoZSBEYXRhIExpbmsgTGF5ZXIKLSAgICAgICAgICAgICAgICAgKiBMaW5rIEFjdGl2ZSBiaXQgcmVhZHMgMWIgYmVmb3JlIGluaXRpYXRpbmcgYQotICAgICAgICAgICAgICAgICAqIGNvbmZpZ3VyYXRpb24gYWNjZXNzIHRvIHRoZSBob3QgYWRkZWQgZGV2aWNlLgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIG1zbGVlcCgxMDApOwotICAgICAgICB9IGVsc2UKKyAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIG1zbGVlcCgxMDAwKTsKIAogCXJldHZhbCA9IHBjaWVocF9yZWFkdyhjdHJsLCBQQ0lfRVhQX0xOS1NUQSwgJmxua19zdGF0dXMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLmMgYi9kcml2ZXJzL3BjaS9wY2kuYwppbmRleCA2OTI2NzFiLi4wOGE5NWIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2kuYworKysgYi9kcml2ZXJzL3BjaS9wY2kuYwpAQCAtMTkwNSw3ICsxOTA1LDcgQEAKIHsKIAlpbnQgcG9zOwogCXUzMiBjYXA7Ci0JdTE2IGN0cmw7CisJdTE2IGZsYWdzLCBjdHJsOwogCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2U7CiAKIAlpZiAoIXBjaV9pc19wY2llKGRldikgfHwgZGV2LT5kZXZmbikKQEAgLTE5MjMsNiArMTkyMywxMSBAQAogCWlmICghcG9zKQogCQlyZXR1cm47CiAKKwkvKiBBUkkgaXMgYSBQQ0llIHYyIGZlYXR1cmUgKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChicmlkZ2UsIHBvcyArIFBDSV9FWFBfRkxBR1MsICZmbGFncyk7CisJaWYgKChmbGFncyAmIFBDSV9FWFBfRkxBR1NfVkVSUykgPCAyKQorCQlyZXR1cm47CisKIAlwY2lfcmVhZF9jb25maWdfZHdvcmQoYnJpZGdlLCBwb3MgKyBQQ0lfRVhQX0RFVkNBUDIsICZjYXApOwogCWlmICghKGNhcCAmIFBDSV9FWFBfREVWQ0FQMl9BUkkpKQogCQlyZXR1cm47CkBAIC0zMTg2LDcgKzMxOTEsNyBAQAogICogQHJxOiBtYXhpbXVtIG1lbW9yeSByZWFkIGNvdW50IGluIGJ5dGVzCiAgKiAgICB2YWxpZCB2YWx1ZXMgYXJlIDEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDgsIDQwOTYKICAqCi0gKiBJZiBwb3NzaWJsZSBzZXRzIG1heGltdW0gcmVhZCBieXRlIGNvdW50CisgKiBJZiBwb3NzaWJsZSBzZXRzIG1heGltdW0gbWVtb3J5IHJlYWQgcmVxdWVzdCBpbiBieXRlcwogICovCiBpbnQgcGNpZV9zZXRfcmVhZHJxKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGludCBycSkKIHsKQEAgLTMyMDksNyArMzIxNCw3IEBACiAJaWYgKChjdGwgJiBQQ0lfRVhQX0RFVkNUTF9SRUFEUlEpICE9IHYpIHsKIAkJY3RsICY9IH5QQ0lfRVhQX0RFVkNUTF9SRUFEUlE7CiAJCWN0bCB8PSB2OwotCQllcnIgPSBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgY2FwICsgUENJX0VYUF9ERVZDVEwsIGN0bCk7CisJCWVyciA9IHBjaV93cml0ZV9jb25maWdfd29yZChkZXYsIGNhcCArIFBDSV9FWFBfREVWQ1RMLCBjdGwpOwogCX0KIAogb3V0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2NvcmUuYyBiL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydl9jb3JlLmMKaW5kZXggNDM0MjFmYi4uOTY3NGU5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9wY2llL2Flci9hZXJkcnZfY29yZS5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CiAjaW5jbHVkZSAiYWVyZHJ2LmgiCiAKIHN0YXRpYyBpbnQgZm9yY2Vsb2FkOwpAQCAtNDQ1LDggKzQ0Niw3IEBACiAJcmV0dXJuIGRydjsKIH0KIAotc3RhdGljIHBjaV9lcnNfcmVzdWx0X3QgcmVzZXRfbGluayhzdHJ1Y3QgcGNpZV9kZXZpY2UgKmFlcmRldiwKLQkJc3RydWN0IHBjaV9kZXYgKmRldikKK3N0YXRpYyBwY2lfZXJzX3Jlc3VsdF90IHJlc2V0X2xpbmsoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqdWRldjsKIAlwY2lfZXJzX3Jlc3VsdF90IHN0YXR1czsKQEAgLTQ4Niw3ICs0ODYsNiBAQAogCiAvKioKICAqIGRvX3JlY292ZXJ5IC0gaGFuZGxlIG5vbmZhdGFsL2ZhdGFsIGVycm9yIHJlY292ZXJ5IHByb2Nlc3MKLSAqIEBhZXJkZXY6IHBvaW50ZXIgdG8gYSBwY2llX2RldmljZSBkYXRhIHN0cnVjdHVyZSBvZiByb290IHBvcnQKICAqIEBkZXY6IHBvaW50ZXIgdG8gYSBwY2lfZGV2IGRhdGEgc3RydWN0dXJlIG9mIGFnZW50IGRldGVjdGluZyBhbiBlcnJvcgogICogQHNldmVyaXR5OiBlcnJvciBzZXZlcml0eSB0eXBlCiAgKgpAQCAtNDk0LDggKzQ5Myw3IEBACiAgKiBlcnJvciBkZXRlY3RlZCBtZXNzYWdlIHRvIGFsbCBkb3duc3RyZWFtIGRyaXZlcnMgd2l0aGluIGEgaGllcmFyY2h5IGluCiAgKiBxdWVzdGlvbiBhbmQgcmV0dXJuIHRoZSByZXR1cm5lZCBjb2RlLgogICovCi1zdGF0aWMgdm9pZCBkb19yZWNvdmVyeShzdHJ1Y3QgcGNpZV9kZXZpY2UgKmFlcmRldiwgc3RydWN0IHBjaV9kZXYgKmRldiwKLQkJaW50IHNldmVyaXR5KQorc3RhdGljIHZvaWQgZG9fcmVjb3Zlcnkoc3RydWN0IHBjaV9kZXYgKmRldiwgaW50IHNldmVyaXR5KQogewogCXBjaV9lcnNfcmVzdWx0X3Qgc3RhdHVzLCByZXN1bHQgPSBQQ0lfRVJTX1JFU1VMVF9SRUNPVkVSRUQ7CiAJZW51bSBwY2lfY2hhbm5lbF9zdGF0ZSBzdGF0ZTsKQEAgLTUxMSw3ICs1MDksNyBAQAogCQkJcmVwb3J0X2Vycm9yX2RldGVjdGVkKTsKIAogCWlmIChzZXZlcml0eSA9PSBBRVJfRkFUQUwpIHsKLQkJcmVzdWx0ID0gcmVzZXRfbGluayhhZXJkZXYsIGRldik7CisJCXJlc3VsdCA9IHJlc2V0X2xpbmsoZGV2KTsKIAkJaWYgKHJlc3VsdCAhPSBQQ0lfRVJTX1JFU1VMVF9SRUNPVkVSRUQpCiAJCQlnb3RvIGZhaWxlZDsKIAl9CkBAIC01NzYsOSArNTc0LDczIEBACiAJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgcG9zICsgUENJX0VSUl9DT1JfU1RBVFVTLAogCQkJCQlpbmZvLT5zdGF0dXMpOwogCX0gZWxzZQotCQlkb19yZWNvdmVyeShhZXJkZXYsIGRldiwgaW5mby0+c2V2ZXJpdHkpOworCQlkb19yZWNvdmVyeShkZXYsIGluZm8tPnNldmVyaXR5KTsKIH0KIAorI2lmZGVmIENPTkZJR19BQ1BJX0FQRUlfUENJRUFFUgorc3RhdGljIHZvaWQgYWVyX3JlY292ZXJfd29ya19mdW5jKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisKKyNkZWZpbmUgQUVSX1JFQ09WRVJfUklOR19PUkRFUgkJNAorI2RlZmluZSBBRVJfUkVDT1ZFUl9SSU5HX1NJWkUJCSgxIDw8IEFFUl9SRUNPVkVSX1JJTkdfT1JERVIpCisKK3N0cnVjdCBhZXJfcmVjb3Zlcl9lbnRyeQoreworCXU4CWJ1czsKKwl1OAlkZXZmbjsKKwl1MTYJZG9tYWluOworCWludAlzZXZlcml0eTsKK307CisKK3N0YXRpYyBERUZJTkVfS0ZJRk8oYWVyX3JlY292ZXJfcmluZywgc3RydWN0IGFlcl9yZWNvdmVyX2VudHJ5LAorCQkgICAgQUVSX1JFQ09WRVJfUklOR19TSVpFKTsKKy8qCisgKiBNdXR1YWwgZXhjbHVzaW9uIGZvciB3cml0ZXJzIG9mIGFlcl9yZWNvdmVyX3JpbmcsIHJlYWRlciBzaWRlIGRvbid0CisgKiBuZWVkIGxvY2ssIGJlY2F1c2UgdGhlcmUgaXMgb25seSBvbmUgcmVhZGVyIGFuZCBsb2NrIGlzIG5vdCBuZWVkZWQKKyAqIGJldHdlZW4gcmVhZGVyIGFuZCB3cml0ZXIuCisgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soYWVyX3JlY292ZXJfcmluZ19sb2NrKTsKK3N0YXRpYyBERUNMQVJFX1dPUksoYWVyX3JlY292ZXJfd29yaywgYWVyX3JlY292ZXJfd29ya19mdW5jKTsKKwordm9pZCBhZXJfcmVjb3Zlcl9xdWV1ZShpbnQgZG9tYWluLCB1bnNpZ25lZCBpbnQgYnVzLCB1bnNpZ25lZCBpbnQgZGV2Zm4sCisJCSAgICAgICBpbnQgc2V2ZXJpdHkpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYWVyX3JlY292ZXJfZW50cnkgZW50cnkgPSB7CisJCS5idXMJCT0gYnVzLAorCQkuZGV2Zm4JCT0gZGV2Zm4sCisJCS5kb21haW4JCT0gZG9tYWluLAorCQkuc2V2ZXJpdHkJPSBzZXZlcml0eSwKKwl9OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFlcl9yZWNvdmVyX3JpbmdfbG9jaywgZmxhZ3MpOworCWlmIChrZmlmb19wdXQoJmFlcl9yZWNvdmVyX3JpbmcsICZlbnRyeSkpCisJCXNjaGVkdWxlX3dvcmsoJmFlcl9yZWNvdmVyX3dvcmspOworCWVsc2UKKwkJcHJfZXJyKCJBRVIgcmVjb3ZlcjogQnVmZmVyIG92ZXJmbG93IHdoZW4gcmVjb3ZlcmluZyBBRVIgZm9yICUwNHg6JTAyeDolMDJ4OiV4XG4iLAorCQkgICAgICAgZG9tYWluLCBidXMsIFBDSV9TTE9UKGRldmZuKSwgUENJX0ZVTkMoZGV2Zm4pKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZXJfcmVjb3Zlcl9yaW5nX2xvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFlcl9yZWNvdmVyX3F1ZXVlKTsKKworc3RhdGljIHZvaWQgYWVyX3JlY292ZXJfd29ya19mdW5jKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYWVyX3JlY292ZXJfZW50cnkgZW50cnk7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisKKwl3aGlsZSAoa2ZpZm9fZ2V0KCZhZXJfcmVjb3Zlcl9yaW5nLCAmZW50cnkpKSB7CisJCXBkZXYgPSBwY2lfZ2V0X2RvbWFpbl9idXNfYW5kX3Nsb3QoZW50cnkuZG9tYWluLCBlbnRyeS5idXMsCisJCQkJCQkgICBlbnRyeS5kZXZmbik7CisJCWlmICghcGRldikgeworCQkJcHJfZXJyKCJBRVIgcmVjb3ZlcjogQ2FuIG5vdCBmaW5kIHBjaV9kZXYgZm9yICUwNHg6JTAyeDolMDJ4OiV4XG4iLAorCQkJICAgICAgIGVudHJ5LmRvbWFpbiwgZW50cnkuYnVzLAorCQkJICAgICAgIFBDSV9TTE9UKGVudHJ5LmRldmZuKSwgUENJX0ZVTkMoZW50cnkuZGV2Zm4pKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWRvX3JlY292ZXJ5KHBkZXYsIGVudHJ5LnNldmVyaXR5KTsKKwl9Cit9CisjZW5kaWYKKwogLyoqCiAgKiBnZXRfZGV2aWNlX2Vycm9yX2luZm8gLSByZWFkIGVycm9yIHN0YXR1cyBmcm9tIGRldiBhbmQgc3RvcmUgaXQgdG8gaW5mbwogICogQGRldjogcG9pbnRlciB0byB0aGUgZGV2aWNlIGV4cGVjdGVkIHRvIGhhdmUgYSBlcnJvciByZWNvcmQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3BjaWUvYWVyL2FlcmRydl9lcnJwcmludC5jIGIvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2VycnByaW50LmMKaW5kZXggYjA3YTQyZS4uM2VhNTE3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2VycnByaW50LmMKKysrIGIvZHJpdmVycy9wY2kvcGNpZS9hZXIvYWVyZHJ2X2VycnByaW50LmMKQEAgLTIwNCw3ICsyMDQsNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX0FDUElfQVBFSV9QQ0lFQUVSCi1zdGF0aWMgaW50IGNwZXJfc2V2ZXJpdHlfdG9fYWVyKGludCBjcGVyX3NldmVyaXR5KQoraW50IGNwZXJfc2V2ZXJpdHlfdG9fYWVyKGludCBjcGVyX3NldmVyaXR5KQogewogCXN3aXRjaCAoY3Blcl9zZXZlcml0eSkgewogCWNhc2UgQ1BFUl9TRVZfUkVDT1ZFUkFCTEU6CkBAIC0yMTUsNiArMjE1LDcgQEAKIAkJcmV0dXJuIEFFUl9DT1JSRUNUQUJMRTsKIAl9CiB9CitFWFBPUlRfU1lNQk9MX0dQTChjcGVyX3NldmVyaXR5X3RvX2Flcik7CiAKIHZvaWQgY3Blcl9wcmludF9hZXIoY29uc3QgY2hhciAqcHJlZml4LCBpbnQgY3Blcl9zZXZlcml0eSwKIAkJICAgIHN0cnVjdCBhZXJfY2FwYWJpbGl0eV9yZWdzICphZXIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wcm9iZS5jIGIvZHJpdmVycy9wY2kvcHJvYmUuYwppbmRleCA5YWI0OTJmLi43OTVjOTAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wcm9iZS5jCisrKyBiL2RyaXZlcnMvcGNpL3Byb2JlLmMKQEAgLTY4LDIxICs2OCw2IEBACiB9CiBwb3N0Y29yZV9pbml0Y2FsbChwY2lidXNfY2xhc3NfaW5pdCk7CiAKLS8qCi0gKiBUcmFuc2xhdGUgdGhlIGxvdyBiaXRzIG9mIHRoZSBQQ0kgYmFzZQotICogdG8gdGhlIHJlc291cmNlIHR5cGUKLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcGNpX2NhbGNfcmVzb3VyY2VfZmxhZ3ModW5zaWduZWQgaW50IGZsYWdzKQotewotCWlmIChmbGFncyAmIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfSU8pCi0JCXJldHVybiBJT1JFU09VUkNFX0lPOwotCi0JaWYgKGZsYWdzICYgUENJX0JBU0VfQUREUkVTU19NRU1fUFJFRkVUQ0gpCi0JCXJldHVybiBJT1JFU09VUkNFX01FTSB8IElPUkVTT1VSQ0VfUFJFRkVUQ0g7Ci0KLQlyZXR1cm4gSU9SRVNPVVJDRV9NRU07Ci19Ci0KIHN0YXRpYyB1NjQgcGNpX3NpemUodTY0IGJhc2UsIHU2NCBtYXhiYXNlLCB1NjQgbWFzaykKIHsKIAl1NjQgc2l6ZSA9IG1hc2sgJiBtYXhiYXNlOwkvKiBGaW5kIHRoZSBzaWduaWZpY2FudCBiaXRzICovCkBAIC0xMDEsMTggKzg2LDM5IEBACiAJcmV0dXJuIHNpemU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgZW51bSBwY2lfYmFyX3R5cGUgZGVjb2RlX2JhcihzdHJ1Y3QgcmVzb3VyY2UgKnJlcywgdTMyIGJhcikKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBkZWNvZGVfYmFyKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHUzMiBiYXIpCiB7CisJdTMyIG1lbV90eXBlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKIAlpZiAoKGJhciAmIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0UpID09IFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfSU8pIHsKLQkJcmVzLT5mbGFncyA9IGJhciAmIH5QQ0lfQkFTRV9BRERSRVNTX0lPX01BU0s7Ci0JCXJldHVybiBwY2lfYmFyX2lvOworCQlmbGFncyA9IGJhciAmIH5QQ0lfQkFTRV9BRERSRVNTX0lPX01BU0s7CisJCWZsYWdzIHw9IElPUkVTT1VSQ0VfSU87CisJCXJldHVybiBmbGFnczsKIAl9CiAKLQlyZXMtPmZsYWdzID0gYmFyICYgflBDSV9CQVNFX0FERFJFU1NfTUVNX01BU0s7CisJZmxhZ3MgPSBiYXIgJiB+UENJX0JBU0VfQUREUkVTU19NRU1fTUFTSzsKKwlmbGFncyB8PSBJT1JFU09VUkNFX01FTTsKKwlpZiAoZmxhZ3MgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9QUkVGRVRDSCkKKwkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9QUkVGRVRDSDsKIAotCWlmIChyZXMtPmZsYWdzICYgUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV82NCkKLQkJcmV0dXJuIHBjaV9iYXJfbWVtNjQ7Ci0JcmV0dXJuIHBjaV9iYXJfbWVtMzI7CisJbWVtX3R5cGUgPSBiYXIgJiBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFX01BU0s7CisJc3dpdGNoIChtZW1fdHlwZSkgeworCWNhc2UgUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV8zMjoKKwkJYnJlYWs7CisJY2FzZSBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzFNOgorCQlkZXZfaW5mbygmZGV2LT5kZXYsICIxTSBtZW0gQkFSIHRyZWF0ZWQgYXMgMzItYml0IEJBUlxuIik7CisJCWJyZWFrOworCWNhc2UgUENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV82NDoKKwkJZmxhZ3MgfD0gSU9SRVNPVVJDRV9NRU1fNjQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl93YXJuKCZkZXYtPmRldiwKKwkJCSAibWVtIHVua25vd24gdHlwZSAleCB0cmVhdGVkIGFzIDMyLWJpdCBCQVJcbiIsCisJCQkgbWVtX3R5cGUpOworCQlicmVhazsKKwl9CisJcmV0dXJuIGZsYWdzOwogfQogCiAvKioKQEAgLTE2NSw5ICsxNzEsOSBAQAogCQlsID0gMDsKIAogCWlmICh0eXBlID09IHBjaV9iYXJfdW5rbm93bikgewotCQl0eXBlID0gZGVjb2RlX2JhcihyZXMsIGwpOwotCQlyZXMtPmZsYWdzIHw9IHBjaV9jYWxjX3Jlc291cmNlX2ZsYWdzKGwpIHwgSU9SRVNPVVJDRV9TSVpFQUxJR047Ci0JCWlmICh0eXBlID09IHBjaV9iYXJfaW8pIHsKKwkJcmVzLT5mbGFncyA9IGRlY29kZV9iYXIoZGV2LCBsKTsKKwkJcmVzLT5mbGFncyB8PSBJT1JFU09VUkNFX1NJWkVBTElHTjsKKwkJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSB7CiAJCQlsICY9IFBDSV9CQVNFX0FERFJFU1NfSU9fTUFTSzsKIAkJCW1hc2sgPSBQQ0lfQkFTRV9BRERSRVNTX0lPX01BU0sgJiAodTMyKSBJT19TUEFDRV9MSU1JVDsKIAkJfSBlbHNlIHsKQEAgLTE4MCw3ICsxODYsNyBAQAogCQltYXNrID0gKHUzMilQQ0lfUk9NX0FERFJFU1NfTUFTSzsKIAl9CiAKLQlpZiAodHlwZSA9PSBwY2lfYmFyX21lbTY0KSB7CisJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTV82NCkgewogCQl1NjQgbDY0ID0gbDsKIAkJdTY0IHN6NjQgPSBzejsKIAkJdTY0IG1hc2s2NCA9IG1hc2sgfCAodTY0KX4wIDw8IDMyOwpAQCAtMjA0LDcgKzIxMCw2IEBACiAJCQlnb3RvIGZhaWw7CiAJCX0KIAotCQlyZXMtPmZsYWdzIHw9IElPUkVTT1VSQ0VfTUVNXzY0OwogCQlpZiAoKHNpemVvZihyZXNvdXJjZV9zaXplX3QpIDwgOCkgJiYgbCkgewogCQkJLyogQWRkcmVzcyBhYm92ZSAzMi1iaXQgYm91bmRhcnk7IGRpc2FibGUgdGhlIEJBUiAqLwogCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHBvcywgMCk7CkBAIC0yMzAsNyArMjM1LDcgQEAKIAl9CiAKICBvdXQ6Ci0JcmV0dXJuICh0eXBlID09IHBjaV9iYXJfbWVtNjQpID8gMSA6IDA7CisJcmV0dXJuIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU1fNjQpID8gMSA6IDA7CiAgZmFpbDoKIAlyZXMtPmZsYWdzID0gMDsKIAlnb3RvIG91dDsKQEAgLTI4NCwxMCArMjg5LDYgQEAKIAkJaWYgKCFyZXMtPmVuZCkKIAkJCXJlcy0+ZW5kID0gbGltaXQgKyAweGZmZjsKIAkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmZGV2LT5kZXYsICIgIGJyaWRnZSB3aW5kb3cgJXBSXG4iLCByZXMpOwotCX0gZWxzZSB7Ci0JCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmRldi0+ZGV2LAotCQkJICIgIGJyaWRnZSB3aW5kb3cgW2lvICAlIzA2bHgtJSMwNmx4XSAoZGlzYWJsZWQpXG4iLAotCQkJCSBiYXNlLCBsaW1pdCk7CiAJfQogfQogCkBAIC0zMDgsMTAgKzMwOSw2IEBACiAJCXJlcy0+c3RhcnQgPSBiYXNlOwogCQlyZXMtPmVuZCA9IGxpbWl0ICsgMHhmZmZmZjsKIAkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmZGV2LT5kZXYsICIgIGJyaWRnZSB3aW5kb3cgJXBSXG4iLCByZXMpOwotCX0gZWxzZSB7Ci0JCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmRldi0+ZGV2LAotCQkJIiAgYnJpZGdlIHdpbmRvdyBbbWVtICUjMDEwbHgtJSMwMTBseF0gKGRpc2FibGVkKVxuIiwKLQkJCQkJIGJhc2UsIGxpbWl0ICsgMHhmZmZmZik7CiAJfQogfQogCkBAIC0zNTksMTAgKzM1Niw2IEBACiAJCXJlcy0+c3RhcnQgPSBiYXNlOwogCQlyZXMtPmVuZCA9IGxpbWl0ICsgMHhmZmZmZjsKIAkJZGV2X3ByaW50ayhLRVJOX0RFQlVHLCAmZGV2LT5kZXYsICIgIGJyaWRnZSB3aW5kb3cgJXBSXG4iLCByZXMpOwotCX0gZWxzZSB7Ci0JCWRldl9wcmludGsoS0VSTl9ERUJVRywgJmRldi0+ZGV2LAotCQkgICAgICIgIGJyaWRnZSB3aW5kb3cgW21lbSAlIzAxMGx4LSUjMDEwbHggcHJlZl0gKGRpc2FibGVkKVxuIiwKLQkJCQkJIGJhc2UsIGxpbWl0ICsgMHhmZmZmZik7CiAJfQogfQogCkBAIC03MjUsMTIgKzcxOCwxNCBAQAogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoZGV2LCBQQ0lfU1RBVFVTLCAweGZmZmYpOwogCiAJCS8qIFByZXZlbnQgYXNzaWduaW5nIGEgYnVzIG51bWJlciB0aGF0IGFscmVhZHkgZXhpc3RzLgotCQkgKiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBhIGJyaWRnZSBpcyBob3QtcGx1Z2dlZCAqLwotCQlpZiAocGNpX2ZpbmRfYnVzKHBjaV9kb21haW5fbnIoYnVzKSwgbWF4KzEpKQotCQkJZ290byBvdXQ7Ci0JCWNoaWxkID0gcGNpX2FkZF9uZXdfYnVzKGJ1cywgZGV2LCArK21heCk7Ci0JCWlmICghY2hpbGQpCi0JCQlnb3RvIG91dDsKKwkJICogVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBicmlkZ2UgaXMgaG90LXBsdWdnZWQsIHNvIGluCisJCSAqIHRoaXMgY2FzZSB3ZSBvbmx5IHJlLXNjYW4gdGhpcyBidXMuICovCisJCWNoaWxkID0gcGNpX2ZpbmRfYnVzKHBjaV9kb21haW5fbnIoYnVzKSwgbWF4KzEpOworCQlpZiAoIWNoaWxkKSB7CisJCQljaGlsZCA9IHBjaV9hZGRfbmV3X2J1cyhidXMsIGRldiwgKyttYXgpOworCQkJaWYgKCFjaGlsZCkKKwkJCQlnb3RvIG91dDsKKwkJfQogCQlidXNlcyA9IChidXNlcyAmIDB4ZmYwMDAwMDApCiAJCSAgICAgIHwgKCh1bnNpZ25lZCBpbnQpKGNoaWxkLT5wcmltYXJ5KSAgICAgPDwgIDApCiAJCSAgICAgIHwgKCh1bnNpZ25lZCBpbnQpKGNoaWxkLT5zZWNvbmRhcnkpICAgPDwgIDgpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYyBiL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jCmluZGV4IDk5OTU4NDIuLjhhMWQzYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jCisrKyBiL2RyaXZlcnMvcGNpL3NldHVwLWJ1cy5jCkBAIC0zMzYsNyArMzM2LDYgQEAKIAkJLyogQ2xlYXIgdXBwZXIgMTYgYml0cyBvZiBJL08gYmFzZS9saW1pdC4gKi8KIAkJaW9fdXBwZXIxNiA9IDA7CiAJCWwgPSAweDAwZjA7Ci0JCWRldl9pbmZvKCZicmlkZ2UtPmRldiwgIiAgYnJpZGdlIHdpbmRvdyBbaW8gIGRpc2FibGVkXVxuIik7CiAJfQogCS8qIFRlbXBvcmFyaWx5IGRpc2FibGUgdGhlIEkvTyByYW5nZSBiZWZvcmUgdXBkYXRpbmcgUENJX0lPX0JBU0UuICovCiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChicmlkZ2UsIFBDSV9JT19CQVNFX1VQUEVSMTYsIDB4MDAwMGZmZmYpOwpAQCAtMzYyLDcgKzM2MSw2IEBACiAJCWRldl9pbmZvKCZicmlkZ2UtPmRldiwgIiAgYnJpZGdlIHdpbmRvdyAlcFJcbiIsIHJlcyk7CiAJfSBlbHNlIHsKIAkJbCA9IDB4MDAwMGZmZjA7Ci0JCWRldl9pbmZvKCZicmlkZ2UtPmRldiwgIiAgYnJpZGdlIHdpbmRvdyBbbWVtIGRpc2FibGVkXVxuIik7CiAJfQogCXBjaV93cml0ZV9jb25maWdfZHdvcmQoYnJpZGdlLCBQQ0lfTUVNT1JZX0JBU0UsIGwpOwogfQpAQCAtMzkzLDcgKzM5MSw2IEBACiAJCWRldl9pbmZvKCZicmlkZ2UtPmRldiwgIiAgYnJpZGdlIHdpbmRvdyAlcFJcbiIsIHJlcyk7CiAJfSBlbHNlIHsKIAkJbCA9IDB4MDAwMGZmZjA7Ci0JCWRldl9pbmZvKCZicmlkZ2UtPmRldiwgIiAgYnJpZGdlIHdpbmRvdyBbbWVtIHByZWYgZGlzYWJsZWRdXG4iKTsKIAl9CiAJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChicmlkZ2UsIFBDSV9QUkVGX01FTU9SWV9CQVNFLCBsKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvc2V0dXAtaXJxLmMgYi9kcml2ZXJzL3BjaS9zZXR1cC1pcnEuYwppbmRleCBlZWM5NzM4Li5lYjIxOWExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9zZXR1cC1pcnEuYworKysgYi9kcml2ZXJzL3BjaS9zZXR1cC1pcnEuYwpAQCAtMjEsNyArMjEsNyBAQAogc3RhdGljIHZvaWQgX19pbml0CiBwZGV2X2ZpeHVwX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2LAogCSAgICAgICB1OCAoKnN3aXp6bGUpKHN0cnVjdCBwY2lfZGV2ICosIHU4ICopLAotCSAgICAgICBpbnQgKCptYXBfaXJxKShzdHJ1Y3QgcGNpX2RldiAqLCB1OCwgdTgpKQorCSAgICAgICBpbnQgKCptYXBfaXJxKShjb25zdCBzdHJ1Y3QgcGNpX2RldiAqLCB1OCwgdTgpKQogewogCXU4IHBpbiwgc2xvdDsKIAlpbnQgaXJxID0gMDsKQEAgLTU2LDcgKzU2LDcgQEAKIAogdm9pZCBfX2luaXQKIHBjaV9maXh1cF9pcnFzKHU4ICgqc3dpenpsZSkoc3RydWN0IHBjaV9kZXYgKiwgdTggKiksCi0JICAgICAgIGludCAoKm1hcF9pcnEpKHN0cnVjdCBwY2lfZGV2ICosIHU4LCB1OCkpCisJICAgICAgIGludCAoKm1hcF9pcnEpKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICosIHU4LCB1OCkpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7CiAJZm9yX2VhY2hfcGNpX2RldihkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9zZXR1cC1yZXMuYyBiL2RyaXZlcnMvcGNpL3NldHVwLXJlcy5jCmluZGV4IGJjMGU2ZWUuLjMxOWYzNTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL3NldHVwLXJlcy5jCisrKyBiL2RyaXZlcnMvcGNpL3NldHVwLXJlcy5jCkBAIC03NCw4ICs3NCw3IEBACiAJCQlyZXNubywgbmV3LCBjaGVjayk7CiAJfQogCi0JaWYgKChuZXcgJiAoUENJX0JBU0VfQUREUkVTU19TUEFDRXxQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFX01BU0spKSA9PQotCSAgICAoUENJX0JBU0VfQUREUkVTU19TUEFDRV9NRU1PUll8UENJX0JBU0VfQUREUkVTU19NRU1fVFlQRV82NCkpIHsKKwlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfTUVNXzY0KSB7CiAJCW5ldyA9IHJlZ2lvbi5zdGFydCA+PiAxNiA+PiAxNjsKIAkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIHJlZyArIDQsIG5ldyk7CiAJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIHJlZyArIDQsICZjaGVjayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfYmFsbG9vbjMuYyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYWxsb29uMy5jCmluZGV4IDRjM2U5NGMuLmY1NmQ3ZGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYWxsb29uMy5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9iYWxsb29uMy5jCkBAIC0xMDMsMjIgKzEwMywxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBiYWxsb29uM19wY21jaWFfc29ja2V0X2luaXQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCi17Ci19Ci0KLXN0YXRpYyB2b2lkIGJhbGxvb24zX3BjbWNpYV9zb2NrZXRfc3VzcGVuZChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKLXsKLX0KLQogc3RhdGljIHN0cnVjdCBwY21jaWFfbG93X2xldmVsIGJhbGxvb24zX3BjbWNpYV9vcHMgPSB7CiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkuaHdfaW5pdAkJPSBiYWxsb29uM19wY21jaWFfaHdfaW5pdCwKIAkuaHdfc2h1dGRvd24JCT0gYmFsbG9vbjNfcGNtY2lhX2h3X3NodXRkb3duLAogCS5zb2NrZXRfc3RhdGUJCT0gYmFsbG9vbjNfcGNtY2lhX3NvY2tldF9zdGF0ZSwKIAkuY29uZmlndXJlX3NvY2tldAk9IGJhbGxvb24zX3BjbWNpYV9jb25maWd1cmVfc29ja2V0LAotCS5zb2NrZXRfaW5pdAkJPSBiYWxsb29uM19wY21jaWFfc29ja2V0X2luaXQsCi0JLnNvY2tldF9zdXNwZW5kCQk9IGJhbGxvb24zX3BjbWNpYV9zb2NrZXRfc3VzcGVuZCwKIAkuZmlyc3QJCQk9IDAsCiAJLm5yCQkJPSAxLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9jbV94MjU1LmMgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfY21feDI1NS5jCmluZGV4IDA1OTEzZDAuLjYzZjRkNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9jbV94MjU1LmMKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X2NtX3gyNTUuYwpAQCAtMTAyLDIzICsxMDIsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgY214MjU1X3BjbWNpYV9zb2NrZXRfaW5pdChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKLXsKLX0KLQotc3RhdGljIHZvaWQgY214MjU1X3BjbWNpYV9zb2NrZXRfc3VzcGVuZChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKLXsKLX0KLQotCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9sb3dfbGV2ZWwgY214MjU1X3BjbWNpYV9vcHMgX19pbml0ZGF0YSA9IHsKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCS5od19pbml0CQk9IGNteDI1NV9wY21jaWFfaHdfaW5pdCwKIAkuaHdfc2h1dGRvd24JCT0gY214MjU1X3BjbWNpYV9zaHV0ZG93biwKIAkuc29ja2V0X3N0YXRlCQk9IGNteDI1NV9wY21jaWFfc29ja2V0X3N0YXRlLAogCS5jb25maWd1cmVfc29ja2V0CT0gY214MjU1X3BjbWNpYV9jb25maWd1cmVfc29ja2V0LAotCS5zb2NrZXRfaW5pdAkJPSBjbXgyNTVfcGNtY2lhX3NvY2tldF9pbml0LAotCS5zb2NrZXRfc3VzcGVuZAkJPSBjbXgyNTVfcGNtY2lhX3NvY2tldF9zdXNwZW5kLAogCS5ucgkJCT0gMSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9jbV94MjcwLmMgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfY21feDI3MC5jCmluZGV4IDU2NjI2NDYuLjZlZTQyYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9jbV94MjcwLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X2NtX3gyNzAuYwpAQCAtODIsMjMgKzgyLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGNteDI3MF9wY21jaWFfc29ja2V0X2luaXQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCi17Ci19Ci0KLXN0YXRpYyB2b2lkIGNteDI3MF9wY21jaWFfc29ja2V0X3N1c3BlbmQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCi17Ci19Ci0KLQogc3RhdGljIHN0cnVjdCBwY21jaWFfbG93X2xldmVsIGNteDI3MF9wY21jaWFfb3BzIF9faW5pdGRhdGEgPSB7CiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkuaHdfaW5pdAkJPSBjbXgyNzBfcGNtY2lhX2h3X2luaXQsCiAJLmh3X3NodXRkb3duCQk9IGNteDI3MF9wY21jaWFfc2h1dGRvd24sCiAJLnNvY2tldF9zdGF0ZQkJPSBjbXgyNzBfcGNtY2lhX3NvY2tldF9zdGF0ZSwKIAkuY29uZmlndXJlX3NvY2tldAk9IGNteDI3MF9wY21jaWFfY29uZmlndXJlX3NvY2tldCwKLQkuc29ja2V0X2luaXQJCT0gY214MjcwX3BjbWNpYV9zb2NrZXRfaW5pdCwKLQkuc29ja2V0X3N1c3BlbmQJCT0gY214MjcwX3BjbWNpYV9zb2NrZXRfc3VzcGVuZCwKIAkubnIJCQk9IDEsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfY29saWJyaS5jIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X2NvbGlicmkuYwppbmRleCA0NDNjYjdmLi5jNmRlYzU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfY29saWJyaS5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9jb2xpYnJpLmMKQEAgLTExNiwxNCArMTE2LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgY29saWJyaV9wY21jaWFfc29ja2V0X2luaXQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCi17Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbGlicmlfcGNtY2lhX3NvY2tldF9zdXNwZW5kKHN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0KQotewotfQotCiBzdGF0aWMgc3RydWN0IHBjbWNpYV9sb3dfbGV2ZWwgY29saWJyaV9wY21jaWFfb3BzID0gewogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAKQEAgLTEzNSw5ICsxMjcsNiBAQAogCiAJLnNvY2tldF9zdGF0ZQkJPSBjb2xpYnJpX3BjbWNpYV9zb2NrZXRfc3RhdGUsCiAJLmNvbmZpZ3VyZV9zb2NrZXQJPSBjb2xpYnJpX3BjbWNpYV9jb25maWd1cmVfc29ja2V0LAotCi0JLnNvY2tldF9pbml0CQk9IGNvbGlicmlfcGNtY2lhX3NvY2tldF9pbml0LAotCS5zb2NrZXRfc3VzcGVuZAkJPSBjb2xpYnJpX3BjbWNpYV9zb2NrZXRfc3VzcGVuZCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpjb2xpYnJpX3BjbWNpYV9kZXZpY2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfbWFpbnN0b25lLmMgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfbWFpbnN0b25lLmMKaW5kZXggOTIwMTZmZS4uYWRlZDcwNmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9tYWluc3RvbmUuYworKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfbWFpbnN0b25lLmMKQEAgLTEyOCwyMiArMTI4LDEyIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgbXN0X3BjbWNpYV9zb2NrZXRfaW5pdChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKLXsKLX0KLQotc3RhdGljIHZvaWQgbXN0X3BjbWNpYV9zb2NrZXRfc3VzcGVuZChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKLXsKLX0KLQogc3RhdGljIHN0cnVjdCBwY21jaWFfbG93X2xldmVsIG1zdF9wY21jaWFfb3BzIF9faW5pdGRhdGEgPSB7CiAJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKIAkuaHdfaW5pdAkJPSBtc3RfcGNtY2lhX2h3X2luaXQsCiAJLmh3X3NodXRkb3duCQk9IG1zdF9wY21jaWFfaHdfc2h1dGRvd24sCiAJLnNvY2tldF9zdGF0ZQkJPSBtc3RfcGNtY2lhX3NvY2tldF9zdGF0ZSwKIAkuY29uZmlndXJlX3NvY2tldAk9IG1zdF9wY21jaWFfY29uZmlndXJlX3NvY2tldCwKLQkuc29ja2V0X2luaXQJCT0gbXN0X3BjbWNpYV9zb2NrZXRfaW5pdCwKLQkuc29ja2V0X3N1c3BlbmQJCT0gbXN0X3BjbWNpYV9zb2NrZXRfc3VzcGVuZCwKIAkubnIJCQk9IDIsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfcGFsbWxkLmMgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfcGFsbWxkLmMKaW5kZXggNjlmNzM2Ny4uZDU4OWFkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X3BhbG1sZC5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9wYWxtbGQuYwpAQCAtNjUsMTQgKzY1LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgcGFsbWxkX3BjbWNpYV9zb2NrZXRfaW5pdChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKLXsKLX0KLQotc3RhdGljIHZvaWQgcGFsbWxkX3BjbWNpYV9zb2NrZXRfc3VzcGVuZChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKLXsKLX0KLQogc3RhdGljIHN0cnVjdCBwY21jaWFfbG93X2xldmVsIHBhbG1sZF9wY21jaWFfb3BzID0gewogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAKQEAgLTg0LDkgKzc2LDYgQEAKIAogCS5zb2NrZXRfc3RhdGUJCT0gcGFsbWxkX3BjbWNpYV9zb2NrZXRfc3RhdGUsCiAJLmNvbmZpZ3VyZV9zb2NrZXQJPSBwYWxtbGRfcGNtY2lhX2NvbmZpZ3VyZV9zb2NrZXQsCi0KLQkuc29ja2V0X2luaXQJCT0gcGFsbWxkX3BjbWNpYV9zb2NrZXRfaW5pdCwKLQkuc29ja2V0X3N1c3BlbmQJCT0gcGFsbWxkX3BjbWNpYV9zb2NrZXRfc3VzcGVuZCwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwYWxtbGRfcGNtY2lhX2RldmljZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9wYWxtdGMuYyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9wYWxtdGMuYwppbmRleCBkMGFkNmE3Li45YzZhMDRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfcGFsbXRjLmMKKysrIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X3BhbG10Yy5jCkBAIC0xMTcsMTQgKzExNyw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgcGFsbXRjX3BjbWNpYV9zb2NrZXRfaW5pdChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKLXsKLX0KLQotc3RhdGljIHZvaWQgcGFsbXRjX3BjbWNpYV9zb2NrZXRfc3VzcGVuZChzdHJ1Y3Qgc29jX3BjbWNpYV9zb2NrZXQgKnNrdCkKLXsKLX0KLQogc3RhdGljIHN0cnVjdCBwY21jaWFfbG93X2xldmVsIHBhbG10Y19wY21jaWFfb3BzID0gewogCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCiAKQEAgLTEzNiw5ICsxMjgsNiBAQAogCiAJLnNvY2tldF9zdGF0ZQkJPSBwYWxtdGNfcGNtY2lhX3NvY2tldF9zdGF0ZSwKIAkuY29uZmlndXJlX3NvY2tldAk9IHBhbG10Y19wY21jaWFfY29uZmlndXJlX3NvY2tldCwKLQotCS5zb2NrZXRfaW5pdAkJPSBwYWxtdGNfcGNtY2lhX3NvY2tldF9pbml0LAotCS5zb2NrZXRfc3VzcGVuZAkJPSBwYWxtdGNfcGNtY2lhX3NvY2tldF9zdXNwZW5kLAogfTsKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBhbG10Y19wY21jaWFfZGV2aWNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X3BhbG10eC5jIGIvZHJpdmVycy9wY21jaWEvcHhhMnh4X3BhbG10eC5jCmluZGV4IDFhMjU4MDQuLjgwNjQ1YTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9wYWxtdHguYworKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfcGFsbXR4LmMKQEAgLTY3LDE0ICs2Nyw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHBhbG10eF9wY21jaWFfc29ja2V0X2luaXQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCi17Ci19Ci0KLXN0YXRpYyB2b2lkIHBhbG10eF9wY21jaWFfc29ja2V0X3N1c3BlbmQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCi17Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2xvd19sZXZlbCBwYWxtdHhfcGNtY2lhX29wcyA9IHsKIAkub3duZXIJCQk9IFRISVNfTU9EVUxFLAogCkBAIC04Niw5ICs3OCw2IEBACiAKIAkuc29ja2V0X3N0YXRlCQk9IHBhbG10eF9wY21jaWFfc29ja2V0X3N0YXRlLAogCS5jb25maWd1cmVfc29ja2V0CT0gcGFsbXR4X3BjbWNpYV9jb25maWd1cmVfc29ja2V0LAotCi0JLnNvY2tldF9pbml0CQk9IHBhbG10eF9wY21jaWFfc29ja2V0X2luaXQsCi0JLnNvY2tldF9zdXNwZW5kCQk9IHBhbG10eF9wY21jaWFfc29ja2V0X3N1c3BlbmQsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGFsbXR4X3BjbWNpYV9kZXZpY2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfc3RhcmdhdGUyLmMgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfc3RhcmdhdGUyLmMKaW5kZXggZDA4ODAyZi4uOTM5NjIyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X3N0YXJnYXRlMi5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3B4YTJ4eF9zdGFyZ2F0ZTIuYwpAQCAtMjgsNyArMjgsNiBAQAogCiAjaW5jbHVkZSAic29jX2NvbW1vbi5oIgogCi0jZGVmaW5lIFNHMl9TMF9CVUZGX0NUTAkJMTIwCiAjZGVmaW5lIFNHMl9TMF9QT1dFUl9DVEwJMTA4CiAjZGVmaW5lIFNHMl9TMF9HUElPX1JFU0VUCTgyCiAjZGVmaW5lIFNHMl9TMF9HUElPX0RFVEVDVAk1MwpAQCAtMzgsNiArMzcsMTEgQEAKIAl7IDAsIElSUV9HUElPKFNHMl9TMF9HUElPX0RFVEVDVCksICJQQ01DSUEwIENEIiB9LAogfTsKIAorc3RhdGljIHN0cnVjdCBncGlvIHNnMl9wY21jaWFfZ3Bpb3NbXSA9IHsKKwl7IFNHMl9TMF9HUElPX1JFU0VULCBHUElPRl9PVVRfSU5JVF9ISUdILCAiUENNQ0lBIFJlc2V0IiB9LAorCXsgU0cyX1MwX1BPV0VSX0NUTCwgR1BJT0ZfT1VUX0lOSVRfSElHSCwgIlBDTUNJQSBQb3dlciBDdHJsIiB9LAorfTsKKwogc3RhdGljIGludCBzZzJfcGNtY2lhX2h3X2luaXQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCiB7CiAJc2t0LT5zb2NrZXQucGNpX2lycSA9IElSUV9HUElPKFNHMl9TMF9HUElPX1JFQURZKTsKQEAgLTEyMiwzNyArMTI2LDIzIEBACiAJaWYgKCFzZzJfcGNtY2lhX2RldmljZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlyZXQgPSBncGlvX3JlcXVlc3QoU0cyX1MwX0JVRkZfQ1RMLCAiU0cyIENGIGJ1ZmYgY3RsIik7CisJcmV0ID0gZ3Bpb19yZXF1ZXN0X2FycmF5KHNnMl9wY21jaWFfZ3Bpb3MsIEFSUkFZX1NJWkUoc2cyX3BjbWNpYV9ncGlvcykpOwogCWlmIChyZXQpCiAJCWdvdG8gZXJyb3JfcHV0X3BsYXRmb3JtX2RldmljZTsKLQlyZXQgPSBncGlvX3JlcXVlc3QoU0cyX1MwX1BPV0VSX0NUTCwgIlNHMiBDRiBwb3dlciBjdGwiKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yX2ZyZWVfZ3Bpb19idWZmX2N0bDsKLQlyZXQgPSBncGlvX3JlcXVlc3QoU0cyX1MwX0dQSU9fUkVTRVQsICJTRzIgQ0YgcmVzZXQiKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yX2ZyZWVfZ3Bpb19wb3dlcl9jdGw7Ci0JLyogU2V0IGdwaW8gZGlyZWN0aW9ucyAqLwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChTRzJfUzBfQlVGRl9DVEwsIDApOwotCWdwaW9fZGlyZWN0aW9uX291dHB1dChTRzJfUzBfUE9XRVJfQ1RMLCAxKTsKLQlncGlvX2RpcmVjdGlvbl9vdXRwdXQoU0cyX1MwX0dQSU9fUkVTRVQsIDEpOwogCiAJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKHNnMl9wY21jaWFfZGV2aWNlLAogCQkJCSAgICAgICAmc2cyX3BjbWNpYV9vcHMsCiAJCQkJICAgICAgIHNpemVvZihzZzJfcGNtY2lhX29wcykpOwogCWlmIChyZXQpCi0JCWdvdG8gZXJyb3JfZnJlZV9ncGlvX3Jlc2V0OworCQlnb3RvIGVycm9yX2ZyZWVfZ3Bpb3M7CiAKIAlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHNnMl9wY21jaWFfZGV2aWNlKTsKIAlpZiAocmV0KQotCQlnb3RvIGVycm9yX2ZyZWVfZ3Bpb19yZXNldDsKKwkJZ290byBlcnJvcl9mcmVlX2dwaW9zOwogCiAJcmV0dXJuIDA7Ci1lcnJvcl9mcmVlX2dwaW9fcmVzZXQ6Ci0JZ3Bpb19mcmVlKFNHMl9TMF9HUElPX1JFU0VUKTsKLWVycm9yX2ZyZWVfZ3Bpb19wb3dlcl9jdGw6Ci0JZ3Bpb19mcmVlKFNHMl9TMF9QT1dFUl9DVEwpOwotZXJyb3JfZnJlZV9ncGlvX2J1ZmZfY3RsOgotCWdwaW9fZnJlZShTRzJfUzBfQlVGRl9DVEwpOworZXJyb3JfZnJlZV9ncGlvczoKKwlncGlvX2ZyZWVfYXJyYXkoc2cyX3BjbWNpYV9ncGlvcywgQVJSQVlfU0laRShzZzJfcGNtY2lhX2dwaW9zKSk7CiBlcnJvcl9wdXRfcGxhdGZvcm1fZGV2aWNlOgogCXBsYXRmb3JtX2RldmljZV9wdXQoc2cyX3BjbWNpYV9kZXZpY2UpOwogCkBAIC0xNjIsOSArMTUyLDcgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCBzZzJfcGNtY2lhX2V4aXQodm9pZCkKIHsKIAlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihzZzJfcGNtY2lhX2RldmljZSk7Ci0JZ3Bpb19mcmVlKFNHMl9TMF9CVUZGX0NUTCk7Ci0JZ3Bpb19mcmVlKFNHMl9TMF9QT1dFUl9DVEwpOwotCWdwaW9fZnJlZShTRzJfUzBfR1BJT19SRVNFVCk7CisJZ3Bpb19mcmVlX2FycmF5KHNnMl9wY21jaWFfZ3Bpb3MsIEFSUkFZX1NJWkUoc2cyX3BjbWNpYV9ncGlvcykpOwogfQogCiBmc19pbml0Y2FsbChzZzJfcGNtY2lhX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY21jaWEvcHhhMnh4X3ZpcGVyLmMgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfdmlwZXIuYwppbmRleCBhNTFmMjA3Li4xMDY0YjFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjbWNpYS9weGEyeHhfdmlwZXIuYworKysgYi9kcml2ZXJzL3BjbWNpYS9weGEyeHhfdmlwZXIuYwpAQCAtMTM2LDIyICsxMzYsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgdmlwZXJfcGNtY2lhX3NvY2tldF9pbml0KHN0cnVjdCBzb2NfcGNtY2lhX3NvY2tldCAqc2t0KQotewotfQotCi1zdGF0aWMgdm9pZCB2aXBlcl9wY21jaWFfc29ja2V0X3N1c3BlbmQoc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QpCi17Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgcGNtY2lhX2xvd19sZXZlbCB2aXBlcl9wY21jaWFfb3BzID0gewogCS5vd25lciAgICAgICAgICAJPSBUSElTX01PRFVMRSwKIAkuaHdfaW5pdCAgICAgICAgCT0gdmlwZXJfcGNtY2lhX2h3X2luaXQsCiAJLmh3X3NodXRkb3duCQk9IHZpcGVyX3BjbWNpYV9od19zaHV0ZG93biwKIAkuc29ja2V0X3N0YXRlCQk9IHZpcGVyX3BjbWNpYV9zb2NrZXRfc3RhdGUsCiAJLmNvbmZpZ3VyZV9zb2NrZXQJPSB2aXBlcl9wY21jaWFfY29uZmlndXJlX3NvY2tldCwKLQkuc29ja2V0X2luaXQJCT0gdmlwZXJfcGNtY2lhX3NvY2tldF9pbml0LAotCS5zb2NrZXRfc3VzcGVuZAkJPSB2aXBlcl9wY21jaWFfc29ja2V0X3N1c3BlbmQsCiAJLm5yICAgICAgICAgCQk9IDEsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjbWNpYS9zb2NfY29tbW9uLmMgYi9kcml2ZXJzL3BjbWNpYS9zb2NfY29tbW9uLmMKaW5kZXggNzY4Zjk1Ny4uYTBhOWMyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY21jaWEvc29jX2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvcGNtY2lhL3NvY19jb21tb24uYwpAQCAtMTg2LDggKzE4Niw4IEBACiAJc3RydWN0IHNvY19wY21jaWFfc29ja2V0ICpza3QgPSB0b19zb2NfcGNtY2lhX3NvY2tldChzb2NrKTsKIAogCWRlYnVnKHNrdCwgMiwgImluaXRpYWxpemluZyBzb2NrZXRcbiIpOwotCi0Jc2t0LT5vcHMtPnNvY2tldF9pbml0KHNrdCk7CisJaWYgKHNrdC0+b3BzLT5zb2NrZXRfaW5pdCkKKwkJc2t0LT5vcHMtPnNvY2tldF9pbml0KHNrdCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIwNyw3ICsyMDcsOCBAQAogCiAJZGVidWcoc2t0LCAyLCAic3VzcGVuZGluZyBzb2NrZXRcbiIpOwogCi0Jc2t0LT5vcHMtPnNvY2tldF9zdXNwZW5kKHNrdCk7CisJaWYgKHNrdC0+b3BzLT5zb2NrZXRfc3VzcGVuZCkKKwkJc2t0LT5vcHMtPnNvY2tldF9zdXNwZW5kKHNrdCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvS2NvbmZpZyBiL2RyaXZlcnMvcG93ZXIvS2NvbmZpZwppbmRleCBlNTdiNTBiLi41N2RlMDUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL0tjb25maWcKKysrIGIvZHJpdmVycy9wb3dlci9LY29uZmlnCkBAIC0yMzUsNCArMjM1LDE4IEBACiAJICBUaGlzIGRyaXZlciBjYW4gYmUgYnVpbGQgYXMgYSBtb2R1bGUuIElmIHNvLCB0aGUgbW9kdWxlIHdpbGwgYmUKIAkgIGNhbGxlZCBncGlvLWNoYXJnZXIuCiAKK2NvbmZpZyBDSEFSR0VSX01BWDg5OTcKKwl0cmlzdGF0ZSAiTWF4aW0gTUFYODk5Ny9NQVg4OTY2IFBNSUMgYmF0dGVyeSBjaGFyZ2VyIGRyaXZlciIKKwlkZXBlbmRzIG9uIE1GRF9NQVg4OTk3ICYmIFJFR1VMQVRPUl9NQVg4OTk3CisJaGVscAorCSAgU2F5IFkgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBiYXR0ZXJ5IGNoYXJnZXIgY29udHJvbCBzeXNmcyBhbmQKKwkgIHBsYXRmb3JtIGRhdGEgb2YgTUFYODk5Ny9MUDM5NzQgUE1JQ3MuCisKK2NvbmZpZyBDSEFSR0VSX01BWDg5OTgKKwl0cmlzdGF0ZSAiTWF4aW0gTUFYODk5OC9MUDM5NzQgUE1JQyBiYXR0ZXJ5IGNoYXJnZXIgZHJpdmVyIgorCWRlcGVuZHMgb24gTUZEX01BWDg5OTggJiYgUkVHVUxBVE9SX01BWDg5OTgKKwloZWxwCisJICBTYXkgWSB0byBlbmFibGUgc3VwcG9ydCBmb3IgdGhlIGJhdHRlcnkgY2hhcmdlciBjb250cm9sIHN5c2ZzIGFuZAorCSAgcGxhdGZvcm0gZGF0YSBvZiBNQVg4OTk4L0xQMzk3NCBQTUlDcy4KKwogZW5kaWYgIyBQT1dFUl9TVVBQTFkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvTWFrZWZpbGUgYi9kcml2ZXJzL3Bvd2VyL01ha2VmaWxlCmluZGV4IDAwOWE5MGYuLmI0YWYxM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9wb3dlci9NYWtlZmlsZQpAQCAtMzYsMyArMzYsNSBAQAogb2JqLSQoQ09ORklHX0NIQVJHRVJfTUFYODkwMykJKz0gbWF4ODkwM19jaGFyZ2VyLm8KIG9iai0kKENPTkZJR19DSEFSR0VSX1RXTDQwMzApCSs9IHR3bDQwMzBfY2hhcmdlci5vCiBvYmotJChDT05GSUdfQ0hBUkdFUl9HUElPKQkrPSBncGlvLWNoYXJnZXIubworb2JqLSQoQ09ORklHX0NIQVJHRVJfTUFYODk5NykJKz0gbWF4ODk5N19jaGFyZ2VyLm8KK29iai0kKENPTkZJR19DSEFSR0VSX01BWDg5OTgpCSs9IG1heDg5OThfY2hhcmdlci5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2FwbV9wb3dlci5jIGIvZHJpdmVycy9wb3dlci9hcG1fcG93ZXIuYwppbmRleCBkYzYyOGNiLi44YTYxMmRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL2FwbV9wb3dlci5jCisrKyBiL2RyaXZlcnMvcG93ZXIvYXBtX3Bvd2VyLmMKQEAgLTE0LDExICsxNCwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2FwbS1lbXVsYXRpb24uaD4KIAogCi0jZGVmaW5lIFBTWV9QUk9QKHBzeSwgcHJvcCwgdmFsKSBwc3ktPmdldF9wcm9wZXJ0eShwc3ksIFwKLQkJCSBQT1dFUl9TVVBQTFlfUFJPUF8jI3Byb3AsIHZhbCkKKyNkZWZpbmUgUFNZX1BST1AocHN5LCBwcm9wLCB2YWwpIChwc3ktPmdldF9wcm9wZXJ0eShwc3ksIFwKKwkJCSBQT1dFUl9TVVBQTFlfUFJPUF8jI3Byb3AsIHZhbCkpCiAKLSNkZWZpbmUgX01QU1lfUFJPUChwcm9wLCB2YWwpIG1haW5fYmF0dGVyeS0+Z2V0X3Byb3BlcnR5KG1haW5fYmF0dGVyeSwgXAotCQkJCQkJCSBwcm9wLCB2YWwpCisjZGVmaW5lIF9NUFNZX1BST1AocHJvcCwgdmFsKSAobWFpbl9iYXR0ZXJ5LT5nZXRfcHJvcGVydHkobWFpbl9iYXR0ZXJ5LCBcCisJCQkJCQkJIHByb3AsIHZhbCkpCiAKICNkZWZpbmUgTVBTWV9QUk9QKHByb3AsIHZhbCkgX01QU1lfUFJPUChQT1dFUl9TVVBQTFlfUFJPUF8jI3Byb3AsIHZhbCkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9icTIwejc1LmMgYi9kcml2ZXJzL3Bvd2VyL2JxMjB6NzUuYwppbmRleCA1MDY1ODVlLi45YzVlNWJlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL2JxMjB6NzUuYworKysgYi9kcml2ZXJzL3Bvd2VyL2JxMjB6NzUuYwpAQCAtMTUyLDYgKzE1MiwxMCBAQAogCWJvb2wJCQkJZ3Bpb19kZXRlY3Q7CiAJYm9vbAkJCQllbmFibGVfZGV0ZWN0aW9uOwogCWludAkJCQlpcnE7CisJaW50CQkJCWxhc3Rfc3RhdGU7CisJaW50CQkJCXBvbGxfdGltZTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCQl3b3JrOworCWludAkJCQlpZ25vcmVfY2hhbmdlczsKIH07CiAKIHN0YXRpYyBpbnQgYnEyMHo3NV9yZWFkX3dvcmRfZGF0YShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCB1OCBhZGRyZXNzKQpAQCAtMjc5LDYgKzI4Myw3IEBACiAJaW50IHJlZ19vZmZzZXQsIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKIAl1bmlvbiBwb3dlcl9zdXBwbHlfcHJvcHZhbCAqdmFsKQogeworCXN0cnVjdCBicTIwejc1X2luZm8gKmJxMjB6NzVfZGV2aWNlID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7CiAJczMyIHJldDsKIAogCXJldCA9IGJxMjB6NzVfcmVhZF93b3JkX2RhdGEoY2xpZW50LApAQCAtMjkzLDE1ICsyOTgsMjQgQEAKIAlpZiAocmV0ID49IGJxMjB6NzVfZGF0YVtyZWdfb2Zmc2V0XS5taW5fdmFsdWUgJiYKIAkgICAgcmV0IDw9IGJxMjB6NzVfZGF0YVtyZWdfb2Zmc2V0XS5tYXhfdmFsdWUpIHsKIAkJdmFsLT5pbnR2YWwgPSByZXQ7Ci0JCWlmIChwc3AgPT0gUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTKSB7Ci0JCQlpZiAocmV0ICYgQkFUVEVSWV9GVUxMX0NIQVJHRUQpCi0JCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0ZVTEw7Ci0JCQllbHNlIGlmIChyZXQgJiBCQVRURVJZX0ZVTExfRElTQ0hBUkdFRCkKLQkJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfTk9UX0NIQVJHSU5HOwotCQkJZWxzZSBpZiAocmV0ICYgQkFUVEVSWV9ESVNDSEFSR0lORykKLQkJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkc7Ci0JCQllbHNlCi0JCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0NIQVJHSU5HOworCQlpZiAocHNwICE9IFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUykKKwkJCXJldHVybiAwOworCisJCWlmIChyZXQgJiBCQVRURVJZX0ZVTExfQ0hBUkdFRCkKKwkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19GVUxMOworCQllbHNlIGlmIChyZXQgJiBCQVRURVJZX0ZVTExfRElTQ0hBUkdFRCkKKwkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19OT1RfQ0hBUkdJTkc7CisJCWVsc2UgaWYgKHJldCAmIEJBVFRFUllfRElTQ0hBUkdJTkcpCisJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRElTQ0hBUkdJTkc7CisJCWVsc2UKKwkJCXZhbC0+aW50dmFsID0gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzsKKworCQlpZiAoYnEyMHo3NV9kZXZpY2UtPnBvbGxfdGltZSA9PSAwKQorCQkJYnEyMHo3NV9kZXZpY2UtPmxhc3Rfc3RhdGUgPSB2YWwtPmludHZhbDsKKwkJZWxzZSBpZiAoYnEyMHo3NV9kZXZpY2UtPmxhc3Rfc3RhdGUgIT0gdmFsLT5pbnR2YWwpIHsKKwkJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmYnEyMHo3NV9kZXZpY2UtPndvcmspOworCQkJcG93ZXJfc3VwcGx5X2NoYW5nZWQoJmJxMjB6NzVfZGV2aWNlLT5wb3dlcl9zdXBwbHkpOworCQkJYnEyMHo3NV9kZXZpY2UtPnBvbGxfdGltZSA9IDA7CiAJCX0KIAl9IGVsc2UgewogCQlpZiAocHNwID09IFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUykKQEAgLTU0NSw2ICs1NTksNjAgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKK3N0YXRpYyB2b2lkIGJxMjB6NzVfZXh0ZXJuYWxfcG93ZXJfY2hhbmdlZChzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3kpCit7CisJc3RydWN0IGJxMjB6NzVfaW5mbyAqYnEyMHo3NV9kZXZpY2U7CisKKwlicTIwejc1X2RldmljZSA9IGNvbnRhaW5lcl9vZihwc3ksIHN0cnVjdCBicTIwejc1X2luZm8sIHBvd2VyX3N1cHBseSk7CisKKwlpZiAoYnEyMHo3NV9kZXZpY2UtPmlnbm9yZV9jaGFuZ2VzID4gMCkgeworCQlicTIwejc1X2RldmljZS0+aWdub3JlX2NoYW5nZXMtLTsKKwkJcmV0dXJuOworCX0KKworCS8qIGNhbmNlbCBvdXRzdGFuZGluZyB3b3JrICovCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZicTIwejc1X2RldmljZS0+d29yayk7CisKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmJxMjB6NzVfZGV2aWNlLT53b3JrLCBIWik7CisJYnEyMHo3NV9kZXZpY2UtPnBvbGxfdGltZSA9IGJxMjB6NzVfZGV2aWNlLT5wZGF0YS0+cG9sbF9yZXRyeV9jb3VudDsKK30KKworc3RhdGljIHZvaWQgYnEyMHo3NV9kZWxheWVkX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBicTIwejc1X2luZm8gKmJxMjB6NzVfZGV2aWNlOworCXMzMiByZXQ7CisKKwlicTIwejc1X2RldmljZSA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYnEyMHo3NV9pbmZvLCB3b3JrLndvcmspOworCisJcmV0ID0gYnEyMHo3NV9yZWFkX3dvcmRfZGF0YShicTIwejc1X2RldmljZS0+Y2xpZW50LAorCQkJCSAgICAgYnEyMHo3NV9kYXRhW1JFR19TVEFUVVNdLmFkZHIpOworCS8qIGlmIHRoZSByZWFkIGZhaWxlZCwgZ2l2ZSB1cCBvbiB0aGlzIHdvcmsgKi8KKwlpZiAocmV0IDwgMCkgeworCQlicTIwejc1X2RldmljZS0+cG9sbF90aW1lID0gMDsKKwkJcmV0dXJuOworCX0KKworCWlmIChyZXQgJiBCQVRURVJZX0ZVTExfQ0hBUkdFRCkKKwkJcmV0ID0gUE9XRVJfU1VQUExZX1NUQVRVU19GVUxMOworCWVsc2UgaWYgKHJldCAmIEJBVFRFUllfRlVMTF9ESVNDSEFSR0VEKQorCQlyZXQgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX05PVF9DSEFSR0lORzsKKwllbHNlIGlmIChyZXQgJiBCQVRURVJZX0RJU0NIQVJHSU5HKQorCQlyZXQgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX0RJU0NIQVJHSU5HOworCWVsc2UKKwkJcmV0ID0gUE9XRVJfU1VQUExZX1NUQVRVU19DSEFSR0lORzsKKworCWlmIChicTIwejc1X2RldmljZS0+bGFzdF9zdGF0ZSAhPSByZXQpIHsKKwkJYnEyMHo3NV9kZXZpY2UtPnBvbGxfdGltZSA9IDA7CisJCXBvd2VyX3N1cHBseV9jaGFuZ2VkKCZicTIwejc1X2RldmljZS0+cG93ZXJfc3VwcGx5KTsKKwkJcmV0dXJuOworCX0KKwlpZiAoYnEyMHo3NV9kZXZpY2UtPnBvbGxfdGltZSA+IDApIHsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZicTIwejc1X2RldmljZS0+d29yaywgSFopOworCQlicTIwejc1X2RldmljZS0+cG9sbF90aW1lLS07CisJCXJldHVybjsKKwl9Cit9CisKIHN0YXRpYyBpbnQgX19kZXZpbml0IGJxMjB6NzVfcHJvYmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwKIAljb25zdCBzdHJ1Y3QgaTJjX2RldmljZV9pZCAqaWQpCiB7CkBAIC01NjYsNiArNjM0LDEzIEBACiAJYnEyMHo3NV9kZXZpY2UtPnBvd2VyX3N1cHBseS5udW1fcHJvcGVydGllcyA9CiAJCUFSUkFZX1NJWkUoYnEyMHo3NV9wcm9wZXJ0aWVzKTsKIAlicTIwejc1X2RldmljZS0+cG93ZXJfc3VwcGx5LmdldF9wcm9wZXJ0eSA9IGJxMjB6NzVfZ2V0X3Byb3BlcnR5OworCS8qIGlnbm9yZSBmaXJzdCBub3RpZmljYXRpb24gb2YgZXh0ZXJuYWwgY2hhbmdlLCBpdCBpcyBnZW5lcmF0ZWQKKwkgKiBmcm9tIHRoZSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIgY2FsbCBiYWNrCisJICovCisJYnEyMHo3NV9kZXZpY2UtPmlnbm9yZV9jaGFuZ2VzID0gMTsKKwlicTIwejc1X2RldmljZS0+bGFzdF9zdGF0ZSA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfVU5LTk9XTjsKKwlicTIwejc1X2RldmljZS0+cG93ZXJfc3VwcGx5LmV4dGVybmFsX3Bvd2VyX2NoYW5nZWQgPQorCQlicTIwejc1X2V4dGVybmFsX3Bvd2VyX2NoYW5nZWQ7CiAKIAlpZiAocGRhdGEpIHsKIAkJYnEyMHo3NV9kZXZpY2UtPmdwaW9fZGV0ZWN0ID0KQEAgLTYyNSw2ICs3MDAsMTAgQEAKIAlkZXZfaW5mbygmY2xpZW50LT5kZXYsCiAJCSIlczogYmF0dGVyeSBnYXMgZ2F1Z2UgZGV2aWNlIHJlZ2lzdGVyZWRcbiIsIGNsaWVudC0+bmFtZSk7CiAKKwlJTklUX0RFTEFZRURfV09SSygmYnEyMHo3NV9kZXZpY2UtPndvcmssIGJxMjB6NzVfZGVsYXllZF93b3JrKTsKKworCWJxMjB6NzVfZGV2aWNlLT5lbmFibGVfZGV0ZWN0aW9uID0gdHJ1ZTsKKwogCXJldHVybiAwOwogCiBleGl0X3BzdXBwbHk6CkBAIC02NDgsNiArNzI3LDkgQEAKIAkJZ3Bpb19mcmVlKGJxMjB6NzVfZGV2aWNlLT5wZGF0YS0+YmF0dGVyeV9kZXRlY3QpOwogCiAJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJmJxMjB6NzVfZGV2aWNlLT5wb3dlcl9zdXBwbHkpOworCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZicTIwejc1X2RldmljZS0+d29yayk7CisKIAlrZnJlZShicTIwejc1X2RldmljZSk7CiAJYnEyMHo3NV9kZXZpY2UgPSBOVUxMOwogCkBAIC02NjEsNiArNzQzLDkgQEAKIAlzdHJ1Y3QgYnEyMHo3NV9pbmZvICpicTIwejc1X2RldmljZSA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCXMzMiByZXQ7CiAKKwlpZiAoYnEyMHo3NV9kZXZpY2UtPnBvbGxfdGltZSA+IDApCisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmYnEyMHo3NV9kZXZpY2UtPndvcmspOworCiAJLyogd3JpdGUgdG8gbWFudWZhY3R1cmVyIGFjY2VzcyB3aXRoIHNsZWVwIGNvbW1hbmQgKi8KIAlyZXQgPSBicTIwejc1X3dyaXRlX3dvcmRfZGF0YShjbGllbnQsCiAJCWJxMjB6NzVfZGF0YVtSRUdfTUFOVUZBQ1RVUkVSX0RBVEFdLmFkZHIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2dwaW8tY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9ncGlvLWNoYXJnZXIuYwppbmRleCA3MThmMmM1Li5hNjRiODg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL2dwaW8tY2hhcmdlci5jCisrKyBiL2RyaXZlcnMvcG93ZXIvZ3Bpby1jaGFyZ2VyLmMKQEAgLTEyNyw3ICsxMjcsNyBAQAogCQlyZXQgPSByZXF1ZXN0X2FueV9jb250ZXh0X2lycShpcnEsIGdwaW9fY2hhcmdlcl9pcnEsCiAJCQkJSVJRRl9UUklHR0VSX1JJU0lORyB8IElSUUZfVFJJR0dFUl9GQUxMSU5HLAogCQkJCWRldl9uYW1lKCZwZGV2LT5kZXYpLCBjaGFyZ2VyKTsKLQkJaWYgKHJldCkKKwkJaWYgKHJldCA8IDApCiAJCQlkZXZfd2FybigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgaXJxOiAlZFxuIiwgcmV0KTsKIAkJZWxzZQogCQkJZ3Bpb19jaGFyZ2VyLT5pcnEgPSBpcnE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL21heDE3MDQyX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvbWF4MTcwNDJfYmF0dGVyeS5jCmluZGV4IGM1Yzg4MDUuLjk4YmZhYjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvbWF4MTcwNDJfYmF0dGVyeS5jCisrKyBiL2RyaXZlcnMvcG93ZXIvbWF4MTcwNDJfYmF0dGVyeS5jCkBAIC0yOSw3NCArMjksNiBAQAogI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgogI2luY2x1ZGUgPGxpbnV4L3Bvd2VyL21heDE3MDQyX2JhdHRlcnkuaD4KIAotZW51bSBtYXgxNzA0Ml9yZWdpc3RlciB7Ci0JTUFYMTcwNDJfU1RBVFVTCQk9IDB4MDAsCi0JTUFYMTcwNDJfVkFMUlRfVGgJPSAweDAxLAotCU1BWDE3MDQyX1RBTFJUX1RoCT0gMHgwMiwKLQlNQVgxNzA0Ml9TQUxSVF9UaAk9IDB4MDMsCi0JTUFYMTcwNDJfQXRSYXRlCQk9IDB4MDQsCi0JTUFYMTcwNDJfUmVwQ2FwCQk9IDB4MDUsCi0JTUFYMTcwNDJfUmVwU09DCQk9IDB4MDYsCi0JTUFYMTcwNDJfQWdlCQk9IDB4MDcsCi0JTUFYMTcwNDJfVEVNUAkJPSAweDA4LAotCU1BWDE3MDQyX1ZDRUxMCQk9IDB4MDksCi0JTUFYMTcwNDJfQ3VycmVudAk9IDB4MEEsCi0JTUFYMTcwNDJfQXZnQ3VycmVudAk9IDB4MEIsCi0JTUFYMTcwNDJfUXJlc2lkdWFsCT0gMHgwQywKLQlNQVgxNzA0Ml9TT0MJCT0gMHgwRCwKLQlNQVgxNzA0Ml9BdlNPQwkJPSAweDBFLAotCU1BWDE3MDQyX1JlbUNhcAkJPSAweDBGLAotCU1BWDE3NDAyX0Z1bGxDQVAJPSAweDEwLAotCU1BWDE3MDQyX1RURQkJPSAweDExLAotCU1BWDE3MDQyX1ZfZW1wdHkJPSAweDEyLAotCi0JTUFYMTcwNDJfUlNMT1cJCT0gMHgxNCwKLQotCU1BWDE3MDQyX0F2Z1RBCQk9IDB4MTYsCi0JTUFYMTcwNDJfQ3ljbGVzCQk9IDB4MTcsCi0JTUFYMTcwNDJfRGVzaWduQ2FwCT0gMHgxOCwKLQlNQVgxNzA0Ml9BdmdWQ0VMTAk9IDB4MTksCi0JTUFYMTcwNDJfTWluTWF4VGVtcAk9IDB4MUEsCi0JTUFYMTcwNDJfTWluTWF4Vm9sdAk9IDB4MUIsCi0JTUFYMTcwNDJfTWluTWF4Q3Vycgk9IDB4MUMsCi0JTUFYMTcwNDJfQ09ORklHCQk9IDB4MUQsCi0JTUFYMTcwNDJfSUNIR1Rlcm0JPSAweDFFLAotCU1BWDE3MDQyX0F2Q2FwCQk9IDB4MUYsCi0JTUFYMTcwNDJfTWFuTmFtZQk9IDB4MjAsCi0JTUFYMTcwNDJfRGV2TmFtZQk9IDB4MjEsCi0JTUFYMTcwNDJfRGV2Q2hlbQk9IDB4MjIsCi0KLQlNQVgxNzA0Ml9UZW1wTm9tCT0gMHgyNCwKLQlNQVgxNzA0Ml9UZW1wQ29sZAk9IDB4MjUsCi0JTUFYMTcwNDJfVGVtcEhvdAk9IDB4MjYsCi0JTUFYMTcwNDJfQUlOCQk9IDB4MjcsCi0JTUFYMTcwNDJfTGVhcm5DRkcJPSAweDI4LAotCU1BWDE3MDQyX1NIRlRDRkcJPSAweDI5LAotCU1BWDE3MDQyX1JlbGF4Q0ZHCT0gMHgyQSwKLQlNQVgxNzA0Ml9NaXNjQ0ZHCT0gMHgyQiwKLQlNQVgxNzA0Ml9UR0FJTgkJPSAweDJDLAotCU1BeDE3MDQyX1RPRkYJCT0gMHgyRCwKLQlNQVgxNzA0Ml9DR0FJTgkJPSAweDJFLAotCU1BWDE3MDQyX0NPRkYJCT0gMHgyRiwKLQotCU1BWDE3MDQyX1FfZW1wdHkJPSAweDMzLAotCU1BWDE3MDQyX1RfZW1wdHkJPSAweDM0LAotCi0JTUFYMTcwNDJfUkNPTVAwCQk9IDB4MzgsCi0JTUFYMTcwNDJfVGVtcENvCQk9IDB4MzksCi0JTUFYMTcwNDJfUngJCT0gMHgzQSwKLQlNQVgxNzA0Ml9UX2VtcHR5MAk9IDB4M0IsCi0JTUFYMTcwNDJfVGFza1BlcmlvZAk9IDB4M0MsCi0JTUFYMTcwNDJfRlNUQVQJCT0gMHgzRCwKLQotCU1BWDE3MDQyX1NIRE5USU1FUgk9IDB4M0YsCi0KLQlNQVgxNzA0Ml9WRlJlbUNhcAk9IDB4NEEsCi0KLQlNQVgxNzA0Ml9RSAkJPSAweDRELAotCU1BWDE3MDQyX1FMCQk9IDB4NEUsCi19OwotCiBzdHJ1Y3QgbWF4MTcwNDJfY2hpcCB7CiAJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5IGJhdHRlcnk7CkBAIC0xMjMsMTAgKzU1LDI3IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIHZvaWQgbWF4MTcwNDJfc2V0X3JlZyhzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LAorCQkJICAgICBzdHJ1Y3QgbWF4MTcwNDJfcmVnX2RhdGEgKmRhdGEsIGludCBzaXplKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJbWF4MTcwNDJfd3JpdGVfcmVnKGNsaWVudCwgZGF0YVtpXS5hZGRyLCBkYXRhW2ldLmRhdGEpOworfQorCiBzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgbWF4MTcwNDJfYmF0dGVyeV9wcm9wc1tdID0geworCVBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsCisJUE9XRVJfU1VQUExZX1BST1BfQ1lDTEVfQ09VTlQsCisJUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NQVgsCisJUE9XRVJfU1VQUExZX1BST1BfVk9MVEFHRV9NSU5fREVTSUdOLAogCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XLAogCVBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfQVZHLAogCVBPV0VSX1NVUFBMWV9QUk9QX0NBUEFDSVRZLAorCVBPV0VSX1NVUFBMWV9QUk9QX0NIQVJHRV9GVUxMLAorCVBPV0VSX1NVUFBMWV9QUk9QX1RFTVAsCisJUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9OT1csCisJUE9XRVJfU1VQUExZX1BST1BfQ1VSUkVOVF9BVkcsCiB9OwogCiBzdGF0aWMgaW50IG1heDE3MDQyX2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCkBAIC0xMzcsNiArODYsMzAgQEAKIAkJCQlzdHJ1Y3QgbWF4MTcwNDJfY2hpcCwgYmF0dGVyeSk7CiAKIAlzd2l0Y2ggKHBzcCkgeworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfUFJFU0VOVDoKKwkJdmFsLT5pbnR2YWwgPSBtYXgxNzA0Ml9yZWFkX3JlZyhjaGlwLT5jbGllbnQsCisJCQkJTUFYMTcwNDJfU1RBVFVTKTsKKwkJaWYgKHZhbC0+aW50dmFsICYgTUFYMTcwNDJfU1RBVFVTX0JhdHRBYnNlbnQpCisJCQl2YWwtPmludHZhbCA9IDA7CisJCWVsc2UKKwkJCXZhbC0+aW50dmFsID0gMTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DWUNMRV9DT1VOVDoKKwkJdmFsLT5pbnR2YWwgPSBtYXgxNzA0Ml9yZWFkX3JlZyhjaGlwLT5jbGllbnQsCisJCQkJTUFYMTcwNDJfQ3ljbGVzKTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9WT0xUQUdFX01BWDoKKwkJdmFsLT5pbnR2YWwgPSBtYXgxNzA0Ml9yZWFkX3JlZyhjaGlwLT5jbGllbnQsCisJCQkJTUFYMTcwNDJfTWluTWF4Vm9sdCk7CisJCXZhbC0+aW50dmFsID4+PSA4OworCQl2YWwtPmludHZhbCAqPSAyMDAwMDsgLyogVW5pdHMgb2YgTFNCID0gMjBtViAqLworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTUlOX0RFU0lHTjoKKwkJdmFsLT5pbnR2YWwgPSBtYXgxNzA0Ml9yZWFkX3JlZyhjaGlwLT5jbGllbnQsCisJCQkJTUFYMTcwNDJfVl9lbXB0eSk7CisJCXZhbC0+aW50dmFsID4+PSA3OworCQl2YWwtPmludHZhbCAqPSAxMDAwMDsgLyogVW5pdHMgb2YgTFNCID0gMTBtViAqLworCQlicmVhazsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1ZPTFRBR0VfTk9XOgogCQl2YWwtPmludHZhbCA9IG1heDE3MDQyX3JlYWRfcmVnKGNoaXAtPmNsaWVudCwKIAkJCQlNQVgxNzA0Ml9WQ0VMTCkgKiA4MzsgLyogMTAwMCAvIDEyID0gODMgKi8KQEAgLTE0OSw2ICsxMjIsNTcgQEAKIAkJdmFsLT5pbnR2YWwgPSBtYXgxNzA0Ml9yZWFkX3JlZyhjaGlwLT5jbGllbnQsCiAJCQkJTUFYMTcwNDJfU09DKSAvIDI1NjsKIAkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DSEFSR0VfRlVMTDoKKwkJdmFsLT5pbnR2YWwgPSBtYXgxNzA0Ml9yZWFkX3JlZyhjaGlwLT5jbGllbnQsCisJCQkJTUFYMTcwNDJfUmVwU09DKTsKKwkJaWYgKCh2YWwtPmludHZhbCAvIDI1NikgPj0gTUFYMTcwNDJfQkFUVEVSWV9GVUxMKQorCQkJdmFsLT5pbnR2YWwgPSAxOworCQllbHNlIGlmICh2YWwtPmludHZhbCA+PSAwKQorCQkJdmFsLT5pbnR2YWwgPSAwOworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1RFTVA6CisJCXZhbC0+aW50dmFsID0gbWF4MTcwNDJfcmVhZF9yZWcoY2hpcC0+Y2xpZW50LAorCQkJCU1BWDE3MDQyX1RFTVApOworCQkvKiBUaGUgdmFsdWUgaXMgc2lnbmVkLiAqLworCQlpZiAodmFsLT5pbnR2YWwgJiAweDgwMDApIHsKKwkJCXZhbC0+aW50dmFsID0gKDB4N2ZmZiAmIH52YWwtPmludHZhbCkgKyAxOworCQkJdmFsLT5pbnR2YWwgKj0gLTE7CisJCX0KKwkJLyogVGhlIHZhbHVlIGlzIGNvbnZlcnRlZCBpbnRvIGRlY2ktY2VudGlncmFkZSBzY2FsZSAqLworCQkvKiBVbml0cyBvZiBMU0IgPSAxIC8gMjU2IGRlZ3JlZSBDZWxzaXVzICovCisJCXZhbC0+aW50dmFsID0gdmFsLT5pbnR2YWwgKiAxMCAvIDI1NjsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9DVVJSRU5UX05PVzoKKwkJaWYgKGNoaXAtPnBkYXRhLT5lbmFibGVfY3VycmVudF9zZW5zZSkgeworCQkJdmFsLT5pbnR2YWwgPSBtYXgxNzA0Ml9yZWFkX3JlZyhjaGlwLT5jbGllbnQsCisJCQkJCU1BWDE3MDQyX0N1cnJlbnQpOworCQkJaWYgKHZhbC0+aW50dmFsICYgMHg4MDAwKSB7CisJCQkJLyogTmVnYXRpdmUgKi8KKwkJCQl2YWwtPmludHZhbCA9IH52YWwtPmludHZhbCAmIDB4N2ZmZjsKKwkJCQl2YWwtPmludHZhbCsrOworCQkJCXZhbC0+aW50dmFsICo9IC0xOworCQkJfQorCQkJdmFsLT5pbnR2YWwgPj49IDQ7CisJCQl2YWwtPmludHZhbCAqPSAxMDAwMDAwICogMjUgLyBjaGlwLT5wZGF0YS0+cl9zbnM7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX0NVUlJFTlRfQVZHOgorCQlpZiAoY2hpcC0+cGRhdGEtPmVuYWJsZV9jdXJyZW50X3NlbnNlKSB7CisJCQl2YWwtPmludHZhbCA9IG1heDE3MDQyX3JlYWRfcmVnKGNoaXAtPmNsaWVudCwKKwkJCQkJTUFYMTcwNDJfQXZnQ3VycmVudCk7CisJCQlpZiAodmFsLT5pbnR2YWwgJiAweDgwMDApIHsKKwkJCQkvKiBOZWdhdGl2ZSAqLworCQkJCXZhbC0+aW50dmFsID0gfnZhbC0+aW50dmFsICYgMHg3ZmZmOworCQkJCXZhbC0+aW50dmFsKys7CisJCQkJdmFsLT5pbnR2YWwgKj0gLTE7CisJCQl9CisJCQl2YWwtPmludHZhbCAqPSAxNTYyNTAwIC8gY2hpcC0+cGRhdGEtPnJfc25zOworCQl9IGVsc2UgeworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTgwLDE4ICsyMDQsMzAgQEAKIAljaGlwLT5iYXR0ZXJ5LnByb3BlcnRpZXMJPSBtYXgxNzA0Ml9iYXR0ZXJ5X3Byb3BzOwogCWNoaXAtPmJhdHRlcnkubnVtX3Byb3BlcnRpZXMJPSBBUlJBWV9TSVpFKG1heDE3MDQyX2JhdHRlcnlfcHJvcHMpOwogCisJLyogV2hlbiBjdXJyZW50IGlzIG5vdCBtZWFzdXJlZCwKKwkgKiBDVVJSRU5UX05PVyBhbmQgQ1VSUkVOVF9BVkcgcHJvcGVydGllcyBzaG91bGQgYmUgaW52aXNpYmxlLiAqLworCWlmICghY2hpcC0+cGRhdGEtPmVuYWJsZV9jdXJyZW50X3NlbnNlKQorCQljaGlwLT5iYXR0ZXJ5Lm51bV9wcm9wZXJ0aWVzIC09IDI7CisKIAlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIoJmNsaWVudC0+ZGV2LCAmY2hpcC0+YmF0dGVyeSk7CiAJaWYgKHJldCkgewogCQlkZXZfZXJyKCZjbGllbnQtPmRldiwgImZhaWxlZDogcG93ZXIgc3VwcGx5IHJlZ2lzdGVyXG4iKTsKLQkJaTJjX3NldF9jbGllbnRkYXRhKGNsaWVudCwgTlVMTCk7CiAJCWtmcmVlKGNoaXApOwogCQlyZXR1cm4gcmV0OwogCX0KIAorCS8qIEluaXRpYWxpemUgcmVnaXN0ZXJzIGFjY29yZGluZyB0byB2YWx1ZXMgZnJvbSB0aGUgcGxhdGZvcm0gZGF0YSAqLworCWlmIChjaGlwLT5wZGF0YS0+aW5pdF9kYXRhKQorCQltYXgxNzA0Ml9zZXRfcmVnKGNsaWVudCwgY2hpcC0+cGRhdGEtPmluaXRfZGF0YSwKKwkJCQkgY2hpcC0+cGRhdGEtPm51bV9pbml0X2RhdGEpOworCiAJaWYgKCFjaGlwLT5wZGF0YS0+ZW5hYmxlX2N1cnJlbnRfc2Vuc2UpIHsKIAkJbWF4MTcwNDJfd3JpdGVfcmVnKGNsaWVudCwgTUFYMTcwNDJfQ0dBSU4sIDB4MDAwMCk7CiAJCW1heDE3MDQyX3dyaXRlX3JlZyhjbGllbnQsIE1BWDE3MDQyX01pc2NDRkcsIDB4MDAwMyk7CiAJCW1heDE3MDQyX3dyaXRlX3JlZyhjbGllbnQsIE1BWDE3MDQyX0xlYXJuQ0ZHLCAweDAwMDcpOworCX0gZWxzZSB7CisJCWlmIChjaGlwLT5wZGF0YS0+cl9zbnMgPT0gMCkKKwkJCWNoaXAtPnBkYXRhLT5yX3NucyA9IE1BWDE3MDQyX0RFRkFVTFRfU05TX1JFU0lTVE9SOwogCX0KIAogCXJldHVybiAwOwpAQCAtMjAyLDcgKzIzOCw2IEBACiAJc3RydWN0IG1heDE3MDQyX2NoaXAgKmNoaXAgPSBpMmNfZ2V0X2NsaWVudGRhdGEoY2xpZW50KTsKIAogCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZjaGlwLT5iYXR0ZXJ5KTsKLQlpMmNfc2V0X2NsaWVudGRhdGEoY2xpZW50LCBOVUxMKTsKIAlrZnJlZShjaGlwKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvbWF4ODkwM19jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL21heDg5MDNfY2hhcmdlci5jCmluZGV4IDMzZmYwZTMuLmE5YjAyMDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvbWF4ODkwM19jaGFyZ2VyLmMKKysrIGIvZHJpdmVycy9wb3dlci9tYXg4OTAzX2NoYXJnZXIuYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Bvd2VyL21heDg5MDNfY2hhcmdlci5oPgogCiBzdHJ1Y3QgbWF4ODkwM19kYXRhIHsKLQlzdHJ1Y3QgbWF4ODkwM19wZGF0YSAqcGRhdGE7CisJc3RydWN0IG1heDg5MDNfcGRhdGEgcGRhdGE7CiAJc3RydWN0IGRldmljZSAqZGV2OwogCXN0cnVjdCBwb3dlcl9zdXBwbHkgcHN5OwogCWJvb2wgZmF1bHQ7CkBAIC01Miw4ICs1Miw4IEBACiAJc3dpdGNoIChwc3ApIHsKIAljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKIAkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX1VOS05PV047Ci0JCWlmIChkYXRhLT5wZGF0YS0+Y2hnKSB7Ci0JCQlpZiAoZ3Bpb19nZXRfdmFsdWUoZGF0YS0+cGRhdGEtPmNoZykgPT0gMCkKKwkJaWYgKGRhdGEtPnBkYXRhLmNoZykgeworCQkJaWYgKGdwaW9fZ2V0X3ZhbHVlKGRhdGEtPnBkYXRhLmNoZykgPT0gMCkKIAkJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfQ0hBUkdJTkc7CiAJCQllbHNlIGlmIChkYXRhLT51c2JfaW4gfHwgZGF0YS0+dGFfaW4pCiAJCQkJdmFsLT5pbnR2YWwgPSBQT1dFUl9TVVBQTFlfU1RBVFVTX05PVF9DSEFSR0lORzsKQEAgLTgwLDcgKzgwLDcgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBtYXg4OTAzX2RjaW4oaW50IGlycSwgdm9pZCAqX2RhdGEpCiB7CiAJc3RydWN0IG1heDg5MDNfZGF0YSAqZGF0YSA9IF9kYXRhOwotCXN0cnVjdCBtYXg4OTAzX3BkYXRhICpwZGF0YSA9IGRhdGEtPnBkYXRhOworCXN0cnVjdCBtYXg4OTAzX3BkYXRhICpwZGF0YSA9ICZkYXRhLT5wZGF0YTsKIAlib29sIHRhX2luOwogCWVudW0gcG93ZXJfc3VwcGx5X3R5cGUgb2xkX3R5cGU7CiAKQEAgLTEyMSw3ICsxMjEsNyBAQAogc3RhdGljIGlycXJldHVybl90IG1heDg5MDNfdXNiaW4oaW50IGlycSwgdm9pZCAqX2RhdGEpCiB7CiAJc3RydWN0IG1heDg5MDNfZGF0YSAqZGF0YSA9IF9kYXRhOwotCXN0cnVjdCBtYXg4OTAzX3BkYXRhICpwZGF0YSA9IGRhdGEtPnBkYXRhOworCXN0cnVjdCBtYXg4OTAzX3BkYXRhICpwZGF0YSA9ICZkYXRhLT5wZGF0YTsKIAlib29sIHVzYl9pbjsKIAllbnVtIHBvd2VyX3N1cHBseV90eXBlIG9sZF90eXBlOwogCkBAIC0xNjAsNyArMTYwLDcgQEAKIHN0YXRpYyBpcnFyZXR1cm5fdCBtYXg4OTAzX2ZhdWx0KGludCBpcnEsIHZvaWQgKl9kYXRhKQogewogCXN0cnVjdCBtYXg4OTAzX2RhdGEgKmRhdGEgPSBfZGF0YTsKLQlzdHJ1Y3QgbWF4ODkwM19wZGF0YSAqcGRhdGEgPSBkYXRhLT5wZGF0YTsKKwlzdHJ1Y3QgbWF4ODkwM19wZGF0YSAqcGRhdGEgPSAmZGF0YS0+cGRhdGE7CiAJYm9vbCBmYXVsdDsKIAogCWZhdWx0ID0gZ3Bpb19nZXRfdmFsdWUocGRhdGEtPmZsdCkgPyBmYWxzZSA6IHRydWU7CkBAIC0xOTMsNyArMTkzLDcgQEAKIAkJZGV2X2VycihkZXYsICJDYW5ub3QgYWxsb2NhdGUgbWVtb3J5LlxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KLQlkYXRhLT5wZGF0YSA9IHBkYXRhOworCW1lbWNweSgmZGF0YS0+cGRhdGEsIHBkYXRhLCBzaXplb2Yoc3RydWN0IG1heDg5MDNfcGRhdGEpKTsKIAlkYXRhLT5kZXYgPSBkZXY7CiAJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGF0YSk7CiAKQEAgLTM0OSw3ICszNDksNyBAQAogCXN0cnVjdCBtYXg4OTAzX2RhdGEgKmRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAogCWlmIChkYXRhKSB7Ci0JCXN0cnVjdCBtYXg4OTAzX3BkYXRhICpwZGF0YSA9IGRhdGEtPnBkYXRhOworCQlzdHJ1Y3QgbWF4ODkwM19wZGF0YSAqcGRhdGEgPSAmZGF0YS0+cGRhdGE7CiAKIAkJaWYgKHBkYXRhLT5mbHQpCiAJCQlmcmVlX2lycShncGlvX3RvX2lycShwZGF0YS0+Zmx0KSwgZGF0YSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL21heDg5OTdfY2hhcmdlci5jIGIvZHJpdmVycy9wb3dlci9tYXg4OTk3X2NoYXJnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTA2YjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9wb3dlci9tYXg4OTk3X2NoYXJnZXIuYwpAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIG1heDg5OTdfY2hhcmdlci5jIC0gUG93ZXIgc3VwcGx5IGNvbnN1bWVyIGRyaXZlciBmb3IgdGhlIE1heGltIDg5OTcvODk2NgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcworICogIE15dW5nSm9vIEhhbSA8bXl1bmdqb28uaGFtQHNhbXN1bmcuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Bvd2VyX3N1cHBseS5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9tYXg4OTk3Lmg+CisjaW5jbHVkZSA8bGludXgvbWZkL21heDg5OTctcHJpdmF0ZS5oPgorCitzdHJ1Y3QgY2hhcmdlcl9kYXRhIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IG1heDg5OTdfZGV2ICppb2RldjsKKwlzdHJ1Y3QgcG93ZXJfc3VwcGx5IGJhdHRlcnk7Cit9OworCitzdGF0aWMgZW51bSBwb3dlcl9zdXBwbHlfcHJvcGVydHkgbWF4ODk5N19iYXR0ZXJ5X3Byb3BzW10gPSB7CisJUE9XRVJfU1VQUExZX1BST1BfU1RBVFVTLCAvKiAiRlVMTCIgb3IgIk5PVCBGVUxMIiBvbmx5LiAqLworCVBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsIC8qIHRoZSBwcmVzZW5jZSBvZiBiYXR0ZXJ5ICovCisJUE9XRVJfU1VQUExZX1BST1BfT05MSU5FLCAvKiBjaGFyZ2VyIGlzIGFjdGl2ZSBvciBub3QgKi8KK307CisKKy8qIE5vdGUgdGhhdCB0aGUgY2hhcmdlciBjb250cm9sIGlzIGRvbmUgYnkgYSBjdXJyZW50IHJlZ3VsYXRvciAiQ0hBUkdFUiIgKi8KK3N0YXRpYyBpbnQgbWF4ODk5N19iYXR0ZXJ5X2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCisJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwkJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlzdHJ1Y3QgY2hhcmdlcl9kYXRhICpjaGFyZ2VyID0gY29udGFpbmVyX29mKHBzeSwKKwkJCXN0cnVjdCBjaGFyZ2VyX2RhdGEsIGJhdHRlcnkpOworCXN0cnVjdCBpMmNfY2xpZW50ICppMmMgPSBjaGFyZ2VyLT5pb2Rldi0+aTJjOworCWludCByZXQ7CisJdTggcmVnOworCisJc3dpdGNoIChwc3ApIHsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1NUQVRVUzoKKwkJdmFsLT5pbnR2YWwgPSAwOworCQlyZXQgPSBtYXg4OTk3X3JlYWRfcmVnKGkyYywgTUFYODk5N19SRUdfU1RBVFVTNCwgJnJlZyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlpZiAoKHJlZyAmICgxIDw8IDApKSA9PSAweDEpCisJCQl2YWwtPmludHZhbCA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfRlVMTDsKKworCQlicmVhazsKKwljYXNlIFBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQ6CisJCXZhbC0+aW50dmFsID0gMDsKKwkJcmV0ID0gbWF4ODk5N19yZWFkX3JlZyhpMmMsIE1BWDg5OTdfUkVHX1NUQVRVUzQsICZyZWcpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwkJaWYgKChyZWcgJiAoMSA8PCAyKSkgPT0gMHgwKQorCQkJdmFsLT5pbnR2YWwgPSAxOworCisJCWJyZWFrOworCWNhc2UgUE9XRVJfU1VQUExZX1BST1BfT05MSU5FOgorCQl2YWwtPmludHZhbCA9IDA7CisJCXJldCA9IG1heDg5OTdfcmVhZF9yZWcoaTJjLCBNQVg4OTk3X1JFR19TVEFUVVM0LCAmcmVnKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCS8qIERDSU5PSyAqLworCQlpZiAocmVnICYgKDEgPDwgMSkpCisJCQl2YWwtPmludHZhbCA9IDE7CisKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2RldmluaXQgaW50IG1heDg5OTdfYmF0dGVyeV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBjaGFyZ2VyX2RhdGEgKmNoYXJnZXI7CisJc3RydWN0IG1heDg5OTdfZGV2ICppb2RldiA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgbWF4ODk5N19wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoaW9kZXYtPmRldik7CisKKwlpZiAoIXBkYXRhKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChwZGF0YS0+ZW9jX21BKSB7CisJCXU4IHZhbCA9IChwZGF0YS0+ZW9jX21BIC0gNTApIC8gMTA7CisJCWlmICh2YWwgPCAwKQorCQkJdmFsID0gMDsKKwkJaWYgKHZhbCA+IDB4ZikKKwkJCXZhbCA9IDB4ZjsKKworCQlyZXQgPSBtYXg4OTk3X3VwZGF0ZV9yZWcoaW9kZXYtPmkyYywKKwkJCQlNQVg4OTk3X1JFR19NQkNDVFJMNSwgdmFsLCAweGYpOworCQlpZiAocmV0IDwgMCkgeworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IHVzZSBpMmMgYnVzLlxuIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJc3dpdGNoIChwZGF0YS0+dGltZW91dCkgeworCWNhc2UgNToKKwkJcmV0ID0gbWF4ODk5N191cGRhdGVfcmVnKGlvZGV2LT5pMmMsIE1BWDg5OTdfUkVHX01CQ0NUUkwxLAorCQkJCTB4MiA8PCA0LCAweDcgPDwgNCk7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJcmV0ID0gbWF4ODk5N191cGRhdGVfcmVnKGlvZGV2LT5pMmMsIE1BWDg5OTdfUkVHX01CQ0NUUkwxLAorCQkJCTB4MyA8PCA0LCAweDcgPDwgNCk7CisJCWJyZWFrOworCWNhc2UgNzoKKwkJcmV0ID0gbWF4ODk5N191cGRhdGVfcmVnKGlvZGV2LT5pMmMsIE1BWDg5OTdfUkVHX01CQ0NUUkwxLAorCQkJCTB4NCA8PCA0LCAweDcgPDwgNCk7CisJCWJyZWFrOworCWNhc2UgMDoKKwkJcmV0ID0gbWF4ODk5N191cGRhdGVfcmVnKGlvZGV2LT5pMmMsIE1BWDg5OTdfUkVHX01CQ0NUUkwxLAorCQkJCTB4NyA8PCA0LCAweDcgPDwgNCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImluY29ycmVjdCB0aW1lb3V0IHZhbHVlICglZClcbiIsCisJCQkJcGRhdGEtPnRpbWVvdXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiQ2Fubm90IHVzZSBpMmMgYnVzLlxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJY2hhcmdlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjaGFyZ2VyX2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY2hhcmdlciA9PSBOVUxMKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgY2hhcmdlcik7CisKKwljaGFyZ2VyLT5iYXR0ZXJ5Lm5hbWUgPSAibWF4ODk5N19wbWljIjsKKwljaGFyZ2VyLT5iYXR0ZXJ5LnR5cGUgPSBQT1dFUl9TVVBQTFlfVFlQRV9CQVRURVJZOworCWNoYXJnZXItPmJhdHRlcnkuZ2V0X3Byb3BlcnR5ID0gbWF4ODk5N19iYXR0ZXJ5X2dldF9wcm9wZXJ0eTsKKwljaGFyZ2VyLT5iYXR0ZXJ5LnByb3BlcnRpZXMgPSBtYXg4OTk3X2JhdHRlcnlfcHJvcHM7CisJY2hhcmdlci0+YmF0dGVyeS5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUobWF4ODk5N19iYXR0ZXJ5X3Byb3BzKTsKKworCWNoYXJnZXItPmRldiA9ICZwZGV2LT5kZXY7CisJY2hhcmdlci0+aW9kZXYgPSBpb2RldjsKKworCXJldCA9IHBvd2VyX3N1cHBseV9yZWdpc3RlcigmcGRldi0+ZGV2LCAmY2hhcmdlci0+YmF0dGVyeSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQ6IHBvd2VyIHN1cHBseSByZWdpc3RlclxuIik7CisJCWdvdG8gZXJyOworCX0KKworCXJldHVybiAwOworZXJyOgorCWtmcmVlKGNoYXJnZXIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IG1heDg5OTdfYmF0dGVyeV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgY2hhcmdlcl9kYXRhICpjaGFyZ2VyID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlwb3dlcl9zdXBwbHlfdW5yZWdpc3RlcigmY2hhcmdlci0+YmF0dGVyeSk7CisJa2ZyZWUoY2hhcmdlcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIG1heDg5OTdfYmF0dGVyeV9pZFtdID0geworCXsgIm1heDg5OTctYmF0dGVyeSIsIDAgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1heDg5OTdfYmF0dGVyeV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAibWF4ODk5Ny1iYXR0ZXJ5IiwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJfSwKKwkucHJvYmUgPSBtYXg4OTk3X2JhdHRlcnlfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKG1heDg5OTdfYmF0dGVyeV9yZW1vdmUpLAorCS5pZF90YWJsZSA9IG1heDg5OTdfYmF0dGVyeV9pZCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1heDg5OTdfYmF0dGVyeV9pbml0KHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbWF4ODk5N19iYXR0ZXJ5X2RyaXZlcik7Cit9CitzdWJzeXNfaW5pdGNhbGwobWF4ODk5N19iYXR0ZXJ5X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbWF4ODk5N19iYXR0ZXJ5X2NsZWFudXAodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmbWF4ODk5N19iYXR0ZXJ5X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChtYXg4OTk3X2JhdHRlcnlfY2xlYW51cCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiTUFYSU0gODk5Ny84OTY2IGJhdHRlcnkgY29udHJvbCBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIk15dW5nSm9vIEhhbSA8bXl1bmdqb28uaGFtQHNhbXN1bmcuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9tYXg4OTk4X2NoYXJnZXIuYyBiL2RyaXZlcnMvcG93ZXIvbWF4ODk5OF9jaGFyZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MyMWZhMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcG93ZXIvbWF4ODk5OF9jaGFyZ2VyLmMKQEAgLTAsMCArMSwyMTggQEAKKy8qCisgKiBtYXg4OTk4X2NoYXJnZXIuYyAtIFBvd2VyIHN1cHBseSBjb25zdW1lciBkcml2ZXIgZm9yIHRoZSBNYXhpbSA4OTk4L0xQMzk3NAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDktMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzCisgKiAgTXl1bmdKb28gSGFtIDxteXVuZ2pvby5oYW1Ac2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcG93ZXJfc3VwcGx5Lmg+CisjaW5jbHVkZSA8bGludXgvbWZkL21heDg5OTguaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvbWF4ODk5OC1wcml2YXRlLmg+CisKK3N0cnVjdCBtYXg4OTk4X2JhdHRlcnlfZGF0YSB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBtYXg4OTk4X2RldiAqaW9kZXY7CisJc3RydWN0IHBvd2VyX3N1cHBseSBiYXR0ZXJ5OworfTsKKworc3RhdGljIGVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IG1heDg5OThfYmF0dGVyeV9wcm9wc1tdID0geworCVBPV0VSX1NVUFBMWV9QUk9QX1BSRVNFTlQsIC8qIHRoZSBwcmVzZW5jZSBvZiBiYXR0ZXJ5ICovCisJUE9XRVJfU1VQUExZX1BST1BfT05MSU5FLCAvKiBjaGFyZ2VyIGlzIGFjdGl2ZSBvciBub3QgKi8KK307CisKKy8qIE5vdGUgdGhhdCB0aGUgY2hhcmdlciBjb250cm9sIGlzIGRvbmUgYnkgYSBjdXJyZW50IHJlZ3VsYXRvciAiQ0hBUkdFUiIgKi8KK3N0YXRpYyBpbnQgbWF4ODk5OF9iYXR0ZXJ5X2dldF9wcm9wZXJ0eShzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpwc3ksCisJCWVudW0gcG93ZXJfc3VwcGx5X3Byb3BlcnR5IHBzcCwKKwkJdW5pb24gcG93ZXJfc3VwcGx5X3Byb3B2YWwgKnZhbCkKK3sKKwlzdHJ1Y3QgbWF4ODk5OF9iYXR0ZXJ5X2RhdGEgKm1heDg5OTggPSBjb250YWluZXJfb2YocHN5LAorCQkJc3RydWN0IG1heDg5OThfYmF0dGVyeV9kYXRhLCBiYXR0ZXJ5KTsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqaTJjID0gbWF4ODk5OC0+aW9kZXYtPmkyYzsKKwlpbnQgcmV0OworCXU4IHJlZzsKKworCXN3aXRjaCAocHNwKSB7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9QUkVTRU5UOgorCQlyZXQgPSBtYXg4OTk4X3JlYWRfcmVnKGkyYywgTUFYODk5OF9SRUdfU1RBVFVTMiwgJnJlZyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCQlpZiAocmVnICYgKDEgPDwgNCkpCisJCQl2YWwtPmludHZhbCA9IDA7CisJCWVsc2UKKwkJCXZhbC0+aW50dmFsID0gMTsKKwkJYnJlYWs7CisJY2FzZSBQT1dFUl9TVVBQTFlfUFJPUF9PTkxJTkU6CisJCXJldCA9IG1heDg5OThfcmVhZF9yZWcoaTJjLCBNQVg4OTk4X1JFR19TVEFUVVMyLCAmcmVnKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJCWlmIChyZWcgJiAoMSA8PCAzKSkKKwkJCXZhbC0+aW50dmFsID0gMDsKKwkJZWxzZQorCQkJdmFsLT5pbnR2YWwgPSAxOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9fZGV2aW5pdCBpbnQgbWF4ODk5OF9iYXR0ZXJ5X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG1heDg5OThfZGV2ICppb2RldiA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKKwlzdHJ1Y3QgbWF4ODk5OF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEoaW9kZXYtPmRldik7CisJc3RydWN0IG1heDg5OThfYmF0dGVyeV9kYXRhICptYXg4OTk4OworCXN0cnVjdCBpMmNfY2xpZW50ICppMmM7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIXBkYXRhKSB7CisJCWRldl9lcnIocGRldi0+ZGV2LnBhcmVudCwgIk5vIHBsYXRmb3JtIGluaXQgZGF0YSBzdXBwbGllZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCW1heDg5OTggPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbWF4ODk5OF9iYXR0ZXJ5X2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1heDg5OTgpCisJCXJldHVybiAtRU5PTUVNOworCisJbWF4ODk5OC0+ZGV2ID0gJnBkZXYtPmRldjsKKwltYXg4OTk4LT5pb2RldiA9IGlvZGV2OworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIG1heDg5OTgpOworCWkyYyA9IG1heDg5OTgtPmlvZGV2LT5pMmM7CisKKwkvKiBTZXR1cCAiRW5kIG9mIENoYXJnZSIgKi8KKwkvKiBJZiBFT0MgdmFsdWUgZXF1YWxzIDAsCisJICogcmVtYWluIHZhbHVlIHNldCBmcm9tIGJvb3Rsb2FkZXIgb3IgZGVmYXVsdCB2YWx1ZSAqLworCWlmIChwZGF0YS0+ZW9jID49IDEwICYmIHBkYXRhLT5lb2MgPD0gNDUpIHsKKwkJbWF4ODk5OF91cGRhdGVfcmVnKGkyYywgTUFYODk5OF9SRUdfQ0hHUjEsCisJCQkJKHBkYXRhLT5lb2MgLyA1IC0gMikgPDwgNSwgMHg3IDw8IDUpOworCX0gZWxzZSBpZiAocGRhdGEtPmVvYyA9PSAwKSB7CisJCWRldl9kYmcobWF4ODk5OC0+ZGV2LAorCQkJIkVPQyB2YWx1ZSBub3Qgc2V0OiBsZWF2ZSBpdCB1bmNoYW5nZWQuXG4iKTsKKwl9IGVsc2UgeworCQlkZXZfZXJyKG1heDg5OTgtPmRldiwgIkludmFsaWQgRU9DIHZhbHVlXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJLyogU2V0dXAgQ2hhcmdlIFJlc3RhcnQgTGV2ZWwgKi8KKwlzd2l0Y2ggKHBkYXRhLT5yZXN0YXJ0KSB7CisJY2FzZSAxMDA6CisJCW1heDg5OThfdXBkYXRlX3JlZyhpMmMsIE1BWDg5OThfUkVHX0NIR1IxLCAweDEgPDwgMywgMHgzIDw8IDMpOworCQlicmVhazsKKwljYXNlIDE1MDoKKwkJbWF4ODk5OF91cGRhdGVfcmVnKGkyYywgTUFYODk5OF9SRUdfQ0hHUjEsIDB4MCA8PCAzLCAweDMgPDwgMyk7CisJCWJyZWFrOworCWNhc2UgMjAwOgorCQltYXg4OTk4X3VwZGF0ZV9yZWcoaTJjLCBNQVg4OTk4X1JFR19DSEdSMSwgMHgyIDw8IDMsIDB4MyA8PCAzKTsKKwkJYnJlYWs7CisJY2FzZSAtMToKKwkJbWF4ODk5OF91cGRhdGVfcmVnKGkyYywgTUFYODk5OF9SRUdfQ0hHUjEsIDB4MyA8PCAzLCAweDMgPDwgMyk7CisJCWJyZWFrOworCWNhc2UgMDoKKwkJZGV2X2RiZyhtYXg4OTk4LT5kZXYsCisJCQkiUmVzdGFydCBMZXZlbCBub3Qgc2V0OiBsZWF2ZSBpdCB1bmNoYW5nZWQuXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihtYXg4OTk4LT5kZXYsICJJbnZhbGlkIFJlc3RhcnQgTGV2ZWxcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBTZXR1cCBDaGFyZ2UgRnVsbCBUaW1lb3V0ICovCisJc3dpdGNoIChwZGF0YS0+dGltZW91dCkgeworCWNhc2UgNToKKwkJbWF4ODk5OF91cGRhdGVfcmVnKGkyYywgTUFYODk5OF9SRUdfQ0hHUjIsIDB4MCA8PCA0LCAweDMgPDwgNCk7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJbWF4ODk5OF91cGRhdGVfcmVnKGkyYywgTUFYODk5OF9SRUdfQ0hHUjIsIDB4MSA8PCA0LCAweDMgPDwgNCk7CisJCWJyZWFrOworCWNhc2UgNzoKKwkJbWF4ODk5OF91cGRhdGVfcmVnKGkyYywgTUFYODk5OF9SRUdfQ0hHUjIsIDB4MiA8PCA0LCAweDMgPDwgNCk7CisJCWJyZWFrOworCWNhc2UgLTE6CisJCW1heDg5OThfdXBkYXRlX3JlZyhpMmMsIE1BWDg5OThfUkVHX0NIR1IyLCAweDMgPDwgNCwgMHgzIDw8IDQpOworCQlicmVhazsKKwljYXNlIDA6CisJCWRldl9kYmcobWF4ODk5OC0+ZGV2LAorCQkJIkZ1bGwgVGltZW91dCBub3Qgc2V0OiBsZWF2ZSBpdCB1bmNoYW5nZWQuXG4iKTsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKG1heDg5OTgtPmRldiwgIkludmFsaWQgRnVsbCBUaW1lb3V0IHZhbHVlXG4iKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnI7CisJfQorCisJbWF4ODk5OC0+YmF0dGVyeS5uYW1lID0gIm1heDg5OThfcG1pYyI7CisJbWF4ODk5OC0+YmF0dGVyeS50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWTsKKwltYXg4OTk4LT5iYXR0ZXJ5LmdldF9wcm9wZXJ0eSA9IG1heDg5OThfYmF0dGVyeV9nZXRfcHJvcGVydHk7CisJbWF4ODk5OC0+YmF0dGVyeS5wcm9wZXJ0aWVzID0gbWF4ODk5OF9iYXR0ZXJ5X3Byb3BzOworCW1heDg5OTgtPmJhdHRlcnkubnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKG1heDg5OThfYmF0dGVyeV9wcm9wcyk7CisKKwlyZXQgPSBwb3dlcl9zdXBwbHlfcmVnaXN0ZXIobWF4ODk5OC0+ZGV2LCAmbWF4ODk5OC0+YmF0dGVyeSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKG1heDg5OTgtPmRldiwgImZhaWxlZDogcG93ZXIgc3VwcGx5IHJlZ2lzdGVyXG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJcmV0dXJuIDA7CitlcnI6CisJa2ZyZWUobWF4ODk5OCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgbWF4ODk5OF9iYXR0ZXJ5X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBtYXg4OTk4X2JhdHRlcnlfZGF0YSAqbWF4ODk5OCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcG93ZXJfc3VwcGx5X3VucmVnaXN0ZXIoJm1heDg5OTgtPmJhdHRlcnkpOworCWtmcmVlKG1heDg5OTgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlX2lkIG1heDg5OThfYmF0dGVyeV9pZFtdID0geworCXsgIm1heDg5OTgtYmF0dGVyeSIsIFRZUEVfTUFYODk5OCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbWF4ODk5OF9iYXR0ZXJ5X2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9ICJtYXg4OTk4LWJhdHRlcnkiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IG1heDg5OThfYmF0dGVyeV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AobWF4ODk5OF9iYXR0ZXJ5X3JlbW92ZSksCisJLmlkX3RhYmxlID0gbWF4ODk5OF9iYXR0ZXJ5X2lkLAorfTsKKworc3RhdGljIGludCBfX2luaXQgbWF4ODk5OF9iYXR0ZXJ5X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtYXg4OTk4X2JhdHRlcnlfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KG1heDg5OThfYmF0dGVyeV9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IG1heDg5OThfYmF0dGVyeV9jbGVhbnVwKHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1heDg5OThfYmF0dGVyeV9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQobWF4ODk5OF9iYXR0ZXJ5X2NsZWFudXApOworCitNT0RVTEVfREVTQ1JJUFRJT04oIk1BWElNIDg5OTggYmF0dGVyeSBjb250cm9sIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiTXl1bmdKb28gSGFtIDxteXVuZ2pvby5oYW1Ac2Ftc3VuZy5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOm1heDg5OTgtYmF0dGVyeSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9zM2NfYWRjX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvczNjX2FkY19iYXR0ZXJ5LmMKaW5kZXggZDM2YzI4OS4uYTY3NWUzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci9zM2NfYWRjX2JhdHRlcnkuYworKysgYi9kcml2ZXJzL3Bvd2VyL3MzY19hZGNfYmF0dGVyeS5jCkBAIC0yNjYsNyArMjY2LDcgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHMzY19hZGNfYmF0X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzM2NfYWRjX2JhdF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBzM2NfYWRjX2NsaWVudAkqY2xpZW50OwogCXN0cnVjdCBzM2NfYWRjX2JhdF9wZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvdHdsNDAzMF9jaGFyZ2VyLmMgYi9kcml2ZXJzL3Bvd2VyL3R3bDQwMzBfY2hhcmdlci5jCmluZGV4IDkyYzE2ZTEuLjU0YjkxOTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcG93ZXIvdHdsNDAzMF9jaGFyZ2VyLmMKKysrIGIvZHJpdmVycy9wb3dlci90d2w0MDMwX2NoYXJnZXIuYwpAQCAtNjIsNyArNjIsNyBAQAogI2RlZmluZSBUV0w0MDMwX01TVEFURUNfQ09NUExFVEU0CTB4MGUKIAogc3RhdGljIGJvb2wgYWxsb3dfdXNiOwotbW9kdWxlX3BhcmFtKGFsbG93X3VzYiwgYm9vbCwgMSk7Cittb2R1bGVfcGFyYW0oYWxsb3dfdXNiLCBib29sLCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoYWxsb3dfdXNiLCAiQWxsb3cgVVNCIGNoYXJnZSBkcmF3aW5nIGRlZmF1bHQgY3VycmVudCIpOwogCiBzdHJ1Y3QgdHdsNDAzMF9iY2kgewpAQCAtNDI1LDcgKzQyNSw3IEBACiB7CiAJc3RydWN0IHR3bDQwMzBfYmNpICpiY2k7CiAJaW50IHJldDsKLQlpbnQgcmVnOworCXUzMiByZWc7CiAKIAliY2kgPSBremFsbG9jKHNpemVvZigqYmNpKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGJjaSA9PSBOVUxMKQpAQCAtNDg2LDcgKzQ4Niw3IEBACiAJfQogCiAJLyogRW5hYmxlIGludGVycnVwdHMgbm93LiAqLwotCXJlZyA9IH4oVFdMNDAzMF9JQ0hHTE9XIHwgVFdMNDAzMF9JQ0hHRU9DIHwgVFdMNDAzMF9UQkFUT1IyIHwKKwlyZWcgPSB+KHUzMikoVFdMNDAzMF9JQ0hHTE9XIHwgVFdMNDAzMF9JQ0hHRU9DIHwgVFdMNDAzMF9UQkFUT1IyIHwKIAkJVFdMNDAzMF9UQkFUT1IxIHwgVFdMNDAzMF9CQVRTVFMpOwogCXJldCA9IHR3bF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfSU5URVJSVVBUUywgcmVnLAogCQkJICAgICAgIFRXTDQwMzBfSU5URVJSVVBUU19CQ0lJTVIxQSk7CkBAIC00OTUsNyArNDk1LDcgQEAKIAkJZ290byBmYWlsX3VubWFza19pbnRlcnJ1cHRzOwogCX0KIAotCXJlZyA9IH4oVFdMNDAzMF9WQkFUT1YgfCBUV0w0MDMwX1ZCVVNPViB8IFRXTDQwMzBfQUNDSEdPVik7CisJcmVnID0gfih1MzIpKFRXTDQwMzBfVkJBVE9WIHwgVFdMNDAzMF9WQlVTT1YgfCBUV0w0MDMwX0FDQ0hHT1YpOwogCXJldCA9IHR3bF9pMmNfd3JpdGVfdTgoVFdMNDAzMF9NT0RVTEVfSU5URVJSVVBUUywgcmVnLAogCQkJICAgICAgIFRXTDQwMzBfSU5URVJSVVBUU19CQ0lJTVIyQSk7CiAJaWYgKHJldCA8IDApCkBAIC01NzIsNyArNTcyLDcgQEAKIH0KIG1vZHVsZV9leGl0KHR3bDQwMzBfYmNpX2V4aXQpOwogCi1NT0RVTEVfQVVUSE9SKCJHcmHFvnlkYXMgSWdub3RhcyIpOworTU9EVUxFX0FVVEhPUigiR3Jhxb52eWRhcyBJZ25vdGFzIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlRXTDQwMzAgQmF0dGVyeSBDaGFyZ2VyIEludGVyZmFjZSBkcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BTElBUygicGxhdGZvcm06dHdsNDAzMF9iY2kiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvd204MzF4X2JhY2t1cC5jIGIvZHJpdmVycy9wb3dlci93bTgzMXhfYmFja3VwLmMKaW5kZXggMGZkMTMwZC4uZTY0OGNiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci93bTgzMXhfYmFja3VwLmMKKysrIGIvZHJpdmVycy9wb3dlci93bTgzMXhfYmFja3VwLmMKQEAgLTIyLDYgKzIyLDcgQEAKIHN0cnVjdCB3bTgzMXhfYmFja3VwIHsKIAlzdHJ1Y3Qgd204MzF4ICp3bTgzMXg7CiAJc3RydWN0IHBvd2VyX3N1cHBseSBiYWNrdXA7CisJY2hhciBuYW1lWzIwXTsKIH07CiAKIHN0YXRpYyBpbnQgd204MzF4X2JhY2t1cF9yZWFkX3ZvbHRhZ2Uoc3RydWN0IHdtODMxeCAqd204MzF4LApAQCAtMTYzLDYgKzE2NCw3IEBACiBzdGF0aWMgX19kZXZpbml0IGludCB3bTgzMXhfYmFja3VwX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHdtODMxeCAqd204MzF4ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCB3bTgzMXhfcGRhdGEgKndtODMxeF9wZGF0YSA9IHdtODMxeC0+ZGV2LT5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCB3bTgzMXhfYmFja3VwICpkZXZkYXRhOwogCXN0cnVjdCBwb3dlcl9zdXBwbHkgKmJhY2t1cDsKIAlpbnQgcmV0OwpAQCAtMTgyLDcgKzE4NCwxNCBAQAogCSAqLwogCXdtODMxeF9jb25maWdfYmFja3VwKHdtODMxeCk7CiAKLQliYWNrdXAtPm5hbWUgPSAid204MzF4LWJhY2t1cCI7CisJaWYgKHdtODMxeF9wZGF0YSAmJiB3bTgzMXhfcGRhdGEtPndtODMxeF9udW0pCisJCXNucHJpbnRmKGRldmRhdGEtPm5hbWUsIHNpemVvZihkZXZkYXRhLT5uYW1lKSwKKwkJCSAid204MzF4LWJhY2t1cC4lZCIsIHdtODMxeF9wZGF0YS0+d204MzF4X251bSk7CisJZWxzZQorCQlzbnByaW50ZihkZXZkYXRhLT5uYW1lLCBzaXplb2YoZGV2ZGF0YS0+bmFtZSksCisJCQkgIndtODMxeC1iYWNrdXAiKTsKKworCWJhY2t1cC0+bmFtZSA9IGRldmRhdGEtPm5hbWU7CiAJYmFja3VwLT50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfQkFUVEVSWTsKIAliYWNrdXAtPnByb3BlcnRpZXMgPSB3bTgzMXhfYmFja3VwX3Byb3BzOwogCWJhY2t1cC0+bnVtX3Byb3BlcnRpZXMgPSBBUlJBWV9TSVpFKHdtODMxeF9iYWNrdXBfcHJvcHMpOwpAQCAtMjAzLDYgKzIxMiw3IEBACiAJc3RydWN0IHdtODMxeF9iYWNrdXAgKmRldmRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAogCXBvd2VyX3N1cHBseV91bnJlZ2lzdGVyKCZkZXZkYXRhLT5iYWNrdXApOworCWtmcmVlKGRldmRhdGEtPmJhY2t1cC5uYW1lKTsKIAlrZnJlZShkZXZkYXRhKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci93bTgzMXhfcG93ZXIuYyBiL2RyaXZlcnMvcG93ZXIvd204MzF4X3Bvd2VyLmMKaW5kZXggZGRmOGNmNS4uNmNjMmNhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9wb3dlci93bTgzMXhfcG93ZXIuYworKysgYi9kcml2ZXJzL3Bvd2VyL3dtODMxeF9wb3dlci5jCkBAIC0yNCw2ICsyNCw5IEBACiAJc3RydWN0IHBvd2VyX3N1cHBseSB3YWxsOwogCXN0cnVjdCBwb3dlcl9zdXBwbHkgdXNiOwogCXN0cnVjdCBwb3dlcl9zdXBwbHkgYmF0dGVyeTsKKwljaGFyIHdhbGxfbmFtZVsyMF07CisJY2hhciB1c2JfbmFtZVsyMF07CisJY2hhciBiYXR0ZXJ5X25hbWVbMjBdOwogfTsKIAogc3RhdGljIGludCB3bTgzMXhfcG93ZXJfY2hlY2tfb25saW5lKHN0cnVjdCB3bTgzMXggKndtODMxeCwgaW50IHN1cHBseSwKQEAgLTQ4Niw2ICs0ODksNyBAQAogc3RhdGljIF9fZGV2aW5pdCBpbnQgd204MzF4X3Bvd2VyX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IHdtODMxeCAqd204MzF4ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCB3bTgzMXhfcGRhdGEgKndtODMxeF9wZGF0YSA9IHdtODMxeC0+ZGV2LT5wbGF0Zm9ybV9kYXRhOwogCXN0cnVjdCB3bTgzMXhfcG93ZXIgKnBvd2VyOwogCXN0cnVjdCBwb3dlcl9zdXBwbHkgKnVzYjsKIAlzdHJ1Y3QgcG93ZXJfc3VwcGx5ICpiYXR0ZXJ5OwpAQCAtNTAzLDEyICs1MDcsMjggQEAKIAliYXR0ZXJ5ID0gJnBvd2VyLT5iYXR0ZXJ5OwogCXdhbGwgPSAmcG93ZXItPndhbGw7CiAKKwlpZiAod204MzF4X3BkYXRhICYmIHdtODMxeF9wZGF0YS0+d204MzF4X251bSkgeworCQlzbnByaW50Zihwb3dlci0+d2FsbF9uYW1lLCBzaXplb2YocG93ZXItPndhbGxfbmFtZSksCisJCQkgIndtODMxeC13YWxsLiVkIiwgd204MzF4X3BkYXRhLT53bTgzMXhfbnVtKTsKKwkJc25wcmludGYocG93ZXItPmJhdHRlcnlfbmFtZSwgc2l6ZW9mKHBvd2VyLT53YWxsX25hbWUpLAorCQkJICJ3bTgzMXgtYmF0dGVyeS4lZCIsIHdtODMxeF9wZGF0YS0+d204MzF4X251bSk7CisJCXNucHJpbnRmKHBvd2VyLT51c2JfbmFtZSwgc2l6ZW9mKHBvd2VyLT53YWxsX25hbWUpLAorCQkJICJ3bTgzMXgtdXNiLiVkIiwgd204MzF4X3BkYXRhLT53bTgzMXhfbnVtKTsKKwl9IGVsc2UgeworCQlzbnByaW50Zihwb3dlci0+d2FsbF9uYW1lLCBzaXplb2YocG93ZXItPndhbGxfbmFtZSksCisJCQkgIndtODMxeC13YWxsIik7CisJCXNucHJpbnRmKHBvd2VyLT5iYXR0ZXJ5X25hbWUsIHNpemVvZihwb3dlci0+d2FsbF9uYW1lKSwKKwkJCSAid204MzF4LWJhdHRlcnkiKTsKKwkJc25wcmludGYocG93ZXItPnVzYl9uYW1lLCBzaXplb2YocG93ZXItPndhbGxfbmFtZSksCisJCQkgIndtODMxeC11c2IiKTsKKwl9CisKIAkvKiBXZSBpZ25vcmUgY29uZmlndXJhdGlvbiBmYWlsdXJlcyBzaW5jZSB3ZSBjYW4gc3RpbGwgcmVhZCBiYWNrCiAJICogdGhlIHN0YXR1cyB3aXRob3V0IGVuYWJsaW5nIHRoZSBjaGFyZ2VyLgogCSAqLwogCXdtODMxeF9jb25maWdfYmF0dGVyeSh3bTgzMXgpOwogCi0Jd2FsbC0+bmFtZSA9ICJ3bTgzMXgtd2FsbCI7CisJd2FsbC0+bmFtZSA9IHBvd2VyLT53YWxsX25hbWU7CiAJd2FsbC0+dHlwZSA9IFBPV0VSX1NVUFBMWV9UWVBFX01BSU5TOwogCXdhbGwtPnByb3BlcnRpZXMgPSB3bTgzMXhfd2FsbF9wcm9wczsKIAl3YWxsLT5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUod204MzF4X3dhbGxfcHJvcHMpOwpAQCAtNTE3LDcgKzUzNyw3IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJfa21hbGxvYzsKIAotCWJhdHRlcnktPm5hbWUgPSAid204MzF4LWJhdHRlcnkiOworCWJhdHRlcnktPm5hbWUgPSBwb3dlci0+YmF0dGVyeV9uYW1lOwogCWJhdHRlcnktPnByb3BlcnRpZXMgPSB3bTgzMXhfYmF0X3Byb3BzOwogCWJhdHRlcnktPm51bV9wcm9wZXJ0aWVzID0gQVJSQVlfU0laRSh3bTgzMXhfYmF0X3Byb3BzKTsKIAliYXR0ZXJ5LT5nZXRfcHJvcGVydHkgPSB3bTgzMXhfYmF0X2dldF9wcm9wOwpAQCAtNTI2LDcgKzU0Niw3IEBACiAJaWYgKHJldCkKIAkJZ290byBlcnJfd2FsbDsKIAotCXVzYi0+bmFtZSA9ICJ3bTgzMXgtdXNiIiwKKwl1c2ItPm5hbWUgPSBwb3dlci0+dXNiX25hbWUsCiAJdXNiLT50eXBlID0gUE9XRVJfU1VQUExZX1RZUEVfVVNCOwogCXVzYi0+cHJvcGVydGllcyA9IHdtODMxeF91c2JfcHJvcHM7CiAJdXNiLT5udW1fcHJvcGVydGllcyA9IEFSUkFZX1NJWkUod204MzF4X3VzYl9wcm9wcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9LY29uZmlnIGIvZHJpdmVycy9yZWd1bGF0b3IvS2NvbmZpZwppbmRleCAxMThlYjIxLi5jN2ZkMmMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9LY29uZmlnCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL0tjb25maWcKQEAgLTI0OSw2ICsyNDksMTIgQEAKIAkgIHRocmVlIHN0ZXAtZG93biBjb252ZXJ0ZXJzIGFuZCB0d28gZ2VuZXJhbC1wdXJwb3NlIExETyB2b2x0YWdlIHJlZ3VsYXRvcnMuCiAJICBJdCBzdXBwb3J0cyBUSSdzIHNvZnR3YXJlIGJhc2VkIENsYXNzLTIgU21hcnRSZWZsZXggaW1wbGVtZW50YXRpb24uCiAKK2NvbmZpZyBSRUdVTEFUT1JfVFBTNjU5MTIKKwl0cmlzdGF0ZSAiVEkgVFBTNjU5MTIgUG93ZXIgcmVndWxhdG9yIgorCWRlcGVuZHMgb24gKE1GRF9UUFM2NTkxMl9JMkMgfHwgTUZEX1RQUzY1OTEyX1NQSSkKKwloZWxwCisJICAgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIFRQUzY1OTEyIHZvbHRhZ2UgcmVndWxhdG9yIGNoaXAuCisKIGNvbmZpZyBSRUdVTEFUT1JfODhQTTg2MDcKIAlib29sICJNYXJ2ZWxsIDg4UE04NjA3IFBvd2VyIHJlZ3VsYXRvcnMiCiAJZGVwZW5kcyBvbiBNRkRfODhQTTg2MFg9eQpAQCAtMzA0LDUgKzMxMCwxMiBAQAogCWhlbHAKIAkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIFRQUzY1OTEwIHZvbHRhZ2UgcmVndWxhdG9yIGNoaXBzLgogCitjb25maWcgUkVHVUxBVE9SX0FBVDI4NzAKKwl0cmlzdGF0ZSAiQW5hbG9naWNUZWNoIEFBVDI4NzAgUmVndWxhdG9ycyIKKwlkZXBlbmRzIG9uIE1GRF9BQVQyODcwX0NPUkUKKwloZWxwCisJICBJZiB5b3UgaGF2ZSBhIEFuYWxvZ2ljVGVjaCBBQVQyODcwIHNheSBZIHRvIGVuYWJsZSB0aGUKKwkgIHJlZ3VsYXRvciBkcml2ZXIuCisKIGVuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL01ha2VmaWxlIGIvZHJpdmVycy9yZWd1bGF0b3IvTWFrZWZpbGUKaW5kZXggMzkzMmQyZS4uMDQwZDVhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3IvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvTWFrZWZpbGUKQEAgLTM4LDEwICszOCwxMiBAQAogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9UUFM2NTAyMykgKz0gdHBzNjUwMjMtcmVndWxhdG9yLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfVFBTNjUwN1gpICs9IHRwczY1MDd4LXJlZ3VsYXRvci5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX1RQUzY1MjRYKSArPSB0cHM2NTI0eC1yZWd1bGF0b3Iubworb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9UUFM2NTkxMikgKz0gdHBzNjU5MTItcmVndWxhdG9yLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfODhQTTg2MDcpICs9IDg4cG04NjA3Lm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfSVNMNjI3MUEpICs9IGlzbDYyNzFhLXJlZ3VsYXRvci5vCiBvYmotJChDT05GSUdfUkVHVUxBVE9SX0FCODUwMCkJKz0gYWI4NTAwLm8KIG9iai0kKENPTkZJR19SRUdVTEFUT1JfREI4NTAwX1BSQ01VKSArPSBkYjg1MDAtcHJjbXUubwogb2JqLSQoQ09ORklHX1JFR1VMQVRPUl9UUFM2NTkxMCkgKz0gdHBzNjU5MTAtcmVndWxhdG9yLm8KK29iai0kKENPTkZJR19SRUdVTEFUT1JfQUFUMjg3MCkgKz0gYWF0Mjg3MC1yZWd1bGF0b3IubwogCiBjY2ZsYWdzLSQoQ09ORklHX1JFR1VMQVRPUl9ERUJVRykgKz0gLURERUJVRwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvYWF0Mjg3MC1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2FhdDI4NzAtcmVndWxhdG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q0MTA0NQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2FhdDI4NzAtcmVndWxhdG9yLmMKQEAgLTAsMCArMSwyMzIgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL3JlZ3VsYXRvci9hYXQyODcwLXJlZ3VsYXRvci5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExLCBOVklESUEgQ29ycG9yYXRpb24uCisgKiBBdXRob3I6IEppbiBQYXJrIDxqaW55b3VuZ3BAbnZpZGlhLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogdmVyc2lvbiAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9tZmQvYWF0Mjg3MC5oPgorCitzdHJ1Y3QgYWF0Mjg3MF9yZWd1bGF0b3IgeworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXNjIGRlc2M7CisKKwljb25zdCBpbnQgKnZvbHRhZ2VzOyAvKiB1ViAqLworCisJaW50IG1pbl91VjsKKwlpbnQgbWF4X3VWOworCisJdTggZW5hYmxlX2FkZHI7CisJdTggZW5hYmxlX3NoaWZ0OworCXU4IGVuYWJsZV9tYXNrOworCisJdTggdm9sdGFnZV9hZGRyOworCXU4IHZvbHRhZ2Vfc2hpZnQ7CisJdTggdm9sdGFnZV9tYXNrOworfTsKKworc3RhdGljIGludCBhYXQyODcwX2xkb19saXN0X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCisJCQkJICAgIHVuc2lnbmVkIHNlbGVjdG9yKQoreworCXN0cnVjdCBhYXQyODcwX3JlZ3VsYXRvciAqcmkgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCisJcmV0dXJuIHJpLT52b2x0YWdlc1tzZWxlY3Rvcl07Cit9CisKK3N0YXRpYyBpbnQgYWF0Mjg3MF9sZG9fc2V0X3ZvbHRhZ2Vfc2VsKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAorCQkJCSAgICAgICB1bnNpZ25lZCBzZWxlY3RvcikKK3sKKwlzdHJ1Y3QgYWF0Mjg3MF9yZWd1bGF0b3IgKnJpID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlzdHJ1Y3QgYWF0Mjg3MF9kYXRhICphYXQyODcwID0gZGV2X2dldF9kcnZkYXRhKHJpLT5wZGV2LT5kZXYucGFyZW50KTsKKworCXJldHVybiBhYXQyODcwLT51cGRhdGUoYWF0Mjg3MCwgcmktPnZvbHRhZ2VfYWRkciwgcmktPnZvbHRhZ2VfbWFzaywKKwkJCShzZWxlY3RvciA8PCByaS0+dm9sdGFnZV9zaGlmdCkgJiByaS0+dm9sdGFnZV9tYXNrKTsKK30KKworc3RhdGljIGludCBhYXQyODcwX2xkb19nZXRfdm9sdGFnZV9zZWwoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCit7CisJc3RydWN0IGFhdDI4NzBfcmVndWxhdG9yICpyaSA9IHJkZXZfZ2V0X2RydmRhdGEocmRldik7CisJc3RydWN0IGFhdDI4NzBfZGF0YSAqYWF0Mjg3MCA9IGRldl9nZXRfZHJ2ZGF0YShyaS0+cGRldi0+ZGV2LnBhcmVudCk7CisJdTggdmFsOworCWludCByZXQ7CisKKwlyZXQgPSBhYXQyODcwLT5yZWFkKGFhdDI4NzAsIHJpLT52b2x0YWdlX2FkZHIsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gKHZhbCAmIHJpLT52b2x0YWdlX21hc2spID4+IHJpLT52b2x0YWdlX3NoaWZ0OworfQorCitzdGF0aWMgaW50IGFhdDI4NzBfbGRvX2VuYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3sKKwlzdHJ1Y3QgYWF0Mjg3MF9yZWd1bGF0b3IgKnJpID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlzdHJ1Y3QgYWF0Mjg3MF9kYXRhICphYXQyODcwID0gZGV2X2dldF9kcnZkYXRhKHJpLT5wZGV2LT5kZXYucGFyZW50KTsKKworCXJldHVybiBhYXQyODcwLT51cGRhdGUoYWF0Mjg3MCwgcmktPmVuYWJsZV9hZGRyLCByaS0+ZW5hYmxlX21hc2ssCisJCQkgICAgICAgcmktPmVuYWJsZV9tYXNrKTsKK30KKworc3RhdGljIGludCBhYXQyODcwX2xkb19kaXNhYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KQoreworCXN0cnVjdCBhYXQyODcwX3JlZ3VsYXRvciAqcmkgPSByZGV2X2dldF9kcnZkYXRhKHJkZXYpOworCXN0cnVjdCBhYXQyODcwX2RhdGEgKmFhdDI4NzAgPSBkZXZfZ2V0X2RydmRhdGEocmktPnBkZXYtPmRldi5wYXJlbnQpOworCisJcmV0dXJuIGFhdDI4NzAtPnVwZGF0ZShhYXQyODcwLCByaS0+ZW5hYmxlX2FkZHIsIHJpLT5lbmFibGVfbWFzaywgMCk7Cit9CisKK3N0YXRpYyBpbnQgYWF0Mjg3MF9sZG9faXNfZW5hYmxlZChzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKK3sKKwlzdHJ1Y3QgYWF0Mjg3MF9yZWd1bGF0b3IgKnJpID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKKwlzdHJ1Y3QgYWF0Mjg3MF9kYXRhICphYXQyODcwID0gZGV2X2dldF9kcnZkYXRhKHJpLT5wZGV2LT5kZXYucGFyZW50KTsKKwl1OCB2YWw7CisJaW50IHJldDsKKworCXJldCA9IGFhdDI4NzAtPnJlYWQoYWF0Mjg3MCwgcmktPmVuYWJsZV9hZGRyLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHZhbCAmIHJpLT5lbmFibGVfbWFzayA/IDEgOiAwOworfQorCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgYWF0Mjg3MF9sZG9fb3BzID0geworCS5saXN0X3ZvbHRhZ2UgPSBhYXQyODcwX2xkb19saXN0X3ZvbHRhZ2UsCisJLnNldF92b2x0YWdlX3NlbCA9IGFhdDI4NzBfbGRvX3NldF92b2x0YWdlX3NlbCwKKwkuZ2V0X3ZvbHRhZ2Vfc2VsID0gYWF0Mjg3MF9sZG9fZ2V0X3ZvbHRhZ2Vfc2VsLAorCS5lbmFibGUgPSBhYXQyODcwX2xkb19lbmFibGUsCisJLmRpc2FibGUgPSBhYXQyODcwX2xkb19kaXNhYmxlLAorCS5pc19lbmFibGVkID0gYWF0Mjg3MF9sZG9faXNfZW5hYmxlZCwKK307CisKK3N0YXRpYyBjb25zdCBpbnQgYWF0Mjg3MF9sZG9fdm9sdGFnZXNbXSA9IHsKKwkxMjAwMDAwLCAxMzAwMDAwLCAxNTAwMDAwLCAxNjAwMDAwLAorCTE4MDAwMDAsIDIwMDAwMDAsIDIyMDAwMDAsIDI1MDAwMDAsCisJMjYwMDAwMCwgMjcwMDAwMCwgMjgwMDAwMCwgMjkwMDAwMCwKKwkzMDAwMDAwLCAzMTAwMDAwLCAzMjAwMDAwLCAzMzAwMDAwLAorfTsKKworI2RlZmluZSBBQVQyODcwX0xETyhpZHMpCQkJCVwKKwl7CQkJCQkJXAorCQkuZGVzYyA9IHsJCQkJXAorCQkJLm5hbWUgPSAjaWRzLAkJCVwKKwkJCS5pZCA9IEFBVDI4NzBfSURfIyNpZHMsCQlcCisJCQkubl92b2x0YWdlcyA9IEFSUkFZX1NJWkUoYWF0Mjg3MF9sZG9fdm9sdGFnZXMpLAlcCisJCQkub3BzID0gJmFhdDI4NzBfbGRvX29wcywJXAorCQkJLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwJXAorCQkJLm93bmVyID0gVEhJU19NT0RVTEUsCQlcCisJCX0sCQkJCQlcCisJCS52b2x0YWdlcyA9IGFhdDI4NzBfbGRvX3ZvbHRhZ2VzLAlcCisJCS5taW5fdVYgPSAxMjAwMDAwLAkJCVwKKwkJLm1heF91ViA9IDMzMDAwMDAsCQkJXAorCX0KKworc3RhdGljIHN0cnVjdCBhYXQyODcwX3JlZ3VsYXRvciBhYXQyODcwX3JlZ3VsYXRvcnNbXSA9IHsKKwlBQVQyODcwX0xETyhMRE9BKSwKKwlBQVQyODcwX0xETyhMRE9CKSwKKwlBQVQyODcwX0xETyhMRE9DKSwKKwlBQVQyODcwX0xETyhMRE9EKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYWF0Mjg3MF9yZWd1bGF0b3IgKmFhdDI4NzBfZ2V0X3JlZ3VsYXRvcihpbnQgaWQpCit7CisJc3RydWN0IGFhdDI4NzBfcmVndWxhdG9yICpyaSA9IE5VTEw7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhYXQyODcwX3JlZ3VsYXRvcnMpOyBpKyspIHsKKwkJcmkgPSAmYWF0Mjg3MF9yZWd1bGF0b3JzW2ldOworCQlpZiAocmktPmRlc2MuaWQgPT0gaWQpCisJCQlicmVhazsKKwl9CisKKwlpZiAoIXJpKQorCQlyZXR1cm4gTlVMTDsKKworCXJpLT5lbmFibGVfYWRkciA9IEFBVDI4NzBfTERPX0VOOworCXJpLT5lbmFibGVfc2hpZnQgPSBpZCAtIEFBVDI4NzBfSURfTERPQTsKKwlyaS0+ZW5hYmxlX21hc2sgPSAweDEgPDwgcmktPmVuYWJsZV9zaGlmdDsKKworCXJpLT52b2x0YWdlX2FkZHIgPSAoaWQgLSBBQVQyODcwX0lEX0xET0EpIC8gMiA/CisJCQkgICBBQVQyODcwX0xET19DRCA6IEFBVDI4NzBfTERPX0FCOworCXJpLT52b2x0YWdlX3NoaWZ0ID0gKGlkIC0gQUFUMjg3MF9JRF9MRE9BKSAlIDIgPyAwIDogNDsKKwlyaS0+dm9sdGFnZV9tYXNrID0gMHhGIDw8IHJpLT52b2x0YWdlX3NoaWZ0OworCisJcmV0dXJuIHJpOworfQorCitzdGF0aWMgaW50IGFhdDI4NzBfcmVndWxhdG9yX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGFhdDI4NzBfcmVndWxhdG9yICpyaTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldjsKKworCXJpID0gYWF0Mjg3MF9nZXRfcmVndWxhdG9yKHBkZXYtPmlkKTsKKwlpZiAoIXJpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkludmFsaWQgZGV2aWNlIElELCAlZFxuIiwgcGRldi0+aWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmktPnBkZXYgPSBwZGV2OworCisJcmRldiA9IHJlZ3VsYXRvcl9yZWdpc3RlcigmcmktPmRlc2MsICZwZGV2LT5kZXYsCisJCQkJICBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSwgcmkpOworCWlmIChJU19FUlIocmRldikpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIHJlZ3VsYXRvciAlc1xuIiwKKwkJCXJpLT5kZXNjLm5hbWUpOworCQlyZXR1cm4gUFRSX0VSUihyZGV2KTsKKwl9CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgcmRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgYWF0Mjg3MF9yZWd1bGF0b3JfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCXJlZ3VsYXRvcl91bnJlZ2lzdGVyKHJkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhYXQyODcwX3JlZ3VsYXRvcl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAiYWF0Mjg3MC1yZWd1bGF0b3IiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQk9IGFhdDI4NzBfcmVndWxhdG9yX3Byb2JlLAorCS5yZW1vdmUJPSBfX2RldmV4aXRfcChhYXQyODcwX3JlZ3VsYXRvcl9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYWF0Mjg3MF9yZWd1bGF0b3JfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmFhdDI4NzBfcmVndWxhdG9yX2RyaXZlcik7Cit9CitzdWJzeXNfaW5pdGNhbGwoYWF0Mjg3MF9yZWd1bGF0b3JfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBhYXQyODcwX3JlZ3VsYXRvcl9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmFhdDI4NzBfcmVndWxhdG9yX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhYXQyODcwX3JlZ3VsYXRvcl9leGl0KTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2dpY1RlY2ggQUFUMjg3MCBSZWd1bGF0b3IiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIkppbiBQYXJrIDxqaW55b3VuZ3BAbnZpZGlhLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL2NvcmUuYyBiL2RyaXZlcnMvcmVndWxhdG9yL2NvcmUuYwppbmRleCBkM2UzODc5Li5kOGU2YTQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9jb3JlLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3IvY29yZS5jCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9hc3luYy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgpAQCAtMzMsNiArMzQsOCBAQAogCiAjaW5jbHVkZSAiZHVtbXkuaCIKIAorI2RlZmluZSByZGV2X2NyaXQocmRldiwgZm10LCAuLi4pCQkJCQlcCisJcHJfY3JpdCgiJXM6ICIgZm10LCByZGV2X2dldF9uYW1lKHJkZXYpLCAjI19fVkFfQVJHU19fKQogI2RlZmluZSByZGV2X2VycihyZGV2LCBmbXQsIC4uLikJCQkJCVwKIAlwcl9lcnIoIiVzOiAiIGZtdCwgcmRldl9nZXRfbmFtZShyZGV2KSwgIyNfX1ZBX0FSR1NfXykKICNkZWZpbmUgcmRldl93YXJuKHJkZXYsIGZtdCwgLi4uKQkJCQkJXApAQCAtNzgsMTEgKzgxLDEzIEBACiAJY2hhciAqc3VwcGx5X25hbWU7CiAJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2X2F0dHI7CiAJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXY7CisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCisJc3RydWN0IGRlbnRyeSAqZGVidWdmczsKKyNlbmRpZgogfTsKIAogc3RhdGljIGludCBfcmVndWxhdG9yX2lzX2VuYWJsZWQoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpOwotc3RhdGljIGludCBfcmVndWxhdG9yX2Rpc2FibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCi0JCXN0cnVjdCByZWd1bGF0b3JfZGV2ICoqc3VwcGx5X3JkZXZfcHRyKTsKK3N0YXRpYyBpbnQgX3JlZ3VsYXRvcl9kaXNhYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KTsKIHN0YXRpYyBpbnQgX3JlZ3VsYXRvcl9nZXRfdm9sdGFnZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldik7CiBzdGF0aWMgaW50IF9yZWd1bGF0b3JfZ2V0X2N1cnJlbnRfbGltaXQoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpOwogc3RhdGljIHVuc2lnbmVkIGludCBfcmVndWxhdG9yX2dldF9tb2RlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2KTsKQEAgLTkwLDYgKzk1LDkgQEAKIAkJCQkgIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKmRhdGEpOwogc3RhdGljIGludCBfcmVndWxhdG9yX2RvX3NldF92b2x0YWdlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAogCQkJCSAgICAgaW50IG1pbl91ViwgaW50IG1heF91Vik7CitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvciAqY3JlYXRlX3JlZ3VsYXRvcihzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKKwkJCQkJICBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCSAgY29uc3QgY2hhciAqc3VwcGx5X25hbWUpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqcmRldl9nZXRfbmFtZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKIHsKQEAgLTE0Myw4ICsxNTEsMTEgQEAKIAlpZiAoKm1pbl91ViA8IHJkZXYtPmNvbnN0cmFpbnRzLT5taW5fdVYpCiAJCSptaW5fdVYgPSByZGV2LT5jb25zdHJhaW50cy0+bWluX3VWOwogCi0JaWYgKCptaW5fdVYgPiAqbWF4X3VWKQorCWlmICgqbWluX3VWID4gKm1heF91VikgeworCQlyZGV2X2VycihyZGV2LCAidW5zdXBwb3J0YWJsZSB2b2x0YWdlIHJhbmdlOiAlZC0lZHVWXG4iLAorCQkJICptaW5fdVYsICptYXhfdVYpOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE5Nyw4ICsyMDgsMTEgQEAKIAlpZiAoKm1pbl91QSA8IHJkZXYtPmNvbnN0cmFpbnRzLT5taW5fdUEpCiAJCSptaW5fdUEgPSByZGV2LT5jb25zdHJhaW50cy0+bWluX3VBOwogCi0JaWYgKCptaW5fdUEgPiAqbWF4X3VBKQorCWlmICgqbWluX3VBID4gKm1heF91QSkgeworCQlyZGV2X2VycihyZGV2LCAidW5zdXBwb3J0YWJsZSBjdXJyZW50IHJhbmdlOiAlZC0lZHVBXG4iLAorCQkJICptaW5fdUEsICptYXhfdUEpOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIxMyw2ICsyMjcsNyBAQAogCWNhc2UgUkVHVUxBVE9SX01PREVfU1RBTkRCWToKIAkJYnJlYWs7CiAJZGVmYXVsdDoKKwkJcmRldl9lcnIocmRldiwgImludmFsaWQgbW9kZSAleCBzcGVjaWZpZWRcbiIsICptb2RlKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC03NzksNyArNzk0LDYgQEAKIAkJaWYgKHJldCA8IDApIHsKIAkJCXJkZXZfZXJyKHJkZXYsICJmYWlsZWQgdG8gYXBwbHkgJWR1ViBjb25zdHJhaW50XG4iLAogCQkJCSByZGV2LT5jb25zdHJhaW50cy0+bWluX3VWKTsKLQkJCXJkZXYtPmNvbnN0cmFpbnRzID0gTlVMTDsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAl9CkBAIC04ODIsNyArODk2LDYgQEAKIAkJcmV0ID0gc3VzcGVuZF9wcmVwYXJlKHJkZXYsIHJkZXYtPmNvbnN0cmFpbnRzLT5pbml0aWFsX3N0YXRlKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCXJkZXZfZXJyKHJkZXYsICJmYWlsZWQgdG8gc2V0IHN1c3BlbmQgc3RhdGVcbiIpOwotCQkJcmRldi0+Y29uc3RyYWludHMgPSBOVUxMOwogCQkJZ290byBvdXQ7CiAJCX0KIAl9CkBAIC05MDksMTMgKzkyMiwxNSBAQAogCQlyZXQgPSBvcHMtPmVuYWJsZShyZGV2KTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCXJkZXZfZXJyKHJkZXYsICJmYWlsZWQgdG8gZW5hYmxlXG4iKTsKLQkJCXJkZXYtPmNvbnN0cmFpbnRzID0gTlVMTDsKIAkJCWdvdG8gb3V0OwogCQl9CiAJfQogCiAJcHJpbnRfY29uc3RyYWludHMocmRldik7CisJcmV0dXJuIDA7CiBvdXQ6CisJa2ZyZWUocmRldi0+Y29uc3RyYWludHMpOworCXJkZXYtPmNvbnN0cmFpbnRzID0gTlVMTDsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC05MjksMjEgKzk0NCwyMCBAQAogICogY29yZSBpZiBpdCdzIGNoaWxkIGlzIGVuYWJsZWQuCiAgKi8KIHN0YXRpYyBpbnQgc2V0X3N1cHBseShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKLQlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqc3VwcGx5X3JkZXYpCisJCSAgICAgIHN0cnVjdCByZWd1bGF0b3JfZGV2ICpzdXBwbHlfcmRldikKIHsKIAlpbnQgZXJyOwogCi0JZXJyID0gc3lzZnNfY3JlYXRlX2xpbmsoJnJkZXYtPmRldi5rb2JqLCAmc3VwcGx5X3JkZXYtPmRldi5rb2JqLAotCQkJCSJzdXBwbHkiKTsKLQlpZiAoZXJyKSB7Ci0JCXJkZXZfZXJyKHJkZXYsICJjb3VsZCBub3QgYWRkIGRldmljZSBsaW5rICVzIGVyciAlZFxuIiwKLQkJCSBzdXBwbHlfcmRldi0+ZGV2LmtvYmoubmFtZSwgZXJyKTsKLQkJICAgICAgIGdvdG8gb3V0OworCXJkZXZfaW5mbyhyZGV2LCAic3VwcGxpZWQgYnkgJXNcbiIsIHJkZXZfZ2V0X25hbWUoc3VwcGx5X3JkZXYpKTsKKworCXJkZXYtPnN1cHBseSA9IGNyZWF0ZV9yZWd1bGF0b3Ioc3VwcGx5X3JkZXYsICZyZGV2LT5kZXYsICJTVVBQTFkiKTsKKwlpZiAoSVNfRVJSKHJkZXYtPnN1cHBseSkpIHsKKwkJZXJyID0gUFRSX0VSUihyZGV2LT5zdXBwbHkpOworCQlyZGV2LT5zdXBwbHkgPSBOVUxMOworCQlyZXR1cm4gZXJyOwogCX0KLQlyZGV2LT5zdXBwbHkgPSBzdXBwbHlfcmRldjsKLQlsaXN0X2FkZCgmcmRldi0+c2xpc3QsICZzdXBwbHlfcmRldi0+c3VwcGx5X2xpc3QpOwotb3V0OgotCXJldHVybiBlcnI7CisKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0xMDMyLDcgKzEwNDYsNyBAQAogCX0KIH0KIAotI2RlZmluZSBSRUdfU1RSX1NJWkUJMzIKKyNkZWZpbmUgUkVHX1NUUl9TSVpFCTY0CiAKIHN0YXRpYyBzdHJ1Y3QgcmVndWxhdG9yICpjcmVhdGVfcmVndWxhdG9yKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LAogCQkJCQkgIHN0cnVjdCBkZXZpY2UgKmRldiwKQEAgLTEwNTIsOCArMTA2Niw5IEBACiAKIAlpZiAoZGV2KSB7CiAJCS8qIGNyZWF0ZSBhICdyZXF1ZXN0ZWRfbWljcm9hbXBzX25hbWUnIHN5c2ZzIGVudHJ5ICovCi0JCXNpemUgPSBzY25wcmludGYoYnVmLCBSRUdfU1RSX1NJWkUsICJtaWNyb2FtcHNfcmVxdWVzdGVkXyVzIiwKLQkJCXN1cHBseV9uYW1lKTsKKwkJc2l6ZSA9IHNjbnByaW50ZihidWYsIFJFR19TVFJfU0laRSwKKwkJCQkgIm1pY3JvYW1wc19yZXF1ZXN0ZWRfJXMtJXMiLAorCQkJCSBkZXZfbmFtZShkZXYpLCBzdXBwbHlfbmFtZSk7CiAJCWlmIChzaXplID49IFJFR19TVFJfU0laRSkKIAkJCWdvdG8gb3ZlcmZsb3dfZXJyOwogCkBAIC0xMDg4LDcgKzExMDMsMjggQEAKIAkJCQkgIGRldi0+a29iai5uYW1lLCBlcnIpOwogCQkJZ290byBsaW5rX25hbWVfZXJyOwogCQl9CisJfSBlbHNlIHsKKwkJcmVndWxhdG9yLT5zdXBwbHlfbmFtZSA9IGtzdHJkdXAoc3VwcGx5X25hbWUsIEdGUF9LRVJORUwpOworCQlpZiAocmVndWxhdG9yLT5zdXBwbHlfbmFtZSA9PSBOVUxMKQorCQkJZ290byBhdHRyX2VycjsKIAl9CisKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKwlyZWd1bGF0b3ItPmRlYnVnZnMgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIocmVndWxhdG9yLT5zdXBwbHlfbmFtZSwKKwkJCQkJCXJkZXYtPmRlYnVnZnMpOworCWlmIChJU19FUlJfT1JfTlVMTChyZWd1bGF0b3ItPmRlYnVnZnMpKSB7CisJCXJkZXZfd2FybihyZGV2LCAiRmFpbGVkIHRvIGNyZWF0ZSBkZWJ1Z2ZzIGRpcmVjdG9yeVxuIik7CisJCXJlZ3VsYXRvci0+ZGVidWdmcyA9IE5VTEw7CisJfSBlbHNlIHsKKwkJZGVidWdmc19jcmVhdGVfdTMyKCJ1QV9sb2FkIiwgMDQ0NCwgcmVndWxhdG9yLT5kZWJ1Z2ZzLAorCQkJCSAgICZyZWd1bGF0b3ItPnVBX2xvYWQpOworCQlkZWJ1Z2ZzX2NyZWF0ZV91MzIoIm1pbl91ViIsIDA0NDQsIHJlZ3VsYXRvci0+ZGVidWdmcywKKwkJCQkgICAmcmVndWxhdG9yLT5taW5fdVYpOworCQlkZWJ1Z2ZzX2NyZWF0ZV91MzIoIm1heF91ViIsIDA0NDQsIHJlZ3VsYXRvci0+ZGVidWdmcywKKwkJCQkgICAmcmVndWxhdG9yLT5tYXhfdVYpOworCX0KKyNlbmRpZgorCiAJbXV0ZXhfdW5sb2NrKCZyZGV2LT5tdXRleCk7CiAJcmV0dXJuIHJlZ3VsYXRvcjsKIGxpbmtfbmFtZV9lcnI6CkBAIC0xMjY3LDEzICsxMzAzLDE3IEBACiAJbXV0ZXhfbG9jaygmcmVndWxhdG9yX2xpc3RfbXV0ZXgpOwogCXJkZXYgPSByZWd1bGF0b3ItPnJkZXY7CiAKKyNpZmRlZiBDT05GSUdfREVCVUdfRlMKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUocmVndWxhdG9yLT5kZWJ1Z2ZzKTsKKyNlbmRpZgorCiAJLyogcmVtb3ZlIGFueSBzeXNmcyBlbnRyaWVzICovCiAJaWYgKHJlZ3VsYXRvci0+ZGV2KSB7CiAJCXN5c2ZzX3JlbW92ZV9saW5rKCZyZGV2LT5kZXYua29iaiwgcmVndWxhdG9yLT5zdXBwbHlfbmFtZSk7Ci0JCWtmcmVlKHJlZ3VsYXRvci0+c3VwcGx5X25hbWUpOwogCQlkZXZpY2VfcmVtb3ZlX2ZpbGUocmVndWxhdG9yLT5kZXYsICZyZWd1bGF0b3ItPmRldl9hdHRyKTsKIAkJa2ZyZWUocmVndWxhdG9yLT5kZXZfYXR0ci5hdHRyLm5hbWUpOwogCX0KKwlrZnJlZShyZWd1bGF0b3ItPnN1cHBseV9uYW1lKTsKIAlsaXN0X2RlbCgmcmVndWxhdG9yLT5saXN0KTsKIAlrZnJlZShyZWd1bGF0b3IpOwogCkBAIC0xMzAxLDE5ICsxMzQxLDYgQEAKIHsKIAlpbnQgcmV0LCBkZWxheTsKIAotCWlmIChyZGV2LT51c2VfY291bnQgPT0gMCkgewotCQkvKiBkbyB3ZSBuZWVkIHRvIGVuYWJsZSB0aGUgc3VwcGx5IHJlZ3VsYXRvciBmaXJzdCAqLwotCQlpZiAocmRldi0+c3VwcGx5KSB7Ci0JCQltdXRleF9sb2NrKCZyZGV2LT5zdXBwbHktPm11dGV4KTsKLQkJCXJldCA9IF9yZWd1bGF0b3JfZW5hYmxlKHJkZXYtPnN1cHBseSk7Ci0JCQltdXRleF91bmxvY2soJnJkZXYtPnN1cHBseS0+bXV0ZXgpOwotCQkJaWYgKHJldCA8IDApIHsKLQkJCQlyZGV2X2VycihyZGV2LCAiZmFpbGVkIHRvIGVuYWJsZTogJWRcbiIsIHJldCk7Ci0JCQkJcmV0dXJuIHJldDsKLQkJCX0KLQkJfQotCX0KLQogCS8qIGNoZWNrIHZvbHRhZ2UgYW5kIHJlcXVlc3RlZCBsb2FkIGJlZm9yZSBlbmFibGluZyAqLwogCWlmIChyZGV2LT5jb25zdHJhaW50cyAmJgogCSAgICAocmRldi0+Y29uc3RyYWludHMtPnZhbGlkX29wc19tYXNrICYgUkVHVUxBVE9SX0NIQU5HRV9EUk1TKSkKQEAgLTEzODgsMTkgKzE0MTUsMjcgQEAKIAlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiA9IHJlZ3VsYXRvci0+cmRldjsKIAlpbnQgcmV0ID0gMDsKIAorCWlmIChyZGV2LT5zdXBwbHkpIHsKKwkJcmV0ID0gcmVndWxhdG9yX2VuYWJsZShyZGV2LT5zdXBwbHkpOworCQlpZiAocmV0ICE9IDApCisJCQlyZXR1cm4gcmV0OworCX0KKwogCW11dGV4X2xvY2soJnJkZXYtPm11dGV4KTsKIAlyZXQgPSBfcmVndWxhdG9yX2VuYWJsZShyZGV2KTsKIAltdXRleF91bmxvY2soJnJkZXYtPm11dGV4KTsKKworCWlmIChyZXQgIT0gMCkKKwkJcmVndWxhdG9yX2Rpc2FibGUocmRldi0+c3VwcGx5KTsKKwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChyZWd1bGF0b3JfZW5hYmxlKTsKIAogLyogbG9ja3MgaGVsZCBieSByZWd1bGF0b3JfZGlzYWJsZSgpICovCi1zdGF0aWMgaW50IF9yZWd1bGF0b3JfZGlzYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldiwKLQkJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKipzdXBwbHlfcmRldl9wdHIpCitzdGF0aWMgaW50IF9yZWd1bGF0b3JfZGlzYWJsZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqcmRldikKIHsKIAlpbnQgcmV0ID0gMDsKLQkqc3VwcGx5X3JkZXZfcHRyID0gTlVMTDsKIAogCWlmIChXQVJOKHJkZXYtPnVzZV9jb3VudCA8PSAwLAogCQkgInVuYmFsYW5jZWQgZGlzYWJsZXMgZm9yICVzXG4iLCByZGV2X2dldF9uYW1lKHJkZXYpKSkKQEAgLTE0MjcsOSArMTQ2Miw2IEBACiAJCQkJCSAgICAgTlVMTCk7CiAJCX0KIAotCQkvKiBkZWNyZWFzZSBvdXIgc3VwcGxpZXMgcmVmIGNvdW50IGFuZCBkaXNhYmxlIGlmIHJlcXVpcmVkICovCi0JCSpzdXBwbHlfcmRldl9wdHIgPSByZGV2LT5zdXBwbHk7Ci0KIAkJcmRldi0+dXNlX2NvdW50ID0gMDsKIAl9IGVsc2UgaWYgKHJkZXYtPnVzZV9jb3VudCA+IDEpIHsKIApAQCAtMTQ0MCw2ICsxNDcyLDcgQEAKIAogCQlyZGV2LT51c2VfY291bnQtLTsKIAl9CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNDU4LDI5ICsxNDkxLDIxIEBACiBpbnQgcmVndWxhdG9yX2Rpc2FibGUoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yKQogewogCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gcmVndWxhdG9yLT5yZGV2OwotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpzdXBwbHlfcmRldiA9IE5VTEw7CiAJaW50IHJldCA9IDA7CiAKIAltdXRleF9sb2NrKCZyZGV2LT5tdXRleCk7Ci0JcmV0ID0gX3JlZ3VsYXRvcl9kaXNhYmxlKHJkZXYsICZzdXBwbHlfcmRldik7CisJcmV0ID0gX3JlZ3VsYXRvcl9kaXNhYmxlKHJkZXYpOwogCW11dGV4X3VubG9jaygmcmRldi0+bXV0ZXgpOwogCi0JLyogZGVjcmVhc2Ugb3VyIHN1cHBsaWVzIHJlZiBjb3VudCBhbmQgZGlzYWJsZSBpZiByZXF1aXJlZCAqLwotCXdoaWxlIChzdXBwbHlfcmRldiAhPSBOVUxMKSB7Ci0JCXJkZXYgPSBzdXBwbHlfcmRldjsKLQotCQltdXRleF9sb2NrKCZyZGV2LT5tdXRleCk7Ci0JCV9yZWd1bGF0b3JfZGlzYWJsZShyZGV2LCAmc3VwcGx5X3JkZXYpOwotCQltdXRleF91bmxvY2soJnJkZXYtPm11dGV4KTsKLQl9CisJaWYgKHJldCA9PSAwICYmIHJkZXYtPnN1cHBseSkKKwkJcmVndWxhdG9yX2Rpc2FibGUocmRldi0+c3VwcGx5KTsKIAogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChyZWd1bGF0b3JfZGlzYWJsZSk7CiAKIC8qIGxvY2tzIGhlbGQgYnkgcmVndWxhdG9yX2ZvcmNlX2Rpc2FibGUoKSAqLwotc3RhdGljIGludCBfcmVndWxhdG9yX2ZvcmNlX2Rpc2FibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCi0JCXN0cnVjdCByZWd1bGF0b3JfZGV2ICoqc3VwcGx5X3JkZXZfcHRyKQorc3RhdGljIGludCBfcmVndWxhdG9yX2ZvcmNlX2Rpc2FibGUoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYpCiB7CiAJaW50IHJldCA9IDA7CiAKQEAgLTE0OTcsMTAgKzE1MjIsNiBAQAogCQkJUkVHVUxBVE9SX0VWRU5UX0RJU0FCTEUsIE5VTEwpOwogCX0KIAotCS8qIGRlY3JlYXNlIG91ciBzdXBwbGllcyByZWYgY291bnQgYW5kIGRpc2FibGUgaWYgcmVxdWlyZWQgKi8KLQkqc3VwcGx5X3JkZXZfcHRyID0gcmRldi0+c3VwcGx5OwotCi0JcmRldi0+dXNlX2NvdW50ID0gMDsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xNTE2LDE2ICsxNTM3LDE2IEBACiBpbnQgcmVndWxhdG9yX2ZvcmNlX2Rpc2FibGUoc3RydWN0IHJlZ3VsYXRvciAqcmVndWxhdG9yKQogewogCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2ID0gcmVndWxhdG9yLT5yZGV2OwotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpzdXBwbHlfcmRldiA9IE5VTEw7CiAJaW50IHJldDsKIAogCW11dGV4X2xvY2soJnJkZXYtPm11dGV4KTsKIAlyZWd1bGF0b3ItPnVBX2xvYWQgPSAwOwotCXJldCA9IF9yZWd1bGF0b3JfZm9yY2VfZGlzYWJsZShyZGV2LCAmc3VwcGx5X3JkZXYpOworCXJldCA9IF9yZWd1bGF0b3JfZm9yY2VfZGlzYWJsZShyZWd1bGF0b3ItPnJkZXYpOwogCW11dGV4X3VubG9jaygmcmRldi0+bXV0ZXgpOwogCi0JaWYgKHN1cHBseV9yZGV2KQotCQlyZWd1bGF0b3JfZGlzYWJsZShnZXRfZGV2aWNlX3JlZ3VsYXRvcihyZGV2X2dldF9kZXYoc3VwcGx5X3JkZXYpKSk7CisJaWYgKHJkZXYtPnN1cHBseSkKKwkJd2hpbGUgKHJkZXYtPm9wZW5fY291bnQtLSkKKwkJCXJlZ3VsYXRvcl9kaXNhYmxlKHJkZXYtPnN1cHBseSk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjEzNiw3ICsyMTU3LDcgQEAKIAkvKiBnZXQgaW5wdXQgdm9sdGFnZSAqLwogCWlucHV0X3VWID0gMDsKIAlpZiAocmRldi0+c3VwcGx5KQotCQlpbnB1dF91ViA9IF9yZWd1bGF0b3JfZ2V0X3ZvbHRhZ2UocmRldi0+c3VwcGx5KTsKKwkJaW5wdXRfdVYgPSByZWd1bGF0b3JfZ2V0X3ZvbHRhZ2UocmRldi0+c3VwcGx5KTsKIAlpZiAoaW5wdXRfdVYgPD0gMCkKIAkJaW5wdXRfdVYgPSByZGV2LT5jb25zdHJhaW50cy0+aW5wdXRfdVY7CiAJaWYgKGlucHV0X3VWIDw9IDApIHsKQEAgLTIyMDYsMTcgKzIyMjcsOCBAQAogc3RhdGljIHZvaWQgX25vdGlmaWVyX2NhbGxfY2hhaW4oc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCiAJCQkJICB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpkYXRhKQogewotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpfcmRldjsKLQogCS8qIGNhbGwgcmRldiBjaGFpbiBmaXJzdCAqLwogCWJsb2NraW5nX25vdGlmaWVyX2NhbGxfY2hhaW4oJnJkZXYtPm5vdGlmaWVyLCBldmVudCwgTlVMTCk7Ci0KLQkvKiBub3cgbm90aWZ5IHJlZ3VsYXRvciB3ZSBzdXBwbHkgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KF9yZGV2LCAmcmRldi0+c3VwcGx5X2xpc3QsIHNsaXN0KSB7Ci0JCW11dGV4X2xvY2soJl9yZGV2LT5tdXRleCk7Ci0JCV9ub3RpZmllcl9jYWxsX2NoYWluKF9yZGV2LCBldmVudCwgZGF0YSk7Ci0JCW11dGV4X3VubG9jaygmX3JkZXYtPm11dGV4KTsKLQl9CiB9CiAKIC8qKgpAQCAtMjI2NCw2ICsyMjc2LDEzIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChyZWd1bGF0b3JfYnVsa19nZXQpOwogCitzdGF0aWMgdm9pZCByZWd1bGF0b3JfYnVsa19lbmFibGVfYXN5bmModm9pZCAqZGF0YSwgYXN5bmNfY29va2llX3QgY29va2llKQoreworCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhICpidWxrID0gZGF0YTsKKworCWJ1bGstPnJldCA9IHJlZ3VsYXRvcl9lbmFibGUoYnVsay0+Y29uc3VtZXIpOworfQorCiAvKioKICAqIHJlZ3VsYXRvcl9idWxrX2VuYWJsZSAtIGVuYWJsZSBtdWx0aXBsZSByZWd1bGF0b3IgY29uc3VtZXJzCiAgKgpAQCAtMjI3OSwyMSArMjI5OCwzMyBAQAogaW50IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShpbnQgbnVtX2NvbnN1bWVycywKIAkJCSAgc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEgKmNvbnN1bWVycykKIHsKKwlMSVNUX0hFQUQoYXN5bmNfZG9tYWluKTsKIAlpbnQgaTsKLQlpbnQgcmV0OworCWludCByZXQgPSAwOwogCisJZm9yIChpID0gMDsgaSA8IG51bV9jb25zdW1lcnM7IGkrKykKKwkJYXN5bmNfc2NoZWR1bGVfZG9tYWluKHJlZ3VsYXRvcl9idWxrX2VuYWJsZV9hc3luYywKKwkJCQkgICAgICAmY29uc3VtZXJzW2ldLCAmYXN5bmNfZG9tYWluKTsKKworCWFzeW5jX3N5bmNocm9uaXplX2Z1bGxfZG9tYWluKCZhc3luY19kb21haW4pOworCisJLyogSWYgYW55IGNvbnN1bWVyIGZhaWxlZCB3ZSBuZWVkIHRvIHVud2luZCBhbnkgdGhhdCBzdWNjZWVkZWQgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvbnN1bWVyczsgaSsrKSB7Ci0JCXJldCA9IHJlZ3VsYXRvcl9lbmFibGUoY29uc3VtZXJzW2ldLmNvbnN1bWVyKTsKLQkJaWYgKHJldCAhPSAwKQorCQlpZiAoY29uc3VtZXJzW2ldLnJldCAhPSAwKSB7CisJCQlyZXQgPSBjb25zdW1lcnNbaV0ucmV0OwogCQkJZ290byBlcnI7CisJCX0KIAl9CiAKIAlyZXR1cm4gMDsKIAogZXJyOgotCXByX2VycigiRmFpbGVkIHRvIGVuYWJsZSAlczogJWRcbiIsIGNvbnN1bWVyc1tpXS5zdXBwbHksIHJldCk7Ci0JZm9yICgtLWk7IGkgPj0gMDsgLS1pKQotCQlyZWd1bGF0b3JfZGlzYWJsZShjb25zdW1lcnNbaV0uY29uc3VtZXIpOworCWZvciAoaSA9IDA7IGkgPCBudW1fY29uc3VtZXJzOyBpKyspCisJCWlmIChjb25zdW1lcnNbaV0ucmV0ID09IDApCisJCQlyZWd1bGF0b3JfZGlzYWJsZShjb25zdW1lcnNbaV0uY29uc3VtZXIpOworCQllbHNlCisJCQlwcl9lcnIoIkZhaWxlZCB0byBlbmFibGUgJXM6ICVkXG4iLAorCQkJICAgICAgIGNvbnN1bWVyc1tpXS5zdXBwbHksIGNvbnN1bWVyc1tpXS5yZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTI1ODksOSArMjYyMCw3IEBACiAJcmRldi0+b3duZXIgPSByZWd1bGF0b3JfZGVzYy0+b3duZXI7CiAJcmRldi0+ZGVzYyA9IHJlZ3VsYXRvcl9kZXNjOwogCUlOSVRfTElTVF9IRUFEKCZyZGV2LT5jb25zdW1lcl9saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmcmRldi0+c3VwcGx5X2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZyZGV2LT5saXN0KTsKLQlJTklUX0xJU1RfSEVBRCgmcmRldi0+c2xpc3QpOwogCUJMT0NLSU5HX0lOSVRfTk9USUZJRVJfSEVBRCgmcmRldi0+bm90aWZpZXIpOwogCiAJLyogcHJlZm9ybSBhbnkgcmVndWxhdG9yIHNwZWNpZmljIGluaXQgKi8KQEAgLTI2NzIsNiArMjcwMSw3IEBACiAJdW5zZXRfcmVndWxhdG9yX3N1cHBsaWVzKHJkZXYpOwogCiBzY3J1YjoKKwlrZnJlZShyZGV2LT5jb25zdHJhaW50cyk7CiAJZGV2aWNlX3VucmVnaXN0ZXIoJnJkZXYtPmRldik7CiAJLyogZGV2aWNlIGNvcmUgZnJlZXMgcmRldiAqLwogCXJkZXYgPSBFUlJfUFRSKHJldCk7CkBAIC0yNzAzLDcgKzI3MzMsNyBAQAogCXVuc2V0X3JlZ3VsYXRvcl9zdXBwbGllcyhyZGV2KTsKIAlsaXN0X2RlbCgmcmRldi0+bGlzdCk7CiAJaWYgKHJkZXYtPnN1cHBseSkKLQkJc3lzZnNfcmVtb3ZlX2xpbmsoJnJkZXYtPmRldi5rb2JqLCAic3VwcGx5Iik7CisJCXJlZ3VsYXRvcl9wdXQocmRldi0+c3VwcGx5KTsKIAlkZXZpY2VfdW5yZWdpc3RlcigmcmRldi0+ZGV2KTsKIAlrZnJlZShyZGV2LT5jb25zdHJhaW50cyk7CiAJbXV0ZXhfdW5sb2NrKCZyZWd1bGF0b3JfbGlzdF9tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci9kdW1teS5jIGIvZHJpdmVycy9yZWd1bGF0b3IvZHVtbXkuYwppbmRleCBjNzQxMGJkLi5mNmVmNjY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci9kdW1teS5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL2R1bW15LmMKQEAgLTM2LDYgKzM2LDI5IEBACiAJLm9wcyA9ICZkdW1teV9vcHMsCiB9OwogCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkdW1teV9yZWd1bGF0b3JfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmV0OworCisJZHVtbXlfcmVndWxhdG9yX3JkZXYgPSByZWd1bGF0b3JfcmVnaXN0ZXIoJmR1bW15X2Rlc2MsIE5VTEwsCisJCQkJCQkgICZkdW1teV9pbml0ZGF0YSwgTlVMTCk7CisJaWYgKElTX0VSUihkdW1teV9yZWd1bGF0b3JfcmRldikpIHsKKwkJcmV0ID0gUFRSX0VSUihkdW1teV9yZWd1bGF0b3JfcmRldik7CisJCXByX2VycigiRmFpbGVkIHRvIHJlZ2lzdGVyIHJlZ3VsYXRvcjogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGR1bW15X3JlZ3VsYXRvcl9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGR1bW15X3JlZ3VsYXRvcl9wcm9iZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJCT0gInJlZy1kdW1teSIsCisJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwl9LAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmR1bW15X3BkZXY7CiAKIHZvaWQgX19pbml0IHJlZ3VsYXRvcl9kdW1teV9pbml0KHZvaWQpCkBAIC01NSwxMiArNzgsOSBAQAogCQlyZXR1cm47CiAJfQogCi0JZHVtbXlfcmVndWxhdG9yX3JkZXYgPSByZWd1bGF0b3JfcmVnaXN0ZXIoJmR1bW15X2Rlc2MsIE5VTEwsCi0JCQkJCQkgICZkdW1teV9pbml0ZGF0YSwgTlVMTCk7Ci0JaWYgKElTX0VSUihkdW1teV9yZWd1bGF0b3JfcmRldikpIHsKLQkJcmV0ID0gUFRSX0VSUihkdW1teV9yZWd1bGF0b3JfcmRldik7Ci0JCXByX2VycigiRmFpbGVkIHRvIHJlZ2lzdGVyIHJlZ3VsYXRvcjogJWRcbiIsIHJldCk7CisJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZkdW1teV9yZWd1bGF0b3JfZHJpdmVyKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJcHJfZXJyKCJGYWlsZWQgdG8gcmVnaXN0ZXIgZHVtbXkgcmVndWxhdG9yIGRyaXZlcjogJWRcbiIsIHJldCk7CiAJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKGR1bW15X3BkZXYpOwotCQlyZXR1cm47CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvdHBzNjU5MTAtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTkxMC1yZWd1bGF0b3IuYwppbmRleCA1NWRkNGU2Li42NmQyZDYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTkxMC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTkxMC1yZWd1bGF0b3IuYwpAQCAtNDksNyArNDksNiBAQAogI2RlZmluZSBUUFM2NTkxMV9SRUdfTERPNwkJMTEKICNkZWZpbmUgVFBTNjU5MTFfUkVHX0xETzgJCTEyCiAKLSNkZWZpbmUgVFBTNjU5MTBfTlVNX1JFR1VMQVRPUgkJMTMKICNkZWZpbmUgVFBTNjU5MTBfU1VQUExZX1NUQVRFX0VOQUJMRUQJMHgxCiAKIC8qIHN1cHBvcnRlZCBWSU8gdm9sdGFnZXMgaW4gbWlsaXZvbHRzICovCkBAIC0yNjQsMTEgKzI2MywxMiBAQAogfTsKIAogc3RydWN0IHRwczY1OTEwX3JlZyB7Ci0Jc3RydWN0IHJlZ3VsYXRvcl9kZXNjIGRlc2NbVFBTNjU5MTBfTlVNX1JFR1VMQVRPUl07CisJc3RydWN0IHJlZ3VsYXRvcl9kZXNjICpkZXNjOwogCXN0cnVjdCB0cHM2NTkxMCAqbWZkOwotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2W1RQUzY1OTEwX05VTV9SRUdVTEFUT1JdOwotCXN0cnVjdCB0cHNfaW5mbyAqaW5mb1tUUFM2NTkxMF9OVU1fUkVHVUxBVE9SXTsKKwlzdHJ1Y3QgcmVndWxhdG9yX2RldiAqKnJkZXY7CisJc3RydWN0IHRwc19pbmZvICoqaW5mbzsKIAlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CisJaW50IG51bV9yZWd1bGF0b3JzOwogCWludCBtb2RlOwogCWludCAgKCpnZXRfY3RybF9yZWcpKGludCk7CiB9OwpAQCAtNzU5LDggKzc1OSwxMyBAQAogCQltdWx0ID0gKHNlbGVjdG9yIC8gVkREMV8yX05VTV9WT0xUUykgKyAxOwogCQl2b2x0ID0gVkREMV8yX01JTl9WT0xUICsKIAkJCQkoc2VsZWN0b3IgJSBWREQxXzJfTlVNX1ZPTFRTKSAqIFZERDFfMl9PRkZTRVQ7CisJCWJyZWFrOwogCWNhc2UgVFBTNjU5MTFfUkVHX1ZERENUUkw6CiAJCXZvbHQgPSBWRERDVFJMX01JTl9WT0xUICsgKHNlbGVjdG9yICogVkREQ1RSTF9PRkZTRVQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJcmV0dXJuICB2b2x0ICogMTAwICogbXVsdDsKQEAgLTg5NywxNiArOTAyLDQyIEBACiAJc3dpdGNoKHRwczY1OTEwX2NoaXBfaWQodHBzNjU5MTApKSB7CiAJY2FzZSBUUFM2NTkxMDoKIAkJcG1pYy0+Z2V0X2N0cmxfcmVnID0gJnRwczY1OTEwX2dldF9jdHJsX3JlZ2lzdGVyOworCQlwbWljLT5udW1fcmVndWxhdG9ycyA9IEFSUkFZX1NJWkUodHBzNjU5MTBfcmVncyk7CiAJCWluZm8gPSB0cHM2NTkxMF9yZWdzOworCQlicmVhazsKIAljYXNlIFRQUzY1OTExOgogCQlwbWljLT5nZXRfY3RybF9yZWcgPSAmdHBzNjU5MTFfZ2V0X2N0cmxfcmVnaXN0ZXI7CisJCXBtaWMtPm51bV9yZWd1bGF0b3JzID0gQVJSQVlfU0laRSh0cHM2NTkxMV9yZWdzKTsKIAkJaW5mbyA9IHRwczY1OTExX3JlZ3M7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXByX2VycigiSW52YWxpZCB0cHMgY2hpcCB2ZXJzaW9uXG4iKTsKKwkJa2ZyZWUocG1pYyk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWZvciAoaSA9IDA7IGkgPCBUUFM2NTkxMF9OVU1fUkVHVUxBVE9SOyBpKyssIGluZm8rKywgcmVnX2RhdGErKykgeworCXBtaWMtPmRlc2MgPSBrY2FsbG9jKHBtaWMtPm51bV9yZWd1bGF0b3JzLAorCQkJc2l6ZW9mKHN0cnVjdCByZWd1bGF0b3JfZGVzYyksIEdGUF9LRVJORUwpOworCWlmICghcG1pYy0+ZGVzYykgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9mcmVlX3BtaWM7CisJfQorCisJcG1pYy0+aW5mbyA9IGtjYWxsb2MocG1pYy0+bnVtX3JlZ3VsYXRvcnMsCisJCQlzaXplb2Yoc3RydWN0IHRwc19pbmZvICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBtaWMtPmluZm8pIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZV9kZXNjOworCX0KKworCXBtaWMtPnJkZXYgPSBrY2FsbG9jKHBtaWMtPm51bV9yZWd1bGF0b3JzLAorCQkJc2l6ZW9mKHN0cnVjdCByZWd1bGF0b3JfZGV2ICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBtaWMtPnJkZXYpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZV9pbmZvOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBwbWljLT5udW1fcmVndWxhdG9yczsgaSsrLCBpbmZvKyssIHJlZ19kYXRhKyspIHsKIAkJLyogUmVnaXN0ZXIgdGhlIHJlZ3VsYXRvcnMgKi8KIAkJcG1pYy0+aW5mb1tpXSA9IGluZm87CiAKQEAgLTkzOCw3ICs5NjksNyBAQAogCQkJCSJmYWlsZWQgdG8gcmVnaXN0ZXIgJXMgcmVndWxhdG9yXG4iLAogCQkJCXBkZXYtPm5hbWUpOwogCQkJZXJyID0gUFRSX0VSUihyZGV2KTsKLQkJCWdvdG8gZXJyOworCQkJZ290byBlcnJfdW5yZWdpc3Rlcl9yZWd1bGF0b3I7CiAJCX0KIAogCQkvKiBTYXZlIHJlZ3VsYXRvciBmb3IgY2xlYW51cCAqLwpAQCAtOTQ2LDIzICs5NzcsMzEgQEAKIAl9CiAJcmV0dXJuIDA7CiAKLWVycjoKK2Vycl91bnJlZ2lzdGVyX3JlZ3VsYXRvcjoKIAl3aGlsZSAoLS1pID49IDApCiAJCXJlZ3VsYXRvcl91bnJlZ2lzdGVyKHBtaWMtPnJkZXZbaV0pOwotCisJa2ZyZWUocG1pYy0+cmRldik7CitlcnJfZnJlZV9pbmZvOgorCWtmcmVlKHBtaWMtPmluZm8pOworZXJyX2ZyZWVfZGVzYzoKKwlrZnJlZShwbWljLT5kZXNjKTsKK2Vycl9mcmVlX3BtaWM6CiAJa2ZyZWUocG1pYyk7CiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGludCBfX2RldmV4aXQgdHBzNjU5MTBfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IHRwczY1OTEwX3JlZyAqdHBzNjU5MTBfcmVnID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHRwczY1OTEwX3JlZyAqcG1pYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IFRQUzY1OTEwX05VTV9SRUdVTEFUT1I7IGkrKykKLQkJcmVndWxhdG9yX3VucmVnaXN0ZXIodHBzNjU5MTBfcmVnLT5yZGV2W2ldKTsKKwlmb3IgKGkgPSAwOyBpIDwgcG1pYy0+bnVtX3JlZ3VsYXRvcnM7IGkrKykKKwkJcmVndWxhdG9yX3VucmVnaXN0ZXIocG1pYy0+cmRldltpXSk7CiAKLQlrZnJlZSh0cHM2NTkxMF9yZWcpOworCWtmcmVlKHBtaWMtPnJkZXYpOworCWtmcmVlKHBtaWMtPmluZm8pOworCWtmcmVlKHBtaWMtPmRlc2MpOworCWtmcmVlKHBtaWMpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTkxMi1yZWd1bGF0b3IuYyBiL2RyaXZlcnMvcmVndWxhdG9yL3RwczY1OTEyLXJlZ3VsYXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOTMxM2UKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3JlZ3VsYXRvci90cHM2NTkxMi1yZWd1bGF0b3IuYwpAQCAtMCwwICsxLDgwMCBAQAorLyoKKyAqIHRwczY1OTEyLmMgIC0tICBUSSB0cHM2NTkxMgorICoKKyAqIENvcHlyaWdodCAyMDExIFRleGFzIEluc3RydW1lbnRzIEluYy4KKyAqCisgKiBBdXRob3I6IE1hcmdhcml0YSBPbGF5YSBDYWJyZXJhIDxtYWdpQHNsaW1sb2dpYy5jby51az4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGRyaXZlciBpcyBiYXNlZCBvbiB3bTgzNTAgaW1wbGVtZW50YXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvZHJpdmVyLmg+CisjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL21hY2hpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvbWZkL3RwczY1OTEyLmg+CisKKy8qIERDREMncyAqLworI2RlZmluZSBUUFM2NTkxMl9SRUdfRENEQzEJMAorI2RlZmluZSBUUFM2NTkxMl9SRUdfRENEQzIJMQorI2RlZmluZSBUUFM2NTkxMl9SRUdfRENEQzMJMgorI2RlZmluZSBUUFM2NTkxMl9SRUdfRENEQzQJMworCisvKiBMRE9zICovCisjZGVmaW5lIFRQUzY1OTEyX1JFR19MRE8xCTQKKyNkZWZpbmUgVFBTNjU5MTJfUkVHX0xETzIJNQorI2RlZmluZSBUUFM2NTkxMl9SRUdfTERPMwk2CisjZGVmaW5lIFRQUzY1OTEyX1JFR19MRE80CTcKKyNkZWZpbmUgVFBTNjU5MTJfUkVHX0xETzUJOAorI2RlZmluZSBUUFM2NTkxMl9SRUdfTERPNgk5CisjZGVmaW5lIFRQUzY1OTEyX1JFR19MRE83CTEwCisjZGVmaW5lIFRQUzY1OTEyX1JFR19MRE84CTExCisjZGVmaW5lIFRQUzY1OTEyX1JFR19MRE85CTEyCisjZGVmaW5lIFRQUzY1OTEyX1JFR19MRE8xMAkxMworCisjZGVmaW5lIFRQUzY1OTEyX01BWF9SRUdfSUQJVFBTNjU5MTJfUkVHX0xET18xMAorCisvKiBOdW1iZXIgb2Ygc3RlcC1kb3duIGNvbnZlcnRlcnMgYXZhaWxhYmxlICovCisjZGVmaW5lIFRQUzY1OTEyX05VTV9EQ0RDCTQKKworLyogTnVtYmVyIG9mIExETyB2b2x0YWdlIHJlZ3VsYXRvcnMgIGF2YWlsYWJsZSAqLworI2RlZmluZSBUUFM2NTkxMl9OVU1fTERPCTEwCisKKy8qIE51bWJlciBvZiB0b3RhbCByZWd1bGF0b3JzIGF2YWlsYWJsZSAqLworI2RlZmluZSBUUFM2NTkxMl9OVU1fUkVHVUxBVE9SCQkoVFBTNjU5MTJfTlVNX0RDREMgKyBUUFM2NTkxMl9OVU1fTERPKQorCisjZGVmaW5lIFRQUzY1OTEyX1JFR19FTkFCTEVECTB4ODAKKyNkZWZpbmUgT1BfU0VMUkVHX01BU0sJCTB4NDAKKyNkZWZpbmUgT1BfU0VMUkVHX1NISUZUCQk2CisKK3N0cnVjdCB0cHNfaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgdHBzX2luZm8gdHBzNjU5MTJfcmVnc1tdID0geworCXsKKwkJLm5hbWUgPSAiRENEQzEiLAorCX0sCisJeworCQkubmFtZSA9ICJEQ0RDMiIsCisJfSwKKwl7CisJCS5uYW1lID0gIkRDREMzIiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiRENEQzQiLAorCX0sCisJeworCQkubmFtZSA9ICJMRE8xIiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTERPMiIsCisJfSwKKwl7CisJCS5uYW1lID0gIkxETzMiLAorCX0sCisJeworCQkubmFtZSA9ICJMRE80IiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTERPNSIsCisJfSwKKwl7CisJCS5uYW1lID0gIkxETzYiLAorCX0sCisJeworCQkubmFtZSA9ICJMRE83IiwKKwl9LAorCXsKKwkJLm5hbWUgPSAiTERPOCIsCisJfSwKKwl7CisJCS5uYW1lID0gIkxETzkiLAorCX0sCisJeworCQkubmFtZSA9ICJMRE8xMCIsCisJfSwKK307CisKK3N0cnVjdCB0cHM2NTkxMl9yZWcgeworCXN0cnVjdCByZWd1bGF0b3JfZGVzYyBkZXNjW1RQUzY1OTEyX05VTV9SRUdVTEFUT1JdOworCXN0cnVjdCB0cHM2NTkxMiAqbWZkOworCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2W1RQUzY1OTEyX05VTV9SRUdVTEFUT1JdOworCXN0cnVjdCB0cHNfaW5mbyAqaW5mb1tUUFM2NTkxMl9OVU1fUkVHVUxBVE9SXTsKKwkvKiBmb3IgcmVhZC93cml0ZSBhY2Nlc3MgKi8KKwlzdHJ1Y3QgbXV0ZXggaW9fbG9jazsKKwlpbnQgbW9kZTsKKwlpbnQgKCpnZXRfY3RybF9yZWcpKGludCk7CisJaW50IGRjZGMxX3JhbmdlOworCWludCBkY2RjMl9yYW5nZTsKKwlpbnQgZGNkYzNfcmFuZ2U7CisJaW50IGRjZGM0X3JhbmdlOworCWludCBwd21fbW9kZV9yZWc7CisJaW50IGVjb19yZWc7Cit9OworCitzdGF0aWMgaW50IHRwczY1OTEyX2dldF9yYW5nZShzdHJ1Y3QgdHBzNjU5MTJfcmVnICpwbWljLCBpbnQgaWQpCit7CisJc3RydWN0IHRwczY1OTEyICptZmQgPSBwbWljLT5tZmQ7CisKKwlpZiAoaWQgPiBUUFM2NTkxMl9SRUdfRENEQzQpCisJCXJldHVybiAwOworCisJc3dpdGNoIChpZCkgeworCWNhc2UgVFBTNjU5MTJfUkVHX0RDREMxOgorCQlwbWljLT5kY2RjMV9yYW5nZSA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwKKwkJCQkJCQlUUFM2NTkxMl9EQ0RDMV9MSU1JVCk7CisJCWlmIChwbWljLT5kY2RjMV9yYW5nZSA8IDApCisJCQlyZXR1cm4gcG1pYy0+ZGNkYzFfcmFuZ2U7CisJCXBtaWMtPmRjZGMxX3JhbmdlID0gKHBtaWMtPmRjZGMxX3JhbmdlICYKKwkJCURDRENfTElNSVRfUkFOR0VfTUFTSykgPj4gRENEQ19MSU1JVF9SQU5HRV9TSElGVDsKKwkJcmV0dXJuIHBtaWMtPmRjZGMxX3JhbmdlOworCWNhc2UgVFBTNjU5MTJfUkVHX0RDREMyOgorCQlwbWljLT5kY2RjMl9yYW5nZSA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwKKwkJCQkJCQlUUFM2NTkxMl9EQ0RDMl9MSU1JVCk7CisJCWlmIChwbWljLT5kY2RjMl9yYW5nZSA8IDApCisJCQlyZXR1cm4gcG1pYy0+ZGNkYzJfcmFuZ2U7CisJCXBtaWMtPmRjZGMyX3JhbmdlID0gKHBtaWMtPmRjZGMyX3JhbmdlICYKKwkJCURDRENfTElNSVRfUkFOR0VfTUFTSykgPj4gRENEQ19MSU1JVF9SQU5HRV9TSElGVDsKKwkJcmV0dXJuIHBtaWMtPmRjZGMyX3JhbmdlOworCWNhc2UgVFBTNjU5MTJfUkVHX0RDREMzOgorCQlwbWljLT5kY2RjM19yYW5nZSA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwKKwkJCQkJCQlUUFM2NTkxMl9EQ0RDM19MSU1JVCk7CisJCWlmIChwbWljLT5kY2RjM19yYW5nZSA8IDApCisJCQlyZXR1cm4gcG1pYy0+ZGNkYzNfcmFuZ2U7CisJCXBtaWMtPmRjZGMzX3JhbmdlID0gKHBtaWMtPmRjZGMzX3JhbmdlICYKKwkJCURDRENfTElNSVRfUkFOR0VfTUFTSykgPj4gRENEQ19MSU1JVF9SQU5HRV9TSElGVDsKKwkJcmV0dXJuIHBtaWMtPmRjZGMzX3JhbmdlOworCWNhc2UgVFBTNjU5MTJfUkVHX0RDREM0OgorCQlwbWljLT5kY2RjNF9yYW5nZSA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwKKwkJCQkJCQlUUFM2NTkxMl9EQ0RDNF9MSU1JVCk7CisJCWlmIChwbWljLT5kY2RjNF9yYW5nZSA8IDApCisJCQlyZXR1cm4gcG1pYy0+ZGNkYzRfcmFuZ2U7CisJCXBtaWMtPmRjZGM0X3JhbmdlID0gKHBtaWMtPmRjZGM0X3JhbmdlICYKKwkJCURDRENfTElNSVRfUkFOR0VfTUFTSykgPj4gRENEQ19MSU1JVF9SQU5HRV9TSElGVDsKKwkJcmV0dXJuIHBtaWMtPmRjZGM0X3JhbmdlOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgdHBzNjU5MTJfdnNlbF90b191dl9yYW5nZTAodTggdnNlbCkKK3sKKwl1bnNpZ25lZCBsb25nIHV2OworCisJdXYgPSAoKHZzZWwgKiAxMjUwMCkgKyA1MDAwMDApOworCXJldHVybiB1djsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgdHBzNjU5MTJfdnNlbF90b191dl9yYW5nZTEodTggdnNlbCkKK3sKKwl1bnNpZ25lZCBsb25nIHV2OworCisJIHV2ID0gKCh2c2VsICogMTI1MDApICsgNzAwMDAwKTsKKwlyZXR1cm4gdXY7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRwczY1OTEyX3ZzZWxfdG9fdXZfcmFuZ2UyKHU4IHZzZWwpCit7CisJdW5zaWduZWQgbG9uZyB1djsKKworCXV2ID0gKCh2c2VsICogMjUwMDApICsgNTAwMDAwKTsKKwlyZXR1cm4gdXY7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRwczY1OTEyX3ZzZWxfdG9fdXZfcmFuZ2UzKHU4IHZzZWwpCit7CisJdW5zaWduZWQgbG9uZyB1djsKKworCWlmICh2c2VsID09IDB4M2YpCisJCXV2ID0gMzgwMDAwMDsKKwllbHNlCisJCXV2ID0gKCh2c2VsICogNTAwMDApICsgNTAwMDAwKTsKKworCXJldHVybiB1djsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgdHBzNjU5MTJfdnNlbF90b191dl9sZG8odTggdnNlbCkKK3sKKwl1bnNpZ25lZCBsb25nIHV2ID0gMDsKKworCWlmICh2c2VsIDw9IDMyKQorCQl1diA9ICgodnNlbCAqIDI1MDAwKSArIDgwMDAwMCk7CisJZWxzZSBpZiAodnNlbCA+IDMyICYmIHZzZWwgPD0gNjApCisJCXV2ID0gKCgodnNlbCAtIDMyKSAqIDUwMDAwKSArIDE2MDAwMDApOworCWVsc2UgaWYgKHZzZWwgPiA2MCkKKwkJdXYgPSAoKCh2c2VsIC0gNjApICogMTAwMDAwKSArIDMwMDAwMDApOworCisJcmV0dXJuIHV2OworfQorCitzdGF0aWMgaW50IHRwczY1OTEyX2dldF9jdHJsX3JlZ2lzdGVyKGludCBpZCkKK3sKKwlzd2l0Y2ggKGlkKSB7CisJY2FzZSBUUFM2NTkxMl9SRUdfRENEQzE6CisJCXJldHVybiBUUFM2NTkxMl9EQ0RDMV9BVlM7CisJY2FzZSBUUFM2NTkxMl9SRUdfRENEQzI6CisJCXJldHVybiBUUFM2NTkxMl9EQ0RDMl9BVlM7CisJY2FzZSBUUFM2NTkxMl9SRUdfRENEQzM6CisJCXJldHVybiBUUFM2NTkxMl9EQ0RDM19BVlM7CisJY2FzZSBUUFM2NTkxMl9SRUdfRENEQzQ6CisJCXJldHVybiBUUFM2NTkxMl9EQ0RDNF9BVlM7CisJY2FzZSBUUFM2NTkxMl9SRUdfTERPMToKKwkJcmV0dXJuIFRQUzY1OTEyX0xETzFfQVZTOworCWNhc2UgVFBTNjU5MTJfUkVHX0xETzI6CisJCXJldHVybiBUUFM2NTkxMl9MRE8yX0FWUzsKKwljYXNlIFRQUzY1OTEyX1JFR19MRE8zOgorCQlyZXR1cm4gVFBTNjU5MTJfTERPM19BVlM7CisJY2FzZSBUUFM2NTkxMl9SRUdfTERPNDoKKwkJcmV0dXJuIFRQUzY1OTEyX0xETzRfQVZTOworCWNhc2UgVFBTNjU5MTJfUkVHX0xETzU6CisJCXJldHVybiBUUFM2NTkxMl9MRE81OworCWNhc2UgVFBTNjU5MTJfUkVHX0xETzY6CisJCXJldHVybiBUUFM2NTkxMl9MRE82OworCWNhc2UgVFBTNjU5MTJfUkVHX0xETzc6CisJCXJldHVybiBUUFM2NTkxMl9MRE83OworCWNhc2UgVFBTNjU5MTJfUkVHX0xETzg6CisJCXJldHVybiBUUFM2NTkxMl9MRE84OworCWNhc2UgVFBTNjU5MTJfUkVHX0xETzk6CisJCXJldHVybiBUUFM2NTkxMl9MRE85OworCWNhc2UgVFBTNjU5MTJfUkVHX0xETzEwOgorCQlyZXR1cm4gVFBTNjU5MTJfTERPMTA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgaW50IHRwczY1OTEyX2dldF9kY2RjX3NlbF9yZWdpc3RlcihzdHJ1Y3QgdHBzNjU5MTJfcmVnICpwbWljLCBpbnQgaWQpCit7CisJc3RydWN0IHRwczY1OTEyICptZmQgPSBwbWljLT5tZmQ7CisJaW50IG9wdnNlbCA9IDAsIHNyID0gMDsKKwl1OCByZWcgPSAwOworCisJaWYgKGlkIDwgVFBTNjU5MTJfUkVHX0RDREMxIHx8IGlkID4gVFBTNjU5MTJfUkVHX0RDREM0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoaWQpIHsKKwljYXNlIFRQUzY1OTEyX1JFR19EQ0RDMToKKwkJb3B2c2VsID0gdHBzNjU5MTJfcmVnX3JlYWQobWZkLCBUUFM2NTkxMl9EQ0RDMV9PUCk7CisJCXNyID0gKChvcHZzZWwgJiBPUF9TRUxSRUdfTUFTSykgPj4gT1BfU0VMUkVHX1NISUZUKTsKKwkJaWYgKHNyKQorCQkJcmVnID0gVFBTNjU5MTJfRENEQzFfQVZTOworCQllbHNlCisJCQlyZWcgPSBUUFM2NTkxMl9EQ0RDMV9PUDsKKwkJYnJlYWs7CisJY2FzZSBUUFM2NTkxMl9SRUdfRENEQzI6CisJCW9wdnNlbCA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwgVFBTNjU5MTJfRENEQzJfT1ApOworCQlzciA9IChvcHZzZWwgJiBPUF9TRUxSRUdfTUFTSykgPj4gT1BfU0VMUkVHX1NISUZUOworCQlpZiAoc3IpCisJCQlyZWcgPSBUUFM2NTkxMl9EQ0RDMl9BVlM7CisJCWVsc2UKKwkJCXJlZyA9IFRQUzY1OTEyX0RDREMyX09QOworCQlicmVhazsKKwljYXNlIFRQUzY1OTEyX1JFR19EQ0RDMzoKKwkJb3B2c2VsID0gdHBzNjU5MTJfcmVnX3JlYWQobWZkLCBUUFM2NTkxMl9EQ0RDM19PUCk7CisJCXNyID0gKG9wdnNlbCAmIE9QX1NFTFJFR19NQVNLKSA+PiBPUF9TRUxSRUdfU0hJRlQ7CisJCWlmIChzcikKKwkJCXJlZyA9IFRQUzY1OTEyX0RDREMzX0FWUzsKKwkJZWxzZQorCQkJcmVnID0gVFBTNjU5MTJfRENEQzNfT1A7CisJCWJyZWFrOworCWNhc2UgVFBTNjU5MTJfUkVHX0RDREM0OgorCQlvcHZzZWwgPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIFRQUzY1OTEyX0RDREM0X09QKTsKKwkJc3IgPSAob3B2c2VsICYgT1BfU0VMUkVHX01BU0spID4+IE9QX1NFTFJFR19TSElGVDsKKwkJaWYgKHNyKQorCQkJcmVnID0gVFBTNjU5MTJfRENEQzRfQVZTOworCQllbHNlCisJCQlyZWcgPSBUUFM2NTkxMl9EQ0RDNF9PUDsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZWc7Cit9CisKK3N0YXRpYyBpbnQgdHBzNjU5MTJfZ2V0X2xkb19zZWxfcmVnaXN0ZXIoc3RydWN0IHRwczY1OTEyX3JlZyAqcG1pYywgaW50IGlkKQoreworCXN0cnVjdCB0cHM2NTkxMiAqbWZkID0gcG1pYy0+bWZkOworCWludCBvcHZzZWwgPSAwLCBzciA9IDA7CisJdTggcmVnID0gMDsKKworCWlmIChpZCA8IFRQUzY1OTEyX1JFR19MRE8xIHx8IGlkID4gVFBTNjU5MTJfUkVHX0xETzEwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoaWQpIHsKKwljYXNlIFRQUzY1OTEyX1JFR19MRE8xOgorCQlvcHZzZWwgPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIFRQUzY1OTEyX0xETzFfT1ApOworCQlzciA9IChvcHZzZWwgJiBPUF9TRUxSRUdfTUFTSykgPj4gT1BfU0VMUkVHX1NISUZUOworCQlpZiAoc3IpCisJCQlyZWcgPSBUUFM2NTkxMl9MRE8xX0FWUzsKKwkJZWxzZQorCQkJcmVnID0gVFBTNjU5MTJfTERPMV9PUDsKKwkJYnJlYWs7CisJY2FzZSBUUFM2NTkxMl9SRUdfTERPMjoKKwkJb3B2c2VsID0gdHBzNjU5MTJfcmVnX3JlYWQobWZkLCBUUFM2NTkxMl9MRE8yX09QKTsKKwkJc3IgPSAob3B2c2VsICYgT1BfU0VMUkVHX01BU0spID4+IE9QX1NFTFJFR19TSElGVDsKKwkJaWYgKHNyKQorCQkJcmVnID0gVFBTNjU5MTJfTERPMl9BVlM7CisJCWVsc2UKKwkJCXJlZyA9IFRQUzY1OTEyX0xETzJfT1A7CisJCWJyZWFrOworCWNhc2UgVFBTNjU5MTJfUkVHX0xETzM6CisJCW9wdnNlbCA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwgVFBTNjU5MTJfTERPM19PUCk7CisJCXNyID0gKG9wdnNlbCAmIE9QX1NFTFJFR19NQVNLKSA+PiBPUF9TRUxSRUdfU0hJRlQ7CisJCWlmIChzcikKKwkJCXJlZyA9IFRQUzY1OTEyX0xETzNfQVZTOworCQllbHNlCisJCQlyZWcgPSBUUFM2NTkxMl9MRE8zX09QOworCQlicmVhazsKKwljYXNlIFRQUzY1OTEyX1JFR19MRE80OgorCQlvcHZzZWwgPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIFRQUzY1OTEyX0xETzRfT1ApOworCQlzciA9IChvcHZzZWwgJiBPUF9TRUxSRUdfTUFTSykgPj4gT1BfU0VMUkVHX1NISUZUOworCQlpZiAoc3IpCisJCQlyZWcgPSBUUFM2NTkxMl9MRE80X0FWUzsKKwkJZWxzZQorCQkJcmVnID0gVFBTNjU5MTJfTERPNF9PUDsKKwkJYnJlYWs7CisJY2FzZSBUUFM2NTkxMl9SRUdfTERPNToKKwkJcmVnID0gVFBTNjU5MTJfTERPNTsKKwkJYnJlYWs7CisJY2FzZSBUUFM2NTkxMl9SRUdfTERPNjoKKwkJcmVnID0gVFBTNjU5MTJfTERPNjsKKwkJYnJlYWs7CisJY2FzZSBUUFM2NTkxMl9SRUdfTERPNzoKKwkJcmVnID0gVFBTNjU5MTJfTERPNzsKKwkJYnJlYWs7CisJY2FzZSBUUFM2NTkxMl9SRUdfTERPODoKKwkJcmVnID0gVFBTNjU5MTJfTERPODsKKwkJYnJlYWs7CisJY2FzZSBUUFM2NTkxMl9SRUdfTERPOToKKwkJcmVnID0gVFBTNjU5MTJfTERPOTsKKwkJYnJlYWs7CisJY2FzZSBUUFM2NTkxMl9SRUdfTERPMTA6CisJCXJlZyA9IFRQUzY1OTEyX0xETzEwOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmVnOworfQorCitzdGF0aWMgaW50IHRwczY1OTEyX2dldF9tb2RlX3JlZ2l0ZXJzKHN0cnVjdCB0cHM2NTkxMl9yZWcgKnBtaWMsIGludCBpZCkKK3sKKwlzd2l0Y2ggKGlkKSB7CisJY2FzZSBUUFM2NTkxMl9SRUdfRENEQzE6CisJCXBtaWMtPnB3bV9tb2RlX3JlZyA9IFRQUzY1OTEyX0RDREMxX0NUUkw7CisJCXBtaWMtPmVjb19yZWcgPSBUUFM2NTkxMl9EQ0RDMV9BVlM7CisJCWJyZWFrOworCWNhc2UgVFBTNjU5MTJfUkVHX0RDREMyOgorCQlwbWljLT5wd21fbW9kZV9yZWcgPSBUUFM2NTkxMl9EQ0RDMl9DVFJMOworCQlwbWljLT5lY29fcmVnID0gVFBTNjU5MTJfRENEQzJfQVZTOworCQlicmVhazsKKwljYXNlIFRQUzY1OTEyX1JFR19EQ0RDMzoKKwkJcG1pYy0+cHdtX21vZGVfcmVnID0gVFBTNjU5MTJfRENEQzNfQ1RSTDsKKwkJcG1pYy0+ZWNvX3JlZyA9IFRQUzY1OTEyX0RDREMzX0FWUzsKKwkJYnJlYWs7CisJY2FzZSBUUFM2NTkxMl9SRUdfRENEQzQ6CisJCXBtaWMtPnB3bV9tb2RlX3JlZyA9IFRQUzY1OTEyX0RDREM0X0NUUkw7CisJCXBtaWMtPmVjb19yZWcgPSBUUFM2NTkxMl9EQ0RDNF9BVlM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRwczY1OTEyX3JlZ19pc19lbmFibGVkKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYpCit7CisJc3RydWN0IHRwczY1OTEyX3JlZyAqcG1pYyA9IHJkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdHBzNjU5MTIgKm1mZCA9IHBtaWMtPm1mZDsKKwlpbnQgcmVnLCB2YWx1ZSwgaWQgPSByZGV2X2dldF9pZChkZXYpOworCisJaWYgKGlkIDwgVFBTNjU5MTJfUkVHX0RDREMxIHx8IGlkID4gVFBTNjU5MTJfUkVHX0xETzEwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJlZyA9IHBtaWMtPmdldF9jdHJsX3JlZyhpZCk7CisJaWYgKHJlZyA8IDApCisJCXJldHVybiByZWc7CisKKwl2YWx1ZSA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwgcmVnKTsKKwlpZiAodmFsdWUgPCAwKQorCQlyZXR1cm4gdmFsdWU7CisKKwlyZXR1cm4gdmFsdWUgJiBUUFM2NTkxMl9SRUdfRU5BQkxFRDsKK30KKworc3RhdGljIGludCB0cHM2NTkxMl9yZWdfZW5hYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYpCit7CisJc3RydWN0IHRwczY1OTEyX3JlZyAqcG1pYyA9IHJkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdHBzNjU5MTIgKm1mZCA9IHBtaWMtPm1mZDsKKwlpbnQgaWQgPSByZGV2X2dldF9pZChkZXYpOworCWludCByZWc7CisKKwlpZiAoaWQgPCBUUFM2NTkxMl9SRUdfRENEQzEgfHwgaWQgPiBUUFM2NTkxMl9SRUdfTERPMTApCisJCXJldHVybiAtRUlOVkFMOworCisJcmVnID0gcG1pYy0+Z2V0X2N0cmxfcmVnKGlkKTsKKwlpZiAocmVnIDwgMCkKKwkJcmV0dXJuIHJlZzsKKworCXJldHVybiB0cHM2NTkxMl9zZXRfYml0cyhtZmQsIHJlZywgVFBTNjU5MTJfUkVHX0VOQUJMRUQpOworfQorCitzdGF0aWMgaW50IHRwczY1OTEyX3JlZ19kaXNhYmxlKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYpCit7CisJc3RydWN0IHRwczY1OTEyX3JlZyAqcG1pYyA9IHJkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgdHBzNjU5MTIgKm1mZCA9IHBtaWMtPm1mZDsKKwlpbnQgaWQgPSByZGV2X2dldF9pZChkZXYpLCByZWc7CisKKwlyZWcgPSBwbWljLT5nZXRfY3RybF9yZWcoaWQpOworCWlmIChyZWcgPCAwKQorCQlyZXR1cm4gcmVnOworCisJcmV0dXJuIHRwczY1OTEyX2NsZWFyX2JpdHMobWZkLCByZWcsIFRQUzY1OTEyX1JFR19FTkFCTEVEKTsKK30KKworc3RhdGljIGludCB0cHM2NTkxMl9zZXRfbW9kZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2LCB1bnNpZ25lZCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgdHBzNjU5MTJfcmVnICpwbWljID0gcmRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB0cHM2NTkxMiAqbWZkID0gcG1pYy0+bWZkOworCWludCBwd21fbW9kZSwgZWNvLCBpZCA9IHJkZXZfZ2V0X2lkKGRldik7CisKKwl0cHM2NTkxMl9nZXRfbW9kZV9yZWdpdGVycyhwbWljLCBpZCk7CisKKwlwd21fbW9kZSA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwgcG1pYy0+cHdtX21vZGVfcmVnKTsKKwllY28gPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIHBtaWMtPmVjb19yZWcpOworCisJcHdtX21vZGUgJj0gRENEQ0NUUkxfRENEQ19NT0RFX01BU0s7CisJZWNvICY9IERDRENfQVZTX0VDT19NQVNLOworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBSRUdVTEFUT1JfTU9ERV9GQVNUOgorCQkvKiBWZXJpZnkgaWYgbW9kZSBhbHJlZHkgc2V0ICovCisJCWlmIChwd21fbW9kZSAmJiAhZWNvKQorCQkJYnJlYWs7CisJCXRwczY1OTEyX3NldF9iaXRzKG1mZCwgcG1pYy0+cHdtX21vZGVfcmVnLCBEQ0RDQ1RSTF9EQ0RDX01PREVfTUFTSyk7CisJCXRwczY1OTEyX2NsZWFyX2JpdHMobWZkLCBwbWljLT5lY29fcmVnLCBEQ0RDX0FWU19FQ09fTUFTSyk7CisJCWJyZWFrOworCWNhc2UgUkVHVUxBVE9SX01PREVfTk9STUFMOgorCWNhc2UgUkVHVUxBVE9SX01PREVfSURMRToKKwkJaWYgKCFwd21fbW9kZSAmJiAhZWNvKQorCQkJYnJlYWs7CisJCXRwczY1OTEyX2NsZWFyX2JpdHMobWZkLCBwbWljLT5wd21fbW9kZV9yZWcsIERDRENDVFJMX0RDRENfTU9ERV9NQVNLKTsKKwkJdHBzNjU5MTJfY2xlYXJfYml0cyhtZmQsIHBtaWMtPmVjb19yZWcsIERDRENfQVZTX0VDT19NQVNLKTsKKwkJYnJlYWs7CisJY2FzZSBSRUdVTEFUT1JfTU9ERV9TVEFOREJZOgorCQlpZiAoIXB3bV9tb2RlICYmIGVjbykKKwkJCWJyZWFrOworCQl0cHM2NTkxMl9jbGVhcl9iaXRzKG1mZCwgcG1pYy0+cHdtX21vZGVfcmVnLCBEQ0RDQ1RSTF9EQ0RDX01PREVfTUFTSyk7CisJCXRwczY1OTEyX3NldF9iaXRzKG1mZCwgcG1pYy0+ZWNvX3JlZywgRENEQ19BVlNfRUNPX01BU0spOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB0cHM2NTkxMl9nZXRfbW9kZShzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2KQoreworCXN0cnVjdCB0cHM2NTkxMl9yZWcgKnBtaWMgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHRwczY1OTEyICptZmQgPSBwbWljLT5tZmQ7CisJaW50IHB3bV9tb2RlLCBlY28sIG1vZGUgPSAwLCBpZCA9IHJkZXZfZ2V0X2lkKGRldik7CisKKwl0cHM2NTkxMl9nZXRfbW9kZV9yZWdpdGVycyhwbWljLCBpZCk7CisKKwlwd21fbW9kZSA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwgcG1pYy0+cHdtX21vZGVfcmVnKTsKKwllY28gPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIHBtaWMtPmVjb19yZWcpOworCisJcHdtX21vZGUgJj0gRENEQ0NUUkxfRENEQ19NT0RFX01BU0s7CisJZWNvICY9IERDRENfQVZTX0VDT19NQVNLOworCisJaWYgKHB3bV9tb2RlICYmICFlY28pCisJCW1vZGUgPSBSRUdVTEFUT1JfTU9ERV9GQVNUOworCWVsc2UgaWYgKCFwd21fbW9kZSAmJiAhZWNvKQorCQltb2RlID0gUkVHVUxBVE9SX01PREVfTk9STUFMOworCWVsc2UgaWYgKCFwd21fbW9kZSAmJiBlY28pCisJCW1vZGUgPSBSRUdVTEFUT1JfTU9ERV9TVEFOREJZOworCisJcmV0dXJuIG1vZGU7Cit9CisKK3N0YXRpYyBpbnQgdHBzNjU5MTJfZ2V0X3ZvbHRhZ2VfZGNkYyhzdHJ1Y3QgcmVndWxhdG9yX2RldiAqZGV2KQoreworCXN0cnVjdCB0cHM2NTkxMl9yZWcgKnBtaWMgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHRwczY1OTEyICptZmQgPSBwbWljLT5tZmQ7CisJaW50IGlkID0gcmRldl9nZXRfaWQoZGV2KSwgdm9sdGFnZSA9IDAsIHJhbmdlOworCWludCBvcHZzZWwgPSAwLCBhdnNlbCA9IDAsIHNyLCB2c2VsOworCisJc3dpdGNoIChpZCkgeworCWNhc2UgVFBTNjU5MTJfUkVHX0RDREMxOgorCQlvcHZzZWwgPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIFRQUzY1OTEyX0RDREMxX09QKTsKKwkJYXZzZWwgPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIFRQUzY1OTEyX0RDREMxX0FWUyk7CisJCXJhbmdlID0gcG1pYy0+ZGNkYzFfcmFuZ2U7CisJCWJyZWFrOworCWNhc2UgVFBTNjU5MTJfUkVHX0RDREMyOgorCQlvcHZzZWwgPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIFRQUzY1OTEyX0RDREMyX09QKTsKKwkJYXZzZWwgPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIFRQUzY1OTEyX0RDREMyX0FWUyk7CisJCXJhbmdlID0gcG1pYy0+ZGNkYzJfcmFuZ2U7CisJCWJyZWFrOworCWNhc2UgVFBTNjU5MTJfUkVHX0RDREMzOgorCQlvcHZzZWwgPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIFRQUzY1OTEyX0RDREMzX09QKTsKKwkJYXZzZWwgPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIFRQUzY1OTEyX0RDREMzX0FWUyk7CisJCXJhbmdlID0gcG1pYy0+ZGNkYzNfcmFuZ2U7CisJCWJyZWFrOworCWNhc2UgVFBTNjU5MTJfUkVHX0RDREM0OgorCQlvcHZzZWwgPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIFRQUzY1OTEyX0RDREM0X09QKTsKKwkJYXZzZWwgPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIFRQUzY1OTEyX0RDREM0X0FWUyk7CisJCXJhbmdlID0gcG1pYy0+ZGNkYzRfcmFuZ2U7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNyID0gKG9wdnNlbCAmIE9QX1NFTFJFR19NQVNLKSA+PiBPUF9TRUxSRUdfU0hJRlQ7CisJaWYgKHNyKQorCQl2c2VsID0gYXZzZWw7CisJZWxzZQorCQl2c2VsID0gb3B2c2VsOworCXZzZWwgJj0gMHgzRjsKKworCXN3aXRjaCAocmFuZ2UpIHsKKwljYXNlIDA6CisJCS8qIDAuNSAtIDEuMjg3NVYgaW4gMTIuNW1WIHN0ZXBzICovCisJCXZvbHRhZ2UgPSB0cHM2NTkxMl92c2VsX3RvX3V2X3JhbmdlMCh2c2VsKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQkvKiAwLjcgLSAxLjQ4NzVWIGluIDEyLjVtViBzdGVwcyAqLworCQl2b2x0YWdlID0gdHBzNjU5MTJfdnNlbF90b191dl9yYW5nZTEodnNlbCk7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJLyogMC41IC0gMi4wNzVWIGluIDI1bVYgc3RlcHMgKi8KKwkJdm9sdGFnZSA9IHRwczY1OTEyX3ZzZWxfdG9fdXZfcmFuZ2UyKHZzZWwpOworCQlicmVhazsKKwljYXNlIDM6CisJCS8qIDAuNSAtIDMuOFYgaW4gNTBtViBzdGVwcyAqLworCQl2b2x0YWdlID0gdHBzNjU5MTJfdnNlbF90b191dl9yYW5nZTModnNlbCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gdm9sdGFnZTsKK30KKworc3RhdGljIGludCB0cHM2NTkxMl9zZXRfdm9sdGFnZV9kY2RjKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYsCisJCQkJCQl1bnNpZ25lZCBzZWxlY3RvcikKK3sKKwlzdHJ1Y3QgdHBzNjU5MTJfcmVnICpwbWljID0gcmRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB0cHM2NTkxMiAqbWZkID0gcG1pYy0+bWZkOworCWludCBpZCA9IHJkZXZfZ2V0X2lkKGRldik7CisJaW50IHZhbHVlOworCXU4IHJlZzsKKworCXJlZyA9IHRwczY1OTEyX2dldF9kY2RjX3NlbF9yZWdpc3RlcihwbWljLCBpZCk7CisJdmFsdWUgPSB0cHM2NTkxMl9yZWdfcmVhZChtZmQsIHJlZyk7CisJdmFsdWUgJj0gMHhDMDsKKwlyZXR1cm4gdHBzNjU5MTJfcmVnX3dyaXRlKG1mZCwgcmVnLCBzZWxlY3RvciB8IHZhbHVlKTsKK30KKworc3RhdGljIGludCB0cHM2NTkxMl9nZXRfdm9sdGFnZV9sZG8oc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgdHBzNjU5MTJfcmVnICpwbWljID0gcmRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCB0cHM2NTkxMiAqbWZkID0gcG1pYy0+bWZkOworCWludCBpZCA9IHJkZXZfZ2V0X2lkKGRldik7CisJaW50IHZzZWwgPSAwOworCXU4IHJlZzsKKworCXJlZyA9IHRwczY1OTEyX2dldF9sZG9fc2VsX3JlZ2lzdGVyKHBtaWMsIGlkKTsKKwl2c2VsID0gdHBzNjU5MTJfcmVnX3JlYWQobWZkLCByZWcpOworCXZzZWwgJj0gMHgzRjsKKworCXJldHVybiB0cHM2NTkxMl92c2VsX3RvX3V2X2xkbyh2c2VsKTsKK30KKworc3RhdGljIGludCB0cHM2NTkxMl9zZXRfdm9sdGFnZV9sZG8oc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmRldiwKKwkJCQkJCXVuc2lnbmVkIHNlbGVjdG9yKQoreworCXN0cnVjdCB0cHM2NTkxMl9yZWcgKnBtaWMgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHRwczY1OTEyICptZmQgPSBwbWljLT5tZmQ7CisJaW50IGlkID0gcmRldl9nZXRfaWQoZGV2KSwgcmVnLCB2YWx1ZTsKKworCXJlZyA9IHRwczY1OTEyX2dldF9sZG9fc2VsX3JlZ2lzdGVyKHBtaWMsIGlkKTsKKwl2YWx1ZSA9IHRwczY1OTEyX3JlZ19yZWFkKG1mZCwgcmVnKTsKKwl2YWx1ZSAmPSAweEMwOworCXJldHVybiB0cHM2NTkxMl9yZWdfd3JpdGUobWZkLCByZWcsIHNlbGVjdG9yIHwgdmFsdWUpOworfQorCitzdGF0aWMgaW50IHRwczY1OTEyX2xpc3Rfdm9sdGFnZV9kY2RjKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpkZXYsCisJCQkJCXVuc2lnbmVkIHNlbGVjdG9yKQoreworCXN0cnVjdCB0cHM2NTkxMl9yZWcgKnBtaWMgPSByZGV2X2dldF9kcnZkYXRhKGRldik7CisJaW50IHJhbmdlLCB2b2x0YWdlID0gMCwgaWQgPSByZGV2X2dldF9pZChkZXYpOworCisJc3dpdGNoIChpZCkgeworCWNhc2UgVFBTNjU5MTJfUkVHX0RDREMxOgorCQlyYW5nZSA9IHBtaWMtPmRjZGMxX3JhbmdlOworCQlicmVhazsKKwljYXNlIFRQUzY1OTEyX1JFR19EQ0RDMjoKKwkJcmFuZ2UgPSBwbWljLT5kY2RjMl9yYW5nZTsKKwkJYnJlYWs7CisJY2FzZSBUUFM2NTkxMl9SRUdfRENEQzM6CisJCXJhbmdlID0gcG1pYy0+ZGNkYzNfcmFuZ2U7CisJCWJyZWFrOworCWNhc2UgVFBTNjU5MTJfUkVHX0RDREM0OgorCQlyYW5nZSA9IHBtaWMtPmRjZGM0X3JhbmdlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKHJhbmdlKSB7CisJY2FzZSAwOgorCQkvKiAwLjUgLSAxLjI4NzVWIGluIDEyLjVtViBzdGVwcyAqLworCQl2b2x0YWdlID0gdHBzNjU5MTJfdnNlbF90b191dl9yYW5nZTAoc2VsZWN0b3IpOworCQlicmVhazsKKwljYXNlIDE6CisJCS8qIDAuNyAtIDEuNDg3NVYgaW4gMTIuNW1WIHN0ZXBzICovCisJCXZvbHRhZ2UgPSB0cHM2NTkxMl92c2VsX3RvX3V2X3JhbmdlMShzZWxlY3Rvcik7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJLyogMC41IC0gMi4wNzVWIGluIDI1bVYgc3RlcHMgKi8KKwkJdm9sdGFnZSA9IHRwczY1OTEyX3ZzZWxfdG9fdXZfcmFuZ2UyKHNlbGVjdG9yKTsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQkvKiAwLjUgLSAzLjhWIGluIDUwbVYgc3RlcHMgKi8KKwkJdm9sdGFnZSA9IHRwczY1OTEyX3ZzZWxfdG9fdXZfcmFuZ2UzKHNlbGVjdG9yKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiB2b2x0YWdlOworfQorCitzdGF0aWMgaW50IHRwczY1OTEyX2xpc3Rfdm9sdGFnZV9sZG8oc3RydWN0IHJlZ3VsYXRvcl9kZXYgKmRldiwKKwkJCQkJdW5zaWduZWQgc2VsZWN0b3IpCit7CisJaW50IGxkbyA9IHJkZXZfZ2V0X2lkKGRldik7CisKKwlpZiAobGRvIDwgVFBTNjU5MTJfUkVHX0xETzEgfHwgbGRvID4gVFBTNjU5MTJfUkVHX0xETzEwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiB0cHM2NTkxMl92c2VsX3RvX3V2X2xkbyhzZWxlY3Rvcik7Cit9CisKKy8qIE9wZXJhdGlvbnMgcGVybWl0dGVkIG9uIERDREN4ICovCitzdGF0aWMgc3RydWN0IHJlZ3VsYXRvcl9vcHMgdHBzNjU5MTJfb3BzX2RjZGMgPSB7CisJLmlzX2VuYWJsZWQgPSB0cHM2NTkxMl9yZWdfaXNfZW5hYmxlZCwKKwkuZW5hYmxlID0gdHBzNjU5MTJfcmVnX2VuYWJsZSwKKwkuZGlzYWJsZSA9IHRwczY1OTEyX3JlZ19kaXNhYmxlLAorCS5zZXRfbW9kZSA9IHRwczY1OTEyX3NldF9tb2RlLAorCS5nZXRfbW9kZSA9IHRwczY1OTEyX2dldF9tb2RlLAorCS5nZXRfdm9sdGFnZSA9IHRwczY1OTEyX2dldF92b2x0YWdlX2RjZGMsCisJLnNldF92b2x0YWdlX3NlbCA9IHRwczY1OTEyX3NldF92b2x0YWdlX2RjZGMsCisJLmxpc3Rfdm9sdGFnZSA9IHRwczY1OTEyX2xpc3Rfdm9sdGFnZV9kY2RjLAorfTsKKworLyogT3BlcmF0aW9ucyBwZXJtaXR0ZWQgb24gTERPeCAqLworc3RhdGljIHN0cnVjdCByZWd1bGF0b3Jfb3BzIHRwczY1OTEyX29wc19sZG8gPSB7CisJLmlzX2VuYWJsZWQgPSB0cHM2NTkxMl9yZWdfaXNfZW5hYmxlZCwKKwkuZW5hYmxlID0gdHBzNjU5MTJfcmVnX2VuYWJsZSwKKwkuZGlzYWJsZSA9IHRwczY1OTEyX3JlZ19kaXNhYmxlLAorCS5nZXRfdm9sdGFnZSA9IHRwczY1OTEyX2dldF92b2x0YWdlX2xkbywKKwkuc2V0X3ZvbHRhZ2Vfc2VsID0gdHBzNjU5MTJfc2V0X3ZvbHRhZ2VfbGRvLAorCS5saXN0X3ZvbHRhZ2UgPSB0cHM2NTkxMl9saXN0X3ZvbHRhZ2VfbGRvLAorfTsKKworc3RhdGljIF9fZGV2aW5pdCBpbnQgdHBzNjU5MTJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOworCXN0cnVjdCB0cHNfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgcmVndWxhdG9yX2luaXRfZGF0YSAqcmVnX2RhdGE7CisJc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXY7CisJc3RydWN0IHRwczY1OTEyX3JlZyAqcG1pYzsKKwlzdHJ1Y3QgdHBzNjU5MTJfYm9hcmQgKnBtaWNfcGxhdF9kYXRhOworCWludCBpLCBlcnI7CisKKwlwbWljX3BsYXRfZGF0YSA9IGRldl9nZXRfcGxhdGRhdGEodHBzNjU5MTItPmRldik7CisJaWYgKCFwbWljX3BsYXRfZGF0YSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZWdfZGF0YSA9IHBtaWNfcGxhdF9kYXRhLT50cHM2NTkxMl9wbWljX2luaXRfZGF0YTsKKworCXBtaWMgPSBremFsbG9jKHNpemVvZigqcG1pYyksIEdGUF9LRVJORUwpOworCWlmICghcG1pYykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltdXRleF9pbml0KCZwbWljLT5pb19sb2NrKTsKKwlwbWljLT5tZmQgPSB0cHM2NTkxMjsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBwbWljKTsKKworCXBtaWMtPmdldF9jdHJsX3JlZyA9ICZ0cHM2NTkxMl9nZXRfY3RybF9yZWdpc3RlcjsKKwlpbmZvID0gdHBzNjU5MTJfcmVnczsKKworCWZvciAoaSA9IDA7IGkgPCBUUFM2NTkxMl9OVU1fUkVHVUxBVE9SOyBpKyssIGluZm8rKywgcmVnX2RhdGErKykgeworCQlpbnQgcmFuZ2UgPSAwOworCQkvKiBSZWdpc3RlciB0aGUgcmVndWxhdG9ycyAqLworCQlwbWljLT5pbmZvW2ldID0gaW5mbzsKKworCQlwbWljLT5kZXNjW2ldLm5hbWUgPSBpbmZvLT5uYW1lOworCQlwbWljLT5kZXNjW2ldLmlkID0gaTsKKwkJcG1pYy0+ZGVzY1tpXS5uX3ZvbHRhZ2VzID0gNjQ7CisJCXBtaWMtPmRlc2NbaV0ub3BzID0gKGkgPiBUUFM2NTkxMl9SRUdfRENEQzQgPworCQkJJnRwczY1OTEyX29wc19sZG8gOiAmdHBzNjU5MTJfb3BzX2RjZGMpOworCQlwbWljLT5kZXNjW2ldLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRTsKKwkJcG1pYy0+ZGVzY1tpXS5vd25lciA9IFRISVNfTU9EVUxFOworCQlyYW5nZSA9IHRwczY1OTEyX2dldF9yYW5nZShwbWljLCBpKTsKKwkJcmRldiA9IHJlZ3VsYXRvcl9yZWdpc3RlcigmcG1pYy0+ZGVzY1tpXSwKKwkJCQkJdHBzNjU5MTItPmRldiwgcmVnX2RhdGEsIHBtaWMpOworCQlpZiAoSVNfRVJSKHJkZXYpKSB7CisJCQlkZXZfZXJyKHRwczY1OTEyLT5kZXYsCisJCQkJImZhaWxlZCB0byByZWdpc3RlciAlcyByZWd1bGF0b3JcbiIsCisJCQkJcGRldi0+bmFtZSk7CisJCQllcnIgPSBQVFJfRVJSKHJkZXYpOworCQkJZ290byBlcnI7CisJCX0KKworCQkvKiBTYXZlIHJlZ3VsYXRvciBmb3IgY2xlYW51cCAqLworCQlwbWljLT5yZGV2W2ldID0gcmRldjsKKwl9CisJcmV0dXJuIDA7CisKK2VycjoKKwl3aGlsZSAoLS1pID49IDApCisJCXJlZ3VsYXRvcl91bnJlZ2lzdGVyKHBtaWMtPnJkZXZbaV0pOworCisJa2ZyZWUocG1pYyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgdHBzNjU5MTJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHRwczY1OTEyX3JlZyAqdHBzNjU5MTJfcmVnID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVFBTNjU5MTJfTlVNX1JFR1VMQVRPUjsgaSsrKQorCQlyZWd1bGF0b3JfdW5yZWdpc3Rlcih0cHM2NTkxMl9yZWctPnJkZXZbaV0pOworCisJa2ZyZWUodHBzNjU5MTJfcmVnKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdHBzNjU5MTJfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInRwczY1OTEyLXBtaWMiLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZSA9IHRwczY1OTEyX3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcCh0cHM2NTkxMl9yZW1vdmUpLAorfTsKKworLyoqCisgKiB0cHM2NTkxMl9pbml0CisgKgorICogTW9kdWxlIGluaXQgZnVuY3Rpb24KKyAqLworc3RhdGljIGludCBfX2luaXQgdHBzNjU5MTJfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnRwczY1OTEyX2RyaXZlcik7Cit9CitzdWJzeXNfaW5pdGNhbGwodHBzNjU5MTJfaW5pdCk7CisKKy8qKgorICogdHBzNjU5MTJfY2xlYW51cAorICoKKyAqIE1vZHVsZSBleGl0IGZ1bmN0aW9uCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCB0cHM2NTkxMl9jbGVhbnVwKHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnRwczY1OTEyX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdCh0cHM2NTkxMl9jbGVhbnVwKTsKKworTU9EVUxFX0FVVEhPUigiTWFyZ2FyaXRhIE9sYXlhIENhYnJlcmEgPG1hZ2lAc2xpbWxvZ2ljLmNvLnVrPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJUUFM2NTkxMiB2b2x0YWdlIHJlZ3VsYXRvciBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06dHBzNjU5MTItcG1pYyIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3IvdHdsLXJlZ3VsYXRvci5jIGIvZHJpdmVycy9yZWd1bGF0b3IvdHdsLXJlZ3VsYXRvci5jCmluZGV4IDg3ZmUwZjcuLmVlODc0N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3R3bC1yZWd1bGF0b3IuYworKysgYi9kcml2ZXJzL3JlZ3VsYXRvci90d2wtcmVndWxhdG9yLmMKQEAgLTgzNSw4ICs4MzUsOCBAQAogCQkJcmVtYXBfY29uZikgXAogCQlUV0xfRklYRURfTERPKGxhYmVsLCBvZmZzZXQsIG1Wb2x0cywgbnVtLCB0dXJub25fZGVsYXksIFwKIAkJCXJlbWFwX2NvbmYsIFRXTDQwMzAsIHR3bDQwMzBmaXhlZF9vcHMpCi0jZGVmaW5lIFRXTDYwMzBfRklYRURfTERPKGxhYmVsLCBvZmZzZXQsIG1Wb2x0cywgbnVtLCB0dXJub25fZGVsYXkpIFwKLQkJVFdMX0ZJWEVEX0xETyhsYWJlbCwgb2Zmc2V0LCBtVm9sdHMsIG51bSwgdHVybm9uX2RlbGF5LCBcCisjZGVmaW5lIFRXTDYwMzBfRklYRURfTERPKGxhYmVsLCBvZmZzZXQsIG1Wb2x0cywgdHVybm9uX2RlbGF5KSBcCisJCVRXTF9GSVhFRF9MRE8obGFiZWwsIG9mZnNldCwgbVZvbHRzLCAweDAsIHR1cm5vbl9kZWxheSwgXAogCQkJMHgwLCBUV0w2MDMwLCB0d2w2MDMwZml4ZWRfb3BzKQogCiAjZGVmaW5lIFRXTDQwMzBfQURKVVNUQUJMRV9MRE8obGFiZWwsIG9mZnNldCwgbnVtLCB0dXJub25fZGVsYXksIHJlbWFwX2NvbmYpIHsgXApAQCAtODU2LDI0ICs4NTYsMjIgQEAKIAkJfSwgXAogCX0KIAotI2RlZmluZSBUV0w2MDMwX0FESlVTVEFCTEVfTERPKGxhYmVsLCBvZmZzZXQsIG1pbl9tVm9sdHMsIG1heF9tVm9sdHMsIG51bSkgeyBcCisjZGVmaW5lIFRXTDYwMzBfQURKVVNUQUJMRV9MRE8obGFiZWwsIG9mZnNldCwgbWluX21Wb2x0cywgbWF4X21Wb2x0cykgeyBcCiAJLmJhc2UgPSBvZmZzZXQsIFwKLQkuaWQgPSBudW0sIFwKIAkubWluX21WID0gbWluX21Wb2x0cywgXAogCS5tYXhfbVYgPSBtYXhfbVZvbHRzLCBcCiAJLmRlc2MgPSB7IFwKIAkJLm5hbWUgPSAjbGFiZWwsIFwKIAkJLmlkID0gVFdMNjAzMF9SRUdfIyNsYWJlbCwgXAotCQkubl92b2x0YWdlcyA9IChtYXhfbVZvbHRzIC0gbWluX21Wb2x0cykvMTAwLCBcCisJCS5uX3ZvbHRhZ2VzID0gKG1heF9tVm9sdHMgLSBtaW5fbVZvbHRzKS8xMDAgKyAxLCBcCiAJCS5vcHMgPSAmdHdsNjAzMGxkb19vcHMsIFwKIAkJLnR5cGUgPSBSRUdVTEFUT1JfVk9MVEFHRSwgXAogCQkub3duZXIgPSBUSElTX01PRFVMRSwgXAogCQl9LCBcCiAJfQogCi0jZGVmaW5lIFRXTDYwMjVfQURKVVNUQUJMRV9MRE8obGFiZWwsIG9mZnNldCwgbWluX21Wb2x0cywgbWF4X21Wb2x0cywgbnVtKSB7IFwKKyNkZWZpbmUgVFdMNjAyNV9BREpVU1RBQkxFX0xETyhsYWJlbCwgb2Zmc2V0LCBtaW5fbVZvbHRzLCBtYXhfbVZvbHRzKSB7IFwKIAkuYmFzZSA9IG9mZnNldCwgXAotCS5pZCA9IG51bSwgXAogCS5taW5fbVYgPSBtaW5fbVZvbHRzLCBcCiAJLm1heF9tViA9IG1heF9tVm9sdHMsIFwKIAkuZGVzYyA9IHsgXApAQCAtOTAzLDkgKzkwMSw4IEBACiAJCX0sIFwKIAl9CiAKLSNkZWZpbmUgVFdMNjAzMF9GSVhFRF9SRVNPVVJDRShsYWJlbCwgb2Zmc2V0LCBudW0sIHR1cm5vbl9kZWxheSkgeyBcCisjZGVmaW5lIFRXTDYwMzBfRklYRURfUkVTT1VSQ0UobGFiZWwsIG9mZnNldCwgdHVybm9uX2RlbGF5KSB7IFwKIAkuYmFzZSA9IG9mZnNldCwgXAotCS5pZCA9IG51bSwgXAogCS5kZWxheSA9IHR1cm5vbl9kZWxheSwgXAogCS5kZXNjID0geyBcCiAJCS5uYW1lID0gI2xhYmVsLCBcCkBAIC05MTYsOSArOTEzLDggQEAKIAkJfSwgXAogCX0KIAotI2RlZmluZSBUV0w2MDI1X0FESlVTVEFCTEVfU01QUyhsYWJlbCwgb2Zmc2V0LCBudW0pIHsgXAorI2RlZmluZSBUV0w2MDI1X0FESlVTVEFCTEVfU01QUyhsYWJlbCwgb2Zmc2V0KSB7IFwKIAkuYmFzZSA9IG9mZnNldCwgXAotCS5pZCA9IG51bSwgXAogCS5taW5fbVYgPSA2MDAsIFwKIAkubWF4X21WID0gMjEwMCwgXAogCS5kZXNjID0geyBcCkBAIC05NjEsMzIgKzk1NywzMiBAQAogCS8qIDYwMzAgUkVHIHdpdGggYmFzZSBhcyBQTUMgU2xhdmUgTWlzYyA6IDB4MDAzMCAqLwogCS8qIFR1cm5vbi1kZWxheSBhbmQgcmVtYXAgY29uZmlndXJhdGlvbiB2YWx1ZXMgZm9yIDYwMzAgYXJlIG5vdAogCSAgIHZlcmlmaWVkIHNpbmNlIHRoZSBzcGVjaWZpY2F0aW9uIGlzIG5vdCBwdWJsaWMgKi8KLQlUV0w2MDMwX0FESlVTVEFCTEVfTERPKFZBVVgxXzYwMzAsIDB4NTQsIDEwMDAsIDMzMDAsIDEpLAotCVRXTDYwMzBfQURKVVNUQUJMRV9MRE8oVkFVWDJfNjAzMCwgMHg1OCwgMTAwMCwgMzMwMCwgMiksCi0JVFdMNjAzMF9BREpVU1RBQkxFX0xETyhWQVVYM182MDMwLCAweDVjLCAxMDAwLCAzMzAwLCAzKSwKLQlUV0w2MDMwX0FESlVTVEFCTEVfTERPKFZNTUMsIDB4NjgsIDEwMDAsIDMzMDAsIDQpLAotCVRXTDYwMzBfQURKVVNUQUJMRV9MRE8oVlBQLCAweDZjLCAxMDAwLCAzMzAwLCA1KSwKLQlUV0w2MDMwX0FESlVTVEFCTEVfTERPKFZVU0lNLCAweDc0LCAxMDAwLCAzMzAwLCA3KSwKLQlUV0w2MDMwX0ZJWEVEX0xETyhWQU5BLCAweDUwLCAyMTAwLCAxNSwgMCksCi0JVFdMNjAzMF9GSVhFRF9MRE8oVkNYSU8sIDB4NjAsIDE4MDAsIDE2LCAwKSwKLQlUV0w2MDMwX0ZJWEVEX0xETyhWREFDLCAweDY0LCAxODAwLCAxNywgMCksCi0JVFdMNjAzMF9GSVhFRF9MRE8oVlVTQiwgMHg3MCwgMzMwMCwgMTgsIDApLAotCVRXTDYwMzBfRklYRURfUkVTT1VSQ0UoQ0xLMzJLRywgMHg4QywgNDgsIDApLAorCVRXTDYwMzBfQURKVVNUQUJMRV9MRE8oVkFVWDFfNjAzMCwgMHg1NCwgMTAwMCwgMzMwMCksCisJVFdMNjAzMF9BREpVU1RBQkxFX0xETyhWQVVYMl82MDMwLCAweDU4LCAxMDAwLCAzMzAwKSwKKwlUV0w2MDMwX0FESlVTVEFCTEVfTERPKFZBVVgzXzYwMzAsIDB4NWMsIDEwMDAsIDMzMDApLAorCVRXTDYwMzBfQURKVVNUQUJMRV9MRE8oVk1NQywgMHg2OCwgMTAwMCwgMzMwMCksCisJVFdMNjAzMF9BREpVU1RBQkxFX0xETyhWUFAsIDB4NmMsIDEwMDAsIDMzMDApLAorCVRXTDYwMzBfQURKVVNUQUJMRV9MRE8oVlVTSU0sIDB4NzQsIDEwMDAsIDMzMDApLAorCVRXTDYwMzBfRklYRURfTERPKFZBTkEsIDB4NTAsIDIxMDAsIDApLAorCVRXTDYwMzBfRklYRURfTERPKFZDWElPLCAweDYwLCAxODAwLCAwKSwKKwlUV0w2MDMwX0ZJWEVEX0xETyhWREFDLCAweDY0LCAxODAwLCAwKSwKKwlUV0w2MDMwX0ZJWEVEX0xETyhWVVNCLCAweDcwLCAzMzAwLCAwKSwKKwlUV0w2MDMwX0ZJWEVEX1JFU09VUkNFKENMSzMyS0csIDB4OEMsIDApLAogCiAJLyogNjAyNSBhcmUgcmVuYW1lZCBjb21wYXJlZCB0byA2MDMwIHZlcnNpb25zICovCi0JVFdMNjAyNV9BREpVU1RBQkxFX0xETyhMRE8yLCAweDU0LCAxMDAwLCAzMzAwLCAxKSwKLQlUV0w2MDI1X0FESlVTVEFCTEVfTERPKExETzQsIDB4NTgsIDEwMDAsIDMzMDAsIDIpLAotCVRXTDYwMjVfQURKVVNUQUJMRV9MRE8oTERPMywgMHg1YywgMTAwMCwgMzMwMCwgMyksCi0JVFdMNjAyNV9BREpVU1RBQkxFX0xETyhMRE81LCAweDY4LCAxMDAwLCAzMzAwLCA0KSwKLQlUV0w2MDI1X0FESlVTVEFCTEVfTERPKExETzEsIDB4NmMsIDEwMDAsIDMzMDAsIDUpLAotCVRXTDYwMjVfQURKVVNUQUJMRV9MRE8oTERPNywgMHg3NCwgMTAwMCwgMzMwMCwgNyksCi0JVFdMNjAyNV9BREpVU1RBQkxFX0xETyhMRE82LCAweDYwLCAxMDAwLCAzMzAwLCAxNiksCi0JVFdMNjAyNV9BREpVU1RBQkxFX0xETyhMRE9MTiwgMHg2NCwgMTAwMCwgMzMwMCwgMTcpLAotCVRXTDYwMjVfQURKVVNUQUJMRV9MRE8oTERPVVNCLCAweDcwLCAxMDAwLCAzMzAwLCAxOCksCisJVFdMNjAyNV9BREpVU1RBQkxFX0xETyhMRE8yLCAweDU0LCAxMDAwLCAzMzAwKSwKKwlUV0w2MDI1X0FESlVTVEFCTEVfTERPKExETzQsIDB4NTgsIDEwMDAsIDMzMDApLAorCVRXTDYwMjVfQURKVVNUQUJMRV9MRE8oTERPMywgMHg1YywgMTAwMCwgMzMwMCksCisJVFdMNjAyNV9BREpVU1RBQkxFX0xETyhMRE81LCAweDY4LCAxMDAwLCAzMzAwKSwKKwlUV0w2MDI1X0FESlVTVEFCTEVfTERPKExETzEsIDB4NmMsIDEwMDAsIDMzMDApLAorCVRXTDYwMjVfQURKVVNUQUJMRV9MRE8oTERPNywgMHg3NCwgMTAwMCwgMzMwMCksCisJVFdMNjAyNV9BREpVU1RBQkxFX0xETyhMRE82LCAweDYwLCAxMDAwLCAzMzAwKSwKKwlUV0w2MDI1X0FESlVTVEFCTEVfTERPKExET0xOLCAweDY0LCAxMDAwLCAzMzAwKSwKKwlUV0w2MDI1X0FESlVTVEFCTEVfTERPKExET1VTQiwgMHg3MCwgMTAwMCwgMzMwMCksCiAKLQlUV0w2MDI1X0FESlVTVEFCTEVfU01QUyhTTVBTMywgMHgzNCwgMSksCi0JVFdMNjAyNV9BREpVU1RBQkxFX1NNUFMoU01QUzQsIDB4MTAsIDIpLAotCVRXTDYwMjVfQURKVVNUQUJMRV9TTVBTKFZJTywgMHgxNiwgMyksCisJVFdMNjAyNV9BREpVU1RBQkxFX1NNUFMoU01QUzMsIDB4MzQpLAorCVRXTDYwMjVfQURKVVNUQUJMRV9TTVBTKFNNUFM0LCAweDEwKSwKKwlUV0w2MDI1X0FESlVTVEFCTEVfU01QUyhWSU8sIDB4MTYpLAogfTsKIAogc3RhdGljIHU4IHR3bF9nZXRfc21wc19vZmZzZXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcmVndWxhdG9yL3dtODMxeC1kY2RjLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci93bTgzMXgtZGNkYy5jCmluZGV4IGEwOTgyZTguLmJkMzUzMWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmVndWxhdG9yL3dtODMxeC1kY2RjLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3Ivd204MzF4LWRjZGMuYwpAQCAtMjY3LDIzICsyNjcsNiBAQAogCXJldHVybiB2c2VsOwogfQogCi1zdGF0aWMgaW50IHdtODMxeF9idWNrdl9zZWxlY3RfbWF4X3ZvbHRhZ2Uoc3RydWN0IHJlZ3VsYXRvcl9kZXYgKnJkZXYsCi0JCQkJCSAgIGludCBtaW5fdVYsIGludCBtYXhfdVYpCi17Ci0JdTE2IHZzZWw7Ci0KLQlpZiAobWF4X3VWIDwgNjAwMDAwIHx8IG1heF91ViA+IDE4MDAwMDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JdnNlbCA9ICgobWF4X3VWIC0gNjAwMDAwKSAvIDEyNTAwKSArIDg7Ci0KLQlpZiAod204MzF4X2J1Y2t2X2xpc3Rfdm9sdGFnZShyZGV2LCB2c2VsKSA8IG1pbl91ViB8fAotCSAgICB3bTgzMXhfYnVja3ZfbGlzdF92b2x0YWdlKHJkZXYsIHZzZWwpIDwgbWF4X3VWKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXJldHVybiB2c2VsOwotfQotCiBzdGF0aWMgaW50IHdtODMxeF9idWNrdl9zZXRfZHZzKHN0cnVjdCByZWd1bGF0b3JfZGV2ICpyZGV2LCBpbnQgc3RhdGUpCiB7CiAJc3RydWN0IHdtODMxeF9kY2RjICpkY2RjID0gcmRldl9nZXRfZHJ2ZGF0YShyZGV2KTsKQEAgLTMzOCwyOCArMzIxLDIzIEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQkvKiBTZXQgdGhlIGhpZ2ggdm9sdGFnZSBhcyB0aGUgRFZTIHZvbHRhZ2UuICBUaGlzIGlzIG9wdGltaXNlZAotCSAqIGZvciBDUFVmcmVxIHVzYWdlLCBtb3N0IHByb2Nlc3NvcnMgd2lsbCBrZWVwIHRoZSBtYXhpbXVtCi0JICogdm9sdGFnZSBjb25zdGFudCBhbmQgbG93ZXIgdGhlIG1pbmltdW0gd2l0aCB0aGUgZnJlcXVlbmN5LiAqLwotCXZzZWwgPSB3bTgzMXhfYnVja3Zfc2VsZWN0X21heF92b2x0YWdlKHJkZXYsIG1pbl91ViwgbWF4X3VWKTsKLQlpZiAodnNlbCA8IDApIHsKLQkJLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuIC0gYXQgd29yc3QgdGhlIHNhbWUgdnNlbAotCQkgKiBzaG91bGQgYmUgY2hvc2VuICovCi0JCVdBUk5fT04odnNlbCA8IDApOwotCQlyZXR1cm4gMDsKKwkvKgorCSAqIElmIHRoaXMgVlNFTCBpcyBoaWdoZXIgdGhhbiB0aGUgbGFzdCBvbmUgd2UndmUgc2VlbiB0aGVuCisJICogcmVtZW1iZXIgaXQgYXMgdGhlIERWUyBWU0VMLiAgVGhpcyBpcyBvcHRpbWlzZWQgZm9yIENQVWZyZXEKKwkgKiB1c2FnZSB3aGVyZSB3ZSB3YW50IHRvIGdldCB0byB0aGUgaGlnaGVzdCB2b2x0YWdlIHZlcnkKKwkgKiBxdWlja2x5LgorCSAqLworCWlmICh2c2VsID4gZGNkYy0+ZHZzX3ZzZWwpIHsKKwkJcmV0ID0gd204MzF4X3NldF9iaXRzKHdtODMxeCwgZHZzX3JlZywKKwkJCQkgICAgICBXTTgzMVhfREMxX0RWU19WU0VMX01BU0ssCisJCQkJICAgICAgZGNkYy0+ZHZzX3ZzZWwpOworCQlpZiAocmV0ID09IDApCisJCQlkY2RjLT5kdnNfdnNlbCA9IHZzZWw7CisJCWVsc2UKKwkJCWRldl93YXJuKHdtODMxeC0+ZGV2LAorCQkJCSAiRmFpbGVkIHRvIHNldCBEQ0RDIERWUyBWU0VMOiAlZFxuIiwgcmV0KTsKIAl9CiAKLQkvKiBEb24ndCBib3RoZXIgaWYgaXQncyB0aGUgc2FtZSBWU0VMIHdlJ3JlIGFscmVhZHkgdXNpbmcgKi8KLQlpZiAodnNlbCA9PSBkY2RjLT5vbl92c2VsKQotCQlyZXR1cm4gMDsKLQotCXJldCA9IHdtODMxeF9zZXRfYml0cyh3bTgzMXgsIGR2c19yZWcsIFdNODMxWF9EQzFfRFZTX1ZTRUxfTUFTSywgdnNlbCk7Ci0JaWYgKHJldCA9PSAwKQotCQlkY2RjLT5kdnNfdnNlbCA9IHZzZWw7Ci0JZWxzZQotCQlkZXZfd2Fybih3bTgzMXgtPmRldiwgIkZhaWxlZCB0byBzZXQgRENEQyBEVlMgVlNFTDogJWRcbiIsCi0JCQkgcmV0KTsKLQogCXJldHVybiAwOwogfQogCkBAIC00NTYsMjcgKzQzNCw2IEBACiAJaWYgKCFwZGF0YSB8fCAhcGRhdGEtPmR2c19ncGlvKQogCQlyZXR1cm47CiAKLQlzd2l0Y2ggKHBkYXRhLT5kdnNfY29udHJvbF9zcmMpIHsKLQljYXNlIDE6Ci0JCWN0cmwgPSAyIDw8IFdNODMxWF9EQzFfRFZTX1NSQ19TSElGVDsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQljdHJsID0gMyA8PCBXTTgzMVhfREMxX0RWU19TUkNfU0hJRlQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWRldl9lcnIod204MzF4LT5kZXYsICJJbnZhbGlkIERWUyBjb250cm9sIHNvdXJjZSAlZCBmb3IgJXNcbiIsCi0JCQlwZGF0YS0+ZHZzX2NvbnRyb2xfc3JjLCBkY2RjLT5uYW1lKTsKLQkJcmV0dXJuOwotCX0KLQotCXJldCA9IHdtODMxeF9zZXRfYml0cyh3bTgzMXgsIGRjZGMtPmJhc2UgKyBXTTgzMVhfRENEQ19EVlNfQ09OVFJPTCwKLQkJCSAgICAgIFdNODMxWF9EQzFfRFZTX1NSQ19NQVNLLCBjdHJsKTsKLQlpZiAocmV0IDwgMCkgewotCQlkZXZfZXJyKHdtODMxeC0+ZGV2LCAiRmFpbGVkIHRvIHNldCAlcyBEVlMgc291cmNlOiAlZFxuIiwKLQkJCWRjZGMtPm5hbWUsIHJldCk7Ci0JCXJldHVybjsKLQl9Ci0KIAlyZXQgPSBncGlvX3JlcXVlc3QocGRhdGEtPmR2c19ncGlvLCAiRENEQyBEVlMiKTsKIAlpZiAocmV0IDwgMCkgewogCQlkZXZfZXJyKHdtODMxeC0+ZGV2LCAiRmFpbGVkIHRvIGdldCAlcyBEVlMgR1BJTzogJWRcbiIsCkBAIC00OTgsMTcgKzQ1NSw1NyBAQAogCX0KIAogCWRjZGMtPmR2c19ncGlvID0gcGRhdGEtPmR2c19ncGlvOworCisJc3dpdGNoIChwZGF0YS0+ZHZzX2NvbnRyb2xfc3JjKSB7CisJY2FzZSAxOgorCQljdHJsID0gMiA8PCBXTTgzMVhfREMxX0RWU19TUkNfU0hJRlQ7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJY3RybCA9IDMgPDwgV004MzFYX0RDMV9EVlNfU1JDX1NISUZUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZXJyKHdtODMxeC0+ZGV2LCAiSW52YWxpZCBEVlMgY29udHJvbCBzb3VyY2UgJWQgZm9yICVzXG4iLAorCQkJcGRhdGEtPmR2c19jb250cm9sX3NyYywgZGNkYy0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwkvKiBJZiBEVlNfVlNFTCBpcyBzZXQgdG8gdGhlIG1pbmltdW0gdmFsdWUgdGhlbiByYWlzZSBpdCB0byBPTl9WU0VMCisJICogdG8gbWFrZSBib290c3RyYXBwaW5nIGEgYml0IHNtb290aGVyLgorCSAqLworCWlmICghZGNkYy0+ZHZzX3ZzZWwpIHsKKwkJcmV0ID0gd204MzF4X3NldF9iaXRzKHdtODMxeCwKKwkJCQkgICAgICBkY2RjLT5iYXNlICsgV004MzFYX0RDRENfRFZTX0NPTlRST0wsCisJCQkJICAgICAgV004MzFYX0RDMV9EVlNfVlNFTF9NQVNLLCBkY2RjLT5vbl92c2VsKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJZGNkYy0+ZHZzX3ZzZWwgPSBkY2RjLT5vbl92c2VsOworCQllbHNlCisJCQlkZXZfd2Fybih3bTgzMXgtPmRldiwgIkZhaWxlZCB0byBzZXQgRFZTX1ZTRUw6ICVkXG4iLAorCQkJCSByZXQpOworCX0KKworCXJldCA9IHdtODMxeF9zZXRfYml0cyh3bTgzMXgsIGRjZGMtPmJhc2UgKyBXTTgzMVhfRENEQ19EVlNfQ09OVFJPTCwKKwkJCSAgICAgIFdNODMxWF9EQzFfRFZTX1NSQ19NQVNLLCBjdHJsKTsKKwlpZiAocmV0IDwgMCkgeworCQlkZXZfZXJyKHdtODMxeC0+ZGV2LCAiRmFpbGVkIHRvIHNldCAlcyBEVlMgc291cmNlOiAlZFxuIiwKKwkJCWRjZGMtPm5hbWUsIHJldCk7CisJfQogfQogCiBzdGF0aWMgX19kZXZpbml0IGludCB3bTgzMXhfYnVja3ZfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CiAJc3RydWN0IHdtODMxeF9wZGF0YSAqcGRhdGEgPSB3bTgzMXgtPmRldi0+cGxhdGZvcm1fZGF0YTsKLQlpbnQgaWQgPSBwZGV2LT5pZCAlIEFSUkFZX1NJWkUocGRhdGEtPmRjZGMpOworCWludCBpZDsKIAlzdHJ1Y3Qgd204MzF4X2RjZGMgKmRjZGM7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJaW50IHJldCwgaXJxOwogCisJaWYgKHBkYXRhICYmIHBkYXRhLT53bTgzMXhfbnVtKQorCQlpZCA9IChwZGF0YS0+d204MzF4X251bSAqIDEwKSArIDE7CisJZWxzZQorCQlpZCA9IDA7CisJaWQgPSBwZGV2LT5pZCAtIGlkOworCiAJZGV2X2RiZygmcGRldi0+ZGV2LCAiUHJvYmluZyBEQ0RDJWRcbiIsIGlkICsgMSk7CiAKIAlpZiAocGRhdGEgPT0gTlVMTCB8fCBwZGF0YS0+ZGNkY1tpZF0gPT0gTlVMTCkKQEAgLTU0NSw3ICs1NDIsNyBAQAogCX0KIAlkY2RjLT5vbl92c2VsID0gcmV0ICYgV004MzFYX0RDMV9PTl9WU0VMX01BU0s7CiAKLQlyZXQgPSB3bTgzMXhfcmVnX3JlYWQod204MzF4LCBkY2RjLT5iYXNlICsgV004MzFYX0RDRENfT05fQ09ORklHKTsKKwlyZXQgPSB3bTgzMXhfcmVnX3JlYWQod204MzF4LCBkY2RjLT5iYXNlICsgV004MzFYX0RDRENfRFZTX0NPTlRST0wpOwogCWlmIChyZXQgPCAwKSB7CiAJCWRldl9lcnIod204MzF4LT5kZXYsICJGYWlsZWQgdG8gcmVhZCBEVlMgVlNFTDogJWRcbiIsIHJldCk7CiAJCWdvdG8gZXJyOwpAQCAtNzA5LDExICs3MDYsMTcgQEAKIHsKIAlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CiAJc3RydWN0IHdtODMxeF9wZGF0YSAqcGRhdGEgPSB3bTgzMXgtPmRldi0+cGxhdGZvcm1fZGF0YTsKLQlpbnQgaWQgPSBwZGV2LT5pZCAlIEFSUkFZX1NJWkUocGRhdGEtPmRjZGMpOworCWludCBpZDsKIAlzdHJ1Y3Qgd204MzF4X2RjZGMgKmRjZGM7CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJaW50IHJldCwgaXJxOwogCisJaWYgKHBkYXRhICYmIHBkYXRhLT53bTgzMXhfbnVtKQorCQlpZCA9IChwZGF0YS0+d204MzF4X251bSAqIDEwKSArIDE7CisJZWxzZQorCQlpZCA9IDA7CisJaWQgPSBwZGV2LT5pZCAtIGlkOworCiAJZGV2X2RiZygmcGRldi0+ZGV2LCAiUHJvYmluZyBEQ0RDJWRcbiIsIGlkICsgMSk7CiAKIAlpZiAocGRhdGEgPT0gTlVMTCB8fCBwZGF0YS0+ZGNkY1tpZF0gPT0gTlVMTCkKQEAgLTEwNDYsMyArMTA0OSw0IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQUxJQVMoInBsYXRmb3JtOndtODMxeC1idWNrdiIpOwogTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTp3bTgzMXgtYnVja3AiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06d204MzF4LWVwZSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yZWd1bGF0b3Ivd204MzF4LWxkby5jIGIvZHJpdmVycy9yZWd1bGF0b3Ivd204MzF4LWxkby5jCmluZGV4IDIyMjBjZjhkLi42NzA5NzEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JlZ3VsYXRvci93bTgzMXgtbGRvLmMKKysrIGIvZHJpdmVycy9yZWd1bGF0b3Ivd204MzF4LWxkby5jCkBAIC0zMTAsMTEgKzMxMCwxNyBAQAogewogCXN0cnVjdCB3bTgzMXggKndtODMxeCA9IGRldl9nZXRfZHJ2ZGF0YShwZGV2LT5kZXYucGFyZW50KTsKIAlzdHJ1Y3Qgd204MzF4X3BkYXRhICpwZGF0YSA9IHdtODMxeC0+ZGV2LT5wbGF0Zm9ybV9kYXRhOwotCWludCBpZCA9IHBkZXYtPmlkICUgQVJSQVlfU0laRShwZGF0YS0+bGRvKTsKKwlpbnQgaWQ7CiAJc3RydWN0IHdtODMxeF9sZG8gKmxkbzsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAlpbnQgcmV0LCBpcnE7CiAKKwlpZiAocGRhdGEgJiYgcGRhdGEtPndtODMxeF9udW0pCisJCWlkID0gKHBkYXRhLT53bTgzMXhfbnVtICogMTApICsgMTsKKwllbHNlCisJCWlkID0gMDsKKwlpZCA9IHBkZXYtPmlkIC0gaWQ7CisKIAlkZXZfZGJnKCZwZGV2LT5kZXYsICJQcm9iaW5nIExETyVkXG4iLCBpZCArIDEpOwogCiAJaWYgKHBkYXRhID09IE5VTEwgfHwgcGRhdGEtPmxkb1tpZF0gPT0gTlVMTCkKQEAgLTU3NCwxMSArNTgwLDE3IEBACiB7CiAJc3RydWN0IHdtODMxeCAqd204MzF4ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYtPmRldi5wYXJlbnQpOwogCXN0cnVjdCB3bTgzMXhfcGRhdGEgKnBkYXRhID0gd204MzF4LT5kZXYtPnBsYXRmb3JtX2RhdGE7Ci0JaW50IGlkID0gcGRldi0+aWQgJSBBUlJBWV9TSVpFKHBkYXRhLT5sZG8pOworCWludCBpZDsKIAlzdHJ1Y3Qgd204MzF4X2xkbyAqbGRvOwogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCWludCByZXQsIGlycTsKIAorCWlmIChwZGF0YSAmJiBwZGF0YS0+d204MzF4X251bSkKKwkJaWQgPSAocGRhdGEtPndtODMxeF9udW0gKiAxMCkgKyAxOworCWVsc2UKKwkJaWQgPSAwOworCWlkID0gcGRldi0+aWQgLSBpZDsKKwogCWRldl9kYmcoJnBkZXYtPmRldiwgIlByb2JpbmcgTERPJWRcbiIsIGlkICsgMSk7CiAKIAlpZiAocGRhdGEgPT0gTlVMTCB8fCBwZGF0YS0+bGRvW2lkXSA9PSBOVUxMKQpAQCAtNzY0LDExICs3NzYsMTggQEAKIHsKIAlzdHJ1Y3Qgd204MzF4ICp3bTgzMXggPSBkZXZfZ2V0X2RydmRhdGEocGRldi0+ZGV2LnBhcmVudCk7CiAJc3RydWN0IHdtODMxeF9wZGF0YSAqcGRhdGEgPSB3bTgzMXgtPmRldi0+cGxhdGZvcm1fZGF0YTsKLQlpbnQgaWQgPSBwZGV2LT5pZCAlIEFSUkFZX1NJWkUocGRhdGEtPmxkbyk7CisJaW50IGlkOwogCXN0cnVjdCB3bTgzMXhfbGRvICpsZG87CiAJc3RydWN0IHJlc291cmNlICpyZXM7CiAJaW50IHJldDsKIAorCWlmIChwZGF0YSAmJiBwZGF0YS0+d204MzF4X251bSkKKwkJaWQgPSAocGRhdGEtPndtODMxeF9udW0gKiAxMCkgKyAxOworCWVsc2UKKwkJaWQgPSAwOworCWlkID0gcGRldi0+aWQgLSBpZDsKKworCiAJZGV2X2RiZygmcGRldi0+ZGV2LCAiUHJvYmluZyBMRE8lZFxuIiwgaWQgKyAxKTsKIAogCWlmIChwZGF0YSA9PSBOVUxMIHx8IHBkYXRhLT5sZG9baWRdID09IE5VTEwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JlZ3VsYXRvci93bTg5OTQtcmVndWxhdG9yLmMgYi9kcml2ZXJzL3JlZ3VsYXRvci93bTg5OTQtcmVndWxhdG9yLmMKaW5kZXggMzViMjk1OC4uMWE2YTY5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9yZWd1bGF0b3Ivd204OTk0LXJlZ3VsYXRvci5jCisrKyBiL2RyaXZlcnMvcmVndWxhdG9yL3dtODk5NC1yZWd1bGF0b3IuYwpAQCAtNDMsNyArNDMsNyBAQAogCWlmICghbGRvLT5lbmFibGUpCiAJCXJldHVybiAwOwogCi0JZ3Bpb19zZXRfdmFsdWUobGRvLT5lbmFibGUsIDEpOworCWdwaW9fc2V0X3ZhbHVlX2NhbnNsZWVwKGxkby0+ZW5hYmxlLCAxKTsKIAlsZG8tPmlzX2VuYWJsZWQgPSB0cnVlOwogCiAJcmV0dXJuIDA7CkBAIC01Nyw3ICs1Nyw3IEBACiAJaWYgKCFsZG8tPmVuYWJsZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlncGlvX3NldF92YWx1ZShsZG8tPmVuYWJsZSwgMCk7CisJZ3Bpb19zZXRfdmFsdWVfY2Fuc2xlZXAobGRvLT5lbmFibGUsIDApOwogCWxkby0+aXNfZW5hYmxlZCA9IGZhbHNlOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtb21hcC5jIGIvZHJpdmVycy9ydGMvcnRjLW9tYXAuYwppbmRleCBiY2FlOGRkLi43Nzg5MDAyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3J0Yy9ydGMtb21hcC5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1vbWFwLmMKQEAgLTM2OCw3ICszNjgsNyBAQAogCQlwcl9pbmZvKCIlczogYWxyZWFkeSBydW5uaW5nXG4iLCBwZGV2LT5uYW1lKTsKIAogCS8qIGZvcmNlIHRvIDI0IGhvdXIgbW9kZSAqLwotCW5ld19jdHJsID0gcmVnICYgfihPTUFQX1JUQ19DVFJMX1NQTElUfE9NQVBfUlRDX0NUUkxfQVVUT19DT01QKTsKKwluZXdfY3RybCA9IHJlZyAmIChPTUFQX1JUQ19DVFJMX1NQTElUfE9NQVBfUlRDX0NUUkxfQVVUT19DT01QKTsKIAluZXdfY3RybCB8PSBPTUFQX1JUQ19DVFJMX1NUT1A7CiAKIAkvKiBCT0FSRC1TUEVDSUZJQyBDVVNUT01JWkFUSU9OIENBTiBHTyBIRVJFOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkLmMKaW5kZXggNDMyNDQ0YS4uYTFkM2RkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2QuYworKysgYi9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZC5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAKICNpbmNsdWRlIDxhc20vY2N3ZGV2Lmg+CiAjaW5jbHVkZSA8YXNtL2ViY2RpYy5oPgpAQCAtODg4LDExICs4ODksMTEgQEAKIHsKIAljaGFyICpidWZmZXI7CiAKLQlidWZmZXIgPSBrbWFsbG9jKHVzZXJfbGVuICsgMSwgR0ZQX0tFUk5FTCk7CisJYnVmZmVyID0gdm1hbGxvYyh1c2VyX2xlbiArIDEpOwogCWlmIChidWZmZXIgPT0gTlVMTCkKIAkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CiAJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZmZlciwgdXNlcl9idWYsIHVzZXJfbGVuKSAhPSAwKSB7Ci0JCWtmcmVlKGJ1ZmZlcik7CisJCXZmcmVlKGJ1ZmZlcik7CiAJCXJldHVybiBFUlJfUFRSKC1FRkFVTFQpOwogCX0KIAkvKiBnb3QgdGhlIHN0cmluZywgbm93IHN0cmlwIGxpbmVmZWVkLiAqLwpAQCAtOTMwLDcgKzkzMSw3IEBACiAJCWRhc2RfcHJvZmlsZV9vZmYocHJvZik7CiAJfSBlbHNlCiAJCXJjID0gLUVJTlZBTDsKLQlrZnJlZShidWZmZXIpOworCXZmcmVlKGJ1ZmZlcik7CiAJcmV0dXJuIHJjOwogfQogCkBAIC0xMDQyLDcgKzEwNDMsNyBAQAogCQlkYXNkX2dsb2JhbF9wcm9maWxlX2xldmVsID0gREFTRF9QUk9GSUxFX09GRjsKIAl9IGVsc2UKIAkJcmMgPSAtRUlOVkFMOwotCWtmcmVlKGJ1ZmZlcik7CisJdmZyZWUoYnVmZmVyKTsKIAlyZXR1cm4gcmM7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Vja2QuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX2Vja2QuYwppbmRleCAzMGZiOTc5Li42ZTgzNWM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9lY2tkLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfZWNrZC5jCkBAIC0xNDYxLDYgKzE0NjEsMTUgQEAKIAkJCQkiUmVhZCBkZXZpY2UgY2hhcmFjdGVyaXN0aWMgZmFpbGVkLCByYz0lZCIsIHJjKTsKIAkJZ290byBvdXRfZXJyMzsKIAl9CisKKwlpZiAoKGRldmljZS0+ZmVhdHVyZXMgJiBEQVNEX0ZFQVRVUkVfVVNFUkFXKSAmJgorCSAgICAhKHByaXZhdGUtPnJkY19kYXRhLmZhY2lsaXRpZXMuUlRfaW5fTFIpKSB7CisJCWRldl9lcnIoJmRldmljZS0+Y2Rldi0+ZGV2LCAiVGhlIHN0b3JhZ2Ugc2VydmVyIGRvZXMgbm90ICIKKwkJCSJzdXBwb3J0IHJhdy10cmFjayBhY2Nlc3NcbiIpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2VycjM7CisJfQorCiAJLyogZmluZCB0aGUgdmFsaWQgY3lsaW5kZXIgc2l6ZSAqLwogCWlmIChwcml2YXRlLT5yZGNfZGF0YS5ub19jeWwgPT0gTFZfQ09NUEFUX0NZTCAmJgogCSAgICBwcml2YXRlLT5yZGNfZGF0YS5sb25nX25vX2N5bCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX3Byb2MuYyBiL2RyaXZlcnMvczM5MC9ibG9jay9kYXNkX3Byb2MuYwppbmRleCA2YzNjNTM2Li5lMTI5ODlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvYmxvY2svZGFzZF9wcm9jLmMKKysrIGIvZHJpdmVycy9zMzkwL2Jsb2NrL2Rhc2RfcHJvYy5jCkBAIC0zMTIsMTQgKzMxMiwxNCBAQAogCQlwcl9pbmZvKCJUaGUgc3RhdGlzdGljcyBoYXZlIGJlZW4gcmVzZXRcbiIpOwogCX0gZWxzZQogCQlnb3RvIG91dF9wYXJzZV9lcnJvcjsKLQlrZnJlZShidWZmZXIpOworCXZmcmVlKGJ1ZmZlcik7CiAJcmV0dXJuIHVzZXJfbGVuOwogb3V0X3BhcnNlX2Vycm9yOgogCXJjID0gLUVJTlZBTDsKIAlwcl93YXJuaW5nKCIlcyBpcyBub3QgYSBzdXBwb3J0ZWQgdmFsdWUgZm9yIC9wcm9jL2Rhc2Qvc3RhdGlzdGljc1xuIiwKIAkJc3RyKTsKIG91dF9lcnJvcjoKLQlrZnJlZShidWZmZXIpOworCXZmcmVlKGJ1ZmZlcik7CiAJcmV0dXJuIHJjOwogI2Vsc2UKIAlwcl93YXJuaW5nKCIvcHJvYy9kYXNkL3N0YXRpc3RpY3M6IGlzIG5vdCBhY3RpdmF0ZWQgaW4gdGhpcyBrZXJuZWxcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9hc3luYy5jIGIvZHJpdmVycy9zMzkwL2NoYXIvc2NscF9hc3luYy5jCmluZGV4IDdhZDMwZTcuLjVmOWY5MjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaGFyL3NjbHBfYXN5bmMuYworKysgYi9kcml2ZXJzL3MzOTAvY2hhci9zY2xwX2FzeW5jLmMKQEAgLTgyLDEyICs4Miw5IEBACiAJCQlyZXR1cm4gLUVGQVVMVDsKIAl9IGVsc2UgewogCQlsZW4gPSAqY291bnQ7Ci0JCXJjID0gY29weV9mcm9tX3VzZXIoYnVmLCBidWZmZXIsIHNpemVvZihidWYpKTsKLQkJaWYgKHJjICE9IDApCi0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJYnVmW3NpemVvZihidWYpIC0gMV0gPSAnXDAnOwotCQlpZiAoc3RyaWN0X3N0cnRvdWwoYnVmLCAwLCAmdmFsKSAhPSAwKQotCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJjID0ga3N0cnRvdWxfZnJvbV91c2VyKGJ1ZmZlciwgbGVuLCAwLCAmdmFsKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOwogCQlpZiAodmFsICE9IDAgJiYgdmFsICE9IDEpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJY2FsbGhvbWVfZW5hYmxlZCA9IHZhbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vcWRpby5oIGIvZHJpdmVycy9zMzkwL2Npby9xZGlvLmgKaW5kZXggN2JjNjQzZi4uZTVjOTY2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL2Npby9xZGlvLmgKKysrIGIvZHJpdmVycy9zMzkwL2Npby9xZGlvLmgKQEAgLTE0LDYgKzE0LDggQEAKICNpbmNsdWRlICJjaHNjLmgiCiAKICNkZWZpbmUgUURJT19CVVNZX0JJVF9QQVRJRU5DRQkJKDEwMCA8PCAxMikJLyogMTAwIG1pY3Jvc2Vjb25kcyAqLworI2RlZmluZSBRRElPX0JVU1lfQklUX1JFVFJZX0RFTEFZCTEwCQkvKiAxMCBtaWxsaXNlY29uZHMgKi8KKyNkZWZpbmUgUURJT19CVVNZX0JJVF9SRVRSSUVTCQkxMDAwCQkvKiA9IDEwcyByZXRyeSB0aW1lICovCiAjZGVmaW5lIFFESU9fSU5QVVRfVEhSRVNIT0xECQkoNTAwIDw8IDEyKQkvKiA1MDAgbWljcm9zZWNvbmRzICovCiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fZGVidWcuYyBiL2RyaXZlcnMvczM5MC9jaW8vcWRpb19kZWJ1Zy5jCmluZGV4IGY4YjAzYTYuLjBlNjE1Y2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vcWRpb19kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vcWRpb19kZWJ1Zy5jCkBAIC0xODgsMTkgKzE4OCwxMyBAQAogCXN0cnVjdCBxZGlvX2lycSAqaXJxX3B0ciA9IHNlcS0+cHJpdmF0ZTsKIAlzdHJ1Y3QgcWRpb19xICpxOwogCXVuc2lnbmVkIGxvbmcgdmFsOwotCWNoYXIgYnVmWzhdOwogCWludCByZXQsIGk7CiAKIAlpZiAoIWlycV9wdHIpCiAJCXJldHVybiAwOwotCWlmIChjb3VudCA+PSBzaXplb2YoYnVmKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKCZidWYsIHVidWYsIGNvdW50KSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JYnVmW2NvdW50XSA9IDA7CiAKLQlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKTsKLQlpZiAocmV0IDwgMCkKKwlyZXQgPSBrc3RydG91bF9mcm9tX3VzZXIodWJ1ZiwgY291bnQsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCiAJc3dpdGNoICh2YWwpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vcWRpb19tYWluLmMgYi9kcml2ZXJzL3MzOTAvY2lvL3FkaW9fbWFpbi5jCmluZGV4IGU1ODE2OWMuLjI4OGM5MTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vcWRpb19tYWluLmMKKysrIGIvZHJpdmVycy9zMzkwL2Npby9xZGlvX21haW4uYwpAQCAtMzEzLDcgKzMxMyw3IEBACiAJdW5zaWduZWQgbG9uZyBzY2hpZCA9ICooKHUzMiAqKSAmcS0+aXJxX3B0ci0+c2NoaWQpOwogCXVuc2lnbmVkIGludCBmYyA9IFFESU9fU0lHQV9XUklURTsKIAl1NjQgc3RhcnRfdGltZSA9IDA7Ci0JaW50IGNjOworCWludCByZXRyaWVzID0gMCwgY2M7CiAKIAlpZiAoaXNfcWVic20ocSkpIHsKIAkJc2NoaWQgPSBxLT5pcnFfcHRyLT5zY2hfdG9rZW47CkBAIC0zMjUsNiArMzI1LDcgQEAKIAkvKiBoaXBlcnNvY2tldCBidXN5IGNvbmRpdGlvbiAqLwogCWlmICh1bmxpa2VseSgqYnVzeV9iaXQpKSB7CiAJCVdBUk5fT04ocXVldWVfdHlwZShxKSAhPSBRRElPX0lRRElPX1FGTVQgfHwgY2MgIT0gMik7CisJCXJldHJpZXMrKzsKIAogCQlpZiAoIXN0YXJ0X3RpbWUpIHsKIAkJCXN0YXJ0X3RpbWUgPSBnZXRfY2xvY2soKTsKQEAgLTMzMyw2ICszMzQsMTEgQEAKIAkJaWYgKChnZXRfY2xvY2soKSAtIHN0YXJ0X3RpbWUpIDwgUURJT19CVVNZX0JJVF9QQVRJRU5DRSkKIAkJCWdvdG8gYWdhaW47CiAJfQorCWlmIChyZXRyaWVzKSB7CisJCURCRl9ERVZfRVZFTlQoREJGX1dBUk4sIHEtPmlycV9wdHIsCisJCQkgICAgICAiJTR4IGNjMiBCQjE6JTFkIiwgU0NIX05PKHEpLCBxLT5ucik7CisJCURCRl9ERVZfRVZFTlQoREJGX1dBUk4sIHEtPmlycV9wdHIsICJjb3VudDoldSIsIHJldHJpZXMpOworCX0KIAlyZXR1cm4gY2M7CiB9CiAKQEAgLTcyOCwxMyArNzM0LDE0IEBACiAKIHN0YXRpYyBpbnQgcWRpb19raWNrX291dGJvdW5kX3Eoc3RydWN0IHFkaW9fcSAqcSkKIHsKKwlpbnQgcmV0cmllcyA9IDAsIGNjOwogCXVuc2lnbmVkIGludCBidXN5X2JpdDsKLQlpbnQgY2M7CiAKIAlpZiAoIW5lZWRfc2lnYV9vdXQocSkpCiAJCXJldHVybiAwOwogCiAJREJGX0RFVl9FVkVOVChEQkZfSU5GTywgcS0+aXJxX3B0ciwgInNpZ2EtdzolMWQiLCBxLT5ucik7CityZXRyeToKIAlxcGVyZl9pbmMocSwgc2lnYV93cml0ZSk7CiAKIAljYyA9IHFkaW9fc2lnYV9vdXRwdXQocSwgJmJ1c3lfYml0KTsKQEAgLTc0Myw3ICs3NTAsMTEgQEAKIAkJYnJlYWs7CiAJY2FzZSAyOgogCQlpZiAoYnVzeV9iaXQpIHsKLQkJCURCRl9FUlJPUigiJTR4IGNjMiBSRVA6JTFkIiwgU0NIX05PKHEpLCBxLT5ucik7CisJCQl3aGlsZSAoKytyZXRyaWVzIDwgUURJT19CVVNZX0JJVF9SRVRSSUVTKSB7CisJCQkJbWRlbGF5KFFESU9fQlVTWV9CSVRfUkVUUllfREVMQVkpOworCQkJCWdvdG8gcmV0cnk7CisJCQl9CisJCQlEQkZfRVJST1IoIiU0eCBjYzIgQkJDOiUxZCIsIFNDSF9OTyhxKSwgcS0+bnIpOwogCQkJY2MgfD0gUURJT19FUlJPUl9TSUdBX0JVU1k7CiAJCX0gZWxzZQogCQkJREJGX0RFVl9FVkVOVChEQkZfSU5GTywgcS0+aXJxX3B0ciwgInNpZ2EtdyBjYzI6JTFkIiwgcS0+bnIpOwpAQCAtNzUzLDYgKzc2NCwxMCBAQAogCQlEQkZfRVJST1IoIiU0eCBTSUdBLVc6JTFkIiwgU0NIX05PKHEpLCBjYyk7CiAJCWJyZWFrOwogCX0KKwlpZiAocmV0cmllcykgeworCQlEQkZfRVJST1IoIiU0eCBjYzIgQkIyOiUxZCIsIFNDSF9OTyhxKSwgcS0+bnIpOworCQlEQkZfRVJST1IoImNvdW50OiV1IiwgcmV0cmllcyk7CisJfQogCXJldHVybiBjYzsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmEuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhLmgKaW5kZXggM2IwYWYxMS4uYTc5NmRlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmEuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYS5oCkBAIC0yNyw2ICsyNyw3IEBACiBzdHJ1Y3QgYmZhX3M7CiAKIHR5cGVkZWYgdm9pZCAoKmJmYV9pc3JfZnVuY190KSAoc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmlfbXNnX3MgKm0pOwordHlwZWRlZiB2b2lkICgqYmZhX2NiX2NiZm5fc3RhdHVzX3QpICh2b2lkICpjYmFyZywgYmZhX3N0YXR1c190IHN0YXR1cyk7CiAKIC8qCiAgKiBJbnRlcnJ1cHQgbWVzc2FnZSBoYW5kbGVycwpAQCAtMTIxLDYgKzEyMiw3IEBACiAjZGVmaW5lIGJmYV9jYl9xdWV1ZShfX2JmYSwgX19oY2JfcWUsIF9fY2JmbiwgX19jYmFyZykgZG8gewlcCiAJCShfX2hjYl9xZSktPmNiZm4gID0gKF9fY2Jmbik7ICAgICAgXAogCQkoX19oY2JfcWUpLT5jYmFyZyA9IChfX2NiYXJnKTsgICAgICBcCisJCShfX2hjYl9xZSktPnByZV9ybXYgPSBCRkFfRkFMU0U7CQlcCiAJCWxpc3RfYWRkX3RhaWwoJihfX2hjYl9xZSktPnFlLCAmKF9fYmZhKS0+Y29tcF9xKTsgICAgICBcCiAJfSB3aGlsZSAoMCkKIApAQCAtMTM1LDYgKzEzNywxMSBAQAogCQl9CQkJCQkJCVwKIAl9IHdoaWxlICgwKQogCisjZGVmaW5lIGJmYV9jYl9xdWV1ZV9zdGF0dXMoX19iZmEsIF9faGNiX3FlLCBfX3N0YXR1cykgZG8gewkJXAorCQkoX19oY2JfcWUpLT5md19zdGF0dXMgPSAoX19zdGF0dXMpOwkJCVwKKwkJbGlzdF9hZGRfdGFpbCgmKF9faGNiX3FlKS0+cWUsICYoX19iZmEpLT5jb21wX3EpOwlcCit9IHdoaWxlICgwKQorCiAjZGVmaW5lIGJmYV9jYl9xdWV1ZV9kb25lKF9faGNiX3FlKSBkbyB7CVwKIAkJKF9faGNiX3FlKS0+b25jZSA9IEJGQV9GQUxTRTsJXAogCX0gd2hpbGUgKDApCkBAIC0xNzcsNyArMTg0LDcgQEAKIHN0cnVjdCBiZmFfaHdpZl9zIHsKIAl2b2lkICgqaHdfcmVnaW5pdCkoc3RydWN0IGJmYV9zICpiZmEpOwogCXZvaWQgKCpod19yZXFxX2Fjaykoc3RydWN0IGJmYV9zICpiZmEsIGludCByZXFxKTsKLQl2b2lkICgqaHdfcnNwcV9hY2spKHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgcnNwcSk7CisJdm9pZCAoKmh3X3JzcHFfYWNrKShzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHJzcHEsIHUzMiBjaSk7CiAJdm9pZCAoKmh3X21zaXhfaW5pdCkoc3RydWN0IGJmYV9zICpiZmEsIGludCBudmVjcyk7CiAJdm9pZCAoKmh3X21zaXhfY3RybF9pbnN0YWxsKShzdHJ1Y3QgYmZhX3MgKmJmYSk7CiAJdm9pZCAoKmh3X21zaXhfcXVldWVfaW5zdGFsbCkoc3RydWN0IGJmYV9zICpiZmEpOwpAQCAtMjY4LDEwICsyNzUsOCBAQAogCSgoX19iZmEpLT5pb2NmYy5od2lmLmh3X21zaXhfcXVldWVfaW5zdGFsbChfX2JmYSkpCiAjZGVmaW5lIGJmYV9tc2l4X3VuaW5zdGFsbChfX2JmYSkJCQkJCVwKIAkoKF9fYmZhKS0+aW9jZmMuaHdpZi5od19tc2l4X3VuaW5zdGFsbChfX2JmYSkpCi0jZGVmaW5lIGJmYV9pc3JfcnNwcV9hY2soX19iZmEsIF9fcXVldWUpIGRvIHsJCQkJXAotCWlmICgoX19iZmEpLT5pb2NmYy5od2lmLmh3X3JzcHFfYWNrKQkJCQlcCi0JCShfX2JmYSktPmlvY2ZjLmh3aWYuaHdfcnNwcV9hY2soX19iZmEsIF9fcXVldWUpOwlcCi19IHdoaWxlICgwKQorI2RlZmluZSBiZmFfaXNyX3JzcHFfYWNrKF9fYmZhLCBfX3F1ZXVlLCBfX2NpKQkJCQlcCisJKChfX2JmYSktPmlvY2ZjLmh3aWYuaHdfcnNwcV9hY2soX19iZmEsIF9fcXVldWUsIF9fY2kpKQogI2RlZmluZSBiZmFfaXNyX3JlcXFfYWNrKF9fYmZhLCBfX3F1ZXVlKSBkbyB7CQkJCVwKIAlpZiAoKF9fYmZhKS0+aW9jZmMuaHdpZi5od19yZXFxX2FjaykJCQkJXAogCQkoX19iZmEpLT5pb2NmYy5od2lmLmh3X3JlcXFfYWNrKF9fYmZhLCBfX3F1ZXVlKTsJXApAQCAtMzExLDcgKzMxNiw3IEBACiB2b2lkIGJmYV9tc2l4X2xwdV9lcnIoc3RydWN0IGJmYV9zICpiZmEsIGludCB2ZWMpOwogCiB2b2lkIGJmYV9od2NiX3JlZ2luaXQoc3RydWN0IGJmYV9zICpiZmEpOwotdm9pZCBiZmFfaHdjYl9yc3BxX2FjayhzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHJzcHEpOwordm9pZCBiZmFfaHdjYl9yc3BxX2FjayhzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IHJzcHEsIHUzMiBjaSk7CiB2b2lkIGJmYV9od2NiX21zaXhfaW5pdChzdHJ1Y3QgYmZhX3MgKmJmYSwgaW50IG52ZWNzKTsKIHZvaWQgYmZhX2h3Y2JfbXNpeF9jdHJsX2luc3RhbGwoc3RydWN0IGJmYV9zICpiZmEpOwogdm9pZCBiZmFfaHdjYl9tc2l4X3F1ZXVlX2luc3RhbGwoc3RydWN0IGJmYV9zICpiZmEpOwpAQCAtMzI0LDcgKzMyOSw4IEBACiB2b2lkIGJmYV9od2N0X3JlZ2luaXQoc3RydWN0IGJmYV9zICpiZmEpOwogdm9pZCBiZmFfaHdjdDJfcmVnaW5pdChzdHJ1Y3QgYmZhX3MgKmJmYSk7CiB2b2lkIGJmYV9od2N0X3JlcXFfYWNrKHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgcnNwcSk7Ci12b2lkIGJmYV9od2N0X3JzcHFfYWNrKHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgcnNwcSk7Cit2b2lkIGJmYV9od2N0X3JzcHFfYWNrKHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgcnNwcSwgdTMyIGNpKTsKK3ZvaWQgYmZhX2h3Y3QyX3JzcHFfYWNrKHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgcnNwcSwgdTMyIGNpKTsKIHZvaWQgYmZhX2h3Y3RfbXNpeF9pbml0KHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgbnZlY3MpOwogdm9pZCBiZmFfaHdjdF9tc2l4X2N0cmxfaW5zdGFsbChzdHJ1Y3QgYmZhX3MgKmJmYSk7CiB2b2lkIGJmYV9od2N0X21zaXhfcXVldWVfaW5zdGFsbChzdHJ1Y3QgYmZhX3MgKmJmYSk7CkBAIC0zNzYsNiArMzgyLDIyIEBACiAjZGVmaW5lIGJmYV9nZXRfZndfY2xvY2tfcmVzKF9fYmZhKQkJXAogCSgoX19iZmEpLT5pb2NmYy5jZmdyc3AtPmZ3Y2ZnLmZ3X3RpY2tfcmVzKQogCisvKgorICogbHVuIG1hc2sgbWFjcm9zIHJldHVybiBOVUxMIHdoZW4gbWluIGNmZyBpcyBlbmFibGVkIGFuZCB0aGVyZSBpcworICogbm8gbWVtb3J5IGFsbG9jYXRlZCBmb3IgbHVubWFzay4KKyAqLworI2RlZmluZSBiZmFfZ2V0X2x1bl9tYXNrKF9fYmZhKQkJCQkJXAorCSgoJihfX2JmYSktPm1vZHVsZXMuZGNvbmZfbW9kKS0+bWluX2NmZykgPyBOVUxMIDoJXAorCSAoJihCRkFfRENPTkZfTU9EKF9fYmZhKS0+ZGNvbmYtPmx1bl9tYXNrKSkKKworI2RlZmluZSBiZmFfZ2V0X2x1bl9tYXNrX2xpc3QoX2JmYSkJCQkJXAorCSgoJihfYmZhKS0+bW9kdWxlcy5kY29uZl9tb2QpLT5taW5fY2ZnKSA/IE5VTEwgOglcCisJIChiZmFfZ2V0X2x1bl9tYXNrKF9iZmEpLT5sdW5fbGlzdCkKKworI2RlZmluZSBiZmFfZ2V0X2x1bl9tYXNrX3N0YXR1cyhfYmZhKQkJCQlcCisJKCgoJihfYmZhKS0+bW9kdWxlcy5kY29uZl9tb2QpLT5taW5fY2ZnKQkJXAorCSA/IEJGQV9MVU5NQVNLX01JTkNGRyA6ICgoYmZhX2dldF9sdW5fbWFzayhfYmZhKSktPnN0YXR1cykpCisKIHZvaWQgYmZhX2dldF9wY2lpZHMoc3RydWN0IGJmYV9wY2lpZF9zICoqcGNpaWRzLCBpbnQgKm5wY2lpZHMpOwogdm9pZCBiZmFfY2ZnX2dldF9kZWZhdWx0KHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZyk7CiB2b2lkIGJmYV9jZmdfZ2V0X21pbihzdHJ1Y3QgYmZhX2lvY2ZjX2NmZ19zICpjZmcpOwpAQCAtNDA2LDcgKzQyOCwyMiBAQAogCiB2b2lkIGJmYV9pb2NmY19lbmFibGUoc3RydWN0IGJmYV9zICpiZmEpOwogdm9pZCBiZmFfaW9jZmNfZGlzYWJsZShzdHJ1Y3QgYmZhX3MgKmJmYSk7Cit2b2lkIGJmYV9pb2NmY19jYl9kY29uZl9tb2Rpbml0KHN0cnVjdCBiZmFfcyAqYmZhLCBiZmFfc3RhdHVzX3Qgc3RhdHVzKTsKICNkZWZpbmUgYmZhX3RpbWVyX3N0YXJ0KF9iZmEsIF90aW1lciwgX3RpbWVyY2IsIF9hcmcsIF90aW1lb3V0KQkJXAogCWJmYV90aW1lcl9iZWdpbigmKF9iZmEpLT50aW1lcl9tb2QsIF90aW1lciwgX3RpbWVyY2IsIF9hcmcsIF90aW1lb3V0KQogCitzdHJ1Y3QgYmZhX2NiX3BlbmRpbmdfcV9zIHsKKwlzdHJ1Y3QgYmZhX2NiX3FlX3MJaGNiX3FlOworCXZvaWQJCQkqZGF0YTsgIC8qIERyaXZlciBidWZmZXIgKi8KK307CisKKy8qIENvbW1vbiBtYWNyb3MgdG8gb3BlcmF0ZSBvbiBwZW5kaW5nIHN0YXRzL2F0dHIgYXBpcyAqLworI2RlZmluZSBiZmFfcGVuZGluZ19xX2luaXQoX19xZSwgX19jYmZuLCBfX2NiYXJnLCBfX2RhdGEpIGRvIHsJXAorCWJmYV9xX3FlX2luaXQoJigoX19xZSktPmhjYl9xZS5xZSkpOwkJCVwKKwkoX19xZSktPmhjYl9xZS5jYmZuID0gKF9fY2Jmbik7CQkJCVwKKwkoX19xZSktPmhjYl9xZS5jYmFyZyA9IChfX2NiYXJnKTsJCQlcCisJKF9fcWUpLT5oY2JfcWUucHJlX3JtdiA9IEJGQV9UUlVFOwkJCVwKKwkoX19xZSktPmRhdGEgPSAoX19kYXRhKTsJCQkJXAorfSB3aGlsZSAoMCkKKwogI2VuZGlmIC8qIF9fQkZBX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfY29yZS5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfY29yZS5jCmluZGV4IGMzOGU1ODkuLjRiZDU0NmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2NvcmUuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9jb3JlLmMKQEAgLTMzLDYgKzMzLDcgQEAKIAkmaGFsX21vZF91ZiwKIAkmaGFsX21vZF9ycG9ydCwKIAkmaGFsX21vZF9mY3AsCisJJmhhbF9tb2RfZGNvbmYsCiAJTlVMTAogfTsKIApAQCAtMjM3LDggKzIzOCw2IEBACiAJdTMyCXBpLCBjaTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICp3YWl0cTsKIAotCWJmYV9pc3JfcnNwcV9hY2soYmZhLCBxaWQpOwotCiAJY2kgPSBiZmFfcnNwcV9jaShiZmEsIHFpZCk7CiAJcGkgPSBiZmFfcnNwcV9waShiZmEsIHFpZCk7CiAKQEAgLTI1MSwxMSArMjUwLDkgQEAKIAl9CiAKIAkvKgotCSAqIHVwZGF0ZSBDSQorCSAqIGFja25vd2xlZGdlIFJNRSBjb21wbGV0aW9ucyBhbmQgdXBkYXRlIENJCiAJICovCi0JYmZhX3JzcHFfY2koYmZhLCBxaWQpID0gcGk7Ci0Jd3JpdGVsKHBpLCBiZmEtPmlvY2ZjLmJmYV9yZWdzLnJtZV9xX2NpW3FpZF0pOwotCW1taW93YigpOworCWJmYV9pc3JfcnNwcV9hY2soYmZhLCBxaWQsIGNpKTsKIAogCS8qCiAJICogUmVzdW1lIGFueSBwZW5kaW5nIHJlcXVlc3RzIGluIHRoZSBjb3JyZXNwb25kaW5nIHJlcXEuCkBAIC0zMjUsMjMgKzMyMiwxOSBAQAogCWludCBxdWV1ZTsKIAogCWludHIgPSByZWFkbChiZmEtPmlvY2ZjLmJmYV9yZWdzLmludHJfc3RhdHVzKTsKLQlpZiAoIWludHIpCi0JCXJldHVybiBCRkFfRkFMU0U7CiAKIAlxaW50ciA9IGludHIgJiAoX19IRk5fSU5UX1JNRV9NQVNLIHwgX19IRk5fSU5UX0NQRV9NQVNLKTsKIAlpZiAocWludHIpCiAJCXdyaXRlbChxaW50ciwgYmZhLT5pb2NmYy5iZmFfcmVncy5pbnRyX3N0YXR1cyk7CiAKIAkvKgotCSAqIFJNRSBjb21wbGV0aW9uIHF1ZXVlIGludGVycnVwdAorCSAqIFVuY29uZGl0aW9uYWwgUk1FIGNvbXBsZXRpb24gcXVldWUgaW50ZXJydXB0CiAJICovCi0JcWludHIgPSBpbnRyICYgX19IRk5fSU5UX1JNRV9NQVNLOwotCWlmIChxaW50ciAmJiBiZmEtPnF1ZXVlX3Byb2Nlc3MpIHsKKwlpZiAoYmZhLT5xdWV1ZV9wcm9jZXNzKSB7CiAJCWZvciAocXVldWUgPSAwOyBxdWV1ZSA8IEJGSV9JT0NfTUFYX0NRUzsgcXVldWUrKykKIAkJCWJmYV9pc3JfcnNwcShiZmEsIHF1ZXVlKTsKIAl9CiAKLQlpbnRyICY9IH5xaW50cjsKIAlpZiAoIWludHIpCiAJCXJldHVybiBCRkFfVFJVRTsKIApAQCAtNDMyLDcgKzQyNSw4IEBACiAJCQkJICAgX19IRk5fSU5UX01CT1hfTFBVMV9DVDIpOwogCQlpbnRyICAgICY9IF9fSEZOX0lOVF9FUlJfTUFTS19DVDI7CiAJfSBlbHNlIHsKLQkJaGFsdF9pc3IgPSBpbnRyICYgX19IRk5fSU5UX0xMX0hBTFQ7CisJCWhhbHRfaXNyID0gYmZhX2FzaWNfaWRfY3QoYmZhLT5pb2MucGNpZGV2LmRldmljZV9pZCkgPworCQkJCQkgIChpbnRyICYgX19IRk5fSU5UX0xMX0hBTFQpIDogMDsKIAkJcHNzX2lzciAgPSBpbnRyICYgX19IRk5fSU5UX0VSUl9QU1M7CiAJCWxwdV9pc3IgID0gaW50ciAmIChfX0hGTl9JTlRfTUJPWF9MUFUwIHwgX19IRk5fSU5UX01CT1hfTFBVMSk7CiAJCWludHIgICAgJj0gX19IRk5fSU5UX0VSUl9NQVNLOwpAQCAtNTc4LDcgKzU3Miw3IEBACiAJfSBlbHNlIHsKIAkJaW9jZmMtPmh3aWYuaHdfcmVnaW5pdCA9IGJmYV9od2NiX3JlZ2luaXQ7CiAJCWlvY2ZjLT5od2lmLmh3X3JlcXFfYWNrID0gTlVMTDsKLQkJaW9jZmMtPmh3aWYuaHdfcnNwcV9hY2sgPSBOVUxMOworCQlpb2NmYy0+aHdpZi5od19yc3BxX2FjayA9IGJmYV9od2NiX3JzcHFfYWNrOwogCQlpb2NmYy0+aHdpZi5od19tc2l4X2luaXQgPSBiZmFfaHdjYl9tc2l4X2luaXQ7CiAJCWlvY2ZjLT5od2lmLmh3X21zaXhfY3RybF9pbnN0YWxsID0gYmZhX2h3Y2JfbXNpeF9jdHJsX2luc3RhbGw7CiAJCWlvY2ZjLT5od2lmLmh3X21zaXhfcXVldWVfaW5zdGFsbCA9IGJmYV9od2NiX21zaXhfcXVldWVfaW5zdGFsbDsKQEAgLTU5NSw3ICs1ODksNyBAQAogCWlmIChiZmFfYXNpY19pZF9jdDIoYmZhX2lvY19kZXZpZCgmYmZhLT5pb2MpKSkgewogCQlpb2NmYy0+aHdpZi5od19yZWdpbml0ID0gYmZhX2h3Y3QyX3JlZ2luaXQ7CiAJCWlvY2ZjLT5od2lmLmh3X2lzcl9tb2RlX3NldCA9IE5VTEw7Ci0JCWlvY2ZjLT5od2lmLmh3X3JzcHFfYWNrID0gTlVMTDsKKwkJaW9jZmMtPmh3aWYuaHdfcnNwcV9hY2sgPSBiZmFfaHdjdDJfcnNwcV9hY2s7CiAJfQogCiAJaW9jZmMtPmh3aWYuaHdfcmVnaW5pdChiZmEpOwpAQCAtNjg1LDcgKzY3OSw3IEBACiAKIAliZmEtPnF1ZXVlX3Byb2Nlc3MgPSBCRkFfVFJVRTsKIAlmb3IgKGkgPSAwOyBpIDwgQkZJX0lPQ19NQVhfQ1FTOyBpKyspCi0JCWJmYV9pc3JfcnNwcV9hY2soYmZhLCBpKTsKKwkJYmZhX2lzcl9yc3BxX2FjayhiZmEsIGksIGJmYV9yc3BxX2NpKGJmYSwgaSkpOwogCiAJZm9yIChpID0gMDsgaGFsX21vZHNbaV07IGkrKykKIAkJaGFsX21vZHNbaV0tPnN0YXJ0KGJmYSk7CkBAIC03MDksNyArNzAzLDcgQEAKIAlzdHJ1Y3QgYmZhX3MJKmJmYSA9IGJmYV9hcmc7CiAKIAlpZiAoY29tcGxldGUpIHsKLQkJaWYgKGJmYS0+aW9jZmMuY2ZnZG9uZSkKKwkJaWYgKGJmYS0+aW9jZmMuY2ZnZG9uZSAmJiBCRkFfRENPTkZfTU9EKGJmYSktPmZsYXNoZG9uZSkKIAkJCWJmYV9jYl9pbml0KGJmYS0+YmZhZCwgQkZBX1NUQVRVU19PSyk7CiAJCWVsc2UKIAkJCWJmYV9jYl9pbml0KGJmYS0+YmZhZCwgQkZBX1NUQVRVU19GQUlMRUQpOwpAQCAtODIyLDkgKzgxNiwxMSBAQAogCSAqLwogCWJmYV9mY3BvcnRfaW5pdChiZmEpOwogCi0JaWYgKGlvY2ZjLT5hY3Rpb24gPT0gQkZBX0lPQ0ZDX0FDVF9JTklUKQotCQliZmFfY2JfcXVldWUoYmZhLCAmaW9jZmMtPmluaXRfaGNiX3FlLCBiZmFfaW9jZmNfaW5pdF9jYiwgYmZhKTsKLQllbHNlIHsKKwlpZiAoaW9jZmMtPmFjdGlvbiA9PSBCRkFfSU9DRkNfQUNUX0lOSVQpIHsKKwkJaWYgKEJGQV9EQ09ORl9NT0QoYmZhKS0+Zmxhc2hkb25lID09IEJGQV9UUlVFKQorCQkJYmZhX2NiX3F1ZXVlKGJmYSwgJmlvY2ZjLT5pbml0X2hjYl9xZSwKKwkJCQliZmFfaW9jZmNfaW5pdF9jYiwgYmZhKTsKKwl9IGVsc2UgewogCQlpZiAoYmZhLT5pb2NmYy5hY3Rpb24gPT0gQkZBX0lPQ0ZDX0FDVF9FTkFCTEUpCiAJCQliZmFfY2JfcXVldWUoYmZhLCAmYmZhLT5pb2NmYy5lbl9oY2JfcWUsCiAJCQkJCWJmYV9pb2NmY19lbmFibGVfY2IsIGJmYSk7CkBAIC0xMDQ1LDYgKzEwNDEsNyBAQAogCX0KIAogCWJmYV9pb2NmY19zZW5kX2NmZyhiZmEpOworCWJmYV9kY29uZl9tb2Rpbml0KGJmYSk7CiB9CiAKIC8qCkBAIC0xMjA3LDcgKzEyMDQsOSBAQAogCWJmYS0+aW9jZmMuYWN0aW9uID0gQkZBX0lPQ0ZDX0FDVF9TVE9QOwogCiAJYmZhLT5xdWV1ZV9wcm9jZXNzID0gQkZBX0ZBTFNFOwotCWJmYV9pb2NfZGlzYWJsZSgmYmZhLT5pb2MpOworCWJmYV9kY29uZl9tb2RleGl0KGJmYSk7CisJaWYgKEJGQV9EQ09ORl9NT0QoYmZhKS0+Zmxhc2hkb25lID09IEJGQV9UUlVFKQorCQliZmFfaW9jX2Rpc2FibGUoJmJmYS0+aW9jKTsKIH0KIAogdm9pZApAQCAtMTU0MCwxMCArMTUzOSwxNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQJCSpxZTsKIAlzdHJ1Y3QgbGlzdF9oZWFkCQkqcWVuOwogCXN0cnVjdCBiZmFfY2JfcWVfcwkqaGNiX3FlOworCWJmYV9jYl9jYmZuX3N0YXR1c190CWNiZm47CiAKIAlsaXN0X2Zvcl9lYWNoX3NhZmUocWUsIHFlbiwgY29tcF9xKSB7CiAJCWhjYl9xZSA9IChzdHJ1Y3QgYmZhX2NiX3FlX3MgKikgcWU7Ci0JCWhjYl9xZS0+Y2JmbihoY2JfcWUtPmNiYXJnLCBCRkFfVFJVRSk7CisJCWlmIChoY2JfcWUtPnByZV9ybXYpIHsKKwkJCS8qIHFlIGlzIGludmFsaWQgYWZ0ZXIgcmV0dXJuLCBkZXF1ZXVlIGJlZm9yZSBjYmZuKCkgKi8KKwkJCWxpc3RfZGVsKHFlKTsKKwkJCWNiZm4gPSAoYmZhX2NiX2NiZm5fc3RhdHVzX3QpKGhjYl9xZS0+Y2Jmbik7CisJCQljYmZuKGhjYl9xZS0+Y2JhcmcsIGhjYl9xZS0+Zndfc3RhdHVzKTsKKwkJfSBlbHNlCisJCQloY2JfcWUtPmNiZm4oaGNiX3FlLT5jYmFyZywgQkZBX1RSVUUpOwogCX0KIH0KIApAQCAtMTU1NiwxMCArMTU2MiwyMCBAQAogCXdoaWxlICghbGlzdF9lbXB0eShjb21wX3EpKSB7CiAJCWJmYV9xX2RlcShjb21wX3EsICZxZSk7CiAJCWhjYl9xZSA9IChzdHJ1Y3QgYmZhX2NiX3FlX3MgKikgcWU7CisJCVdBUk5fT04oaGNiX3FlLT5wcmVfcm12KTsKIAkJaGNiX3FlLT5jYmZuKGhjYl9xZS0+Y2JhcmcsIEJGQV9GQUxTRSk7CiAJfQogfQogCit2b2lkCitiZmFfaW9jZmNfY2JfZGNvbmZfbW9kaW5pdChzdHJ1Y3QgYmZhX3MgKmJmYSwgYmZhX3N0YXR1c190IHN0YXR1cykKK3sKKwlpZiAoYmZhLT5pb2NmYy5hY3Rpb24gPT0gQkZBX0lPQ0ZDX0FDVF9JTklUKSB7CisJCWlmIChiZmEtPmlvY2ZjLmNmZ2RvbmUgPT0gQkZBX1RSVUUpCisJCQliZmFfY2JfcXVldWUoYmZhLCAmYmZhLT5pb2NmYy5pbml0X2hjYl9xZSwKKwkJCQliZmFfaW9jZmNfaW5pdF9jYiwgYmZhKTsKKwl9Cit9CiAKIC8qCiAgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgUENJIHZlbmRvci9kZXZpY2UgaWQgbGlzdHMgc3VwcG9ydGVkIGJ5IHRoaXMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2RlZnMuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2RlZnMuaAppbmRleCBlZDhkMzFiLi43YjNkMjM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9kZWZzLmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZGVmcy5oCkBAIC0xNDQsNiArMTQ0LDcgQEAKIAlCRkFfU1RBVFVTX0lOVkxEX0RGU1oJPSAyNCwJLyogIEludmFsaWQgTWF4IGRhdGEgZmllbGQgc2l6ZSAqLwogCUJGQV9TVEFUVVNfQ01EX05PVFNVUFAgID0gMjYsICAgLyogIENvbW1hbmQvQVBJIG5vdCBzdXBwb3J0ZWQgKi8KIAlCRkFfU1RBVFVTX0ZBQlJJQ19SSlQJPSAyOSwJLyogIFJlamVjdCBmcm9tIGF0dGFjaGVkIGZhYnJpYyAqLworCUJGQV9TVEFUVVNfVU5LTk9XTl9WV1dOID0gMzAsCS8qICBWUE9SVCBQV1dOIG5vdCBmb3VuZCAqLwogCUJGQV9TVEFUVVNfUE9SVF9PRkZMSU5FID0gMzQsCS8qICBQb3J0IGlzIG5vdCBvbmxpbmUgKi8KIAlCRkFfU1RBVFVTX1ZQT1JUX1dXTl9CUAk9IDQ2LAkvKiAgV1dOIGlzIHNhbWUgYXMgYmFzZSBwb3J0J3MgV1dOICovCiAJQkZBX1NUQVRVU19QT1JUX05PVF9ESVNBQkxFRCA9IDQ3LCAvKiBQb3J0IG5vdCBkaXNhYmxlZCBkaXNhYmxlIHBvcnQgKi8KQEAgLTE2NCw2ICsxNjUsOCBAQAogCUJGQV9TVEFUVVNfSU5WQUxJRF9NQUMgID0gMTM0LCAvKiAgSW52YWxpZCBNQUMgYWRkcmVzcyAqLwogCUJGQV9TVEFUVVNfUEJDCQk9IDE1NCwgLyogIE9wZXJhdGlvbiBub3QgYWxsb3dlZCBmb3IgcHJlLWJvb3QKIAkJCQkJKiAgY29uZmlndXJhdGlvbiAqLworCUJGQV9TVEFUVVNfQkFEX0ZXQ0ZHID0gMTU2LAkvKiBCYWQgZmlybXdhcmUgY29uZmlndXJhdGlvbiAqLworCUJGQV9TVEFUVVNfSU5WQUxJRF9WRU5ET1IgPSAxNTgsIC8qIEludmFsaWQgc3dpdGNoIHZlbmRvciAqLwogCUJGQV9TVEFUVVNfU0ZQX05PVF9SRUFEWSA9IDE1OSwJLyogU0ZQIGluZm8gaXMgbm90IHJlYWR5LiBSZXRyeSAqLwogCUJGQV9TVEFUVVNfVFJVTktfRU5BQkxFRCA9IDE2NCwgLyogVHJ1bmsgaXMgYWxyZWFkeSBlbmFibGVkIG9uCiAJCQkJCSAqIHRoaXMgYWRhcHRlciAqLwpAQCAtMTcyLDExICsxNzUsMTUgQEAKIAlCRkFfU1RBVFVTX0lPUFJPRklMRV9PRkYgPSAxNzUsIC8qIElPIHByb2ZpbGUgT0ZGICovCiAJQkZBX1NUQVRVU19QSFlfTk9UX1BSRVNFTlQgPSAxODMsIC8qIFBIWSBtb2R1bGUgbm90IHByZXNlbnQgKi8KIAlCRkFfU1RBVFVTX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCA9IDE5MiwJLyogRmVhdHVyZSBub3Qgc3VwcG9ydGVkICovCisJQkZBX1NUQVRVU19FTlRSWV9FWElTVFMgPSAxOTMsCS8qIEVudHJ5IGFscmVhZHkgZXhpc3RzICovCisJQkZBX1NUQVRVU19FTlRSWV9OT1RfRVhJU1RTID0gMTk0LCAvKiBFbnRyeSBkb2VzIG5vdCBleGlzdCAqLworCUJGQV9TVEFUVVNfTk9fQ0hBTkdFID0gMTk1LAkvKiBGZWF0dXJlIGFscmVhZHkgaW4gdGhhdCBzdGF0ZSAqLwogCUJGQV9TVEFUVVNfRkFBX0VOQUJMRUQgPSAxOTcsCS8qIEZBQSBpcyBhbHJlYWR5IGVuYWJsZWQgKi8KIAlCRkFfU1RBVFVTX0ZBQV9ESVNBQkxFRCA9IDE5OCwJLyogRkFBIGlzIGFscmVhZHkgZGlzYWJsZWQgKi8KIAlCRkFfU1RBVFVTX0ZBQV9BQ1FVSVJFRCA9IDE5OSwJLyogRkFBIGlzIGFscmVhZHkgYWNxdWlyZWQgKi8KIAlCRkFfU1RBVFVTX0ZBQV9BQ1FfQUREUiA9IDIwMCwJLyogQWNxdWlyaW5nIGFkZHIgKi8KIAlCRkFfU1RBVFVTX0VSUk9SX1RSVU5LX0VOQUJMRUQgPSAyMDMsCS8qIFRydW5rIGVuYWJsZWQgb24gYWRhcHRlciAqLworCUJGQV9TVEFUVVNfTUFYX0VOVFJZX1JFQUNIRUQgPSAyMTIsCS8qIE1BWCBlbnRyeSByZWFjaGVkICovCiAJQkZBX1NUQVRVU19NQVhfVkFMCQkvKiBVbmtub3duIGVycm9yIGNvZGUgKi8KIH07CiAjZGVmaW5lIGJmYV9zdGF0dXNfdCBlbnVtIGJmYV9zdGF0dXMKQEAgLTM1OSw2ICszNjYsMTM5IEBACiB9OwogCiAvKgorICoJCQlBRU4gcmVsYXRlZCBkZWZpbml0aW9ucworICovCitlbnVtIGJmYV9hZW5fY2F0ZWdvcnkgeworCUJGQV9BRU5fQ0FUX0FEQVBURVIJPSAxLAorCUJGQV9BRU5fQ0FUX1BPUlQJPSAyLAorCUJGQV9BRU5fQ0FUX0xQT1JUCT0gMywKKwlCRkFfQUVOX0NBVF9SUE9SVAk9IDQsCisJQkZBX0FFTl9DQVRfSVROSU0JPSA1LAorCUJGQV9BRU5fQ0FUX0FVRElUCT0gOCwKKwlCRkFfQUVOX0NBVF9JT0MJCT0gOSwKK307CisKKy8qIEJGQSBhZGFwdGVyIGxldmVsIGV2ZW50cyAqLworZW51bSBiZmFfYWRhcHRlcl9hZW5fZXZlbnQgeworCUJGQV9BREFQVEVSX0FFTl9BREQJPSAxLAkvKiBOZXcgQWRhcHRlciBmb3VuZCBldmVudCAqLworCUJGQV9BREFQVEVSX0FFTl9SRU1PVkUJPSAyLAkvKiBBZGFwdGVyIHJlbW92ZWQgZXZlbnQgKi8KK307CisKK3N0cnVjdCBiZmFfYWRhcHRlcl9hZW5fZGF0YV9zIHsKKwljaGFyCXNlcmlhbF9udW1bQkZBX0FEQVBURVJfU0VSSUFMX05VTV9MRU5dOworCXUzMglucG9ydHM7IC8qIE51bWJlciBvZiBOUG9ydHMgKi8KKwl3d25fdAlwd3duOyAgIC8qIFdXTiBvZiBvbmUgb2YgaXRzIHBoeXNpY2FsIHBvcnQgKi8KK307CisKKy8qIEJGQSBwaHlzaWNhbCBwb3J0IExldmVsIGV2ZW50cyAqLworZW51bSBiZmFfcG9ydF9hZW5fZXZlbnQgeworCUJGQV9QT1JUX0FFTl9PTkxJTkUJPSAxLCAgICAvKiBQaHlzaWNhbCBQb3J0IG9ubGluZSBldmVudCAqLworCUJGQV9QT1JUX0FFTl9PRkZMSU5FCT0gMiwgICAgLyogUGh5c2ljYWwgUG9ydCBvZmZsaW5lIGV2ZW50ICovCisJQkZBX1BPUlRfQUVOX1JMSVIJPSAzLCAgICAvKiBSTElSIGV2ZW50LCBub3Qgc3VwcG9ydGVkICovCisJQkZBX1BPUlRfQUVOX1NGUF9JTlNFUlQJPSA0LCAgICAvKiBTRlAgaW5zZXJ0ZWQgZXZlbnQgKi8KKwlCRkFfUE9SVF9BRU5fU0ZQX1JFTU9WRQk9IDUsICAgIC8qIFNGUCByZW1vdmVkIGV2ZW50ICovCisJQkZBX1BPUlRfQUVOX1NGUF9QT00JPSA2LCAgICAvKiBTRlAgUE9NIGV2ZW50ICovCisJQkZBX1BPUlRfQUVOX0VOQUJMRQk9IDcsICAgIC8qIFBoeXNpY2FsIFBvcnQgZW5hYmxlIGV2ZW50ICovCisJQkZBX1BPUlRfQUVOX0RJU0FCTEUJPSA4LCAgICAvKiBQaHlzaWNhbCBQb3J0IGRpc2FibGUgZXZlbnQgKi8KKwlCRkFfUE9SVF9BRU5fQVVUSF9PTgk9IDksICAgIC8qIFBoeXNpY2FsIFBvcnQgYXV0aCBzdWNjZXNzIGV2ZW50ICovCisJQkZBX1BPUlRfQUVOX0FVVEhfT0ZGCT0gMTAsICAgLyogUGh5c2ljYWwgUG9ydCBhdXRoIGZhaWwgZXZlbnQgKi8KKwlCRkFfUE9SVF9BRU5fRElTQ09OTkVDVAk9IDExLCAgIC8qIFBoeXNpY2FsIFBvcnQgZGlzY29ubmVjdCBldmVudCAqLworCUJGQV9QT1JUX0FFTl9RT1NfTkVHCT0gMTIsICAgLyogQmFzZSBQb3J0IFFPUyBuZWdvdGlhdGlvbiBldmVudCAqLworCUJGQV9QT1JUX0FFTl9GQUJSSUNfTkFNRV9DSEFOR0UJPSAxMywgLyogRmFicmljIE5hbWUvV1dOIGNoYW5nZSAqLworCUJGQV9QT1JUX0FFTl9TRlBfQUNDRVNTX0VSUk9SCT0gMTQsIC8qIFNGUCByZWFkIGVycm9yIGV2ZW50ICovCisJQkZBX1BPUlRfQUVOX1NGUF9VTlNVUFBPUlQJPSAxNSwgLyogVW5zdXBwb3J0ZWQgU0ZQIGV2ZW50ICovCit9OworCitlbnVtIGJmYV9wb3J0X2Flbl9zZnBfcG9tIHsKKwlCRkFfUE9SVF9BRU5fU0ZQX1BPTV9HUkVFTiA9IDEsIC8qIE5vcm1hbCAqLworCUJGQV9QT1JUX0FFTl9TRlBfUE9NX0FNQkVSID0gMiwgLyogV2FybmluZyAqLworCUJGQV9QT1JUX0FFTl9TRlBfUE9NX1JFRCAgID0gMywgLyogQ3JpdGljYWwgKi8KKwlCRkFfUE9SVF9BRU5fU0ZQX1BPTV9NQVggICA9IEJGQV9QT1JUX0FFTl9TRlBfUE9NX1JFRAorfTsKKworc3RydWN0IGJmYV9wb3J0X2Flbl9kYXRhX3MgeworCXd3bl90CQlwd3duOwkJLyogV1dOIG9mIHRoZSBwaHlzaWNhbCBwb3J0ICovCisJd3duX3QJCWZ3d247CQkvKiBXV04gb2YgdGhlIGZhYnJpYyBwb3J0ICovCisJdTMyCQlwaHlfcG9ydF9udW07CS8qIEZvciBTRlAgcmVsYXRlZCBldmVudHMgKi8KKwl1MTYJCWlvY190eXBlOworCXUxNgkJbGV2ZWw7CQkvKiBPbmx5IHRyYW5zaXRpb25zIHdpbGwgYmUgaW5mb3JtZWQgKi8KKwltYWNfdAkJbWFjOwkJLyogTUFDIGFkZHJlc3Mgb2YgdGhlIGV0aGVybmV0IHBvcnQgKi8KKwl1MTYJCXJzdmQ7Cit9OworCisvKiBCRkEgQUVOIGxvZ2ljYWwgcG9ydCBldmVudHMgKi8KK2VudW0gYmZhX2xwb3J0X2Flbl9ldmVudCB7CisJQkZBX0xQT1JUX0FFTl9ORVcJPSAxLAkJLyogTFBvcnQgY3JlYXRlZCBldmVudCAqLworCUJGQV9MUE9SVF9BRU5fREVMRVRFCT0gMiwJCS8qIExQb3J0IGRlbGV0ZWQgZXZlbnQgKi8KKwlCRkFfTFBPUlRfQUVOX09OTElORQk9IDMsCQkvKiBMUG9ydCBvbmxpbmUgZXZlbnQgKi8KKwlCRkFfTFBPUlRfQUVOX09GRkxJTkUJPSA0LAkJLyogTFBvcnQgb2ZmbGluZSBldmVudCAqLworCUJGQV9MUE9SVF9BRU5fRElTQ09OTkVDVCA9IDUsCQkvKiBMUG9ydCBkaXNjb25uZWN0IGV2ZW50ICovCisJQkZBX0xQT1JUX0FFTl9ORVdfUFJPUAk9IDYsCQkvKiBWUG9ydCBjcmVhdGVkIGV2ZW50ICovCisJQkZBX0xQT1JUX0FFTl9ERUxFVEVfUFJPUCA9IDcsCQkvKiBWUG9ydCBkZWxldGVkIGV2ZW50ICovCisJQkZBX0xQT1JUX0FFTl9ORVdfU1RBTkRBUkQgPSA4LAkJLyogVlBvcnQgY3JlYXRlZCBldmVudCAqLworCUJGQV9MUE9SVF9BRU5fREVMRVRFX1NUQU5EQVJEID0gOSwJLyogVlBvcnQgZGVsZXRlZCBldmVudCAqLworCUJGQV9MUE9SVF9BRU5fTlBJVl9EVVBfV1dOID0gMTAsCS8qIFZQb3J0IHdpdGggZHVwbGljYXRlIFdXTiAqLworCUJGQV9MUE9SVF9BRU5fTlBJVl9GQUJSSUNfTUFYID0gMTEsCS8qIE1heCBOUElWIGluIGZhYnJpYy9mcG9ydCAqLworCUJGQV9MUE9SVF9BRU5fTlBJVl9VTktOT1dOID0gMTIsCS8qIFVua25vd24gTlBJViBFcnJvciBjb2RlICovCit9OworCitzdHJ1Y3QgYmZhX2xwb3J0X2Flbl9kYXRhX3MgeworCXUxNgl2Zl9pZDsJLyogdmZfaWQgb2YgdGhpcyBsb2dpY2FsIHBvcnQgKi8KKwl1MTYJcm9sZXM7CS8qIExvZ2ljYWwgcG9ydCBtb2RlLElNL1RNL0lQIGV0YyAqLworCXUzMglyc3ZkOworCXd3bl90CXBwd3duOwkvKiBXV04gb2YgaXRzIHBoeXNpY2FsIHBvcnQgKi8KKwl3d25fdAlscHd3bjsJLyogV1dOIG9mIHRoaXMgbG9naWNhbCBwb3J0ICovCit9OworCisvKiBCRkEgSVROSU0gZXZlbnRzICovCitlbnVtIGJmYV9pdG5pbV9hZW5fZXZlbnQgeworCUJGQV9JVE5JTV9BRU5fT05MSU5FCSA9IDEsCS8qIFRhcmdldCBvbmxpbmUgKi8KKwlCRkFfSVROSU1fQUVOX09GRkxJTkUJID0gMiwJLyogVGFyZ2V0IG9mZmxpbmUgKi8KKwlCRkFfSVROSU1fQUVOX0RJU0NPTk5FQ1QgPSAzLAkvKiBUYXJnZXQgZGlzY29ubmVjdGVkICovCit9OworCitzdHJ1Y3QgYmZhX2l0bmltX2Flbl9kYXRhX3MgeworCXUxNgkJdmZfaWQ7CQkvKiB2Zl9pZCBvZiB0aGUgSVQgbmV4dXMgKi8KKwl1MTYJCXJzdmRbM107CisJd3duX3QJCXBwd3duOwkJLyogV1dOIG9mIGl0cyBwaHlzaWNhbCBwb3J0ICovCisJd3duX3QJCWxwd3duOwkJLyogV1dOIG9mIGxvZ2ljYWwgcG9ydCAqLworCXd3bl90CQlycHd3bjsJCS8qIFdXTiBvZiByZW1vdGUodGFyZ2V0KSBwb3J0ICovCit9OworCisvKiBCRkEgYXVkaXQgZXZlbnRzICovCitlbnVtIGJmYV9hdWRpdF9hZW5fZXZlbnQgeworCUJGQV9BVURJVF9BRU5fQVVUSF9FTkFCTEUJPSAxLAorCUJGQV9BVURJVF9BRU5fQVVUSF9ESVNBQkxFCT0gMiwKKwlCRkFfQVVESVRfQUVOX0ZMQVNIX0VSQVNFCT0gMywKKwlCRkFfQVVESVRfQUVOX0ZMQVNIX1VQREFURQk9IDQsCit9OworCitzdHJ1Y3QgYmZhX2F1ZGl0X2Flbl9kYXRhX3MgeworCXd3bl90CXB3d247CisJaW50CXBhcnRpdGlvbl9pbnN0OworCWludAlwYXJ0aXRpb25fdHlwZTsKK307CisKKy8qIEJGQSBJT0MgbGV2ZWwgZXZlbnRzICovCitlbnVtIGJmYV9pb2NfYWVuX2V2ZW50IHsKKwlCRkFfSU9DX0FFTl9IQkdPT0QgID0gMSwJLyogSGVhcnQgQmVhdCByZXN0b3JlIGV2ZW50CSovCisJQkZBX0lPQ19BRU5fSEJGQUlMICA9IDIsCS8qIEhlYXJ0IEJlYXQgZmFpbHVyZSBldmVudAkqLworCUJGQV9JT0NfQUVOX0VOQUJMRSAgPSAzLAkvKiBJT0MgZW5hYmxlZCBldmVudAkJKi8KKwlCRkFfSU9DX0FFTl9ESVNBQkxFID0gNCwJLyogSU9DIGRpc2FibGVkIGV2ZW50CQkqLworCUJGQV9JT0NfQUVOX0ZXTUlTTUFUQ0ggID0gNSwJLyogSU9DIGZpcm13YXJlIG1pc21hdGNoCSovCisJQkZBX0lPQ19BRU5fRldDRkdfRVJST1IgPSA2LAkvKiBJT0MgZmlybXdhcmUgY29uZmlnIGVycm9yCSovCisJQkZBX0lPQ19BRU5fSU5WQUxJRF9WRU5ET1IgPSA3LAorCUJGQV9JT0NfQUVOX0lOVkFMSURfTldXTiA9IDgsCS8qIFplcm8gTldXTgkJCSovCisJQkZBX0lPQ19BRU5fSU5WQUxJRF9QV1dOID0gOQkvKiBaZXJvIFBXV04JCQkqLworfTsKKworc3RydWN0IGJmYV9pb2NfYWVuX2RhdGFfcyB7CisJd3duX3QJcHd3bjsKKwl1MTYJaW9jX3R5cGU7CisJbWFjX3QJbWFjOworfTsKKworLyoKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbWZnIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLQogICovCiAKQEAgLTUyMCw2ICs2NjAsMjAgQEAKIC8qCiAgKiBCT09UIGJvb3QgY29uZmlndXJhdG9uCiAgKi8KK3N0cnVjdCBiZmFfYm9vdF9jZmdfcyB7CisJdTgJCXZlcnNpb247CisJdTgJCXJzdmQxOworCXUxNgkJY2hrc3VtOworCXU4CQllbmFibGU7CQkvKiBlbmFibGUvZGlzYWJsZSBTQU4gYm9vdCAqLworCXU4CQlzcGVlZDsgICAgICAgICAgLyogYm9vdCBzcGVlZCBzZXR0aW5ncyAqLworCXU4CQl0b3BvbG9neTsgICAgICAgLyogYm9vdCB0b3BvbG9neSBzZXR0aW5nICovCisJdTgJCWJvb3RvcHQ7ICAgICAgICAvKiBiZmFfYm9vdF9ib290b3B0X3QgKi8KKwl1MzIJCW5ibHVuczsgICAgICAgICAvKiBudW1iZXIgb2YgYm9vdCBsdW5zICovCisJdTMyCQlyc3ZkMjsKKwlzdHJ1Y3QgYmZhX2Jvb3RfYm9vdGx1bl9zIGJsdW5bQkZBX0JPT1RfQk9PVExVTl9NQVhdOworCXN0cnVjdCBiZmFfYm9vdF9ib290bHVuX3MgYmx1bl9kaXNjW0JGQV9CT09UX0JPT1RMVU5fTUFYXTsKK307CisKIHN0cnVjdCBiZmFfYm9vdF9wYmNfcyB7CiAJdTggICAgICAgICAgICAgIGVuYWJsZTsgICAgICAgICAvKiAgZW5hYmxlL2Rpc2FibGUgU0FOIGJvb3QgKi8KIAl1OCAgICAgICAgICAgICAgc3BlZWQ7ICAgICAgICAgIC8qICBib290IHNwZWVkIHNldHRpbmdzICovCkBAIC01MjksNiArNjgzLDE1IEBACiAJc3RydWN0IGJmYV9ib290X2Jvb3RsdW5fcyBwYmx1bltCRkFfUFJFQk9PVF9CT09UTFVOX01BWF07CiB9OwogCitzdHJ1Y3QgYmZhX2V0aGJvb3RfY2ZnX3MgeworCXU4CQl2ZXJzaW9uOworCXU4CQlyc3ZkMTsKKwl1MTYJCWNoa3N1bTsKKwl1OAkJZW5hYmxlOwkvKiBlbmFibGUvZGlzYWJsZSBFdGgvUFhFIGJvb3QgKi8KKwl1OAkJcnN2ZDI7CisJdTE2CQl2bGFuOworfTsKKwogLyoKICAqIEFTSUMgYmxvY2sgY29uZmlndXJhdGlvbiByZWxhdGVkIHN0cnVjdHVyZXMKICAqLwpAQCAtNTg3LDYgKzc1MCwxNCBAQAogICovCiAjZGVmaW5lIFNGUF9ESUFHTU9OX1NJWkUJMTAgLyogbnVtIGJ5dGVzIG9mIGRpYWcgbW9uaXRvciBkYXRhICovCiAKKy8qIFNGUCBzdGF0ZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGV2ZW50ICovCisjZGVmaW5lIEJGQV9TRlBfU0NOX1JFTU9WRUQJMAorI2RlZmluZSBCRkFfU0ZQX1NDTl9JTlNFUlRFRAkxCisjZGVmaW5lIEJGQV9TRlBfU0NOX1BPTQkJMgorI2RlZmluZSBCRkFfU0ZQX1NDTl9GQUlMRUQJMworI2RlZmluZSBCRkFfU0ZQX1NDTl9VTlNVUFBPUlQJNAorI2RlZmluZSBCRkFfU0ZQX1NDTl9WQUxJRAk1CisKIGVudW0gYmZhX2RlZnNfc2ZwX21lZGlhX2UgewogCUJGQV9TRlBfTUVESUFfVU5LTk9XTgk9IDB4MDAsCiAJQkZBX1NGUF9NRURJQV9DVQk9IDB4MDEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9kZWZzX3N2Yy5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZGVmc19zdmMuaAppbmRleCAwYjk3NTI1Li44NjNjNmJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9kZWZzX3N2Yy5oCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2RlZnNfc3ZjLmgKQEAgLTI2OCw2ICsyNjgsNyBAQAogICAgIHUzMiAgICBlcnJvcl9yZXNldHM7ICAgICAgIC8qICBlcnJvciByZXNldHMgaW5pdGlhdGVkIGJ5IHVwc20gICAgICAqLwogICAgIHUzMiAgICBzeW5jX2xvc3Q7ICAgICAgICAgIC8qICBTeW5jIGxvc3MgY291bnQgICAgICAgICAgICAgICAgICAgICAqLwogICAgIHUzMiAgICBzaWdfbG9zdDsgICAgICAgICAgIC8qICBTaWduYWwgbG9zcyBjb3VudCAgICAgICAgICAgICAgICAgICAqLworCXUzMglhc244Z19hdHRlbXB0czsJLyogU05TTSBIV1NNIGF0IDhHYnBzIGF0dGVtcHRzICovCiB9OwogCiBzdHJ1Y3QgYmZhX2Z3X3BvcnRfcGh5c21fc3RhdHNfcyB7CkBAIC00NjgsNiArNDY5LDcgQEAKICAqIFFvUyBzdGF0ZXMKICAqLwogZW51bSBiZmFfcW9zX3N0YXRlIHsKKwlCRkFfUU9TX0RJU0FCTEVEID0gMCwJCS8qIFFvUyBpcyBkaXNhYmxlZCAqLwogCUJGQV9RT1NfT05MSU5FID0gMSwJCS8qICBRb1MgaXMgb25saW5lICovCiAJQkZBX1FPU19PRkZMSU5FID0gMiwJCS8qICBRb1MgaXMgb2ZmbGluZSAqLwogfTsKQEAgLTY3MCw2ICs2NzIsMTIgQEAKIAl1MzIJdG1faW9jZG93bnM7CQkvKiAgVE0gY2xlYW5lZC11cCBkdWUgdG8gSU9DIGRvd24gICAqLwogCXUzMgl0bV9jbGVhbnVwczsJCS8qICBUTSBjbGVhbnVwIHJlcXVlc3RzCSovCiAJdTMyCXRtX2NsZWFudXBfY29tcHM7CS8qICBUTSBjbGVhbnVwIGNvbXBsZXRpb25zCSovCisJdTMyCWxtX2x1bl9hY3Jvc3Nfc2c7CS8qICBMTSBsdW4gaXMgYWNyb3NzIHNnIGRhdGEgYnVmICovCisJdTMyCWxtX2x1bl9ub3Rfc3VwOwkJLyogIExNIGx1biBub3Qgc3VwcG9ydGVkICovCisJdTMyCWxtX3JwbF9kYXRhX2NoYW5nZWQ7CS8qICBMTSByZXBvcnQtbHVuIGRhdGEgY2hhbmdlZCAqLworCXUzMglsbV93aXJlX3Jlc2lkdWVfY2hhbmdlZDsgLyogTE0gcmVwb3J0LWx1biByc3AgcmVzaWR1ZSBjaGFuZ2VkICovCisJdTMyCWxtX3NtYWxsX2J1Zl9hZGRyZXNpZHVlOyAvKiBMTSBidWYgc21hbGxlciB0aGFuIHJlcG9ydGVkIGNudCAqLworCXUzMglsbV9sdW5fbm90X3JkeTsJCS8qIExNIGx1biBub3QgcmVhZHkgKi8KIH07CiAKIC8qIE1vZGlmeSBjaGFyKiBwb3J0X3N0dFtdIGluIGJmYWxfcG9ydC5jIGlmIGEgbmV3IHN0YXRlIHdhcyBhZGRlZCAqLwpAQCAtNzg1LDggKzc5Myw1MSBAQAogCUNFRV9JU0NTSV9QUklfUEZDX09GRgkJCT0gNDIsCiAJQ0VFX0lTQ1NJX1BSSV9PVkVSTEFQX0ZDT0VfUFJJCQk9IDQzCiB9OworCisjZGVmaW5lIE1BWF9MVU5fTUFTS19DRkcgMTYKKworLyoKKyAqIEluaXRpYWxseSBmbGFzaCBjb250ZW50IG1heSBiZSBmZmYuIE9uIG1ha2luZyBMVU4gbWFzayBlbmFibGUgYW5kIGRpc2FibGUKKyAqIHN0YXRlIGNobmFnZS4gIHdoZW4gcmVwb3J0IGx1biBjb21tYW5kIGlzIGJlaW5nIHByb2Nlc3NlZCBpdCBnb2VzIGZyb20KKyAqIEJGQV9MVU5fTUFTS19BQ1RJVkUgdG8gQkZBX0xVTl9NQVNLX0ZFVENIIGFuZCBjb21lcyBiYWNrIHRvCisgKiBCRkFfTFVOX01BU0tfQUNUSVZFLgorICovCitlbnVtIGJmYV9pb2ltX2x1bl9tYXNrX3N0YXRlX3MgeworCUJGQV9JT0lNX0xVTl9NQVNLX0lOQUNUSVZFID0gMCwKKwlCRkFfSU9JTV9MVU5fTUFTS19BQ1RJVkUgPSAxLAorCUJGQV9JT0lNX0xVTl9NQVNLX0ZFVENIRUQgPSAyLAorfTsKKworZW51bSBiZmFfbHVubWFza19zdGF0ZV9zIHsKKwlCRkFfTFVOTUFTS19ESVNBQkxFRCA9IDB4MDAsCisJQkZBX0xVTk1BU0tfRU5BQkxFRCA9IDB4MDEsCisJQkZBX0xVTk1BU0tfTUlOQ0ZHID0gMHgwMiwKKwlCRkFfTFVOTUFTS19VTklOSVRJQUxJWkVEID0gMHhmZiwKK307CisKICNwcmFnbWEgcGFjaygxKQogLyoKKyAqIExVTiBtYXNrIGNvbmZpZ3VyYXRpb24KKyAqLworc3RydWN0IGJmYV9sdW5fbWFza19zIHsKKwl3d25fdAkJbHBfd3duOworCXd3bl90CQlycF93d247CisJc3RydWN0IHNjc2lfbHVuCWx1bjsKKwl1OAkJdWE7CisJdTgJCXJzdmRbM107CisJdTE2CQlycF90YWc7CisJdTgJCWxwX3RhZzsKKwl1OAkJc3RhdGU7Cit9OworCisjZGVmaW5lIE1BWF9MVU5fTUFTS19DRkcgMTYKK3N0cnVjdCBiZmFfbHVubWFza19jZmdfcyB7CisJdTMyCXN0YXR1czsKKwl1MzIJcnN2ZDsKKwlzdHJ1Y3QgYmZhX2x1bl9tYXNrX3MJbHVuX2xpc3RbTUFYX0xVTl9NQVNLX0NGR107Cit9OworCisvKgogICogICAgICBQaHlzaWNhbCBwb3J0IGNvbmZpZ3VyYXRpb24KICAqLwogc3RydWN0IGJmYV9wb3J0X2NmZ19zIHsKQEAgLTEyMjgsNCArMTI3OSw1MiBAQAogCiAjcHJhZ21hIHBhY2soKQogCisvKgorICoJCQlBRU4gcmVsYXRlZCBkZWZpbml0aW9ucworICovCisjZGVmaW5lIEJGQURfTkxfVkVORE9SX0lEICgoKHU2NCkweDAxIDw8IFNDU0lfTkxfVklEX1RZUEVfU0hJRlQpIFwKKwkJCSAgIHwgQkZBX1BDSV9WRU5ET1JfSURfQlJPQ0FERSkKKworLyogQkZBIHJlbW90ZSBwb3J0IGV2ZW50cyAqLworZW51bSBiZmFfcnBvcnRfYWVuX2V2ZW50IHsKKwlCRkFfUlBPUlRfQUVOX09OTElORSAgICAgPSAxLCAgIC8qIFJQb3J0IG9ubGluZSBldmVudCAqLworCUJGQV9SUE9SVF9BRU5fT0ZGTElORSAgICA9IDIsICAgLyogUlBvcnQgb2ZmbGluZSBldmVudCAqLworCUJGQV9SUE9SVF9BRU5fRElTQ09OTkVDVCA9IDMsICAgLyogUlBvcnQgZGlzY29ubmVjdCBldmVudCAqLworCUJGQV9SUE9SVF9BRU5fUU9TX1BSSU8gICA9IDQsICAgLyogUU9TIHByaW9yaXR5IGNoYW5nZSBldmVudCAqLworCUJGQV9SUE9SVF9BRU5fUU9TX0ZMT1dJRCA9IDUsICAgLyogUU9TIGZsb3cgSWQgY2hhbmdlIGV2ZW50ICovCit9OworCitzdHJ1Y3QgYmZhX3Jwb3J0X2Flbl9kYXRhX3MgeworCXUxNiAgICAgICAgICAgICB2Zl9pZDsgIC8qIHZmX2lkIG9mIHRoaXMgbG9naWNhbCBwb3J0ICovCisJdTE2ICAgICAgICAgICAgIHJzdmRbM107CisJd3duX3QgICAgICAgICAgIHBwd3duOyAgLyogV1dOIG9mIGl0cyBwaHlzaWNhbCBwb3J0ICovCisJd3duX3QgICAgICAgICAgIGxwd3duOyAgLyogV1dOIG9mIHRoaXMgbG9naWNhbCBwb3J0ICovCisJd3duX3QgICAgICAgICAgIHJwd3duOyAgLyogV1dOIG9mIHRoaXMgcmVtb3RlIHBvcnQgKi8KKwl1bmlvbiB7CisJCXN0cnVjdCBiZmFfcnBvcnRfcW9zX2F0dHJfcyBxb3M7CisJfSBwcml2OworfTsKKwordW5pb24gYmZhX2Flbl9kYXRhX3UgeworCXN0cnVjdCBiZmFfYWRhcHRlcl9hZW5fZGF0YV9zCWFkYXB0ZXI7CisJc3RydWN0IGJmYV9wb3J0X2Flbl9kYXRhX3MJcG9ydDsKKwlzdHJ1Y3QgYmZhX2xwb3J0X2Flbl9kYXRhX3MJbHBvcnQ7CisJc3RydWN0IGJmYV9ycG9ydF9hZW5fZGF0YV9zCXJwb3J0OworCXN0cnVjdCBiZmFfaXRuaW1fYWVuX2RhdGFfcwlpdG5pbTsKKwlzdHJ1Y3QgYmZhX2F1ZGl0X2Flbl9kYXRhX3MJYXVkaXQ7CisJc3RydWN0IGJmYV9pb2NfYWVuX2RhdGFfcwlpb2M7Cit9OworCisjZGVmaW5lIEJGQV9BRU5fTUFYX0VOVFJZCTUxMgorCitzdHJ1Y3QgYmZhX2Flbl9lbnRyeV9zIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXFlOworCWVudW0gYmZhX2Flbl9jYXRlZ29yeSAgIGFlbl9jYXRlZ29yeTsKKwl1MzIgICAgICAgICAgICAgICAgICAgICBhZW5fdHlwZTsKKwl1bmlvbiBiZmFfYWVuX2RhdGFfdSAgICBhZW5fZGF0YTsKKwlzdHJ1Y3QgdGltZXZhbCAgICAgICAgICBhZW5fdHY7CisJdTMyICAgICAgICAgICAgICAgICAgICAgc2VxX251bTsKKwl1MzIgICAgICAgICAgICAgICAgICAgICBiZmFkX251bTsKK307CisKICNlbmRpZiAvKiBfX0JGQV9ERUZTX1NWQ19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjLmggYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mYy5oCmluZGV4IDhkMGI4OGYuLjUwYjZhMWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjLmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmMuaApAQCAtNTYsNiArNTYsMTYxIEBACiAKICNkZWZpbmUgU0NTSV9NQVhfQUxMT0NfTEVOICAgICAgMHhGRiAgICAvKiBtYXhpbXVtIGFsbG9jYXJpb24gbGVuZ3RoICovCiAKKyNkZWZpbmUgU0NTSV9TRU5TRV9DVVJfRVJSCTB4NzAKKyNkZWZpbmUgU0NTSV9TRU5TRV9ERUZfRVJSCTB4NzEKKworLyoKKyAqIFNDU0kgYWRkaXRpb25hbCBzZW5zZSBjb2RlcworICovCisjZGVmaW5lIFNDU0lfQVNDX0xVTl9OT1RfUkVBRFkJCTB4MDQKKyNkZWZpbmUgU0NTSV9BU0NfTFVOX05PVF9TVVBQT1JURUQJMHgyNQorI2RlZmluZSBTQ1NJX0FTQ19UT0NDCQkJMHgzRgorCisvKgorICogU0NTSSBhZGRpdGlvbmFsIHNlbnNlIGNvZGUgcXVhbGlmaWVycworICovCisjZGVmaW5lIFNDU0lfQVNDUV9NQU5fSU5UUl9SRVEJCTB4MDMJLyogbWFudWFsIGludGVydmVudGlvbiByZXEgKi8KKyNkZWZpbmUgU0NTSV9BU0NRX1JMX0RBVEFfQ0hBTkdFRAkweDBFCS8qIHJlcG9ydCBsdW5zIGRhdGEgY2hhbmdlZCAqLworCisvKgorICogTWV0aG9kcyBvZiByZXBvcnRpbmcgaW5mb3JtYXRpb25hbCBleGNlcHRpb25zCisgKi8KKyNkZWZpbmUgU0NTSV9NUF9JRUNfVU5JVF9BVFROCQkweDIJLyogZ2VuZXJhdGUgdW5pdCBhdHRlbnRpb24gKi8KKworc3RydWN0IHNjc2lfcmVwb3J0X2x1bnNfZGF0YV9zIHsKKwl1MzIJCWx1bl9saXN0X2xlbmd0aDsJLyogbGVuZ3RoIG9mIExVTiBsaXN0IGxlbmd0aCAqLworCXUzMgkJcmVzZXJ2ZWQ7CisJc3RydWN0IHNjc2lfbHVuCWx1blsxXTsJCQkvKiBmaXJzdCBMVU4gaW4gbHVuIGxpc3QgKi8KK307CisKK3N0cnVjdCBzY3NpX2lucXVpcnlfdmVuZG9yX3MgeworCXU4CXZlbmRvcl9pZFs4XTsKK307CisKK3N0cnVjdCBzY3NpX2lucXVpcnlfcHJvZGlkX3MgeworCXU4CXByb2R1Y3RfaWRbMTZdOworfTsKKworc3RydWN0IHNjc2lfaW5xdWlyeV9wcm9kcmV2X3MgeworCXU4CXByb2R1Y3RfcmV2WzRdOworfTsKKworc3RydWN0IHNjc2lfaW5xdWlyeV9kYXRhX3MgeworI2lmZGVmIF9fQklHX0VORElBTgorCXU4CQlwZXJpcGhlcmFsX3F1YWw6MzsJLyogcGVyaXBoZXJhbCBxdWFsaWZpZXIgKi8KKwl1OAkJZGV2aWNlX3R5cGU6NTsJCS8qIHBlcmlwaGVyYWwgZGV2aWNlIHR5cGUgKi8KKwl1OAkJcm1iOjE7CQkJLyogcmVtb3ZhYmxlIG1lZGl1bSBiaXQgKi8KKwl1OAkJZGV2aWNlX3R5cGVfbW9kOjc7CS8qIGRldmljZSB0eXBlIG1vZGlmaWVyICovCisJdTgJCXZlcnNpb247CisJdTgJCWFlbmM6MTsJCS8qIGFzeW5jIGV2dCBub3RpZmljYXRpb24gY2FwYWJpbGl0eSAqLworCXU4CQl0cm1faW9wOjE7CS8qIHRlcm1pbmF0ZSBJL08gcHJvY2VzcyAqLworCXU4CQlub3JtX2FjYToxOwkvKiBub3JtYWwgQUNBIHN1cHBvcnRlZCAqLworCXU4CQloaV9zdXBwb3J0OjE7CS8qIFNDU0ktMzogc3VwcG9ydHMgUkVQT1JUIExVTlMgKi8KKwl1OAkJcnNwX2RhdGFfZm9ybWF0OjQ7CisJdTgJCWFkZGl0aW9uYWxfbGVuOworCXU4CQlzY2NzOjE7CisJdTgJCXJlc2VydmVkMTo3OworCXU4CQlyZXNlcnZlZDI6MTsKKwl1OAkJZW5jX3NlcnY6MTsJLyogZW5jbG9zdXJlIHNlcnZpY2UgY29tcG9uZW50ICovCisJdTgJCXJlc2VydmVkMzoxOworCXU4CQltdWx0aV9wb3J0OjE7CS8qIG11bHRpLXBvcnQgZGV2aWNlICovCisJdTgJCW1fY2huZ3I6MTsJLyogZGV2aWNlIGluIG1lZGl1bSB0cmFuc3BvcnQgZWxlbWVudCAqLworCXU4CQlhY2tfcmVxX3E6MTsJLyogU0lQIHNwZWNpZmljIGJpdCAqLworCXU4CQlhZGRyMzI6MTsJLyogU0lQIHNwZWNpZmljIGJpdCAqLworCXU4CQlhZGRyMTY6MTsJLyogU0lQIHNwZWNpZmljIGJpdCAqLworCXU4CQlyZWxfYWRyOjE7CS8qIHJlbGF0aXZlIGFkZHJlc3MgKi8KKwl1OAkJd19idXMzMjoxOworCXU4CQl3X2J1czE2OjE7CisJdTgJCXN5bmNocm9ub3VzOjE7CisJdTgJCWxpbmtlZF9jb21tYW5kczoxOworCXU4CQl0cmFuc19kaXM6MTsKKwl1OAkJY21kX3F1ZXVlOjE7CS8qIGNvbW1hbmQgcXVldWVpbmcgc3VwcG9ydGVkICovCisJdTgJCXNvZnRfcmVzZXQ6MTsJLyogc29mdCByZXNldCBhbHRlcm5hdGl2ZSAoVlMpICovCisjZWxzZQorCXU4CQlkZXZpY2VfdHlwZTo1OwkvKiBwZXJpcGhlcmFsIGRldmljZSB0eXBlICovCisJdTgJCXBlcmlwaGVyYWxfcXVhbDozOyAvKiBwZXJpcGhlcmFsIHF1YWxpZmllciAqLworCXU4CQlkZXZpY2VfdHlwZV9tb2Q6NzsgLyogZGV2aWNlIHR5cGUgbW9kaWZpZXIgKi8KKwl1OAkJcm1iOjE7CQkvKiByZW1vdmFibGUgbWVkaXVtIGJpdCAqLworCXU4CQl2ZXJzaW9uOworCXU4CQlyc3BfZGF0YV9mb3JtYXQ6NDsKKwl1OAkJaGlfc3VwcG9ydDoxOwkvKiBTQ1NJLTM6IHN1cHBvcnRzIFJFUE9SVCBMVU5TICovCisJdTgJCW5vcm1fYWNhOjE7CS8qIG5vcm1hbCBBQ0Egc3VwcG9ydGVkICovCisJdTgJCXRlcm1pbmF0ZV9pb3A6MTsvKiB0ZXJtaW5hdGUgSS9PIHByb2Nlc3MgKi8KKwl1OAkJYWVuYzoxOwkJLyogYXN5bmMgZXZ0IG5vdGlmaWNhdGlvbiBjYXBhYmlsaXR5ICovCisJdTgJCWFkZGl0aW9uYWxfbGVuOworCXU4CQlyZXNlcnZlZDE6NzsKKwl1OAkJc2NjczoxOworCXU4CQlhZGRyMTY6MTsJLyogU0lQIHNwZWNpZmljIGJpdCAqLworCXU4CQlhZGRyMzI6MTsJLyogU0lQIHNwZWNpZmljIGJpdCAqLworCXU4CQlhY2tfcmVxX3E6MTsJLyogU0lQIHNwZWNpZmljIGJpdCAqLworCXU4CQltX2NobmdyOjE7CS8qIGRldmljZSBpbiBtZWRpdW0gdHJhbnNwb3J0IGVsZW1lbnQgKi8KKwl1OAkJbXVsdGlfcG9ydDoxOwkvKiBtdWx0aS1wb3J0IGRldmljZSAqLworCXU4CQlyZXNlcnZlZDM6MTsJLyogVEJEIC0gVmVuZG9yIFNwZWNpZmljICovCisJdTgJCWVuY19zZXJ2OjE7CS8qIGVuY2xvc3VyZSBzZXJ2aWNlIGNvbXBvbmVudCAqLworCXU4CQlyZXNlcnZlZDI6MTsKKwl1OAkJc29mdF9zZXNldDoxOwkvKiBzb2Z0IHJlc2V0IGFsdGVybmF0aXZlIChWUykgKi8KKwl1OAkJY21kX3F1ZXVlOjE7CS8qIGNvbW1hbmQgcXVldWVpbmcgc3VwcG9ydGVkICovCisJdTgJCXRyYW5zX2RpczoxOworCXU4CQlsaW5rZWRfY29tbWFuZHM6MTsKKwl1OAkJc3luY2hyb25vdXM6MTsKKwl1OAkJd19idXMxNjoxOworCXU4CQl3X2J1czMyOjE7CisJdTgJCXJlbF9hZHI6MTsJLyogcmVsYXRpdmUgYWRkcmVzcyAqLworI2VuZGlmCisJc3RydWN0IHNjc2lfaW5xdWlyeV92ZW5kb3Jfcwl2ZW5kb3JfaWQ7CisJc3RydWN0IHNjc2lfaW5xdWlyeV9wcm9kaWRfcwlwcm9kdWN0X2lkOworCXN0cnVjdCBzY3NpX2lucXVpcnlfcHJvZHJldl9zCXByb2R1Y3RfcmV2OworCXU4CQl2ZW5kb3Jfc3BlY2lmaWNbMjBdOworCXU4CQlyZXNlcnZlZDRbNDBdOworfTsKKworLyoKKyAqCVNDU0kgc2Vuc2UgZGF0YSBmb3JtYXQKKyAqLworc3RydWN0IHNjc2lfc2Vuc2VfcyB7CisjaWZkZWYgX19CSUdfRU5ESUFOCisJdTgJCXZhbGlkOjE7CisJdTgJCXJzcF9jb2RlOjc7CisjZWxzZQorCXU4CQlyc3BfY29kZTo3OworCXU4CQl2YWxpZDoxOworI2VuZGlmCisJdTgJCXNlZ19udW07CisjaWZkZWYgX19CSUdfRU5ESUFOCisJdTgJCWZpbGVfbWFyazoxOworCXU4CQllb206MTsJCS8qIGVuZCBvZiBtZWRpYSAqLworCXU4CQlpbGk6MTsJCS8qIGluY29ycmVjdCBsZW5ndGggaW5kaWNhdG9yICovCisJdTgJCXJlc2VydmVkOjE7CisJdTgJCXNlbnNlX2tleTo0OworI2Vsc2UKKwl1OAkJc2Vuc2Vfa2V5OjQ7CisJdTgJCXJlc2VydmVkOjE7CisJdTgJCWlsaToxOwkJLyogaW5jb3JyZWN0IGxlbmd0aCBpbmRpY2F0b3IgKi8KKwl1OAkJZW9tOjE7CQkvKiBlbmQgb2YgbWVkaWEgKi8KKwl1OAkJZmlsZV9tYXJrOjE7CisjZW5kaWYKKwl1OAkJaW5mb3JtYXRpb25bNF07CS8qIGRldmljZS10eXBlIG9yIGNtZCBzcGVjaWZpYyBpbmZvICovCisJdTgJCWFkZF9zZW5zZV9sZW5ndGg7IC8qIGFkZGl0aW9uYWwgc2Vuc2UgbGVuZ3RoICovCisJdTgJCWNvbW1hbmRfaW5mb1s0XTsvKiBjb21tYW5kIHNwZWNpZmljIGluZm9ybWF0aW9uICovCisJdTgJCWFzYzsJCS8qIGFkZGl0aW9uYWwgc2Vuc2UgY29kZSAqLworCXU4CQlhc2NxOwkJLyogYWRkaXRpb25hbCBzZW5zZSBjb2RlIHF1YWxpZmllciAqLworCXU4CQlmcnVfY29kZTsJLyogZmllbGQgcmVwbGFjZWFibGUgdW5pdCBjb2RlICovCisjaWZkZWYgX19CSUdfRU5ESUFOCisJdTgJCXNrc3Y6MTsJCS8qIHNlbnNlIGtleSBzcGVjaWZpYyB2YWxpZCAqLworCXU4CQljX2Q6MTsJCS8qIGNvbW1hbmQvZGF0YSBiaXQgKi8KKwl1OAkJcmVzMToyOworCXU4CQlicHY6MTsJCS8qIGJpdCBwb2ludGVyIHZhbGlkICovCisJdTgJCWJwb2ludGVyOjM7CS8qIGJpdCBwb2ludGVyICovCisjZWxzZQorCXU4CQlicG9pbnRlcjozOwkvKiBiaXQgcG9pbnRlciAqLworCXU4CQlicHY6MTsJCS8qIGJpdCBwb2ludGVyIHZhbGlkICovCisJdTgJCXJlczE6MjsKKwl1OAkJY19kOjE7CQkvKiBjb21tYW5kL2RhdGEgYml0ICovCisJdTgJCXNrc3Y6MTsJCS8qIHNlbnNlIGtleSBzcGVjaWZpYyB2YWxpZCAqLworI2VuZGlmCisJdTgJCWZwb2ludGVyWzJdOwkvKiBmaWVsZCBwb2ludGVyICovCit9OworCiAvKgogICogRmlicmUgQ2hhbm5lbCBIZWFkZXIgU3RydWN0dXJlIChGQ0hTKSBkZWZpbml0aW9uCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjcGltLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3BpbS5jCmluZGV4IGE0ZTc5NTEuLmUwN2JkNDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjcGltLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNwaW0uYwpAQCAtMjQsNiArMjQsOSBAQAogICogIEJGQSBJVE5JTSBSZWxhdGVkIGRlZmluaXRpb25zCiAgKi8KIHN0YXRpYyB2b2lkIGJmYV9pdG5pbV91cGRhdGVfZGVsX2l0bl9zdGF0cyhzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltKTsKK3N0YXRpYyBiZmFfYm9vbGVhbl90IGJmYV9pb2ltX2xtX3Byb2NfcnBsX2RhdGEoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0pOworc3RhdGljIGJmYV9ib29sZWFuX3QgYmZhX2lvaW1fbG1fcHJvY19pbnFfZGF0YShzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSk7CitzdGF0aWMgdm9pZCBiZmFfaW9pbV9sbV9pbml0KHN0cnVjdCBiZmFfcyAqYmZhKTsKIAogI2RlZmluZSBCRkFfSVROSU1fRlJPTV9UQUcoX2ZjcGltLCBfdGFnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCSgoKF9mY3BpbSktPml0bmltX2FyciArICgoX3RhZykgJiAoKF9mY3BpbSktPm51bV9pdG5pbXMgLSAxKSkpKQpAQCAtNTcsNiArNjAsMTQgQEAKIAl9CQkJCQkJCQlcCiB9IHdoaWxlICgwKQogCisjZGVmaW5lIGJmYV9pb2ltX3JwX3d3bihfX2lvaW0pCQkJCQkJXAorCSgoKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKikJCQkJCVwKKwkgKF9faW9pbSktPml0bmltLT5ycG9ydC0+cnBvcnRfZHJ2KS0+cHd3bikKKworI2RlZmluZSBiZmFfaW9pbV9scF93d24oX19pb2ltKQkJCQkJCVwKKwkoKEJGQV9MUFNfRlJPTV9UQUcoQkZBX0xQU19NT0QoKF9faW9pbSktPmJmYSksCQkJXAorCShfX2lvaW0pLT5pdG5pbS0+cnBvcnQtPnJwb3J0X2luZm8ubHBfdGFnKSktPnB3d24pCQlcCisKICNkZWZpbmUgYmZhX2l0bmltX3NsZXJfY2IoX19pdG5pbSkgZG8gewkJCQkJXAogCWlmICgoX19pdG5pbSktPmJmYS0+ZmNzKQkJCQkJXAogCQliZmFfY2JfaXRuaW1fc2xlcigoX19pdG5pbSktPmRpdG4pOyAgICAgIFwKQEAgLTY2LDYgKzc3LDE4IEBACiAJfQkJCQkJCQkJXAogfSB3aGlsZSAoMCkKIAorZW51bSBiZmFfaW9pbV9sbV9zdGF0dXMgeworCUJGQV9JT0lNX0xNX1BSRVNFTlQgPSAxLAorCUJGQV9JT0lNX0xNX0xVTl9OT1RfU1VQID0gMiwKKwlCRkFfSU9JTV9MTV9SUExfREFUQV9DSEFOR0VEID0gMywKKwlCRkFfSU9JTV9MTV9MVU5fTk9UX1JEWSA9IDQsCit9OworCitlbnVtIGJmYV9pb2ltX2xtX3VhX3N0YXR1cyB7CisJQkZBX0lPSU1fTE1fVUFfUkVTRVQgPSAwLAorCUJGQV9JT0lNX0xNX1VBX1NFVCA9IDEsCit9OworCiAvKgogICogIGl0bmltIHN0YXRlIG1hY2hpbmUgZXZlbnQKICAqLwpAQCAtMTIyLDYgKzE0NSw5IEBACiAJQkZBX0lPSU1fU01fVE1ET05FCT0gMTYsCS8qICBJTyBjbGVhbnVwIGZyb20gdHNraW0gKi8KIAlCRkFfSU9JTV9TTV9IV0ZBSUwJPSAxNywJLyogIElPQyBoL3cgZmFpbHVyZSBldmVudCAqLwogCUJGQV9JT0lNX1NNX0lPVE9WCT0gMTgsCS8qICBJVE4gb2ZmbGluZSBUT1YgKi8KKwlCRkFfSU9JTV9TTV9MTV9MVU5fTk9UX1NVUCA9IDE5LC8qICBsdW5tYXNrIGx1biBub3Qgc3VwcG9ydGVkICovCisJQkZBX0lPSU1fU01fTE1fUlBMX0RDID0gMjAsCS8qICBsdW5tYXNrIHJlcG9ydC1sdW4gZGF0YSBjaGFuZ2VkICovCisJQkZBX0lPSU1fU01fTE1fTFVOX05PVF9SRFkgPSAyMSwvKiAgbHVubWFzayBsdW4gbm90IHJlYWR5ICovCiB9OwogCiAKQEAgLTIxOSw2ICsyNDUsOSBAQAogc3RhdGljIHZvaWQgX19iZmFfY2JfaW9pbV9mYWlsZWQodm9pZCAqY2JhcmcsIGJmYV9ib29sZWFuX3QgY29tcGxldGUpOwogc3RhdGljIHZvaWQgX19iZmFfY2JfaW9pbV9wYXRodG92KHZvaWQgKmNiYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKTsKIHN0YXRpYyBiZmFfYm9vbGVhbl90ICAgIGJmYV9pb2ltX2lzX2Fib3J0YWJsZShzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSk7CitzdGF0aWMgdm9pZCBfX2JmYV9jYl9pb2ltX2xtX2x1bl9ub3Rfc3VwKHZvaWQgKmNiYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKTsKK3N0YXRpYyB2b2lkIF9fYmZhX2NiX2lvaW1fbG1fcnBsX2RjKHZvaWQgKmNiYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKTsKK3N0YXRpYyB2b2lkIF9fYmZhX2NiX2lvaW1fbG1fbHVuX25vdF9yZHkodm9pZCAqY2JhcmcsIGJmYV9ib29sZWFuX3QgY29tcGxldGUpOwogCiAvKgogICogZm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBCRkEgSU8gc3RhdGUgbWFjaGluZQpAQCAtNDE2LDYgKzQ0NSwxMiBAQAogCWJmYV9mY3BpbV9hZGRfaW9zdGF0cyhsc3RhdHMsIHJzdGF0cywgb3V0cHV0X3JlcXMpOwogCWJmYV9mY3BpbV9hZGRfaW9zdGF0cyhsc3RhdHMsIHJzdGF0cywgcmRfdGhyb3VnaHB1dCk7CiAJYmZhX2ZjcGltX2FkZF9pb3N0YXRzKGxzdGF0cywgcnN0YXRzLCB3cl90aHJvdWdocHV0KTsKKwliZmFfZmNwaW1fYWRkX2lvc3RhdHMobHN0YXRzLCByc3RhdHMsIGxtX2x1bl9hY3Jvc3Nfc2cpOworCWJmYV9mY3BpbV9hZGRfaW9zdGF0cyhsc3RhdHMsIHJzdGF0cywgbG1fbHVuX25vdF9zdXApOworCWJmYV9mY3BpbV9hZGRfaW9zdGF0cyhsc3RhdHMsIHJzdGF0cywgbG1fcnBsX2RhdGFfY2hhbmdlZCk7CisJYmZhX2ZjcGltX2FkZF9pb3N0YXRzKGxzdGF0cywgcnN0YXRzLCBsbV93aXJlX3Jlc2lkdWVfY2hhbmdlZCk7CisJYmZhX2ZjcGltX2FkZF9pb3N0YXRzKGxzdGF0cywgcnN0YXRzLCBsbV9zbWFsbF9idWZfYWRkcmVzaWR1ZSk7CisJYmZhX2ZjcGltX2FkZF9pb3N0YXRzKGxzdGF0cywgcnN0YXRzLCBsbV9sdW5fbm90X3JkeSk7CiB9CiAKIGJmYV9zdGF0dXNfdApAQCAtNDM3LDYgKzQ3Miw1OSBAQAogCXJldHVybiBCRkFfU1RBVFVTX09LOwogfQogCit2b2lkCitiZmFfaW9pbV9wcm9maWxlX2NvbXAoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0pCit7CisJc3RydWN0IGJmYV9pdG5pbV9sYXRlbmN5X3MgKmlvX2xhdCA9CisJCQkmKGlvaW0tPml0bmltLT5pb3Byb2ZpbGUuaW9fbGF0ZW5jeSk7CisJdTMyIHZhbCwgaWR4OworCisJdmFsID0gKHUzMikoamlmZmllcyAtIGlvaW0tPnN0YXJ0X3RpbWUpOworCWlkeCA9IGJmYV9pb2ltX2dldF9pbmRleChzY3NpX2J1ZmZsZW4oKHN0cnVjdCBzY3NpX2NtbmQgKilpb2ltLT5kaW8pKTsKKwliZmFfaXRuaW1faW9wcm9maWxlX3VwZGF0ZShpb2ltLT5pdG5pbSwgaWR4KTsKKworCWlvX2xhdC0+Y291bnRbaWR4XSsrOworCWlvX2xhdC0+bWluW2lkeF0gPSAoaW9fbGF0LT5taW5baWR4XSA8IHZhbCkgPyBpb19sYXQtPm1pbltpZHhdIDogdmFsOworCWlvX2xhdC0+bWF4W2lkeF0gPSAoaW9fbGF0LT5tYXhbaWR4XSA+IHZhbCkgPyBpb19sYXQtPm1heFtpZHhdIDogdmFsOworCWlvX2xhdC0+YXZnW2lkeF0gKz0gdmFsOworfQorCit2b2lkCitiZmFfaW9pbV9wcm9maWxlX3N0YXJ0KHN0cnVjdCBiZmFfaW9pbV9zICppb2ltKQoreworCWlvaW0tPnN0YXJ0X3RpbWUgPSBqaWZmaWVzOworfQorCitiZmFfc3RhdHVzX3QKK2JmYV9mY3BpbV9wcm9maWxlX29uKHN0cnVjdCBiZmFfcyAqYmZhLCB1MzIgdGltZSkKK3sKKwlzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltOworCXN0cnVjdCBiZmFfZmNwaW1fcyAqZmNwaW0gPSBCRkFfRkNQSU0oYmZhKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpxZSwgKnFlbjsKKworCS8qIGFjY3VtdWxhdGUgSU8gc3RhdHMgZnJvbSBpdG5pbSAqLworCWxpc3RfZm9yX2VhY2hfc2FmZShxZSwgcWVuLCAmZmNwaW0tPml0bmltX3EpIHsKKwkJaXRuaW0gPSAoc3RydWN0IGJmYV9pdG5pbV9zICopIHFlOworCQliZmFfaXRuaW1fY2xlYXJfc3RhdHMoaXRuaW0pOworCX0KKwlmY3BpbS0+aW9fcHJvZmlsZSA9IEJGQV9UUlVFOworCWZjcGltLT5pb19wcm9maWxlX3N0YXJ0X3RpbWUgPSB0aW1lOworCWZjcGltLT5wcm9maWxlX2NvbXAgPSBiZmFfaW9pbV9wcm9maWxlX2NvbXA7CisJZmNwaW0tPnByb2ZpbGVfc3RhcnQgPSBiZmFfaW9pbV9wcm9maWxlX3N0YXJ0OworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCitiZmFfc3RhdHVzX3QKK2JmYV9mY3BpbV9wcm9maWxlX29mZihzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwlzdHJ1Y3QgYmZhX2ZjcGltX3MgKmZjcGltID0gQkZBX0ZDUElNKGJmYSk7CisJZmNwaW0tPmlvX3Byb2ZpbGUgPSBCRkFfRkFMU0U7CisJZmNwaW0tPmlvX3Byb2ZpbGVfc3RhcnRfdGltZSA9IDA7CisJZmNwaW0tPnByb2ZpbGVfY29tcCA9IE5VTEw7CisJZmNwaW0tPnByb2ZpbGVfc3RhcnQgPSBOVUxMOworCXJldHVybiBCRkFfU1RBVFVTX09LOworfQorCiB1MTYKIGJmYV9mY3BpbV9xZGVwdGhfZ2V0KHN0cnVjdCBiZmFfcyAqYmZhKQogewpAQCAtMTQwMSw2ICsxNDg5LDI2IEBACiAJCSBiZmFfc21fY21wX3N0YXRlKGl0bmltLCBiZmFfaXRuaW1fc21faW9jZGlzYWJsZSkpOwogfQogCisjZGVmaW5lIGJmYV9pb19sYXRfY2xvY2tfcmVzX2RpdglIWgorI2RlZmluZSBiZmFfaW9fbGF0X2Nsb2NrX3Jlc19tdWwJMTAwMAorYmZhX3N0YXR1c190CitiZmFfaXRuaW1fZ2V0X2lvcHJvZmlsZShzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltLAorCQkJc3RydWN0IGJmYV9pdG5pbV9pb3Byb2ZpbGVfcyAqaW9wcm9maWxlKQoreworCXN0cnVjdCBiZmFfZmNwaW1fcyAqZmNwaW0gPSBCRkFfRkNQSU0oaXRuaW0tPmJmYSk7CisJaWYgKCFmY3BpbS0+aW9fcHJvZmlsZSkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfSU9QUk9GSUxFX09GRjsKKworCWl0bmltLT5pb3Byb2ZpbGUuaW5kZXggPSBCRkFfSU9CVUNLRVRfTUFYOworCWl0bmltLT5pb3Byb2ZpbGUuaW9fcHJvZmlsZV9zdGFydF90aW1lID0KKwkJCQliZmFfaW9fcHJvZmlsZV9zdGFydF90aW1lKGl0bmltLT5iZmEpOworCWl0bmltLT5pb3Byb2ZpbGUuY2xvY2tfcmVzX211bCA9IGJmYV9pb19sYXRfY2xvY2tfcmVzX211bDsKKwlpdG5pbS0+aW9wcm9maWxlLmNsb2NrX3Jlc19kaXYgPSBiZmFfaW9fbGF0X2Nsb2NrX3Jlc19kaXY7CisJKmlvcHJvZmlsZSA9IGl0bmltLT5pb3Byb2ZpbGU7CisKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKwogdm9pZAogYmZhX2l0bmltX2NsZWFyX3N0YXRzKHN0cnVjdCBiZmFfaXRuaW1fcyAqaXRuaW0pCiB7CkBAIC0xNDY5LDcgKzE1NzcsMjggQEAKIAkJYmZhX3NtX3NldF9zdGF0ZShpb2ltLCBiZmFfaW9pbV9zbV9oY2IpOwogCQlXQVJOX09OKCFiZmFfcV9pc19vbl9xKCZpb2ltLT5pdG5pbS0+cGVuZGluZ19xLCBpb2ltKSk7CiAJCWJmYV9jYl9xdWV1ZShpb2ltLT5iZmEsICZpb2ltLT5oY2JfcWUsCi0JCQkJX19iZmFfY2JfaW9pbV9hYm9ydCwgaW9pbSk7CisJCQlfX2JmYV9jYl9pb2ltX2Fib3J0LCBpb2ltKTsKKwkJYnJlYWs7CisKKwljYXNlIEJGQV9JT0lNX1NNX0xNX0xVTl9OT1RfU1VQOgorCQliZmFfc21fc2V0X3N0YXRlKGlvaW0sIGJmYV9pb2ltX3NtX2hjYik7CisJCWJmYV9pb2ltX21vdmVfdG9fY29tcF9xKGlvaW0pOworCQliZmFfY2JfcXVldWUoaW9pbS0+YmZhLCAmaW9pbS0+aGNiX3FlLAorCQkJX19iZmFfY2JfaW9pbV9sbV9sdW5fbm90X3N1cCwgaW9pbSk7CisJCWJyZWFrOworCisJY2FzZSBCRkFfSU9JTV9TTV9MTV9SUExfREM6CisJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21faGNiKTsKKwkJYmZhX2lvaW1fbW92ZV90b19jb21wX3EoaW9pbSk7CisJCWJmYV9jYl9xdWV1ZShpb2ltLT5iZmEsICZpb2ltLT5oY2JfcWUsCisJCQkJX19iZmFfY2JfaW9pbV9sbV9ycGxfZGMsIGlvaW0pOworCQlicmVhazsKKworCWNhc2UgQkZBX0lPSU1fU01fTE1fTFVOX05PVF9SRFk6CisJCWJmYV9zbV9zZXRfc3RhdGUoaW9pbSwgYmZhX2lvaW1fc21faGNiKTsKKwkJYmZhX2lvaW1fbW92ZV90b19jb21wX3EoaW9pbSk7CisJCWJmYV9jYl9xdWV1ZShpb2ltLT5iZmEsICZpb2ltLT5oY2JfcWUsCisJCQlfX2JmYV9jYl9pb2ltX2xtX2x1bl9ub3RfcmR5LCBpb2ltKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtMjAwOSw2ICsyMTM4LDI2NCBAQAogCX0KIH0KIAorLyoKKyAqIFRoaXMgaXMgY2FsbGVkIGZyb20gYmZhX2ZjcGltX3N0YXJ0IGFmdGVyIHRoZSBiZmFfaW5pdCgpIHdpdGggZmxhc2ggcmVhZAorICogaXMgY29tcGxldGUgYnkgZHJpdmVyLiBub3cgaW52YWxpZGF0ZSB0aGUgc3RhbGUgY29udGVudCBvZiBsdW4gbWFzaworICogbGlrZSB1bml0IGF0dGVudGlvbiwgcnAgdGFnIGFuZCBscCB0YWcuCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfaW9pbV9sbV9pbml0KHN0cnVjdCBiZmFfcyAqYmZhKQoreworCXN0cnVjdCBiZmFfbHVuX21hc2tfcyAqbHVubV9saXN0OworCWludAlpOworCisJaWYgKGJmYV9nZXRfbHVuX21hc2tfc3RhdHVzKGJmYSkgPT0gQkZBX0xVTk1BU0tfTUlOQ0ZHKQorCQlyZXR1cm47CisKKwlsdW5tX2xpc3QgPSBiZmFfZ2V0X2x1bl9tYXNrX2xpc3QoYmZhKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xVTl9NQVNLX0NGRzsgaSsrKSB7CisJCWx1bm1fbGlzdFtpXS51YSA9IEJGQV9JT0lNX0xNX1VBX1JFU0VUOworCQlsdW5tX2xpc3RbaV0ubHBfdGFnID0gQkZBX0xQX1RBR19JTlZBTElEOworCQlsdW5tX2xpc3RbaV0ucnBfdGFnID0gQkZBX1JQT1JUX1RBR19JTlZBTElEOworCX0KK30KKworLyoKKyAqIFZhbGlkYXRlIExVTiBmb3IgTFVOIG1hc2tpbmcKKyAqLworc3RhdGljIGVudW0gYmZhX2lvaW1fbG1fc3RhdHVzCitiZmFfaW9pbV9sbV9jaGVjayhzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSwgc3RydWN0IGJmYV9scHNfcyAqbHBzLAorCQlzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwLCBzdHJ1Y3Qgc2NzaV9sdW4gbHVuKQoreworCXU4IGk7CisJc3RydWN0IGJmYV9sdW5fbWFza19zICpsdW5fbGlzdCA9IGJmYV9nZXRfbHVuX21hc2tfbGlzdChpb2ltLT5iZmEpOworCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQgPSAoc3RydWN0IHNjc2lfY21uZCAqKWlvaW0tPmRpbzsKKwlzdHJ1Y3Qgc2NzaV9jZGJfcyAqY2RiID0gKHN0cnVjdCBzY3NpX2NkYl9zICopY21uZC0+Y21uZDsKKworCWlmICgoY2RiLT5zY3NpX2NkYlswXSA9PSBSRVBPUlRfTFVOUykgJiYKKwkgICAgKHNjc2lsdW5fdG9faW50KChzdHJ1Y3Qgc2NzaV9sdW4gKikmbHVuKSA9PSAwKSkgeworCQlpb2ltLT5wcm9jX3JzcF9kYXRhID0gYmZhX2lvaW1fbG1fcHJvY19ycGxfZGF0YTsKKwkJcmV0dXJuIEJGQV9JT0lNX0xNX1BSRVNFTlQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE1BWF9MVU5fTUFTS19DRkc7IGkrKykgeworCisJCWlmIChsdW5fbGlzdFtpXS5zdGF0ZSAhPSBCRkFfSU9JTV9MVU5fTUFTS19BQ1RJVkUpCisJCQljb250aW51ZTsKKworCQlpZiAoKHNjc2lsdW5fdG9faW50KChzdHJ1Y3Qgc2NzaV9sdW4gKikmbHVuX2xpc3RbaV0ubHVuKSA9PQorCQkgICAgc2NzaWx1bl90b19pbnQoKHN0cnVjdCBzY3NpX2x1biAqKSZsdW4pKQorCQkgICAgJiYgKHJwLT5ycG9ydF90YWcgPT0gbHVuX2xpc3RbaV0ucnBfdGFnKQorCQkgICAgJiYgKCh1OClpb2ltLT5pdG5pbS0+cnBvcnQtPnJwb3J0X2luZm8ubHBfdGFnID09CisJCQkJCQlsdW5fbGlzdFtpXS5scF90YWcpKSB7CisJCQliZmFfdHJjKGlvaW0tPmJmYSwgbHVuX2xpc3RbaV0ucnBfdGFnKTsKKwkJCWJmYV90cmMoaW9pbS0+YmZhLCBsdW5fbGlzdFtpXS5scF90YWcpOworCQkJYmZhX3RyYyhpb2ltLT5iZmEsIHNjc2lsdW5fdG9faW50KAorCQkJCShzdHJ1Y3Qgc2NzaV9sdW4gKikmbHVuX2xpc3RbaV0ubHVuKSk7CisKKwkJCWlmICgobHVuX2xpc3RbaV0udWEgPT0gQkZBX0lPSU1fTE1fVUFfU0VUKSAmJgorCQkJICAgICgoY2RiLT5zY3NpX2NkYlswXSAhPSBJTlFVSVJZKSB8fAorCQkJICAgIChjZGItPnNjc2lfY2RiWzBdICE9IFJFUE9SVF9MVU5TKSkpIHsKKwkJCQlsdW5fbGlzdFtpXS51YSA9IEJGQV9JT0lNX0xNX1VBX1JFU0VUOworCQkJCXJldHVybiBCRkFfSU9JTV9MTV9SUExfREFUQV9DSEFOR0VEOworCQkJfQorCisJCQlpZiAoY2RiLT5zY3NpX2NkYlswXSA9PSBSRVBPUlRfTFVOUykKKwkJCQlpb2ltLT5wcm9jX3JzcF9kYXRhID0gYmZhX2lvaW1fbG1fcHJvY19ycGxfZGF0YTsKKworCQkJcmV0dXJuIEJGQV9JT0lNX0xNX1BSRVNFTlQ7CisJCX0KKwl9CisKKwlpZiAoKGNkYi0+c2NzaV9jZGJbMF0gPT0gSU5RVUlSWSkgJiYKKwkgICAgKHNjc2lsdW5fdG9faW50KChzdHJ1Y3Qgc2NzaV9sdW4gKikmbHVuKSA9PSAwKSkgeworCQlpb2ltLT5wcm9jX3JzcF9kYXRhID0gYmZhX2lvaW1fbG1fcHJvY19pbnFfZGF0YTsKKwkJcmV0dXJuIEJGQV9JT0lNX0xNX1BSRVNFTlQ7CisJfQorCisJaWYgKGNkYi0+c2NzaV9jZGJbMF0gPT0gVEVTVF9VTklUX1JFQURZKQorCQlyZXR1cm4gQkZBX0lPSU1fTE1fTFVOX05PVF9SRFk7CisKKwlyZXR1cm4gQkZBX0lPSU1fTE1fTFVOX05PVF9TVVA7Cit9CisKK3N0YXRpYyBiZmFfYm9vbGVhbl90CitiZmFfaW9pbV9sbV9wcm9jX3JzcF9kYXRhX2R1bW15KHN0cnVjdCBiZmFfaW9pbV9zICppb2ltKQoreworCXJldHVybiBCRkFfVFJVRTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9pb2ltX2xtX2ZldGNoX2x1bihzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSwgdTggKnJsX2RhdGEsIGludCBvZmZzZXQsCisJCWludCBidWZfbHVuX2NudCkKK3sKKwlzdHJ1Y3QgYmZhX2x1bl9tYXNrX3MgKmx1bl9saXN0ID0gYmZhX2dldF9sdW5fbWFza19saXN0KGlvaW0tPmJmYSk7CisJc3RydWN0IHNjc2lfbHVuICpsdW5fZGF0YSA9IChzdHJ1Y3Qgc2NzaV9sdW4gKikocmxfZGF0YSArIG9mZnNldCk7CisJc3RydWN0IHNjc2lfbHVuIGx1bjsKKwlpbnQgaSwgajsKKworCWJmYV90cmMoaW9pbS0+YmZhLCBidWZfbHVuX2NudCk7CisJZm9yIChqID0gMDsgaiA8IGJ1Zl9sdW5fY250OyBqKyspIHsKKwkJbHVuID0gKigoc3RydWN0IHNjc2lfbHVuICopKGx1bl9kYXRhICsgaikpOworCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0xVTl9NQVNLX0NGRzsgaSsrKSB7CisJCQlpZiAobHVuX2xpc3RbaV0uc3RhdGUgIT0gQkZBX0lPSU1fTFVOX01BU0tfQUNUSVZFKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKChsdW5fbGlzdFtpXS5ycF93d24gPT0gYmZhX2lvaW1fcnBfd3duKGlvaW0pKSAmJgorCQkJICAgIChsdW5fbGlzdFtpXS5scF93d24gPT0gYmZhX2lvaW1fbHBfd3duKGlvaW0pKSAmJgorCQkJICAgIChzY3NpbHVuX3RvX2ludCgoc3RydWN0IHNjc2lfbHVuICopJmx1bl9saXN0W2ldLmx1bikKKwkJCQk9PSBzY3NpbHVuX3RvX2ludCgoc3RydWN0IHNjc2lfbHVuICopJmx1bikpKSB7CisJCQkJbHVuX2xpc3RbaV0uc3RhdGUgPSBCRkFfSU9JTV9MVU5fTUFTS19GRVRDSEVEOworCQkJCWJyZWFrOworCQkJfQorCQl9IC8qIG5leHQgbHVuIGluIG1hc2sgREIgKi8KKwl9IC8qIG5leHQgbHVuIGluIGJ1ZiAqLworfQorCitzdGF0aWMgaW50CitiZmFfaW9pbV9sbV91cGRhdGVfbHVuX3NnKHN0cnVjdCBiZmFfaW9pbV9zICppb2ltLCB1MzIgKnBnZGxlbiwKKwkJc3RydWN0IHNjc2lfcmVwb3J0X2x1bnNfZGF0YV9zICpybCkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kID0gKHN0cnVjdCBzY3NpX2NtbmQgKilpb2ltLT5kaW87CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZyA9IHNjc2lfc2dsaXN0KGNtbmQpOworCXN0cnVjdCBiZmFfbHVuX21hc2tfcyAqbHVuX2xpc3QgPSBiZmFfZ2V0X2x1bl9tYXNrX2xpc3QoaW9pbS0+YmZhKTsKKwlzdHJ1Y3Qgc2NzaV9sdW4gKnByZXZfcmxfZGF0YSA9IE5VTEwsICpiYXNlX3JsX2RhdGE7CisJaW50IGksIGosIHNnZWlkLCBsdW5fZmV0Y2hlZF9jbnQgPSAwLCBwcmV2X3NnX2xlbiA9IDAsIGJhc2VfY291bnQ7CisJaW50IGx1bl9hY3Jvc3Nfc2dfYnl0ZXMsIGJ5dGVzX2Zyb21fbmV4dF9idWY7CisJdTY0CWxhc3RfbHVuLCB0ZW1wX2xhc3RfbHVuOworCisJLyogZmV0Y2ggbHVucyBmcm9tIHRoZSBmaXJzdCBzZyBlbGVtZW50ICovCisJYmZhX2lvaW1fbG1fZmV0Y2hfbHVuKGlvaW0sICh1OCAqKShybC0+bHVuKSwgMCwKKwkJCShzZ19kbWFfbGVuKHNnKSAvIHNpemVvZihzdHJ1Y3Qgc2NzaV9sdW4pKSAtIDEpOworCisJLyogZmV0Y2ggbHVucyBmcm9tIG11bHRpcGxlIHNnIGVsZW1lbnRzICovCisJc2NzaV9mb3JfZWFjaF9zZyhjbW5kLCBzZywgc2NzaV9zZ19jb3VudChjbW5kKSwgc2dlaWQpIHsKKwkJaWYgKHNnZWlkID09IDApIHsKKwkJCXByZXZfc2dfbGVuID0gc2dfZG1hX2xlbihzZyk7CisJCQlwcmV2X3JsX2RhdGEgPSAoc3RydWN0IHNjc2lfbHVuICopCisJCQkJCXBoeXNfdG9fdmlydChzZ19kbWFfYWRkcmVzcyhzZykpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBpZiB0aGUgYnVmIGlzIGhhdmluZyBtb3JlIGRhdGEgKi8KKwkJbHVuX2Fjcm9zc19zZ19ieXRlcyA9IHByZXZfc2dfbGVuICUgc2l6ZW9mKHN0cnVjdCBzY3NpX2x1bik7CisJCWlmIChsdW5fYWNyb3NzX3NnX2J5dGVzKSB7CisJCQliZmFfdHJjKGlvaW0tPmJmYSwgbHVuX2Fjcm9zc19zZ19ieXRlcyk7CisJCQliZmFfc3RhdHMoaW9pbS0+aXRuaW0sIGxtX2x1bl9hY3Jvc3Nfc2cpOworCQkJYnl0ZXNfZnJvbV9uZXh0X2J1ZiA9IHNpemVvZihzdHJ1Y3Qgc2NzaV9sdW4pIC0KKwkJCQkJICAgICAgbHVuX2Fjcm9zc19zZ19ieXRlczsKKworCQkJLyogZnJvbSBuZXh0IGJ1ZiB0YWtlIGhpZ2hlciBieXRlcyAqLworCQkJdGVtcF9sYXN0X2x1biA9ICooKHU2NCAqKQorCQkJCQkgIHBoeXNfdG9fdmlydChzZ19kbWFfYWRkcmVzcyhzZykpKTsKKwkJCWxhc3RfbHVuIHw9IHRlbXBfbGFzdF9sdW4gPj4KKwkJCQkgICAgKGx1bl9hY3Jvc3Nfc2dfYnl0ZXMgKiBCSVRTX1BFUl9CWVRFKTsKKworCQkJLyogZnJvbSBwcmV2IGJ1ZiB0YWtlIGhpZ2hlciBieXRlcyAqLworCQkJdGVtcF9sYXN0X2x1biA9ICooKHU2NCAqKShwcmV2X3JsX2RhdGEgKworCQkJCQkgIChwcmV2X3NnX2xlbiAtIGx1bl9hY3Jvc3Nfc2dfYnl0ZXMpKSk7CisJCQl0ZW1wX2xhc3RfbHVuID4+PSBieXRlc19mcm9tX25leHRfYnVmICogQklUU19QRVJfQllURTsKKwkJCWxhc3RfbHVuID0gbGFzdF9sdW4gfCAodGVtcF9sYXN0X2x1biA8PAorCQkJCSAgIChieXRlc19mcm9tX25leHRfYnVmICogQklUU19QRVJfQllURSkpOworCisJCQliZmFfaW9pbV9sbV9mZXRjaF9sdW4oaW9pbSwgKHU4ICopJmxhc3RfbHVuLCAwLCAxKTsKKwkJfSBlbHNlCisJCQlieXRlc19mcm9tX25leHRfYnVmID0gMDsKKworCQkqcGdkbGVuICs9IHNnX2RtYV9sZW4oc2cpOworCQlwcmV2X3NnX2xlbiA9IHNnX2RtYV9sZW4oc2cpOworCQlwcmV2X3JsX2RhdGEgPSAoc3RydWN0IHNjc2lfbHVuICopCisJCQkJcGh5c190b192aXJ0KHNnX2RtYV9hZGRyZXNzKHNnKSk7CisJCWJmYV9pb2ltX2xtX2ZldGNoX2x1bihpb2ltLCAodTggKilwcmV2X3JsX2RhdGEsCisJCQkJYnl0ZXNfZnJvbV9uZXh0X2J1ZiwKKwkJCQlzZ19kbWFfbGVuKHNnKSAvIHNpemVvZihzdHJ1Y3Qgc2NzaV9sdW4pKTsKKwl9CisKKwkvKiB1cGRhdGUgdGhlIHJlcG9ydCBsdW5zIGRhdGEgLSBiYXNlZCBvbiBmZXRjaGVkIGx1bnMgKi8KKwlzZyA9IHNjc2lfc2dsaXN0KGNtbmQpOworCWJhc2VfcmxfZGF0YSA9IChzdHJ1Y3Qgc2NzaV9sdW4gKilybC0+bHVuOworCWJhc2VfY291bnQgPSAoc2dfZG1hX2xlbihzZykgLyBzaXplb2Yoc3RydWN0IHNjc2lfbHVuKSkgLSAxOworCWZvciAoaSA9IDAsIGogPSAwOyBpIDwgTUFYX0xVTl9NQVNLX0NGRzsgaSsrKSB7CisJCWlmIChsdW5fbGlzdFtpXS5zdGF0ZSA9PSBCRkFfSU9JTV9MVU5fTUFTS19GRVRDSEVEKSB7CisJCQliYXNlX3JsX2RhdGFbal0gPSBsdW5fbGlzdFtpXS5sdW47CisJCQlsdW5fbGlzdFtpXS5zdGF0ZSA9IEJGQV9JT0lNX0xVTl9NQVNLX0FDVElWRTsKKwkJCWorKzsKKwkJCWx1bl9mZXRjaGVkX2NudCsrOworCQl9CisKKwkJaWYgKGogPiBiYXNlX2NvdW50KSB7CisJCQlqID0gMDsKKwkJCXNnID0gc2dfbmV4dChzZyk7CisJCQliYXNlX3JsX2RhdGEgPSAoc3RydWN0IHNjc2lfbHVuICopCisJCQkJCXBoeXNfdG9fdmlydChzZ19kbWFfYWRkcmVzcyhzZykpOworCQkJYmFzZV9jb3VudCA9IHNnX2RtYV9sZW4oc2cpIC8gc2l6ZW9mKHN0cnVjdCBzY3NpX2x1bik7CisJCX0KKwl9CisKKwliZmFfdHJjKGlvaW0tPmJmYSwgbHVuX2ZldGNoZWRfY250KTsKKwlyZXR1cm4gbHVuX2ZldGNoZWRfY250OworfQorCitzdGF0aWMgYmZhX2Jvb2xlYW5fdAorYmZhX2lvaW1fbG1fcHJvY19pbnFfZGF0YShzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSkKK3sKKwlzdHJ1Y3Qgc2NzaV9pbnF1aXJ5X2RhdGFfcyAqaW5xOworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2cgPSBzY3NpX3NnbGlzdCgoc3RydWN0IHNjc2lfY21uZCAqKWlvaW0tPmRpbyk7CisKKwlpb2ltLT5wcm9jX3JzcF9kYXRhID0gYmZhX2lvaW1fbG1fcHJvY19yc3BfZGF0YV9kdW1teTsKKwlpbnEgPSAoc3RydWN0IHNjc2lfaW5xdWlyeV9kYXRhX3MgKilwaHlzX3RvX3ZpcnQoc2dfZG1hX2FkZHJlc3Moc2cpKTsKKworCWJmYV90cmMoaW9pbS0+YmZhLCBpbnEtPmRldmljZV90eXBlKTsKKwlpbnEtPnBlcmlwaGVyYWxfcXVhbCA9IFNDU0lfSU5RX1BRX05PVF9DT047CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBiZmFfYm9vbGVhbl90CitiZmFfaW9pbV9sbV9wcm9jX3JwbF9kYXRhKHN0cnVjdCBiZmFfaW9pbV9zICppb2ltKQoreworCXN0cnVjdCBzY3NpX2NtbmQgKmNtbmQgPSAoc3RydWN0IHNjc2lfY21uZCAqKWlvaW0tPmRpbzsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnID0gc2NzaV9zZ2xpc3QoY21uZCk7CisJc3RydWN0IGJmaV9pb2ltX3JzcF9zICptOworCXN0cnVjdCBzY3NpX3JlcG9ydF9sdW5zX2RhdGFfcyAqcmwgPSBOVUxMOworCWludCBsdW5fY291bnQgPSAwLCBsdW5fZmV0Y2hlZF9jbnQgPSAwOworCXUzMiByZXNpZHVlLCBwZ2RsZW4gPSAwOworCisJaW9pbS0+cHJvY19yc3BfZGF0YSA9IGJmYV9pb2ltX2xtX3Byb2NfcnNwX2RhdGFfZHVtbXk7CisJaWYgKGJmYV9nZXRfbHVuX21hc2tfc3RhdHVzKGlvaW0tPmJmYSkgIT0gQkZBX0xVTk1BU0tfRU5BQkxFRCkKKwkJcmV0dXJuIEJGQV9UUlVFOworCisJbSA9IChzdHJ1Y3QgYmZpX2lvaW1fcnNwX3MgKikgJmlvaW0tPmlvc3AtPmNvbXBfcnNwbXNnOworCWlmIChtLT5zY3NpX3N0YXR1cyA9PSBTQ1NJX1NUQVRVU19DSEVDS19DT05ESVRJT04pCisJCXJldHVybiBCRkFfVFJVRTsKKworCXBnZGxlbiA9IHNnX2RtYV9sZW4oc2cpOworCWJmYV90cmMoaW9pbS0+YmZhLCBwZ2RsZW4pOworCXJsID0gKHN0cnVjdCBzY3NpX3JlcG9ydF9sdW5zX2RhdGFfcyAqKXBoeXNfdG9fdmlydChzZ19kbWFfYWRkcmVzcyhzZykpOworCWx1bl9jb3VudCA9IGNwdV90b19iZTMyKHJsLT5sdW5fbGlzdF9sZW5ndGgpIC8gc2l6ZW9mKHN0cnVjdCBzY3NpX2x1bik7CisJbHVuX2ZldGNoZWRfY250ID0gYmZhX2lvaW1fbG1fdXBkYXRlX2x1bl9zZyhpb2ltLCAmcGdkbGVuLCBybCk7CisKKwlpZiAobHVuX2NvdW50ID09IGx1bl9mZXRjaGVkX2NudCkKKwkJcmV0dXJuIEJGQV9UUlVFOworCisJYmZhX3RyYyhpb2ltLT5iZmEsIGx1bl9jb3VudCk7CisJYmZhX3RyYyhpb2ltLT5iZmEsIGx1bl9mZXRjaGVkX2NudCk7CisJYmZhX3RyYyhpb2ltLT5iZmEsIGJlMzJfdG9fY3B1KHJsLT5sdW5fbGlzdF9sZW5ndGgpKTsKKworCWlmIChiZTMyX3RvX2NwdShybC0+bHVuX2xpc3RfbGVuZ3RoKSA8PSBwZ2RsZW4pCisJCXJsLT5sdW5fbGlzdF9sZW5ndGggPSBiZTMyX3RvX2NwdShsdW5fZmV0Y2hlZF9jbnQpICoKKwkJCQkgICAgICBzaXplb2Yoc3RydWN0IHNjc2lfbHVuKTsKKwllbHNlCisJCWJmYV9zdGF0cyhpb2ltLT5pdG5pbSwgbG1fc21hbGxfYnVmX2FkZHJlc2lkdWUpOworCisJYmZhX3RyYyhpb2ltLT5iZmEsIGJlMzJfdG9fY3B1KHJsLT5sdW5fbGlzdF9sZW5ndGgpKTsKKwliZmFfdHJjKGlvaW0tPmJmYSwgYmUzMl90b19jcHUobS0+cmVzaWR1ZSkpOworCisJcmVzaWR1ZSA9IGJlMzJfdG9fY3B1KG0tPnJlc2lkdWUpOworCXJlc2lkdWUgKz0gKGx1bl9jb3VudCAtIGx1bl9mZXRjaGVkX2NudCkgKiBzaXplb2Yoc3RydWN0IHNjc2lfbHVuKTsKKwliZmFfc3RhdHMoaW9pbS0+aXRuaW0sIGxtX3dpcmVfcmVzaWR1ZV9jaGFuZ2VkKTsKKwltLT5yZXNpZHVlID0gYmUzMl90b19jcHUocmVzaWR1ZSk7CisJYmZhX3RyYyhpb2ltLT5iZmEsIGlvaW0tPm5zZ2VzKTsKKwlyZXR1cm4gQkZBX0ZBTFNFOworfQogCiBzdGF0aWMgdm9pZAogX19iZmFfY2JfaW9pbV9nb29kX2NvbXAodm9pZCAqY2JhcmcsIGJmYV9ib29sZWFuX3QgY29tcGxldGUpCkBAIC0yMDY4LDYgKzI0NTUsMjk5IEBACiB9CiAKIHN0YXRpYyB2b2lkCitfX2JmYV9jYl9pb2ltX2xtX2x1bl9ub3Rfc3VwKHZvaWQgKmNiYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKQoreworCXN0cnVjdCBiZmFfaW9pbV9zICppb2ltID0gY2Jhcmc7CisJaW50IHNuc19sZW4gPSAweEQ7CisJdTMyIHJlc2lkdWUgPSBzY3NpX2J1ZmZsZW4oKHN0cnVjdCBzY3NpX2NtbmQgKilpb2ltLT5kaW8pOworCXN0cnVjdCBzY3NpX3NlbnNlX3MgKnNuc2luZm87CisKKwlpZiAoIWNvbXBsZXRlKSB7CisJCWJmYV9zbV9zZW5kX2V2ZW50KGlvaW0sIEJGQV9JT0lNX1NNX0hDQik7CisJCXJldHVybjsKKwl9CisKKwlzbnNpbmZvID0gKHN0cnVjdCBzY3NpX3NlbnNlX3MgKilCRkFfU05TSU5GT19GUk9NX1RBRygKKwkJCQkJaW9pbS0+ZmNwaW0tPmZjcCwgaW9pbS0+aW90YWcpOworCXNuc2luZm8tPnJzcF9jb2RlID0gU0NTSV9TRU5TRV9DVVJfRVJSOworCXNuc2luZm8tPmFkZF9zZW5zZV9sZW5ndGggPSAweGE7CisJc25zaW5mby0+YXNjID0gU0NTSV9BU0NfTFVOX05PVF9TVVBQT1JURUQ7CisJc25zaW5mby0+c2Vuc2Vfa2V5ID0gSUxMRUdBTF9SRVFVRVNUOworCWJmYV90cmMoaW9pbS0+YmZhLCByZXNpZHVlKTsKKwliZmFfY2JfaW9pbV9kb25lKGlvaW0tPmJmYS0+YmZhZCwgaW9pbS0+ZGlvLCBCRklfSU9JTV9TVFNfT0ssCisJCQlTQ1NJX1NUQVRVU19DSEVDS19DT05ESVRJT04sIHNuc19sZW4sCisJCQkodTggKilzbnNpbmZvLCByZXNpZHVlKTsKK30KKworc3RhdGljIHZvaWQKK19fYmZhX2NiX2lvaW1fbG1fcnBsX2RjKHZvaWQgKmNiYXJnLCBiZmFfYm9vbGVhbl90IGNvbXBsZXRlKQoreworCXN0cnVjdCBiZmFfaW9pbV9zICppb2ltID0gY2Jhcmc7CisJaW50IHNuc19sZW4gPSAweEQ7CisJdTMyIHJlc2lkdWUgPSBzY3NpX2J1ZmZsZW4oKHN0cnVjdCBzY3NpX2NtbmQgKilpb2ltLT5kaW8pOworCXN0cnVjdCBzY3NpX3NlbnNlX3MgKnNuc2luZm87CisKKwlpZiAoIWNvbXBsZXRlKSB7CisJCWJmYV9zbV9zZW5kX2V2ZW50KGlvaW0sIEJGQV9JT0lNX1NNX0hDQik7CisJCXJldHVybjsKKwl9CisKKwlzbnNpbmZvID0gKHN0cnVjdCBzY3NpX3NlbnNlX3MgKilCRkFfU05TSU5GT19GUk9NX1RBRyhpb2ltLT5mY3BpbS0+ZmNwLAorCQkJCQkJICAgICAgIGlvaW0tPmlvdGFnKTsKKwlzbnNpbmZvLT5yc3BfY29kZSA9IFNDU0lfU0VOU0VfQ1VSX0VSUjsKKwlzbnNpbmZvLT5zZW5zZV9rZXkgPSBTQ1NJX01QX0lFQ19VTklUX0FUVE47CisJc25zaW5mby0+YXNjID0gU0NTSV9BU0NfVE9DQzsKKwlzbnNpbmZvLT5hZGRfc2Vuc2VfbGVuZ3RoID0gMHg2OworCXNuc2luZm8tPmFzY3EgPSBTQ1NJX0FTQ1FfUkxfREFUQV9DSEFOR0VEOworCWJmYV90cmMoaW9pbS0+YmZhLCByZXNpZHVlKTsKKwliZmFfY2JfaW9pbV9kb25lKGlvaW0tPmJmYS0+YmZhZCwgaW9pbS0+ZGlvLCBCRklfSU9JTV9TVFNfT0ssCisJCQlTQ1NJX1NUQVRVU19DSEVDS19DT05ESVRJT04sIHNuc19sZW4sCisJCQkodTggKilzbnNpbmZvLCByZXNpZHVlKTsKK30KKworc3RhdGljIHZvaWQKK19fYmZhX2NiX2lvaW1fbG1fbHVuX25vdF9yZHkodm9pZCAqY2JhcmcsIGJmYV9ib29sZWFuX3QgY29tcGxldGUpCit7CisJc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0gPSBjYmFyZzsKKwlpbnQgc25zX2xlbiA9IDB4RDsKKwl1MzIgcmVzaWR1ZSA9IHNjc2lfYnVmZmxlbigoc3RydWN0IHNjc2lfY21uZCAqKWlvaW0tPmRpbyk7CisJc3RydWN0IHNjc2lfc2Vuc2VfcyAqc25zaW5mbzsKKworCWlmICghY29tcGxldGUpIHsKKwkJYmZhX3NtX3NlbmRfZXZlbnQoaW9pbSwgQkZBX0lPSU1fU01fSENCKTsKKwkJcmV0dXJuOworCX0KKworCXNuc2luZm8gPSAoc3RydWN0IHNjc2lfc2Vuc2VfcyAqKUJGQV9TTlNJTkZPX0ZST01fVEFHKAorCQkJCQlpb2ltLT5mY3BpbS0+ZmNwLCBpb2ltLT5pb3RhZyk7CisJc25zaW5mby0+cnNwX2NvZGUgPSBTQ1NJX1NFTlNFX0NVUl9FUlI7CisJc25zaW5mby0+YWRkX3NlbnNlX2xlbmd0aCA9IDB4YTsKKwlzbnNpbmZvLT5zZW5zZV9rZXkgPSBOT1RfUkVBRFk7CisJc25zaW5mby0+YXNjID0gU0NTSV9BU0NfTFVOX05PVF9SRUFEWTsKKwlzbnNpbmZvLT5hc2NxID0gU0NTSV9BU0NRX01BTl9JTlRSX1JFUTsKKwliZmFfdHJjKGlvaW0tPmJmYSwgcmVzaWR1ZSk7CisJYmZhX2NiX2lvaW1fZG9uZShpb2ltLT5iZmEtPmJmYWQsIGlvaW0tPmRpbywgQkZJX0lPSU1fU1RTX09LLAorCQkJU0NTSV9TVEFUVVNfQ0hFQ0tfQ09ORElUSU9OLCBzbnNfbGVuLAorCQkJKHU4ICopc25zaW5mbywgcmVzaWR1ZSk7Cit9CisKK3ZvaWQKK2JmYV9mY3BpbV9sdW5tYXNrX3JwX3VwZGF0ZShzdHJ1Y3QgYmZhX3MgKmJmYSwgd3duX3QgbHBfd3duLCB3d25fdCBycF93d24sCisJCQl1MTYgcnBfdGFnLCB1OCBscF90YWcpCit7CisJc3RydWN0IGJmYV9sdW5fbWFza19zICpsdW5fbGlzdDsKKwl1OAlpOworCisJaWYgKGJmYV9nZXRfbHVuX21hc2tfc3RhdHVzKGJmYSkgPT0gQkZBX0xVTk1BU0tfTUlOQ0ZHKQorCQlyZXR1cm47CisKKwlsdW5fbGlzdCA9IGJmYV9nZXRfbHVuX21hc2tfbGlzdChiZmEpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfTFVOX01BU0tfQ0ZHOyBpKyspIHsKKwkJaWYgKGx1bl9saXN0W2ldLnN0YXRlID09IEJGQV9JT0lNX0xVTl9NQVNLX0FDVElWRSkgeworCQkJaWYgKChsdW5fbGlzdFtpXS5scF93d24gPT0gbHBfd3duKSAmJgorCQkJICAgIChsdW5fbGlzdFtpXS5ycF93d24gPT0gcnBfd3duKSkgeworCQkJCWx1bl9saXN0W2ldLnJwX3RhZyA9IHJwX3RhZzsKKwkJCQlsdW5fbGlzdFtpXS5scF90YWcgPSBscF90YWc7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisgKiBzZXQgVUEgZm9yIGFsbCBhY3RpdmUgbHVucyBpbiBMTSBEQgorICovCitzdGF0aWMgdm9pZAorYmZhX2lvaW1fbG1fc2V0X3VhKHN0cnVjdCBiZmFfcyAqYmZhKQoreworCXN0cnVjdCBiZmFfbHVuX21hc2tfcwkqbHVubV9saXN0OworCWludAlpOworCisJbHVubV9saXN0ID0gYmZhX2dldF9sdW5fbWFza19saXN0KGJmYSk7CisJZm9yIChpID0gMDsgaSA8IE1BWF9MVU5fTUFTS19DRkc7IGkrKykgeworCQlpZiAobHVubV9saXN0W2ldLnN0YXRlICE9IEJGQV9JT0lNX0xVTl9NQVNLX0FDVElWRSkKKwkJCWNvbnRpbnVlOworCQlsdW5tX2xpc3RbaV0udWEgPSBCRkFfSU9JTV9MTV9VQV9TRVQ7CisJfQorfQorCitiZmFfc3RhdHVzX3QKK2JmYV9mY3BpbV9sdW5tYXNrX3VwZGF0ZShzdHJ1Y3QgYmZhX3MgKmJmYSwgdTMyIHVwZGF0ZSkKK3sKKwlzdHJ1Y3QgYmZhX2x1bm1hc2tfY2ZnX3MJKmx1bl9tYXNrOworCisJYmZhX3RyYyhiZmEsIGJmYV9nZXRfbHVuX21hc2tfc3RhdHVzKGJmYSkpOworCWlmIChiZmFfZ2V0X2x1bl9tYXNrX3N0YXR1cyhiZmEpID09IEJGQV9MVU5NQVNLX01JTkNGRykKKwkJcmV0dXJuIEJGQV9TVEFUVVNfRkFJTEVEOworCisJaWYgKGJmYV9nZXRfbHVuX21hc2tfc3RhdHVzKGJmYSkgPT0gdXBkYXRlKQorCQlyZXR1cm4gQkZBX1NUQVRVU19OT19DSEFOR0U7CisKKwlsdW5fbWFzayA9IGJmYV9nZXRfbHVuX21hc2soYmZhKTsKKwlsdW5fbWFzay0+c3RhdHVzID0gdXBkYXRlOworCisJaWYgKGJmYV9nZXRfbHVuX21hc2tfc3RhdHVzKGJmYSkgPT0gQkZBX0xVTk1BU0tfRU5BQkxFRCkKKwkJYmZhX2lvaW1fbG1fc2V0X3VhKGJmYSk7CisKKwlyZXR1cm4gIGJmYV9kY29uZl91cGRhdGUoYmZhKTsKK30KKworYmZhX3N0YXR1c190CitiZmFfZmNwaW1fbHVubWFza19jbGVhcihzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYmZhX2x1bl9tYXNrX3MJKmx1bm1fbGlzdDsKKworCWJmYV90cmMoYmZhLCBiZmFfZ2V0X2x1bl9tYXNrX3N0YXR1cyhiZmEpKTsKKwlpZiAoYmZhX2dldF9sdW5fbWFza19zdGF0dXMoYmZhKSA9PSBCRkFfTFVOTUFTS19NSU5DRkcpCisJCXJldHVybiBCRkFfU1RBVFVTX0ZBSUxFRDsKKworCWx1bm1fbGlzdCA9IGJmYV9nZXRfbHVuX21hc2tfbGlzdChiZmEpOworCWZvciAoaSA9IDA7IGkgPCBNQVhfTFVOX01BU0tfQ0ZHOyBpKyspIHsKKwkJaWYgKGx1bm1fbGlzdFtpXS5zdGF0ZSA9PSBCRkFfSU9JTV9MVU5fTUFTS19BQ1RJVkUpIHsKKwkJCWlmIChsdW5tX2xpc3RbaV0ucnBfdGFnICE9IEJGQV9SUE9SVF9UQUdfSU5WQUxJRCkKKwkJCQliZmFfcnBvcnRfdW5zZXRfbHVubWFzayhiZmEsCisJCQkJICBCRkFfUlBPUlRfRlJPTV9UQUcoYmZhLCBsdW5tX2xpc3RbaV0ucnBfdGFnKSk7CisJCX0KKwl9CisKKwltZW1zZXQobHVubV9saXN0LCAwLCBzaXplb2Yoc3RydWN0IGJmYV9sdW5fbWFza19zKSAqIE1BWF9MVU5fTUFTS19DRkcpOworCXJldHVybiBiZmFfZGNvbmZfdXBkYXRlKGJmYSk7Cit9CisKK2JmYV9zdGF0dXNfdAorYmZhX2ZjcGltX2x1bm1hc2tfcXVlcnkoc3RydWN0IGJmYV9zICpiZmEsIHZvaWQgKmJ1ZikKK3sKKwlzdHJ1Y3QgYmZhX2x1bm1hc2tfY2ZnX3MgKmx1bl9tYXNrOworCisJYmZhX3RyYyhiZmEsIGJmYV9nZXRfbHVuX21hc2tfc3RhdHVzKGJmYSkpOworCWlmIChiZmFfZ2V0X2x1bl9tYXNrX3N0YXR1cyhiZmEpID09IEJGQV9MVU5NQVNLX01JTkNGRykKKwkJcmV0dXJuIEJGQV9TVEFUVVNfRkFJTEVEOworCisJbHVuX21hc2sgPSBiZmFfZ2V0X2x1bl9tYXNrKGJmYSk7CisJbWVtY3B5KGJ1ZiwgbHVuX21hc2ssIHNpemVvZihzdHJ1Y3QgYmZhX2x1bm1hc2tfY2ZnX3MpKTsKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKworYmZhX3N0YXR1c190CitiZmFfZmNwaW1fbHVubWFza19hZGQoc3RydWN0IGJmYV9zICpiZmEsIHUxNiB2Zl9pZCwgd3duX3QgKnB3d24sCisJCSAgICAgIHd3bl90IHJwd3duLCBzdHJ1Y3Qgc2NzaV9sdW4gbHVuKQoreworCXN0cnVjdCBiZmFfbHVuX21hc2tfcyAqbHVubV9saXN0OworCXN0cnVjdCBiZmFfcnBvcnRfcyAqcnAgPSBOVUxMOworCWludCBpLCBmcmVlX2luZGV4ID0gTUFYX0xVTl9NQVNLX0NGRyArIDE7CisJc3RydWN0IGJmYV9mY3NfbHBvcnRfcyAqcG9ydCA9IE5VTEw7CisJc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqcnBfZmNzOworCisJYmZhX3RyYyhiZmEsIGJmYV9nZXRfbHVuX21hc2tfc3RhdHVzKGJmYSkpOworCWlmIChiZmFfZ2V0X2x1bl9tYXNrX3N0YXR1cyhiZmEpID09IEJGQV9MVU5NQVNLX01JTkNGRykKKwkJcmV0dXJuIEJGQV9TVEFUVVNfRkFJTEVEOworCisJcG9ydCA9IGJmYV9mY3NfbG9va3VwX3BvcnQoJigoc3RydWN0IGJmYWRfcyAqKWJmYS0+YmZhZCktPmJmYV9mY3MsCisJCQkJICAgdmZfaWQsICpwd3duKTsKKwlpZiAocG9ydCkgeworCQkqcHd3biA9IHBvcnQtPnBvcnRfY2ZnLnB3d247CisJCXJwX2ZjcyA9IGJmYV9mY3NfbHBvcnRfZ2V0X3Jwb3J0X2J5X3B3d24ocG9ydCwgcnB3d24pOworCQlycCA9IHJwX2Zjcy0+YmZhX3Jwb3J0OworCX0KKworCWx1bm1fbGlzdCA9IGJmYV9nZXRfbHVuX21hc2tfbGlzdChiZmEpOworCS8qIGlmIGVudHJ5IGV4aXN0cyAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfTFVOX01BU0tfQ0ZHOyBpKyspIHsKKwkJaWYgKGx1bm1fbGlzdFtpXS5zdGF0ZSAhPSBCRkFfSU9JTV9MVU5fTUFTS19BQ1RJVkUpCisJCQlmcmVlX2luZGV4ID0gaTsKKwkJaWYgKChsdW5tX2xpc3RbaV0ubHBfd3duID09ICpwd3duKSAmJgorCQkgICAgKGx1bm1fbGlzdFtpXS5ycF93d24gPT0gcnB3d24pICYmCisJCSAgICAoc2NzaWx1bl90b19pbnQoKHN0cnVjdCBzY3NpX2x1biAqKSZsdW5tX2xpc3RbaV0ubHVuKSA9PQorCQkgICAgIHNjc2lsdW5fdG9faW50KChzdHJ1Y3Qgc2NzaV9sdW4gKikmbHVuKSkpCisJCQlyZXR1cm4gIEJGQV9TVEFUVVNfRU5UUllfRVhJU1RTOworCX0KKworCWlmIChmcmVlX2luZGV4ID4gTUFYX0xVTl9NQVNLX0NGRykKKwkJcmV0dXJuIEJGQV9TVEFUVVNfTUFYX0VOVFJZX1JFQUNIRUQ7CisKKwlpZiAocnApIHsKKwkJbHVubV9saXN0W2ZyZWVfaW5kZXhdLmxwX3RhZyA9IGJmYV9scHNfZ2V0X3RhZ19mcm9tX3BpZChiZmEsCisJCQkJCQkgICBycC0+cnBvcnRfaW5mby5sb2NhbF9waWQpOworCQlsdW5tX2xpc3RbZnJlZV9pbmRleF0ucnBfdGFnID0gcnAtPnJwb3J0X3RhZzsKKwl9IGVsc2UgeworCQlsdW5tX2xpc3RbZnJlZV9pbmRleF0ubHBfdGFnID0gQkZBX0xQX1RBR19JTlZBTElEOworCQlsdW5tX2xpc3RbZnJlZV9pbmRleF0ucnBfdGFnID0gQkZBX1JQT1JUX1RBR19JTlZBTElEOworCX0KKworCWx1bm1fbGlzdFtmcmVlX2luZGV4XS5scF93d24gPSAqcHd3bjsKKwlsdW5tX2xpc3RbZnJlZV9pbmRleF0ucnBfd3duID0gcnB3d247CisJbHVubV9saXN0W2ZyZWVfaW5kZXhdLmx1biA9IGx1bjsKKwlsdW5tX2xpc3RbZnJlZV9pbmRleF0uc3RhdGUgPSBCRkFfSU9JTV9MVU5fTUFTS19BQ1RJVkU7CisKKwkvKiBzZXQgZm9yIGFsbCBsdW5zIGluIHRoaXMgcnAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0xVTl9NQVNLX0NGRzsgaSsrKSB7CisJCWlmICgobHVubV9saXN0W2ldLmxwX3d3biA9PSAqcHd3bikgJiYKKwkJICAgIChsdW5tX2xpc3RbaV0ucnBfd3duID09IHJwd3duKSkKKwkJCWx1bm1fbGlzdFtpXS51YSA9IEJGQV9JT0lNX0xNX1VBX1NFVDsKKwl9CisKKwlyZXR1cm4gYmZhX2Rjb25mX3VwZGF0ZShiZmEpOworfQorCitiZmFfc3RhdHVzX3QKK2JmYV9mY3BpbV9sdW5tYXNrX2RlbGV0ZShzdHJ1Y3QgYmZhX3MgKmJmYSwgdTE2IHZmX2lkLCB3d25fdCAqcHd3biwKKwkJCSB3d25fdCBycHd3biwgc3RydWN0IHNjc2lfbHVuIGx1bikKK3sKKwlzdHJ1Y3QgYmZhX2x1bl9tYXNrX3MJKmx1bm1fbGlzdDsKKwlzdHJ1Y3QgYmZhX3Jwb3J0X3MJKnJwID0gTlVMTDsKKwlzdHJ1Y3QgYmZhX2Zjc19scG9ydF9zICpwb3J0ID0gTlVMTDsKKwlzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycF9mY3M7CisJaW50CWk7CisKKwkvKiBpbiBtaW4gY2ZnIGx1bm1fbGlzdCBjb3VsZCBiZSBOVUxMIGJ1dCAgbm8gY29tbWFuZHMgc2hvdWxkIHJ1bi4gKi8KKwlpZiAoYmZhX2dldF9sdW5fbWFza19zdGF0dXMoYmZhKSA9PSBCRkFfTFVOTUFTS19NSU5DRkcpCisJCXJldHVybiBCRkFfU1RBVFVTX0ZBSUxFRDsKKworCWJmYV90cmMoYmZhLCBiZmFfZ2V0X2x1bl9tYXNrX3N0YXR1cyhiZmEpKTsKKwliZmFfdHJjKGJmYSwgKnB3d24pOworCWJmYV90cmMoYmZhLCBycHd3bik7CisJYmZhX3RyYyhiZmEsIHNjc2lsdW5fdG9faW50KChzdHJ1Y3Qgc2NzaV9sdW4gKikmbHVuKSk7CisKKwlpZiAoKnB3d24gPT0gMCkgeworCQlwb3J0ID0gYmZhX2Zjc19sb29rdXBfcG9ydCgKKwkJCQkmKChzdHJ1Y3QgYmZhZF9zICopYmZhLT5iZmFkKS0+YmZhX2ZjcywKKwkJCQl2Zl9pZCwgKnB3d24pOworCQlpZiAocG9ydCkgeworCQkJKnB3d24gPSBwb3J0LT5wb3J0X2NmZy5wd3duOworCQkJcnBfZmNzID0gYmZhX2Zjc19scG9ydF9nZXRfcnBvcnRfYnlfcHd3bihwb3J0LCBycHd3bik7CisJCQlycCA9IHJwX2Zjcy0+YmZhX3Jwb3J0OworCQl9CisJfQorCisJbHVubV9saXN0ID0gYmZhX2dldF9sdW5fbWFza19saXN0KGJmYSk7CisJZm9yIChpID0gMDsgaSA8IE1BWF9MVU5fTUFTS19DRkc7IGkrKykgeworCQlpZiAoKGx1bm1fbGlzdFtpXS5scF93d24gPT0gKnB3d24pICYmCisJCSAgICAobHVubV9saXN0W2ldLnJwX3d3biA9PSBycHd3bikgJiYKKwkJICAgIChzY3NpbHVuX3RvX2ludCgoc3RydWN0IHNjc2lfbHVuICopJmx1bm1fbGlzdFtpXS5sdW4pID09CisJCSAgICAgc2NzaWx1bl90b19pbnQoKHN0cnVjdCBzY3NpX2x1biAqKSZsdW4pKSkgeworCQkJbHVubV9saXN0W2ldLmxwX3d3biA9IDA7CisJCQlsdW5tX2xpc3RbaV0ucnBfd3duID0gMDsKKwkJCWludF90b19zY3NpbHVuKDAsICZsdW5tX2xpc3RbaV0ubHVuKTsKKwkJCWx1bm1fbGlzdFtpXS5zdGF0ZSA9IEJGQV9JT0lNX0xVTl9NQVNLX0lOQUNUSVZFOworCQkJaWYgKGx1bm1fbGlzdFtpXS5ycF90YWcgIT0gQkZBX1JQT1JUX1RBR19JTlZBTElEKSB7CisJCQkJbHVubV9saXN0W2ldLnJwX3RhZyA9IEJGQV9SUE9SVF9UQUdfSU5WQUxJRDsKKwkJCQlsdW5tX2xpc3RbaV0ubHBfdGFnID0gQkZBX0xQX1RBR19JTlZBTElEOworCQkJfQorCQkJcmV0dXJuIGJmYV9kY29uZl91cGRhdGUoYmZhKTsKKwkJfQorCX0KKworCS8qIHNldCBmb3IgYWxsIGx1bnMgaW4gdGhpcyBycCAqLworCWZvciAoaSA9IDA7IGkgPCBNQVhfTFVOX01BU0tfQ0ZHOyBpKyspIHsKKwkJaWYgKChsdW5tX2xpc3RbaV0ubHBfd3duID09ICpwd3duKSAmJgorCQkgICAgKGx1bm1fbGlzdFtpXS5ycF93d24gPT0gcnB3d24pKQorCQkJbHVubV9saXN0W2ldLnVhID0gQkZBX0lPSU1fTE1fVUFfU0VUOworCX0KKworCXJldHVybiBCRkFfU1RBVFVTX0VOVFJZX05PVF9FWElTVFM7Cit9CisKK3N0YXRpYyB2b2lkCiBfX2JmYV9jYl9pb2ltX2ZhaWxlZCh2b2lkICpjYmFyZywgYmZhX2Jvb2xlYW5fdCBjb21wbGV0ZSkKIHsKIAlzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSA9IGNiYXJnOwpAQCAtMjA3Nyw2ICsyNzU3LDcgQEAKIAkJcmV0dXJuOwogCX0KIAorCWlvaW0tPnByb2NfcnNwX2RhdGEgPSBiZmFfaW9pbV9sbV9wcm9jX3JzcF9kYXRhX2R1bW15OwogCWJmYV9jYl9pb2ltX2RvbmUoaW9pbS0+YmZhLT5iZmFkLCBpb2ltLT5kaW8sIEJGSV9JT0lNX1NUU19BQk9SVEVELAogCQkJICAwLCAwLCBOVUxMLCAwKTsKIH0KQEAgLTIwOTIsNiArMjc3Myw3IEBACiAJCXJldHVybjsKIAl9CiAKKwlpb2ltLT5wcm9jX3JzcF9kYXRhID0gYmZhX2lvaW1fbG1fcHJvY19yc3BfZGF0YV9kdW1teTsKIAliZmFfY2JfaW9pbV9kb25lKGlvaW0tPmJmYS0+YmZhZCwgaW9pbS0+ZGlvLCBCRklfSU9JTV9TVFNfUEFUSFRPViwKIAkJCSAgMCwgMCwgTlVMTCwgMCk7CiB9CkBAIC0yMTA2LDYgKzI3ODgsNyBAQAogCQlyZXR1cm47CiAJfQogCisJaW9pbS0+cHJvY19yc3BfZGF0YSA9IGJmYV9pb2ltX2xtX3Byb2NfcnNwX2RhdGFfZHVtbXk7CiAJYmZhX2NiX2lvaW1fYWJvcnQoaW9pbS0+YmZhLT5iZmFkLCBpb2ltLT5kaW8pOwogfQogCkBAIC0yNDQ5LDYgKzMxMzIsNyBAQAogCQlpb2ltLT5iZmEgICAgID0gZmNwaW0tPmJmYTsKIAkJaW9pbS0+ZmNwaW0gICA9IGZjcGltOwogCQlpb2ltLT5pb3NwICAgID0gaW9zcDsKKwkJaW9pbS0+cHJvY19yc3BfZGF0YSA9IGJmYV9pb2ltX2xtX3Byb2NfcnNwX2RhdGFfZHVtbXk7CiAJCUlOSVRfTElTVF9IRUFEKCZpb2ltLT5zZ3BnX3EpOwogCQliZmFfcmVxcV93aW5pdCgmaW9pbS0+aW9zcC0+cmVxcV93YWl0LAogCQkJCSAgIGJmYV9pb2ltX3FyZXN1bWUsIGlvaW0pOwpAQCAtMjQ4Niw2ICszMTcwLDcgQEAKIAkJCWV2dCA9IEJGQV9JT0lNX1NNX0RPTkU7CiAJCWVsc2UKIAkJCWV2dCA9IEJGQV9JT0lNX1NNX0NPTVA7CisJCWlvaW0tPnByb2NfcnNwX2RhdGEoaW9pbSk7CiAJCWJyZWFrOwogCiAJY2FzZSBCRklfSU9JTV9TVFNfVElNRURPVVQ6CkBAIC0yNTIxLDYgKzMyMDYsNyBAQAogCQlpZiAocnNwLT5hYm9ydF90YWcgIT0gaW9pbS0+YWJvcnRfdGFnKSB7CiAJCQliZmFfdHJjKGlvaW0tPmJmYSwgcnNwLT5hYm9ydF90YWcpOwogCQkJYmZhX3RyYyhpb2ltLT5iZmEsIGlvaW0tPmFib3J0X3RhZyk7CisJCQlpb2ltLT5wcm9jX3JzcF9kYXRhID0gYmZhX2lvaW1fbG1fcHJvY19yc3BfZGF0YV9kdW1teTsKIAkJCXJldHVybjsKIAkJfQogCkBAIC0yNTM5LDYgKzMyMjUsNyBAQAogCQlXQVJOX09OKDEpOwogCX0KIAorCWlvaW0tPnByb2NfcnNwX2RhdGEgPSBiZmFfaW9pbV9sbV9wcm9jX3JzcF9kYXRhX2R1bW15OwogCWJmYV9zbV9zZW5kX2V2ZW50KGlvaW0sIGV2dCk7CiB9CiAKQEAgLTI1NTYsNyArMzI0MywxNiBAQAogCVdBUk5fT04oQkZBX0lPSU1fVEFHXzJfSUQoaW9pbS0+aW90YWcpICE9IGlvdGFnKTsKIAogCWJmYV9pb2ltX2NiX3Byb2ZpbGVfY29tcChmY3BpbSwgaW9pbSk7Ci0JYmZhX3NtX3NlbmRfZXZlbnQoaW9pbSwgQkZBX0lPSU1fU01fQ09NUF9HT09EKTsKKworCWlmIChiZmFfZ2V0X2x1bl9tYXNrX3N0YXR1cyhiZmEpICE9IEJGQV9MVU5NQVNLX0VOQUJMRUQpICB7CisJCWJmYV9zbV9zZW5kX2V2ZW50KGlvaW0sIEJGQV9JT0lNX1NNX0NPTVBfR09PRCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaW9pbS0+cHJvY19yc3BfZGF0YShpb2ltKSA9PSBCRkFfVFJVRSkKKwkJYmZhX3NtX3NlbmRfZXZlbnQoaW9pbSwgQkZBX0lPSU1fU01fQ09NUF9HT09EKTsKKwllbHNlCisJCWJmYV9zbV9zZW5kX2V2ZW50KGlvaW0sIEJGQV9JT0lNX1NNX0NPTVApOwogfQogCiAvKgpAQCAtMjY2OCw2ICszMzY0LDM1IEBACiB2b2lkCiBiZmFfaW9pbV9zdGFydChzdHJ1Y3QgYmZhX2lvaW1fcyAqaW9pbSkKIHsKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpjbW5kID0gKHN0cnVjdCBzY3NpX2NtbmQgKilpb2ltLT5kaW87CisJc3RydWN0IGJmYV9scHNfcwkqbHBzOworCWVudW0gYmZhX2lvaW1fbG1fc3RhdHVzIHN0YXR1czsKKwlzdHJ1Y3Qgc2NzaV9sdW4gc2NzaWx1bjsKKworCWlmIChiZmFfZ2V0X2x1bl9tYXNrX3N0YXR1cyhpb2ltLT5iZmEpID09IEJGQV9MVU5NQVNLX0VOQUJMRUQpIHsKKwkJbHBzID0gQkZBX0lPSU1fVE9fTFBTKGlvaW0pOworCQlpbnRfdG9fc2NzaWx1bihjbW5kLT5kZXZpY2UtPmx1biwgJnNjc2lsdW4pOworCQlzdGF0dXMgPSBiZmFfaW9pbV9sbV9jaGVjayhpb2ltLCBscHMsCisJCQkJaW9pbS0+aXRuaW0tPnJwb3J0LCBzY3NpbHVuKTsKKwkJaWYgKHN0YXR1cyA9PSBCRkFfSU9JTV9MTV9MVU5fTk9UX1JEWSkgeworCQkJYmZhX3NtX3NlbmRfZXZlbnQoaW9pbSwgQkZBX0lPSU1fU01fTE1fTFVOX05PVF9SRFkpOworCQkJYmZhX3N0YXRzKGlvaW0tPml0bmltLCBsbV9sdW5fbm90X3JkeSk7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoc3RhdHVzID09IEJGQV9JT0lNX0xNX0xVTl9OT1RfU1VQKSB7CisJCQliZmFfc21fc2VuZF9ldmVudChpb2ltLCBCRkFfSU9JTV9TTV9MTV9MVU5fTk9UX1NVUCk7CisJCQliZmFfc3RhdHMoaW9pbS0+aXRuaW0sIGxtX2x1bl9ub3Rfc3VwKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChzdGF0dXMgPT0gQkZBX0lPSU1fTE1fUlBMX0RBVEFfQ0hBTkdFRCkgeworCQkJYmZhX3NtX3NlbmRfZXZlbnQoaW9pbSwgQkZBX0lPSU1fU01fTE1fUlBMX0RDKTsKKwkJCWJmYV9zdGF0cyhpb2ltLT5pdG5pbSwgbG1fcnBsX2RhdGFfY2hhbmdlZCk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKIAliZmFfaW9pbV9jYl9wcm9maWxlX3N0YXJ0KGlvaW0tPmZjcGltLCBpb2ltKTsKIAogCS8qCkBAIC0zNDExLDYgKzQxMzYsMTMgQEAKIHN0YXRpYyB2b2lkCiBiZmFfZmNwX3N0YXJ0KHN0cnVjdCBiZmFfcyAqYmZhKQogeworCXN0cnVjdCBiZmFfZmNwX21vZF9zICpmY3AgPSBCRkFfRkNQX01PRChiZmEpOworCisJLyoKKwkgKiBiZmFfaW5pdCgpIHdpdGggZmxhc2ggcmVhZCBpcyBjb21wbGV0ZS4gbm93IGludmFsaWRhdGUgdGhlIHN0YWxlCisJICogY29udGVudCBvZiBsdW4gbWFzayBsaWtlIHVuaXQgYXR0ZW50aW9uLCBycCB0YWcgYW5kIGxwIHRhZy4KKwkgKi8KKwliZmFfaW9pbV9sbV9pbml0KGZjcC0+YmZhKTsKIH0KIAogc3RhdGljIHZvaWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjcGltLmggYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3BpbS5oCmluZGV4IDU3YjY5NWEuLjEwODBiY2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2ZjcGltLmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNwaW0uaApAQCAtNzksMTQgKzc5LDIyIEBACiAJaWYgKG4gPj0gKDFVTCk8PDIyKQogCQlyZXR1cm4gQkZBX0lPQlVDS0VUX01BWCAtIDE7CiAJbiA+Pj0gODsKLQlpZiAobiA+PSAoMVVMKTw8MTYpCi0JCW4gPj49IDE2OyBwb3MgKz0gMTY7Ci0JaWYgKG4gPj0gMSA8PCA4KQotCQluID4+PSA4OyBwb3MgKz0gODsKLQlpZiAobiA+PSAxIDw8IDQpCi0JCW4gPj49IDQ7IHBvcyArPSA0OwotCWlmIChuID49IDEgPDwgMikKLQkJbiA+Pj0gMjsgcG9zICs9IDI7CisJaWYgKG4gPj0gKDFVTCk8PDE2KSB7CisJCW4gPj49IDE2OworCQlwb3MgKz0gMTY7CisJfQorCWlmIChuID49IDEgPDwgOCkgeworCQluID4+PSA4OworCQlwb3MgKz0gODsKKwl9CisJaWYgKG4gPj0gMSA8PCA0KSB7CisJCW4gPj49IDQ7CisJCXBvcyArPSA0OworCX0KKwlpZiAobiA+PSAxIDw8IDIpIHsKKwkJbiA+Pj0gMjsKKwkJcG9zICs9IDI7CisJfQogCWlmIChuID49IDEgPDwgMSkKIAkJcG9zICs9IDE7CiAKQEAgLTEwMiw2ICsxMTAsNyBAQAogc3RydWN0IGJmYWRfdHNraW1fczsKIAogdHlwZWRlZiB2b2lkICAgICgqYmZhX2ZjcGltX3Byb2ZpbGVfdCkgKHN0cnVjdCBiZmFfaW9pbV9zICppb2ltKTsKK3R5cGVkZWYgYmZhX2Jvb2xlYW5fdCAoKmJmYV9pb2ltX2xtX3Byb2NfcnNwX2RhdGFfdCkgKHN0cnVjdCBiZmFfaW9pbV9zICppb2ltKTsKIAogc3RydWN0IGJmYV9mY3BpbV9zIHsKIAlzdHJ1Y3QgYmZhX3MJCSpiZmE7CkBAIC0xMTUsNyArMTI0LDcgQEAKIAl1MzIJCQlwYXRoX3RvdjsKIAl1MTYJCQlxX2RlcHRoOwogCXU4CQkJcmVxcTsJCS8qICBSZXF1ZXN0IHF1ZXVlIHRvIGJlIHVzZWQgKi8KLQl1OAkJCXJzdmQ7CisJdTgJCQlsdW5fbWFza2luZ19wZW5kaW5nOwogCXN0cnVjdCBsaXN0X2hlYWQJaXRuaW1fcTsJLyogIHF1ZXVlIG9mIGFjdGl2ZSBpdG5pbSAqLwogCXN0cnVjdCBsaXN0X2hlYWQJaW9pbV9yZXNmcmVlX3E7IC8qICBJT3Mgd2FpdGluZyBmb3IgZi93ICovCiAJc3RydWN0IGxpc3RfaGVhZAlpb2ltX2NvbXBfcTsJLyogIElPIGdsb2JhbCBjb21wIFEJKi8KQEAgLTE3MCw3ICsxNzksOSBAQAogCWJmYV9jYl9jYmZuX3QJCWlvX2NiZm47CS8qICBJTyBjb21wbGV0aW9uIGhhbmRsZXIgKi8KIAlzdHJ1Y3QgYmZhX2lvaW1fc3BfcwkqaW9zcDsJCS8qICBzbG93LXBhdGggSU8gaGFuZGxpbmcgKi8KIAl1OAkJCXJlcXE7CQkvKiAgUmVxdWVzdCBxdWV1ZSBmb3IgSS9PICovCisJdTgJCQltb2RlOwkJLyogIElPIGlzIHBhc3N0aHJvdWdoIG9yIG5vdCAqLwogCXU2NAkJCXN0YXJ0X3RpbWU7CS8qICBJTydzIFByb2ZpbGUgc3RhcnQgdmFsICovCisJYmZhX2lvaW1fbG1fcHJvY19yc3BfZGF0YV90IHByb2NfcnNwX2RhdGE7IC8qIFJTUCBkYXRhIGFkanVzdCAqLwogfTsKIAogc3RydWN0IGJmYV9pb2ltX3NwX3MgewpAQCAtMjUwLDYgKzI2MSwxMCBAQAogCShfX2lvaW0pLT5pb3RhZyB8PSBrIDw8IEJGQV9JT0lNX1JFVFJZX1RBR19PRkZTRVQ7CQlcCiB9IHdoaWxlICgwKQogCisjZGVmaW5lIEJGQV9JT0lNX1RPX0xQUyhfX2lvaW0pCQlcCisJQkZBX0xQU19GUk9NX1RBRyhCRkFfTFBTX01PRChfX2lvaW0tPmJmYSksCVwKKwkJX19pb2ltLT5pdG5pbS0+cnBvcnQtPnJwb3J0X2luZm8ubHBfdGFnKQorCiBzdGF0aWMgaW5saW5lIGJmYV9ib29sZWFuX3QKIGJmYV9pb2ltX21heHJldHJ5X3JlYWNoZWQoc3RydWN0IGJmYV9pb2ltX3MgKmlvaW0pCiB7CkBAIC0yOTcsNiArMzEyLDggQEAKIAkJCXN0cnVjdCBiZmFfaXRuaW1faW9zdGF0c19zICpzdGF0cywgdTggbHBfdGFnKTsKIHZvaWQgYmZhX2ZjcGltX2FkZF9zdGF0cyhzdHJ1Y3QgYmZhX2l0bmltX2lvc3RhdHNfcyAqZmNwaW1fc3RhdHMsCiAJCQlzdHJ1Y3QgYmZhX2l0bmltX2lvc3RhdHNfcyAqaXRuaW1fc3RhdHMpOworYmZhX3N0YXR1c190IGJmYV9mY3BpbV9wcm9maWxlX29uKHN0cnVjdCBiZmFfcyAqYmZhLCB1MzIgdGltZSk7CitiZmFfc3RhdHVzX3QgYmZhX2ZjcGltX3Byb2ZpbGVfb2ZmKHN0cnVjdCBiZmFfcyAqYmZhKTsKIAogI2RlZmluZSBiZmFfZmNwaW1faW9yZWRpcmVjdF9lbmFibGVkKF9fYmZhKQkJCQlcCiAJKCgoc3RydWN0IGJmYV9mY3BpbV9zICopKEJGQV9GQ1BJTShfX2JmYSkpKS0+aW9yZWRpcmVjdCkKQEAgLTM5Nyw0ICs0MTQsMTQgQEAKIHZvaWQgYmZhX2NiX3Rza2ltX2RvbmUodm9pZCAqYmZhZCwgc3RydWN0IGJmYWRfdHNraW1fcyAqZHRzaywKIAkJCWVudW0gYmZpX3Rza2ltX3N0YXR1cyB0c2tfc3RhdHVzKTsKIAordm9pZAliZmFfZmNwaW1fbHVubWFza19ycF91cGRhdGUoc3RydWN0IGJmYV9zICpiZmEsIHd3bl90IGxwX3d3biwKKwkJCXd3bl90IHJwX3d3biwgdTE2IHJwX3RhZywgdTggbHBfdGFnKTsKK2JmYV9zdGF0dXNfdAliZmFfZmNwaW1fbHVubWFza191cGRhdGUoc3RydWN0IGJmYV9zICpiZmEsIHUzMiBvbl9vZmYpOworYmZhX3N0YXR1c190CWJmYV9mY3BpbV9sdW5tYXNrX3F1ZXJ5KHN0cnVjdCBiZmFfcyAqYmZhLCB2b2lkICpidWYpOworYmZhX3N0YXR1c190CWJmYV9mY3BpbV9sdW5tYXNrX2RlbGV0ZShzdHJ1Y3QgYmZhX3MgKmJmYSwgdTE2IHZmX2lkLAorCQkJCXd3bl90ICpwd3duLCB3d25fdCBycHd3biwgc3RydWN0IHNjc2lfbHVuIGx1bik7CitiZmFfc3RhdHVzX3QJYmZhX2ZjcGltX2x1bm1hc2tfYWRkKHN0cnVjdCBiZmFfcyAqYmZhLCB1MTYgdmZfaWQsCisJCQkJd3duX3QgKnB3d24sIHd3bl90IHJwd3duLCBzdHJ1Y3Qgc2NzaV9sdW4gbHVuKTsKK2JmYV9zdGF0dXNfdAliZmFfZmNwaW1fbHVubWFza19jbGVhcihzdHJ1Y3QgYmZhX3MgKmJmYSk7CisKICNlbmRpZiAvKiBfX0JGQV9GQ1BJTV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjcy5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzLmMKaW5kZXggYTliMjJiYy4uZWFhYzU3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzLmMKQEAgLTIwLDYgKzIwLDcgQEAKICAqLwogCiAjaW5jbHVkZSAiYmZhZF9kcnYuaCIKKyNpbmNsdWRlICJiZmFkX2ltLmgiCiAjaW5jbHVkZSAiYmZhX2Zjcy5oIgogI2luY2x1ZGUgImJmYV9mY2J1aWxkLmgiCiAKQEAgLTEzMjcsNiArMTMyOCwyOSBAQAogCWJmYV90cmMoZmFicmljLT5mY3MsIHN0YXR1cyk7CiB9CiAKKworLyoKKyAqIFNlbmQgQUVOIG5vdGlmaWNhdGlvbgorICovCitzdGF0aWMgdm9pZAorYmZhX2Zjc19mYWJyaWNfYWVuX3Bvc3Qoc3RydWN0IGJmYV9mY3NfbHBvcnRfcyAqcG9ydCwKKwkJCWVudW0gYmZhX3BvcnRfYWVuX2V2ZW50IGV2ZW50KQoreworCXN0cnVjdCBiZmFkX3MgKmJmYWQgPSAoc3RydWN0IGJmYWRfcyAqKXBvcnQtPmZhYnJpYy0+ZmNzLT5iZmFkOworCXN0cnVjdCBiZmFfYWVuX2VudHJ5X3MgICphZW5fZW50cnk7CisKKwliZmFkX2dldF9hZW5fZW50cnkoYmZhZCwgYWVuX2VudHJ5KTsKKwlpZiAoIWFlbl9lbnRyeSkKKwkJcmV0dXJuOworCisJYWVuX2VudHJ5LT5hZW5fZGF0YS5wb3J0LnB3d24gPSBiZmFfZmNzX2xwb3J0X2dldF9wd3duKHBvcnQpOworCWFlbl9lbnRyeS0+YWVuX2RhdGEucG9ydC5md3duID0gYmZhX2Zjc19scG9ydF9nZXRfZmFicmljX25hbWUocG9ydCk7CisKKwkvKiBTZW5kIHRoZSBBRU4gbm90aWZpY2F0aW9uICovCisJYmZhZF9pbV9wb3N0X3ZlbmRvcl9ldmVudChhZW5fZW50cnksIGJmYWQsICsrcG9ydC0+ZmNzLT5mY3NfYWVuX3NlcSwKKwkJCQkgIEJGQV9BRU5fQ0FUX1BPUlQsIGV2ZW50KTsKK30KKwogLyoKICAqCiAgKiBAcGFyYW1baW5dIGZhYnJpYyAtIGZhYnJpYwpAQCAtMTM1OCw2ICsxMzgyLDggQEAKIAkJQkZBX0xPRyhLRVJOX1dBUk5JTkcsIGJmYWQsIGJmYV9sb2dfbGV2ZWwsCiAJCQkiQmFzZSBwb3J0IFdXTiA9ICVzIEZhYnJpYyBXV04gPSAlc1xuIiwKIAkJCXB3d25fcHRyLCBmd3duX3B0cik7CisJCWJmYV9mY3NfZmFicmljX2Flbl9wb3N0KCZmYWJyaWMtPmJwb3J0LAorCQkJCUJGQV9QT1JUX0FFTl9GQUJSSUNfTkFNRV9DSEFOR0UpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzLmggYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3MuaAppbmRleCBhNWYxZmFmLi5lNzVlMDdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3MuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3MuaApAQCAtNjc1LDYgKzY3NSw3IEBACiAJc3RydWN0IGJmYV9mY3NfZmFicmljX3MgZmFicmljOyAvKiAgYmFzZSBmYWJyaWMgc3RhdGUgbWFjaGluZSAqLwogCXN0cnVjdCBiZmFfZmNzX3N0YXRzX3MJc3RhdHM7CS8qICBGQ1Mgc3RhdGlzdGljcyAqLwogCXN0cnVjdCBiZmFfd2NfcwkJd2M7CS8qICB3YWl0aW5nIGNvdW50ZXIgKi8KKwlpbnQJCQlmY3NfYWVuX3NlcTsKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3NfZmNwaW0uYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjc19mY3BpbS5jCmluZGV4IDI5YjQxMDguLjkyNzI4NDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjc19mY3BpbS5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2Zjc19mY3BpbS5jCkBAIC0zNyw2ICszNyw4IEBACiAJCQkgc3RydWN0IGJmYV9mY3hwX3MgKmZjeHAsIHZvaWQgKmNiYXJnLAogCQkJICAgIGJmYV9zdGF0dXNfdCByZXFfc3RhdHVzLCB1MzIgcnNwX2xlbiwKIAkJCSAgICB1MzIgcmVzaWRfbGVuLCBzdHJ1Y3QgZmNoc19zICpyc3BfZmNocyk7CitzdGF0aWMgdm9pZAliZmFfZmNzX2l0bmltX2Flbl9wb3N0KHN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKml0bmltLAorCQkJZW51bSBiZmFfaXRuaW1fYWVuX2V2ZW50IGV2ZW50KTsKIAogLyoKICAqICBmY3NfaXRuaW1fc20gRkNTIGl0bmltIHN0YXRlIG1hY2hpbmUgZXZlbnRzCkBAIC0yNjksNiArMjcxLDcgQEAKIAkJQkZBX0xPRyhLRVJOX0lORk8sIGJmYWQsIGJmYV9sb2dfbGV2ZWwsCiAJCSJUYXJnZXQgKFdXTiA9ICVzKSBpcyBvbmxpbmUgZm9yIGluaXRpYXRvciAoV1dOID0gJXMpXG4iLAogCQlycHd3bl9idWYsIGxwd3duX2J1Zik7CisJCWJmYV9mY3NfaXRuaW1fYWVuX3Bvc3QoaXRuaW0sIEJGQV9JVE5JTV9BRU5fT05MSU5FKTsKIAkJYnJlYWs7CiAKIAljYXNlIEJGQV9GQ1NfSVROSU1fU01fT0ZGTElORToKQEAgLTMwNSwxNCArMzA4LDE3IEBACiAJCWJmYV9pdG5pbV9vZmZsaW5lKGl0bmltLT5iZmFfaXRuaW0pOwogCQl3d24yc3RyKGxwd3duX2J1ZiwgYmZhX2Zjc19scG9ydF9nZXRfcHd3bihpdG5pbS0+cnBvcnQtPnBvcnQpKTsKIAkJd3duMnN0cihycHd3bl9idWYsIGl0bmltLT5ycG9ydC0+cHd3bik7Ci0JCWlmIChiZmFfZmNzX2xwb3J0X2lzX29ubGluZShpdG5pbS0+cnBvcnQtPnBvcnQpID09IEJGQV9UUlVFKQorCQlpZiAoYmZhX2Zjc19scG9ydF9pc19vbmxpbmUoaXRuaW0tPnJwb3J0LT5wb3J0KSA9PSBCRkFfVFJVRSkgewogCQkJQkZBX0xPRyhLRVJOX0VSUiwgYmZhZCwgYmZhX2xvZ19sZXZlbCwKIAkJCSJUYXJnZXQgKFdXTiA9ICVzKSBjb25uZWN0aXZpdHkgbG9zdCBmb3IgIgogCQkJImluaXRpYXRvciAoV1dOID0gJXMpXG4iLCBycHd3bl9idWYsIGxwd3duX2J1Zik7Ci0JCWVsc2UKKwkJCWJmYV9mY3NfaXRuaW1fYWVuX3Bvc3QoaXRuaW0sIEJGQV9JVE5JTV9BRU5fRElTQ09OTkVDVCk7CisJCX0gZWxzZSB7CiAJCQlCRkFfTE9HKEtFUk5fSU5GTywgYmZhZCwgYmZhX2xvZ19sZXZlbCwKIAkJCSJUYXJnZXQgKFdXTiA9ICVzKSBvZmZsaW5lZCBieSBpbml0aWF0b3IgKFdXTiA9ICVzKVxuIiwKIAkJCXJwd3duX2J1ZiwgbHB3d25fYnVmKTsKKwkJCWJmYV9mY3NfaXRuaW1fYWVuX3Bvc3QoaXRuaW0sIEJGQV9JVE5JTV9BRU5fT0ZGTElORSk7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEJGQV9GQ1NfSVROSU1fU01fREVMRVRFOgpAQCAtMzgyLDYgKzM4OCwzMyBAQAogfQogCiBzdGF0aWMgdm9pZAorYmZhX2Zjc19pdG5pbV9hZW5fcG9zdChzdHJ1Y3QgYmZhX2Zjc19pdG5pbV9zICppdG5pbSwKKwkJCWVudW0gYmZhX2l0bmltX2Flbl9ldmVudCBldmVudCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCA9IGl0bmltLT5ycG9ydDsKKwlzdHJ1Y3QgYmZhZF9zICpiZmFkID0gKHN0cnVjdCBiZmFkX3MgKilpdG5pbS0+ZmNzLT5iZmFkOworCXN0cnVjdCBiZmFfYWVuX2VudHJ5X3MJKmFlbl9lbnRyeTsKKworCS8qIERvbid0IHBvc3QgZXZlbnRzIGZvciB3ZWxsIGtub3duIGFkZHJlc3NlcyAqLworCWlmIChCRkFfRkNTX1BJRF9JU19XS0EocnBvcnQtPnBpZCkpCisJCXJldHVybjsKKworCWJmYWRfZ2V0X2Flbl9lbnRyeShiZmFkLCBhZW5fZW50cnkpOworCWlmICghYWVuX2VudHJ5KQorCQlyZXR1cm47CisKKwlhZW5fZW50cnktPmFlbl9kYXRhLml0bmltLnZmX2lkID0gcnBvcnQtPnBvcnQtPmZhYnJpYy0+dmZfaWQ7CisJYWVuX2VudHJ5LT5hZW5fZGF0YS5pdG5pbS5wcHd3biA9IGJmYV9mY3NfbHBvcnRfZ2V0X3B3d24oCisJCQkJCWJmYV9mY3NfZ2V0X2Jhc2VfcG9ydChpdG5pbS0+ZmNzKSk7CisJYWVuX2VudHJ5LT5hZW5fZGF0YS5pdG5pbS5scHd3biA9IGJmYV9mY3NfbHBvcnRfZ2V0X3B3d24ocnBvcnQtPnBvcnQpOworCWFlbl9lbnRyeS0+YWVuX2RhdGEuaXRuaW0ucnB3d24gPSBycG9ydC0+cHd3bjsKKworCS8qIFNlbmQgdGhlIEFFTiBub3RpZmljYXRpb24gKi8KKwliZmFkX2ltX3Bvc3RfdmVuZG9yX2V2ZW50KGFlbl9lbnRyeSwgYmZhZCwgKytycG9ydC0+ZmNzLT5mY3NfYWVuX3NlcSwKKwkJCQkgIEJGQV9BRU5fQ0FUX0lUTklNLCBldmVudCk7Cit9CisKK3N0YXRpYyB2b2lkCiBiZmFfZmNzX2l0bmltX3NlbmRfcHJsaSh2b2lkICppdG5pbV9jYmFyZywgc3RydWN0IGJmYV9mY3hwX3MgKmZjeHBfYWxsb2NlZCkKIHsKIAlzdHJ1Y3QgYmZhX2Zjc19pdG5pbV9zICppdG5pbSA9IGl0bmltX2NiYXJnOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzX2xwb3J0LmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3NfbHBvcnQuYwppbmRleCBmODI1MWE5Li5kNGY5NTFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3NfbHBvcnQuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3NfbHBvcnQuYwpAQCAtMTYsNiArMTYsNyBAQAogICovCiAKICNpbmNsdWRlICJiZmFkX2Rydi5oIgorI2luY2x1ZGUgImJmYWRfaW0uaCIKICNpbmNsdWRlICJiZmFfZmNzLmgiCiAjaW5jbHVkZSAiYmZhX2ZjYnVpbGQuaCIKICNpbmNsdWRlICJiZmFfZmMuaCIKQEAgLTMwMCw2ICszMDEsMzEgQEAKICAqLwogCiAvKgorICogU2VuZCBBRU4gbm90aWZpY2F0aW9uCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZmNzX2xwb3J0X2Flbl9wb3N0KHN0cnVjdCBiZmFfZmNzX2xwb3J0X3MgKnBvcnQsCisJCQllbnVtIGJmYV9scG9ydF9hZW5fZXZlbnQgZXZlbnQpCit7CisJc3RydWN0IGJmYWRfcyAqYmZhZCA9IChzdHJ1Y3QgYmZhZF9zICopcG9ydC0+ZmFicmljLT5mY3MtPmJmYWQ7CisJc3RydWN0IGJmYV9hZW5fZW50cnlfcyAgKmFlbl9lbnRyeTsKKworCWJmYWRfZ2V0X2Flbl9lbnRyeShiZmFkLCBhZW5fZW50cnkpOworCWlmICghYWVuX2VudHJ5KQorCQlyZXR1cm47CisKKwlhZW5fZW50cnktPmFlbl9kYXRhLmxwb3J0LnZmX2lkID0gcG9ydC0+ZmFicmljLT52Zl9pZDsKKwlhZW5fZW50cnktPmFlbl9kYXRhLmxwb3J0LnJvbGVzID0gcG9ydC0+cG9ydF9jZmcucm9sZXM7CisJYWVuX2VudHJ5LT5hZW5fZGF0YS5scG9ydC5wcHd3biA9IGJmYV9mY3NfbHBvcnRfZ2V0X3B3d24oCisJCQkJCWJmYV9mY3NfZ2V0X2Jhc2VfcG9ydChwb3J0LT5mY3MpKTsKKwlhZW5fZW50cnktPmFlbl9kYXRhLmxwb3J0Lmxwd3duID0gYmZhX2Zjc19scG9ydF9nZXRfcHd3bihwb3J0KTsKKworCS8qIFNlbmQgdGhlIEFFTiBub3RpZmljYXRpb24gKi8KKwliZmFkX2ltX3Bvc3RfdmVuZG9yX2V2ZW50KGFlbl9lbnRyeSwgYmZhZCwgKytwb3J0LT5mY3MtPmZjc19hZW5fc2VxLAorCQkJCSAgQkZBX0FFTl9DQVRfTFBPUlQsIGV2ZW50KTsKK30KKworLyoKICAqIFNlbmQgYSBMUyByZWplY3QKICAqLwogc3RhdGljIHZvaWQKQEAgLTU5Myw2ICs2MTksNyBAQAogCUJGQV9MT0coS0VSTl9JTkZPLCBiZmFkLCBiZmFfbG9nX2xldmVsLAogCQkiTG9naWNhbCBwb3J0IG9ubGluZTogV1dOID0gJXMgUm9sZSA9ICVzXG4iLAogCQlscHd3bl9idWYsICJJbml0aWF0b3IiKTsKKwliZmFfZmNzX2xwb3J0X2Flbl9wb3N0KHBvcnQsIEJGQV9MUE9SVF9BRU5fT05MSU5FKTsKIAogCWJmYWQtPmJmYWRfZmxhZ3MgfD0gQkZBRF9QT1JUX09OTElORTsKIH0KQEAgLTYxMSwxNCArNjM4LDE3IEBACiAKIAl3d24yc3RyKGxwd3duX2J1ZiwgYmZhX2Zjc19scG9ydF9nZXRfcHd3bihwb3J0KSk7CiAJaWYgKGJmYV9zbV9jbXBfc3RhdGUocG9ydC0+ZmFicmljLAotCQkJYmZhX2Zjc19mYWJyaWNfc21fb25saW5lKSA9PSBCRkFfVFJVRSkKKwkJCWJmYV9mY3NfZmFicmljX3NtX29ubGluZSkgPT0gQkZBX1RSVUUpIHsKIAkJQkZBX0xPRyhLRVJOX0VSUiwgYmZhZCwgYmZhX2xvZ19sZXZlbCwKIAkJIkxvZ2ljYWwgcG9ydCBsb3N0IGZhYnJpYyBjb25uZWN0aXZpdHk6IFdXTiA9ICVzIFJvbGUgPSAlc1xuIiwKIAkJbHB3d25fYnVmLCAiSW5pdGlhdG9yIik7Ci0JZWxzZQorCQliZmFfZmNzX2xwb3J0X2Flbl9wb3N0KHBvcnQsIEJGQV9MUE9SVF9BRU5fRElTQ09OTkVDVCk7CisJfSBlbHNlIHsKIAkJQkZBX0xPRyhLRVJOX0lORk8sIGJmYWQsIGJmYV9sb2dfbGV2ZWwsCiAJCSJMb2dpY2FsIHBvcnQgdGFrZW4gb2ZmbGluZTogV1dOID0gJXMgUm9sZSA9ICVzXG4iLAogCQlscHd3bl9idWYsICJJbml0aWF0b3IiKTsKKwkJYmZhX2Zjc19scG9ydF9hZW5fcG9zdChwb3J0LCBCRkFfTFBPUlRfQUVOX09GRkxJTkUpOworCX0KIAogCWxpc3RfZm9yX2VhY2hfc2FmZShxZSwgcWVuLCAmcG9ydC0+cnBvcnRfcSkgewogCQlycG9ydCA9IChzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICopIHFlOwpAQCAtNjc2LDYgKzcwNiw3IEBACiAJQkZBX0xPRyhLRVJOX0lORk8sIGJmYWQsIGJmYV9sb2dfbGV2ZWwsCiAJCSJMb2dpY2FsIHBvcnQgZGVsZXRlZDogV1dOID0gJXMgUm9sZSA9ICVzXG4iLAogCQlscHd3bl9idWYsICJJbml0aWF0b3IiKTsKKwliZmFfZmNzX2xwb3J0X2Flbl9wb3N0KHBvcnQsIEJGQV9MUE9SVF9BRU5fREVMRVRFKTsKIAogCS8qIEJhc2UgcG9ydCB3aWxsIGJlIGRlbGV0ZWQgYnkgdGhlIE9TIGRyaXZlciAqLwogCWlmIChwb3J0LT52cG9ydCkgewpAQCAtOTczLDYgKzEwMDQsNyBAQAogCUJGQV9MT0coS0VSTl9JTkZPLCBiZmFkLCBiZmFfbG9nX2xldmVsLAogCQkiTmV3IGxvZ2ljYWwgcG9ydCBjcmVhdGVkOiBXV04gPSAlcyBSb2xlID0gJXNcbiIsCiAJCWxwd3duX2J1ZiwgIkluaXRpYXRvciIpOworCWJmYV9mY3NfbHBvcnRfYWVuX3Bvc3QobHBvcnQsIEJGQV9MUE9SVF9BRU5fTkVXKTsKIAogCWJmYV9zbV9zZXRfc3RhdGUobHBvcnQsIGJmYV9mY3NfbHBvcnRfc21fdW5pbml0KTsKIAliZmFfc21fc2VuZF9ldmVudChscG9ydCwgQkZBX0ZDU19QT1JUX1NNX0NSRUFURSk7CkBAIC01NTU5LDYgKzU1OTEsMzEgQEAKICAqICBmY3NfdnBvcnRfcHJpdmF0ZSBGQ1MgdmlydHVhbCBwb3J0IHByaXZhdGUgZnVuY3Rpb25zCiAgKi8KIC8qCisgKiBTZW5kIEFFTiBub3RpZmljYXRpb24KKyAqLworc3RhdGljIHZvaWQKK2JmYV9mY3NfdnBvcnRfYWVuX3Bvc3Qoc3RydWN0IGJmYV9mY3NfbHBvcnRfcyAqcG9ydCwKKwkJICAgICAgIGVudW0gYmZhX2xwb3J0X2Flbl9ldmVudCBldmVudCkKK3sKKwlzdHJ1Y3QgYmZhZF9zICpiZmFkID0gKHN0cnVjdCBiZmFkX3MgKilwb3J0LT5mYWJyaWMtPmZjcy0+YmZhZDsKKwlzdHJ1Y3QgYmZhX2Flbl9lbnRyeV9zICAqYWVuX2VudHJ5OworCisJYmZhZF9nZXRfYWVuX2VudHJ5KGJmYWQsIGFlbl9lbnRyeSk7CisJaWYgKCFhZW5fZW50cnkpCisJCXJldHVybjsKKworCWFlbl9lbnRyeS0+YWVuX2RhdGEubHBvcnQudmZfaWQgPSBwb3J0LT5mYWJyaWMtPnZmX2lkOworCWFlbl9lbnRyeS0+YWVuX2RhdGEubHBvcnQucm9sZXMgPSBwb3J0LT5wb3J0X2NmZy5yb2xlczsKKwlhZW5fZW50cnktPmFlbl9kYXRhLmxwb3J0LnBwd3duID0gYmZhX2Zjc19scG9ydF9nZXRfcHd3bigKKwkJCQkJYmZhX2Zjc19nZXRfYmFzZV9wb3J0KHBvcnQtPmZjcykpOworCWFlbl9lbnRyeS0+YWVuX2RhdGEubHBvcnQubHB3d24gPSBiZmFfZmNzX2xwb3J0X2dldF9wd3duKHBvcnQpOworCisJLyogU2VuZCB0aGUgQUVOIG5vdGlmaWNhdGlvbiAqLworCWJmYWRfaW1fcG9zdF92ZW5kb3JfZXZlbnQoYWVuX2VudHJ5LCBiZmFkLCArK3BvcnQtPmZjcy0+ZmNzX2Flbl9zZXEsCisJCQkJICBCRkFfQUVOX0NBVF9MUE9SVCwgZXZlbnQpOworfQorCisvKgogICogVGhpcyByb3V0aW5lIHdpbGwgYmUgY2FsbGVkIHRvIHNlbmQgYSBGRElTQyBjb21tYW5kLgogICovCiBzdGF0aWMgdm9pZApAQCAtNTU4NSw4ICs1NjQyLDExIEBACiAJY2FzZSBGQ19MU19SSlRfRVhQX0lOVkFMSURfTlBPUlRfSUQ6IC8qIGJ5IENpc2NvICovCiAJCWlmICh2cG9ydC0+ZmRpc2NfcmV0cmllcyA8IEJGQV9GQ1NfVlBPUlRfTUFYX1JFVFJJRVMpCiAJCQliZmFfc21fc2VuZF9ldmVudCh2cG9ydCwgQkZBX0ZDU19WUE9SVF9TTV9SU1BfRVJST1IpOwotCQllbHNlCisJCWVsc2UgeworCQkJYmZhX2Zjc192cG9ydF9hZW5fcG9zdCgmdnBvcnQtPmxwb3J0LAorCQkJCQlCRkFfTFBPUlRfQUVOX05QSVZfRFVQX1dXTik7CiAJCQliZmFfc21fc2VuZF9ldmVudCh2cG9ydCwgQkZBX0ZDU19WUE9SVF9TTV9SU1BfRFVQX1dXTik7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEZDX0xTX1JKVF9FWFBfSU5TVUZGX1JFUzoKQEAgLTU1OTYsMTEgKzU2NTYsMTcgQEAKIAkJICovCiAJCWlmICh2cG9ydC0+ZmRpc2NfcmV0cmllcyA8IEJGQV9GQ1NfVlBPUlRfTUFYX1JFVFJJRVMpCiAJCQliZmFfc21fc2VuZF9ldmVudCh2cG9ydCwgQkZBX0ZDU19WUE9SVF9TTV9SU1BfRVJST1IpOwotCQllbHNlCisJCWVsc2UgeworCQkJYmZhX2Zjc192cG9ydF9hZW5fcG9zdCgmdnBvcnQtPmxwb3J0LAorCQkJCQlCRkFfTFBPUlRfQUVOX05QSVZfRkFCUklDX01BWCk7CiAJCQliZmFfc21fc2VuZF9ldmVudCh2cG9ydCwgQkZBX0ZDU19WUE9SVF9TTV9SU1BfRkFJTEVEKTsKKwkJfQogCQlicmVhazsKIAogCWRlZmF1bHQ6CisJCWlmICh2cG9ydC0+ZmRpc2NfcmV0cmllcyA9PSAwKQorCQkJYmZhX2Zjc192cG9ydF9hZW5fcG9zdCgmdnBvcnQtPmxwb3J0LAorCQkJCQlCRkFfTFBPUlRfQUVOX05QSVZfVU5LTk9XTik7CiAJCWJmYV9zbV9zZW5kX2V2ZW50KHZwb3J0LCBCRkFfRkNTX1ZQT1JUX1NNX1JTUF9FUlJPUik7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfZmNzX3Jwb3J0LmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3NfcnBvcnQuYwppbmRleCAyYzUxNDQ1Li41MjYyOGQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3NfcnBvcnQuYworKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9mY3NfcnBvcnQuYwpAQCAtMjAsNiArMjAsNyBAQAogICovCiAKICNpbmNsdWRlICJiZmFkX2Rydi5oIgorI2luY2x1ZGUgImJmYWRfaW0uaCIKICNpbmNsdWRlICJiZmFfZmNzLmgiCiAjaW5jbHVkZSAiYmZhX2ZjYnVpbGQuaCIKIApAQCAtMjA0MSw2ICsyMDQyLDM1IEBACiB9CiAKIHN0YXRpYyB2b2lkCitiZmFfZmNzX3Jwb3J0X2Flbl9wb3N0KHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0LAorCQkJZW51bSBiZmFfcnBvcnRfYWVuX2V2ZW50IGV2ZW50LAorCQkJc3RydWN0IGJmYV9ycG9ydF9hZW5fZGF0YV9zICpkYXRhKQoreworCXN0cnVjdCBiZmFfZmNzX2xwb3J0X3MgKnBvcnQgPSBycG9ydC0+cG9ydDsKKwlzdHJ1Y3QgYmZhZF9zICpiZmFkID0gKHN0cnVjdCBiZmFkX3MgKilwb3J0LT5mY3MtPmJmYWQ7CisJc3RydWN0IGJmYV9hZW5fZW50cnlfcyAgKmFlbl9lbnRyeTsKKworCWJmYWRfZ2V0X2Flbl9lbnRyeShiZmFkLCBhZW5fZW50cnkpOworCWlmICghYWVuX2VudHJ5KQorCQlyZXR1cm47CisKKwlpZiAoZXZlbnQgPT0gQkZBX1JQT1JUX0FFTl9RT1NfUFJJTykKKwkJYWVuX2VudHJ5LT5hZW5fZGF0YS5ycG9ydC5wcml2LnFvcyA9IGRhdGEtPnByaXYucW9zOworCWVsc2UgaWYgKGV2ZW50ID09IEJGQV9SUE9SVF9BRU5fUU9TX0ZMT1dJRCkKKwkJYWVuX2VudHJ5LT5hZW5fZGF0YS5ycG9ydC5wcml2LnFvcyA9IGRhdGEtPnByaXYucW9zOworCisJYWVuX2VudHJ5LT5hZW5fZGF0YS5ycG9ydC52Zl9pZCA9IHJwb3J0LT5wb3J0LT5mYWJyaWMtPnZmX2lkOworCWFlbl9lbnRyeS0+YWVuX2RhdGEucnBvcnQucHB3d24gPSBiZmFfZmNzX2xwb3J0X2dldF9wd3duKAorCQkJCQliZmFfZmNzX2dldF9iYXNlX3BvcnQocnBvcnQtPmZjcykpOworCWFlbl9lbnRyeS0+YWVuX2RhdGEucnBvcnQubHB3d24gPSBiZmFfZmNzX2xwb3J0X2dldF9wd3duKHJwb3J0LT5wb3J0KTsKKwlhZW5fZW50cnktPmFlbl9kYXRhLnJwb3J0LnJwd3duID0gcnBvcnQtPnB3d247CisKKwkvKiBTZW5kIHRoZSBBRU4gbm90aWZpY2F0aW9uICovCisJYmZhZF9pbV9wb3N0X3ZlbmRvcl9ldmVudChhZW5fZW50cnksIGJmYWQsICsrcnBvcnQtPmZjcy0+ZmNzX2Flbl9zZXEsCisJCQkJICBCRkFfQUVOX0NBVF9SUE9SVCwgZXZlbnQpOworfQorCitzdGF0aWMgdm9pZAogYmZhX2Zjc19ycG9ydF9vbmxpbmVfYWN0aW9uKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0KQogewogCXN0cnVjdCBiZmFfZmNzX2xwb3J0X3MgKnBvcnQgPSBycG9ydC0+cG9ydDsKQEAgLTIwNjMsMTAgKzIwOTMsMTIgQEAKIAogCXd3bjJzdHIobHB3d25fYnVmLCBiZmFfZmNzX2xwb3J0X2dldF9wd3duKHBvcnQpKTsKIAl3d24yc3RyKHJwd3duX2J1ZiwgcnBvcnQtPnB3d24pOwotCWlmICghQkZBX0ZDU19QSURfSVNfV0tBKHJwb3J0LT5waWQpKQorCWlmICghQkZBX0ZDU19QSURfSVNfV0tBKHJwb3J0LT5waWQpKSB7CiAJCUJGQV9MT0coS0VSTl9JTkZPLCBiZmFkLCBiZmFfbG9nX2xldmVsLAogCQkiUmVtb3RlIHBvcnQgKFdXTiA9ICVzKSBvbmxpbmUgZm9yIGxvZ2ljYWwgcG9ydCAoV1dOID0gJXMpXG4iLAogCQlycHd3bl9idWYsIGxwd3duX2J1Zik7CisJCWJmYV9mY3NfcnBvcnRfYWVuX3Bvc3QocnBvcnQsIEJGQV9SUE9SVF9BRU5fT05MSU5FLCBOVUxMKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0yMDgzLDE2ICsyMTE1LDIxIEBACiAJd3duMnN0cihscHd3bl9idWYsIGJmYV9mY3NfbHBvcnRfZ2V0X3B3d24ocG9ydCkpOwogCXd3bjJzdHIocnB3d25fYnVmLCBycG9ydC0+cHd3bik7CiAJaWYgKCFCRkFfRkNTX1BJRF9JU19XS0EocnBvcnQtPnBpZCkpIHsKLQkJaWYgKGJmYV9mY3NfbHBvcnRfaXNfb25saW5lKHJwb3J0LT5wb3J0KSA9PSBCRkFfVFJVRSkKKwkJaWYgKGJmYV9mY3NfbHBvcnRfaXNfb25saW5lKHJwb3J0LT5wb3J0KSA9PSBCRkFfVFJVRSkgewogCQkJQkZBX0xPRyhLRVJOX0VSUiwgYmZhZCwgYmZhX2xvZ19sZXZlbCwKIAkJCQkiUmVtb3RlIHBvcnQgKFdXTiA9ICVzKSBjb25uZWN0aXZpdHkgbG9zdCBmb3IgIgogCQkJCSJsb2dpY2FsIHBvcnQgKFdXTiA9ICVzKVxuIiwKIAkJCQlycHd3bl9idWYsIGxwd3duX2J1Zik7Ci0JCWVsc2UKKwkJCWJmYV9mY3NfcnBvcnRfYWVuX3Bvc3QocnBvcnQsCisJCQkJQkZBX1JQT1JUX0FFTl9ESVNDT05ORUNULCBOVUxMKTsKKwkJfSBlbHNlIHsKIAkJCUJGQV9MT0coS0VSTl9JTkZPLCBiZmFkLCBiZmFfbG9nX2xldmVsLAogCQkJCSJSZW1vdGUgcG9ydCAoV1dOID0gJXMpIG9mZmxpbmVkIGJ5ICIKIAkJCQkibG9naWNhbCBwb3J0IChXV04gPSAlcylcbiIsCiAJCQkJcnB3d25fYnVmLCBscHd3bl9idWYpOworCQkJYmZhX2Zjc19ycG9ydF9hZW5fcG9zdChycG9ydCwKKwkJCQlCRkFfUlBPUlRfQUVOX09GRkxJTkUsIE5VTEwpOworCQl9CiAJfQogCiAJaWYgKGJmYV9mY3NfbHBvcnRfaXNfaW5pdGlhdG9yKHBvcnQpKSB7CkBAIC0yMzY2LDggKzI0MDMsMTEgQEAKIAkJc3RydWN0IGJmYV9ycG9ydF9xb3NfYXR0cl9zIG5ld19xb3NfYXR0cikKIHsKIAlzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpycG9ydCA9IChzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICopIGNiYXJnOworCXN0cnVjdCBiZmFfcnBvcnRfYWVuX2RhdGFfcyBhZW5fZGF0YTsKIAogCWJmYV90cmMocnBvcnQtPmZjcywgcnBvcnQtPnB3d24pOworCWFlbl9kYXRhLnByaXYucW9zID0gbmV3X3Fvc19hdHRyOworCWJmYV9mY3NfcnBvcnRfYWVuX3Bvc3QocnBvcnQsIEJGQV9SUE9SVF9BRU5fUU9TX0ZMT1dJRCwgJmFlbl9kYXRhKTsKIH0KIAogLyoKQEAgLTIzOTAsOCArMjQzMCwxMSBAQAogCQlzdHJ1Y3QgYmZhX3Jwb3J0X3Fvc19hdHRyX3MgbmV3X3Fvc19hdHRyKQogewogCXN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKnJwb3J0ID0gKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKikgY2Jhcmc7CisJc3RydWN0IGJmYV9ycG9ydF9hZW5fZGF0YV9zIGFlbl9kYXRhOwogCiAJYmZhX3RyYyhycG9ydC0+ZmNzLCBycG9ydC0+cHd3bik7CisJYWVuX2RhdGEucHJpdi5xb3MgPSBuZXdfcW9zX2F0dHI7CisJYmZhX2Zjc19ycG9ydF9hZW5fcG9zdChycG9ydCwgQkZBX1JQT1JUX0FFTl9RT1NfUFJJTywgJmFlbl9kYXRhKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2h3X2NiLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9od19jYi5jCmluZGV4IGU3ZmZkODIuLmVhMjRkNGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2h3X2NiLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaHdfY2IuYwpAQCAtNDIsMTEgKzQyLDM2IEBACiAJCQliZmEtPmlvY2ZjLmJmYV9yZWdzLmludHJfc3RhdHVzKTsKIH0KIAorLyoKKyAqIEFjdGlvbnMgdG8gcmVzcG9uZCBSTUUgSW50ZXJydXB0IGZvciBDcm9zc2JvdyBBU0lDOgorICogLSBXcml0ZSAxIHRvIEludGVycnVwdCBTdGF0dXMgcmVnaXN0ZXIKKyAqICAgICAgICAgICAgICBJTlRYIC0gZG9uZSBpbiBiZmFfaW50eCgpCisgKiAgICAgICAgICAgICAgTVNJWCAtIGRvbmUgaW4gYmZhX2h3Y2JfcnNwcV9hY2tfbXNpeCgpCisgKiAtIFVwZGF0ZSBDSSAob25seSBpZiBuZXcgQ0kpCisgKi8KIHN0YXRpYyB2b2lkCi1iZmFfaHdjYl9yc3BxX2Fja19tc2l4KHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgcnNwcSkKK2JmYV9od2NiX3JzcHFfYWNrX21zaXgoc3RydWN0IGJmYV9zICpiZmEsIGludCByc3BxLCB1MzIgY2kpCiB7CiAJd3JpdGVsKF9fSEZOX0lOVF9STUVfUTAgPDwgUk1FX1FfTlVNKGJmYV9pb2NfcGNpZm4oJmJmYS0+aW9jKSwgcnNwcSksCi0JCQliZmEtPmlvY2ZjLmJmYV9yZWdzLmludHJfc3RhdHVzKTsKKwkJYmZhLT5pb2NmYy5iZmFfcmVncy5pbnRyX3N0YXR1cyk7CisKKwlpZiAoYmZhX3JzcHFfY2koYmZhLCByc3BxKSA9PSBjaSkKKwkJcmV0dXJuOworCisJYmZhX3JzcHFfY2koYmZhLCByc3BxKSA9IGNpOworCXdyaXRlbChjaSwgYmZhLT5pb2NmYy5iZmFfcmVncy5ybWVfcV9jaVtyc3BxXSk7CisJbW1pb3diKCk7Cit9CisKK3ZvaWQKK2JmYV9od2NiX3JzcHFfYWNrKHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgcnNwcSwgdTMyIGNpKQoreworCWlmIChiZmFfcnNwcV9jaShiZmEsIHJzcHEpID09IGNpKQorCQlyZXR1cm47CisKKwliZmFfcnNwcV9jaShiZmEsIHJzcHEpID0gY2k7CisJd3JpdGVsKGNpLCBiZmEtPmlvY2ZjLmJmYV9yZWdzLnJtZV9xX2NpW3JzcHFdKTsKKwltbWlvd2IoKTsKIH0KIAogdm9pZApAQCAtMTQ5LDggKzE3NCwxMyBAQAogdm9pZAogYmZhX2h3Y2JfaXNyX21vZGVfc2V0KHN0cnVjdCBiZmFfcyAqYmZhLCBiZmFfYm9vbGVhbl90IG1zaXgpCiB7Ci0JYmZhLT5pb2NmYy5od2lmLmh3X3JlcXFfYWNrID0gYmZhX2h3Y2JfcmVxcV9hY2tfbXNpeDsKLQliZmEtPmlvY2ZjLmh3aWYuaHdfcnNwcV9hY2sgPSBiZmFfaHdjYl9yc3BxX2Fja19tc2l4OworCWlmIChtc2l4KSB7CisJCWJmYS0+aW9jZmMuaHdpZi5od19yZXFxX2FjayA9IGJmYV9od2NiX3JlcXFfYWNrX21zaXg7CisJCWJmYS0+aW9jZmMuaHdpZi5od19yc3BxX2FjayA9IGJmYV9od2NiX3JzcHFfYWNrX21zaXg7CisJfSBlbHNlIHsKKwkJYmZhLT5pb2NmYy5od2lmLmh3X3JlcXFfYWNrID0gTlVMTDsKKwkJYmZhLT5pb2NmYy5od2lmLmh3X3JzcHFfYWNrID0gYmZhX2h3Y2JfcnNwcV9hY2s7CisJfQogfQogCiB2b2lkCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9od19jdC5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaHdfY3QuYwppbmRleCA5ODliYmNlLi42Mzc1MjdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9od19jdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2h3X2N0LmMKQEAgLTY0LDEzICs2NCwzNiBAQAogCXdyaXRlbChyMzIsIGJmYS0+aW9jZmMuYmZhX3JlZ3MuY3BlX3FfY3RybFtyZXFxXSk7CiB9CiAKKy8qCisgKiBBY3Rpb25zIHRvIHJlc3BvbmQgUk1FIEludGVycnVwdCBmb3IgQ2F0YXB1bHQgQVNJQzoKKyAqIC0gV3JpdGUgMSB0byBJbnRlcnJ1cHQgU3RhdHVzIHJlZ2lzdGVyIChJTlR4IG9ubHkgLSBkb25lIGluIGJmYV9pbnR4KCkpCisgKiAtIEFja25vd2xlZGdlIGJ5IHdyaXRpbmcgdG8gUk1FIFF1ZXVlIENvbnRyb2wgcmVnaXN0ZXIKKyAqIC0gVXBkYXRlIENJCisgKi8KIHZvaWQKLWJmYV9od2N0X3JzcHFfYWNrKHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgcnNwcSkKK2JmYV9od2N0X3JzcHFfYWNrKHN0cnVjdCBiZmFfcyAqYmZhLCBpbnQgcnNwcSwgdTMyIGNpKQogewogCXUzMglyMzI7CiAKIAlyMzIgPSByZWFkbChiZmEtPmlvY2ZjLmJmYV9yZWdzLnJtZV9xX2N0cmxbcnNwcV0pOwogCXdyaXRlbChyMzIsIGJmYS0+aW9jZmMuYmZhX3JlZ3Mucm1lX3FfY3RybFtyc3BxXSk7CisKKwliZmFfcnNwcV9jaShiZmEsIHJzcHEpID0gY2k7CisJd3JpdGVsKGNpLCBiZmEtPmlvY2ZjLmJmYV9yZWdzLnJtZV9xX2NpW3JzcHFdKTsKKwltbWlvd2IoKTsKK30KKworLyoKKyAqIEFjdGlvbnMgdG8gcmVzcG9uZCBSTUUgSW50ZXJydXB0IGZvciBDYXRhcHVsdDIgQVNJQzoKKyAqIC0gV3JpdGUgMSB0byBJbnRlcnJ1cHQgU3RhdHVzIHJlZ2lzdGVyIChJTlR4IG9ubHkgLSBkb25lIGluIGJmYV9pbnR4KCkpCisgKiAtIFVwZGF0ZSBDSQorICovCit2b2lkCitiZmFfaHdjdDJfcnNwcV9hY2soc3RydWN0IGJmYV9zICpiZmEsIGludCByc3BxLCB1MzIgY2kpCit7CisJYmZhX3JzcHFfY2koYmZhLCByc3BxKSA9IGNpOworCXdyaXRlbChjaSwgYmZhLT5pb2NmYy5iZmFfcmVncy5ybWVfcV9jaVtyc3BxXSk7CisJbW1pb3diKCk7CiB9CiAKIHZvaWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX2lvYy5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jLmMKaW5kZXggZDZjMmJmMy4uMWFjNWFlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jLmMKQEAgLTE2LDYgKzE2LDcgQEAKICAqLwogCiAjaW5jbHVkZSAiYmZhZF9kcnYuaCIKKyNpbmNsdWRlICJiZmFkX2ltLmgiCiAjaW5jbHVkZSAiYmZhX2lvYy5oIgogI2luY2x1ZGUgImJmaV9yZWcuaCIKICNpbmNsdWRlICJiZmFfZGVmcy5oIgpAQCAtNDU4LDYgKzQ1OSw3IEBACiAJaW9jLT5jYmZuLT5lbmFibGVfY2Jmbihpb2MtPmJmYSwgQkZBX1NUQVRVU19PSyk7CiAJYmZhX2lvY19ldmVudF9ub3RpZnkoaW9jLCBCRkFfSU9DX0VfRU5BQkxFRCk7CiAJQkZBX0xPRyhLRVJOX0lORk8sIGJmYWQsIGJmYV9sb2dfbGV2ZWwsICJJT0MgZW5hYmxlZFxuIik7CisJYmZhX2lvY19hZW5fcG9zdChpb2MsIEJGQV9JT0NfQUVOX0VOQUJMRSk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC01MDIsNiArNTA0LDcgQEAKIAlzdHJ1Y3QgYmZhZF9zICpiZmFkID0gKHN0cnVjdCBiZmFkX3MgKilpb2MtPmJmYS0+YmZhZDsKIAliZmFfZnNtX3NlbmRfZXZlbnQoJmlvYy0+aW9jcGYsIElPQ1BGX0VfRElTQUJMRSk7CiAJQkZBX0xPRyhLRVJOX0lORk8sIGJmYWQsIGJmYV9sb2dfbGV2ZWwsICJJT0MgZGlzYWJsZWRcbiIpOworCWJmYV9pb2NfYWVuX3Bvc3QoaW9jLCBCRkFfSU9DX0FFTl9ESVNBQkxFKTsKIH0KIAogLyoKQEAgLTE5NjYsNiArMTk2OSw3IEBACiAKIAlCRkFfTE9HKEtFUk5fQ1JJVCwgYmZhZCwgYmZhX2xvZ19sZXZlbCwKIAkJIkhlYXJ0IEJlYXQgb2YgSU9DIGhhcyBmYWlsZWRcbiIpOworCWJmYV9pb2NfYWVuX3Bvc3QoaW9jLCBCRkFfSU9DX0FFTl9IQkZBSUwpOwogCiB9CiAKQEAgLTE5ODAsNiArMTk4NCw3IEBACiAJQkZBX0xPRyhLRVJOX1dBUk5JTkcsIGJmYWQsIGJmYV9sb2dfbGV2ZWwsCiAJCSJSdW5uaW5nIGZpcm13YXJlIHZlcnNpb24gaXMgaW5jb21wYXRpYmxlICIKIAkJIndpdGggdGhlIGRyaXZlciB2ZXJzaW9uXG4iKTsKKwliZmFfaW9jX2Flbl9wb3N0KGlvYywgQkZBX0lPQ19BRU5fRldNSVNNQVRDSCk7CiB9CiAKIGJmYV9zdGF0dXNfdApAQCAtMjY3OSw2ICsyNjg0LDQzIEBACiB9CiAKIC8qCisgKiBTZW5kIEFFTiBub3RpZmljYXRpb24KKyAqLwordm9pZAorYmZhX2lvY19hZW5fcG9zdChzdHJ1Y3QgYmZhX2lvY19zICppb2MsIGVudW0gYmZhX2lvY19hZW5fZXZlbnQgZXZlbnQpCit7CisJc3RydWN0IGJmYWRfcyAqYmZhZCA9IChzdHJ1Y3QgYmZhZF9zICopaW9jLT5iZmEtPmJmYWQ7CisJc3RydWN0IGJmYV9hZW5fZW50cnlfcwkqYWVuX2VudHJ5OworCWVudW0gYmZhX2lvY190eXBlX2UgaW9jX3R5cGU7CisKKwliZmFkX2dldF9hZW5fZW50cnkoYmZhZCwgYWVuX2VudHJ5KTsKKwlpZiAoIWFlbl9lbnRyeSkKKwkJcmV0dXJuOworCisJaW9jX3R5cGUgPSBiZmFfaW9jX2dldF90eXBlKGlvYyk7CisJc3dpdGNoIChpb2NfdHlwZSkgeworCWNhc2UgQkZBX0lPQ19UWVBFX0ZDOgorCQlhZW5fZW50cnktPmFlbl9kYXRhLmlvYy5wd3duID0gaW9jLT5hdHRyLT5wd3duOworCQlicmVhazsKKwljYXNlIEJGQV9JT0NfVFlQRV9GQ29FOgorCQlhZW5fZW50cnktPmFlbl9kYXRhLmlvYy5wd3duID0gaW9jLT5hdHRyLT5wd3duOworCQlhZW5fZW50cnktPmFlbl9kYXRhLmlvYy5tYWMgPSBiZmFfaW9jX2dldF9tYWMoaW9jKTsKKwkJYnJlYWs7CisJY2FzZSBCRkFfSU9DX1RZUEVfTEw6CisJCWFlbl9lbnRyeS0+YWVuX2RhdGEuaW9jLm1hYyA9IGJmYV9pb2NfZ2V0X21hYyhpb2MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlXQVJOX09OKGlvY190eXBlICE9IEJGQV9JT0NfVFlQRV9GQyk7CisJCWJyZWFrOworCX0KKworCS8qIFNlbmQgdGhlIEFFTiBub3RpZmljYXRpb24gKi8KKwlhZW5fZW50cnktPmFlbl9kYXRhLmlvYy5pb2NfdHlwZSA9IGlvY190eXBlOworCWJmYWRfaW1fcG9zdF92ZW5kb3JfZXZlbnQoYWVuX2VudHJ5LCBiZmFkLCArK2lvYy0+aW9jX2Flbl9zZXEsCisJCQkJICBCRkFfQUVOX0NBVF9JT0MsIGV2ZW50KTsKK30KKworLyoKICAqIFJldHJpZXZlIHNhdmVkIGZpcm13YXJlIHRyYWNlIGZyb20gYSBwcmlvciBJT0MgZmFpbHVyZS4KICAqLwogYmZhX3N0YXR1c190CkBAIC0yODc5LDYgKzI5MjEsMTAgQEAKIHsKIAlpZiAoYmZhX2lvY19nZXRfdHlwZShpb2MpID09IEJGQV9JT0NfVFlQRV9MTCkKIAkJcmV0dXJuOworCWlmIChpb2MtPmF0dHItPm53d24gPT0gMCkKKwkJYmZhX2lvY19hZW5fcG9zdChpb2MsIEJGQV9JT0NfQUVOX0lOVkFMSURfTldXTik7CisJaWYgKGlvYy0+YXR0ci0+cHd3biA9PSAwKQorCQliZmFfaW9jX2Flbl9wb3N0KGlvYywgQkZBX0lPQ19BRU5fSU5WQUxJRF9QV1dOKTsKIH0KIAogLyoKQEAgLTM0NDMsNiArMzQ4OSw1NCBAQAogfQogCiAvKgorICogU0ZQJ3MgU3RhdGUgQ2hhbmdlIE5vdGlmaWNhdGlvbiBwb3N0IHRvIEFFTgorICovCitzdGF0aWMgdm9pZAorYmZhX3NmcF9zY25fYWVuX3Bvc3Qoc3RydWN0IGJmYV9zZnBfcyAqc2ZwLCBzdHJ1Y3QgYmZpX3NmcF9zY25fcyAqcnNwKQoreworCXN0cnVjdCBiZmFkX3MgKmJmYWQgPSAoc3RydWN0IGJmYWRfcyAqKXNmcC0+aW9jLT5iZmEtPmJmYWQ7CisJc3RydWN0IGJmYV9hZW5fZW50cnlfcyAgKmFlbl9lbnRyeTsKKwllbnVtIGJmYV9wb3J0X2Flbl9ldmVudCBhZW5fZXZ0ID0gMDsKKworCWJmYV90cmMoc2ZwLCAoKCh1NjQpcnNwLT5wb21sdmwpIDw8IDE2KSB8ICgoKHU2NClyc3AtPnNmcGlkKSA8PCA4KSB8CisJCSAgICAgICgodTY0KXJzcC0+ZXZlbnQpKTsKKworCWJmYWRfZ2V0X2Flbl9lbnRyeShiZmFkLCBhZW5fZW50cnkpOworCWlmICghYWVuX2VudHJ5KQorCQlyZXR1cm47CisKKwlhZW5fZW50cnktPmFlbl9kYXRhLnBvcnQuaW9jX3R5cGUgPSBiZmFfaW9jX2dldF90eXBlKHNmcC0+aW9jKTsKKwlhZW5fZW50cnktPmFlbl9kYXRhLnBvcnQucHd3biA9IHNmcC0+aW9jLT5hdHRyLT5wd3duOworCWFlbl9lbnRyeS0+YWVuX2RhdGEucG9ydC5tYWMgPSBiZmFfaW9jX2dldF9tYWMoc2ZwLT5pb2MpOworCisJc3dpdGNoIChyc3AtPmV2ZW50KSB7CisJY2FzZSBCRkFfU0ZQX1NDTl9JTlNFUlRFRDoKKwkJYWVuX2V2dCA9IEJGQV9QT1JUX0FFTl9TRlBfSU5TRVJUOworCQlicmVhazsKKwljYXNlIEJGQV9TRlBfU0NOX1JFTU9WRUQ6CisJCWFlbl9ldnQgPSBCRkFfUE9SVF9BRU5fU0ZQX1JFTU9WRTsKKwkJYnJlYWs7CisJY2FzZSBCRkFfU0ZQX1NDTl9GQUlMRUQ6CisJCWFlbl9ldnQgPSBCRkFfUE9SVF9BRU5fU0ZQX0FDQ0VTU19FUlJPUjsKKwkJYnJlYWs7CisJY2FzZSBCRkFfU0ZQX1NDTl9VTlNVUFBPUlQ6CisJCWFlbl9ldnQgPSBCRkFfUE9SVF9BRU5fU0ZQX1VOU1VQUE9SVDsKKwkJYnJlYWs7CisJY2FzZSBCRkFfU0ZQX1NDTl9QT006CisJCWFlbl9ldnQgPSBCRkFfUE9SVF9BRU5fU0ZQX1BPTTsKKwkJYWVuX2VudHJ5LT5hZW5fZGF0YS5wb3J0LmxldmVsID0gcnNwLT5wb21sdmw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJmYV90cmMoc2ZwLCByc3AtPmV2ZW50KTsKKwkJV0FSTl9PTigxKTsKKwl9CisKKwkvKiBTZW5kIHRoZSBBRU4gbm90aWZpY2F0aW9uICovCisJYmZhZF9pbV9wb3N0X3ZlbmRvcl9ldmVudChhZW5fZW50cnksIGJmYWQsICsrc2ZwLT5pb2MtPmlvY19hZW5fc2VxLAorCQkJCSAgQkZBX0FFTl9DQVRfUE9SVCwgYWVuX2V2dCk7Cit9CisKKy8qCiAgKglTRlAgZ2V0IGRhdGEgc2VuZAogICovCiBzdGF0aWMgdm9pZApAQCAtMzQ4Miw2ICszNTc2LDUwIEBACiB9CiAKIC8qCisgKglTRlAgc2NuIGhhbmRsZXIKKyAqLworc3RhdGljIHZvaWQKK2JmYV9zZnBfc2NuKHN0cnVjdCBiZmFfc2ZwX3MgKnNmcCwgc3RydWN0IGJmaV9tYm1zZ19zICptc2cpCit7CisJc3RydWN0IGJmaV9zZnBfc2NuX3MgKnJzcCA9IChzdHJ1Y3QgYmZpX3NmcF9zY25fcyAqKSBtc2c7CisKKwlzd2l0Y2ggKHJzcC0+ZXZlbnQpIHsKKwljYXNlIEJGQV9TRlBfU0NOX0lOU0VSVEVEOgorCQlzZnAtPnN0YXRlID0gQkZBX1NGUF9TVEFURV9JTlNFUlRFRDsKKwkJc2ZwLT5kYXRhX3ZhbGlkID0gMDsKKwkJYmZhX3NmcF9zY25fYWVuX3Bvc3Qoc2ZwLCByc3ApOworCQlicmVhazsKKwljYXNlIEJGQV9TRlBfU0NOX1JFTU9WRUQ6CisJCXNmcC0+c3RhdGUgPSBCRkFfU0ZQX1NUQVRFX1JFTU9WRUQ7CisJCXNmcC0+ZGF0YV92YWxpZCA9IDA7CisJCWJmYV9zZnBfc2NuX2Flbl9wb3N0KHNmcCwgcnNwKTsKKwkJIGJyZWFrOworCWNhc2UgQkZBX1NGUF9TQ05fRkFJTEVEOgorCQlzZnAtPnN0YXRlID0gQkZBX1NGUF9TVEFURV9GQUlMRUQ7CisJCXNmcC0+ZGF0YV92YWxpZCA9IDA7CisJCWJmYV9zZnBfc2NuX2Flbl9wb3N0KHNmcCwgcnNwKTsKKwkJYnJlYWs7CisJY2FzZSBCRkFfU0ZQX1NDTl9VTlNVUFBPUlQ6CisJCXNmcC0+c3RhdGUgPSBCRkFfU0ZQX1NUQVRFX1VOU1VQUE9SVDsKKwkJYmZhX3NmcF9zY25fYWVuX3Bvc3Qoc2ZwLCByc3ApOworCQlpZiAoIXNmcC0+bG9jaykKKwkJCWJmYV9zZnBfZ2V0ZGF0YShzZnAsIEJGSV9TRlBfTUVNX0FMTCk7CisJCWJyZWFrOworCWNhc2UgQkZBX1NGUF9TQ05fUE9NOgorCQliZmFfc2ZwX3Njbl9hZW5fcG9zdChzZnAsIHJzcCk7CisJCWJyZWFrOworCWNhc2UgQkZBX1NGUF9TQ05fVkFMSUQ6CisJCXNmcC0+c3RhdGUgPSBCRkFfU0ZQX1NUQVRFX1ZBTElEOworCQlpZiAoIXNmcC0+bG9jaykKKwkJCWJmYV9zZnBfZ2V0ZGF0YShzZnAsIEJGSV9TRlBfTUVNX0FMTCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJmYV90cmMoc2ZwLCByc3AtPmV2ZW50KTsKKwkJV0FSTl9PTigxKTsKKwl9Cit9CisKKy8qCiAgKiBTRlAgc2hvdyBjb21wbGV0ZQogICovCiBzdGF0aWMgdm9pZApAQCAtMzY0NSw3ICszNzgzLDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIEJGSV9TRlBfSTJIX1NDTjoKLQkJYmZhX3RyYyhzZnAsIG1zZy0+bWgubXNnX2lkKTsKKwkJYmZhX3NmcF9zY24oc2ZwLCBtc2cpOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC0zODM4LDYgKzM5NzYsMjYgQEAKIAlCRkFfUk9VTkRVUCgweDAxMDAwMCArIHNpemVvZihzdHJ1Y3QgYmZhX21mZ19ibG9ja19zKSwgQkZBX0ZMQVNIX1NFR19TWikKIAogc3RhdGljIHZvaWQKK2JmYV9mbGFzaF9hZW5fYXVkaXRfcG9zdChzdHJ1Y3QgYmZhX2lvY19zICppb2MsIGVudW0gYmZhX2F1ZGl0X2Flbl9ldmVudCBldmVudCwKKwkJCWludCBpbnN0LCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgYmZhZF9zICpiZmFkID0gKHN0cnVjdCBiZmFkX3MgKilpb2MtPmJmYS0+YmZhZDsKKwlzdHJ1Y3QgYmZhX2Flbl9lbnRyeV9zICAqYWVuX2VudHJ5OworCisJYmZhZF9nZXRfYWVuX2VudHJ5KGJmYWQsIGFlbl9lbnRyeSk7CisJaWYgKCFhZW5fZW50cnkpCisJCXJldHVybjsKKworCWFlbl9lbnRyeS0+YWVuX2RhdGEuYXVkaXQucHd3biA9IGlvYy0+YXR0ci0+cHd3bjsKKwlhZW5fZW50cnktPmFlbl9kYXRhLmF1ZGl0LnBhcnRpdGlvbl9pbnN0ID0gaW5zdDsKKwlhZW5fZW50cnktPmFlbl9kYXRhLmF1ZGl0LnBhcnRpdGlvbl90eXBlID0gdHlwZTsKKworCS8qIFNlbmQgdGhlIEFFTiBub3RpZmljYXRpb24gKi8KKwliZmFkX2ltX3Bvc3RfdmVuZG9yX2V2ZW50KGFlbl9lbnRyeSwgYmZhZCwgKytpb2MtPmlvY19hZW5fc2VxLAorCQkJCSAgQkZBX0FFTl9DQVRfQVVESVQsIGV2ZW50KTsKK30KKworc3RhdGljIHZvaWQKIGJmYV9mbGFzaF9jYihzdHJ1Y3QgYmZhX2ZsYXNoX3MgKmZsYXNoKQogewogCWZsYXNoLT5vcF9idXN5ID0gMDsKQEAgLTM5NzgsNiArNDEzNiw3IEBACiAJCXN0cnVjdCBiZmlfZmxhc2hfZXJhc2VfcnNwX3MgKmVyYXNlOwogCQlzdHJ1Y3QgYmZpX2ZsYXNoX3dyaXRlX3JzcF9zICp3cml0ZTsKIAkJc3RydWN0IGJmaV9mbGFzaF9yZWFkX3JzcF9zICpyZWFkOworCQlzdHJ1Y3QgYmZpX2ZsYXNoX2V2ZW50X3MgKmV2ZW50OwogCQlzdHJ1Y3QgYmZpX21ibXNnX3MgICAqbXNnOwogCX0gbTsKIApAQCAtNDA2MSw4ICs0MjIwLDE5IEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBCRklfRkxBU0hfSTJIX0JPT1RfVkVSX1JTUDoKKwkJYnJlYWs7CiAJY2FzZSBCRklfRkxBU0hfSTJIX0VWRU5UOgotCQliZmFfdHJjKGZsYXNoLCBtc2ctPm1oLm1zZ19pZCk7CisJCXN0YXR1cyA9IGJlMzJfdG9fY3B1KG0uZXZlbnQtPnN0YXR1cyk7CisJCWJmYV90cmMoZmxhc2gsIHN0YXR1cyk7CisJCWlmIChzdGF0dXMgPT0gQkZBX1NUQVRVU19CQURfRldDRkcpCisJCQliZmFfaW9jX2Flbl9wb3N0KGZsYXNoLT5pb2MsIEJGQV9JT0NfQUVOX0ZXQ0ZHX0VSUk9SKTsKKwkJZWxzZSBpZiAoc3RhdHVzID09IEJGQV9TVEFUVVNfSU5WQUxJRF9WRU5ET1IpIHsKKwkJCXUzMiBwYXJhbTsKKwkJCXBhcmFtID0gYmUzMl90b19jcHUobS5ldmVudC0+cGFyYW0pOworCQkJYmZhX3RyYyhmbGFzaCwgcGFyYW0pOworCQkJYmZhX2lvY19hZW5fcG9zdChmbGFzaC0+aW9jLAorCQkJCUJGQV9JT0NfQUVOX0lOVkFMSURfVkVORE9SKTsKKwkJfQogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC00MjA0LDYgKzQzNzQsOCBAQAogCWZsYXNoLT5pbnN0YW5jZSA9IGluc3RhbmNlOwogCiAJYmZhX2ZsYXNoX2VyYXNlX3NlbmQoZmxhc2gpOworCWJmYV9mbGFzaF9hZW5fYXVkaXRfcG9zdChmbGFzaC0+aW9jLCBCRkFfQVVESVRfQUVOX0ZMQVNIX0VSQVNFLAorCQkJCWluc3RhbmNlLCB0eXBlKTsKIAlyZXR1cm4gQkZBX1NUQVRVU19PSzsKIH0KIApAQCAtNTQxNiwzICs1NTg4LDM5NiBAQAogCQlXQVJOX09OKDEpOwogCX0KIH0KKworLyoKKyAqCURDT05GIG1vZHVsZSBzcGVjaWZpYworICovCisKK0JGQV9NT0RVTEUoZGNvbmYpOworCisvKgorICogRENPTkYgc3RhdGUgbWFjaGluZSBldmVudHMKKyAqLworZW51bSBiZmFfZGNvbmZfZXZlbnQgeworCUJGQV9EQ09ORl9TTV9JTklUCQk9IDEsCS8qIGRjb25mIEluaXQgKi8KKwlCRkFfRENPTkZfU01fRkxBU0hfQ09NUAkJPSAyLAkvKiByZWFkL3dyaXRlIHRvIGZsYXNoICovCisJQkZBX0RDT05GX1NNX1dSCQkJPSAzLAkvKiBiaW5kaW5nIGNoYW5nZSwgbWFwICovCisJQkZBX0RDT05GX1NNX1RJTUVPVVQJCT0gNCwJLyogU3RhcnQgdGltZXIgKi8KKwlCRkFfRENPTkZfU01fRVhJVAkJPSA1LAkvKiBleGl0IGRjb25mIG1vZHVsZSAqLworCUJGQV9EQ09ORl9TTV9JT0NESVNBQkxFCQk9IDYsCS8qIElPQyBkaXNhYmxlIGV2ZW50ICovCit9OworCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9uIG9mIERDT05GIHN0YXRlIG1hY2hpbmUgKi8KK3N0YXRpYyB2b2lkIGJmYV9kY29uZl9zbV91bmluaXQoc3RydWN0IGJmYV9kY29uZl9tb2RfcyAqZGNvbmYsCisJCQkJZW51bSBiZmFfZGNvbmZfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgYmZhX2Rjb25mX3NtX2ZsYXNoX3JlYWQoc3RydWN0IGJmYV9kY29uZl9tb2RfcyAqZGNvbmYsCisJCQkJZW51bSBiZmFfZGNvbmZfZXZlbnQgZXZlbnQpOworc3RhdGljIHZvaWQgYmZhX2Rjb25mX3NtX3JlYWR5KHN0cnVjdCBiZmFfZGNvbmZfbW9kX3MgKmRjb25mLAorCQkJCWVudW0gYmZhX2Rjb25mX2V2ZW50IGV2ZW50KTsKK3N0YXRpYyB2b2lkIGJmYV9kY29uZl9zbV9kaXJ0eShzdHJ1Y3QgYmZhX2Rjb25mX21vZF9zICpkY29uZiwKKwkJCQllbnVtIGJmYV9kY29uZl9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCBiZmFfZGNvbmZfc21fc3luYyhzdHJ1Y3QgYmZhX2Rjb25mX21vZF9zICpkY29uZiwKKwkJCQllbnVtIGJmYV9kY29uZl9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCBiZmFfZGNvbmZfc21fZmluYWxfc3luYyhzdHJ1Y3QgYmZhX2Rjb25mX21vZF9zICpkY29uZiwKKwkJCQllbnVtIGJmYV9kY29uZl9ldmVudCBldmVudCk7CitzdGF0aWMgdm9pZCBiZmFfZGNvbmZfc21faW9jZG93bl9kaXJ0eShzdHJ1Y3QgYmZhX2Rjb25mX21vZF9zICpkY29uZiwKKwkJCQllbnVtIGJmYV9kY29uZl9ldmVudCBldmVudCk7CisKK3N0YXRpYyB2b2lkIGJmYV9kY29uZl9jYmZuKHZvaWQgKmRjb25mLCBiZmFfc3RhdHVzX3Qgc3RhdHVzKTsKK3N0YXRpYyB2b2lkIGJmYV9kY29uZl90aW1lcih2b2lkICpjYmFyZyk7CitzdGF0aWMgYmZhX3N0YXR1c190IGJmYV9kY29uZl9mbGFzaF93cml0ZShzdHJ1Y3QgYmZhX2Rjb25mX21vZF9zICpkY29uZik7CitzdGF0aWMgdm9pZCBiZmFfZGNvbmZfaW5pdF9jYih2b2lkICphcmcsIGJmYV9zdGF0dXNfdCBzdGF0dXMpOworCisvKgorICogQmVnaW5pbmcgc3RhdGUgb2YgZGNvbmYgbW9kdWxlLiBXYWl0aW5nIGZvciBhbiBldmVudCB0byBzdGFydC4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9kY29uZl9zbV91bmluaXQoc3RydWN0IGJmYV9kY29uZl9tb2RfcyAqZGNvbmYsIGVudW0gYmZhX2Rjb25mX2V2ZW50IGV2ZW50KQoreworCWJmYV9zdGF0dXNfdCBiZmFfc3RhdHVzOworCWJmYV90cmMoZGNvbmYtPmJmYSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0RDT05GX1NNX0lOSVQ6CisJCWlmIChkY29uZi0+bWluX2NmZykgeworCQkJYmZhX3RyYyhkY29uZi0+YmZhLCBkY29uZi0+bWluX2NmZyk7CisJCQlyZXR1cm47CisJCX0KKwkJYmZhX3NtX3NldF9zdGF0ZShkY29uZiwgYmZhX2Rjb25mX3NtX2ZsYXNoX3JlYWQpOworCQlkY29uZi0+Zmxhc2hkb25lID0gQkZBX0ZBTFNFOworCQliZmFfdHJjKGRjb25mLT5iZmEsIGRjb25mLT5mbGFzaGRvbmUpOworCQliZmFfc3RhdHVzID0gYmZhX2ZsYXNoX3JlYWRfcGFydChCRkFfRkxBU0goZGNvbmYtPmJmYSksCisJCQkJCUJGQV9GTEFTSF9QQVJUX0RSViwgZGNvbmYtPmluc3RhbmNlLAorCQkJCQlkY29uZi0+ZGNvbmYsCisJCQkJCXNpemVvZihzdHJ1Y3QgYmZhX2Rjb25mX3MpLCAwLAorCQkJCQliZmFfZGNvbmZfaW5pdF9jYiwgZGNvbmYtPmJmYSk7CisJCWlmIChiZmFfc3RhdHVzICE9IEJGQV9TVEFUVVNfT0spIHsKKwkJCWJmYV9kY29uZl9pbml0X2NiKGRjb25mLT5iZmEsIEJGQV9TVEFUVVNfRkFJTEVEKTsKKwkJCWJmYV9zbV9zZXRfc3RhdGUoZGNvbmYsIGJmYV9kY29uZl9zbV91bmluaXQpOworCQkJcmV0dXJuOworCQl9CisJCWJyZWFrOworCWNhc2UgQkZBX0RDT05GX1NNX0VYSVQ6CisJCWRjb25mLT5mbGFzaGRvbmUgPSBCRkFfVFJVRTsKKwljYXNlIEJGQV9EQ09ORl9TTV9JT0NESVNBQkxFOgorCWNhc2UgQkZBX0RDT05GX1NNX1dSOgorCWNhc2UgQkZBX0RDT05GX1NNX0ZMQVNIX0NPTVA6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJmYV9zbV9mYXVsdChkY29uZi0+YmZhLCBldmVudCk7CisJfQorfQorCisvKgorICogUmVhZCBmbGFzaCBmb3IgZGNvbmYgZW50cmllcyBhbmQgbWFrZSBhIGNhbGwgYmFjayB0byB0aGUgZHJpdmVyIG9uY2UgZG9uZS4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9kY29uZl9zbV9mbGFzaF9yZWFkKHN0cnVjdCBiZmFfZGNvbmZfbW9kX3MgKmRjb25mLAorCQkJZW51bSBiZmFfZGNvbmZfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhkY29uZi0+YmZhLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfRENPTkZfU01fRkxBU0hfQ09NUDoKKwkJYmZhX3NtX3NldF9zdGF0ZShkY29uZiwgYmZhX2Rjb25mX3NtX3JlYWR5KTsKKwkJYnJlYWs7CisJY2FzZSBCRkFfRENPTkZfU01fVElNRU9VVDoKKwkJYmZhX3NtX3NldF9zdGF0ZShkY29uZiwgYmZhX2Rjb25mX3NtX3JlYWR5KTsKKwkJYnJlYWs7CisJY2FzZSBCRkFfRENPTkZfU01fRVhJVDoKKwkJZGNvbmYtPmZsYXNoZG9uZSA9IEJGQV9UUlVFOworCQliZmFfdHJjKGRjb25mLT5iZmEsIGRjb25mLT5mbGFzaGRvbmUpOworCWNhc2UgQkZBX0RDT05GX1NNX0lPQ0RJU0FCTEU6CisJCWJmYV9zbV9zZXRfc3RhdGUoZGNvbmYsIGJmYV9kY29uZl9zbV91bmluaXQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQliZmFfc21fZmF1bHQoZGNvbmYtPmJmYSwgZXZlbnQpOworCX0KK30KKworLyoKKyAqIERDT05GIE1vZHVsZSBpcyBpbiByZWFkeSBzdGF0ZS4gSGFzIGNvbXBsZXRlZCB0aGUgaW5pdGlhbGl6YXRpb24uCisgKi8KK3N0YXRpYyB2b2lkCitiZmFfZGNvbmZfc21fcmVhZHkoc3RydWN0IGJmYV9kY29uZl9tb2RfcyAqZGNvbmYsIGVudW0gYmZhX2Rjb25mX2V2ZW50IGV2ZW50KQoreworCWJmYV90cmMoZGNvbmYtPmJmYSwgZXZlbnQpOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0RDT05GX1NNX1dSOgorCQliZmFfdGltZXJfc3RhcnQoZGNvbmYtPmJmYSwgJmRjb25mLT50aW1lciwKKwkJCWJmYV9kY29uZl90aW1lciwgZGNvbmYsIEJGQV9EQ09ORl9VUERBVEVfVE9WKTsKKwkJYmZhX3NtX3NldF9zdGF0ZShkY29uZiwgYmZhX2Rjb25mX3NtX2RpcnR5KTsKKwkJYnJlYWs7CisJY2FzZSBCRkFfRENPTkZfU01fRVhJVDoKKwkJZGNvbmYtPmZsYXNoZG9uZSA9IEJGQV9UUlVFOworCQliZmFfdHJjKGRjb25mLT5iZmEsIGRjb25mLT5mbGFzaGRvbmUpOworCQliZmFfc21fc2V0X3N0YXRlKGRjb25mLCBiZmFfZGNvbmZfc21fdW5pbml0KTsKKwkJYnJlYWs7CisJY2FzZSBCRkFfRENPTkZfU01fSU5JVDoKKwljYXNlIEJGQV9EQ09ORl9TTV9JT0NESVNBQkxFOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQliZmFfc21fZmF1bHQoZGNvbmYtPmJmYSwgZXZlbnQpOworCX0KK30KKworLyoKKyAqIGVudHJpZXMgYXJlIGRpcnR5LCB3cml0ZSBiYWNrIHRvIHRoZSBmbGFzaC4KKyAqLworCitzdGF0aWMgdm9pZAorYmZhX2Rjb25mX3NtX2RpcnR5KHN0cnVjdCBiZmFfZGNvbmZfbW9kX3MgKmRjb25mLCBlbnVtIGJmYV9kY29uZl9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKGRjb25mLT5iZmEsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9EQ09ORl9TTV9USU1FT1VUOgorCQliZmFfc21fc2V0X3N0YXRlKGRjb25mLCBiZmFfZGNvbmZfc21fc3luYyk7CisJCWJmYV9kY29uZl9mbGFzaF93cml0ZShkY29uZik7CisJCWJyZWFrOworCWNhc2UgQkZBX0RDT05GX1NNX1dSOgorCQliZmFfdGltZXJfc3RvcCgmZGNvbmYtPnRpbWVyKTsKKwkJYmZhX3RpbWVyX3N0YXJ0KGRjb25mLT5iZmEsICZkY29uZi0+dGltZXIsCisJCQliZmFfZGNvbmZfdGltZXIsIGRjb25mLCBCRkFfRENPTkZfVVBEQVRFX1RPVik7CisJCWJyZWFrOworCWNhc2UgQkZBX0RDT05GX1NNX0VYSVQ6CisJCWJmYV90aW1lcl9zdG9wKCZkY29uZi0+dGltZXIpOworCQliZmFfdGltZXJfc3RhcnQoZGNvbmYtPmJmYSwgJmRjb25mLT50aW1lciwKKwkJCWJmYV9kY29uZl90aW1lciwgZGNvbmYsIEJGQV9EQ09ORl9VUERBVEVfVE9WKTsKKwkJYmZhX3NtX3NldF9zdGF0ZShkY29uZiwgYmZhX2Rjb25mX3NtX2ZpbmFsX3N5bmMpOworCQliZmFfZGNvbmZfZmxhc2hfd3JpdGUoZGNvbmYpOworCQlicmVhazsKKwljYXNlIEJGQV9EQ09ORl9TTV9GTEFTSF9DT01QOgorCQlicmVhazsKKwljYXNlIEJGQV9EQ09ORl9TTV9JT0NESVNBQkxFOgorCQliZmFfdGltZXJfc3RvcCgmZGNvbmYtPnRpbWVyKTsKKwkJYmZhX3NtX3NldF9zdGF0ZShkY29uZiwgYmZhX2Rjb25mX3NtX2lvY2Rvd25fZGlydHkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQliZmFfc21fZmF1bHQoZGNvbmYtPmJmYSwgZXZlbnQpOworCX0KK30KKworLyoKKyAqIFN5bmMgdGhlIGRjb25mIGVudHJpZXMgdG8gdGhlIGZsYXNoLgorICovCitzdGF0aWMgdm9pZAorYmZhX2Rjb25mX3NtX2ZpbmFsX3N5bmMoc3RydWN0IGJmYV9kY29uZl9tb2RfcyAqZGNvbmYsCisJCQllbnVtIGJmYV9kY29uZl9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKGRjb25mLT5iZmEsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9EQ09ORl9TTV9JT0NESVNBQkxFOgorCWNhc2UgQkZBX0RDT05GX1NNX0ZMQVNIX0NPTVA6CisJCWJmYV90aW1lcl9zdG9wKCZkY29uZi0+dGltZXIpOworCWNhc2UgQkZBX0RDT05GX1NNX1RJTUVPVVQ6CisJCWJmYV9zbV9zZXRfc3RhdGUoZGNvbmYsIGJmYV9kY29uZl9zbV91bmluaXQpOworCQlkY29uZi0+Zmxhc2hkb25lID0gQkZBX1RSVUU7CisJCWJmYV90cmMoZGNvbmYtPmJmYSwgZGNvbmYtPmZsYXNoZG9uZSk7CisJCWJmYV9pb2NfZGlzYWJsZSgmZGNvbmYtPmJmYS0+aW9jKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYmZhX3NtX2ZhdWx0KGRjb25mLT5iZmEsIGV2ZW50KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZGNvbmZfc21fc3luYyhzdHJ1Y3QgYmZhX2Rjb25mX21vZF9zICpkY29uZiwgZW51bSBiZmFfZGNvbmZfZXZlbnQgZXZlbnQpCit7CisJYmZhX3RyYyhkY29uZi0+YmZhLCBldmVudCk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBCRkFfRENPTkZfU01fRkxBU0hfQ09NUDoKKwkJYmZhX3NtX3NldF9zdGF0ZShkY29uZiwgYmZhX2Rjb25mX3NtX3JlYWR5KTsKKwkJYnJlYWs7CisJY2FzZSBCRkFfRENPTkZfU01fV1I6CisJCWJmYV90aW1lcl9zdGFydChkY29uZi0+YmZhLCAmZGNvbmYtPnRpbWVyLAorCQkJYmZhX2Rjb25mX3RpbWVyLCBkY29uZiwgQkZBX0RDT05GX1VQREFURV9UT1YpOworCQliZmFfc21fc2V0X3N0YXRlKGRjb25mLCBiZmFfZGNvbmZfc21fZGlydHkpOworCQlicmVhazsKKwljYXNlIEJGQV9EQ09ORl9TTV9FWElUOgorCQliZmFfdGltZXJfc3RhcnQoZGNvbmYtPmJmYSwgJmRjb25mLT50aW1lciwKKwkJCWJmYV9kY29uZl90aW1lciwgZGNvbmYsIEJGQV9EQ09ORl9VUERBVEVfVE9WKTsKKwkJYmZhX3NtX3NldF9zdGF0ZShkY29uZiwgYmZhX2Rjb25mX3NtX2ZpbmFsX3N5bmMpOworCQlicmVhazsKKwljYXNlIEJGQV9EQ09ORl9TTV9JT0NESVNBQkxFOgorCQliZmFfc21fc2V0X3N0YXRlKGRjb25mLCBiZmFfZGNvbmZfc21faW9jZG93bl9kaXJ0eSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJmYV9zbV9mYXVsdChkY29uZi0+YmZhLCBldmVudCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYmZhX2Rjb25mX3NtX2lvY2Rvd25fZGlydHkoc3RydWN0IGJmYV9kY29uZl9tb2RfcyAqZGNvbmYsCisJCQllbnVtIGJmYV9kY29uZl9ldmVudCBldmVudCkKK3sKKwliZmFfdHJjKGRjb25mLT5iZmEsIGV2ZW50KTsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEJGQV9EQ09ORl9TTV9JTklUOgorCQliZmFfdGltZXJfc3RhcnQoZGNvbmYtPmJmYSwgJmRjb25mLT50aW1lciwKKwkJCWJmYV9kY29uZl90aW1lciwgZGNvbmYsIEJGQV9EQ09ORl9VUERBVEVfVE9WKTsKKwkJYmZhX3NtX3NldF9zdGF0ZShkY29uZiwgYmZhX2Rjb25mX3NtX2RpcnR5KTsKKwkJYnJlYWs7CisJY2FzZSBCRkFfRENPTkZfU01fRVhJVDoKKwkJZGNvbmYtPmZsYXNoZG9uZSA9IEJGQV9UUlVFOworCQliZmFfc21fc2V0X3N0YXRlKGRjb25mLCBiZmFfZGNvbmZfc21fdW5pbml0KTsKKwkJYnJlYWs7CisJY2FzZSBCRkFfRENPTkZfU01fSU9DRElTQUJMRToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYmZhX3NtX2ZhdWx0KGRjb25mLT5iZmEsIGV2ZW50KTsKKwl9Cit9CisKKy8qCisgKiBDb21wdXRlIGFuZCByZXR1cm4gbWVtb3J5IG5lZWRlZCBieSBEUlZfQ0ZHIG1vZHVsZS4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9kY29uZl9tZW1pbmZvKHN0cnVjdCBiZmFfaW9jZmNfY2ZnX3MgKmNmZywgc3RydWN0IGJmYV9tZW1pbmZvX3MgKm1lbWluZm8sCisJCSAgc3RydWN0IGJmYV9zICpiZmEpCit7CisJc3RydWN0IGJmYV9tZW1fa3ZhX3MgKmRjb25mX2t2YSA9IEJGQV9NRU1fRENPTkZfS1ZBKGJmYSk7CisKKwlpZiAoY2ZnLT5kcnZjZmcubWluX2NmZykKKwkJYmZhX21lbV9rdmFfc2V0dXAobWVtaW5mbywgZGNvbmZfa3ZhLAorCQkJCXNpemVvZihzdHJ1Y3QgYmZhX2Rjb25mX2hkcl9zKSk7CisJZWxzZQorCQliZmFfbWVtX2t2YV9zZXR1cChtZW1pbmZvLCBkY29uZl9rdmEsCisJCQkJc2l6ZW9mKHN0cnVjdCBiZmFfZGNvbmZfcykpOworfQorCitzdGF0aWMgdm9pZAorYmZhX2Rjb25mX2F0dGFjaChzdHJ1Y3QgYmZhX3MgKmJmYSwgdm9pZCAqYmZhZCwgc3RydWN0IGJmYV9pb2NmY19jZmdfcyAqY2ZnLAorCQlzdHJ1Y3QgYmZhX3BjaWRldl9zICpwY2lkZXYpCit7CisJc3RydWN0IGJmYV9kY29uZl9tb2RfcyAqZGNvbmYgPSBCRkFfRENPTkZfTU9EKGJmYSk7CisKKwlkY29uZi0+YmZhZCA9IGJmYWQ7CisJZGNvbmYtPmJmYSA9IGJmYTsKKwlkY29uZi0+aW5zdGFuY2UgPSBiZmEtPmlvYy5wb3J0X2lkOworCWJmYV90cmMoYmZhLCBkY29uZi0+aW5zdGFuY2UpOworCisJZGNvbmYtPmRjb25mID0gKHN0cnVjdCBiZmFfZGNvbmZfcyAqKSBiZmFfbWVtX2t2YV9jdXJwKGRjb25mKTsKKwlpZiAoY2ZnLT5kcnZjZmcubWluX2NmZykgeworCQliZmFfbWVtX2t2YV9jdXJwKGRjb25mKSArPSBzaXplb2Yoc3RydWN0IGJmYV9kY29uZl9oZHJfcyk7CisJCWRjb25mLT5taW5fY2ZnID0gQkZBX1RSVUU7CisJCS8qCisJCSAqIFNldCB0aGUgZmxhc2hkb25lIGZsYWcgdG8gVFJVRSBleHBsaWNpdGx5IGFzIG5vIGZsYXNoCisJCSAqIHdyaXRlIHdpbGwgaGFwcGVuIGluIG1pbl9jZmcgbW9kZS4KKwkJICovCisJCWRjb25mLT5mbGFzaGRvbmUgPSBCRkFfVFJVRTsKKwl9IGVsc2UgeworCQlkY29uZi0+bWluX2NmZyA9IEJGQV9GQUxTRTsKKwkJYmZhX21lbV9rdmFfY3VycChkY29uZikgKz0gc2l6ZW9mKHN0cnVjdCBiZmFfZGNvbmZfcyk7CisJfQorCisJYmZhX2Rjb25mX3JlYWRfZGF0YV92YWxpZChiZmEpID0gQkZBX0ZBTFNFOworCWJmYV9zbV9zZXRfc3RhdGUoZGNvbmYsIGJmYV9kY29uZl9zbV91bmluaXQpOworfQorCitzdGF0aWMgdm9pZAorYmZhX2Rjb25mX2luaXRfY2Iodm9pZCAqYXJnLCBiZmFfc3RhdHVzX3Qgc3RhdHVzKQoreworCXN0cnVjdCBiZmFfcyAqYmZhID0gYXJnOworCXN0cnVjdCBiZmFfZGNvbmZfbW9kX3MgKmRjb25mID0gQkZBX0RDT05GX01PRChiZmEpOworCisJZGNvbmYtPmZsYXNoZG9uZSA9IEJGQV9UUlVFOworCWJmYV90cmMoYmZhLCBkY29uZi0+Zmxhc2hkb25lKTsKKwliZmFfaW9jZmNfY2JfZGNvbmZfbW9kaW5pdChiZmEsIHN0YXR1cyk7CisJaWYgKHN0YXR1cyA9PSBCRkFfU1RBVFVTX09LKSB7CisJCWJmYV9kY29uZl9yZWFkX2RhdGFfdmFsaWQoYmZhKSA9IEJGQV9UUlVFOworCQlpZiAoZGNvbmYtPmRjb25mLT5oZHIuc2lnbmF0dXJlICE9IEJGSV9EQ09ORl9TSUdOQVRVUkUpCisJCQlkY29uZi0+ZGNvbmYtPmhkci5zaWduYXR1cmUgPSBCRklfRENPTkZfU0lHTkFUVVJFOworCQlpZiAoZGNvbmYtPmRjb25mLT5oZHIudmVyc2lvbiAhPSBCRklfRENPTkZfVkVSU0lPTikKKwkJCWRjb25mLT5kY29uZi0+aGRyLnZlcnNpb24gPSBCRklfRENPTkZfVkVSU0lPTjsKKwl9CisJYmZhX3NtX3NlbmRfZXZlbnQoZGNvbmYsIEJGQV9EQ09ORl9TTV9GTEFTSF9DT01QKTsKK30KKwordm9pZAorYmZhX2Rjb25mX21vZGluaXQoc3RydWN0IGJmYV9zICpiZmEpCit7CisJc3RydWN0IGJmYV9kY29uZl9tb2RfcyAqZGNvbmYgPSBCRkFfRENPTkZfTU9EKGJmYSk7CisJYmZhX3NtX3NlbmRfZXZlbnQoZGNvbmYsIEJGQV9EQ09ORl9TTV9JTklUKTsKK30KK3N0YXRpYyB2b2lkCitiZmFfZGNvbmZfc3RhcnQoc3RydWN0IGJmYV9zICpiZmEpCit7Cit9CisKK3N0YXRpYyB2b2lkCitiZmFfZGNvbmZfc3RvcChzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKK30KKworc3RhdGljIHZvaWQgYmZhX2Rjb25mX3RpbWVyKHZvaWQgKmNiYXJnKQoreworCXN0cnVjdCBiZmFfZGNvbmZfbW9kX3MgKmRjb25mID0gY2Jhcmc7CisJYmZhX3NtX3NlbmRfZXZlbnQoZGNvbmYsIEJGQV9EQ09ORl9TTV9USU1FT1VUKTsKK30KK3N0YXRpYyB2b2lkCitiZmFfZGNvbmZfaW9jZGlzYWJsZShzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKKwlzdHJ1Y3QgYmZhX2Rjb25mX21vZF9zICpkY29uZiA9IEJGQV9EQ09ORl9NT0QoYmZhKTsKKwliZmFfc21fc2VuZF9ldmVudChkY29uZiwgQkZBX0RDT05GX1NNX0lPQ0RJU0FCTEUpOworfQorCitzdGF0aWMgdm9pZAorYmZhX2Rjb25mX2RldGFjaChzdHJ1Y3QgYmZhX3MgKmJmYSkKK3sKK30KKworc3RhdGljIGJmYV9zdGF0dXNfdAorYmZhX2Rjb25mX2ZsYXNoX3dyaXRlKHN0cnVjdCBiZmFfZGNvbmZfbW9kX3MgKmRjb25mKQoreworCWJmYV9zdGF0dXNfdCBiZmFfc3RhdHVzOworCWJmYV90cmMoZGNvbmYtPmJmYSwgMCk7CisKKwliZmFfc3RhdHVzID0gYmZhX2ZsYXNoX3VwZGF0ZV9wYXJ0KEJGQV9GTEFTSChkY29uZi0+YmZhKSwKKwkJCQlCRkFfRkxBU0hfUEFSVF9EUlYsIGRjb25mLT5pbnN0YW5jZSwKKwkJCQlkY29uZi0+ZGNvbmYsICBzaXplb2Yoc3RydWN0IGJmYV9kY29uZl9zKSwgMCwKKwkJCQliZmFfZGNvbmZfY2JmbiwgZGNvbmYpOworCWlmIChiZmFfc3RhdHVzICE9IEJGQV9TVEFUVVNfT0spCisJCVdBUk5fT04oYmZhX3N0YXR1cyk7CisJYmZhX3RyYyhkY29uZi0+YmZhLCBiZmFfc3RhdHVzKTsKKworCXJldHVybiBiZmFfc3RhdHVzOworfQorCitiZmFfc3RhdHVzX3QKK2JmYV9kY29uZl91cGRhdGUoc3RydWN0IGJmYV9zICpiZmEpCit7CisJc3RydWN0IGJmYV9kY29uZl9tb2RfcyAqZGNvbmYgPSBCRkFfRENPTkZfTU9EKGJmYSk7CisJYmZhX3RyYyhkY29uZi0+YmZhLCAwKTsKKwlpZiAoYmZhX3NtX2NtcF9zdGF0ZShkY29uZiwgYmZhX2Rjb25mX3NtX2lvY2Rvd25fZGlydHkpKQorCQlyZXR1cm4gQkZBX1NUQVRVU19GQUlMRUQ7CisKKwlpZiAoZGNvbmYtPm1pbl9jZmcpIHsKKwkJYmZhX3RyYyhkY29uZi0+YmZhLCBkY29uZi0+bWluX2NmZyk7CisJCXJldHVybiBCRkFfU1RBVFVTX0ZBSUxFRDsKKwl9CisKKwliZmFfc21fc2VuZF9ldmVudChkY29uZiwgQkZBX0RDT05GX1NNX1dSKTsKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKworc3RhdGljIHZvaWQKK2JmYV9kY29uZl9jYmZuKHZvaWQgKmFyZywgYmZhX3N0YXR1c190IHN0YXR1cykKK3sKKwlzdHJ1Y3QgYmZhX2Rjb25mX21vZF9zICpkY29uZiA9IGFyZzsKKwlXQVJOX09OKHN0YXR1cyk7CisJYmZhX3NtX3NlbmRfZXZlbnQoZGNvbmYsIEJGQV9EQ09ORl9TTV9GTEFTSF9DT01QKTsKK30KKwordm9pZAorYmZhX2Rjb25mX21vZGV4aXQoc3RydWN0IGJmYV9zICpiZmEpCit7CisJc3RydWN0IGJmYV9kY29uZl9tb2RfcyAqZGNvbmYgPSBCRkFfRENPTkZfTU9EKGJmYSk7CisJQkZBX0RDT05GX01PRChiZmEpLT5mbGFzaGRvbmUgPSBCRkFfRkFMU0U7CisJYmZhX3RyYyhiZmEsIEJGQV9EQ09ORl9NT0QoYmZhKS0+Zmxhc2hkb25lKTsKKwliZmFfc21fc2VuZF9ldmVudChkY29uZiwgQkZBX0RDT05GX1NNX0VYSVQpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfaW9jLmggYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2MuaAppbmRleCBjNWVjZDJlLi41NDZkNDZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2MuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9pb2MuaApAQCAtMzI3LDYgKzMyNyw3IEBACiAJZW51bSBiZmFfbW9kZV9zCQlwb3J0X21vZGU7CiAJdTgJCQlhZF9jYXBfYm07CS8qIGFkYXB0ZXIgY2FwIGJpdCBtYXNrICovCiAJdTgJCQlwb3J0X21vZGVfY2ZnOwkvKiBjb25maWcgcG9ydCBtb2RlICovCisJaW50CQkJaW9jX2Flbl9zZXE7CiB9OwogCiBzdHJ1Y3QgYmZhX2lvY19od2lmX3MgewpAQCAtMzY2LDYgKzM2Nyw4IEBACiAJc3RydWN0IGxpc3RfaGVhZAlxZTsKIAliZmFfY2JfY2Jmbl90CWNiZm47CiAJYmZhX2Jvb2xlYW5fdAlvbmNlOworCWJmYV9ib29sZWFuX3QJcHJlX3JtdjsJLyogc2V0IGZvciBzdGFjayBiYXNlZCBxZShzKSAqLworCWJmYV9zdGF0dXNfdAlmd19zdGF0dXM7CS8qIHRvIGFjY2VzcyBmdyBzdGF0dXMgaW4gY29tcCBwcm9jICovCiAJdm9pZAkJKmNiYXJnOwogfTsKIApAQCAtNjU4LDcgKzY2MSw2IEBACiAJc3RydWN0IGJmYV9pb2Nfbm90aWZ5X3MJaW9jX25vdGlmeTsgLyogaW9jIGV2ZW50IG5vdGlmeSAqLwogCXN0cnVjdCBiZmFfbWVtX2RtYV9zCXBoeV9kbWE7CiB9OwotCiAjZGVmaW5lIEJGQV9QSFkoX19iZmEpCSgmKF9fYmZhKS0+bW9kdWxlcy5waHkpCiAjZGVmaW5lIEJGQV9NRU1fUEhZX0RNQShfX2JmYSkJKCYoQkZBX1BIWShfX2JmYSktPnBoeV9kbWEpKQogCkBAIC02ODQsNiArNjg2LDQ5IEBACiB2b2lkIGJmYV9waHlfaW50cih2b2lkICpwaHlhcmcsIHN0cnVjdCBiZmlfbWJtc2dfcyAqbXNnKTsKIAogLyoKKyAqIERyaXZlciBDb25maWcoIGRjb25mKSBzcGVjaWZpYworICovCisjZGVmaW5lIEJGSV9EQ09ORl9TSUdOQVRVUkUJMHhhYmNkYWJjZAorI2RlZmluZSBCRklfRENPTkZfVkVSU0lPTgkxCisKKyNwcmFnbWEgcGFjaygxKQorc3RydWN0IGJmYV9kY29uZl9oZHJfcyB7CisJdTMyCXNpZ25hdHVyZTsKKwl1MzIJdmVyc2lvbjsKK307CisKK3N0cnVjdCBiZmFfZGNvbmZfcyB7CisJc3RydWN0IGJmYV9kY29uZl9oZHJfcwkJaGRyOworCXN0cnVjdCBiZmFfbHVubWFza19jZmdfcwlsdW5fbWFzazsKK307CisjcHJhZ21hIHBhY2soKQorCitzdHJ1Y3QgYmZhX2Rjb25mX21vZF9zIHsKKwliZmFfc21fdAkJc207CisJdTgJCQlpbnN0YW5jZTsKKwliZmFfYm9vbGVhbl90CQlmbGFzaGRvbmU7CisJYmZhX2Jvb2xlYW5fdAkJcmVhZF9kYXRhX3ZhbGlkOworCWJmYV9ib29sZWFuX3QJCW1pbl9jZmc7CisJc3RydWN0IGJmYV90aW1lcl9zCXRpbWVyOworCXN0cnVjdCBiZmFfcwkJKmJmYTsKKwl2b2lkCQkJKmJmYWQ7CisJdm9pZAkJCSp0cmNtb2Q7CisJc3RydWN0IGJmYV9kY29uZl9zCSpkY29uZjsKKwlzdHJ1Y3QgYmZhX21lbV9rdmFfcwlrdmFfc2VnOworfTsKKworI2RlZmluZSBCRkFfRENPTkZfTU9EKF9fYmZhKQlcCisJKCYoX19iZmEpLT5tb2R1bGVzLmRjb25mX21vZCkKKyNkZWZpbmUgQkZBX01FTV9EQ09ORl9LVkEoX19iZmEpCSgmKEJGQV9EQ09ORl9NT0QoX19iZmEpLT5rdmFfc2VnKSkKKyNkZWZpbmUgYmZhX2Rjb25mX3JlYWRfZGF0YV92YWxpZChfX2JmYSkJXAorCShCRkFfRENPTkZfTU9EKF9fYmZhKS0+cmVhZF9kYXRhX3ZhbGlkKQorI2RlZmluZSBCRkFfRENPTkZfVVBEQVRFX1RPVgk1MDAwCS8qIG1lbXRlc3QgdGltZW91dCBpbiBtc2VjICovCisKK3ZvaWQJYmZhX2Rjb25mX21vZGluaXQoc3RydWN0IGJmYV9zICpiZmEpOwordm9pZAliZmFfZGNvbmZfbW9kZXhpdChzdHJ1Y3QgYmZhX3MgKmJmYSk7CitiZmFfc3RhdHVzX3QJYmZhX2Rjb25mX3VwZGF0ZShzdHJ1Y3QgYmZhX3MgKmJmYSk7CisKKy8qCiAgKglJT0Mgc3BlY2ZpYyBtYWNyb3MKICAqLwogI2RlZmluZSBiZmFfaW9jX3BjaWZuKF9faW9jKQkJKChfX2lvYyktPnBjaWRldi5wY2lfZnVuYykKQEAgLTgwMyw2ICs4NDgsNyBAQAogCQkJc3RydWN0IGJmaV9pb2NfaW1hZ2VfaGRyX3MgKmZ3aGRyKTsKIGJmYV9ib29sZWFuX3QgYmZhX2lvY19md3Zlcl9jbXAoc3RydWN0IGJmYV9pb2NfcyAqaW9jLAogCQkJc3RydWN0IGJmaV9pb2NfaW1hZ2VfaGRyX3MgKmZ3aGRyKTsKK3ZvaWQgYmZhX2lvY19hZW5fcG9zdChzdHJ1Y3QgYmZhX2lvY19zICppb2MsIGVudW0gYmZhX2lvY19hZW5fZXZlbnQgZXZlbnQpOwogYmZhX3N0YXR1c190IGJmYV9pb2NfZndfc3RhdHNfZ2V0KHN0cnVjdCBiZmFfaW9jX3MgKmlvYywgdm9pZCAqc3RhdHMpOwogYmZhX3N0YXR1c190IGJmYV9pb2NfZndfc3RhdHNfY2xlYXIoc3RydWN0IGJmYV9pb2NfcyAqaW9jKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfbW9kdWxlcy5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfbW9kdWxlcy5oCmluZGV4IDFjNmVmZDQuLjJkMzZlNDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX21vZHVsZXMuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYV9tb2R1bGVzLmgKQEAgLTQ0LDYgKzQ0LDcgQEAKIAlzdHJ1Y3QgYmZhX2ZsYXNoX3MJZmxhc2g7CQkvKiAgZmxhc2ggbW9kdWxlICovCiAJc3RydWN0IGJmYV9kaWFnX3MJZGlhZ19tb2Q7CS8qICBkaWFnbm9zdGljcyBtb2R1bGUJKi8KIAlzdHJ1Y3QgYmZhX3BoeV9zCXBoeTsJCS8qICBwaHkgbW9kdWxlCQkqLworCXN0cnVjdCBiZmFfZGNvbmZfbW9kX3MJZGNvbmZfbW9kOwkvKiAgRENPTkYgY29tbW9uIG1vZHVsZQkqLwogfTsKIAogLyoKQEAgLTExOSw2ICsxMjAsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQJcmVxcV93YWl0cVtCRklfSU9DX01BWF9DUVNdOwogCWJmYV9ib29sZWFuX3QJCWZjczsJCS8qICBGQ1MgaXMgYXR0YWNoZWQgdG8gQkZBICovCiAJc3RydWN0IGJmYV9tc2l4X3MJbXNpeDsKKwlpbnQJCQliZmFfYWVuX3NlcTsKIH07CiAKIGV4dGVybiBiZmFfYm9vbGVhbl90IGJmYV9hdXRvX3JlY292ZXI7CkBAIC0xMzAsNSArMTMyLDYgQEAKIGV4dGVybiBzdHJ1Y3QgYmZhX21vZHVsZV9zIGhhbF9tb2RfdWY7CiBleHRlcm4gc3RydWN0IGJmYV9tb2R1bGVfcyBoYWxfbW9kX3Jwb3J0OwogZXh0ZXJuIHN0cnVjdCBiZmFfbW9kdWxlX3MgaGFsX21vZF9mY3A7CitleHRlcm4gc3RydWN0IGJmYV9tb2R1bGVfcyBoYWxfbW9kX2Rjb25mOwogCiAjZW5kaWYgLyogX19CRkFfTU9EVUxFU19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3N2Yy5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfc3ZjLmMKaW5kZXggMjFjYWFlZi4uYWE4YTBlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfc3ZjLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfc3ZjLmMKQEAgLTE2LDYgKzE2LDcgQEAKICAqLwogCiAjaW5jbHVkZSAiYmZhZF9kcnYuaCIKKyNpbmNsdWRlICJiZmFkX2ltLmgiCiAjaW5jbHVkZSAiYmZhX3Bsb2cuaCIKICNpbmNsdWRlICJiZmFfY3MuaCIKICNpbmNsdWRlICJiZmFfbW9kdWxlcy5oIgpAQCAtMjAwNyw2ICsyMDA4LDI0IEBACiAJfQogfQogCitzdGF0aWMgdm9pZAorYmZhX2ZjcG9ydF9hZW5fcG9zdChzdHJ1Y3QgYmZhX2ZjcG9ydF9zICpmY3BvcnQsIGVudW0gYmZhX3BvcnRfYWVuX2V2ZW50IGV2ZW50KQoreworCXN0cnVjdCBiZmFkX3MgKmJmYWQgPSAoc3RydWN0IGJmYWRfcyAqKWZjcG9ydC0+YmZhLT5iZmFkOworCXN0cnVjdCBiZmFfYWVuX2VudHJ5X3MgICphZW5fZW50cnk7CisKKwliZmFkX2dldF9hZW5fZW50cnkoYmZhZCwgYWVuX2VudHJ5KTsKKwlpZiAoIWFlbl9lbnRyeSkKKwkJcmV0dXJuOworCisJYWVuX2VudHJ5LT5hZW5fZGF0YS5wb3J0LmlvY190eXBlID0gYmZhX2dldF90eXBlKGZjcG9ydC0+YmZhKTsKKwlhZW5fZW50cnktPmFlbl9kYXRhLnBvcnQucHd3biA9IGZjcG9ydC0+cHd3bjsKKworCS8qIFNlbmQgdGhlIEFFTiBub3RpZmljYXRpb24gKi8KKwliZmFkX2ltX3Bvc3RfdmVuZG9yX2V2ZW50KGFlbl9lbnRyeSwgYmZhZCwgKytmY3BvcnQtPmJmYS0+YmZhX2Flbl9zZXEsCisJCQkJICBCRkFfQUVOX0NBVF9QT1JULCBldmVudCk7Cit9CisKIC8qCiAgKiBGQyBQT1JUIHN0YXRlIG1hY2hpbmUgZnVuY3Rpb25zCiAgKi8KQEAgLTIwOTUsNiArMjExNCw3IEBACiAJCXd3bjJzdHIocHd3bl9idWYsIGZjcG9ydC0+cHd3bik7CiAJCUJGQV9MT0coS0VSTl9JTkZPLCBiZmFkLCBiZmFfbG9nX2xldmVsLAogCQkJIkJhc2UgcG9ydCBkaXNhYmxlZDogV1dOID0gJXNcbiIsIHB3d25fYnVmKTsKKwkJYmZhX2ZjcG9ydF9hZW5fcG9zdChmY3BvcnQsIEJGQV9QT1JUX0FFTl9ESVNBQkxFKTsKIAkJYnJlYWs7CiAKIAljYXNlIEJGQV9GQ1BPUlRfU01fTElOS1VQOgpAQCAtMjE1NSw2ICsyMTc1LDcgQEAKIAkJd3duMnN0cihwd3duX2J1ZiwgZmNwb3J0LT5wd3duKTsKIAkJQkZBX0xPRyhLRVJOX0lORk8sIGJmYWQsIGJmYV9sb2dfbGV2ZWwsCiAJCQkiQmFzZSBwb3J0IGRpc2FibGVkOiBXV04gPSAlc1xuIiwgcHd3bl9idWYpOworCQliZmFfZmNwb3J0X2Flbl9wb3N0KGZjcG9ydCwgQkZBX1BPUlRfQUVOX0RJU0FCTEUpOwogCQlicmVhazsKIAogCWNhc2UgQkZBX0ZDUE9SVF9TTV9TVE9QOgpAQCAtMjIwOCw2ICsyMjI5LDEyIEBACiAJCXd3bjJzdHIocHd3bl9idWYsIGZjcG9ydC0+cHd3bik7CiAJCUJGQV9MT0coS0VSTl9JTkZPLCBiZmFkLCBiZmFfbG9nX2xldmVsLAogCQkJIkJhc2UgcG9ydCBvbmxpbmU6IFdXTiA9ICVzXG4iLCBwd3duX2J1Zik7CisJCWJmYV9mY3BvcnRfYWVuX3Bvc3QoZmNwb3J0LCBCRkFfUE9SVF9BRU5fT05MSU5FKTsKKworCQkvKiBJZiBRb1MgaXMgZW5hYmxlZCBhbmQgaXQgaXMgbm90IG9ubGluZSwgc2VuZCBBRU4gKi8KKwkJaWYgKGZjcG9ydC0+Y2ZnLnFvc19lbmFibGVkICYmCisJCSAgICBmY3BvcnQtPnFvc19hdHRyLnN0YXRlICE9IEJGQV9RT1NfT05MSU5FKQorCQkJYmZhX2ZjcG9ydF9hZW5fcG9zdChmY3BvcnQsIEJGQV9QT1JUX0FFTl9RT1NfTkVHKTsKIAkJYnJlYWs7CiAKIAljYXNlIEJGQV9GQ1BPUlRfU01fTElOS0RPV046CkBAIC0yMjM0LDYgKzIyNjEsNyBAQAogCQl3d24yc3RyKHB3d25fYnVmLCBmY3BvcnQtPnB3d24pOwogCQlCRkFfTE9HKEtFUk5fSU5GTywgYmZhZCwgYmZhX2xvZ19sZXZlbCwKIAkJCSJCYXNlIHBvcnQgZGlzYWJsZWQ6IFdXTiA9ICVzXG4iLCBwd3duX2J1Zik7CisJCWJmYV9mY3BvcnRfYWVuX3Bvc3QoZmNwb3J0LCBCRkFfUE9SVF9BRU5fRElTQUJMRSk7CiAJCWJyZWFrOwogCiAJY2FzZSBCRkFfRkNQT1JUX1NNX1NUT1A6CkBAIC0yMjc5LDggKzIzMDcsMTAgQEAKIAkJd3duMnN0cihwd3duX2J1ZiwgZmNwb3J0LT5wd3duKTsKIAkJQkZBX0xPRyhLRVJOX0lORk8sIGJmYWQsIGJmYV9sb2dfbGV2ZWwsCiAJCQkiQmFzZSBwb3J0IG9mZmxpbmU6IFdXTiA9ICVzXG4iLCBwd3duX2J1Zik7CisJCWJmYV9mY3BvcnRfYWVuX3Bvc3QoZmNwb3J0LCBCRkFfUE9SVF9BRU5fT0ZGTElORSk7CiAJCUJGQV9MT0coS0VSTl9JTkZPLCBiZmFkLCBiZmFfbG9nX2xldmVsLAogCQkJIkJhc2UgcG9ydCBkaXNhYmxlZDogV1dOID0gJXNcbiIsIHB3d25fYnVmKTsKKwkJYmZhX2ZjcG9ydF9hZW5fcG9zdChmY3BvcnQsIEJGQV9QT1JUX0FFTl9ESVNBQkxFKTsKIAkJYnJlYWs7CiAKIAljYXNlIEJGQV9GQ1BPUlRfU01fTElOS0RPV046CkBAIC0yMjkwLDI2ICsyMzIwLDMyIEBACiAJCWJmYV9wbG9nX3N0cihmY3BvcnQtPmJmYS0+cGxvZywgQkZBX1BMX01JRF9IQUwsCiAJCQkJQkZBX1BMX0VJRF9QT1JUX1NUX0NIQU5HRSwgMCwgIlBvcnQgTGlua2Rvd24iKTsKIAkJd3duMnN0cihwd3duX2J1ZiwgZmNwb3J0LT5wd3duKTsKLQkJaWYgKEJGQV9QT1JUX0lTX0RJU0FCTEVEKGZjcG9ydC0+YmZhKSkKKwkJaWYgKEJGQV9QT1JUX0lTX0RJU0FCTEVEKGZjcG9ydC0+YmZhKSkgewogCQkJQkZBX0xPRyhLRVJOX0lORk8sIGJmYWQsIGJmYV9sb2dfbGV2ZWwsCiAJCQkJIkJhc2UgcG9ydCBvZmZsaW5lOiBXV04gPSAlc1xuIiwgcHd3bl9idWYpOwotCQllbHNlCisJCQliZmFfZmNwb3J0X2Flbl9wb3N0KGZjcG9ydCwgQkZBX1BPUlRfQUVOX09GRkxJTkUpOworCQl9IGVsc2UgewogCQkJQkZBX0xPRyhLRVJOX0VSUiwgYmZhZCwgYmZhX2xvZ19sZXZlbCwKIAkJCQkiQmFzZSBwb3J0IChXV04gPSAlcykgIgogCQkJCSJsb3N0IGZhYnJpYyBjb25uZWN0aXZpdHlcbiIsIHB3d25fYnVmKTsKKwkJCWJmYV9mY3BvcnRfYWVuX3Bvc3QoZmNwb3J0LCBCRkFfUE9SVF9BRU5fRElTQ09OTkVDVCk7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEJGQV9GQ1BPUlRfU01fU1RPUDoKIAkJYmZhX3NtX3NldF9zdGF0ZShmY3BvcnQsIGJmYV9mY3BvcnRfc21fc3RvcHBlZCk7CiAJCWJmYV9mY3BvcnRfcmVzZXRfbGlua2luZm8oZmNwb3J0KTsKIAkJd3duMnN0cihwd3duX2J1ZiwgZmNwb3J0LT5wd3duKTsKLQkJaWYgKEJGQV9QT1JUX0lTX0RJU0FCTEVEKGZjcG9ydC0+YmZhKSkKKwkJaWYgKEJGQV9QT1JUX0lTX0RJU0FCTEVEKGZjcG9ydC0+YmZhKSkgewogCQkJQkZBX0xPRyhLRVJOX0lORk8sIGJmYWQsIGJmYV9sb2dfbGV2ZWwsCiAJCQkJIkJhc2UgcG9ydCBvZmZsaW5lOiBXV04gPSAlc1xuIiwgcHd3bl9idWYpOwotCQllbHNlCisJCQliZmFfZmNwb3J0X2Flbl9wb3N0KGZjcG9ydCwgQkZBX1BPUlRfQUVOX09GRkxJTkUpOworCQl9IGVsc2UgewogCQkJQkZBX0xPRyhLRVJOX0VSUiwgYmZhZCwgYmZhX2xvZ19sZXZlbCwKIAkJCQkiQmFzZSBwb3J0IChXV04gPSAlcykgIgogCQkJCSJsb3N0IGZhYnJpYyBjb25uZWN0aXZpdHlcbiIsIHB3d25fYnVmKTsKKwkJCWJmYV9mY3BvcnRfYWVuX3Bvc3QoZmNwb3J0LCBCRkFfUE9SVF9BRU5fRElTQ09OTkVDVCk7CisJCX0KIAkJYnJlYWs7CiAKIAljYXNlIEJGQV9GQ1BPUlRfU01fSFdGQUlMOgpAQCAtMjMxNywxMyArMjM1MywxNiBAQAogCQliZmFfZmNwb3J0X3Jlc2V0X2xpbmtpbmZvKGZjcG9ydCk7CiAJCWJmYV9mY3BvcnRfc2NuKGZjcG9ydCwgQkZBX1BPUlRfTElOS0RPV04sIEJGQV9GQUxTRSk7CiAJCXd3bjJzdHIocHd3bl9idWYsIGZjcG9ydC0+cHd3bik7Ci0JCWlmIChCRkFfUE9SVF9JU19ESVNBQkxFRChmY3BvcnQtPmJmYSkpCisJCWlmIChCRkFfUE9SVF9JU19ESVNBQkxFRChmY3BvcnQtPmJmYSkpIHsKIAkJCUJGQV9MT0coS0VSTl9JTkZPLCBiZmFkLCBiZmFfbG9nX2xldmVsLAogCQkJCSJCYXNlIHBvcnQgb2ZmbGluZTogV1dOID0gJXNcbiIsIHB3d25fYnVmKTsKLQkJZWxzZQorCQkJYmZhX2ZjcG9ydF9hZW5fcG9zdChmY3BvcnQsIEJGQV9QT1JUX0FFTl9PRkZMSU5FKTsKKwkJfSBlbHNlIHsKIAkJCUJGQV9MT0coS0VSTl9FUlIsIGJmYWQsIGJmYV9sb2dfbGV2ZWwsCiAJCQkJIkJhc2UgcG9ydCAoV1dOID0gJXMpICIKIAkJCQkibG9zdCBmYWJyaWMgY29ubmVjdGl2aXR5XG4iLCBwd3duX2J1Zik7CisJCQliZmFfZmNwb3J0X2Flbl9wb3N0KGZjcG9ydCwgQkZBX1BPUlRfQUVOX0RJU0NPTk5FQ1QpOworCQl9CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTI0NTQsNiArMjQ5Myw3IEBACiAJCXd3bjJzdHIocHd3bl9idWYsIGZjcG9ydC0+cHd3bik7CiAJCUJGQV9MT0coS0VSTl9JTkZPLCBiZmFkLCBiZmFfbG9nX2xldmVsLAogCQkJIkJhc2UgcG9ydCBlbmFibGVkOiBXV04gPSAlc1xuIiwgcHd3bl9idWYpOworCQliZmFfZmNwb3J0X2Flbl9wb3N0KGZjcG9ydCwgQkZBX1BPUlRfQUVOX0VOQUJMRSk7CiAJCWJyZWFrOwogCiAJY2FzZSBCRkFfRkNQT1JUX1NNX1NUT1A6CkBAIC0yNTA4LDYgKzI1NDgsNyBAQAogCQl3d24yc3RyKHB3d25fYnVmLCBmY3BvcnQtPnB3d24pOwogCQlCRkFfTE9HKEtFUk5fSU5GTywgYmZhZCwgYmZhX2xvZ19sZXZlbCwKIAkJCSJCYXNlIHBvcnQgZW5hYmxlZDogV1dOID0gJXNcbiIsIHB3d25fYnVmKTsKKwkJYmZhX2ZjcG9ydF9hZW5fcG9zdChmY3BvcnQsIEJGQV9QT1JUX0FFTl9FTkFCTEUpOwogCQlicmVhazsKIAogCWNhc2UgQkZBX0ZDUE9SVF9TTV9ESVNBQkxFOgpAQCAtMjg3NCw2ICsyOTE1LDkgQEAKIAogCXBvcnRfY2ZnLT50cmxfZGVmX3NwZWVkID0gQkZBX1BPUlRfU1BFRURfMUdCUFM7CiAKKwlJTklUX0xJU1RfSEVBRCgmZmNwb3J0LT5zdGF0c19wZW5kaW5nX3EpOworCUlOSVRfTElTVF9IRUFEKCZmY3BvcnQtPnN0YXRzY2xyX3BlbmRpbmdfcSk7CisKIAliZmFfcmVxcV93aW5pdCgmZmNwb3J0LT5yZXFxX3dhaXQsIGJmYV9mY3BvcnRfcXJlc3VtZSwgZmNwb3J0KTsKIH0KIApAQCAtMzEwMiwzMCArMzE0NiwzOCBAQAogc3RhdGljIHZvaWQKIF9fYmZhX2NiX2ZjcG9ydF9zdGF0c19nZXQodm9pZCAqY2JhcmcsIGJmYV9ib29sZWFuX3QgY29tcGxldGUpCiB7Ci0Jc3RydWN0IGJmYV9mY3BvcnRfcyAqZmNwb3J0ID0gY2Jhcmc7CisJc3RydWN0IGJmYV9mY3BvcnRfcyAqZmNwb3J0ID0gKHN0cnVjdCBiZmFfZmNwb3J0X3MgKiljYmFyZzsKKwlzdHJ1Y3QgYmZhX2NiX3BlbmRpbmdfcV9zICpjYjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpxZSwgKnFlbjsKKwl1bmlvbiBiZmFfZmNwb3J0X3N0YXRzX3UgKnJldDsKIAogCWlmIChjb21wbGV0ZSkgewotCQlpZiAoZmNwb3J0LT5zdGF0c19zdGF0dXMgPT0gQkZBX1NUQVRVU19PSykgewotCQkJc3RydWN0IHRpbWV2YWwgdHY7CisJCXN0cnVjdCB0aW1ldmFsIHR2OworCQlpZiAoZmNwb3J0LT5zdGF0c19zdGF0dXMgPT0gQkZBX1NUQVRVU19PSykKKwkJCWRvX2dldHRpbWVvZmRheSgmdHYpOwogCi0JCQkvKiBTd2FwIEZDIFFvUyBvciBGQ29FIHN0YXRzICovCi0JCQlpZiAoYmZhX2lvY19nZXRfZmNtb2RlKCZmY3BvcnQtPmJmYS0+aW9jKSkgewotCQkJCWJmYV9mY3BvcnRfcW9zX3N0YXRzX3N3YXAoCi0JCQkJCSZmY3BvcnQtPnN0YXRzX3JldC0+ZmNxb3MsCi0JCQkJCSZmY3BvcnQtPnN0YXRzLT5mY3Fvcyk7Ci0JCQl9IGVsc2UgewotCQkJCWJmYV9mY3BvcnRfZmNvZV9zdGF0c19zd2FwKAotCQkJCQkmZmNwb3J0LT5zdGF0c19yZXQtPmZjb2UsCi0JCQkJCSZmY3BvcnQtPnN0YXRzLT5mY29lKTsKLQotCQkJCWRvX2dldHRpbWVvZmRheSgmdHYpOwotCQkJCWZjcG9ydC0+c3RhdHNfcmV0LT5mY29lLnNlY3NfcmVzZXQgPQorCQlsaXN0X2Zvcl9lYWNoX3NhZmUocWUsIHFlbiwgJmZjcG9ydC0+c3RhdHNfcGVuZGluZ19xKSB7CisJCQliZmFfcV9kZXEoJmZjcG9ydC0+c3RhdHNfcGVuZGluZ19xLCAmcWUpOworCQkJY2IgPSAoc3RydWN0IGJmYV9jYl9wZW5kaW5nX3FfcyAqKXFlOworCQkJaWYgKGZjcG9ydC0+c3RhdHNfc3RhdHVzID09IEJGQV9TVEFUVVNfT0spIHsKKwkJCQlyZXQgPSAodW5pb24gYmZhX2ZjcG9ydF9zdGF0c191ICopY2ItPmRhdGE7CisJCQkJLyogU3dhcCBGQyBRb1Mgb3IgRkNvRSBzdGF0cyAqLworCQkJCWlmIChiZmFfaW9jX2dldF9mY21vZGUoJmZjcG9ydC0+YmZhLT5pb2MpKQorCQkJCQliZmFfZmNwb3J0X3Fvc19zdGF0c19zd2FwKCZyZXQtPmZjcW9zLAorCQkJCQkJCSZmY3BvcnQtPnN0YXRzLT5mY3Fvcyk7CisJCQkJZWxzZSB7CisJCQkJCWJmYV9mY3BvcnRfZmNvZV9zdGF0c19zd2FwKCZyZXQtPmZjb2UsCisJCQkJCQkJJmZjcG9ydC0+c3RhdHMtPmZjb2UpOworCQkJCQlyZXQtPmZjb2Uuc2Vjc19yZXNldCA9CiAJCQkJCXR2LnR2X3NlYyAtIGZjcG9ydC0+c3RhdHNfcmVzZXRfdGltZTsKKwkJCQl9CiAJCQl9CisJCQliZmFfY2JfcXVldWVfc3RhdHVzKGZjcG9ydC0+YmZhLCAmY2ItPmhjYl9xZSwKKwkJCQkJZmNwb3J0LT5zdGF0c19zdGF0dXMpOwogCQl9Ci0JCWZjcG9ydC0+c3RhdHNfY2JmbihmY3BvcnQtPnN0YXRzX2NiYXJnLCBmY3BvcnQtPnN0YXRzX3N0YXR1cyk7CisJCWZjcG9ydC0+c3RhdHNfc3RhdHVzID0gQkZBX1NUQVRVU19PSzsKIAl9IGVsc2UgewotCQlmY3BvcnQtPnN0YXRzX2J1c3kgPSBCRkFfRkFMU0U7CisJCUlOSVRfTElTVF9IRUFEKCZmY3BvcnQtPnN0YXRzX3BlbmRpbmdfcSk7CiAJCWZjcG9ydC0+c3RhdHNfc3RhdHVzID0gQkZBX1NUQVRVU19PSzsKIAl9CiB9CkBAIC0zMTQzLDggKzMxOTUsNyBAQAogCX0KIAogCWZjcG9ydC0+c3RhdHNfc3RhdHVzID0gQkZBX1NUQVRVU19FVElNRVI7Ci0JYmZhX2NiX3F1ZXVlKGZjcG9ydC0+YmZhLCAmZmNwb3J0LT5oY2JfcWUsIF9fYmZhX2NiX2ZjcG9ydF9zdGF0c19nZXQsCi0JCWZjcG9ydCk7CisJX19iZmFfY2JfZmNwb3J0X3N0YXRzX2dldChmY3BvcnQsIEJGQV9UUlVFKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTMxNzQsNyArMzIyNSw5IEBACiBzdGF0aWMgdm9pZAogX19iZmFfY2JfZmNwb3J0X3N0YXRzX2Nscih2b2lkICpjYmFyZywgYmZhX2Jvb2xlYW5fdCBjb21wbGV0ZSkKIHsKLQlzdHJ1Y3QgYmZhX2ZjcG9ydF9zICpmY3BvcnQgPSBjYmFyZzsKKwlzdHJ1Y3QgYmZhX2ZjcG9ydF9zICpmY3BvcnQgPSAoc3RydWN0IGJmYV9mY3BvcnRfcyAqKSBjYmFyZzsKKwlzdHJ1Y3QgYmZhX2NiX3BlbmRpbmdfcV9zICpjYjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpxZSwgKnFlbjsKIAogCWlmIChjb21wbGV0ZSkgewogCQlzdHJ1Y3QgdGltZXZhbCB0djsKQEAgLTMxODQsMTAgKzMyMzcsMTUgQEAKIAkJICovCiAJCWRvX2dldHRpbWVvZmRheSgmdHYpOwogCQlmY3BvcnQtPnN0YXRzX3Jlc2V0X3RpbWUgPSB0di50dl9zZWM7Ci0KLQkJZmNwb3J0LT5zdGF0c19jYmZuKGZjcG9ydC0+c3RhdHNfY2JhcmcsIGZjcG9ydC0+c3RhdHNfc3RhdHVzKTsKKwkJbGlzdF9mb3JfZWFjaF9zYWZlKHFlLCBxZW4sICZmY3BvcnQtPnN0YXRzY2xyX3BlbmRpbmdfcSkgeworCQkJYmZhX3FfZGVxKCZmY3BvcnQtPnN0YXRzY2xyX3BlbmRpbmdfcSwgJnFlKTsKKwkJCWNiID0gKHN0cnVjdCBiZmFfY2JfcGVuZGluZ19xX3MgKilxZTsKKwkJCWJmYV9jYl9xdWV1ZV9zdGF0dXMoZmNwb3J0LT5iZmEsICZjYi0+aGNiX3FlLAorCQkJCQkJZmNwb3J0LT5zdGF0c19zdGF0dXMpOworCQl9CisJCWZjcG9ydC0+c3RhdHNfc3RhdHVzID0gQkZBX1NUQVRVU19PSzsKIAl9IGVsc2UgewotCQlmY3BvcnQtPnN0YXRzX2J1c3kgPSBCRkFfRkFMU0U7CisJCUlOSVRfTElTVF9IRUFEKCZmY3BvcnQtPnN0YXRzY2xyX3BlbmRpbmdfcSk7CiAJCWZjcG9ydC0+c3RhdHNfc3RhdHVzID0gQkZBX1NUQVRVU19PSzsKIAl9CiB9CkBAIC0zMjA1LDggKzMyNjMsNyBAQAogCX0KIAogCWZjcG9ydC0+c3RhdHNfc3RhdHVzID0gQkZBX1NUQVRVU19FVElNRVI7Ci0JYmZhX2NiX3F1ZXVlKGZjcG9ydC0+YmZhLCAmZmNwb3J0LT5oY2JfcWUsCi0JCQlfX2JmYV9jYl9mY3BvcnRfc3RhdHNfY2xyLCBmY3BvcnQpOworCV9fYmZhX2NiX2ZjcG9ydF9zdGF0c19jbHIoZmNwb3J0LCBCRkFfVFJVRSk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0zNDAyLDYgKzM0NTksMTEgQEAKIAkJCQlmY3BvcnQtPnVzZV9mbGFzaF9jZmcgPSBCRkFfRkFMU0U7CiAJCQl9CiAKKwkJCWlmIChmY3BvcnQtPmNmZy5xb3NfZW5hYmxlZCkKKwkJCQlmY3BvcnQtPnFvc19hdHRyLnN0YXRlID0gQkZBX1FPU19PRkZMSU5FOworCQkJZWxzZQorCQkJCWZjcG9ydC0+cW9zX2F0dHIuc3RhdGUgPSBCRkFfUU9TX0RJU0FCTEVEOworCiAJCQliZmFfc21fc2VuZF9ldmVudChmY3BvcnQsIEJGQV9GQ1BPUlRfU01fRldSU1ApOwogCQl9CiAJCWJyZWFrOwpAQCAtMzQyNiwyOCArMzQ4OCwyNiBAQAogCQkvKgogCQkgKiBjaGVjayBmb3IgdGltZXIgcG9wIGJlZm9yZSBwcm9jZXNzaW5nIHRoZSByc3AKIAkJICovCi0JCWlmIChmY3BvcnQtPnN0YXRzX2J1c3kgPT0gQkZBX0ZBTFNFIHx8Ci0JCSAgICBmY3BvcnQtPnN0YXRzX3N0YXR1cyA9PSBCRkFfU1RBVFVTX0VUSU1FUikKKwkJaWYgKGxpc3RfZW1wdHkoJmZjcG9ydC0+c3RhdHNfcGVuZGluZ19xKSB8fAorCQkgICAgKGZjcG9ydC0+c3RhdHNfc3RhdHVzID09IEJGQV9TVEFUVVNfRVRJTUVSKSkKIAkJCWJyZWFrOwogCiAJCWJmYV90aW1lcl9zdG9wKCZmY3BvcnQtPnRpbWVyKTsKIAkJZmNwb3J0LT5zdGF0c19zdGF0dXMgPSBpMmhtc2cucHN0YXRzZ2V0X3JzcC0+c3RhdHVzOwotCQliZmFfY2JfcXVldWUoZmNwb3J0LT5iZmEsICZmY3BvcnQtPmhjYl9xZSwKLQkJCQlfX2JmYV9jYl9mY3BvcnRfc3RhdHNfZ2V0LCBmY3BvcnQpOworCQlfX2JmYV9jYl9mY3BvcnRfc3RhdHNfZ2V0KGZjcG9ydCwgQkZBX1RSVUUpOwogCQlicmVhazsKIAogCWNhc2UgQkZJX0ZDUE9SVF9JMkhfU1RBVFNfQ0xFQVJfUlNQOgogCQkvKgogCQkgKiBjaGVjayBmb3IgdGltZXIgcG9wIGJlZm9yZSBwcm9jZXNzaW5nIHRoZSByc3AKIAkJICovCi0JCWlmIChmY3BvcnQtPnN0YXRzX2J1c3kgPT0gQkZBX0ZBTFNFIHx8Ci0JCSAgICBmY3BvcnQtPnN0YXRzX3N0YXR1cyA9PSBCRkFfU1RBVFVTX0VUSU1FUikKKwkJaWYgKGxpc3RfZW1wdHkoJmZjcG9ydC0+c3RhdHNjbHJfcGVuZGluZ19xKSB8fAorCQkgICAgKGZjcG9ydC0+c3RhdHNfc3RhdHVzID09IEJGQV9TVEFUVVNfRVRJTUVSKSkKIAkJCWJyZWFrOwogCiAJCWJmYV90aW1lcl9zdG9wKCZmY3BvcnQtPnRpbWVyKTsKIAkJZmNwb3J0LT5zdGF0c19zdGF0dXMgPSBCRkFfU1RBVFVTX09LOwotCQliZmFfY2JfcXVldWUoZmNwb3J0LT5iZmEsICZmY3BvcnQtPmhjYl9xZSwKLQkJCQlfX2JmYV9jYl9mY3BvcnRfc3RhdHNfY2xyLCBmY3BvcnQpOworCQlfX2JmYV9jYl9mY3BvcnRfc3RhdHNfY2xyKGZjcG9ydCwgQkZBX1RSVUUpOwogCQlicmVhazsKIAogCWNhc2UgQkZJX0ZDUE9SVF9JMkhfRU5BQkxFX0FFTjoKQEAgLTM3NzksMjUgKzM4MzksMjUgQEAKICAqIEZldGNoIHBvcnQgc3RhdGlzdGljcyAoRkNRb1Mgb3IgRkNvRSkuCiAgKi8KIGJmYV9zdGF0dXNfdAotYmZhX2ZjcG9ydF9nZXRfc3RhdHMoc3RydWN0IGJmYV9zICpiZmEsIHVuaW9uIGJmYV9mY3BvcnRfc3RhdHNfdSAqc3RhdHMsCi0JYmZhX2NiX3BvcnRfdCBjYmZuLCB2b2lkICpjYmFyZykKK2JmYV9mY3BvcnRfZ2V0X3N0YXRzKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZhX2NiX3BlbmRpbmdfcV9zICpjYikKIHsKIAlzdHJ1Y3QgYmZhX2ZjcG9ydF9zICpmY3BvcnQgPSBCRkFfRkNQT1JUX01PRChiZmEpOwogCi0JaWYgKGZjcG9ydC0+c3RhdHNfYnVzeSkgewotCQliZmFfdHJjKGJmYSwgZmNwb3J0LT5zdGF0c19idXN5KTsKKwlpZiAoYmZhX2lvY19pc19kaXNhYmxlZCgmYmZhLT5pb2MpKQorCQlyZXR1cm4gQkZBX1NUQVRVU19JT0NfRElTQUJMRUQ7CisKKwlpZiAoIWxpc3RfZW1wdHkoJmZjcG9ydC0+c3RhdHNjbHJfcGVuZGluZ19xKSkKIAkJcmV0dXJuIEJGQV9TVEFUVVNfREVWQlVTWTsKLQl9CiAKLQlmY3BvcnQtPnN0YXRzX2J1c3kgID0gQkZBX1RSVUU7Ci0JZmNwb3J0LT5zdGF0c19yZXQgICA9IHN0YXRzOwotCWZjcG9ydC0+c3RhdHNfY2JmbiAgPSBjYmZuOwotCWZjcG9ydC0+c3RhdHNfY2JhcmcgPSBjYmFyZzsKKwlpZiAobGlzdF9lbXB0eSgmZmNwb3J0LT5zdGF0c19wZW5kaW5nX3EpKSB7CisJCWxpc3RfYWRkX3RhaWwoJmNiLT5oY2JfcWUucWUsICZmY3BvcnQtPnN0YXRzX3BlbmRpbmdfcSk7CisJCWJmYV9mY3BvcnRfc2VuZF9zdGF0c19nZXQoZmNwb3J0KTsKKwkJYmZhX3RpbWVyX3N0YXJ0KGJmYSwgJmZjcG9ydC0+dGltZXIsCisJCQkJYmZhX2ZjcG9ydF9zdGF0c19nZXRfdGltZW91dCwKKwkJCQlmY3BvcnQsIEJGQV9GQ1BPUlRfU1RBVFNfVE9WKTsKKwl9IGVsc2UKKwkJbGlzdF9hZGRfdGFpbCgmY2ItPmhjYl9xZS5xZSwgJmZjcG9ydC0+c3RhdHNfcGVuZGluZ19xKTsKIAotCWJmYV9mY3BvcnRfc2VuZF9zdGF0c19nZXQoZmNwb3J0KTsKLQotCWJmYV90aW1lcl9zdGFydChiZmEsICZmY3BvcnQtPnRpbWVyLCBiZmFfZmNwb3J0X3N0YXRzX2dldF90aW1lb3V0LAotCQkJZmNwb3J0LCBCRkFfRkNQT1JUX1NUQVRTX1RPVik7CiAJcmV0dXJuIEJGQV9TVEFUVVNfT0s7CiB9CiAKQEAgLTM4MDUsMjcgKzM4NjUsMjUgQEAKICAqIFJlc2V0IHBvcnQgc3RhdGlzdGljcyAoRkNRb1Mgb3IgRkNvRSkuCiAgKi8KIGJmYV9zdGF0dXNfdAotYmZhX2ZjcG9ydF9jbGVhcl9zdGF0cyhzdHJ1Y3QgYmZhX3MgKmJmYSwgYmZhX2NiX3BvcnRfdCBjYmZuLCB2b2lkICpjYmFyZykKK2JmYV9mY3BvcnRfY2xlYXJfc3RhdHMoc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmFfY2JfcGVuZGluZ19xX3MgKmNiKQogewogCXN0cnVjdCBiZmFfZmNwb3J0X3MgKmZjcG9ydCA9IEJGQV9GQ1BPUlRfTU9EKGJmYSk7CiAKLQlpZiAoZmNwb3J0LT5zdGF0c19idXN5KSB7Ci0JCWJmYV90cmMoYmZhLCBmY3BvcnQtPnN0YXRzX2J1c3kpOworCWlmICghbGlzdF9lbXB0eSgmZmNwb3J0LT5zdGF0c19wZW5kaW5nX3EpKQogCQlyZXR1cm4gQkZBX1NUQVRVU19ERVZCVVNZOwotCX0KIAotCWZjcG9ydC0+c3RhdHNfYnVzeSAgPSBCRkFfVFJVRTsKLQlmY3BvcnQtPnN0YXRzX2NiZm4gID0gY2JmbjsKLQlmY3BvcnQtPnN0YXRzX2NiYXJnID0gY2Jhcmc7CisJaWYgKGxpc3RfZW1wdHkoJmZjcG9ydC0+c3RhdHNjbHJfcGVuZGluZ19xKSkgeworCQlsaXN0X2FkZF90YWlsKCZjYi0+aGNiX3FlLnFlLCAmZmNwb3J0LT5zdGF0c2Nscl9wZW5kaW5nX3EpOworCQliZmFfZmNwb3J0X3NlbmRfc3RhdHNfY2xlYXIoZmNwb3J0KTsKKwkJYmZhX3RpbWVyX3N0YXJ0KGJmYSwgJmZjcG9ydC0+dGltZXIsCisJCQkJYmZhX2ZjcG9ydF9zdGF0c19jbHJfdGltZW91dCwKKwkJCQlmY3BvcnQsIEJGQV9GQ1BPUlRfU1RBVFNfVE9WKTsKKwl9IGVsc2UKKwkJbGlzdF9hZGRfdGFpbCgmY2ItPmhjYl9xZS5xZSwgJmZjcG9ydC0+c3RhdHNjbHJfcGVuZGluZ19xKTsKIAotCWJmYV9mY3BvcnRfc2VuZF9zdGF0c19jbGVhcihmY3BvcnQpOwotCi0JYmZhX3RpbWVyX3N0YXJ0KGJmYSwgJmZjcG9ydC0+dGltZXIsIGJmYV9mY3BvcnRfc3RhdHNfY2xyX3RpbWVvdXQsCi0JCQlmY3BvcnQsIEJGQV9GQ1BPUlRfU1RBVFNfVE9WKTsKIAlyZXR1cm4gQkZBX1NUQVRVU19PSzsKIH0KIAotCiAvKgogICogRmV0Y2ggcG9ydCBhdHRyaWJ1dGVzLgogICovCkBAIC00NjE5LDYgKzQ2NzcsNyBAQAogCQlycCA9IEJGQV9SUE9SVF9GUk9NX1RBRyhiZmEsIG1zZy5jcmVhdGVfcnNwLT5iZmFfaGFuZGxlKTsKIAkJcnAtPmZ3X2hhbmRsZSA9IG1zZy5jcmVhdGVfcnNwLT5md19oYW5kbGU7CiAJCXJwLT5xb3NfYXR0ciA9IG1zZy5jcmVhdGVfcnNwLT5xb3NfYXR0cjsKKwkJYmZhX3Jwb3J0X3NldF9sdW5tYXNrKGJmYSwgcnApOwogCQlXQVJOX09OKG1zZy5jcmVhdGVfcnNwLT5zdGF0dXMgIT0gQkZBX1NUQVRVU19PSyk7CiAJCWJmYV9zbV9zZW5kX2V2ZW50KHJwLCBCRkFfUlBPUlRfU01fRldSU1ApOwogCQlicmVhazsKQEAgLTQ2MjYsNiArNDY4NSw3IEBACiAJY2FzZSBCRklfUlBPUlRfSTJIX0RFTEVURV9SU1A6CiAJCXJwID0gQkZBX1JQT1JUX0ZST01fVEFHKGJmYSwgbXNnLmRlbGV0ZV9yc3AtPmJmYV9oYW5kbGUpOwogCQlXQVJOX09OKG1zZy5kZWxldGVfcnNwLT5zdGF0dXMgIT0gQkZBX1NUQVRVU19PSyk7CisJCWJmYV9ycG9ydF91bnNldF9sdW5tYXNrKGJmYSwgcnApOwogCQliZmFfc21fc2VuZF9ldmVudChycCwgQkZBX1JQT1JUX1NNX0ZXUlNQKTsKIAkJYnJlYWs7CiAKQEAgLTQ3MDYsNiArNDc2NiwzNyBAQAogCWJmYV9zbV9zZW5kX2V2ZW50KHJwb3J0LCBCRkFfUlBPUlRfU01fU0VUX1NQRUVEKTsKIH0KIAorLyogU2V0IFJwb3J0IExVTiBNYXNrICovCit2b2lkCitiZmFfcnBvcnRfc2V0X2x1bm1hc2soc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmFfcnBvcnRfcyAqcnApCit7CisJc3RydWN0IGJmYV9scHNfbW9kX3MJKmxwc19tb2QgPSBCRkFfTFBTX01PRChiZmEpOworCXd3bl90CWxwX3d3biwgcnBfd3duOworCXU4IGxwX3RhZyA9ICh1OClycC0+cnBvcnRfaW5mby5scF90YWc7CisKKwlycF93d24gPSAoKHN0cnVjdCBiZmFfZmNzX3Jwb3J0X3MgKilycC0+cnBvcnRfZHJ2KS0+cHd3bjsKKwlscF93d24gPSAoQkZBX0xQU19GUk9NX1RBRyhscHNfbW9kLCBycC0+cnBvcnRfaW5mby5scF90YWcpKS0+cHd3bjsKKworCUJGQV9MUFNfRlJPTV9UQUcobHBzX21vZCwgcnAtPnJwb3J0X2luZm8ubHBfdGFnKS0+bHVuX21hc2sgPQorCQkJCQlycC0+bHVuX21hc2sgPSBCRkFfVFJVRTsKKwliZmFfZmNwaW1fbHVubWFza19ycF91cGRhdGUoYmZhLCBscF93d24sIHJwX3d3biwgcnAtPnJwb3J0X3RhZywgbHBfdGFnKTsKK30KKworLyogVW5zZXQgUnBvcnQgTFVOIG1hc2sgKi8KK3ZvaWQKK2JmYV9ycG9ydF91bnNldF9sdW5tYXNrKHN0cnVjdCBiZmFfcyAqYmZhLCBzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwKQoreworCXN0cnVjdCBiZmFfbHBzX21vZF9zCSpscHNfbW9kID0gQkZBX0xQU19NT0QoYmZhKTsKKwl3d25fdAlscF93d24sIHJwX3d3bjsKKworCXJwX3d3biA9ICgoc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqKXJwLT5ycG9ydF9kcnYpLT5wd3duOworCWxwX3d3biA9IChCRkFfTFBTX0ZST01fVEFHKGxwc19tb2QsIHJwLT5ycG9ydF9pbmZvLmxwX3RhZykpLT5wd3duOworCisJQkZBX0xQU19GUk9NX1RBRyhscHNfbW9kLCBycC0+cnBvcnRfaW5mby5scF90YWcpLT5sdW5fbWFzayA9CisJCQkJcnAtPmx1bl9tYXNrID0gQkZBX0ZBTFNFOworCWJmYV9mY3BpbV9sdW5tYXNrX3JwX3VwZGF0ZShiZmEsIGxwX3d3biwgcnBfd3duLAorCQkJQkZBX1JQT1JUX1RBR19JTlZBTElELCBCRkFfTFBfVEFHX0lOVkFMSUQpOworfQogCiAvKgogICogU0dQRyByZWxhdGVkIGZ1bmN0aW9ucwpAQCAtNTUxNywxMSArNTYwOCwyOSBAQAogCQlyZXR1cm4gQkZBX1NUQVRVU19QT1JUX05PVF9ESVNBQkxFRDsKIAl9CiAKLQkvKiBDaGVjayBpZiB0aGUgc3BlZWQgaXMgc3VwcG9ydGVkICovCi0JYmZhX2ZjcG9ydF9nZXRfYXR0cihiZmEsICZhdHRyKTsKLQliZmFfdHJjKGZjZGlhZywgYXR0ci5zcGVlZF9zdXBwb3J0ZWQpOwotCWlmIChzcGVlZCA+IGF0dHIuc3BlZWRfc3VwcG9ydGVkKQotCQlyZXR1cm4gQkZBX1NUQVRVU19VTlNVUFBfU1BFRUQ7CisJLyoKKwkgKiBDaGVjayBpZiBpbnB1dCBzcGVlZCBpcyBzdXBwb3J0ZWQgYnkgdGhlIHBvcnQgbW9kZQorCSAqLworCWlmIChiZmFfaW9jX2dldF90eXBlKCZiZmEtPmlvYykgPT0gQkZBX0lPQ19UWVBFX0ZDKSB7CisJCWlmICghKHNwZWVkID09IEJGQV9QT1JUX1NQRUVEXzFHQlBTIHx8CisJCSAgICAgIHNwZWVkID09IEJGQV9QT1JUX1NQRUVEXzJHQlBTIHx8CisJCSAgICAgIHNwZWVkID09IEJGQV9QT1JUX1NQRUVEXzRHQlBTIHx8CisJCSAgICAgIHNwZWVkID09IEJGQV9QT1JUX1NQRUVEXzhHQlBTIHx8CisJCSAgICAgIHNwZWVkID09IEJGQV9QT1JUX1NQRUVEXzE2R0JQUyB8fAorCQkgICAgICBzcGVlZCA9PSBCRkFfUE9SVF9TUEVFRF9BVVRPKSkgeworCQkJYmZhX3RyYyhmY2RpYWcsIHNwZWVkKTsKKwkJCXJldHVybiBCRkFfU1RBVFVTX1VOU1VQUF9TUEVFRDsKKwkJfQorCQliZmFfZmNwb3J0X2dldF9hdHRyKGJmYSwgJmF0dHIpOworCQliZmFfdHJjKGZjZGlhZywgYXR0ci5zcGVlZF9zdXBwb3J0ZWQpOworCQlpZiAoc3BlZWQgPiBhdHRyLnNwZWVkX3N1cHBvcnRlZCkKKwkJCXJldHVybiBCRkFfU1RBVFVTX1VOU1VQUF9TUEVFRDsKKwl9IGVsc2UgeworCQlpZiAoc3BlZWQgIT0gQkZBX1BPUlRfU1BFRURfMTBHQlBTKSB7CisJCQliZmFfdHJjKGZjZGlhZywgc3BlZWQpOworCQkJcmV0dXJuIEJGQV9TVEFUVVNfVU5TVVBQX1NQRUVEOworCQl9CisJfQogCiAJLyogRm9yIE1lenogY2FyZCwgcG9ydCBzcGVlZCBlbnRlcmVkIG5lZWRzIHRvIGJlIGNoZWNrZWQgKi8KIAlpZiAoYmZhX21mZ19pc19tZXp6KGJmYS0+aW9jLmF0dHItPmNhcmRfdHlwZSkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhX3N2Yy5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfc3ZjLmgKaW5kZXggZmJlNTEzYS4uOTVhZGI4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFfc3ZjLmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFfc3ZjLmgKQEAgLTI5Nyw2ICsyOTcsNyBAQAogCXZvaWQJCSpycG9ydF9kcnY7CS8qICBmY3MvZHJpdmVyIHJwb3J0IG9iamVjdAkgICAgKi8KIAl1MTYJZndfaGFuZGxlOwkvKiAgZmlybXdhcmUgcnBvcnQgaGFuZGxlCSAgICAqLwogCXUxNglycG9ydF90YWc7CS8qICBCRkEgcnBvcnQgdGFnCQkgICAgKi8KKwl1OAlsdW5fbWFzazsJLyogIExVTiBtYXNrIGZsYWcJCSAgICAqLwogCXN0cnVjdCBiZmFfcnBvcnRfaW5mb19zIHJwb3J0X2luZm87IC8qICBycG9ydCBpbmZvIGZyb20gZmNzL2RyaXZlciAqLwogCXN0cnVjdCBiZmFfcmVxcV93YWl0X3MgcmVxcV93YWl0OyAvKiAgdG8gd2FpdCBmb3Igcm9vbSBpbiByZXFxICAgICAqLwogCXN0cnVjdCBiZmFfY2JfcWVfcyBoY2JfcWU7CS8qICBCRkEgY2FsbGJhY2sgcWVsZW0JCSAgICAqLwpAQCAtNDA0LDYgKzQwNSw3IEBACiAJdTgJCWJiX3NjbjsJCS8qICBsb2NhbCBCQl9TQ04JCSovCiAJdTgJCWxzcmp0X3JzbjsJLyogIExTUkpUIHJlYXNvbgkJKi8KIAl1OAkJbHNyanRfZXhwbDsJLyogIExTUkpUIGV4cGxhbmF0aW9uCQkqLworCXU4CQlsdW5fbWFzazsJLyogIExVTiBtYXNrIGZsYWcJCSovCiAJd3duX3QJCXB3d247CQkvKiAgcG9ydCB3d24gb2YgbHBvcnQJCSovCiAJd3duX3QJCW53d247CQkvKiAgbm9kZSB3d24gb2YgbHBvcnQJCSovCiAJd3duX3QJCXByX3B3d247CS8qICBwb3J0IHd3biBvZiBscG9ydCBwZWVyCSovCkBAIC00NDEsNyArNDQzLDYgQEAKICAqLwogCiAjZGVmaW5lIEJGQV9GQ1BPUlQoX2JmYSkJKCYoKF9iZmEpLT5tb2R1bGVzLnBvcnQpKQotdHlwZWRlZiB2b2lkICgqYmZhX2NiX3BvcnRfdCkgKHZvaWQgKmNiYXJnLCBlbnVtIGJmYV9zdGF0dXMgc3RhdHVzKTsKIAogLyoKICAqIExpbmsgbm90aWZpY2F0aW9uIGRhdGEgc3RydWN0dXJlCkBAIC00OTUsMTMgKzQ5NiwxMSBAQAogCXU4CQkJKnN0YXRzX2t2YTsKIAl1NjQJCXN0YXRzX3BhOwogCXVuaW9uIGJmYV9mY3BvcnRfc3RhdHNfdSAqc3RhdHM7Ci0JdW5pb24gYmZhX2ZjcG9ydF9zdGF0c191ICpzdGF0c19yZXQ7IC8qICBkcml2ZXIgc3RhdHMgbG9jYXRpb24gKi8KIAliZmFfc3RhdHVzX3QJCXN0YXRzX3N0YXR1czsgLyogIHN0YXRzL3N0YXRzY2xyIHN0YXR1cyAqLwotCWJmYV9ib29sZWFuX3QJCXN0YXRzX2J1c3k7IC8qICBvdXRzdGFuZGluZyBzdGF0cy9zdGF0c2NsciAqLworCXN0cnVjdCBsaXN0X2hlYWQJc3RhdHNfcGVuZGluZ19xOworCXN0cnVjdCBsaXN0X2hlYWQJc3RhdHNjbHJfcGVuZGluZ19xOwogCWJmYV9ib29sZWFuX3QJCXN0YXRzX3FmdWxsOwogCXUzMgkJc3RhdHNfcmVzZXRfdGltZTsgLyogIHN0YXRzIHJlc2V0IHRpbWUgc3RhbXAgKi8KLQliZmFfY2JfcG9ydF90CQlzdGF0c19jYmZuOyAvKiAgZHJpdmVyIGNhbGxiYWNrIGZ1bmN0aW9uICovCi0Jdm9pZAkJCSpzdGF0c19jYmFyZzsgLyogKiE8IHVzZXIgY2FsbGJhY2sgYXJnICovCiAJYmZhX2Jvb2xlYW5fdAkJZGlhZ19idXN5OyAvKiAgZGlhZyBidXN5IHN0YXR1cyAqLwogCWJmYV9ib29sZWFuX3QJCWJlYWNvbjsgLyogIHBvcnQgYmVhY29uIHN0YXR1cyAqLwogCWJmYV9ib29sZWFuX3QJCWxpbmtfZTJlX2JlYWNvbjsgLyogIGxpbmsgYmVhY29uIHN0YXR1cyAqLwpAQCAtNTUyLDEwICs1NTEsOSBAQAogCQkJYmZhX2Jvb2xlYW5fdCBsaW5rX2UyZV9iZWFjb24pOwogYmZhX2Jvb2xlYW5fdAliZmFfZmNwb3J0X2lzX2xpbmt1cChzdHJ1Y3QgYmZhX3MgKmJmYSk7CiBiZmFfc3RhdHVzX3QgYmZhX2ZjcG9ydF9nZXRfc3RhdHMoc3RydWN0IGJmYV9zICpiZmEsCi0JCQkJICB1bmlvbiBiZmFfZmNwb3J0X3N0YXRzX3UgKnN0YXRzLAotCQkJCSAgYmZhX2NiX3BvcnRfdCBjYmZuLCB2b2lkICpjYmFyZyk7Ci1iZmFfc3RhdHVzX3QgYmZhX2ZjcG9ydF9jbGVhcl9zdGF0cyhzdHJ1Y3QgYmZhX3MgKmJmYSwgYmZhX2NiX3BvcnRfdCBjYmZuLAotCQkJCSAgICB2b2lkICpjYmFyZyk7CisJCQlzdHJ1Y3QgYmZhX2NiX3BlbmRpbmdfcV9zICpjYik7CitiZmFfc3RhdHVzX3QgYmZhX2ZjcG9ydF9jbGVhcl9zdGF0cyhzdHJ1Y3QgYmZhX3MgKmJmYSwKKwkJCXN0cnVjdCBiZmFfY2JfcGVuZGluZ19xX3MgKmNiKTsKIGJmYV9ib29sZWFuX3QgYmZhX2ZjcG9ydF9pc19xb3NfZW5hYmxlZChzdHJ1Y3QgYmZhX3MgKmJmYSk7CiBiZmFfYm9vbGVhbl90IGJmYV9mY3BvcnRfaXNfdHJ1bmtfZW5hYmxlZChzdHJ1Y3QgYmZhX3MgKmJmYSk7CiBiZmFfc3RhdHVzX3QgYmZhX2ZjcG9ydF9pc19wYmNkaXNhYmxlZChzdHJ1Y3QgYmZhX3MgKmJmYSk7CkBAIC01NzgsNiArNTc2LDE5IEBACiAJCQkgICAgICAgc3RydWN0IGJmYV9ycG9ydF9xb3NfYXR0cl9zIG5ld19xb3NfYXR0cik7CiAKIC8qCisgKglScG9ydCBMVU4gbWFza2luZyByZWxhdGVkCisgKi8KKyNkZWZpbmUgQkZBX1JQT1JUX1RBR19JTlZBTElECTB4ZmZmZgorI2RlZmluZSBCRkFfTFBfVEFHX0lOVkFMSUQJMHhmZgordm9pZAliZmFfcnBvcnRfc2V0X2x1bm1hc2soc3RydWN0IGJmYV9zICpiZmEsIHN0cnVjdCBiZmFfcnBvcnRfcyAqcnApOwordm9pZAliZmFfcnBvcnRfdW5zZXRfbHVubWFzayhzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmYV9ycG9ydF9zICpycCk7CitiZmFfYm9vbGVhbl90CWJmYV9ycG9ydF9sdW5tYXNrX2FjdGl2ZShzdHJ1Y3QgYmZhX3Jwb3J0X3MgKnJwKTsKK3d3bl90CWJmYV9ycG9ydF9nZXRfcHd3bihzdHJ1Y3QgYmZhX3MgKmJmYSwgc3RydWN0IGJmYV9ycG9ydF9zICpycCk7CitzdHJ1Y3QgYmZhX3Jwb3J0X3MgKmJmYV9ycG9ydF9nZXRfYnlfd3duKHN0cnVjdCBiZmFfcyAqYmZhLCB1MTYgdmZfaWQsCisJCQkJCSB3d25fdCAqbHB3d24sIHd3bl90IHJwd3duKTsKK3ZvaWQgKmJmYV9jYl9nZXRfcnBfYnlfd3duKHZvaWQgKmFyZywgdTE2IHZmX2lkLCB3d25fdCAqbHB3d24sIHd3bl90IHJwd3duKTsKKworLyoKICAqIGJmYSBmY3hwIEFQSSBmdW5jdGlvbnMKICAqLwogc3RydWN0IGJmYV9mY3hwX3MgKmJmYV9mY3hwX2FsbG9jKHZvaWQgKmJmYWRfZmN4cCwgc3RydWN0IGJmYV9zICpiZmEsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWQuYyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZC5jCmluZGV4IGJlYjMwYTcuLjY2ZmI3MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZC5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZC5jCkBAIC0xMzQ4LDcgKzEzNDgsNyBAQAogYmZhZF9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwaWQpCiB7CiAJc3RydWN0IGJmYWRfcwkqYmZhZDsKLQlpbnQJCWVycm9yID0gLUVOT0RFViwgcmV0dmFsOworCWludAkJZXJyb3IgPSAtRU5PREVWLCByZXR2YWwsIGk7CiAKIAkvKiBGb3Igc2luZ2xlIHBvcnQgY2FyZHMgLSBvbmx5IGNsYWltIGZ1bmN0aW9uIDAgKi8KIAlpZiAoKHBkZXYtPmRldmljZSA9PSBCRkFfUENJX0RFVklDRV9JRF9GQ184RzFQKSAmJgpAQCAtMTM3Miw2ICsxMzcyLDEyIEBACiAJYmZhX3RyY19pbml0KGJmYWQtPnRyY21vZCk7CiAJYmZhX3RyYyhiZmFkLCBiZmFkX2luc3QpOwogCisJLyogQUVOIElOSVQgKi8KKwlJTklUX0xJU1RfSEVBRCgmYmZhZC0+ZnJlZV9hZW5fcSk7CisJSU5JVF9MSVNUX0hFQUQoJmJmYWQtPmFjdGl2ZV9hZW5fcSk7CisJZm9yIChpID0gMDsgaSA8IEJGQV9BRU5fTUFYX0VOVFJZOyBpKyspCisJCWxpc3RfYWRkX3RhaWwoJmJmYWQtPmFlbl9saXN0W2ldLnFlLCAmYmZhZC0+ZnJlZV9hZW5fcSk7CisKIAlpZiAoIShiZmFkX2xvYWRfZndpbWcocGRldikpKSB7CiAJCWtmcmVlKGJmYWQtPnRyY21vZCk7CiAJCWdvdG8gb3V0X2FsbG9jX3RyYWNlX2ZhaWx1cmU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfYnNnLmMgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfYnNnLmMKaW5kZXggODlmODYzZS4uMDZmYzAwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2JzZy5jCisrKyBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9ic2cuYwpAQCAtNTYsNyArNTYsNyBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKIAlpZiAoYmZhZC0+ZGlzYWJsZV9hY3RpdmUpIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiBFQlVTWTsKKwkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKIAliZmFkLT5kaXNhYmxlX2FjdGl2ZSA9IEJGQV9UUlVFOwpAQCAtOTAsNiArOTAsNyBAQAogCWJmYV9nZXRfYWRhcHRlcl9zZXJpYWxfbnVtKCZiZmFkLT5iZmEsIGlvY21kLT5zZXJpYWxudW0pOwogCWlvY21kLT5mYWN0b3J5bnd3biA9IHBhdHRyLmZhY3Rvcnlud3duOwogCWlvY21kLT5mYWN0b3J5cHd3biA9IHBhdHRyLmZhY3Rvcnlwd3duOworCWlvY21kLT5iZmFkX251bSA9IGJmYWQtPmluc3Rfbm87CiAJaW1fcG9ydCA9IGJmYWQtPnBwb3J0LmltX3BvcnQ7CiAJaW9jbWQtPmhvc3QgPSBpbV9wb3J0LT5zaG9zdC0+aG9zdF9ubzsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKQEAgLTE3OCw2ICsxNzksMzggQEAKIH0KIAogaW50CitiZmFkX2lvY21kX2lvY19yZXNldF9zdGF0cyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQsIHVuc2lnbmVkIGludCB2X2NtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19nZW5fcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfZ2VuX3MgKiljbWQ7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCWlmICh2X2NtZCA9PSBJT0NNRF9JT0NfUkVTRVRfU1RBVFMpIHsKKwkJYmZhX2lvY19jbGVhcl9zdGF0cygmYmZhZC0+YmZhKTsKKwkJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CisJfSBlbHNlIGlmICh2X2NtZCA9PSBJT0NNRF9JT0NfUkVTRVRfRldTVEFUUykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJCWlvY21kLT5zdGF0dXMgPSBiZmFfaW9jX2Z3X3N0YXRzX2NsZWFyKCZiZmFkLT5iZmEuaW9jKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9pb2Nfc2V0X25hbWUoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kLCB1bnNpZ25lZCBpbnQgdl9jbWQpCit7CisJc3RydWN0IGJmYV9ic2dfaW9jX25hbWVfcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfaW9jX25hbWVfcyAqKSBjbWQ7CisKKwlpZiAodl9jbWQgPT0gSU9DTURfSU9DX1NFVF9BREFQVEVSX05BTUUpCisJCXN0cmNweShiZmFkLT5hZGFwdGVyX25hbWUsIGlvY21kLT5uYW1lKTsKKwllbHNlIGlmICh2X2NtZCA9PSBJT0NNRF9JT0NfU0VUX1BPUlRfTkFNRSkKKwkJc3RyY3B5KGJmYWQtPnBvcnRfbmFtZSwgaW9jbWQtPm5hbWUpOworCisJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CisJcmV0dXJuIDA7Cit9CisKK2ludAogYmZhZF9pb2NtZF9pb2NmY19nZXRfYXR0cihzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCiB7CiAJc3RydWN0IGJmYV9ic2dfaW9jZmNfYXR0cl9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19pb2NmY19hdHRyX3MgKiljbWQ7CkBAIC0zMDYsNiArMzM5LDgxIEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludAorYmZhZF9pb2NtZF9wb3J0X3Jlc2V0X3N0YXRzKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19nZW5fcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfZ2VuX3MgKiljbWQ7CisJc3RydWN0IGJmYWRfaGFsX2NvbXAgZmNvbXA7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCWluaXRfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBiZmFfcG9ydF9jbGVhcl9zdGF0cygmYmZhZC0+YmZhLm1vZHVsZXMucG9ydCwKKwkJCQkJYmZhZF9oY2JfY29tcCwgJmZjb21wKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpZiAoaW9jbWQtPnN0YXR1cyAhPSBCRkFfU1RBVFVTX09LKSB7CisJCWJmYV90cmMoYmZhZCwgaW9jbWQtPnN0YXR1cyk7CisJCXJldHVybiAwOworCX0KKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlpb2NtZC0+c3RhdHVzID0gZmNvbXAuc3RhdHVzOworCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfc2V0X3BvcnRfY2ZnKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmlvY21kLCB1bnNpZ25lZCBpbnQgdl9jbWQpCit7CisJc3RydWN0IGJmYV9ic2dfcG9ydF9jZmdfcyAqY21kID0gKHN0cnVjdCBiZmFfYnNnX3BvcnRfY2ZnX3MgKilpb2NtZDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlmICh2X2NtZCA9PSBJT0NNRF9QT1JUX0NGR19UT1BPKQorCQljbWQtPnN0YXR1cyA9IGJmYV9mY3BvcnRfY2ZnX3RvcG9sb2d5KCZiZmFkLT5iZmEsIGNtZC0+cGFyYW0pOworCWVsc2UgaWYgKHZfY21kID09IElPQ01EX1BPUlRfQ0ZHX1NQRUVEKQorCQljbWQtPnN0YXR1cyA9IGJmYV9mY3BvcnRfY2ZnX3NwZWVkKCZiZmFkLT5iZmEsIGNtZC0+cGFyYW0pOworCWVsc2UgaWYgKHZfY21kID09IElPQ01EX1BPUlRfQ0ZHX0FMUEEpCisJCWNtZC0+c3RhdHVzID0gYmZhX2ZjcG9ydF9jZmdfaGFyZGFscGEoJmJmYWQtPmJmYSwgY21kLT5wYXJhbSk7CisJZWxzZSBpZiAodl9jbWQgPT0gSU9DTURfUE9SVF9DTFJfQUxQQSkKKwkJY21kLT5zdGF0dXMgPSBiZmFfZmNwb3J0X2Nscl9oYXJkYWxwYSgmYmZhZC0+YmZhKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfcG9ydF9jZmdfbWF4ZnJzaXplKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19wb3J0X2NmZ19tYXhmcnNpemVfcyAqaW9jbWQgPQorCQkJCShzdHJ1Y3QgYmZhX2JzZ19wb3J0X2NmZ19tYXhmcnNpemVfcyAqKWNtZDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBiZmFfZmNwb3J0X2NmZ19tYXhmcnNpemUoJmJmYWQtPmJmYSwgaW9jbWQtPm1heGZyc2l6ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX3BvcnRfY2ZnX2Jic2Moc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kLCB1bnNpZ25lZCBpbnQgdl9jbWQpCit7CisJc3RydWN0IGJmYV9ic2dfZ2VuX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX2dlbl9zICopY21kOworCXN0cnVjdCBiZmFfZmNwb3J0X3MgKmZjcG9ydCA9IEJGQV9GQ1BPUlRfTU9EKCZiZmFkLT5iZmEpOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaWYgKGJmYV9pb2NfZ2V0X3R5cGUoJmJmYWQtPmJmYS5pb2MpID09IEJGQV9JT0NfVFlQRV9GQykgeworCQlpZiAodl9jbWQgPT0gSU9DTURfUE9SVF9CQlNDX0VOQUJMRSkKKwkJCWZjcG9ydC0+Y2ZnLmJiX3Njbl9zdGF0ZSA9IEJGQV9UUlVFOworCQllbHNlIGlmICh2X2NtZCA9PSBJT0NNRF9QT1JUX0JCU0NfRElTQUJMRSkKKwkJCWZjcG9ydC0+Y2ZnLmJiX3Njbl9zdGF0ZSA9IEJGQV9GQUxTRTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludAogYmZhZF9pb2NtZF9scG9ydF9nZXRfYXR0cihzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCiB7CkBAIC0zNTQsNiArNDYyLDQwIEBACiB9CiAKIGludAorYmZhZF9pb2NtZF9scG9ydF9yZXNldF9zdGF0cyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9mY3NfbHBvcnRfcyAqZmNzX3BvcnQ7CisJc3RydWN0IGJmYV9ic2dfcmVzZXRfc3RhdHNfcyAqaW9jbWQgPQorCQkJKHN0cnVjdCBiZmFfYnNnX3Jlc2V0X3N0YXRzX3MgKiljbWQ7CisJc3RydWN0IGJmYV9mY3BpbV9zICpmY3BpbSA9IEJGQV9GQ1BJTSgmYmZhZC0+YmZhKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpxZSwgKnFlbjsKKwlzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJZmNzX3BvcnQgPSBiZmFfZmNzX2xvb2t1cF9wb3J0KCZiZmFkLT5iZmFfZmNzLAorCQkJCWlvY21kLT52Zl9pZCwgaW9jbWQtPnZwd3duKTsKKwlpZiAoZmNzX3BvcnQgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfVU5LTk9XTl9MV1dOOworCQlnb3RvIG91dDsKKwl9CisKKwliZmFfZmNzX2xwb3J0X2NsZWFyX3N0YXRzKGZjc19wb3J0KTsKKwkvKiBjbGVhciBJTyBzdGF0cyBmcm9tIGFsbCBhY3RpdmUgaXRuaW1zICovCisJbGlzdF9mb3JfZWFjaF9zYWZlKHFlLCBxZW4sICZmY3BpbS0+aXRuaW1fcSkgeworCQlpdG5pbSA9IChzdHJ1Y3QgYmZhX2l0bmltX3MgKikgcWU7CisJCWlmIChpdG5pbS0+cnBvcnQtPnJwb3J0X2luZm8ubHBfdGFnICE9IGZjc19wb3J0LT5scF90YWcpCisJCQljb250aW51ZTsKKwkJYmZhX2l0bmltX2NsZWFyX3N0YXRzKGl0bmltKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK2ludAogYmZhZF9pb2NtZF9scG9ydF9nZXRfaW9zdGF0cyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCiB7CiAJc3RydWN0IGJmYV9mY3NfbHBvcnRfcyAqZmNzX3BvcnQ7CkBAIC0zODksNyArNTMxLDcgQEAKIAl2b2lkCSppb2NtZF9idWZwdHI7CiAKIAlpZiAoaW9jbWQtPm5ycG9ydHMgPT0gMCkKLQkJcmV0dXJuIEVJTlZBTDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoYmZhZF9jaGtfaW9jbWRfc3oocGF5bG9hZF9sZW4sCiAJCQlzaXplb2Yoc3RydWN0IGJmYV9ic2dfbHBvcnRfZ2V0X3Jwb3J0c19zKSwKQEAgLTUzOSw2ICs2ODEsMTUyIEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludAorYmZhZF9pb2NtZF9ycG9ydF9jbHJfc3RhdHMoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX3Jwb3J0X3Jlc2V0X3N0YXRzX3MgKmlvY21kID0KKwkJCQkoc3RydWN0IGJmYV9ic2dfcnBvcnRfcmVzZXRfc3RhdHNfcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhX2Zjc19scG9ydF9zICpmY3NfcG9ydDsKKwlzdHJ1Y3QgYmZhX2Zjc19ycG9ydF9zICpmY3NfcnBvcnQ7CisJc3RydWN0IGJmYV9ycG9ydF9zICpycG9ydDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWZjc19wb3J0ID0gYmZhX2Zjc19sb29rdXBfcG9ydCgmYmZhZC0+YmZhX2ZjcywKKwkJCQlpb2NtZC0+dmZfaWQsIGlvY21kLT5wd3duKTsKKwlpZiAoZmNzX3BvcnQgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfVU5LTk9XTl9MV1dOOworCQlnb3RvIG91dDsKKwl9CisKKwlmY3NfcnBvcnQgPSBiZmFfZmNzX3Jwb3J0X2xvb2t1cChmY3NfcG9ydCwgaW9jbWQtPnJwd3duKTsKKwlpZiAoZmNzX3Jwb3J0ID09IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX1VOS05PV05fUldXTjsKKwkJZ290byBvdXQ7CisJfQorCisJbWVtc2V0KChjaGFyICopJmZjc19ycG9ydC0+c3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgYmZhX3Jwb3J0X3N0YXRzX3MpKTsKKwlycG9ydCA9IGJmYV9mY3NfcnBvcnRfZ2V0X2hhbHJwb3J0KGZjc19ycG9ydCk7CisJbWVtc2V0KCZycG9ydC0+c3RhdHMsIDAsIHNpemVvZihycG9ydC0+c3RhdHMpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX3Jwb3J0X3NldF9zcGVlZChzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfcnBvcnRfc2V0X3NwZWVkX3MgKmlvY21kID0KKwkJCQkoc3RydWN0IGJmYV9ic2dfcnBvcnRfc2V0X3NwZWVkX3MgKiljbWQ7CisJc3RydWN0IGJmYV9mY3NfbHBvcnRfcyAqZmNzX3BvcnQ7CisJc3RydWN0IGJmYV9mY3NfcnBvcnRfcyAqZmNzX3Jwb3J0OworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJZmNzX3BvcnQgPSBiZmFfZmNzX2xvb2t1cF9wb3J0KCZiZmFkLT5iZmFfZmNzLAorCQkJCWlvY21kLT52Zl9pZCwgaW9jbWQtPnB3d24pOworCWlmIChmY3NfcG9ydCA9PSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCQlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19VTktOT1dOX0xXV047CisJCWdvdG8gb3V0OworCX0KKworCWZjc19ycG9ydCA9IGJmYV9mY3NfcnBvcnRfbG9va3VwKGZjc19wb3J0LCBpb2NtZC0+cnB3d24pOworCWlmIChmY3NfcnBvcnQgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfVU5LTk9XTl9SV1dOOworCQlnb3RvIG91dDsKKwl9CisKKwlmY3NfcnBvcnQtPnJwZi5hc3NpZ25lZF9zcGVlZCAgPSBpb2NtZC0+c3BlZWQ7CisJLyogU2V0IHRoaXMgc3BlZWQgaW4gZi93IG9ubHkgaWYgdGhlIFJQU0Mgc3BlZWQgaXMgbm90IGF2YWlsYWJsZSAqLworCWlmIChmY3NfcnBvcnQtPnJwZi5ycHNjX3NwZWVkID09IEJGQV9QT1JUX1NQRUVEX1VOS05PV04pCisJCWJmYV9ycG9ydF9zcGVlZChmY3NfcnBvcnQtPmJmYV9ycG9ydCwgaW9jbWQtPnNwZWVkKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX3Zwb3J0X2dldF9hdHRyKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICpmY3NfdnBvcnQ7CisJc3RydWN0IGJmYV9ic2dfdnBvcnRfYXR0cl9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ192cG9ydF9hdHRyX3MgKiljbWQ7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlmY3NfdnBvcnQgPSBiZmFfZmNzX3Zwb3J0X2xvb2t1cCgmYmZhZC0+YmZhX2ZjcywKKwkJCQlpb2NtZC0+dmZfaWQsIGlvY21kLT52cHd3bik7CisJaWYgKGZjc192cG9ydCA9PSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCQlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19VTktOT1dOX1ZXV047CisJCWdvdG8gb3V0OworCX0KKworCWJmYV9mY3NfdnBvcnRfZ2V0X2F0dHIoZmNzX3Zwb3J0LCAmaW9jbWQtPnZwb3J0X2F0dHIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworb3V0OgorCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfdnBvcnRfZ2V0X3N0YXRzKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2Zjc192cG9ydF9zICpmY3NfdnBvcnQ7CisJc3RydWN0IGJmYV9ic2dfdnBvcnRfc3RhdHNfcyAqaW9jbWQgPQorCQkJCShzdHJ1Y3QgYmZhX2JzZ192cG9ydF9zdGF0c19zICopY21kOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJZmNzX3Zwb3J0ID0gYmZhX2Zjc192cG9ydF9sb29rdXAoJmJmYWQtPmJmYV9mY3MsCisJCQkJaW9jbWQtPnZmX2lkLCBpb2NtZC0+dnB3d24pOworCWlmIChmY3NfdnBvcnQgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfVU5LTk9XTl9WV1dOOworCQlnb3RvIG91dDsKKwl9CisKKwltZW1jcHkoKHZvaWQgKikmaW9jbWQtPnZwb3J0X3N0YXRzLCAodm9pZCAqKSZmY3NfdnBvcnQtPnZwb3J0X3N0YXRzLAorCQlzaXplb2Yoc3RydWN0IGJmYV92cG9ydF9zdGF0c19zKSk7CisJbWVtY3B5KCh2b2lkICopJmlvY21kLT52cG9ydF9zdGF0cy5wb3J0X3N0YXRzLAorCSAgICAgICAodm9pZCAqKSZmY3NfdnBvcnQtPmxwb3J0LnN0YXRzLAorCQlzaXplb2Yoc3RydWN0IGJmYV9scG9ydF9zdGF0c19zKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF92cG9ydF9jbHJfc3RhdHMoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfZmNzX3Zwb3J0X3MgKmZjc192cG9ydDsKKwlzdHJ1Y3QgYmZhX2JzZ19yZXNldF9zdGF0c19zICppb2NtZCA9CisJCQkJKHN0cnVjdCBiZmFfYnNnX3Jlc2V0X3N0YXRzX3MgKiljbWQ7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlmY3NfdnBvcnQgPSBiZmFfZmNzX3Zwb3J0X2xvb2t1cCgmYmZhZC0+YmZhX2ZjcywKKwkJCQlpb2NtZC0+dmZfaWQsIGlvY21kLT52cHd3bik7CisJaWYgKGZjc192cG9ydCA9PSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCQlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19VTktOT1dOX1ZXV047CisJCWdvdG8gb3V0OworCX0KKworCW1lbXNldCgmZmNzX3Zwb3J0LT52cG9ydF9zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBiZmFfdnBvcnRfc3RhdHNfcykpOworCW1lbXNldCgmZmNzX3Zwb3J0LT5scG9ydC5zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCBiZmFfbHBvcnRfc3RhdHNfcykpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworb3V0OgorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50CiBiZmFkX2lvY21kX2ZhYnJpY19nZXRfbHBvcnRzKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCwKIAkJCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbikKQEAgLTU4Miw2ICs4NzAsNjYgQEAKIH0KIAogaW50CitiZmFkX2lvY21kX3JhdGVsaW0oc3RydWN0IGJmYWRfcyAqYmZhZCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqcGNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19nZW5fcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfZ2VuX3MgKilwY21kOworCXN0cnVjdCBiZmFfZmNwb3J0X3MgKmZjcG9ydCA9IEJGQV9GQ1BPUlRfTU9EKCZiZmFkLT5iZmEpOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisKKwlpZiAoY21kID09IElPQ01EX1JBVEVMSU1fRU5BQkxFKQorCQlmY3BvcnQtPmNmZy5yYXRlbGltaXQgPSBCRkFfVFJVRTsKKwllbHNlIGlmIChjbWQgPT0gSU9DTURfUkFURUxJTV9ESVNBQkxFKQorCQlmY3BvcnQtPmNmZy5yYXRlbGltaXQgPSBCRkFfRkFMU0U7CisKKwlpZiAoZmNwb3J0LT5jZmcudHJsX2RlZl9zcGVlZCA9PSBCRkFfUE9SVF9TUEVFRF9VTktOT1dOKQorCQlmY3BvcnQtPmNmZy50cmxfZGVmX3NwZWVkID0gQkZBX1BPUlRfU1BFRURfMUdCUFM7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKKworCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfcmF0ZWxpbV9zcGVlZChzdHJ1Y3QgYmZhZF9zICpiZmFkLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkICpwY21kKQoreworCXN0cnVjdCBiZmFfYnNnX3RybF9zcGVlZF9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ190cmxfc3BlZWRfcyAqKXBjbWQ7CisJc3RydWN0IGJmYV9mY3BvcnRfcyAqZmNwb3J0ID0gQkZBX0ZDUE9SVF9NT0QoJmJmYWQtPmJmYSk7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCS8qIEF1dG8gYW5kIHNwZWVkcyBncmVhdGVyIHRoYW4gdGhlIHN1cHBvcnRlZCBzcGVlZCwgYXJlIGludmFsaWQgKi8KKwlpZiAoKGlvY21kLT5zcGVlZCA9PSBCRkFfUE9SVF9TUEVFRF9BVVRPKSB8fAorCSAgICAoaW9jbWQtPnNwZWVkID4gZmNwb3J0LT5zcGVlZF9zdXApKSB7CisJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX1VOU1VQUF9TUEVFRDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKworCWZjcG9ydC0+Y2ZnLnRybF9kZWZfc3BlZWQgPSBpb2NtZC0+c3BlZWQ7CisJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX2NmZ19mY3BpbShzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfZmNwaW1fcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfZmNwaW1fcyAqKWNtZDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWJmYV9mY3BpbV9wYXRoX3Rvdl9zZXQoJmJmYWQtPmJmYSwgaW9jbWQtPnBhcmFtKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKKwlyZXR1cm4gMDsKK30KKworaW50CiBiZmFkX2lvY21kX2ZjcGltX2dldF9tb2RzdGF0cyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCiB7CiAJc3RydWN0IGJmYV9ic2dfZmNwaW1fbW9kc3RhdHNfcyAqaW9jbWQgPQpAQCAtNjA0LDYgKzk1MiwyOCBAQAogfQogCiBpbnQKK2JmYWRfaW9jbWRfZmNwaW1fY2xyX21vZHN0YXRzKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19mY3BpbV9tb2RzdGF0c2Nscl9zICppb2NtZCA9CisJCQkJKHN0cnVjdCBiZmFfYnNnX2ZjcGltX21vZHN0YXRzY2xyX3MgKiljbWQ7CisJc3RydWN0IGJmYV9mY3BpbV9zICpmY3BpbSA9IEJGQV9GQ1BJTSgmYmZhZC0+YmZhKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpxZSwgKnFlbjsKKwlzdHJ1Y3QgYmZhX2l0bmltX3MgKml0bmltOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHFlLCBxZW4sICZmY3BpbS0+aXRuaW1fcSkgeworCQlpdG5pbSA9IChzdHJ1Y3QgYmZhX2l0bmltX3MgKikgcWU7CisJCWJmYV9pdG5pbV9jbGVhcl9zdGF0cyhpdG5pbSk7CisJfQorCW1lbXNldCgmZmNwaW0tPmRlbF9pdG5fc3RhdHMsIDAsCisJCXNpemVvZihzdHJ1Y3QgYmZhX2ZjcGltX2RlbF9pdG5fc3RhdHNfcykpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworCXJldHVybiAwOworfQorCitpbnQKIGJmYWRfaW9jbWRfZmNwaW1fZ2V0X2RlbF9pdG5fc3RhdHMoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQogewogCXN0cnVjdCBiZmFfYnNnX2ZjcGltX2RlbF9pdG5fc3RhdHNfcyAqaW9jbWQgPQpAQCAtNjcwLDYgKzEwNDAsMzUgQEAKIH0KIAogc3RhdGljIGludAorYmZhZF9pb2NtZF9pdG5pbV9yZXNldF9zdGF0cyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfcnBvcnRfcmVzZXRfc3RhdHNfcyAqaW9jbWQgPQorCQkJKHN0cnVjdCBiZmFfYnNnX3Jwb3J0X3Jlc2V0X3N0YXRzX3MgKiljbWQ7CisJc3RydWN0IGJmYV9mY3NfbHBvcnRfcwkqZmNzX3BvcnQ7CisJc3RydWN0IGJmYV9mY3NfaXRuaW1fcwkqaXRuaW07CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlmY3NfcG9ydCA9IGJmYV9mY3NfbG9va3VwX3BvcnQoJmJmYWQtPmJmYV9mY3MsCisJCQkJaW9jbWQtPnZmX2lkLCBpb2NtZC0+cHd3bik7CisJaWYgKCFmY3NfcG9ydCkKKwkJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfVU5LTk9XTl9MV1dOOworCWVsc2UgeworCQlpdG5pbSA9IGJmYV9mY3NfaXRuaW1fbG9va3VwKGZjc19wb3J0LCBpb2NtZC0+cnB3d24pOworCQlpZiAoaXRuaW0gPT0gTlVMTCkKKwkJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX1VOS05PV05fUldXTjsKKwkJZWxzZSB7CisJCQlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKKwkJCWJmYV9mY3NfaXRuaW1fc3RhdHNfY2xlYXIoZmNzX3BvcnQsIGlvY21kLT5ycHd3bik7CisJCQliZmFfaXRuaW1fY2xlYXJfc3RhdHMoYmZhX2Zjc19pdG5pbV9nZXRfaGFsaXRuKGl0bmltKSk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAogYmZhZF9pb2NtZF9pdG5pbV9nZXRfaXRuc3RhdHMoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQogewogCXN0cnVjdCBiZmFfYnNnX2l0bmltX2l0bnN0YXRzX3MgKmlvY21kID0KQEAgLTE1MTEsMTEgKzE5MTAsNTQ1IEBACiAJcmV0dXJuIDA7CiB9CiAKKyNkZWZpbmUgQkZBX0RFQlVHX0ZXX0NPUkVfQ0hVTktfU1oJMHg0MDAwVSAvKiAxNksgY2h1bmtzIGZvciBGVyBkdW1wICovCitpbnQKK2JmYWRfaW9jbWRfZGVidWdfZndfY29yZShzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQsCisJCQl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4pCit7CisJc3RydWN0IGJmYV9ic2dfZGVidWdfcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfZGVidWdfcyAqKWNtZDsKKwl2b2lkCSppb2NtZF9idWZwdHI7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCWlmIChiZmFkX2Noa19pb2NtZF9zeihwYXlsb2FkX2xlbiwgc2l6ZW9mKHN0cnVjdCBiZmFfYnNnX2RlYnVnX3MpLAorCQkJQkZBX0RFQlVHX0ZXX0NPUkVfQ0hVTktfU1opICE9IEJGQV9TVEFUVVNfT0spIHsKKwkJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfVkVSU0lPTl9GQUlMOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoaW9jbWQtPmJ1ZnN6IDwgQkZBX0RFQlVHX0ZXX0NPUkVfQ0hVTktfU1ogfHwKKwkJCSFJU19BTElHTkVEKGlvY21kLT5idWZzeiwgc2l6ZW9mKHUxNikpIHx8CisJCQkhSVNfQUxJR05FRChpb2NtZC0+b2Zmc2V0LCBzaXplb2YodTMyKSkpIHsKKwkJYmZhX3RyYyhiZmFkLCBCRkFfREVCVUdfRldfQ09SRV9DSFVOS19TWik7CisJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX0VJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJaW9jbWRfYnVmcHRyID0gKGNoYXIgKilpb2NtZCArIHNpemVvZihzdHJ1Y3QgYmZhX2JzZ19kZWJ1Z19zKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IGJmYV9pb2NfZGVidWdfZndjb3JlKCZiZmFkLT5iZmEuaW9jLCBpb2NtZF9idWZwdHIsCisJCQkJKHUzMiAqKSZpb2NtZC0+b2Zmc2V0LCAmaW9jbWQtPmJ1ZnN6KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX2RlYnVnX2N0bChzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQsIHVuc2lnbmVkIGludCB2X2NtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19nZW5fcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfZ2VuX3MgKiljbWQ7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCWlmICh2X2NtZCA9PSBJT0NNRF9ERUJVR19GV19TVEFURV9DTFIpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCQliZmFkLT5iZmEuaW9jLmRiZ19md3NhdmVfb25jZSA9IEJGQV9UUlVFOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwl9IGVsc2UgaWYgKHZfY21kID09IElPQ01EX0RFQlVHX1BPUlRMT0dfQ0xSKQorCQliZmFkLT5wbG9nX2J1Zi5oZWFkID0gYmZhZC0+cGxvZ19idWYudGFpbCA9IDA7CisJZWxzZSBpZiAodl9jbWQgPT0gSU9DTURfREVCVUdfU1RBUlRfRFRSQykKKwkJYmZhX3RyY19pbml0KGJmYWQtPnRyY21vZCk7CisJZWxzZSBpZiAodl9jbWQgPT0gSU9DTURfREVCVUdfU1RPUF9EVFJDKQorCQliZmFfdHJjX3N0b3AoYmZhZC0+dHJjbW9kKTsKKworCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfcG9yZ2xvZ19jdGwoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX3BvcnRsb2djdGxfcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfcG9ydGxvZ2N0bF9zICopY21kOworCisJaWYgKGlvY21kLT5jdGwgPT0gQkZBX1RSVUUpCisJCWJmYWQtPnBsb2dfYnVmLnBsb2dfZW5hYmxlZCA9IDE7CisJZWxzZQorCQliZmFkLT5wbG9nX2J1Zi5wbG9nX2VuYWJsZWQgPSAwOworCisJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9mY3BpbV9jZmdfcHJvZmlsZShzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQsIHVuc2lnbmVkIGludCB2X2NtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19mY3BpbV9wcm9maWxlX3MgKmlvY21kID0KKwkJCQkoc3RydWN0IGJmYV9ic2dfZmNwaW1fcHJvZmlsZV9zICopY21kOworCXN0cnVjdCB0aW1ldmFsICB0djsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJZG9fZ2V0dGltZW9mZGF5KCZ0dik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlmICh2X2NtZCA9PSBJT0NNRF9GQ1BJTV9QUk9GSUxFX09OKQorCQlpb2NtZC0+c3RhdHVzID0gYmZhX2ZjcGltX3Byb2ZpbGVfb24oJmJmYWQtPmJmYSwgdHYudHZfc2VjKTsKKwllbHNlIGlmICh2X2NtZCA9PSBJT0NNRF9GQ1BJTV9QUk9GSUxFX09GRikKKwkJaW9jbWQtPnN0YXR1cyA9IGJmYV9mY3BpbV9wcm9maWxlX29mZigmYmZhZC0+YmZhKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitiZmFkX2lvY21kX2l0bmltX2dldF9pb3Byb2ZpbGUoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2l0bmltX2lvcHJvZmlsZV9zICppb2NtZCA9CisJCQkJKHN0cnVjdCBiZmFfYnNnX2l0bmltX2lvcHJvZmlsZV9zICopY21kOworCXN0cnVjdCBiZmFfZmNzX2xwb3J0X3MgKmZjc19wb3J0OworCXN0cnVjdCBiZmFfZmNzX2l0bmltX3MgKml0bmltOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlmY3NfcG9ydCA9IGJmYV9mY3NfbG9va3VwX3BvcnQoJmJmYWQtPmJmYV9mY3MsCisJCQkJaW9jbWQtPnZmX2lkLCBpb2NtZC0+bHB3d24pOworCWlmICghZmNzX3BvcnQpCisJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX1VOS05PV05fTFdXTjsKKwllbHNlIHsKKwkJaXRuaW0gPSBiZmFfZmNzX2l0bmltX2xvb2t1cChmY3NfcG9ydCwgaW9jbWQtPnJwd3duKTsKKwkJaWYgKGl0bmltID09IE5VTEwpCisJCQlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19VTktOT1dOX1JXV047CisJCWVsc2UKKwkJCWlvY21kLT5zdGF0dXMgPSBiZmFfaXRuaW1fZ2V0X2lvcHJvZmlsZSgKKwkJCQkJCWJmYV9mY3NfaXRuaW1fZ2V0X2hhbGl0bihpdG5pbSksCisJCQkJCQkmaW9jbWQtPmlvcHJvZmlsZSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfZmNwb3J0X2dldF9zdGF0cyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfZmNwb3J0X3N0YXRzX3MgKmlvY21kID0KKwkJCQkoc3RydWN0IGJmYV9ic2dfZmNwb3J0X3N0YXRzX3MgKiljbWQ7CisJc3RydWN0IGJmYWRfaGFsX2NvbXAgZmNvbXA7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlzdHJ1Y3QgYmZhX2NiX3BlbmRpbmdfcV9zIGNiX3FlOworCisJaW5pdF9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwliZmFfcGVuZGluZ19xX2luaXQoJmNiX3FlLCAoYmZhX2NiX2NiZm5fdCliZmFkX2hjYl9jb21wLAorCQkJICAgJmZjb21wLCAmaW9jbWQtPnN0YXRzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IGJmYV9mY3BvcnRfZ2V0X3N0YXRzKCZiZmFkLT5iZmEsICZjYl9xZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaWYgKGlvY21kLT5zdGF0dXMgIT0gQkZBX1NUQVRVU19PSykgeworCQliZmFfdHJjKGJmYWQsIGlvY21kLT5zdGF0dXMpOworCQlnb3RvIG91dDsKKwl9CisJd2FpdF9mb3JfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJaW9jbWQtPnN0YXR1cyA9IGZjb21wLnN0YXR1czsKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX2ZjcG9ydF9yZXNldF9zdGF0cyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfZ2VuX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX2dlbl9zICopY21kOworCXN0cnVjdCBiZmFkX2hhbF9jb21wIGZjb21wOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJc3RydWN0IGJmYV9jYl9wZW5kaW5nX3FfcyBjYl9xZTsKKworCWluaXRfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJYmZhX3BlbmRpbmdfcV9pbml0KCZjYl9xZSwgKGJmYV9jYl9jYmZuX3QpYmZhZF9oY2JfY29tcCwgJmZjb21wLCBOVUxMKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gYmZhX2ZjcG9ydF9jbGVhcl9zdGF0cygmYmZhZC0+YmZhLCAmY2JfcWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlmIChpb2NtZC0+c3RhdHVzICE9IEJGQV9TVEFUVVNfT0spIHsKKwkJYmZhX3RyYyhiZmFkLCBpb2NtZC0+c3RhdHVzKTsKKwkJZ290byBvdXQ7CisJfQorCXdhaXRfZm9yX2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCWlvY21kLT5zdGF0dXMgPSBmY29tcC5zdGF0dXM7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9ib290X2NmZyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfYm9vdF9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19ib290X3MgKiljbWQ7CisJc3RydWN0IGJmYWRfaGFsX2NvbXAgZmNvbXA7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCWluaXRfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBiZmFfZmxhc2hfdXBkYXRlX3BhcnQoQkZBX0ZMQVNIKCZiZmFkLT5iZmEpLAorCQkJQkZBX0ZMQVNIX1BBUlRfQk9PVCwgUENJX0ZVTkMoYmZhZC0+cGNpZGV2LT5kZXZmbiksCisJCQkmaW9jbWQtPmNmZywgc2l6ZW9mKHN0cnVjdCBiZmFfYm9vdF9jZmdfcyksIDAsCisJCQliZmFkX2hjYl9jb21wLCAmZmNvbXApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlmIChpb2NtZC0+c3RhdHVzICE9IEJGQV9TVEFUVVNfT0spCisJCWdvdG8gb3V0OworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCWlvY21kLT5zdGF0dXMgPSBmY29tcC5zdGF0dXM7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9ib290X3F1ZXJ5KHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19ib290X3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX2Jvb3RfcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhZF9oYWxfY29tcCBmY29tcDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJaW5pdF9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IGJmYV9mbGFzaF9yZWFkX3BhcnQoQkZBX0ZMQVNIKCZiZmFkLT5iZmEpLAorCQkJQkZBX0ZMQVNIX1BBUlRfQk9PVCwgUENJX0ZVTkMoYmZhZC0+cGNpZGV2LT5kZXZmbiksCisJCQkmaW9jbWQtPmNmZywgc2l6ZW9mKHN0cnVjdCBiZmFfYm9vdF9jZmdfcyksIDAsCisJCQliZmFkX2hjYl9jb21wLCAmZmNvbXApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlmIChpb2NtZC0+c3RhdHVzICE9IEJGQV9TVEFUVVNfT0spCisJCWdvdG8gb3V0OworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCWlvY21kLT5zdGF0dXMgPSBmY29tcC5zdGF0dXM7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9wcmVib290X3F1ZXJ5KHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19wcmVib290X3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX3ByZWJvb3RfcyAqKWNtZDsKKwlzdHJ1Y3QgYmZpX2lvY2ZjX2NmZ3JzcF9zICpjZmdyc3AgPSBiZmFkLT5iZmEuaW9jZmMuY2ZncnNwOworCXN0cnVjdCBiZmFfYm9vdF9wYmNfcyAqcGJjZmcgPSAmaW9jbWQtPmNmZzsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCXBiY2ZnLT5lbmFibGUgPSBjZmdyc3AtPnBiY19jZmcuYm9vdF9lbmFibGVkOworCXBiY2ZnLT5uYmx1bnMgPSBjZmdyc3AtPnBiY19jZmcubmJsdW5zOworCXBiY2ZnLT5zcGVlZCA9IGNmZ3JzcC0+cGJjX2NmZy5wb3J0X3NwZWVkOworCW1lbWNweShwYmNmZy0+cGJsdW4sIGNmZ3JzcC0+cGJjX2NmZy5ibHVuLCBzaXplb2YocGJjZmctPnBibHVuKSk7CisJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX2V0aGJvb3RfY2ZnKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19ldGhib290X3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX2V0aGJvb3RfcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhZF9oYWxfY29tcCBmY29tcDsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJaW5pdF9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPnN0YXR1cyA9IGJmYV9mbGFzaF91cGRhdGVfcGFydChCRkFfRkxBU0goJmJmYWQtPmJmYSksCisJCQkJQkZBX0ZMQVNIX1BBUlRfUFhFQ0ZHLAorCQkJCWJmYWQtPmJmYS5pb2MucG9ydF9pZCwgJmlvY21kLT5jZmcsCisJCQkJc2l6ZW9mKHN0cnVjdCBiZmFfZXRoYm9vdF9jZmdfcyksIDAsCisJCQkJYmZhZF9oY2JfY29tcCwgJmZjb21wKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpZiAoaW9jbWQtPnN0YXR1cyAhPSBCRkFfU1RBVFVTX09LKQorCQlnb3RvIG91dDsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlpb2NtZC0+c3RhdHVzID0gZmNvbXAuc3RhdHVzOworb3V0OgorCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfZXRoYm9vdF9xdWVyeShzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfZXRoYm9vdF9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19ldGhib290X3MgKiljbWQ7CisJc3RydWN0IGJmYWRfaGFsX2NvbXAgZmNvbXA7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCWluaXRfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBiZmFfZmxhc2hfcmVhZF9wYXJ0KEJGQV9GTEFTSCgmYmZhZC0+YmZhKSwKKwkJCQlCRkFfRkxBU0hfUEFSVF9QWEVDRkcsCisJCQkJYmZhZC0+YmZhLmlvYy5wb3J0X2lkLCAmaW9jbWQtPmNmZywKKwkJCQlzaXplb2Yoc3RydWN0IGJmYV9ldGhib290X2NmZ19zKSwgMCwKKwkJCQliZmFkX2hjYl9jb21wLCAmZmNvbXApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlmIChpb2NtZC0+c3RhdHVzICE9IEJGQV9TVEFUVVNfT0spCisJCWdvdG8gb3V0OworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCWlvY21kLT5zdGF0dXMgPSBmY29tcC5zdGF0dXM7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9jZmdfdHJ1bmsoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kLCB1bnNpZ25lZCBpbnQgdl9jbWQpCit7CisJc3RydWN0IGJmYV9ic2dfZ2VuX3MgKmlvY21kID0gKHN0cnVjdCBiZmFfYnNnX2dlbl9zICopY21kOworCXN0cnVjdCBiZmFfZmNwb3J0X3MgKmZjcG9ydCA9IEJGQV9GQ1BPUlRfTU9EKCZiZmFkLT5iZmEpOworCXN0cnVjdCBiZmFfZmNwb3J0X3RydW5rX3MgKnRydW5rID0gJmZjcG9ydC0+dHJ1bms7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCWlmICh2X2NtZCA9PSBJT0NNRF9UUlVOS19FTkFCTEUpIHsKKwkJdHJ1bmstPmF0dHIuc3RhdGUgPSBCRkFfVFJVTktfT0ZGTElORTsKKwkJYmZhX2ZjcG9ydF9kaXNhYmxlKCZiZmFkLT5iZmEpOworCQlmY3BvcnQtPmNmZy50cnVua2VkID0gQkZBX1RSVUU7CisJfSBlbHNlIGlmICh2X2NtZCA9PSBJT0NNRF9UUlVOS19ESVNBQkxFKSB7CisJCXRydW5rLT5hdHRyLnN0YXRlID0gQkZBX1RSVU5LX0RJU0FCTEVEOworCQliZmFfZmNwb3J0X2Rpc2FibGUoJmJmYWQtPmJmYSk7CisJCWZjcG9ydC0+Y2ZnLnRydW5rZWQgPSBCRkFfRkFMU0U7CisJfQorCisJaWYgKCFiZmFfZmNwb3J0X2lzX2Rpc2FibGVkKCZiZmFkLT5iZmEpKQorCQliZmFfZmNwb3J0X2VuYWJsZSgmYmZhZC0+YmZhKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCisJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfT0s7CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF90cnVua19nZXRfYXR0cihzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfdHJ1bmtfYXR0cl9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ190cnVua19hdHRyX3MgKiljbWQ7CisJc3RydWN0IGJmYV9mY3BvcnRfcyAqZmNwb3J0ID0gQkZBX0ZDUE9SVF9NT0QoJmJmYWQtPmJmYSk7CisJc3RydWN0IGJmYV9mY3BvcnRfdHJ1bmtfcyAqdHJ1bmsgPSAmZmNwb3J0LT50cnVuazsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCW1lbWNweSgodm9pZCAqKSZpb2NtZC0+YXR0ciwgKHZvaWQgKikmdHJ1bmstPmF0dHIsCisJCXNpemVvZihzdHJ1Y3QgYmZhX3RydW5rX2F0dHJfcykpOworCWlvY21kLT5hdHRyLnBvcnRfaWQgPSBiZmFfbHBzX2dldF9iYXNlX3BpZCgmYmZhZC0+YmZhKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfcW9zKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCwgdW5zaWduZWQgaW50IHZfY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2dlbl9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19nZW5fcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhX2ZjcG9ydF9zICpmY3BvcnQgPSBCRkFfRkNQT1JUX01PRCgmYmZhZC0+YmZhKTsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlmIChiZmFfaW9jX2dldF90eXBlKCZiZmFkLT5iZmEuaW9jKSA9PSBCRkFfSU9DX1RZUEVfRkMpIHsKKwkJaWYgKHZfY21kID09IElPQ01EX1FPU19FTkFCTEUpCisJCQlmY3BvcnQtPmNmZy5xb3NfZW5hYmxlZCA9IEJGQV9UUlVFOworCQllbHNlIGlmICh2X2NtZCA9PSBJT0NNRF9RT1NfRElTQUJMRSkKKwkJCWZjcG9ydC0+Y2ZnLnFvc19lbmFibGVkID0gQkZBX0ZBTFNFOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfcW9zX2dldF9hdHRyKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19xb3NfYXR0cl9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19xb3NfYXR0cl9zICopY21kOworCXN0cnVjdCBiZmFfZmNwb3J0X3MgKmZjcG9ydCA9IEJGQV9GQ1BPUlRfTU9EKCZiZmFkLT5iZmEpOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaW9jbWQtPmF0dHIuc3RhdGUgPSBmY3BvcnQtPnFvc19hdHRyLnN0YXRlOworCWlvY21kLT5hdHRyLnRvdGFsX2JiX2NyID0gYmUzMl90b19jcHUoZmNwb3J0LT5xb3NfYXR0ci50b3RhbF9iYl9jcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX3Fvc19nZXRfdmNfYXR0cihzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfcW9zX3ZjX2F0dHJfcyAqaW9jbWQgPQorCQkJCShzdHJ1Y3QgYmZhX2JzZ19xb3NfdmNfYXR0cl9zICopY21kOworCXN0cnVjdCBiZmFfZmNwb3J0X3MgKmZjcG9ydCA9IEJGQV9GQ1BPUlRfTU9EKCZiZmFkLT5iZmEpOworCXN0cnVjdCBiZmFfcW9zX3ZjX2F0dHJfcyAqYmZhX3ZjX2F0dHIgPSAmZmNwb3J0LT5xb3NfdmNfYXR0cjsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCXUzMglpID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+YXR0ci50b3RhbF92Y19jb3VudCA9IGJlMTZfdG9fY3B1KGJmYV92Y19hdHRyLT50b3RhbF92Y19jb3VudCk7CisJaW9jbWQtPmF0dHIuc2hhcmVkX2NyZWRpdCAgPSBiZTE2X3RvX2NwdShiZmFfdmNfYXR0ci0+c2hhcmVkX2NyZWRpdCk7CisJaW9jbWQtPmF0dHIuZWxwX29wbW9kZV9mbGFncyAgPQorCQkJCWJlMzJfdG9fY3B1KGJmYV92Y19hdHRyLT5lbHBfb3Btb2RlX2ZsYWdzKTsKKworCS8qIEluZGl2aWR1YWwgVkMgaW5mbyAqLworCXdoaWxlIChpIDwgaW9jbWQtPmF0dHIudG90YWxfdmNfY291bnQpIHsKKwkJaW9jbWQtPmF0dHIudmNfaW5mb1tpXS52Y19jcmVkaXQgPQorCQkJCWJmYV92Y19hdHRyLT52Y19pbmZvW2ldLnZjX2NyZWRpdDsKKwkJaW9jbWQtPmF0dHIudmNfaW5mb1tpXS5ib3Jyb3dfY3JlZGl0ID0KKwkJCQliZmFfdmNfYXR0ci0+dmNfaW5mb1tpXS5ib3Jyb3dfY3JlZGl0OworCQlpb2NtZC0+YXR0ci52Y19pbmZvW2ldLnByaW9yaXR5ID0KKwkJCQliZmFfdmNfYXR0ci0+dmNfaW5mb1tpXS5wcmlvcml0eTsKKwkJaSsrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKworCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX09LOworCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfcW9zX2dldF9zdGF0cyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfZmNwb3J0X3N0YXRzX3MgKmlvY21kID0KKwkJCQkoc3RydWN0IGJmYV9ic2dfZmNwb3J0X3N0YXRzX3MgKiljbWQ7CisJc3RydWN0IGJmYWRfaGFsX2NvbXAgZmNvbXA7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlzdHJ1Y3QgYmZhX2NiX3BlbmRpbmdfcV9zIGNiX3FlOworCisJaW5pdF9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwliZmFfcGVuZGluZ19xX2luaXQoJmNiX3FlLCAoYmZhX2NiX2NiZm5fdCliZmFkX2hjYl9jb21wLAorCQkJICAgJmZjb21wLCAmaW9jbWQtPnN0YXRzKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlXQVJOX09OKCFiZmFfaW9jX2dldF9mY21vZGUoJmJmYWQtPmJmYS5pb2MpKTsKKwlpb2NtZC0+c3RhdHVzID0gYmZhX2ZjcG9ydF9nZXRfc3RhdHMoJmJmYWQtPmJmYSwgJmNiX3FlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpZiAoaW9jbWQtPnN0YXR1cyAhPSBCRkFfU1RBVFVTX09LKSB7CisJCWJmYV90cmMoYmZhZCwgaW9jbWQtPnN0YXR1cyk7CisJCWdvdG8gb3V0OworCX0KKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlpb2NtZC0+c3RhdHVzID0gZmNvbXAuc3RhdHVzOworb3V0OgorCXJldHVybiAwOworfQorCitpbnQKK2JmYWRfaW9jbWRfcW9zX3Jlc2V0X3N0YXRzKHN0cnVjdCBiZmFkX3MgKmJmYWQsIHZvaWQgKmNtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19nZW5fcyAqaW9jbWQgPSAoc3RydWN0IGJmYV9ic2dfZ2VuX3MgKiljbWQ7CisJc3RydWN0IGJmYWRfaGFsX2NvbXAgZmNvbXA7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwlzdHJ1Y3QgYmZhX2NiX3BlbmRpbmdfcV9zIGNiX3FlOworCisJaW5pdF9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwliZmFfcGVuZGluZ19xX2luaXQoJmNiX3FlLCAoYmZhX2NiX2NiZm5fdCliZmFkX2hjYl9jb21wLAorCQkJICAgJmZjb21wLCBOVUxMKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlXQVJOX09OKCFiZmFfaW9jX2dldF9mY21vZGUoJmJmYWQtPmJmYS5pb2MpKTsKKwlpb2NtZC0+c3RhdHVzID0gYmZhX2ZjcG9ydF9jbGVhcl9zdGF0cygmYmZhZC0+YmZhLCAmY2JfcWUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlmIChpb2NtZC0+c3RhdHVzICE9IEJGQV9TVEFUVVNfT0spIHsKKwkJYmZhX3RyYyhiZmFkLCBpb2NtZC0+c3RhdHVzKTsKKwkJZ290byBvdXQ7CisJfQorCXdhaXRfZm9yX2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCWlvY21kLT5zdGF0dXMgPSBmY29tcC5zdGF0dXM7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF92Zl9nZXRfc3RhdHMoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX3ZmX3N0YXRzX3MgKmlvY21kID0KKwkJCShzdHJ1Y3QgYmZhX2JzZ192Zl9zdGF0c19zICopY21kOworCXN0cnVjdCBiZmFfZmNzX2ZhYnJpY19zCSpmY3NfdmY7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlmY3NfdmYgPSBiZmFfZmNzX3ZmX2xvb2t1cCgmYmZhZC0+YmZhX2ZjcywgaW9jbWQtPnZmX2lkKTsKKwlpZiAoZmNzX3ZmID09IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJCWlvY21kLT5zdGF0dXMgPSBCRkFfU1RBVFVTX1VOS05PV05fVkZJRDsKKwkJZ290byBvdXQ7CisJfQorCW1lbWNweSgodm9pZCAqKSZpb2NtZC0+c3RhdHMsICh2b2lkICopJmZjc192Zi0+c3RhdHMsCisJCXNpemVvZihzdHJ1Y3QgYmZhX3ZmX3N0YXRzX3MpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX3ZmX2Nscl9zdGF0cyhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQpCit7CisJc3RydWN0IGJmYV9ic2dfdmZfcmVzZXRfc3RhdHNfcyAqaW9jbWQgPQorCQkJKHN0cnVjdCBiZmFfYnNnX3ZmX3Jlc2V0X3N0YXRzX3MgKiljbWQ7CisJc3RydWN0IGJmYV9mY3NfZmFicmljX3MJKmZjc192ZjsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWZjc192ZiA9IGJmYV9mY3NfdmZfbG9va3VwKCZiZmFkLT5iZmFfZmNzLCBpb2NtZC0+dmZfaWQpOworCWlmIChmY3NfdmYgPT0gTlVMTCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwkJaW9jbWQtPnN0YXR1cyA9IEJGQV9TVEFUVVNfVU5LTk9XTl9WRklEOworCQlnb3RvIG91dDsKKwl9CisJbWVtc2V0KCh2b2lkICopJmZjc192Zi0+c3RhdHMsIDAsIHNpemVvZihzdHJ1Y3QgYmZhX3ZmX3N0YXRzX3MpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpb2NtZC0+c3RhdHVzID0gQkZBX1NUQVRVU19PSzsKK291dDoKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX2x1bm1hc2soc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqcGNtZCwgdW5zaWduZWQgaW50IHZfY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2dlbl9zICppb2NtZCA9IChzdHJ1Y3QgYmZhX2JzZ19nZW5fcyAqKXBjbWQ7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlpZiAodl9jbWQgPT0gSU9DTURfRkNQSU1fTFVOTUFTS19FTkFCTEUpCisJCWlvY21kLT5zdGF0dXMgPSBiZmFfZmNwaW1fbHVubWFza191cGRhdGUoJmJmYWQtPmJmYSwgQkZBX1RSVUUpOworCWVsc2UgaWYgKHZfY21kID09IElPQ01EX0ZDUElNX0xVTk1BU0tfRElTQUJMRSkKKwkJaW9jbWQtPnN0YXR1cyA9IGJmYV9mY3BpbV9sdW5tYXNrX3VwZGF0ZSgmYmZhZC0+YmZhLCBCRkFfRkFMU0UpOworCWVsc2UgaWYgKHZfY21kID09IElPQ01EX0ZDUElNX0xVTk1BU0tfQ0xFQVIpCisJCWlvY21kLT5zdGF0dXMgPSBiZmFfZmNwaW1fbHVubWFza19jbGVhcigmYmZhZC0+YmZhKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworaW50CitiZmFkX2lvY21kX2ZjcGltX2x1bm1hc2tfcXVlcnkoc3RydWN0IGJmYWRfcyAqYmZhZCwgdm9pZCAqY21kKQoreworCXN0cnVjdCBiZmFfYnNnX2ZjcGltX2x1bm1hc2tfcXVlcnlfcyAqaW9jbWQgPQorCQkJKHN0cnVjdCBiZmFfYnNnX2ZjcGltX2x1bm1hc2tfcXVlcnlfcyAqKWNtZDsKKwlzdHJ1Y3QgYmZhX2x1bm1hc2tfY2ZnX3MgKmx1bl9tYXNrID0gJmlvY21kLT5sdW5fbWFzazsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCWlvY21kLT5zdGF0dXMgPSBiZmFfZmNwaW1fbHVubWFza19xdWVyeSgmYmZhZC0+YmZhLCBsdW5fbWFzayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK2ludAorYmZhZF9pb2NtZF9mY3BpbV9jZmdfbHVubWFzayhzdHJ1Y3QgYmZhZF9zICpiZmFkLCB2b2lkICpjbWQsIHVuc2lnbmVkIGludCB2X2NtZCkKK3sKKwlzdHJ1Y3QgYmZhX2JzZ19mY3BpbV9sdW5tYXNrX3MgKmlvY21kID0KKwkJCQkoc3RydWN0IGJmYV9ic2dfZmNwaW1fbHVubWFza19zICopY21kOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9sb2NrLCBmbGFncyk7CisJaWYgKHZfY21kID09IElPQ01EX0ZDUElNX0xVTk1BU0tfQUREKQorCQlpb2NtZC0+c3RhdHVzID0gYmZhX2ZjcGltX2x1bm1hc2tfYWRkKCZiZmFkLT5iZmEsIGlvY21kLT52Zl9pZCwKKwkJCQkJJmlvY21kLT5wd3duLCBpb2NtZC0+cnB3d24sIGlvY21kLT5sdW4pOworCWVsc2UgaWYgKHZfY21kID09IElPQ01EX0ZDUElNX0xVTk1BU0tfREVMRVRFKQorCQlpb2NtZC0+c3RhdHVzID0gYmZhX2ZjcGltX2x1bm1hc2tfZGVsZXRlKCZiZmFkLT5iZmEsCisJCQkJCWlvY21kLT52Zl9pZCwgJmlvY21kLT5wd3duLAorCQkJCQlpb2NtZC0+cnB3d24sIGlvY21kLT5sdW4pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJmYWQtPmJmYWRfbG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50CiBiZmFkX2lvY21kX2hhbmRsZXIoc3RydWN0IGJmYWRfcyAqYmZhZCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCAqaW9jbWQsCiAJCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbikKIHsKLQlpbnQgcmMgPSBFSU5WQUw7CisJaW50IHJjID0gLUVJTlZBTDsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBJT0NNRF9JT0NfRU5BQkxFOgpAQCAtMTUzNiw2ICsyNDY5LDE0IEBACiAJY2FzZSBJT0NNRF9JT0NfR0VUX0ZXU1RBVFM6CiAJCXJjID0gYmZhZF9pb2NtZF9pb2NfZ2V0X2Z3c3RhdHMoYmZhZCwgaW9jbWQsIHBheWxvYWRfbGVuKTsKIAkJYnJlYWs7CisJY2FzZSBJT0NNRF9JT0NfUkVTRVRfU1RBVFM6CisJY2FzZSBJT0NNRF9JT0NfUkVTRVRfRldTVEFUUzoKKwkJcmMgPSBiZmFkX2lvY21kX2lvY19yZXNldF9zdGF0cyhiZmFkLCBpb2NtZCwgY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9JT0NfU0VUX0FEQVBURVJfTkFNRToKKwljYXNlIElPQ01EX0lPQ19TRVRfUE9SVF9OQU1FOgorCQlyYyA9IGJmYWRfaW9jbWRfaW9jX3NldF9uYW1lKGJmYWQsIGlvY21kLCBjbWQpOworCQlicmVhazsKIAljYXNlIElPQ01EX0lPQ0ZDX0dFVF9BVFRSOgogCQlyYyA9IGJmYWRfaW9jbWRfaW9jZmNfZ2V0X2F0dHIoYmZhZCwgaW9jbWQpOwogCQlicmVhazsKQEAgLTE1NTQsMTIgKzI0OTUsMzEgQEAKIAljYXNlIElPQ01EX1BPUlRfR0VUX1NUQVRTOgogCQlyYyA9IGJmYWRfaW9jbWRfcG9ydF9nZXRfc3RhdHMoYmZhZCwgaW9jbWQsIHBheWxvYWRfbGVuKTsKIAkJYnJlYWs7CisJY2FzZSBJT0NNRF9QT1JUX1JFU0VUX1NUQVRTOgorCQlyYyA9IGJmYWRfaW9jbWRfcG9ydF9yZXNldF9zdGF0cyhiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfUE9SVF9DRkdfVE9QTzoKKwljYXNlIElPQ01EX1BPUlRfQ0ZHX1NQRUVEOgorCWNhc2UgSU9DTURfUE9SVF9DRkdfQUxQQToKKwljYXNlIElPQ01EX1BPUlRfQ0xSX0FMUEE6CisJCXJjID0gYmZhZF9pb2NtZF9zZXRfcG9ydF9jZmcoYmZhZCwgaW9jbWQsIGNtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfUE9SVF9DRkdfTUFYRlJTWjoKKwkJcmMgPSBiZmFkX2lvY21kX3BvcnRfY2ZnX21heGZyc2l6ZShiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfUE9SVF9CQlNDX0VOQUJMRToKKwljYXNlIElPQ01EX1BPUlRfQkJTQ19ESVNBQkxFOgorCQlyYyA9IGJmYWRfaW9jbWRfcG9ydF9jZmdfYmJzYyhiZmFkLCBpb2NtZCwgY21kKTsKKwkJYnJlYWs7CiAJY2FzZSBJT0NNRF9MUE9SVF9HRVRfQVRUUjoKIAkJcmMgPSBiZmFkX2lvY21kX2xwb3J0X2dldF9hdHRyKGJmYWQsIGlvY21kKTsKIAkJYnJlYWs7CiAJY2FzZSBJT0NNRF9MUE9SVF9HRVRfU1RBVFM6CiAJCXJjID0gYmZhZF9pb2NtZF9scG9ydF9nZXRfc3RhdHMoYmZhZCwgaW9jbWQpOwogCQlicmVhazsKKwljYXNlIElPQ01EX0xQT1JUX1JFU0VUX1NUQVRTOgorCQlyYyA9IGJmYWRfaW9jbWRfbHBvcnRfcmVzZXRfc3RhdHMoYmZhZCwgaW9jbWQpOworCQlicmVhazsKIAljYXNlIElPQ01EX0xQT1JUX0dFVF9JT1NUQVRTOgogCQlyYyA9IGJmYWRfaW9jbWRfbHBvcnRfZ2V0X2lvc3RhdHMoYmZhZCwgaW9jbWQpOwogCQlicmVhazsKQEAgLTE1NzUsMTIgKzI1MzUsNDAgQEAKIAljYXNlIElPQ01EX1JQT1JUX0dFVF9TVEFUUzoKIAkJcmMgPSBiZmFkX2lvY21kX3Jwb3J0X2dldF9zdGF0cyhiZmFkLCBpb2NtZCk7CiAJCWJyZWFrOworCWNhc2UgSU9DTURfUlBPUlRfUkVTRVRfU1RBVFM6CisJCXJjID0gYmZhZF9pb2NtZF9ycG9ydF9jbHJfc3RhdHMoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX1JQT1JUX1NFVF9TUEVFRDoKKwkJcmMgPSBiZmFkX2lvY21kX3Jwb3J0X3NldF9zcGVlZChiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfVlBPUlRfR0VUX0FUVFI6CisJCXJjID0gYmZhZF9pb2NtZF92cG9ydF9nZXRfYXR0cihiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfVlBPUlRfR0VUX1NUQVRTOgorCQlyYyA9IGJmYWRfaW9jbWRfdnBvcnRfZ2V0X3N0YXRzKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9WUE9SVF9SRVNFVF9TVEFUUzoKKwkJcmMgPSBiZmFkX2lvY21kX3Zwb3J0X2Nscl9zdGF0cyhiZmFkLCBpb2NtZCk7CisJCWJyZWFrOwogCWNhc2UgSU9DTURfRkFCUklDX0dFVF9MUE9SVFM6CiAJCXJjID0gYmZhZF9pb2NtZF9mYWJyaWNfZ2V0X2xwb3J0cyhiZmFkLCBpb2NtZCwgcGF5bG9hZF9sZW4pOwogCQlicmVhazsKKwljYXNlIElPQ01EX1JBVEVMSU1fRU5BQkxFOgorCWNhc2UgSU9DTURfUkFURUxJTV9ESVNBQkxFOgorCQlyYyA9IGJmYWRfaW9jbWRfcmF0ZWxpbShiZmFkLCBjbWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9SQVRFTElNX0RFRl9TUEVFRDoKKwkJcmMgPSBiZmFkX2lvY21kX3JhdGVsaW1fc3BlZWQoYmZhZCwgY21kLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfRkNQSU1fRkFJTE9WRVI6CisJCXJjID0gYmZhZF9pb2NtZF9jZmdfZmNwaW0oYmZhZCwgaW9jbWQpOworCQlicmVhazsKIAljYXNlIElPQ01EX0ZDUElNX01PRFNUQVRTOgogCQlyYyA9IGJmYWRfaW9jbWRfZmNwaW1fZ2V0X21vZHN0YXRzKGJmYWQsIGlvY21kKTsKIAkJYnJlYWs7CisJY2FzZSBJT0NNRF9GQ1BJTV9NT0RTVEFUU0NMUjoKKwkJcmMgPSBiZmFkX2lvY21kX2ZjcGltX2Nscl9tb2RzdGF0cyhiZmFkLCBpb2NtZCk7CisJCWJyZWFrOwogCWNhc2UgSU9DTURfRkNQSU1fREVMX0lUTl9TVEFUUzoKIAkJcmMgPSBiZmFkX2lvY21kX2ZjcGltX2dldF9kZWxfaXRuX3N0YXRzKGJmYWQsIGlvY21kKTsKIAkJYnJlYWs7CkBAIC0xNTkwLDYgKzI1NzgsOSBAQAogCWNhc2UgSU9DTURfSVROSU1fR0VUX0lPU1RBVFM6CiAJCXJjID0gYmZhZF9pb2NtZF9pdG5pbV9nZXRfaW9zdGF0cyhiZmFkLCBpb2NtZCk7CiAJCWJyZWFrOworCWNhc2UgSU9DTURfSVROSU1fUkVTRVRfU1RBVFM6CisJCXJjID0gYmZhZF9pb2NtZF9pdG5pbV9yZXNldF9zdGF0cyhiZmFkLCBpb2NtZCk7CisJCWJyZWFrOwogCWNhc2UgSU9DTURfSVROSU1fR0VUX0lUTlNUQVRTOgogCQlyYyA9IGJmYWRfaW9jbWRfaXRuaW1fZ2V0X2l0bnN0YXRzKGJmYWQsIGlvY21kKTsKIAkJYnJlYWs7CkBAIC0xNzAyLDExICsyNjkzLDkyIEBACiAJY2FzZSBJT0NNRF9ERUJVR19QT1JUTE9HOgogCQlyYyA9IGJmYWRfaW9jbWRfcG9yZ2xvZ19nZXQoYmZhZCwgaW9jbWQpOwogCQlicmVhazsKKwljYXNlIElPQ01EX0RFQlVHX0ZXX0NPUkU6CisJCXJjID0gYmZhZF9pb2NtZF9kZWJ1Z19md19jb3JlKGJmYWQsIGlvY21kLCBwYXlsb2FkX2xlbik7CisJCWJyZWFrOworCWNhc2UgSU9DTURfREVCVUdfRldfU1RBVEVfQ0xSOgorCWNhc2UgSU9DTURfREVCVUdfUE9SVExPR19DTFI6CisJY2FzZSBJT0NNRF9ERUJVR19TVEFSVF9EVFJDOgorCWNhc2UgSU9DTURfREVCVUdfU1RPUF9EVFJDOgorCQlyYyA9IGJmYWRfaW9jbWRfZGVidWdfY3RsKGJmYWQsIGlvY21kLCBjbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0RFQlVHX1BPUlRMT0dfQ1RMOgorCQlyYyA9IGJmYWRfaW9jbWRfcG9yZ2xvZ19jdGwoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0ZDUElNX1BST0ZJTEVfT046CisJY2FzZSBJT0NNRF9GQ1BJTV9QUk9GSUxFX09GRjoKKwkJcmMgPSBiZmFkX2lvY21kX2ZjcGltX2NmZ19wcm9maWxlKGJmYWQsIGlvY21kLCBjbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0lUTklNX0dFVF9JT1BST0ZJTEU6CisJCXJjID0gYmZhZF9pb2NtZF9pdG5pbV9nZXRfaW9wcm9maWxlKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9GQ1BPUlRfR0VUX1NUQVRTOgorCQlyYyA9IGJmYWRfaW9jbWRfZmNwb3J0X2dldF9zdGF0cyhiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfRkNQT1JUX1JFU0VUX1NUQVRTOgorCQlyYyA9IGJmYWRfaW9jbWRfZmNwb3J0X3Jlc2V0X3N0YXRzKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9CT09UX0NGRzoKKwkJcmMgPSBiZmFkX2lvY21kX2Jvb3RfY2ZnKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9CT09UX1FVRVJZOgorCQlyYyA9IGJmYWRfaW9jbWRfYm9vdF9xdWVyeShiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfUFJFQk9PVF9RVUVSWToKKwkJcmMgPSBiZmFkX2lvY21kX3ByZWJvb3RfcXVlcnkoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0VUSEJPT1RfQ0ZHOgorCQlyYyA9IGJmYWRfaW9jbWRfZXRoYm9vdF9jZmcoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX0VUSEJPT1RfUVVFUlk6CisJCXJjID0gYmZhZF9pb2NtZF9ldGhib290X3F1ZXJ5KGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9UUlVOS19FTkFCTEU6CisJY2FzZSBJT0NNRF9UUlVOS19ESVNBQkxFOgorCQlyYyA9IGJmYWRfaW9jbWRfY2ZnX3RydW5rKGJmYWQsIGlvY21kLCBjbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX1RSVU5LX0dFVF9BVFRSOgorCQlyYyA9IGJmYWRfaW9jbWRfdHJ1bmtfZ2V0X2F0dHIoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX1FPU19FTkFCTEU6CisJY2FzZSBJT0NNRF9RT1NfRElTQUJMRToKKwkJcmMgPSBiZmFkX2lvY21kX3FvcyhiZmFkLCBpb2NtZCwgY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9RT1NfR0VUX0FUVFI6CisJCXJjID0gYmZhZF9pb2NtZF9xb3NfZ2V0X2F0dHIoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX1FPU19HRVRfVkNfQVRUUjoKKwkJcmMgPSBiZmFkX2lvY21kX3Fvc19nZXRfdmNfYXR0cihiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfUU9TX0dFVF9TVEFUUzoKKwkJcmMgPSBiZmFkX2lvY21kX3Fvc19nZXRfc3RhdHMoYmZhZCwgaW9jbWQpOworCQlicmVhazsKKwljYXNlIElPQ01EX1FPU19SRVNFVF9TVEFUUzoKKwkJcmMgPSBiZmFkX2lvY21kX3Fvc19yZXNldF9zdGF0cyhiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfVkZfR0VUX1NUQVRTOgorCQlyYyA9IGJmYWRfaW9jbWRfdmZfZ2V0X3N0YXRzKGJmYWQsIGlvY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9WRl9SRVNFVF9TVEFUUzoKKwkJcmMgPSBiZmFkX2lvY21kX3ZmX2Nscl9zdGF0cyhiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfRkNQSU1fTFVOTUFTS19FTkFCTEU6CisJY2FzZSBJT0NNRF9GQ1BJTV9MVU5NQVNLX0RJU0FCTEU6CisJY2FzZSBJT0NNRF9GQ1BJTV9MVU5NQVNLX0NMRUFSOgorCQlyYyA9IGJmYWRfaW9jbWRfbHVubWFzayhiZmFkLCBpb2NtZCwgY21kKTsKKwkJYnJlYWs7CisJY2FzZSBJT0NNRF9GQ1BJTV9MVU5NQVNLX1FVRVJZOgorCQlyYyA9IGJmYWRfaW9jbWRfZmNwaW1fbHVubWFza19xdWVyeShiZmFkLCBpb2NtZCk7CisJCWJyZWFrOworCWNhc2UgSU9DTURfRkNQSU1fTFVOTUFTS19BREQ6CisJY2FzZSBJT0NNRF9GQ1BJTV9MVU5NQVNLX0RFTEVURToKKwkJcmMgPSBiZmFkX2lvY21kX2ZjcGltX2NmZ19sdW5tYXNrKGJmYWQsIGlvY21kLCBjbWQpOworCQlicmVhazsKIAlkZWZhdWx0OgotCQlyYyA9IEVJTlZBTDsKKwkJcmMgPSAtRUlOVkFMOwogCQlicmVhazsKIAl9Ci0JcmV0dXJuIC1yYzsKKwlyZXR1cm4gcmM7CiB9CiAKIHN0YXRpYyBpbnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9ic2cuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9ic2cuaAppbmRleCA5OWIwZThhLi5lODU5YWRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfYnNnLmgKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2JzZy5oCkBAIC0zMCwyNCArMzAsNDggQEAKIAlJT0NNRF9JT0NfR0VUX0lORk8sCiAJSU9DTURfSU9DX0dFVF9TVEFUUywKIAlJT0NNRF9JT0NfR0VUX0ZXU1RBVFMsCisJSU9DTURfSU9DX1JFU0VUX1NUQVRTLAorCUlPQ01EX0lPQ19SRVNFVF9GV1NUQVRTLAorCUlPQ01EX0lPQ19TRVRfQURBUFRFUl9OQU1FLAorCUlPQ01EX0lPQ19TRVRfUE9SVF9OQU1FLAogCUlPQ01EX0lPQ0ZDX0dFVF9BVFRSLAogCUlPQ01EX0lPQ0ZDX1NFVF9JTlRSLAogCUlPQ01EX1BPUlRfRU5BQkxFLAogCUlPQ01EX1BPUlRfRElTQUJMRSwKIAlJT0NNRF9QT1JUX0dFVF9BVFRSLAogCUlPQ01EX1BPUlRfR0VUX1NUQVRTLAorCUlPQ01EX1BPUlRfUkVTRVRfU1RBVFMsCisJSU9DTURfUE9SVF9DRkdfVE9QTywKKwlJT0NNRF9QT1JUX0NGR19TUEVFRCwKKwlJT0NNRF9QT1JUX0NGR19BTFBBLAorCUlPQ01EX1BPUlRfQ0ZHX01BWEZSU1osCisJSU9DTURfUE9SVF9DTFJfQUxQQSwKKwlJT0NNRF9QT1JUX0JCU0NfRU5BQkxFLAorCUlPQ01EX1BPUlRfQkJTQ19ESVNBQkxFLAogCUlPQ01EX0xQT1JUX0dFVF9BVFRSLAogCUlPQ01EX0xQT1JUX0dFVF9SUE9SVFMsCiAJSU9DTURfTFBPUlRfR0VUX1NUQVRTLAorCUlPQ01EX0xQT1JUX1JFU0VUX1NUQVRTLAogCUlPQ01EX0xQT1JUX0dFVF9JT1NUQVRTLAogCUlPQ01EX1JQT1JUX0dFVF9BVFRSLAogCUlPQ01EX1JQT1JUX0dFVF9BRERSLAogCUlPQ01EX1JQT1JUX0dFVF9TVEFUUywKKwlJT0NNRF9SUE9SVF9SRVNFVF9TVEFUUywKKwlJT0NNRF9SUE9SVF9TRVRfU1BFRUQsCisJSU9DTURfVlBPUlRfR0VUX0FUVFIsCisJSU9DTURfVlBPUlRfR0VUX1NUQVRTLAorCUlPQ01EX1ZQT1JUX1JFU0VUX1NUQVRTLAogCUlPQ01EX0ZBQlJJQ19HRVRfTFBPUlRTLAorCUlPQ01EX1JBVEVMSU1fRU5BQkxFLAorCUlPQ01EX1JBVEVMSU1fRElTQUJMRSwKKwlJT0NNRF9SQVRFTElNX0RFRl9TUEVFRCwKKwlJT0NNRF9GQ1BJTV9GQUlMT1ZFUiwKIAlJT0NNRF9GQ1BJTV9NT0RTVEFUUywKKwlJT0NNRF9GQ1BJTV9NT0RTVEFUU0NMUiwKIAlJT0NNRF9GQ1BJTV9ERUxfSVROX1NUQVRTLAogCUlPQ01EX0lUTklNX0dFVF9BVFRSLAogCUlPQ01EX0lUTklNX0dFVF9JT1NUQVRTLAorCUlPQ01EX0lUTklNX1JFU0VUX1NUQVRTLAogCUlPQ01EX0lUTklNX0dFVF9JVE5TVEFUUywKIAlJT0NNRF9JT0NfUENJRk5fQ0ZHLAogCUlPQ01EX0ZDUE9SVF9FTkFCTEUsCkBAIC04Niw2ICsxMTAsMzkgQEAKIAlJT0NNRF9QSFlfUkVBRF9GVywKIAlJT0NNRF9WSEJBX1FVRVJZLAogCUlPQ01EX0RFQlVHX1BPUlRMT0csCisJSU9DTURfREVCVUdfRldfQ09SRSwKKwlJT0NNRF9ERUJVR19GV19TVEFURV9DTFIsCisJSU9DTURfREVCVUdfUE9SVExPR19DTFIsCisJSU9DTURfREVCVUdfU1RBUlRfRFRSQywKKwlJT0NNRF9ERUJVR19TVE9QX0RUUkMsCisJSU9DTURfREVCVUdfUE9SVExPR19DVEwsCisJSU9DTURfRkNQSU1fUFJPRklMRV9PTiwKKwlJT0NNRF9GQ1BJTV9QUk9GSUxFX09GRiwKKwlJT0NNRF9JVE5JTV9HRVRfSU9QUk9GSUxFLAorCUlPQ01EX0ZDUE9SVF9HRVRfU1RBVFMsCisJSU9DTURfRkNQT1JUX1JFU0VUX1NUQVRTLAorCUlPQ01EX0JPT1RfQ0ZHLAorCUlPQ01EX0JPT1RfUVVFUlksCisJSU9DTURfUFJFQk9PVF9RVUVSWSwKKwlJT0NNRF9FVEhCT09UX0NGRywKKwlJT0NNRF9FVEhCT09UX1FVRVJZLAorCUlPQ01EX1RSVU5LX0VOQUJMRSwKKwlJT0NNRF9UUlVOS19ESVNBQkxFLAorCUlPQ01EX1RSVU5LX0dFVF9BVFRSLAorCUlPQ01EX1FPU19FTkFCTEUsCisJSU9DTURfUU9TX0RJU0FCTEUsCisJSU9DTURfUU9TX0dFVF9BVFRSLAorCUlPQ01EX1FPU19HRVRfVkNfQVRUUiwKKwlJT0NNRF9RT1NfR0VUX1NUQVRTLAorCUlPQ01EX1FPU19SRVNFVF9TVEFUUywKKwlJT0NNRF9WRl9HRVRfU1RBVFMsCisJSU9DTURfVkZfUkVTRVRfU1RBVFMsCisJSU9DTURfRkNQSU1fTFVOTUFTS19FTkFCTEUsCisJSU9DTURfRkNQSU1fTFVOTUFTS19ESVNBQkxFLAorCUlPQ01EX0ZDUElNX0xVTk1BU0tfQ0xFQVIsCisJSU9DTURfRkNQSU1fTFVOTUFTS19RVUVSWSwKKwlJT0NNRF9GQ1BJTV9MVU5NQVNLX0FERCwKKwlJT0NNRF9GQ1BJTV9MVU5NQVNLX0RFTEVURSwKIH07CiAKIHN0cnVjdCBiZmFfYnNnX2dlbl9zIHsKQEAgLTk0LDYgKzE1MSw0MyBAQAogCXUxNgkJcnN2ZDsKIH07CiAKK3N0cnVjdCBiZmFfYnNnX3BvcnRsb2djdGxfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJcnN2ZDsKKwliZmFfYm9vbGVhbl90CWN0bDsKKwlpbnQJCWluc3Rfbm87Cit9OworCitzdHJ1Y3QgYmZhX2JzZ19mY3BpbV9wcm9maWxlX3MgeworCWJmYV9zdGF0dXNfdCAgICBzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXJzdmQ7Cit9OworCitzdHJ1Y3QgYmZhX2JzZ19pdG5pbV9pb3Byb2ZpbGVfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJdmZfaWQ7CisJd3duX3QJCWxwd3duOworCXd3bl90CQlycHd3bjsKKwlzdHJ1Y3QgYmZhX2l0bmltX2lvcHJvZmlsZV9zIGlvcHJvZmlsZTsKK307CisKK3N0cnVjdCBiZmFfYnNnX2ZjcG9ydF9zdGF0c19zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQlyc3ZkOworCXVuaW9uIGJmYV9mY3BvcnRfc3RhdHNfdSBzdGF0czsKK307CisKK3N0cnVjdCBiZmFfYnNnX2lvY19uYW1lX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXJzdmQ7CisJY2hhcgkJbmFtZVtCRkFfQURBUFRFUl9TWU1fTkFNRV9MRU5dOworfTsKKwogc3RydWN0IGJmYV9ic2dfaW9jX2luZm9fcyB7CiAJYmZhX3N0YXR1c190CXN0YXR1czsKIAl1MTYJCWJmYWRfbnVtOwpAQCAtMTY0LDYgKzI1OCwyMCBAQAogCXN0cnVjdCBiZmFfcG9ydF9hdHRyX3MJYXR0cjsKIH07CiAKK3N0cnVjdCBiZmFfYnNnX3BvcnRfY2ZnX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXJzdmQ7CisJdTMyCQlwYXJhbTsKKwl1MzIJCXJzdmQxOworfTsKKworc3RydWN0IGJmYV9ic2dfcG9ydF9jZmdfbWF4ZnJzaXplX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCW1heGZyc2l6ZTsKK307CisKIHN0cnVjdCBiZmFfYnNnX3BvcnRfc3RhdHNfcyB7CiAJYmZhX3N0YXR1c190CXN0YXR1czsKIAl1MTYJCWJmYWRfbnVtOwpAQCAtMjM3LDYgKzM0NSw0NyBAQAogCXUzMgkJbHVuOwogfTsKIAorc3RydWN0IGJmYV9ic2dfcnBvcnRfcmVzZXRfc3RhdHNfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJdmZfaWQ7CisJd3duX3QJCXB3d247CisJd3duX3QJCXJwd3duOworfTsKKworc3RydWN0IGJmYV9ic2dfcnBvcnRfc2V0X3NwZWVkX3MgeworCWJmYV9zdGF0dXNfdAkJc3RhdHVzOworCXUxNgkJCWJmYWRfbnVtOworCXUxNgkJCXZmX2lkOworCWVudW0gYmZhX3BvcnRfc3BlZWQJc3BlZWQ7CisJdTMyCQkJcnN2ZDsKKwl3d25fdAkJCXB3d247CisJd3duX3QJCQlycHd3bjsKK307CisKK3N0cnVjdCBiZmFfYnNnX3Zwb3J0X2F0dHJfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJdmZfaWQ7CisJd3duX3QJCXZwd3duOworCXN0cnVjdCBiZmFfdnBvcnRfYXR0cl9zIHZwb3J0X2F0dHI7Cit9OworCitzdHJ1Y3QgYmZhX2JzZ192cG9ydF9zdGF0c19zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQl2Zl9pZDsKKwl3d25fdAkJdnB3d247CisJc3RydWN0IGJmYV92cG9ydF9zdGF0c19zIHZwb3J0X3N0YXRzOworfTsKKworc3RydWN0IGJmYV9ic2dfcmVzZXRfc3RhdHNfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJdmZfaWQ7CisJd3duX3QJCXZwd3duOworfTsKKwogc3RydWN0IGJmYV9ic2dfZmFicmljX2dldF9scG9ydHNfcyB7CiAJYmZhX3N0YXR1c190CXN0YXR1czsKIAl1MTYJCWJmYWRfbnVtOwpAQCAtMjQ2LDYgKzM5NSwxOSBAQAogCXUzMgkJcnN2ZDsKIH07CiAKK3N0cnVjdCBiZmFfYnNnX3RybF9zcGVlZF9zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQlyc3ZkOworCWVudW0gYmZhX3BvcnRfc3BlZWQgc3BlZWQ7Cit9OworCitzdHJ1Y3QgYmZhX2JzZ19mY3BpbV9zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQlwYXJhbTsKK307CisKIHN0cnVjdCBiZmFfYnNnX2ZjcGltX21vZHN0YXRzX3MgewogCWJmYV9zdGF0dXNfdAlzdGF0dXM7CiAJdTE2CQliZmFkX251bTsKQEAgLTI1OCw2ICs0MjAsMTEgQEAKIAlzdHJ1Y3QgYmZhX2ZjcGltX2RlbF9pdG5fc3RhdHNfcyBtb2RzdGF0czsKIH07CiAKK3N0cnVjdCBiZmFfYnNnX2ZjcGltX21vZHN0YXRzY2xyX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKK307CisKIHN0cnVjdCBiZmFfYnNnX2l0bmltX2F0dHJfcyB7CiAJYmZhX3N0YXR1c190CXN0YXR1czsKIAl1MTYJCWJmYWRfbnVtOwpAQCAtNDg1LDYgKzY1Miw3NiBAQAogCXN0cnVjdCBiZmFfdmhiYV9hdHRyX3MJYXR0cjsKIH07CiAKK3N0cnVjdCBiZmFfYnNnX2Jvb3RfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJcnN2ZDsKKwlzdHJ1Y3QgYmZhX2Jvb3RfY2ZnX3MJY2ZnOworfTsKKworc3RydWN0IGJmYV9ic2dfcHJlYm9vdF9zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQlyc3ZkOworCXN0cnVjdCBiZmFfYm9vdF9wYmNfcwljZmc7Cit9OworCitzdHJ1Y3QgYmZhX2JzZ19ldGhib290X3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXJzdmQ7CisJc3RydWN0ICBiZmFfZXRoYm9vdF9jZmdfcyAgY2ZnOworfTsKKworc3RydWN0IGJmYV9ic2dfdHJ1bmtfYXR0cl9zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQlyc3ZkOworCXN0cnVjdCBiZmFfdHJ1bmtfYXR0cl9zIGF0dHI7Cit9OworCitzdHJ1Y3QgYmZhX2JzZ19xb3NfYXR0cl9zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQlyc3ZkOworCXN0cnVjdCBiZmFfcW9zX2F0dHJfcwlhdHRyOworfTsKKworc3RydWN0IGJmYV9ic2dfcW9zX3ZjX2F0dHJfcyB7CisJYmZhX3N0YXR1c190CXN0YXR1czsKKwl1MTYJCWJmYWRfbnVtOworCXUxNgkJcnN2ZDsKKwlzdHJ1Y3QgYmZhX3Fvc192Y19hdHRyX3MgYXR0cjsKK307CisKK3N0cnVjdCBiZmFfYnNnX3ZmX3N0YXRzX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXZmX2lkOworCXN0cnVjdCBiZmFfdmZfc3RhdHNfcwlzdGF0czsKK307CisKK3N0cnVjdCBiZmFfYnNnX3ZmX3Jlc2V0X3N0YXRzX3MgeworCWJmYV9zdGF0dXNfdAlzdGF0dXM7CisJdTE2CQliZmFkX251bTsKKwl1MTYJCXZmX2lkOworfTsKKworc3RydWN0IGJmYV9ic2dfZmNwaW1fbHVubWFza19xdWVyeV9zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJc3RydWN0IGJmYV9sdW5tYXNrX2NmZ19zIGx1bl9tYXNrOworfTsKKworc3RydWN0IGJmYV9ic2dfZmNwaW1fbHVubWFza19zIHsKKwliZmFfc3RhdHVzX3QJc3RhdHVzOworCXUxNgkJYmZhZF9udW07CisJdTE2CQl2Zl9pZDsKKwl3d25fdAkJcHd3bjsKKwl3d25fdAkJcnB3d247CisJc3RydWN0IHNjc2lfbHVuCWx1bjsKK307CisKIHN0cnVjdCBiZmFfYnNnX2ZjcHRfcyB7CiAJYmZhX3N0YXR1c190ICAgIHN0YXR1czsKIAl1MTYJCXZmX2lkOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2Rydi5oIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2Rydi5oCmluZGV4IDQ4NjYxYTIuLmJkYTk5OWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9kcnYuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfZHJ2LmgKQEAgLTU2LDcgKzU2LDcgQEAKICNpZmRlZiBCRkFfRFJJVkVSX1ZFUlNJT04KICNkZWZpbmUgQkZBRF9EUklWRVJfVkVSU0lPTiAgICBCRkFfRFJJVkVSX1ZFUlNJT04KICNlbHNlCi0jZGVmaW5lIEJGQURfRFJJVkVSX1ZFUlNJT04gICAgIjMuMC4yLjEiCisjZGVmaW5lIEJGQURfRFJJVkVSX1ZFUlNJT04gICAgIjMuMC4yLjIiCiAjZW5kaWYKIAogI2RlZmluZSBCRkFEX1BST1RPX05BTUUgRkNQSV9OQU1FCkBAIC0yMjQsNiArMjI0LDEwIEBACiAJY2hhciAqcmVnZGF0YTsKIAl1MzIgcmVnbGVuOwogCXN0cnVjdCBkZW50cnkgKmJmYWRfZGVudHJ5X2ZpbGVzWzVdOworCXN0cnVjdCBsaXN0X2hlYWQJZnJlZV9hZW5fcTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWFjdGl2ZV9hZW5fcTsKKwlzdHJ1Y3QgYmZhX2Flbl9lbnRyeV9zCWFlbl9saXN0W0JGQV9BRU5fTUFYX0VOVFJZXTsKKwlzcGlubG9ja190CQliZmFkX2Flbl9zcGlubG9jazsKIH07CiAKIC8qIEJGQUQgc3RhdGUgbWFjaGluZSBldmVudHMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9iZmEvYmZhZF9pbS5jIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltLmMKaW5kZXggZjJiZjgxMi4uMDEzMTIzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltLmMKKysrIGIvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltLmMKQEAgLTY1Niw2ICs2NTYsMzEgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2xvY2ssIGZsYWdzKTsKIH0KIAorc3RhdGljIHZvaWQgYmZhZF9hZW5faW1fbm90aWZ5X2hhbmRsZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBiZmFkX2ltX3MgKmltID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBiZmFkX2ltX3MsIGFlbl9pbV9ub3RpZnlfd29yayk7CisJc3RydWN0IGJmYV9hZW5fZW50cnlfcyAqYWVuX2VudHJ5OworCXN0cnVjdCBiZmFkX3MgKmJmYWQgPSBpbS0+YmZhZDsKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IGJmYWQtPnBwb3J0LmltX3BvcnQtPnNob3N0OworCXZvaWQgKmV2ZW50X2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmYmZhZC0+YWN0aXZlX2Flbl9xKSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmZhZC0+YmZhZF9hZW5fc3BpbmxvY2ssIGZsYWdzKTsKKwkJYmZhX3FfZGVxKCZiZmFkLT5hY3RpdmVfYWVuX3EsICZhZW5fZW50cnkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiZmFkLT5iZmFkX2Flbl9zcGlubG9jaywgZmxhZ3MpOworCQlldmVudF9kYXRhID0gKGNoYXIgKilhZW5fZW50cnkgKyBzaXplb2Yoc3RydWN0IGxpc3RfaGVhZCk7CisJCWZjX2hvc3RfcG9zdF92ZW5kb3JfZXZlbnQoc2hvc3QsIGZjX2dldF9ldmVudF9udW1iZXIoKSwKKwkJCQlzaXplb2Yoc3RydWN0IGJmYV9hZW5fZW50cnlfcykgLQorCQkJCXNpemVvZihzdHJ1Y3QgbGlzdF9oZWFkKSwKKwkJCQkoY2hhciAqKWV2ZW50X2RhdGEsIEJGQURfTkxfVkVORE9SX0lEKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmJmYWQtPmJmYWRfYWVuX3NwaW5sb2NrLCBmbGFncyk7CisJCWxpc3RfYWRkX3RhaWwoJmFlbl9lbnRyeS0+cWUsICZiZmFkLT5mcmVlX2Flbl9xKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmZhZC0+YmZhZF9hZW5fc3BpbmxvY2ssIGZsYWdzKTsKKwl9Cit9CisKIGJmYV9zdGF0dXNfdAogYmZhZF9pbV9wcm9iZShzdHJ1Y3QgYmZhZF9zICpiZmFkKQogewpAQCAtNjc2LDYgKzcwMSw3IEBACiAJCXJjID0gQkZBX1NUQVRVU19GQUlMRUQ7CiAJfQogCisJSU5JVF9XT1JLKCZpbS0+YWVuX2ltX25vdGlmeV93b3JrLCBiZmFkX2Flbl9pbV9ub3RpZnlfaGFuZGxlcik7CiBleHQ6CiAJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmFkX2ltLmggYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfaW0uaAppbmRleCA0ZmUzNGQ1Li4wMDRiNmNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfaW0uaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmYWRfaW0uaApAQCAtMTE1LDggKzExNSwzMCBAQAogCXN0cnVjdCBiZmFkX3MgICAgICAgICAqYmZhZDsKIAlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqZHJ2X3dvcmtxOwogCWNoYXIgICAgICAgICAgICBkcnZfd29ya3FfbmFtZVtLT0JKX05BTUVfTEVOXTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJYWVuX2ltX25vdGlmeV93b3JrOwogfTsKIAorI2RlZmluZSBiZmFkX2dldF9hZW5fZW50cnkoX2RydiwgX2VudHJ5KSBkbyB7CQkJCVwKKwl1bnNpZ25lZCBsb25nCV9mbGFnczsJCQkJCQlcCisJc3Bpbl9sb2NrX2lycXNhdmUoJihfZHJ2KS0+YmZhZF9hZW5fc3BpbmxvY2ssIF9mbGFncyk7CQlcCisJYmZhX3FfZGVxKCYoX2RydiktPmZyZWVfYWVuX3EsICYoX2VudHJ5KSk7CQkJXAorCWlmIChfZW50cnkpCQkJCQkJCVwKKwkJbGlzdF9hZGRfdGFpbCgmKF9lbnRyeSktPnFlLCAmKF9kcnYpLT5hY3RpdmVfYWVuX3EpOwlcCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKF9kcnYpLT5iZmFkX2Flbl9zcGlubG9jaywgX2ZsYWdzKTsJXAorfSB3aGlsZSAoMCkKKworLyogcG9zdCBmY19ob3N0IHZlbmRvciBldmVudCAqLworI2RlZmluZSBiZmFkX2ltX3Bvc3RfdmVuZG9yX2V2ZW50KF9lbnRyeSwgX2RydiwgX2NudCwgX2NhdCwgX2V2dCkgZG8gewkgICAgICBcCisJZG9fZ2V0dGltZW9mZGF5KCYoX2VudHJ5KS0+YWVuX3R2KTsJCQkJICAgICAgXAorCShfZW50cnkpLT5iZmFkX251bSA9IChfZHJ2KS0+aW5zdF9ubzsJCQkJICAgICAgXAorCShfZW50cnkpLT5zZXFfbnVtID0gKF9jbnQpOwkJCQkJICAgICAgXAorCShfZW50cnkpLT5hZW5fY2F0ZWdvcnkgPSAoX2NhdCk7CQkJCSAgICAgIFwKKwkoX2VudHJ5KS0+YWVuX3R5cGUgPSAoX2V2dCk7CQkJCQkgICAgICBcCisJaWYgKChfZHJ2KS0+YmZhZF9mbGFncyAmIEJGQURfRkM0X1BST0JFX0RPTkUpCQkJICAgICAgXAorCQlxdWV1ZV93b3JrKChfZHJ2KS0+aW0tPmRydl93b3JrcSwJCQkgICAgICBcCisJCQkgICAmKF9kcnYpLT5pbS0+YWVuX2ltX25vdGlmeV93b3JrKTsJCSAgICAgIFwKK30gd2hpbGUgKDApCisKIHN0cnVjdCBTY3NpX0hvc3QgKmJmYWRfc2NzaV9ob3N0X2FsbG9jKHN0cnVjdCBiZmFkX2ltX3BvcnRfcyAqaW1fcG9ydCwKIAkJCQlzdHJ1Y3QgYmZhZF9zICopOwogYmZhX3N0YXR1c190IGJmYWRfdGhyZWFkX3dvcmtxKHN0cnVjdCBiZmFkX3MgKmJmYWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JmYS9iZmkuaCBiL2RyaXZlcnMvc2NzaS9iZmEvYmZpLmgKaW5kZXggMWUyNThkNS4uYjJiYTBiMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JmYS9iZmkuaAorKysgYi9kcml2ZXJzL3Njc2kvYmZhL2JmaS5oCkBAIC03ODQsNiArNzg0LDE3IEBACiB9OwogCiAvKgorICoJU0ZQIHN0YXRlIGNoYW5nZSBub3RpZmljYXRpb24KKyAqLworc3RydWN0IGJmaV9zZnBfc2NuX3MgeworCXN0cnVjdCBiZmlfbWhkcl9zIG1ocjsJLyogaG9zdCBtc2cgaGVhZGVyICAgICAgICAqLworCXU4CWV2ZW50OworCXU4CXNmcGlkOworCXU4CXBvbWx2bDsJLyogcG9tIGxldmVsOiBub3JtYWwvd2FybmluZy9hbGFybSAqLworCXU4CWlzX2VsYjsJLyogZS1sb29wYmFjayAqLworfTsKKworLyoKICAqCVNGUCBzdGF0ZQogICovCiBlbnVtIGJmYV9zZnBfc3RhdF9lIHsKQEAgLTkyNiw2ICs5MzcsMTUgQEAKIH07CiAKIC8qCisgKiBGbGFzaCBldmVudCBub3RpZmljYXRpb24KKyAqLworc3RydWN0IGJmaV9mbGFzaF9ldmVudF9zIHsKKwlzdHJ1Y3QgYmZpX21oZHJfcwltaDsJLyogQ29tbW9uIG1zZyBoZWFkZXIgKi8KKwliZmFfc3RhdHVzX3QJCXN0YXR1czsKKwl1MzIJCQlwYXJhbTsKK307CisKKy8qCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqCQkJCURJQUcKICAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmMuaCBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjLmgKaW5kZXggZDkyNDIzNi4uNDIyMjhjYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmMuaAorKysgYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmYy5oCkBAIC0yLDcgKzIsNyBAQAogI2RlZmluZSBfQk5YMkZDX0hfCiAvKiBibngyZmMuaDogQnJvYWRjb20gTmV0WHRyZW1lIElJIExpbnV4IEZDb0Ugb2ZmbG9hZCBkcml2ZXIuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDA4IC0gMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDA4IC0gMjAxMSBCcm9hZGNvbSBDb3Jwb3JhdGlvbgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtNjIsNyArNjIsNyBAQAogI2luY2x1ZGUgImJueDJmY19jb25zdGFudHMuaCIKIAogI2RlZmluZSBCTlgyRkNfTkFNRQkJImJueDJmYyIKLSNkZWZpbmUgQk5YMkZDX1ZFUlNJT04JCSIxLjAuMyIKKyNkZWZpbmUgQk5YMkZDX1ZFUlNJT04JCSIxLjAuNCIKIAogI2RlZmluZSBQRlgJCQkiYm54MmZjOiAiCiAKQEAgLTE0MSw2ICsxNDEsMTAgQEAKIAogI2RlZmluZSBCTlgyRkNfUk5JRF9IQkEJCQkweDcKIAorI2RlZmluZSBTUlJfUkVUUllfQ09VTlQJCQk1CisjZGVmaW5lIFJFQ19SRVRSWV9DT1VOVAkJCTEKKyNkZWZpbmUgQk5YMkZDX05VTV9FUlJfQklUUwkJNjMKKwogLyogYm54MmZjIGRyaXZlciB1c2VzIG9ubHkgb25lIGluc3RhbmNlIG9mIGZjb2VfcGVyY3B1X3MgKi8KIGV4dGVybiBzdHJ1Y3QgZmNvZV9wZXJjcHVfcyBibngyZmNfZ2xvYmFsOwogCkBAIC0xNTMsMTggKzE1NywxMyBAQAogfTsKIAogc3RydWN0IGJueDJmY19oYmEgewotCXN0cnVjdCBsaXN0X2hlYWQgbGluazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJc3RydWN0IGNuaWNfZGV2ICpjbmljOwogCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXY7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqcGh5c19kZXY7CiAJdW5zaWduZWQgbG9uZyByZWdfd2l0aF9jbmljOwogCQkjZGVmaW5lIEJOWDJGQ19DTklDX1JFR0lTVEVSRUQgICAgICAgICAgIDEKLQlzdHJ1Y3QgcGFja2V0X3R5cGUgZmNvZV9wYWNrZXRfdHlwZTsKLQlzdHJ1Y3QgcGFja2V0X3R5cGUgZmlwX3BhY2tldF90eXBlOwogCXN0cnVjdCBibngyZmNfY21kX21nciAqY21kX21ncjsKLQlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqdGltZXJfd29ya19xdWV1ZTsKLQlzdHJ1Y3Qga3JlZiBrcmVmOwogCXNwaW5sb2NrX3QgaGJhX2xvY2s7CiAJc3RydWN0IG11dGV4IGhiYV9tdXRleDsKIAl1bnNpZ25lZCBsb25nIGFkYXB0ZXJfc3RhdGU7CkBAIC0xNzIsMTUgKzE3MSw5IEBACiAJCSNkZWZpbmUgQURBUFRFUl9TVEFURV9HT0lOR19ET1dOCTEKIAkJI2RlZmluZSBBREFQVEVSX1NUQVRFX0xJTktfRE9XTgkJMgogCQkjZGVmaW5lIEFEQVBURVJfU1RBVEVfUkVBRFkJCTMKLQl1MzIgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyBpbml0X2RvbmU7Ci0JCSNkZWZpbmUgQk5YMkZDX0ZXX0lOSVRfRE9ORQkJMAotCQkjZGVmaW5lIEJOWDJGQ19DVExSX0lOSVRfRE9ORQkJMQotCQkjZGVmaW5lIEJOWDJGQ19DUkVBVEVfRE9ORQkJMgotCXN0cnVjdCBmY29lX2N0bHIgY3RscjsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHZwb3J0czsKLQl1OCB2bGFuX2VuYWJsZWQ7Ci0JaW50IHZsYW5faWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJI2RlZmluZSBCTlgyRkNfRkxBR19GV19JTklUX0RPTkUJMAorCQkjZGVmaW5lIEJOWDJGQ19GTEFHX0RFU1RST1lfQ01QTAkxCiAJdTMyIG5leHRfY29ubl9pZDsKIAlzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqKnRhc2tfY3R4OwogCWRtYV9hZGRyX3QgKnRhc2tfY3R4X2RtYTsKQEAgLTE5OSwzOCArMTkyLDQxIEBACiAJY2hhciAqZHVtbXlfYnVmZmVyOwogCWRtYV9hZGRyX3QgZHVtbXlfYnVmX2RtYTsKIAorCS8qIEFjdGl2ZSBsaXN0IG9mIG9mZmxvYWRlZCBzZXNzaW9ucyAqLworCXN0cnVjdCBibngyZmNfcnBvcnQgKip0Z3Rfb2ZsZF9saXN0OworCisJLyogc3RhdGlzdGljcyAqLwogCXN0cnVjdCBmY29lX3N0YXRpc3RpY3NfcGFyYW1zICpzdGF0c19idWZmZXI7CiAJZG1hX2FkZHJfdCBzdGF0c19idWZfZG1hOwotCi0JLyoKLQkgKiBQQ0kgcmVsYXRlZCBpbmZvLgotCSAqLwotCXUxNiBwY2lfZGlkOwotCXUxNiBwY2lfdmlkOwotCXUxNiBwY2lfc2RpZDsKLQl1MTYgcGNpX3N2aWQ7Ci0JdTE2IHBjaV9mdW5jOwotCXUxNiBwY2lfZGV2bm87Ci0KLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmwyX3RocmVhZDsKLQotCS8qIGxpbmtkb3duIGhhbmRsaW5nICovCi0Jd2FpdF9xdWV1ZV9oZWFkX3Qgc2h1dGRvd25fd2FpdDsKLQlpbnQgd2FpdF9mb3JfbGlua19kb3duOworCXN0cnVjdCBjb21wbGV0aW9uIHN0YXRfcmVxX2RvbmU7CiAKIAkvKmRlc3Ryb3kgaGFuZGxpbmcgKi8KIAlzdHJ1Y3QgdGltZXJfbGlzdCBkZXN0cm95X3RpbWVyOwogCXdhaXRfcXVldWVfaGVhZF90IGRlc3Ryb3lfd2FpdDsKIAotCS8qIEFjdGl2ZSBsaXN0IG9mIG9mZmxvYWRlZCBzZXNzaW9ucyAqLwotCXN0cnVjdCBibngyZmNfcnBvcnQgKnRndF9vZmxkX2xpc3RbQk5YMkZDX05VTV9NQVhfU0VTU107CisJLyogbGlua2Rvd24gaGFuZGxpbmcgKi8KKwl3YWl0X3F1ZXVlX2hlYWRfdCBzaHV0ZG93bl93YWl0OworCWludCB3YWl0X2Zvcl9saW5rX2Rvd247CiAJaW50IG51bV9vZmxkX3Nlc3M7Ci0KLQkvKiBzdGF0aXN0aWNzICovCi0Jc3RydWN0IGNvbXBsZXRpb24gc3RhdF9yZXFfZG9uZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHZwb3J0czsKIH07CiAKLSNkZWZpbmUgYm54MmZjX2Zyb21fY3RscihmaXApIGNvbnRhaW5lcl9vZihmaXAsIHN0cnVjdCBibngyZmNfaGJhLCBjdGxyKQorc3RydWN0IGJueDJmY19pbnRlcmZhY2UgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1bnNpZ25lZCBsb25nIGlmX2ZsYWdzOworCQkjZGVmaW5lIEJOWDJGQ19DVExSX0lOSVRfRE9ORQkJMAorCXN0cnVjdCBibngyZmNfaGJhICpoYmE7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKwlzdHJ1Y3QgcGFja2V0X3R5cGUgZmNvZV9wYWNrZXRfdHlwZTsKKwlzdHJ1Y3QgcGFja2V0X3R5cGUgZmlwX3BhY2tldF90eXBlOworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp0aW1lcl93b3JrX3F1ZXVlOworCXN0cnVjdCBrcmVmIGtyZWY7CisJc3RydWN0IGZjb2VfY3RsciBjdGxyOworCXU4IHZsYW5fZW5hYmxlZDsKKwlpbnQgdmxhbl9pZDsKK307CisKKyNkZWZpbmUgYm54MmZjX2Zyb21fY3RscihmaXApIGNvbnRhaW5lcl9vZihmaXAsIHN0cnVjdCBibngyZmNfaW50ZXJmYWNlLCBjdGxyKQogCiBzdHJ1Y3QgYm54MmZjX2xwb3J0IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CkBAIC0yNTIsOSArMjQ4LDExIEBACiAJc3RydWN0IGZjX3Jwb3J0X3ByaXYgKnJkYXRhOwogCXZvaWQgX19pb21lbSAqY3R4X2Jhc2U7CiAjZGVmaW5lIERQTV9UUklHRVJfVFlQRQkJMHg0MAorCXUzMiBpb190aW1lb3V0OwogCXUzMiBmY29lX2Nvbm5faWQ7CiAJdTMyIGNvbnRleHRfaWQ7CiAJdTMyIHNpZDsKKwlpbnQgZGV2X3R5cGU7CiAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogI2RlZmluZSBCTlgyRkNfRkxBR19TRVNTSU9OX1JFQURZCTB4MQpAQCAtMjYyLDEwICsyNjAsOSBAQAogI2RlZmluZSBCTlgyRkNfRkxBR19ESVNBQkxFRAkJMHgzCiAjZGVmaW5lIEJOWDJGQ19GTEFHX0RFU1RST1lFRAkJMHg0CiAjZGVmaW5lIEJOWDJGQ19GTEFHX09GTERfUkVRX0NNUEwJMHg1Ci0jZGVmaW5lIEJOWDJGQ19GTEFHX0RFU1RST1lfQ01QTAkweDYKLSNkZWZpbmUgQk5YMkZDX0ZMQUdfQ1RYX0FMTE9DX0ZBSUxVUkUJMHg3Ci0jZGVmaW5lIEJOWDJGQ19GTEFHX1VQTERfUkVRX0NPTVBMCTB4OAotI2RlZmluZSBCTlgyRkNfRkxBR19FWFBMX0xPR08JCTB4OQorI2RlZmluZSBCTlgyRkNfRkxBR19DVFhfQUxMT0NfRkFJTFVSRQkweDYKKyNkZWZpbmUgQk5YMkZDX0ZMQUdfVVBMRF9SRVFfQ09NUEwJMHg3CisjZGVmaW5lIEJOWDJGQ19GTEFHX0VYUExfTE9HTwkJMHg4CiAKIAl1OCBzcmNfYWRkcltFVEhfQUxFTl07CiAJdTMyIG1heF9zcWVzOwpAQCAtMzI3LDEyICszMjQsOSBAQAogCXNwaW5sb2NrX3QgY3FfbG9jazsKIAlhdG9taWNfdCBudW1fYWN0aXZlX2lvczsKIAl1MzIgZmx1c2hfaW5fcHJvZzsKLQl1bnNpZ25lZCBsb25nIHdvcmtfdGltZV9zbGljZTsKIAl1bnNpZ25lZCBsb25nIHRpbWVzdGFtcDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfdGFza19saXN0OwogCXN0cnVjdCBibngyZmNfY21kICpwZW5kaW5nX3F1ZXVlW0JOWDJGQ19TUV9XUUVTX01BWCsxXTsKLQlhdG9taWNfdCBwaTsKLQlhdG9taWNfdCBjaTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGFjdGl2ZV9jbWRfcXVldWU7CiAJc3RydWN0IGxpc3RfaGVhZCBlbHNfcXVldWU7CiAJc3RydWN0IGxpc3RfaGVhZCBpb19yZXRpcmVfcXVldWU7CkBAIC0zNjcsNiArMzYxLDggQEAKIAlzdHJ1Y3QgYm54MmZjX2NtZCAqYWJvcnRlZF9pb19yZXE7CiAJc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcTsKIAl1MTYgbDJfb3hpZDsKKwl1MzIgb2Zmc2V0OworCWVudW0gZmNfcmN0bCByX2N0bDsKIH07CiAKIC8qIGJueDJmYyBjb21tYW5kIHN0cnVjdHVyZSAqLwpAQCAtMzgwLDYgKzM3Niw3IEBACiAjZGVmaW5lIEJOWDJGQ19BQlRTCQkJMwogI2RlZmluZSBCTlgyRkNfRUxTCQkJNAogI2RlZmluZSBCTlgyRkNfQ0xFQU5VUAkJCTUKKyNkZWZpbmUgQk5YMkZDX1NFUV9DTEVBTlVQCQk2CiAJdTggaW9fcmVxX2ZsYWdzOwogCXN0cnVjdCBrcmVmIHJlZmNvdW50OwogCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQ7CkBAIC0zOTMsNiArMzkwLDcgQEAKIAlzdHJ1Y3QgY29tcGxldGlvbiB0bV9kb25lOwogCWludCB3YWl0X2Zvcl9jb21wOwogCXUxNiB4aWQ7CisJc3RydWN0IGZjb2VfZXJyX3JlcG9ydF9lbnRyeSBlcnJfZW50cnk7CiAJc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKnRhc2s7CiAJc3RydWN0IGlvX2JkdCAqYmRfdGJsOwogCXN0cnVjdCBmY3BfcnNwICpyc3A7CkBAIC00MDksNiArNDA3LDEyIEBACiAjZGVmaW5lIEJOWDJGQ19GTEFHX0lPX0NPTVBMCQkweDkKICNkZWZpbmUgQk5YMkZDX0ZMQUdfRUxTX0RPTkUJCTB4YQogI2RlZmluZSBCTlgyRkNfRkxBR19FTFNfVElNRU9VVAkJMHhiCisjZGVmaW5lIEJOWDJGQ19GTEFHX0NNRF9MT1NUCQkweGMKKyNkZWZpbmUgQk5YMkZDX0ZMQUdfU1JSX1NFTlQJCTB4ZAorCXU4IHJlY19yZXRyeTsKKwl1OCBzcnJfcmV0cnk7CisJdTMyIHNycl9vZmZzZXQ7CisJdTggc3JyX3JjdGw7CiAJdTMyIGZjcF9yZXNpZDsKIAl1MzIgZmNwX3JzcF9sZW47CiAJdTMyIGZjcF9zbnNfbGVuOwpAQCAtNDM5LDYgKzQ0Myw3IEBACiAKIAogCitzdHJ1Y3QgYm54MmZjX2NtZCAqYm54MmZjX2NtZF9hbGxvYyhzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QpOwogc3RydWN0IGJueDJmY19jbWQgKmJueDJmY19lbHN0bV9hbGxvYyhzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QsIGludCB0eXBlKTsKIHZvaWQgYm54MmZjX2NtZF9yZWxlYXNlKHN0cnVjdCBrcmVmICpyZWYpOwogaW50IGJueDJmY19xdWV1ZWNvbW1hbmQoc3RydWN0IFNjc2lfSG9zdCAqaG9zdCwgc3RydWN0IHNjc2lfY21uZCAqc2NfY21kKTsKQEAgLTQ3Niw2ICs0ODEsMTAgQEAKIHZvaWQgYm54MmZjX2luaXRfY2xlYW51cF90YXNrKHN0cnVjdCBibngyZmNfY21kICppb19yZXEsCiAJCQkgICAgICBzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqdGFzaywKIAkJCSAgICAgIHUxNiBvcmlnX3hpZCk7Cit2b2lkIGJueDJmY19pbml0X3NlcV9jbGVhbnVwX3Rhc2soc3RydWN0IGJueDJmY19jbWQgKnNlcV9jbG51cF9yZXEsCisJCQkJICBzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqdGFzaywKKwkJCQkgIHN0cnVjdCBibngyZmNfY21kICpvcmlnX2lvX3JlcSwKKwkJCQkgIHUzMiBvZmZzZXQpOwogdm9pZCBibngyZmNfaW5pdF9tcF90YXNrKHN0cnVjdCBibngyZmNfY21kICppb19yZXEsCiAJCQkgc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKnRhc2spOwogdm9pZCBibngyZmNfaW5pdF90YXNrKHN0cnVjdCBibngyZmNfY21kICppb19yZXEsCkBAIC01MjUsNSArNTM0LDEzIEBACiAJCQkJICAgdW5zaWduZWQgY2hhciAqYnVmLAogCQkJCSAgIHUzMiBmcmFtZV9sZW4sIHUxNiBsMl9veGlkKTsKIGludCBibngyZmNfc2VuZF9zdGF0X3JlcShzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhKTsKK2ludCBibngyZmNfcG9zdF9pb19yZXEoc3RydWN0IGJueDJmY19ycG9ydCAqdGd0LCBzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxKTsKK2ludCBibngyZmNfc2VuZF9yZWMoc3RydWN0IGJueDJmY19jbWQgKm9yaWdfaW9fcmVxKTsKK2ludCBibngyZmNfc2VuZF9zcnIoc3RydWN0IGJueDJmY19jbWQgKm9yaWdfaW9fcmVxLCB1MzIgb2Zmc2V0LCB1OCByX2N0bCk7Cit2b2lkIGJueDJmY19wcm9jZXNzX3NlcV9jbGVhbnVwX2NvbXBsKHN0cnVjdCBibngyZmNfY21kICpzZXFfY2xudXBfcmVxLAorCQkJCSAgICAgIHN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICp0YXNrLAorCQkJCSAgICAgIHU4IHJ4X3N0YXRlKTsKK2ludCBibngyZmNfaW5pdGlhdGVfc2VxX2NsZWFudXAoc3RydWN0IGJueDJmY19jbWQgKm9yaWdfaW9fcmVxLCB1MzIgb2Zmc2V0LAorCQkJCWVudW0gZmNfcmN0bCByX2N0bCk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfZGVidWcuaCBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2RlYnVnLmgKaW5kZXggN2Y2YWZmNi4uMzQxNmQ5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfZGVidWcuaAorKysgYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19kZWJ1Zy5oCkBAIC0yMSwyMSArMjEsMjEgQEAKIAogI2RlZmluZSBCTlgyRkNfRUxTX0RCRyhmbXQsIGFyZy4uLikJCQkJCVwKIAlCTlgyRkNfQ0hLX0xPR0dJTkcoTE9HX0VMUywJCQkJCVwKLQkJCSAgIHByaW50ayhLRVJOX0FMRVJUIFBGWCBmbXQsICMjYXJnKSkKKwkJCSAgIHByaW50ayhLRVJOX0lORk8gUEZYIGZtdCwgIyNhcmcpKQogCiAjZGVmaW5lIEJOWDJGQ19NSVNDX0RCRyhmbXQsIGFyZy4uLikJCQkJCVwKIAlCTlgyRkNfQ0hLX0xPR0dJTkcoTE9HX01JU0MsCQkJCQlcCi0JCQkgICBwcmludGsoS0VSTl9BTEVSVCBQRlggZm10LCAjI2FyZykpCisJCQkgICBwcmludGsoS0VSTl9JTkZPIFBGWCBmbXQsICMjYXJnKSkKIAogI2RlZmluZSBCTlgyRkNfSU9fREJHKGlvX3JlcSwgZm10LCBhcmcuLi4pCQkJCVwKIAlkbyB7CQkJCQkJCQlcCiAJCWlmICghaW9fcmVxIHx8ICFpb19yZXEtPnBvcnQgfHwgIWlvX3JlcS0+cG9ydC0+bHBvcnQgfHwJXAogCQkgICAgIWlvX3JlcS0+cG9ydC0+bHBvcnQtPmhvc3QpCQkJCVwKIAkJCUJOWDJGQ19DSEtfTE9HR0lORyhMT0dfSU8sCQkJXAotCQkJICAgcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJOVUxMICIgZm10LCAjI2FyZykpOwlcCisJCQkgICBwcmludGsoS0VSTl9JTkZPIFBGWCAiTlVMTCAiIGZtdCwgIyNhcmcpKTsJXAogCQllbHNlCQkJCQkJCVwKIAkJCUJOWDJGQ19DSEtfTE9HR0lORyhMT0dfSU8sCQkJXAotCQkJICAgc2hvc3RfcHJpbnRrKEtFUk5fQUxFUlQsCQkJXAorCQkJICAgc2hvc3RfcHJpbnRrKEtFUk5fSU5GTywJCQlcCiAJCQkJICAgKGlvX3JlcSktPnBvcnQtPmxwb3J0LT5ob3N0LAkJXAogCQkJCSAgIFBGWCAieGlkOjB4JXggIiBmbXQsCQkJXAogCQkJCSAgIChpb19yZXEpLT54aWQsICMjYXJnKSk7CQlcCkBAIC00NiwxMCArNDYsMTAgQEAKIAkJaWYgKCF0Z3QgfHwgIXRndC0+cG9ydCB8fCAhdGd0LT5wb3J0LT5scG9ydCB8fAkJXAogCQkgICAgIXRndC0+cG9ydC0+bHBvcnQtPmhvc3QgfHwgIXRndC0+cnBvcnQpCQlcCiAJCQlCTlgyRkNfQ0hLX0xPR0dJTkcoTE9HX1RHVCwJCQlcCi0JCQkgICBwcmludGsoS0VSTl9BTEVSVCBQRlggIk5VTEwgIiBmbXQsICMjYXJnKSk7CVwKKwkJCSAgIHByaW50ayhLRVJOX0lORk8gUEZYICJOVUxMICIgZm10LCAjI2FyZykpOwlcCiAJCWVsc2UJCQkJCQkJXAogCQkJQk5YMkZDX0NIS19MT0dHSU5HKExPR19UR1QsCQkJXAotCQkJICAgc2hvc3RfcHJpbnRrKEtFUk5fQUxFUlQsCQkJXAorCQkJICAgc2hvc3RfcHJpbnRrKEtFUk5fSU5GTywJCQlcCiAJCQkJICAgKHRndCktPnBvcnQtPmxwb3J0LT5ob3N0LAkJXAogCQkJCSAgIFBGWCAicG9ydDoleCAiIGZtdCwJCQlcCiAJCQkJICAgKHRndCktPnJwb3J0LT5wb3J0X2lkLCAjI2FyZykpOwlcCkBAIC02MCwxMCArNjAsMTAgQEAKIAlkbyB7CQkJCQkJCQlcCiAJCWlmICghbHBvcnQgfHwgIWxwb3J0LT5ob3N0KQkJCQlcCiAJCQlCTlgyRkNfQ0hLX0xPR0dJTkcoTE9HX0hCQSwJCQlcCi0JCQkgICBwcmludGsoS0VSTl9BTEVSVCBQRlggIk5VTEwgIiBmbXQsICMjYXJnKSk7CVwKKwkJCSAgIHByaW50ayhLRVJOX0lORk8gUEZYICJOVUxMICIgZm10LCAjI2FyZykpOwlcCiAJCWVsc2UJCQkJCQkJXAogCQkJQk5YMkZDX0NIS19MT0dHSU5HKExPR19IQkEsCQkJXAotCQkJICAgc2hvc3RfcHJpbnRrKEtFUk5fQUxFUlQsIGxwb3J0LT5ob3N0LAlcCisJCQkgICBzaG9zdF9wcmludGsoS0VSTl9JTkZPLCBscG9ydC0+aG9zdCwJXAogCQkJCSAgIFBGWCBmbXQsICMjYXJnKSk7CQkJXAogCX0gd2hpbGUgKDApCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2Vscy5jIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfZWxzLmMKaW5kZXggN2U4OTE0My4uZDY2ZGNiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfZWxzLmMKKysrIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfZWxzLmMKQEAgLTMsNyArMyw3IEBACiAgKiBUaGlzIGZpbGUgY29udGFpbnMgaGVscGVyIHJvdXRpbmVzIHRoYXQgaGFuZGxlIEVMUyByZXF1ZXN0cwogICogYW5kIHJlc3BvbnNlcy4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggLSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggLSAyMDExIEJyb2FkY29tIENvcnBvcmF0aW9uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0yNTMsMTMgKzI1Myw0MTcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK3ZvaWQgYm54MmZjX3Nycl9jb21wbChzdHJ1Y3QgYm54MmZjX2Vsc19jYl9hcmcgKmNiX2FyZykKK3sKKwlzdHJ1Y3QgYm54MmZjX21wX3JlcSAqbXBfcmVxOworCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZjX2hkciwgKmZoOworCXN0cnVjdCBibngyZmNfY21kICpzcnJfcmVxOworCXN0cnVjdCBibngyZmNfY21kICpvcmlnX2lvX3JlcTsKKwlzdHJ1Y3QgZmNfZnJhbWUgKmZwOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwl2b2lkICpyZXNwX2J1ZjsKKwl1MzIgcmVzcF9sZW4sIGhkcl9sZW47CisJdTggb3Bjb2RlOworCWludCByYyA9IDA7CisKKwlvcmlnX2lvX3JlcSA9IGNiX2FyZy0+YWJvcnRlZF9pb19yZXE7CisJc3JyX3JlcSA9IGNiX2FyZy0+aW9fcmVxOworCWlmICh0ZXN0X2JpdChCTlgyRkNfRkxBR19JT19DT01QTCwgJm9yaWdfaW9fcmVxLT5yZXFfZmxhZ3MpKSB7CisJCUJOWDJGQ19JT19EQkcoc3JyX3JlcSwgInNycl9jb21wbDogeGlkIC0gMHgleCBjb21wbGV0ZWQiLAorCQkJb3JpZ19pb19yZXEtPnhpZCk7CisJCWdvdG8gc3JyX2NvbXBsX2RvbmU7CisJfQorCWlmICh0ZXN0X2JpdChCTlgyRkNfRkxBR19JU1NVRV9BQlRTLCAmb3JpZ19pb19yZXEtPnJlcV9mbGFncykpIHsKKwkJQk5YMkZDX0lPX0RCRyhzcnJfcmVxLCAicmVjIGFidHMgaW4gcHJvZyAiCisJCSAgICAgICAib3JpZ19pbyAtIDB4JXhcbiIsCisJCQlvcmlnX2lvX3JlcS0+eGlkKTsKKwkJZ290byBzcnJfY29tcGxfZG9uZTsKKwl9CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChCTlgyRkNfRkxBR19FTFNfVElNRU9VVCwgJnNycl9yZXEtPnJlcV9mbGFncykpIHsKKwkJLyogU1JSIHRpbWVkb3V0ICovCisJCUJOWDJGQ19JT19EQkcoc3JyX3JlcSwgInNyciB0aW1lZCBvdXQsIGFib3J0ICIKKwkJICAgICAgICJvcmlnX2lvIC0gMHgleFxuIiwKKwkJCW9yaWdfaW9fcmVxLT54aWQpOworCQlyYyA9IGJueDJmY19pbml0aWF0ZV9hYnRzKHNycl9yZXEpOworCQlpZiAocmMgIT0gU1VDQ0VTUykgeworCQkJQk5YMkZDX0lPX0RCRyhzcnJfcmVxLCAic3JyX2NvbXBsOiBpbml0aWF0ZV9hYnRzICIKKwkJCQkiZmFpbGVkLiBpc3N1ZSBjbGVhbnVwXG4iKTsKKwkJCWJueDJmY19pbml0aWF0ZV9jbGVhbnVwKHNycl9yZXEpOworCQl9CisJCW9yaWdfaW9fcmVxLT5zcnJfcmV0cnkrKzsKKwkJaWYgKG9yaWdfaW9fcmVxLT5zcnJfcmV0cnkgPD0gU1JSX1JFVFJZX0NPVU5UKSB7CisJCQlzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QgPSBvcmlnX2lvX3JlcS0+dGd0OworCQkJc3Bpbl91bmxvY2tfYmgoJnRndC0+dGd0X2xvY2spOworCQkJcmMgPSBibngyZmNfc2VuZF9zcnIob3JpZ19pb19yZXEsCisJCQkJCSAgICAgb3JpZ19pb19yZXEtPnNycl9vZmZzZXQsCisJCQkJCSAgICAgb3JpZ19pb19yZXEtPnNycl9yY3RsKTsKKwkJCXNwaW5fbG9ja19iaCgmdGd0LT50Z3RfbG9jayk7CisJCQlpZiAoIXJjKQorCQkJCWdvdG8gc3JyX2NvbXBsX2RvbmU7CisJCX0KKworCQlyYyA9IGJueDJmY19pbml0aWF0ZV9hYnRzKG9yaWdfaW9fcmVxKTsKKwkJaWYgKHJjICE9IFNVQ0NFU1MpIHsKKwkJCUJOWDJGQ19JT19EQkcoc3JyX3JlcSwgInNycl9jb21wbDogaW5pdGlhdGVfYWJ0cyAiCisJCQkJImZhaWxlZCB4aWQgPSAweCV4LiBpc3N1ZSBjbGVhbnVwXG4iLAorCQkJCW9yaWdfaW9fcmVxLT54aWQpOworCQkJYm54MmZjX2luaXRpYXRlX2NsZWFudXAob3JpZ19pb19yZXEpOworCQl9CisJCWdvdG8gc3JyX2NvbXBsX2RvbmU7CisJfQorCW1wX3JlcSA9ICYoc3JyX3JlcS0+bXBfcmVxKTsKKwlmY19oZHIgPSAmKG1wX3JlcS0+cmVzcF9mY19oZHIpOworCXJlc3BfbGVuID0gbXBfcmVxLT5yZXNwX2xlbjsKKwlyZXNwX2J1ZiA9IG1wX3JlcS0+cmVzcF9idWY7CisKKwloZHJfbGVuID0gc2l6ZW9mKCpmY19oZHIpOworCWJ1ZiA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWJ1ZikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJzcnIgYnVmOiBtZW0gYWxsb2MgZmFpbHVyZVxuIik7CisJCWdvdG8gc3JyX2NvbXBsX2RvbmU7CisJfQorCW1lbWNweShidWYsIGZjX2hkciwgaGRyX2xlbik7CisJbWVtY3B5KGJ1ZiArIGhkcl9sZW4sIHJlc3BfYnVmLCByZXNwX2xlbik7CisKKwlmcCA9IGZjX2ZyYW1lX2FsbG9jKE5VTEwsIHJlc3BfbGVuKTsKKwlpZiAoIWZwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImZjX2ZyYW1lX2FsbG9jIGZhaWx1cmVcbiIpOworCQlnb3RvIGZyZWVfYnVmOworCX0KKworCWZoID0gKHN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKikgZmNfZnJhbWVfaGVhZGVyX2dldChmcCk7CisJLyogQ29weSBGQyBGcmFtZSBoZWFkZXIgYW5kIHBheWxvYWQgaW50byB0aGUgZnJhbWUgKi8KKwltZW1jcHkoZmgsIGJ1ZiwgaGRyX2xlbiArIHJlc3BfbGVuKTsKKworCW9wY29kZSA9IGZjX2ZyYW1lX3BheWxvYWRfb3AoZnApOworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSBFTFNfTFNfQUNDOgorCQlCTlgyRkNfSU9fREJHKHNycl9yZXEsICJTUlIgc3VjY2Vzc1xuIik7CisJCWJyZWFrOworCWNhc2UgRUxTX0xTX1JKVDoKKwkJQk5YMkZDX0lPX0RCRyhzcnJfcmVxLCAiU1JSIHJlamVjdGVkXG4iKTsKKwkJcmMgPSBibngyZmNfaW5pdGlhdGVfYWJ0cyhvcmlnX2lvX3JlcSk7CisJCWlmIChyYyAhPSBTVUNDRVNTKSB7CisJCQlCTlgyRkNfSU9fREJHKHNycl9yZXEsICJzcnJfY29tcGw6IGluaXRpYXRlX2FidHMgIgorCQkJCSJmYWlsZWQgeGlkID0gMHgleC4gaXNzdWUgY2xlYW51cFxuIiwKKwkJCQlvcmlnX2lvX3JlcS0+eGlkKTsKKwkJCWJueDJmY19pbml0aWF0ZV9jbGVhbnVwKG9yaWdfaW9fcmVxKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlCTlgyRkNfSU9fREJHKHNycl9yZXEsICJzcnIgY29tcGwgLSBpbnZhbGlkIG9wY29kZSA9ICVkXG4iLAorCQkJb3Bjb2RlKTsKKwkJYnJlYWs7CisJfQorCWZjX2ZyYW1lX2ZyZWUoZnApOworZnJlZV9idWY6CisJa2ZyZWUoYnVmKTsKK3Nycl9jb21wbF9kb25lOgorCWtyZWZfcHV0KCZvcmlnX2lvX3JlcS0+cmVmY291bnQsIGJueDJmY19jbWRfcmVsZWFzZSk7Cit9CisKK3ZvaWQgYm54MmZjX3JlY19jb21wbChzdHJ1Y3QgYm54MmZjX2Vsc19jYl9hcmcgKmNiX2FyZykKK3sKKwlzdHJ1Y3QgYm54MmZjX2NtZCAqb3JpZ19pb19yZXEsICpuZXdfaW9fcmVxOworCXN0cnVjdCBibngyZmNfY21kICpyZWNfcmVxOworCXN0cnVjdCBibngyZmNfbXBfcmVxICptcF9yZXE7CisJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmNfaGRyLCAqZmg7CisJc3RydWN0IGZjX2Vsc19sc19yanQgKnJqdDsKKwlzdHJ1Y3QgZmNfZWxzX3JlY19hY2MgKmFjYzsKKwlzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3Q7CisJc3RydWN0IGZjb2VfZXJyX3JlcG9ydF9lbnRyeSAqZXJyX2VudHJ5OworCXN0cnVjdCBzY3NpX2NtbmQgKnNjX2NtZDsKKwllbnVtIGZjX3JjdGwgcl9jdGw7CisJdW5zaWduZWQgY2hhciAqYnVmOworCXZvaWQgKnJlc3BfYnVmOworCXN0cnVjdCBmY19mcmFtZSAqZnA7CisJdTggb3Bjb2RlOworCXUzMiBvZmZzZXQ7CisJdTMyIGVfc3RhdDsKKwl1MzIgcmVzcF9sZW4sIGhkcl9sZW47CisJaW50IHJjID0gMDsKKwlib29sIHNlbmRfc2VxX2NsbnAgPSBmYWxzZTsKKwlib29sIGFib3J0X2lvID0gZmFsc2U7CisKKwlCTlgyRkNfTUlTQ19EQkcoIkVudGVyZWQgcmVjX2NvbXBsIGNhbGxiYWNrXG4iKTsKKwlyZWNfcmVxID0gY2JfYXJnLT5pb19yZXE7CisJb3JpZ19pb19yZXEgPSBjYl9hcmctPmFib3J0ZWRfaW9fcmVxOworCUJOWDJGQ19JT19EQkcocmVjX3JlcSwgInJlY19jb21wbDogb3JpZyB4aWQgPSAweCV4Iiwgb3JpZ19pb19yZXEtPnhpZCk7CisJdGd0ID0gb3JpZ19pb19yZXEtPnRndDsKKworCWlmICh0ZXN0X2JpdChCTlgyRkNfRkxBR19JT19DT01QTCwgJm9yaWdfaW9fcmVxLT5yZXFfZmxhZ3MpKSB7CisJCUJOWDJGQ19JT19EQkcocmVjX3JlcSwgImNvbXBsZXRlZCIKKwkJICAgICAgICJvcmlnX2lvIC0gMHgleFxuIiwKKwkJCW9yaWdfaW9fcmVxLT54aWQpOworCQlnb3RvIHJlY19jb21wbF9kb25lOworCX0KKwlpZiAodGVzdF9iaXQoQk5YMkZDX0ZMQUdfSVNTVUVfQUJUUywgJm9yaWdfaW9fcmVxLT5yZXFfZmxhZ3MpKSB7CisJCUJOWDJGQ19JT19EQkcocmVjX3JlcSwgImFidHMgaW4gcHJvZyAiCisJCSAgICAgICAib3JpZ19pbyAtIDB4JXhcbiIsCisJCQlvcmlnX2lvX3JlcS0+eGlkKTsKKwkJZ290byByZWNfY29tcGxfZG9uZTsKKwl9CisJLyogSGFuZGxlIFJFQyB0aW1lb3V0IGNhc2UgKi8KKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEJOWDJGQ19GTEFHX0VMU19USU1FT1VULCAmcmVjX3JlcS0+cmVxX2ZsYWdzKSkgeworCQlCTlgyRkNfSU9fREJHKHJlY19yZXEsICJ0aW1lZCBvdXQsIGFib3J0ICIKKwkJICAgICAgICJvcmlnX2lvIC0gMHgleFxuIiwKKwkJCW9yaWdfaW9fcmVxLT54aWQpOworCQkvKiBlbHMgcmVxIGlzIHRpbWVkIG91dC4gc2VuZCBhYnRzIGZvciBlbHMgKi8KKwkJcmMgPSBibngyZmNfaW5pdGlhdGVfYWJ0cyhyZWNfcmVxKTsKKwkJaWYgKHJjICE9IFNVQ0NFU1MpIHsKKwkJCUJOWDJGQ19JT19EQkcocmVjX3JlcSwgInJlY19jb21wbDogaW5pdGlhdGVfYWJ0cyAiCisJCQkJImZhaWxlZC4gaXNzdWUgY2xlYW51cFxuIik7CisJCQlibngyZmNfaW5pdGlhdGVfY2xlYW51cChyZWNfcmVxKTsKKwkJfQorCQlvcmlnX2lvX3JlcS0+cmVjX3JldHJ5Kys7CisJCS8qIFJFQyB0aW1lZG91dC4gc2VuZCBBQlRTIHRvIHRoZSBvcmlnIElPIHJlcSAqLworCQlpZiAob3JpZ19pb19yZXEtPnJlY19yZXRyeSA8PSBSRUNfUkVUUllfQ09VTlQpIHsKKwkJCXNwaW5fdW5sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKKwkJCXJjID0gYm54MmZjX3NlbmRfcmVjKG9yaWdfaW9fcmVxKTsKKwkJCXNwaW5fbG9ja19iaCgmdGd0LT50Z3RfbG9jayk7CisJCQlpZiAoIXJjKQorCQkJCWdvdG8gcmVjX2NvbXBsX2RvbmU7CisJCX0KKwkJcmMgPSBibngyZmNfaW5pdGlhdGVfYWJ0cyhvcmlnX2lvX3JlcSk7CisJCWlmIChyYyAhPSBTVUNDRVNTKSB7CisJCQlCTlgyRkNfSU9fREJHKHJlY19yZXEsICJyZWNfY29tcGw6IGluaXRpYXRlX2FidHMgIgorCQkJCSJmYWlsZWQgeGlkID0gMHgleC4gaXNzdWUgY2xlYW51cFxuIiwKKwkJCQlvcmlnX2lvX3JlcS0+eGlkKTsKKwkJCWJueDJmY19pbml0aWF0ZV9jbGVhbnVwKG9yaWdfaW9fcmVxKTsKKwkJfQorCQlnb3RvIHJlY19jb21wbF9kb25lOworCX0KKwltcF9yZXEgPSAmKHJlY19yZXEtPm1wX3JlcSk7CisJZmNfaGRyID0gJihtcF9yZXEtPnJlc3BfZmNfaGRyKTsKKwlyZXNwX2xlbiA9IG1wX3JlcS0+cmVzcF9sZW47CisJYWNjID0gcmVzcF9idWYgPSBtcF9yZXEtPnJlc3BfYnVmOworCisJaGRyX2xlbiA9IHNpemVvZigqZmNfaGRyKTsKKworCWJ1ZiA9IGt6YWxsb2MoUEFHRV9TSVpFLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWJ1ZikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJyZWMgYnVmOiBtZW0gYWxsb2MgZmFpbHVyZVxuIik7CisJCWdvdG8gcmVjX2NvbXBsX2RvbmU7CisJfQorCW1lbWNweShidWYsIGZjX2hkciwgaGRyX2xlbik7CisJbWVtY3B5KGJ1ZiArIGhkcl9sZW4sIHJlc3BfYnVmLCByZXNwX2xlbik7CisKKwlmcCA9IGZjX2ZyYW1lX2FsbG9jKE5VTEwsIHJlc3BfbGVuKTsKKwlpZiAoIWZwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImZjX2ZyYW1lX2FsbG9jIGZhaWx1cmVcbiIpOworCQlnb3RvIGZyZWVfYnVmOworCX0KKworCWZoID0gKHN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKikgZmNfZnJhbWVfaGVhZGVyX2dldChmcCk7CisJLyogQ29weSBGQyBGcmFtZSBoZWFkZXIgYW5kIHBheWxvYWQgaW50byB0aGUgZnJhbWUgKi8KKwltZW1jcHkoZmgsIGJ1ZiwgaGRyX2xlbiArIHJlc3BfbGVuKTsKKworCW9wY29kZSA9IGZjX2ZyYW1lX3BheWxvYWRfb3AoZnApOworCWlmIChvcGNvZGUgPT0gRUxTX0xTX1JKVCkgeworCQlCTlgyRkNfSU9fREJHKHJlY19yZXEsICJvcGNvZGUgaXMgUkpUXG4iKTsKKwkJcmp0ID0gZmNfZnJhbWVfcGF5bG9hZF9nZXQoZnAsIHNpemVvZigqcmp0KSk7CisJCWlmICgocmp0LT5lcl9yZWFzb24gPT0gRUxTX1JKVF9MT0dJQyB8fAorCQkgICAgcmp0LT5lcl9yZWFzb24gPT0gRUxTX1JKVF9VTkFCKSAmJgorCQkgICAgcmp0LT5lcl9leHBsYW4gPT0gRUxTX0VYUExfT1hJRF9SWElEKSB7CisJCQlCTlgyRkNfSU9fREJHKHJlY19yZXEsICJoYW5kbGUgQ01EIExPU1QgY2FzZVxuIik7CisJCQluZXdfaW9fcmVxID0gYm54MmZjX2NtZF9hbGxvYyh0Z3QpOworCQkJaWYgKCFuZXdfaW9fcmVxKQorCQkJCWdvdG8gYWJvcnRfaW87CisJCQluZXdfaW9fcmVxLT5zY19jbWQgPSBvcmlnX2lvX3JlcS0+c2NfY21kOworCQkJLyogY2xlYW51cCBvcmlnX2lvX3JlcSB0aGF0IGlzIHdpdGggdGhlIEZXICovCisJCQlzZXRfYml0KEJOWDJGQ19GTEFHX0NNRF9MT1NULAorCQkJCSZvcmlnX2lvX3JlcS0+cmVxX2ZsYWdzKTsKKwkJCWJueDJmY19pbml0aWF0ZV9jbGVhbnVwKG9yaWdfaW9fcmVxKTsKKwkJCS8qIFBvc3QgYSBuZXcgSU8gcmVxIHdpdGggdGhlIHNhbWUgc2NfY21kICovCisJCQlCTlgyRkNfSU9fREJHKHJlY19yZXEsICJQb3N0IElPIHJlcXVlc3QgYWdhaW5cbiIpOworCQkJc3Bpbl91bmxvY2tfYmgoJnRndC0+dGd0X2xvY2spOworCQkJcmMgPSBibngyZmNfcG9zdF9pb19yZXEodGd0LCBuZXdfaW9fcmVxKTsKKwkJCXNwaW5fbG9ja19iaCgmdGd0LT50Z3RfbG9jayk7CisJCQlpZiAoIXJjKQorCQkJCWdvdG8gZnJlZV9mcmFtZTsKKwkJCUJOWDJGQ19JT19EQkcocmVjX3JlcSwgIlJFQzogaW8gcG9zdCBlcnJcbiIpOworCQl9CithYm9ydF9pbzoKKwkJcmMgPSBibngyZmNfaW5pdGlhdGVfYWJ0cyhvcmlnX2lvX3JlcSk7CisJCWlmIChyYyAhPSBTVUNDRVNTKSB7CisJCQlCTlgyRkNfSU9fREJHKHJlY19yZXEsICJyZWNfY29tcGw6IGluaXRpYXRlX2FidHMgIgorCQkJCSJmYWlsZWQuIGlzc3VlIGNsZWFudXBcbiIpOworCQkJYm54MmZjX2luaXRpYXRlX2NsZWFudXAob3JpZ19pb19yZXEpOworCQl9CisJfSBlbHNlIGlmIChvcGNvZGUgPT0gRUxTX0xTX0FDQykgeworCQkvKiBSRVZJU0lUOiBDaGVjayBpZiB0aGUgZXhjaGFuZ2UgaXMgYWxyZWFkeSBhYm9ydGVkICovCisJCW9mZnNldCA9IG50b2hsKGFjYy0+cmVjYV9mYzR2YWx1ZSk7CisJCWVfc3RhdCA9IG50b2hsKGFjYy0+cmVjYV9lX3N0YXQpOworCQlpZiAoZV9zdGF0ICYgRVNCX1NUX1NFUV9JTklUKSAgeworCQkJQk5YMkZDX0lPX0RCRyhyZWNfcmVxLCAidGFyZ2V0IGhhcyB0aGUgc2VxIGluaXRcbiIpOworCQkJZ290byBmcmVlX2ZyYW1lOworCQl9CisJCUJOWDJGQ19JT19EQkcocmVjX3JlcSwgImVfc3RhdCA9IDB4JXgsIG9mZnNldCA9IDB4JXhcbiIsCisJCQllX3N0YXQsIG9mZnNldCk7CisJCS8qIFNlcSBpbml0aWF0aXZlIGlzIHdpdGggdXMgKi8KKwkJZXJyX2VudHJ5ID0gKHN0cnVjdCBmY29lX2Vycl9yZXBvcnRfZW50cnkgKikKKwkJCSAgICAgJm9yaWdfaW9fcmVxLT5lcnJfZW50cnk7CisJCXNjX2NtZCA9IG9yaWdfaW9fcmVxLT5zY19jbWQ7CisJCWlmIChzY19jbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9UT19ERVZJQ0UpIHsKKwkJCS8qIFNDU0kgV1JJVEUgY29tbWFuZCAqLworCQkJaWYgKG9mZnNldCA9PSBvcmlnX2lvX3JlcS0+ZGF0YV94ZmVyX2xlbikgeworCQkJCUJOWDJGQ19JT19EQkcocmVjX3JlcSwgIldSSVRFIC0gcmVzcCBsb3N0XG4iKTsKKwkJCQkvKiBGQ1BfUlNQIGxvc3QgKi8KKwkJCQlyX2N0bCA9IEZDX1JDVExfRERfQ01EX1NUQVRVUzsKKwkJCQlvZmZzZXQgPSAwOworCQkJfSBlbHNlICB7CisJCQkJLyogc3RhcnQgdHJhbnNtaXR0aW5nIGZyb20gb2Zmc2V0ICovCisJCQkJQk5YMkZDX0lPX0RCRyhyZWNfcmVxLCAiWEZFUl9SRFkvREFUQSBsb3N0XG4iKTsKKwkJCQlzZW5kX3NlcV9jbG5wID0gdHJ1ZTsKKwkJCQlyX2N0bCA9IEZDX1JDVExfRERfREFUQV9ERVNDOworCQkJCWlmIChibngyZmNfaW5pdGlhdGVfc2VxX2NsZWFudXAob3JpZ19pb19yZXEsCisJCQkJCQkJCW9mZnNldCwgcl9jdGwpKQorCQkJCQlhYm9ydF9pbyA9IHRydWU7CisJCQkJLyogWEZFUl9SRFkgKi8KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIFNDU0kgUkVBRCBjb21tYW5kICovCisJCQlpZiAoZXJyX2VudHJ5LT5kYXRhLnJ4X2J1Zl9vZmYgPT0KKwkJCQkJb3JpZ19pb19yZXEtPmRhdGFfeGZlcl9sZW4pIHsKKwkJCQkvKiBGQ1BfUlNQIGxvc3QgKi8KKwkJCQlCTlgyRkNfSU9fREJHKHJlY19yZXEsICJSRUFEIC0gcmVzcCBsb3N0XG4iKTsKKwkJCQlyX2N0bCA9IEZDX1JDVExfRERfQ01EX1NUQVRVUzsKKwkJCQlvZmZzZXQgPSAwOworCQkJfSBlbHNlICB7CisJCQkJLyogcmVxdWVzdCByZXRyYW5zbWlzc2lvbiBmcm9tIHRoaXMgb2Zmc2V0ICovCisJCQkJc2VuZF9zZXFfY2xucCA9IHRydWU7CisJCQkJb2Zmc2V0ID0gZXJyX2VudHJ5LT5kYXRhLnJ4X2J1Zl9vZmY7CisJCQkJQk5YMkZDX0lPX0RCRyhyZWNfcmVxLCAiUkQgREFUQSBsb3N0XG4iKTsKKwkJCQkvKiBGQ1BfREFUQSBsb3N0ICovCisJCQkJcl9jdGwgPSBGQ19SQ1RMX0REX1NPTF9EQVRBOworCQkJCWlmIChibngyZmNfaW5pdGlhdGVfc2VxX2NsZWFudXAob3JpZ19pb19yZXEsCisJCQkJCQkJCW9mZnNldCwgcl9jdGwpKQorCQkJCQlhYm9ydF9pbyA9IHRydWU7CisJCQl9CisJCX0KKwkJaWYgKGFib3J0X2lvKSB7CisJCQlyYyA9IGJueDJmY19pbml0aWF0ZV9hYnRzKG9yaWdfaW9fcmVxKTsKKwkJCWlmIChyYyAhPSBTVUNDRVNTKSB7CisJCQkJQk5YMkZDX0lPX0RCRyhyZWNfcmVxLCAicmVjX2NvbXBsOmluaXRpYXRlX2FidHMiCisJCQkJCSAgICAgICIgZmFpbGVkLiBpc3N1ZSBjbGVhbnVwXG4iKTsKKwkJCQlibngyZmNfaW5pdGlhdGVfY2xlYW51cChvcmlnX2lvX3JlcSk7CisJCQl9CisJCX0gZWxzZSBpZiAoIXNlbmRfc2VxX2NsbnApIHsKKwkJCUJOWDJGQ19JT19EQkcocmVjX3JlcSwgIlNlbmQgU1JSIC0gRkNQX1JTUFxuIik7CisJCQlzcGluX3VubG9ja19iaCgmdGd0LT50Z3RfbG9jayk7CisJCQlyYyA9IGJueDJmY19zZW5kX3NycihvcmlnX2lvX3JlcSwgb2Zmc2V0LCByX2N0bCk7CisJCQlzcGluX2xvY2tfYmgoJnRndC0+dGd0X2xvY2spOworCisJCQlpZiAocmMpIHsKKwkJCQlCTlgyRkNfSU9fREJHKHJlY19yZXEsICJVbmFibGUgdG8gc2VuZCBTUlIiCisJCQkJCSIgSU8gd2lsbCBhYm9ydFxuIik7CisJCQl9CisJCX0KKwl9CitmcmVlX2ZyYW1lOgorCWZjX2ZyYW1lX2ZyZWUoZnApOworZnJlZV9idWY6CisJa2ZyZWUoYnVmKTsKK3JlY19jb21wbF9kb25lOgorCWtyZWZfcHV0KCZvcmlnX2lvX3JlcS0+cmVmY291bnQsIGJueDJmY19jbWRfcmVsZWFzZSk7CisJa2ZyZWUoY2JfYXJnKTsKK30KKworaW50IGJueDJmY19zZW5kX3JlYyhzdHJ1Y3QgYm54MmZjX2NtZCAqb3JpZ19pb19yZXEpCit7CisJc3RydWN0IGZjX2Vsc19yZWMgcmVjOworCXN0cnVjdCBibngyZmNfcnBvcnQgKnRndCA9IG9yaWdfaW9fcmVxLT50Z3Q7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IHRndC0+cmRhdGEtPmxvY2FsX3BvcnQ7CisJc3RydWN0IGJueDJmY19lbHNfY2JfYXJnICpjYl9hcmcgPSBOVUxMOworCXUzMiBzaWQgPSB0Z3QtPnNpZDsKKwl1MzIgcl9hX3RvdiA9IGxwb3J0LT5yX2FfdG92OworCWludCByYzsKKworCUJOWDJGQ19JT19EQkcob3JpZ19pb19yZXEsICJTZW5kaW5nIFJFQ1xuIik7CisJbWVtc2V0KCZyZWMsIDAsIHNpemVvZihyZWMpKTsKKworCWNiX2FyZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBibngyZmNfZWxzX2NiX2FyZyksIEdGUF9BVE9NSUMpOworCWlmICghY2JfYXJnKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byBhbGxvY2F0ZSBjYl9hcmcgZm9yIFJFQ1xuIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byByZWNfZXJyOworCX0KKwlrcmVmX2dldCgmb3JpZ19pb19yZXEtPnJlZmNvdW50KTsKKworCWNiX2FyZy0+YWJvcnRlZF9pb19yZXEgPSBvcmlnX2lvX3JlcTsKKworCXJlYy5yZWNfY21kID0gRUxTX1JFQzsKKwlodG9uMjQocmVjLnJlY19zX2lkLCBzaWQpOworCXJlYy5yZWNfb3hfaWQgPSBodG9ucyhvcmlnX2lvX3JlcS0+eGlkKTsKKwlyZWMucmVjX3J4X2lkID0gaHRvbnMob3JpZ19pb19yZXEtPnRhc2stPnJ4d3JfdHhyZC52YXJfY3R4LnJ4X2lkKTsKKworCXJjID0gYm54MmZjX2luaXRpYXRlX2Vscyh0Z3QsIEVMU19SRUMsICZyZWMsIHNpemVvZihyZWMpLAorCQkJCSBibngyZmNfcmVjX2NvbXBsLCBjYl9hcmcsCisJCQkJIHJfYV90b3YpOworcmVjX2VycjoKKwlpZiAocmMpIHsKKwkJQk5YMkZDX0lPX0RCRyhvcmlnX2lvX3JlcSwgIlJFQyBmYWlsZWQgLSByZWxlYXNlXG4iKTsKKwkJc3Bpbl9sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKKwkJa3JlZl9wdXQoJm9yaWdfaW9fcmVxLT5yZWZjb3VudCwgYm54MmZjX2NtZF9yZWxlYXNlKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnRndC0+dGd0X2xvY2spOworCQlrZnJlZShjYl9hcmcpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK2ludCBibngyZmNfc2VuZF9zcnIoc3RydWN0IGJueDJmY19jbWQgKm9yaWdfaW9fcmVxLCB1MzIgb2Zmc2V0LCB1OCByX2N0bCkKK3sKKwlzdHJ1Y3QgZmNwX3NyciBzcnI7CisJc3RydWN0IGJueDJmY19ycG9ydCAqdGd0ID0gb3JpZ19pb19yZXEtPnRndDsKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gdGd0LT5yZGF0YS0+bG9jYWxfcG9ydDsKKwlzdHJ1Y3QgYm54MmZjX2Vsc19jYl9hcmcgKmNiX2FyZyA9IE5VTEw7CisJdTMyIHJfYV90b3YgPSBscG9ydC0+cl9hX3RvdjsKKwlpbnQgcmM7CisKKwlCTlgyRkNfSU9fREJHKG9yaWdfaW9fcmVxLCAiU2VuZGluZyBTUlJcbiIpOworCW1lbXNldCgmc3JyLCAwLCBzaXplb2Yoc3JyKSk7CisKKwljYl9hcmcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYm54MmZjX2Vsc19jYl9hcmcpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWNiX2FyZykgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gYWxsb2NhdGUgY2JfYXJnIGZvciBTUlJcbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gc3JyX2VycjsKKwl9CisJa3JlZl9nZXQoJm9yaWdfaW9fcmVxLT5yZWZjb3VudCk7CisKKwljYl9hcmctPmFib3J0ZWRfaW9fcmVxID0gb3JpZ19pb19yZXE7CisKKwlzcnIuc3JyX29wID0gRUxTX1NSUjsKKwlzcnIuc3JyX294X2lkID0gaHRvbnMob3JpZ19pb19yZXEtPnhpZCk7CisJc3JyLnNycl9yeF9pZCA9IGh0b25zKG9yaWdfaW9fcmVxLT50YXNrLT5yeHdyX3R4cmQudmFyX2N0eC5yeF9pZCk7CisJc3JyLnNycl9yZWxfb2ZmID0gaHRvbmwob2Zmc2V0KTsKKwlzcnIuc3JyX3JfY3RsID0gcl9jdGw7CisJb3JpZ19pb19yZXEtPnNycl9vZmZzZXQgPSBvZmZzZXQ7CisJb3JpZ19pb19yZXEtPnNycl9yY3RsID0gcl9jdGw7CisKKwlyYyA9IGJueDJmY19pbml0aWF0ZV9lbHModGd0LCBFTFNfU1JSLCAmc3JyLCBzaXplb2Yoc3JyKSwKKwkJCQkgYm54MmZjX3Nycl9jb21wbCwgY2JfYXJnLAorCQkJCSByX2FfdG92KTsKK3Nycl9lcnI6CisJaWYgKHJjKSB7CisJCUJOWDJGQ19JT19EQkcob3JpZ19pb19yZXEsICJTUlIgZmFpbGVkIC0gcmVsZWFzZVxuIik7CisJCXNwaW5fbG9ja19iaCgmdGd0LT50Z3RfbG9jayk7CisJCWtyZWZfcHV0KCZvcmlnX2lvX3JlcS0+cmVmY291bnQsIGJueDJmY19jbWRfcmVsZWFzZSk7CisJCXNwaW5fdW5sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKKwkJa2ZyZWUoY2JfYXJnKTsKKwl9IGVsc2UKKwkJc2V0X2JpdChCTlgyRkNfRkxBR19TUlJfU0VOVCwgJm9yaWdfaW9fcmVxLT5yZXFfZmxhZ3MpOworCisJcmV0dXJuIHJjOworfQorCiBzdGF0aWMgaW50IGJueDJmY19pbml0aWF0ZV9lbHMoc3RydWN0IGJueDJmY19ycG9ydCAqdGd0LCB1bnNpZ25lZCBpbnQgb3AsCiAJCQl2b2lkICpkYXRhLCB1MzIgZGF0YV9sZW4sCiAJCQl2b2lkICgqY2JfZnVuYykoc3RydWN0IGJueDJmY19lbHNfY2JfYXJnICpjYl9hcmcpLAogCQkJc3RydWN0IGJueDJmY19lbHNfY2JfYXJnICpjYl9hcmcsIHUzMiB0aW1lcl9tc2VjKQogewogCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQgPSB0Z3QtPnBvcnQ7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IHBvcnQtPnByaXY7CiAJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IHRndC0+cnBvcnQ7CiAJc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IHBvcnQtPmxwb3J0OwogCXN0cnVjdCBibngyZmNfY21kICplbHNfcmVxOwpAQCAtMjc0LDEyICs2NzgsMTIgQEAKIAogCXJjID0gZmNfcmVtb3RlX3BvcnRfY2hrcmVhZHkocnBvcnQpOwogCWlmIChyYykgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggImVscyAweCV4OiBycG9ydCBub3QgcmVhZHlcbiIsIG9wKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZWxzIDB4JXg6IHJwb3J0IG5vdCByZWFkeVxuIiwgb3ApOwogCQlyYyA9IC1FSU5WQUw7CiAJCWdvdG8gZWxzX2VycjsKIAl9CiAJaWYgKGxwb3J0LT5zdGF0ZSAhPSBMUE9SVF9TVF9SRUFEWSB8fCAhKGxwb3J0LT5saW5rX3VwKSkgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggImVscyAweCV4OiBsaW5rIGlzIG5vdCByZWFkeVxuIiwgb3ApOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJlbHMgMHgleDogbGluayBpcyBub3QgcmVhZHlcbiIsIG9wKTsKIAkJcmMgPSAtRUlOVkFMOwogCQlnb3RvIGVsc19lcnI7CiAJfQpAQCAtMzA1LDcgKzcwOSw3IEBACiAJbXBfcmVxID0gKHN0cnVjdCBibngyZmNfbXBfcmVxICopJihlbHNfcmVxLT5tcF9yZXEpOwogCXJjID0gYm54MmZjX2luaXRfbXBfcmVxKGVsc19yZXEpOwogCWlmIChyYyA9PSBGQUlMRUQpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJFTFMgTVAgcmVxdWVzdCBpbml0IGZhaWxlZFxuIik7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkVMUyBNUCByZXF1ZXN0IGluaXQgZmFpbGVkXG4iKTsKIAkJc3Bpbl9sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKIAkJa3JlZl9wdXQoJmVsc19yZXEtPnJlZmNvdW50LCBibngyZmNfY21kX3JlbGVhc2UpOwogCQlzcGluX3VubG9ja19iaCgmdGd0LT50Z3RfbG9jayk7CkBAIC0zMjQsNyArNzI4LDcgQEAKIAlpZiAoKG9wID49IEVMU19MU19SSlQpICYmIChvcCA8PSBFTFNfQVVUSF9FTFMpKSB7CiAJCW1lbWNweShtcF9yZXEtPnJlcV9idWYsIGRhdGEsIGRhdGFfbGVuKTsKIAl9IGVsc2UgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggIkludmFsaWQgRUxTIG9wIDB4JXhcbiIsIG9wKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiSW52YWxpZCBFTFMgb3AgMHgleFxuIiwgb3ApOwogCQllbHNfcmVxLT5jYl9mdW5jID0gTlVMTDsKIAkJZWxzX3JlcS0+Y2JfYXJnID0gTlVMTDsKIAkJc3Bpbl9sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKQEAgLTM0Miw5ICs3NDYsMTQgQEAKIAlkaWQgPSB0Z3QtPnJwb3J0LT5wb3J0X2lkOwogCXNpZCA9IHRndC0+c2lkOwogCi0JX19mY19maWxsX2ZjX2hkcihmY19oZHIsIEZDX1JDVExfRUxTX1JFUSwgZGlkLCBzaWQsCi0JCQkgICBGQ19UWVBFX0VMUywgRkNfRkNfRklSU1RfU0VRIHwgRkNfRkNfRU5EX1NFUSB8Ci0JCQkgICBGQ19GQ19TRVFfSU5JVCwgMCk7CisJaWYgKG9wID09IEVMU19TUlIpCisJCV9fZmNfZmlsbF9mY19oZHIoZmNfaGRyLCBGQ19SQ1RMX0VMUzRfUkVRLCBkaWQsIHNpZCwKKwkJCQkgICBGQ19UWVBFX0ZDUCwgRkNfRkNfRklSU1RfU0VRIHwKKwkJCQkgICBGQ19GQ19FTkRfU0VRIHwgRkNfRkNfU0VRX0lOSVQsIDApOworCWVsc2UKKwkJX19mY19maWxsX2ZjX2hkcihmY19oZHIsIEZDX1JDVExfRUxTX1JFUSwgZGlkLCBzaWQsCisJCQkJICAgRkNfVFlQRV9FTFMsIEZDX0ZDX0ZJUlNUX1NFUSB8CisJCQkJICAgRkNfRkNfRU5EX1NFUSB8IEZDX0ZDX1NFUV9JTklULCAwKTsKIAogCS8qIE9idGFpbiBleGNoYW5nZSBpZCAqLwogCXhpZCA9IGVsc19yZXEtPnhpZDsKQEAgLTM1Miw3ICs3NjEsOCBAQAogCWluZGV4ID0geGlkICUgQk5YMkZDX1RBU0tTX1BFUl9QQUdFOwogCiAJLyogSW5pdGlhbGl6ZSB0YXNrIGNvbnRleHQgZm9yIHRoaXMgSU8gcmVxdWVzdCAqLwotCXRhc2tfcGFnZSA9IChzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqKSBoYmEtPnRhc2tfY3R4W3Rhc2tfaWR4XTsKKwl0YXNrX3BhZ2UgPSAoc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKikKKwkJCWludGVyZmFjZS0+aGJhLT50YXNrX2N0eFt0YXNrX2lkeF07CiAJdGFzayA9ICYodGFza19wYWdlW2luZGV4XSk7CiAJYm54MmZjX2luaXRfbXBfdGFzayhlbHNfcmVxLCB0YXNrKTsKIApAQCAtNDk2LDggKzkwNiw4IEBACiAJCQkJICAgICAgdm9pZCAqYXJnLCB1MzIgdGltZW91dCkKIHsKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0ID0gbHBvcnRfcHJpdihscG9ydCk7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IHBvcnQtPnByaXY7Ci0Jc3RydWN0IGZjb2VfY3RsciAqZmlwID0gJmhiYS0+Y3RscjsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgZmNvZV9jdGxyICpmaXAgPSAmaW50ZXJmYWNlLT5jdGxyOwogCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoID0gZmNfZnJhbWVfaGVhZGVyX2dldChmcCk7CiAKIAlzd2l0Y2ggKG9wKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19mY29lLmMgYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19mY29lLmMKaW5kZXggYTk3YWZmMy4uN2NiMmNkNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfZmNvZS5jCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2Zjb2UuYwpAQCAtMyw3ICszLDcgQEAKICAqIGNuaWMgbW9kdWxlcyB0byBjcmVhdGUgRkNvRSBpbnN0YW5jZXMsIHNlbmQvcmVjZWl2ZSBub24tb2ZmbG9hZGVkCiAgKiBGSVAvRkNvRSBwYWNrZXRzLCBsaXN0ZW4gdG8gbGluayBldmVudHMgZXRjLgogICoKLSAqIENvcHlyaWdodCAoYykgMjAwOCAtIDIwMTAgQnJvYWRjb20gQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgMjAwOCAtIDIwMTEgQnJvYWRjb20gQ29ycG9yYXRpb24KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTE1LDEzICsxNSwxNCBAQAogI2luY2x1ZGUgImJueDJmYy5oIgogCiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBhZGFwdGVyX2xpc3Q7CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBpZl9saXN0Owogc3RhdGljIHUzMiBhZGFwdGVyX2NvdW50Owogc3RhdGljIERFRklORV9NVVRFWChibngyZmNfZGV2X2xvY2spOwogREVGSU5FX1BFUl9DUFUoc3RydWN0IGJueDJmY19wZXJjcHVfcywgYm54MmZjX3BlcmNwdSk7CiAKICNkZWZpbmUgRFJWX01PRFVMRV9OQU1FCQkiYm54MmZjIgogI2RlZmluZSBEUlZfTU9EVUxFX1ZFUlNJT04JQk5YMkZDX1ZFUlNJT04KLSNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJKdW4gMTAsIDIwMTEiCisjZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiSnVuIDIzLCAyMDExIgogCiAKIHN0YXRpYyBjaGFyIHZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KQEAgLTYxLDcgKzYyLDcgQEAKIAogc3RhdGljIHZvaWQgYm54MmZjX3JlY3ZfZnJhbWUoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKLXN0YXRpYyB2b2lkIGJueDJmY19zdGFydF9kaXNjKHN0cnVjdCBibngyZmNfaGJhICpoYmEpOworc3RhdGljIHZvaWQgYm54MmZjX3N0YXJ0X2Rpc2Moc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSk7CiBzdGF0aWMgaW50IGJueDJmY19zaG9zdF9jb25maWcoc3RydWN0IGZjX2xwb3J0ICpscG9ydCwgc3RydWN0IGRldmljZSAqZGV2KTsKIHN0YXRpYyBpbnQgYm54MmZjX25ldF9jb25maWcoc3RydWN0IGZjX2xwb3J0ICpscCk7CiBzdGF0aWMgaW50IGJueDJmY19scG9ydF9jb25maWcoc3RydWN0IGZjX2xwb3J0ICpscG9ydCk7CkBAIC03MCwxOCArNzEsMjAgQEAKIHN0YXRpYyB2b2lkIGJueDJmY191bmJpbmRfYWRhcHRlcl9kZXZpY2VzKHN0cnVjdCBibngyZmNfaGJhICpoYmEpOwogc3RhdGljIGludCBibngyZmNfYmluZF9wY2lkZXYoc3RydWN0IGJueDJmY19oYmEgKmhiYSk7CiBzdGF0aWMgdm9pZCBibngyZmNfdW5iaW5kX3BjaWRldihzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhKTsKLXN0YXRpYyBzdHJ1Y3QgZmNfbHBvcnQgKmJueDJmY19pZl9jcmVhdGUoc3RydWN0IGJueDJmY19oYmEgKmhiYSwKK3N0YXRpYyBzdHJ1Y3QgZmNfbHBvcnQgKmJueDJmY19pZl9jcmVhdGUoc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSwKIAkJCQkgIHN0cnVjdCBkZXZpY2UgKnBhcmVudCwgaW50IG5waXYpOwogc3RhdGljIHZvaWQgYm54MmZjX2Rlc3Ryb3lfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiBzdGF0aWMgc3RydWN0IGJueDJmY19oYmEgKmJueDJmY19oYmFfbG9va3VwKHN0cnVjdCBuZXRfZGV2aWNlICpwaHlzX2Rldik7CitzdGF0aWMgc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmJueDJmY19pbnRlcmZhY2VfbG9va3VwKHN0cnVjdCBuZXRfZGV2aWNlCisJCQkJCQkJKnBoeXNfZGV2KTsKIHN0YXRpYyBzdHJ1Y3QgYm54MmZjX2hiYSAqYm54MmZjX2ZpbmRfaGJhX2Zvcl9jbmljKHN0cnVjdCBjbmljX2RldiAqY25pYyk7CiAKIHN0YXRpYyBpbnQgYm54MmZjX2Z3X2luaXQoc3RydWN0IGJueDJmY19oYmEgKmhiYSk7CiBzdGF0aWMgdm9pZCBibngyZmNfZndfZGVzdHJveShzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhKTsKIAogc3RhdGljIHZvaWQgYm54MmZjX3BvcnRfc2h1dGRvd24oc3RydWN0IGZjX2xwb3J0ICpscG9ydCk7Ci1zdGF0aWMgdm9pZCBibngyZmNfc3RvcChzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhKTsKK3N0YXRpYyB2b2lkIGJueDJmY19zdG9wKHN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UpOwogc3RhdGljIGludCBfX2luaXQgYm54MmZjX21vZF9pbml0KHZvaWQpOwogc3RhdGljIHZvaWQgX19leGl0IGJueDJmY19tb2RfZXhpdCh2b2lkKTsKIApAQCAtMTQyLDcgKzE0NSw4IEBACiBzdGF0aWMgdm9pZCBibngyZmNfY2xlYW51cChzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQogewogCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQgPSBscG9ydF9wcml2KGxwb3J0KTsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gaW50ZXJmYWNlLT5oYmE7CiAJc3RydWN0IGJueDJmY19ycG9ydCAqdGd0OwogCWludCBpOwogCkBAIC0yMTksNyArMjIzLDggQEAKIAlzdHJ1Y3QgZmNvZV9jcmNfZW9mCSpjcDsKIAlzdHJ1Y3Qgc2tfYnVmZgkJKnNrYjsKIAlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyCSpmaDsKLQlzdHJ1Y3QgYm54MmZjX2hiYQkqaGJhOworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlCSppbnRlcmZhY2U7CisJc3RydWN0IGJueDJmY19oYmEgKmhiYTsKIAlzdHJ1Y3QgZmNvZV9wb3J0CSpwb3J0OwogCXN0cnVjdCBmY29lX2hkcgkJKmhwOwogCXN0cnVjdCBibngyZmNfcnBvcnQJKnRndDsKQEAgLTIzMCw3ICsyMzUsOCBAQAogCWludAkJCXdsZW4sIHJjID0gMDsKIAogCXBvcnQgPSAoc3RydWN0IGZjb2VfcG9ydCAqKWxwb3J0X3ByaXYobHBvcnQpOwotCWhiYSA9IHBvcnQtPnByaXY7CisJaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKKwloYmEgPSBpbnRlcmZhY2UtPmhiYTsKIAogCWZoID0gZmNfZnJhbWVfaGVhZGVyX2dldChmcCk7CiAKQEAgLTI0MiwxMiArMjQ4LDEyIEBACiAJfQogCiAJaWYgKHVubGlrZWx5KGZoLT5maF9yX2N0bCA9PSBGQ19SQ1RMX0VMU19SRVEpKSB7Ci0JCWlmICghaGJhLT5jdGxyLnNlbF9mY2YpIHsKKwkJaWYgKCFpbnRlcmZhY2UtPmN0bHIuc2VsX2ZjZikgewogCQkJQk5YMkZDX0hCQV9EQkcobHBvcnQsICJGQ0Ygbm90IHNlbGVjdGVkIHlldCFcbiIpOwogCQkJa2ZyZWVfc2tiKHNrYik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotCQlpZiAoZmNvZV9jdGxyX2Vsc19zZW5kKCZoYmEtPmN0bHIsIGxwb3J0LCBza2IpKQorCQlpZiAoZmNvZV9jdGxyX2Vsc19zZW5kKCZpbnRlcmZhY2UtPmN0bHIsIGxwb3J0LCBza2IpKQogCQkJcmV0dXJuIDA7CiAJfQogCkBAIC0zMTYsMTkgKzMyMiwxOSBAQAogCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCXNrYi0+bWFjX2xlbiA9IGVsZW47CiAJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0ZDT0UpOwotCXNrYi0+ZGV2ID0gaGJhLT5uZXRkZXY7CisJc2tiLT5kZXYgPSBpbnRlcmZhY2UtPm5ldGRldjsKIAogCS8qIGZpbGwgdXAgbWFjIGFuZCBmY29lIGhlYWRlcnMgKi8KIAllaCA9IGV0aF9oZHIoc2tiKTsKIAllaC0+aF9wcm90byA9IGh0b25zKEVUSF9QX0ZDT0UpOwotCWlmIChoYmEtPmN0bHIubWFwX2Rlc3QpCisJaWYgKGludGVyZmFjZS0+Y3Rsci5tYXBfZGVzdCkKIAkJZmNfZmNvZV9zZXRfbWFjKGVoLT5oX2Rlc3QsIGZoLT5maF9kX2lkKTsKIAllbHNlCiAJCS8qIGluc2VydCBHVyBhZGRyZXNzICovCi0JCW1lbWNweShlaC0+aF9kZXN0LCBoYmEtPmN0bHIuZGVzdF9hZGRyLCBFVEhfQUxFTik7CisJCW1lbWNweShlaC0+aF9kZXN0LCBpbnRlcmZhY2UtPmN0bHIuZGVzdF9hZGRyLCBFVEhfQUxFTik7CiAKLQlpZiAodW5saWtlbHkoaGJhLT5jdGxyLmZsb2dpX294aWQgIT0gRkNfWElEX1VOS05PV04pKQotCQltZW1jcHkoZWgtPmhfc291cmNlLCBoYmEtPmN0bHIuY3RsX3NyY19hZGRyLCBFVEhfQUxFTik7CisJaWYgKHVubGlrZWx5KGludGVyZmFjZS0+Y3Rsci5mbG9naV9veGlkICE9IEZDX1hJRF9VTktOT1dOKSkKKwkJbWVtY3B5KGVoLT5oX3NvdXJjZSwgaW50ZXJmYWNlLT5jdGxyLmN0bF9zcmNfYWRkciwgRVRIX0FMRU4pOwogCWVsc2UKIAkJbWVtY3B5KGVoLT5oX3NvdXJjZSwgcG9ydC0+ZGF0YV9zcmNfYWRkciwgRVRIX0FMRU4pOwogCkBAIC0zNzcsMjIgKzM4MywyMyBAQAogCQlzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0eXBlLCBzdHJ1Y3QgbmV0X2RldmljZSAqb2xkZGV2KQogewogCXN0cnVjdCBmY19scG9ydCAqbHBvcnQ7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYTsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlOwogCXN0cnVjdCBmY19mcmFtZV9oZWFkZXIgKmZoOwogCXN0cnVjdCBmY29lX3Jjdl9pbmZvICpmcjsKIAlzdHJ1Y3QgZmNvZV9wZXJjcHVfcyAqYmc7CiAJdW5zaWduZWQgc2hvcnQgb3hpZDsKIAotCWhiYSA9IGNvbnRhaW5lcl9vZihwdHlwZSwgc3RydWN0IGJueDJmY19oYmEsIGZjb2VfcGFja2V0X3R5cGUpOwotCWxwb3J0ID0gaGJhLT5jdGxyLmxwOworCWludGVyZmFjZSA9IGNvbnRhaW5lcl9vZihwdHlwZSwgc3RydWN0IGJueDJmY19pbnRlcmZhY2UsCisJCQkJIGZjb2VfcGFja2V0X3R5cGUpOworCWxwb3J0ID0gaW50ZXJmYWNlLT5jdGxyLmxwOwogCiAJaWYgKHVubGlrZWx5KGxwb3J0ID09IE5VTEwpKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiYm54MmZjX3JjdjogbHBvcnQgaXMgTlVMTFxuIik7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImJueDJmY19yY3Y6IGxwb3J0IGlzIE5VTExcbiIpOwogCQlnb3RvIGVycjsKIAl9CiAKIAlpZiAodW5saWtlbHkoZXRoX2hkcihza2IpLT5oX3Byb3RvICE9IGh0b25zKEVUSF9QX0ZDT0UpKSkgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggImJueDJmY19yY3Y6IFdyb25nIEZDIHR5cGUgZnJhbWVcbiIpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJibngyZmNfcmN2OiBXcm9uZyBGQyB0eXBlIGZyYW1lXG4iKTsKIAkJZ290byBlcnI7CiAJfQogCkBAIC00MTEsNyArNDE4LDYgQEAKIAogCWZyID0gZmNvZV9kZXZfZnJvbV9za2Ioc2tiKTsKIAlmci0+ZnJfZGV2ID0gbHBvcnQ7Ci0JZnItPnB0eXBlID0gcHR5cGU7CiAKIAliZyA9ICZibngyZmNfZ2xvYmFsOwogCXNwaW5fbG9ja19iaCgmYmctPmZjb2VfcnhfbGlzdC5sb2NrKTsKQEAgLTQ2OSw3ICs0NzUsNyBAQAogCWZyID0gZmNvZV9kZXZfZnJvbV9za2Ioc2tiKTsKIAlscG9ydCA9IGZyLT5mcl9kZXY7CiAJaWYgKHVubGlrZWx5KGxwb3J0ID09IE5VTEwpKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiSW52YWxpZCBscG9ydCBzdHJ1Y3RcbiIpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJJbnZhbGlkIGxwb3J0IHN0cnVjdFxuIik7CiAJCWtmcmVlX3NrYihza2IpOwogCQlyZXR1cm47CiAJfQpAQCAtNTk0LDcgKzYwMCw4IEBACiAJc3RydWN0IGZjX2hvc3Rfc3RhdGlzdGljcyAqYm54MmZjX3N0YXRzOwogCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBzaG9zdF9wcml2KHNob3N0KTsKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0ID0gbHBvcnRfcHJpdihscG9ydCk7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IGludGVyZmFjZS0+aGJhOwogCXN0cnVjdCBmY29lX3N0YXRpc3RpY3NfcGFyYW1zICpmd19zdGF0czsKIAlpbnQgcmMgPSAwOwogCkBAIC02MzEsNyArNjM4LDcgQEAKIHN0YXRpYyBpbnQgYm54MmZjX3Nob3N0X2NvbmZpZyhzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCBzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGZjb2VfcG9ydCAqcG9ydCA9IGxwb3J0X3ByaXYobHBvcnQpOwotCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBwb3J0LT5wcml2OwogCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gbHBvcnQtPmhvc3Q7CiAJaW50IHJjID0gMDsKIApAQCAtNjU0LDcgKzY2MSw3IEBACiAJCWZjX2hvc3RfbWF4X25waXZfdnBvcnRzKGxwb3J0LT5ob3N0KSA9IFVTSFJUX01BWDsKIAlzcHJpbnRmKGZjX2hvc3Rfc3ltYm9saWNfbmFtZShscG9ydC0+aG9zdCksICIlcyB2JXMgb3ZlciAlcyIsCiAJCUJOWDJGQ19OQU1FLCBCTlgyRkNfVkVSU0lPTiwKLQkJaGJhLT5uZXRkZXYtPm5hbWUpOworCQlpbnRlcmZhY2UtPm5ldGRldi0+bmFtZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTY2Miw4ICs2NjksOCBAQAogc3RhdGljIHZvaWQgYm54MmZjX2xpbmtfc3BlZWRfdXBkYXRlKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCiB7CiAJc3RydWN0IGZjb2VfcG9ydCAqcG9ydCA9IGxwb3J0X3ByaXYobHBvcnQpOwotCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBwb3J0LT5wcml2OwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBoYmEtPm5ldGRldjsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gaW50ZXJmYWNlLT5uZXRkZXY7CiAJc3RydWN0IGV0aHRvb2xfY21kIGVjbWQ7CiAKIAlpZiAoIWRldl9ldGh0b29sX2dldF9zZXR0aW5ncyhuZXRkZXYsICZlY21kKSkgewpAQCAtNjkxLDcgKzY5OCw4IEBACiBzdGF0aWMgaW50IGJueDJmY19saW5rX29rKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCiB7CiAJc3RydWN0IGZjb2VfcG9ydCAqcG9ydCA9IGxwb3J0X3ByaXYobHBvcnQpOwotCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBpbnRlcmZhY2UtPmhiYTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gaGJhLT5waHlzX2RldjsKIAlpbnQgcmMgPSAwOwogCkBAIC03MTMsNyArNzIxLDcgQEAKICAqLwogdm9pZCBibngyZmNfZ2V0X2xpbmtfc3RhdGUoc3RydWN0IGJueDJmY19oYmEgKmhiYSkKIHsKLQlpZiAodGVzdF9iaXQoX19MSU5LX1NUQVRFX05PQ0FSUklFUiwgJmhiYS0+bmV0ZGV2LT5zdGF0ZSkpCisJaWYgKHRlc3RfYml0KF9fTElOS19TVEFURV9OT0NBUlJJRVIsICZoYmEtPnBoeXNfZGV2LT5zdGF0ZSkpCiAJCXNldF9iaXQoQURBUFRFUl9TVEFURV9MSU5LX0RPV04sICZoYmEtPmFkYXB0ZXJfc3RhdGUpOwogCWVsc2UKIAkJY2xlYXJfYml0KEFEQVBURVJfU1RBVEVfTElOS19ET1dOLCAmaGJhLT5hZGFwdGVyX3N0YXRlKTsKQEAgLTcyMiwxMSArNzMwLDEzIEBACiBzdGF0aWMgaW50IGJueDJmY19uZXRfY29uZmlnKHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCiB7CiAJc3RydWN0IGJueDJmY19oYmEgKmhiYTsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlOwogCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQ7CiAJdTY0IHd3bm4sIHd3cG47CiAKIAlwb3J0ID0gbHBvcnRfcHJpdihscG9ydCk7Ci0JaGJhID0gcG9ydC0+cHJpdjsKKwlpbnRlcmZhY2UgPSBwb3J0LT5wcml2OworCWhiYSA9IGludGVyZmFjZS0+aGJhOwogCiAJLyogcmVxdWlyZSBzdXBwb3J0IGZvciBnZXRfcGF1c2VwYXJhbSBldGh0b29sIG9wLiAqLwogCWlmICghaGJhLT5waHlzX2Rldi0+ZXRodG9vbF9vcHMgfHwKQEAgLTc0MywxMSArNzUzLDExIEBACiAJYm54MmZjX2xpbmtfc3BlZWRfdXBkYXRlKGxwb3J0KTsKIAogCWlmICghbHBvcnQtPnZwb3J0KSB7Ci0JCXd3bm4gPSBmY29lX3d3bl9mcm9tX21hYyhoYmEtPmN0bHIuY3RsX3NyY19hZGRyLCAxLCAwKTsKKwkJd3dubiA9IGZjb2Vfd3duX2Zyb21fbWFjKGludGVyZmFjZS0+Y3Rsci5jdGxfc3JjX2FkZHIsIDEsIDApOwogCQlCTlgyRkNfSEJBX0RCRyhscG9ydCwgIldXTk4gPSAweCVsbHhcbiIsIHd3bm4pOwogCQlmY19zZXRfd3dubihscG9ydCwgd3dubik7CiAKLQkJd3dwbiA9IGZjb2Vfd3duX2Zyb21fbWFjKGhiYS0+Y3Rsci5jdGxfc3JjX2FkZHIsIDIsIDApOworCQl3d3BuID0gZmNvZV93d25fZnJvbV9tYWMoaW50ZXJmYWNlLT5jdGxyLmN0bF9zcmNfYWRkciwgMiwgMCk7CiAJCUJOWDJGQ19IQkFfREJHKGxwb3J0LCAiV1dQTiA9IDB4JWxseFxuIiwgd3dwbik7CiAJCWZjX3NldF93d3BuKGxwb3J0LCB3d3BuKTsKIAl9CkBAIC03NTksOSArNzY5LDkgQEAKIHsKIAlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gKHN0cnVjdCBibngyZmNfaGJhICopZGF0YTsKIAotCUJOWDJGQ19IQkFfREJHKGhiYS0+Y3Rsci5scCwgIkVSUk9SOmJueDJmY19kZXN0cm95X3RpbWVyIC0gIgorCUJOWDJGQ19NSVNDX0RCRygiRVJST1I6Ym54MmZjX2Rlc3Ryb3lfdGltZXIgLSAiCiAJCSAgICJEZXN0cm95IGNvbXBsIG5vdCByZWNlaXZlZCEhXG4iKTsKLQloYmEtPmZsYWdzIHw9IEJOWDJGQ19GTEFHX0RFU1RST1lfQ01QTDsKKwlzZXRfYml0KEJOWDJGQ19GTEFHX0RFU1RST1lfQ01QTCwgJmhiYS0+ZmxhZ3MpOwogCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaGJhLT5kZXN0cm95X3dhaXQpOwogfQogCkBAIC03NzksNTQgKzc4OSwzNSBAQAogCQkJCSAgICAgdTE2IHZsYW5faWQpCiB7CiAJc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IChzdHJ1Y3QgYm54MmZjX2hiYSAqKWNvbnRleHQ7Ci0Jc3RydWN0IGZjX2xwb3J0ICpscG9ydCA9IGhiYS0+Y3Rsci5scDsKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0OwogCXN0cnVjdCBmY19scG9ydCAqdnBvcnQ7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZTsKKwlpbnQgd2FpdF9mb3JfdXBsb2FkID0gMDsKIAl1MzIgbGlua19wb3NzaWJsZSA9IDE7CiAKIAkvKiBJZ25vcmUgdmxhbnMgZm9yIG5vdyAqLwogCWlmICh2bGFuX2lkICE9IDApCiAJCXJldHVybjsKIAotCWlmICghdGVzdF9iaXQoQk5YMkZDX0NSRUFURV9ET05FLCAmaGJhLT5pbml0X2RvbmUpKSB7Ci0JCUJOWDJGQ19NSVNDX0RCRygiZHJpdmVyIG5vdCByZWFkeS4gZXZlbnQ9JXMgJWxkXG4iLAotCQkJICAgaGJhLT5uZXRkZXYtPm5hbWUsIGV2ZW50KTsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogQVNTVU1QVElPTjoKLQkgKiBpbmRpY2F0ZV9uZXRldmVudCBjYW5ub3QgYmUgY2FsbGVkIGZyb20gY25pYyB1bmxlc3MgYm54MmZjCi0JICogZG9lcyByZWdpc3Rlcl9kZXZpY2UKLQkgKi8KLQlCVUdfT04oIWxwb3J0KTsKLQotCUJOWDJGQ19IQkFfREJHKGxwb3J0LCAiZW50ZXIgbmV0ZXZlbnQgaGFuZGxlciAtIGV2ZW50PSVzICVsZFxuIiwKLQkJCQloYmEtPm5ldGRldi0+bmFtZSwgZXZlbnQpOwotCiAJc3dpdGNoIChldmVudCkgewogCWNhc2UgTkVUREVWX1VQOgotCQlCTlgyRkNfSEJBX0RCRyhscG9ydCwgIlBvcnQgdXAsIGFkYXB0ZXJfc3RhdGUgPSAlbGRcbiIsCi0JCQloYmEtPmFkYXB0ZXJfc3RhdGUpOwogCQlpZiAoIXRlc3RfYml0KEFEQVBURVJfU1RBVEVfVVAsICZoYmEtPmFkYXB0ZXJfc3RhdGUpKQogCQkJcHJpbnRrKEtFUk5fRVJSICJpbmRpY2F0ZV9uZXRldmVudDogIlwKLQkJCQkJImFkYXB0ZXIgaXMgbm90IFVQISFcbiIpOworCQkJCQkiaGJhIGlzIG5vdCBVUCEhXG4iKTsKIAkJYnJlYWs7CiAKIAljYXNlIE5FVERFVl9ET1dOOgotCQlCTlgyRkNfSEJBX0RCRyhscG9ydCwgIlBvcnQgZG93blxuIik7CiAJCWNsZWFyX2JpdChBREFQVEVSX1NUQVRFX0dPSU5HX0RPV04sICZoYmEtPmFkYXB0ZXJfc3RhdGUpOwogCQljbGVhcl9iaXQoQURBUFRFUl9TVEFURV9VUCwgJmhiYS0+YWRhcHRlcl9zdGF0ZSk7CiAJCWxpbmtfcG9zc2libGUgPSAwOwogCQlicmVhazsKIAogCWNhc2UgTkVUREVWX0dPSU5HX0RPV046Ci0JCUJOWDJGQ19IQkFfREJHKGxwb3J0LCAiUG9ydCBnb2luZyBkb3duXG4iKTsKIAkJc2V0X2JpdChBREFQVEVSX1NUQVRFX0dPSU5HX0RPV04sICZoYmEtPmFkYXB0ZXJfc3RhdGUpOwogCQlsaW5rX3Bvc3NpYmxlID0gMDsKIAkJYnJlYWs7CiAKIAljYXNlIE5FVERFVl9DSEFOR0U6Ci0JCUJOWDJGQ19IQkFfREJHKGxwb3J0LCAiTkVUREVWX0NIQU5HRVxuIik7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTgzNCwxNSArODI1LDIyIEBACiAJCXJldHVybjsKIAl9CiAKLQlibngyZmNfbGlua19zcGVlZF91cGRhdGUobHBvcnQpOworCW11dGV4X2xvY2soJmJueDJmY19kZXZfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpbnRlcmZhY2UsICZpZl9saXN0LCBsaXN0KSB7CiAKLQlpZiAobGlua19wb3NzaWJsZSAmJiAhYm54MmZjX2xpbmtfb2sobHBvcnQpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiaW5kaWNhdGVfbmV0ZXZlbnQ6IGNhbGwgY3Rscl9saW5rX3VwXG4iKTsKLQkJZmNvZV9jdGxyX2xpbmtfdXAoJmhiYS0+Y3Rscik7Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJpbmRpY2F0ZV9uZXRldmVudDogY2FsbCBjdGxyX2xpbmtfZG93blxuIik7Ci0JCWlmIChmY29lX2N0bHJfbGlua19kb3duKCZoYmEtPmN0bHIpKSB7Ci0JCQljbGVhcl9iaXQoQURBUFRFUl9TVEFURV9SRUFEWSwgJmhiYS0+YWRhcHRlcl9zdGF0ZSk7CisJCWlmIChpbnRlcmZhY2UtPmhiYSAhPSBoYmEpCisJCQljb250aW51ZTsKKworCQlscG9ydCA9IGludGVyZmFjZS0+Y3Rsci5scDsKKwkJQk5YMkZDX0hCQV9EQkcobHBvcnQsICJuZXRldmVudCBoYW5kbGVyIC0gZXZlbnQ9JXMgJWxkXG4iLAorCQkJCWludGVyZmFjZS0+bmV0ZGV2LT5uYW1lLCBldmVudCk7CisKKwkJYm54MmZjX2xpbmtfc3BlZWRfdXBkYXRlKGxwb3J0KTsKKworCQlpZiAobGlua19wb3NzaWJsZSAmJiAhYm54MmZjX2xpbmtfb2sobHBvcnQpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImluZGljYXRlX25ldGV2ZW50OiBjdGxyX2xpbmtfdXBcbiIpOworCQkJZmNvZV9jdGxyX2xpbmtfdXAoJmludGVyZmFjZS0+Y3Rscik7CisJCX0gZWxzZSBpZiAoZmNvZV9jdGxyX2xpbmtfZG93bigmaW50ZXJmYWNlLT5jdGxyKSkgewogCQkJbXV0ZXhfbG9jaygmbHBvcnQtPmxwX211dGV4KTsKIAkJCWxpc3RfZm9yX2VhY2hfZW50cnkodnBvcnQsICZscG9ydC0+dnBvcnRzLCBsaXN0KQogCQkJCWZjX2hvc3RfcG9ydF90eXBlKHZwb3J0LT5ob3N0KSA9CkBAIC04NTMsMjUgKzg1MSwyNyBAQAogCQkJCSAgICBnZXRfY3B1KCkpLT5MaW5rRmFpbHVyZUNvdW50Kys7CiAJCQlwdXRfY3B1KCk7CiAJCQlmY29lX2NsZWFuX3BlbmRpbmdfcXVldWUobHBvcnQpOwotCi0JCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZoYmEtPnNodXRkb3duX3dhaXQpOwotCQkJQk5YMkZDX0hCQV9EQkcobHBvcnQsICJpbmRpY2F0ZV9uZXRldmVudCAiCi0JCQkJCSAgICAgIm51bV9vZmxkX3Nlc3MgPSAlZFxuIiwKLQkJCQkgICBoYmEtPm51bV9vZmxkX3Nlc3MpOwotCQkJaGJhLT53YWl0X2Zvcl9saW5rX2Rvd24gPSAxOwotCQkJQk5YMkZDX0hCQV9EQkcobHBvcnQsICJ3YWl0aW5nIGZvciB1cGxvYWRzIHRvICIKLQkJCQkJICAgICAiY29tcGwgcHJvYyA9ICVzXG4iLAotCQkJCSAgIGN1cnJlbnQtPmNvbW0pOwotCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGhiYS0+c2h1dGRvd25fd2FpdCwKLQkJCQkJCSAoaGJhLT5udW1fb2ZsZF9zZXNzID09IDApKTsKLQkJCUJOWDJGQ19IQkFfREJHKGxwb3J0LCAid2FrZXVwIC0gbnVtX29mbGRfc2VzcyA9ICVkXG4iLAotCQkJCWhiYS0+bnVtX29mbGRfc2Vzcyk7Ci0JCQloYmEtPndhaXRfZm9yX2xpbmtfZG93biA9IDA7Ci0KLQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKLQkJCQlmbHVzaF9zaWduYWxzKGN1cnJlbnQpOworCQkJd2FpdF9mb3JfdXBsb2FkID0gMTsKIAkJfQogCX0KKwltdXRleF91bmxvY2soJmJueDJmY19kZXZfbG9jayk7CisKKwlpZiAod2FpdF9mb3JfdXBsb2FkKSB7CisJCWNsZWFyX2JpdChBREFQVEVSX1NUQVRFX1JFQURZLCAmaGJhLT5hZGFwdGVyX3N0YXRlKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmaGJhLT5zaHV0ZG93bl93YWl0KTsKKwkJQk5YMkZDX01JU0NfREJHKCJpbmRpY2F0ZV9uZXRldmVudCAiCisJCQkJIm51bV9vZmxkX3Nlc3MgPSAlZFxuIiwKKwkJCQloYmEtPm51bV9vZmxkX3Nlc3MpOworCQloYmEtPndhaXRfZm9yX2xpbmtfZG93biA9IDE7CisJCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShoYmEtPnNodXRkb3duX3dhaXQsCisJCQkJCSAoaGJhLT5udW1fb2ZsZF9zZXNzID09IDApKTsKKwkJQk5YMkZDX01JU0NfREJHKCJ3YWtldXAgLSBudW1fb2ZsZF9zZXNzID0gJWRcbiIsCisJCQkJaGJhLT5udW1fb2ZsZF9zZXNzKTsKKwkJaGJhLT53YWl0X2Zvcl9saW5rX2Rvd24gPSAwOworCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CisJfQogfQogCiBzdGF0aWMgaW50IGJueDJmY19saWJmY19jb25maWcoc3RydWN0IGZjX2xwb3J0ICpscG9ydCkKQEAgLTg4OSwyMyArODg5LDEyIEBACiAKIHN0YXRpYyBpbnQgYm54MmZjX2VtX2NvbmZpZyhzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQogewotCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQgPSBscG9ydF9wcml2KGxwb3J0KTsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gcG9ydC0+cHJpdjsKLQogCWlmICghZmNfZXhjaF9tZ3JfYWxsb2MobHBvcnQsIEZDX0NMQVNTXzMsIEZDT0VfTUlOX1hJRCwKIAkJCQlGQ09FX01BWF9YSUQsIE5VTEwpKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggImVtX2NvbmZpZzpmY19leGNoX21ncl9hbGxvYyBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQloYmEtPmNtZF9tZ3IgPSBibngyZmNfY21kX21ncl9hbGxvYyhoYmEsIEJOWDJGQ19NSU5fWElELAotCQkJCQkgICAgQk5YMkZDX01BWF9YSUQpOwotCi0JaWYgKCFoYmEtPmNtZF9tZ3IpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZW1fY29uZmlnOmJueDJmY19jbWRfbWdyX2FsbG9jIGZhaWxlZFxuIik7Ci0JCWZjX2V4Y2hfbWdyX2ZyZWUobHBvcnQpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTkxOCwxMSArOTA3LDggQEAKIAlscG9ydC0+ZV9kX3RvdiA9IDIgKiAxMDAwOwogCWxwb3J0LT5yX2FfdG92ID0gMTAgKiAxMDAwOwogCi0JLyogUkVWSVNJVDogZW5hYmxlIHdoZW4gc3VwcG9ydGluZyB0YXBlIGRldmljZXMKIAlscG9ydC0+c2VydmljZV9wYXJhbXMgPSAoRkNQX1NQUEZfSU5JVF9GQ04gfCBGQ1BfU1BQRl9SRF9YUkRZX0RJUyB8CiAJCQkJRkNQX1NQUEZfUkVUUlkgfCBGQ1BfU1BQRl9DT05GX0NPTVBMKTsKLQkqLwotCWxwb3J0LT5zZXJ2aWNlX3BhcmFtcyA9IChGQ1BfU1BQRl9JTklUX0ZDTiB8IEZDUF9TUFBGX1JEX1hSRFlfRElTKTsKIAlscG9ydC0+ZG9lc19ucGl2ID0gMTsKIAogCW1lbXNldCgmbHBvcnQtPnJuaWRfZ2VuLCAwLCBzaXplb2Yoc3RydWN0IGZjX2Vsc19ybmlkX2dlbikpOwpAQCAtOTUyLDkgKzkzOCwxMCBAQAogCQkJICAgc3RydWN0IHBhY2tldF90eXBlICpwdHlwZSwKIAkJCSAgIHN0cnVjdCBuZXRfZGV2aWNlICpvcmlnX2RldikKIHsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhOwotCWhiYSA9IGNvbnRhaW5lcl9vZihwdHlwZSwgc3RydWN0IGJueDJmY19oYmEsIGZpcF9wYWNrZXRfdHlwZSk7Ci0JZmNvZV9jdGxyX3JlY3YoJmhiYS0+Y3Rsciwgc2tiKTsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlOworCWludGVyZmFjZSA9IGNvbnRhaW5lcl9vZihwdHlwZSwgc3RydWN0IGJueDJmY19pbnRlcmZhY2UsCisJCQkJIGZpcF9wYWNrZXRfdHlwZSk7CisJZmNvZV9jdGxyX3JlY3YoJmludGVyZmFjZS0+Y3Rsciwgc2tiKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTAwNSwxNyArOTkyLDE3IEBACiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSB2cG9ydF90b19zaG9zdCh2cG9ydCk7CiAJc3RydWN0IGZjX2xwb3J0ICpuX3BvcnQgPSBzaG9zdF9wcml2KHNob3N0KTsKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0ID0gbHBvcnRfcHJpdihuX3BvcnQpOwotCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBwb3J0LT5wcml2OwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBoYmEtPm5ldGRldjsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gaW50ZXJmYWNlLT5uZXRkZXY7CiAJc3RydWN0IGZjX2xwb3J0ICp2bl9wb3J0OwogCi0JaWYgKCF0ZXN0X2JpdChCTlgyRkNfRldfSU5JVF9ET05FLCAmaGJhLT5pbml0X2RvbmUpKSB7CisJaWYgKCF0ZXN0X2JpdChCTlgyRkNfRkxBR19GV19JTklUX0RPTkUsICZpbnRlcmZhY2UtPmhiYS0+ZmxhZ3MpKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggInZuIHBvcnRzIGNhbm5vdCBiZSBjcmVhdGVkIG9uIgotCQkJInRoaXMgaGJhXG4iKTsKKwkJCSJ0aGlzIGludGVyZmFjZVxuIik7CiAJCXJldHVybiAtRUlPOwogCX0KIAltdXRleF9sb2NrKCZibngyZmNfZGV2X2xvY2spOwotCXZuX3BvcnQgPSBibngyZmNfaWZfY3JlYXRlKGhiYSwgJnZwb3J0LT5kZXYsIDEpOworCXZuX3BvcnQgPSBibngyZmNfaWZfY3JlYXRlKGludGVyZmFjZSwgJnZwb3J0LT5kZXYsIDEpOwogCW11dGV4X3VubG9jaygmYm54MmZjX2Rldl9sb2NrKTsKIAogCWlmIChJU19FUlIodm5fcG9ydCkpIHsKQEAgLTEwNjUsMTAgKzEwNTIsMTAgQEAKIH0KIAogCi1zdGF0aWMgaW50IGJueDJmY19uZXRkZXZfc2V0dXAoc3RydWN0IGJueDJmY19oYmEgKmhiYSkKK3N0YXRpYyBpbnQgYm54MmZjX25ldGRldl9zZXR1cChzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBoYmEtPm5ldGRldjsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcGh5c2RldiA9IGhiYS0+cGh5c19kZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGludGVyZmFjZS0+bmV0ZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpwaHlzZGV2ID0gaW50ZXJmYWNlLT5oYmEtPnBoeXNfZGV2OwogCXN0cnVjdCBuZXRkZXZfaHdfYWRkciAqaGE7CiAJaW50IHNlbF9zYW5fbWFjID0gMDsKIApAQCAtMTA4Myw3ICsxMDcwLDggQEAKIAogCQlpZiAoKGhhLT50eXBlID09IE5FVERFVl9IV19BRERSX1RfU0FOKSAmJgogCQkgICAgKGlzX3ZhbGlkX2V0aGVyX2FkZHIoaGEtPmFkZHIpKSkgewotCQkJbWVtY3B5KGhiYS0+Y3Rsci5jdGxfc3JjX2FkZHIsIGhhLT5hZGRyLCBFVEhfQUxFTik7CisJCQltZW1jcHkoaW50ZXJmYWNlLT5jdGxyLmN0bF9zcmNfYWRkciwgaGEtPmFkZHIsCisJCQkgICAgICAgRVRIX0FMRU4pOwogCQkJc2VsX3Nhbl9tYWMgPSAxOwogCQkJQk5YMkZDX01JU0NfREJHKCJGb3VuZCBTQU4gTUFDXG4iKTsKIAkJfQpAQCAtMTA5MywxNSArMTA4MSwxNSBAQAogCWlmICghc2VsX3Nhbl9tYWMpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaGJhLT5maXBfcGFja2V0X3R5cGUuZnVuYyA9IGJueDJmY19maXBfcmVjdjsKLQloYmEtPmZpcF9wYWNrZXRfdHlwZS50eXBlID0gaHRvbnMoRVRIX1BfRklQKTsKLQloYmEtPmZpcF9wYWNrZXRfdHlwZS5kZXYgPSBuZXRkZXY7Ci0JZGV2X2FkZF9wYWNrKCZoYmEtPmZpcF9wYWNrZXRfdHlwZSk7CisJaW50ZXJmYWNlLT5maXBfcGFja2V0X3R5cGUuZnVuYyA9IGJueDJmY19maXBfcmVjdjsKKwlpbnRlcmZhY2UtPmZpcF9wYWNrZXRfdHlwZS50eXBlID0gaHRvbnMoRVRIX1BfRklQKTsKKwlpbnRlcmZhY2UtPmZpcF9wYWNrZXRfdHlwZS5kZXYgPSBuZXRkZXY7CisJZGV2X2FkZF9wYWNrKCZpbnRlcmZhY2UtPmZpcF9wYWNrZXRfdHlwZSk7CiAKLQloYmEtPmZjb2VfcGFja2V0X3R5cGUuZnVuYyA9IGJueDJmY19yY3Y7Ci0JaGJhLT5mY29lX3BhY2tldF90eXBlLnR5cGUgPSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0ZDT0UpOwotCWhiYS0+ZmNvZV9wYWNrZXRfdHlwZS5kZXYgPSBuZXRkZXY7Ci0JZGV2X2FkZF9wYWNrKCZoYmEtPmZjb2VfcGFja2V0X3R5cGUpOworCWludGVyZmFjZS0+ZmNvZV9wYWNrZXRfdHlwZS5mdW5jID0gYm54MmZjX3JjdjsKKwlpbnRlcmZhY2UtPmZjb2VfcGFja2V0X3R5cGUudHlwZSA9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfRkNPRSk7CisJaW50ZXJmYWNlLT5mY29lX3BhY2tldF90eXBlLmRldiA9IG5ldGRldjsKKwlkZXZfYWRkX3BhY2soJmludGVyZmFjZS0+ZmNvZV9wYWNrZXRfdHlwZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTExMzcsNTMgKzExMjUsNTQgQEAKIAogc3RhdGljIHZvaWQgYm54MmZjX2ludGVyZmFjZV9yZWxlYXNlKHN0cnVjdCBrcmVmICprcmVmKQogewotCXN0cnVjdCBibngyZmNfaGJhICpoYmE7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2OwotCXN0cnVjdCBuZXRfZGV2aWNlICpwaHlzX2RldjsKIAotCWhiYSA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgYm54MmZjX2hiYSwga3JlZik7CisJaW50ZXJmYWNlID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBibngyZmNfaW50ZXJmYWNlLCBrcmVmKTsKIAlCTlgyRkNfTUlTQ19EQkcoIkludGVyZmFjZSBpcyBiZWluZyByZWxlYXNlZFxuIik7CiAKLQluZXRkZXYgPSBoYmEtPm5ldGRldjsKLQlwaHlzX2RldiA9IGhiYS0+cGh5c19kZXY7CisJbmV0ZGV2ID0gaW50ZXJmYWNlLT5uZXRkZXY7CiAKIAkvKiB0ZWFyLWRvd24gRklQIGNvbnRyb2xsZXIgKi8KLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEJOWDJGQ19DVExSX0lOSVRfRE9ORSwgJmhiYS0+aW5pdF9kb25lKSkKLQkJZmNvZV9jdGxyX2Rlc3Ryb3koJmhiYS0+Y3Rscik7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChCTlgyRkNfQ1RMUl9JTklUX0RPTkUsICZpbnRlcmZhY2UtPmlmX2ZsYWdzKSkKKwkJZmNvZV9jdGxyX2Rlc3Ryb3koJmludGVyZmFjZS0+Y3Rscik7CiAKKwlrZnJlZShpbnRlcmZhY2UpOworCisJZGV2X3B1dChuZXRkZXYpOworCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYm54MmZjX2ludGVyZmFjZV9nZXQoc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSkKK3sKKwlrcmVmX2dldCgmaW50ZXJmYWNlLT5rcmVmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGJueDJmY19pbnRlcmZhY2VfcHV0KHN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UpCit7CisJa3JlZl9wdXQoJmludGVyZmFjZS0+a3JlZiwgYm54MmZjX2ludGVyZmFjZV9yZWxlYXNlKTsKK30KK3N0YXRpYyB2b2lkIGJueDJmY19oYmFfZGVzdHJveShzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhKQorewogCS8qIEZyZWUgdGhlIGNvbW1hbmQgbWFuYWdlciAqLwogCWlmIChoYmEtPmNtZF9tZ3IpIHsKIAkJYm54MmZjX2NtZF9tZ3JfZnJlZShoYmEtPmNtZF9tZ3IpOwogCQloYmEtPmNtZF9tZ3IgPSBOVUxMOwogCX0KLQlkZXZfcHV0KG5ldGRldik7Ci0JbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBibngyZmNfaW50ZXJmYWNlX2dldChzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhKQotewotCWtyZWZfZ2V0KCZoYmEtPmtyZWYpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgYm54MmZjX2ludGVyZmFjZV9wdXQoc3RydWN0IGJueDJmY19oYmEgKmhiYSkKLXsKLQlrcmVmX3B1dCgmaGJhLT5rcmVmLCBibngyZmNfaW50ZXJmYWNlX3JlbGVhc2UpOwotfQotc3RhdGljIHZvaWQgYm54MmZjX2ludGVyZmFjZV9kZXN0cm95KHN0cnVjdCBibngyZmNfaGJhICpoYmEpCi17CisJa2ZyZWUoaGJhLT50Z3Rfb2ZsZF9saXN0KTsKIAlibngyZmNfdW5iaW5kX3BjaWRldihoYmEpOwogCWtmcmVlKGhiYSk7CiB9CiAKIC8qKgotICogYm54MmZjX2ludGVyZmFjZV9jcmVhdGUgLSBjcmVhdGUgYSBuZXcgZmNvZSBpbnN0YW5jZQorICogYm54MmZjX2hiYV9jcmVhdGUgLSBjcmVhdGUgYSBuZXcgYm54MmZjIGhiYQogICoKICAqIEBjbmljOglwb2ludGVyIHRvIGNuaWMgZGV2aWNlCiAgKgotICogQ3JlYXRlcyBhIG5ldyBGQ29FIGluc3RhbmNlIG9uIHRoZSBnaXZlbiBkZXZpY2Ugd2hpY2ggaW5jbHVkZSBhbGxvY2F0aW5nCi0gKgloYmEgc3RydWN0dXJlLCBzY3NpX2hvc3QgYW5kIGxwb3J0IHN0cnVjdHVyZXMuCisgKiBDcmVhdGVzIGEgbmV3IEZDb0UgaGJhIG9uIHRoZSBnaXZlbiBkZXZpY2UuCisgKgogICovCi1zdGF0aWMgc3RydWN0IGJueDJmY19oYmEgKmJueDJmY19pbnRlcmZhY2VfY3JlYXRlKHN0cnVjdCBjbmljX2RldiAqY25pYykKK3N0YXRpYyBzdHJ1Y3QgYm54MmZjX2hiYSAqYm54MmZjX2hiYV9jcmVhdGUoc3RydWN0IGNuaWNfZGV2ICpjbmljKQogewogCXN0cnVjdCBibngyZmNfaGJhICpoYmE7CiAJaW50IHJjOwpAQCAtMTE5OCw2NSArMTE4Nyw4MyBAQAogCiAJaGJhLT5jbmljID0gY25pYzsKIAlyYyA9IGJueDJmY19iaW5kX3BjaWRldihoYmEpOwotCWlmIChyYykKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY3JlYXRlX2FkYXB0ZXI6ICBiaW5kIGVycm9yXG4iKTsKIAkJZ290byBiaW5kX2VycjsKKwl9CiAJaGJhLT5waHlzX2RldiA9IGNuaWMtPm5ldGRldjsKLQkvKiB3aWxsIGdldCBvdmVyd3JpdHRlbiBhZnRlciB3ZSBkbyB2bGFuIGRpc2NvdmVyeSAqLwotCWhiYS0+bmV0ZGV2ID0gaGJhLT5waHlzX2RldjsKKwloYmEtPm5leHRfY29ubl9pZCA9IDA7CisKKwloYmEtPnRndF9vZmxkX2xpc3QgPQorCQlremFsbG9jKHNpemVvZihzdHJ1Y3QgYm54MmZjX3Jwb3J0ICopICogQk5YMkZDX05VTV9NQVhfU0VTUywKKwkJCUdGUF9LRVJORUwpOworCWlmICghaGJhLT50Z3Rfb2ZsZF9saXN0KSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byBhbGxvY2F0ZSB0Z3Qgb2ZmbG9hZCBsaXN0XG4iKTsKKwkJZ290byB0Z3RvZmxkX2VycjsKKwl9CisKKwloYmEtPm51bV9vZmxkX3Nlc3MgPSAwOworCisJaGJhLT5jbWRfbWdyID0gYm54MmZjX2NtZF9tZ3JfYWxsb2MoaGJhLCBCTlgyRkNfTUlOX1hJRCwKKwkJCQkJCUJOWDJGQ19NQVhfWElEKTsKKwlpZiAoIWhiYS0+Y21kX21ncikgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJlbV9jb25maWc6Ym54MmZjX2NtZF9tZ3JfYWxsb2MgZmFpbGVkXG4iKTsKKwkJZ290byBjbWdyX2VycjsKKwl9CiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZoYmEtPnNodXRkb3duX3dhaXQpOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmhiYS0+ZGVzdHJveV93YWl0KTsKKwlJTklUX0xJU1RfSEVBRCgmaGJhLT52cG9ydHMpOwogCiAJcmV0dXJuIGhiYTsKKworY21ncl9lcnI6CisJa2ZyZWUoaGJhLT50Z3Rfb2ZsZF9saXN0KTsKK3RndG9mbGRfZXJyOgorCWJueDJmY191bmJpbmRfcGNpZGV2KGhiYSk7CiBiaW5kX2VycjoKLQlwcmludGsoS0VSTl9FUlIgUEZYICJjcmVhdGVfaW50ZXJmYWNlOiBiaW5kIGVycm9yXG4iKTsKIAlrZnJlZShoYmEpOwogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgaW50IGJueDJmY19pbnRlcmZhY2Vfc2V0dXAoc3RydWN0IGJueDJmY19oYmEgKmhiYSwKLQkJCQkgIGVudW0gZmlwX3N0YXRlIGZpcF9tb2RlKQorc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmJueDJmY19pbnRlcmZhY2VfY3JlYXRlKHN0cnVjdCBibngyZmNfaGJhICpoYmEsCisJCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQkgICAgICBlbnVtIGZpcF9zdGF0ZSBmaXBfbW9kZSkKIHsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlOwogCWludCByYyA9IDA7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGhiYS0+bmV0ZGV2OwotCXN0cnVjdCBmY29lX2N0bHIgKmZpcCA9ICZoYmEtPmN0bHI7CiAKKwlpbnRlcmZhY2UgPSBremFsbG9jKHNpemVvZigqaW50ZXJmYWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFpbnRlcmZhY2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiVW5hYmxlIHRvIGFsbG9jYXRlIGludGVyZmFjZSBzdHJ1Y3R1cmVcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CiAJZGV2X2hvbGQobmV0ZGV2KTsKLQlrcmVmX2luaXQoJmhiYS0+a3JlZik7Ci0KLQloYmEtPmZsYWdzID0gMDsKKwlrcmVmX2luaXQoJmludGVyZmFjZS0+a3JlZik7CisJaW50ZXJmYWNlLT5oYmEgPSBoYmE7CisJaW50ZXJmYWNlLT5uZXRkZXYgPSBuZXRkZXY7CiAKIAkvKiBJbml0aWFsaXplIEZJUCAqLwotCW1lbXNldChmaXAsIDAsIHNpemVvZigqZmlwKSk7Ci0JZmNvZV9jdGxyX2luaXQoZmlwLCBmaXBfbW9kZSk7Ci0JaGJhLT5jdGxyLnNlbmQgPSBibngyZmNfZmlwX3NlbmQ7Ci0JaGJhLT5jdGxyLnVwZGF0ZV9tYWMgPSBibngyZmNfdXBkYXRlX3NyY19tYWM7Ci0JaGJhLT5jdGxyLmdldF9zcmNfYWRkciA9IGJueDJmY19nZXRfc3JjX21hYzsKLQlzZXRfYml0KEJOWDJGQ19DVExSX0lOSVRfRE9ORSwgJmhiYS0+aW5pdF9kb25lKTsKKwlmY29lX2N0bHJfaW5pdCgmaW50ZXJmYWNlLT5jdGxyLCBmaXBfbW9kZSk7CisJaW50ZXJmYWNlLT5jdGxyLnNlbmQgPSBibngyZmNfZmlwX3NlbmQ7CisJaW50ZXJmYWNlLT5jdGxyLnVwZGF0ZV9tYWMgPSBibngyZmNfdXBkYXRlX3NyY19tYWM7CisJaW50ZXJmYWNlLT5jdGxyLmdldF9zcmNfYWRkciA9IGJueDJmY19nZXRfc3JjX21hYzsKKwlzZXRfYml0KEJOWDJGQ19DVExSX0lOSVRfRE9ORSwgJmludGVyZmFjZS0+aWZfZmxhZ3MpOwogCi0JSU5JVF9MSVNUX0hFQUQoJmhiYS0+dnBvcnRzKTsKLQlyYyA9IGJueDJmY19uZXRkZXZfc2V0dXAoaGJhKTsKLQlpZiAocmMpCi0JCWdvdG8gc2V0dXBfZXJyOworCXJjID0gYm54MmZjX25ldGRldl9zZXR1cChpbnRlcmZhY2UpOworCWlmICghcmMpCisJCXJldHVybiBpbnRlcmZhY2U7CiAKLQloYmEtPm5leHRfY29ubl9pZCA9IDA7Ci0KLQltZW1zZXQoaGJhLT50Z3Rfb2ZsZF9saXN0LCAwLCBzaXplb2YoaGJhLT50Z3Rfb2ZsZF9saXN0KSk7Ci0JaGJhLT5udW1fb2ZsZF9zZXNzID0gMDsKLQotCXJldHVybiAwOwotCi1zZXR1cF9lcnI6Ci0JZmNvZV9jdGxyX2Rlc3Ryb3koJmhiYS0+Y3Rscik7CisJZmNvZV9jdGxyX2Rlc3Ryb3koJmludGVyZmFjZS0+Y3Rscik7CiAJZGV2X3B1dChuZXRkZXYpOwotCWJueDJmY19pbnRlcmZhY2VfcHV0KGhiYSk7Ci0JcmV0dXJuIHJjOworCWtmcmVlKGludGVyZmFjZSk7CisJcmV0dXJuIE5VTEw7CiB9CiAKIC8qKgogICogYm54MmZjX2lmX2NyZWF0ZSAtIENyZWF0ZSBGQ29FIGluc3RhbmNlIG9uIGEgZ2l2ZW4gaW50ZXJmYWNlCiAgKgotICogQGhiYToJRkNvRSBpbnRlcmZhY2UgdG8gY3JlYXRlIGEgbG9jYWwgcG9ydCBvbgorICogQGludGVyZmFjZToJRkNvRSBpbnRlcmZhY2UgdG8gY3JlYXRlIGEgbG9jYWwgcG9ydCBvbgogICogQHBhcmVudDoJRGV2aWNlIHBvaW50ZXIgdG8gYmUgdGhlIHBhcmVudCBpbiBzeXNmcyBmb3IgdGhlIFNDU0kgaG9zdAogICogQG5waXY6CUluZGljYXRlcyBpZiB0aGUgcG9ydCBpcyB2cG9ydCBvciBub3QKICAqCkBAIC0xMjY0LDcgKzEyNzEsNyBAQAogICoKICAqIFJldHVybnM6CUFsbG9jYXRlZCBmY19scG9ydCBvciBhbiBlcnJvciBwb2ludGVyCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgZmNfbHBvcnQgKmJueDJmY19pZl9jcmVhdGUoc3RydWN0IGJueDJmY19oYmEgKmhiYSwKK3N0YXRpYyBzdHJ1Y3QgZmNfbHBvcnQgKmJueDJmY19pZl9jcmVhdGUoc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSwKIAkJCQkgIHN0cnVjdCBkZXZpY2UgKnBhcmVudCwgaW50IG5waXYpCiB7CiAJc3RydWN0IGZjX2xwb3J0CQkqbHBvcnQsICpuX3BvcnQ7CkBAIC0xMjcyLDExICsxMjc5LDEyIEBACiAJc3RydWN0IFNjc2lfSG9zdAkqc2hvc3Q7CiAJc3RydWN0IGZjX3Zwb3J0CQkqdnBvcnQgPSBkZXZfdG9fdnBvcnQocGFyZW50KTsKIAlzdHJ1Y3QgYm54MmZjX2xwb3J0CSpibHBvcnQ7CisJc3RydWN0IGJueDJmY19oYmEJKmhiYTsKIAlpbnQJCQlyYyA9IDA7CiAKIAlibHBvcnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYm54MmZjX2xwb3J0KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFibHBvcnQpIHsKLQkJQk5YMkZDX0hCQV9EQkcoaGJhLT5jdGxyLmxwLCAiVW5hYmxlIHRvIGFsbG9jIGJueDJmY19scG9ydFxuIik7CisJCUJOWDJGQ19IQkFfREJHKGludGVyZmFjZS0+Y3Rsci5scCwgIlVuYWJsZSB0byBhbGxvYyBibHBvcnRcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTEyOTMsNyArMTMwMSw3IEBACiAJc2hvc3QgPSBscG9ydC0+aG9zdDsKIAlwb3J0ID0gbHBvcnRfcHJpdihscG9ydCk7CiAJcG9ydC0+bHBvcnQgPSBscG9ydDsKLQlwb3J0LT5wcml2ID0gaGJhOworCXBvcnQtPnByaXYgPSBpbnRlcmZhY2U7CiAJSU5JVF9XT1JLKCZwb3J0LT5kZXN0cm95X3dvcmssIGJueDJmY19kZXN0cm95X3dvcmspOwogCiAJLyogQ29uZmlndXJlIGZjb2VfcG9ydCAqLwpAQCAtMTMxNyw3ICsxMzI1LDcgQEAKIAlyYyA9IGJueDJmY19zaG9zdF9jb25maWcobHBvcnQsIHBhcmVudCk7CiAJaWYgKHJjKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggIkNvdWxkbnQgY29uZmlndXJlIHNob3N0IGZvciAlc1xuIiwKLQkJCWhiYS0+bmV0ZGV2LT5uYW1lKTsKKwkJCWludGVyZmFjZS0+bmV0ZGV2LT5uYW1lKTsKIAkJZ290byBscF9jb25maWdfZXJyOwogCX0KIApAQCAtMTM0Myw4ICsxMzUxLDkgQEAKIAkJZ290byBzaG9zdF9lcnI7CiAJfQogCi0JYm54MmZjX2ludGVyZmFjZV9nZXQoaGJhKTsKKwlibngyZmNfaW50ZXJmYWNlX2dldChpbnRlcmZhY2UpOwogCisJaGJhID0gaW50ZXJmYWNlLT5oYmE7CiAJc3Bpbl9sb2NrX2JoKCZoYmEtPmhiYV9sb2NrKTsKIAlibHBvcnQtPmxwb3J0ID0gbHBvcnQ7CiAJbGlzdF9hZGRfdGFpbCgmYmxwb3J0LT5saXN0LCAmaGJhLT52cG9ydHMpOwpAQCAtMTM2MSwyMSArMTM3MCwxOSBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCBibngyZmNfbmV0ZGV2X2NsZWFudXAoc3RydWN0IGJueDJmY19oYmEgKmhiYSkKK3N0YXRpYyB2b2lkIGJueDJmY19uZXRkZXZfY2xlYW51cChzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlKQogewogCS8qIERvbnQgbGlzdGVuIGZvciBFdGhlcm5ldCBwYWNrZXRzIGFueW1vcmUgKi8KLQlfX2Rldl9yZW1vdmVfcGFjaygmaGJhLT5mY29lX3BhY2tldF90eXBlKTsKLQlfX2Rldl9yZW1vdmVfcGFjaygmaGJhLT5maXBfcGFja2V0X3R5cGUpOworCV9fZGV2X3JlbW92ZV9wYWNrKCZpbnRlcmZhY2UtPmZjb2VfcGFja2V0X3R5cGUpOworCV9fZGV2X3JlbW92ZV9wYWNrKCZpbnRlcmZhY2UtPmZpcF9wYWNrZXRfdHlwZSk7CiAJc3luY2hyb25pemVfbmV0KCk7CiB9CiAKLXN0YXRpYyB2b2lkIGJueDJmY19pZl9kZXN0cm95KHN0cnVjdCBmY19scG9ydCAqbHBvcnQpCitzdGF0aWMgdm9pZCBibngyZmNfaWZfZGVzdHJveShzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0LCBzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhKQogewogCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQgPSBscG9ydF9wcml2KGxwb3J0KTsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gcG9ydC0+cHJpdjsKIAlzdHJ1Y3QgYm54MmZjX2xwb3J0ICpibHBvcnQsICp0bXA7CiAKLQlCTlgyRkNfSEJBX0RCRyhoYmEtPmN0bHIubHAsICJFTlRFUkVEIGJueDJmY19pZl9kZXN0cm95XG4iKTsKIAkvKiBTdG9wIHRoZSB0cmFuc21pdCByZXRyeSB0aW1lciAqLwogCWRlbF90aW1lcl9zeW5jKCZwb3J0LT50aW1lcik7CiAKQEAgLTE0MDksOCArMTQxNiw2IEBACiAKIAkvKiBSZWxlYXNlIFNjc2lfSG9zdCAqLwogCXNjc2lfaG9zdF9wdXQobHBvcnQtPmhvc3QpOwotCi0JYm54MmZjX2ludGVyZmFjZV9wdXQoaGJhKTsKIH0KIAogLyoqCkBAIC0xNDI1LDQ2ICsxNDMwLDMxIEBACiAgKi8KIHN0YXRpYyBpbnQgYm54MmZjX2Rlc3Ryb3koc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKIHsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gTlVMTDsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcGh5c19kZXY7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IE5VTEw7CisJc3RydWN0IGJueDJmY19oYmEgKmhiYTsKKwlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0OwogCWludCByYyA9IDA7CiAKIAlydG5sX2xvY2soKTsKLQogCW11dGV4X2xvY2soJmJueDJmY19kZXZfbG9jayk7Ci0JLyogb2J0YWluIHBoeXNpY2FsIG5ldGRldiAqLwotCWlmIChuZXRkZXYtPnByaXZfZmxhZ3MgJiBJRkZfODAyXzFRX1ZMQU4pCi0JCXBoeXNfZGV2ID0gdmxhbl9kZXZfcmVhbF9kZXYobmV0ZGV2KTsKLQllbHNlIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTm90IGEgdmxhbiBkZXZpY2VcbiIpOworCisJaW50ZXJmYWNlID0gYm54MmZjX2ludGVyZmFjZV9sb29rdXAobmV0ZGV2KTsKKwlpZiAoIWludGVyZmFjZSB8fCAhaW50ZXJmYWNlLT5jdGxyLmxwKSB7CiAJCXJjID0gLUVOT0RFVjsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiYm54MmZjX2Rlc3Ryb3k6IGludGVyZmFjZSBvciBscG9ydCBub3QgZm91bmRcbiIpOwogCQlnb3RvIG5ldGRldl9lcnI7CiAJfQogCi0JaGJhID0gYm54MmZjX2hiYV9sb29rdXAocGh5c19kZXYpOwotCWlmICghaGJhIHx8ICFoYmEtPmN0bHIubHApIHsKLQkJcmMgPSAtRU5PREVWOwotCQlwcmludGsoS0VSTl9FUlIgUEZYICJibngyZmNfZGVzdHJveTogaGJhIG9yIGxwb3J0IG5vdCBmb3VuZFxuIik7Ci0JCWdvdG8gbmV0ZGV2X2VycjsKLQl9CisJaGJhID0gaW50ZXJmYWNlLT5oYmE7CiAKLQlpZiAoIXRlc3RfYml0KEJOWDJGQ19DUkVBVEVfRE9ORSwgJmhiYS0+aW5pdF9kb25lKSkgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJibngyZmNfZGVzdHJveTogQ3JlYXRlIG5vdCBjYWxsZWRcbiIpOwotCQlnb3RvIG5ldGRldl9lcnI7Ci0JfQorCWJueDJmY19uZXRkZXZfY2xlYW51cChpbnRlcmZhY2UpOworCWxwb3J0ID0gaW50ZXJmYWNlLT5jdGxyLmxwOworCWJueDJmY19zdG9wKGludGVyZmFjZSk7CisJbGlzdF9kZWwoJmludGVyZmFjZS0+bGlzdCk7CisJZGVzdHJveV93b3JrcXVldWUoaW50ZXJmYWNlLT50aW1lcl93b3JrX3F1ZXVlKTsKKwlibngyZmNfaW50ZXJmYWNlX3B1dChpbnRlcmZhY2UpOworCWJueDJmY19pZl9kZXN0cm95KGxwb3J0LCBoYmEpOwogCi0JYm54MmZjX25ldGRldl9jbGVhbnVwKGhiYSk7Ci0KLQlibngyZmNfc3RvcChoYmEpOwotCi0JYm54MmZjX2lmX2Rlc3Ryb3koaGJhLT5jdGxyLmxwKTsKLQotCWRlc3Ryb3lfd29ya3F1ZXVlKGhiYS0+dGltZXJfd29ya19xdWV1ZSk7Ci0KLQlpZiAodGVzdF9iaXQoQk5YMkZDX0ZXX0lOSVRfRE9ORSwgJmhiYS0+aW5pdF9kb25lKSkKLQkJYm54MmZjX2Z3X2Rlc3Ryb3koaGJhKTsKLQotCWNsZWFyX2JpdChCTlgyRkNfQ1JFQVRFX0RPTkUsICZoYmEtPmluaXRfZG9uZSk7CiBuZXRkZXZfZXJyOgogCW11dGV4X3VubG9jaygmYm54MmZjX2Rldl9sb2NrKTsKIAlydG5sX3VubG9jaygpOwpAQCAtMTQ3NSwxNiArMTQ2NSwyMCBAQAogewogCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQ7CiAJc3RydWN0IGZjX2xwb3J0ICpscG9ydDsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlOworCXN0cnVjdCBibngyZmNfaGJhICpoYmE7CiAKIAlwb3J0ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBmY29lX3BvcnQsIGRlc3Ryb3lfd29yayk7CiAJbHBvcnQgPSBwb3J0LT5scG9ydDsKKwlpbnRlcmZhY2UgPSBwb3J0LT5wcml2OworCWhiYSA9IGludGVyZmFjZS0+aGJhOwogCiAJQk5YMkZDX0hCQV9EQkcobHBvcnQsICJFbnRlcmVkIGJueDJmY19kZXN0cm95X3dvcmtcbiIpOwogCiAJYm54MmZjX3BvcnRfc2h1dGRvd24obHBvcnQpOwogCXJ0bmxfbG9jaygpOwogCW11dGV4X2xvY2soJmJueDJmY19kZXZfbG9jayk7Ci0JYm54MmZjX2lmX2Rlc3Ryb3kobHBvcnQpOworCWJueDJmY19pZl9kZXN0cm95KGxwb3J0LCBoYmEpOwogCW11dGV4X3VubG9jaygmYm54MmZjX2Rldl9sb2NrKTsKIAlydG5sX3VubG9jaygpOwogfQpAQCAtMTU1NiwyOCArMTU1MCwyNyBAQAogc3RhdGljIHZvaWQgYm54MmZjX3VscF9zdGFydCh2b2lkICpoYW5kbGUpCiB7CiAJc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IGhhbmRsZTsKLQlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gaGJhLT5jdGxyLmxwOworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2U7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydDsKIAotCUJOWDJGQ19NSVNDX0RCRygiRW50ZXJlZCAlc1xuIiwgX19mdW5jX18pOwogCW11dGV4X2xvY2soJmJueDJmY19kZXZfbG9jayk7CiAKLQlpZiAodGVzdF9iaXQoQk5YMkZDX0ZXX0lOSVRfRE9ORSwgJmhiYS0+aW5pdF9kb25lKSkKLQkJZ290byBzdGFydF9kaXNjOwotCi0JaWYgKHRlc3RfYml0KEJOWDJGQ19DUkVBVEVfRE9ORSwgJmhiYS0+aW5pdF9kb25lKSkKKwlpZiAoIXRlc3RfYml0KEJOWDJGQ19GTEFHX0ZXX0lOSVRfRE9ORSwgJmhiYS0+ZmxhZ3MpKQogCQlibngyZmNfZndfaW5pdChoYmEpOwogCi1zdGFydF9kaXNjOgotCW11dGV4X3VubG9jaygmYm54MmZjX2Rldl9sb2NrKTsKLQogCUJOWDJGQ19NSVNDX0RCRygiYm54MmZjIHN0YXJ0ZWQuXG4iKTsKIAotCS8qIEtpY2sgb2ZmIEZhYnJpYyBkaXNjb3ZlcnkqLwotCWlmICh0ZXN0X2JpdChCTlgyRkNfQ1JFQVRFX0RPTkUsICZoYmEtPmluaXRfZG9uZSkpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidWxwX2luaXQ6IHN0YXJ0IGRpc2NvdmVyeVxuIik7Ci0JCWxwb3J0LT50dC5mcmFtZV9zZW5kID0gYm54MmZjX3htaXQ7Ci0JCWJueDJmY19zdGFydF9kaXNjKGhiYSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShpbnRlcmZhY2UsICZpZl9saXN0LCBsaXN0KSB7CisJCWlmIChpbnRlcmZhY2UtPmhiYSA9PSBoYmEpIHsKKwkJCWxwb3J0ID0gaW50ZXJmYWNlLT5jdGxyLmxwOworCQkJLyogS2ljayBvZmYgRmFicmljIGRpc2NvdmVyeSovCisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJ1bHBfaW5pdDogc3RhcnQgZGlzY292ZXJ5XG4iKTsKKwkJCWxwb3J0LT50dC5mcmFtZV9zZW5kID0gYm54MmZjX3htaXQ7CisJCQlibngyZmNfc3RhcnRfZGlzYyhpbnRlcmZhY2UpOworCQl9CiAJfQorCisJbXV0ZXhfdW5sb2NrKCZibngyZmNfZGV2X2xvY2spOwogfQogCiBzdGF0aWMgdm9pZCBibngyZmNfcG9ydF9zaHV0ZG93bihzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0KQpAQCAtMTU4NywzNyArMTU4MCwyNSBAQAogCWZjX2xwb3J0X2Rlc3Ryb3kobHBvcnQpOwogfQogCi1zdGF0aWMgdm9pZCBibngyZmNfc3RvcChzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhKQorc3RhdGljIHZvaWQgYm54MmZjX3N0b3Aoc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSkKIHsKIAlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0OwogCXN0cnVjdCBmY19scG9ydCAqdnBvcnQ7CiAKLQlCTlgyRkNfTUlTQ19EQkcoIkVOVEVSRUQgJXMgLSBpbml0X2RvbmUgPSAlbGRcbiIsIF9fZnVuY19fLAotCQkgICBoYmEtPmluaXRfZG9uZSk7Ci0JaWYgKHRlc3RfYml0KEJOWDJGQ19GV19JTklUX0RPTkUsICZoYmEtPmluaXRfZG9uZSkgJiYKLQkgICAgdGVzdF9iaXQoQk5YMkZDX0NSRUFURV9ET05FLCAmaGJhLT5pbml0X2RvbmUpKSB7Ci0JCWxwb3J0ID0gaGJhLT5jdGxyLmxwOwotCQlibngyZmNfcG9ydF9zaHV0ZG93bihscG9ydCk7Ci0JCUJOWDJGQ19IQkFfREJHKGxwb3J0LCAiYm54MmZjX3N0b3A6IHdhaXRpbmcgZm9yICVkICIKLQkJCQkib2ZmbG9hZGVkIHNlc3Npb25zXG4iLAotCQkJCWhiYS0+bnVtX29mbGRfc2Vzcyk7Ci0JCXdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShoYmEtPnNodXRkb3duX3dhaXQsCi0JCQkJCSAoaGJhLT5udW1fb2ZsZF9zZXNzID09IDApKTsKLQkJbXV0ZXhfbG9jaygmbHBvcnQtPmxwX211dGV4KTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeSh2cG9ydCwgJmxwb3J0LT52cG9ydHMsIGxpc3QpCi0JCQlmY19ob3N0X3BvcnRfdHlwZSh2cG9ydC0+aG9zdCkgPSBGQ19QT1JUVFlQRV9VTktOT1dOOwotCQltdXRleF91bmxvY2soJmxwb3J0LT5scF9tdXRleCk7Ci0JCWZjX2hvc3RfcG9ydF90eXBlKGxwb3J0LT5ob3N0KSA9IEZDX1BPUlRUWVBFX1VOS05PV047Ci0JCWZjb2VfY3Rscl9saW5rX2Rvd24oJmhiYS0+Y3Rscik7Ci0JCWZjb2VfY2xlYW5fcGVuZGluZ19xdWV1ZShscG9ydCk7CisJaWYgKCF0ZXN0X2JpdChCTlgyRkNfRkxBR19GV19JTklUX0RPTkUsICZpbnRlcmZhY2UtPmhiYS0+ZmxhZ3MpKQorCQlyZXR1cm47CiAKLQkJbXV0ZXhfbG9jaygmaGJhLT5oYmFfbXV0ZXgpOwotCQljbGVhcl9iaXQoQURBUFRFUl9TVEFURV9VUCwgJmhiYS0+YWRhcHRlcl9zdGF0ZSk7Ci0JCWNsZWFyX2JpdChBREFQVEVSX1NUQVRFX0dPSU5HX0RPV04sICZoYmEtPmFkYXB0ZXJfc3RhdGUpOworCWxwb3J0ID0gaW50ZXJmYWNlLT5jdGxyLmxwOworCWJueDJmY19wb3J0X3NodXRkb3duKGxwb3J0KTsKIAotCQljbGVhcl9iaXQoQURBUFRFUl9TVEFURV9SRUFEWSwgJmhiYS0+YWRhcHRlcl9zdGF0ZSk7Ci0JCW11dGV4X3VubG9jaygmaGJhLT5oYmFfbXV0ZXgpOwotCX0KKwltdXRleF9sb2NrKCZscG9ydC0+bHBfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkodnBvcnQsICZscG9ydC0+dnBvcnRzLCBsaXN0KQorCQlmY19ob3N0X3BvcnRfdHlwZSh2cG9ydC0+aG9zdCkgPQorCQkJCQlGQ19QT1JUVFlQRV9VTktOT1dOOworCW11dGV4X3VubG9jaygmbHBvcnQtPmxwX211dGV4KTsKKwlmY19ob3N0X3BvcnRfdHlwZShscG9ydC0+aG9zdCkgPSBGQ19QT1JUVFlQRV9VTktOT1dOOworCWZjb2VfY3Rscl9saW5rX2Rvd24oJmludGVyZmFjZS0+Y3Rscik7CisJZmNvZV9jbGVhbl9wZW5kaW5nX3F1ZXVlKGxwb3J0KTsKIH0KIAogc3RhdGljIGludCBibngyZmNfZndfaW5pdChzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhKQpAQCAtMTY1Niw4ICsxNjM3LDcgQEAKIAl9CiAKIAotCS8qIE1hcmsgSEJBIHRvIGluZGljYXRlIHRoYXQgdGhlIEZXIElOSVQgaXMgZG9uZSAqLwotCXNldF9iaXQoQk5YMkZDX0ZXX0lOSVRfRE9ORSwgJmhiYS0+aW5pdF9kb25lKTsKKwlzZXRfYml0KEJOWDJGQ19GTEFHX0ZXX0lOSVRfRE9ORSwgJmhiYS0+ZmxhZ3MpOwogCXJldHVybiAwOwogCiBlcnJfdW5iaW5kOgpAQCAtMTY2OCw3ICsxNjQ4LDcgQEAKIAogc3RhdGljIHZvaWQgYm54MmZjX2Z3X2Rlc3Ryb3koc3RydWN0IGJueDJmY19oYmEgKmhiYSkKIHsKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEJOWDJGQ19GV19JTklUX0RPTkUsICZoYmEtPmluaXRfZG9uZSkpIHsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEJOWDJGQ19GTEFHX0ZXX0lOSVRfRE9ORSwgJmhiYS0+ZmxhZ3MpKSB7CiAJCWlmIChibngyZmNfc2VuZF9md19mY29lX2Rlc3Ryb3lfbXNnKGhiYSkgPT0gMCkgewogCQkJaW5pdF90aW1lcigmaGJhLT5kZXN0cm95X3RpbWVyKTsKIAkJCWhiYS0+ZGVzdHJveV90aW1lci5leHBpcmVzID0gQk5YMkZDX0ZXX1RJTUVPVVQgKwpAQCAtMTY3Nyw4ICsxNjU3LDggQEAKIAkJCWhiYS0+ZGVzdHJveV90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaGJhOwogCQkJYWRkX3RpbWVyKCZoYmEtPmRlc3Ryb3lfdGltZXIpOwogCQkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKGhiYS0+ZGVzdHJveV93YWl0LAotCQkJCQkJIChoYmEtPmZsYWdzICYKLQkJCQkJCSAgQk5YMkZDX0ZMQUdfREVTVFJPWV9DTVBMKSk7CisJCQkJCXRlc3RfYml0KEJOWDJGQ19GTEFHX0RFU1RST1lfQ01QTCwKKwkJCQkJCSAmaGJhLT5mbGFncykpOwogCQkJLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuICovCiAJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCiAJCQkJZmx1c2hfc2lnbmFscyhjdXJyZW50KTsKQEAgLTE2OTksNDAgKzE2NzksNTcgQEAKICAqLwogc3RhdGljIHZvaWQgYm54MmZjX3VscF9zdG9wKHZvaWQgKmhhbmRsZSkKIHsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gKHN0cnVjdCBibngyZmNfaGJhICopaGFuZGxlOworCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBoYW5kbGU7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZTsKIAogCXByaW50ayhLRVJOX0VSUiAiVUxQX1NUT1BcbiIpOwogCiAJbXV0ZXhfbG9jaygmYm54MmZjX2Rldl9sb2NrKTsKLQlibngyZmNfc3RvcChoYmEpOworCWlmICghdGVzdF9iaXQoQk5YMkZDX0ZMQUdfRldfSU5JVF9ET05FLCAmaGJhLT5mbGFncykpCisJCWdvdG8gZXhpdDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGludGVyZmFjZSwgJmlmX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGludGVyZmFjZS0+aGJhID09IGhiYSkKKwkJCWJueDJmY19zdG9wKGludGVyZmFjZSk7CisJfQorCUJVR19PTihoYmEtPm51bV9vZmxkX3Nlc3MgIT0gMCk7CisKKwltdXRleF9sb2NrKCZoYmEtPmhiYV9tdXRleCk7CisJY2xlYXJfYml0KEFEQVBURVJfU1RBVEVfVVAsICZoYmEtPmFkYXB0ZXJfc3RhdGUpOworCWNsZWFyX2JpdChBREFQVEVSX1NUQVRFX0dPSU5HX0RPV04sCisJCSAgJmhiYS0+YWRhcHRlcl9zdGF0ZSk7CisKKwljbGVhcl9iaXQoQURBUFRFUl9TVEFURV9SRUFEWSwgJmhiYS0+YWRhcHRlcl9zdGF0ZSk7CisJbXV0ZXhfdW5sb2NrKCZoYmEtPmhiYV9tdXRleCk7CisKIAlibngyZmNfZndfZGVzdHJveShoYmEpOworZXhpdDoKIAltdXRleF91bmxvY2soJmJueDJmY19kZXZfbG9jayk7CiB9CiAKLXN0YXRpYyB2b2lkIGJueDJmY19zdGFydF9kaXNjKHN0cnVjdCBibngyZmNfaGJhICpoYmEpCitzdGF0aWMgdm9pZCBibngyZmNfc3RhcnRfZGlzYyhzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlKQogewogCXN0cnVjdCBmY19scG9ydCAqbHBvcnQ7CiAJaW50IHdhaXRfY250ID0gMDsKIAogCUJOWDJGQ19NSVNDX0RCRygiRW50ZXJlZCAlc1xuIiwgX19mdW5jX18pOwogCS8qIEtpY2sgb2ZmIEZJUC9GTE9HSSAqLwotCWlmICghdGVzdF9iaXQoQk5YMkZDX0ZXX0lOSVRfRE9ORSwgJmhiYS0+aW5pdF9kb25lKSkgeworCWlmICghdGVzdF9iaXQoQk5YMkZDX0ZMQUdfRldfSU5JVF9ET05FLCAmaW50ZXJmYWNlLT5oYmEtPmZsYWdzKSkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJJbml0IG5vdCBkb25lIHlldFxuIik7CiAJCXJldHVybjsKIAl9CiAKLQlscG9ydCA9IGhiYS0+Y3Rsci5scDsKKwlscG9ydCA9IGludGVyZmFjZS0+Y3Rsci5scDsKIAlCTlgyRkNfSEJBX0RCRyhscG9ydCwgImNhbGxpbmcgZmNfZmFicmljX2xvZ2luXG4iKTsKIAogCWlmICghYm54MmZjX2xpbmtfb2sobHBvcnQpKSB7CiAJCUJOWDJGQ19IQkFfREJHKGxwb3J0LCAiY3Rscl9saW5rX3VwXG4iKTsKLQkJZmNvZV9jdGxyX2xpbmtfdXAoJmhiYS0+Y3Rscik7CisJCWZjb2VfY3Rscl9saW5rX3VwKCZpbnRlcmZhY2UtPmN0bHIpOwogCQlmY19ob3N0X3BvcnRfdHlwZShscG9ydC0+aG9zdCkgPSBGQ19QT1JUVFlQRV9OUE9SVDsKLQkJc2V0X2JpdChBREFQVEVSX1NUQVRFX1JFQURZLCAmaGJhLT5hZGFwdGVyX3N0YXRlKTsKKwkJc2V0X2JpdChBREFQVEVSX1NUQVRFX1JFQURZLCAmaW50ZXJmYWNlLT5oYmEtPmFkYXB0ZXJfc3RhdGUpOwogCX0KIAogCS8qIHdhaXQgZm9yIHRoZSBGQ0YgdG8gYmUgc2VsZWN0ZWQgYmVmb3JlIGlzc3VpbmcgRkxPR0kgKi8KLQl3aGlsZSAoIWhiYS0+Y3Rsci5zZWxfZmNmKSB7CisJd2hpbGUgKCFpbnRlcmZhY2UtPmN0bHIuc2VsX2ZjZikgewogCQltc2xlZXAoMjUwKTsKIAkJLyogZ2l2ZSB1cCBhZnRlciAzIHNlY3MgKi8KIAkJaWYgKCsrd2FpdF9jbnQgPiAxMikKQEAgLTE3NTgsMTUgKzE3NTUsMTUgQEAKIAogCUJOWDJGQ19NSVNDX0RCRygiRW50ZXJlZCAlc1xuIiwgX19mdW5jX18pOwogCS8qIGJueDJmYyB3b3JrcyBvbmx5IHdoZW4gYm54MnggaXMgbG9hZGVkICovCi0JaWYgKCF0ZXN0X2JpdChDTklDX0ZfQk5YMlhfQ0xBU1MsICZkZXYtPmZsYWdzKSkgeworCWlmICghdGVzdF9iaXQoQ05JQ19GX0JOWDJYX0NMQVNTLCAmZGV2LT5mbGFncykgfHwKKwkgICAgKGRldi0+bWF4X2Zjb2VfY29ubiA9PSAwKSkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJibngyZmMgRkNvRSBub3Qgc3VwcG9ydGVkIG9uICVzLCIKLQkJCQkgICAgIiBmbGFnczogJWx4XG4iLAotCQkJZGV2LT5uZXRkZXYtPm5hbWUsIGRldi0+ZmxhZ3MpOworCQkJCSAgICAiIGZsYWdzOiAlbHggZmNvZV9jb25uOiAlZFxuIiwKKwkJCWRldi0+bmV0ZGV2LT5uYW1lLCBkZXYtPmZsYWdzLCBkZXYtPm1heF9mY29lX2Nvbm4pOwogCQlyZXR1cm47CiAJfQogCi0JLyogQ29uZmlndXJlIEZDb0UgaW50ZXJmYWNlICovCi0JaGJhID0gYm54MmZjX2ludGVyZmFjZV9jcmVhdGUoZGV2KTsKKwloYmEgPSBibngyZmNfaGJhX2NyZWF0ZShkZXYpOwogCWlmICghaGJhKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlggImhiYSBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOwogCQlyZXR1cm47CkBAIC0xNzc0LDcgKzE3NzEsNyBAQAogCiAJLyogQWRkIEhCQSB0byB0aGUgYWRhcHRlciBsaXN0ICovCiAJbXV0ZXhfbG9jaygmYm54MmZjX2Rldl9sb2NrKTsKLQlsaXN0X2FkZF90YWlsKCZoYmEtPmxpbmssICZhZGFwdGVyX2xpc3QpOworCWxpc3RfYWRkX3RhaWwoJmhiYS0+bGlzdCwgJmFkYXB0ZXJfbGlzdCk7CiAJYWRhcHRlcl9jb3VudCsrOwogCW11dGV4X3VubG9jaygmYm54MmZjX2Rldl9sb2NrKTsKIApAQCAtMTc4Miw3ICsxNzc5LDcgQEAKIAlyYyA9IGRldi0+cmVnaXN0ZXJfZGV2aWNlKGRldiwgQ05JQ19VTFBfRkNPRSwKIAkJCQkJCSh2b2lkICopIGhiYSk7CiAJaWYgKHJjKQotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggInJlZ2lzdGVyX2RldmljZSBmYWlsZWQsIHJjID0gJWRcbiIsIHJjKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAicmVnaXN0ZXJfZGV2aWNlIGZhaWxlZCwgcmMgPSAlZFxuIiwgcmMpOwogCWVsc2UKIAkJc2V0X2JpdChCTlgyRkNfQ05JQ19SRUdJU1RFUkVELCAmaGJhLT5yZWdfd2l0aF9jbmljKTsKIH0KQEAgLTE3OTAsNTIgKzE3ODcsMjEgQEAKIAogc3RhdGljIGludCBibngyZmNfZGlzYWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewotCXN0cnVjdCBibngyZmNfaGJhICpoYmE7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKnBoeXNfZGV2OwotCXN0cnVjdCBldGh0b29sX2RydmluZm8gZHJ2aW5mbzsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlOwogCWludCByYyA9IDA7CiAKIAlydG5sX2xvY2soKTsKLQogCW11dGV4X2xvY2soJmJueDJmY19kZXZfbG9jayk7CiAKLQkvKiBvYnRhaW4gcGh5c2ljYWwgbmV0ZGV2ICovCi0JaWYgKG5ldGRldi0+cHJpdl9mbGFncyAmIElGRl84MDJfMVFfVkxBTikKLQkJcGh5c19kZXYgPSB2bGFuX2Rldl9yZWFsX2RldihuZXRkZXYpOwotCWVsc2UgewotCQlwcmludGsoS0VSTl9FUlIgUEZYICJOb3QgYSB2bGFuIGRldmljZVxuIik7CisJaW50ZXJmYWNlID0gYm54MmZjX2ludGVyZmFjZV9sb29rdXAobmV0ZGV2KTsKKwlpZiAoIWludGVyZmFjZSB8fCAhaW50ZXJmYWNlLT5jdGxyLmxwKSB7CiAJCXJjID0gLUVOT0RFVjsKLQkJZ290byBub2RldjsKLQl9Ci0KLQkvKiB2ZXJpZnkgaWYgdGhlIHBoeXNpY2FsIGRldmljZSBpcyBhIG5ldHh0cmVtZTIgZGV2aWNlICovCi0JaWYgKHBoeXNfZGV2LT5ldGh0b29sX29wcyAmJiBwaHlzX2Rldi0+ZXRodG9vbF9vcHMtPmdldF9kcnZpbmZvKSB7Ci0JCW1lbXNldCgmZHJ2aW5mbywgMCwgc2l6ZW9mKGRydmluZm8pKTsKLQkJcGh5c19kZXYtPmV0aHRvb2xfb3BzLT5nZXRfZHJ2aW5mbyhwaHlzX2RldiwgJmRydmluZm8pOwotCQlpZiAoc3RyY21wKGRydmluZm8uZHJpdmVyLCAiYm54MngiKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTm90IGEgbmV0eHRyZW1lMiBkZXZpY2VcbiIpOwotCQkJcmMgPSAtRU5PREVWOwotCQkJZ290byBub2RldjsKLQkJfQorCQlwcmludGsoS0VSTl9FUlIgUEZYICJibngyZmNfZGlzYWJsZTogaW50ZXJmYWNlIG9yIGxwb3J0IG5vdCBmb3VuZFxuIik7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidW5hYmxlIHRvIG9idGFpbiBkcnZfaW5mb1xuIik7Ci0JCXJjID0gLUVOT0RFVjsKLQkJZ290byBub2RldjsKKwkJZmNvZV9jdGxyX2xpbmtfZG93bigmaW50ZXJmYWNlLT5jdGxyKTsKKwkJZmNvZV9jbGVhbl9wZW5kaW5nX3F1ZXVlKGludGVyZmFjZS0+Y3Rsci5scCk7CiAJfQogCi0JcHJpbnRrKEtFUk5fRVJSIFBGWCAicGh5c19kZXYgaXMgbmV0eHRyZW1lMiBkZXZpY2VcbiIpOwotCi0JLyogb2J0YWluIGhiYSBhbmQgaW5pdGlhbGl6ZSByZXN0IG9mIHRoZSBzdHJ1Y3R1cmUgKi8KLQloYmEgPSBibngyZmNfaGJhX2xvb2t1cChwaHlzX2Rldik7Ci0JaWYgKCFoYmEgfHwgIWhiYS0+Y3Rsci5scCkgewotCQlyYyA9IC1FTk9ERVY7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggImJueDJmY19kaXNhYmxlOiBoYmEgb3IgbHBvcnQgbm90IGZvdW5kXG4iKTsKLQl9IGVsc2UgewotCQlmY29lX2N0bHJfbGlua19kb3duKCZoYmEtPmN0bHIpOwotCQlmY29lX2NsZWFuX3BlbmRpbmdfcXVldWUoaGJhLT5jdGxyLmxwKTsKLQl9Ci0KLW5vZGV2OgogCW11dGV4X3VubG9jaygmYm54MmZjX2Rldl9sb2NrKTsKIAlydG5sX3VubG9jaygpOwogCXJldHVybiByYzsKQEAgLTE4NDQsNDggKzE4MTAsMTkgQEAKIAogc3RhdGljIGludCBibngyZmNfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYTsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcGh5c19kZXY7Ci0Jc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyBkcnZpbmZvOworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2U7CiAJaW50IHJjID0gMDsKIAogCXJ0bmxfbG9jaygpOwotCi0JQk5YMkZDX01JU0NfREJHKCJFbnRlcmVkICVzXG4iLCBfX2Z1bmNfXyk7CiAJbXV0ZXhfbG9jaygmYm54MmZjX2Rldl9sb2NrKTsKIAotCS8qIG9idGFpbiBwaHlzaWNhbCBuZXRkZXYgKi8KLQlpZiAobmV0ZGV2LT5wcml2X2ZsYWdzICYgSUZGXzgwMl8xUV9WTEFOKQotCQlwaHlzX2RldiA9IHZsYW5fZGV2X3JlYWxfZGV2KG5ldGRldik7Ci0JZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIk5vdCBhIHZsYW4gZGV2aWNlXG4iKTsKKwlpbnRlcmZhY2UgPSBibngyZmNfaW50ZXJmYWNlX2xvb2t1cChuZXRkZXYpOworCWlmICghaW50ZXJmYWNlIHx8ICFpbnRlcmZhY2UtPmN0bHIubHApIHsKIAkJcmMgPSAtRU5PREVWOwotCQlnb3RvIG5vZGV2OwotCX0KLQkvKiB2ZXJpZnkgaWYgdGhlIHBoeXNpY2FsIGRldmljZSBpcyBhIG5ldHh0cmVtZTIgZGV2aWNlICovCi0JaWYgKHBoeXNfZGV2LT5ldGh0b29sX29wcyAmJiBwaHlzX2Rldi0+ZXRodG9vbF9vcHMtPmdldF9kcnZpbmZvKSB7Ci0JCW1lbXNldCgmZHJ2aW5mbywgMCwgc2l6ZW9mKGRydmluZm8pKTsKLQkJcGh5c19kZXYtPmV0aHRvb2xfb3BzLT5nZXRfZHJ2aW5mbyhwaHlzX2RldiwgJmRydmluZm8pOwotCQlpZiAoc3RyY21wKGRydmluZm8uZHJpdmVyLCAiYm54MngiKSkgewotCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTm90IGEgbmV0eHRyZW1lMiBkZXZpY2VcbiIpOwotCQkJcmMgPSAtRU5PREVWOwotCQkJZ290byBub2RldjsKLQkJfQotCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggInVuYWJsZSB0byBvYnRhaW4gZHJ2X2luZm9cbiIpOwotCQlyYyA9IC1FTk9ERVY7Ci0JCWdvdG8gbm9kZXY7Ci0JfQorCQlwcmludGsoS0VSTl9FUlIgUEZYICJibngyZmNfZW5hYmxlOiBpbnRlcmZhY2Ugb3IgbHBvcnQgbm90IGZvdW5kXG4iKTsKKwl9IGVsc2UgaWYgKCFibngyZmNfbGlua19vayhpbnRlcmZhY2UtPmN0bHIubHApKQorCQlmY29lX2N0bHJfbGlua191cCgmaW50ZXJmYWNlLT5jdGxyKTsKIAotCS8qIG9idGFpbiBoYmEgYW5kIGluaXRpYWxpemUgcmVzdCBvZiB0aGUgc3RydWN0dXJlICovCi0JaGJhID0gYm54MmZjX2hiYV9sb29rdXAocGh5c19kZXYpOwotCWlmICghaGJhIHx8ICFoYmEtPmN0bHIubHApIHsKLQkJcmMgPSAtRU5PREVWOwotCQlwcmludGsoS0VSTl9FUlIgUEZYICJibngyZmNfZW5hYmxlOiBoYmEgb3IgbHBvcnQgbm90IGZvdW5kXG4iKTsKLQl9IGVsc2UgaWYgKCFibngyZmNfbGlua19vayhoYmEtPmN0bHIubHApKQotCQlmY29lX2N0bHJfbGlua191cCgmaGJhLT5jdGxyKTsKLQotbm9kZXY6CiAJbXV0ZXhfdW5sb2NrKCZibngyZmNfZGV2X2xvY2spOwogCXJ0bmxfdW5sb2NrKCk7CiAJcmV0dXJuIHJjOwpAQCAtMTkwMyw2ICsxODQwLDcgQEAKICAqLwogc3RhdGljIGludCBibngyZmNfY3JlYXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGVudW0gZmlwX3N0YXRlIGZpcF9tb2RlKQogeworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2U7CiAJc3RydWN0IGJueDJmY19oYmEgKmhiYTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqcGh5c19kZXY7CiAJc3RydWN0IGZjX2xwb3J0ICpscG9ydDsKQEAgLTE5MzgsNyArMTg3Niw3IEBACiAJaWYgKHBoeXNfZGV2LT5ldGh0b29sX29wcyAmJiBwaHlzX2Rldi0+ZXRodG9vbF9vcHMtPmdldF9kcnZpbmZvKSB7CiAJCW1lbXNldCgmZHJ2aW5mbywgMCwgc2l6ZW9mKGRydmluZm8pKTsKIAkJcGh5c19kZXYtPmV0aHRvb2xfb3BzLT5nZXRfZHJ2aW5mbyhwaHlzX2RldiwgJmRydmluZm8pOwotCQlpZiAoc3RyY21wKGRydmluZm8uZHJpdmVyLCAiYm54MngiKSkgeworCQlpZiAoc3RybmNtcChkcnZpbmZvLmRyaXZlciwgImJueDJ4Iiwgc3RybGVuKCJibngyeCIpKSkgewogCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTm90IGEgbmV0eHRyZW1lMiBkZXZpY2VcbiIpOwogCQkJcmMgPSAtRUlOVkFMOwogCQkJZ290byBuZXRkZXZfZXJyOwpAQCAtMTk0OSw3ICsxODg3LDcgQEAKIAkJZ290byBuZXRkZXZfZXJyOwogCX0KIAotCS8qIG9idGFpbiBoYmEgYW5kIGluaXRpYWxpemUgcmVzdCBvZiB0aGUgc3RydWN0dXJlICovCisJLyogb2J0YWluIGludGVyZmFjZSBhbmQgaW5pdGlhbGl6ZSByZXN0IG9mIHRoZSBzdHJ1Y3R1cmUgKi8KIAloYmEgPSBibngyZmNfaGJhX2xvb2t1cChwaHlzX2Rldik7CiAJaWYgKCFoYmEpIHsKIAkJcmMgPSAtRU5PREVWOwpAQCAtMTk1Nyw2NyArMTg5NSw2MSBAQAogCQlnb3RvIG5ldGRldl9lcnI7CiAJfQogCi0JaWYgKCF0ZXN0X2JpdChCTlgyRkNfRldfSU5JVF9ET05FLCAmaGJhLT5pbml0X2RvbmUpKSB7Ci0JCXJjID0gYm54MmZjX2Z3X2luaXQoaGJhKTsKLQkJaWYgKHJjKQotCQkJZ290byBuZXRkZXZfZXJyOwotCX0KLQotCWlmICh0ZXN0X2JpdChCTlgyRkNfQ1JFQVRFX0RPTkUsICZoYmEtPmluaXRfZG9uZSkpIHsKKwlpZiAoYm54MmZjX2ludGVyZmFjZV9sb29rdXAobmV0ZGV2KSkgewogCQlyYyA9IC1FRVhJU1Q7CiAJCWdvdG8gbmV0ZGV2X2VycjsKIAl9CiAKLQkvKiB1cGRhdGUgbmV0ZGV2IHdpdGggdmxhbiBuZXRkZXYgKi8KLQloYmEtPm5ldGRldiA9IG5ldGRldjsKLQloYmEtPnZsYW5faWQgPSB2bGFuX2lkOwotCWhiYS0+dmxhbl9lbmFibGVkID0gMTsKLQotCXJjID0gYm54MmZjX2ludGVyZmFjZV9zZXR1cChoYmEsIGZpcF9tb2RlKTsKLQlpZiAocmMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiYm54MmZjX2ludGVyZmFjZV9zZXR1cCBmYWlsZWRcbiIpOworCWludGVyZmFjZSA9IGJueDJmY19pbnRlcmZhY2VfY3JlYXRlKGhiYSwgbmV0ZGV2LCBmaXBfbW9kZSk7CisJaWYgKCFpbnRlcmZhY2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiYm54MmZjX2ludGVyZmFjZV9jcmVhdGUgZmFpbGVkXG4iKTsKIAkJZ290byBpZnB1dF9lcnI7CiAJfQogCi0JaGJhLT50aW1lcl93b3JrX3F1ZXVlID0KKwlpbnRlcmZhY2UtPnZsYW5faWQgPSB2bGFuX2lkOworCWludGVyZmFjZS0+dmxhbl9lbmFibGVkID0gMTsKKworCWludGVyZmFjZS0+dGltZXJfd29ya19xdWV1ZSA9CiAJCQljcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgiYm54MmZjX3RpbWVyX3dxIik7Ci0JaWYgKCFoYmEtPnRpbWVyX3dvcmtfcXVldWUpIHsKKwlpZiAoIWludGVyZmFjZS0+dGltZXJfd29ya19xdWV1ZSkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJ1bHBfaW5pdCBjb3VsZCBub3QgY3JlYXRlIHRpbWVyX3dxXG4iKTsKIAkJcmMgPSAtRUlOVkFMOwogCQlnb3RvIGlmcHV0X2VycjsKIAl9CiAKLQlscG9ydCA9IGJueDJmY19pZl9jcmVhdGUoaGJhLCAmaGJhLT5wY2lkZXYtPmRldiwgMCk7CisJbHBvcnQgPSBibngyZmNfaWZfY3JlYXRlKGludGVyZmFjZSwgJmludGVyZmFjZS0+aGJhLT5wY2lkZXYtPmRldiwgMCk7CiAJaWYgKCFscG9ydCkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJGYWlsZWQgdG8gY3JlYXRlIGludGVyZmFjZSAoJXMpXG4iLAogCQkJbmV0ZGV2LT5uYW1lKTsKLQkJYm54MmZjX25ldGRldl9jbGVhbnVwKGhiYSk7CisJCWJueDJmY19uZXRkZXZfY2xlYW51cChpbnRlcmZhY2UpOwogCQlyYyA9IC1FSU5WQUw7CiAJCWdvdG8gaWZfY3JlYXRlX2VycjsKIAl9CiAKKwkvKiBBZGQgaW50ZXJmYWNlIHRvIGlmX2xpc3QgKi8KKwlsaXN0X2FkZF90YWlsKCZpbnRlcmZhY2UtPmxpc3QsICZpZl9saXN0KTsKKwogCWxwb3J0LT5ib290X3RpbWUgPSBqaWZmaWVzOwogCiAJLyogTWFrZSB0aGlzIG1hc3RlciBOX3BvcnQgKi8KLQloYmEtPmN0bHIubHAgPSBscG9ydDsKKwlpbnRlcmZhY2UtPmN0bHIubHAgPSBscG9ydDsKIAotCXNldF9iaXQoQk5YMkZDX0NSRUFURV9ET05FLCAmaGJhLT5pbml0X2RvbmUpOwotCXByaW50ayhLRVJOX0VSUiBQRlggImNyZWF0ZTogU1RBUlQgRElTQ1xuIik7Ci0JYm54MmZjX3N0YXJ0X2Rpc2MoaGJhKTsKKwlCTlgyRkNfSEJBX0RCRyhscG9ydCwgImNyZWF0ZTogU1RBUlQgRElTQ1xuIik7CisJYm54MmZjX3N0YXJ0X2Rpc2MoaW50ZXJmYWNlKTsKIAkvKgogCSAqIFJlbGVhc2UgZnJvbSBrcmVmX2luaXQgaW4gYm54MmZjX2ludGVyZmFjZV9zZXR1cCwgb24gc3VjY2VzcwogCSAqIGxwb3J0IHNob3VsZCBiZSBob2xkaW5nIGEgcmVmZXJlbmNlIHRha2VuIGluIGJueDJmY19pZl9jcmVhdGUKIAkgKi8KLQlibngyZmNfaW50ZXJmYWNlX3B1dChoYmEpOworCWJueDJmY19pbnRlcmZhY2VfcHV0KGludGVyZmFjZSk7CiAJLyogcHV0IG5ldGRldiB0aGF0IHdhcyBoZWxkIHdoaWxlIGNhbGxpbmcgZGV2X2dldF9ieV9uYW1lICovCiAJbXV0ZXhfdW5sb2NrKCZibngyZmNfZGV2X2xvY2spOwogCXJ0bmxfdW5sb2NrKCk7CiAJcmV0dXJuIDA7CiAKIGlmX2NyZWF0ZV9lcnI6Ci0JZGVzdHJveV93b3JrcXVldWUoaGJhLT50aW1lcl93b3JrX3F1ZXVlKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShpbnRlcmZhY2UtPnRpbWVyX3dvcmtfcXVldWUpOwogaWZwdXRfZXJyOgotCWJueDJmY19pbnRlcmZhY2VfcHV0KGhiYSk7CisJYm54MmZjX2ludGVyZmFjZV9wdXQoaW50ZXJmYWNlKTsKIG5ldGRldl9lcnI6CiAJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CiBtb2RfZXJyOgpAQCAtMjAyNyw3ICsxOTU5LDcgQEAKIH0KIAogLyoqCi0gKiBibngyZmNfZmluZF9oYmFfZm9yX2NuaWMgLSBtYXBzIGNuaWMgaW5zdGFuY2UgdG8gYm54MmZjIGFkYXB0ZXIgaW5zdGFuY2UKKyAqIGJueDJmY19maW5kX2hiYV9mb3JfY25pYyAtIG1hcHMgY25pYyBpbnN0YW5jZSB0byBibngyZmMgaGJhIGluc3RhbmNlCiAgKgogICogQGNuaWM6CVBvaW50ZXIgdG8gY25pYyBkZXZpY2UgaW5zdGFuY2UKICAqCkBAIC0yMDQ3LDE5ICsxOTc5LDMwIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgYm54MmZjX2hiYSAqYm54MmZjX2hiYV9sb29rdXAoc3RydWN0IG5ldF9kZXZpY2UgKnBoeXNfZGV2KQorc3RhdGljIHN0cnVjdCBibngyZmNfaW50ZXJmYWNlICpibngyZmNfaW50ZXJmYWNlX2xvb2t1cChzdHJ1Y3QgbmV0X2RldmljZQorCQkJCQkJCSpuZXRkZXYpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0ZW1wOworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2U7CisKKwkvKiBDYWxsZWQgd2l0aCBibngyZmNfZGV2X2xvY2sgaGVsZCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoaW50ZXJmYWNlLCAmaWZfbGlzdCwgbGlzdCkgeworCQlpZiAoaW50ZXJmYWNlLT5uZXRkZXYgPT0gbmV0ZGV2KQorCQkJcmV0dXJuIGludGVyZmFjZTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYm54MmZjX2hiYSAqYm54MmZjX2hiYV9sb29rdXAoc3RydWN0IG5ldF9kZXZpY2UKKwkJCQkJCSAgICAgICpwaHlzX2RldikKK3sKIAlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhOwogCiAJLyogQ2FsbGVkIHdpdGggYm54MmZjX2Rldl9sb2NrIGhlbGQgKi8KLQlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdCwgdGVtcCwgJmFkYXB0ZXJfbGlzdCkgewotCQloYmEgPSAoc3RydWN0IGJueDJmY19oYmEgKilsaXN0OworCWxpc3RfZm9yX2VhY2hfZW50cnkoaGJhLCAmYWRhcHRlcl9saXN0LCBsaXN0KSB7CiAJCWlmIChoYmEtPnBoeXNfZGV2ID09IHBoeXNfZGV2KQogCQkJcmV0dXJuIGhiYTsKIAl9Ci0JcHJpbnRrKEtFUk5fRVJSIFBGWCAiaGJhX2xvb2t1cDogaGJhIE5VTExcbiIpOworCXByaW50ayhLRVJOX0VSUiBQRlggImFkYXB0ZXJfbG9va3VwOiBoYmEgTlVMTFxuIik7CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTIwNzEsNiArMjAxNCw4IEBACiBzdGF0aWMgdm9pZCBibngyZmNfdWxwX2V4aXQoc3RydWN0IGNuaWNfZGV2ICpkZXYpCiB7CiAJc3RydWN0IGJueDJmY19oYmEgKmhiYTsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlLCAqdG1wOworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQ7CiAKIAlCTlgyRkNfTUlTQ19EQkcoIkVudGVyZWQgYm54MmZjX3VscF9leGl0XG4iKTsKIApAQCAtMjA4OSwxMyArMjAzNCwyMCBAQAogCQlyZXR1cm47CiAJfQogCi0JbGlzdF9kZWxfaW5pdCgmaGJhLT5saW5rKTsKKwlsaXN0X2RlbF9pbml0KCZoYmEtPmxpc3QpOwogCWFkYXB0ZXJfY291bnQtLTsKIAotCWlmICh0ZXN0X2JpdChCTlgyRkNfQ1JFQVRFX0RPTkUsICZoYmEtPmluaXRfZG9uZSkpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaW50ZXJmYWNlLCB0bXAsICZpZl9saXN0LCBsaXN0KSB7CiAJCS8qIGRlc3Ryb3kgbm90IGNhbGxlZCB5ZXQsIG1vdmUgdG8gcXVpZXNjZWQgbGlzdCAqLwotCQlibngyZmNfbmV0ZGV2X2NsZWFudXAoaGJhKTsKLQkJYm54MmZjX2lmX2Rlc3Ryb3koaGJhLT5jdGxyLmxwKTsKKwkJaWYgKGludGVyZmFjZS0+aGJhID09IGhiYSkgeworCQkJYm54MmZjX25ldGRldl9jbGVhbnVwKGludGVyZmFjZSk7CisJCQlibngyZmNfc3RvcChpbnRlcmZhY2UpOworCisJCQlsaXN0X2RlbCgmaW50ZXJmYWNlLT5saXN0KTsKKwkJCWxwb3J0ID0gaW50ZXJmYWNlLT5jdGxyLmxwOworCQkJYm54MmZjX2ludGVyZmFjZV9wdXQoaW50ZXJmYWNlKTsKKwkJCWJueDJmY19pZl9kZXN0cm95KGxwb3J0LCBoYmEpOworCQl9CiAJfQogCW11dGV4X3VubG9jaygmYm54MmZjX2Rldl9sb2NrKTsKIApAQCAtMjEwMyw3ICsyMDU1LDcgQEAKIAkvKiB1bnJlZ2lzdGVyIGNuaWMgZGV2aWNlICovCiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChCTlgyRkNfQ05JQ19SRUdJU1RFUkVELCAmaGJhLT5yZWdfd2l0aF9jbmljKSkKIAkJaGJhLT5jbmljLT51bnJlZ2lzdGVyX2RldmljZShoYmEtPmNuaWMsIENOSUNfVUxQX0ZDT0UpOwotCWJueDJmY19pbnRlcmZhY2VfZGVzdHJveShoYmEpOworCWJueDJmY19oYmFfZGVzdHJveShoYmEpOwogfQogCiAvKioKQEAgLTIyNTksNiArMjIxMSw3IEBACiAJfQogCiAJSU5JVF9MSVNUX0hFQUQoJmFkYXB0ZXJfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmlmX2xpc3QpOwogCW11dGV4X2luaXQoJmJueDJmY19kZXZfbG9jayk7CiAJYWRhcHRlcl9jb3VudCA9IDA7CiAKQEAgLTIzMzYsMTYgKzIyODksMTcgQEAKIAltdXRleF91bmxvY2soJmJueDJmY19kZXZfbG9jayk7CiAKIAkvKiBVbnJlZ2lzdGVyIHdpdGggY25pYyAqLwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShoYmEsIG5leHQsICZ0b19iZV9kZWxldGVkLCBsaW5rKSB7Ci0JCWxpc3RfZGVsX2luaXQoJmhiYS0+bGluayk7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIk1PRF9FWElUOmRlc3Ryb3kgaGJhID0gMHglcCwga3JlZiA9ICVkXG4iLAotCQkJaGJhLCBhdG9taWNfcmVhZCgmaGJhLT5rcmVmLnJlZmNvdW50KSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGhiYSwgbmV4dCwgJnRvX2JlX2RlbGV0ZWQsIGxpc3QpIHsKKwkJbGlzdF9kZWxfaW5pdCgmaGJhLT5saXN0KTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiTU9EX0VYSVQ6ZGVzdHJveSBoYmEgPSAweCVwXG4iLAorCQkgICAgICAgaGJhKTsKIAkJYm54MmZjX3VscF9zdG9wKGhiYSk7CiAJCS8qIHVucmVnaXN0ZXIgY25pYyBkZXZpY2UgKi8KIAkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChCTlgyRkNfQ05JQ19SRUdJU1RFUkVELAogCQkJCSAgICAgICAmaGJhLT5yZWdfd2l0aF9jbmljKSkKLQkJCWhiYS0+Y25pYy0+dW5yZWdpc3Rlcl9kZXZpY2UoaGJhLT5jbmljLCBDTklDX1VMUF9GQ09FKTsKLQkJYm54MmZjX2ludGVyZmFjZV9kZXN0cm95KGhiYSk7CisJCQloYmEtPmNuaWMtPnVucmVnaXN0ZXJfZGV2aWNlKGhiYS0+Y25pYywKKwkJCQkJCQkgQ05JQ19VTFBfRkNPRSk7CisJCWJueDJmY19oYmFfZGVzdHJveShoYmEpOwogCX0KIAljbmljX3VucmVnaXN0ZXJfZHJpdmVyKENOSUNfVUxQX0ZDT0UpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19od2kuYyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2h3aS5jCmluZGV4IDA5YmRkOWIuLjcyY2ZiMTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2h3aS5jCisrKyBiL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2h3aS5jCkBAIC0yLDcgKzIsNyBAQAogICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBjb2RlIHRoYXQgbG93IGxldmVsIGZ1bmN0aW9ucyB0aGF0IGludGVyYWN0CiAgKiB3aXRoIDU3NzEyIEZDb0UgZmlybXdhcmUuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDA4IC0gMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDA4IC0gMjAxMSBCcm9hZGNvbSBDb3Jwb3JhdGlvbgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtMjMsNyArMjMsNyBAQAogCQkJCQkJc3RydWN0IGZjb2Vfa2NxZSAqb2ZsZF9rY3FlKTsKIHN0YXRpYyB2b2lkIGJueDJmY19pbml0X2ZhaWx1cmUoc3RydWN0IGJueDJmY19oYmEgKmhiYSwgdTMyIGVycl9jb2RlKTsKIHN0YXRpYyB2b2lkIGJueDJmY19wcm9jZXNzX2Nvbm5fZGVzdHJveV9jbXBsKHN0cnVjdCBibngyZmNfaGJhICpoYmEsCi0JCQkJCXN0cnVjdCBmY29lX2tjcWUgKmNvbm5fZGVzdHJveSk7CisJCQkJCXN0cnVjdCBmY29lX2tjcWUgKmRlc3Ryb3lfa2NxZSk7CiAKIGludCBibngyZmNfc2VuZF9zdGF0X3JlcShzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhKQogewpAQCAtNjcsNyArNjcsNyBAQAogCWludCByYyA9IDA7CiAKIAlpZiAoIWhiYS0+Y25pYykgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggImhiYS0+Y25pYyBOVUxMIGR1cmluZyBmY29lIGZ3IGluaXRcbiIpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJoYmEtPmNuaWMgTlVMTCBkdXJpbmcgZmNvZSBmdyBpbml0XG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0xMDMsNiArMTAzLDcgQEAKIAlmY29lX2luaXQyLmhzaV9tYWpvcl92ZXJzaW9uID0gRkNPRV9IU0lfTUFKT1JfVkVSU0lPTjsKIAlmY29lX2luaXQyLmhzaV9taW5vcl92ZXJzaW9uID0gRkNPRV9IU0lfTUlOT1JfVkVSU0lPTjsKIAorCiAJZmNvZV9pbml0Mi5oYXNoX3RibF9wYmxfYWRkcl9sbyA9ICh1MzIpIGhiYS0+aGFzaF90YmxfcGJsX2RtYTsKIAlmY29lX2luaXQyLmhhc2hfdGJsX3BibF9hZGRyX2hpID0gKHUzMikKIAkJCQkJICAgKCh1NjQpIGhiYS0+aGFzaF90YmxfcGJsX2RtYSA+PiAzMik7CkBAIC0xNjUsNyArMTY2LDggQEAKIAkJCQkJc3RydWN0IGJueDJmY19ycG9ydCAqdGd0KQogewogCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBwb3J0LT5scG9ydDsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gaW50ZXJmYWNlLT5oYmE7CiAJc3RydWN0IGt3cWUgKmt3cWVfYXJyWzRdOwogCXN0cnVjdCBmY29lX2t3cWVfY29ubl9vZmZsb2FkMSBvZmxkX3JlcTE7CiAJc3RydWN0IGZjb2Vfa3dxZV9jb25uX29mZmxvYWQyIG9mbGRfcmVxMjsKQEAgLTIyNyw3ICsyMjksNyBAQAogCW9mbGRfcmVxMy5oZHIuZmxhZ3MgPQogCQkoRkNPRV9LV1FFX0xBWUVSX0NPREUgPDwgRkNPRV9LV1FFX0hFQURFUl9MQVlFUl9DT0RFX1NISUZUKTsKIAotCW9mbGRfcmVxMy52bGFuX3RhZyA9IGhiYS0+dmxhbl9pZCA8PAorCW9mbGRfcmVxMy52bGFuX3RhZyA9IGludGVyZmFjZS0+dmxhbl9pZCA8PAogCQkJCUZDT0VfS1dRRV9DT05OX09GRkxPQUQzX1ZMQU5fSURfU0hJRlQ7CiAJb2ZsZF9yZXEzLnZsYW5fdGFnIHw9IDMgPDwgRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfUFJJT1JJVFlfU0hJRlQ7CiAKQEAgLTI3Nyw4ICsyNzksMjAgQEAKIAlvZmxkX3JlcTMuZmxhZ3MgfD0gKCgocmRhdGEtPnNwX2ZlYXR1cmVzICYgRkNfU1BfRlRfU0VRQykgPyAxIDogMCkgPDwKIAkJCSAgICAgRkNPRV9LV1FFX0NPTk5fT0ZGTE9BRDNfQl9DT05UX0lOQ1JfU0VRX0NOVF9TSElGVCk7CiAKKwkvKgorCSAqIEluZm8gZnJvbSBQUkxJIHJlc3BvbnNlLCB0aGlzIGluZm8gaXMgdXNlZCBmb3Igc2VxdWVuY2UgbGV2ZWwgZXJyb3IKKwkgKiByZWNvdmVyeSBzdXBwb3J0CisJICovCisJaWYgKHRndC0+ZGV2X3R5cGUgPT0gVFlQRV9UQVBFKSB7CisJCW9mbGRfcmVxMy5mbGFncyB8PSAxIDw8CisJCQkJICAgIEZDT0VfS1dRRV9DT05OX09GRkxPQUQzX0JfQ09ORl9SRVFfU0hJRlQ7CisJCW9mbGRfcmVxMy5mbGFncyB8PSAoKChyZGF0YS0+ZmxhZ3MgJiBGQ19SUF9GTEFHU19SRUNfU1VQUE9SVEVEKQorCQkJCSAgICA/IDEgOiAwKSA8PAorCQkJCSAgICBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19CX1JFQ19WQUxJRF9TSElGVCk7CisJfQorCiAJLyogdmxhbiBmbGFnICovCi0Jb2ZsZF9yZXEzLmZsYWdzIHw9IChoYmEtPnZsYW5fZW5hYmxlZCA8PAorCW9mbGRfcmVxMy5mbGFncyB8PSAoaW50ZXJmYWNlLT52bGFuX2VuYWJsZWQgPDwKIAkJCSAgICBGQ09FX0tXUUVfQ09OTl9PRkZMT0FEM19CX1ZMQU5fRkxBR19TSElGVCk7CiAKIAkvKiBDMl9WQUxJRCBhbmQgQUNLIGZsYWdzIGFyZSBub3Qgc2V0IGFzIHRoZXkgYXJlIG5vdCBzdXBwcG9ydGVkICovCkBAIC0zMDAsMTIgKzMxNCwxMyBAQAogCW9mbGRfcmVxNC5zcmNfbWFjX2FkZHJfbWlkWzFdID0gIHBvcnQtPmRhdGFfc3JjX2FkZHJbMl07CiAJb2ZsZF9yZXE0LnNyY19tYWNfYWRkcl9oaVswXSA9ICBwb3J0LT5kYXRhX3NyY19hZGRyWzFdOwogCW9mbGRfcmVxNC5zcmNfbWFjX2FkZHJfaGlbMV0gPSAgcG9ydC0+ZGF0YV9zcmNfYWRkclswXTsKLQlvZmxkX3JlcTQuZHN0X21hY19hZGRyX2xvWzBdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbNV07LyogZmNmIG1hYyAqLwotCW9mbGRfcmVxNC5kc3RfbWFjX2FkZHJfbG9bMV0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkcls0XTsKLQlvZmxkX3JlcTQuZHN0X21hY19hZGRyX21pZFswXSA9ICBoYmEtPmN0bHIuZGVzdF9hZGRyWzNdOwotCW9mbGRfcmVxNC5kc3RfbWFjX2FkZHJfbWlkWzFdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbMl07Ci0Jb2ZsZF9yZXE0LmRzdF9tYWNfYWRkcl9oaVswXSA9ICBoYmEtPmN0bHIuZGVzdF9hZGRyWzFdOwotCW9mbGRfcmVxNC5kc3RfbWFjX2FkZHJfaGlbMV0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkclswXTsKKwlvZmxkX3JlcTQuZHN0X21hY19hZGRyX2xvWzBdID0gIGludGVyZmFjZS0+Y3Rsci5kZXN0X2FkZHJbNV07CisJCQkJCQkJLyogZmNmIG1hYyAqLworCW9mbGRfcmVxNC5kc3RfbWFjX2FkZHJfbG9bMV0gPSAgaW50ZXJmYWNlLT5jdGxyLmRlc3RfYWRkcls0XTsKKwlvZmxkX3JlcTQuZHN0X21hY19hZGRyX21pZFswXSA9ICBpbnRlcmZhY2UtPmN0bHIuZGVzdF9hZGRyWzNdOworCW9mbGRfcmVxNC5kc3RfbWFjX2FkZHJfbWlkWzFdID0gIGludGVyZmFjZS0+Y3Rsci5kZXN0X2FkZHJbMl07CisJb2ZsZF9yZXE0LmRzdF9tYWNfYWRkcl9oaVswXSA9ICBpbnRlcmZhY2UtPmN0bHIuZGVzdF9hZGRyWzFdOworCW9mbGRfcmVxNC5kc3RfbWFjX2FkZHJfaGlbMV0gPSAgaW50ZXJmYWNlLT5jdGxyLmRlc3RfYWRkclswXTsKIAogCW9mbGRfcmVxNC5sY3FfYWRkcl9sbyA9ICh1MzIpIHRndC0+bGNxX2RtYTsKIAlvZmxkX3JlcTQubGNxX2FkZHJfaGkgPSAodTMyKSgodTY0KSB0Z3QtPmxjcV9kbWEgPj4gMzIpOwpAQCAtMzM1LDcgKzM1MCw4IEBACiAJCQkJCXN0cnVjdCBibngyZmNfcnBvcnQgKnRndCkKIHsKIAlzdHJ1Y3Qga3dxZSAqa3dxZV9hcnJbMl07Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IGludGVyZmFjZS0+aGJhOwogCXN0cnVjdCBmY29lX2t3cWVfY29ubl9lbmFibGVfZGlzYWJsZSBlbmJsX3JlcTsKIAlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gcG9ydC0+bHBvcnQ7CiAJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IHRndC0+cnBvcnQ7CkBAIC0zNTgsMTIgKzM3NCwxMiBAQAogCWVuYmxfcmVxLnNyY19tYWNfYWRkcl9oaVsxXSA9ICBwb3J0LT5kYXRhX3NyY19hZGRyWzBdOwogCW1lbWNweSh0Z3QtPnNyY19hZGRyLCBwb3J0LT5kYXRhX3NyY19hZGRyLCBFVEhfQUxFTik7CiAKLQllbmJsX3JlcS5kc3RfbWFjX2FkZHJfbG9bMF0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkcls1XTsvKiBmY2YgbWFjICovCi0JZW5ibF9yZXEuZHN0X21hY19hZGRyX2xvWzFdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbNF07Ci0JZW5ibF9yZXEuZHN0X21hY19hZGRyX21pZFswXSA9ICBoYmEtPmN0bHIuZGVzdF9hZGRyWzNdOwotCWVuYmxfcmVxLmRzdF9tYWNfYWRkcl9taWRbMV0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkclsyXTsKLQllbmJsX3JlcS5kc3RfbWFjX2FkZHJfaGlbMF0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkclsxXTsKLQllbmJsX3JlcS5kc3RfbWFjX2FkZHJfaGlbMV0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkclswXTsKKwllbmJsX3JlcS5kc3RfbWFjX2FkZHJfbG9bMF0gPSAgaW50ZXJmYWNlLT5jdGxyLmRlc3RfYWRkcls1XTsKKwllbmJsX3JlcS5kc3RfbWFjX2FkZHJfbG9bMV0gPSAgaW50ZXJmYWNlLT5jdGxyLmRlc3RfYWRkcls0XTsKKwllbmJsX3JlcS5kc3RfbWFjX2FkZHJfbWlkWzBdID0gIGludGVyZmFjZS0+Y3Rsci5kZXN0X2FkZHJbM107CisJZW5ibF9yZXEuZHN0X21hY19hZGRyX21pZFsxXSA9ICBpbnRlcmZhY2UtPmN0bHIuZGVzdF9hZGRyWzJdOworCWVuYmxfcmVxLmRzdF9tYWNfYWRkcl9oaVswXSA9ICBpbnRlcmZhY2UtPmN0bHIuZGVzdF9hZGRyWzFdOworCWVuYmxfcmVxLmRzdF9tYWNfYWRkcl9oaVsxXSA9ICBpbnRlcmZhY2UtPmN0bHIuZGVzdF9hZGRyWzBdOwogCiAJcG9ydF9pZCA9IGZjX2hvc3RfcG9ydF9pZChscG9ydC0+aG9zdCk7CiAJaWYgKHBvcnRfaWQgIT0gdGd0LT5zaWQpIHsKQEAgLTM3OSwxMCArMzk1LDEwIEBACiAJZW5ibF9yZXEuZF9pZFswXSA9IChwb3J0X2lkICYgMHgwMDAwMDBGRik7CiAJZW5ibF9yZXEuZF9pZFsxXSA9IChwb3J0X2lkICYgMHgwMDAwRkYwMCkgPj4gODsKIAllbmJsX3JlcS5kX2lkWzJdID0gKHBvcnRfaWQgJiAweDAwRkYwMDAwKSA+PiAxNjsKLQllbmJsX3JlcS52bGFuX3RhZyA9IGhiYS0+dmxhbl9pZCA8PAorCWVuYmxfcmVxLnZsYW5fdGFnID0gaW50ZXJmYWNlLT52bGFuX2lkIDw8CiAJCQkJRkNPRV9LV1FFX0NPTk5fRU5BQkxFX0RJU0FCTEVfVkxBTl9JRF9TSElGVDsKIAllbmJsX3JlcS52bGFuX3RhZyB8PSAzIDw8IEZDT0VfS1dRRV9DT05OX0VOQUJMRV9ESVNBQkxFX1BSSU9SSVRZX1NISUZUOwotCWVuYmxfcmVxLnZsYW5fZmxhZyA9IGhiYS0+dmxhbl9lbmFibGVkOworCWVuYmxfcmVxLnZsYW5fZmxhZyA9IGludGVyZmFjZS0+dmxhbl9lbmFibGVkOwogCWVuYmxfcmVxLmNvbnRleHRfaWQgPSB0Z3QtPmNvbnRleHRfaWQ7CiAJZW5ibF9yZXEuY29ubl9pZCA9IHRndC0+ZmNvZV9jb25uX2lkOwogCkBAIC00MDIsNyArNDE4LDggQEAKIGludCBibngyZmNfc2VuZF9zZXNzaW9uX2Rpc2FibGVfcmVxKHN0cnVjdCBmY29lX3BvcnQgKnBvcnQsCiAJCQkJICAgIHN0cnVjdCBibngyZmNfcnBvcnQgKnRndCkKIHsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gaW50ZXJmYWNlLT5oYmE7CiAJc3RydWN0IGZjb2Vfa3dxZV9jb25uX2VuYWJsZV9kaXNhYmxlIGRpc2FibGVfcmVxOwogCXN0cnVjdCBrd3FlICprd3FlX2FyclsyXTsKIAlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gdGd0LT5ycG9ydDsKQEAgLTQyMywxMiArNDQwLDEyIEBACiAJZGlzYWJsZV9yZXEuc3JjX21hY19hZGRyX2hpWzBdID0gIHRndC0+c3JjX2FkZHJbMV07CiAJZGlzYWJsZV9yZXEuc3JjX21hY19hZGRyX2hpWzFdID0gIHRndC0+c3JjX2FkZHJbMF07CiAKLQlkaXNhYmxlX3JlcS5kc3RfbWFjX2FkZHJfbG9bMF0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkcls1XTsvKiBmY2YgbWFjICovCi0JZGlzYWJsZV9yZXEuZHN0X21hY19hZGRyX2xvWzFdID0gIGhiYS0+Y3Rsci5kZXN0X2FkZHJbNF07Ci0JZGlzYWJsZV9yZXEuZHN0X21hY19hZGRyX21pZFswXSA9ICBoYmEtPmN0bHIuZGVzdF9hZGRyWzNdOwotCWRpc2FibGVfcmVxLmRzdF9tYWNfYWRkcl9taWRbMV0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkclsyXTsKLQlkaXNhYmxlX3JlcS5kc3RfbWFjX2FkZHJfaGlbMF0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkclsxXTsKLQlkaXNhYmxlX3JlcS5kc3RfbWFjX2FkZHJfaGlbMV0gPSAgaGJhLT5jdGxyLmRlc3RfYWRkclswXTsKKwlkaXNhYmxlX3JlcS5kc3RfbWFjX2FkZHJfbG9bMF0gPSAgaW50ZXJmYWNlLT5jdGxyLmRlc3RfYWRkcls1XTsKKwlkaXNhYmxlX3JlcS5kc3RfbWFjX2FkZHJfbG9bMV0gPSAgaW50ZXJmYWNlLT5jdGxyLmRlc3RfYWRkcls0XTsKKwlkaXNhYmxlX3JlcS5kc3RfbWFjX2FkZHJfbWlkWzBdID0gIGludGVyZmFjZS0+Y3Rsci5kZXN0X2FkZHJbM107CisJZGlzYWJsZV9yZXEuZHN0X21hY19hZGRyX21pZFsxXSA9ICBpbnRlcmZhY2UtPmN0bHIuZGVzdF9hZGRyWzJdOworCWRpc2FibGVfcmVxLmRzdF9tYWNfYWRkcl9oaVswXSA9ICBpbnRlcmZhY2UtPmN0bHIuZGVzdF9hZGRyWzFdOworCWRpc2FibGVfcmVxLmRzdF9tYWNfYWRkcl9oaVsxXSA9ICBpbnRlcmZhY2UtPmN0bHIuZGVzdF9hZGRyWzBdOwogCiAJcG9ydF9pZCA9IHRndC0+c2lkOwogCWRpc2FibGVfcmVxLnNfaWRbMF0gPSAocG9ydF9pZCAmIDB4MDAwMDAwRkYpOwpAQCAtNDQyLDExICs0NTksMTEgQEAKIAlkaXNhYmxlX3JlcS5kX2lkWzJdID0gKHBvcnRfaWQgJiAweDAwRkYwMDAwKSA+PiAxNjsKIAlkaXNhYmxlX3JlcS5jb250ZXh0X2lkID0gdGd0LT5jb250ZXh0X2lkOwogCWRpc2FibGVfcmVxLmNvbm5faWQgPSB0Z3QtPmZjb2VfY29ubl9pZDsKLQlkaXNhYmxlX3JlcS52bGFuX3RhZyA9IGhiYS0+dmxhbl9pZCA8PAorCWRpc2FibGVfcmVxLnZsYW5fdGFnID0gaW50ZXJmYWNlLT52bGFuX2lkIDw8CiAJCQkJRkNPRV9LV1FFX0NPTk5fRU5BQkxFX0RJU0FCTEVfVkxBTl9JRF9TSElGVDsKIAlkaXNhYmxlX3JlcS52bGFuX3RhZyB8PQogCQkJMyA8PCBGQ09FX0tXUUVfQ09OTl9FTkFCTEVfRElTQUJMRV9QUklPUklUWV9TSElGVDsKLQlkaXNhYmxlX3JlcS52bGFuX2ZsYWcgPSBoYmEtPnZsYW5fZW5hYmxlZDsKKwlkaXNhYmxlX3JlcS52bGFuX2ZsYWcgPSBpbnRlcmZhY2UtPnZsYW5fZW5hYmxlZDsKIAogCWt3cWVfYXJyWzBdID0gKHN0cnVjdCBrd3FlICopICZkaXNhYmxlX3JlcTsKIApAQCAtNTI1LDcgKzU0Miw3IEBACiB7CiAJc3RydWN0IGZjb2VfcG9ydCAqcG9ydCA9IHRndC0+cG9ydDsKIAlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gcG9ydC0+bHBvcnQ7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IHBvcnQtPnByaXY7CiAJc3RydWN0IGJueDJmY191bnNvbF9lbHMgKnVuc29sX2VsczsKIAlzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICpmaDsKIAlzdHJ1Y3QgZmNfZnJhbWUgKmZwOwpAQCAtNTg2LDcgKzYwMyw3IEBACiAJCWZyX2VvZihmcCkgPSBGQ19FT0ZfVDsKIAkJZnJfY3JjKGZwKSA9IGNwdV90b19sZTMyKH5jcmMpOwogCQl1bnNvbF9lbHMtPmxwb3J0ID0gbHBvcnQ7Ci0JCXVuc29sX2Vscy0+aGJhID0gaGJhOworCQl1bnNvbF9lbHMtPmhiYSA9IGludGVyZmFjZS0+aGJhOwogCQl1bnNvbF9lbHMtPmZwID0gZnA7CiAJCUlOSVRfV09SSygmdW5zb2xfZWxzLT51bnNvbF9lbHNfd29yaywgYm54MmZjX3Vuc29sX2Vsc193b3JrKTsKIAkJcXVldWVfd29yayhibngyZmNfd3EsICZ1bnNvbF9lbHMtPnVuc29sX2Vsc193b3JrKTsKQEAgLTYwOCw5ICs2MjUsMTIgQEAKIAl1MzIgZnJhbWVfbGVuLCBsZW47CiAJc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcSA9IE5VTEw7CiAJc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKnRhc2ssICp0YXNrX3BhZ2U7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IHRndC0+cG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gdGd0LT5wb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBpbnRlcmZhY2UtPmhiYTsKIAlpbnQgdGFza19pZHgsIGluZGV4OwogCWludCByYyA9IDA7CisJdTY0IGVycl93YXJuX2JpdF9tYXA7CisJdTggZXJyX3dhcm4gPSAweGZmOwogCiAKIAlCTlgyRkNfVEdUX0RCRyh0Z3QsICJFbnRlcmVkIFVOU09MIENPTVBMRVRJT04gd3FlID0gMHgleFxuIiwgd3FlKTsKQEAgLTY3MywzOSArNjkzLDQzIEBACiAJCUJOWDJGQ19UR1RfREJHKHRndCwgImJ1Zl9vZmZzZXRzIC0gdHggPSAweCV4LCByeCA9IDB4JXhcbiIsCiAJCQllcnJfZW50cnktPmRhdGEudHhfYnVmX29mZiwgZXJyX2VudHJ5LT5kYXRhLnJ4X2J1Zl9vZmYpOwogCi0JCWJueDJmY19yZXR1cm5fcnFlKHRndCwgMSk7CiAKIAkJaWYgKHhpZCA+IEJOWDJGQ19NQVhfWElEKSB7CiAJCQlCTlgyRkNfVEdUX0RCRyh0Z3QsICJ4aWQoMHgleCkgb3V0IG9mIEZXIHJhbmdlXG4iLAogCQkJCSAgIHhpZCk7Ci0JCQlzcGluX3VubG9ja19iaCgmdGd0LT50Z3RfbG9jayk7Ci0JCQlicmVhazsKKwkJCWdvdG8gcmV0X2Vycl9ycWU7CiAJCX0KIAogCQl0YXNrX2lkeCA9IHhpZCAvIEJOWDJGQ19UQVNLU19QRVJfUEFHRTsKIAkJaW5kZXggPSB4aWQgJSBCTlgyRkNfVEFTS1NfUEVSX1BBR0U7CiAJCXRhc2tfcGFnZSA9IChzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqKQotCQkJCQkJaGJhLT50YXNrX2N0eFt0YXNrX2lkeF07CisJCQkJCWhiYS0+dGFza19jdHhbdGFza19pZHhdOwogCQl0YXNrID0gJih0YXNrX3BhZ2VbaW5kZXhdKTsKIAogCQlpb19yZXEgPSAoc3RydWN0IGJueDJmY19jbWQgKiloYmEtPmNtZF9tZ3ItPmNtZHNbeGlkXTsKLQkJaWYgKCFpb19yZXEpIHsKLQkJCXNwaW5fdW5sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKLQkJCWJyZWFrOwotCQl9CisJCWlmICghaW9fcmVxKQorCQkJZ290byByZXRfZXJyX3JxZTsKIAogCQlpZiAoaW9fcmVxLT5jbWRfdHlwZSAhPSBCTlgyRkNfU0NTSV9DTUQpIHsKIAkJCXByaW50ayhLRVJOX0VSUiBQRlggImVycl93YXJuOiBOb3QgYSBTQ1NJIGNtZFxuIik7Ci0JCQlzcGluX3VubG9ja19iaCgmdGd0LT50Z3RfbG9jayk7Ci0JCQlicmVhazsKKwkJCWdvdG8gcmV0X2Vycl9ycWU7CiAJCX0KIAogCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEJOWDJGQ19GTEFHX0lPX0NMRUFOVVAsCiAJCQkJICAgICAgICZpb19yZXEtPnJlcV9mbGFncykpIHsKIAkJCUJOWDJGQ19JT19EQkcoaW9fcmVxLCAidW5zb2xfZXJyOiBjbGVhbnVwIGluICIKIAkJCQkJICAgICJwcm9ncmVzcy4uIGlnbm9yZSB1bnNvbCBlcnJcbiIpOwotCQkJc3Bpbl91bmxvY2tfYmgoJnRndC0+dGd0X2xvY2spOwotCQkJYnJlYWs7CisJCQlnb3RvIHJldF9lcnJfcnFlOworCQl9CisKKwkJZXJyX3dhcm5fYml0X21hcCA9ICh1NjQpCisJCQkoKHU2NCllcnJfZW50cnktPmRhdGEuZXJyX3dhcm5fYml0bWFwX2hpIDw8IDMyKSB8CisJCQkodTY0KWVycl9lbnRyeS0+ZGF0YS5lcnJfd2Fybl9iaXRtYXBfbG87CisJCWZvciAoaSA9IDA7IGkgPCBCTlgyRkNfTlVNX0VSUl9CSVRTOyBpKyspIHsKKwkJCWlmIChlcnJfd2Fybl9iaXRfbWFwICYgKHU2NCkoKHU2NCkxIDw8IGkpKSB7CisJCQkJZXJyX3dhcm4gPSBpOworCQkJCWJyZWFrOworCQkJfQogCQl9CiAKIAkJLyoKQEAgLTcxNSwyNiArNzM5LDYxIEBACiAJCSAqIGxvZ2dpbmcgb3V0IHRoZSB0YXJnZXQsIHdoZW4gdGhlIEFCVFMgZXZlbnR1YWxseQogCQkgKiB0aW1lcyBvdXQuCiAJCSAqLwotCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoQk5YMkZDX0ZMQUdfSVNTVUVfQUJUUywKLQkJCQkgICAgICAmaW9fcmVxLT5yZXFfZmxhZ3MpKSB7Ci0JCQkvKgotCQkJICogQ2FuY2VsIHRoZSB0aW1lb3V0X3dvcmssIGFzIHdlIHJlY2VpdmVkIElPCi0JCQkgKiBjb21wbGV0aW9uIHdpdGggRlcgZXJyb3IuCi0JCQkgKi8KLQkJCWlmIChjYW5jZWxfZGVsYXllZF93b3JrKCZpb19yZXEtPnRpbWVvdXRfd29yaykpCi0JCQkJa3JlZl9wdXQoJmlvX3JlcS0+cmVmY291bnQsCi0JCQkJCSBibngyZmNfY21kX3JlbGVhc2UpOyAvKiB0aW1lciBob2xkICovCi0KLQkJCXJjID0gYm54MmZjX2luaXRpYXRlX2FidHMoaW9fcmVxKTsKLQkJCWlmIChyYyAhPSBTVUNDRVNTKSB7Ci0JCQkJQk5YMkZDX0lPX0RCRyhpb19yZXEsICJlcnJfd2FybjogaW5pdGlhdGVfYWJ0cyAiCi0JCQkJCSJmYWlsZWQuIGlzc3VlIGNsZWFudXBcbiIpOwotCQkJCXJjID0gYm54MmZjX2luaXRpYXRlX2NsZWFudXAoaW9fcmVxKTsKLQkJCQlCVUdfT04ocmMpOwotCQkJfQotCQl9IGVsc2UKKwkJaWYgKHRlc3RfYml0KEJOWDJGQ19GTEFHX0lTU1VFX0FCVFMsICZpb19yZXEtPnJlcV9mbGFncykpIHsKIAkJCXByaW50ayhLRVJOX0VSUiBQRlggImVycl93YXJuOiBpb19yZXEgKDB4JXgpIGFscmVhZHkgIgogCQkJCQkgICAgImluIEFCVFMgcHJvY2Vzc2luZ1xuIiwgeGlkKTsKKwkJCWdvdG8gcmV0X2Vycl9ycWU7CisJCX0KKwkJQk5YMkZDX1RHVF9EQkcodGd0LCAiZXJyID0gMHgleFxuIiwgZXJyX3dhcm4pOworCQlpZiAodGd0LT5kZXZfdHlwZSAhPSBUWVBFX1RBUEUpCisJCQlnb3RvIHNraXBfcmVjOworCQlzd2l0Y2ggKGVycl93YXJuKSB7CisJCWNhc2UgRkNPRV9FUlJPUl9DT0RFX1JFQ19UT1ZfVElNRVJfRVhQSVJBVElPTjoKKwkJY2FzZSBGQ09FX0VSUk9SX0NPREVfREFUQV9PT09fUk86CisJCWNhc2UgRkNPRV9FUlJPUl9DT0RFX0NPTU1PTl9JTkNPUlJFQ1RfU0VRX0NOVDoKKwkJY2FzZSBGQ09FX0VSUk9SX0NPREVfREFUQV9TT0ZJM19TRVFfQUNUSVZFX1NFVDoKKwkJY2FzZSBGQ09FX0VSUk9SX0NPREVfRkNQX1JTUF9PUEVORURfU0VROgorCQljYXNlIEZDT0VfRVJST1JfQ09ERV9EQVRBX1NPRk5fU0VRX0FDVElWRV9SRVNFVDoKKwkJCUJOWDJGQ19UR1RfREJHKHRndCwgIlJFQyBUT1YgcG9wcGVkIGZvciB4aWQgLSAweCV4XG4iLAorCQkJCSAgIHhpZCk7CisJCQltZW1zZXQoJmlvX3JlcS0+ZXJyX2VudHJ5LCAwLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZmNvZV9lcnJfcmVwb3J0X2VudHJ5KSk7CisJCQltZW1jcHkoJmlvX3JlcS0+ZXJyX2VudHJ5LCBlcnJfZW50cnksCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBmY29lX2Vycl9yZXBvcnRfZW50cnkpKTsKKwkJCWlmICghdGVzdF9iaXQoQk5YMkZDX0ZMQUdfU1JSX1NFTlQsCisJCQkJICAgICAgJmlvX3JlcS0+cmVxX2ZsYWdzKSkgeworCQkJCXNwaW5fdW5sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKKwkJCQlyYyA9IGJueDJmY19zZW5kX3JlYyhpb19yZXEpOworCQkJCXNwaW5fbG9ja19iaCgmdGd0LT50Z3RfbG9jayk7CisKKwkJCQlpZiAocmMpCisJCQkJCWdvdG8gc2tpcF9yZWM7CisJCQl9IGVsc2UKKwkJCQlwcmludGsoS0VSTl9FUlIgUEZYICJTUlIgaW4gcHJvZ3Jlc3NcbiIpOworCQkJZ290byByZXRfZXJyX3JxZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworc2tpcF9yZWM6CisJCXNldF9iaXQoQk5YMkZDX0ZMQUdfSVNTVUVfQUJUUywgJmlvX3JlcS0+cmVxX2ZsYWdzKTsKKwkJLyoKKwkJICogQ2FuY2VsIHRoZSB0aW1lb3V0X3dvcmssIGFzIHdlIHJlY2VpdmVkIElPCisJCSAqIGNvbXBsZXRpb24gd2l0aCBGVyBlcnJvci4KKwkJICovCisJCWlmIChjYW5jZWxfZGVsYXllZF93b3JrKCZpb19yZXEtPnRpbWVvdXRfd29yaykpCisJCQlrcmVmX3B1dCgmaW9fcmVxLT5yZWZjb3VudCwgYm54MmZjX2NtZF9yZWxlYXNlKTsKKworCQlyYyA9IGJueDJmY19pbml0aWF0ZV9hYnRzKGlvX3JlcSk7CisJCWlmIChyYyAhPSBTVUNDRVNTKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJlcnJfd2FybjogaW5pdGlhdGVfYWJ0cyAiCisJCQkJImZhaWxlZCB4aWQgPSAweCV4LiBpc3N1ZSBjbGVhbnVwXG4iLAorCQkJCWlvX3JlcS0+eGlkKTsKKwkJCWJueDJmY19pbml0aWF0ZV9jbGVhbnVwKGlvX3JlcSk7CisJCX0KK3JldF9lcnJfcnFlOgorCQlibngyZmNfcmV0dXJuX3JxZSh0Z3QsIDEpOwogCQlzcGluX3VubG9ja19iaCgmdGd0LT50Z3RfbG9jayk7CiAJCWJyZWFrOwogCkBAIC03NTUsNiArODE0LDQ3IEBACiAJCUJOWDJGQ19UR1RfREJHKHRndCwgImJ1Zl9vZmZzZXRzIC0gdHggPSAweCV4LCByeCA9IDB4JXgiLAogCQkJZXJyX2VudHJ5LT5kYXRhLnR4X2J1Zl9vZmYsIGVycl9lbnRyeS0+ZGF0YS5yeF9idWZfb2ZmKTsKIAorCQlpZiAoeGlkID4gQk5YMkZDX01BWF9YSUQpIHsKKwkJCUJOWDJGQ19UR1RfREJHKHRndCwgInhpZCgweCV4KSBvdXQgb2YgRlcgcmFuZ2VcbiIsIHhpZCk7CisJCQlnb3RvIHJldF93YXJuX3JxZTsKKwkJfQorCisJCWVycl93YXJuX2JpdF9tYXAgPSAodTY0KQorCQkJKCh1NjQpZXJyX2VudHJ5LT5kYXRhLmVycl93YXJuX2JpdG1hcF9oaSA8PCAzMikgfAorCQkJKHU2NCllcnJfZW50cnktPmRhdGEuZXJyX3dhcm5fYml0bWFwX2xvOworCQlmb3IgKGkgPSAwOyBpIDwgQk5YMkZDX05VTV9FUlJfQklUUzsgaSsrKSB7CisJCQlpZiAoZXJyX3dhcm5fYml0X21hcCAmICh1NjQpICgxIDw8IGkpKSB7CisJCQkJZXJyX3dhcm4gPSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCUJOWDJGQ19UR1RfREJHKHRndCwgIndhcm4gPSAweCV4XG4iLCBlcnJfd2Fybik7CisKKwkJdGFza19pZHggPSB4aWQgLyBCTlgyRkNfVEFTS1NfUEVSX1BBR0U7CisJCWluZGV4ID0geGlkICUgQk5YMkZDX1RBU0tTX1BFUl9QQUdFOworCQl0YXNrX3BhZ2UgPSAoc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKikKKwkJCSAgICAgaW50ZXJmYWNlLT5oYmEtPnRhc2tfY3R4W3Rhc2tfaWR4XTsKKwkJdGFzayA9ICYodGFza19wYWdlW2luZGV4XSk7CisJCWlvX3JlcSA9IChzdHJ1Y3QgYm54MmZjX2NtZCAqKWhiYS0+Y21kX21nci0+Y21kc1t4aWRdOworCQlpZiAoIWlvX3JlcSkKKwkJCWdvdG8gcmV0X3dhcm5fcnFlOworCisJCWlmIChpb19yZXEtPmNtZF90eXBlICE9IEJOWDJGQ19TQ1NJX0NNRCkgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZXJyX3dhcm46IE5vdCBhIFNDU0kgY21kXG4iKTsKKwkJCWdvdG8gcmV0X3dhcm5fcnFlOworCQl9CisKKwkJbWVtc2V0KCZpb19yZXEtPmVycl9lbnRyeSwgMCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgZmNvZV9lcnJfcmVwb3J0X2VudHJ5KSk7CisJCW1lbWNweSgmaW9fcmVxLT5lcnJfZW50cnksIGVycl9lbnRyeSwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgZmNvZV9lcnJfcmVwb3J0X2VudHJ5KSk7CisKKwkJaWYgKGVycl93YXJuID09IEZDT0VfRVJST1JfQ09ERV9SRUNfVE9WX1RJTUVSX0VYUElSQVRJT04pCisJCQkvKiBSRUNfVE9WIGlzIG5vdCBhIHdhcm5pbmcgY29kZSAqLworCQkJQlVHX09OKDEpOworCQllbHNlCisJCQlCTlgyRkNfVEdUX0RCRyh0Z3QsICJVbnNvbGljaXRlZCB3YXJuaW5nXG4iKTsKK3JldF93YXJuX3JxZToKIAkJYm54MmZjX3JldHVybl9ycWUodGd0LCAxKTsKIAkJc3Bpbl91bmxvY2tfYmgoJnRndC0+dGd0X2xvY2spOwogCQlicmVhazsKQEAgLTc3MCw3ICs4NzAsOCBAQAogCXN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICp0YXNrOwogCXN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICp0YXNrX3BhZ2U7CiAJc3RydWN0IGZjb2VfcG9ydCAqcG9ydCA9IHRndC0+cG9ydDsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gaW50ZXJmYWNlLT5oYmE7CiAJc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcTsKIAlpbnQgdGFza19pZHgsIGluZGV4OwogCXUxNiB4aWQ7CkBAIC03ODEsNyArODgyLDcgQEAKIAlzcGluX2xvY2tfYmgoJnRndC0+dGd0X2xvY2spOwogCXhpZCA9IHdxZSAmIEZDT0VfUEVORF9XUV9DUUVfVEFTS19JRDsKIAlpZiAoeGlkID49IEJOWDJGQ19NQVhfVEFTS1MpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJFUlJPUjp4aWQgb3V0IG9mIHJhbmdlXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRVJST1I6eGlkIG91dCBvZiByYW5nZVxuIik7CiAJCXNwaW5fdW5sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKIAkJcmV0dXJuOwogCX0KQEAgLTg2MSw2ICs5NjIsMTMgQEAKIAkJa3JlZl9wdXQoJmlvX3JlcS0+cmVmY291bnQsIGJueDJmY19jbWRfcmVsZWFzZSk7CiAJCWJyZWFrOwogCisJY2FzZSBCTlgyRkNfU0VRX0NMRUFOVVA6CisJCUJOWDJGQ19JT19EQkcoaW9fcmVxLCAiY3FfY29tcGwoMHgleCkgLSBzZXEgY2xlYW51cCByZXNwXG4iLAorCQkJICAgICAgaW9fcmVxLT54aWQpOworCQlibngyZmNfcHJvY2Vzc19zZXFfY2xlYW51cF9jb21wbChpb19yZXEsIHRhc2ssIHJ4X3N0YXRlKTsKKwkJa3JlZl9wdXQoJmlvX3JlcS0+cmVmY291bnQsIGJueDJmY19jbWRfcmVsZWFzZSk7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiSW52YWxpZCBjbWRfdHlwZSAlZFxuIiwgY21kX3R5cGUpOwogCQlicmVhazsKQEAgLTk2Miw4ICsxMDcwLDEwIEBACiAJCQkJMSAtIHRndC0+Y3FfY3Vycl90b2dnbGVfYml0OwogCQl9CiAJfQotCWJueDJmY19hcm1fY3EodGd0KTsKLQlhdG9taWNfYWRkKG51bV9mcmVlX3NxZXMsICZ0Z3QtPmZyZWVfc3Flcyk7CisJaWYgKG51bV9mcmVlX3NxZXMpIHsKKwkJYm54MmZjX2FybV9jcSh0Z3QpOworCQlhdG9taWNfYWRkKG51bV9mcmVlX3NxZXMsICZ0Z3QtPmZyZWVfc3Flcyk7CisJfQogCXNwaW5fdW5sb2NrX2JoKCZ0Z3QtPmNxX2xvY2spOwogCXJldHVybiAwOwogfQpAQCAtOTgzLDcgKzEwOTMsNyBAQAogCXN0cnVjdCBibngyZmNfcnBvcnQgKnRndCA9IGhiYS0+dGd0X29mbGRfbGlzdFtjb25uX2lkXTsKIAogCWlmICghdGd0KSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiY29ubl9pZCAweCV4IG5vdCB2YWxpZFxuIiwgY29ubl9pZCk7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNvbm5faWQgMHgleCBub3QgdmFsaWRcbiIsIGNvbm5faWQpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMDA0LDYgKzExMTQsNyBAQAogewogCXN0cnVjdCBibngyZmNfcnBvcnQJCSp0Z3Q7CiAJc3RydWN0IGZjb2VfcG9ydAkJKnBvcnQ7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UJCSppbnRlcmZhY2U7CiAJdTMyCQkJCWNvbm5faWQ7CiAJdTMyCQkJCWNvbnRleHRfaWQ7CiAJaW50CQkJCXJjOwpAQCAtMTAxOCw4ICsxMTI5LDkgQEAKIAlCTlgyRkNfVEdUX0RCRyh0Z3QsICJFbnRlcmVkIG9mbGQgY29tcGwgLSBjb250ZXh0X2lkID0gMHgleFxuIiwKIAkJb2ZsZF9rY3FlLT5mY29lX2Nvbm5fY29udGV4dF9pZCk7CiAJcG9ydCA9IHRndC0+cG9ydDsKLQlpZiAoaGJhICE9IHRndC0+cG9ydC0+cHJpdikgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggIkVSUk9SOm9mbGRfY21wbDogSEJBIG1pcy1tYXRjaFxuIik7CisJaW50ZXJmYWNlID0gdGd0LT5wb3J0LT5wcml2OworCWlmIChoYmEgIT0gaW50ZXJmYWNlLT5oYmEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRVJST1I6b2ZsZF9jbXBsOiBIQkEgbWlzLW1hdGNoXG4iKTsKIAkJZ290byBvZmxkX2NtcGxfZXJyOwogCX0KIAkvKgpAQCAtMTA0MCw3ICsxMTUyLDcgQEAKIAkJLyogbm93IGVuYWJsZSB0aGUgc2Vzc2lvbiAqLwogCQlyYyA9IGJueDJmY19zZW5kX3Nlc3Npb25fZW5hYmxlX3JlcShwb3J0LCB0Z3QpOwogCQlpZiAocmMpIHsKLQkJCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiZW5hYmxlIHNlc3Npb24gZmFpbGVkXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggImVuYWJsZSBzZXNzaW9uIGZhaWxlZFxuIik7CiAJCQlnb3RvIG9mbGRfY21wbF9lcnI7CiAJCX0KIAl9CkBAIC0xMDYzLDYgKzExNzUsNyBAQAogCQkJCQkJc3RydWN0IGZjb2Vfa2NxZSAqb2ZsZF9rY3FlKQogewogCXN0cnVjdCBibngyZmNfcnBvcnQJCSp0Z3Q7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UJCSppbnRlcmZhY2U7CiAJdTMyCQkJCWNvbm5faWQ7CiAJdTMyCQkJCWNvbnRleHRfaWQ7CiAKQEAgLTEwNzAsNyArMTE4Myw3IEBACiAJY29ubl9pZCA9IG9mbGRfa2NxZS0+ZmNvZV9jb25uX2lkOwogCXRndCA9IGhiYS0+dGd0X29mbGRfbGlzdFtjb25uX2lkXTsKIAlpZiAoIXRndCkgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggIkVSUk9SOmVuYmxfY21wbDogTm8gcGVuZGluZyBvZmxkIHJlcVxuIik7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkVSUk9SOmVuYmxfY21wbDogTm8gcGVuZGluZyBvZmxkIHJlcVxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTEwODIsMTYgKzExOTUsMTcgQEAKIAkgKiBhbmQgZW5hYmxlCiAJICovCiAJaWYgKHRndC0+Y29udGV4dF9pZCAhPSBjb250ZXh0X2lkKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiY29udGV4dCBpZCBtaXMtbWF0Y2hcbiIpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJjb250ZXh0IGlkIG1pcy1tYXRjaFxuIik7CiAJCXJldHVybjsKIAl9Ci0JaWYgKGhiYSAhPSB0Z3QtPnBvcnQtPnByaXYpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJibngyZmMtZW5ibF9jbXBsOiBIQkEgbWlzLW1hdGNoXG4iKTsKKwlpbnRlcmZhY2UgPSB0Z3QtPnBvcnQtPnByaXY7CisJaWYgKGhiYSAhPSBpbnRlcmZhY2UtPmhiYSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJibngyZmMtZW5ibF9jbXBsOiBIQkEgbWlzLW1hdGNoXG4iKTsKIAkJZ290byBlbmJsX2NtcGxfZXJyOwogCX0KLQlpZiAob2ZsZF9rY3FlLT5jb21wbGV0aW9uX3N0YXR1cykgeworCWlmIChvZmxkX2tjcWUtPmNvbXBsZXRpb25fc3RhdHVzKQogCQlnb3RvIGVuYmxfY21wbF9lcnI7Ci0JfSBlbHNlIHsKKwllbHNlIHsKIAkJLyogZW5hYmxlIHN1Y2Nlc3NmdWwgLSBycG9ydCByZWFkeSBmb3IgaXNzdWluZyBJT3MgKi8KIAkJc2V0X2JpdChCTlgyRkNfRkxBR19PRkZMT0FERUQsICZ0Z3QtPmZsYWdzKTsKIAkJc2V0X2JpdChCTlgyRkNfRkxBR19PRkxEX1JFUV9DTVBMLCAmdGd0LT5mbGFncyk7CkBAIC0xMTE0LDE0ICsxMjI4LDE0IEBACiAJY29ubl9pZCA9IGRpc2FibGVfa2NxZS0+ZmNvZV9jb25uX2lkOwogCXRndCA9IGhiYS0+dGd0X29mbGRfbGlzdFtjb25uX2lkXTsKIAlpZiAoIXRndCkgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggIkVSUk9SOiBkaXNhYmxlX2NtcGw6IE5vIGRpc2FibGUgcmVxXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRVJST1I6IGRpc2FibGVfY21wbDogTm8gZGlzYWJsZSByZXFcbiIpOwogCQlyZXR1cm47CiAJfQogCiAJQk5YMkZDX1RHVF9EQkcodGd0LCBQRlggImRpc2FibGVfY21wbDogY29ubl9pZCAlZFxuIiwgY29ubl9pZCk7CiAKIAlpZiAoZGlzYWJsZV9rY3FlLT5jb21wbGV0aW9uX3N0YXR1cykgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggIkVSUk9SOiBEaXNhYmxlIGZhaWxlZCB3aXRoIGNtcGwgc3RhdHVzICVkXG4iLAorCQlwcmludGsoS0VSTl9FUlIgUEZYICJEaXNhYmxlIGZhaWxlZCB3aXRoIGNtcGwgc3RhdHVzICVkXG4iLAogCQkJZGlzYWJsZV9rY3FlLT5jb21wbGV0aW9uX3N0YXR1cyk7CiAJCXJldHVybjsKIAl9IGVsc2UgewpAQCAtMTE0MywxNCArMTI1NywxNCBAQAogCWNvbm5faWQgPSBkZXN0cm95X2tjcWUtPmZjb2VfY29ubl9pZDsKIAl0Z3QgPSBoYmEtPnRndF9vZmxkX2xpc3RbY29ubl9pZF07CiAJaWYgKCF0Z3QpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJkZXN0cm95X2NtcGw6IE5vIGRlc3Ryb3kgcmVxXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZGVzdHJveV9jbXBsOiBObyBkZXN0cm95IHJlcVxuIik7CiAJCXJldHVybjsKIAl9CiAKIAlCTlgyRkNfVEdUX0RCRyh0Z3QsICJkZXN0cm95X2NtcGw6IGNvbm5faWQgJWRcbiIsIGNvbm5faWQpOwogCiAJaWYgKGRlc3Ryb3lfa2NxZS0+Y29tcGxldGlvbl9zdGF0dXMpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJEZXN0cm95IGNvbm4gZmFpbGVkLCBjbXBsIHN0YXR1cyAlZFxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiRGVzdHJveSBjb25uIGZhaWxlZCwgY21wbCBzdGF0dXMgJWRcbiIsCiAJCQlkZXN0cm95X2tjcWUtPmNvbXBsZXRpb25fc3RhdHVzKTsKIAkJcmV0dXJuOwogCX0gZWxzZSB7CkBAIC0xMTgyLDYgKzEyOTYsNyBAQAogCQlicmVhazsKIAljYXNlIEZDT0VfS0NRRV9DT01QTEVUSU9OX1NUQVRVU19XUk9OR19IU0lfVkVSU0lPTjoKIAkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaW5pdCBmYWlsdXJlIGR1ZSB0byBIU0kgbWlzbWF0Y2hcbiIpOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlwcmludGsoS0VSTl9FUlIgUEZYICJVbmtub3duIEVycm9yIGNvZGUgJWRcbiIsIGVycl9jb2RlKTsKIAl9CkBAIC0xMjQwLDcgKzEzNTUsNyBAQAogCQkJfSBlbHNlIHsKIAkJCQlwcmludGsoS0VSTl9FUlIgUEZYICJERVNUUk9ZIHN1Y2Nlc3NcbiIpOwogCQkJfQotCQkJaGJhLT5mbGFncyB8PSBCTlgyRkNfRkxBR19ERVNUUk9ZX0NNUEw7CisJCQlzZXRfYml0KEJOWDJGQ19GTEFHX0RFU1RST1lfQ01QTCwgJmhiYS0+ZmxhZ3MpOwogCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZoYmEtPmRlc3Ryb3lfd2FpdCk7CiAJCQlicmVhazsKIApAQCAtMTI2Miw3ICsxMzc3LDcgQEAKIAkJY2FzZSBGQ09FX0tDUUVfT1BDT0RFX0ZDT0VfRVJST1I6CiAJCQkvKiBmYWxsIHRocnUgKi8KIAkJZGVmYXVsdDoKLQkJCXByaW50ayhLRVJOX0FMRVJUIFBGWCAidW5rbm93biBvcGNvZGUgMHgleFxuIiwKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggInVua25vd24gb3Bjb2RlIDB4JXhcbiIsCiAJCQkJCQkJCWtjcWUtPm9wX2NvZGUpOwogCQl9CiAJfQpAQCAtMTMwNSw3ICsxNDIwLDggQEAKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0ID0gdGd0LT5wb3J0OwogCXUzMiByZWdfb2ZmOwogCXJlc291cmNlX3NpemVfdCByZWdfYmFzZTsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gaW50ZXJmYWNlLT5oYmE7CiAKIAlyZWdfYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChoYmEtPnBjaWRldiwKIAkJCQkJQk5YMlhfRE9PUkJFTExfUENJX0JBUik7CkBAIC0xMzQ0LDYgKzE0NjAsOTYgQEAKIAl0Z3QtPmNvbm5fZGItPnJxX3Byb2QgPSB0Z3QtPnJxX3Byb2RfaWR4OwogfQogCit2b2lkIGJueDJmY19pbml0X3NlcV9jbGVhbnVwX3Rhc2soc3RydWN0IGJueDJmY19jbWQgKnNlcV9jbG5wX3JlcSwKKwkJCQkgIHN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICp0YXNrLAorCQkJCSAgc3RydWN0IGJueDJmY19jbWQgKm9yaWdfaW9fcmVxLAorCQkJCSAgdTMyIG9mZnNldCkKK3sKKwlzdHJ1Y3Qgc2NzaV9jbW5kICpzY19jbWQgPSBvcmlnX2lvX3JlcS0+c2NfY21kOworCXN0cnVjdCBibngyZmNfcnBvcnQgKnRndCA9IHNlcV9jbG5wX3JlcS0+dGd0OworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSB0Z3QtPnBvcnQtPnByaXY7CisJc3RydWN0IGZjb2VfYmRfY3R4ICpiZCA9IG9yaWdfaW9fcmVxLT5iZF90YmwtPmJkX3RibDsKKwlzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqb3JpZ190YXNrOworCXN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICp0YXNrX3BhZ2U7CisJc3RydWN0IGZjb2VfZXh0X211bF9zZ2VzX2N0eCAqc2dsOworCXU4IHRhc2tfdHlwZSA9IEZDT0VfVEFTS19UWVBFX1NFUVVFTkNFX0NMRUFOVVA7CisJdTggb3JpZ190YXNrX3R5cGU7CisJdTE2IG9yaWdfeGlkID0gb3JpZ19pb19yZXEtPnhpZDsKKwl1MzIgY29udGV4dF9pZCA9IHRndC0+Y29udGV4dF9pZDsKKwl1NjQgcGh5c19hZGRyID0gKHU2NClvcmlnX2lvX3JlcS0+YmRfdGJsLT5iZF90YmxfZG1hOworCXUzMiBvcmlnX29mZnNldCA9IG9mZnNldDsKKwlpbnQgYmRfY291bnQ7CisJaW50IG9yaWdfdGFza19pZHgsIGluZGV4OworCWludCBpOworCisJbWVtc2V0KHRhc2ssIDAsIHNpemVvZihzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSkpOworCisJaWYgKHNjX2NtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX1RPX0RFVklDRSkKKwkJb3JpZ190YXNrX3R5cGUgPSBGQ09FX1RBU0tfVFlQRV9XUklURTsKKwllbHNlCisJCW9yaWdfdGFza190eXBlID0gRkNPRV9UQVNLX1RZUEVfUkVBRDsKKworCS8qIFR4IGZsYWdzICovCisJdGFzay0+dHh3cl9yeHJkLmNvbnN0X2N0eC50eF9mbGFncyA9CisJCQkJRkNPRV9UQVNLX1RYX1NUQVRFX1NFUVVFTkNFX0NMRUFOVVAgPDwKKwkJCQlGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9UWF9TVEFURV9TSElGVDsKKwkvKiBpbml0IGZsYWdzICovCisJdGFzay0+dHh3cl9yeHJkLmNvbnN0X2N0eC5pbml0X2ZsYWdzID0gdGFza190eXBlIDw8CisJCQkJRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfVEFTS19UWVBFX1NISUZUOworCXRhc2stPnR4d3JfcnhyZC5jb25zdF9jdHguaW5pdF9mbGFncyB8PSBGQ09FX1RBU0tfQ0xBU1NfVFlQRV8zIDw8CisJCQkJRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfQ0xBU1NfVFlQRV9TSElGVDsKKwl0YXNrLT5yeHdyX3R4cmQuY29uc3RfY3R4LmluaXRfZmxhZ3MgPSBjb250ZXh0X2lkIDw8CisJCQkJRkNPRV9UQ0VfUlhfV1JfVFhfUkRfQ09OU1RfQ0lEX1NISUZUOworCXRhc2stPnJ4d3JfdHhyZC5jb25zdF9jdHguaW5pdF9mbGFncyA9IGNvbnRleHRfaWQgPDwKKwkJCQlGQ09FX1RDRV9SWF9XUl9UWF9SRF9DT05TVF9DSURfU0hJRlQ7CisKKwl0YXNrLT50eHdyX3J4cmQudW5pb25fY3R4LmNsZWFudXAuY3R4LmNsZWFuZWRfdGFza19pZCA9IG9yaWdfeGlkOworCisJdGFzay0+dHh3cl9yeHJkLnVuaW9uX2N0eC5jbGVhbnVwLmN0eC5yb2xsZWRfdHhfc2VxX2NudCA9IDA7CisJdGFzay0+dHh3cl9yeHJkLnVuaW9uX2N0eC5jbGVhbnVwLmN0eC5yb2xsZWRfdHhfZGF0YV9vZmZzZXQgPSBvZmZzZXQ7CisKKwliZF9jb3VudCA9IG9yaWdfaW9fcmVxLT5iZF90YmwtPmJkX3ZhbGlkOworCisJLyogb2J0YWluIHRoZSBhcHByb3ByaWF0ZSBiZCBlbnRyeSBmcm9tIHJlbGF0aXZlIG9mZnNldCAqLworCWZvciAoaSA9IDA7IGkgPCBiZF9jb3VudDsgaSsrKSB7CisJCWlmIChvZmZzZXQgPCBiZFtpXS5idWZfbGVuKQorCQkJYnJlYWs7CisJCW9mZnNldCAtPSBiZFtpXS5idWZfbGVuOworCX0KKwlwaHlzX2FkZHIgKz0gKGkgKiBzaXplb2Yoc3RydWN0IGZjb2VfYmRfY3R4KSk7CisKKwlpZiAob3JpZ190YXNrX3R5cGUgPT0gRkNPRV9UQVNLX1RZUEVfV1JJVEUpIHsKKwkJdGFzay0+dHh3cl9vbmx5LnNnbF9jdHguc2dsLm11bF9zZ2wuY3VyX3NnZV9hZGRyLmxvID0KKwkJCQkodTMyKXBoeXNfYWRkcjsKKwkJdGFzay0+dHh3cl9vbmx5LnNnbF9jdHguc2dsLm11bF9zZ2wuY3VyX3NnZV9hZGRyLmhpID0KKwkJCQkodTMyKSgodTY0KXBoeXNfYWRkciA+PiAzMik7CisJCXRhc2stPnR4d3Jfb25seS5zZ2xfY3R4LnNnbC5tdWxfc2dsLnNnbF9zaXplID0KKwkJCQliZF9jb3VudDsKKwkJdGFzay0+dHh3cl9vbmx5LnNnbF9jdHguc2dsLm11bF9zZ2wuY3VyX3NnZV9vZmYgPQorCQkJCW9mZnNldDsgLyogYWRqdXN0ZWQgb2Zmc2V0ICovCisJCXRhc2stPnR4d3Jfb25seS5zZ2xfY3R4LnNnbC5tdWxfc2dsLmN1cl9zZ2VfaWR4ID0gaTsKKwl9IGVsc2UgeworCQlvcmlnX3Rhc2tfaWR4ID0gb3JpZ194aWQgLyBCTlgyRkNfVEFTS1NfUEVSX1BBR0U7CisJCWluZGV4ID0gb3JpZ194aWQgJSBCTlgyRkNfVEFTS1NfUEVSX1BBR0U7CisKKwkJdGFza19wYWdlID0gKHN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICopCisJCQkgICAgIGludGVyZmFjZS0+aGJhLT50YXNrX2N0eFtvcmlnX3Rhc2tfaWR4XTsKKwkJb3JpZ190YXNrID0gJih0YXNrX3BhZ2VbaW5kZXhdKTsKKworCQkvKiBNdWx0aXBsZSBTR0VzIHdlcmUgdXNlZCBmb3IgdGhpcyBJTyAqLworCQlzZ2wgPSAmdGFzay0+cnh3cl9vbmx5LnVuaW9uX2N0eC5yZWFkX2luZm8uc2dsX2N0eC5zZ2w7CisJCXNnbC0+bXVsX3NnbC5jdXJfc2dlX2FkZHIubG8gPSAodTMyKXBoeXNfYWRkcjsKKwkJc2dsLT5tdWxfc2dsLmN1cl9zZ2VfYWRkci5oaSA9ICh1MzIpKCh1NjQpcGh5c19hZGRyID4+IDMyKTsKKwkJc2dsLT5tdWxfc2dsLnNnbF9zaXplID0gYmRfY291bnQ7CisJCXNnbC0+bXVsX3NnbC5jdXJfc2dlX29mZiA9IG9mZnNldDsgLyphZGp1c3RlZCBvZmZzZXQgKi8KKwkJc2dsLT5tdWxfc2dsLmN1cl9zZ2VfaWR4ID0gaTsKKworCQltZW1zZXQoJnRhc2stPnJ4d3Jfb25seS5yeF9zZXFfY3R4LCAwLAorCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBmY29lX3J4X3NlcV9jdHgpKTsKKwkJdGFzay0+cnh3cl9vbmx5LnJ4X3NlcV9jdHgubG93X2V4cF9ybyA9IG9yaWdfb2Zmc2V0OworCQl0YXNrLT5yeHdyX29ubHkucnhfc2VxX2N0eC5oaWdoX2V4cF9ybyA9IG9yaWdfb2Zmc2V0OworCX0KK30KIHZvaWQgYm54MmZjX2luaXRfY2xlYW51cF90YXNrKHN0cnVjdCBibngyZmNfY21kICppb19yZXEsCiAJCQkgICAgICBzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqdGFzaywKIAkJCSAgICAgIHUxNiBvcmlnX3hpZCkKQEAgLTEzNjAsNyArMTU2NiwxMiBAQAogCQkJCUZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX1RBU0tfVFlQRV9TSElGVDsKIAl0YXNrLT50eHdyX3J4cmQuY29uc3RfY3R4LmluaXRfZmxhZ3MgfD0gRkNPRV9UQVNLX0NMQVNTX1RZUEVfMyA8PAogCQkJCUZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX0NMQVNTX1RZUEVfU0hJRlQ7Ci0JdGFzay0+dHh3cl9yeHJkLmNvbnN0X2N0eC5pbml0X2ZsYWdzIHw9CisJaWYgKHRndC0+ZGV2X3R5cGUgPT0gVFlQRV9UQVBFKQorCQl0YXNrLT50eHdyX3J4cmQuY29uc3RfY3R4LmluaXRfZmxhZ3MgfD0KKwkJCQlGQ09FX1RBU0tfREVWX1RZUEVfVEFQRSA8PAorCQkJCUZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX0RFVl9UWVBFX1NISUZUOworCWVsc2UKKwkJdGFzay0+dHh3cl9yeHJkLmNvbnN0X2N0eC5pbml0X2ZsYWdzIHw9CiAJCQkJRkNPRV9UQVNLX0RFVl9UWVBFX0RJU0sgPDwKIAkJCQlGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9ERVZfVFlQRV9TSElGVDsKIAl0YXNrLT50eHdyX3J4cmQudW5pb25fY3R4LmNsZWFudXAuY3R4LmNsZWFuZWRfdGFza19pZCA9IG9yaWdfeGlkOwpAQCAtMTQyMCw3ICsxNjMxLDEyIEBACiAJLyogaW5pdCBmbGFncyAqLwogCXRhc2stPnR4d3JfcnhyZC5jb25zdF9jdHguaW5pdF9mbGFncyA9IHRhc2tfdHlwZSA8PAogCQkJCUZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX1RBU0tfVFlQRV9TSElGVDsKLQl0YXNrLT50eHdyX3J4cmQuY29uc3RfY3R4LmluaXRfZmxhZ3MgfD0KKwlpZiAodGd0LT5kZXZfdHlwZSA9PSBUWVBFX1RBUEUpCisJCXRhc2stPnR4d3JfcnhyZC5jb25zdF9jdHguaW5pdF9mbGFncyB8PQorCQkJCUZDT0VfVEFTS19ERVZfVFlQRV9UQVBFIDw8CisJCQkJRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfREVWX1RZUEVfU0hJRlQ7CisJZWxzZQorCQl0YXNrLT50eHdyX3J4cmQuY29uc3RfY3R4LmluaXRfZmxhZ3MgfD0KIAkJCQlGQ09FX1RBU0tfREVWX1RZUEVfRElTSyA8PAogCQkJCUZDT0VfVENFX1RYX1dSX1JYX1JEX0NPTlNUX0RFVl9UWVBFX1NISUZUOwogCXRhc2stPnR4d3JfcnhyZC5jb25zdF9jdHguaW5pdF9mbGFncyB8PSBGQ09FX1RBU0tfQ0xBU1NfVFlQRV8zIDw8CkBAIC0xNDc3LDYgKzE2OTMsNyBAQAogCXN0cnVjdCBibngyZmNfcnBvcnQgKnRndCA9IGlvX3JlcS0+dGd0OwogCXN0cnVjdCBmY29lX2NhY2hlZF9zZ2VfY3R4ICpjYWNoZWRfc2dlOwogCXN0cnVjdCBmY29lX2V4dF9tdWxfc2dlc19jdHggKnNnbDsKKwlpbnQgZGV2X3R5cGUgPSB0Z3QtPmRldl90eXBlOwogCXU2NCAqZmNwX2NtbmQ7CiAJdTY0IHRtcF9mY3BfY21uZFs0XTsKIAl1MzIgY29udGV4dF9pZDsKQEAgLTE0OTQsMjAgKzE3MTEsNDAgQEAKIAkJdGFza190eXBlID0gRkNPRV9UQVNLX1RZUEVfUkVBRDsKIAogCS8qIFR4IG9ubHkgKi8KKwliZF9jb3VudCA9IGJkX3RibC0+YmRfdmFsaWQ7CiAJaWYgKHRhc2tfdHlwZSA9PSBGQ09FX1RBU0tfVFlQRV9XUklURSkgewotCQl0YXNrLT50eHdyX29ubHkuc2dsX2N0eC5zZ2wubXVsX3NnbC5jdXJfc2dlX2FkZHIubG8gPQotCQkJCSh1MzIpYmRfdGJsLT5iZF90YmxfZG1hOwotCQl0YXNrLT50eHdyX29ubHkuc2dsX2N0eC5zZ2wubXVsX3NnbC5jdXJfc2dlX2FkZHIuaGkgPQotCQkJCSh1MzIpKCh1NjQpYmRfdGJsLT5iZF90YmxfZG1hID4+IDMyKTsKLQkJdGFzay0+dHh3cl9vbmx5LnNnbF9jdHguc2dsLm11bF9zZ2wuc2dsX3NpemUgPQotCQkJCWJkX3RibC0+YmRfdmFsaWQ7CisJCWlmICgoZGV2X3R5cGUgPT0gVFlQRV9ESVNLKSAmJiAoYmRfY291bnQgPT0gMSkpIHsKKwkJCXN0cnVjdCBmY29lX2JkX2N0eCAqZmNvZV9iZF90YmwgPSBiZF90YmwtPmJkX3RibDsKKworCQkJdGFzay0+dHh3cl9vbmx5LnNnbF9jdHguY2FjaGVkX3NnZS5jdXJfYnVmX2FkZHIubG8gPQorCQkJCQlmY29lX2JkX3RibC0+YnVmX2FkZHJfbG87CisJCQl0YXNrLT50eHdyX29ubHkuc2dsX2N0eC5jYWNoZWRfc2dlLmN1cl9idWZfYWRkci5oaSA9CisJCQkJCWZjb2VfYmRfdGJsLT5idWZfYWRkcl9oaTsKKwkJCXRhc2stPnR4d3Jfb25seS5zZ2xfY3R4LmNhY2hlZF9zZ2UuY3VyX2J1Zl9yZW0gPQorCQkJCQlmY29lX2JkX3RibC0+YnVmX2xlbjsKKworCQkJdGFzay0+dHh3cl9yeHJkLmNvbnN0X2N0eC5pbml0X2ZsYWdzIHw9IDEgPDwKKwkJCQlGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9DQUNIRURfU0dFX1NISUZUOworCQl9IGVsc2UgeworCQkJdGFzay0+dHh3cl9vbmx5LnNnbF9jdHguc2dsLm11bF9zZ2wuY3VyX3NnZV9hZGRyLmxvID0KKwkJCQkJKHUzMiliZF90YmwtPmJkX3RibF9kbWE7CisJCQl0YXNrLT50eHdyX29ubHkuc2dsX2N0eC5zZ2wubXVsX3NnbC5jdXJfc2dlX2FkZHIuaGkgPQorCQkJCQkodTMyKSgodTY0KWJkX3RibC0+YmRfdGJsX2RtYSA+PiAzMik7CisJCQl0YXNrLT50eHdyX29ubHkuc2dsX2N0eC5zZ2wubXVsX3NnbC5zZ2xfc2l6ZSA9CisJCQkJCWJkX3RibC0+YmRfdmFsaWQ7CisJCX0KIAl9CiAKIAkvKlR4IFdyaXRlIFJ4IFJlYWQgKi8KIAkvKiBJbml0IHN0YXRlIHRvIE5PUk1BTCAqLwotCXRhc2stPnR4d3JfcnhyZC5jb25zdF9jdHguaW5pdF9mbGFncyA9IHRhc2tfdHlwZSA8PAorCXRhc2stPnR4d3JfcnhyZC5jb25zdF9jdHguaW5pdF9mbGFncyB8PSB0YXNrX3R5cGUgPDwKIAkJCQlGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9UQVNLX1RZUEVfU0hJRlQ7Ci0JdGFzay0+dHh3cl9yeHJkLmNvbnN0X2N0eC5pbml0X2ZsYWdzIHw9CisJaWYgKGRldl90eXBlID09IFRZUEVfVEFQRSkKKwkJdGFzay0+dHh3cl9yeHJkLmNvbnN0X2N0eC5pbml0X2ZsYWdzIHw9CisJCQkJRkNPRV9UQVNLX0RFVl9UWVBFX1RBUEUgPDwKKwkJCQlGQ09FX1RDRV9UWF9XUl9SWF9SRF9DT05TVF9ERVZfVFlQRV9TSElGVDsKKwllbHNlCisJCXRhc2stPnR4d3JfcnhyZC5jb25zdF9jdHguaW5pdF9mbGFncyB8PQogCQkJCUZDT0VfVEFTS19ERVZfVFlQRV9ESVNLIDw8CiAJCQkJRkNPRV9UQ0VfVFhfV1JfUlhfUkRfQ09OU1RfREVWX1RZUEVfU0hJRlQ7CiAJdGFzay0+dHh3cl9yeHJkLmNvbnN0X2N0eC5pbml0X2ZsYWdzIHw9IEZDT0VfVEFTS19DTEFTU19UWVBFXzMgPDwKQEAgLTE1NTAsNyArMTc4Nyw4IEBACiAJY2FjaGVkX3NnZSA9ICZ0YXNrLT5yeHdyX29ubHkudW5pb25fY3R4LnJlYWRfaW5mby5zZ2xfY3R4LmNhY2hlZF9zZ2U7CiAJc2dsID0gJnRhc2stPnJ4d3Jfb25seS51bmlvbl9jdHgucmVhZF9pbmZvLnNnbF9jdHguc2dsOwogCWJkX2NvdW50ID0gYmRfdGJsLT5iZF92YWxpZDsKLQlpZiAodGFza190eXBlID09IEZDT0VfVEFTS19UWVBFX1JFQUQpIHsKKwlpZiAodGFza190eXBlID09IEZDT0VfVEFTS19UWVBFX1JFQUQgJiYKKwkgICAgZGV2X3R5cGUgPT0gVFlQRV9ESVNLKSB7CiAJCWlmIChiZF9jb3VudCA9PSAxKSB7CiAKIAkJCXN0cnVjdCBmY29lX2JkX2N0eCAqZmNvZV9iZF90YmwgPSBiZF90YmwtPmJkX3RibDsKQEAgLTE1ODIsNiArMTgyMCwxMSBAQAogCQkJCQkodTMyKSgodTY0KWJkX3RibC0+YmRfdGJsX2RtYSA+PiAzMik7CiAJCQlzZ2wtPm11bF9zZ2wuc2dsX3NpemUgPSBiZF9jb3VudDsKIAkJfQorCX0gZWxzZSB7CisJCXNnbC0+bXVsX3NnbC5jdXJfc2dlX2FkZHIubG8gPSAodTMyKWJkX3RibC0+YmRfdGJsX2RtYTsKKwkJc2dsLT5tdWxfc2dsLmN1cl9zZ2VfYWRkci5oaSA9CisJCQkJKHUzMikoKHU2NCliZF90YmwtPmJkX3RibF9kbWEgPj4gMzIpOworCQlzZ2wtPm11bF9zZ2wuc2dsX3NpemUgPSBiZF9jb3VudDsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2lvLmMgYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY19pby5jCmluZGV4IDQ1ZWJhNmQuLjZjYzM3ODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9ibngyZmMvYm54MmZjX2lvLmMKKysrIGIvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfaW8uYwpAQCAtMSw3ICsxLDcgQEAKIC8qIGJueDJmY19pby5jOiBCcm9hZGNvbSBOZXRYdHJlbWUgSUkgTGludXggRkNvRSBvZmZsb2FkIGRyaXZlci4KICAqIElPIG1hbmFnZXIgYW5kIFNDU0kgSU8gcHJvY2Vzc2luZy4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggLSAyMDEwIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggLSAyMDExIEJyb2FkY29tIENvcnBvcmF0aW9uCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CkBAIC0xOCw4ICsxOCw2IEBACiAJCQkgICBpbnQgYmRfaW5kZXgpOwogc3RhdGljIGludCBibngyZmNfbWFwX3NnKHN0cnVjdCBibngyZmNfY21kICppb19yZXEpOwogc3RhdGljIHZvaWQgYm54MmZjX2J1aWxkX2JkX2xpc3RfZnJvbV9zZyhzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxKTsKLXN0YXRpYyBpbnQgYm54MmZjX3Bvc3RfaW9fcmVxKHN0cnVjdCBibngyZmNfcnBvcnQgKnRndCwKLQkJCSAgICAgICBzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxKTsKIHN0YXRpYyB2b2lkIGJueDJmY191bm1hcF9zZ19saXN0KHN0cnVjdCBibngyZmNfY21kICppb19yZXEpOwogc3RhdGljIHZvaWQgYm54MmZjX2ZyZWVfbXBfcmVzYyhzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxKTsKIHN0YXRpYyB2b2lkIGJueDJmY19wYXJzZV9mY3BfcnNwKHN0cnVjdCBibngyZmNfY21kICppb19yZXEsCkBAIC0yOSwxMCArMjcsMTEgQEAKIHZvaWQgYm54MmZjX2NtZF90aW1lcl9zZXQoc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcSwKIAkJCSAgdW5zaWduZWQgaW50IHRpbWVyX21zZWMpCiB7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IGlvX3JlcS0+cG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gaW9fcmVxLT5wb3J0LT5wcml2OwogCi0JaWYgKHF1ZXVlX2RlbGF5ZWRfd29yayhoYmEtPnRpbWVyX3dvcmtfcXVldWUsICZpb19yZXEtPnRpbWVvdXRfd29yaywKLQkJCQkgIG1zZWNzX3RvX2ppZmZpZXModGltZXJfbXNlYykpKQorCWlmIChxdWV1ZV9kZWxheWVkX3dvcmsoaW50ZXJmYWNlLT50aW1lcl93b3JrX3F1ZXVlLAorCQkJICAgICAgICZpb19yZXEtPnRpbWVvdXRfd29yaywKKwkJCSAgICAgICBtc2Vjc190b19qaWZmaWVzKHRpbWVyX21zZWMpKSkKIAkJa3JlZl9nZXQoJmlvX3JlcS0+cmVmY291bnQpOwogfQogCkBAIC0yMTcsNiArMjE2LDExIEBACiAJCXJldHVybjsKIAogCUJOWDJGQ19JT19EQkcoaW9fcmVxLCAic2NzaV9kb25lLiBlcnJfY29kZSA9IDB4JXhcbiIsIGVycl9jb2RlKTsKKwlpZiAodGVzdF9iaXQoQk5YMkZDX0ZMQUdfQ01EX0xPU1QsICZpb19yZXEtPnJlcV9mbGFncykpIHsKKwkJLyogRG8gbm90IGNhbGwgc2NzaSBkb25lIGZvciB0aGlzIElPICovCisJCXJldHVybjsKKwl9CisKIAlibngyZmNfdW5tYXBfc2dfbGlzdChpb19yZXEpOwogCWlvX3JlcS0+c2NfY21kID0gTlVMTDsKIAlpZiAoIXNjX2NtZCkgewpAQCAtNDE5LDggKzQyMyw4IEBACiBzdHJ1Y3QgYm54MmZjX2NtZCAqYm54MmZjX2Vsc3RtX2FsbG9jKHN0cnVjdCBibngyZmNfcnBvcnQgKnRndCwgaW50IHR5cGUpCiB7CiAJc3RydWN0IGZjb2VfcG9ydCAqcG9ydCA9IHRndC0+cG9ydDsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gcG9ydC0+cHJpdjsKLQlzdHJ1Y3QgYm54MmZjX2NtZF9tZ3IgKmNtZF9tZ3IgPSBoYmEtPmNtZF9tZ3I7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19jbWRfbWdyICpjbWRfbWdyID0gaW50ZXJmYWNlLT5oYmEtPmNtZF9tZ3I7CiAJc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0cDsKIAlzdHJ1Y3QgaW9fYmR0ICpiZF90Ymw7CkBAIC00ODUsMTEgKzQ4OSwxMiBAQAogCWtyZWZfaW5pdCgmaW9fcmVxLT5yZWZjb3VudCk7CiAJcmV0dXJuIGlvX3JlcTsKIH0KLXN0YXRpYyBzdHJ1Y3QgYm54MmZjX2NtZCAqYm54MmZjX2NtZF9hbGxvYyhzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QpCisKK3N0cnVjdCBibngyZmNfY21kICpibngyZmNfY21kX2FsbG9jKHN0cnVjdCBibngyZmNfcnBvcnQgKnRndCkKIHsKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0ID0gdGd0LT5wb3J0OwotCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBwb3J0LT5wcml2OwotCXN0cnVjdCBibngyZmNfY21kX21nciAqY21kX21nciA9IGhiYS0+Y21kX21ncjsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2NtZF9tZ3IgKmNtZF9tZ3IgPSBpbnRlcmZhY2UtPmhiYS0+Y21kX21ncjsKIAlzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxOwogCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3RwOwogCXN0cnVjdCBpb19iZHQgKmJkX3RibDsKQEAgLTU3MCw3ICs1NzUsOCBAQAogc3RhdGljIHZvaWQgYm54MmZjX2ZyZWVfbXBfcmVzYyhzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxKQogewogCXN0cnVjdCBibngyZmNfbXBfcmVxICptcF9yZXEgPSAmKGlvX3JlcS0+bXBfcmVxKTsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gaW9fcmVxLT5wb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBpb19yZXEtPnBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IGludGVyZmFjZS0+aGJhOwogCXNpemVfdCBzeiA9IHNpemVvZihzdHJ1Y3QgZmNvZV9iZF9jdHgpOwogCiAJLyogY2xlYXIgdG0gZmxhZ3MgKi8KQEAgLTYwNiw3ICs2MTIsOCBAQAogCXN0cnVjdCBibngyZmNfbXBfcmVxICptcF9yZXE7CiAJc3RydWN0IGZjb2VfYmRfY3R4ICptcF9yZXFfYmQ7CiAJc3RydWN0IGZjb2VfYmRfY3R4ICptcF9yZXNwX2JkOwotCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBpb19yZXEtPnBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IGlvX3JlcS0+cG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gaW50ZXJmYWNlLT5oYmE7CiAJZG1hX2FkZHJfdCBhZGRyOwogCXNpemVfdCBzejsKIApAQCAtNjgyLDcgKzY4OSw3IEBACiAJc3RydWN0IGZjX3Jwb3J0ICpycG9ydCA9IHN0YXJnZXRfdG9fcnBvcnQoc2NzaV90YXJnZXQoc2NfY21kLT5kZXZpY2UpKTsKIAlzdHJ1Y3QgZmNfcnBvcnRfbGliZmNfcHJpdiAqcnAgPSBycG9ydC0+ZGRfZGF0YTsKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0OwotCXN0cnVjdCBibngyZmNfaGJhICpoYmE7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZTsKIAlzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3Q7CiAJc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcTsKIAlzdHJ1Y3QgYm54MmZjX21wX3JlcSAqdG1fcmVxOwpAQCAtNjk5LDEwICs3MDYsMTAgQEAKIAogCWxwb3J0ID0gc2hvc3RfcHJpdihob3N0KTsKIAlwb3J0ID0gbHBvcnRfcHJpdihscG9ydCk7Ci0JaGJhID0gcG9ydC0+cHJpdjsKKwlpbnRlcmZhY2UgPSBwb3J0LT5wcml2OwogCiAJaWYgKHJwb3J0ID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJkZXZpY2VfcmVzZXQ6IHJwb3J0IGlzIE5VTExcbiIpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJkZXZpY2VfcmVzZXQ6IHJwb3J0IGlzIE5VTExcbiIpOwogCQlyYyA9IEZBSUxFRDsKIAkJZ290byB0bWZfZXJyOwogCX0KQEAgLTc0NSw3ICs3NTIsOSBAQAogCXJjID0gYm54MmZjX2luaXRfbXBfcmVxKGlvX3JlcSk7CiAJaWYgKHJjID09IEZBSUxFRCkgewogCQlwcmludGsoS0VSTl9FUlIgUEZYICJUYXNrIG1nbXQgTVAgcmVxdWVzdCBpbml0IGZhaWxlZFxuIik7CisJCXNwaW5fbG9ja19iaCgmdGd0LT50Z3RfbG9jayk7CiAJCWtyZWZfcHV0KCZpb19yZXEtPnJlZmNvdW50LCBibngyZmNfY21kX3JlbGVhc2UpOworCQlzcGluX3VubG9ja19iaCgmdGd0LT50Z3RfbG9jayk7CiAJCWdvdG8gdG1mX2VycjsKIAl9CiAKQEAgLTc3NCw3ICs3ODMsOCBAQAogCWluZGV4ID0geGlkICUgQk5YMkZDX1RBU0tTX1BFUl9QQUdFOwogCiAJLyogSW5pdGlhbGl6ZSB0YXNrIGNvbnRleHQgZm9yIHRoaXMgSU8gcmVxdWVzdCAqLwotCXRhc2tfcGFnZSA9IChzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqKSBoYmEtPnRhc2tfY3R4W3Rhc2tfaWR4XTsKKwl0YXNrX3BhZ2UgPSAoc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKikKKwkJCWludGVyZmFjZS0+aGJhLT50YXNrX2N0eFt0YXNrX2lkeF07CiAJdGFzayA9ICYodGFza19wYWdlW2luZGV4XSk7CiAJYm54MmZjX2luaXRfbXBfdGFzayhpb19yZXEsIHRhc2spOwogCkBAIC04MDYsMTAgKzgxNiwxMCBAQAogCXNwaW5fdW5sb2NrX2JoKCZ0Z3QtPnRndF9sb2NrKTsKIAogCWlmICghcmMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidGFzayBtZ210IGNvbW1hbmQgZmFpbGVkLi4uXG4iKTsKKwkJQk5YMkZDX1RHVF9EQkcodGd0LCAidGFzayBtZ210IGNvbW1hbmQgZmFpbGVkLi4uXG4iKTsKIAkJcmMgPSBGQUlMRUQ7CiAJfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidGFzayBtZ210IGNvbW1hbmQgc3VjY2Vzcy4uLlxuIik7CisJCUJOWDJGQ19UR1RfREJHKHRndCwgInRhc2sgbWdtdCBjb21tYW5kIHN1Y2Nlc3MuLi5cbiIpOwogCQlyYyA9IFNVQ0NFU1M7CiAJfQogdG1mX2VycjoKQEAgLTgyMiw3ICs4MzIsNyBAQAogCXN0cnVjdCBibngyZmNfcnBvcnQgKnRndCA9IGlvX3JlcS0+dGd0OwogCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPSB0Z3QtPnJwb3J0OwogCXN0cnVjdCBmY19ycG9ydF9wcml2ICpyZGF0YSA9IHRndC0+cmRhdGE7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYTsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlOwogCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQ7CiAJc3RydWN0IGJueDJmY19jbWQgKmFidHNfaW9fcmVxOwogCXN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICp0YXNrOwpAQCAtODM5LDcgKzg0OSw3IEBACiAJQk5YMkZDX0lPX0RCRyhpb19yZXEsICJFbnRlcmVkIGJueDJmY19pbml0aWF0ZV9hYnRzXG4iKTsKIAogCXBvcnQgPSBpb19yZXEtPnBvcnQ7Ci0JaGJhID0gcG9ydC0+cHJpdjsKKwlpbnRlcmZhY2UgPSBwb3J0LT5wcml2OwogCWxwb3J0ID0gcG9ydC0+bHBvcnQ7CiAKIAlpZiAoIXRlc3RfYml0KEJOWDJGQ19GTEFHX1NFU1NJT05fUkVBRFksICZ0Z3QtPmZsYWdzKSkgewpAQCAtODQ5LDcgKzg1OSw3IEBACiAJfQogCiAJaWYgKHJwb3J0ID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJpbml0aWF0ZV9hYnRzOiBycG9ydCBpcyBOVUxMXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaW5pdGlhdGVfYWJ0czogcnBvcnQgaXMgTlVMTFxuIik7CiAJCXJjID0gRkFJTEVEOwogCQlnb3RvIGFidHNfZXJyOwogCX0KQEAgLTg5Niw3ICs5MDYsOCBAQAogCWluZGV4ID0geGlkICUgQk5YMkZDX1RBU0tTX1BFUl9QQUdFOwogCiAJLyogSW5pdGlhbGl6ZSB0YXNrIGNvbnRleHQgZm9yIHRoaXMgSU8gcmVxdWVzdCAqLwotCXRhc2tfcGFnZSA9IChzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqKSBoYmEtPnRhc2tfY3R4W3Rhc2tfaWR4XTsKKwl0YXNrX3BhZ2UgPSAoc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKikKKwkJCWludGVyZmFjZS0+aGJhLT50YXNrX2N0eFt0YXNrX2lkeF07CiAJdGFzayA9ICYodGFza19wYWdlW2luZGV4XSk7CiAJYm54MmZjX2luaXRfbXBfdGFzayhhYnRzX2lvX3JlcSwgdGFzayk7CiAKQEAgLTkyNCwxMSArOTM1LDgxIEBACiAJcmV0dXJuIHJjOwogfQogCitpbnQgYm54MmZjX2luaXRpYXRlX3NlcV9jbGVhbnVwKHN0cnVjdCBibngyZmNfY21kICpvcmlnX2lvX3JlcSwgdTMyIG9mZnNldCwKKwkJCQllbnVtIGZjX3JjdGwgcl9jdGwpCit7CisJc3RydWN0IGZjX2xwb3J0ICpscG9ydDsKKwlzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QgPSBvcmlnX2lvX3JlcS0+dGd0OworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2U7CisJc3RydWN0IGZjb2VfcG9ydCAqcG9ydDsKKwlzdHJ1Y3QgYm54MmZjX2NtZCAqc2VxX2NsbnBfcmVxOworCXN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICp0YXNrOworCXN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICp0YXNrX3BhZ2U7CisJc3RydWN0IGJueDJmY19lbHNfY2JfYXJnICpjYl9hcmcgPSBOVUxMOworCWludCB0YXNrX2lkeCwgaW5kZXg7CisJdTE2IHhpZDsKKwlpbnQgcmMgPSAwOworCisJQk5YMkZDX0lPX0RCRyhvcmlnX2lvX3JlcSwgImJueDJmY19pbml0aWF0ZV9zZXFfY2xlYW51cCB4aWQgPSAweCV4XG4iLAorCQkgICBvcmlnX2lvX3JlcS0+eGlkKTsKKwlrcmVmX2dldCgmb3JpZ19pb19yZXEtPnJlZmNvdW50KTsKKworCXBvcnQgPSBvcmlnX2lvX3JlcS0+cG9ydDsKKwlpbnRlcmZhY2UgPSBwb3J0LT5wcml2OworCWxwb3J0ID0gcG9ydC0+bHBvcnQ7CisKKwljYl9hcmcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYm54MmZjX2Vsc19jYl9hcmcpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWNiX2FyZykgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gYWxsb2MgY2JfYXJnIGZvciBzZXEgY2xudXBcbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gY2xlYW51cF9lcnI7CisJfQorCisJc2VxX2NsbnBfcmVxID0gYm54MmZjX2Vsc3RtX2FsbG9jKHRndCwgQk5YMkZDX1NFUV9DTEVBTlVQKTsKKwlpZiAoIXNlcV9jbG5wX3JlcSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJjbGVhbnVwOiBjb3VsZG50IGFsbG9jYXRlIGNtZFxuIik7CisJCXJjID0gLUVOT01FTTsKKwkJa2ZyZWUoY2JfYXJnKTsKKwkJZ290byBjbGVhbnVwX2VycjsKKwl9CisJLyogSW5pdGlhbGl6ZSByZXN0IG9mIGlvX3JlcSBmaWVsZHMgKi8KKwlzZXFfY2xucF9yZXEtPnNjX2NtZCA9IE5VTEw7CisJc2VxX2NsbnBfcmVxLT5wb3J0ID0gcG9ydDsKKwlzZXFfY2xucF9yZXEtPnRndCA9IHRndDsKKwlzZXFfY2xucF9yZXEtPmRhdGFfeGZlcl9sZW4gPSAwOyAvKiBObyBkYXRhIHRyYW5zZmVyIGZvciBjbGVhbnVwICovCisKKwl4aWQgPSBzZXFfY2xucF9yZXEtPnhpZDsKKworCXRhc2tfaWR4ID0geGlkL0JOWDJGQ19UQVNLU19QRVJfUEFHRTsKKwlpbmRleCA9IHhpZCAlIEJOWDJGQ19UQVNLU19QRVJfUEFHRTsKKworCS8qIEluaXRpYWxpemUgdGFzayBjb250ZXh0IGZvciB0aGlzIElPIHJlcXVlc3QgKi8KKwl0YXNrX3BhZ2UgPSAoc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKikKKwkJICAgICBpbnRlcmZhY2UtPmhiYS0+dGFza19jdHhbdGFza19pZHhdOworCXRhc2sgPSAmKHRhc2tfcGFnZVtpbmRleF0pOworCWNiX2FyZy0+YWJvcnRlZF9pb19yZXEgPSBvcmlnX2lvX3JlcTsKKwljYl9hcmctPmlvX3JlcSA9IHNlcV9jbG5wX3JlcTsKKwljYl9hcmctPnJfY3RsID0gcl9jdGw7CisJY2JfYXJnLT5vZmZzZXQgPSBvZmZzZXQ7CisJc2VxX2NsbnBfcmVxLT5jYl9hcmcgPSBjYl9hcmc7CisKKwlwcmludGsoS0VSTl9FUlIgUEZYICJjYWxsIGluaXRfc2VxX2NsZWFudXBfdGFza1xuIik7CisJYm54MmZjX2luaXRfc2VxX2NsZWFudXBfdGFzayhzZXFfY2xucF9yZXEsIHRhc2ssIG9yaWdfaW9fcmVxLCBvZmZzZXQpOworCisJLyogT2J0YWluIGZyZWUgU1EgZW50cnkgKi8KKwlibngyZmNfYWRkXzJfc3EodGd0LCB4aWQpOworCisJLyogUmluZyBkb29yYmVsbCAqLworCWJueDJmY19yaW5nX2Rvb3JiZWxsKHRndCk7CitjbGVhbnVwX2VycjoKKwlyZXR1cm4gcmM7Cit9CisKIGludCBibngyZmNfaW5pdGlhdGVfY2xlYW51cChzdHJ1Y3QgYm54MmZjX2NtZCAqaW9fcmVxKQogewogCXN0cnVjdCBmY19scG9ydCAqbHBvcnQ7CiAJc3RydWN0IGJueDJmY19ycG9ydCAqdGd0ID0gaW9fcmVxLT50Z3Q7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYTsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlOwogCXN0cnVjdCBmY29lX3BvcnQgKnBvcnQ7CiAJc3RydWN0IGJueDJmY19jbWQgKmNsZWFudXBfaW9fcmVxOwogCXN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICp0YXNrOwpAQCAtOTQxLDcgKzEwMjIsNyBAQAogCUJOWDJGQ19JT19EQkcoaW9fcmVxLCAiRW50ZXJlZCBibngyZmNfaW5pdGlhdGVfY2xlYW51cFxuIik7CiAKIAlwb3J0ID0gaW9fcmVxLT5wb3J0OwotCWhiYSA9IHBvcnQtPnByaXY7CisJaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKIAlscG9ydCA9IHBvcnQtPmxwb3J0OwogCiAJY2xlYW51cF9pb19yZXEgPSBibngyZmNfZWxzdG1fYWxsb2ModGd0LCBCTlgyRkNfQ0xFQU5VUCk7CkBAIC05NjMsNyArMTA0NCw4IEBACiAJaW5kZXggPSB4aWQgJSBCTlgyRkNfVEFTS1NfUEVSX1BBR0U7CiAKIAkvKiBJbml0aWFsaXplIHRhc2sgY29udGV4dCBmb3IgdGhpcyBJTyByZXF1ZXN0ICovCi0JdGFza19wYWdlID0gKHN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICopIGhiYS0+dGFza19jdHhbdGFza19pZHhdOworCXRhc2tfcGFnZSA9IChzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqKQorCQkJaW50ZXJmYWNlLT5oYmEtPnRhc2tfY3R4W3Rhc2tfaWR4XTsKIAl0YXNrID0gJih0YXNrX3BhZ2VbaW5kZXhdKTsKIAlvcmlnX3hpZCA9IGlvX3JlcS0+eGlkOwogCkBAIC0xMDMxLDcgKzExMTMsNyBAQAogCiAJbHBvcnQgPSBzaG9zdF9wcml2KHNjX2NtZC0+ZGV2aWNlLT5ob3N0KTsKIAlpZiAoKGxwb3J0LT5zdGF0ZSAhPSBMUE9SVF9TVF9SRUFEWSkgfHwgIShscG9ydC0+bGlua191cCkpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJlaF9hYm9ydDogbGluayBub3QgcmVhZHlcbiIpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJlaF9hYm9ydDogbGluayBub3QgcmVhZHlcbiIpOwogCQlyZXR1cm4gcmM7CiAJfQogCkBAIC0xMDYyLDcgKzExNDQsNyBAQAogCSAqIGlvX3JlcSBpcyBubyBsb25nZXIgaW4gdGhlIGFjdGl2ZV9xLgogCSAqLwogCWlmICh0Z3QtPmZsdXNoX2luX3Byb2cpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJlaF9hYm9ydDogaW9fcmVxICh4aWQgPSAweCV4KSAiCisJCXByaW50ayhLRVJOX0VSUiBQRlggImVoX2Fib3J0OiBpb19yZXEgKHhpZCA9IDB4JXgpICIKIAkJCSJmbHVzaCBpbiBwcm9ncmVzc1xuIiwgaW9fcmVxLT54aWQpOwogCQlrcmVmX3B1dCgmaW9fcmVxLT5yZWZjb3VudCwgYm54MmZjX2NtZF9yZWxlYXNlKTsKIAkJc3Bpbl91bmxvY2tfYmgoJnRndC0+dGd0X2xvY2spOwpAQCAtMTA3MCw3ICsxMTUyLDcgQEAKIAl9CiAKIAlpZiAoaW9fcmVxLT5vbl9hY3RpdmVfcXVldWUgPT0gMCkgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggImVoX2Fib3J0OiBpb19yZXEgKHhpZCA9IDB4JXgpICIKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZWhfYWJvcnQ6IGlvX3JlcSAoeGlkID0gMHgleCkgIgogCQkJCSJub3Qgb24gYWN0aXZlX3FcbiIsIGlvX3JlcS0+eGlkKTsKIAkJLyoKIAkJICogVGhpcyBjb25kaXRpb24gY2FuIGhhcHBlbiBvbmx5IGR1ZSB0byB0aGUgRlcgYnVnLApAQCAtMTEwOCw3ICsxMTkwLDcgQEAKIAkJc2V0X2JpdChCTlgyRkNfRkxBR19FSF9BQk9SVCwgJmlvX3JlcS0+cmVxX2ZsYWdzKTsKIAkJcmMgPSBibngyZmNfaW5pdGlhdGVfYWJ0cyhpb19yZXEpOwogCX0gZWxzZSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiZWhfYWJvcnQ6IGlvX3JlcSAoeGlkID0gMHgleCkgIgorCQlwcmludGsoS0VSTl9FUlIgUEZYICJlaF9hYm9ydDogaW9fcmVxICh4aWQgPSAweCV4KSAiCiAJCQkJImFscmVhZHkgaW4gYWJ0cyBwcm9jZXNzaW5nXG4iLCBpb19yZXEtPnhpZCk7CiAJCWtyZWZfcHV0KCZpb19yZXEtPnJlZmNvdW50LCBibngyZmNfY21kX3JlbGVhc2UpOwogCQlzcGluX3VubG9ja19iaCgmdGd0LT50Z3RfbG9jayk7CkBAIC0xMTQ5LDYgKzEyMzEsNDIgQEAKIAlyZXR1cm4gcmM7CiB9CiAKK3ZvaWQgYm54MmZjX3Byb2Nlc3Nfc2VxX2NsZWFudXBfY29tcGwoc3RydWN0IGJueDJmY19jbWQgKnNlcV9jbG5wX3JlcSwKKwkJCQkgICAgICBzdHJ1Y3QgZmNvZV90YXNrX2N0eF9lbnRyeSAqdGFzaywKKwkJCQkgICAgICB1OCByeF9zdGF0ZSkKK3sKKwlzdHJ1Y3QgYm54MmZjX2Vsc19jYl9hcmcgKmNiX2FyZyA9IHNlcV9jbG5wX3JlcS0+Y2JfYXJnOworCXN0cnVjdCBibngyZmNfY21kICpvcmlnX2lvX3JlcSA9IGNiX2FyZy0+YWJvcnRlZF9pb19yZXE7CisJdTMyIG9mZnNldCA9IGNiX2FyZy0+b2Zmc2V0OworCWVudW0gZmNfcmN0bCByX2N0bCA9IGNiX2FyZy0+cl9jdGw7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3QgPSBvcmlnX2lvX3JlcS0+dGd0OworCisJQk5YMkZDX0lPX0RCRyhvcmlnX2lvX3JlcSwgIkVudGVyZWQgcHJvY2Vzc19jbGVhbnVwX2NvbXBsIHhpZCA9IDB4JXgiCisJCQkgICAgICAiY21kX3R5cGUgPSAlZFxuIiwKKwkJICAgc2VxX2NsbnBfcmVxLT54aWQsIHNlcV9jbG5wX3JlcS0+Y21kX3R5cGUpOworCisJaWYgKHJ4X3N0YXRlID09IEZDT0VfVEFTS19SWF9TVEFURV9JR05PUkVEX1NFUVVFTkNFX0NMRUFOVVApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAic2VxIGNsZWFudXAgaWdub3JlZCAtIHhpZCA9IDB4JXhcbiIsCisJCQlzZXFfY2xucF9yZXEtPnhpZCk7CisJCWdvdG8gZnJlZV9jYl9hcmc7CisJfQorCWtyZWZfZ2V0KCZvcmlnX2lvX3JlcS0+cmVmY291bnQpOworCisJc3Bpbl91bmxvY2tfYmgoJnRndC0+dGd0X2xvY2spOworCXJjID0gYm54MmZjX3NlbmRfc3JyKG9yaWdfaW9fcmVxLCBvZmZzZXQsIHJfY3RsKTsKKwlzcGluX2xvY2tfYmgoJnRndC0+dGd0X2xvY2spOworCisJaWYgKHJjKQorCQlwcmludGsoS0VSTl9FUlIgUEZYICJjbG51cF9jb21wbDogVW5hYmxlIHRvIHNlbmQgU1JSIgorCQkJIiBJTyB3aWxsIGFib3J0XG4iKTsKKwlzZXFfY2xucF9yZXEtPmNiX2FyZyA9IE5VTEw7CisJa3JlZl9wdXQoJm9yaWdfaW9fcmVxLT5yZWZjb3VudCwgYm54MmZjX2NtZF9yZWxlYXNlKTsKK2ZyZWVfY2JfYXJnOgorCWtmcmVlKGNiX2FyZyk7CisJcmV0dXJuOworfQorCiB2b2lkIGJueDJmY19wcm9jZXNzX2NsZWFudXBfY29tcGwoc3RydWN0IGJueDJmY19jbWQgKmlvX3JlcSwKIAkJCQkgIHN0cnVjdCBmY29lX3Rhc2tfY3R4X2VudHJ5ICp0YXNrLAogCQkJCSAgdTggbnVtX3JxKQpAQCAtMTM3OCw3ICsxNDk2LDcgQEAKIAkJCWZjX2hkci0+Zmhfcl9jdGwpOwogCX0KIAlpZiAoIXNjX2NtZC0+U0NwLnB0cikgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggInRtX2NvbXBsOiBTQ3AucHRyIGlzIE5VTExcbiIpOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJ0bV9jb21wbDogU0NwLnB0ciBpcyBOVUxMXG4iKTsKIAkJcmV0dXJuOwogCX0KIAlzd2l0Y2ggKGlvX3JlcS0+ZmNwX3N0YXR1cykgewpAQCAtMTQxMCw3ICsxNTI4LDcgQEAKIAkJaW9fcmVxLT5vbl90bWZfcXVldWUgPSAwOwogCX0gZWxzZSB7CiAKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJDb21tYW5kIG5vdCBvbiBhY3RpdmVfY21kX3F1ZXVlIVxuIik7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNvbW1hbmQgbm90IG9uIGFjdGl2ZV9jbWRfcXVldWUhXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTU5Nyw3ICsxNzE1LDcgQEAKIAogCQlpZiAocnFfYnVmZl9sZW4gPiBudW1fcnEgKiBCTlgyRkNfUlFfQlVGX1NaKSB7CiAJCQkvKiBJbnZhbGlkIHNlbnNlIHNlbnNlIGxlbmd0aC4gKi8KLQkJCXByaW50ayhLRVJOX0FMRVJUIFBGWCAiaW52YWxpZCBzbnMgbGVuZ3RoICVkXG4iLAorCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaW52YWxpZCBzbnMgbGVuZ3RoICVkXG4iLAogCQkJCXJxX2J1ZmZfbGVuKTsKIAkJCS8qIHJlc2V0IHJxX2J1ZmZfbGVuICovCiAJCQlycV9idWZmX2xlbiA9ICBudW1fcnEgKiBCTlgyRkNfUlFfQlVGX1NaOwpAQCAtMTc4MCw3ICsxODk4LDcgQEAKIAkJCXNjc2lfc2V0X3Jlc2lkKHNjX2NtZCwgaW9fcmVxLT5mY3BfcmVzaWQpOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggInNjc2lfY21kX2NvbXBsOiBmY3Bfc3RhdHVzID0gJWRcbiIsCisJCXByaW50ayhLRVJOX0VSUiBQRlggInNjc2lfY21kX2NvbXBsOiBmY3Bfc3RhdHVzID0gJWRcbiIsCiAJCQlpb19yZXEtPmZjcF9zdGF0dXMpOwogCQlicmVhazsKIAl9CkBAIC0xNzg5LDE0ICsxOTA3LDE1IEBACiAJa3JlZl9wdXQoJmlvX3JlcS0+cmVmY291bnQsIGJueDJmY19jbWRfcmVsZWFzZSk7CiB9CiAKLXN0YXRpYyBpbnQgYm54MmZjX3Bvc3RfaW9fcmVxKHN0cnVjdCBibngyZmNfcnBvcnQgKnRndCwKK2ludCBibngyZmNfcG9zdF9pb19yZXEoc3RydWN0IGJueDJmY19ycG9ydCAqdGd0LAogCQkJICAgICAgIHN0cnVjdCBibngyZmNfY21kICppb19yZXEpCiB7CiAJc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKnRhc2s7CiAJc3RydWN0IGZjb2VfdGFza19jdHhfZW50cnkgKnRhc2tfcGFnZTsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpzY19jbWQgPSBpb19yZXEtPnNjX2NtZDsKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0ID0gdGd0LT5wb3J0OwotCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBpbnRlcmZhY2UtPmhiYTsKIAlzdHJ1Y3QgZmNfbHBvcnQgKmxwb3J0ID0gcG9ydC0+bHBvcnQ7CiAJc3RydWN0IGZjb2VfZGV2X3N0YXRzICpzdGF0czsKIAlpbnQgdGFza19pZHgsIGluZGV4OwpAQCAtMTg1NCw3ICsxOTczLDggQEAKIAl9CiAKIAkvKiBUaW1lIElPIHJlcSAqLwotCWJueDJmY19jbWRfdGltZXJfc2V0KGlvX3JlcSwgQk5YMkZDX0lPX1RJTUVPVVQpOworCWlmICh0Z3QtPmlvX3RpbWVvdXQpCisJCWJueDJmY19jbWRfdGltZXJfc2V0KGlvX3JlcSwgQk5YMkZDX0lPX1RJTUVPVVQpOwogCS8qIE9idGFpbiBmcmVlIFNRIGVudHJ5ICovCiAJYm54MmZjX2FkZF8yX3NxKHRndCwgeGlkKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2JueDJmYy9ibngyZmNfdGd0LmMgYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY190Z3QuYwppbmRleCAzZTg5MmJkLi5kNTMxMWI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY190Z3QuYworKysgYi9kcml2ZXJzL3Njc2kvYm54MmZjL2JueDJmY190Z3QuYwpAQCAtMiw3ICsyLDcgQEAKICAqIEhhbmRsZXMgb3BlcmF0aW9ucyBzdWNoIGFzIHNlc3Npb24gb2ZmbG9hZC91cGxvYWQgZXRjLCBhbmQgbWFuYWdlcwogICogc2Vzc2lvbiByZXNvdXJjZXMgc3VjaCBhcyBjb25uZWN0aW9uIGlkIGFuZCBxcCByZXNvdXJjZXMuCiAgKgotICogQ29weXJpZ2h0IChjKSAyMDA4IC0gMjAxMCBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDA4IC0gMjAxMSBCcm9hZGNvbSBDb3Jwb3JhdGlvbgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQpAQCAtNjUsNyArNjUsOCBAQAogewogCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSByZGF0YS0+bG9jYWxfcG9ydDsKIAlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gcmRhdGEtPnJwb3J0OwotCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBpbnRlcmZhY2UtPmhiYTsKIAlpbnQgcnZhbDsKIAlpbnQgaSA9IDA7CiAKQEAgLTIzNyw3ICsyMzgsOCBAQAogc3RhdGljIHZvaWQgYm54MmZjX3VwbG9hZF9zZXNzaW9uKHN0cnVjdCBmY29lX3BvcnQgKnBvcnQsCiAJCQkJCXN0cnVjdCBibngyZmNfcnBvcnQgKnRndCkKIHsKLQlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2ludGVyZmFjZSAqaW50ZXJmYWNlID0gcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgYm54MmZjX2hiYSAqaGJhID0gaW50ZXJmYWNlLT5oYmE7CiAKIAlCTlgyRkNfVEdUX0RCRyh0Z3QsICJ1cGxvYWRfc2Vzc2lvbjogYWN0aXZlX2lvcyA9ICVkXG4iLAogCQl0Z3QtPm51bV9hY3RpdmVfaW9zLmNvdW50ZXIpOwpAQCAtMzE2LDcgKzMxOCw4IEBACiB7CiAKIAlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0ID0gcmRhdGEtPnJwb3J0OwotCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBpbnRlcmZhY2UtPmhiYTsKIAlzdHJ1Y3QgYjU3N3h4X2Rvb3JiZWxsX3NldF9wcm9kICpzcV9kYiA9ICZ0Z3QtPnNxX2RiOwogCXN0cnVjdCBiNTc3eHhfZmNvZV9yeF9kb29yYmVsbCAqcnhfZGIgPSAmdGd0LT5yeF9kYjsKIApAQCAtMzUwLDYgKzM1MywxNCBAQAogCXRndC0+cnFfY29uc19pZHggPSAwOwogCWF0b21pY19zZXQoJnRndC0+bnVtX2FjdGl2ZV9pb3MsIDApOwogCisJaWYgKHJkYXRhLT5mbGFncyAmIEZDX1JQX0ZMQUdTX1JFVFJZKSB7CisJCXRndC0+ZGV2X3R5cGUgPSBUWVBFX1RBUEU7CisJCXRndC0+aW9fdGltZW91dCA9IDA7IC8qIHVzZSBkZWZhdWx0IFVMUCB0aW1lb3V0ICovCisJfSBlbHNlIHsKKwkJdGd0LT5kZXZfdHlwZSA9IFRZUEVfRElTSzsKKwkJdGd0LT5pb190aW1lb3V0ID0gQk5YMkZDX0lPX1RJTUVPVVQ7CisJfQorCiAJLyogaW5pdGlhbGl6ZSBzcSBkb29yYmVsbCAqLwogCXNxX2RiLT5oZWFkZXIuaGVhZGVyID0gQjU3N1hYX0RPT1JCRUxMX0hEUl9EQl9UWVBFOwogCXNxX2RiLT5oZWFkZXIuaGVhZGVyIHw9IEI1NzdYWF9GQ09FX0NPTk5FQ1RJT05fVFlQRSA8PApAQCAtMzkyLDcgKzQwMyw4IEBACiAJCQkJZW51bSBmY19ycG9ydF9ldmVudCBldmVudCkKIHsKIAlzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0ID0gbHBvcnRfcHJpdihscG9ydCk7Ci0Jc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19pbnRlcmZhY2UgKmludGVyZmFjZSA9IHBvcnQtPnByaXY7CisJc3RydWN0IGJueDJmY19oYmEgKmhiYSA9IGludGVyZmFjZS0+aGJhOwogCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQgPSByZGF0YS0+cnBvcnQ7CiAJc3RydWN0IGZjX3Jwb3J0X2xpYmZjX3ByaXYgKnJwOwogCXN0cnVjdCBibngyZmNfcnBvcnQgKnRndDsKQEAgLTQwMyw3ICs0MTUsNyBAQAogCXN3aXRjaCAoZXZlbnQpIHsKIAljYXNlIFJQT1JUX0VWX1JFQURZOgogCQlpZiAoIXJwb3J0KSB7Ci0JCQlwcmludGsoS0VSTl9BTEVSVCBQRlggInJwb3J0IGlzIE5VTEw6IEVSUk9SIVxuIik7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJycG9ydCBpcyBOVUxMOiBFUlJPUiFcbiIpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtNDE1LDcgKzQyNyw3IEBACiAJCQkgKiBXZSBzaG91bGQgbm90IGNvbWUgaGVyZSwgYXMgbHBvcnQgd2lsbAogCQkJICogdGFrZSBjYXJlIG9mIGZhYnJpYyBsb2dpbgogCQkJICovCi0JCQlwcmludGsoS0VSTl9BTEVSVCBQRlggIiV4IC0gcnBvcnRfZXZlbnRfaGFuZGxlciBFUlJPUlxuIiwKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIiV4IC0gcnBvcnRfZXZlbnRfaGFuZGxlciBFUlJPUlxuIiwKIAkJCQlyZGF0YS0+aWRzLnBvcnRfaWQpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTQ4Myw3ICs0OTUsNyBAQAogCQkJYnJlYWs7CiAKIAkJaWYgKCFycG9ydCkgewotCQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICIleCAtIHJwb3J0IG5vdCBjcmVhdGVkIFlldCEhXG4iLAorCQkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIiV4IC0gcnBvcnQgbm90IGNyZWF0ZWQgWWV0ISFcbiIsCiAJCQkJcG9ydF9pZCk7CiAJCQlicmVhazsKIAkJfQpAQCAtNTM3LDcgKzU0OSw4IEBACiBzdHJ1Y3QgYm54MmZjX3Jwb3J0ICpibngyZmNfdGd0X2xvb2t1cChzdHJ1Y3QgZmNvZV9wb3J0ICpwb3J0LAogCQkJCQkgICAgIHUzMiBwb3J0X2lkKQogewotCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaW50ZXJmYWNlICppbnRlcmZhY2UgPSBwb3J0LT5wcml2OworCXN0cnVjdCBibngyZmNfaGJhICpoYmEgPSBpbnRlcmZhY2UtPmhiYTsKIAlzdHJ1Y3QgYm54MmZjX3Jwb3J0ICp0Z3Q7CiAJc3RydWN0IGZjX3Jwb3J0X3ByaXYgKnJkYXRhOwogCWludCBpOwpAQCAtNTUyLDcgKzU2NSw3IEBACiAJCQkJCQkib2J0YWluZWRcbiIpOwogCQkJCQlyZXR1cm4gdGd0OwogCQkJCX0gZWxzZSB7Ci0JCQkJCXByaW50ayhLRVJOX0VSUiBQRlggInJwb3J0IDB4JXggIgorCQkJCQlCTlgyRkNfVEdUX0RCRyh0Z3QsICJycG9ydCAweCV4ICIKIAkJCQkJCSJpcyBpbiBERUxFVEVEIHN0YXRlXG4iLAogCQkJCQkJcmRhdGEtPmlkcy5wb3J0X2lkKTsKIAkJCQkJcmV0dXJuIE5VTEw7CkBAIC02MzMsNyArNjQ2LDcgQEAKIAl0Z3QtPnNxID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCB0Z3QtPnNxX21lbV9zaXplLAogCQkJCSAgICAgJnRndC0+c3FfZG1hLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRndC0+c3EpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJ1bmFibGUgdG8gYWxsb2NhdGUgU1EgbWVtb3J5ICVkXG4iLAorCQlwcmludGsoS0VSTl9FUlIgUEZYICJ1bmFibGUgdG8gYWxsb2NhdGUgU1EgbWVtb3J5ICVkXG4iLAogCQkJdGd0LT5zcV9tZW1fc2l6ZSk7CiAJCWdvdG8gbWVtX2FsbG9jX2ZhaWx1cmU7CiAJfQpAQCAtNjQ2LDcgKzY1OSw3IEBACiAJdGd0LT5jcSA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgdGd0LT5jcV9tZW1fc2l6ZSwKIAkJCQkgICAgICZ0Z3QtPmNxX2RtYSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0Z3QtPmNxKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAidW5hYmxlIHRvIGFsbG9jYXRlIENRIG1lbW9yeSAlZFxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidW5hYmxlIHRvIGFsbG9jYXRlIENRIG1lbW9yeSAlZFxuIiwKIAkJCXRndC0+Y3FfbWVtX3NpemUpOwogCQlnb3RvIG1lbV9hbGxvY19mYWlsdXJlOwogCX0KQEAgLTY1OSw3ICs2NzIsNyBAQAogCXRndC0+cnEgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhiYS0+cGNpZGV2LT5kZXYsIHRndC0+cnFfbWVtX3NpemUsCiAJCQkJCSZ0Z3QtPnJxX2RtYSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0Z3QtPnJxKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAidW5hYmxlIHRvIGFsbG9jYXRlIFJRIG1lbW9yeSAlZFxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidW5hYmxlIHRvIGFsbG9jYXRlIFJRIG1lbW9yeSAlZFxuIiwKIAkJCXRndC0+cnFfbWVtX3NpemUpOwogCQlnb3RvIG1lbV9hbGxvY19mYWlsdXJlOwogCX0KQEAgLTY3MSw3ICs2ODQsNyBAQAogCXRndC0+cnFfcGJsID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCB0Z3QtPnJxX3BibF9zaXplLAogCQkJCQkgJnRndC0+cnFfcGJsX2RtYSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0Z3QtPnJxX3BibCkgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggInVuYWJsZSB0byBhbGxvY2F0ZSBSUSBQQkwgJWRcbiIsCisJCXByaW50ayhLRVJOX0VSUiBQRlggInVuYWJsZSB0byBhbGxvY2F0ZSBSUSBQQkwgJWRcbiIsCiAJCQl0Z3QtPnJxX3BibF9zaXplKTsKIAkJZ290byBtZW1fYWxsb2NfZmFpbHVyZTsKIAl9CkBAIC02OTcsNyArNzEwLDcgQEAKIAl0Z3QtPnhmZXJxID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYmEtPnBjaWRldi0+ZGV2LCB0Z3QtPnhmZXJxX21lbV9zaXplLAogCQkJCQkmdGd0LT54ZmVycV9kbWEsIEdGUF9LRVJORUwpOwogCWlmICghdGd0LT54ZmVycSkgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggInVuYWJsZSB0byBhbGxvY2F0ZSBYRkVSUSAlZFxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidW5hYmxlIHRvIGFsbG9jYXRlIFhGRVJRICVkXG4iLAogCQkJdGd0LT54ZmVycV9tZW1fc2l6ZSk7CiAJCWdvdG8gbWVtX2FsbG9jX2ZhaWx1cmU7CiAJfQpAQCAtNzExLDcgKzcyNCw3IEBACiAJdGd0LT5jb25mcSA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGJhLT5wY2lkZXYtPmRldiwgdGd0LT5jb25mcV9tZW1fc2l6ZSwKIAkJCQkJJnRndC0+Y29uZnFfZG1hLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRndC0+Y29uZnEpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJ1bmFibGUgdG8gYWxsb2NhdGUgQ09ORlEgJWRcbiIsCisJCXByaW50ayhLRVJOX0VSUiBQRlggInVuYWJsZSB0byBhbGxvY2F0ZSBDT05GUSAlZFxuIiwKIAkJCXRndC0+Y29uZnFfbWVtX3NpemUpOwogCQlnb3RvIG1lbV9hbGxvY19mYWlsdXJlOwogCX0KQEAgLTcyNiw3ICs3MzksNyBAQAogCQkJCQkgICAgdGd0LT5jb25mcV9wYmxfc2l6ZSwKIAkJCQkJICAgICZ0Z3QtPmNvbmZxX3BibF9kbWEsIEdGUF9LRVJORUwpOwogCWlmICghdGd0LT5jb25mcV9wYmwpIHsKLQkJcHJpbnRrKEtFUk5fQUxFUlQgUEZYICJ1bmFibGUgdG8gYWxsb2NhdGUgQ09ORlEgUEJMICVkXG4iLAorCQlwcmludGsoS0VSTl9FUlIgUEZYICJ1bmFibGUgdG8gYWxsb2NhdGUgQ09ORlEgUEJMICVkXG4iLAogCQkJdGd0LT5jb25mcV9wYmxfc2l6ZSk7CiAJCWdvdG8gbWVtX2FsbG9jX2ZhaWx1cmU7CiAJfQpAQCAtNzUxLDcgKzc2NCw3IEBACiAJCQkJCSAgdGd0LT5jb25uX2RiX21lbV9zaXplLAogCQkJCQkgICZ0Z3QtPmNvbm5fZGJfZG1hLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRndC0+Y29ubl9kYikgewotCQlwcmludGsoS0VSTl9BTEVSVCBQRlggInVuYWJsZSB0byBhbGxvY2F0ZSBjb25uX2RiICVkXG4iLAorCQlwcmludGsoS0VSTl9FUlIgUEZYICJ1bmFibGUgdG8gYWxsb2NhdGUgY29ubl9kYiAlZFxuIiwKIAkJCQkJCXRndC0+Y29ubl9kYl9tZW1fc2l6ZSk7CiAJCWdvdG8gbWVtX2FsbG9jX2ZhaWx1cmU7CiAJfQpAQCAtNzY3LDcgKzc4MCw3IEBACiAJCQkJICAgICAgJnRndC0+bGNxX2RtYSwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoIXRndC0+bGNxKSB7Ci0JCXByaW50ayhLRVJOX0FMRVJUIFBGWCAidW5hYmxlIHRvIGFsbG9jYXRlIGxjcSAlZFxuIiwKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAidW5hYmxlIHRvIGFsbG9jYXRlIGxjcSAlZFxuIiwKIAkJICAgICAgIHRndC0+bGNxX21lbV9zaXplKTsKIAkJZ290byBtZW1fYWxsb2NfZmFpbHVyZTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9yZGFjLmMgYi9kcml2ZXJzL3Njc2kvZGV2aWNlX2hhbmRsZXIvc2NzaV9kaF9yZGFjLmMKaW5kZXggMmU3YzEzNi4uMjdjOWQ2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2RldmljZV9oYW5kbGVyL3Njc2lfZGhfcmRhYy5jCisrKyBiL2RyaXZlcnMvc2NzaS9kZXZpY2VfaGFuZGxlci9zY3NpX2RoX3JkYWMuYwpAQCAtMTI4LDI1ICsxMjgsNyBAQAogCXU4CXJlc2VydmVkWzJdOwogfTsKIAotc3RydWN0IHJkYWNfY29udHJvbGxlciB7Ci0JdTgJCQlzdWJzeXNfaWRbU1VCU1lTX0lEX0xFTl07Ci0JdTgJCQlzbG90X2lkW1NMT1RfSURfTEVOXTsKLQlpbnQJCQl1c2VfbXMxMDsKLQlzdHJ1Y3Qga3JlZgkJa3JlZjsKLQlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7IC8qIGxpc3Qgb2YgYWxsIGNvbnRyb2xsZXJzICovCi0JdW5pb24JCQl7Ci0JCXN0cnVjdCByZGFjX3BnX2xlZ2FjeSBsZWdhY3k7Ci0JCXN0cnVjdCByZGFjX3BnX2V4cGFuZGVkIGV4cGFuZGVkOwotCX0gbW9kZV9zZWxlY3Q7Ci0JdTgJaW5kZXg7Ci0JdTgJYXJyYXlfbmFtZVtBUlJBWV9MQUJFTF9MRU5dOwotCXNwaW5sb2NrX3QJCW1zX2xvY2s7Ci0JaW50CQkJbXNfcXVldWVkOwotCXN0cnVjdCB3b3JrX3N0cnVjdAltc193b3JrOwotCXN0cnVjdCBzY3NpX2RldmljZQkqbXNfc2RldjsKLQlzdHJ1Y3QgbGlzdF9oZWFkCW1zX2hlYWQ7Ci19OwotCisjZGVmaW5lIFVOSVFVRV9JRF9MRU4gMTYKIHN0cnVjdCBjOF9pbnF1aXJ5IHsKIAl1OAlwZXJpcGhlcmFsX2luZm87CiAJdTgJcGFnZV9jb2RlOyAvKiAweEM4ICovCkBAIC0xNTksMTIgKzE0MSwzMSBAQAogCXU4CXZvbF91c2VyX2xhYmVsX2xlbjsKIAl1OAl2b2xfdXNlcl9sYWJlbFs2MF07CiAJdTgJYXJyYXlfdW5pcV9pZF9sZW47Ci0JdTgJYXJyYXlfdW5pcXVlX2lkWzE2XTsKKwl1OAlhcnJheV91bmlxdWVfaWRbVU5JUVVFX0lEX0xFTl07CiAJdTgJYXJyYXlfdXNlcl9sYWJlbF9sZW47CiAJdTgJYXJyYXlfdXNlcl9sYWJlbFs2MF07CiAJdTgJbHVuWzhdOwogfTsKIAorc3RydWN0IHJkYWNfY29udHJvbGxlciB7CisJdTgJCQlhcnJheV9pZFtVTklRVUVfSURfTEVOXTsKKwlpbnQJCQl1c2VfbXMxMDsKKwlzdHJ1Y3Qga3JlZgkJa3JlZjsKKwlzdHJ1Y3QgbGlzdF9oZWFkCW5vZGU7IC8qIGxpc3Qgb2YgYWxsIGNvbnRyb2xsZXJzICovCisJdW5pb24JCQl7CisJCXN0cnVjdCByZGFjX3BnX2xlZ2FjeSBsZWdhY3k7CisJCXN0cnVjdCByZGFjX3BnX2V4cGFuZGVkIGV4cGFuZGVkOworCX0gbW9kZV9zZWxlY3Q7CisJdTgJaW5kZXg7CisJdTgJYXJyYXlfbmFtZVtBUlJBWV9MQUJFTF9MRU5dOworCXN0cnVjdCBTY3NpX0hvc3QJKmhvc3Q7CisJc3BpbmxvY2tfdAkJbXNfbG9jazsKKwlpbnQJCQltc19xdWV1ZWQ7CisJc3RydWN0IHdvcmtfc3RydWN0CW1zX3dvcms7CisJc3RydWN0IHNjc2lfZGV2aWNlCSptc19zZGV2OworCXN0cnVjdCBsaXN0X2hlYWQJbXNfaGVhZDsKK307CisKIHN0cnVjdCBjMl9pbnF1aXJ5IHsKIAl1OAlwZXJpcGhlcmFsX2luZm87CiAJdTgJcGFnZV9jb2RlOwkvKiAweEMyICovCkBAIC0zNjksMTYgKzM3MCwxNyBAQAogCWtmcmVlKGN0bHIpOwogfQogCi1zdGF0aWMgc3RydWN0IHJkYWNfY29udHJvbGxlciAqZ2V0X2NvbnRyb2xsZXIodTggKnN1YnN5c19pZCwgdTggKnNsb3RfaWQsCi0JCQkJCQljaGFyICphcnJheV9uYW1lKQorc3RhdGljIHN0cnVjdCByZGFjX2NvbnRyb2xsZXIgKmdldF9jb250cm9sbGVyKGludCBpbmRleCwgY2hhciAqYXJyYXlfbmFtZSwKKwkJCXU4ICphcnJheV9pZCwgc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2KQogewogCXN0cnVjdCByZGFjX2NvbnRyb2xsZXIgKmN0bHIsICp0bXA7CiAKIAlzcGluX2xvY2soJmxpc3RfbG9jayk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJmN0bHJfbGlzdCwgbm9kZSkgewotCQlpZiAoKG1lbWNtcCh0bXAtPnN1YnN5c19pZCwgc3Vic3lzX2lkLCBTVUJTWVNfSURfTEVOKSA9PSAwKSAmJgotCQkJICAobWVtY21wKHRtcC0+c2xvdF9pZCwgc2xvdF9pZCwgU0xPVF9JRF9MRU4pID09IDApKSB7CisJCWlmICgobWVtY21wKHRtcC0+YXJyYXlfaWQsIGFycmF5X2lkLCBVTklRVUVfSURfTEVOKSA9PSAwKSAmJgorCQkJICAodG1wLT5pbmRleCA9PSBpbmRleCkgJiYKKwkJCSAgKHRtcC0+aG9zdCA9PSBzZGV2LT5ob3N0KSkgewogCQkJa3JlZl9nZXQoJnRtcC0+a3JlZik7CiAJCQlzcGluX3VubG9jaygmbGlzdF9sb2NrKTsKIAkJCXJldHVybiB0bXA7CkBAIC0zODksMTYgKzM5MSwxMSBAQAogCQlnb3RvIGRvbmU7CiAKIAkvKiBpbml0aWFsaXplIGZpZWxkcyBvZiBjb250cm9sbGVyICovCi0JbWVtY3B5KGN0bHItPnN1YnN5c19pZCwgc3Vic3lzX2lkLCBTVUJTWVNfSURfTEVOKTsKLQltZW1jcHkoY3Rsci0+c2xvdF9pZCwgc2xvdF9pZCwgU0xPVF9JRF9MRU4pOworCW1lbWNweShjdGxyLT5hcnJheV9pZCwgYXJyYXlfaWQsIFVOSVFVRV9JRF9MRU4pOworCWN0bHItPmluZGV4ID0gaW5kZXg7CisJY3Rsci0+aG9zdCA9IHNkZXYtPmhvc3Q7CiAJbWVtY3B5KGN0bHItPmFycmF5X25hbWUsIGFycmF5X25hbWUsIEFSUkFZX0xBQkVMX0xFTik7CiAKLQkvKiB1cGRhdGUgdGhlIGNvbnRyb2xsZXIgaW5kZXggKi8KLQlpZiAoc2xvdF9pZFsxXSA9PSAweDMxKQotCQljdGxyLT5pbmRleCA9IDA7Ci0JZWxzZQotCQljdGxyLT5pbmRleCA9IDE7Ci0KIAlrcmVmX2luaXQoJmN0bHItPmtyZWYpOwogCWN0bHItPnVzZV9tczEwID0gLTE7CiAJY3Rsci0+bXNfcXVldWVkID0gMDsKQEAgLTQ0NCw3ICs0NDEsNyBAQAogfQogCiBzdGF0aWMgaW50IGdldF9sdW5faW5mbyhzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsIHN0cnVjdCByZGFjX2RoX2RhdGEgKmgsCi0JCQljaGFyICphcnJheV9uYW1lKQorCQkJY2hhciAqYXJyYXlfbmFtZSwgdTggKmFycmF5X2lkKQogewogCWludCBlcnIsIGk7CiAJc3RydWN0IGM4X2lucXVpcnkgKmlucXA7CkBAIC00NjMsNiArNDYwLDggQEAKIAkJCSooYXJyYXlfbmFtZStpKSA9IGlucXAtPmFycmF5X3VzZXJfbGFiZWxbKDIqaSkrMV07CiAKIAkJKihhcnJheV9uYW1lK0FSUkFZX0xBQkVMX0xFTi0xKSA9ICdcMCc7CisJCW1lbXNldChhcnJheV9pZCwgMCwgVU5JUVVFX0lEX0xFTik7CisJCW1lbWNweShhcnJheV9pZCwgaW5xcC0+YXJyYXlfdW5pcXVlX2lkLCBpbnFwLT5hcnJheV91bmlxX2lkX2xlbik7CiAJfQogCXJldHVybiBlcnI7CiB9CkBAIC01MDQsMTYgKzUwMywyMCBAQAogfQogCiBzdGF0aWMgaW50IGluaXRpYWxpemVfY29udHJvbGxlcihzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsCi0JCQkJIHN0cnVjdCByZGFjX2RoX2RhdGEgKmgsIGNoYXIgKmFycmF5X25hbWUpCisJCXN0cnVjdCByZGFjX2RoX2RhdGEgKmgsIGNoYXIgKmFycmF5X25hbWUsIHU4ICphcnJheV9pZCkKIHsKLQlpbnQgZXJyOworCWludCBlcnIsIGluZGV4OwogCXN0cnVjdCBjNF9pbnF1aXJ5ICppbnFwOwogCiAJZXJyID0gc3VibWl0X2lucXVpcnkoc2RldiwgMHhDNCwgc2l6ZW9mKHN0cnVjdCBjNF9pbnF1aXJ5KSwgaCk7CiAJaWYgKGVyciA9PSBTQ1NJX0RIX09LKSB7CiAJCWlucXAgPSAmaC0+aW5xLmM0OwotCQloLT5jdGxyID0gZ2V0X2NvbnRyb2xsZXIoaW5xcC0+c3Vic3lzX2lkLCBpbnFwLT5zbG90X2lkLAotCQkJCQlhcnJheV9uYW1lKTsKKwkJLyogZ2V0IHRoZSBjb250cm9sbGVyIGluZGV4ICovCisJCWlmIChpbnFwLT5zbG90X2lkWzFdID09IDB4MzEpCisJCQlpbmRleCA9IDA7CisJCWVsc2UKKwkJCWluZGV4ID0gMTsKKwkJaC0+Y3RsciA9IGdldF9jb250cm9sbGVyKGluZGV4LCBhcnJheV9uYW1lLCBhcnJheV9pZCwgc2Rldik7CiAJCWlmICghaC0+Y3RscikKIAkJCWVyciA9IFNDU0lfREhfUkVTX1RFTVBfVU5BVkFJTDsKIAl9CkBAIC04MzUsNiArODM4LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBlcnI7CiAJY2hhciBhcnJheV9uYW1lW0FSUkFZX0xBQkVMX0xFTl07CisJY2hhciBhcnJheV9pZFtVTklRVUVfSURfTEVOXTsKIAogCXNjc2lfZGhfZGF0YSA9IGt6YWxsb2Moc2l6ZW9mKCpzY3NpX2RoX2RhdGEpCiAJCQkgICAgICAgKyBzaXplb2YoKmgpICwgR0ZQX0tFUk5FTCk7CkBAIC04NDksMTEgKzg1MywxMSBAQAogCWgtPmx1biA9IFVOSU5JVElBTElaRURfTFVOOwogCWgtPnN0YXRlID0gUkRBQ19TVEFURV9BQ1RJVkU7CiAKLQllcnIgPSBnZXRfbHVuX2luZm8oc2RldiwgaCwgYXJyYXlfbmFtZSk7CisJZXJyID0gZ2V0X2x1bl9pbmZvKHNkZXYsIGgsIGFycmF5X25hbWUsIGFycmF5X2lkKTsKIAlpZiAoZXJyICE9IFNDU0lfREhfT0spCiAJCWdvdG8gZmFpbGVkOwogCi0JZXJyID0gaW5pdGlhbGl6ZV9jb250cm9sbGVyKHNkZXYsIGgsIGFycmF5X25hbWUpOworCWVyciA9IGluaXRpYWxpemVfY29udHJvbGxlcihzZGV2LCBoLCBhcnJheV9uYW1lLCBhcnJheV9pZCk7CiAJaWYgKGVyciAhPSBTQ1NJX0RIX09LKQogCQlnb3RvIGZhaWxlZDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2Zjb2UvZmNvZS5jIGIvZHJpdmVycy9zY3NpL2Zjb2UvZmNvZS5jCmluZGV4IDIwNGZhOGQuLmJhNzEwZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9mY29lL2Zjb2UuYworKysgYi9kcml2ZXJzL3Njc2kvZmNvZS9mY29lLmMKQEAgLTQ4Nyw2ICs0ODcsMTkgQEAKIH0KIAogLyoqCisgKiBmY29lX3BvcnRfc2VuZCgpIC0gU2VuZCBhbiBFdGhlcm5ldC1lbmNhcHN1bGF0ZWQgRklQL0ZDb0UgZnJhbWUKKyAqIEBwb3J0OiBUaGUgRkNvRSBwb3J0CisgKiBAc2tiOiBUaGUgRklQL0ZDb0UgcGFja2V0IHRvIGJlIHNlbnQKKyAqLworc3RhdGljIHZvaWQgZmNvZV9wb3J0X3NlbmQoc3RydWN0IGZjb2VfcG9ydCAqcG9ydCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlpZiAocG9ydC0+ZmNvZV9wZW5kaW5nX3F1ZXVlLnFsZW4pCisJCWZjb2VfY2hlY2tfd2FpdF9xdWV1ZShwb3J0LT5scG9ydCwgc2tiKTsKKwllbHNlIGlmIChmY29lX3N0YXJ0X2lvKHNrYikpCisJCWZjb2VfY2hlY2tfd2FpdF9xdWV1ZShwb3J0LT5scG9ydCwgc2tiKTsKK30KKworLyoqCiAgKiBmY29lX2ZpcF9zZW5kKCkgLSBTZW5kIGFuIEV0aGVybmV0LWVuY2Fwc3VsYXRlZCBGSVAgZnJhbWUKICAqIEBmaXA6IFRoZSBGQ29FIGNvbnRyb2xsZXIKICAqIEBza2I6IFRoZSBGSVAgcGFja2V0IHRvIGJlIHNlbnQKQEAgLTQ5NCw3ICs1MDcsNyBAQAogc3RhdGljIHZvaWQgZmNvZV9maXBfc2VuZChzdHJ1Y3QgZmNvZV9jdGxyICpmaXAsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc2tiLT5kZXYgPSBmY29lX2Zyb21fY3RscihmaXApLT5uZXRkZXY7Ci0JZGV2X3F1ZXVlX3htaXQoc2tiKTsKKwlmY29lX3BvcnRfc2VuZChscG9ydF9wcml2KGZpcC0+bHApLCBza2IpOwogfQogCiAvKioKQEAgLTEyNTcsMzAgKzEyNzAsMjAgQEAKIC8qKgogICogZmNvZV9zZWxlY3RfY3B1KCkgLSBTZWxlY3RzIENQVSB0byBoYW5kbGUgcG9zdC1wcm9jZXNzaW5nIG9mIGluY29taW5nCiAgKgkJCWNvbW1hbmQuCi0gKiBAY3Vycl9jcHU6ICAgQ1BVIHdoaWNoIHJlY2VpdmVkIHJlcXVlc3QKICAqCi0gKiBUaGlzIHJvdXRpbmUgc2VsZWN0cyBuZXh0IENQVSBiYXNlZCBvbiBjcHVtYXNrLgorICogVGhpcyByb3V0aW5lIHNlbGVjdHMgbmV4dCBDUFUgYmFzZWQgb24gY3B1bWFzayB0byBkaXN0cmlidXRlCisgKiBpbmNvbWluZyByZXF1ZXN0cyBpbiByb3VuZCByb2Jpbi4KICAqCi0gKiBSZXR1cm5zOiBpbnQgKENQVSBudW1iZXIpLiBDYWxsZXIgdG8gdmVyaWZ5IGlmIHJldHVybmVkIENQVSBpcyBvbmxpbmUgb3Igbm90LgorICogUmV0dXJuczogaW50IENQVSBudW1iZXIKICAqLwotc3RhdGljIHVuc2lnbmVkIGludCBmY29lX3NlbGVjdF9jcHUodW5zaWduZWQgaW50IGN1cnJfY3B1KQorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZmNvZV9zZWxlY3RfY3B1KHZvaWQpCiB7CiAJc3RhdGljIHVuc2lnbmVkIGludCBzZWxlY3RlZF9jcHU7CiAKLQlpZiAobnVtX29ubGluZV9jcHVzKCkgPT0gMSkKLQkJcmV0dXJuIGN1cnJfY3B1OwotCS8qCi0JICogRG9pbmcgZm9sbG93aW5nIGNoZWNrLCB0byBza2lwICJjdXJyX2NwdSAoc21wX3Byb2Nlc3Nvcl9pZCkiCi0JICogZnJvbSBzZWxlY3Rpb24gb2YgQ1BVIGlzIGludGVudGlvbmFsLiBUaGlzIGlzIHRvIGF2b2lkIHNhbWUgQ1BVCi0JICogZG9pbmcgcG9zdC1wcm9jZXNzaW5nIG9mIGNvbW1hbmQuICJjdXJyX2NwdSIgdG8ganVzdCByZWNlaXZlCi0JICogaW5jb21pbmcgcmVxdWVzdCBpbiBjYXNlIHdoZXJlIHJ4X2lkIGlzIFVOS05PV04gYW5kIGFsbCBvdGhlcgotCSAqIENQVSB0byBhY3R1YWxseSBwcm9jZXNzIHRoZSBjb21tYW5kKHMpCi0JICovCi0JZG8gewotCQlzZWxlY3RlZF9jcHUgPSBjcHVtYXNrX25leHQoc2VsZWN0ZWRfY3B1LCBjcHVfb25saW5lX21hc2spOwotCQlpZiAoc2VsZWN0ZWRfY3B1ID49IG5yX2NwdV9pZHMpCi0JCQlzZWxlY3RlZF9jcHUgPSBjcHVtYXNrX2ZpcnN0KGNwdV9vbmxpbmVfbWFzayk7Ci0JfSB3aGlsZSAoc2VsZWN0ZWRfY3B1ID09IGN1cnJfY3B1KTsKKwlzZWxlY3RlZF9jcHUgPSBjcHVtYXNrX25leHQoc2VsZWN0ZWRfY3B1LCBjcHVfb25saW5lX21hc2spOworCWlmIChzZWxlY3RlZF9jcHUgPj0gbnJfY3B1X2lkcykKKwkJc2VsZWN0ZWRfY3B1ID0gY3B1bWFza19maXJzdChjcHVfb25saW5lX21hc2spOworCiAJcmV0dXJuIHNlbGVjdGVkX2NwdTsKIH0KIApAQCAtMTM1MCwzMCArMTM1MywyNiBAQAogCiAJZnIgPSBmY29lX2Rldl9mcm9tX3NrYihza2IpOwogCWZyLT5mcl9kZXYgPSBscG9ydDsKLQlmci0+cHR5cGUgPSBwdHlwZTsKIAogCS8qCiAJICogSW4gY2FzZSB0aGUgaW5jb21pbmcgZnJhbWUncyBleGNoYW5nZSBpcyBvcmlnaW5hdGVkIGZyb20KIAkgKiB0aGUgaW5pdGlhdG9yLCB0aGVuIHJlY2VpdmVkIGZyYW1lJ3MgZXhjaGFuZ2UgaWQgaXMgQU5EZWQKIAkgKiB3aXRoIGZjX2NwdV9tYXNrIGJpdHMgdG8gZ2V0IHRoZSBzYW1lIGNwdSBvbiB3aGljaCBleGNoYW5nZQotCSAqIHdhcyBvcmlnaW5hdGVkLCBvdGhlcndpc2UganVzdCB1c2UgdGhlIGN1cnJlbnQgY3B1LgorCSAqIHdhcyBvcmlnaW5hdGVkLCBvdGhlcndpc2Ugc2VsZWN0IGNwdSB1c2luZyByeCBleGNoYW5nZSBpZAorCSAqIG9yIGZjb2Vfc2VsZWN0X2NwdSgpLgogCSAqLwogCWlmIChudG9oMjQoZmgtPmZoX2ZfY3RsKSAmIEZDX0ZDX0VYX0NUWCkKIAkJY3B1ID0gbnRvaHMoZmgtPmZoX294X2lkKSAmIGZjX2NwdV9tYXNrOwogCWVsc2UgewotCQljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLQkJaWYgKChmaC0+ZmhfdHlwZSA9PSBGQ19UWVBFX0ZDUCkgJiYKLQkJICAgIChudG9ocyhmaC0+ZmhfcnhfaWQpID09IEZDX1hJRF9VTktOT1dOKSkgewotCQkJZG8gewotCQkJCWNwdSA9IGZjb2Vfc2VsZWN0X2NwdShjcHUpOwotCQkJfSB3aGlsZSAoIWNwdV9vbmxpbmUoY3B1KSk7Ci0JCX0gZWxzZSAgaWYgKChmaC0+ZmhfdHlwZSA9PSBGQ19UWVBFX0ZDUCkgJiYKLQkJCSAgICAobnRvaHMoZmgtPmZoX3J4X2lkKSAhPSBGQ19YSURfVU5LTk9XTikpIHsKKwkJaWYgKG50b2hzKGZoLT5maF9yeF9pZCkgPT0gRkNfWElEX1VOS05PV04pCisJCQljcHUgPSBmY29lX3NlbGVjdF9jcHUoKTsKKwkJZWxzZQogCQkJY3B1ID0gbnRvaHMoZmgtPmZoX3J4X2lkKSAmIGZjX2NwdV9tYXNrOwotCQl9IGVsc2UKLQkJCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAl9CisKKwlpZiAoY3B1ID49IG5yX2NwdV9pZHMpCisJCWdvdG8gZXJyOworCiAJZnBzID0gJnBlcl9jcHUoZmNvZV9wZXJjcHUsIGNwdSk7CiAJc3Bpbl9sb2NrX2JoKCZmcHMtPmZjb2VfcnhfbGlzdC5sb2NrKTsKIAlpZiAodW5saWtlbHkoIWZwcy0+dGhyZWFkKSkgewpAQCAtMTU3MiwxMSArMTU3MSw3IEBACiAKIAkvKiBzZW5kIGRvd24gdG8gbGxkICovCiAJZnJfZGV2KGZwKSA9IGxwb3J0OwotCWlmIChwb3J0LT5mY29lX3BlbmRpbmdfcXVldWUucWxlbikKLQkJZmNvZV9jaGVja193YWl0X3F1ZXVlKGxwb3J0LCBza2IpOwotCWVsc2UgaWYgKGZjb2Vfc3RhcnRfaW8oc2tiKSkKLQkJZmNvZV9jaGVja193YWl0X3F1ZXVlKGxwb3J0LCBza2IpOwotCisJZmNvZV9wb3J0X3NlbmQocG9ydCwgc2tiKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2hwc2EuYyBiL2RyaXZlcnMvc2NzaS9ocHNhLmMKaW5kZXggYzZmOTliMS4uZWM2MWJkYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2hwc2EuYworKysgYi9kcml2ZXJzL3Njc2kvaHBzYS5jCkBAIC0xMjE5LDggKzEyMTksOCBAQAogCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiY3AgJXAgcmVwb3J0cyBhYm9ydCBmYWlsZWRcbiIsIGNwKTsKIAkJYnJlYWs7CiAJY2FzZSBDTURfVU5TT0xJQ0lURURfQUJPUlQ6Ci0JCWNtZC0+cmVzdWx0ID0gRElEX1JFU0VUIDw8IDE2OwotCQlkZXZfd2FybigmaC0+cGRldi0+ZGV2LCAiY3AgJXAgYWJvcnRlZCBkbyB0byBhbiB1bnNvbGljaXRlZCAiCisJCWNtZC0+cmVzdWx0ID0gRElEX1NPRlRfRVJST1IgPDwgMTY7IC8qIHJldHJ5IHRoZSBjb21tYW5kICovCisJCWRldl93YXJuKCZoLT5wZGV2LT5kZXYsICJjcCAlcCBhYm9ydGVkIGR1ZSB0byBhbiB1bnNvbGljaXRlZCAiCiAJCQkiYWJvcnRcbiIsIGNwKTsKIAkJYnJlYWs7CiAJY2FzZSBDTURfVElNRU9VVDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ocHNhLmggYi9kcml2ZXJzL3Njc2kvaHBzYS5oCmluZGV4IDZkOGRjZDQuLjdmNTNjZWFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvaHBzYS5oCisrKyBiL2RyaXZlcnMvc2NzaS9ocHNhLmgKQEAgLTIxNCw3ICsyMTQsNyBAQAogCWRldl9kYmcoJmgtPnBkZXYtPmRldiwgIlNlbmRpbmcgJXgsIHRhZyA9ICV4XG4iLCBjLT5idXNhZGRyLAogCQljLT5IZWFkZXIuVGFnLmxvd2VyKTsKIAl3cml0ZWwoYy0+YnVzYWRkciwgaC0+dmFkZHIgKyBTQTVfUkVRVUVTVF9QT1JUX09GRlNFVCk7Ci0JKHZvaWQpIHJlYWRsKGgtPnZhZGRyICsgU0E1X1JFUVVFU1RfUE9SVF9PRkZTRVQpOworCSh2b2lkKSByZWFkbChoLT52YWRkciArIFNBNV9TQ1JBVENIUEFEX09GRlNFVCk7CiAJaC0+Y29tbWFuZHNfb3V0c3RhbmRpbmcrKzsKIAlpZiAoaC0+Y29tbWFuZHNfb3V0c3RhbmRpbmcgPiBoLT5tYXhfb3V0c3RhbmRpbmcpCiAJCWgtPm1heF9vdXRzdGFuZGluZyA9IGgtPmNvbW1hbmRzX291dHN0YW5kaW5nOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2lwci5jIGIvZHJpdmVycy9zY3NpL2lwci5jCmluZGV4IDg4ODA4NmMuLjhkNjM2MzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9pcHIuYworKysgYi9kcml2ZXJzL3Njc2kvaXByLmMKQEAgLTg3NzgsMTQgKzg3NzgsMTQgQEAKIAlpZiAocmMgIT0gUENJQklPU19TVUNDRVNTRlVMKSB7CiAJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBzYXZlIFBDSSBjb25maWcgc3BhY2VcbiIpOwogCQlyYyA9IC1FSU87Ci0JCWdvdG8gY2xlYW51cF9ub21lbTsKKwkJZ290byBvdXRfbXNpX2Rpc2FibGU7CiAJfQogCiAJaWYgKChyYyA9IGlwcl9zYXZlX3BjaXhfY21kX3JlZyhpb2FfY2ZnKSkpCi0JCWdvdG8gY2xlYW51cF9ub21lbTsKKwkJZ290byBvdXRfbXNpX2Rpc2FibGU7CiAKIAlpZiAoKHJjID0gaXByX3NldF9wY2l4X2NtZF9yZWcoaW9hX2NmZykpKQotCQlnb3RvIGNsZWFudXBfbm9tZW07CisJCWdvdG8gb3V0X21zaV9kaXNhYmxlOwogCiAJaWYgKGlvYV9jZmctPnNpczY0KQogCQlpb2FfY2ZnLT5jZmdfdGFibGVfc2l6ZSA9IChzaXplb2Yoc3RydWN0IGlwcl9jb25maWdfdGFibGVfaGRyNjQpCkBAIC04ODAwLDcgKzg4MDAsNyBAQAogCWlmIChyYyA8IDApIHsKIAkJZGV2X2VycigmcGRldi0+ZGV2LAogCQkJIkNvdWxkbid0IGFsbG9jYXRlIGVub3VnaCBtZW1vcnkgZm9yIGRldmljZSBkcml2ZXIhXG4iKTsKLQkJZ290byBjbGVhbnVwX25vbWVtOworCQlnb3RvIG91dF9tc2lfZGlzYWJsZTsKIAl9CiAKIAkvKgpAQCAtODg0NSwxMCArODg0NSwxMCBAQAogCiBjbGVhbnVwX25vbG9nOgogCWlwcl9mcmVlX21lbShpb2FfY2ZnKTsKLWNsZWFudXBfbm9tZW06Ci0JaW91bm1hcChpcHJfcmVncyk7CiBvdXRfbXNpX2Rpc2FibGU6CiAJcGNpX2Rpc2FibGVfbXNpKHBkZXYpOworY2xlYW51cF9ub21lbToKKwlpb3VubWFwKGlwcl9yZWdzKTsKIG91dF9yZWxlYXNlX3JlZ2lvbnM6CiAJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKIG91dF9zY3NpX2hvc3RfcHV0OgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2V4Y2guYyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19leGNoLmMKaW5kZXggZjVhMDY2NS4uMDFmZjA4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2V4Y2guYworKysgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZXhjaC5jCkBAIC04MDIsMTAgKzgwMiw4IEBACiAJCXBvb2wgPSBwZXJfY3B1X3B0cihtcC0+cG9vbCwgeGlkICYgZmNfY3B1X21hc2spOwogCQlzcGluX2xvY2tfYmgoJnBvb2wtPmxvY2spOwogCQllcCA9IGZjX2V4Y2hfcHRyX2dldChwb29sLCAoeGlkIC0gbXAtPm1pbl94aWQpID4+IGZjX2NwdV9vcmRlcik7Ci0JCWlmIChlcCkgeworCQlpZiAoZXAgJiYgZXAtPnhpZCA9PSB4aWQpCiAJCQlmY19leGNoX2hvbGQoZXApOwotCQkJV0FSTl9PTihlcC0+eGlkICE9IHhpZCk7Ci0JCX0KIAkJc3Bpbl91bmxvY2tfYmgoJnBvb2wtPmxvY2spOwogCX0KIAlyZXR1cm4gZXA7CkBAIC0yNDY1LDggKzI0NjMsMTEgQEAKIAogCWZjX2V4Y2hfd29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImZjX2V4Y2hfd29ya3F1ZXVlIik7CiAJaWYgKCFmY19leGNoX3dvcmtxdWV1ZSkKLQkJcmV0dXJuIC1FTk9NRU07CisJCWdvdG8gZXJyOwogCXJldHVybiAwOworZXJyOgorCWttZW1fY2FjaGVfZGVzdHJveShmY19lbV9jYWNoZXApOworCXJldHVybiAtRU5PTUVNOwogfQogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9saWJmYy9mY19mY3AuYyBiL2RyaXZlcnMvc2NzaS9saWJmYy9mY19mY3AuYwppbmRleCA5Y2QyMTQ5Li5hZmI2M2M4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGliZmMvZmNfZmNwLmMKKysrIGIvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2ZjcC5jCkBAIC00OTgsNyArNDk4LDcgQEAKIAkJCXN0YXRzID0gcGVyX2NwdV9wdHIobHBvcnQtPmRldl9zdGF0cywgZ2V0X2NwdSgpKTsKIAkJCXN0YXRzLT5FcnJvckZyYW1lcysrOwogCQkJLyogcGVyIGNwdSBjb3VudCwgbm90IHRvdGFsIGNvdW50LCBidXQgT0sgZm9yIGxpbWl0ICovCi0JCQlpZiAoc3RhdHMtPkludmFsaWRDUkNDb3VudCsrIDwgNSkKKwkJCWlmIChzdGF0cy0+SW52YWxpZENSQ0NvdW50KysgPCBGQ19NQVhfRVJST1JfQ05UKQogCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImxpYmZjOiBDUkMgZXJyb3Igb24gZGF0YSAiCiAJCQkJICAgICAgICJmcmFtZSBmb3IgcG9ydCAoJTYuNngpXG4iLAogCQkJCSAgICAgICBscG9ydC0+cG9ydF9pZCk7CkBAIC02OTAsNyArNjkwLDcgQEAKIH0KIAogLyoqCi0gKiBmY19mY3BfYWJ0c19yZXNwKCkgLSBTZW5kIGFuIEFCVFMgcmVzcG9uc2UKKyAqIGZjX2ZjcF9hYnRzX3Jlc3AoKSAtIFJlY2VpdmUgYW4gQUJUUyByZXNwb25zZQogICogQGZzcDogVGhlIEZDUCBwYWNrZXQgdGhhdCBpcyBiZWluZyBhYm9ydGVkCiAgKiBAZnA6CSBUaGUgcmVzcG9uc2UgZnJhbWUKICAqLwpAQCAtNzMwLDcgKzczMCw3IEBACiB9CiAKIC8qKgotICogZmNfZmNwX3JlY3YoKSAtIFJldmVpdmUgYW4gRkNQIGZyYW1lCisgKiBmY19mY3BfcmVjdigpIC0gUmVjZWl2ZSBhbiBGQ1AgZnJhbWUKICAqIEBzZXE6IFRoZSBzZXF1ZW5jZSB0aGUgZnJhbWUgaXMgb24KICAqIEBmcDoJIFRoZSByZWNlaXZlZCBmcmFtZQogICogQGFyZzogVGhlIHJlbGF0ZWQgRkNQIHBhY2tldApAQCAtMTA4NCw2ICsxMDg0LDcgQEAKIAlyYyA9IGxwb3J0LT50dC5mY3BfY21kX3NlbmQobHBvcnQsIGZzcCwgZmNfZmNwX3JlY3YpOwogCWlmICh1bmxpa2VseShyYykpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnNpLT5zY3NpX3F1ZXVlX2xvY2ssIGZsYWdzKTsKKwkJZnNwLT5jbWQtPlNDcC5wdHIgPSBOVUxMOwogCQlsaXN0X2RlbCgmZnNwLT5saXN0KTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2ktPnNjc2lfcXVldWVfbG9jaywgZmxhZ3MpOwogCX0KQEAgLTE2NDUsMTIgKzE2NDYsMTAgQEAKIAlzdHJ1Y3QgZmNfc2VxICpzZXE7CiAJc3RydWN0IGZjcF9zcnIgKnNycjsKIAlzdHJ1Y3QgZmNfZnJhbWUgKmZwOwotCXU4IGNkYl9vcDsKIAl1bnNpZ25lZCBpbnQgcmVjX3RvdjsKIAogCXJwb3J0ID0gZnNwLT5ycG9ydDsKIAlycHJpdiA9IHJwb3J0LT5kZF9kYXRhOwotCWNkYl9vcCA9IGZzcC0+Y2RiX2NtZC5mY19jZGJbMF07CiAKIAlpZiAoIShycHJpdi0+ZmxhZ3MgJiBGQ19SUF9GTEFHU19SRVRSWSkgfHwKIAkgICAgcnByaXYtPnJwX3N0YXRlICE9IFJQT1JUX1NUX1JFQURZKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xpYmZjL2ZjX2xwb3J0LmMgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfbHBvcnQuYwppbmRleCBlMDA4YjE2Li5lNTVlZDljIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGliZmMvZmNfbHBvcnQuYworKysgYi9kcml2ZXJzL3Njc2kvbGliZmMvZmNfbHBvcnQuYwpAQCAtMTM1Miw3ICsxMzUyLDYgQEAKIAkJV0FSTl9PTigxKTsKIAkJYnJlYWs7CiAJY2FzZSBMUE9SVF9TVF9SRUFEWToKLQkJV0FSTl9PTigxKTsKIAkJYnJlYWs7CiAJY2FzZSBMUE9SVF9TVF9SRVNFVDoKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19leHBhbmRlci5jIGIvZHJpdmVycy9zY3NpL2xpYnNhcy9zYXNfZXhwYW5kZXIuYwppbmRleCA4NzRlMjlkLi5mODQwODRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbGlic2FzL3Nhc19leHBhbmRlci5jCisrKyBiL2RyaXZlcnMvc2NzaS9saWJzYXMvc2FzX2V4cGFuZGVyLmMKQEAgLTg0OSw2ICs4NDksOSBAQAogCiAJcmVzID0gc2FzX2Rpc2NvdmVyX2V4cGFuZGVyKGNoaWxkKTsKIAlpZiAocmVzKSB7CisJCXNwaW5fbG9ja19pcnEoJnBhcmVudC0+cG9ydC0+ZGV2X2xpc3RfbG9jayk7CisJCWxpc3RfZGVsKCZjaGlsZC0+ZGV2X2xpc3Rfbm9kZSk7CisJCXNwaW5fdW5sb2NrX2lycSgmcGFyZW50LT5wb3J0LT5kZXZfbGlzdF9sb2NrKTsKIAkJa2ZyZWUoY2hpbGQpOwogCQlyZXR1cm4gTlVMTDsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjLmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjLmgKaW5kZXggOGVjMmM4Ni4uYzA4OGEzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmYy5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmMuaApAQCAtMjAsNiArMjAsMTEgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaW5jbHVkZSA8c2NzaS9zY3NpX2hvc3QuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX0ZTKSAmJiAhZGVmaW5lZChDT05GSUdfU0NTSV9MUEZDX0RFQlVHX0ZTKQorI2RlZmluZSBDT05GSUdfU0NTSV9MUEZDX0RFQlVHX0ZTCisjZW5kaWYKKwogc3RydWN0IGxwZmNfc2xpMl9zbGltOwogCiAjZGVmaW5lIExQRkNfUENJX0RFVl9MUAkJMHgxCkBAIC00NjUsOSArNDcwLDEwIEBACiBzdHJ1Y3QgdW5zb2xfcmN2X2N0X2N0eCB7CiAJdWludDMyX3QgY3R4dF9pZDsKIAl1aW50MzJfdCBTSUQ7Ci0JdWludDMyX3Qgb3hpZDsKIAl1aW50MzJfdCBmbGFnczsKICNkZWZpbmUgVU5TT0xfVkFMSUQJMHgwMDAwMDAwMQorCXVpbnQxNl90IG94aWQ7CisJdWludDE2X3QgcnhpZDsKIH07CiAKICNkZWZpbmUgTFBGQ19VU0VSX0xJTktfU1BFRURfQVVUTwkwCS8qIGF1dG8gc2VsZWN0IChkZWZhdWx0KSovCkBAIC02NzQsNiArNjgwLDkgQEAKIAl1aW50MzJfdCBjZmdfZW5hYmxlX3JycTsKIAl1aW50MzJfdCBjZmdfdG9wb2xvZ3k7CiAJdWludDMyX3QgY2ZnX2xpbmtfc3BlZWQ7CisjZGVmaW5lIExQRkNfRkNGX0ZPViAxCQkvKiBGYXN0IGZjZiBmYWlsb3ZlciAqLworI2RlZmluZSBMUEZDX0ZDRl9QUklPUklUWSAyCS8qIFByaW9yaXR5IGZjZiBmYWlsb3ZlciAqLworCXVpbnQzMl90IGNmZ19mY2ZfZmFpbG92ZXJfcG9saWN5OwogCXVpbnQzMl90IGNmZ19jcl9kZWxheTsKIAl1aW50MzJfdCBjZmdfY3JfY291bnQ7CiAJdWludDMyX3QgY2ZnX211bHRpX3Jpbmdfc3VwcG9ydDsKQEAgLTg0NSw5ICs4NTQsMTMgQEAKIAkvKiBpRGlhZyBkZWJ1Z2ZzIHN1Yi1kaXJlY3RvcnkgKi8KIAlzdHJ1Y3QgZGVudHJ5ICppZGlhZ19yb290OwogCXN0cnVjdCBkZW50cnkgKmlkaWFnX3BjaV9jZmc7CisJc3RydWN0IGRlbnRyeSAqaWRpYWdfYmFyX2FjYzsKIAlzdHJ1Y3QgZGVudHJ5ICppZGlhZ19xdWVfaW5mbzsKIAlzdHJ1Y3QgZGVudHJ5ICppZGlhZ19xdWVfYWNjOwogCXN0cnVjdCBkZW50cnkgKmlkaWFnX2RyYl9hY2M7CisJc3RydWN0IGRlbnRyeSAqaWRpYWdfY3RsX2FjYzsKKwlzdHJ1Y3QgZGVudHJ5ICppZGlhZ19tYnhfYWNjOworCXN0cnVjdCBkZW50cnkgKmlkaWFnX2V4dF9hY2M7CiAjZW5kaWYKIAogCS8qIFVzZWQgZm9yIGRlZmVycmVkIGZyZWVpbmcgb2YgRUxTIGRhdGEgYnVmZmVycyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19hdHRyLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2F0dHIuYwppbmRleCAxMzVhNTNiLi4yNTQyZjFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2F0dHIuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2F0dHIuYwpAQCAtNzU1LDYgKzc1NSw0NyBAQAogfQogCiAvKioKKyAqIGxwZmNfc2xpNF9wZGV2X3N0YXR1c19yZWdfd2FpdCAtIFdhaXQgZm9yIHBkZXYgc3RhdHVzIHJlZ2lzdGVyIGZvciByZWFkeW5lc3MKKyAqIEBwaGJhOiBscGZjX2hiYSBwb2ludGVyLgorICoKKyAqIERlc2NyaXB0aW9uOgorICogU0xJNCBpbnRlcmZhY2UgdHlwZS0yIGRldmljZSB0byB3YWl0IG9uIHRoZSBzbGlwb3J0IHN0YXR1cyByZWdpc3RlciBmb3IKKyAqIHRoZSByZWFkeW5lc3MgYWZ0ZXIgcGVyZm9ybWluZyBhIGZpcm13YXJlIHJlc2V0LgorICoKKyAqIFJldHVybnM6CisgKiB6ZXJvIGZvciBzdWNjZXNzCisgKiovCitzdGF0aWMgaW50CitscGZjX3NsaTRfcGRldl9zdGF0dXNfcmVnX3dhaXQoc3RydWN0IGxwZmNfaGJhICpwaGJhKQoreworCXN0cnVjdCBscGZjX3JlZ2lzdGVyIHBvcnRzdGF0X3JlZzsKKwlpbnQgaTsKKworCisJbHBmY19yZWFkbChwaGJhLT5zbGk0X2hiYS51LmlmX3R5cGUyLlNUQVRVU3JlZ2FkZHIsCisJCSAgICZwb3J0c3RhdF9yZWcud29yZDApOworCisJLyogd2FpdCBmb3IgdGhlIFNMSSBwb3J0IGZpcm13YXJlIHJlYWR5IGFmdGVyIGZpcm13YXJlIHJlc2V0ICovCisJZm9yIChpID0gMDsgaSA8IExQRkNfRldfUkVTRVRfTUFYSU1VTV9XQUlUXzEwTVNfQ05UOyBpKyspIHsKKwkJbXNsZWVwKDEwKTsKKwkJbHBmY19yZWFkbChwaGJhLT5zbGk0X2hiYS51LmlmX3R5cGUyLlNUQVRVU3JlZ2FkZHIsCisJCQkgICAmcG9ydHN0YXRfcmVnLndvcmQwKTsKKwkJaWYgKCFiZl9nZXQobHBmY19zbGlwb3J0X3N0YXR1c19lcnIsICZwb3J0c3RhdF9yZWcpKQorCQkJY29udGludWU7CisJCWlmICghYmZfZ2V0KGxwZmNfc2xpcG9ydF9zdGF0dXNfcm4sICZwb3J0c3RhdF9yZWcpKQorCQkJY29udGludWU7CisJCWlmICghYmZfZ2V0KGxwZmNfc2xpcG9ydF9zdGF0dXNfcmR5LCAmcG9ydHN0YXRfcmVnKSkKKwkJCWNvbnRpbnVlOworCQlicmVhazsKKwl9CisKKwlpZiAoaSA8IExQRkNfRldfUkVTRVRfTUFYSU1VTV9XQUlUXzEwTVNfQ05UKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAtRUlPOworfQorCisvKioKICAqIGxwZmNfc2xpNF9wZGV2X3JlZ19yZXF1ZXN0IC0gUmVxdWVzdCBwaHlzaWNhbCBkZXYgdG8gcGVyZm9ybSBhIHJlZ2lzdGVyIGFjYwogICogQHBoYmE6IGxwZmNfaGJhIHBvaW50ZXIuCiAgKgpAQCAtNzY5LDYgKzgxMCw3IEBACiBscGZjX3NsaTRfcGRldl9yZWdfcmVxdWVzdChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHVpbnQzMl90IG9wY29kZSkKIHsKIAlzdHJ1Y3QgY29tcGxldGlvbiBvbmxpbmVfY29tcGw7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBwaGJhLT5wY2lkZXY7CiAJdWludDMyX3QgcmVnX3ZhbDsKIAlpbnQgc3RhdHVzID0gMDsKIAlpbnQgcmM7CkBAIC03ODEsNiArODIzLDE0IEBACiAJICAgICBMUEZDX1NMSV9JTlRGX0lGX1RZUEVfMikpCiAJCXJldHVybiAtRVBFUk07CiAKKwlpZiAoIXBkZXYtPmlzX3BoeXNmbikKKwkJcmV0dXJuIC1FUEVSTTsKKworCS8qIERpc2FibGUgU1ItSU9WIHZpcnR1YWwgZnVuY3Rpb25zIGlmIGVuYWJsZWQgKi8KKwlpZiAocGhiYS0+Y2ZnX3NyaW92X25yX3ZpcnRmbikgeworCQlwY2lfZGlzYWJsZV9zcmlvdihwZGV2KTsKKwkJcGhiYS0+Y2ZnX3NyaW92X25yX3ZpcnRmbiA9IDA7CisJfQogCXN0YXR1cyA9IGxwZmNfZG9fb2ZmbGluZShwaGJhLCBMUEZDX0VWVF9PRkZMSU5FKTsKIAogCWlmIChzdGF0dXMgIT0gMCkKQEAgLTgwNSw3ICs4NTUsMTAgQEAKIAlyZWFkbChwaGJhLT5zbGk0X2hiYS5jb25mX3JlZ3NfbWVtbWFwX3AgKyBMUEZDX0NUTF9QREVWX0NUTF9PRkZTRVQpOwogCiAJLyogZGVsYXkgZHJpdmVyIGFjdGlvbiBmb2xsb3dpbmcgSUZfVFlQRV8yIHJlc2V0ICovCi0JbXNsZWVwKDEwMCk7CisJcmMgPSBscGZjX3NsaTRfcGRldl9zdGF0dXNfcmVnX3dhaXQocGhiYSk7CisKKwlpZiAocmMpCisJCXJldHVybiAtRUlPOwogCiAJaW5pdF9jb21wbGV0aW9uKCZvbmxpbmVfY29tcGwpOwogCXJjID0gbHBmY193b3JrcV9wb3N0X2V2ZW50KHBoYmEsICZzdGF0dXMsICZvbmxpbmVfY29tcGwsCkBAIC04OTUsNiArOTQ4LDEwIEBACiAKIAlpZiAoIXBoYmEtPmNmZ19lbmFibGVfaGJhX3Jlc2V0KQogCQlyZXR1cm4gLUVBQ0NFUzsKKworCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fRVJSLCBMT0dfSU5JVCwKKwkJIjMwNTAgbHBmY19ib2FyZF9tb2RlIHNldCB0byAlc1xuIiwgYnVmKTsKKwogCWluaXRfY29tcGxldGlvbigmb25saW5lX2NvbXBsKTsKIAogCWlmKHN0cm5jbXAoYnVmLCAib25saW5lIiwgc2l6ZW9mKCJvbmxpbmUiKSAtIDEpID09IDApIHsKQEAgLTEyOTAsNiArMTM0NywxMCBAQAogCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpCiAJCXZhbCA9IDA7CiAKKwlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0VSUiwgTE9HX0lOSVQsCisJCSIzMDUxIGxwZmNfcG9sbCBjaGFuZ2VkIGZyb20gJWQgdG8gJWRcbiIsCisJCXBoYmEtPmNmZ19wb2xsLCB2YWwpOworCiAJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CiAKIAlvbGRfdmFsID0gcGhiYS0+Y2ZnX3BvbGw7CkBAIC0xNDE0LDgwICsxNDc1LDEwIEBACiAJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChkZXYpOwogCXN0cnVjdCBscGZjX3Zwb3J0ICp2cG9ydCA9IChzdHJ1Y3QgbHBmY192cG9ydCAqKSBzaG9zdC0+aG9zdGRhdGE7CiAJc3RydWN0IGxwZmNfaGJhICpwaGJhID0gdnBvcnQtPnBoYmE7Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBwaGJhLT5wY2lkZXY7Ci0JdW5pb24gIGxwZmNfc2xpNF9jZmdfc2hkciAqc2hkcjsKLQl1aW50MzJfdCBzaGRyX3N0YXR1cywgc2hkcl9hZGRfc3RhdHVzOwotCUxQRkNfTUJPWFFfdCAqbWJveHE7Ci0Jc3RydWN0IGxwZmNfbWJ4X2dldF9wcm9mX2NmZyAqZ2V0X3Byb2ZfY2ZnOwotCXN0cnVjdCBscGZjX3JzcmNfZGVzY19wY2llICpkZXNjOwotCXVpbnQzMl90IG1heF9ucl92aXJ0Zm47Ci0JdWludDMyX3QgZGVzY19jb3VudDsKLQlpbnQgbGVuZ3RoLCByYywgaTsKKwl1aW50MTZfdCBtYXhfbnJfdmlydGZuOwogCi0JaWYgKChwaGJhLT5zbGlfcmV2IDwgTFBGQ19TTElfUkVWNCkgfHwKLQkgICAgKGJmX2dldChscGZjX3NsaV9pbnRmX2lmX3R5cGUsICZwaGJhLT5zbGk0X2hiYS5zbGlfaW50ZikgIT0KLQkgICAgIExQRkNfU0xJX0lOVEZfSUZfVFlQRV8yKSkKLQkJcmV0dXJuIC1FUEVSTTsKLQotCWlmICghcGRldi0+aXNfcGh5c2ZuKQotCQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgMCk7Ci0KLQltYm94cSA9IChMUEZDX01CT1hRX3QgKiltZW1wb29sX2FsbG9jKHBoYmEtPm1ib3hfbWVtX3Bvb2wsIEdGUF9LRVJORUwpOwotCWlmICghbWJveHEpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JLyogZ2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiB2aXJ0Zm4gc3VwcG9ydCBieSBwaHlzZm4gKi8KLQlsZW5ndGggPSAoc2l6ZW9mKHN0cnVjdCBscGZjX21ieF9nZXRfcHJvZl9jZmcpIC0KLQkJICBzaXplb2Yoc3RydWN0IGxwZmNfc2xpNF9jZmdfbWhkcikpOwotCWxwZmNfc2xpNF9jb25maWcocGhiYSwgbWJveHEsIExQRkNfTUJPWF9TVUJTWVNURU1fQ09NTU9OLAotCQkJIExQRkNfTUJPWF9PUENPREVfR0VUX1BST0ZJTEVfQ09ORklHLAotCQkJIGxlbmd0aCwgTFBGQ19TTEk0X01CWF9FTUJFRCk7Ci0Jc2hkciA9ICh1bmlvbiBscGZjX3NsaTRfY2ZnX3NoZHIgKikKLQkJJm1ib3hxLT51Lm1xZS51bi5zbGk0X2NvbmZpZy5oZWFkZXIuY2ZnX3NoZHI7Ci0JYmZfc2V0KGxwZmNfbWJveF9oZHJfcGZfbnVtLCAmc2hkci0+cmVxdWVzdCwKLQkgICAgICAgcGhiYS0+c2xpNF9oYmEuaW92LnBmX251bWJlciArIDEpOwotCi0JZ2V0X3Byb2ZfY2ZnID0gJm1ib3hxLT51Lm1xZS51bi5nZXRfcHJvZl9jZmc7Ci0JYmZfc2V0KGxwZmNfbWJ4X2dldF9wcm9mX2NmZ19wcm9mX3RwLCAmZ2V0X3Byb2ZfY2ZnLT51LnJlcXVlc3QsCi0JICAgICAgIExQRkNfQ0ZHX1RZUEVfQ1VSUkVOVF9BQ1RJVkUpOwotCi0JcmMgPSBscGZjX3NsaV9pc3N1ZV9tYm94X3dhaXQocGhiYSwgbWJveHEsCi0JCQkJbHBmY19tYm94X3Rtb192YWwocGhiYSwgTUJYX1NMSTRfQ09ORklHKSk7Ci0KLQlpZiAocmMgIT0gTUJYX1RJTUVPVVQpIHsKLQkJLyogY2hlY2sgcmV0dXJuIHN0YXR1cyAqLwotCQlzaGRyX3N0YXR1cyA9IGJmX2dldChscGZjX21ib3hfaGRyX3N0YXR1cywgJnNoZHItPnJlc3BvbnNlKTsKLQkJc2hkcl9hZGRfc3RhdHVzID0gYmZfZ2V0KGxwZmNfbWJveF9oZHJfYWRkX3N0YXR1cywKLQkJCQkJICZzaGRyLT5yZXNwb25zZSk7Ci0JCWlmIChzaGRyX3N0YXR1cyB8fCBzaGRyX2FkZF9zdGF0dXMgfHwgcmMpCi0JCQlnb3RvIGVycm9yX291dDsKLQotCX0gZWxzZQotCQlnb3RvIGVycm9yX291dDsKLQotCWRlc2NfY291bnQgPSBnZXRfcHJvZl9jZmctPnUucmVzcG9uc2UucHJvZl9jZmcucnNyY19kZXNjX2NvdW50OwotCi0JZm9yIChpID0gMDsgaSA8IExQRkNfUlNSQ19ERVNDX01BWF9OVU07IGkrKykgewotCQlkZXNjID0gKHN0cnVjdCBscGZjX3JzcmNfZGVzY19wY2llICopCi0JCQkmZ2V0X3Byb2ZfY2ZnLT51LnJlc3BvbnNlLnByb2ZfY2ZnLmRlc2NbaV07Ci0JCWlmIChMUEZDX1JTUkNfREVTQ19UWVBFX1BDSUUgPT0KLQkJICAgIGJmX2dldChscGZjX3JzcmNfZGVzY19wY2llX3R5cGUsIGRlc2MpKSB7Ci0JCQltYXhfbnJfdmlydGZuID0gYmZfZ2V0KGxwZmNfcnNyY19kZXNjX3BjaWVfbnJfdmlydGZuLAotCQkJCQkgICAgICAgZGVzYyk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWlmIChpIDwgTFBGQ19SU1JDX0RFU0NfTUFYX05VTSkgewotCQlpZiAocmMgIT0gTUJYX1RJTUVPVVQpCi0JCQltZW1wb29sX2ZyZWUobWJveHEsIHBoYmEtPm1ib3hfbWVtX3Bvb2wpOwotCQlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIlZFxuIiwgbWF4X25yX3ZpcnRmbik7Ci0JfQotCi1lcnJvcl9vdXQ6Ci0JaWYgKHJjICE9IE1CWF9USU1FT1VUKQotCQltZW1wb29sX2ZyZWUobWJveHEsIHBoYmEtPm1ib3hfbWVtX3Bvb2wpOwotCXJldHVybiAtRUlPOworCW1heF9ucl92aXJ0Zm4gPSBscGZjX3NsaV9zcmlvdl9ucl92aXJ0Zm5fZ2V0KHBoYmEpOworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVkXG4iLCBtYXhfbnJfdmlydGZuKTsKIH0KIAogLyoqCkBAIC0xNjA1LDYgKzE1OTYsOSBAQAogbHBmY18jI2F0dHIjI19zZXQoc3RydWN0IGxwZmNfaGJhICpwaGJhLCB1aW50IHZhbCkgXAogeyBcCiAJaWYgKHZhbCA+PSBtaW52YWwgJiYgdmFsIDw9IG1heHZhbCkge1wKKwkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwgXAorCQkJIjMwNTIgbHBmY18iICNhdHRyICIgY2hhbmdlZCBmcm9tICVkIHRvICVkXG4iLCBcCisJCQlwaGJhLT5jZmdfIyNhdHRyLCB2YWwpOyBcCiAJCXBoYmEtPmNmZ18jI2F0dHIgPSB2YWw7XAogCQlyZXR1cm4gMDtcCiAJfVwKQEAgLTE3NjIsNiArMTc1Niw5IEBACiBscGZjXyMjYXR0ciMjX3NldChzdHJ1Y3QgbHBmY192cG9ydCAqdnBvcnQsIHVpbnQgdmFsKSBcCiB7IFwKIAlpZiAodmFsID49IG1pbnZhbCAmJiB2YWwgPD0gbWF4dmFsKSB7XAorCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0VSUiwgTE9HX0lOSVQsIFwKKwkJCSIzMDUzIGxwZmNfIiAjYXR0ciAiIGNoYW5nZWQgZnJvbSAlZCB0byAlZFxuIiwgXAorCQkJdnBvcnQtPmNmZ18jI2F0dHIsIHZhbCk7IFwKIAkJdnBvcnQtPmNmZ18jI2F0dHIgPSB2YWw7XAogCQlyZXR1cm4gMDtcCiAJfVwKQEAgLTIxOTYsNiArMjE5Myw5IEBACiBscGZjX3BhcmFtX2luaXQoZW5hYmxlX25waXYsIDEsIDAsIDEpOwogc3RhdGljIERFVklDRV9BVFRSKGxwZmNfZW5hYmxlX25waXYsIFNfSVJVR08sIGxwZmNfZW5hYmxlX25waXZfc2hvdywgTlVMTCk7CiAKK0xQRkNfQVRUUl9SKGZjZl9mYWlsb3Zlcl9wb2xpY3ksIDEsIDEsIDIsCisJIkZDRiBGYXN0IGZhaWxvdmVyPTEgUHJpb3JpdHkgZmFpbG92ZXI9MiIpOworCiBpbnQgbHBmY19lbmFibGVfcnJxOwogbW9kdWxlX3BhcmFtKGxwZmNfZW5hYmxlX3JycSwgaW50LCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MobHBmY19lbmFibGVfcnJxLCAiRW5hYmxlIFJSUSBmdW5jdGlvbmFsaXR5Iik7CkBAIC0yNjc4LDYgKzI2NzgsOSBAQAogCQlpZiAobm9saXApCiAJCQlyZXR1cm4gc3RybGVuKGJ1Zik7CiAKKwkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9FUlIsIExPR19JTklULAorCQkJIjMwNTQgbHBmY190b3BvbG9neSBjaGFuZ2VkIGZyb20gJWQgdG8gJWRcbiIsCisJCQlwcmV2X3ZhbCwgdmFsKTsKIAkJZXJyID0gbHBmY19pc3N1ZV9saXAobHBmY19zaG9zdF9mcm9tX3Zwb3J0KHBoYmEtPnBwb3J0KSk7CiAJCWlmIChlcnIpIHsKIAkJCXBoYmEtPmNmZ190b3BvbG9neSA9IHByZXZfdmFsOwpAQCAtMzEwMSw2ICszMTA0LDEwIEBACiAJaWYgKHNzY2FuZih2YWxfYnVmLCAiJWkiLCAmdmFsKSAhPSAxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fRVJSLCBMT0dfSU5JVCwKKwkJIjMwNTUgbHBmY19saW5rX3NwZWVkIGNoYW5nZWQgZnJvbSAlZCB0byAlZCAlc1xuIiwKKwkJcGhiYS0+Y2ZnX2xpbmtfc3BlZWQsIHZhbCwgbm9saXAgPyAiKG5vbGlwKSIgOiAiKGxpcCkiKTsKKwogCWlmICgoKHZhbCA9PSBMUEZDX1VTRVJfTElOS19TUEVFRF8xRykgJiYgIShwaGJhLT5sbXQgJiBMTVRfMUdiKSkgfHwKIAkgICAgKCh2YWwgPT0gTFBGQ19VU0VSX0xJTktfU1BFRURfMkcpICYmICEocGhiYS0+bG10ICYgTE1UXzJHYikpIHx8CiAJICAgICgodmFsID09IExQRkNfVVNFUl9MSU5LX1NQRUVEXzRHKSAmJiAhKHBoYmEtPmxtdCAmIExNVF80R2IpKSB8fApAQCAtMzY3OCw3ICszNjg1LDkgQEAKICMJLSBEZWZhdWx0IHdpbGwgcmVzdWx0IGluIHJlZ2lzdGVyaW5nIGNhcGFiaWxpdGllcyBmb3IgYWxsIHByb2ZpbGVzLgogIwogKi8KLXVuc2lnbmVkIGludCBscGZjX3Byb3RfbWFzayA9IFNIT1NUX0RJRl9UWVBFMV9QUk9URUNUSU9OOwordW5zaWduZWQgaW50IGxwZmNfcHJvdF9tYXNrID0gU0hPU1RfRElGX1RZUEUxX1BST1RFQ1RJT04gfAorCQkJICAgICAgU0hPU1RfRElYX1RZUEUwX1BST1RFQ1RJT04gfAorCQkJICAgICAgU0hPU1RfRElYX1RZUEUxX1BST1RFQ1RJT047CiAKIG1vZHVsZV9wYXJhbShscGZjX3Byb3RfbWFzaywgdWludCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKGxwZmNfcHJvdF9tYXNrLCAiaG9zdCBwcm90ZWN0aW9uIG1hc2siKTsKQEAgLTM3NjksNiArMzc3OCw3IEBACiAJJmRldl9hdHRyX2xwZmNfZmRtaV9vbiwKIAkmZGV2X2F0dHJfbHBmY19tYXhfbHVucywKIAkmZGV2X2F0dHJfbHBmY19lbmFibGVfbnBpdiwKKwkmZGV2X2F0dHJfbHBmY19mY2ZfZmFpbG92ZXJfcG9saWN5LAogCSZkZXZfYXR0cl9scGZjX2VuYWJsZV9ycnEsCiAJJmRldl9hdHRyX25wb3J0X2V2dF9jbnQsCiAJJmRldl9hdHRyX2JvYXJkX21vZGUsCkBAIC00OTg5LDYgKzQ5OTksNyBAQAogCWxwZmNfbGlua19zcGVlZF9pbml0KHBoYmEsIGxwZmNfbGlua19zcGVlZCk7CiAJbHBmY19wb2xsX3Rtb19pbml0KHBoYmEsIGxwZmNfcG9sbF90bW8pOwogCWxwZmNfZW5hYmxlX25waXZfaW5pdChwaGJhLCBscGZjX2VuYWJsZV9ucGl2KTsKKwlscGZjX2ZjZl9mYWlsb3Zlcl9wb2xpY3lfaW5pdChwaGJhLCBscGZjX2ZjZl9mYWlsb3Zlcl9wb2xpY3kpOwogCWxwZmNfZW5hYmxlX3JycV9pbml0KHBoYmEsIGxwZmNfZW5hYmxlX3JycSk7CiAJbHBmY191c2VfbXNpX2luaXQocGhiYSwgbHBmY191c2VfbXNpKTsKIAlscGZjX2ZjcF9pbWF4X2luaXQocGhiYSwgbHBmY19mY3BfaW1heCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2JzZy5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ic2cuYwppbmRleCA3ZmIwYmE0Li42NzYwYzY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2JzZy5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfYnNnLmMKQEAgLTQyLDYgKzQyLDcgQEAKICNpbmNsdWRlICJscGZjLmgiCiAjaW5jbHVkZSAibHBmY19sb2dtc2cuaCIKICNpbmNsdWRlICJscGZjX2NydG4uaCIKKyNpbmNsdWRlICJscGZjX2RlYnVnZnMuaCIKICNpbmNsdWRlICJscGZjX3Zwb3J0LmgiCiAjaW5jbHVkZSAibHBmY192ZXJzaW9uLmgiCiAKQEAgLTk2MCw4ICs5NjEsMTAgQEAKIAkJCQkJCSAgICBldnRfZGF0LT5pbW1lZF9kYXRdLm94aWQsCiAJCQkJCQlwaGJhLT5jdF9jdHhbCiAJCQkJCQkgICAgZXZ0X2RhdC0+aW1tZWRfZGF0XS5TSUQpOworCQkJcGhiYS0+Y3RfY3R4W2V2dF9kYXQtPmltbWVkX2RhdF0ucnhpZCA9CisJCQkJcGlvY2JxLT5pb2NiLnVscENvbnRleHQ7CiAJCQlwaGJhLT5jdF9jdHhbZXZ0X2RhdC0+aW1tZWRfZGF0XS5veGlkID0KLQkJCQkJCXBpb2NicS0+aW9jYi51bHBDb250ZXh0OworCQkJCXBpb2NicS0+aW9jYi51bnNsaTMucmN2c2xpMy5veF9pZDsKIAkJCXBoYmEtPmN0X2N0eFtldnRfZGF0LT5pbW1lZF9kYXRdLlNJRCA9CiAJCQkJcGlvY2JxLT5pb2NiLnVuLnJjdmVscy5yZW1vdGVJRDsKIAkJCXBoYmEtPmN0X2N0eFtldnRfZGF0LT5pbW1lZF9kYXRdLmZsYWdzID0gVU5TT0xfVkFMSUQ7CkBAIC0xMzEyLDcgKzEzMTUsOCBAQAogCQkJcmMgPSBJT0NCX0VSUk9SOwogCQkJZ290byBpc3N1ZV9jdF9yc3BfZXhpdDsKIAkJfQotCQlpY21kLT51bHBDb250ZXh0ID0gcGhiYS0+Y3RfY3R4W3RhZ10ub3hpZDsKKwkJaWNtZC0+dWxwQ29udGV4dCA9IHBoYmEtPmN0X2N0eFt0YWddLnJ4aWQ7CisJCWljbWQtPnVuc2xpMy5yY3ZzbGkzLm94X2lkID0gcGhiYS0+Y3RfY3R4W3RhZ10ub3hpZDsKIAkJbmRscCA9IGxwZmNfZmluZG5vZGVfZGlkKHBoYmEtPnBwb3J0LCBwaGJhLT5jdF9jdHhbdGFnXS5TSUQpOwogCQlpZiAoIW5kbHApIHsKIAkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsIExPR19FTFMsCkBAIC0xMzM3LDkgKzEzNDEsNyBAQAogCQkJZ290byBpc3N1ZV9jdF9yc3BfZXhpdDsKIAkJfQogCi0JCWljbWQtPnVuLnVscFdvcmRbM10gPSBuZGxwLT5ubHBfcnBpOwotCQlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KQotCQkJaWNtZC0+dWxwQ29udGV4dCA9CisJCWljbWQtPnVuLnVscFdvcmRbM10gPQogCQkJCXBoYmEtPnNsaTRfaGJhLnJwaV9pZHNbbmRscC0+bmxwX3JwaV07CiAKIAkJLyogVGhlIGV4Y2hhbmdlIGlzIGRvbmUsIG1hcmsgdGhlIGVudHJ5IGFzIGludmFsaWQgKi8KQEAgLTEzNTEsOCArMTM1Myw4IEBACiAKIAkvKiBYbWl0IENUIHJlc3BvbnNlIG9uIGV4Y2hhbmdlIDx4aWQ+ICovCiAJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX0VMUywKLQkJCSIyNzIyIFhtaXQgQ1QgcmVzcG9uc2Ugb24gZXhjaGFuZ2UgeCV4IERhdGE6IHgleCB4JXhcbiIsCi0JCQlpY21kLT51bHBDb250ZXh0LCBpY21kLT51bHBJb1RhZywgcGhiYS0+bGlua19zdGF0ZSk7CisJCSIyNzIyIFhtaXQgQ1QgcmVzcG9uc2Ugb24gZXhjaGFuZ2UgeCV4IERhdGE6IHgleCB4JXggeCV4XG4iLAorCQlpY21kLT51bHBDb250ZXh0LCBpY21kLT51bHBJb1RhZywgdGFnLCBwaGJhLT5saW5rX3N0YXRlKTsKIAogCWN0aW9jYi0+aW9jYl9jbXBsID0gTlVMTDsKIAljdGlvY2ItPmlvY2JfZmxhZyB8PSBMUEZDX0lPX0xJQkRGQzsKQEAgLTE0NzEsMTMgKzE0NzMsMTIgQEAKIC8qKgogICogbHBmY19ic2dfZGlhZ19tb2RlX2VudGVyIC0gcHJvY2VzcyBwcmVwYXJpbmcgaW50byBkZXZpY2UgZGlhZyBsb29wYmFjayBtb2RlCiAgKiBAcGhiYTogUG9pbnRlciB0byBIQkEgY29udGV4dCBvYmplY3QuCi0gKiBAam9iOiBMUEZDX0JTR19WRU5ET1JfRElBR19NT0RFCiAgKgogICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgcHJlcGFyaW5nIGRyaXZlciBmb3IgZGlhZyBsb29wYmFjawogICogb24gZGV2aWNlLgogICovCiBzdGF0aWMgaW50Ci1scGZjX2JzZ19kaWFnX21vZGVfZW50ZXIoc3RydWN0IGxwZmNfaGJhICpwaGJhLCBzdHJ1Y3QgZmNfYnNnX2pvYiAqam9iKQorbHBmY19ic2dfZGlhZ19tb2RlX2VudGVyKHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKIHsKIAlzdHJ1Y3QgbHBmY192cG9ydCAqKnZwb3J0czsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdDsKQEAgLTE1MjEsNyArMTUyMiw2IEBACiAvKioKICAqIGxwZmNfYnNnX2RpYWdfbW9kZV9leGl0IC0gZXhpdCBwcm9jZXNzIGZyb20gZGV2aWNlIGRpYWcgbG9vcGJhY2sgbW9kZQogICogQHBoYmE6IFBvaW50ZXIgdG8gSEJBIGNvbnRleHQgb2JqZWN0LgotICogQGpvYjogTFBGQ19CU0dfVkVORE9SX0RJQUdfTU9ERQogICoKICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGRyaXZlciBleGl0IHByb2Nlc3Npbmcgb2Ygc2V0dGluZyB1cAogICogZGlhZyBsb29wYmFjayBtb2RlIG9uIGRldmljZS4KQEAgLTE1NjcsNyArMTU2Nyw3IEBACiAJdWludDMyX3QgbGlua19mbGFnczsKIAl1aW50MzJfdCB0aW1lb3V0OwogCUxQRkNfTUJPWFFfdCAqcG1ib3hxOwotCWludCBtYnhzdGF0dXM7CisJaW50IG1ieHN0YXR1cyA9IE1CWF9TVUNDRVNTOwogCWludCBpID0gMDsKIAlpbnQgcmMgPSAwOwogCkBAIC0xNTg2LDcgKzE1ODYsNyBAQAogCQlnb3RvIGpvYl9lcnJvcjsKIAl9CiAKLQlyYyA9IGxwZmNfYnNnX2RpYWdfbW9kZV9lbnRlcihwaGJhLCBqb2IpOworCXJjID0gbHBmY19ic2dfZGlhZ19tb2RlX2VudGVyKHBoYmEpOwogCWlmIChyYykKIAkJZ290byBqb2JfZXJyb3I7CiAKQEAgLTE3NDEsNyArMTc0MSw3IEBACiAJdWludDMyX3QgbGlua19mbGFncywgdGltZW91dCwgcmVxX2xlbiwgYWxsb2NfbGVuOwogCXN0cnVjdCBscGZjX21ieF9zZXRfbGlua19kaWFnX2xvb3BiYWNrICpsaW5rX2RpYWdfbG9vcGJhY2s7CiAJTFBGQ19NQk9YUV90ICpwbWJveHEgPSBOVUxMOwotCWludCBtYnhzdGF0dXMsIGksIHJjID0gMDsKKwlpbnQgbWJ4c3RhdHVzID0gTUJYX1NVQ0NFU1MsIGksIHJjID0gMDsKIAogCS8qIG5vIGRhdGEgdG8gcmV0dXJuIGp1c3QgdGhlIHJldHVybiBjb2RlICovCiAJam9iLT5yZXBseS0+cmVwbHlfcGF5bG9hZF9yY3ZfbGVuID0gMDsKQEAgLTE3NTgsNyArMTc1OCw3IEBACiAJCWdvdG8gam9iX2Vycm9yOwogCX0KIAotCXJjID0gbHBmY19ic2dfZGlhZ19tb2RlX2VudGVyKHBoYmEsIGpvYik7CisJcmMgPSBscGZjX2JzZ19kaWFnX21vZGVfZW50ZXIocGhiYSk7CiAJaWYgKHJjKQogCQlnb3RvIGpvYl9lcnJvcjsKIApAQCAtMTk4Miw3ICsxOTgyLDcgQEAKIAkJZ290byBqb2JfZXJyb3I7CiAJfQogCi0JcmMgPSBscGZjX2JzZ19kaWFnX21vZGVfZW50ZXIocGhiYSwgam9iKTsKKwlyYyA9IGxwZmNfYnNnX2RpYWdfbW9kZV9lbnRlcihwaGJhKTsKIAlpZiAocmMpCiAJCWdvdG8gam9iX2Vycm9yOwogCkBAIC0zMTc4LDYgKzMxNzgsMTEgQEAKIAkJCQkiKHgleC94JXgpIGNvbXBsZXRlIGJzZyBqb2IgZG9uZSwgYnNpemU6JWRcbiIsCiAJCQkJcGhiYS0+bWJveF9leHRfYnVmX2N0eC5uZW1iVHlwZSwKIAkJCQlwaGJhLT5tYm94X2V4dF9idWZfY3R4Lm1ib3hUeXBlLCBzaXplKTsKKwkJbHBmY19pZGlhZ19tYnhhY2NfZHVtcF9ic2dfbWJveChwaGJhLAorCQkJCQlwaGJhLT5tYm94X2V4dF9idWZfY3R4Lm5lbWJUeXBlLAorCQkJCQlwaGJhLT5tYm94X2V4dF9idWZfY3R4Lm1ib3hUeXBlLAorCQkJCQlkbWFfZWJ1Ziwgc3RhX3Bvc19hZGRyLAorCQkJCQlwaGJhLT5tYm94X2V4dF9idWZfY3R4Lm1ieF9kbWFidWYsIDApOwogCX0gZWxzZQogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5jdF9ldl9sb2NrLCBmbGFncyk7CiAKQEAgLTM0MzAsNiArMzQzNSwxMCBAQAogCQkJCSJleHRfYnVmX2NudDolZFxuIiwgZXh0X2J1Zl9jbnQpOwogCX0KIAorCS8qIGJlZm9yZSBkbWEgZGVzY3JpcHRvciBzZXR1cCAqLworCWxwZmNfaWRpYWdfbWJ4YWNjX2R1bXBfYnNnX21ib3gocGhiYSwgbmVtYl90cCwgbWJveF9yZCwgZG1hX21ib3gsCisJCQkJCXN0YV9wcmVfYWRkciwgZG1hYnVmLCBleHRfYnVmX2NudCk7CisKIAkvKiByZWplY3Qgbm9uLWVtYmVkZGVkIG1haWxib3ggY29tbWFuZCB3aXRoIG5vbmUgZXh0ZXJuYWwgYnVmZmVyICovCiAJaWYgKGV4dF9idWZfY250ID09IDApIHsKIAkJcmMgPSAtRVBFUk07CkBAIC0zNDc3LDYgKzM0ODYsMTAgQEAKIAkJfQogCX0KIAorCS8qIGFmdGVyIGRtYSBkZXNjcmlwdG9yIHNldHVwICovCisJbHBmY19pZGlhZ19tYnhhY2NfZHVtcF9ic2dfbWJveChwaGJhLCBuZW1iX3RwLCBtYm94X3JkLCBkbWFfbWJveCwKKwkJCQkJc3RhX3Bvc19hZGRyLCBkbWFidWYsIGV4dF9idWZfY250KTsKKwogCS8qIGNvbnN0cnVjdCBiYXNlIGRyaXZlciBtYm94IGNvbW1hbmQgKi8KIAlwbWIgPSAmcG1ib3hxLT51Lm1iOwogCXBtYnggPSAodWludDhfdCAqKWRtYWJ1Zi0+dmlydDsKQEAgLTM1MTEsNyArMzUyNCw3IEBACiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19MSUJERkMsCiAJCQkJIjI5NDcgSXNzdWVkIFNMSV9DT05GSUcgZXh0LWJ1ZmZlciAiCiAJCQkJIm1haWJveCBjb21tYW5kLCByYzp4JXhcbiIsIHJjKTsKLQkJcmV0dXJuIDE7CisJCXJldHVybiBTTElfQ09ORklHX0hBTkRMRUQ7CiAJfQogCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0xJQkRGQywKIAkJCSIyOTQ4IEZhaWxlZCB0byBpc3N1ZSBTTElfQ09ORklHIGV4dC1idWZmZXIgIgpAQCAtMzU0OSw3ICszNTYyLDcgQEAKIAlMUEZDX01CT1hRX3QgKnBtYm94cSA9IE5VTEw7CiAJTUFJTEJPWF90ICpwbWI7CiAJdWludDhfdCAqbWJ4OwotCWludCByYyA9IDAsIGk7CisJaW50IHJjID0gU0xJX0NPTkZJR19OT1RfSEFORExFRCwgaTsKIAogCW1ib3hfcmVxID0KIAkgICAoc3RydWN0IGRmY19tYm94X3JlcSAqKWpvYi0+cmVxdWVzdC0+cnFzdF9kYXRhLmhfdmVuZG9yLnZlbmRvcl9jbWQ7CkBAIC0zNTkxLDEyICszNjA0LDIwIEBACiAJCQkJImV4dF9idWZfY250OiVkXG4iLCBleHRfYnVmX2NudCk7CiAJfQogCisJLyogYmVmb3JlIGRtYSBidWZmZXIgZGVzY3JpcHRvciBzZXR1cCAqLworCWxwZmNfaWRpYWdfbWJ4YWNjX2R1bXBfYnNnX21ib3gocGhiYSwgbmVtYl90cCwgbWJveF93ciwgZG1hX21ib3gsCisJCQkJCXN0YV9wcmVfYWRkciwgZG1hYnVmLCBleHRfYnVmX2NudCk7CisKIAlpZiAoZXh0X2J1Zl9jbnQgPT0gMCkKIAkJcmV0dXJuIC1FUEVSTTsKIAogCS8qIGZvciB0aGUgZmlyc3QgZXh0ZXJuYWwgYnVmZmVyICovCiAJbHBmY19ic2dfc2xpX2NmZ19kbWFfZGVzY19zZXR1cChwaGJhLCBuZW1iX3RwLCAwLCBkbWFidWYsIGRtYWJ1Zik7CiAKKwkvKiBhZnRlciBkbWEgZGVzY3JpcHRvciBzZXR1cCAqLworCWxwZmNfaWRpYWdfbWJ4YWNjX2R1bXBfYnNnX21ib3gocGhiYSwgbmVtYl90cCwgbWJveF93ciwgZG1hX21ib3gsCisJCQkJCXN0YV9wb3NfYWRkciwgZG1hYnVmLCBleHRfYnVmX2NudCk7CisKIAkvKiBsb2cgZm9yIGxvb2tpbmcgZm9yd2FyZCAqLwogCWZvciAoaSA9IDE7IGkgPCBleHRfYnVmX2NudDsgaSsrKSB7CiAJCWlmIChuZW1iX3RwID09IG5lbWJfbXNlKQpAQCAtMzY2MCw3ICszNjgxLDcgQEAKIAkJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19MSUJERkMsCiAJCQkJCSIyOTU1IElzc3VlZCBTTElfQ09ORklHIGV4dC1idWZmZXIgIgogCQkJCQkibWFpYm94IGNvbW1hbmQsIHJjOngleFxuIiwgcmMpOwotCQkJcmV0dXJuIDE7CisJCQlyZXR1cm4gU0xJX0NPTkZJR19IQU5ETEVEOwogCQl9CiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0xJQkRGQywKIAkJCQkiMjk1NiBGYWlsZWQgdG8gaXNzdWUgU0xJX0NPTkZJRyBleHQtYnVmZmVyICIKQEAgLTM2NjgsNiArMzY4OSwxMSBAQAogCQlyYyA9IC1FUElQRTsKIAl9CiAKKwkvKiB3YWl0IGZvciBhZGRpdG9pbmFsIGV4dGVybmFsIGJ1ZmZlcnMgKi8KKwlqb2ItPnJlcGx5LT5yZXN1bHQgPSAwOworCWpvYi0+am9iX2RvbmUoam9iKTsKKwlyZXR1cm4gU0xJX0NPTkZJR19IQU5ETEVEOworCiBqb2JfZXJyb3I6CiAJaWYgKHBtYm94cSkKIAkJbWVtcG9vbF9mcmVlKHBtYm94cSwgcGhiYS0+bWJveF9tZW1fcG9vbCk7CkBAIC0zODQwLDYgKzM4NjYsMTIgQEAKIAlkbWFidWYgPSBsaXN0X2ZpcnN0X2VudHJ5KCZwaGJhLT5tYm94X2V4dF9idWZfY3R4LmV4dF9kbWFidWZfbGlzdCwKIAkJCQkgIHN0cnVjdCBscGZjX2RtYWJ1ZiwgbGlzdCk7CiAJbGlzdF9kZWxfaW5pdCgmZG1hYnVmLT5saXN0KTsKKworCS8qIGFmdGVyIGRtYSBidWZmZXIgZGVzY3JpcHRvciBzZXR1cCAqLworCWxwZmNfaWRpYWdfbWJ4YWNjX2R1bXBfYnNnX21ib3gocGhiYSwgcGhiYS0+bWJveF9leHRfYnVmX2N0eC5uZW1iVHlwZSwKKwkJCQkJbWJveF9yZCwgZG1hX2VidWYsIHN0YV9wb3NfYWRkciwKKwkJCQkJZG1hYnVmLCBpbmRleCk7CisKIAlwYnVmID0gKHVpbnQ4X3QgKilkbWFidWYtPnZpcnQ7CiAJam9iLT5yZXBseS0+cmVwbHlfcGF5bG9hZF9yY3ZfbGVuID0KIAkJc2dfY29weV9mcm9tX2J1ZmZlcihqb2ItPnJlcGx5X3BheWxvYWQuc2dfbGlzdCwKQEAgLTM5MjIsNiArMzk1NCwxMSBAQAogCQkJCQlkbWFidWYpOwogCWxpc3RfYWRkX3RhaWwoJmRtYWJ1Zi0+bGlzdCwgJnBoYmEtPm1ib3hfZXh0X2J1Zl9jdHguZXh0X2RtYWJ1Zl9saXN0KTsKIAorCS8qIGFmdGVyIHdyaXRlIGRtYSBidWZmZXIgKi8KKwlscGZjX2lkaWFnX21ieGFjY19kdW1wX2JzZ19tYm94KHBoYmEsIHBoYmEtPm1ib3hfZXh0X2J1Zl9jdHgubmVtYlR5cGUsCisJCQkJCW1ib3hfd3IsIGRtYV9lYnVmLCBzdGFfcG9zX2FkZHIsCisJCQkJCWRtYWJ1ZiwgaW5kZXgpOworCiAJaWYgKHBoYmEtPm1ib3hfZXh0X2J1Zl9jdHguc2VxTnVtID09IHBoYmEtPm1ib3hfZXh0X2J1Zl9jdHgubnVtQnVmKSB7CiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19MSUJERkMsCiAJCQkJIjI5NjggU0xJX0NPTkZJRyBleHQtYnVmZmVyIHdyIGFsbCAlZCAiCkBAIC0zOTU5LDcgKzM5OTYsNyBAQAogCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fSU5GTywgTE9HX0xJQkRGQywKIAkJCQkJIjI5NjkgSXNzdWVkIFNMSV9DT05GSUcgZXh0LWJ1ZmZlciAiCiAJCQkJCSJtYWlib3ggY29tbWFuZCwgcmM6eCV4XG4iLCByYyk7Ci0JCQlyZXR1cm4gMTsKKwkJCXJldHVybiBTTElfQ09ORklHX0hBTkRMRUQ7CiAJCX0KIAkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfTElCREZDLAogCQkJCSIyOTcwIEZhaWxlZCB0byBpc3N1ZSBTTElfQ09ORklHIGV4dC1idWZmZXIgIgpAQCAtNDAzOSwxNCArNDA3NiwxNCBAQAogCQkJICAgIHN0cnVjdCBscGZjX2RtYWJ1ZiAqZG1hYnVmKQogewogCXN0cnVjdCBkZmNfbWJveF9yZXEgKm1ib3hfcmVxOwotCWludCByYzsKKwlpbnQgcmMgPSBTTElfQ09ORklHX05PVF9IQU5ETEVEOwogCiAJbWJveF9yZXEgPQogCSAgIChzdHJ1Y3QgZGZjX21ib3hfcmVxICopam9iLT5yZXF1ZXN0LT5ycXN0X2RhdGEuaF92ZW5kb3IudmVuZG9yX2NtZDsKIAogCS8qIG1ib3ggY29tbWFuZCB3aXRoL3dpdGhvdXQgc2luZ2xlIGV4dGVybmFsIGJ1ZmZlciAqLwogCWlmIChtYm94X3JlcS0+ZXh0TWJveFRhZyA9PSAwICYmIG1ib3hfcmVxLT5leHRTZXFOdW0gPT0gMCkKLQkJcmV0dXJuIFNMSV9DT05GSUdfTk9UX0hBTkRMRUQ7CisJCXJldHVybiByYzsKIAogCS8qIG1ib3ggY29tbWFuZCBhbmQgZmlyc3QgZXh0ZXJuYWwgYnVmZmVyICovCiAJaWYgKHBoYmEtPm1ib3hfZXh0X2J1Zl9jdHguc3RhdGUgPT0gTFBGQ19CU0dfTUJPWF9JRExFKSB7CkBAIC00MjQ5LDcgKzQyODYsNyBAQAogCQkgKiBtYWlsYm94IGV4dGVuc2lvbiBzaXplCiAJCSAqLwogCQlpZiAoKHRyYW5zbWl0X2xlbmd0aCA+IHJlY2VpdmVfbGVuZ3RoKSB8fAotCQkJKHRyYW5zbWl0X2xlbmd0aCA+IE1BSUxCT1hfRVhUX1NJWkUpKSB7CisJCQkodHJhbnNtaXRfbGVuZ3RoID4gQlNHX01CT1hfU0laRSAtIHNpemVvZihNQUlMQk9YX3QpKSkgewogCQkJcmMgPSAtRVJBTkdFOwogCQkJZ290byBqb2JfZG9uZTsKIAkJfQpAQCAtNDI3Miw3ICs0MzA5LDcgQEAKIAkJLyogcmVjZWl2ZSBsZW5ndGggY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiBtYWlsYm94CiAJCSAqIGV4dGVuc2lvbiBzaXplCiAJCSAqLwotCQlpZiAocmVjZWl2ZV9sZW5ndGggPiBNQUlMQk9YX0VYVF9TSVpFKSB7CisJCWlmIChyZWNlaXZlX2xlbmd0aCA+IEJTR19NQk9YX1NJWkUgLSBzaXplb2YoTUFJTEJPWF90KSkgewogCQkJcmMgPSAtRVJBTkdFOwogCQkJZ290byBqb2JfZG9uZTsKIAkJfQpAQCAtNDMwNiw3ICs0MzQzLDggQEAKIAkJCWJkZSA9IChzdHJ1Y3QgdWxwX2JkZTY0ICopJnBtYi0+dW4udmFyV29yZHNbNF07CiAKIAkJCS8qIGJkZSBzaXplIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gbWFpbGJveCBleHQgc2l6ZSAqLwotCQkJaWYgKGJkZS0+dHVzLmYuYmRlU2l6ZSA+IE1BSUxCT1hfRVhUX1NJWkUpIHsKKwkJCWlmIChiZGUtPnR1cy5mLmJkZVNpemUgPgorCQkJICAgIEJTR19NQk9YX1NJWkUgLSBzaXplb2YoTUFJTEJPWF90KSkgewogCQkJCXJjID0gLUVSQU5HRTsKIAkJCQlnb3RvIGpvYl9kb25lOwogCQkJfQpAQCAtNDMzMiw3ICs0MzcwLDggQEAKIAkJCQkgKiBtYWlsYm94IGV4dGVuc2lvbiBzaXplCiAJCQkJICovCiAJCQkJaWYgKChyZWNlaXZlX2xlbmd0aCA9PSAwKSB8fAotCQkJCSAgICAocmVjZWl2ZV9sZW5ndGggPiBNQUlMQk9YX0VYVF9TSVpFKSkgeworCQkJCSAgICAocmVjZWl2ZV9sZW5ndGggPgorCQkJCSAgICAgQlNHX01CT1hfU0laRSAtIHNpemVvZihNQUlMQk9YX3QpKSkgewogCQkJCQlyYyA9IC1FUkFOR0U7CiAJCQkJCWdvdG8gam9iX2RvbmU7CiAJCQkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19jcnRuLmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2NydG4uaAppbmRleCBmYzIwYzI0Li5hNmRiNmFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2NydG4uaAorKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2NydG4uaApAQCAtMjM1LDkgKzIzNSwxMSBAQAogdm9pZCBscGZjX2ZjZl9yZWRpc2Nfd2FpdF9zdGFydF90aW1lcihzdHJ1Y3QgbHBmY19oYmEgKik7CiB2b2lkIGxwZmNfc2xpNF9mY2ZfZGVhZF9mYWlsdGhyb3VnaChzdHJ1Y3QgbHBmY19oYmEgKik7CiB1aW50MTZfdCBscGZjX3NsaTRfZmNmX3JyX25leHRfaW5kZXhfZ2V0KHN0cnVjdCBscGZjX2hiYSAqKTsKK3ZvaWQgbHBmY19zbGk0X3NldF9mY2ZfZmxvZ2lfZmFpbChzdHJ1Y3QgbHBmY19oYmEgKiwgdWludDE2X3QpOwogaW50IGxwZmNfc2xpNF9mY2ZfcnJfaW5kZXhfc2V0KHN0cnVjdCBscGZjX2hiYSAqLCB1aW50MTZfdCk7CiB2b2lkIGxwZmNfc2xpNF9mY2ZfcnJfaW5kZXhfY2xlYXIoc3RydWN0IGxwZmNfaGJhICosIHVpbnQxNl90KTsKIGludCBscGZjX3NsaTRfZmNmX3JyX25leHRfcHJvYyhzdHJ1Y3QgbHBmY192cG9ydCAqLCB1aW50MTZfdCk7Cit2b2lkIGxwZmNfc2xpNF9jbGVhcl9mY2ZfcnJfYm1hc2soc3RydWN0IGxwZmNfaGJhICopOwogCiBpbnQgbHBmY19tZW1fYWxsb2Moc3RydWN0IGxwZmNfaGJhICosIGludCBhbGlnbik7CiB2b2lkIGxwZmNfbWVtX2ZyZWUoc3RydWN0IGxwZmNfaGJhICopOwpAQCAtMzcxLDYgKzM3MywxMCBAQAogLyogU0xJNCBpZl90eXBlIDIgZXh0ZXJucy4gKi8KIGludCBscGZjX3NsaTRfYWxsb2NfcmVzb3VyY2VfaWRlbnRpZmllcnMoc3RydWN0IGxwZmNfaGJhICopOwogaW50IGxwZmNfc2xpNF9kZWFsbG9jX3Jlc291cmNlX2lkZW50aWZpZXJzKHN0cnVjdCBscGZjX2hiYSAqKTsKK2ludCBscGZjX3NsaTRfZ2V0X2FsbG9jYXRlZF9leHRudHMoc3RydWN0IGxwZmNfaGJhICosIHVpbnQxNl90LAorCQkJCSAgIHVpbnQxNl90ICosIHVpbnQxNl90ICopOworaW50IGxwZmNfc2xpNF9nZXRfYXZhaWxfZXh0bnRfcnNyYyhzdHJ1Y3QgbHBmY19oYmEgKiwgdWludDE2X3QsCisJCQkJCSAgdWludDE2X3QgKiwgdWludDE2X3QgKik7CiAKIC8qIGV4dGVybnMgQmxvY2tHdWFyZCAqLwogZXh0ZXJuIGNoYXIgKl9kdW1wX2J1Zl9kYXRhOwpAQCAtNDMyLDEwICs0MzgsMTYgQEAKIGludCBscGZjX3NlbmRfcnJxKHN0cnVjdCBscGZjX2hiYSAqLCBzdHJ1Y3QgbHBmY19ub2RlX3JycSAqKTsKIGludCBscGZjX3NldF9ycnFfYWN0aXZlKHN0cnVjdCBscGZjX2hiYSAqLCBzdHJ1Y3QgbHBmY19ub2RlbGlzdCAqLAogCXVpbnQxNl90LCB1aW50MTZfdCwgdWludDE2X3QpOwordWludDE2X3QgbHBmY19zbGk0X3hyaV9pbnJhbmdlKHN0cnVjdCBscGZjX2hiYSAqLCB1aW50MTZfdCk7CiB2b2lkIGxwZmNfY2xlYW51cF93dF9ycnFzKHN0cnVjdCBscGZjX2hiYSAqKTsKIHZvaWQgbHBmY19jbGVhbnVwX3Zwb3J0c19ycnFzKHN0cnVjdCBscGZjX3Zwb3J0ICosIHN0cnVjdCBscGZjX25vZGVsaXN0ICopOwogc3RydWN0IGxwZmNfbm9kZV9ycnEgKmxwZmNfZ2V0X2FjdGl2ZV9ycnEoc3RydWN0IGxwZmNfdnBvcnQgKiwgdWludDE2X3QsCiAJdWludDMyX3QpOwordm9pZCBscGZjX2lkaWFnX21ieGFjY19kdW1wX2JzZ19tYm94KHN0cnVjdCBscGZjX2hiYSAqLCBlbnVtIG5lbWJfdHlwZSwKKwllbnVtIG1ib3hfdHlwZSwgZW51bSBkbWFfdHlwZSwgZW51bSBzdGFfdHlwZSwKKwlzdHJ1Y3QgbHBmY19kbWFidWYgKiwgdWludDMyX3QpOwordm9pZCBscGZjX2lkaWFnX21ieGFjY19kdW1wX2lzc3VlX21ib3goc3RydWN0IGxwZmNfaGJhICosIE1BSUxCT1hfdCAqKTsKIGludCBscGZjX3dyX29iamVjdChzdHJ1Y3QgbHBmY19oYmEgKiwgc3RydWN0IGxpc3RfaGVhZCAqLCB1aW50MzJfdCwgdWludDMyX3QgKik7CiAvKiBmdW5jdGlvbnMgdG8gc3VwcG9ydCBTUi1JT1YgKi8KIGludCBscGZjX3NsaV9wcm9iZV9zcmlvdl9ucl92aXJ0Zm4oc3RydWN0IGxwZmNfaGJhICosIGludCk7Cit1aW50MTZfdCBscGZjX3NsaV9zcmlvdl9ucl92aXJ0Zm5fZ2V0KHN0cnVjdCBscGZjX2hiYSAqKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZGVidWdmcy5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19kZWJ1Z2ZzLmMKaW5kZXggMzBiMjVjNS4uYTA0MjRkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19kZWJ1Z2ZzLmMKQEAgLTQ4LDYgKzQ4LDcgQEAKICNpbmNsdWRlICJscGZjX3ZlcnNpb24uaCIKICNpbmNsdWRlICJscGZjX2NvbXBhdC5oIgogI2luY2x1ZGUgImxwZmNfZGVidWdmcy5oIgorI2luY2x1ZGUgImxwZmNfYnNnLmgiCiAKICNpZmRlZiBDT05GSUdfU0NTSV9MUEZDX0RFQlVHX0ZTCiAvKgpAQCAtMTM1LDcgKzEzNiwxMSBAQAogCWludCBpLCBpbmRleCwgbGVuLCBlbmFibGU7CiAJdWludDMyX3QgbXM7CiAJc3RydWN0IGxwZmNfZGVidWdmc190cmMgKmR0cDsKLQljaGFyIGJ1ZmZlcltMUEZDX0RFQlVHX1RSQ19FTlRSWV9TSVpFXTsKKwljaGFyICpidWZmZXI7CisKKwlidWZmZXIgPSBrbWFsbG9jKExQRkNfREVCVUdfVFJDX0VOVFJZX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghYnVmZmVyKQorCQlyZXR1cm4gMDsKIAogCWVuYWJsZSA9IGxwZmNfZGVidWdmc19lbmFibGU7CiAJbHBmY19kZWJ1Z2ZzX2VuYWJsZSA9IDA7CkBAIC0xNjcsNiArMTcyLDggQEAKIAl9CiAKIAlscGZjX2RlYnVnZnNfZW5hYmxlID0gZW5hYmxlOworCWtmcmVlKGJ1ZmZlcik7CisKIAlyZXR1cm4gbGVuOwogfQogCkBAIC0xOTUsOCArMjAyLDExIEBACiAJaW50IGksIGluZGV4LCBsZW4sIGVuYWJsZTsKIAl1aW50MzJfdCBtczsKIAlzdHJ1Y3QgbHBmY19kZWJ1Z2ZzX3RyYyAqZHRwOwotCWNoYXIgYnVmZmVyW0xQRkNfREVCVUdfVFJDX0VOVFJZX1NJWkVdOworCWNoYXIgKmJ1ZmZlcjsKIAorCWJ1ZmZlciA9IGttYWxsb2MoTFBGQ19ERUJVR19UUkNfRU5UUllfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWZmZXIpCisJCXJldHVybiAwOwogCiAJZW5hYmxlID0gbHBmY19kZWJ1Z2ZzX2VuYWJsZTsKIAlscGZjX2RlYnVnZnNfZW5hYmxlID0gMDsKQEAgLTIyOCw2ICsyMzgsOCBAQAogCX0KIAogCWxwZmNfZGVidWdmc19lbmFibGUgPSBlbmFibGU7CisJa2ZyZWUoYnVmZmVyKTsKKwogCXJldHVybiBsZW47CiB9CiAKQEAgLTM3OCw3ICszOTAsMTEgQEAKIAlpbnQgbGVuID0gMDsKIAlpbnQgaSwgb2ZmOwogCXVpbnQzMl90ICpwdHI7Ci0JY2hhciBidWZmZXJbMTAyNF07CisJY2hhciAqYnVmZmVyOworCisJYnVmZmVyID0ga21hbGxvYygxMDI0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZmZlcikKKwkJcmV0dXJuIDA7CiAKIAlvZmYgPSAwOwogCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwpAQCAtNDA3LDYgKzQyMyw4IEBACiAJfQogCiAJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKKwlrZnJlZShidWZmZXIpOworCiAJcmV0dXJuIGxlbjsKIH0KIApAQCAtMTMyNyw4ICsxMzQ1LDggQEAKIAkJcmV0dXJuIDA7CiAKIAlpZiAoaWRpYWcuY21kLm9wY29kZSA9PSBMUEZDX0lESUFHX0NNRF9QQ0lDRkdfUkQpIHsKLQkJd2hlcmUgPSBpZGlhZy5jbWQuZGF0YVswXTsKLQkJY291bnQgPSBpZGlhZy5jbWQuZGF0YVsxXTsKKwkJd2hlcmUgPSBpZGlhZy5jbWQuZGF0YVtJRElBR19QQ0lDRkdfV0hFUkVfSU5EWF07CisJCWNvdW50ID0gaWRpYWcuY21kLmRhdGFbSURJQUdfUENJQ0ZHX0NPVU5UX0lORFhdOwogCX0gZWxzZQogCQlyZXR1cm4gMDsKIApAQCAtMTM3Myw2ICsxMzkxLDExIEBACiAJCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwgTFBGQ19QQ0lfQ0ZHX1NJWkUtbGVuLAogCQkJCSIlMDh4ICIsIHUzMnZhbCk7CiAJCW9mZnNldCArPSBzaXplb2YodWludDMyX3QpOworCQlpZiAob2Zmc2V0ID49IExQRkNfUENJX0NGR19TSVpFKSB7CisJCQlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sCisJCQkJCUxQRkNfUENJX0NGR19TSVpFLWxlbiwgIlxuIik7CisJCQlicmVhazsKKwkJfQogCQlpbmRleCAtPSBzaXplb2YodWludDMyX3QpOwogCQlpZiAoIWluZGV4KQogCQkJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX1BDSV9DRkdfU0laRS1sZW4sCkBAIC0xMzg1LDggKzE0MDgsMTEgQEAKIAl9CiAKIAkvKiBTZXQgdXAgdGhlIG9mZnNldCBmb3IgbmV4dCBwb3J0aW9uIG9mIHBjaSBjZmcgcmVhZCAqLwotCWlkaWFnLm9mZnNldC5sYXN0X3JkICs9IExQRkNfUENJX0NGR19SRF9TSVpFOwotCWlmIChpZGlhZy5vZmZzZXQubGFzdF9yZCA+PSBMUEZDX1BDSV9DRkdfU0laRSkKKwlpZiAoaW5kZXggPT0gMCkgeworCQlpZGlhZy5vZmZzZXQubGFzdF9yZCArPSBMUEZDX1BDSV9DRkdfUkRfU0laRTsKKwkJaWYgKGlkaWFnLm9mZnNldC5sYXN0X3JkID49IExQRkNfUENJX0NGR19TSVpFKQorCQkJaWRpYWcub2Zmc2V0Lmxhc3RfcmQgPSAwOworCX0gZWxzZQogCQlpZGlhZy5vZmZzZXQubGFzdF9yZCA9IDA7CiAKIAlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBuYnl0ZXMsIHBwb3MsIHBidWZmZXIsIGxlbik7CkBAIC0xNDM5LDggKzE0NjUsOCBAQAogCQlpZiAocmMgIT0gTFBGQ19QQ0lfQ0ZHX1JEX0NNRF9BUkcpCiAJCQlnb3RvIGVycm9yX291dDsKIAkJLyogUmVhZCBjb21tYW5kIGZyb20gUENJIGNvbmZpZyBzcGFjZSwgc2V0IHVwIGNvbW1hbmQgZmllbGRzICovCi0JCXdoZXJlID0gaWRpYWcuY21kLmRhdGFbMF07Ci0JCWNvdW50ID0gaWRpYWcuY21kLmRhdGFbMV07CisJCXdoZXJlID0gaWRpYWcuY21kLmRhdGFbSURJQUdfUENJQ0ZHX1dIRVJFX0lORFhdOworCQljb3VudCA9IGlkaWFnLmNtZC5kYXRhW0lESUFHX1BDSUNGR19DT1VOVF9JTkRYXTsKIAkJaWYgKGNvdW50ID09IExQRkNfUENJX0NGR19CUk9XU0UpIHsKIAkJCWlmICh3aGVyZSAlIHNpemVvZih1aW50MzJfdCkpCiAJCQkJZ290byBlcnJvcl9vdXQ7CkBAIC0xNDc1LDkgKzE1MDEsOSBAQAogCQlpZiAocmMgIT0gTFBGQ19QQ0lfQ0ZHX1dSX0NNRF9BUkcpCiAJCQlnb3RvIGVycm9yX291dDsKIAkJLyogV3JpdGUgY29tbWFuZCB0byBQQ0kgY29uZmlnIHNwYWNlLCByZWFkLW1vZGlmeS13cml0ZSAqLwotCQl3aGVyZSA9IGlkaWFnLmNtZC5kYXRhWzBdOwotCQljb3VudCA9IGlkaWFnLmNtZC5kYXRhWzFdOwotCQl2YWx1ZSA9IGlkaWFnLmNtZC5kYXRhWzJdOworCQl3aGVyZSA9IGlkaWFnLmNtZC5kYXRhW0lESUFHX1BDSUNGR19XSEVSRV9JTkRYXTsKKwkJY291bnQgPSBpZGlhZy5jbWQuZGF0YVtJRElBR19QQ0lDRkdfQ09VTlRfSU5EWF07CisJCXZhbHVlID0gaWRpYWcuY21kLmRhdGFbSURJQUdfUENJQ0ZHX1ZBTFVFX0lORFhdOwogCQkvKiBTYW5pdHkgY2hlY2tzICovCiAJCWlmICgoY291bnQgIT0gc2l6ZW9mKHVpbnQ4X3QpKSAmJgogCQkgICAgKGNvdW50ICE9IHNpemVvZih1aW50MTZfdCkpICYmCkBAIC0xNTcwLDYgKzE1OTYsMjkyIEBACiB9CiAKIC8qKgorICogbHBmY19pZGlhZ19iYXJhY2NfcmVhZCAtIGlkaWFnIGRlYnVnZnMgcGNpIGJhciBhY2Nlc3MgcmVhZAorICogQGZpbGU6IFRoZSBmaWxlIHBvaW50ZXIgdG8gcmVhZCBmcm9tLgorICogQGJ1ZjogVGhlIGJ1ZmZlciB0byBjb3B5IHRoZSBkYXRhIHRvLgorICogQG5ieXRlczogVGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLgorICogQHBwb3M6IFRoZSBwb3NpdGlvbiBpbiB0aGUgZmlsZSB0byBzdGFydCByZWFkaW5nIGZyb20uCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIHJvdXRpbmUgcmVhZHMgZGF0YSBmcm9tIHRoZSBAcGhiYSBwY2kgYmFyIG1lbW9yeSBtYXBwZWQgc3BhY2UKKyAqIGFjY29yZGluZyB0byB0aGUgaWRpYWcgY29tbWFuZCwgYW5kIGNvcGllcyB0byB1c2VyIEBidWYuCisgKgorICogUmV0dXJuczoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCB3YXMgcmVhZCAodGhpcyBjb3VsZCBiZSBsZXNzCisgKiB0aGFuIEBuYnl0ZXMgaWYgdGhlIGVuZCBvZiB0aGUgZmlsZSB3YXMgcmVhY2hlZCkgb3IgYSBuZWdhdGl2ZSBlcnJvciB2YWx1ZS4KKyAqKi8KK3N0YXRpYyBzc2l6ZV90CitscGZjX2lkaWFnX2JhcmFjY19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbmJ5dGVzLAorCQkgICAgICAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBscGZjX2RlYnVnICpkZWJ1ZyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbHBmY19oYmEgKnBoYmEgPSAoc3RydWN0IGxwZmNfaGJhICopZGVidWctPmlfcHJpdmF0ZTsKKwlpbnQgb2Zmc2V0X2xhYmVsLCBvZmZzZXQsIG9mZnNldF9ydW4sIGxlbiA9IDAsIGluZGV4OworCWludCBiYXJfbnVtLCBhY2NfcmFuZ2UsIGJhcl9zaXplOworCWNoYXIgKnBidWZmZXI7CisJdm9pZCBfX2lvbWVtICptZW1fbWFwcGVkX2JhcjsKKwl1aW50MzJfdCBpZl90eXBlOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXVpbnQzMl90IHUzMnZhbDsKKworCXBkZXYgPSBwaGJhLT5wY2lkZXY7CisJaWYgKCFwZGV2KQorCQlyZXR1cm4gMDsKKworCS8qIFRoaXMgaXMgYSB1c2VyIHJlYWQgb3BlcmF0aW9uICovCisJZGVidWctPm9wID0gTFBGQ19JRElBR19PUF9SRDsKKworCWlmICghZGVidWctPmJ1ZmZlcikKKwkJZGVidWctPmJ1ZmZlciA9IGttYWxsb2MoTFBGQ19QQ0lfQkFSX1JEX0JVRl9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRlYnVnLT5idWZmZXIpCisJCXJldHVybiAwOworCXBidWZmZXIgPSBkZWJ1Zy0+YnVmZmVyOworCisJaWYgKCpwcG9zKQorCQlyZXR1cm4gMDsKKworCWlmIChpZGlhZy5jbWQub3Bjb2RlID09IExQRkNfSURJQUdfQ01EX0JBUkFDQ19SRCkgeworCQliYXJfbnVtICAgPSBpZGlhZy5jbWQuZGF0YVtJRElBR19CQVJBQ0NfQkFSX05VTV9JTkRYXTsKKwkJb2Zmc2V0ICAgID0gaWRpYWcuY21kLmRhdGFbSURJQUdfQkFSQUNDX09GRl9TRVRfSU5EWF07CisJCWFjY19yYW5nZSA9IGlkaWFnLmNtZC5kYXRhW0lESUFHX0JBUkFDQ19BQ0NfTU9EX0lORFhdOworCQliYXJfc2l6ZSA9IGlkaWFnLmNtZC5kYXRhW0lESUFHX0JBUkFDQ19CQVJfU1pFX0lORFhdOworCX0gZWxzZQorCQlyZXR1cm4gMDsKKworCWlmIChhY2NfcmFuZ2UgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZl90eXBlID0gYmZfZ2V0KGxwZmNfc2xpX2ludGZfaWZfdHlwZSwgJnBoYmEtPnNsaTRfaGJhLnNsaV9pbnRmKTsKKwlpZiAoaWZfdHlwZSA9PSBMUEZDX1NMSV9JTlRGX0lGX1RZUEVfMCkgeworCQlpZiAoYmFyX251bSA9PSBJRElBR19CQVJBQ0NfQkFSXzApCisJCQltZW1fbWFwcGVkX2JhciA9IHBoYmEtPnNsaTRfaGJhLmNvbmZfcmVnc19tZW1tYXBfcDsKKwkJZWxzZSBpZiAoYmFyX251bSA9PSBJRElBR19CQVJBQ0NfQkFSXzEpCisJCQltZW1fbWFwcGVkX2JhciA9IHBoYmEtPnNsaTRfaGJhLmN0cmxfcmVnc19tZW1tYXBfcDsKKwkJZWxzZSBpZiAoYmFyX251bSA9PSBJRElBR19CQVJBQ0NfQkFSXzIpCisJCQltZW1fbWFwcGVkX2JhciA9IHBoYmEtPnNsaTRfaGJhLmRyYmxfcmVnc19tZW1tYXBfcDsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfSBlbHNlIGlmIChpZl90eXBlID09IExQRkNfU0xJX0lOVEZfSUZfVFlQRV8yKSB7CisJCWlmIChiYXJfbnVtID09IElESUFHX0JBUkFDQ19CQVJfMCkKKwkJCW1lbV9tYXBwZWRfYmFyID0gcGhiYS0+c2xpNF9oYmEuY29uZl9yZWdzX21lbW1hcF9wOworCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9IGVsc2UKKwkJcmV0dXJuIDA7CisKKwkvKiBSZWFkIHNpbmdsZSBQQ0kgYmFyIHNwYWNlIHJlZ2lzdGVyICovCisJaWYgKGFjY19yYW5nZSA9PSBTSU5HTEVfV09SRCkgeworCQlvZmZzZXRfcnVuID0gb2Zmc2V0OworCQl1MzJ2YWwgPSByZWFkbChtZW1fbWFwcGVkX2JhciArIG9mZnNldF9ydW4pOworCQlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfUENJX0JBUl9SRF9CVUZfU0laRS1sZW4sCisJCQkJIiUwNXg6ICUwOHhcbiIsIG9mZnNldF9ydW4sIHUzMnZhbCk7CisJfSBlbHNlCisJCWdvdG8gYmFyYWNjX2Jyb3dzZTsKKworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIG5ieXRlcywgcHBvcywgcGJ1ZmZlciwgbGVuKTsKKworYmFyYWNjX2Jyb3dzZToKKworCS8qIEJyb3dzZSBhbGwgUENJIGJhciBzcGFjZSByZWdpc3RlcnMgKi8KKwlvZmZzZXRfbGFiZWwgPSBpZGlhZy5vZmZzZXQubGFzdF9yZDsKKwlvZmZzZXRfcnVuID0gb2Zmc2V0X2xhYmVsOworCisJLyogUmVhZCBQQ0kgYmFyIG1lbW9yeSBtYXBwZWQgc3BhY2UgKi8KKwlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfUENJX0JBUl9SRF9CVUZfU0laRS1sZW4sCisJCQkiJTA1eDogIiwgb2Zmc2V0X2xhYmVsKTsKKwlpbmRleCA9IExQRkNfUENJX0JBUl9SRF9TSVpFOworCXdoaWxlIChpbmRleCA+IDApIHsKKwkJdTMydmFsID0gcmVhZGwobWVtX21hcHBlZF9iYXIgKyBvZmZzZXRfcnVuKTsKKwkJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX1BDSV9CQVJfUkRfQlVGX1NJWkUtbGVuLAorCQkJCSIlMDh4ICIsIHUzMnZhbCk7CisJCW9mZnNldF9ydW4gKz0gc2l6ZW9mKHVpbnQzMl90KTsKKwkJaWYgKGFjY19yYW5nZSA9PSBMUEZDX1BDSV9CQVJfQlJPV1NFKSB7CisJCQlpZiAob2Zmc2V0X3J1biA+PSBiYXJfc2l6ZSkgeworCQkJCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwKKwkJCQkJTFBGQ19QQ0lfQkFSX1JEX0JVRl9TSVpFLWxlbiwgIlxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAob2Zmc2V0X3J1biA+PSBvZmZzZXQgKworCQkJICAgIChhY2NfcmFuZ2UgKiBzaXplb2YodWludDMyX3QpKSkgeworCQkJCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwKKwkJCQkJTFBGQ19QQ0lfQkFSX1JEX0JVRl9TSVpFLWxlbiwgIlxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJaW5kZXggLT0gc2l6ZW9mKHVpbnQzMl90KTsKKwkJaWYgKCFpbmRleCkKKwkJCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwKKwkJCQkJTFBGQ19QQ0lfQkFSX1JEX0JVRl9TSVpFLWxlbiwgIlxuIik7CisJCWVsc2UgaWYgKCEoaW5kZXggJSAoOCAqIHNpemVvZih1aW50MzJfdCkpKSkgeworCQkJb2Zmc2V0X2xhYmVsICs9ICg4ICogc2l6ZW9mKHVpbnQzMl90KSk7CisJCQlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sCisJCQkJCUxQRkNfUENJX0JBUl9SRF9CVUZfU0laRS1sZW4sCisJCQkJCSJcbiUwNXg6ICIsIG9mZnNldF9sYWJlbCk7CisJCX0KKwl9CisKKwkvKiBTZXQgdXAgdGhlIG9mZnNldCBmb3IgbmV4dCBwb3J0aW9uIG9mIHBjaSBiYXIgcmVhZCAqLworCWlmIChpbmRleCA9PSAwKSB7CisJCWlkaWFnLm9mZnNldC5sYXN0X3JkICs9IExQRkNfUENJX0JBUl9SRF9TSVpFOworCQlpZiAoYWNjX3JhbmdlID09IExQRkNfUENJX0JBUl9CUk9XU0UpIHsKKwkJCWlmIChpZGlhZy5vZmZzZXQubGFzdF9yZCA+PSBiYXJfc2l6ZSkKKwkJCQlpZGlhZy5vZmZzZXQubGFzdF9yZCA9IDA7CisJCX0gZWxzZSB7CisJCQlpZiAob2Zmc2V0X3J1biA+PSBvZmZzZXQgKworCQkJICAgIChhY2NfcmFuZ2UgKiBzaXplb2YodWludDMyX3QpKSkKKwkJCQlpZGlhZy5vZmZzZXQubGFzdF9yZCA9IG9mZnNldDsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChhY2NfcmFuZ2UgPT0gTFBGQ19QQ0lfQkFSX0JST1dTRSkKKwkJCWlkaWFnLm9mZnNldC5sYXN0X3JkID0gMDsKKwkJZWxzZQorCQkJaWRpYWcub2Zmc2V0Lmxhc3RfcmQgPSBvZmZzZXQ7CisJfQorCisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgbmJ5dGVzLCBwcG9zLCBwYnVmZmVyLCBsZW4pOworfQorCisvKioKKyAqIGxwZmNfaWRpYWdfYmFyYWNjX3dyaXRlIC0gU3ludGF4IGNoZWNrIGFuZCBzZXQgdXAgaWRpYWcgYmFyIGFjY2VzcyBjb21tYW5kcworICogQGZpbGU6IFRoZSBmaWxlIHBvaW50ZXIgdG8gcmVhZCBmcm9tLgorICogQGJ1ZjogVGhlIGJ1ZmZlciB0byBjb3B5IHRoZSB1c2VyIGRhdGEgZnJvbS4KKyAqIEBuYnl0ZXM6IFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gZ2V0LgorICogQHBwb3M6IFRoZSBwb3NpdGlvbiBpbiB0aGUgZmlsZSB0byBzdGFydCByZWFkaW5nIGZyb20uCisgKgorICogVGhpcyByb3V0aW5lIGdldCB0aGUgZGVidWdmcyBpZGlhZyBjb21tYW5kIHN0cnVjdCBmcm9tIHVzZXIgc3BhY2UgYW5kCisgKiB0aGVuIHBlcmZvcm0gdGhlIHN5bnRheCBjaGVjayBmb3IgUENJIGJhciBtZW1vcnkgbWFwcGVkIHNwYWNlIHJlYWQgb3IKKyAqIHdyaXRlIGNvbW1hbmQgYWNjb3JkaW5nbHkuIEluIHRoZSBjYXNlIG9mIFBDSSBiYXIgbWVtb3J5IG1hcHBlZCBzcGFjZQorICogcmVhZCBjb21tYW5kLCBpdCBzZXRzIHVwIHRoZSBjb21tYW5kIGluIHRoZSBpZGlhZyBjb21tYW5kIHN0cnVjdCBmb3IKKyAqIHRoZSBkZWJ1Z2ZzIHJlYWQgb3BlcmF0aW9uLiBJbiB0aGUgY2FzZSBvZiBQQ0kgYmFyIG1lbW9ycHkgbWFwcGVkIHNwYWNlCisgKiB3cml0ZSBvcGVyYXRpb24sIGl0IGV4ZWN1dGVzIHRoZSB3cml0ZSBvcGVyYXRpb24gaW50byB0aGUgUENJIGJhciBtZW1vcnkKKyAqIG1hcHBlZCBzcGFjZSBhY2NvcmRpbmdseS4KKyAqCisgKiBJdCByZXR1cm5zIHRoZSBAbmJ5dGdlcyBwYXNzaW5nIGluIGZyb20gZGVidWdmcyB1c2VyIHNwYWNlIHdoZW4gc3VjY2Vzc2Z1bC4KKyAqIEluIGNhc2Ugb2YgZXJyb3IgY29uZGl0aW9ucywgaXQgcmV0dXJucyBwcm9wZXIgZXJyb3IgY29kZSBiYWNrIHRvIHRoZSB1c2VyCisgKiBzcGFjZS4KKyAqLworc3RhdGljIHNzaXplX3QKK2xwZmNfaWRpYWdfYmFyYWNjX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBscGZjX2RlYnVnICpkZWJ1ZyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbHBmY19oYmEgKnBoYmEgPSAoc3RydWN0IGxwZmNfaGJhICopZGVidWctPmlfcHJpdmF0ZTsKKwl1aW50MzJfdCBiYXJfbnVtLCBiYXJfc2l6ZSwgb2Zmc2V0LCB2YWx1ZSwgYWNjX3JhbmdlOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworCXZvaWQgX19pb21lbSAqbWVtX21hcHBlZF9iYXI7CisJdWludDMyX3QgaWZfdHlwZTsKKwl1aW50MzJfdCB1MzJ2YWw7CisJaW50IHJjOworCisJcGRldiA9IHBoYmEtPnBjaWRldjsKKwlpZiAoIXBkZXYpCisJCXJldHVybiAtRUZBVUxUOworCisJLyogVGhpcyBpcyBhIHVzZXIgd3JpdGUgb3BlcmF0aW9uICovCisJZGVidWctPm9wID0gTFBGQ19JRElBR19PUF9XUjsKKworCXJjID0gbHBmY19pZGlhZ19jbWRfZ2V0KGJ1ZiwgbmJ5dGVzLCAmaWRpYWcuY21kKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlpZl90eXBlID0gYmZfZ2V0KGxwZmNfc2xpX2ludGZfaWZfdHlwZSwgJnBoYmEtPnNsaTRfaGJhLnNsaV9pbnRmKTsKKwliYXJfbnVtID0gaWRpYWcuY21kLmRhdGFbSURJQUdfQkFSQUNDX0JBUl9OVU1fSU5EWF07CisKKwlpZiAoaWZfdHlwZSA9PSBMUEZDX1NMSV9JTlRGX0lGX1RZUEVfMCkgeworCQlpZiAoKGJhcl9udW0gIT0gSURJQUdfQkFSQUNDX0JBUl8wKSAmJgorCQkgICAgKGJhcl9udW0gIT0gSURJQUdfQkFSQUNDX0JBUl8xKSAmJgorCQkgICAgKGJhcl9udW0gIT0gSURJQUdfQkFSQUNDX0JBUl8yKSkKKwkJCWdvdG8gZXJyb3Jfb3V0OworCX0gZWxzZSBpZiAoaWZfdHlwZSA9PSBMUEZDX1NMSV9JTlRGX0lGX1RZUEVfMikgeworCQlpZiAoYmFyX251bSAhPSBJRElBR19CQVJBQ0NfQkFSXzApCisJCQlnb3RvIGVycm9yX291dDsKKwl9IGVsc2UKKwkJZ290byBlcnJvcl9vdXQ7CisKKwlpZiAoaWZfdHlwZSA9PSBMUEZDX1NMSV9JTlRGX0lGX1RZUEVfMCkgeworCQlpZiAoYmFyX251bSA9PSBJRElBR19CQVJBQ0NfQkFSXzApIHsKKwkJCWlkaWFnLmNtZC5kYXRhW0lESUFHX0JBUkFDQ19CQVJfU1pFX0lORFhdID0KKwkJCQlMUEZDX1BDSV9JRjBfQkFSMF9TSVpFOworCQkJbWVtX21hcHBlZF9iYXIgPSBwaGJhLT5zbGk0X2hiYS5jb25mX3JlZ3NfbWVtbWFwX3A7CisJCX0gZWxzZSBpZiAoYmFyX251bSA9PSBJRElBR19CQVJBQ0NfQkFSXzEpIHsKKwkJCWlkaWFnLmNtZC5kYXRhW0lESUFHX0JBUkFDQ19CQVJfU1pFX0lORFhdID0KKwkJCQlMUEZDX1BDSV9JRjBfQkFSMV9TSVpFOworCQkJbWVtX21hcHBlZF9iYXIgPSBwaGJhLT5zbGk0X2hiYS5jdHJsX3JlZ3NfbWVtbWFwX3A7CisJCX0gZWxzZSBpZiAoYmFyX251bSA9PSBJRElBR19CQVJBQ0NfQkFSXzIpIHsKKwkJCWlkaWFnLmNtZC5kYXRhW0lESUFHX0JBUkFDQ19CQVJfU1pFX0lORFhdID0KKwkJCQlMUEZDX1BDSV9JRjBfQkFSMl9TSVpFOworCQkJbWVtX21hcHBlZF9iYXIgPSBwaGJhLT5zbGk0X2hiYS5kcmJsX3JlZ3NfbWVtbWFwX3A7CisJCX0gZWxzZQorCQkJZ290byBlcnJvcl9vdXQ7CisJfSBlbHNlIGlmIChpZl90eXBlID09IExQRkNfU0xJX0lOVEZfSUZfVFlQRV8yKSB7CisJCWlmIChiYXJfbnVtID09IElESUFHX0JBUkFDQ19CQVJfMCkgeworCQkJaWRpYWcuY21kLmRhdGFbSURJQUdfQkFSQUNDX0JBUl9TWkVfSU5EWF0gPQorCQkJCUxQRkNfUENJX0lGMl9CQVIwX1NJWkU7CisJCQltZW1fbWFwcGVkX2JhciA9IHBoYmEtPnNsaTRfaGJhLmNvbmZfcmVnc19tZW1tYXBfcDsKKwkJfSBlbHNlCisJCQlnb3RvIGVycm9yX291dDsKKwl9IGVsc2UKKwkJZ290byBlcnJvcl9vdXQ7CisKKwlvZmZzZXQgPSBpZGlhZy5jbWQuZGF0YVtJRElBR19CQVJBQ0NfT0ZGX1NFVF9JTkRYXTsKKwlpZiAob2Zmc2V0ICUgc2l6ZW9mKHVpbnQzMl90KSkKKwkJZ290byBlcnJvcl9vdXQ7CisKKwliYXJfc2l6ZSA9IGlkaWFnLmNtZC5kYXRhW0lESUFHX0JBUkFDQ19CQVJfU1pFX0lORFhdOworCWlmIChpZGlhZy5jbWQub3Bjb2RlID09IExQRkNfSURJQUdfQ01EX0JBUkFDQ19SRCkgeworCQkvKiBTYW5pdHkgY2hlY2sgb24gUENJIGNvbmZpZyByZWFkIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgKi8KKwkJaWYgKHJjICE9IExQRkNfUENJX0JBUl9SRF9DTURfQVJHKQorCQkJZ290byBlcnJvcl9vdXQ7CisJCWFjY19yYW5nZSA9IGlkaWFnLmNtZC5kYXRhW0lESUFHX0JBUkFDQ19BQ0NfTU9EX0lORFhdOworCQlpZiAoYWNjX3JhbmdlID09IExQRkNfUENJX0JBUl9CUk9XU0UpIHsKKwkJCWlmIChvZmZzZXQgPiBiYXJfc2l6ZSAtIHNpemVvZih1aW50MzJfdCkpCisJCQkJZ290byBlcnJvcl9vdXQ7CisJCQkvKiBTdGFydGluZyBvZmZzZXQgdG8gYnJvd3NlICovCisJCQlpZGlhZy5vZmZzZXQubGFzdF9yZCA9IG9mZnNldDsKKwkJfSBlbHNlIGlmIChhY2NfcmFuZ2UgPiBTSU5HTEVfV09SRCkgeworCQkJaWYgKG9mZnNldCArIGFjY19yYW5nZSAqIHNpemVvZih1aW50MzJfdCkgPiBiYXJfc2l6ZSkKKwkJCQlnb3RvIGVycm9yX291dDsKKwkJCS8qIFN0YXJ0aW5nIG9mZnNldCB0byBicm93c2UgKi8KKwkJCWlkaWFnLm9mZnNldC5sYXN0X3JkID0gb2Zmc2V0OworCQl9IGVsc2UgaWYgKGFjY19yYW5nZSAhPSBTSU5HTEVfV09SRCkKKwkJCWdvdG8gZXJyb3Jfb3V0OworCX0gZWxzZSBpZiAoaWRpYWcuY21kLm9wY29kZSA9PSBMUEZDX0lESUFHX0NNRF9CQVJBQ0NfV1IgfHwKKwkJICAgaWRpYWcuY21kLm9wY29kZSA9PSBMUEZDX0lESUFHX0NNRF9CQVJBQ0NfU1QgfHwKKwkJICAgaWRpYWcuY21kLm9wY29kZSA9PSBMUEZDX0lESUFHX0NNRF9CQVJBQ0NfQ0wpIHsKKwkJLyogU2FuaXR5IGNoZWNrIG9uIFBDSSBiYXIgd3JpdGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyAqLworCQlpZiAocmMgIT0gTFBGQ19QQ0lfQkFSX1dSX0NNRF9BUkcpCisJCQlnb3RvIGVycm9yX291dDsKKwkJLyogV3JpdGUgY29tbWFuZCB0byBQQ0kgYmFyIHNwYWNlLCByZWFkLW1vZGlmeS13cml0ZSAqLworCQlhY2NfcmFuZ2UgPSBTSU5HTEVfV09SRDsKKwkJdmFsdWUgPSBpZGlhZy5jbWQuZGF0YVtJRElBR19CQVJBQ0NfUkVHX1ZBTF9JTkRYXTsKKwkJaWYgKGlkaWFnLmNtZC5vcGNvZGUgPT0gTFBGQ19JRElBR19DTURfQkFSQUNDX1dSKSB7CisJCQl3cml0ZWwodmFsdWUsIG1lbV9tYXBwZWRfYmFyICsgb2Zmc2V0KTsKKwkJCXJlYWRsKG1lbV9tYXBwZWRfYmFyICsgb2Zmc2V0KTsKKwkJfQorCQlpZiAoaWRpYWcuY21kLm9wY29kZSA9PSBMUEZDX0lESUFHX0NNRF9CQVJBQ0NfU1QpIHsKKwkJCXUzMnZhbCA9IHJlYWRsKG1lbV9tYXBwZWRfYmFyICsgb2Zmc2V0KTsKKwkJCXUzMnZhbCB8PSB2YWx1ZTsKKwkJCXdyaXRlbCh1MzJ2YWwsIG1lbV9tYXBwZWRfYmFyICsgb2Zmc2V0KTsKKwkJCXJlYWRsKG1lbV9tYXBwZWRfYmFyICsgb2Zmc2V0KTsKKwkJfQorCQlpZiAoaWRpYWcuY21kLm9wY29kZSA9PSBMUEZDX0lESUFHX0NNRF9CQVJBQ0NfQ0wpIHsKKwkJCXUzMnZhbCA9IHJlYWRsKG1lbV9tYXBwZWRfYmFyICsgb2Zmc2V0KTsKKwkJCXUzMnZhbCAmPSB+dmFsdWU7CisJCQl3cml0ZWwodTMydmFsLCBtZW1fbWFwcGVkX2JhciArIG9mZnNldCk7CisJCQlyZWFkbChtZW1fbWFwcGVkX2JhciArIG9mZnNldCk7CisJCX0KKwl9IGVsc2UKKwkJLyogQWxsIG90aGVyIG9wZWNvZGVzIGFyZSBpbGxlZ2FsIGZvciBub3cgKi8KKwkJZ290byBlcnJvcl9vdXQ7CisKKwlyZXR1cm4gbmJ5dGVzOworZXJyb3Jfb3V0OgorCW1lbXNldCgmaWRpYWcsIDAsIHNpemVvZihpZGlhZykpOworCXJldHVybiAtRUlOVkFMOworfQorCisvKioKICAqIGxwZmNfaWRpYWdfcXVlaW5mb19yZWFkIC0gaWRpYWcgZGVidWdmcyByZWFkIHF1ZXVlIGluZm9ybWF0aW9uCiAgKiBAZmlsZTogVGhlIGZpbGUgcG9pbnRlciB0byByZWFkIGZyb20uCiAgKiBAYnVmOiBUaGUgYnVmZmVyIHRvIGNvcHkgdGhlIGRhdGEgdG8uCkBAIC0xODcxLDggKzIxODMsOCBAQAogCQlyZXR1cm4gMDsKIAogCWlmIChpZGlhZy5jbWQub3Bjb2RlID09IExQRkNfSURJQUdfQ01EX1FVRUFDQ19SRCkgewotCQlpbmRleCA9IGlkaWFnLmNtZC5kYXRhWzJdOwotCQljb3VudCA9IGlkaWFnLmNtZC5kYXRhWzNdOworCQlpbmRleCA9IGlkaWFnLmNtZC5kYXRhW0lESUFHX1FVRUFDQ19JTkRFWF9JTkRYXTsKKwkJY291bnQgPSBpZGlhZy5jbWQuZGF0YVtJRElBR19RVUVBQ0NfQ09VTlRfSU5EWF07CiAJCXBxdWUgPSAoc3RydWN0IGxwZmNfcXVldWUgKilpZGlhZy5wdHJfcHJpdmF0ZTsKIAl9IGVsc2UKIAkJcmV0dXJuIDA7CkBAIC0xOTQ0LDEyICsyMjU2LDEyIEBACiAJCXJldHVybiByYzsKIAogCS8qIEdldCBhbmQgc2FuaXR5IGNoZWNrIG9uIGNvbW1hbmQgZmVpbGRzICovCi0JcXVldHAgID0gaWRpYWcuY21kLmRhdGFbMF07Ci0JcXVlaWQgID0gaWRpYWcuY21kLmRhdGFbMV07Ci0JaW5kZXggID0gaWRpYWcuY21kLmRhdGFbMl07Ci0JY291bnQgID0gaWRpYWcuY21kLmRhdGFbM107Ci0Jb2Zmc2V0ID0gaWRpYWcuY21kLmRhdGFbNF07Ci0JdmFsdWUgID0gaWRpYWcuY21kLmRhdGFbNV07CisJcXVldHAgID0gaWRpYWcuY21kLmRhdGFbSURJQUdfUVVFQUNDX1FVRVRQX0lORFhdOworCXF1ZWlkICA9IGlkaWFnLmNtZC5kYXRhW0lESUFHX1FVRUFDQ19RVUVJRF9JTkRYXTsKKwlpbmRleCAgPSBpZGlhZy5jbWQuZGF0YVtJRElBR19RVUVBQ0NfSU5ERVhfSU5EWF07CisJY291bnQgID0gaWRpYWcuY21kLmRhdGFbSURJQUdfUVVFQUNDX0NPVU5UX0lORFhdOworCW9mZnNldCA9IGlkaWFnLmNtZC5kYXRhW0lESUFHX1FVRUFDQ19PRkZTVF9JTkRYXTsKKwl2YWx1ZSAgPSBpZGlhZy5jbWQuZGF0YVtJRElBR19RVUVBQ0NfVkFMVUVfSU5EWF07CiAKIAkvKiBTYW5pdHkgY2hlY2sgb24gY29tbWFuZCBsaW5lIGFyZ3VtZW50cyAqLwogCWlmIChpZGlhZy5jbWQub3Bjb2RlID09IExQRkNfSURJQUdfQ01EX1FVRUFDQ19XUiB8fApAQCAtMjIxOCw3ICsyNTMwLDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlpZiAoaWRpYWcuY21kLm9wY29kZSA9PSBMUEZDX0lESUFHX0NNRF9EUkJBQ0NfUkQpCi0JCWRyYl9yZWdfaWQgPSBpZGlhZy5jbWQuZGF0YVswXTsKKwkJZHJiX3JlZ19pZCA9IGlkaWFnLmNtZC5kYXRhW0lESUFHX0RSQkFDQ19SRUdJRF9JTkRYXTsKIAllbHNlCiAJCXJldHVybiAwOwogCkBAIC0yMjU3LDcgKzI1NjksNyBAQAogewogCXN0cnVjdCBscGZjX2RlYnVnICpkZWJ1ZyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlzdHJ1Y3QgbHBmY19oYmEgKnBoYmEgPSAoc3RydWN0IGxwZmNfaGJhICopZGVidWctPmlfcHJpdmF0ZTsKLQl1aW50MzJfdCBkcmJfcmVnX2lkLCB2YWx1ZSwgcmVnX3ZhbDsKKwl1aW50MzJfdCBkcmJfcmVnX2lkLCB2YWx1ZSwgcmVnX3ZhbCA9IDA7CiAJdm9pZCBfX2lvbWVtICpkcmJfcmVnOwogCWludCByYzsKIApAQCAtMjI2OSw4ICsyNTgxLDggQEAKIAkJcmV0dXJuIHJjOwogCiAJLyogU2FuaXR5IGNoZWNrIG9uIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgKi8KLQlkcmJfcmVnX2lkID0gaWRpYWcuY21kLmRhdGFbMF07Ci0JdmFsdWUgPSBpZGlhZy5jbWQuZGF0YVsxXTsKKwlkcmJfcmVnX2lkID0gaWRpYWcuY21kLmRhdGFbSURJQUdfRFJCQUNDX1JFR0lEX0lORFhdOworCXZhbHVlID0gaWRpYWcuY21kLmRhdGFbSURJQUdfRFJCQUNDX1ZBTFVFX0lORFhdOwogCiAJaWYgKGlkaWFnLmNtZC5vcGNvZGUgPT0gTFBGQ19JRElBR19DTURfRFJCQUNDX1dSIHx8CiAJICAgIGlkaWFnLmNtZC5vcGNvZGUgPT0gTFBGQ19JRElBR19DTURfRFJCQUNDX1NUIHx8CkBAIC0yMzMwLDYgKzI2NDIsNjc5IEBACiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKKy8qKgorICogbHBmY19pZGlhZ19jdGxhY2NfcmVhZF9yZWcgLSBpZGlhZyBkZWJ1Z2ZzIHJlYWQgYSBjb250cm9sIHJlZ2lzdGVycworICogQHBoYmE6IFRoZSBwb2ludGVyIHRvIGhiYSBzdHJ1Y3R1cmUuCisgKiBAcGJ1ZmZlcjogVGhlIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciB0byBjb3B5IHRoZSBkYXRhIHRvLgorICogQGxlbjogVGhlIGxlbmdodCBvZiBieXRlcyB0byBjb3BpZWQuCisgKiBAZHJicmVnaWQ6IFRoZSBpZCB0byBkb29yYmVsbCByZWdpc3RlcnMuCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIHJvdXRpbmUgcmVhZHMgYSBjb250cm9sIHJlZ2lzdGVyIGFuZCBjb3BpZXMgaXRzIGNvbnRlbnQgdG8gdGhlCisgKiB1c2VyIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IEBwYnVmZmVyLgorICoKKyAqIFJldHVybnM6CisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgd2FzIGNvcGllZCBpbnRvIEBwYnVmZmVyLgorICoqLworc3RhdGljIGludAorbHBmY19pZGlhZ19jdGxhY2NfcmVhZF9yZWcoc3RydWN0IGxwZmNfaGJhICpwaGJhLCBjaGFyICpwYnVmZmVyLAorCQkJICAgaW50IGxlbiwgdWludDMyX3QgY3RscmVnaWQpCit7CisKKwlpZiAoIXBidWZmZXIpCisJCXJldHVybiAwOworCisJc3dpdGNoIChjdGxyZWdpZCkgeworCWNhc2UgTFBGQ19DVExfUE9SVF9TRU06CisJCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwgTFBGQ19DVExfQUNDX0JVRl9TSVpFLWxlbiwKKwkJCQkiUG9ydCBTZW1SZWc6ICAgMHglMDh4XG4iLAorCQkJCXJlYWRsKHBoYmEtPnNsaTRfaGJhLmNvbmZfcmVnc19tZW1tYXBfcCArCisJCQkJICAgICAgTFBGQ19DVExfUE9SVF9TRU1fT0ZGU0VUKSk7CisJCWJyZWFrOworCWNhc2UgTFBGQ19DVExfUE9SVF9TVEE6CisJCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwgTFBGQ19DVExfQUNDX0JVRl9TSVpFLWxlbiwKKwkJCQkiUG9ydCBTdGFSZWc6ICAgMHglMDh4XG4iLAorCQkJCXJlYWRsKHBoYmEtPnNsaTRfaGJhLmNvbmZfcmVnc19tZW1tYXBfcCArCisJCQkJICAgICAgTFBGQ19DVExfUE9SVF9TVEFfT0ZGU0VUKSk7CisJCWJyZWFrOworCWNhc2UgTFBGQ19DVExfUE9SVF9DVEw6CisJCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwgTFBGQ19DVExfQUNDX0JVRl9TSVpFLWxlbiwKKwkJCQkiUG9ydCBDdGxSZWc6ICAgMHglMDh4XG4iLAorCQkJCXJlYWRsKHBoYmEtPnNsaTRfaGJhLmNvbmZfcmVnc19tZW1tYXBfcCArCisJCQkJICAgICAgTFBGQ19DVExfUE9SVF9DVExfT0ZGU0VUKSk7CisJCWJyZWFrOworCWNhc2UgTFBGQ19DVExfUE9SVF9FUjE6CisJCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwgTFBGQ19DVExfQUNDX0JVRl9TSVpFLWxlbiwKKwkJCQkiUG9ydCBFcjFSZWc6ICAgMHglMDh4XG4iLAorCQkJCXJlYWRsKHBoYmEtPnNsaTRfaGJhLmNvbmZfcmVnc19tZW1tYXBfcCArCisJCQkJICAgICAgTFBGQ19DVExfUE9SVF9FUjFfT0ZGU0VUKSk7CisJCWJyZWFrOworCWNhc2UgTFBGQ19DVExfUE9SVF9FUjI6CisJCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwgTFBGQ19DVExfQUNDX0JVRl9TSVpFLWxlbiwKKwkJCQkiUG9ydCBFcjJSZWc6ICAgMHglMDh4XG4iLAorCQkJCXJlYWRsKHBoYmEtPnNsaTRfaGJhLmNvbmZfcmVnc19tZW1tYXBfcCArCisJCQkJICAgICAgTFBGQ19DVExfUE9SVF9FUjJfT0ZGU0VUKSk7CisJCWJyZWFrOworCWNhc2UgTFBGQ19DVExfUERFVl9DVEw6CisJCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwgTFBGQ19DVExfQUNDX0JVRl9TSVpFLWxlbiwKKwkJCQkiUERldiBDdGxSZWc6ICAgMHglMDh4XG4iLAorCQkJCXJlYWRsKHBoYmEtPnNsaTRfaGJhLmNvbmZfcmVnc19tZW1tYXBfcCArCisJCQkJICAgICAgTFBGQ19DVExfUERFVl9DVExfT0ZGU0VUKSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gbGVuOworfQorCisvKioKKyAqIGxwZmNfaWRpYWdfY3RsYWNjX3JlYWQgLSBpZGlhZyBkZWJ1Z2ZzIHJlYWQgcG9ydCBhbmQgZGV2aWNlIGNvbnRyb2wgcmVnaXN0ZXIKKyAqIEBmaWxlOiBUaGUgZmlsZSBwb2ludGVyIHRvIHJlYWQgZnJvbS4KKyAqIEBidWY6IFRoZSBidWZmZXIgdG8gY29weSB0aGUgZGF0YSB0by4KKyAqIEBuYnl0ZXM6IFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKyAqIEBwcG9zOiBUaGUgcG9zaXRpb24gaW4gdGhlIGZpbGUgdG8gc3RhcnQgcmVhZGluZyBmcm9tLgorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyByb3V0aW5lIHJlYWRzIGRhdGEgZnJvbSB0aGUgQHBoYmEgcG9ydCBhbmQgZGV2aWNlIHJlZ2lzdGVycyBhY2NvcmRpbmcKKyAqIHRvIHRoZSBpZGlhZyBjb21tYW5kLCBhbmQgY29waWVzIHRvIHVzZXIgQGJ1Zi4KKyAqCisgKiBSZXR1cm5zOgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IHdhcyByZWFkICh0aGlzIGNvdWxkIGJlIGxlc3MKKyAqIHRoYW4gQG5ieXRlcyBpZiB0aGUgZW5kIG9mIHRoZSBmaWxlIHdhcyByZWFjaGVkKSBvciBhIG5lZ2F0aXZlIGVycm9yIHZhbHVlLgorICoqLworc3RhdGljIHNzaXplX3QKK2xwZmNfaWRpYWdfY3RsYWNjX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBuYnl0ZXMsCisJCSAgICAgICBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGxwZmNfZGVidWcgKmRlYnVnID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBscGZjX2hiYSAqcGhiYSA9IChzdHJ1Y3QgbHBmY19oYmEgKilkZWJ1Zy0+aV9wcml2YXRlOworCXVpbnQzMl90IGN0bF9yZWdfaWQsIGk7CisJY2hhciAqcGJ1ZmZlcjsKKwlpbnQgbGVuID0gMDsKKworCS8qIFRoaXMgaXMgYSB1c2VyIHJlYWQgb3BlcmF0aW9uICovCisJZGVidWctPm9wID0gTFBGQ19JRElBR19PUF9SRDsKKworCWlmICghZGVidWctPmJ1ZmZlcikKKwkJZGVidWctPmJ1ZmZlciA9IGttYWxsb2MoTFBGQ19DVExfQUNDX0JVRl9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRlYnVnLT5idWZmZXIpCisJCXJldHVybiAwOworCXBidWZmZXIgPSBkZWJ1Zy0+YnVmZmVyOworCisJaWYgKCpwcG9zKQorCQlyZXR1cm4gMDsKKworCWlmIChpZGlhZy5jbWQub3Bjb2RlID09IExQRkNfSURJQUdfQ01EX0NUTEFDQ19SRCkKKwkJY3RsX3JlZ19pZCA9IGlkaWFnLmNtZC5kYXRhW0lESUFHX0NUTEFDQ19SRUdJRF9JTkRYXTsKKwllbHNlCisJCXJldHVybiAwOworCisJaWYgKGN0bF9yZWdfaWQgPT0gTFBGQ19DVExfQUNDX0FMTCkKKwkJZm9yIChpID0gMTsgaSA8PSBMUEZDX0NUTF9NQVg7IGkrKykKKwkJCWxlbiA9IGxwZmNfaWRpYWdfY3RsYWNjX3JlYWRfcmVnKHBoYmEsCisJCQkJCQkJIHBidWZmZXIsIGxlbiwgaSk7CisJZWxzZQorCQlsZW4gPSBscGZjX2lkaWFnX2N0bGFjY19yZWFkX3JlZyhwaGJhLAorCQkJCQkJIHBidWZmZXIsIGxlbiwgY3RsX3JlZ19pZCk7CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIoYnVmLCBuYnl0ZXMsIHBwb3MsIHBidWZmZXIsIGxlbik7Cit9CisKKy8qKgorICogbHBmY19pZGlhZ19jdGxhY2Nfd3JpdGUgLSBTeW50YXggY2hlY2sgYW5kIHNldCB1cCBpZGlhZyBjdGxhY2MgY29tbWFuZHMKKyAqIEBmaWxlOiBUaGUgZmlsZSBwb2ludGVyIHRvIHJlYWQgZnJvbS4KKyAqIEBidWY6IFRoZSBidWZmZXIgdG8gY29weSB0aGUgdXNlciBkYXRhIGZyb20uCisgKiBAbmJ5dGVzOiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGdldC4KKyAqIEBwcG9zOiBUaGUgcG9zaXRpb24gaW4gdGhlIGZpbGUgdG8gc3RhcnQgcmVhZGluZyBmcm9tLgorICoKKyAqIFRoaXMgcm91dGluZSBnZXQgdGhlIGRlYnVnZnMgaWRpYWcgY29tbWFuZCBzdHJ1Y3QgZnJvbSB1c2VyIHNwYWNlIGFuZCB0aGVuCisgKiBwZXJmb3JtIHRoZSBzeW50YXggY2hlY2sgZm9yIHBvcnQgYW5kIGRldmljZSBjb250cm9sIHJlZ2lzdGVyIHJlYWQgKGR1bXApCisgKiBvciB3cml0ZSAoc2V0KSBjb21tYW5kIGFjY29yZGluZ2x5LgorICoKKyAqIEl0IHJldHVybnMgdGhlIEBuYnl0Z2VzIHBhc3NpbmcgaW4gZnJvbSBkZWJ1Z2ZzIHVzZXIgc3BhY2Ugd2hlbiBzdWNjZXNzZnVsLgorICogSW4gY2FzZSBvZiBlcnJvciBjb25kaXRpb25zLCBpdCByZXR1cm5zIHByb3BlciBlcnJvciBjb2RlIGJhY2sgdG8gdGhlIHVzZXIKKyAqIHNwYWNlLgorICoqLworc3RhdGljIHNzaXplX3QKK2xwZmNfaWRpYWdfY3RsYWNjX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAorCQkJc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBscGZjX2RlYnVnICpkZWJ1ZyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbHBmY19oYmEgKnBoYmEgPSAoc3RydWN0IGxwZmNfaGJhICopZGVidWctPmlfcHJpdmF0ZTsKKwl1aW50MzJfdCBjdGxfcmVnX2lkLCB2YWx1ZSwgcmVnX3ZhbCA9IDA7CisJdm9pZCBfX2lvbWVtICpjdGxfcmVnOworCWludCByYzsKKworCS8qIFRoaXMgaXMgYSB1c2VyIHdyaXRlIG9wZXJhdGlvbiAqLworCWRlYnVnLT5vcCA9IExQRkNfSURJQUdfT1BfV1I7CisKKwlyYyA9IGxwZmNfaWRpYWdfY21kX2dldChidWYsIG5ieXRlcywgJmlkaWFnLmNtZCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJLyogU2FuaXR5IGNoZWNrIG9uIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgKi8KKwljdGxfcmVnX2lkID0gaWRpYWcuY21kLmRhdGFbSURJQUdfQ1RMQUNDX1JFR0lEX0lORFhdOworCXZhbHVlID0gaWRpYWcuY21kLmRhdGFbSURJQUdfQ1RMQUNDX1ZBTFVFX0lORFhdOworCisJaWYgKGlkaWFnLmNtZC5vcGNvZGUgPT0gTFBGQ19JRElBR19DTURfQ1RMQUNDX1dSIHx8CisJICAgIGlkaWFnLmNtZC5vcGNvZGUgPT0gTFBGQ19JRElBR19DTURfQ1RMQUNDX1NUIHx8CisJICAgIGlkaWFnLmNtZC5vcGNvZGUgPT0gTFBGQ19JRElBR19DTURfQ1RMQUNDX0NMKSB7CisJCWlmIChyYyAhPSBMUEZDX0NUTF9BQ0NfV1JfQ01EX0FSRykKKwkJCWdvdG8gZXJyb3Jfb3V0OworCQlpZiAoY3RsX3JlZ19pZCA+IExQRkNfQ1RMX01BWCkKKwkJCWdvdG8gZXJyb3Jfb3V0OworCX0gZWxzZSBpZiAoaWRpYWcuY21kLm9wY29kZSA9PSBMUEZDX0lESUFHX0NNRF9DVExBQ0NfUkQpIHsKKwkJaWYgKHJjICE9IExQRkNfQ1RMX0FDQ19SRF9DTURfQVJHKQorCQkJZ290byBlcnJvcl9vdXQ7CisJCWlmICgoY3RsX3JlZ19pZCA+IExQRkNfQ1RMX01BWCkgJiYKKwkJICAgIChjdGxfcmVnX2lkICE9IExQRkNfQ1RMX0FDQ19BTEwpKQorCQkJZ290byBlcnJvcl9vdXQ7CisJfSBlbHNlCisJCWdvdG8gZXJyb3Jfb3V0OworCisJLyogUGVyZm9ybSB0aGUgd3JpdGUgYWNjZXNzIG9wZXJhdGlvbiAqLworCWlmIChpZGlhZy5jbWQub3Bjb2RlID09IExQRkNfSURJQUdfQ01EX0NUTEFDQ19XUiB8fAorCSAgICBpZGlhZy5jbWQub3Bjb2RlID09IExQRkNfSURJQUdfQ01EX0NUTEFDQ19TVCB8fAorCSAgICBpZGlhZy5jbWQub3Bjb2RlID09IExQRkNfSURJQUdfQ01EX0NUTEFDQ19DTCkgeworCQlzd2l0Y2ggKGN0bF9yZWdfaWQpIHsKKwkJY2FzZSBMUEZDX0NUTF9QT1JUX1NFTToKKwkJCWN0bF9yZWcgPSBwaGJhLT5zbGk0X2hiYS5jb25mX3JlZ3NfbWVtbWFwX3AgKworCQkJCQlMUEZDX0NUTF9QT1JUX1NFTV9PRkZTRVQ7CisJCQlicmVhazsKKwkJY2FzZSBMUEZDX0NUTF9QT1JUX1NUQToKKwkJCWN0bF9yZWcgPSBwaGJhLT5zbGk0X2hiYS5jb25mX3JlZ3NfbWVtbWFwX3AgKworCQkJCQlMUEZDX0NUTF9QT1JUX1NUQV9PRkZTRVQ7CisJCQlicmVhazsKKwkJY2FzZSBMUEZDX0NUTF9QT1JUX0NUTDoKKwkJCWN0bF9yZWcgPSBwaGJhLT5zbGk0X2hiYS5jb25mX3JlZ3NfbWVtbWFwX3AgKworCQkJCQlMUEZDX0NUTF9QT1JUX0NUTF9PRkZTRVQ7CisJCQlicmVhazsKKwkJY2FzZSBMUEZDX0NUTF9QT1JUX0VSMToKKwkJCWN0bF9yZWcgPSBwaGJhLT5zbGk0X2hiYS5jb25mX3JlZ3NfbWVtbWFwX3AgKworCQkJCQlMUEZDX0NUTF9QT1JUX0VSMV9PRkZTRVQ7CisJCQlicmVhazsKKwkJY2FzZSBMUEZDX0NUTF9QT1JUX0VSMjoKKwkJCWN0bF9yZWcgPSBwaGJhLT5zbGk0X2hiYS5jb25mX3JlZ3NfbWVtbWFwX3AgKworCQkJCQlMUEZDX0NUTF9QT1JUX0VSMl9PRkZTRVQ7CisJCQlicmVhazsKKwkJY2FzZSBMUEZDX0NUTF9QREVWX0NUTDoKKwkJCWN0bF9yZWcgPSBwaGJhLT5zbGk0X2hiYS5jb25mX3JlZ3NfbWVtbWFwX3AgKworCQkJCQlMUEZDX0NUTF9QREVWX0NUTF9PRkZTRVQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gZXJyb3Jfb3V0OworCQl9CisKKwkJaWYgKGlkaWFnLmNtZC5vcGNvZGUgPT0gTFBGQ19JRElBR19DTURfQ1RMQUNDX1dSKQorCQkJcmVnX3ZhbCA9IHZhbHVlOworCQlpZiAoaWRpYWcuY21kLm9wY29kZSA9PSBMUEZDX0lESUFHX0NNRF9DVExBQ0NfU1QpIHsKKwkJCXJlZ192YWwgPSByZWFkbChjdGxfcmVnKTsKKwkJCXJlZ192YWwgfD0gdmFsdWU7CisJCX0KKwkJaWYgKGlkaWFnLmNtZC5vcGNvZGUgPT0gTFBGQ19JRElBR19DTURfQ1RMQUNDX0NMKSB7CisJCQlyZWdfdmFsID0gcmVhZGwoY3RsX3JlZyk7CisJCQlyZWdfdmFsICY9IH52YWx1ZTsKKwkJfQorCQl3cml0ZWwocmVnX3ZhbCwgY3RsX3JlZyk7CisJCXJlYWRsKGN0bF9yZWcpOyAvKiBmbHVzaCAqLworCX0KKwlyZXR1cm4gbmJ5dGVzOworCitlcnJvcl9vdXQ6CisJLyogQ2xlYW4gb3V0IGNvbW1hbmQgc3RydWN0dXJlIG9uIGNvbW1hbmQgZXJyb3Igb3V0ICovCisJbWVtc2V0KCZpZGlhZywgMCwgc2l6ZW9mKGlkaWFnKSk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qKgorICogbHBmY19pZGlhZ19tYnhhY2NfZ2V0X3NldHVwIC0gaWRpYWcgZGVidWdmcyBnZXQgbWFpbGJveCBhY2Nlc3Mgc2V0dXAKKyAqIEBwaGJhOiBQb2ludGVyIHRvIEhCQSBjb250ZXh0IG9iamVjdC4KKyAqIEBwYnVmZmVyOiBQb2ludGVyIHRvIGRhdGEgYnVmZmVyLgorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyByb3V0aW5lIGdldHMgdGhlIGRyaXZlciBtYWlsYm94IGFjY2VzcyBkZWJ1Z2ZzIHNldHVwIGluZm9ybWF0aW9uLgorICoKKyAqIFJldHVybnM6CisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgd2FzIHJlYWQgKHRoaXMgY291bGQgYmUgbGVzcworICogdGhhbiBAbmJ5dGVzIGlmIHRoZSBlbmQgb2YgdGhlIGZpbGUgd2FzIHJlYWNoZWQpIG9yIGEgbmVnYXRpdmUgZXJyb3IgdmFsdWUuCisgKiovCitzdGF0aWMgaW50CitscGZjX2lkaWFnX21ieGFjY19nZXRfc2V0dXAoc3RydWN0IGxwZmNfaGJhICpwaGJhLCBjaGFyICpwYnVmZmVyKQoreworCXVpbnQzMl90IG1ieF9kdW1wX21hcCwgbWJ4X2R1bXBfY250LCBtYnhfd29yZF9jbnQsIG1ieF9tYm94X2NtZDsKKwlpbnQgbGVuID0gMDsKKworCW1ieF9tYm94X2NtZCA9IGlkaWFnLmNtZC5kYXRhW0lESUFHX01CWEFDQ19NQkNNRF9JTkRYXTsKKwltYnhfZHVtcF9tYXAgPSBpZGlhZy5jbWQuZGF0YVtJRElBR19NQlhBQ0NfRFBNQVBfSU5EWF07CisJbWJ4X2R1bXBfY250ID0gaWRpYWcuY21kLmRhdGFbSURJQUdfTUJYQUNDX0RQQ05UX0lORFhdOworCW1ieF93b3JkX2NudCA9IGlkaWFnLmNtZC5kYXRhW0lESUFHX01CWEFDQ19XRENOVF9JTkRYXTsKKworCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwgTFBGQ19NQlhfQUNDX0JVRl9TSVpFLWxlbiwKKwkJCSJtYnhfZHVtcF9tYXA6IDB4JTA4eFxuIiwgbWJ4X2R1bXBfbWFwKTsKKwlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfTUJYX0FDQ19CVUZfU0laRS1sZW4sCisJCQkibWJ4X2R1bXBfY250OiAlMDRkXG4iLCBtYnhfZHVtcF9jbnQpOworCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwgTFBGQ19NQlhfQUNDX0JVRl9TSVpFLWxlbiwKKwkJCSJtYnhfd29yZF9jbnQ6ICUwNGRcbiIsIG1ieF93b3JkX2NudCk7CisJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX01CWF9BQ0NfQlVGX1NJWkUtbGVuLAorCQkJIm1ieF9tYm94X2NtZDogMHglMDJ4XG4iLCBtYnhfbWJveF9jbWQpOworCisJcmV0dXJuIGxlbjsKK30KKworLyoqCisgKiBscGZjX2lkaWFnX21ieGFjY19yZWFkIC0gaWRpYWcgZGVidWdmcyByZWFkIG9uIG1haWxib3ggYWNjZXNzCisgKiBAZmlsZTogVGhlIGZpbGUgcG9pbnRlciB0byByZWFkIGZyb20uCisgKiBAYnVmOiBUaGUgYnVmZmVyIHRvIGNvcHkgdGhlIGRhdGEgdG8uCisgKiBAbmJ5dGVzOiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisgKiBAcHBvczogVGhlIHBvc2l0aW9uIGluIHRoZSBmaWxlIHRvIHN0YXJ0IHJlYWRpbmcgZnJvbS4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgcm91dGluZSByZWFkcyBkYXRhIGZyb20gdGhlIEBwaGJhIGRyaXZlciBtYWlsYm94IGFjY2VzcyBkZWJ1Z2ZzIHNldHVwCisgKiBpbmZvcm1hdGlvbi4KKyAqCisgKiBSZXR1cm5zOgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IHdhcyByZWFkICh0aGlzIGNvdWxkIGJlIGxlc3MKKyAqIHRoYW4gQG5ieXRlcyBpZiB0aGUgZW5kIG9mIHRoZSBmaWxlIHdhcyByZWFjaGVkKSBvciBhIG5lZ2F0aXZlIGVycm9yIHZhbHVlLgorICoqLworc3RhdGljIHNzaXplX3QKK2xwZmNfaWRpYWdfbWJ4YWNjX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBuYnl0ZXMsCisJCSAgICAgICBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGxwZmNfZGVidWcgKmRlYnVnID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBscGZjX2hiYSAqcGhiYSA9IChzdHJ1Y3QgbHBmY19oYmEgKilkZWJ1Zy0+aV9wcml2YXRlOworCWNoYXIgKnBidWZmZXI7CisJaW50IGxlbiA9IDA7CisKKwkvKiBUaGlzIGlzIGEgdXNlciByZWFkIG9wZXJhdGlvbiAqLworCWRlYnVnLT5vcCA9IExQRkNfSURJQUdfT1BfUkQ7CisKKwlpZiAoIWRlYnVnLT5idWZmZXIpCisJCWRlYnVnLT5idWZmZXIgPSBrbWFsbG9jKExQRkNfTUJYX0FDQ19CVUZfU0laRSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZWJ1Zy0+YnVmZmVyKQorCQlyZXR1cm4gMDsKKwlwYnVmZmVyID0gZGVidWctPmJ1ZmZlcjsKKworCWlmICgqcHBvcykKKwkJcmV0dXJuIDA7CisKKwlpZiAoKGlkaWFnLmNtZC5vcGNvZGUgIT0gTFBGQ19JRElBR19DTURfTUJYQUNDX0RQKSAmJgorCSAgICAoaWRpYWcuY21kLm9wY29kZSAhPSBMUEZDX0lESUFHX0JTR19NQlhBQ0NfRFApKQorCQlyZXR1cm4gMDsKKworCWxlbiA9IGxwZmNfaWRpYWdfbWJ4YWNjX2dldF9zZXR1cChwaGJhLCBwYnVmZmVyKTsKKworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIG5ieXRlcywgcHBvcywgcGJ1ZmZlciwgbGVuKTsKK30KKworLyoqCisgKiBscGZjX2lkaWFnX21ieGFjY193cml0ZSAtIFN5bnRheCBjaGVjayBhbmQgc2V0IHVwIGlkaWFnIG1ieGFjYyBjb21tYW5kcworICogQGZpbGU6IFRoZSBmaWxlIHBvaW50ZXIgdG8gcmVhZCBmcm9tLgorICogQGJ1ZjogVGhlIGJ1ZmZlciB0byBjb3B5IHRoZSB1c2VyIGRhdGEgZnJvbS4KKyAqIEBuYnl0ZXM6IFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gZ2V0LgorICogQHBwb3M6IFRoZSBwb3NpdGlvbiBpbiB0aGUgZmlsZSB0byBzdGFydCByZWFkaW5nIGZyb20uCisgKgorICogVGhpcyByb3V0aW5lIGdldCB0aGUgZGVidWdmcyBpZGlhZyBjb21tYW5kIHN0cnVjdCBmcm9tIHVzZXIgc3BhY2UgYW5kIHRoZW4KKyAqIHBlcmZvcm0gdGhlIHN5bnRheCBjaGVjayBmb3IgZHJpdmVyIG1haWxib3ggY29tbWFuZCAoZHVtcCkgYW5kIHNldHMgdXAgdGhlCisgKiBuZWNlc3Nhcnkgc3RhdGVzIGluIHRoZSBpZGlhZyBjb21tYW5kIHN0cnVjdCBhY2NvcmRpbmdseS4KKyAqCisgKiBJdCByZXR1cm5zIHRoZSBAbmJ5dGdlcyBwYXNzaW5nIGluIGZyb20gZGVidWdmcyB1c2VyIHNwYWNlIHdoZW4gc3VjY2Vzc2Z1bC4KKyAqIEluIGNhc2Ugb2YgZXJyb3IgY29uZGl0aW9ucywgaXQgcmV0dXJucyBwcm9wZXIgZXJyb3IgY29kZSBiYWNrIHRvIHRoZSB1c2VyCisgKiBzcGFjZS4KKyAqKi8KK3N0YXRpYyBzc2l6ZV90CitscGZjX2lkaWFnX21ieGFjY193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCXNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgbHBmY19kZWJ1ZyAqZGVidWcgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdWludDMyX3QgbWJ4X2R1bXBfbWFwLCBtYnhfZHVtcF9jbnQsIG1ieF93b3JkX2NudCwgbWJ4X21ib3hfY21kOworCWludCByYzsKKworCS8qIFRoaXMgaXMgYSB1c2VyIHdyaXRlIG9wZXJhdGlvbiAqLworCWRlYnVnLT5vcCA9IExQRkNfSURJQUdfT1BfV1I7CisKKwlyYyA9IGxwZmNfaWRpYWdfY21kX2dldChidWYsIG5ieXRlcywgJmlkaWFnLmNtZCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJLyogU2FuaXR5IGNoZWNrIG9uIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgKi8KKwltYnhfbWJveF9jbWQgPSBpZGlhZy5jbWQuZGF0YVtJRElBR19NQlhBQ0NfTUJDTURfSU5EWF07CisJbWJ4X2R1bXBfbWFwID0gaWRpYWcuY21kLmRhdGFbSURJQUdfTUJYQUNDX0RQTUFQX0lORFhdOworCW1ieF9kdW1wX2NudCA9IGlkaWFnLmNtZC5kYXRhW0lESUFHX01CWEFDQ19EUENOVF9JTkRYXTsKKwltYnhfd29yZF9jbnQgPSBpZGlhZy5jbWQuZGF0YVtJRElBR19NQlhBQ0NfV0RDTlRfSU5EWF07CisKKwlpZiAoaWRpYWcuY21kLm9wY29kZSA9PSBMUEZDX0lESUFHX0NNRF9NQlhBQ0NfRFApIHsKKwkJaWYgKCEobWJ4X2R1bXBfbWFwICYgTFBGQ19NQlhfRE1QX01CWF9BTEwpKQorCQkJZ290byBlcnJvcl9vdXQ7CisJCWlmICgobWJ4X2R1bXBfbWFwICYgfkxQRkNfTUJYX0RNUF9NQlhfQUxMKSAmJgorCQkgICAgKG1ieF9kdW1wX21hcCAhPSBMUEZDX01CWF9ETVBfQUxMKSkKKwkJCWdvdG8gZXJyb3Jfb3V0OworCQlpZiAobWJ4X3dvcmRfY250ID4gc2l6ZW9mKE1BSUxCT1hfdCkpCisJCQlnb3RvIGVycm9yX291dDsKKwl9IGVsc2UgaWYgKGlkaWFnLmNtZC5vcGNvZGUgPT0gTFBGQ19JRElBR19CU0dfTUJYQUNDX0RQKSB7CisJCWlmICghKG1ieF9kdW1wX21hcCAmIExQRkNfQlNHX0RNUF9NQlhfQUxMKSkKKwkJCWdvdG8gZXJyb3Jfb3V0OworCQlpZiAoKG1ieF9kdW1wX21hcCAmIH5MUEZDX0JTR19ETVBfTUJYX0FMTCkgJiYKKwkJICAgIChtYnhfZHVtcF9tYXAgIT0gTFBGQ19NQlhfRE1QX0FMTCkpCisJCQlnb3RvIGVycm9yX291dDsKKwkJaWYgKG1ieF93b3JkX2NudCA+IChCU0dfTUJPWF9TSVpFKS80KQorCQkJZ290byBlcnJvcl9vdXQ7CisJCWlmIChtYnhfbWJveF9jbWQgIT0gMHg5YikKKwkJCWdvdG8gZXJyb3Jfb3V0OworCX0gZWxzZQorCQlnb3RvIGVycm9yX291dDsKKworCWlmIChtYnhfd29yZF9jbnQgPT0gMCkKKwkJZ290byBlcnJvcl9vdXQ7CisJaWYgKHJjICE9IExQRkNfTUJYX0RNUF9BUkcpCisJCWdvdG8gZXJyb3Jfb3V0OworCWlmIChtYnhfbWJveF9jbWQgJiB+MHhmZikKKwkJZ290byBlcnJvcl9vdXQ7CisKKwkvKiBjb25kaXRpb24gZm9yIHN0b3AgbWFpbGJveCBkdW1wICovCisJaWYgKG1ieF9kdW1wX2NudCA9PSAwKQorCQlnb3RvIHJlc2V0X291dDsKKworCXJldHVybiBuYnl0ZXM7CisKK3Jlc2V0X291dDoKKwkvKiBDbGVhbiBvdXQgY29tbWFuZCBzdHJ1Y3R1cmUgb24gY29tbWFuZCBlcnJvciBvdXQgKi8KKwltZW1zZXQoJmlkaWFnLCAwLCBzaXplb2YoaWRpYWcpKTsKKwlyZXR1cm4gbmJ5dGVzOworCitlcnJvcl9vdXQ6CisJLyogQ2xlYW4gb3V0IGNvbW1hbmQgc3RydWN0dXJlIG9uIGNvbW1hbmQgZXJyb3Igb3V0ICovCisJbWVtc2V0KCZpZGlhZywgMCwgc2l6ZW9mKGlkaWFnKSk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qKgorICogbHBmY19pZGlhZ19leHRhY2NfYXZhaWxfZ2V0IC0gZ2V0IHRoZSBhdmFpbGFibGUgZXh0ZW50cyBpbmZvcm1hdGlvbgorICogQHBoYmE6IHBvaW50ZXIgdG8gbHBmYyBoYmEgZGF0YSBzdHJ1Y3R1cmUuCisgKiBAcGJ1ZmZlcjogcG9pbnRlciB0byBpbnRlcm5hbCBidWZmZXIuCisgKiBAbGVuOiBsZW5ndGggaW50byB0aGUgaW50ZXJuYWwgYnVmZmVyIGRhdGEgaGFzIGJlZW4gY29waWVkLgorICoKKyAqIERlc2NyaXB0aW9uOgorICogVGhpcyByb3V0aW5lIGlzIHRvIGdldCB0aGUgYXZhaWxhYmxlIGV4dGVudCBpbmZvcm1hdGlvbi4KKyAqCisgKiBSZXR1cm5zOgorICogb3ZlcmFsbCBsZW50aCBvZiB0aGUgZGF0YSByZWFkIGludG8gdGhlIGludGVybmFsIGJ1ZmZlci4KKyAqKi8KK3N0YXRpYyBpbnQKK2xwZmNfaWRpYWdfZXh0YWNjX2F2YWlsX2dldChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIGNoYXIgKnBidWZmZXIsIGludCBsZW4pCit7CisJdWludDE2X3QgZXh0X2NudCwgZXh0X3NpemU7CisKKwlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfRVhUX0FDQ19CVUZfU0laRS1sZW4sCisJCQkiXG5BdmFpbGFibGUgRXh0ZW50cyBJbmZvcm1hdGlvbjpcbiIpOworCisJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX0VYVF9BQ0NfQlVGX1NJWkUtbGVuLAorCQkJIlx0UG9ydCBBdmFpbGFibGUgVlBJIGV4dGVudHM6ICIpOworCWxwZmNfc2xpNF9nZXRfYXZhaWxfZXh0bnRfcnNyYyhwaGJhLCBMUEZDX1JTQ19UWVBFX0ZDT0VfVlBJLAorCQkJCSAgICAgICAmZXh0X2NudCwgJmV4dF9zaXplKTsKKwlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfRVhUX0FDQ19CVUZfU0laRS1sZW4sCisJCQkiQ291bnQgJTNkLCBTaXplICUzZFxuIiwgZXh0X2NudCwgZXh0X3NpemUpOworCisJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX0VYVF9BQ0NfQlVGX1NJWkUtbGVuLAorCQkJIlx0UG9ydCBBdmFpbGFibGUgVkZJIGV4dGVudHM6ICIpOworCWxwZmNfc2xpNF9nZXRfYXZhaWxfZXh0bnRfcnNyYyhwaGJhLCBMUEZDX1JTQ19UWVBFX0ZDT0VfVkZJLAorCQkJCSAgICAgICAmZXh0X2NudCwgJmV4dF9zaXplKTsKKwlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfRVhUX0FDQ19CVUZfU0laRS1sZW4sCisJCQkiQ291bnQgJTNkLCBTaXplICUzZFxuIiwgZXh0X2NudCwgZXh0X3NpemUpOworCisJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX0VYVF9BQ0NfQlVGX1NJWkUtbGVuLAorCQkJIlx0UG9ydCBBdmFpbGFibGUgUlBJIGV4dGVudHM6ICIpOworCWxwZmNfc2xpNF9nZXRfYXZhaWxfZXh0bnRfcnNyYyhwaGJhLCBMUEZDX1JTQ19UWVBFX0ZDT0VfUlBJLAorCQkJCSAgICAgICAmZXh0X2NudCwgJmV4dF9zaXplKTsKKwlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfRVhUX0FDQ19CVUZfU0laRS1sZW4sCisJCQkiQ291bnQgJTNkLCBTaXplICUzZFxuIiwgZXh0X2NudCwgZXh0X3NpemUpOworCisJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX0VYVF9BQ0NfQlVGX1NJWkUtbGVuLAorCQkJIlx0UG9ydCBBdmFpbGFibGUgWFJJIGV4dGVudHM6ICIpOworCWxwZmNfc2xpNF9nZXRfYXZhaWxfZXh0bnRfcnNyYyhwaGJhLCBMUEZDX1JTQ19UWVBFX0ZDT0VfWFJJLAorCQkJCSAgICAgICAmZXh0X2NudCwgJmV4dF9zaXplKTsKKwlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfRVhUX0FDQ19CVUZfU0laRS1sZW4sCisJCQkiQ291bnQgJTNkLCBTaXplICUzZFxuIiwgZXh0X2NudCwgZXh0X3NpemUpOworCisJcmV0dXJuIGxlbjsKK30KKworLyoqCisgKiBscGZjX2lkaWFnX2V4dGFjY19hbGxvY19nZXQgLSBnZXQgdGhlIGFsbG9jYXRlZCBleHRlbnRzIGluZm9ybWF0aW9uCisgKiBAcGhiYTogcG9pbnRlciB0byBscGZjIGhiYSBkYXRhIHN0cnVjdHVyZS4KKyAqIEBwYnVmZmVyOiBwb2ludGVyIHRvIGludGVybmFsIGJ1ZmZlci4KKyAqIEBsZW46IGxlbmd0aCBpbnRvIHRoZSBpbnRlcm5hbCBidWZmZXIgZGF0YSBoYXMgYmVlbiBjb3BpZWQuCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIHJvdXRpbmUgaXMgdG8gZ2V0IHRoZSBhbGxvY2F0ZWQgZXh0ZW50IGluZm9ybWF0aW9uLgorICoKKyAqIFJldHVybnM6CisgKiBvdmVyYWxsIGxlbnRoIG9mIHRoZSBkYXRhIHJlYWQgaW50byB0aGUgaW50ZXJuYWwgYnVmZmVyLgorICoqLworc3RhdGljIGludAorbHBmY19pZGlhZ19leHRhY2NfYWxsb2NfZ2V0KHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgY2hhciAqcGJ1ZmZlciwgaW50IGxlbikKK3sKKwl1aW50MTZfdCBleHRfY250LCBleHRfc2l6ZTsKKwlpbnQgcmM7CisKKwlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfRVhUX0FDQ19CVUZfU0laRS1sZW4sCisJCQkiXG5BbGxvY2F0ZWQgRXh0ZW50cyBJbmZvcm1hdGlvbjpcbiIpOworCisJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX0VYVF9BQ0NfQlVGX1NJWkUtbGVuLAorCQkJIlx0SG9zdCBBbGxvY2F0ZWQgVlBJIGV4dGVudHM6ICIpOworCXJjID0gbHBmY19zbGk0X2dldF9hbGxvY2F0ZWRfZXh0bnRzKHBoYmEsIExQRkNfUlNDX1RZUEVfRkNPRV9WUEksCisJCQkJCSAgICAmZXh0X2NudCwgJmV4dF9zaXplKTsKKwlpZiAoIXJjKQorCQlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfRVhUX0FDQ19CVUZfU0laRS1sZW4sCisJCQkJIlBvcnQgJWQgRXh0ZW50ICUzZCwgU2l6ZSAlM2RcbiIsCisJCQkJcGhiYS0+YnJkX25vLCBleHRfY250LCBleHRfc2l6ZSk7CisJZWxzZQorCQlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfRVhUX0FDQ19CVUZfU0laRS1sZW4sCisJCQkJIk4vQVxuIik7CisKKwlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfRVhUX0FDQ19CVUZfU0laRS1sZW4sCisJCQkiXHRIb3N0IEFsbG9jYXRlZCBWRkkgZXh0ZW50czogIik7CisJcmMgPSBscGZjX3NsaTRfZ2V0X2FsbG9jYXRlZF9leHRudHMocGhiYSwgTFBGQ19SU0NfVFlQRV9GQ09FX1ZGSSwKKwkJCQkJICAgICZleHRfY250LCAmZXh0X3NpemUpOworCWlmICghcmMpCisJCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwgTFBGQ19FWFRfQUNDX0JVRl9TSVpFLWxlbiwKKwkJCQkiUG9ydCAlZCBFeHRlbnQgJTNkLCBTaXplICUzZFxuIiwKKwkJCQlwaGJhLT5icmRfbm8sIGV4dF9jbnQsIGV4dF9zaXplKTsKKwllbHNlCisJCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwgTFBGQ19FWFRfQUNDX0JVRl9TSVpFLWxlbiwKKwkJCQkiTi9BXG4iKTsKKworCWxlbiArPSBzbnByaW50ZihwYnVmZmVyK2xlbiwgTFBGQ19FWFRfQUNDX0JVRl9TSVpFLWxlbiwKKwkJCSJcdEhvc3QgQWxsb2NhdGVkIFJQSSBleHRlbnRzOiAiKTsKKwlyYyA9IGxwZmNfc2xpNF9nZXRfYWxsb2NhdGVkX2V4dG50cyhwaGJhLCBMUEZDX1JTQ19UWVBFX0ZDT0VfUlBJLAorCQkJCQkgICAgJmV4dF9jbnQsICZleHRfc2l6ZSk7CisJaWYgKCFyYykKKwkJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX0VYVF9BQ0NfQlVGX1NJWkUtbGVuLAorCQkJCSJQb3J0ICVkIEV4dGVudCAlM2QsIFNpemUgJTNkXG4iLAorCQkJCXBoYmEtPmJyZF9ubywgZXh0X2NudCwgZXh0X3NpemUpOworCWVsc2UKKwkJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX0VYVF9BQ0NfQlVGX1NJWkUtbGVuLAorCQkJCSJOL0FcbiIpOworCisJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX0VYVF9BQ0NfQlVGX1NJWkUtbGVuLAorCQkJIlx0SG9zdCBBbGxvY2F0ZWQgWFJJIGV4dGVudHM6ICIpOworCXJjID0gbHBmY19zbGk0X2dldF9hbGxvY2F0ZWRfZXh0bnRzKHBoYmEsIExQRkNfUlNDX1RZUEVfRkNPRV9YUkksCisJCQkJCSAgICAmZXh0X2NudCwgJmV4dF9zaXplKTsKKwlpZiAoIXJjKQorCQlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfRVhUX0FDQ19CVUZfU0laRS1sZW4sCisJCQkJIlBvcnQgJWQgRXh0ZW50ICUzZCwgU2l6ZSAlM2RcbiIsCisJCQkJcGhiYS0+YnJkX25vLCBleHRfY250LCBleHRfc2l6ZSk7CisJZWxzZQorCQlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfRVhUX0FDQ19CVUZfU0laRS1sZW4sCisJCQkJIk4vQVxuIik7CisKKwlyZXR1cm4gbGVuOworfQorCisvKioKKyAqIGxwZmNfaWRpYWdfZXh0YWNjX2RyaXZyX2dldCAtIGdldCBkcml2ZXIgZXh0ZW50IGluZm9ybWF0aW9uCisgKiBAcGhiYTogcG9pbnRlciB0byBscGZjIGhiYSBkYXRhIHN0cnVjdHVyZS4KKyAqIEBwYnVmZmVyOiBwb2ludGVyIHRvIGludGVybmFsIGJ1ZmZlci4KKyAqIEBsZW46IGxlbmd0aCBpbnRvIHRoZSBpbnRlcm5hbCBidWZmZXIgZGF0YSBoYXMgYmVlbiBjb3BpZWQuCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIHJvdXRpbmUgaXMgdG8gZ2V0IHRoZSBkcml2ZXIgZXh0ZW50IGluZm9ybWF0aW9uLgorICoKKyAqIFJldHVybnM6CisgKiBvdmVyYWxsIGxlbnRoIG9mIHRoZSBkYXRhIHJlYWQgaW50byB0aGUgaW50ZXJuYWwgYnVmZmVyLgorICoqLworc3RhdGljIGludAorbHBmY19pZGlhZ19leHRhY2NfZHJpdnJfZ2V0KHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgY2hhciAqcGJ1ZmZlciwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgbHBmY19yc3JjX2Jsa3MgKnJzcmNfYmxrczsKKwlpbnQgaW5kZXg7CisKKwlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfRVhUX0FDQ19CVUZfU0laRS1sZW4sCisJCQkiXG5Ecml2ZXIgRXh0ZW50cyBJbmZvcm1hdGlvbjpcbiIpOworCisJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX0VYVF9BQ0NfQlVGX1NJWkUtbGVuLAorCQkJIlx0VlBJIGV4dGVudHM6XG4iKTsKKwlpbmRleCA9IDA7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyc3JjX2Jsa3MsICZwaGJhLT5scGZjX3ZwaV9ibGtfbGlzdCwgbGlzdCkgeworCQlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfRVhUX0FDQ19CVUZfU0laRS1sZW4sCisJCQkJIlx0XHRCbG9jayAlM2Q6IFN0YXJ0ICU0ZCwgQ291bnQgJTRkXG4iLAorCQkJCWluZGV4LCByc3JjX2Jsa3MtPnJzcmNfc3RhcnQsCisJCQkJcnNyY19ibGtzLT5yc3JjX3NpemUpOworCQlpbmRleCsrOworCX0KKwlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfRVhUX0FDQ19CVUZfU0laRS1sZW4sCisJCQkiXHRWRkkgZXh0ZW50czpcbiIpOworCWluZGV4ID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJzcmNfYmxrcywgJnBoYmEtPnNsaTRfaGJhLmxwZmNfdmZpX2Jsa19saXN0LAorCQkJICAgIGxpc3QpIHsKKwkJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX0VYVF9BQ0NfQlVGX1NJWkUtbGVuLAorCQkJCSJcdFx0QmxvY2sgJTNkOiBTdGFydCAlNGQsIENvdW50ICU0ZFxuIiwKKwkJCQlpbmRleCwgcnNyY19ibGtzLT5yc3JjX3N0YXJ0LAorCQkJCXJzcmNfYmxrcy0+cnNyY19zaXplKTsKKwkJaW5kZXgrKzsKKwl9CisKKwlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfRVhUX0FDQ19CVUZfU0laRS1sZW4sCisJCQkiXHRSUEkgZXh0ZW50czpcbiIpOworCWluZGV4ID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJzcmNfYmxrcywgJnBoYmEtPnNsaTRfaGJhLmxwZmNfcnBpX2Jsa19saXN0LAorCQkJICAgIGxpc3QpIHsKKwkJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX0VYVF9BQ0NfQlVGX1NJWkUtbGVuLAorCQkJCSJcdFx0QmxvY2sgJTNkOiBTdGFydCAlNGQsIENvdW50ICU0ZFxuIiwKKwkJCQlpbmRleCwgcnNyY19ibGtzLT5yc3JjX3N0YXJ0LAorCQkJCXJzcmNfYmxrcy0+cnNyY19zaXplKTsKKwkJaW5kZXgrKzsKKwl9CisKKwlsZW4gKz0gc25wcmludGYocGJ1ZmZlcitsZW4sIExQRkNfRVhUX0FDQ19CVUZfU0laRS1sZW4sCisJCQkiXHRYUkkgZXh0ZW50czpcbiIpOworCWluZGV4ID0gMDsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHJzcmNfYmxrcywgJnBoYmEtPnNsaTRfaGJhLmxwZmNfeHJpX2Jsa19saXN0LAorCQkJICAgIGxpc3QpIHsKKwkJbGVuICs9IHNucHJpbnRmKHBidWZmZXIrbGVuLCBMUEZDX0VYVF9BQ0NfQlVGX1NJWkUtbGVuLAorCQkJCSJcdFx0QmxvY2sgJTNkOiBTdGFydCAlNGQsIENvdW50ICU0ZFxuIiwKKwkJCQlpbmRleCwgcnNyY19ibGtzLT5yc3JjX3N0YXJ0LAorCQkJCXJzcmNfYmxrcy0+cnNyY19zaXplKTsKKwkJaW5kZXgrKzsKKwl9CisKKwlyZXR1cm4gbGVuOworfQorCisvKioKKyAqIGxwZmNfaWRpYWdfZXh0YWNjX3dyaXRlIC0gU3ludGF4IGNoZWNrIGFuZCBzZXQgdXAgaWRpYWcgZXh0YWNjIGNvbW1hbmRzCisgKiBAZmlsZTogVGhlIGZpbGUgcG9pbnRlciB0byByZWFkIGZyb20uCisgKiBAYnVmOiBUaGUgYnVmZmVyIHRvIGNvcHkgdGhlIHVzZXIgZGF0YSBmcm9tLgorICogQG5ieXRlczogVGhlIG51bWJlciBvZiBieXRlcyB0byBnZXQuCisgKiBAcHBvczogVGhlIHBvc2l0aW9uIGluIHRoZSBmaWxlIHRvIHN0YXJ0IHJlYWRpbmcgZnJvbS4KKyAqCisgKiBUaGlzIHJvdXRpbmUgZ2V0IHRoZSBkZWJ1Z2ZzIGlkaWFnIGNvbW1hbmQgc3RydWN0IGZyb20gdXNlciBzcGFjZSBhbmQgdGhlbgorICogcGVyZm9ybSB0aGUgc3ludGF4IGNoZWNrIGZvciBleHRlbnQgaW5mb3JtYXRpb24gYWNjZXNzIGNvbW1hbmRzIGFuZCBzZXRzCisgKiB1cCB0aGUgbmVjZXNzYXJ5IHN0YXRlcyBpbiB0aGUgaWRpYWcgY29tbWFuZCBzdHJ1Y3QgYWNjb3JkaW5nbHkuCisgKgorICogSXQgcmV0dXJucyB0aGUgQG5ieXRnZXMgcGFzc2luZyBpbiBmcm9tIGRlYnVnZnMgdXNlciBzcGFjZSB3aGVuIHN1Y2Nlc3NmdWwuCisgKiBJbiBjYXNlIG9mIGVycm9yIGNvbmRpdGlvbnMsIGl0IHJldHVybnMgcHJvcGVyIGVycm9yIGNvZGUgYmFjayB0byB0aGUgdXNlcgorICogc3BhY2UuCisgKiovCitzdGF0aWMgc3NpemVfdAorbHBmY19pZGlhZ19leHRhY2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQlzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGxwZmNfZGVidWcgKmRlYnVnID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVpbnQzMl90IGV4dF9tYXA7CisJaW50IHJjOworCisJLyogVGhpcyBpcyBhIHVzZXIgd3JpdGUgb3BlcmF0aW9uICovCisJZGVidWctPm9wID0gTFBGQ19JRElBR19PUF9XUjsKKworCXJjID0gbHBmY19pZGlhZ19jbWRfZ2V0KGJ1ZiwgbmJ5dGVzLCAmaWRpYWcuY21kKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlleHRfbWFwID0gaWRpYWcuY21kLmRhdGFbSURJQUdfRVhUQUNDX0VYTUFQX0lORFhdOworCisJaWYgKGlkaWFnLmNtZC5vcGNvZGUgIT0gTFBGQ19JRElBR19DTURfRVhUQUNDX1JEKQorCQlnb3RvIGVycm9yX291dDsKKwlpZiAocmMgIT0gTFBGQ19FWFRfQUNDX0NNRF9BUkcpCisJCWdvdG8gZXJyb3Jfb3V0OworCWlmICghKGV4dF9tYXAgJiBMUEZDX0VYVF9BQ0NfQUxMKSkKKwkJZ290byBlcnJvcl9vdXQ7CisKKwlyZXR1cm4gbmJ5dGVzOworZXJyb3Jfb3V0OgorCS8qIENsZWFuIG91dCBjb21tYW5kIHN0cnVjdHVyZSBvbiBjb21tYW5kIGVycm9yIG91dCAqLworCW1lbXNldCgmaWRpYWcsIDAsIHNpemVvZihpZGlhZykpOworCXJldHVybiAtRUlOVkFMOworfQorCisvKioKKyAqIGxwZmNfaWRpYWdfZXh0YWNjX3JlYWQgLSBpZGlhZyBkZWJ1Z2ZzIHJlYWQgYWNjZXNzIHRvIGV4dGVudCBpbmZvcm1hdGlvbgorICogQGZpbGU6IFRoZSBmaWxlIHBvaW50ZXIgdG8gcmVhZCBmcm9tLgorICogQGJ1ZjogVGhlIGJ1ZmZlciB0byBjb3B5IHRoZSBkYXRhIHRvLgorICogQG5ieXRlczogVGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLgorICogQHBwb3M6IFRoZSBwb3NpdGlvbiBpbiB0aGUgZmlsZSB0byBzdGFydCByZWFkaW5nIGZyb20uCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIHJvdXRpbmUgcmVhZHMgZGF0YSBmcm9tIHRoZSBwcm9wZXIgZXh0ZW50IGluZm9ybWF0aW9uIGFjY29yZGluZyB0bworICogdGhlIGlkaWFnIGNvbW1hbmQsIGFuZCBjb3BpZXMgdG8gdXNlciBAYnVmLgorICoKKyAqIFJldHVybnM6CisgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgd2FzIHJlYWQgKHRoaXMgY291bGQgYmUgbGVzcworICogdGhhbiBAbmJ5dGVzIGlmIHRoZSBlbmQgb2YgdGhlIGZpbGUgd2FzIHJlYWNoZWQpIG9yIGEgbmVnYXRpdmUgZXJyb3IgdmFsdWUuCisgKiovCitzdGF0aWMgc3NpemVfdAorbHBmY19pZGlhZ19leHRhY2NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IG5ieXRlcywKKwkJICAgICAgIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgbHBmY19kZWJ1ZyAqZGVidWcgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGxwZmNfaGJhICpwaGJhID0gKHN0cnVjdCBscGZjX2hiYSAqKWRlYnVnLT5pX3ByaXZhdGU7CisJY2hhciAqcGJ1ZmZlcjsKKwl1aW50MzJfdCBleHRfbWFwOworCWludCBsZW4gPSAwOworCisJLyogVGhpcyBpcyBhIHVzZXIgcmVhZCBvcGVyYXRpb24gKi8KKwlkZWJ1Zy0+b3AgPSBMUEZDX0lESUFHX09QX1JEOworCisJaWYgKCFkZWJ1Zy0+YnVmZmVyKQorCQlkZWJ1Zy0+YnVmZmVyID0ga21hbGxvYyhMUEZDX0VYVF9BQ0NfQlVGX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghZGVidWctPmJ1ZmZlcikKKwkJcmV0dXJuIDA7CisJcGJ1ZmZlciA9IGRlYnVnLT5idWZmZXI7CisJaWYgKCpwcG9zKQorCQlyZXR1cm4gMDsKKwlpZiAoaWRpYWcuY21kLm9wY29kZSAhPSBMUEZDX0lESUFHX0NNRF9FWFRBQ0NfUkQpCisJCXJldHVybiAwOworCisJZXh0X21hcCA9IGlkaWFnLmNtZC5kYXRhW0lESUFHX0VYVEFDQ19FWE1BUF9JTkRYXTsKKwlpZiAoZXh0X21hcCAmIExQRkNfRVhUX0FDQ19BVkFJTCkKKwkJbGVuID0gbHBmY19pZGlhZ19leHRhY2NfYXZhaWxfZ2V0KHBoYmEsIHBidWZmZXIsIGxlbik7CisJaWYgKGV4dF9tYXAgJiBMUEZDX0VYVF9BQ0NfQUxMT0MpCisJCWxlbiA9IGxwZmNfaWRpYWdfZXh0YWNjX2FsbG9jX2dldChwaGJhLCBwYnVmZmVyLCBsZW4pOworCWlmIChleHRfbWFwICYgTFBGQ19FWFRfQUNDX0RSSVZSKQorCQlsZW4gPSBscGZjX2lkaWFnX2V4dGFjY19kcml2cl9nZXQocGhiYSwgcGJ1ZmZlciwgbGVuKTsKKworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIG5ieXRlcywgcHBvcywgcGJ1ZmZlciwgbGVuKTsKK30KKwogI3VuZGVmIGxwZmNfZGVidWdmc19vcF9kaXNjX3RyYwogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbHBmY19kZWJ1Z2ZzX29wX2Rpc2NfdHJjID0gewogCS5vd25lciA9ICAgICAgICBUSElTX01PRFVMRSwKQEAgLTI0MjAsNiArMzQwNSwxNiBAQAogCS5yZWxlYXNlID0gICAgICBscGZjX2lkaWFnX2NtZF9yZWxlYXNlLAogfTsKIAorI3VuZGVmIGxwZmNfaWRpYWdfb3BfYmFyQWNjCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBscGZjX2lkaWFnX29wX2JhckFjYyA9IHsKKwkub3duZXIgPSAgICAgICAgVEhJU19NT0RVTEUsCisJLm9wZW4gPSAgICAgICAgIGxwZmNfaWRpYWdfb3BlbiwKKwkubGxzZWVrID0gICAgICAgbHBmY19kZWJ1Z2ZzX2xzZWVrLAorCS5yZWFkID0gICAgICAgICBscGZjX2lkaWFnX2JhcmFjY19yZWFkLAorCS53cml0ZSA9ICAgICAgICBscGZjX2lkaWFnX2JhcmFjY193cml0ZSwKKwkucmVsZWFzZSA9ICAgICAgbHBmY19pZGlhZ19jbWRfcmVsZWFzZSwKK307CisKICN1bmRlZiBscGZjX2lkaWFnX29wX3F1ZUluZm8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxwZmNfaWRpYWdfb3BfcXVlSW5mbyA9IHsKIAkub3duZXIgPSAgICAgICAgVEhJU19NT0RVTEUsCkBAIC0yNDI4LDcgKzM0MjMsNyBAQAogCS5yZWxlYXNlID0gICAgICBscGZjX2lkaWFnX3JlbGVhc2UsCiB9OwogCi0jdW5kZWYgbHBmY19pZGlhZ19vcF9xdWVhY2MKKyN1bmRlZiBscGZjX2lkaWFnX29wX3F1ZUFjYwogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbHBmY19pZGlhZ19vcF9xdWVBY2MgPSB7CiAJLm93bmVyID0gICAgICAgIFRISVNfTU9EVUxFLAogCS5vcGVuID0gICAgICAgICBscGZjX2lkaWFnX29wZW4sCkBAIC0yNDM4LDcgKzM0MzMsNyBAQAogCS5yZWxlYXNlID0gICAgICBscGZjX2lkaWFnX2NtZF9yZWxlYXNlLAogfTsKIAotI3VuZGVmIGxwZmNfaWRpYWdfb3BfZHJiYWNjCisjdW5kZWYgbHBmY19pZGlhZ19vcF9kcmJBY2MKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxwZmNfaWRpYWdfb3BfZHJiQWNjID0gewogCS5vd25lciA9ICAgICAgICBUSElTX01PRFVMRSwKIAkub3BlbiA9ICAgICAgICAgbHBmY19pZGlhZ19vcGVuLApAQCAtMjQ0OCw4ICszNDQzLDIzNCBAQAogCS5yZWxlYXNlID0gICAgICBscGZjX2lkaWFnX2NtZF9yZWxlYXNlLAogfTsKIAorI3VuZGVmIGxwZmNfaWRpYWdfb3BfY3RsQWNjCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBscGZjX2lkaWFnX29wX2N0bEFjYyA9IHsKKwkub3duZXIgPSAgICAgICAgVEhJU19NT0RVTEUsCisJLm9wZW4gPSAgICAgICAgIGxwZmNfaWRpYWdfb3BlbiwKKwkubGxzZWVrID0gICAgICAgbHBmY19kZWJ1Z2ZzX2xzZWVrLAorCS5yZWFkID0gICAgICAgICBscGZjX2lkaWFnX2N0bGFjY19yZWFkLAorCS53cml0ZSA9ICAgICAgICBscGZjX2lkaWFnX2N0bGFjY193cml0ZSwKKwkucmVsZWFzZSA9ICAgICAgbHBmY19pZGlhZ19jbWRfcmVsZWFzZSwKK307CisKKyN1bmRlZiBscGZjX2lkaWFnX29wX21ieEFjYworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbHBmY19pZGlhZ19vcF9tYnhBY2MgPSB7CisJLm93bmVyID0gICAgICAgIFRISVNfTU9EVUxFLAorCS5vcGVuID0gICAgICAgICBscGZjX2lkaWFnX29wZW4sCisJLmxsc2VlayA9ICAgICAgIGxwZmNfZGVidWdmc19sc2VlaywKKwkucmVhZCA9ICAgICAgICAgbHBmY19pZGlhZ19tYnhhY2NfcmVhZCwKKwkud3JpdGUgPSAgICAgICAgbHBmY19pZGlhZ19tYnhhY2Nfd3JpdGUsCisJLnJlbGVhc2UgPSAgICAgIGxwZmNfaWRpYWdfY21kX3JlbGVhc2UsCit9OworCisjdW5kZWYgbHBmY19pZGlhZ19vcF9leHRBY2MKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGxwZmNfaWRpYWdfb3BfZXh0QWNjID0geworCS5vd25lciA9ICAgICAgICBUSElTX01PRFVMRSwKKwkub3BlbiA9ICAgICAgICAgbHBmY19pZGlhZ19vcGVuLAorCS5sbHNlZWsgPSAgICAgICBscGZjX2RlYnVnZnNfbHNlZWssCisJLnJlYWQgPSAgICAgICAgIGxwZmNfaWRpYWdfZXh0YWNjX3JlYWQsCisJLndyaXRlID0gICAgICAgIGxwZmNfaWRpYWdfZXh0YWNjX3dyaXRlLAorCS5yZWxlYXNlID0gICAgICBscGZjX2lkaWFnX2NtZF9yZWxlYXNlLAorfTsKKwogI2VuZGlmCiAKKy8qIGxwZmNfaWRpYWdfbWJ4YWNjX2R1bXBfYnNnX21ib3ggLSBpZGlhZyBkZWJ1Z2ZzIGR1bXAgYnNnIG1haWxib3ggY29tbWFuZAorICogQHBoYmE6IFBvaW50ZXIgdG8gSEJBIGNvbnRleHQgb2JqZWN0LgorICogQGRtYWJ1ZjogUG9pbnRlciB0byBhIERNQSBidWZmZXIgZGVzY3JpcHRvci4KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIFRoaXMgcm91dGluZSBkdW1wIGEgYnNnIHBhc3MtdGhyb3VnaCBub24tZW1iZWRkZWQgbWFpbGJveCBjb21tYW5kIHdpdGgKKyAqIGV4dGVybmFsIGJ1ZmZlci4KKyAqKi8KK3ZvaWQKK2xwZmNfaWRpYWdfbWJ4YWNjX2R1bXBfYnNnX21ib3goc3RydWN0IGxwZmNfaGJhICpwaGJhLCBlbnVtIG5lbWJfdHlwZSBuZW1iX3RwLAorCQkJCWVudW0gbWJveF90eXBlIG1ib3hfdHAsIGVudW0gZG1hX3R5cGUgZG1hX3RwLAorCQkJCWVudW0gc3RhX3R5cGUgc3RhX3RwLAorCQkJCXN0cnVjdCBscGZjX2RtYWJ1ZiAqZG1hYnVmLCB1aW50MzJfdCBleHRfYnVmKQoreworI2lmZGVmIENPTkZJR19TQ1NJX0xQRkNfREVCVUdfRlMKKwl1aW50MzJfdCAqbWJ4X21ib3hfY21kLCAqbWJ4X2R1bXBfbWFwLCAqbWJ4X2R1bXBfY250LCAqbWJ4X3dvcmRfY250OworCWNoYXIgbGluZV9idWZbTFBGQ19NQlhfQUNDX0xCVUZfU1pdOworCWludCBsZW4gPSAwOworCXVpbnQzMl90IGRvX2R1bXAgPSAwOworCXVpbnQzMl90ICpwd29yZDsKKwl1aW50MzJfdCBpOworCisJaWYgKGlkaWFnLmNtZC5vcGNvZGUgIT0gTFBGQ19JRElBR19CU0dfTUJYQUNDX0RQKQorCQlyZXR1cm47CisKKwltYnhfbWJveF9jbWQgPSAmaWRpYWcuY21kLmRhdGFbSURJQUdfTUJYQUNDX01CQ01EX0lORFhdOworCW1ieF9kdW1wX21hcCA9ICZpZGlhZy5jbWQuZGF0YVtJRElBR19NQlhBQ0NfRFBNQVBfSU5EWF07CisJbWJ4X2R1bXBfY250ID0gJmlkaWFnLmNtZC5kYXRhW0lESUFHX01CWEFDQ19EUENOVF9JTkRYXTsKKwltYnhfd29yZF9jbnQgPSAmaWRpYWcuY21kLmRhdGFbSURJQUdfTUJYQUNDX1dEQ05UX0lORFhdOworCisJaWYgKCEoKm1ieF9kdW1wX21hcCAmIExQRkNfTUJYX0RNUF9BTEwpIHx8CisJICAgICgqbWJ4X2R1bXBfY250ID09IDApIHx8CisJICAgICgqbWJ4X3dvcmRfY250ID09IDApKQorCQlyZXR1cm47CisKKwlpZiAoKm1ieF9tYm94X2NtZCAhPSAweDlCKQorCQlyZXR1cm47CisKKwlpZiAoKG1ib3hfdHAgPT0gbWJveF9yZCkgJiYgKGRtYV90cCA9PSBkbWFfbWJveCkpIHsKKwkJaWYgKCptYnhfZHVtcF9tYXAgJiBMUEZDX0JTR19ETVBfTUJYX1JEX01CWCkgeworCQkJZG9fZHVtcCB8PSBMUEZDX0JTR19ETVBfTUJYX1JEX01CWDsKKwkJCXByaW50ayhLRVJOX0VSUiAiXG5SZWFkIG1ib3ggY29tbWFuZCAoeCV4KSwgIgorCQkJICAgICAgICJuZW1iOjB4JXgsIGV4dGJ1Zl9jbnQ6JWQ6XG4iLAorCQkJICAgICAgIHN0YV90cCwgbmVtYl90cCwgZXh0X2J1Zik7CisJCX0KKwl9CisJaWYgKChtYm94X3RwID09IG1ib3hfcmQpICYmIChkbWFfdHAgPT0gZG1hX2VidWYpKSB7CisJCWlmICgqbWJ4X2R1bXBfbWFwICYgTFBGQ19CU0dfRE1QX01CWF9SRF9CVUYpIHsKKwkJCWRvX2R1bXAgfD0gTFBGQ19CU0dfRE1QX01CWF9SRF9CVUY7CisJCQlwcmludGsoS0VSTl9FUlIgIlxuUmVhZCBtYm94IGJ1ZmZlciAoeCV4KSwgIgorCQkJICAgICAgICJuZW1iOjB4JXgsIGV4dGJ1Zl9zZXE6JWQ6XG4iLAorCQkJICAgICAgIHN0YV90cCwgbmVtYl90cCwgZXh0X2J1Zik7CisJCX0KKwl9CisJaWYgKChtYm94X3RwID09IG1ib3hfd3IpICYmIChkbWFfdHAgPT0gZG1hX21ib3gpKSB7CisJCWlmICgqbWJ4X2R1bXBfbWFwICYgTFBGQ19CU0dfRE1QX01CWF9XUl9NQlgpIHsKKwkJCWRvX2R1bXAgfD0gTFBGQ19CU0dfRE1QX01CWF9XUl9NQlg7CisJCQlwcmludGsoS0VSTl9FUlIgIlxuV3JpdGUgbWJveCBjb21tYW5kICh4JXgpLCAiCisJCQkgICAgICAgIm5lbWI6MHgleCwgZXh0YnVmX2NudDolZDpcbiIsCisJCQkgICAgICAgc3RhX3RwLCBuZW1iX3RwLCBleHRfYnVmKTsKKwkJfQorCX0KKwlpZiAoKG1ib3hfdHAgPT0gbWJveF93cikgJiYgKGRtYV90cCA9PSBkbWFfZWJ1ZikpIHsKKwkJaWYgKCptYnhfZHVtcF9tYXAgJiBMUEZDX0JTR19ETVBfTUJYX1dSX0JVRikgeworCQkJZG9fZHVtcCB8PSBMUEZDX0JTR19ETVBfTUJYX1dSX0JVRjsKKwkJCXByaW50ayhLRVJOX0VSUiAiXG5Xcml0ZSBtYm94IGJ1ZmZlciAoeCV4KSwgIgorCQkJICAgICAgICJuZW1iOjB4JXgsIGV4dGJ1Zl9zZXE6JWQ6XG4iLAorCQkJICAgICAgIHN0YV90cCwgbmVtYl90cCwgZXh0X2J1Zik7CisJCX0KKwl9CisKKwkvKiBkdW1wIGJ1ZmZlciBjb250ZW50ICovCisJaWYgKGRvX2R1bXApIHsKKwkJcHdvcmQgPSAodWludDMyX3QgKilkbWFidWYtPnZpcnQ7CisJCWZvciAoaSA9IDA7IGkgPCAqbWJ4X3dvcmRfY250OyBpKyspIHsKKwkJCWlmICghKGkgJSA4KSkgeworCQkJCWlmIChpICE9IDApCisJCQkJCXByaW50ayhLRVJOX0VSUiAiJXNcbiIsIGxpbmVfYnVmKTsKKwkJCQlsZW4gPSAwOworCQkJCWxlbiArPSBzbnByaW50ZihsaW5lX2J1ZitsZW4sCisJCQkJCQlMUEZDX01CWF9BQ0NfTEJVRl9TWi1sZW4sCisJCQkJCQkiJTAzZDogIiwgaSk7CisJCQl9CisJCQlsZW4gKz0gc25wcmludGYobGluZV9idWYrbGVuLCBMUEZDX01CWF9BQ0NfTEJVRl9TWi1sZW4sCisJCQkJCSIlMDh4ICIsICh1aW50MzJfdCkqcHdvcmQpOworCQkJcHdvcmQrKzsKKwkJfQorCQlpZiAoKGkgLSAxKSAlIDgpCisJCQlwcmludGsoS0VSTl9FUlIgIiVzXG4iLCBsaW5lX2J1Zik7CisJCSgqbWJ4X2R1bXBfY250KS0tOworCX0KKworCS8qIENsZWFuIG91dCBjb21tYW5kIHN0cnVjdHVyZSBvbiByZWFjaGluZyBkdW1wIGNvdW50ICovCisJaWYgKCptYnhfZHVtcF9jbnQgPT0gMCkKKwkJbWVtc2V0KCZpZGlhZywgMCwgc2l6ZW9mKGlkaWFnKSk7CisJcmV0dXJuOworI2VuZGlmCit9CisKKy8qIGxwZmNfaWRpYWdfbWJ4YWNjX2R1bXBfaXNzdWVfbWJveCAtIGlkaWFnIGRlYnVnZnMgZHVtcCBpc3N1ZSBtYWlsYm94IGNvbW1hbmQKKyAqIEBwaGJhOiBQb2ludGVyIHRvIEhCQSBjb250ZXh0IG9iamVjdC4KKyAqIEBkbWFidWY6IFBvaW50ZXIgdG8gYSBETUEgYnVmZmVyIGRlc2NyaXB0b3IuCisgKgorICogRGVzY3JpcHRpb246CisgKiBUaGlzIHJvdXRpbmUgZHVtcCBhIHBhc3MtdGhyb3VnaCBub24tZW1iZWRkZWQgbWFpbGJveCBjb21tYW5kIGZyb20gaXNzdWUKKyAqIG1haWxib3ggY29tbWFuZC4KKyAqKi8KK3ZvaWQKK2xwZmNfaWRpYWdfbWJ4YWNjX2R1bXBfaXNzdWVfbWJveChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIE1BSUxCT1hfdCAqcG1ib3gpCit7CisjaWZkZWYgQ09ORklHX1NDU0lfTFBGQ19ERUJVR19GUworCXVpbnQzMl90ICptYnhfZHVtcF9tYXAsICptYnhfZHVtcF9jbnQsICptYnhfd29yZF9jbnQsICptYnhfbWJveF9jbWQ7CisJY2hhciBsaW5lX2J1ZltMUEZDX01CWF9BQ0NfTEJVRl9TWl07CisJaW50IGxlbiA9IDA7CisJdWludDMyX3QgKnB3b3JkOworCXVpbnQ4X3QgKnBieXRlOworCXVpbnQzMl90IGksIGo7CisKKwlpZiAoaWRpYWcuY21kLm9wY29kZSAhPSBMUEZDX0lESUFHX0NNRF9NQlhBQ0NfRFApCisJCXJldHVybjsKKworCW1ieF9tYm94X2NtZCA9ICZpZGlhZy5jbWQuZGF0YVtJRElBR19NQlhBQ0NfTUJDTURfSU5EWF07CisJbWJ4X2R1bXBfbWFwID0gJmlkaWFnLmNtZC5kYXRhW0lESUFHX01CWEFDQ19EUE1BUF9JTkRYXTsKKwltYnhfZHVtcF9jbnQgPSAmaWRpYWcuY21kLmRhdGFbSURJQUdfTUJYQUNDX0RQQ05UX0lORFhdOworCW1ieF93b3JkX2NudCA9ICZpZGlhZy5jbWQuZGF0YVtJRElBR19NQlhBQ0NfV0RDTlRfSU5EWF07CisKKwlpZiAoISgqbWJ4X2R1bXBfbWFwICYgTFBGQ19NQlhfRE1QX01CWF9BTEwpIHx8CisJICAgICgqbWJ4X2R1bXBfY250ID09IDApIHx8CisJICAgICgqbWJ4X3dvcmRfY250ID09IDApKQorCQlyZXR1cm47CisKKwlpZiAoKCptYnhfbWJveF9jbWQgIT0gTFBGQ19NQlhfQUxMX0NNRCkgJiYKKwkgICAgKCptYnhfbWJveF9jbWQgIT0gcG1ib3gtPm1ieENvbW1hbmQpKQorCQlyZXR1cm47CisKKwkvKiBkdW1wIGJ1ZmZlciBjb250ZW50ICovCisJaWYgKCptYnhfZHVtcF9tYXAgJiBMUEZDX01CWF9ETVBfTUJYX1dPUkQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJNYWlsYm94IGNvbW1hbmQ6MHgleCBkdW1wIGJ5IHdvcmQ6XG4iLAorCQkgICAgICAgcG1ib3gtPm1ieENvbW1hbmQpOworCQlwd29yZCA9ICh1aW50MzJfdCAqKXBtYm94OworCQlmb3IgKGkgPSAwOyBpIDwgKm1ieF93b3JkX2NudDsgaSsrKSB7CisJCQlpZiAoIShpICUgOCkpIHsKKwkJCQlpZiAoaSAhPSAwKQorCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzXG4iLCBsaW5lX2J1Zik7CisJCQkJbGVuID0gMDsKKwkJCQltZW1zZXQobGluZV9idWYsIDAsIExQRkNfTUJYX0FDQ19MQlVGX1NaKTsKKwkJCQlsZW4gKz0gc25wcmludGYobGluZV9idWYrbGVuLAorCQkJCQkJTFBGQ19NQlhfQUNDX0xCVUZfU1otbGVuLAorCQkJCQkJIiUwM2Q6ICIsIGkpOworCQkJfQorCQkJbGVuICs9IHNucHJpbnRmKGxpbmVfYnVmK2xlbiwgTFBGQ19NQlhfQUNDX0xCVUZfU1otbGVuLAorCQkJCQkiJTA4eCAiLAorCQkJCQkoKHVpbnQzMl90KSpwd29yZCkgJiAweGZmZmZmZmZmKTsKKwkJCXB3b3JkKys7CisJCX0KKwkJaWYgKChpIC0gMSkgJSA4KQorCQkJcHJpbnRrKEtFUk5fRVJSICIlc1xuIiwgbGluZV9idWYpOworCQlwcmludGsoS0VSTl9FUlIgIlxuIik7CisJfQorCWlmICgqbWJ4X2R1bXBfbWFwICYgTFBGQ19NQlhfRE1QX01CWF9CWVRFKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTWFpbGJveCBjb21tYW5kOjB4JXggZHVtcCBieSBieXRlOlxuIiwKKwkJICAgICAgIHBtYm94LT5tYnhDb21tYW5kKTsKKwkJcGJ5dGUgPSAodWludDhfdCAqKXBtYm94OworCQlmb3IgKGkgPSAwOyBpIDwgKm1ieF93b3JkX2NudDsgaSsrKSB7CisJCQlpZiAoIShpICUgOCkpIHsKKwkJCQlpZiAoaSAhPSAwKQorCQkJCQlwcmludGsoS0VSTl9FUlIgIiVzXG4iLCBsaW5lX2J1Zik7CisJCQkJbGVuID0gMDsKKwkJCQltZW1zZXQobGluZV9idWYsIDAsIExQRkNfTUJYX0FDQ19MQlVGX1NaKTsKKwkJCQlsZW4gKz0gc25wcmludGYobGluZV9idWYrbGVuLAorCQkJCQkJTFBGQ19NQlhfQUNDX0xCVUZfU1otbGVuLAorCQkJCQkJIiUwM2Q6ICIsIGkpOworCQkJfQorCQkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworCQkJCWxlbiArPSBzbnByaW50ZihsaW5lX2J1ZitsZW4sCisJCQkJCQlMUEZDX01CWF9BQ0NfTEJVRl9TWi1sZW4sCisJCQkJCQkiJTAyeCIsCisJCQkJCQkoKHVpbnQ4X3QpKnBieXRlKSAmIDB4ZmYpOworCQkJCXBieXRlKys7CisJCQl9CisJCQlsZW4gKz0gc25wcmludGYobGluZV9idWYrbGVuLAorCQkJCQlMUEZDX01CWF9BQ0NfTEJVRl9TWi1sZW4sICIgIik7CisJCX0KKwkJaWYgKChpIC0gMSkgJSA4KQorCQkJcHJpbnRrKEtFUk5fRVJSICIlc1xuIiwgbGluZV9idWYpOworCQlwcmludGsoS0VSTl9FUlIgIlxuIik7CisJfQorCSgqbWJ4X2R1bXBfY250KS0tOworCisJLyogQ2xlYW4gb3V0IGNvbW1hbmQgc3RydWN0dXJlIG9uIHJlYWNoaW5nIGR1bXAgY291bnQgKi8KKwlpZiAoKm1ieF9kdW1wX2NudCA9PSAwKQorCQltZW1zZXQoJmlkaWFnLCAwLCBzaXplb2YoaWRpYWcpKTsKKwlyZXR1cm47CisjZW5kaWYKK30KKwogLyoqCiAgKiBscGZjX2RlYnVnZnNfaW5pdGlhbGl6ZSAtIEluaXRpYWxpemUgZGVidWdmcyBmb3IgYSB2cG9ydAogICogQHZwb3J0OiBUaGUgdnBvcnQgcG9pbnRlciB0byBpbml0aWFsaXplLgpAQCAtMjY3Myw3ICszODk0LDcgQEAKIAkJCQkgdnBvcnQsICZscGZjX2RlYnVnZnNfb3Bfbm9kZWxpc3QpOwogCWlmICghdnBvcnQtPmRlYnVnX25vZGVsaXN0KSB7CiAJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fRVJSLCBMT0dfSU5JVCwKLQkJCQkgIjA0MDkgQ2FuJ3QgY3JlYXRlIGRlYnVnZnMgbm9kZWxpc3RcbiIpOworCQkJCSAiMjk4NSBDYW4ndCBjcmVhdGUgZGVidWdmcyBub2RlbGlzdFxuIik7CiAJCWdvdG8gZGVidWdfZmFpbGVkOwogCX0KIApAQCAtMjcxMCw2ICszOTMxLDIwIEBACiAJCWlkaWFnLm9mZnNldC5sYXN0X3JkID0gMDsKIAl9CiAKKwkvKiBpRGlhZyBQQ0kgQkFSIGFjY2VzcyAqLworCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgImJhckFjYyIpOworCWlmICghcGhiYS0+aWRpYWdfYmFyX2FjYykgeworCQlwaGJhLT5pZGlhZ19iYXJfYWNjID0KKwkJCWRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgU19JRlJFR3xTX0lSVUdPfFNfSVdVU1IsCisJCQkJcGhiYS0+aWRpYWdfcm9vdCwgcGhiYSwgJmxwZmNfaWRpYWdfb3BfYmFyQWNjKTsKKwkJaWYgKCFwaGJhLT5pZGlhZ19iYXJfYWNjKSB7CisJCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0VSUiwgTE9HX0lOSVQsCisJCQkJCSIzMDU2IENhbid0IGNyZWF0ZSBpZGlhZyBkZWJ1Z2ZzXG4iKTsKKwkJCWdvdG8gZGVidWdfZmFpbGVkOworCQl9CisJCWlkaWFnLm9mZnNldC5sYXN0X3JkID0gMDsKKwl9CisKIAkvKiBpRGlhZyBnZXQgUENJIGZ1bmN0aW9uIHF1ZXVlIGluZm9ybWF0aW9uICovCiAJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAicXVlSW5mbyIpOwogCWlmICghcGhiYS0+aWRpYWdfcXVlX2luZm8pIHsKQEAgLTI3NDksNiArMzk4NCw1MCBAQAogCQl9CiAJfQogCisJLyogaURpYWcgYWNjZXNzIFBDSSBmdW5jdGlvbiBjb250cm9sIHJlZ2lzdGVycyAqLworCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgImN0bEFjYyIpOworCWlmICghcGhiYS0+aWRpYWdfY3RsX2FjYykgeworCQlwaGJhLT5pZGlhZ19jdGxfYWNjID0KKwkJCWRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgU19JRlJFR3xTX0lSVUdPfFNfSVdVU1IsCisJCQkJcGhiYS0+aWRpYWdfcm9vdCwgcGhiYSwgJmxwZmNfaWRpYWdfb3BfY3RsQWNjKTsKKwkJaWYgKCFwaGJhLT5pZGlhZ19jdGxfYWNjKSB7CisJCQlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0VSUiwgTE9HX0lOSVQsCisJCQkJCSAiMjk4MSBDYW4ndCBjcmVhdGUgaWRpYWcgZGVidWdmc1xuIik7CisJCQlnb3RvIGRlYnVnX2ZhaWxlZDsKKwkJfQorCX0KKworCS8qIGlEaWFnIGFjY2VzcyBtYm94IGNvbW1hbmRzICovCisJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAibWJ4QWNjIik7CisJaWYgKCFwaGJhLT5pZGlhZ19tYnhfYWNjKSB7CisJCXBoYmEtPmlkaWFnX21ieF9hY2MgPQorCQkJZGVidWdmc19jcmVhdGVfZmlsZShuYW1lLCBTX0lGUkVHfFNfSVJVR098U19JV1VTUiwKKwkJCQlwaGJhLT5pZGlhZ19yb290LCBwaGJhLCAmbHBmY19pZGlhZ19vcF9tYnhBY2MpOworCQlpZiAoIXBoYmEtPmlkaWFnX21ieF9hY2MpIHsKKwkJCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fRVJSLCBMT0dfSU5JVCwKKwkJCQkJIjI5ODAgQ2FuJ3QgY3JlYXRlIGlkaWFnIGRlYnVnZnNcbiIpOworCQkJZ290byBkZWJ1Z19mYWlsZWQ7CisJCX0KKwl9CisKKwkvKiBpRGlhZyBleHRlbnRzIGFjY2VzcyBjb21tYW5kcyAqLworCWlmIChwaGJhLT5zbGk0X2hiYS5leHRlbnRzX2luX3VzZSkgeworCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJleHRBY2MiKTsKKwkJaWYgKCFwaGJhLT5pZGlhZ19leHRfYWNjKSB7CisJCQlwaGJhLT5pZGlhZ19leHRfYWNjID0KKwkJCQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsCisJCQkJCQkgICAgU19JRlJFR3xTX0lSVUdPfFNfSVdVU1IsCisJCQkJCQkgICAgcGhiYS0+aWRpYWdfcm9vdCwgcGhiYSwKKwkJCQkJCSAgICAmbHBmY19pZGlhZ19vcF9leHRBY2MpOworCQkJaWYgKCFwaGJhLT5pZGlhZ19leHRfYWNjKSB7CisJCQkJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9FUlIsIExPR19JTklULAorCQkJCQkJIjI5ODYgQ2FudCBjcmVhdGUgIgorCQkJCQkJImlkaWFnIGRlYnVnZnNcbiIpOworCQkJCWdvdG8gZGVidWdfZmFpbGVkOworCQkJfQorCQl9CisJfQorCiBkZWJ1Z19mYWlsZWQ6CiAJcmV0dXJuOwogI2VuZGlmCkBAIC0yNzgzLDcgKzQwNjIsNiBAQAogCQlkZWJ1Z2ZzX3JlbW92ZSh2cG9ydC0+ZGVidWdfbm9kZWxpc3QpOyAvKiBub2RlbGlzdCAqLwogCQl2cG9ydC0+ZGVidWdfbm9kZWxpc3QgPSBOVUxMOwogCX0KLQogCWlmICh2cG9ydC0+dnBvcnRfZGVidWdmc19yb290KSB7CiAJCWRlYnVnZnNfcmVtb3ZlKHZwb3J0LT52cG9ydF9kZWJ1Z2ZzX3Jvb3QpOyAvKiB2cG9ydFggKi8KIAkJdnBvcnQtPnZwb3J0X2RlYnVnZnNfcm9vdCA9IE5VTEw7CkBAIC0yODI3LDYgKzQxMDUsMjEgQEAKIAkJICogaURpYWcgcmVsZWFzZQogCQkgKi8KIAkJaWYgKHBoYmEtPnNsaV9yZXYgPT0gTFBGQ19TTElfUkVWNCkgeworCQkJaWYgKHBoYmEtPmlkaWFnX2V4dF9hY2MpIHsKKwkJCQkvKiBpRGlhZyBleHRBY2MgKi8KKwkJCQlkZWJ1Z2ZzX3JlbW92ZShwaGJhLT5pZGlhZ19leHRfYWNjKTsKKwkJCQlwaGJhLT5pZGlhZ19leHRfYWNjID0gTlVMTDsKKwkJCX0KKwkJCWlmIChwaGJhLT5pZGlhZ19tYnhfYWNjKSB7CisJCQkJLyogaURpYWcgbWJ4QWNjICovCisJCQkJZGVidWdmc19yZW1vdmUocGhiYS0+aWRpYWdfbWJ4X2FjYyk7CisJCQkJcGhiYS0+aWRpYWdfbWJ4X2FjYyA9IE5VTEw7CisJCQl9CisJCQlpZiAocGhiYS0+aWRpYWdfY3RsX2FjYykgeworCQkJCS8qIGlEaWFnIGN0bEFjYyAqLworCQkJCWRlYnVnZnNfcmVtb3ZlKHBoYmEtPmlkaWFnX2N0bF9hY2MpOworCQkJCXBoYmEtPmlkaWFnX2N0bF9hY2MgPSBOVUxMOworCQkJfQogCQkJaWYgKHBoYmEtPmlkaWFnX2RyYl9hY2MpIHsKIAkJCQkvKiBpRGlhZyBkcmJBY2MgKi8KIAkJCQlkZWJ1Z2ZzX3JlbW92ZShwaGJhLT5pZGlhZ19kcmJfYWNjKTsKQEAgLTI4NDIsNiArNDEzNSwxMSBAQAogCQkJCWRlYnVnZnNfcmVtb3ZlKHBoYmEtPmlkaWFnX3F1ZV9pbmZvKTsKIAkJCQlwaGJhLT5pZGlhZ19xdWVfaW5mbyA9IE5VTEw7CiAJCQl9CisJCQlpZiAocGhiYS0+aWRpYWdfYmFyX2FjYykgeworCQkJCS8qIGlEaWFnIGJhckFjYyAqLworCQkJCWRlYnVnZnNfcmVtb3ZlKHBoYmEtPmlkaWFnX2Jhcl9hY2MpOworCQkJCXBoYmEtPmlkaWFnX2Jhcl9hY2MgPSBOVUxMOworCQkJfQogCQkJaWYgKHBoYmEtPmlkaWFnX3BjaV9jZmcpIHsKIAkJCQkvKiBpRGlhZyBwY2lDZmcgKi8KIAkJCQlkZWJ1Z2ZzX3JlbW92ZShwaGJhLT5pZGlhZ19wY2lfY2ZnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZGVidWdmcy5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19kZWJ1Z2ZzLmgKaW5kZXggNjUyNWE1ZS4uZjgzYmQ5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19kZWJ1Z2ZzLmgKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19kZWJ1Z2ZzLmgKQEAgLTM5LDE0ICszOSw1MSBAQAogLyogaGJxaW5mbyBvdXRwdXQgYnVmZmVyIHNpemUgKi8KICNkZWZpbmUgTFBGQ19IQlFJTkZPX1NJWkUgODE5MgogCisvKgorICogRm9yIFNMSTQgaURpYWcgZGVidWdmcyBkaWFnbm9zdGljcyB0b29sCisgKi8KKwogLyogcGNpQ29uZiAqLwogI2RlZmluZSBMUEZDX1BDSV9DRkdfQlJPV1NFIDB4ZmZmZgogI2RlZmluZSBMUEZDX1BDSV9DRkdfUkRfQ01EX0FSRyAyCiAjZGVmaW5lIExQRkNfUENJX0NGR19XUl9DTURfQVJHIDMKICNkZWZpbmUgTFBGQ19QQ0lfQ0ZHX1NJWkUgNDA5NgotI2RlZmluZSBMUEZDX1BDSV9DRkdfUkRfQlVGX1NJWkUgKExQRkNfUENJX0NGR19TSVpFLzIpCiAjZGVmaW5lIExQRkNfUENJX0NGR19SRF9TSVpFIChMUEZDX1BDSV9DRkdfU0laRS80KQogCisjZGVmaW5lIElESUFHX1BDSUNGR19XSEVSRV9JTkRYIDAKKyNkZWZpbmUgSURJQUdfUENJQ0ZHX0NPVU5UX0lORFggMQorI2RlZmluZSBJRElBR19QQ0lDRkdfVkFMVUVfSU5EWCAyCisKKy8qIGJhckFjYyAqLworI2RlZmluZSBMUEZDX1BDSV9CQVJfQlJPV1NFIDB4ZmZmZgorI2RlZmluZSBMUEZDX1BDSV9CQVJfUkRfQ01EX0FSRyAzCisjZGVmaW5lIExQRkNfUENJX0JBUl9XUl9DTURfQVJHIDMKKworI2RlZmluZSBMUEZDX1BDSV9JRjBfQkFSMF9TSVpFICgxMDI0ICogIDE2KQorI2RlZmluZSBMUEZDX1BDSV9JRjBfQkFSMV9TSVpFICgxMDI0ICogMTI4KQorI2RlZmluZSBMUEZDX1BDSV9JRjBfQkFSMl9TSVpFICgxMDI0ICogMTI4KQorI2RlZmluZSBMUEZDX1BDSV9JRjJfQkFSMF9TSVpFICgxMDI0ICogIDMyKQorCisjZGVmaW5lIExQRkNfUENJX0JBUl9SRF9CVUZfU0laRSA0MDk2CisjZGVmaW5lIExQRkNfUENJX0JBUl9SRF9TSVpFIChMUEZDX1BDSV9CQVJfUkRfQlVGX1NJWkUvNCkKKworI2RlZmluZSBMUEZDX1BDSV9JRjBfQkFSMF9SRF9TSVpFIChMUEZDX1BDSV9JRjBfQkFSMF9TSVpFLzQpCisjZGVmaW5lIExQRkNfUENJX0lGMF9CQVIxX1JEX1NJWkUgKExQRkNfUENJX0lGMF9CQVIxX1NJWkUvNCkKKyNkZWZpbmUgTFBGQ19QQ0lfSUYwX0JBUjJfUkRfU0laRSAoTFBGQ19QQ0lfSUYwX0JBUjJfU0laRS80KQorI2RlZmluZSBMUEZDX1BDSV9JRjJfQkFSMF9SRF9TSVpFIChMUEZDX1BDSV9JRjJfQkFSMF9TSVpFLzQpCisKKyNkZWZpbmUgSURJQUdfQkFSQUNDX0JBUl9OVU1fSU5EWCAwCisjZGVmaW5lIElESUFHX0JBUkFDQ19PRkZfU0VUX0lORFggMQorI2RlZmluZSBJRElBR19CQVJBQ0NfQUNDX01PRF9JTkRYIDIKKyNkZWZpbmUgSURJQUdfQkFSQUNDX1JFR19WQUxfSU5EWCAyCisjZGVmaW5lIElESUFHX0JBUkFDQ19CQVJfU1pFX0lORFggMworCisjZGVmaW5lIElESUFHX0JBUkFDQ19CQVJfMCAwCisjZGVmaW5lIElESUFHX0JBUkFDQ19CQVJfMSAxCisjZGVmaW5lIElESUFHX0JBUkFDQ19CQVJfMiAyCisKKyNkZWZpbmUgU0lOR0xFX1dPUkQgMQorCiAvKiBxdWV1ZSBpbmZvICovCiAjZGVmaW5lIExQRkNfUVVFX0lORk9fR0VUX0JVRl9TSVpFIDQwOTYKIApAQCAtNjMsNyArMTAwLDE0IEBACiAjZGVmaW5lIExQRkNfSURJQUdfV1EgNAogI2RlZmluZSBMUEZDX0lESUFHX1JRIDUKIAotLyogZG9vcmJlbGwgYWNjICovCisjZGVmaW5lIElESUFHX1FVRUFDQ19RVUVUUF9JTkRYIDAKKyNkZWZpbmUgSURJQUdfUVVFQUNDX1FVRUlEX0lORFggMQorI2RlZmluZSBJRElBR19RVUVBQ0NfSU5ERVhfSU5EWCAyCisjZGVmaW5lIElESUFHX1FVRUFDQ19DT1VOVF9JTkRYIDMKKyNkZWZpbmUgSURJQUdfUVVFQUNDX09GRlNUX0lORFggNAorI2RlZmluZSBJRElBR19RVUVBQ0NfVkFMVUVfSU5EWCA1CisKKy8qIGRvb3JiZWxsIHJlZ2lzdGVyIGFjYyAqLwogI2RlZmluZSBMUEZDX0RSQl9BQ0NfQUxMIDB4ZmZmZgogI2RlZmluZSBMUEZDX0RSQl9BQ0NfUkRfQ01EX0FSRyAxCiAjZGVmaW5lIExQRkNfRFJCX0FDQ19XUl9DTURfQVJHIDIKQEAgLTc2LDYgKzEyMCw2NyBAQAogCiAjZGVmaW5lIExQRkNfRFJCX01BWCAgNAogCisjZGVmaW5lIElESUFHX0RSQkFDQ19SRUdJRF9JTkRYIDAKKyNkZWZpbmUgSURJQUdfRFJCQUNDX1ZBTFVFX0lORFggMQorCisvKiBjb250cm9sIHJlZ2lzdGVyIGFjYyAqLworI2RlZmluZSBMUEZDX0NUTF9BQ0NfQUxMIDB4ZmZmZgorI2RlZmluZSBMUEZDX0NUTF9BQ0NfUkRfQ01EX0FSRyAxCisjZGVmaW5lIExQRkNfQ1RMX0FDQ19XUl9DTURfQVJHIDIKKyNkZWZpbmUgTFBGQ19DVExfQUNDX0JVRl9TSVpFIDI1NgorCisjZGVmaW5lIExQRkNfQ1RMX1BPUlRfU0VNICAxCisjZGVmaW5lIExQRkNfQ1RMX1BPUlRfU1RBICAyCisjZGVmaW5lIExQRkNfQ1RMX1BPUlRfQ1RMICAzCisjZGVmaW5lIExQRkNfQ1RMX1BPUlRfRVIxICA0CisjZGVmaW5lIExQRkNfQ1RMX1BPUlRfRVIyICA1CisjZGVmaW5lIExQRkNfQ1RMX1BERVZfQ1RMICA2CisKKyNkZWZpbmUgTFBGQ19DVExfTUFYICA2CisKKyNkZWZpbmUgSURJQUdfQ1RMQUNDX1JFR0lEX0lORFggMAorI2RlZmluZSBJRElBR19DVExBQ0NfVkFMVUVfSU5EWCAxCisKKy8qIG1haWxib3ggYWNjZXNzICovCisjZGVmaW5lIExQRkNfTUJYX0RNUF9BUkcgNAorCisjZGVmaW5lIExQRkNfTUJYX0FDQ19CVUZfU0laRSA1MTIKKyNkZWZpbmUgTFBGQ19NQlhfQUNDX0xCVUZfU1ogMTI4CisKKyNkZWZpbmUgTFBGQ19NQlhfRE1QX01CWF9XT1JEIDB4MDAwMDAwMDEKKyNkZWZpbmUgTFBGQ19NQlhfRE1QX01CWF9CWVRFIDB4MDAwMDAwMDIKKyNkZWZpbmUgTFBGQ19NQlhfRE1QX01CWF9BTEwgKExQRkNfTUJYX0RNUF9NQlhfV09SRCB8IExQRkNfTUJYX0RNUF9NQlhfQllURSkKKworI2RlZmluZSBMUEZDX0JTR19ETVBfTUJYX1JEX01CWCAweDAwMDAwMDAxCisjZGVmaW5lIExQRkNfQlNHX0RNUF9NQlhfUkRfQlVGIDB4MDAwMDAwMDIKKyNkZWZpbmUgTFBGQ19CU0dfRE1QX01CWF9XUl9NQlggMHgwMDAwMDAwNAorI2RlZmluZSBMUEZDX0JTR19ETVBfTUJYX1dSX0JVRiAweDAwMDAwMDA4CisjZGVmaW5lIExQRkNfQlNHX0RNUF9NQlhfQUxMIChMUEZDX0JTR19ETVBfTUJYX1JEX01CWCB8IFwKKwkJCSAgICAgIExQRkNfQlNHX0RNUF9NQlhfUkRfQlVGIHwgXAorCQkJICAgICAgTFBGQ19CU0dfRE1QX01CWF9XUl9NQlggfCBcCisJCQkgICAgICBMUEZDX0JTR19ETVBfTUJYX1dSX0JVRikKKworI2RlZmluZSBMUEZDX01CWF9ETVBfQUxMIDB4ZmZmZgorI2RlZmluZSBMUEZDX01CWF9BTExfQ01EIDB4ZmYKKworI2RlZmluZSBJRElBR19NQlhBQ0NfTUJDTURfSU5EWCAwCisjZGVmaW5lIElESUFHX01CWEFDQ19EUE1BUF9JTkRYIDEKKyNkZWZpbmUgSURJQUdfTUJYQUNDX0RQQ05UX0lORFggMgorI2RlZmluZSBJRElBR19NQlhBQ0NfV0RDTlRfSU5EWCAzCisKKy8qIGV4dGVudHMgYWNjZXNzICovCisjZGVmaW5lIExQRkNfRVhUX0FDQ19DTURfQVJHIDEKKyNkZWZpbmUgTFBGQ19FWFRfQUNDX0JVRl9TSVpFIDQwOTYKKworI2RlZmluZSBMUEZDX0VYVF9BQ0NfQVZBSUwgMHgxCisjZGVmaW5lIExQRkNfRVhUX0FDQ19BTExPQyAweDIKKyNkZWZpbmUgTFBGQ19FWFRfQUNDX0RSSVZSIDB4NAorI2RlZmluZSBMUEZDX0VYVF9BQ0NfQUxMICAgKExQRkNfRVhUX0FDQ19EUklWUiB8IFwKKwkJCSAgICBMUEZDX0VYVF9BQ0NfQVZBSUwgfCBcCisJCQkgICAgTFBGQ19FWFRfQUNDX0FMTE9DKQorCisjZGVmaW5lIElESUFHX0VYVEFDQ19FWE1BUF9JTkRYIDAKKwogI2RlZmluZSBTSVpFX1U4ICBzaXplb2YodWludDhfdCkKICNkZWZpbmUgU0laRV9VMTYgc2l6ZW9mKHVpbnQxNl90KQogI2RlZmluZSBTSVpFX1UzMiBzaXplb2YodWludDMyX3QpCkBAIC0xMTAsNiArMjE1LDExIEBACiAjZGVmaW5lIExQRkNfSURJQUdfQ01EX1BDSUNGR19TVCAweDAwMDAwMDAzCiAjZGVmaW5lIExQRkNfSURJQUdfQ01EX1BDSUNGR19DTCAweDAwMDAwMDA0CiAKKyNkZWZpbmUgTFBGQ19JRElBR19DTURfQkFSQUNDX1JEIDB4MDAwMDAwMDgKKyNkZWZpbmUgTFBGQ19JRElBR19DTURfQkFSQUNDX1dSIDB4MDAwMDAwMDkKKyNkZWZpbmUgTFBGQ19JRElBR19DTURfQkFSQUNDX1NUIDB4MDAwMDAwMGEKKyNkZWZpbmUgTFBGQ19JRElBR19DTURfQkFSQUNDX0NMIDB4MDAwMDAwMGIKKwogI2RlZmluZSBMUEZDX0lESUFHX0NNRF9RVUVBQ0NfUkQgMHgwMDAwMDAxMQogI2RlZmluZSBMUEZDX0lESUFHX0NNRF9RVUVBQ0NfV1IgMHgwMDAwMDAxMgogI2RlZmluZSBMUEZDX0lESUFHX0NNRF9RVUVBQ0NfU1QgMHgwMDAwMDAxMwpAQCAtMTE5LDYgKzIyOSwxNyBAQAogI2RlZmluZSBMUEZDX0lESUFHX0NNRF9EUkJBQ0NfV1IgMHgwMDAwMDAyMgogI2RlZmluZSBMUEZDX0lESUFHX0NNRF9EUkJBQ0NfU1QgMHgwMDAwMDAyMwogI2RlZmluZSBMUEZDX0lESUFHX0NNRF9EUkJBQ0NfQ0wgMHgwMDAwMDAyNAorCisjZGVmaW5lIExQRkNfSURJQUdfQ01EX0NUTEFDQ19SRCAweDAwMDAwMDMxCisjZGVmaW5lIExQRkNfSURJQUdfQ01EX0NUTEFDQ19XUiAweDAwMDAwMDMyCisjZGVmaW5lIExQRkNfSURJQUdfQ01EX0NUTEFDQ19TVCAweDAwMDAwMDMzCisjZGVmaW5lIExQRkNfSURJQUdfQ01EX0NUTEFDQ19DTCAweDAwMDAwMDM0CisKKyNkZWZpbmUgTFBGQ19JRElBR19DTURfTUJYQUNDX0RQIDB4MDAwMDAwNDEKKyNkZWZpbmUgTFBGQ19JRElBR19CU0dfTUJYQUNDX0RQIDB4MDAwMDAwNDIKKworI2RlZmluZSBMUEZDX0lESUFHX0NNRF9FWFRBQ0NfUkQgMHgwMDAwMDA1MQorCiAJdWludDMyX3QgZGF0YVtMUEZDX0lESUFHX0NNRF9EQVRBX1NJWkVdOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19lbHMuYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfZWxzLmMKaW5kZXggMzJhMDg0NS4uMDIzZGEwZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19lbHMuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2Vscy5jCkBAIC02NDcsMjEgKzY0NywxNSBAQAogCQl9CiAJCWxwZmNfY2xlYW51cF9wZW5kaW5nX21ib3godnBvcnQpOwogCi0JCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpCisJCWlmIChwaGJhLT5zbGlfcmV2ID09IExQRkNfU0xJX1JFVjQpIHsKIAkJCWxwZmNfc2xpNF91bnJlZ19hbGxfcnBpcyh2cG9ydCk7Ci0KLQkJaWYgKHBoYmEtPnNsaTNfb3B0aW9ucyAmIExQRkNfU0xJM19OUElWX0VOQUJMRUQpIHsKIAkJCWxwZmNfbWJ4X3VucmVnX3ZwaSh2cG9ydCk7CiAJCQlzcGluX2xvY2tfaXJxKHNob3N0LT5ob3N0X2xvY2spOwogCQkJdnBvcnQtPmZjX2ZsYWcgfD0gRkNfVlBPUlRfTkVFRFNfUkVHX1ZQSTsKLQkJCXNwaW5fdW5sb2NrX2lycShzaG9zdC0+aG9zdF9sb2NrKTsKLQkJfQotCQkvKgotCQkgKiBJZiBWUEkgaXMgdW5yZWdlZCwgZHJpdmVyIG5lZWQgdG8gZG8gSU5JVF9WUEkKLQkJICogYmVmb3JlIHJlLXJlZ2lzdGVyaW5nCi0JCSAqLwotCQlpZiAocGhiYS0+c2xpX3JldiA9PSBMUEZDX1NMSV9SRVY0KSB7Ci0JCQlzcGluX2xvY2tfaXJxKHNob3N0LT5ob3N0X2xvY2spOworCQkJLyoKKwkJCSogSWYgVlBJIGlzIHVucmVnZWQsIGRyaXZlciBuZWVkIHRvIGRvIElOSVRfVlBJCisJCQkqIGJlZm9yZSByZS1yZWdpc3RlcmluZworCQkJKi8KIAkJCXZwb3J0LT5mY19mbGFnIHw9IEZDX1ZQT1JUX05FRURTX0lOSVRfVlBJOwogCQkJc3Bpbl91bmxvY2tfaXJxKHNob3N0LT5ob3N0X2xvY2spOwogCQl9CkBAIC04ODAsNiArODc0LDggQEAKIAkJCQkJcGhiYS0+ZmNmLmN1cnJlbnRfcmVjLmZjZl9pbmR4LAogCQkJCQlpcnNwLT51bHBTdGF0dXMsIGlyc3AtPnVuLnVscFdvcmRbNF0sCiAJCQkJCWlyc3AtPnVscFRpbWVvdXQpOworCQkJbHBmY19zbGk0X3NldF9mY2ZfZmxvZ2lfZmFpbChwaGJhLAorCQkJCQlwaGJhLT5mY2YuY3VycmVudF9yZWMuZmNmX2luZHgpOwogCQkJZmNmX2luZGV4ID0gbHBmY19zbGk0X2ZjZl9ycl9uZXh0X2luZGV4X2dldChwaGJhKTsKIAkJCXJjID0gbHBmY19zbGk0X2ZjZl9ycl9uZXh0X3Byb2ModnBvcnQsIGZjZl9pbmRleCk7CiAJCQlpZiAocmMpCkBAIC0xMDk2LDExICsxMDkyLDE0IEBACiAJCQkvKiBTZXQgdGhlIGZjZmkgdG8gdGhlIGZjZmkgd2UgcmVnaXN0ZXJlZCB3aXRoICovCiAJCQllbHNpb2NiLT5pb2NiLnVscENvbnRleHQgPSBwaGJhLT5mY2YuZmNmaTsKIAkJfQotCX0gZWxzZSBpZiAocGhiYS0+c2xpM19vcHRpb25zICYgTFBGQ19TTEkzX05QSVZfRU5BQkxFRCkgewotCQlzcC0+Y21uLnJlcXVlc3RfbXVsdGlwbGVfTnBvcnQgPSAxOwotCQkvKiBGb3IgRkxPR0ksIExldCBGTE9HSSByc3Agc2V0IHRoZSBOUG9ydElEIGZvciBWUEkgMCAqLwotCQlpY21kLT51bHBDdF9oID0gMTsKLQkJaWNtZC0+dWxwQ3RfbCA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKHBoYmEtPnNsaTNfb3B0aW9ucyAmIExQRkNfU0xJM19OUElWX0VOQUJMRUQpIHsKKwkJCXNwLT5jbW4ucmVxdWVzdF9tdWx0aXBsZV9OcG9ydCA9IDE7CisJCQkvKiBGb3IgRkxPR0ksIExldCBGTE9HSSByc3Agc2V0IHRoZSBOUG9ydElEIGZvciBWUEkgMCAqLworCQkJaWNtZC0+dWxwQ3RfaCA9IDE7CisJCQlpY21kLT51bHBDdF9sID0gMDsKKwkJfSBlbHNlCisJCQlzcC0+Y21uLnJlcXVlc3RfbXVsdGlwbGVfTnBvcnQgPSAwOwogCX0KIAogCWlmIChwaGJhLT5mY190b3BvbG9neSAhPSBMUEZDX1RPUE9MT0dZX0xPT1ApIHsKQEAgLTM2NTYsNyArMzY1NSw4IEBACiAJCX0KIAogCQlpY21kID0gJmVsc2lvY2ItPmlvY2I7Ci0JCWljbWQtPnVscENvbnRleHQgPSBvbGRjbWQtPnVscENvbnRleHQ7CS8qIFhyaSAqLworCQlpY21kLT51bHBDb250ZXh0ID0gb2xkY21kLT51bHBDb250ZXh0OwkvKiBYcmkgLyByeF9pZCAqLworCQlpY21kLT51bnNsaTMucmN2c2xpMy5veF9pZCA9IG9sZGNtZC0+dW5zbGkzLnJjdnNsaTMub3hfaWQ7CiAJCXBjbWQgPSAoKChzdHJ1Y3QgbHBmY19kbWFidWYgKikgZWxzaW9jYi0+Y29udGV4dDIpLT52aXJ0KTsKIAkJKigodWludDMyX3QgKikgKHBjbWQpKSA9IEVMU19DTURfQUNDOwogCQlwY21kICs9IHNpemVvZih1aW50MzJfdCk7CkBAIC0zNjczLDcgKzM2NzMsOCBAQAogCQkJcmV0dXJuIDE7CiAKIAkJaWNtZCA9ICZlbHNpb2NiLT5pb2NiOwotCQlpY21kLT51bHBDb250ZXh0ID0gb2xkY21kLT51bHBDb250ZXh0OwkvKiBYcmkgKi8KKwkJaWNtZC0+dWxwQ29udGV4dCA9IG9sZGNtZC0+dWxwQ29udGV4dDsJLyogWHJpIC8gcnhfaWQgKi8KKwkJaWNtZC0+dW5zbGkzLnJjdnNsaTMub3hfaWQgPSBvbGRjbWQtPnVuc2xpMy5yY3ZzbGkzLm94X2lkOwogCQlwY21kID0gKCgoc3RydWN0IGxwZmNfZG1hYnVmICopIGVsc2lvY2ItPmNvbnRleHQyKS0+dmlydCk7CiAKIAkJaWYgKG1ib3gpCkBAIC0zNjk1LDcgKzM2OTYsOCBAQAogCQkJcmV0dXJuIDE7CiAKIAkJaWNtZCA9ICZlbHNpb2NiLT5pb2NiOwotCQlpY21kLT51bHBDb250ZXh0ID0gb2xkY21kLT51bHBDb250ZXh0OyAvKiBYcmkgKi8KKwkJaWNtZC0+dWxwQ29udGV4dCA9IG9sZGNtZC0+dWxwQ29udGV4dDsJLyogWHJpIC8gcnhfaWQgKi8KKwkJaWNtZC0+dW5zbGkzLnJjdnNsaTMub3hfaWQgPSBvbGRjbWQtPnVuc2xpMy5yY3ZzbGkzLm94X2lkOwogCQlwY21kID0gKCgoc3RydWN0IGxwZmNfZG1hYnVmICopIGVsc2lvY2ItPmNvbnRleHQyKS0+dmlydCk7CiAKIAkJbWVtY3B5KHBjbWQsICgoc3RydWN0IGxwZmNfZG1hYnVmICopIG9sZGlvY2ItPmNvbnRleHQyKS0+dmlydCwKQEAgLTM3ODEsNyArMzc4Myw4IEBACiAKIAlpY21kID0gJmVsc2lvY2ItPmlvY2I7CiAJb2xkY21kID0gJm9sZGlvY2ItPmlvY2I7Ci0JaWNtZC0+dWxwQ29udGV4dCA9IG9sZGNtZC0+dWxwQ29udGV4dDsJLyogWHJpICovCisJaWNtZC0+dWxwQ29udGV4dCA9IG9sZGNtZC0+dWxwQ29udGV4dDsJLyogWHJpIC8gcnhfaWQgKi8KKwlpY21kLT51bnNsaTMucmN2c2xpMy5veF9pZCA9IG9sZGNtZC0+dW5zbGkzLnJjdnNsaTMub3hfaWQ7CiAJcGNtZCA9ICh1aW50OF90ICopICgoKHN0cnVjdCBscGZjX2RtYWJ1ZiAqKSBlbHNpb2NiLT5jb250ZXh0MiktPnZpcnQpOwogCiAJKigodWludDMyX3QgKikgKHBjbWQpKSA9IEVMU19DTURfTFNfUkpUOwpAQCAtMzg1Myw3ICszODU2LDggQEAKIAogCWljbWQgPSAmZWxzaW9jYi0+aW9jYjsKIAlvbGRjbWQgPSAmb2xkaW9jYi0+aW9jYjsKLQlpY21kLT51bHBDb250ZXh0ID0gb2xkY21kLT51bHBDb250ZXh0OwkvKiBYcmkgKi8KKwlpY21kLT51bHBDb250ZXh0ID0gb2xkY21kLT51bHBDb250ZXh0OwkvKiBYcmkgLyByeF9pZCAqLworCWljbWQtPnVuc2xpMy5yY3ZzbGkzLm94X2lkID0gb2xkY21kLT51bnNsaTMucmN2c2xpMy5veF9pZDsKIAogCS8qIFhtaXQgQURJU0MgQUNDIHJlc3BvbnNlIHRhZyA8dWxwSW9UYWc+ICovCiAJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9JTkZPLCBMT0dfRUxTLApAQCAtMzkzMSw3ICszOTM1LDkgQEAKIAogCWljbWQgPSAmZWxzaW9jYi0+aW9jYjsKIAlvbGRjbWQgPSAmb2xkaW9jYi0+aW9jYjsKLQlpY21kLT51bHBDb250ZXh0ID0gb2xkY21kLT51bHBDb250ZXh0OwkvKiBYcmkgKi8KKwlpY21kLT51bHBDb250ZXh0ID0gb2xkY21kLT51bHBDb250ZXh0OwkvKiBYcmkgLyByeF9pZCAqLworCWljbWQtPnVuc2xpMy5yY3ZzbGkzLm94X2lkID0gb2xkY21kLT51bnNsaTMucmN2c2xpMy5veF9pZDsKKwogCS8qIFhtaXQgUFJMSSBBQ0MgcmVzcG9uc2UgdGFnIDx1bHBJb1RhZz4gKi8KIAlscGZjX3ByaW50Zl92bG9nKHZwb3J0LCBLRVJOX0lORk8sIExPR19FTFMsCiAJCQkgIjAxMzEgWG1pdCBQUkxJIEFDQyByZXNwb25zZSB0YWcgeCV4IHhyaSB4JXgsICIKQEAgLTQwMzUsNyArNDA0MSw5IEBACiAKIAlpY21kID0gJmVsc2lvY2ItPmlvY2I7CiAJb2xkY21kID0gJm9sZGlvY2ItPmlvY2I7Ci0JaWNtZC0+dWxwQ29udGV4dCA9IG9sZGNtZC0+dWxwQ29udGV4dDsJLyogWHJpICovCisJaWNtZC0+dWxwQ29udGV4dCA9IG9sZGNtZC0+dWxwQ29udGV4dDsJLyogWHJpIC8gcnhfaWQgKi8KKwlpY21kLT51bnNsaTMucmN2c2xpMy5veF9pZCA9IG9sZGNtZC0+dW5zbGkzLnJjdnNsaTMub3hfaWQ7CisKIAkvKiBYbWl0IFJOSUQgQUNDIHJlc3BvbnNlIHRhZyA8dWxwSW9UYWc+ICovCiAJbHBmY19wcmludGZfdmxvZyh2cG9ydCwgS0VSTl9JTkZPLCBMT0dfRUxTLAogCQkJICIwMTMyIFhtaXQgUk5JRCBBQ0MgcmVzcG9uc2UgdGFnIHgleCB4cmkgeCV4XG4iLApAQCAtNDE2Myw3ICs0MTcxLDkgQEAKIAlpZiAoIWVsc2lvY2IpCiAJCXJldHVybiAxOwogCi0JZWxzaW9jYi0+aW9jYi51bHBDb250ZXh0ID0gb2xkaW9jYi0+aW9jYi51bHBDb250ZXh0OwkvKiBYcmkgKi8KKwllbHNpb2NiLT5pb2NiLnVscENvbnRleHQgPSBvbGRpb2NiLT5pb2NiLnVscENvbnRleHQ7ICAvKiBYcmkgLyByeF9pZCAqLworCWVsc2lvY2ItPmlvY2IudW5zbGkzLnJjdnNsaTMub3hfaWQgPSBvbGRpb2NiLT5pb2NiLnVuc2xpMy5yY3ZzbGkzLm94X2lkOworCiAJLyogWG1pdCBFQ0hPIEFDQyByZXNwb25zZSB0YWcgPHVscElvVGFnPiAqLwogCWxwZmNfcHJpbnRmX3Zsb2codnBvcnQsIEtFUk5fSU5GTywgTE9HX0VMUywKIAkJCSAiMjg3NiBYbWl0IEVDSE8gQUNDIHJlc3BvbnNlIHRhZyB4JXggeHJpIHgleFxuIiwKQEAgLTUwNTQsMTMgKzUwNjQsMTUgQEAKIAl1aW50OF90ICpwY21kOwogCXN0cnVjdCBscGZjX2lvY2JxICplbHNpb2NiOwogCXN0cnVjdCBscGZjX25vZGVsaXN0ICpuZGxwOwotCXVpbnQxNl90IHhyaTsKKwl1aW50MTZfdCBveGlkOworCXVpbnQxNl90IHJ4aWQ7CiAJdWludDMyX3QgY21kc2l6ZTsKIAogCW1iID0gJnBtYi0+dS5tYjsKIAogCW5kbHAgPSAoc3RydWN0IGxwZmNfbm9kZWxpc3QgKikgcG1iLT5jb250ZXh0MjsKLQl4cmkgPSAodWludDE2X3QpICgodW5zaWduZWQgbG9uZykocG1iLT5jb250ZXh0MSkpOworCXJ4aWQgPSAodWludDE2X3QpICgodW5zaWduZWQgbG9uZykocG1iLT5jb250ZXh0MSkgJiAweGZmZmYpOworCW94aWQgPSAodWludDE2X3QpICgoKHVuc2lnbmVkIGxvbmcpKHBtYi0+Y29udGV4dDEpID4+IDE2KSAmIDB4ZmZmZik7CiAJcG1iLT5jb250ZXh0MSA9IE5VTEw7CiAJcG1iLT5jb250ZXh0MiA9IE5VTEw7CiAKQEAgLTUwODIsNyArNTA5NCw4IEBACiAJCXJldHVybjsKIAogCWljbWQgPSAmZWxzaW9jYi0+aW9jYjsKLQlpY21kLT51bHBDb250ZXh0ID0geHJpOworCWljbWQtPnVscENvbnRleHQgPSByeGlkOworCWljbWQtPnVuc2xpMy5yY3ZzbGkzLm94X2lkID0gb3hpZDsKIAogCXBjbWQgPSAodWludDhfdCAqKSAoKChzdHJ1Y3QgbHBmY19kbWFidWYgKikgZWxzaW9jYi0+Y29udGV4dDIpLT52aXJ0KTsKIAkqKCh1aW50MzJfdCAqKSAocGNtZCkpID0gRUxTX0NNRF9BQ0M7CkBAIC01MTM3LDEzICs1MTUwLDE2IEBACiAJdWludDhfdCAqcGNtZDsKIAlzdHJ1Y3QgbHBmY19pb2NicSAqZWxzaW9jYjsKIAlzdHJ1Y3QgbHBmY19ub2RlbGlzdCAqbmRscDsKLQl1aW50MTZfdCB4cmksIHN0YXR1czsKKwl1aW50MTZfdCBzdGF0dXM7CisJdWludDE2X3Qgb3hpZDsKKwl1aW50MTZfdCByeGlkOwogCXVpbnQzMl90IGNtZHNpemU7CiAKIAltYiA9ICZwbWItPnUubWI7CiAKIAluZGxwID0gKHN0cnVjdCBscGZjX25vZGVsaXN0ICopIHBtYi0+Y29udGV4dDI7Ci0JeHJpID0gKHVpbnQxNl90KSAoKHVuc2lnbmVkIGxvbmcpKHBtYi0+Y29udGV4dDEpKTsKKwlyeGlkID0gKHVpbnQxNl90KSAoKHVuc2lnbmVkIGxvbmcpKHBtYi0+Y29udGV4dDEpICYgMHhmZmZmKTsKKwlveGlkID0gKHVpbnQxNl90KSAoKCh1bnNpZ25lZCBsb25nKShwbWItPmNvbnRleHQxKSA+PiAxNikgJiAweGZmZmYpOwogCXBtYi0+Y29udGV4dDEgPSBOVUxMOwogCXBtYi0+Y29udGV4dDIgPSBOVUxMOwogCkBAIC01MTY1LDcgKzUxODEsOCBAQAogCQlyZXR1cm47CiAKIAlpY21kID0gJmVsc2lvY2ItPmlvY2I7Ci0JaWNtZC0+dWxwQ29udGV4dCA9IHhyaTsKKwlpY21kLT51bHBDb250ZXh0ID0gcnhpZDsKKwlpY21kLT51bnNsaTMucmN2c2xpMy5veF9pZCA9IG94aWQ7CiAKIAlwY21kID0gKHVpbnQ4X3QgKikgKCgoc3RydWN0IGxwZmNfZG1hYnVmICopIGVsc2lvY2ItPmNvbnRleHQyKS0+dmlydCk7CiAJKigodWludDMyX3QgKikgKHBjbWQpKSA9IEVMU19DTURfQUNDOwpAQCAtNTIzOCw4ICs1MjU1LDkgQEAKIAltYm94ID0gbWVtcG9vbF9hbGxvYyhwaGJhLT5tYm94X21lbV9wb29sLCBHRlBfQVRPTUlDKTsKIAlpZiAobWJveCkgewogCQlscGZjX3JlYWRfbG5rX3N0YXQocGhiYSwgbWJveCk7Ci0JCW1ib3gtPmNvbnRleHQxID0KLQkJICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKSBjbWRpb2NiLT5pb2NiLnVscENvbnRleHQpOworCQltYm94LT5jb250ZXh0MSA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKQorCQkJKChjbWRpb2NiLT5pb2NiLnVuc2xpMy5yY3ZzbGkzLm94X2lkIDw8IDE2KSB8CisJCQljbWRpb2NiLT5pb2NiLnVscENvbnRleHQpKTsgLyogcnhfaWQgKi8KIAkJbWJveC0+Y29udGV4dDIgPSBscGZjX25scF9nZXQobmRscCk7CiAJCW1ib3gtPnZwb3J0ID0gdnBvcnQ7CiAJCW1ib3gtPm1ib3hfY21wbCA9IGxwZmNfZWxzX3JzcF9ybHNfYWNjOwpAQCAtNTMxNCw3ICs1MzMyLDggQEAKIAlwY21kICs9IHNpemVvZih1aW50MzJfdCk7IC8qIFNraXAgcGFzdCBjb21tYW5kICovCiAKIAkvKiB1c2UgdGhlIGNvbW1hbmQncyB4cmkgaW4gdGhlIHJlc3BvbnNlICovCi0JZWxzaW9jYi0+aW9jYi51bHBDb250ZXh0ID0gY21kaW9jYi0+aW9jYi51bHBDb250ZXh0OworCWVsc2lvY2ItPmlvY2IudWxwQ29udGV4dCA9IGNtZGlvY2ItPmlvY2IudWxwQ29udGV4dDsgIC8qIFhyaSAvIHJ4X2lkICovCisJZWxzaW9jYi0+aW9jYi51bnNsaTMucmN2c2xpMy5veF9pZCA9IGNtZGlvY2ItPmlvY2IudW5zbGkzLnJjdnNsaTMub3hfaWQ7CiAKIAlydHZfcnNwID0gKHN0cnVjdCBSVFZfUlNQICopcGNtZDsKIApAQCAtNTM5OSw4ICs1NDE4LDkgQEAKIAkJbWJveCA9IG1lbXBvb2xfYWxsb2MocGhiYS0+bWJveF9tZW1fcG9vbCwgR0ZQX0FUT01JQyk7CiAJCWlmIChtYm94KSB7CiAJCQlscGZjX3JlYWRfbG5rX3N0YXQocGhiYSwgbWJveCk7Ci0JCQltYm94LT5jb250ZXh0MSA9Ci0JCQkgICAgKHZvaWQgKikoKHVuc2lnbmVkIGxvbmcpIGNtZGlvY2ItPmlvY2IudWxwQ29udGV4dCk7CisJCQltYm94LT5jb250ZXh0MSA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKQorCQkJCSgoY21kaW9jYi0+aW9jYi51bnNsaTMucmN2c2xpMy5veF9pZCA8PCAxNikgfAorCQkJCWNtZGlvY2ItPmlvY2IudWxwQ29udGV4dCkpOyAvKiByeF9pZCAqLwogCQkJbWJveC0+Y29udGV4dDIgPSBscGZjX25scF9nZXQobmRscCk7CiAJCQltYm94LT52cG9ydCA9IHZwb3J0OwogCQkJbWJveC0+bWJveF9jbXBsID0gbHBmY19lbHNfcnNwX3Jwc19hY2M7CkBAIC01NTU0LDcgKzU1NzQsOCBAQAogCiAJaWNtZCA9ICZlbHNpb2NiLT5pb2NiOwogCW9sZGNtZCA9ICZvbGRpb2NiLT5pb2NiOwotCWljbWQtPnVscENvbnRleHQgPSBvbGRjbWQtPnVscENvbnRleHQ7CS8qIFhyaSAqLworCWljbWQtPnVscENvbnRleHQgPSBvbGRjbWQtPnVscENvbnRleHQ7CS8qIFhyaSAvIHJ4X2lkICovCisJaWNtZC0+dW5zbGkzLnJjdnNsaTMub3hfaWQgPSBvbGRjbWQtPnVuc2xpMy5yY3ZzbGkzLm94X2lkOwogCiAJcGNtZCA9ICgoKHN0cnVjdCBscGZjX2RtYWJ1ZiAqKSBlbHNpb2NiLT5jb250ZXh0MiktPnZpcnQpOwogCSooKHVpbnQzMl90ICopIChwY21kKSkgPSBFTFNfQ01EX0FDQzsKQEAgLTY1ODYsNyArNjYwNyw3IEBACiB7CiAJc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGk7CisJaW50IGkgPSAwOwogCiAJLyogVGhlIHBoeXNpY2FsIHBvcnRzIGFyZSBhbHdheXMgdnBpIDAgLSB0cmFuc2xhdGUgaXMgdW5uZWNlc3NhcnkuICovCiAJaWYgKHZwaSA+IDApIHsKQEAgLTY2MDksNyArNjYzMCw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcGhiYS0+aGJhbG9jaywgZmxhZ3MpOwogCWxpc3RfZm9yX2VhY2hfZW50cnkodnBvcnQsICZwaGJhLT5wb3J0X2xpc3QsIGxpc3RlbnRyeSkgewotCQlpZiAodnBvcnQtPnZwaSA9PSB2cGkpIHsKKwkJaWYgKHZwb3J0LT52cGkgPT0gaSkgewogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGhiYS0+aGJhbG9jaywgZmxhZ3MpOwogCQkJcmV0dXJuIHZwb3J0OwogCQl9CkBAIC03Nzg3LDYgKzc4MDgsNyBAQAogewogCXVpbnQxNl90IHhyaSA9IGJmX2dldChscGZjX3djcWVfeGFfeHJpLCBheHJpKTsKIAl1aW50MTZfdCByeGlkID0gYmZfZ2V0KGxwZmNfd2NxZV94YV9yZW1vdGVfeGlkLCBheHJpKTsKKwl1aW50MTZfdCBseHJpID0gMDsKIAogCXN0cnVjdCBscGZjX3NnbHEgKnNnbHFfZW50cnkgPSBOVUxMLCAqc2dscV9uZXh0ID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGlmbGFnID0gMDsKQEAgLTc4MTUsNyArNzgzNywxMiBAQAogCQl9CiAJfQogCXNwaW5fdW5sb2NrKCZwaGJhLT5zbGk0X2hiYS5hYnRzX3NnbF9saXN0X2xvY2spOwotCXNnbHFfZW50cnkgPSBfX2xwZmNfZ2V0X2FjdGl2ZV9zZ2xxKHBoYmEsIHhyaSk7CisJbHhyaSA9IGxwZmNfc2xpNF94cmlfaW5yYW5nZShwaGJhLCB4cmkpOworCWlmIChseHJpID09IE5PX1hSSSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwaGJhLT5oYmFsb2NrLCBpZmxhZyk7CisJCXJldHVybjsKKwl9CisJc2dscV9lbnRyeSA9IF9fbHBmY19nZXRfYWN0aXZlX3NnbHEocGhiYSwgbHhyaSk7CiAJaWYgKCFzZ2xxX2VudHJ5IHx8IChzZ2xxX2VudHJ5LT5zbGk0X3hyaXRhZyAhPSB4cmkpKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYmEtPmhiYWxvY2ssIGlmbGFnKTsKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19oYmFkaXNjLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2hiYWRpc2MuYwppbmRleCAxOGQwZGJmLi4wYjQ3YWRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2hiYWRpc2MuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2hiYWRpc2MuYwpAQCAtMTEwOSw2ICsxMTA5LDI4IEBACiAJcmV0dXJuOwogfQogCisvKioKKyAqIGxwZmNfc2xpNF9jbGVhcl9mY2ZfcnJfYm1hc2sKKyAqIEBwaGJhIHBvaW50ZXIgdG8gdGhlIHN0cnVjdCBscGZjX2hiYSBmb3IgdGhpcyBwb3J0LgorICogVGhpcyBmdWNuY3Rpb24gcmVzZXRzIHRoZSByb3VuZCByb2JpbiBiaXQgbWFzayBhbmQgY2xlYXJzIHRoZQorICogZmNmIHByaW9yaXR5IGxpc3QuIFRoZSBsaXN0IGRlbGV0aW9ucyBhcmUgZG9uZSB3aGlsZSBob2xkaW5nIHRoZQorICogaGJhbG9jay4gVGhlIE9OX0xJU1QgZmxhZyBhbmQgdGhlIEZMT0dJX0ZBSUxFRCBmbGFncyBhcmUgY2xlYXJlZAorICogZnJvbSB0aGUgbHBmY19mY2ZfcHJpIHJlY29yZC4KKyAqKi8KK3ZvaWQKK2xwZmNfc2xpNF9jbGVhcl9mY2ZfcnJfYm1hc2soc3RydWN0IGxwZmNfaGJhICpwaGJhKQoreworCXN0cnVjdCBscGZjX2ZjZl9wcmkgKmZjZl9wcmk7CisJc3RydWN0IGxwZmNfZmNmX3ByaSAqbmV4dF9mY2ZfcHJpOworCW1lbXNldChwaGJhLT5mY2YuZmNmX3JyX2JtYXNrLCAwLCBzaXplb2YoKnBoYmEtPmZjZi5mY2ZfcnJfYm1hc2spKTsKKwlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZmNmX3ByaSwgbmV4dF9mY2ZfcHJpLAorCQkJCSZwaGJhLT5mY2YuZmNmX3ByaV9saXN0LCBsaXN0KSB7CisJCWxpc3RfZGVsX2luaXQoJmZjZl9wcmktPmxpc3QpOworCQlmY2ZfcHJpLT5mY2ZfcmVjLmZsYWcgPSAwOworCX0KKwlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworfQogc3RhdGljIHZvaWQKIGxwZmNfbWJ4X2NtcGxfcmVnX2ZjZmkoc3RydWN0IGxwZmNfaGJhICpwaGJhLCBMUEZDX01CT1hRX3QgKm1ib3hxKQogewpAQCAtMTEzMCw3ICsxMTUyLDggQEAKIAlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOwogCiAJLyogSWYgdGhlcmUgaXMgYSBwZW5kaW5nIEZDb0UgZXZlbnQsIHJlc3RhcnQgRkNGIHRhYmxlIHNjYW4uICovCi0JaWYgKGxwZmNfY2hlY2tfcGVuZGluZ19mY29lX2V2ZW50KHBoYmEsIExQRkNfVU5SRUdfRkNGKSkKKwlpZiAoKCEocGhiYS0+aGJhX2ZsYWcgJiBGQ0ZfUlJfSU5QUk9HKSkgJiYKKwkJbHBmY19jaGVja19wZW5kaW5nX2Zjb2VfZXZlbnQocGhiYSwgTFBGQ19VTlJFR19GQ0YpKQogCQlnb3RvIGZhaWxfb3V0OwogCiAJLyogTWFyayBzdWNjZXNzZnVsIGNvbXBsZXRpb24gb2YgRkNGIHRhYmxlIHNjYW4gKi8KQEAgLTEyNTAsNiArMTI3MywzMCBAQAogfQogCiAvKioKKyAqIGxwZmNfdXBkYXRlX2ZjZl9yZWNvcmQgLSBVcGRhdGUgZHJpdmVyIGZjZiByZWNvcmQKKyAqIF9fbHBmY191cGRhdGVfZmNmX3JlY29yZF9wcmkgLSB1cGRhdGUgdGhlIGxwZmNfZmNmX3ByaSByZWNvcmQuCisgKiBAcGhiYTogcG9pbnRlciB0byBscGZjIGhiYSBkYXRhIHN0cnVjdHVyZS4KKyAqIEBmY2ZfaW5kZXg6IEluZGV4IGZvciB0aGUgbHBmY19mY2ZfcmVjb3JkLgorICogQG5ld19mY2ZfcmVjb3JkOiBwb2ludGVyIHRvIGhiYSBmY2YgcmVjb3JkLgorICoKKyAqIFRoaXMgcm91dGluZSB1cGRhdGVzIHRoZSBkcml2ZXIgRkNGIHByaW9yaXR5IHJlY29yZCBmcm9tIHRoZSBuZXcgSEJBIEZDRgorICogcmVjb3JkLiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdpdGggdGhlIGhvc3QgbG9jayBoZWxkLgorICoqLworc3RhdGljIHZvaWQKK19fbHBmY191cGRhdGVfZmNmX3JlY29yZF9wcmkoc3RydWN0IGxwZmNfaGJhICpwaGJhLCB1aW50MTZfdCBmY2ZfaW5kZXgsCisJCQkJIHN0cnVjdCBmY2ZfcmVjb3JkICpuZXdfZmNmX3JlY29yZAorCQkJCSApCit7CisJc3RydWN0IGxwZmNfZmNmX3ByaSAqZmNmX3ByaTsKKworCWZjZl9wcmkgPSAmcGhiYS0+ZmNmLmZjZl9wcmlbZmNmX2luZGV4XTsKKwlmY2ZfcHJpLT5mY2ZfcmVjLmZjZl9pbmRleCA9IGZjZl9pbmRleDsKKwkvKiBGQ0YgcmVjb3JkIHByaW9yaXR5ICovCisJZmNmX3ByaS0+ZmNmX3JlYy5wcmlvcml0eSA9IG5ld19mY2ZfcmVjb3JkLT5maXBfcHJpb3JpdHk7CisKK30KKworLyoqCiAgKiBscGZjX2NvcHlfZmNmX3JlY29yZCAtIENvcHkgZmNmIGluZm9ybWF0aW9uIHRvIGxwZmNfaGJhLgogICogQGZjZjogcG9pbnRlciB0byBkcml2ZXIgZmNmIHJlY29yZC4KICAqIEBuZXdfZmNmX3JlY29yZDogcG9pbnRlciB0byBmY2YgcmVjb3JkLgpAQCAtMTMzMiw2ICsxMzc5LDkgQEAKIAlmY2ZfcmVjLT5hZGRyX21vZGUgPSBhZGRyX21vZGU7CiAJZmNmX3JlYy0+dmxhbl9pZCA9IHZsYW5faWQ7CiAJZmNmX3JlYy0+ZmxhZyB8PSAoZmxhZyB8IFJFQ09SRF9WQUxJRCk7CisJX19scGZjX3VwZGF0ZV9mY2ZfcmVjb3JkX3ByaShwaGJhLAorCQliZl9nZXQobHBmY19mY2ZfcmVjb3JkX2ZjZl9pbmRleCwgbmV3X2ZjZl9yZWNvcmQpLAorCQkJCSBuZXdfZmNmX3JlY29yZCk7CiB9CiAKIC8qKgpAQCAtMTgzNCw2ICsxODg0LDggQEAKIAkJcmV0dXJuIGZhbHNlOwogCWlmICghbHBmY19mYWJfbmFtZV9tYXRjaChmY2ZfcmVjLT5mYWJyaWNfbmFtZSwgbmV3X2ZjZl9yZWNvcmQpKQogCQlyZXR1cm4gZmFsc2U7CisJaWYgKGZjZl9yZWMtPnByaW9yaXR5ICE9IG5ld19mY2ZfcmVjb3JkLT5maXBfcHJpb3JpdHkpCisJCXJldHVybiBmYWxzZTsKIAlyZXR1cm4gdHJ1ZTsKIH0KIApAQCAtMTg5Nyw2ICsxOTQ5LDE1MiBAQAogfQogCiAvKioKKyAqIGxwZmNfc2xpNF9mY2ZfcHJpX2xpc3RfZGVsCisgKiBAcGhiYTogcG9pbnRlciB0byBscGZjIGhiYSBkYXRhIHN0cnVjdHVyZS4KKyAqIEBmY2ZfaW5kZXggdGhlIGluZGV4IG9mIHRoZSBmY2YgcmVjb3JkIHRvIGRlbGV0ZQorICogVGhpcyByb3V0aW5lIGNoZWNrcyB0aGUgb24gbGlzdCBmbGFnIG9mIHRoZSBmY2ZfaW5kZXggdG8gYmUgZGVsZXRlZC4KKyAqIElmIGl0IGlzIG9uZSB0aGUgbGlzdCB0aGVuIGl0IGlzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCwgYW5kIHRoZSBmbGFnCisgKiBpcyBjbGVhcmVkLiBUaGlzIHJvdXRpbmUgZ3JhYiB0aGUgaGJhbG9jayBiZWZvcmUgcmVtb3ZpbmcgdGhlIGZjZgorICogcmVjb3JkIGZyb20gdGhlIGxpc3QuCisgKiovCitzdGF0aWMgdm9pZCBscGZjX3NsaTRfZmNmX3ByaV9saXN0X2RlbChzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsCisJCQl1aW50MTZfdCBmY2ZfaW5kZXgpCit7CisJc3RydWN0IGxwZmNfZmNmX3ByaSAqbmV3X2ZjZl9wcmk7CisKKwluZXdfZmNmX3ByaSA9ICZwaGJhLT5mY2YuZmNmX3ByaVtmY2ZfaW5kZXhdOworCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19GSVAsCisJCSIzMDU4IGRlbGV0aW5nIGlkeCB4JXggcHJpIHgleCBmbGcgeCV4XG4iLAorCQlmY2ZfaW5kZXgsIG5ld19mY2ZfcHJpLT5mY2ZfcmVjLnByaW9yaXR5LAorCQkgbmV3X2ZjZl9wcmktPmZjZl9yZWMuZmxhZyk7CisJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJaWYgKG5ld19mY2ZfcHJpLT5mY2ZfcmVjLmZsYWcgJiBMUEZDX0ZDRl9PTl9QUklfTElTVCkgeworCQlpZiAocGhiYS0+ZmNmLmN1cnJlbnRfcmVjLnByaW9yaXR5ID09CisJCQkJbmV3X2ZjZl9wcmktPmZjZl9yZWMucHJpb3JpdHkpCisJCQlwaGJhLT5mY2YuZWxpZ2libGVfZmNmX2NudC0tOworCQlsaXN0X2RlbF9pbml0KCZuZXdfZmNmX3ByaS0+bGlzdCk7CisJCW5ld19mY2ZfcHJpLT5mY2ZfcmVjLmZsYWcgJj0gfkxQRkNfRkNGX09OX1BSSV9MSVNUOworCX0KKwlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworfQorCisvKioKKyAqIGxwZmNfc2xpNF9zZXRfZmNmX2Zsb2dpX2ZhaWwKKyAqIEBwaGJhOiBwb2ludGVyIHRvIGxwZmMgaGJhIGRhdGEgc3RydWN0dXJlLgorICogQGZjZl9pbmRleCB0aGUgaW5kZXggb2YgdGhlIGZjZiByZWNvcmQgdG8gdXBkYXRlCisgKiBUaGlzIHJvdXRpbmUgYWNxdWlyZXMgdGhlIGhiYWxvY2sgYW5kIHRoZW4gc2V0IHRoZSBMUEZDX0ZDRl9GTE9HSV9GQUlMRUQKKyAqIGZsYWcgc28gdGhlIHRoZSByb3VuZCByb2JpbiBzbGVjdGlvbiBmb3IgdGhlIHBhcnRpY3VsYXIgcHJpb3JpdHkgbGV2ZWwKKyAqIHdpbGwgdHJ5IGEgZGlmZmVyZW50IGZjZiByZWNvcmQgdGhhdCBkb2VzIG5vdCBoYXZlIHRoaXMgYml0IHNldC4KKyAqIElmIHRoZSBmY2YgcmVjb3JkIGlzIHJlLXJlYWQgZm9yIGFueSByZWFzb24gdGhpcyBmbGFnIGlzIGNsZWFyZWQgYnJmb3JlCisgKiBhZGRpbmcgaXQgdG8gdGhlIHByaW9yaXR5IGxpc3QuCisgKiovCit2b2lkCitscGZjX3NsaTRfc2V0X2ZjZl9mbG9naV9mYWlsKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgdWludDE2X3QgZmNmX2luZGV4KQoreworCXN0cnVjdCBscGZjX2ZjZl9wcmkgKm5ld19mY2ZfcHJpOworCW5ld19mY2ZfcHJpID0gJnBoYmEtPmZjZi5mY2ZfcHJpW2ZjZl9pbmRleF07CisJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJbmV3X2ZjZl9wcmktPmZjZl9yZWMuZmxhZyB8PSBMUEZDX0ZDRl9GTE9HSV9GQUlMRUQ7CisJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKK30KKworLyoqCisgKiBscGZjX3NsaTRfZmNmX3ByaV9saXN0X2FkZAorICogQHBoYmE6IHBvaW50ZXIgdG8gbHBmYyBoYmEgZGF0YSBzdHJ1Y3R1cmUuCisgKiBAZmNmX2luZGV4IHRoZSBpbmRleCBvZiB0aGUgZmNmIHJlY29yZCB0byBhZGQKKyAqIFRoaXMgcm91dGluZSBjaGVja3MgdGhlIHByaW9yaXR5IG9mIHRoZSBmY2ZfaW5kZXggdG8gYmUgYWRkZWQuCisgKiBJZiBpdCBpcyBhIGxvd2VyIHByaW9yaXR5IHRoYW4gdGhlIGN1cnJlbnQgaGVhZCBvZiB0aGUgZmNmX3ByaSBsaXN0CisgKiB0aGVuIGl0IGlzIGFkZGVkIHRvIHRoZSBsaXN0IGluIHRoZSByaWdodCBvcmRlci4KKyAqIElmIGl0IGlzIHRoZSBzYW1lIHByaW9yaXR5IGFzIHRoZSBjdXJyZW50IGhlYWQgb2YgdGhlIGxpc3QgdGhlbiBpdAorICogaXMgYWRkZWQgdG8gdGhlIGhlYWQgb2YgdGhlIGxpc3QgYW5kIGl0cyBiaXQgaW4gdGhlIHJyX2JtYXNrIGlzIHNldC4KKyAqIElmIHRoZSBmY2ZfaW5kZXggdG8gYmUgYWRkZWQgaXMgb2YgYSBoaWdoZXIgcHJpb3JpdHkgdGhhbiB0aGUgY3VycmVudAorICogaGVhZCBvZiB0aGUgbGlzdCB0aGVuIHRoZSBycl9ibWFzayBpcyBjbGVhcmVkLCBpdHMgYml0IGlzIHNldCBpbiB0aGUKKyAqIHJyX2JtYXNrIGFuZCBpdCBpcyBhZGRlZCB0byB0aGUgaGVhZCBvZiB0aGUgbGlzdC4KKyAqIHJldHVybnM6CisgKiAwPXN1Y2Nlc3MgMT1mYWlsdXJlCisgKiovCitpbnQgbHBmY19zbGk0X2ZjZl9wcmlfbGlzdF9hZGQoc3RydWN0IGxwZmNfaGJhICpwaGJhLCB1aW50MTZfdCBmY2ZfaW5kZXgsCisJc3RydWN0IGZjZl9yZWNvcmQgKm5ld19mY2ZfcmVjb3JkKQoreworCXVpbnQxNl90IGN1cnJlbnRfZmNmX3ByaTsKKwl1aW50MTZfdCBsYXN0X2luZGV4OworCXN0cnVjdCBscGZjX2ZjZl9wcmkgKmZjZl9wcmk7CisJc3RydWN0IGxwZmNfZmNmX3ByaSAqbmV4dF9mY2ZfcHJpOworCXN0cnVjdCBscGZjX2ZjZl9wcmkgKm5ld19mY2ZfcHJpOworCWludCByZXQ7CisKKwluZXdfZmNmX3ByaSA9ICZwaGJhLT5mY2YuZmNmX3ByaVtmY2ZfaW5kZXhdOworCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19GSVAsCisJCSIzMDU5IGFkZGluZyBpZHggeCV4IHByaSB4JXggZmxnIHgleFxuIiwKKwkJZmNmX2luZGV4LCBuZXdfZmNmX3JlY29yZC0+ZmlwX3ByaW9yaXR5LAorCQkgbmV3X2ZjZl9wcmktPmZjZl9yZWMuZmxhZyk7CisJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJaWYgKG5ld19mY2ZfcHJpLT5mY2ZfcmVjLmZsYWcgJiBMUEZDX0ZDRl9PTl9QUklfTElTVCkKKwkJbGlzdF9kZWxfaW5pdCgmbmV3X2ZjZl9wcmktPmxpc3QpOworCW5ld19mY2ZfcHJpLT5mY2ZfcmVjLmZjZl9pbmRleCA9IGZjZl9pbmRleDsKKwluZXdfZmNmX3ByaS0+ZmNmX3JlYy5wcmlvcml0eSA9IG5ld19mY2ZfcmVjb3JkLT5maXBfcHJpb3JpdHk7CisJaWYgKGxpc3RfZW1wdHkoJnBoYmEtPmZjZi5mY2ZfcHJpX2xpc3QpKSB7CisJCWxpc3RfYWRkKCZuZXdfZmNmX3ByaS0+bGlzdCwgJnBoYmEtPmZjZi5mY2ZfcHJpX2xpc3QpOworCQlyZXQgPSBscGZjX3NsaTRfZmNmX3JyX2luZGV4X3NldChwaGJhLAorCQkJCW5ld19mY2ZfcHJpLT5mY2ZfcmVjLmZjZl9pbmRleCk7CisJCWdvdG8gb3V0OworCX0KKworCWxhc3RfaW5kZXggPSBmaW5kX2ZpcnN0X2JpdChwaGJhLT5mY2YuZmNmX3JyX2JtYXNrLAorCQkJCUxQRkNfU0xJNF9GQ0ZfVEJMX0lORFhfTUFYKTsKKwlpZiAobGFzdF9pbmRleCA+PSBMUEZDX1NMSTRfRkNGX1RCTF9JTkRYX01BWCkgeworCQlyZXQgPSAwOyAvKiBFbXB0eSByciBsaXN0ICovCisJCWdvdG8gb3V0OworCX0KKwljdXJyZW50X2ZjZl9wcmkgPSBwaGJhLT5mY2YuZmNmX3ByaVtsYXN0X2luZGV4XS5mY2ZfcmVjLnByaW9yaXR5OworCWlmIChuZXdfZmNmX3ByaS0+ZmNmX3JlYy5wcmlvcml0eSA8PSAgY3VycmVudF9mY2ZfcHJpKSB7CisJCWxpc3RfYWRkKCZuZXdfZmNmX3ByaS0+bGlzdCwgJnBoYmEtPmZjZi5mY2ZfcHJpX2xpc3QpOworCQlpZiAobmV3X2ZjZl9wcmktPmZjZl9yZWMucHJpb3JpdHkgPCAgY3VycmVudF9mY2ZfcHJpKSB7CisJCQltZW1zZXQocGhiYS0+ZmNmLmZjZl9ycl9ibWFzaywgMCwKKwkJCQlzaXplb2YoKnBoYmEtPmZjZi5mY2ZfcnJfYm1hc2spKTsKKwkJCS8qIGZjZnNfYXRfdGhpc19wcmlvcml0eV9sZXZlbCA9IDE7ICovCisJCQlwaGJhLT5mY2YuZWxpZ2libGVfZmNmX2NudCA9IDE7CisJCX0gZWxzZQorCQkJLyogZmNmc19hdF90aGlzX3ByaW9yaXR5X2xldmVsKys7ICovCisJCQlwaGJhLT5mY2YuZWxpZ2libGVfZmNmX2NudCsrOworCQlyZXQgPSBscGZjX3NsaTRfZmNmX3JyX2luZGV4X3NldChwaGJhLAorCQkJCW5ld19mY2ZfcHJpLT5mY2ZfcmVjLmZjZl9pbmRleCk7CisJCWdvdG8gb3V0OworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShmY2ZfcHJpLCBuZXh0X2ZjZl9wcmksCisJCQkJJnBoYmEtPmZjZi5mY2ZfcHJpX2xpc3QsIGxpc3QpIHsKKwkJaWYgKG5ld19mY2ZfcHJpLT5mY2ZfcmVjLnByaW9yaXR5IDw9CisJCQkJZmNmX3ByaS0+ZmNmX3JlYy5wcmlvcml0eSkgeworCQkJaWYgKGZjZl9wcmktPmxpc3QucHJldiA9PSAmcGhiYS0+ZmNmLmZjZl9wcmlfbGlzdCkKKwkJCQlsaXN0X2FkZCgmbmV3X2ZjZl9wcmktPmxpc3QsCisJCQkJCQkmcGhiYS0+ZmNmLmZjZl9wcmlfbGlzdCk7CisJCQllbHNlCisJCQkJbGlzdF9hZGQoJm5ld19mY2ZfcHJpLT5saXN0LAorCQkJCQkgJigoc3RydWN0IGxwZmNfZmNmX3ByaSAqKQorCQkJCQlmY2ZfcHJpLT5saXN0LnByZXYpLT5saXN0KTsKKwkJCXJldCA9IDA7CisJCQlnb3RvIG91dDsKKwkJfSBlbHNlIGlmIChmY2ZfcHJpLT5saXN0Lm5leHQgPT0gJnBoYmEtPmZjZi5mY2ZfcHJpX2xpc3QKKwkJCXx8IG5ld19mY2ZfcHJpLT5mY2ZfcmVjLnByaW9yaXR5IDwKKwkJCQluZXh0X2ZjZl9wcmktPmZjZl9yZWMucHJpb3JpdHkpIHsKKwkJCWxpc3RfYWRkKCZuZXdfZmNmX3ByaS0+bGlzdCwgJmZjZl9wcmktPmxpc3QpOworCQkJcmV0ID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChuZXdfZmNmX3ByaS0+ZmNmX3JlYy5wcmlvcml0eSA+IGZjZl9wcmktPmZjZl9yZWMucHJpb3JpdHkpCisJCQljb250aW51ZTsKKworCX0KKwlyZXQgPSAxOworb3V0OgorCS8qIHdlIHVzZSA9IGluc3RlYWQgb2YgfD0gdG8gY2xlYXIgdGhlIEZMT0dJX0ZBSUxFRCBmbGFnLiAqLworCW5ld19mY2ZfcHJpLT5mY2ZfcmVjLmZsYWcgPSBMUEZDX0ZDRl9PTl9QUklfTElTVDsKKwlzcGluX3VubG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qKgogICogbHBmY19tYnhfY21wbF9mY2Zfc2Nhbl9yZWFkX2ZjZl9yZWMgLSBmY2Ygc2NhbiByZWFkX2ZjZiBtYm94IGNtcGwgaGFuZGxlci4KICAqIEBwaGJhOiBwb2ludGVyIHRvIGxwZmMgaGJhIGRhdGEgc3RydWN0dXJlLgogICogQG1ib3hxOiBwb2ludGVyIHRvIG1haWxib3ggb2JqZWN0LgpAQCAtMTk1OCw2ICsyMTU2LDkgQEAKIAkgKiByZWNvcmQgZm9yIHJvdW5kcm9iaW4gRkNGIGZhaWxvdmVyLgogCSAqLwogCWlmICghcmMpIHsKKwkJbHBmY19zbGk0X2ZjZl9wcmlfbGlzdF9kZWwocGhiYSwKKwkJCQkJYmZfZ2V0KGxwZmNfZmNmX3JlY29yZF9mY2ZfaW5kZXgsCisJCQkJCSAgICAgICBuZXdfZmNmX3JlY29yZCkpOwogCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLCBMT0dfRklQLAogCQkJCSIyNzgxIEZDRiAoeCV4KSBmYWlsZWQgY29ubmVjdGlvbiAiCiAJCQkJImxpc3QgY2hlY2s6ICh4JXgveCV4KVxuIiwKQEAgLTIwMDUsNyArMjIwNiw4IEBACiAJCWdvdG8gcmVhZF9uZXh0X2ZjZjsKIAl9IGVsc2UgewogCQlmY2ZfaW5kZXggPSBiZl9nZXQobHBmY19mY2ZfcmVjb3JkX2ZjZl9pbmRleCwgbmV3X2ZjZl9yZWNvcmQpOwotCQlyYyA9IGxwZmNfc2xpNF9mY2ZfcnJfaW5kZXhfc2V0KHBoYmEsIGZjZl9pbmRleCk7CisJCXJjID0gbHBmY19zbGk0X2ZjZl9wcmlfbGlzdF9hZGQocGhiYSwgZmNmX2luZGV4LAorCQkJCQkJCW5ld19mY2ZfcmVjb3JkKTsKIAkJaWYgKHJjKQogCQkJZ290byByZWFkX25leHRfZmNmOwogCX0KQEAgLTIwMTgsNyArMjIyMCw4IEBACiAJICovCiAJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CiAJaWYgKHBoYmEtPmZjZi5mY2ZfZmxhZyAmIEZDRl9JTl9VU0UpIHsKLQkJaWYgKGxwZmNfc2xpNF9mY2ZfcmVjb3JkX21hdGNoKHBoYmEsICZwaGJhLT5mY2YuY3VycmVudF9yZWMsCisJCWlmIChwaGJhLT5jZmdfZmNmX2ZhaWxvdmVyX3BvbGljeSA9PSBMUEZDX0ZDRl9GT1YgJiYKKwkJCWxwZmNfc2xpNF9mY2ZfcmVjb3JkX21hdGNoKHBoYmEsICZwaGJhLT5mY2YuY3VycmVudF9yZWMsCiAJCSAgICBuZXdfZmNmX3JlY29yZCwgdmxhbl9pZCkpIHsKIAkJCWlmIChiZl9nZXQobHBmY19mY2ZfcmVjb3JkX2ZjZl9pbmRleCwgbmV3X2ZjZl9yZWNvcmQpID09CiAJCQkgICAgcGhiYS0+ZmNmLmN1cnJlbnRfcmVjLmZjZl9pbmR4KSB7CkBAIC0yMjMyLDcgKzI0MzUsOCBAQAogCQkJICAgIChwaGJhLT5mY2YuZmNmX2ZsYWcgJiBGQ0ZfUkVESVNDX1BFTkQpKQogCQkJCXJldHVybjsKIAotCQkJaWYgKHBoYmEtPmZjZi5mY2ZfZmxhZyAmIEZDRl9JTl9VU0UpIHsKKwkJCWlmIChwaGJhLT5jZmdfZmNmX2ZhaWxvdmVyX3BvbGljeSA9PSBMUEZDX0ZDRl9GT1YgJiYKKwkJCQlwaGJhLT5mY2YuZmNmX2ZsYWcgJiBGQ0ZfSU5fVVNFKSB7CiAJCQkJLyoKIAkJCQkgKiBJbiBjYXNlIHRoZSBjdXJyZW50IGluLXVzZSBGQ0YgcmVjb3JkIG5vCiAJCQkJICogbG9uZ2VyIGV4aXN0ZWQgZHVyaW5nIEZDRiBkaXNjb3ZlcnkgdGhhdApAQCAtMjI0Nyw3ICsyNDUxLDYgQEAKIAkJCQlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKIAkJCQlwaGJhLT5mY2YuZmNmX2ZsYWcgfD0gRkNGX1JFRElTQ19GT1Y7CiAJCQkJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKLQkJCQlscGZjX3NsaTRfbWJveF9jbWRfZnJlZShwaGJhLCBtYm94cSk7CiAJCQkJbHBmY19zbGk0X2ZjZl9zY2FuX3JlYWRfZmNmX3JlYyhwaGJhLAogCQkJCQkJTFBGQ19GQ09FX0ZDRl9HRVRfRklSU1QpOwogCQkJCXJldHVybjsKQEAgLTI0MjQsNyArMjYyNyw4IEBACiAKIAkvKiBVcGRhdGUgdGhlIGVsaWdpYmxlIEZDRiByZWNvcmQgaW5kZXggYm1hc2sgKi8KIAlmY2ZfaW5kZXggPSBiZl9nZXQobHBmY19mY2ZfcmVjb3JkX2ZjZl9pbmRleCwgbmV3X2ZjZl9yZWNvcmQpOwotCXJjID0gbHBmY19zbGk0X2ZjZl9ycl9pbmRleF9zZXQocGhiYSwgZmNmX2luZGV4KTsKKworCXJjID0gbHBmY19zbGk0X2ZjZl9wcmlfbGlzdF9hZGQocGhiYSwgZmNmX2luZGV4LCBuZXdfZmNmX3JlY29yZCk7CiAKIG91dDoKIAlscGZjX3NsaTRfbWJveF9jbWRfZnJlZShwaGJhLCBtYm94cSk7CkBAIC0yNjQ1LDYgKzI4NDksNyBAQAogCXZwb3J0LT52cGlfc3RhdGUgfD0gTFBGQ19WUElfUkVHSVNURVJFRDsKIAl2cG9ydC0+ZmNfZmxhZyB8PSBGQ19WRklfUkVHSVNURVJFRDsKIAl2cG9ydC0+ZmNfZmxhZyAmPSB+RkNfVlBPUlRfTkVFRFNfUkVHX1ZQSTsKKwl2cG9ydC0+ZmNfZmxhZyAmPSB+RkNfVlBPUlRfTkVFRFNfSU5JVF9WUEk7CiAJc3Bpbl91bmxvY2tfaXJxKHNob3N0LT5ob3N0X2xvY2spOwogCiAJaWYgKHZwb3J0LT5wb3J0X3N0YXRlID09IExQRkNfRkFCUklDX0NGR19MSU5LKSB7CkBAIC0yODkzLDggKzMwOTgsNyBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAkJLyogUmVzZXQgRkNGIHJvdW5kcm9iaW4gYm1hc2sgZm9yIG5ldyBkaXNjb3ZlcnkgKi8KLQkJbWVtc2V0KHBoYmEtPmZjZi5mY2ZfcnJfYm1hc2ssIDAsCi0JCSAgICAgICBzaXplb2YoKnBoYmEtPmZjZi5mY2ZfcnJfYm1hc2spKTsKKwkJbHBmY19zbGk0X2NsZWFyX2ZjZl9ycl9ibWFzayhwaGJhKTsKIAl9CiAKIAlyZXR1cm47CkBAIC01NTkyLDcgKzU3OTYsNyBAQAogCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CiAKIAkvKiBSZXNldCBGQ0Ygcm91bmRyb2JpbiBibWFzayBmb3IgbmV3IGRpc2NvdmVyeSAqLwotCW1lbXNldChwaGJhLT5mY2YuZmNmX3JyX2JtYXNrLCAwLCBzaXplb2YoKnBoYmEtPmZjZi5mY2ZfcnJfYm1hc2spKTsKKwlscGZjX3NsaTRfY2xlYXJfZmNmX3JyX2JtYXNrKHBoYmEpOwogCiAJcmMgPSBscGZjX3NsaTRfZmNmX3NjYW5fcmVhZF9mY2ZfcmVjKHBoYmEsIExQRkNfRkNPRV9GQ0ZfR0VUX0ZJUlNUKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ody5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19ody5oCmluZGV4IGFiNGM0ZDYuLjA0NmVkYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaHcuaAorKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2h3LmgKQEAgLTM0NzAsMTEgKzM0NzAsMTYgQEAKICAgIG9yIENNRF9JT0NCX1JDVl9TRVE2NF9DWCAoMHhCNSkgKi8KIAogc3RydWN0IHJjdl9zbGkzIHsKLQl1aW50MzJfdCB3b3JkOFJzdmQ7CiAjaWZkZWYgX19CSUdfRU5ESUFOX0JJVEZJRUxECisJdWludDE2X3Qgb3hfaWQ7CisJdWludDE2X3Qgc2VxX2NudDsKKwogCXVpbnQxNl90IHZwaTsKIAl1aW50MTZfdCB3b3JkOVJzdmQ7CiAjZWxzZSAgLyogIF9fTElUVExFX0VORElBTiAqLworCXVpbnQxNl90IHNlcV9jbnQ7CisJdWludDE2X3Qgb3hfaWQ7CisKIAl1aW50MTZfdCB3b3JkOVJzdmQ7CiAJdWludDE2X3QgdnBpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2h3NC5oIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19odzQuaAppbmRleCAxMWUyNmEyLi43ZjgwMDNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX2h3NC5oCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaHc0LmgKQEAgLTE3MCwxNSArMTcwLDggQEAKICNkZWZpbmUgTFBGQ19QQ0lfRlVOQzMJCTMKICNkZWZpbmUgTFBGQ19QQ0lfRlVOQzQJCTQKIAotLyogU0xJNCBpbnRlcmZhY2UgdHlwZS0yIGNvbnRyb2wgcmVnaXN0ZXIgb2Zmc2V0cyAqLwotI2RlZmluZSBMUEZDX0NUTF9QT1JUX1NFTV9PRkZTRVQJMHg0MDAKLSNkZWZpbmUgTFBGQ19DVExfUE9SVF9TVEFfT0ZGU0VUCTB4NDA0Ci0jZGVmaW5lIExQRkNfQ1RMX1BPUlRfQ1RMX09GRlNFVAkweDQwOAotI2RlZmluZSBMUEZDX0NUTF9QT1JUX0VSMV9PRkZTRVQJMHg0MEMKLSNkZWZpbmUgTFBGQ19DVExfUE9SVF9FUjJfT0ZGU0VUCTB4NDEwCisvKiBTTEk0IGludGVyZmFjZSB0eXBlLTIgUERFVl9DVEwgcmVnaXN0ZXIgKi8KICNkZWZpbmUgTFBGQ19DVExfUERFVl9DVExfT0ZGU0VUCTB4NDE0Ci0KLS8qIFNvbWUgU0xJNCBpbnRlcmZhY2UgdHlwZS0yIFBERVZfQ1RMIHJlZ2lzdGVyIGJpdHMgKi8KICNkZWZpbmUgTFBGQ19DVExfUERFVl9DVExfRFJTVAkJMHgwMDAwMDAwMQogI2RlZmluZSBMUEZDX0NUTF9QREVWX0NUTF9GUlNUCQkweDAwMDAwMDAyCiAjZGVmaW5lIExQRkNfQ1RMX1BERVZfQ1RMX0RECQkweDAwMDAwMDA0CkBAIC0zMzcsNiArMzMwLDcgQEAKICNkZWZpbmUgQ1FFX0NPREVfUkVMRUFTRV9XUUUJCTB4MgogI2RlZmluZSBDUUVfQ09ERV9SRUNFSVZFCQkweDQKICNkZWZpbmUgQ1FFX0NPREVfWFJJX0FCT1JURUQJCTB4NQorI2RlZmluZSBDUUVfQ09ERV9SRUNFSVZFX1YxCQkweDkKIAogLyogY29tcGxldGlvbiBxdWV1ZSBlbnRyeSBmb3Igd3FlIGNvbXBsZXRpb25zICovCiBzdHJ1Y3QgbHBmY193Y3FlX2NvbXBsZXRlIHsKQEAgLTQ0MCw3ICs0MzQsMTAgQEAKICNkZWZpbmUgRkNfU1RBVFVTX1JRX0JVRl9MRU5fRVhDRUVERUQgCTB4MTEgLyogcGF5bG9hZCB0cnVuY2F0ZWQgKi8KICNkZWZpbmUgRkNfU1RBVFVTX0lOU1VGRl9CVUZfTkVFRF9CVUYgCTB4MTIgLyogSW5zdWZmaWNpZW50IGJ1ZmZlcnMgKi8KICNkZWZpbmUgRkNfU1RBVFVTX0lOU1VGRl9CVUZfRlJNX0RJU0MgCTB4MTMgLyogRnJhbWUgRGlzY2FyZCAqLwotCXVpbnQzMl90IHJlc2VydmVkMTsKKwl1aW50MzJfdCB3b3JkMTsKKyNkZWZpbmUgbHBmY19yY3FlX2ZjZl9pZF92MV9TSElGVAkwCisjZGVmaW5lIGxwZmNfcmNxZV9mY2ZfaWRfdjFfTUFTSwkweDAwMDAwMDNGCisjZGVmaW5lIGxwZmNfcmNxZV9mY2ZfaWRfdjFfV09SRAl3b3JkMQogCXVpbnQzMl90IHdvcmQyOwogI2RlZmluZSBscGZjX3JjcWVfbGVuZ3RoX1NISUZUCQkxNgogI2RlZmluZSBscGZjX3JjcWVfbGVuZ3RoX01BU0sJCTB4MDAwMEZGRkYKQEAgLTQ1MSw2ICs0NDgsOSBAQAogI2RlZmluZSBscGZjX3JjcWVfZmNmX2lkX1NISUZUCQkwCiAjZGVmaW5lIGxwZmNfcmNxZV9mY2ZfaWRfTUFTSwkJMHgwMDAwMDAzRgogI2RlZmluZSBscGZjX3JjcWVfZmNmX2lkX1dPUkQJCXdvcmQyCisjZGVmaW5lIGxwZmNfcmNxZV9ycV9pZF92MV9TSElGVAkwCisjZGVmaW5lIGxwZmNfcmNxZV9ycV9pZF92MV9NQVNLCQkweDAwMDBGRkZGCisjZGVmaW5lIGxwZmNfcmNxZV9ycV9pZF92MV9XT1JECQl3b3JkMgogCXVpbnQzMl90IHdvcmQzOwogI2RlZmluZSBscGZjX3JjcWVfdmFsaWRfU0hJRlQJCWxwZmNfY3FlX3ZhbGlkX1NISUZUCiAjZGVmaW5lIGxwZmNfcmNxZV92YWxpZF9NQVNLCQlscGZjX2NxZV92YWxpZF9NQVNLCkBAIC01MTUsNyArNTE1LDcgQEAKIC8qIFRoZSBmb2xsb3dpbmcgQkFSMCByZWdpc3RlciBzZXRzIGFyZSBkZWZpbmVkIGZvciBpZl90eXBlIDAgYW5kIDIgVUNOQXMuICovCiAjZGVmaW5lIExQRkNfU0xJX0lOVEYJCQkweDAwNTgKIAotI2RlZmluZSBMUEZDX1NMSVBPUlRfSUYyX1NNUEhSCQkweDA0MDAKKyNkZWZpbmUgTFBGQ19DVExfUE9SVF9TRU1fT0ZGU0VUCTB4NDAwCiAjZGVmaW5lIGxwZmNfcG9ydF9zbXBocl9wZXJyX1NISUZUCTMxCiAjZGVmaW5lIGxwZmNfcG9ydF9zbXBocl9wZXJyX01BU0sJMHgxCiAjZGVmaW5lIGxwZmNfcG9ydF9zbXBocl9wZXJyX1dPUkQJd29yZDAKQEAgLTU3NSw3ICs1NzUsNyBAQAogI2RlZmluZSBMUEZDX1BPU1RfU1RBR0VfUE9SVF9SRUFEWQkJCTB4QzAwMAogI2RlZmluZSBMUEZDX1BPU1RfU1RBR0VfUE9SVF9VRSAJCQkweEYwMDAKIAotI2RlZmluZSBMUEZDX1NMSVBPUlRfU1RBVFVTCQkweDA0MDQKKyNkZWZpbmUgTFBGQ19DVExfUE9SVF9TVEFfT0ZGU0VUCTB4NDA0CiAjZGVmaW5lIGxwZmNfc2xpcG9ydF9zdGF0dXNfZXJyX1NISUZUCTMxCiAjZGVmaW5lIGxwZmNfc2xpcG9ydF9zdGF0dXNfZXJyX01BU0sJMHgxCiAjZGVmaW5lIGxwZmNfc2xpcG9ydF9zdGF0dXNfZXJyX1dPUkQJd29yZDAKQEAgLTU5Myw3ICs1OTMsNyBAQAogI2RlZmluZSBscGZjX3NsaXBvcnRfc3RhdHVzX3JkeV9XT1JECXdvcmQwCiAjZGVmaW5lIE1BWF9JRl9UWVBFXzJfUkVTRVRTCTEwMDAKIAotI2RlZmluZSBMUEZDX1NMSVBPUlRfQ05UUkwJCTB4MDQwOAorI2RlZmluZSBMUEZDX0NUTF9QT1JUX0NUTF9PRkZTRVQJMHg0MDgKICNkZWZpbmUgbHBmY19zbGlwb3J0X2N0cmxfZW5kX1NISUZUCTMwCiAjZGVmaW5lIGxwZmNfc2xpcG9ydF9jdHJsX2VuZF9NQVNLCTB4MQogI2RlZmluZSBscGZjX3NsaXBvcnRfY3RybF9lbmRfV09SRAl3b3JkMApAQCAtNjA0LDggKzYwNCw4IEBACiAjZGVmaW5lIGxwZmNfc2xpcG9ydF9jdHJsX2lwX1dPUkQJd29yZDAKICNkZWZpbmUgTFBGQ19TTElQT1JUX0lOSVRfUE9SVAkxCiAKLSNkZWZpbmUgTFBGQ19TTElQT1JUX0VSUl8xCQkweDA0MEMKLSNkZWZpbmUgTFBGQ19TTElQT1JUX0VSUl8yCQkweDA0MTAKKyNkZWZpbmUgTFBGQ19DVExfUE9SVF9FUjFfT0ZGU0VUCTB4NDBDCisjZGVmaW5lIExQRkNfQ1RMX1BPUlRfRVIyX09GRlNFVAkweDQxMAogCiAvKiBUaGUgZm9sbG93aW5nIFJlZ2lzdGVycyBhcHBseSB0byBTTEk0IGlmX3R5cGUgMCBVQ05Bcy4gVGhleSB0eXBpY2FsbHkKICAqIHJlc2lkZSBpbiBCQVIgMi4KQEAgLTMxOTgsNiArMzE5OCw4IEBACiAjZGVmaW5lIGxwZmNfZ3JwX2hkcl9pZF9NQVNLCQkweDAwMDAwMEZGCiAjZGVmaW5lIGxwZmNfZ3JwX2hkcl9pZF9XT1JECQl3b3JkMgogCXVpbnQ4X3QgcmV2X25hbWVbMTI4XTsKKwl1aW50OF90IGRhdGVbMTJdOworCXVpbnQ4X3QgcmV2aXNpb25bMzJdOwogfTsKIAogI2RlZmluZSBGQ1BfQ09NTUFORCAweDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfaW5pdC5jIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19pbml0LmMKaW5kZXggMTQ4Yjk4ZC4uYTNjODIwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19pbml0LmMKQEAgLTI5MjcsNiArMjkyNyw4IEBACiAJCQkJIHNpemVvZiBmY19ob3N0X3N5bWJvbGljX25hbWUoc2hvc3QpKTsKIAogCWZjX2hvc3Rfc3VwcG9ydGVkX3NwZWVkcyhzaG9zdCkgPSAwOworCWlmIChwaGJhLT5sbXQgJiBMTVRfMTZHYikKKwkJZmNfaG9zdF9zdXBwb3J0ZWRfc3BlZWRzKHNob3N0KSB8PSBGQ19QT1JUU1BFRURfMTZHQklUOwogCWlmIChwaGJhLT5sbXQgJiBMTVRfMTBHYikKIAkJZmNfaG9zdF9zdXBwb3J0ZWRfc3BlZWRzKHNob3N0KSB8PSBGQ19QT1JUU1BFRURfMTBHQklUOwogCWlmIChwaGJhLT5sbXQgJiBMTVRfOEdiKQpAQCAtMzYzMiw4ICszNjM0LDcgQEAKIAkJCWxwZmNfc2xpNF9mY2ZfZGVhZF9mYWlsdGhyb3VnaChwaGJhKTsKIAkJfSBlbHNlIHsKIAkJCS8qIFJlc2V0IEZDRiByb3VuZHJvYmluIGJtYXNrIGZvciBuZXcgZGlzY292ZXJ5ICovCi0JCQltZW1zZXQocGhiYS0+ZmNmLmZjZl9ycl9ibWFzaywgMCwKLQkJCSAgICAgICBzaXplb2YoKnBoYmEtPmZjZi5mY2ZfcnJfYm1hc2spKTsKKwkJCWxwZmNfc2xpNF9jbGVhcl9mY2ZfcnJfYm1hc2socGhiYSk7CiAJCQkvKgogCQkJICogSGFuZGxpbmcgZmFzdCBGQ0YgZmFpbG92ZXIgdG8gYSBERUFEIEZDRiBldmVudCBpcwogCQkJICogY29uc2lkZXJlZCBlcXVhbGl2YW50IHRvIHJlY2VpdmluZyBDVkwgdG8gYWxsIHZwb3J0cy4KQEAgLTM2NDcsNyArMzY0OCw3IEBACiAJCQkiIHRhZyAweCV4XG4iLCBhY3FlX2ZpcC0+aW5kZXgsIGFjcWVfZmlwLT5ldmVudF90YWcpOwogCiAJCXZwb3J0ID0gbHBmY19maW5kX3Zwb3J0X2J5X3ZwaWQocGhiYSwKLQkJCQlhY3FlX2ZpcC0+aW5kZXggLSBwaGJhLT52cGlfYmFzZSk7CisJCQkJCQlhY3FlX2ZpcC0+aW5kZXgpOwogCQluZGxwID0gbHBmY19zbGk0X3BlcmZvcm1fdnBvcnRfY3ZsKHZwb3J0KTsKIAkJaWYgKCFuZGxwKQogCQkJYnJlYWs7CkBAIC0zNzE5LDggKzM3MjAsNyBAQAogCQkJCSAqIFJlc2V0IEZDRiByb3VuZHJvYmluIGJtYXNrIGZvciBuZXcKIAkJCQkgKiBkaXNjb3ZlcnkuCiAJCQkJICovCi0JCQkJbWVtc2V0KHBoYmEtPmZjZi5mY2ZfcnJfYm1hc2ssIDAsCi0JCQkJICAgICAgIHNpemVvZigqcGhiYS0+ZmNmLmZjZl9ycl9ibWFzaykpOworCQkJCWxwZmNfc2xpNF9jbGVhcl9mY2ZfcnJfYm1hc2socGhiYSk7CiAJCX0KIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTQwMzUsNiArNDAzNSwzNCBAQAogfQogCiAvKioKKyAqIGxwZmNfc2xpX3NyaW92X25yX3ZpcnRmbl9nZXQgLSBHZXQgdGhlIG51bWJlciBvZiBzci1pb3YgdmlydHVhbCBmdW5jdGlvbnMKKyAqIEBwaGJhOiBwb2ludGVyIHRvIGxwZmMgaGJhIGRhdGEgc3RydWN0dXJlLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZW5hYmxlcyB0aGUgUENJIFNSLUlPViB2aXJ0dWFsIGZ1bmN0aW9ucyB0byBhIHBoeXNpY2FsCisgKiBmdW5jdGlvbi4gSXQgaW52b2tlcyB0aGUgUENJIFNSLUlPViBhcGkgd2l0aCB0aGUgQG5yX3ZmbiBwcm92aWRlZCB0bworICogZW5hYmxlIHRoZSBudW1iZXIgb2YgdmlydHVhbCBmdW5jdGlvbnMgdG8gdGhlIHBoeXNpY2FsIGZ1bmN0aW9uLiBBcworICogbm90IGFsbCBkZXZpY2VzIHN1cHBvcnQgU1ItSU9WLCB0aGUgcmV0dXJuIGNvZGUgZnJvbSB0aGUgcGNpX2VuYWJsZV9zcmlvdigpCisgKiBBUEkgY2FsbCBkb2VzIG5vdCBjb25zaWRlcmVkIGFzIGFuIGVycm9yIGNvbmRpdGlvbiBmb3IgbW9zdCBvZiB0aGUgZGV2aWNlLgorICoqLwordWludDE2X3QKK2xwZmNfc2xpX3NyaW92X25yX3ZpcnRmbl9nZXQoc3RydWN0IGxwZmNfaGJhICpwaGJhKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gcGhiYS0+cGNpZGV2OworCXVpbnQxNl90IG5yX3ZpcnRmbjsKKwlpbnQgcG9zOworCisJaWYgKCFwZGV2LT5pc19waHlzZm4pCisJCXJldHVybiAwOworCisJcG9zID0gcGNpX2ZpbmRfZXh0X2NhcGFiaWxpdHkocGRldiwgUENJX0VYVF9DQVBfSURfU1JJT1YpOworCWlmIChwb3MgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBwb3MgKyBQQ0lfU1JJT1ZfVE9UQUxfVkYsICZucl92aXJ0Zm4pOworCXJldHVybiBucl92aXJ0Zm47Cit9CisKKy8qKgogICogbHBmY19zbGlfcHJvYmVfc3Jpb3ZfbnJfdmlydGZuIC0gRW5hYmxlIGEgbnVtYmVyIG9mIHNyLWlvdiB2aXJ0dWFsIGZ1bmN0aW9ucwogICogQHBoYmE6IHBvaW50ZXIgdG8gbHBmYyBoYmEgZGF0YSBzdHJ1Y3R1cmUuCiAgKiBAbnJfdmZuOiBudW1iZXIgb2YgdmlydHVhbCBmdW5jdGlvbnMgdG8gYmUgZW5hYmxlZC4KQEAgLTQwNDksOCArNDA3NywxNyBAQAogbHBmY19zbGlfcHJvYmVfc3Jpb3ZfbnJfdmlydGZuKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgaW50IG5yX3ZmbikKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHBoYmEtPnBjaWRldjsKKwl1aW50MTZfdCBtYXhfbnJfdmZuOwogCWludCByYzsKIAorCW1heF9ucl92Zm4gPSBscGZjX3NsaV9zcmlvdl9ucl92aXJ0Zm5fZ2V0KHBoYmEpOworCWlmIChucl92Zm4gPiBtYXhfbnJfdmZuKSB7CisJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0lOSVQsCisJCQkJIjMwNTcgUmVxdWVzdGVkIHZmcyAoJWQpIGdyZWF0ZXIgdGhhbiAiCisJCQkJInN1cHBvcnRlZCB2ZnMgKCVkKSIsIG5yX3ZmbiwgbWF4X25yX3Zmbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCXJjID0gcGNpX2VuYWJsZV9zcmlvdihwZGV2LCBucl92Zm4pOwogCWlmIChyYykgewogCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9XQVJOSU5HLCBMT0dfSU5JVCwKQEAgLTQ1MTYsNyArNDU1Myw3IEBACiAJCX0KIAl9CiAKLQlyZXR1cm4gcmM7CisJcmV0dXJuIDA7CiAKIG91dF9mcmVlX2ZjcF9lcV9oZGw6CiAJa2ZyZWUocGhiYS0+c2xpNF9oYmEuZmNwX2VxX2hkbCk7CkBAIC00OTY2LDE3ICs1MDAzLDE0IEBACiAgKiBAcGhiYTogcG9pbnRlciB0byBscGZjIGhiYSBkYXRhIHN0cnVjdHVyZS4KICAqCiAgKiBUaGlzIHJvdXRpbmUgaXMgaW52b2tlZCB0byBwb3N0IHJwaSBoZWFkZXIgdGVtcGxhdGVzIHRvIHRoZQotICogSEJBIGNvbnNpc3RlbnQgd2l0aCB0aGUgU0xJLTQgaW50ZXJmYWNlIHNwZWMuICBUaGlzIHJvdXRpbmUKKyAqIHBvcnQgZm9yIHRob3NlIFNMSTQgcG9ydHMgdGhhdCBkbyBub3Qgc3VwcG9ydCBleHRlbnRzLiAgVGhpcyByb3V0aW5lCiAgKiBwb3N0cyBhIFBBR0VfU0laRSBtZW1vcnkgcmVnaW9uIHRvIHRoZSBwb3J0IHRvIGhvbGQgdXAgdG8KLSAqIFBBR0VfU0laRSBtb2R1bG8gNjQgcnBpIGNvbnRleHQgaGVhZGVycy4KLSAqIE5vIGxvY2tzIGFyZSBoZWxkIGhlcmUgYmVjYXVzZSB0aGlzIGlzIGFuIGluaXRpYWxpemF0aW9uIHJvdXRpbmUKLSAqIGNhbGxlZCBvbmx5IGZyb20gcHJvYmUgb3IgbHBmY19vbmxpbmUgd2hlbiBpbnRlcnJ1cHRzIGFyZSBub3QKLSAqIGVuYWJsZWQgYW5kIHRoZSBkcml2ZXIgaXMgcmVpbml0aWFsaXppbmcgdGhlIGRldmljZS4KKyAqIFBBR0VfU0laRSBtb2R1bG8gNjQgcnBpIGNvbnRleHQgaGVhZGVycy4gIFRoaXMgaXMgYW4gaW5pdGlhbGl6YXRpb24gcm91dGluZQorICogYW5kIHNob3VsZCBiZSBjYWxsZWQgb25seSB3aGVuIGludGVycnVwdHMgYXJlIGRpc2FibGVkLgogICoKICAqIFJldHVybiBjb2RlcwogICogCTAgLSBzdWNjZXNzZnVsCi0gKiAJLUVOT01FTSAtIE5vIGF2YWlsYWJsZSBtZW1vcnkKLSAqICAgICAgLUVJTyAtIFRoZSBtYWlsYm94IGZhaWxlZCB0byBjb21wbGV0ZSBzdWNjZXNzZnVsbHkuCisgKgktRVJST1IgLSBvdGhlcndpc2UuCiAgKiovCiBpbnQKIGxwZmNfc2xpNF9pbml0X3JwaV9oZHJzKHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKQEAgLTU2ODcsMTcgKzU3MjEsMjIgQEAKIAkJYnJlYWs7CiAJY2FzZSBMUEZDX1NMSV9JTlRGX0lGX1RZUEVfMjoKIAkJcGhiYS0+c2xpNF9oYmEudS5pZl90eXBlMi5FUlIxcmVnYWRkciA9Ci0JCQlwaGJhLT5zbGk0X2hiYS5jb25mX3JlZ3NfbWVtbWFwX3AgKyBMUEZDX1NMSVBPUlRfRVJSXzE7CisJCQlwaGJhLT5zbGk0X2hiYS5jb25mX3JlZ3NfbWVtbWFwX3AgKworCQkJCQkJTFBGQ19DVExfUE9SVF9FUjFfT0ZGU0VUOwogCQlwaGJhLT5zbGk0X2hiYS51LmlmX3R5cGUyLkVSUjJyZWdhZGRyID0KLQkJCXBoYmEtPnNsaTRfaGJhLmNvbmZfcmVnc19tZW1tYXBfcCArIExQRkNfU0xJUE9SVF9FUlJfMjsKKwkJCXBoYmEtPnNsaTRfaGJhLmNvbmZfcmVnc19tZW1tYXBfcCArCisJCQkJCQlMUEZDX0NUTF9QT1JUX0VSMl9PRkZTRVQ7CiAJCXBoYmEtPnNsaTRfaGJhLnUuaWZfdHlwZTIuQ1RSTHJlZ2FkZHIgPQotCQkJcGhiYS0+c2xpNF9oYmEuY29uZl9yZWdzX21lbW1hcF9wICsgTFBGQ19TTElQT1JUX0NOVFJMOworCQkJcGhiYS0+c2xpNF9oYmEuY29uZl9yZWdzX21lbW1hcF9wICsKKwkJCQkJCUxQRkNfQ1RMX1BPUlRfQ1RMX09GRlNFVDsKIAkJcGhiYS0+c2xpNF9oYmEudS5pZl90eXBlMi5TVEFUVVNyZWdhZGRyID0KLQkJCXBoYmEtPnNsaTRfaGJhLmNvbmZfcmVnc19tZW1tYXBfcCArIExQRkNfU0xJUE9SVF9TVEFUVVM7CisJCQlwaGJhLT5zbGk0X2hiYS5jb25mX3JlZ3NfbWVtbWFwX3AgKworCQkJCQkJTFBGQ19DVExfUE9SVF9TVEFfT0ZGU0VUOwogCQlwaGJhLT5zbGk0X2hiYS5TTElJTlRGcmVnYWRkciA9CiAJCQlwaGJhLT5zbGk0X2hiYS5jb25mX3JlZ3NfbWVtbWFwX3AgKyBMUEZDX1NMSV9JTlRGOwogCQlwaGJhLT5zbGk0X2hiYS5QU01QSFJyZWdhZGRyID0KLQkJICAgICBwaGJhLT5zbGk0X2hiYS5jb25mX3JlZ3NfbWVtbWFwX3AgKyBMUEZDX1NMSVBPUlRfSUYyX1NNUEhSOworCQkJcGhiYS0+c2xpNF9oYmEuY29uZl9yZWdzX21lbW1hcF9wICsKKwkJCQkJCUxQRkNfQ1RMX1BPUlRfU0VNX09GRlNFVDsKIAkJcGhiYS0+c2xpNF9oYmEuUlFEQnJlZ2FkZHIgPQogCQkJcGhiYS0+c2xpNF9oYmEuY29uZl9yZWdzX21lbW1hcF9wICsgTFBGQ19SUV9ET09SQkVMTDsKIAkJcGhiYS0+c2xpNF9oYmEuV1FEQnJlZ2FkZHIgPQpAQCAtODg1OSwxMSArODg5OCwxMSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJbHBmY19kZWNvZGVfZmlybXdhcmVfcmV2KHBoYmEsIGZ3cmV2LCAxKTsKLQlpZiAoc3RybmNtcChmd3JldiwgaW1hZ2UtPnJldl9uYW1lLCBzdHJubGVuKGZ3cmV2LCAxNikpKSB7CisJaWYgKHN0cm5jbXAoZndyZXYsIGltYWdlLT5yZXZpc2lvbiwgc3RybmxlbihpbWFnZS0+cmV2aXNpb24sIDE2KSkpIHsKIAkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfSU5JVCwKIAkJCQkiMzAyMyBVcGRhdGluZyBGaXJtd2FyZS4gQ3VycmVudCBWZXJzaW9uOiVzICIKIAkJCQkiTmV3IFZlcnNpb246JXNcbiIsCi0JCQkJZndyZXYsIGltYWdlLT5yZXZfbmFtZSk7CisJCQkJZndyZXYsIGltYWdlLT5yZXZpc2lvbik7CiAJCWZvciAoaSA9IDA7IGkgPCBMUEZDX01CWF9XUl9DT05GSUdfTUFYX0JERTsgaSsrKSB7CiAJCQlkbWFidWYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbHBmY19kbWFidWYpLAogCQkJCQkgR0ZQX0tFUk5FTCk7CkBAIC04ODkyLDkgKzg5MzEsOSBAQAogCQkJCQkgICAgICAgZnctPnNpemUgLSBvZmZzZXQpOwogCQkJCQlicmVhazsKIAkJCQl9Ci0JCQkJdGVtcF9vZmZzZXQgKz0gU0xJNF9QQUdFX1NJWkU7CiAJCQkJbWVtY3B5KGRtYWJ1Zi0+dmlydCwgZnctPmRhdGEgKyB0ZW1wX29mZnNldCwKIAkJCQkgICAgICAgU0xJNF9QQUdFX1NJWkUpOworCQkJCXRlbXBfb2Zmc2V0ICs9IFNMSTRfUEFHRV9TSVpFOwogCQkJfQogCQkJcmMgPSBscGZjX3dyX29iamVjdChwaGJhLCAmZG1hX2J1ZmZlcl9saXN0LAogCQkJCSAgICAoZnctPnNpemUgLSBvZmZzZXQpLCAmb2Zmc2V0KTsKQEAgLTkwMDUsNiArOTA0NCw3IEBACiAJfQogCiAJSU5JVF9MSVNUX0hFQUQoJnBoYmEtPmFjdGl2ZV9ycnFfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJnBoYmEtPmZjZi5mY2ZfcHJpX2xpc3QpOwogCiAJLyogU2V0IHVwIGNvbW1vbiBkZXZpY2UgZHJpdmVyIHJlc291cmNlcyAqLwogCWVycm9yID0gbHBmY19zZXR1cF9kcml2ZXJfcmVzb3VyY2VfcGhhc2UyKHBoYmEpOwpAQCAtOTExMiw3ICs5MTUyLDYgQEAKIAogCS8qIENoZWNrIGlmIHRoZXJlIGFyZSBzdGF0aWMgdnBvcnRzIHRvIGJlIGNyZWF0ZWQuICovCiAJbHBmY19jcmVhdGVfc3RhdGljX3Zwb3J0KHBoYmEpOwotCiAJcmV0dXJuIDA7CiAKIG91dF9kaXNhYmxlX2ludHI6CkBAIC05NDgzLDYgKzk1MjIsMTMgQEAKIAl9CiAKIAlwY2lfcmVzdG9yZV9zdGF0ZShwZGV2KTsKKworCS8qCisJICogQXMgdGhlIG5ldyBrZXJuZWwgYmVoYXZpb3Igb2YgcGNpX3Jlc3RvcmVfc3RhdGUoKSBBUEkgY2FsbCBjbGVhcnMKKwkgKiBkZXZpY2Ugc2F2ZWRfc3RhdGUgZmxhZywgbmVlZCB0byBzYXZlIHRoZSByZXN0b3JlZCBzdGF0ZSBhZ2Fpbi4KKwkgKi8KKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwogCWlmIChwZGV2LT5pc19idXNtYXN0ZXIpCiAJCXBjaV9zZXRfbWFzdGVyKHBkZXYpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX21ib3guYyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbWJveC5jCmluZGV4IDU1Njc2NzAuLjgzNDUwY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbWJveC5jCisrKyBiL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfbWJveC5jCkBAIC0yMDMxLDcgKzIwMzEsNyBAQAogCWJmX3NldChscGZjX2luaXRfdmZpX3ZwLCBpbml0X3ZmaSwgMSk7CiAJYmZfc2V0KGxwZmNfaW5pdF92ZmlfdmZpLCBpbml0X3ZmaSwKIAkgICAgICAgdnBvcnQtPnBoYmEtPnNsaTRfaGJhLnZmaV9pZHNbdnBvcnQtPnZmaV0pOwotCWJmX3NldChscGZjX2luaXRfdnBpX3ZwaSwgaW5pdF92ZmksCisJYmZfc2V0KGxwZmNfaW5pdF92ZmlfdnBpLCBpbml0X3ZmaSwKIAkgICAgICAgdnBvcnQtPnBoYmEtPnZwaV9pZHNbdnBvcnQtPnZwaV0pOwogCWJmX3NldChscGZjX2luaXRfdmZpX2ZjZmksIGluaXRfdmZpLAogCSAgICAgICB2cG9ydC0+cGhiYS0+ZmNmLmZjZmkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zY3NpLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Njc2kuYwppbmRleCAzY2NjOTc0Li5lYWRkMjQxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Njc2kuYworKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3Njc2kuYwpAQCAtMTMwMiwxMyArMTMwMiwxMyBAQAogCQljYXNlIFNDU0lfUFJPVF9OT1JNQUw6CiAJCWRlZmF1bHQ6CiAJCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19CRywKLQkJCQkiOTA2MyBCTEtHUkQ6IEJhZCBvcC9ndWFyZDolZC8lZCBjb21iaW5hdGlvblxuIiwKLQkJCQkJc2NzaV9nZXRfcHJvdF9vcChzYyksIGd1YXJkX3R5cGUpOworCQkJCSI5MDYzIEJMS0dSRDogQmFkIG9wL2d1YXJkOiVkL0lQIGNvbWJpbmF0aW9uXG4iLAorCQkJCQlzY3NpX2dldF9wcm90X29wKHNjKSk7CiAJCQlyZXQgPSAxOwogCQkJYnJlYWs7CiAKIAkJfQotCX0gZWxzZSBpZiAoZ3VhcmRfdHlwZSA9PSBTSE9TVF9ESVhfR1VBUkRfQ1JDKSB7CisJfSBlbHNlIHsKIAkJc3dpdGNoIChzY3NpX2dldF9wcm90X29wKHNjKSkgewogCQljYXNlIFNDU0lfUFJPVF9SRUFEX1NUUklQOgogCQljYXNlIFNDU0lfUFJPVF9XUklURV9JTlNFUlQ6CkBAIC0xMzI0LDE3ICsxMzI0LDE4IEBACiAKIAkJY2FzZSBTQ1NJX1BST1RfUkVBRF9JTlNFUlQ6CiAJCWNhc2UgU0NTSV9QUk9UX1dSSVRFX1NUUklQOgorCQkJKnR4b3AgPSBCR19PUF9JTl9DUkNfT1VUX05PRElGOworCQkJKnJ4b3AgPSBCR19PUF9JTl9OT0RJRl9PVVRfQ1JDOworCQkJYnJlYWs7CisKIAkJY2FzZSBTQ1NJX1BST1RfTk9STUFMOgogCQlkZWZhdWx0OgogCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfQkcsCi0JCQkJIjkwNzUgQkxLR1JEOiBCYWQgb3AvZ3VhcmQ6JWQvJWQgY29tYmluYXRpb25cbiIsCi0JCQkJCXNjc2lfZ2V0X3Byb3Rfb3Aoc2MpLCBndWFyZF90eXBlKTsKKwkJCQkiOTA3NSBCTEtHUkQ6IEJhZCBvcC9ndWFyZDolZC9DUkMgY29tYmluYXRpb25cbiIsCisJCQkJCXNjc2lfZ2V0X3Byb3Rfb3Aoc2MpKTsKIAkJCXJldCA9IDE7CiAJCQlicmVhazsKIAkJfQotCX0gZWxzZSB7Ci0JCS8qIHVuc3VwcG9ydGVkIGZvcm1hdCAqLwotCQlCVUcoKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtMTM1Miw0NSArMTM1Myw2IEBACiAJcmV0dXJuIHNjLT5kZXZpY2UtPnNlY3Rvcl9zaXplOwogfQogCi0vKioKLSAqIGxwZmNfZ2V0X2NtZF9kaWZfcGFybXMgLSBFeHRyYWN0IERJRiBwYXJhbWV0ZXJzIGZyb20gU0NTSSBjb21tYW5kCi0gKiBAc2M6ICAgICAgICAgICAgIGluOiBTQ1NJIGNvbW1hbmQKLSAqIEBhcHB0YWdtYXNrOiAgICAgb3V0OiBhcHAgdGFnIG1hc2sKLSAqIEBhcHB0YWd2YWw6ICAgICAgb3V0OiBhcHAgdGFnIHZhbHVlCi0gKiBAcmVmdGFnOiAgICAgICAgIG91dDogcmVmIHRhZyAocmVmZXJlbmNlIHRhZykKLSAqCi0gKiBEZXNjcmlwdGlvbjoKLSAqICAgRXh0cmFjdCBESUYgcGFyYW1ldGVycyBmcm9tIHRoZSBjb21tYW5kIGlmIHBvc3NpYmxlLiAgT3RoZXJ3aXNlLAotICogICB1c2UgZGVmYXVsdCBwYXJhbWV0ZXJzLgotICoKLSAqKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAotbHBmY19nZXRfY21kX2RpZl9wYXJtcyhzdHJ1Y3Qgc2NzaV9jbW5kICpzYywgdWludDE2X3QgKmFwcHRhZ21hc2ssCi0JCXVpbnQxNl90ICphcHB0YWd2YWwsIHVpbnQzMl90ICpyZWZ0YWcpCi17Ci0Jc3RydWN0ICBzY3NpX2RpZl90dXBsZSAqc3B0OwotCXVuc2lnbmVkIGNoYXIgb3AgPSBzY3NpX2dldF9wcm90X29wKHNjKTsKLQl1bnNpZ25lZCBpbnQgcHJvdGNudCA9IHNjc2lfcHJvdF9zZ19jb3VudChzYyk7Ci0Jc3RhdGljIGludCBjbnQ7Ci0KLQlpZiAocHJvdGNudCAmJiAob3AgPT0gU0NTSV9QUk9UX1dSSVRFX1NUUklQIHx8Ci0JCQkJb3AgPT0gU0NTSV9QUk9UX1dSSVRFX1BBU1MpKSB7Ci0KLQkJY250Kys7Ci0JCXNwdCA9IHBhZ2VfYWRkcmVzcyhzZ19wYWdlKHNjc2lfcHJvdF9zZ2xpc3Qoc2MpKSkgKwotCQkJc2NzaV9wcm90X3NnbGlzdChzYylbMF0ub2Zmc2V0OwotCQkqYXBwdGFnbWFzayA9IDA7Ci0JCSphcHB0YWd2YWwgPSAwOwotCQkqcmVmdGFnID0gY3B1X3RvX2JlMzIoc3B0LT5yZWZfdGFnKTsKLQotCX0gZWxzZSB7Ci0JCS8qIFNCQyBkZWZpbmVzIHJlZiB0YWcgdG8gYmUgbG93ZXIgMzJiaXRzIG9mIExCQSAqLwotCQkqcmVmdGFnID0gKHVpbnQzMl90KSAoMHhmZmZmZmZmZiAmIHNjc2lfZ2V0X2xiYShzYykpOwotCQkqYXBwdGFnbWFzayA9IDA7Ci0JCSphcHB0YWd2YWwgPSAwOwotCX0KLX0KLQogLyoKICAqIFRoaXMgZnVuY3Rpb24gc2V0cyB1cCBidWZmZXIgbGlzdCBmb3IgcHJvdGVjdGlvbiBncm91cHMgb2YKICAqIHR5cGUgTFBGQ19QR19UWVBFX05PX0RJRgpAQCAtMTQyNyw5ICsxMzg5LDggQEAKIAlkbWFfYWRkcl90IHBoeXNhZGRyOwogCWludCBpID0gMCwgbnVtX2JkZSA9IDAsIHN0YXR1czsKIAlpbnQgZGF0YWRpciA9IHNjLT5zY19kYXRhX2RpcmVjdGlvbjsKLQl1bnNpZ25lZCBibGtzaXplOwogCXVpbnQzMl90IHJlZnRhZzsKLQl1aW50MTZfdCBhcHB0YWdtYXNrLCBhcHB0YWd2YWw7CisJdW5zaWduZWQgYmxrc2l6ZTsKIAl1aW50OF90IHR4b3AsIHJ4b3A7CiAKIAlzdGF0dXMgID0gbHBmY19zY190b19iZ19vcGNvZGVzKHBoYmEsIHNjLCAmdHhvcCwgJnJ4b3ApOwpAQCAtMTQzOCwxNyArMTM5OSwxNiBAQAogCiAJLyogZXh0cmFjdCBzb21lIGluZm8gZnJvbSB0aGUgc2NzaSBjb21tYW5kIGZvciBwZGUqLwogCWJsa3NpemUgPSBscGZjX2NtZF9ibGtzaXplKHNjKTsKLQlscGZjX2dldF9jbWRfZGlmX3Bhcm1zKHNjLCAmYXBwdGFnbWFzaywgJmFwcHRhZ3ZhbCwgJnJlZnRhZyk7CisJcmVmdGFnID0gc2NzaV9nZXRfbGJhKHNjKSAmIDB4ZmZmZmZmZmY7CiAKIAkvKiBzZXR1cCBQREU1IHdpdGggd2hhdCB3ZSBoYXZlICovCiAJcGRlNSA9IChzdHJ1Y3QgbHBmY19wZGU1ICopIGJwbDsKIAltZW1zZXQocGRlNSwgMCwgc2l6ZW9mKHN0cnVjdCBscGZjX3BkZTUpKTsKIAliZl9zZXQocGRlNV90eXBlLCBwZGU1LCBMUEZDX1BERTVfREVTQ1JJUFRPUik7Ci0JcGRlNS0+cmVmdGFnID0gcmVmdGFnOwogCiAJLyogRW5kaWFubmVzcyBjb252ZXJzaW9uIGlmIG5lY2Vzc2FyeSBmb3IgUERFNSAqLwogCXBkZTUtPndvcmQwID0gY3B1X3RvX2xlMzIocGRlNS0+d29yZDApOwotCXBkZTUtPnJlZnRhZyA9IGNwdV90b19sZTMyKHBkZTUtPnJlZnRhZyk7CisJcGRlNS0+cmVmdGFnID0gY3B1X3RvX2xlMzIocmVmdGFnKTsKIAogCS8qIGFkdmFuY2UgYnBsIGFuZCBpbmNyZW1lbnQgYmRlIGNvdW50ICovCiAJbnVtX2JkZSsrOwpAQCAtMTQ2MywxMCArMTQyMywxMCBAQAogCWlmIChkYXRhZGlyID09IERNQV9GUk9NX0RFVklDRSkgewogCQliZl9zZXQocGRlNl9jZSwgcGRlNiwgMSk7CiAJCWJmX3NldChwZGU2X3JlLCBwZGU2LCAxKTsKLQkJYmZfc2V0KHBkZTZfYWUsIHBkZTYsIDEpOwogCX0KIAliZl9zZXQocGRlNl9haSwgcGRlNiwgMSk7Ci0JYmZfc2V0KHBkZTZfYXBwdGFndmFsLCBwZGU2LCBhcHB0YWd2YWwpOworCWJmX3NldChwZGU2X2FlLCBwZGU2LCAwKTsKKwliZl9zZXQocGRlNl9hcHB0YWd2YWwsIHBkZTYsIDApOwogCiAJLyogRW5kaWFubmVzcyBjb252ZXJzaW9uIGlmIG5lY2Vzc2FyeSBmb3IgUERFNiAqLwogCXBkZTYtPndvcmQwID0gY3B1X3RvX2xlMzIocGRlNi0+d29yZDApOwpAQCAtMTU1MSw3ICsxNTExLDYgQEAKIAl1bnNpZ25lZCBjaGFyIHBnZG9uZSA9IDAsIGFsbGRvbmUgPSAwOwogCXVuc2lnbmVkIGJsa3NpemU7CiAJdWludDMyX3QgcmVmdGFnOwotCXVpbnQxNl90IGFwcHRhZ21hc2ssIGFwcHRhZ3ZhbDsKIAl1aW50OF90IHR4b3AsIHJ4b3A7CiAJaW50IG51bV9iZGUgPSAwOwogCkBAIC0xNTcxLDcgKzE1MzAsNyBAQAogCiAJLyogZXh0cmFjdCBzb21lIGluZm8gZnJvbSB0aGUgc2NzaSBjb21tYW5kICovCiAJYmxrc2l6ZSA9IGxwZmNfY21kX2Jsa3NpemUoc2MpOwotCWxwZmNfZ2V0X2NtZF9kaWZfcGFybXMoc2MsICZhcHB0YWdtYXNrLCAmYXBwdGFndmFsLCAmcmVmdGFnKTsKKwlyZWZ0YWcgPSBzY3NpX2dldF9sYmEoc2MpICYgMHhmZmZmZmZmZjsKIAogCXNwbGl0X29mZnNldCA9IDA7CiAJZG8gewpAQCAtMTU3OSwxMSArMTUzOCwxMCBAQAogCQlwZGU1ID0gKHN0cnVjdCBscGZjX3BkZTUgKikgYnBsOwogCQltZW1zZXQocGRlNSwgMCwgc2l6ZW9mKHN0cnVjdCBscGZjX3BkZTUpKTsKIAkJYmZfc2V0KHBkZTVfdHlwZSwgcGRlNSwgTFBGQ19QREU1X0RFU0NSSVBUT1IpOwotCQlwZGU1LT5yZWZ0YWcgPSByZWZ0YWc7CiAKIAkJLyogRW5kaWFubmVzcyBjb252ZXJzaW9uIGlmIG5lY2Vzc2FyeSBmb3IgUERFNSAqLwogCQlwZGU1LT53b3JkMCA9IGNwdV90b19sZTMyKHBkZTUtPndvcmQwKTsKLQkJcGRlNS0+cmVmdGFnID0gY3B1X3RvX2xlMzIocGRlNS0+cmVmdGFnKTsKKwkJcGRlNS0+cmVmdGFnID0gY3B1X3RvX2xlMzIocmVmdGFnKTsKIAogCQkvKiBhZHZhbmNlIGJwbCBhbmQgaW5jcmVtZW50IGJkZSBjb3VudCAqLwogCQludW1fYmRlKys7CkBAIC0xNTk3LDkgKzE1NTUsOSBAQAogCQliZl9zZXQocGRlNl9vcHJ4LCBwZGU2LCByeG9wKTsKIAkJYmZfc2V0KHBkZTZfY2UsIHBkZTYsIDEpOwogCQliZl9zZXQocGRlNl9yZSwgcGRlNiwgMSk7Ci0JCWJmX3NldChwZGU2X2FlLCBwZGU2LCAxKTsKIAkJYmZfc2V0KHBkZTZfYWksIHBkZTYsIDEpOwotCQliZl9zZXQocGRlNl9hcHB0YWd2YWwsIHBkZTYsIGFwcHRhZ3ZhbCk7CisJCWJmX3NldChwZGU2X2FlLCBwZGU2LCAwKTsKKwkJYmZfc2V0KHBkZTZfYXBwdGFndmFsLCBwZGU2LCAwKTsKIAogCQkvKiBFbmRpYW5uZXNzIGNvbnZlcnNpb24gaWYgbmVjZXNzYXJ5IGZvciBQREU2ICovCiAJCXBkZTYtPndvcmQwID0gY3B1X3RvX2xlMzIocGRlNi0+d29yZDApOwpAQCAtMTYyMSw4ICsxNTc5LDggQEAKIAkJbWVtc2V0KHBkZTcsIDAsIHNpemVvZihzdHJ1Y3QgbHBmY19wZGU3KSk7CiAJCWJmX3NldChwZGU3X3R5cGUsIHBkZTcsIExQRkNfUERFN19ERVNDUklQVE9SKTsKIAotCQlwZGU3LT5hZGRySGlnaCA9IGxlMzJfdG9fY3B1KHB1dFBhZGRyTG93KHByb3RwaHlzYWRkcikpOwotCQlwZGU3LT5hZGRyTG93ID0gbGUzMl90b19jcHUocHV0UGFkZHJIaWdoKHByb3RwaHlzYWRkcikpOworCQlwZGU3LT5hZGRySGlnaCA9IGxlMzJfdG9fY3B1KHB1dFBhZGRySGlnaChwcm90cGh5c2FkZHIpKTsKKwkJcGRlNy0+YWRkckxvdyA9IGxlMzJfdG9fY3B1KHB1dFBhZGRyTG93KHByb3RwaHlzYWRkcikpOwogCiAJCXByb3RncnBfYmxrcyA9IHByb3Rncm91cF9sZW4gLyA4OwogCQlwcm90Z3JwX2J5dGVzID0gcHJvdGdycF9ibGtzICogYmxrc2l6ZTsKQEAgLTE2MzIsNyArMTU5MCw3IEBACiAJCQlwcm90Z3JvdXBfcmVtYWluZGVyID0gMHgxMDAwIC0gKHBkZTctPmFkZHJMb3cgJiAweGZmZik7CiAJCQlwcm90Z3JvdXBfb2Zmc2V0ICs9IHByb3Rncm91cF9yZW1haW5kZXI7CiAJCQlwcm90Z3JwX2Jsa3MgPSBwcm90Z3JvdXBfcmVtYWluZGVyIC8gODsKLQkJCXByb3RncnBfYnl0ZXMgPSBwcm90Z3JvdXBfcmVtYWluZGVyICogYmxrc2l6ZTsKKwkJCXByb3RncnBfYnl0ZXMgPSBwcm90Z3JwX2Jsa3MgKiBibGtzaXplOwogCQl9IGVsc2UgewogCQkJcHJvdGdyb3VwX29mZnNldCA9IDA7CiAJCQljdXJyX3Byb3QrKzsKQEAgLTIwMDYsMTYgKzE5NjQsMjEgQEAKIAlpZiAobHBmY19iZ3NfZ2V0X2hpX3dhdGVyX21hcmtfcHJlc2VudChiZ3N0YXQpKSB7CiAJCS8qCiAJCSAqIHNldHVwIHNlbnNlIGRhdGEgZGVzY3JpcHRvciAwIHBlciBTUEMtNCBhcyBhbiBpbmZvcm1hdGlvbgotCQkgKiBmaWVsZCwgYW5kIHB1dCB0aGUgZmFpbGluZyBMQkEgaW4gaXQKKwkJICogZmllbGQsIGFuZCBwdXQgdGhlIGZhaWxpbmcgTEJBIGluIGl0LgorCQkgKiBUaGlzIGNvZGUgYXNzdW1lcyB0aGVyZSB3YXMgYWxzbyBhIGd1YXJkL2FwcC9yZWYgdGFnIGVycm9yCisJCSAqIGluZGljYXRpb24uCiAJCSAqLwotCQljbWQtPnNlbnNlX2J1ZmZlcls4XSA9IDA7ICAgICAvKiBJbmZvcm1hdGlvbiAqLwotCQljbWQtPnNlbnNlX2J1ZmZlcls5XSA9IDB4YTsgICAvKiBBZGQuIGxlbmd0aCAqLworCQljbWQtPnNlbnNlX2J1ZmZlcls3XSA9IDB4YzsgICAvKiBBZGRpdGlvbmFsIHNlbnNlIGxlbmd0aCAqLworCQljbWQtPnNlbnNlX2J1ZmZlcls4XSA9IDA7ICAgICAvKiBJbmZvcm1hdGlvbiBkZXNjcmlwdG9yIHR5cGUgKi8KKwkJY21kLT5zZW5zZV9idWZmZXJbOV0gPSAweGE7ICAgLyogQWRkaXRpb25hbCBkZXNjcmlwdG9yIGxlbmd0aCAqLworCQljbWQtPnNlbnNlX2J1ZmZlclsxMF0gPSAweDgwOyAvKiBWYWxpZGl0eSBiaXQgKi8KIAkJYmdobSAvPSBjbWQtPmRldmljZS0+c2VjdG9yX3NpemU7CiAKIAkJZmFpbGluZ19zZWN0b3IgPSBzY3NpX2dldF9sYmEoY21kKTsKIAkJZmFpbGluZ19zZWN0b3IgKz0gYmdobTsKIAotCQlwdXRfdW5hbGlnbmVkX2JlNjQoZmFpbGluZ19zZWN0b3IsICZjbWQtPnNlbnNlX2J1ZmZlclsxMF0pOworCQkvKiBEZXNjcmlwdG9yIEluZm9ybWF0aW9uICovCisJCXB1dF91bmFsaWduZWRfYmU2NChmYWlsaW5nX3NlY3RvciwgJmNtZC0+c2Vuc2VfYnVmZmVyWzEyXSk7CiAJfQogCiAJaWYgKCFyZXQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmMgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaS5jCmluZGV4IDk4OTk5YmIuLjhiNzk5ZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9scGZjL2xwZmNfc2xpLmMKKysrIGIvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGkuYwpAQCAtNTYwLDcgKzU2MCw3IEBACiAJcnJxID0gbWVtcG9vbF9hbGxvYyhwaGJhLT5ycnFfcG9vbCwgR0ZQX0tFUk5FTCk7CiAJaWYgKHJycSkgewogCQlycnEtPnNlbmRfcnJxID0gc2VuZF9ycnE7Ci0JCXJycS0+eHJpdGFnID0gcGhiYS0+c2xpNF9oYmEueHJpX2lkc1t4cml0YWddOworCQlycnEtPnhyaXRhZyA9IHhyaXRhZzsKIAkJcnJxLT5ycnFfc3RvcF90aW1lID0gamlmZmllcyArIEhaICogKHBoYmEtPmZjX3JhdG92ICsgMSk7CiAJCXJycS0+bmRscCA9IG5kbHA7CiAJCXJycS0+bmxwX0RJRCA9IG5kbHAtPm5scF9ESUQ7CkBAIC0yNDUyLDcgKzI0NTIsOCBAQAogCiAJCS8qIHNlYXJjaCBjb250aW51ZSBzYXZlIHEgZm9yIHNhbWUgWFJJICovCiAJCWxpc3RfZm9yX2VhY2hfZW50cnkoaW9jYnEsICZwcmluZy0+aW9jYl9jb250aW51ZV9zYXZlcSwgY2xpc3QpIHsKLQkJCWlmIChpb2NicS0+aW9jYi51bHBDb250ZXh0ID09IHNhdmVxLT5pb2NiLnVscENvbnRleHQpIHsKKwkJCWlmIChpb2NicS0+aW9jYi51bnNsaTMucmN2c2xpMy5veF9pZCA9PQorCQkJCXNhdmVxLT5pb2NiLnVuc2xpMy5yY3ZzbGkzLm94X2lkKSB7CiAJCQkJbGlzdF9hZGRfdGFpbCgmc2F2ZXEtPmxpc3QsICZpb2NicS0+bGlzdCk7CiAJCQkJZm91bmQgPSAxOwogCQkJCWJyZWFrOwpAQCAtMzM1NSw2ICszMzU2LDcgQEAKIAkJCQkJCQkgICBpcnNwaW9jYnEpOwogCQkJYnJlYWs7CiAJCWNhc2UgQ1FFX0NPREVfUkVDRUlWRToKKwkJY2FzZSBDUUVfQ09ERV9SRUNFSVZFX1YxOgogCQkJZG1hYnVmID0gY29udGFpbmVyX29mKGNxX2V2ZW50LCBzdHJ1Y3QgaGJxX2RtYWJ1ZiwKIAkJCQkJICAgICAgY3FfZXZlbnQpOwogCQkJbHBmY19zbGk0X2hhbmRsZV9yZWNlaXZlZF9idWZmZXIocGhiYSwgZG1hYnVmKTsKQEAgLTQ3MTIsMTAgKzQ3MTQsMTUgQEAKICAqIGxwZmNfc2xpNF9nZXRfYXZhaWxfZXh0bnRfcnNyYyAtIEdldCBhdmFpbGFibGUgcmVzb3VyY2UgZXh0ZW50IGNvdW50LgogICogQHBoYmE6IFBvaW50ZXIgdG8gSEJBIGNvbnRleHQgb2JqZWN0LgogICogQHR5cGU6IFRoZSByZXNvdXJjZSBleHRlbnQgdHlwZS4KKyAqIEBleHRudF9jb3VudDogYnVmZmVyIHRvIGhvbGQgcG9ydCBhdmFpbGFibGUgZXh0ZW50IGNvdW50LgorICogQGV4dG50X3NpemU6IGJ1ZmZlciB0byBob2xkIGVsZW1lbnQgY291bnQgcGVyIGV4dGVudC4KICAqCi0gKiBUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBhbGwgU0xJNCByZXNvdXJjZSBpZGVudGlmaWVycy4KKyAqIFRoaXMgZnVuY3Rpb24gY2FsbHMgdGhlIHBvcnQgYW5kIHJldHJpZXZzIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlCisgKiBleHRlbnRzIGFuZCB0aGVpciBzaXplIGZvciBhIHBhcnRpY3VsYXIgZXh0ZW50IHR5cGUuCisgKgorICogUmV0dXJuczogMCBpZiBzdWNjZXNzZnVsLiAgTm9uemVybyBvdGhlcndpc2UuCiAgKiovCi1zdGF0aWMgaW50CitpbnQKIGxwZmNfc2xpNF9nZXRfYXZhaWxfZXh0bnRfcnNyYyhzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsIHVpbnQxNl90IHR5cGUsCiAJCQkgICAgICAgdWludDE2X3QgKmV4dG50X2NvdW50LCB1aW50MTZfdCAqZXh0bnRfc2l6ZSkKIHsKQEAgLTQ4OTIsNyArNDg5OSw3IEBACiAJCQkJICAgICByZXFfbGVuLCAqZW1iKTsKIAlpZiAoYWxsb2NfbGVuIDwgcmVxX2xlbikgewogCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAotCQkJIjkwMDAgQWxsb2NhdGVkIERNQSBtZW1vcnkgc2l6ZSAoeCV4KSBpcyAiCisJCQkiMjk4MiBBbGxvY2F0ZWQgRE1BIG1lbW9yeSBzaXplICh4JXgpIGlzICIKIAkJCSJsZXNzIHRoYW4gdGhlIHJlcXVlc3RlZCBETUEgbWVtb3J5ICIKIAkJCSJzaXplICh4JXgpXG4iLCBhbGxvY19sZW4sIHJlcV9sZW4pOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTU1MDYsNiArNTUxMywxNTQgQEAKIH0KIAogLyoqCisgKiBscGZjX3NsaTRfZ2V0X2FsbG9jYXRlZF9leHRudHMgLSBHZXQgdGhlIHBvcnQncyBhbGxvY2F0ZWQgZXh0ZW50cy4KKyAqIEBwaGJhOiBQb2ludGVyIHRvIEhCQSBjb250ZXh0IG9iamVjdC4KKyAqIEB0eXBlOiBUaGUgcmVzb3VyY2UgZXh0ZW50IHR5cGUuCisgKiBAZXh0bnRfY291bnQ6IGJ1ZmZlciB0byBob2xkIHBvcnQgZXh0ZW50IGNvdW50IHJlc3BvbnNlCisgKiBAZXh0bnRfc2l6ZTogYnVmZmVyIHRvIGhvbGQgcG9ydCBleHRlbnQgc2l6ZSByZXNwb25zZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNhbGxzIHRoZSBwb3J0IHRvIHJlYWQgdGhlIGhvc3QgYWxsb2NhdGVkIGV4dGVudHMKKyAqIGZvciBhIHBhcnRpY3VsYXIgdHlwZS4KKyAqKi8KK2ludAorbHBmY19zbGk0X2dldF9hbGxvY2F0ZWRfZXh0bnRzKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgdWludDE2X3QgdHlwZSwKKwkJCSAgICAgICB1aW50MTZfdCAqZXh0bnRfY250LCB1aW50MTZfdCAqZXh0bnRfc2l6ZSkKK3sKKwlib29sIGVtYjsKKwlpbnQgcmMgPSAwOworCXVpbnQxNl90IGN1cnJfYmxrcyA9IDA7CisJdWludDMyX3QgcmVxX2xlbiwgZW1iX2xlbjsKKwl1aW50MzJfdCBhbGxvY19sZW4sIG1ib3hfdG1vOworCXN0cnVjdCBsaXN0X2hlYWQgKmJsa19saXN0X2hlYWQ7CisJc3RydWN0IGxwZmNfcnNyY19ibGtzICpyc3JjX2JsazsKKwlMUEZDX01CT1hRX3QgKm1ib3g7CisJdm9pZCAqdmlydGFkZHIgPSBOVUxMOworCXN0cnVjdCBscGZjX21ieF9uZW1iZWRfcnNyY19leHRlbnQgKm5fcnNyYzsKKwlzdHJ1Y3QgbHBmY19tYnhfYWxsb2NfcnNyY19leHRlbnRzICpyc3JjX2V4dDsKKwl1bmlvbiAgbHBmY19zbGk0X2NmZ19zaGRyICpzaGRyOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBMUEZDX1JTQ19UWVBFX0ZDT0VfVlBJOgorCQlibGtfbGlzdF9oZWFkID0gJnBoYmEtPmxwZmNfdnBpX2Jsa19saXN0OworCQlicmVhazsKKwljYXNlIExQRkNfUlNDX1RZUEVfRkNPRV9YUkk6CisJCWJsa19saXN0X2hlYWQgPSAmcGhiYS0+c2xpNF9oYmEubHBmY194cmlfYmxrX2xpc3Q7CisJCWJyZWFrOworCWNhc2UgTFBGQ19SU0NfVFlQRV9GQ09FX1ZGSToKKwkJYmxrX2xpc3RfaGVhZCA9ICZwaGJhLT5zbGk0X2hiYS5scGZjX3ZmaV9ibGtfbGlzdDsKKwkJYnJlYWs7CisJY2FzZSBMUEZDX1JTQ19UWVBFX0ZDT0VfUlBJOgorCQlibGtfbGlzdF9oZWFkID0gJnBoYmEtPnNsaTRfaGJhLmxwZmNfcnBpX2Jsa19saXN0OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBDb3VudCB0aGUgbnVtYmVyIG9mIGV4dGVudHMgY3VycmVudGx5IGFsbG9jYXRkIGZvciB0aGlzIHR5cGUuICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyc3JjX2JsaywgYmxrX2xpc3RfaGVhZCwgbGlzdCkgeworCQlpZiAoY3Vycl9ibGtzID09IDApIHsKKwkJCS8qCisJCQkgKiBUaGUgR0VUX0FMTE9DQVRFRCBtYWlsYm94IGRvZXMgbm90IHJldHVybiB0aGUgc2l6ZSwKKwkJCSAqIGp1c3QgdGhlIGNvdW50LiAgVGhlIHNpemUgc2hvdWxkIGJlIGp1c3QgdGhlIHNpemUKKwkJCSAqIHN0b3JlZCBpbiB0aGUgY3VycmVudCBhbGxvY2F0ZWQgYmxvY2sgYW5kIGFsbCBzaXplcworCQkJICogZm9yIGFuIGV4dGVudCB0eXBlIGFyZSB0aGUgc2FtZSBzbyBzZXQgdGhlIHJldHVybgorCQkJICogdmFsdWUgbm93LgorCQkJICovCisJCQkqZXh0bnRfc2l6ZSA9IHJzcmNfYmxrLT5yc3JjX3NpemU7CisJCX0KKwkJY3Vycl9ibGtzKys7CisJfQorCisJLyogQ2FsY3VsYXRlIHRoZSB0b3RhbCByZXF1ZXN0ZWQgbGVuZ3RoIG9mIHRoZSBkbWEgbWVtb3J5LiAqLworCXJlcV9sZW4gPSBjdXJyX2Jsa3MgKiBzaXplb2YodWludDE2X3QpOworCisJLyoKKwkgKiBDYWxjdWxhdGUgdGhlIHNpemUgb2YgYW4gZW1iZWRkZWQgbWFpbGJveC4gIFRoZSB1aW50MzJfdAorCSAqIGFjY291bnRzIGZvciBleHRlbnRzLXNwZWNpZmljIHdvcmQuCisJICovCisJZW1iX2xlbiA9IHNpemVvZihNQUlMQk9YX3QpIC0gc2l6ZW9mKHN0cnVjdCBtYm94X2hlYWRlcikgLQorCQlzaXplb2YodWludDMyX3QpOworCisJLyoKKwkgKiBQcmVzdW1lIHRoZSBhbGxvY2F0aW9uIGFuZCByZXNwb25zZSB3aWxsIGZpdCBpbnRvIGFuIGVtYmVkZGVkCisJICogbWFpbGJveC4gIElmIG5vdCB0cnVlLCByZWNvbmZpZ3VyZSB0byBhIG5vbi1lbWJlZGRlZCBtYWlsYm94LgorCSAqLworCWVtYiA9IExQRkNfU0xJNF9NQlhfRU1CRUQ7CisJcmVxX2xlbiA9IGVtYl9sZW47CisJaWYgKHJlcV9sZW4gPiBlbWJfbGVuKSB7CisJCXJlcV9sZW4gPSBjdXJyX2Jsa3MgKiBzaXplb2YodWludDE2X3QpICsKKwkJCXNpemVvZih1bmlvbiBscGZjX3NsaTRfY2ZnX3NoZHIpICsKKwkJCXNpemVvZih1aW50MzJfdCk7CisJCWVtYiA9IExQRkNfU0xJNF9NQlhfTkVNQkVEOworCX0KKworCW1ib3ggPSAoTFBGQ19NQk9YUV90ICopIG1lbXBvb2xfYWxsb2MocGhiYS0+bWJveF9tZW1fcG9vbCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtYm94KQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQobWJveCwgMCwgc2l6ZW9mKExQRkNfTUJPWFFfdCkpOworCisJYWxsb2NfbGVuID0gbHBmY19zbGk0X2NvbmZpZyhwaGJhLCBtYm94LCBMUEZDX01CT1hfU1VCU1lTVEVNX0NPTU1PTiwKKwkJCQkgICAgIExQRkNfTUJPWF9PUENPREVfR0VUX0FMTE9DX1JTUkNfRVhURU5ULAorCQkJCSAgICAgcmVxX2xlbiwgZW1iKTsKKwlpZiAoYWxsb2NfbGVuIDwgcmVxX2xlbikgeworCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19JTklULAorCQkJIjI5ODMgQWxsb2NhdGVkIERNQSBtZW1vcnkgc2l6ZSAoeCV4KSBpcyAiCisJCQkibGVzcyB0aGFuIHRoZSByZXF1ZXN0ZWQgRE1BIG1lbW9yeSAiCisJCQkic2l6ZSAoeCV4KVxuIiwgYWxsb2NfbGVuLCByZXFfbGVuKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9leGl0OworCX0KKwlyYyA9IGxwZmNfc2xpNF9tYm94X3JzcmNfZXh0ZW50KHBoYmEsIG1ib3gsIGN1cnJfYmxrcywgdHlwZSwgZW1iKTsKKwlpZiAodW5saWtlbHkocmMpKSB7CisJCXJjID0gLUVJTzsKKwkJZ290byBlcnJfZXhpdDsKKwl9CisKKwlpZiAoIXBoYmEtPnNsaTRfaGJhLmludHJfZW5hYmxlKQorCQlyYyA9IGxwZmNfc2xpX2lzc3VlX21ib3gocGhiYSwgbWJveCwgTUJYX1BPTEwpOworCWVsc2UgeworCQltYm94X3RtbyA9IGxwZmNfbWJveF90bW9fdmFsKHBoYmEsIE1CWF9TTEk0X0NPTkZJRyk7CisJCXJjID0gbHBmY19zbGlfaXNzdWVfbWJveF93YWl0KHBoYmEsIG1ib3gsIG1ib3hfdG1vKTsKKwl9CisKKwlpZiAodW5saWtlbHkocmMpKSB7CisJCXJjID0gLUVJTzsKKwkJZ290byBlcnJfZXhpdDsKKwl9CisKKwkvKgorCSAqIEZpZ3VyZSBvdXQgd2hlcmUgdGhlIHJlc3BvbnNlIGlzIGxvY2F0ZWQuICBUaGVuIGdldCBsb2NhbCBwb2ludGVycworCSAqIHRvIHRoZSByZXNwb25zZSBkYXRhLiAgVGhlIHBvcnQgZG9lcyBub3QgZ3VhcmFudGVlIHRvIHJlc3BvbmQgdG8KKwkgKiBhbGwgZXh0ZW50cyBjb3VudHMgcmVxdWVzdCBzbyB1cGRhdGUgdGhlIGxvY2FsIHZhcmlhYmxlIHdpdGggdGhlCisJICogYWxsb2NhdGVkIGNvdW50IGZyb20gdGhlIHBvcnQuCisJICovCisJaWYgKGVtYiA9PSBMUEZDX1NMSTRfTUJYX0VNQkVEKSB7CisJCXJzcmNfZXh0ID0gJm1ib3gtPnUubXFlLnVuLmFsbG9jX3JzcmNfZXh0ZW50czsKKwkJc2hkciA9ICZyc3JjX2V4dC0+aGVhZGVyLmNmZ19zaGRyOworCQkqZXh0bnRfY250ID0gYmZfZ2V0KGxwZmNfbWJ4X3JzcmNfY250LCAmcnNyY19leHQtPnUucnNwKTsKKwl9IGVsc2UgeworCQl2aXJ0YWRkciA9IG1ib3gtPnNnZV9hcnJheS0+YWRkclswXTsKKwkJbl9yc3JjID0gKHN0cnVjdCBscGZjX21ieF9uZW1iZWRfcnNyY19leHRlbnQgKikgdmlydGFkZHI7CisJCXNoZHIgPSAmbl9yc3JjLT5jZmdfc2hkcjsKKwkJKmV4dG50X2NudCA9IGJmX2dldChscGZjX21ieF9yc3JjX2NudCwgbl9yc3JjKTsKKwl9CisKKwlpZiAoYmZfZ2V0KGxwZmNfbWJveF9oZHJfc3RhdHVzLCAmc2hkci0+cmVzcG9uc2UpKSB7CisJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX01CT1ggfCBMT0dfSU5JVCwKKwkJCSIyOTg0IEZhaWxlZCB0byByZWFkIGFsbG9jYXRlZCByZXNvdXJjZXMgIgorCQkJImZvciB0eXBlICVkIC0gU3RhdHVzIDB4JXggQWRkJ2wgU3RhdHVzIDB4JXguXG4iLAorCQkJdHlwZSwKKwkJCWJmX2dldChscGZjX21ib3hfaGRyX3N0YXR1cywgJnNoZHItPnJlc3BvbnNlKSwKKwkJCWJmX2dldChscGZjX21ib3hfaGRyX2FkZF9zdGF0dXMsICZzaGRyLT5yZXNwb25zZSkpOworCQlyYyA9IC1FSU87CisJCWdvdG8gZXJyX2V4aXQ7CisJfQorIGVycl9leGl0OgorCWxwZmNfc2xpNF9tYm94X2NtZF9mcmVlKHBoYmEsIG1ib3gpOworCXJldHVybiByYzsKK30KKworLyoqCiAgKiBscGZjX3NsaTRfaGJhX3NldHVwIC0gU0xJNCBkZXZpY2UgaW50aWFsaXphdGlvbiBQQ0kgZnVuY3Rpb24KICAqIEBwaGJhOiBQb2ludGVyIHRvIEhCQSBjb250ZXh0IG9iamVjdC4KICAqCkBAIC01ODM3LDYgKzU5OTIsNyBAQAogCQkJCQkiQWR2YW5jZWQgRXJyb3IgUmVwb3J0aW5nIChBRVIpXG4iKTsKIAkJCXBoYmEtPmNmZ19hZXJfc3VwcG9ydCA9IDA7CiAJCX0KKwkJcmMgPSAwOwogCX0KIAogCWlmICghKHBoYmEtPmhiYV9mbGFnICYgSEJBX0ZDT0VfTU9ERSkpIHsKQEAgLTY2MzQsNiArNjc5MCw5IEBACiAJdW5zaWduZWQgbG9uZyBpZmxhZ3M7CiAJaW50IHJjOwogCisJLyogZHVtcCBmcm9tIGlzc3VlIG1haWxib3ggY29tbWFuZCBpZiBzZXR1cCAqLworCWxwZmNfaWRpYWdfbWJ4YWNjX2R1bXBfaXNzdWVfbWJveChwaGJhLCAmbWJveHEtPnUubWIpOworCiAJcmMgPSBscGZjX21ib3hfZGV2X2NoZWNrKHBoYmEpOwogCWlmICh1bmxpa2VseShyYykpIHsKIAkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fRVJSLCBMT0dfTUJPWCB8IExPR19TTEksCkBAIC03MzE4LDEyICs3NDc3LDEyIEBACiAJCWJmX3NldCh3cWVfcW9zZCwgJndxZS0+ZWxzX3JlcS53cWVfY29tLCAxKTsKIAkJYmZfc2V0KHdxZV9sZW5sb2MsICZ3cWUtPmVsc19yZXEud3FlX2NvbSwgTFBGQ19XUUVfTEVOTE9DX05PTkUpOwogCQliZl9zZXQod3FlX2ViZGVfY250LCAmd3FlLT5lbHNfcmVxLndxZV9jb20sIDApOwotCWJyZWFrOworCQlicmVhazsKIAljYXNlIENNRF9YTUlUX1NFUVVFTkNFNjRfQ1g6CiAJCWJmX3NldCh3cWVfY3R4dF90YWcsICZ3cWUtPnhtaXRfc2VxdWVuY2Uud3FlX2NvbSwKIAkJICAgICAgIGlvY2JxLT5pb2NiLnVuLnVscFdvcmRbM10pOwogCQliZl9zZXQod3FlX3Jjdm94aWQsICZ3cWUtPnhtaXRfc2VxdWVuY2Uud3FlX2NvbSwKLQkJICAgICAgIGlvY2JxLT5pb2NiLnVscENvbnRleHQpOworCQkgICAgICAgaW9jYnEtPmlvY2IudW5zbGkzLnJjdnNsaTMub3hfaWQpOwogCQkvKiBUaGUgZW50aXJlIHNlcXVlbmNlIGlzIHRyYW5zbWl0dGVkIGZvciB0aGlzIElPQ0IgKi8KIAkJeG1pdF9sZW4gPSB0b3RhbF9sZW47CiAJCWNtbmQgPSBDTURfWE1JVF9TRVFVRU5DRTY0X0NSOwpAQCAtNzM0MSw3ICs3NTAwLDcgQEAKIAkJYmZfc2V0KHdxZV9lYmRlX2NudCwgJndxZS0+eG1pdF9zZXF1ZW5jZS53cWVfY29tLCAwKTsKIAkJd3FlLT54bWl0X3NlcXVlbmNlLnhtaXRfbGVuID0geG1pdF9sZW47CiAJCWNvbW1hbmRfdHlwZSA9IE9USEVSX0NPTU1BTkQ7Ci0JYnJlYWs7CisJCWJyZWFrOwogCWNhc2UgQ01EX1hNSVRfQkNBU1Q2NF9DTjoKIAkJLyogd29yZDMgaW9jYj1pb3RhZzMyIHdxZT1zZXFfcGF5bG9hZF9sZW4gKi8KIAkJd3FlLT54bWl0X2JjYXN0NjQuc2VxX3BheWxvYWRfbGVuID0geG1pdF9sZW47CkBAIC03MzU1LDcgKzc1MTQsNyBAQAogCQliZl9zZXQod3FlX2xlbmxvYywgJndxZS0+eG1pdF9iY2FzdDY0LndxZV9jb20sCiAJCSAgICAgICBMUEZDX1dRRV9MRU5MT0NfV09SRDMpOwogCQliZl9zZXQod3FlX2ViZGVfY250LCAmd3FlLT54bWl0X2JjYXN0NjQud3FlX2NvbSwgMCk7Ci0JYnJlYWs7CisJCWJyZWFrOwogCWNhc2UgQ01EX0ZDUF9JV1JJVEU2NF9DUjoKIAkJY29tbWFuZF90eXBlID0gRkNQX0NPTU1BTkRfREFUQV9PVVQ7CiAJCS8qIHdvcmQzIGlvY2I9aW90YWcgd3FlPXBheWxvYWRfb2Zmc2V0X2xlbiAqLwpAQCAtNzM3NSw3ICs3NTM0LDcgQEAKIAkJICAgICAgIExQRkNfV1FFX0xFTkxPQ19XT1JENCk7CiAJCWJmX3NldCh3cWVfZWJkZV9jbnQsICZ3cWUtPmZjcF9pd3JpdGUud3FlX2NvbSwgMCk7CiAJCWJmX3NldCh3cWVfcHUsICZ3cWUtPmZjcF9pd3JpdGUud3FlX2NvbSwgaW9jYnEtPmlvY2IudWxwUFUpOwotCWJyZWFrOworCQlicmVhazsKIAljYXNlIENNRF9GQ1BfSVJFQUQ2NF9DUjoKIAkJLyogd29yZDMgaW9jYj1pb3RhZyB3cWU9cGF5bG9hZF9vZmZzZXRfbGVuICovCiAJCS8qIEFkZCB0aGUgRkNQX0NNRCBhbmQgRkNQX1JTUCBzaXplcyB0byBnZXQgdGhlIG9mZnNldCAqLwpAQCAtNzM5NCw3ICs3NTUzLDcgQEAKIAkJICAgICAgIExQRkNfV1FFX0xFTkxPQ19XT1JENCk7CiAJCWJmX3NldCh3cWVfZWJkZV9jbnQsICZ3cWUtPmZjcF9pcmVhZC53cWVfY29tLCAwKTsKIAkJYmZfc2V0KHdxZV9wdSwgJndxZS0+ZmNwX2lyZWFkLndxZV9jb20sIGlvY2JxLT5pb2NiLnVscFBVKTsKLQlicmVhazsKKwkJYnJlYWs7CiAJY2FzZSBDTURfRkNQX0lDTU5ENjRfQ1I6CiAJCS8qIHdvcmQzIGlvY2I9SU9fVEFHIHdxZT1yZXNlcnZlZCAqLwogCQl3cWUtPmZjcF9pY21kLnJzcnZkMyA9IDA7CkBAIC03NDA3LDcgKzc1NjYsNyBAQAogCQliZl9zZXQod3FlX2xlbmxvYywgJndxZS0+ZmNwX2ljbWQud3FlX2NvbSwKIAkJICAgICAgIExQRkNfV1FFX0xFTkxPQ19OT05FKTsKIAkJYmZfc2V0KHdxZV9lYmRlX2NudCwgJndxZS0+ZmNwX2ljbWQud3FlX2NvbSwgMCk7Ci0JYnJlYWs7CisJCWJyZWFrOwogCWNhc2UgQ01EX0dFTl9SRVFVRVNUNjRfQ1I6CiAJCS8qIEZvciB0aGlzIGNvbW1hbmQgY2FsY3VsYXRlIHRoZSB4bWl0IGxlbmd0aCBvZiB0aGUKIAkJICogcmVxdWVzdCBiZGUuCkBAIC03NDQyLDcgKzc2MDEsNyBAQAogCQliZl9zZXQod3FlX2xlbmxvYywgJndxZS0+Z2VuX3JlcS53cWVfY29tLCBMUEZDX1dRRV9MRU5MT0NfTk9ORSk7CiAJCWJmX3NldCh3cWVfZWJkZV9jbnQsICZ3cWUtPmdlbl9yZXEud3FlX2NvbSwgMCk7CiAJCWNvbW1hbmRfdHlwZSA9IE9USEVSX0NPTU1BTkQ7Ci0JYnJlYWs7CisJCWJyZWFrOwogCWNhc2UgQ01EX1hNSVRfRUxTX1JTUDY0X0NYOgogCQluZGxwID0gKHN0cnVjdCBscGZjX25vZGVsaXN0ICopaW9jYnEtPmNvbnRleHQxOwogCQkvKiB3b3JkczAtMiBCREUgbWVtY3B5ICovCkBAIC03NDU3LDcgKzc2MTYsNyBAQAogCQkgICAgICAgKChpb2NicS0+aW9jYi51bHBDdF9oIDw8IDEpIHwgaW9jYnEtPmlvY2IudWxwQ3RfbCkpOwogCQliZl9zZXQod3FlX3B1LCAmd3FlLT54bWl0X2Vsc19yc3Aud3FlX2NvbSwgaW9jYnEtPmlvY2IudWxwUFUpOwogCQliZl9zZXQod3FlX3Jjdm94aWQsICZ3cWUtPnhtaXRfZWxzX3JzcC53cWVfY29tLAotCQkgICAgICAgaW9jYnEtPmlvY2IudWxwQ29udGV4dCk7CisJCSAgICAgICBpb2NicS0+aW9jYi51bnNsaTMucmN2c2xpMy5veF9pZCk7CiAJCWlmICghaW9jYnEtPmlvY2IudWxwQ3RfaCAmJiBpb2NicS0+aW9jYi51bHBDdF9sKQogCQkJYmZfc2V0KHdxZV9jdHh0X3RhZywgJndxZS0+eG1pdF9lbHNfcnNwLndxZV9jb20sCiAJCQkgICAgICAgcGhiYS0+dnBpX2lkc1tpb2NicS0+dnBvcnQtPnZwaV0pOwpAQCAtNzQ3MCw3ICs3NjI5LDcgQEAKIAkJYmZfc2V0KHdxZV9yc3BfdGVtcF9ycGksICZ3cWUtPnhtaXRfZWxzX3JzcCwKIAkJICAgICAgIHBoYmEtPnNsaTRfaGJhLnJwaV9pZHNbbmRscC0+bmxwX3JwaV0pOwogCQljb21tYW5kX3R5cGUgPSBPVEhFUl9DT01NQU5EOwotCWJyZWFrOworCQlicmVhazsKIAljYXNlIENNRF9DTE9TRV9YUklfQ046CiAJY2FzZSBDTURfQUJPUlRfWFJJX0NOOgogCWNhc2UgQ01EX0FCT1JUX1hSSV9DWDoKQEAgLTc1MDksNyArNzY2OCw3IEBACiAJCWNtbmQgPSBDTURfQUJPUlRfWFJJX0NYOwogCQljb21tYW5kX3R5cGUgPSBPVEhFUl9DT01NQU5EOwogCQl4cml0YWcgPSAwOwotCWJyZWFrOworCQlicmVhazsKIAljYXNlIENNRF9YTUlUX0JMU19SU1A2NF9DWDoKIAkJLyogQXMgQkxTIEFCVFMgUlNQIFdRRSBpcyB2ZXJ5IGRpZmZlcmVudCBmcm9tIG90aGVyIFdRRXMsCiAJCSAqIHdlIHJlLWNvbnN0cnVjdCB0aGlzIFdRRSBoZXJlIGJhc2VkIG9uIGluZm9ybWF0aW9uIGluCkBAIC03NTUzLDcgKzc3MTIsNyBAQAogCQkJICAgICAgIGJmX2dldChscGZjX3Jzbl9jb2RlLCAmaW9jYnEtPmlvY2IudW4uYmxzX3JzcCkpOwogCQl9CiAKLQlicmVhazsKKwkJYnJlYWs7CiAJY2FzZSBDTURfWFJJX0FCT1JURURfQ1g6CiAJY2FzZSBDTURfQ1JFQVRFX1hSSV9DUjogLyogRG8gd2UgZXhwZWN0IHRvIHVzZSB0aGlzPyAqLwogCWNhc2UgQ01EX0lPQ0JfRkNQX0lCSURJUjY0X0NSOiAvKiBiaWRpcmVjdGlvbmFsIHhmZXIgKi8KQEAgLTc1NjUsNyArNzcyNCw3IEBACiAJCQkJIjIwMTQgSW52YWxpZCBjb21tYW5kIDB4JXhcbiIsCiAJCQkJaW9jYnEtPmlvY2IudWxwQ29tbWFuZCk7CiAJCXJldHVybiBJT0NCX0VSUk9SOwotCWJyZWFrOworCQlicmVhazsKIAl9CiAKIAliZl9zZXQod3FlX3hyaV90YWcsICZ3cWUtPmdlbmVyaWMud3FlX2NvbSwgeHJpdGFnKTsKQEAgLTEwNDgxLDEwICsxMDY0MCwxNCBAQAogCXN0cnVjdCBscGZjX3F1ZXVlICpocnEgPSBwaGJhLT5zbGk0X2hiYS5oZHJfcnE7CiAJc3RydWN0IGxwZmNfcXVldWUgKmRycSA9IHBoYmEtPnNsaTRfaGJhLmRhdF9ycTsKIAlzdHJ1Y3QgaGJxX2RtYWJ1ZiAqZG1hX2J1ZjsKLQl1aW50MzJfdCBzdGF0dXM7CisJdWludDMyX3Qgc3RhdHVzLCBycV9pZDsKIAl1bnNpZ25lZCBsb25nIGlmbGFnczsKIAotCWlmIChiZl9nZXQobHBmY19yY3FlX3JxX2lkLCByY3FlKSAhPSBocnEtPnF1ZXVlX2lkKQorCWlmIChiZl9nZXQobHBmY19jcWVfY29kZSwgcmNxZSkgPT0gQ1FFX0NPREVfUkVDRUlWRV9WMSkKKwkJcnFfaWQgPSBiZl9nZXQobHBmY19yY3FlX3JxX2lkX3YxLCByY3FlKTsKKwllbHNlCisJCXJxX2lkID0gYmZfZ2V0KGxwZmNfcmNxZV9ycV9pZCwgcmNxZSk7CisJaWYgKHJxX2lkICE9IGhycS0+cXVldWVfaWQpCiAJCWdvdG8gb3V0OwogCiAJc3RhdHVzID0gYmZfZ2V0KGxwZmNfcmNxZV9zdGF0dXMsIHJjcWUpOwpAQCAtMTA1NjMsNiArMTA3MjYsNyBAQAogCQkJCShzdHJ1Y3Qgc2xpNF93Y3FlX3hyaV9hYm9ydGVkICopJmNxZXZ0KTsKIAkJYnJlYWs7CiAJY2FzZSBDUUVfQ09ERV9SRUNFSVZFOgorCWNhc2UgQ1FFX0NPREVfUkVDRUlWRV9WMToKIAkJLyogUHJvY2VzcyB0aGUgUlEgZXZlbnQgKi8KIAkJcGhiYS0+bGFzdF9jb21wbGV0aW9uX3RpbWUgPSBqaWZmaWVzOwogCQl3b3JrcG9zdGVkID0gbHBmY19zbGk0X3NwX2hhbmRsZV9yY3FlKHBoYmEsCkBAIC0xMjM0NSwxOSArMTI1MDksMTggQEAKIH0KIAogLyoqCi0gKiBscGZjX3NsaTRfaW5pdF9ycGlfaGRycyAtIFBvc3QgdGhlIHJwaSBoZWFkZXIgbWVtb3J5IHJlZ2lvbiB0byB0aGUgcG9ydAorICogbHBmY19zbGk0X2FsbG9jX3hyaSAtIEdldCBhbiBhdmFpbGFibGUgcnBpIGluIHRoZSBkZXZpY2UncyByYW5nZQogICogQHBoYmE6IHBvaW50ZXIgdG8gbHBmYyBoYmEgZGF0YSBzdHJ1Y3R1cmUuCiAgKgogICogVGhpcyByb3V0aW5lIGlzIGludm9rZWQgdG8gcG9zdCBycGkgaGVhZGVyIHRlbXBsYXRlcyB0byB0aGUKLSAqIHBvcnQgZm9yIHRob3NlIFNMSTQgcG9ydHMgdGhhdCBkbyBub3Qgc3VwcG9ydCBleHRlbnRzLiAgVGhpcyByb3V0aW5lCi0gKiBwb3N0cyBhIFBBR0VfU0laRSBtZW1vcnkgcmVnaW9uIHRvIHRoZSBwb3J0IHRvIGhvbGQgdXAgdG8KLSAqIFBBR0VfU0laRSBtb2R1bG8gNjQgcnBpIGNvbnRleHQgaGVhZGVycy4gIFRoaXMgaXMgYW4gaW5pdGlhbGl6YXRpb24gcm91dGluZQotICogYW5kIHNob3VsZCBiZSBjYWxsZWQgb25seSB3aGVuIGludGVycnVwdHMgYXJlIGRpc2FibGVkLgorICogSEJBIGNvbnNpc3RlbnQgd2l0aCB0aGUgU0xJLTQgaW50ZXJmYWNlIHNwZWMuICBUaGlzIHJvdXRpbmUKKyAqIHBvc3RzIGEgU0xJNF9QQUdFX1NJWkUgbWVtb3J5IHJlZ2lvbiB0byB0aGUgcG9ydCB0byBob2xkIHVwIHRvCisgKiBTTEk0X1BBR0VfU0laRSBtb2R1bG8gNjQgcnBpIGNvbnRleHQgaGVhZGVycy4KICAqCi0gKiBSZXR1cm4gY29kZXMKLSAqCTAgLSBzdWNjZXNzZnVsCi0gKgktRVJST1IgLSBvdGhlcndpc2UuCi0gKi8KKyAqIFJldHVybnMKKyAqCUEgbm9uemVybyBycGkgZGVmaW5lZCBhcyBycGlfYmFzZSA8PSBycGkgPCBtYXhfcnBpIGlmIHN1Y2Nlc3NmdWwKKyAqCUxQRkNfUlBJX0FMTE9DX0VSUk9SIGlmIG5vIHJwaXMgYXJlIGF2YWlsYWJsZS4KKyAqKi8KIHVpbnQxNl90CiBscGZjX3NsaTRfYWxsb2NfeHJpKHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKIHsKQEAgLTEzNDA2LDcgKzEzNTY5LDcgQEAKICAqIFRoaXMgZnVuY3Rpb24gdmFsaWRhdGVzIHRoZSB4cmkgbWFwcyB0byB0aGUga25vd24gcmFuZ2Ugb2YgWFJJcyBhbGxvY2F0ZWQgYW4KICAqIHVzZWQgYnkgdGhlIGRyaXZlci4KICAqKi8KLXN0YXRpYyB1aW50MTZfdAordWludDE2X3QKIGxwZmNfc2xpNF94cmlfaW5yYW5nZShzdHJ1Y3QgbHBmY19oYmEgKnBoYmEsCiAJCSAgICAgIHVpbnQxNl90IHhyaSkKIHsKQEAgLTEzNjQzLDEwICsxMzgwNiwxMiBAQAogc3RhdGljIHN0cnVjdCBscGZjX2lvY2JxICoKIGxwZmNfcHJlcF9zZXEoc3RydWN0IGxwZmNfdnBvcnQgKnZwb3J0LCBzdHJ1Y3QgaGJxX2RtYWJ1ZiAqc2VxX2RtYWJ1ZikKIHsKKwlzdHJ1Y3QgaGJxX2RtYWJ1ZiAqaGJxX2J1ZjsKIAlzdHJ1Y3QgbHBmY19kbWFidWYgKmRfYnVmLCAqbl9idWY7CiAJc3RydWN0IGxwZmNfaW9jYnEgKmZpcnN0X2lvY2JxLCAqaW9jYnE7CiAJc3RydWN0IGZjX2ZyYW1lX2hlYWRlciAqZmNfaGRyOwogCXVpbnQzMl90IHNpZDsKKwl1aW50MzJfdCBsZW4sIHRvdF9sZW47CiAJc3RydWN0IHVscF9iZGU2NCAqcGJkZTsKIAogCWZjX2hkciA9IChzdHJ1Y3QgZmNfZnJhbWVfaGVhZGVyICopc2VxX2RtYWJ1Zi0+aGJ1Zi52aXJ0OwpAQCAtMTM2NTUsNiArMTM4MjAsNyBAQAogCWxwZmNfdXBkYXRlX3Jjdl90aW1lX3N0YW1wKHZwb3J0KTsKIAkvKiBnZXQgdGhlIFJlbW90ZSBQb3J0J3MgU0lEICovCiAJc2lkID0gc2xpNF9zaWRfZnJvbV9mY19oZHIoZmNfaGRyKTsKKwl0b3RfbGVuID0gMDsKIAkvKiBHZXQgYW4gaW9jYnEgc3RydWN0IHRvIGZpbGwgaW4uICovCiAJZmlyc3RfaW9jYnEgPSBscGZjX3NsaV9nZXRfaW9jYnEodnBvcnQtPnBoYmEpOwogCWlmIChmaXJzdF9pb2NicSkgewpAQCAtMTM2NjIsOSArMTM4MjgsMTIgQEAKIAkJZmlyc3RfaW9jYnEtPmlvY2IudW5zbGkzLnJjdnNsaTMuYWNjX2xlbiA9IDA7CiAJCWZpcnN0X2lvY2JxLT5pb2NiLnVscFN0YXR1cyA9IElPU1RBVF9TVUNDRVNTOwogCQlmaXJzdF9pb2NicS0+aW9jYi51bHBDb21tYW5kID0gQ01EX0lPQ0JfUkNWX1NFUTY0X0NYOwotCQlmaXJzdF9pb2NicS0+aW9jYi51bHBDb250ZXh0ID0gYmUxNl90b19jcHUoZmNfaGRyLT5maF9veF9pZCk7Ci0JCS8qIGlvY2JxIGlzIHByZXBwZWQgZm9yIGludGVybmFsIGNvbnN1bXB0aW9uLiAgTG9naWNhbCB2cGkuICovCi0JCWZpcnN0X2lvY2JxLT5pb2NiLnVuc2xpMy5yY3ZzbGkzLnZwaSA9IHZwb3J0LT52cGk7CisJCWZpcnN0X2lvY2JxLT5pb2NiLnVscENvbnRleHQgPSBOT19YUkk7CisJCWZpcnN0X2lvY2JxLT5pb2NiLnVuc2xpMy5yY3ZzbGkzLm94X2lkID0KKwkJCWJlMTZfdG9fY3B1KGZjX2hkci0+Zmhfb3hfaWQpOworCQkvKiBpb2NicSBpcyBwcmVwcGVkIGZvciBpbnRlcm5hbCBjb25zdW1wdGlvbi4gIFBoeXNpY2FsIHZwaS4gKi8KKwkJZmlyc3RfaW9jYnEtPmlvY2IudW5zbGkzLnJjdnNsaTMudnBpID0KKwkJCXZwb3J0LT5waGJhLT52cGlfaWRzW3Zwb3J0LT52cGldOwogCQkvKiBwdXQgdGhlIGZpcnN0IGJ1ZmZlciBpbnRvIHRoZSBmaXJzdCBJT0NCcSAqLwogCQlmaXJzdF9pb2NicS0+Y29udGV4dDIgPSAmc2VxX2RtYWJ1Zi0+ZGJ1ZjsKIAkJZmlyc3RfaW9jYnEtPmNvbnRleHQzID0gTlVMTDsKQEAgLTEzNjcyLDkgKzEzODQxLDkgQEAKIAkJZmlyc3RfaW9jYnEtPmlvY2IudW4uY29udDY0WzBdLnR1cy5mLmJkZVNpemUgPQogCQkJCQkJCUxQRkNfREFUQV9CVUZfU0laRTsKIAkJZmlyc3RfaW9jYnEtPmlvY2IudW4ucmN2ZWxzLnJlbW90ZUlEID0gc2lkOwotCQlmaXJzdF9pb2NicS0+aW9jYi51bnNsaTMucmN2c2xpMy5hY2NfbGVuICs9Ci0JCQkJYmZfZ2V0KGxwZmNfcmNxZV9sZW5ndGgsCisJCXRvdF9sZW4gPSBiZl9nZXQobHBmY19yY3FlX2xlbmd0aCwKIAkJCQkgICAgICAgJnNlcV9kbWFidWYtPmNxX2V2ZW50LmNxZS5yY3FlX2NtcGwpOworCQlmaXJzdF9pb2NicS0+aW9jYi51bnNsaTMucmN2c2xpMy5hY2NfbGVuID0gdG90X2xlbjsKIAl9CiAJaW9jYnEgPSBmaXJzdF9pb2NicTsKIAkvKgpAQCAtMTM2OTIsOSArMTM4NjEsMTMgQEAKIAkJCXBiZGUgPSAoc3RydWN0IHVscF9iZGU2NCAqKQogCQkJCQkmaW9jYnEtPmlvY2IudW5zbGkzLnNsaTNXb3Jkc1s0XTsKIAkJCXBiZGUtPnR1cy5mLmJkZVNpemUgPSBMUEZDX0RBVEFfQlVGX1NJWkU7Ci0JCQlmaXJzdF9pb2NicS0+aW9jYi51bnNsaTMucmN2c2xpMy5hY2NfbGVuICs9Ci0JCQkJYmZfZ2V0KGxwZmNfcmNxZV9sZW5ndGgsCi0JCQkJICAgICAgICZzZXFfZG1hYnVmLT5jcV9ldmVudC5jcWUucmNxZV9jbXBsKTsKKworCQkJLyogV2UgbmVlZCB0byBnZXQgdGhlIHNpemUgb3V0IG9mIHRoZSByaWdodCBDUUUgKi8KKwkJCWhicV9idWYgPSBjb250YWluZXJfb2YoZF9idWYsIHN0cnVjdCBoYnFfZG1hYnVmLCBkYnVmKTsKKwkJCWxlbiA9IGJmX2dldChscGZjX3JjcWVfbGVuZ3RoLAorCQkJCSAgICAgICAmaGJxX2J1Zi0+Y3FfZXZlbnQuY3FlLnJjcWVfY21wbCk7CisJCQlpb2NicS0+aW9jYi51bnNsaTMucmN2c2xpMy5hY2NfbGVuICs9IGxlbjsKKwkJCXRvdF9sZW4gKz0gbGVuOwogCQl9IGVsc2UgewogCQkJaW9jYnEgPSBscGZjX3NsaV9nZXRfaW9jYnEodnBvcnQtPnBoYmEpOwogCQkJaWYgKCFpb2NicSkgewpAQCAtMTM3MTIsOSArMTM4ODUsMTQgQEAKIAkJCWlvY2JxLT5pb2NiLnVscEJkZUNvdW50ID0gMTsKIAkJCWlvY2JxLT5pb2NiLnVuLmNvbnQ2NFswXS50dXMuZi5iZGVTaXplID0KIAkJCQkJCQlMUEZDX0RBVEFfQlVGX1NJWkU7Ci0JCQlmaXJzdF9pb2NicS0+aW9jYi51bnNsaTMucmN2c2xpMy5hY2NfbGVuICs9Ci0JCQkJYmZfZ2V0KGxwZmNfcmNxZV9sZW5ndGgsCi0JCQkJICAgICAgICZzZXFfZG1hYnVmLT5jcV9ldmVudC5jcWUucmNxZV9jbXBsKTsKKworCQkJLyogV2UgbmVlZCB0byBnZXQgdGhlIHNpemUgb3V0IG9mIHRoZSByaWdodCBDUUUgKi8KKwkJCWhicV9idWYgPSBjb250YWluZXJfb2YoZF9idWYsIHN0cnVjdCBoYnFfZG1hYnVmLCBkYnVmKTsKKwkJCWxlbiA9IGJmX2dldChscGZjX3JjcWVfbGVuZ3RoLAorCQkJCSAgICAgICAmaGJxX2J1Zi0+Y3FfZXZlbnQuY3FlLnJjcWVfY21wbCk7CisJCQl0b3RfbGVuICs9IGxlbjsKKwkJCWlvY2JxLT5pb2NiLnVuc2xpMy5yY3ZzbGkzLmFjY19sZW4gPSB0b3RfbGVuOworCiAJCQlpb2NicS0+aW9jYi51bi5yY3ZlbHMucmVtb3RlSUQgPSBzaWQ7CiAJCQlsaXN0X2FkZF90YWlsKCZpb2NicS0+bGlzdCwgJmZpcnN0X2lvY2JxLT5saXN0KTsKIAkJfQpAQCAtMTM3ODcsNyArMTM5NjUsMTMgQEAKIAkJbHBmY19pbl9idWZfZnJlZShwaGJhLCAmZG1hYnVmLT5kYnVmKTsKIAkJcmV0dXJuOwogCX0KLQlmY2ZpID0gYmZfZ2V0KGxwZmNfcmNxZV9mY2ZfaWQsICZkbWFidWYtPmNxX2V2ZW50LmNxZS5yY3FlX2NtcGwpOworCWlmICgoYmZfZ2V0KGxwZmNfY3FlX2NvZGUsCisJCSAgICAmZG1hYnVmLT5jcV9ldmVudC5jcWUucmNxZV9jbXBsKSA9PSBDUUVfQ09ERV9SRUNFSVZFX1YxKSkKKwkJZmNmaSA9IGJmX2dldChscGZjX3JjcWVfZmNmX2lkX3YxLAorCQkJICAgICAgJmRtYWJ1Zi0+Y3FfZXZlbnQuY3FlLnJjcWVfY21wbCk7CisJZWxzZQorCQlmY2ZpID0gYmZfZ2V0KGxwZmNfcmNxZV9mY2ZfaWQsCisJCQkgICAgICAmZG1hYnVmLT5jcV9ldmVudC5jcWUucmNxZV9jbXBsKTsKIAl2cG9ydCA9IGxwZmNfZmNfZnJhbWVfdG9fdnBvcnQocGhiYSwgZmNfaGRyLCBmY2ZpKTsKIAlpZiAoIXZwb3J0IHx8ICEodnBvcnQtPnZwaV9zdGF0ZSAmIExQRkNfVlBJX1JFR0lTVEVSRUQpKSB7CiAJCS8qIHRocm93IG91dCB0aGUgZnJhbWUgKi8KQEAgLTE0NDUxLDYgKzE0NjM1LDkyIEBACiB9CiAKIC8qKgorICogbHBmY19jaGVja19uZXh0X2ZjZl9wcmkKKyAqIHBoYmEgcG9pbnRlciB0byB0aGUgbHBmY19oYmEgc3RydWN0IGZvciB0aGlzIHBvcnQuCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGZyb20gdGhlIGxwZmNfc2xpNF9mY2ZfcnJfbmV4dF9pbmRleF9nZXQKKyAqIHJvdXRpbmUgd2hlbiB0aGUgcnJfYm1hc2sgaXMgZW1wdHkuIFRoZSBGQ0YgaW5kZWNpZXMgYXJlIHB1dCBpbnRvIHRoZQorICogcnJfYm1hc2sgYmFzZWQgb24gdGhlaXIgcHJpb3JpdHkgbGV2ZWwuIFN0YXJ0aW5nIGZyb20gdGhlIGhpZ2hlc3QgcHJpb3JpdHkKKyAqIHRvIHRoZSBsb3dlc3QuIFRoZSBtb3N0IGxpa2VseSBGQ0YgY2FuZGlkYXRlIHdpbGwgYmUgaW4gdGhlIGhpZ2hlc3QKKyAqIHByaW9yaXR5IGdyb3VwLiBXaGVuIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgaXQgc2VhcmNoZXMgdGhlIGZjZl9wcmkgbGlzdCBmb3IKKyAqIG5leHQgbG93ZXN0IHByaW9yaXR5IGdyb3VwIGFuZCByZXBvcHVsYXRlcyB0aGUgcnJfYm1hc2sgd2l0aCBvbmx5IHRob3NlCisgKiBmY2ZfaW5kZXhlcy4KKyAqIHJldHVybnM6CisgKiAxPXN1Y2Nlc3MgMD1mYWlsdXJlCisgKiovCitpbnQKK2xwZmNfY2hlY2tfbmV4dF9mY2ZfcHJpX2xldmVsKHN0cnVjdCBscGZjX2hiYSAqcGhiYSkKK3sKKwl1aW50MTZfdCBuZXh0X2ZjZl9wcmk7CisJdWludDE2X3QgbGFzdF9pbmRleDsKKwlzdHJ1Y3QgbHBmY19mY2ZfcHJpICpmY2ZfcHJpOworCWludCByYzsKKwlpbnQgcmV0ID0gMDsKKworCWxhc3RfaW5kZXggPSBmaW5kX2ZpcnN0X2JpdChwaGJhLT5mY2YuZmNmX3JyX2JtYXNrLAorCQkJTFBGQ19TTEk0X0ZDRl9UQkxfSU5EWF9NQVgpOworCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0lORk8sIExPR19GSVAsCisJCQkiMzA2MCBMYXN0IElEWCAlZFxuIiwgbGFzdF9pbmRleCk7CisJaWYgKGxpc3RfZW1wdHkoJnBoYmEtPmZjZi5mY2ZfcHJpX2xpc3QpKSB7CisJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX0VSUiwgTE9HX0ZJUCwKKwkJCSIzMDYxIExhc3QgSURYICVkXG4iLCBsYXN0X2luZGV4KTsKKwkJcmV0dXJuIDA7IC8qIEVtcHR5IHJyIGxpc3QgKi8KKwl9CisJbmV4dF9mY2ZfcHJpID0gMDsKKwkvKgorCSAqIENsZWFyIHRoZSBycl9ibWFzayBhbmQgc2V0IGFsbCBvZiB0aGUgYml0cyB0aGF0IGFyZSBhdCB0aGlzCisJICogcHJpb3JpdHkuCisJICovCisJbWVtc2V0KHBoYmEtPmZjZi5mY2ZfcnJfYm1hc2ssIDAsCisJCQlzaXplb2YoKnBoYmEtPmZjZi5mY2ZfcnJfYm1hc2spKTsKKwlzcGluX2xvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZjZl9wcmksICZwaGJhLT5mY2YuZmNmX3ByaV9saXN0LCBsaXN0KSB7CisJCWlmIChmY2ZfcHJpLT5mY2ZfcmVjLmZsYWcgJiBMUEZDX0ZDRl9GTE9HSV9GQUlMRUQpCisJCQljb250aW51ZTsKKwkJLyoKKwkJICogdGhlIDFzdCBwcmlvcml0eSB0aGF0IGhhcyBub3QgRkxPR0kgZmFpbGVkCisJCSAqIHdpbGwgYmUgdGhlIGhpZ2hlc3QuCisJCSAqLworCQlpZiAoIW5leHRfZmNmX3ByaSkKKwkJCW5leHRfZmNmX3ByaSA9IGZjZl9wcmktPmZjZl9yZWMucHJpb3JpdHk7CisJCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJCWlmIChmY2ZfcHJpLT5mY2ZfcmVjLnByaW9yaXR5ID09IG5leHRfZmNmX3ByaSkgeworCQkJcmMgPSBscGZjX3NsaTRfZmNmX3JyX2luZGV4X3NldChwaGJhLAorCQkJCQkJZmNmX3ByaS0+ZmNmX3JlYy5mY2ZfaW5kZXgpOworCQkJaWYgKHJjKQorCQkJCXJldHVybiAwOworCQl9CisJCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCX0KKwkvKgorCSAqIGlmIG5leHRfZmNmX3ByaSB3YXMgbm90IHNldCBhYm92ZSBhbmQgdGhlIGxpc3QgaXMgbm90IGVtcHR5IHRoZW4KKwkgKiB3ZSBoYXZlIGZhaWxlZCBmbG9naXMgb24gYWxsIG9mIHRoZW0uIFNvIHJlc2V0IGZsb2dpIGZhaWxlZAorCSAqIGFuZCBzdGFydCBhdCB0aGUgYmVnaW5pbmcuCisJICovCisJaWYgKCFuZXh0X2ZjZl9wcmkgJiYgIWxpc3RfZW1wdHkoJnBoYmEtPmZjZi5mY2ZfcHJpX2xpc3QpKSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZmNmX3ByaSwgJnBoYmEtPmZjZi5mY2ZfcHJpX2xpc3QsIGxpc3QpIHsKKwkJCWZjZl9wcmktPmZjZl9yZWMuZmxhZyAmPSB+TFBGQ19GQ0ZfRkxPR0lfRkFJTEVEOworCQkJLyoKKwkJCSAqIHRoZSAxc3QgcHJpb3JpdHkgdGhhdCBoYXMgbm90IEZMT0dJIGZhaWxlZAorCQkJICogd2lsbCBiZSB0aGUgaGlnaGVzdC4KKwkJCSAqLworCQkJaWYgKCFuZXh0X2ZjZl9wcmkpCisJCQkJbmV4dF9mY2ZfcHJpID0gZmNmX3ByaS0+ZmNmX3JlYy5wcmlvcml0eTsKKwkJCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJCQlpZiAoZmNmX3ByaS0+ZmNmX3JlYy5wcmlvcml0eSA9PSBuZXh0X2ZjZl9wcmkpIHsKKwkJCQlyYyA9IGxwZmNfc2xpNF9mY2ZfcnJfaW5kZXhfc2V0KHBoYmEsCisJCQkJCQlmY2ZfcHJpLT5mY2ZfcmVjLmZjZl9pbmRleCk7CisJCQkJaWYgKHJjKQorCQkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCXNwaW5fbG9ja19pcnEoJnBoYmEtPmhiYWxvY2spOworCQl9CisJfSBlbHNlCisJCXJldCA9IDE7CisJc3Bpbl91bmxvY2tfaXJxKCZwaGJhLT5oYmFsb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisvKioKICAqIGxwZmNfc2xpNF9mY2ZfcnJfbmV4dF9pbmRleF9nZXQgLSBHZXQgbmV4dCBlbGlnaWJsZSBmY2YgcmVjb3JkIGluZGV4CiAgKiBAcGhiYTogcG9pbnRlciB0byBscGZjIGhiYSBkYXRhIHN0cnVjdHVyZS4KICAqCkBAIC0xNDQ2Niw2ICsxNDczNiw3IEBACiAJdWludDE2X3QgbmV4dF9mY2ZfaW5kZXg7CiAKIAkvKiBTZWFyY2ggc3RhcnQgZnJvbSBuZXh0IGJpdCBvZiBjdXJyZW50bHkgcmVnaXN0ZXJlZCBGQ0YgaW5kZXggKi8KK25leHRfcHJpb3JpdHk6CiAJbmV4dF9mY2ZfaW5kZXggPSAocGhiYS0+ZmNmLmN1cnJlbnRfcmVjLmZjZl9pbmR4ICsgMSkgJQogCQkJCQlMUEZDX1NMSTRfRkNGX1RCTF9JTkRYX01BWDsKIAluZXh0X2ZjZl9pbmRleCA9IGZpbmRfbmV4dF9iaXQocGhiYS0+ZmNmLmZjZl9ycl9ibWFzaywKQEAgLTE0NDczLDE3ICsxNDc0NCw0NiBAQAogCQkJCSAgICAgICBuZXh0X2ZjZl9pbmRleCk7CiAKIAkvKiBXcmFwIGFyb3VuZCBjb25kaXRpb24gb24gcGhiYS0+ZmNmLmZjZl9ycl9ibWFzayAqLwotCWlmIChuZXh0X2ZjZl9pbmRleCA+PSBMUEZDX1NMSTRfRkNGX1RCTF9JTkRYX01BWCkKKwlpZiAobmV4dF9mY2ZfaW5kZXggPj0gTFBGQ19TTEk0X0ZDRl9UQkxfSU5EWF9NQVgpIHsKKwkJLyoKKwkJICogSWYgd2UgaGF2ZSB3cmFwcGVkIHRoZW4gd2UgbmVlZCB0byBjbGVhciB0aGUgYml0cyB0aGF0CisJCSAqIGhhdmUgYmVlbiB0ZXN0ZWQgc28gdGhhdCB3ZSBjYW4gZGV0ZWN0IHdoZW4gd2Ugc2hvdWxkCisJCSAqIGNoYW5nZSB0aGUgcHJpb3JpdHkgbGV2ZWwuCisJCSAqLwogCQluZXh0X2ZjZl9pbmRleCA9IGZpbmRfbmV4dF9iaXQocGhiYS0+ZmNmLmZjZl9ycl9ibWFzaywKIAkJCQkJICAgICAgIExQRkNfU0xJNF9GQ0ZfVEJMX0lORFhfTUFYLCAwKTsKKwl9CisKIAogCS8qIENoZWNrIHJvdW5kcm9iaW4gZmFpbG92ZXIgbGlzdCBlbXB0eSBjb25kaXRpb24gKi8KLQlpZiAobmV4dF9mY2ZfaW5kZXggPj0gTFBGQ19TTEk0X0ZDRl9UQkxfSU5EWF9NQVgpIHsKKwlpZiAobmV4dF9mY2ZfaW5kZXggPj0gTFBGQ19TTEk0X0ZDRl9UQkxfSU5EWF9NQVggfHwKKwkJbmV4dF9mY2ZfaW5kZXggPT0gcGhiYS0+ZmNmLmN1cnJlbnRfcmVjLmZjZl9pbmR4KSB7CisJCS8qCisJCSAqIElmIG5leHQgZmNmIGluZGV4IGlzIG5vdCBmb3VuZCBjaGVjayBpZiB0aGVyZSBhcmUgbG93ZXIKKwkJICogUHJpb3JpdHkgbGV2ZWwgZmNmJ3MgaW4gdGhlIGZjZl9wcmlvcml0eSBsaXN0LgorCQkgKiBTZXQgdXAgdGhlIHJyX2JtYXNrIHdpdGggYWxsIG9mIHRoZSBhdmFpYWJsZSBmY2YgYml0cworCQkgKiBhdCB0aGF0IGxldmVsIGFuZCBjb250aW51ZSB0aGUgc2VsZWN0aW9uIHByb2Nlc3MuCisJCSAqLworCQlpZiAobHBmY19jaGVja19uZXh0X2ZjZl9wcmlfbGV2ZWwocGhiYSkpCisJCQlnb3RvIG5leHRfcHJpb3JpdHk7CiAJCWxwZmNfcHJpbnRmX2xvZyhwaGJhLCBLRVJOX1dBUk5JTkcsIExPR19GSVAsCiAJCQkJIjI4NDQgTm8gcm91bmRyb2JpbiBmYWlsb3ZlciBGQ0YgYXZhaWxhYmxlXG4iKTsKLQkJcmV0dXJuIExQRkNfRkNPRV9GQ0ZfTkVYVF9OT05FOworCQlpZiAobmV4dF9mY2ZfaW5kZXggPj0gTFBGQ19TTEk0X0ZDRl9UQkxfSU5EWF9NQVgpCisJCQlyZXR1cm4gTFBGQ19GQ09FX0ZDRl9ORVhUX05PTkU7CisJCWVsc2UgeworCQkJbHBmY19wcmludGZfbG9nKHBoYmEsIEtFUk5fV0FSTklORywgTE9HX0ZJUCwKKwkJCQkiMzA2MyBPbmx5IEZDRiBhdmFpbGFibGUgaWR4ICVkLCBmbGFnICV4XG4iLAorCQkJCW5leHRfZmNmX2luZGV4LAorCQkJcGhiYS0+ZmNmLmZjZl9wcmlbbmV4dF9mY2ZfaW5kZXhdLmZjZl9yZWMuZmxhZyk7CisJCQlyZXR1cm4gbmV4dF9mY2ZfaW5kZXg7CisJCX0KIAl9CiAKKwlpZiAobmV4dF9mY2ZfaW5kZXggPCBMUEZDX1NMSTRfRkNGX1RCTF9JTkRYX01BWCAmJgorCQlwaGJhLT5mY2YuZmNmX3ByaVtuZXh0X2ZjZl9pbmRleF0uZmNmX3JlYy5mbGFnICYKKwkJTFBGQ19GQ0ZfRkxPR0lfRkFJTEVEKQorCQlnb3RvIG5leHRfcHJpb3JpdHk7CisKIAlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfRklQLAogCQkJIjI4NDUgR2V0IG5leHQgcm91bmRyb2JpbiBmYWlsb3ZlciBGQ0YgKHgleClcbiIsCiAJCQluZXh0X2ZjZl9pbmRleCk7CkBAIC0xNDUzNSw2ICsxNDgzNSw3IEBACiB2b2lkCiBscGZjX3NsaTRfZmNmX3JyX2luZGV4X2NsZWFyKHN0cnVjdCBscGZjX2hiYSAqcGhiYSwgdWludDE2X3QgZmNmX2luZGV4KQogeworCXN0cnVjdCBscGZjX2ZjZl9wcmkgKmZjZl9wcmk7CiAJaWYgKGZjZl9pbmRleCA+PSBMUEZDX1NMSTRfRkNGX1RCTF9JTkRYX01BWCkgewogCQlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9FUlIsIExPR19GSVAsCiAJCQkJIjI3NjIgRkNGICh4JXgpIHJlYWNoZWQgZHJpdmVyJ3MgYm9vayAiCkBAIC0xNDU0Myw2ICsxNDg0NCwxNCBAQAogCQlyZXR1cm47CiAJfQogCS8qIENsZWFyIHRoZSBlbGlnaWJsZSBGQ0YgcmVjb3JkIGluZGV4IGJtYXNrICovCisJc3Bpbl9sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShmY2ZfcHJpLCAmcGhiYS0+ZmNmLmZjZl9wcmlfbGlzdCwgbGlzdCkgeworCQlpZiAoZmNmX3ByaS0+ZmNmX3JlYy5mY2ZfaW5kZXggPT0gZmNmX2luZGV4KSB7CisJCQlsaXN0X2RlbF9pbml0KCZmY2ZfcHJpLT5saXN0KTsKKwkJCWJyZWFrOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycSgmcGhiYS0+aGJhbG9jayk7CiAJY2xlYXJfYml0KGZjZl9pbmRleCwgcGhiYS0+ZmNmLmZjZl9ycl9ibWFzayk7CiAKIAlscGZjX3ByaW50Zl9sb2cocGhiYSwgS0VSTl9JTkZPLCBMT0dfRklQLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY19zbGk0LmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaTQuaAppbmRleCA0YjE3MDM1Li4xOWJiODdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaTQuaAorKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3NsaTQuaApAQCAtODEsNiArODEsOCBAQAogCSAoZmNfaGRyKS0+ZmhfZl9jdGxbMV0gPDwgIDggfCBcCiAJIChmY19oZHIpLT5maF9mX2N0bFsyXSkKIAorI2RlZmluZSBMUEZDX0ZXX1JFU0VUX01BWElNVU1fV0FJVF8xME1TX0NOVCAxMjAwMAorCiBlbnVtIGxwZmNfc2xpNF9xdWV1ZV90eXBlIHsKIAlMUEZDX0VRLAogCUxQRkNfR0NRLApAQCAtMTU3LDYgKzE1OSwyNSBAQAogI2RlZmluZSBSRUNPUkRfVkFMSUQJMHgwMgogfTsKIAorc3RydWN0IGxwZmNfZmNmX3ByaV9yZWMgeworCXVpbnQxNl90IGZjZl9pbmRleDsKKyNkZWZpbmUgTFBGQ19GQ0ZfT05fUFJJX0xJU1QgMHgwMDAxCisjZGVmaW5lIExQRkNfRkNGX0ZMT0dJX0ZBSUxFRCAweDAwMDIKKwl1aW50MTZfdCBmbGFnOworCXVpbnQzMl90IHByaW9yaXR5OworfTsKKworc3RydWN0IGxwZmNfZmNmX3ByaSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXN0cnVjdCBscGZjX2ZjZl9wcmlfcmVjIGZjZl9yZWM7Cit9OworCisvKgorICogTWF4aW11bSBGQ0YgdGFibGUgaW5kZXgsIGl0IGlzIGZvciBkcml2ZXIgaW50ZXJuYWwgYm9vayBrZWVwaW5nLCBpdAorICoganVzdCBuZWVkcyB0byBiZSBubyBsZXNzIHRoYW4gdGhlIHN1cHBvcnRlZCBIQkEncyBGQ0YgdGFibGUgc2l6ZS4KKyAqLworI2RlZmluZSBMUEZDX1NMSTRfRkNGX1RCTF9JTkRYX01BWAkzMgorCiBzdHJ1Y3QgbHBmY19mY2YgewogCXVpbnQxNl90IGZjZmk7CiAJdWludDMyX3QgZmNmX2ZsYWc7CkBAIC0xNzYsMTUgKzE5NywxMyBAQAogCXVpbnQzMl90IGVsaWdpYmxlX2ZjZl9jbnQ7CiAJc3RydWN0IGxwZmNfZmNmX3JlYyBjdXJyZW50X3JlYzsKIAlzdHJ1Y3QgbHBmY19mY2ZfcmVjIGZhaWxvdmVyX3JlYzsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGZjZl9wcmlfbGlzdDsKKwlzdHJ1Y3QgbHBmY19mY2ZfcHJpIGZjZl9wcmlbTFBGQ19TTEk0X0ZDRl9UQkxfSU5EWF9NQVhdOworCXVpbnQzMl90IGN1cnJlbnRfZmNmX3NjYW5fcHJpOwogCXN0cnVjdCB0aW1lcl9saXN0IHJlZGlzY193YWl0OwogCXVuc2lnbmVkIGxvbmcgKmZjZl9ycl9ibWFzazsgLyogRWxpZ2libGUgRkNGIGluZGV4ZXMgZm9yIFJSIGZhaWxvdmVyICovCiB9OwogCi0vKgotICogTWF4aW11bSBGQ0YgdGFibGUgaW5kZXgsIGl0IGlzIGZvciBkcml2ZXIgaW50ZXJuYWwgYm9vayBrZWVwaW5nLCBpdAotICoganVzdCBuZWVkcyB0byBiZSBubyBsZXNzIHRoYW4gdGhlIHN1cHBvcnRlZCBIQkEncyBGQ0YgdGFibGUgc2l6ZS4KLSAqLwotI2RlZmluZSBMUEZDX1NMSTRfRkNGX1RCTF9JTkRYX01BWAkzMgogCiAjZGVmaW5lIExQRkNfUkVHSU9OMjNfU0lHTkFUVVJFICJSRzIzIgogI2RlZmluZSBMUEZDX1JFR0lPTjIzX1ZFUlNJT04JMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2xwZmMvbHBmY192ZXJzaW9uLmggYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3ZlcnNpb24uaAppbmRleCBjMDM5MjFiLi5jMWUwYWU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3ZlcnNpb24uaAorKysgYi9kcml2ZXJzL3Njc2kvbHBmYy9scGZjX3ZlcnNpb24uaApAQCAtMTgsNyArMTgsNyBAQAogICogaW5jbHVkZWQgd2l0aCB0aGlzIHBhY2thZ2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIExQRkNfRFJJVkVSX1ZFUlNJT04gIjguMy4yMyIKKyNkZWZpbmUgTFBGQ19EUklWRVJfVkVSU0lPTiAiOC4zLjI1IgogI2RlZmluZSBMUEZDX0RSSVZFUl9OQU1FCQkibHBmYyIKICNkZWZpbmUgTFBGQ19TUF9EUklWRVJfSEFORExFUl9OQU1FCSJscGZjOnNwIgogI2RlZmluZSBMUEZDX0ZQX0RSSVZFUl9IQU5ETEVSX05BTUUJImxwZmM6ZnAiCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzLmggYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzLmgKaW5kZXggNzM3MGMwOC4uMzk0OGEwMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhcy5oCisrKyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXMuaApAQCAtMzMsOSArMzMsOSBAQAogLyoKICAqIE1lZ2FSQUlEIFNBUyBEcml2ZXIgbWV0YSBkYXRhCiAgKi8KLSNkZWZpbmUgTUVHQVNBU19WRVJTSU9OCQkJCSIwMC4wMC4wNS4zOC1yYzEiCi0jZGVmaW5lIE1FR0FTQVNfUkVMREFURQkJCQkiTWF5LiAxMSwgMjAxMSIKLSNkZWZpbmUgTUVHQVNBU19FWFRfVkVSU0lPTgkJCSJXZWQuIE1heS4gMTEgMTc6MDA6MDAgUERUIDIwMTEiCisjZGVmaW5lIE1FR0FTQVNfVkVSU0lPTgkJCQkiMDAuMDAuMDUuNDAtcmMxIgorI2RlZmluZSBNRUdBU0FTX1JFTERBVEUJCQkJIkp1bC4gMjYsIDIwMTEiCisjZGVmaW5lIE1FR0FTQVNfRVhUX1ZFUlNJT04JCQkiVHVlLiBKdWwuIDI2IDE3OjAwOjAwIFBEVCAyMDExIgogCiAvKgogICogRGV2aWNlIElEcwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19iYXNlLmMgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2Jhc2UuYwppbmRleCAyZDhjZGNlLi43NzZkMDE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2Jhc2UuYworKysgYi9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2Jhc2UuYwpAQCAtMTgsNyArMTgsNyBAQAogICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCiAgKgogICogIEZJTEU6IG1lZ2FyYWlkX3Nhc19iYXNlLmMKLSAqICBWZXJzaW9uIDogdjAwLjAwLjA1LjM4LXJjMQorICogIFZlcnNpb24gOiB2MDAuMDAuMDUuNDAtcmMxCiAgKgogICogIEF1dGhvcnM6IExTSSBDb3Jwb3JhdGlvbgogICogICAgICAgICAgIFNyZWVuaXZhcyBCYWdhbGtvdGUKQEAgLTU0LDYgKzU0LDcgQEAKICNpbmNsdWRlIDxzY3NpL3Njc2lfY21uZC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV9kZXZpY2UuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfaG9zdC5oPgorI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KICNpbmNsdWRlICJtZWdhcmFpZF9zYXNfZnVzaW9uLmgiCiAjaW5jbHVkZSAibWVnYXJhaWRfc2FzLmgiCiAKQEAgLTIwNTcsNiArMjA1OCwyMCBAQAogCX0KIH0KIAorc3RhdGljIGludCBtZWdhc2FzX2NoYW5nZV9xdWV1ZV9kZXB0aChzdHJ1Y3Qgc2NzaV9kZXZpY2UgKnNkZXYsCisJCQkJICAgICAgaW50IHF1ZXVlX2RlcHRoLCBpbnQgcmVhc29uKQoreworCWlmIChyZWFzb24gIT0gU0NTSV9RREVQVEhfREVGQVVMVCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJaWYgKHF1ZXVlX2RlcHRoID4gc2Rldi0+aG9zdC0+Y2FuX3F1ZXVlKQorCQlxdWV1ZV9kZXB0aCA9IHNkZXYtPmhvc3QtPmNhbl9xdWV1ZTsKKwlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZGV2LCBzY3NpX2dldF90YWdfdHlwZShzZGV2KSwKKwkJCQlxdWV1ZV9kZXB0aCk7CisKKwlyZXR1cm4gcXVldWVfZGVwdGg7Cit9CisKIC8qCiAgKiBTY3NpIGhvc3QgdGVtcGxhdGUgZm9yIG1lZ2FyYWlkX3NhcyBkcml2ZXIKICAqLwpAQCAtMjA3NCw2ICsyMDg5LDcgQEAKIAkuZWhfdGltZWRfb3V0ID0gbWVnYXNhc19yZXNldF90aW1lciwKIAkuYmlvc19wYXJhbSA9IG1lZ2FzYXNfYmlvc19wYXJhbSwKIAkudXNlX2NsdXN0ZXJpbmcgPSBFTkFCTEVfQ0xVU1RFUklORywKKwkuY2hhbmdlX3F1ZXVlX2RlcHRoID0gbWVnYXNhc19jaGFuZ2VfcXVldWVfZGVwdGgsCiB9OwogCiAvKioKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfZnAuYyBiL2RyaXZlcnMvc2NzaS9tZWdhcmFpZC9tZWdhcmFpZF9zYXNfZnAuYwppbmRleCA4ZmUzYTQ1Li41YTVhZjFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbWVnYXJhaWQvbWVnYXJhaWRfc2FzX2ZwLmMKKysrIGIvZHJpdmVycy9zY3NpL21lZ2FyYWlkL21lZ2FyYWlkX3Nhc19mcC5jCkBAIC0yODgsNyArMjg4LDYgQEAKIAkJCQkvKiBHZXQgZGV2IGhhbmRsZSBmcm9tIFBkICovCiAJCQkJKnBEZXZIYW5kbGUgPSBNUl9QZERldkhhbmRsZUdldChwZCwgbWFwKTsKIAkJfQotCQlyZXR2YWwgPSBGQUxTRTsKIAl9CiAKIAkqcGRCbG9jayArPSBzdHJpcFJlZiArIE1SX0xkU3BhblB0ckdldChsZCwgc3BhbiwgbWFwKS0+c3RhcnRCbGs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX3Njc2loLmMgYi9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX3Njc2loLmMKaW5kZXggOTM5ZjI4My4uNmFiZDJmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19zY3NpaC5jCisrKyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfc2NzaWguYwpAQCAtNDI1OCw2ICs0MjU4LDcgQEAKIAl1MzIgbG9nX2luZm87CiAJc3RydWN0IE1QVDJTQVNfREVWSUNFICpzYXNfZGV2aWNlX3ByaXZfZGF0YTsKIAl1MzIgcmVzcG9uc2VfY29kZSA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCW1waV9yZXBseSA9IG1wdDJzYXNfYmFzZV9nZXRfcmVwbHlfdmlydF9hZGRyKGlvYywgcmVwbHkpOwogCXNjbWQgPSBfc2NzaWhfc2NzaV9sb29rdXBfZ2V0X2NsZWFyKGlvYywgc21pZCk7CkBAIC00MjgyLDYgKzQyODMsOSBAQAogCSAqIHRoZSBmYWlsZWQgZGlyZWN0IEkvTyBzaG91bGQgYmUgcmVkaXJlY3RlZCB0byB2b2x1bWUKIAkgKi8KIAlpZiAoX3Njc2loX3Njc2lfZGlyZWN0X2lvX2dldChpb2MsIHNtaWQpKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZpb2MtPnNjc2lfbG9va3VwX2xvY2ssIGZsYWdzKTsKKwkJaW9jLT5zY3NpX2xvb2t1cFtzbWlkIC0gMV0uc2NtZCA9IHNjbWQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYy0+c2NzaV9sb29rdXBfbG9jaywgZmxhZ3MpOwogCQlfc2NzaWhfc2NzaV9kaXJlY3RfaW9fc2V0KGlvYywgc21pZCwgMCk7CiAJCW1lbWNweShtcGlfcmVxdWVzdC0+Q0RCLkNEQjMyLCBzY21kLT5jbW5kLCBzY21kLT5jbWRfbGVuKTsKIAkJbXBpX3JlcXVlc3QtPkRldkhhbmRsZSA9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXZzYXMvS2NvbmZpZyBiL2RyaXZlcnMvc2NzaS9tdnNhcy9LY29uZmlnCmluZGV4IGM4MmIwMTIuLjc4ZjdlMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tdnNhcy9LY29uZmlnCisrKyBiL2RyaXZlcnMvc2NzaS9tdnNhcy9LY29uZmlnCkBAIC0zLDcgKzMsNyBAQAogIwogIyBDb3B5cmlnaHQgMjAwNyBSZWQgSGF0LCBJbmMuCiAjIENvcHlyaWdodCAyMDA4IE1hcnZlbGwuIDxrZXdlaUBtYXJ2ZWxsLmNvbT4KLSMgQ29weXJpZ2h0IDIwMDktMjAwMTEgTWFydmVsbC4gPHl1eGlhbmdsQG1hcnZlbGwuY29tPgorIyBDb3B5cmlnaHQgMjAwOS0yMDExIE1hcnZlbGwuIDx5dXhpYW5nbEBtYXJ2ZWxsLmNvbT4KICMKICMgVGhpcyBmaWxlIGlzIGxpY2Vuc2VkIHVuZGVyIEdQTHYyLgogIwpAQCAtNDEsMyArNDEsMTAgQEAKIAloZWxwCiAJCUNvbXBpbGVzIHRoZSA4OFNFNjRYWC84OFNFOTRYWCBkcml2ZXIgaW4gZGVidWcgbW9kZS4gIEluIGRlYnVnIG1vZGUsCiAJCXRoZSBkcml2ZXIgcHJpbnRzIHNvbWUgbWVzc2FnZXMgdG8gdGhlIGNvbnNvbGUuCitjb25maWcgU0NTSV9NVlNBU19UQVNLTEVUCisJYm9vbCAiU3VwcG9ydCBmb3IgaW50ZXJydXB0IHRhc2tsZXQiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBTQ1NJX01WU0FTCisJaGVscAorCQlDb21waWxlcyB0aGUgODhTRTY0eHgvODhTRTk0eHggZHJpdmVyIGluIGludGVycnVwdCB0YXNrbGV0IG1vZGUuSW4gdGhpcyBtb2RlLAorCQl0aGUgaW50ZXJydXB0IHdpbGwgc2NoZWR1bGUgYSB0YXNrbGV0LgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL212c2FzL212XzY0eHguYyBiL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl82NHh4LmMKaW5kZXggMTNjOTYwNC4uOGJhNDcyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL212c2FzL212XzY0eHguYworKysgYi9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfNjR4eC5jCkBAIC0zMyw3ICszMyw2IEBACiAJdTMyIHJlZzsKIAlzdHJ1Y3QgbXZzX3BoeSAqcGh5ID0gJm12aS0+cGh5W2ldOwogCi0JLyogVE9ETyBjaGVjayAmIHNhdmUgZGV2aWNlIHR5cGUgKi8KIAlyZWcgPSBtcjMyKE1WU19HQkxfUE9SVF9UWVBFKTsKIAlwaHktPnBoeV90eXBlICY9IH4oUE9SVF9UWVBFX1NBUyB8IFBPUlRfVFlQRV9TQVRBKTsKIAlpZiAocmVnICYgTU9ERV9TQVNfU0FUQSAmICgxIDw8IGkpKQpAQCAtNDgsNyArNDcsNyBAQAogCXUzMiB0bXA7CiAKIAl0bXAgPSBtcjMyKE1WU19QQ1MpOwotCWlmIChtdmktPmNoaXAtPm5fcGh5IDw9IDQpCisJaWYgKG12aS0+Y2hpcC0+bl9waHkgPD0gTVZTX1NPQ19QT1JUUykKIAkJdG1wIHw9IDEgPDwgKHBoeV9pZCArIFBDU19FTl9QT1JUX1hNVF9TSElGVCk7CiAJZWxzZQogCQl0bXAgfD0gMSA8PCAocGh5X2lkICsgUENTX0VOX1BPUlRfWE1UX1NISUZUMik7CkBAIC01OCwyNCArNTcsMTYgQEAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBtdnNfNjR4eF9waHlfaGFja3Moc3RydWN0IG12c19pbmZvICptdmkpCiB7CiAJdm9pZCBfX2lvbWVtICpyZWdzID0gbXZpLT5yZWdzOworCWludCBpOwogCiAJbXZzX3BoeV9oYWNrcyhtdmkpOwogCiAJaWYgKCEobXZpLT5mbGFncyAmIE1WRl9GTEFHX1NPQykpIHsKLQkJLyogVEVTVCAtIGZvciBwaHkgZGVjb2RpbmcgZXJyb3IsIGFkanVzdCB2b2x0YWdlIGxldmVscyAqLwotCQltdzMyKE1WU19QMF9WU1JfQUREUiArIDAsIDB4OCk7Ci0JCW13MzIoTVZTX1AwX1ZTUl9EQVRBICsgMCwgMHgyRjApOwotCi0JCW13MzIoTVZTX1AwX1ZTUl9BRERSICsgOCwgMHg4KTsKLQkJbXczMihNVlNfUDBfVlNSX0RBVEEgKyA4LCAweDJGMCk7Ci0KLQkJbXczMihNVlNfUDBfVlNSX0FERFIgKyAxNiwgMHg4KTsKLQkJbXczMihNVlNfUDBfVlNSX0RBVEEgKyAxNiwgMHgyRjApOwotCi0JCW13MzIoTVZTX1AwX1ZTUl9BRERSICsgMjQsIDB4OCk7Ci0JCW13MzIoTVZTX1AwX1ZTUl9EQVRBICsgMjQsIDB4MkYwKTsKKwkJZm9yIChpID0gMDsgaSA8IE1WU19TT0NfUE9SVFM7IGkrKykgeworCQkJbXZzX3dyaXRlX3BvcnRfdnNyX2FkZHIobXZpLCBpLCBWU1JfUEhZX01PREU4KTsKKwkJCW12c193cml0ZV9wb3J0X3Zzcl9kYXRhKG12aSwgaSwgMHgyRjApOworCQl9CiAJfSBlbHNlIHsKLQkJaW50IGk7CiAJCS8qIGRpc2FibGUgYXV0byBwb3J0IGRldGVjdGlvbiAqLwogCQltdzMyKE1WU19HQkxfUE9SVF9UWVBFLCAwKTsKIAkJZm9yIChpID0gMDsgaSA8IG12aS0+Y2hpcC0+bl9waHk7IGkrKykgewpAQCAtOTUsNyArODYsNyBAQAogCXUzMiByZWcsIHRtcDsKIAogCWlmICghKG12aS0+ZmxhZ3MgJiBNVkZfRkxBR19TT0MpKSB7Ci0JCWlmIChwaHlfaWQgPCA0KQorCQlpZiAocGh5X2lkIDwgTVZTX1NPQ19QT1JUUykKIAkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChtdmktPnBkZXYsIFBDUl9QSFlfQ1RMLCAmcmVnKTsKIAkJZWxzZQogCQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKG12aS0+cGRldiwgUENSX1BIWV9DVEwyLCAmcmVnKTsKQEAgLTEwNCwxMyArOTUsMTMgQEAKIAkJcmVnID0gbXIzMihNVlNfUEhZX0NUTCk7CiAKIAl0bXAgPSByZWc7Ci0JaWYgKHBoeV9pZCA8IDQpCisJaWYgKHBoeV9pZCA8IE1WU19TT0NfUE9SVFMpCiAJCXRtcCB8PSAoMVUgPDwgcGh5X2lkKSA8PCBQQ1RMX0xJTktfT0ZGUzsKIAllbHNlCi0JCXRtcCB8PSAoMVUgPDwgKHBoeV9pZCAtIDQpKSA8PCBQQ1RMX0xJTktfT0ZGUzsKKwkJdG1wIHw9ICgxVSA8PCAocGh5X2lkIC0gTVZTX1NPQ19QT1JUUykpIDw8IFBDVExfTElOS19PRkZTOwogCiAJaWYgKCEobXZpLT5mbGFncyAmIE1WRl9GTEFHX1NPQykpIHsKLQkJaWYgKHBoeV9pZCA8IDQpIHsKKwkJaWYgKHBoeV9pZCA8IE1WU19TT0NfUE9SVFMpIHsKIAkJCXBjaV93cml0ZV9jb25maWdfZHdvcmQobXZpLT5wZGV2LCBQQ1JfUEhZX0NUTCwgdG1wKTsKIAkJCW1kZWxheSgxMCk7CiAJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKG12aS0+cGRldiwgUENSX1BIWV9DVEwsIHJlZyk7CkBAIC0xMzMsOSArMTI0LDkgQEAKIAl0bXAgJj0gflBIWUVWX1JEWV9DSDsKIAltdnNfd3JpdGVfcG9ydF9pcnFfc3RhdChtdmksIHBoeV9pZCwgdG1wKTsKIAl0bXAgPSBtdnNfcmVhZF9waHlfY3RsKG12aSwgcGh5X2lkKTsKLQlpZiAoaGFyZCA9PSAxKQorCWlmIChoYXJkID09IE1WU19IQVJEX1JFU0VUKQogCQl0bXAgfD0gUEhZX1JTVF9IQVJEOwotCWVsc2UgaWYgKGhhcmQgPT0gMCkKKwllbHNlIGlmIChoYXJkID09IE1WU19TT0ZUX1JFU0VUKQogCQl0bXAgfD0gUEhZX1JTVDsKIAltdnNfd3JpdGVfcGh5X2N0bChtdmksIHBoeV9pZCwgdG1wKTsKIAlpZiAoaGFyZCkgewpAQCAtMzIxLDYgKzMxMiwxMSBAQAogCS8qIGluaXQgcGh5cyAqLwogCW12c182NHh4X3BoeV9oYWNrcyhtdmkpOwogCisJdG1wID0gbXZzX2NyMzIobXZpLCBDTURfUEhZX01PREVfMjEpOworCXRtcCAmPSAweDAwMDBmZmZmOworCXRtcCB8PSAweDAwZmEwMDAwOworCW12c19jdzMyKG12aSwgQ01EX1BIWV9NT0RFXzIxLCB0bXApOworCiAJLyogZW5hYmxlIGF1dG8gcG9ydCBkZXRlY3Rpb24gKi8KIAltdzMyKE1WU19HQkxfUE9SVF9UWVBFLCBNT0RFX0FVVE9fREVUX0VOKTsKIApAQCAtMzQ2LDcgKzM0Miw3IEBACiAKIAkJbXZzXzY0eHhfZW5hYmxlX3htdChtdmksIGkpOwogCi0JCW12c182NHh4X3BoeV9yZXNldChtdmksIGksIDEpOworCQltdnNfNjR4eF9waHlfcmVzZXQobXZpLCBpLCBNVlNfSEFSRF9SRVNFVCk7CiAJCW1zbGVlcCg1MDApOwogCQltdnNfNjR4eF9kZXRlY3RfcG9ydHR5cGUobXZpLCBpKTsKIAl9CkBAIC0zNzcsMTMgKzM3Myw3IEBACiAJCW12c191cGRhdGVfcGh5aW5mbyhtdmksIGksIDEpOwogCX0KIAotCS8qIEZJWE1FOiB1cGRhdGUgd2lkZSBwb3J0IGJpdG1hcHMgKi8KLQogCS8qIGxpdHRsZSBlbmRpYW4gZm9yIG9wZW4gYWRkcmVzcyBhbmQgY29tbWFuZCB0YWJsZSwgZXRjLiAqLwotCS8qCi0JICogaXQgc2VlbXMgdGhhdCAoIGZyb20gdGhlIHNwZWMgKSB0dXJuaW5nIG9uIGJpZy1lbmRpYW4gd29uJ3QKLQkgKiBkbyB1cyBhbnkgZ29vZCBvbiBiaWctZW5kaWFuIG1hY2hpbmVzLCBuZWVkIGZ1cnRoZXIgY29uZmlybWF0aW9uCi0JICovCiAJY2N0bCA9IG1yMzIoTVZTX0NUTCk7CiAJY2N0bCB8PSBDQ1RMX0VORElBTl9DTUQ7CiAJY2N0bCB8PSBDQ1RMX0VORElBTl9EQVRBOwpAQCAtMzk0LDE1ICszODQsMTkgQEAKIAkvKiByZXNldCBDTUQgcXVldWUgKi8KIAl0bXAgPSBtcjMyKE1WU19QQ1MpOwogCXRtcCB8PSBQQ1NfQ01EX1JTVDsKKwl0bXAgJj0gflBDU19TRUxGX0NMRUFSOwogCW13MzIoTVZTX1BDUywgdG1wKTsKLQkvKiBpbnRlcnJ1cHQgY29hbGVzY2luZyBtYXkgY2F1c2UgbWlzc2luZyBIVyBpbnRlcnJwdXQgaW4gc29tZSBjYXNlLAotCSAqIGFuZCB0aGUgbWF4IGNvdW50IGlzIDB4MWZmLCB3aGlsZSBvdXIgbWF4IHNsb3QgaXMgMHgyMDAsCisJLyoKKwkgKiB0aGUgbWF4IGNvdW50IGlzIDB4MWZmLCB3aGlsZSBvdXIgbWF4IHNsb3QgaXMgMHgyMDAsCiAJICogaXQgd2lsbCBtYWtlIGNvdW50IDAuCiAJICovCiAJdG1wID0gMDsKLQltdzMyKE1WU19JTlRfQ09BTCwgdG1wKTsKKwlpZiAoTVZTX0NISVBfU0xPVF9TWiA+IDB4MWZmKQorCQltdzMyKE1WU19JTlRfQ09BTCwgMHgxZmYgfCBDT0FMX0VOKTsKKwllbHNlCisJCW13MzIoTVZTX0lOVF9DT0FMLCBNVlNfQ0hJUF9TTE9UX1NaIHwgQ09BTF9FTik7CiAKLQl0bXAgPSAweDEwMDsKKwl0bXAgPSAweDEwMDAwIHwgaW50ZXJydXB0X2NvYWxlc2Npbmc7CiAJbXczMihNVlNfSU5UX0NPQUxfVE1PVVQsIHRtcCk7CiAKIAkvKiBsYWRpZXMgYW5kIGdlbnRsZW1lbiwgc3RhcnQgeW91ciBlbmdpbmVzICovCkBAIC00NzcsMTMgKzQ3MSwxMSBAQAogCiAJLyogY2xlYXIgQ01EX0NNUExUIEFTQVAgKi8KIAltdzMyX2YoTVZTX0lOVF9TVEFULCBDSU5UX0RPTkUpOwotI2lmbmRlZiBNVlNfVVNFX1RBU0tMRVQKKwogCXNwaW5fbG9jaygmbXZpLT5sb2NrKTsKLSNlbmRpZgogCW12c19pbnRfZnVsbChtdmkpOwotI2lmbmRlZiBNVlNfVVNFX1RBU0tMRVQKIAlzcGluX3VubG9jaygmbXZpLT5sb2NrKTsKLSNlbmRpZgorCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCkBAIC02MzAsNyArNjIyLDYgQEAKIHsKIAl1MzIgdG1wOwogCXN0cnVjdCBtdnNfcGh5ICpwaHkgPSAmbXZpLT5waHlbaV07Ci0JLyogd29ya2Fyb3VuZCBmb3IgSFcgcGh5IGRlY29kaW5nIGVycm9yIG9uIDEuNWcgZGlzayBkcml2ZSAqLwogCW12c193cml0ZV9wb3J0X3Zzcl9hZGRyKG12aSwgaSwgVlNSX1BIWV9NT0RFNik7CiAJdG1wID0gbXZzX3JlYWRfcG9ydF92c3JfZGF0YShtdmksIGkpOwogCWlmICgoKHBoeS0+cGh5X3N0YXR1cyAmIFBIWV9ORUdfU1BQX1BIWVNfTElOS19SQVRFX01BU0spID4+CkBAIC02NjEsNyArNjUyLDcgQEAKIAkJdG1wIHw9IGxybWF4OwogCX0KIAltdnNfd3JpdGVfcGh5X2N0bChtdmksIHBoeV9pZCwgdG1wKTsKLQltdnNfNjR4eF9waHlfcmVzZXQobXZpLCBwaHlfaWQsIDEpOworCW12c182NHh4X3BoeV9yZXNldChtdmksIHBoeV9pZCwgTVZTX0hBUkRfUkVTRVQpOwogfQogCiBzdGF0aWMgdm9pZCBtdnNfNjR4eF9jbGVhcl9hY3RpdmVfY21kcyhzdHJ1Y3QgbXZzX2luZm8gKm12aSkKQEAgLTc0NCwxMSArNzM1LDEzIEBACiAJcmV0dXJuIC0xOwogfQogCi0jaWZuZGVmIERJU0FCTEVfSE9UUExVR19ETUFfRklYCi12b2lkIG12c182NHh4X2ZpeF9kbWEoZG1hX2FkZHJfdCBidWZfZG1hLCBpbnQgYnVmX2xlbiwgaW50IGZyb20sIHZvaWQgKnByZCkKK3ZvaWQgbXZzXzY0eHhfZml4X2RtYShzdHJ1Y3QgbXZzX2luZm8gKm12aSwgdTMyIHBoeV9tYXNrLAorCQkJCWludCBidWZfbGVuLCBpbnQgZnJvbSwgdm9pZCAqcHJkKQogewogCWludCBpOwogCXN0cnVjdCBtdnNfcHJkICpidWZfcHJkID0gcHJkOworCWRtYV9hZGRyX3QgYnVmX2RtYSA9IG12aS0+YnVsa19idWZmZXJfZG1hOworCiAJYnVmX3ByZAkrPSBmcm9tOwogCWZvciAoaSA9IDA7IGkgPCBNQVhfU0dfRU5UUlkgLSBmcm9tOyBpKyspIHsKIAkJYnVmX3ByZC0+YWRkciA9IGNwdV90b19sZTY0KGJ1Zl9kbWEpOwpAQCAtNzU2LDcgKzc0OSwyOCBAQAogCQkrK2J1Zl9wcmQ7CiAJfQogfQotI2VuZGlmCisKK3N0YXRpYyB2b2lkIG12c182NHh4X3R1bmVfaW50ZXJydXB0KHN0cnVjdCBtdnNfaW5mbyAqbXZpLCB1MzIgdGltZSkKK3sKKwl2b2lkIF9faW9tZW0gKnJlZ3MgPSBtdmktPnJlZ3M7CisJdTMyIHRtcCA9IDA7CisJLyoKKwkgKiB0aGUgbWF4IGNvdW50IGlzIDB4MWZmLCB3aGlsZSBvdXIgbWF4IHNsb3QgaXMgMHgyMDAsCisJICogaXQgd2lsbCBtYWtlIGNvdW50IDAuCisJICovCisJaWYgKHRpbWUgPT0gMCkgeworCQltdzMyKE1WU19JTlRfQ09BTCwgMCk7CisJCW13MzIoTVZTX0lOVF9DT0FMX1RNT1VULCAweDEwMDAwKTsKKwl9IGVsc2UgeworCQlpZiAoTVZTX0NISVBfU0xPVF9TWiA+IDB4MWZmKQorCQkJbXczMihNVlNfSU5UX0NPQUwsIDB4MWZmfENPQUxfRU4pOworCQllbHNlCisJCQltdzMyKE1WU19JTlRfQ09BTCwgTVZTX0NISVBfU0xPVF9TWnxDT0FMX0VOKTsKKworCQl0bXAgPSAweDEwMDAwIHwgdGltZTsKKwkJbXczMihNVlNfSU5UX0NPQUxfVE1PVVQsIHRtcCk7CisJfQorfQogCiBjb25zdCBzdHJ1Y3QgbXZzX2Rpc3BhdGNoIG12c182NHh4X2Rpc3BhdGNoID0gewogCSJtdjY0eHgiLApAQCAtNzgwLDcgKzc5NCw2IEBACiAJbXZzX3dyaXRlX3BvcnRfaXJxX3N0YXQsCiAJbXZzX3JlYWRfcG9ydF9pcnFfbWFzaywKIAltdnNfd3JpdGVfcG9ydF9pcnFfbWFzaywKLQltdnNfZ2V0X3Nhc19hZGRyLAogCW12c182NHh4X2NvbW1hbmRfYWN0aXZlLAogCW12c182NHh4X2NsZWFyX3Nyc19pcnEsCiAJbXZzXzY0eHhfaXNzdWVfc3RvcCwKQEAgLTgwOCw4ICs4MjEsOCBAQAogCW12c182NHh4X3NwaV9idWlsZGNtZCwKIAltdnNfNjR4eF9zcGlfaXNzdWVjbWQsCiAJbXZzXzY0eHhfc3BpX3dhaXRkYXRhcmVhZHksCi0jaWZuZGVmIERJU0FCTEVfSE9UUExVR19ETUFfRklYCiAJbXZzXzY0eHhfZml4X2RtYSwKLSNlbmRpZgorCW12c182NHh4X3R1bmVfaW50ZXJydXB0LAorCU5VTEwsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfOTR4eC5jIGIvZHJpdmVycy9zY3NpL212c2FzL212Xzk0eHguYwppbmRleCA3ODE2MmMzLi4zNTAxMjkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfOTR4eC5jCisrKyBiL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl85NHh4LmMKQEAgLTQ4LDYgKzQ4LDIxNiBAQAogCX0KIH0KIAordm9pZCBzZXRfcGh5X3R1bmluZyhzdHJ1Y3QgbXZzX2luZm8gKm12aSwgaW50IHBoeV9pZCwKKwkJCXN0cnVjdCBwaHlfdHVuaW5nIHBoeV90dW5pbmcpCit7CisJdTMyIHRtcCwgc2V0dGluZ18wID0gMCwgc2V0dGluZ18xID0gMDsKKwl1OCBpOworCisJLyogUmVtYXAgaW5mb3JtYXRpb24gZm9yIEIwIGNoaXA6CisJKgorCSogUjBDaCAtPiBSMTE4aFsxNTowXSAoQWRhcHRlZCBERkUgRjMgLSBGNSBjb2VmZmljaWVudCkKKwkqIFIwRGggLT4gUjExOGhbMzE6MTZdIChHZW5lcmF0aW9uIDEgU2V0dGluZyAwKQorCSogUjBFaCAtPiBSMTFDaFsxNTowXSAgKEdlbmVyYXRpb24gMSBTZXR0aW5nIDEpCisJKiBSMEZoIC0+IFIxMUNoWzMxOjE2XSAoR2VuZXJhdGlvbiAyIFNldHRpbmcgMCkKKwkqIFIxMGggLT4gUjEyMGhbMTU6MF0gIChHZW5lcmF0aW9uIDIgU2V0dGluZyAxKQorCSogUjExaCAtPiBSMTIwaFszMToxNl0gKEdlbmVyYXRpb24gMyBTZXR0aW5nIDApCisJKiBSMTJoIC0+IFIxMjRoWzE1OjBdICAoR2VuZXJhdGlvbiAzIFNldHRpbmcgMSkKKwkqIFIxM2ggLT4gUjEyNGhbMzE6MTZdIChHZW5lcmF0aW9uIDQgU2V0dGluZyAwIChSZXNlcnZlZCkpCisJKi8KKworCS8qIEEwIGhhcyBhIGRpZmZlcmVudCBzZXQgb2YgcmVnaXN0ZXJzICovCisJaWYgKG12aS0+cGRldi0+cmV2aXNpb24gPT0gVkFOSVJfQTBfUkVWKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCS8qIGxvb3AgMyB0aW1lcywgc2V0IEdlbiAxLCBHZW4gMiwgR2VuIDMgKi8KKwkJc3dpdGNoIChpKSB7CisJCWNhc2UgMDoKKwkJCXNldHRpbmdfMCA9IEdFTkVSQVRJT05fMV9TRVRUSU5HOworCQkJc2V0dGluZ18xID0gR0VORVJBVElPTl8xXzJfU0VUVElORzsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlzZXR0aW5nXzAgPSBHRU5FUkFUSU9OXzFfMl9TRVRUSU5HOworCQkJc2V0dGluZ18xID0gR0VORVJBVElPTl8yXzNfU0VUVElORzsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlzZXR0aW5nXzAgPSBHRU5FUkFUSU9OXzJfM19TRVRUSU5HOworCQkJc2V0dGluZ18xID0gR0VORVJBVElPTl8zXzRfU0VUVElORzsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogU2V0OgorCQkqCisJCSogVHJhbnNtaXR0ZXIgRW1waGFzaXMgRW5hYmxlCisJCSogVHJhbnNtaXR0ZXIgRW1waGFzaXMgQW1wbGl0dWRlCisJCSogVHJhbnNtaXR0ZXIgQW1wbGl0dWRlCisJCSovCisJCW12c193cml0ZV9wb3J0X3Zzcl9hZGRyKG12aSwgcGh5X2lkLCBzZXR0aW5nXzApOworCQl0bXAgPSBtdnNfcmVhZF9wb3J0X3Zzcl9kYXRhKG12aSwgcGh5X2lkKTsKKwkJdG1wICY9IH4oMHhGQkUgPDwgMTYpOworCQl0bXAgfD0gKCgocGh5X3R1bmluZy50cmFuc19lbXBfZW4gPDwgMTEpIHwKKwkJCShwaHlfdHVuaW5nLnRyYW5zX2VtcF9hbXAgPDwgNykgfAorCQkJKHBoeV90dW5pbmcudHJhbnNfYW1wIDw8IDEpKSA8PCAxNik7CisJCW12c193cml0ZV9wb3J0X3Zzcl9kYXRhKG12aSwgcGh5X2lkLCB0bXApOworCisJCS8qIFNldCBUcmFuc21pdHRlciBBbXBsaXR1ZGUgQWRqdXN0ICovCisJCW12c193cml0ZV9wb3J0X3Zzcl9hZGRyKG12aSwgcGh5X2lkLCBzZXR0aW5nXzEpOworCQl0bXAgPSBtdnNfcmVhZF9wb3J0X3Zzcl9kYXRhKG12aSwgcGh5X2lkKTsKKwkJdG1wICY9IH4oMHhDMDAwKTsKKwkJdG1wIHw9IChwaHlfdHVuaW5nLnRyYW5zX2FtcF9hZGogPDwgMTQpOworCQltdnNfd3JpdGVfcG9ydF92c3JfZGF0YShtdmksIHBoeV9pZCwgdG1wKTsKKwl9Cit9CisKK3ZvaWQgc2V0X3BoeV9mZmVfdHVuaW5nKHN0cnVjdCBtdnNfaW5mbyAqbXZpLCBpbnQgcGh5X2lkLAorCQkJCXN0cnVjdCBmZmVfY29udHJvbCBmZmUpCit7CisJdTMyIHRtcDsKKworCS8qIERvbid0IHJ1biB0aGlzIGlmIEEwL0IwICovCisJaWYgKChtdmktPnBkZXYtPnJldmlzaW9uID09IFZBTklSX0EwX1JFVikKKwkJfHwgKG12aS0+cGRldi0+cmV2aXNpb24gPT0gVkFOSVJfQjBfUkVWKSkKKwkJcmV0dXJuOworCisJLyogRkZFIFJlc2lzdG9yIGFuZCBDYXBhY2l0b3IgKi8KKwkvKiBSMTBDaCBERkUgUmVzb2x1dGlvbiBDb250cm9sL1NxdWVsY2ggYW5kIEZGRSBTZXR0aW5nCisJICoKKwkgKiBGRkVfRk9SQ0UgICAgICAgICAgICBbN10KKwkgKiBGRkVfUkVTX1NFTCAgICAgICAgICBbNjo0XQorCSAqIEZGRV9DQVBfU0VMICAgICAgICAgIFszOjBdCisJICovCisJbXZzX3dyaXRlX3BvcnRfdnNyX2FkZHIobXZpLCBwaHlfaWQsIFZTUl9QSFlfRkZFX0NPTlRST0wpOworCXRtcCA9IG12c19yZWFkX3BvcnRfdnNyX2RhdGEobXZpLCBwaHlfaWQpOworCXRtcCAmPSB+MHhGRjsKKworCS8qIFJlYWQgZnJvbSBIQkFfSW5mb19QYWdlICovCisJdG1wIHw9ICgoMHgxIDw8IDcpIHwKKwkJKGZmZS5mZmVfcnNzX3NlbCA8PCA0KSB8CisJCShmZmUuZmZlX2NhcF9zZWwgPDwgMCkpOworCisJbXZzX3dyaXRlX3BvcnRfdnNyX2RhdGEobXZpLCBwaHlfaWQsIHRtcCk7CisKKwkvKiBSMDY0aCBQSFkgTW9kZSBSZWdpc3RlciAxCisJICoKKwkgKiBERkVfRElTCQkxOAorCSAqLworCW12c193cml0ZV9wb3J0X3Zzcl9hZGRyKG12aSwgcGh5X2lkLCBWU1JfUkVGX0NMT0NLX0NSVEwpOworCXRtcCA9IG12c19yZWFkX3BvcnRfdnNyX2RhdGEobXZpLCBwaHlfaWQpOworCXRtcCAmPSB+MHg0MDAwMTsKKwkvKiBIYXJkIGNvZGluZyAqLworCS8qIE5vIGRlZmluZXMgaW4gSEJBX0luZm9fUGFnZSAqLworCXRtcCB8PSAoMCA8PCAxOCk7CisJbXZzX3dyaXRlX3BvcnRfdnNyX2RhdGEobXZpLCBwaHlfaWQsIHRtcCk7CisKKwkvKiBSMTEwaCBERkUgRjAtRjEgQ29lZmZpY2llbnQgQ29udHJvbC9ERkUgVXBkYXRlIENvbnRyb2wKKwkgKgorCSAqIERGRV9VUERBVEVfRU4gICAgICAgIFsxMTo2XQorCSAqIERGRV9GWF9GT1JDRSAgICAgICAgIFs1OjBdCisJICovCisJbXZzX3dyaXRlX3BvcnRfdnNyX2FkZHIobXZpLCBwaHlfaWQsIFZTUl9QSFlfREZFX1VQREFURV9DUlRMKTsKKwl0bXAgPSBtdnNfcmVhZF9wb3J0X3Zzcl9kYXRhKG12aSwgcGh5X2lkKTsKKwl0bXAgJj0gfjB4RkZGOworCS8qIEhhcmQgY29kaW5nICovCisJLyogTm8gZGVmaW5lcyBpbiBIQkFfSW5mb19QYWdlICovCisJdG1wIHw9ICgoMHgzRiA8PCA2KSB8ICgweDAgPDwgMCkpOworCW12c193cml0ZV9wb3J0X3Zzcl9kYXRhKG12aSwgcGh5X2lkLCB0bXApOworCisJLyogUjFBMGggSW50ZXJmYWNlIGFuZCBEaWdpdGFsIFJlZmVyZW5jZSBDbG9jayBDb250cm9sL1Jlc2VydmVkXzUwaAorCSAqCisJICogRkZFX1RSQUlOX0VOICAgICAgICAgMworCSAqLworCW12c193cml0ZV9wb3J0X3Zzcl9hZGRyKG12aSwgcGh5X2lkLCBWU1JfUkVGX0NMT0NLX0NSVEwpOworCXRtcCA9IG12c19yZWFkX3BvcnRfdnNyX2RhdGEobXZpLCBwaHlfaWQpOworCXRtcCAmPSB+MHg4OworCS8qIEhhcmQgY29kaW5nICovCisJLyogTm8gZGVmaW5lcyBpbiBIQkFfSW5mb19QYWdlICovCisJdG1wIHw9ICgwIDw8IDMpOworCW12c193cml0ZV9wb3J0X3Zzcl9kYXRhKG12aSwgcGh5X2lkLCB0bXApOworfQorCisvKk5vdGljZTogdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aGVuIHBoeSBpcyBkaXNhYmxlZCovCit2b2lkIHNldF9waHlfcmF0ZShzdHJ1Y3QgbXZzX2luZm8gKm12aSwgaW50IHBoeV9pZCwgdTggcmF0ZSkKK3sKKwl1bmlvbiByZWdfcGh5X2NmZyBwaHlfY2ZnLCBwaHlfY2ZnX3RtcDsKKwltdnNfd3JpdGVfcG9ydF92c3JfYWRkcihtdmksIHBoeV9pZCwgVlNSX1BIWV9NT0RFMik7CisJcGh5X2NmZ190bXAudiA9IG12c19yZWFkX3BvcnRfdnNyX2RhdGEobXZpLCBwaHlfaWQpOworCXBoeV9jZmcudiA9IDA7CisJcGh5X2NmZy51LmRpc2FibGVfcGh5ID0gcGh5X2NmZ190bXAudS5kaXNhYmxlX3BoeTsKKwlwaHlfY2ZnLnUuc2FzX3N1cHBvcnQgPSAxOworCXBoeV9jZmcudS5zYXRhX3N1cHBvcnQgPSAxOworCXBoeV9jZmcudS5zYXRhX2hvc3RfbW9kZSA9IDE7CisKKwlzd2l0Y2ggKHJhdGUpIHsKKwljYXNlIDB4MDoKKwkJLyogc3VwcG9ydCAxLjUgR2JwcyAqLworCQlwaHlfY2ZnLnUuc3BlZWRfc3VwcG9ydCA9IDE7CisJCXBoeV9jZmcudS5zbndfM19zdXBwb3J0ID0gMDsKKwkJcGh5X2NmZy51LnR4X2xua19wYXJpdHkgPSAxOworCQlwaHlfY2ZnLnUudHhfc3B0X3Boc19sbmtfcmF0ZSA9IDB4MzA7CisJCWJyZWFrOworCWNhc2UgMHgxOgorCisJCS8qIHN1cHBvcnQgMS41LCAzLjAgR2JwcyAqLworCQlwaHlfY2ZnLnUuc3BlZWRfc3VwcG9ydCA9IDM7CisJCXBoeV9jZmcudS50eF9zcHRfcGhzX2xua19yYXRlID0gMHgzYzsKKwkJcGh5X2NmZy51LnR4X2xnY2xfbG5rX3JhdGUgPSAweDA4OworCQlicmVhazsKKwljYXNlIDB4MjoKKwlkZWZhdWx0OgorCQkvKiBzdXBwb3J0IDEuNSwgMy4wLCA2LjAgR2JwcyAqLworCQlwaHlfY2ZnLnUuc3BlZWRfc3VwcG9ydCA9IDc7CisJCXBoeV9jZmcudS5zbndfM19zdXBwb3J0ID0gMTsKKwkJcGh5X2NmZy51LnR4X2xua19wYXJpdHkgPSAxOworCQlwaHlfY2ZnLnUudHhfc3B0X3Boc19sbmtfcmF0ZSA9IDB4M2Y7CisJCXBoeV9jZmcudS50eF9sZ2NsX2xua19yYXRlID0gMHgwOTsKKwkJYnJlYWs7CisJfQorCW12c193cml0ZV9wb3J0X3Zzcl9kYXRhKG12aSwgcGh5X2lkLCBwaHlfY2ZnLnYpOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQKK212c185NHh4X2NvbmZpZ19yZWdfZnJvbV9oYmEoc3RydWN0IG12c19pbmZvICptdmksIGludCBwaHlfaWQpCit7CisJdTMyIHRlbXA7CisJdGVtcCA9ICh1MzIpKCoodTMyICopJm12aS0+aGJhX2luZm9fcGFyYW0ucGh5X3R1bmluZ1twaHlfaWRdKTsKKwlpZiAodGVtcCA9PSAweEZGRkZGRkZGTCkgeworCQltdmktPmhiYV9pbmZvX3BhcmFtLnBoeV90dW5pbmdbcGh5X2lkXS50cmFuc19lbXBfYW1wID0gMHg2OworCQltdmktPmhiYV9pbmZvX3BhcmFtLnBoeV90dW5pbmdbcGh5X2lkXS50cmFuc19hbXAgPSAweDFBOworCQltdmktPmhiYV9pbmZvX3BhcmFtLnBoeV90dW5pbmdbcGh5X2lkXS50cmFuc19hbXBfYWRqID0gMHgzOworCX0KKworCXRlbXAgPSAodTgpKCoodTggKikmbXZpLT5oYmFfaW5mb19wYXJhbS5mZmVfY3RsW3BoeV9pZF0pOworCWlmICh0ZW1wID09IDB4RkZMKSB7CisJCXN3aXRjaCAobXZpLT5wZGV2LT5yZXZpc2lvbikgeworCQljYXNlIFZBTklSX0EwX1JFVjoKKwkJY2FzZSBWQU5JUl9CMF9SRVY6CisJCQltdmktPmhiYV9pbmZvX3BhcmFtLmZmZV9jdGxbcGh5X2lkXS5mZmVfcnNzX3NlbCA9IDB4NzsKKwkJCW12aS0+aGJhX2luZm9fcGFyYW0uZmZlX2N0bFtwaHlfaWRdLmZmZV9jYXBfc2VsID0gMHg3OworCQkJYnJlYWs7CisJCWNhc2UgVkFOSVJfQzBfUkVWOgorCQljYXNlIFZBTklSX0MxX1JFVjoKKwkJY2FzZSBWQU5JUl9DMl9SRVY6CisJCWRlZmF1bHQ6CisJCQltdmktPmhiYV9pbmZvX3BhcmFtLmZmZV9jdGxbcGh5X2lkXS5mZmVfcnNzX3NlbCA9IDB4NzsKKwkJCW12aS0+aGJhX2luZm9fcGFyYW0uZmZlX2N0bFtwaHlfaWRdLmZmZV9jYXBfc2VsID0gMHhDOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwl0ZW1wID0gKHU4KSgqKHU4ICopJm12aS0+aGJhX2luZm9fcGFyYW0ucGh5X3JhdGVbcGh5X2lkXSk7CisJaWYgKHRlbXAgPT0gMHhGRkwpCisJCS8qc2V0IGRlZmF1bHQgcGh5X3JhdGUgPSA2R2JwcyovCisJCW12aS0+aGJhX2luZm9fcGFyYW0ucGh5X3JhdGVbcGh5X2lkXSA9IDB4MjsKKworCXNldF9waHlfdHVuaW5nKG12aSwgcGh5X2lkLAorCQltdmktPmhiYV9pbmZvX3BhcmFtLnBoeV90dW5pbmdbcGh5X2lkXSk7CisJc2V0X3BoeV9mZmVfdHVuaW5nKG12aSwgcGh5X2lkLAorCQltdmktPmhiYV9pbmZvX3BhcmFtLmZmZV9jdGxbcGh5X2lkXSk7CisJc2V0X3BoeV9yYXRlKG12aSwgcGh5X2lkLAorCQltdmktPmhiYV9pbmZvX3BhcmFtLnBoeV9yYXRlW3BoeV9pZF0pOworfQorCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgbXZzXzk0eHhfZW5hYmxlX3htdChzdHJ1Y3QgbXZzX2luZm8gKm12aSwgaW50IHBoeV9pZCkKIHsKIAl2b2lkIF9faW9tZW0gKnJlZ3MgPSBtdmktPnJlZ3M7CkBAIC02MSw3ICsyNzEsMTQgQEAKIHN0YXRpYyB2b2lkIG12c185NHh4X3BoeV9yZXNldChzdHJ1Y3QgbXZzX2luZm8gKm12aSwgdTMyIHBoeV9pZCwgaW50IGhhcmQpCiB7CiAJdTMyIHRtcDsKLQorCXUzMiBkZWxheSA9IDUwMDA7CisJaWYgKGhhcmQgPT0gTVZTX1BIWV9UVU5FKSB7CisJCW12c193cml0ZV9wb3J0X2NmZ19hZGRyKG12aSwgcGh5X2lkLCBQSFlSX1NBVEFfQ1RMKTsKKwkJdG1wID0gbXZzX3JlYWRfcG9ydF9jZmdfZGF0YShtdmksIHBoeV9pZCk7CisJCW12c193cml0ZV9wb3J0X2NmZ19kYXRhKG12aSwgcGh5X2lkLCB0bXB8MHgyMDAwMDAwMCk7CisJCW12c193cml0ZV9wb3J0X2NmZ19kYXRhKG12aSwgcGh5X2lkLCB0bXB8MHgxMDAwMDApOworCQlyZXR1cm47CisJfQogCXRtcCA9IG12c19yZWFkX3BvcnRfaXJxX3N0YXQobXZpLCBwaHlfaWQpOwogCXRtcCAmPSB+UEhZRVZfUkRZX0NIOwogCW12c193cml0ZV9wb3J0X2lycV9zdGF0KG12aSwgcGh5X2lkLCB0bXApOwpAQCAtNzEsMTIgKzI4OCwxNSBAQAogCQltdnNfd3JpdGVfcGh5X2N0bChtdmksIHBoeV9pZCwgdG1wKTsKIAkJZG8gewogCQkJdG1wID0gbXZzX3JlYWRfcGh5X2N0bChtdmksIHBoeV9pZCk7Ci0JCX0gd2hpbGUgKHRtcCAmIFBIWV9SU1RfSEFSRCk7CisJCQl1ZGVsYXkoMTApOworCQkJZGVsYXktLTsKKwkJfSB3aGlsZSAoKHRtcCAmIFBIWV9SU1RfSEFSRCkgJiYgZGVsYXkpOworCQlpZiAoIWRlbGF5KQorCQkJbXZfZHByaW50aygicGh5IGhhcmQgcmVzZXQgZmFpbGVkLlxuIik7CiAJfSBlbHNlIHsKLQkJbXZzX3dyaXRlX3BvcnRfdnNyX2FkZHIobXZpLCBwaHlfaWQsIFZTUl9QSFlfU1RBVCk7Ci0JCXRtcCA9IG12c19yZWFkX3BvcnRfdnNyX2RhdGEobXZpLCBwaHlfaWQpOworCQl0bXAgPSBtdnNfcmVhZF9waHlfY3RsKG12aSwgcGh5X2lkKTsKIAkJdG1wIHw9IFBIWV9SU1Q7Ci0JCW12c193cml0ZV9wb3J0X3Zzcl9kYXRhKG12aSwgcGh5X2lkLCB0bXApOworCQltdnNfd3JpdGVfcGh5X2N0bChtdmksIHBoeV9pZCwgdG1wKTsKIAl9CiB9CiAKQEAgLTkwLDEyICszMTAsMjUgQEAKIAogc3RhdGljIHZvaWQgbXZzXzk0eHhfcGh5X2VuYWJsZShzdHJ1Y3QgbXZzX2luZm8gKm12aSwgdTMyIHBoeV9pZCkKIHsKLQltdnNfd3JpdGVfcG9ydF92c3JfYWRkcihtdmksIHBoeV9pZCwgMHgxQjQpOwotCW12c193cml0ZV9wb3J0X3Zzcl9kYXRhKG12aSwgcGh5X2lkLCAweDgzMDBmZmMxKTsKLQltdnNfd3JpdGVfcG9ydF92c3JfYWRkcihtdmksIHBoeV9pZCwgMHgxMDQpOwotCW12c193cml0ZV9wb3J0X3Zzcl9kYXRhKG12aSwgcGh5X2lkLCAweDAwMDE4MDgwKTsKKwl1MzIgdG1wOworCXU4IHJldmlzaW9uID0gMDsKKworCXJldmlzaW9uID0gbXZpLT5wZGV2LT5yZXZpc2lvbjsKKwlpZiAocmV2aXNpb24gPT0gVkFOSVJfQTBfUkVWKSB7CisJCW12c193cml0ZV9wb3J0X3Zzcl9hZGRyKG12aSwgcGh5X2lkLCBDTURfSE9TVF9SRF9EQVRBKTsKKwkJbXZzX3dyaXRlX3BvcnRfdnNyX2RhdGEobXZpLCBwaHlfaWQsIDB4ODMwMGZmYzEpOworCX0KKwlpZiAocmV2aXNpb24gPT0gVkFOSVJfQjBfUkVWKSB7CisJCW12c193cml0ZV9wb3J0X3Zzcl9hZGRyKG12aSwgcGh5X2lkLCBDTURfQVBQX01FTV9DVEwpOworCQltdnNfd3JpdGVfcG9ydF92c3JfZGF0YShtdmksIHBoeV9pZCwgMHgwODAwMTAwNik7CisJCW12c193cml0ZV9wb3J0X3Zzcl9hZGRyKG12aSwgcGh5X2lkLCBDTURfSE9TVF9SRF9EQVRBKTsKKwkJbXZzX3dyaXRlX3BvcnRfdnNyX2RhdGEobXZpLCBwaHlfaWQsIDB4MDAwMDcwNWYpOworCX0KKwogCW12c193cml0ZV9wb3J0X3Zzcl9hZGRyKG12aSwgcGh5X2lkLCBWU1JfUEhZX01PREUyKTsKLQltdnNfd3JpdGVfcG9ydF92c3JfZGF0YShtdmksIHBoeV9pZCwgMHgwMDIwN2ZmZik7CisJdG1wID0gbXZzX3JlYWRfcG9ydF92c3JfZGF0YShtdmksIHBoeV9pZCk7CisJdG1wIHw9IGJpdCgwKTsKKwltdnNfd3JpdGVfcG9ydF92c3JfZGF0YShtdmksIHBoeV9pZCwgdG1wICYgMHhmZDdmZmZmZik7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IG12c185NHh4X2luaXQoc3RydWN0IG12c19pbmZvICptdmkpCkBAIC0xMDMsNyArMzM2LDkgQEAKIAl2b2lkIF9faW9tZW0gKnJlZ3MgPSBtdmktPnJlZ3M7CiAJaW50IGk7CiAJdTMyIHRtcCwgY2N0bDsKKwl1OCByZXZpc2lvbjsKIAorCXJldmlzaW9uID0gbXZpLT5wZGV2LT5yZXZpc2lvbjsKIAltdnNfc2hvd19wY2llX3VzYWdlKG12aSk7CiAJaWYgKG12aS0+ZmxhZ3MgJiBNVkZfRkxBR19TT0MpIHsKIAkJdG1wID0gbXIzMihNVlNfUEhZX0NUTCk7CkBAIC0xMzMsNiArMzY4LDI4IEBACiAJCW1zbGVlcCgxMDApOwogCX0KIAorCS8qIGRpc2FibGUgTXVsdGlwbGV4aW5nLCBlbmFibGUgcGh5IGltcGxlbWVudGVkICovCisJbXczMihNVlNfUE9SVFNfSU1QLCAweEZGKTsKKworCWlmIChyZXZpc2lvbiA9PSBWQU5JUl9BMF9SRVYpIHsKKwkJbXczMihNVlNfUEFfVlNSX0FERFIsIENNRF9DTVdLX09PQl9ERVQpOworCQltdzMyKE1WU19QQV9WU1JfUE9SVCwgMHgwMDAxODA4MCk7CisJfQorCW13MzIoTVZTX1BBX1ZTUl9BRERSLCBWU1JfUEhZX01PREUyKTsKKwlpZiAocmV2aXNpb24gPT0gVkFOSVJfQTBfUkVWIHx8IHJldmlzaW9uID09IFZBTklSX0IwX1JFVikKKwkJLyogc2V0IDZHLzNHLzEuNUcsIG11bHRpcGxleGluZywgd2l0aG91dCBTU0MgKi8KKwkJbXczMihNVlNfUEFfVlNSX1BPUlQsIDB4MDA4NGQ0ZmUpOworCWVsc2UKKwkJLyogc2V0IDZHLzNHLzEuNUcsIG11bHRpcGxleGluZywgd2l0aCBhbmQgd2l0aG91dCBTU0MgKi8KKwkJbXczMihNVlNfUEFfVlNSX1BPUlQsIDB4MDA4NGZmZmUpOworCisJaWYgKHJldmlzaW9uID09IFZBTklSX0IwX1JFVikgeworCQltdzMyKE1WU19QQV9WU1JfQUREUiwgQ01EX0FQUF9NRU1fQ1RMKTsKKwkJbXczMihNVlNfUEFfVlNSX1BPUlQsIDB4MDgwMDEwMDYpOworCQltdzMyKE1WU19QQV9WU1JfQUREUiwgQ01EX0hPU1RfUkRfREFUQSk7CisJCW13MzIoTVZTX1BBX1ZTUl9QT1JULCAweDAwMDA3MDVmKTsKKwl9CisKIAkvKiByZXNldCBjb250cm9sICovCiAJbXczMihNVlNfUENTLCAwKTsJCS8qIE1WU19QQ1MgKi8KIAltdzMyKE1WU19TVFBfUkVHX1NFVF8wLCAwKTsKQEAgLTE0MSwxNyArMzk4LDggQEAKIAkvKiBpbml0IHBoeXMgKi8KIAltdnNfcGh5X2hhY2tzKG12aSk7CiAKLQkvKiBkaXNhYmxlIE11bHRpcGxleGluZywgZW5hYmxlIHBoeSBpbXBsZW1lbnRlZCAqLwotCW13MzIoTVZTX1BPUlRTX0lNUCwgMHhGRik7Ci0KLQotCW13MzIoTVZTX1BBX1ZTUl9BRERSLCAweDAwMDAwMTA0KTsKLQltdzMyKE1WU19QQV9WU1JfUE9SVCwgMHgwMDAxODA4MCk7Ci0JbXczMihNVlNfUEFfVlNSX0FERFIsIFZTUl9QSFlfTU9ERTgpOwotCW13MzIoTVZTX1BBX1ZTUl9QT1JULCAweDAwODRmZmZmKTsKLQogCS8qIHNldCBMRUQgYmxpbmsgd2hlbiBJTyovCi0JbXczMihNVlNfUEFfVlNSX0FERFIsIDB4MDAwMDAwMzApOworCW13MzIoTVZTX1BBX1ZTUl9BRERSLCBWU1JfUEhZX0FDVF9MRUQpOwogCXRtcCA9IG1yMzIoTVZTX1BBX1ZTUl9QT1JUKTsKIAl0bXAgJj0gMHhGRkZGMDBGRjsKIAl0bXAgfD0gMHgwMDAwMzMwMDsKQEAgLTE3NSwxMiArNDIzLDEzIEBACiAJCW12c185NHh4X3BoeV9kaXNhYmxlKG12aSwgaSk7CiAJCS8qIHNldCBwaHkgbG9jYWwgU0FTIGFkZHJlc3MgKi8KIAkJbXZzX3NldF9zYXNfYWRkcihtdmksIGksIENPTkZJR19JRF9GUkFNRTMsIENPTkZJR19JRF9GUkFNRTQsCi0JCQkJCQkobXZpLT5waHlbaV0uZGV2X3Nhc19hZGRyKSk7CisJCQkJCQljcHVfdG9fbGU2NChtdmktPnBoeVtpXS5kZXZfc2FzX2FkZHIpKTsKIAogCQltdnNfOTR4eF9lbmFibGVfeG10KG12aSwgaSk7CisJCW12c185NHh4X2NvbmZpZ19yZWdfZnJvbV9oYmEobXZpLCBpKTsKIAkJbXZzXzk0eHhfcGh5X2VuYWJsZShtdmksIGkpOwogCi0JCW12c185NHh4X3BoeV9yZXNldChtdmksIGksIDEpOworCQltdnNfOTR4eF9waHlfcmVzZXQobXZpLCBpLCBQSFlfUlNUX0hBUkQpOwogCQltc2xlZXAoNTAwKTsKIAkJbXZzXzk0eHhfZGV0ZWN0X3BvcnR0eXBlKG12aSwgaSk7CiAJfQpAQCAtMjExLDE2ICs0NjAsOSBAQAogCQltdnNfdXBkYXRlX3BoeWluZm8obXZpLCBpLCAxKTsKIAl9CiAKLQkvKiBGSVhNRTogdXBkYXRlIHdpZGUgcG9ydCBiaXRtYXBzICovCi0KIAkvKiBsaXR0bGUgZW5kaWFuIGZvciBvcGVuIGFkZHJlc3MgYW5kIGNvbW1hbmQgdGFibGUsIGV0Yy4gKi8KLQkvKgotCSAqIGl0IHNlZW1zIHRoYXQgKCBmcm9tIHRoZSBzcGVjICkgdHVybmluZyBvbiBiaWctZW5kaWFuIHdvbid0Ci0JICogZG8gdXMgYW55IGdvb2Qgb24gYmlnLWVuZGlhbiBtYWNoaW5lcywgbmVlZCBmdXJ0aGVyIGNvbmZpcm1hdGlvbgotCSAqLwogCWNjdGwgPSBtcjMyKE1WU19DVEwpOwogCWNjdGwgfD0gQ0NUTF9FTkRJQU5fQ01EOwotCWNjdGwgfD0gQ0NUTF9FTkRJQU5fREFUQTsKIAljY3RsICY9IH5DQ1RMX0VORElBTl9PUEVOOwogCWNjdGwgfD0gQ0NUTF9FTkRJQU5fUlNQOwogCW13MzJfZihNVlNfQ1RMLCBjY3RsKTsKQEAgLTIyOCwxNSArNDcwLDIwIEBACiAJLyogcmVzZXQgQ01EIHF1ZXVlICovCiAJdG1wID0gbXIzMihNVlNfUENTKTsKIAl0bXAgfD0gUENTX0NNRF9SU1Q7CisJdG1wICY9IH5QQ1NfU0VMRl9DTEVBUjsKIAltdzMyKE1WU19QQ1MsIHRtcCk7Ci0JLyogaW50ZXJydXB0IGNvYWxlc2NpbmcgbWF5IGNhdXNlIG1pc3NpbmcgSFcgaW50ZXJycHV0IGluIHNvbWUgY2FzZSwKLQkgKiBhbmQgdGhlIG1heCBjb3VudCBpcyAweDFmZiwgd2hpbGUgb3VyIG1heCBzbG90IGlzIDB4MjAwLAorCS8qCisJICogdGhlIG1heCBjb3VudCBpcyAweDFmZiwgd2hpbGUgb3VyIG1heCBzbG90IGlzIDB4MjAwLAogCSAqIGl0IHdpbGwgbWFrZSBjb3VudCAwLgogCSAqLwogCXRtcCA9IDA7Ci0JbXczMihNVlNfSU5UX0NPQUwsIHRtcCk7CisJaWYgKE1WU19DSElQX1NMT1RfU1ogPiAweDFmZikKKwkJbXczMihNVlNfSU5UX0NPQUwsIDB4MWZmIHwgQ09BTF9FTik7CisJZWxzZQorCQltdzMyKE1WU19JTlRfQ09BTCwgTVZTX0NISVBfU0xPVF9TWiB8IENPQUxfRU4pOwogCi0JdG1wID0gMHgxMDA7CisJLyogZGVmYXVsdCBpbnRlcnJ1cHQgY29hbGVzY2luZyB0aW1lIGlzIDEyOHVzICovCisJdG1wID0gMHgxMDAwMCB8IGludGVycnVwdF9jb2FsZXNjaW5nOwogCW13MzIoTVZTX0lOVF9DT0FMX1RNT1VULCB0bXApOwogCiAJLyogbGFkaWVzIGFuZCBnZW50bGVtZW4sIHN0YXJ0IHlvdXIgZW5naW5lcyAqLwpAQCAtMjQ5LDcgKzQ5Niw3IEBACiAKIAkvKiBlbmFibGUgY29tcGxldGlvbiBxdWV1ZSBpbnRlcnJ1cHQgKi8KIAl0bXAgPSAoQ0lOVF9QT1JUX01BU0sgfCBDSU5UX0RPTkUgfCBDSU5UX01FTSB8IENJTlRfU1JTIHwgQ0lOVF9DSV9TVE9QIHwKLQkJQ0lOVF9ETUFfUENJRSk7CisJCUNJTlRfRE1BX1BDSUUgfCBDSU5UX05PTl9TUEVDX05DUV9FUlJPUik7CiAJdG1wIHw9IENJTlRfUEhZX01BU0s7CiAJbXczMihNVlNfSU5UX01BU0ssIHRtcCk7CiAKQEAgLTMzMiwxMyArNTc5LDEwIEBACiAJaWYgKCgoc3RhdCAmIElSUV9TQVNfQSkgJiYgbXZpLT5pZCA9PSAwKSB8fAogCQkJKChzdGF0ICYgSVJRX1NBU19CKSAmJiBtdmktPmlkID09IDEpKSB7CiAJCW13MzJfZihNVlNfSU5UX1NUQVQsIENJTlRfRE9ORSk7Ci0JI2lmbmRlZiBNVlNfVVNFX1RBU0tMRVQKKwogCQlzcGluX2xvY2soJm12aS0+bG9jayk7Ci0JI2VuZGlmCiAJCW12c19pbnRfZnVsbChtdmkpOwotCSNpZm5kZWYgTVZTX1VTRV9UQVNLTEVUCiAJCXNwaW5fdW5sb2NrKCZtdmktPmxvY2spOwotCSNlbmRpZgogCX0KIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CkBAIC0zNDYsMTAgKzU5MCw0OCBAQAogc3RhdGljIHZvaWQgbXZzXzk0eHhfY29tbWFuZF9hY3RpdmUoc3RydWN0IG12c19pbmZvICptdmksIHUzMiBzbG90X2lkeCkKIHsKIAl1MzIgdG1wOwotCW12c19jdzMyKG12aSwgMHgzMDAgKyAoc2xvdF9pZHggPj4gMyksIDEgPDwgKHNsb3RfaWR4ICUgMzIpKTsKLQlkbyB7Ci0JCXRtcCA9IG12c19jcjMyKG12aSwgMHgzMDAgKyAoc2xvdF9pZHggPj4gMykpOwotCX0gd2hpbGUgKHRtcCAmIDEgPDwgKHNsb3RfaWR4ICUgMzIpKTsKKwl0bXAgPSBtdnNfY3IzMihtdmksIE1WU19DT01NQU5EX0FDVElWRSsoc2xvdF9pZHggPj4gMykpOworCWlmICh0bXAgJiYgMSA8PCAoc2xvdF9pZHggJSAzMikpIHsKKwkJbXZfcHJpbnRrKCJjb21tYW5kIGFjdGl2ZSAlMDhYLCAgc2xvdCBbJXhdLlxuIiwgdG1wLCBzbG90X2lkeCk7CisJCW12c19jdzMyKG12aSwgTVZTX0NPTU1BTkRfQUNUSVZFICsgKHNsb3RfaWR4ID4+IDMpLAorCQkJMSA8PCAoc2xvdF9pZHggJSAzMikpOworCQlkbyB7CisJCQl0bXAgPSBtdnNfY3IzMihtdmksCisJCQkJTVZTX0NPTU1BTkRfQUNUSVZFICsgKHNsb3RfaWR4ID4+IDMpKTsKKwkJfSB3aGlsZSAodG1wICYgMSA8PCAoc2xvdF9pZHggJSAzMikpOworCX0KK30KKwordm9pZCBtdnNfOTR4eF9jbGVhcl9zcnNfaXJxKHN0cnVjdCBtdnNfaW5mbyAqbXZpLCB1OCByZWdfc2V0LCB1OCBjbGVhcl9hbGwpCit7CisJdm9pZCBfX2lvbWVtICpyZWdzID0gbXZpLT5yZWdzOworCXUzMiB0bXA7CisKKwlpZiAoY2xlYXJfYWxsKSB7CisJCXRtcCA9IG1yMzIoTVZTX0lOVF9TVEFUX1NSU18wKTsKKwkJaWYgKHRtcCkgeworCQkJbXZfZHByaW50aygiY2hlY2sgU1JTIDAgJTA4WC5cbiIsIHRtcCk7CisJCQltdzMyKE1WU19JTlRfU1RBVF9TUlNfMCwgdG1wKTsKKwkJfQorCQl0bXAgPSBtcjMyKE1WU19JTlRfU1RBVF9TUlNfMSk7CisJCWlmICh0bXApIHsKKwkJCW12X2RwcmludGsoImNoZWNrIFNSUyAxICUwOFguXG4iLCB0bXApOworCQkJbXczMihNVlNfSU5UX1NUQVRfU1JTXzEsIHRtcCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAocmVnX3NldCA+IDMxKQorCQkJdG1wID0gbXIzMihNVlNfSU5UX1NUQVRfU1JTXzEpOworCQllbHNlCisJCQl0bXAgPSBtcjMyKE1WU19JTlRfU1RBVF9TUlNfMCk7CisKKwkJaWYgKHRtcCAmICgxIDw8IChyZWdfc2V0ICUgMzIpKSkgeworCQkJbXZfZHByaW50aygicmVnaXN0ZXIgc2V0IDB4JXggd2FzIHN0b3BwZWQuXG4iLCByZWdfc2V0KTsKKwkJCWlmIChyZWdfc2V0ID4gMzEpCisJCQkJbXczMihNVlNfSU5UX1NUQVRfU1JTXzEsIDEgPDwgKHJlZ19zZXQgJSAzMikpOworCQkJZWxzZQorCQkJCW13MzIoTVZTX0lOVF9TVEFUX1NSU18wLCAxIDw8IChyZWdfc2V0ICUgMzIpKTsKKwkJfQorCX0KIH0KIAogc3RhdGljIHZvaWQgbXZzXzk0eHhfaXNzdWVfc3RvcChzdHJ1Y3QgbXZzX2luZm8gKm12aSwgZW51bSBtdnNfcG9ydF90eXBlIHR5cGUsCkBAIC0zNTcsMzcgKzYzOSw1NiBAQAogewogCXZvaWQgX19pb21lbSAqcmVncyA9IG12aS0+cmVnczsKIAl1MzIgdG1wOworCW12c185NHh4X2NsZWFyX3Nyc19pcnEobXZpLCAwLCAxKTsKIAotCWlmICh0eXBlID09IFBPUlRfVFlQRV9TQVRBKSB7Ci0JCXRtcCA9IG1yMzIoTVZTX0lOVF9TVEFUX1NSU18wKSB8ICgxVSA8PCB0ZnMpOwotCQltdzMyKE1WU19JTlRfU1RBVF9TUlNfMCwgdG1wKTsKLQl9Ci0JbXczMihNVlNfSU5UX1NUQVQsIENJTlRfQ0lfU1RPUCk7CisJdG1wID0gbXIzMihNVlNfSU5UX1NUQVQpOworCW13MzIoTVZTX0lOVF9TVEFULCB0bXAgfCBDSU5UX0NJX1NUT1ApOwogCXRtcCA9IG1yMzIoTVZTX1BDUykgfCAweEZGMDA7CiAJbXczMihNVlNfUENTLCB0bXApOwogfQogCitzdGF0aWMgdm9pZCBtdnNfOTR4eF9ub25fc3BlY19uY3FfZXJyb3Ioc3RydWN0IG12c19pbmZvICptdmkpCit7CisJdm9pZCBfX2lvbWVtICpyZWdzID0gbXZpLT5yZWdzOworCXUzMiBlcnJfMCwgZXJyXzE7CisJdTggaTsKKwlzdHJ1Y3QgbXZzX2RldmljZSAqZGV2aWNlOworCisJZXJyXzAgPSBtcjMyKE1WU19OT05fTkNRX0VSUl8wKTsKKwllcnJfMSA9IG1yMzIoTVZTX05PTl9OQ1FfRVJSXzEpOworCisJbXZfZHByaW50aygibm9uIHNwZWNpZmljIG5jcSBlcnJvciBlcnJfMDoleCxlcnJfMToleC5cbiIsCisJCQllcnJfMCwgZXJyXzEpOworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCWlmIChlcnJfMCAmIGJpdChpKSkgeworCQkJZGV2aWNlID0gbXZzX2ZpbmRfZGV2X2J5X3JlZ19zZXQobXZpLCBpKTsKKwkJCWlmIChkZXZpY2UpCisJCQkJbXZzX3JlbGVhc2VfdGFzayhtdmksIGRldmljZS0+c2FzX2RldmljZSk7CisJCX0KKwkJaWYgKGVycl8xICYgYml0KGkpKSB7CisJCQlkZXZpY2UgPSBtdnNfZmluZF9kZXZfYnlfcmVnX3NldChtdmksIGkrMzIpOworCQkJaWYgKGRldmljZSkKKwkJCQltdnNfcmVsZWFzZV90YXNrKG12aSwgZGV2aWNlLT5zYXNfZGV2aWNlKTsKKwkJfQorCX0KKworCW13MzIoTVZTX05PTl9OQ1FfRVJSXzAsIGVycl8wKTsKKwltdzMyKE1WU19OT05fTkNRX0VSUl8xLCBlcnJfMSk7Cit9CisKIHN0YXRpYyB2b2lkIG12c185NHh4X2ZyZWVfcmVnX3NldChzdHJ1Y3QgbXZzX2luZm8gKm12aSwgdTggKnRmcykKIHsKIAl2b2lkIF9faW9tZW0gKnJlZ3MgPSBtdmktPnJlZ3M7Ci0JdTMyIHRtcDsKIAl1OCByZWdfc2V0ID0gKnRmczsKIAogCWlmICgqdGZzID09IE1WU19JRF9OT1RfTUFQUEVEKQogCQlyZXR1cm47CiAKIAltdmktPnNhdGFfcmVnX3NldCAmPSB+Yml0KHJlZ19zZXQpOwotCWlmIChyZWdfc2V0IDwgMzIpIHsKKwlpZiAocmVnX3NldCA8IDMyKQogCQl3X3JlZ19zZXRfZW5hYmxlKHJlZ19zZXQsICh1MzIpbXZpLT5zYXRhX3JlZ19zZXQpOwotCQl0bXAgPSBtcjMyKE1WU19JTlRfU1RBVF9TUlNfMCkgJiAodTMyKW12aS0+c2F0YV9yZWdfc2V0OwotCQlpZiAodG1wKQotCQkJbXczMihNVlNfSU5UX1NUQVRfU1JTXzAsIHRtcCk7Ci0JfSBlbHNlIHsKLQkJd19yZWdfc2V0X2VuYWJsZShyZWdfc2V0LCBtdmktPnNhdGFfcmVnX3NldCk7Ci0JCXRtcCA9IG1yMzIoTVZTX0lOVF9TVEFUX1NSU18xKSAmIG12aS0+c2F0YV9yZWdfc2V0OwotCQlpZiAodG1wKQotCQkJbXczMihNVlNfSU5UX1NUQVRfU1JTXzEsIHRtcCk7Ci0JfQorCWVsc2UKKwkJd19yZWdfc2V0X2VuYWJsZShyZWdfc2V0LCAodTMyKShtdmktPnNhdGFfcmVnX3NldCA+PiAzMikpOwogCiAJKnRmcyA9IE1WU19JRF9OT1RfTUFQUEVEOwogCkBAIC00MDMsNyArNzA0LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlpID0gbXZfZmZjNjQobXZpLT5zYXRhX3JlZ19zZXQpOwotCWlmIChpID4gMzIpIHsKKwlpZiAoaSA+PSAzMikgewogCQltdmktPnNhdGFfcmVnX3NldCB8PSBiaXQoaSk7CiAJCXdfcmVnX3NldF9lbmFibGUoaSwgKHUzMikobXZpLT5zYXRhX3JlZ19zZXQgPj4gMzIpKTsKIAkJKnRmcyA9IGk7CkBAIC00MjIsOSArNzIzLDEyIEBACiAJaW50IGk7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKIAlzdHJ1Y3QgbXZzX3ByZCAqYnVmX3ByZCA9IHByZDsKKwlzdHJ1Y3QgbXZzX3ByZF9pbXQgaW1fbGVuOworCSoodTMyICopJmltX2xlbiA9IDA7CiAJZm9yX2VhY2hfc2coc2NhdHRlciwgc2csIG5yLCBpKSB7CiAJCWJ1Zl9wcmQtPmFkZHIgPSBjcHVfdG9fbGU2NChzZ19kbWFfYWRkcmVzcyhzZykpOwotCQlidWZfcHJkLT5pbV9sZW4ubGVuID0gY3B1X3RvX2xlMzIoc2dfZG1hX2xlbihzZykpOworCQlpbV9sZW4ubGVuID0gc2dfZG1hX2xlbihzZyk7CisJCWJ1Zl9wcmQtPmltX2xlbiA9IGNwdV90b19sZTMyKCoodTMyICopJmltX2xlbik7CiAJCWJ1Zl9wcmQrKzsKIAl9CiB9CkBAIC00MzMsNyArNzM3LDcgQEAKIHsKIAl1MzIgcGh5X3N0OwogCXBoeV9zdCA9IG12c19yZWFkX3BoeV9jdGwobXZpLCBpKTsKLQlpZiAocGh5X3N0ICYgUEhZX1JFQURZX01BU0spCS8qIHBoeSByZWFkeSAqLworCWlmIChwaHlfc3QgJiBQSFlfUkVBRFlfTUFTSykKIAkJcmV0dXJuIDE7CiAJcmV0dXJuIDA7CiB9CkBAIC00NDcsNyArNzUxLDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CiAJCW12c193cml0ZV9wb3J0X2NmZ19hZGRyKG12aSwgcG9ydF9pZCwKIAkJCQkJQ09ORklHX0lEX0ZSQU1FMCArIGkgKiA0KTsKLQkJaWRfZnJhbWVbaV0gPSBtdnNfcmVhZF9wb3J0X2NmZ19kYXRhKG12aSwgcG9ydF9pZCk7CisJCWlkX2ZyYW1lW2ldID0gY3B1X3RvX2xlMzIobXZzX3JlYWRfcG9ydF9jZmdfZGF0YShtdmksIHBvcnRfaWQpKTsKIAl9CiAJbWVtY3B5KGlkLCBpZF9mcmFtZSwgMjgpOwogfQpAQCAtNDU4LDE1ICs3NjIsMTMgQEAKIAlpbnQgaTsKIAl1MzIgaWRfZnJhbWVbN107CiAKLQkvKiBtdnNfaGV4ZHVtcCgyOCwgKHU4ICopaWRfZnJhbWUsIDApOyAqLwogCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKIAkJbXZzX3dyaXRlX3BvcnRfY2ZnX2FkZHIobXZpLCBwb3J0X2lkLAogCQkJCQlDT05GSUdfQVRUX0lEX0ZSQU1FMCArIGkgKiA0KTsKLQkJaWRfZnJhbWVbaV0gPSBtdnNfcmVhZF9wb3J0X2NmZ19kYXRhKG12aSwgcG9ydF9pZCk7CisJCWlkX2ZyYW1lW2ldID0gY3B1X3RvX2xlMzIobXZzX3JlYWRfcG9ydF9jZmdfZGF0YShtdmksIHBvcnRfaWQpKTsKIAkJbXZfZHByaW50aygiOTR4eCBwaHkgJWQgYXR0YSBmcmFtZSAlZCAleC5cbiIsCiAJCQlwb3J0X2lkICsgbXZpLT5pZCAqIG12aS0+Y2hpcC0+bl9waHksIGksIGlkX2ZyYW1lW2ldKTsKIAl9Ci0JLyogbXZzX2hleGR1bXAoMjgsICh1OCAqKWlkX2ZyYW1lLCAwKTsgKi8KIAltZW1jcHkoaWQsIGlkX2ZyYW1lLCAyOCk7CiB9CiAKQEAgLTUyNiw3ICs4MjgsMTggQEAKIHZvaWQgbXZzXzk0eHhfcGh5X3NldF9saW5rX3JhdGUoc3RydWN0IG12c19pbmZvICptdmksIHUzMiBwaHlfaWQsCiAJCQlzdHJ1Y3Qgc2FzX3BoeV9saW5rcmF0ZXMgKnJhdGVzKQogewotCS8qIFRPRE8gKi8KKwl1MzIgbHJtYXggPSAwOworCXUzMiB0bXA7CisKKwl0bXAgPSBtdnNfcmVhZF9waHlfY3RsKG12aSwgcGh5X2lkKTsKKwlscm1heCA9IChyYXRlcy0+bWF4aW11bV9saW5rcmF0ZSAtIFNBU19MSU5LX1JBVEVfMV81X0dCUFMpIDw8IDEyOworCisJaWYgKGxybWF4KSB7CisJCXRtcCAmPSB+KDB4MyA8PCAxMik7CisJCXRtcCB8PSBscm1heDsKKwl9CisJbXZzX3dyaXRlX3BoeV9jdGwobXZpLCBwaHlfaWQsIHRtcCk7CisJbXZzXzk0eHhfcGh5X3Jlc2V0KG12aSwgcGh5X2lkLCBQSFlfUlNUX0hBUkQpOwogfQogCiBzdGF0aWMgdm9pZCBtdnNfOTR4eF9jbGVhcl9hY3RpdmVfY21kcyhzdHJ1Y3QgbXZzX2luZm8gKm12aSkKQEAgLTYwMywyNyArOTE2LDU5IEBACiAJcmV0dXJuIC0xOwogfQogCi0jaWZuZGVmIERJU0FCTEVfSE9UUExVR19ETUFfRklYCi12b2lkIG12c185NHh4X2ZpeF9kbWEoZG1hX2FkZHJfdCBidWZfZG1hLCBpbnQgYnVmX2xlbiwgaW50IGZyb20sIHZvaWQgKnByZCkKK3ZvaWQgbXZzXzk0eHhfZml4X2RtYShzdHJ1Y3QgbXZzX2luZm8gKm12aSwgdTMyIHBoeV9tYXNrLAorCQkJCWludCBidWZfbGVuLCBpbnQgZnJvbSwgdm9pZCAqcHJkKQogewogCWludCBpOwogCXN0cnVjdCBtdnNfcHJkICpidWZfcHJkID0gcHJkOworCWRtYV9hZGRyX3QgYnVmX2RtYTsKKwlzdHJ1Y3QgbXZzX3ByZF9pbXQgaW1fbGVuOworCisJKih1MzIgKikmaW1fbGVuID0gMDsKIAlidWZfcHJkICs9IGZyb207Ci0JZm9yIChpID0gMDsgaSA8IE1BWF9TR19FTlRSWSAtIGZyb207IGkrKykgewotCQlidWZfcHJkLT5hZGRyID0gY3B1X3RvX2xlNjQoYnVmX2RtYSk7Ci0JCWJ1Zl9wcmQtPmltX2xlbi5sZW4gPSBjcHVfdG9fbGUzMihidWZfbGVuKTsKLQkJKytidWZfcHJkOworCisjZGVmaW5lIFBSRF9DSEFJTkVEX0VOVFJZIDB4MDEKKwlpZiAoKG12aS0+cGRldi0+cmV2aXNpb24gPT0gVkFOSVJfQTBfUkVWKSB8fAorCQkJKG12aS0+cGRldi0+cmV2aXNpb24gPT0gVkFOSVJfQjBfUkVWKSkKKwkJYnVmX2RtYSA9IChwaHlfbWFzayA8PSAweDA4KSA/CisJCQkJbXZpLT5idWxrX2J1ZmZlcl9kbWEgOiBtdmktPmJ1bGtfYnVmZmVyX2RtYTE7CisJZWxzZQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSBmcm9tOyBpIDwgTUFYX1NHX0VOVFJZOyBpKyssICsrYnVmX3ByZCkgeworCQlpZiAoaSA9PSBNQVhfU0dfRU5UUlkgLSAxKSB7CisJCQlidWZfcHJkLT5hZGRyID0gY3B1X3RvX2xlNjQodmlydF90b19waHlzKGJ1Zl9wcmQgLSAxKSk7CisJCQlpbV9sZW4ubGVuID0gMjsKKwkJCWltX2xlbi5taXNjX2N0bCA9IFBSRF9DSEFJTkVEX0VOVFJZOworCQl9IGVsc2UgeworCQkJYnVmX3ByZC0+YWRkciA9IGNwdV90b19sZTY0KGJ1Zl9kbWEpOworCQkJaW1fbGVuLmxlbiA9IGJ1Zl9sZW47CisJCX0KKwkJYnVmX3ByZC0+aW1fbGVuID0gY3B1X3RvX2xlMzIoKih1MzIgKikmaW1fbGVuKTsKIAl9CiB9Ci0jZW5kaWYKIAotLyoKLSAqIEZJWE1FIEpFSkI6IHRlbXBvcmFyeSBub3AgY2xlYXJfc3JzX2lycSB0byBtYWtlIDk0eHggc3RpbGwgd29yawotICogd2l0aCA2NHh4IGZpeGVzCi0gKi8KLXN0YXRpYyB2b2lkIG12c185NHh4X2NsZWFyX3Nyc19pcnEoc3RydWN0IG12c19pbmZvICptdmksIHU4IHJlZ19zZXQsCi0JCQkJICAgdTggY2xlYXJfYWxsKQorc3RhdGljIHZvaWQgbXZzXzk0eHhfdHVuZV9pbnRlcnJ1cHQoc3RydWN0IG12c19pbmZvICptdmksIHUzMiB0aW1lKQogeworCXZvaWQgX19pb21lbSAqcmVncyA9IG12aS0+cmVnczsKKwl1MzIgdG1wID0gMDsKKwkvKgorCSAqIHRoZSBtYXggY291bnQgaXMgMHgxZmYsIHdoaWxlIG91ciBtYXggc2xvdCBpcyAweDIwMCwKKwkgKiBpdCB3aWxsIG1ha2UgY291bnQgMC4KKwkgKi8KKwlpZiAodGltZSA9PSAwKSB7CisJCW13MzIoTVZTX0lOVF9DT0FMLCAwKTsKKwkJbXczMihNVlNfSU5UX0NPQUxfVE1PVVQsIDB4MTAwMDApOworCX0gZWxzZSB7CisJCWlmIChNVlNfQ0hJUF9TTE9UX1NaID4gMHgxZmYpCisJCQltdzMyKE1WU19JTlRfQ09BTCwgMHgxZmZ8Q09BTF9FTik7CisJCWVsc2UKKwkJCW13MzIoTVZTX0lOVF9DT0FMLCBNVlNfQ0hJUF9TTE9UX1NafENPQUxfRU4pOworCisJCXRtcCA9IDB4MTAwMDAgfCB0aW1lOworCQltdzMyKE1WU19JTlRfQ09BTF9UTU9VVCwgdG1wKTsKKwl9CisKIH0KIAogY29uc3Qgc3RydWN0IG12c19kaXNwYXRjaCBtdnNfOTR4eF9kaXNwYXRjaCA9IHsKQEAgLTY0OCw3ICs5OTMsNiBAQAogCW12c193cml0ZV9wb3J0X2lycV9zdGF0LAogCW12c19yZWFkX3BvcnRfaXJxX21hc2ssCiAJbXZzX3dyaXRlX3BvcnRfaXJxX21hc2ssCi0JbXZzX2dldF9zYXNfYWRkciwKIAltdnNfOTR4eF9jb21tYW5kX2FjdGl2ZSwKIAltdnNfOTR4eF9jbGVhcl9zcnNfaXJxLAogCW12c185NHh4X2lzc3VlX3N0b3AsCkBAIC02NzYsOCArMTAyMCw4IEBACiAJbXZzXzk0eHhfc3BpX2J1aWxkY21kLAogCW12c185NHh4X3NwaV9pc3N1ZWNtZCwKIAltdnNfOTR4eF9zcGlfd2FpdGRhdGFyZWFkeSwKLSNpZm5kZWYgRElTQUJMRV9IT1RQTFVHX0RNQV9GSVgKIAltdnNfOTR4eF9maXhfZG1hLAotI2VuZGlmCisJbXZzXzk0eHhfdHVuZV9pbnRlcnJ1cHQsCisJbXZzXzk0eHhfbm9uX3NwZWNfbmNxX2Vycm9yLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL212c2FzL212Xzk0eHguaCBiL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl85NHh4LmgKaW5kZXggODgzNWJlZi4uOGY3ZWI0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL212c2FzL212Xzk0eHguaAorKysgYi9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfOTR4eC5oCkBAIC0zMCw2ICszMCwxNCBAQAogCiAjZGVmaW5lIE1BWF9MSU5LX1JBVEUJCVNBU19MSU5LX1JBVEVfNl8wX0dCUFMKIAorZW51bSBWQU5JUl9SRVZJU0lPTl9JRCB7CisJVkFOSVJfQTBfUkVWCQk9IDB4QTAsCisJVkFOSVJfQjBfUkVWCQk9IDB4MDEsCisJVkFOSVJfQzBfUkVWCQk9IDB4MDIsCisJVkFOSVJfQzFfUkVWCQk9IDB4MDMsCisJVkFOSVJfQzJfUkVWCQk9IDB4QzIsCit9OworCiBlbnVtIGh3X3JlZ2lzdGVycyB7CiAJTVZTX0dCTF9DVEwJCT0gMHgwNCwgIC8qIGdsb2JhbCBjb250cm9sICovCiAJTVZTX0dCTF9JTlRfU1RBVAk9IDB4MDAsICAvKiBnbG9iYWwgaXJxIHN0YXR1cyAqLwpAQCAtMTAxLDYgKzEwOSw3IEBACiAJTVZTX1A0X1ZTUl9EQVRBIAk9IDB4MjU0LCAvKiBwaHk0IFZTUiBkYXRhICovCiAJTVZTX1BBX1ZTUl9BRERSCQk9IDB4MjkwLCAvKiBBbGwgcG9ydCBWU1IgYWRkciAqLwogCU1WU19QQV9WU1JfUE9SVAkJPSAweDI5NCwgLyogQWxsIHBvcnQgVlNSIGRhdGEgKi8KKwlNVlNfQ09NTUFORF9BQ1RJVkUJPSAweDMwMCwKIH07CiAKIGVudW0gcGNpX2NmZ19yZWdpc3RlcnMgewpAQCAtMTEyLDI2ICsxMjEsMjkgQEAKIAogLyogIFNBUy9TQVRBIFZlbmRvciBTcGVjaWZpYyBQb3J0IFJlZ2lzdGVycyAqLwogZW51bSBzYXNfc2F0YV92c3BfcmVncyB7Ci0JVlNSX1BIWV9TVEFUCQk9IDB4MDAgKiA0LCAvKiBQaHkgU3RhdHVzICovCi0JVlNSX1BIWV9NT0RFMQkJPSAweDAxICogNCwgLyogcGh5IHR4ICovCi0JVlNSX1BIWV9NT0RFMgkJPSAweDAyICogNCwgLyogdHggc2NjICovCi0JVlNSX1BIWV9NT0RFMwkJPSAweDAzICogNCwgLyogcGxsICovCi0JVlNSX1BIWV9NT0RFNAkJPSAweDA0ICogNCwgLyogVkNPICovCi0JVlNSX1BIWV9NT0RFNQkJPSAweDA1ICogNCwgLyogUnggKi8KLQlWU1JfUEhZX01PREU2CQk9IDB4MDYgKiA0LCAvKiBDRFIgKi8KLQlWU1JfUEhZX01PREU3CQk9IDB4MDcgKiA0LCAvKiBJbXBlZGFuY2UgKi8KLQlWU1JfUEhZX01PREU4CQk9IDB4MDggKiA0LCAvKiBWb2x0YWdlICovCi0JVlNSX1BIWV9NT0RFOQkJPSAweDA5ICogNCwgLyogVGVzdCAqLwotCVZTUl9QSFlfTU9ERTEwCQk9IDB4MEEgKiA0LCAvKiBQb3dlciAqLwotCVZTUl9QSFlfTU9ERTExCQk9IDB4MEIgKiA0LCAvKiBQaHkgTW9kZSAqLwotCVZTUl9QSFlfVlMwCQk9IDB4MEMgKiA0LCAvKiBWZWRub3IgU3BlY2lmaWMgMCAqLwotCVZTUl9QSFlfVlMxCQk9IDB4MEQgKiA0LCAvKiBWZWRub3IgU3BlY2lmaWMgMSAqLworCVZTUl9QSFlfU1RBVAkJPSAweDAwICogNCwgLyogUGh5IEludGVycnVwdCBTdGF0dXMgKi8KKwlWU1JfUEhZX01PREUxCQk9IDB4MDEgKiA0LCAvKiBwaHkgSW50ZXJydXB0IEVuYWJsZSAqLworCVZTUl9QSFlfTU9ERTIJCT0gMHgwMiAqIDQsIC8qIFBoeSBDb25maWd1cmF0aW9uICovCisJVlNSX1BIWV9NT0RFMwkJPSAweDAzICogNCwgLyogUGh5IFN0YXR1cyAqLworCVZTUl9QSFlfTU9ERTQJCT0gMHgwNCAqIDQsIC8qIFBoeSBDb3VudGVyIDAgKi8KKwlWU1JfUEhZX01PREU1CQk9IDB4MDUgKiA0LCAvKiBQaHkgQ291bnRlciAxICovCisJVlNSX1BIWV9NT0RFNgkJPSAweDA2ICogNCwgLyogRXZlbnQgQ291bnRlciBDb250cm9sICovCisJVlNSX1BIWV9NT0RFNwkJPSAweDA3ICogNCwgLyogRXZlbnQgQ291bnRlciBTZWxlY3QgKi8KKwlWU1JfUEhZX01PREU4CQk9IDB4MDggKiA0LCAvKiBFdmVudCBDb3VudGVyIDAgKi8KKwlWU1JfUEhZX01PREU5CQk9IDB4MDkgKiA0LCAvKiBFdmVudCBDb3VudGVyIDEgKi8KKwlWU1JfUEhZX01PREUxMAkJPSAweDBBICogNCwgLyogRXZlbnQgQ291bnRlciAyICovCisJVlNSX1BIWV9NT0RFMTEJCT0gMHgwQiAqIDQsIC8qIEV2ZW50IENvdW50ZXIgMyAqLworCVZTUl9QSFlfQUNUX0xFRAkJPSAweDBDICogNCwgLyogQWN0aXZpdHkgTEVEIGNvbnRyb2wgKi8KKworCVZTUl9QSFlfRkZFX0NPTlRST0wJPSAweDEwQywKKwlWU1JfUEhZX0RGRV9VUERBVEVfQ1JUTAk9IDB4MTEwLAorCVZTUl9SRUZfQ0xPQ0tfQ1JUTAk9IDB4MUEwLAogfTsKIAogZW51bSBjaGlwX3JlZ2lzdGVyX2JpdHMgewogCVBIWV9NSU5fU1BQX1BIWVNfTElOS19SQVRFX01BU0sgPSAoMHg3IDw8IDgpLAotCVBIWV9NQVhfU1BQX1BIWVNfTElOS19SQVRFX01BU0sgPSAoMHg3IDw8IDgpLAotCVBIWV9ORUdfU1BQX1BIWVNfTElOS19SQVRFX01BU0tfT0ZGU0VUID0gKDEyKSwKKwlQSFlfTUFYX1NQUF9QSFlTX0xJTktfUkFURV9NQVNLID0gKDB4NyA8PCAxMiksCisJUEhZX05FR19TUFBfUEhZU19MSU5LX1JBVEVfTUFTS19PRkZTRVQgPSAoMTYpLAogCVBIWV9ORUdfU1BQX1BIWVNfTElOS19SQVRFX01BU0sgPQogCQkJKDB4MyA8PCBQSFlfTkVHX1NQUF9QSFlTX0xJTktfUkFURV9NQVNLX09GRlNFVCksCiB9OwpAQCAtMTY5LDIyICsxODEsNzUgQEAKIAlJUlFfUENJRV9FUlIgICAgICAgICAgICAgICAgICAgPSAoMSA8PCAzMSksCiB9OwogCit1bmlvbiByZWdfcGh5X2NmZyB7CisJdTMyIHY7CisJc3RydWN0IHsKKwkJdTMyIHBoeV9yZXNldDoxOworCQl1MzIgc2FzX3N1cHBvcnQ6MTsKKwkJdTMyIHNhdGFfc3VwcG9ydDoxOworCQl1MzIgc2F0YV9ob3N0X21vZGU6MTsKKwkJLyoKKwkJICogYml0IDI6IDZHYnBzIHN1cHBvcnQKKwkJICogYml0IDE6IDNHYnBzIHN1cHBvcnQKKwkJICogYml0IDA6IDEuNUdicHMgc3VwcG9ydAorCQkgKi8KKwkJdTMyIHNwZWVkX3N1cHBvcnQ6MzsKKwkJdTMyIHNud18zX3N1cHBvcnQ6MTsKKwkJdTMyIHR4X2xua19wYXJpdHk6MTsKKwkJLyoKKwkJICogYml0IDU6IEcxICgxLjVHYnBzKSBXaXRob3V0IFNTQworCQkgKiBiaXQgNDogRzEgKDEuNUdicHMpIHdpdGggU1NDCisJCSAqIGJpdCAzOiBHMiAoMy4wR2JwcykgV2l0aG91dCBTU0MKKwkJICogYml0IDI6IEcyICgzLjBHYnBzKSB3aXRoIFNTQworCQkgKiBiaXQgMTogRzMgKDYuMEdicHMpIHdpdGhvdXQgU1NDCisJCSAqIGJpdCAwOiBHMyAoNi4wR2Jwcykgd2l0aCBTU0MKKwkJICovCisJCXUzMiB0eF9zcHRfcGhzX2xua19yYXRlOjY7CisJCS8qIDhoOiAxLjVHYnBzIDloOiAzR2JwcyBBaDogNkdicHMgKi8KKwkJdTMyIHR4X2xnY2xfbG5rX3JhdGU6NDsKKwkJdTMyIHR4X3NzY190eXBlOjE7CisJCXUzMiBzYXRhX3NwaW5fdXBfc3B0OjE7CisJCXUzMiBzYXRhX3NwaW5fdXBfZW46MTsKKwkJdTMyIGJ5cGFzc19vb2I6MTsKKwkJdTMyIGRpc2FibGVfcGh5OjE7CisJCXUzMiByc3ZkOjg7CisJfSB1OworfTsKKwogI2RlZmluZSBNQVhfU0dfRU5UUlkJCTI1NQogCiBzdHJ1Y3QgbXZzX3ByZF9pbXQgeworI2lmbmRlZiBfX0JJR19FTkRJQU4KIAlfX2xlMzIJCQlsZW46MjI7CiAJdTgJCQlfcl9hOjI7CiAJdTgJCQltaXNjX2N0bDo0OwogCXU4CQkJaW50ZXJfc2VsOjQ7CisjZWxzZQorCXUzMgkJCWludGVyX3NlbDo0OworCXUzMgkJCW1pc2NfY3RsOjQ7CisJdTMyCQkJX3JfYToyOworCXUzMgkJCWxlbjoyMjsKKyNlbmRpZgogfTsKIAogc3RydWN0IG12c19wcmQgewogCS8qIDY0LWJpdCBidWZmZXIgYWRkcmVzcyAqLwogCV9fbGU2NAkJCWFkZHI7CiAJLyogMjItYml0IGxlbmd0aCAqLwotCXN0cnVjdCBtdnNfcHJkX2ltdAlpbV9sZW47CisJX19sZTMyCQkJaW1fbGVuOwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAKKy8qCisgKiB0aGVzZSByZWdpc3RlcnMgYXJlIGFjY2Vzc2VkIHRocm91Z2ggcG9ydCB2ZW5kb3IKKyAqIHNwZWNpZmljIGFkZHJlc3MvZGF0YSByZWdpc3RlcnMKKyAqLworZW51bSBzYXNfc2F0YV9waHlfcmVncyB7CisJR0VORVJBVElPTl8xX1NFVFRJTkcJCT0gMHgxMTgsCisJR0VORVJBVElPTl8xXzJfU0VUVElORwkJPSAweDExQywKKwlHRU5FUkFUSU9OXzJfM19TRVRUSU5HCQk9IDB4MTIwLAorCUdFTkVSQVRJT05fM180X1NFVFRJTkcJCT0gMHgxMjQsCit9OworCiAjZGVmaW5lIFNQSV9DVFJMX1JFR185NFhYICAgICAgICAgICAJMHhjODAwCiAjZGVmaW5lIFNQSV9BRERSX1JFR185NFhYICAgICAgICAgICAgCTB4YzgwNAogI2RlZmluZSBTUElfV1JfREFUQV9SRUdfOTRYWCAgICAgICAgIDB4YzgwOApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL212c2FzL212X2NoaXBzLmggYi9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfY2hpcHMuaAppbmRleCAxNzUzYTZmLi5iY2M0MDgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfY2hpcHMuaAorKysgYi9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfY2hpcHMuaApAQCAtMTY0LDcgKzE2NCw2IEBACiB7CiAJdTMyIHRtcDsKIAotCS8qIHdvcmthcm91bmQgZm9yIFNBVEEgUi1FUlIsIHRvIGlnbm9yZSBwaHkgZ2xpdGNoICovCiAJdG1wID0gbXZzX2NyMzIobXZpLCBDTURfUEhZX1RJTUVSKTsKIAl0bXAgJj0gfigxIDw8IDkpOwogCXRtcCB8PSAoMSA8PCAxMCk7CkBAIC0xNzksMjMgKzE3OCwxMCBAQAogCXRtcCB8PSAweDNmZmY7CiAJbXZzX2N3MzIobXZpLCBDTURfU0FTX0NUTDAsIHRtcCk7CiAKLQkvKiB3b3JrYXJvdW5kIGZvciBXRFRJTUVPVVQgLCBzZXQgdG8gNTUwIG1zICovCiAJbXZzX2N3MzIobXZpLCBDTURfV0RfVElNRVIsIDB4N2EwMDAwKTsKIAogCS8qIG5vdCB0byBoYWx0IGZvciBkaWZmZXJlbnQgcG9ydCBvcCBkdXJpbmcgd2lkZXBvcnQgbGluayBjaGFuZ2UgKi8KIAltdnNfY3czMihtdmksIENNRF9BUFBfRVJSX0NPTkZJRywgMHhmZmVmYmY3ZCk7Ci0KLQkvKiB3b3JrYXJvdW5kIGZvciBTZWFnYXRlIGRpc2sgbm90LWZvdW5kIE9PQiBzZXF1ZW5jZSwgcmVjdgotCSAqIENPTUlOSVQgYmVmb3JlIHNlbmRpbmcgb3V0IENPTVdBS0UgKi8KLQl0bXAgPSBtdnNfY3IzMihtdmksIENNRF9QSFlfTU9ERV8yMSk7Ci0JdG1wICY9IDB4MDAwMGZmZmY7Ci0JdG1wIHw9IDB4MDBmYTAwMDA7Ci0JbXZzX2N3MzIobXZpLCBDTURfUEhZX01PREVfMjEsIHRtcCk7Ci0KLQl0bXAgPSBtdnNfY3IzMihtdmksIENNRF9QSFlfVElNRVIpOwotCXRtcCAmPSAweDFmZmZmZmZmOwotCXRtcCB8PSAoMlUgPDwgMjkpOwkvKiA4IG1zIHJldHJ5ICovCi0JbXZzX2N3MzIobXZpLCBDTURfUEhZX1RJTUVSLCB0bXApOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbXZzX2ludF9zYXRhKHN0cnVjdCBtdnNfaW5mbyAqbXZpKQpAQCAtMjIzLDYgKzIwOSw5IEBACiAJCQltdnNfaW50X3BvcnQobXZpLCBpLCB0bXApOwogCX0KIAorCWlmIChzdGF0ICYgQ0lOVF9OT05fU1BFQ19OQ1FfRVJST1IpCisJCU1WU19DSElQX0RJU1AtPm5vbl9zcGVjX25jcV9lcnJvcihtdmkpOworCiAJaWYgKHN0YXQgJiBDSU5UX1NSUykKIAkJbXZzX2ludF9zYXRhKG12aSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl9kZWZzLmggYi9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfZGVmcy5oCmluZGV4IGJjMDBjOTQuLmRlYzdjYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl9kZWZzLmgKKysrIGIvZHJpdmVycy9zY3NpL212c2FzL212X2RlZnMuaApAQCAtNDMsNyArNDMsNiBAQAogCiAvKiBkcml2ZXIgY29tcGlsZS10aW1lIGNvbmZpZ3VyYXRpb24gKi8KIGVudW0gZHJpdmVyX2NvbmZpZ3VyYXRpb24gewotCU1WU19TTE9UUwkJPSA1MTIsCS8qIGNvbW1hbmQgc2xvdHMgKi8KIAlNVlNfVFhfUklOR19TWgkJPSAxMDI0LAkvKiBUWCByaW5nIHNpemUgKDEyLWJpdCkgKi8KIAlNVlNfUlhfUklOR19TWgkJPSAxMDI0LCAvKiBSWCByaW5nIHNpemUgKDEyLWJpdCkgKi8KIAkJCQkJLyogc29mdHdhcmUgcmVxdWlyZXMgcG93ZXItb2YtMgpAQCAtNTYsOCArNTUsNyBAQAogCU1WU19TU1BfQ01EX1NaCQk9IDY0LAkvKiBTU1AgY29tbWFuZCB0YWJsZSBidWZmZXIgc2l6ZSAqLwogCU1WU19BVEFfQ01EX1NaCQk9IDk2LAkvKiBTQVRBIGNvbW1hbmQgdGFibGUgYnVmZmVyIHNpemUgKi8KIAlNVlNfT0FGX1NaCQk9IDY0LAkvKiBPcGVuIGFkZHJlc3MgZnJhbWUgYnVmZmVyIHNpemUgKi8KLQlNVlNfUVVFVUVfU0laRQk9IDMyLAkvKiBTdXBwb3J0IFF1ZXVlIGRlcHRoICovCi0JTVZTX0NBTl9RVUVVRQkJPSBNVlNfU0xPVFMgLSAyLAkvKiBTQ1NJIFF1ZXVlIGRlcHRoICovCisJTVZTX1FVRVVFX1NJWkUJCT0gNjQsCS8qIFN1cHBvcnQgUXVldWUgZGVwdGggKi8KIAlNVlNfU09DX0NBTl9RVUVVRQk9IE1WU19TT0NfU0xPVFMgLSAyLAogfTsKIApAQCAtMTQ0LDYgKzE0Miw3IEBACiAJQ0lOVF9ETUFfUENJRQkJPSAoMVUgPDwgMjcpLAkvKiBETUEgdG8gUENJRSB0aW1lb3V0ICovCiAJQ0lOVF9NRU0JCT0gKDFVIDw8IDI2KSwJLyogaW50IG1lbSBwYXJpdHkgZXJyICovCiAJQ0lOVF9JMkNfU0xBVkUJCT0gKDFVIDw8IDI1KSwJLyogc2xhdmUgSTJDIGV2ZW50ICovCisJQ0lOVF9OT05fU1BFQ19OQ1FfRVJST1IJPSAoMVUgPDwgMjUpLAkvKiBOb24gc3BlY2lmaWMgTkNRIGVycm9yICovCiAJQ0lOVF9TUlMJCT0gKDFVIDw8IDMpLAkvKiBTUlMgZXZlbnQgKi8KIAlDSU5UX0NJX1NUT1AJCT0gKDFVIDw8IDEpLAkvKiBjbWQgaXNzdWUgc3RvcHBlZCAqLwogCUNJTlRfRE9ORQkJPSAoMVUgPDwgMCksCS8qIGNtZCBjb21wbGV0aW9uICovCkBAIC0xNjEsNyArMTYwLDcgQEAKIAlUWFFfQ01EX1NTUAkJPSAxLAkJLyogU1NQIHByb3RvY29sICovCiAJVFhRX0NNRF9TTVAJCT0gMiwJCS8qIFNNUCBwcm90b2NvbCAqLwogCVRYUV9DTURfU1RQCQk9IDMsCQkvKiBTVFAvU0FUQSBwcm90b2NvbCAqLwotCVRYUV9DTURfU1NQX0ZSRUVfTElTVAk9IDQsCQkvKiBhZGQgdG8gU1NQIHRhcmcgZnJlZSBsaXN0ICovCisJVFhRX0NNRF9TU1BfRlJFRV9MSVNUCT0gNCwJCS8qIGFkZCB0byBTU1AgdGFyZ2V0IGZyZWUgbGlzdCAqLwogCVRYUV9DTURfU0xPVF9SRVNFVAk9IDcsCQkvKiByZXNldCBjb21tYW5kIHNsb3QgKi8KIAlUWFFfTU9ERV9JCQk9ICgxVSA8PCAyOCksCS8qIG1vZGU6IDA9dGFyZ2V0LDE9aW5pdGlhdG9yICovCiAJVFhRX01PREVfVEFSR0VUIAk9IDAsCkBAIC0zOTEsMTUgKzM5MCwxNSBAQAogfTsKIAogZW51bSBtdnNfaW5mb19mbGFncyB7Ci0JTVZGX01TSQkJPSAoMVUgPDwgMCksCS8qIE1TSSBpcyBlbmFibGVkICovCiAJTVZGX1BIWV9QV1JfRklYCT0gKDFVIDw8IDEpLAkvKiBidWcgd29ya2Fyb3VuZCAqLwogCU1WRl9GTEFHX1NPQwkJPSAoMVUgPDwgMiksCS8qIFNvQyBpbnRlZ3JhdGVkIGNvbnRyb2xsZXJzICovCiB9OwogCiBlbnVtIG12c19ldmVudF9mbGFncyB7Ci0JUEhZX1BMVUdfRVZFTlQJPSAoM1UpLAorCVBIWV9QTFVHX0VWRU5UCQk9ICgzVSksCiAJUEhZX1BMVUdfSU4JCT0gKDFVIDw8IDApLAkvKiBwaHkgcGx1ZyBpbiAqLwogCVBIWV9QTFVHX09VVAkJPSAoMVUgPDwgMSksCS8qIHBoeSBwbHVnIG91dCAqLworCUVYUF9CUkNUX0NIRwkJPSAoMVUgPDwgMiksCS8qIGJyb2FkY2FzdCBjaGFuZ2UgKi8KIH07CiAKIGVudW0gbXZzX3BvcnRfdHlwZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfaW5pdC5jIGIvZHJpdmVycy9zY3NpL212c2FzL212X2luaXQuYwppbmRleCA5MGI2MzY2Li40ZTlhZjY2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfaW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl9pbml0LmMKQEAgLTM0LDIyICszNCwyNSBAQAogCSJcdFRoZSBtdnNhcyBTQVMgTExERCBzdXBwb3J0cyBib3RoIG1vZGVzLlxuIgogCSJcdERlZmF1bHQ6IDEgKERpcmVjdCBNb2RlKS5cbiIpOwogCitpbnQgaW50ZXJydXB0X2NvYWxlc2NpbmcgPSAweDgwOworCiBzdGF0aWMgc3RydWN0IHNjc2lfdHJhbnNwb3J0X3RlbXBsYXRlICptdnNfc3R0Owogc3RydWN0IGttZW1fY2FjaGUgKm12c190YXNrX2xpc3RfY2FjaGU7CiBzdGF0aWMgY29uc3Qgc3RydWN0IG12c19jaGlwX2luZm8gbXZzX2NoaXBzW10gPSB7Ci0JW2NoaXBfNjMyMF0gPQl7IDEsIDIsIDB4NDAwLCAxNywgMTYsICA5LCAmbXZzXzY0eHhfZGlzcGF0Y2gsIH0sCi0JW2NoaXBfNjQ0MF0gPQl7IDEsIDQsIDB4NDAwLCAxNywgMTYsICA5LCAmbXZzXzY0eHhfZGlzcGF0Y2gsIH0sCi0JW2NoaXBfNjQ4NV0gPQl7IDEsIDgsIDB4ODAwLCAzMywgMzIsIDEwLCAmbXZzXzY0eHhfZGlzcGF0Y2gsIH0sCi0JW2NoaXBfOTE4MF0gPQl7IDIsIDQsIDB4ODAwLCAxNywgNjQsICA5LCAmbXZzXzk0eHhfZGlzcGF0Y2gsIH0sCi0JW2NoaXBfOTQ4MF0gPQl7IDIsIDQsIDB4ODAwLCAxNywgNjQsICA5LCAmbXZzXzk0eHhfZGlzcGF0Y2gsIH0sCi0JW2NoaXBfOTQ0NV0gPQl7IDEsIDQsIDB4ODAwLCAxNywgNjQsIDExLCAmbXZzXzk0eHhfZGlzcGF0Y2gsIH0sCi0JW2NoaXBfOTQ4NV0gPQl7IDIsIDQsIDB4ODAwLCAxNywgNjQsIDExLCAmbXZzXzk0eHhfZGlzcGF0Y2gsIH0sCi0JW2NoaXBfMTMwMF0gPQl7IDEsIDQsIDB4NDAwLCAxNywgMTYsICA5LCAmbXZzXzY0eHhfZGlzcGF0Y2gsIH0sCi0JW2NoaXBfMTMyMF0gPQl7IDIsIDQsIDB4ODAwLCAxNywgNjQsICA5LCAmbXZzXzk0eHhfZGlzcGF0Y2gsIH0sCisJW2NoaXBfNjMyMF0gPQl7IDEsIDIsIDB4NDAwLCAxNywgMTYsIDYsICA5LCAmbXZzXzY0eHhfZGlzcGF0Y2gsIH0sCisJW2NoaXBfNjQ0MF0gPQl7IDEsIDQsIDB4NDAwLCAxNywgMTYsIDYsICA5LCAmbXZzXzY0eHhfZGlzcGF0Y2gsIH0sCisJW2NoaXBfNjQ4NV0gPQl7IDEsIDgsIDB4ODAwLCAzMywgMzIsIDYsIDEwLCAmbXZzXzY0eHhfZGlzcGF0Y2gsIH0sCisJW2NoaXBfOTE4MF0gPQl7IDIsIDQsIDB4ODAwLCAxNywgNjQsIDgsICA5LCAmbXZzXzk0eHhfZGlzcGF0Y2gsIH0sCisJW2NoaXBfOTQ4MF0gPQl7IDIsIDQsIDB4ODAwLCAxNywgNjQsIDgsICA5LCAmbXZzXzk0eHhfZGlzcGF0Y2gsIH0sCisJW2NoaXBfOTQ0NV0gPQl7IDEsIDQsIDB4ODAwLCAxNywgNjQsIDgsIDExLCAmbXZzXzk0eHhfZGlzcGF0Y2gsIH0sCisJW2NoaXBfOTQ4NV0gPQl7IDIsIDQsIDB4ODAwLCAxNywgNjQsIDgsIDExLCAmbXZzXzk0eHhfZGlzcGF0Y2gsIH0sCisJW2NoaXBfMTMwMF0gPQl7IDEsIDQsIDB4NDAwLCAxNywgMTYsIDYsICA5LCAmbXZzXzY0eHhfZGlzcGF0Y2gsIH0sCisJW2NoaXBfMTMyMF0gPQl7IDIsIDQsIDB4ODAwLCAxNywgNjQsIDgsICA5LCAmbXZzXzk0eHhfZGlzcGF0Y2gsIH0sCiB9OwogCitzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqbXZzdF9ob3N0X2F0dHJzW107CisKICNkZWZpbmUgU09DX1NBU19OVU0gMgotI2RlZmluZSBTR19NWCA2NAogCiBzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBtdnNfc2h0ID0gewogCS5tb2R1bGUJCQk9IFRISVNfTU9EVUxFLApAQCAtNjYsNyArNjksNyBAQAogCS5jYW5fcXVldWUJCT0gMSwKIAkuY21kX3Blcl9sdW4JCT0gMSwKIAkudGhpc19pZAkJPSAtMSwKLQkuc2dfdGFibGVzaXplCQk9IFNHX01YLAorCS5zZ190YWJsZXNpemUJCT0gU0dfQUxMLAogCS5tYXhfc2VjdG9ycwkJPSBTQ1NJX0RFRkFVTFRfTUFYX1NFQ1RPUlMsCiAJLnVzZV9jbHVzdGVyaW5nCQk9IEVOQUJMRV9DTFVTVEVSSU5HLAogCS5laF9kZXZpY2VfcmVzZXRfaGFuZGxlciA9IHNhc19laF9kZXZpY2VfcmVzZXRfaGFuZGxlciwKQEAgLTc0LDYgKzc3LDcgQEAKIAkuc2xhdmVfYWxsb2MJCT0gbXZzX3NsYXZlX2FsbG9jLAogCS50YXJnZXRfZGVzdHJveQkJPSBzYXNfdGFyZ2V0X2Rlc3Ryb3ksCiAJLmlvY3RsCQkJPSBzYXNfaW9jdGwsCisJLnNob3N0X2F0dHJzCQk9IG12c3RfaG9zdF9hdHRycywKIH07CiAKIHN0YXRpYyBzdHJ1Y3Qgc2FzX2RvbWFpbl9mdW5jdGlvbl90ZW1wbGF0ZSBtdnNfdHJhbnNwb3J0X29wcyA9IHsKQEAgLTEwMCw2ICsxMDQsNyBAQAogCXN0cnVjdCBhc2Rfc2FzX3BoeSAqc2FzX3BoeSA9ICZwaHktPnNhc19waHk7CiAKIAlwaHktPm12aSA9IG12aTsKKwlwaHktPnBvcnQgPSBOVUxMOwogCWluaXRfdGltZXIoJnBoeS0+dGltZXIpOwogCXNhc19waHktPmVuYWJsZWQgPSAocGh5X2lkIDwgbXZpLT5jaGlwLT5uX3BoeSkgPyAxIDogMDsKIAlzYXNfcGh5LT5jbGFzcyA9IFNBUzsKQEAgLTEyOCw3ICsxMzMsNyBAQAogCWlmIChtdmktPmZsYWdzICYgTVZGX0ZMQUdfU09DKQogCQlzbG90X25yID0gTVZTX1NPQ19TTE9UUzsKIAllbHNlCi0JCXNsb3RfbnIgPSBNVlNfU0xPVFM7CisJCXNsb3RfbnIgPSBNVlNfQ0hJUF9TTE9UX1NaOwogCiAJaWYgKG12aS0+ZG1hX3Bvb2wpCiAJCXBjaV9wb29sX2Rlc3Ryb3kobXZpLT5kbWFfcG9vbCk7CkBAIC0xNDgsMjUgKzE1MywyNiBAQAogCQlkbWFfZnJlZV9jb2hlcmVudChtdmktPmRldiwKIAkJCQkgIHNpemVvZigqbXZpLT5zbG90KSAqIHNsb3RfbnIsCiAJCQkJICBtdmktPnNsb3QsIG12aS0+c2xvdF9kbWEpOwotI2lmbmRlZiBESVNBQkxFX0hPVFBMVUdfRE1BX0ZJWAorCiAJaWYgKG12aS0+YnVsa19idWZmZXIpCiAJCWRtYV9mcmVlX2NvaGVyZW50KG12aS0+ZGV2LCBUUkFTSF9CVUNLRVRfU0laRSwKIAkJCQkgIG12aS0+YnVsa19idWZmZXIsIG12aS0+YnVsa19idWZmZXJfZG1hKTsKLSNlbmRpZgorCWlmIChtdmktPmJ1bGtfYnVmZmVyMSkKKwkJZG1hX2ZyZWVfY29oZXJlbnQobXZpLT5kZXYsIFRSQVNIX0JVQ0tFVF9TSVpFLAorCQkJCSAgbXZpLT5idWxrX2J1ZmZlcjEsIG12aS0+YnVsa19idWZmZXJfZG1hMSk7CiAKIAlNVlNfQ0hJUF9ESVNQLT5jaGlwX2lvdW5tYXAobXZpKTsKIAlpZiAobXZpLT5zaG9zdCkKIAkJc2NzaV9ob3N0X3B1dChtdmktPnNob3N0KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KG13cSwgJm12aS0+d3FfbGlzdCwgZW50cnkpCiAJCWNhbmNlbF9kZWxheWVkX3dvcmsoJm13cS0+d29ya19xKTsKKwlrZnJlZShtdmktPnRhZ3MpOwogCWtmcmVlKG12aSk7CiB9CiAKLSNpZmRlZiBNVlNfVVNFX1RBU0tMRVQKLXN0cnVjdCB0YXNrbGV0X3N0cnVjdAltdl90YXNrbGV0OworI2lmZGVmIENPTkZJR19TQ1NJX01WU0FTX1RBU0tMRVQKIHN0YXRpYyB2b2lkIG12c190YXNrbGV0KHVuc2lnbmVkIGxvbmcgb3BhcXVlKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTMyIHN0YXQ7CiAJdTE2IGNvcmVfbnIsIGkgPSAwOwogCkBAIC0xNzksMzUgKzE4NSw0OSBAQAogCWlmICh1bmxpa2VseSghbXZpKSkKIAkJQlVHX09OKDEpOwogCisJc3RhdCA9IE1WU19DSElQX0RJU1AtPmlzcl9zdGF0dXMobXZpLCBtdmktPnBkZXYtPmlycSk7CisJaWYgKCFzdGF0KQorCQlnb3RvIG91dDsKKwogCWZvciAoaSA9IDA7IGkgPCBjb3JlX25yOyBpKyspIHsKIAkJbXZpID0gKChzdHJ1Y3QgbXZzX3Bydl9pbmZvICopc2hhLT5sbGRkX2hhKS0+bXZpW2ldOwotCQlzdGF0ID0gTVZTX0NISVBfRElTUC0+aXNyX3N0YXR1cyhtdmksIG12aS0+aXJxKTsKLQkJaWYgKHN0YXQpCi0JCQlNVlNfQ0hJUF9ESVNQLT5pc3IobXZpLCBtdmktPmlycSwgc3RhdCk7CisJCU1WU19DSElQX0RJU1AtPmlzcihtdmksIG12aS0+cGRldi0+aXJxLCBzdGF0KTsKIAl9CitvdXQ6CisJTVZTX0NISVBfRElTUC0+aW50ZXJydXB0X2VuYWJsZShtdmkpOwogCiB9CiAjZW5kaWYKIAogc3RhdGljIGlycXJldHVybl90IG12c19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqb3BhcXVlKQogewotCXUzMiBjb3JlX25yLCBpID0gMDsKKwl1MzIgY29yZV9ucjsKIAl1MzIgc3RhdDsKIAlzdHJ1Y3QgbXZzX2luZm8gKm12aTsKIAlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2hhID0gb3BhcXVlOworI2lmbmRlZiBDT05GSUdfU0NTSV9NVlNBU19UQVNLTEVUCisJdTMyIGk7CisjZW5kaWYKIAogCWNvcmVfbnIgPSAoKHN0cnVjdCBtdnNfcHJ2X2luZm8gKilzaGEtPmxsZGRfaGEpLT5uX2hvc3Q7CiAJbXZpID0gKChzdHJ1Y3QgbXZzX3Bydl9pbmZvICopc2hhLT5sbGRkX2hhKS0+bXZpWzBdOwogCiAJaWYgKHVubGlrZWx5KCFtdmkpKQogCQlyZXR1cm4gSVJRX05PTkU7CisjaWZkZWYgQ09ORklHX1NDU0lfTVZTQVNfVEFTS0xFVAorCU1WU19DSElQX0RJU1AtPmludGVycnVwdF9kaXNhYmxlKG12aSk7CisjZW5kaWYKIAogCXN0YXQgPSBNVlNfQ0hJUF9ESVNQLT5pc3Jfc3RhdHVzKG12aSwgaXJxKTsKLQlpZiAoIXN0YXQpCisJaWYgKCFzdGF0KSB7CisJI2lmZGVmIENPTkZJR19TQ1NJX01WU0FTX1RBU0tMRVQKKwkJTVZTX0NISVBfRElTUC0+aW50ZXJydXB0X2VuYWJsZShtdmkpOworCSNlbmRpZgogCQlyZXR1cm4gSVJRX05PTkU7CisJfQogCi0jaWZkZWYgTVZTX1VTRV9UQVNLTEVUCi0JdGFza2xldF9zY2hlZHVsZSgmbXZfdGFza2xldCk7CisjaWZkZWYgQ09ORklHX1NDU0lfTVZTQVNfVEFTS0xFVAorCXRhc2tsZXRfc2NoZWR1bGUoJigoc3RydWN0IG12c19wcnZfaW5mbyAqKXNoYS0+bGxkZF9oYSktPm12X3Rhc2tsZXQpOwogI2Vsc2UKIAlmb3IgKGkgPSAwOyBpIDwgY29yZV9ucjsgaSsrKSB7CiAJCW12aSA9ICgoc3RydWN0IG12c19wcnZfaW5mbyAqKXNoYS0+bGxkZF9oYSktPm12aVtpXTsKQEAgLTIyNSw3ICsyNDUsNyBAQAogCWlmIChtdmktPmZsYWdzICYgTVZGX0ZMQUdfU09DKQogCQlzbG90X25yID0gTVZTX1NPQ19TTE9UUzsKIAllbHNlCi0JCXNsb3RfbnIgPSBNVlNfU0xPVFM7CisJCXNsb3RfbnIgPSBNVlNfQ0hJUF9TTE9UX1NaOwogCiAJc3Bpbl9sb2NrX2luaXQoJm12aS0+bG9jayk7CiAJZm9yIChpID0gMDsgaSA8IG12aS0+Y2hpcC0+bl9waHk7IGkrKykgewpAQCAtMjczLDEzICsyOTMsMTggQEAKIAkJZ290byBlcnJfb3V0OwogCW1lbXNldChtdmktPnNsb3QsIDAsIHNpemVvZigqbXZpLT5zbG90KSAqIHNsb3RfbnIpOwogCi0jaWZuZGVmIERJU0FCTEVfSE9UUExVR19ETUFfRklYCiAJbXZpLT5idWxrX2J1ZmZlciA9IGRtYV9hbGxvY19jb2hlcmVudChtdmktPmRldiwKIAkJCQkgICAgICAgVFJBU0hfQlVDS0VUX1NJWkUsCiAJCQkJICAgICAgICZtdmktPmJ1bGtfYnVmZmVyX2RtYSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtdmktPmJ1bGtfYnVmZmVyKQogCQlnb3RvIGVycl9vdXQ7Ci0jZW5kaWYKKworCW12aS0+YnVsa19idWZmZXIxID0gZG1hX2FsbG9jX2NvaGVyZW50KG12aS0+ZGV2LAorCQkJCSAgICAgICBUUkFTSF9CVUNLRVRfU0laRSwKKwkJCQkgICAgICAgJm12aS0+YnVsa19idWZmZXJfZG1hMSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtdmktPmJ1bGtfYnVmZmVyMSkKKwkJZ290byBlcnJfb3V0OworCiAJc3ByaW50Zihwb29sX25hbWUsICIlcyVkIiwgIm12c19kbWFfcG9vbCIsIG12aS0+aWQpOwogCW12aS0+ZG1hX3Bvb2wgPSBwY2lfcG9vbF9jcmVhdGUocG9vbF9uYW1lLCBtdmktPnBkZXYsIE1WU19TTE9UX0JVRl9TWiwgMTYsIDApOwogCWlmICghbXZpLT5kbWFfcG9vbCkgewpAQCAtMzU0LDExICszNzksMTIgQEAKIAkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50LAogCQkJCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0LCB1bnNpZ25lZCBpbnQgaWQpCiB7Ci0Jc3RydWN0IG12c19pbmZvICptdmk7CisJc3RydWN0IG12c19pbmZvICptdmkgPSBOVUxMOwogCXN0cnVjdCBzYXNfaGFfc3RydWN0ICpzaGEgPSBTSE9TVF9UT19TQVNfSEEoc2hvc3QpOwogCi0JbXZpID0ga3phbGxvYyhzaXplb2YoKm12aSkgKyBNVlNfU0xPVFMgKiBzaXplb2Yoc3RydWN0IG12c19zbG90X2luZm8pLAotCQkJR0ZQX0tFUk5FTCk7CisJbXZpID0ga3phbGxvYyhzaXplb2YoKm12aSkgKworCQkoMUwgPDwgbXZzX2NoaXBzW2VudC0+ZHJpdmVyX2RhdGFdLnNsb3Rfd2lkdGgpICoKKwkJc2l6ZW9mKHN0cnVjdCBtdnNfc2xvdF9pbmZvKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtdmkpCiAJCXJldHVybiBOVUxMOwogCkBAIC0zNjcsNyArMzkzLDYgQEAKIAltdmktPmNoaXBfaWQgPSBlbnQtPmRyaXZlcl9kYXRhOwogCW12aS0+Y2hpcCA9ICZtdnNfY2hpcHNbbXZpLT5jaGlwX2lkXTsKIAlJTklUX0xJU1RfSEVBRCgmbXZpLT53cV9saXN0KTsKLQltdmktPmlycSA9IHBkZXYtPmlycTsKIAogCSgoc3RydWN0IG12c19wcnZfaW5mbyAqKXNoYS0+bGxkZF9oYSktPm12aVtpZF0gPSBtdmk7CiAJKChzdHJ1Y3QgbXZzX3Bydl9pbmZvICopc2hhLT5sbGRkX2hhKS0+bl9waHkgPSBtdmktPmNoaXAtPm5fcGh5OwpAQCAtMzc1LDkgKzQwMCwxMCBAQAogCW12aS0+aWQgPSBpZDsKIAltdmktPnNhcyA9IHNoYTsKIAltdmktPnNob3N0ID0gc2hvc3Q7Ci0jaWZkZWYgTVZTX1VTRV9UQVNLTEVUCi0JdGFza2xldF9pbml0KCZtdl90YXNrbGV0LCBtdnNfdGFza2xldCwgKHVuc2lnbmVkIGxvbmcpc2hhKTsKLSNlbmRpZgorCisJbXZpLT50YWdzID0ga3phbGxvYyhNVlNfQ0hJUF9TTE9UX1NaPj4zLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW12aS0+dGFncykKKwkJZ290byBlcnJfb3V0OwogCiAJaWYgKE1WU19DSElQX0RJU1AtPmNoaXBfaW9yZW1hcChtdmkpKQogCQlnb3RvIGVycl9vdXQ7CkBAIC0zODgsNyArNDE0LDYgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotLyogbW92ZSB0byBQQ0kgbGF5ZXIgb3IgbGliYXRhIGNvcmU/ICovCiBzdGF0aWMgaW50IHBjaV9nb182NChzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKIAlpbnQgcmM7CkBAIC00NTAsNyArNDc1LDcgQEAKIAkoKHN0cnVjdCBtdnNfcHJ2X2luZm8gKilzaGEtPmxsZGRfaGEpLT5uX2hvc3QgPSBjb3JlX25yOwogCiAJc2hvc3QtPnRyYW5zcG9ydHQgPSBtdnNfc3R0OwotCXNob3N0LT5tYXhfaWQgPSAxMjg7CisJc2hvc3QtPm1heF9pZCA9IE1WU19NQVhfREVWSUNFUzsKIAlzaG9zdC0+bWF4X2x1biA9IH4wOwogCXNob3N0LT5tYXhfY2hhbm5lbCA9IDE7CiAJc2hvc3QtPm1heF9jbWRfbGVuID0gMTY7CkBAIC00OTMsMTEgKzUxOCwxMiBAQAogCWlmIChtdmktPmZsYWdzICYgTVZGX0ZMQUdfU09DKQogCQljYW5fcXVldWUgPSBNVlNfU09DX0NBTl9RVUVVRTsKIAllbHNlCi0JCWNhbl9xdWV1ZSA9IE1WU19DQU5fUVVFVUU7CisJCWNhbl9xdWV1ZSA9IE1WU19DSElQX1NMT1RfU1o7CiAKIAlzaGEtPmxsZGRfcXVldWVfc2l6ZSA9IGNhbl9xdWV1ZTsKKwlzaG9zdC0+c2dfdGFibGVzaXplID0gbWluX3QodTE2LCBTR19BTEwsIE1WU19NQVhfU0cpOwogCXNob3N0LT5jYW5fcXVldWUgPSBjYW5fcXVldWU7Ci0JbXZpLT5zaG9zdC0+Y21kX3Blcl9sdW4gPSBNVlNfU0xPVFMvc2hhLT5udW1fcGh5czsKKwltdmktPnNob3N0LT5jbWRfcGVyX2x1biA9IE1WU19RVUVVRV9TSVpFOwogCXNoYS0+Y29yZS5zaG9zdCA9IG12aS0+c2hvc3Q7CiB9CiAKQEAgLTUxOCw2ICs1NDQsNyBAQAogewogCXVuc2lnbmVkIGludCByYywgbmhvc3QgPSAwOwogCXN0cnVjdCBtdnNfaW5mbyAqbXZpOworCXN0cnVjdCBtdnNfcHJ2X2luZm8gKm1waTsKIAlpcnFfaGFuZGxlcl90IGlycV9oYW5kbGVyID0gbXZzX2ludGVycnVwdDsKIAlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IE5VTEw7CiAJY29uc3Qgc3RydWN0IG12c19jaGlwX2luZm8gKmNoaXA7CkBAIC01NjksNiArNTk2LDkgQEAKIAkJCWdvdG8gZXJyX291dF9yZWdpb25zOwogCQl9CiAKKwkJbWVtc2V0KCZtdmktPmhiYV9pbmZvX3BhcmFtLCAweEZGLAorCQkJc2l6ZW9mKHN0cnVjdCBoYmFfaW5mb19wYWdlKSk7CisKIAkJbXZzX2luaXRfc2FzX2FkZChtdmkpOwogCiAJCW12aS0+aW5zdGFuY2UgPSBuaG9zdDsKQEAgLTU3OSw4ICs2MDksOSBAQAogCQl9CiAJCW5ob3N0Kys7CiAJfSB3aGlsZSAobmhvc3QgPCBjaGlwLT5uX2hvc3QpOwotI2lmZGVmIE1WU19VU0VfVEFTS0xFVAotCXRhc2tsZXRfaW5pdCgmbXZfdGFza2xldCwgbXZzX3Rhc2tsZXQsCisJbXBpID0gKHN0cnVjdCBtdnNfcHJ2X2luZm8gKikoU0hPU1RfVE9fU0FTX0hBKHNob3N0KS0+bGxkZF9oYSk7CisjaWZkZWYgQ09ORklHX1NDU0lfTVZTQVNfVEFTS0xFVAorCXRhc2tsZXRfaW5pdCgmKG1waS0+bXZfdGFza2xldCksIG12c190YXNrbGV0LAogCQkgICAgICh1bnNpZ25lZCBsb25nKVNIT1NUX1RPX1NBU19IQShzaG9zdCkpOwogI2VuZGlmCiAKQEAgLTYyNSw4ICs2NTYsOCBAQAogCWNvcmVfbnIgPSAoKHN0cnVjdCBtdnNfcHJ2X2luZm8gKilzaGEtPmxsZGRfaGEpLT5uX2hvc3Q7CiAJbXZpID0gKChzdHJ1Y3QgbXZzX3Bydl9pbmZvICopc2hhLT5sbGRkX2hhKS0+bXZpWzBdOwogCi0jaWZkZWYgTVZTX1VTRV9UQVNLTEVUCi0JdGFza2xldF9raWxsKCZtdl90YXNrbGV0KTsKKyNpZmRlZiBDT05GSUdfU0NTSV9NVlNBU19UQVNLTEVUCisJdGFza2xldF9raWxsKCYoKHN0cnVjdCBtdnNfcHJ2X2luZm8gKilzaGEtPmxsZGRfaGEpLT5tdl90YXNrbGV0KTsKICNlbmRpZgogCiAJcGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwpAQCAtNjM1LDcgKzY2Niw3IEBACiAJc2NzaV9yZW1vdmVfaG9zdChtdmktPnNob3N0KTsKIAogCU1WU19DSElQX0RJU1AtPmludGVycnVwdF9kaXNhYmxlKG12aSk7Ci0JZnJlZV9pcnEobXZpLT5pcnEsIHNoYSk7CisJZnJlZV9pcnEobXZpLT5wZGV2LT5pcnEsIHNoYSk7CiAJZm9yIChpID0gMDsgaSA8IGNvcmVfbnI7IGkrKykgewogCQltdmkgPSAoKHN0cnVjdCBtdnNfcHJ2X2luZm8gKilzaGEtPmxsZGRfaGEpLT5tdmlbaV07CiAJCW12c19mcmVlKG12aSk7CkBAIC03MDMsNiArNzM0LDcwIEBACiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChtdnNfcGNpX3JlbW92ZSksCiB9OwogCitzdGF0aWMgc3NpemVfdAorbXZzX3Nob3dfZHJpdmVyX3ZlcnNpb24oc3RydWN0IGRldmljZSAqY2RldiwKKwkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsICBjaGFyICpidWZmZXIpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZmZlciwgUEFHRV9TSVpFLCAiJXNcbiIsIERSVl9WRVJTSU9OKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGRyaXZlcl92ZXJzaW9uLAorCQkJIFNfSVJVR08sCisJCQkgbXZzX3Nob3dfZHJpdmVyX3ZlcnNpb24sCisJCQkgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90CittdnNfc3RvcmVfaW50ZXJydXB0X2NvYWxlc2Npbmcoc3RydWN0IGRldmljZSAqY2RldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY29uc3QgY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgdmFsID0gMDsKKwlzdHJ1Y3QgbXZzX2luZm8gKm12aSA9IE5VTEw7CisJc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QgPSBjbGFzc190b19zaG9zdChjZGV2KTsKKwlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2hhID0gU0hPU1RfVE9fU0FTX0hBKHNob3N0KTsKKwl1OCBpLCBjb3JlX25yOworCWlmIChidWZmZXIgPT0gTlVMTCkKKwkJcmV0dXJuIHNpemU7CisKKwlpZiAoc3NjYW5mKGJ1ZmZlciwgIiVkIiwgJnZhbCkgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodmFsID49IDB4MTAwMDApIHsKKwkJbXZfZHByaW50aygiaW50ZXJydXB0IGNvYWxlc2NpbmcgdGltZXIgJWQgdXMgaXMiCisJCQkidG9vIGxvbmdcbiIsIHZhbCk7CisJCXJldHVybiBzdHJsZW4oYnVmZmVyKTsKKwl9CisKKwlpbnRlcnJ1cHRfY29hbGVzY2luZyA9IHZhbDsKKworCWNvcmVfbnIgPSAoKHN0cnVjdCBtdnNfcHJ2X2luZm8gKilzaGEtPmxsZGRfaGEpLT5uX2hvc3Q7CisJbXZpID0gKChzdHJ1Y3QgbXZzX3Bydl9pbmZvICopc2hhLT5sbGRkX2hhKS0+bXZpWzBdOworCisJaWYgKHVubGlrZWx5KCFtdmkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBjb3JlX25yOyBpKyspIHsKKwkJbXZpID0gKChzdHJ1Y3QgbXZzX3Bydl9pbmZvICopc2hhLT5sbGRkX2hhKS0+bXZpW2ldOworCQlpZiAoTVZTX0NISVBfRElTUC0+dHVuZV9pbnRlcnJ1cHQpCisJCQlNVlNfQ0hJUF9ESVNQLT50dW5lX2ludGVycnVwdChtdmksCisJCQkJaW50ZXJydXB0X2NvYWxlc2NpbmcpOworCX0KKwltdl9kcHJpbnRrKCJzZXQgaW50ZXJydXB0IGNvYWxlc2NpbmcgdGltZSB0byAlZCB1c1xuIiwKKwkJaW50ZXJydXB0X2NvYWxlc2NpbmcpOworCXJldHVybiBzdHJsZW4oYnVmZmVyKTsKK30KKworc3RhdGljIHNzaXplX3QgbXZzX3Nob3dfaW50ZXJydXB0X2NvYWxlc2Npbmcoc3RydWN0IGRldmljZSAqY2RldiwKKwkJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWZmZXIpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZmZlciwgUEFHRV9TSVpFLCAiJWRcbiIsIGludGVycnVwdF9jb2FsZXNjaW5nKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGludGVycnVwdF9jb2FsZXNjaW5nLAorCQkJIFNfSVJVR098U19JV1VTUiwKKwkJCSBtdnNfc2hvd19pbnRlcnJ1cHRfY29hbGVzY2luZywKKwkJCSBtdnNfc3RvcmVfaW50ZXJydXB0X2NvYWxlc2NpbmcpOworCiAvKiB0YXNrIGhhbmRsZXIgKi8KIHN0cnVjdCB0YXNrX3N0cnVjdCAqbXZzX3RoOwogc3RhdGljIGludCBfX2luaXQgbXZzX2luaXQodm9pZCkKQEAgLTczOSw2ICs4MzQsMTIgQEAKIAlrbWVtX2NhY2hlX2Rlc3Ryb3kobXZzX3Rhc2tfbGlzdF9jYWNoZSk7CiB9CiAKK3N0cnVjdCBkZXZpY2VfYXR0cmlidXRlICptdnN0X2hvc3RfYXR0cnNbXSA9IHsKKwkmZGV2X2F0dHJfZHJpdmVyX3ZlcnNpb24sCisJJmRldl9hdHRyX2ludGVycnVwdF9jb2FsZXNjaW5nLAorCU5VTEwsCit9OworCiBtb2R1bGVfaW5pdChtdnNfaW5pdCk7CiBtb2R1bGVfZXhpdChtdnNfZXhpdCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl9zYXMuYyBiL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl9zYXMuYwppbmRleCAwZWYyNzQyLi40OTU4ZmVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfc2FzLmMKKysrIGIvZHJpdmVycy9zY3NpL212c2FzL212X3Nhcy5jCkBAIC0zOCw3ICszOCw3IEBACiAKIHZvaWQgbXZzX3RhZ19jbGVhcihzdHJ1Y3QgbXZzX2luZm8gKm12aSwgdTMyIHRhZykKIHsKLQl2b2lkICpiaXRtYXAgPSAmbXZpLT50YWdzOworCXZvaWQgKmJpdG1hcCA9IG12aS0+dGFnczsKIAljbGVhcl9iaXQodGFnLCBiaXRtYXApOwogfQogCkBAIC00OSwxNCArNDksMTQgQEAKIAogdm9pZCBtdnNfdGFnX3NldChzdHJ1Y3QgbXZzX2luZm8gKm12aSwgdW5zaWduZWQgaW50IHRhZykKIHsKLQl2b2lkICpiaXRtYXAgPSAmbXZpLT50YWdzOworCXZvaWQgKmJpdG1hcCA9IG12aS0+dGFnczsKIAlzZXRfYml0KHRhZywgYml0bWFwKTsKIH0KIAogaW5saW5lIGludCBtdnNfdGFnX2FsbG9jKHN0cnVjdCBtdnNfaW5mbyAqbXZpLCB1MzIgKnRhZ19vdXQpCiB7CiAJdW5zaWduZWQgaW50IGluZGV4LCB0YWc7Ci0Jdm9pZCAqYml0bWFwID0gJm12aS0+dGFnczsKKwl2b2lkICpiaXRtYXAgPSBtdmktPnRhZ3M7CiAKIAlpbmRleCA9IGZpbmRfZmlyc3RfemVyb19iaXQoYml0bWFwLCBtdmktPnRhZ3NfbnVtKTsKIAl0YWcgPSBpbmRleDsKQEAgLTc0LDEyNiArNzQsNiBAQAogCQltdnNfdGFnX2NsZWFyKG12aSwgaSk7CiB9CiAKLXZvaWQgbXZzX2hleGR1bXAodTMyIHNpemUsIHU4ICpkYXRhLCB1MzIgYmFzZWFkZHIpCi17Ci0JdTMyIGk7Ci0JdTMyIHJ1bjsKLQl1MzIgb2Zmc2V0OwotCi0Jb2Zmc2V0ID0gMDsKLQl3aGlsZSAoc2l6ZSkgewotCQlwcmludGsoS0VSTl9ERUJVRyIlMDhYIDogIiwgYmFzZWFkZHIgKyBvZmZzZXQpOwotCQlpZiAoc2l6ZSA+PSAxNikKLQkJCXJ1biA9IDE2OwotCQllbHNlCi0JCQlydW4gPSBzaXplOwotCQlzaXplIC09IHJ1bjsKLQkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJCWlmIChpIDwgcnVuKQotCQkJCXByaW50ayhLRVJOX0RFQlVHIiUwMlggIiwgKHUzMilkYXRhW2ldKTsKLQkJCWVsc2UKLQkJCQlwcmludGsoS0VSTl9ERUJVRyIgICAiKTsKLQkJfQotCQlwcmludGsoS0VSTl9ERUJVRyI6ICIpOwotCQlmb3IgKGkgPSAwOyBpIDwgcnVuOyBpKyspCi0JCQlwcmludGsoS0VSTl9ERUJVRyIlYyIsCi0JCQkJaXNhbG51bShkYXRhW2ldKSA/IGRhdGFbaV0gOiAnLicpOwotCQlwcmludGsoS0VSTl9ERUJVRyJcbiIpOwotCQlkYXRhID0gJmRhdGFbMTZdOwotCQlvZmZzZXQgKz0gcnVuOwotCX0KLQlwcmludGsoS0VSTl9ERUJVRyJcbiIpOwotfQotCi0jaWYgKF9NVl9EVU1QID4gMSkKLXN0YXRpYyB2b2lkIG12c19oYmFfc2JfZHVtcChzdHJ1Y3QgbXZzX2luZm8gKm12aSwgdTMyIHRhZywKLQkJCQkgICBlbnVtIHNhc19wcm90b2NvbCBwcm90bykKLXsKLQl1MzIgb2Zmc2V0OwotCXN0cnVjdCBtdnNfc2xvdF9pbmZvICpzbG90ID0gJm12aS0+c2xvdF9pbmZvW3RhZ107Ci0KLQlvZmZzZXQgPSBzbG90LT5jbWRfc2l6ZSArIE1WU19PQUZfU1ogKwotCSAgICBNVlNfQ0hJUF9ESVNQLT5wcmRfc2l6ZSgpICogc2xvdC0+bl9lbGVtOwotCWRldl9wcmludGsoS0VSTl9ERUJVRywgbXZpLT5kZXYsICIrLS0tLT5TdGF0dXMgYnVmZmVyWyVkXSA6XG4iLAotCQkJdGFnKTsKLQltdnNfaGV4ZHVtcCgzMiwgKHU4ICopIHNsb3QtPnJlc3BvbnNlLAotCQkgICAgKHUzMikgc2xvdC0+YnVmX2RtYSArIG9mZnNldCk7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgbXZzX2hiYV9tZW1vcnlfZHVtcChzdHJ1Y3QgbXZzX2luZm8gKm12aSwgdTMyIHRhZywKLQkJCQllbnVtIHNhc19wcm90b2NvbCBwcm90bykKLXsKLSNpZiAoX01WX0RVTVAgPiAxKQotCXUzMiBzeiwgd19wdHI7Ci0JdTY0IGFkZHI7Ci0Jc3RydWN0IG12c19zbG90X2luZm8gKnNsb3QgPSAmbXZpLT5zbG90X2luZm9bdGFnXTsKLQotCS8qRGVsaXZlcnkgUXVldWUgKi8KLQlzeiA9IE1WU19DSElQX1NMT1RfU1o7Ci0Jd19wdHIgPSBzbG90LT50eDsKLQlhZGRyID0gbXZpLT50eF9kbWE7Ci0JZGV2X3ByaW50ayhLRVJOX0RFQlVHLCBtdmktPmRldiwKLQkJIkRlbGl2ZXJ5IFF1ZXVlIFNpemU9JTA0ZCAsIFdSVF9QVFI9JTA0WFxuIiwgc3osIHdfcHRyKTsKLQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsIG12aS0+ZGV2LAotCQkiRGVsaXZlcnkgUXVldWUgQmFzZSBBZGRyZXNzPTB4JWxsWCAoUEEpIgotCQkiKHR4X2RtYT0weCVsbFgpLCBFbnRyeT0lMDRkXG4iLAotCQlhZGRyLCAodW5zaWduZWQgbG9uZyBsb25nKW12aS0+dHhfZG1hLCB3X3B0cik7Ci0JbXZzX2hleGR1bXAoc2l6ZW9mKHUzMiksICh1OCAqKSgmbXZpLT50eFttdmktPnR4X3Byb2RdKSwKLQkJCSh1MzIpIG12aS0+dHhfZG1hICsgc2l6ZW9mKHUzMikgKiB3X3B0cik7Ci0JLypDb21tYW5kIExpc3QgKi8KLQlhZGRyID0gbXZpLT5zbG90X2RtYTsKLQlkZXZfcHJpbnRrKEtFUk5fREVCVUcsIG12aS0+ZGV2LAotCQkiQ29tbWFuZCBMaXN0IEJhc2UgQWRkcmVzcz0weCVsbFggKFBBKSIKLQkJIihzbG90X2RtYT0weCVsbFgpLCBIZWFkZXI9JTAzZFxuIiwKLQkJYWRkciwgKHVuc2lnbmVkIGxvbmcgbG9uZylzbG90LT5idWZfZG1hLCB0YWcpOwotCWRldl9wcmludGsoS0VSTl9ERUJVRywgbXZpLT5kZXYsICJDb21tYW5kIEhlYWRlclslMDNkXTpcbiIsIHRhZyk7Ci0JLyptdnNfY21kX2hkciAqLwotCW12c19oZXhkdW1wKHNpemVvZihzdHJ1Y3QgbXZzX2NtZF9oZHIpLCAodTggKikoJm12aS0+c2xvdFt0YWddKSwKLQkJKHUzMikgbXZpLT5zbG90X2RtYSArIHRhZyAqIHNpemVvZihzdHJ1Y3QgbXZzX2NtZF9oZHIpKTsKLQkvKjEuY29tbWFuZCB0YWJsZSBhcmVhICovCi0JZGV2X3ByaW50ayhLRVJOX0RFQlVHLCBtdmktPmRldiwgIistLS0tPkNvbW1hbmQgVGFibGUgOlxuIik7Ci0JbXZzX2hleGR1bXAoc2xvdC0+Y21kX3NpemUsICh1OCAqKSBzbG90LT5idWYsICh1MzIpIHNsb3QtPmJ1Zl9kbWEpOwotCS8qMi5vcGVuIGFkZHJlc3MgZnJhbWUgYXJlYSAqLwotCWRldl9wcmludGsoS0VSTl9ERUJVRywgbXZpLT5kZXYsICIrLS0tLT5PcGVuIEFkZHJlc3MgRnJhbWUgOlxuIik7Ci0JbXZzX2hleGR1bXAoTVZTX09BRl9TWiwgKHU4ICopIHNsb3QtPmJ1ZiArIHNsb3QtPmNtZF9zaXplLAotCQkJCSh1MzIpIHNsb3QtPmJ1Zl9kbWEgKyBzbG90LT5jbWRfc2l6ZSk7Ci0JLyozLnN0YXR1cyBidWZmZXIgKi8KLQltdnNfaGJhX3NiX2R1bXAobXZpLCB0YWcsIHByb3RvKTsKLQkvKjQuUFJEIHRhYmxlICovCi0JZGV2X3ByaW50ayhLRVJOX0RFQlVHLCBtdmktPmRldiwgIistLS0tPlBSRCB0YWJsZSA6XG4iKTsKLQltdnNfaGV4ZHVtcChNVlNfQ0hJUF9ESVNQLT5wcmRfc2l6ZSgpICogc2xvdC0+bl9lbGVtLAotCQkodTggKikgc2xvdC0+YnVmICsgc2xvdC0+Y21kX3NpemUgKyBNVlNfT0FGX1NaLAotCQkodTMyKSBzbG90LT5idWZfZG1hICsgc2xvdC0+Y21kX3NpemUgKyBNVlNfT0FGX1NaKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCBtdnNfaGJhX2NxX2R1bXAoc3RydWN0IG12c19pbmZvICptdmkpCi17Ci0jaWYgKF9NVl9EVU1QID4gMikKLQl1NjQgYWRkcjsKLQl2b2lkIF9faW9tZW0gKnJlZ3MgPSBtdmktPnJlZ3M7Ci0JdTMyIGVudHJ5ID0gbXZpLT5yeF9jb25zICsgMTsKLQl1MzIgcnhfZGVzYyA9IGxlMzJfdG9fY3B1KG12aS0+cnhbZW50cnldKTsKLQotCS8qQ29tcGxldGlvbiBRdWV1ZSAqLwotCWFkZHIgPSBtcjMyKFJYX0hJKSA8PCAxNiA8PCAxNiB8IG1yMzIoUlhfTE8pOwotCWRldl9wcmludGsoS0VSTl9ERUJVRywgbXZpLT5kZXYsICJDb21wbGV0aW9uIFRhc2sgPSAweCVwXG4iLAotCQkgICBtdmktPnNsb3RfaW5mb1tyeF9kZXNjICYgUlhRX1NMT1RfTUFTS10udGFzayk7Ci0JZGV2X3ByaW50ayhLRVJOX0RFQlVHLCBtdmktPmRldiwKLQkJIkNvbXBsZXRpb24gTGlzdCBCYXNlIEFkZHJlc3M9MHglbGxYIChQQSksICIKLQkJIkNRX0VudHJ5PSUwNGQsIENRX1dQPTB4JTA4WFxuIiwKLQkJYWRkciwgZW50cnkgLSAxLCBtdmktPnJ4WzBdKTsKLQltdnNfaGV4ZHVtcChzaXplb2YodTMyKSwgKHU4ICopKCZyeF9kZXNjKSwKLQkJICAgIG12aS0+cnhfZG1hICsgc2l6ZW9mKHUzMikgKiBlbnRyeSk7Ci0jZW5kaWYKLX0KLQotdm9pZCBtdnNfZ2V0X3Nhc19hZGRyKHZvaWQgKmJ1ZiwgdTMyIGJ1ZmxlbikKLXsKLQkvKm1lbWNweShidWYsICJceDUwXHgwNVx4MDRceDMwXHgxMVx4YWJceDY0XHg0MCIsIDgpOyovCi19Ci0KIHN0cnVjdCBtdnNfaW5mbyAqbXZzX2ZpbmRfZGV2X212aShzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2KQogewogCXVuc2lnbmVkIGxvbmcgaSA9IDAsIGogPSAwLCBoaSA9IDA7CkBAIC0yMjIsNyArMTAyLDYgQEAKIAogfQogCi0vKiBGSVhNRSAqLwogaW50IG12c19maW5kX2Rldl9waHlubyhzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2LCBpbnQgKnBoeW5vKQogewogCXVuc2lnbmVkIGxvbmcgaSA9IDAsIGogPSAwLCBuID0gMCwgbnVtID0gMDsKQEAgLTI1Myw2ICsxMzIsMjAgQEAKIAlyZXR1cm4gbnVtOwogfQogCitzdHJ1Y3QgbXZzX2RldmljZSAqbXZzX2ZpbmRfZGV2X2J5X3JlZ19zZXQoc3RydWN0IG12c19pbmZvICptdmksCisJCQkJCQl1OCByZWdfc2V0KQoreworCXUzMiBkZXZfbm87CisJZm9yIChkZXZfbm8gPSAwOyBkZXZfbm8gPCBNVlNfTUFYX0RFVklDRVM7IGRldl9ubysrKSB7CisJCWlmIChtdmktPmRldmljZXNbZGV2X25vXS50YXNrZmlsZXNldCA9PSBNVlNfSURfTk9UX01BUFBFRCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChtdmktPmRldmljZXNbZGV2X25vXS50YXNrZmlsZXNldCA9PSByZWdfc2V0KQorCQkJcmV0dXJuICZtdmktPmRldmljZXNbZGV2X25vXTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBtdnNfZnJlZV9yZWdfc2V0KHN0cnVjdCBtdnNfaW5mbyAqbXZpLAogCQkJCXN0cnVjdCBtdnNfZGV2aWNlICpkZXYpCiB7CkBAIC0yODMsNyArMTc2LDYgQEAKIAl9CiB9CiAKLS8qIEZJWE1FOiBsb2NraW5nPyAqLwogaW50IG12c19waHlfY29udHJvbChzdHJ1Y3QgYXNkX3Nhc19waHkgKnNhc19waHksIGVudW0gcGh5X2Z1bmMgZnVuYywKIAkJCXZvaWQgKmZ1bmNkYXRhKQogewpAQCAtMzA5LDEyICsyMDEsMTIgQEAKIAkJdG1wID0gTVZTX0NISVBfRElTUC0+cmVhZF9waHlfY3RsKG12aSwgcGh5X2lkKTsKIAkJaWYgKHRtcCAmIFBIWV9SU1RfSEFSRCkKIAkJCWJyZWFrOwotCQlNVlNfQ0hJUF9ESVNQLT5waHlfcmVzZXQobXZpLCBwaHlfaWQsIDEpOworCQlNVlNfQ0hJUF9ESVNQLT5waHlfcmVzZXQobXZpLCBwaHlfaWQsIE1WU19IQVJEX1JFU0VUKTsKIAkJYnJlYWs7CiAKIAljYXNlIFBIWV9GVU5DX0xJTktfUkVTRVQ6CiAJCU1WU19DSElQX0RJU1AtPnBoeV9lbmFibGUobXZpLCBwaHlfaWQpOwotCQlNVlNfQ0hJUF9ESVNQLT5waHlfcmVzZXQobXZpLCBwaHlfaWQsIDApOworCQlNVlNfQ0hJUF9ESVNQLT5waHlfcmVzZXQobXZpLCBwaHlfaWQsIE1WU19TT0ZUX1JFU0VUKTsKIAkJYnJlYWs7CiAKIAljYXNlIFBIWV9GVU5DX0RJU0FCTEU6CkBAIC00MDYsMTQgKzI5OCwxMCBAQAogCiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKLQlpZiAoZGV2X2lzX3NhdGEoZGV2KSkgewotCQkvKiBtYXkgc2V0IFBJTyBtb2RlICovCi0JI2lmIE1WX0RJU0FCTEVfTkNRCi0JCXN0cnVjdCBhdGFfcG9ydCAqYXAgPSBkZXYtPnNhdGFfZGV2LmFwOwotCQlzdHJ1Y3QgYXRhX2RldmljZSAqYWRldiA9IGFwLT5saW5rLmRldmljZTsKLQkJYWRldi0+ZmxhZ3MgfD0gQVRBX0RGTEFHX05DUV9PRkY7Ci0JCXNjc2lfYWRqdXN0X3F1ZXVlX2RlcHRoKHNkZXYsIE1TR19TSU1QTEVfVEFHLCAxKTsKLQkjZW5kaWYKKwlpZiAoIWRldl9pc19zYXRhKGRldikpIHsKKwkJc2FzX2NoYW5nZV9xdWV1ZV9kZXB0aChzZGV2LAorCQkJTVZTX1FVRVVFX1NJWkUsCisJCQlTQ1NJX1FERVBUSF9ERUZBVUxUKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC00MjQsNiArMzEyLDcgQEAKIAl1bnNpZ25lZCBzaG9ydCBjb3JlX25yOwogCXN0cnVjdCBtdnNfaW5mbyAqbXZpOwogCXN0cnVjdCBzYXNfaGFfc3RydWN0ICpzaGEgPSBTSE9TVF9UT19TQVNfSEEoc2hvc3QpOworCXN0cnVjdCBtdnNfcHJ2X2luZm8gKm12c19wcnYgPSBzaGEtPmxsZGRfaGE7CiAKIAljb3JlX25yID0gKChzdHJ1Y3QgbXZzX3Bydl9pbmZvICopc2hhLT5sbGRkX2hhKS0+bl9ob3N0OwogCkBAIC00MzIsMTUgKzMyMSwxNyBAQAogCQlmb3IgKGkgPSAwOyBpIDwgbXZpLT5jaGlwLT5uX3BoeTsgKytpKQogCQkJbXZzX2J5dGVzX2RtYWVkKG12aSwgaSk7CiAJfQorCW12c19wcnYtPnNjYW5fZmluaXNoZWQgPSAxOwogfQogCiBpbnQgbXZzX3NjYW5fZmluaXNoZWQoc3RydWN0IFNjc2lfSG9zdCAqc2hvc3QsIHVuc2lnbmVkIGxvbmcgdGltZSkKIHsKLQkvKiBnaXZlIHRoZSBwaHkgZW5hYmxpbmcgaW50ZXJydXB0IGV2ZW50IHRpbWUgdG8gY29tZSBpbiAoMXMKLQkgKiBpcyBlbXBpcmljYWxseSBhYm91dCBhbGwgaXQgdGFrZXMpICovCi0JaWYgKHRpbWUgPCBIWikKKwlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2hhID0gU0hPU1RfVE9fU0FTX0hBKHNob3N0KTsKKwlzdHJ1Y3QgbXZzX3Bydl9pbmZvICptdnNfcHJ2ID0gc2hhLT5sbGRkX2hhOworCisJaWYgKG12c19wcnYtPnNjYW5fZmluaXNoZWQgPT0gMCkKIAkJcmV0dXJuIDA7Ci0JLyogV2FpdCBmb3IgZGlzY292ZXJ5IHRvIGZpbmlzaCAqLworCiAJc2NzaV9mbHVzaF93b3JrKHNob3N0KTsKIAlyZXR1cm4gMTsKIH0KQEAgLTQ2MSwxMCArMzUyLDcgQEAKIAl2b2lkICpidWZfcHJkOwogCXN0cnVjdCBtdnNfc2xvdF9pbmZvICpzbG90ID0gJm12aS0+c2xvdF9pbmZvW3RhZ107CiAJdTMyIGZsYWdzID0gKHRlaS0+bl9lbGVtIDw8IE1DSF9QUkRfTEVOX1NISUZUKTsKLSNpZiBfTVZfRFVNUAotCXU4ICpidWZfY21kOwotCXZvaWQgKmZyb207Ci0jZW5kaWYKKwogCS8qCiAJICogRE1BLW1hcCBTTVAgcmVxdWVzdCwgcmVzcG9uc2UgYnVmZmVycwogCSAqLwpAQCAtNDk2LDE1ICszODQsNyBAQAogCWJ1Zl90bXAgPSBzbG90LT5idWY7CiAJYnVmX3RtcF9kbWEgPSBzbG90LT5idWZfZG1hOwogCi0jaWYgX01WX0RVTVAKLQlidWZfY21kID0gYnVmX3RtcDsKLQloZHItPmNtZF90YmwgPSBjcHVfdG9fbGU2NChidWZfdG1wX2RtYSk7Ci0JYnVmX3RtcCArPSByZXFfbGVuOwotCWJ1Zl90bXBfZG1hICs9IHJlcV9sZW47Ci0Jc2xvdC0+Y21kX3NpemUgPSByZXFfbGVuOwotI2Vsc2UKIAloZHItPmNtZF90YmwgPSBjcHVfdG9fbGU2NChzZ19kbWFfYWRkcmVzcyhzZ19yZXEpKTsKLSNlbmRpZgogCiAJLyogcmVnaW9uIDI6IG9wZW4gYWRkcmVzcyBmcmFtZSBhcmVhIChNVlNfT0FGX1NaIGJ5dGVzKSAqKioqKioqKiogKi8KIAlidWZfb2FmID0gYnVmX3RtcDsKQEAgLTU1MywxMiArNDMzLDYgQEAKIAkvKiBmaWxsIGluIFBSRCAoc2NhdHRlci9nYXRoZXIpIHRhYmxlLCBpZiBhbnkgKi8KIAlNVlNfQ0hJUF9ESVNQLT5tYWtlX3ByZCh0YXNrLT5zY2F0dGVyLCB0ZWktPm5fZWxlbSwgYnVmX3ByZCk7CiAKLSNpZiBfTVZfRFVNUAotCS8qIGNvcHkgY21kIHRhYmxlICovCi0JZnJvbSA9IGttYXBfYXRvbWljKHNnX3BhZ2Uoc2dfcmVxKSwgS01fSVJRMCk7Ci0JbWVtY3B5KGJ1Zl9jbWQsIGZyb20gKyBzZ19yZXEtPm9mZnNldCwgcmVxX2xlbik7Ci0Ja3VubWFwX2F0b21pYyhmcm9tLCBLTV9JUlEwKTsKLSNlbmRpZgogCXJldHVybiAwOwogCiBlcnJfb3V0XzI6CkBAIC02MTYsMTQgKzQ5MCwxMSBAQAogCQkobXZpX2Rldi0+dGFza2ZpbGVzZXQgPDwgVFhRX1NSU19TSElGVCk7CiAJbXZpLT50eFttdmktPnR4X3Byb2RdID0gY3B1X3RvX2xlMzIoZGVsX3EpOwogCi0jaWZuZGVmIERJU0FCTEVfSE9UUExVR19ETUFfRklYCiAJaWYgKHRhc2stPmRhdGFfZGlyID09IERNQV9GUk9NX0RFVklDRSkKIAkJZmxhZ3MgPSAoTVZTX0NISVBfRElTUC0+cHJkX2NvdW50KCkgPDwgTUNIX1BSRF9MRU5fU0hJRlQpOwogCWVsc2UKIAkJZmxhZ3MgPSAodGVpLT5uX2VsZW0gPDwgTUNIX1BSRF9MRU5fU0hJRlQpOwotI2Vsc2UKLQlmbGFncyA9ICh0ZWktPm5fZWxlbSA8PCBNQ0hfUFJEX0xFTl9TSElGVCk7Ci0jZW5kaWYKKwogCWlmICh0YXNrLT5hdGFfdGFzay51c2VfbmNxKQogCQlmbGFncyB8PSBNQ0hfRlBETUE7CiAJaWYgKGRldi0+c2F0YV9kZXYuY29tbWFuZF9zZXQgPT0gQVRBUElfQ09NTUFORF9TRVQpIHsKQEAgLTYzMSwxMSArNTAyLDggQEAKIAkJCWZsYWdzIHw9IE1DSF9BVEFQSTsKIAl9CiAKLQkvKiBGSVhNRTogZmlsbCBpbiBwb3J0IG11bHRpcGxpZXIgbnVtYmVyICovCi0KIAloZHItPmZsYWdzID0gY3B1X3RvX2xlMzIoZmxhZ3MpOwogCi0JLyogRklYTUU6IHRoZSBsb3cgb3JkZXIgb3JkZXIgNSBiaXRzIGZvciB0aGUgVEFHIGlmIGVuYWJsZSBOQ1EgKi8KIAlpZiAodGFzay0+YXRhX3Rhc2sudXNlX25jcSAmJiBtdnNfZ2V0X25jcV90YWcodGFzaywgJmhkcl90YWcpKQogCQl0YXNrLT5hdGFfdGFzay5maXMuc2VjdG9yX2NvdW50IHw9ICh1OCkgKGhkcl90YWcgPDwgMyk7CiAJZWxzZQpAQCAtNjU3LDkgKzUyNSw2IEBACiAKIAlidWZfdG1wICs9IE1WU19BVEFfQ01EX1NaOwogCWJ1Zl90bXBfZG1hICs9IE1WU19BVEFfQ01EX1NaOwotI2lmIF9NVl9EVU1QCi0Jc2xvdC0+Y21kX3NpemUgPSBNVlNfQVRBX0NNRF9TWjsKLSNlbmRpZgogCiAJLyogcmVnaW9uIDI6IG9wZW4gYWRkcmVzcyBmcmFtZSBhcmVhIChNVlNfT0FGX1NaIGJ5dGVzKSAqKioqKioqKiogKi8KIAkvKiB1c2VkIGZvciBTVFAuICB1bnVzZWQgZm9yIFNBVEE/ICovCkBAIC02ODIsOSArNTQ3LDYgQEAKIAlidWZfdG1wX2RtYSArPSBpOwogCiAJLyogcmVnaW9uIDQ6IHN0YXR1cyBidWZmZXIgKGxhcmdlciB0aGUgUFJELCBzbWFsbGVyIHRoaXMgYnVmKSAqKioqKiogKi8KLQkvKiBGSVhNRTogcHJvYmFibHkgdW51c2VkLCBmb3IgU0FUQS4gIGtlcHQgaGVyZSBqdXN0IGluIGNhc2UKLQkgKiB3ZSBnZXQgYSBTVFAvU0FUQSBlcnJvciBpbmZvcm1hdGlvbiByZWNvcmQKLQkgKi8KIAlzbG90LT5yZXNwb25zZSA9IGJ1Zl90bXA7CiAJaGRyLT5zdGF0dXNfYnVmID0gY3B1X3RvX2xlNjQoYnVmX3RtcF9kbWEpOwogCWlmIChtdmktPmZsYWdzICYgTVZGX0ZMQUdfU09DKQpAQCAtNzE1LDExICs1NzcsMTEgQEAKIAogCS8qIGZpbGwgaW4gUFJEIChzY2F0dGVyL2dhdGhlcikgdGFibGUsIGlmIGFueSAqLwogCU1WU19DSElQX0RJU1AtPm1ha2VfcHJkKHRhc2stPnNjYXR0ZXIsIHRlaS0+bl9lbGVtLCBidWZfcHJkKTsKLSNpZm5kZWYgRElTQUJMRV9IT1RQTFVHX0RNQV9GSVgKKwogCWlmICh0YXNrLT5kYXRhX2RpciA9PSBETUFfRlJPTV9ERVZJQ0UpCi0JCU1WU19DSElQX0RJU1AtPmRtYV9maXgobXZpLT5idWxrX2J1ZmZlcl9kbWEsCisJCU1WU19DSElQX0RJU1AtPmRtYV9maXgobXZpLCBzYXNfcG9ydC0+cGh5X21hc2ssCiAJCQkJVFJBU0hfQlVDS0VUX1NJWkUsIHRlaS0+bl9lbGVtLCBidWZfcHJkKTsKLSNlbmRpZgorCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTc2MSw2ICs2MjMsOSBAQAogCX0KIAlpZiAoaXNfdG1mKQogCQlmbGFncyB8PSAoTUNIX1NTUF9GUl9UQVNLIDw8IE1DSF9TU1BfRlJfVFlQRV9TSElGVCk7CisJZWxzZQorCQlmbGFncyB8PSAoTUNIX1NTUF9GUl9DTUQgPDwgTUNIX1NTUF9GUl9UWVBFX1NISUZUKTsKKwogCWhkci0+ZmxhZ3MgPSBjcHVfdG9fbGUzMihmbGFncyB8ICh0ZWktPm5fZWxlbSA8PCBNQ0hfUFJEX0xFTl9TSElGVCkpOwogCWhkci0+dGFncyA9IGNwdV90b19sZTMyKHRhZyk7CiAJaGRyLT5kYXRhX2xlbiA9IGNwdV90b19sZTMyKHRhc2stPnRvdGFsX3hmZXJfbGVuKTsKQEAgLTc3Nyw5ICs2NDIsNiBAQAogCiAJYnVmX3RtcCArPSBNVlNfU1NQX0NNRF9TWjsKIAlidWZfdG1wX2RtYSArPSBNVlNfU1NQX0NNRF9TWjsKLSNpZiBfTVZfRFVNUAotCXNsb3QtPmNtZF9zaXplID0gTVZTX1NTUF9DTURfU1o7Ci0jZW5kaWYKIAogCS8qIHJlZ2lvbiAyOiBvcGVuIGFkZHJlc3MgZnJhbWUgYXJlYSAoTVZTX09BRl9TWiBieXRlcykgKioqKioqKioqICovCiAJYnVmX29hZiA9IGJ1Zl90bXA7CkBAIC05ODYsNyArODQ4LDYgQEAKIAl0YXNrLT50YXNrX3N0YXRlX2ZsYWdzIHw9IFNBU19UQVNLX0FUX0lOSVRJQVRPUjsKIAlzcGluX3VubG9jaygmdGFzay0+dGFza19zdGF0ZV9sb2NrKTsKIAotCW12c19oYmFfbWVtb3J5X2R1bXAobXZpLCB0YWcsIHRhc2stPnRhc2tfcHJvdG8pOwogCW12aV9kZXYtPnJ1bm5pbmdfcmVxKys7CiAJKysoKnBhc3MpOwogCW12aS0+dHhfcHJvZCA9IChtdmktPnR4X3Byb2QgKyAxKSAmIChNVlNfQ0hJUF9TTE9UX1NaIC0gMSk7CkBAIC0xMTg5LDkgKzEwNTAsOSBAQAogCW12c19zbG90X2ZyZWUobXZpLCBzbG90X2lkeCk7CiB9CiAKLXN0YXRpYyB2b2lkIG12c191cGRhdGVfd2lkZXBvcnQoc3RydWN0IG12c19pbmZvICptdmksIGludCBpKQorc3RhdGljIHZvaWQgbXZzX3VwZGF0ZV93aWRlcG9ydChzdHJ1Y3QgbXZzX2luZm8gKm12aSwgaW50IHBoeV9ubykKIHsKLQlzdHJ1Y3QgbXZzX3BoeSAqcGh5ID0gJm12aS0+cGh5W2ldOworCXN0cnVjdCBtdnNfcGh5ICpwaHkgPSAmbXZpLT5waHlbcGh5X25vXTsKIAlzdHJ1Y3QgbXZzX3BvcnQgKnBvcnQgPSBwaHktPnBvcnQ7CiAJaW50IGosIG5vOwogCkBAIC0xMjQ2LDE4ICsxMTA3LDE3IEBACiAJCXJldHVybiBOVUxMOwogCiAJTVZTX0NISVBfRElTUC0+d3JpdGVfcG9ydF9jZmdfYWRkcihtdmksIGksIFBIWVJfU0FUQV9TSUczKTsKLQlzWzNdID0gTVZTX0NISVBfRElTUC0+cmVhZF9wb3J0X2NmZ19kYXRhKG12aSwgaSk7CisJc1szXSA9IGNwdV90b19sZTMyKE1WU19DSElQX0RJU1AtPnJlYWRfcG9ydF9jZmdfZGF0YShtdmksIGkpKTsKIAogCU1WU19DSElQX0RJU1AtPndyaXRlX3BvcnRfY2ZnX2FkZHIobXZpLCBpLCBQSFlSX1NBVEFfU0lHMik7Ci0Jc1syXSA9IE1WU19DSElQX0RJU1AtPnJlYWRfcG9ydF9jZmdfZGF0YShtdmksIGkpOworCXNbMl0gPSBjcHVfdG9fbGUzMihNVlNfQ0hJUF9ESVNQLT5yZWFkX3BvcnRfY2ZnX2RhdGEobXZpLCBpKSk7CiAKIAlNVlNfQ0hJUF9ESVNQLT53cml0ZV9wb3J0X2NmZ19hZGRyKG12aSwgaSwgUEhZUl9TQVRBX1NJRzEpOwotCXNbMV0gPSBNVlNfQ0hJUF9ESVNQLT5yZWFkX3BvcnRfY2ZnX2RhdGEobXZpLCBpKTsKKwlzWzFdID0gY3B1X3RvX2xlMzIoTVZTX0NISVBfRElTUC0+cmVhZF9wb3J0X2NmZ19kYXRhKG12aSwgaSkpOwogCiAJTVZTX0NISVBfRElTUC0+d3JpdGVfcG9ydF9jZmdfYWRkcihtdmksIGksIFBIWVJfU0FUQV9TSUcwKTsKLQlzWzBdID0gTVZTX0NISVBfRElTUC0+cmVhZF9wb3J0X2NmZ19kYXRhKG12aSwgaSk7CisJc1swXSA9IGNwdV90b19sZTMyKE1WU19DSElQX0RJU1AtPnJlYWRfcG9ydF9jZmdfZGF0YShtdmksIGkpKTsKIAotCS8qIFdvcmthcm91bmQ6IHRha2Ugc29tZSBBVEFQSSBkZXZpY2VzIGZvciBBVEEgKi8KIAlpZiAoKChzWzFdICYgMHgwMEZGRkZGRikgPT0gMHgwMEVCMTQwMSkgJiYgKCoodTggKikmc1szXSA9PSAweDAxKSkKIAkJc1sxXSA9IDB4MDBFQjE0MDEgfCAoKigodTggKikmc1sxXSArIDMpICYgMHgxMCk7CiAKQEAgLTEyNjksNiArMTEyOSwxMyBAQAogCXJldHVybiBpcnFfc3RhdHVzICYgUEhZRVZfU0lHX0ZJUzsKIH0KIAorc3RhdGljIHZvaWQgbXZzX3NpZ19yZW1vdmVfdGltZXIoc3RydWN0IG12c19waHkgKnBoeSkKK3sKKwlpZiAocGh5LT50aW1lci5mdW5jdGlvbikKKwkJZGVsX3RpbWVyKCZwaHktPnRpbWVyKTsKKwlwaHktPnRpbWVyLmZ1bmN0aW9uID0gTlVMTDsKK30KKwogdm9pZCBtdnNfdXBkYXRlX3BoeWluZm8oc3RydWN0IG12c19pbmZvICptdmksIGludCBpLCBpbnQgZ2V0X3N0KQogewogCXN0cnVjdCBtdnNfcGh5ICpwaHkgPSAmbXZpLT5waHlbaV07CkBAIC0xMjkxLDYgKzExNTgsNyBAQAogCQlpZiAocGh5LT5waHlfdHlwZSAmIFBPUlRfVFlQRV9TQVRBKSB7CiAJCQlwaHktPmlkZW50aWZ5LnRhcmdldF9wb3J0X3Byb3RvY29scyA9IFNBU19QUk9UT0NPTF9TVFA7CiAJCQlpZiAobXZzX2lzX3NpZ19maXNfcmVjZWl2ZWQocGh5LT5pcnFfc3RhdHVzKSkgeworCQkJCW12c19zaWdfcmVtb3ZlX3RpbWVyKHBoeSk7CiAJCQkJcGh5LT5waHlfYXR0YWNoZWQgPSAxOwogCQkJCXBoeS0+YXR0X2Rldl9zYXNfYWRkciA9CiAJCQkJCWkgKyBtdmktPmlkICogbXZpLT5jaGlwLT5uX3BoeTsKQEAgLTEzMDgsNyArMTE3Niw2IEBACiAJCQkJCQl0bXAgfCBQSFlFVl9TSUdfRklTKTsKIAkJCQlwaHktPnBoeV9hdHRhY2hlZCA9IDA7CiAJCQkJcGh5LT5waHlfdHlwZSAmPSB+UE9SVF9UWVBFX1NBVEE7Ci0JCQkJTVZTX0NISVBfRElTUC0+cGh5X3Jlc2V0KG12aSwgaSwgMCk7CiAJCQkJZ290byBvdXRfZG9uZTsKIAkJCX0KIAkJfQllbHNlIGlmIChwaHktPnBoeV90eXBlICYgUE9SVF9UWVBFX1NBUwpAQCAtMTMzNCw5ICsxMjAxLDkgQEAKIAkJaWYgKE1WU19DSElQX0RJU1AtPnBoeV93b3JrX2Fyb3VuZCkKIAkJCU1WU19DSElQX0RJU1AtPnBoeV93b3JrX2Fyb3VuZChtdmksIGkpOwogCX0KLQltdl9kcHJpbnRrKCJwb3J0ICVkIGF0dGFjaCBkZXYgaW5mbyBpcyAleFxuIiwKKwltdl9kcHJpbnRrKCJwaHkgJWQgYXR0YWNoIGRldiBpbmZvIGlzICV4XG4iLAogCQlpICsgbXZpLT5pZCAqIG12aS0+Y2hpcC0+bl9waHksIHBoeS0+YXR0X2Rldl9pbmZvKTsKLQltdl9kcHJpbnRrKCJwb3J0ICVkIGF0dGFjaCBzYXMgYWRkciBpcyAlbGx4XG4iLAorCW12X2RwcmludGsoInBoeSAlZCBhdHRhY2ggc2FzIGFkZHIgaXMgJWxseFxuIiwKIAkJaSArIG12aS0+aWQgKiBtdmktPmNoaXAtPm5fcGh5LCBwaHktPmF0dF9kZXZfc2FzX2FkZHIpOwogb3V0X2RvbmU6CiAJaWYgKGdldF9zdCkKQEAgLTEzNjEsMTAgKzEyMjgsMTAgQEAKIAl9CiAJaGkgPSBpLygoc3RydWN0IG12c19wcnZfaW5mbyAqKXNhc19oYS0+bGxkZF9oYSktPm5fcGh5OwogCW12aSA9ICgoc3RydWN0IG12c19wcnZfaW5mbyAqKXNhc19oYS0+bGxkZF9oYSktPm12aVtoaV07Ci0JaWYgKHNhc19wb3J0LT5pZCA+PSBtdmktPmNoaXAtPm5fcGh5KQotCQlwb3J0ID0gJm12aS0+cG9ydFtzYXNfcG9ydC0+aWQgLSBtdmktPmNoaXAtPm5fcGh5XTsKKwlpZiAoaSA+PSBtdmktPmNoaXAtPm5fcGh5KQorCQlwb3J0ID0gJm12aS0+cG9ydFtpIC0gbXZpLT5jaGlwLT5uX3BoeV07CiAJZWxzZQotCQlwb3J0ID0gJm12aS0+cG9ydFtzYXNfcG9ydC0+aWRdOworCQlwb3J0ID0gJm12aS0+cG9ydFtpXTsKIAlpZiAobG9jaykKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJm12aS0+bG9jaywgZmxhZ3MpOwogCXBvcnQtPnBvcnRfYXR0YWNoZWQgPSAxOwpAQCAtMTM5Myw3ICsxMjYwLDcgQEAKIAkJCXJldHVybjsKIAl9CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZwb3J0LT5kZXZfbGlzdCwgZGV2X2xpc3Rfbm9kZSkKLQkJbXZzX2RvX3JlbGVhc2VfdGFzayhwaHktPm12aSwgcGh5X25vLCBOVUxMKTsKKwkJbXZzX2RvX3JlbGVhc2VfdGFzayhwaHktPm12aSwgcGh5X25vLCBkZXYpOwogCiB9CiAKQEAgLTE0NTcsNiArMTMyNCw3IEBACiAJbXZpX2RldmljZS0+ZGV2X3N0YXR1cyA9IE1WU19ERVZfTk9STUFMOwogCW12aV9kZXZpY2UtPmRldl90eXBlID0gZGV2LT5kZXZfdHlwZTsKIAltdmlfZGV2aWNlLT5tdmlfaW5mbyA9IG12aTsKKwltdmlfZGV2aWNlLT5zYXNfZGV2aWNlID0gZGV2OwogCWlmIChwYXJlbnRfZGV2ICYmIERFVl9JU19FWFBBTkRFUihwYXJlbnRfZGV2LT5kZXZfdHlwZSkpIHsKIAkJaW50IHBoeV9pZDsKIAkJdTggcGh5X251bSA9IHBhcmVudF9kZXYtPmV4X2Rldi5udW1fcGh5czsKQEAgLTE1MDgsNiArMTM3Niw3IEBACiAJCW12X2RwcmludGsoImZvdW5kIGRldiBoYXMgZ29uZS5cbiIpOwogCX0KIAlkZXYtPmxsZGRfZGV2ID0gTlVMTDsKKwltdmlfZGV2LT5zYXNfZGV2aWNlID0gTlVMTDsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm12aS0+bG9jaywgZmxhZ3MpOwogfQpAQCAtMTU1NSw3ICsxNDI0LDYgQEAKIAljb21wbGV0ZSgmdGFzay0+Y29tcGxldGlvbik7CiB9CiAKLS8qIFhYWCAqLwogI2RlZmluZSBNVlNfVEFTS19USU1FT1VUIDIwCiBzdGF0aWMgaW50IG12c19leGVjX2ludGVybmFsX3RtZl90YXNrKHN0cnVjdCBkb21haW5fZGV2aWNlICpkZXYsCiAJCQl2b2lkICpwYXJhbWV0ZXIsIHUzMiBwYXJhX2xlbiwgc3RydWN0IG12c190bWZfdGFzayAqdG1mKQpAQCAtMTU4OCw3ICsxNDU2LDcgQEAKIAkJfQogCiAJCXdhaXRfZm9yX2NvbXBsZXRpb24oJnRhc2stPmNvbXBsZXRpb24pOwotCQlyZXMgPSAtVE1GX1JFU1BfRlVOQ19GQUlMRUQ7CisJCXJlcyA9IFRNRl9SRVNQX0ZVTkNfRkFJTEVEOwogCQkvKiBFdmVuIFRNRiB0aW1lZCBvdXQsIHJldHVybiBkaXJlY3QuICovCiAJCWlmICgodGFzay0+dGFza19zdGF0ZV9mbGFncyAmIFNBU19UQVNLX1NUQVRFX0FCT1JURUQpKSB7CiAJCQlpZiAoISh0YXNrLT50YXNrX3N0YXRlX2ZsYWdzICYgU0FTX1RBU0tfU1RBVEVfRE9ORSkpIHsKQEAgLTE2MzgsMTEgKzE1MDYsMTAgQEAKIAkJCQl1OCAqbHVuLCBzdHJ1Y3QgbXZzX3RtZl90YXNrICp0bWYpCiB7CiAJc3RydWN0IHNhc19zc3BfdGFzayBzc3BfdGFzazsKLQlERUNMQVJFX0NPTVBMRVRJT05fT05TVEFDSyhjb21wbGV0aW9uKTsKIAlpZiAoIShkZXYtPnRwcm90byAmIFNBU19QUk9UT0NPTF9TU1ApKQogCQlyZXR1cm4gVE1GX1JFU1BfRlVOQ19FU1VQUDsKIAotCXN0cm5jcHkoKHU4ICopJnNzcF90YXNrLkxVTiwgbHVuLCA4KTsKKwltZW1jcHkoc3NwX3Rhc2suTFVOLCBsdW4sIDgpOwogCiAJcmV0dXJuIG12c19leGVjX2ludGVybmFsX3RtZl90YXNrKGRldiwgJnNzcF90YXNrLAogCQkJCXNpemVvZihzc3BfdGFzayksIHRtZik7CkBAIC0xNjY2LDcgKzE1MzMsNyBAQAogaW50IG12c19sdV9yZXNldChzdHJ1Y3QgZG9tYWluX2RldmljZSAqZGV2LCB1OCAqbHVuKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGksIHBoeW5vW1dJREVfUE9SVF9NQVhfUEhZXSwgbnVtICwgcmMgPSBUTUZfUkVTUF9GVU5DX0ZBSUxFRDsKKwlpbnQgcmMgPSBUTUZfUkVTUF9GVU5DX0ZBSUxFRDsKIAlzdHJ1Y3QgbXZzX3RtZl90YXNrIHRtZl90YXNrOwogCXN0cnVjdCBtdnNfZGV2aWNlICogbXZpX2RldiA9IGRldi0+bGxkZF9kZXY7CiAJc3RydWN0IG12c19pbmZvICptdmkgPSBtdmlfZGV2LT5tdmlfaW5mbzsKQEAgLTE2NzUsMTAgKzE1NDIsOCBAQAogCW12aV9kZXYtPmRldl9zdGF0dXMgPSBNVlNfREVWX0VIOwogCXJjID0gbXZzX2RlYnVnX2lzc3VlX3NzcF90bWYoZGV2LCBsdW4sICZ0bWZfdGFzayk7CiAJaWYgKHJjID09IFRNRl9SRVNQX0ZVTkNfQ09NUExFVEUpIHsKLQkJbnVtID0gbXZzX2ZpbmRfZGV2X3BoeW5vKGRldiwgcGh5bm8pOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmbXZpLT5sb2NrLCBmbGFncyk7Ci0JCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykKLQkJCW12c19yZWxlYXNlX3Rhc2sobXZpLCBkZXYpOworCQltdnNfcmVsZWFzZV90YXNrKG12aSwgZGV2KTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXZpLT5sb2NrLCBmbGFncyk7CiAJfQogCS8qIElmIGZhaWxlZCwgZmFsbC10aHJvdWdoIElfVF9OZXh1cyByZXNldCAqLwpAQCAtMTY5NiwxMSArMTU2MSwxMiBAQAogCiAJaWYgKG12aV9kZXYtPmRldl9zdGF0dXMgIT0gTVZTX0RFVl9FSCkKIAkJcmV0dXJuIFRNRl9SRVNQX0ZVTkNfQ09NUExFVEU7CisJZWxzZQorCQltdmlfZGV2LT5kZXZfc3RhdHVzID0gTVZTX0RFVl9OT1JNQUw7CiAJcmMgPSBtdnNfZGVidWdfSV9UX25leHVzX3Jlc2V0KGRldik7CiAJbXZfcHJpbnRrKCIlcyBmb3IgZGV2aWNlWyV4XTpyYz0gJWRcbiIsCiAJCV9fZnVuY19fLCBtdmlfZGV2LT5kZXZpY2VfaWQsIHJjKTsKIAotCS8qIGhvdXNla2VlcGVyICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJm12aS0+bG9jaywgZmxhZ3MpOwogCW12c19yZWxlYXNlX3Rhc2sobXZpLCBkZXYpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm12aS0+bG9jaywgZmxhZ3MpOwpAQCAtMTczOSw5ICsxNjA1LDYgQEAKIAkJY2FzZSBUTUZfUkVTUF9GVU5DX0ZBSUxFRDoKIAkJY2FzZSBUTUZfUkVTUF9GVU5DX0NPTVBMRVRFOgogCQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlyYyA9IFRNRl9SRVNQX0ZVTkNfQ09NUExFVEU7Ci0JCQlicmVhazsKIAkJfQogCX0KIAltdl9wcmludGsoIiVzOnJjPSAlZFxuIiwgX19mdW5jX18sIHJjKTsKQEAgLTE3NjEsOCArMTYyNCw4IEBACiAJdTMyIHRhZzsKIAogCWlmICghbXZpX2RldikgewotCQltdl9wcmludGsoIiVzOiVkIFRNRl9SRVNQX0ZVTkNfRkFJTEVEXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwotCQlyYyA9IFRNRl9SRVNQX0ZVTkNfRkFJTEVEOworCQltdl9wcmludGsoIkRldmljZSBoYXMgcmVtb3ZlZFxuIik7CisJCXJldHVybiBUTUZfUkVTUF9GVU5DX0ZBSUxFRDsKIAl9CiAKIAltdmkgPSBtdmlfZGV2LT5tdmlfaW5mbzsKQEAgLTE4MDcsMjUgKzE2NzAsMTcgQEAKIAogCX0gZWxzZSBpZiAodGFzay0+dGFza19wcm90byAmIFNBU19QUk9UT0NPTF9TQVRBIHx8CiAJCXRhc2stPnRhc2tfcHJvdG8gJiBTQVNfUFJPVE9DT0xfU1RQKSB7Ci0JCS8qIHRvIGRvIGZyZWUgcmVnaXN0ZXJfc2V0ICovCiAJCWlmIChTQVRBX0RFViA9PSBkZXYtPmRldl90eXBlKSB7CiAJCQlzdHJ1Y3QgbXZzX3Nsb3RfaW5mbyAqc2xvdCA9IHRhc2stPmxsZGRfdGFzazsKLQkJCXN0cnVjdCB0YXNrX3N0YXR1c19zdHJ1Y3QgKnRzdGF0OwogCQkJdTMyIHNsb3RfaWR4ID0gKHUzMikoc2xvdCAtIG12aS0+c2xvdF9pbmZvKTsKLQkJCXRzdGF0ID0gJnRhc2stPnRhc2tfc3RhdHVzOwotCQkJbXZfZHByaW50ayhLRVJOX0RFQlVHICJtdl9hYm9ydF90YXNrKCkgbXZpPSVwIHRhc2s9JXAgIgorCQkJbXZfZHByaW50aygibXZzX2Fib3J0X3Rhc2soKSBtdmk9JXAgdGFzaz0lcCAiCiAJCQkJICAgInNsb3Q9JXAgc2xvdF9pZHg9eCV4XG4iLAogCQkJCSAgIG12aSwgdGFzaywgc2xvdCwgc2xvdF9pZHgpOwotCQkJdHN0YXQtPnN0YXQgPSBTQVNfQUJPUlRFRF9UQVNLOwotCQkJaWYgKG12aV9kZXYgJiYgbXZpX2Rldi0+cnVubmluZ19yZXEpCi0JCQkJbXZpX2Rldi0+cnVubmluZ19yZXEtLTsKLQkJCWlmIChzYXNfcHJvdG9jb2xfYXRhKHRhc2stPnRhc2tfcHJvdG8pKQotCQkJCW12c19mcmVlX3JlZ19zZXQobXZpLCBtdmlfZGV2KTsKKwkJCW12c190bWZfdGltZWRvdXQoKHVuc2lnbmVkIGxvbmcpdGFzayk7CiAJCQltdnNfc2xvdF90YXNrX2ZyZWUobXZpLCB0YXNrLCBzbG90LCBzbG90X2lkeCk7Ci0JCQlyZXR1cm4gLTE7CisJCQlyYyA9IFRNRl9SRVNQX0ZVTkNfQ09NUExFVEU7CisJCQlnb3RvIG91dDsKIAkJfQotCX0gZWxzZSB7Ci0JCS8qIFNNUCAqLwogCiAJfQogb3V0OgpAQCAtMTg5MSwxMiArMTc0Niw2MyBAQAogCXJldHVybiBzdGF0OwogfQogCit2b2lkIG12c19zZXRfc2Vuc2UodTggKmJ1ZmZlciwgaW50IGxlbiwgaW50IGRfc2Vuc2UsCisJCWludCBrZXksIGludCBhc2MsIGludCBhc2NxKQoreworCW1lbXNldChidWZmZXIsIDAsIGxlbik7CisKKwlpZiAoZF9zZW5zZSkgeworCQkvKiBEZXNjcmlwdG9yIGZvcm1hdCAqLworCQlpZiAobGVuIDwgNCkgeworCQkJbXZfcHJpbnRrKCJMZW5ndGggJWQgb2Ygc2Vuc2UgYnVmZmVyIHRvbyBzbWFsbCB0byAiCisJCQkJImZpdCBzZW5zZSAleDoleDoleCIsIGxlbiwga2V5LCBhc2MsIGFzY3EpOworCQl9CisKKwkJYnVmZmVyWzBdID0gMHg3MjsJCS8qIFJlc3BvbnNlIENvZGUJKi8KKwkJaWYgKGxlbiA+IDEpCisJCQlidWZmZXJbMV0gPSBrZXk7CS8qIFNlbnNlIEtleSAqLworCQlpZiAobGVuID4gMikKKwkJCWJ1ZmZlclsyXSA9IGFzYzsJLyogQVNDCSovCisJCWlmIChsZW4gPiAzKQorCQkJYnVmZmVyWzNdID0gYXNjcTsJLyogQVNDUQkqLworCX0gZWxzZSB7CisJCWlmIChsZW4gPCAxNCkgeworCQkJbXZfcHJpbnRrKCJMZW5ndGggJWQgb2Ygc2Vuc2UgYnVmZmVyIHRvbyBzbWFsbCB0byAiCisJCQkJImZpdCBzZW5zZSAleDoleDoleCIsIGxlbiwga2V5LCBhc2MsIGFzY3EpOworCQl9CisKKwkJYnVmZmVyWzBdID0gMHg3MDsJCS8qIFJlc3BvbnNlIENvZGUJKi8KKwkJaWYgKGxlbiA+IDIpCisJCQlidWZmZXJbMl0gPSBrZXk7CS8qIFNlbnNlIEtleSAqLworCQlpZiAobGVuID4gNykKKwkJCWJ1ZmZlcls3XSA9IDB4MGE7CS8qIEFkZGl0aW9uYWwgU2Vuc2UgTGVuZ3RoICovCisJCWlmIChsZW4gPiAxMikKKwkJCWJ1ZmZlclsxMl0gPSBhc2M7CS8qIEFTQyAqLworCQlpZiAobGVuID4gMTMpCisJCQlidWZmZXJbMTNdID0gYXNjcTsgLyogQVNDUSAqLworCX0KKworCXJldHVybjsKK30KKwordm9pZCBtdnNfZmlsbF9zc3BfcmVzcF9pdShzdHJ1Y3Qgc3NwX3Jlc3BvbnNlX2l1ICppdSwKKwkJCQl1OCBrZXksIHU4IGFzYywgdTggYXNjX3EpCit7CisJaXUtPmRhdGFwcmVzID0gMjsKKwlpdS0+cmVzcG9uc2VfZGF0YV9sZW4gPSAwOworCWl1LT5zZW5zZV9kYXRhX2xlbiA9IDE3OworCWl1LT5zdGF0dXMgPSAwMjsKKwltdnNfc2V0X3NlbnNlKGl1LT5zZW5zZV9kYXRhLCAxNywgMCwKKwkJCWtleSwgYXNjLCBhc2NfcSk7Cit9CisKIHN0YXRpYyBpbnQgbXZzX3Nsb3RfZXJyKHN0cnVjdCBtdnNfaW5mbyAqbXZpLCBzdHJ1Y3Qgc2FzX3Rhc2sgKnRhc2ssCiAJCQkgdTMyIHNsb3RfaWR4KQogewogCXN0cnVjdCBtdnNfc2xvdF9pbmZvICpzbG90ID0gJm12aS0+c2xvdF9pbmZvW3Nsb3RfaWR4XTsKIAlpbnQgc3RhdDsKLQl1MzIgZXJyX2R3MCA9IGxlMzJfdG9fY3B1KCoodTMyICopIChzbG90LT5yZXNwb25zZSkpOworCXUzMiBlcnJfZHcwID0gbGUzMl90b19jcHUoKih1MzIgKilzbG90LT5yZXNwb25zZSk7CisJdTMyIGVycl9kdzEgPSBsZTMyX3RvX2NwdSgqKCh1MzIgKilzbG90LT5yZXNwb25zZSArIDEpKTsKIAl1MzIgdGZzID0gMDsKIAllbnVtIG12c19wb3J0X3R5cGUgdHlwZSA9IFBPUlRfVFlQRV9TQVM7CiAKQEAgLTE5MDgsOCArMTgxNCwxOSBAQAogCXN0YXQgPSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047CiAJc3dpdGNoICh0YXNrLT50YXNrX3Byb3RvKSB7CiAJY2FzZSBTQVNfUFJPVE9DT0xfU1NQOgorCXsKIAkJc3RhdCA9IFNBU19BQk9SVEVEX1RBU0s7CisJCWlmICgoZXJyX2R3MCAmIE5PX0RFU1QpIHx8IGVycl9kdzEgJiBiaXQoMzEpKSB7CisJCQlzdHJ1Y3Qgc3NwX3Jlc3BvbnNlX2l1ICppdSA9IHNsb3QtPnJlc3BvbnNlICsKKwkJCQlzaXplb2Yoc3RydWN0IG12c19lcnJfaW5mbyk7CisJCQltdnNfZmlsbF9zc3BfcmVzcF9pdShpdSwgTk9UX1JFQURZLCAweDA0LCAwMSk7CisJCQlzYXNfc3NwX3Rhc2tfcmVzcG9uc2UobXZpLT5kZXYsIHRhc2ssIGl1KTsKKwkJCXN0YXQgPSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047CisJCX0KKwkJaWYgKGVycl9kdzEgJiBiaXQoMzEpKQorCQkJbXZfcHJpbnRrKCJyZXVzZSBzYW1lIHNsb3QsIHJldHJ5IGNvbW1hbmQuXG4iKTsKIAkJYnJlYWs7CisJfQogCWNhc2UgU0FTX1BST1RPQ09MX1NNUDoKIAkJc3RhdCA9IFNBTV9TVEFUX0NIRUNLX0NPTkRJVElPTjsKIAkJYnJlYWs7CkBAIC0xOTE4LDEwICsxODM1LDggQEAKIAljYXNlIFNBU19QUk9UT0NPTF9TVFA6CiAJY2FzZSBTQVNfUFJPVE9DT0xfU0FUQSB8IFNBU19QUk9UT0NPTF9TVFA6CiAJewotCQlpZiAoZXJyX2R3MCA9PSAweDgwNDAwMDAyKQotCQkJbXZfcHJpbnRrKCJmaW5kIHJlc2VydmVkIGVycm9yLCB3aHk/XG4iKTsKLQogCQl0YXNrLT5hdGFfdGFzay51c2VfbmNxID0gMDsKKwkJc3RhdCA9IFNBU19QUk9UT19SRVNQT05TRTsKIAkJbXZzX3NhdGFfZG9uZShtdmksIHRhc2ssIHNsb3RfaWR4LCBlcnJfZHcwKTsKIAl9CiAJCWJyZWFrOwpAQCAtMTk0NSw4ICsxODYwLDYgQEAKIAl2b2lkICp0bzsKIAllbnVtIGV4ZWNfc3RhdHVzIHN0czsKIAotCWlmIChtdmktPmV4cF9yZXEpCi0JCW12aS0+ZXhwX3JlcS0tOwogCWlmICh1bmxpa2VseSghdGFzayB8fCAhdGFzay0+bGxkZF90YXNrIHx8ICF0YXNrLT5kZXYpKQogCQlyZXR1cm4gLTE7CiAKQEAgLTE5NTQsOCArMTg2Nyw2IEBACiAJZGV2ID0gdGFzay0+ZGV2OwogCW12aV9kZXYgPSBkZXYtPmxsZGRfZGV2OwogCi0JbXZzX2hiYV9jcV9kdW1wKG12aSk7Ci0KIAlzcGluX2xvY2soJnRhc2stPnRhc2tfc3RhdGVfbG9jayk7CiAJdGFzay0+dGFza19zdGF0ZV9mbGFncyAmPQogCQl+KFNBU19UQVNLX1NUQVRFX1BFTkRJTkcgfCBTQVNfVEFTS19BVF9JTklUSUFUT1IpOwpAQCAtMTk3OCw2ICsxODg5LDcgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAorCS8qIHdoZW4gbm8gZGV2aWNlIGF0dGFjaGluZywgZ28gYWhlYWQgYW5kIGNvbXBsZXRlIGJ5IGVycm9yIGhhbmRsaW5nKi8KIAlpZiAodW5saWtlbHkoIW12aV9kZXYgfHwgZmxhZ3MpKSB7CiAJCWlmICghbXZpX2RldikKIAkJCW12X2RwcmludGsoInBvcnQgaGFzIG5vdCBkZXZpY2UuXG4iKTsKQEAgLTE5ODcsNiArMTg5OSw5IEBACiAKIAkvKiBlcnJvciBpbmZvIHJlY29yZCBwcmVzZW50ICovCiAJaWYgKHVubGlrZWx5KChyeF9kZXNjICYgUlhRX0VSUikgJiYgKCoodTY0ICopIHNsb3QtPnJlc3BvbnNlKSkpIHsKKwkJbXZfZHByaW50aygicG9ydCAlZCBzbG90ICVkIHJ4X2Rlc2MgJVggaGFzIGVycm9yIGluZm8iCisJCQkiJTAxNmxsWC5cbiIsIHNsb3QtPnBvcnQtPnNhc19wb3J0LmlkLCBzbG90X2lkeCwKKwkJCSByeF9kZXNjLCAodTY0KSgqKHU2NCAqKXNsb3QtPnJlc3BvbnNlKSk7CiAJCXRzdGF0LT5zdGF0ID0gbXZzX3Nsb3RfZXJyKG12aSwgdGFzaywgc2xvdF9pZHgpOwogCQl0c3RhdC0+cmVzcCA9IFNBU19UQVNLX0NPTVBMRVRFOwogCQlnb3RvIG91dDsKQEAgLTIwNDgsOCArMTk2Myw3IEBACiAJc3Bpbl91bmxvY2soJm12aS0+bG9jayk7CiAJaWYgKHRhc2stPnRhc2tfZG9uZSkKIAkJdGFzay0+dGFza19kb25lKHRhc2spOwotCWVsc2UKLQkJbXZfZHByaW50aygid2h5IGhhcyBub3QgdGFza19kb25lLlxuIik7CisKIAlzcGluX2xvY2soJm12aS0+bG9jayk7CiAKIAlyZXR1cm4gc3RzOwpAQCAtMjA5Miw3ICsyMDA2LDYgQEAKIAkJICAgICAgc3RydWN0IGRvbWFpbl9kZXZpY2UgKmRldikKIHsKIAlpbnQgaSwgcGh5bm9bV0lERV9QT1JUX01BWF9QSFldLCBudW07Ci0JLyogaG91c2VrZWVwZXIgKi8KIAludW0gPSBtdnNfZmluZF9kZXZfcGh5bm8oZGV2LCBwaHlubyk7CiAJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKQogCQltdnNfZG9fcmVsZWFzZV90YXNrKG12aSwgcGh5bm9baV0sIGRldik7CkBAIC0yMTExLDEzICsyMDI0LDEzIEBACiAJc3RydWN0IG12c193cSAqbXdxID0gY29udGFpbmVyX29mKGR3LCBzdHJ1Y3QgbXZzX3dxLCB3b3JrX3EpOwogCXN0cnVjdCBtdnNfaW5mbyAqbXZpID0gbXdxLT5tdmk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgcGh5X25vID0gKHVuc2lnbmVkIGxvbmcpIG13cS0+ZGF0YTsKKwlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2FzX2hhID0gbXZpLT5zYXM7CisJc3RydWN0IG12c19waHkgKnBoeSA9ICZtdmktPnBoeVtwaHlfbm9dOworCXN0cnVjdCBhc2Rfc2FzX3BoeSAqc2FzX3BoeSA9ICZwaHktPnNhc19waHk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmbXZpLT5sb2NrLCBmbGFncyk7CiAJaWYgKG13cS0+aGFuZGxlciAmIFBIWV9QTFVHX0VWRU5UKSB7Ci0JCXUzMiBwaHlfbm8gPSAodW5zaWduZWQgbG9uZykgbXdxLT5kYXRhOwotCQlzdHJ1Y3Qgc2FzX2hhX3N0cnVjdCAqc2FzX2hhID0gbXZpLT5zYXM7Ci0JCXN0cnVjdCBtdnNfcGh5ICpwaHkgPSAmbXZpLT5waHlbcGh5X25vXTsKLQkJc3RydWN0IGFzZF9zYXNfcGh5ICpzYXNfcGh5ID0gJnBoeS0+c2FzX3BoeTsKIAogCQlpZiAocGh5LT5waHlfZXZlbnQgJiBQSFlfUExVR19PVVQpIHsKIAkJCXUzMiB0bXA7CkBAIC0yMTM5LDYgKzIwNTIsMTEgQEAKIAkJCQltdl9kcHJpbnRrKCJwaHklZCBBdHRhY2hlZCBEZXZpY2VcbiIsIHBoeV9ubyk7CiAJCQl9CiAJCX0KKwl9IGVsc2UgaWYgKG13cS0+aGFuZGxlciAmIEVYUF9CUkNUX0NIRykgeworCQlwaHktPnBoeV9ldmVudCAmPSB+RVhQX0JSQ1RfQ0hHOworCQlzYXNfaGEtPm5vdGlmeV9wb3J0X2V2ZW50KHNhc19waHksCisJCQkJUE9SVEVfQlJPQURDQVNUX1JDVkQpOworCQltdl9kcHJpbnRrKCJwaHklZCBHb3QgQnJvYWRjYXN0IENoYW5nZVxuIiwgcGh5X25vKTsKIAl9CiAJbGlzdF9kZWwoJm13cS0+ZW50cnkpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm12aS0+bG9jaywgZmxhZ3MpOwpAQCAtMjE3NCwyOSArMjA5MiwyMSBAQAogCQlpZiAoJm12aS0+cGh5W3BoeV9ub10gPT0gcGh5KSB7CiAJCQltdl9kcHJpbnRrKCJHZXQgc2lnbmF0dXJlIHRpbWUgb3V0LCByZXNldCBwaHkgJWRcbiIsCiAJCQkJcGh5X25vK212aS0+aWQqbXZpLT5jaGlwLT5uX3BoeSk7Ci0JCQlNVlNfQ0hJUF9ESVNQLT5waHlfcmVzZXQobXZpLCBwaHlfbm8sIDEpOworCQkJTVZTX0NISVBfRElTUC0+cGh5X3Jlc2V0KG12aSwgcGh5X25vLCBNVlNfSEFSRF9SRVNFVCk7CiAJCX0KIAl9CiB9CiAKLXN0YXRpYyB2b2lkIG12c19zaWdfcmVtb3ZlX3RpbWVyKHN0cnVjdCBtdnNfcGh5ICpwaHkpCi17Ci0JaWYgKHBoeS0+dGltZXIuZnVuY3Rpb24pCi0JCWRlbF90aW1lcigmcGh5LT50aW1lcik7Ci0JcGh5LT50aW1lci5mdW5jdGlvbiA9IE5VTEw7Ci19Ci0KIHZvaWQgbXZzX2ludF9wb3J0KHN0cnVjdCBtdnNfaW5mbyAqbXZpLCBpbnQgcGh5X25vLCB1MzIgZXZlbnRzKQogewogCXUzMiB0bXA7Ci0Jc3RydWN0IHNhc19oYV9zdHJ1Y3QgKnNhc19oYSA9IG12aS0+c2FzOwogCXN0cnVjdCBtdnNfcGh5ICpwaHkgPSAmbXZpLT5waHlbcGh5X25vXTsKLQlzdHJ1Y3QgYXNkX3Nhc19waHkgKnNhc19waHkgPSAmcGh5LT5zYXNfcGh5OwogCiAJcGh5LT5pcnFfc3RhdHVzID0gTVZTX0NISVBfRElTUC0+cmVhZF9wb3J0X2lycV9zdGF0KG12aSwgcGh5X25vKTsKLQltdl9kcHJpbnRrKCJwb3J0ICVkIGN0cmwgc3RzPTB4JVguXG4iLCBwaHlfbm8rbXZpLT5pZCptdmktPmNoaXAtPm5fcGh5LAorCU1WU19DSElQX0RJU1AtPndyaXRlX3BvcnRfaXJxX3N0YXQobXZpLCBwaHlfbm8sIHBoeS0+aXJxX3N0YXR1cyk7CisJbXZfZHByaW50aygicGh5ICVkIGN0cmwgc3RzPTB4JTA4WC5cbiIsIHBoeV9ubyttdmktPmlkKm12aS0+Y2hpcC0+bl9waHksCiAJCU1WU19DSElQX0RJU1AtPnJlYWRfcGh5X2N0bChtdmksIHBoeV9ubykpOwotCW12X2RwcmludGsoIlBvcnQgJWQgaXJxIHN0cyA9IDB4JVhcbiIsIHBoeV9ubyttdmktPmlkKm12aS0+Y2hpcC0+bl9waHksCisJbXZfZHByaW50aygicGh5ICVkIGlycSBzdHMgPSAweCUwOFhcbiIsIHBoeV9ubyttdmktPmlkKm12aS0+Y2hpcC0+bl9waHksCiAJCXBoeS0+aXJxX3N0YXR1cyk7CiAKIAkvKgpAQCAtMjIwNSwxMSArMjExNSwxMiBAQAogCSovCiAKIAlpZiAocGh5LT5pcnFfc3RhdHVzICYgUEhZRVZfRENEUl9FUlIpIHsKLQkJbXZfZHByaW50aygicG9ydCAlZCBTVFAgZGVjb2RpbmcgZXJyb3IuXG4iLAorCQltdl9kcHJpbnRrKCJwaHkgJWQgU1RQIGRlY29kaW5nIGVycm9yLlxuIiwKIAkJcGh5X25vICsgbXZpLT5pZCptdmktPmNoaXAtPm5fcGh5KTsKIAl9CiAKIAlpZiAocGh5LT5pcnFfc3RhdHVzICYgUEhZRVZfUE9PRikgeworCQltZGVsYXkoNTAwKTsKIAkJaWYgKCEocGh5LT5waHlfZXZlbnQgJiBQSFlfUExVR19PVVQpKSB7CiAJCQlpbnQgZGV2X3NhdGEgPSBwaHktPnBoeV90eXBlICYgUE9SVF9UWVBFX1NBVEE7CiAJCQlpbnQgcmVhZHk7CkBAIC0yMjIwLDE3ICsyMTMxLDEzIEBACiAJCQkJKHZvaWQgKikodW5zaWduZWQgbG9uZylwaHlfbm8sCiAJCQkJUEhZX1BMVUdfRVZFTlQpOwogCQkJcmVhZHkgPSBtdnNfaXNfcGh5X3JlYWR5KG12aSwgcGh5X25vKTsKLQkJCWlmICghcmVhZHkpCi0JCQkJbXZfZHByaW50aygicGh5JWQgVW5wbHVnIE5vdGljZVxuIiwKLQkJCQkJcGh5X25vICsKLQkJCQkJbXZpLT5pZCAqIG12aS0+Y2hpcC0+bl9waHkpOwogCQkJaWYgKHJlYWR5IHx8IGRldl9zYXRhKSB7CiAJCQkJaWYgKE1WU19DSElQX0RJU1AtPnN0cF9yZXNldCkKIAkJCQkJTVZTX0NISVBfRElTUC0+c3RwX3Jlc2V0KG12aSwKIAkJCQkJCQlwaHlfbm8pOwogCQkJCWVsc2UKIAkJCQkJTVZTX0NISVBfRElTUC0+cGh5X3Jlc2V0KG12aSwKLQkJCQkJCQlwaHlfbm8sIDApOworCQkJCQkJCXBoeV9ubywgTVZTX1NPRlRfUkVTRVQpOwogCQkJCXJldHVybjsKIAkJCX0KIAkJfQpAQCAtMjI0MywxMyArMjE1MCwxMiBAQAogCQlpZiAocGh5LT50aW1lci5mdW5jdGlvbiA9PSBOVUxMKSB7CiAJCQlwaHktPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylwaHk7CiAJCQlwaHktPnRpbWVyLmZ1bmN0aW9uID0gbXZzX3NpZ190aW1lX291dDsKLQkJCXBoeS0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAxMCpIWjsKKwkJCXBoeS0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyA1KkhaOwogCQkJYWRkX3RpbWVyKCZwaHktPnRpbWVyKTsKIAkJfQogCX0KIAlpZiAocGh5LT5pcnFfc3RhdHVzICYgKFBIWUVWX1NJR19GSVMgfCBQSFlFVl9JRF9ET05FKSkgewogCQlwaHktPnBoeV9zdGF0dXMgPSBtdnNfaXNfcGh5X3JlYWR5KG12aSwgcGh5X25vKTsKLQkJbXZzX3NpZ19yZW1vdmVfdGltZXIocGh5KTsKIAkJbXZfZHByaW50aygibm90aWZ5IHBsdWcgaW4gb24gcGh5WyVkXVxuIiwgcGh5X25vKTsKIAkJaWYgKHBoeS0+cGh5X3N0YXR1cykgewogCQkJbWRlbGF5KDEwKTsKQEAgLTIyNjMsMTQgKzIxNjksMTQgQEAKIAkJCX0KIAkJCW12c191cGRhdGVfcGh5aW5mbyhtdmksIHBoeV9ubywgMCk7CiAJCQlpZiAocGh5LT5waHlfdHlwZSAmIFBPUlRfVFlQRV9TQVMpIHsKLQkJCQlNVlNfQ0hJUF9ESVNQLT5waHlfcmVzZXQobXZpLCBwaHlfbm8sIDIpOworCQkJCU1WU19DSElQX0RJU1AtPnBoeV9yZXNldChtdmksIHBoeV9ubywgTVZTX1BIWV9UVU5FKTsKIAkJCQltZGVsYXkoMTApOwogCQkJfQogCiAJCQltdnNfYnl0ZXNfZG1hZWQobXZpLCBwaHlfbm8pOwogCQkJLyogd2hldGhlciBkcml2ZXIgaXMgZ29pbmcgdG8gaGFuZGxlIGhvdCBwbHVnICovCiAJCQlpZiAocGh5LT5waHlfZXZlbnQgJiBQSFlfUExVR19PVVQpIHsKLQkJCQltdnNfcG9ydF9ub3RpZnlfZm9ybWVkKHNhc19waHksIDApOworCQkJCW12c19wb3J0X25vdGlmeV9mb3JtZWQoJnBoeS0+c2FzX3BoeSwgMCk7CiAJCQkJcGh5LT5waHlfZXZlbnQgJj0gflBIWV9QTFVHX09VVDsKIAkJCX0KIAkJfSBlbHNlIHsKQEAgLTIyNzgsMTMgKzIxODQsMTEgQEAKIAkJCQlwaHlfbm8gKyBtdmktPmlkKm12aS0+Y2hpcC0+bl9waHkpOwogCQl9CiAJfSBlbHNlIGlmIChwaHktPmlycV9zdGF0dXMgJiBQSFlFVl9CUk9BRF9DSCkgewotCQltdl9kcHJpbnRrKCJwb3J0ICVkIGJyb2FkY2FzdCBjaGFuZ2UuXG4iLAorCQltdl9kcHJpbnRrKCJwaHkgJWQgYnJvYWRjYXN0IGNoYW5nZS5cbiIsCiAJCQlwaHlfbm8gKyBtdmktPmlkKm12aS0+Y2hpcC0+bl9waHkpOwotCQkvKiBleGNlcHRpb24gZm9yIFNhbXN1bmcgZGlzayBkcml2ZSovCi0JCW1kZWxheSgxMDAwKTsKLQkJc2FzX2hhLT5ub3RpZnlfcG9ydF9ldmVudChzYXNfcGh5LCBQT1JURV9CUk9BRENBU1RfUkNWRCk7CisJCW12c19oYW5kbGVfZXZlbnQobXZpLCAodm9pZCAqKSh1bnNpZ25lZCBsb25nKXBoeV9ubywKKwkJCQlFWFBfQlJDVF9DSEcpOwogCX0KLQlNVlNfQ0hJUF9ESVNQLT53cml0ZV9wb3J0X2lycV9zdGF0KG12aSwgcGh5X25vLCBwaHktPmlycV9zdGF0dXMpOwogfQogCiBpbnQgbXZzX2ludF9yeChzdHJ1Y3QgbXZzX2luZm8gKm12aSwgYm9vbCBzZWxmX2NsZWFyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL212c2FzL212X3Nhcy5oIGIvZHJpdmVycy9zY3NpL212c2FzL212X3Nhcy5oCmluZGV4IDEzNjdkOGIuLjQ0ZDc4ODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9tdnNhcy9tdl9zYXMuaAorKysgYi9kcml2ZXJzL3Njc2kvbXZzYXMvbXZfc2FzLmgKQEAgLTQ4LDEyICs0OCw4IEBACiAKICNkZWZpbmUgRFJWX05BTUUJCSJtdnNhcyIKICNkZWZpbmUgRFJWX1ZFUlNJT04JCSIwLjguMiIKLSNkZWZpbmUgX01WX0RVTVAJCTAKICNkZWZpbmUgTVZTX0lEX05PVF9NQVBQRUQJMHg3ZgotLyogI2RlZmluZSBESVNBQkxFX0hPVFBMVUdfRE1BX0ZJWCAqLwotLy8gI2RlZmluZSBNQVhfRVhQX1JVTk5JTkdfUkVRCTIKICNkZWZpbmUgV0lERV9QT1JUX01BWF9QSFkJCTQKLSNkZWZpbmUJTVZfRElTQUJMRV9OQ1EJMAogI2RlZmluZSBtdl9wcmludGsoZm10LCBhcmcgLi4uKQlcCiAJcHJpbnRrKEtFUk5fREVCVUciJXMgJWQ6IiBmbXQsIF9fRklMRV9fLCBfX0xJTkVfXywgIyMgYXJnKQogI2lmZGVmIE1WX0RFQlVHCkBAIC02NCw2ICs2MCw3IEBACiAjZW5kaWYKICNkZWZpbmUgTVZfTUFYX1UzMgkJCTB4ZmZmZmZmZmYKIAorZXh0ZXJuIGludCBpbnRlcnJ1cHRfY29hbGVzY2luZzsKIGV4dGVybiBzdHJ1Y3QgbXZzX3RndF9pbml0aWF0b3IgbXZzX3RndDsKIGV4dGVybiBzdHJ1Y3QgbXZzX2luZm8gKnRndF9tdmk7CiBleHRlcm4gY29uc3Qgc3RydWN0IG12c19kaXNwYXRjaCBtdnNfNjR4eF9kaXNwYXRjaDsKQEAgLTk5LDYgKzk2LDExIEBACiAJTVZTX0RFVl9FSAk9IDB4MSwKIH07CiAKK2VudW0gZGV2X3Jlc2V0IHsKKwlNVlNfU09GVF9SRVNFVAk9IDAsCisJTVZTX0hBUkRfUkVTRVQJPSAxLAorCU1WU19QSFlfVFVORQk9IDIsCit9OwogCiBzdHJ1Y3QgbXZzX2luZm87CiAKQEAgLTEzMCw3ICsxMzIsNiBAQAogCXUzMiAoKnJlYWRfcG9ydF9pcnFfbWFzaykoc3RydWN0IG12c19pbmZvICptdmksIHUzMiBwb3J0KTsKIAl2b2lkICgqd3JpdGVfcG9ydF9pcnFfbWFzaykoc3RydWN0IG12c19pbmZvICptdmksIHUzMiBwb3J0LCB1MzIgdmFsKTsKIAotCXZvaWQgKCpnZXRfc2FzX2FkZHIpKHZvaWQgKmJ1ZiwgdTMyIGJ1Zmxlbik7CiAJdm9pZCAoKmNvbW1hbmRfYWN0aXZlKShzdHJ1Y3QgbXZzX2luZm8gKm12aSwgdTMyIHNsb3RfaWR4KTsKIAl2b2lkICgqY2xlYXJfc3JzX2lycSkoc3RydWN0IG12c19pbmZvICptdmksIHU4IHJlZ19zZXQsIHU4IGNsZWFyX2FsbCk7CiAJdm9pZCAoKmlzc3VlX3N0b3ApKHN0cnVjdCBtdnNfaW5mbyAqbXZpLCBlbnVtIG12c19wb3J0X3R5cGUgdHlwZSwKQEAgLTE2Nyw5ICsxNjgsMTAgQEAKIAkJCQkJCSk7CiAJaW50ICgqc3BpX2lzc3VlY21kKShzdHJ1Y3QgbXZzX2luZm8gKm12aSwgdTMyIGNtZCk7CiAJaW50ICgqc3BpX3dhaXRkYXRhcmVhZHkpKHN0cnVjdCBtdnNfaW5mbyAqbXZpLCB1MzIgdGltZW91dCk7Ci0jaWZuZGVmIERJU0FCTEVfSE9UUExVR19ETUFfRklYCi0Jdm9pZCAoKmRtYV9maXgpKGRtYV9hZGRyX3QgYnVmX2RtYSwgaW50IGJ1Zl9sZW4sIGludCBmcm9tLCB2b2lkICpwcmQpOwotI2VuZGlmCisJdm9pZCAoKmRtYV9maXgpKHN0cnVjdCBtdnNfaW5mbyAqbXZpLCB1MzIgcGh5X21hc2ssCisJCQkJaW50IGJ1Zl9sZW4sIGludCBmcm9tLCB2b2lkICpwcmQpOworCXZvaWQgKCp0dW5lX2ludGVycnVwdCkoc3RydWN0IG12c19pbmZvICptdmksIHUzMiB0aW1lKTsKKwl2b2lkICgqbm9uX3NwZWNfbmNxX2Vycm9yKShzdHJ1Y3QgbXZzX2luZm8gKm12aSk7CiAKIH07CiAKQEAgLTE3OSw5ICsxODEsMTEgQEAKIAl1MzIgCQlmaXNfb2ZmczsKIAl1MzIgCQlmaXNfY291bnQ7CiAJdTMyIAkJc3JzX3N6OworCXUzMgkJc2dfd2lkdGg7CiAJdTMyIAkJc2xvdF93aWR0aDsKIAljb25zdCBzdHJ1Y3QgbXZzX2Rpc3BhdGNoICpkaXNwYXRjaDsKIH07CisjZGVmaW5lIE1WU19NQVhfU0cJCSgxVSA8PCBtdmktPmNoaXAtPnNnX3dpZHRoKQogI2RlZmluZSBNVlNfQ0hJUF9TTE9UX1NaCSgxVSA8PCBtdmktPmNoaXAtPnNsb3Rfd2lkdGgpCiAjZGVmaW5lIE1WU19SWF9GSVNMX1NaCQlcCiAJKG12aS0+Y2hpcC0+ZmlzX29mZnMgKyAobXZpLT5jaGlwLT5maXNfY291bnQgKiAweDEwMCkpCkBAIC0yNDksNiArMjUzLDczIEBACiAJdTE2IHJlc2VydmVkOwogfTsKIAorLyogR2VuZXJhdGUgIFBIWSB0dW5uaW5nIHBhcmFtZXRlcnMgKi8KK3N0cnVjdCBwaHlfdHVuaW5nIHsKKwkvKiAxIGJpdCwgIHRyYW5zbWl0dGVyIGVtcGhhc2lzIGVuYWJsZQkqLworCXU4CXRyYW5zX2VtcF9lbjoxOworCS8qIDQgYml0cywgdHJhbnNtaXR0ZXIgZW1waGFzaXMgYW1wbGl0dWRlICovCisJdTgJdHJhbnNfZW1wX2FtcDo0OworCS8qIDMgYml0cywgcmVzZXJ2ZWQgc3BhY2UgKi8KKwl1OAlSZXNlcnZlZF8yYml0XzE6MzsKKwkvKiA1IGJpdHMsIHRyYW5zbWl0dGVyIGFtcGxpdHVkZSAqLworCXU4CXRyYW5zX2FtcDo1OworCS8qIDIgYml0cywgdHJhbnNtaXR0ZXIgYW1wbGl0dWRlIGFkanVzdCAqLworCXU4CXRyYW5zX2FtcF9hZGo6MjsKKwkvKiAxIGJpdCwgcmVzZXJ2ZWQgc3BhY2UgKi8KKwl1OAlyZXN2XzJiaXRfMjoxOworCS8qIDIgYnl0ZXMsIHJlc2VydmVkIHNwYWNlICovCisJdTgJcmVzZXJ2ZWRbMl07Cit9OworCitzdHJ1Y3QgZmZlX2NvbnRyb2wgeworCS8qIDQgYml0cywgIEZGRSBDYXBhY2l0b3IgU2VsZWN0ICAodmFsdWUgcmFuZ2UgMH5GKSAgKi8KKwl1OCBmZmVfY2FwX3NlbDo0OworCS8qIDMgYml0cywgIEZGRSBSZXNpc3RvciBTZWxlY3QgKHZhbHVlIHJhbmdlIDB+NykgKi8KKwl1OCBmZmVfcnNzX3NlbDozOworCS8qIDEgYml0IHJlc2VydmUqLworCXU4IHJlc2VydmVkOjE7Cit9OworCisvKgorICogSEJBX0luZm9fUGFnZSBpcyBzYXZlZCBpbiBGbGFzaC9OVlJBTSwgdG90YWwgMjU2IGJ5dGVzLgorICogVGhlIGRhdGEgYXJlYSBpcyB2YWxpZCBvbmx5IFNpZ25hdHVyZT0iTVJWTCIuCisgKiBJZiBhbnkgbWVtYmVyIGZpbGxzIHdpdGggMHhGRiwgdGhlIG1lbWJlciBpcyBpbnZhbGlkLgorICovCitzdHJ1Y3QgaGJhX2luZm9fcGFnZSB7CisJLyogRHdvcmQgMCAqLworCS8qIDQgYnl0ZXMsIHN0cnVjdHVyZSBzaWduYXR1cmUsc2hvdWxkIGJlICJNUlZMIiBhdCBmaXJzdCBpbml0aWFsICovCisJdTggc2lnbmF0dXJlWzRdOworCisJLyogRHdvcmQgMS0xMyAqLworCXUzMiByZXNlcnZlZDFbMTNdOworCisJLyogRHdvcmQgMTQtMjkgKi8KKwkvKiA2NCBieXRlcywgU0FTIGFkZHJlc3MgZm9yIGVhY2ggcG9ydCAqLworCXU2NCBzYXNfYWRkcls4XTsKKworCS8qIER3b3JkIDMwLTMxICovCisJLyogOCBieXRlcyBmb3IgdmFuaXIgOCBwb3J0IFBIWSBGRkUgc2VldGluZworCSAqIEJJVCAwfjMgOiBGRkUgQ2FwYWNpdG9yIHNlbGVjdCh2YWx1ZSByYW5nZSAwfkYpCisJICogQklUIDR+NiA6IEZGRSBSZXNpc3RvciBzZWxlY3QodmFsdWUgcmFuZ2UgMH43KQorCSAqIEJJVCA3OiByZXNlcnZlLgorCSAqLworCisJc3RydWN0IGZmZV9jb250cm9sICBmZmVfY3RsWzhdOworCS8qIER3b3JkIDMyIC00MyAqLworCXUzMiByZXNlcnZlZDJbMTJdOworCisJLyogRHdvcmQgNDQtNDUgKi8KKwkvKiA4IGJ5dGVzLCAgMDogIDEuNUcsIDE6IDMuMEcsIHNob3VsZCBiZSAweDAxIGF0IGZpcnN0IGluaXRpYWwgKi8KKwl1OCBwaHlfcmF0ZVs4XTsKKworCS8qIER3b3JkIDQ2LTUzICovCisJLyogMzIgYnl0ZXMsIFBIWSB0dW5pbmcgcGFyYW1ldGVycyBmb3IgZWFjaCBQSFkqLworCXN0cnVjdCBwaHlfdHVuaW5nICAgcGh5X3R1bmluZ1s4XTsKKworCS8qIER3b3JkIDU0LTYzICovCisJdTMyIHJlc2VydmVkM1sxMF07Cit9OwkvKiB0b3RhbCAyNTYgYnl0ZXMgKi8KKwogc3RydWN0IG12c19zbG90X2luZm8gewogCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7CiAJdW5pb24gewpAQCAtMjY0LDkgKzMzNSw2IEBACiAJICovCiAJdm9pZCAqYnVmOwogCWRtYV9hZGRyX3QgYnVmX2RtYTsKLSNpZiBfTVZfRFVNUAotCXUzMiBjbWRfc2l6ZTsKLSNlbmRpZgogCXZvaWQgKnJlc3BvbnNlOwogCXN0cnVjdCBtdnNfcG9ydCAqcG9ydDsKIAlzdHJ1Y3QgbXZzX2RldmljZQkqZGV2aWNlOwpAQCAtMzIwLDEyICszODgsMTAgQEAKIAljb25zdCBzdHJ1Y3QgbXZzX2NoaXBfaW5mbyAqY2hpcDsKIAogCWludCB0YWdzX251bTsKLQlERUNMQVJFX0JJVE1BUCh0YWdzLCBNVlNfU0xPVFMpOworCXVuc2lnbmVkIGxvbmcgKnRhZ3M7CiAJLyogZnVydGhlciBwZXItc2xvdCBpbmZvcm1hdGlvbiAqLwogCXN0cnVjdCBtdnNfcGh5IHBoeVtNVlNfTUFYX1BIWVNdOwogCXN0cnVjdCBtdnNfcG9ydCBwb3J0W01WU19NQVhfUEhZU107Ci0JdTMyIGlycTsKLQl1MzIgZXhwX3JlcTsKIAl1MzIgaWQ7CiAJdTY0IHNhdGFfcmVnX3NldDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpoYmFfbGlzdDsKQEAgLTMzNywxMiArNDAzLDEzIEBACiAJdTMyIGZsYXNoc2VjdFNpemU7CiAKIAl2b2lkICphZGRvbjsKKwlzdHJ1Y3QgaGJhX2luZm9fcGFnZSBoYmFfaW5mb19wYXJhbTsKIAlzdHJ1Y3QgbXZzX2RldmljZQlkZXZpY2VzW01WU19NQVhfREVWSUNFU107Ci0jaWZuZGVmIERJU0FCTEVfSE9UUExVR19ETUFfRklYCiAJdm9pZCAqYnVsa19idWZmZXI7CiAJZG1hX2FkZHJfdCBidWxrX2J1ZmZlcl9kbWE7CisJdm9pZCAqYnVsa19idWZmZXIxOworCWRtYV9hZGRyX3QgYnVsa19idWZmZXJfZG1hMTsKICNkZWZpbmUgVFJBU0hfQlVDS0VUX1NJWkUgICAgCTB4MjAwMDAKLSNlbmRpZgogCXZvaWQgKmRtYV9wb29sOwogCXN0cnVjdCBtdnNfc2xvdF9pbmZvIHNsb3RfaW5mb1swXTsKIH07CkBAIC0zNTAsOCArNDE3LDEwIEBACiBzdHJ1Y3QgbXZzX3Bydl9pbmZvewogCXU4IG5faG9zdDsKIAl1OCBuX3BoeTsKLQl1MTYgcmVzZXJ2ZTsKKwl1OCBzY2FuX2ZpbmlzaGVkOworCXU4IHJlc2VydmU7CiAJc3RydWN0IG12c19pbmZvICptdmlbMl07CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IG12X3Rhc2tsZXQ7CiB9OwogCiBzdHJ1Y3QgbXZzX3dxIHsKQEAgLTQxNSw2ICs0ODQsNiBAQAogdm9pZCBtdnNfaW50X3BvcnQoc3RydWN0IG12c19pbmZvICptdmksIGludCBwaHlfbm8sIHUzMiBldmVudHMpOwogdm9pZCBtdnNfdXBkYXRlX3BoeWluZm8oc3RydWN0IG12c19pbmZvICptdmksIGludCBpLCBpbnQgZ2V0X3N0KTsKIGludCBtdnNfaW50X3J4KHN0cnVjdCBtdnNfaW5mbyAqbXZpLCBib29sIHNlbGZfY2xlYXIpOwotdm9pZCBtdnNfaGV4ZHVtcCh1MzIgc2l6ZSwgdTggKmRhdGEsIHUzMiBiYXNlYWRkcik7CitzdHJ1Y3QgbXZzX2RldmljZSAqbXZzX2ZpbmRfZGV2X2J5X3JlZ19zZXQoc3RydWN0IG12c19pbmZvICptdmksIHU4IHJlZ19zZXQpOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9wbWNyYWlkLmMgYi9kcml2ZXJzL3Njc2kvcG1jcmFpZC5jCmluZGV4IGZjYTZhODkuLmQwNzlmOWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9wbWNyYWlkLmMKKysrIGIvZHJpdmVycy9zY3NpL3BtY3JhaWQuYwpAQCAtMzg3MSw2ICszODcxLDkgQEAKIAkJCXBtY3JhaWRfZXJyKCJjb3VsZG4ndCBidWlsZCBwYXNzdGhyb3VnaCBpb2FkbHNcbiIpOwogCQkJZ290byBvdXRfZnJlZV9idWZmZXI7CiAJCX0KKwl9IGVsc2UgaWYgKHJlcXVlc3Rfc2l6ZSA8IDApIHsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dF9mcmVlX2J1ZmZlcjsKIAl9CiAKIAkvKiBJZiBkYXRhIGlzIGJlaW5nIHdyaXR0ZW4gaW50byB0aGUgZGV2aWNlLCBjb3B5IHRoZSBkYXRhIGZyb20gdXNlcgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMKaW5kZXggNTMyMzEzZS4uNzgzNmViMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jCkBAIC00Miw4ICs0Miw4IEBACiAJaW50IHJlYWRpbmc7CiAKIAlpZiAoSVNfUUxBODJYWChoYSkpIHsKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCSJGaXJtd2FyZSBkdW1wIG5vdCBzdXBwb3J0ZWQgZm9yIElTUDgyeHhcbiIpKTsKKwkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzA1YiwKKwkJICAgICJGaXJtd2FyZSBkdW1wIG5vdCBzdXBwb3J0ZWQgZm9yIElTUDgyeHhcbiIpOwogCQlyZXR1cm4gY291bnQ7CiAJfQogCkBAIC01Niw3ICs1Niw3IEBACiAJCWlmICghaGEtPmZ3X2R1bXBfcmVhZGluZykKIAkJCWJyZWFrOwogCi0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4NzA1ZCwKIAkJICAgICJGaXJtd2FyZSBkdW1wIGNsZWFyZWQgb24gKCVsZCkuXG4iLCB2aGEtPmhvc3Rfbm8pOwogCiAJCWhhLT5md19kdW1wX3JlYWRpbmcgPSAwOwpAQCAtNjYsNyArNjYsNyBAQAogCQlpZiAoaGEtPmZ3X2R1bXBlZCAmJiAhaGEtPmZ3X2R1bXBfcmVhZGluZykgewogCQkJaGEtPmZ3X2R1bXBfcmVhZGluZyA9IDE7CiAKLQkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDcwNWUsCiAJCQkgICAgIlJhdyBmaXJtd2FyZSBkdW1wIHJlYWR5IGZvciByZWFkIG9uICglbGQpLlxuIiwKIAkJCSAgICB2aGEtPmhvc3Rfbm8pOwogCQl9CkBAIC0xNDgsNyArMTQ4LDcgQEAKIAl9CiAKIAlpZiAocWxhMngwMF93YWl0X2Zvcl9oYmFfb25saW5lKHZoYSkgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDVmLAogCQkgICAgIkhCQSBub3Qgb25saW5lLCBmYWlsaW5nIE5WUkFNIHVwZGF0ZS5cbiIpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9CkBAIC0xNTgsNiArMTU4LDggQEAKIAloYS0+aXNwX29wcy0+cmVhZF9udnJhbSh2aGEsICh1aW50OF90ICopaGEtPm52cmFtLCBoYS0+bnZyYW1fYmFzZSwKIAkgICAgY291bnQpOwogCisJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzA2MCwKKwkgICAgIlNldHRpbmcgSVNQX0FCT1JUX05FRURFRFxuIik7CiAJLyogTlZSQU0gc2V0dGluZ3MgdGFrZSBlZmZlY3QgaW1tZWRpYXRlbHkuICovCiAJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwogCXFsYTJ4eHhfd2FrZV9kcGModmhhKTsKQEAgLTI1NSw5ICsyNTcsOSBAQAogCiAJCWhhLT5vcHRyb21fc3RhdGUgPSBRTEFfU1dBSVRJTkc7CiAKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzA2MSwKIAkJICAgICJGcmVlaW5nIGZsYXNoIHJlZ2lvbiBhbGxvY2F0aW9uIC0tIDB4JXggYnl0ZXMuXG4iLAotCQkgICAgaGEtPm9wdHJvbV9yZWdpb25fc2l6ZSkpOworCQkgICAgaGEtPm9wdHJvbV9yZWdpb25fc2l6ZSk7CiAKIAkJdmZyZWUoaGEtPm9wdHJvbV9idWZmZXIpOwogCQloYS0+b3B0cm9tX2J1ZmZlciA9IE5VTEw7CkBAIC0yNzMsNyArMjc1LDcgQEAKIAkJaGEtPm9wdHJvbV9zdGF0ZSA9IFFMQV9TUkVBRElORzsKIAkJaGEtPm9wdHJvbV9idWZmZXIgPSB2bWFsbG9jKGhhLT5vcHRyb21fcmVnaW9uX3NpemUpOwogCQlpZiAoaGEtPm9wdHJvbV9idWZmZXIgPT0gTlVMTCkgewotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA2MiwKIAkJCSAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3B0cm9tIHJldHJpZXZhbCAiCiAJCQkgICAgIigleCkuXG4iLCBoYS0+b3B0cm9tX3JlZ2lvbl9zaXplKTsKIApAQCAtMjgyLDE0ICsyODQsMTQgQEAKIAkJfQogCiAJCWlmIChxbGEyeDAwX3dhaXRfZm9yX2hiYV9vbmxpbmUodmhhKSAhPSBRTEFfU1VDQ0VTUykgewotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJCSJIQkEgbm90IG9ubGluZSwgZmFpbGluZyBOVlJBTSB1cGRhdGUuXG4iKTsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwNjMsCisJCQkgICAgIkhCQSBub3Qgb25saW5lLCBmYWlsaW5nIE5WUkFNIHVwZGF0ZS5cbiIpOwogCQkJcmV0dXJuIC1FQUdBSU47CiAJCX0KIAotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDY0LAogCQkgICAgIlJlYWRpbmcgZmxhc2ggcmVnaW9uIC0tIDB4JXgvMHgleC5cbiIsCi0JCSAgICBoYS0+b3B0cm9tX3JlZ2lvbl9zdGFydCwgaGEtPm9wdHJvbV9yZWdpb25fc2l6ZSkpOworCQkgICAgaGEtPm9wdHJvbV9yZWdpb25fc3RhcnQsIGhhLT5vcHRyb21fcmVnaW9uX3NpemUpOwogCiAJCW1lbXNldChoYS0+b3B0cm9tX2J1ZmZlciwgMCwgaGEtPm9wdHJvbV9yZWdpb25fc2l6ZSk7CiAJCWhhLT5pc3Bfb3BzLT5yZWFkX29wdHJvbSh2aGEsIGhhLT5vcHRyb21fYnVmZmVyLApAQCAtMzI4LDcgKzMzMCw3IEBACiAJCWVsc2UgaWYgKElTX1FMQTI1WFgoaGEpIHx8IElTX1FMQThYWFhfVFlQRShoYSkpCiAJCQl2YWxpZCA9IDE7CiAJCWlmICghdmFsaWQpIHsKLQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwNjUsCiAJCQkgICAgIkludmFsaWQgc3RhcnQgcmVnaW9uIDB4JXgvMHgleC5cbiIsIHN0YXJ0LCBzaXplKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CkBAIC0zNDAsMTcgKzM0MiwxNyBAQAogCQloYS0+b3B0cm9tX3N0YXRlID0gUUxBX1NXUklUSU5HOwogCQloYS0+b3B0cm9tX2J1ZmZlciA9IHZtYWxsb2MoaGEtPm9wdHJvbV9yZWdpb25fc2l6ZSk7CiAJCWlmIChoYS0+b3B0cm9tX2J1ZmZlciA9PSBOVUxMKSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDY2LAogCQkJICAgICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBvcHRyb20gdXBkYXRlICIKLQkJCSAgICAiKCV4KS5cbiIsIGhhLT5vcHRyb21fcmVnaW9uX3NpemUpOworCQkJICAgICIoJXgpXG4iLCBoYS0+b3B0cm9tX3JlZ2lvbl9zaXplKTsKIAogCQkJaGEtPm9wdHJvbV9zdGF0ZSA9IFFMQV9TV0FJVElORzsKIAkJCXJldHVybiBjb3VudDsKIAkJfQogCi0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwNjcsCiAJCSAgICAiU3RhZ2luZyBmbGFzaCByZWdpb24gd3JpdGUgLS0gMHgleC8weCV4LlxuIiwKLQkJICAgIGhhLT5vcHRyb21fcmVnaW9uX3N0YXJ0LCBoYS0+b3B0cm9tX3JlZ2lvbl9zaXplKSk7CisJCSAgICBoYS0+b3B0cm9tX3JlZ2lvbl9zdGFydCwgaGEtPm9wdHJvbV9yZWdpb25fc2l6ZSk7CiAKIAkJbWVtc2V0KGhhLT5vcHRyb21fYnVmZmVyLCAwLCBoYS0+b3B0cm9tX3JlZ2lvbl9zaXplKTsKIAkJYnJlYWs7CkBAIC0zNTksMTQgKzM2MSwxNCBAQAogCQkJYnJlYWs7CiAKIAkJaWYgKHFsYTJ4MDBfd2FpdF9mb3JfaGJhX29ubGluZSh2aGEpICE9IFFMQV9TVUNDRVNTKSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDY4LAogCQkJICAgICJIQkEgbm90IG9ubGluZSwgZmFpbGluZyBmbGFzaCB1cGRhdGUuXG4iKTsKIAkJCXJldHVybiAtRUFHQUlOOwogCQl9CiAKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzA2OSwKIAkJICAgICJXcml0aW5nIGZsYXNoIHJlZ2lvbiAtLSAweCV4LzB4JXguXG4iLAotCQkgICAgaGEtPm9wdHJvbV9yZWdpb25fc3RhcnQsIGhhLT5vcHRyb21fcmVnaW9uX3NpemUpKTsKKwkJICAgIGhhLT5vcHRyb21fcmVnaW9uX3N0YXJ0LCBoYS0+b3B0cm9tX3JlZ2lvbl9zaXplKTsKIAogCQloYS0+aXNwX29wcy0+d3JpdGVfb3B0cm9tKHZoYSwgaGEtPm9wdHJvbV9idWZmZXIsCiAJCSAgICBoYS0+b3B0cm9tX3JlZ2lvbl9zdGFydCwgaGEtPm9wdHJvbV9yZWdpb25fc2l6ZSk7CkBAIC00MjUsNyArNDI3LDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlpZiAocWxhMngwMF93YWl0X2Zvcl9oYmFfb25saW5lKHZoYSkgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDZhLAogCQkgICAgIkhCQSBub3Qgb25saW5lLCBmYWlsaW5nIFZQRCB1cGRhdGUuXG4iKTsKIAkJcmV0dXJuIC1FQUdBSU47CiAJfQpAQCAtNDQwLDcgKzQ0Miw3IEBACiAKIAl0bXBfZGF0YSA9IHZtYWxsb2MoMjU2KTsKIAlpZiAoIXRtcF9kYXRhKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA2YiwKIAkJICAgICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBWUEQgaW5mb3JtYXRpb24gdXBkYXRlLlxuIik7CiAJCWdvdG8gZG9uZTsKIAl9CkBAIC00ODAsNyArNDgyLDcgQEAKIAloYS0+c2ZwX2RhdGEgPSBkbWFfcG9vbF9hbGxvYyhoYS0+c19kbWFfcG9vbCwgR0ZQX0tFUk5FTCwKIAkgICAgJmhhLT5zZnBfZGF0YV9kbWEpOwogCWlmICghaGEtPnNmcF9kYXRhKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA2YywKIAkJICAgICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBTRlAgcmVhZC1kYXRhLlxuIik7CiAJCXJldHVybiAwOwogCX0KQEAgLTQ5OSw5ICs1MDEsMTAgQEAKIAkJcnZhbCA9IHFsYTJ4MDBfcmVhZF9zZnAodmhhLCBoYS0+c2ZwX2RhdGFfZG1hLCBoYS0+c2ZwX2RhdGEsCiAJCSAgICBhZGRyLCBvZmZzZXQsIFNGUF9CTE9DS19TSVpFLCAwKTsKIAkJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwNmQsCiAJCQkgICAgIlVuYWJsZSB0byByZWFkIFNGUCBkYXRhICgleC8leC8leCkuXG4iLCBydmFsLAogCQkJICAgIGFkZHIsIG9mZnNldCk7CisKIAkJCWNvdW50ID0gMDsKIAkJCWJyZWFrOwogCQl9CkBAIC01MzgsOCArNTQxLDggQEAKIAl0eXBlID0gc2ltcGxlX3N0cnRvbChidWYsIE5VTEwsIDEwKTsKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIDB4MjAyNWM6Ci0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJICAgICJJc3N1aW5nIElTUCByZXNldCBvbiAoJWxkKS5cbiIsIHZoYS0+aG9zdF9ubyk7CisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDcwNmUsCisJCSAgICAiSXNzdWluZyBJU1AgcmVzZXQuXG4iKTsKIAogCQlzY3NpX2Jsb2NrX3JlcXVlc3RzKHZoYS0+aG9zdCk7CiAJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKQEAgLTU1MSw4ICs1NTQsOCBAQAogCQlpZiAoIUlTX1FMQTgxWFgoaGEpKQogCQkJYnJlYWs7CiAKLQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkgICAgIklzc3VpbmcgTVBJIHJlc2V0IG9uICglbGQpLlxuIiwgdmhhLT5ob3N0X25vKTsKKwkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4NzA2ZiwKKwkJICAgICJJc3N1aW5nIE1QSSByZXNldC5cbiIpOwogCiAJCS8qIE1ha2Ugc3VyZSBGQyBzaWRlIGlzIG5vdCBpbiByZXNldCAqLwogCQlxbGEyeDAwX3dhaXRfZm9yX2hiYV9vbmxpbmUodmhhKTsKQEAgLTU2MCwyMCArNTYzLDE5IEBACiAJCS8qIElzc3VlIE1QSSByZXNldCAqLwogCQlzY3NpX2Jsb2NrX3JlcXVlc3RzKHZoYS0+aG9zdCk7CiAJCWlmIChxbGE4MXh4X3Jlc3RhcnRfbXBpX2Zpcm13YXJlKHZoYSkgIT0gUUxBX1NVQ0NFU1MpCi0JCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkgICAgIk1QSSByZXNldCBmYWlsZWQgb24gKCVsZCkuXG4iLCB2aGEtPmhvc3Rfbm8pOworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA3MCwKKwkJCSAgICAiTVBJIHJlc2V0IGZhaWxlZC5cbiIpOwogCQlzY3NpX3VuYmxvY2tfcmVxdWVzdHModmhhLT5ob3N0KTsKIAkJYnJlYWs7CiAJY2FzZSAweDIwMjVlOgogCQlpZiAoIUlTX1FMQTgyWFgoaGEpIHx8IHZoYSAhPSBiYXNlX3ZoYSkgewotCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJICAgICJGQ29FIGN0eCByZXNldCBub3Qgc3VwcG9ydGVkIGZvciBob3N0JWxkLlxuIiwKLQkJCSAgICB2aGEtPmhvc3Rfbm8pOworCQkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4NzA3MSwKKwkJCSAgICAiRkNvRSBjdHggcmVzZXQgbm8gc3VwcG9ydGVkLlxuIik7CiAJCQlyZXR1cm4gY291bnQ7CiAJCX0KIAotCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCSAgICAiSXNzdWluZyBGQ29FIENUWCByZXNldCBvbiBob3N0JWxkLlxuIiwgdmhhLT5ob3N0X25vKTsKKwkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4NzA3MiwKKwkJICAgICJJc3N1aW5nIEZDb0UgY3R4IHJlc2V0LlxuIik7CiAJCXNldF9iaXQoRkNPRV9DVFhfUkVTRVRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwogCQlxbGEyeHh4X3dha2VfZHBjKHZoYSk7CiAJCXFsYTJ4MDBfd2FpdF9mb3JfZmNvZV9jdHhfcmVzZXQodmhhKTsKQEAgLTYxMSw4ICs2MTMsOCBAQAogCQloYS0+ZWRjX2RhdGEgPSBkbWFfcG9vbF9hbGxvYyhoYS0+c19kbWFfcG9vbCwgR0ZQX0tFUk5FTCwKIAkJICAgICZoYS0+ZWRjX2RhdGFfZG1hKTsKIAkJaWYgKCFoYS0+ZWRjX2RhdGEpIHsKLQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEVEQyB3cml0ZS5cbiIpKTsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwNzMsCisJCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEVEQyB3cml0ZS5cbiIpOwogCQkJcmV0dXJuIDA7CiAJCX0KIAl9CkBAIC02MzEsOSArNjMzLDkgQEAKIAlydmFsID0gcWxhMngwMF93cml0ZV9zZnAodmhhLCBoYS0+ZWRjX2RhdGFfZG1hLCBoYS0+ZWRjX2RhdGEsCiAJICAgIGRldiwgYWRyLCBsZW4sIG9wdCk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJICAgICJVbmFibGUgdG8gd3JpdGUgRURDICgleCkgJTAyeDolMDJ4OiUwNHg6JTAyeDolMDJ4LlxuIiwKLQkJICAgIHJ2YWwsIGRldiwgYWRyLCBvcHQsIGxlbiwgYnVmWzhdKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwNzQsCisJCSAgICAiVW5hYmxlIHRvIHdyaXRlIEVEQyAoJXgpICUwMng6JTA0eDolMDJ4OiUwMnhcbiIsCisJCSAgICBydmFsLCBkZXYsIGFkciwgb3B0LCBsZW4sIGJ1Zls4XSk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtNjY5LDggKzY3MSw4IEBACiAJCWhhLT5lZGNfZGF0YSA9IGRtYV9wb29sX2FsbG9jKGhhLT5zX2RtYV9wb29sLCBHRlBfS0VSTkVMLAogCQkgICAgJmhhLT5lZGNfZGF0YV9kbWEpOwogCQlpZiAoIWhhLT5lZGNfZGF0YSkgewotCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCSAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgRURDIHN0YXR1cy5cbiIpKTsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwOGMsCisJCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIEVEQyBzdGF0dXMuXG4iKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQpAQCAtNjg4LDkgKzY5MCw5IEBACiAJcnZhbCA9IHFsYTJ4MDBfcmVhZF9zZnAodmhhLCBoYS0+ZWRjX2RhdGFfZG1hLCBoYS0+ZWRjX2RhdGEsCiAJCQlkZXYsIGFkciwgbGVuLCBvcHQpOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCSAgICAiVW5hYmxlIHRvIHdyaXRlIEVEQyBzdGF0dXMgKCV4KSAlMDJ4OiUwMng6JTA0eDolMDJ4LlxuIiwKLQkJICAgIHJ2YWwsIGRldiwgYWRyLCBvcHQsIGxlbikpOworCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg3MDc1LAorCQkgICAgIlVuYWJsZSB0byB3cml0ZSBFREMgc3RhdHVzICgleCkgJTAyeDolMDR4OiUwMnguXG4iLAorCQkgICAgcnZhbCwgZGV2LCBhZHIsIG9wdCwgbGVuKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC03NDksNyArNzUxLDcgQEAKIAloYS0+eGdtYWNfZGF0YSA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgWEdNQUNfREFUQV9TSVpFLAogCSAgICAmaGEtPnhnbWFjX2RhdGFfZG1hLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWhhLT54Z21hY19kYXRhKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA3NiwKIAkJICAgICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBYR01BQyByZWFkLWRhdGEuXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtNzYxLDcgKzc2Myw3IEBACiAJcnZhbCA9IHFsYTJ4MDBfZ2V0X3hnbWFjX3N0YXRzKHZoYSwgaGEtPnhnbWFjX2RhdGFfZG1hLAogCSAgICBYR01BQ19EQVRBX1NJWkUsICZhY3R1YWxfc2l6ZSk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDc3LAogCQkgICAgIlVuYWJsZSB0byByZWFkIFhHTUFDIGRhdGEgKCV4KS5cbiIsIHJ2YWwpOwogCQljb3VudCA9IDA7CiAJfQpAQCAtODAxLDcgKzgwMyw3IEBACiAJaGEtPmRjYnhfdGx2ID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBEQ0JYX1RMVl9EQVRBX1NJWkUsCiAJICAgICZoYS0+ZGNieF90bHZfZG1hLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWhhLT5kY2J4X3RsdikgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwNzgsCiAJCSAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgRENCWCBUTFYgcmVhZC1kYXRhLlxuIik7CiAJCXJldHVybiAwOwogCX0KQEAgLTgxMyw4ICs4MTUsOCBAQAogCXJ2YWwgPSBxbGEyeDAwX2dldF9kY2J4X3BhcmFtcyh2aGEsIGhhLT5kY2J4X3Rsdl9kbWEsCiAJICAgIERDQlhfVExWX0RBVEFfU0laRSk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIlVuYWJsZSB0byByZWFkIERDQlggVExWIGRhdGEgKCV4KS5cbiIsIHJ2YWwpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDc5LAorCQkgICAgIlVuYWJsZSB0byByZWFkIERDQlggVExWICgleCkuXG4iLCBydmFsKTsKIAkJY291bnQgPSAwOwogCX0KIApAQCAtODY5LDkgKzg3MSwxMyBAQAogCQlyZXQgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJmhvc3QtPnNob3N0X2dlbmRldi5rb2JqLAogCQkgICAgaXRlci0+YXR0cik7CiAJCWlmIChyZXQpCi0JCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgdmhhLT5odywKLQkJCSAgICAiVW5hYmxlIHRvIGNyZWF0ZSBzeXNmcyAlcyBiaW5hcnkgYXR0cmlidXRlICIKLQkJCSAgICAiKCVkKS5cbiIsIGl0ZXItPm5hbWUsIHJldCk7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMGYzLAorCQkJICAgICJVbmFibGUgdG8gY3JlYXRlIHN5c2ZzICVzIGJpbmFyeSBhdHRyaWJ1dGUgKCVkKS5cbiIsCisJCQkgICAgaXRlci0+bmFtZSwgcmV0KTsKKwkJZWxzZQorCQkJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDBmNCwKKwkJCSAgICAiU3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgc3lzZnMgJXMgYmluYXJ5IGF0dHJpYnVyZS5cbiIsCisJCQkgICAgaXRlci0+bmFtZSk7CiAJfQogfQogCkBAIC0xMTI2LDcgKzExMzIsNyBAQAogCQlyZXR1cm4gLUVQRVJNOwogCiAJaWYgKHRlc3RfYml0KEFCT1JUX0lTUF9BQ1RJVkUsICZ2aGEtPmRwY19mbGFncykpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDdhLAogCQkgICAgIkFib3J0IElTUCBhY3RpdmUgLS0gaWdub3JpbmcgYmVhY29uIHJlcXVlc3QuXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC0xMzIyLDkgKzEzMjgsOCBAQAogCXRlbXAgPSBmcmFjID0gMDsKIAlpZiAodGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJnZoYS0+ZHBjX2ZsYWdzKSB8fAogCSAgICB0ZXN0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpKQotCQlERUJVRzJfM18xMShwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAiJXMoJWxkKTogaXNwIHJlc2V0IGluIHByb2dyZXNzLlxuIiwKLQkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA3YiwKKwkJICAgICJJU1AgcmVzZXQgYWN0aXZlLlxuIik7CiAJZWxzZSBpZiAoIXZoYS0+aHctPmZsYWdzLmVlaF9idXN5KQogCQlydmFsID0gcWxhMngwMF9nZXRfdGhlcm1hbF90ZW1wKHZoYSwgJnRlbXAsICZmcmFjKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKQEAgLTEzNDMsOCArMTM0OCw4IEBACiAKIAlpZiAodGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJnZoYS0+ZHBjX2ZsYWdzKSB8fAogCQl0ZXN0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpKQotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGlzcCByZXNldCBpbiBwcm9ncmVzcy5cbiIsCi0JCQlfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwN2MsCisJCSAgICAiSVNQIHJlc2V0IGFjdGl2ZS5cbiIpOwogCWVsc2UgaWYgKCF2aGEtPmh3LT5mbGFncy5lZWhfYnVzeSkKIAkJcnZhbCA9IHFsYTJ4MDBfZ2V0X2Zpcm13YXJlX3N0YXRlKHZoYSwgc3RhdGUpOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKQpAQCAtMTY0NSw4ICsxNjUwLDggQEAKIAogCXN0YXRzID0gZG1hX3Bvb2xfYWxsb2MoaGEtPnNfZG1hX3Bvb2wsIEdGUF9LRVJORUwsICZzdGF0c19kbWEpOwogCWlmIChzdGF0cyA9PSBOVUxMKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeS5cbiIsCi0JCSAgICBfX2Z1bmNfXywgYmFzZV92aGEtPmhvc3Rfbm8pKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA3ZCwKKwkJICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBzdGF0cy5cbiIpOwogCQlnb3RvIGRvbmU7CiAJfQogCW1lbXNldChzdGF0cywgMCwgRE1BX1BPT0xfU0laRSk7CkBAIC0xNzQ2LDE1ICsxNzUxLDE0IEBACiAKIAlyZXQgPSBxbGEyNHh4X3Zwb3J0X2NyZWF0ZV9yZXFfc2FuaXR5X2NoZWNrKGZjX3Zwb3J0KTsKIAlpZiAocmV0KSB7Ci0JCURFQlVHMTUocHJpbnRrKCJxbGEyNHh4X3Zwb3J0X2NyZWF0ZV9yZXFfc2FuaXR5X2NoZWNrIGZhaWxlZCwgIgotCQkgICAgInN0YXR1cyAleFxuIiwgcmV0KSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwN2UsCisJCSAgICAiVnBvcnQgc2FuaXR5IGNoZWNrIGZhaWxlZCwgc3RhdHVzICV4XG4iLCByZXQpOwogCQlyZXR1cm4gKHJldCk7CiAJfQogCiAJdmhhID0gcWxhMjR4eF9jcmVhdGVfdmhvc3QoZmNfdnBvcnQpOwogCWlmICh2aGEgPT0gTlVMTCkgewotCQlERUJVRzE1KHByaW50ayAoInFsYTI0eHhfY3JlYXRlX3Zob3N0IGZhaWxlZCwgdmhhID0gJXBcbiIsCi0JCSAgICB2aGEpKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA3ZiwgIlZwb3J0IGNyZWF0ZSBob3N0IGZhaWxlZC5cbiIpOwogCQlyZXR1cm4gRkNfVlBPUlRfRkFJTEVEOwogCX0KIAlpZiAoZGlzYWJsZSkgewpAQCAtMTc2NCw4ICsxNzY4LDggQEAKIAkJYXRvbWljX3NldCgmdmhhLT52cF9zdGF0ZSwgVlBfRkFJTEVEKTsKIAogCS8qIHJlYWR5IHRvIGNyZWF0ZSB2cG9ydCAqLwotCXFsYV9wcmludGsoS0VSTl9JTkZPLCB2aGEtPmh3LCAiVlAgZW50cnkgaWQgJWQgYXNzaWduZWQuXG4iLAotCQkJCQkJCXZoYS0+dnBfaWR4KTsKKwlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg3MDgwLAorCSAgICAiVlAgZW50cnkgaWQgJWQgYXNzaWduZWQuXG4iLCB2aGEtPnZwX2lkeCk7CiAKIAkvKiBpbml0aWFsaXplZCB2cG9ydCBzdGF0ZXMgKi8KIAlhdG9taWNfc2V0KCZ2aGEtPmxvb3Bfc3RhdGUsIExPT1BfRE9XTik7CkBAIC0xNzc1LDggKzE3NzksOCBAQAogCWlmIChhdG9taWNfcmVhZCgmYmFzZV92aGEtPmxvb3Bfc3RhdGUpID09IExPT1BfRE9XTiB8fAogCSAgICBhdG9taWNfcmVhZCgmYmFzZV92aGEtPmxvb3Bfc3RhdGUpID09IExPT1BfREVBRCkgewogCQkvKiBEb24ndCByZXRyeSBvciBhdHRlbXB0IGxvZ2luIG9mIHRoaXMgdmlydHVhbCBwb3J0ICovCi0JCURFQlVHMTUocHJpbnRrICgic2NzaSglbGQpOiBwcG9ydCBsb29wX3N0YXRlIGlzIG5vdCBVUC5cbiIsCi0JCSAgICBiYXNlX3ZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDgxLAorCQkgICAgIlZwb3J0IGxvb3Agc3RhdGUgaXMgbm90IFVQLlxuIik7CiAJCWF0b21pY19zZXQoJnZoYS0+bG9vcF9zdGF0ZSwgTE9PUF9ERUFEKTsKIAkJaWYgKCFkaXNhYmxlKQogCQkJZmNfdnBvcnRfc2V0X3N0YXRlKGZjX3Zwb3J0LCBGQ19WUE9SVF9MSU5LRE9XTik7CkBAIC0xNzg1LDkgKzE3ODksOCBAQAogCWlmICgoSVNfUUxBMjVYWChoYSkgfHwgSVNfUUxBODFYWChoYSkpICYmIHFsMnhlbmFibGVkaWYpIHsKIAkJaWYgKGhhLT5md19hdHRyaWJ1dGVzICYgQklUXzQpIHsKIAkJCXZoYS0+ZmxhZ3MuZGlmZGl4X3N1cHBvcnRlZCA9IDE7Ci0JCQlERUJVRzE4KHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCSAgICAiUmVnaXN0ZXJpbmcgZm9yIERJRi9ESVggdHlwZSAxIGFuZCAzIgotCQkJICAgICIgcHJvdGVjdGlvbi5cbiIpKTsKKwkJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwODIsCisJCQkgICAgIlJlZ2lzdGVyZWQgZm9yIERJRi9ESVggdHlwZSAxIGFuZCAzIHByb3RlY3Rpb24uXG4iKTsKIAkJCXNjc2lfaG9zdF9zZXRfcHJvdCh2aGEtPmhvc3QsCiAJCQkgICAgU0hPU1RfRElGX1RZUEUxX1BST1RFQ1RJT04KIAkJCSAgICB8IFNIT1NUX0RJRl9UWVBFMl9QUk9URUNUSU9OCkBAIC0xODAyLDggKzE4MDUsOCBAQAogCiAJaWYgKHNjc2lfYWRkX2hvc3Rfd2l0aF9kbWEodmhhLT5ob3N0LCAmZmNfdnBvcnQtPmRldiwKIAkJCQkgICAmaGEtPnBkZXYtPmRldikpIHsKLQkJREVCVUcxNShwcmludGsoInNjc2koJWxkKTogc2NzaV9hZGRfaG9zdCBmYWlsdXJlIGZvciBWUFslZF0uXG4iLAotCQkJdmhhLT5ob3N0X25vLCB2aGEtPnZwX2lkeCkpOworCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDgzLAorCQkgICAgInNjc2lfYWRkX2hvc3QgZmFpbHVyZSBmb3IgVlBbJWRdLlxuIiwgdmhhLT52cF9pZHgpOwogCQlnb3RvIHZwb3J0X2NyZWF0ZV9mYWlsZWRfMjsKIAl9CiAKQEAgLTE4MjAsNiArMTgyMywxMCBAQAogCiAJaWYgKGhhLT5mbGFncy5jcHVfYWZmaW5pdHlfZW5hYmxlZCkgewogCQlyZXEgPSBoYS0+cmVxX3FfbWFwWzFdOworCQlxbF9kYmcocWxfZGJnX211bHRpcSwgdmhhLCAweGMwMDAsCisJCSAgICAiUmVxdWVzdCBxdWV1ZSAlcCBhdHRhY2hlZCB3aXRoICIKKwkJICAgICJWUFslZF0sIGNwdSBhZmZpbml0eSA9JWRcbiIsCisJCSAgICByZXEsIHZoYS0+dnBfaWR4LCBoYS0+ZmxhZ3MuY3B1X2FmZmluaXR5X2VuYWJsZWQpOwogCQlnb3RvIHZwb3J0X3F1ZXVlOwogCX0gZWxzZSBpZiAocWwyeG1heHF1ZXVlcyA9PSAxIHx8ICFoYS0+bnBpdl9pbmZvKQogCQlnb3RvIHZwb3J0X3F1ZXVlOwpAQCAtMTgzNiwxMyArMTg0MywxNiBAQAogCQlyZXQgPSBxbGEyNXh4X2NyZWF0ZV9yZXFfcXVlKGhhLCBvcHRpb25zLCB2aGEtPnZwX2lkeCwgMCwgMCwKIAkJCXFvcyk7CiAJCWlmICghcmV0KQotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJIkNhbid0IGNyZWF0ZSByZXF1ZXN0IHF1ZXVlIGZvciB2cF9pZHg6JWRcbiIsCi0JCQl2aGEtPnZwX2lkeCk7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDg0LAorCQkJICAgICJDYW4ndCBjcmVhdGUgcmVxdWVzdCBxdWV1ZSBmb3IgVlBbJWRdXG4iLAorCQkJICAgIHZoYS0+dnBfaWR4KTsKIAkJZWxzZSB7Ci0JCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJIlJlcXVlc3QgUXVlOiVkIChRb1M6ICVkKSBjcmVhdGVkIGZvciB2cF9pZHg6JWRcbiIsCi0JCQlyZXQsIHFvcywgdmhhLT52cF9pZHgpKTsKKwkJCXFsX2RiZyhxbF9kYmdfbXVsdGlxLCB2aGEsIDB4YzAwMSwKKwkJCSAgICAiUmVxdWVzdCBRdWU6JWQgUTBzOiAlZCkgY3JlYXRlZCBmb3IgVlBbJWRdXG4iLAorCQkJICAgIHJldCwgcW9zLCB2aGEtPnZwX2lkeCk7CisJCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDg1LAorCQkJICAgICJSZXF1ZXN0IFF1ZTolZCBRMHM6ICVkKSBjcmVhdGVkIGZvciBWUFslZF1cbiIsCisJCQkgICAgcmV0LCBxb3MsIHZoYS0+dnBfaWR4KTsKIAkJCXJlcSA9IGhhLT5yZXFfcV9tYXBbcmV0XTsKIAkJfQogCX0KQEAgLTE4ODIsMTIgKzE4OTIsMTMgQEAKIAogCWlmICh2aGEtPnRpbWVyX2FjdGl2ZSkgewogCQlxbGEyeDAwX3ZwX3N0b3BfdGltZXIodmhhKTsKLQkJREVCVUcxNShwcmludGsoS0VSTl9JTkZPICJzY3NpKCVsZCk6IHRpbWVyIGZvciB0aGUgdnBvcnRbJWRdIgotCQkiID0gJXAgaGFzIHN0b3BwZWRcbiIsIHZoYS0+aG9zdF9ubywgdmhhLT52cF9pZHgsIHZoYSkpOworCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDg2LAorCQkgICAgIlRpbWVyIGZvciB0aGUgVlBbJWRdIGhhcyBzdG9wcGVkXG4iLCB2aGEtPnZwX2lkeCk7CiAJfQogCiAJLyogTm8gcGVuZGluZyBhY3Rpdml0aWVzIHNoYWxsIGJlIHRoZXJlIG9uIHRoZSB2aGEgbm93ICovCi0JREVCVUcobXNsZWVwKHJhbmRvbTMyKCklMTApKTsgIC8qIEp1c3QgdG8gc2VlIGlmIHNvbWV0aGluZyBmYWxscyBvbgorCWlmIChxbDJ4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZyAmIHFsX2RiZ191c2VyKQorCQltc2xlZXAocmFuZG9tMzIoKSUxMCk7ICAvKiBKdXN0IHRvIHNlZSBpZiBzb21ldGhpbmcgZmFsbHMgb24KIAkJCQkJKiB0aGUgbmV0IHdlIGhhdmUgcGxhY2VkIGJlbG93ICovCiAKIAlCVUdfT04oYXRvbWljX3JlYWQoJnZoYS0+dnJlZl9jb3VudCkpOwpAQCAtMTkwMSwxMiArMTkxMiwxMiBAQAogCiAJaWYgKHZoYS0+cmVxLT5pZCAmJiAhaGEtPmZsYWdzLmNwdV9hZmZpbml0eV9lbmFibGVkKSB7CiAJCWlmIChxbGEyNXh4X2RlbGV0ZV9yZXFfcXVlKHZoYSwgdmhhLT5yZXEpICE9IFFMQV9TVUNDRVNTKQotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJCSJRdWV1ZSBkZWxldGUgZmFpbGVkLlxuIik7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDg3LAorCQkJICAgICJRdWV1ZSBkZWxldGUgZmFpbGVkLlxuIik7CiAJfQogCiAJc2NzaV9ob3N0X3B1dCh2aGEtPmhvc3QpOwotCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgInZwb3J0ICVkIGRlbGV0ZWRcbiIsIGlkKTsKKwlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg3MDg4LCAiVlBbJWRdIGRlbGV0ZWQuXG4iLCBpZCk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ic2cuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ic2cuYwppbmRleCA4YzEwZTJjLi4wN2QxNzY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYnNnLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2JzZy5jCkBAIC0zNiw3ICszNiw4IEBACiB9CiAKIGludAotcWxhMjR4eF9mY3BfcHJpb19jZmdfdmFsaWQoc3RydWN0IHFsYV9mY3BfcHJpb19jZmcgKnByaV9jZmcsIHVpbnQ4X3QgZmxhZykKK3FsYTI0eHhfZmNwX3ByaW9fY2ZnX3ZhbGlkKHNjc2lfcWxhX2hvc3RfdCAqdmhhLAorCXN0cnVjdCBxbGFfZmNwX3ByaW9fY2ZnICpwcmlfY2ZnLCB1aW50OF90IGZsYWcpCiB7CiAJaW50IGksIHJldCwgbnVtX3ZhbGlkOwogCXVpbnQ4X3QgKmJjb2RlOwpAQCAtNTEsMTggKzUyLDE3IEBACiAKIAlpZiAoYmNvZGVfdmFsID09IDB4RkZGRkZGRkYpIHsKIAkJLyogTm8gRkNQIFByaW9yaXR5IGNvbmZpZyBkYXRhIGluIGZsYXNoICovCi0JCURFQlVHMihwcmludGsoS0VSTl9JTkZPCi0JCSAgICAiJXM6IE5vIEZDUCBwcmlvcml0eSBjb25maWcgZGF0YS5cbiIsCi0JCSAgICBfX2Z1bmNfXykpOworCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDUxLAorCQkgICAgIk5vIEZDUCBQcmlvcml0eSBjb25maWcgZGF0YS5cbiIpOwogCQlyZXR1cm4gMDsKIAl9CiAKIAlpZiAoYmNvZGVbMF0gIT0gJ0gnIHx8IGJjb2RlWzFdICE9ICdRJyB8fCBiY29kZVsyXSAhPSAnTycgfHwKIAkJCWJjb2RlWzNdICE9ICdTJykgewogCQkvKiBJbnZhbGlkIEZDUCBwcmlvcml0eSBkYXRhIGhlYWRlciovCi0JCURFQlVHMihwcmludGsoS0VSTl9FUlIKLQkJICAgICIlczogSW52YWxpZCBGQ1AgUHJpb3JpdHkgZGF0YSBoZWFkZXIuIGJjb2RlPTB4JXhcbiIsCi0JCSAgICBfX2Z1bmNfXywgYmNvZGVfdmFsKSk7CisJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwNTIsCisJCSAgICAiSW52YWxpZCBGQ1AgUHJpb3JpdHkgZGF0YSBoZWFkZXIuIGJjb2RlPTB4JXguXG4iLAorCQkgICAgYmNvZGVfdmFsKTsKIAkJcmV0dXJuIDA7CiAJfQogCWlmIChmbGFnICE9IDEpCkBAIC03NywxNSArNzcsMTQgQEAKIAogCWlmIChudW1fdmFsaWQgPT0gMCkgewogCQkvKiBObyB2YWxpZCBGQ1AgcHJpb3JpdHkgZGF0YSBlbnRyaWVzICovCi0JCURFQlVHMihwcmludGsoS0VSTl9FUlIKLQkJICAgICIlczogTm8gdmFsaWQgRkNQIFByaW9yaXR5IGRhdGEgZW50cmllcy5cbiIsCi0JCSAgICBfX2Z1bmNfXykpOworCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDUzLAorCQkgICAgIk5vIHZhbGlkIEZDUCBQcmlvcml0eSBkYXRhIGVudHJpZXMuXG4iKTsKIAkJcmV0ID0gMDsKIAl9IGVsc2UgewogCQkvKiBGQ1AgcHJpb3JpdHkgZGF0YSBpcyB2YWxpZCAqLwotCQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTwotCQkgICAgIiVzOiBWYWxpZCBGQ1AgcHJpb3JpdHkgZGF0YS4gbnVtIGVudHJpZXMgPSAlZFxuIiwKLQkJICAgIF9fZnVuY19fLCBudW1fdmFsaWQpKTsKKwkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzA1NCwKKwkJICAgICJWYWxpZCBGQ1AgcHJpb3JpdHkgZGF0YS4gbnVtIGVudHJpZXMgPSAlZC5cbiIsCisJCSAgICBudW1fdmFsaWQpOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC0xODIsMTAgKzE4MSw5IEBACiAJCWlmICghaGEtPmZjcF9wcmlvX2NmZykgewogCQkJaGEtPmZjcF9wcmlvX2NmZyA9IHZtYWxsb2MoRkNQX1BSSU9fQ0ZHX1NJWkUpOwogCQkJaWYgKCFoYS0+ZmNwX3ByaW9fY2ZnKSB7Ci0JCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJCQkiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSAiCi0JCQkJCSJmb3IgZmNwIHByaW8gY29uZmlnIGRhdGEgKCV4KS5cbiIsCi0JCQkJCUZDUF9QUklPX0NGR19TSVpFKTsKKwkJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDUwLAorCQkJCSAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZmNwIHByaW8gIgorCQkJCSAgICAiY29uZmlnIGRhdGEgKCV4KS5cbiIsIEZDUF9QUklPX0NGR19TSVpFKTsKIAkJCQlic2dfam9iLT5yZXBseS0+cmVzdWx0ID0gKERJRF9FUlJPUiA8PCAxNik7CiAJCQkJcmV0ID0gLUVOT01FTTsKIAkJCQlnb3RvIGV4aXRfZmNwX3ByaW9fY2ZnOwpAQCAtMTk4LDkgKzE5Niw5IEBACiAJCQlGQ1BfUFJJT19DRkdfU0laRSk7CiAKIAkJLyogdmFsaWRhdGUgZmNwIHByaW9yaXR5IGRhdGEgKi8KLQkJaWYgKCFxbGEyNHh4X2ZjcF9wcmlvX2NmZ192YWxpZCgKLQkJCShzdHJ1Y3QgcWxhX2ZjcF9wcmlvX2NmZyAqKQotCQkJaGEtPmZjcF9wcmlvX2NmZywgMSkpIHsKKworCQlpZiAoIXFsYTI0eHhfZmNwX3ByaW9fY2ZnX3ZhbGlkKHZoYSwKKwkJICAgIChzdHJ1Y3QgcWxhX2ZjcF9wcmlvX2NmZyAqKSBoYS0+ZmNwX3ByaW9fY2ZnLCAxKSkgewogCQkJYnNnX2pvYi0+cmVwbHktPnJlc3VsdCA9IChESURfRVJST1IgPDwgMTYpOwogCQkJcmV0ID0gLUVJTlZBTDsKIAkJCS8qIElmIGJ1ZmZlciB3YXMgaW52YWxpZGF0aWMgaW50CkBAIC0yNTYsOSArMjU0LDggQEAKIAogCS8qIHBhc3MgdGhyb3VnaCBpcyBzdXBwb3J0ZWQgb25seSBmb3IgSVNQIDRHYiBvciBoaWdoZXIgKi8KIAlpZiAoIUlTX0ZXSTJfQ0FQQUJMRShoYSkpIHsKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJICAgICJzY3NpKCVsZCk6RUxTIHBhc3N0aHJ1IG5vdCBzdXBwb3J0ZWQgZm9yIElTUDIzeHggYmFzZWQgIgotCQkgICAgImFkYXB0ZXJzXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzAwMSwKKwkJICAgICJFTFMgcGFzc3RocnUgbm90IHN1cHBvcnRlZCBmb3IgSVNQMjN4eCBiYXNlZCBhZGFwdGVycy5cbiIpOwogCQlydmFsID0gLUVQRVJNOwogCQlnb3RvIGRvbmU7CiAJfQpAQCAtMjY2LDExICsyNjMsMTEgQEAKIAkvKiAgTXVsdGlwbGUgU0cncyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgRUxTIHJlcXVlc3RzICovCiAJaWYgKGJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19jbnQgPiAxIHx8CiAJCWJzZ19qb2ItPnJlcGx5X3BheWxvYWQuc2dfY250ID4gMSkgewotCQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTwotCQkJIm11bHRpcGxlIFNHJ3MgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIEVMUyByZXF1ZXN0cyIKLQkJCSIgW3JlcXVlc3Rfc2dfY250OiAleCByZXBseV9zZ19jbnQ6ICV4XVxuIiwKLQkJCWJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19jbnQsCi0JCQlic2dfam9iLT5yZXBseV9wYXlsb2FkLnNnX2NudCkpOworCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDAyLAorCQkgICAgIk11bHRpcGxlIFNHJ3MgYXJlIG5vdCBzdXBwb3JlZCBmb3IgRUxTIHJlcXVlc3RzLCAiCisJCSAgICAicmVxdWVzdF9zZ19jbnQ9JXggcmVwbHlfc2dfY250PSV4LlxuIiwKKwkJICAgIGJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19jbnQsCisJCSAgICBic2dfam9iLT5yZXBseV9wYXlsb2FkLnNnX2NudCk7CiAJCXJ2YWwgPSAtRVBFUk07CiAJCWdvdG8gZG9uZTsKIAl9CkBAIC0yODEsOSArMjc4LDkgQEAKIAkJICogaWYgbm90IHBlcmZvcm0gZmFicmljIGxvZ2luCiAJCSAqLwogCQlpZiAocWxhMngwMF9mYWJyaWNfbG9naW4odmhhLCBmY3BvcnQsICZuZXh0bGlkKSkgewotCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSJmYWlsZWQgdG8gbG9naW4gcG9ydCAlMDZYIGZvciBFTFMgcGFzc3RocnVcbiIsCi0JCQlmY3BvcnQtPmRfaWQuYjI0KSk7CisJCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDAzLAorCQkJICAgICJGYWlsZWQgdG8gbG9naW4gcG9ydCAlMDZYIGZvciBFTFMgcGFzc3RocnUuXG4iLAorCQkJICAgIGZjcG9ydC0+ZF9pZC5iMjQpOwogCQkJcnZhbCA9IC1FSU87CiAJCQlnb3RvIGRvbmU7CiAJCX0KQEAgLTMxNCw4ICszMTEsNyBAQAogCX0KIAogCWlmICghdmhhLT5mbGFncy5vbmxpbmUpIHsKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJImhvc3Qgbm90IG9ubGluZVxuIikpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDA1LCAiSG9zdCBub3Qgb25saW5lLlxuIik7CiAJCXJ2YWwgPSAtRUlPOwogCQlnb3RvIGRvbmU7CiAJfQpAQCAtMzM3LDEyICszMzMsMTEgQEAKIAogCWlmICgocmVxX3NnX2NudCAhPSAgYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2NudCkgfHwKIAkJKHJzcF9zZ19jbnQgIT0gYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5zZ19jbnQpKSB7Ci0JCURFQlVHMihwcmludGsoS0VSTl9JTkZPCi0JCQkiZG1hIG1hcHBpbmcgcmVzdWx0ZWQgaW4gZGlmZmVyZW50IHNnIGNvdW50cyBcCi0JCQlbcmVxdWVzdF9zZ19jbnQ6ICV4IGRtYV9yZXF1ZXN0X3NnX2NudDogJXhcCi0JCQlyZXBseV9zZ19jbnQ6ICV4IGRtYV9yZXBseV9zZ19jbnQ6ICV4XVxuIiwKLQkJCWJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19jbnQsIHJlcV9zZ19jbnQsCi0JCQlic2dfam9iLT5yZXBseV9wYXlsb2FkLnNnX2NudCwgcnNwX3NnX2NudCkpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDA4LAorCQkgICAgImRtYSBtYXBwaW5nIHJlc3VsdGVkIGluIGRpZmZlcmVudCBzZyBjb3VudHMsICIKKwkJICAgICJyZXF1ZXN0X3NnX2NudDogJXggZG1hX3JlcXVlc3Rfc2dfY250OiV4IHJlcGx5X3NnX2NudDoleCAiCisJCSAgICAiZG1hX3JlcGx5X3NnX2NudDoleC5cbiIsIGJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19jbnQsCisJCSAgICByZXFfc2dfY250LCBic2dfam9iLT5yZXBseV9wYXlsb2FkLnNnX2NudCwgcnNwX3NnX2NudCk7CiAJCXJ2YWwgPSAtRUFHQUlOOwogCQlnb3RvIGRvbmVfdW5tYXBfc2c7CiAJfQpAQCAtMzYzLDE1ICszNTgsMTYgQEAKIAkJImJzZ19lbHNfcnB0IiA6ICJic2dfZWxzX2hzdCIpOwogCWVscy0+dS5ic2dfam9iID0gYnNnX2pvYjsKIAotCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCSJzY3NpKCVsZDoleCk6IGJzZyBycXN0IHR5cGU6ICVzIGVscyB0eXBlOiAleCAtIGxvb3AtaWQ9JXggIgotCQkicG9ydGlkPSUwMnglMDJ4JTAyeC5cbiIsIHZoYS0+aG9zdF9ubywgc3AtPmhhbmRsZSwgdHlwZSwKLQkJYnNnX2pvYi0+cmVxdWVzdC0+cnFzdF9kYXRhLmhfZWxzLmNvbW1hbmRfY29kZSwKLQkJZmNwb3J0LT5sb29wX2lkLCBmY3BvcnQtPmRfaWQuYi5kb21haW4sIGZjcG9ydC0+ZF9pZC5iLmFyZWEsCi0JCWZjcG9ydC0+ZF9pZC5iLmFsX3BhKSk7CisJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzAwYSwKKwkgICAgImJzZyBycXN0IHR5cGU6ICVzIGVscyB0eXBlOiAleCAtIGxvb3AtaWQ9JXggIgorCSAgICAicG9ydGlkPSUtMnglMDJ4JTAyeC5cbiIsIHR5cGUsCisJICAgIGJzZ19qb2ItPnJlcXVlc3QtPnJxc3RfZGF0YS5oX2Vscy5jb21tYW5kX2NvZGUsIGZjcG9ydC0+bG9vcF9pZCwKKwkgICAgZmNwb3J0LT5kX2lkLmIuZG9tYWluLCBmY3BvcnQtPmRfaWQuYi5hcmVhLCBmY3BvcnQtPmRfaWQuYi5hbF9wYSk7CiAKIAlydmFsID0gcWxhMngwMF9zdGFydF9zcChzcCk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzAwZSwKKwkJICAgICJxbGEyeDAwX3N0YXJ0X3NwIGZhaWxlZCA9ICVkXG4iLCBydmFsKTsKIAkJa2ZyZWUoc3AtPmN0eCk7CiAJCW1lbXBvb2xfZnJlZShzcCwgaGEtPnNyYl9tZW1wb29sKTsKIAkJcnZhbCA9IC1FSU87CkBAIC00MTEsNiArNDA3LDggQEAKIAkJZG1hX21hcF9zZygmaGEtPnBkZXYtPmRldiwgYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2xpc3QsCiAJCQlic2dfam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfY250LCBETUFfVE9fREVWSUNFKTsKIAlpZiAoIXJlcV9zZ19jbnQpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzAwZiwKKwkJICAgICJkbWFfbWFwX3NnIHJldHVybiAlZCBmb3IgcmVxdWVzdFxuIiwgcmVxX3NnX2NudCk7CiAJCXJ2YWwgPSAtRU5PTUVNOwogCQlnb3RvIGRvbmU7CiAJfQpAQCAtNDE4LDI0ICs0MTYsMjUgQEAKIAlyc3Bfc2dfY250ID0gZG1hX21hcF9zZygmaGEtPnBkZXYtPmRldiwgYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5zZ19saXN0LAogCQlic2dfam9iLT5yZXBseV9wYXlsb2FkLnNnX2NudCwgRE1BX0ZST01fREVWSUNFKTsKIAlpZiAoIXJzcF9zZ19jbnQpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzAxMCwKKwkJICAgICJkbWFfbWFwX3NnIHJldHVybiAlZCBmb3IgcmVwbHlcbiIsIHJzcF9zZ19jbnQpOwogCQlydmFsID0gLUVOT01FTTsKIAkJZ290byBkb25lOwogCX0KIAogCWlmICgocmVxX3NnX2NudCAhPSAgYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2NudCkgfHwKIAkgICAgKHJzcF9zZ19jbnQgIT0gYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5zZ19jbnQpKSB7Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiW3JlcXVlc3Rfc2dfY250OiAleCBkbWFfcmVxdWVzdF9zZ19jbnQ6ICV4XAotCQkgICAgcmVwbHlfc2dfY250OiAleCBkbWFfcmVwbHlfc2dfY250OiAleF1cbiIsCi0JCSAgICBic2dfam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfY250LCByZXFfc2dfY250LAotCQkgICAgYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5zZ19jbnQsIHJzcF9zZ19jbnQpKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzAxMSwKKwkJICAgICJyZXF1ZXN0X3NnX2NudDogJXggZG1hX3JlcXVlc3Rfc2dfY250OiAleCByZXBseV9zZ19jbnQ6JXggIgorCQkgICAgImRtYV9yZXBseV9zZ19jbnQ6ICV4XG4iLCBic2dfam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfY250LAorCQkgICAgcmVxX3NnX2NudCwgYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5zZ19jbnQsIHJzcF9zZ19jbnQpOwogCQlydmFsID0gLUVBR0FJTjsKIAkJZ290byBkb25lX3VubWFwX3NnOwogCX0KIAogCWlmICghdmhhLT5mbGFncy5vbmxpbmUpIHsKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSJob3N0IG5vdCBvbmxpbmVcbiIpKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzAxMiwKKwkJICAgICJIb3N0IGlzIG5vdCBvbmxpbmUuXG4iKTsKIAkJcnZhbCA9IC1FSU87CiAJCWdvdG8gZG9uZV91bm1hcF9zZzsKIAl9CkBAIC00NTEsOCArNDUwLDggQEAKIAkJbG9vcF9pZCA9IHZoYS0+bWdtdF9zdnJfbG9vcF9pZDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJICAgICJVbmtub3duIGxvb3AgaWQ6ICV4XG4iLCBsb29wX2lkKSk7CisJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwMTMsCisJCSAgICAiVW5rbm93biBsb29wIGlkOiAleC5cbiIsIGxvb3BfaWQpOwogCQlydmFsID0gLUVJTlZBTDsKIAkJZ290byBkb25lX3VubWFwX3NnOwogCX0KQEAgLTQ2NCw2ICs0NjMsOCBAQAogCSAqLwogCWZjcG9ydCA9IHFsYTJ4MDBfYWxsb2NfZmNwb3J0KHZoYSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFmY3BvcnQpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzAxNCwKKwkJICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgZmNwb3J0LlxuIik7CiAJCXJ2YWwgPSAtRU5PTUVNOwogCQlnb3RvIGRvbmVfdW5tYXBfc2c7CiAJfQpAQCAtNDc5LDYgKzQ4MCw4IEBACiAJLyogQWxsb2MgU1JCIHN0cnVjdHVyZSAqLwogCXNwID0gcWxhMngwMF9nZXRfY3R4X2JzZ19zcCh2aGEsIGZjcG9ydCwgc2l6ZW9mKHN0cnVjdCBzcmJfY3R4KSk7CiAJaWYgKCFzcCkgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDE1LAorCQkgICAgInFsYTJ4MDBfZ2V0X2N0eF9ic2dfc3AgZmFpbGVkLlxuIik7CiAJCXJ2YWwgPSAtRU5PTUVNOwogCQlnb3RvIGRvbmVfZnJlZV9mY3BvcnQ7CiAJfQpAQCAtNDg4LDE1ICs0OTEsMTcgQEAKIAljdC0+bmFtZSA9ICJic2dfY3QiOwogCWN0LT51LmJzZ19qb2IgPSBic2dfam9iOwogCi0JREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJInNjc2koJWxkOiV4KTogYnNnIHJxc3QgdHlwZTogJXMgZWxzIHR5cGU6ICV4IC0gbG9vcC1pZD0leCAiCi0JCSJwb3J0aWQ9JTAyeCUwMnglMDJ4LlxuIiwgdmhhLT5ob3N0X25vLCBzcC0+aGFuZGxlLCB0eXBlLAotCQkoYnNnX2pvYi0+cmVxdWVzdC0+cnFzdF9kYXRhLmhfY3QucHJlYW1ibGVfd29yZDIgPj4gMTYpLAotCQlmY3BvcnQtPmxvb3BfaWQsIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwgZmNwb3J0LT5kX2lkLmIuYXJlYSwKLQkJZmNwb3J0LT5kX2lkLmIuYWxfcGEpKTsKKwlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDE2LAorCSAgICAiYnNnIHJxc3QgdHlwZTogJXMgZWxzZSB0eXBlOiAleCAtICIKKwkgICAgImxvb3AtaWQ9JXggcG9ydGlkPSUwMnglMDJ4JTAyeC5cbiIsIHR5cGUsCisJICAgIChic2dfam9iLT5yZXF1ZXN0LT5ycXN0X2RhdGEuaF9jdC5wcmVhbWJsZV93b3JkMiA+PiAxNiksCisJICAgIGZjcG9ydC0+bG9vcF9pZCwgZmNwb3J0LT5kX2lkLmIuZG9tYWluLCBmY3BvcnQtPmRfaWQuYi5hcmVhLAorCSAgICBmY3BvcnQtPmRfaWQuYi5hbF9wYSk7CiAKIAlydmFsID0gcWxhMngwMF9zdGFydF9zcChzcCk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzAxNywKKwkJICAgICJxbGEyeDAwX3N0YXJ0X3NwIGZhaWxlZD0lZC5cbiIsIHJ2YWwpOwogCQlrZnJlZShzcC0+Y3R4KTsKIAkJbWVtcG9vbF9mcmVlKHNwLCBoYS0+c3JiX21lbXBvb2wpOwogCQlydmFsID0gLUVJTzsKQEAgLTUzNSw5ICs1NDAsOCBAQAogCWhhLT5ub3RpZnlfZGNieF9jb21wID0gMTsKIAlyZXQgPSBxbGE4MXh4X3NldF9wb3J0X2NvbmZpZyh2aGEsIG5ld19jb25maWcpOwogCWlmIChyZXQgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyKHByaW50ayhLRVJOX0VSUgotCQkgICAgIiVzKCVsdSk6IFNldCBwb3J0IGNvbmZpZyBmYWlsZWRcbiIsCi0JCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwMjEsCisJCSAgICAic2V0IHBvcnQgY29uZmlnIGZhaWxlZC5cbiIpOwogCQloYS0+bm90aWZ5X2RjYnhfY29tcCA9IDA7CiAJCXJ2YWwgPSAtRUlOVkFMOwogCQlnb3RvIGRvbmVfc2V0X2ludGVybmFsOwpAQCAtNTQ1LDExICs1NDksMTEgQEAKIAogCS8qIFdhaXQgZm9yIERDQlggY29tcGxldGUgZXZlbnQgKi8KIAlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmaGEtPmRjYnhfY29tcCwgKDIwICogSFopKSkgewotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIlN0YXRlIGNoYW5nZSBub3RpZmljYWl0aW9uIG5vdCByZWNlaXZlZC5cbiIpKTsKKwkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzAyMiwKKwkJICAgICJTdGF0ZSBjaGFuZ2Ugbm90aWZpY2F0aW9uIG5vdCByZWNlaXZlZC5cbiIpOwogCX0gZWxzZQotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkgICAgIlN0YXRlIGNoYW5nZSBSRUNFSVZFRFxuIikpOworCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDIzLAorCQkgICAgIlN0YXRlIGNoYW5nZSByZWNlaXZlZC5cbiIpOwogCiAJaGEtPm5vdGlmeV9kY2J4X2NvbXAgPSAwOwogCkBAIC01ODEsOSArNTg1LDggQEAKIAkJaGEtPm5vdGlmeV9kY2J4X2NvbXAgPSB3YWl0OwogCQlyZXQgPSBxbGE4MXh4X3NldF9wb3J0X2NvbmZpZyh2aGEsIG5ld19jb25maWcpOwogCQlpZiAocmV0ICE9IFFMQV9TVUNDRVNTKSB7Ci0JCQlERUJVRzIocHJpbnRrKEtFUk5fRVJSCi0JCQkgICAgIiVzKCVsdSk6IFNldCBwb3J0IGNvbmZpZyBmYWlsZWRcbiIsCi0JCQkgICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwMjUsCisJCQkgICAgIlNldCBwb3J0IGNvbmZpZyBmYWlsZWQuXG4iKTsKIAkJCWhhLT5ub3RpZnlfZGNieF9jb21wID0gMDsKIAkJCXJ2YWwgPSAtRUlOVkFMOwogCQkJZ290byBkb25lX3Jlc2V0X2ludGVybmFsOwpAQCAtNTkyLDE0ICs1OTUsMTQgQEAKIAkJLyogV2FpdCBmb3IgRENCWCBjb21wbGV0ZSBldmVudCAqLwogCQlpZiAod2FpdCAmJiAhd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZoYS0+ZGNieF9jb21wLAogCQkJKDIwICogSFopKSkgewotCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSAgICAiU3RhdGUgY2hhbmdlIG5vdGlmaWNhaXRpb24gbm90IHJlY2VpdmVkLlxuIikpOworCQkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzAyNiwKKwkJCSAgICAiU3RhdGUgY2hhbmdlIG5vdGlmaWNhdGlvbiBub3QgcmVjZWl2ZWQuXG4iKTsKIAkJCWhhLT5ub3RpZnlfZGNieF9jb21wID0gMDsKIAkJCXJ2YWwgPSAtRUlOVkFMOwogCQkJZ290byBkb25lX3Jlc2V0X2ludGVybmFsOwogCQl9IGVsc2UKLQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkgICAgIlN0YXRlIGNoYW5nZSBSRUNFSVZFRFxuIikpOworCQkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzAyNywKKwkJCSAgICAiU3RhdGUgY2hhbmdlIHJlY2VpdmVkLlxuIik7CiAKIAkJaGEtPm5vdGlmeV9kY2J4X2NvbXAgPSAwOwogCX0KQEAgLTYyOSwxMSArNjMyLDEzIEBACiAKIAlpZiAodGVzdF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSB8fAogCQl0ZXN0X2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmdmhhLT5kcGNfZmxhZ3MpIHx8Ci0JCXRlc3RfYml0KElTUF9BQk9SVF9SRVRSWSwgJnZoYS0+ZHBjX2ZsYWdzKSkKKwkJdGVzdF9iaXQoSVNQX0FCT1JUX1JFVFJZLCAmdmhhLT5kcGNfZmxhZ3MpKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwMTgsICJBYm9ydCBhY3RpdmUgb3IgbmVlZGVkLlxuIik7CiAJCXJldHVybiAtRUJVU1k7CisJfQogCiAJaWYgKCF2aGEtPmZsYWdzLm9ubGluZSkgewotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiaG9zdCBub3Qgb25saW5lXG4iKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwMTksICJIb3N0IGlzIG5vdCBvbmxpbmUuXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCkBAIC02NDEsMjYgKzY0NiwzMSBAQAogCQlic2dfam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfbGlzdCwgYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2NudCwKIAkJRE1BX1RPX0RFVklDRSk7CiAKLQlpZiAoIWVscmVxLnJlcV9zZ19jbnQpCisJaWYgKCFlbHJlcS5yZXFfc2dfY250KSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwMWEsCisJCSAgICAiZG1hX21hcF9zZyByZXR1cm5lZCAlZCBmb3IgcmVxdWVzdC5cbiIsIGVscmVxLnJlcV9zZ19jbnQpOwogCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAKIAllbHJlcS5yc3Bfc2dfY250ID0gZG1hX21hcF9zZygmaGEtPnBkZXYtPmRldiwKIAkJYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5zZ19saXN0LCBic2dfam9iLT5yZXBseV9wYXlsb2FkLnNnX2NudCwKIAkJRE1BX0ZST01fREVWSUNFKTsKIAogCWlmICghZWxyZXEucnNwX3NnX2NudCkgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDFiLAorCQkgICAgImRtYV9tYXBfc2cgcmV0dXJuZWQgJWQgZm9yIHJlcGx5LlxuIiwgZWxyZXEucnNwX3NnX2NudCk7CiAJCXJ2YWwgPSAtRU5PTUVNOwogCQlnb3RvIGRvbmVfdW5tYXBfcmVxX3NnOwogCX0KIAogCWlmICgoZWxyZXEucmVxX3NnX2NudCAhPSAgYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2NudCkgfHwKIAkJKGVscmVxLnJzcF9zZ19jbnQgIT0gYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5zZ19jbnQpKSB7Ci0JCURFQlVHMihwcmludGsoS0VSTl9JTkZPCi0JCQkiZG1hIG1hcHBpbmcgcmVzdWx0ZWQgaW4gZGlmZmVyZW50IHNnIGNvdW50cyAiCi0JCQkiW3JlcXVlc3Rfc2dfY250OiAleCBkbWFfcmVxdWVzdF9zZ19jbnQ6ICV4ICIKLQkJCSJyZXBseV9zZ19jbnQ6ICV4IGRtYV9yZXBseV9zZ19jbnQ6ICV4XVxuIiwKLQkJCWJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19jbnQsIGVscmVxLnJlcV9zZ19jbnQsCi0JCQlic2dfam9iLT5yZXBseV9wYXlsb2FkLnNnX2NudCwgZWxyZXEucnNwX3NnX2NudCkpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDFjLAorCQkgICAgImRtYSBtYXBwaW5nIHJlc3VsdGVkIGluIGRpZmZlcmVudCBzZyBjb3VudHMsICIKKwkJICAgICJyZXF1ZXN0X3NnX2NudDogJXggZG1hX3JlcXVlc3Rfc2dfY250OiAleCAiCisJCSAgICAicmVwbHlfc2dfY250OiAleCBkbWFfcmVwbHlfc2dfY250OiAleC5cbiIsCisJCSAgICBic2dfam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfY250LCBlbHJlcS5yZXFfc2dfY250LAorCQkgICAgYnNnX2pvYi0+cmVwbHlfcGF5bG9hZC5zZ19jbnQsIGVscmVxLnJzcF9zZ19jbnQpOwogCQlydmFsID0gLUVBR0FJTjsKIAkJZ290byBkb25lX3VubWFwX3NnOwogCX0KQEAgLTY2OCw4ICs2NzgsOCBAQAogCXJlcV9kYXRhID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCByZXFfZGF0YV9sZW4sCiAJCSZyZXFfZGF0YV9kbWEsIEdGUF9LRVJORUwpOwogCWlmICghcmVxX2RhdGEpIHsKLQkJREVCVUcyKHByaW50ayhLRVJOX0VSUiAiJXM6IGRtYSBhbGxvYyBmb3IgcmVxX2RhdGEgIgotCQkJImZhaWxlZCBmb3IgaG9zdD0lbHVcbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzAxZCwKKwkJICAgICJkbWEgYWxsb2MgZmFpbGVkIGZvciByZXFfZGF0YS5cbiIpOwogCQlydmFsID0gLUVOT01FTTsKIAkJZ290byBkb25lX3VubWFwX3NnOwogCX0KQEAgLTY3Nyw4ICs2ODcsOCBAQAogCXJzcF9kYXRhID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCByc3BfZGF0YV9sZW4sCiAJCSZyc3BfZGF0YV9kbWEsIEdGUF9LRVJORUwpOwogCWlmICghcnNwX2RhdGEpIHsKLQkJREVCVUcyKHByaW50ayhLRVJOX0VSUiAiJXM6IGRtYSBhbGxvYyBmb3IgcnNwX2RhdGEgIgotCQkJImZhaWxlZCBmb3IgaG9zdD0lbHVcbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzAwNCwKKwkJICAgICJkbWEgYWxsb2MgZmFpbGVkIGZvciByc3BfZGF0YS5cbiIpOwogCQlydmFsID0gLUVOT01FTTsKIAkJZ290byBkb25lX2ZyZWVfZG1hX3JlcTsKIAl9CkBAIC02OTksOCArNzA5LDggQEAKIAkgICAgJiYgcmVxX2RhdGFfbGVuID09IE1BWF9FTFNfRlJBTUVfUEFZTE9BRCkpICYmCiAJCWVscmVxLm9wdGlvbnMgPT0gRVhURVJOQUxfTE9PUEJBQ0spIHsKIAkJdHlwZSA9ICJGQ19CU0dfSFNUX1ZFTkRPUl9FQ0hPX0RJQUciOwotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJInNjc2koJWxkKSBic2cgcnFzdCB0eXBlOiAlc1xuIiwgdmhhLT5ob3N0X25vLCB0eXBlKSk7CisJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwMWUsCisJCSAgICAiQlNHIHJlcXVlc3QgdHlwZTogJXMuXG4iLCB0eXBlKTsKIAkJY29tbWFuZF9zZW50ID0gSU5UX0RFRl9MQl9FQ0hPX0NNRDsKIAkJcnZhbCA9IHFsYTJ4MDBfZWNob190ZXN0KHZoYSwgJmVscmVxLCByZXNwb25zZSk7CiAJfSBlbHNlIHsKQEAgLTcwOCw5ICs3MTgsOCBAQAogCQkJbWVtc2V0KGNvbmZpZywgMCwgc2l6ZW9mKGNvbmZpZykpOwogCQkJbWVtc2V0KG5ld19jb25maWcsIDAsIHNpemVvZihuZXdfY29uZmlnKSk7CiAJCQlpZiAocWxhODF4eF9nZXRfcG9ydF9jb25maWcodmhhLCBjb25maWcpKSB7Ci0JCQkJREVCVUcyKHByaW50ayhLRVJOX0VSUgotCQkJCQkiJXMoJWx1KTogR2V0IHBvcnQgY29uZmlnIGZhaWxlZFxuIiwKLQkJCQkJX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwMWYsCisJCQkJICAgICJHZXQgcG9ydCBjb25maWcgZmFpbGVkLlxuIik7CiAJCQkJYnNnX2pvYi0+cmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbiA9IDA7CiAJCQkJYnNnX2pvYi0+cmVwbHktPnJlc3VsdCA9IChESURfRVJST1IgPDwgMTYpOwogCQkJCXJ2YWwgPSAtRVBFUk07CkBAIC03MTgsMTEgKzcyNywxMyBAQAogCQkJfQogCiAJCQlpZiAoZWxyZXEub3B0aW9ucyAhPSBFWFRFUk5BTF9MT09QQkFDSykgewotCQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkJCSJJbnRlcm5hbDogY3VycmVudCBwb3J0IGNvbmZpZyA9ICV4XG4iLAotCQkJCQljb25maWdbMF0pKTsKKwkJCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDIwLAorCQkJCSAgICAiSW50ZXJuYWw6IGN1cmVudCBwb3J0IGNvbmZpZyA9ICV4XG4iLAorCQkJCSAgICBjb25maWdbMF0pOwogCQkJCWlmIChxbGE4MXh4X3NldF9pbnRlcm5hbF9sb29wYmFjayh2aGEsIGNvbmZpZywKIAkJCQkJbmV3X2NvbmZpZykpIHsKKwkJCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzAyNCwKKwkJCQkJICAgICJJbnRlcm5hbCBsb29wYmFjayBmYWlsZWQuXG4iKTsKIAkJCQkJYnNnX2pvYi0+cmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbiA9CiAJCQkJCQkwOwogCQkJCQlic2dfam9iLT5yZXBseS0+cmVzdWx0ID0KQEAgLTc0Niw5ICs3NTcsOCBAQAogCQkJfQogCiAJCQl0eXBlID0gIkZDX0JTR19IU1RfVkVORE9SX0xPT1BCQUNLIjsKLQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkJInNjc2koJWxkKSBic2cgcnFzdCB0eXBlOiAlc1xuIiwKLQkJCQl2aGEtPmhvc3Rfbm8sIHR5cGUpKTsKKwkJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwMjgsCisJCQkgICAgIkJTRyByZXF1ZXN0IHR5cGU6ICVzLlxuIiwgdHlwZSk7CiAKIAkJCWNvbW1hbmRfc2VudCA9IElOVF9ERUZfTEJfTE9PUEJBQ0tfQ01EOwogCQkJcnZhbCA9IHFsYTJ4MDBfbG9vcGJhY2tfdGVzdCh2aGEsICZlbHJlcSwgcmVzcG9uc2UpOwpAQCAtNzYzLDE3ICs3NzMsMTYgQEAKIAogCQkJaWYgKHJlc3BvbnNlWzBdID09IE1CU19DT01NQU5EX0VSUk9SICYmCiAJCQkJCXJlc3BvbnNlWzFdID09IE1CU19MQl9SRVNFVCkgewotCQkJCURFQlVHMihwcmludGsoS0VSTl9FUlIgIiVzKCVsZCk6IEFCT1JUaW5nICIKLQkJCQkJIklTUFxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwMjksCisJCQkJICAgICJNQlggY29tbWFuZCBlcnJvciwgQWJvcnRpbmcgSVNQLlxuIik7CiAJCQkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwogCQkJCXFsYTJ4eHhfd2FrZV9kcGModmhhKTsKIAkJCQlxbGEyeDAwX3dhaXRfZm9yX2NoaXBfcmVzZXQodmhhKTsKIAkJCQkvKiBBbHNvIHJlc2V0IHRoZSBNUEkgKi8KIAkJCQlpZiAocWxhODF4eF9yZXN0YXJ0X21waV9maXJtd2FyZSh2aGEpICE9CiAJCQkJICAgIFFMQV9TVUNDRVNTKSB7Ci0JCQkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCQkJICAgICJNUEkgcmVzZXQgZmFpbGVkIGZvciBob3N0JWxkLlxuIiwKLQkJCQkJICAgIHZoYS0+aG9zdF9ubyk7CisJCQkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwMmEsCisJCQkJCSAgICAiTVBJIHJlc2V0IGZhaWxlZC5cbiIpOwogCQkJCX0KIAogCQkJCWJzZ19qb2ItPnJlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPSAwOwpAQCAtNzgzLDE3ICs3OTIsMTYgQEAKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCXR5cGUgPSAiRkNfQlNHX0hTVF9WRU5ET1JfTE9PUEJBQ0siOwotCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCQkic2NzaSglbGQpIGJzZyBycXN0IHR5cGU6ICVzXG4iLAotCQkJCXZoYS0+aG9zdF9ubywgdHlwZSkpOworCQkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzAyYiwKKwkJCSAgICAiQlNHIHJlcXVlc3QgdHlwZTogJXMuXG4iLCB0eXBlKTsKIAkJCWNvbW1hbmRfc2VudCA9IElOVF9ERUZfTEJfTE9PUEJBQ0tfQ01EOwogCQkJcnZhbCA9IHFsYTJ4MDBfbG9vcGJhY2tfdGVzdCh2aGEsICZlbHJlcSwgcmVzcG9uc2UpOwogCQl9CiAJfQogCiAJaWYgKHJ2YWwpIHsKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgInNjc2koJWxkKSBWZW5kb3IgIgotCQkgICAgInJlcXVlc3QgJXMgZmFpbGVkXG4iLCB2aGEtPmhvc3Rfbm8sIHR5cGUpKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzAyYywKKwkJICAgICJWZW5kb3IgcmVxdWVzdCAlcyBmYWlsZWQuXG4iLCB0eXBlKTsKIAogCQlmd19zdHNfcHRyID0gKCh1aW50OF90ICopYnNnX2pvYi0+cmVxLT5zZW5zZSkgKwogCQkgICAgc2l6ZW9mKHN0cnVjdCBmY19ic2dfcmVwbHkpOwpAQCAtODA1LDggKzgxMyw4IEBACiAJCWJzZ19qb2ItPnJlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPSAwOwogCQlic2dfam9iLT5yZXBseS0+cmVzdWx0ID0gKERJRF9FUlJPUiA8PCAxNik7CiAJfSBlbHNlIHsKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgInNjc2koJWxkKSBWZW5kb3IgIgotCQkJInJlcXVlc3QgJXMgY29tcGxldGVkXG4iLCB2aGEtPmhvc3Rfbm8sIHR5cGUpKTsKKwkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzAyZCwKKwkJICAgICJWZW5kb3IgcmVxdWVzdCAlcyBjb21wbGV0ZWQuXG4iLCB0eXBlKTsKIAogCQlic2dfam9iLT5yZXBseV9sZW4gPSBzaXplb2Yoc3RydWN0IGZjX2JzZ19yZXBseSkgKwogCQkJc2l6ZW9mKHJlc3BvbnNlKSArIHNpemVvZih1aW50OF90KTsKQEAgLTg1MSwxMiArODU5LDEzIEBACiAKIAlpZiAodGVzdF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSB8fAogCSAgICB0ZXN0X2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmdmhhLT5kcGNfZmxhZ3MpIHx8Ci0JICAgIHRlc3RfYml0KElTUF9BQk9SVF9SRVRSWSwgJnZoYS0+ZHBjX2ZsYWdzKSkKKwkgICAgdGVzdF9iaXQoSVNQX0FCT1JUX1JFVFJZLCAmdmhhLT5kcGNfZmxhZ3MpKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwMmUsICJBYm9ydCBhY3RpdmUgb3IgbmVlZGVkLlxuIik7CiAJCXJldHVybiAtRUJVU1k7CisJfQogCiAJaWYgKCFJU19RTEE4NFhYKGhhKSkgewotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAic2NzaSglbGQpOiBOb3QgODR4eCwgIgotCQkgICAiZXhpdGluZy5cbiIsIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDJmLCAiTm90IDg0eHgsIGV4aXRpbmcuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC04NjUsMTQgKzg3NCwxNCBAQAogCXJ2YWwgPSBxbGE4NHh4X3Jlc2V0X2NoaXAodmhhLCBmbGFnID09IEE4NF9JU1NVRV9SRVNFVF9ESUFHX0ZXKTsKIAogCWlmIChydmFsKSB7Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJzY3NpKCVsZCkgVmVuZG9yICIKLQkJICAgICJyZXF1ZXN0IDg0eHggcmVzZXQgZmFpbGVkXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzAzMCwKKwkJICAgICJWZW5kb3IgcmVxdWVzdCA4NHh4IHJlc2V0IGZhaWxlZC5cbiIpOwogCQlydmFsID0gYnNnX2pvYi0+cmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbiA9IDA7CiAJCWJzZ19qb2ItPnJlcGx5LT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8IDE2KTsKIAogCX0gZWxzZSB7Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJzY3NpKCVsZCkgVmVuZG9yICIKLQkJICAgICJyZXF1ZXN0IDg0eHggcmVzZXQgY29tcGxldGVkXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzAzMSwKKwkJICAgICJWZW5kb3IgcmVxdWVzdCA4NHh4IHJlc2V0IGNvbXBsZXRlZC5cbiIpOwogCQlic2dfam9iLT5yZXBseS0+cmVzdWx0ID0gRElEX09LOwogCX0KIApAQCAtOTAyLDIxICs5MTEsMjQgQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAogCWlmICghSVNfUUxBODRYWChoYSkpIHsKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgInNjc2koJWxkKTogTm90IDg0eHgsICIKLQkJCSJleGl0aW5nLlxuIiwgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwMzIsCisJCSAgICAiTm90IDg0eHgsIGV4aXRpbmcuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJc2dfY250ID0gZG1hX21hcF9zZygmaGEtPnBkZXYtPmRldiwgYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2xpc3QsCiAJCWJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19jbnQsIERNQV9UT19ERVZJQ0UpOwotCWlmICghc2dfY250KQorCWlmICghc2dfY250KSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwMzMsCisJCSAgICAiZG1hX21hcF9zZyByZXR1cm5lZCAlZCBmb3IgcmVxdWVzdC5cbiIsIHNnX2NudCk7CiAJCXJldHVybiAtRU5PTUVNOworCX0KIAogCWlmIChzZ19jbnQgIT0gYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2NudCkgewotCQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTwotCQkJImRtYSBtYXBwaW5nIHJlc3VsdGVkIGluIGRpZmZlcmVudCBzZyBjb3VudHMgIgotCQkJInJlcXVlc3Rfc2dfY250OiAleCBkbWFfcmVxdWVzdF9zZ19jbnQ6ICV4ICIsCi0JCQlic2dfam9iLT5yZXF1ZXN0X3BheWxvYWQuc2dfY250LCBzZ19jbnQpKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzAzNCwKKwkJICAgICJETUEgbWFwcGluZyByZXN1bHRlZCBpbiBkaWZmZXJlbnQgc2cgY291bnRzLCAiCisJCSAgICAicmVxdWVzdF9zZ19jbnQ6ICV4IGRtYV9yZXF1ZXN0X3NnX2NudDogJXguXG4iLAorCQkgICAgYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2NudCwgc2dfY250KTsKIAkJcnZhbCA9IC1FQUdBSU47CiAJCWdvdG8gZG9uZV91bm1hcF9zZzsKIAl9CkBAIC05MjUsOCArOTM3LDggQEAKIAlmd19idWYgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIGRhdGFfbGVuLAogCQkmZndfZG1hLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWZ3X2J1ZikgewotCQlERUJVRzIocHJpbnRrKEtFUk5fRVJSICIlczogZG1hIGFsbG9jIGZvciBmd19idWYgIgotCQkJImZhaWxlZCBmb3IgaG9zdD0lbHVcbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzAzNSwKKwkJICAgICJETUEgYWxsb2MgZmFpbGVkIGZvciBmd19idWYuXG4iKTsKIAkJcnZhbCA9IC1FTk9NRU07CiAJCWdvdG8gZG9uZV91bm1hcF9zZzsKIAl9CkBAIC05MzYsOCArOTQ4LDggQEAKIAogCW1uID0gZG1hX3Bvb2xfYWxsb2MoaGEtPnNfZG1hX3Bvb2wsIEdGUF9LRVJORUwsICZtbl9kbWEpOwogCWlmICghbW4pIHsKLQkJREVCVUcyKHByaW50ayhLRVJOX0VSUiAiJXM6IGRtYSBhbGxvYyBmb3IgZncgYnVmZmVyICIKLQkJCSJmYWlsZWQgZm9yIGhvc3Q9JWx1XG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwMzYsCisJCSAgICAiRE1BIGFsbG9jIGZhaWxlZCBmb3IgZncgYnVmZmVyLlxuIik7CiAJCXJ2YWwgPSAtRU5PTUVNOwogCQlnb3RvIGRvbmVfZnJlZV9md19idWY7CiAJfQpAQCAtOTY1LDE1ICs5NzcsMTUgQEAKIAlydmFsID0gcWxhMngwMF9pc3N1ZV9pb2NiX3RpbWVvdXQodmhhLCBtbiwgbW5fZG1hLCAwLCAxMjApOwogCiAJaWYgKHJ2YWwpIHsKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgInNjc2koJWxkKSBWZW5kb3IgIgotCQkJInJlcXVlc3QgODR4eCB1cGRhdGVmdyBmYWlsZWRcbiIsIHZoYS0+aG9zdF9ubykpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDM3LAorCQkgICAgIlZlbmRvciByZXF1ZXN0IDg0eHggdXBkYXRlZncgZmFpbGVkLlxuIik7CiAKIAkJcnZhbCA9IGJzZ19qb2ItPnJlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPSAwOwogCQlic2dfam9iLT5yZXBseS0+cmVzdWx0ID0gKERJRF9FUlJPUiA8PCAxNik7CiAKIAl9IGVsc2UgewotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAic2NzaSglbGQpIFZlbmRvciAiCi0JCQkicmVxdWVzdCA4NHh4IHVwZGF0ZWZ3IGNvbXBsZXRlZFxuIiwgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwMzgsCisJCSAgICAiVmVuZG9yIHJlcXVlc3QgODR4eCB1cGRhdGVmdyBjb21wbGV0ZWQuXG4iKTsKIAogCQlic2dfam9iLT5yZXBseV9sZW4gPSBzaXplb2Yoc3RydWN0IGZjX2JzZ19yZXBseSk7CiAJCWJzZ19qb2ItPnJlcGx5LT5yZXN1bHQgPSBESURfT0s7CkBAIC0xMDA5LDI3ICsxMDIxLDMwIEBACiAKIAlpZiAodGVzdF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSB8fAogCQl0ZXN0X2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmdmhhLT5kcGNfZmxhZ3MpIHx8Ci0JCXRlc3RfYml0KElTUF9BQk9SVF9SRVRSWSwgJnZoYS0+ZHBjX2ZsYWdzKSkKKwkJdGVzdF9iaXQoSVNQX0FCT1JUX1JFVFJZLCAmdmhhLT5kcGNfZmxhZ3MpKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwMzksCisJCSAgICAiQWJvcnQgYWN0aXZlIG9yIG5lZWRlZC5cbiIpOwogCQlyZXR1cm4gLUVCVVNZOworCX0KIAogCWlmICghSVNfUUxBODRYWChoYSkpIHsKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgInNjc2koJWxkKTogTm90IDg0eHgsICIKLQkJCSJleGl0aW5nLlxuIiwgdmhhLT5ob3N0X25vKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwM2EsCisJCSAgICAiTm90IDg0eHgsIGV4aXRpbmcuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJcWw4NF9tZ210ID0gKHN0cnVjdCBxbGFfYnNnX2E4NF9tZ210ICopKChjaGFyICopYnNnX2pvYi0+cmVxdWVzdCArCiAJCXNpemVvZihzdHJ1Y3QgZmNfYnNnX3JlcXVlc3QpKTsKIAlpZiAoIXFsODRfbWdtdCkgewotCQlERUJVRzIocHJpbnRrKCIlcyglbGQpOiBtZ210IGhlYWRlciBub3QgcHJvdmlkZWQsIGV4aXRpbmcuXG4iLAotCQkJX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDNiLAorCQkgICAgIk1HTVQgaGVhZGVyIG5vdCBwcm92aWRlZCwgZXhpdGluZy5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAltbiA9IGRtYV9wb29sX2FsbG9jKGhhLT5zX2RtYV9wb29sLCBHRlBfS0VSTkVMLCAmbW5fZG1hKTsKIAlpZiAoIW1uKSB7Ci0JCURFQlVHMihwcmludGsoS0VSTl9FUlIgIiVzOiBkbWEgYWxsb2MgZm9yIGZ3IGJ1ZmZlciAiCi0JCQkiZmFpbGVkIGZvciBob3N0PSVsdVxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDNjLAorCQkgICAgIkRNQSBhbGxvYyBmYWlsZWQgZm9yIGZ3IGJ1ZmZlci5cbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKQEAgLTEwNDQsNiArMTA1OSw4IEBACiAJCQlic2dfam9iLT5yZXBseV9wYXlsb2FkLnNnX2xpc3QsCiAJCQlic2dfam9iLT5yZXBseV9wYXlsb2FkLnNnX2NudCwgRE1BX0ZST01fREVWSUNFKTsKIAkJaWYgKCFzZ19jbnQpIHsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwM2QsCisJCQkgICAgImRtYV9tYXBfc2cgcmV0dXJuZWQgJWQgZm9yIHJlcGx5LlxuIiwgc2dfY250KTsKIAkJCXJ2YWwgPSAtRU5PTUVNOwogCQkJZ290byBleGl0X21nbXQ7CiAJCX0KQEAgLTEwNTEsMTAgKzEwNjgsMTAgQEAKIAkJZG1hX2RpcmVjdGlvbiA9IERNQV9GUk9NX0RFVklDRTsKIAogCQlpZiAoc2dfY250ICE9IGJzZ19qb2ItPnJlcGx5X3BheWxvYWQuc2dfY250KSB7Ci0JCQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTwotCQkJCSJkbWEgbWFwcGluZyByZXN1bHRlZCBpbiBkaWZmZXJlbnQgc2cgY291bnRzICIKLQkJCQkicmVwbHlfc2dfY250OiAleCBkbWFfcmVwbHlfc2dfY250OiAleFxuIiwKLQkJCQlic2dfam9iLT5yZXBseV9wYXlsb2FkLnNnX2NudCwgc2dfY250KSk7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDNlLAorCQkJICAgICJETUEgbWFwcGluZyByZXN1bHRlZCBpbiBkaWZmZXJlbnQgc2cgY291bnRzLCAiCisJCQkgICAgInJlcGx5X3NnX2NudDogJXggZG1hX3JlcGx5X3NnX2NudDogJXguXG4iLAorCQkJICAgIGJzZ19qb2ItPnJlcGx5X3BheWxvYWQuc2dfY250LCBzZ19jbnQpOwogCQkJcnZhbCA9IC1FQUdBSU47CiAJCQlnb3RvIGRvbmVfdW5tYXBfc2c7CiAJCX0KQEAgLTEwNjQsOSArMTA4MSw4IEBACiAJCW1nbXRfYiA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgZGF0YV9sZW4sCiAJCSAgICAmbWdtdF9kbWEsIEdGUF9LRVJORUwpOwogCQlpZiAoIW1nbXRfYikgewotCQkJREVCVUcyKHByaW50ayhLRVJOX0VSUiAiJXM6IGRtYSBhbGxvYyBmb3IgbWdtdF9iICIKLQkJCQkiZmFpbGVkIGZvciBob3N0PSVsdVxuIiwKLQkJCQlfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDNmLAorCQkJICAgICJETUEgYWxsb2MgZmFpbGVkIGZvciBtZ210X2IuXG4iKTsKIAkJCXJ2YWwgPSAtRU5PTUVNOwogCQkJZ290byBkb25lX3VubWFwX3NnOwogCQl9CkBAIC0xMDk0LDYgKzExMTAsOCBAQAogCQkJYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2NudCwgRE1BX1RPX0RFVklDRSk7CiAKIAkJaWYgKCFzZ19jbnQpIHsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwNDAsCisJCQkgICAgImRtYV9tYXBfc2cgcmV0dXJuZWQgJWQuXG4iLCBzZ19jbnQpOwogCQkJcnZhbCA9IC1FTk9NRU07CiAJCQlnb3RvIGV4aXRfbWdtdDsKIAkJfQpAQCAtMTEwMSwxMCArMTExOSwxMCBAQAogCQlkbWFfZGlyZWN0aW9uID0gRE1BX1RPX0RFVklDRTsKIAogCQlpZiAoc2dfY250ICE9IGJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19jbnQpIHsKLQkJCURFQlVHMihwcmludGsoS0VSTl9JTkZPCi0JCQkJImRtYSBtYXBwaW5nIHJlc3VsdGVkIGluIGRpZmZlcmVudCBzZyBjb3VudHMgIgotCQkJCSJyZXF1ZXN0X3NnX2NudDogJXggZG1hX3JlcXVlc3Rfc2dfY250OiAleCAiLAotCQkJCWJzZ19qb2ItPnJlcXVlc3RfcGF5bG9hZC5zZ19jbnQsIHNnX2NudCkpOworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA0MSwKKwkJCSAgICAiRE1BIG1hcHBpbmcgcmVzdWx0ZWQgaW4gZGlmZmVyZW50IHNnIGNvdW50cywgIgorCQkJICAgICJyZXF1ZXN0X3NnX2NudDogJXggZG1hX3JlcXVlc3Rfc2dfY250OiAleC5cbiIsCisJCQkgICAgYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnNnX2NudCwgc2dfY250KTsKIAkJCXJ2YWwgPSAtRUFHQUlOOwogCQkJZ290byBkb25lX3VubWFwX3NnOwogCQl9CkBAIC0xMTEzLDkgKzExMzEsOCBAQAogCQltZ210X2IgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIGRhdGFfbGVuLAogCQkJJm1nbXRfZG1hLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFtZ210X2IpIHsKLQkJCURFQlVHMihwcmludGsoS0VSTl9FUlIgIiVzOiBkbWEgYWxsb2MgZm9yIG1nbXRfYiAiCi0JCQkJImZhaWxlZCBmb3IgaG9zdD0lbHVcbiIsCi0JCQkJX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA0MiwKKwkJCSAgICAiRE1BIGFsbG9jIGZhaWxlZCBmb3IgbWdtdF9iLlxuIik7CiAJCQlydmFsID0gLUVOT01FTTsKIAkJCWdvdG8gZG9uZV91bm1hcF9zZzsKIAkJfQpAQCAtMTE1NiwxNSArMTE3MywxNSBAQAogCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2IodmhhLCBtbiwgbW5fZG1hLCAwKTsKIAogCWlmIChydmFsKSB7Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJzY3NpKCVsZCkgVmVuZG9yICIKLQkJCSJyZXF1ZXN0IDg0eHggbWdtdCBmYWlsZWRcbiIsIHZoYS0+aG9zdF9ubykpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDQzLAorCQkgICAgIlZlbmRvciByZXF1ZXN0IDg0eHggbWdtdCBmYWlsZWQuXG4iKTsKIAogCQlydmFsID0gYnNnX2pvYi0+cmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbiA9IDA7CiAJCWJzZ19qb2ItPnJlcGx5LT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8IDE2KTsKIAogCX0gZWxzZSB7Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJzY3NpKCVsZCkgVmVuZG9yICIKLQkJCSJyZXF1ZXN0IDg0eHggbWdtdCBjb21wbGV0ZWRcbiIsIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDQ0LAorCQkgICAgIlZlbmRvciByZXF1ZXN0IDg0eHggbWdtdCBjb21wbGV0ZWQuXG4iKTsKIAogCQlic2dfam9iLT5yZXBseV9sZW4gPSBzaXplb2Yoc3RydWN0IGZjX2JzZ19yZXBseSk7CiAJCWJzZ19qb2ItPnJlcGx5LT5yZXN1bHQgPSBESURfT0s7CkBAIC0xMjA0LDcgKzEyMjEsNiBAQAogewogCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3QgPSBic2dfam9iLT5zaG9zdDsKIAlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHNob3N0X3ByaXYoaG9zdCk7Ci0Jc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJaW50IHJ2YWwgPSAwOwogCXN0cnVjdCBxbGFfcG9ydF9wYXJhbSAqcG9ydF9wYXJhbSA9IE5VTEw7CiAJZmNfcG9ydF90ICpmY3BvcnQgPSBOVUxMOwpAQCAtMTIxNSwyNiArMTIzMSwyNyBAQAogCiAJaWYgKHRlc3RfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncykgfHwKIAkJdGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJnZoYS0+ZHBjX2ZsYWdzKSB8fAotCQl0ZXN0X2JpdChJU1BfQUJPUlRfUkVUUlksICZ2aGEtPmRwY19mbGFncykpCisJCXRlc3RfYml0KElTUF9BQk9SVF9SRVRSWSwgJnZoYS0+ZHBjX2ZsYWdzKSkgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDQ1LCAiYWJvcnQgYWN0aXZlIG9yIG5lZWRlZC5cbiIpOwogCQlyZXR1cm4gLUVCVVNZOworCX0KIAogCWlmICghSVNfSUlETUFfQ0FQQUJMRSh2aGEtPmh3KSkgewotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiJXMoJWx1KTogaWlETUEgbm90ICIKLQkJCSJzdXBwb3J0ZWRcbiIsICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDcwNDYsICJpaURNQSBub3Qgc3VwcG9ydGVkLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXBvcnRfcGFyYW0gPSAoc3RydWN0IHFsYV9wb3J0X3BhcmFtICopKChjaGFyICopYnNnX2pvYi0+cmVxdWVzdCArCiAJCXNpemVvZihzdHJ1Y3QgZmNfYnNnX3JlcXVlc3QpKTsKIAlpZiAoIXBvcnRfcGFyYW0pIHsKLQkJREVCVUcyKHByaW50aygiJXMoJWxkKTogcG9ydF9wYXJhbSBoZWFkZXIgbm90IHByb3ZpZGVkLCAiCi0JCQkiZXhpdGluZy5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA0NywKKwkJICAgICJwb3J0X3BhcmFtIGhlYWRlciBub3QgcHJvdmlkZWQuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKHBvcnRfcGFyYW0tPmZjX3Njc2lfYWRkci5kZXN0X3R5cGUgIT0gRVhUX0RFRl9UWVBFX1dXUE4pIHsKLQkJREVCVUcyKHByaW50ayhLRVJOX0VSUiAiJXMoJWxkKTogSW52YWxpZCBkZXN0aW5hdGlvbiB0eXBlXG4iLAotCQkJX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDQ4LAorCQkgICAgIkludmFsaWQgZGVzdGluYXRpb24gdHlwZS5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTEyNDksMjEgKzEyNjYsMjAgQEAKIAl9CiAKIAlpZiAoIWZjcG9ydCkgewotCQlERUJVRzIocHJpbnRrKEtFUk5fRVJSICIlcyglbGQpOiBGYWlsZWQgdG8gZmluZCBwb3J0XG4iLAotCQkJX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDQ5LAorCQkgICAgIkZhaWxlZCB0byBmaW5kIHBvcnQuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKGF0b21pY19yZWFkKCZmY3BvcnQtPnN0YXRlKSAhPSBGQ1NfT05MSU5FKSB7Ci0JCURFQlVHMihwcmludGsoS0VSTl9FUlIgIiVzKCVsZCk6IFBvcnQgbm90IG9ubGluZVxuIiwKLQkJCV9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA0YSwKKwkJICAgICJQb3J0IGlzIG5vdCBvbmxpbmUuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKGZjcG9ydC0+ZmxhZ3MgJiBGQ0ZfTE9HSU5fTkVFREVEKSB7Ci0JCURFQlVHMihwcmludGsoS0VSTl9FUlIgIiVzKCVsZCk6IFJlbW90ZSBwb3J0IG5vdCBsb2dnZWQgaW4sICIKLQkJICAgICJmbGFncyA9IDB4JXhcbiIsCi0JCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBmY3BvcnQtPmZsYWdzKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwNGIsCisJCSAgICAiUmVtb3RlIHBvcnQgbm90IGxvZ2dlZCBpbiBmbGFncyA9IDB4JXguXG4iLCBmY3BvcnQtPmZsYWdzKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0xMjc1LDE1ICsxMjkxLDEzIEBACiAJCQkmcG9ydF9wYXJhbS0+c3BlZWQsIG1iKTsKIAogCWlmIChydmFsKSB7Ci0JCURFQlVHMTYocHJpbnRrKEtFUk5fRVJSICJzY3NpKCVsZCk6IGlJRE1BIGNtZCBmYWlsZWQgZm9yICIKLQkJCSIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAtLSAiCi0JCQkiJTA0eCAleCAlMDR4ICUwNHguXG4iLAotCQkJdmhhLT5ob3N0X25vLCBmY3BvcnQtPnBvcnRfbmFtZVswXSwKLQkJCWZjcG9ydC0+cG9ydF9uYW1lWzFdLAotCQkJZmNwb3J0LT5wb3J0X25hbWVbMl0sIGZjcG9ydC0+cG9ydF9uYW1lWzNdLAotCQkJZmNwb3J0LT5wb3J0X25hbWVbNF0sIGZjcG9ydC0+cG9ydF9uYW1lWzVdLAotCQkJZmNwb3J0LT5wb3J0X25hbWVbNl0sIGZjcG9ydC0+cG9ydF9uYW1lWzddLCBydmFsLAotCQkJZmNwb3J0LT5mcF9zcGVlZCwgbWJbMF0sIG1iWzFdKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwNGMsCisJCSAgICAiaUlETUEgY21kIGZhaWxlZCBmb3IgJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggLS0gIgorCQkgICAgIiUwNHggJXggJTA0eCAlMDR4LlxuIiwgZmNwb3J0LT5wb3J0X25hbWVbMF0sCisJCSAgICBmY3BvcnQtPnBvcnRfbmFtZVsxXSwgZmNwb3J0LT5wb3J0X25hbWVbMl0sCisJCSAgICBmY3BvcnQtPnBvcnRfbmFtZVszXSwgZmNwb3J0LT5wb3J0X25hbWVbNF0sCisJCSAgICBmY3BvcnQtPnBvcnRfbmFtZVs1XSwgZmNwb3J0LT5wb3J0X25hbWVbNl0sCisJCSAgICBmY3BvcnQtPnBvcnRfbmFtZVs3XSwgcnZhbCwgZmNwb3J0LT5mcF9zcGVlZCwgbWJbMF0sIG1iWzFdKTsKIAkJcnZhbCA9IDA7CiAJCWJzZ19qb2ItPnJlcGx5LT5yZXN1bHQgPSAoRElEX0VSUk9SIDw8IDE2KTsKIApAQCAtMTMwNywxMSArMTMyMSwxMiBAQAogfQogCiBzdGF0aWMgaW50Ci1xbGEyeDAwX29wdHJvbV9zZXR1cChzdHJ1Y3QgZmNfYnNnX2pvYiAqYnNnX2pvYiwgc3RydWN0IHFsYV9od19kYXRhICpoYSwKK3FsYTJ4MDBfb3B0cm9tX3NldHVwKHN0cnVjdCBmY19ic2dfam9iICpic2dfam9iLCBzY3NpX3FsYV9ob3N0X3QgKnZoYSwKIAl1aW50OF90IGlzX3VwZGF0ZSkKIHsKIAl1aW50MzJfdCBzdGFydCA9IDA7CiAJaW50IHZhbGlkID0gMDsKKwlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAogCWJzZ19qb2ItPnJlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPSAwOwogCkBAIC0xMzE5LDE0ICsxMzM0LDIwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJc3RhcnQgPSBic2dfam9iLT5yZXF1ZXN0LT5ycXN0X2RhdGEuaF92ZW5kb3IudmVuZG9yX2NtZFsxXTsKLQlpZiAoc3RhcnQgPiBoYS0+b3B0cm9tX3NpemUpCisJaWYgKHN0YXJ0ID4gaGEtPm9wdHJvbV9zaXplKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwNTUsCisJCSAgICAic3RhcnQgJWQgPiBvcHRyb21fc2l6ZSAlZC5cbiIsIHN0YXJ0LCBoYS0+b3B0cm9tX3NpemUpOwogCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKLQlpZiAoaGEtPm9wdHJvbV9zdGF0ZSAhPSBRTEFfU1dBSVRJTkcpCisJaWYgKGhhLT5vcHRyb21fc3RhdGUgIT0gUUxBX1NXQUlUSU5HKSB7CisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDcwNTYsCisJCSAgICAib3B0cm9tX3N0YXRlICVkLlxuIiwgaGEtPm9wdHJvbV9zdGF0ZSk7CiAJCXJldHVybiAtRUJVU1k7CisJfQogCiAJaGEtPm9wdHJvbV9yZWdpb25fc3RhcnQgPSBzdGFydDsKLQorCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwNTcsICJpc191cGRhdGU9JWQuXG4iLCBpc191cGRhdGUpOwogCWlmIChpc191cGRhdGUpIHsKIAkJaWYgKGhhLT5vcHRyb21fc2l6ZSA9PSBPUFRST01fU0laRV8yMzAwICYmIHN0YXJ0ID09IDApCiAJCQl2YWxpZCA9IDE7CkBAIC0xMzM3LDkgKzEzNTgsOSBAQAogCQkgICAgSVNfUUxBOFhYWF9UWVBFKGhhKSkKIAkJCXZhbGlkID0gMTsKIAkJaWYgKCF2YWxpZCkgewotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJICAgICJJbnZhbGlkIHN0YXJ0IHJlZ2lvbiAweCV4LzB4JXguXG4iLAotCQkJICAgIHN0YXJ0LCBic2dfam9iLT5yZXF1ZXN0X3BheWxvYWQucGF5bG9hZF9sZW4pOworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA1OCwKKwkJCSAgICAiSW52YWxpZCBzdGFydCByZWdpb24gMHgleC8weCV4LlxuIiwgc3RhcnQsCisJCQkgICAgYnNnX2pvYi0+cmVxdWVzdF9wYXlsb2FkLnBheWxvYWRfbGVuKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKQEAgLTEzNTgsOSArMTM3OSw5IEBACiAKIAloYS0+b3B0cm9tX2J1ZmZlciA9IHZtYWxsb2MoaGEtPm9wdHJvbV9yZWdpb25fc2l6ZSk7CiAJaWYgKCFoYS0+b3B0cm9tX2J1ZmZlcikgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwNTksCiAJCSAgICAiUmVhZDogVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3B0cm9tIHJldHJpZXZhbCAiCi0JCSAgICAiKCV4KS5cbiIsIGhhLT5vcHRyb21fcmVnaW9uX3NpemUpOworCQkgICAgIigleClcbiIsIGhhLT5vcHRyb21fcmVnaW9uX3NpemUpOwogCiAJCWhhLT5vcHRyb21fc3RhdGUgPSBRTEFfU1dBSVRJTkc7CiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTM3OCw3ICsxMzk5LDcgQEAKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlpbnQgcnZhbCA9IDA7CiAKLQlydmFsID0gcWxhMngwMF9vcHRyb21fc2V0dXAoYnNnX2pvYiwgaGEsIDApOworCXJ2YWwgPSBxbGEyeDAwX29wdHJvbV9zZXR1cChic2dfam9iLCB2aGEsIDApOwogCWlmIChydmFsKQogCQlyZXR1cm4gcnZhbDsKIApAQCAtMTQwNiw3ICsxNDI3LDcgQEAKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlpbnQgcnZhbCA9IDA7CiAKLQlydmFsID0gcWxhMngwMF9vcHRyb21fc2V0dXAoYnNnX2pvYiwgaGEsIDEpOworCXJ2YWwgPSBxbGEyeDAwX29wdHJvbV9zZXR1cChic2dfam9iLCB2aGEsIDEpOwogCWlmIChydmFsKQogCQlyZXR1cm4gcnZhbDsKIApAQCAtMTQ2NCw2ICsxNDg1LDIzIEBACiBxbGEyNHh4X2JzZ19yZXF1ZXN0KHN0cnVjdCBmY19ic2dfam9iICpic2dfam9iKQogewogCWludCByZXQgPSAtRUlOVkFMOworCXN0cnVjdCBmY19ycG9ydCAqcnBvcnQ7CisJZmNfcG9ydF90ICpmY3BvcnQgPSBOVUxMOworCXN0cnVjdCBTY3NpX0hvc3QgKmhvc3Q7CisJc2NzaV9xbGFfaG9zdF90ICp2aGE7CisKKwlpZiAoYnNnX2pvYi0+cmVxdWVzdC0+bXNnY29kZSA9PSBGQ19CU0dfUlBUX0VMUykgeworCQlycG9ydCA9IGJzZ19qb2ItPnJwb3J0OworCQlmY3BvcnQgPSAqKGZjX3BvcnRfdCAqKikgcnBvcnQtPmRkX2RhdGE7CisJCWhvc3QgPSBycG9ydF90b19zaG9zdChycG9ydCk7CisJCXZoYSA9IHNob3N0X3ByaXYoaG9zdCk7CisJfSBlbHNlIHsKKwkJaG9zdCA9IGJzZ19qb2ItPnNob3N0OworCQl2aGEgPSBzaG9zdF9wcml2KGhvc3QpOworCX0KKworCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwMDAsCisJICAgICJFbnRlcmVkICVzIG1zZ2NvZGU9JWQuXG4iLCBfX2Z1bmNfXywgYnNnX2pvYi0+cmVxdWVzdC0+bXNnY29kZSk7CiAKIAlzd2l0Y2ggKGJzZ19qb2ItPnJlcXVlc3QtPm1zZ2NvZGUpIHsKIAljYXNlIEZDX0JTR19SUFRfRUxTOgpAQCAtMTQ4MCw3ICsxNTE4LDcgQEAKIAljYXNlIEZDX0JTR19IU1RfREVMX1JQT1JUOgogCWNhc2UgRkNfQlNHX1JQVF9DVDoKIAlkZWZhdWx0OgotCQlERUJVRzIocHJpbnRrKCJxbGEyeHh4OiB1bnN1cHBvcnRlZCBCU0cgcmVxdWVzdFxuIikpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDVhLCAiVW5zdXBwb3J0ZWQgQlNHIHJlcXVlc3QuXG4iKTsKIAkJYnJlYWs7CiAJfQogCXJldHVybiByZXQ7CkBAIC0xNTE0LDE3ICsxNTUyLDE1IEBACiAJCQkJCSYmIChzcF9ic2ctPnUuYnNnX2pvYiA9PSBic2dfam9iKSkgewogCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCQkJCQlpZiAoaGEtPmlzcF9vcHMtPmFib3J0X2NvbW1hbmQoc3ApKSB7Ci0JCQkJCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJCQkJICAgICJzY3NpKCVsZCk6IG1ieCAiCi0JCQkJCQkgICAgImFib3J0X2NvbW1hbmQgZmFpbGVkXG4iLAotCQkJCQkJICAgIHZoYS0+aG9zdF9ubykpOworCQkJCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA4OSwKKwkJCQkJCSAgICAibWJ4IGFib3J0X2NvbW1hbmQgIgorCQkJCQkJICAgICJmYWlsZWQuXG4iKTsKIAkJCQkJCWJzZ19qb2ItPnJlcS0+ZXJyb3JzID0KIAkJCQkJCWJzZ19qb2ItPnJlcGx5LT5yZXN1bHQgPSAtRUlPOwogCQkJCQl9IGVsc2UgewotCQkJCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCQkJCSAgICAic2NzaSglbGQpOiBtYnggIgotCQkJCQkJICAgICJhYm9ydF9jb21tYW5kIHN1Y2Nlc3NcbiIsCi0JCQkJCQkgICAgdmhhLT5ob3N0X25vKSk7CisJCQkJCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDhhLAorCQkJCQkJICAgICJtYnggYWJvcnRfY29tbWFuZCAiCisJCQkJCQkgICAgInN1Y2Nlc3MuXG4iKTsKIAkJCQkJCWJzZ19qb2ItPnJlcS0+ZXJyb3JzID0KIAkJCQkJCWJzZ19qb2ItPnJlcGx5LT5yZXN1bHQgPSAwOwogCQkJCQl9CkBAIC0xNTM1LDggKzE1NzEsNyBAQAogCQl9CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7Ci0JREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJInNjc2koJWxkKSBTUkIgbm90IGZvdW5kIHRvIGFib3J0XG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg3MDhiLCAiU1JCIG5vdCBmb3VuZCB0byBhYm9ydC5cbiIpOwogCWJzZ19qb2ItPnJlcS0+ZXJyb3JzID0gYnNnX2pvYi0+cmVwbHktPnJlc3VsdCA9IC1FTlhJTzsKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5jCmluZGV4IGM1MzcxOWEuLjIxNTUwNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmMKQEAgLTQsMTAgKzQsMzYgQEAKICAqCiAgKiBTZWUgTElDRU5TRS5xbGEyeHh4IGZvciBjb3B5cmlnaHQgYW5kIGxpY2Vuc2luZyBkZXRhaWxzLgogICovCisKKy8qCisgKiBUYWJsZSBmb3Igc2hvd2luZyB0aGUgY3VycmVudCBtZXNzYWdlIGlkIGluIHVzZSBmb3IgcGFydGljdWxhciBsZXZlbAorICogQ2hhbmdlIHRoaXMgdGFibGUgZm9yIGFkZGl0aW9uIG9mIGxvZy9kZWJ1ZyBtZXNzYWdlcy4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiB8ICAgICAgICAgICAgIExldmVsICAgICAgICAgICAgfCAgIExhc3QgVmFsdWUgVXNlZCAgfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHwgTW9kdWxlIEluaXQgYW5kIFByb2JlICAgICAgICB8ICAgICAgIDB4MDExNiAgICAgICB8CisgKiB8IE1haWxib3ggY29tbWFuZHMgICAgICAgICAgICAgfCAgICAgICAweDExMWUgICAgICAgfAorICogfCBEZXZpY2UgRGlzY292ZXJ5ICAgICAgICAgICAgIHwgICAgICAgMHgyMDgzICAgICAgIHwKKyAqIHwgUXVldWUgQ29tbWFuZCBhbmQgSU8gdHJhY2luZyB8ICAgICAgIDB4MzAyZSAgICAgICB8CisgKiB8IERQQyBUaHJlYWQgICAgICAgICAgICAgICAgICAgfCAgICAgICAweDQwMWMgICAgICAgfAorICogfCBBc3luYyBFdmVudHMgICAgICAgICAgICAgICAgIHwgICAgICAgMHg1MDU5ICAgICAgIHwKKyAqIHwgVGltZXIgUm91dGluZXMgICAgICAgICAgICAgICB8ICAgICAgIDB4NjAwZCAgICAgICB8CisgKiB8IFVzZXIgU3BhY2UgSW50ZXJhY3Rpb25zICAgICAgfCAgICAgICAweDcwOWMgICAgICAgfAorICogfCBUYXNrIE1hbmFnZW1lbnQgICAgICAgICAgICAgIHwgICAgICAgMHg4MDQzICAgICAgIHwKKyAqIHwgQUVSL0VFSCAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIDB4OTAwZiAgICAgICB8CisgKiB8IFZpcnR1YWwgUG9ydCAgICAgICAgICAgICAgICAgfCAgICAgICAweGEwMDcgICAgICAgfAorICogfCBJU1A4MlhYIFNwZWNpZmljICAgICAgICAgICAgIHwgICAgICAgMHhiMDI3ICAgICAgIHwKKyAqIHwgTXVsdGlRICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIDB4YzAwYiAgICAgICB8CisgKiB8IE1pc2MgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAweGQwMGIgICAgICAgfAorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworCiAjaW5jbHVkZSAicWxhX2RlZi5oIgogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIAorc3RhdGljIHVpbnQzMl90IHFsX2RiZ19vZmZzZXQgPSAweDgwMDsKKwogc3RhdGljIGlubGluZSB2b2lkCiBxbGEyeHh4X3ByZXBfZHVtcChzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCBzdHJ1Y3QgcWxhMnh4eF9md19kdW1wICpmd19kdW1wKQogewpAQCAtMzgzLDExICs0MDksMTEgQEAKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJGYWlsZWQgdG8gZHVtcCBmaXJtd2FyZSAoJXgpISEhXG4iLCBydmFsKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4ZDAwMCwKKwkJICAgICJGYWlsZWQgdG8gZHVtcCBmaXJtd2FyZSAoJXgpLlxuIiwgcnZhbCk7CiAJCWhhLT5md19kdW1wZWQgPSAwOwogCX0gZWxzZSB7Ci0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4ZDAwMSwKIAkJICAgICJGaXJtd2FyZSBkdW1wIHNhdmVkIHRvIHRlbXAgYnVmZmVyICglbGQvJXApLlxuIiwKIAkJICAgIHZoYS0+aG9zdF9ubywgaGEtPmZ3X2R1bXApOwogCQloYS0+ZndfZHVtcGVkID0gMTsKQEAgLTQxOSwxNSArNDQ1LDE2IEBACiAJCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCiAJaWYgKCFoYS0+ZndfZHVtcCkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiTm8gYnVmZmVyIGF2YWlsYWJsZSBmb3IgZHVtcCEhIVxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGQwMDIsCisJCSAgICAiTm8gYnVmZmVyIGF2YWlsYWJsZSBmb3IgZHVtcC5cbiIpOwogCQlnb3RvIHFsYTIzMDBfZndfZHVtcF9mYWlsZWQ7CiAJfQogCiAJaWYgKGhhLT5md19kdW1wZWQpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIkZpcm13YXJlIGhhcyBiZWVuIHByZXZpb3VzbHkgZHVtcGVkICglcCkgLS0gaWdub3JpbmcgIgotCQkgICAgInJlcXVlc3QuLi5cbiIsIGhhLT5md19kdW1wKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4ZDAwMywKKwkJICAgICJGaXJtd2FyZSBoYXMgYmVlbiBwcmV2aW91c2x5IGR1bXBlZCAoJXApICIKKwkJICAgICItLSBpZ25vcmluZyByZXF1ZXN0LlxuIiwKKwkJICAgIGhhLT5md19kdW1wKTsKIAkJZ290byBxbGEyMzAwX2Z3X2R1bXBfZmFpbGVkOwogCX0KIAlmdyA9ICZoYS0+ZndfZHVtcC0+aXNwLmlzcDIzOwpAQCAtNTgyLDE1ICs2MDksMTYgQEAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAKIAlpZiAoIWhhLT5md19kdW1wKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJObyBidWZmZXIgYXZhaWxhYmxlIGZvciBkdW1wISEhXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4ZDAwNCwKKwkJICAgICJObyBidWZmZXIgYXZhaWxhYmxlIGZvciBkdW1wLlxuIik7CiAJCWdvdG8gcWxhMjEwMF9md19kdW1wX2ZhaWxlZDsKIAl9CiAKIAlpZiAoaGEtPmZ3X2R1bXBlZCkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiRmlybXdhcmUgaGFzIGJlZW4gcHJldmlvdXNseSBkdW1wZWQgKCVwKSAtLSBpZ25vcmluZyAiCi0JCSAgICAicmVxdWVzdC4uLlxuIiwgaGEtPmZ3X2R1bXApOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhkMDA1LAorCQkgICAgIkZpcm13YXJlIGhhcyBiZWVuIHByZXZpb3VzbHkgZHVtcGVkICglcCkgIgorCQkgICAgIi0tIGlnbm9yaW5nIHJlcXVlc3QuXG4iLAorCQkgICAgaGEtPmZ3X2R1bXApOwogCQlnb3RvIHFsYTIxMDBfZndfZHVtcF9mYWlsZWQ7CiAJfQogCWZ3ID0gJmhhLT5md19kdW1wLT5pc3AuaXNwMjE7CkBAIC03NzksMTUgKzgwNywxNiBAQAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAogCWlmICghaGEtPmZ3X2R1bXApIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIk5vIGJ1ZmZlciBhdmFpbGFibGUgZm9yIGR1bXAhISFcbiIpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhkMDA2LAorCQkgICAgIk5vIGJ1ZmZlciBhdmFpbGFibGUgZm9yIGR1bXAuXG4iKTsKIAkJZ290byBxbGEyNHh4X2Z3X2R1bXBfZmFpbGVkOwogCX0KIAogCWlmIChoYS0+ZndfZHVtcGVkKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJGaXJtd2FyZSBoYXMgYmVlbiBwcmV2aW91c2x5IGR1bXBlZCAoJXApIC0tIGlnbm9yaW5nICIKLQkJICAgICJyZXF1ZXN0Li4uXG4iLCBoYS0+ZndfZHVtcCk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGQwMDcsCisJCSAgICAiRmlybXdhcmUgaGFzIGJlZW4gcHJldmlvdXNseSBkdW1wZWQgKCVwKSAiCisJCSAgICAiLS0gaWdub3JpbmcgcmVxdWVzdC5cbiIsCisJCSAgICBoYS0+ZndfZHVtcCk7CiAJCWdvdG8gcWxhMjR4eF9md19kdW1wX2ZhaWxlZDsKIAl9CiAJZncgPSAmaGEtPmZ3X2R1bXAtPmlzcC5pc3AyNDsKQEAgLTEwMTcsMTUgKzEwNDYsMTYgQEAKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5oYXJkd2FyZV9sb2NrLCBmbGFncyk7CiAKIAlpZiAoIWhhLT5md19kdW1wKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJObyBidWZmZXIgYXZhaWxhYmxlIGZvciBkdW1wISEhXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4ZDAwOCwKKwkJICAgICJObyBidWZmZXIgYXZhaWxhYmxlIGZvciBkdW1wLlxuIik7CiAJCWdvdG8gcWxhMjV4eF9md19kdW1wX2ZhaWxlZDsKIAl9CiAKIAlpZiAoaGEtPmZ3X2R1bXBlZCkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiRmlybXdhcmUgaGFzIGJlZW4gcHJldmlvdXNseSBkdW1wZWQgKCVwKSAtLSBpZ25vcmluZyAiCi0JCSAgICAicmVxdWVzdC4uLlxuIiwgaGEtPmZ3X2R1bXApOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhkMDA5LAorCQkgICAgIkZpcm13YXJlIGhhcyBiZWVuIHByZXZpb3VzbHkgZHVtcGVkICglcCkgIgorCQkgICAgIi0tIGlnbm9yaW5nIHJlcXVlc3QuXG4iLAorCQkgICAgaGEtPmZ3X2R1bXApOwogCQlnb3RvIHFsYTI1eHhfZndfZHVtcF9mYWlsZWQ7CiAJfQogCWZ3ID0gJmhhLT5md19kdW1wLT5pc3AuaXNwMjU7CkBAIC0xMzI4LDE1ICsxMzU4LDE2IEBACiAJCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCiAJaWYgKCFoYS0+ZndfZHVtcCkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiTm8gYnVmZmVyIGF2YWlsYWJsZSBmb3IgZHVtcCEhIVxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGQwMGEsCisJCSAgICAiTm8gYnVmZmVyIGF2YWlsYWJsZSBmb3IgZHVtcC5cbiIpOwogCQlnb3RvIHFsYTgxeHhfZndfZHVtcF9mYWlsZWQ7CiAJfQogCiAJaWYgKGhhLT5md19kdW1wZWQpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIkZpcm13YXJlIGhhcyBiZWVuIHByZXZpb3VzbHkgZHVtcGVkICglcCkgLS0gaWdub3JpbmcgIgotCQkgICAgInJlcXVlc3QuLi5cbiIsIGhhLT5md19kdW1wKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4ZDAwYiwKKwkJICAgICJGaXJtd2FyZSBoYXMgYmVlbiBwcmV2aW91c2x5IGR1bXBlZCAoJXApICIKKwkJICAgICItLSBpZ25vcmluZyByZXF1ZXN0LlxuIiwKKwkJICAgIGhhLT5md19kdW1wKTsKIAkJZ290byBxbGE4MXh4X2Z3X2R1bXBfZmFpbGVkOwogCX0KIAlmdyA9ICZoYS0+ZndfZHVtcC0+aXNwLmlzcDgxOwpAQCAtMTYxOSwxMDYgKzE2NTAsMjU1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgIERyaXZlciBEZWJ1ZyBGdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBmb3IgZm9ybWF0dGluZyBhbmQgbG9nZ2luZyBkZWJ1ZyBpbmZvcm1hdGlvbi4KKyAqIEl0IGlzIHRvIGJlIHVzZWQgd2hlbiB2aGEgaXMgYXZhaWxhYmxlLiBJdCBmb3JtYXRzIHRoZSBtZXNzYWdlCisgKiBhbmQgbG9ncyBpdCB0byB0aGUgbWVzc2FnZXMgZmlsZS4KKyAqIHBhcmFtZXRlcnM6CisgKiBsZXZlbDogVGhlIGxldmVsIG9mIHRoZSBkZWJ1ZyBtZXNzYWdlcyB0byBiZSBwcmludGVkLgorICogICAgICAgIElmIHFsMnhleHRlbmRlZF9lcnJvcl9sb2dnaW5nIHZhbHVlIGlzIGNvcnJlY3RseSBzZXQsCisgKiAgICAgICAgdGhpcyBtZXNzYWdlIHdpbGwgYXBwZWFyIGluIHRoZSBtZXNzYWdlcyBmaWxlLgorICogdmhhOiAgIFBvaW50ZXIgdG8gdGhlIHNjc2lfcWxhX2hvc3RfdC4KKyAqIGlkOiAgICBUaGlzIGlzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBsZXZlbC4gSXQgaWRlbnRpZmllcyB0aGUKKyAqICAgICAgICBwYXJ0IG9mIHRoZSBjb2RlIGZyb20gd2hlcmUgdGhlIG1lc3NhZ2Ugb3JpZ2luYXRlZC4KKyAqIG1zZzogICBUaGUgbWVzc2FnZSB0byBiZSBkaXNwbGF5ZWQuCisgKi8KK3ZvaWQKK3FsX2RiZyh1aW50MzJfdCBsZXZlbCwgc2NzaV9xbGFfaG9zdF90ICp2aGEsIGludDMyX3QgaWQsIGNoYXIgKm1zZywgLi4uKSB7CisKKwljaGFyIHBidWZbUUxfREJHX0JVRl9MRU5dOworCXZhX2xpc3QgYXA7CisJdWludDMyX3QgbGVuOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKKworCW1lbXNldChwYnVmLCAwLCBRTF9EQkdfQlVGX0xFTik7CisKKwl2YV9zdGFydChhcCwgbXNnKTsKKworCWlmICgobGV2ZWwgJiBxbDJ4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZykgPT0gbGV2ZWwpIHsKKwkJaWYgKHZoYSAhPSBOVUxMKSB7CisJCQlwZGV2ID0gdmhhLT5ody0+cGRldjsKKwkJCS8qIDxtb2R1bGUtbmFtZT4gPHBjaS1uYW1lPiA8bXNnLWlkPjo8aG9zdD4gTWVzc2FnZSAqLworCQkJc3ByaW50ZihwYnVmLCAiJXMgWyVzXS0lMDR4OiVsZDogIiwgUUxfTVNHSERSLAorCQkJICAgIGRldl9uYW1lKCYocGRldi0+ZGV2KSksIGlkICsgcWxfZGJnX29mZnNldCwKKwkJCSAgICB2aGEtPmhvc3Rfbm8pOworCQl9IGVsc2UKKwkJCXNwcmludGYocGJ1ZiwgIiVzIFslc10tJTA0eDogOiAiLCBRTF9NU0dIRFIsCisJCQkgICAgIjAwMDA6MDA6MDAuMCIsIGlkICsgcWxfZGJnX29mZnNldCk7CisKKwkJbGVuID0gc3RybGVuKHBidWYpOworCQl2c3ByaW50ZihwYnVmK2xlbiwgbXNnLCBhcCk7CisJCXByX3dhcm5pbmcoIiVzIiwgcGJ1Zik7CisJfQorCisJdmFfZW5kKGFwKTsKKworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBmb3IgZm9ybWF0dGluZyBhbmQgbG9nZ2luZyBkZWJ1ZyBpbmZvcm1hdGlvbi4KKyAqIEl0IGlzIHRvIGJlIHVzZWQgd2hlbiB2aGEgaXMgbm90IGF2YWlsYWJsZSBhbmQgcGNpIGlzIGF2YWlsYmxlLAorICogaS5lLiwgYmVmb3JlIGhvc3QgYWxsb2NhdGlvbi4gSXQgZm9ybWF0cyB0aGUgbWVzc2FnZSBhbmQgbG9ncyBpdAorICogdG8gdGhlIG1lc3NhZ2VzIGZpbGUuCisgKiBwYXJhbWV0ZXJzOgorICogbGV2ZWw6IFRoZSBsZXZlbCBvZiB0aGUgZGVidWcgbWVzc2FnZXMgdG8gYmUgcHJpbnRlZC4KKyAqICAgICAgICBJZiBxbDJ4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZyB2YWx1ZSBpcyBjb3JyZWN0bHkgc2V0LAorICogICAgICAgIHRoaXMgbWVzc2FnZSB3aWxsIGFwcGVhciBpbiB0aGUgbWVzc2FnZXMgZmlsZS4KKyAqIHBkZXY6ICBQb2ludGVyIHRvIHRoZSBzdHJ1Y3QgcGNpX2Rldi4KKyAqIGlkOiAgICBUaGlzIGlzIGEgdW5pcXVlIGlkIGZvciB0aGUgbGV2ZWwuIEl0IGlkZW50aWZpZXMgdGhlIHBhcnQKKyAqICAgICAgICBvZiB0aGUgY29kZSBmcm9tIHdoZXJlIHRoZSBtZXNzYWdlIG9yaWdpbmF0ZWQuCisgKiBtc2c6ICAgVGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkLgorICovCit2b2lkCitxbF9kYmdfcGNpKHVpbnQzMl90IGxldmVsLCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50MzJfdCBpZCwgY2hhciAqbXNnLCAuLi4pIHsKKworCWNoYXIgcGJ1ZltRTF9EQkdfQlVGX0xFTl07CisJdmFfbGlzdCBhcDsKKwl1aW50MzJfdCBsZW47CisKKwlpZiAocGRldiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwltZW1zZXQocGJ1ZiwgMCwgUUxfREJHX0JVRl9MRU4pOworCisJdmFfc3RhcnQoYXAsIG1zZyk7CisKKwlpZiAoKGxldmVsICYgcWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcpID09IGxldmVsKSB7CisJCS8qIDxtb2R1bGUtbmFtZT4gPGRldi1uYW1lPjo8bXNnLWlkPiBNZXNzYWdlICovCisJCXNwcmludGYocGJ1ZiwgIiVzIFslc10tJTA0eDogOiAiLCBRTF9NU0dIRFIsCisJCSAgICBkZXZfbmFtZSgmKHBkZXYtPmRldikpLCBpZCArIHFsX2RiZ19vZmZzZXQpOworCisJCWxlbiA9IHN0cmxlbihwYnVmKTsKKwkJdnNwcmludGYocGJ1ZitsZW4sIG1zZywgYXApOworCQlwcl93YXJuaW5nKCIlcyIsIHBidWYpOworCX0KKworCXZhX2VuZChhcCk7CisKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgZm9yIGZvcm1hdHRpbmcgYW5kIGxvZ2dpbmcgbG9nIG1lc3NhZ2VzLgorICogSXQgaXMgdG8gYmUgdXNlZCB3aGVuIHZoYSBpcyBhdmFpbGFibGUuIEl0IGZvcm1hdHMgdGhlIG1lc3NhZ2UKKyAqIGFuZCBsb2dzIGl0IHRvIHRoZSBtZXNzYWdlcyBmaWxlLiBBbGwgdGhlIG1lc3NhZ2VzIHdpbGwgYmUgbG9nZ2VkCisgKiBpcnJlc3BlY3RpdmUgb2YgdmFsdWUgb2YgcWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcuCisgKiBwYXJhbWV0ZXJzOgorICogbGV2ZWw6IFRoZSBsZXZlbCBvZiB0aGUgbG9nIG1lc3NhZ2VzIHRvIGJlIHByaW50ZWQgaW4gdGhlCisgKiAgICAgICAgbWVzc2FnZXMgZmlsZS4KKyAqIHZoYTogICBQb2ludGVyIHRvIHRoZSBzY3NpX3FsYV9ob3N0X3QKKyAqIGlkOiAgICBUaGlzIGlzIGEgdW5pcXVlIGlkIGZvciB0aGUgbGV2ZWwuIEl0IGlkZW50aWZpZXMgdGhlCisgKiAgICAgICAgcGFydCBvZiB0aGUgY29kZSBmcm9tIHdoZXJlIHRoZSBtZXNzYWdlIG9yaWdpbmF0ZWQuCisgKiBtc2c6ICAgVGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkLgorICovCit2b2lkCitxbF9sb2codWludDMyX3QgbGV2ZWwsIHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBpbnQzMl90IGlkLCBjaGFyICptc2csIC4uLikgeworCisJY2hhciBwYnVmW1FMX0RCR19CVUZfTEVOXTsKKwl2YV9saXN0IGFwOworCXVpbnQzMl90IGxlbjsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisKKwltZW1zZXQocGJ1ZiwgMCwgUUxfREJHX0JVRl9MRU4pOworCisJdmFfc3RhcnQoYXAsIG1zZyk7CisKKwlpZiAobGV2ZWwgPD0gcWxfZXJybGV2KSB7CisJCWlmICh2aGEgIT0gTlVMTCkgeworCQkJcGRldiA9IHZoYS0+aHctPnBkZXY7CisJCQkvKiA8bW9kdWxlLW5hbWU+IDxtc2ctaWQ+Ojxob3N0PiBNZXNzYWdlICovCisJCQlzcHJpbnRmKHBidWYsICIlcyBbJXNdLSUwNHg6JWxkOiAiLCBRTF9NU0dIRFIsCisJCQkgICAgZGV2X25hbWUoJihwZGV2LT5kZXYpKSwgaWQsIHZoYS0+aG9zdF9ubyk7CisJCX0gZWxzZQorCQkJc3ByaW50ZihwYnVmLCAiJXMgWyVzXS0lMDR4OiA6ICIsIFFMX01TR0hEUiwKKwkJCSAgICAiMDAwMDowMDowMC4wIiwgaWQpOworCisJCWxlbiA9IHN0cmxlbihwYnVmKTsKKwkJCXZzcHJpbnRmKHBidWYrbGVuLCBtc2csIGFwKTsKKworCQlzd2l0Y2ggKGxldmVsKSB7CisJCWNhc2UgMDogLyogRkFUQUwgTE9HICovCisJCQlwcl9jcml0KCIlcyIsIHBidWYpOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCXByX2VycigiJXMiLCBwYnVmKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlwcl93YXJuKCIlcyIsIHBidWYpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcl9pbmZvKCIlcyIsIHBidWYpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwl2YV9lbmQoYXApOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBpcyBmb3IgZm9ybWF0dGluZyBhbmQgbG9nZ2luZyBsb2cgbWVzc2FnZXMuCisgKiBJdCBpcyB0byBiZSB1c2VkIHdoZW4gdmhhIGlzIG5vdCBhdmFpbGFibGUgYW5kIHBjaSBpcyBhdmFpbGJsZSwKKyAqIGkuZS4sIGJlZm9yZSBob3N0IGFsbG9jYXRpb24uIEl0IGZvcm1hdHMgdGhlIG1lc3NhZ2UgYW5kIGxvZ3MKKyAqIGl0IHRvIHRoZSBtZXNzYWdlcyBmaWxlLiBBbGwgdGhlIG1lc3NhZ2VzIGFyZSBsb2dnZWQgaXJyZXNwZWN0aXZlCisgKiBvZiB0aGUgdmFsdWUgb2YgcWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcuCisgKiBwYXJhbWV0ZXJzOgorICogbGV2ZWw6IFRoZSBsZXZlbCBvZiB0aGUgbG9nIG1lc3NhZ2VzIHRvIGJlIHByaW50ZWQgaW4gdGhlCisgKiAgICAgICAgbWVzc2FnZXMgZmlsZS4KKyAqIHBkZXY6ICBQb2ludGVyIHRvIHRoZSBzdHJ1Y3QgcGNpX2Rldi4KKyAqIGlkOiAgICBUaGlzIGlzIGEgdW5pcXVlIGlkIGZvciB0aGUgbGV2ZWwuIEl0IGlkZW50aWZpZXMgdGhlCisgKiAgICAgICAgcGFydCBvZiB0aGUgY29kZSBmcm9tIHdoZXJlIHRoZSBtZXNzYWdlIG9yaWdpbmF0ZWQuCisgKiBtc2c6ICAgVGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkLgorICovCit2b2lkCitxbF9sb2dfcGNpKHVpbnQzMl90IGxldmVsLCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50MzJfdCBpZCwgY2hhciAqbXNnLCAuLi4pIHsKKworCWNoYXIgcGJ1ZltRTF9EQkdfQlVGX0xFTl07CisJdmFfbGlzdCBhcDsKKwl1aW50MzJfdCBsZW47CisKKwlpZiAocGRldiA9PSBOVUxMKQorCQlyZXR1cm47CisKKwltZW1zZXQocGJ1ZiwgMCwgUUxfREJHX0JVRl9MRU4pOworCisJdmFfc3RhcnQoYXAsIG1zZyk7CisKKwlpZiAobGV2ZWwgPD0gcWxfZXJybGV2KSB7CisJCS8qIDxtb2R1bGUtbmFtZT4gPGRldi1uYW1lPjo8bXNnLWlkPiBNZXNzYWdlICovCisJCXNwcmludGYocGJ1ZiwgIiVzIFslc10tJTA0eDogOiAiLCBRTF9NU0dIRFIsCisJCSAgICBkZXZfbmFtZSgmKHBkZXYtPmRldikpLCBpZCk7CisKKwkJbGVuID0gc3RybGVuKHBidWYpOworCQl2c3ByaW50ZihwYnVmK2xlbiwgbXNnLCBhcCk7CisJCXN3aXRjaCAobGV2ZWwpIHsKKwkJY2FzZSAwOiAvKiBGQVRBTCBMT0cgKi8KKwkJCXByX2NyaXQoIiVzIiwgcGJ1Zik7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJcHJfZXJyKCIlcyIsIHBidWYpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXByX3dhcm4oIiVzIiwgcGJ1Zik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByX2luZm8oIiVzIiwgcGJ1Zik7CisJCQlicmVhazsKKwkJfQorCX0KKworCXZhX2VuZChhcCk7Cit9CiAKIHZvaWQKLXFsYTJ4MDBfZHVtcF9yZWdzKHNjc2lfcWxhX2hvc3RfdCAqdmhhKQorcWxfZHVtcF9yZWdzKHVpbnQzMl90IGxldmVsLCBzY3NpX3FsYV9ob3N0X3QgKnZoYSwgaW50MzJfdCBpZCkKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzdHJ1Y3QgZGV2aWNlX3JlZ18yeHh4IF9faW9tZW0gKnJlZyA9ICZoYS0+aW9iYXNlLT5pc3A7CiAJc3RydWN0IGRldmljZV9yZWdfMjR4eCBfX2lvbWVtICpyZWcyNCA9ICZoYS0+aW9iYXNlLT5pc3AyNDsKKwlzdHJ1Y3QgZGV2aWNlX3JlZ184Mnh4IF9faW9tZW0gKnJlZzgyID0gJmhhLT5pb2Jhc2UtPmlzcDgyOwogCXVpbnQxNl90IF9faW9tZW0gKm1ieF9yZWc7CiAKLQltYnhfcmVnID0gSVNfRldJMl9DQVBBQkxFKGhhKSA/ICZyZWcyNC0+bWFpbGJveDA6Ci0JICAgIE1BSUxCT1hfUkVHKGhhLCByZWcsIDApOworCWlmICgobGV2ZWwgJiBxbDJ4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZykgPT0gbGV2ZWwpIHsKIAotCXByaW50aygiTWFpbGJveCByZWdpc3RlcnM6XG4iKTsKLQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKQotCQlwcmludGsoInNjc2koJWxkKTogbWJveCAlZCAweCUwNHggXG4iLCB2aGEtPmhvc3Rfbm8sIGksCi0JCSAgICBSRF9SRUdfV09SRChtYnhfcmVnKyspKTsKLX0KLQotCi12b2lkCi1xbGEyeDAwX2R1bXBfYnVmZmVyKHVpbnQ4X3QgKiBiLCB1aW50MzJfdCBzaXplKQotewotCXVpbnQzMl90IGNudDsKLQl1aW50OF90IGM7Ci0KLQlwcmludGsoIiAwICAgMSAgIDIgICAzICAgNCAgIDUgICA2ICAgNyAgIDggICA5ICAiCi0JICAgICJBaCAgQmggIENoICBEaCAgRWggIEZoXG4iKTsKLQlwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iCi0JICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLQotCWZvciAoY250ID0gMDsgY250IDwgc2l6ZTspIHsKLQkJYyA9ICpiKys7Ci0JCXByaW50aygiJTAyeCIsKHVpbnQzMl90KSBjKTsKLQkJY250Kys7Ci0JCWlmICghKGNudCAlIDE2KSkKLQkJCXByaW50aygiXG4iKTsKKwkJaWYgKElTX1FMQTgyWFgoaGEpKQorCQkJbWJ4X3JlZyA9ICZyZWc4Mi0+bWFpbGJveF9pblswXTsKKwkJZWxzZSBpZiAoSVNfRldJMl9DQVBBQkxFKGhhKSkKKwkJCW1ieF9yZWcgPSAmcmVnMjQtPm1haWxib3gwOwogCQllbHNlCi0JCQlwcmludGsoIiAgIik7CisJCQltYnhfcmVnID0gTUFJTEJPWF9SRUcoaGEsIHJlZywgMCk7CisKKwkJcWxfZGJnKGxldmVsLCB2aGEsIGlkLCAiTWFpbGJveCByZWdpc3RlcnM6XG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJCXFsX2RiZyhsZXZlbCwgdmhhLCBpZCwKKwkJCSAgICAibWJveFslZF0gMHglMDR4XG4iLCBpLCBSRF9SRUdfV09SRChtYnhfcmVnKyspKTsKIAl9Ci0JaWYgKGNudCAlIDE2KQotCQlwcmludGsoIlxuIik7CiB9CiAKKwogdm9pZAotcWxhMngwMF9kdW1wX2J1ZmZlcl96aXBwZWQodWludDhfdCAqYiwgdWludDMyX3Qgc2l6ZSkKK3FsX2R1bXBfYnVmZmVyKHVpbnQzMl90IGxldmVsLCBzY3NpX3FsYV9ob3N0X3QgKnZoYSwgaW50MzJfdCBpZCwKKwl1aW50OF90ICpiLCB1aW50MzJfdCBzaXplKQogewogCXVpbnQzMl90IGNudDsKIAl1aW50OF90IGM7Ci0JdWludDhfdCAgbGFzdDE2WzE2XSwgY3VyMTZbMTZdOwotCXVpbnQzMl90IGxjID0gMCwgbnVtX3NhbWUxNiA9IDAsIGo7CisJaWYgKChsZXZlbCAmIHFsMnhleHRlbmRlZF9lcnJvcl9sb2dnaW5nKSA9PSBsZXZlbCkgewogCi0JcHJpbnRrKEtFUk5fREVCVUcgIiAwICAgMSAgIDIgICAzICAgNCAgIDUgICA2ICAgNyAgIDggICA5ICAiCi0JICAgICJBaCAgQmggIENoICBEaCAgRWggIEZoXG4iKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKLQkgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCQlxbF9kYmcobGV2ZWwsIHZoYSwgaWQsICIgMCAgIDEgICAyICAgMyAgIDQgICA1ICAgNiAgIDcgICA4ICAgIgorCQkgICAgIjkgIEFoICBCaCAgQ2ggIERoICBFaCAgRmhcbiIpOworCQlxbF9kYmcobGV2ZWwsIHZoYSwgaWQsICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorCQkgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogCi0JZm9yIChjbnQgPSAwOyBjbnQgPCBzaXplOykgewotCQljID0gKmIrKzsKLQotCQljdXIxNltsYysrXSA9IGM7Ci0KLQkJY250Kys7CisJCXFsX2RiZyhsZXZlbCwgdmhhLCBpZCwgIiIpOworCQlmb3IgKGNudCA9IDA7IGNudCA8IHNpemU7KSB7CisJCQljID0gKmIrKzsKKwkJCXByaW50aygiJTAyeCIsICh1aW50MzJfdCkgYyk7CisJCQljbnQrKzsKKwkJCWlmICghKGNudCAlIDE2KSkKKwkJCQlwcmludGsoIlxuIik7CisJCQllbHNlCisJCQkJcHJpbnRrKCIgICIpOworCQl9CiAJCWlmIChjbnQgJSAxNikKLQkJCWNvbnRpbnVlOwotCi0JCS8qIFdlIGhhdmUgMTYgbm93ICovCi0JCWxjID0gMDsKLQkJaWYgKG51bV9zYW1lMTYgPT0gMCkgewotCQkJbWVtY3B5KGxhc3QxNiwgY3VyMTYsIDE2KTsKLQkJCW51bV9zYW1lMTYrKzsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmIChtZW1jbXAoY3VyMTYsIGxhc3QxNiwgMTYpID09IDApIHsKLQkJCW51bV9zYW1lMTYrKzsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKQotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiUwMnggICIsICh1aW50MzJfdClsYXN0MTZbal0pOwotCQlwcmludGsoS0VSTl9ERUJVRyAiXG4iKTsKLQotCQlpZiAobnVtX3NhbWUxNiA+IDEpCi0JCQlwcmludGsoS0VSTl9ERUJVRyAiPiBwcmV2IHBhdHRlcm4gcmVwZWF0cyAoJXUpIgotCQkJICAgICJtb3JlIHRpbWVzXG4iLCBudW1fc2FtZTE2LTEpOwotCQltZW1jcHkobGFzdDE2LCBjdXIxNiwgMTYpOwotCQludW1fc2FtZTE2ID0gMTsKLQl9Ci0KLQlpZiAobnVtX3NhbWUxNikgewotCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlMDJ4ICAiLCAodWludDMyX3QpbGFzdDE2W2pdKTsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlxuIik7Ci0KLQkJaWYgKG51bV9zYW1lMTYgPiAxKQotCQkJcHJpbnRrKEtFUk5fREVCVUcgIj4gcHJldiBwYXR0ZXJuIHJlcGVhdHMgKCV1KSIKLQkJCSAgICAibW9yZSB0aW1lc1xuIiwgbnVtX3NhbWUxNi0xKTsKLQl9Ci0JaWYgKGxjKSB7Ci0JCWZvciAoaiA9IDA7IGogPCBsYzsgaisrKQotCQkJcHJpbnRrKEtFUk5fREVCVUcgIiUwMnggICIsICh1aW50MzJfdCljdXIxNltqXSk7Ci0JCXByaW50ayhLRVJOX0RFQlVHICJcbiIpOworCQkJcWxfZGJnKGxldmVsLCB2aGEsIGlkLCAiXG4iKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmgKaW5kZXggOTMwNDE0NS4uOThhMzc3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuaApAQCAtOCwxNDYgKzgsNiBAQAogI2luY2x1ZGUgInFsYV9kZWYuaCIKIAogLyoKLSAqIERyaXZlciBkZWJ1ZyBkZWZpbml0aW9ucy4KLSAqLwotLyogI2RlZmluZSBRTF9ERUJVR19MRVZFTF8xICAqLyAvKiBPdXRwdXQgcmVnaXN0ZXIgYWNjZXNzZXMgdG8gQ09NMSAqLwotLyogI2RlZmluZSBRTF9ERUJVR19MRVZFTF8yICAqLyAvKiBPdXRwdXQgZXJyb3IgbXNncyB0byBDT00xICovCi0vKiAjZGVmaW5lIFFMX0RFQlVHX0xFVkVMXzMgICovIC8qIE91dHB1dCBmdW5jdGlvbiB0cmFjZSBtc2dzIHRvIENPTTEgKi8KLS8qICNkZWZpbmUgUUxfREVCVUdfTEVWRUxfNCAgKi8gLyogT3V0cHV0IE5WUkFNIHRyYWNlIG1zZ3MgdG8gQ09NMSAqLwotLyogI2RlZmluZSBRTF9ERUJVR19MRVZFTF81ICAqLyAvKiBPdXRwdXQgcmluZyB0cmFjZSBtc2dzIHRvIENPTTEgKi8KLS8qICNkZWZpbmUgUUxfREVCVUdfTEVWRUxfNiAgKi8gLyogT3V0cHV0IFdBVENIRE9HIHRpbWVyIHRyYWNlIHRvIENPTTEgKi8KLS8qICNkZWZpbmUgUUxfREVCVUdfTEVWRUxfNyAgKi8gLyogT3V0cHV0IFJJU0MgbG9hZCB0cmFjZSBtc2dzIHRvIENPTTEgKi8KLS8qICNkZWZpbmUgUUxfREVCVUdfTEVWRUxfOCAgKi8gLyogT3V0cHV0IHJpbmcgc2F0dXJhdGlvbiBtc2dzIHRvIENPTTEgKi8KLS8qICNkZWZpbmUgUUxfREVCVUdfTEVWRUxfOSAgKi8gLyogT3V0cHV0IElPQ1RMIHRyYWNlIG1zZ3MgKi8KLS8qICNkZWZpbmUgUUxfREVCVUdfTEVWRUxfMTAgKi8gLyogT3V0cHV0IElPQ1RMIGVycm9yIG1zZ3MgKi8KLS8qICNkZWZpbmUgUUxfREVCVUdfTEVWRUxfMTEgKi8gLyogT3V0cHV0IE1ieCBDbWQgdHJhY2UgbXNncyAqLwotLyogI2RlZmluZSBRTF9ERUJVR19MRVZFTF8xMiAqLyAvKiBPdXRwdXQgSVAgdHJhY2UgbXNncyAqLwotLyogI2RlZmluZSBRTF9ERUJVR19MRVZFTF8xMyAqLyAvKiBPdXRwdXQgZmRtaSBmdW5jdGlvbiB0cmFjZSBtc2dzICovCi0vKiAjZGVmaW5lIFFMX0RFQlVHX0xFVkVMXzE0ICovIC8qIE91dHB1dCBSU0NOIHRyYWNlIG1zZ3MgKi8KLS8qICNkZWZpbmUgUUxfREVCVUdfTEVWRUxfMTUgKi8gLyogT3V0cHV0IE5QSVYgdHJhY2UgbXNncyAqLwotLyogI2RlZmluZSBRTF9ERUJVR19MRVZFTF8xNiAqLyAvKiBPdXRwdXQgSVNQODRYWCB0cmFjZSBtc2dzICovCi0vKiAjZGVmaW5lIFFMX0RFQlVHX0xFVkVMXzE3ICovIC8qIE91dHB1dCBFRUggdHJhY2UgbWVzc2FnZXMgKi8KLS8qICNkZWZpbmUgUUxfREVCVUdfTEVWRUxfMTggKi8gLyogT3V0cHV0IFQxMCBDUkMgdHJhY2UgbWVzc2FnZXMgKi8KLQotLyoKLSogTWFjcm9zIHVzZSBmb3IgZGVidWdnaW5nIHRoZSBkcml2ZXIuCi0qLwotCi0jZGVmaW5lIERFQlVHKHgpCWRvIHsgaWYgKHFsMnhleHRlbmRlZF9lcnJvcl9sb2dnaW5nKSB7IHg7IH0gfSB3aGlsZSAoMCkKLQotI2lmIGRlZmluZWQoUUxfREVCVUdfTEVWRUxfMSkKLSNkZWZpbmUgREVCVUcxKHgpCWRvIHt4O30gd2hpbGUgKDApCi0jZWxzZQotI2RlZmluZSBERUJVRzEoeCkJZG8ge30gd2hpbGUgKDApCi0jZW5kaWYKLQotI2RlZmluZSBERUJVRzIoeCkJZG8geyBpZiAocWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcpIHsgeDsgfSB9IHdoaWxlICgwKQotI2RlZmluZSBERUJVRzJfMyh4KQlkbyB7IGlmIChxbDJ4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZykgeyB4OyB9IH0gd2hpbGUgKDApCi0jZGVmaW5lIERFQlVHMl8zXzExKHgpCWRvIHsgaWYgKHFsMnhleHRlbmRlZF9lcnJvcl9sb2dnaW5nKSB7IHg7IH0gfSB3aGlsZSAoMCkKLSNkZWZpbmUgREVCVUcyXzlfMTAoeCkJZG8geyBpZiAocWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcpIHsgeDsgfSB9IHdoaWxlICgwKQotI2RlZmluZSBERUJVRzJfMTEoeCkJZG8geyBpZiAocWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcpIHsgeDsgfSB9IHdoaWxlICgwKQotI2RlZmluZSBERUJVRzJfMTMoeCkJZG8geyBpZiAocWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcpIHsgeDsgfSB9IHdoaWxlICgwKQotI2RlZmluZSBERUJVRzJfMTYoeCkJZG8geyBpZiAocWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcpIHsgeDsgfSB9IHdoaWxlICgwKQotI2RlZmluZSBERUJVRzJfMTcoeCkgCWRvIHsgaWYgKHFsMnhleHRlbmRlZF9lcnJvcl9sb2dnaW5nKSB7IHg7IH0gfSB3aGlsZSAoMCkKLQotI2lmIGRlZmluZWQoUUxfREVCVUdfTEVWRUxfMykKLSNkZWZpbmUgREVCVUczKHgpCWRvIHt4O30gd2hpbGUgKDApCi0jZGVmaW5lIERFQlVHM18xMSh4KQlkbyB7eDt9IHdoaWxlICgwKQotI2Vsc2UKLSNkZWZpbmUgREVCVUczKHgpCWRvIHt9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzQpCi0jZGVmaW5lIERFQlVHNCh4KQlkbyB7eDt9IHdoaWxlICgwKQotI2Vsc2UKLSNkZWZpbmUgREVCVUc0KHgpCWRvIHt9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzUpCi0jZGVmaW5lIERFQlVHNSh4KSAgICAgICAgICBkbyB7eDt9IHdoaWxlICgwKQotI2Vsc2UKLSNkZWZpbmUgREVCVUc1KHgpCWRvIHt9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzcpCi0jZGVmaW5lIERFQlVHNyh4KSAgICAgICAgICBkbyB7eDt9IHdoaWxlICgwKQotI2Vsc2UKLSNkZWZpbmUgREVCVUc3KHgpCSAgIGRvIHt9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzkpCi0jZGVmaW5lIERFQlVHOSh4KSAgICAgICBkbyB7eDt9IHdoaWxlICgwKQotI2RlZmluZSBERUJVRzlfMTAoeCkgICAgZG8ge3g7fSB3aGlsZSAoMCkKLSNlbHNlCi0jZGVmaW5lIERFQlVHOSh4KQlkbyB7fSB3aGlsZSAoMCkKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF8xMCkKLSNkZWZpbmUgREVCVUcxMCh4KSAgICAgIGRvIHt4O30gd2hpbGUgKDApCi0jZGVmaW5lIERFQlVHOV8xMCh4KQlkbyB7eDt9IHdoaWxlICgwKQotI2Vsc2UKLSNkZWZpbmUgREVCVUcxMCh4KQlkbyB7fSB3aGlsZSAoMCkKLSAgI2lmICFkZWZpbmVkKERFQlVHOV8xMCkKLSAgI2RlZmluZSBERUJVRzlfMTAoeCkJZG8ge30gd2hpbGUgKDApCi0gICNlbmRpZgotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzExKQotI2RlZmluZSBERUJVRzExKHgpICAgICAgZG97eDt9IHdoaWxlKDApCi0jaWYgIWRlZmluZWQoREVCVUczXzExKQotI2RlZmluZSBERUJVRzNfMTEoeCkgICAgZG97eDt9IHdoaWxlKDApCi0jZW5kaWYKLSNlbHNlCi0jZGVmaW5lIERFQlVHMTEoeCkJZG97fSB3aGlsZSgwKQotICAjaWYgIWRlZmluZWQoUUxfREVCVUdfTEVWRUxfMykKLSAgI2RlZmluZSBERUJVRzNfMTEoeCkJZG97fSB3aGlsZSgwKQotICAjZW5kaWYKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF8xMikKLSNkZWZpbmUgREVCVUcxMih4KSAgICAgIGRvIHt4O30gd2hpbGUgKDApCi0jZWxzZQotI2RlZmluZSBERUJVRzEyKHgpCWRvIHt9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzEzKQotI2RlZmluZSBERUJVRzEzKHgpICAgICAgZG8ge3g7fSB3aGlsZSAoMCkKLSNlbHNlCi0jZGVmaW5lIERFQlVHMTMoeCkJZG8ge30gd2hpbGUgKDApCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoUUxfREVCVUdfTEVWRUxfMTQpCi0jZGVmaW5lIERFQlVHMTQoeCkgICAgICBkbyB7eDt9IHdoaWxlICgwKQotI2Vsc2UKLSNkZWZpbmUgREVCVUcxNCh4KQlkbyB7fSB3aGlsZSAoMCkKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF8xNSkKLSNkZWZpbmUgREVCVUcxNSh4KSAgICAgIGRvIHt4O30gd2hpbGUgKDApCi0jZWxzZQotI2RlZmluZSBERUJVRzE1KHgpCWRvIHt9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzE2KQotI2RlZmluZSBERUJVRzE2KHgpCWRvIHt4O30gd2hpbGUgKDApCi0jZWxzZQotI2RlZmluZSBERUJVRzE2KHgpCWRvIHt9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzE3KQotI2RlZmluZSBERUJVRzE3KHgpCWRvIHt4O30gd2hpbGUgKDApCi0jZWxzZQotI2RlZmluZSBERUJVRzE3KHgpCWRvIHt9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzE4KQotI2RlZmluZSBERUJVRzE4KHgpCWRvIHtpZiAocWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcpIHg7IH0gd2hpbGUgKDApCi0jZWxzZQotI2RlZmluZSBERUJVRzE4KHgpCWRvIHt9IHdoaWxlICgwKQotI2VuZGlmCi0KLQotLyoKICAqIEZpcm13YXJlIER1bXAgc3RydWN0dXJlIGRlZmluaXRpb24KICAqLwogCkBAIC0zNzAsMyArMjMwLDUwIEBACiAJCXN0cnVjdCBxbGE4MXh4X2Z3X2R1bXAgaXNwODE7CiAJfSBpc3A7CiB9OworCisjZGVmaW5lIFFMX01TR0hEUiAicWxhMnh4eCIKKworI2RlZmluZSBxbF9sb2dfZmF0YWwJCTAgLyogZGlzcGxheSBmYXRhbCBlcnJvcnMgKi8KKyNkZWZpbmUgcWxfbG9nX3dhcm4JCTEgLyogZGlzcGxheSBjcml0aWNhbCBlcnJvcnMgKi8KKyNkZWZpbmUgcWxfbG9nX2luZm8JCTIgLyogZGlzcGxheSBhbGwgcmVjb3ZlcmVkIGVycm9ycyAqLworI2RlZmluZSBxbF9sb2dfYWxsCQkzIC8qIFRoaXMgdmFsdWUgaXMgb25seSB1c2VkIGJ5IHFsX2Vycmxldi4KKwkJCQkgICAqIE5vIG1lc3NhZ2VzIHdpbGwgdXNlIHRoaXMgdmFsdWUuCisJCQkJICAgKiBUaGlzIHNob3VsZCBiZSBhbHdheXMgaGlnaGVzdCB2YWx1ZQorCQkJCSAgICogYXMgY29tcGFyZWQgdG8gb3RoZXIgbG9nIGxldmVscy4KKwkJCQkgICAqLworCitleHRlcm4gaW50IHFsX2VycmxldjsKKwordm9pZAorcWxfZGJnKHVpbnQzMl90LCBzY3NpX3FsYV9ob3N0X3QgKnZoYSwgaW50MzJfdCwgY2hhciAqLCAuLi4pOwordm9pZAorcWxfZGJnX3BjaSh1aW50MzJfdCwgc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludDMyX3QsIGNoYXIgKiwgLi4uKTsKKwordm9pZAorcWxfbG9nKHVpbnQzMl90LCBzY3NpX3FsYV9ob3N0X3QgKnZoYSwgaW50MzJfdCwgY2hhciAqLCAuLi4pOwordm9pZAorcWxfbG9nX3BjaSh1aW50MzJfdCwgc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludDMyX3QsIGNoYXIgKiwgLi4uKTsKKworLyogRGVidWcgTGV2ZWxzICovCisvKiBUaGUgMHg0MDAwMDAwMCBpcyB0aGUgbWF4IHZhbHVlIGFueSBkZWJ1ZyBsZXZlbCBjYW4gaGF2ZQorICogYXMgcWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcgaXMgb2YgdHlwZSBzaWduZWQgaW50CisgKi8KKyNkZWZpbmUgcWxfZGJnX2luaXQJMHg0MDAwMDAwMCAvKiBJbml0IERlYnVnICovCisjZGVmaW5lIHFsX2RiZ19tYngJMHgyMDAwMDAwMCAvKiBNQlggRGVidWcgKi8KKyNkZWZpbmUgcWxfZGJnX2Rpc2MJMHgxMDAwMDAwMCAvKiBEZXZpY2UgRGlzY292ZXJ5IERlYnVnICovCisjZGVmaW5lIHFsX2RiZ19pbwkweDA4MDAwMDAwIC8qIElPIFRyYWNpbmcgRGVidWcgKi8KKyNkZWZpbmUgcWxfZGJnX2RwYwkweDA0MDAwMDAwIC8qIERQQyBUaGVhZCBEZWJ1ZyAqLworI2RlZmluZSBxbF9kYmdfYXN5bmMJMHgwMjAwMDAwMCAvKiBBc3luYyBldmVudHMgRGVidWcgKi8KKyNkZWZpbmUgcWxfZGJnX3RpbWVyCTB4MDEwMDAwMDAgLyogVGltZXIgRGVidWcgKi8KKyNkZWZpbmUgcWxfZGJnX3VzZXIJMHgwMDgwMDAwMCAvKiBVc2VyIFNwYWNlIEludGVyYXRpb25zIERlYnVnICovCisjZGVmaW5lIHFsX2RiZ190YXNrbQkweDAwNDAwMDAwIC8qIFRhc2sgTWFuYWdlbWVudCBEZWJ1ZyAqLworI2RlZmluZSBxbF9kYmdfYWVyCTB4MDAyMDAwMDAgLyogQUVSL0VFSCBEZWJ1ZyAqLworI2RlZmluZSBxbF9kYmdfbXVsdGlxCTB4MDAxMDAwMDAgLyogTXVsdGlRIERlYnVnICovCisjZGVmaW5lIHFsX2RiZ19wM3AJMHgwMDA4MDAwMCAvKiBQM1Agc3BlY2lmaWMgRGVidWcgKi8KKyNkZWZpbmUgcWxfZGJnX3Zwb3J0CTB4MDAwNDAwMDAgLyogVmlydHVhbCBQb3J0IERlYnVnICovCisjZGVmaW5lIHFsX2RiZ19idWZmZXIJMHgwMDAyMDAwMCAvKiBGb3IgZHVtcGluZyB0aGUgYnVmZmVyL3JlZ3MgKi8KKyNkZWZpbmUgcWxfZGJnX21pc2MJMHgwMDAxMDAwMCAvKiBGb3IgZHVtcGluZyBldmVyeXRoaW5nIHRoYXQgaXMgbm90CisJCQkJICAgICogbm90IGNvdmVyZWQgYnkgdXBwZXIgY2F0ZWdvcmllcworCQkJCSAgICAqLworCisjZGVmaW5lIFFMX0RCR19CVUZfTEVOCTUxMgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2Rmcy5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2Rmcy5jCmluZGV4IGE1YTRlMTIuLjBiNGMyYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kZnMuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGZzLmMKQEAgLTY0LDcgKzY0LDcgQEAKIAkvKiBQYXVzZSB0cmFjaW5nIHRvIGZsdXNoIEZDRSBidWZmZXJzLiAqLwogCXJ2YWwgPSBxbGEyeDAwX2Rpc2FibGVfZmNlX3RyYWNlKHZoYSwgJmhhLT5mY2Vfd3IsICZoYS0+ZmNlX3JkKTsKIAlpZiAocnZhbCkKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDVjLAogCQkgICAgIkRlYnVnRlM6IFVuYWJsZSB0byBkaXNhYmxlIEZDRSAoJWQpLlxuIiwgcnZhbCk7CiAKIAloYS0+ZmxhZ3MuZmNlX2VuYWJsZWQgPSAwOwpAQCAtOTIsNyArOTIsNyBAQAogCXJ2YWwgPSBxbGEyeDAwX2VuYWJsZV9mY2VfdHJhY2UodmhhLCBoYS0+ZmNlX2RtYSwgaGEtPmZjZV9idWZzLAogCSAgICBoYS0+ZmNlX21iLCAmaGEtPmZjZV9idWZzKTsKIAlpZiAocnZhbCkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwMGQsCiAJCSAgICAiRGVidWdGUzogVW5hYmxlIHRvIHJlaW5pdGlhbGl6ZSBGQ0UgKCVkKS5cbiIsIHJ2YWwpOwogCQloYS0+ZmxhZ3MuZmNlX2VuYWJsZWQgPSAwOwogCX0KQEAgLTEyNSw4ICsxMjUsOCBAQAogCWF0b21pY19zZXQoJnFsYTJ4MDBfZGZzX3Jvb3RfY291bnQsIDApOwogCXFsYTJ4MDBfZGZzX3Jvb3QgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoUUxBMlhYWF9EUklWRVJfTkFNRSwgTlVMTCk7CiAJaWYgKCFxbGEyeDAwX2Rmc19yb290KSB7Ci0JCXFsYV9wcmludGsoS0VSTl9OT1RJQ0UsIGhhLAotCQkgICAgIkRlYnVnRlM6IFVuYWJsZSB0byBjcmVhdGUgcm9vdCBkaXJlY3RvcnkuXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDBmNywKKwkJICAgICJVbmFibGUgdG8gY3JlYXRlIGRlYnVnZnMgcm9vdCBkaXJlY3RvcnkuXG4iKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0xMzcsOCArMTM3LDggQEAKIAltdXRleF9pbml0KCZoYS0+ZmNlX211dGV4KTsKIAloYS0+ZGZzX2RpciA9IGRlYnVnZnNfY3JlYXRlX2Rpcih2aGEtPmhvc3Rfc3RyLCBxbGEyeDAwX2Rmc19yb290KTsKIAlpZiAoIWhhLT5kZnNfZGlyKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9OT1RJQ0UsIGhhLAotCQkgICAgIkRlYnVnRlM6IFVuYWJsZSB0byBjcmVhdGUgaGEgZGlyZWN0b3J5LlxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAwZjgsCisJCSAgICAiVW5hYmxlIHRvIGNyZWF0ZSBkZWJ1Z2ZzIGhhIGRpcmVjdG9yeS5cbiIpOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTE0OCw4ICsxNDgsOCBAQAogCWhhLT5kZnNfZmNlID0gZGVidWdmc19jcmVhdGVfZmlsZSgiZmNlIiwgU19JUlVTUiwgaGEtPmRmc19kaXIsIHZoYSwKIAkgICAgJmRmc19mY2Vfb3BzKTsKIAlpZiAoIWhhLT5kZnNfZmNlKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9OT1RJQ0UsIGhhLAotCQkgICAgIkRlYnVnRlM6IFVuYWJsZSB0byBmY2Ugbm9kZS5cbiIpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMGY5LAorCQkgICAgIlVuYWJsZSB0byBjcmVhdGUgZGVidWdmcyBmY2Ugbm9kZS5cbiIpOwogCQlnb3RvIG91dDsKIAl9CiBvdXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmgKaW5kZXggMGIzODEyMi4uMjliMWEzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dibC5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9nYmwuaApAQCAtMTg1LDcgKzE4NSw3IEBACiBpbnQgcWxhMngwMF9tYXJrZXIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKiwgc3RydWN0IHJlcV9xdWUgKiwgc3RydWN0IHJzcF9xdWUgKiwKIAkJCQkJCXVpbnQxNl90LCB1aW50MTZfdCwgdWludDhfdCk7CiBleHRlcm4gaW50IHFsYTJ4MDBfc3RhcnRfc3Aoc3JiX3QgKik7Ci1leHRlcm4gdWludDE2X3QgcWxhMjR4eF9jYWxjX2lvY2JzKHVpbnQxNl90KTsKK2V4dGVybiB1aW50MTZfdCBxbGEyNHh4X2NhbGNfaW9jYnMoc2NzaV9xbGFfaG9zdF90ICosIHVpbnQxNl90KTsKIGV4dGVybiB2b2lkIHFsYTI0eHhfYnVpbGRfc2NzaV9pb2NicyhzcmJfdCAqLCBzdHJ1Y3QgY21kX3R5cGVfNyAqLCB1aW50MTZfdCk7CiBleHRlcm4gaW50IHFsYTI0eHhfZGlmX3N0YXJ0X3Njc2koc3JiX3QgKik7CiAKQEAgLTQzOSw2ICs0MzksOSBAQAogZXh0ZXJuIHZvaWQgcWxhMngwMF9kdW1wX3JlZ3Moc2NzaV9xbGFfaG9zdF90ICopOwogZXh0ZXJuIHZvaWQgcWxhMngwMF9kdW1wX2J1ZmZlcih1aW50OF90ICosIHVpbnQzMl90KTsKIGV4dGVybiB2b2lkIHFsYTJ4MDBfZHVtcF9idWZmZXJfemlwcGVkKHVpbnQ4X3QgKiwgdWludDMyX3QpOworZXh0ZXJuIHZvaWQgcWxfZHVtcF9yZWdzKHVpbnQzMl90LCBzY3NpX3FsYV9ob3N0X3QgKiwgaW50MzJfdCk7CitleHRlcm4gdm9pZCBxbF9kdW1wX2J1ZmZlcih1aW50MzJfdCwgc2NzaV9xbGFfaG9zdF90ICosIGludDMyX3QsCisJdWludDhfdCAqLCB1aW50MzJfdCk7CiAKIC8qCiAgKiBHbG9iYWwgRnVuY3Rpb24gUHJvdG90eXBlcyBpbiBxbGFfZ3MuYyBzb3VyY2UgZmlsZS4KQEAgLTQ3OCw3ICs0ODEsOCBAQAogZXh0ZXJuIGludCBxbGEyeDAwX2VjaG9fdGVzdChzY3NpX3FsYV9ob3N0X3QgKiwKIAlzdHJ1Y3QgbXNnX2VjaG9fbGIgKiwgdWludDE2X3QgKik7CiBleHRlcm4gaW50IHFsYTI0eHhfdXBkYXRlX2FsbF9mY3BfcHJpbyhzY3NpX3FsYV9ob3N0X3QgKik7Ci1leHRlcm4gaW50IHFsYTI0eHhfZmNwX3ByaW9fY2ZnX3ZhbGlkKHN0cnVjdCBxbGFfZmNwX3ByaW9fY2ZnICosIHVpbnQ4X3QpOworZXh0ZXJuIGludCBxbGEyNHh4X2ZjcF9wcmlvX2NmZ192YWxpZChzY3NpX3FsYV9ob3N0X3QgKiwKKwlzdHJ1Y3QgcWxhX2ZjcF9wcmlvX2NmZyAqLCB1aW50OF90KTsKIAogLyoKICAqIEdsb2JhbCBGdW5jdGlvbiBQcm90b3R5cGVzIGluIHFsYV9kZnMuYyBzb3VyY2UgZmlsZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ncy5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dzLmMKaW5kZXggOGNkOTA2Ni4uMzc5MzdhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dzLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dzLmMKQEAgLTEyMSwxMSArMTIxLDEwIEBACiAKIAlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAlpZiAobXNfcGt0LT5lbnRyeV9zdGF0dXMgIT0gMCkgewotCQlERUJVRzJfMyhwcmludGsoS0VSTl9XQVJOSU5HICJzY3NpKCVsZCk6ICVzIGZhaWxlZCwgZXJyb3Igc3RhdHVzICIKLQkJICAgICIoJXgpIG9uIHBvcnRfaWQ6ICUwMnglMDJ4JTAyeC5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJvdXRpbmUsIG1zX3BrdC0+ZW50cnlfc3RhdHVzLAotCQkgICAgdmhhLT5kX2lkLmIuZG9tYWluLCB2aGEtPmRfaWQuYi5hcmVhLAotCQkgICAgdmhhLT5kX2lkLmIuYWxfcGEpKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAzMSwKKwkJICAgICIlcyBmYWlsZWQsIGVycm9yIHN0YXR1cyAoJXgpIG9uIHBvcnRfaWQ6ICUwMnglMDJ4JTAyeC5cbiIsCisJCSAgICByb3V0aW5lLCBtc19wa3QtPmVudHJ5X3N0YXR1cywgdmhhLT5kX2lkLmIuZG9tYWluLAorCQkgICAgdmhhLT5kX2lkLmIuYXJlYSwgdmhhLT5kX2lkLmIuYWxfcGEpOwogCX0gZWxzZSB7CiAJCWlmIChJU19GV0kyX0NBUEFCTEUoaGEpKQogCQkJY29tcF9zdGF0dXMgPSBsZTE2X3RvX2NwdSgKQEAgLTEzOCwyNCArMTM3LDI0IEBACiAJCWNhc2UgQ1NfREFUQV9PVkVSUlVOOgkJLyogT3ZlcnJ1bj8gKi8KIAkJCWlmIChjdF9yc3AtPmhlYWRlci5yZXNwb25zZSAhPQogCQkJICAgIF9fY29uc3RhbnRfY3B1X3RvX2JlMTYoQ1RfQUNDRVBUX1JFU1BPTlNFKSkgewotCQkJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiAlcyBmYWlsZWQsICIKLQkJCQkgICAgInJlamVjdGVkIHJlcXVlc3Qgb24gcG9ydF9pZDogJTAyeCUwMnglMDJ4XG4iLAotCQkJCSAgICB2aGEtPmhvc3Rfbm8sIHJvdXRpbmUsCisJCQkJcWxfZGJnKHFsX2RiZ19kaXNjICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDIwNzcsCisJCQkJICAgICIlcyBmYWlsZWQgcmVqZWN0ZWQgcmVxdWVzdCBvbiBwb3J0X2lkOiAiCisJCQkJICAgICIlMDJ4JTAyeCUwMnguXG4iLCByb3V0aW5lLAogCQkJCSAgICB2aGEtPmRfaWQuYi5kb21haW4sIHZoYS0+ZF9pZC5iLmFyZWEsCi0JCQkJICAgIHZoYS0+ZF9pZC5iLmFsX3BhKSk7Ci0JCQkJREVCVUcyXzMocWxhMngwMF9kdW1wX2J1ZmZlcigKLQkJCQkgICAgKHVpbnQ4X3QgKikmY3RfcnNwLT5oZWFkZXIsCi0JCQkJICAgIHNpemVvZihzdHJ1Y3QgY3RfcnNwX2hkcikpKTsKKwkJCQkgICAgdmhhLT5kX2lkLmIuYWxfcGEpOworCQkJCXFsX2R1bXBfYnVmZmVyKHFsX2RiZ19kaXNjICsgcWxfZGJnX2J1ZmZlciwgdmhhLAorCQkJCSAgICAweDIwNzgsICh1aW50OF90ICopJmN0X3JzcC0+aGVhZGVyLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IGN0X3JzcF9oZHIpKTsKIAkJCQlydmFsID0gUUxBX0lOVkFMSURfQ09NTUFORDsKIAkJCX0gZWxzZQogCQkJCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6ICVzIGZhaWxlZCwgY29tcGxldGlvbiAiCi0JCQkgICAgInN0YXR1cyAoJXgpIG9uIHBvcnRfaWQ6ICUwMnglMDJ4JTAyeC5cbiIsCi0JCQkgICAgdmhhLT5ob3N0X25vLCByb3V0aW5lLCBjb21wX3N0YXR1cywKKwkJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMzMsCisJCQkgICAgIiVzIGZhaWxlZCwgY29tcGxldGlvbiBzdGF0dXMgKCV4KSBvbiBwb3J0X2lkOiAiCisJCQkgICAgIiUwMnglMDJ4JTAyeC5cbiIsIHJvdXRpbmUsIGNvbXBfc3RhdHVzLAogCQkJICAgIHZoYS0+ZF9pZC5iLmRvbWFpbiwgdmhhLT5kX2lkLmIuYXJlYSwKLQkJCSAgICB2aGEtPmRfaWQuYi5hbF9wYSkpOworCQkJICAgIHZoYS0+ZF9pZC5iLmFsX3BhKTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMjAyLDggKzIwMSw4IEBACiAJICAgIHNpemVvZihtc19pb2NiX2VudHJ5X3QpKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KLQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdBX05YVCBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDYyLAorCQkgICAgIkdBX05YVCBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwgcnZhbCk7CiAJfSBlbHNlIGlmIChxbGEyeDAwX2Noa19tc19zdGF0dXModmhhLCBtc19wa3QsIGN0X3JzcCwgIkdBX05YVCIpICE9CiAJICAgIFFMQV9TVUNDRVNTKSB7CiAJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwpAQCAtMjIyLDExICsyMjEsMTAgQEAKIAkJICAgIGN0X3JzcC0+cnNwLmdhX254dC5wb3J0X3R5cGUgIT0gTlNfTkxfUE9SVF9UWVBFKQogCQkJZmNwb3J0LT5kX2lkLmIuZG9tYWluID0gMHhmMDsKIAotCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogR0FfTlhUIGVudHJ5IC0gIgotCQkgICAgIm5uICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA2MywKKwkJICAgICJHQV9OWFQgZW50cnkgLSBubiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiCiAJCSAgICAicG4gJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgotCQkgICAgInBvcnRpZD0lMDJ4JTAyeCUwMnguXG4iLAotCQkgICAgdmhhLT5ob3N0X25vLAorCQkgICAgInBvcnRfaWQ9JTAyeCUwMnglMDJ4LlxuIiwKIAkJICAgIGZjcG9ydC0+bm9kZV9uYW1lWzBdLCBmY3BvcnQtPm5vZGVfbmFtZVsxXSwKIAkJICAgIGZjcG9ydC0+bm9kZV9uYW1lWzJdLCBmY3BvcnQtPm5vZGVfbmFtZVszXSwKIAkJICAgIGZjcG9ydC0+bm9kZV9uYW1lWzRdLCBmY3BvcnQtPm5vZGVfbmFtZVs1XSwKQEAgLTIzNiw3ICsyMzQsNyBAQAogCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbNF0sIGZjcG9ydC0+cG9ydF9uYW1lWzVdLAogCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbNl0sIGZjcG9ydC0+cG9ydF9uYW1lWzddLAogCQkgICAgZmNwb3J0LT5kX2lkLmIuZG9tYWluLCBmY3BvcnQtPmRfaWQuYi5hcmVhLAotCQkgICAgZmNwb3J0LT5kX2lkLmIuYWxfcGEpKTsKKwkJICAgIGZjcG9ydC0+ZF9pZC5iLmFsX3BhKTsKIAl9CiAKIAlyZXR1cm4gKHJ2YWwpOwpAQCAtMjg3LDggKzI4NSw4IEBACiAJICAgIHNpemVvZihtc19pb2NiX2VudHJ5X3QpKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KLQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdJRF9QVCBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDU1LAorCQkgICAgIkdJRF9QVCBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwgcnZhbCk7CiAJfSBlbHNlIGlmIChxbGEyeDAwX2Noa19tc19zdGF0dXModmhhLCBtc19wa3QsIGN0X3JzcCwgIkdJRF9QVCIpICE9CiAJICAgIFFMQV9TVUNDRVNTKSB7CiAJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwpAQCAtMzY0LDggKzM2Miw4IEBACiAJCSAgICBzaXplb2YobXNfaW9jYl9lbnRyeV90KSk7CiAJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCQkvKkVNUFRZKi8KLQkJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHUE5fSUQgaXNzdWUgSU9DQiBmYWlsZWQgIgotCQkJICAgICIoJWQpLlxuIiwgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDU2LAorCQkJICAgICJHUE5fSUQgaXNzdWUgSU9DQiBmYWlsZWQgKCVkKS5cbiIsIHJ2YWwpOwogCQl9IGVsc2UgaWYgKHFsYTJ4MDBfY2hrX21zX3N0YXR1cyh2aGEsIG1zX3BrdCwgY3RfcnNwLAogCQkgICAgIkdQTl9JRCIpICE9IFFMQV9TVUNDRVNTKSB7CiAJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKQEAgLTQyNCw4ICs0MjIsOCBAQAogCQkgICAgc2l6ZW9mKG1zX2lvY2JfZW50cnlfdCkpOwogCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkJLypFTVBUWSovCi0JCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogR05OX0lEIGlzc3VlIElPQ0IgZmFpbGVkICIKLQkJCSAgICAiKCVkKS5cbiIsIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA1NywKKwkJCSAgICAiR05OX0lEIGlzc3VlIElPQ0IgZmFpbGVkICglZCkuXG4iLCBydmFsKTsKIAkJfSBlbHNlIGlmIChxbGEyeDAwX2Noa19tc19zdGF0dXModmhhLCBtc19wa3QsIGN0X3JzcCwKIAkJICAgICJHTk5fSUQiKSAhPSBRTEFfU1VDQ0VTUykgewogCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CkBAIC00MzQsMTEgKzQzMiwxMCBAQAogCQkJbWVtY3B5KGxpc3RbaV0ubm9kZV9uYW1lLAogCQkJICAgIGN0X3JzcC0+cnNwLmdubl9pZC5ub2RlX25hbWUsIFdXTl9TSVpFKTsKIAotCQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdJRF9QVCBlbnRyeSAtICIKLQkJCSAgICAibm4gJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgotCQkJICAgICJwbiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiCisJCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDU4LAorCQkJICAgICJHSURfUFQgZW50cnkgLSBubiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJYJTAyeCAiCisJCQkgICAgInBuICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMlglMDJ4ICIKIAkJCSAgICAicG9ydGlkPSUwMnglMDJ4JTAyeC5cbiIsCi0JCQkgICAgdmhhLT5ob3N0X25vLAogCQkJICAgIGxpc3RbaV0ubm9kZV9uYW1lWzBdLCBsaXN0W2ldLm5vZGVfbmFtZVsxXSwKIAkJCSAgICBsaXN0W2ldLm5vZGVfbmFtZVsyXSwgbGlzdFtpXS5ub2RlX25hbWVbM10sCiAJCQkgICAgbGlzdFtpXS5ub2RlX25hbWVbNF0sIGxpc3RbaV0ubm9kZV9uYW1lWzVdLApAQCAtNDQ4LDcgKzQ0NSw3IEBACiAJCQkgICAgbGlzdFtpXS5wb3J0X25hbWVbNF0sIGxpc3RbaV0ucG9ydF9uYW1lWzVdLAogCQkJICAgIGxpc3RbaV0ucG9ydF9uYW1lWzZdLCBsaXN0W2ldLnBvcnRfbmFtZVs3XSwKIAkJCSAgICBsaXN0W2ldLmRfaWQuYi5kb21haW4sIGxpc3RbaV0uZF9pZC5iLmFyZWEsCi0JCQkgICAgbGlzdFtpXS5kX2lkLmIuYWxfcGEpKTsKKwkJCSAgICBsaXN0W2ldLmRfaWQuYi5hbF9wYSk7CiAJCX0KIAogCQkvKiBMYXN0IGRldmljZSBleGl0LiAqLwpAQCAtNDk5LDE0ICs0OTYsMTQgQEAKIAkgICAgc2l6ZW9mKG1zX2lvY2JfZW50cnlfdCkpOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwotCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogUkZUX0lEIGlzc3VlIElPQ0IgZmFpbGVkICglZCkuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNDMsCisJCSAgICAiUkZUX0lEIGlzc3VlIElPQ0IgZmFpbGVkICglZCkuXG4iLCBydmFsKTsKIAl9IGVsc2UgaWYgKHFsYTJ4MDBfY2hrX21zX3N0YXR1cyh2aGEsIG1zX3BrdCwgY3RfcnNwLCAiUkZUX0lEIikgIT0KIAkgICAgUUxBX1NVQ0NFU1MpIHsKIAkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfSBlbHNlIHsKLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBSRlRfSUQgZXhpdGluZyBub3JtYWxseS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA0NCwKKwkJICAgICJSRlRfSUQgZXhpdGluZyBub3JtYWxseS5cbiIpOwogCX0KIAogCXJldHVybiAocnZhbCk7CkBAIC01MjgsOCArNTI1LDggQEAKIAlzdHJ1Y3QgY3Rfc25zX3JzcAkqY3RfcnNwOwogCiAJaWYgKElTX1FMQTIxMDAoaGEpIHx8IElTX1FMQTIyMDAoaGEpKSB7Ci0JCURFQlVHMihwcmludGsoInNjc2koJWxkKTogUkZGX0lEIGNhbGwgdW5zdXBwb3J0ZWQgb24gIgotCQkgICAgIklTUDIxMDAvSVNQMjIwMC5cbiIsIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDQ2LAorCQkgICAgIlJGRl9JRCBjYWxsIG5vdCBzdXBwb3J0ZWQgb24gSVNQMjEwMC9JU1AyMjAwLlxuIik7CiAJCXJldHVybiAoUUxBX1NVQ0NFU1MpOwogCX0KIApAQCAtNTU2LDE0ICs1NTMsMTQgQEAKIAkgICAgc2l6ZW9mKG1zX2lvY2JfZW50cnlfdCkpOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwotCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogUkZGX0lEIGlzc3VlIElPQ0IgZmFpbGVkICglZCkuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNDcsCisJCSAgICAiUkZGX0lEIGlzc3VlIElPQ0IgZmFpbGVkICglZCkuXG4iLCBydmFsKTsKIAl9IGVsc2UgaWYgKHFsYTJ4MDBfY2hrX21zX3N0YXR1cyh2aGEsIG1zX3BrdCwgY3RfcnNwLCAiUkZGX0lEIikgIT0KIAkgICAgUUxBX1NVQ0NFU1MpIHsKIAkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfSBlbHNlIHsKLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBSRkZfSUQgZXhpdGluZyBub3JtYWxseS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA0OCwKKwkJICAgICJSRkZfSUQgZXhpdGluZyBub3JtYWxseS5cbiIpOwogCX0KIAogCXJldHVybiAocnZhbCk7CkBAIC02MDksMTQgKzYwNiwxNCBAQAogCSAgICBzaXplb2YobXNfaW9jYl9lbnRyeV90KSk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBSTk5fSUQgaXNzdWUgSU9DQiBmYWlsZWQgKCVkKS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA0ZCwKKwkJICAgICJSTk5fSUQgaXNzdWUgSU9DQiBmYWlsZWQgKCVkKS5cbiIsIHJ2YWwpOwogCX0gZWxzZSBpZiAocWxhMngwMF9jaGtfbXNfc3RhdHVzKHZoYSwgbXNfcGt0LCBjdF9yc3AsICJSTk5fSUQiKSAhPQogCSAgICBRTEFfU1VDQ0VTUykgewogCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAl9IGVsc2UgewotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFJOTl9JRCBleGl0aW5nIG5vcm1hbGx5LlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDRlLAorCQkgICAgIlJOTl9JRCBleGl0aW5nIG5vcm1hbGx5LlxuIik7CiAJfQogCiAJcmV0dXJuIChydmFsKTsKQEAgLTY0Nyw4ICs2NDQsOCBAQAogCXN0cnVjdCBjdF9zbnNfcnNwCSpjdF9yc3A7CiAKIAlpZiAoSVNfUUxBMjEwMChoYSkgfHwgSVNfUUxBMjIwMChoYSkpIHsKLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBSU05OX0lEIGNhbGwgdW5zdXBwb3J0ZWQgb24gIgotCQkgICAgIklTUDIxMDAvSVNQMjIwMC5cbiIsIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDUwLAorCQkgICAgIlJTTk5fSUQgY2FsbCB1bnN1cHBvcnRlZCBvbiBJU1AyMTAwL0lTUDIyMDAuXG4iKTsKIAkJcmV0dXJuIChRTEFfU1VDQ0VTUyk7CiAJfQogCkBAIC02ODIsMTQgKzY3OSwxNCBAQAogCSAgICBzaXplb2YobXNfaW9jYl9lbnRyeV90KSk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBSU05OX05OIGlzc3VlIElPQ0IgZmFpbGVkICglZCkuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNTEsCisJCSAgICAiUlNOTl9OTiBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwgcnZhbCk7CiAJfSBlbHNlIGlmIChxbGEyeDAwX2Noa19tc19zdGF0dXModmhhLCBtc19wa3QsIGN0X3JzcCwgIlJTTk5fTk4iKSAhPQogCSAgICBRTEFfU1VDQ0VTUykgewogCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAl9IGVsc2UgewotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFJTTk5fTk4gZXhpdGluZyBub3JtYWxseS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA1MiwKKwkJICAgICJSU05OX05OIGV4aXRpbmcgbm9ybWFsbHkuXG4iKTsKIAl9CiAKIAlyZXR1cm4gKHJ2YWwpOwpAQCAtNzU3LDEzICs3NTQsMTQgQEAKIAkgICAgc2l6ZW9mKHN0cnVjdCBzbnNfY21kX3BrdCkpOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwotCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogR0FfTlhUIFNlbmQgU05TIGZhaWxlZCAoJWQpLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDVmLAorCQkgICAgIkdBX05YVCBTZW5kIFNOUyBmYWlsZWQgKCVkKS5cbiIsIHJ2YWwpOwogCX0gZWxzZSBpZiAoc25zX2NtZC0+cC5nYW5fZGF0YVs4XSAhPSAweDgwIHx8CiAJICAgIHNuc19jbWQtPnAuZ2FuX2RhdGFbOV0gIT0gMHgwMikgewotCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogR0FfTlhUIGZhaWxlZCwgcmVqZWN0ZWQgcmVxdWVzdCwgIgotCQkgICAgImdhX254dF9yc3A6XG4iLCB2aGEtPmhvc3Rfbm8pKTsKLQkJREVCVUcyXzMocWxhMngwMF9kdW1wX2J1ZmZlcihzbnNfY21kLT5wLmdhbl9kYXRhLCAxNikpOworCQlxbF9kYmcocWxfZGJnX2Rpc2MgKyBxbF9kYmdfYnVmZmVyLCB2aGEsIDB4MjA3ZCwKKwkJICAgICJHQV9OWFQgZmFpbGVkLCByZWplY3RlZCByZXF1ZXN0IGdhX254dF9yc3A6XG4iKTsKKwkJcWxfZHVtcF9idWZmZXIocWxfZGJnX2Rpc2MgKyBxbF9kYmdfYnVmZmVyLCB2aGEsIDB4MjA3NCwKKwkJICAgIHNuc19jbWQtPnAuZ2FuX2RhdGEsIDE2KTsKIAkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfSBlbHNlIHsKIAkJLyogUG9wdWxhdGUgZmNfcG9ydF90IGVudHJ5LiAqLwpAQCAtNzc4LDExICs3NzYsMTAgQEAKIAkJICAgIHNuc19jbWQtPnAuZ2FuX2RhdGFbMTZdICE9IE5TX05MX1BPUlRfVFlQRSkKIAkJCWZjcG9ydC0+ZF9pZC5iLmRvbWFpbiA9IDB4ZjA7CiAKLQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdBX05YVCBlbnRyeSAtICIKLQkJICAgICJubiAlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAiCisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNjEsCisJCSAgICAiR0FfTlhUIGVudHJ5IC0gbm4gJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgogCQkgICAgInBuICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKLQkJICAgICJwb3J0aWQ9JTAyeCUwMnglMDJ4LlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubywKKwkJICAgICJwb3J0X2lkPSUwMnglMDJ4JTAyeC5cbiIsCiAJCSAgICBmY3BvcnQtPm5vZGVfbmFtZVswXSwgZmNwb3J0LT5ub2RlX25hbWVbMV0sCiAJCSAgICBmY3BvcnQtPm5vZGVfbmFtZVsyXSwgZmNwb3J0LT5ub2RlX25hbWVbM10sCiAJCSAgICBmY3BvcnQtPm5vZGVfbmFtZVs0XSwgZmNwb3J0LT5ub2RlX25hbWVbNV0sCkBAIC03OTIsNyArNzg5LDcgQEAKIAkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzRdLCBmY3BvcnQtPnBvcnRfbmFtZVs1XSwKIAkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzZdLCBmY3BvcnQtPnBvcnRfbmFtZVs3XSwKIAkJICAgIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwgZmNwb3J0LT5kX2lkLmIuYXJlYSwKLQkJICAgIGZjcG9ydC0+ZF9pZC5iLmFsX3BhKSk7CisJCSAgICBmY3BvcnQtPmRfaWQuYi5hbF9wYSk7CiAJfQogCiAJcmV0dXJuIChydmFsKTsKQEAgLTgzMSwxMyArODI4LDE0IEBACiAJICAgIHNpemVvZihzdHJ1Y3Qgc25zX2NtZF9wa3QpKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KLQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdJRF9QVCBTZW5kIFNOUyBmYWlsZWQgKCVkKS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA2ZCwKKwkJICAgICJHSURfUFQgU2VuZCBTTlMgZmFpbGVkICglZCkuXG4iLCBydmFsKTsKIAl9IGVsc2UgaWYgKHNuc19jbWQtPnAuZ2lkX2RhdGFbOF0gIT0gMHg4MCB8fAogCSAgICBzbnNfY21kLT5wLmdpZF9kYXRhWzldICE9IDB4MDIpIHsKLQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdJRF9QVCBmYWlsZWQsIHJlamVjdGVkIHJlcXVlc3QsICIKLQkJICAgICJnaWRfcnNwOlxuIiwgdmhhLT5ob3N0X25vKSk7Ci0JCURFQlVHMl8zKHFsYTJ4MDBfZHVtcF9idWZmZXIoc25zX2NtZC0+cC5naWRfZGF0YSwgMTYpKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAyZiwKKwkJICAgICJHSURfUFQgZmFpbGVkLCByZWplY3RlZCByZXF1ZXN0LCBnaWRfcnNwOlxuIik7CisJCXFsX2R1bXBfYnVmZmVyKHFsX2RiZ19kaXNjICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDIwODEsCisJCSAgICBzbnNfY21kLT5wLmdpZF9kYXRhLCAxNik7CiAJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0gZWxzZSB7CiAJCS8qIFNldCBwb3J0IElEcyBpbiBzd2l0Y2ggaW5mbyBsaXN0LiAqLwpAQCAtOTAwLDEzICs4OTgsMTQgQEAKIAkJICAgIEdQTl9JRF9TTlNfQ01EX1NJWkUgLyAyLCBzaXplb2Yoc3RydWN0IHNuc19jbWRfcGt0KSk7CiAJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCQkvKkVNUFRZKi8KLQkJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHUE5fSUQgU2VuZCBTTlMgZmFpbGVkICIKLQkJCSAgICAiKCVkKS5cbiIsIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAzMiwKKwkJCSAgICAiR1BOX0lEIFNlbmQgU05TIGZhaWxlZCAoJWQpLlxuIiwgcnZhbCk7CiAJCX0gZWxzZSBpZiAoc25zX2NtZC0+cC5ncG5fZGF0YVs4XSAhPSAweDgwIHx8CiAJCSAgICBzbnNfY21kLT5wLmdwbl9kYXRhWzldICE9IDB4MDIpIHsKLQkJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHUE5fSUQgZmFpbGVkLCByZWplY3RlZCAiCi0JCQkgICAgInJlcXVlc3QsIGdwbl9yc3A6XG4iLCB2aGEtPmhvc3Rfbm8pKTsKLQkJCURFQlVHMl8zKHFsYTJ4MDBfZHVtcF9idWZmZXIoc25zX2NtZC0+cC5ncG5fZGF0YSwgMTYpKTsKKwkJCXFsX2RiZyhxbF9kYmdfZGlzYyArIHFsX2RiZ19idWZmZXIsIHZoYSwgMHgyMDdlLAorCQkJICAgICJHUE5fSUQgZmFpbGVkLCByZWplY3RlZCByZXF1ZXN0LCBncG5fcnNwOlxuIik7CisJCQlxbF9kdW1wX2J1ZmZlcihxbF9kYmdfZGlzYywgdmhhLCAweDIwN2YsCisJCQkgICAgc25zX2NtZC0+cC5ncG5fZGF0YSwgMTYpOwogCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJCX0gZWxzZSB7CiAJCQkvKiBTYXZlIHBvcnRuYW1lICovCkBAIC05NTUsMjQgKzk1NCwyNCBAQAogCQkgICAgR05OX0lEX1NOU19DTURfU0laRSAvIDIsIHNpemVvZihzdHJ1Y3Qgc25zX2NtZF9wa3QpKTsKIAkJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJCS8qRU1QVFkqLwotCQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdOTl9JRCBTZW5kIFNOUyBmYWlsZWQgIgotCQkJICAgICIoJWQpLlxuIiwgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDNmLAorCQkJICAgICJHTk5fSUQgU2VuZCBTTlMgZmFpbGVkICglZCkuXG4iLCBydmFsKTsKIAkJfSBlbHNlIGlmIChzbnNfY21kLT5wLmdubl9kYXRhWzhdICE9IDB4ODAgfHwKIAkJICAgIHNuc19jbWQtPnAuZ25uX2RhdGFbOV0gIT0gMHgwMikgewotCQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IEdOTl9JRCBmYWlsZWQsIHJlamVjdGVkICIKLQkJCSAgICAicmVxdWVzdCwgZ25uX3JzcDpcbiIsIHZoYS0+aG9zdF9ubykpOwotCQkJREVCVUcyXzMocWxhMngwMF9kdW1wX2J1ZmZlcihzbnNfY21kLT5wLmdubl9kYXRhLCAxNikpOworCQkJcWxfZGJnKHFsX2RiZ19kaXNjICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDIwODIsCisJCQkgICAgIkdOTl9JRCBmYWlsZWQsIHJlamVjdGVkIHJlcXVlc3QsIGdubl9yc3A6XG4iKTsKKwkJCXFsX2R1bXBfYnVmZmVyKHFsX2RiZ19kaXNjICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDIwN2EsCisJCQkgICAgc25zX2NtZC0+cC5nbm5fZGF0YSwgMTYpOwogCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJCX0gZWxzZSB7CiAJCQkvKiBTYXZlIG5vZGVuYW1lICovCiAJCQltZW1jcHkobGlzdFtpXS5ub2RlX25hbWUsICZzbnNfY21kLT5wLmdubl9kYXRhWzE2XSwKIAkJCSAgICBXV05fU0laRSk7CiAKLQkJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHSURfUFQgZW50cnkgLSAiCi0JCQkgICAgIm5uICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKKwkJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNmUsCisJCQkgICAgIkdJRF9QVCBlbnRyeSAtIG5uICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4ICIKIAkJCSAgICAicG4gJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggIgotCQkJICAgICJwb3J0aWQ9JTAyeCUwMnglMDJ4LlxuIiwKLQkJCSAgICB2aGEtPmhvc3Rfbm8sCisJCQkgICAgInBvcnRfaWQ9JTAyeCUwMnglMDJ4LlxuIiwKIAkJCSAgICBsaXN0W2ldLm5vZGVfbmFtZVswXSwgbGlzdFtpXS5ub2RlX25hbWVbMV0sCiAJCQkgICAgbGlzdFtpXS5ub2RlX25hbWVbMl0sIGxpc3RbaV0ubm9kZV9uYW1lWzNdLAogCQkJICAgIGxpc3RbaV0ubm9kZV9uYW1lWzRdLCBsaXN0W2ldLm5vZGVfbmFtZVs1XSwKQEAgLTk4Miw3ICs5ODEsNyBAQAogCQkJICAgIGxpc3RbaV0ucG9ydF9uYW1lWzRdLCBsaXN0W2ldLnBvcnRfbmFtZVs1XSwKIAkJCSAgICBsaXN0W2ldLnBvcnRfbmFtZVs2XSwgbGlzdFtpXS5wb3J0X25hbWVbN10sCiAJCQkgICAgbGlzdFtpXS5kX2lkLmIuZG9tYWluLCBsaXN0W2ldLmRfaWQuYi5hcmVhLAotCQkJICAgIGxpc3RbaV0uZF9pZC5iLmFsX3BhKSk7CisJCQkgICAgbGlzdFtpXS5kX2lkLmIuYWxfcGEpOwogCQl9CiAKIAkJLyogTGFzdCBkZXZpY2UgZXhpdC4gKi8KQEAgLTEwMjUsMTcgKzEwMjQsMTggQEAKIAkgICAgc2l6ZW9mKHN0cnVjdCBzbnNfY21kX3BrdCkpOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwotCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogUkZUX0lEIFNlbmQgU05TIGZhaWxlZCAoJWQpLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDYwLAorCQkgICAgIlJGVF9JRCBTZW5kIFNOUyBmYWlsZWQgKCVkKS5cbiIsIHJ2YWwpOwogCX0gZWxzZSBpZiAoc25zX2NtZC0+cC5yZnRfZGF0YVs4XSAhPSAweDgwIHx8CiAJICAgIHNuc19jbWQtPnAucmZ0X2RhdGFbOV0gIT0gMHgwMikgewotCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogUkZUX0lEIGZhaWxlZCwgcmVqZWN0ZWQgcmVxdWVzdCwgIgotCQkgICAgInJmdF9yc3A6XG4iLCB2aGEtPmhvc3Rfbm8pKTsKLQkJREVCVUcyXzMocWxhMngwMF9kdW1wX2J1ZmZlcihzbnNfY21kLT5wLnJmdF9kYXRhLCAxNikpOworCQlxbF9kYmcocWxfZGJnX2Rpc2MgKyBxbF9kYmdfYnVmZmVyLCB2aGEsIDB4MjA4MywKKwkJICAgICJSRlRfSUQgZmFpbGVkLCByZWplY3RlZCByZXF1ZXN0IHJmdF9yc3A6XG4iKTsKKwkJcWxfZHVtcF9idWZmZXIocWxfZGJnX2Rpc2MgKyBxbF9kYmdfYnVmZmVyLCB2aGEsIDB4MjA4MCwKKwkJICAgIHNuc19jbWQtPnAucmZ0X2RhdGEsIDE2KTsKIAkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfSBlbHNlIHsKLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBSRlRfSUQgZXhpdGluZyBub3JtYWxseS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA3MywKKwkJICAgICJSRlRfSUQgZXhpdGluZyBub3JtYWxseS5cbiIpOwogCX0KIAogCXJldHVybiAocnZhbCk7CkBAIC0xMDgxLDE3ICsxMDgxLDE4IEBACiAJICAgIHNpemVvZihzdHJ1Y3Qgc25zX2NtZF9wa3QpKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KLQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IFJOTl9JRCBTZW5kIFNOUyBmYWlsZWQgKCVkKS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA0YSwKKwkJICAgICJSTk5fSUQgU2VuZCBTTlMgZmFpbGVkICglZCkuXG4iLCBydmFsKTsKIAl9IGVsc2UgaWYgKHNuc19jbWQtPnAucm5uX2RhdGFbOF0gIT0gMHg4MCB8fAogCSAgICBzbnNfY21kLT5wLnJubl9kYXRhWzldICE9IDB4MDIpIHsKLQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IFJOTl9JRCBmYWlsZWQsIHJlamVjdGVkIHJlcXVlc3QsICIKLQkJICAgICJybm5fcnNwOlxuIiwgdmhhLT5ob3N0X25vKSk7Ci0JCURFQlVHMl8zKHFsYTJ4MDBfZHVtcF9idWZmZXIoc25zX2NtZC0+cC5ybm5fZGF0YSwgMTYpKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDIwN2IsCisJCSAgICAiUk5OX0lEIGZhaWxlZCwgcmVqZWN0ZWQgcmVxdWVzdCwgcm5uX3JzcDpcbiIpOworCQlxbF9kdW1wX2J1ZmZlcihxbF9kYmdfZGlzYyArIHFsX2RiZ19idWZmZXIsIHZoYSwgMHgyMDdjLAorCQkgICAgc25zX2NtZC0+cC5ybm5fZGF0YSwgMTYpOwogCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAl9IGVsc2UgewotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFJOTl9JRCBleGl0aW5nIG5vcm1hbGx5LlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDRjLAorCQkgICAgIlJOTl9JRCBleGl0aW5nIG5vcm1hbGx5LlxuIik7CiAJfQogCiAJcmV0dXJuIChydmFsKTsKQEAgLTExMTYsMTAgKzExMTcsMTAgQEAKIAloYS0+aXNwX29wcy0+ZmFicmljX2xvZ2luKHZoYSwgdmhhLT5tZ210X3N2cl9sb29wX2lkLCAweGZmLCAweGZmLCAweGZhLAogCSAgICBtYiwgQklUXzF8QklUXzApOwogCWlmIChtYlswXSAhPSBNQlNfQ09NTUFORF9DT01QTEVURSkgewotCQlERUJVRzJfMTMocHJpbnRrKCIlcyglbGQpOiBGYWlsZWQgTUFOQUdFTUVOVF9TRVJWRVIgbG9naW46ICIKLQkJICAgICJsb29wX2lkPSV4IG1iWzBdPSV4IG1iWzFdPSV4IG1iWzJdPSV4IG1iWzZdPSV4IG1iWzddPSV4XG4iLAotCQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgdmhhLT5tZ210X3N2cl9sb29wX2lkLCBtYlswXSwgbWJbMV0sCi0JCSAgICBtYlsyXSwgbWJbNl0sIG1iWzddKSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMjQsCisJCSAgICAiRmFpbGVkIG1hbmFnZW1lbnRfc2VydmVyIGxvZ2luOiBsb29waWQ9JXggbWJbMF09JXggIgorCQkgICAgIm1iWzFdPSV4IG1iWzJdPSV4IG1iWzZdPSV4IG1iWzddPSV4LlxuIiwKKwkJICAgIHZoYS0+bWdtdF9zdnJfbG9vcF9pZCwgbWJbMF0sIG1iWzFdLCBtYlsyXSwgbWJbNl0sIG1iWzddKTsKIAkJcmV0ID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAl9IGVsc2UKIAkJdmhhLT5mbGFncy5tYW5hZ2VtZW50X3NlcnZlcl9sb2dnZWRfaW4gPSAxOwpAQCAtMTI5MiwxMSArMTI5MywxMiBAQAogCW1lbWNweShlaXRlci0+YS5ub2RlX25hbWUsIHZoYS0+bm9kZV9uYW1lLCBXV05fU0laRSk7CiAJc2l6ZSArPSA0ICsgV1dOX1NJWkU7CiAKLQlERUJVRzEzKHByaW50aygiJXMoJWxkKTogTk9ERU5BTUU9JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnguXG4iLAotCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAotCSAgICBlaXRlci0+YS5ub2RlX25hbWVbMF0sIGVpdGVyLT5hLm5vZGVfbmFtZVsxXSwgZWl0ZXItPmEubm9kZV9uYW1lWzJdLAotCSAgICBlaXRlci0+YS5ub2RlX25hbWVbM10sIGVpdGVyLT5hLm5vZGVfbmFtZVs0XSwgZWl0ZXItPmEubm9kZV9uYW1lWzVdLAotCSAgICBlaXRlci0+YS5ub2RlX25hbWVbNl0sIGVpdGVyLT5hLm5vZGVfbmFtZVs3XSkpOworCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMjUsCisJICAgICJOb2RlTmFtZSA9ICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4LlxuIiwKKwkgICAgZWl0ZXItPmEubm9kZV9uYW1lWzBdLCBlaXRlci0+YS5ub2RlX25hbWVbMV0sCisJICAgIGVpdGVyLT5hLm5vZGVfbmFtZVsyXSwgZWl0ZXItPmEubm9kZV9uYW1lWzNdLAorCSAgICBlaXRlci0+YS5ub2RlX25hbWVbNF0sIGVpdGVyLT5hLm5vZGVfbmFtZVs1XSwKKwkgICAgZWl0ZXItPmEubm9kZV9uYW1lWzZdLCBlaXRlci0+YS5ub2RlX25hbWVbN10pOwogCiAJLyogTWFudWZhY3R1cmVyLiAqLwogCWVpdGVyID0gKHN0cnVjdCBjdF9mZG1pX2hiYV9hdHRyICopIChlbnRyaWVzICsgc2l6ZSk7CkBAIC0xMzA3LDggKzEzMDksOCBAQAogCWVpdGVyLT5sZW4gPSBjcHVfdG9fYmUxNig0ICsgYWxlbik7CiAJc2l6ZSArPSA0ICsgYWxlbjsKIAotCURFQlVHMTMocHJpbnRrKCIlcyglbGQpOiBNQU5VRkFDVFVSRVI9JXMuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAotCSAgICBlaXRlci0+YS5tYW51ZmFjdHVyZXIpKTsKKwlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDI2LAorCSAgICAiTWFudWZhY3R1cmVyID0gJXMuXG4iLCBlaXRlci0+YS5tYW51ZmFjdHVyZXIpOwogCiAJLyogU2VyaWFsIG51bWJlci4gKi8KIAllaXRlciA9IChzdHJ1Y3QgY3RfZmRtaV9oYmFfYXR0ciAqKSAoZW50cmllcyArIHNpemUpOwpAQCAtMTMyMCw4ICsxMzIyLDggQEAKIAllaXRlci0+bGVuID0gY3B1X3RvX2JlMTYoNCArIGFsZW4pOwogCXNpemUgKz0gNCArIGFsZW47CiAKLQlERUJVRzEzKHByaW50aygiJXMoJWxkKTogU0VSSUFMTk89JXMuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAotCSAgICBlaXRlci0+YS5zZXJpYWxfbnVtKSk7CisJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAyNywKKwkgICAgIlNlcmlhbCBuby4gPSAlcy5cbiIsIGVpdGVyLT5hLnNlcmlhbF9udW0pOwogCiAJLyogTW9kZWwgbmFtZS4gKi8KIAllaXRlciA9IChzdHJ1Y3QgY3RfZmRtaV9oYmFfYXR0ciAqKSAoZW50cmllcyArIHNpemUpOwpAQCAtMTMzMiw4ICsxMzM0LDggQEAKIAllaXRlci0+bGVuID0gY3B1X3RvX2JlMTYoNCArIGFsZW4pOwogCXNpemUgKz0gNCArIGFsZW47CiAKLQlERUJVRzEzKHByaW50aygiJXMoJWxkKTogTU9ERUxfTkFNRT0lcy5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sCi0JICAgIGVpdGVyLT5hLm1vZGVsKSk7CisJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAyOCwKKwkgICAgIk1vZGVsIE5hbWUgPSAlcy5cbiIsIGVpdGVyLT5hLm1vZGVsKTsKIAogCS8qIE1vZGVsIGRlc2NyaXB0aW9uLiAqLwogCWVpdGVyID0gKHN0cnVjdCBjdF9mZG1pX2hiYV9hdHRyICopIChlbnRyaWVzICsgc2l6ZSk7CkBAIC0xMzQ1LDggKzEzNDcsOCBAQAogCWVpdGVyLT5sZW4gPSBjcHVfdG9fYmUxNig0ICsgYWxlbik7CiAJc2l6ZSArPSA0ICsgYWxlbjsKIAotCURFQlVHMTMocHJpbnRrKCIlcyglbGQpOiBNT0RFTF9ERVNDPSVzLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywKLQkgICAgZWl0ZXItPmEubW9kZWxfZGVzYykpOworCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMjksCisJICAgICJNb2RlbCBEZXNjID0gJXMuXG4iLCBlaXRlci0+YS5tb2RlbF9kZXNjKTsKIAogCS8qIEhhcmR3YXJlIHZlcnNpb24uICovCiAJZWl0ZXIgPSAoc3RydWN0IGN0X2ZkbWlfaGJhX2F0dHIgKikgKGVudHJpZXMgKyBzaXplKTsKQEAgLTEzNTcsOCArMTM1OSw4IEBACiAJZWl0ZXItPmxlbiA9IGNwdV90b19iZTE2KDQgKyBhbGVuKTsKIAlzaXplICs9IDQgKyBhbGVuOwogCi0JREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IEhBUkRXQVJFVkVSPSVzLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywKLQkgICAgZWl0ZXItPmEuaHdfdmVyc2lvbikpOworCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMmEsCisJICAgICJIYXJkd2FyZSB2ZXIgPSAlcy5cbiIsIGVpdGVyLT5hLmh3X3ZlcnNpb24pOwogCiAJLyogRHJpdmVyIHZlcnNpb24uICovCiAJZWl0ZXIgPSAoc3RydWN0IGN0X2ZkbWlfaGJhX2F0dHIgKikgKGVudHJpZXMgKyBzaXplKTsKQEAgLTEzNjksOCArMTM3MSw4IEBACiAJZWl0ZXItPmxlbiA9IGNwdV90b19iZTE2KDQgKyBhbGVuKTsKIAlzaXplICs9IDQgKyBhbGVuOwogCi0JREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IERSSVZFUlZFUj0lcy5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sCi0JICAgIGVpdGVyLT5hLmRyaXZlcl92ZXJzaW9uKSk7CisJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAyYiwKKwkgICAgIkRyaXZlciB2ZXIgPSAlcy5cbiIsIGVpdGVyLT5hLmRyaXZlcl92ZXJzaW9uKTsKIAogCS8qIE9wdGlvbiBST00gdmVyc2lvbi4gKi8KIAllaXRlciA9IChzdHJ1Y3QgY3RfZmRtaV9oYmFfYXR0ciAqKSAoZW50cmllcyArIHNpemUpOwpAQCAtMTM4MSw4ICsxMzgzLDggQEAKIAllaXRlci0+bGVuID0gY3B1X3RvX2JlMTYoNCArIGFsZW4pOwogCXNpemUgKz0gNCArIGFsZW47CiAKLQlERUJVRzEzKHByaW50aygiJXMoJWxkKTogT1BUUk9NVkVSPSVzLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywKLQkgICAgZWl0ZXItPmEub3JvbV92ZXJzaW9uKSk7CisJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEgLCAweDIwMmMsCisJICAgICJPcHRyb20gdmVycyA9ICVzLlxuIiwgZWl0ZXItPmEub3JvbV92ZXJzaW9uKTsKIAogCS8qIEZpcm13YXJlIHZlcnNpb24gKi8KIAllaXRlciA9IChzdHJ1Y3QgY3RfZmRtaV9oYmFfYXR0ciAqKSAoZW50cmllcyArIHNpemUpOwpAQCAtMTM5Myw0NCArMTM5NSw0NiBAQAogCWVpdGVyLT5sZW4gPSBjcHVfdG9fYmUxNig0ICsgYWxlbik7CiAJc2l6ZSArPSA0ICsgYWxlbjsKIAotCURFQlVHMTMocHJpbnRrKCIlcyglbGQpOiBGSVJNV0FSRVZFUj0lcy5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sCi0JICAgIGVpdGVyLT5hLmZ3X3ZlcnNpb24pKTsKKwlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDJkLAorCSAgICAiRmlybXdhcmUgdmVycyA9ICVzLlxuIiwgZWl0ZXItPmEuZndfdmVyc2lvbik7CiAKIAkvKiBVcGRhdGUgTVMgcmVxdWVzdCBzaXplLiAqLwogCXFsYTJ4MDBfdXBkYXRlX21zX2ZkbWlfaW9jYih2aGEsIHNpemUgKyAxNik7CiAKLQlERUJVRzEzKHByaW50aygiJXMoJWxkKTogUkhCQSBpZGVudGlmaWVyPSIKLQkgICAgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IHNpemU9JWQuXG4iLCBfX2Z1bmNfXywKLQkgICAgdmhhLT5ob3N0X25vLCBjdF9yZXEtPnJlcS5yaGJhLmhiYV9pZGVudGlmaWVyWzBdLAorCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMmUsCisJICAgICJSSEJBIGlkZW50aWZpZXIgPSAiCisJICAgICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCBzaXplPSVkLlxuIiwKKwkgICAgY3RfcmVxLT5yZXEucmhiYS5oYmFfaWRlbnRpZmllclswXSwKIAkgICAgY3RfcmVxLT5yZXEucmhiYS5oYmFfaWRlbnRpZmllclsxXSwKIAkgICAgY3RfcmVxLT5yZXEucmhiYS5oYmFfaWRlbnRpZmllclsyXSwKIAkgICAgY3RfcmVxLT5yZXEucmhiYS5oYmFfaWRlbnRpZmllclszXSwKIAkgICAgY3RfcmVxLT5yZXEucmhiYS5oYmFfaWRlbnRpZmllcls0XSwKIAkgICAgY3RfcmVxLT5yZXEucmhiYS5oYmFfaWRlbnRpZmllcls1XSwKIAkgICAgY3RfcmVxLT5yZXEucmhiYS5oYmFfaWRlbnRpZmllcls2XSwKLQkgICAgY3RfcmVxLT5yZXEucmhiYS5oYmFfaWRlbnRpZmllcls3XSwgc2l6ZSkpOwotCURFQlVHMTMocWxhMngwMF9kdW1wX2J1ZmZlcihlbnRyaWVzLCBzaXplKSk7CisJICAgIGN0X3JlcS0+cmVxLnJoYmEuaGJhX2lkZW50aWZpZXJbN10sIHNpemUpOworCXFsX2R1bXBfYnVmZmVyKHFsX2RiZ19kaXNjICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDIwNzYsCisJICAgIGVudHJpZXMsIHNpemUpOwogCiAJLyogRXhlY3V0ZSBNUyBJT0NCICovCiAJcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYih2aGEsIGhhLT5tc19pb2NiLCBoYS0+bXNfaW9jYl9kbWEsCiAJICAgIHNpemVvZihtc19pb2NiX2VudHJ5X3QpKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KLQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IFJIQkEgaXNzdWUgSU9DQiBmYWlsZWQgKCVkKS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAzMCwKKwkJICAgICJSSEJBIGlzc3VlIElPQ0IgZmFpbGVkICglZCkuXG4iLCBydmFsKTsKIAl9IGVsc2UgaWYgKHFsYTJ4MDBfY2hrX21zX3N0YXR1cyh2aGEsIG1zX3BrdCwgY3RfcnNwLCAiUkhCQSIpICE9CiAJICAgIFFMQV9TVUNDRVNTKSB7CiAJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCQlpZiAoY3RfcnNwLT5oZWFkZXIucmVhc29uX2NvZGUgPT0gQ1RfUkVBU09OX0NBTk5PVF9QRVJGT1JNICYmCiAJCSAgICBjdF9yc3AtPmhlYWRlci5leHBsYW5hdGlvbl9jb2RlID09CiAJCSAgICBDVF9FWFBMX0FMUkVBRFlfUkVHSVNURVJFRCkgewotCQkJREVCVUcyXzEzKHByaW50aygiJXMoJWxkKTogSEJBIGFscmVhZHkgcmVnaXN0ZXJlZC5cbiIsCi0JCQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAzNCwKKwkJCSAgICAiSEJBIGFscmVhZHkgcmVnaXN0ZXJlZC5cbiIpOwogCQkJcnZhbCA9IFFMQV9BTFJFQURZX1JFR0lTVEVSRUQ7CiAJCX0KIAl9IGVsc2UgewotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFJIQkEgZXhpdGluZyBub3JtYWxseS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAzNSwKKwkJICAgICJSSEJBIGV4aXRpbmcgbm9ybWFsbHkuXG4iKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTE0NjQsMjYgKzE0NjgsMjYgQEAKIAkvKiBQcmVwYXJlIEZETUkgY29tbWFuZCBhcmd1bWVudHMgLS0gcG9ydG5hbWUuICovCiAJbWVtY3B5KGN0X3JlcS0+cmVxLmRoYmEucG9ydF9uYW1lLCB2aGEtPnBvcnRfbmFtZSwgV1dOX1NJWkUpOwogCi0JREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IERIQkEgcG9ydG5hbWU9IgotCSAgICAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnguXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAorCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMzYsCisJICAgICJESEJBIHBvcnRuYW1lID0gJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnguXG4iLAogCSAgICBjdF9yZXEtPnJlcS5kaGJhLnBvcnRfbmFtZVswXSwgY3RfcmVxLT5yZXEuZGhiYS5wb3J0X25hbWVbMV0sCiAJICAgIGN0X3JlcS0+cmVxLmRoYmEucG9ydF9uYW1lWzJdLCBjdF9yZXEtPnJlcS5kaGJhLnBvcnRfbmFtZVszXSwKIAkgICAgY3RfcmVxLT5yZXEuZGhiYS5wb3J0X25hbWVbNF0sIGN0X3JlcS0+cmVxLmRoYmEucG9ydF9uYW1lWzVdLAotCSAgICBjdF9yZXEtPnJlcS5kaGJhLnBvcnRfbmFtZVs2XSwgY3RfcmVxLT5yZXEuZGhiYS5wb3J0X25hbWVbN10pKTsKKwkgICAgY3RfcmVxLT5yZXEuZGhiYS5wb3J0X25hbWVbNl0sIGN0X3JlcS0+cmVxLmRoYmEucG9ydF9uYW1lWzddKTsKIAogCS8qIEV4ZWN1dGUgTVMgSU9DQiAqLwogCXJ2YWwgPSBxbGEyeDAwX2lzc3VlX2lvY2IodmhhLCBoYS0+bXNfaW9jYiwgaGEtPm1zX2lvY2JfZG1hLAogCSAgICBzaXplb2YobXNfaW9jYl9lbnRyeV90KSk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBESEJBIGlzc3VlIElPQ0IgZmFpbGVkICglZCkuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMzcsCisJCSAgICAiREhCQSBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwgcnZhbCk7CiAJfSBlbHNlIGlmIChxbGEyeDAwX2Noa19tc19zdGF0dXModmhhLCBtc19wa3QsIGN0X3JzcCwgIkRIQkEiKSAhPQogCSAgICBRTEFfU1VDQ0VTUykgewogCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAl9IGVsc2UgewotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IERIQkEgZXhpdGluZyBub3JtYWxseS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAzOCwKKwkJICAgICJESEJBIGV4aXRpbmcgbm9ybWFsbHkuXG4iKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTE1MzQsOSArMTUzOCwxMCBAQAogCWVpdGVyLT5hLmZjNF90eXBlc1syXSA9IDB4MDE7CiAJc2l6ZSArPSA0ICsgMzI7CiAKLQlERUJVRzEzKHByaW50aygiJXMoJWxkKTogRkM0X1RZUEVTPSUwMnggJTAyeC5cbiIsIF9fZnVuY19fLAotCQl2aGEtPmhvc3Rfbm8sIGVpdGVyLT5hLmZjNF90eXBlc1syXSwKLQkJZWl0ZXItPmEuZmM0X3R5cGVzWzFdKSk7CisJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAzOSwKKwkgICAgIkZDNF9UWVBFUz0lMDJ4ICUwMnguXG4iLAorCSAgICBlaXRlci0+YS5mYzRfdHlwZXNbMl0sCisJICAgIGVpdGVyLT5hLmZjNF90eXBlc1sxXSk7CiAKIAkvKiBTdXBwb3J0ZWQgc3BlZWQuICovCiAJZWl0ZXIgPSAoc3RydWN0IGN0X2ZkbWlfcG9ydF9hdHRyICopIChlbnRyaWVzICsgc2l6ZSk7CkBAIC0xNTYxLDggKzE1NjYsOCBAQAogCQkgICAgRkRNSV9QT1JUX1NQRUVEXzFHQik7CiAJc2l6ZSArPSA0ICsgNDsKIAotCURFQlVHMTMocHJpbnRrKCIlcyglbGQpOiBTVVBQT1JURURfU1BFRUQ9JXguXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAotCSAgICBlaXRlci0+YS5zdXBfc3BlZWQpKTsKKwlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDNhLAorCSAgICAiU3VwcG9ydGVkX1NwZWVkPSV4LlxuIiwgZWl0ZXItPmEuc3VwX3NwZWVkKTsKIAogCS8qIEN1cnJlbnQgc3BlZWQuICovCiAJZWl0ZXIgPSAoc3RydWN0IGN0X2ZkbWlfcG9ydF9hdHRyICopIChlbnRyaWVzICsgc2l6ZSk7CkBAIC0xNTk2LDggKzE2MDEsOCBAQAogCX0KIAlzaXplICs9IDQgKyA0OwogCi0JREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IENVUlJFTlRfU1BFRUQ9JXguXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAotCSAgICBlaXRlci0+YS5jdXJfc3BlZWQpKTsKKwlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDNiLAorCSAgICAiQ3VycmVudF9TcGVlZD0leC5cbiIsIGVpdGVyLT5hLmN1cl9zcGVlZCk7CiAKIAkvKiBNYXggZnJhbWUgc2l6ZS4gKi8KIAllaXRlciA9IChzdHJ1Y3QgY3RfZmRtaV9wb3J0X2F0dHIgKikgKGVudHJpZXMgKyBzaXplKTsKQEAgLTE2MDksOCArMTYxNCw4IEBACiAJZWl0ZXItPmEubWF4X2ZyYW1lX3NpemUgPSBjcHVfdG9fYmUzMihtYXhfZnJhbWVfc2l6ZSk7CiAJc2l6ZSArPSA0ICsgNDsKIAotCURFQlVHMTMocHJpbnRrKCIlcyglbGQpOiBNQVhfRlJBTUVfU0laRT0leC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sCi0JICAgIGVpdGVyLT5hLm1heF9mcmFtZV9zaXplKSk7CisJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAzYywKKwkgICAgIk1heF9GcmFtZV9TaXplPSV4LlxuIiwgZWl0ZXItPmEubWF4X2ZyYW1lX3NpemUpOwogCiAJLyogT1MgZGV2aWNlIG5hbWUuICovCiAJZWl0ZXIgPSAoc3RydWN0IGN0X2ZkbWlfcG9ydF9hdHRyICopIChlbnRyaWVzICsgc2l6ZSk7CkBAIC0xNjIxLDggKzE2MjYsOCBAQAogCWVpdGVyLT5sZW4gPSBjcHVfdG9fYmUxNig0ICsgYWxlbik7CiAJc2l6ZSArPSA0ICsgYWxlbjsKIAotCURFQlVHMTMocHJpbnRrKCIlcyglbGQpOiBPU19ERVZJQ0VfTkFNRT0lcy5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sCi0JICAgIGVpdGVyLT5hLm9zX2Rldl9uYW1lKSk7CisJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA0YiwKKwkgICAgIk9TX0RldmljZV9OYW1lPSVzLlxuIiwgZWl0ZXItPmEub3NfZGV2X25hbWUpOwogCiAJLyogSG9zdG5hbWUuICovCiAJaWYgKHN0cmxlbihmY19ob3N0X3N5c3RlbV9ob3N0bmFtZSh2aGEtPmhvc3QpKSkgewpAQCAtMTYzNywzNSArMTY0MiwzNiBAQAogCQllaXRlci0+bGVuID0gY3B1X3RvX2JlMTYoNCArIGFsZW4pOwogCQlzaXplICs9IDQgKyBhbGVuOwogCi0JCURFQlVHMTMocHJpbnRrKCIlcyglbGQpOiBIT1NUTkFNRT0lcy5cbiIsIF9fZnVuY19fLAotCQkgICAgdmhhLT5ob3N0X25vLCBlaXRlci0+YS5ob3N0X25hbWUpKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAzZCwKKwkJICAgICJIb3N0TmFtZT0lcy5cbiIsIGVpdGVyLT5hLmhvc3RfbmFtZSk7CiAJfQogCiAJLyogVXBkYXRlIE1TIHJlcXVlc3Qgc2l6ZS4gKi8KIAlxbGEyeDAwX3VwZGF0ZV9tc19mZG1pX2lvY2IodmhhLCBzaXplICsgMTYpOwogCi0JREVCVUcxMyhwcmludGsoIiVzKCVsZCk6IFJQQSBwb3J0bmFtZT0iCi0JICAgICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCBzaXplPSVkLlxuIiwgX19mdW5jX18sCi0JICAgIHZoYS0+aG9zdF9ubywgY3RfcmVxLT5yZXEucnBhLnBvcnRfbmFtZVswXSwKLQkgICAgY3RfcmVxLT5yZXEucnBhLnBvcnRfbmFtZVsxXSwgY3RfcmVxLT5yZXEucnBhLnBvcnRfbmFtZVsyXSwKLQkgICAgY3RfcmVxLT5yZXEucnBhLnBvcnRfbmFtZVszXSwgY3RfcmVxLT5yZXEucnBhLnBvcnRfbmFtZVs0XSwKLQkgICAgY3RfcmVxLT5yZXEucnBhLnBvcnRfbmFtZVs1XSwgY3RfcmVxLT5yZXEucnBhLnBvcnRfbmFtZVs2XSwKLQkgICAgY3RfcmVxLT5yZXEucnBhLnBvcnRfbmFtZVs3XSwgc2l6ZSkpOwotCURFQlVHMTMocWxhMngwMF9kdW1wX2J1ZmZlcihlbnRyaWVzLCBzaXplKSk7CisJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAzZSwKKwkgICAgIlJQQSBwb3J0bmFtZT0gJTAyeCUwMnglMDJ4JTAyeCUwMlglMDJ4JTAyeCUwMnggc2l6ZT0lZC5cbiIsCisJICAgIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbMF0sIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbMV0sCisJICAgIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbMl0sIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbM10sCisJICAgIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbNF0sIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbNV0sCisJICAgIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbNl0sIGN0X3JlcS0+cmVxLnJwYS5wb3J0X25hbWVbN10sCisJICAgIHNpemUpOworCXFsX2R1bXBfYnVmZmVyKHFsX2RiZ19kaXNjICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDIwNzksCisJICAgIGVudHJpZXMsIHNpemUpOwogCiAJLyogRXhlY3V0ZSBNUyBJT0NCICovCiAJcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYih2aGEsIGhhLT5tc19pb2NiLCBoYS0+bXNfaW9jYl9kbWEsCiAJICAgIHNpemVvZihtc19pb2NiX2VudHJ5X3QpKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KLQkJREVCVUcyXzMocHJpbnRrKCJzY3NpKCVsZCk6IFJQQSBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDQwLAorCQkgICAgIlJQQSBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwgcnZhbCk7CiAJfSBlbHNlIGlmIChxbGEyeDAwX2Noa19tc19zdGF0dXModmhhLCBtc19wa3QsIGN0X3JzcCwgIlJQQSIpICE9CiAJICAgIFFMQV9TVUNDRVNTKSB7CiAJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0gZWxzZSB7Ci0JCURFQlVHMihwcmludGsoInNjc2koJWxkKTogUlBBIGV4aXRpbmcgbm9ybWFsbHkuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNDEsCisJCSAgICAiUlBBIGV4aXRpbmcgbm9ybmFsbHkuXG4iKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTE3NDksOCArMTc1NSw4IEBACiAJCSAgICBzaXplb2YobXNfaW9jYl9lbnRyeV90KSk7CiAJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCQkvKkVNUFRZKi8KLQkJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHRlBOX0lEIGlzc3VlIElPQ0IgIgotCQkJICAgICJmYWlsZWQgKCVkKS5cbiIsIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAyMywKKwkJCSAgICAiR0ZQTl9JRCBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwgcnZhbCk7CiAJCX0gZWxzZSBpZiAocWxhMngwMF9jaGtfbXNfc3RhdHVzKHZoYSwgbXNfcGt0LCBjdF9yc3AsCiAJCSAgICAiR0ZQTl9JRCIpICE9IFFMQV9TVUNDRVNTKSB7CiAJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKQEAgLTE4NjAsOCArMTg2Niw4IEBACiAJCSAgICBzaXplb2YobXNfaW9jYl9lbnRyeV90KSk7CiAJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCQkvKkVNUFRZKi8KLQkJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHUFNDIGlzc3VlIElPQ0IgIgotCQkJICAgICJmYWlsZWQgKCVkKS5cbiIsIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA1OSwKKwkJCSAgICAiR1BTQyBpc3N1ZSBJT0NCIGZhaWxlZCAoJWQpLlxuIiwgcnZhbCk7CiAJCX0gZWxzZSBpZiAoKHJ2YWwgPSBxbGEyeDAwX2Noa19tc19zdGF0dXModmhhLCBtc19wa3QsIGN0X3JzcCwKIAkJICAgICJHUFNDIikpICE9IFFMQV9TVUNDRVNTKSB7CiAJCQkvKiBGTSBjb21tYW5kIHVuc3VwcG9ydGVkPyAqLwpAQCAtMTg3MCw5ICsxODc2LDkgQEAKIAkJCQlDVF9SRUFTT05fSU5WQUxJRF9DT01NQU5EX0NPREUgfHwKIAkJCSAgICAgY3RfcnNwLT5oZWFkZXIucmVhc29uX2NvZGUgPT0KIAkJCQlDVF9SRUFTT05fQ09NTUFORF9VTlNVUFBPUlRFRCkpIHsKLQkJCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEdQU0MgY29tbWFuZCAiCi0JCQkJICAgICJ1bnN1cHBvcnRlZCwgZGlzYWJsaW5nIHF1ZXJ5Li4uXG4iLAotCQkJCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDVhLAorCQkJCSAgICAiR1BTQyBjb21tYW5kIHVuc3VwcG9ydGVkLCBkaXNhYmxpbmcgIgorCQkJCSAgICAicXVlcnkuXG4iKTsKIAkJCQloYS0+ZmxhZ3MuZ3BzY19zdXBwb3J0ZWQgPSAwOwogCQkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCQkJCWJyZWFrOwpAQCAtMTg5OCw5ICsxOTA0LDEwIEBACiAJCQkJYnJlYWs7CiAJCQl9CiAKLQkJCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBHUFNDIGV4dCBlbnRyeSAtICIKLQkJCSAgICAiZnBuICUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IHNwZWVkcz0lMDR4ICIKLQkJCSAgICAic3BlZWQ9JTA0eC5cbiIsIHZoYS0+aG9zdF9ubywKKwkJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNWIsCisJCQkgICAgIkdQU0MgZXh0IGVudHJ5IC0gZnBuICIKKwkJCSAgICAiJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnggc3BlZWRzPSUwNHggIgorCQkJICAgICJzcGVlZD0lMDR4LlxuIiwKIAkJCSAgICBsaXN0W2ldLmZhYnJpY19wb3J0X25hbWVbMF0sCiAJCQkgICAgbGlzdFtpXS5mYWJyaWNfcG9ydF9uYW1lWzFdLAogCQkJICAgIGxpc3RbaV0uZmFicmljX3BvcnRfbmFtZVsyXSwKQEAgLTE5MTAsNyArMTkxNyw3IEBACiAJCQkgICAgbGlzdFtpXS5mYWJyaWNfcG9ydF9uYW1lWzZdLAogCQkJICAgIGxpc3RbaV0uZmFicmljX3BvcnRfbmFtZVs3XSwKIAkJCSAgICBiZTE2X3RvX2NwdShjdF9yc3AtPnJzcC5ncHNjLnNwZWVkcyksCi0JCQkgICAgYmUxNl90b19jcHUoY3RfcnNwLT5yc3AuZ3BzYy5zcGVlZCkpKTsKKwkJCSAgICBiZTE2X3RvX2NwdShjdF9yc3AtPnJzcC5ncHNjLnNwZWVkKSk7CiAJCX0KIAogCQkvKiBMYXN0IGRldmljZSBleGl0LiAqLwpAQCAtMTk2OCwxNCArMTk3NSwxMiBAQAogCQkgICBzaXplb2YobXNfaW9jYl9lbnRyeV90KSk7CiAKIAkJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJCURFQlVHMl8zKHByaW50ayhLRVJOX0lORk8KLQkJCSAgICAic2NzaSglbGQpOiBHRkZfSUQgaXNzdWUgSU9DQiBmYWlsZWQgIgotCQkJICAgICIoJWQpLlxuIiwgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDVjLAorCQkJICAgICJHRkZfSUQgaXNzdWUgSU9DQiBmYWlsZWQgKCVkKS5cbiIsIHJ2YWwpOwogCQl9IGVsc2UgaWYgKHFsYTJ4MDBfY2hrX21zX3N0YXR1cyh2aGEsIG1zX3BrdCwgY3RfcnNwLAogCQkJICAgICAgICJHRkZfSUQiKSAhPSBRTEFfU1VDQ0VTUykgewotCQkJREVCVUcyXzMocHJpbnRrKEtFUk5fSU5GTwotCQkJICAgICJzY3NpKCVsZCk6IEdGRl9JRCBJT0NCIHN0YXR1cyBoYWQgYSAiCi0JCQkgICAgImZhaWx1cmUgc3RhdHVzIGNvZGVcbiIsIHZoYS0+aG9zdF9ubykpOworCQkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA1ZCwKKwkJCSAgICAiR0ZGX0lEIElPQ0Igc3RhdHVzIGhhZCBhIGZhaWx1cmUgc3RhdHVzIGNvZGUuXG4iKTsKIAkJfSBlbHNlIHsKIAkJCWZjcF9zY3NpX2ZlYXR1cmVzID0KIAkJCSAgIGN0X3JzcC0+cnNwLmdmZl9pZC5mYzRfZmVhdHVyZXNbR0ZGX0ZDUF9TQ1NJX09GRlNFVF07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYwppbmRleCA5MjBiNzZiLi5kZWY2OTQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbml0LmMKQEAgLTE1MywxMSArMTUzLDEwIEBACiAJZmNfcG9ydF90ICpmY3BvcnQgPSBzcC0+ZmNwb3J0OwogCXN0cnVjdCBzcmJfY3R4ICpjdHggPSBzcC0+Y3R4OwogCi0JREVCVUcyKHByaW50ayhLRVJOX1dBUk5JTkcKLQkJInNjc2koJWxkOiV4KTogQXN5bmMtJXMgdGltZW91dCAtIHBvcnRpZD0lMDJ4JTAyeCUwMnguXG4iLAotCQlmY3BvcnQtPnZoYS0+aG9zdF9ubywgc3AtPmhhbmRsZSwKLQkJY3R4LT5uYW1lLCBmY3BvcnQtPmRfaWQuYi5kb21haW4sCi0JCWZjcG9ydC0+ZF9pZC5iLmFyZWEsIGZjcG9ydC0+ZF9pZC5iLmFsX3BhKSk7CisJcWxfZGJnKHFsX2RiZ19kaXNjLCBmY3BvcnQtPnZoYSwgMHgyMDcxLAorCSAgICAiQXN5bmMtJXMgdGltZW91dCAtIHBvcnRpZD0lMDJ4JTAyeCUwMnguXG4iLAorCSAgICBjdHgtPm5hbWUsIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwgZmNwb3J0LT5kX2lkLmIuYXJlYSwKKwkgICAgZmNwb3J0LT5kX2lkLmIuYWxfcGEpOwogCiAJZmNwb3J0LT5mbGFncyAmPSB+RkNGX0FTWU5DX1NFTlQ7CiAJaWYgKGN0eC0+dHlwZSA9PSBTUkJfTE9HSU5fQ01EKSB7CkBAIC0yMTEsMTEgKzIxMCwxMCBAQAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKQogCQlnb3RvIGRvbmVfZnJlZV9zcDsKIAotCURFQlVHMihwcmludGsoS0VSTl9ERUJVRwotCSAgICAic2NzaSglbGQ6JXgpOiBBc3luYy1sb2dpbiAtIGxvb3AtaWQ9JXggcG9ydGlkPSUwMnglMDJ4JTAyeCAiCi0JICAgICJyZXRyaWVzPSVkLlxuIiwgZmNwb3J0LT52aGEtPmhvc3Rfbm8sIHNwLT5oYW5kbGUsIGZjcG9ydC0+bG9vcF9pZCwKLQkgICAgZmNwb3J0LT5kX2lkLmIuZG9tYWluLCBmY3BvcnQtPmRfaWQuYi5hcmVhLCBmY3BvcnQtPmRfaWQuYi5hbF9wYSwKLQkgICAgZmNwb3J0LT5sb2dpbl9yZXRyeSkpOworCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNzIsCisJICAgICJBc3luYy1sb2dpbiAtIGxvb3BpZD0leCBwb3J0aWQ9JTAyeCUwMnglMDJ4IHJldHJpZXM9JWQuXG4iLAorCSAgICBmY3BvcnQtPmxvb3BfaWQsIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwgZmNwb3J0LT5kX2lkLmIuYXJlYSwKKwkgICAgZmNwb3J0LT5kX2lkLmIuYWxfcGEsIGZjcG9ydC0+bG9naW5fcmV0cnkpOwogCXJldHVybiBydmFsOwogCiBkb25lX2ZyZWVfc3A6CkBAIC0yNTksMTAgKzI1NywxMCBAQAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKQogCQlnb3RvIGRvbmVfZnJlZV9zcDsKIAotCURFQlVHMihwcmludGsoS0VSTl9ERUJVRwotCSAgICAic2NzaSglbGQ6JXgpOiBBc3luYy1sb2dvdXQgLSBsb29wLWlkPSV4IHBvcnRpZD0lMDJ4JTAyeCUwMnguXG4iLAotCSAgICBmY3BvcnQtPnZoYS0+aG9zdF9ubywgc3AtPmhhbmRsZSwgZmNwb3J0LT5sb29wX2lkLAotCSAgICBmY3BvcnQtPmRfaWQuYi5kb21haW4sIGZjcG9ydC0+ZF9pZC5iLmFyZWEsIGZjcG9ydC0+ZF9pZC5iLmFsX3BhKSk7CisJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA3MCwKKwkgICAgIkFzeW5jLWxvZ291dCAtIGxvb3AtaWQ9JXggcG9ydGlkPSUwMnglMDJ4JTAyeC5cbiIsCisJICAgIGZjcG9ydC0+bG9vcF9pZCwgZmNwb3J0LT5kX2lkLmIuZG9tYWluLCBmY3BvcnQtPmRfaWQuYi5hcmVhLAorCSAgICBmY3BvcnQtPmRfaWQuYi5hbF9wYSk7CiAJcmV0dXJuIHJ2YWw7CiAKIGRvbmVfZnJlZV9zcDoKQEAgLTMwOSwxMSArMzA3LDEwIEBACiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpCiAJCWdvdG8gZG9uZV9mcmVlX3NwOwogCi0JREVCVUcyKHByaW50ayhLRVJOX0RFQlVHCi0JICAgICJzY3NpKCVsZDoleCk6IEFzeW5jLWFkaXNjIC0gbG9vcC1pZD0leCBwb3J0aWQ9JTAyeCUwMnglMDJ4LlxuIiwKLQkgICAgZmNwb3J0LT52aGEtPmhvc3Rfbm8sIHNwLT5oYW5kbGUsIGZjcG9ydC0+bG9vcF9pZCwKLQkgICAgZmNwb3J0LT5kX2lkLmIuZG9tYWluLCBmY3BvcnQtPmRfaWQuYi5hcmVhLCBmY3BvcnQtPmRfaWQuYi5hbF9wYSkpOwotCisJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA2ZiwKKwkgICAgIkFzeW5jLWFkaXNjIC0gbG9vcGlkPSV4IHBvcnRpZD0lMDJ4JTAyeCUwMnguXG4iLAorCSAgICBmY3BvcnQtPmxvb3BfaWQsIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwgZmNwb3J0LT5kX2lkLmIuYXJlYSwKKwkgICAgZmNwb3J0LT5kX2lkLmIuYWxfcGEpOwogCXJldHVybiBydmFsOwogCiBkb25lX2ZyZWVfc3A6CkBAIC0zNjIsMTEgKzM1OSwxMCBAQAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKQogCQlnb3RvIGRvbmVfZnJlZV9zcDsKIAotCURFQlVHMihwcmludGsoS0VSTl9ERUJVRwotCSAgICAic2NzaSglbGQ6JXgpOiBBc3luYy10bWYgLSBsb29wLWlkPSV4IHBvcnRpZD0lMDJ4JTAyeCUwMnguXG4iLAotCSAgICBmY3BvcnQtPnZoYS0+aG9zdF9ubywgc3AtPmhhbmRsZSwgZmNwb3J0LT5sb29wX2lkLAotCSAgICBmY3BvcnQtPmRfaWQuYi5kb21haW4sIGZjcG9ydC0+ZF9pZC5iLmFyZWEsIGZjcG9ydC0+ZF9pZC5iLmFsX3BhKSk7Ci0KKwlxbF9kYmcocWxfZGJnX3Rhc2ttLCB2aGEsIDB4ODAyZiwKKwkgICAgIkFzeW5jLXRtZiBsb29wLWlkPSV4IHBvcnRpZD0lMDJ4JTAyeCUwMnguXG4iLAorCSAgICBmY3BvcnQtPmxvb3BfaWQsIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwgZmNwb3J0LT5kX2lkLmIuYXJlYSwKKwkgICAgZmNwb3J0LT5kX2lkLmIuYWxfcGEpOwogCXJldHVybiBydmFsOwogCiBkb25lX2ZyZWVfc3A6CkBAIC00NzEsOSArNDY3LDggQEAKIAkJZmxhZ3MgPT0gVENGX0xVTl9SRVNFVCA/IE1LX1NZTkNfSURfTFVOIDogTUtfU1lOQ19JRCk7CiAKIAlpZiAoKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHx8IGlvY2ItPnUudG1mLmRhdGEpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKEtFUk5fV0FSTklORwotCQkJIiVzKCVsZCk6IFRNIElPQ0IgZmFpbGVkICgleCkuXG4iLAotCQkJX19mdW5jX18sIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQlxbF9kYmcocWxfZGJnX3Rhc2ttLCB2aGEsIDB4ODAzMCwKKwkJICAgICJUTSBJT0NCIGZhaWxlZCAoJXgpLlxuIiwgcnZhbCk7CiAJfQogCiAJcmV0dXJuOwpAQCAtNTE5LDExICs1MTQsMTIgQEAKIAlzZXRfYml0KDAsIGhhLT5yZXFfcWlkX21hcCk7CiAJc2V0X2JpdCgwLCBoYS0+cnNwX3FpZF9tYXApOwogCi0JcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiQ29uZmlndXJpbmcgUENJIHNwYWNlLi4uXG4iKTsKKwlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHgwMDQwLAorCSAgICAiQ29uZmlndXJpbmcgUENJIHNwYWNlLi4uXG4iKTsKIAlydmFsID0gaGEtPmlzcF9vcHMtPnBjaV9jb25maWcodmhhKTsKIAlpZiAocnZhbCkgewotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFVuYWJsZSB0byBjb25maWd1cmUgUENJIHNwYWNlLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubykpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMDQ0LAorCQkgICAgIlVuYWJsZSB0byBjb25maWd1cmUgUENJIHNwYWNlLlxuIik7CiAJCXJldHVybiAocnZhbCk7CiAJfQogCkBAIC01MzEsMjAgKzUyNywyMSBAQAogCiAJcnZhbCA9IHFsYTJ4eHhfZ2V0X2ZsYXNoX2luZm8odmhhKTsKIAlpZiAocnZhbCkgewotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFVuYWJsZSB0byB2YWxpZGF0ZSBGTEFTSCBkYXRhLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubykpOworCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDA0ZiwKKwkJICAgICJVbmFibGUgdG8gdmFsaWRhdGUgRkxBU0ggZGF0YS5cbiIpOwogCQlyZXR1cm4gKHJ2YWwpOwogCX0KIAogCWhhLT5pc3Bfb3BzLT5nZXRfZmxhc2hfdmVyc2lvbih2aGEsIHJlcS0+cmluZyk7Ci0KLQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJDb25maWd1cmUgTlZSQU0gcGFyYW1ldGVycy4uLlxuIik7CisJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4MDA2MSwKKwkgICAgIkNvbmZpZ3VyZSBOVlJBTSBwYXJhbWV0ZXJzLi4uXG4iKTsKIAogCWhhLT5pc3Bfb3BzLT5udnJhbV9jb25maWcodmhhKTsKIAogCWlmIChoYS0+ZmxhZ3MuZGlzYWJsZV9zZXJkZXMpIHsKIAkJLyogTWFzayBIQkEgdmlhIE5WUkFNIHNldHRpbmdzPyAqLwotCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJNYXNraW5nIEhCQSBXV1BOICIKKwkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4MDA3NywKKwkJICAgICJNYXNraW5nIEhCQSBXV1BOICIKIAkJICAgICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAodmlhIE5WUkFNKS5cbiIsCiAJCSAgICB2aGEtPnBvcnRfbmFtZVswXSwgdmhhLT5wb3J0X25hbWVbMV0sCiAJCSAgICB2aGEtPnBvcnRfbmFtZVsyXSwgdmhhLT5wb3J0X25hbWVbM10sCkBAIC01NTMsNyArNTUwLDggQEAKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfQogCi0JcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiVmVyaWZ5aW5nIGxvYWRlZCBSSVNDIGNvZGUuLi5cbiIpOworCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwNzgsCisJICAgICJWZXJpZnlpbmcgbG9hZGVkIFJJU0MgY29kZS4uLlxuIik7CiAKIAlpZiAocWxhMngwMF9pc3BfZmlybXdhcmUodmhhKSAhPSBRTEFfU1VDQ0VTUykgewogCQlydmFsID0gaGEtPmlzcF9vcHMtPmNoaXBfZGlhZyh2aGEpOwpAQCAtNTY3LDcgKzU2NSw3IEBACiAJaWYgKElTX1FMQTg0WFgoaGEpKSB7CiAJCWhhLT5jczg0eHggPSBxbGE4NHh4X2dldF9jaGlwKHZoYSk7CiAJCWlmICghaGEtPmNzODR4eCkgewotCQkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsCisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMGQwLAogCQkJICAgICJVbmFibGUgdG8gY29uZmlndXJlIElTUDg0WFguXG4iKTsKIAkJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCQl9CkBAIC01NzksOCArNTc3LDggQEAKIAkJLyogSXNzdWUgdmVyaWZ5IDg0eHggRlcgSU9DQiB0byBjb21wbGV0ZSA4NHh4IGluaXRpYWxpemF0aW9uICovCiAJCXJ2YWwgPSBxbGE4NHh4X2luaXRfY2hpcCh2aGEpOwogCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsCi0JCQkJIlVuYWJsZSB0byBpbml0aWFsaXplIElTUDg0WFguXG4iKTsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAwZDQsCisJCQkgICAgIlVuYWJsZSB0byBpbml0aWFsaXplIElTUDg0WFguXG4iKTsKIAkJcWxhODR4eF9wdXRfY2hpcCh2aGEpOwogCQl9CiAJfQpAQCAtNzk3LDkgKzc5NSw3IEBACiAJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAKIAlpZiAoaGEtPmZsYWdzLmRpc2FibGVfcmlzY19jb2RlX2xvYWQpIHsKLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBSSVNDIENPREUgTk9UIGxvYWRlZFxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubykpOwotCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJSSVNDIENPREUgTk9UIGxvYWRlZFxuIik7CisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwNzksICJSSVNDIENPREUgTk9UIGxvYWRlZC5cbiIpOwogCiAJCS8qIFZlcmlmeSBjaGVja3N1bSBvZiBsb2FkZWQgUklTQyBjb2RlLiAqLwogCQlydmFsID0gcWxhMngwMF92ZXJpZnlfY2hlY2tzdW0odmhhLCBoYS0+Zndfc3Jpc2NfYWRkcmVzcyk7CkBAIC04MTAsMTAgKzgwNiw5IEBACiAJCX0KIAl9CiAKLQlpZiAocnZhbCkgewotCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogKioqKiBMb2FkIFJJU0MgY29kZSAqKioqXG4iLAotCQkgICAgdmhhLT5ob3N0X25vKSk7Ci0JfQorCWlmIChydmFsKQorCQlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMDdhLAorCQkgICAgIioqKiogTG9hZCBSSVNDIGNvZGUgKioqKi5cbiIpOwogCiAJcmV0dXJuIChydmFsKTsKIH0KQEAgLTExMDUsOCArMTEwMCw4IEBACiAJLyogQXNzdW1lIGEgZmFpbGVkIHN0YXRlICovCiAJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAKLQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IFRlc3RpbmcgZGV2aWNlIGF0ICVseC5cbiIsCi0JICAgIHZoYS0+aG9zdF9ubywgKHVfbG9uZykmcmVnLT5mbGFzaF9hZGRyZXNzKSk7CisJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDA3YiwKKwkgICAgIlRlc3RpbmcgZGV2aWNlIGF0ICVseC5cbiIsICh1X2xvbmcpJnJlZy0+Zmxhc2hfYWRkcmVzcyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIApAQCAtMTEyOCw4ICsxMTIzLDggQEAKIAlpZiAoIWNudCkKIAkJZ290byBjaGlwX2RpYWdfZmFpbGVkOwogCi0JREVCVUczKHByaW50aygic2NzaSglbGQpOiBSZXNldCByZWdpc3RlciBjbGVhcmVkIGJ5IGNoaXAgcmVzZXRcbiIsCi0JICAgIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwN2MsCisJICAgICJSZXNldCByZWdpc3RlciBjbGVhcmVkIGJ5IGNoaXAgcmVzZXQuXG4iKTsKIAogCS8qIFJlc2V0IFJJU0MgcHJvY2Vzc29yLiAqLwogCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLCBIQ0NSX1JFU0VUX1JJU0MpOwpAQCAtMTE1MCw3ICsxMTQ1LDcgQEAKIAkJZ290byBjaGlwX2RpYWdfZmFpbGVkOwogCiAJLyogQ2hlY2sgcHJvZHVjdCBJRCBvZiBjaGlwICovCi0JREVCVUczKHByaW50aygic2NzaSglbGQpOiBDaGVja2luZyBwcm9kdWN0IElEIG9mIGNoaXBcbiIsIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwN2QsICJDaGVja2luZyBwcm9kdWN0IElkIG9mIGNoaXAuXG4iKTsKIAogCW1iWzFdID0gUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgMSk7CiAJbWJbMl0gPSBSRF9NQUlMQk9YX1JFRyhoYSwgcmVnLCAyKTsKQEAgLTExNTgsOCArMTE1Myw5IEBACiAJbWJbNF0gPSBxbGEyeDAwX2RlYm91bmNlX3JlZ2lzdGVyKE1BSUxCT1hfUkVHKGhhLCByZWcsIDQpKTsKIAlpZiAobWJbMV0gIT0gUFJPRF9JRF8xIHx8IChtYlsyXSAhPSBQUk9EX0lEXzIgJiYgbWJbMl0gIT0gUFJPRF9JRF8yYSkgfHwKIAkgICAgbWJbM10gIT0gUFJPRF9JRF8zKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJXcm9uZyBwcm9kdWN0IElEID0gMHgleCwweCV4LDB4JXhcbiIsIG1iWzFdLCBtYlsyXSwgbWJbM10pOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMDYyLAorCQkgICAgIldyb25nIHByb2R1Y3QgSUQgPSAweCV4LDB4JXgsMHgleC5cbiIsCisJCSAgICBtYlsxXSwgbWJbMl0sIG1iWzNdKTsKIAogCQlnb3RvIGNoaXBfZGlhZ19mYWlsZWQ7CiAJfQpAQCAtMTE3OCw4ICsxMTc0LDcgQEAKIAlpZiAoSVNfUUxBMjIwMChoYSkgJiYKIAkgICAgUkRfTUFJTEJPWF9SRUcoaGEsIHJlZywgNykgPT0gUUxBMjIwMEFfUklTQ19ST01fVkVSKSB7CiAJCS8qIExpbWl0IGZpcm13YXJlIHRyYW5zZmVyIHNpemUgd2l0aCBhIDIyMDBBICovCi0JCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogRm91bmQgUUxBMjIwMEEgY2hpcC5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDA3ZSwgIkZvdW5kIFFMQTIyMDBBIENoaXAuXG4iKTsKIAogCQloYS0+ZGV2aWNlX3R5cGUgfD0gRFRfSVNQMjIwMEE7CiAJCWhhLT5md190cmFuc2Zlcl9zaXplID0gMTI4OwpAQCAtMTE4OCwyNCArMTE4MywyMCBAQAogCS8qIFdyYXAgSW5jb21pbmcgTWFpbGJveGVzIFRlc3QuICovCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAotCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogQ2hlY2tpbmcgbWFpbGJveGVzLlxuIiwgdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDA3ZiwgIkNoZWNraW5nIG1haWxib3hlcy5cbiIpOwogCXJ2YWwgPSBxbGEyeDAwX21ieF9yZWdfdGVzdCh2aGEpOwotCWlmIChydmFsKSB7Ci0JCURFQlVHKHByaW50aygic2NzaSglbGQpOiBGYWlsZWQgbWFpbGJveCBzZW5kIHJlZ2lzdGVyIHRlc3RcbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIkZhaWxlZCBtYWlsYm94IHNlbmQgcmVnaXN0ZXIgdGVzdFxuIik7Ci0JfQotCWVsc2UgeworCWlmIChydmFsKQorCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMDgwLAorCQkgICAgIkZhaWxlZCBtYWlsYm94IHNlbmQgcmVnaXN0ZXIgdGVzdC5cbiIpOworCWVsc2UKIAkJLyogRmxhZyBhIHN1Y2Nlc3NmdWwgcnZhbCAqLwogCQlydmFsID0gUUxBX1NVQ0NFU1M7Ci0JfQogCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCiBjaGlwX2RpYWdfZmFpbGVkOgogCWlmIChydmFsKQotCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogQ2hpcCBkaWFnbm9zdGljcyAqKioqIEZBSUxFRCAiCi0JCSAgICAiKioqKlxuIiwgdmhhLT5ob3N0X25vKSk7CisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwODEsCisJCSAgICAiQ2hpcCBkaWFnbm9zdGljcyAqKioqIEZBSUxFRCAqKioqLlxuIik7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCkBAIC0xMjMyLDEwICsxMjIzLDggQEAKIAogCXJ2YWwgPSBxbGEyeDAwX21ieF9yZWdfdGVzdCh2aGEpOwogCWlmIChydmFsKSB7Ci0JCURFQlVHKHByaW50aygic2NzaSglbGQpOiBGYWlsZWQgbWFpbGJveCBzZW5kIHJlZ2lzdGVyIHRlc3RcbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIkZhaWxlZCBtYWlsYm94IHNlbmQgcmVnaXN0ZXIgdGVzdFxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAwODIsCisJCSAgICAiRmFpbGVkIG1haWxib3ggc2VuZCByZWdpc3RlciB0ZXN0LlxuIik7CiAJfSBlbHNlIHsKIAkJLyogRmxhZyBhIHN1Y2Nlc3NmdWwgcnZhbCAqLwogCQlydmFsID0gUUxBX1NVQ0NFU1M7CkBAIC0xMjU3LDggKzEyNDYsOCBAQAogCXN0cnVjdCByc3BfcXVlICpyc3AgPSBoYS0+cnNwX3FfbWFwWzBdOwogCiAJaWYgKGhhLT5md19kdW1wKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJGaXJtd2FyZSBkdW1wIHByZXZpb3VzbHkgYWxsb2NhdGVkLlxuIik7CisJCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwYmQsCisJCSAgICAiRmlybXdhcmUgZHVtcCBhbHJlYWR5IGFsbG9jYXRlZC5cbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMjg4LDggKzEyNzcsOSBAQAogCQl0YyA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgRkNFX1NJWkUsICZ0Y19kbWEsCiAJCSAgICBHRlBfS0VSTkVMKTsKIAkJaWYgKCF0YykgewotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiVW5hYmxlIHRvIGFsbG9jYXRlICIKLQkJCSAgICAiKCVkIEtCKSBmb3IgRkNFLlxuIiwgRkNFX1NJWkUgLyAxMDI0KTsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAwYmUsCisJCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSAoJWQgS0IpIGZvciBGQ0UuXG4iLAorCQkJICAgIEZDRV9TSVpFIC8gMTAyNCk7CiAJCQlnb3RvIHRyeV9lZnQ7CiAJCX0KIApAQCAtMTI5NywxNiArMTI4NywxNSBAQAogCQlydmFsID0gcWxhMngwMF9lbmFibGVfZmNlX3RyYWNlKHZoYSwgdGNfZG1hLCBGQ0VfTlVNX0JVRkZFUlMsCiAJCSAgICBoYS0+ZmNlX21iLCAmaGEtPmZjZV9idWZzKTsKIAkJaWYgKHJ2YWwpIHsKLQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIlVuYWJsZSB0byBpbml0aWFsaXplICIKLQkJCSAgICAiRkNFICglZCkuXG4iLCBydmFsKTsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAwYmYsCisJCQkgICAgIlVuYWJsZSB0byBpbml0aWFsaXplIEZDRSAoJWQpLlxuIiwgcnZhbCk7CiAJCQlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgRkNFX1NJWkUsIHRjLAogCQkJICAgIHRjX2RtYSk7CiAJCQloYS0+ZmxhZ3MuZmNlX2VuYWJsZWQgPSAwOwogCQkJZ290byB0cnlfZWZ0OwogCQl9Ci0KLQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiQWxsb2NhdGVkICglZCBLQikgZm9yIEZDRS4uLlxuIiwKLQkJICAgIEZDRV9TSVpFIC8gMTAyNCk7CisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwYzAsCisJCSAgICAiQWxsb2NhdGUgKCVkIEtCKSBmb3IgRkNFLi4uXG4iLCBGQ0VfU0laRSAvIDEwMjQpOwogCiAJCWZjZV9zaXplID0gc2l6ZW9mKHN0cnVjdCBxbGEyeHh4X2ZjZV9jaGFpbikgKyBGQ0VfU0laRTsKIAkJaGEtPmZsYWdzLmZjZV9lbmFibGVkID0gMTsKQEAgLTEzMTcsMjMgKzEzMDYsMjMgQEAKIAkJdGMgPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIEVGVF9TSVpFLCAmdGNfZG1hLAogCQkgICAgR0ZQX0tFUk5FTCk7CiAJCWlmICghdGMpIHsKLQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIlVuYWJsZSB0byBhbGxvY2F0ZSAiCi0JCQkgICAgIiglZCBLQikgZm9yIEVGVC5cbiIsIEVGVF9TSVpFIC8gMTAyNCk7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMGMxLAorCQkJICAgICJVbmFibGUgdG8gYWxsb2NhdGUgKCVkIEtCKSBmb3IgRUZULlxuIiwKKwkJCSAgICBFRlRfU0laRSAvIDEwMjQpOwogCQkJZ290byBjb250X2FsbG9jOwogCQl9CiAKIAkJbWVtc2V0KHRjLCAwLCBFRlRfU0laRSk7CiAJCXJ2YWwgPSBxbGEyeDAwX2VuYWJsZV9lZnRfdHJhY2UodmhhLCB0Y19kbWEsIEVGVF9OVU1fQlVGRkVSUyk7CiAJCWlmIChydmFsKSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSAiCi0JCQkgICAgIkVGVCAoJWQpLlxuIiwgcnZhbCk7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMGMyLAorCQkJICAgICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBFRlQgKCVkKS5cbiIsIHJ2YWwpOwogCQkJZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIEVGVF9TSVpFLCB0YywKIAkJCSAgICB0Y19kbWEpOwogCQkJZ290byBjb250X2FsbG9jOwogCQl9Ci0KLQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiQWxsb2NhdGVkICglZCBLQikgZm9yIEVGVC4uLlxuIiwKLQkJICAgIEVGVF9TSVpFIC8gMTAyNCk7CisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwYzMsCisJCSAgICAiQWxsb2NhdGVkICglZCBLQikgRUZUIC4uLlxuIiwgRUZUX1NJWkUgLyAxMDI0KTsKIAogCQllZnRfc2l6ZSA9IEVGVF9TSVpFOwogCQloYS0+ZWZ0X2RtYSA9IHRjX2RtYTsKQEAgLTEzNTAsOCArMTMzOSw5IEBACiAKIAloYS0+ZndfZHVtcCA9IHZtYWxsb2MoZHVtcF9zaXplKTsKIAlpZiAoIWhhLT5md19kdW1wKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIlVuYWJsZSB0byBhbGxvY2F0ZSAoJWQgS0IpIGZvciAiCi0JCSAgICAiZmlybXdhcmUgZHVtcCEhIVxuIiwgZHVtcF9zaXplIC8gMTAyNCk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAwYzQsCisJCSAgICAiVW5hYmxlIHRvIGFsbG9jYXRlICglZCBLQikgZm9yIGZpcm13YXJlIGR1bXAuXG4iLAorCQkgICAgZHVtcF9zaXplIC8gMTAyNCk7CiAKIAkJaWYgKGhhLT5mY2UpIHsKIAkJCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBGQ0VfU0laRSwgaGEtPmZjZSwKQEAgLTEzNjgsOCArMTM1OCw4IEBACiAJCX0KIAkJcmV0dXJuOwogCX0KLQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJBbGxvY2F0ZWQgKCVkIEtCKSBmb3IgZmlybXdhcmUgZHVtcC4uLlxuIiwKLQkgICAgZHVtcF9zaXplIC8gMTAyNCk7CisJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4MDBjNSwKKwkgICAgIkFsbG9jYXRlZCAoJWQgS0IpIGZvciBmaXJtd2FyZSBkdW1wLlxuIiwgZHVtcF9zaXplIC8gMTAyNCk7CiAKIAloYS0+ZndfZHVtcF9sZW4gPSBkdW1wX3NpemU7CiAJaGEtPmZ3X2R1bXAtPnNpZ25hdHVyZVswXSA9ICdRJzsKQEAgLTEzOTgsMjMgKzEzODgsMjEgQEAKIAlpbnQgcnZhbDsKIAl1aW50MTZfdCBkYzsKIAl1aW50MzJfdCBkdzsKLQlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAogCWlmICghSVNfUUxBODFYWCh2aGEtPmh3KSkKIAkJcmV0dXJuIFFMQV9TVUNDRVNTOwogCiAJcnZhbCA9IHFsYTJ4MDBfd3JpdGVfcmFtX3dvcmQodmhhLCAweDdjMDAsIDEpOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiU3luYy1NUEk6IFVuYWJsZSB0byBhY3F1aXJlIHNlbWFwaG9yZS5cbiIpKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDEwNSwKKwkJICAgICJVbmFibGUgdG8gYWNxdWlyZSBzZW1hcGhvcmUuXG4iKTsKIAkJZ290byBkb25lOwogCX0KIAogCXBjaV9yZWFkX2NvbmZpZ193b3JkKHZoYS0+aHctPnBkZXYsIDB4NTQsICZkYyk7CiAJcnZhbCA9IHFsYTJ4MDBfcmVhZF9yYW1fd29yZCh2aGEsIDB4N2ExNSwgJmR3KTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIlN5bmMtTVBJOiBVbmFibGUgdG8gcmVhZCBzeW5jLlxuIikpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMDY3LCAiVW5hYmxlIHRvIHJlYWQgc3luYy5cbiIpOwogCQlnb3RvIGRvbmVfcmVsZWFzZTsKIAl9CiAKQEAgLTE0MjYsMTUgKzE0MTQsMTQgQEAKIAlkdyB8PSBkYzsKIAlydmFsID0gcWxhMngwMF93cml0ZV9yYW1fd29yZCh2aGEsIDB4N2ExNSwgZHcpOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiU3luYy1NUEk6IFVuYWJsZSB0byBnYWluIHN5bmMuXG4iKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAxMTQsICJVbmFibGUgdG8gZ2FpbiBzeW5jLlxuIik7CiAJfQogCiBkb25lX3JlbGVhc2U6CiAJcnZhbCA9IHFsYTJ4MDBfd3JpdGVfcmFtX3dvcmQodmhhLCAweDdjMDAsIDApOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiU3luYy1NUEk6IFVuYWJsZSB0byByZWxlYXNlIHNlbWFwaG9yZS5cbiIpKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDA2ZCwKKwkJICAgICJVbmFibGUgdG8gcmVsZWFzZSBzZW1hcGhvcmUuXG4iKTsKIAl9CiAKIGRvbmU6CkBAIC0xNDc5LDE0ICsxNDY2LDE0IEBACiAJLyogTG9hZCBmaXJtd2FyZSBzZXF1ZW5jZXMgKi8KIAlydmFsID0gaGEtPmlzcF9vcHMtPmxvYWRfcmlzYyh2aGEsICZzcmlzY19hZGRyZXNzKTsKIAlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUykgewotCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogVmVyaWZ5aW5nIENoZWNrc3VtIG9mIGxvYWRlZCBSSVNDICIKLQkJICAgICJjb2RlLlxuIiwgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwYzksCisJCSAgICAiVmVyaWZ5aW5nIENoZWNrc3VtIG9mIGxvYWRlZCBSSVNDIGNvZGUuXG4iKTsKIAogCQlydmFsID0gcWxhMngwMF92ZXJpZnlfY2hlY2tzdW0odmhhLCBzcmlzY19hZGRyZXNzKTsKIAkJaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MpIHsKIAkJCS8qIFN0YXJ0IGZpcm13YXJlIGV4ZWN1dGlvbi4gKi8KLQkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBDaGVja3N1bSBPSywgc3RhcnQgIgotCQkJICAgICJmaXJtd2FyZS5cbiIsIHZoYS0+aG9zdF9ubykpOworCQkJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDBjYSwKKwkJCSAgICAiU3RhcnRpbmcgZmlybXdhcmUuXG4iKTsKIAogCQkJcnZhbCA9IHFsYTJ4MDBfZXhlY3V0ZV9mdyh2aGEsIHNyaXNjX2FkZHJlc3MpOwogCQkJLyogUmV0cmlldmUgZmlybXdhcmUgaW5mb3JtYXRpb24uICovCkBAIC0xNTIyLDkgKzE1MDksOSBAQAogCQkJCX0KIAkJCX0KIAkJfSBlbHNlIHsKLQkJCURFQlVHMihwcmludGsoS0VSTl9JTkZPCi0JCQkgICAgInNjc2koJWxkKTogSVNQIEZpcm13YXJlIGZhaWxlZCBjaGVja3N1bS5cbiIsCi0JCQkgICAgdmhhLT5ob3N0X25vKSk7CisJCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDBjZCwKKwkJCSAgICAiSVNQIEZpcm13YXJlIGZhaWxlZCBjaGVja3N1bS5cbiIpOworCQkJZ290byBmYWlsZWQ7CiAJCX0KIAl9CiAKQEAgLTE1NDksNyArMTUzNiw3IEBACiAJCQloYS0+ZmxhZ3MuZmFjX3N1cHBvcnRlZCA9IDE7CiAJCQloYS0+ZmR0X2Jsb2NrX3NpemUgPSBzaXplIDw8IDI7CiAJCX0gZWxzZSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAwY2UsCiAJCQkgICAgIlVuc3VwcG9ydGVkIEZBQyBmaXJtd2FyZSAoJWQuJTAyZC4lMDJkKS5cbiIsCiAJCQkgICAgaGEtPmZ3X21ham9yX3ZlcnNpb24sIGhhLT5md19taW5vcl92ZXJzaW9uLAogCQkJICAgIGhhLT5md19zdWJtaW5vcl92ZXJzaW9uKTsKQEAgLTE1NTcsOCArMTU0NCw4IEBACiAJfQogZmFpbGVkOgogCWlmIChydmFsKSB7Ci0JCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBTZXR1cCBjaGlwICoqKiogRkFJTEVEICoqKiouXG4iLAotCQkgICAgdmhhLT5ob3N0X25vKSk7CisJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMGNmLAorCQkgICAgIlNldHVwIGNoaXAgKioqKkZBSUxFRCoqKiouXG4iKTsKIAl9CiAKIAlyZXR1cm4gKHJ2YWwpOwpAQCAtMTYwOCwxMCArMTU5NSwxMSBAQAogCQlyZXR1cm47CiAKIAkvKiBTZXJpYWwgTGluayBvcHRpb25zLiAqLwotCURFQlVHMyhwcmludGsoInNjc2koJWxkKTogU2VyaWFsIGxpbmsgb3B0aW9uczpcbiIsCi0JICAgIHZoYS0+aG9zdF9ubykpOwotCURFQlVHMyhxbGEyeDAwX2R1bXBfYnVmZmVyKCh1aW50OF90ICopJmhhLT5md19zZXJpYWxsaW5rX29wdGlvbnMsCi0JICAgIHNpemVvZihoYS0+Zndfc2VyaWFsbGlua19vcHRpb25zKSkpOworCXFsX2RiZyhxbF9kYmdfaW5pdCArIHFsX2RiZ19idWZmZXIsIHZoYSwgMHgwMTE1LAorCSAgICAiU2VyaWFsIGxpbmsgb3B0aW9ucy5cbiIpOworCXFsX2R1bXBfYnVmZmVyKHFsX2RiZ19pbml0ICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDAxMDksCisJICAgICh1aW50OF90ICopJmhhLT5md19zZXJpYWxsaW5rX29wdGlvbnMsCisJICAgIHNpemVvZihoYS0+Zndfc2VyaWFsbGlua19vcHRpb25zKSk7CiAKIAloYS0+Zndfb3B0aW9uc1sxXSAmPSB+Rk8xX1NFVF9FTVBIQVNJU19TV0lORzsKIAlpZiAoaGEtPmZ3X3NlcmlhbGxpbmtfb3B0aW9uc1szXSAmIEJJVF8yKSB7CkBAIC0xNjg4LDcgKzE2NzYsNyBAQAogCSAgICBsZTE2X3RvX2NwdShoYS0+Zndfc2VyaWFsbGlua19vcHRpb25zMjRbMl0pLAogCSAgICBsZTE2X3RvX2NwdShoYS0+Zndfc2VyaWFsbGlua19vcHRpb25zMjRbM10pKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAxMDQsCiAJCSAgICAiVW5hYmxlIHRvIHVwZGF0ZSBTZXJpYWwgTGluayBvcHRpb25zICgleCkuXG4iLCBydmFsKTsKIAl9CiB9CkBAIC0xNzQ2LDggKzE3MzQsOSBAQAogCQlpY2ItPnJpZCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYocmlkKTsKIAkJaWYgKGhhLT5mbGFncy5tc2l4X2VuYWJsZWQpIHsKIAkJCW1zaXggPSAmaGEtPm1zaXhfZW50cmllc1sxXTsKLQkJCURFQlVHMl8xNyhwcmludGsoS0VSTl9JTkZPCi0JCQkiUmVnaXN0ZXJpbmcgdmVjdG9yIDB4JXggZm9yIGJhc2UgcXVlXG4iLCBtc2l4LT5lbnRyeSkpOworCQkJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDBmZCwKKwkJCSAgICAiUmVnaXN0ZXJpbmcgdmVjdG9yIDB4JXggZm9yIGJhc2UgcXVlLlxuIiwKKwkJCSAgICBtc2l4LT5lbnRyeSk7CiAJCQlpY2ItPm1zaXggPSBjcHVfdG9fbGUxNihtc2l4LT5lbnRyeSk7CiAJCX0KIAkJLyogVXNlIGFsdGVybmF0ZSBQQ0kgYnVzIG51bWJlciAqLwpAQCAtMTc2NCw4ICsxNzUzLDggQEAKIAkJCWljYi0+ZmlybXdhcmVfb3B0aW9uc18yICY9CiAJCQkJX19jb25zdGFudF9jcHVfdG9fbGUzMih+QklUXzIyKTsKIAkJCWhhLT5mbGFncy5kaXNhYmxlX21zaXhfaGFuZHNoYWtlID0gMTsKLQkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCQkiTVNJWCBIYW5kc2hha2UgRGlzYWJsZSBNb2RlIHR1cm5lZCBvblxuIik7CisJCQlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMGZlLAorCQkJICAgICJNU0lYIEhhbmRzaGFrZSBEaXNhYmxlIE1vZGUgdHVybmVkIG9uLlxuIik7CiAJCX0gZWxzZSB7CiAJCQlpY2ItPmZpcm13YXJlX29wdGlvbnNfMiB8PQogCQkJCV9fY29uc3RhbnRfY3B1X3RvX2xlMzIoQklUXzIyKTsKQEAgLTE4NTAsNyArMTgzOSw3IEBACiAJLyogVXBkYXRlIGFueSBJU1Agc3BlY2lmaWMgZmlybXdhcmUgb3B0aW9ucyBiZWZvcmUgaW5pdGlhbGl6YXRpb24uICovCiAJaGEtPmlzcF9vcHMtPnVwZGF0ZV9md19vcHRpb25zKHZoYSk7CiAKLQlERUJVRyhwcmludGsoInNjc2koJWxkKTogSXNzdWUgaW5pdCBmaXJtd2FyZS5cbiIsIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwZDEsICJJc3N1ZSBpbml0IGZpcm13YXJlLlxuIik7CiAKIAlpZiAoaGEtPmZsYWdzLm5waXZfc3VwcG9ydGVkKSB7CiAJCWlmIChoYS0+b3BlcmF0aW5nX21vZGUgPT0gTE9PUCkKQEAgLTE4NjYsMTEgKzE4NTUsMTEgQEAKIAogCXJ2YWwgPSBxbGEyeDAwX2luaXRfZmlybXdhcmUodmhhLCBoYS0+aW5pdF9jYl9zaXplKTsKIAlpZiAocnZhbCkgewotCQlERUJVRzJfMyhwcmludGsoInNjc2koJWxkKTogSW5pdCBmaXJtd2FyZSAqKioqIEZBSUxFRCAqKioqLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubykpOworCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDBkMiwKKwkJICAgICJJbml0IEZpcm13YXJlICoqKiogRkFJTEVEICoqKiouXG4iKTsKIAl9IGVsc2UgewotCQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IEluaXQgZmlybXdhcmUgLS0gc3VjY2Vzcy5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDBkMywKKwkJICAgICJJbml0IEZpcm13YXJlIC0tIHN1Y2Nlc3MuXG4iKTsKIAl9CiAKIAlyZXR1cm4gKHJ2YWwpOwpAQCAtMTkxMywxMCArMTkwMiw4IEBACiAKIAkvKiBXYWl0IGZvciBJU1AgdG8gZmluaXNoIExJUCAqLwogCWlmICghdmhhLT5mbGFncy5pbml0X2RvbmUpCi0gCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJXYWl0aW5nIGZvciBMSVAgdG8gY29tcGxldGUuLi5cbiIpOwotCi0JREVCVUczKHByaW50aygic2NzaSglbGQpOiBXYWl0aW5nIGZvciBMSVAgdG8gY29tcGxldGUuLi5cbiIsCi0JICAgIHZoYS0+aG9zdF9ubykpOworCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg4MDFlLAorCQkgICAgIldhaXRpbmcgZm9yIExJUCB0byBjb21wbGV0ZS5cbiIpOwogCiAJZG8gewogCQlydmFsID0gcWxhMngwMF9nZXRfZmlybXdhcmVfc3RhdGUodmhhLCBzdGF0ZSk7CkBAIC0xOTI1LDMwICsxOTEyLDM1IEBACiAJCQkJdmhhLT5kZXZpY2VfZmxhZ3MgJj0gfkRGTEdfTk9fQ0FCTEU7CiAJCQl9CiAJCQlpZiAoSVNfUUxBODRYWChoYSkgJiYgc3RhdGVbMF0gIT0gRlNUQVRFX1JFQURZKSB7Ci0JCQkJREVCVUcxNihwcmludGsoInNjc2koJWxkKTogZndfc3RhdGU9JXggIgotCQkJCSAgICAiODR4eD0leC5cbiIsIHZoYS0+aG9zdF9ubywgc3RhdGVbMF0sCi0JCQkJICAgIHN0YXRlWzJdKSk7CisJCQkJcWxfZGJnKHFsX2RiZ190YXNrbSwgdmhhLCAweDgwMWYsCisJCQkJICAgICJmd19zdGF0ZT0leCA4NHh4PSV4LlxuIiwgc3RhdGVbMF0sCisJCQkJICAgIHN0YXRlWzJdKTsKIAkJCQlpZiAoKHN0YXRlWzJdICYgRlNUQVRFX0xPR0dFRF9JTikgJiYKIAkJCQkgICAgIChzdGF0ZVsyXSAmIEZTVEFURV9XQUlUSU5HX0ZPUl9WRVJJRlkpKSB7Ci0JCQkJCURFQlVHMTYocHJpbnRrKCJzY3NpKCVsZCk6IFNlbmRpbmcgIgotCQkJCQkgICAgInZlcmlmeSBpb2NiLlxuIiwgdmhhLT5ob3N0X25vKSk7CisJCQkJCXFsX2RiZyhxbF9kYmdfdGFza20sIHZoYSwgMHg4MDI4LAorCQkJCQkgICAgIlNlbmRpbmcgdmVyaWZ5IGlvY2IuXG4iKTsKIAogCQkJCQljczg0eHhfdGltZSA9IGppZmZpZXM7CiAJCQkJCXJ2YWwgPSBxbGE4NHh4X2luaXRfY2hpcCh2aGEpOwotCQkJCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKKwkJCQkJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJCQkJCXFsX2xvZyhxbF9sb2dfd2FybiwKKwkJCQkJCSAgICB2aGEsIDB4ODA0MywKKwkJCQkJCSAgICAiSW5pdCBjaGlwIGZhaWxlZC5cbiIpOwogCQkJCQkJYnJlYWs7CisJCQkJCX0KIAogCQkJCQkvKiBBZGQgdGltZSB0YWtlbiB0byBpbml0aWFsaXplLiAqLwogCQkJCQljczg0eHhfdGltZSA9IGppZmZpZXMgLSBjczg0eHhfdGltZTsKIAkJCQkJd3RpbWUgKz0gY3M4NHh4X3RpbWU7CiAJCQkJCW10aW1lICs9IGNzODR4eF90aW1lOwotCQkJCQlERUJVRzE2KHByaW50aygic2NzaSglbGQpOiBJbmNyZWFzaW5nICIKLQkJCQkJICAgICJ3YWl0IHRpbWUgYnkgJWxkLiBOZXcgdGltZSAlbGRcbiIsCi0JCQkJCSAgICB2aGEtPmhvc3Rfbm8sIGNzODR4eF90aW1lLCB3dGltZSkpOworCQkJCQlxbF9kYmcocWxfZGJnX3Rhc2ttLCB2aGEsIDB4ODA0MiwKKwkJCQkJICAgICJJbmNyZWFzaW5nIHdhaXQgdGltZSBieSAlbGQuICIKKwkJCQkJICAgICJOZXcgdGltZSAlbGQuXG4iLCBjczg0eHhfdGltZSwKKwkJCQkJICAgIHd0aW1lKTsKIAkJCQl9CiAJCQl9IGVsc2UgaWYgKHN0YXRlWzBdID09IEZTVEFURV9SRUFEWSkgewotCQkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBGL1cgUmVhZHkgLSBPSyBcbiIsCi0JCQkJICAgIHZoYS0+aG9zdF9ubykpOworCQkJCXFsX2RiZyhxbF9kYmdfdGFza20sIHZoYSwgMHg4MDM3LAorCQkJCSAgICAiRi9XIFJlYWR5IC0gT0suXG4iKTsKIAogCQkJCXFsYTJ4MDBfZ2V0X3JldHJ5X2NudCh2aGEsICZoYS0+cmV0cnlfY291bnQsCiAJCQkJICAgICZoYS0+bG9naW5fdGltZW91dCwgJmhhLT5yX2FfdG92KTsKQEAgLTE5NjUsNyArMTk1Nyw3IEBACiAJCQkJICogb3RoZXIgdGhhbiBXYWl0IGZvciBMb2dpbi4KIAkJCQkgKi8KIAkJCQlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCBtdGltZSkpIHsKLQkJCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg4MDM4LAogCQkJCQkgICAgIkNhYmxlIGlzIHVucGx1Z2dlZC4uLlxuIik7CiAKIAkJCQkJdmhhLT5kZXZpY2VfZmxhZ3MgfD0gREZMR19OT19DQUJMRTsKQEAgLTE5ODUsMTcgKzE5NzcsMTcgQEAKIAkJLyogRGVsYXkgZm9yIGEgd2hpbGUgKi8KIAkJbXNsZWVwKDUwMCk7CiAKLQkJREVCVUczKHByaW50aygic2NzaSglbGQpOiBmd19zdGF0ZT0leCBjdXJyIHRpbWU9JWx4LlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubywgc3RhdGVbMF0sIGppZmZpZXMpKTsKKwkJcWxfZGJnKHFsX2RiZ190YXNrbSwgdmhhLCAweDgwMzksCisJCSAgICAiZndfc3RhdGU9JXggY3VyciB0aW1lPSVseC5cbiIsIHN0YXRlWzBdLCBqaWZmaWVzKTsKIAl9IHdoaWxlICgxKTsKIAotCURFQlVHKHByaW50aygic2NzaSglbGQpOiBmd19zdGF0ZT0leCAoJXgsICV4LCAleCwgJXgpIGN1cnIgdGltZT0lbHguXG4iLAotCSAgICB2aGEtPmhvc3Rfbm8sIHN0YXRlWzBdLCBzdGF0ZVsxXSwgc3RhdGVbMl0sIHN0YXRlWzNdLCBzdGF0ZVs0XSwKLQkgICAgamlmZmllcykpOworCXFsX2RiZyhxbF9kYmdfdGFza20sIHZoYSwgMHg4MDNhLAorCSAgICAiZndfc3RhdGU9JXggKCV4LCAleCwgJXgsICV4KSAiICJjdXJyIHRpbWU9JWx4LlxuIiwgc3RhdGVbMF0sCisJICAgIHN0YXRlWzFdLCBzdGF0ZVsyXSwgc3RhdGVbM10sIHN0YXRlWzRdLCBqaWZmaWVzKTsKIAogCWlmIChydmFsKSB7Ci0JCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBGaXJtd2FyZSByZWFkeSAqKioqIEZBSUxFRCAqKioqLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubykpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg4MDNiLAorCQkgICAgIkZpcm13YXJlIHJlYWR5ICoqKiogRkFJTEVEICoqKiouXG4iKTsKIAl9CiAKIAlyZXR1cm4gKHJ2YWwpOwpAQCAtMjAzNCwxOSArMjAyNiwxOSBAQAogCQlpZiAoTE9PUF9UUkFOU0lUSU9OKHZoYSkgfHwgYXRvbWljX3JlYWQoJmhhLT5sb29wX2Rvd25fdGltZXIpIHx8CiAJCSAgICBJU19RTEE4WFhYX1RZUEUoaGEpIHx8CiAJCSAgICAocnZhbCA9PSBRTEFfQ09NTUFORF9FUlJPUiAmJiBsb29wX2lkID09IDB4NykpIHsKLQkJCURFQlVHMihwcmludGsoIiVzKCVsZCkgTG9vcCBpcyBpbiBhIHRyYW5zaXRpb24gc3RhdGVcbiIsCi0JCQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAwOCwKKwkJCSAgICAiTG9vcCBpcyBpbiBhIHRyYW5zaXRpb24gc3RhdGUuXG4iKTsKIAkJfSBlbHNlIHsKLQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSAgICAiRVJST1IgLS0gVW5hYmxlIHRvIGdldCBob3N0IGxvb3AgSUQuXG4iKTsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDIwMDksCisJCQkgICAgIlVuYWJsZSB0byBnZXQgaG9zdCBsb29wIElELlxuIik7CiAJCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CiAJCX0KIAkJcmV0dXJuIChydmFsKTsKIAl9CiAKIAlpZiAodG9wbyA9PSA0KSB7Ci0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCSJDYW5ub3QgZ2V0IHRvcG9sb2d5IC0gcmV0cnlpbmcuXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4MjAwYSwKKwkJICAgICJDYW5ub3QgZ2V0IHRvcG9sb2d5IC0gcmV0cnlpbmcuXG4iKTsKIAkJcmV0dXJuIChRTEFfRlVOQ1RJT05fRkFJTEVEKTsKIAl9CiAKQEAgLTIwNTksMzEgKzIwNTEsMjcgQEAKIAogCXN3aXRjaCAodG9wbykgewogCWNhc2UgMDoKLQkJREVCVUczKHByaW50aygic2NzaSglbGQpOiBIQkEgaW4gTkwgdG9wb2xvZ3kuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMGIsICJIQkEgaW4gTkwgdG9wb2xvZ3kuXG4iKTsKIAkJaGEtPmN1cnJlbnRfdG9wb2xvZ3kgPSBJU1BfQ0ZHX05MOwogCQlzdHJjcHkoY29ubmVjdF90eXBlLCAiKExvb3ApIik7CiAJCWJyZWFrOwogCiAJY2FzZSAxOgotCQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IEhCQSBpbiBGTCB0b3BvbG9neS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAwYywgIkhCQSBpbiBGTCB0b3BvbG9neS5cbiIpOwogCQloYS0+c3dpdGNoX2NhcCA9IHN3X2NhcDsKIAkJaGEtPmN1cnJlbnRfdG9wb2xvZ3kgPSBJU1BfQ0ZHX0ZMOwogCQlzdHJjcHkoY29ubmVjdF90eXBlLCAiKEZMX1BvcnQpIik7CiAJCWJyZWFrOwogCiAJY2FzZSAyOgotCQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IEhCQSBpbiBOIFAyUCB0b3BvbG9neS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAwZCwgIkhCQSBpbiBOIFAyUCB0b3BvbG9neS5cbiIpOwogCQloYS0+b3BlcmF0aW5nX21vZGUgPSBQMlA7CiAJCWhhLT5jdXJyZW50X3RvcG9sb2d5ID0gSVNQX0NGR19OOwogCQlzdHJjcHkoY29ubmVjdF90eXBlLCAiKE5fUG9ydC10by1OX1BvcnQpIik7CiAJCWJyZWFrOwogCiAJY2FzZSAzOgotCQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IEhCQSBpbiBGIFAyUCB0b3BvbG9neS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAwZSwgIkhCQSBpbiBGIFAyUCB0b3BvbG9neS5cbiIpOwogCQloYS0+c3dpdGNoX2NhcCA9IHN3X2NhcDsKIAkJaGEtPm9wZXJhdGluZ19tb2RlID0gUDJQOwogCQloYS0+Y3VycmVudF90b3BvbG9neSA9IElTUF9DRkdfRjsKQEAgLTIwOTEsOSArMjA3OSw4IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJREVCVUczKHByaW50aygic2NzaSglbGQpOiBIQkEgaW4gdW5rbm93biB0b3BvbG9neSAleC4gIgotCQkgICAgIlVzaW5nIE5MLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubywgdG9wbykpOworCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDBmLAorCQkgICAgIkhCQSBpbiB1bmtub3duIHRvcG9sb2d5ICV4LCB1c2luZyBOTC5cbiIsIHRvcG8pOwogCQloYS0+Y3VycmVudF90b3BvbG9neSA9IElTUF9DRkdfTkw7CiAJCXN0cmNweShjb25uZWN0X3R5cGUsICIoTG9vcCkiKTsKIAkJYnJlYWs7CkBAIC0yMTA2LDE0ICsyMDkzLDE2IEBACiAJdmhhLT5kX2lkLmIuYWxfcGEgPSBhbF9wYTsKIAogCWlmICghdmhhLT5mbGFncy5pbml0X2RvbmUpCi0gCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCSAgICAiVG9wb2xvZ3kgLSAlcywgSG9zdCBMb29wIGFkZHJlc3MgMHgleFxuIiwKKwkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4MjAxMCwKKwkJICAgICJUb3BvbG9neSAtICVzLCBIb3N0IExvb3AgYWRkcmVzcyAweCV4LlxuIiwKIAkJICAgIGNvbm5lY3RfdHlwZSwgdmhhLT5sb29wX2lkKTsKIAogCWlmIChydmFsKSB7Ci0JCURFQlVHMl8zKHByaW50aygic2NzaSglbGQpOiBGQUlMRUQuXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MjAxMSwKKwkJICAgICIlcyBGQUlMRURcbiIsIF9fZnVuY19fKTsKIAl9IGVsc2UgewotCQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IGV4aXRpbmcgbm9ybWFsbHkuXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAxMiwKKwkJICAgICIlcyBzdWNjZXNzXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJcmV0dXJuKHJ2YWwpOwpAQCAtMjIyNywxOCArMjIxNiwyMiBAQAogCWZvciAoY250ID0gMCwgY2hrc3VtID0gMDsgY250IDwgaGEtPm52cmFtX3NpemU7IGNudCsrKQogCQljaGtzdW0gKz0gKnB0cisrOwogCi0JREVCVUc1KHByaW50aygic2NzaSglbGQpOiBDb250ZW50cyBvZiBOVlJBTVxuIiwgdmhhLT5ob3N0X25vKSk7Ci0JREVCVUc1KHFsYTJ4MDBfZHVtcF9idWZmZXIoKHVpbnQ4X3QgKiludiwgaGEtPm52cmFtX3NpemUpKTsKKwlxbF9kYmcocWxfZGJnX2luaXQgKyBxbF9kYmdfYnVmZmVyLCB2aGEsIDB4MDEwZiwKKwkgICAgIkNvbnRlbnRzIG9mIE5WUkFNLlxuIik7CisJcWxfZHVtcF9idWZmZXIocWxfZGJnX2luaXQgKyBxbF9kYmdfYnVmZmVyLCB2aGEsIDB4MDExMCwKKwkgICAgKHVpbnQ4X3QgKiludiwgaGEtPm52cmFtX3NpemUpOwogCiAJLyogQmFkIE5WUkFNIGRhdGEsIHNldCBkZWZhdWx0cyBwYXJhbWV0ZXJzLiAqLwogCWlmIChjaGtzdW0gfHwgbnYtPmlkWzBdICE9ICdJJyB8fCBudi0+aWRbMV0gIT0gJ1MnIHx8CiAJICAgIG52LT5pZFsyXSAhPSAnUCcgfHwgbnYtPmlkWzNdICE9ICcgJyB8fCBudi0+bnZyYW1fdmVyc2lvbiA8IDEpIHsKIAkJLyogUmVzZXQgTlZSQU0gZGF0YS4gKi8KLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiSW5jb25zaXN0ZW50IE5WUkFNIGRldGVjdGVkOiAiCi0JCSAgICAiY2hlY2tzdW09MHgleCBpZD0lYyB2ZXJzaW9uPTB4JXguXG4iLCBjaGtzdW0sIG52LT5pZFswXSwKLQkJICAgIG52LT5udnJhbV92ZXJzaW9uKTsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiRmFsbGluZyBiYWNrIHRvIGZ1bmN0aW9uaW5nICh5ZXQgIgotCQkgICAgImludmFsaWQgLS0gV1dQTikgZGVmYXVsdHMuXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDA2NCwKKwkJICAgICJJbmNvbmlzaXN0ZW50IE5WUkFNICIKKwkJICAgICJkZXRlY3RlZDogY2hlY2tzdW09MHgleCBpZD0lYyB2ZXJzaW9uPTB4JXguXG4iLAorCQkgICAgY2hrc3VtLCBudi0+aWRbMF0sIG52LT5udnJhbV92ZXJzaW9uKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDA2NSwKKwkJICAgICJGYWxsaW5nIGJhY2sgdG8gIgorCQkgICAgImZ1bmN0aW9uaW5nICh5ZXQgaW52YWxpZCAtLSBXV1BOKSBkZWZhdWx0cy5cbiIpOwogCiAJCS8qCiAJCSAqIFNldCBkZWZhdWx0IGluaXRpYWxpemF0aW9uIGNvbnRyb2wgYmxvY2suCkBAIC0yMzgyLDggKzIzNzUsMTMgQEAKIAkvKgogCSAqIFNldCBob3N0IGFkYXB0ZXIgcGFyYW1ldGVycy4KIAkgKi8KKworCS8qCisJICogQklUXzcgaW4gdGhlIGhvc3QtcGFyYW1ldGVycyBzZWN0aW9uIGFsbG93cyBmb3IgbW9kaWZpY2F0aW9uIHRvCisJICogaW50ZXJuYWwgZHJpdmVyIGxvZ2dpbmcuCisJICovCiAJaWYgKG52LT5ob3N0X3BbMF0gJiBCSVRfNykKLQkJcWwyeGV4dGVuZGVkX2Vycm9yX2xvZ2dpbmcgPSAxOworCQlxbDJ4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZyA9IDB4N2ZmZmZmZmY7CiAJaGEtPmZsYWdzLmRpc2FibGVfcmlzY19jb2RlX2xvYWQgPSAoKG52LT5ob3N0X3BbMF0gJiBCSVRfNCkgPyAxIDogMCk7CiAJLyogQWx3YXlzIGxvYWQgUklTQyBjb2RlIG9uIG5vbiBJU1AyWzEyXTAwIGNoaXBzLiAqLwogCWlmICghSVNfUUxBMjEwMChoYSkgJiYgIUlTX1FMQTIyMDAoaGEpKQpAQCAtMjQ4OCwxMCArMjQ4Niw3IEBACiAJCWlmIChoYS0+emlvX21vZGUgIT0gUUxBX1pJT19ESVNBQkxFRCkgewogCQkJaGEtPnppb19tb2RlID0gUUxBX1pJT19NT0RFXzY7CiAKLQkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogWklPIG1vZGUgJWQgZW5hYmxlZDsgdGltZXIgIgotCQkJICAgICJkZWxheSAoJWQgdXMpLlxuIiwgdmhhLT5ob3N0X25vLCBoYS0+emlvX21vZGUsCi0JCQkgICAgaGEtPnppb190aW1lciAqIDEwMCkpOwotCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4MDA2OCwKIAkJCSAgICAiWklPIG1vZGUgJWQgZW5hYmxlZDsgdGltZXIgZGVsYXkgKCVkIHVzKS5cbiIsCiAJCQkgICAgaGEtPnppb19tb2RlLCBoYS0+emlvX3RpbWVyICogMTAwKTsKIApAQCAtMjUwMiw4ICsyNDk3LDggQEAKIAl9CiAKIAlpZiAocnZhbCkgewotCQlERUJVRzJfMyhwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAic2NzaSglbGQpOiBOVlJBTSBjb25maWd1cmF0aW9uIGZhaWxlZCFcbiIsIHZoYS0+aG9zdF9ubykpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMDY5LAorCQkgICAgIk5WUkFNIGNvbmZpZ3VyYXRpb24gZmFpbGVkLlxuIik7CiAJfQogCXJldHVybiAocnZhbCk7CiB9CkBAIC0yNTc0LDE1ICsyNTY5LDE1IEBACiAJaWYgKHRlc3RfYml0KExPQ0FMX0xPT1BfVVBEQVRFLCAmdmhhLT5kcGNfZmxhZ3MpKSB7CiAJCXJ2YWwgPSBxbGEyeDAwX2NvbmZpZ3VyZV9oYmEodmhhKTsKIAkJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBVbmFibGUgdG8gY29uZmlndXJlIEhCQS5cbiIsCi0JCQkgICAgdmhhLT5ob3N0X25vKSk7CisJCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDEzLAorCQkJICAgICJVbmFibGUgdG8gY29uZmlndXJlIEhCQS5cbiIpOwogCQkJcmV0dXJuIChydmFsKTsKIAkJfQogCX0KIAogCXNhdmVfZmxhZ3MgPSBmbGFncyA9IHZoYS0+ZHBjX2ZsYWdzOwotCURFQlVHKHByaW50aygic2NzaSglbGQpOiBDb25maWd1cmUgbG9vcCAtLSBkcGMgZmxhZ3MgPTB4JWx4XG4iLAotCSAgICB2aGEtPmhvc3Rfbm8sIGZsYWdzKSk7CisJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAxNCwKKwkgICAgIkNvbmZpZ3VyZSBsb29wIC0tIGRwYyBmbGFncyA9IDB4JWx4LlxuIiwgZmxhZ3MpOwogCiAJLyoKIAkgKiBJZiB3ZSBoYXZlIGJvdGggYW4gUlNDTiBhbmQgUE9SVCBVUERBVEUgcGVuZGluZyB0aGVuIGhhbmRsZSB0aGVtCkBAIC0yNjE5LDE1ICsyNjE0LDIxIEBACiAJfQogCiAJaWYgKHRlc3RfYml0KExPQ0FMX0xPT1BfVVBEQVRFLCAmZmxhZ3MpKSB7Ci0JCWlmICh0ZXN0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZ2aGEtPmRwY19mbGFncykpCisJCWlmICh0ZXN0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZ2aGEtPmRwY19mbGFncykpIHsKKwkJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMTUsCisJCQkgICAgIkxvb3AgcmVzeW5jIG5lZWRlZCwgZmFpbGluZy5cbiIpOwogCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJCX0KIAkJZWxzZQogCQkJcnZhbCA9IHFsYTJ4MDBfY29uZmlndXJlX2xvY2FsX2xvb3AodmhhKTsKIAl9CiAKIAlpZiAocnZhbCA9PSBRTEFfU1VDQ0VTUyAmJiB0ZXN0X2JpdChSU0NOX1VQREFURSwgJmZsYWdzKSkgewotCQlpZiAoTE9PUF9UUkFOU0lUSU9OKHZoYSkpCisJCWlmIChMT09QX1RSQU5TSVRJT04odmhhKSkgeworCQkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAxZSwKKwkJCSAgICAiTmVlZHMgUlNDTiB1cGRhdGUgYW5kIGxvb3AgdHJhbnNpdGlvbi5cbiIpOwogCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJCX0KIAkJZWxzZQogCQkJcnZhbCA9IHFsYTJ4MDBfY29uZmlndXJlX2ZhYnJpYyh2aGEpOwogCX0KQEAgLTI2MzgsMTYgKzI2MzksMTcgQEAKIAkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCQl9IGVsc2UgewogCQkJYXRvbWljX3NldCgmdmhhLT5sb29wX3N0YXRlLCBMT09QX1JFQURZKTsKLQotCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IExPT1AgUkVBRFlcbiIsIHZoYS0+aG9zdF9ubykpOworCQkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA2OSwKKwkJCSAgICAiTE9PUCBSRUFEWS5cbiIpOwogCQl9CiAJfQogCiAJaWYgKHJ2YWwpIHsKLQkJREVCVUcyXzMocHJpbnRrKCIlcyglbGQpOiAqKiogRkFJTEVEICoqKlxuIiwKLQkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA2YSwKKwkJICAgICIlcyAqKiogRkFJTEVEICoqKi5cbiIsIF9fZnVuY19fKTsKIAl9IGVsc2UgewotCQlERUJVRzMocHJpbnRrKCIlczogZXhpdGluZyBub3JtYWxseVxuIiwgX19mdW5jX18pKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA2YiwKKwkJICAgICIlczogZXhpdGluZyBub3JtYWxseS5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAkvKiBSZXN0b3JlIHN0YXRlIGlmIGEgcmVzeW5jIGV2ZW50IG9jY3VycmVkIGR1cmluZyBwcm9jZXNzaW5nICovCkBAIC0yNjk1LDggKzI2OTcsMTAgQEAKIAluZXdfZmNwb3J0ID0gTlVMTDsKIAllbnRyaWVzID0gTUFYX0ZJQlJFX0RFVklDRVM7CiAKLQlERUJVRzMocHJpbnRrKCJzY3NpKCVsZCk6IEdldHRpbmcgRkNBTCBwb3NpdGlvbiBtYXBcbiIsIHZoYS0+aG9zdF9ubykpOwotCURFQlVHMyhxbGEyeDAwX2dldF9mY2FsX3Bvc2l0aW9uX21hcCh2aGEsIE5VTEwpKTsKKwlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDE2LAorCSAgICAiR2V0dGluZyBGQ0FMIHBvc2l0aW9uIG1hcC5cbiIpOworCWlmIChxbDJ4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZyAmIHFsX2RiZ19kaXNjKQorCQlxbGEyeDAwX2dldF9mY2FsX3Bvc2l0aW9uX21hcCh2aGEsIE5VTEwpOwogCiAJLyogR2V0IGxpc3Qgb2YgbG9nZ2VkIGluIGRldmljZXMuICovCiAJbWVtc2V0KGhhLT5naWRfbGlzdCwgMCwgR0lEX0xJU1RfU0laRSk7CkBAIC0yNzA1LDE0ICsyNzA5LDE3IEBACiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpCiAJCWdvdG8gY2xlYW51cF9hbGxvY2F0aW9uOwogCi0JREVCVUczKHByaW50aygic2NzaSglbGQpOiBFbnRyaWVzIGluIElEIGxpc3QgKCVkKVxuIiwKLQkgICAgdmhhLT5ob3N0X25vLCBlbnRyaWVzKSk7Ci0JREVCVUczKHFsYTJ4MDBfZHVtcF9idWZmZXIoKHVpbnQ4X3QgKiloYS0+Z2lkX2xpc3QsCi0JICAgIGVudHJpZXMgKiBzaXplb2Yoc3RydWN0IGdpZF9saXN0X2luZm8pKSk7CisJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAxNywKKwkgICAgIkVudHJpZXMgaW4gSUQgbGlzdCAoJWQpLlxuIiwgZW50cmllcyk7CisJcWxfZHVtcF9idWZmZXIocWxfZGJnX2Rpc2MgKyBxbF9kYmdfYnVmZmVyLCB2aGEsIDB4MjA3NSwKKwkgICAgKHVpbnQ4X3QgKiloYS0+Z2lkX2xpc3QsCisJICAgIGVudHJpZXMgKiBzaXplb2Yoc3RydWN0IGdpZF9saXN0X2luZm8pKTsKIAogCS8qIEFsbG9jYXRlIHRlbXBvcmFyeSBmY3BvcnQgZm9yIGFueSBuZXcgZmNwb3J0cyBkaXNjb3ZlcmVkLiAqLwogCW5ld19mY3BvcnQgPSBxbGEyeDAwX2FsbG9jX2ZjcG9ydCh2aGEsIEdGUF9LRVJORUwpOwogCWlmIChuZXdfZmNwb3J0ID09IE5VTEwpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MjAxOCwKKwkJICAgICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgZm9yIGZjcG9ydC5cbiIpOwogCQlydmFsID0gUUxBX01FTU9SWV9BTExPQ19GQUlMRUQ7CiAJCWdvdG8gY2xlYW51cF9hbGxvY2F0aW9uOwogCX0KQEAgLTI3MjYsOSArMjczMyw5IEBACiAJCSAgICBmY3BvcnQtPnBvcnRfdHlwZSAhPSBGQ1RfQlJPQURDQVNUICYmCiAJCSAgICAoZmNwb3J0LT5mbGFncyAmIEZDRl9GQUJSSUNfREVWSUNFKSA9PSAwKSB7CiAKLQkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBNYXJraW5nIHBvcnQgbG9zdCwgIgotCQkJICAgICJsb29wX2lkPTB4JTA0eFxuIiwKLQkJCSAgICB2aGEtPmhvc3Rfbm8sIGZjcG9ydC0+bG9vcF9pZCkpOworCQkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAxOSwKKwkJCSAgICAiTWFya2luZyBwb3J0IGxvc3QgbG9vcF9pZD0weCUwNHguXG4iLAorCQkJICAgIGZjcG9ydC0+bG9vcF9pZCk7CiAKIAkJCXFsYTJ4MDBfc2V0X2ZjcG9ydF9zdGF0ZShmY3BvcnQsIEZDU19ERVZJQ0VfTE9TVCk7CiAJCX0KQEAgLTI3NjksMTIgKzI3NzYsMTIgQEAKIAkJbmV3X2ZjcG9ydC0+dnBfaWR4ID0gdmhhLT52cF9pZHg7CiAJCXJ2YWwyID0gcWxhMngwMF9nZXRfcG9ydF9kYXRhYmFzZSh2aGEsIG5ld19mY3BvcnQsIDApOwogCQlpZiAocnZhbDIgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogRmFpbGVkIHRvIHJldHJpZXZlIGZjcG9ydCAiCi0JCQkgICAgImluZm9ybWF0aW9uIC0tIGdldF9wb3J0X2RhdGFiYXNlPSV4LCAiCi0JCQkgICAgImxvb3BfaWQ9MHglMDR4XG4iLAotCQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbDIsIG5ld19mY3BvcnQtPmxvb3BfaWQpKTsKLQkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogU2NoZWR1bGluZyByZXN5bmMuLi5cbiIsCi0JCQkgICAgdmhhLT5ob3N0X25vKSk7CisJCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDFhLAorCQkJICAgICJGYWlsZWQgdG8gcmV0cmlldmUgZmNwb3J0IGluZm9ybWF0aW9uICIKKwkJCSAgICAiLS0gZ2V0X3BvcnRfZGF0YWJhc2U9JXgsIGxvb3BfaWQ9MHglMDR4LlxuIiwKKwkJCSAgICBydmFsMiwgbmV3X2ZjcG9ydC0+bG9vcF9pZCk7CisJCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDFiLAorCQkJICAgICJTY2hlZHVsaW5nIHJlc3luYy5cbiIpOwogCQkJc2V0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CiAJCQljb250aW51ZTsKIAkJfQpAQCAtMjgxMCw2ICsyODE3LDggQEAKIAkJCWZjcG9ydCA9IG5ld19mY3BvcnQ7CiAJCQluZXdfZmNwb3J0ID0gcWxhMngwMF9hbGxvY19mY3BvcnQodmhhLCBHRlBfS0VSTkVMKTsKIAkJCWlmIChuZXdfZmNwb3J0ID09IE5VTEwpIHsKKwkJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgyMDFjLAorCQkJCSAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZmNwb3J0LlxuIik7CiAJCQkJcnZhbCA9IFFMQV9NRU1PUllfQUxMT0NfRkFJTEVEOwogCQkJCWdvdG8gY2xlYW51cF9hbGxvY2F0aW9uOwogCQkJfQpAQCAtMjgyOCw4ICsyODM3LDggQEAKIAlrZnJlZShuZXdfZmNwb3J0KTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMihwcmludGsoInNjc2koJWxkKTogQ29uZmlndXJlIGxvY2FsIGxvb3AgZXJyb3IgZXhpdDogIgotCQkgICAgInJ2YWw9JXhcbiIsIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDFkLAorCQkgICAgIkNvbmZpZ3VyZSBsb2NhbCBsb29wIGVycm9yIGV4aXQ6IHJ2YWw9JXguXG4iLCBydmFsKTsKIAl9CiAKIAlyZXR1cm4gKHJ2YWwpOwpAQCAtMjg1OCwyNyArMjg2NywyNyBAQAogCXJ2YWwgPSBxbGEyeDAwX3NldF9pZG1hX3NwZWVkKHZoYSwgZmNwb3J0LT5sb29wX2lkLCBmY3BvcnQtPmZwX3NwZWVkLAogCSAgICBtYik7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBVbmFibGUgdG8gYWRqdXN0IGlJRE1BICIKLQkJICAgICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAtLSAlMDR4ICV4ICUwNHggJTA0eC5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sIGZjcG9ydC0+cG9ydF9uYW1lWzBdLCBmY3BvcnQtPnBvcnRfbmFtZVsxXSwKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAwNCwKKwkJICAgICJVbmFibGUgdG8gYWRqdXN0IGlJRE1BICIKKwkJICAgICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCAtLSAlMDR4ICV4ICUwNHggIgorCQkgICAgIiUwNHguXG4iLCBmY3BvcnQtPnBvcnRfbmFtZVswXSwgZmNwb3J0LT5wb3J0X25hbWVbMV0sCiAJCSAgICBmY3BvcnQtPnBvcnRfbmFtZVsyXSwgZmNwb3J0LT5wb3J0X25hbWVbM10sCiAJCSAgICBmY3BvcnQtPnBvcnRfbmFtZVs0XSwgZmNwb3J0LT5wb3J0X25hbWVbNV0sCiAJCSAgICBmY3BvcnQtPnBvcnRfbmFtZVs2XSwgZmNwb3J0LT5wb3J0X25hbWVbN10sIHJ2YWwsCi0JCSAgICBmY3BvcnQtPmZwX3NwZWVkLCBtYlswXSwgbWJbMV0pKTsKKwkJICAgIGZjcG9ydC0+ZnBfc3BlZWQsIG1iWzBdLCBtYlsxXSk7CiAJfSBlbHNlIHsKIAkJbGlua19zcGVlZCA9IGxpbmtfc3BlZWRzW0xTX1VOS05PV05dOwogCQlpZiAoZmNwb3J0LT5mcF9zcGVlZCA8IDUpCiAJCQlsaW5rX3NwZWVkID0gbGlua19zcGVlZHNbZmNwb3J0LT5mcF9zcGVlZF07CiAJCWVsc2UgaWYgKGZjcG9ydC0+ZnBfc3BlZWQgPT0gMHgxMykKIAkJCWxpbmtfc3BlZWQgPSBsaW5rX3NwZWVkc1s1XTsKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJICAgICJpSURNQSBhZGp1c3RlZCB0byAlcyBHQi9zIG9uICIKLQkJICAgICIlMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeC5cbiIsCi0JCSAgICBsaW5rX3NwZWVkLCBmY3BvcnQtPnBvcnRfbmFtZVswXSwKLQkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzFdLCBmY3BvcnQtPnBvcnRfbmFtZVsyXSwKLQkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzNdLCBmY3BvcnQtPnBvcnRfbmFtZVs0XSwKLQkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzVdLCBmY3BvcnQtPnBvcnRfbmFtZVs2XSwKLQkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzddKSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMDUsCisJCSAgICAiaUlETUEgYWRqdXN0ZWQgdG8gJXMgR0IvcyAiCisJCSAgICAib24gJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnguXG4iLCBsaW5rX3NwZWVkLAorCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbMF0sIGZjcG9ydC0+cG9ydF9uYW1lWzFdLAorCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbMl0sIGZjcG9ydC0+cG9ydF9uYW1lWzNdLAorCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbNF0sIGZjcG9ydC0+cG9ydF9uYW1lWzVdLAorCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbNl0sIGZjcG9ydC0+cG9ydF9uYW1lWzddKTsKIAl9CiB9CiAKQEAgLTI4ODcsNyArMjg5Niw2IEBACiB7CiAJc3RydWN0IGZjX3Jwb3J0X2lkZW50aWZpZXJzIHJwb3J0X2lkczsKIAlzdHJ1Y3QgZmNfcnBvcnQgKnJwb3J0OwotCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlxbGEyeDAwX3Jwb3J0X2RlbChmY3BvcnQpOwpAQCAtMjg5OSw4ICsyOTA3LDggQEAKIAlycG9ydF9pZHMucm9sZXMgPSBGQ19SUE9SVF9ST0xFX1VOS05PV047CiAJZmNwb3J0LT5ycG9ydCA9IHJwb3J0ID0gZmNfcmVtb3RlX3BvcnRfYWRkKHZoYS0+aG9zdCwgMCwgJnJwb3J0X2lkcyk7CiAJaWYgKCFycG9ydCkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIGZjIHJlbW90ZSBwb3J0IVxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDIwMDYsCisJCSAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIGZjIHJlbW90ZSBwb3J0LlxuIik7CiAJCXJldHVybjsKIAl9CiAJc3Bpbl9sb2NrX2lycXNhdmUoZmNwb3J0LT52aGEtPmhvc3QtPmhvc3RfbG9jaywgZmxhZ3MpOwpAQCAtMjk3NSw4ICsyOTgzLDggQEAKIAkJbG9vcF9pZCA9IFNOU19GTF9QT1JUOwogCXJ2YWwgPSBxbGEyeDAwX2dldF9wb3J0X25hbWUodmhhLCBsb29wX2lkLCB2aGEtPmZhYnJpY19ub2RlX25hbWUsIDEpOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMihwcmludGsoInNjc2koJWxkKTogTUJDX0dFVF9QT1JUX05BTUUgRmFpbGVkLCBObyBGTCAiCi0JCSAgICAiUG9ydFxuIiwgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMWYsCisJCSAgICAiTUJYX0dFVF9QT1JUX05BTUUgZmFpbGVkLCBObyBGTCBQb3J0LlxuIik7CiAKIAkJdmhhLT5kZXZpY2VfZmxhZ3MgJj0gflNXSVRDSF9GT1VORDsKIAkJcmV0dXJuIChRTEFfU1VDQ0VTUyk7CkBAIC0zMDAzLDMyICszMDExLDMyIEBACiAJCWhhLT5pc3Bfb3BzLT5mYWJyaWNfbG9naW4odmhhLCBsb29wX2lkLCAweGZmLCAweGZmLAogCQkgICAgMHhmYywgbWIsIEJJVF8xIHwgQklUXzApOwogCQlpZiAobWJbMF0gIT0gTUJTX0NPTU1BTkRfQ09NUExFVEUpIHsKLQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkgICAgIkZhaWxlZCBTTlMgbG9naW46IGxvb3BfaWQ9JXggbWJbMF09JXggbWJbMV09JXggIgotCQkJICAgICJtYlsyXT0leCBtYls2XT0leCBtYls3XT0leFxuIiwgbG9vcF9pZCwKLQkJCSAgICBtYlswXSwgbWJbMV0sIG1iWzJdLCBtYls2XSwgbWJbN10pKTsKKwkJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNDIsCisJCQkgICAgIkZhaWxlZCBTTlMgbG9naW46IGxvb3BfaWQ9JXggbWJbMF09JXggbWJbMV09JXggbWJbMl09JXggIgorCQkJICAgICJtYls2XT0leCBtYls3XT0leC5cbiIsIGxvb3BfaWQsIG1iWzBdLCBtYlsxXSwKKwkJCSAgICBtYlsyXSwgbWJbNl0sIG1iWzddKTsKIAkJCXJldHVybiAoUUxBX1NVQ0NFU1MpOwogCQl9CiAKIAkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSRUdJU1RFUl9GQzRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpKSB7CiAJCQlpZiAocWxhMngwMF9yZnRfaWQodmhhKSkgewogCQkJCS8qIEVNUFRZICovCi0JCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBSZWdpc3RlciBGQy00ICIKLQkJCQkgICAgIlRZUEUgZmFpbGVkLlxuIiwgdmhhLT5ob3N0X25vKSk7CisJCQkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA0NSwKKwkJCQkgICAgIlJlZ2lzdGVyIEZDLTQgVFlQRSBmYWlsZWQuXG4iKTsKIAkJCX0KIAkJCWlmIChxbGEyeDAwX3JmZl9pZCh2aGEpKSB7CiAJCQkJLyogRU1QVFkgKi8KLQkJCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFJlZ2lzdGVyIEZDLTQgIgotCQkJCSAgICAiRmVhdHVyZXMgZmFpbGVkLlxuIiwgdmhhLT5ob3N0X25vKSk7CisJCQkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA0OSwKKwkJCQkgICAgIlJlZ2lzdGVyIEZDLTQgRmVhdHVyZXMgZmFpbGVkLlxuIik7CiAJCQl9CiAJCQlpZiAocWxhMngwMF9ybm5faWQodmhhKSkgewogCQkJCS8qIEVNUFRZICovCi0JCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBSZWdpc3RlciBOb2RlIE5hbWUgIgotCQkJCSAgICAiZmFpbGVkLlxuIiwgdmhhLT5ob3N0X25vKSk7CisJCQkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA0ZiwKKwkJCQkgICAgIlJlZ2lzdGVyIE5vZGUgTmFtZSBmYWlsZWQuXG4iKTsKIAkJCX0gZWxzZSBpZiAocWxhMngwMF9yc25uX25uKHZoYSkpIHsKIAkJCQkvKiBFTVBUWSAqLwotCQkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogUmVnaXN0ZXIgU3ltYm9saWMgIgotCQkJCSAgICAiTm9kZSBOYW1lIGZhaWxlZC5cbiIsIHZoYS0+aG9zdF9ubykpOworCQkJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwNTMsCisJCQkJICAgICJSZWdpc3RlciBTeW1vYmlsaWMgTm9kZSBOYW1lIGZhaWxlZC5cbiIpOwogCQkJfQogCQl9CiAKQEAgLTMxMzIsOCArMzE0MCw4IEBACiAJfQogCiAJaWYgKHJ2YWwpIHsKLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBDb25maWd1cmUgZmFicmljIGVycm9yIGV4aXQ6ICIKLQkJICAgICJydmFsPSVkXG4iLCB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA2OCwKKwkJICAgICJDb25maWd1cmUgZmFicmljIGVycm9yIGV4aXQgcnZhbD0lZC5cbiIsIHJ2YWwpOwogCX0KIAogCXJldHVybiAocnZhbCk7CkBAIC0zMTc1LDggKzMxODMsOCBAQAogCXN3bCA9IGtjYWxsb2MoTUFYX0ZJQlJFX0RFVklDRVMsIHNpemVvZihzd19pbmZvX3QpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXN3bCkgewogCQkvKkVNUFRZKi8KLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBHSURfUFQgYWxsb2NhdGlvbnMgZmFpbGVkLCBmYWxsYmFjayAiCi0JCSAgICAib24gR0FfTlhUXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjA1NCwKKwkJICAgICJHSURfUFQgYWxsb2NhdGlvbnMgZmFpbGVkLCBmYWxsYmFjayBvbiBHQV9OWFQuXG4iKTsKIAl9IGVsc2UgewogCQlpZiAocWxhMngwMF9naWRfcHQodmhhLCBzd2wpICE9IFFMQV9TVUNDRVNTKSB7CiAJCQlrZnJlZShzd2wpOwpAQCAtMzIwMSw2ICszMjA5LDggQEAKIAkvKiBBbGxvY2F0ZSB0ZW1wb3JhcnkgZmNwb3J0IGZvciBhbnkgbmV3IGZjcG9ydHMgZGlzY292ZXJlZC4gKi8KIAluZXdfZmNwb3J0ID0gcWxhMngwMF9hbGxvY19mY3BvcnQodmhhLCBHRlBfS0VSTkVMKTsKIAlpZiAobmV3X2ZjcG9ydCA9PSBOVUxMKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDIwNWUsCisJCSAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZmNwb3J0LlxuIik7CiAJCWtmcmVlKHN3bCk7CiAJCXJldHVybiAoUUxBX01FTU9SWV9BTExPQ19GQUlMRUQpOwogCX0KQEAgLTMyNDcsOSArMzI1Nyw5IEBACiAJCQkvKiBTZW5kIEdBX05YVCB0byB0aGUgc3dpdGNoICovCiAJCQlydmFsID0gcWxhMngwMF9nYV9ueHQodmhhLCBuZXdfZmNwb3J0KTsKIAkJCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJCSAgICAiU05TIHNjYW4gZmFpbGVkIC0tIGFzc3VtaW5nIHplcm8tZW50cnkgIgotCQkJCSAgICAicmVzdWx0Li4uXG4iKTsKKwkJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgyMDY0LAorCQkJCSAgICAiU05TIHNjYW4gZmFpbGVkIC0tIGFzc3VtaW5nICIKKwkJCQkgICAgInplcm8tZW50cnkgcmVzdWx0LlxuIik7CiAJCQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZjcG9ydCwgZmNwdGVtcCwKIAkJCQkgICAgbmV3X2ZjcG9ydHMsIGxpc3QpIHsKIAkJCQkJbGlzdF9kZWwoJmZjcG9ydC0+bGlzdCk7CkBAIC0zMjY1LDkgKzMyNzUsMTEgQEAKIAkJCXdyYXAuYjI0ID0gbmV3X2ZjcG9ydC0+ZF9pZC5iMjQ7CiAJCQlmaXJzdF9kZXYgPSAwOwogCQl9IGVsc2UgaWYgKG5ld19mY3BvcnQtPmRfaWQuYjI0ID09IHdyYXAuYjI0KSB7Ci0JCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IGRldmljZSB3cmFwICglMDJ4JTAyeCUwMngpXG4iLAotCQkJICAgIHZoYS0+aG9zdF9ubywgbmV3X2ZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwKLQkJCSAgICBuZXdfZmNwb3J0LT5kX2lkLmIuYXJlYSwgbmV3X2ZjcG9ydC0+ZF9pZC5iLmFsX3BhKSk7CisJCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDY1LAorCQkJICAgICJEZXZpY2Ugd3JhcCAoJTAyeCUwMnglMDJ4KS5cbiIsCisJCQkgICAgbmV3X2ZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwKKwkJCSAgICBuZXdfZmNwb3J0LT5kX2lkLmIuYXJlYSwKKwkJCSAgICBuZXdfZmNwb3J0LT5kX2lkLmIuYWxfcGEpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMzM3Miw2ICszMzg0LDggQEAKIAkJbnh0X2RfaWQuYjI0ID0gbmV3X2ZjcG9ydC0+ZF9pZC5iMjQ7CiAJCW5ld19mY3BvcnQgPSBxbGEyeDAwX2FsbG9jX2ZjcG9ydCh2aGEsIEdGUF9LRVJORUwpOwogCQlpZiAobmV3X2ZjcG9ydCA9PSBOVUxMKSB7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgyMDY2LAorCQkJICAgICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgZm9yIGZjcG9ydC5cbiIpOwogCQkJa2ZyZWUoc3dsKTsKIAkJCXJldHVybiAoUUxBX01FTU9SWV9BTExPQ19GQUlMRUQpOwogCQl9CkBAIC0zNTAxLDEwICszNTE1LDEwIEBACiAJCWRfaWQuYi5hcmVhID0gTVNCKExTVyhyc2NuX2VudHJ5KSk7CiAJCWRfaWQuYi5hbF9wYSA9IExTQihMU1cocnNjbl9lbnRyeSkpOwogCi0JCURFQlVHKHByaW50aygic2NzaSglbGQpOiBSU0NOIHF1ZXVlIGVudHJ5WyVkXSA9ICIKLQkJICAgICJbJTAyeC8lMDJ4JTAyeCUwMnhdLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubywgdmhhLT5yc2NuX291dF9wdHIsIGZvcm1hdCwgZF9pZC5iLmRvbWFpbiwKLQkJICAgIGRfaWQuYi5hcmVhLCBkX2lkLmIuYWxfcGEpKTsKKwkJcWxfZGJnKHFsX2RiZ19kaXNjLCB2aGEsIDB4MjAyMCwKKwkJICAgICJSU0NOIHF1ZXVlIGVudHJ5WyVkXSA9IFslMDJ4LyUwMnglMDJ4JTAyeF0uXG4iLAorCQkgICAgdmhhLT5yc2NuX291dF9wdHIsIGZvcm1hdCwgZF9pZC5iLmRvbWFpbiwgZF9pZC5iLmFyZWEsCisJCSAgICBkX2lkLmIuYWxfcGEpOwogCiAJCXZoYS0+cnNjbl9vdXRfcHRyKys7CiAJCWlmICh2aGEtPnJzY25fb3V0X3B0ciA9PSBNQVhfUlNDTl9DT1VOVCkKQEAgLTM1MjAsMTcgKzM1MzQsMTcgQEAKIAkJCWlmIChyc2NuX2VudHJ5ICE9IHZoYS0+cnNjbl9xdWV1ZVtyc2NuX291dF9pdGVyXSkKIAkJCQlicmVhazsKIAotCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IFNraXBwaW5nIGR1cGxpY2F0ZSBSU0NOIHF1ZXVlICIKLQkJCSAgICAiZW50cnkgZm91bmQgYXQgWyVkXS5cbiIsIHZoYS0+aG9zdF9ubywKLQkJCSAgICByc2NuX291dF9pdGVyKSk7CisJCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDIxLAorCQkJICAgICJTa2lwcGluZyBkdXBsaWNhdGUgUlNDTiBxdWV1ZSBlbnRyeSBmb3VuZCBhdCAiCisJCQkgICAgIlslZF0uXG4iLCByc2NuX291dF9pdGVyKTsKIAogCQkJdmhhLT5yc2NuX291dF9wdHIgPSByc2NuX291dF9pdGVyOwogCQl9CiAKIAkJLyogUXVldWUgb3ZlcmZsb3csIHNldCBzd2l0Y2ggZGVmYXVsdCBjYXNlLiAqLwogCQlpZiAodmhhLT5mbGFncy5yc2NuX3F1ZXVlX292ZXJmbG93KSB7Ci0JCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogZGV2aWNlX3Jlc3luYzogcnNjbiAiCi0JCQkgICAgIm92ZXJmbG93LlxuIiwgdmhhLT5ob3N0X25vKSk7CisJCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDIyLAorCQkJICAgICJkZXZpY2VfcmVzeW5jOiByc2NuIG92ZXJmbG93LlxuIik7CiAKIAkJCWZvcm1hdCA9IDM7CiAJCQl2aGEtPmZsYWdzLnJzY25fcXVldWVfb3ZlcmZsb3cgPSAwOwpAQCAtMzY1OSwxMCArMzY3MywxMSBAQAogCXRtcF9sb29waWQgPSAwOwogCiAJZm9yICg7OykgewotCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogVHJ5aW5nIEZhYnJpYyBMb2dpbiB3L2xvb3AgaWQgMHglMDR4ICIKLSAJCSAgICAiZm9yIHBvcnQgJTAyeCUwMnglMDJ4LlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubywgZmNwb3J0LT5sb29wX2lkLCBmY3BvcnQtPmRfaWQuYi5kb21haW4sCi0JCSAgICBmY3BvcnQtPmRfaWQuYi5hcmVhLCBmY3BvcnQtPmRfaWQuYi5hbF9wYSkpOworCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDAwLAorCQkgICAgIlRyeWluZyBGYWJyaWMgTG9naW4gdy9sb29wIGlkIDB4JTA0eCBmb3IgcG9ydCAiCisJCSAgICAiJTAyeCUwMnglMDJ4LlxuIiwKKwkJICAgIGZjcG9ydC0+bG9vcF9pZCwgZmNwb3J0LT5kX2lkLmIuZG9tYWluLAorCQkgICAgZmNwb3J0LT5kX2lkLmIuYXJlYSwgZmNwb3J0LT5kX2lkLmIuYWxfcGEpOwogCiAJCS8qIExvZ2luIGZjcG9ydCBvbiBzd2l0Y2guICovCiAJCWhhLT5pc3Bfb3BzLT5mYWJyaWNfbG9naW4odmhhLCBmY3BvcnQtPmxvb3BfaWQsCkBAIC0zNjgwLDEwICszNjk1LDExIEBACiAJCQl0bXBfbG9vcGlkID0gZmNwb3J0LT5sb29wX2lkOwogCQkJZmNwb3J0LT5sb29wX2lkID0gbWJbMV07CiAKLQkJCURFQlVHKHByaW50aygiRmFicmljIExvZ2luOiBwb3J0IGluIHVzZSAtIG5leHQgIgotIAkJCSAgICAibG9vcCBpZD0weCUwNHgsIHBvcnQgSWQ9JTAyeCUwMnglMDJ4LlxuIiwKKwkJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMDEsCisJCQkgICAgIkZhYnJpYyBMb2dpbjogcG9ydCBpbiB1c2UgLSBuZXh0IGxvb3AgIgorCQkJICAgICJpZD0weCUwNHgsIHBvcnQgaWQ9ICUwMnglMDJ4JTAyeC5cbiIsCiAJCQkgICAgZmNwb3J0LT5sb29wX2lkLCBmY3BvcnQtPmRfaWQuYi5kb21haW4sCi0JCQkgICAgZmNwb3J0LT5kX2lkLmIuYXJlYSwgZmNwb3J0LT5kX2lkLmIuYWxfcGEpKTsKKwkJCSAgICBmY3BvcnQtPmRfaWQuYi5hcmVhLCBmY3BvcnQtPmRfaWQuYi5hbF9wYSk7CiAKIAkJfSBlbHNlIGlmIChtYlswXSA9PSBNQlNfQ09NTUFORF9DT01QTEVURSkgewogCQkJLyoKQEAgLTM3NDQsMTEgKzM3NjAsMTEgQEAKIAkJCS8qCiAJCQkgKiB1bnJlY292ZXJhYmxlIC8gbm90IGhhbmRsZWQgZXJyb3IKIAkJCSAqLwotCQkJREVCVUcyKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4IHBvcnRfaWQ9JTAyeCUwMnglMDJ4ICIKLSAJCQkgICAgImxvb3BfaWQ9JXggamlmZmllcz0lbHguXG4iLAotCQkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIG1iWzBdLAotCQkJICAgIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwgZmNwb3J0LT5kX2lkLmIuYXJlYSwKLQkJCSAgICBmY3BvcnQtPmRfaWQuYi5hbF9wYSwgZmNwb3J0LT5sb29wX2lkLCBqaWZmaWVzKSk7CisJCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDAyLAorCQkJICAgICJGYWlsZWQ9JXggcG9ydF9pZD0lMDJ4JTAyeCUwMnggbG9vcF9pZD0leCAiCisJCQkgICAgImppZmZpZXM9JWx4LlxuIiwgbWJbMF0sIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwKKwkJCSAgICBmY3BvcnQtPmRfaWQuYi5hcmVhLCBmY3BvcnQtPmRfaWQuYi5hbF9wYSwKKwkJCSAgICBmY3BvcnQtPmxvb3BfaWQsIGppZmZpZXMpOwogCiAJCQkqbmV4dF9sb29waWQgPSBmY3BvcnQtPmxvb3BfaWQ7CiAJCQloYS0+aXNwX29wcy0+ZmFicmljX2xvZ291dCh2aGEsIGZjcG9ydC0+bG9vcF9pZCwKQEAgLTM4NTIsNyArMzg2OCw4IEBACiAJCXJldHVybiAoUUxBX0ZVTkNUSU9OX0ZBSUxFRCk7CiAKIAlpZiAocnZhbCkKLQkJREVCVUcyXzMocHJpbnRrKCIlcygpOiAqKioqIEZBSUxFRCAqKioqXG4iLCBfX2Z1bmNfXykpOworCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDZjLAorCQkgICAgIiVzICoqKiBGQUlMRUQgKioqLlxuIiwgX19mdW5jX18pOwogCiAJcmV0dXJuIChydmFsKTsKIH0KQEAgLTM5MjksOCArMzk0Niw4IEBACiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAJc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZwOwogCi0JcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJIlBlcmZvcm1pbmcgSVNQIGVycm9yIHJlY292ZXJ5IC0gaGE9ICVwLlxuIiwgaGEpOworCXFsX2RiZyhxbF9kYmdfcDNwLCB2aGEsIDB4YjAwMiwKKwkgICAgIlBlcmZvcm1pbmcgSVNQIGVycm9yIHJlY292ZXJ5IC0gaGE9JXAuXG4iLCBoYSk7CiAKIAlhdG9taWNfc2V0KCZoYS0+bG9vcF9kb3duX3RpbWVyLCBMT09QX0RPV05fVElNRSk7CiAJaWYgKGF0b21pY19yZWFkKCZ2aGEtPmxvb3Bfc3RhdGUpICE9IExPT1BfRE9XTikgewpAQCAtMzk2NCw4ICszOTgxLDggQEAKIAljbGVhcl9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAloYS0+cWxhX3N0YXRzLnRvdGFsX2lzcF9hYm9ydHMrKzsKIAotCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkgICAgIlBlcmZvcm1pbmcgSVNQIGVycm9yIHJlY292ZXJ5IC0gaGE9ICVwLlxuIiwgaGEpOworCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwYWYsCisJICAgICJQZXJmb3JtaW5nIElTUCBlcnJvciByZWNvdmVyeSAtIGhhPSVwLlxuIiwgaGEpOwogCiAJLyogRm9yIElTUDgyWFgsIHJlc2V0X2NoaXAgaXMganVzdCBkaXNhYmxpbmcgaW50ZXJydXB0cy4KIAkgKiBEcml2ZXIgd2FpdHMgZm9yIHRoZSBjb21wbGV0aW9uIG9mIHRoZSBjb21tYW5kcy4KQEAgLTQwMTYsNiArNDAzMyw4IEBACiAJCS8qIE1ha2Ugc3VyZSBmb3IgSVNQIDgyWFggSU8gRE1BIGlzIGNvbXBsZXRlICovCiAJCWlmIChJU19RTEE4MlhYKGhhKSkgewogCQkJcWxhODJ4eF9jaGlwX3Jlc2V0X2NsZWFudXAodmhhKTsKKwkJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwYjQsCisJCQkgICAgIkRvbmUgY2hpcCByZXNldCBjbGVhbnVwLlxuIik7CiAKIAkJCS8qIERvbmUgd2FpdGluZyBmb3IgcGVuZGluZyBjb21tYW5kcy4KIAkJCSAqIFJlc2V0IHRoZSBvbmxpbmUgZmxhZy4KQEAgLTQwOTcsNyArNDExNiw3IEBACiAJCQkJICAgIGhhLT5mY2VfZG1hLCBoYS0+ZmNlX2J1ZnMsIGhhLT5mY2VfbWIsCiAJCQkJICAgICZoYS0+ZmNlX2J1ZnMpOwogCQkJCWlmIChydmFsKSB7Ci0JCQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4ODAzMywKIAkJCQkJICAgICJVbmFibGUgdG8gcmVpbml0aWFsaXplIEZDRSAiCiAJCQkJCSAgICAiKCVkKS5cbiIsIHJ2YWwpOwogCQkJCQloYS0+ZmxhZ3MuZmNlX2VuYWJsZWQgPSAwOwpAQCAtNDEwOSw3ICs0MTI4LDcgQEAKIAkJCQlydmFsID0gcWxhMngwMF9lbmFibGVfZWZ0X3RyYWNlKHZoYSwKIAkJCQkgICAgaGEtPmVmdF9kbWEsIEVGVF9OVU1fQlVGRkVSUyk7CiAJCQkJaWYgKHJ2YWwpIHsKLQkJCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg4MDM0LAogCQkJCQkgICAgIlVuYWJsZSB0byByZWluaXRpYWxpemUgRUZUICIKIAkJCQkJICAgICIoJWQpLlxuIiwgcnZhbCk7CiAJCQkJfQpAQCAtNDExOCw5ICs0MTM3LDkgQEAKIAkJCXZoYS0+ZmxhZ3Mub25saW5lID0gMTsKIAkJCWlmICh0ZXN0X2JpdChJU1BfQUJPUlRfUkVUUlksICZ2aGEtPmRwY19mbGFncykpIHsKIAkJCQlpZiAoaGEtPmlzcF9hYm9ydF9jbnQgPT0gMCkgewotIAkJCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJCQkgICAgIklTUCBlcnJvciByZWNvdmVyeSBmYWlsZWQgLSAiCi0JCQkJCSAgICAiYm9hcmQgZGlzYWJsZWRcbiIpOworCQkJCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4ODAzNSwKKwkJCQkJICAgICJJU1AgZXJyb3IgcmVjb3ZlciBmYWlsZWQgLSAiCisJCQkJCSAgICAiYm9hcmQgZGlzYWJsZWQuXG4iKTsKIAkJCQkJLyoKIAkJCQkJICogVGhlIG5leHQgY2FsbCBkaXNhYmxlcyB0aGUgYm9hcmQKIAkJCQkJICogY29tcGxldGVseS4KQEAgLTQxMzIsMTYgKzQxNTEsMTYgQEAKIAkJCQkJc3RhdHVzID0gMDsKIAkJCQl9IGVsc2UgeyAvKiBzY2hlZHVsZSBhbm90aGVyIElTUCBhYm9ydCAqLwogCQkJCQloYS0+aXNwX2Fib3J0X2NudC0tOwotCQkJCQlERUJVRyhwcmludGsoInFsYSVsZDogSVNQIGFib3J0IC0gIgotCQkJCQkgICAgInJldHJ5IHJlbWFpbmluZyAlZFxuIiwKLQkJCQkJICAgIHZoYS0+aG9zdF9ubywgaGEtPmlzcF9hYm9ydF9jbnQpKTsKKwkJCQkJcWxfZGJnKHFsX2RiZ190YXNrbSwgdmhhLCAweDgwMjAsCisJCQkJCSAgICAiSVNQIGFib3J0IC0gcmV0cnkgcmVtYWluaW5nICVkLlxuIiwKKwkJCQkJICAgIGhhLT5pc3BfYWJvcnRfY250KTsKIAkJCQkJc3RhdHVzID0gMTsKIAkJCQl9CiAJCQl9IGVsc2UgewogCQkJCWhhLT5pc3BfYWJvcnRfY250ID0gTUFYX1JFVFJJRVNfT0ZfSVNQX0FCT1JUOwotCQkJCURFQlVHKHByaW50aygicWxhMngwMCglbGQpOiBJU1AgZXJyb3IgcmVjb3ZlcnkgIgotCQkJCSAgICAiLSByZXRyeWluZyAoJWQpIG1vcmUgdGltZXNcbiIsCi0JCQkJICAgIHZoYS0+aG9zdF9ubywgaGEtPmlzcF9hYm9ydF9jbnQpKTsKKwkJCQlxbF9kYmcocWxfZGJnX3Rhc2ttLCB2aGEsIDB4ODAyMSwKKwkJCQkgICAgIklTUCBlcnJvciByZWNvdmVyeSAtIHJldHJ5aW5nICglZCkgIgorCQkJCSAgICAibW9yZSB0aW1lcy5cbiIsIGhhLT5pc3BfYWJvcnRfY250KTsKIAkJCQlzZXRfYml0KElTUF9BQk9SVF9SRVRSWSwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAkJCQlzdGF0dXMgPSAxOwogCQkJfQpAQCAtNDE1MCw5ICs0MTY5LDcgQEAKIAl9CiAKIAlpZiAoIXN0YXR1cykgewotCQlERUJVRyhwcmludGsoS0VSTl9JTkZPCi0JCQkJInFsYTJ4MDBfYWJvcnRfaXNwKCVsZCk6IHN1Y2NlZWRlZC5cbiIsCi0JCQkJdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfdGFza20sIHZoYSwgMHg4MDIyLCAiJXMgc3VjY2VlZGVkLlxuIiwgX19mdW5jX18pOwogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+dnBvcnRfc2xvY2ssIGZsYWdzKTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeSh2cCwgJmhhLT52cF9saXN0LCBsaXN0KSB7CkBAIC00MTY5LDggKzQxODYsNyBAQAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+dnBvcnRfc2xvY2ssIGZsYWdzKTsKIAogCX0gZWxzZSB7Ci0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCSJxbGEyeDAwX2Fib3J0X2lzcDogKioqKiBGQUlMRUQgKioqKlxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDgwMjMsICIlcyAqKioqIEZBSUxFRCAqKioqLlxuIik7CiAJfQogCiAJcmV0dXJuKHN0YXR1cyk7CkBAIC00MjExLDggKzQyMjcsOCBAQAogCiAJCXN0YXR1cyA9IHFsYTJ4MDBfZndfcmVhZHkodmhhKTsKIAkJaWYgKCFzdGF0dXMpIHsKLQkJCURFQlVHKHByaW50aygiJXMoKTogU3RhcnQgY29uZmlndXJlIGxvb3AsICIKLQkJCSAgICAic3RhdHVzID0gJWRcbiIsIF9fZnVuY19fLCBzdGF0dXMpKTsKKwkJCXFsX2RiZyhxbF9kYmdfdGFza20sIHZoYSwgMHg4MDMxLAorCQkJICAgICJTdGFydCBjb25maWd1cmUgbG9vcCBzdGF0dXMgPSAlZC5cbiIsIHN0YXR1cyk7CiAKIAkJCS8qIElzc3VlIGEgbWFya2VyIGFmdGVyIEZXIGJlY29tZXMgcmVhZHkuICovCiAJCQlxbGEyeDAwX21hcmtlcih2aGEsIHJlcSwgcnNwLCAwLCAwLCBNS19TWU5DX0FMTCk7CkBAIC00MjM0LDkgKzQyNTAsOCBAQAogCQlpZiAoKHZoYS0+ZGV2aWNlX2ZsYWdzICYgREZMR19OT19DQUJMRSkpCiAJCQlzdGF0dXMgPSAwOwogCi0JCURFQlVHKHByaW50aygiJXMoKTogQ29uZmlndXJlIGxvb3AgZG9uZSwgc3RhdHVzID0gMHgleFxuIiwKLQkJCQlfX2Z1bmNfXywKLQkJCQlzdGF0dXMpKTsKKwkJcWxfZGJnKHFsX2RiZ190YXNrbSwgdmhhLCAweDgwMzIsCisJCSAgICAiQ29uZmlndXJlIGxvb3AgZG9uZSwgc3RhdHVzID0gMHgleC5cbiIsIHN0YXR1cyk7CiAJfQogCXJldHVybiAoc3RhdHVzKTsKIH0KQEAgLTQyNTYsMTMgKzQyNzEsMTMgQEAKIAkJCXJzcC0+b3B0aW9ucyAmPSB+QklUXzA7CiAJCQlyZXQgPSBxbGEyNXh4X2luaXRfcnNwX3F1ZShiYXNlX3ZoYSwgcnNwKTsKIAkJCWlmIChyZXQgIT0gUUxBX1NVQ0NFU1MpCi0JCQkJREVCVUcyXzE3KHByaW50ayhLRVJOX1dBUk5JTkcKLQkJCQkJIiVzIFJzcCBxdWU6JWQgaW5pdCBmYWlsZWRcbiIsIF9fZnVuY19fLAotCQkJCQkJcnNwLT5pZCkpOworCQkJCXFsX2RiZyhxbF9kYmdfaW5pdCwgYmFzZV92aGEsIDB4MDBmZiwKKwkJCQkgICAgIiVzIFJzcCBxdWU6ICVkIGluaXQgZmFpbGVkLlxuIiwKKwkJCQkgICAgX19mdW5jX18sIHJzcC0+aWQpOwogCQkJZWxzZQotCQkJCURFQlVHMl8xNyhwcmludGsoS0VSTl9JTkZPCi0JCQkJCSIlcyBSc3AgcXVlOiVkIGluaXRlZFxuIiwgX19mdW5jX18sCi0JCQkJCQlyc3AtPmlkKSk7CisJCQkJcWxfZGJnKHFsX2RiZ19pbml0LCBiYXNlX3ZoYSwgMHgwMTAwLAorCQkJCSAgICAiJXMgUnNwIHF1ZTogJWQgaW5pdGVkLlxuIiwKKwkJCQkgICAgX19mdW5jX18sIHJzcC0+aWQpOwogCQl9CiAJfQogCWZvciAoaSA9IDE7IGkgPCBoYS0+bWF4X3JlcV9xdWV1ZXM7IGkrKykgewpAQCAtNDI3MiwxMyArNDI4NywxMyBAQAogCQkJcmVxLT5vcHRpb25zICY9IH5CSVRfMDsKIAkJCXJldCA9IHFsYTI1eHhfaW5pdF9yZXFfcXVlKGJhc2VfdmhhLCByZXEpOwogCQkJaWYgKHJldCAhPSBRTEFfU1VDQ0VTUykKLQkJCQlERUJVRzJfMTcocHJpbnRrKEtFUk5fV0FSTklORwotCQkJCQkiJXMgUmVxIHF1ZTolZCBpbml0IGZhaWxlZFxuIiwgX19mdW5jX18sCi0JCQkJCQlyZXEtPmlkKSk7CisJCQkJcWxfZGJnKHFsX2RiZ19pbml0LCBiYXNlX3ZoYSwgMHgwMTAxLAorCQkJCSAgICAiJXMgUmVxIHF1ZTogJWQgaW5pdCBmYWlsZWQuXG4iLAorCQkJCSAgICBfX2Z1bmNfXywgcmVxLT5pZCk7CiAJCQllbHNlCi0JCQkJREVCVUcyXzE3KHByaW50ayhLRVJOX1dBUk5JTkcKLQkJCQkJIiVzIFJlcSBxdWU6JWQgaW5pdGVkXG4iLCBfX2Z1bmNfXywKLQkJCQkJCXJlcS0+aWQpKTsKKwkJCQlxbF9kYmcocWxfZGJnX2luaXQsIGJhc2VfdmhhLCAweDAxMDIsCisJCQkJICAgICIlcyBSZXEgcXVlOiAlZCBpbml0ZWQuXG4iLAorCQkJCSAgICBfX2Z1bmNfXywgcmVxLT5pZCk7CiAJCX0KIAl9CiAJcmV0dXJuIHJldDsKQEAgLTQzOTcsMTkgKzQ0MTIsMjIgQEAKIAlmb3IgKGNudCA9IDAsIGNoa3N1bSA9IDA7IGNudCA8IGhhLT5udnJhbV9zaXplID4+IDI7IGNudCsrKQogCQljaGtzdW0gKz0gbGUzMl90b19jcHUoKmRwdHIrKyk7CiAKLQlERUJVRzUocHJpbnRrKCJzY3NpKCVsZCk6IENvbnRlbnRzIG9mIE5WUkFNXG4iLCB2aGEtPmhvc3Rfbm8pKTsKLQlERUJVRzUocWxhMngwMF9kdW1wX2J1ZmZlcigodWludDhfdCAqKW52LCBoYS0+bnZyYW1fc2l6ZSkpOworCXFsX2RiZyhxbF9kYmdfaW5pdCArIHFsX2RiZ19idWZmZXIsIHZoYSwgMHgwMDZhLAorCSAgICAiQ29udGVudHMgb2YgTlZSQU1cbiIpOworCXFsX2R1bXBfYnVmZmVyKHFsX2RiZ19pbml0ICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDAxMGQsCisJICAgICh1aW50OF90ICopbnYsIGhhLT5udnJhbV9zaXplKTsKIAogCS8qIEJhZCBOVlJBTSBkYXRhLCBzZXQgZGVmYXVsdHMgcGFyYW1ldGVycy4gKi8KIAlpZiAoY2hrc3VtIHx8IG52LT5pZFswXSAhPSAnSScgfHwgbnYtPmlkWzFdICE9ICdTJyB8fCBudi0+aWRbMl0gIT0gJ1AnCiAJICAgIHx8IG52LT5pZFszXSAhPSAnICcgfHwKIAkgICAgbnYtPm52cmFtX3ZlcnNpb24gPCBfX2NvbnN0YW50X2NwdV90b19sZTE2KElDQl9WRVJTSU9OKSkgewogCQkvKiBSZXNldCBOVlJBTSBkYXRhLiAqLwotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJJbmNvbnNpc3RlbnQgTlZSQU0gZGV0ZWN0ZWQ6ICIKLQkJICAgICJjaGVja3N1bT0weCV4IGlkPSVjIHZlcnNpb249MHgleC5cbiIsIGNoa3N1bSwgbnYtPmlkWzBdLAotCQkgICAgbGUxNl90b19jcHUobnYtPm52cmFtX3ZlcnNpb24pKTsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiRmFsbGluZyBiYWNrIHRvIGZ1bmN0aW9uaW5nICh5ZXQgIgotCQkgICAgImludmFsaWQgLS0gV1dQTikgZGVmYXVsdHMuXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDA2YiwKKwkJICAgICJJbmNvbmlzaXN0ZW50IE5WUkFNIGRldGVjdGVkOiBjaGVja3N1bT0weCV4IGlkPSVjICIKKwkJICAgICJ2ZXJzaW9uPTB4JXguXG4iLCBjaGtzdW0sIG52LT5pZFswXSwgbnYtPm52cmFtX3ZlcnNpb24pOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMDZjLAorCQkgICAgIkZhbGxpbmcgYmFjayB0byBmdW5jdGlvbmluZyAoeWV0IGludmFsaWQgLS0gV1dQTikgIgorCQkgICAgImRlZmF1bHRzLlxuIik7CiAKIAkJLyoKIAkJICogU2V0IGRlZmF1bHQgaW5pdGlhbGl6YXRpb24gY29udHJvbCBibG9jay4KQEAgLTQ1ODcsMTAgKzQ2MDUsNyBAQAogCWlmIChoYS0+emlvX21vZGUgIT0gUUxBX1pJT19ESVNBQkxFRCkgewogCQloYS0+emlvX21vZGUgPSBRTEFfWklPX01PREVfNjsKIAotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFpJTyBtb2RlICVkIGVuYWJsZWQ7IHRpbWVyIGRlbGF5ICIKLQkJICAgICIoJWQgdXMpLlxuIiwgdmhhLT5ob3N0X25vLCBoYS0+emlvX21vZGUsCi0JCSAgICBoYS0+emlvX3RpbWVyICogMTAwKSk7Ci0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4MDA2ZiwKIAkJICAgICJaSU8gbW9kZSAlZCBlbmFibGVkOyB0aW1lciBkZWxheSAoJWQgdXMpLlxuIiwKIAkJICAgIGhhLT56aW9fbW9kZSwgaGEtPnppb190aW1lciAqIDEwMCk7CiAKQEAgLTQ2MDEsOCArNDYxNiw4IEBACiAJfQogCiAJaWYgKHJ2YWwpIHsKLQkJREVCVUcyXzMocHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgInNjc2koJWxkKTogTlZSQU0gY29uZmlndXJhdGlvbiBmYWlsZWQhXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDA3MCwKKwkJICAgICJOVlJBTSBjb25maWd1cmF0aW9uIGZhaWxlZC5cbiIpOwogCX0KIAlyZXR1cm4gKHJ2YWwpOwogfQpAQCAtNDYyMCw4ICs0NjM1LDggQEAKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAlzdHJ1Y3QgcmVxX3F1ZSAqcmVxID0gaGEtPnJlcV9xX21hcFswXTsKIAotCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkgICAgIkZXOiBMb2FkaW5nIGZyb20gZmxhc2ggKCV4KS4uLlxuIiwgZmFkZHIpOworCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwOGIsCisJICAgICJMb2FkaW5nIGZpcm13YXJlIGZyb20gZmxhc2ggKCV4KS5cbiIsIGZhZGRyKTsKIAogCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKIApAQCAtNDYzNywxMSArNDY1MiwxMiBAQAogCSAgICBkY29kZVsyXSA9PSAweGZmZmZmZmZmICYmIGRjb2RlWzNdID09IDB4ZmZmZmZmZmYpIHx8CiAJICAgIChkY29kZVswXSA9PSAwICYmIGRjb2RlWzFdID09IDAgJiYgZGNvZGVbMl0gPT0gMCAmJgogCQlkY29kZVszXSA9PSAwKSkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiVW5hYmxlIHRvIHZlcmlmeSBpbnRlZ3JpdHkgb2YgZmxhc2ggZmlybXdhcmUgaW1hZ2UhXG4iKTsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIkZpcm13YXJlIGRhdGE6ICUwOHggJTA4eCAlMDh4ICUwOHghXG4iLCBkY29kZVswXSwKLQkJICAgIGRjb2RlWzFdLCBkY29kZVsyXSwgZGNvZGVbM10pOworCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDA4YywKKwkJICAgICJVbmFibGUgdG8gdmVyaWZ5IHRoZSBpbnRlZ3JpdHkgb2YgZmxhc2ggZmlybXdhcmUgIgorCQkgICAgImltYWdlLlxuIik7CisJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMDhkLAorCQkgICAgIkZpcm13YXJlIGRhdGE6ICUwOHggJTA4eCAlMDh4ICUwOHguXG4iLAorCQkgICAgZGNvZGVbMF0sIGRjb2RlWzFdLCBkY29kZVsyXSwgZGNvZGVbM10pOwogCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0KQEAgLTQ2NjAsOSArNDY3NiwxMCBAQAogCQkJaWYgKGRsZW4gPiByaXNjX3NpemUpCiAJCQkJZGxlbiA9IHJpc2Nfc2l6ZTsKIAotCQkJREVCVUc3KHByaW50aygic2NzaSglbGQpOiBMb2FkaW5nIHJpc2Mgc2VnbWVudEAgcmlzYyAiCi0JCQkgICAgImFkZHIgJXgsIG51bWJlciBvZiBkd29yZHMgMHgleCwgb2Zmc2V0IDB4JXguXG4iLAotCQkJICAgIHZoYS0+aG9zdF9ubywgcmlzY19hZGRyLCBkbGVuLCBmYWRkcikpOworCQkJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDA4ZSwKKwkJCSAgICAiTG9hZGluZyByaXNjIHNlZ21lbnRAIHJpc2MgYWRkciAleCAiCisJCQkgICAgIm51bWJlciBvZiBkd29yZHMgMHgleCBvZmZzZXQgMHgleC5cbiIsCisJCQkgICAgcmlzY19hZGRyLCBkbGVuLCBmYWRkcik7CiAKIAkJCXFsYTI0eHhfcmVhZF9mbGFzaF9kYXRhKHZoYSwgZGNvZGUsIGZhZGRyLCBkbGVuKTsKIAkJCWZvciAoaSA9IDA7IGkgPCBkbGVuOyBpKyspCkBAIC00NjcxLDEyICs0Njg4LDkgQEAKIAkJCXJ2YWwgPSBxbGEyeDAwX2xvYWRfcmFtKHZoYSwgcmVxLT5kbWEsIHJpc2NfYWRkciwKIAkJCSAgICBkbGVuKTsKIAkJCWlmIChydmFsKSB7Ci0JCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6W0VSUk9SXSBGYWlsZWQgdG8gbG9hZCAiCi0JCQkJICAgICJzZWdtZW50ICVkIG9mIGZpcm13YXJlXG4iLCB2aGEtPmhvc3Rfbm8sCi0JCQkJICAgIGZyYWdtZW50KSk7Ci0JCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJCSAgICAiW0VSUk9SXSBGYWlsZWQgdG8gbG9hZCBzZWdtZW50ICVkIG9mICIKLQkJCQkgICAgImZpcm13YXJlXG4iLCBmcmFnbWVudCk7CisJCQkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwOGYsCisJCQkJICAgICJGYWlsZWQgdG8gbG9hZCBzZWdtZW50ICVkIG9mIGZpcm13YXJlLlxuIiwKKwkJCQkgICAgZnJhZ21lbnQpOwogCQkJCWJyZWFrOwogCQkJfQogCkBAIC00NzA5LDkgKzQ3MjMsMTAgQEAKIAkvKiBMb2FkIGZpcm13YXJlIGJsb2IuICovCiAJYmxvYiA9IHFsYTJ4MDBfcmVxdWVzdF9maXJtd2FyZSh2aGEpOwogCWlmICghYmxvYikgewotCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIkZpcm13YXJlIGltYWdlIHVuYXZhaWxhYmxlLlxuIik7Ci0JCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLCAiRmlybXdhcmUgaW1hZ2VzIGNhbiBiZSByZXRyaWV2ZWQgIgotCQkgICAgImZyb206ICIgUUxBX0ZXX1VSTCAiLlxuIik7CisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwODMsCisJCSAgICAiRmltd2FyZSBpbWFnZSB1bmF2YWlsYWJsZS5cbiIpOworCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHgwMDg0LAorCQkgICAgIkZpcm13YXJlIGltYWdlcyBjYW4gYmUgcmV0cmlldmVkIGZyb206ICJRTEFfRldfVVJMICIuXG4iKTsKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfQogCkBAIC00NzI0LDggKzQ3MzksOCBAQAogCiAJLyogVmFsaWRhdGUgZmlybXdhcmUgaW1hZ2UgYnkgY2hlY2tpbmcgdmVyc2lvbi4gKi8KIAlpZiAoYmxvYi0+ZnctPnNpemUgPCA4ICogc2l6ZW9mKHVpbnQxNl90KSkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiVW5hYmxlIHRvIHZlcmlmeSBpbnRlZ3JpdHkgb2YgZmlybXdhcmUgaW1hZ2UgKCVaZCkhXG4iLAorCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDA4NSwKKwkJICAgICJVbmFibGUgdG8gdmVyaWZ5IGludGVncml0eSBvZiBmaXJtd2FyZSBpbWFnZSAoJVpkKS5cbiIsCiAJCSAgICBibG9iLT5mdy0+c2l6ZSk7CiAJCWdvdG8gZmFpbF9md19pbnRlZ3JpdHk7CiAJfQpAQCAtNDczNCwxMSArNDc0OSwxMSBAQAogCWlmICgod2NvZGVbMF0gPT0gMHhmZmZmICYmIHdjb2RlWzFdID09IDB4ZmZmZiAmJiB3Y29kZVsyXSA9PSAweGZmZmYgJiYKIAkgICAgd2NvZGVbM10gPT0gMHhmZmZmKSB8fCAod2NvZGVbMF0gPT0gMCAmJiB3Y29kZVsxXSA9PSAwICYmCiAJCXdjb2RlWzJdID09IDAgJiYgd2NvZGVbM10gPT0gMCkpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIlVuYWJsZSB0byB2ZXJpZnkgaW50ZWdyaXR5IG9mIGZpcm13YXJlIGltYWdlIVxuIik7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJGaXJtd2FyZSBkYXRhOiAlMDR4ICUwNHggJTA0eCAlMDR4IVxuIiwgd2NvZGVbMF0sCi0JCSAgICB3Y29kZVsxXSwgd2NvZGVbMl0sIHdjb2RlWzNdKTsKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwODYsCisJCSAgICAiVW5hYmxlIHRvIHZlcmlmeSBpbnRlZ3JpdHkgb2YgZmlybXdhcmUgaW1hZ2UuXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwODcsCisJCSAgICAiRmlybXdhcmUgZGF0YTogJTA0eCAlMDR4ICUwNHggJTA0eC5cbiIsCisJCSAgICB3Y29kZVswXSwgd2NvZGVbMV0sIHdjb2RlWzJdLCB3Y29kZVszXSk7CiAJCWdvdG8gZmFpbF9md19pbnRlZ3JpdHk7CiAJfQogCkBAIC00NzUxLDkgKzQ3NjYsOSBAQAogCQkvKiBWYWxpZGF0ZSBmaXJtd2FyZSBpbWFnZSBzaXplLiAqLwogCQlmd2NsZW4gKz0gcmlzY19zaXplICogc2l6ZW9mKHVpbnQxNl90KTsKIAkJaWYgKGJsb2ItPmZ3LT5zaXplIDwgZndjbGVuKSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDA4OCwKIAkJCSAgICAiVW5hYmxlIHRvIHZlcmlmeSBpbnRlZ3JpdHkgb2YgZmlybXdhcmUgaW1hZ2UgIgotCQkJICAgICIoJVpkKSFcbiIsIGJsb2ItPmZ3LT5zaXplKTsKKwkJCSAgICAiKCVaZCkuXG4iLCBibG9iLT5mdy0+c2l6ZSk7CiAJCQlnb3RvIGZhaWxfZndfaW50ZWdyaXR5OwogCQl9CiAKQEAgLTQ3NjIsMTAgKzQ3NzcsOSBAQAogCQkJd2xlbiA9ICh1aW50MTZfdCkoaGEtPmZ3X3RyYW5zZmVyX3NpemUgPj4gMSk7CiAJCQlpZiAod2xlbiA+IHJpc2Nfc2l6ZSkKIAkJCQl3bGVuID0gcmlzY19zaXplOwotCi0JCQlERUJVRzcocHJpbnRrKCJzY3NpKCVsZCk6IExvYWRpbmcgcmlzYyBzZWdtZW50QCByaXNjICIKLQkJCSAgICAiYWRkciAleCwgbnVtYmVyIG9mIHdvcmRzIDB4JXguXG4iLCB2aGEtPmhvc3Rfbm8sCi0JCQkgICAgcmlzY19hZGRyLCB3bGVuKSk7CisJCQlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMDg5LAorCQkJICAgICJMb2FkaW5nIHJpc2Mgc2VnbWVudEAgcmlzYyBhZGRyICV4IG51bWJlciBvZiAiCisJCQkgICAgIndvcmRzIDB4JXguXG4iLCByaXNjX2FkZHIsIHdsZW4pOwogCiAJCQlmb3IgKGkgPSAwOyBpIDwgd2xlbjsgaSsrKQogCQkJCXdjb2RlW2ldID0gc3dhYjE2KGZ3Y29kZVtpXSk7CkBAIC00NzczLDEyICs0Nzg3LDkgQEAKIAkJCXJ2YWwgPSBxbGEyeDAwX2xvYWRfcmFtKHZoYSwgcmVxLT5kbWEsIHJpc2NfYWRkciwKIAkJCSAgICB3bGVuKTsKIAkJCWlmIChydmFsKSB7Ci0JCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6W0VSUk9SXSBGYWlsZWQgdG8gbG9hZCAiCi0JCQkJICAgICJzZWdtZW50ICVkIG9mIGZpcm13YXJlXG4iLCB2aGEtPmhvc3Rfbm8sCi0JCQkJICAgIGZyYWdtZW50KSk7Ci0JCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJCSAgICAiW0VSUk9SXSBGYWlsZWQgdG8gbG9hZCBzZWdtZW50ICVkIG9mICIKLQkJCQkgICAgImZpcm13YXJlXG4iLCBmcmFnbWVudCk7CisJCQkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwOGEsCisJCQkJICAgICJGYWlsZWQgdG8gbG9hZCBzZWdtZW50ICVkIG9mIGZpcm13YXJlLlxuIiwKKwkJCQkgICAgZnJhZ21lbnQpOwogCQkJCWJyZWFrOwogCQkJfQogCkBAIC00ODE0LDE1ICs0ODI1LDE3IEBACiAJLyogTG9hZCBmaXJtd2FyZSBibG9iLiAqLwogCWJsb2IgPSBxbGEyeDAwX3JlcXVlc3RfZmlybXdhcmUodmhhKTsKIAlpZiAoIWJsb2IpIHsKLQkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsICJGaXJtd2FyZSBpbWFnZSB1bmF2YWlsYWJsZS5cbiIpOwotCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIkZpcm13YXJlIGltYWdlcyBjYW4gYmUgcmV0cmlldmVkICIKLQkJICAgICJmcm9tOiAiIFFMQV9GV19VUkwgIi5cbiIpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMDkwLAorCQkgICAgIkZpbXdhcmUgaW1hZ2UgdW5hdmFpbGFibGUuXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDA5MSwKKwkJICAgICJGaXJtd2FyZSBpbWFnZXMgY2FuIGJlIHJldHJpZXZlZCBmcm9tOiAiCisJCSAgICBRTEFfRldfVVJMICIuXG4iKTsKIAogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAl9CiAKLQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JICAgICJGVzogTG9hZGluZyB2aWEgcmVxdWVzdC1maXJtd2FyZS4uLlxuIik7CisJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4MDA5MiwKKwkgICAgIkxvYWRpbmcgdmlhIHJlcXVlc3QtZmlybXdhcmUuXG4iKTsKIAogCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKIApAQCAtNDgzNCw4ICs0ODQ3LDggQEAKIAogCS8qIFZhbGlkYXRlIGZpcm13YXJlIGltYWdlIGJ5IGNoZWNraW5nIHZlcnNpb24uICovCiAJaWYgKGJsb2ItPmZ3LT5zaXplIDwgOCAqIHNpemVvZih1aW50MzJfdCkpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIlVuYWJsZSB0byB2ZXJpZnkgaW50ZWdyaXR5IG9mIGZpcm13YXJlIGltYWdlICglWmQpIVxuIiwKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwOTMsCisJCSAgICAiVW5hYmxlIHRvIHZlcmlmeSBpbnRlZ3JpdHkgb2YgZmlybXdhcmUgaW1hZ2UgKCVaZCkuXG4iLAogCQkgICAgYmxvYi0+ZnctPnNpemUpOwogCQlnb3RvIGZhaWxfZndfaW50ZWdyaXR5OwogCX0KQEAgLTQ4NDUsMTEgKzQ4NTgsMTIgQEAKIAkgICAgZGNvZGVbMl0gPT0gMHhmZmZmZmZmZiAmJiBkY29kZVszXSA9PSAweGZmZmZmZmZmKSB8fAogCSAgICAoZGNvZGVbMF0gPT0gMCAmJiBkY29kZVsxXSA9PSAwICYmIGRjb2RlWzJdID09IDAgJiYKIAkJZGNvZGVbM10gPT0gMCkpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIlVuYWJsZSB0byB2ZXJpZnkgaW50ZWdyaXR5IG9mIGZpcm13YXJlIGltYWdlIVxuIik7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJGaXJtd2FyZSBkYXRhOiAlMDh4ICUwOHggJTA4eCAlMDh4IVxuIiwgZGNvZGVbMF0sCi0JCSAgICBkY29kZVsxXSwgZGNvZGVbMl0sIGRjb2RlWzNdKTsKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwOTQsCisJCSAgICAiVW5hYmxlIHRvIHZlcmlmeSBpbnRlZ3JpdHkgb2YgZmlybXdhcmUgaW1hZ2UgKCVaZCkuXG4iLAorCQkgICAgYmxvYi0+ZnctPnNpemUpOworCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDA5NSwKKwkJICAgICJGaXJtd2FyZSBkYXRhOiAlMDh4ICUwOHggJTA4eCAlMDh4LlxuIiwKKwkJICAgIGRjb2RlWzBdLCBkY29kZVsxXSwgZGNvZGVbMl0sIGRjb2RlWzNdKTsKIAkJZ290byBmYWlsX2Z3X2ludGVncml0eTsKIAl9CiAKQEAgLTQ4NjEsOSArNDg3NSw5IEBACiAJCS8qIFZhbGlkYXRlIGZpcm13YXJlIGltYWdlIHNpemUuICovCiAJCWZ3Y2xlbiArPSByaXNjX3NpemUgKiBzaXplb2YodWludDMyX3QpOwogCQlpZiAoYmxvYi0+ZnctPnNpemUgPCBmd2NsZW4pIHsKLQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMDk2LAogCQkJICAgICJVbmFibGUgdG8gdmVyaWZ5IGludGVncml0eSBvZiBmaXJtd2FyZSBpbWFnZSAiCi0JCQkgICAgIiglWmQpIVxuIiwgYmxvYi0+ZnctPnNpemUpOworCQkJICAgICIoJVpkKS5cbiIsIGJsb2ItPmZ3LT5zaXplKTsKIAogCQkJZ290byBmYWlsX2Z3X2ludGVncml0eTsKIAkJfQpAQCAtNDg3NCw5ICs0ODg4LDkgQEAKIAkJCWlmIChkbGVuID4gcmlzY19zaXplKQogCQkJCWRsZW4gPSByaXNjX3NpemU7CiAKLQkJCURFQlVHNyhwcmludGsoInNjc2koJWxkKTogTG9hZGluZyByaXNjIHNlZ21lbnRAIHJpc2MgIgotCQkJICAgICJhZGRyICV4LCBudW1iZXIgb2YgZHdvcmRzIDB4JXguXG4iLCB2aGEtPmhvc3Rfbm8sCi0JCQkgICAgcmlzY19hZGRyLCBkbGVuKSk7CisJCQlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMDk3LAorCQkJICAgICJMb2FkaW5nIHJpc2Mgc2VnbWVudEAgcmlzYyBhZGRyICV4ICIKKwkJCSAgICAibnVtYmVyIG9mIGR3b3JkcyAweCV4LlxuIiwgcmlzY19hZGRyLCBkbGVuKTsKIAogCQkJZm9yIChpID0gMDsgaSA8IGRsZW47IGkrKykKIAkJCQlkY29kZVtpXSA9IHN3YWIzMihmd2NvZGVbaV0pOwpAQCAtNDg4NCwxMiArNDg5OCw5IEBACiAJCQlydmFsID0gcWxhMngwMF9sb2FkX3JhbSh2aGEsIHJlcS0+ZG1hLCByaXNjX2FkZHIsCiAJCQkgICAgZGxlbik7CiAJCQlpZiAocnZhbCkgewotCQkJCURFQlVHKHByaW50aygic2NzaSglbGQpOltFUlJPUl0gRmFpbGVkIHRvIGxvYWQgIgotCQkJCSAgICAic2VnbWVudCAlZCBvZiBmaXJtd2FyZVxuIiwgdmhhLT5ob3N0X25vLAotCQkJCSAgICBmcmFnbWVudCkpOwotCQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCQkgICAgIltFUlJPUl0gRmFpbGVkIHRvIGxvYWQgc2VnbWVudCAlZCBvZiAiCi0JCQkJICAgICJmaXJtd2FyZVxuIiwgZnJhZ21lbnQpOworCQkJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMDk4LAorCQkJCSAgICAiRmFpbGVkIHRvIGxvYWQgc2VnbWVudCAlZCBvZiBmaXJtd2FyZS5cbiIsCisJCQkJICAgIGZyYWdtZW50KTsKIAkJCQlicmVhazsKIAkJCX0KIApAQCAtNDk1MywxNCArNDk2NCwxMyBAQAogCWlmIChydmFsID09IFFMQV9TVUNDRVNTIHx8ICFoYS0+Zmx0X3JlZ2lvbl9nb2xkX2Z3KQogCQlyZXR1cm4gcnZhbDsKIAotCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLAotCSAgICAiRlc6IEF0dGVtcHRpbmcgdG8gZmFsbGJhY2sgdG8gZ29sZGVuIGZpcm13YXJlLi4uXG4iKTsKKwlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHgwMDk5LAorCSAgICAiQXR0ZW1wdGluZyB0byBmYWxsYmFjayB0byBnb2xkZW4gZmlybXdhcmUuXG4iKTsKIAlydmFsID0gcWxhMjR4eF9sb2FkX3Jpc2NfZmxhc2godmhhLCBzcmlzY19hZGRyLCBoYS0+Zmx0X3JlZ2lvbl9nb2xkX2Z3KTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKIAkJcmV0dXJuIHJ2YWw7CiAKLQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwKLQkgICAgIkZXOiBQbGVhc2UgdXBkYXRlIG9wZXJhdGlvbmFsIGZpcm13YXJlLi4uXG4iKTsKKwlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHgwMDlhLCAiVXBkYXRlIG9wZXJhdGlvbmFsIGZpcm13YXJlLlxuIik7CiAJaGEtPmZsYWdzLnJ1bm5pbmdfZ29sZF9mdyA9IDE7CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTQ5ODcsOCArNDk5Nyw4IEBACiAJCQljb250aW51ZTsKIAkJaWYgKHFsYTJ4MDBfc2V0dXBfY2hpcCh2aGEpICE9IFFMQV9TVUNDRVNTKQogCQkJY29udGludWU7Ci0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJICAgICJBdHRlbXB0aW5nIHJldHJ5IG9mIHN0b3AtZmlybXdhcmUgY29tbWFuZC4uLlxuIik7CisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDgwMTUsCisJCSAgICAiQXR0ZW1wdGluZyByZXRyeSBvZiBzdG9wLWZpcm13YXJlIGNvbW1hbmQuXG4iKTsKIAkJcmV0ID0gcWxhMngwMF9zdG9wX2Zpcm13YXJlKHZoYSk7CiAJfQogfQpAQCAtNTAyMywxMCArNTAzMywxMCBAQAogCS8qIExvZ2luIHRvIFNOUyBmaXJzdCAqLwogCWhhLT5pc3Bfb3BzLT5mYWJyaWNfbG9naW4odmhhLCBOUEhfU05TLCAweGZmLCAweGZmLCAweGZjLCBtYiwgQklUXzEpOwogCWlmIChtYlswXSAhPSBNQlNfQ09NTUFORF9DT01QTEVURSkgewotCQlERUJVRzE1KHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJICAgICJGYWlsZWQgU05TIGxvZ2luOiBsb29wX2lkPSV4IG1iWzBdPSV4IG1iWzFdPSV4ICIKLQkJICAgICJtYlsyXT0leCBtYls2XT0leCBtYls3XT0leFxuIiwgTlBIX1NOUywKLQkJICAgIG1iWzBdLCBtYlsxXSwgbWJbMl0sIG1iWzZdLCBtYls3XSkpOworCQlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMTAzLAorCQkgICAgIkZhaWxlZCBTTlMgbG9naW46IGxvb3BfaWQ9JXggbWJbMF09JXggbWJbMV09JXggbWJbMl09JXggIgorCQkgICAgIm1iWzZdPSV4IG1iWzddPSV4LlxuIiwKKwkJICAgIE5QSF9TTlMsIG1iWzBdLCBtYlsxXSwgbWJbMl0sIG1iWzZdLCBtYls3XSk7CiAJCXJldHVybiAoUUxBX0ZVTkNUSU9OX0ZBSUxFRCk7CiAJfQogCkBAIC01MTQ2LDE5ICs1MTU2LDIzIEBACiAJZm9yIChjbnQgPSAwLCBjaGtzdW0gPSAwOyBjbnQgPCBoYS0+bnZyYW1fc2l6ZSA+PiAyOyBjbnQrKykKIAkJY2hrc3VtICs9IGxlMzJfdG9fY3B1KCpkcHRyKyspOwogCi0JREVCVUc1KHByaW50aygic2NzaSglbGQpOiBDb250ZW50cyBvZiBOVlJBTVxuIiwgdmhhLT5ob3N0X25vKSk7Ci0JREVCVUc1KHFsYTJ4MDBfZHVtcF9idWZmZXIoKHVpbnQ4X3QgKiludiwgaGEtPm52cmFtX3NpemUpKTsKKwlxbF9kYmcocWxfZGJnX2luaXQgKyBxbF9kYmdfYnVmZmVyLCB2aGEsIDB4MDExMSwKKwkgICAgIkNvbnRlbnRzIG9mIE5WUkFNOlxuIik7CisJcWxfZHVtcF9idWZmZXIocWxfZGJnX2luaXQgKyBxbF9kYmdfYnVmZmVyLCB2aGEsIDB4MDExMiwKKwkgICAgKHVpbnQ4X3QgKiludiwgaGEtPm52cmFtX3NpemUpOwogCiAJLyogQmFkIE5WUkFNIGRhdGEsIHNldCBkZWZhdWx0cyBwYXJhbWV0ZXJzLiAqLwogCWlmIChjaGtzdW0gfHwgbnYtPmlkWzBdICE9ICdJJyB8fCBudi0+aWRbMV0gIT0gJ1MnIHx8IG52LT5pZFsyXSAhPSAnUCcKIAkgICAgfHwgbnYtPmlkWzNdICE9ICcgJyB8fAogCSAgICBudi0+bnZyYW1fdmVyc2lvbiA8IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoSUNCX1ZFUlNJT04pKSB7CiAJCS8qIFJlc2V0IE5WUkFNIGRhdGEuICovCi0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIkluY29uc2lzdGVudCBOVlJBTSBkZXRlY3RlZDogIgotCQkgICAgImNoZWNrc3VtPTB4JXggaWQ9JWMgdmVyc2lvbj0weCV4LlxuIiwgY2hrc3VtLCBudi0+aWRbMF0sCisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwNzMsCisJCSAgICAiSW5jb25pc2lzdGVudCBOVlJBTSBkZXRlY3RlZDogY2hlY2tzdW09MHgleCBpZD0lYyAiCisJCSAgICAidmVyc2lvbj0weCV4LlxuIiwgY2hrc3VtLCBudi0+aWRbMF0sCiAJCSAgICBsZTE2X3RvX2NwdShudi0+bnZyYW1fdmVyc2lvbikpOwotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJGYWxsaW5nIGJhY2sgdG8gZnVuY3Rpb25pbmcgKHlldCAiCi0JCSAgICAiaW52YWxpZCAtLSBXV1BOKSBkZWZhdWx0cy5cbiIpOworCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHgwMDc0LAorCQkgICAgIkZhbGxpbmcgYmFjayB0byBmdW5jdGlvbmluZyAoeWV0IGludmFsaWQgLS0gV1dQTikgIgorCQkgICAgImRlZmF1bHRzLlxuIik7CiAKIAkJLyoKIAkJICogU2V0IGRlZmF1bHQgaW5pdGlhbGl6YXRpb24gY29udHJvbCBibG9jay4KQEAgLTUzNTAsMTIgKzUzNjQsMTAgQEAKIAlpZiAoaGEtPnppb19tb2RlICE9IFFMQV9aSU9fRElTQUJMRUQpIHsKIAkJaGEtPnppb19tb2RlID0gUUxBX1pJT19NT0RFXzY7CiAKLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBaSU8gbW9kZSAlZCBlbmFibGVkOyB0aW1lciBkZWxheSAiCi0JCSAgICAiKCVkIHVzKS5cbiIsIHZoYS0+aG9zdF9ubywgaGEtPnppb19tb2RlLAotCQkgICAgaGEtPnppb190aW1lciAqIDEwMCkpOwotCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwNzUsCiAJCSAgICAiWklPIG1vZGUgJWQgZW5hYmxlZDsgdGltZXIgZGVsYXkgKCVkIHVzKS5cbiIsCi0JCSAgICBoYS0+emlvX21vZGUsIGhhLT56aW9fdGltZXIgKiAxMDApOworCQkgICAgaGEtPnppb19tb2RlLAorCQkgICAgaGEtPnppb190aW1lciAqIDEwMCk7CiAKIAkJaWNiLT5maXJtd2FyZV9vcHRpb25zXzIgfD0gY3B1X3RvX2xlMzIoCiAJCSAgICAodWludDMyX3QpaGEtPnppb19tb2RlKTsKQEAgLTUzNjQsOCArNTM3Niw4IEBACiAJfQogCiAJaWYgKHJ2YWwpIHsKLQkJREVCVUcyXzMocHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgInNjc2koJWxkKTogTlZSQU0gY29uZmlndXJhdGlvbiBmYWlsZWQhXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDA3NiwKKwkJICAgICJOVlJBTSBjb25maWd1cmF0aW9uIGZhaWxlZC5cbiIpOwogCX0KIAlyZXR1cm4gKHJ2YWwpOwogfQpAQCAtNTM4OCw5ICs1NDAwLDggQEAKIAogCQlzdGF0dXMgPSBxbGEyeDAwX2Z3X3JlYWR5KHZoYSk7CiAJCWlmICghc3RhdHVzKSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkiJXMoKTogU3RhcnQgY29uZmlndXJlIGxvb3AsICIKLQkJCSJzdGF0dXMgPSAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CisJCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg4MDNjLAorCQkJICAgICJTdGFydCBjb25maWd1cmUgbG9vcCwgc3RhdHVzID0lZC5cbiIsIHN0YXR1cyk7CiAKIAkJCS8qIElzc3VlIGEgbWFya2VyIGFmdGVyIEZXIGJlY29tZXMgcmVhZHkuICovCiAJCQlxbGEyeDAwX21hcmtlcih2aGEsIHJlcSwgcnNwLCAwLCAwLCBNS19TWU5DX0FMTCk7CkBAIC01NDEyLDkgKzU0MjMsOCBAQAogCQlpZiAoKHZoYS0+ZGV2aWNlX2ZsYWdzICYgREZMR19OT19DQUJMRSkpCiAJCQlzdGF0dXMgPSAwOwogCi0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCSIlcygpOiBDb25maWd1cmUgbG9vcCBkb25lLCBzdGF0dXMgPSAweCV4XG4iLAotCQkJX19mdW5jX18sIHN0YXR1cyk7CisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDgwM2QsCisJCSAgICAiQ29uZmlndXJlIGxvb3AgZG9uZSwgc3RhdHVzID0gMHgleC5cbiIsIHN0YXR1cyk7CiAJfQogCiAJaWYgKCFzdGF0dXMpIHsKQEAgLTU0NTAsOSArNTQ2MCw5IEBACiAJCQkgICAgaGEtPmZjZV9kbWEsIGhhLT5mY2VfYnVmcywgaGEtPmZjZV9tYiwKIAkJCSAgICAmaGEtPmZjZV9idWZzKTsKIAkJCWlmIChydmFsKSB7Ci0JCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJCSAgICAiVW5hYmxlIHRvIHJlaW5pdGlhbGl6ZSBGQ0UgIgotCQkJCSAgICAiKCVkKS5cbiIsIHJ2YWwpOworCQkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDgwM2UsCisJCQkJICAgICJVbmFibGUgdG8gcmVpbml0aWFsaXplIEZDRSAoJWQpLlxuIiwKKwkJCQkgICAgcnZhbCk7CiAJCQkJaGEtPmZsYWdzLmZjZV9lbmFibGVkID0gMDsKIAkJCX0KIAkJfQpAQCAtNTQ2MiwxNyArNTQ3MiwxNiBAQAogCQkJcnZhbCA9IHFsYTJ4MDBfZW5hYmxlX2VmdF90cmFjZSh2aGEsCiAJCQkgICAgaGEtPmVmdF9kbWEsIEVGVF9OVU1fQlVGRkVSUyk7CiAJCQlpZiAocnZhbCkgewotCQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCQkgICAgIlVuYWJsZSB0byByZWluaXRpYWxpemUgRUZUICIKLQkJCQkgICAgIiglZCkuXG4iLCBydmFsKTsKKwkJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg4MDNmLAorCQkJCSAgICAiVW5hYmxlIHRvIHJlaW5pdGlhbGl6ZSBFRlQgKCVkKS5cbiIsCisJCQkJICAgIHJ2YWwpOwogCQkJfQogCQl9CiAJfQogCiAJaWYgKCFzdGF0dXMpIHsKLQkJREVCVUcocHJpbnRrKEtFUk5fSU5GTwotCQkJInFsYTgyeHhfcmVzdGFydF9pc3AoJWxkKTogc3VjY2VlZGVkLlxuIiwKLQkJCXZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX3Rhc2ttLCB2aGEsIDB4ODA0MCwKKwkJICAgICJxbGE4Mnh4X3Jlc3RhcnRfaXNwIHN1Y2NlZWRlZC5cbiIpOwogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+dnBvcnRfc2xvY2ssIGZsYWdzKTsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeSh2cCwgJmhhLT52cF9saXN0LCBsaXN0KSB7CkBAIC01NDg5LDggKzU0OTgsOCBAQAogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+dnBvcnRfc2xvY2ssIGZsYWdzKTsKIAogCX0gZWxzZSB7Ci0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCSJxbGE4Mnh4X3Jlc3RhcnRfaXNwOiAqKioqIEZBSUxFRCAqKioqXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4ODA0MSwKKwkJICAgICJxbGE4Mnh4X3Jlc3RhcnRfaXNwICoqKiogRkFJTEVEICoqKiouXG4iKTsKIAl9CiAKIAlyZXR1cm4gc3RhdHVzOwpAQCAtNTY0MCw5ICs1NjQ5LDggQEAKIAlpZiAocmV0ID09IFFMQV9TVUNDRVNTKQogCQlmY3BvcnQtPmZjcF9wcmlvID0gcHJpb3JpdHk7CiAJZWxzZQotCQlERUJVRzIocHJpbnRrKEtFUk5fV0FSTklORwotCQkJInNjc2koJWxkKTogVW5hYmxlIHRvIGFjdGl2YXRlIGZjcCBwcmlvcml0eSwgIgotCQkJIiByZXQ9MHgleFxuIiwgdmhhLT5ob3N0X25vLCByZXQpKTsKKwkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzA0ZiwKKwkJICAgICJVbmFibGUgdG8gYWN0aXZhdGUgZmNwIHByaW9yaXR5LCByZXQ9MHgleC5cbiIsIHJldCk7CiAKIAlyZXR1cm4gIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbmxpbmUuaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pbmxpbmUuaAppbmRleCA0YzgxNjdlLi5kMmU5MDRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5saW5lLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lubGluZS5oCkBAIC05NCwxMSArOTQsMTEgQEAKIAogCS8qIERvbid0IHByaW50IHN0YXRlIHRyYW5zaXRpb25zIGR1cmluZyBpbml0aWFsIGFsbG9jYXRpb24gb2YgZmNwb3J0ICovCiAJaWYgKG9sZF9zdGF0ZSAmJiBvbGRfc3RhdGUgIT0gc3RhdGUpIHsKLQkJREVCVUcocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGZjcG9ydC0+dmhhLT5odywKLQkJICAgICJzY3NpKCVsZCk6IEZDUG9ydCBzdGF0ZSB0cmFuc2l0aW9uZWQgZnJvbSAlcyB0byAlcyAtICIKLQkJICAgICJwb3J0aWQ9JTAyeCUwMnglMDJ4LlxuIiwgZmNwb3J0LT52aGEtPmhvc3Rfbm8sCisJCXFsX2RiZyhxbF9kYmdfZGlzYywgZmNwb3J0LT52aGEsIDB4MjA3ZCwKKwkJICAgICJGQ1BvcnQgc3RhdGUgdHJhbnNpdGlvbmVkIGZyb20gJXMgdG8gJXMgLSAiCisJCSAgICAicG9ydGlkPSUwMnglMDJ4JTAyeC5cbiIsCiAJCSAgICBwb3J0X3N0YXRlX3N0cltvbGRfc3RhdGVdLCBwb3J0X3N0YXRlX3N0cltzdGF0ZV0sCiAJCSAgICBmY3BvcnQtPmRfaWQuYi5kb21haW4sIGZjcG9ydC0+ZF9pZC5iLmFyZWEsCi0JCSAgICBmY3BvcnQtPmRfaWQuYi5hbF9wYSkpOworCQkgICAgZmNwb3J0LT5kX2lkLmIuYWxfcGEpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pb2NiLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW9jYi5jCmluZGV4IDdiYWMzY2QuLjQ5ZDY5MDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pb2NiLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lvY2IuYwpAQCAtMTUwLDcgKzE1MCw4IEBACiAKIAkvKiBXZSBvbmx5IHN1cHBvcnQgVDEwIERJRiByaWdodCBub3cgKi8KIAlpZiAoZ3VhcmQgIT0gU0hPU1RfRElYX0dVQVJEX0NSQykgewotCQlERUJVRzIocHJpbnRrKEtFUk5fRVJSICJVbnN1cHBvcnRlZCBndWFyZDogJWRcbiIsIGd1YXJkKSk7CisJCXFsX2RiZyhxbF9kYmdfaW8sIHNwLT5mY3BvcnQtPnZoYSwgMHgzMDA3LAorCQkgICAgIlVuc3VwcG9ydGVkIGd1YXJkOiAlZCBmb3IgY21kPSVwLlxuIiwgZ3VhcmQsIHNwLT5jbWQpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTM0Myw5ICszNDQsMTAgQEAKIAogCS8qIFNlbmQgbWFya2VyIGlmIHJlcXVpcmVkICovCiAJaWYgKHZoYS0+bWFya2VyX25lZWRlZCAhPSAwKSB7Ci0JCWlmIChxbGEyeDAwX21hcmtlcih2aGEsIHJlcSwgcnNwLCAwLCAwLCBNS19TWU5DX0FMTCkKLQkJCQkJCQkhPSBRTEFfU1VDQ0VTUykKKwkJaWYgKHFsYTJ4MDBfbWFya2VyKHZoYSwgcmVxLCByc3AsIDAsIDAsIE1LX1NZTkNfQUxMKSAhPQorCQkgICAgUUxBX1NVQ0NFU1MpIHsKIAkJCXJldHVybiAoUUxBX0ZVTkNUSU9OX0ZBSUxFRCk7CisJCX0KIAkJdmhhLT5tYXJrZXJfbmVlZGVkID0gMDsKIAl9CiAKQEAgLTQ5MCw4ICs0OTIsOCBAQAogCW1yazI0ID0gTlVMTDsKIAltcmsgPSAobXJrX2VudHJ5X3QgKilxbGEyeDAwX2FsbG9jX2lvY2JzKHZoYSwgMCk7CiAJaWYgKG1yayA9PSBOVUxMKSB7Ci0JCURFQlVHMl8zKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGFsbG9jYXRlIE1hcmtlciBJT0NCLlxuIiwKLQkJICAgIF9fZnVuY19fLCBiYXNlX3ZoYS0+aG9zdF9ubykpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIGJhc2VfdmhhLCAweDMwMjYsCisJCSAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIE1hcmtlciBJT0NCLlxuIik7CiAKIAkJcmV0dXJuIChRTEFfRlVOQ1RJT05fRkFJTEVEKTsKIAl9CkBAIC01NDcsOSArNTQ5LDEwIEBACiAJZGV2aWNlX3JlZ190IF9faW9tZW0gKnJlZyA9IElTUF9RVUVfUkVHKGhhLCByZXEtPmlkKTsKIAlzdHJ1Y3QgZGV2aWNlX3JlZ18yeHh4IF9faW9tZW0gKmlvcmVnID0gJmhhLT5pb2Jhc2UtPmlzcDsKIAotCURFQlVHNShwcmludGsoIiVzKCk6IElPQ0IgZGF0YTpcbiIsIF9fZnVuY19fKSk7Ci0JREVCVUc1KHFsYTJ4MDBfZHVtcF9idWZmZXIoCi0JICAgICh1aW50OF90ICopcmVxLT5yaW5nX3B0ciwgUkVRVUVTVF9FTlRSWV9TSVpFKSk7CisJcWxfZGJnKHFsX2RiZ19pbyArIHFsX2RiZ19idWZmZXIsIHZoYSwgMHgzMDJkLAorCSAgICAiSU9DQiBkYXRhOlxuIik7CisJcWxfZHVtcF9idWZmZXIocWxfZGJnX2lvICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDMwMmUsCisJICAgICh1aW50OF90ICopcmVxLT5yaW5nX3B0ciwgUkVRVUVTVF9FTlRSWV9TSVpFKTsKIAogCS8qIEFkanVzdCByaW5nIGluZGV4LiAqLwogCXJlcS0+cmluZ19pbmRleCsrOwpAQCAtNjA0LDcgKzYwNyw3IEBACiAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgSU9DQiBlbnRyaWVzIG5lZWRlZCB0byBzdG9yZSBAZHNkcy4KICAqLwogaW5saW5lIHVpbnQxNl90Ci1xbGEyNHh4X2NhbGNfaW9jYnModWludDE2X3QgZHNkcykKK3FsYTI0eHhfY2FsY19pb2NicyhzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdWludDE2X3QgZHNkcykKIHsKIAl1aW50MTZfdCBpb2NiczsKIApAQCAtNjE0LDggKzYxNyw2IEBACiAJCWlmICgoZHNkcyAtIDEpICUgNSkKIAkJCWlvY2JzKys7CiAJfQotCURFQlVHMyhwcmludGsoS0VSTl9ERUJVRyAiJXMoKTogUmVxdWlyZWQgUEtUKHMpID0gJWRcbiIsCi0JICAgIF9fZnVuY19fLCBpb2NicykpOwogCXJldHVybiBpb2NiczsKIH0KIApAQCAtNzEyLDYgKzcxMyw3IEBACiAgICAgdW5zaWduZWQgaW50IHByb3RjbnQpCiB7CiAJc3RydWN0IHNkX2RpZl90dXBsZSAqc3B0OworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihjbWQtPmRldmljZS0+aG9zdCk7CiAJdW5zaWduZWQgY2hhciBvcCA9IHNjc2lfZ2V0X3Byb3Rfb3AoY21kKTsKIAogCXN3aXRjaCAoc2NzaV9nZXRfcHJvdF90eXBlKGNtZCkpIHsKQEAgLTc2OCw5ICs3NzAsOSBAQAogCQkgICAgb3AgPT0gU0NTSV9QUk9UX1dSSVRFX1BBU1MpKSB7CiAJCQlzcHQgPSBwYWdlX2FkZHJlc3Moc2dfcGFnZShzY3NpX3Byb3Rfc2dsaXN0KGNtZCkpKSArCiAJCQkgICAgc2NzaV9wcm90X3NnbGlzdChjbWQpWzBdLm9mZnNldDsKLQkJCURFQlVHMTgocHJpbnRrKEtFUk5fREVCVUcKLQkJCSAgICAiJXMoKTogTEJBIGZyb20gdXNlciAlcCwgbGJhID0gMHgleFxuIiwKLQkJCSAgICBfX2Z1bmNfXywgc3B0LCAoaW50KXNwdC0+cmVmX3RhZykpOworCQkJcWxfZGJnKHFsX2RiZ19pbywgdmhhLCAweDMwMDgsCisJCQkgICAgIkxCQSBmcm9tIHVzZXIgJXAsIGxiYSA9IDB4JXggZm9yIGNtZD0lcC5cbiIsCisJCQkgICAgc3B0LCAoaW50KXNwdC0+cmVmX3RhZywgY21kKTsKIAkJCXBrdC0+cmVmX3RhZyA9IHN3YWIzMihzcHQtPnJlZl90YWcpOwogCQkJcGt0LT5hcHBfdGFnX21hc2tbMF0gPSAweDA7CiAJCQlwa3QtPmFwcF90YWdfbWFza1sxXSA9IDB4MDsKQEAgLTc4OSwxMSArNzkxLDExIEBACiAJCWJyZWFrOwogCX0KIAotCURFQlVHMTgocHJpbnRrKEtFUk5fREVCVUcKLQkgICAgIiVzKCk6IFNldHRpbmcgcHJvdGVjdGlvbiBUYWdzOiAoQklHKSByZWYgdGFnID0gMHgleCwiCi0JICAgICIgYXBwIHRhZyA9IDB4JXgsIHByb3QgU0cgY291bnQgJWQgLCBjbWQgbGJhIDB4JXgsIgotCSAgICAiIHByb3RfdHlwZT0ldVxuIiwgX19mdW5jX18sIHBrdC0+cmVmX3RhZywgcGt0LT5hcHBfdGFnLCBwcm90Y250LAotCSAgICAoaW50KXNjc2lfZ2V0X2xiYShjbWQpLCBzY3NpX2dldF9wcm90X3R5cGUoY21kKSkpOworCXFsX2RiZyhxbF9kYmdfaW8sIHZoYSwgMHgzMDA5LAorCSAgICAiU2V0dGluZyBwcm90ZWN0aW9uIFRhZ3M6IChCSUcpIHJlZiB0YWcgPSAweCV4LCBhcHAgdGFnID0gMHgleCwgIgorCSAgICAicHJvdCBTRyBjb3VudCAlZCwgY21kIGxiYSAweCV4LCBwcm90X3R5cGU9JXUgY21kPSVwLlxuIiwKKwkgICAgcGt0LT5yZWZfdGFnLCBwa3QtPmFwcF90YWcsIHByb3RjbnQsIChpbnQpc2NzaV9nZXRfbGJhKGNtZCksCisJICAgIHNjc2lfZ2V0X3Byb3RfdHlwZShjbWQpLCBjbWQpOwogfQogCiAKQEAgLTgwOSw2ICs4MTEsNyBAQAogCXVpbnQzMl90ICpjdXJfZHNkID0gZHNkOwogCWludAlpOwogCXVpbnQxNl90CXVzZWRfZHNkcyA9IHRvdF9kc2RzOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihzcC0+Y21kLT5kZXZpY2UtPmhvc3QpOwogCiAJdWludDhfdAkJKmNwOwogCkBAIC04NTMsOSArODU2LDEwIEBACiAJCQljdXJfZHNkID0gKHVpbnQzMl90ICopbmV4dF9kc2Q7CiAJCX0KIAkJc2xlX2RtYSA9IHNnX2RtYV9hZGRyZXNzKHNnKTsKLQkJREVCVUcxOChwcmludGsoIiVzKCk6ICVwLCBzZyBlbnRyeSAlZCAtIGFkZHIgPTB4JXggMHgleCwiCi0JCSAgICAiIGxlbiA9JWRcbiIsIF9fZnVuY19fICwgY3VyX2RzZCwgaSwgTFNEKHNsZV9kbWEpLAotCQkgICAgTVNEKHNsZV9kbWEpLCBzZ19kbWFfbGVuKHNnKSkpOworCQlxbF9kYmcocWxfZGJnX2lvLCB2aGEsIDB4MzAwYSwKKwkJICAgICJzZyBlbnRyeSAlZCAtIGFkZHI9MHgleCAweCV4LCAiICJsZW49JWQgZm9yIGNtZD0lcC5cbiIsCisJCSAgICBjdXJfZHNkLCBpLCBMU0Qoc2xlX2RtYSksIE1TRChzbGVfZG1hKSwgc2dfZG1hX2xlbihzZyksCisJCSAgICBzcC0+Y21kKTsKIAkJKmN1cl9kc2QrKyA9IGNwdV90b19sZTMyKExTRChzbGVfZG1hKSk7CiAJCSpjdXJfZHNkKysgPSBjcHVfdG9fbGUzMihNU0Qoc2xlX2RtYSkpOwogCQkqY3VyX2RzZCsrID0gY3B1X3RvX2xlMzIoc2dfZG1hX2xlbihzZykpOwpAQCAtODYzLDggKzg2Nyw4IEBACiAKIAkJaWYgKHNjc2lfZ2V0X3Byb3Rfb3Aoc3AtPmNtZCkgPT0gU0NTSV9QUk9UX1dSSVRFX1BBU1MpIHsKIAkJCWNwID0gcGFnZV9hZGRyZXNzKHNnX3BhZ2Uoc2cpKSArIHNnLT5vZmZzZXQ7Ci0JCQlERUJVRzE4KHByaW50aygiJXMoKTogVXNlciBEYXRhIGJ1ZmZlcj0gJXA6XG4iLAotCQkJICAgIF9fZnVuY19fICwgY3ApKTsKKwkJCXFsX2RiZyhxbF9kYmdfaW8sIHZoYSwgMHgzMDBiLAorCQkJICAgICJVc2VyIGRhdGEgYnVmZmVyPSVwIGZvciBjbWQ9JXAuXG4iLCBjcCwgc3AtPmNtZCk7CiAJCX0KIAl9CiAJLyogTnVsbCB0ZXJtaW5hdGlvbiAqLwpAQCAtODg4LDcgKzg5Miw3IEBACiAJc3RydWN0IHNjc2lfY21uZCAqY21kOwogCXVpbnQzMl90ICpjdXJfZHNkID0gZHNkOwogCXVpbnQxNl90CXVzZWRfZHNkcyA9IHRvdF9kc2RzOwotCisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCXVpbnQ4X3QJCSpjcDsKIAogCkBAIC05MzUsMTAgKzkzOSwxMSBAQAogCQl9CiAJCXNsZV9kbWEgPSBzZ19kbWFfYWRkcmVzcyhzZyk7CiAJCWlmIChzY3NpX2dldF9wcm90X29wKHNwLT5jbWQpID09IFNDU0lfUFJPVF9XUklURV9QQVNTKSB7Ci0JCQlERUJVRzE4KHByaW50ayhLRVJOX0RFQlVHCi0JCQkgICAgIiVzKCk6ICVwLCBzZyBlbnRyeSAlZCAtIGFkZHIgPTB4JXgiCi0JCQkgICAgIjB4JXgsIGxlbiA9JWRcbiIsIF9fZnVuY19fICwgY3VyX2RzZCwgaSwKLQkJCSAgICBMU0Qoc2xlX2RtYSksIE1TRChzbGVfZG1hKSwgc2dfZG1hX2xlbihzZykpKTsKKwkJCXFsX2RiZyhxbF9kYmdfaW8sIHZoYSwgMHgzMDI3LAorCQkJICAgICIlcygpOiAlcCwgc2dfZW50cnkgJWQgLSAiCisJCQkgICAgImFkZHI9MHgleDB4JXgsIGxlbj0lZC5cbiIsCisJCQkgICAgX19mdW5jX18sIGN1cl9kc2QsIGksCisJCQkgICAgTFNEKHNsZV9kbWEpLCBNU0Qoc2xlX2RtYSksIHNnX2RtYV9sZW4oc2cpKTsKIAkJfQogCQkqY3VyX2RzZCsrID0gY3B1X3RvX2xlMzIoTFNEKHNsZV9kbWEpKTsKIAkJKmN1cl9kc2QrKyA9IGNwdV90b19sZTMyKE1TRChzbGVfZG1hKSk7CkBAIC05NDYsOCArOTUxLDkgQEAKIAogCQlpZiAoc2NzaV9nZXRfcHJvdF9vcChzcC0+Y21kKSA9PSBTQ1NJX1BST1RfV1JJVEVfUEFTUykgewogCQkJY3AgPSBwYWdlX2FkZHJlc3Moc2dfcGFnZShzZykpICsgc2ctPm9mZnNldDsKLQkJCURFQlVHMTgocHJpbnRrKCIlcygpOiBQcm90ZWN0aW9uIERhdGEgYnVmZmVyID0gJXA6XG4iLAotCQkJICAgIF9fZnVuY19fICwgY3ApKTsKKwkJCXFsX2RiZyhxbF9kYmdfaW8sIHZoYSwgMHgzMDI4LAorCQkJICAgICIlcygpOiBQcm90ZWN0aW9uIERhdGEgYnVmZmVyID0gJXAuXG4iLCBfX2Z1bmNfXywKKwkJCSAgICBjcCk7CiAJCX0KIAkJYXZhaWxfZHNkcy0tOwogCX0KQEAgLTk5NiwyMSArMTAwMiwxNSBAQAogCSooKHVpbnQzMl90ICopKCZjbWRfcGt0LT5lbnRyeV90eXBlKSkgPQogCSAgICBfX2NvbnN0YW50X2NwdV90b19sZTMyKENPTU1BTkRfVFlQRV9DUkNfMik7CiAKLQkvKiBObyBkYXRhIHRyYW5zZmVyICovCi0JZGF0YV9ieXRlcyA9IHNjc2lfYnVmZmxlbihjbWQpOwotCWlmICghZGF0YV9ieXRlcyB8fCBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9OT05FKSB7Ci0JCURFQlVHMTgocHJpbnRrKEtFUk5fSU5GTyAiJXM6IFplcm8gZGF0YSBieXRlcyBvciBETUEtTk9ORSAlZFxuIiwKLQkJICAgIF9fZnVuY19fLCBkYXRhX2J5dGVzKSk7Ci0JCWNtZF9wa3QtPmJ5dGVfY291bnQgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyKDApOwotCQlyZXR1cm4gUUxBX1NVQ0NFU1M7Ci0JfQotCiAJdmhhID0gc3AtPmZjcG9ydC0+dmhhOwogCWhhID0gdmhhLT5odzsKIAotCURFQlVHMTgocHJpbnRrKEtFUk5fREVCVUcKLQkgICAgIiVzKCVsZCk6IEV4ZWN1dGluZyBjbWQgc3AgJXAsIHByb3Rfb3A9JXUuXG4iLCBfX2Z1bmNfXywKLQkgICAgdmhhLT5ob3N0X25vLCBzcCwgc2NzaV9nZXRfcHJvdF9vcChzcC0+Y21kKSkpOworCS8qIE5vIGRhdGEgdHJhbnNmZXIgKi8KKwlkYXRhX2J5dGVzID0gc2NzaV9idWZmbGVuKGNtZCk7CisJaWYgKCFkYXRhX2J5dGVzIHx8IGNtZC0+c2NfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX05PTkUpIHsKKwkJY21kX3BrdC0+Ynl0ZV9jb3VudCA9IF9fY29uc3RhbnRfY3B1X3RvX2xlMzIoMCk7CisJCXJldHVybiBRTEFfU1VDQ0VTUzsKKwl9CiAKIAljbWRfcGt0LT52cF9pbmRleCA9IHNwLT5mY3BvcnQtPnZwX2lkeDsKIApAQCAtMTA1Niw4ICsxMDU2LDYgQEAKIAogCS8qIERldGVybWluZSBTQ1NJIGNvbW1hbmQgbGVuZ3RoIC0tIGFsaWduIHRvIDQgYnl0ZSBib3VuZGFyeSAqLwogCWlmIChjbWQtPmNtZF9sZW4gPiAxNikgewotCQlERUJVRzE4KHByaW50ayhLRVJOX0lORk8gIiVzKCk6ICoqKiogU0NTSSBDTUQgPiAxNlxuIiwKLQkJICAgIF9fZnVuY19fKSk7CiAJCWFkZGl0aW9uYWxfZmNwY2RiX2xlbiA9IGNtZC0+Y21kX2xlbiAtIDE2OwogCQlpZiAoKGNtZC0+Y21kX2xlbiAlIDQpICE9IDApIHsKIAkJCS8qIFNDU0kgY21kID4gMTYgYnl0ZXMgbXVzdCBiZSBtdWx0aXBsZSBvZiA0ICovCkBAIC0xMTA4LDExICsxMTA2LDYgQEAKIAogCWNtZF9wa3QtPmZjcF9yc3BfZHNlZ19sZW4gPSAwOyAvKiBMZXQgcmVzcG9uc2UgY29tZSBpbiBzdGF0dXMgaW9jYiAqLwogCi0JREVCVUcxOChwcmludGsoS0VSTl9JTkZPICIlcyglbGQpOiBUb3RhbCBTRyhzKSBFbnRyaWVzICVkLCBEYXRhIgotCSAgICAiZW50cmllcyAlZCwgZGF0YSBieXRlcyAlZCwgUHJvdGVjdGlvbiBlbnRyaWVzICVkXG4iLAotCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCB0b3RfZHNkcywgKHRvdF9kc2RzLXRvdF9wcm90X2RzZHMpLAotCSAgICBkYXRhX2J5dGVzLCB0b3RfcHJvdF9kc2RzKSk7Ci0KIAkvKiBDb21wdXRlIGRpZiBsZW4gYW5kIGFkanVzdCBkYXRhIGxlbiB0byBpbmN1ZGUgcHJvdGVjdGlvbiAqLwogCXRvdGFsX2J5dGVzID0gZGF0YV9ieXRlczsKIAlkaWZfYnl0ZXMgPSAwOwpAQCAtMTE1MCwxNCArMTE0Myw3IEBACiAJICAgIGFkZGl0aW9uYWxfZmNwY2RiX2xlbik7CiAJKmZjcF9kbCA9IGh0b25sKHRvdGFsX2J5dGVzKTsKIAotCURFQlVHMTgocHJpbnRrKEtFUk5fSU5GTyAiJXMoJWxkKTogZGlmIGJ5dGVzID0gMHgleCAoJWQpLCB0b3RhbCBieXRlcyIKLQkgICAgIiA9IDB4JXggKCVkKSwgZGF0IGJsb2NrIHNpemUgPTB4JXggKCVkKVxuIiwgX19mdW5jX18sCi0JICAgIHZoYS0+aG9zdF9ubywgZGlmX2J5dGVzLCBkaWZfYnl0ZXMsIHRvdGFsX2J5dGVzLCB0b3RhbF9ieXRlcywKLQkgICAgY3JjX2N0eF9wa3QtPmJsa19zaXplLCBjcmNfY3R4X3BrdC0+YmxrX3NpemUpKTsKLQogCWlmICghZGF0YV9ieXRlcyB8fCBjbWQtPnNjX2RhdGFfZGlyZWN0aW9uID09IERNQV9OT05FKSB7Ci0JCURFQlVHMTgocHJpbnRrKEtFUk5fSU5GTyAiJXM6IFplcm8gZGF0YSBieXRlcyBvciBETUEtTk9ORSAlZFxuIiwKLQkJICAgIF9fZnVuY19fLCBkYXRhX2J5dGVzKSk7CiAJCWNtZF9wa3QtPmJ5dGVfY291bnQgPSBfX2NvbnN0YW50X2NwdV90b19sZTMyKDApOwogCQlyZXR1cm4gUUxBX1NVQ0NFU1M7CiAJfQpAQCAtMTE4Miw4ICsxMTY4LDYgQEAKIAlyZXR1cm4gUUxBX1NVQ0NFU1M7CiAKIGNyY19xdWV1aW5nX2Vycm9yOgotCURFQlVHMTgocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCSAgICAiQ01EIHNlbnQgRkFJTEVEIGNyY19xIGVycm9yOnNwID0gJXBcbiIsIHNwKSk7CiAJLyogQ2xlYW51cCB3aWxsIGJlIHBlcmZvcm1lZCBieSB0aGUgY2FsbGVyICovCiAKIAlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKQEAgLTEyMjUsOCArMTIwOSw4IEBACiAKIAkvKiBTZW5kIG1hcmtlciBpZiByZXF1aXJlZCAqLwogCWlmICh2aGEtPm1hcmtlcl9uZWVkZWQgIT0gMCkgewotCQlpZiAocWxhMngwMF9tYXJrZXIodmhhLCByZXEsIHJzcCwgMCwgMCwgTUtfU1lOQ19BTEwpCi0JCQkJCQkJIT0gUUxBX1NVQ0NFU1MpCisJCWlmIChxbGEyeDAwX21hcmtlcih2aGEsIHJlcSwgcnNwLCAwLCAwLCBNS19TWU5DX0FMTCkgIT0KKwkJICAgIFFMQV9TVUNDRVNTKQogCQkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJCXZoYS0+bWFya2VyX25lZWRlZCA9IDA7CiAJfQpAQCAtMTI0Myw4ICsxMjI3LDkgQEAKIAkJaWYgKCFyZXEtPm91dHN0YW5kaW5nX2NtZHNbaGFuZGxlXSkKIAkJCWJyZWFrOwogCX0KLQlpZiAoaW5kZXggPT0gTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTKQorCWlmIChpbmRleCA9PSBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFMpIHsKIAkJZ290byBxdWV1aW5nX2Vycm9yOworCX0KIAogCS8qIE1hcCB0aGUgc2cgdGFibGUgc28gd2UgaGF2ZSBhbiBhY2N1cmF0ZSBjb3VudCBvZiBzZyBlbnRyaWVzIG5lZWRlZCAqLwogCWlmIChzY3NpX3NnX2NvdW50KGNtZCkpIHsKQEAgLTEyNTYsOCArMTI0MSw3IEBACiAJCW5zZWcgPSAwOwogCiAJdG90X2RzZHMgPSBuc2VnOwotCi0JcmVxX2NudCA9IHFsYTI0eHhfY2FsY19pb2Nicyh0b3RfZHNkcyk7CisJcmVxX2NudCA9IHFsYTI0eHhfY2FsY19pb2Nicyh2aGEsIHRvdF9kc2RzKTsKIAlpZiAocmVxLT5jbnQgPCAocmVxX2NudCArIDIpKSB7CiAJCWNudCA9IFJEX1JFR19EV09SRF9SRUxBWEVEKHJlcS0+cmVxX3Ffb3V0KTsKIApAQCAtMTMyMiw3ICsxMzA2LDYgQEAKIAkvKiBTcGVjaWZ5IHJlc3BvbnNlIHF1ZXVlIG51bWJlciB3aGVyZSBjb21wbGV0aW9uIHNob3VsZCBoYXBwZW4gKi8KIAljbWRfcGt0LT5lbnRyeV9zdGF0dXMgPSAodWludDhfdCkgcnNwLT5pZDsKIAl3bWIoKTsKLQogCS8qIEFkanVzdCByaW5nIGluZGV4LiAqLwogCXJlcS0+cmluZ19pbmRleCsrOwogCWlmIChyZXEtPnJpbmdfaW5kZXggPT0gcmVxLT5sZW5ndGgpIHsKQEAgLTE1MzQsOSArMTUxNyw2IEBACiAJLyogQ2xlYW51cCB3aWxsIGJlIHBlcmZvcm1lZCBieSB0aGUgY2FsbGVyIChxdWV1ZWNvbW1hbmQpICovCiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwotCi0JREVCVUcxOChxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JICAgICJDTUQgc2VudCBGQUlMRUQgU0NTSSBwcm90X29wOiUwMnhcbiIsIHNjc2lfZ2V0X3Byb3Rfb3AoY21kKSkpOwogCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogfQogCkBAIC0xNTgxLDggKzE1NjEsMTEgQEAKIAkJaWYgKCFyZXEtPm91dHN0YW5kaW5nX2NtZHNbaGFuZGxlXSkKIAkJCWJyZWFrOwogCX0KLQlpZiAoaW5kZXggPT0gTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTKQorCWlmIChpbmRleCA9PSBNQVhfT1VUU1RBTkRJTkdfQ09NTUFORFMpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzAwYiwKKwkJICAgICJObyByb29tIG9uIG91c3RhbmRpbmcgY21kIGFycmF5LlxuIik7CiAJCWdvdG8gcXVldWluZ19lcnJvcjsKKwl9CiAKIAkvKiBQcmVwIGNvbW1hbmQgYXJyYXkuICovCiAJcmVxLT5jdXJyZW50X291dHN0YW5kaW5nX2NtZCA9IGhhbmRsZTsKQEAgLTE5OTksOCArMTk4MiwxMSBAQAogCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCXBrdCA9IHFsYTJ4MDBfYWxsb2NfaW9jYnMoc3AtPmZjcG9ydC0+dmhhLCBzcCk7Ci0JaWYgKCFwa3QpCisJaWYgKCFwa3QpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCBzcC0+ZmNwb3J0LT52aGEsIDB4NzAwYywKKwkJICAgICJxbGEyeDAwX2FsbG9jX2lvY2JzIGZhaWxlZC5cbiIpOwogCQlnb3RvIGRvbmU7CisJfQogCiAJcnZhbCA9IFFMQV9TVUNDRVNTOwogCXN3aXRjaCAoY3R4LT50eXBlKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMKaW5kZXggYWU4ZTI5OC4uYjE2Yjc3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYwpAQCAtNDUsNyArNDUsNyBAQAogCXJzcCA9IChzdHJ1Y3QgcnNwX3F1ZSAqKSBkZXZfaWQ7CiAJaWYgKCFyc3ApIHsKIAkJcHJpbnRrKEtFUk5fSU5GTwotCQkgICAgIiVzKCk6IE5VTEwgcmVzcG9uc2UgcXVldWUgcG9pbnRlclxuIiwgX19mdW5jX18pOworCQkgICAgIiVzKCk6IE5VTEwgcmVzcG9uc2UgcXVldWUgcG9pbnRlci5cbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIChJUlFfTk9ORSk7CiAJfQogCkBAIC05MSw5ICs5MSw5IEBACiAJCQkJcWxhMngwMF9hc3luY19ldmVudCh2aGEsIHJzcCwgbWIpOwogCQkJfSBlbHNlIHsKIAkJCQkvKkVNUFRZKi8KLQkJCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFVucmVjb2duaXplZCAiCi0JCQkJICAgICJpbnRlcnJ1cHQgdHlwZSAoJWQpLlxuIiwKLQkJCQkgICAgdmhhLT5ob3N0X25vLCBtYlswXSkpOworCQkJCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDI1LAorCQkJCSAgICAiVW5yZWNvZ25pemVkIGludGVycnVwdCB0eXBlICglZCkuXG4iLAorCQkJCSAgICBtYlswXSk7CiAJCQl9CiAJCQkvKiBSZWxlYXNlIG1haWxib3ggcmVnaXN0ZXJzLiAqLwogCQkJV1JUX1JFR19XT1JEKCZyZWctPnNlbWFwaG9yZSwgMCk7CkBAIC0xNDIsNyArMTQyLDcgQEAKIAlyc3AgPSAoc3RydWN0IHJzcF9xdWUgKikgZGV2X2lkOwogCWlmICghcnNwKSB7CiAJCXByaW50ayhLRVJOX0lORk8KLQkJICAgICIlcygpOiBOVUxMIHJlc3BvbnNlIHF1ZXVlIHBvaW50ZXJcbiIsIF9fZnVuY19fKTsKKwkJICAgICIlcygpOiBOVUxMIHJlc3BvbnNlIHF1ZXVlIHBvaW50ZXIuXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiAoSVJRX05PTkUpOwogCX0KIApAQCAtMTYwLDExICsxNjAsMTMgQEAKIAogCQkJaGNjciA9IFJEX1JFR19XT1JEKCZyZWctPmhjY3IpOwogCQkJaWYgKGhjY3IgJiAoQklUXzE1IHwgQklUXzEzIHwgQklUXzExIHwgQklUXzgpKQotCQkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlBhcml0eSBlcnJvciAtLSAiCi0JCQkJICAgICJIQ0NSPSV4LCBEdW1waW5nIGZpcm13YXJlIVxuIiwgaGNjcik7CisJCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NTAyNiwKKwkJCQkgICAgIlBhcml0eSBlcnJvciAtLSBIQ0NSPSV4LCBEdW1waW5nICIKKwkJCQkgICAgImZpcm13YXJlLlxuIiwgaGNjcik7CiAJCQllbHNlCi0JCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiUklTQyBwYXVzZWQgLS0gIgotCQkJCSAgICAiSENDUj0leCwgRHVtcGluZyBmaXJtd2FyZSFcbiIsIGhjY3IpOworCQkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDUwMjcsCisJCQkJICAgICJSSVNDIHBhdXNlZCAtLSBIQ0NSPSV4LCBEdW1waW5nICIKKwkJCQkgICAgImZpcm13YXJlLlxuIiwgaGNjcik7CiAKIAkJCS8qCiAJCQkgKiBJc3N1ZSBhICJIQVJEIiByZXNldCBpbiBvcmRlciBmb3IgdGhlIFJJU0MKQEAgLTIxMyw5ICsyMTUsOCBAQAogCQkJcWxhMngwMF9hc3luY19ldmVudCh2aGEsIHJzcCwgbWIpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6Ci0JCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFVucmVjb2duaXplZCBpbnRlcnJ1cHQgdHlwZSAiCi0JCQkgICAgIiglZCkuXG4iLAotCQkJICAgIHZoYS0+aG9zdF9ubywgc3RhdCAmIDB4ZmYpKTsKKwkJCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDI4LAorCQkJICAgICJVbnJlY29nbml6ZWQgaW50ZXJydXB0IHR5cGUgKCVkKS5cbiIsIHN0YXQgJiAweGZmKTsKIAkJCWJyZWFrOwogCQl9CiAJCVdSVF9SRUdfV09SRCgmcmVnLT5oY2NyLCBIQ0NSX0NMUl9SSVNDX0lOVCk7CkBAIC0yNjIsMTEgKzI2MywxMSBAQAogCX0KIAogCWlmIChoYS0+bWNwKSB7Ci0JCURFQlVHMyhwcmludGsoIiVzKCVsZCk6IEdvdCBtYWlsYm94IGNvbXBsZXRpb24uIGNtZD0leC5cbiIsCi0JCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBoYS0+bWNwLT5tYlswXSkpOworCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTAwMCwKKwkJICAgICJHb3QgbWJ4IGNvbXBsZXRpb24uIGNtZD0leC5cbiIsIGhhLT5tY3AtPm1iWzBdKTsKIAl9IGVsc2UgewotCQlERUJVRzJfMyhwcmludGsoIiVzKCVsZCk6IE1CWCBwb2ludGVyIEVSUk9SIVxuIiwKLQkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwMDEsCisJCSAgICAiTUJYIHBvaW50ZXIgRVJST1IuXG4iKTsKIAl9CiB9CiAKQEAgLTI4NSwyMiArMjg2LDI0IEBACiAJZm9yIChjbnQgPSAwOyBjbnQgPCBRTEFfSURDX0FDS19SRUdTOyBjbnQrKywgd3B0cisrKQogCQltYltjbnRdID0gUkRfUkVHX1dPUkQod3B0cik7CiAKLQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEludGVyLURyaXZlciBDb21tdWNhdGlvbiAlcyAtLSAiCi0JICAgICIlMDR4ICUwNHggJTA0eCAlMDR4ICUwNHggJTA0eCAlMDR4LlxuIiwgdmhhLT5ob3N0X25vLAotCSAgICBldmVudFthZW4gJiAweGZmXSwKLQkgICAgbWJbMF0sIG1iWzFdLCBtYlsyXSwgbWJbM10sIG1iWzRdLCBtYls1XSwgbWJbNl0pKTsKKwlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTAyMSwKKwkgICAgIkludGVyLURyaXZlciBDb21tdWNhdGlvbiAlcyAtLSAiCisJICAgICIlMDR4ICUwNHggJTA0eCAlMDR4ICUwNHggJTA0eCAlMDR4LlxuIiwKKwkgICAgZXZlbnRbYWVuICYgMHhmZl0sIG1iWzBdLCBtYlsxXSwgbWJbMl0sIG1iWzNdLAorCSAgICBtYls0XSwgbWJbNV0sIG1iWzZdKTsKIAogCS8qIEFja25vd2xlZGdlbWVudCBuZWVkZWQ/IFtOb3RpZnkgJiYgbm9uLXplcm8gdGltZW91dF0uICovCiAJdGltZW91dCA9IChkZXNjciA+PiA4KSAmIDB4ZjsKIAlpZiAoYWVuICE9IE1CQV9JRENfTk9USUZZIHx8ICF0aW1lb3V0KQogCQlyZXR1cm47CiAKLQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEludGVyLURyaXZlciBDb21tdWNhdGlvbiAlcyAtLSAiCi0JICAgICJBQ0sgdGltZW91dD0lZC5cbiIsIHZoYS0+aG9zdF9ubywgZXZlbnRbYWVuICYgMHhmZl0sIHRpbWVvdXQpKTsKKwlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTAyMiwKKwkgICAgIkludGVyLURyaXZlciBDb21tdWNhdGlvbiAlcyAtLSBBQ0sgdGltZW91dD0lZC5cbiIsCisJICAgIHZoYS0+aG9zdF9ubywgZXZlbnRbYWVuICYgMHhmZl0sIHRpbWVvdXQpOwogCiAJcnZhbCA9IHFsYTJ4MDBfcG9zdF9pZGNfYWNrX3dvcmsodmhhLCBtYik7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpCi0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCB2aGEtPmh3LAorCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg1MDIzLAogCQkgICAgIklEQyBmYWlsZWQgdG8gcG9zdCBBQ0suXG4iKTsKIH0KIApAQCAtMzkzLDE1ICszOTYsMTUgQEAKIAkJYnJlYWs7CiAKIAljYXNlIE1CQV9SRVNFVDoJCQkvKiBSZXNldCAqLwotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEFzeW5jaHJvbm91cyBSRVNFVC5cbiIsCi0JCQl2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwMDIsCisJCSAgICAiQXN5bmNocm9ub3VzIFJFU0VULlxuIik7CiAKIAkJc2V0X2JpdChSRVNFVF9NQVJLRVJfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwogCQlicmVhazsKIAogCWNhc2UgTUJBX1NZU1RFTV9FUlI6CQkvKiBTeXN0ZW0gRXJyb3IgKi8KIAkJbWJ4ID0gSVNfUUxBODFYWChoYSkgPyBSRF9SRUdfV09SRCgmcmVnMjQtPm1haWxib3g3KSA6IDA7Ci0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NTAwMywKIAkJICAgICJJU1AgU3lzdGVtIEVycm9yIC0gbWJ4MT0leGggbWJ4Mj0leGggbWJ4Mz0leGggIgogCQkgICAgIm1ieDc9JXhoLlxuIiwgbWJbMV0sIG1iWzJdLCBtYlszXSwgbWJ4KTsKIApAQCAtNDA5LDcgKzQxMiw3IEBACiAKIAkJaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkpIHsKIAkJCWlmIChtYlsxXSA9PSAwICYmIG1iWzJdID09IDApIHsKLQkJCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwKKwkJCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4NTAwNCwKIAkJCQkgICAgIlVucmVjb3ZlcmFibGUgSGFyZHdhcmUgRXJyb3I6IGFkYXB0ZXIgIgogCQkJCSAgICAibWFya2VkIE9GRkxJTkUhXG4iKTsKIAkJCQl2aGEtPmZsYWdzLm9ubGluZSA9IDA7CkBAIC00MjIsNyArNDI1LDcgQEAKIAkJCQlzZXRfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CiAJCQl9CiAJCX0gZWxzZSBpZiAobWJbMV0gPT0gMCkgewotCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDUwMDUsCiAJCQkgICAgIlVucmVjb3ZlcmFibGUgSGFyZHdhcmUgRXJyb3I6IGFkYXB0ZXIgbWFya2VkICIKIAkJCSAgICAiT0ZGTElORSFcbiIpOwogCQkJdmhhLT5mbGFncy5vbmxpbmUgPSAwOwpAQCAtNDMxLDMxICs0MzQsMjcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIE1CQV9SRVFfVFJBTlNGRVJfRVJSOgkvKiBSZXF1ZXN0IFRyYW5zZmVyIEVycm9yICovCi0JCURFQlVHMihwcmludGsoInNjc2koJWxkKTogSVNQIFJlcXVlc3QgVHJhbnNmZXIgRXJyb3IgKCV4KS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sIG1iWzFdKSk7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJJU1AgUmVxdWVzdCBUcmFuc2ZlciBFcnJvciAoJXgpLlxuIiwgbWJbMV0pOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg1MDA2LAorCQkgICAgIklTUCBSZXF1ZXN0IFRyYW5zZmVyIEVycm9yICgleCkuXG4iLCAgbWJbMV0pOwogCiAJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAkJYnJlYWs7CiAKIAljYXNlIE1CQV9SU1BfVFJBTlNGRVJfRVJSOgkvKiBSZXNwb25zZSBUcmFuc2ZlciBFcnJvciAqLwotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IElTUCBSZXNwb25zZSBUcmFuc2ZlciBFcnJvci5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiSVNQIFJlc3BvbnNlIFRyYW5zZmVyIEVycm9yLlxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDUwMDcsCisJCSAgICAiSVNQIFJlc3BvbnNlIFRyYW5zZmVyIEVycm9yLlxuIik7CiAKIAkJc2V0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwogCQlicmVhazsKIAogCWNhc2UgTUJBX1dBS0VVUF9USFJFUzoJCS8qIFJlcXVlc3QgUXVldWUgV2FrZS11cCAqLwotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEFzeW5jaHJvbm91cyBXQUtFVVBfVEhSRVMuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDA4LAorCQkgICAgIkFzeW5jaHJvbm91cyBXQUtFVVBfVEhSRVMuXG4iKTsKIAkJYnJlYWs7CiAKIAljYXNlIE1CQV9MSVBfT0NDVVJSRUQ6CQkvKiBMb29wIEluaXRpYWxpemF0aW9uIFByb2NlZHVyZSAqLwotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IExJUCBvY2N1cnJlZCAoJXgpLlxuIiwgdmhhLT5ob3N0X25vLAotCQkgICAgbWJbMV0pKTsKLQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiTElQIG9jY3VycmVkICgleCkuXG4iLCBtYlsxXSk7CisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDUwMDksCisJCSAgICAiTElQIG9jY3VycmVkICgleCkuXG4iLCBtYlsxXSk7CiAKIAkJaWYgKGF0b21pY19yZWFkKCZ2aGEtPmxvb3Bfc3RhdGUpICE9IExPT1BfRE9XTikgewogCQkJYXRvbWljX3NldCgmdmhhLT5sb29wX3N0YXRlLCBMT09QX0RPV04pOwpAQCAtNDg4LDEwICs0ODcsOCBAQAogCQkJaGEtPmxpbmtfZGF0YV9yYXRlID0gbWJbMV07CiAJCX0KIAotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEFzeW5jaHJvbm91cyBMT09QIFVQICglcyBHYnBzKS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sIGxpbmtfc3BlZWQpKTsKLQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiTE9PUCBVUCBkZXRlY3RlZCAoJXMgR2JwcykuXG4iLAotCQkgICAgbGlua19zcGVlZCk7CisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDUwMGEsCisJCSAgICAiTE9PUCBVUCBkZXRlY3RlZCAoJXMgR2JwcykuXG4iLCBsaW5rX3NwZWVkKTsKIAogCQl2aGEtPmZsYWdzLm1hbmFnZW1lbnRfc2VydmVyX2xvZ2dlZF9pbiA9IDA7CiAJCXFsYTJ4MDBfcG9zdF9hZW5fd29yayh2aGEsIEZDSF9FVlRfTElOS1VQLCBoYS0+bGlua19kYXRhX3JhdGUpOwpAQCAtNTAwLDEyICs0OTcsOSBAQAogCWNhc2UgTUJBX0xPT1BfRE9XTjoJCS8qIExvb3AgRG93biBFdmVudCAqLwogCQltYnggPSBJU19RTEE4MVhYKGhhKSA/IFJEX1JFR19XT1JEKCZyZWcyNC0+bWFpbGJveDQpIDogMDsKIAkJbWJ4ID0gSVNfUUxBODJYWChoYSkgPyBSRF9SRUdfV09SRCgmcmVnODItPm1haWxib3hfb3V0WzRdKSA6IG1ieDsKLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBBc3luY2hyb25vdXMgTE9PUCBET1dOICIKLQkJICAgICIoJXggJXggJXggJXgpLlxuIiwgdmhhLT5ob3N0X25vLCBtYlsxXSwgbWJbMl0sIG1iWzNdLAotCQkgICAgbWJ4KSk7Ci0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJICAgICJMT09QIERPV04gZGV0ZWN0ZWQgKCV4ICV4ICV4ICV4KS5cbiIsIG1iWzFdLCBtYlsyXSwgbWJbM10sCi0JCSAgICBtYngpOworCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg1MDBiLAorCQkgICAgIkxPT1AgRE9XTiBkZXRlY3RlZCAoJXggJXggJXggJXgpLlxuIiwKKwkJICAgIG1iWzFdLCBtYlsyXSwgbWJbM10sIG1ieCk7CiAKIAkJaWYgKGF0b21pY19yZWFkKCZ2aGEtPmxvb3Bfc3RhdGUpICE9IExPT1BfRE9XTikgewogCQkJYXRvbWljX3NldCgmdmhhLT5sb29wX3N0YXRlLCBMT09QX0RPV04pOwpAQCAtNTI1LDkgKzUxOSw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBNQkFfTElQX1JFU0VUOgkJLyogTElQIHJlc2V0IG9jY3VycmVkICovCi0JCURFQlVHMihwcmludGsoInNjc2koJWxkKTogQXN5bmNocm9ub3VzIExJUCBSRVNFVCAoJXgpLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubywgbWJbMV0pKTsKLQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg1MDBjLAogCQkgICAgIkxJUCByZXNldCBvY2N1cnJlZCAoJXgpLlxuIiwgbWJbMV0pOwogCiAJCWlmIChhdG9taWNfcmVhZCgmdmhhLT5sb29wX3N0YXRlKSAhPSBMT09QX0RPV04pIHsKQEAgLTU1NCwxNCArNTQ2LDE1IEBACiAJCQlicmVhazsKIAogCQlpZiAoSVNfUUxBOFhYWF9UWVBFKGhhKSkgewotCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBEQ0JYIENvbXBsZXRlZCAtLSAlMDR4ICUwNHggIgotCQkJICAgICIlMDR4XG4iLCB2aGEtPmhvc3Rfbm8sIG1iWzFdLCBtYlsyXSwgbWJbM10pKTsKKwkJCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDBkLAorCQkJICAgICJEQ0JYIENvbXBsZXRlZCAtLSAlMDR4ICUwNHggJTA0eC5cbiIsCisJCQkgICAgbWJbMV0sIG1iWzJdLCBtYlszXSk7CiAJCQlpZiAoaGEtPm5vdGlmeV9kY2J4X2NvbXApCiAJCQkJY29tcGxldGUoJmhhLT5kY2J4X2NvbXApOwogCiAJCX0gZWxzZQotCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBBc3luY2hyb25vdXMgUDJQIE1PREUgIgotCQkJICAgICJyZWNlaXZlZC5cbiIsIHZoYS0+aG9zdF9ubykpOworCQkJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwMGUsCisJCQkgICAgIkFzeW5jaHJvbm91cyBQMlAgTU9ERSByZWNlaXZlZC5cbiIpOwogCiAJCS8qCiAJCSAqIFVudGlsIHRoZXJlJ3MgYSB0cmFuc2l0aW9uIGZyb20gbG9vcCBkb3duIHRvIGxvb3AgdXAsIHRyZWF0CkBAIC01OTQsMTAgKzU4Nyw3IEBACiAJCWlmIChJU19RTEEyMTAwKGhhKSkKIAkJCWJyZWFrOwogCi0JCURFQlVHMihwcmludGsoInNjc2koJWxkKTogQXN5bmNocm9ub3VzIENoYW5nZSBJbiBDb25uZWN0aW9uICIKLQkJICAgICJyZWNlaXZlZC5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKLQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg1MDBmLAogCQkgICAgIkNvbmZpZ3VyYXRpb24gY2hhbmdlIGRldGVjdGVkOiB2YWx1ZT0leC5cbiIsIG1iWzFdKTsKIAogCQlpZiAoYXRvbWljX3JlYWQoJnZoYS0+bG9vcF9zdGF0ZSkgIT0gTE9PUF9ET1dOKSB7CkBAIC02NDAsMTEgKzYzMCw5IEBACiAKIAkJLyogR2xvYmFsIGV2ZW50IC0tIHBvcnQgbG9nb3V0IG9yIHBvcnQgdW5hdmFpbGFibGUuICovCiAJCWlmIChtYlsxXSA9PSAweGZmZmYgJiYgbWJbMl0gPT0gMHg3KSB7Ci0JCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEFzeW5jaHJvbm91cyBQT1JUIFVQREFURS5cbiIsCi0JCQkgICAgdmhhLT5ob3N0X25vKSk7Ci0JCQlERUJVRyhwcmludGsoS0VSTl9JTkZPCi0JCQkgICAgInNjc2koJWxkKTogUG9ydCB1bmF2YWlsYWJsZSAlMDR4ICUwNHggJTA0eC5cbiIsCi0JCQkgICAgdmhhLT5ob3N0X25vLCBtYlsxXSwgbWJbMl0sIG1iWzNdKSk7CisJCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTAxMCwKKwkJCSAgICAiUG9ydCB1bmF2YWlsYWJsZSAlMDR4ICUwNHggJTA0eC5cbiIsCisJCQkgICAgbWJbMV0sIG1iWzJdLCBtYlszXSk7CiAKIAkJCWlmIChhdG9taWNfcmVhZCgmdmhhLT5sb29wX3N0YXRlKSAhPSBMT09QX0RPV04pIHsKIAkJCQlhdG9taWNfc2V0KCZ2aGEtPmxvb3Bfc3RhdGUsIExPT1BfRE9XTik7CkBAIC02NzQsMTcgKzY2MiwxNSBAQAogCQlhdG9taWNfc2V0KCZ2aGEtPmxvb3BfZG93bl90aW1lciwgMCk7CiAJCWlmIChhdG9taWNfcmVhZCgmdmhhLT5sb29wX3N0YXRlKSAhPSBMT09QX0RPV04gJiYKIAkJICAgIGF0b21pY19yZWFkKCZ2aGEtPmxvb3Bfc3RhdGUpICE9IExPT1BfREVBRCkgewotCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBBc3luY2hyb25vdXMgUE9SVCBVUERBVEUgIgotCQkJICAgICJpZ25vcmVkICUwNHgvJTA0eC8lMDR4LlxuIiwgdmhhLT5ob3N0X25vLCBtYlsxXSwKLQkJCSAgICBtYlsyXSwgbWJbM10pKTsKKwkJCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDExLAorCQkJICAgICJBc3luY2hyb25vdXMgUE9SVCBVUERBVEUgaWdub3JlZCAlMDR4LyUwNHgvJTA0eC5cbiIsCisJCQkgICAgbWJbMV0sIG1iWzJdLCBtYlszXSk7CiAJCQlicmVhazsKIAkJfQogCi0JCURFQlVHMihwcmludGsoInNjc2koJWxkKTogQXN5bmNocm9ub3VzIFBPUlQgVVBEQVRFLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubykpOwotCQlERUJVRyhwcmludGsoS0VSTl9JTkZPCi0JCSAgICAic2NzaSglbGQpOiBQb3J0IGRhdGFiYXNlIGNoYW5nZWQgJTA0eCAlMDR4ICUwNHguXG4iLAotCQkgICAgdmhhLT5ob3N0X25vLCBtYlsxXSwgbWJbMl0sIG1iWzNdKSk7CisJCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDEyLAorCQkgICAgIlBvcnQgZGF0YWJhc2UgY2hhbmdlZCAlMDR4ICUwNHggJTA0eC5cbiIsCisJCSAgICBtYlsxXSwgbWJbMl0sIG1iWzNdKTsKIAogCQkvKgogCQkgKiBNYXJrIGFsbCBkZXZpY2VzIGFzIG1pc3Npbmcgc28gd2Ugd2lsbCBsb2dpbiBhZ2Fpbi4KQEAgLTcwNywyMCArNjkzLDE3IEBACiAJCWlmIChoYS0+ZmxhZ3MubnBpdl9zdXBwb3J0ZWQgJiYgdmhhLT52cF9pZHggIT0gKG1iWzNdICYgMHhmZikpCiAJCQlicmVhazsKIAotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEFzeW5jaHJvbm91cyBSU0NSIFVQREFURS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKLQkJREVCVUcocHJpbnRrKEtFUk5fSU5GTwotCQkgICAgInNjc2koJWxkKTogUlNDTiBkYXRhYmFzZSBjaGFuZ2VkIC0tICUwNHggJTA0eCAlMDR4LlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubywgbWJbMV0sIG1iWzJdLCBtYlszXSkpOworCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTAxMywKKwkJICAgICJSU0NOIGRhdGFiYXNlIGNoYW5nZWQgLS0gJTA0eCAlMDR4ICUwNHguXG4iLAorCQkgICAgbWJbMV0sIG1iWzJdLCBtYlszXSk7CiAKIAkJcnNjbl9lbnRyeSA9ICgobWJbMV0gJiAweGZmKSA8PCAxNikgfCBtYlsyXTsKIAkJaG9zdF9waWQgPSAodmhhLT5kX2lkLmIuZG9tYWluIDw8IDE2KSB8ICh2aGEtPmRfaWQuYi5hcmVhIDw8IDgpCiAJCQkJfCB2aGEtPmRfaWQuYi5hbF9wYTsKIAkJaWYgKHJzY25fZW50cnkgPT0gaG9zdF9waWQpIHsKLQkJCURFQlVHKHByaW50ayhLRVJOX0lORk8KLQkJCSAgICAic2NzaSglbGQpOiBJZ25vcmluZyBSU0NOIHVwZGF0ZSB0byBsb2NhbCBob3N0ICIKLQkJCSAgICAicG9ydCBJRCAoJTA2eClcbiIsCi0JCQkgICAgdmhhLT5ob3N0X25vLCBob3N0X3BpZCkpOworCQkJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwMTQsCisJCQkgICAgIklnbm9yaW5nIFJTQ04gdXBkYXRlIHRvIGxvY2FsIGhvc3QgIgorCQkJICAgICJwb3J0IElEICglMDZ4KS5cbiIsIGhvc3RfcGlkKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTc0Nyw4ICs3MzAsOCBAQAogCiAJLyogY2FzZSBNQkFfUklPX1JFU1BPTlNFOiAqLwogCWNhc2UgTUJBX1pJT19SRVNQT05TRToKLQkJREVCVUczKHByaW50aygic2NzaSglbGQpOiBbUnxaXUlPIHVwZGF0ZSBjb21wbGV0aW9uLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTAxNSwKKwkJICAgICJbUnxaXUlPIHVwZGF0ZSBjb21wbGV0aW9uLlxuIik7CiAKIAkJaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkpCiAJCQlxbGEyNHh4X3Byb2Nlc3NfcmVzcG9uc2VfcXVldWUodmhhLCByc3ApOwpAQCAtNzU3LDYxICs3NDAsNjggQEAKIAkJYnJlYWs7CiAKIAljYXNlIE1CQV9ESVNDQVJEX1JORF9GUkFNRToKLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBEaXNjYXJkIFJORCBGcmFtZSAtLSAlMDR4ICUwNHggIgotCQkgICAgIiUwNHguXG4iLCB2aGEtPmhvc3Rfbm8sIG1iWzFdLCBtYlsyXSwgbWJbM10pKTsKKwkJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwMTYsCisJCSAgICAiRGlzY2FyZCBSTkQgRnJhbWUgLS0gJTA0eCAlMDR4ICUwNHguXG4iLAorCQkgICAgbWJbMV0sIG1iWzJdLCBtYlszXSk7CiAJCWJyZWFrOwogCiAJY2FzZSBNQkFfVFJBQ0VfTk9USUZJQ0FUSU9OOgotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IFRyYWNlIE5vdGlmaWNhdGlvbiAtLSAlMDR4ICUwNHguXG4iLAotCQl2aGEtPmhvc3Rfbm8sIG1iWzFdLCBtYlsyXSkpOworCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTAxNywKKwkJICAgICJUcmFjZSBOb3RpZmljYXRpb24gLS0gJTA0eCAlMDR4LlxuIiwgbWJbMV0sIG1iWzJdKTsKIAkJYnJlYWs7CiAKIAljYXNlIE1CQV9JU1A4NFhYX0FMRVJUOgotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IElTUDg0WFggQWxlcnQgTm90aWZpY2F0aW9uIC0tICIKLQkJICAgICIlMDR4ICUwNHggJTA0eFxuIiwgdmhhLT5ob3N0X25vLCBtYlsxXSwgbWJbMl0sIG1iWzNdKSk7CisJCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDE4LAorCQkgICAgIklTUDg0WFggQWxlcnQgTm90aWZpY2F0aW9uIC0tICUwNHggJTA0eCAlMDR4LlxuIiwKKwkJICAgIG1iWzFdLCBtYlsyXSwgbWJbM10pOwogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+Y3M4NHh4LT5hY2Nlc3NfbG9jaywgZmxhZ3MpOwogCQlzd2l0Y2ggKG1iWzFdKSB7CiAJCWNhc2UgQTg0X1BBTklDX1JFQ09WRVJZOgotCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiQWxlcnQgODRYWDogcGFuaWMgcmVjb3ZlcnkgIgotCQkJICAgICIlMDR4ICUwNHhcbiIsIG1iWzJdLCBtYlszXSk7CisJCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg1MDE5LAorCQkJICAgICJBbGVydCA4NFhYOiBwYW5pYyByZWNvdmVyeSAlMDR4ICUwNHguXG4iLAorCQkJICAgIG1iWzJdLCBtYlszXSk7CiAJCQlicmVhazsKIAkJY2FzZSBBODRfT1BfTE9HSU5fQ09NUExFVEU6CiAJCQloYS0+Y3M4NHh4LT5vcF9md192ZXJzaW9uID0gbWJbM10gPDwgMTYgfCBtYlsyXTsKLQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJBbGVydCA4NFhYOiIKLQkJCSAgICAiZmlybXdhcmUgdmVyc2lvbiAleFxuIiwgaGEtPmNzODR4eC0+b3BfZndfdmVyc2lvbikpOworCQkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4NTAxYSwKKwkJCSAgICAiQWxlcnQgODRYWDogZmlybXdhcmUgdmVyc2lvbiAleC5cbiIsCisJCQkgICAgaGEtPmNzODR4eC0+b3BfZndfdmVyc2lvbik7CiAJCQlicmVhazsKIAkJY2FzZSBBODRfRElBR19MT0dJTl9DT01QTEVURToKIAkJCWhhLT5jczg0eHgtPmRpYWdfZndfdmVyc2lvbiA9IG1iWzNdIDw8IDE2IHwgbWJbMl07Ci0JCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiQWxlcnQgODRYWDoiCi0JCQkgICAgImRpYWdub3N0aWMgZmlybXdhcmUgdmVyc2lvbiAleFxuIiwKLQkJCSAgICBoYS0+Y3M4NHh4LT5kaWFnX2Z3X3ZlcnNpb24pKTsKKwkJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDUwMWIsCisJCQkgICAgIkFsZXJ0IDg0WFg6IGRpYWdub3N0aWMgZmlybXdhcmUgdmVyc2lvbiAleC5cbiIsCisJCQkgICAgaGEtPmNzODR4eC0+ZGlhZ19md192ZXJzaW9uKTsKIAkJCWJyZWFrOwogCQljYXNlIEE4NF9HT0xEX0xPR0lOX0NPTVBMRVRFOgogCQkJaGEtPmNzODR4eC0+ZGlhZ19md192ZXJzaW9uID0gbWJbM10gPDwgMTYgfCBtYlsyXTsKIAkJCWhhLT5jczg0eHgtPmZ3X3VwZGF0ZSA9IDE7Ci0JCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiQWxlcnQgODRYWDogZ29sZCAiCi0JCQkgICAgImZpcm13YXJlIHZlcnNpb24gJXhcbiIsCi0JCQkgICAgaGEtPmNzODR4eC0+Z29sZF9md192ZXJzaW9uKSk7CisJCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg1MDFjLAorCQkJICAgICJBbGVydCA4NFhYOiBnb2xkIGZpcm13YXJlIHZlcnNpb24gJXguXG4iLAorCQkJICAgIGhhLT5jczg0eHgtPmdvbGRfZndfdmVyc2lvbik7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLAotCQkJICAgICJBbGVydCA4NHh4OiBJbnZhbGlkIEFsZXJ0ICUwNHggJTA0eCAlMDR4XG4iLAorCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NTAxZCwKKwkJCSAgICAiQWxlcnQgODR4eDogSW52YWxpZCBBbGVydCAlMDR4ICUwNHggJTA0eC5cbiIsCiAJCQkgICAgbWJbMV0sIG1iWzJdLCBtYlszXSk7CiAJCX0KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmNzODR4eC0+YWNjZXNzX2xvY2ssIGZsYWdzKTsKIAkJYnJlYWs7CiAJY2FzZSBNQkFfRENCWF9TVEFSVDoKLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBEQ0JYIFN0YXJ0ZWQgLS0gJTA0eCAlMDR4ICUwNHhcbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sIG1iWzFdLCBtYlsyXSwgbWJbM10pKTsKKwkJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwMWUsCisJCSAgICAiRENCWCBTdGFydGVkIC0tICUwNHggJTA0eCAlMDR4LlxuIiwKKwkJICAgIG1iWzFdLCBtYlsyXSwgbWJbM10pOwogCQlicmVhazsKIAljYXNlIE1CQV9EQ0JYX1BBUkFNX1VQREFURToKLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBEQ0JYIFBhcmFtZXRlcnMgVXBkYXRlZCAtLSAiCi0JCSAgICAiJTA0eCAlMDR4ICUwNHhcbiIsIHZoYS0+aG9zdF9ubywgbWJbMV0sIG1iWzJdLCBtYlszXSkpOworCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTAxZiwKKwkJICAgICJEQ0JYIFBhcmFtZXRlcnMgVXBkYXRlZCAtLSAlMDR4ICUwNHggJTA0eC5cbiIsCisJCSAgICBtYlsxXSwgbWJbMl0sIG1iWzNdKTsKIAkJYnJlYWs7CiAJY2FzZSBNQkFfRkNGX0NPTkZfRVJSOgotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6IEZDRiBDb25maWd1cmF0aW9uIEVycm9yIC0tICIKLQkJICAgICIlMDR4ICUwNHggJTA0eFxuIiwgdmhhLT5ob3N0X25vLCBtYlsxXSwgbWJbMl0sIG1iWzNdKSk7CisJCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDIwLAorCQkgICAgIkZDRiBDb25maWd1cmF0aW9uIEVycm9yIC0tICUwNHggJTA0eCAlMDR4LlxuIiwKKwkJICAgIG1iWzFdLCBtYlsyXSwgbWJbM10pOwogCQlicmVhazsKIAljYXNlIE1CQV9JRENfQ09NUExFVEU6CiAJY2FzZSBNQkFfSURDX05PVElGWToKQEAgLTgzOCwxMCArODI4LDggQEAKIAogCS8qIFZhbGlkYXRlIGhhbmRsZS4gKi8KIAlpZiAoaW5kZXggPj0gTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTKSB7Ci0JCURFQlVHMihwcmludGsoInNjc2koJWxkKTogSW52YWxpZCBTQ1NJIGNvbXBsZXRpb24gaGFuZGxlICVkLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubywgaW5kZXgpKTsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIkludmFsaWQgU0NTSSBjb21wbGV0aW9uIGhhbmRsZSAlZC5cbiIsIGluZGV4KTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MzAxNCwKKwkJICAgICJJbnZhbGlkIFNDU0kgY29tbWFuZCBpbmRleCAoJXgpLlxuIiwgaW5kZXgpOwogCiAJCWlmIChJU19RTEE4MlhYKGhhKSkKIAkJCXNldF9iaXQoRkNPRV9DVFhfUkVTRVRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpOwpAQCAtODU5LDEwICs4NDcsNyBAQAogCQlzcC0+Y21kLT5yZXN1bHQgPSBESURfT0sgPDwgMTY7CiAJCXFsYTJ4MDBfc3BfY29tcGwoaGEsIHNwKTsKIAl9IGVsc2UgewotCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCkgUmVxOiVkOiBJbnZhbGlkIElTUCBTQ1NJIGNvbXBsZXRpb24iCi0JCQkiIGhhbmRsZSgweCV4KVxuIiwgdmhhLT5ob3N0X25vLCByZXEtPmlkLCBpbmRleCkpOwotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiSW52YWxpZCBJU1AgU0NTSSBjb21wbGV0aW9uIGhhbmRsZVxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDMwMTYsICJJbnZhbGlkIFNDU0kgU1JCLlxuIik7CiAKIAkJaWYgKElTX1FMQTgyWFgoaGEpKQogCQkJc2V0X2JpdChGQ09FX0NUWF9SRVNFVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CkBAIC04ODIsOCArODY3LDggQEAKIAogCWluZGV4ID0gTFNXKHBrdC0+aGFuZGxlKTsKIAlpZiAoaW5kZXggPj0gTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICIlczogSW52YWxpZCBjb21wbGV0aW9uIGhhbmRsZSAoJXgpLlxuIiwgZnVuYywgaW5kZXgpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg1MDMxLAorCQkgICAgIkludmFsaWQgY29tbWFuZCBpbmRleCAoJXgpLlxuIiwgaW5kZXgpOwogCQlpZiAoSVNfUUxBODJYWChoYSkpCiAJCQlzZXRfYml0KEZDT0VfQ1RYX1JFU0VUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAkJZWxzZQpAQCAtODkyLDE1ICs4NzcsMTMgQEAKIAl9CiAJc3AgPSByZXEtPm91dHN0YW5kaW5nX2NtZHNbaW5kZXhdOwogCWlmICghc3ApIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIiVzOiBJbnZhbGlkIGNvbXBsZXRpb24gaGFuZGxlICgleCkgLS0gdGltZWQtb3V0LlxuIiwgZnVuYywKLQkJICAgIGluZGV4KTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NTAzMiwKKwkJICAgICJJbnZhbGlkIGNvbXBsZXRpb24gaGFuZGxlICgleCkgLS0gdGltZWQtb3V0LlxuIiwgaW5kZXgpOwogCQlyZXR1cm4gc3A7CiAJfQogCWlmIChzcC0+aGFuZGxlICE9IGluZGV4KSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICIlczogU1JCIGhhbmRsZSAoJXgpIG1pc21hdGNoICV4LlxuIiwgZnVuYywgc3AtPmhhbmRsZSwKLQkJICAgIGluZGV4KTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NTAzMywKKwkJICAgICJTUkIgaGFuZGxlICgleCkgbWlzbWF0Y2ggJXguXG4iLCBzcC0+aGFuZGxlLCBpbmRleCk7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtOTM3LDE3ICs5MjAsMTcgQEAKIAlkYXRhWzFdID0gbGlvLT51LmxvZ2lvLmZsYWdzICYgU1JCX0xPR0lOX1JFVFJJRUQgPwogCSAgICBRTEFfTE9HSU9fTE9HSU5fUkVUUklFRCA6IDA7CiAJaWYgKG1ieC0+ZW50cnlfc3RhdHVzKSB7Ci0JCURFQlVHMihwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAic2NzaSglbGQ6JXgpOiBBc3luYy0lcyBlcnJvciBlbnRyeSAtIHBvcnRpZD0lMDJ4JTAyeCUwMnggIgorCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTA0MywKKwkJICAgICJBc3luYy0lcyBlcnJvciBlbnRyeSAtIHBvcnRpZD0lMDJ4JTAyeCUwMnggIgogCQkgICAgImVudHJ5LXN0YXR1cz0leCBzdGF0dXM9JXggc3RhdGUtZmxhZz0leCAiCiAJCSAgICAic3RhdHVzLWZsYWdzPSV4LlxuIiwKLQkJICAgIGZjcG9ydC0+dmhhLT5ob3N0X25vLCBzcC0+aGFuZGxlLCB0eXBlLAotCQkgICAgZmNwb3J0LT5kX2lkLmIuZG9tYWluLCBmY3BvcnQtPmRfaWQuYi5hcmVhLAorCQkgICAgdHlwZSwgZmNwb3J0LT5kX2lkLmIuZG9tYWluLCBmY3BvcnQtPmRfaWQuYi5hcmVhLAogCQkgICAgZmNwb3J0LT5kX2lkLmIuYWxfcGEsIG1ieC0+ZW50cnlfc3RhdHVzLAogCQkgICAgbGUxNl90b19jcHUobWJ4LT5zdGF0dXMpLCBsZTE2X3RvX2NwdShtYngtPnN0YXRlX2ZsYWdzKSwKLQkJICAgIGxlMTZfdG9fY3B1KG1ieC0+c3RhdHVzX2ZsYWdzKSkpOworCQkgICAgbGUxNl90b19jcHUobWJ4LT5zdGF0dXNfZmxhZ3MpKTsKIAotCQlERUJVRzIocWxhMngwMF9kdW1wX2J1ZmZlcigodWludDhfdCAqKW1ieCwgc2l6ZW9mKCptYngpKSk7CisJCXFsX2R1bXBfYnVmZmVyKHFsX2RiZ19hc3luYyArIHFsX2RiZ19idWZmZXIsIHZoYSwgMHg1MDU3LAorCQkgICAgKHVpbnQ4X3QgKiltYngsIHNpemVvZigqbWJ4KSk7CiAKIAkJZ290byBsb2dpb19kb25lOwogCX0KQEAgLTk1NywxMiArOTQwLDEwIEBACiAJICAgIGxlMTZfdG9fY3B1KG1ieC0+bWIwKSA9PSBNQlNfQ09NTUFORF9DT01QTEVURSkKIAkJc3RhdHVzID0gMDsKIAlpZiAoIXN0YXR1cyAmJiBsZTE2X3RvX2NwdShtYngtPm1iMCkgPT0gTUJTX0NPTU1BTkRfQ09NUExFVEUpIHsKLQkJREVCVUcyKHByaW50ayhLRVJOX0RFQlVHCi0JCSAgICAic2NzaSglbGQ6JXgpOiBBc3luYy0lcyBjb21wbGV0ZSAtIHBvcnRpZD0lMDJ4JTAyeCUwMnggIgotCQkgICAgIm1ieDE9JXguXG4iLAotCQkgICAgZmNwb3J0LT52aGEtPmhvc3Rfbm8sIHNwLT5oYW5kbGUsIHR5cGUsCi0JCSAgICBmY3BvcnQtPmRfaWQuYi5kb21haW4sIGZjcG9ydC0+ZF9pZC5iLmFyZWEsCi0JCSAgICBmY3BvcnQtPmRfaWQuYi5hbF9wYSwgbGUxNl90b19jcHUobWJ4LT5tYjEpKSk7CisJCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDQ1LAorCQkgICAgIkFzeW5jLSVzIGNvbXBsZXRlIC0gcG9ydGlkPSUwMnglMDJ4JTAyeCBtYngxPSV4LlxuIiwKKwkJICAgIHR5cGUsIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwgZmNwb3J0LT5kX2lkLmIuYXJlYSwKKwkJICAgIGZjcG9ydC0+ZF9pZC5iLmFsX3BhLCBsZTE2X3RvX2NwdShtYngtPm1iMSkpOwogCiAJCWRhdGFbMF0gPSBNQlNfQ09NTUFORF9DT01QTEVURTsKIAkJaWYgKGN0eC0+dHlwZSA9PSBTUkJfTE9HSU5fQ01EKSB7CkBAIC05ODcsMTQgKzk2OCwxNCBAQAogCQlicmVhazsKIAl9CiAKLQlERUJVRzIocHJpbnRrKEtFUk5fV0FSTklORwotCSAgICAic2NzaSglbGQ6JXgpOiBBc3luYy0lcyBmYWlsZWQgLSBwb3J0aWQ9JTAyeCUwMnglMDJ4IHN0YXR1cz0leCAiCisJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NTA0NiwKKwkgICAgIkFzeW5jLSVzIGZhaWxlZCAtIHBvcnRpZD0lMDJ4JTAyeCUwMnggc3RhdHVzPSV4ICIKIAkgICAgIm1iMD0leCBtYjE9JXggbWIyPSV4IG1iNj0leCBtYjc9JXguXG4iLAotCSAgICBmY3BvcnQtPnZoYS0+aG9zdF9ubywgc3AtPmhhbmRsZSwgdHlwZSwgZmNwb3J0LT5kX2lkLmIuZG9tYWluLAorCSAgICB0eXBlLCBmY3BvcnQtPmRfaWQuYi5kb21haW4sCiAJICAgIGZjcG9ydC0+ZF9pZC5iLmFyZWEsIGZjcG9ydC0+ZF9pZC5iLmFsX3BhLCBzdGF0dXMsCiAJICAgIGxlMTZfdG9fY3B1KG1ieC0+bWIwKSwgbGUxNl90b19jcHUobWJ4LT5tYjEpLAogCSAgICBsZTE2X3RvX2NwdShtYngtPm1iMiksIGxlMTZfdG9fY3B1KG1ieC0+bWI2KSwKLQkgICAgbGUxNl90b19jcHUobWJ4LT5tYjcpKSk7CisJICAgIGxlMTZfdG9fY3B1KG1ieC0+bWI3KSk7CiAKIGxvZ2lvX2RvbmU6CiAJbGlvLT5kb25lKHNwKTsKQEAgLTEwMjUsOSArMTAwNiw4IEBACiAJCXR5cGUgPSAiY3QgcGFzcy10aHJvdWdoIjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIiVzOiBVbnJlY29nbml6ZWQgU1JCOiAoJXApIHR5cGU9JWQuXG4iLCBmdW5jLCBzcCwKLQkJICAgIHNwX2JzZy0+dHlwZSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDUwNDcsCisJCSAgICAiVW5yZWNvZ25pemVkIFNSQjogKCVwKSB0eXBlPSVkLlxuIiwgc3AsIHNwX2JzZy0+dHlwZSk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTEwNDUsMjAgKzEwMjUsMjAgQEAKIAkJCWJzZ19qb2ItPnJlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPQogCQkJICAgIGxlMTZfdG9fY3B1KCgoc3RzX2VudHJ5X3QgKilwa3QpLT5yc3BfaW5mb19sZW4pOwogCi0JCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJICAgICJzY3NpKCVsZCk6IENUIHBhc3MtdGhyb3VnaC0lcyBlcnJvciAiCisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg1MDQ4LAorCQkJICAgICJDVCBwYXNzLXRocm91Z2gtJXMgZXJyb3IgIgogCQkJICAgICJjb21wX3N0YXR1cy1zdGF0dXM9MHgleCB0b3RhbF9ieXRlID0gMHgleC5cbiIsCi0JCQkgICAgdmhhLT5ob3N0X25vLCB0eXBlLCBjb21wX3N0YXR1cywKLQkJCSAgICBic2dfam9iLT5yZXBseS0+cmVwbHlfcGF5bG9hZF9yY3ZfbGVuKSk7CisJCQkgICAgdHlwZSwgY29tcF9zdGF0dXMsCisJCQkgICAgYnNnX2pvYi0+cmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbik7CiAJCX0gZWxzZSB7Ci0JCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJICAgICJzY3NpKCVsZCk6IENUIHBhc3MtdGhyb3VnaC0lcyBlcnJvciAiCi0JCQkgICAgImNvbXBfc3RhdHVzLXN0YXR1cz0weCV4LlxuIiwKLQkJCSAgICB2aGEtPmhvc3Rfbm8sIHR5cGUsIGNvbXBfc3RhdHVzKSk7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg1MDQ5LAorCQkJICAgICJDVCBwYXNzLXRocm91Z2gtJXMgZXJyb3IgIgorCQkJICAgICJjb21wX3N0YXR1cy1zdGF0dXM9MHgleC5cbiIsIHR5cGUsIGNvbXBfc3RhdHVzKTsKIAkJCWJzZ19qb2ItPnJlcGx5LT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CiAJCQlic2dfam9iLT5yZXBseS0+cmVwbHlfcGF5bG9hZF9yY3ZfbGVuID0gMDsKIAkJfQotCQlERUJVRzIocWxhMngwMF9kdW1wX2J1ZmZlcigodWludDhfdCAqKXBrdCwgc2l6ZW9mKCpwa3QpKSk7CisJCXFsX2R1bXBfYnVmZmVyKHFsX2RiZ19hc3luYyArIHFsX2RiZ19idWZmZXIsIHZoYSwgMHg1MDU4LAorCQkgICAgKHVpbnQ4X3QgKilwa3QsIHNpemVvZigqcGt0KSk7CiAJfSBlbHNlIHsKIAkJYnNnX2pvYi0+cmVwbHktPnJlc3VsdCA9ICBESURfT0sgPDwgMTY7CiAJCWJzZ19qb2ItPnJlcGx5LT5yZXBseV9wYXlsb2FkX3Jjdl9sZW4gPQpAQCAtMTExMCw5ICsxMDkwLDggQEAKIAkJdHlwZSA9ICJjdCBwYXNzLXRocm91Z2giOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiJXM6IFVucmVjb2duaXplZCBTUkI6ICglcCkgdHlwZT0lZC5cbiIsIGZ1bmMsIHNwLAotCQkgICAgc3BfYnNnLT50eXBlKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NTAzZSwKKwkJICAgICJVbnJlY29nbml6ZWQgU1JCOiAoJXApIHR5cGU9JWQuXG4iLCBzcCwgc3BfYnNnLT50eXBlKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTEzMiwyNyArMTExMSwzMSBAQAogCQkJYnNnX2pvYi0+cmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbiA9CiAJCQkJbGUxNl90b19jcHUoKChzdHJ1Y3QgZWxzX3N0c19lbnRyeV8yNHh4Kilwa3QpLT50b3RhbF9ieXRlX2NvdW50KTsKIAotCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSAgICAic2NzaSglbGQ6MHgleCk6IEVMUy1DVCBwYXNzLXRocm91Z2gtJXMgZXJyb3IgY29tcF9zdGF0dXMtc3RhdHVzPTB4JXggIgorCQkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4NTAzZiwKKwkJCSAgICAiRUxTLUNUIHBhc3MtdGhyb3VnaC0lcyBlcnJvciBjb21wX3N0YXR1cy1zdGF0dXM9MHgleCAiCiAJCQkgICAgImVycm9yIHN1YmNvZGUgMT0weCV4IGVycm9yIHN1YmNvZGUgMj0weCV4IHRvdGFsX2J5dGUgPSAweCV4LlxuIiwKLQkJCQl2aGEtPmhvc3Rfbm8sIHNwLT5oYW5kbGUsIHR5cGUsIGNvbXBfc3RhdHVzLCBmd19zdGF0dXNbMV0sIGZ3X3N0YXR1c1syXSwKLQkJCQlsZTE2X3RvX2NwdSgoKHN0cnVjdCBlbHNfc3RzX2VudHJ5XzI0eHgqKXBrdCktPnRvdGFsX2J5dGVfY291bnQpKSk7CisJCQkgICAgdHlwZSwgY29tcF9zdGF0dXMsIGZ3X3N0YXR1c1sxXSwgZndfc3RhdHVzWzJdLAorCQkJICAgIGxlMTZfdG9fY3B1KCgoc3RydWN0IGVsc19zdHNfZW50cnlfMjR4eCAqKQorCQkJCXBrdCktPnRvdGFsX2J5dGVfY291bnQpKTsKIAkJCWZ3X3N0c19wdHIgPSAoKHVpbnQ4X3QqKWJzZ19qb2ItPnJlcS0+c2Vuc2UpICsgc2l6ZW9mKHN0cnVjdCBmY19ic2dfcmVwbHkpOwogCQkJbWVtY3B5KCBmd19zdHNfcHRyLCBmd19zdGF0dXMsIHNpemVvZihmd19zdGF0dXMpKTsKIAkJfQogCQllbHNlIHsKLQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkgICAgInNjc2koJWxkOjB4JXgpOiBFTFMtQ1QgcGFzcy10aHJvdWdoLSVzIGVycm9yIGNvbXBfc3RhdHVzLXN0YXR1cz0weCV4ICIKKwkJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDUwNDAsCisJCQkgICAgIkVMUy1DVCBwYXNzLXRocm91Z2gtJXMgZXJyb3IgY29tcF9zdGF0dXMtc3RhdHVzPTB4JXggIgogCQkJICAgICJlcnJvciBzdWJjb2RlIDE9MHgleCBlcnJvciBzdWJjb2RlIDI9MHgleC5cbiIsCi0JCQkJdmhhLT5ob3N0X25vLCBzcC0+aGFuZGxlLCB0eXBlLCBjb21wX3N0YXR1cywKLQkJCQlsZTE2X3RvX2NwdSgoKHN0cnVjdCBlbHNfc3RzX2VudHJ5XzI0eHgqKXBrdCktPmVycm9yX3N1YmNvZGVfMSksCi0JCQkJbGUxNl90b19jcHUoKChzdHJ1Y3QgZWxzX3N0c19lbnRyeV8yNHh4Kilwa3QpLT5lcnJvcl9zdWJjb2RlXzIpKSk7CisJCQkgICAgdHlwZSwgY29tcF9zdGF0dXMsCisJCQkgICAgbGUxNl90b19jcHUoKChzdHJ1Y3QgZWxzX3N0c19lbnRyeV8yNHh4ICopCisJCQkJcGt0KS0+ZXJyb3Jfc3ViY29kZV8xKSwKKwkJCSAgICBsZTE2X3RvX2NwdSgoKHN0cnVjdCBlbHNfc3RzX2VudHJ5XzI0eHggKikKKwkJCQkgICAgcGt0KS0+ZXJyb3Jfc3ViY29kZV8yKSk7CiAJCQlic2dfam9iLT5yZXBseS0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OwogCQkJYnNnX2pvYi0+cmVwbHktPnJlcGx5X3BheWxvYWRfcmN2X2xlbiA9IDA7CiAJCQlmd19zdHNfcHRyID0gKCh1aW50OF90Kilic2dfam9iLT5yZXEtPnNlbnNlKSArIHNpemVvZihzdHJ1Y3QgZmNfYnNnX3JlcGx5KTsKIAkJCW1lbWNweSggZndfc3RzX3B0ciwgZndfc3RhdHVzLCBzaXplb2YoZndfc3RhdHVzKSk7CiAJCX0KLQkJREVCVUcyKHFsYTJ4MDBfZHVtcF9idWZmZXIoKHVpbnQ4X3QgKilwa3QsIHNpemVvZigqcGt0KSkpOworCQlxbF9kdW1wX2J1ZmZlcihxbF9kYmdfYXN5bmMgKyBxbF9kYmdfYnVmZmVyLCB2aGEsIDB4NTA1NiwKKwkJCQkodWludDhfdCAqKXBrdCwgc2l6ZW9mKCpwa3QpKTsKIAl9CiAJZWxzZSB7CiAJCWJzZ19qb2ItPnJlcGx5LT5yZXN1bHQgPSAgRElEX09LIDw8IDE2OwpAQCAtMTIwMSwyNSArMTE4NCwyNCBAQAogCWRhdGFbMV0gPSBsaW8tPnUubG9naW8uZmxhZ3MgJiBTUkJfTE9HSU5fUkVUUklFRCA/CiAJCVFMQV9MT0dJT19MT0dJTl9SRVRSSUVEIDogMDsKIAlpZiAobG9naW8tPmVudHJ5X3N0YXR1cykgewotCQlERUJVRzIocHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgInNjc2koJWxkOiV4KTogQXN5bmMtJXMgZXJyb3IgZW50cnkgLSAiCisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDUwMzQsCisJCSAgICAiQXN5bmMtJXMgZXJyb3IgZW50cnkgLSAiCiAJCSAgICAicG9ydGlkPSUwMnglMDJ4JTAyeCBlbnRyeS1zdGF0dXM9JXguXG4iLAotCQkgICAgZmNwb3J0LT52aGEtPmhvc3Rfbm8sIHNwLT5oYW5kbGUsIHR5cGUsCi0JCSAgICBmY3BvcnQtPmRfaWQuYi5kb21haW4sIGZjcG9ydC0+ZF9pZC5iLmFyZWEsCi0JCSAgICBmY3BvcnQtPmRfaWQuYi5hbF9wYSwgbG9naW8tPmVudHJ5X3N0YXR1cykpOwotCQlERUJVRzIocWxhMngwMF9kdW1wX2J1ZmZlcigodWludDhfdCAqKWxvZ2lvLCBzaXplb2YoKmxvZ2lvKSkpOworCQkgICAgdHlwZSwgZmNwb3J0LT5kX2lkLmIuZG9tYWluLCBmY3BvcnQtPmRfaWQuYi5hcmVhLAorCQkgICAgZmNwb3J0LT5kX2lkLmIuYWxfcGEsIGxvZ2lvLT5lbnRyeV9zdGF0dXMpOworCQlxbF9kdW1wX2J1ZmZlcihxbF9kYmdfYXN5bmMgKyBxbF9kYmdfYnVmZmVyLCB2aGEsIDB4NTA1OSwKKwkJICAgICh1aW50OF90ICopbG9naW8sIHNpemVvZigqbG9naW8pKTsKIAogCQlnb3RvIGxvZ2lvX2RvbmU7CiAJfQogCiAJaWYgKGxlMTZfdG9fY3B1KGxvZ2lvLT5jb21wX3N0YXR1cykgPT0gQ1NfQ09NUExFVEUpIHsKLQkJREVCVUcyKHByaW50ayhLRVJOX0RFQlVHCi0JCSAgICAic2NzaSglbGQ6JXgpOiBBc3luYy0lcyBjb21wbGV0ZSAtIHBvcnRpZD0lMDJ4JTAyeCUwMnggIgorCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTAzNiwKKwkJICAgICJBc3luYy0lcyBjb21wbGV0ZSAtIHBvcnRpZD0lMDJ4JTAyeCUwMnggIgogCQkgICAgImlvcDA9JXguXG4iLAotCQkgICAgZmNwb3J0LT52aGEtPmhvc3Rfbm8sIHNwLT5oYW5kbGUsIHR5cGUsCi0JCSAgICBmY3BvcnQtPmRfaWQuYi5kb21haW4sIGZjcG9ydC0+ZF9pZC5iLmFyZWEsCisJCSAgICB0eXBlLCBmY3BvcnQtPmRfaWQuYi5kb21haW4sIGZjcG9ydC0+ZF9pZC5iLmFyZWEsCiAJCSAgICBmY3BvcnQtPmRfaWQuYi5hbF9wYSwKLQkJICAgIGxlMzJfdG9fY3B1KGxvZ2lvLT5pb19wYXJhbWV0ZXJbMF0pKSk7CisJCSAgICBsZTMyX3RvX2NwdShsb2dpby0+aW9fcGFyYW1ldGVyWzBdKSk7CiAKIAkJZGF0YVswXSA9IE1CU19DT01NQU5EX0NPTVBMRVRFOwogCQlpZiAoY3R4LT50eXBlICE9IFNSQl9MT0dJTl9DTUQpCkBAIC0xMjU2LDE0ICsxMjM4LDE0IEBACiAJCWJyZWFrOwogCX0KIAotCURFQlVHMihwcmludGsoS0VSTl9XQVJOSU5HCi0JICAgICJzY3NpKCVsZDoleCk6IEFzeW5jLSVzIGZhaWxlZCAtIHBvcnRpZD0lMDJ4JTAyeCUwMnggY29tcD0leCAiCisJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwMzcsCisJICAgICJBc3luYy0lcyBmYWlsZWQgLSBwb3J0aWQ9JTAyeCUwMnglMDJ4IGNvbXA9JXggIgogCSAgICAiaW9wMD0leCBpb3AxPSV4LlxuIiwKLQkgICAgZmNwb3J0LT52aGEtPmhvc3Rfbm8sIHNwLT5oYW5kbGUsIHR5cGUsIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwKKwkgICAgdHlwZSwgZmNwb3J0LT5kX2lkLmIuZG9tYWluLAogCSAgICBmY3BvcnQtPmRfaWQuYi5hcmVhLCBmY3BvcnQtPmRfaWQuYi5hbF9wYSwKIAkgICAgbGUxNl90b19jcHUobG9naW8tPmNvbXBfc3RhdHVzKSwKIAkgICAgbGUzMl90b19jcHUobG9naW8tPmlvX3BhcmFtZXRlclswXSksCi0JICAgIGxlMzJfdG9fY3B1KGxvZ2lvLT5pb19wYXJhbWV0ZXJbMV0pKSk7CisJICAgIGxlMzJfdG9fY3B1KGxvZ2lvLT5pb19wYXJhbWV0ZXJbMV0pKTsKIAogbG9naW9fZG9uZToKIAlsaW8tPmRvbmUoc3ApOwpAQCAtMTI5MiwzOCArMTI3NCwzNCBAQAogCWZjcG9ydCA9IHNwLT5mY3BvcnQ7CiAKIAlpZiAoc3RzLT5lbnRyeV9zdGF0dXMpIHsKLQkJREVCVUcyKHByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICJzY3NpKCVsZDoleCk6IEFzeW5jLSVzIGVycm9yIC0gZW50cnktc3RhdHVzKCV4KS5cbiIsCi0JCSAgICBmY3BvcnQtPnZoYS0+aG9zdF9ubywgc3AtPmhhbmRsZSwgdHlwZSwKLQkJICAgIHN0cy0+ZW50cnlfc3RhdHVzKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDUwMzgsCisJCSAgICAiQXN5bmMtJXMgZXJyb3IgLSBlbnRyeS1zdGF0dXMoJXgpLlxuIiwKKwkJICAgIHR5cGUsIHN0cy0+ZW50cnlfc3RhdHVzKTsKIAl9IGVsc2UgaWYgKHN0cy0+Y29tcF9zdGF0dXMgIT0gX19jb25zdGFudF9jcHVfdG9fbGUxNihDU19DT01QTEVURSkpIHsKLQkJREVCVUcyKHByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICJzY3NpKCVsZDoleCk6IEFzeW5jLSVzIGVycm9yIC0gY29tcGxldGlvbiBzdGF0dXMoJXgpLlxuIiwKLQkJICAgIGZjcG9ydC0+dmhhLT5ob3N0X25vLCBzcC0+aGFuZGxlLCB0eXBlLAotCQkgICAgc3RzLT5jb21wX3N0YXR1cykpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg1MDM5LAorCQkgICAgIkFzeW5jLSVzIGVycm9yIC0gY29tcGxldGlvbiBzdGF0dXMoJXgpLlxuIiwKKwkJICAgIHR5cGUsIHN0cy0+Y29tcF9zdGF0dXMpOwogCX0gZWxzZSBpZiAoIShsZTE2X3RvX2NwdShzdHMtPnNjc2lfc3RhdHVzKSAmCiAJICAgIFNTX1JFU1BPTlNFX0lORk9fTEVOX1ZBTElEKSkgewotCQlERUJVRzIocHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgInNjc2koJWxkOiV4KTogQXN5bmMtJXMgZXJyb3IgLSBubyByZXNwb25zZSBpbmZvKCV4KS5cbiIsCi0JCSAgICBmY3BvcnQtPnZoYS0+aG9zdF9ubywgc3AtPmhhbmRsZSwgdHlwZSwKLQkJICAgIHN0cy0+c2NzaV9zdGF0dXMpKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NTAzYSwKKwkJICAgICJBc3luYy0lcyBlcnJvciAtIG5vIHJlc3BvbnNlIGluZm8oJXgpLlxuIiwKKwkJICAgIHR5cGUsIHN0cy0+c2NzaV9zdGF0dXMpOwogCX0gZWxzZSBpZiAobGUzMl90b19jcHUoc3RzLT5yc3BfZGF0YV9sZW4pIDwgNCkgewotCQlERUJVRzIocHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgInNjc2koJWxkOiV4KTogQXN5bmMtJXMgZXJyb3IgLSBub3QgZW5vdWdoIHJlc3BvbnNlKCVkKS5cbiIsCi0JCSAgICBmY3BvcnQtPnZoYS0+aG9zdF9ubywgc3AtPmhhbmRsZSwgdHlwZSwKLQkJICAgIHN0cy0+cnNwX2RhdGFfbGVuKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDUwM2IsCisJCSAgICAiQXN5bmMtJXMgZXJyb3IgLSBub3QgZW5vdWdoIHJlc3BvbnNlKCVkKS5cbiIsCisJCSAgICB0eXBlLCBzdHMtPnJzcF9kYXRhX2xlbik7CiAJfSBlbHNlIGlmIChzdHMtPmRhdGFbM10pIHsKLQkJREVCVUcyKHByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICJzY3NpKCVsZDoleCk6IEFzeW5jLSVzIGVycm9yIC0gcmVzcG9uc2UoJXgpLlxuIiwKLQkJICAgIGZjcG9ydC0+dmhhLT5ob3N0X25vLCBzcC0+aGFuZGxlLCB0eXBlLAotCQkgICAgc3RzLT5kYXRhWzNdKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDUwM2MsCisJCSAgICAiQXN5bmMtJXMgZXJyb3IgLSByZXNwb25zZSgleCkuXG4iLAorCQkgICAgdHlwZSwgc3RzLT5kYXRhWzNdKTsKIAl9IGVsc2UgewogCQllcnJvciA9IDA7CiAJfQogCiAJaWYgKGVycm9yKSB7CiAJCWlvY2ItPnUudG1mLmRhdGEgPSBlcnJvcjsKLQkJREVCVUcyKHFsYTJ4MDBfZHVtcF9idWZmZXIoKHVpbnQ4X3QgKilzdHMsIHNpemVvZigqc3RzKSkpOworCQlxbF9kdW1wX2J1ZmZlcihxbF9kYmdfYXN5bmMgKyBxbF9kYmdfYnVmZmVyLCB2aGEsIDB4NTA1NSwKKwkJICAgICh1aW50OF90ICopc3RzLCBzaXplb2YoKnN0cykpOwogCX0KIAogCWlvY2ItPmRvbmUoc3ApOwpAQCAtMTM2MCw4ICsxMzM4LDggQEAKIAkJfQogCiAJCWlmIChwa3QtPmVudHJ5X3N0YXR1cyAhPSAwKSB7Ci0JCQlERUJVRzMocHJpbnRrKEtFUk5fSU5GTwotCQkJICAgICJzY3NpKCVsZCk6IFByb2Nlc3MgZXJyb3IgZW50cnkuXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDUwMzUsCisJCQkgICAgIlByb2Nlc3MgZXJyb3IgZW50cnkuXG4iKTsKIAogCQkJcWxhMngwMF9lcnJvcl9lbnRyeSh2aGEsIHJzcCwgcGt0KTsKIAkJCSgocmVzcG9uc2VfdCAqKXBrdCktPnNpZ25hdHVyZSA9IFJFU1BPTlNFX1BST0NFU1NFRDsKQEAgLTEzOTksMTAgKzEzNzcsMTAgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJLyogVHlwZSBOb3QgU3VwcG9ydGVkLiAqLwotCQkJREVCVUc0KHByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAic2NzaSglbGQpOiBSZWNlaXZlZCB1bmtub3duIHJlc3BvbnNlIHBrdCB0eXBlICV4ICIKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDUwNGEsCisJCQkgICAgIlJlY2VpdmVkIHVua25vd24gcmVzcG9uc2UgcGt0IHR5cGUgJXggIgogCQkJICAgICJlbnRyeSBzdGF0dXM9JXguXG4iLAotCQkJICAgIHZoYS0+aG9zdF9ubywgcGt0LT5lbnRyeV90eXBlLCBwa3QtPmVudHJ5X3N0YXR1cykpOworCQkJICAgIHBrdC0+ZW50cnlfdHlwZSwgcGt0LT5lbnRyeV9zdGF0dXMpOwogCQkJYnJlYWs7CiAJCX0KIAkJKChyZXNwb25zZV90ICopcGt0KS0+c2lnbmF0dXJlID0gUkVTUE9OU0VfUFJPQ0VTU0VEOwpAQCAtMTQxOCw2ICsxMzk2LDcgQEAKIHFsYTJ4MDBfaGFuZGxlX3NlbnNlKHNyYl90ICpzcCwgdWludDhfdCAqc2Vuc2VfZGF0YSwgdWludDMyX3QgcGFyX3NlbnNlX2xlbiwKICAgICB1aW50MzJfdCBzZW5zZV9sZW4sIHN0cnVjdCByc3BfcXVlICpyc3ApCiB7CisJc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSA9IHNwLT5mY3BvcnQtPnZoYTsKIAlzdHJ1Y3Qgc2NzaV9jbW5kICpjcCA9IHNwLT5jbWQ7CiAKIAlpZiAoc2Vuc2VfbGVuID49IFNDU0lfU0VOU0VfQlVGRkVSU0laRSkKQEAgLTE0MzUsMTEgKzE0MTQsMTMgQEAKIAlpZiAoc3AtPnJlcXVlc3Rfc2Vuc2VfbGVuZ3RoICE9IDApCiAJCXJzcC0+c3RhdHVzX3NyYiA9IHNwOwogCi0JREVCVUc1KHByaW50aygiJXMoKTogQ2hlY2sgY29uZGl0aW9uIFNlbnNlIGRhdGEsIHNjc2koJWxkOiVkOiVkOiVkKSAiCi0JICAgICJjbWQ9JXBcbiIsIF9fZnVuY19fLCBzcC0+ZmNwb3J0LT52aGEtPmhvc3Rfbm8sCi0JICAgIGNwLT5kZXZpY2UtPmNoYW5uZWwsIGNwLT5kZXZpY2UtPmlkLCBjcC0+ZGV2aWNlLT5sdW4sIGNwKSk7CisJcWxfZGJnKHFsX2RiZ19pbywgdmhhLCAweDMwMWMsCisJICAgICJDaGVjayBjb25kaXRpb24gU2Vuc2UgZGF0YSwgc2NzaSglbGQ6JWQ6JWQ6JWQpIGNtZD0lcC5cbiIsCisJICAgIHNwLT5mY3BvcnQtPnZoYS0+aG9zdF9ubywgY3AtPmRldmljZS0+Y2hhbm5lbCwgY3AtPmRldmljZS0+aWQsCisJICAgIGNwLT5kZXZpY2UtPmx1biwgY3ApOwogCWlmIChzZW5zZV9sZW4pCi0JCURFQlVHNShxbGEyeDAwX2R1bXBfYnVmZmVyKGNwLT5zZW5zZV9idWZmZXIsIHNlbnNlX2xlbikpOworCQlxbF9kdW1wX2J1ZmZlcihxbF9kYmdfaW8gKyBxbF9kYmdfYnVmZmVyLCB2aGEsIDB4MzAyYiwKKwkJICAgIGNwLT5zZW5zZV9idWZmZXIsIHNlbnNlX2xlbik7CiB9CiAKIHN0cnVjdCBzY3NpX2RpZl90dXBsZSB7CkBAIC0xNDU3LDYgKzE0MzgsNyBAQAogc3RhdGljIGlubGluZSB2b2lkCiBxbGEyeDAwX2hhbmRsZV9kaWZfZXJyb3Ioc3JiX3QgKnNwLCBzdHJ1Y3Qgc3RzX2VudHJ5XzI0eHggKnN0czI0KQogeworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICp2aGEgPSBzcC0+ZmNwb3J0LT52aGE7CiAJc3RydWN0IHNjc2lfY21uZCAqY21kID0gc3AtPmNtZDsKIAlzdHJ1Y3Qgc2NzaV9kaWZfdHVwbGUJKmVwID0KIAkJCShzdHJ1Y3Qgc2NzaV9kaWZfdHVwbGUgKikmc3RzMjQtPmRhdGFbMjBdOwpAQCAtMTQ3MywxNSArMTQ1NSwxNSBAQAogCWVfZ3VhcmQgPSBiZTE2X3RvX2NwdShlcC0+Z3VhcmQpOwogCWFfZ3VhcmQgPSBiZTE2X3RvX2NwdShhcC0+Z3VhcmQpOwogCi0JREVCVUcxOChwcmludGsoS0VSTl9ERUJVRwotCSAgICAiJXMoKTogaW9jYihzKSAlcCBSZXR1cm5lZCBTVEFUVVNcbiIsIF9fZnVuY19fLCBzdHMyNCkpOworCXFsX2RiZyhxbF9kYmdfaW8sIHZoYSwgMHgzMDIzLAorCSAgICAiaW9jYihzKSAlcCBSZXR1cm5lZCBTVEFUVVMuXG4iLCBzdHMyNCk7CiAKLQlERUJVRzE4KHByaW50ayhLRVJOX0VSUiAiRElGIEVSUk9SIGluIGNtZCAweCV4IGxiYSAweCVsbHggYWN0IHJlZiIKKwlxbF9kYmcocWxfZGJnX2lvLCB2aGEsIDB4MzAyNCwKKwkgICAgIkRJRiBFUlJPUiBpbiBjbWQgMHgleCBsYmEgMHglbGx4IGFjdCByZWYiCiAJICAgICIgdGFnPTB4JXgsIGV4cCByZWZfdGFnPTB4JXgsIGFjdCBhcHAgdGFnPTB4JXgsIGV4cCBhcHAiCi0JICAgICIgdGFnPTB4JXgsIGFjdCBndWFyZD0weCV4LCBleHAgZ3VhcmQ9MHgleFxuIiwKKwkgICAgIiB0YWc9MHgleCwgYWN0IGd1YXJkPTB4JXgsIGV4cCBndWFyZD0weCV4LlxuIiwKIAkgICAgY21kLT5jbW5kWzBdLCAodTY0KXNjc2lfZ2V0X2xiYShjbWQpLCBhX3JlZl90YWcsIGVfcmVmX3RhZywKLQkgICAgYV9hcHBfdGFnLCBlX2FwcF90YWcsIGFfZ3VhcmQsIGVfZ3VhcmQpKTsKLQorCSAgICBhX2FwcF90YWcsIGVfYXBwX3RhZywgYV9ndWFyZCwgZV9ndWFyZCk7CiAKIAkvKiBjaGVjayBndWFyZCAqLwogCWlmIChlX2d1YXJkICE9IGFfZ3VhcmQpIHsKQEAgLTE1NjksOSArMTU1MSw4IEBACiAJCXNwID0gTlVMTDsKIAogCWlmIChzcCA9PSBOVUxMKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJzY3NpKCVsZCk6IEludmFsaWQgc3RhdHVzIGhhbmRsZSAoMHgleCkuXG4iLCB2aGEtPmhvc3Rfbm8sCi0JCSAgICBzdHMtPmhhbmRsZSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDMwMTcsCisJCSAgICAiSW52YWxpZCBzdGF0dXMgaGFuZGxlICgweCV4KS5cbiIsIHN0cy0+aGFuZGxlKTsKIAogCQlpZiAoSVNfUUxBODJYWChoYSkpCiAJCQlzZXRfYml0KEZDT0VfQ1RYX1JFU0VUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKQEAgLTE1ODIsOSArMTU2Myw5IEBACiAJfQogCWNwID0gc3AtPmNtZDsKIAlpZiAoY3AgPT0gTlVMTCkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAic2NzaSglbGQpOiBDb21tYW5kIGFscmVhZHkgcmV0dXJuZWQgKDB4JXgvJXApLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubywgc3RzLT5oYW5kbGUsIHNwKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MzAxOCwKKwkJICAgICJDb21tYW5kIGFscmVhZHkgcmV0dXJuZWQgKDB4JXgvJXApLlxuIiwKKwkJICAgIHN0cy0+aGFuZGxlLCBzcCk7CiAKIAkJcmV0dXJuOwogCX0KQEAgLTE2MjksMTAgKzE2MTAsOSBAQAogCQkJcGFyX3NlbnNlX2xlbiAtPSByc3BfaW5mb19sZW47CiAJCX0KIAkJaWYgKHJzcF9pbmZvX2xlbiA+IDMgJiYgcnNwX2luZm9bM10pIHsKLQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkgICAgInNjc2koJWxkOiVkOiVkKTogRkNQIEkvTyBwcm90b2NvbCBmYWlsdXJlICIKLQkJCSAgICAiKDB4JXgvMHgleCkuXG4iLCB2aGEtPmhvc3Rfbm8sIGNwLT5kZXZpY2UtPmlkLAotCQkJICAgIGNwLT5kZXZpY2UtPmx1biwgcnNwX2luZm9fbGVuLCByc3BfaW5mb1szXSkpOworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MzAxOSwKKwkJCSAgICAiRkNQIEkvTyBwcm90b2NvbCBmYWlsdXJlICgweCV4LzB4JXgpLlxuIiwKKwkJCSAgICByc3BfaW5mb19sZW4sIHJzcF9pbmZvWzNdKTsKIAogCQkJY3AtPnJlc3VsdCA9IERJRF9CVVNfQlVTWSA8PCAxNjsKIAkJCWdvdG8gb3V0OwpAQCAtMTY2MSwxMSArMTY0MSwxMCBAQAogCQkJaWYgKCFsc2NzaV9zdGF0dXMgJiYKIAkJCSAgICAoKHVuc2lnbmVkKShzY3NpX2J1ZmZsZW4oY3ApIC0gcmVzaWQpIDwKIAkJCSAgICAgY3AtPnVuZGVyZmxvdykpIHsKLQkJCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkJICAgICJzY3NpKCVsZDolZDolZCk6IE1pZC1sYXllciB1bmRlcmZsb3cgIgorCQkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDMwMWEsCisJCQkJICAgICJNaWQtbGF5ZXIgdW5kZXJmbG93ICIKIAkJCQkgICAgImRldGVjdGVkICgweCV4IG9mIDB4JXggYnl0ZXMpLlxuIiwKLQkJCQkgICAgdmhhLT5ob3N0X25vLCBjcC0+ZGV2aWNlLT5pZCwKLQkJCQkgICAgY3AtPmRldmljZS0+bHVuLCByZXNpZCwgc2NzaV9idWZmbGVuKGNwKSk7CisJCQkJICAgIHJlc2lkLCBzY3NpX2J1ZmZsZW4oY3ApKTsKIAogCQkJCWNwLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTY7CiAJCQkJYnJlYWs7CkBAIC0xNjc0LDkgKzE2NTMsOCBAQAogCQljcC0+cmVzdWx0ID0gRElEX09LIDw8IDE2IHwgbHNjc2lfc3RhdHVzOwogCiAJCWlmIChsc2NzaV9zdGF0dXMgPT0gU0FNX1NUQVRfVEFTS19TRVRfRlVMTCkgewotCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCSAgICAic2NzaSglbGQ6JWQ6JWQpIFFVRVVFIEZVTEwgZGV0ZWN0ZWQuXG4iLAotCQkJICAgIHZoYS0+aG9zdF9ubywgY3AtPmRldmljZS0+aWQsIGNwLT5kZXZpY2UtPmx1bikpOworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MzAxYiwKKwkJCSAgICAiUVVFVUUgRlVMTCBkZXRlY3RlZC5cbiIpOwogCQkJYnJlYWs7CiAJCX0KIAkJbG9naXQgPSAwOwpAQCAtMTY5NywxMSArMTY3NSwxMCBAQAogCQlzY3NpX3NldF9yZXNpZChjcCwgcmVzaWQpOwogCQlpZiAoc2NzaV9zdGF0dXMgJiBTU19SRVNJRFVBTF9VTkRFUikgewogCQkJaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkgJiYgZndfcmVzaWRfbGVuICE9IHJlc2lkX2xlbikgewotCQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkJICAgICJzY3NpKCVsZDolZDolZCkgRHJvcHBlZCBmcmFtZShzKSBkZXRlY3RlZCAiCi0JCQkJICAgICIoMHgleCBvZiAweCV4IGJ5dGVzKS5cbiIsIHZoYS0+aG9zdF9ubywKLQkJCQkgICAgY3AtPmRldmljZS0+aWQsIGNwLT5kZXZpY2UtPmx1biwgcmVzaWQsCi0JCQkJICAgIHNjc2lfYnVmZmxlbihjcCkpKTsKKwkJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgzMDFkLAorCQkJCSAgICAiRHJvcHBlZCBmcmFtZShzKSBkZXRlY3RlZCAiCisJCQkJICAgICIoMHgleCBvZiAweCV4IGJ5dGVzKS5cbiIsCisJCQkJICAgIHJlc2lkLCBzY3NpX2J1ZmZsZW4oY3ApKTsKIAogCQkJCWNwLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTYgfCBsc2NzaV9zdGF0dXM7CiAJCQkJYnJlYWs7CkBAIC0xNzEwLDIwICsxNjg3LDE4IEBACiAJCQlpZiAoIWxzY3NpX3N0YXR1cyAmJgogCQkJICAgICgodW5zaWduZWQpKHNjc2lfYnVmZmxlbihjcCkgLSByZXNpZCkgPAogCQkJICAgIGNwLT51bmRlcmZsb3cpKSB7Ci0JCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJCSAgICAic2NzaSglbGQ6JWQ6JWQpOiBNaWQtbGF5ZXIgdW5kZXJmbG93ICIKKwkJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgzMDFlLAorCQkJCSAgICAiTWlkLWxheWVyIHVuZGVyZmxvdyAiCiAJCQkJICAgICJkZXRlY3RlZCAoMHgleCBvZiAweCV4IGJ5dGVzKS5cbiIsCi0JCQkJICAgIHZoYS0+aG9zdF9ubywgY3AtPmRldmljZS0+aWQsCi0JCQkJICAgIGNwLT5kZXZpY2UtPmx1biwgcmVzaWQsIHNjc2lfYnVmZmxlbihjcCkpOworCQkJCSAgICByZXNpZCwgc2NzaV9idWZmbGVuKGNwKSk7CiAKIAkJCQljcC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2OwogCQkJCWJyZWFrOwogCQkJfQogCQl9IGVsc2UgewotCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCSAgICAic2NzaSglbGQ6JWQ6JWQpIERyb3BwZWQgZnJhbWUocykgZGV0ZWN0ZWQgKDB4JXggIgotCQkJICAgICJvZiAweCV4IGJ5dGVzKS5cbiIsIHZoYS0+aG9zdF9ubywgY3AtPmRldmljZS0+aWQsCi0JCQkgICAgY3AtPmRldmljZS0+bHVuLCByZXNpZCwgc2NzaV9idWZmbGVuKGNwKSkpOworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MzAxZiwKKwkJCSAgICAiRHJvcHBlZCBmcmFtZShzKSBkZXRlY3RlZCAoMHgleCAiCisJCQkgICAgIm9mIDB4JXggYnl0ZXMpLlxuIiwgcmVzaWQsIHNjc2lfYnVmZmxlbihjcCkpOwogCiAJCQljcC0+cmVzdWx0ID0gRElEX0VSUk9SIDw8IDE2IHwgbHNjc2lfc3RhdHVzOwogCQkJZ290byBjaGVja19zY3NpX3N0YXR1czsKQEAgLTE3MzksMTAgKzE3MTQsOCBAQAogCQkgKi8KIAkJaWYgKGxzY3NpX3N0YXR1cyAhPSAwKSB7CiAJCQlpZiAobHNjc2lfc3RhdHVzID09IFNBTV9TVEFUX1RBU0tfU0VUX0ZVTEwpIHsKLQkJCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJCSAgICAic2NzaSglbGQ6JWQ6JWQpIFFVRVVFIEZVTEwgZGV0ZWN0ZWQuXG4iLAotCQkJCSAgICB2aGEtPmhvc3Rfbm8sIGNwLT5kZXZpY2UtPmlkLAotCQkJCSAgICBjcC0+ZGV2aWNlLT5sdW4pKTsKKwkJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgzMDIwLAorCQkJCSAgICAiUVVFVUUgRlVMTCBkZXRlY3RlZC5cbiIpOwogCQkJCWxvZ2l0ID0gMTsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTE3ODEsMTAgKzE3NTQsOSBAQAogCQkJCWJyZWFrOwogCQl9CiAKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCSJzY3NpKCVsZDolZDolZCkgUG9ydCBkb3duIHN0YXR1czogcG9ydC1zdGF0ZT0weCV4XG4iLAotCQkJdmhhLT5ob3N0X25vLCBjcC0+ZGV2aWNlLT5pZCwgY3AtPmRldmljZS0+bHVuLAotCQkJYXRvbWljX3JlYWQoJmZjcG9ydC0+c3RhdGUpKSk7CisJCXFsX2RiZyhxbF9kYmdfaW8sIHZoYSwgMHgzMDIxLAorCQkgICAgIlBvcnQgZG93biBzdGF0dXM6IHBvcnQtc3RhdGU9MHgleC5cbiIsCisJCSAgICBhdG9taWNfcmVhZCgmZmNwb3J0LT5zdGF0ZSkpOwogCiAJCWlmIChhdG9taWNfcmVhZCgmZmNwb3J0LT5zdGF0ZSkgPT0gRkNTX09OTElORSkKIAkJCXFsYTJ4MDBfbWFya19kZXZpY2VfbG9zdChmY3BvcnQtPnZoYSwgZmNwb3J0LCAxLCAxKTsKQEAgLTE4MDQsMTUgKzE3NzYsMTMgQEAKIAogb3V0OgogCWlmIChsb2dpdCkKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJICAgICJzY3NpKCVsZDolZDolZCkgRkNQIGNvbW1hbmQgc3RhdHVzOiAweCV4LTB4JXggKDB4JXgpICIKLQkJICAgICJwb3J0aWQ9JTAyeCUwMnglMDJ4IG94aWQ9MHgleCBjZGI9JTAyeCUwMnglMDJ4IGxlbj0weCV4ICIKLQkJICAgICJyc3BfaW5mbz0weCV4IHJlc2lkPTB4JXggZndfcmVzaWQ9MHgleFxuIiwgdmhhLT5ob3N0X25vLAotCQkgICAgY3AtPmRldmljZS0+aWQsIGNwLT5kZXZpY2UtPmx1biwgY29tcF9zdGF0dXMsIHNjc2lfc3RhdHVzLAotCQkgICAgY3AtPnJlc3VsdCwgZmNwb3J0LT5kX2lkLmIuZG9tYWluLCBmY3BvcnQtPmRfaWQuYi5hcmVhLAotCQkgICAgZmNwb3J0LT5kX2lkLmIuYWxfcGEsIG94X2lkLCBjcC0+Y21uZFswXSwgY3AtPmNtbmRbMV0sCi0JCSAgICBjcC0+Y21uZFsyXSwgc2NzaV9idWZmbGVuKGNwKSwgcnNwX2luZm9fbGVuLCByZXNpZF9sZW4sCi0JCSAgICBmd19yZXNpZF9sZW4pKTsKKwkJcWxfZGJnKHFsX2RiZ19pbywgdmhhLCAweDMwMjIsCisJCSAgICAiRkNQIGNvbW1hbmQgc3RhdHVzOiAweCV4LTB4JXggKDB4JXgpICIKKwkJICAgICJveGlkPTB4JXggY2RiPSUwMnglMDJ4JTAyeCBsZW49MHgleCAiCisJCSAgICAicnNwX2luZm89MHgleCByZXNpZD0weCV4IGZ3X3Jlc2lkPTB4JXguXG4iLAorCQkgICAgY29tcF9zdGF0dXMsIHNjc2lfc3RhdHVzLCBjcC0+cmVzdWx0LCBveF9pZCwgY3AtPmNtbmRbMF0sCisJCSAgICBjcC0+Y21uZFsxXSwgY3AtPmNtbmRbMl0sIHNjc2lfYnVmZmxlbihjcCksIHJzcF9pbmZvX2xlbiwKKwkJICAgIHJlc2lkX2xlbiwgZndfcmVzaWRfbGVuKTsKIAogCWlmIChyc3AtPnN0YXR1c19zcmIgPT0gTlVMTCkKIAkJcWxhMngwMF9zcF9jb21wbChoYSwgc3ApOwpAQCAtMTgzMCwxNiArMTgwMCwxNSBAQAogewogCXVpbnQ4X3QJCXNlbnNlX3N6ID0gMDsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gcnNwLT5odzsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAlzcmJfdAkJKnNwID0gcnNwLT5zdGF0dXNfc3JiOwogCXN0cnVjdCBzY3NpX2NtbmQgKmNwOwogCiAJaWYgKHNwICE9IE5VTEwgJiYgc3AtPnJlcXVlc3Rfc2Vuc2VfbGVuZ3RoICE9IDApIHsKIAkJY3AgPSBzcC0+Y21kOwogCQlpZiAoY3AgPT0gTlVMTCkgewotCQkJREVCVUcyKHByaW50aygiJXMoKTogQ21kIGFscmVhZHkgcmV0dXJuZWQgYmFjayB0byBPUyAiCi0JCQkgICAgInNwPSVwLlxuIiwgX19mdW5jX18sIHNwKSk7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkgICAgImNtZCBpcyBOVUxMOiBhbHJlYWR5IHJldHVybmVkIHRvIE9TIChzcD0lcClcbiIsCisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgzMDI1LAorCQkJICAgICJjbWQgaXMgTlVMTDogYWxyZWFkeSByZXR1cm5lZCB0byBPUyAoc3A9JXApLlxuIiwKIAkJCSAgICBzcCk7CiAKIAkJCXJzcC0+c3RhdHVzX3NyYiA9IE5VTEw7CkBAIC0xODU2LDcgKzE4MjUsOCBAQAogCQlpZiAoSVNfRldJMl9DQVBBQkxFKGhhKSkKIAkJCWhvc3RfdG9fZmNwX3N3YXAocGt0LT5kYXRhLCBzaXplb2YocGt0LT5kYXRhKSk7CiAJCW1lbWNweShzcC0+cmVxdWVzdF9zZW5zZV9wdHIsIHBrdC0+ZGF0YSwgc2Vuc2Vfc3opOwotCQlERUJVRzUocWxhMngwMF9kdW1wX2J1ZmZlcihzcC0+cmVxdWVzdF9zZW5zZV9wdHIsIHNlbnNlX3N6KSk7CisJCXFsX2R1bXBfYnVmZmVyKHFsX2RiZ19pbyArIHFsX2RiZ19idWZmZXIsIHZoYSwgMHgzMDJjLAorCQkJc3AtPnJlcXVlc3Rfc2Vuc2VfcHRyLCBzZW5zZV9zeik7CiAKIAkJc3AtPnJlcXVlc3Rfc2Vuc2VfcHRyICs9IHNlbnNlX3N6OwogCQlzcC0+cmVxdWVzdF9zZW5zZV9sZW5ndGggLT0gc2Vuc2Vfc3o7CkBAIC0xODgyLDIxICsxODUyLDI1IEBACiAJdWludDMyX3QgaGFuZGxlID0gTFNXKHBrdC0+aGFuZGxlKTsKIAl1aW50MTZfdCBxdWUgPSBNU1cocGt0LT5oYW5kbGUpOwogCXN0cnVjdCByZXFfcXVlICpyZXEgPSBoYS0+cmVxX3FfbWFwW3F1ZV07Ci0jaWYgZGVmaW5lZChRTF9ERUJVR19MRVZFTF8yKQorCiAJaWYgKHBrdC0+ZW50cnlfc3RhdHVzICYgUkZfSU5WX0VfT1JERVIpCi0JCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IEludmFsaWQgRW50cnkgT3JkZXJcbiIsIF9fZnVuY19fKTsKKwkJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwMmEsCisJCSAgICAiSW52YWxpZCBFbnRyeSBPcmRlci5cbiIpOwogCWVsc2UgaWYgKHBrdC0+ZW50cnlfc3RhdHVzICYgUkZfSU5WX0VfQ09VTlQpCi0JCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IEludmFsaWQgRW50cnkgQ291bnRcbiIsIF9fZnVuY19fKTsKKwkJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwMmIsCisJCSAgICAiSW52YWxpZCBFbnRyeSBDb3VudC5cbiIpOwogCWVsc2UgaWYgKHBrdC0+ZW50cnlfc3RhdHVzICYgUkZfSU5WX0VfUEFSQU0pCi0JCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLAotCQkgICAgIiVzOiBJbnZhbGlkIEVudHJ5IFBhcmFtZXRlclxuIiwgX19mdW5jX18pOworCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTAyYywKKwkJICAgICJJbnZhbGlkIEVudHJ5IFBhcmFtZXRlci5cbiIpOwogCWVsc2UgaWYgKHBrdC0+ZW50cnlfc3RhdHVzICYgUkZfSU5WX0VfVFlQRSkKLQkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogSW52YWxpZCBFbnRyeSBUeXBlXG4iLCBfX2Z1bmNfXyk7CisJCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDJkLAorCQkgICAgIkludmFsaWQgRW50cnkgVHlwZS5cbiIpOwogCWVsc2UgaWYgKHBrdC0+ZW50cnlfc3RhdHVzICYgUkZfQlVTWSkKLQkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogQnVzeVxuIiwgX19mdW5jX18pOworCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTAyZSwKKwkJICAgICJCdXN5LlxuIik7CiAJZWxzZQotCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBVTktOT1dOIGZsYWcgZXJyb3JcbiIsIF9fZnVuY19fKTsKLSNlbmRpZgorCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTAyZiwKKwkJICAgICJVTktOT1dOIGZsYWcgZXJyb3IuXG4iKTsKIAogCS8qIFZhbGlkYXRlIGhhbmRsZS4gKi8KIAlpZiAoaGFuZGxlIDwgTUFYX09VVFNUQU5ESU5HX0NPTU1BTkRTKQpAQCAtMTkyMywxMCArMTg5Nyw4IEBACiAJfSBlbHNlIGlmIChwa3QtPmVudHJ5X3R5cGUgPT0gQ09NTUFORF9BNjRfVFlQRSB8fCBwa3QtPmVudHJ5X3R5cGUgPT0KIAkJQ09NTUFORF9UWVBFIHx8IHBrdC0+ZW50cnlfdHlwZSA9PSBDT01NQU5EX1RZUEVfNwogCQl8fCBwa3QtPmVudHJ5X3R5cGUgPT0gQ09NTUFORF9UWVBFXzYpIHsKLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBFcnJvciBlbnRyeSAtIGludmFsaWQgaGFuZGxlXG4iLAotCQkJdmhhLT5ob3N0X25vKSk7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSJFcnJvciBlbnRyeSAtIGludmFsaWQgaGFuZGxlXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NTAzMCwKKwkJICAgICJFcnJvciBlbnRyeSAtIGludmFsaWQgaGFuZGxlLlxuIik7CiAKIAkJaWYgKElTX1FMQTgyWFgoaGEpKQogCQkJc2V0X2JpdChGQ09FX0NUWF9SRVNFVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CkBAIC0xOTYwLDExICsxOTMyLDExIEBACiAJfQogCiAJaWYgKGhhLT5tY3ApIHsKLQkJREVCVUczKHByaW50aygiJXMoJWxkKTogR290IG1haWxib3ggY29tcGxldGlvbi4gY21kPSV4LlxuIiwKLQkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIGhhLT5tY3AtPm1iWzBdKSk7CisJCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDRkLAorCQkgICAgIkdvdCBtYWlsYm94IGNvbXBsZXRpb24uIGNtZD0leC5cbiIsIGhhLT5tY3AtPm1iWzBdKTsKIAl9IGVsc2UgewotCQlERUJVRzJfMyhwcmludGsoIiVzKCVsZCk6IE1CWCBwb2ludGVyIEVSUk9SIVxuIiwKLQkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwNGUsCisJCSAgICAiTUJYIHBvaW50ZXIgRVJST1IuXG4iKTsKIAl9CiB9CiAKQEAgLTE5OTMsOCArMTk2NSw4IEBACiAJCX0KIAogCQlpZiAocGt0LT5lbnRyeV9zdGF0dXMgIT0gMCkgewotCQkJREVCVUczKHByaW50ayhLRVJOX0lORk8KLQkJCSAgICAic2NzaSglbGQpOiBQcm9jZXNzIGVycm9yIGVudHJ5LlxuIiwgdmhhLT5ob3N0X25vKSk7CisJCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTAyOSwKKwkJCSAgICAiUHJvY2VzcyBlcnJvciBlbnRyeS5cbiIpOwogCiAJCQlxbGEyeDAwX2Vycm9yX2VudHJ5KHZoYSwgcnNwLCAoc3RzX2VudHJ5X3QgKikgcGt0KTsKIAkJCSgocmVzcG9uc2VfdCAqKXBrdCktPnNpZ25hdHVyZSA9IFJFU1BPTlNFX1BST0NFU1NFRDsKQEAgLTIwMzAsMTAgKzIwMDIsMTAgQEAKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJLyogVHlwZSBOb3QgU3VwcG9ydGVkLiAqLwotCQkJREVCVUc0KHByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSAgICAic2NzaSglbGQpOiBSZWNlaXZlZCB1bmtub3duIHJlc3BvbnNlIHBrdCB0eXBlICV4ICIKKwkJCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDQyLAorCQkJICAgICJSZWNlaXZlZCB1bmtub3duIHJlc3BvbnNlIHBrdCB0eXBlICV4ICIKIAkJCSAgICAiZW50cnkgc3RhdHVzPSV4LlxuIiwKLQkJCSAgICB2aGEtPmhvc3Rfbm8sIHBrdC0+ZW50cnlfdHlwZSwgcGt0LT5lbnRyeV9zdGF0dXMpKTsKKwkJCSAgICBwa3QtPmVudHJ5X3R5cGUsIHBrdC0+ZW50cnlfc3RhdHVzKTsKIAkJCWJyZWFrOwogCQl9CiAJCSgocmVzcG9uc2VfdCAqKXBrdCktPnNpZ25hdHVyZSA9IFJFU1BPTlNFX1BST0NFU1NFRDsKQEAgLTIwODgsNyArMjA2MCw4IEBACiAKIG5leHRfdGVzdDoKIAlpZiAoUkRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV9jOCkgJiBCSVRfMykKLQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiQWRkaXRpb25hbCBjb2RlIC0tIDB4NTVBQS5cbiIpOworCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg1MDRjLAorCQkgICAgIkFkZGl0aW9uYWwgY29kZSAtLSAweDU1QUEuXG4iKTsKIAogZG9uZToKIAlXUlRfUkVHX0RXT1JEKCZyZWctPmlvYmFzZV93aW5kb3csIDB4MDAwMCk7CkBAIC0yMTIxLDcgKzIwOTQsNyBAQAogCXJzcCA9IChzdHJ1Y3QgcnNwX3F1ZSAqKSBkZXZfaWQ7CiAJaWYgKCFyc3ApIHsKIAkJcHJpbnRrKEtFUk5fSU5GTwotCQkgICAgIiVzKCk6IE5VTEwgcmVzcG9uc2UgcXVldWUgcG9pbnRlclxuIiwgX19mdW5jX18pOworCQkgICAgIiVzKCk6IE5VTEwgcmVzcG9uc2UgcXVldWUgcG9pbnRlci5cbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIElSUV9OT05FOwogCX0KIApAQCAtMjE0Miw4ICsyMTE1LDkgQEAKIAogCQkJaGNjciA9IFJEX1JFR19EV09SRCgmcmVnLT5oY2NyKTsKIAotCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiUklTQyBwYXVzZWQgLS0gSENDUj0leCwgIgotCQkJICAgICJEdW1waW5nIGZpcm13YXJlIVxuIiwgaGNjcik7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg1MDRiLAorCQkJICAgICJSSVNDIHBhdXNlZCAtLSBIQ0NSPSV4LCBEdW1waW5nIGZpcm13YXJlLlxuIiwKKwkJCSAgICBoY2NyKTsKIAogCQkJcWxhMnh4eF9jaGVja19yaXNjX3N0YXR1cyh2aGEpOwogCkBAIC0yMTc0LDkgKzIxNDgsOCBAQAogCQkJcWxhMjR4eF9wcm9jZXNzX3Jlc3BvbnNlX3F1ZXVlKHZoYSwgcnNwKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBVbnJlY29nbml6ZWQgaW50ZXJydXB0IHR5cGUgIgotCQkJICAgICIoJWQpLlxuIiwKLQkJCSAgICB2aGEtPmhvc3Rfbm8sIHN0YXQgJiAweGZmKSk7CisJCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTA0ZiwKKwkJCSAgICAiVW5yZWNvZ25pemVkIGludGVycnVwdCB0eXBlICglZCkuXG4iLCBzdGF0ICogMHhmZik7CiAJCQlicmVhazsKIAkJfQogCQlXUlRfUkVHX0RXT1JEKCZyZWctPmhjY3IsIEhDQ1JYX0NMUl9SSVNDX0lOVCk7CkBAIC0yMjA1LDcgKzIxNzgsNyBAQAogCXJzcCA9IChzdHJ1Y3QgcnNwX3F1ZSAqKSBkZXZfaWQ7CiAJaWYgKCFyc3ApIHsKIAkJcHJpbnRrKEtFUk5fSU5GTwotCQkiJXMoKTogTlVMTCByZXNwb25zZSBxdWV1ZSBwb2ludGVyXG4iLCBfX2Z1bmNfXyk7CisJCSIlcygpOiBOVUxMIHJlc3BvbnNlIHF1ZXVlIHBvaW50ZXIuXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CiAJaGEgPSByc3AtPmh3OwpAQCAtMjIzNSw3ICsyMjA4LDcgQEAKIAlyc3AgPSAoc3RydWN0IHJzcF9xdWUgKikgZGV2X2lkOwogCWlmICghcnNwKSB7CiAJCXByaW50ayhLRVJOX0lORk8KLQkJCSIlcygpOiBOVUxMIHJlc3BvbnNlIHF1ZXVlIHBvaW50ZXJcbiIsIF9fZnVuY19fKTsKKwkJCSIlcygpOiBOVUxMIHJlc3BvbnNlIHF1ZXVlIHBvaW50ZXIuXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CiAJaGEgPSByc3AtPmh3OwpAQCAtMjI2OCw4ICsyMjQxLDggQEAKIAogCXJzcCA9IChzdHJ1Y3QgcnNwX3F1ZSAqKSBkZXZfaWQ7CiAJaWYgKCFyc3ApIHsKLQkJREVCVUcocHJpbnRrKAotCQkiJXMoKTogTlVMTCByZXNwb25zZSBxdWV1ZSBwb2ludGVyXG4iLCBfX2Z1bmNfXykpOworCQlwcmludGsoS0VSTl9JTkZPCisJCQkiJXMoKTogTlVMTCByZXNwb25zZSBxdWV1ZSBwb2ludGVyLlxuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gSVJRX05PTkU7CiAJfQogCWhhID0gcnNwLT5odzsKQEAgLTIyODYsOCArMjI1OSw5IEBACiAKIAkJCWhjY3IgPSBSRF9SRUdfRFdPUkQoJnJlZy0+aGNjcik7CiAKLQkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlJJU0MgcGF1c2VkIC0tIEhDQ1I9JXgsICIKLQkJCSAgICAiRHVtcGluZyBmaXJtd2FyZSFcbiIsIGhjY3IpOworCQkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4NTA1MCwKKwkJCSAgICAiUklTQyBwYXVzZWQgLS0gSENDUj0leCwgRHVtcGluZyBmaXJtd2FyZS5cbiIsCisJCQkgICAgaGNjcik7CiAKIAkJCXFsYTJ4eHhfY2hlY2tfcmlzY19zdGF0dXModmhhKTsKIApAQCAtMjMxOCw5ICsyMjkyLDggQEAKIAkJCXFsYTI0eHhfcHJvY2Vzc19yZXNwb25zZV9xdWV1ZSh2aGEsIHJzcCk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogVW5yZWNvZ25pemVkIGludGVycnVwdCB0eXBlICIKLQkJCSAgICAiKCVkKS5cbiIsCi0JCQkgICAgdmhhLT5ob3N0X25vLCBzdGF0ICYgMHhmZikpOworCQkJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwNTEsCisJCQkgICAgIlVucmVjb2duaXplZCBpbnRlcnJ1cHQgdHlwZSAoJWQpLlxuIiwgc3RhdCAmIDB4ZmYpOwogCQkJYnJlYWs7CiAJCX0KIAkJV1JUX1JFR19EV09SRCgmcmVnLT5oY2NyLCBIQ0NSWF9DTFJfUklTQ19JTlQpOwpAQCAtMjM1OCw2ICsyMzMxLDcgQEAKIHsKIAlpbnQgaTsKIAlzdHJ1Y3QgcWxhX21zaXhfZW50cnkgKnFlbnRyeTsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgaGEtPm1zaXhfY291bnQ7IGkrKykgewogCQlxZW50cnkgPSAmaGEtPm1zaXhfZW50cmllc1tpXTsKQEAgLTIzNjgsNiArMjM0Miw4IEBACiAJa2ZyZWUoaGEtPm1zaXhfZW50cmllcyk7CiAJaGEtPm1zaXhfZW50cmllcyA9IE5VTEw7CiAJaGEtPmZsYWdzLm1zaXhfZW5hYmxlZCA9IDA7CisJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDA0MiwKKwkgICAgIkRpc2FibGVkIHRoZSBNU0kuXG4iKTsKIH0KIAogc3RhdGljIGludApAQCAtMjM3NywxMSArMjM1MywxNSBAQAogCWludCBpLCByZXQ7CiAJc3RydWN0IG1zaXhfZW50cnkgKmVudHJpZXM7CiAJc3RydWN0IHFsYV9tc2l4X2VudHJ5ICpxZW50cnk7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCiAJZW50cmllcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtc2l4X2VudHJ5KSAqIGhhLT5tc2l4X2NvdW50LAogCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFlbnRyaWVzKQorCWlmICghZW50cmllcykgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMGJjLAorCQkgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIG1zaXhfZW50cnkuXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CisJfQogCiAJZm9yIChpID0gMDsgaSA8IGhhLT5tc2l4X2NvdW50OyBpKyspCiAJCWVudHJpZXNbaV0uZW50cnkgPSBpOwpAQCAtMjM5MSwxNiArMjM3MSwxOCBAQAogCQlpZiAocmV0IDwgTUlOX01TSVhfQ09VTlQpCiAJCQlnb3RvIG1zaXhfZmFpbGVkOwogCi0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSJNU0ktWDogRmFpbGVkIHRvIGVuYWJsZSBzdXBwb3J0IC0tICVkLyVkXG4iCi0JCQkiIFJldHJ5IHdpdGggJWQgdmVjdG9yc1xuIiwgaGEtPm1zaXhfY291bnQsIHJldCwgcmV0KTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDBjNiwKKwkJICAgICJNU0ktWDogRmFpbGVkIHRvIGVuYWJsZSBzdXBwb3J0ICIKKwkJICAgICItLSAlZC8lZFxuIFJldHJ5IHdpdGggJWQgdmVjdG9ycy5cbiIsCisJCSAgICBoYS0+bXNpeF9jb3VudCwgcmV0LCByZXQpOwogCQloYS0+bXNpeF9jb3VudCA9IHJldDsKIAkJcmV0ID0gcGNpX2VuYWJsZV9tc2l4KGhhLT5wZGV2LCBlbnRyaWVzLCBoYS0+bXNpeF9jb3VudCk7CiAJCWlmIChyZXQpIHsKIG1zaXhfZmFpbGVkOgotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiTVNJLVg6IEZhaWxlZCB0byBlbmFibGUiCi0JCQkJIiBzdXBwb3J0LCBnaXZpbmcgdXAgLS0gJWQvJWRcbiIsCi0JCQkJaGEtPm1zaXhfY291bnQsIHJldCk7CisJCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDBjNywKKwkJCSAgICAiTVNJLVg6IEZhaWxlZCB0byBlbmFibGUgc3VwcG9ydCwgIgorCQkJICAgICJnaXZpbmcgICB1cCAtLSAlZC8lZC5cbiIsCisJCQkgICAgaGEtPm1zaXhfY291bnQsIHJldCk7CiAJCQlnb3RvIG1zaXhfb3V0OwogCQl9CiAJCWhhLT5tYXhfcnNwX3F1ZXVlcyA9IGhhLT5tc2l4X2NvdW50IC0gMTsKQEAgLTI0MDgsNiArMjM5MCw4IEBACiAJaGEtPm1zaXhfZW50cmllcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBxbGFfbXNpeF9lbnRyeSkgKgogCQkJCWhhLT5tc2l4X2NvdW50LCBHRlBfS0VSTkVMKTsKIAlpZiAoIWhhLT5tc2l4X2VudHJpZXMpIHsKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwYzgsCisJCSAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgaGEtPm1zaXhfZW50cmllcy5cbiIpOwogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIG1zaXhfb3V0OwogCX0KQEAgLTI0MzQsOSArMjQxOCw5IEBACiAJCQkJMCwgbXNpeF9lbnRyaWVzW2ldLm5hbWUsIHJzcCk7CiAJCX0KIAkJaWYgKHJldCkgewotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJIk1TSS1YOiBVbmFibGUgdG8gcmVnaXN0ZXIgaGFuZGxlciAtLSAleC8lZC5cbiIsCi0JCQlxZW50cnktPnZlY3RvciwgcmV0KTsKKwkJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMGNiLAorCQkJICAgICJNU0ktWDogdW5hYmxlIHRvIHJlZ2lzdGVyIGhhbmRsZXIgLS0gJXgvJWQuXG4iLAorCQkJICAgIHFlbnRyeS0+dmVjdG9yLCByZXQpOwogCQkJcWxhMjR4eF9kaXNhYmxlX21zaXgoaGEpOwogCQkJaGEtPm1xZW5hYmxlID0gMDsKIAkJCWdvdG8gbXNpeF9vdXQ7CkBAIC0yNDQ5LDYgKzI0MzMsMTIgQEAKIAkvKiBFbmFibGUgTVNJLVggdmVjdG9yIGZvciByZXNwb25zZSBxdWV1ZSB1cGRhdGUgZm9yIHF1ZXVlIDAgKi8KIAlpZiAoaGEtPm1xaW9iYXNlICYmICAoaGEtPm1heF9yc3BfcXVldWVzID4gMSB8fCBoYS0+bWF4X3JlcV9xdWV1ZXMgPiAxKSkKIAkJaGEtPm1xZW5hYmxlID0gMTsKKwlxbF9kYmcocWxfZGJnX211bHRpcSwgdmhhLCAweGMwMDUsCisJICAgICJtcWlvYmFzZT0lcCwgbWF4X3JzcF9xdWV1ZXM9JWQsIG1heF9yZXFfcXVldWVzPSVkLlxuIiwKKwkgICAgaGEtPm1xaW9iYXNlLCBoYS0+bWF4X3JzcF9xdWV1ZXMsIGhhLT5tYXhfcmVxX3F1ZXVlcyk7CisJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDA1NSwKKwkgICAgIm1xaW9iYXNlPSVwLCBtYXhfcnNwX3F1ZXVlcz0lZCwgbWF4X3JlcV9xdWV1ZXM9JWQuXG4iLAorCSAgICBoYS0+bXFpb2Jhc2UsIGhhLT5tYXhfcnNwX3F1ZXVlcywgaGEtPm1heF9yZXFfcXVldWVzKTsKIAogbXNpeF9vdXQ6CiAJa2ZyZWUoZW50cmllcyk7CkBAIC0yNDYwLDYgKzI0NTAsNyBAQAogewogCWludCByZXQ7CiAJZGV2aWNlX3JlZ190IF9faW9tZW0gKnJlZyA9IGhhLT5pb2Jhc2U7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCiAJLyogSWYgcG9zc2libGUsIGVuYWJsZSBNU0ktWC4gKi8KIAlpZiAoIUlTX1FMQTI0MzIoaGEpICYmICFJU19RTEEyNTMyKGhhKSAmJgpAQCAtMjQ3MCwzMCArMjQ2MSwzMCBAQAogCQkoaGEtPnBkZXYtPnN1YnN5c3RlbV9kZXZpY2UgPT0gMHg3MDQwIHx8CiAJCWhhLT5wZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4NzA0MSB8fAogCQloYS0+cGRldi0+c3Vic3lzdGVtX2RldmljZSA9PSAweDE3MDUpKSB7Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkiTVNJLVg6IFVuc3VwcG9ydGVkIElTUDI0MzIgU1NWSUQvU1NESUQgKDB4JVgsMHglWCkuXG4iLAorCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMDM0LAorCQkgICAgIk1TSS1YOiBVbnN1cHBvcnRlZCBJU1AgMjQzMiBTU1ZJRC9TU0RJRCAoMHglWCwweCVYKS5cbiIsCiAJCQloYS0+cGRldi0+c3Vic3lzdGVtX3ZlbmRvciwKLQkJCWhhLT5wZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKSk7CisJCQloYS0+cGRldi0+c3Vic3lzdGVtX2RldmljZSk7CiAJCWdvdG8gc2tpcF9tc2k7CiAJfQogCiAJaWYgKElTX1FMQTI0MzIoaGEpICYmIChoYS0+cGRldi0+cmV2aXNpb24gPCBRTEFfTVNJWF9DSElQX1JFVl8yNFhYIHx8CiAJCSFRTEFfTVNJWF9GV19NT0RFXzEoaGEtPmZ3X2F0dHJpYnV0ZXMpKSkgewotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkiTVNJLVg6IFVuc3VwcG9ydGVkIElTUDI0MzIgKDB4JVgsIDB4JVgpLlxuIiwKLQkJCWhhLT5wZGV2LT5yZXZpc2lvbiwgaGEtPmZ3X2F0dHJpYnV0ZXMpKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDAzNSwKKwkJICAgICJNU0ktWDsgVW5zdXBwb3J0ZWQgSVNQMjQzMiAoMHglWCwgMHglWCkuXG4iLAorCQkgICAgaGEtPnBkZXYtPnJldmlzaW9uLCBoYS0+ZndfYXR0cmlidXRlcyk7CiAJCWdvdG8gc2tpcF9tc2l4OwogCX0KIAogCXJldCA9IHFsYTI0eHhfZW5hYmxlX21zaXgoaGEsIHJzcCk7CiAJaWYgKCFyZXQpIHsKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJICAgICJNU0ktWDogRW5hYmxlZCAoMHglWCwgMHglWCkuXG4iLCBoYS0+Y2hpcF9yZXZpc2lvbiwKLQkJICAgIGhhLT5md19hdHRyaWJ1dGVzKSk7CisJCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwMzYsCisJCSAgICAiTVNJLVg6IEVuYWJsZWQgKDB4JVgsIDB4JVgpLlxuIiwKKwkJICAgIGhhLT5jaGlwX3JldmlzaW9uLCBoYS0+ZndfYXR0cmlidXRlcyk7CiAJCWdvdG8gY2xlYXJfcmlzY19pbnRzOwogCX0KLQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JICAgICJNU0ktWDogRmFsbGluZyBiYWNrLXRvIE1TSSBtb2RlIC0tICVkLlxuIiwgcmV0KTsKKwlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHgwMDM3LAorCSAgICAiTVNJLVggRmFsbGluZyBiYWNrLXRvIE1TSSBtb2RlIC0lZC5cbiIsIHJldCk7CiBza2lwX21zaXg6CiAKIAlpZiAoIUlTX1FMQTI0WFgoaGEpICYmICFJU19RTEEyNTMyKGhhKSAmJiAhSVNfUUxBODQzMihoYSkgJiYKQEAgLTI1MDIsMTggKzI0OTMsMTkgQEAKIAogCXJldCA9IHBjaV9lbmFibGVfbXNpKGhhLT5wZGV2KTsKIAlpZiAoIXJldCkgewotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiTVNJOiBFbmFibGVkLlxuIikpOworCQlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMDM4LAorCQkgICAgIk1TSTogRW5hYmxlZC5cbiIpOwogCQloYS0+ZmxhZ3MubXNpX2VuYWJsZWQgPSAxOwogCX0gZWxzZQotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiTVNJLVg6IEZhbGxpbmcgYmFjay10byBJTlRhIG1vZGUgLS0gJWQuXG4iLCByZXQpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMDM5LAorCQkgICAgIk1TSS1YOyBGYWxsaW5nIGJhY2stdG8gSU5UYSBtb2RlIC0tICVkLlxuIiwgcmV0KTsKIHNraXBfbXNpOgogCiAJcmV0ID0gcmVxdWVzdF9pcnEoaGEtPnBkZXYtPmlycSwgaGEtPmlzcF9vcHMtPmludHJfaGFuZGxlciwKIAkgICAgaGEtPmZsYWdzLm1zaV9lbmFibGVkID8gMCA6IElSUUZfU0hBUkVELAogCSAgICBRTEEyWFhYX0RSSVZFUl9OQU1FLCByc3ApOwogCWlmIChyZXQpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMDNhLAogCQkgICAgIkZhaWxlZCB0byByZXNlcnZlIGludGVycnVwdCAlZCBhbHJlYWR5IGluIHVzZS5cbiIsCiAJCSAgICBoYS0+cGRldi0+aXJxKTsKIAkJZ290byBmYWlsOwpAQCAtMjU2MywxMyArMjU1NSwxNCBAQAogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSByc3AtPmh3OwogCXN0cnVjdCBxbGFfaW5pdF9tc2l4X2VudHJ5ICppbnRyID0gJm1zaXhfZW50cmllc1syXTsKIAlzdHJ1Y3QgcWxhX21zaXhfZW50cnkgKm1zaXggPSByc3AtPm1zaXg7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCWludCByZXQ7CiAKIAlyZXQgPSByZXF1ZXN0X2lycShtc2l4LT52ZWN0b3IsIGludHItPmhhbmRsZXIsIDAsIGludHItPm5hbWUsIHJzcCk7CiAJaWYgKHJldCkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkiTVNJLVg6IFVuYWJsZSB0byByZWdpc3RlciBoYW5kbGVyIC0tICV4LyVkLlxuIiwKLQkJCW1zaXgtPnZlY3RvciwgcmV0KTsKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwZTYsCisJCSAgICAiTVNJLVg6IFVuYWJsZSB0byByZWdpc3RlciBoYW5kbGVyIC0tICV4LyVkLlxuIiwKKwkJICAgIG1zaXgtPnZlY3RvciwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAJbXNpeC0+aGF2ZV9pcnEgPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21ieC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21ieC5jCmluZGV4IGMyNmYwYWMuLmY3NjA0ZWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWJ4LmMKQEAgLTQ2LDE0ICs0NiwxOCBAQAogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXNjc2lfcWxhX2hvc3RfdCAqYmFzZV92aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCi0JaWYgKGhhLT5wZGV2LT5lcnJvcl9zdGF0ZSA+IHBjaV9jaGFubmVsX2lvX2Zyb3plbikKKwlxbF9kYmcocWxfZGJnX21ieCwgYmFzZV92aGEsIDB4MTAwMCwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CisKKwlpZiAoaGEtPnBkZXYtPmVycm9yX3N0YXRlID4gcGNpX2NoYW5uZWxfaW9fZnJvemVuKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgYmFzZV92aGEsIDB4MTAwMSwKKwkJICAgICJlcnJvcl9zdGF0ZSBpcyBncmVhdGVyIHRoYW4gcGNpX2NoYW5uZWxfaW9fZnJvemVuLCAiCisJCSAgICAiZXhpdGluZy5cbiIpOwogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX1RJTUVPVVQ7CisJfQogCiAJaWYgKHZoYS0+ZGV2aWNlX2ZsYWdzICYgREZMR19ERVZfRkFJTEVEKSB7Ci0JCURFQlVHMl8zXzExKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSIlcyglbGQpOiBEZXZpY2UgaW4gZmFpbGVkIHN0YXRlLCAiCi0JCQkidGltZW91dCBNQlggRXhpdGluZy5cbiIsCi0JCQlfX2Z1bmNfXywgYmFzZV92aGEtPmhvc3Rfbm8pKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCBiYXNlX3ZoYSwgMHgxMDAyLAorCQkgICAgIkRldmljZSBpbiBmYWlsZWQgc3RhdGUsIGV4aXRpbmcuXG4iKTsKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9USU1FT1VUOwogCX0KIApAQCAtNjMsMTcgKzY3LDE4IEBACiAJcnZhbCA9IFFMQV9TVUNDRVNTOwogCWFib3J0X2FjdGl2ZSA9IHRlc3RfYml0KEFCT1JUX0lTUF9BQ1RJVkUsICZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKTsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vKSk7CiAKIAlpZiAoaGEtPmZsYWdzLnBjaV9jaGFubmVsX2lvX3Blcm1fZmFpbHVyZSkgewotCQlERUJVRyhwcmludGsoIiVzKCVsZCk6IFBlcm0gZmFpbHVyZSBvbiBFRUgsIHRpbWVvdXQgTUJYICIKLQkJCSAgICAgIkV4aXRpbmcuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgYmFzZV92aGEsIDB4MTAwMywKKwkJICAgICJQZXJtIGZhaWx1cmUgb24gRUVIIHRpbWVvdXQgTUJYLCBleGl0aW5nLlxuIik7CiAJCXJldHVybiBRTEFfRlVOQ1RJT05fVElNRU9VVDsKIAl9CiAKIAlpZiAoaGEtPmZsYWdzLmlzcDgyeHhfZndfaHVuZykgewogCQkvKiBTZXR0aW5nIExpbmstRG93biBlcnJvciAqLwogCQltY3AtPm1iWzBdID0gTUJTX0xJTktfRE9XTl9FUlJPUjsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCBiYXNlX3ZoYSwgMHgxMDA0LAorCQkgICAgIkZXIGh1bmcgPSAlZC5cbiIsIGhhLT5mbGFncy5pc3A4Mnh4X2Z3X2h1bmcpOwogCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAkJZ290byBwcmVtYXR1cmVfZXhpdDsKIAl9CkBAIC04NSw4ICs5MCw4IEBACiAJICovCiAJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmhhLT5tYnhfY21kX2NvbXAsIG1jcC0+dG92ICogSFopKSB7CiAJCS8qIFRpbWVvdXQgb2NjdXJyZWQuIFJldHVybiBlcnJvci4gKi8KLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBjbWQgYWNjZXNzIHRpbWVvdXQuICIKLQkJICAgICJFeGl0aW5nLlxuIiwgX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgYmFzZV92aGEsIDB4MTAwNSwKKwkJICAgICJDbWQgYWNjZXNzIHRpbWVvdXQsIEV4aXRpbmcuXG4iKTsKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9USU1FT1VUOwogCX0KIApAQCAtOTQsOCArOTksOCBAQAogCS8qIFNhdmUgbWFpbGJveCBjb21tYW5kIGZvciBkZWJ1ZyAqLwogCWhhLT5tY3AgPSBtY3A7CiAKLQlERUJVRzExKHByaW50aygic2NzaSglbGQpOiBwcmVwYXJlIHRvIGlzc3VlIG1ib3ggY21kPTB4JXguXG4iLAotCSAgICBiYXNlX3ZoYS0+aG9zdF9ubywgbWNwLT5tYlswXSkpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCBiYXNlX3ZoYSwgMHgxMDA2LAorCSAgICAiUHJlcGFyZSB0byBpc3N1ZSBtYm94IGNtZD0weCV4LlxuIiwgbWNwLT5tYlswXSk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIApAQCAtMTIzLDI3ICsxMjgsMzAgQEAKIAkJaXB0cisrOwogCX0KIAotI2lmIGRlZmluZWQoUUxfREVCVUdfTEVWRUxfMSkKLQlwcmludGsoIiVzKCVsZCk6IExvYWRlZCBNQlggcmVnaXN0ZXJzIChkaXNwbGF5ZWQgaW4gYnl0ZXMpID0gXG4iLAotCSAgICBfX2Z1bmNfXywgYmFzZV92aGEtPmhvc3Rfbm8pOwotCXFsYTJ4MDBfZHVtcF9idWZmZXIoKHVpbnQ4X3QgKiltY3AtPm1iLCAxNik7Ci0JcHJpbnRrKCJcbiIpOwotCXFsYTJ4MDBfZHVtcF9idWZmZXIoKCh1aW50OF90ICopbWNwLT5tYiArIDB4MTApLCAxNik7Ci0JcHJpbnRrKCJcbiIpOwotCXFsYTJ4MDBfZHVtcF9idWZmZXIoKCh1aW50OF90ICopbWNwLT5tYiArIDB4MjApLCA4KTsKLQlwcmludGsoIlxuIik7Ci0JcHJpbnRrKCIlcyglbGQpOiBJL08gYWRkcmVzcyA9ICVwLlxuIiwgX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vLAotCQlvcHRyKTsKLQlxbGEyeDAwX2R1bXBfcmVncyhiYXNlX3ZoYSk7Ci0jZW5kaWYKKwlxbF9kYmcocWxfZGJnX21ieCArIHFsX2RiZ19idWZmZXIsIGJhc2VfdmhhLCAweDExMTEsCisJICAgICJMb2FkZWQgTUJYIHJlZ2lzdGVycyAoZGlzcGxheWVkIGluIGJ5dGVzKSA9LlxuIik7CisJcWxfZHVtcF9idWZmZXIocWxfZGJnX21ieCArIHFsX2RiZ19idWZmZXIsIGJhc2VfdmhhLCAweDExMTIsCisJICAgICh1aW50OF90ICopbWNwLT5tYiwgMTYpOworCXFsX2RiZyhxbF9kYmdfbWJ4ICsgcWxfZGJnX2J1ZmZlciwgYmFzZV92aGEsIDB4MTExMywKKwkgICAgIi5cbiIpOworCXFsX2R1bXBfYnVmZmVyKHFsX2RiZ19tYnggKyBxbF9kYmdfYnVmZmVyLCBiYXNlX3ZoYSwgMHgxMTE0LAorCSAgICAoKHVpbnQ4X3QgKiltY3AtPm1iICsgMHgxMCksIDE2KTsKKwlxbF9kYmcocWxfZGJnX21ieCArIHFsX2RiZ19idWZmZXIsIGJhc2VfdmhhLCAweDExMTUsCisJICAgICIuXG4iKTsKKwlxbF9kdW1wX2J1ZmZlcihxbF9kYmdfbWJ4ICsgcWxfZGJnX2J1ZmZlciwgYmFzZV92aGEsIDB4MTExNiwKKwkgICAgKCh1aW50OF90ICopbWNwLT5tYiArIDB4MjApLCA4KTsKKwlxbF9kYmcocWxfZGJnX21ieCArIHFsX2RiZ19idWZmZXIsIGJhc2VfdmhhLCAweDExMTcsCisJICAgICJJL08gQWRkcmVzcyA9ICVwLlxuIiwgb3B0cik7CisJcWxfZHVtcF9yZWdzKHFsX2RiZ19tYnggKyBxbF9kYmdfYnVmZmVyLCBiYXNlX3ZoYSwgMHgxMDBlKTsKIAogCS8qIElzc3VlIHNldCBob3N0IGludGVycnVwdCBjb21tYW5kIHRvIHNlbmQgY21kIG91dC4gKi8KIAloYS0+ZmxhZ3MubWJveF9pbnQgPSAwOwogCWNsZWFyX2JpdChNQlhfSU5URVJSVVBULCAmaGEtPm1ieF9jbWRfZmxhZ3MpOwogCiAJLyogVW5sb2NrIG1ieCByZWdpc3RlcnMgYW5kIHdhaXQgZm9yIGludGVycnVwdCAqLwotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBnb2luZyB0byB1bmxvY2sgaXJxICYgd2FpdGluZyBmb3IgaW50ZXJydXB0LiAiCi0JICAgICJqaWZmaWVzPSVseC5cbiIsIF9fZnVuY19fLCBiYXNlX3ZoYS0+aG9zdF9ubywgamlmZmllcykpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCBiYXNlX3ZoYSwgMHgxMDBmLAorCSAgICAiR29pbmcgdG8gdW5sb2NrIGlycSAmIHdhaXRpbmcgZm9yIGludGVycnVwdHMuICIKKwkgICAgImppZmZpZXM9JWx4LlxuIiwgamlmZmllcyk7CiAKIAkvKiBXYWl0IGZvciBtYnggY21kIGNvbXBsZXRpb24gdW50aWwgdGltZW91dCAqLwogCkBAIC0xNTUsOSArMTYzLDggQEAKIAkJCQlISU5UX01CWF9JTlRfUEVORElORykgewogCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhLT5oYXJkd2FyZV9sb2NrLAogCQkJCQlmbGFncyk7Ci0JCQkJREVCVUcyXzNfMTEocHJpbnRrKEtFUk5fSU5GTwotCQkJCSAgICAiJXMoJWxkKTogUGVuZGluZyBNYWlsYm94IHRpbWVvdXQuICIKLQkJCQkgICAgIkV4aXRpbmcuXG4iLCBfX2Z1bmNfXywgYmFzZV92aGEtPmhvc3Rfbm8pKTsKKwkJCQlxbF9kYmcocWxfZGJnX21ieCwgYmFzZV92aGEsIDB4MTAxMCwKKwkJCQkgICAgIlBlbmRpbmcgbWFpbGJveCB0aW1lb3V0LCBleGl0aW5nLlxuIik7CiAJCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9USU1FT1VUOwogCQkJCWdvdG8gcHJlbWF0dXJlX2V4aXQ7CiAJCQl9CkBAIC0xNzMsMTcgKzE4MCwxNiBAQAogCQljbGVhcl9iaXQoTUJYX0lOVFJfV0FJVCwgJmhhLT5tYnhfY21kX2ZsYWdzKTsKIAogCX0gZWxzZSB7Ci0JCURFQlVHM18xMShwcmludGsoIiVzKCVsZCk6IGNtZD0leCBQT0xMSU5HIE1PREUuXG4iLCBfX2Z1bmNfXywKLQkJICAgIGJhc2VfdmhhLT5ob3N0X25vLCBjb21tYW5kKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCBiYXNlX3ZoYSwgMHgxMDExLAorCQkgICAgIkNtZD0leCBQb2xsaW5nIE1vZGUuXG4iLCBjb21tYW5kKTsKIAogCQlpZiAoSVNfUUxBODJYWChoYSkpIHsKIAkJCWlmIChSRF9SRUdfRFdPUkQoJnJlZy0+aXNwODIuaGludCkgJgogCQkJCUhJTlRfTUJYX0lOVF9QRU5ESU5HKSB7CiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssCiAJCQkJCWZsYWdzKTsKLQkJCQlERUJVRzJfM18xMShwcmludGsoS0VSTl9JTkZPCi0JCQkJICAgICIlcyglbGQpOiBQZW5kaW5nIE1haWxib3ggdGltZW91dC4gIgotCQkJCSAgICAiRXhpdGluZy5cbiIsIF9fZnVuY19fLCBiYXNlX3ZoYS0+aG9zdF9ubykpOworCQkJCXFsX2RiZyhxbF9kYmdfbWJ4LCBiYXNlX3ZoYSwgMHgxMDEyLAorCQkJCSAgICAiUGVuZGluZyBtYWlsYm94IHRpbWVvdXQsIGV4aXRpbmcuXG4iKTsKIAkJCQlydmFsID0gUUxBX0ZVTkNUSU9OX1RJTUVPVVQ7CiAJCQkJZ290byBwcmVtYXR1cmVfZXhpdDsKIAkJCX0KQEAgLTIwNywxNyArMjEzLDE3IEBACiAJCQkgICAgY29tbWFuZCA9PSBNQkNfTE9BRF9SSVNDX1JBTV9FWFRFTkRFRCkpCiAJCQkJbXNsZWVwKDEwKTsKIAkJfSAvKiB3aGlsZSAqLwotCQlERUJVRzE3KHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSJXYWl0ZWQgJWQgc2VjXG4iLAotCQkJKHVpbnQpKChqaWZmaWVzIC0gKHdhaXRfdGltZSAtIChtY3AtPnRvdiAqIEhaKSkpL0haKSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgYmFzZV92aGEsIDB4MTAxMywKKwkJICAgICJXYWl0ZWQgJWQgc2VjLlxuIiwKKwkJICAgICh1aW50KSgoamlmZmllcyAtICh3YWl0X3RpbWUgLSAobWNwLT50b3YgKiBIWikpKS9IWikpOwogCX0KIAogCS8qIENoZWNrIHdoZXRoZXIgd2UgdGltZWQgb3V0ICovCiAJaWYgKGhhLT5mbGFncy5tYm94X2ludCkgewogCQl1aW50MTZfdCAqaXB0cjI7CiAKLQkJREVCVUczXzExKHByaW50aygiJXMoJWxkKTogY21kICV4IGNvbXBsZXRlZC5cbiIsIF9fZnVuY19fLAotCQkgICAgYmFzZV92aGEtPmhvc3Rfbm8sIGNvbW1hbmQpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIGJhc2VfdmhhLCAweDEwMTQsCisJCSAgICAiQ21kPSV4IGNvbXBsZXRlZC5cbiIsIGNvbW1hbmQpOwogCiAJCS8qIEdvdCBpbnRlcnJ1cHQuIENsZWFyIHRoZSBmbGFnLiAqLwogCQloYS0+ZmxhZ3MubWJveF9pbnQgPSAwOwpAQCAtMjI5LDYgKzIzNSw4IEBACiAJCQltY3AtPm1iWzBdID0gTUJTX0xJTktfRE9XTl9FUlJPUjsKIAkJCWhhLT5tY3AgPSBOVUxMOwogCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIGJhc2VfdmhhLCAweDEwMTUsCisJCQkgICAgIkZXIGh1bmcgPSAlZC5cbiIsIGhhLT5mbGFncy5pc3A4Mnh4X2Z3X2h1bmcpOwogCQkJZ290byBwcmVtYXR1cmVfZXhpdDsKIAkJfQogCkBAIC0yNDksOCArMjU3LDYgQEAKIAkJfQogCX0gZWxzZSB7CiAKLSNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzIpIHx8IGRlZmluZWQoUUxfREVCVUdfTEVWRUxfMykgfHwgXAotCQlkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzExKQogCQl1aW50MTZfdCBtYjA7CiAJCXVpbnQzMl90IGljdHJsOwogCkBAIC0yNjEsMTQgKzI2NywxMyBAQAogCQkJbWIwID0gUkRfTUFJTEJPWF9SRUcoaGEsICZyZWctPmlzcCwgMCk7CiAJCQlpY3RybCA9IFJEX1JFR19XT1JEKCZyZWctPmlzcC5pY3RybCk7CiAJCX0KLQkJcHJpbnRrKCIlcyglbGQpOiAqKioqIE1CIENvbW1hbmQgVGltZW91dCBmb3IgY21kICV4ICoqKipcbiIsCi0JCSAgICBfX2Z1bmNfXywgYmFzZV92aGEtPmhvc3Rfbm8sIGNvbW1hbmQpOwotCQlwcmludGsoIiVzKCVsZCk6IGljb250cm9sPSV4IGppZmZpZXM9JWx4XG4iLCBfX2Z1bmNfXywKLQkJICAgIGJhc2VfdmhhLT5ob3N0X25vLCBpY3RybCwgamlmZmllcyk7Ci0JCXByaW50aygiJXMoJWxkKTogKioqIG1haWxib3hbMF0gPSAweCV4ICoqKlxuIiwgX19mdW5jX18sCi0JCSAgICBiYXNlX3ZoYS0+aG9zdF9ubywgbWIwKTsKLQkJcWxhMngwMF9kdW1wX3JlZ3MoYmFzZV92aGEpOwotI2VuZGlmCisJCXFsX2RiZyhxbF9kYmdfbWJ4ICsgcWxfZGJnX2J1ZmZlciwgYmFzZV92aGEsIDB4MTExOSwKKwkJICAgICJNQlggQ29tbWFuZCB0aW1lb3V0IGZvciBjbWQgJXguXG4iLCBjb21tYW5kKTsKKwkJcWxfZGJnKHFsX2RiZ19tYnggKyBxbF9kYmdfYnVmZmVyLCBiYXNlX3ZoYSwgMHgxMTFhLAorCQkgICAgImlvY29udHJvbD0leCBqaWZmaWVzPSVseC5cbiIsIGljdHJsLCBqaWZmaWVzKTsKKwkJcWxfZGJnKHFsX2RiZ19tYnggKyBxbF9kYmdfYnVmZmVyLCBiYXNlX3ZoYSwgMHgxMTFiLAorCQkgICAgIm1iWzBdID0gMHgleC5cbiIsIG1iMCk7CisJCXFsX2R1bXBfcmVncyhxbF9kYmdfbWJ4ICsgcWxfZGJnX2J1ZmZlciwgYmFzZV92aGEsIDB4MTAxOSk7CiAKIAkJcnZhbCA9IFFMQV9GVU5DVElPTl9USU1FT1VUOwogCX0KQEAgLTI3OSw4ICsyODQsOCBAQAogCWhhLT5tY3AgPSBOVUxMOwogCiAJaWYgKChhYm9ydF9hY3RpdmUgfHwgIWlvX2xvY2tfb24pICYmICFJU19OT1BPTExJTkdfVFlQRShoYSkpIHsKLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGNoZWNraW5nIGZvciBhZGRpdGlvbmFsIHJlc3AgIgotCQkgICAgImludGVycnVwdC5cbiIsIF9fZnVuY19fLCBiYXNlX3ZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgYmFzZV92aGEsIDB4MTAxYSwKKwkJICAgICJDaGVja2luZyBmb3IgYWRkaXRpb25hbCByZXNwIGludGVycnVwdC5cbiIpOwogCiAJCS8qIHBvbGxpbmcgbW9kZSBmb3Igbm9uIGlzcF9hYm9ydCBjb21tYW5kcy4gKi8KIAkJcWxhMngwMF9wb2xsKGhhLT5yc3BfcV9tYXBbMF0pOwpAQCAtMjkxLDM4ICsyOTYsMzIgQEAKIAkJaWYgKCFpb19sb2NrX29uIHx8IChtY3AtPmZsYWdzICYgSU9DVExfQ01EKSB8fAogCQkgICAgaGEtPmZsYWdzLmVlaF9idXN5KSB7CiAJCQkvKiBub3QgaW4gZHBjLiBzY2hlZHVsZSBpdCBmb3IgZHBjIHRvIHRha2Ugb3Zlci4gKi8KLQkJCURFQlVHKHByaW50aygiJXMoJWxkKTogdGltZW91dCBzY2hlZHVsZSAiCi0JCQkiaXNwX2Fib3J0X25lZWRlZC5cbiIsIF9fZnVuY19fLAotCQkJYmFzZV92aGEtPmhvc3Rfbm8pKTsKLQkJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogdGltZW91dCBzY2hlZHVsZSAiCi0JCQkiaXNwX2Fib3J0X25lZWRlZC5cbiIsIF9fZnVuY19fLAotCQkJYmFzZV92aGEtPmhvc3Rfbm8pKTsKKwkJCXFsX2RiZyhxbF9kYmdfbWJ4LCBiYXNlX3ZoYSwgMHgxMDFiLAorCQkJICAgICJUaW1lb3V0LCBzY2hlZHVsZSBpc3BfYWJvcnRfbmVlZGVkLlxuIik7CiAKIAkJCWlmICghdGVzdF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSAmJgogCQkJICAgICF0ZXN0X2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmdmhhLT5kcGNfZmxhZ3MpICYmCiAJCQkgICAgIXRlc3RfYml0KElTUF9BQk9SVF9SRVRSWSwgJnZoYS0+ZHBjX2ZsYWdzKSkgewogCi0JCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJCSAgICAiTWFpbGJveCBjb21tYW5kIHRpbWVvdXQgb2NjdXJyZWQuICIKLQkJCQkgICAgIlNjaGVkdWxpbmcgSVNQICIgImFib3J0LiBlZWhfYnVzeTogMHgleFxuIiwKLQkJCQkgICAgaGEtPmZsYWdzLmVlaF9idXN5KTsKKwkJCQlxbF9sb2cocWxfbG9nX2luZm8sIGJhc2VfdmhhLCAweDEwMWMsCisJCQkJICAgICJNYWlsYm94IGNtZCB0aW1lb3V0IG9jY3VyZWQuICIKKwkJCQkgICAgIlNjaGVkdWxpbmcgSVNQIGFib3J0IGVlaF9idXN5PTB4JXguXG4iLAorCQkJCQloYS0+ZmxhZ3MuZWVoX2J1c3kpOwogCQkJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAkJCQlxbGEyeHh4X3dha2VfZHBjKHZoYSk7CiAJCQl9CiAJCX0gZWxzZSBpZiAoIWFib3J0X2FjdGl2ZSkgewogCQkJLyogY2FsbCBhYm9ydCBkaXJlY3RseSBzaW5jZSB3ZSBhcmUgaW4gdGhlIERQQyB0aHJlYWQgKi8KLQkJCURFQlVHKHByaW50aygiJXMoJWxkKTogdGltZW91dCBjYWxsaW5nIGFib3J0X2lzcFxuIiwKLQkJCSAgICBfX2Z1bmNfXywgYmFzZV92aGEtPmhvc3Rfbm8pKTsKLQkJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogdGltZW91dCBjYWxsaW5nICIKLQkJCSAgICAiYWJvcnRfaXNwXG4iLCBfX2Z1bmNfXywgYmFzZV92aGEtPmhvc3Rfbm8pKTsKKwkJCXFsX2RiZyhxbF9kYmdfbWJ4LCBiYXNlX3ZoYSwgMHgxMDFkLAorCQkJICAgICJUaW1lb3V0LCBjYWxsaW5nIGFib3J0X2lzcC5cbiIpOwogCiAJCQlpZiAoIXRlc3RfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncykgJiYKIAkJCSAgICAhdGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJnZoYS0+ZHBjX2ZsYWdzKSAmJgogCQkJICAgICF0ZXN0X2JpdChJU1BfQUJPUlRfUkVUUlksICZ2aGEtPmRwY19mbGFncykpIHsKIAotCQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCQkgICAgIk1haWxib3ggY29tbWFuZCB0aW1lb3V0IG9jY3VycmVkLiAiCi0JCQkJICAgICJJc3N1aW5nIElTUCBhYm9ydC5cbiIpOworCQkJCXFsX2xvZyhxbF9sb2dfaW5mbywgYmFzZV92aGEsIDB4MTAxZSwKKwkJCQkgICAgIk1haWxib3ggY21kIHRpbWVvdXQgb2NjdXJlZC4gIgorCQkJCSAgICAiU2NoZWR1bGluZyBJU1AgYWJvcnQuXG4iKTsKIAogCQkJCXNldF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAkJCQljbGVhcl9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKQEAgLTMzMiwxMSArMzMxLDggQEAKIAkJCQkJICAgICZ2aGEtPmRwY19mbGFncyk7CiAJCQkJfQogCQkJCWNsZWFyX2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmdmhhLT5kcGNfZmxhZ3MpOwotCQkJCURFQlVHKHByaW50aygiJXMoJWxkKTogZmluaXNoZWQgYWJvcnRfaXNwXG4iLAotCQkJCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7Ci0JCQkJREVCVUcyXzNfMTEocHJpbnRrKAotCQkJCSAgICAiJXMoJWxkKTogZmluaXNoZWQgYWJvcnRfaXNwXG4iLAotCQkJCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCQkJcWxfZGJnKHFsX2RiZ19tYngsIGJhc2VfdmhhLCAweDEwMWYsCisJCQkJICAgICJGaW5pc2hlZCBhYm9ydF9pc3AuXG4iKTsKIAkJCX0KIAkJfQogCX0KQEAgLTM0NiwxMiArMzQyLDExIEBACiAJY29tcGxldGUoJmhhLT5tYnhfY21kX2NvbXApOwogCiAJaWYgKHJ2YWwpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiAqKioqIEZBSUxFRC4gbWJ4MD0leCwgbWJ4MT0leCwgIgotCQkgICAgIm1ieDI9JXgsIGNtZD0leCAqKioqXG4iLCBfX2Z1bmNfXywgYmFzZV92aGEtPmhvc3Rfbm8sCi0JCSAgICBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdLCBtY3AtPm1iWzJdLCBjb21tYW5kKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCBiYXNlX3ZoYSwgMHgxMDIwLAorCQkgICAgIioqKiogRmFpbGVkIG1ieFswXT0leCwgbWJbMV09JXgsIG1iWzJdPSV4LCBjbWQ9JXggKioqKi5cbiIsCisJCSAgICBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdLCBtY3AtPm1iWzJdLCBjb21tYW5kKTsKIAl9IGVsc2UgewotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLAotCQliYXNlX3ZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgYmFzZV92aGEsIDB4MTAyMSwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC0zNjYsNyArMzYxLDcgQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwMjIsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCiAJaWYgKE1TVyhyaXNjX2FkZHIpIHx8IElTX0ZXSTJfQ0FQQUJMRShoYSkpIHsKIAkJbWNwLT5tYlswXSA9IE1CQ19MT0FEX1JJU0NfUkFNX0VYVEVOREVEOwpAQCAtMzk3LDEwICszOTIsMTAgQEAKIAlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXggbWJbMF09JXguXG4iLCBfX2Z1bmNfXywKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwMjMsCisJCSAgICAiRmFpbGVkPSV4IG1iWzBdPSV4LlxuIiwgcnZhbCwgbWNwLT5tYlswXSk7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTAyNCwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC00MzAsNyArNDI1LDcgQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwMjUsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCiAJbWNwLT5tYlswXSA9IE1CQ19FWEVDVVRFX0ZJUk1XQVJFOwogCW1jcC0+b3V0X21iID0gTUJYXzA7CkBAIC00NjEsMTUgKzQ1NiwxNCBAQAogCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leCBtYlswXT0leC5cbiIsIF9fZnVuY19fLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTAyNiwKKwkJICAgICJGYWlsZWQ9JXggbWJbMF09JXguXG4iLCBydmFsLCBtY3AtPm1iWzBdKTsKIAl9IGVsc2UgewogCQlpZiAoSVNfRldJMl9DQVBBQkxFKGhhKSkgewotCQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUgZXhjaGFuZ2VzPSV4LlxuIiwKLQkJCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBtY3AtPm1iWzFdKSk7CisJCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwMjcsCisJCQkgICAgIkRvbmUgZXhjaGFuZ2VzPSV4LlxuIiwgbWNwLT5tYlsxXSk7CiAJCX0gZWxzZSB7Ci0JCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLAotCQkJICAgIHZoYS0+aG9zdF9ubykpOworCQkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDI4LCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAkJfQogCX0KIApAQCAtNTAxLDcgKzQ5NSw3IEBACiAJbWJ4X2NtZF90CW1jOwogCW1ieF9jbWRfdAkqbWNwID0gJm1jOwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDI5LCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAogCW1jcC0+bWJbMF0gPSBNQkNfR0VUX0ZJUk1XQVJFX1ZFUlNJT047CiAJbWNwLT5vdXRfbWIgPSBNQlhfMDsKQEAgLTUzNSwxMSArNTI5LDEwIEBACiBmYWlsZWQ6CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4LlxuIiwgX19mdW5jX18sCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDJhLCAiRmFpbGVkPSV4LlxuIiwgcnZhbCk7CiAJfSBlbHNlIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwMmIsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAlyZXR1cm4gcnZhbDsKIH0KQEAgLTU2NSw3ICs1NTgsNyBAQAogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTAyYywgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAltY3AtPm1iWzBdID0gTUJDX0dFVF9GSVJNV0FSRV9PUFRJT047CiAJbWNwLT5vdXRfbWIgPSBNQlhfMDsKQEAgLTU3NiwxNSArNTY5LDE0IEBACiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXguXG4iLCBfX2Z1bmNfXywKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwMmQsICJGYWlsZWQ9JXguXG4iLCBydmFsKTsKIAl9IGVsc2UgewogCQlmd29wdHNbMF0gPSBtY3AtPm1iWzBdOwogCQlmd29wdHNbMV0gPSBtY3AtPm1iWzFdOwogCQlmd29wdHNbMl0gPSBtY3AtPm1iWzJdOwogCQlmd29wdHNbM10gPSBtY3AtPm1iWzNdOwogCi0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwMmUsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtNjEyLDcgKzYwNCw3IEBACiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDJmLCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAogCW1jcC0+bWJbMF0gPSBNQkNfU0VUX0ZJUk1XQVJFX09QVElPTjsKIAltY3AtPm1iWzFdID0gZndvcHRzWzFdOwpAQCAtNjM2LDExICs2MjgsMTEgQEAKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leCAoJXgvJXgpLlxuIiwgX19mdW5jX18sCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDMwLAorCQkgICAgIkZhaWxlZD0leCAoJXgvJXgpLlxuIiwgcnZhbCwgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSk7CiAJfSBlbHNlIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwMzEsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtNjY4LDcgKzY2MCw3IEBACiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCi0JREVCVUcxMShwcmludGsoInFsYTJ4MDBfbWJ4X3JlZ190ZXN0KCVsZCk6IGVudGVyZWQuXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwMzIsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCiAJbWNwLT5tYlswXSA9IE1CQ19NQUlMQk9YX1JFR0lTVEVSX1RFU1Q7CiAJbWNwLT5tYlsxXSA9IDB4QUFBQTsKQEAgLTY5NSwxMiArNjg3LDEwIEBACiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KLQkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX21ieF9yZWdfdGVzdCglbGQpOiBmYWlsZWQ9JXguXG4iLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTAzMywgIkZhaWxlZD0leC5cbiIsIHJ2YWwpOwogCX0gZWxzZSB7CiAJCS8qRU1QVFkqLwotCQlERUJVRzExKHByaW50aygicWxhMngwMF9tYnhfcmVnX3Rlc3QoJWxkKTogZG9uZS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDM0LCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTcyOCw3ICs3MTgsNyBAQAogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTAzNSwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAltY3AtPm1iWzBdID0gTUJDX1ZFUklGWV9DSEVDS1NVTTsKIAltY3AtPm91dF9tYiA9IE1CWF8wOwpAQCAtNzQ5LDExICs3MzksMTEgQEAKIAlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXggY2hrIHN1bT0leC5cbiIsIF9fZnVuY19fLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsLCBJU19GV0kyX0NBUEFCTEUodmhhLT5odykgPwotCQkgICAgKG1jcC0+bWJbMl0gPDwgMTYpIHwgbWNwLT5tYlsxXTogbWNwLT5tYlsxXSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwMzYsCisJCSAgICAiRmFpbGVkPSV4IGNobSBzdW09JXguXG4iLCBydmFsLCBJU19GV0kyX0NBUEFCTEUodmhhLT5odykgPworCQkgICAgKG1jcC0+bWJbMl0gPDwgMTYpIHwgbWNwLT5tYlsxXSA6IG1jcC0+bWJbMV0pOwogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwMzcsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtNzg1LDYgKzc3NSw4IEBACiAJbWJ4X2NtZF90CW1jOwogCW1ieF9jbWRfdAkqbWNwID0gJm1jOwogCisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDM4LCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKKwogCW1jcC0+bWJbMF0gPSBNQkNfSU9DQl9DT01NQU5EX0E2NDsKIAltY3AtPm1iWzFdID0gMDsKIAltY3AtPm1iWzJdID0gTVNXKHBoeXNfYWRkcik7CkBAIC03OTksMTQgKzc5MSwxNCBAQAogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJLypFTVBUWSovCi0JCURFQlVHKHByaW50aygicWxhMngwMF9pc3N1ZV9pb2NiKCVsZCk6IGZhaWxlZCBydmFsIDB4JXhcbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDM5LCAiRmFpbGVkPSV4LlxuIiwgcnZhbCk7CiAJfSBlbHNlIHsKIAkJc3RzX2VudHJ5X3QgKnN0c19lbnRyeSA9IChzdHNfZW50cnlfdCAqKSBidWZmZXI7CiAKIAkJLyogTWFzayByZXNlcnZlZCBiaXRzLiAqLwogCQlzdHNfZW50cnktPmVudHJ5X3N0YXR1cyAmPQogCQkgICAgSVNfRldJMl9DQVBBQkxFKHZoYS0+aHcpID8gUkZfTUFTS18yNFhYIDogUkZfTUFTSzsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDNhLCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTg0Nyw3ICs4MzksNyBAQAogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCByZXFfcXVlICpyZXEgPSB2aGEtPnJlcTsKIAotCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2Fib3J0X2NvbW1hbmQoJWxkKTogZW50ZXJlZC5cbiIsIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTAzYiwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAlmb3IgKGhhbmRsZSA9IDE7IGhhbmRsZSA8IE1BWF9PVVRTVEFORElOR19DT01NQU5EUzsgaGFuZGxlKyspIHsKQEAgLTg3NiwxMSArODY4LDkgQEAKIAlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX2Fib3J0X2NvbW1hbmQoJWxkKTogZmFpbGVkPSV4LlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwM2MsICJGYWlsZWQ9JXguXG4iLCBydmFsKTsKIAl9IGVsc2UgewotCQlERUJVRzExKHByaW50aygicWxhMngwMF9hYm9ydF9jb21tYW5kKCVsZCk6IGRvbmUuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTAzZCwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC04OTYsMTAgKzg4NiwxMSBAQAogCXN0cnVjdCByZXFfcXVlICpyZXE7CiAJc3RydWN0IHJzcF9xdWUgKnJzcDsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIGZjcG9ydC0+dmhhLT5ob3N0X25vKSk7Ci0KIAlsID0gbDsKIAl2aGEgPSBmY3BvcnQtPnZoYTsKKworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTAzZSwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CisKIAlyZXEgPSB2aGEtPmh3LT5yZXFfcV9tYXBbMF07CiAJcnNwID0gcmVxLT5yc3A7CiAJbWNwLT5tYlswXSA9IE1CQ19BQk9SVF9UQVJHRVQ7CkBAIC05MTksMTggKzkxMCwxNyBAQAogCW1jcC0+ZmxhZ3MgPSAwOwogCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXguXG4iLCBfX2Z1bmNfXywKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwM2YsICJGYWlsZWQ9JXguXG4iLCBydmFsKTsKIAl9CiAKIAkvKiBJc3N1ZSBtYXJrZXIgSU9DQi4gKi8KIAlydmFsMiA9IHFsYTJ4MDBfbWFya2VyKHZoYSwgcmVxLCByc3AsIGZjcG9ydC0+bG9vcF9pZCwgMCwKIAkJCQkJCQlNS19TWU5DX0lEKTsKIAlpZiAocnZhbDIgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gaXNzdWUgTWFya2VyIElPQ0IgIgotCQkgICAgIigleCkuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBydmFsMikpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNDAsCisJCSAgICAiRmFpbGVkIHRvIGlzc3VlIG1hcmtlciBJT0NCICgleCkuXG4iLCBydmFsMik7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA0MSwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC05NDYsOSArOTM2LDEwIEBACiAJc3RydWN0IHJlcV9xdWUgKnJlcTsKIAlzdHJ1Y3QgcnNwX3F1ZSAqcnNwOwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgZmNwb3J0LT52aGEtPmhvc3Rfbm8pKTsKLQogCXZoYSA9IGZjcG9ydC0+dmhhOworCisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDQyLCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKKwogCXJlcSA9IHZoYS0+aHctPnJlcV9xX21hcFswXTsKIAlyc3AgPSByZXEtPnJzcDsKIAltY3AtPm1iWzBdID0gTUJDX0xVTl9SRVNFVDsKQEAgLTk2NiwxOCArOTU3LDE3IEBACiAJbWNwLT5mbGFncyA9IDA7CiAJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leC5cbiIsIF9fZnVuY19fLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA0MywgIkZhaWxlZD0leC5cbiIsIHJ2YWwpOwogCX0KIAogCS8qIElzc3VlIG1hcmtlciBJT0NCLiAqLwogCXJ2YWwyID0gcWxhMngwMF9tYXJrZXIodmhhLCByZXEsIHJzcCwgZmNwb3J0LT5sb29wX2lkLCBsLAogCQkJCQkJCQlNS19TWU5DX0lEX0xVTik7CiAJaWYgKHJ2YWwyICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGlzc3VlIE1hcmtlciBJT0NCICIKLQkJICAgICIoJXgpLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgcnZhbDIpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDQ0LAorCQkgICAgIkZhaWxlZCB0byBpc3N1ZSBtYXJrZXIgSU9DQiAoJXgpLlxuIiwgcnZhbDIpOwogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNDUsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtMTAxMSw4ICsxMDAxLDcgQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKLQlERUJVRzExKHByaW50aygicWxhMngwMF9nZXRfYWRhcHRlcl9pZCglbGQpOiBlbnRlcmVkLlxuIiwKLQkgICAgdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDQ2LCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAogCW1jcC0+bWJbMF0gPSBNQkNfR0VUX0FEQVBURVJfTE9PUF9JRDsKIAltY3AtPm1iWzldID0gdmhhLT52cF9pZHg7CkBAIC0xMDM4LDExICsxMDI3LDkgQEAKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwotCQlERUJVRzJfM18xMShwcmludGsoInFsYTJ4MDBfZ2V0X2FkYXB0ZXJfaWQoJWxkKTogZmFpbGVkPSV4LlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNDcsICJGYWlsZWQ9JXguXG4iLCBydmFsKTsKIAl9IGVsc2UgewotCQlERUJVRzExKHByaW50aygicWxhMngwMF9nZXRfYWRhcHRlcl9pZCglbGQpOiBkb25lLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNDgsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCiAJCWlmIChJU19RTEE4WFhYX1RZUEUodmhhLT5odykpIHsKIAkJCXZoYS0+ZmNvZV92bGFuX2lkID0gbWNwLT5tYls5XSAmIDB4ZmZmOwpAQCAtMTA4Myw4ICsxMDcwLDcgQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKLQlERUJVRzExKHByaW50aygicWxhMngwMF9nZXRfcmV0cnlfY250KCVsZCk6IGVudGVyZWQuXG4iLAotCQkJdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDQ5LCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAogCW1jcC0+bWJbMF0gPSBNQkNfR0VUX1JFVFJZX0NPVU5UOwogCW1jcC0+b3V0X21iID0gTUJYXzA7CkBAIC0xMDk1LDggKzEwODEsOCBAQAogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMl8zXzExKHByaW50aygicWxhMngwMF9nZXRfcmV0cnlfY250KCVsZCk6IGZhaWxlZCA9ICV4LlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubywgbWNwLT5tYlswXSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNGEsCisJCSAgICAiRmFpbGVkPSV4IG1iWzBdPSV4LlxuIiwgcnZhbCwgbWNwLT5tYlswXSk7CiAJfSBlbHNlIHsKIAkJLyogQ29udmVydCByZXR1cm5lZCBkYXRhIGFuZCBjaGVjayBvdXIgdmFsdWVzLiAqLwogCQkqcl9hX3RvdiA9IG1jcC0+bWJbM10gLyAyOwpAQCAtMTEwNyw4ICsxMDkzLDggQEAKIAkJCSp0b3YgPSByYXRvdjsKIAkJfQogCi0JCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2dldF9yZXRyeV9jbnQoJWxkKTogZG9uZS4gbWIzPSVkICIKLQkJICAgICJyYXRvdj0lZC5cbiIsIHZoYS0+aG9zdF9ubywgbWNwLT5tYlszXSwgcmF0b3YpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDRiLAorCQkgICAgIkRvbmUgJXMgbWIzPSVkIHJhdG92PSVkLlxuIiwgX19mdW5jX18sIG1jcC0+bWJbM10sIHJhdG92KTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTExMzksOCArMTEyNSw3IEBACiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKLQlERUJVRzExKHByaW50aygicWxhMngwMF9pbml0X2Zpcm13YXJlKCVsZCk6IGVudGVyZWQuXG4iLAotCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNGMsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCiAJaWYgKElTX1FMQTgyWFgoaGEpICYmIHFsMnhkYndyKQogCQlxbGE4Mnh4X3dyXzMyKGhhLCBoYS0+bnhkYl93cl9wdHIsCkBAIC0xMTc0LDEzICsxMTU5LDExIEBACiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KLQkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX2luaXRfZmlybXdhcmUoJWxkKTogZmFpbGVkPSV4ICIKLQkJICAgICJtYjA9JXguXG4iLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA0ZCwKKwkJICAgICJGYWlsZWQ9JXggbWJbMF09JXguXG4iLCBydmFsLCBtY3AtPm1iWzBdKTsKIAl9IGVsc2UgewogCQkvKkVNUFRZKi8KLQkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfaW5pdF9maXJtd2FyZSglbGQpOiBkb25lLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNGUsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtMTIxMywxMyArMTE5NiwxMyBAQAogCWRtYV9hZGRyX3QgcGRfZG1hOwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDRmLCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAogCXBkMjQgPSBOVUxMOwogCXBkID0gZG1hX3Bvb2xfYWxsb2MoaGEtPnNfZG1hX3Bvb2wsIEdGUF9LRVJORUwsICZwZF9kbWEpOwogCWlmIChwZCAgPT0gTlVMTCkgewotCQlERUJVRzJfMyhwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBhbGxvY2F0ZSBQb3J0IERhdGFiYXNlICIKLQkJICAgICJzdHJ1Y3R1cmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDEwNTAsCisJCSAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIHBvcnQgZGF0YWJhc2Ugc3RydWN0dXJlLlxuIik7CiAJCXJldHVybiBRTEFfTUVNT1JZX0FMTE9DX0ZBSUxFRDsKIAl9CiAJbWVtc2V0KHBkLCAwLCBtYXgoUE9SVF9EQVRBQkFTRV9TSVpFLCBQT1JUX0RBVEFCQVNFXzI0WFhfU0laRSkpOwpAQCAtMTI2MSwxMiArMTI0NCwxMCBAQAogCQkvKiBDaGVjayBmb3IgbG9nZ2VkIGluIHN0YXRlLiAqLwogCQlpZiAocGQyNC0+Y3VycmVudF9sb2dpbl9zdGF0ZSAhPSBQRFNfUFJMSV9DT01QTEVURSAmJgogCQkgICAgcGQyNC0+bGFzdF9sb2dpbl9zdGF0ZSAhPSBQRFNfUFJMSV9DT01QTEVURSkgewotCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSAgICJzY3NpKCVsZCk6IFVuYWJsZSB0byB2ZXJpZnkgbG9naW4tc3RhdGUgKCV4LyV4KSAiCi0JCQkgICAiIC0gcG9ydGlkPSUwMnglMDJ4JTAyeC5cbiIsIHZoYS0+aG9zdF9ubywKLQkJCSAgIHBkMjQtPmN1cnJlbnRfbG9naW5fc3RhdGUsIHBkMjQtPmxhc3RfbG9naW5fc3RhdGUsCi0JCQkgICBmY3BvcnQtPmRfaWQuYi5kb21haW4sIGZjcG9ydC0+ZF9pZC5iLmFyZWEsCi0JCQkgICBmY3BvcnQtPmRfaWQuYi5hbF9wYSkpOworCQkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDUxLAorCQkJICAgICJVbmFibGUgdG8gdmVyaWZ5IGxvZ2luLXN0YXRlICgleC8leCkgZm9yICIKKwkJCSAgICAibG9vcF9pZCAleC5cbiIsIHBkMjQtPmN1cnJlbnRfbG9naW5fc3RhdGUsCisJCQkgICAgcGQyNC0+bGFzdF9sb2dpbl9zdGF0ZSwgZmNwb3J0LT5sb29wX2lkKTsKIAkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCQkJZ290byBncGRfZXJyb3Jfb3V0OwogCQl9CkBAIC0xMjkwLDEyICsxMjcxLDExIEBACiAJCS8qIENoZWNrIGZvciBsb2dnZWQgaW4gc3RhdGUuICovCiAJCWlmIChwZC0+bWFzdGVyX3N0YXRlICE9IFBEX1NUQVRFX1BPUlRfTE9HR0VEX0lOICYmCiAJCSAgICBwZC0+c2xhdmVfc3RhdGUgIT0gUERfU1RBVEVfUE9SVF9MT0dHRURfSU4pIHsKLQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkgICAic2NzaSglbGQpOiBVbmFibGUgdG8gdmVyaWZ5IGxvZ2luLXN0YXRlICgleC8leCkgIgotCQkJICAgIiAtIHBvcnRpZD0lMDJ4JTAyeCUwMnguXG4iLCB2aGEtPmhvc3Rfbm8sCi0JCQkgICBwZC0+bWFzdGVyX3N0YXRlLCBwZC0+c2xhdmVfc3RhdGUsCi0JCQkgICBmY3BvcnQtPmRfaWQuYi5kb21haW4sIGZjcG9ydC0+ZF9pZC5iLmFyZWEsCi0JCQkgICBmY3BvcnQtPmRfaWQuYi5hbF9wYSkpOworCQkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDBhLAorCQkJICAgICJVbmFibGUgdG8gdmVyaWZ5IGxvZ2luLXN0YXRlICgleC8leCkgLSAiCisJCQkgICAgInBvcnRpZD0lMDJ4JTAyeCUwMnguXG4iLCBwZC0+bWFzdGVyX3N0YXRlLAorCQkJICAgIHBkLT5zbGF2ZV9zdGF0ZSwgZmNwb3J0LT5kX2lkLmIuZG9tYWluLAorCQkJICAgIGZjcG9ydC0+ZF9pZC5iLmFyZWEsIGZjcG9ydC0+ZF9pZC5iLmFsX3BhKTsKIAkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCQkJZ290byBncGRfZXJyb3Jfb3V0OwogCQl9CkBAIC0xMzI1LDEwICsxMzA1LDExIEBACiAJZG1hX3Bvb2xfZnJlZShoYS0+c19kbWFfcG9vbCwgcGQsIHBkX2RtYSk7CiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leCBtYlswXT0leCBtYlsxXT0leC5cbiIsCi0JCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA1MiwKKwkJICAgICJGYWlsZWQ9JXggbWJbMF09JXggbWJbMV09JXguXG4iLCBydmFsLAorCQkgICAgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSk7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA1MywgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC0xMzU3LDggKzEzMzgsNyBAQAogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAotCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2dldF9maXJtd2FyZV9zdGF0ZSglbGQpOiBlbnRlcmVkLlxuIiwKLQkgICAgdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDU0LCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAogCW1jcC0+bWJbMF0gPSBNQkNfR0VUX0ZJUk1XQVJFX1NUQVRFOwogCW1jcC0+b3V0X21iID0gTUJYXzA7CkBAIC0xMzgxLDEyICsxMzYxLDEwIEBACiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KLQkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX2dldF9maXJtd2FyZV9zdGF0ZSglbGQpOiAiCi0JCSAgICAiZmFpbGVkPSV4LlxuIiwgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA1NSwgIkZhaWxlZD0leC5cbiIsIHJ2YWwpOwogCX0gZWxzZSB7CiAJCS8qRU1QVFkqLwotCQlERUJVRzExKHByaW50aygicWxhMngwMF9nZXRfZmlybXdhcmVfc3RhdGUoJWxkKTogZG9uZS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDU2LCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTE0MTgsOCArMTM5Niw3IEBACiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCi0JREVCVUcxMShwcmludGsoInFsYTJ4MDBfZ2V0X3BvcnRfbmFtZSglbGQpOiBlbnRlcmVkLlxuIiwKLQkgICAgdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDU3LCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAogCW1jcC0+bWJbMF0gPSBNQkNfR0VUX1BPUlRfTkFNRTsKIAltY3AtPm1iWzldID0gdmhhLT52cF9pZHg7CkBAIC0xNDM5LDggKzE0MTYsNyBAQAogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMl8zXzExKHByaW50aygicWxhMngwMF9nZXRfcG9ydF9uYW1lKCVsZCk6IGZhaWxlZD0leC5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDU4LCAiRmFpbGVkPSV4LlxuIiwgcnZhbCk7CiAJfSBlbHNlIHsKIAkJaWYgKG5hbWUgIT0gTlVMTCkgewogCQkJLyogVGhpcyBmdW5jdGlvbiByZXR1cm5zIG5hbWUgaW4gYmlnIGVuZGlhbi4gKi8KQEAgLTE0NTQsOCArMTQzMCw3IEBACiAJCQluYW1lWzddID0gTFNCKG1jcC0+bWJbN10pOwogCQl9CiAKLQkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfZ2V0X3BvcnRfbmFtZSglbGQpOiBkb25lLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNTksICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtMTQ4Myw3ICsxNDU4LDcgQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNWEsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCiAJaWYgKElTX1FMQThYWFhfVFlQRSh2aGEtPmh3KSkgewogCQkvKiBMb2dvdXQgYWNyb3NzIGFsbCBGQ0ZzLiAqLwpAQCAtMTUxNywxMSArMTQ5MiwxMCBAQAogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4LlxuIiwKLQkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDViLCAiRmFpbGVkPSV4LlxuIiwgcnZhbCk7CiAJfSBlbHNlIHsKIAkJLypFTVBUWSovCi0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNWMsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtMTU1MywxMiArMTUyNywxMSBAQAogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAotCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX3NlbmRfc25zKCVsZCk6IGVudGVyZWQuXG4iLAotCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNWQsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCi0JREVCVUcxMShwcmludGsoInFsYTJ4MDBfc2VuZF9zbnM6IHJldHJ5IGNudD0lZCByYXRvdj0lZCB0b3RhbCAiCi0JCSJ0b3Y9JWQuXG4iLCB2aGEtPmh3LT5yZXRyeV9jb3VudCwgdmhhLT5ody0+bG9naW5fdGltZW91dCwKLQkJbWNwLT50b3YpKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNWUsCisJICAgICJSZXRyeSBjbnQ9JWQgcmF0b3Y9JWQgdG90YWwgdG92PSVkLlxuIiwKKwkgICAgdmhhLT5ody0+cmV0cnlfY291bnQsIHZoYS0+aHctPmxvZ2luX3RpbWVvdXQsIG1jcC0+dG92KTsKIAogCW1jcC0+bWJbMF0gPSBNQkNfU0VORF9TTlNfQ09NTUFORDsKIAltY3AtPm1iWzFdID0gY21kX3NpemU7CkBAIC0xNTc1LDEzICsxNTQ4LDEyIEBACiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KLQkJREVCVUcocHJpbnRrKCJxbGEyeDAwX3NlbmRfc25zKCVsZCk6IGZhaWxlZD0leCBtYlswXT0leCAiCi0JCSAgICAibWJbMV09JXguXG4iLCB2aGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0pKTsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX3NlbmRfc25zKCVsZCk6IGZhaWxlZD0leCBtYlswXT0leCAiCi0JCSAgICAibWJbMV09JXguXG4iLCB2aGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDVmLAorCQkgICAgIkZhaWxlZD0leCBtYlswXT0leCBtYlsxXT0leC5cbiIsCisJCSAgICBydmFsLCBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdKTsKIAl9IGVsc2UgewogCQkvKkVNUFRZKi8KLQkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfc2VuZF9zbnMoJWxkKTogZG9uZS5cbiIsIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNjAsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtMTYwMCw3ICsxNTcyLDcgQEAKIAlzdHJ1Y3QgcmVxX3F1ZSAqcmVxOwogCXN0cnVjdCByc3BfcXVlICpyc3A7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNjEsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCiAJaWYgKGhhLT5mbGFncy5jcHVfYWZmaW5pdHlfZW5hYmxlZCkKIAkJcmVxID0gaGEtPnJlcV9xX21hcFswXTsKQEAgLTE2MTAsOCArMTU4Miw4IEBACiAKIAlsZyA9IGRtYV9wb29sX2FsbG9jKGhhLT5zX2RtYV9wb29sLCBHRlBfS0VSTkVMLCAmbGdfZG1hKTsKIAlpZiAobGcgPT0gTlVMTCkgewotCQlERUJVRzJfMyhwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBhbGxvY2F0ZSBMb2dpbiBJT0NCLlxuIiwKLQkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MTA2MiwKKwkJICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgbG9naW4gSU9DQi5cbiIpOwogCQlyZXR1cm4gUUxBX01FTU9SWV9BTExPQ19GQUlMRUQ7CiAJfQogCW1lbXNldChsZywgMCwgc2l6ZW9mKHN0cnVjdCBsb2dpb19lbnRyeV8yNHh4KSk7CkBAIC0xNjMxLDIxICsxNjAzLDIxIEBACiAJbGctPnZwX2luZGV4ID0gdmhhLT52cF9pZHg7CiAJcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYih2aGEsIGxnLCBsZ19kbWEsIDApOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGlzc3VlIExvZ2luIElPQ0IgIgotCQkgICAgIigleCkuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA2MywKKwkJICAgICJGYWlsZWQgdG8gaXNzdWUgbG9naW4gSU9DQiAoJXgpLlxuIiwgcnZhbCk7CiAJfSBlbHNlIGlmIChsZy0+ZW50cnlfc3RhdHVzICE9IDApIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gY29tcGxldGUgSU9DQiAiCi0JCSAgICAiLS0gZXJyb3Igc3RhdHVzICgleCkuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAotCQkgICAgbGctPmVudHJ5X3N0YXR1cykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNjQsCisJCSAgICAiRmFpbGVkIHRvIGNvbXBsZXRlIElPQ0IgLS0gZXJyb3Igc3RhdHVzICgleCkuXG4iLAorCQkgICAgbGctPmVudHJ5X3N0YXR1cyk7CiAJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0gZWxzZSBpZiAobGctPmNvbXBfc3RhdHVzICE9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoQ1NfQ09NUExFVEUpKSB7CiAJCWlvcFswXSA9IGxlMzJfdG9fY3B1KGxnLT5pb19wYXJhbWV0ZXJbMF0pOwogCQlpb3BbMV0gPSBsZTMyX3RvX2NwdShsZy0+aW9fcGFyYW1ldGVyWzFdKTsKIAotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBjb21wbGV0ZSBJT0NCICIKLQkJICAgICItLSBjb21wbGV0aW9uIHN0YXR1cyAoJXgpICBpb3BhcmFtPSV4LyV4LlxuIiwgX19mdW5jX18sCi0JCSAgICB2aGEtPmhvc3Rfbm8sIGxlMTZfdG9fY3B1KGxnLT5jb21wX3N0YXR1cyksIGlvcFswXSwKLQkJICAgIGlvcFsxXSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNjUsCisJCSAgICAiRmFpbGVkIHRvIGNvbXBsZXRlIElPQ0IgLS0gY29tcGxldGlvbiAgc3RhdHVzICgleCkgIgorCQkgICAgImlvcGFyYW09JXgvJXguXG4iLCBsZTE2X3RvX2NwdShsZy0+Y29tcF9zdGF0dXMpLAorCQkgICAgaW9wWzBdLCBpb3BbMV0pOwogCiAJCXN3aXRjaCAoaW9wWzBdKSB7CiAJCWNhc2UgTFNDX1NDT0RFX1BPUlRJRF9VU0VEOgpAQCAtMTY3Myw3ICsxNjQ1LDcgQEAKIAkJCWJyZWFrOwogCQl9CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA2NiwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAkJaW9wWzBdID0gbGUzMl90b19jcHUobGctPmlvX3BhcmFtZXRlclswXSk7CiAKQEAgLTE3MjgsNyArMTcwMCw3IEBACiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKLQlERUJVRzExKHByaW50aygicWxhMngwMF9sb2dpbl9mYWJyaWMoJWxkKTogZW50ZXJlZC5cbiIsIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA2NywgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAltY3AtPm1iWzBdID0gTUJDX0xPR0lOX0ZBQlJJQ19QT1JUOwogCW1jcC0+b3V0X21iID0gTUJYXzN8TUJYXzJ8TUJYXzF8TUJYXzA7CkBAIC0xNzcxLDEzICsxNzQzLDEyIEBACiAJCQlydmFsID0gUUxBX1NVQ0NFU1M7CiAKIAkJLypFTVBUWSovCi0JCURFQlVHMl8zXzExKHByaW50aygicWxhMngwMF9sb2dpbl9mYWJyaWMoJWxkKTogZmFpbGVkPSV4ICIKLQkJICAgICJtYlswXT0leCBtYlsxXT0leCBtYlsyXT0leC5cbiIsIHZoYS0+aG9zdF9ubywgcnZhbCwKLQkJICAgIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0sIG1jcC0+bWJbMl0pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDY4LAorCQkgICAgIkZhaWxlZD0leCBtYlswXT0leCBtYlsxXT0leCBtYlsyXT0leC5cbiIsCisJCSAgICBydmFsLCBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdLCBtY3AtPm1iWzJdKTsKIAl9IGVsc2UgewogCQkvKkVNUFRZKi8KLQkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfbG9naW5fZmFicmljKCVsZCk6IGRvbmUuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA2OSwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC0xODA4LDEzICsxNzc5LDEzIEBACiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNmEsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOworCiAJaWYgKElTX0ZXSTJfQ0FQQUJMRShoYSkpCiAJCXJldHVybiBxbGEyNHh4X2xvZ2luX2ZhYnJpYyh2aGEsIGZjcG9ydC0+bG9vcF9pZCwKIAkJICAgIGZjcG9ydC0+ZF9pZC5iLmRvbWFpbiwgZmNwb3J0LT5kX2lkLmIuYXJlYSwKIAkJICAgIGZjcG9ydC0+ZF9pZC5iLmFsX3BhLCBtYl9yZXQsIG9wdCk7CiAKLQlERUJVRzMocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwotCiAJbWNwLT5tYlswXSA9IE1CQ19MT0dJTl9MT09QX1BPUlQ7CiAJaWYgKEhBU19FWFRFTkRFRF9JRFMoaGEpKQogCQltY3AtPm1iWzFdID0gZmNwb3J0LT5sb29wX2lkOwpAQCAtMTg0NSwxNSArMTgxNiwxMiBAQAogIAkJaWYgKG1jcC0+bWJbMF0gPT0gMHg0MDA1IHx8IG1jcC0+bWJbMF0gPT0gMHg0MDA2KQogIAkJCXJ2YWwgPSBRTEFfU1VDQ0VTUzsKIAotCQlERUJVRyhwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leCBtYlswXT0leCBtYlsxXT0leCAiCi0JCSAgICAibWJbNl09JXggbWJbN109JXguXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBydmFsLAotCQkgICAgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSwgbWNwLT5tYls2XSwgbWNwLT5tYls3XSkpOwotCQlERUJVRzJfMyhwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leCBtYlswXT0leCBtYlsxXT0leCAiCi0JCSAgICAibWJbNl09JXggbWJbN109JXguXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBydmFsLAotCQkgICAgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSwgbWNwLT5tYls2XSwgbWNwLT5tYls3XSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNmIsCisJCSAgICAiRmFpbGVkPSV4IG1iWzBdPSV4IG1iWzFdPSV4IG1iWzZdPSV4IG1iWzddPSV4LlxuIiwKKwkJICAgIHJ2YWwsIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0sIG1jcC0+bWJbNl0sIG1jcC0+bWJbN10pOwogCX0gZWxzZSB7CiAJCS8qRU1QVFkqLwotCQlERUJVRzMocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNmMsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCXJldHVybiAocnZhbCk7CkBAIC0xODcwLDEyICsxODM4LDEyIEBACiAJc3RydWN0IHJlcV9xdWUgKnJlcTsKIAlzdHJ1Y3QgcnNwX3F1ZSAqcnNwOwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDZkLCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAogCWxnID0gZG1hX3Bvb2xfYWxsb2MoaGEtPnNfZG1hX3Bvb2wsIEdGUF9LRVJORUwsICZsZ19kbWEpOwogCWlmIChsZyA9PSBOVUxMKSB7Ci0JCURFQlVHMl8zKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGFsbG9jYXRlIExvZ291dCBJT0NCLlxuIiwKLQkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MTA2ZSwKKwkJICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgbG9nb3V0IElPQ0IuXG4iKTsKIAkJcmV0dXJuIFFMQV9NRU1PUllfQUxMT0NfRkFJTEVEOwogCX0KIAltZW1zZXQobGcsIDAsIHNpemVvZihzdHJ1Y3QgbG9naW9fZW50cnlfMjR4eCkpOwpAQCAtMTg5OSwyMiArMTg2NywyMiBAQAogCiAJcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYih2aGEsIGxnLCBsZ19kbWEsIDApOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGlzc3VlIExvZ291dCBJT0NCICIKLQkJICAgICIoJXgpLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNmYsCisJCSAgICAiRmFpbGVkIHRvIGlzc3VlIGxvZ291dCBJT0NCICgleCkuXG4iLCBydmFsKTsKIAl9IGVsc2UgaWYgKGxnLT5lbnRyeV9zdGF0dXMgIT0gMCkgewotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBjb21wbGV0ZSBJT0NCICIKLQkJICAgICItLSBlcnJvciBzdGF0dXMgKCV4KS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sCi0JCSAgICBsZy0+ZW50cnlfc3RhdHVzKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA3MCwKKwkJICAgICJGYWlsZWQgdG8gY29tcGxldGUgSU9DQiAtLSBlcnJvciBzdGF0dXMgKCV4KS5cbiIsCisJCSAgICBsZy0+ZW50cnlfc3RhdHVzKTsKIAkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfSBlbHNlIGlmIChsZy0+Y29tcF9zdGF0dXMgIT0gX19jb25zdGFudF9jcHVfdG9fbGUxNihDU19DT01QTEVURSkpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQgJWQpOiBmYWlsZWQgdG8gY29tcGxldGUgSU9DQiAiCi0JCSAgICAiLS0gY29tcGxldGlvbiBzdGF0dXMgKCV4KSAgaW9wYXJhbT0leC8leC5cbiIsIF9fZnVuY19fLAotCQkgICAgdmhhLT5ob3N0X25vLCB2aGEtPnZwX2lkeCwgbGUxNl90b19jcHUobGctPmNvbXBfc3RhdHVzKSwKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDcxLAorCQkgICAgIkZhaWxlZCB0byBjb21wbGV0ZSBJT0NCIC0tIGNvbXBsZXRpb24gc3RhdHVzICgleCkgIgorCQkgICAgImlvcGFyYW09JXgvJXguXG4iLCBsZTE2X3RvX2NwdShsZy0+Y29tcF9zdGF0dXMpLAogCQkgICAgbGUzMl90b19jcHUobGctPmlvX3BhcmFtZXRlclswXSksCi0JCSAgICBsZTMyX3RvX2NwdShsZy0+aW9fcGFyYW1ldGVyWzFdKSkpOworCQkgICAgbGUzMl90b19jcHUobGctPmlvX3BhcmFtZXRlclsxXSkpOwogCX0gZWxzZSB7CiAJCS8qRU1QVFkqLwotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDcyLCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlkbWFfcG9vbF9mcmVlKGhhLT5zX2RtYV9wb29sLCBsZywgbGdfZG1hKTsKQEAgLTE5NDYsOCArMTkxNCw3IEBACiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCi0JREVCVUcxMShwcmludGsoInFsYTJ4MDBfZmFicmljX2xvZ291dCglbGQpOiBlbnRlcmVkLlxuIiwKLQkgICAgdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDczLCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAogCW1jcC0+bWJbMF0gPSBNQkNfTE9HT1VUX0ZBQlJJQ19QT1JUOwogCW1jcC0+b3V0X21iID0gTUJYXzF8TUJYXzA7CkBAIC0xOTY2LDEyICsxOTMzLDExIEBACiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KLQkJREVCVUcyXzNfMTEocHJpbnRrKCJxbGEyeDAwX2ZhYnJpY19sb2dvdXQoJWxkKTogZmFpbGVkPSV4ICIKLQkJICAgICJtYngxPSV4LlxuIiwgdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzFdKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA3NCwKKwkJICAgICJGYWlsZWQ9JXggbWJbMV09JXguXG4iLCBydmFsLCBtY3AtPm1iWzFdKTsKIAl9IGVsc2UgewogCQkvKkVNUFRZKi8KLQkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfZmFicmljX2xvZ291dCglbGQpOiBkb25lLlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNzUsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtMTk5OSw4ICsxOTY1LDcgQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKLQlERUJVRzExKHByaW50aygicWxhMngwMF9mdWxsX2xvZ2luX2xpcCglbGQpOiBlbnRlcmVkLlxuIiwKLQkgICAgdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDc2LCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAogCW1jcC0+bWJbMF0gPSBNQkNfTElQX0ZVTExfTE9HSU47CiAJbWNwLT5tYlsxXSA9IElTX0ZXSTJfQ0FQQUJMRSh2aGEtPmh3KSA/IEJJVF8zIDogMDsKQEAgLTIwMTQsMTIgKzE5NzksMTAgQEAKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwotCQlERUJVRzJfM18xMShwcmludGsoInFsYTJ4MDBfZnVsbF9sb2dpbl9saXAoJWxkKTogZmFpbGVkPSV4LlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwNzcsICJGYWlsZWQ9JXguXG4iLCBydmFsKTsKIAl9IGVsc2UgewogCQkvKkVNUFRZKi8KLQkJREVCVUcxMShwcmludGsoInFsYTJ4MDBfZnVsbF9sb2dpbl9saXAoJWxkKTogZG9uZS5cbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDc4LCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTIwNDUsOCArMjAwOCw3IEBACiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCi0JREVCVUcxMShwcmludGsoInFsYTJ4MDBfZ2V0X2lkX2xpc3QoJWxkKTogZW50ZXJlZC5cbiIsCi0JICAgIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA3OSwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAlpZiAoaWRfbGlzdCA9PSBOVUxMKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKQEAgLTIwNzUsMTIgKzIwMzcsMTAgQEAKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwotCQlERUJVRzJfM18xMShwcmludGsoInFsYTJ4MDBfZ2V0X2lkX2xpc3QoJWxkKTogZmFpbGVkPSV4LlxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwN2EsICJGYWlsZWQ9JXguXG4iLCBydmFsKTsKIAl9IGVsc2UgewogCQkqZW50cmllcyA9IG1jcC0+bWJbMV07Ci0JCURFQlVHMTEocHJpbnRrKCJxbGEyeDAwX2dldF9pZF9saXN0KCVsZCk6IGRvbmUuXG4iLAotCQkgICAgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA3YiwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC0yMTA4LDcgKzIwNjgsNyBAQAogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA3YywgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAltY3AtPm1iWzBdID0gTUJDX0dFVF9SRVNPVVJDRV9DT1VOVFM7CiAJbWNwLT5vdXRfbWIgPSBNQlhfMDsKQEAgLTIxMjEsMTQgKzIwODEsMTQgQEAKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CiAJCS8qRU1QVFkqLwotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZCA9ICV4LlxuIiwgX19mdW5jX18sCi0JCSAgICB2aGEtPmhvc3Rfbm8sIG1jcC0+bWJbMF0pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDdkLAorCQkgICAgIkZhaWxlZCBtYlswXT0leC5cbiIsIG1jcC0+bWJbMF0pOwogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLiBtYjE9JXggbWIyPSV4IG1iMz0leCBtYjY9JXggIgotCQkgICAgIm1iNz0leCBtYjEwPSV4IG1iMTE9JXggbWIxMj0leC5cbiIsIF9fZnVuY19fLAotCQkgICAgdmhhLT5ob3N0X25vLCBtY3AtPm1iWzFdLCBtY3AtPm1iWzJdLCBtY3AtPm1iWzNdLAotCQkgICAgbWNwLT5tYls2XSwgbWNwLT5tYls3XSwgbWNwLT5tYlsxMF0sIG1jcC0+bWJbMTFdLAotCQkgICAgbWNwLT5tYlsxMl0pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDdlLAorCQkgICAgIkRvbmUgJXMgbWIxPSV4IG1iMj0leCBtYjM9JXggbWI2PSV4IG1iNz0leCBtYjEwPSV4ICIKKwkJICAgICJtYjExPSV4IG1iMTI9JXguXG4iLCBfX2Z1bmNfXywgbWNwLT5tYlsxXSwgbWNwLT5tYlsyXSwKKwkJICAgIG1jcC0+bWJbM10sIG1jcC0+bWJbNl0sIG1jcC0+bWJbN10sIG1jcC0+bWJbMTBdLAorCQkgICAgbWNwLT5tYlsxMV0sIG1jcC0+bWJbMTJdKTsKIAogCQlpZiAoY3VyX3hjaGdfY250KQogCQkJKmN1cl94Y2hnX2NudCA9IG1jcC0+bWJbM107CkBAIC0yMTQ3LDcgKzIxMDcsNiBAQAogCXJldHVybiAocnZhbCk7CiB9CiAKLSNpZiBkZWZpbmVkKFFMX0RFQlVHX0xFVkVMXzMpCiAvKgogICogcWxhMngwMF9nZXRfZmNhbF9wb3NpdGlvbl9tYXAKICAqCUdldCBGQ0FMIChMSUxQKSBwb3NpdGlvbiBtYXAgdXNpbmcgbWFpbGJveCBjb21tYW5kCkBAIC0yMTcyLDEwICsyMTMxLDEyIEBACiAJZG1hX2FkZHJfdCBwbWFwX2RtYTsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAorCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA3ZiwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CisKIAlwbWFwID0gZG1hX3Bvb2xfYWxsb2MoaGEtPnNfZG1hX3Bvb2wsIEdGUF9LRVJORUwsICZwbWFwX2RtYSk7CiAJaWYgKHBtYXAgID09IE5VTEwpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiAqKioqIE1lbSBBbGxvYyBGYWlsZWQgKioqKiIsCi0JCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDEwODAsCisJCSAgICAiTWVtb3J5IGFsbG9jIGZhaWxlZC5cbiIpOwogCQlyZXR1cm4gUUxBX01FTU9SWV9BTExPQ19GQUlMRUQ7CiAJfQogCW1lbXNldChwbWFwLCAwLCBGQ0FMX01BUF9TSVpFKTsKQEAgLTIxOTMsMTAgKzIxNTQsMTEgQEAKIAlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCiAJaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IChtYjA9JXgvbWIxPSV4KSBGQy9BTCBQb3NpdGlvbiBNYXAgIgotCQkgICAgInNpemUgKCV4KVxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgbWNwLT5tYlswXSwKLQkJICAgIG1jcC0+bWJbMV0sICh1bnNpZ25lZClwbWFwWzBdKSk7Ci0JCURFQlVHMTEocWxhMngwMF9kdW1wX2J1ZmZlcihwbWFwLCBwbWFwWzBdICsgMSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwODEsCisJCSAgICAibWIwL21iMT0leC8lWCBGQy9BTCBwb3NpdGlvbiBtYXAgc2l6ZSAoJXgpLlxuIiwKKwkJICAgIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0sICh1bnNpZ25lZClwbWFwWzBdKTsKKwkJcWxfZHVtcF9idWZmZXIocWxfZGJnX21ieCArIHFsX2RiZ19idWZmZXIsIHZoYSwgMHgxMTFkLAorCQkgICAgcG1hcCwgcG1hcFswXSArIDEpOwogCiAJCWlmIChwb3NfbWFwKQogCQkJbWVtY3B5KHBvc19tYXAsIHBtYXAsIEZDQUxfTUFQX1NJWkUpOwpAQCAtMjIwNCwxNSArMjE2NiwxMyBAQAogCWRtYV9wb29sX2ZyZWUoaGEtPnNfZG1hX3Bvb2wsIHBtYXAsIHBtYXBfZG1hKTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4LlxuIiwgX19mdW5jX18sCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDgyLCAiRmFpbGVkPSV4LlxuIiwgcnZhbCk7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA4MywgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CiB9Ci0jZW5kaWYKIAogLyoKICAqIHFsYTJ4MDBfZ2V0X2xpbmtfc3RhdHVzCkBAIC0yMjM3LDcgKzIxOTcsNyBAQAogCXVpbnQzMl90ICpzaXRlciwgKmRpdGVyLCBkd29yZHM7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwODQsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCiAJbWNwLT5tYlswXSA9IE1CQ19HRVRfTElOS19TVEFUVVM7CiAJbWNwLT5tYlsyXSA9IE1TVyhzdGF0c19kbWEpOwpAQCAtMjI2NiwxMSArMjIyNiwxMiBAQAogCiAJaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MpIHsKIAkJaWYgKG1jcC0+bWJbMF0gIT0gTUJTX0NPTU1BTkRfQ09NUExFVEUpIHsKLQkJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogY21kIGZhaWxlZC4gbWJ4MD0leC5cbiIsCi0JCQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgbWNwLT5tYlswXSkpOworCQkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDg1LAorCQkJICAgICJGYWlsZWQ9JXggbWJbMF09JXguXG4iLCBydmFsLCBtY3AtPm1iWzBdKTsKIAkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCQl9IGVsc2UgewogCQkJLyogQ29weSBvdmVyIGRhdGEgLS0gZmlybXdhcmUgZGF0YSBpcyBMRS4gKi8KKwkJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA4NiwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJCQlkd29yZHMgPSBvZmZzZXRvZihzdHJ1Y3QgbGlua19zdGF0aXN0aWNzLCB1bnVzZWQxKSAvIDQ7CiAJCQlzaXRlciA9IGRpdGVyID0gJnN0YXRzLT5saW5rX2ZhaWxfY250OwogCQkJd2hpbGUgKGR3b3Jkcy0tKQpAQCAtMjI3OCw4ICsyMjM5LDcgQEAKIAkJfQogCX0gZWxzZSB7CiAJCS8qIEZhaWxlZC4gKi8KLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXguXG4iLCBfX2Z1bmNfXywKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwODcsICJGYWlsZWQ9JXguXG4iLCBydmFsKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTIyOTQsNyArMjI1NCw3IEBACiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAJdWludDMyX3QgKnNpdGVyLCAqZGl0ZXIsIGR3b3JkczsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA4OCwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAltY3AtPm1iWzBdID0gTUJDX0dFVF9MSU5LX1BSSVZfU1RBVFM7CiAJbWNwLT5tYlsyXSA9IE1TVyhzdGF0c19kbWEpOwpAQCAtMjMxMiwxMCArMjI3MiwxMSBAQAogCiAJaWYgKHJ2YWwgPT0gUUxBX1NVQ0NFU1MpIHsKIAkJaWYgKG1jcC0+bWJbMF0gIT0gTUJTX0NPTU1BTkRfQ09NUExFVEUpIHsKLQkJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogY21kIGZhaWxlZC4gbWJ4MD0leC5cbiIsCi0JCQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgbWNwLT5tYlswXSkpOworCQkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDg5LAorCQkJICAgICJGYWlsZWQgbWJbMF09JXguXG4iLCBtY3AtPm1iWzBdKTsKIAkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCQl9IGVsc2UgeworCQkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDhhLCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAkJCS8qIENvcHkgb3ZlciBkYXRhIC0tIGZpcm13YXJlIGRhdGEgaXMgTEUuICovCiAJCQlkd29yZHMgPSBzaXplb2Yoc3RydWN0IGxpbmtfc3RhdGlzdGljcykgLyA0OwogCQkJc2l0ZXIgPSBkaXRlciA9ICZzdGF0cy0+bGlua19mYWlsX2NudDsKQEAgLTIzMjQsOCArMjI4NSw3IEBACiAJCX0KIAl9IGVsc2UgewogCQkvKiBGYWlsZWQuICovCi0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4LlxuIiwgX19mdW5jX18sCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDhiLCAiRmFpbGVkPSV4LlxuIiwgcnZhbCk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC0yMzQ1LDcgKzIzMDUsNyBAQAogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCByZXFfcXVlICpyZXEgPSB2aGEtPnJlcTsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA4YywgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAlmb3IgKGhhbmRsZSA9IDE7IGhhbmRsZSA8IE1BWF9PVVRTVEFORElOR19DT01NQU5EUzsgaGFuZGxlKyspIHsKQEAgLTIzNjAsOCArMjMyMCw4IEBACiAKIAlhYnQgPSBkbWFfcG9vbF9hbGxvYyhoYS0+c19kbWFfcG9vbCwgR0ZQX0tFUk5FTCwgJmFidF9kbWEpOwogCWlmIChhYnQgPT0gTlVMTCkgewotCQlERUJVRzJfMyhwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBhbGxvY2F0ZSBBYm9ydCBJT0NCLlxuIiwKLQkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MTA4ZCwKKwkJICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgYWJvcnQgSU9DQi5cbiIpOwogCQlyZXR1cm4gUUxBX01FTU9SWV9BTExPQ19GQUlMRUQ7CiAJfQogCW1lbXNldChhYnQsIDAsIHNpemVvZihzdHJ1Y3QgYWJvcnRfZW50cnlfMjR4eCkpOwpAQCAtMjM4MCwyMCArMjM0MCwyMCBAQAogCiAJcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYih2aGEsIGFidCwgYWJ0X2RtYSwgMCk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gaXNzdWUgSU9DQiAoJXgpLlxuIiwKLQkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDhlLAorCQkgICAgIkZhaWxlZCB0byBpc3N1ZSBJT0NCICgleCkuXG4iLCBydmFsKTsKIAl9IGVsc2UgaWYgKGFidC0+ZW50cnlfc3RhdHVzICE9IDApIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gY29tcGxldGUgSU9DQiAiCi0JCSAgICAiLS0gZXJyb3Igc3RhdHVzICgleCkuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAotCQkgICAgYWJ0LT5lbnRyeV9zdGF0dXMpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDhmLAorCQkgICAgIkZhaWxlZCB0byBjb21wbGV0ZSBJT0NCIC0tIGVycm9yIHN0YXR1cyAoJXgpLlxuIiwKKwkJICAgIGFidC0+ZW50cnlfc3RhdHVzKTsKIAkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfSBlbHNlIGlmIChhYnQtPm5wb3J0X2hhbmRsZSAhPSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDApKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGNvbXBsZXRlIElPQ0IgIgotCQkgICAgIi0tIGNvbXBsZXRpb24gc3RhdHVzICgleCkuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAotCQkgICAgbGUxNl90b19jcHUoYWJ0LT5ucG9ydF9oYW5kbGUpKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA5MCwKKwkJICAgICJGYWlsZWQgdG8gY29tcGxldGUgSU9DQiAtLSBjb21wbGV0aW9uIHN0YXR1cyAoJXgpLlxuIiwKKwkJICAgIGxlMTZfdG9fY3B1KGFidC0+bnBvcnRfaGFuZGxlKSk7CiAJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwOTEsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCWRtYV9wb29sX2ZyZWUoaGEtPnNfZG1hX3Bvb2wsIGFidCwgYWJ0X2RtYSk7CkBAIC0yNDIxLDE5ICsyMzgxLDIwIEBACiAJc3RydWN0IHJlcV9xdWUgKnJlcTsKIAlzdHJ1Y3QgcnNwX3F1ZSAqcnNwOwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgZmNwb3J0LT52aGEtPmhvc3Rfbm8pKTsKLQogCXZoYSA9IGZjcG9ydC0+dmhhOwogCWhhID0gdmhhLT5odzsKIAlyZXEgPSB2aGEtPnJlcTsKKworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA5MiwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CisKIAlpZiAoaGEtPmZsYWdzLmNwdV9hZmZpbml0eV9lbmFibGVkKQogCQlyc3AgPSBoYS0+cnNwX3FfbWFwW3RhZyArIDFdOwogCWVsc2UKIAkJcnNwID0gcmVxLT5yc3A7CiAJdHNrID0gZG1hX3Bvb2xfYWxsb2MoaGEtPnNfZG1hX3Bvb2wsIEdGUF9LRVJORUwsICZ0c2tfZG1hKTsKIAlpZiAodHNrID09IE5VTEwpIHsKLQkJREVCVUcyXzMocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gYWxsb2NhdGUgVGFzayBNYW5hZ2VtZW50ICIKLQkJICAgICJJT0NCLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgxMDkzLAorCQkgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSB0YXNrIG1hbmFnZW1lbnQgSU9DQi5cbiIpOwogCQlyZXR1cm4gUUxBX01FTU9SWV9BTExPQ19GQUlMRUQ7CiAJfQogCW1lbXNldCh0c2ssIDAsIHNpemVvZihzdHJ1Y3QgdHNrX21nbXRfY21kKSk7CkBAIC0yNDU3LDMwICsyNDE4LDMwIEBACiAJc3RzID0gJnRzay0+cC5zdHM7CiAJcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYih2aGEsIHRzaywgdHNrX2RtYSwgMCk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gaXNzdWUgJXMgUmVzZXQgSU9DQiAiCi0JCSAgICAiKCV4KS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIG5hbWUsIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDk0LAorCQkgICAgIkZhaWxlZCB0byBpc3N1ZSAlcyByZXNldCBJT0NCICgleCkuXG4iLCBuYW1lLCBydmFsKTsKIAl9IGVsc2UgaWYgKHN0cy0+ZW50cnlfc3RhdHVzICE9IDApIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gY29tcGxldGUgSU9DQiAiCi0JCSAgICAiLS0gZXJyb3Igc3RhdHVzICgleCkuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAotCQkgICAgc3RzLT5lbnRyeV9zdGF0dXMpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDk1LAorCQkgICAgIkZhaWxlZCB0byBjb21wbGV0ZSBJT0NCIC0tIGVycm9yIHN0YXR1cyAoJXgpLlxuIiwKKwkJICAgIHN0cy0+ZW50cnlfc3RhdHVzKTsKIAkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfSBlbHNlIGlmIChzdHMtPmNvbXBfc3RhdHVzICE9CiAJICAgIF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoQ1NfQ09NUExFVEUpKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGNvbXBsZXRlIElPQ0IgIgotCQkgICAgIi0tIGNvbXBsZXRpb24gc3RhdHVzICgleCkuXG4iLCBfX2Z1bmNfXywKLQkJICAgIHZoYS0+aG9zdF9ubywgbGUxNl90b19jcHUoc3RzLT5jb21wX3N0YXR1cykpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDk2LAorCQkgICAgIkZhaWxlZCB0byBjb21wbGV0ZSBJT0NCIC0tIGNvbXBsZXRpb24gc3RhdHVzICgleCkuXG4iLAorCQkgICAgbGUxNl90b19jcHUoc3RzLT5jb21wX3N0YXR1cykpOwogCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAl9IGVsc2UgaWYgKGxlMTZfdG9fY3B1KHN0cy0+c2NzaV9zdGF0dXMpICYKIAkgICAgU1NfUkVTUE9OU0VfSU5GT19MRU5fVkFMSUQpIHsKIAkJaWYgKGxlMzJfdG9fY3B1KHN0cy0+cnNwX2RhdGFfbGVuKSA8IDQpIHsKLQkJCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogaWdub3JpbmcgaW5jb25zaXN0ZW50ICIKLQkJCSAgICAiZGF0YSBsZW5ndGggLS0gbm90IGVub3VnaCByZXNwb25zZSBpbmZvICglZCkuXG4iLAotCQkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sCi0JCQkgICAgbGUzMl90b19jcHUoc3RzLT5yc3BfZGF0YV9sZW4pKSk7CisJCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwOTcsCisJCQkgICAgIklnbm9yaW5nIGluY29uc2lzdGVudCBkYXRhIGxlbmd0aCAtLSBub3QgZW5vdWdoICIKKwkJCSAgICAicmVzcG9uc2UgaW5mbyAoJWQpLlxuIiwKKwkJCSAgICBsZTMyX3RvX2NwdShzdHMtPnJzcF9kYXRhX2xlbikpOwogCQl9IGVsc2UgaWYgKHN0cy0+ZGF0YVszXSkgewotCQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gY29tcGxldGUgSU9DQiAiCi0JCQkgICAgIi0tIHJlc3BvbnNlICgleCkuXG4iLCBfX2Z1bmNfXywKLQkJCSAgICB2aGEtPmhvc3Rfbm8sIHN0cy0+ZGF0YVszXSkpOworCQkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDk4LAorCQkJICAgICJGYWlsZWQgdG8gY29tcGxldGUgSU9DQiAtLSByZXNwb25zZSAoJXgpLlxuIiwKKwkJCSAgICBzdHMtPmRhdGFbM10pOwogCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJCX0KIAl9CkBAIC0yNDg5LDEwICsyNDUwLDEwIEBACiAJcnZhbDIgPSBxbGEyeDAwX21hcmtlcih2aGEsIHJlcSwgcnNwLCBmY3BvcnQtPmxvb3BfaWQsIGwsCiAJICAgIHR5cGUgPT0gVENGX0xVTl9SRVNFVCA/IE1LX1NZTkNfSURfTFVOOiBNS19TWU5DX0lEKTsKIAlpZiAocnZhbDIgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gaXNzdWUgTWFya2VyIElPQ0IgIgotCQkgICAgIigleCkuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBydmFsMikpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwOTksCisJCSAgICAiRmFpbGVkIHRvIGlzc3VlIG1hcmtlciBJT0NCICgleCkuXG4iLCBydmFsMik7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA5YSwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJZG1hX3Bvb2xfZnJlZShoYS0+c19kbWFfcG9vbCwgdHNrLCB0c2tfZG1hKTsKQEAgLTI1MzMsNyArMjQ5NCw3IEBACiAJaWYgKCFJU19RTEEyM1hYKGhhKSAmJiAhSVNfRldJMl9DQVBBQkxFKGhhKSkKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwOWIsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCiAJbWNwLT5tYlswXSA9IE1CQ19HRU5fU1lTVEVNX0VSUk9SOwogCW1jcC0+b3V0X21iID0gTUJYXzA7CkBAIC0yNTQzLDEwICsyNTA0LDkgQEAKIAlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXguXG4iLCBfX2Z1bmNfXywKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwOWMsICJGYWlsZWQ9JXguXG4iLCBydmFsKTsKIAl9IGVsc2UgewotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDlkLCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTI1NjYsNyArMjUyNiw3IEBACiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDllLCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAogCW1jcC0+bWJbMF0gPSBNQkNfU0VSREVTX1BBUkFNUzsKIAltY3AtPm1iWzFdID0gQklUXzA7CkBAIC0yNTgxLDExICsyNTQxLDExIEBACiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewogCQkvKkVNUFRZKi8KLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXggKCV4KS5cbiIsIF9fZnVuY19fLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTA5ZiwKKwkJICAgICJGYWlsZWQ9JXggbWJbMF09JXguXG4iLCBydmFsLCBtY3AtPm1iWzBdKTsKIAl9IGVsc2UgewogCQkvKkVNUFRZKi8KLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBhMCwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC0yNjAxLDcgKzI1NjEsNyBAQAogCWlmICghSVNfRldJMl9DQVBBQkxFKHZoYS0+aHcpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBhMSwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAltY3AtPm1iWzBdID0gTUJDX1NUT1BfRklSTVdBUkU7CiAJbWNwLT5vdXRfbWIgPSBNQlhfMDsKQEAgLTI2MTEsMTIgKzI1NzEsMTEgQEAKIAlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXguXG4iLCBfX2Z1bmNfXywKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwYTIsICJGYWlsZWQ9JXguXG4iLCBydmFsKTsKIAkJaWYgKG1jcC0+bWJbMF0gPT0gTUJTX0lOVkFMSURfQ09NTUFORCkKIAkJCXJ2YWwgPSBRTEFfSU5WQUxJRF9DT01NQU5EOwogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwYTMsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtMjYzMCwxNCArMjU4OSwxNCBAQAogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAorCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBhNCwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CisKIAlpZiAoIUlTX0ZXSTJfQ0FQQUJMRSh2aGEtPmh3KSkKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAKIAlpZiAodW5saWtlbHkocGNpX2NoYW5uZWxfb2ZmbGluZSh2aGEtPmh3LT5wZGV2KSkpCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7Ci0KIAltY3AtPm1iWzBdID0gTUJDX1RSQUNFX0NPTlRST0w7CiAJbWNwLT5tYlsxXSA9IFRDX0VGVF9FTkFCTEU7CiAJbWNwLT5tYlsyXSA9IExTVyhlZnRfZG1hKTsKQEAgLTI2NTIsMTAgKzI2MTEsMTEgQEAKIAltY3AtPmZsYWdzID0gMDsKIAlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4IG1iWzBdPSV4IG1iWzFdPSV4LlxuIiwKLQkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGE1LAorCQkgICAgIkZhaWxlZD0leCBtYlswXT0leCBtYlsxXT0leC5cbiIsCisJCSAgICBydmFsLCBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdKTsKIAl9IGVsc2UgewotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGE2LCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTI2NjgsMTQgKzI2MjgsMTQgQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwYTcsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOworCiAJaWYgKCFJU19GV0kyX0NBUEFCTEUodmhhLT5odykpCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCiAJaWYgKHVubGlrZWx5KHBjaV9jaGFubmVsX29mZmxpbmUodmhhLT5ody0+cGRldikpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwotCiAJbWNwLT5tYlswXSA9IE1CQ19UUkFDRV9DT05UUk9MOwogCW1jcC0+bWJbMV0gPSBUQ19FRlRfRElTQUJMRTsKIAltY3AtPm91dF9tYiA9IE1CWF8xfE1CWF8wOwpAQCAtMjY4NCwxMCArMjY0NCwxMSBAQAogCW1jcC0+ZmxhZ3MgPSAwOwogCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXggbWJbMF09JXggbWJbMV09JXguXG4iLAotCQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwYTgsCisJCSAgICAiRmFpbGVkPSV4IG1iWzBdPSV4IG1iWzFdPSV4LlxuIiwKKwkJICAgIHJ2YWwsIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0pOwogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwYTksICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtMjcwMSwxNCArMjY2MiwxNCBAQAogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAorCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBhYSwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CisKIAlpZiAoIUlTX1FMQTI1WFgodmhhLT5odykgJiYgIUlTX1FMQTgxWFgodmhhLT5odykpCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCiAJaWYgKHVubGlrZWx5KHBjaV9jaGFubmVsX29mZmxpbmUodmhhLT5ody0+cGRldikpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwotCiAJbWNwLT5tYlswXSA9IE1CQ19UUkFDRV9DT05UUk9MOwogCW1jcC0+bWJbMV0gPSBUQ19GQ0VfRU5BQkxFOwogCW1jcC0+bWJbMl0gPSBMU1coZmNlX2RtYSk7CkBAIC0yNzI3LDEwICsyNjg4LDExIEBACiAJbWNwLT5mbGFncyA9IDA7CiAJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leCBtYlswXT0leCBtYlsxXT0leC5cbiIsCi0JCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBhYiwKKwkJICAgICJGYWlsZWQ9JXggbWJbMF09JXggbWJbMV09JXguXG4iLAorCQkgICAgcnZhbCwgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSk7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBhYywgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAkJaWYgKG1iKQogCQkJbWVtY3B5KG1iLCBtY3AtPm1iLCA4ICogc2l6ZW9mKCptYikpOwpAQCAtMjc0OCwxNCArMjcxMCwxNCBAQAogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAorCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBhZCwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CisKIAlpZiAoIUlTX0ZXSTJfQ0FQQUJMRSh2aGEtPmh3KSkKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAKIAlpZiAodW5saWtlbHkocGNpX2NoYW5uZWxfb2ZmbGluZSh2aGEtPmh3LT5wZGV2KSkpCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7Ci0KIAltY3AtPm1iWzBdID0gTUJDX1RSQUNFX0NPTlRST0w7CiAJbWNwLT5tYlsxXSA9IFRDX0ZDRV9ESVNBQkxFOwogCW1jcC0+bWJbMl0gPSBUQ19GQ0VfRElTQUJMRV9UUkFDRTsKQEAgLTI3NjYsMTAgKzI3MjgsMTEgQEAKIAltY3AtPmZsYWdzID0gMDsKIAlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4IG1iWzBdPSV4IG1iWzFdPSV4LlxuIiwKLQkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGFlLAorCQkgICAgIkZhaWxlZD0leCBtYlswXT0leCBtYlsxXT0leC5cbiIsCisJCSAgICBydmFsLCBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdKTsKIAl9IGVsc2UgewotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGFmLCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAogCQlpZiAod3IpCiAJCQkqd3IgPSAodWludDY0X3QpIG1jcC0+bWJbNV0gPDwgNDggfApAQCAtMjc5NCwxMSArMjc1NywxMSBAQAogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAorCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBiMCwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CisKIAlpZiAoIUlTX0lJRE1BX0NBUEFCTEUodmhhLT5odykpCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7Ci0KIAltY3AtPm1iWzBdID0gTUJDX1BPUlRfUEFSQU1TOwogCW1jcC0+bWJbMV0gPSBsb29wX2lkOwogCW1jcC0+bWJbMl0gPSBtY3AtPm1iWzNdID0gMDsKQEAgLTI4MTcsMTAgKzI3ODAsOSBAQAogCX0KIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4LlxuIiwgX19mdW5jX18sCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGIxLCAiRmFpbGVkPSV4LlxuIiwgcnZhbCk7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBiMiwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJCWlmIChwb3J0X3NwZWVkKQogCQkJKnBvcnRfc3BlZWQgPSBtY3AtPm1iWzNdOwogCX0KQEAgLTI4MzYsMTEgKzI3OTgsMTEgQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwYjMsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOworCiAJaWYgKCFJU19JSURNQV9DQVBBQkxFKHZoYS0+aHcpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwotCiAJbWNwLT5tYlswXSA9IE1CQ19QT1JUX1BBUkFNUzsKIAltY3AtPm1iWzFdID0gbG9vcF9pZDsKIAltY3AtPm1iWzJdID0gQklUXzA7CkBAIC0yODYzLDEwICsyODI1LDkgQEAKIAl9CiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leC5cbiIsIF9fZnVuY19fLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBiNCwgIkZhaWxlZD0leC5cbiIsIHJ2YWwpOwogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwYjUsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtMjg4MiwzMyArMjg0MywzNiBAQAogCXNjc2lfcWxhX2hvc3RfdCAqdnA7CiAJdW5zaWduZWQgbG9uZyAgIGZsYWdzOwogCisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGI2LCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKKwogCWlmIChycHRpZF9lbnRyeS0+ZW50cnlfc3RhdHVzICE9IDApCiAJCXJldHVybjsKIAogCWlmIChycHRpZF9lbnRyeS0+Zm9ybWF0ID09IDApIHsKLQkJREVCVUcxNShwcmludGsoIiVzOmZvcm1hdCAwIDogc2NzaSglbGQpIG51bWJlciBvZiBWUHMgc2V0dXAgJWQsIgotCQkJIiBudW1iZXIgb2YgVlBzIGFjcXVpcmVkICVkXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLAotCQkJTVNCKGxlMTZfdG9fY3B1KHJwdGlkX2VudHJ5LT52cF9jb3VudCkpLAotCQkJTFNCKGxlMTZfdG9fY3B1KHJwdGlkX2VudHJ5LT52cF9jb3VudCkpKSk7Ci0JCURFQlVHMTUocHJpbnRrKCIlcyBwcmltYXJ5IHBvcnQgaWQgJTAyeCUwMnglMDJ4XG4iLCBfX2Z1bmNfXywKLQkJCXJwdGlkX2VudHJ5LT5wb3J0X2lkWzJdLCBycHRpZF9lbnRyeS0+cG9ydF9pZFsxXSwKLQkJCXJwdGlkX2VudHJ5LT5wb3J0X2lkWzBdKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBiNywKKwkJICAgICJGb3JtYXQgMCA6IE51bWJlciBvZiBWUHMgc2V0dXAgJWQsIG51bWJlciBvZiAiCisJCSAgICAiVlBzIGFjcXVpcmVkICVkLlxuIiwKKwkJICAgIE1TQihsZTE2X3RvX2NwdShycHRpZF9lbnRyeS0+dnBfY291bnQpKSwKKwkJICAgIExTQihsZTE2X3RvX2NwdShycHRpZF9lbnRyeS0+dnBfY291bnQpKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBiOCwKKwkJICAgICJQcmltYXJ5IHBvcnQgaWQgJTAyeCUwMnglMDJ4LlxuIiwKKwkJICAgIHJwdGlkX2VudHJ5LT5wb3J0X2lkWzJdLCBycHRpZF9lbnRyeS0+cG9ydF9pZFsxXSwKKwkJICAgIHJwdGlkX2VudHJ5LT5wb3J0X2lkWzBdKTsKIAl9IGVsc2UgaWYgKHJwdGlkX2VudHJ5LT5mb3JtYXQgPT0gMSkgewogCQl2cF9pZHggPSBMU0Ioc3RhdCk7Ci0JCURFQlVHMTUocHJpbnRrKCIlczpmb3JtYXQgMTogc2NzaSglbGQpOiBWUFslZF0gZW5hYmxlZCAiCi0JCSAgICAiLSBzdGF0dXMgJWQgLSAiCi0JCSAgICAid2l0aCBwb3J0IGlkICUwMnglMDJ4JTAyeFxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywKLQkJICAgIHZwX2lkeCwgTVNCKHN0YXQpLAorCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwYjksCisJCSAgICAiRm9ybWF0IDE6IFZQWyVkXSBlbmFibGVkIC0gc3RhdHVzICVkIC0gd2l0aCAiCisJCSAgICAicG9ydCBpZCAlMDJ4JTAyeCUwMnguXG4iLCB2cF9pZHgsIE1TQihzdGF0KSwKIAkJICAgIHJwdGlkX2VudHJ5LT5wb3J0X2lkWzJdLCBycHRpZF9lbnRyeS0+cG9ydF9pZFsxXSwKLQkJICAgIHJwdGlkX2VudHJ5LT5wb3J0X2lkWzBdKSk7CisJCSAgICBycHRpZF9lbnRyeS0+cG9ydF9pZFswXSk7CiAKIAkJdnAgPSB2aGE7CiAJCWlmICh2cF9pZHggPT0gMCAmJiAoTVNCKHN0YXQpICE9IDEpKQogCQkJZ290byByZWdfbmVlZGVkOwogCiAJCWlmIChNU0Ioc3RhdCkgPT0gMSkgewotCQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBDb3VsZCBub3QgYWNxdWlyZSBJRCBmb3IgIgotCQkJICAgICJWUFslZF0uXG4iLCB2aGEtPmhvc3Rfbm8sIHZwX2lkeCkpOworCQkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGJhLAorCQkJICAgICJDb3VsZCBub3QgYWNxdWlyZSBJRCBmb3IgVlBbJWRdLlxuIiwgdnBfaWR4KTsKIAkJCXJldHVybjsKIAkJfQogCkBAIC0yOTYzLDEwICsyOTI3LDEyIEBACiAKIAkvKiBUaGlzIGNhbiBiZSBjYWxsZWQgYnkgdGhlIHBhcmVudCAqLwogCisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGJiLCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKKwogCXZwbW9kID0gZG1hX3Bvb2xfYWxsb2MoaGEtPnNfZG1hX3Bvb2wsIEdGUF9LRVJORUwsICZ2cG1vZF9kbWEpOwogCWlmICghdnBtb2QpIHsKLQkJREVCVUcyXzMocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gYWxsb2NhdGUgTW9kaWZ5IFZQICIKLQkJICAgICJJT0NCLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgxMGJjLAorCQkgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBtb2RpZnkgVlAgSU9DQi5cbiIpOwogCQlyZXR1cm4gUUxBX01FTU9SWV9BTExPQ19GQUlMRUQ7CiAJfQogCkBAIC0yOTgzLDIyICsyOTQ5LDIxIEBACiAKIAlydmFsID0gcWxhMngwMF9pc3N1ZV9pb2NiKGJhc2VfdmhhLCB2cG1vZCwgdnBtb2RfZG1hLCAwKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBpc3N1ZSBWUCBjb25maWcgSU9DQiIKLQkJCSIoJXgpLlxuIiwgX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBiZCwKKwkJICAgICJGYWlsZWQgdG8gaXNzdWUgVlAgY29uZmlnIElPQ0IgKCV4KS5cbiIsIHJ2YWwpOwogCX0gZWxzZSBpZiAodnBtb2QtPmNvbXBfc3RhdHVzICE9IDApIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gY29tcGxldGUgSU9DQiAiCi0JCQkiLS0gZXJyb3Igc3RhdHVzICgleCkuXG4iLCBfX2Z1bmNfXywgYmFzZV92aGEtPmhvc3Rfbm8sCi0JCQl2cG1vZC0+Y29tcF9zdGF0dXMpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGJlLAorCQkgICAgIkZhaWxlZCB0byBjb21wbGV0ZSBJT0NCIC0tIGVycm9yIHN0YXR1cyAoJXgpLlxuIiwKKwkJICAgIHZwbW9kLT5jb21wX3N0YXR1cyk7CiAJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0gZWxzZSBpZiAodnBtb2QtPmNvbXBfc3RhdHVzICE9IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoQ1NfQ09NUExFVEUpKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGNvbXBsZXRlIElPQ0IgIgotCQkgICAgIi0tIGNvbXBsZXRpb24gc3RhdHVzICgleCkuXG4iLCBfX2Z1bmNfXywgYmFzZV92aGEtPmhvc3Rfbm8sCi0JCSAgICBsZTE2X3RvX2NwdSh2cG1vZC0+Y29tcF9zdGF0dXMpKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBiZiwKKwkJICAgICJGYWlsZWQgdG8gY29tcGxldGUgSU9DQiAtLSBjb21wbGV0aW9uIHN0YXR1cyAoJXgpLlxuIiwKKwkJICAgIGxlMTZfdG9fY3B1KHZwbW9kLT5jb21wX3N0YXR1cykpOwogCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAl9IGVsc2UgewogCQkvKiBFTVBUWSAqLwotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLAotCQkJCQkJCWJhc2VfdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBjMCwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJCWZjX3Zwb3J0X3NldF9zdGF0ZSh2aGEtPmZjX3Zwb3J0LCBGQ19WUE9SVF9JTklUSUFMSVpJTkcpOwogCX0KIAlkbWFfcG9vbF9mcmVlKGhhLT5zX2RtYV9wb29sLCB2cG1vZCwgdnBtb2RfZG1hKTsKQEAgLTMwMzIsMTcgKzI5OTcsMTYgQEAKIAlpbnQJdnBfaW5kZXggPSB2aGEtPnZwX2lkeDsKIAlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqYmFzZV92aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuIEVuYWJsaW5nIGluZGV4ICVkXG4iLCBfX2Z1bmNfXywKLQkgICAgdmhhLT5ob3N0X25vLCB2cF9pbmRleCkpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBjMSwKKwkgICAgIkVudGVyZWQgJXMgZW5hYmxpbmcgaW5kZXggJWQuXG4iLCBfX2Z1bmNfXywgdnBfaW5kZXgpOwogCiAJaWYgKHZwX2luZGV4ID09IDAgfHwgdnBfaW5kZXggPj0gaGEtPm1heF9ucGl2X3Zwb3J0cykKIAkJcmV0dXJuIFFMQV9QQVJBTUVURVJfRVJST1I7CiAKIAl2Y2UgPSBkbWFfcG9vbF9hbGxvYyhoYS0+c19kbWFfcG9vbCwgR0ZQX0tFUk5FTCwgJnZjZV9kbWEpOwogCWlmICghdmNlKSB7Ci0JCURFQlVHMl8zKHByaW50aygiJXMoJWxkKTogIgotCQkgICAgImZhaWxlZCB0byBhbGxvY2F0ZSBWUCBDb250cm9sIElPQ0IuXG4iLCBfX2Z1bmNfXywKLQkJICAgIGJhc2VfdmhhLT5ob3N0X25vKSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDEwYzIsCisJCSAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIFZQIGNvbnRyb2wgSU9DQi5cbiIpOwogCQlyZXR1cm4gUUxBX01FTU9SWV9BTExPQ19GQUlMRUQ7CiAJfQogCW1lbXNldCh2Y2UsIDAsIHNpemVvZihzdHJ1Y3QgdnBfY3RybF9lbnRyeV8yNHh4KSk7CkBAIC0zMDYzLDI4ICszMDI3LDIwIEBACiAKIAlydmFsID0gcWxhMngwMF9pc3N1ZV9pb2NiKGJhc2VfdmhhLCB2Y2UsIHZjZV9kbWEsIDApOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGlzc3VlIFZQIGNvbnRyb2wgSU9DQiIKLQkJICAgICIoJXgpLlxuIiwgX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vLCBydmFsKSk7Ci0JCXByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGlzc3VlIFZQIGNvbnRyb2wgSU9DQiIKLQkJICAgICIoJXgpLlxuIiwgX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vLCBydmFsKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGMzLAorCQkgICAgIkZhaWxlZCB0byBpc3N1ZSBWUCBjb250cm9sIElPQ0IgKCV4KS5cbiIsIHJ2YWwpOwogCX0gZWxzZSBpZiAodmNlLT5lbnRyeV9zdGF0dXMgIT0gMCkgewotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBjb21wbGV0ZSBJT0NCICIKLQkJICAgICItLSBlcnJvciBzdGF0dXMgKCV4KS5cbiIsIF9fZnVuY19fLCBiYXNlX3ZoYS0+aG9zdF9ubywKLQkJICAgIHZjZS0+ZW50cnlfc3RhdHVzKSk7Ci0JCXByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGNvbXBsZXRlIElPQ0IgIgotCQkgICAgIi0tIGVycm9yIHN0YXR1cyAoJXgpLlxuIiwgX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vLAorCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwYzQsCisJCSAgICAiRmFpbGVkIHRvIGNvbXBsZXRlIElPQ0IgLS0gZXJyb3Igc3RhdHVzICgleCkuXG4iLAogCQkgICAgdmNlLT5lbnRyeV9zdGF0dXMpOwogCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAl9IGVsc2UgaWYgKHZjZS0+Y29tcF9zdGF0dXMgIT0gX19jb25zdGFudF9jcHVfdG9fbGUxNihDU19DT01QTEVURSkpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQgdG8gY29tcGxldGUgSU9DQiAiCi0JCSAgICAiLS0gY29tcGxldGlvbiBzdGF0dXMgKCV4KS5cbiIsIF9fZnVuY19fLCBiYXNlX3ZoYS0+aG9zdF9ubywKLQkJICAgIGxlMTZfdG9fY3B1KHZjZS0+Y29tcF9zdGF0dXMpKSk7Ci0JCXByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGNvbXBsZXRlIElPQ0IgIgotCQkgICAgIi0tIGNvbXBsZXRpb24gc3RhdHVzICgleCkuXG4iLCBfX2Z1bmNfXywgYmFzZV92aGEtPmhvc3Rfbm8sCisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBjNSwKKwkJICAgICJGYWlsZWQgdG8gY29tcGxldCBJT0NCIC0tIGNvbXBsZXRpb24gc3RhdHVzICgleCkuXG4iLAogCQkgICAgbGUxNl90b19jcHUodmNlLT5jb21wX3N0YXR1cykpOwogCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAl9IGVsc2UgewotCQlERUJVRzIocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIGJhc2VfdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBjNiwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJZG1hX3Bvb2xfZnJlZShoYS0+c19kbWFfcG9vbCwgdmNlLCB2Y2VfZG1hKTsKQEAgLTMxMjEsNiArMzA3Nyw4IEBACiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGM3LCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKKwogCS8qCiAJICogVGhpcyBjb21tYW5kIGlzIGltcGxpY2l0bHkgZXhlY3V0ZWQgYnkgZmlybXdhcmUgZHVyaW5nIGxvZ2luIGZvciB0aGUKIAkgKiBwaHlzaWNhbCBob3N0cwpAQCAtMzE1NSw3ICszMTEzLDcgQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwMDksICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCiAJaWYgKE1TVyhhZGRyKSB8fCBJU19GV0kyX0NBUEFCTEUodmhhLT5odykpIHsKIAkJbWNwLT5tYlswXSA9IE1CQ19EVU1QX1JJU0NfUkFNX0VYVEVOREVEOwpAQCAtMzE4NiwxMCArMzE0NCwxMCBAQAogCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leCBtYlswXT0leC5cbiIsIF9fZnVuY19fLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTAwOCwKKwkJICAgICJGYWlsZWQ9JXggbWJbMF09JXguXG4iLCBydmFsLCBtY3AtPm1iWzBdKTsKIAl9IGVsc2UgewotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDA3LCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTMyMTQsMTIgKzMxNzIsMTAgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCi0JREVCVUcxNihwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGM4LCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAogCW1uID0gZG1hX3Bvb2xfYWxsb2MoaGEtPnNfZG1hX3Bvb2wsIEdGUF9LRVJORUwsICZtbl9kbWEpOwogCWlmIChtbiA9PSBOVUxMKSB7Ci0JCURFQlVHMl8zKHByaW50aygiJXMoJWxkKTogZmFpbGVkIHRvIGFsbG9jYXRlIFZlcmlmeSBJU1A4NFhYICIKLQkJICAgICJJT0NCLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwogCQlyZXR1cm4gUUxBX01FTU9SWV9BTExPQ19GQUlMRUQ7CiAJfQogCkBAIC0zMjM3LDQzICszMTkzLDQzIEBACiAJCW1uLT5wLnJlcS5lbnRyeV9jb3VudCA9IDE7CiAJCW1uLT5wLnJlcS5vcHRpb25zID0gY3B1X3RvX2xlMTYob3B0aW9ucyk7CiAKLQkJREVCVUcxNihwcmludGsoIiVzKCVsZCk6IER1bXAgb2YgVmVyaWZ5IFJlcXVlc3QuXG4iLCBfX2Z1bmNfXywKLQkJICAgIHZoYS0+aG9zdF9ubykpOwotCQlERUJVRzE2KHFsYTJ4MDBfZHVtcF9idWZmZXIoKHVpbnQ4X3QgKiltbiwKLQkJICAgIHNpemVvZigqbW4pKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4ICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDExMWMsCisJCSAgICAiRHVtcCBvZiBWZXJpZnkgUmVxdWVzdC5cbiIpOworCQlxbF9kdW1wX2J1ZmZlcihxbF9kYmdfbWJ4ICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDExMWUsCisJCSAgICAodWludDhfdCAqKW1uLCBzaXplb2YoKm1uKSk7CiAKIAkJcnZhbCA9IHFsYTJ4MDBfaXNzdWVfaW9jYl90aW1lb3V0KHZoYSwgbW4sIG1uX2RtYSwgMCwgMTIwKTsKIAkJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJCURFQlVHMl8xNihwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBpc3N1ZSBWZXJpZnkgIgotCQkJICAgICJJT0NCICgleCkuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwY2IsCisJCQkgICAgIkZhaWxlZCB0byBpc3N1ZSB2ZXJpZnkgSU9DQiAoJXgpLlxuIiwgcnZhbCk7CiAJCQlnb3RvIHZlcmlmeV9kb25lOwogCQl9CiAKLQkJREVCVUcxNihwcmludGsoIiVzKCVsZCk6IER1bXAgb2YgVmVyaWZ5IFJlc3BvbnNlLlxuIiwgX19mdW5jX18sCi0JCSAgICB2aGEtPmhvc3Rfbm8pKTsKLQkJREVCVUcxNihxbGEyeDAwX2R1bXBfYnVmZmVyKCh1aW50OF90ICopbW4sCi0JCSAgICBzaXplb2YoKm1uKSkpOworCQlxbF9kYmcocWxfZGJnX21ieCArIHFsX2RiZ19idWZmZXIsIHZoYSwgMHgxMTEwLAorCQkgICAgIkR1bXAgb2YgVmVyaWZ5IFJlc3BvbnNlLlxuIik7CisJCXFsX2R1bXBfYnVmZmVyKHFsX2RiZ19tYnggKyBxbF9kYmdfYnVmZmVyLCB2aGEsIDB4MTExOCwKKwkJICAgICh1aW50OF90ICopbW4sIHNpemVvZigqbW4pKTsKIAogCQlzdGF0dXNbMF0gPSBsZTE2X3RvX2NwdShtbi0+cC5yc3AuY29tcF9zdGF0dXMpOwogCQlzdGF0dXNbMV0gPSBzdGF0dXNbMF0gPT0gQ1NfVkNTX0NISVBfRkFJTFVSRSA/CiAJCSAgICBsZTE2X3RvX2NwdShtbi0+cC5yc3AuZmFpbHVyZV9jb2RlKSA6IDA7Ci0JCURFQlVHMl8xNihwcmludGsoIiVzKCVsZCk6IGNzPSV4IGZjPSV4XG4iLCBfX2Z1bmNfXywKLQkJICAgIHZoYS0+aG9zdF9ubywgc3RhdHVzWzBdLCBzdGF0dXNbMV0pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGNlLAorCQkgICAgImNzPSV4IGZjPSV4LlxuIiwgc3RhdHVzWzBdLCBzdGF0dXNbMV0pOwogCiAJCWlmIChzdGF0dXNbMF0gIT0gQ1NfQ09NUExFVEUpIHsKIAkJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCQkJaWYgKCEob3B0aW9ucyAmIFZDT19ET05UX1VQREFURV9GVykpIHsKLQkJCQlERUJVRzJfMTYocHJpbnRrKCIlcyglbGQpOiBGaXJtd2FyZSB1cGRhdGUgIgotCQkJCSAgICAiZmFpbGVkLiBSZXRyeWluZyB3aXRob3V0IHVwZGF0ZSAiCi0JCQkJICAgICJmaXJtd2FyZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwY2YsCisJCQkJICAgICJGaXJtd2FyZSB1cGRhdGUgZmFpbGVkLiBSZXRyeWluZyAiCisJCQkJICAgICJ3aXRob3V0IHVwZGF0ZSBmaXJtd2FyZS5cbiIpOwogCQkJCW9wdGlvbnMgfD0gVkNPX0RPTlRfVVBEQVRFX0ZXOwogCQkJCW9wdGlvbnMgJj0gflZDT19GT1JDRV9VUERBVEU7CiAJCQkJcmV0cnkgPSAxOwogCQkJfQogCQl9IGVsc2UgewotCQkJREVCVUcyXzE2KHByaW50aygiJXMoJWxkKTogZmlybXdhcmUgdXBkYXRlZCB0byAleC5cbiIsCi0JCQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubywKLQkJCSAgICBsZTMyX3RvX2NwdShtbi0+cC5yc3AuZndfdmVyKSkpOworCQkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGQwLAorCQkJICAgICJGaXJtd2FyZSB1cGRhdGVkIHRvICV4LlxuIiwKKwkJCSAgICBsZTMyX3RvX2NwdShtbi0+cC5yc3AuZndfdmVyKSk7CiAKIAkJCS8qIE5PVEU6IHdlIG9ubHkgdXBkYXRlIE9QIGZpcm13YXJlLiAqLwogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhLT5jczg0eHgtPmFjY2Vzc19sb2NrLCBmbGFncyk7CkBAIC0zMjg4LDEwICszMjQ0LDkgQEAKIAlkbWFfcG9vbF9mcmVlKGhhLT5zX2RtYV9wb29sLCBtbiwgbW5fZG1hKTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8xNihwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leC5cbiIsIF9fZnVuY19fLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBkMSwgIkZhaWxlZD0leC5cbiIsIHJ2YWwpOwogCX0gZWxzZSB7Ci0JCURFQlVHMTYocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZDIsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtMzMwNyw2ICszMjYyLDggQEAKIAlzdHJ1Y3QgZGV2aWNlX3JlZ18yNXh4bXEgX19pb21lbSAqcmVnOwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGQzLCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKKwogCW1jcC0+bWJbMF0gPSBNQkNfSU5JVElBTElaRV9NVUxUSVE7CiAJbWNwLT5tYlsxXSA9IHJlcS0+b3B0aW9uczsKIAltY3AtPm1iWzJdID0gTVNXKExTRChyZXEtPmRtYSkpOwpAQCAtMzM0NCw5ICszMzAxLDEzIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAogCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7Ci0JaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpCi0JCURFQlVHMl8zXzExKHByaW50ayhLRVJOX1dBUk5JTkcgIiVzKCVsZCk6IGZhaWxlZD0leCBtYjA9JXguXG4iLAotCQkJX19mdW5jX18sIHZoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSkpOworCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBkNCwKKwkJICAgICJGYWlsZWQ9JXggbWJbMF09JXguXG4iLCBydmFsLCBtY3AtPm1iWzBdKTsKKwl9IGVsc2UgeworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZDUsICJEb25lICVzLlxuIiwgX19mdW5jX18pOworCX0KKwogCXJldHVybiBydmFsOwogfQogCkBAIC0zMzYwLDYgKzMzMjEsOCBAQAogCXN0cnVjdCBkZXZpY2VfcmVnXzI1eHhtcSBfX2lvbWVtICpyZWc7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZDYsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOworCiAJbWNwLT5tYlswXSA9IE1CQ19JTklUSUFMSVpFX01VTFRJUTsKIAltY3AtPm1iWzFdID0gcnNwLT5vcHRpb25zOwogCW1jcC0+bWJbMl0gPSBNU1coTFNEKHJzcC0+ZG1hKSk7CkBAIC0zMzkzLDEwICszMzU2LDEzIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAogCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7Ci0JaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpCi0JCURFQlVHMl8zXzExKHByaW50ayhLRVJOX1dBUk5JTkcgIiVzKCVsZCk6IGZhaWxlZD0leCAiCi0JCQkibWIwPSV4LlxuIiwgX19mdW5jX18sCi0JCQl2aGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0pKTsKKwlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgeworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZDcsCisJCSAgICAiRmFpbGVkPSV4IG1iWzBdPSV4LlxuIiwgcnZhbCwgbWNwLT5tYlswXSk7CisJfSBlbHNlIHsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGQ4LCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKKwl9CisKIAlyZXR1cm4gcnZhbDsKIH0KIApAQCAtMzQwNyw3ICszMzczLDcgQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZDksICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCiAJbWNwLT5tYlswXSA9IE1CQ19JRENfQUNLOwogCW1lbWNweSgmbWNwLT5tYlsxXSwgbWIsIFFMQV9JRENfQUNLX1JFR1MgKiBzaXplb2YodWludDE2X3QpKTsKQEAgLTM0MTgsMTAgKzMzODQsMTAgQEAKIAlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXggKCV4KS5cbiIsIF9fZnVuY19fLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBkYSwKKwkJICAgICJGYWlsZWQ9JXggbWJbMF09JXguXG4iLCBydmFsLCBtY3AtPm1iWzBdKTsKIAl9IGVsc2UgewotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGRiLCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTM0MzQsMTEgKzM0MDAsMTEgQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZGMsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOworCiAJaWYgKCFJU19RTEE4MVhYKHZoYS0+aHcpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwotCiAJbWNwLT5tYlswXSA9IE1CQ19GTEFTSF9BQ0NFU1NfQ1RSTDsKIAltY3AtPm1iWzFdID0gRkFDX09QVF9DTURfR0VUX1NFQ1RPUl9TSVpFOwogCW1jcC0+b3V0X21iID0gTUJYXzF8TUJYXzA7CkBAIC0zNDQ4LDEwICszNDE0LDExIEBACiAJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4IG1iWzBdPSV4IG1iWzFdPSV4LlxuIiwKLQkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGRkLAorCQkgICAgIkZhaWxlZD0leCBtYlswXT0leCBtYlsxXT0leC5cbiIsCisJCSAgICBydmFsLCBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdKTsKIAl9IGVsc2UgewotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGRlLCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAkJKnNlY3Rvcl9zaXplID0gbWNwLT5tYlsxXTsKIAl9CiAKQEAgLTM0NjgsNyArMzQzNSw3IEBACiAJaWYgKCFJU19RTEE4MVhYKHZoYS0+aHcpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBkZiwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAltY3AtPm1iWzBdID0gTUJDX0ZMQVNIX0FDQ0VTU19DVFJMOwogCW1jcC0+bWJbMV0gPSBlbmFibGUgPyBGQUNfT1BUX0NNRF9XUklURV9FTkFCTEUgOgpAQCAtMzQ4MCwxMCArMzQ0NywxMSBAQAogCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leCBtYlswXT0leCBtYlsxXT0leC5cbiIsCi0JCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBlMCwKKwkJICAgICJGYWlsZWQ9JXggbWJbMF09JXggbWJbMV09JXguXG4iLAorCQkgICAgcnZhbCwgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSk7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBlMSwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC0zNDk5LDcgKzM0NjcsNyBAQAogCWlmICghSVNfUUxBODFYWCh2aGEtPmh3KSkKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZTIsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCiAJbWNwLT5tYlswXSA9IE1CQ19GTEFTSF9BQ0NFU1NfQ1RSTDsKIAltY3AtPm1iWzFdID0gRkFDX09QVF9DTURfRVJBU0VfU0VDVE9SOwpAQCAtMzUxNCwxMSArMzQ4MiwxMSBAQAogCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leCBtYlswXT0leCBtYlsxXT0leCAiCi0JCSAgICAibWJbMl09JXguXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdLAotCQkgICAgbWNwLT5tYlsxXSwgbWNwLT5tYlsyXSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZTMsCisJCSAgICAiRmFpbGVkPSV4IG1iWzBdPSV4IG1iWzFdPSV4IG1iWzJdPSV4LlxuIiwKKwkJICAgIHJ2YWwsIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0sIG1jcC0+bWJbMl0pOwogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZTQsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtMzUzMSw3ICszNDk5LDcgQEAKIAltYnhfY21kX3QgbWM7CiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZTUsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCiAJbWNwLT5tYlswXSA9IE1CQ19SRVNUQVJUX01QSV9GVzsKIAltY3AtPm91dF9tYiA9IE1CWF8wOwpAQCAtMzU0MSwxMCArMzUwOSwxMSBAQAogCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leCBtYlswXT0weCV4IG1iWzFdPTB4JXguXG4iLAotCQkgICAgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZTYsCisJCSAgICAiRmFpbGVkPSV4IG1iWzBdPSV4IG1iWzFdPSV4LlxuIiwKKwkJICAgIHJ2YWwsIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0pOwogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZTcsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtMzU1OSwxMSArMzUyOCwxMSBAQAogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGU4LCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKKwogCWlmICghSVNfRldJMl9DQVBBQkxFKGhhKSkKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKLQogCWlmIChsZW4gPT0gMSkKIAkJb3B0IHw9IEJJVF8wOwogCkBAIC0zNTg2LDEwICszNTU1LDEwIEBACiAJCSpzZnAgPSBtY3AtPm1iWzFdOwogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXggKCV4KS5cbiIsIF9fZnVuY19fLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBlOSwKKwkJICAgICJGYWlsZWQ9JXggbWJbMF09JXguXG4iLCBydmFsLCBtY3AtPm1iWzBdKTsKIAl9IGVsc2UgewotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGVhLCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTM2MDQsMTEgKzM1NzMsMTEgQEAKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAorCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBlYiwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CisKIAlpZiAoIUlTX0ZXSTJfQ0FQQUJMRShoYSkpCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCi0JREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7Ci0KIAlpZiAobGVuID09IDEpCiAJCW9wdCB8PSBCSVRfMDsKIApAQCAtMzYzMSwxMCArMzYwMCwxMCBAQAogCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leCAoJXgpLlxuIiwgX19mdW5jX18sCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGVjLAorCQkgICAgIkZhaWxlZD0leCBtYlswXT0leC5cbiIsIHJ2YWwsIG1jcC0+bWJbMF0pOwogCX0gZWxzZSB7Ci0JCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZWQsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtMzY0OCwxMSArMzYxNywxMSBAQAogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAorCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBlZSwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CisKIAlpZiAoIUlTX1FMQThYWFhfVFlQRSh2aGEtPmh3KSkKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKLQogCW1jcC0+bWJbMF0gPSBNQkNfR0VUX1hHTUFDX1NUQVRTOwogCW1jcC0+bWJbMl0gPSBNU1coc3RhdHNfZG1hKTsKIAltY3AtPm1iWzNdID0gTFNXKHN0YXRzX2RtYSk7CkBAIC0zNjY2LDExICszNjM1LDEyIEBACiAJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4IG1iWzBdPTB4JXggIgotCQkgICAgIm1iWzFdPTB4JXggbWJbMl09MHgleC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIHJ2YWwsCi0JCSAgICBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdLCBtY3AtPm1iWzJdKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBlZiwKKwkJICAgICJGYWlsZWQ9JXggbWJbMF09JXggbWJbMV09JXggbWJbMl09JXguXG4iLAorCQkgICAgcnZhbCwgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSwgbWNwLT5tYlsyXSk7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBmMCwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CisKIAogCQkqYWN0dWFsX3NpemUgPSBtY3AtPm1iWzJdIDw8IDI7CiAJfQpAQCAtMzY4NiwxMSArMzY1NiwxMSBAQAogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAorCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBmMSwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CisKIAlpZiAoIUlTX1FMQThYWFhfVFlQRSh2aGEtPmh3KSkKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKLQogCW1jcC0+bWJbMF0gPSBNQkNfR0VUX0RDQlhfUEFSQU1TOwogCW1jcC0+bWJbMV0gPSAwOwogCW1jcC0+bWJbMl0gPSBNU1codGx2X2RtYSk7CkBAIC0zNzA1LDExICszNjc1LDExIEBACiAJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHByaW50aygiJXMoJWxkKTogZmFpbGVkPSV4IG1iWzBdPTB4JXggIgotCQkgICAgIm1iWzFdPTB4JXggbWJbMl09MHgleC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIHJ2YWwsCi0JCSAgICBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdLCBtY3AtPm1iWzJdKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBmMiwKKwkJICAgICJGYWlsZWQ9JXggbWJbMF09JXggbWJbMV09JXggbWJbMl09JXguXG4iLAorCQkgICAgcnZhbCwgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSwgbWNwLT5tYlsyXSk7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBmMywgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJcmV0dXJuIHJ2YWw7CkBAIC0zNzIyLDExICszNjkyLDExIEBACiAJbWJ4X2NtZF90IG1jOwogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGY0LCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKKwogCWlmICghSVNfRldJMl9DQVBBQkxFKHZoYS0+aHcpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAotCURFQlVHMTEocHJpbnRrKCIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwotCiAJbWNwLT5tYlswXSA9IE1CQ19SRUFEX1JBTV9FWFRFTkRFRDsKIAltY3AtPm1iWzFdID0gTFNXKHJpc2NfYWRkcik7CiAJbWNwLT5tYls4XSA9IE1TVyhyaXNjX2FkZHIpOwpAQCAtMzczNiwxMCArMzcwNiwxMCBAQAogCW1jcC0+ZmxhZ3MgPSAwOwogCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXggbWJbMF09JXguXG4iLCBfX2Z1bmNfXywKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwZjUsCisJCSAgICAiRmFpbGVkPSV4IG1iWzBdPSV4LlxuIiwgcnZhbCwgbWNwLT5tYlswXSk7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBmNiwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJCSpkYXRhID0gbWNwLT5tYlszXSA8PCAxNiB8IG1jcC0+bWJbMl07CiAJfQogCkBAIC0zNzU1LDcgKzM3MjUsNyBAQAogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCXVpbnQzMl90IGl0ZXJfY250ID0gMHgxOwogCi0JREVCVUcxMShwcmludGsoInNjc2koJWxkKTogZW50ZXJlZC5cbiIsIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBmNywgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAltZW1zZXQobWNwLT5tYiwgMCAsIHNpemVvZihtY3AtPm1iKSk7CiAJbWNwLT5tYlswXSA9IE1CQ19ESUFHTk9TVElDX0xPT1BfQkFDSzsKQEAgLTM3OTQsMTUgKzM3NjQsMTIgQEAKIAlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyKHByaW50ayhLRVJOX1dBUk5JTkcKLQkJCSIoJWxkKTogZmFpbGVkPSV4IG1iWzBdPTB4JXggIgotCQkJIm1iWzFdPTB4JXggbWJbMl09MHgleCBtYlszXT0weCV4IG1iWzE4XT0weCV4ICIKLQkJCSJtYlsxOV09MHgleC5cbiIsCi0JCQl2aGEtPmhvc3Rfbm8sIHJ2YWwsIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0sIG1jcC0+bWJbMl0sCi0JCQltY3AtPm1iWzNdLCBtY3AtPm1iWzE4XSwgbWNwLT5tYlsxOV0pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGY4LAorCQkgICAgIkZhaWxlZD0leCBtYlswXT0leCBtYlsxXT0leCBtYlsyXT0leCBtYlszXT0leCBtYlsxOF09JXggIgorCQkgICAgIm1iWzE5XT0leC5cbiIsIHJ2YWwsIG1jcC0+bWJbMF0sIG1jcC0+bWJbMV0sIG1jcC0+bWJbMl0sCisJCSAgICBtY3AtPm1iWzNdLCBtY3AtPm1iWzE4XSwgbWNwLT5tYlsxOV0pOwogCX0gZWxzZSB7Ci0JCURFQlVHMihwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAic2NzaSglbGQpOiBkb25lLlxuIiwgdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBmOSwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJfQogCiAJLyogQ29weSBtYWlsYm94IGluZm9ybWF0aW9uICovCkBAIC0zODE5LDcgKzM3ODYsNyBAQAogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCi0JREVCVUcxMShwcmludGsoInNjc2koJWxkKTogZW50ZXJlZC5cbiIsIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBmYSwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CiAKIAltZW1zZXQobWNwLT5tYiwgMCAsIHNpemVvZihtY3AtPm1iKSk7CiAJbWNwLT5tYlswXSA9IE1CQ19ESUFHTk9TVElDX0VDSE87CkBAIC0zODU4LDEyICszODI1LDExIEBACiAJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMihwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAiKCVsZCk6IGZhaWxlZD0leCBtYlswXT0weCV4IG1iWzFdPTB4JXguXG4iLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdLCBtY3AtPm1iWzFdKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBmYiwKKwkJICAgICJGYWlsZWQ9JXggbWJbMF09JXggbWJbMV09JXguXG4iLAorCQkgICAgcnZhbCwgbWNwLT5tYlswXSwgbWNwLT5tYlsxXSk7CiAJfSBlbHNlIHsKLQkJREVCVUcyKHByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICJzY3NpKCVsZCk6IGRvbmUuXG4iLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGZjLCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAkvKiBDb3B5IG1haWxib3ggaW5mb3JtYXRpb24gKi8KQEAgLTM4NzIsMTQgKzM4MzgsMTQgQEAKIH0KIAogaW50Ci1xbGE4NHh4X3Jlc2V0X2NoaXAoc2NzaV9xbGFfaG9zdF90ICpoYSwgdWludDE2X3QgZW5hYmxlX2RpYWdub3N0aWMpCitxbGE4NHh4X3Jlc2V0X2NoaXAoc2NzaV9xbGFfaG9zdF90ICp2aGEsIHVpbnQxNl90IGVuYWJsZV9kaWFnbm9zdGljKQogewogCWludCBydmFsOwogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAotCURFQlVHMTYocHJpbnRrKCIlcyglbGQpOiBlbmFibGVfZGlhZz0lZCBlbnRlcmVkLlxuIiwgX19mdW5jX18sCi0JCWhhLT5ob3N0X25vLCBlbmFibGVfZGlhZ25vc3RpYykpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBmZCwKKwkgICAgIkVudGVyZWQgJXMgZW5hYmxlX2RpYWc9JWQuXG4iLCBfX2Z1bmNfXywgZW5hYmxlX2RpYWdub3N0aWMpOwogCiAJbWNwLT5tYlswXSA9IE1CQ19JU1A4NFhYX1JFU0VUOwogCW1jcC0+bWJbMV0gPSBlbmFibGVfZGlhZ25vc3RpYzsKQEAgLTM4ODcsMTMgKzM4NTMsMTIgQEAKIAltY3AtPmluX21iID0gTUJYXzF8TUJYXzA7CiAJbWNwLT50b3YgPSBNQlhfVE9WX1NFQ09ORFM7CiAJbWNwLT5mbGFncyA9IE1CWF9ETUFfT1VUfE1CWF9ETUFfSU58SU9DVExfQ01EOwotCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZChoYSwgbWNwKTsKKwlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpCi0JCURFQlVHMTYocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ9JXguXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8sCi0JCQlydmFsKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTBmZSwgIkZhaWxlZD0leC5cbiIsIHJ2YWwpOwogCWVsc2UKLQkJREVCVUcxNihwcmludGsoIiVzKCVsZCk6IGRvbmUuXG4iLCBfX2Z1bmNfXywgaGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGZmLCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAogCXJldHVybiBydmFsOwogfQpAQCAtMzkwNSwxMSArMzg3MCwxMSBAQAogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAorCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTEwMCwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CisKIAlpZiAoIUlTX0ZXSTJfQ0FQQUJMRSh2aGEtPmh3KSkKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAKLQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKLQogCW1jcC0+bWJbMF0gPSBNQkNfV1JJVEVfUkFNX1dPUkRfRVhURU5ERUQ7CiAJbWNwLT5tYlsxXSA9IExTVyhyaXNjX2FkZHIpOwogCW1jcC0+bWJbMl0gPSBMU1coZGF0YSk7CkBAIC0zOTIxLDEwICszODg2LDEwIEBACiAJbWNwLT5mbGFncyA9IDA7CiAJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzJfM18xMShwcmludGsoIiVzKCVsZCk6IGZhaWxlZD0leCBtYlswXT0leC5cbiIsIF9fZnVuY19fLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTEwMSwKKwkJICAgICJGYWlsZWQ9JXggbWJbMF09JXguXG4iLCBydmFsLCBtY3AtPm1iWzBdKTsKIAl9IGVsc2UgewotCQlERUJVRzExKHByaW50aygiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMTAyLCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTM5NDEsOCArMzkwNiw3IEBACiAKIAlydmFsID0gUUxBX1NVQ0NFU1M7CiAKLQlERUJVRzExKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkgICAgIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMTAzLCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAogCWNsZWFyX2JpdChNQlhfSU5URVJSVVBULCAmaGEtPm1ieF9jbWRfZmxhZ3MpOwogCkBAIC0zOTgyLDExICszOTQ2LDEwIEBACiAJCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKEtFUk5fSU5GTyAiJXMoJWxkKTogZmFpbGVkPSV4IG1iWzBdPSV4LlxuIiwKLQkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIHJ2YWwsIG1iWzBdKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTEwNCwKKwkJICAgICJGYWlsZWQ9JXggbWJbMF09JXguXG4iLCBydmFsLCBtYlswXSk7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoS0VSTl9JTkZPCi0JCSAgICAiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMTA1LCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTM5OTksMTIgKzM5NjIsMTEgQEAKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAlzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhID0gdmhhLT5odzsKIAorCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTEwNiwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CisKIAlpZiAoIUlTX0ZXSTJfQ0FQQUJMRShoYSkpCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCi0JREVCVUcxMShxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCSIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwotCiAJbWNwLT5tYlswXSA9IE1CQ19EQVRBX1JBVEU7CiAJbWNwLT5tYlsxXSA9IDA7CiAJbWNwLT5vdXRfbWIgPSBNQlhfMXxNQlhfMDsKQEAgLTQwMTMsMTEgKzM5NzUsMTAgQEAKIAltY3AtPmZsYWdzID0gMDsKIAlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHByaW50ayhLRVJOX0lORk8gIiVzKCVsZCk6IGZhaWxlZD0leCBtYlswXT0leC5cbiIsCi0JCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTEwNywKKwkJICAgICJGYWlsZWQ9JXggbWJbMF09JXguXG4iLCBydmFsLCBtY3AtPm1iWzBdKTsKIAl9IGVsc2UgewotCQlERUJVRzExKHByaW50ayhLRVJOX0lORk8KLQkJICAgICIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDExMDgsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCQlpZiAobWNwLT5tYlsxXSAhPSAweDcpCiAJCQloYS0+bGlua19kYXRhX3JhdGUgPSBtY3AtPm1iWzFdOwogCX0KQEAgLTQwMzMsOCArMzk5NCw3IEBACiAJbWJ4X2NtZF90ICptY3AgPSAmbWM7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKLQlERUJVRzExKHByaW50ayhLRVJOX0lORk8KLQkgICAgIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMTA5LCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAogCWlmICghSVNfUUxBODFYWChoYSkpCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwpAQCAtNDA0NywxNSArNDAwNywxMyBAQAogCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzJfM18xMShwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAiJXMoJWxkKTogZmFpbGVkPSV4ICgleCkuXG4iLCBfX2Z1bmNfXywKLQkJICAgIHZoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDExMGEsCisJCSAgICAiRmFpbGVkPSV4IG1iWzBdPSV4LlxuIiwgcnZhbCwgbWNwLT5tYlswXSk7CiAJfSBlbHNlIHsKIAkJLyogQ29weSBhbGwgYml0cyB0byBwcmVzZXJ2ZSBvcmlnaW5hbCB2YWx1ZSAqLwogCQltZW1jcHkobWIsICZtY3AtPm1iWzFdLCBzaXplb2YodWludDE2X3QpICogNCk7CiAKLQkJREVCVUcxMShwcmludGsoS0VSTl9JTkZPCi0JCSAgICAiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMTBiLCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAJcmV0dXJuIHJ2YWw7CiB9CkBAIC00MDY3LDggKzQwMjUsNyBAQAogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAotCURFQlVHMTEocHJpbnRrKEtFUk5fSU5GTwotCSAgICAiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDExMGMsICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCiAJbWNwLT5tYlswXSA9IE1CQ19TRVRfUE9SVF9DT05GSUc7CiAJLyogQ29weSBhbGwgYml0cyB0byBwcmVzZXJ2ZSBvcmlnaW5hbCBzZXR0aW5nICovCkBAIC00MDgwLDEyICs0MDM3LDEwIEBACiAJcnZhbCA9IHFsYTJ4MDBfbWFpbGJveF9jb21tYW5kKHZoYSwgbWNwKTsKIAogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHByaW50ayhLRVJOX1dBUk5JTkcKLQkJICAgICIlcyglbGQpOiBmYWlsZWQ9JXggKCV4KS5cbiIsIF9fZnVuY19fLAotCQkgICAgdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTEwZCwKKwkJICAgICJGYWlsZWQ9JXggbWJbMF09JXguXG4iLCBydmFsLCBtY3AtPm1iWzBdKTsKIAl9IGVsc2UKLQkJREVCVUcxMShwcmludGsoS0VSTl9JTkZPCi0JCSAgICAiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMTBlLCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAogCXJldHVybiBydmFsOwogfQpAQCAtNDEwMCwxMiArNDA1NSwxMSBAQAogCW1ieF9jbWRfdCAqbWNwID0gJm1jOwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMTBmLCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKKwogCWlmICghSVNfUUxBMjRYWF9UWVBFKGhhKSAmJiAhSVNfUUxBMjVYWChoYSkpCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCi0JREVCVUcxMShwcmludGsoS0VSTl9JTkZPCi0JICAgICIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwotCiAJbWNwLT5tYlswXSA9IE1CQ19QT1JUX1BBUkFNUzsKIAltY3AtPm1iWzFdID0gbG9vcF9pZDsKIAlpZiAoaGEtPmZsYWdzLmZjcF9wcmlvX2VuYWJsZWQpCkBAIC00MTI3LDEyICs0MDgxLDkgQEAKIAl9CiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlERUJVRzJfM18xMShwcmludGsoS0VSTl9XQVJOSU5HCi0JCSAgICAiJXMoJWxkKTogZmFpbGVkPSV4LlxuIiwgX19mdW5jX18sCi0JCSAgICB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGNkLCAiRmFpbGVkPSV4LlxuIiwgcnZhbCk7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShwcmludGsoS0VSTl9JTkZPCi0JCSAgICAiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGNjLCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKQEAgLTQxNDUsMTMgKzQwOTYsMTIgQEAKIAl1aW50OF90IGJ5dGU7CiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKLQlERUJVRzExKHByaW50ayhLRVJOX0lORk8gIiVzKCVsZCk6IGVudGVyZWQuXG4iLCBfX2Z1bmNfXywgdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGNhLCAiRW50ZXJlZCAlcy5cbiIsIF9fZnVuY19fKTsKIAogCS8qIEludGVnZXIgcGFydCAqLwogCXJ2YWwgPSBxbGEyeDAwX3JlYWRfc2ZwKHZoYSwgMCwgJmJ5dGUsIDB4OTgsIDB4MDEsIDEsIEJJVF8xM3xCSVRfMCk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgIiVzKCVsZCk6IGZhaWxlZD0leC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMGM5LCAiRmFpbGVkPSV4LlxuIiwgcnZhbCk7CiAJCWhhLT5mbGFncy50aGVybWFsX3N1cHBvcnRlZCA9IDA7CiAJCWdvdG8gZmFpbDsKIAl9CkBAIC00MTYwLDE0ICs0MTEwLDEzIEBACiAJLyogRnJhY3Rpb24gcGFydCAqLwogCXJ2YWwgPSBxbGEyeDAwX3JlYWRfc2ZwKHZoYSwgMCwgJmJ5dGUsIDB4OTgsIDB4MTAsIDEsIEJJVF8xM3xCSVRfMCk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgIiVzKCVsZCk6IGZhaWxlZD0leC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIHJ2YWwpKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDE5LCAiRmFpbGVkPSV4LlxuIiwgcnZhbCk7CiAJCWhhLT5mbGFncy50aGVybWFsX3N1cHBvcnRlZCA9IDA7CiAJCWdvdG8gZmFpbDsKIAl9CiAJKmZyYWMgPSAoYnl0ZSA+PiA2KSAqIDI1OwogCi0JREVCVUcxMShwcmludGsoS0VSTl9JTkZPICIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTAxOCwgIkRvbmUgJXMuXG4iLCBfX2Z1bmNfXyk7CiBmYWlsOgogCXJldHVybiBydmFsOwogfQpAQCAtNDE4MCwxMiArNDEyOSwxMSBAQAogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAorCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTAxNywgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CisKIAlpZiAoIUlTX0ZXSTJfQ0FQQUJMRShoYSkpCiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCi0JREVCVUcxMShxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCSIlcyglbGQpOiBlbnRlcmVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOwotCiAJbWVtc2V0KG1jcCwgMCwgc2l6ZW9mKG1ieF9jbWRfdCkpOwogCW1jcC0+bWJbMF0gPSBNQkNfVE9HR0xFX0lOVEVSUlVQVDsKIAltY3AtPm1iWzFdID0gMTsKQEAgLTQxOTcsMTIgKzQxNDUsMTAgQEAKIAogCXJ2YWwgPSBxbGEyeDAwX21haWxib3hfY29tbWFuZCh2aGEsIG1jcCk7CiAJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyXzNfMTEocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJIiVzKCVsZCk6IGZhaWxlZD0leCBtYlswXT0leC5cbiIsIF9fZnVuY19fLAotCQkJdmhhLT5ob3N0X25vLCBydmFsLCBtY3AtPm1iWzBdKSk7CisJCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTAxNiwKKwkJICAgICJGYWlsZWQ9JXggbWJbMF09JXguXG4iLCBydmFsLCBtY3AtPm1iWzBdKTsKIAl9IGVsc2UgewotCQlERUJVRzExKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCSIlcyglbGQpOiBkb25lLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwMGUsICJEb25lICVzLlxuIiwgX19mdW5jX18pOwogCX0KIAogCXJldHVybiBydmFsOwpAQCAtNDIxNiwxMiArNDE2MiwxMSBAQAogCW1ieF9jbWRfdCBtYzsKIAltYnhfY21kX3QgKm1jcCA9ICZtYzsKIAorCXFsX2RiZyhxbF9kYmdfbWJ4LCB2aGEsIDB4MTAwZCwgIkVudGVyZWQgJXMuXG4iLCBfX2Z1bmNfXyk7CisKIAlpZiAoIUlTX1FMQTgyWFgoaGEpKQogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAotCURFQlVHMTEocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkiJXMoJWxkKTogZW50ZXJlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKLQogCW1lbXNldChtY3AsIDAsIHNpemVvZihtYnhfY21kX3QpKTsKIAltY3AtPm1iWzBdID0gTUJDX1RPR0dMRV9JTlRFUlJVUFQ7CiAJbWNwLT5tYlsxXSA9IDA7CkBAIC00MjMzLDEyICs0MTc4LDEwIEBACiAKIAlydmFsID0gcWxhMngwMF9tYWlsYm94X2NvbW1hbmQodmhhLCBtY3ApOwogCWlmIChydmFsICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMl8zXzExKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSIlcyglbGQpOiBmYWlsZWQ9JXggbWJbMF09JXguXG4iLCBfX2Z1bmNfXywKLQkJCXZoYS0+aG9zdF9ubywgcnZhbCwgbWNwLT5tYlswXSkpOworCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDEwMGMsCisJCSAgICAiRmFpbGVkPSV4IG1iWzBdPSV4LlxuIiwgcnZhbCwgbWNwLT5tYlswXSk7CiAJfSBlbHNlIHsKLQkJREVCVUcxMShxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkiJXMoJWxkKTogZG9uZS5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ19tYngsIHZoYSwgMHgxMDBiLCAiRG9uZSAlcy5cbiIsIF9fZnVuY19fKTsKIAl9CiAKIAlyZXR1cm4gcnZhbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9taWQuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9taWQuYwppbmRleCA1ZTM0MzkxLi5jNzA2ZWQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWlkLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21pZC5jCkBAIC0zNiw4ICszNiw5IEBACiAJbXV0ZXhfbG9jaygmaGEtPnZwb3J0X2xvY2spOwogCXZwX2lkID0gZmluZF9maXJzdF96ZXJvX2JpdChoYS0+dnBfaWR4X21hcCwgaGEtPm1heF9ucGl2X3Zwb3J0cyArIDEpOwogCWlmICh2cF9pZCA+IGhhLT5tYXhfbnBpdl92cG9ydHMpIHsKLQkJREVCVUcxNShwcmludGsgKCJ2cF9pZCAlZCBpcyBiaWdnZXIgdGhhbiBtYXgtc3VwcG9ydGVkICVkLlxuIiwKLQkJICAgIHZwX2lkLCBoYS0+bWF4X25waXZfdnBvcnRzKSk7CisJCXFsX2RiZyhxbF9kYmdfdnBvcnQsIHZoYSwgMHhhMDAwLAorCQkgICAgInZwX2lkICVkIGlzIGJpZ2dlciB0aGFuIG1heC1zdXBwb3J0ZWQgJWQuXG4iLAorCQkgICAgdnBfaWQsIGhhLT5tYXhfbnBpdl92cG9ydHMpOwogCQltdXRleF91bmxvY2soJmhhLT52cG9ydF9sb2NrKTsKIAkJcmV0dXJuIHZwX2lkOwogCX0KQEAgLTEzMSw5ICsxMzIsOSBAQAogCWZjX3BvcnRfdCAqZmNwb3J0OwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShmY3BvcnQsICZ2aGEtPnZwX2ZjcG9ydHMsIGxpc3QpIHsKLQkJREVCVUcxNShwcmludGsoInNjc2koJWxkKTogTWFya2luZyBwb3J0IGRlYWQsICIKLQkJICAgICJsb29wX2lkPTB4JTA0eCA6JXhcbiIsCi0JCSAgICB2aGEtPmhvc3Rfbm8sIGZjcG9ydC0+bG9vcF9pZCwgZmNwb3J0LT52cF9pZHgpKTsKKwkJcWxfZGJnKHFsX2RiZ192cG9ydCwgdmhhLCAweGEwMDEsCisJCSAgICAiTWFya2luZyBwb3J0IGRlYWQsIGxvb3BfaWQ9MHglMDR4IDogJXguXG4iLAorCQkgICAgZmNwb3J0LT5sb29wX2lkLCBmY3BvcnQtPnZwX2lkeCk7CiAKIAkJcWxhMngwMF9tYXJrX2RldmljZV9sb3N0KHZoYSwgZmNwb3J0LCAwLCAwKTsKIAkJcWxhMngwMF9zZXRfZmNwb3J0X3N0YXRlKGZjcG9ydCwgRkNTX1VOQ09ORklHVVJFRCk7CkBAIC0xODcsMTMgKzE4OCwxMyBAQAogCQlnb3RvIGVuYWJsZV9mYWlsZWQ7CiAJfQogCi0JREVCVUcxNShxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JICAgICJWaXJ0dWFsIHBvcnQgd2l0aCBpZDogJWQgLSBFbmFibGVkXG4iLCB2aGEtPnZwX2lkeCkpOworCXFsX2RiZyhxbF9kYmdfdGFza20sIHZoYSwgMHg4MDFhLAorCSAgICAiVmlydHVhbCBwb3J0IHdpdGggaWQ6ICVkIC0gRW5hYmxlZC5cbiIsIHZoYS0+dnBfaWR4KTsKIAlyZXR1cm4gMDsKIAogZW5hYmxlX2ZhaWxlZDoKLQlERUJVRzE1KHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkgICAgIlZpcnR1YWwgcG9ydCB3aXRoIGlkOiAlZCAtIERpc2FibGVkXG4iLCB2aGEtPnZwX2lkeCkpOworCXFsX2RiZyhxbF9kYmdfdGFza20sIHZoYSwgMHg4MDFiLAorCSAgICAiVmlydHVhbCBwb3J0IHdpdGggaWQ6ICVkIC0gRGlzYWJsZWQuXG4iLCB2aGEtPnZwX2lkeCk7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTIwNSwxMiArMjA2LDEyIEBACiAKIAlmY192cG9ydCA9IHZoYS0+ZmNfdnBvcnQ7CiAKLQlERUJVRzE1KHByaW50aygic2NzaSglbGQpOiAlczogY2hhbmdlIHJlcXVlc3QgIzMgZm9yIHRoaXMgaG9zdC5cbiIsCi0JICAgIHZoYS0+aG9zdF9ubywgX19mdW5jX18pKTsKKwlxbF9kYmcocWxfZGJnX3Zwb3J0LCB2aGEsIDB4YTAwMiwKKwkgICAgIiVzOiBjaGFuZ2UgcmVxdWVzdCAjMy5cbiIsIF9fZnVuY19fKTsKIAlyZXQgPSBxbGEyeDAwX3NlbmRfY2hhbmdlX3JlcXVlc3QodmhhLCAweDMsIHZoYS0+dnBfaWR4KTsKIAlpZiAocmV0ICE9IFFMQV9TVUNDRVNTKSB7Ci0JCURFQlVHMTUocWxhX3ByaW50ayhLRVJOX0VSUiwgdmhhLT5odywgIkZhaWxlZCB0byBlbmFibGUgIgotCQkgICAgInJlY2VpdmluZyBvZiBSU0NOIHJlcXVlc3RzOiAweCV4XG4iLCByZXQpKTsKKwkJcWxfZGJnKHFsX2RiZ192cG9ydCwgdmhhLCAweGEwMDMsICJGYWlsZWQgdG8gZW5hYmxlICIKKwkJICAgICJyZWNlaXZpbmcgb2YgUlNDTiByZXF1ZXN0czogMHgleC5cbiIsIHJldCk7CiAJCXJldHVybjsKIAl9IGVsc2UgewogCQkvKiBDb3JyZXNwb25kcyB0byBTQ1IgZW5hYmxlZCAqLwpAQCAtMjQ4LDkgKzI0OSw5IEBACiAJCQljYXNlIE1CQV9DSEdfSU5fQ09OTkVDVElPTjoKIAkJCWNhc2UgTUJBX1BPUlRfVVBEQVRFOgogCQkJY2FzZSBNQkFfUlNDTl9VUERBVEU6Ci0JCQkJREVCVUcxNShwcmludGsoInNjc2koJWxkKSVzOiBBc3luY19ldmVudCBmb3IiCi0JCQkJIiBWUFslZF0sIG1iID0gMHgleCwgdmhhPSVwXG4iLAotCQkJCXZoYS0+aG9zdF9ubywgX19mdW5jX18sIGksICptYiwgdmhhKSk7CisJCQkJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwMjQsCisJCQkJICAgICJBc3luY19ldmVudCBmb3IgVlBbJWRdLCBtYj0weCV4IHZoYT0lcC5cbiIsCisJCQkJICAgIGksICptYiwgdmhhKTsKIAkJCQlxbGEyeDAwX2FzeW5jX2V2ZW50KHZoYSwgcnNwLCBtYik7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0yODYsMzcgKzI4Nyw0OSBAQAogCWlmICghdGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJnZoYS0+ZHBjX2ZsYWdzKSkKIAkJcWxhMjR4eF9jb250cm9sX3ZwKHZoYSwgVkNFX0NPTU1BTkRfRElTQUJMRV9WUFNfTE9HT19BTEwpOwogCi0JREVCVUcxNShwcmludGsoInNjc2koJWxkKTogU2NoZWR1bGluZyBlbmFibGUgb2YgVnBvcnQgJWQuLi5cbiIsCi0JICAgIHZoYS0+aG9zdF9ubywgdmhhLT52cF9pZHgpKTsKKwlxbF9kYmcocWxfZGJnX3Rhc2ttLCB2aGEsIDB4ODAxZCwKKwkgICAgIlNjaGVkdWxpbmcgZW5hYmxlIG9mIFZwb3J0ICVkLlxuIiwgdmhhLT52cF9pZHgpOwogCXJldHVybiBxbGEyNHh4X2VuYWJsZV92cCh2aGEpOwogfQogCiBzdGF0aWMgaW50CiBxbGEyeDAwX2RvX2RwY192cChzY3NpX3FsYV9ob3N0X3QgKnZoYSkKIHsKKwlxbF9kYmcocWxfZGJnX2RwYywgdmhhLCAweDQwMTIsCisJICAgICJFbnRlcmluZyAlcy5cbiIsIF9fZnVuY19fKTsKKwlxbF9kYmcocWxfZGJnX2RwYywgdmhhLCAweDQwMTMsCisJICAgICJ2cF9mbGFnczogMHglbHguXG4iLCB2aGEtPnZwX2ZsYWdzKTsKKwogCXFsYTJ4MDBfZG9fd29yayh2aGEpOwogCiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChWUF9JRFhfQUNRVUlSRUQsICZ2aGEtPnZwX2ZsYWdzKSkgewogCQkvKiBWUCBhY3F1aXJlZC4gY29tcGxldGUgcG9ydCBjb25maWd1cmF0aW9uICovCisJCXFsX2RiZyhxbF9kYmdfZHBjLCB2aGEsIDB4NDAxNCwKKwkJICAgICJDb25maWd1cmUgVlAgc2NoZWR1bGVkLlxuIik7CiAJCXFsYTI0eHhfY29uZmlndXJlX3ZwKHZoYSk7CisJCXFsX2RiZyhxbF9kYmdfZHBjLCB2aGEsIDB4NDAxNSwKKwkJICAgICJDb25maWd1cmUgVlAgZW5kLlxuIik7CiAJCXJldHVybiAwOwogCX0KIAogCWlmICh0ZXN0X2JpdChGQ1BPUlRfVVBEQVRFX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSkgeworCQlxbF9kYmcocWxfZGJnX2RwYywgdmhhLCAweDQwMTYsCisJCSAgICAiRkNQb3J0IHVwZGF0ZSBzY2hlZHVsZWQuXG4iKTsKIAkJcWxhMngwMF91cGRhdGVfZmNwb3J0cyh2aGEpOwogCQljbGVhcl9iaXQoRkNQT1JUX1VQREFURV9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CisJCXFsX2RiZyhxbF9kYmdfZHBjLCB2aGEsIDB4NDAxNywKKwkJICAgICJGQ1BvcnQgdXBkYXRlIGVuZC5cbiIpOwogCX0KIAogCWlmICgodGVzdF9hbmRfY2xlYXJfYml0KFJFTE9HSU5fTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpKSAmJgogCQkhdGVzdF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpICYmCiAJCWF0b21pY19yZWFkKCZ2aGEtPmxvb3Bfc3RhdGUpICE9IExPT1BfRE9XTikgewogCi0JCURFQlVHKHByaW50aygic2NzaSglbGQpOiBxbGEyeDAwX3BvcnRfbG9naW4oKVxuIiwKLQkJCQkJCXZoYS0+aG9zdF9ubykpOworCQlxbF9kYmcocWxfZGJnX2RwYywgdmhhLCAweDQwMTgsCisJCSAgICAiUmVsb2dpbiBuZWVkZWQgc2NoZWR1bGVkLlxuIik7CiAJCXFsYTJ4MDBfcmVsb2dpbih2aGEpOwotCi0JCURFQlVHKHByaW50aygic2NzaSglbGQpOiBxbGEyeDAwX3BvcnRfbG9naW4gLSBlbmRcbiIsCi0JCQkJCQkJdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfZHBjLCB2aGEsIDB4NDAxOSwKKwkJICAgICJSZWxvZ2luIG5lZWRlZCBlbmQuXG4iKTsKIAl9CiAKIAlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFJFU0VUX01BUktFUl9ORUVERUQsICZ2aGEtPmRwY19mbGFncykgJiYKQEAgLTMyNiwxMSArMzM5LDE3IEBACiAKIAlpZiAodGVzdF9hbmRfY2xlYXJfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSkgewogCQlpZiAoISh0ZXN0X2FuZF9zZXRfYml0KExPT1BfUkVTWU5DX0FDVElWRSwgJnZoYS0+ZHBjX2ZsYWdzKSkpIHsKKwkJCXFsX2RiZyhxbF9kYmdfZHBjLCB2aGEsIDB4NDAxYSwKKwkJCSAgICAiTG9vcCByZXN5bmMgc2NoZWR1bGVkLlxuIik7CiAJCQlxbGEyeDAwX2xvb3BfcmVzeW5jKHZoYSk7CiAJCQljbGVhcl9iaXQoTE9PUF9SRVNZTkNfQUNUSVZFLCAmdmhhLT5kcGNfZmxhZ3MpOworCQkJcWxfZGJnKHFsX2RiZ19kcGMsIHZoYSwgMHg0MDFiLAorCQkJICAgICJMb29wIHJlc3luYyBlbmQuXG4iKTsKIAkJfQogCX0KIAorCXFsX2RiZyhxbF9kYmdfZHBjLCB2aGEsIDB4NDAxYywKKwkgICAgIkV4aXRpbmcgJXMuXG4iLCBfX2Z1bmNfXyk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM5Niw5ICs0MTUsMTAgQEAKIAogCS8qIENoZWNrIHVwIG1heC1ucGl2LXN1cHBvcnRzICovCiAJaWYgKGhhLT5udW1fdmhvc3RzID4gaGEtPm1heF9ucGl2X3Zwb3J0cykgewotCQlERUJVRzE1KHByaW50aygic2NzaSglbGQpOiBudW1fdmhvc3RzICV1ZCBpcyBiaWdnZXIgdGhhbiAiCi0JCSAgICAibWF4X25wdl92cG9ydHMgJXVkLlxuIiwgYmFzZV92aGEtPmhvc3Rfbm8sCi0JCSAgICBoYS0+bnVtX3Zob3N0cywgaGEtPm1heF9ucGl2X3Zwb3J0cykpOworCQlxbF9kYmcocWxfZGJnX3Zwb3J0LCB2aGEsIDB4YTAwNCwKKwkJICAgICJudW1fdmhvc3RzICV1ZCBpcyBiaWdnZXIgIgorCQkgICAgInRoYW4gbWF4X25waXZfdnBvcnRzICV1ZC5cbiIsCisJCSAgICBoYS0+bnVtX3Zob3N0cywgaGEtPm1heF9ucGl2X3Zwb3J0cyk7CiAJCXJldHVybiBWUENFUlJfVU5TVVBQT1JURUQ7CiAJfQogCXJldHVybiAwOwpAQCAtNDE1LDcgKzQzNSw4IEBACiAKIAl2aGEgPSBxbGEyeDAwX2NyZWF0ZV9ob3N0KHNodCwgaGEpOwogCWlmICghdmhhKSB7Ci0JCURFQlVHKHByaW50aygicWxhMnh4eDogc2NzaV9ob3N0X2FsbG9jKCkgZmFpbGVkIGZvciB2cG9ydFxuIikpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhhMDA1LAorCQkgICAgInNjc2lfaG9zdF9hbGxvYygpIGZhaWxlZCBmb3IgdnBvcnQuXG4iKTsKIAkJcmV0dXJuKE5VTEwpOwogCX0KIApAQCAtNDI5LDggKzQ1MCw4IEBACiAJdmhhLT5kZXZpY2VfZmxhZ3MgPSAwOwogCXZoYS0+dnBfaWR4ID0gcWxhMjR4eF9hbGxvY2F0ZV92cF9pZCh2aGEpOwogCWlmICh2aGEtPnZwX2lkeCA+IGhhLT5tYXhfbnBpdl92cG9ydHMpIHsKLQkJREVCVUcxNShwcmludGsoInNjc2koJWxkKTogQ291bGRuJ3QgYWxsb2NhdGUgdnBfaWQuXG4iLAotCQkJdmhhLT5ob3N0X25vKSk7CisJCXFsX2RiZyhxbF9kYmdfdnBvcnQsIHZoYSwgMHhhMDA2LAorCQkgICAgIkNvdWxkbid0IGFsbG9jYXRlIHZwX2lkLlxuIik7CiAJCWdvdG8gY3JlYXRlX3Zob3N0X2ZhaWxlZDsKIAl9CiAJdmhhLT5tZ210X3N2cl9sb29wX2lkID0gMTAgKyB2aGEtPnZwX2lkeDsKQEAgLTQ2MSw4ICs0ODIsOSBAQAogCWhvc3QtPm1heF9pZCA9IE1BWF9UQVJHRVRTXzIyMDA7CiAJaG9zdC0+dHJhbnNwb3J0dCA9IHFsYTJ4eHhfdHJhbnNwb3J0X3Zwb3J0X3RlbXBsYXRlOwogCi0JREVCVUcxNShwcmludGsoIkRFQlVHOiBkZXRlY3QgdnBvcnQgaGJhICVsZCBhdCBhZGRyZXNzID0gJXBcbiIsCi0JICAgIHZoYS0+aG9zdF9ubywgdmhhKSk7CisJcWxfZGJnKHFsX2RiZ192cG9ydCwgdmhhLCAweGEwMDcsCisJICAgICJEZXRlY3QgdnBvcnQgaGJhICVsZCBhdCBhZGRyZXNzID0gJXAuXG4iLAorCSAgICB2aGEtPmhvc3Rfbm8sIHZoYSk7CiAKIAl2aGEtPmZsYWdzLmluaXRfZG9uZSA9IDE7CiAKQEAgLTU2Nyw5ICs1ODksOSBAQAogCQlpZiAocmVxKSB7CiAJCQlyZXQgPSBxbGEyNXh4X2RlbGV0ZV9yZXFfcXVlKHZoYSwgcmVxKTsKIAkJCWlmIChyZXQgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkJIkNvdWxkbid0IGRlbGV0ZSByZXEgcXVlICVkXG4iLAotCQkJCXJlcS0+aWQpOworCQkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAwZWEsCisJCQkJICAgICJDb3VsZG4ndCBkZWxldGUgcmVxIHF1ZSAlZC5cbiIsCisJCQkJICAgIHJlcS0+aWQpOwogCQkJCXJldHVybiByZXQ7CiAJCQl9CiAJCX0KQEAgLTU4MSw5ICs2MDMsOSBAQAogCQlpZiAocnNwKSB7CiAJCQlyZXQgPSBxbGEyNXh4X2RlbGV0ZV9yc3BfcXVlKHZoYSwgcnNwKTsKIAkJCWlmIChyZXQgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkJIkNvdWxkbid0IGRlbGV0ZSByc3AgcXVlICVkXG4iLAotCQkJCXJzcC0+aWQpOworCQkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAwZWIsCisJCQkJICAgICJDb3VsZG4ndCBkZWxldGUgcnNwIHF1ZSAlZC5cbiIsCisJCQkJICAgIHJzcC0+aWQpOwogCQkJCXJldHVybiByZXQ7CiAJCQl9CiAJCX0KQEAgLTYwNCw4ICs2MjYsOCBAQAogCiAJcmVxID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJlcV9xdWUpLCBHRlBfS0VSTkVMKTsKIAlpZiAocmVxID09IE5VTEwpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSIKLQkJCSJmb3IgcmVxdWVzdCBxdWVcbiIpOworCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCBiYXNlX3ZoYSwgMHgwMGQ5LAorCQkgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlcXVlc3QgcXVldWUuXG4iKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCkBAIC02MTQsOCArNjM2LDggQEAKIAkJCShyZXEtPmxlbmd0aCArIDEpICogc2l6ZW9mKHJlcXVlc3RfdCksCiAJCQkmcmVxLT5kbWEsIEdGUF9LRVJORUwpOwogCWlmIChyZXEtPnJpbmcgPT0gTlVMTCkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSJNZW1vcnkgQWxsb2NhdGlvbiBmYWlsZWQgLSByZXF1ZXN0X3JpbmdcbiIpOworCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCBiYXNlX3ZoYSwgMHgwMGRhLAorCQkgICAgIkZhaWxlZCB0byBhbGxvY3RlIG1lbW9yeSBmb3IgcmVxdWVzdF9yaW5nLlxuIik7CiAJCWdvdG8gcXVlX2ZhaWxlZDsKIAl9CiAKQEAgLTYyMyw4ICs2NDUsOCBAQAogCXF1ZV9pZCA9IGZpbmRfZmlyc3RfemVyb19iaXQoaGEtPnJlcV9xaWRfbWFwLCBoYS0+bWF4X3JlcV9xdWV1ZXMpOwogCWlmIChxdWVfaWQgPj0gaGEtPm1heF9yZXFfcXVldWVzKSB7CiAJCW11dGV4X3VubG9jaygmaGEtPnZwb3J0X2xvY2spOwotCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJObyByZXNvdXJjZXMgdG8gY3JlYXRlICIKLQkJCSAiYWRkaXRpb25hbCByZXF1ZXN0IHF1ZXVlXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCBiYXNlX3ZoYSwgMHgwMGRiLAorCQkgICAgIk5vIHJlc291cmNlcyB0byBjcmVhdGUgYWRkaXRpb25hbCByZXF1ZXN0IHF1ZXVlLlxuIik7CiAJCWdvdG8gcXVlX2ZhaWxlZDsKIAl9CiAJc2V0X2JpdChxdWVfaWQsIGhhLT5yZXFfcWlkX21hcCk7CkBAIC02MzMsNiArNjU1LDEyIEBACiAJcmVxLT52cF9pZHggPSB2cF9pZHg7CiAJcmVxLT5xb3MgPSBxb3M7CiAKKwlxbF9kYmcocWxfZGJnX211bHRpcSwgYmFzZV92aGEsIDB4YzAwMiwKKwkgICAgInF1ZXVlX2lkPSVkIHJpZD0lZCB2cF9pZHg9JWQgcW9zPSVkLlxuIiwKKwkgICAgcXVlX2lkLCByZXEtPnJpZCwgcmVxLT52cF9pZHgsIHJlcS0+cW9zKTsKKwlxbF9kYmcocWxfZGJnX2luaXQsIGJhc2VfdmhhLCAweDAwZGMsCisJICAgICJxdWV1ZV9pZD0lZCByaWQ9JWQgdnBfaWR4PSVkIHFvcz0lZC5cbiIsCisJICAgIHF1ZV9pZCwgcmVxLT5yaWQsIHJlcS0+dnBfaWR4LCByZXEtPnFvcyk7CiAJaWYgKHJzcF9xdWUgPCAwKQogCQlyZXEtPnJzcCA9IE5VTEw7CiAJZWxzZQpAQCAtNjQ1LDYgKzY3MywxMCBAQAogCQlvcHRpb25zIHw9IEJJVF81OwogCXJlcS0+b3B0aW9ucyA9IG9wdGlvbnM7CiAKKwlxbF9kYmcocWxfZGJnX211bHRpcSwgYmFzZV92aGEsIDB4YzAwMywKKwkgICAgIm9wdGlvbnM9MHgleC5cbiIsIHJlcS0+b3B0aW9ucyk7CisJcWxfZGJnKHFsX2RiZ19pbml0LCBiYXNlX3ZoYSwgMHgwMGRkLAorCSAgICAib3B0aW9ucz0weCV4LlxuIiwgcmVxLT5vcHRpb25zKTsKIAlmb3IgKGNudCA9IDE7IGNudCA8IE1BWF9PVVRTVEFORElOR19DT01NQU5EUzsgY250KyspCiAJCXJlcS0+b3V0c3RhbmRpbmdfY21kc1tjbnRdID0gTlVMTDsKIAlyZXEtPmN1cnJlbnRfb3V0c3RhbmRpbmdfY21kID0gMTsKQEAgLTY1NiwxMCArNjg4LDIxIEBACiAJcmVnID0gSVNQX1FVRV9SRUcoaGEsIHF1ZV9pZCk7CiAJcmVxLT5tYXhfcV9kZXB0aCA9IGhhLT5yZXFfcV9tYXBbMF0tPm1heF9xX2RlcHRoOwogCW11dGV4X3VubG9jaygmaGEtPnZwb3J0X2xvY2spOworCXFsX2RiZyhxbF9kYmdfbXVsdGlxLCBiYXNlX3ZoYSwgMHhjMDA0LAorCSAgICAicmluZ19wdHI9JXAgcmluZ19pbmRleD0lZCwgIgorCSAgICAiY250PSVkIGlkPSVkIG1heF9xX2RlcHRoPSVkLlxuIiwKKwkgICAgcmVxLT5yaW5nX3B0ciwgcmVxLT5yaW5nX2luZGV4LAorCSAgICByZXEtPmNudCwgcmVxLT5pZCwgcmVxLT5tYXhfcV9kZXB0aCk7CisJcWxfZGJnKHFsX2RiZ19pbml0LCBiYXNlX3ZoYSwgMHgwMGRlLAorCSAgICAicmluZ19wdHI9JXAgcmluZ19pbmRleD0lZCwgIgorCSAgICAiY250PSVkIGlkPSVkIG1heF9xX2RlcHRoPSVkLlxuIiwKKwkgICAgcmVxLT5yaW5nX3B0ciwgcmVxLT5yaW5nX2luZGV4LCByZXEtPmNudCwKKwkgICAgcmVxLT5pZCwgcmVxLT5tYXhfcV9kZXB0aCk7CiAKIAlyZXQgPSBxbGEyNXh4X2luaXRfcmVxX3F1ZShiYXNlX3ZoYSwgcmVxKTsKIAlpZiAocmV0ICE9IFFMQV9TVUNDRVNTKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIiVzIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCBiYXNlX3ZoYSwgMHgwMGRmLAorCQkgICAgIiVzIGZhaWxlZC5cbiIsIF9fZnVuY19fKTsKIAkJbXV0ZXhfbG9jaygmaGEtPnZwb3J0X2xvY2spOwogCQljbGVhcl9iaXQocXVlX2lkLCBoYS0+cmVxX3FpZF9tYXApOwogCQltdXRleF91bmxvY2soJmhhLT52cG9ydF9sb2NrKTsKQEAgLTcwMCw4ICs3NDMsOCBAQAogCiAJcnNwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJzcF9xdWUpLCBHRlBfS0VSTkVMKTsKIAlpZiAocnNwID09IE5VTEwpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAiY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IiCi0JCQkJIiByZXNwb25zZSBxdWVcbiIpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIGJhc2VfdmhhLCAweDAwNjYsCisJCSAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVzcG9uc2UgcXVldWUuXG4iKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCkBAIC03MTAsOCArNzUzLDggQEAKIAkJCShyc3AtPmxlbmd0aCArIDEpICogc2l6ZW9mKHJlc3BvbnNlX3QpLAogCQkJJnJzcC0+ZG1hLCBHRlBfS0VSTkVMKTsKIAlpZiAocnNwLT5yaW5nID09IE5VTEwpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkiTWVtb3J5IEFsbG9jYXRpb24gZmFpbGVkIC0gcmVzcG9uc2VfcmluZ1xuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgYmFzZV92aGEsIDB4MDBlMSwKKwkJICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciByZXNwb25zZSByaW5nLlxuIik7CiAJCWdvdG8gcXVlX2ZhaWxlZDsKIAl9CiAKQEAgLTcxOSw4ICs3NjIsOCBAQAogCXF1ZV9pZCA9IGZpbmRfZmlyc3RfemVyb19iaXQoaGEtPnJzcF9xaWRfbWFwLCBoYS0+bWF4X3JzcF9xdWV1ZXMpOwogCWlmIChxdWVfaWQgPj0gaGEtPm1heF9yc3BfcXVldWVzKSB7CiAJCW11dGV4X3VubG9jaygmaGEtPnZwb3J0X2xvY2spOwotCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJObyByZXNvdXJjZXMgdG8gY3JlYXRlICIKLQkJCSAiYWRkaXRpb25hbCByZXNwb25zZSBxdWV1ZVxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgYmFzZV92aGEsIDB4MDBlMiwKKwkJICAgICJObyByZXNvdXJjZXMgdG8gY3JlYXRlIGFkZGl0aW9uYWwgcmVxdWVzdCBxdWV1ZS5cbiIpOwogCQlnb3RvIHF1ZV9mYWlsZWQ7CiAJfQogCXNldF9iaXQocXVlX2lkLCBoYS0+cnNwX3FpZF9tYXApOwpAQCAtNzI4LDEyICs3NzEsMTYgQEAKIAlpZiAoaGEtPmZsYWdzLm1zaXhfZW5hYmxlZCkKIAkJcnNwLT5tc2l4ID0gJmhhLT5tc2l4X2VudHJpZXNbcXVlX2lkICsgMV07CiAJZWxzZQotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJtc2l4IG5vdCBlbmFibGVkXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCBiYXNlX3ZoYSwgMHgwMGUzLAorCQkgICAgIk1TSVggbm90IGVuYWxibGVkLlxuIik7CiAKIAloYS0+cnNwX3FfbWFwW3F1ZV9pZF0gPSByc3A7CiAJcnNwLT5yaWQgPSByaWQ7CiAJcnNwLT52cF9pZHggPSB2cF9pZHg7CiAJcnNwLT5odyA9IGhhOworCXFsX2RiZyhxbF9kYmdfaW5pdCwgYmFzZV92aGEsIDB4MDBlNCwKKwkgICAgInF1ZXVlX2lkPSVkIHJpZD0lZCB2cF9pZHg9JWQgaHc9JXAuXG4iLAorCSAgICBxdWVfaWQsIHJzcC0+cmlkLCByc3AtPnZwX2lkeCwgcnNwLT5odyk7CiAJLyogVXNlIGFsdGVybmF0ZSBQQ0kgYnVzIG51bWJlciAqLwogCWlmIChNU0IocnNwLT5yaWQpKQogCQlvcHRpb25zIHw9IEJJVF80OwpAQCAtNzUwLDYgKzc5NywxNCBAQAogCXJzcC0+cnNwX3FfaW4gPSAmcmVnLT5pc3AyNW1xLnJzcF9xX2luOwogCXJzcC0+cnNwX3Ffb3V0ID0gJnJlZy0+aXNwMjVtcS5yc3BfcV9vdXQ7CiAJbXV0ZXhfdW5sb2NrKCZoYS0+dnBvcnRfbG9jayk7CisJcWxfZGJnKHFsX2RiZ19tdWx0aXEsIGJhc2VfdmhhLCAweGMwMGIsCisJICAgICJvcHRpb25zPSV4IGlkPSVkIHJzcF9xX2luPSVwIHJzcF9xX291dD0lcCIsCisJICAgIHJzcC0+b3B0aW9ucywgcnNwLT5pZCwgcnNwLT5yc3BfcV9pbiwKKwkgICAgcnNwLT5yc3BfcV9vdXQpOworCXFsX2RiZyhxbF9kYmdfaW5pdCwgYmFzZV92aGEsIDB4MDBlNSwKKwkgICAgIm9wdGlvbnM9JXggaWQ9JWQgcnNwX3FfaW49JXAgcnNwX3Ffb3V0PSVwIiwKKwkgICAgcnNwLT5vcHRpb25zLCByc3AtPmlkLCByc3AtPnJzcF9xX2luLAorCSAgICByc3AtPnJzcF9xX291dCk7CiAKIAlyZXQgPSBxbGEyNXh4X3JlcXVlc3RfaXJxKHJzcCk7CiAJaWYgKHJldCkKQEAgLTc1Nyw3ICs4MTIsOCBAQAogCiAJcmV0ID0gcWxhMjV4eF9pbml0X3JzcF9xdWUoYmFzZV92aGEsIHJzcCk7CiAJaWYgKHJldCAhPSBRTEFfU1VDQ0VTUykgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICIlcyBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgYmFzZV92aGEsIDB4MDBlNywKKwkJICAgICIlcyBmYWlsZWQuXG4iLCBfX2Z1bmNfXyk7CiAJCW11dGV4X2xvY2soJmhhLT52cG9ydF9sb2NrKTsKIAkJY2xlYXJfYml0KHF1ZV9pZCwgaGEtPnJzcF9xaWRfbWFwKTsKIAkJbXV0ZXhfdW5sb2NrKCZoYS0+dnBvcnRfbG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbnguYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ueC5jCmluZGV4IGUxMTM4YmMuLjVjYmYzM2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ueC5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ueC5jCkBAIC0zNDgsNiArMzQ4LDcgQEAKIHFsYTgyeHhfcGNpX3NldF9jcmJ3aW5kb3dfMk0oc3RydWN0IHFsYV9od19kYXRhICpoYSwgdWxvbmcgKm9mZikKIHsKIAl1MzIgd2luX3JlYWQ7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCiAJaGEtPmNyYl93aW4gPSBDUkJfSEkoKm9mZik7CiAJd3JpdGVsKGhhLT5jcmJfd2luLApAQCAtMzU4LDkgKzM1OSwxMCBAQAogCSAqLwogCXdpbl9yZWFkID0gUkRfUkVHX0RXT1JEKCh2b2lkICopKENSQl9XSU5ET1dfMk0gKyBoYS0+bnhfcGNpYmFzZSkpOwogCWlmICh3aW5fcmVhZCAhPSBoYS0+Y3JiX3dpbikgewotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkgICAgIiVzOiBXcml0dGVuIGNyYndpbiAoMHgleCkgIT0gUmVhZCBjcmJ3aW4gKDB4JXgpLCAiCi0JCSAgICAib2ZmPTB4JWx4XG4iLCBfX2Z1bmNfXywgaGEtPmNyYl93aW4sIHdpbl9yZWFkLCAqb2ZmKSk7CisJCXFsX2RiZyhxbF9kYmdfcDNwLCB2aGEsIDB4YjAwMCwKKwkJICAgICIlczogV3JpdHRlbiBjcmJ3aW4gKDB4JXgpICIKKwkJICAgICIhPSBSZWFkIGNyYndpbiAoMHgleCksIG9mZj0weCVseC5cbiIsCisJCSAgICBoYS0+Y3JiX3dpbiwgd2luX3JlYWQsICpvZmYpOwogCX0KIAkqb2ZmID0gKCpvZmYgJiBNQVNLKDE2KSkgKyBDUkJfSU5ESVJFQ1RfMk0gKyBoYS0+bnhfcGNpYmFzZTsKIH0KQEAgLTM2OCw2ICszNzAsNyBAQAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCiBxbGE4Mnh4X3BjaV9zZXRfY3Jid2luZG93KHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHU2NCBvZmYpCiB7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCS8qIFNlZSBpZiB3ZSBhcmUgY3VycmVudGx5IHBvaW50aW5nIHRvIHRoZSByZWdpb24gd2Ugd2FudCB0byB1c2UgbmV4dCAqLwogCWlmICgob2ZmID49IFFMQTgyWFhfQ1JCX1BDSVhfSE9TVCkgJiYgKG9mZiA8IFFMQTgyWFhfQ1JCX0REUl9ORVQpKSB7CiAJCS8qIE5vIG5lZWQgdG8gY2hhbmdlIHdpbmRvdy4gUENJWCBhbmQgUENJRXJlZ3MgYXJlIGluIGJvdGgKQEAgLTM5OCw5ICs0MDEsMTAgQEAKIAkJCXJldHVybiBvZmY7CiAJfQogCS8qIHN0cmFuZ2UgYWRkcmVzcyBnaXZlbiAqLwotCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJIiVzOiBXYXJuaW5nOiB1bm1fbmljX3BjaV9zZXRfY3Jid2luZG93IGNhbGxlZCB3aXRoIgotCQkiIGFuIHVua25vd24gYWRkcmVzcyglbGx4KVxuIiwgUUxBMlhYWF9EUklWRVJfTkFNRSwgb2ZmKTsKKwlxbF9kYmcocWxfZGJnX3AzcCwgdmhhLCAweGIwMDEsCisJICAgICIleDogV2FybmluZzogdW5tX25pY19wY2lfc2V0X2NyYndpbmRvdyAiCisJICAgICJjYWxsZWQgd2l0aCBhbiB1bmtub3duIGFkZHJlc3MoJWxseCkuXG4iLAorCSAgICBRTEEyWFhYX0RSSVZFUl9OQU1FLCBvZmYpOwogCXJldHVybiBvZmY7CiB9CiAKQEAgLTU2Myw2ICs1NjcsNyBAQAogewogCWludCB3aW5kb3c7CiAJdTMyIHdpbl9yZWFkOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAogCWlmIChRTEE4MlhYX0FERFJfSU5fUkFOR0UoYWRkciwgUUxBODJYWF9BRERSX0REUl9ORVQsCiAJCVFMQTgyWFhfQUREUl9ERFJfTkVUX01BWCkpIHsKQEAgLTU3NCw4ICs1NzksOCBAQAogCQl3aW5fcmVhZCA9IHFsYTgyeHhfcmRfMzIoaGEsCiAJCQloYS0+bW5fd2luX2NyYiB8IFFMQTgyWFhfUENJX0NSQlNQQUNFKTsKIAkJaWYgKCh3aW5fcmVhZCA8PCAxNykgIT0gd2luZG93KSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkgICAgIiVzOiBXcml0dGVuIE1Od2luICgweCV4KSAhPSBSZWFkIE1Od2luICgweCV4KVxuIiwKKwkJCXFsX2RiZyhxbF9kYmdfcDNwLCB2aGEsIDB4YjAwMywKKwkJCSAgICAiJXM6IFdyaXR0ZW4gTU53aW4gKDB4JXgpICE9IFJlYWQgTU53aW4gKDB4JXgpLlxuIiwKIAkJCSAgICBfX2Z1bmNfXywgd2luZG93LCB3aW5fcmVhZCk7CiAJCX0KIAkJYWRkciA9IEdFVF9NRU1fT0ZGU18yTShhZGRyKSArIFFMQTgyWFhfUENJX0REUl9ORVQ7CkBAIC01ODMsNyArNTg4LDcgQEAKIAkJUUxBODJYWF9BRERSX09DTTBfTUFYKSkgewogCQl1bnNpZ25lZCBpbnQgdGVtcDE7CiAJCWlmICgoYWRkciAmIDB4MDBmZjgwMCkgPT0gMHhmZjgwMCkgewotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4YjAwNCwKIAkJCSAgICAiJXM6IFFNIGFjY2VzcyBub3QgaGFuZGxlZC5cbiIsIF9fZnVuY19fKTsKIAkJCWFkZHIgPSAtMVVMOwogCQl9CkBAIC01OTYsOCArNjAxLDggQEAKIAkJdGVtcDEgPSAoKHdpbmRvdyAmIDB4MUZGKSA8PCA3KSB8CiAJCSAgICAoKHdpbmRvdyAmIDB4MEZGRkUwMDAwKSA+PiAxNyk7CiAJCWlmICh3aW5fcmVhZCAhPSB0ZW1wMSkgewotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJICAgICIlczogV3JpdHRlbiBPQ013aW4gKDB4JXgpICE9IFJlYWQgT0NNd2luICgweCV4KVxuIiwKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGIwMDUsCisJCQkgICAgIiVzOiBXcml0dGVuIE9DTXdpbiAoMHgleCkgIT0gUmVhZCBPQ013aW4gKDB4JXgpLlxuIiwKIAkJCSAgICBfX2Z1bmNfXywgdGVtcDEsIHdpbl9yZWFkKTsKIAkJfQogCQlhZGRyID0gR0VUX01FTV9PRkZTXzJNKGFkZHIpICsgUUxBODJYWF9QQ0lfT0NNMF8yTTsKQEAgLTYxMiw4ICs2MTcsOCBAQAogCQl3aW5fcmVhZCA9IHFsYTgyeHhfcmRfMzIoaGEsCiAJCQloYS0+bXNfd2luX2NyYiB8IFFMQTgyWFhfUENJX0NSQlNQQUNFKTsKIAkJaWYgKHdpbl9yZWFkICE9IHdpbmRvdykgewotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJICAgICIlczogV3JpdHRlbiBNU3dpbiAoMHgleCkgIT0gUmVhZCBNU3dpbiAoMHgleClcbiIsCisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhiMDA2LAorCQkJICAgICIlczogV3JpdHRlbiBNU3dpbiAoMHgleCkgIT0gUmVhZCBNU3dpbiAoMHgleCkuXG4iLAogCQkJICAgIF9fZnVuY19fLCB3aW5kb3csIHdpbl9yZWFkKTsKIAkJfQogCQlhZGRyID0gR0VUX01FTV9PRkZTXzJNKGFkZHIpICsgUUxBODJYWF9QQ0lfUURSX05FVDsKQEAgLTYyNCw5ICs2MjksOSBAQAogCQkgKi8KIAkJaWYgKChxbGE4Mnh4X3BjaV9zZXRfd2luZG93X3dhcm5pbmdfY291bnQrKyA8IDgpIHx8CiAJCSAgICAocWxhODJ4eF9wY2lfc2V0X3dpbmRvd193YXJuaW5nX2NvdW50JTY0ID09IDApKSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkgICAgIiVzOiBXYXJuaW5nOiVzIFVua25vd24gYWRkcmVzcyByYW5nZSFcbiIsIF9fZnVuY19fLAotCQkJICAgIFFMQTJYWFhfRFJJVkVSX05BTUUpOworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4YjAwNywKKwkJCSAgICAiJXM6IFdhcm5pbmc6JXMgVW5rbm93biBhZGRyZXNzIHJhbmdlIS5cbiIsCisJCQkgICAgX19mdW5jX18sIFFMQTJYWFhfRFJJVkVSX05BTUUpOwogCQl9CiAJCWFkZHIgPSAtMVVMOwogCX0KQEAgLTY3MSw2ICs2NzYsNyBAQAogCXVpbnQ4X3QgICAgICAgICAqbWVtX3B0ciA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyAgIG1lbV9iYXNlOwogCXVuc2lnbmVkIGxvbmcgICBtZW1fcGFnZTsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CiAKIAl3cml0ZV9sb2NrX2lycXNhdmUoJmhhLT5od19sb2NrLCBmbGFncyk7CiAKQEAgLTY4Miw5ICs2ODgsMTAgQEAKIAlpZiAoKHN0YXJ0ID09IC0xVUwpIHx8CiAJCShxbGE4Mnh4X3BjaV9pc19zYW1lX3dpbmRvdyhoYSwgb2ZmICsgc2l6ZSAtIDEpID09IDApKSB7CiAJCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aHdfbG9jaywgZmxhZ3MpOwotCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwKLQkJCSIlcyBvdXQgb2YgYm91bmQgcGNpIG1lbW9yeSBhY2Nlc3MuICIKLQkJCSJvZmZzZXQgaXMgMHglbGx4XG4iLCBRTEEyWFhYX0RSSVZFUl9OQU1FLCBvZmYpOworCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4YjAwOCwKKwkJICAgICIlcyBvdXQgb2YgYm91bmQgcGNpIG1lbW9yeSAiCisJCSAgICAiYWNjZXNzLCBvZmZzZXQgaXMgMHglbGx4LlxuIiwKKwkJICAgIFFMQTJYWFhfRFJJVkVSX05BTUUsIG9mZik7CiAJCXJldHVybiAtMTsKIAl9CiAKQEAgLTc0MSw2ICs3NDgsNyBAQAogCXVpbnQ4X3QgICAgICAgICAqbWVtX3B0ciA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyAgIG1lbV9iYXNlOwogCXVuc2lnbmVkIGxvbmcgICBtZW1fcGFnZTsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CiAKIAl3cml0ZV9sb2NrX2lycXNhdmUoJmhhLT5od19sb2NrLCBmbGFncyk7CiAKQEAgLTc1Miw5ICs3NjAsMTAgQEAKIAlpZiAoKHN0YXJ0ID09IC0xVUwpIHx8CiAJCShxbGE4Mnh4X3BjaV9pc19zYW1lX3dpbmRvdyhoYSwgb2ZmICsgc2l6ZSAtIDEpID09IDApKSB7CiAJCXdyaXRlX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aHdfbG9jaywgZmxhZ3MpOwotCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwKLQkJCSIlcyBvdXQgb2YgYm91bmQgcGNpIG1lbW9yeSBhY2Nlc3MuICIKLQkJCSJvZmZzZXQgaXMgMHglbGx4XG4iLCBRTEEyWFhYX0RSSVZFUl9OQU1FLCBvZmYpOworCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4YjAwOSwKKwkJICAgICIlcyBvdXQgb2YgYm91bnQgbWVtb3J5ICIKKwkJICAgICJhY2Nlc3MsIG9mZnNldCBpcyAweCVsbHguXG4iLAorCQkgICAgUUxBMlhYWF9EUklWRVJfTkFNRSwgb2ZmKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtODU1LDE1ICs4NjQsMTYgQEAKIHsKIAlsb25nIHRpbWVvdXQgPSAwOwogCWxvbmcgZG9uZSA9IDAgOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAogCXdoaWxlIChkb25lID09IDApIHsKIAkJZG9uZSA9IHFsYTgyeHhfcmRfMzIoaGEsIFFMQTgyWFhfUk9NVVNCX0dMQl9TVEFUVVMpOwogCQlkb25lICY9IDQ7CiAJCXRpbWVvdXQrKzsKIAkJaWYgKHRpbWVvdXQgPj0gcm9tX21heF90aW1lb3V0KSB7Ci0JCQlERUJVRyhxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkJIiVzOiBUaW1lb3V0IHJlYWNoZWQgd2FpdGluZyBmb3Igcm9tIGJ1c3kiLAotCQkJCVFMQTJYWFhfRFJJVkVSX05BTUUpKTsKKwkJCXFsX2RiZyhxbF9kYmdfcDNwLCB2aGEsIDB4YjAwYSwKKwkJCSAgICAiJXM6IFRpbWVvdXQgcmVhY2hlZCB3YWl0aW5nIGZvciByb20gYnVzeS5cbiIsCisJCQkgICAgUUxBMlhYWF9EUklWRVJfTkFNRSk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAl9CkBAIC04NzUsMTUgKzg4NSwxNiBAQAogewogCWxvbmcgdGltZW91dCA9IDA7CiAJbG9uZyBkb25lID0gMCA7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCiAJd2hpbGUgKGRvbmUgPT0gMCkgewogCQlkb25lID0gcWxhODJ4eF9yZF8zMihoYSwgUUxBODJYWF9ST01VU0JfR0xCX1NUQVRVUyk7CiAJCWRvbmUgJj0gMjsKIAkJdGltZW91dCsrOwogCQlpZiAodGltZW91dCA+PSByb21fbWF4X3RpbWVvdXQpIHsKLQkJCURFQlVHKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCQkiJXM6IFRpbWVvdXQgcmVhY2hlZCAgd2FpdGluZyBmb3Igcm9tIGRvbmUiLAotCQkJCVFMQTJYWFhfRFJJVkVSX05BTUUpKTsKKwkJCXFsX2RiZyhxbF9kYmdfcDNwLCB2aGEsIDB4YjAwYiwKKwkJCSAgICAiJXM6IFRpbWVvdXQgcmVhY2hlZCB3YWl0aW5nIGZvciByb20gZG9uZS5cbiIsCisJCQkgICAgUUxBMlhYWF9EUklWRVJfTkFNRSk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAl9CkBAIC04OTMsMTUgKzkwNCwxNiBAQAogc3RhdGljIGludAogcWxhODJ4eF9kb19yb21fZmFzdF9yZWFkKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIGludCBhZGRyLCBpbnQgKnZhbHApCiB7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOworCiAJcWxhODJ4eF93cl8zMihoYSwgUUxBODJYWF9ST01VU0JfUk9NX0FERFJFU1MsIGFkZHIpOwogCXFsYTgyeHhfd3JfMzIoaGEsIFFMQTgyWFhfUk9NVVNCX1JPTV9EVU1NWV9CWVRFX0NOVCwgMCk7CiAJcWxhODJ4eF93cl8zMihoYSwgUUxBODJYWF9ST01VU0JfUk9NX0FCWVRFX0NOVCwgMyk7CiAJcWxhODJ4eF93cl8zMihoYSwgUUxBODJYWF9ST01VU0JfUk9NX0lOU1RSX09QQ09ERSwgMHhiKTsKIAlxbGE4Mnh4X3dhaXRfcm9tX2J1c3koaGEpOwogCWlmIChxbGE4Mnh4X3dhaXRfcm9tX2RvbmUoaGEpKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSIlczogRXJyb3Igd2FpdGluZyBmb3Igcm9tIGRvbmVcbiIsCi0JCQlRTEEyWFhYX0RSSVZFUl9OQU1FKTsKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwYmEsCisJCSAgICAiRXJyb3Igd2FpdGluZyBmb3Igcm9tIGRvbmUuXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAkvKiBSZXNldCBhYnl0ZV9jbnQgYW5kIGR1bW15X2J5dGVfY250ICovCkBAIC05MTcsNiArOTI5LDcgQEAKIHFsYTgyeHhfcm9tX2Zhc3RfcmVhZChzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhLCBpbnQgYWRkciwgaW50ICp2YWxwKQogewogCWludCByZXQsIGxvb3BzID0gMDsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CiAKIAl3aGlsZSAoKHFsYTgyeHhfcm9tX2xvY2soaGEpICE9IDApICYmIChsb29wcyA8IDUwMDAwKSkgewogCQl1ZGVsYXkoMTAwKTsKQEAgLTkyNCw5ICs5MzcsOCBAQAogCQlsb29wcysrOwogCX0KIAlpZiAobG9vcHMgPj0gNTAwMDApIHsKLQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJIiVzOiBxbGE4Mnh4X3JvbV9sb2NrIGZhaWxlZFxuIiwKLQkJCVFMQTJYWFhfRFJJVkVSX05BTUUpOworCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDBiOSwKKwkJICAgICJGYWlsZWQgdG8gYXF1aXJlIFNFTTIgbG9jay5cbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCXJldCA9IHFsYTgyeHhfZG9fcm9tX2Zhc3RfcmVhZChoYSwgYWRkciwgdmFscCk7CkBAIC05MzcsMTEgKzk0OSwxMiBAQAogc3RhdGljIGludAogcWxhODJ4eF9yZWFkX3N0YXR1c19yZWcoc3RydWN0IHFsYV9od19kYXRhICpoYSwgdWludDMyX3QgKnZhbCkKIHsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CiAJcWxhODJ4eF93cl8zMihoYSwgUUxBODJYWF9ST01VU0JfUk9NX0lOU1RSX09QQ09ERSwgTTI1UF9JTlNUUl9SRFNSKTsKIAlxbGE4Mnh4X3dhaXRfcm9tX2J1c3koaGEpOwogCWlmIChxbGE4Mnh4X3dhaXRfcm9tX2RvbmUoaGEpKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJFcnJvciB3YWl0aW5nIGZvciByb20gZG9uZVxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGIwMGMsCisJCSAgICAiRXJyb3Igd2FpdGluZyBmb3Igcm9tIGRvbmUuXG4iKTsKIAkJcmV0dXJuIC0xOwogCX0KIAkqdmFsID0gcWxhODJ4eF9yZF8zMihoYSwgUUxBODJYWF9ST01VU0JfUk9NX1JEQVRBKTsKQEAgLTk1NSw2ICs5NjgsNyBAQAogCXVpbnQzMl90IGRvbmUgPSAxIDsKIAl1aW50MzJfdCB2YWw7CiAJaW50IHJldCA9IDA7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCiAJcWxhODJ4eF93cl8zMihoYSwgUUxBODJYWF9ST01VU0JfUk9NX0FCWVRFX0NOVCwgMCk7CiAJd2hpbGUgKChkb25lICE9IDApICYmIChyZXQgPT0gMCkpIHsKQEAgLTk2NCw4ICs5NzgsOCBAQAogCQl1ZGVsYXkoMTApOwogCQljb25kX3Jlc2NoZWQoKTsKIAkJaWYgKHRpbWVvdXQgPj0gNTAwMDApIHsKLQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSAgICAiVGltZW91dCByZWFjaGVkICB3YWl0aW5nIGZvciB3cml0ZSBmaW5pc2giKTsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGIwMGQsCisJCQkgICAgIlRpbWVvdXQgcmVhY2hlZCB3YWl0aW5nIGZvciB3cml0ZSBmaW5pc2guXG4iKTsKIAkJCXJldHVybiAtMTsKIAkJfQogCX0KQEAgLTk5MiwxMyArMTAwNiwxNCBAQAogc3RhdGljIGludAogcWxhODJ4eF93cml0ZV9zdGF0dXNfcmVnKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHVpbnQzMl90IHZhbCkKIHsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CiAJaWYgKHFsYTgyeHhfZmxhc2hfc2V0X3dyaXRlX2VuYWJsZShoYSkpCiAJCXJldHVybiAtMTsKIAlxbGE4Mnh4X3dyXzMyKGhhLCBRTEE4MlhYX1JPTVVTQl9ST01fV0RBVEEsIHZhbCk7CiAJcWxhODJ4eF93cl8zMihoYSwgUUxBODJYWF9ST01VU0JfUk9NX0lOU1RSX09QQ09ERSwgMHgxKTsKIAlpZiAocWxhODJ4eF93YWl0X3JvbV9kb25lKGhhKSkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiRXJyb3Igd2FpdGluZyBmb3Igcm9tIGRvbmVcbiIpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhiMDBlLAorCQkgICAgIkVycm9yIHdhaXRpbmcgZm9yIHJvbSBkb25lLlxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAJcmV0dXJuIHFsYTgyeHhfZmxhc2hfd2FpdF93cml0ZV9maW5pc2goaGEpOwpAQCAtMTAwNywxMCArMTAyMiwxMSBAQAogc3RhdGljIGludAogcWxhODJ4eF93cml0ZV9kaXNhYmxlX2ZsYXNoKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEpCiB7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCXFsYTgyeHhfd3JfMzIoaGEsIFFMQTgyWFhfUk9NVVNCX1JPTV9JTlNUUl9PUENPREUsIE0yNVBfSU5TVFJfV1JESSk7CiAJaWYgKHFsYTgyeHhfd2FpdF9yb21fZG9uZShoYSkpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIkVycm9yIHdhaXRpbmcgZm9yIHJvbSBkb25lXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4YjAwZiwKKwkJICAgICJFcnJvciB3YWl0aW5nIGZvciByb20gZG9uZS5cbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCXJldHVybiAwOwpAQCAtMTAyMCwxMyArMTAzNiwxNiBAQAogcWw4Mnh4X3JvbV9sb2NrX2Qoc3RydWN0IHFsYV9od19kYXRhICpoYSkKIHsKIAlpbnQgbG9vcHMgPSAwOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKKwogCXdoaWxlICgocWxhODJ4eF9yb21fbG9jayhoYSkgIT0gMCkgJiYgKGxvb3BzIDwgNTAwMDApKSB7CiAJCXVkZWxheSgxMDApOwogCQljb25kX3Jlc2NoZWQoKTsKIAkJbG9vcHMrKzsKIAl9CiAJaWYgKGxvb3BzID49IDUwMDAwKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIlJPTSBsb2NrIGZhaWxlZFxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGIwMTAsCisJCSAgICAiUk9NIGxvY2sgZmFpbGVkLlxuIik7CiAJCXJldHVybiAtMTsKIAl9CiAJcmV0dXJuIDA7OwpAQCAtMTAzNywxMCArMTA1NiwxMiBAQAogCXVpbnQzMl90IGRhdGEpCiB7CiAJaW50IHJldCA9IDA7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCiAJcmV0ID0gcWw4Mnh4X3JvbV9sb2NrX2QoaGEpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIlJPTSBMb2NrIGZhaWxlZFxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGIwMTEsCisJCSAgICAiUk9NIGxvY2sgZmFpbGVkLlxuIik7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0xMDUzLDggKzEwNzQsOCBAQAogCXFsYTgyeHhfd3JfMzIoaGEsIFFMQTgyWFhfUk9NVVNCX1JPTV9JTlNUUl9PUENPREUsIE0yNVBfSU5TVFJfUFApOwogCXFsYTgyeHhfd2FpdF9yb21fYnVzeShoYSk7CiAJaWYgKHFsYTgyeHhfd2FpdF9yb21fZG9uZShoYSkpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJIkVycm9yIHdhaXRpbmcgZm9yIHJvbSBkb25lXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4YjAxMiwKKwkJICAgICJFcnJvciB3YWl0aW5nIGZvciByb20gZG9uZS5cbiIpOwogCQlyZXQgPSAtMTsKIAkJZ290byBkb25lX3dyaXRlOwogCX0KQEAgLTExNTksOCArMTE4MCw4IEBACiAJICovCiAJaWYgKHFsYTgyeHhfcm9tX2Zhc3RfcmVhZChoYSwgMCwgJm4pICE9IDAgfHwgbiAhPSAweGNhZmVjYWZlVUwgfHwKIAkgICAgcWxhODJ4eF9yb21fZmFzdF9yZWFkKGhhLCA0LCAmbikgIT0gMCkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiW0VSUk9SXSBSZWFkaW5nIGNyYl9pbml0IGFyZWE6IG46ICUwOHhcbiIsIG4pOworCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDA2ZSwKKwkJICAgICJFcnJvciBSZWFkaW5nIGNyYl9pbml0IGFyZWE6IG46ICUwOHguXG4iLCBuKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtMTE3MiwyMCArMTE5MywxOCBAQAogCiAJLyogbnVtYmVyIG9mIGFkZHIvdmFsdWUgcGFpciBzaG91bGQgbm90IGV4Y2VlZCAxMDI0IGVudGVyaWVzICovCiAJaWYgKG4gID49IDEwMjQpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIiVzOiAlczpuPTB4JXggW0VSUk9SXSBDYXJkIGZsYXNoIG5vdCBpbml0aWFsaXplZC5cbiIsCi0JCSAgICBRTEEyWFhYX0RSSVZFUl9OQU1FLCBfX2Z1bmNfXywgbik7CisJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMDcxLAorCQkgICAgIkNhcmQgZmxhc2ggbm90IGluaXRpYWxpemVkOm49MHgleC5cbiIsIG4pOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCSAgICAiJXM6ICVkIENSQiBpbml0IHZhbHVlcyBmb3VuZCBpbiBST00uXG4iLCBRTEEyWFhYX0RSSVZFUl9OQU1FLCBuKTsKKwlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHgwMDcyLAorCSAgICAiJWQgQ1JCIGluaXQgdmFsdWVzIGZvdW5kIGluIFJPTS5cbiIsIG4pOwogCiAJYnVmID0ga21hbGxvYyhuICogc2l6ZW9mKHN0cnVjdCBjcmJfYWRkcl9wYWlyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGJ1ZiA9PSBOVUxMKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICIlczogW0VSUk9SXSBVbmFibGUgdG8gbWFsbG9jIG1lbW9yeS5cbiIsCi0JCSAgICBRTEEyWFhYX0RSSVZFUl9OQU1FKTsKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAxMGMsCisJCSAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeS5cbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCkBAIC0xMjM2LDkgKzEyNTUsOCBAQAogCQkJY29udGludWU7CiAKIAkJaWYgKG9mZiA9PSBBRERSX0VSUk9SKSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkgICAgIiVzOiBbRVJST1JdIFVua25vd24gYWRkcjogMHglMDhseFxuIiwKLQkJCSAgICBRTEEyWFhYX0RSSVZFUl9OQU1FLCBidWZbaV0uYWRkcik7CisJCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDExNiwKKwkJCSAgICAiVW5rbm93IGFkZHI6IDB4JTA4bHguXG4iLCBidWZbaV0uYWRkcik7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC0xMzcwLDcgKzEzODgsNyBAQAogCQlpZiAoaiA+PSBNQVhfQ1RMX0NIRUNLKSB7CiAJCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQogCQkJCWRldl9lcnIoJmhhLT5wZGV2LT5kZXYsCi0JCQkJICAgICJmYWlsZWQgdG8gd3JpdGUgdGhyb3VnaCBhZ2VudFxuIik7CisJCQkJICAgICJmYWlsZWQgdG8gd3JpdGUgdGhyb3VnaCBhZ2VudC5cbiIpOwogCQkJcmV0ID0gLTE7CiAJCQlicmVhazsKIAkJfQpAQCAtMTQ2MCw3ICsxNDc4LDcgQEAKIAkJaWYgKGogPj0gTUFYX0NUTF9DSEVDSykgewogCQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKIAkJCQlkZXZfZXJyKCZoYS0+cGRldi0+ZGV2LAotCQkJCSAgICAiZmFpbGVkIHRvIHJlYWQgdGhyb3VnaCBhZ2VudFxuIik7CisJCQkJICAgICJmYWlsZWQgdG8gcmVhZCB0aHJvdWdoIGFnZW50LlxuIik7CiAJCQlicmVhazsKIAkJfQogCkBAIC0xNjMzLDE3ICsxNjUxLDE1IEBACiAJdWludDMyX3QgbGVuID0gMDsKIAogCWlmIChwY2lfcmVxdWVzdF9yZWdpb25zKGhhLT5wZGV2LCBRTEEyWFhYX0RSSVZFUl9OQU1FKSkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkiRmFpbGVkIHRvIHJlc2VydmUgc2VsZWN0ZWQgcmVnaW9ucyAoJXMpXG4iLAotCQkJcGNpX25hbWUoaGEtPnBkZXYpKTsKKwkJcWxfbG9nX3BjaShxbF9sb2dfZmF0YWwsIGhhLT5wZGV2LCAweDAwMGMsCisJCSAgICAiRmFpbGVkIHRvIHJlc2VydmVyIHNlbGVjdGVkIHJlZ2lvbnMuXG4iKTsKIAkJZ290byBpb3NwYWNlX2Vycm9yX2V4aXQ7CiAJfQogCiAJLyogVXNlIE1NSU8gb3BlcmF0aW9ucyBmb3IgYWxsIGFjY2Vzc2VzLiAqLwogCWlmICghKHBjaV9yZXNvdXJjZV9mbGFncyhoYS0+cGRldiwgMCkgJiBJT1JFU09VUkNFX01FTSkpIHsKLQkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsCi0JCQkicmVnaW9uICMwIG5vdCBhbiBNTUlPIHJlc291cmNlICglcyksIGFib3J0aW5nXG4iLAotCQkJcGNpX25hbWUoaGEtPnBkZXYpKTsKKwkJcWxfbG9nX3BjaShxbF9sb2dfZmF0YWwsIGhhLT5wZGV2LCAweDAwMGQsCisJCSAgICAiUmVnaW9uICMwIG5vdCBhbiBNTUlPIHJlc291cmNlLCBhYm9ydGluZy5cbiIpOwogCQlnb3RvIGlvc3BhY2VfZXJyb3JfZXhpdDsKIAl9CiAKQEAgLTE2NTEsOSArMTY2Nyw4IEBACiAJaGEtPm54X3BjaWJhc2UgPQogCSAgICAodW5zaWduZWQgbG9uZylpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChoYS0+cGRldiwgMCksIGxlbik7CiAJaWYgKCFoYS0+bnhfcGNpYmFzZSkgewotCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwKLQkJICAgICJjYW5ub3QgcmVtYXAgcGNpYmFzZSBNTUlPICglcyksIGFib3J0aW5nXG4iLAotCQkgICAgcGNpX25hbWUoaGEtPnBkZXYpKTsKKwkJcWxfbG9nX3BjaShxbF9sb2dfZmF0YWwsIGhhLT5wZGV2LCAweDAwMGUsCisJCSAgICAiQ2Fubm90IHJlbWFwIHBjaWJhc2UgTU1JTywgYWJvcnRpbmcuXG4iKTsKIAkJcGNpX3JlbGVhc2VfcmVnaW9ucyhoYS0+cGRldik7CiAJCWdvdG8gaW9zcGFjZV9lcnJvcl9leGl0OwogCX0KQEAgLTE2NjcsOSArMTY4Miw4IEBACiAJCSAgICAodW5zaWduZWQgbG9uZylpb3JlbWFwKChwY2lfcmVzb3VyY2Vfc3RhcnQoaGEtPnBkZXYsIDQpICsKIAkJICAgIChoYS0+cGRldi0+ZGV2Zm4gPDwgMTIpKSwgNCk7CiAJCWlmICghaGEtPm54ZGJfd3JfcHRyKSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwKLQkJCSAgICAiY2Fubm90IHJlbWFwIE1NSU8gKCVzKSwgYWJvcnRpbmdcbiIsCi0JCQkgICAgcGNpX25hbWUoaGEtPnBkZXYpKTsKKwkJCXFsX2xvZ19wY2kocWxfbG9nX2ZhdGFsLCBoYS0+cGRldiwgMHgwMDBmLAorCQkJICAgICJDYW5ub3QgcmVtYXAgTU1JTywgYWJvcnRpbmcuXG4iKTsKIAkJCXBjaV9yZWxlYXNlX3JlZ2lvbnMoaGEtPnBkZXYpOwogCQkJZ290byBpb3NwYWNlX2Vycm9yX2V4aXQ7CiAJCX0KQEAgLTE2ODcsNiArMTcwMSwxNiBAQAogCiAJaGEtPm1heF9yZXFfcXVldWVzID0gaGEtPm1heF9yc3BfcXVldWVzID0gMTsKIAloYS0+bXNpeF9jb3VudCA9IGhhLT5tYXhfcnNwX3F1ZXVlcyArIDE7CisJcWxfZGJnX3BjaShxbF9kYmdfbXVsdGlxLCBoYS0+cGRldiwgMHhjMDA2LAorCSAgICAibnhfcGNpX2Jhc2U9JXAgaW9iYXNlPSVwICIKKwkgICAgIm1heF9yZXFfcXVldWVzPSVkIG1zaXhfY291bnQ9JWQuXG4iLAorCSAgICBoYS0+bnhfcGNpYmFzZSwgaGEtPmlvYmFzZSwKKwkgICAgaGEtPm1heF9yZXFfcXVldWVzLCBoYS0+bXNpeF9jb3VudCk7CisJcWxfZGJnX3BjaShxbF9kYmdfaW5pdCwgaGEtPnBkZXYsIDB4MDAxMCwKKwkgICAgIm54X3BjaV9iYXNlPSVwIGlvYmFzZT0lcCAiCisJICAgICJtYXhfcmVxX3F1ZXVlcz0lZCBtc2l4X2NvdW50PSVkLlxuIiwKKwkgICAgaGEtPm54X3BjaWJhc2UsIGhhLT5pb2Jhc2UsCisJICAgIGhhLT5tYXhfcmVxX3F1ZXVlcywgaGEtPm1zaXhfY291bnQpOwogCXJldHVybiAwOwogCiBpb3NwYWNlX2Vycm9yX2V4aXQ6CkBAIC0xNzEyLDYgKzE3MzYsOSBAQAogCXBjaV9zZXRfbWFzdGVyKGhhLT5wZGV2KTsKIAlyZXQgPSBwY2lfc2V0X213aShoYS0+cGRldik7CiAJaGEtPmNoaXBfcmV2aXNpb24gPSBoYS0+cGRldi0+cmV2aXNpb247CisJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDA0MywKKwkgICAgIkNoaXAgcmV2aXNpb246JWxkLlxuIiwKKwkgICAgaGEtPmNoaXBfcmV2aXNpb24pOwogCXJldHVybiAwOwogfQogCkBAIC0xODc3LDYgKzE5MDQsNyBAQAogewogCXUzMiB2YWwgPSAwOwogCWludCByZXRyaWVzID0gNjA7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCiAJZG8gewogCQlyZWFkX2xvY2soJmhhLT5od19sb2NrKTsKQEAgLTE4OTIsMTUgKzE5MjAsMTUgQEAKIAkJZGVmYXVsdDoKIAkJCWJyZWFrOwogCQl9Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSJDUkJfQ01EUEVHX1NUQVRFOiAweCV4IGFuZCByZXRyaWVzOiAweCV4XG4iLAotCQkJdmFsLCByZXRyaWVzKTsKKwkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4MDBhOCwKKwkJICAgICJDUkJfQ01EUEVHX1NUQVRFOiAweCV4IGFuZCByZXRyaWVzOjB4JXguXG4iLAorCQkgICAgdmFsLCByZXRyaWVzKTsKIAogCQltc2xlZXAoNTAwKTsKIAogCX0gd2hpbGUgKC0tcmV0cmllcyk7CiAKLQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwYTksCiAJICAgICJDbWQgUGVnIGluaXRpYWxpemF0aW9uIGZhaWxlZDogMHgleC5cbiIsIHZhbCk7CiAKIAl2YWwgPSBxbGE4Mnh4X3JkXzMyKGhhLCBRTEE4MlhYX1JPTVVTQl9HTEJfUEVHVFVORV9ET05FKTsKQEAgLTE5MTUsNiArMTk0Myw3IEBACiB7CiAJdTMyIHZhbCA9IDA7CiAJaW50IHJldHJpZXMgPSA2MDsKKwlzY3NpX3FsYV9ob3N0X3QgKnZoYSA9IHBjaV9nZXRfZHJ2ZGF0YShoYS0+cGRldik7CiAKIAlkbyB7CiAJCXJlYWRfbG9jaygmaGEtPmh3X2xvY2spOwpAQCAtMTkzMCwxNyArMTk1OSwxNiBAQAogCQlkZWZhdWx0OgogCQkJYnJlYWs7CiAJCX0KLQotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkiQ1JCX1JDVlBFR19TVEFURTogMHgleCBhbmQgcmV0cmllczogMHgleFxuIiwKLQkJCXZhbCwgcmV0cmllcyk7CisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwYWIsCisJCSAgICAiQ1JCX1JDVlBFR19TVEFURTogMHgleCBhbmQgcmV0cmllczogMHgleC5cbiIsCisJCSAgICB2YWwsIHJldHJpZXMpOwogCiAJCW1zbGVlcCg1MDApOwogCiAJfSB3aGlsZSAoLS1yZXRyaWVzKTsKIAotCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJIlJjdiBQZWcgaW5pdGlhbGl6YXRpb24gZmFpbGVkOiAweCV4LlxuIiwgdmFsKTsKKwlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDBhYywKKwkgICAgIlJjdiBQZWcgaW5pdGlhbGl6YXRpbiBmYWlsZWQ6IDB4JXguXG4iLCB2YWwpOwogCXJlYWRfbG9jaygmaGEtPmh3X2xvY2spOwogCXFsYTgyeHhfd3JfMzIoaGEsIENSQl9SQ1ZQRUdfU1RBVEUsIFBIQU5fSU5JVElBTElaRV9GQUlMRUQpOwogCXJlYWRfdW5sb2NrKCZoYS0+aHdfbG9jayk7CkBAIC0xOTg5LDEzICsyMDE3LDExIEBACiAJfQogCiAJaWYgKGhhLT5tY3ApIHsKLQkJREVCVUczXzExKHByaW50ayhLRVJOX0lORk8gIiVzKCVsZCk6ICIKLQkJCSJHb3QgbWFpbGJveCBjb21wbGV0aW9uLiBjbWQ9JXguXG4iLAotCQkJX19mdW5jX18sIHZoYS0+aG9zdF9ubywgaGEtPm1jcC0+bWJbMF0pKTsKKwkJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwNTIsCisJCSAgICAiR290IG1haWxib3ggY29tcGxldGlvbi4gY21kPSV4LlxuIiwgaGEtPm1jcC0+bWJbMF0pOwogCX0gZWxzZSB7Ci0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCSIlcyglbGQpOiBNQlggcG9pbnRlciBFUlJPUiFcbiIsCi0JCQlfX2Z1bmNfXywgdmhhLT5ob3N0X25vKTsKKwkJcWxfZGJnKHFsX2RiZ19hc3luYywgdmhhLCAweDUwNTMsCisJCSAgICAiTUJYIHBvaW50ZXIgRVJST1IuXG4iKTsKIAl9CiB9CiAKQEAgLTIwMTksMTMgKzIwNDUsMTMgQEAKIAlpbnQgc3RhdHVzID0gMCwgc3RhdHVzMSA9IDA7CiAJdW5zaWduZWQgbG9uZwlmbGFnczsKIAl1bnNpZ25lZCBsb25nCWl0ZXI7Ci0JdWludDMyX3QJc3RhdDsKKwl1aW50MzJfdAlzdGF0ID0gMDsKIAl1aW50MTZfdAltYls0XTsKIAogCXJzcCA9IChzdHJ1Y3QgcnNwX3F1ZSAqKSBkZXZfaWQ7CiAJaWYgKCFyc3ApIHsKIAkJcHJpbnRrKEtFUk5fSU5GTwotCQkJIiVzKCk6IE5VTEwgcmVzcG9uc2UgcXVldWUgcG9pbnRlclxuIiwgX19mdW5jX18pOworCQkJIiVzKCk6IE5VTEwgcmVzcG9uc2UgcXVldWUgcG9pbnRlci5cbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIElSUV9OT05FOwogCX0KIAloYSA9IHJzcC0+aHc7CkBAIC0yMDc1LDkgKzIxMDEsOSBAQAogCQkJCXFsYTI0eHhfcHJvY2Vzc19yZXNwb25zZV9xdWV1ZSh2aGEsIHJzcCk7CiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgotCQkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogIgotCQkJCQkiIFVucmVjb2duaXplZCBpbnRlcnJ1cHQgdHlwZSAoJWQpLlxuIiwKLQkJCQkJdmhhLT5ob3N0X25vLCBzdGF0ICYgMHhmZikpOworCQkJCXFsX2RiZyhxbF9kYmdfYXN5bmMsIHZoYSwgMHg1MDU0LAorCQkJCSAgICAiVW5yZWNvZ25pemVkIGludGVycnVwdCB0eXBlICglZCkuXG4iLAorCQkJCSAgICBzdGF0ICYgMHhmZik7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCX0KQEAgLTIwODksOCArMjExNSw4IEBACiAKICNpZmRlZiBRTF9ERUJVR19MRVZFTF8xNwogCWlmICghaXJxICYmIGhhLT5mbGFncy5lZWhfYnVzeSkKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgImlzcjogc3RhdHVzICV4LCBjbWRfZmxhZ3MgJWx4LCBtYm94X2ludCAleCwgc3RhdCAleFxuIiwKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NTAzZCwKKwkJICAgICJpc3I6c3RhdHVzICV4LCBjbWRfZmxhZ3MgJWx4LCBtYm94X2ludCAleCwgc3RhdCAleC5cbiIsCiAJCSAgICBzdGF0dXMsIGhhLT5tYnhfY21kX2ZsYWdzLCBoYS0+ZmxhZ3MubWJveF9pbnQsIHN0YXQpOwogI2VuZGlmCiAKQEAgLTIxMTEsMTMgKzIxMzcsMTMgQEAKIAlzdHJ1Y3QgZGV2aWNlX3JlZ184Mnh4IF9faW9tZW0gKnJlZzsKIAlpbnQgc3RhdHVzID0gMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVpbnQzMl90IHN0YXQ7CisJdWludDMyX3Qgc3RhdCA9IDA7CiAJdWludDE2X3QgbWJbNF07CiAKIAlyc3AgPSAoc3RydWN0IHJzcF9xdWUgKikgZGV2X2lkOwogCWlmICghcnNwKSB7CiAJCXByaW50ayhLRVJOX0lORk8KLQkJCSIlcygpOiBOVUxMIHJlc3BvbnNlIHF1ZXVlIHBvaW50ZXJcbiIsIF9fZnVuY19fKTsKKwkJCSIlcygpOiBOVUxMIHJlc3BvbnNlIHF1ZXVlIHBvaW50ZXIuXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybiBJUlFfTk9ORTsKIAl9CiAJaGEgPSByc3AtPmh3OwpAQCAtMjE0OSw5ICsyMTc1LDkgQEAKIAkJCQlxbGEyNHh4X3Byb2Nlc3NfcmVzcG9uc2VfcXVldWUodmhhLCByc3ApOwogCQkJCWJyZWFrOwogCQkJZGVmYXVsdDoKLQkJCQlERUJVRzIocHJpbnRrKCJzY3NpKCVsZCk6ICIKLQkJCQkJIiBVbnJlY29nbml6ZWQgaW50ZXJydXB0IHR5cGUgKCVkKS5cbiIsCi0JCQkJCXZoYS0+aG9zdF9ubywgc3RhdCAmIDB4ZmYpKTsKKwkJCQlxbF9kYmcocWxfZGJnX2FzeW5jLCB2aGEsIDB4NTA0MSwKKwkJCQkgICAgIlVucmVjb2duaXplZCBpbnRlcnJ1cHQgdHlwZSAoJWQpLlxuIiwKKwkJCQkgICAgc3RhdCAmIDB4ZmYpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC0yMTYyLDkgKzIxODgsOSBAQAogCiAjaWZkZWYgUUxfREVCVUdfTEVWRUxfMTcKIAlpZiAoIWlycSAmJiBoYS0+ZmxhZ3MuZWVoX2J1c3kpCi0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSJpc3I6IHN0YXR1cyAleCwgY21kX2ZsYWdzICVseCwgbWJveF9pbnQgJXgsIHN0YXQgJXhcbiIsCi0JCQlzdGF0dXMsIGhhLT5tYnhfY21kX2ZsYWdzLCBoYS0+ZmxhZ3MubWJveF9pbnQsIHN0YXQpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg1MDQ0LAorCQkgICAgImlzcjpzdGF0dXMgJXgsIGNtZF9mbGFncyAlbHgsIG1ib3hfaW50ICV4LCBzdGF0ICV4LlxuIiwKKwkJICAgIHN0YXR1cywgaGEtPm1ieF9jbWRfZmxhZ3MsIGhhLT5mbGFncy5tYm94X2ludCwgc3RhdCk7CiAjZW5kaWYKIAogCWlmICh0ZXN0X2JpdChNQlhfSU5UUl9XQUlULCAmaGEtPm1ieF9jbWRfZmxhZ3MpICYmCkBAIC0yMTg2LDcgKzIyMTIsNyBAQAogCXJzcCA9IChzdHJ1Y3QgcnNwX3F1ZSAqKSBkZXZfaWQ7CiAJaWYgKCFyc3ApIHsKIAkJcHJpbnRrKEtFUk5fSU5GTwotCQkJIiVzKCk6IE5VTEwgcmVzcG9uc2UgcXVldWUgcG9pbnRlclxuIiwgX19mdW5jX18pOworCQkJIiVzKCk6IE5VTEwgcmVzcG9uc2UgcXVldWUgcG9pbnRlci5cbiIsIF9fZnVuY19fKTsKIAkJcmV0dXJuIElSUV9OT05FOwogCX0KIApAQCAtMjIxNSw3ICsyMjQxLDcgQEAKIAlyc3AgPSAoc3RydWN0IHJzcF9xdWUgKikgZGV2X2lkOwogCWlmICghcnNwKSB7CiAJCXByaW50ayhLRVJOX0lORk8KLQkJCSIlcygpOiBOVUxMIHJlc3BvbnNlIHF1ZXVlIHBvaW50ZXJcbiIsIF9fZnVuY19fKTsKKwkJCSIlcygpOiBOVUxMIHJlc3BvbnNlIHF1ZXVlIHBvaW50ZXIuXG4iLCBfX2Z1bmNfXyk7CiAJCXJldHVybjsKIAl9CiAJaGEgPSByc3AtPmh3OwpAQCAtMjI0NSw5ICsyMjcxLDkgQEAKIAkJCXFsYTI0eHhfcHJvY2Vzc19yZXNwb25zZV9xdWV1ZSh2aGEsIHJzcCk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCURFQlVHMihwcmludGsoInNjc2koJWxkKTogVW5yZWNvZ25pemVkIGludGVycnVwdCB0eXBlICIKLQkJCQkiKCVkKS5cbiIsCi0JCQkJdmhhLT5ob3N0X25vLCBzdGF0ICYgMHhmZikpOworCQkJcWxfZGJnKHFsX2RiZ19wM3AsIHZoYSwgMHhiMDEzLAorCQkJICAgICJVbnJlY29nbml6ZWQgaW50ZXJydXB0IHR5cGUgKCVkKS5cbiIsCisJCQkgICAgc3RhdCAqIDB4ZmYpOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0yMzQ3LDkgKzIzNzMsOCBAQAogCQlkcnZfc3RhdGUgPSBxbGE4Mnh4X3JkXzMyKGhhLCBRTEE4MlhYX0NSQl9EUlZfU1RBVEUpOwogCX0KIAlkcnZfc3RhdGUgfD0gKFFMQTgyWFhfRFJWU1RfUlNUX1JEWSA8PCAoaGEtPnBvcnRudW0gKiA0KSk7Ci0JcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkiJXMoJWxkKTpkcnZfc3RhdGUgPSAweCV4XG4iLAotCQlfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBkcnZfc3RhdGUpOworCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwYmIsCisJICAgICJkcnZfc3RhdGUgPSAweCV4LlxuIiwgZHJ2X3N0YXRlKTsKIAlxbGE4Mnh4X3dyXzMyKGhhLCBRTEE4MlhYX0NSQl9EUlZfU1RBVEUsIGRydl9zdGF0ZSk7CiB9CiAKQEAgLTIzOTIsOCArMjQxNyw4IEBACiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAlpZiAocWxhODJ4eF9waW5pdF9mcm9tX3JvbSh2aGEpICE9IFFMQV9TVUNDRVNTKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLAotCQkJIiVzOiBFcnJvciBkdXJpbmcgQ1JCIEluaXRpYWxpemF0aW9uXG4iLCBfX2Z1bmNfXyk7CisJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMDlmLAorCQkgICAgIkVycm9yIGR1cmluZyBDUkIgaW5pdGlhbGl6YXRpb24uXG4iKTsKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfQogCXVkZWxheSg1MDApOwpAQCAtMjQxMSwyNyArMjQzNiwyNyBAQAogCWlmIChxbDJ4Zndsb2FkYmluID09IDIpCiAJCWdvdG8gdHJ5X2Jsb2JfZnc7CiAKLQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCSJBdHRlbXB0aW5nIHRvIGxvYWQgZmlybXdhcmUgZnJvbSBmbGFzaFxuIik7CisJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4MDBhMCwKKwkgICAgIkF0dGVtcHRpbmcgdG8gbG9hZCBmaXJtd2FyZSBmcm9tIGZsYXNoLlxuIik7CiAKIAlpZiAocWxhODJ4eF9md19sb2FkX2Zyb21fZmxhc2goaGEpID09IFFMQV9TVUNDRVNTKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLAotCQkgICAgIkZpcm13YXJlIGxvYWRlZCBzdWNjZXNzZnVsbHkgZnJvbSBmbGFzaFxuIik7CisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwYTEsCisJCSAgICAiRmlybXdhcmUgbG9hZGVkIHN1Y2Nlc3N1bGx5IGZyb20gZmxhc2guXG4iKTsKIAkJcmV0dXJuIFFMQV9TVUNDRVNTOwogCX0gZWxzZSB7Ci0JCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLAotCQkgICAgIkZpcm13YXJlIGxvYWQgZnJvbSBmbGFzaCBmYWlsZWRcbiIpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMTA4LAorCQkgICAgIkZpcm13YXJlIGxvYWQgZnJvbSBmbGFzaCBmYWlsZWQuXG4iKTsKIAl9CiAKIHRyeV9ibG9iX2Z3OgotCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkgICAgIkF0dGVtcHRpbmcgdG8gbG9hZCBmaXJtd2FyZSBmcm9tIGJsb2JcbiIpOworCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwYTIsCisJICAgICJBdHRlbXB0aW5nIHRvIGxvYWQgZmlybXdhcmUgZnJvbSBibG9iLlxuIik7CiAKIAkvKiBMb2FkIGZpcm13YXJlIGJsb2IuICovCiAJYmxvYiA9IGhhLT5oYWJsb2IgPSBxbGEyeDAwX3JlcXVlc3RfZmlybXdhcmUodmhhKTsKIAlpZiAoIWJsb2IpIHsKLQkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsCi0JCQkiRmlybXdhcmUgaW1hZ2Ugbm90IHByZXNlbnQuXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwYTMsCisJCSAgICAiRmlybXdhcmUgaW1hZ2Ugbm90IHByZXNldC5cbiIpOwogCQlnb3RvIGZ3X2xvYWRfZmFpbGVkOwogCX0KIApAQCAtMjQ0MSwyMCArMjQ2NiwxOSBAQAogCQkvKiBGYWxsYmFjayB0byBVUkkgZm9ybWF0ICovCiAJCWlmIChxbGE4Mnh4X3ZhbGlkYXRlX2Zpcm13YXJlX2Jsb2IodmhhLAogCQkJUUxBODJYWF9VTklGSUVEX1JPTUlNQUdFKSkgewotCQkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsCi0JCQkJIk5vIHZhbGlkIGZpcm13YXJlIGltYWdlIGZvdW5kISEhIik7CisJCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDBhNCwKKwkJCSAgICAiTm8gdmFsaWQgZmlybXdhcmUgaW1hZ2UgZm91bmQuXG4iKTsKIAkJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCQl9CiAJfQogCiAJaWYgKHFsYTgyeHhfZndfbG9hZF9mcm9tX2Jsb2IoaGEpID09IFFMQV9TVUNDRVNTKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLAotCQkJIiVzOiBGaXJtd2FyZSBsb2FkZWQgc3VjY2Vzc2Z1bGx5ICIKLQkJCSIgZnJvbSBiaW5hcnkgYmxvYlxuIiwgX19mdW5jX18pOworCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHgwMGE1LAorCQkgICAgIkZpcm13YXJlIGxvYWRlZCBzdWNjZXNzZnVsbHkgZnJvbSBiaW5hcnkgYmxvYi5cbiIpOwogCQlyZXR1cm4gUUxBX1NVQ0NFU1M7CiAJfSBlbHNlIHsKLQkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsCi0JCSAgICAiRmlybXdhcmUgbG9hZCBmYWlsZWQgZnJvbSBiaW5hcnkgYmxvYlxuIik7CisJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMGE2LAorCQkgICAgIkZpcm13YXJlIGxvYWQgZmFpbGVkIGZvciBiaW5hcnkgYmxvYi5cbiIpOwogCQlibG9iLT5mdyA9IE5VTEw7CiAJCWJsb2IgPSBOVUxMOwogCQlnb3RvIGZ3X2xvYWRfZmFpbGVkOwpAQCAtMjQ4NiwxNSArMjUxMCwxNSBAQAogCXFsYTgyeHhfd3JfMzIoaGEsIFFMQTgyWFhfUEVHX0hBTFRfU1RBVFVTMiwgMCk7CiAKIAlpZiAocWxhODJ4eF9sb2FkX2Z3KHZoYSkgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJIiVzOiBFcnJvciB0cnlpbmcgdG8gc3RhcnQgZnchXG4iLCBfX2Z1bmNfXyk7CisJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMGE3LAorCQkgICAgIkVycm9yIHRyeWluZyB0byBzdGFydCBmdy5cbiIpOwogCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAl9CiAKIAkvKiBIYW5kc2hha2Ugd2l0aCB0aGUgY2FyZCBiZWZvcmUgd2UgcmVnaXN0ZXIgdGhlIGRldmljZXMuICovCiAJaWYgKHFsYTgyeHhfY2hlY2tfY21kcGVnX3N0YXRlKGhhKSAhPSBRTEFfU1VDQ0VTUykgewotCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkiJXM6IEVycm9yIGR1cmluZyBjYXJkIGhhbmRzaGFrZSFcbiIsIF9fZnVuY19fKTsKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwYWEsCisJCSAgICAiRXJyb3IgZHVyaW5nIGNhcmQgaGFuZHNoYWtlLlxuIik7CiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0KIApAQCAtMjY2Myw4ICsyNjg3LDExIEBACiAJLyogU2VuZCBtYXJrZXIgaWYgcmVxdWlyZWQgKi8KIAlpZiAodmhhLT5tYXJrZXJfbmVlZGVkICE9IDApIHsKIAkJaWYgKHFsYTJ4MDBfbWFya2VyKHZoYSwgcmVxLAotCQkJcnNwLCAwLCAwLCBNS19TWU5DX0FMTCkgIT0gUUxBX1NVQ0NFU1MpCisJCQlyc3AsIDAsIDAsIE1LX1NZTkNfQUxMKSAhPSBRTEFfU1VDQ0VTUykgeworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MzAwYywKKwkJCSAgICAicWxhMngwMF9tYXJrZXIgZmFpbGVkIGZvciBjbWQ9JXAuXG4iLCBjbWQpOwogCQkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CisJCX0KIAkJdmhhLT5tYXJrZXJfbmVlZGVkID0gMDsKIAl9CiAKQEAgLTI3MDEsOCArMjcyOCwxMyBAQAogCQl1aW50MTZfdCBpOwogCiAJCW1vcmVfZHNkX2xpc3RzID0gcWxhODJ4eF9jYWxjX2RzZF9saXN0cyh0b3RfZHNkcyk7Ci0JCWlmICgobW9yZV9kc2RfbGlzdHMgKyBoYS0+Z2JsX2RzZF9pbnVzZSkgPj0gTlVNX0RTRF9DSEFJTikKKwkJaWYgKChtb3JlX2RzZF9saXN0cyArIGhhLT5nYmxfZHNkX2ludXNlKSA+PSBOVU1fRFNEX0NIQUlOKSB7CisJCQlxbF9kYmcocWxfZGJnX2lvLCB2aGEsIDB4MzAwZCwKKwkJCSAgICAiTnVtIG9mIERTRCBsaXN0ICVkIGlzIHRoYW4gJWQgZm9yIGNtZD0lcC5cbiIsCisJCQkgICAgbW9yZV9kc2RfbGlzdHMgKyBoYS0+Z2JsX2RzZF9pbnVzZSwgTlVNX0RTRF9DSEFJTiwKKwkJCSAgICBjbWQpOwogCQkJZ290byBxdWV1aW5nX2Vycm9yOworCQl9CiAKIAkJaWYgKG1vcmVfZHNkX2xpc3RzIDw9IGhhLT5nYmxfZHNkX2F2YWlsKQogCQkJZ290byBzdWZmaWNpZW50X2RzZHM7CkBAIC0yNzExLDEzICsyNzQzLDIwIEBACiAKIAkJZm9yIChpID0gMDsgaSA8IG1vcmVfZHNkX2xpc3RzOyBpKyspIHsKIAkJCWRzZF9wdHIgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZHNkX2RtYSksIEdGUF9BVE9NSUMpOwotCQkJaWYgKCFkc2RfcHRyKQorCQkJaWYgKCFkc2RfcHRyKSB7CisJCQkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDMwMGUsCisJCQkJICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBkc2RfZG1hICIKKwkJCQkgICAgImZvciBjbWQ9JXAuXG4iLCBjbWQpOwogCQkJCWdvdG8gcXVldWluZ19lcnJvcjsKKwkJCX0KIAogCQkJZHNkX3B0ci0+ZHNkX2FkZHIgPSBkbWFfcG9vbF9hbGxvYyhoYS0+ZGxfZG1hX3Bvb2wsCiAJCQkJR0ZQX0FUT01JQywgJmRzZF9wdHItPmRzZF9saXN0X2RtYSk7CiAJCQlpZiAoIWRzZF9wdHItPmRzZF9hZGRyKSB7CiAJCQkJa2ZyZWUoZHNkX3B0cik7CisJCQkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDMwMGYsCisJCQkJICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBkc2RfYWRkciAiCisJCQkJICAgICJmb3IgY21kPSVwLlxuIiwgY21kKTsKIAkJCQlnb3RvIHF1ZXVpbmdfZXJyb3I7CiAJCQl9CiAJCQlsaXN0X2FkZF90YWlsKCZkc2RfcHRyLT5saXN0LCAmaGEtPmdibF9kc2RfbGlzdCk7CkBAIC0yNzQyLDE3ICsyNzgxLDE2IEBACiAKIAkJY3R4ID0gc3AtPmN0eCA9IG1lbXBvb2xfYWxsb2MoaGEtPmN0eF9tZW1wb29sLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCFzcC0+Y3R4KSB7Ci0JCQlERUJVRyhwcmludGsoS0VSTl9JTkZPCi0JCQkJIiVzKCVsZCk6IGZhaWxlZCB0byBhbGxvY2F0ZSIKLQkJCQkiIGN0eC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgzMDEwLAorCQkJICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgY3R4IGZvciBjbWQ9JXAuXG4iLCBjbWQpOwogCQkJZ290byBxdWV1aW5nX2Vycm9yOwogCQl9CiAJCW1lbXNldChjdHgsIDAsIHNpemVvZihzdHJ1Y3QgY3Q2X2RzZCkpOwogCQljdHgtPmZjcF9jbW5kID0gZG1hX3Bvb2xfYWxsb2MoaGEtPmZjcF9jbW5kX2RtYV9wb29sLAogCQkJR0ZQX0FUT01JQywgJmN0eC0+ZmNwX2NtbmRfZG1hKTsKIAkJaWYgKCFjdHgtPmZjcF9jbW5kKSB7Ci0JCQlERUJVRzJfMyhwcmludGsoIiVzKCVsZCk6IGZhaWxlZCB0byBhbGxvY2F0ZSIKLQkJCQkiIGZjcF9jbW5kLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubykpOworCQkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDMwMTEsCisJCQkgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBmY3BfY21uZCBmb3IgY21kPSVwLlxuIiwgY21kKTsKIAkJCWdvdG8gcXVldWluZ19lcnJvcl9mY3BfY21uZDsKIAkJfQogCkBAIC0yNzY2LDYgKzI4MDQsOSBAQAogCQkJCS8qIFNDU0kgY29tbWFuZCBiaWdnZXIgdGhhbiAxNiBieXRlcyBtdXN0IGJlCiAJCQkJICogbXVsdGlwbGUgb2YgNAogCQkJCSAqLworCQkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDMwMTIsCisJCQkJICAgICJzY3NpIGNtZCBsZW4gJWQgbm90IG11bHRpcGxlIG9mIDQgIgorCQkJCSAgICAiZm9yIGNtZD0lcC5cbiIsIGNtZC0+Y21kX2xlbiwgY21kKTsKIAkJCQlnb3RvIHF1ZXVpbmdfZXJyb3JfZmNwX2NtbmQ7CiAJCQl9CiAJCQljdHgtPmZjcF9jbW5kX2xlbiA9IDEyICsgY21kLT5jbWRfbGVuICsgNDsKQEAgLTI4NDUsNyArMjg4Niw3IEBACiAJCWNtZF9wa3QtPmVudHJ5X3N0YXR1cyA9ICh1aW50OF90KSByc3AtPmlkOwogCX0gZWxzZSB7CiAJCXN0cnVjdCBjbWRfdHlwZV83ICpjbWRfcGt0OwotCQlyZXFfY250ID0gcWxhMjR4eF9jYWxjX2lvY2JzKHRvdF9kc2RzKTsKKwkJcmVxX2NudCA9IHFsYTI0eHhfY2FsY19pb2Nicyh2aGEsIHRvdF9kc2RzKTsKIAkJaWYgKHJlcS0+Y250IDwgKHJlcV9jbnQgKyAyKSkgewogCQkJY250ID0gKHVpbnQxNl90KVJEX1JFR19EV09SRF9SRUxBWEVEKAogCQkJICAgICZyZWctPnJlcV9xX291dFswXSk7CkBAIC0yOTc5LDggKzMwMjAsOCBAQAogCS8qIER3b3JkIHJlYWRzIHRvIGZsYXNoLiAqLwogCWZvciAoaSA9IDA7IGkgPCBsZW5ndGgvNDsgaSsrLCBmYWRkciArPSA0KSB7CiAJCWlmIChxbGE4Mnh4X3JvbV9mYXN0X3JlYWQoaGEsIGZhZGRyLCAmdmFsKSkgewotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJICAgICJEbyBST00gZmFzdCByZWFkIGZhaWxlZFxuIik7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMTA2LAorCQkJICAgICJEbyBST00gZmFzdCByZWFkIGZhaWxlZC5cbiIpOwogCQkJZ290byBkb25lX3JlYWQ7CiAJCX0KIAkJZHdwdHJbaV0gPSBfX2NvbnN0YW50X2NwdV90b19sZTMyKHZhbCk7CkBAIC0yOTk0LDEwICszMDM1LDEyIEBACiB7CiAJaW50IHJldDsKIAl1aW50MzJfdCB2YWw7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCiAJcmV0ID0gcWw4Mnh4X3JvbV9sb2NrX2QoaGEpOwogCWlmIChyZXQgPCAwKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIlJPTSBMb2NrIGZhaWxlZFxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGIwMTQsCisJCSAgICAiUk9NIExvY2sgZmFpbGVkLlxuIik7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC0zMDEzLDcgKzMwNTYsOCBAQAogCX0KIAogCWlmIChxbGE4Mnh4X3dyaXRlX2Rpc2FibGVfZmxhc2goaGEpICE9IDApCi0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIldyaXRlIGRpc2FibGUgZmFpbGVkXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4YjAxNSwKKwkJICAgICJXcml0ZSBkaXNhYmxlIGZhaWxlZC5cbiIpOwogCiBkb25lX3VucHJvdGVjdDoKIAlxbGE4Mnh4X3JvbV91bmxvY2soaGEpOwpAQCAtMzAyNSwxMCArMzA2OSwxMiBAQAogewogCWludCByZXQ7CiAJdWludDMyX3QgdmFsOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAogCXJldCA9IHFsODJ4eF9yb21fbG9ja19kKGhhKTsKIAlpZiAocmV0IDwgMCkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJST00gTG9jayBmYWlsZWRcbiIpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhiMDE2LAorCQkgICAgIlJPTSBMb2NrIGZhaWxlZC5cbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMzA0MCwxMCArMzA4NiwxMiBAQAogCS8qIExPQ0sgYWxsIHNlY3RvcnMgKi8KIAlyZXQgPSBxbGE4Mnh4X3dyaXRlX3N0YXR1c19yZWcoaGEsIHZhbCk7CiAJaWYgKHJldCA8IDApCi0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIldyaXRlIHN0YXR1cyByZWdpc3RlciBmYWlsZWRcbiIpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhiMDE3LAorCQkgICAgIldyaXRlIHN0YXR1cyByZWdpc3RlciBmYWlsZWQuXG4iKTsKIAogCWlmIChxbGE4Mnh4X3dyaXRlX2Rpc2FibGVfZmxhc2goaGEpICE9IDApCi0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgIldyaXRlIGRpc2FibGUgZmFpbGVkXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4YjAxOCwKKwkJICAgICJXcml0ZSBkaXNhYmxlIGZhaWxlZC5cbiIpOwogZG9uZV9wcm90ZWN0OgogCXFsYTgyeHhfcm9tX3VubG9jayhoYSk7CiAJcmV0dXJuIHJldDsKQEAgLTMwNTMsMTAgKzMxMDEsMTIgQEAKIHFsYTgyeHhfZXJhc2Vfc2VjdG9yKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIGludCBhZGRyKQogewogCWludCByZXQgPSAwOworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAogCXJldCA9IHFsODJ4eF9yb21fbG9ja19kKGhhKTsKIAlpZiAocmV0IDwgMCkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJST00gTG9jayBmYWlsZWRcbiIpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhiMDE5LAorCQkgICAgIlJPTSBMb2NrIGZhaWxlZC5cbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMzA2Niw4ICszMTE2LDggQEAKIAlxbGE4Mnh4X3dyXzMyKGhhLCBRTEE4MlhYX1JPTVVTQl9ST01fSU5TVFJfT1BDT0RFLCBNMjVQX0lOU1RSX1NFKTsKIAogCWlmIChxbGE4Mnh4X3dhaXRfcm9tX2RvbmUoaGEpKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJFcnJvciB3YWl0aW5nIGZvciByb20gZG9uZVxuIik7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGIwMWEsCisJCSAgICAiRXJyb3Igd2FpdGluZyBmb3Igcm9tIGRvbmUuXG4iKTsKIAkJcmV0ID0gLTE7CiAJCWdvdG8gZG9uZTsKIAl9CkBAIC0zMTEwLDEwICszMTYwLDEwIEBACiAJCW9wdHJvbSA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgT1BUUk9NX0JVUlNUX1NJWkUsCiAJCSAgICAmb3B0cm9tX2RtYSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghb3B0cm9tKSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fREVCVUcsIGhhLAotCQkJCSJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBvcHRyb20gIgotCQkJCSJidXJzdCB3cml0ZSAoJXggS0IpLlxuIiwKLQkJCQlPUFRST01fQlVSU1RfU0laRSAvIDEwMjQpOworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4YjAxYiwKKwkJCSAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSAiCisJCQkgICAgImZvciBvcHRyb24gYnVyc3Qgd3JpdGUgKCV4IEtCKS5cbiIsCisJCQkgICAgT1BUUk9NX0JVUlNUX1NJWkUgLyAxMDI0KTsKIAkJfQogCX0KIApAQCAtMzEyMiw4ICszMTcyLDggQEAKIAogCXJldCA9IHFsYTgyeHhfdW5wcm90ZWN0X2ZsYXNoKGhhKTsKIAlpZiAocmV0KSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSJVbmFibGUgdG8gdW5wcm90ZWN0IGZsYXNoIGZvciB1cGRhdGUuXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4YjAxYywKKwkJICAgICJVbmFibGUgdG8gdW5wcm90ZWN0IGZsYXNoIGZvciB1cGRhdGUuXG4iKTsKIAkJZ290byB3cml0ZV9kb25lOwogCX0KIApAQCAtMzEzMyw5ICszMTgzLDkgQEAKIAogCQkJcmV0ID0gcWxhODJ4eF9lcmFzZV9zZWN0b3IoaGEsIGZhZGRyKTsKIAkJCWlmIChyZXQpIHsKLQkJCQlERUJVRzkocWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsCi0JCQkJICAgICJVbmFibGUgdG8gZXJhc2Ugc2VjdG9yOiAiCi0JCQkJICAgICJhZGRyZXNzPSV4LlxuIiwgZmFkZHIpKTsKKwkJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhiMDFkLAorCQkJCSAgICAiVW5hYmxlIHRvIGVyYXNlIHNlY3RvcjogYWRkcmVzcz0leC5cbiIsCisJCQkJICAgIGZhZGRyKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtMzE0OSwxMiArMzE5OSwxMiBAQAogCQkJICAgIChoYS0+Zmxhc2hfZGF0YV9vZmYgfCBmYWRkciksCiAJCQkgICAgT1BUUk9NX0JVUlNUX0RXT1JEUyk7CiAJCQlpZiAocmV0ICE9IFFMQV9TVUNDRVNTKSB7Ci0JCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGIwMWUsCiAJCQkJICAgICJVbmFibGUgdG8gYnVyc3Qtd3JpdGUgb3B0cm9tIHNlZ21lbnQgIgogCQkJCSAgICAiKCV4LyV4LyVsbHgpLlxuIiwgcmV0LAogCQkJCSAgICAoaGEtPmZsYXNoX2RhdGFfb2ZmIHwgZmFkZHIpLAogCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKW9wdHJvbV9kbWEpOwotCQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhiMDFmLAogCQkJCSAgICAiUmV2ZXJ0aW5nIHRvIHNsb3ctd3JpdGUuXG4iKTsKIAogCQkJCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LApAQCAtMzE3MSwxNiArMzIyMSwxNiBAQAogCQlyZXQgPSBxbGE4Mnh4X3dyaXRlX2ZsYXNoX2R3b3JkKGhhLCBmYWRkciwKIAkJICAgIGNwdV90b19sZTMyKCpkd3B0cikpOwogCQlpZiAocmV0KSB7Ci0JCQlERUJVRzkocHJpbnRrKEtFUk5fREVCVUcgIiVzKCVsZCkgVW5hYmxlIHRvIHByb2dyYW0iCi0JCQkgICAgImZsYXNoIGFkZHJlc3M9JXggZGF0YT0leC5cbiIsIF9fZnVuY19fLAotCQkJICAgIGhhLT5ob3N0X25vLCBmYWRkciwgKmR3cHRyKSk7CisJCQlxbF9kYmcocWxfZGJnX3AzcCwgdmhhLCAweGIwMjAsCisJCQkgICAgIlVuYWJsZSB0byBwcm9ncmFtIGZsYXNoIGFkZHJlc3M9JXggZGF0YT0leC5cbiIsCisJCQkgICAgZmFkZHIsICpkd3B0cik7CiAJCQlicmVhazsKIAkJfQogCX0KIAogCXJldCA9IHFsYTgyeHhfcHJvdGVjdF9mbGFzaChoYSk7CiAJaWYgKHJldCkKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHhiMDIxLAogCQkgICAgIlVuYWJsZSB0byBwcm90ZWN0IGZsYXNoIGFmdGVyIHVwZGF0ZS5cbiIpOwogd3JpdGVfZG9uZToKIAlpZiAob3B0cm9tKQpAQCAtMzI0NCw5ICszMjk0LDEyIEBACiAKIHZvaWQgcWxhODJ4eF9yb21fbG9ja19yZWNvdmVyeShzdHJ1Y3QgcWxhX2h3X2RhdGEgKmhhKQogeworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKKwogCWlmIChxbGE4Mnh4X3JvbV9sb2NrKGhhKSkKIAkJLyogU29tZW9uZSBlbHNlIGlzIGhvbGRpbmcgdGhlIGxvY2suICovCi0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlJlc2V0dGluZyByb21fbG9ja1xuIik7CisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweGIwMjIsCisJCSAgICAiUmVzZXR0aW5nIHJvbV9sb2NrLlxuIik7CiAKIAkvKgogCSAqIEVpdGhlciB3ZSBnb3QgdGhlIGxvY2ssIG9yIHNvbWVvbmUKQEAgLTMzMTMsNyArMzM2Niw4IEBACiAKIGRldl9pbml0aWFsaXplOgogCS8qIHNldCB0byBERVZfSU5JVElBTElaSU5HICovCi0JcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiSFcgU3RhdGU6IElOSVRJQUxJWklOR1xuIik7CisJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4MDA5ZSwKKwkgICAgIkhXIFN0YXRlOiBJTklUSUFMSVpJTkcuXG4iKTsKIAlxbGE4Mnh4X3dyXzMyKGhhLCBRTEE4MlhYX0NSQl9ERVZfU1RBVEUsIFFMQTgyWFhfREVWX0lOSVRJQUxJWklORyk7CiAKIAkvKiBEcml2ZXIgdGhhdCBzZXRzIGRldmljZSBzdGF0ZSB0byBpbml0aWFsaXphdGluZyBzZXRzIElEQyB2ZXJzaW9uICovCkBAIC0zMzI0LDE0ICszMzc4LDE2IEBACiAJcWxhODJ4eF9pZGNfbG9jayhoYSk7CiAKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJIVyBTdGF0ZTogRkFJTEVEXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwYWQsCisJCSAgICAiSFcgU3RhdGU6IEZBSUxFRC5cbiIpOwogCQlxbGE4Mnh4X2NsZWFyX2Rydl9hY3RpdmUoaGEpOwogCQlxbGE4Mnh4X3dyXzMyKGhhLCBRTEE4MlhYX0NSQl9ERVZfU1RBVEUsIFFMQTgyWFhfREVWX0ZBSUxFRCk7CiAJCXJldHVybiBydmFsOwogCX0KIAogZGV2X3JlYWR5OgotCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkhXIFN0YXRlOiBSRUFEWVxuIik7CisJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4MDBhZSwKKwkgICAgIkhXIFN0YXRlOiBSRUFEWS5cbiIpOwogCXFsYTgyeHhfd3JfMzIoaGEsIFFMQTgyWFhfQ1JCX0RFVl9TVEFURSwgUUxBODJYWF9ERVZfUkVBRFkpOwogCiAJcmV0dXJuIFFMQV9TVUNDRVNTOwpAQCAtMzM3NiwxNSArMzQzMiwxNSBAQAogCQkJLyogcXVpZXNjZW5jZSB0aW1lb3V0LCBvdGhlciBmdW5jdGlvbnMgZGlkbid0IGFjawogCQkJICogY2hhbmdpbmcgdGhlIHN0YXRlIHRvIERFVl9SRUFEWQogCQkJICovCi0JCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkgICAgIiVzOiBRVUlFU0NFTlQgVElNRU9VVFxuIiwgUUxBMlhYWF9EUklWRVJfTkFNRSk7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkgICAgIkRSVl9BQ1RJVkU6JWQgRFJWX1NUQVRFOiVkXG4iLCBkcnZfYWN0aXZlLAotCQkJICAgIGRydl9zdGF0ZSk7CisJCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHhiMDIzLAorCQkJICAgICIlcyA6IFFVSUVTQ0VOVCBUSU1FT1VULlxuIiwgUUxBMlhYWF9EUklWRVJfTkFNRSk7CisJCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHhiMDI0LAorCQkJICAgICJEUlZfQUNUSVZFOiVkIERSVl9TVEFURTolZC5cbiIsCisJCQkgICAgZHJ2X2FjdGl2ZSwgZHJ2X3N0YXRlKTsKIAkJCXFsYTgyeHhfd3JfMzIoaGEsIFFMQTgyWFhfQ1JCX0RFVl9TVEFURSwKLQkJCQkJCVFMQTgyWFhfREVWX1JFQURZKTsKLQkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCSAgICAiSFcgU3RhdGU6IERFVl9SRUFEWVxuIik7CisJCQkgICAgUUxBODJYWF9ERVZfUkVBRFkpOworCQkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4YjAyNSwKKwkJCSAgICAiSFcgU3RhdGU6IERFVl9SRUFEWS5cbiIpOwogCQkJcWxhODJ4eF9pZGNfdW5sb2NrKGhhKTsKIAkJCXFsYTJ4MDBfcGVyZm9ybV9sb29wX3Jlc3luYyh2aGEpOwogCQkJcWxhODJ4eF9pZGNfbG9jayhoYSk7CkBAIC0zNDA0LDcgKzM0NjAsOCBAQAogCWRldl9zdGF0ZSA9IHFsYTgyeHhfcmRfMzIoaGEsIFFMQTgyWFhfQ1JCX0RFVl9TVEFURSk7CiAJLyogZXZlcnlvbmUgYWNrZWQgc28gc2V0IHRoZSBzdGF0ZSB0byBERVZfUVVJRVNDRU5DRSAqLwogCWlmIChkZXZfc3RhdGUgPT0gUUxBODJYWF9ERVZfTkVFRF9RVUlFU0NFTlQpIHsKLQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiSFcgU3RhdGU6IERFVl9RVUlFU0NFTlRcbiIpOworCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHhiMDI2LAorCQkgICAgIkhXIFN0YXRlOiBERVZfUVVJRVNDRU5ULlxuIik7CiAJCXFsYTgyeHhfd3JfMzIoaGEsIFFMQTgyWFhfQ1JCX0RFVl9TVEFURSwgUUxBODJYWF9ERVZfUVVJRVNDRU5UKTsKIAl9CiB9CkBAIC0zNDQxLDcgKzM0OTgsOCBAQAogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCiAJLyogRGlzYWJsZSB0aGUgYm9hcmQgKi8KLQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJEaXNhYmxpbmcgdGhlIGJvYXJkXG4iKTsKKwlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDBiOCwKKwkgICAgIkRpc2FibGluZyB0aGUgYm9hcmQuXG4iKTsKIAogCXFsYTgyeHhfaWRjX2xvY2soaGEpOwogCXFsYTgyeHhfY2xlYXJfZHJ2X2FjdGl2ZShoYSk7CkBAIC0zNDkyLDggKzM1NTAsOCBAQAogCiAJd2hpbGUgKGRydl9zdGF0ZSAhPSBkcnZfYWN0aXZlKSB7CiAJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIHJlc2V0X3RpbWVvdXQpKSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkJIiVzOiBSRVNFVCBUSU1FT1VUIVxuIiwgUUxBMlhYWF9EUklWRVJfTkFNRSk7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMGI1LAorCQkJICAgICJSZXNldCB0aW1lb3V0LlxuIik7CiAJCQlicmVhazsKIAkJfQogCQlxbGE4Mnh4X2lkY191bmxvY2soaGEpOwpAQCAtMzUwNCwxMiArMzU2MiwxNSBAQAogCX0KIAogCWRldl9zdGF0ZSA9IHFsYTgyeHhfcmRfMzIoaGEsIFFMQTgyWFhfQ1JCX0RFVl9TVEFURSk7Ci0JcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiMzpEZXZpY2Ugc3RhdGUgaXMgMHgleCA9ICVzXG4iLCBkZXZfc3RhdGUsCi0JCWRldl9zdGF0ZSA8IE1BWF9TVEFURVMgPyBxZGV2X3N0YXRlW2Rldl9zdGF0ZV0gOiAiVW5rbm93biIpOworCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDAwYjYsCisJICAgICJEZXZpY2Ugc3RhdGUgaXMgMHgleCA9ICVzLlxuIiwKKwkgICAgZGV2X3N0YXRlLAorCSAgICBkZXZfc3RhdGUgPCBNQVhfU1RBVEVTID8gcWRldl9zdGF0ZVtkZXZfc3RhdGVdIDogIlVua25vd24iKTsKIAogCS8qIEZvcmNlIHRvIERFVl9DT0xEIHVubGVzcyBzb21lb25lIGVsc2UgaXMgc3RhcnRpbmcgYSByZXNldCAqLwogCWlmIChkZXZfc3RhdGUgIT0gUUxBODJYWF9ERVZfSU5JVElBTElaSU5HKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkhXIFN0YXRlOiBDT0xEL1JFLUlOSVRcbiIpOworCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHgwMGI3LAorCQkgICAgIkhXIFN0YXRlOiBDT0xEL1JFLUlOSVQuXG4iKTsKIAkJcWxhODJ4eF93cl8zMihoYSwgUUxBODJYWF9DUkJfREVWX1NUQVRFLCBRTEE4MlhYX0RFVl9DT0xEKTsKIAl9CiB9CkBAIC0zNTIzLDggKzM1ODQsMTIgQEAKIAlmd19oZWFydGJlYXRfY291bnRlciA9IHFsYTgyeHhfcmRfMzIodmhhLT5odywKIAkJUUxBODJYWF9QRUdfQUxJVkVfQ09VTlRFUik7CiAJLyogYWxsIDB4ZmYsIGFzc3VtZSBBRVIvRUVIIGluIHByb2dyZXNzLCBpZ25vcmUgKi8KLQlpZiAoZndfaGVhcnRiZWF0X2NvdW50ZXIgPT0gMHhmZmZmZmZmZikKKwlpZiAoZndfaGVhcnRiZWF0X2NvdW50ZXIgPT0gMHhmZmZmZmZmZikgeworCQlxbF9kYmcocWxfZGJnX3RpbWVyLCB2aGEsIDB4NjAwMywKKwkJICAgICJGVyBoZWFydGJlYXQgY291bnRlciBpcyAweGZmZmZmZmZmLCAiCisJCSAgICAicmV0dXJuaW5nIHN0YXR1cz0lZC5cbiIsIHN0YXR1cyk7CiAJCXJldHVybiBzdGF0dXM7CisJfQogCWlmICh2aGEtPmZ3X2hlYXJ0YmVhdF9jb3VudGVyID09IGZ3X2hlYXJ0YmVhdF9jb3VudGVyKSB7CiAJCXZoYS0+c2Vjb25kc19zaW5jZV9sYXN0X2hlYXJ0YmVhdCsrOwogCQkvKiBGVyBub3QgYWxpdmUgYWZ0ZXIgMiBzZWNvbmRzICovCkBAIC0zNTM1LDYgKzM2MDAsOSBAQAogCX0gZWxzZQogCQl2aGEtPnNlY29uZHNfc2luY2VfbGFzdF9oZWFydGJlYXQgPSAwOwogCXZoYS0+ZndfaGVhcnRiZWF0X2NvdW50ZXIgPSBmd19oZWFydGJlYXRfY291bnRlcjsKKwlpZiAoc3RhdHVzKQorCQlxbF9kYmcocWxfZGJnX3RpbWVyLCB2aGEsIDB4NjAwNCwKKwkJICAgICJSZXR1cm5pbmcgc3RhdHVzPSVkLlxuIiwgc3RhdHVzKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCkBAIC0zNTY1LDggKzM2MzMsMTAgQEAKIAogCWRldl9zdGF0ZSA9IHFsYTgyeHhfcmRfMzIoaGEsIFFMQTgyWFhfQ1JCX0RFVl9TVEFURSk7CiAJb2xkX2Rldl9zdGF0ZSA9IGRldl9zdGF0ZTsKLQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIxOkRldmljZSBzdGF0ZSBpcyAweCV4ID0gJXNcbiIsIGRldl9zdGF0ZSwKLQkJZGV2X3N0YXRlIDwgTUFYX1NUQVRFUyA/IHFkZXZfc3RhdGVbZGV2X3N0YXRlXSA6ICJVbmtub3duIik7CisJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4MDA5YiwKKwkgICAgIkRldmljZSBzdGF0ZSBpcyAweCV4ID0gJXMuXG4iLAorCSAgICBkZXZfc3RhdGUsCisJICAgIGRldl9zdGF0ZSA8IE1BWF9TVEFURVMgPyBxZGV2X3N0YXRlW2Rldl9zdGF0ZV0gOiAiVW5rbm93biIpOwogCiAJLyogd2FpdCBmb3IgMzAgc2Vjb25kcyBmb3IgZGV2aWNlIHRvIGdvIHJlYWR5ICovCiAJZGV2X2luaXRfdGltZW91dCA9IGppZmZpZXMgKyAoaGEtPm54X2Rldl9pbml0X3RpbWVvdXQgKiBIWik7CkBAIC0zNTc0LDkgKzM2NDQsOCBAQAogCXdoaWxlICgxKSB7CiAKIAkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgZGV2X2luaXRfdGltZW91dCkpIHsKLQkJCURFQlVHKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCQkiJXM6IGRldmljZSBpbml0IGZhaWxlZCFcbiIsCi0JCQkJUUxBMlhYWF9EUklWRVJfTkFNRSkpOworCQkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwOWMsCisJCQkgICAgIkRldmljZSBpbml0IGZhaWxlZC5cbiIpOwogCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJCQlicmVhazsKIAkJfQpAQCAtMzU4NiwxMCArMzY1NSwxMSBAQAogCQkJb2xkX2Rldl9zdGF0ZSA9IGRldl9zdGF0ZTsKIAkJfQogCQlpZiAobG9vcGNvdW50IDwgNSkgewotCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJICAgICIyOkRldmljZSBzdGF0ZSBpcyAweCV4ID0gJXNcbiIsIGRldl9zdGF0ZSwKLQkJCSAgICBkZXZfc3RhdGUgPCBNQVhfU1RBVEVTID8KLQkJCSAgICBxZGV2X3N0YXRlW2Rldl9zdGF0ZV0gOiAiVW5rbm93biIpOworCQkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4MDA5ZCwKKwkJCSAgICAiRGV2aWNlIHN0YXRlIGlzIDB4JXggPSAlcy5cbiIsCisJCQkgICAgZGV2X3N0YXRlLAorCQkJICAgIGRldl9zdGF0ZSA8IE1BWF9TVEFURVMgPyBxZGV2X3N0YXRlW2Rldl9zdGF0ZV0gOgorCQkJICAgICJVbmtub3duIik7CiAJCX0KIAogCQlzd2l0Y2ggKGRldl9zdGF0ZSkgewpAQCAtMzY1NiwyOSArMzcyNiwyNiBAQAogCQlkZXZfc3RhdGUgPSBxbGE4Mnh4X3JkXzMyKGhhLCBRTEE4MlhYX0NSQl9ERVZfU1RBVEUpOwogCQlpZiAoZGV2X3N0YXRlID09IFFMQTgyWFhfREVWX05FRURfUkVTRVQgJiYKIAkJICAgICF0ZXN0X2JpdChJU1BfQUJPUlRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpKSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkgICAgInNjc2koJWxkKSAlczogQWRhcHRlciByZXNldCBuZWVkZWQhXG4iLAotCQkJCXZoYS0+aG9zdF9ubywgX19mdW5jX18pOworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NjAwMSwKKwkJCSAgICAiQWRhcHRlciByZXNldCBuZWVkZWQuXG4iKTsKIAkJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAkJCXFsYTJ4eHhfd2FrZV9kcGModmhhKTsKIAkJfSBlbHNlIGlmIChkZXZfc3RhdGUgPT0gUUxBODJYWF9ERVZfTkVFRF9RVUlFU0NFTlQgJiYKIAkJCSF0ZXN0X2JpdChJU1BfUVVJRVNDRV9ORUVERUQsICZ2aGEtPmRwY19mbGFncykpIHsKLQkJCURFQlVHKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCQkic2NzaSglbGQpICVzIC0gZGV0ZWN0ZWQgcXVpZXNjZW5jZSBuZWVkZWRcbiIsCi0JCQkJdmhhLT5ob3N0X25vLCBfX2Z1bmNfXykpOworCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NjAwMiwKKwkJCSAgICAiUXVpZXNjZW50IG5lZWRlZC5cbiIpOwogCQkJc2V0X2JpdChJU1BfUVVJRVNDRV9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CiAJCQlxbGEyeHh4X3dha2VfZHBjKHZoYSk7CiAJCX0gZWxzZSB7CiAJCQlpZiAocWxhODJ4eF9jaGVja19md19hbGl2ZSh2aGEpKSB7CiAJCQkJaGFsdF9zdGF0dXMgPSBxbGE4Mnh4X3JkXzMyKGhhLAogCQkJCSAgICBRTEE4MlhYX1BFR19IQUxUX1NUQVRVUzEpOwotCQkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCQkgICAgInNjc2koJWxkKTogJXMsIER1bXBpbmcgaHcvZncgcmVnaXN0ZXJzOlxuICIKLQkJCQkgICAgIiBQRUdfSEFMVF9TVEFUVVMxOiAweCV4LCBQRUdfSEFMVF9TVEFUVVMyOiAweCV4LFxuICIKLQkJCQkgICAgIiBQRUdfTkVUXzBfUEM6IDB4JXgsIFBFR19ORVRfMV9QQzogMHgleCxcbiAiCi0JCQkJICAgICIgUEVHX05FVF8yX1BDOiAweCV4LCBQRUdfTkVUXzNfUEM6IDB4JXgsXG4gIgotCQkJCSAgICAiIFBFR19ORVRfNF9QQzogMHgleFxuIiwKLQkJCQkgICAgdmhhLT5ob3N0X25vLCBfX2Z1bmNfXywgaGFsdF9zdGF0dXMsCisJCQkJcWxfZGJnKHFsX2RiZ190aW1lciwgdmhhLCAweDYwMDUsCisJCQkJICAgICJkdW1waW5nIGh3L2Z3IHJlZ2lzdGVyczouXG4gIgorCQkJCSAgICAiIFBFR19IQUxUX1NUQVRVUzE6IDB4JXgsIFBFR19IQUxUX1NUQVRVUzI6IDB4JXgsLlxuICIKKwkJCQkgICAgIiBQRUdfTkVUXzBfUEM6IDB4JXgsIFBFR19ORVRfMV9QQzogMHgleCwuXG4gIgorCQkJCSAgICAiIFBFR19ORVRfMl9QQzogMHgleCwgUEVHX05FVF8zX1BDOiAweCV4LC5cbiAiCisJCQkJICAgICIgUEVHX05FVF80X1BDOiAweCV4LlxuIiwgaGFsdF9zdGF0dXMsCiAJCQkJICAgIHFsYTgyeHhfcmRfMzIoaGEsIFFMQTgyWFhfUEVHX0hBTFRfU1RBVFVTMiksCiAJCQkJICAgIHFsYTgyeHhfcmRfMzIoaGEsCiAJCQkJCSAgICBRTEE4MlhYX0NSQl9QRUdfTkVUXzAgKyAweDNjKSwKQEAgLTM2OTQsOSArMzc2MSw4IEBACiAJCQkJCXNldF9iaXQoSVNQX1VOUkVDT1ZFUkFCTEUsCiAJCQkJCSAgICAmdmhhLT5kcGNfZmxhZ3MpOwogCQkJCX0gZWxzZSB7Ci0JCQkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCQkJICAgICJzY3NpKCVsZCk6ICVzIC0gZGV0ZWN0IGFib3J0IG5lZWRlZFxuIiwKLQkJCQkJICAgIHZoYS0+aG9zdF9ubywgX19mdW5jX18pOworCQkJCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg2MDA2LAorCQkJCQkgICAgIkRldGVjdCBhYm9ydCAgbmVlZGVkLlxuIik7CiAJCQkJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwKIAkJCQkJICAgICZ2aGEtPmRwY19mbGFncyk7CiAJCQkJfQpAQCAtMzcwNCwxMCArMzc3MCwxMCBAQAogCQkJCWhhLT5mbGFncy5pc3A4Mnh4X2Z3X2h1bmcgPSAxOwogCQkJCWlmIChoYS0+ZmxhZ3MubWJveF9idXN5KSB7CiAJCQkJCWhhLT5mbGFncy5tYm94X2ludCA9IDE7Ci0JCQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fRVJSLCBoYSwKLQkJCQkJICAgICJzY3NpKCVsZCkgRHVlIHRvIGZ3IGh1bmcsIGRvaW5nICIKKwkJCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NjAwNywKKwkJCQkJICAgICJEdWUgdG8gRlcgaHVuZywgZG9pbmcgIgogCQkJCQkgICAgInByZW1hdHVyZSBjb21wbGV0aW9uIG9mIG1ieCAiCi0JCQkJCSAgICAiY29tbWFuZFxuIiwgdmhhLT5ob3N0X25vKSk7CisJCQkJCSAgICAiY29tbWFuZC5cbiIpOwogCQkJCQlpZiAodGVzdF9iaXQoTUJYX0lOVFJfV0FJVCwKIAkJCQkJICAgICZoYS0+bWJ4X2NtZF9mbGFncykpCiAJCQkJCQljb21wbGV0ZSgmaGEtPm1ieF9pbnRyX2NvbXApOwpAQCAtMzc0Miw5ICszODA4LDggQEAKIAl1aW50MzJfdCBkZXZfc3RhdGU7CiAKIAlpZiAodmhhLT5kZXZpY2VfZmxhZ3MgJiBERkxHX0RFVl9GQUlMRUQpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJIiVzKCVsZCk6IERldmljZSBpbiBmYWlsZWQgc3RhdGUsICIKLQkJCSJFeGl0aW5nLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubyk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDgwMjQsCisJCSAgICAiRGV2aWNlIGluIGZhaWxlZCBzdGF0ZSwgZXhpdGluZy5cbiIpOwogCQlyZXR1cm4gUUxBX1NVQ0NFU1M7CiAJfQogCWhhLT5mbGFncy5pc3A4Mnh4X3Jlc2V0X2hkbHJfYWN0aXZlID0gMTsKQEAgLTM3NTIsMTMgKzM4MTcsMTQgQEAKIAlxbGE4Mnh4X2lkY19sb2NrKGhhKTsKIAlkZXZfc3RhdGUgPSBxbGE4Mnh4X3JkXzMyKGhhLCBRTEE4MlhYX0NSQl9ERVZfU1RBVEUpOwogCWlmIChkZXZfc3RhdGUgPT0gUUxBODJYWF9ERVZfUkVBRFkpIHsKLQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiSFcgU3RhdGU6IE5FRUQgUkVTRVRcbiIpOworCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg4MDI1LAorCQkgICAgIkhXIFN0YXRlOiBORUVEIFJFU0VULlxuIik7CiAJCXFsYTgyeHhfd3JfMzIoaGEsIFFMQTgyWFhfQ1JCX0RFVl9TVEFURSwKIAkJCVFMQTgyWFhfREVWX05FRURfUkVTRVQpOwogCX0gZWxzZQotCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJIVyBTdGF0ZTogJXNcbiIsCi0JCQlkZXZfc3RhdGUgPCBNQVhfU1RBVEVTID8KLQkJCXFkZXZfc3RhdGVbZGV2X3N0YXRlXSA6ICJVbmtub3duIik7CisJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDgwMjYsCisJCSAgICAiSHcgU3RhdGU6ICVzLlxuIiwgZGV2X3N0YXRlIDwgTUFYX1NUQVRFUyA/CisJCSAgICBxZGV2X3N0YXRlW2Rldl9zdGF0ZV0gOiAiVW5rbm93biIpOwogCXFsYTgyeHhfaWRjX3VubG9jayhoYSk7CiAKIAlydmFsID0gcWxhODJ4eF9kZXZpY2Vfc3RhdGVfaGFuZGxlcih2aGEpOwpAQCAtMzc3Nyw5ICszODQzLDkgQEAKIAkJdmhhLT5mbGFncy5vbmxpbmUgPSAxOwogCQlpZiAodGVzdF9iaXQoSVNQX0FCT1JUX1JFVFJZLCAmdmhhLT5kcGNfZmxhZ3MpKSB7CiAJCQlpZiAoaGEtPmlzcF9hYm9ydF9jbnQgPT0gMCkgewotCQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCQkgICAgIklTUCBlcnJvciByZWNvdmVyeSBmYWlsZWQgLSAiCi0JCQkJICAgICJib2FyZCBkaXNhYmxlZFxuIik7CisJCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4ODAyNywKKwkJCQkgICAgIklTUCBlcnJvciByZWNvdmVyIGZhaWxlZCAtIGJvYXJkICIKKwkJCQkgICAgImRpc2FibGVkLlxuIik7CiAJCQkJLyoKIAkJCQkgKiBUaGUgbmV4dCBjYWxsIGRpc2FibGVzIHRoZSBib2FyZAogCQkJCSAqIGNvbXBsZXRlbHkuCkBAIC0zNzkxLDE2ICszODU3LDE2IEBACiAJCQkJcnZhbCA9IFFMQV9TVUNDRVNTOwogCQkJfSBlbHNlIHsgLyogc2NoZWR1bGUgYW5vdGhlciBJU1AgYWJvcnQgKi8KIAkJCQloYS0+aXNwX2Fib3J0X2NudC0tOwotCQkJCURFQlVHKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCQkgICAgInFsYSVsZDogSVNQIGFib3J0IC0gcmV0cnkgcmVtYWluaW5nICVkXG4iLAotCQkJCSAgICB2aGEtPmhvc3Rfbm8sIGhhLT5pc3BfYWJvcnRfY250KSk7CisJCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4ODAzNiwKKwkJCQkgICAgIklTUCBhYm9ydCAtIHJldHJ5IHJlbWFpbmluZyAlZC5cbiIsCisJCQkJICAgIGhhLT5pc3BfYWJvcnRfY250KTsKIAkJCQlydmFsID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCWhhLT5pc3BfYWJvcnRfY250ID0gTUFYX1JFVFJJRVNfT0ZfSVNQX0FCT1JUOwotCQkJREVCVUcocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJICAgICIoJWxkKTogSVNQIGVycm9yIHJlY292ZXJ5IC0gcmV0cnlpbmcgKCVkKSAiCi0JCQkgICAgIm1vcmUgdGltZXNcbiIsIHZoYS0+aG9zdF9ubywgaGEtPmlzcF9hYm9ydF9jbnQpKTsKKwkJCXFsX2RiZyhxbF9kYmdfdGFza20sIHZoYSwgMHg4MDI5LAorCQkJICAgICJJU1AgZXJyb3IgcmVjb3ZlcnkgLSByZXRyeWluZyAoJWQpIG1vcmUgdGltZXMuXG4iLAorCQkJICAgIGhhLT5pc3BfYWJvcnRfY250KTsKIAkJCXNldF9iaXQoSVNQX0FCT1JUX1JFVFJZLCAmdmhhLT5kcGNfZmxhZ3MpOwogCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJCX0KQEAgLTM4NzIsOCArMzkzOCw4IEBACiAJCQlicmVhazsKIAkJfQogCX0KLQlERUJVRzIocHJpbnRrKEtFUk5fSU5GTwotCSAgICAiJXMgc3RhdHVzPSVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKSk7CisJcWxfZGJnKHFsX2RiZ19wM3AsIHZoYSwgMHhiMDI3LAorCSAgICAiJXMgc3RhdHVzPSVkLlxuIiwgc3RhdHVzKTsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0zOTAyLDYgKzM5NjgsOSBAQAogCQkJfQogCQl9CiAJfQorCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwYjAsCisJICAgICJFbnRlcmVkICVzIGZ3X2h1bmc9JWQuXG4iLAorCSAgICBfX2Z1bmNfXywgaGEtPmZsYWdzLmlzcDgyeHhfZndfaHVuZyk7CiAKIAkvKiBBYm9ydCBhbGwgY29tbWFuZHMgZ3JhY2VmdWxseSBpZiBmdyBOT1QgaHVuZyAqLwogCWlmICghaGEtPmZsYWdzLmlzcDgyeHhfZndfaHVuZykgewpAQCAtMzkyMiwxMyArMzk5MSwxMyBAQAogCQkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgKIAkJCQkJCSAgICAmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAkJCQkJCWlmIChoYS0+aXNwX29wcy0+YWJvcnRfY29tbWFuZChzcCkpIHsKLQkJCQkJCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkJCQkJICAgICJzY3NpKCVsZCk6IG1ieCBhYm9ydCBjb21tYW5kIGZhaWxlZCBpbiAlc1xuIiwKLQkJCQkJCQkgICAgdmhhLT5ob3N0X25vLCBfX2Z1bmNfXyk7CisJCQkJCQkJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsCisJCQkJCQkJICAgIDB4MDBiMSwKKwkJCQkJCQkgICAgIm1ieCBhYm9ydCBmYWlsZWQuXG4iKTsKIAkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJCQkJCSAgICAic2NzaSglbGQpOiBtYnggYWJvcnQgY29tbWFuZCBzdWNjZXNzIGluICVzXG4iLAotCQkJCQkJCSAgICB2aGEtPmhvc3Rfbm8sIF9fZnVuY19fKTsKKwkJCQkJCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwKKwkJCQkJCQkgICAgMHgwMGIyLAorCQkJCQkJCSAgICAibWJ4IGFib3J0IHN1Y2Nlc3MuXG4iKTsKIAkJCQkJCX0KIAkJCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZoYS0+aGFyZHdhcmVfbG9jaywgZmxhZ3MpOwogCQkJCQl9CkBAIC0zOTQwLDggKzQwMDksOSBAQAogCQkvKiBXYWl0IGZvciBwZW5kaW5nIGNtZHMgKHBoeXNpY2FsIGFuZCB2aXJ0dWFsKSB0byBjb21wbGV0ZSAqLwogCQlpZiAoIXFsYTJ4MDBfZWhfd2FpdF9mb3JfcGVuZGluZ19jb21tYW5kcyh2aGEsIDAsIDAsCiAJCSAgICBXQUlUX0hPU1QpID09IFFMQV9TVUNDRVNTKSB7Ci0JCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJICAgICJEb25lIHdhaXQgZm9yIHBlbmRpbmcgY29tbWFuZHNcbiIpKTsKKwkJCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwYjMsCisJCQkgICAgIkRvbmUgd2FpdCBmb3IgIgorCQkJICAgICJwZW5kaW5nIGNvbW1hbmRzLlxuIik7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9vcy5jCmluZGV4IGY0NjE5MjUuLmUwMmRmMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9vcy5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9vcy5jCkBAIC0zNSw2ICszNSwxMCBAQAogICogQ1Q2IENUWCBhbGxvY2F0aW9uIGNhY2hlCiAgKi8KIHN0YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqY3R4X2NhY2hlcDsKKy8qCisgKiBlcnJvciBsZXZlbCBmb3IgbG9nZ2luZworICovCitpbnQgcWxfZXJybGV2ID0gcWxfbG9nX2FsbDsKIAogaW50IHFsMnhsb2dpbnRpbWVvdXQgPSAyMDsKIG1vZHVsZV9wYXJhbShxbDJ4bG9naW50aW1lb3V0LCBpbnQsIFNfSVJVR08pOwpAQCAtNjksOCArNzMsMTcgQEAKIGludCBxbDJ4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZzsKIG1vZHVsZV9wYXJhbShxbDJ4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZywgaW50LCBTX0lSVUdPfFNfSVdVU1IpOwogTU9EVUxFX1BBUk1fREVTQyhxbDJ4ZXh0ZW5kZWRfZXJyb3JfbG9nZ2luZywKLQkJIk9wdGlvbiB0byBlbmFibGUgZXh0ZW5kZWQgZXJyb3IgbG9nZ2luZywgIgotCQkiRGVmYXVsdCBpcyAwIC0gbm8gbG9nZ2luZy4gMSAtIGxvZyBlcnJvcnMuIik7CisJCSJPcHRpb24gdG8gZW5hYmxlIGV4dGVuZGVkIGVycm9yIGxvZ2dpbmcsXG4iCisJCSJcdFx0RGVmYXVsdCBpcyAwIC0gbm8gbG9nZ2luZy4gIDB4NDAwMDAwMDAgLSBNb2R1bGUgSW5pdCAmIFByb2JlLlxuIgorCQkiXHRcdDB4MjAwMDAwMDAgLSBNYWlsYm94IENtbmRzLiAweDEwMDAwMDAwIC0gRGV2aWNlIERpc2NvdmVyeS5cbiIKKwkJIlx0XHQweDA4MDAwMDAwIC0gSU8gdHJhY2luZy4gICAgMHgwNDAwMDAwMCAtIERQQyBUaHJlYWQuXG4iCisJCSJcdFx0MHgwMjAwMDAwMCAtIEFzeW5jIGV2ZW50cy4gIDB4MDEwMDAwMDAgLSBUaW1lciByb3V0aW5lcy5cbiIKKwkJIlx0XHQweDAwODAwMDAwIC0gVXNlciBzcGFjZS4gICAgMHgwMDQwMDAwMCAtIFRhc2sgTWFuYWdlbWVudC5cbiIKKwkJIlx0XHQweDAwMjAwMDAwIC0gQUVSL0VFSC4gICAgICAgMHgwMDEwMDAwMCAtIE11bHRpIFEuXG4iCisJCSJcdFx0MHgwMDA4MDAwMCAtIFAzUCBTcGVjaWZpYy4gIDB4MDAwNDAwMDAgLSBWaXJ0dWFsIFBvcnQuXG4iCisJCSJcdFx0MHgwMDAyMDAwMCAtIEJ1ZmZlciBEdW1wLiAgIDB4MDAwMTAwMDAgLSBNaXNjLlxuIgorCQkiXHRcdDB4N2ZmZmZmZmYgLSBGb3IgZW5hYmxpbmcgYWxsIGxvZ3MsIGNhbiBiZSB0b28gbWFueSBsb2dzLlxuIgorCQkiXHRcdERvIExPR0lDQUwgT1Igb2YgdGhlIHZhbHVlIHRvIGVuYWJsZSBtb3JlIHRoYW4gb25lIGxldmVsIik7CiAKIGludCBxbDJ4c2hpZnRjdG9uZHNkID0gNjsKIG1vZHVsZV9wYXJhbShxbDJ4c2hpZnRjdG9uZHNkLCBpbnQsIFNfSVJVR08pOwpAQCAtMTI4LDggKzE0MSw4IEBACiBpbnQgcWwyeGZ3bG9hZGJpbjsKIG1vZHVsZV9wYXJhbShxbDJ4Zndsb2FkYmluLCBpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhxbDJ4Zndsb2FkYmluLAotCQkiT3B0aW9uIHRvIHNwZWNpZnkgbG9jYXRpb24gZnJvbSB3aGljaCB0byBsb2FkIElTUCBmaXJtd2FyZTpcbiIKLQkJIiAyIC0tIGxvYWQgZmlybXdhcmUgdmlhIHRoZSByZXF1ZXN0X2Zpcm13YXJlKCkgKGhvdHBsdWcpXG4iCisJCSJPcHRpb24gdG8gc3BlY2lmeSBsb2NhdGlvbiBmcm9tIHdoaWNoIHRvIGxvYWQgSVNQIGZpcm13YXJlOi5cbiIKKwkJIiAyIC0tIGxvYWQgZmlybXdhcmUgdmlhIHRoZSByZXF1ZXN0X2Zpcm13YXJlKCkgKGhvdHBsdWcpLlxuIgogCQkiICAgICAgaW50ZXJmYWNlLlxuIgogCQkiIDEgLS0gbG9hZCBmaXJtd2FyZSBmcm9tIGZsYXNoLlxuIgogCQkiIDAgLS0gdXNlIGRlZmF1bHQgc2VtYW50aWNzLlxuIik7CkBAIC0xNDMsNyArMTU2LDcgQEAKIGludCBxbDJ4ZGJ3ciA9IDE7CiBtb2R1bGVfcGFyYW0ocWwyeGRid3IsIGludCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKHFsMnhkYndyLAotCSJPcHRpb24gdG8gc3BlY2lmeSBzY2hlbWUgZm9yIHJlcXVlc3QgcXVldWUgcG9zdGluZ1xuIgorCSJPcHRpb24gdG8gc3BlY2lmeSBzY2hlbWUgZm9yIHJlcXVlc3QgcXVldWUgcG9zdGluZy5cbiIKIAkiIDAgLS0gUmVndWxhciBkb29yYmVsbC5cbiIKIAkiIDEgLS0gQ0FNUkFNIGRvb3JiZWxsIChmYXN0ZXIpLlxuIik7CiAKQEAgLTE2OCw3ICsxODEsNyBAQAogaW50IHFsMnhkb250cmVzZXRoYmE7CiBtb2R1bGVfcGFyYW0ocWwyeGRvbnRyZXNldGhiYSwgaW50LCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MocWwyeGRvbnRyZXNldGhiYSwKLQkiT3B0aW9uIHRvIHNwZWNpZnkgcmVzZXQgYmVoYXZpb3VyXG4iCisJIk9wdGlvbiB0byBzcGVjaWZ5IHJlc2V0IGJlaGF2aW91ci5cbiIKIAkiIDAgKERlZmF1bHQpIC0tIFJlc2V0IG9uIGZhaWx1cmUuXG4iCiAJIiAxIC0tIERvIG5vdCByZXNldCBvbiBmYWlsdXJlLlxuIik7CiAKQEAgLTI0Nyw4ICsyNjAsMTEgQEAKIHFsYTJ4MDBfcmVzdGFydF90aW1lcihzY3NpX3FsYV9ob3N0X3QgKnZoYSwgdW5zaWduZWQgbG9uZyBpbnRlcnZhbCkKIHsKIAkvKiBDdXJyZW50bHkgdXNlZCBmb3IgODJYWCBvbmx5LiAqLwotCWlmICh2aGEtPmRldmljZV9mbGFncyAmIERGTEdfREVWX0ZBSUxFRCkKKwlpZiAodmhhLT5kZXZpY2VfZmxhZ3MgJiBERkxHX0RFVl9GQUlMRUQpIHsKKwkJcWxfZGJnKHFsX2RiZ190aW1lciwgdmhhLCAweDYwMGQsCisJCSAgICAiRGV2aWNlIGluIGEgZmFpbGVkIHN0YXRlLCByZXR1cm5pbmcuXG4iKTsKIAkJcmV0dXJuOworCX0KIAogCW1vZF90aW1lcigmdmhhLT50aW1lciwgamlmZmllcyArIGludGVydmFsICogSFopOwogfQpAQCAtMjczLDE5ICsyODksMjAgQEAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiBzdGF0aWMgaW50IHFsYTJ4MDBfYWxsb2NfcXVldWVzKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEpCiB7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCWhhLT5yZXFfcV9tYXAgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmVxX3F1ZSAqKSAqIGhhLT5tYXhfcmVxX3F1ZXVlcywKIAkJCQlHRlBfS0VSTkVMKTsKIAlpZiAoIWhhLT5yZXFfcV9tYXApIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlcXVlc3QgcXVldWUgcHRyc1xuIik7CisJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMDNiLAorCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlcXVlc3QgcXVldWUgcHRycy5cbiIpOwogCQlnb3RvIGZhaWxfcmVxX21hcDsKIAl9CiAKIAloYS0+cnNwX3FfbWFwID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJzcF9xdWUgKikgKiBoYS0+bWF4X3JzcF9xdWV1ZXMsCiAJCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFoYS0+cnNwX3FfbWFwKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciByZXNwb25zZSBxdWV1ZSBwdHJzXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgdmhhLCAweDAwM2MsCisJCSAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVzcG9uc2UgcXVldWUgcHRycy5cbiIpOwogCQlnb3RvIGZhaWxfcnNwX21hcDsKIAl9CiAJc2V0X2JpdCgwLCBoYS0+cnNwX3FpZF9tYXApOwpAQCAtMzQ5LDggKzM2Niw4IEBACiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAlpZiAoIShoYS0+ZndfYXR0cmlidXRlcyAmIEJJVF82KSkgewotCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkiRmlybXdhcmUgaXMgbm90IG11bHRpLXF1ZXVlIGNhcGFibGVcbiIpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMGQ4LAorCQkgICAgIkZpcm13YXJlIGlzIG5vdCBtdWx0aS1xdWV1ZSBjYXBhYmxlLlxuIik7CiAJCWdvdG8gZmFpbDsKIAl9CiAJaWYgKHFsMnhtdWx0aXF1ZV90YWcpIHsKQEAgLTM1OSw4ICszNzYsOCBAQAogCQlyZXEgPSBxbGEyNXh4X2NyZWF0ZV9yZXFfcXVlKGhhLCBvcHRpb25zLCAwLCAwLCAtMSwKIAkJCVFMQV9ERUZBVUxUX1FVRV9RT1MpOwogCQlpZiAoIXJlcSkgewotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJCSJDYW4ndCBjcmVhdGUgcmVxdWVzdCBxdWV1ZVxuIik7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMGUwLAorCQkJICAgICJGYWlsZWQgdG8gY3JlYXRlIHJlcXVlc3QgcXVldWUuXG4iKTsKIAkJCWdvdG8gZmFpbDsKIAkJfQogCQloYS0+d3EgPSBhbGxvY193b3JrcXVldWUoInFsYTJ4eHhfd3EiLCBXUV9NRU1fUkVDTEFJTSwgMSk7CkBAIC0zNjksMTcgKzM4NiwyMCBAQAogCQlmb3IgKHF1ZXMgPSAxOyBxdWVzIDwgaGEtPm1heF9yc3BfcXVldWVzOyBxdWVzKyspIHsKIAkJCXJldCA9IHFsYTI1eHhfY3JlYXRlX3JzcF9xdWUoaGEsIG9wdGlvbnMsIDAsIDAsIHJlcSk7CiAJCQlpZiAoIXJldCkgewotCQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCQkJIlJlc3BvbnNlIFF1ZXVlIGNyZWF0ZSBmYWlsZWRcbiIpOworCQkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAwZTgsCisJCQkJICAgICJGYWlsZWQgdG8gY3JlYXRlIHJlc3BvbnNlIHF1ZXVlLlxuIik7CiAJCQkJZ290byBmYWlsMjsKIAkJCX0KIAkJfQogCQloYS0+ZmxhZ3MuY3B1X2FmZmluaXR5X2VuYWJsZWQgPSAxOwotCi0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkiQ1BVIGFmZmluaXR5IG1vZGUgZW5hYmxlZCwgbm8uIG9mIHJlc3BvbnNlIgotCQkJIiBxdWV1ZXM6JWQsIG5vLiBvZiByZXF1ZXN0IHF1ZXVlczolZFxuIiwKLQkJCWhhLT5tYXhfcnNwX3F1ZXVlcywgaGEtPm1heF9yZXFfcXVldWVzKSk7CisJCXFsX2RiZyhxbF9kYmdfbXVsdGlxLCB2aGEsIDB4YzAwNywKKwkJICAgICJDUFUgYWZmaW5pdHkgbW9kZSBlbmFsYmVkLCAiCisJCSAgICAibm8uIG9mIHJlc3BvbnNlIHF1ZXVlczolZCBuby4gb2YgcmVxdWVzdCBxdWV1ZXM6JWQuXG4iLAorCQkgICAgaGEtPm1heF9yc3BfcXVldWVzLCBoYS0+bWF4X3JlcV9xdWV1ZXMpOworCQlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMGU5LAorCQkgICAgIkNQVSBhZmZpbml0eSBtb2RlIGVuYWxiZWQsICIKKwkJICAgICJuby4gb2YgcmVzcG9uc2UgcXVldWVzOiVkIG5vLiBvZiByZXF1ZXN0IHF1ZXVlczolZC5cbiIsCisJCSAgICBoYS0+bWF4X3JzcF9xdWV1ZXMsIGhhLT5tYXhfcmVxX3F1ZXVlcyk7CiAJfQogCXJldHVybiAwOwogZmFpbDI6CkBAIC01MjYsOCArNTQ2LDExIEBACiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CiAKIAlzcCA9IG1lbXBvb2xfYWxsb2MoaGEtPnNyYl9tZW1wb29sLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXNwKQorCWlmICghc3ApIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MzAwNiwKKwkJICAgICJNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQgZm9yIHNwLlxuIik7CiAJCXJldHVybiBzcDsKKwl9CiAKIAlhdG9taWNfc2V0KCZzcC0+cmVmX2NvdW50LCAxKTsKIAlzcC0+ZmNwb3J0ID0gZmNwb3J0OwpAQCAtNTUxLDMwICs1NzQsNDMgQEAKIAlpbnQgcnZhbDsKIAogCWlmIChoYS0+ZmxhZ3MuZWVoX2J1c3kpIHsKLQkJaWYgKGhhLT5mbGFncy5wY2lfY2hhbm5lbF9pb19wZXJtX2ZhaWx1cmUpCisJCWlmIChoYS0+ZmxhZ3MucGNpX2NoYW5uZWxfaW9fcGVybV9mYWlsdXJlKSB7CisJCQlxbF9kYmcocWxfZGJnX2lvLCB2aGEsIDB4MzAwMSwKKwkJCSAgICAiUENJIENoYW5uZWwgSU8gcGVybWFuZW50IGZhaWx1cmUsIGV4aXRpbmcgIgorCQkJICAgICJjbWQ9JXAuXG4iLCBjbWQpOwogCQkJY21kLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKLQkJZWxzZQorCQl9IGVsc2UgeworCQkJcWxfZGJnKHFsX2RiZ19pbywgdmhhLCAweDMwMDIsCisJCQkgICAgIkVFSF9CdXN5LCBSZXF1ZXVpbmcgdGhlIGNtZD0lcC5cbiIsIGNtZCk7CiAJCQljbWQtPnJlc3VsdCA9IERJRF9SRVFVRVVFIDw8IDE2OworCQl9CiAJCWdvdG8gcWMyNF9mYWlsX2NvbW1hbmQ7CiAJfQogCiAJcnZhbCA9IGZjX3JlbW90ZV9wb3J0X2Noa3JlYWR5KHJwb3J0KTsKIAlpZiAocnZhbCkgewogCQljbWQtPnJlc3VsdCA9IHJ2YWw7CisJCXFsX2RiZyhxbF9kYmdfaW8sIHZoYSwgMHgzMDAzLAorCQkgICAgImZjX3JlbW90ZV9wb3J0X2Noa3JlYWR5IGZhaWxlZCBmb3IgY21kPSVwLCBydmFsPTB4JXguXG4iLAorCQkgICAgY21kLCBydmFsKTsKIAkJZ290byBxYzI0X2ZhaWxfY29tbWFuZDsKIAl9CiAKIAlpZiAoIXZoYS0+ZmxhZ3MuZGlmZGl4X3N1cHBvcnRlZCAmJgogCQlzY3NpX2dldF9wcm90X29wKGNtZCkgIT0gU0NTSV9QUk9UX05PUk1BTCkgewotCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9FUlIsIGhhLAotCQkJICAgICJESUYgQ2FwIE5vdCBSZWcsIGZhaWwgRElGIGNhcGFibGUgY21kJ3M6JXhcbiIsCi0JCQkgICAgY21kLT5jbW5kWzBdKSk7CisJCQlxbF9kYmcocWxfZGJnX2lvLCB2aGEsIDB4MzAwNCwKKwkJCSAgICAiRElGIENhcCBub3QgcmVnLCBmYWlsIERJRiBjYXBhYmxlIGNtZCdzOiVwLlxuIiwKKwkJCSAgICBjbWQpOwogCQkJY21kLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKIAkJCWdvdG8gcWMyNF9mYWlsX2NvbW1hbmQ7CiAJfQogCWlmIChhdG9taWNfcmVhZCgmZmNwb3J0LT5zdGF0ZSkgIT0gRkNTX09OTElORSkgewogCQlpZiAoYXRvbWljX3JlYWQoJmZjcG9ydC0+c3RhdGUpID09IEZDU19ERVZJQ0VfREVBRCB8fAogCQkJYXRvbWljX3JlYWQoJmJhc2VfdmhhLT5sb29wX3N0YXRlKSA9PSBMT09QX0RFQUQpIHsKKwkJCXFsX2RiZyhxbF9kYmdfaW8sIHZoYSwgMHgzMDA1LAorCQkJICAgICJSZXR1cm5pbmcgRE5DLCBmY3BvcnRfc3RhdGU9JWQgbG9vcF9zdGF0ZT0lZC5cbiIsCisJCQkgICAgYXRvbWljX3JlYWQoJmZjcG9ydC0+c3RhdGUpLAorCQkJICAgIGF0b21pY19yZWFkKCZiYXNlX3ZoYS0+bG9vcF9zdGF0ZSkpOwogCQkJY21kLT5yZXN1bHQgPSBESURfTk9fQ09OTkVDVCA8PCAxNjsKIAkJCWdvdG8gcWMyNF9mYWlsX2NvbW1hbmQ7CiAJCX0KQEAgLTU4Niw4ICs2MjIsMTEgQEAKIAkJZ290byBxYzI0X2hvc3RfYnVzeTsKIAogCXJ2YWwgPSBoYS0+aXNwX29wcy0+c3RhcnRfc2NzaShzcCk7Ci0JaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpCisJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJcWxfZGJnKHFsX2RiZ19pbywgdmhhLCAweDMwMTMsCisJCSAgICAiU3RhcnQgc2NzaSBmYWlsZWQgcnZhbD0lZCBmb3IgY21kPSVwLlxuIiwgcnZhbCwgY21kKTsKIAkJZ290byBxYzI0X2hvc3RfYnVzeV9mcmVlX3NwOworCX0KIAogCXJldHVybiAwOwogCkBAIC02MzAsNyArNjY5LDggQEAKIAlpbnQgcmV0ID0gUUxBX1NVQ0NFU1M7CiAKIAlpZiAodW5saWtlbHkocGNpX2NoYW5uZWxfb2ZmbGluZShoYS0+cGRldikpIHx8IGhhLT5mbGFncy5lZWhfYnVzeSkgewotCQlERUJVRzE3KHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgInJldHVybjplaF93YWl0XG4iKSk7CisJCXFsX2RiZyhxbF9kYmdfdGFza20sIHZoYSwgMHg4MDA1LAorCQkgICAgIlJldHVybjplaF93YWl0LlxuIik7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC03MjMsNyArNzYzLDggQEAKIAllbHNlCiAJCXJldHVybl9zdGF0dXMgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCi0JREVCVUcyKHByaW50aygiJXMgcmV0dXJuX3N0YXR1cz0lZFxuIiwgX19mdW5jX18sIHJldHVybl9zdGF0dXMpKTsKKwlxbF9kYmcocWxfZGJnX3Rhc2ttLCB2aGEsIDB4ODAxOSwKKwkgICAgIiVzIHJldHVybiBzdGF0dXM9JWQuXG4iLCBfX2Z1bmNfXywgcmV0dXJuX3N0YXR1cyk7CiAKIAlyZXR1cm4gcmV0dXJuX3N0YXR1czsKIH0KQEAgLTgzMSwxMCArODcyLDE0IEBACiAJaW50IHdhaXQgPSAwOwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCisJcWxfZGJnKHFsX2RiZ190YXNrbSwgdmhhLCAweDgwMDAsCisJICAgICJFbnRlcmVkICVzIGZvciBjbWQ9JXAuXG4iLCBfX2Z1bmNfXywgY21kKTsKIAlpZiAoIUNNRF9TUChjbWQpKQogCQlyZXR1cm4gU1VDQ0VTUzsKIAogCXJldCA9IGZjX2Jsb2NrX3Njc2lfZWgoY21kKTsKKwlxbF9kYmcocWxfZGJnX3Rhc2ttLCB2aGEsIDB4ODAwMSwKKwkgICAgIlJldHVybiB2YWx1ZSBvZiBmY19ibG9ja19zY3NpX2VoPSVkLlxuIiwgcmV0KTsKIAlpZiAocmV0ICE9IDApCiAJCXJldHVybiByZXQ7CiAJcmV0ID0gU1VDQ0VTUzsKQEAgLTg0OSwyMCArODk0LDE5IEBACiAJCXJldHVybiBTVUNDRVNTOwogCX0KIAotCURFQlVHMihwcmludGsoIiVzKCVsZCk6IGFib3J0aW5nIHNwICVwIGZyb20gUklTQy4iLAotCSAgICBfX2Z1bmNfXywgdmhhLT5ob3N0X25vLCBzcCkpOworCXFsX2RiZyhxbF9kYmdfdGFza20sIHZoYSwgMHg4MDAyLAorCSAgICAiQWJvcnRpbmcgc3A9JXAgY21kPSVwIGZyb20gUklTQyAiLCBzcCwgY21kKTsKIAogCS8qIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgc3AgYW5kIGRyb3AgdGhlIGxvY2suKi8KIAlzcF9nZXQoc3ApOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAlpZiAoaGEtPmlzcF9vcHMtPmFib3J0X2NvbW1hbmQoc3ApKSB7Ci0JCURFQlVHMihwcmludGsoIiVzKCVsZCk6IGFib3J0X2NvbW1hbmQgIgotCQkibWJ4IGZhaWxlZC5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKLQkJcmV0ID0gRkFJTEVEOworCQlxbF9kYmcocWxfZGJnX3Rhc2ttLCB2aGEsIDB4ODAwMywKKwkJICAgICJBYm9ydCBjb21tYW5kIG1ieCBmYWlsZWQgZm9yIGNtZD0lcC5cbiIsIGNtZCk7CiAJfSBlbHNlIHsKLQkJREVCVUczKHByaW50aygiJXMoJWxkKTogYWJvcnRfY29tbWFuZCAiCi0JCSJtYnggc3VjY2Vzcy5cbiIsIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8pKTsKKwkJcWxfZGJnKHFsX2RiZ190YXNrbSwgdmhhLCAweDgwMDQsCisJCSAgICAiQWJvcnQgY29tbWFuZCBtYnggc3VjY2Vzcy5cbiIpOwogCQl3YWl0ID0gMTsKIAl9CiAJcWxhMngwMF9zcF9jb21wbChoYSwgc3ApOwpAQCAtODcwLDE2ICs5MTQsMTQgQEAKIAkvKiBXYWl0IGZvciB0aGUgY29tbWFuZCB0byBiZSByZXR1cm5lZC4gKi8KIAlpZiAod2FpdCkgewogCQlpZiAocWxhMngwMF9laF93YWl0X29uX2NvbW1hbmQoY21kKSAhPSBRTEFfU1VDQ0VTUykgewotCQkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsCi0JCQkgICAgInNjc2koJWxkOiVkOiVkKTogQWJvcnQgaGFuZGxlciB0aW1lZCBvdXQgLS0gJXguXG4iLAotCQkJICAgIHZoYS0+aG9zdF9ubywgaWQsIGx1biwgcmV0KTsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDgwMDYsCisJCQkgICAgIkFib3J0IGhhbmRsZXIgdGltZWQgb3V0IGZvciBjbWQ9JXAuXG4iLCBjbWQpOwogCQkJcmV0ID0gRkFJTEVEOwogCQl9CiAJfQogCi0JcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCSAgICAic2NzaSglbGQ6JWQ6JWQpOiBBYm9ydCBjb21tYW5kIGlzc3VlZCAtLSAlZCAleC5cbiIsCi0JICAgIHZoYS0+aG9zdF9ubywgaWQsIGx1biwgd2FpdCwgcmV0KTsKKwlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg4MDFjLAorCSAgICAiQWJvcnQgY29tbWFuZCBpc3N1ZWQgLS0gICVkICV4LlxuIiwgd2FpdCwgcmV0KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC05NDcsNDAgKzk4OSw1OSBAQAogCWZjX3BvcnRfdCAqZmNwb3J0ID0gKHN0cnVjdCBmY19wb3J0ICopIGNtZC0+ZGV2aWNlLT5ob3N0ZGF0YTsKIAlpbnQgZXJyOwogCi0JaWYgKCFmY3BvcnQpCisJaWYgKCFmY3BvcnQpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4ODAwNywKKwkJICAgICJmY3BvcnQgaXMgTlVMTC5cbiIpOwogCQlyZXR1cm4gRkFJTEVEOworCX0KIAogCWVyciA9IGZjX2Jsb2NrX3Njc2lfZWgoY21kKTsKKwlxbF9kYmcocWxfZGJnX3Rhc2ttLCB2aGEsIDB4ODAwOCwKKwkgICAgImZjX2Jsb2NrX3Njc2lfZWggcmV0PSVkLlxuIiwgZXJyKTsKIAlpZiAoZXJyICE9IDApCiAJCXJldHVybiBlcnI7CiAKLQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgdmhhLT5odywgInNjc2koJWxkOiVkOiVkKTogJXMgUkVTRVQgSVNTVUVELlxuIiwKLQkgICAgdmhhLT5ob3N0X25vLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4sIG5hbWUpOworCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDgwMDksCisJICAgICIlcyBSRVNFVCBJU1NVRUQgZm9yIGlkICVkIGx1biAlZCBjbWQ9JXAuXG4iLCBuYW1lLAorCSAgICBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4sIGNtZCk7CiAKIAllcnIgPSAwOwotCWlmIChxbGEyeDAwX3dhaXRfZm9yX2hiYV9vbmxpbmUodmhhKSAhPSBRTEFfU1VDQ0VTUykKKwlpZiAocWxhMngwMF93YWl0X2Zvcl9oYmFfb25saW5lKHZoYSkgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4ODAwYSwKKwkJICAgICJXYWl0IGZvciBoYmEgb25saW5lIGZhaWxlZCBmb3IgY21kPSVwLlxuIiwgY21kKTsKIAkJZ290byBlaF9yZXNldF9mYWlsZWQ7CisJfQogCWVyciA9IDE7Ci0JaWYgKHFsYTJ4MDBfd2FpdF9mb3JfbG9vcF9yZWFkeSh2aGEpICE9IFFMQV9TVUNDRVNTKQorCWlmIChxbGEyeDAwX3dhaXRfZm9yX2xvb3BfcmVhZHkodmhhKSAhPSBRTEFfU1VDQ0VTUykgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg4MDBiLAorCQkgICAgIldhaXQgZm9yIGxvb3AgcmVhZHkgZmFpbGVkIGZvciBjbWQ9JXAuXG4iLCBjbWQpOwogCQlnb3RvIGVoX3Jlc2V0X2ZhaWxlZDsKKwl9CiAJZXJyID0gMjsKIAlpZiAoZG9fcmVzZXQoZmNwb3J0LCBjbWQtPmRldmljZS0+bHVuLCBjbWQtPnJlcXVlc3QtPmNwdSArIDEpCi0JCSE9IFFMQV9TVUNDRVNTKQorCQkhPSBRTEFfU1VDQ0VTUykgeworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg4MDBjLAorCQkgICAgImRvX3Jlc2V0IGZhaWxlZCBmb3IgY21kPSVwLlxuIiwgY21kKTsKIAkJZ290byBlaF9yZXNldF9mYWlsZWQ7CisJfQogCWVyciA9IDM7CiAJaWYgKHFsYTJ4MDBfZWhfd2FpdF9mb3JfcGVuZGluZ19jb21tYW5kcyh2aGEsIGNtZC0+ZGV2aWNlLT5pZCwKLQkgICAgY21kLT5kZXZpY2UtPmx1biwgdHlwZSkgIT0gUUxBX1NVQ0NFU1MpCisJICAgIGNtZC0+ZGV2aWNlLT5sdW4sIHR5cGUpICE9IFFMQV9TVUNDRVNTKSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDgwMGQsCisJCSAgICAid2FpdCBmb3IgcGVkaW5nIGNtZHMgZmFpbGVkIGZvciBjbWQ9JXAuXG4iLCBjbWQpOwogCQlnb3RvIGVoX3Jlc2V0X2ZhaWxlZDsKKwl9CiAKLQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgdmhhLT5odywgInNjc2koJWxkOiVkOiVkKTogJXMgUkVTRVQgU1VDQ0VFREVELlxuIiwKLQkgICAgdmhhLT5ob3N0X25vLCBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4sIG5hbWUpOworCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDgwMGUsCisJICAgICIlcyBSRVNFVCBTVUNDRUVERUQgZm9yIGlkICVkIGx1biAlZCBjbWQ9JXAuXG4iLCBuYW1lLAorCSAgICBjbWQtPmRldmljZS0+aWQsIGNtZC0+ZGV2aWNlLT5sdW4sIGNtZCk7CiAKIAlyZXR1cm4gU1VDQ0VTUzsKIAogZWhfcmVzZXRfZmFpbGVkOgotCXFsYV9wcmludGsoS0VSTl9JTkZPLCB2aGEtPmh3LCAic2NzaSglbGQ6JWQ6JWQpOiAlcyBSRVNFVCBGQUlMRUQ6ICVzLlxuIgotCSAgICAsIHZoYS0+aG9zdF9ubywgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuLCBuYW1lLAotCSAgICByZXNldF9lcnJvcnNbZXJyXSk7CisJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4ODAwZiwKKwkgICAgIiVzIFJFU0VUIEZBSUxFRDogJXMgZm9yIGlkICVkIGx1biAlZCBjbWQ9JXAuXG4iLCBuYW1lLAorCSAgICByZXNldF9lcnJvcnNbZXJyXSwgY21kLT5kZXZpY2UtPmlkLCBjbWQtPmRldmljZS0+bHVuKTsKIAlyZXR1cm4gRkFJTEVEOwogfQogCkBAIC0xMDMwLDE5ICsxMDkxLDI1IEBACiAJaWQgPSBjbWQtPmRldmljZS0+aWQ7CiAJbHVuID0gY21kLT5kZXZpY2UtPmx1bjsKIAotCWlmICghZmNwb3J0KQorCWlmICghZmNwb3J0KSB7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDgwMTAsCisJCSAgICAiZmNwb3J0IGlzIE5VTEwuXG4iKTsKIAkJcmV0dXJuIHJldDsKKwl9CiAKIAlyZXQgPSBmY19ibG9ja19zY3NpX2VoKGNtZCk7CisJcWxfZGJnKHFsX2RiZ190YXNrbSwgdmhhLCAweDgwMTEsCisJICAgICJmY19ibG9ja19zY3NpX2VoIHJldD0lZC5cbiIsIHJldCk7CiAJaWYgKHJldCAhPSAwKQogCQlyZXR1cm4gcmV0OwogCXJldCA9IEZBSUxFRDsKIAotCXFsYV9wcmludGsoS0VSTl9JTkZPLCB2aGEtPmh3LAotCSAgICAic2NzaSglbGQ6JWQ6JWQpOiBCVVMgUkVTRVQgSVNTVUVELlxuIiwgdmhhLT5ob3N0X25vLCBpZCwgbHVuKTsKKwlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg4MDEyLAorCSAgICAiQlVTIFJFU0VUIElTU1VFRCBmb3IgaWQgJWQgbHVuICVkLlxuIiwgaWQsIGx1bik7CiAKIAlpZiAocWxhMngwMF93YWl0X2Zvcl9oYmFfb25saW5lKHZoYSkgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJREVCVUcyKHByaW50aygiJXMgZmFpbGVkOmJvYXJkIGRpc2FibGVkXG4iLF9fZnVuY19fKSk7CisJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHg4MDEzLAorCQkgICAgIldhaXQgZm9yIGhiYSBvbmxpbmUgZmFpbGVkIGJvYXJkIGRpc2FibGVkLlxuIik7CiAJCWdvdG8gZWhfYnVzX3Jlc2V0X2RvbmU7CiAJfQogCkBAIC0xMDU1LDEyICsxMTIyLDE1IEBACiAKIAkvKiBGbHVzaCBvdXRzdGFuZGluZyBjb21tYW5kcy4gKi8KIAlpZiAocWxhMngwMF9laF93YWl0X2Zvcl9wZW5kaW5nX2NvbW1hbmRzKHZoYSwgMCwgMCwgV0FJVF9IT1NUKSAhPQotCSAgICBRTEFfU1VDQ0VTUykKKwkgICAgUUxBX1NVQ0NFU1MpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4ODAxNCwKKwkJICAgICJXYWl0IGZvciBwZW5kaW5nIGNvbW1hbmRzIGZhaWxlZC5cbiIpOwogCQlyZXQgPSBGQUlMRUQ7CisJfQogCiBlaF9idXNfcmVzZXRfZG9uZToKLQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgdmhhLT5odywgIiVzOiByZXNldCAlc1xuIiwgX19mdW5jX18sCi0JICAgIChyZXQgPT0gRkFJTEVEKSA/ICJmYWlsZWQiIDogInN1Y2NlZWRlZCIpOworCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDgwMmIsCisJICAgICJCVVMgUkVTRVQgJXMuXG4iLCAocmV0ID09IEZBSUxFRCkgPyAiRkFJTEVEIiA6ICJTVUNDRURFRCIpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTEwOTMsMTYgKzExNjMsMjEgQEAKIAlpZCA9IGNtZC0+ZGV2aWNlLT5pZDsKIAlsdW4gPSBjbWQtPmRldmljZS0+bHVuOwogCi0JaWYgKCFmY3BvcnQpCisJaWYgKCFmY3BvcnQpIHsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4ODAxNiwKKwkJICAgICJmY3BvcnQgaXMgTlVMTC5cbiIpOwogCQlyZXR1cm4gcmV0OworCX0KIAogCXJldCA9IGZjX2Jsb2NrX3Njc2lfZWgoY21kKTsKKwlxbF9kYmcocWxfZGJnX3Rhc2ttLCB2aGEsIDB4ODAxNywKKwkgICAgImZjX2Jsb2NrX3Njc2lfZWggcmV0PSVkLlxuIiwgcmV0KTsKIAlpZiAocmV0ICE9IDApCiAJCXJldHVybiByZXQ7CiAJcmV0ID0gRkFJTEVEOwogCi0JcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCSAgICAic2NzaSglbGQ6JWQ6JWQpOiBBREFQVEVSIFJFU0VUIElTU1VFRC5cbiIsIHZoYS0+aG9zdF9ubywgaWQsIGx1bik7CisJcWxfbG9nKHFsX2xvZ19pbmZvLCB2aGEsIDB4ODAxOCwKKwkgICAgIkFEQVBURVIgUkVTRVQgSVNTVUVEIGZvciBpZCAlZCBsdW4gJWQuXG4iLCBpZCwgbHVuKTsKIAogCWlmIChxbGEyeDAwX3dhaXRfZm9yX3Jlc2V0X3JlYWR5KHZoYSkgIT0gUUxBX1NVQ0NFU1MpCiAJCWdvdG8gZWhfaG9zdF9yZXNldF9sb2NrOwpAQCAtMTEzNyw4ICsxMjEyLDExIEBACiAJCQkvKiBmYWlsZWQuIHNjaGVkdWxlIGRwYyB0byB0cnkgKi8KIAkJCXNldF9iaXQoSVNQX0FCT1JUX05FRURFRCwgJmJhc2VfdmhhLT5kcGNfZmxhZ3MpOwogCi0JCQlpZiAocWxhMngwMF93YWl0X2Zvcl9oYmFfb25saW5lKHZoYSkgIT0gUUxBX1NVQ0NFU1MpCisJCQlpZiAocWxhMngwMF93YWl0X2Zvcl9oYmFfb25saW5lKHZoYSkgIT0gUUxBX1NVQ0NFU1MpIHsKKwkJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg4MDJhLAorCQkJCSAgICAid2FpdCBmb3IgaGJhIG9ubGluZSBmYWlsZWQuXG4iKTsKIAkJCQlnb3RvIGVoX2hvc3RfcmVzZXRfbG9jazsKKwkJCX0KIAkJfQogCQljbGVhcl9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJmJhc2VfdmhhLT5kcGNfZmxhZ3MpOwogCX0KQEAgLTExNDksNyArMTIyNyw3IEBACiAJCXJldCA9IFNVQ0NFU1M7CiAKIGVoX2hvc3RfcmVzZXRfbG9jazoKLQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICIlczogcmVzZXQgJXNcbiIsIF9fZnVuY19fLAorCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIiVzOiByZXNldCAlcy5cbiIsIF9fZnVuY19fLAogCSAgICAocmV0ID09IEZBSUxFRCkgPyAiZmFpbGVkIiA6ICJzdWNjZWVkZWQiKTsKIAogCXJldHVybiByZXQ7CkBAIC0xMTc5LDkgKzEyNTcsOSBAQAogCiAJCQlyZXQgPSBoYS0+aXNwX29wcy0+dGFyZ2V0X3Jlc2V0KGZjcG9ydCwgMCwgMCk7CiAJCQlpZiAocmV0ICE9IFFMQV9TVUNDRVNTKSB7Ci0JCQkJREVCVUcyXzMocHJpbnRrKCIlcyglbGQpOiBidXNfcmVzZXQgZmFpbGVkOiAiCi0JCQkJICAgICJ0YXJnZXRfcmVzZXQ9JWQgZF9pZD0leC5cbiIsIF9fZnVuY19fLAotCQkJCSAgICB2aGEtPmhvc3Rfbm8sIHJldCwgZmNwb3J0LT5kX2lkLmIyNCkpOworCQkJCXFsX2RiZyhxbF9kYmdfdGFza20sIHZoYSwgMHg4MDJjLAorCQkJCSAgICAiQnVzIFJlc2V0IGZhaWxlZDogVGFyZ2V0IFJlc2V0PSVkICIKKwkJCQkgICAgImRfaWQ9JXguXG4iLCByZXQsIGZjcG9ydC0+ZF9pZC5iMjQpOwogCQkJfQogCQl9CiAJfQpAQCAtMTE4OSw5ICsxMjY3LDggQEAKIAlpZiAoaGEtPmZsYWdzLmVuYWJsZV9saXBfZnVsbF9sb2dpbiAmJiAhSVNfUUxBOFhYWF9UWVBFKGhhKSkgewogCQlyZXQgPSBxbGEyeDAwX2Z1bGxfbG9naW5fbGlwKHZoYSk7CiAJCWlmIChyZXQgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJCURFQlVHMl8zKHByaW50aygiJXMoJWxkKTogZmFpbGVkOiAiCi0JCQkgICAgImZ1bGxfbG9naW5fbGlwPSVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywKLQkJCSAgICByZXQpKTsKKwkJCXFsX2RiZyhxbF9kYmdfdGFza20sIHZoYSwgMHg4MDJkLAorCQkJICAgICJmdWxsX2xvZ2luX2xpcD0lZC5cbiIsIHJldCk7CiAJCX0KIAkJYXRvbWljX3NldCgmdmhhLT5sb29wX3N0YXRlLCBMT09QX0RPV04pOwogCQlhdG9taWNfc2V0KCZ2aGEtPmxvb3BfZG93bl90aW1lciwgTE9PUF9ET1dOX1RJTUUpOwpAQCAtMTIwMiw4ICsxMjc5LDggQEAKIAlpZiAoaGEtPmZsYWdzLmVuYWJsZV9saXBfcmVzZXQpIHsKIAkJcmV0ID0gcWxhMngwMF9saXBfcmVzZXQodmhhKTsKIAkJaWYgKHJldCAhPSBRTEFfU1VDQ0VTUykgewotCQkJREVCVUcyXzMocHJpbnRrKCIlcyglbGQpOiBmYWlsZWQ6ICIKLQkJCSAgICAibGlwX3Jlc2V0PSVkLlxuIiwgX19mdW5jX18sIHZoYS0+aG9zdF9ubywgcmV0KSk7CisJCQlxbF9kYmcocWxfZGJnX3Rhc2ttLCB2aGEsIDB4ODAyZSwKKwkJCSAgICAibGlwX3Jlc2V0IGZhaWxlZCAoJWQpLlxuIiwgcmV0KTsKIAkJfSBlbHNlCiAJCQlxbGEyeDAwX3dhaXRfZm9yX2xvb3BfcmVhZHkodmhhKTsKIAl9CkBAIC0xMzAyLDE3ICsxMzc5LDE3IEBACiAJaWYgKCFzY3NpX3RyYWNrX3F1ZXVlX2Z1bGwoc2RldiwgcWRlcHRoKSkKIAkJcmV0dXJuOwogCi0JREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBmY3BvcnQtPnZoYS0+aHcsCi0JCSJzY3NpKCVsZDolZDolZDolZCk6IFF1ZXVlIGRlcHRoIGFkanVzdGVkLWRvd24gdG8gJWQuXG4iLAotCQlmY3BvcnQtPnZoYS0+aG9zdF9ubywgc2Rldi0+Y2hhbm5lbCwgc2Rldi0+aWQsIHNkZXYtPmx1biwKLQkJc2Rldi0+cXVldWVfZGVwdGgpKTsKKwlxbF9kYmcocWxfZGJnX2lvLCBmY3BvcnQtPnZoYSwgMHgzMDI5LAorCSAgICAiUXVldWUgZGVwdGggYWRqdXN0ZWQtZG93biAiCisJICAgICJ0byAlZCBmb3Igc2NzaSglbGQ6JWQ6JWQ6JWQpLlxuIiwKKwkgICAgc2Rldi0+cXVldWVfZGVwdGgsIGZjcG9ydC0+dmhhLT5ob3N0X25vLAorCSAgICBzZGV2LT5jaGFubmVsLCBzZGV2LT5pZCwgc2Rldi0+bHVuKTsKIH0KIAogc3RhdGljIHZvaWQgcWxhMngwMF9hZGp1c3Rfc2Rldl9xZGVwdGhfdXAoc3RydWN0IHNjc2lfZGV2aWNlICpzZGV2LCBpbnQgcWRlcHRoKQogewogCWZjX3BvcnRfdCAqZmNwb3J0ID0gc2Rldi0+aG9zdGRhdGE7CiAJc3RydWN0IHNjc2lfcWxhX2hvc3QgKnZoYSA9IGZjcG9ydC0+dmhhOwotCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCByZXFfcXVlICpyZXEgPSBOVUxMOwogCiAJcmVxID0gdmhhLT5yZXE7CkBAIC0xMzI3LDEwICsxNDA0LDExIEBACiAJZWxzZQogCQlzY3NpX2FkanVzdF9xdWV1ZV9kZXB0aChzZGV2LCBNU0dfU0lNUExFX1RBRywgcWRlcHRoKTsKIAotCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JICAgICAgICJzY3NpKCVsZDolZDolZDolZCk6IFF1ZXVlIGRlcHRoIGFkanVzdGVkLXVwIHRvICVkLlxuIiwKLQkgICAgICAgZmNwb3J0LT52aGEtPmhvc3Rfbm8sIHNkZXYtPmNoYW5uZWwsIHNkZXYtPmlkLCBzZGV2LT5sdW4sCi0JICAgICAgIHNkZXYtPnF1ZXVlX2RlcHRoKSk7CisJcWxfZGJnKHFsX2RiZ19pbywgdmhhLCAweDMwMmEsCisJICAgICJRdWV1ZSBkZXB0aCBhZGp1c3RlZC11cCB0byAlZCBmb3IgIgorCSAgICAic2NzaSglbGQ6JWQ6JWQ6JWQpLlxuIiwKKwkgICAgc2Rldi0+cXVldWVfZGVwdGgsIGZjcG9ydC0+dmhhLT5ob3N0X25vLAorCSAgICBzZGV2LT5jaGFubmVsLCBzZGV2LT5pZCwgc2Rldi0+bHVuKTsKIH0KIAogc3RhdGljIGludApAQCAtMTc3Niw2ICsxODU0LDkgQEAKIAkJaGEtPmZsYWdzLnBvcnQwID0gMTsKIAllbHNlCiAJCWhhLT5mbGFncy5wb3J0MCA9IDA7CisJcWxfZGJnX3BjaShxbF9kYmdfaW5pdCwgaGEtPnBkZXYsIDB4MDAwYiwKKwkgICAgImRldmljZV90eXBlPTB4JXggcG9ydD0lZCBmd19zcmlzY19hZGRyZXNzPSVwLlxuIiwKKwkgICAgaGEtPmRldmljZV90eXBlLCBoYS0+ZmxhZ3MucG9ydDAsIGhhLT5md19zcmlzY19hZGRyZXNzKTsKIH0KIAogc3RhdGljIGludApAQCAtMTc5MCwxMCArMTg3MSw5IEBACiAKIAlpZiAocGNpX3JlcXVlc3Rfc2VsZWN0ZWRfcmVnaW9ucyhoYS0+cGRldiwgaGEtPmJhcnMsCiAJICAgIFFMQTJYWFhfRFJJVkVSX05BTUUpKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJGYWlsZWQgdG8gcmVzZXJ2ZSBQSU8vTU1JTyByZWdpb25zICglcylcbiIsCisJCXFsX2xvZ19wY2kocWxfbG9nX2ZhdGFsLCBoYS0+cGRldiwgMHgwMDExLAorCQkgICAgIkZhaWxlZCB0byByZXNlcnZlIFBJTy9NTUlPIHJlZ2lvbnMgKCVzKSwgYWJvcnRpbmcuXG4iLAogCQkgICAgcGNpX25hbWUoaGEtPnBkZXYpKTsKLQogCQlnb3RvIGlvc3BhY2VfZXJyb3JfZXhpdDsKIAl9CiAJaWYgKCEoaGEtPmJhcnMgJiAxKSkKQEAgLTE4MDMsMzkgKzE4ODMsNDIgQEAKIAlwaW8gPSBwY2lfcmVzb3VyY2Vfc3RhcnQoaGEtPnBkZXYsIDApOwogCWlmIChwY2lfcmVzb3VyY2VfZmxhZ3MoaGEtPnBkZXYsIDApICYgSU9SRVNPVVJDRV9JTykgewogCQlpZiAocGNpX3Jlc291cmNlX2xlbihoYS0+cGRldiwgMCkgPCBNSU5fSU9CQVNFX0xFTikgewotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJICAgICJJbnZhbGlkIFBDSSBJL08gcmVnaW9uIHNpemUgKCVzKS4uLlxuIiwKLQkJCQlwY2lfbmFtZShoYS0+cGRldikpOworCQkJcWxfbG9nX3BjaShxbF9sb2dfd2FybiwgaGEtPnBkZXYsIDB4MDAxMiwKKwkJCSAgICAiSW52YWxpZCBwY2kgSS9PIHJlZ2lvbiBzaXplICglcykuXG4iLAorCQkJICAgIHBjaV9uYW1lKGhhLT5wZGV2KSk7CiAJCQlwaW8gPSAwOwogCQl9CiAJfSBlbHNlIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgInJlZ2lvbiAjMCBub3QgYSBQSU8gcmVzb3VyY2UgKCVzKS4uLlxuIiwKKwkJcWxfbG9nX3BjaShxbF9sb2dfd2FybiwgaGEtPnBkZXYsIDB4MDAxMywKKwkJICAgICJSZWdpb24gIzAgbm8gYSBQSU8gcmVzb3VyY2UgKCVzKS5cbiIsCiAJCSAgICBwY2lfbmFtZShoYS0+cGRldikpOwogCQlwaW8gPSAwOwogCX0KIAloYS0+cGlvX2FkZHJlc3MgPSBwaW87CisJcWxfZGJnX3BjaShxbF9kYmdfaW5pdCwgaGEtPnBkZXYsIDB4MDAxNCwKKwkgICAgIlBJTyBhZGRyZXNzPSVwLlxuIiwKKwkgICAgaGEtPnBpb19hZGRyZXNzKTsKIAogc2tpcF9waW86CiAJLyogVXNlIE1NSU8gb3BlcmF0aW9ucyBmb3IgYWxsIGFjY2Vzc2VzLiAqLwogCWlmICghKHBjaV9yZXNvdXJjZV9mbGFncyhoYS0+cGRldiwgMSkgJiBJT1JFU09VUkNFX01FTSkpIHsKLQkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsCi0JCSAgICAicmVnaW9uICMxIG5vdCBhbiBNTUlPIHJlc291cmNlICglcyksIGFib3J0aW5nXG4iLAorCQlxbF9sb2dfcGNpKHFsX2xvZ19mYXRhbCwgaGEtPnBkZXYsIDB4MDAxNSwKKwkJICAgICJSZWdpb24gIzEgbm90IGFuIE1NSU8gcmVzb3VyY2UgKCVzKSwgYWJvcnRpbmcuXG4iLAogCQkgICAgcGNpX25hbWUoaGEtPnBkZXYpKTsKIAkJZ290byBpb3NwYWNlX2Vycm9yX2V4aXQ7CiAJfQogCWlmIChwY2lfcmVzb3VyY2VfbGVuKGhhLT5wZGV2LCAxKSA8IE1JTl9JT0JBU0VfTEVOKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLAotCQkgICAgIkludmFsaWQgUENJIG1lbSByZWdpb24gc2l6ZSAoJXMpLCBhYm9ydGluZ1xuIiwKLQkJCXBjaV9uYW1lKGhhLT5wZGV2KSk7CisJCXFsX2xvZ19wY2kocWxfbG9nX2ZhdGFsLCBoYS0+cGRldiwgMHgwMDE2LAorCQkgICAgIkludmFsaWQgUENJIG1lbSByZWdpb24gc2l6ZSAoJXMpLCBhYm9ydGluZy5cbiIsCisJCSAgICBwY2lfbmFtZShoYS0+cGRldikpOwogCQlnb3RvIGlvc3BhY2VfZXJyb3JfZXhpdDsKIAl9CiAKIAloYS0+aW9iYXNlID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoaGEtPnBkZXYsIDEpLCBNSU5fSU9CQVNFX0xFTik7CiAJaWYgKCFoYS0+aW9iYXNlKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLAotCQkgICAgImNhbm5vdCByZW1hcCBNTUlPICglcyksIGFib3J0aW5nXG4iLCBwY2lfbmFtZShoYS0+cGRldikpOwotCisJCXFsX2xvZ19wY2kocWxfbG9nX2ZhdGFsLCBoYS0+cGRldiwgMHgwMDE3LAorCQkgICAgIkNhbm5vdCByZW1hcCBNTUlPICglcyksIGFib3J0aW5nLlxuIiwKKwkJICAgIHBjaV9uYW1lKGhhLT5wZGV2KSk7CiAJCWdvdG8gaW9zcGFjZV9lcnJvcl9leGl0OwogCX0KIApAQCAtMTg0OSw2ICsxOTMyLDggQEAKIAloYS0+bXFpb2Jhc2UgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChoYS0+cGRldiwgMyksCiAJCQlwY2lfcmVzb3VyY2VfbGVuKGhhLT5wZGV2LCAzKSk7CiAJaWYgKGhhLT5tcWlvYmFzZSkgeworCQlxbF9kYmdfcGNpKHFsX2RiZ19pbml0LCBoYS0+cGRldiwgMHgwMDE4LAorCQkgICAgIk1RSU8gQmFzZT0lcC5cbiIsIGhhLT5tcWlvYmFzZSk7CiAJCS8qIFJlYWQgTVNJWCB2ZWN0b3Igc2l6ZSBvZiB0aGUgYm9hcmQgKi8KIAkJcGNpX3JlYWRfY29uZmlnX3dvcmQoaGEtPnBkZXYsIFFMQV9QQ0lfTVNJWF9DT05UUk9MLCAmbXNpeCk7CiAJCWhhLT5tc2l4X2NvdW50ID0gbXNpeDsKQEAgLTE4NjEsMTcgKzE5NDYsMjQgQEAKIAkJCWhhLT5tYXhfcmVxX3F1ZXVlcyA9IDI7CiAJCX0gZWxzZSBpZiAocWwyeG1heHF1ZXVlcyA+IDEpIHsKIAkJCWhhLT5tYXhfcmVxX3F1ZXVlcyA9IHFsMnhtYXhxdWV1ZXMgPiBRTEFfTVFfU0laRSA/Ci0JCQkJCQlRTEFfTVFfU0laRSA6IHFsMnhtYXhxdWV1ZXM7Ci0JCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiUW9TIG1vZGUgc2V0LCBtYXggbm8iCi0JCQkiIG9mIHJlcXVlc3QgcXVldWVzOiVkXG4iLCBoYS0+bWF4X3JlcV9xdWV1ZXMpKTsKKwkJCSAgICBRTEFfTVFfU0laRSA6IHFsMnhtYXhxdWV1ZXM7CisJCQlxbF9kYmdfcGNpKHFsX2RiZ19tdWx0aXEsIGhhLT5wZGV2LCAweGMwMDgsCisJCQkgICAgIlFvUyBtb2RlIHNldCwgbWF4IG5vIG9mIHJlcXVlc3QgcXVldWVzOiVkLlxuIiwKKwkJCSAgICBoYS0+bWF4X3JlcV9xdWV1ZXMpOworCQkJcWxfZGJnX3BjaShxbF9kYmdfaW5pdCwgaGEtPnBkZXYsIDB4MDAxOSwKKwkJCSAgICAiUW9TIG1vZGUgc2V0LCBtYXggbm8gb2YgcmVxdWVzdCBxdWV1ZXM6JWQuXG4iLAorCQkJICAgIGhhLT5tYXhfcmVxX3F1ZXVlcyk7CiAJCX0KLQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJIk1TSS1YIHZlY3RvciBjb3VudDogJWRcbiIsIG1zaXgpOworCQlxbF9sb2dfcGNpKHFsX2xvZ19pbmZvLCBoYS0+cGRldiwgMHgwMDFhLAorCQkgICAgIk1TSS1YIHZlY3RvciBjb3VudDogJWQuXG4iLCBtc2l4KTsKIAl9IGVsc2UKLQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiQkFSIDMgbm90IGVuYWJsZWRcbiIpOworCQlxbF9sb2dfcGNpKHFsX2xvZ19pbmZvLCBoYS0+cGRldiwgMHgwMDFiLAorCQkgICAgIkJBUiAzIG5vdCBlbmFibGVkLlxuIik7CiAKIG1xaW9iYXNlX2V4aXQ6CiAJaGEtPm1zaXhfY291bnQgPSBoYS0+bWF4X3JzcF9xdWV1ZXMgKyAxOworCXFsX2RiZ19wY2kocWxfZGJnX2luaXQsIGhhLT5wZGV2LCAweDAwMWMsCisJICAgICJNU0lYIENvdW50OiVkLlxuIiwgaGEtPm1zaXhfY291bnQpOwogCXJldHVybiAoMCk7CiAKIGlvc3BhY2VfZXJyb3JfZXhpdDoKQEAgLTE5MzUsNyArMjAyNywxMSBAQAogCSAgICBwZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9RTE9HSUNfSVNQODAyMSkgewogCQliYXJzID0gcGNpX3NlbGVjdF9iYXJzKHBkZXYsIElPUkVTT1VSQ0VfTUVNKTsKIAkJbWVtX29ubHkgPSAxOworCQlxbF9kYmdfcGNpKHFsX2RiZ19pbml0LCBwZGV2LCAweDAwMDcsCisJCSAgICAiTWVtIG9ubHkgYWRhcHRlci5cbiIpOwogCX0KKwlxbF9kYmdfcGNpKHFsX2RiZ19pbml0LCBwZGV2LCAweDAwMDgsCisJICAgICJCYXJzPSVkLlxuIiwgYmFycyk7CiAKIAlpZiAobWVtX29ubHkpIHsKIAkJaWYgKHBjaV9lbmFibGVfZGV2aWNlX21lbShwZGV2KSkKQEAgLTE5NTAsOSArMjA0NiwxMiBAQAogCiAJaGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcWxhX2h3X2RhdGEpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWhhKSB7Ci0JCURFQlVHKHByaW50aygiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgaGFcbiIpKTsKKwkJcWxfbG9nX3BjaShxbF9sb2dfZmF0YWwsIHBkZXYsIDB4MDAwOSwKKwkJICAgICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBoYS5cbiIpOwogCQlnb3RvIHByb2JlX291dDsKIAl9CisJcWxfZGJnX3BjaShxbF9kYmdfaW5pdCwgcGRldiwgMHgwMDBhLAorCSAgICAiTWVtb3J5IGFsbG9jYXRlZCBmb3IgaGE9JXAuXG4iLCBoYSk7CiAJaGEtPnBkZXYgPSBwZGV2OwogCiAJLyogQ2xlYXIgb3VyIGRhdGEgYXJlYSAqLwpAQCAtMTk3NCwxMCArMjA3Myw5IEBACiAJaWYgKHJldCkKIAkJZ290byBwcm9iZV9od19mYWlsZWQ7CiAKLQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JICAgICJGb3VuZCBhbiBJU1AlMDRYLCBpcnEgJWQsIGlvYmFzZSAweCVwXG4iLCBwZGV2LT5kZXZpY2UsIHBkZXYtPmlycSwKLQkgICAgaGEtPmlvYmFzZSk7Ci0KKwlxbF9sb2dfcGNpKHFsX2xvZ19pbmZvLCBwZGV2LCAweDAwMWQsCisJICAgICJGb3VuZCBhbiBJU1AlMDRYIGlycSAlZCBpb2Jhc2UgMHglcC5cbiIsCisJICAgIHBkZXYtPmRldmljZSwgcGRldi0+aXJxLCBoYS0+aW9iYXNlKTsKIAloYS0+cHJldl90b3BvbG9neSA9IDA7CiAJaGEtPmluaXRfY2Jfc2l6ZSA9IHNpemVvZihpbml0X2NiX3QpOwogCWhhLT5saW5rX2RhdGFfcmF0ZSA9IFBPUlRfU1BFRURfVU5LTk9XTjsKQEAgLTIwNzgsNyArMjE3NiwxOCBAQAogCQloYS0+bnZyYW1fY29uZl9vZmYgPSBGQVJYX0FDQ0VTU19OVlJBTV9DT05GOwogCQloYS0+bnZyYW1fZGF0YV9vZmYgPSBGQVJYX0FDQ0VTU19OVlJBTV9EQVRBOwogCX0KLQorCXFsX2RiZ19wY2kocWxfZGJnX2luaXQsIHBkZXYsIDB4MDAxZSwKKwkgICAgIm1ieF9jb3VudD0lZCwgcmVxX2xlbmd0aD0lZCwgIgorCSAgICAicnNwX2xlbmd0aD0lZCwgbWF4X2xvb3BfaWQ9JWQsIGluaXRfY2Jfc2l6ZT0lZCwgIgorCSAgICAiZ2lkX2xpc3RfaW5mb19zaXplPSVkLCBvcHRyb21fc2l6ZT0lZCwgbnZyYW1fbnBpdl9zaXplPSVkLCAuXG4iLAorCSAgICBoYS0+bWJ4X2NvdW50LCByZXFfbGVuZ3RoLCByc3BfbGVuZ3RoLCBoYS0+bWF4X2xvb3BfaWQsCisJICAgIGhhLT5pbml0X2NiX3NpemUsIGhhLT5naWRfbGlzdF9pbmZvX3NpemUsIGhhLT5vcHRyb21fc2l6ZSwKKwkgICAgaGEtPm52cmFtX25waXZfc2l6ZSk7CisJcWxfZGJnX3BjaShxbF9kYmdfaW5pdCwgcGRldiwgMHgwMDFmLAorCSAgICAiaXNwX29wcz0lcCwgZmxhc2hfY29uZl9vZmY9JWQsICIKKwkgICAgImZsYXNoX2RhdGFfb2ZmPSVkLCBudnJhbV9jb25mX29mZj0lZCwgbnZyYW1fZGF0YV9vZmY9JWQuXG4iLAorCSAgICBoYS0+aXNwX29wcywgaGEtPmZsYXNoX2NvbmZfb2ZmLCBoYS0+Zmxhc2hfZGF0YV9vZmYsCisJICAgIGhhLT5udnJhbV9jb25mX29mZiwgaGEtPm52cmFtX2RhdGFfb2ZmKTsKIAltdXRleF9pbml0KCZoYS0+dnBvcnRfbG9jayk7CiAJaW5pdF9jb21wbGV0aW9uKCZoYS0+bWJ4X2NtZF9jb21wKTsKIAljb21wbGV0ZSgmaGEtPm1ieF9jbWRfY29tcCk7CkBAIC0yMDg4LDEwICsyMTk3LDE0IEBACiAJc2V0X2JpdCgwLCAodW5zaWduZWQgbG9uZyAqKSBoYS0+dnBfaWR4X21hcCk7CiAKIAlxbGEyeDAwX2NvbmZpZ19kbWFfYWRkcmVzc2luZyhoYSk7CisJcWxfZGJnX3BjaShxbF9kYmdfaW5pdCwgcGRldiwgMHgwMDIwLAorCSAgICAiNjQgQml0IGFkZHJlc3NpbmcgaXMgJXMuXG4iLAorCSAgICBoYS0+ZmxhZ3MuZW5hYmxlXzY0Yml0X2FkZHJlc3NpbmcgPyAiZW5hYmxlIiA6CisJICAgICJkaXNhYmxlIik7CiAJcmV0ID0gcWxhMngwMF9tZW1fYWxsb2MoaGEsIHJlcV9sZW5ndGgsIHJzcF9sZW5ndGgsICZyZXEsICZyc3ApOwogCWlmICghcmV0KSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJbRVJST1JdIEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGFkYXB0ZXJcbiIpOworCQlxbF9sb2dfcGNpKHFsX2xvZ19mYXRhbCwgcGRldiwgMHgwMDMxLAorCQkgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGFkYXB0ZXIsIGFib3J0aW5nLlxuIik7CiAKIAkJZ290byBwcm9iZV9od19mYWlsZWQ7CiAJfQpAQCAtMjEwMyw5ICsyMjE2LDYgQEAKIAogCWJhc2VfdmhhID0gcWxhMngwMF9jcmVhdGVfaG9zdChzaHQsIGhhKTsKIAlpZiAoIWJhc2VfdmhhKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJbRVJST1JdIEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHNjc2lfaG9zdFxuIik7Ci0KIAkJcmV0ID0gLUVOT01FTTsKIAkJcWxhMngwMF9tZW1fZnJlZShoYSk7CiAJCXFsYTJ4MDBfZnJlZV9yZXFfcXVlKGhhLCByZXEpOwpAQCAtMjEzMiw3ICsyMjQyLDExIEBACiAJCWlmICghSVNfUUxBODJYWChoYSkpCiAJCQlob3N0LT5zZ190YWJsZXNpemUgPSBRTEFfU0dfQUxMOwogCX0KLQorCXFsX2RiZyhxbF9kYmdfaW5pdCwgYmFzZV92aGEsIDB4MDAzMiwKKwkgICAgImNhbl9xdWV1ZT0lZCwgcmVxPSVwLCAiCisJICAgICJtZ210X3N2cl9sb29wX2lkPSVkLCBzZ190YWJsZXNpemU9JWQuXG4iLAorCSAgICBob3N0LT5jYW5fcXVldWUsIGJhc2VfdmhhLT5yZXEsCisJICAgIGJhc2VfdmhhLT5tZ210X3N2cl9sb29wX2lkLCBob3N0LT5zZ190YWJsZXNpemUpOwogCWhvc3QtPm1heF9pZCA9IG1heF9pZDsKIAlob3N0LT50aGlzX2lkID0gMjU1OwogCWhvc3QtPmNtZF9wZXJfbHVuID0gMzsKQEAgLTIxNDYsNiArMjI2MCwxNCBAQAogCWhvc3QtPnRyYW5zcG9ydHQgPSBxbGEyeHh4X3RyYW5zcG9ydF90ZW1wbGF0ZTsKIAlzaHQtPnZlbmRvcl9pZCA9IChTQ1NJX05MX1ZJRF9UWVBFX1BDSSB8IFBDSV9WRU5ET1JfSURfUUxPR0lDKTsKIAorCXFsX2RiZyhxbF9kYmdfaW5pdCwgYmFzZV92aGEsIDB4MDAzMywKKwkgICAgIm1heF9pZD0lZCB0aGlzX2lkPSVkICIKKwkgICAgImNtZF9wZXJfbGVuPSVkIHVuaXF1ZV9pZD0lZCBtYXhfY21kX2xlbj0lZCBtYXhfY2hhbm5lbD0lZCAiCisJICAgICJtYXhfbHVuPSVkIHRyYW5zcG9ydHQ9JXAsIHZlbmRvcl9pZD0lZC5cbiIsIGhvc3QtPm1heF9pZCwKKwkgICAgaG9zdC0+dGhpc19pZCwgaG9zdC0+Y21kX3Blcl9sdW4sIGhvc3QtPnVuaXF1ZV9pZCwKKwkgICAgaG9zdC0+bWF4X2NtZF9sZW4sIGhvc3QtPm1heF9jaGFubmVsLCBob3N0LT5tYXhfbHVuLAorCSAgICBob3N0LT50cmFuc3BvcnR0LCBzaHQtPnZlbmRvcl9pZCk7CisKIAkvKiBTZXQgdXAgdGhlIGlycXMgKi8KIAlyZXQgPSBxbGEyeDAwX3JlcXVlc3RfaXJxcyhoYSwgcnNwKTsKIAlpZiAocmV0KQpAQCAtMjE1Niw5ICsyMjc4LDggQEAKIAkvKiBBbGxvYyBhcnJheXMgb2YgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcmluZyBwdHJzICovCiBxdWVfaW5pdDoKIAlpZiAoIXFsYTJ4MDBfYWxsb2NfcXVldWVzKGhhKSkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSJbRVJST1JdIEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHF1ZXVlIgotCQkiIHBvaW50ZXJzXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgYmFzZV92aGEsIDB4MDAzZCwKKwkJICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBxdWV1ZSBwb2ludGVycy4uIGFib3J0aW5nLlxuIik7CiAJCWdvdG8gcHJvYmVfaW5pdF9mYWlsZWQ7CiAJfQogCkBAIC0yMTg2LDIwICsyMzA3LDMzIEBACiAJCXJzcC0+cnNwX3Ffb3V0ID0gJmhhLT5pb2Jhc2UtPmlzcDgyLnJzcF9xX291dFswXTsKIAl9CiAKLQlpZiAocWxhMngwMF9pbml0aWFsaXplX2FkYXB0ZXIoYmFzZV92aGEpKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBhZGFwdGVyXG4iKTsKKwlxbF9kYmcocWxfZGJnX211bHRpcSwgYmFzZV92aGEsIDB4YzAwOSwKKwkgICAgInJzcF9xX21hcD0lcCByZXFfcV9tYXA9JXAgcnNwLT5yZXE9JXAgcmVxLT5yc3A9JXAuXG4iLAorCSAgICBoYS0+cnNwX3FfbWFwLCBoYS0+cmVxX3FfbWFwLCByc3AtPnJlcSwgcmVxLT5yc3ApOworCXFsX2RiZyhxbF9kYmdfbXVsdGlxLCBiYXNlX3ZoYSwgMHhjMDBhLAorCSAgICAicmVxLT5yZXFfcV9pbj0lcCByZXEtPnJlcV9xX291dD0lcCAiCisJICAgICJyc3AtPnJzcF9xX2luPSVwIHJzcC0+cnNwX3Ffb3V0PSVwLlxuIiwKKwkgICAgcmVxLT5yZXFfcV9pbiwgcmVxLT5yZXFfcV9vdXQsCisJICAgIHJzcC0+cnNwX3FfaW4sIHJzcC0+cnNwX3Ffb3V0KTsKKwlxbF9kYmcocWxfZGJnX2luaXQsIGJhc2VfdmhhLCAweDAwM2UsCisJICAgICJyc3BfcV9tYXA9JXAgcmVxX3FfbWFwPSVwIHJzcC0+cmVxPSVwIHJlcS0+cnNwPSVwLlxuIiwKKwkgICAgaGEtPnJzcF9xX21hcCwgaGEtPnJlcV9xX21hcCwgcnNwLT5yZXEsIHJlcS0+cnNwKTsKKwlxbF9kYmcocWxfZGJnX2luaXQsIGJhc2VfdmhhLCAweDAwM2YsCisJICAgICJyZXEtPnJlcV9xX2luPSVwIHJlcS0+cmVxX3Ffb3V0PSVwIHJzcC0+cnNwX3FfaW49JXAgcnNwLT5yc3BfcV9vdXQ9JXAuXG4iLAorCSAgICByZXEtPnJlcV9xX2luLCByZXEtPnJlcV9xX291dCwgcnNwLT5yc3BfcV9pbiwgcnNwLT5yc3BfcV9vdXQpOwogCi0JCURFQlVHMihwcmludGsoInNjc2koJWxkKTogRmFpbGVkIHRvIGluaXRpYWxpemUgYWRhcHRlciAtICIKLQkJICAgICJBZGFwdGVyIGZsYWdzICV4LlxuIiwKLQkJICAgIGJhc2VfdmhhLT5ob3N0X25vLCBiYXNlX3ZoYS0+ZGV2aWNlX2ZsYWdzKSk7CisJaWYgKHFsYTJ4MDBfaW5pdGlhbGl6ZV9hZGFwdGVyKGJhc2VfdmhhKSkgeworCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCBiYXNlX3ZoYSwgMHgwMGQ2LAorCQkgICAgIkZhaWxlZCB0byBpbml0aWFsaXplIGFkYXB0ZXIgLSBBZGFwdGVyIGZsYWdzICV4LlxuIiwKKwkJICAgIGJhc2VfdmhhLT5kZXZpY2VfZmxhZ3MpOwogCiAJCWlmIChJU19RTEE4MlhYKGhhKSkgewogCQkJcWxhODJ4eF9pZGNfbG9jayhoYSk7CiAJCQlxbGE4Mnh4X3dyXzMyKGhhLCBRTEE4MlhYX0NSQl9ERVZfU1RBVEUsCiAJCQkJUUxBODJYWF9ERVZfRkFJTEVEKTsKIAkJCXFsYTgyeHhfaWRjX3VubG9jayhoYSk7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJIVyBTdGF0ZTogRkFJTEVEXG4iKTsKKwkJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIGJhc2VfdmhhLCAweDAwZDcsCisJCQkgICAgIkhXIFN0YXRlOiBGQUlMRUQuXG4iKTsKIAkJfQogCiAJCXJldCA9IC1FTk9ERVY7CkBAIC0yMjA4LDkgKzIzNDIsOCBAQAogCiAJaWYgKGhhLT5tcWVuYWJsZSkgewogCQlpZiAocWxhMjV4eF9zZXR1cF9tb2RlKGJhc2VfdmhhKSkgewotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJCSJDYW4ndCBjcmVhdGUgcXVldWVzLCBmYWxsaW5nIGJhY2sgdG8gc2luZ2xlIgotCQkJCSIgcXVldWUgbW9kZVxuIik7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIGJhc2VfdmhhLCAweDAwZWMsCisJCQkgICAgIkZhaWxlZCB0byBjcmVhdGUgcXVldWVzLCBmYWxsaW5nIGJhY2sgdG8gc2luZ2xlIHF1ZXVlIG1vZGUuXG4iKTsKIAkJCWdvdG8gcXVlX2luaXQ7CiAJCX0KIAl9CkBAIC0yMjIyLDEzICsyMzU1LDE1IEBACiAJICogU3RhcnR1cCB0aGUga2VybmVsIHRocmVhZCBmb3IgdGhpcyBob3N0IGFkYXB0ZXIKIAkgKi8KIAloYS0+ZHBjX3RocmVhZCA9IGt0aHJlYWRfY3JlYXRlKHFsYTJ4MDBfZG9fZHBjLCBoYSwKLQkJCSIlc19kcGMiLCBiYXNlX3ZoYS0+aG9zdF9zdHIpOworCSAgICAiJXNfZHBjIiwgYmFzZV92aGEtPmhvc3Rfc3RyKTsKIAlpZiAoSVNfRVJSKGhhLT5kcGNfdGhyZWFkKSkgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCSAgICAiVW5hYmxlIHRvIHN0YXJ0IERQQyB0aHJlYWQhXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgYmFzZV92aGEsIDB4MDBlZCwKKwkJICAgICJGYWlsZWQgdG8gc3RhcnQgRFBDIHRocmVhZC5cbiIpOwogCQlyZXQgPSBQVFJfRVJSKGhhLT5kcGNfdGhyZWFkKTsKIAkJZ290byBwcm9iZV9mYWlsZWQ7CiAJfQorCXFsX2RiZyhxbF9kYmdfaW5pdCwgYmFzZV92aGEsIDB4MDBlZSwKKwkgICAgIkRQQyB0aHJlYWQgc3RhcnRlZCBzdWNjZXNzZnVsbHkuXG4iKTsKIAogc2tpcF9kcGM6CiAJbGlzdF9hZGRfdGFpbCgmYmFzZV92aGEtPmxpc3QsICZoYS0+dnBfbGlzdCk7CkBAIC0yMjM2LDE2ICsyMzcxLDE4IEBACiAKIAkvKiBJbml0aWFsaXplZCB0aGUgdGltZXIgKi8KIAlxbGEyeDAwX3N0YXJ0X3RpbWVyKGJhc2VfdmhhLCBxbGEyeDAwX3RpbWVyLCBXQVRDSF9JTlRFUlZBTCk7Ci0KLQlERUJVRzIocHJpbnRrKCJERUJVRzogZGV0ZWN0IGhiYSAlbGQgYXQgYWRkcmVzcyA9ICVwXG4iLAotCSAgICBiYXNlX3ZoYS0+aG9zdF9ubywgaGEpKTsKKwlxbF9kYmcocWxfZGJnX2luaXQsIGJhc2VfdmhhLCAweDAwZWYsCisJICAgICJTdGFydGVkIHFsYTJ4MDBfdGltZXIgd2l0aCAiCisJICAgICJpbnRlcnZhbD0lZC5cbiIsIFdBVENIX0lOVEVSVkFMKTsKKwlxbF9kYmcocWxfZGJnX2luaXQsIGJhc2VfdmhhLCAweDAwZjAsCisJICAgICJEZXRlY3RlZCBoYmEgYXQgYWRkcmVzcz0lcC5cbiIsCisJICAgIGhhKTsKIAogCWlmICgoSVNfUUxBMjVYWChoYSkgfHwgSVNfUUxBODFYWChoYSkpICYmIHFsMnhlbmFibGVkaWYpIHsKIAkJaWYgKGhhLT5md19hdHRyaWJ1dGVzICYgQklUXzQpIHsKIAkJCWJhc2VfdmhhLT5mbGFncy5kaWZkaXhfc3VwcG9ydGVkID0gMTsKLQkJCURFQlVHMTgocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJICAgICJSZWdpc3RlcmluZyBmb3IgRElGL0RJWCB0eXBlIDEgYW5kIDMiCi0JCQkgICAgIiBwcm90ZWN0aW9uLlxuIikpOworCQkJcWxfZGJnKHFsX2RiZ19pbml0LCBiYXNlX3ZoYSwgMHgwMGYxLAorCQkJICAgICJSZWdpc3RlcmluZyBmb3IgRElGL0RJWCB0eXBlIDEgYW5kIDMgcHJvdGVjdGlvbi5cbiIpOwogCQkJc2NzaV9ob3N0X3NldF9wcm90KGhvc3QsCiAJCQkgICAgU0hPU1RfRElGX1RZUEUxX1BST1RFQ1RJT04KIAkJCSAgICB8IFNIT1NUX0RJRl9UWVBFMl9QUk9URUNUSU9OCkBAIC0yMjY3LDYgKzI0MDQsOSBAQAogCWJhc2VfdmhhLT5mbGFncy5pbml0X2RvbmUgPSAxOwogCWJhc2VfdmhhLT5mbGFncy5vbmxpbmUgPSAxOwogCisJcWxfZGJnKHFsX2RiZ19pbml0LCBiYXNlX3ZoYSwgMHgwMGYyLAorCSAgICAiSW5pdCBkb25lIGFuZCBoYmEgaXMgb25saW5lLlxuIik7CisKIAlzY3NpX3NjYW5faG9zdChob3N0KTsKIAogCXFsYTJ4MDBfYWxsb2Nfc3lzZnNfYXR0cihiYXNlX3ZoYSk7CkBAIC0yMjc1LDE0ICsyNDE1LDE3IEBACiAKIAlxbGEyeDAwX2Rmc19zZXR1cChiYXNlX3ZoYSk7CiAKLQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJcbiIKLQkgICAgIiBRTG9naWMgRmlicmUgQ2hhbm5lbCBIQkEgRHJpdmVyOiAlc1xuIgotCSAgICAiICBRTG9naWMgJXMgLSAlc1xuIgotCSAgICAiICBJU1AlMDRYOiAlcyBAICVzIGhkbWElYywgaG9zdCM9JWxkLCBmdz0lc1xuIiwKLQkgICAgcWxhMngwMF92ZXJzaW9uX3N0ciwgaGEtPm1vZGVsX251bWJlciwKLQkgICAgaGEtPm1vZGVsX2Rlc2MgPyBoYS0+bW9kZWxfZGVzYyA6ICIiLCBwZGV2LT5kZXZpY2UsCi0JICAgIGhhLT5pc3Bfb3BzLT5wY2lfaW5mb19zdHIoYmFzZV92aGEsIHBjaV9pbmZvKSwgcGNpX25hbWUocGRldiksCi0JICAgIGhhLT5mbGFncy5lbmFibGVfNjRiaXRfYWRkcmVzc2luZyA/ICcrJyA6ICctJywgYmFzZV92aGEtPmhvc3Rfbm8sCisJcWxfbG9nKHFsX2xvZ19pbmZvLCBiYXNlX3ZoYSwgMHgwMGZhLAorCSAgICAiUUxvZ2ljIEZpYnJlIENoYW5uZWQgSEJBIERyaXZlcjogJXMuXG4iLAorCSAgICBxbGEyeDAwX3ZlcnNpb25fc3RyKTsKKwlxbF9sb2cocWxfbG9nX2luZm8sIGJhc2VfdmhhLCAweDAwZmIsCisJICAgICJRTG9naWMgJXMgLSAlcy5cbiIsCisJICAgIGhhLT5tb2RlbF9udW1iZXIsIGhhLT5tb2RlbF9kZXNjID8gaGEtPm1vZGVsX2Rlc2MgOiAiIik7CisJcWxfbG9nKHFsX2xvZ19pbmZvLCBiYXNlX3ZoYSwgMHgwMGZjLAorCSAgICAiSVNQJTA0WDogJXMgQCAlcyBoZG1hJWMgaG9zdCM9JWxkIGZ3PSVzLlxuIiwKKwkgICAgcGRldi0+ZGV2aWNlLCBoYS0+aXNwX29wcy0+cGNpX2luZm9fc3RyKGJhc2VfdmhhLCBwY2lfaW5mbyksCisJICAgIHBjaV9uYW1lKHBkZXYpLCBoYS0+ZmxhZ3MuZW5hYmxlXzY0Yml0X2FkZHJlc3NpbmcgPyAnKycgOiAnLScsCisJICAgIGJhc2VfdmhhLT5ob3N0X25vLAogCSAgICBoYS0+aXNwX29wcy0+ZndfdmVyc2lvbl9zdHIoYmFzZV92aGEsIGZ3X3N0cikpOwogCiAJcmV0dXJuIDA7CkBAIC0yNTgwLDIwICsyNzIzLDE1IEBACiAJCWZjcG9ydC0+bG9naW5fcmV0cnkgPSB2aGEtPmh3LT5sb2dpbl9yZXRyeV9jb3VudDsKIAkJc2V0X2JpdChSRUxPR0lOX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKTsKIAotCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogUG9ydCBsb2dpbiByZXRyeTogIgorCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDY3LAorCQkgICAgIlBvcnQgbG9naW4gcmV0cnkgIgogCQkgICAgIiUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4LCAiCi0JCSAgICAiaWQgPSAweCUwNHggcmV0cnkgY250PSVkXG4iLAotCQkgICAgdmhhLT5ob3N0X25vLAotCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbMF0sCi0JCSAgICBmY3BvcnQtPnBvcnRfbmFtZVsxXSwKLQkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzJdLAotCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbM10sCi0JCSAgICBmY3BvcnQtPnBvcnRfbmFtZVs0XSwKLQkJICAgIGZjcG9ydC0+cG9ydF9uYW1lWzVdLAotCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbNl0sCi0JCSAgICBmY3BvcnQtPnBvcnRfbmFtZVs3XSwKLQkJICAgIGZjcG9ydC0+bG9vcF9pZCwKLQkJICAgIGZjcG9ydC0+bG9naW5fcmV0cnkpKTsKKwkJICAgICJpZCA9IDB4JTA0eCByZXRyeSBjbnQ9JWQuXG4iLAorCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbMF0sIGZjcG9ydC0+cG9ydF9uYW1lWzFdLAorCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbMl0sIGZjcG9ydC0+cG9ydF9uYW1lWzNdLAorCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbNF0sIGZjcG9ydC0+cG9ydF9uYW1lWzVdLAorCQkgICAgZmNwb3J0LT5wb3J0X25hbWVbNl0sIGZjcG9ydC0+cG9ydF9uYW1lWzddLAorCQkgICAgZmNwb3J0LT5sb29wX2lkLCBmY3BvcnQtPmxvZ2luX3JldHJ5KTsKIAl9CiB9CiAKQEAgLTI2NzYsNiArMjgxNCw5IEBACiAJCQljdHhfY2FjaGVwKTsKIAkJaWYgKCFoYS0+Y3R4X21lbXBvb2wpCiAJCQlnb3RvIGZhaWxfZnJlZV9zcmJfbWVtcG9vbDsKKwkJcWxfZGJnX3BjaShxbF9kYmdfaW5pdCwgaGEtPnBkZXYsIDB4MDAyMSwKKwkJICAgICJjdHhfY2FjaGVwPSVwIGN0eF9tZW1wb29sPSVwLlxuIiwKKwkJICAgIGN0eF9jYWNoZXAsIGhhLT5jdHhfbWVtcG9vbCk7CiAJfQogCiAJLyogR2V0IG1lbW9yeSBmb3IgY2FjaGVkIE5WUkFNICovCkBAIC0yNjkwLDIyICsyODMxLDI5IEBACiAJaWYgKCFoYS0+c19kbWFfcG9vbCkKIAkJZ290byBmYWlsX2ZyZWVfbnZyYW07CiAKKwlxbF9kYmdfcGNpKHFsX2RiZ19pbml0LCBoYS0+cGRldiwgMHgwMDIyLAorCSAgICAiaW5pdF9jYj0lcCBnaWRfbGlzdD0lcCwgc3JiX21lbXBvb2w9JXAgc19kbWFfcG9vbD0lcC5cbiIsCisJICAgIGhhLT5pbml0X2NiLCBoYS0+Z2lkX2xpc3QsIGhhLT5zcmJfbWVtcG9vbCwgaGEtPnNfZG1hX3Bvb2wpOworCiAJaWYgKElTX1FMQTgyWFgoaGEpIHx8IHFsMnhlbmFibGVkaWYpIHsKIAkJaGEtPmRsX2RtYV9wb29sID0gZG1hX3Bvb2xfY3JlYXRlKG5hbWUsICZoYS0+cGRldi0+ZGV2LAogCQkJRFNEX0xJU1RfRE1BX1BPT0xfU0laRSwgOCwgMCk7CiAJCWlmICghaGEtPmRsX2RtYV9wb29sKSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkgICAgIk1lbW9yeSBBbGxvY2F0aW9uIGZhaWxlZCAtIGRsX2RtYV9wb29sXG4iKTsKKwkJCXFsX2xvZ19wY2kocWxfbG9nX2ZhdGFsLCBoYS0+cGRldiwgMHgwMDIzLAorCQkJICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBkbF9kbWFfcG9vbC5cbiIpOwogCQkJZ290byBmYWlsX3NfZG1hX3Bvb2w7CiAJCX0KIAogCQloYS0+ZmNwX2NtbmRfZG1hX3Bvb2wgPSBkbWFfcG9vbF9jcmVhdGUobmFtZSwgJmhhLT5wZGV2LT5kZXYsCiAJCQlGQ1BfQ01ORF9ETUFfUE9PTF9TSVpFLCA4LCAwKTsKIAkJaWYgKCFoYS0+ZmNwX2NtbmRfZG1hX3Bvb2wpIHsKLQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSAgICAiTWVtb3J5IEFsbG9jYXRpb24gZmFpbGVkIC0gZmNwX2NtbmRfZG1hX3Bvb2xcbiIpOworCQkJcWxfbG9nX3BjaShxbF9sb2dfZmF0YWwsIGhhLT5wZGV2LCAweDAwMjQsCisJCQkgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGZjcF9jbW5kX2RtYV9wb29sLlxuIik7CiAJCQlnb3RvIGZhaWxfZGxfZG1hX3Bvb2w7CiAJCX0KKwkJcWxfZGJnX3BjaShxbF9kYmdfaW5pdCwgaGEtPnBkZXYsIDB4MDAyNSwKKwkJICAgICJkbF9kbWFfcG9vbD0lcCBmY3BfY21uZF9kbWFfcG9vbD0lcC5cbiIsCisJCSAgICBoYS0+ZGxfZG1hX3Bvb2wsIGhhLT5mY3BfY21uZF9kbWFfcG9vbCk7CiAJfQogCiAJLyogQWxsb2NhdGUgbWVtb3J5IGZvciBTTlMgY29tbWFuZHMgKi8KQEAgLTI3MTUsNiArMjg2Myw4IEBACiAJCXNpemVvZihzdHJ1Y3Qgc25zX2NtZF9wa3QpLCAmaGEtPnNuc19jbWRfZG1hLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFoYS0+c25zX2NtZCkKIAkJCWdvdG8gZmFpbF9kbWFfcG9vbDsKKwkJcWxfZGJnX3BjaShxbF9kYmdfaW5pdCwgaGEtPnBkZXYsIDB4MDAyNiwKKwkJICAgICJzbnNfY21kLlxuIiwgaGEtPnNuc19jbWQpOwogCX0gZWxzZSB7CiAJLyogR2V0IGNvbnNpc3RlbnQgbWVtb3J5IGFsbG9jYXRlZCBmb3IgTVMgSU9DQiAqLwogCQloYS0+bXNfaW9jYiA9IGRtYV9wb29sX2FsbG9jKGhhLT5zX2RtYV9wb29sLCBHRlBfS0VSTkVMLApAQCAtMjcyNiwxMiArMjg3NiwxNiBAQAogCQkJc2l6ZW9mKHN0cnVjdCBjdF9zbnNfcGt0KSwgJmhhLT5jdF9zbnNfZG1hLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFoYS0+Y3Rfc25zKQogCQkJZ290byBmYWlsX2ZyZWVfbXNfaW9jYjsKKwkJcWxfZGJnX3BjaShxbF9kYmdfaW5pdCwgaGEtPnBkZXYsIDB4MDAyNywKKwkJICAgICJtc19pb2NiPSVwIGN0X3Nucz0lcC5cbiIsCisJCSAgICBoYS0+bXNfaW9jYiwgaGEtPmN0X3Nucyk7CiAJfQogCiAJLyogQWxsb2NhdGUgbWVtb3J5IGZvciByZXF1ZXN0IHJpbmcgKi8KIAkqcmVxID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHJlcV9xdWUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoISpyZXEpIHsKLQkJREVCVUcocHJpbnRrKCJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciByZXFcbiIpKTsKKwkJcWxfbG9nX3BjaShxbF9sb2dfZmF0YWwsIGhhLT5wZGV2LCAweDAwMjgsCisJCSAgICAiRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcmVxLlxuIik7CiAJCWdvdG8gZmFpbF9yZXE7CiAJfQogCSgqcmVxKS0+bGVuZ3RoID0gcmVxX2xlbjsKQEAgLTI3MzksMTQgKzI4OTMsMTUgQEAKIAkJKCgqcmVxKS0+bGVuZ3RoICsgMSkgKiBzaXplb2YocmVxdWVzdF90KSwKIAkJJigqcmVxKS0+ZG1hLCBHRlBfS0VSTkVMKTsKIAlpZiAoISgqcmVxKS0+cmluZykgewotCQlERUJVRyhwcmludGsoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlcV9yaW5nXG4iKSk7CisJCXFsX2xvZ19wY2kocWxfbG9nX2ZhdGFsLCBoYS0+cGRldiwgMHgwMDI5LAorCQkgICAgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHJlcV9yaW5nLlxuIik7CiAJCWdvdG8gZmFpbF9yZXFfcmluZzsKIAl9CiAJLyogQWxsb2NhdGUgbWVtb3J5IGZvciByZXNwb25zZSByaW5nICovCiAJKnJzcCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByc3BfcXVlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCEqcnNwKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciByc3BcbiIpOworCQlxbF9sb2dfcGNpKHFsX2xvZ19mYXRhbCwgaGEtPnBkZXYsIDB4MDAyYSwKKwkJICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciByc3AuXG4iKTsKIAkJZ290byBmYWlsX3JzcDsKIAl9CiAJKCpyc3ApLT5odyA9IGhhOwpAQCAtMjc1NSwxOSArMjkxMCwyNCBAQAogCQkoKCpyc3ApLT5sZW5ndGggKyAxKSAqIHNpemVvZihyZXNwb25zZV90KSwKIAkJJigqcnNwKS0+ZG1hLCBHRlBfS0VSTkVMKTsKIAlpZiAoISgqcnNwKS0+cmluZykgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcnNwX3JpbmdcbiIpOworCQlxbF9sb2dfcGNpKHFsX2xvZ19mYXRhbCwgaGEtPnBkZXYsIDB4MDAyYiwKKwkJICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciByc3BfcmluZy5cbiIpOwogCQlnb3RvIGZhaWxfcnNwX3Jpbmc7CiAJfQogCSgqcmVxKS0+cnNwID0gKnJzcDsKIAkoKnJzcCktPnJlcSA9ICpyZXE7CisJcWxfZGJnX3BjaShxbF9kYmdfaW5pdCwgaGEtPnBkZXYsIDB4MDAyYywKKwkgICAgInJlcT0lcCByZXEtPmxlbmd0aD0lZCByZXEtPnJpbmc9JXAgcnNwPSVwICIKKwkgICAgInJzcC0+bGVuZ3RoPSVkIHJzcC0+cmluZz0lcC5cbiIsCisJICAgICpyZXEsICgqcmVxKS0+bGVuZ3RoLCAoKnJlcSktPnJpbmcsICpyc3AsICgqcnNwKS0+bGVuZ3RoLAorCSAgICAoKnJzcCktPnJpbmcpOwogCS8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgTlZSQU0gZGF0YSBmb3IgdnBvcnRzICovCiAJaWYgKGhhLT5udnJhbV9ucGl2X3NpemUpIHsKIAkJaGEtPm5waXZfaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBxbGFfbnBpdl9lbnRyeSkgKgotCQkJCQloYS0+bnZyYW1fbnBpdl9zaXplLCBHRlBfS0VSTkVMKTsKKwkJICAgIGhhLT5udnJhbV9ucGl2X3NpemUsIEdGUF9LRVJORUwpOwogCQlpZiAoIWhhLT5ucGl2X2luZm8pIHsKLQkJCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCQkiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgbnBpdiBpbmZvXG4iKTsKKwkJCXFsX2xvZ19wY2kocWxfbG9nX2ZhdGFsLCBoYS0+cGRldiwgMHgwMDJkLAorCQkJICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBucGl2X2luZm8uXG4iKTsKIAkJCWdvdG8gZmFpbF9ucGl2X2luZm87CiAJCX0KIAl9IGVsc2UKQEAgLTI3NzksNiArMjkzOSw4IEBACiAJCSAgICAmaGEtPmV4X2luaXRfY2JfZG1hKTsKIAkJaWYgKCFoYS0+ZXhfaW5pdF9jYikKIAkJCWdvdG8gZmFpbF9leF9pbml0X2NiOworCQlxbF9kYmdfcGNpKHFsX2RiZ19pbml0LCBoYS0+cGRldiwgMHgwMDJlLAorCQkgICAgImV4X2luaXRfY2I9JXAuXG4iLCBoYS0+ZXhfaW5pdF9jYik7CiAJfQogCiAJSU5JVF9MSVNUX0hFQUQoJmhhLT5nYmxfZHNkX2xpc3QpOwpAQCAtMjc4OSw2ICsyOTUxLDggQEAKIAkJCSZoYS0+YXN5bmNfcGRfZG1hKTsKIAkJaWYgKCFoYS0+YXN5bmNfcGQpCiAJCQlnb3RvIGZhaWxfYXN5bmNfcGQ7CisJCXFsX2RiZ19wY2kocWxfZGJnX2luaXQsIGhhLT5wZGV2LCAweDAwMmYsCisJCSAgICAiYXN5bmNfcGQ9JXAuXG4iLCBoYS0+YXN5bmNfcGQpOwogCX0KIAogCUlOSVRfTElTVF9IRUFEKCZoYS0+dnBfbGlzdCk7CkBAIC0yODU0LDcgKzMwMTgsOCBAQAogCWhhLT5pbml0X2NiID0gTlVMTDsKIAloYS0+aW5pdF9jYl9kbWEgPSAwOwogZmFpbDoKLQlERUJVRyhwcmludGsoIiVzOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlXG4iLCBfX2Z1bmNfXykpOworCXFsX2xvZyhxbF9sb2dfZmF0YWwsIE5VTEwsIDB4MDAzMCwKKwkgICAgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUuXG4iKTsKIAlyZXR1cm4gLUVOT01FTTsKIH0KIApAQCAtMzAwMyw4ICszMTY4LDggQEAKIAogCWhvc3QgPSBzY3NpX2hvc3RfYWxsb2Moc2h0LCBzaXplb2Yoc2NzaV9xbGFfaG9zdF90KSk7CiAJaWYgKGhvc3QgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HCi0JCSJxbGEyeHh4OiBDb3VsZG4ndCBhbGxvY2F0ZSBob3N0IGZyb20gc2NzaSBsYXllciFcbiIpOworCQlxbF9sb2dfcGNpKHFsX2xvZ19mYXRhbCwgaGEtPnBkZXYsIDB4MDEwNywKKwkJICAgICJGYWlsZWQgdG8gYWxsb2NhdGUgaG9zdCBmcm9tIHRoZSBzY3NpIGxheWVyLCBhYm9ydGluZy5cbiIpOwogCQlnb3RvIGZhaWw7CiAJfQogCkBAIC0zMDIzLDYgKzMxODgsMTEgQEAKIAlzcGluX2xvY2tfaW5pdCgmdmhhLT53b3JrX2xvY2spOwogCiAJc3ByaW50Zih2aGEtPmhvc3Rfc3RyLCAiJXNfJWxkIiwgUUxBMlhYWF9EUklWRVJfTkFNRSwgdmhhLT5ob3N0X25vKTsKKwlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMDQxLAorCSAgICAiQWxsb2NhdGVkIHRoZSBob3N0PSVwIGh3PSVwIHZoYT0lcCBkZXZfbmFtZT0lcyIsCisJICAgIHZoYS0+aG9zdCwgdmhhLT5odywgdmhhLAorCSAgICBkZXZfbmFtZSgmKGhhLT5wZGV2LT5kZXYpKSk7CisKIAlyZXR1cm4gdmhhOwogCiBmYWlsOgpAQCAtMzI2NCwxOCArMzQzNCwxOCBAQAogCQkJaWYgKHN0YXR1cyA9PSBRTEFfU1VDQ0VTUykgewogCQkJCWZjcG9ydC0+b2xkX2xvb3BfaWQgPSBmY3BvcnQtPmxvb3BfaWQ7CiAKLQkJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogcG9ydCBsb2dpbiBPSzogbG9nZ2VkICIKLQkJCQkiaW4gSUQgMHgleFxuIiwgdmhhLT5ob3N0X25vLCBmY3BvcnQtPmxvb3BfaWQpKTsKKwkJCQlxbF9kYmcocWxfZGJnX2Rpc2MsIHZoYSwgMHgyMDAzLAorCQkJCSAgICAiUG9ydCBsb2dpbiBPSzogbG9nZ2VkIGluIElEIDB4JXguXG4iLAorCQkJCSAgICBmY3BvcnQtPmxvb3BfaWQpOwogCiAJCQkJcWxhMngwMF91cGRhdGVfZmNwb3J0KHZoYSwgZmNwb3J0KTsKIAogCQkJfSBlbHNlIGlmIChzdGF0dXMgPT0gMSkgewogCQkJCXNldF9iaXQoUkVMT0dJTl9ORUVERUQsICZ2aGEtPmRwY19mbGFncyk7CiAJCQkJLyogcmV0cnkgdGhlIGxvZ2luIGFnYWluICovCi0JCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IFJldHJ5aW5nIgotCQkJCSIgJWQgbG9naW4gYWdhaW4gbG9vcF9pZCAweCV4XG4iLAotCQkJCXZoYS0+aG9zdF9ubywgZmNwb3J0LT5sb2dpbl9yZXRyeSwKLQkJCQkJCWZjcG9ydC0+bG9vcF9pZCkpOworCQkJCXFsX2RiZyhxbF9kYmdfZGlzYywgdmhhLCAweDIwMDcsCisJCQkJICAgICJSZXRyeWluZyAlZCBsb2dpbiBhZ2FpbiBsb29wX2lkIDB4JXguXG4iLAorCQkJCSAgICBmY3BvcnQtPmxvZ2luX3JldHJ5LCBmY3BvcnQtPmxvb3BfaWQpOwogCQkJfSBlbHNlIHsKIAkJCQlmY3BvcnQtPmxvZ2luX3JldHJ5ID0gMDsKIAkJCX0KQEAgLTMzMTUsMjYgKzM0ODUsMjcgQEAKIAogCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKLQkJREVCVUczKHByaW50aygicWxhMngwMDogRFBDIGhhbmRsZXIgc2xlZXBpbmdcbiIpKTsKKwkJcWxfZGJnKHFsX2RiZ19kcGMsIGJhc2VfdmhhLCAweDQwMDAsCisJCSAgICAiRFBDIGhhbmRsZXIgc2xlZXBpbmcuXG4iKTsKIAogCQlzY2hlZHVsZSgpOwogCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CiAKLQkJREVCVUczKHByaW50aygicWxhMngwMDogRFBDIGhhbmRsZXIgd2FraW5nIHVwXG4iKSk7CisJCXFsX2RiZyhxbF9kYmdfZHBjLCBiYXNlX3ZoYSwgMHg0MDAxLAorCQkgICAgIkRQQyBoYW5kbGVyIHdha2luZyB1cC5cbiIpOworCQlxbF9kYmcocWxfZGJnX2RwYywgYmFzZV92aGEsIDB4NDAwMiwKKwkJICAgICJkcGNfZmxhZ3M9MHglbHguXG4iLCBiYXNlX3ZoYS0+ZHBjX2ZsYWdzKTsKIAogCQkvKiBJbml0aWFsaXphdGlvbiBub3QgeWV0IGZpbmlzaGVkLiBEb24ndCBkbyBhbnl0aGluZyB5ZXQuICovCiAJCWlmICghYmFzZV92aGEtPmZsYWdzLmluaXRfZG9uZSkKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChoYS0+ZmxhZ3MuZWVoX2J1c3kpIHsKLQkJCURFQlVHMTcocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJICAgICJxbGEyeDAwX2RvX2RwYzogZHBjX2ZsYWdzOiAlbHhcbiIsCi0JCQkgICAgYmFzZV92aGEtPmRwY19mbGFncykpOworCQkJcWxfZGJnKHFsX2RiZ19kcGMsIGJhc2VfdmhhLCAweDQwMDMsCisJCQkgICAgImVlaF9idXN5PSVkLlxuIiwgaGEtPmZsYWdzLmVlaF9idXN5KTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJREVCVUczKHByaW50aygic2NzaSglbGQpOiBEUEMgaGFuZGxlclxuIiwgYmFzZV92aGEtPmhvc3Rfbm8pKTsKLQogCQloYS0+ZHBjX2FjdGl2ZSA9IDE7CiAKIAkJaWYgKGhhLT5mbGFncy5tYm94X2J1c3kpIHsKQEAgLTMzNTEsOCArMzUyMiw4IEBACiAJCQkJcWxhODJ4eF93cl8zMihoYSwgUUxBODJYWF9DUkJfREVWX1NUQVRFLAogCQkJCQlRTEE4MlhYX0RFVl9GQUlMRUQpOwogCQkJCXFsYTgyeHhfaWRjX3VubG9jayhoYSk7Ci0JCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJCQkiSFcgU3RhdGU6IEZBSUxFRFxuIik7CisJCQkJcWxfbG9nKHFsX2xvZ19pbmZvLCBiYXNlX3ZoYSwgMHg0MDA0LAorCQkJCSAgICAiSFcgU3RhdGU6IEZBSUxFRC5cbiIpOwogCQkJCXFsYTgyeHhfZGV2aWNlX3N0YXRlX2hhbmRsZXIoYmFzZV92aGEpOwogCQkJCWNvbnRpbnVlOwogCQkJfQpAQCAtMzM2MCwxMCArMzUzMSw4IEBACiAJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEZDT0VfQ1RYX1JFU0VUX05FRURFRCwKIAkJCQkmYmFzZV92aGEtPmRwY19mbGFncykpIHsKIAotCQkJCURFQlVHKHByaW50ayhLRVJOX0lORk8KLQkJCQkJInNjc2koJWxkKTogZHBjOiBzY2hlZCAiCi0JCQkJCSJxbGE4Mnh4X2Zjb2VfY3R4X3Jlc2V0IGhhID0gJXBcbiIsCi0JCQkJCWJhc2VfdmhhLT5ob3N0X25vLCBoYSkpOworCQkJCXFsX2RiZyhxbF9kYmdfZHBjLCBiYXNlX3ZoYSwgMHg0MDA1LAorCQkJCSAgICAiRkNvRSBjb250ZXh0IHJlc2V0IHNjaGVkdWxlZC5cbiIpOwogCQkJCWlmICghKHRlc3RfYW5kX3NldF9iaXQoQUJPUlRfSVNQX0FDVElWRSwKIAkJCQkJJmJhc2VfdmhhLT5kcGNfZmxhZ3MpKSkgewogCQkJCQlpZiAocWxhODJ4eF9mY29lX2N0eF9yZXNldChiYXNlX3ZoYSkpIHsKQEAgLTMzNzcsMTggKzM1NDYsMTYgQEAKIAkJCQkJCSZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKTsKIAkJCQl9CiAKLQkJCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogZHBjOiIKLQkJCQkJIiBxbGE4Mnh4X2Zjb2VfY3R4X3Jlc2V0IGVuZFxuIiwKLQkJCQkJYmFzZV92aGEtPmhvc3Rfbm8pKTsKKwkJCQlxbF9kYmcocWxfZGJnX2RwYywgYmFzZV92aGEsIDB4NDAwNiwKKwkJCQkgICAgIkZDb0UgY29udGV4dCByZXNldCBlbmQuXG4iKTsKIAkJCX0KIAkJfQogCiAJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSVNQX0FCT1JUX05FRURFRCwKIAkJCQkJCSZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKSkgewogCi0JCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogZHBjOiBzY2hlZCAiCi0JCQkgICAgInFsYTJ4MDBfYWJvcnRfaXNwIGhhID0gJXBcbiIsCi0JCQkgICAgYmFzZV92aGEtPmhvc3Rfbm8sIGhhKSk7CisJCQlxbF9kYmcocWxfZGJnX2RwYywgYmFzZV92aGEsIDB4NDAwNywKKwkJCSAgICAiSVNQIGFib3J0IHNjaGVkdWxlZC5cbiIpOwogCQkJaWYgKCEodGVzdF9hbmRfc2V0X2JpdChBQk9SVF9JU1BfQUNUSVZFLAogCQkJICAgICZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKSkpIHsKIApAQCAtMzQwMSw4ICszNTY4LDggQEAKIAkJCQkJCSZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKTsKIAkJCX0KIAotCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IGRwYzogcWxhMngwMF9hYm9ydF9pc3AgZW5kXG4iLAotCQkJICAgIGJhc2VfdmhhLT5ob3N0X25vKSk7CisJCQlxbF9kYmcocWxfZGJnX2RwYywgYmFzZV92aGEsIDB4NDAwOCwKKwkJCSAgICAiSVNQIGFib3J0IGVuZC5cbiIpOwogCQl9CiAKIAkJaWYgKHRlc3RfYml0KEZDUE9SVF9VUERBVEVfTkVFREVELCAmYmFzZV92aGEtPmRwY19mbGFncykpIHsKQEAgLTM0MTEsOSArMzU3OCw4IEBACiAJCX0KIAogCQlpZiAodGVzdF9iaXQoSVNQX1FVSUVTQ0VfTkVFREVELCAmYmFzZV92aGEtPmRwY19mbGFncykpIHsKLQkJCURFQlVHKHByaW50ayhLRVJOX0lORk8gInNjc2koJWxkKTogZHBjOiBzY2hlZCAiCi0JCQkgICAgInFsYTJ4MDBfcXVpZXNjZV9uZWVkZWQgaGEgPSAlcFxuIiwKLQkJCSAgICBiYXNlX3ZoYS0+aG9zdF9ubywgaGEpKTsKKwkJCXFsX2RiZyhxbF9kYmdfZHBjLCBiYXNlX3ZoYSwgMHg0MDA5LAorCQkJICAgICJRdWllc2NlbmNlIG1vZGUgc2NoZWR1bGVkLlxuIik7CiAJCQlxbGE4Mnh4X2RldmljZV9zdGF0ZV9oYW5kbGVyKGJhc2VfdmhhKTsKIAkJCWNsZWFyX2JpdChJU1BfUVVJRVNDRV9ORUVERUQsICZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKTsKIAkJCWlmICghaGEtPmZsYWdzLnF1aWVzY2Vfb3duZXIpIHsKQEAgLTM0MjMsMTcgKzM1ODksMjAgQEAKIAkJCQlxbGE4Mnh4X2NsZWFyX3FzbnRfcmVhZHkoYmFzZV92aGEpOwogCQkJCXFsYTgyeHhfaWRjX3VubG9jayhoYSk7CiAJCQl9CisJCQlxbF9kYmcocWxfZGJnX2RwYywgYmFzZV92aGEsIDB4NDAwYSwKKwkJCSAgICAiUXVpZXNjZW5jZSBtb2RlIGVuZC5cbiIpOwogCQl9CiAKIAkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChSRVNFVF9NQVJLRVJfTkVFREVELAogCQkJCQkJCSZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKSAmJgogCQkgICAgKCEodGVzdF9hbmRfc2V0X2JpdChSRVNFVF9BQ1RJVkUsICZiYXNlX3ZoYS0+ZHBjX2ZsYWdzKSkpKSB7CiAKLQkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBxbGEyeDAwX3Jlc2V0X21hcmtlcigpXG4iLAotCQkJICAgIGJhc2VfdmhhLT5ob3N0X25vKSk7Ci0KKwkJCXFsX2RiZyhxbF9kYmdfZHBjLCBiYXNlX3ZoYSwgMHg0MDBiLAorCQkJICAgICJSZXNldCBtYXJrZXIgc2NoZWR1bGVkLlxuIik7CiAJCQlxbGEyeDAwX3JzdF9hZW4oYmFzZV92aGEpOwogCQkJY2xlYXJfYml0KFJFU0VUX0FDVElWRSwgJmJhc2VfdmhhLT5kcGNfZmxhZ3MpOworCQkJcWxfZGJnKHFsX2RiZ19kcGMsIGJhc2VfdmhhLCAweDQwMGMsCisJCQkgICAgIlJlc2V0IG1hcmtlciBlbmQuXG4iKTsKIAkJfQogCiAJCS8qIFJldHJ5IGVhY2ggZGV2aWNlIHVwIHRvIGxvZ2luIHJldHJ5IGNvdW50ICovCkBAIC0zNDQyLDE5ICszNjExLDE4IEBACiAJCSAgICAhdGVzdF9iaXQoTE9PUF9SRVNZTkNfTkVFREVELCAmYmFzZV92aGEtPmRwY19mbGFncykgJiYKIAkJICAgIGF0b21pY19yZWFkKCZiYXNlX3ZoYS0+bG9vcF9zdGF0ZSkgIT0gTE9PUF9ET1dOKSB7CiAKLQkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBxbGEyeDAwX3BvcnRfbG9naW4oKVxuIiwKLQkJCQkJYmFzZV92aGEtPmhvc3Rfbm8pKTsKKwkJCXFsX2RiZyhxbF9kYmdfZHBjLCBiYXNlX3ZoYSwgMHg0MDBkLAorCQkJICAgICJSZWxvZ2luIHNjaGVkdWxlZC5cbiIpOwogCQkJcWxhMngwMF9yZWxvZ2luKGJhc2VfdmhhKTsKLQotCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IHFsYTJ4MDBfcG9ydF9sb2dpbiAtIGVuZFxuIiwKLQkJCSAgICBiYXNlX3ZoYS0+aG9zdF9ubykpOworCQkJcWxfZGJnKHFsX2RiZ19kcGMsIGJhc2VfdmhhLCAweDQwMGUsCisJCQkgICAgIlJlbG9naW4gZW5kLlxuIik7CiAJCX0KIAogCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KExPT1BfUkVTWU5DX05FRURFRCwKIAkJCQkJCQkmYmFzZV92aGEtPmRwY19mbGFncykpIHsKIAotCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IHFsYTJ4MDBfbG9vcF9yZXN5bmMoKVxuIiwKLQkJCQliYXNlX3ZoYS0+aG9zdF9ubykpOworCQkJcWxfZGJnKHFsX2RiZ19kcGMsIGJhc2VfdmhhLCAweDQwMGYsCisJCQkgICAgIkxvb3AgcmVzeW5jIHNjaGVkdWxlZC5cbiIpOwogCiAJCQlpZiAoISh0ZXN0X2FuZF9zZXRfYml0KExPT1BfUkVTWU5DX0FDVElWRSwKIAkJCSAgICAmYmFzZV92aGEtPmRwY19mbGFncykpKSB7CkBAIC0zNDY1LDggKzM2MzMsOCBAQAogCQkJCQkJJmJhc2VfdmhhLT5kcGNfZmxhZ3MpOwogCQkJfQogCi0JCQlERUJVRyhwcmludGsoInNjc2koJWxkKTogcWxhMngwMF9sb29wX3Jlc3luYyAtIGVuZFxuIiwKLQkJCSAgICBiYXNlX3ZoYS0+aG9zdF9ubykpOworCQkJcWxfZGJnKHFsX2RiZ19kcGMsIGJhc2VfdmhhLCAweDQwMTAsCisJCQkgICAgIkxvb3AgcmVzeW5jIGVuZC5cbiIpOwogCQl9CiAKIAkJaWYgKHRlc3RfYml0KE5QSVZfQ09ORklHX05FRURFRCwgJmJhc2VfdmhhLT5kcGNfZmxhZ3MpICYmCkBAIC0zNDg5LDcgKzM2NTcsOCBAQAogCX0gLyogRW5kIG9mIHdoaWxlKDEpICovCiAJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCi0JREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IERQQyBoYW5kbGVyIGV4aXRpbmdcbiIsIGJhc2VfdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19kcGMsIGJhc2VfdmhhLCAweDQwMTEsCisJICAgICJEUEMgaGFuZGxlciBleGl0aW5nLlxuIik7CiAKIAkvKgogCSAqIE1ha2Ugc3VyZSB0aGF0IG5vYm9keSB0cmllcyB0byB3YWtlIHVzIHVwIGFnYWluLgpAQCAtMzU5Niw5ICszNzY1LDExIEBACiBxbGEyeDAwX3NwX2NvbXBsKHN0cnVjdCBxbGFfaHdfZGF0YSAqaGEsIHNyYl90ICpzcCkKIHsKIAlpZiAoYXRvbWljX3JlYWQoJnNwLT5yZWZfY291bnQpID09IDApIHsKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJICAgICJTUCByZWZlcmVuY2UtY291bnQgdG8gWkVSTyAtLSBzcD0lcFxuIiwgc3ApKTsKLQkJREVCVUcyKEJVRygpKTsKKwkJcWxfZGJnKHFsX2RiZ19pbywgc3AtPmZjcG9ydC0+dmhhLCAweDMwMTUsCisJCSAgICAiU1AgcmVmZXJlbmNlLWNvdW50IHRvIFpFUk8gLS0gc3A9JXAgY21kPSVwLlxuIiwKKwkJICAgIHNwLCBzcC0+Y21kKTsKKwkJaWYgKHFsMnhleHRlbmRlZF9lcnJvcl9sb2dnaW5nICYgcWxfZGJnX2lvKQorCQkJQlVHKCk7CiAJCXJldHVybjsKIAl9CiAJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZzcC0+cmVmX2NvdW50KSkKQEAgLTM2MjYsNiArMzc5Nyw5IEBACiAJc3RydWN0IHJlcV9xdWUgKnJlcTsKIAogCWlmIChoYS0+ZmxhZ3MuZWVoX2J1c3kpIHsKKwkJcWxfZGJnKHFsX2RiZ190aW1lciwgdmhhLCAweDYwMDAsCisJCSAgICAiRUVIID0gJWQsIHJlc3RhcnRpbmcgdGltZXIuXG4iLAorCQkgICAgaGEtPmZsYWdzLmVlaF9idXN5KTsKIAkJcWxhMngwMF9yZXN0YXJ0X3RpbWVyKHZoYSwgV0FUQ0hfSU5URVJWQUwpOwogCQlyZXR1cm47CiAJfQpAQCAtMzY1MCw5ICszODI0LDggQEAKIAkJaWYgKGF0b21pY19yZWFkKCZ2aGEtPmxvb3BfZG93bl90aW1lcikgPT0KIAkJICAgIHZoYS0+bG9vcF9kb3duX2Fib3J0X3RpbWUpIHsKIAotCQkJREVCVUcocHJpbnRrKCJzY3NpKCVsZCk6IExvb3AgRG93biAtIGFib3J0aW5nIHRoZSAiCi0JCQkgICAgInF1ZXVlcyBiZWZvcmUgdGltZSBleHBpcmVcbiIsCi0JCQkgICAgdmhhLT5ob3N0X25vKSk7CisJCQlxbF9sb2cocWxfbG9nX2luZm8sIHZoYSwgMHg2MDA4LAorCQkJICAgICJMb29wIGRvd24gLSBhYm9ydGluZyB0aGUgcXVldWVzIGJlZm9yZSB0aW1lIGV4cGlyZXMuXG4iKTsKIAogCQkJaWYgKCFJU19RTEEyMTAwKGhhKSAmJiB2aGEtPmxpbmtfZG93bl90aW1lb3V0KQogCQkJCWF0b21pY19zZXQoJnZoYS0+bG9vcF9zdGF0ZSwgTE9PUF9ERUFEKTsKQEAgLTM2OTcsMTAgKzM4NzAsNyBAQAogCQkvKiBpZiB0aGUgbG9vcCBoYXMgYmVlbiBkb3duIGZvciA0IG1pbnV0ZXMsIHJlaW5pdCBhZGFwdGVyICovCiAJCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZ2aGEtPmxvb3BfZG93bl90aW1lcikgIT0gMCkgewogCQkJaWYgKCEodmhhLT5kZXZpY2VfZmxhZ3MgJiBERkxHX05PX0NBQkxFKSkgewotCQkJCURFQlVHKHByaW50aygic2NzaSglbGQpOiBMb29wIGRvd24gLSAiCi0JCQkJICAgICJhYm9ydGluZyBJU1AuXG4iLAotCQkJCSAgICB2aGEtPmhvc3Rfbm8pKTsKLQkJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NjAwOSwKIAkJCQkgICAgIkxvb3AgZG93biAtIGFib3J0aW5nIElTUC5cbiIpOwogCiAJCQkJaWYgKElTX1FMQTgyWFgoaGEpKQpAQCAtMzcxMSw5ICszODgxLDkgQEAKIAkJCQkJCSZ2aGEtPmRwY19mbGFncyk7CiAJCQl9CiAJCX0KLQkJREVCVUczKHByaW50aygic2NzaSglbGQpOiBMb29wIERvd24gLSBzZWNvbmRzIHJlbWFpbmluZyAlZFxuIiwKLQkJICAgIHZoYS0+aG9zdF9ubywKLQkJICAgIGF0b21pY19yZWFkKCZ2aGEtPmxvb3BfZG93bl90aW1lcikpKTsKKwkJcWxfZGJnKHFsX2RiZ190aW1lciwgdmhhLCAweDYwMGEsCisJCSAgICAiTG9vcCBkb3duIC0gc2Vjb25kcyByZW1haW5pbmcgJWQuXG4iLAorCQkgICAgYXRvbWljX3JlYWQoJnZoYS0+bG9vcF9kb3duX3RpbWVyKSk7CiAJfQogCiAJLyogQ2hlY2sgaWYgYmVhY29uIExFRCBuZWVkcyB0byBiZSBibGlua2VkIGZvciBwaHlzaWNhbCBob3N0IG9ubHkgKi8KQEAgLTM3MzYsOCArMzkwNiwyNyBAQAogCSAgICB0ZXN0X2JpdChJU1BfVU5SRUNPVkVSQUJMRSwgJnZoYS0+ZHBjX2ZsYWdzKSB8fAogCSAgICB0ZXN0X2JpdChGQ09FX0NUWF9SRVNFVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncykgfHwKIAkgICAgdGVzdF9iaXQoVlBfRFBDX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSB8fAotCSAgICB0ZXN0X2JpdChSRUxPR0lOX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSkpCisJICAgIHRlc3RfYml0KFJFTE9HSU5fTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpKSkgeworCQlxbF9kYmcocWxfZGJnX3RpbWVyLCB2aGEsIDB4NjAwYiwKKwkJICAgICJpc3BfYWJvcnRfbmVlZGVkPSVkIGxvb3BfcmVzeW5jX25lZWRlZD0lZCAiCisJCSAgICAiZmNwb3J0X3VwZGF0ZV9uZWVkZWQ9JWQgc3RhcnRfZHBjPSVkICIKKwkJICAgICJyZXNldF9tYXJrZXJfbmVlZGVkPSVkIiwKKwkJICAgIHRlc3RfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncyksCisJCSAgICB0ZXN0X2JpdChMT09QX1JFU1lOQ19ORUVERUQsICZ2aGEtPmRwY19mbGFncyksCisJCSAgICB0ZXN0X2JpdChGQ1BPUlRfVVBEQVRFX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSwKKwkJICAgIHN0YXJ0X2RwYywKKwkJICAgIHRlc3RfYml0KFJFU0VUX01BUktFUl9ORUVERUQsICZ2aGEtPmRwY19mbGFncykpOworCQlxbF9kYmcocWxfZGJnX3RpbWVyLCB2aGEsIDB4NjAwYywKKwkJICAgICJiZWFjb25fYmxpbmtfbmVlZGVkPSVkIGlzcF91bnJlY292ZXJhYmxlPSVkICIKKwkJICAgICJmY29lX2N0eF9yZXNldF9uZWVkZWQ9JWQgdnBfZHBjX25lZWRlZD0lZCAiCisJCSAgICAicmVsb2dpbl9uZWVkZWQ9JWQuXG4iLAorCQkgICAgdGVzdF9iaXQoQkVBQ09OX0JMSU5LX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSwKKwkJICAgIHRlc3RfYml0KElTUF9VTlJFQ09WRVJBQkxFLCAmdmhhLT5kcGNfZmxhZ3MpLAorCQkgICAgdGVzdF9iaXQoRkNPRV9DVFhfUkVTRVRfTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpLAorCQkgICAgdGVzdF9iaXQoVlBfRFBDX05FRURFRCwgJnZoYS0+ZHBjX2ZsYWdzKSwKKwkJICAgIHRlc3RfYml0KFJFTE9HSU5fTkVFREVELCAmdmhhLT5kcGNfZmxhZ3MpKTsKIAkJcWxhMnh4eF93YWtlX2RwYyh2aGEpOworCX0KIAogCXFsYTJ4MDBfcmVzdGFydF90aW1lcih2aGEsIFdBVENIX0lOVEVSVkFMKTsKIH0KQEAgLTM4MDYsOCArMzk5NSw4IEBACiAJCWdvdG8gb3V0OwogCiAJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmJsb2ItPmZ3LCBibG9iLT5uYW1lLCAmaGEtPnBkZXYtPmRldikpIHsKLQkJREVCVUcyKHByaW50aygic2NzaSglbGQpOiBGYWlsZWQgdG8gbG9hZCBmaXJtd2FyZSBpbWFnZSAiCi0JCSAgICAiKCVzKS5cbiIsIHZoYS0+aG9zdF9ubywgYmxvYi0+bmFtZSkpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMDYzLAorCQkgICAgIkZhaWxlZCB0byBsb2FkIGZpcm13YXJlIGltYWdlICglcykuXG4iLCBibG9iLT5uYW1lKTsKIAkJYmxvYi0+ZncgPSBOVUxMOwogCQlibG9iID0gTlVMTDsKIAkJZ290byBvdXQ7CkBAIC0zODM2LDggKzQwMjUsOCBAQAogCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCi0JREVCVUcyKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwgImVycm9yX2RldGVjdGVkOnN0YXRlICV4XG4iLAotCSAgICBzdGF0ZSkpOworCXFsX2RiZyhxbF9kYmdfYWVyLCB2aGEsIDB4OTAwMCwKKwkgICAgIlBDSSBlcnJvciBkZXRlY3RlZCwgc3RhdGUgJXguXG4iLCBzdGF0ZSk7CiAKIAlzd2l0Y2ggKHN0YXRlKSB7CiAJY2FzZSBwY2lfY2hhbm5lbF9pb19ub3JtYWw6CkBAIC0zODUwLDkgKzQwMzksOSBAQAogCQkJaGEtPmZsYWdzLmlzcDgyeHhfZndfaHVuZyA9IDE7CiAJCQlpZiAoaGEtPmZsYWdzLm1ib3hfYnVzeSkgewogCQkJCWhhLT5mbGFncy5tYm94X2ludCA9IDE7Ci0JCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9FUlIsIGhhLAotCQkJCQkiRHVlIHRvIHBjaSBjaGFubmVsIGlvIGZyb3plbiwgZG9pbmcgcHJlbWF0dXJlICIKLQkJCQkJImNvbXBsZXRpb24gb2YgbWJ4IGNvbW1hbmRcbiIpKTsKKwkJCQlxbF9kYmcocWxfZGJnX2FlciwgdmhhLCAweDkwMDEsCisJCQkJICAgICJEdWUgdG8gcGNpIGNoYW5uZWwgaW8gZnJvemVuLCBkb2luZyBwcmVtYXR1cmUgIgorCQkJCSAgICAiY29tcGxldGlvbiBvZiBtYnggY29tbWFuZC5cbiIpOwogCQkJCWNvbXBsZXRlKCZoYS0+bWJ4X2ludHJfY29tcCk7CiAJCQl9CiAJCX0KQEAgLTM5MDAsOCArNDA4OSw4IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssIGZsYWdzKTsKIAogCWlmIChyaXNjX3BhdXNlZCkgewotCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJSSVNDIHBhdXNlZCAtLSBtbWlvX2VuYWJsZWQsICIKLQkJICAgICJEdW1waW5nIGZpcm13YXJlIVxuIik7CisJCXFsX2xvZyhxbF9sb2dfaW5mbywgYmFzZV92aGEsIDB4OTAwMywKKwkJICAgICJSSVNDIHBhdXNlZCAtLSBtbWlvX2VuYWJsZWQsIER1bXBpbmcgZmlybXdhcmUuXG4iKTsKIAkJaGEtPmlzcF9vcHMtPmZ3X2R1bXAoYmFzZV92aGEsIDApOwogCiAJCXJldHVybiBQQ0lfRVJTX1JFU1VMVF9ORUVEX1JFU0VUOwpAQCAtMzkxNyw4ICs0MTA2LDggQEAKIAlpbnQgZm47CiAJc3RydWN0IHBjaV9kZXYgKm90aGVyX3BkZXYgPSBOVUxMOwogCi0JREVCVUcxNyhxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JICAgICJzY3NpKCVsZCk6IEluIHFsYTgyeHhfZXJyb3JfcmVjb3ZlcnlcbiIsIGJhc2VfdmhhLT5ob3N0X25vKSk7CisJcWxfZGJnKHFsX2RiZ19hZXIsIGJhc2VfdmhhLCAweDkwMDYsCisJICAgICJFbnRlcmVkICVzLlxuIiwgX19mdW5jX18pOwogCiAJc2V0X2JpdChBQk9SVF9JU1BfQUNUSVZFLCAmYmFzZV92aGEtPmRwY19mbGFncyk7CiAKQEAgLTM5MzIsOCArNDEyMSw4IEBACiAJZm4gPSBQQ0lfRlVOQyhoYS0+cGRldi0+ZGV2Zm4pOwogCXdoaWxlIChmbiA+IDApIHsKIAkJZm4tLTsKLQkJREVCVUcxNyhxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCSAgICAiRmluZGluZyBwY2kgZGV2aWNlIGF0IGZ1bmN0aW9uID0gMHgleFxuIiwgZm4pKTsKKwkJcWxfZGJnKHFsX2RiZ19hZXIsIGJhc2VfdmhhLCAweDkwMDcsCisJCSAgICAiRmluZGluZyBwY2kgZGV2aWNlIGF0IGZ1bmN0aW9uID0gMHgleC5cbiIsIGZuKTsKIAkJb3RoZXJfcGRldiA9CiAJCSAgICBwY2lfZ2V0X2RvbWFpbl9idXNfYW5kX3Nsb3QocGNpX2RvbWFpbl9ucihoYS0+cGRldi0+YnVzKSwKIAkJICAgIGhhLT5wZGV2LT5idXMtPm51bWJlciwgUENJX0RFVkZOKFBDSV9TTE9UKGhhLT5wZGV2LT5kZXZmbiksCkBAIC0zOTQyLDkgKzQxMzEsOSBAQAogCQlpZiAoIW90aGVyX3BkZXYpCiAJCQljb250aW51ZTsKIAkJaWYgKGF0b21pY19yZWFkKCZvdGhlcl9wZGV2LT5lbmFibGVfY250KSkgewotCQkJREVCVUcxNyhxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkgICAgIkZvdW5kIFBDSSBmdW5jIGF2YWlsYWJsZSBhbmQgZW5hYmxlZCBhdCAweCV4XG4iLAotCQkJICAgIGZuKSk7CisJCQlxbF9kYmcocWxfZGJnX2FlciwgYmFzZV92aGEsIDB4OTAwOCwKKwkJCSAgICAiRm91bmQgUENJIGZ1bmMgYXZhaWxhYmxlIGFuZCBlbmFibGUgYXQgMHgleC5cbiIsCisJCQkgICAgZm4pOwogCQkJcGNpX2Rldl9wdXQob3RoZXJfcGRldik7CiAJCQlicmVhazsKIAkJfQpAQCAtMzk1Myw4ICs0MTQyLDkgQEAKIAogCWlmICghZm4pIHsKIAkJLyogUmVzZXQgb3duZXIgKi8KLQkJREVCVUcxNyhxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCSAgICAiVGhpcyBkZXZmbiBpcyByZXNldCBvd25lciA9IDB4JXhcbiIsIGhhLT5wZGV2LT5kZXZmbikpOworCQlxbF9kYmcocWxfZGJnX2FlciwgYmFzZV92aGEsIDB4OTAwOSwKKwkJICAgICJUaGlzIGRldmZuIGlzIHJlc2V0IG93bmVyID0gMHgleC5cbiIsCisJCSAgICBoYS0+cGRldi0+ZGV2Zm4pOwogCQlxbGE4Mnh4X2lkY19sb2NrKGhhKTsKIAogCQlxbGE4Mnh4X3dyXzMyKGhhLCBRTEE4MlhYX0NSQl9ERVZfU1RBVEUsCkBAIC0zOTY0LDggKzQxNTQsOCBAQAogCQkgICAgUUxBODJYWF9JRENfVkVSU0lPTik7CiAKIAkJZHJ2X2FjdGl2ZSA9IHFsYTgyeHhfcmRfMzIoaGEsIFFMQTgyWFhfQ1JCX0RSVl9BQ1RJVkUpOwotCQlERUJVRzE3KHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJICAgICJkcnZfYWN0aXZlID0gMHgleFxuIiwgZHJ2X2FjdGl2ZSkpOworCQlxbF9kYmcocWxfZGJnX2FlciwgYmFzZV92aGEsIDB4OTAwYSwKKwkJICAgICJkcnZfYWN0aXZlID0gMHgleC5cbiIsIGRydl9hY3RpdmUpOwogCiAJCXFsYTgyeHhfaWRjX3VubG9jayhoYSk7CiAJCS8qIFJlc2V0IGlmIGRldmljZSBpcyBub3QgYWxyZWFkeSByZXNldApAQCAtMzk3OCwxMiArNDE2OCwxNCBAQAogCQlxbGE4Mnh4X2lkY19sb2NrKGhhKTsKIAogCQlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykgewotCQkJcWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiSFcgU3RhdGU6IEZBSUxFRFxuIik7CisJCQlxbF9sb2cocWxfbG9nX2luZm8sIGJhc2VfdmhhLCAweDkwMGIsCisJCQkgICAgIkhXIFN0YXRlOiBGQUlMRUQuXG4iKTsKIAkJCXFsYTgyeHhfY2xlYXJfZHJ2X2FjdGl2ZShoYSk7CiAJCQlxbGE4Mnh4X3dyXzMyKGhhLCBRTEE4MlhYX0NSQl9ERVZfU1RBVEUsCiAJCQkgICAgUUxBODJYWF9ERVZfRkFJTEVEKTsKIAkJfSBlbHNlIHsKLQkJCXFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkhXIFN0YXRlOiBSRUFEWVxuIik7CisJCQlxbF9sb2cocWxfbG9nX2luZm8sIGJhc2VfdmhhLCAweDkwMGMsCisJCQkgICAgIkhXIFN0YXRlOiBSRUFEWS5cbiIpOwogCQkJcWxhODJ4eF93cl8zMihoYSwgUUxBODJYWF9DUkJfREVWX1NUQVRFLAogCQkJICAgIFFMQTgyWFhfREVWX1JFQURZKTsKIAkJCXFsYTgyeHhfaWRjX3VubG9jayhoYSk7CkBAIC0zOTk2LDggKzQxODgsOSBAQAogCQl9CiAJCXFsYTgyeHhfaWRjX3VubG9jayhoYSk7CiAJfSBlbHNlIHsKLQkJREVCVUcxNyhxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCSAgICAiVGhpcyBkZXZmbiBpcyBub3QgcmVzZXQgb3duZXIgPSAweCV4XG4iLCBoYS0+cGRldi0+ZGV2Zm4pKTsKKwkJcWxfZGJnKHFsX2RiZ19hZXIsIGJhc2VfdmhhLCAweDkwMGQsCisJCSAgICAiVGhpcyBkZXZmbiBpcyBub3QgcmVzZXQgb3duZXIgPSAweCV4LlxuIiwKKwkJICAgIGhhLT5wZGV2LT5kZXZmbik7CiAJCWlmICgocWxhODJ4eF9yZF8zMihoYSwgUUxBODJYWF9DUkJfREVWX1NUQVRFKSA9PQogCQkgICAgUUxBODJYWF9ERVZfUkVBRFkpKSB7CiAJCQloYS0+ZmxhZ3MuaXNwODJ4eF9md19odW5nID0gMDsKQEAgLTQwMjEsNyArNDIxNCw4IEBACiAJc3RydWN0IHJzcF9xdWUgKnJzcDsKIAlpbnQgcmMsIHJldHJpZXMgPSAxMDsKIAotCURFQlVHMTcocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLCAic2xvdF9yZXNldFxuIikpOworCXFsX2RiZyhxbF9kYmdfYWVyLCBiYXNlX3ZoYSwgMHg5MDA0LAorCSAgICAiU2xvdCBSZXNldC5cbiIpOwogCiAJLyogV29ya2Fyb3VuZDogcWxhMnh4eCBkcml2ZXIgd2hpY2ggYWNjZXNzIGhhcmR3YXJlIGVhcmxpZXIKIAkgKiBuZWVkcyBlcnJvciBzdGF0ZSB0byBiZSBwY2lfY2hhbm5lbF9pb19vbmxpbmUuCkBAIC00MDQyLDcgKzQyMzYsNyBAQAogCQlyYyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwogCiAJaWYgKHJjKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCBiYXNlX3ZoYSwgMHg5MDA1LAogCQkgICAgIkNhbid0IHJlLWVuYWJsZSBQQ0kgZGV2aWNlIGFmdGVyIHJlc2V0LlxuIik7CiAJCWdvdG8gZXhpdF9zbG90X3Jlc2V0OwogCX0KQEAgLTQwNzIsOCArNDI2Niw4IEBACiAKIAogZXhpdF9zbG90X3Jlc2V0OgotCURFQlVHMTcocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCSAgICAic2xvdF9yZXNldC1yZXR1cm46cmV0PSV4XG4iLCByZXQpKTsKKwlxbF9kYmcocWxfZGJnX2FlciwgYmFzZV92aGEsIDB4OTAwZSwKKwkgICAgInNsb3RfcmVzZXQgcmV0dXJuICV4LlxuIiwgcmV0KTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC00MDg1LDEzICs0Mjc5LDEzIEBACiAJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IGJhc2VfdmhhLT5odzsKIAlpbnQgcmV0OwogCi0JREVCVUcxNyhxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJwY2lfcmVzdW1lXG4iKSk7CisJcWxfZGJnKHFsX2RiZ19hZXIsIGJhc2VfdmhhLCAweDkwMGYsCisJICAgICJwY2lfcmVzdW1lLlxuIik7CiAKIAlyZXQgPSBxbGEyeDAwX3dhaXRfZm9yX2hiYV9vbmxpbmUoYmFzZV92aGEpOwogCWlmIChyZXQgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJcWxhX3ByaW50ayhLRVJOX0VSUiwgaGEsCi0JCSAgICAidGhlIGRldmljZSBmYWlsZWQgdG8gcmVzdW1lIEkvTyAiCi0JCSAgICAiZnJvbSBzbG90L2xpbmtfcmVzZXQiKTsKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgYmFzZV92aGEsIDB4OTAwMiwKKwkJICAgICJUaGUgZGV2aWNlIGZhaWxlZCB0byByZXN1bWUgSS9PIGZyb20gc2xvdC9saW5rX3Jlc2V0LlxuIik7CiAJfQogCiAJcGNpX2NsZWFudXBfYWVyX3VuY29ycmVjdF9lcnJvcl9zdGF0dXMocGRldik7CkBAIC00MTU1LDggKzQzNDksOCBAQAogCXNyYl9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZSgicWxhMnh4eF9zcmJzIiwgc2l6ZW9mKHNyYl90KSwgMCwKIAkgICAgU0xBQl9IV0NBQ0hFX0FMSUdOLCBOVUxMKTsKIAlpZiAoc3JiX2NhY2hlcCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgInFsYTJ4eHg6IFVuYWJsZSB0byBhbGxvY2F0ZSBTUkIgY2FjaGUuLi5GYWlsaW5nIGxvYWQhXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ19mYXRhbCwgTlVMTCwgMHgwMDAxLAorCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBTUkIgY2FjaGUuLi5GYWlsaW5nIGxvYWQhLlxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIApAQCAtNDE2OSwxMyArNDM2MywxNSBAQAogCSAgICBmY19hdHRhY2hfdHJhbnNwb3J0KCZxbGEyeHh4X3RyYW5zcG9ydF9mdW5jdGlvbnMpOwogCWlmICghcWxhMnh4eF90cmFuc3BvcnRfdGVtcGxhdGUpIHsKIAkJa21lbV9jYWNoZV9kZXN0cm95KHNyYl9jYWNoZXApOworCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCBOVUxMLCAweDAwMDIsCisJCSAgICAiZmNfYXR0YWNoX3RyYW5zcG9ydCBmYWlsZWQuLi5GYWlsaW5nIGxvYWQhLlxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCWFwaWRldl9tYWpvciA9IHJlZ2lzdGVyX2NocmRldigwLCBRTEEyWFhYX0FQSURFViwgJmFwaWRldl9mb3BzKTsKIAlpZiAoYXBpZGV2X21ham9yIDwgMCkgewotCQlwcmludGsoS0VSTl9XQVJOSU5HICJxbGEyeHh4OiBVbmFibGUgdG8gcmVnaXN0ZXIgY2hhciBkZXZpY2UgIgotCQkgICAgIiVzXG4iLCBRTEEyWFhYX0FQSURFVik7CisJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIE5VTEwsIDB4MDAwMywKKwkJICAgICJVbmFibGUgdG8gcmVnaXN0ZXIgY2hhciBkZXZpY2UgJXMuXG4iLCBRTEEyWFhYX0FQSURFVik7CiAJfQogCiAJcWxhMnh4eF90cmFuc3BvcnRfdnBvcnRfdGVtcGxhdGUgPQpAQCAtNDE4MywxNiArNDM3OSwyMSBAQAogCWlmICghcWxhMnh4eF90cmFuc3BvcnRfdnBvcnRfdGVtcGxhdGUpIHsKIAkJa21lbV9jYWNoZV9kZXN0cm95KHNyYl9jYWNoZXApOwogCQlmY19yZWxlYXNlX3RyYW5zcG9ydChxbGEyeHh4X3RyYW5zcG9ydF90ZW1wbGF0ZSk7CisJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIE5VTEwsIDB4MDAwNCwKKwkJICAgICJmY19hdHRhY2hfdHJhbnNwb3J0IHZwb3J0IGZhaWxlZC4uLkZhaWxpbmcgbG9hZCEuXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQotCi0JcHJpbnRrKEtFUk5fSU5GTyAiUUxvZ2ljIEZpYnJlIENoYW5uZWwgSEJBIERyaXZlcjogJXNcbiIsCisJcWxfbG9nKHFsX2xvZ19pbmZvLCBOVUxMLCAweDAwMDUsCisJICAgICJRTG9naWMgRmlicmUgQ2hhbm5lbCBIQkEgRHJpdmVyOiAlcy5cbiIsCiAJICAgIHFsYTJ4MDBfdmVyc2lvbl9zdHIpOwogCXJldCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnFsYTJ4eHhfcGNpX2RyaXZlcik7CiAJaWYgKHJldCkgewogCQlrbWVtX2NhY2hlX2Rlc3Ryb3koc3JiX2NhY2hlcCk7CiAJCWZjX3JlbGVhc2VfdHJhbnNwb3J0KHFsYTJ4eHhfdHJhbnNwb3J0X3RlbXBsYXRlKTsKIAkJZmNfcmVsZWFzZV90cmFuc3BvcnQocWxhMnh4eF90cmFuc3BvcnRfdnBvcnRfdGVtcGxhdGUpOworCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCBOVUxMLCAweDAwMDYsCisJCSAgICAicGNpX3JlZ2lzdGVyX2RyaXZlciBmYWlsZWQuLi5yZXQ9JWQgRmFpbGluZyBsb2FkIS5cbiIsCisJCSAgICByZXQpOwogCX0KIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3N1cC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3N1cC5jCmluZGV4IDY5MzY0NzYuLmVmZjEzNTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9zdXAuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfc3VwLmMKQEAgLTE4OSw2ICsxODksNyBAQAogCXVpbnQxNl90IHdvcmQ7CiAJdWludDMyX3QgbnZfY21kLCB3YWl0X2NudDsKIAlzdHJ1Y3QgZGV2aWNlX3JlZ18yeHh4IF9faW9tZW0gKnJlZyA9ICZoYS0+aW9iYXNlLT5pc3A7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCiAJcWxhMngwMF9udl93cml0ZShoYSwgTlZSX0RBVEFfT1VUKTsKIAlxbGEyeDAwX252X3dyaXRlKGhhLCAwKTsKQEAgLTIyMCw4ICsyMjEsOCBAQAogCXdhaXRfY250ID0gTlZSX1dBSVRfQ05UOwogCWRvIHsKIAkJaWYgKCEtLXdhaXRfY250KSB7Ci0JCQlERUJVRzlfMTAocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJICAgICJOVlJBTSBkaWRuJ3QgZ28gcmVhZHkuLi5cbiIpKTsKKwkJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwOGQsCisJCQkgICAgIk5WUkFNIGRpZG4ndCBnbyByZWFkeS4uLlxuIik7CiAJCQlicmVhazsKIAkJfQogCQlOVlJBTV9ERUxBWSgpOwpAQCAtMzA4LDYgKzMwOSw3IEBACiAJc3RydWN0IGRldmljZV9yZWdfMnh4eCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwOwogCXVpbnQzMl90IHdvcmQsIHdhaXRfY250OwogCXVpbnQxNl90IHdwcm90LCB3cHJvdF9vbGQ7CisJc2NzaV9xbGFfaG9zdF90ICp2aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwogCiAJLyogQ2xlYXIgTlZSQU0gd3JpdGUgcHJvdGVjdGlvbi4gKi8KIAlyZXQgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwpAQCAtMzUwLDggKzM1Miw4IEBACiAJCXdhaXRfY250ID0gTlZSX1dBSVRfQ05UOwogCQlkbyB7CiAJCQlpZiAoIS0td2FpdF9jbnQpIHsKLQkJCQlERUJVRzlfMTAocWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJCSAgICAiTlZSQU0gZGlkbid0IGdvIHJlYWR5Li4uXG4iKSk7CisJCQkJcWxfZGJnKHFsX2RiZ191c2VyLCB2aGEsIDB4NzA4ZSwKKwkJCQkgICAgIk5WUkFNIGRpZG4ndCBnbyByZWFkeS4uLlxuIik7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlOVlJBTV9ERUxBWSgpOwpAQCAtMzcxLDYgKzM3Myw3IEBACiB7CiAJc3RydWN0IGRldmljZV9yZWdfMnh4eCBfX2lvbWVtICpyZWcgPSAmaGEtPmlvYmFzZS0+aXNwOwogCXVpbnQzMl90IHdvcmQsIHdhaXRfY250OworCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gcGNpX2dldF9kcnZkYXRhKGhhLT5wZGV2KTsKIAogCWlmIChzdGF0ICE9IFFMQV9TVUNDRVNTKQogCQlyZXR1cm47CkBAIC00MDksOCArNDEyLDggQEAKIAl3YWl0X2NudCA9IE5WUl9XQUlUX0NOVDsKIAlkbyB7CiAJCWlmICghLS13YWl0X2NudCkgewotCQkJREVCVUc5XzEwKHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCSAgICAiTlZSQU0gZGlkbid0IGdvIHJlYWR5Li4uXG4iKSk7CisJCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDhmLAorCQkJICAgICJOVlJBTSBkaWRuJ3QgZ28gcmVhZHkuLi5cbiIpOwogCQkJYnJlYWs7CiAJCX0KIAkJTlZSQU1fREVMQVkoKTsKQEAgLTYwNyw5ICs2MTAsMTAgQEAKIAlmb3IgKGNoa3N1bSA9IDA7IGNudDsgY250LS0pCiAJCWNoa3N1bSArPSBsZTE2X3RvX2NwdSgqd3B0cisrKTsKIAlpZiAoY2hrc3VtKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9FUlIsIGhhLAorCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDA0NSwKIAkJICAgICJJbmNvbnNpc3RlbnQgRkxUTCBkZXRlY3RlZDogY2hlY2tzdW09MHgleC5cbiIsIGNoa3N1bSk7Ci0JCXFsYTJ4MDBfZHVtcF9idWZmZXIoYnVmLCBzaXplb2Yoc3RydWN0IHFsYV9mbHRfbG9jYXRpb24pKTsKKwkJcWxfZHVtcF9idWZmZXIocWxfZGJnX2luaXQgKyBxbF9kYmdfYnVmZmVyLCB2aGEsIDB4MDEwZSwKKwkJICAgIGJ1Ziwgc2l6ZW9mKHN0cnVjdCBxbGFfZmx0X2xvY2F0aW9uKSk7CiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0KIApAQCAtNjE4LDcgKzYyMiw5IEBACiAJKnN0YXJ0ID0gKGxlMTZfdG9fY3B1KGZsdGwtPnN0YXJ0X2hpKSA8PCAxNiB8CiAJICAgIGxlMTZfdG9fY3B1KGZsdGwtPnN0YXJ0X2xvKSkgPj4gMjsKIGVuZDoKLQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0RFQlVHLCBoYSwgIkZMVExbJXNdID0gMHgleC5cbiIsIGxvYywgKnN0YXJ0KSk7CisJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDA0NiwKKwkgICAgIkZMVExbJXNdID0gMHgleC5cbiIsCisJICAgIGxvYywgKnN0YXJ0KTsKIAlyZXR1cm4gUUxBX1NVQ0NFU1M7CiB9CiAKQEAgLTY4NSwxMCArNjkxLDEwIEBACiAJaWYgKCp3cHRyID09IF9fY29uc3RhbnRfY3B1X3RvX2xlMTYoMHhmZmZmKSkKIAkJZ290byBub19mbGFzaF9kYXRhOwogCWlmIChmbHQtPnZlcnNpb24gIT0gX19jb25zdGFudF9jcHVfdG9fbGUxNigxKSkgewotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiVW5zdXBwb3J0ZWQgRkxUIGRldGVjdGVkOiAiCi0JCSAgICAidmVyc2lvbj0weCV4IGxlbmd0aD0weCV4IGNoZWNrc3VtPTB4JXguXG4iLAorCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMDQ3LAorCQkgICAgIlVuc3VwcG9ydGVkIEZMVCBkZXRlY3RlZDogdmVyc2lvbj0weCV4IGxlbmd0aD0weCV4IGNoZWNrc3VtPTB4JXguXG4iLAogCQkgICAgbGUxNl90b19jcHUoZmx0LT52ZXJzaW9uKSwgbGUxNl90b19jcHUoZmx0LT5sZW5ndGgpLAotCQkgICAgbGUxNl90b19jcHUoZmx0LT5jaGVja3N1bSkpKTsKKwkJICAgIGxlMTZfdG9fY3B1KGZsdC0+Y2hlY2tzdW0pKTsKIAkJZ290byBub19mbGFzaF9kYXRhOwogCX0KIApAQCAtNjk2LDEwICs3MDIsMTAgQEAKIAlmb3IgKGNoa3N1bSA9IDA7IGNudDsgY250LS0pCiAJCWNoa3N1bSArPSBsZTE2X3RvX2NwdSgqd3B0cisrKTsKIAlpZiAoY2hrc3VtKSB7Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJJbmNvbnNpc3RlbnQgRkxUIGRldGVjdGVkOiAiCi0JCSAgICAidmVyc2lvbj0weCV4IGxlbmd0aD0weCV4IGNoZWNrc3VtPTB4JXguXG4iLAorCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDA0OCwKKwkJICAgICJJbmNvbnNpc3RlbnQgRkxUIGRldGVjdGVkOiB2ZXJzaW9uPTB4JXggbGVuZ3RoPTB4JXggY2hlY2tzdW09MHgleC5cbiIsCiAJCSAgICBsZTE2X3RvX2NwdShmbHQtPnZlcnNpb24pLCBsZTE2X3RvX2NwdShmbHQtPmxlbmd0aCksCi0JCSAgICBjaGtzdW0pKTsKKwkJICAgIGxlMTZfdG9fY3B1KGZsdC0+Y2hlY2tzdW0pKTsKIAkJZ290byBub19mbGFzaF9kYXRhOwogCX0KIApAQCAtNzA4LDEwICs3MTQsMTEgQEAKIAlmb3IgKCA7IGNudDsgY250LS0sIHJlZ2lvbisrKSB7CiAJCS8qIFN0b3JlIGFkZHJlc3NlcyBhcyBEV09SRCBvZmZzZXRzLiAqLwogCQlzdGFydCA9IGxlMzJfdG9fY3B1KHJlZ2lvbi0+c3RhcnQpID4+IDI7Ci0KLQkJREVCVUczKHFsYV9wcmludGsoS0VSTl9ERUJVRywgaGEsICJGTFRbJTAyeF06IHN0YXJ0PTB4JXggIgotCQkgICAgImVuZD0weCV4IHNpemU9MHgleC5cbiIsIGxlMzJfdG9fY3B1KHJlZ2lvbi0+Y29kZSksIHN0YXJ0LAotCQkgICAgbGUzMl90b19jcHUocmVnaW9uLT5lbmQpID4+IDIsIGxlMzJfdG9fY3B1KHJlZ2lvbi0+c2l6ZSkpKTsKKwkJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDA0OSwKKwkJICAgICJGTFRbJTAyeF06IHN0YXJ0PTB4JXggIgorCQkgICAgImVuZD0weCV4IHNpemU9MHgleC5cbiIsIGxlMzJfdG9fY3B1KHJlZ2lvbi0+Y29kZSksCisJCSAgICBzdGFydCwgbGUzMl90b19jcHUocmVnaW9uLT5lbmQpID4+IDIsCisJCSAgICBsZTMyX3RvX2NwdShyZWdpb24tPnNpemUpKTsKIAogCQlzd2l0Y2ggKGxlMzJfdG9fY3B1KHJlZ2lvbi0+Y29kZSkgJiAweGZmKSB7CiAJCWNhc2UgRkxUX1JFR19GVzoKQEAgLTc5NiwxMiArODAzLDE2IEBACiAJaGEtPmZsdF9yZWdpb25fbnBpdl9jb25mID0gaGEtPmZsYWdzLnBvcnQwID8KIAkgICAgZGVmX25waXZfY29uZjBbZGVmXSA6IGRlZl9ucGl2X2NvbmYxW2RlZl07CiBkb25lOgotCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fREVCVUcsIGhhLCAiRkxUWyVzXTogYm9vdD0weCV4IGZ3PTB4JXggIgotCSAgICAidnBkX252cmFtPTB4JXggdnBkPTB4JXggbnZyYW09MHgleCBmZHQ9MHgleCBmbHQ9MHgleCAiCi0JICAgICJucGl2PTB4JXguIGZjcF9wcmlvX2NmZz0weCV4XG4iLCBsb2MsIGhhLT5mbHRfcmVnaW9uX2Jvb3QsCi0JICAgIGhhLT5mbHRfcmVnaW9uX2Z3LCBoYS0+Zmx0X3JlZ2lvbl92cGRfbnZyYW0sIGhhLT5mbHRfcmVnaW9uX3ZwZCwKLQkgICAgaGEtPmZsdF9yZWdpb25fbnZyYW0sIGhhLT5mbHRfcmVnaW9uX2ZkdCwgaGEtPmZsdF9yZWdpb25fZmx0LAotCSAgICBoYS0+Zmx0X3JlZ2lvbl9ucGl2X2NvbmYsIGhhLT5mbHRfcmVnaW9uX2ZjcF9wcmlvKSk7CisJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDA0YSwKKwkgICAgIkZMVFslc106IGJvb3Q9MHgleCBmdz0weCV4IHZwZF9udnJhbT0weCV4IHZwZD0weCV4LlxuIiwKKwkgICAgbG9jLCBoYS0+Zmx0X3JlZ2lvbl9ib290LAorCSAgICBoYS0+Zmx0X3JlZ2lvbl9mdywgaGEtPmZsdF9yZWdpb25fdnBkX252cmFtLAorCSAgICBoYS0+Zmx0X3JlZ2lvbl92cGQpOworCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwNGIsCisJICAgICJudnJhbT0weCV4IGZkdD0weCV4IGZsdD0weCV4IG5waXY9MHgleCBmY3BfcHJpZl9jZmc9MHgleC5cbiIsCisJICAgIGhhLT5mbHRfcmVnaW9uX252cmFtLAorCSAgICBoYS0+Zmx0X3JlZ2lvbl9mZHQsIGhhLT5mbHRfcmVnaW9uX2ZsdCwKKwkgICAgaGEtPmZsdF9yZWdpb25fbnBpdl9jb25mLCBoYS0+Zmx0X3JlZ2lvbl9mY3BfcHJpbyk7CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC04MzMsMTAgKzg0NCwxMiBAQAogCSAgICBjbnQrKykKIAkJY2hrc3VtICs9IGxlMTZfdG9fY3B1KCp3cHRyKyspOwogCWlmIChjaGtzdW0pIHsKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIkluY29uc2lzdGVudCBGRFQgZGV0ZWN0ZWQ6ICIKLQkJICAgICJjaGVja3N1bT0weCV4IGlkPSVjIHZlcnNpb249MHgleC5cbiIsIGNoa3N1bSwgZmR0LT5zaWdbMF0sCi0JCSAgICBsZTE2X3RvX2NwdShmZHQtPnZlcnNpb24pKSk7Ci0JCURFQlVHOShxbGEyeDAwX2R1bXBfYnVmZmVyKCh1aW50OF90ICopZmR0LCBzaXplb2YoKmZkdCkpKTsKKwkJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDA0YywKKwkJICAgICJJbmNvbnNpc3RlbnQgRkRUIGRldGVjdGVkOiIKKwkJICAgICIgY2hlY2tzdW09MHgleCBpZD0lYyB2ZXJzaW9uMHgleC5cbiIsIGNoa3N1bSwKKwkJICAgIGZkdC0+c2lnWzBdLCBsZTE2X3RvX2NwdShmZHQtPnZlcnNpb24pKTsKKwkJcWxfZHVtcF9idWZmZXIocWxfZGJnX2luaXQgKyBxbF9kYmdfYnVmZmVyLCB2aGEsIDB4MDExMywKKwkJICAgICh1aW50OF90ICopZmR0LCBzaXplb2YoKmZkdCkpOwogCQlnb3RvIG5vX2ZsYXNoX2RhdGE7CiAJfQogCkBAIC04OTAsMTEgKzkwMywxMiBAQAogCQlicmVhazsKIAl9CiBkb25lOgotCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fREVCVUcsIGhhLCAiRkRUWyVzXTogKDB4JXgvMHgleCkgZXJhc2U9MHgleCAiCi0JICAgICJwcm89JXggdXBybz0leCB3cnRkPTB4JXggYmxrPTB4JXguXG4iLCBsb2MsIG1pZCwgZmlkLAorCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwNGQsCisJICAgICJGRFRbJXhdOiAoMHgleC8weCV4KSBlcmFzZT0weCV4ICIKKwkgICAgInByPSV4IHVwcm89JXggd3J0ZD0weCV4IGJsaz0weCV4LlxuIiwgbG9jLCBtaWQsIGZpZCwKIAkgICAgaGEtPmZkdF9lcmFzZV9jbWQsIGhhLT5mZHRfcHJvdGVjdF9zZWNfY21kLAotCSAgICBoYS0+ZmR0X3VucHJvdGVjdF9zZWNfY21kLCBoYS0+ZmR0X3dydF9kaXNhYmxlLAotCSAgICBoYS0+ZmR0X2Jsb2NrX3NpemUpKTsKKwkgICAgaGEtPmZkdF93cnRfZGlzYWJsZSwgaGEtPmZkdF9ibG9ja19zaXplKTsKKwogfQogCiBzdGF0aWMgdm9pZApAQCAtOTE5LDYgKzkzMywxMCBAQAogCQloYS0+bnhfZGV2X2luaXRfdGltZW91dCA9IGxlMzJfdG9fY3B1KCp3cHRyKyspOwogCQloYS0+bnhfcmVzZXRfdGltZW91dCA9IGxlMzJfdG9fY3B1KCp3cHRyKTsKIAl9CisJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDA0ZSwKKwkgICAgIm54X2Rldl9pbml0X3RpbWVvdXQ9JWQgIgorCSAgICAibnhfcmVzZXRfdGltZW91dD0lZC5cbiIsIGhhLT5ueF9kZXZfaW5pdF90aW1lb3V0LAorCSAgICBoYS0+bnhfcmVzZXRfdGltZW91dCk7CiAJcmV0dXJuOwogfQogCkBAIC05NjMsMTcgKzk4MSwxOCBAQAogCWlmIChoZHIudmVyc2lvbiA9PSBfX2NvbnN0YW50X2NwdV90b19sZTE2KDB4ZmZmZikpCiAJCXJldHVybjsKIAlpZiAoaGRyLnZlcnNpb24gIT0gX19jb25zdGFudF9jcHVfdG9fbGUxNigxKSkgewotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiVW5zdXBwb3J0ZWQgTlBJVi1Db25maWcgIgorCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDkwLAorCQkgICAgIlVuc3VwcG9ydGVkIE5QSVYtQ29uZmlnICIKIAkJICAgICJkZXRlY3RlZDogdmVyc2lvbj0weCV4IGVudHJpZXM9MHgleCBjaGVja3N1bT0weCV4LlxuIiwKIAkJICAgIGxlMTZfdG9fY3B1KGhkci52ZXJzaW9uKSwgbGUxNl90b19jcHUoaGRyLmVudHJpZXMpLAotCQkgICAgbGUxNl90b19jcHUoaGRyLmNoZWNrc3VtKSkpOworCQkgICAgbGUxNl90b19jcHUoaGRyLmNoZWNrc3VtKSk7CiAJCXJldHVybjsKIAl9CiAKIAlkYXRhID0ga21hbGxvYyhOUElWX0NPTkZJR19TSVpFLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRhdGEpIHsKLQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIk5QSVYtQ29uZmlnOiBVbmFibGUgdG8gIgotCQkgICAgImFsbG9jYXRlIG1lbW9yeS5cbiIpKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA5MSwKKwkJICAgICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBkYXRhLlxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTk4NSwxMCArMTAwNCwxMSBAQAogCWZvciAod3B0ciA9IGRhdGEsIGNoa3N1bSA9IDA7IGNudDsgY250LS0pCiAJCWNoa3N1bSArPSBsZTE2X3RvX2NwdSgqd3B0cisrKTsKIAlpZiAoY2hrc3VtKSB7Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJJbmNvbnNpc3RlbnQgTlBJVi1Db25maWcgIgorCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDkyLAorCQkgICAgIkluY29uc2lzdGVudCBOUElWLUNvbmZpZyAiCiAJCSAgICAiZGV0ZWN0ZWQ6IHZlcnNpb249MHgleCBlbnRyaWVzPTB4JXggY2hlY2tzdW09MHgleC5cbiIsCiAJCSAgICBsZTE2X3RvX2NwdShoZHIudmVyc2lvbiksIGxlMTZfdG9fY3B1KGhkci5lbnRyaWVzKSwKLQkJICAgIGNoa3N1bSkpOworCQkgICAgbGUxNl90b19jcHUoaGRyLmNoZWNrc3VtKSk7CiAJCWdvdG8gZG9uZTsKIAl9CiAKQEAgLTEwMTQsMjEgKzEwMzQsMjIgQEAKIAkJdmlkLnBvcnRfbmFtZSA9IHd3bl90b191NjQoZW50cnktPnBvcnRfbmFtZSk7CiAJCXZpZC5ub2RlX25hbWUgPSB3d25fdG9fdTY0KGVudHJ5LT5ub2RlX25hbWUpOwogCi0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJOUElWWyUwMnhdOiB3d3BuPSVsbHggIgotCQkJInd3bm49JWxseCB2Zl9pZD0weCV4IFFfcW9zPTB4JXggRl9xb3M9MHgleC5cbiIsIGNudCwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdmlkLnBvcnRfbmFtZSwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdmlkLm5vZGVfbmFtZSwKLQkJCWxlMTZfdG9fY3B1KGVudHJ5LT52Zl9pZCksCi0JCQllbnRyeS0+cV9xb3MsIGVudHJ5LT5mX3FvcykpOworCQlxbF9kYmcocWxfZGJnX3VzZXIsIHZoYSwgMHg3MDkzLAorCQkgICAgIk5QSVZbJTAyeF06IHd3cG49JWxseCAiCisJCSAgICAid3dubj0lbGx4IHZmX2lkPTB4JXggUV9xb3M9MHgleCBGX3Fvcz0weCV4LlxuIiwgY250LAorCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl2aWQucG9ydF9uYW1lLAorCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl2aWQubm9kZV9uYW1lLAorCQkgICAgbGUxNl90b19jcHUoZW50cnktPnZmX2lkKSwKKwkJICAgIGVudHJ5LT5xX3FvcywgZW50cnktPmZfcW9zKTsKIAogCQlpZiAoaSA8IFFMQV9QUkVDT05GSUdfVlBPUlRTKSB7CiAJCQl2cG9ydCA9IGZjX3Zwb3J0X2NyZWF0ZSh2aGEtPmhvc3QsIDAsICZ2aWQpOwogCQkJaWYgKCF2cG9ydCkKLQkJCQlxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkJIk5QSVYtQ29uZmlnOiBGYWlsZWQgdG8gY3JlYXRlIHZwb3J0IFslMDJ4XTogIgotCQkJCSJ3d3BuPSVsbHggd3dubj0lbGx4LlxuIiwgY250LAotCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdmlkLnBvcnRfbmFtZSwKLQkJCQkodW5zaWduZWQgbG9uZyBsb25nKXZpZC5ub2RlX25hbWUpOworCQkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwOTQsCisJCQkJICAgICJOUElWLUNvbmZpZyBGYWlsZWQgdG8gY3JlYXRlIHZwb3J0IFslMDJ4XTogIgorCQkJCSAgICAid3dwbj0lbGx4IHd3bm49JWxseC5cbiIsIGNudCwKKwkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl2aWQucG9ydF9uYW1lLAorCQkJCSAgICAodW5zaWduZWQgbG9uZyBsb25nKXZpZC5ub2RlX25hbWUpOwogCQl9CiAJfQogZG9uZToKQEAgLTExMjcsOSArMTE0OCwxMCBAQAogCQlvcHRyb20gPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIE9QVFJPTV9CVVJTVF9TSVpFLAogCQkgICAgJm9wdHJvbV9kbWEsIEdGUF9LRVJORUwpOwogCQlpZiAoIW9wdHJvbSkgewotCQkJcWxhX3ByaW50ayhLRVJOX0RFQlVHLCBoYSwKLQkJCSAgICAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igb3B0cm9tIGJ1cnN0IHdyaXRlICIKLQkJCSAgICAiKCV4IEtCKS5cbiIsIE9QVFJPTV9CVVJTVF9TSVpFIC8gMTAyNCk7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDk1LAorCQkJICAgICJVbmFibGUgdG8gYWxsb2NhdGUgIgorCQkJICAgICJtZW1vcnkgZm9yIG9wdHJvbSBidXJzdCB3cml0ZSAoJXggS0IpLlxuIiwKKwkJCSAgICBPUFRST01fQlVSU1RfU0laRSAvIDEwMjQpOwogCQl9CiAJfQogCkBAIC0xMTM4LDcgKzExNjAsNyBAQAogCiAJcmV0ID0gcWxhMjR4eF91bnByb3RlY3RfZmxhc2godmhhKTsKIAlpZiAocmV0ICE9IFFMQV9TVUNDRVNTKSB7Ci0JCXFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA5NiwKIAkJICAgICJVbmFibGUgdG8gdW5wcm90ZWN0IGZsYXNoIGZvciB1cGRhdGUuXG4iKTsKIAkJZ290byBkb25lOwogCX0KQEAgLTExNTYsOSArMTE3OCw5IEBACiAJCQkJICAgIDB4ZmYwMDAwKSB8ICgoZmRhdGEgPj4gMTYpICYgMHhmZikpOwogCQkJcmV0ID0gcWxhMjR4eF9lcmFzZV9zZWN0b3IodmhhLCBmZGF0YSk7CiAJCQlpZiAocmV0ICE9IFFMQV9TVUNDRVNTKSB7Ci0JCQkJREVCVUc5KHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKLQkJCQkgICAgIlVuYWJsZSB0byBlcmFzZSBzZWN0b3I6IGFkZHJlc3M9JXguXG4iLAotCQkJCSAgICBmYWRkcikpOworCQkJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwMDcsCisJCQkJICAgICJVbmFibGUgdG8gZXJhc2UgZXJhc2Ugc2VjdG9yOiBhZGRyZXNzPSV4LlxuIiwKKwkJCQkgICAgZmFkZHIpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CkBAIC0xMTcyLDEyICsxMTk0LDEyIEBACiAJCQkgICAgZmxhc2hfZGF0YV9hZGRyKGhhLCBmYWRkciksCiAJCQkgICAgT1BUUk9NX0JVUlNUX0RXT1JEUyk7CiAJCQlpZiAocmV0ICE9IFFMQV9TVUNDRVNTKSB7Ci0JCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwOTcsCiAJCQkJICAgICJVbmFibGUgdG8gYnVyc3Qtd3JpdGUgb3B0cm9tIHNlZ21lbnQgIgogCQkJCSAgICAiKCV4LyV4LyVsbHgpLlxuIiwgcmV0LAogCQkJCSAgICBmbGFzaF9kYXRhX2FkZHIoaGEsIGZhZGRyKSwKIAkJCQkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylvcHRyb21fZG1hKTsKLQkJCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA5OCwKIAkJCQkgICAgIlJldmVydGluZyB0byBzbG93LXdyaXRlLlxuIik7CiAKIAkJCQlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwKQEAgLTExOTQsOSArMTIxNiw5IEBACiAJCXJldCA9IHFsYTI0eHhfd3JpdGVfZmxhc2hfZHdvcmQoaGEsCiAJCSAgICBmbGFzaF9kYXRhX2FkZHIoaGEsIGZhZGRyKSwgY3B1X3RvX2xlMzIoKmR3cHRyKSk7CiAJCWlmIChyZXQgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJCURFQlVHOShwcmludGsoIiVzKCVsZCkgVW5hYmxlIHRvIHByb2dyYW0gZmxhc2ggIgotCQkJICAgICJhZGRyZXNzPSV4IGRhdGE9JXguXG4iLCBfX2Z1bmNfXywKLQkJCSAgICB2aGEtPmhvc3Rfbm8sIGZhZGRyLCAqZHdwdHIpKTsKKwkJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwMDYsCisJCQkgICAgIlVuYWJsZSB0byBwcm9ncmFtIGZsYXNoIGFkZHJlc3M9JXggZGF0YT0leC5cbiIsCisJCQkgICAgZmFkZHIsICpkd3B0cik7CiAJCQlicmVhazsKIAkJfQogCkBAIC0xMjExLDcgKzEyMzMsNyBAQAogCiAJcmV0ID0gcWxhMjR4eF9wcm90ZWN0X2ZsYXNoKHZoYSk7CiAJaWYgKHJldCAhPSBRTEFfU1VDQ0VTUykKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDk5LAogCQkgICAgIlVuYWJsZSB0byBwcm90ZWN0IGZsYXNoIGFmdGVyIHVwZGF0ZS5cbiIpOwogZG9uZToKIAlpZiAob3B0cm9tKQpAQCAtMTMyNCw5ICsxMzQ2LDkgQEAKIAkJcmV0ID0gcWxhMjR4eF93cml0ZV9mbGFzaF9kd29yZChoYSwKIAkJICAgIG52cmFtX2RhdGFfYWRkcihoYSwgbmFkZHIpLCBjcHVfdG9fbGUzMigqZHdwdHIpKTsKIAkJaWYgKHJldCAhPSBRTEFfU1VDQ0VTUykgewotCQkJREVCVUc5KHFsYV9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCXFsX2RiZyhxbF9kYmdfdXNlciwgdmhhLCAweDcwOWEsCiAJCQkgICAgIlVuYWJsZSB0byBwcm9ncmFtIG52cmFtIGFkZHJlc3M9JXggZGF0YT0leC5cbiIsCi0JCQkgICAgbmFkZHIsICpkd3B0cikpOworCQkJICAgIG5hZGRyLCAqZHdwdHIpOwogCQkJYnJlYWs7CiAJCX0KIAl9CkBAIC0xNDc2LDcgKzE0OTgsNyBAQAogCWhhLT5md19vcHRpb25zWzFdIHw9IEZPMV9ESVNBQkxFX0dQSU82Xzc7CiAKIAlpZiAocWxhMngwMF9zZXRfZndfb3B0aW9ucyh2aGEsIGhhLT5md19vcHRpb25zKSAhPSBRTEFfU1VDQ0VTUykgewotCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDcwOWIsCiAJCSAgICAiVW5hYmxlIHRvIHVwZGF0ZSBmdyBvcHRpb25zIChiZWFjb24gb24pLlxuIik7CiAJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCX0KQEAgLTE1NDEsNyArMTU2Myw3IEBACiAKIAlydmFsID0gcWxhMngwMF9zZXRfZndfb3B0aW9ucyh2aGEsIGhhLT5md19vcHRpb25zKTsKIAlpZiAocnZhbCAhPSBRTEFfU1VDQ0VTUykKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDljLAogCQkgICAgIlVuYWJsZSB0byB1cGRhdGUgZncgb3B0aW9ucyAoYmVhY29uIG9mZikuXG4iKTsKIAlyZXR1cm4gcnZhbDsKIH0KQEAgLTE2MTYsNyArMTYzOCw3IEBACiAKIAkJaWYgKHFsYTJ4MDBfZ2V0X2Z3X29wdGlvbnModmhhLCBoYS0+Zndfb3B0aW9ucykgIT0KIAkJICAgIFFMQV9TVUNDRVNTKSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg3MDA5LAogCQkJICAgICJVbmFibGUgdG8gdXBkYXRlIGZ3IG9wdGlvbnMgKGJlYWNvbiBvbikuXG4iKTsKIAkJCXJldHVybiBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCQl9CkBAIC0xNjcwLDE0ICsxNjkyLDE0IEBACiAJaGEtPmZ3X29wdGlvbnNbMV0gJj0gfkFERF9GTzFfRElTQUJMRV9HUElPX0xFRF9DVFJMOwogCiAJaWYgKHFsYTJ4MDBfc2V0X2Z3X29wdGlvbnModmhhLCBoYS0+Zndfb3B0aW9ucykgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIlVuYWJsZSB0byB1cGRhdGUgZncgb3B0aW9ucyAoYmVhY29uIG9mZikuXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA0ZCwKKwkJICAgICJVbmFibGUgdG8gdXBkYXRlIGZ3IG9wdGlvbnMgKGJlYWNvbiBvbikuXG4iKTsKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfQogCiAJaWYgKHFsYTJ4MDBfZ2V0X2Z3X29wdGlvbnModmhhLCBoYS0+Zndfb3B0aW9ucykgIT0gUUxBX1NVQ0NFU1MpIHsKLQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkgICAgIlVuYWJsZSB0byBnZXQgZncgb3B0aW9ucyAoYmVhY29uIG9mZikuXG4iKTsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NzA0ZSwKKwkJICAgICJVbmFibGUgdG8gdXBkYXRlIGZ3IG9wdGlvbnMgKGJlYWNvbiBvbikuXG4iKTsKIAkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJfQogCkBAIC0yMzg5LDEwICsyNDExLDkgQEAKIAlvcHRyb20gPSBkbWFfYWxsb2NfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIE9QVFJPTV9CVVJTVF9TSVpFLAogCSAgICAmb3B0cm9tX2RtYSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFvcHRyb20pIHsKLQkJcWxhX3ByaW50ayhLRVJOX0RFQlVHLCBoYSwKLQkJICAgICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBvcHRyb20gYnVyc3QgcmVhZCAiCi0JCSAgICAiKCV4IEtCKS5cbiIsIE9QVFJPTV9CVVJTVF9TSVpFIC8gMTAyNCk7Ci0KKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4MDBjYywKKwkJICAgICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBvcHRyb20gYnVyc3QgcmVhZCAoJXggS0IpLlxuIiwKKwkJICAgIE9QVFJPTV9CVVJTVF9TSVpFIC8gMTAyNCk7CiAJCWdvdG8gc2xvd19yZWFkOwogCX0KIApAQCAtMjQwNywxMiArMjQyOCwxMSBAQAogCQlydmFsID0gcWxhMngwMF9kdW1wX3JhbSh2aGEsIG9wdHJvbV9kbWEsCiAJCSAgICBmbGFzaF9kYXRhX2FkZHIoaGEsIGZhZGRyKSwgYnVyc3QpOwogCQlpZiAocnZhbCkgewotCQkJcWxhX3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAotCQkJICAgICJVbmFibGUgdG8gYnVyc3QtcmVhZCBvcHRyb20gc2VnbWVudCAiCi0JCQkgICAgIigleC8leC8lbGx4KS5cbiIsIHJ2YWwsCi0JCQkgICAgZmxhc2hfZGF0YV9hZGRyKGhhLCBmYWRkciksCisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMGY1LAorCQkJICAgICJVbmFibGUgdG8gYnVyc3QtcmVhZCBvcHRyb20gc2VnbWVudCAoJXgvJXgvJWxseCkuXG4iLAorCQkJICAgIHJ2YWwsIGZsYXNoX2RhdGFfYWRkcihoYSwgZmFkZHIpLAogCQkJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpb3B0cm9tX2RtYSk7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMGY2LAogCQkJICAgICJSZXZlcnRpbmcgdG8gc2xvdy1yZWFkLlxuIik7CiAKIAkJCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBPUFRST01fQlVSU1RfU0laRSwKQEAgLTI1NTYsOCArMjU3Niw4IEBACiAJCWlmIChxbGEyeDAwX3JlYWRfZmxhc2hfYnl0ZShoYSwgcGNpaGRyKSAhPSAweDU1IHx8CiAJCSAgICBxbGEyeDAwX3JlYWRfZmxhc2hfYnl0ZShoYSwgcGNpaGRyICsgMHgwMSkgIT0gMHhhYSkgewogCQkJLyogTm8gc2lnbmF0dXJlICovCi0JCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0RFQlVHLCBoYSwgIk5vIG1hdGNoaW5nIFJPTSAiCi0JCQkgICAgInNpZ25hdHVyZS5cbiIpKTsKKwkJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMDUwLAorCQkJICAgICJObyBtYXRjaGluZyBST00gc2lnbmF0dXJlLlxuIik7CiAJCQlyZXQgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwogCQkJYnJlYWs7CiAJCX0KQEAgLTI1NzMsOCArMjU5Myw4IEBACiAJCSAgICBxbGEyeDAwX3JlYWRfZmxhc2hfYnl0ZShoYSwgcGNpZHMgKyAweDIpICE9ICdJJyB8fAogCQkgICAgcWxhMngwMF9yZWFkX2ZsYXNoX2J5dGUoaGEsIHBjaWRzICsgMHgzKSAhPSAnUicpIHsKIAkJCS8qIEluY29ycmVjdCBoZWFkZXIuICovCi0JCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiUENJIGRhdGEgc3RydWN0IG5vdCAiCi0JCQkgICAgImZvdW5kIHBjaXJfYWRyPSV4LlxuIiwgcGNpZHMpKTsKKwkJCXFsX2xvZyhxbF9sb2dfZmF0YWwsIHZoYSwgMHgwMDUxLAorCQkJICAgICJQQ0kgZGF0YSBzdHJ1Y3Qgbm90IGZvdW5kIHBjaXJfYWRyPSV4LlxuIiwgcGNpZHMpOwogCQkJcmV0ID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAkJCWJyZWFrOwogCQl9CkBAIC0yNTg4LDggKzI2MDgsOSBAQAogCQkJICAgIHFsYTJ4MDBfcmVhZF9mbGFzaF9ieXRlKGhhLCBwY2lkcyArIDB4MTIpOwogCQkJaGEtPmJpb3NfcmV2aXNpb25bMV0gPQogCQkJICAgIHFsYTJ4MDBfcmVhZF9mbGFzaF9ieXRlKGhhLCBwY2lkcyArIDB4MTMpOwotCQkJREVCVUczKHFsYV9wcmludGsoS0VSTl9ERUJVRywgaGEsICJyZWFkIEJJT1MgJWQuJWQuXG4iLAotCQkJICAgIGhhLT5iaW9zX3JldmlzaW9uWzFdLCBoYS0+Ymlvc19yZXZpc2lvblswXSkpOworCQkJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDA1MiwKKwkJCSAgICAiUmVhZCBCSU9TICVkLiVkLlxuIiwKKwkJCSAgICBoYS0+Ymlvc19yZXZpc2lvblsxXSwgaGEtPmJpb3NfcmV2aXNpb25bMF0pOwogCQkJYnJlYWs7CiAJCWNhc2UgUk9NX0NPREVfVFlQRV9GQ09ERToKIAkJCS8qIE9wZW4gRmlybXdhcmUgc3RhbmRhcmQgZm9yIFBDSSAoRkNvZGUpLiAqLwpAQCAtMjYwMiwxMiArMjYyMywxNCBAQAogCQkJICAgIHFsYTJ4MDBfcmVhZF9mbGFzaF9ieXRlKGhhLCBwY2lkcyArIDB4MTIpOwogCQkJaGEtPmVmaV9yZXZpc2lvblsxXSA9CiAJCQkgICAgcWxhMngwMF9yZWFkX2ZsYXNoX2J5dGUoaGEsIHBjaWRzICsgMHgxMyk7Ci0JCQlERUJVRzMocWxhX3ByaW50ayhLRVJOX0RFQlVHLCBoYSwgInJlYWQgRUZJICVkLiVkLlxuIiwKLQkJCSAgICBoYS0+ZWZpX3JldmlzaW9uWzFdLCBoYS0+ZWZpX3JldmlzaW9uWzBdKSk7CisJCQlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMDUzLAorCQkJICAgICJSZWFkIEVGSSAlZC4lZC5cbiIsCisJCQkgICAgaGEtPmVmaV9yZXZpc2lvblsxXSwgaGEtPmVmaV9yZXZpc2lvblswXSk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJVbnJlY29nbml6ZWQgY29kZSAiCi0JCQkgICAgInR5cGUgJXggYXQgcGNpZHMgJXguXG4iLCBjb2RlX3R5cGUsIHBjaWRzKSk7CisJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMDU0LAorCQkJICAgICJVbnJlY29nbml6ZWQgY29kZSB0eXBlICV4IGF0IHBjaWRzICV4LlxuIiwKKwkJCSAgICBjb2RlX3R5cGUsIHBjaWRzKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTI2MjcsMjEgKzI2NTAsMjggQEAKIAogCQlxbGEyeDAwX3JlYWRfZmxhc2hfZGF0YShoYSwgZGJ5dGUsIGhhLT5mbHRfcmVnaW9uX2Z3ICogNCArIDEwLAogCQkgICAgOCk7Ci0JCURFQlVHMyhxbGFfcHJpbnRrKEtFUk5fREVCVUcsIGhhLCAiZHVtcGluZyBmdyB2ZXIgZnJvbSAiCi0JCSAgICAiZmxhc2g6XG4iKSk7Ci0JCURFQlVHMyhxbGEyeDAwX2R1bXBfYnVmZmVyKCh1aW50OF90ICopZGJ5dGUsIDgpKTsKKwkJcWxfZGJnKHFsX2RiZ19pbml0ICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDAxMGEsCisJCSAgICAiRHVtcGluZyBmdyAiCisJCSAgICAidmVyIGZyb20gZmxhc2g6LlxuIik7CisJCXFsX2R1bXBfYnVmZmVyKHFsX2RiZ19pbml0ICsgcWxfZGJnX2J1ZmZlciwgdmhhLCAweDAxMGIsCisJCSAgICAodWludDhfdCAqKWRieXRlLCA4KTsKIAogCQlpZiAoKGRjb2RlWzBdID09IDB4ZmZmZiAmJiBkY29kZVsxXSA9PSAweGZmZmYgJiYKIAkJICAgIGRjb2RlWzJdID09IDB4ZmZmZiAmJiBkY29kZVszXSA9PSAweGZmZmYpIHx8CiAJCSAgICAoZGNvZGVbMF0gPT0gMCAmJiBkY29kZVsxXSA9PSAwICYmIGRjb2RlWzJdID09IDAgJiYKIAkJICAgIGRjb2RlWzNdID09IDApKSB7Ci0JCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiVW5yZWNvZ25pemVkIGZ3ICIKLQkJCSAgICAicmV2aXNpb24gYXQgJXguXG4iLCBoYS0+Zmx0X3JlZ2lvbl9mdyAqIDQpKTsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAwNTcsCisJCQkgICAgIlVucmVjb2duaXplZCBmdyByZXZpc2lvbiBhdCAleC5cbiIsCisJCQkgICAgaGEtPmZsdF9yZWdpb25fZncgKiA0KTsKIAkJfSBlbHNlIHsKIAkJCS8qIHZhbHVlcyBhcmUgaW4gYmlnIGVuZGlhbiAqLwogCQkJaGEtPmZ3X3JldmlzaW9uWzBdID0gZGJ5dGVbMF0gPDwgMTYgfCBkYnl0ZVsxXTsKIAkJCWhhLT5md19yZXZpc2lvblsxXSA9IGRieXRlWzJdIDw8IDE2IHwgZGJ5dGVbM107CiAJCQloYS0+ZndfcmV2aXNpb25bMl0gPSBkYnl0ZVs0XSA8PCAxNiB8IGRieXRlWzVdOworCQkJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDA1OCwKKwkJCSAgICAiRlcgVmVyc2lvbjogIgorCQkJICAgICIlZC4lZC4lZC5cbiIsIGhhLT5md19yZXZpc2lvblswXSwKKwkJCSAgICBoYS0+ZndfcmV2aXNpb25bMV0sIGhhLT5md19yZXZpc2lvblsyXSk7CiAJCX0KIAl9CiAKQEAgLTI2ODMsOCArMjcxMyw4IEBACiAJCWJjb2RlID0gbWJ1ZiArIChwY2loZHIgJSA0KTsKIAkJaWYgKGJjb2RlWzB4MF0gIT0gMHg1NSB8fCBiY29kZVsweDFdICE9IDB4YWEpIHsKIAkJCS8qIE5vIHNpZ25hdHVyZSAqLwotCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9ERUJVRywgaGEsICJObyBtYXRjaGluZyBST00gIgotCQkJICAgICJzaWduYXR1cmUuXG4iKSk7CisJCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDA1OSwKKwkJCSAgICAiTm8gbWF0Y2hpbmcgUk9NIHNpZ25hdHVyZS5cbiIpOwogCQkJcmV0ID0gUUxBX0ZVTkNUSU9OX0ZBSUxFRDsKIAkJCWJyZWFrOwogCQl9CkBAIC0yNjk5LDggKzI3MjksOCBAQAogCQlpZiAoYmNvZGVbMHgwXSAhPSAnUCcgfHwgYmNvZGVbMHgxXSAhPSAnQycgfHwKIAkJICAgIGJjb2RlWzB4Ml0gIT0gJ0knIHx8IGJjb2RlWzB4M10gIT0gJ1InKSB7CiAJCQkvKiBJbmNvcnJlY3QgaGVhZGVyLiAqLwotCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlBDSSBkYXRhIHN0cnVjdCBub3QgIgotCQkJICAgICJmb3VuZCBwY2lyX2Fkcj0leC5cbiIsIHBjaWRzKSk7CisJCQlxbF9sb2cocWxfbG9nX2ZhdGFsLCB2aGEsIDB4MDA1YSwKKwkJCSAgICAiUENJIGRhdGEgc3RydWN0IG5vdCBmb3VuZCBwY2lyX2Fkcj0leC5cbiIsIHBjaWRzKTsKIAkJCXJldCA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJCQlicmVhazsKIAkJfQpAQCAtMjcxMiwyNiArMjc0MiwzMCBAQAogCQkJLyogSW50ZWwgeDg2LCBQQy1BVCBjb21wYXRpYmxlLiAqLwogCQkJaGEtPmJpb3NfcmV2aXNpb25bMF0gPSBiY29kZVsweDEyXTsKIAkJCWhhLT5iaW9zX3JldmlzaW9uWzFdID0gYmNvZGVbMHgxM107Ci0JCQlERUJVRzMocWxhX3ByaW50ayhLRVJOX0RFQlVHLCBoYSwgInJlYWQgQklPUyAlZC4lZC5cbiIsCi0JCQkgICAgaGEtPmJpb3NfcmV2aXNpb25bMV0sIGhhLT5iaW9zX3JldmlzaW9uWzBdKSk7CisJCQlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMDViLAorCQkJICAgICJSZWFkIEJJT1MgJWQuJWQuXG4iLAorCQkJICAgIGhhLT5iaW9zX3JldmlzaW9uWzFdLCBoYS0+Ymlvc19yZXZpc2lvblswXSk7CiAJCQlicmVhazsKIAkJY2FzZSBST01fQ09ERV9UWVBFX0ZDT0RFOgogCQkJLyogT3BlbiBGaXJtd2FyZSBzdGFuZGFyZCBmb3IgUENJIChGQ29kZSkuICovCiAJCQloYS0+ZmNvZGVfcmV2aXNpb25bMF0gPSBiY29kZVsweDEyXTsKIAkJCWhhLT5mY29kZV9yZXZpc2lvblsxXSA9IGJjb2RlWzB4MTNdOwotCQkJREVCVUczKHFsYV9wcmludGsoS0VSTl9ERUJVRywgaGEsICJyZWFkIEZDT0RFICVkLiVkLlxuIiwKLQkJCSAgICBoYS0+ZmNvZGVfcmV2aXNpb25bMV0sIGhhLT5mY29kZV9yZXZpc2lvblswXSkpOworCQkJcWxfZGJnKHFsX2RiZ19pbml0LCB2aGEsIDB4MDA1YywKKwkJCSAgICAiUmVhZCBGQ09ERSAlZC4lZC5cbiIsCisJCQkgICAgaGEtPmZjb2RlX3JldmlzaW9uWzFdLCBoYS0+ZmNvZGVfcmV2aXNpb25bMF0pOwogCQkJYnJlYWs7CiAJCWNhc2UgUk9NX0NPREVfVFlQRV9FRkk6CiAJCQkvKiBFeHRlbnNpYmxlIEZpcm13YXJlIEludGVyZmFjZSAoRUZJKS4gKi8KIAkJCWhhLT5lZmlfcmV2aXNpb25bMF0gPSBiY29kZVsweDEyXTsKIAkJCWhhLT5lZmlfcmV2aXNpb25bMV0gPSBiY29kZVsweDEzXTsKLQkJCURFQlVHMyhxbGFfcHJpbnRrKEtFUk5fREVCVUcsIGhhLCAicmVhZCBFRkkgJWQuJWQuXG4iLAotCQkJICAgIGhhLT5lZmlfcmV2aXNpb25bMV0sIGhhLT5lZmlfcmV2aXNpb25bMF0pKTsKKwkJCXFsX2RiZyhxbF9kYmdfaW5pdCwgdmhhLCAweDAwNWQsCisJCQkgICAgIlJlYWQgRUZJICVkLiVkLlxuIiwKKwkJCSAgICBoYS0+ZWZpX3JldmlzaW9uWzFdLCBoYS0+ZWZpX3JldmlzaW9uWzBdKTsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJREVCVUcyKHFsYV9wcmludGsoS0VSTl9JTkZPLCBoYSwgIlVucmVjb2duaXplZCBjb2RlICIKLQkJCSAgICAidHlwZSAleCBhdCBwY2lkcyAleC5cbiIsIGNvZGVfdHlwZSwgcGNpZHMpKTsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAwNWUsCisJCQkgICAgIlVucmVjb2duaXplZCBjb2RlIHR5cGUgJXggYXQgcGNpZHMgJXguXG4iLAorCQkJICAgIGNvZGVfdHlwZSwgcGNpZHMpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMjc1MywxMyArMjc4NywxOCBAQAogCSAgICBkY29kZVsyXSA9PSAweGZmZmZmZmZmICYmIGRjb2RlWzNdID09IDB4ZmZmZmZmZmYpIHx8CiAJICAgIChkY29kZVswXSA9PSAwICYmIGRjb2RlWzFdID09IDAgJiYgZGNvZGVbMl0gPT0gMCAmJgogCSAgICBkY29kZVszXSA9PSAwKSkgewotCQlERUJVRzIocWxhX3ByaW50ayhLRVJOX0lORk8sIGhhLCAiVW5yZWNvZ25pemVkIGZ3ICIKLQkJICAgICJyZXZpc2lvbiBhdCAleC5cbiIsIGhhLT5mbHRfcmVnaW9uX2Z3ICogNCkpOworCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHgwMDVmLAorCQkgICAgIlVucmVjb2duaXplZCBmdyByZXZpc2lvbiBhdCAleC5cbiIsCisJCSAgICBoYS0+Zmx0X3JlZ2lvbl9mdyAqIDQpOwogCX0gZWxzZSB7CiAJCWhhLT5md19yZXZpc2lvblswXSA9IGRjb2RlWzBdOwogCQloYS0+ZndfcmV2aXNpb25bMV0gPSBkY29kZVsxXTsKIAkJaGEtPmZ3X3JldmlzaW9uWzJdID0gZGNvZGVbMl07CiAJCWhhLT5md19yZXZpc2lvblszXSA9IGRjb2RlWzNdOworCQlxbF9kYmcocWxfZGJnX2luaXQsIHZoYSwgMHgwMDYwLAorCQkgICAgIkZpcm13YXJlIHJldmlzaW9uICVkLiVkLiVkLiVkLlxuIiwKKwkJICAgIGhhLT5md19yZXZpc2lvblswXSwgaGEtPmZ3X3JldmlzaW9uWzFdLAorCQkgICAgaGEtPmZ3X3JldmlzaW9uWzJdLCBoYS0+ZndfcmV2aXNpb25bM10pOwogCX0KIAogCS8qIENoZWNrIGZvciBnb2xkZW4gZmlybXdhcmUgYW5kIGdldCB2ZXJzaW9uIGlmIGF2YWlsYWJsZSAqLwpAQCAtMjc3NSw5ICsyODE0LDkgQEAKIAogCWlmIChkY29kZVs0XSA9PSAweEZGRkZGRkZGICYmIGRjb2RlWzVdID09IDB4RkZGRkZGRkYgJiYKIAkgICAgZGNvZGVbNl0gPT0gMHhGRkZGRkZGRiAmJiBkY29kZVs3XSA9PSAweEZGRkZGRkZGKSB7Ci0JCURFQlVHMihxbGFfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCSAgICAiJXMoJWxkKTogVW5yZWNvZ25pemVkIGdvbGRlbiBmdyBhdCAweCV4LlxuIiwKLQkJICAgIF9fZnVuY19fLCB2aGEtPmhvc3Rfbm8sIGhhLT5mbHRfcmVnaW9uX2dvbGRfZncgKiA0KSk7CisJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAwNTYsCisJCSAgICAiVW5yZWNvZ25pemVkIGdvbGRlbiBmdyBhdCAweCV4LlxuIiwKKwkJICAgIGhhLT5mbHRfcmVnaW9uX2dvbGRfZncgKiA0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTI4NDMsOSArMjg4Miw5IEBACiAJaWYgKCFoYS0+ZmNwX3ByaW9fY2ZnKSB7CiAJCWhhLT5mY3BfcHJpb19jZmcgPSB2bWFsbG9jKEZDUF9QUklPX0NGR19TSVpFKTsKIAkJaWYgKCFoYS0+ZmNwX3ByaW9fY2ZnKSB7Ci0JCQlxbGFfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCi0JCQkiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgZmNwIHByaW9yaXR5IGRhdGEgIgotCQkJCQkiKCV4KS5cbiIsIEZDUF9QUklPX0NGR19TSVpFKTsKKwkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDAwZDUsCisJCQkgICAgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGZjcCBwcmlvcnR5IGRhdGEgKCV4KS5cbiIsCisJCQkgICAgRkNQX1BSSU9fQ0ZHX1NJWkUpOwogCQkJcmV0dXJuIFFMQV9GVU5DVElPTl9GQUlMRUQ7CiAJCX0KIAl9CkBAIC0yODU3LDcgKzI4OTYsNyBAQAogCWhhLT5pc3Bfb3BzLT5yZWFkX29wdHJvbSh2aGEsICh1aW50OF90ICopaGEtPmZjcF9wcmlvX2NmZywKIAkJCWZjcF9wcmlvX2FkZHIgPDwgMiwgRkNQX1BSSU9fQ0ZHX0hEUl9TSVpFKTsKIAotCWlmICghcWxhMjR4eF9mY3BfcHJpb19jZmdfdmFsaWQoaGEtPmZjcF9wcmlvX2NmZywgMCkpCisJaWYgKCFxbGEyNHh4X2ZjcF9wcmlvX2NmZ192YWxpZCh2aGEsIGhhLT5mY3BfcHJpb19jZmcsIDApKQogCQlnb3RvIGZhaWw7CiAKIAkvKiByZWFkIHJlbWFpbmluZyBGQ1AgQ01EIGNvbmZpZyBkYXRhIGZyb20gZmxhc2ggKi8KQEAgLTI4NjksNyArMjkwOCw3IEBACiAJCQlmY3BfcHJpb19hZGRyIDw8IDIsIChsZW4gPCBtYXhfbGVuID8gbGVuIDogbWF4X2xlbikpOwogCiAJLyogcmV2YWxpZGF0ZSB0aGUgZW50aXJlIEZDUCBwcmlvcml0eSBjb25maWcgZGF0YSwgaW5jbHVkaW5nIGVudHJpZXMgKi8KLQlpZiAoIXFsYTI0eHhfZmNwX3ByaW9fY2ZnX3ZhbGlkKGhhLT5mY3BfcHJpb19jZmcsIDEpKQorCWlmICghcWxhMjR4eF9mY3BfcHJpb19jZmdfdmFsaWQodmhhLCBoYS0+ZmNwX3ByaW9fY2ZnLCAxKSkKIAkJZ290byBmYWlsOwogCiAJaGEtPmZsYWdzLmZjcF9wcmlvX2VuYWJsZWQgPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfbGliLmMgYi9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYwppbmRleCAyOGQ5YzlkLi5mYzNmMTY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV9saWIuYwpAQCAtMTM3LDYgKzEzNyw3IEBACiAJCWhvc3QtPmhvc3RfYmxvY2tlZCA9IGhvc3QtPm1heF9ob3N0X2Jsb2NrZWQ7CiAJCWJyZWFrOwogCWNhc2UgU0NTSV9NTFFVRVVFX0RFVklDRV9CVVNZOgorCWNhc2UgU0NTSV9NTFFVRVVFX0VIX1JFVFJZOgogCQlkZXZpY2UtPmRldmljZV9ibG9ja2VkID0gZGV2aWNlLT5tYXhfZGV2aWNlX2Jsb2NrZWQ7CiAJCWJyZWFrOwogCWNhc2UgU0NTSV9NTFFVRVVFX1RBUkdFVF9CVVNZOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3NwaS5jIGIvZHJpdmVycy9zY3NpL3Njc2lfdHJhbnNwb3J0X3NwaS5jCmluZGV4IDhhMTcyZDQuLjVmYmVhZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9zY3NpX3RyYW5zcG9ydF9zcGkuYworKysgYi9kcml2ZXJzL3Njc2kvc2NzaV90cmFuc3BvcnRfc3BpLmMKQEAgLTU5Nyw2ICs1OTcsMjggQEAKIAkJICAgc2hvd19zcGlfaG9zdF9zaWduYWxsaW5nLAogCQkgICBzdG9yZV9zcGlfaG9zdF9zaWduYWxsaW5nKTsKIAorc3RhdGljIHNzaXplX3Qgc2hvd19zcGlfaG9zdF93aWR0aChzdHJ1Y3QgZGV2aWNlICpjZGV2LAorCQkJCSAgICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCSAgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgU2NzaV9Ib3N0ICpzaG9zdCA9IHRyYW5zcG9ydF9jbGFzc190b19zaG9zdChjZGV2KTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBzaG9zdC0+bWF4X2lkID09IDE2ID8gIndpZGUiIDogIm5hcnJvdyIpOworfQorc3RhdGljIERFVklDRV9BVFRSKGhvc3Rfd2lkdGgsIFNfSVJVR08sCisJCSAgIHNob3dfc3BpX2hvc3Rfd2lkdGgsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdCBzaG93X3NwaV9ob3N0X2hiYV9pZChzdHJ1Y3QgZGV2aWNlICpjZGV2LAorCQkJCSAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgICAgY2hhciAqYnVmKQoreworCXN0cnVjdCBTY3NpX0hvc3QgKnNob3N0ID0gdHJhbnNwb3J0X2NsYXNzX3RvX3Nob3N0KGNkZXYpOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHNob3N0LT50aGlzX2lkKTsKK30KK3N0YXRpYyBERVZJQ0VfQVRUUihoYmFfaWQsIFNfSVJVR08sCisJCSAgIHNob3dfc3BpX2hvc3RfaGJhX2lkLCBOVUxMKTsKKwogI2RlZmluZSBEVl9TRVQoeCwgeSkJCQlcCiAJaWYoaS0+Zi0+c2V0XyMjeCkJCVwKIAkJaS0+Zi0+c2V0XyMjeChzZGV2LT5zZGV2X3RhcmdldCwgeSkKQEAgLTEzODAsNiArMTQwMiw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICpob3N0X2F0dHJpYnV0ZXNbXSA9IHsKIAkmZGV2X2F0dHJfc2lnbmFsbGluZy5hdHRyLAorCSZkZXZfYXR0cl9ob3N0X3dpZHRoLmF0dHIsCisJJmRldl9hdHRyX2hiYV9pZC5hdHRyLAogCU5VTEwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2gvY2xrL2NvcmUuYyBiL2RyaXZlcnMvc2gvY2xrL2NvcmUuYwppbmRleCBkNjcwMmU1Li5kYzhkMDIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NoL2Nsay9jb3JlLmMKKysrIGIvZHJpdmVycy9zaC9jbGsvY29yZS5jCkBAIC0zNCw2ICszNCw5IEBACiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGNsb2NrX2xvY2spOwogc3RhdGljIERFRklORV9NVVRFWChjbG9ja19saXN0X3NlbSk7CiAKKy8qIGNsb2NrIGRpc2FibGUgb3BlcmF0aW9ucyBhcmUgbm90IHBhc3NlZCBvbiB0byBoYXJkd2FyZSBkdXJpbmcgYm9vdCAqLworc3RhdGljIGludCBhbGxvd19kaXNhYmxlOworCiB2b2lkIGNsa19yYXRlX3RhYmxlX2J1aWxkKHN0cnVjdCBjbGsgKmNsaywKIAkJCSAgc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICpmcmVxX3RhYmxlLAogCQkJICBpbnQgbnJfZnJlcXMsCkBAIC0yMjgsNyArMjMxLDcgQEAKIAkJcmV0dXJuOwogCiAJaWYgKCEoLS1jbGstPnVzZWNvdW50KSkgewotCQlpZiAobGlrZWx5KGNsay0+b3BzICYmIGNsay0+b3BzLT5kaXNhYmxlKSkKKwkJaWYgKGxpa2VseShhbGxvd19kaXNhYmxlICYmIGNsay0+b3BzICYmIGNsay0+b3BzLT5kaXNhYmxlKSkKIAkJCWNsay0+b3BzLT5kaXNhYmxlKGNsayk7CiAJCWlmIChsaWtlbHkoY2xrLT5wYXJlbnQpKQogCQkJX19jbGtfZGlzYWJsZShjbGstPnBhcmVudCk7CkBAIC0zOTMsNyArMzk2LDcgQEAKIHsKIAlpbnQgcmV0OwogCi0JaWYgKGNsayA9PSBOVUxMIHx8IElTX0VSUihjbGspKQorCWlmIChJU19FUlJfT1JfTlVMTChjbGspKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qCkBAIC03NDQsMyArNzQ3LDI1IEBACiAJcmV0dXJuIGVycjsKIH0KIGxhdGVfaW5pdGNhbGwoY2xrX2RlYnVnZnNfaW5pdCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGNsa19sYXRlX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBjbGsgKmNsazsKKworCS8qIGRpc2FibGUgYWxsIGNsb2NrcyB3aXRoIHplcm8gdXNlIGNvdW50ICovCisJbXV0ZXhfbG9jaygmY2xvY2tfbGlzdF9zZW0pOworCXNwaW5fbG9ja19pcnFzYXZlKCZjbG9ja19sb2NrLCBmbGFncyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNsaywgJmNsb2NrX2xpc3QsIG5vZGUpCisJCWlmICghY2xrLT51c2Vjb3VudCAmJiBjbGstPm9wcyAmJiBjbGstPm9wcy0+ZGlzYWJsZSkKKwkJCWNsay0+b3BzLT5kaXNhYmxlKGNsayk7CisKKwkvKiBmcm9tIG5vdyBvbiBhbGxvdyBjbG9jayBkaXNhYmxlIG9wZXJhdGlvbnMgKi8KKwlhbGxvd19kaXNhYmxlID0gMTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNsb2NrX2xvY2ssIGZsYWdzKTsKKwltdXRleF91bmxvY2soJmNsb2NrX2xpc3Rfc2VtKTsKKwlyZXR1cm4gMDsKK30KK2xhdGVfaW5pdGNhbGwoY2xrX2xhdGVfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NwaS9zcGktcGwwMjIuYyBiL2RyaXZlcnMvc3BpL3NwaS1wbDAyMi5jCmluZGV4IGViYTg4YzcuLjczMGI0YTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3BpL3NwaS1wbDAyMi5jCisrKyBiL2RyaXZlcnMvc3BpL3NwaS1wbDAyMi5jCkBAIC0yMjY3LDE3ICsyMjY3LDEzIEBACiBwbDAyMl9yZW1vdmUoc3RydWN0IGFtYmFfZGV2aWNlICphZGV2KQogewogCXN0cnVjdCBwbDAyMiAqcGwwMjIgPSBhbWJhX2dldF9kcnZkYXRhKGFkZXYpOwotCWludCBzdGF0dXMgPSAwOworCiAJaWYgKCFwbDAyMikKIAkJcmV0dXJuIDA7CiAKIAkvKiBSZW1vdmUgdGhlIHF1ZXVlICovCi0Jc3RhdHVzID0gZGVzdHJveV9xdWV1ZShwbDAyMik7Ci0JaWYgKHN0YXR1cyAhPSAwKSB7Ci0JCWRldl9lcnIoJmFkZXYtPmRldiwKLQkJCSJxdWV1ZSByZW1vdmUgZmFpbGVkICglZClcbiIsIHN0YXR1cyk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQorCWlmIChkZXN0cm95X3F1ZXVlKHBsMDIyKSAhPSAwKQorCQlkZXZfZXJyKCZhZGV2LT5kZXYsICJxdWV1ZSByZW1vdmUgZmFpbGVkXG4iKTsKIAlsb2FkX3NzcF9kZWZhdWx0X2NvbmZpZyhwbDAyMik7CiAJcGwwMjJfZG1hX3JlbW92ZShwbDAyMik7CiAJZnJlZV9pcnEoYWRldi0+aXJxWzBdLCBwbDAyMik7CkBAIC0yMjg5LDcgKzIyODUsNiBAQAogCXNwaV91bnJlZ2lzdGVyX21hc3RlcihwbDAyMi0+bWFzdGVyKTsKIAlzcGlfbWFzdGVyX3B1dChwbDAyMi0+bWFzdGVyKTsKIAlhbWJhX3NldF9kcnZkYXRhKGFkZXYsIE5VTEwpOwotCWRldl9kYmcoJmFkZXYtPmRldiwgInJlbW92ZSBzdWNjZWVkZWRcbiIpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3hkMjA5OS9LY29uZmlnIGIvZHJpdmVycy9zdGFnaW5nL2N4ZDIwOTkvS2NvbmZpZwppbmRleCA5ZDYzOGMzLi5iNDhhZWZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3hkMjA5OS9LY29uZmlnCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeGQyMDk5L0tjb25maWcKQEAgLTEsOSArMSwxMCBAQAogY29uZmlnIERWQl9DWEQyMDk5Ci0gICAgICAgIHRyaXN0YXRlICJDWEQyMDk5QVIgQ29tbW9uIEludGVyZmFjZSBkcml2ZXIiCi0gICAgICAgIGRlcGVuZHMgb24gRFZCX0NPUkUgJiYgUENJICYmIEkyQyAmJiBEVkJfTkdFTkUKLSAgICAgICAgLS0taGVscC0tLQotICAgICAgICAgIFN1cHBvcnQgZm9yIHRoZSBDSSBtb2R1bGUgZm91bmQgb24gY2luZVMyIERWQi1TMiwgc3VwcG9ydGVkIGJ5Ci0JICB0aGUgTWljcm9uYXMgUENJZSBkZXZpY2UgZHJpdmVyIChuZ2VuZSkuCisJdHJpc3RhdGUgIkNYRDIwOTlBUiBDb21tb24gSW50ZXJmYWNlIGRyaXZlciIKKwlkZXBlbmRzIG9uIERWQl9DT1JFICYmIFBDSSAmJiBJMkMKKwktLS1oZWxwLS0tCisJICBTdXBwb3J0IGZvciB0aGUgQ0kgbW9kdWxlIGZvdW5kIG9uIGNhcmRzIGJhc2VkIG9uCisJICAtIE1pY3JvbmFzIG5nZW5lIFBDSWUgYnJpZGdlOiBjaW5lUzIgZXRjLgorCSAgLSBEaWdpdGFsIERldmljZXMgUENJZSBicmlkZ2U6IE9jdG9wdXMgc2VyaWVzCiAKIAkgIEZvciBub3csIGRhdGEgaXMgcGFzc2VkIHRocm91Z2ggJy9kZXYvZHZiL2FkYXB0ZXJYL3NlYzAnOgogCSAgICAtIEVuY3J5cHRlZCBkYXRhIG11c3QgYmUgd3JpdHRlbiB0byAnc2VjMCcuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY3hkMjA5OS9jeGQyMDk5LmMgYi9kcml2ZXJzL3N0YWdpbmcvY3hkMjA5OS9jeGQyMDk5LmMKaW5kZXggNTViMWM0YS4uMWMwNDE4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL2N4ZDIwOTkvY3hkMjA5OS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jeGQyMDk5L2N4ZDIwOTkuYwpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBjeGQyMDk5LmM6IERyaXZlciBmb3IgdGhlIENYRDIwOTlBUiBDb21tb24gSW50ZXJmYWNlIENvbnRyb2xsZXIKICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgRGlnaXRhbERldmljZXMgVUcKKyAqIENvcHlyaWdodCAoQykgMjAxMC0yMDExIERpZ2l0YWwgRGV2aWNlcyBHbWJICiAgKgogICoKICAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKQEAgLTQxLDEzICs0MSwxMyBAQAogCXN0cnVjdCBkdmJfY2FfZW41MDIyMSBlbjsKIAogCXN0cnVjdCBpMmNfYWRhcHRlciAqaTJjOwotCXU4ICAgICBhZHI7CisJc3RydWN0IGN4ZDIwOTlfY2ZnIGNmZzsKKwogCXU4ICAgICByZWdzWzB4MjNdOwogCXU4ICAgICBsYXN0YWRkcmVzczsKIAl1OCAgICAgY2xrX3JlZ19mOwogCXU4ICAgICBjbGtfcmVnX2I7CiAJaW50ICAgIG1vZGU7Ci0JdTMyICAgIGJpdHJhdGU7CiAJaW50ICAgIHJlYWR5OwogCWludCAgICBkcjsKIAlpbnQgICAgc2xvdF9zdGF0OwpAQCAtODksOSArODksOSBAQAogCQkJdTggcmVnLCB1OCAqdmFsKQogewogCXN0cnVjdCBpMmNfbXNnIG1zZ3NbMl0gPSB7ey5hZGRyID0gYWRyLCAuZmxhZ3MgPSAwLAotCQkJCSAgIC5idWYgPSAmcmVnLCAubGVuID0gMSB9LAorCQkJCSAgIC5idWYgPSAmcmVnLCAubGVuID0gMX0sCiAJCQkJICB7LmFkZHIgPSBhZHIsIC5mbGFncyA9IEkyQ19NX1JELAotCQkJCSAgIC5idWYgPSB2YWwsIC5sZW4gPSAxIH0gfTsKKwkJCQkgICAuYnVmID0gdmFsLCAubGVuID0gMX0gfTsKIAogCWlmIChpMmNfdHJhbnNmZXIoYWRhcHRlciwgbXNncywgMikgIT0gMikgewogCQlwcmludGsoS0VSTl9FUlIgImVycm9yIGluIGkyY19yZWFkX3JlZ1xuIik7CkBAIC0xMDQsOSArMTA0LDkgQEAKIAkJICAgIHU4IHJlZywgdTggKmRhdGEsIHU4IG4pCiB7CiAJc3RydWN0IGkyY19tc2cgbXNnc1syXSA9IHt7LmFkZHIgPSBhZHIsIC5mbGFncyA9IDAsCi0JCQkJICAgLmJ1ZiA9ICZyZWcsIC5sZW4gPSAxIH0sCi0JCQkJICB7LmFkZHIgPSBhZHIsIC5mbGFncyA9IEkyQ19NX1JELAotCQkJCSAgIC5idWYgPSBkYXRhLCAubGVuID0gbiB9IH07CisJCQkJIC5idWYgPSAmcmVnLCAubGVuID0gMX0sCisJCQkJey5hZGRyID0gYWRyLCAuZmxhZ3MgPSBJMkNfTV9SRCwKKwkJCQkgLmJ1ZiA9IGRhdGEsIC5sZW4gPSBufSB9OwogCiAJaWYgKGkyY190cmFuc2ZlcihhZGFwdGVyLCBtc2dzLCAyKSAhPSAyKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiZXJyb3IgaW4gaTJjX3JlYWRcbiIpOwpAQCAtMTE5LDEwICsxMTksMTAgQEAKIHsKIAlpbnQgc3RhdHVzOwogCi0Jc3RhdHVzID0gaTJjX3dyaXRlX3JlZyhjaS0+aTJjLCBjaS0+YWRyLCAwLCBhZHIpOworCXN0YXR1cyA9IGkyY193cml0ZV9yZWcoY2ktPmkyYywgY2ktPmNmZy5hZHIsIDAsIGFkcik7CiAJaWYgKCFzdGF0dXMpIHsKIAkJY2ktPmxhc3RhZGRyZXNzID0gYWRyOwotCQlzdGF0dXMgPSBpMmNfcmVhZChjaS0+aTJjLCBjaS0+YWRyLCAxLCBkYXRhLCBuKTsKKwkJc3RhdHVzID0gaTJjX3JlYWQoY2ktPmkyYywgY2ktPmNmZy5hZHIsIDEsIGRhdGEsIG4pOwogCX0KIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTM2LDI0ICsxMzYsMjQgQEAKIHN0YXRpYyBpbnQgcmVhZF9wY2NhcmQoc3RydWN0IGN4ZCAqY2ksIHUxNiBhZGRyZXNzLCB1OCAqZGF0YSwgdTggbikKIHsKIAlpbnQgc3RhdHVzOwotCXU4IGFkZHJbM10gPSB7IDIsIGFkZHJlc3MmMHhmZiwgYWRkcmVzcz4+OCB9OworCXU4IGFkZHJbM10gPSB7MiwgYWRkcmVzcyAmIDB4ZmYsIGFkZHJlc3MgPj4gOH07CiAKLQlzdGF0dXMgPSBpMmNfd3JpdGUoY2ktPmkyYywgY2ktPmFkciwgYWRkciwgMyk7CisJc3RhdHVzID0gaTJjX3dyaXRlKGNpLT5pMmMsIGNpLT5jZmcuYWRyLCBhZGRyLCAzKTsKIAlpZiAoIXN0YXR1cykKLQkJc3RhdHVzID0gaTJjX3JlYWQoY2ktPmkyYywgY2ktPmFkciwgMywgZGF0YSwgbik7CisJCXN0YXR1cyA9IGkyY19yZWFkKGNpLT5pMmMsIGNpLT5jZmcuYWRyLCAzLCBkYXRhLCBuKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0aWMgaW50IHdyaXRlX3BjY2FyZChzdHJ1Y3QgY3hkICpjaSwgdTE2IGFkZHJlc3MsIHU4ICpkYXRhLCB1OCBuKQogewogCWludCBzdGF0dXM7Ci0JdTggYWRkclszXSA9IHsgMiwgYWRkcmVzcyYweGZmLCBhZGRyZXNzPj44IH07CisJdTggYWRkclszXSA9IHsyLCBhZGRyZXNzICYgMHhmZiwgYWRkcmVzcyA+PiA4fTsKIAotCXN0YXR1cyA9IGkyY193cml0ZShjaS0+aTJjLCBjaS0+YWRyLCBhZGRyLCAzKTsKKwlzdGF0dXMgPSBpMmNfd3JpdGUoY2ktPmkyYywgY2ktPmNmZy5hZHIsIGFkZHIsIDMpOwogCWlmICghc3RhdHVzKSB7CiAJCXU4IGJ1ZlsyNTZdID0gezN9OwogCQltZW1jcHkoYnVmKzEsIGRhdGEsIG4pOwotCQlzdGF0dXMgPSBpMmNfd3JpdGUoY2ktPmkyYywgY2ktPmFkciwgYnVmLCBuKzEpOworCQlzdGF0dXMgPSBpMmNfd3JpdGUoY2ktPmkyYywgY2ktPmNmZy5hZHIsIGJ1ZiwgbisxKTsKIAl9CiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTE2MSwzOSArMTYxLDY0IEBACiBzdGF0aWMgaW50IHJlYWRfaW8oc3RydWN0IGN4ZCAqY2ksIHUxNiBhZGRyZXNzLCB1OCAqdmFsKQogewogCWludCBzdGF0dXM7Ci0JdTggYWRkclszXSA9IHsgMiwgYWRkcmVzcyYweGZmLCBhZGRyZXNzPj44IH07CisJdTggYWRkclszXSA9IHsyLCBhZGRyZXNzICYgMHhmZiwgYWRkcmVzcyA+PiA4fTsKIAotCXN0YXR1cyA9IGkyY193cml0ZShjaS0+aTJjLCBjaS0+YWRyLCBhZGRyLCAzKTsKKwlzdGF0dXMgPSBpMmNfd3JpdGUoY2ktPmkyYywgY2ktPmNmZy5hZHIsIGFkZHIsIDMpOwogCWlmICghc3RhdHVzKQotCQlzdGF0dXMgPSBpMmNfcmVhZChjaS0+aTJjLCBjaS0+YWRyLCAzLCB2YWwsIDEpOworCQlzdGF0dXMgPSBpMmNfcmVhZChjaS0+aTJjLCBjaS0+Y2ZnLmFkciwgMywgdmFsLCAxKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCiBzdGF0aWMgaW50IHdyaXRlX2lvKHN0cnVjdCBjeGQgKmNpLCB1MTYgYWRkcmVzcywgdTggdmFsKQogewogCWludCBzdGF0dXM7Ci0JdTggYWRkclszXSA9IHsgMiwgYWRkcmVzcyYweGZmLCBhZGRyZXNzPj44IH07Ci0JdTggYnVmWzJdID0geyAzLCB2YWwgfTsKKwl1OCBhZGRyWzNdID0gezIsIGFkZHJlc3MgJiAweGZmLCBhZGRyZXNzID4+IDh9OworCXU4IGJ1ZlsyXSA9IHszLCB2YWx9OwogCi0Jc3RhdHVzID0gaTJjX3dyaXRlKGNpLT5pMmMsIGNpLT5hZHIsIGFkZHIsIDMpOworCXN0YXR1cyA9IGkyY193cml0ZShjaS0+aTJjLCBjaS0+Y2ZnLmFkciwgYWRkciwgMyk7CiAJaWYgKCFzdGF0dXMpCi0JCXN0YXR1cyA9IGkyY193cml0ZShjaS0+aTJjLCBjaS0+YWRyLCBidWYsIDIpOwotCisJCXN0YXR1cyA9IGkyY193cml0ZShjaS0+aTJjLCBjaS0+Y2ZnLmFkciwgYnVmLCAyKTsKIAlyZXR1cm4gc3RhdHVzOwogfQogCisjaWYgMAorc3RhdGljIGludCByZWFkX2lvX2RhdGEoc3RydWN0IGN4ZCAqY2ksIHU4ICpkYXRhLCB1OCBuKQoreworCWludCBzdGF0dXM7CisJdTggYWRkclszXSA9IHsgMiwgMCwgMCB9OworCisJc3RhdHVzID0gaTJjX3dyaXRlKGNpLT5pMmMsIGNpLT5jZmcuYWRyLCBhZGRyLCAzKTsKKwlpZiAoIXN0YXR1cykKKwkJc3RhdHVzID0gaTJjX3JlYWQoY2ktPmkyYywgY2ktPmNmZy5hZHIsIDMsIGRhdGEsIG4pOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdyaXRlX2lvX2RhdGEoc3RydWN0IGN4ZCAqY2ksIHU4ICpkYXRhLCB1OCBuKQoreworCWludCBzdGF0dXM7CisJdTggYWRkclszXSA9IHsyLCAwLCAwfTsKKworCXN0YXR1cyA9IGkyY193cml0ZShjaS0+aTJjLCBjaS0+Y2ZnLmFkciwgYWRkciwgMyk7CisJaWYgKCFzdGF0dXMpIHsKKwkJdTggYnVmWzI1Nl0gPSB7M307CisJCW1lbWNweShidWYrMSwgZGF0YSwgbik7CisJCXN0YXR1cyA9IGkyY193cml0ZShjaS0+aTJjLCBjaS0+Y2ZnLmFkciwgYnVmLCBuICsgMSk7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCiAKIHN0YXRpYyBpbnQgd3JpdGVfcmVnbShzdHJ1Y3QgY3hkICpjaSwgdTggcmVnLCB1OCB2YWwsIHU4IG1hc2spCiB7CiAJaW50IHN0YXR1czsKIAotCXN0YXR1cyA9IGkyY193cml0ZV9yZWcoY2ktPmkyYywgY2ktPmFkciwgMCwgcmVnKTsKKwlzdGF0dXMgPSBpMmNfd3JpdGVfcmVnKGNpLT5pMmMsIGNpLT5jZmcuYWRyLCAwLCByZWcpOwogCWlmICghc3RhdHVzICYmIHJlZyA+PSA2ICYmIHJlZyA8PSA4ICYmIG1hc2sgIT0gMHhmZikKLQkJc3RhdHVzID0gaTJjX3JlYWRfcmVnKGNpLT5pMmMsIGNpLT5hZHIsIDEsICZjaS0+cmVnc1tyZWddKTsKLQljaS0+cmVnc1tyZWddID0gKGNpLT5yZWdzW3JlZ10mKH5tYXNrKSl8dmFsOworCQlzdGF0dXMgPSBpMmNfcmVhZF9yZWcoY2ktPmkyYywgY2ktPmNmZy5hZHIsIDEsICZjaS0+cmVnc1tyZWddKTsKKwljaS0+cmVnc1tyZWddID0gKGNpLT5yZWdzW3JlZ10gJiAofm1hc2spKSB8IHZhbDsKIAlpZiAoIXN0YXR1cykgewogCQljaS0+bGFzdGFkZHJlc3MgPSByZWc7Ci0JCXN0YXR1cyA9IGkyY193cml0ZV9yZWcoY2ktPmkyYywgY2ktPmFkciwgMSwgY2ktPnJlZ3NbcmVnXSk7CisJCXN0YXR1cyA9IGkyY193cml0ZV9yZWcoY2ktPmkyYywgY2ktPmNmZy5hZHIsIDEsIGNpLT5yZWdzW3JlZ10pOwogCX0KIAlpZiAocmVnID09IDB4MjApCiAJCWNpLT5yZWdzW3JlZ10gJj0gMHg3ZjsKQEAgLTIxMSwxMSArMjM2LDExIEBACiAJaW50IHN0YXR1czsKIAl1OCBidWZbMjU2XSA9IHsxfTsKIAotCXN0YXR1cyA9IGkyY193cml0ZV9yZWcoY2ktPmkyYywgY2ktPmFkciwgMCwgYWRyKTsKKwlzdGF0dXMgPSBpMmNfd3JpdGVfcmVnKGNpLT5pMmMsIGNpLT5jZmcuYWRyLCAwLCBhZHIpOwogCWlmICghc3RhdHVzKSB7CiAJCWNpLT5sYXN0YWRkcmVzcyA9IGFkcjsKLQkJbWVtY3B5KGJ1ZisxLCBkYXRhLCBuKTsKLQkJc3RhdHVzID0gaTJjX3dyaXRlKGNpLT5pMmMsIGNpLT5hZHIsIGJ1ZiwgbisxKTsKKwkJbWVtY3B5KGJ1ZiArIDEsIGRhdGEsIG4pOworCQlzdGF0dXMgPSBpMmNfd3JpdGUoY2ktPmkyYywgY2ktPmNmZy5hZHIsIGJ1ZiwgbiArIDEpOwogCX0KIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMjQ5LDEyICsyNzQsMTYgQEAKIAkJd3JpdGVfcmVnbShjaSwgMHgyMCwgMHg4MCwgMHg4MCk7CiAJCWJyZWFrOwogCWNhc2UgMHgwMToKKyNpZmRlZiBCVUZGRVJfTU9ERQorCQlpZiAoIWNpLT5lbi5yZWFkX2RhdGEpCisJCQlyZXR1cm47CiAJCXByaW50ayhLRVJOX0lORk8gImVuYWJsZSBjYW0gYnVmZmVyIG1vZGVcbiIpOwogCQkvKiB3cml0ZV9yZWcoY2ksIDB4MGQsIDB4MDApOyAqLwogCQkvKiB3cml0ZV9yZWcoY2ksIDB4MGUsIDB4MDEpOyAqLwogCQl3cml0ZV9yZWdtKGNpLCAweDA4LCAweDQwLCAweDQwKTsKIAkJLyogcmVhZF9yZWcoY2ksIDB4MTIsICZkdW1teSk7ICovCiAJCXdyaXRlX3JlZ20oY2ksIDB4MDgsIDB4ODAsIDB4ODApOworI2VuZGlmCiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpAQCAtMjY0LDggKzI5Myw2IEBACiAKIAogCi0jZGVmaW5lIENIS19FUlJPUihzKSBpZiAoKHN0YXR1cyA9IHMpKSBicmVhawotCiBzdGF0aWMgaW50IGluaXQoc3RydWN0IGN4ZCAqY2kpCiB7CiAJaW50IHN0YXR1czsKQEAgLTI3Myw2MyArMzAwLDE2MCBAQAogCW11dGV4X2xvY2soJmNpLT5sb2NrKTsKIAljaS0+bW9kZSA9IC0xOwogCWRvIHsKLQkJQ0hLX0VSUk9SKHdyaXRlX3JlZyhjaSwgMHgwMCwgMHgwMCkpOwotCQlDSEtfRVJST1Iod3JpdGVfcmVnKGNpLCAweDAxLCAweDAwKSk7Ci0JCUNIS19FUlJPUih3cml0ZV9yZWcoY2ksIDB4MDIsIDB4MTApKTsKLQkJQ0hLX0VSUk9SKHdyaXRlX3JlZyhjaSwgMHgwMywgMHgwMCkpOwotCQlDSEtfRVJST1Iod3JpdGVfcmVnKGNpLCAweDA1LCAweEZGKSk7Ci0JCUNIS19FUlJPUih3cml0ZV9yZWcoY2ksIDB4MDYsIDB4MUYpKTsKLQkJQ0hLX0VSUk9SKHdyaXRlX3JlZyhjaSwgMHgwNywgMHgxRikpOwotCQlDSEtfRVJST1Iod3JpdGVfcmVnKGNpLCAweDA4LCAweDI4KSk7Ci0JCUNIS19FUlJPUih3cml0ZV9yZWcoY2ksIDB4MTQsIDB4MjApKTsKKwkJc3RhdHVzID0gd3JpdGVfcmVnKGNpLCAweDAwLCAweDAwKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdHVzID0gd3JpdGVfcmVnKGNpLCAweDAxLCAweDAwKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdHVzID0gd3JpdGVfcmVnKGNpLCAweDAyLCAweDEwKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdHVzID0gd3JpdGVfcmVnKGNpLCAweDAzLCAweDAwKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdHVzID0gd3JpdGVfcmVnKGNpLCAweDA1LCAweEZGKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdHVzID0gd3JpdGVfcmVnKGNpLCAweDA2LCAweDFGKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdHVzID0gd3JpdGVfcmVnKGNpLCAweDA3LCAweDFGKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdHVzID0gd3JpdGVfcmVnKGNpLCAweDA4LCAweDI4KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdHVzID0gd3JpdGVfcmVnKGNpLCAweDE0LCAweDIwKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKIAotCQlDSEtfRVJST1Iod3JpdGVfcmVnKGNpLCAweDA5LCAweDREKSk7IC8qIElucHV0IE1vZGUgQywgQllQYXNzIFNlcmlhbCwgVElWQUwgPSBsb3csIE1TQiAqLwotCQlDSEtfRVJST1Iod3JpdGVfcmVnKGNpLCAweDBBLCAweEE3KSk7IC8qIFRPU1RSVCA9IDgsIE1vZGUgQiAoZ2F0ZWQgY2xvY2spLCBmYWxsaW5nIEVkZ2UsIFNlcmlhbCwgUE9MPUhJR0gsIE1TQiAqLwotCi0JCS8qIFN5bmMgZGV0ZWN0b3IgKi8KLQkJQ0hLX0VSUk9SKHdyaXRlX3JlZyhjaSwgMHgwQiwgMHgzMykpOwotCQlDSEtfRVJST1Iod3JpdGVfcmVnKGNpLCAweDBDLCAweDMzKSk7Ci0KLQkJQ0hLX0VSUk9SKHdyaXRlX3JlZ20oY2ksIDB4MTQsIDB4MDAsIDB4MEYpKTsKLQkJQ0hLX0VSUk9SKHdyaXRlX3JlZyhjaSwgMHgxNSwgY2ktPmNsa19yZWdfYikpOwotCQlDSEtfRVJST1Iod3JpdGVfcmVnbShjaSwgMHgxNiwgMHgwMCwgMHgwRikpOwotCQlDSEtfRVJST1Iod3JpdGVfcmVnKGNpLCAweDE3LCBjaS0+Y2xrX3JlZ19mKSk7Ci0KLQkJQ0hLX0VSUk9SKHdyaXRlX3JlZyhjaSwgMHgyMCwgMHgyOCkpOyAvKiBJbnRlZ2VyIERpdmlkZXIsIEZhbGxpbmcgRWRnZSwgSW50ZXJuYWwgU3luYywgKi8KLQkJQ0hLX0VSUk9SKHdyaXRlX3JlZyhjaSwgMHgyMSwgMHgwMCkpOyAvKiBNQ0xLSSA9IFRJQ0xLLzggKi8KLQkJQ0hLX0VSUk9SKHdyaXRlX3JlZyhjaSwgMHgyMiwgMHgwNykpOyAvKiBNQ0xLSSA9IFRJQ0xLLzggKi8KLQotCi0JCUNIS19FUlJPUih3cml0ZV9yZWdtKGNpLCAweDIwLCAweDgwLCAweDgwKSk7IC8qIFJlc2V0IENBTSBzdGF0ZSBtYWNoaW5lICovCi0KLQkJQ0hLX0VSUk9SKHdyaXRlX3JlZ20oY2ksIDB4MDMsIDB4MDIsIDAyKSk7ICAvKiBFbmFibGUgSVJFUUEgSW50ZXJydXB0ICovCi0JCUNIS19FUlJPUih3cml0ZV9yZWcoY2ksIDB4MDEsIDB4MDQpKTsgIC8qIEVuYWJsZSBDRCBJbnRlcnJ1cHQgKi8KLQkJQ0hLX0VSUk9SKHdyaXRlX3JlZyhjaSwgMHgwMCwgMHgzMSkpOyAgLyogRW5hYmxlIFRTMSxIb3QgU3dhcCxTbG90IEEgKi8KLQkJQ0hLX0VSUk9SKHdyaXRlX3JlZ20oY2ksIDB4MDksIDB4MDgsIDB4MDgpKTsgIC8qIFB1dCBUUyBpbiBieXBhc3MgKi8KLQkJY2ktPmNhbW1vZGUgPSAtMTsKLSNpZmRlZiBCVUZGRVJfTU9ERQotCQljYW1fbW9kZShjaSwgMCk7CisjaWYgMAorCQlzdGF0dXMgPSB3cml0ZV9yZWcoY2ksIDB4MDksIDB4NEQpOyAvKiBJbnB1dCBNb2RlIEMsIEJZUGFzcyBTZXJpYWwsIFRJVkFMID0gbG93LCBNU0IgKi8KKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKICNlbmRpZgorCQlzdGF0dXMgPSB3cml0ZV9yZWcoY2ksIDB4MEEsIDB4QTcpOyAvKiBUT1NUUlQgPSA4LCBNb2RlIEIgKGdhdGVkIGNsb2NrKSwgZmFsbGluZyBFZGdlLCBTZXJpYWwsIFBPTD1ISUdILCBNU0IgKi8KKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworCQlzdGF0dXMgPSB3cml0ZV9yZWcoY2ksIDB4MEIsIDB4MzMpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0dXMgPSB3cml0ZV9yZWcoY2ksIDB4MEMsIDB4MzMpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCisJCXN0YXR1cyA9IHdyaXRlX3JlZ20oY2ksIDB4MTQsIDB4MDAsIDB4MEYpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0dXMgPSB3cml0ZV9yZWcoY2ksIDB4MTUsIGNpLT5jbGtfcmVnX2IpOworCQlpZiAoc3RhdHVzIDwgMCkKKwkJCWJyZWFrOworCQlzdGF0dXMgPSB3cml0ZV9yZWdtKGNpLCAweDE2LCAweDAwLCAweDBGKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdHVzID0gd3JpdGVfcmVnKGNpLCAweDE3LCBjaS0+Y2xrX3JlZ19mKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKworCQlpZiAoY2ktPmNmZy5jbG9ja19tb2RlKSB7CisJCQlpZiAoY2ktPmNmZy5wb2xhcml0eSkgeworCQkJCXN0YXR1cyA9IHdyaXRlX3JlZyhjaSwgMHgwOSwgMHg2Zik7CisJCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlzdGF0dXMgPSB3cml0ZV9yZWcoY2ksIDB4MDksIDB4NmQpOworCQkJCWlmIChzdGF0dXMgPCAwKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCXN0YXR1cyA9IHdyaXRlX3JlZyhjaSwgMHgyMCwgMHg2OCk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlicmVhazsKKwkJCXN0YXR1cyA9IHdyaXRlX3JlZyhjaSwgMHgyMSwgMHgwMCk7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlicmVhazsKKwkJCXN0YXR1cyA9IHdyaXRlX3JlZyhjaSwgMHgyMiwgMHgwMik7CisJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCWlmIChjaS0+Y2ZnLnBvbGFyaXR5KSB7CisJCQkJc3RhdHVzID0gd3JpdGVfcmVnKGNpLCAweDA5LCAweDRmKTsKKwkJCQlpZiAoc3RhdHVzIDwgMCkKKwkJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCXN0YXR1cyA9IHdyaXRlX3JlZyhjaSwgMHgwOSwgMHg0ZCk7CisJCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJCWJyZWFrOworCQkJfQorCisJCQlzdGF0dXMgPSB3cml0ZV9yZWcoY2ksIDB4MjAsIDB4MjgpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJYnJlYWs7CisJCQlzdGF0dXMgPSB3cml0ZV9yZWcoY2ksIDB4MjEsIDB4MDApOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJYnJlYWs7CisJCQlzdGF0dXMgPSB3cml0ZV9yZWcoY2ksIDB4MjIsIDB4MDcpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJYnJlYWs7CisJCX0KKworCQlzdGF0dXMgPSB3cml0ZV9yZWdtKGNpLCAweDIwLCAweDgwLCAweDgwKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJc3RhdHVzID0gd3JpdGVfcmVnbShjaSwgMHgwMywgMHgwMiwgMHgwMik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IHdyaXRlX3JlZyhjaSwgMHgwMSwgMHgwNCk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisJCXN0YXR1cyA9IHdyaXRlX3JlZyhjaSwgMHgwMCwgMHgzMSk7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJYnJlYWs7CisKKwkJLyogUHV0IFRTIGluIGJ5cGFzcyAqLworCQlzdGF0dXMgPSB3cml0ZV9yZWdtKGNpLCAweDA5LCAweDA4LCAweDA4KTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlicmVhazsKKwkJY2ktPmNhbW1vZGUgPSAtMTsKKwkJY2FtX21vZGUoY2ksIDApOwogCX0gd2hpbGUgKDApOwogCW11dGV4X3VubG9jaygmY2ktPmxvY2spOwogCiAJcmV0dXJuIDA7CiB9CiAKLQogc3RhdGljIGludCByZWFkX2F0dHJpYnV0ZV9tZW0oc3RydWN0IGR2Yl9jYV9lbjUwMjIxICpjYSwKIAkJCSAgICAgIGludCBzbG90LCBpbnQgYWRkcmVzcykKIHsKIAlzdHJ1Y3QgY3hkICpjaSA9IGNhLT5kYXRhOworI2lmIDAKKwlpZiAoY2ktPmFtZW1fcmVhZCkgeworCQlpZiAoYWRkcmVzcyA8PSAwIHx8IGFkZHJlc3MgPiAxMDI0KQorCQkJcmV0dXJuIC1FSU87CisJCXJldHVybiBjaS0+YW1lbVthZGRyZXNzXTsKKwl9CisKKwltdXRleF9sb2NrKCZjaS0+bG9jayk7CisJd3JpdGVfcmVnbShjaSwgMHgwNiwgMHgwMCwgMHgwNSk7CisJcmVhZF9wY2NhcmQoY2ksIDAsICZjaS0+YW1lbVswXSwgMTI4KTsKKwlyZWFkX3BjY2FyZChjaSwgMTI4LCAmY2ktPmFtZW1bMF0sIDEyOCk7CisJcmVhZF9wY2NhcmQoY2ksIDI1NiwgJmNpLT5hbWVtWzBdLCAxMjgpOworCXJlYWRfcGNjYXJkKGNpLCAzODQsICZjaS0+YW1lbVswXSwgMTI4KTsKKwl3cml0ZV9yZWdtKGNpLCAweDA2LCAweDA1LCAweDA1KTsKKwltdXRleF91bmxvY2soJmNpLT5sb2NrKTsKKwlyZXR1cm4gY2ktPmFtZW1bYWRkcmVzc107CisjZWxzZQogCXU4IHZhbDsKIAltdXRleF9sb2NrKCZjaS0+bG9jayk7CiAJc2V0X21vZGUoY2ksIDEpOwogCXJlYWRfcGNjYXJkKGNpLCBhZGRyZXNzLCAmdmFsLCAxKTsKIAltdXRleF91bmxvY2soJmNpLT5sb2NrKTsKKwkvKiBwcmludGsoS0VSTl9JTkZPICIlMDJ4OiUwMnhcbiIsIGFkZHJlc3MsdmFsKTsgKi8KIAlyZXR1cm4gdmFsOworI2VuZGlmCiB9CiAKLQogc3RhdGljIGludCB3cml0ZV9hdHRyaWJ1dGVfbWVtKHN0cnVjdCBkdmJfY2FfZW41MDIyMSAqY2EsIGludCBzbG90LAogCQkJICAgICAgIGludCBhZGRyZXNzLCB1OCB2YWx1ZSkKIHsKQEAgLTM3Miw2ICs0OTYsMTUgQEAKIAlzdHJ1Y3QgY3hkICpjaSA9IGNhLT5kYXRhOwogCiAJbXV0ZXhfbG9jaygmY2ktPmxvY2spOworI2lmIDAKKwl3cml0ZV9yZWcoY2ksIDB4MDAsIDB4MjEpOworCXdyaXRlX3JlZyhjaSwgMHgwNiwgMHgxRik7CisJd3JpdGVfcmVnKGNpLCAweDAwLCAweDMxKTsKKyNlbHNlCisjaWYgMAorCXdyaXRlX3JlZyhjaSwgMHgwNiwgMHgxRik7CisJd3JpdGVfcmVnKGNpLCAweDA2LCAweDJGKTsKKyNlbHNlCiAJY2FtX21vZGUoY2ksIDApOwogCXdyaXRlX3JlZyhjaSwgMHgwMCwgMHgyMSk7CiAJd3JpdGVfcmVnKGNpLCAweDA2LCAweDFGKTsKQEAgLTM3OSwxMyArNTEyLDI1IEBACiAJd3JpdGVfcmVnbShjaSwgMHgyMCwgMHg4MCwgMHg4MCk7CiAJd3JpdGVfcmVnKGNpLCAweDAzLCAweDAyKTsKIAljaS0+cmVhZHkgPSAwOworI2VuZGlmCisjZW5kaWYKIAljaS0+bW9kZSA9IC0xOwogCXsKIAkJaW50IGk7CisjaWYgMAorCQl1OCB2YWw7CisjZW5kaWYKIAkJZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7CiAJCQltc2xlZXAoMTApOworI2lmIDAKKwkJCXJlYWRfcmVnKGNpLCAweDA2LCAmdmFsKTsKKwkJCXByaW50ayhLRVJOX0lORk8gIiVkOiUwMnhcbiIsIGksIHZhbCk7CisJCQlpZiAoISh2YWwmMHgxMCkpCisJCQkJYnJlYWs7CisjZWxzZQogCQkJaWYgKGNpLT5yZWFkeSkKIAkJCQlicmVhazsKKyNlbmRpZgogCQl9CiAJfQogCW11dGV4X3VubG9jaygmY2ktPmxvY2spOwpAQCAtMzk5LDEyICs1NDQsMTIgQEAKIAogCXByaW50ayhLRVJOX0lORk8gInNsb3Rfc2h1dGRvd25cbiIpOwogCW11dGV4X2xvY2soJmNpLT5sb2NrKTsKLQkvKiB3cml0ZV9yZWdtKGNpLCAweDA5LCAweDA4LCAweDA4KTsgKi8KLQl3cml0ZV9yZWdtKGNpLCAweDIwLCAweDgwLCAweDgwKTsKLQl3cml0ZV9yZWdtKGNpLCAweDA2LCAweDA3LCAweDA3KTsKKwl3cml0ZV9yZWdtKGNpLCAweDA5LCAweDA4LCAweDA4KTsKKwl3cml0ZV9yZWdtKGNpLCAweDIwLCAweDgwLCAweDgwKTsgLyogUmVzZXQgQ0FNIE1vZGUgKi8KKwl3cml0ZV9yZWdtKGNpLCAweDA2LCAweDA3LCAweDA3KTsgLyogQ2xlYXIgSU8gTW9kZSAqLwogCWNpLT5tb2RlID0gLTE7CiAJbXV0ZXhfdW5sb2NrKCZjaS0+bG9jayk7Ci0JcmV0dXJuIDA7IC8qIHNodXRkb3duKGNpKTsgKi8KKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBzbG90X3RzX2VuYWJsZShzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgKmNhLCBpbnQgc2xvdCkKQEAgLTQ1OSw3ICs2MDQsNiBAQAogCQlpZiAoaXN0YXQmOCAmJiBjaS0+c2xvdF9zdGF0ID09IERWQl9DQV9FTjUwMjIxX1BPTExfQ0FNX1BSRVNFTlQpIHsKIAkJCWNpLT5yZWFkeSA9IDE7CiAJCQljaS0+c2xvdF9zdGF0IHw9IERWQl9DQV9FTjUwMjIxX1BPTExfQ0FNX1JFQURZOwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiUkVBRFlcbiIpOwogCQl9CiAJfQogCXJldHVybiAwOwpAQCAtNTEwLDcgKzY1NCw3IEBACiAJc3RydWN0IGN4ZCAqY2kgPSBjYS0+ZGF0YTsKIAogCW11dGV4X2xvY2soJmNpLT5sb2NrKTsKLQlwcmludGsoS0VSTl9JTkZPICJ3cml0ZV9kYXRhICVkXG4iLCBlY291bnQpOworCXByaW50ayhrZXJuX0lORk8gIndyaXRlX2RhdGEgJWRcbiIsIGVjb3VudCk7CiAJd3JpdGVfcmVnKGNpLCAweDBkLCBlY291bnQ+PjgpOwogCXdyaXRlX3JlZyhjaSwgMHgwZSwgZWNvdW50JjB4ZmYpOwogCXdyaXRlX2Jsb2NrKGNpLCAweDExLCBlYnVmLCBlY291bnQpOwpAQCAtNTM1LDE1ICs2NzksMTUgQEAKIAogfTsKIAotc3RydWN0IGR2Yl9jYV9lbjUwMjIxICpjeGQyMDk5X2F0dGFjaCh1OCBhZHIsIHZvaWQgKnByaXYsCitzdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgKmN4ZDIwOTlfYXR0YWNoKHN0cnVjdCBjeGQyMDk5X2NmZyAqY2ZnLAorCQkJCSAgICAgIHZvaWQgKnByaXYsCiAJCQkJICAgICAgc3RydWN0IGkyY19hZGFwdGVyICppMmMpCiB7CiAJc3RydWN0IGN4ZCAqY2kgPSAwOwotCXUzMiBiaXRyYXRlID0gNjIwMDAwMDA7CiAJdTggdmFsOwogCi0JaWYgKGkyY19yZWFkX3JlZyhpMmMsIGFkciwgMCwgJnZhbCkgPCAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiTm8gQ1hEMjA5OSBkZXRlY3RlZCBhdCAlMDJ4XG4iLCBhZHIpOworCWlmIChpMmNfcmVhZF9yZWcoaTJjLCBjZmctPmFkciwgMCwgJnZhbCkgPCAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gIk5vIENYRDIwOTkgZGV0ZWN0ZWQgYXQgJTAyeFxuIiwgY2ZnLT5hZHIpOwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTU1MywyMSArNjk3LDIwIEBACiAJbWVtc2V0KGNpLCAwLCBzaXplb2YoKmNpKSk7CiAKIAltdXRleF9pbml0KCZjaS0+bG9jayk7CisJbWVtY3B5KCZjaS0+Y2ZnLCBjZmcsIHNpemVvZihzdHJ1Y3QgY3hkMjA5OV9jZmcpKTsKIAljaS0+aTJjID0gaTJjOwotCWNpLT5hZHIgPSBhZHI7CiAJY2ktPmxhc3RhZGRyZXNzID0gMHhmZjsKIAljaS0+Y2xrX3JlZ19iID0gMHg0YTsKIAljaS0+Y2xrX3JlZ19mID0gMHgxYjsKLQljaS0+Yml0cmF0ZSA9IGJpdHJhdGU7CiAKIAltZW1jcHkoJmNpLT5lbiwgJmVuX3RlbXBsLCBzaXplb2YoZW5fdGVtcGwpKTsKIAljaS0+ZW4uZGF0YSA9IGNpOwogCWluaXQoY2kpOwotCXByaW50ayhLRVJOX0lORk8gIkF0dGFjaGVkIENYRDIwOTlBUiBhdCAlMDJ4XG4iLCBjaS0+YWRyKTsKKwlwcmludGsoS0VSTl9JTkZPICJBdHRhY2hlZCBDWEQyMDk5QVIgYXQgJTAyeFxuIiwgY2ktPmNmZy5hZHIpOwogCXJldHVybiAmY2ktPmVuOwogfQogRVhQT1JUX1NZTUJPTChjeGQyMDk5X2F0dGFjaCk7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiY3hkMjA5OSIpOwotTU9EVUxFX0FVVEhPUigiUmFscGggTWV0emxlciA8cmprbUBtZXR6bGVyYnJvcy5kZT4iKTsKK01PRFVMRV9BVVRIT1IoIlJhbHBoIE1ldHpsZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3RhZ2luZy9jeGQyMDk5L2N4ZDIwOTkuaCBiL2RyaXZlcnMvc3RhZ2luZy9jeGQyMDk5L2N4ZDIwOTkuaAppbmRleCBiZWQ1NGZmLi4xOWM1ODhhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvY3hkMjA5OS9jeGQyMDk5LmgKKysrIGIvZHJpdmVycy9zdGFnaW5nL2N4ZDIwOTkvY3hkMjA5OS5oCkBAIC0xLDcgKzEsNyBAQAogLyoKICAqIGN4ZDIwOTkuaDogRHJpdmVyIGZvciB0aGUgQ1hEMjA5OUFSIENvbW1vbiBJbnRlcmZhY2UgQ29udHJvbGxlcgogICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBEaWdpdGFsRGV2aWNlcyBVRworICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgRGlnaXRhbCBEZXZpY2VzIEdtYkgKICAqCiAgKgogICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtMjcsMTEgKzI3LDIxIEBACiAKICNpbmNsdWRlIDxkdmJfY2FfZW41MDIyMS5oPgogCitzdHJ1Y3QgY3hkMjA5OV9jZmcgeworCXUzMiBiaXRyYXRlOworCXU4ICBhZHI7CisJdTggIHBvbGFyaXR5OjE7CisJdTggIGNsb2NrX21vZGU6MTsKK307CisKICNpZiBkZWZpbmVkKENPTkZJR19EVkJfQ1hEMjA5OSkgfHwgXAotICAgICAgICAoZGVmaW5lZChDT05GSUdfRFZCX0NYRDIwOTlfTU9EVUxFKSAmJiBkZWZpbmVkKE1PRFVMRSkpCi1zdHJ1Y3QgZHZiX2NhX2VuNTAyMjEgKmN4ZDIwOTlfYXR0YWNoKHU4IGFkciwgdm9pZCAqcHJpdiwgc3RydWN0IGkyY19hZGFwdGVyICppMmMpOworCShkZWZpbmVkKENPTkZJR19EVkJfQ1hEMjA5OV9NT0RVTEUpICYmIGRlZmluZWQoTU9EVUxFKSkKK3N0cnVjdCBkdmJfY2FfZW41MDIyMSAqY3hkMjA5OV9hdHRhY2goc3RydWN0IGN4ZDIwOTlfY2ZnICpjZmcsCisJCQkJICAgICAgdm9pZCAqcHJpdiwgc3RydWN0IGkyY19hZGFwdGVyICppMmMpOwogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGR2Yl9jYV9lbjUwMjIxICpjeGQyMDk5X2F0dGFjaCh1OCBhZHIsIHZvaWQgKnByaXYsIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjKQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkdmJfY2FfZW41MDIyMSAqY3hkMjA5OV9hdHRhY2goc3RydWN0IGN4ZDIwOTlfY2ZnICpjZmcsCisJCQkJCXZvaWQgKnByaXYsIHN0cnVjdCBpMmNfYWRhcHRlciAqaTJjKQogewogCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBkcml2ZXIgZGlzYWJsZWQgYnkgS2NvbmZpZ1xuIiwgX19mdW5jX18pOwogCXJldHVybiBOVUxMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtYWxzYS5jIGIvZHJpdmVycy9zdGFnaW5nL3RtNjAwMC90bTYwMDAtYWxzYS5jCmluZGV4IGRkZmQ3YzMuLmJkNWZhODkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy90bTYwMDAvdG02MDAwLWFsc2EuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdG02MDAwL3RtNjAwMC1hbHNhLmMKQEAgLTg0LDcgKzg0LDYgQEAKIAogCXRtNjAwMF9zZXRfYXVkaW9fYml0cmF0ZShjb3JlLCA0ODAwMCk7CiAKLQogCXJldHVybiAwOwogfQogCkBAIC0xMjMsNiArMTIyLDcgQEAKIAlpZiAoc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYXJlYSkgewogCQlpZiAoc3Vic3RyZWFtLT5ydW50aW1lLT5kbWFfYnl0ZXMgPiBzaXplKQogCQkJcmV0dXJuIDA7CisKIAkJZHNwX2J1ZmZlcl9mcmVlKHN1YnN0cmVhbSk7CiAJfQogCkBAIC0xNTIsOSArMTUyLDkgQEAKIAkJU05EUlZfUENNX0lORk9fTU1BUF9WQUxJRCwKIAkuZm9ybWF0cyA9IFNORFJWX1BDTV9GTVRCSVRfUzE2X0xFLAogCi0JLnJhdGVzID0JCVNORFJWX1BDTV9SQVRFX0NPTlRJTlVPVVMsCi0JLnJhdGVfbWluID0JCTQ4MDAwLAotCS5yYXRlX21heCA9CQk0ODAwMCwKKwkucmF0ZXMgPSBTTkRSVl9QQ01fUkFURV9DT05USU5VT1VTLAorCS5yYXRlX21pbiA9IDQ4MDAwLAorCS5yYXRlX21heCA9IDQ4MDAwLAogCS5jaGFubmVsc19taW4gPSAyLAogCS5jaGFubmVsc19tYXggPSAyLAogCS5wZXJpb2RfYnl0ZXNfbWluID0gNjQsCkBAIC0yNTQsOSArMjU0LDcgQEAKIAkJbWVtY3B5KHJ1bnRpbWUtPmRtYV9hcmVhICsgYnVmX3BvcyAqIHN0cmlkZSwgYnVmLAogCQkJbGVuZ3RoICogc3RyaWRlKTsKIAotI2lmbmRlZiBOT19QQ01fTE9DSwogCXNuZF9wY21fc3RyZWFtX2xvY2soc3Vic3RyZWFtKTsKLSNlbmRpZgogCiAJY2hpcC0+YnVmX3BvcyArPSBsZW5ndGg7CiAJaWYgKGNoaXAtPmJ1Zl9wb3MgPj0gcnVudGltZS0+YnVmZmVyX3NpemUpCkBAIC0yNjgsOSArMjY2LDcgQEAKIAkJcGVyaW9kX2VsYXBzZWQgPSAxOwogCX0KIAotI2lmbmRlZiBOT19QQ01fTE9DSwogCXNuZF9wY21fc3RyZWFtX3VubG9jayhzdWJzdHJlYW0pOwotI2VuZGlmCiAKIAlpZiAocGVyaW9kX2VsYXBzZWQpCiAJCXNuZF9wY21fcGVyaW9kX2VsYXBzZWQoc3Vic3RyZWFtKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL0tjb25maWcgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9LY29uZmlnCmluZGV4IDU2NGZmNGUuLjgzNDVmYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL0tjb25maWcKKysrIGIvZHJpdmVycy90YXJnZXQvaXNjc2kvS2NvbmZpZwpAQCAtMSw1ICsxLDYgQEAKIGNvbmZpZyBJU0NTSV9UQVJHRVQKIAl0cmlzdGF0ZSAiTGludXgtaVNDU0kub3JnIGlTQ1NJIFRhcmdldCBNb2RlIFN0YWNrIgorCWRlcGVuZHMgb24gTkVUCiAJc2VsZWN0IENSWVBUTwogCXNlbGVjdCBDUllQVE9fQ1JDMzJDCiAJc2VsZWN0IENSWVBUT19DUkMzMkNfSU5URUwgaWYgWDg2CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXQuYyBiL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldC5jCmluZGV4IDE0YzgxYzQuLmMyNGZiMTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldC5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldC5jCkBAIC0xMjAsNyArMTIwLDcgQEAKIAlzdHJ1Y3QgaXNjc2lfdGlxbiAqdGlxbiA9IE5VTEw7CiAJaW50IHJldDsKIAotCWlmIChzdHJsZW4oYnVmKSA+IElTQ1NJX0lRTl9MRU4pIHsKKwlpZiAoc3RybGVuKGJ1ZikgPj0gSVNDU0lfSVFOX0xFTikgewogCQlwcl9lcnIoIlRhcmdldCBJUU4gZXhjZWVkcyAlZCBieXRlc1xuIiwKIAkJCQlJU0NTSV9JUU5fTEVOKTsKIAkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CkBAIC0xODU3LDcgKzE4NTcsNyBAQAogCWNoYXIgKnRleHRfcHRyLCAqdGV4dF9pbjsKIAlpbnQgY21kc25fcmV0LCBuaW92ID0gMCwgcnhfZ290LCByeF9zaXplOwogCXUzMiBjaGVja3N1bSA9IDAsIGRhdGFfY3JjID0gMCwgcGF5bG9hZF9sZW5ndGg7Ci0JdTMyIHBhZGRpbmcgPSAwLCB0ZXh0X2xlbmd0aCA9IDA7CisJdTMyIHBhZGRpbmcgPSAwLCBwYWRfYnl0ZXMgPSAwLCB0ZXh0X2xlbmd0aCA9IDA7CiAJc3RydWN0IGlzY3NpX2NtZCAqY21kOwogCXN0cnVjdCBrdmVjIGlvdlszXTsKIAlzdHJ1Y3QgaXNjc2lfdGV4dCAqaGRyOwpAQCAtMTg5Niw3ICsxODk2LDcgQEAKIAogCQlwYWRkaW5nID0gKCgtcGF5bG9hZF9sZW5ndGgpICYgMyk7CiAJCWlmIChwYWRkaW5nICE9IDApIHsKLQkJCWlvdltuaW92XS5pb3ZfYmFzZSA9IGNtZC0+cGFkX2J5dGVzOworCQkJaW92W25pb3ZdLmlvdl9iYXNlID0gJnBhZF9ieXRlczsKIAkJCWlvdltuaW92KytdLmlvdl9sZW4gID0gcGFkZGluZzsKIAkJCXJ4X3NpemUgKz0gcGFkZGluZzsKIAkJCXByX2RlYnVnKCJSZWNlaXZpbmcgJXUgYWRkaXRpb25hbCBieXRlcyIKQEAgLTE5MTcsNyArMTkxNyw3IEBACiAJCWlmIChjb25uLT5jb25uX29wcy0+RGF0YURpZ2VzdCkgewogCQkJaXNjc2l0X2RvX2NyeXB0b19oYXNoX2J1ZigmY29ubi0+Y29ubl9yeF9oYXNoLAogCQkJCQl0ZXh0X2luLCB0ZXh0X2xlbmd0aCwKLQkJCQkJcGFkZGluZywgY21kLT5wYWRfYnl0ZXMsCisJCQkJCXBhZGRpbmcsICh1OCAqKSZwYWRfYnl0ZXMsCiAJCQkJCSh1OCAqKSZkYXRhX2NyYyk7CiAKIAkJCWlmIChjaGVja3N1bSAhPSBkYXRhX2NyYykgewpAQCAtMzQ2OCw3ICszNDY4LDEyIEBACiB9CiAKICNlbHNlCi0jZGVmaW5lIGlzY3NpdF90aHJlYWRfZ2V0X2NwdW1hc2soWCkgKHt9KQorCit2b2lkIGlzY3NpdF90aHJlYWRfZ2V0X2NwdW1hc2soc3RydWN0IGlzY3NpX2Nvbm4gKmNvbm4pCit7CisJcmV0dXJuOworfQorCiAjZGVmaW5lIGlzY3NpdF90aHJlYWRfY2hlY2tfY3B1bWFzayhYLCBZLCBaKSAoe30pCiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfY29uZmlnZnMuYyBiL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF9jb25maWdmcy5jCmluZGV4IDMyYmI5MmMuLmYwOTVlNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF9jb25maWdmcy5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF9jb25maWdmcy5jCkBAIC0xODEsNyArMTgxLDcgQEAKIAkJcmV0dXJuIEVSUl9QVFIoLUVPVkVSRkxPVyk7CiAJfQogCW1lbXNldChidWYsIDAsIE1BWF9QT1JUQUxfTEVOICsgMSk7Ci0Jc25wcmludGYoYnVmLCBNQVhfUE9SVEFMX0xFTiwgIiVzIiwgbmFtZSk7CisJc25wcmludGYoYnVmLCBNQVhfUE9SVEFMX0xFTiArIDEsICIlcyIsIG5hbWUpOwogCiAJbWVtc2V0KCZzb2NrYWRkciwgMCwgc2l6ZW9mKHN0cnVjdCBfX2tlcm5lbF9zb2NrYWRkcl9zdG9yYWdlKSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF9uZWdvLmMgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfbmVnby5jCmluZGV4IDcxM2E0ZDIuLjRkMDg3YWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF9uZWdvLmMKKysrIGIvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X25lZ28uYwpAQCAtOTc4LDcgKzk3OCw3IEBACiAJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igc3RydWN0IGlzY3NpX2xvZ2luLlxuIik7CiAJCWlzY3NpdF90eF9sb2dpbl9yc3AoY29ubiwgSVNDU0lfU1RBVFVTX0NMU19UQVJHRVRfRVJSLAogCQkJCUlTQ1NJX0xPR0lOX1NUQVRVU19OT19SRVNPVVJDRVMpOwotCQlnb3RvIG91dDsKKwkJcmV0dXJuIE5VTEw7CiAJfQogCiAJbG9naW4tPnJlcSA9IGt6YWxsb2MoSVNDU0lfSERSX0xFTiwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cmFuc3BvcnQuYyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3RyYW5zcG9ydC5jCmluZGV4IGM3NWEwMWEuLjg5NzYwMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3RyYW5zcG9ydC5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3RyYW5zcG9ydC5jCkBAIC0xNzQ3LDYgKzE3NDcsOCBAQAogfQogRVhQT1JUX1NZTUJPTCh0cmFuc3BvcnRfZ2VuZXJpY19oYW5kbGVfY2RiKTsKIAorc3RhdGljIHZvaWQgdHJhbnNwb3J0X2dlbmVyaWNfcmVxdWVzdF9mYWlsdXJlKHN0cnVjdCBzZV9jbWQgKiwKKwkJCXN0cnVjdCBzZV9kZXZpY2UgKiwgaW50LCBpbnQpOwogLyoKICAqIFVzZWQgYnkgZmFicmljIG1vZHVsZSBmcm9udGVuZHMgdG8gcXVldWUgdGFza3MgZGlyZWN0bHkuCiAgKiBNYW55IG9ubHkgYmUgdXNlZCBmcm9tIHByb2Nlc3MgY29udGV4dCBvbmx5CkBAIC0xNzU0LDYgKzE3NTYsOCBAQAogaW50IHRyYW5zcG9ydF9oYW5kbGVfY2RiX2RpcmVjdCgKIAlzdHJ1Y3Qgc2VfY21kICpjbWQpCiB7CisJaW50IHJldDsKKwogCWlmICghY21kLT5zZV9sdW4pIHsKIAkJZHVtcF9zdGFjaygpOwogCQlwcl9lcnIoImNtZC0+c2VfbHVuIGlzIE5VTExcbiIpOwpAQCAtMTc2NSw4ICsxNzY5LDMxIEBACiAJCQkJIiBmcm9tIGludGVycnVwdCBjb250ZXh0XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCi0JcmV0dXJuIHRyYW5zcG9ydF9nZW5lcmljX25ld19jbWQoY21kKTsKKwkvKgorCSAqIFNldCBUUkFOU1BPUlRfTkVXX0NNRCBzdGF0ZSBhbmQgY21kLT50X3RyYW5zcG9ydF9hY3RpdmU9MSBmb2xsb3dpbmcKKwkgKiB0cmFuc3BvcnRfZ2VuZXJpY19oYW5kbGVfY2RiKigpIC0+IHRyYW5zcG9ydF9hZGRfY21kX3RvX3F1ZXVlKCkKKwkgKiBpbiBleGlzdGluZyB1c2FnZSB0byBlbnN1cmUgdGhhdCBvdXRzdGFuZGluZyBkZXNjcmlwdG9ycyBhcmUgaGFuZGxlZAorCSAqIGNvcnJlY3RseSBkdXJpbmcgc2h1dGRvd24gdmlhIHRyYW5zcG9ydF9nZW5lcmljX3dhaXRfZm9yX3Rhc2tzKCkKKwkgKgorCSAqIEFsc28sIHdlIGRvbid0IHRha2UgY21kLT50X3N0YXRlX2xvY2sgaGVyZSBhcyB3ZSBvbmx5IGV4cGVjdAorCSAqIHRoaXMgdG8gYmUgY2FsbGVkIGZvciBpbml0aWFsIGRlc2NyaXB0b3Igc3VibWlzc2lvbi4KKwkgKi8KKwljbWQtPnRfc3RhdGUgPSBUUkFOU1BPUlRfTkVXX0NNRDsKKwlhdG9taWNfc2V0KCZjbWQtPnRfdHJhbnNwb3J0X2FjdGl2ZSwgMSk7CisJLyoKKwkgKiB0cmFuc3BvcnRfZ2VuZXJpY19uZXdfY21kKCkgaXMgYWxyZWFkeSBoYW5kbGluZyBRVUVVRV9GVUxMLAorCSAqIHNvIGZvbGxvdyBUUkFOU1BPUlRfTkVXX0NNRCBwcm9jZXNzaW5nIHRocmVhZCBjb250ZXh0IHVzYWdlCisJICogYW5kIGNhbGwgdHJhbnNwb3J0X2dlbmVyaWNfcmVxdWVzdF9mYWlsdXJlKCkgaWYgbmVjZXNzYXJ5Li4KKwkgKi8KKwlyZXQgPSB0cmFuc3BvcnRfZ2VuZXJpY19uZXdfY21kKGNtZCk7CisJaWYgKHJldCA9PSAtRUFHQUlOKQorCQlyZXR1cm4gMDsKKwllbHNlIGlmIChyZXQgPCAwKSB7CisJCWNtZC0+dHJhbnNwb3J0X2Vycm9yX3N0YXR1cyA9IHJldDsKKwkJdHJhbnNwb3J0X2dlbmVyaWNfcmVxdWVzdF9mYWlsdXJlKGNtZCwgTlVMTCwgMCwKKwkJCQkoY21kLT5kYXRhX2RpcmVjdGlvbiAhPSBETUFfVE9fREVWSUNFKSk7CisJfQorCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTCh0cmFuc3BvcnRfaGFuZGxlX2NkYl9kaXJlY3QpOwogCkBAIC0zMzI0LDcgKzMzNTEsNyBAQAogCQkJZ290byBvdXRfaW52YWxpZF9jZGJfZmllbGQ7CiAJCX0KIAotCQljbWQtPnRfdGFza19sYmEgPSBnZXRfdW5hbGlnbmVkX2JlMTYoJmNkYlsyXSk7CisJCWNtZC0+dF90YXNrX2xiYSA9IGdldF91bmFsaWduZWRfYmU2NCgmY2RiWzJdKTsKIAkJcGFzc3Rocm91Z2ggPSAoZGV2LT50cmFuc3BvcnQtPnRyYW5zcG9ydF90eXBlID09CiAJCQkJVFJBTlNQT1JUX1BMVUdJTl9QSEJBX1BERVYpOwogCQkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RjbV9mYy5oIGIvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RjbV9mYy5oCmluZGV4IGY3ZmZmN2UuLmJkNGZlMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90Y21fZmMuaAorKysgYi9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGNtX2ZjLmgKQEAgLTE4Nyw0ICsxODcsOSBAQAogCiBzc2l6ZV90IGZ0X2Zvcm1hdF93d24oY2hhciAqLCBzaXplX3QsIHU2NCk7CiAKKy8qCisgKiBVbmRlcmx5aW5nIEhXIHNwZWNpZmljIGhlbHBlciBmdW5jdGlvbgorICovCit2b2lkIGZ0X2ludmxfaHdfY29udGV4dChzdHJ1Y3QgZnRfY21kICopOworCiAjZW5kaWYgLyogX19UQ01fRkNfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX2NtZC5jIGIvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RmY19jbWQuYwppbmRleCAwOWRmMzhiLi41NjU0ZGMyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX2NtZC5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfY21kLmMKQEAgLTMyMCw2ICszMjAsNyBAQAogCWRlZmF1bHQ6CiAJCXByX2RlYnVnKCIlczogdW5oYW5kbGVkIGZyYW1lIHJfY3RsICV4XG4iLAogCQkgICAgICAgX19mdW5jX18sIGZoLT5maF9yX2N0bCk7CisJCWZ0X2ludmxfaHdfY29udGV4dChjbWQpOwogCQlmY19mcmFtZV9mcmVlKGZwKTsKIAkJdHJhbnNwb3J0X2dlbmVyaWNfZnJlZV9jbWQoJmNtZC0+c2VfY21kLCAwLCAwKTsKIAkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX2lvLmMgYi9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX2lvLmMKaW5kZXggOGUyYTQ2ZC4uYzM3ZjRjZCAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RmY19pby5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfaW8uYwpAQCAtMjEzLDYyICsyMTMsNDkgQEAKIAlpZiAoIShudG9oMjQoZmgtPmZoX2ZfY3RsKSAmIEZDX0ZDX1JFTF9PRkYpKQogCQlnb3RvIGRyb3A7CiAKLQkvKgotCSAqIERvZXNuJ3QgZXhwZWN0IGV2ZW4gc2luZ2xlIGJ5dGUgb2YgcGF5bG9hZC4gUGF5bG9hZAotCSAqIGlzIGV4cGVjdGVkIHRvIGJlIGNvcGllZCBkaXJlY3RseSB0byB1c2VyIGJ1ZmZlcnMKLQkgKiBkdWUgdG8gRERQIChMYXJnZSBSeCBvZmZsb2FkKSBmZWF0dXJlLCBoZW5jZQotCSAqIEJVR19PTiBpZiBCVUYgaXMgbm9uLU5VTEwKLQkgKi8KLQlidWYgPSBmY19mcmFtZV9wYXlsb2FkX2dldChmcCwgMSk7Ci0JaWYgKGNtZC0+d2FzX2RkcF9zZXR1cCAmJiBidWYpIHsKLQkJcHJfZGVidWcoIiVzOiBXaGVuIEREUCB3YXMgc2V0dXAsIG5vdCBleHBlY3RlZCB0byIKLQkJCQkgInJlY2VpdmUgZnJhbWUgd2l0aCBwYXlsb2FkLCBQYXlsb2FkIHNoYWxsIGJlIgotCQkJCSAiY29waWVkIGRpcmVjdGx5IHRvIGJ1ZmZlciBpbnN0ZWFkIG9mIGNvbWluZyAiCi0JCQkJICJ2aWEuIGxlZ2FjeSByZWNlaXZlIHF1ZXVlc1xuIiwgX19mdW5jX18pOwotCQlCVUdfT04oYnVmKTsKKwlmX2N0bCA9IG50b2gyNChmaC0+ZmhfZl9jdGwpOworCWVwID0gZmNfc2VxX2V4Y2goc2VxKTsKKwlscG9ydCA9IGVwLT5scDsKKwlpZiAoY21kLT53YXNfZGRwX3NldHVwKSB7CisJCUJVR19PTighZXApOworCQlCVUdfT04oIWxwb3J0KTsKIAl9CiAKIAkvKgotCSAqIElmIGZ0X2NtZCBpbmRpY2F0ZWQgJ2RkcF9zZXR1cCcsIGluIHRoYXQgY2FzZSBvbmx5IHRoZSBsYXN0IGZyYW1lCi0JICogc2hvdWxkIGNvbWUgd2l0aCAnVFNJIGJpdCBiZWluZyBzZXQnLiBJZiAnVFNJIGJpdCBpcyBub3Qgc2V0IGFuZCBpZgotCSAqIGRhdGEgZnJhbWUgYXBwZWFycyBoZXJlLCBtZWFucyBlcnJvciBjb25kaXRpb24uIEluIGJvdGggdGhlIGNhc2VzCi0JICogcmVsZWFzZSB0aGUgRERQIGNvbnRleHQgKGRkcF9wdXQpIGFuZCBpbiBlcnJvciBjYXNlLCBhcyB3ZWxsCi0JICogaW5pdGlhdGUgZXJyb3IgcmVjb3ZlcnkgbWVjaGFuaXNtLgorCSAqIERvZXNuJ3QgZXhwZWN0IHBheWxvYWQgaWYgRERQIGlzIHNldHVwLiBQYXlsb2FkCisJICogaXMgZXhwZWN0ZWQgdG8gYmUgY29waWVkIGRpcmVjdGx5IHRvIHVzZXIgYnVmZmVycworCSAqIGR1ZSB0byBERFAgKExhcmdlIFJ4IG9mZmxvYWQpLAogCSAqLwotCWVwID0gZmNfc2VxX2V4Y2goc2VxKTsKLQlpZiAoY21kLT53YXNfZGRwX3NldHVwKSB7Ci0JCUJVR19PTighZXApOwotCQlscG9ydCA9IGVwLT5scDsKLQkJQlVHX09OKCFscG9ydCk7Ci0JfQotCWlmIChjbWQtPndhc19kZHBfc2V0dXAgJiYgZXAtPnhpZCAhPSBGQ19YSURfVU5LTk9XTikgewotCQlmX2N0bCA9IG50b2gyNChmaC0+ZmhfZl9jdGwpOwotCQkvKgotCQkgKiBJZiBUU0kgYml0IHNldCBpbiBmX2N0bCwgbWVhbnMgbGFzdCB3cml0ZSBkYXRhIGZyYW1lIGlzCi0JCSAqIHJlY2VpdmVkIHN1Y2Nlc3NmdWxseSB3aGVyZSBwYXlsb2FkIGlzIHBvc3RlZCBkaXJlY3RseQotCQkgKiB0byB1c2VyIGJ1ZmZlciBhbmQgb25seSB0aGUgbGFzdCBmcmFtZSdzIGhlYWRlciBpcyBwb3N0ZWQKLQkJICogaW4gbGVnYWN5IHJlY2VpdmUgcXVldWUKLQkJICovCi0JCWlmIChmX2N0bCAmIEZDX0ZDX1NFUV9JTklUKSB7IC8qIFRTSSBiaXQgc2V0IGluIEZDIGZyYW1lICovCi0JCQljbWQtPndyaXRlX2RhdGFfbGVuID0gbHBvcnQtPnR0LmRkcF9kb25lKGxwb3J0LAotCQkJCQkJCQllcC0+eGlkKTsKLQkJCWdvdG8gbGFzdF9mcmFtZTsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBVcGRhdGluZyB0aGUgd3JpdGVfZGF0YV9sZW4gbWF5IGJlIG1lYW5pbmdsZXNzIGF0Ci0JCQkgKiB0aGlzIHBvaW50LCBidXQganVzdCBpbiBjYXNlIGlmIHJlcXVpcmVkIGluIGZ1dHVyZQotCQkJICogZm9yIGRlYnVnZ2luZyBvciBhbnkgb3RoZXIgcHVycG9zZQotCQkJICovCi0JCQlwcl9lcnIoIiVzOiBSZWNlaXZlZCBmcmFtZSB3aXRoIFRTSSBiaXQgbm90IgotCQkJCQkiIGJlaW5nIFNFVCwgZHJvcHBpbmcgdGhlIGZyYW1lLCAiCi0JCQkJCSJjbWQtPnNnIDwlcD4sIGNtZC0+c2dfY250IDwweCV4PlxuIiwKLQkJCQkJX19mdW5jX18sIGNtZC0+c2csIGNtZC0+c2dfY250KTsKLQkJCWNtZC0+d3JpdGVfZGF0YV9sZW4gPSBscG9ydC0+dHQuZGRwX2RvbmUobHBvcnQsCi0JCQkJCQkJICAgICAgZXAtPnhpZCk7Ci0JCQlscG9ydC0+dHQuc2VxX2V4Y2hfYWJvcnQoY21kLT5zZXEsIDApOwotCQkJZ290byBkcm9wOwotCQl9Ci0JfQorCWJ1ZiA9IGZjX2ZyYW1lX3BheWxvYWRfZ2V0KGZwLCAxKTsKKwlpZiAoYnVmKQorCQlwcl9lcnIoIiVzOiB4aWQgMHgleCwgZl9jdGwgMHgleCwgY21kLT5zZyAlcCwgIgorCQkJCSJjbWQtPnNnX2NudCAweCV4LiBERFAgd2FzIHNldHVwIgorCQkJCSIgaGVuY2Ugbm90IGV4cGVjdGVkIHRvIHJlY2VpdmUgZnJhbWUgd2l0aCAiCisJCQkJInBheWxvYWQsIEZyYW1lIHdpbGwgYmUgZHJvcHBlZCBpZiAiCisJCQkJIidTZXF1ZW5jZSBJbml0aWF0aXZlJyBiaXQgaW4gZl9jdGwgaXMgIgorCQkJCSJub3Qgc2V0XG4iLCBfX2Z1bmNfXywgZXAtPnhpZCwgZl9jdGwsCisJCQkJY21kLT5zZywgY21kLT5zZ19jbnQpOworCS8qCisgCSAqIEludmFsaWRhdGUgSFcgRERQIGNvbnRleHQgaWYgaXQgd2FzIHNldHVwIGZvciByZXNwZWN0aXZlCisgCSAqIGNvbW1hbmQuIEludmFsaWRhdGlvbiBvZiBIVyBERFAgY29udGV4dCBpcyByZXF1aXRlZCBpbiBib3RoCisgCSAqIHNpdHVhdGlvbiAoc3VjY2VzcyBhbmQgZXJyb3IpLiAKKyAJICovCisJZnRfaW52bF9od19jb250ZXh0KGNtZCk7CisKKwkvKgorCSAqIElmICJTZXF1ZW5jZSBJbml0aWF0aXZlIChUU0kpIiBiaXQgc2V0IGluIGZfY3RsLCBtZWFucyBsYXN0CisJICogd3JpdGUgZGF0YSBmcmFtZSBpcyByZWNlaXZlZCBzdWNjZXNzZnVsbHkgd2hlcmUgcGF5bG9hZCBpcworCSAqIHBvc3RlZCBkaXJlY3RseSB0byB1c2VyIGJ1ZmZlciBhbmQgb25seSB0aGUgbGFzdCBmcmFtZSdzCisJICogaGVhZGVyIGlzIHBvc3RlZCBpbiByZWNlaXZlIHF1ZXVlLgorCSAqCisJICogSWYgIlNlcXVlbmNlIEluaXRpYXRpdmUgKFRTSSkiIGJpdCBpcyBub3Qgc2V0LCBtZWFucyBlcnJvcgorCSAqIGNvbmRpdGlvbiB3LnIudC4gRERQLCBoZW5jZSBkcm9wIHRoZSBwYWNrZXQgYW5kIGxldCBleHBsaWN0CisJICogQUJPUlRTIGZyb20gb3RoZXIgZW5kIG9mIGV4Y2hhbmdlIHRpbWVyIHRyaWdnZXIgdGhlIHJlY292ZXJ5LgorCSAqLworCWlmIChmX2N0bCAmIEZDX0ZDX1NFUV9JTklUKQorCQlnb3RvIGxhc3RfZnJhbWU7CisJZWxzZQorCQlnb3RvIGRyb3A7CiAKIAlyZWxfb2ZmID0gbnRvaGwoZmgtPmZoX3Bhcm1fb2Zmc2V0KTsKIAlmcmFtZV9sZW4gPSBmcl9sZW4oZnApOwpAQCAtMzMxLDMgKzMxOCwzOSBAQAogZHJvcDoKIAlmY19mcmFtZV9mcmVlKGZwKTsKIH0KKworLyoKKyAqIEhhbmRsZSBhbmQgY2xlYW51cCBhbnkgSFcgc3BlY2lmaWMgcmVzb3VyY2VzIGlmCisgKiByZWNlaXZlZCBBQk9SVFMsIGVycm9ycywgdGltZW91dHMuCisgKi8KK3ZvaWQgZnRfaW52bF9od19jb250ZXh0KHN0cnVjdCBmdF9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgZmNfc2VxICpzZXEgPSBjbWQtPnNlcTsKKwlzdHJ1Y3QgZmNfZXhjaCAqZXAgPSBOVUxMOworCXN0cnVjdCBmY19scG9ydCAqbHBvcnQgPSBOVUxMOworCisJQlVHX09OKCFjbWQpOworCisJLyogQ2xlYW51cCB0aGUgRERQIGNvbnRleHQgaW4gSFcgaWYgRERQIHdhcyBzZXR1cCAqLworCWlmIChjbWQtPndhc19kZHBfc2V0dXAgJiYgc2VxKSB7CisJCWVwID0gZmNfc2VxX2V4Y2goc2VxKTsKKwkJaWYgKGVwKSB7CisJCQlscG9ydCA9IGVwLT5scDsKKwkJCWlmIChscG9ydCAmJiAoZXAtPnhpZCA8PSBscG9ydC0+bHJvX3hpZCkpCisJCQkJLyoKKwkJCQkgKiAiZGRwX2RvbmUiIHRyaWdnZXIgaW52YWxpZGF0aW9uIG9mIEhXCisJCQkJICogc3BlY2lmaWMgRERQIGNvbnRleHQKKwkJCQkgKi8KKwkJCQljbWQtPndyaXRlX2RhdGFfbGVuID0gbHBvcnQtPnR0LmRkcF9kb25lKGxwb3J0LAorCQkJCQkJCQkgICAgICBlcC0+eGlkKTsKKworCQkJCS8qCisJCQkJICogUmVzZXR0aW5nIHNhbWUgdmFyaWFibGUgdG8gaW5kaWNhdGUgSFcncworCQkJCSAqIEREUCBjb250ZXh0IGhhcyBiZWVuIGludmFsaWRhdGVkIHRvIGF2b2lkCisJCQkJICogcmVfaW52YWxpZGF0aW9uIG9mIHNhbWUgY29udGV4dCAoY29udGV4dCBpcworCQkJCSAqIGlkZW50aWZpZWQgdXNpbmcgZXAtPnhpZCkKKwkJCQkgKi8KKwkJCQljbWQtPndhc19kZHBfc2V0dXAgPSAwOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90aGVybWFsL0tjb25maWcgYi9kcml2ZXJzL3RoZXJtYWwvS2NvbmZpZwppbmRleCBiZjdjNjg3Li5mN2Y3MWIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RoZXJtYWwvS2NvbmZpZworKysgYi9kcml2ZXJzL3RoZXJtYWwvS2NvbmZpZwpAQCAtMTQsMTEgKzE0LDcgQEAKIAkgIElmIHlvdSB3YW50IHRoaXMgc3VwcG9ydCwgeW91IHNob3VsZCBzYXkgWSBvciBNIGhlcmUuCiAKIGNvbmZpZyBUSEVSTUFMX0hXTU9OCi0JYm9vbCAiSGFyZHdhcmUgbW9uaXRvcmluZyBzdXBwb3J0IgorCWJvb2wKIAlkZXBlbmRzIG9uIFRIRVJNQUwKIAlkZXBlbmRzIG9uIEhXTU9OPXkgfHwgSFdNT049VEhFUk1BTAotCWhlbHAKLQkgIFRoZSBnZW5lcmljIHRoZXJtYWwgc3lzZnMgZHJpdmVyJ3MgaGFyZHdhcmUgbW9uaXRvcmluZyBzdXBwb3J0Ci0JICByZXF1aXJlcyBhIDIuMTAuNy8zLjAuMiBvciBsYXRlciBsbS1zZW5zb3JzIHVzZXJzcGFjZS4KLQotCSAgU2F5IFkgaWYgeW91ciB1c2VyLXNwYWNlIGlzIG5ldyBlbm91Z2guCisJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RoZXJtYWwvdGhlcm1hbF9zeXMuYyBiL2RyaXZlcnMvdGhlcm1hbC90aGVybWFsX3N5cy5jCmluZGV4IDBiMWM4MmEuLjcwOGY4ZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGhlcm1hbC90aGVybWFsX3N5cy5jCisrKyBiL2RyaXZlcnMvdGhlcm1hbC90aGVybWFsX3N5cy5jCkBAIC00MjAsNiArNDIwLDI5IEBACiAKIC8qIGh3bW9uIHN5cyBJL0YgKi8KICNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorCisvKiB0aGVybWFsIHpvbmUgZGV2aWNlcyB3aXRoIHRoZSBzYW1lIHR5cGUgc2hhcmUgb25lIGh3bW9uIGRldmljZSAqLworc3RydWN0IHRoZXJtYWxfaHdtb25fZGV2aWNlIHsKKwljaGFyIHR5cGVbVEhFUk1BTF9OQU1FX0xFTkdUSF07CisJc3RydWN0IGRldmljZSAqZGV2aWNlOworCWludCBjb3VudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHR6X2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworfTsKKworc3RydWN0IHRoZXJtYWxfaHdtb25fYXR0ciB7CisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgYXR0cjsKKwljaGFyIG5hbWVbMTZdOworfTsKKworLyogb25lIHRlbXBlcmF0dXJlIGlucHV0IGZvciBlYWNoIHRoZXJtYWwgem9uZSAqLworc3RydWN0IHRoZXJtYWxfaHdtb25fdGVtcCB7CisJc3RydWN0IGxpc3RfaGVhZCBod21vbl9ub2RlOworCXN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0ejsKKwlzdHJ1Y3QgdGhlcm1hbF9od21vbl9hdHRyIHRlbXBfaW5wdXQ7CS8qIGh3bW9uIHN5cyBhdHRyICovCisJc3RydWN0IHRoZXJtYWxfaHdtb25fYXR0ciB0ZW1wX2NyaXQ7CS8qIGh3bW9uIHN5cyBhdHRyICovCit9OworCiBzdGF0aWMgTElTVF9IRUFEKHRoZXJtYWxfaHdtb25fbGlzdCk7CiAKIHN0YXRpYyBzc2l6ZV90CkBAIC00MzcsOSArNDYwLDEwIEBACiAJaW50IHJldDsKIAlzdHJ1Y3QgdGhlcm1hbF9od21vbl9hdHRyICpod21vbl9hdHRyCiAJCQk9IGNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3QgdGhlcm1hbF9od21vbl9hdHRyLCBhdHRyKTsKLQlzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSAqdHoKLQkJCT0gY29udGFpbmVyX29mKGh3bW9uX2F0dHIsIHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlLAorCXN0cnVjdCB0aGVybWFsX2h3bW9uX3RlbXAgKnRlbXAKKwkJCT0gY29udGFpbmVyX29mKGh3bW9uX2F0dHIsIHN0cnVjdCB0aGVybWFsX2h3bW9uX3RlbXAsCiAJCQkJICAgICAgIHRlbXBfaW5wdXQpOworCXN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0eiA9IHRlbXAtPnR6OwogCiAJcmV0ID0gdHotPm9wcy0+Z2V0X3RlbXAodHosICZ0ZW1wZXJhdHVyZSk7CiAKQEAgLTQ1NSw5ICs0NzksMTAgQEAKIHsKIAlzdHJ1Y3QgdGhlcm1hbF9od21vbl9hdHRyICpod21vbl9hdHRyCiAJCQk9IGNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3QgdGhlcm1hbF9od21vbl9hdHRyLCBhdHRyKTsKLQlzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSAqdHoKLQkJCT0gY29udGFpbmVyX29mKGh3bW9uX2F0dHIsIHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlLAorCXN0cnVjdCB0aGVybWFsX2h3bW9uX3RlbXAgKnRlbXAKKwkJCT0gY29udGFpbmVyX29mKGh3bW9uX2F0dHIsIHN0cnVjdCB0aGVybWFsX2h3bW9uX3RlbXAsCiAJCQkJICAgICAgIHRlbXBfY3JpdCk7CisJc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnR6ID0gdGVtcC0+dHo7CiAJbG9uZyB0ZW1wZXJhdHVyZTsKIAlpbnQgcmV0OwogCkBAIC00NjksMjIgKzQ5NCw1NCBAQAogfQogCiAKLXN0YXRpYyBpbnQKLXRoZXJtYWxfYWRkX2h3bW9uX3N5c2ZzKHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0eikKK3N0YXRpYyBzdHJ1Y3QgdGhlcm1hbF9od21vbl9kZXZpY2UgKgordGhlcm1hbF9od21vbl9sb29rdXBfYnlfdHlwZShjb25zdCBzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSAqdHopCiB7CiAJc3RydWN0IHRoZXJtYWxfaHdtb25fZGV2aWNlICpod21vbjsKLQlpbnQgbmV3X2h3bW9uX2RldmljZSA9IDE7Ci0JaW50IHJlc3VsdDsKIAogCW11dGV4X2xvY2soJnRoZXJtYWxfbGlzdF9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGh3bW9uLCAmdGhlcm1hbF9od21vbl9saXN0LCBub2RlKQogCQlpZiAoIXN0cmNtcChod21vbi0+dHlwZSwgdHotPnR5cGUpKSB7Ci0JCQluZXdfaHdtb25fZGV2aWNlID0gMDsKIAkJCW11dGV4X3VubG9jaygmdGhlcm1hbF9saXN0X2xvY2spOwotCQkJZ290byByZWdpc3Rlcl9zeXNfaW50ZXJmYWNlOworCQkJcmV0dXJuIGh3bW9uOwogCQl9CiAJbXV0ZXhfdW5sb2NrKCZ0aGVybWFsX2xpc3RfbG9jayk7CiAKKwlyZXR1cm4gTlVMTDsKK30KKworLyogRmluZCB0aGUgdGVtcGVyYXR1cmUgaW5wdXQgbWF0Y2hpbmcgYSBnaXZlbiB0aGVybWFsIHpvbmUgKi8KK3N0YXRpYyBzdHJ1Y3QgdGhlcm1hbF9od21vbl90ZW1wICoKK3RoZXJtYWxfaHdtb25fbG9va3VwX3RlbXAoY29uc3Qgc3RydWN0IHRoZXJtYWxfaHdtb25fZGV2aWNlICpod21vbiwKKwkJCSAgY29uc3Qgc3RydWN0IHRoZXJtYWxfem9uZV9kZXZpY2UgKnR6KQoreworCXN0cnVjdCB0aGVybWFsX2h3bW9uX3RlbXAgKnRlbXA7CisKKwltdXRleF9sb2NrKCZ0aGVybWFsX2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0ZW1wLCAmaHdtb24tPnR6X2xpc3QsIGh3bW9uX25vZGUpCisJCWlmICh0ZW1wLT50eiA9PSB0eikgeworCQkJbXV0ZXhfdW5sb2NrKCZ0aGVybWFsX2xpc3RfbG9jayk7CisJCQlyZXR1cm4gdGVtcDsKKwkJfQorCW11dGV4X3VubG9jaygmdGhlcm1hbF9saXN0X2xvY2spOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQKK3RoZXJtYWxfYWRkX2h3bW9uX3N5c2ZzKHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0eikKK3sKKwlzdHJ1Y3QgdGhlcm1hbF9od21vbl9kZXZpY2UgKmh3bW9uOworCXN0cnVjdCB0aGVybWFsX2h3bW9uX3RlbXAgKnRlbXA7CisJaW50IG5ld19od21vbl9kZXZpY2UgPSAxOworCWludCByZXN1bHQ7CisKKwlod21vbiA9IHRoZXJtYWxfaHdtb25fbG9va3VwX2J5X3R5cGUodHopOworCWlmIChod21vbikgeworCQluZXdfaHdtb25fZGV2aWNlID0gMDsKKwkJZ290byByZWdpc3Rlcl9zeXNfaW50ZXJmYWNlOworCX0KKwogCWh3bW9uID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRoZXJtYWxfaHdtb25fZGV2aWNlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFod21vbikKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC01MDIsMzAgKzU1OSwzNiBAQAogCQlnb3RvIGZyZWVfbWVtOwogCiAgcmVnaXN0ZXJfc3lzX2ludGVyZmFjZToKLQl0ei0+aHdtb24gPSBod21vbjsKKwl0ZW1wID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRoZXJtYWxfaHdtb25fdGVtcCksIEdGUF9LRVJORUwpOworCWlmICghdGVtcCkgeworCQlyZXN1bHQgPSAtRU5PTUVNOworCQlnb3RvIHVucmVnaXN0ZXJfbmFtZTsKKwl9CisKKwl0ZW1wLT50eiA9IHR6OwogCWh3bW9uLT5jb3VudCsrOwogCi0Jc25wcmludGYodHotPnRlbXBfaW5wdXQubmFtZSwgVEhFUk1BTF9OQU1FX0xFTkdUSCwKKwlzbnByaW50Zih0ZW1wLT50ZW1wX2lucHV0Lm5hbWUsIFRIRVJNQUxfTkFNRV9MRU5HVEgsCiAJCSAidGVtcCVkX2lucHV0IiwgaHdtb24tPmNvdW50KTsKLQl0ei0+dGVtcF9pbnB1dC5hdHRyLmF0dHIubmFtZSA9IHR6LT50ZW1wX2lucHV0Lm5hbWU7Ci0JdHotPnRlbXBfaW5wdXQuYXR0ci5hdHRyLm1vZGUgPSAwNDQ0OwotCXR6LT50ZW1wX2lucHV0LmF0dHIuc2hvdyA9IHRlbXBfaW5wdXRfc2hvdzsKLQlzeXNmc19hdHRyX2luaXQoJnR6LT50ZW1wX2lucHV0LmF0dHIuYXR0cik7Ci0JcmVzdWx0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKGh3bW9uLT5kZXZpY2UsICZ0ei0+dGVtcF9pbnB1dC5hdHRyKTsKKwl0ZW1wLT50ZW1wX2lucHV0LmF0dHIuYXR0ci5uYW1lID0gdGVtcC0+dGVtcF9pbnB1dC5uYW1lOworCXRlbXAtPnRlbXBfaW5wdXQuYXR0ci5hdHRyLm1vZGUgPSAwNDQ0OworCXRlbXAtPnRlbXBfaW5wdXQuYXR0ci5zaG93ID0gdGVtcF9pbnB1dF9zaG93OworCXN5c2ZzX2F0dHJfaW5pdCgmdGVtcC0+dGVtcF9pbnB1dC5hdHRyLmF0dHIpOworCXJlc3VsdCA9IGRldmljZV9jcmVhdGVfZmlsZShod21vbi0+ZGV2aWNlLCAmdGVtcC0+dGVtcF9pbnB1dC5hdHRyKTsKIAlpZiAocmVzdWx0KQotCQlnb3RvIHVucmVnaXN0ZXJfbmFtZTsKKwkJZ290byBmcmVlX3RlbXBfbWVtOwogCiAJaWYgKHR6LT5vcHMtPmdldF9jcml0X3RlbXApIHsKIAkJdW5zaWduZWQgbG9uZyB0ZW1wZXJhdHVyZTsKIAkJaWYgKCF0ei0+b3BzLT5nZXRfY3JpdF90ZW1wKHR6LCAmdGVtcGVyYXR1cmUpKSB7Ci0JCQlzbnByaW50Zih0ei0+dGVtcF9jcml0Lm5hbWUsIFRIRVJNQUxfTkFNRV9MRU5HVEgsCisJCQlzbnByaW50Zih0ZW1wLT50ZW1wX2NyaXQubmFtZSwgVEhFUk1BTF9OQU1FX0xFTkdUSCwKIAkJCQkidGVtcCVkX2NyaXQiLCBod21vbi0+Y291bnQpOwotCQkJdHotPnRlbXBfY3JpdC5hdHRyLmF0dHIubmFtZSA9IHR6LT50ZW1wX2NyaXQubmFtZTsKLQkJCXR6LT50ZW1wX2NyaXQuYXR0ci5hdHRyLm1vZGUgPSAwNDQ0OwotCQkJdHotPnRlbXBfY3JpdC5hdHRyLnNob3cgPSB0ZW1wX2NyaXRfc2hvdzsKLQkJCXN5c2ZzX2F0dHJfaW5pdCgmdHotPnRlbXBfY3JpdC5hdHRyLmF0dHIpOworCQkJdGVtcC0+dGVtcF9jcml0LmF0dHIuYXR0ci5uYW1lID0gdGVtcC0+dGVtcF9jcml0Lm5hbWU7CisJCQl0ZW1wLT50ZW1wX2NyaXQuYXR0ci5hdHRyLm1vZGUgPSAwNDQ0OworCQkJdGVtcC0+dGVtcF9jcml0LmF0dHIuc2hvdyA9IHRlbXBfY3JpdF9zaG93OworCQkJc3lzZnNfYXR0cl9pbml0KCZ0ZW1wLT50ZW1wX2NyaXQuYXR0ci5hdHRyKTsKIAkJCXJlc3VsdCA9IGRldmljZV9jcmVhdGVfZmlsZShod21vbi0+ZGV2aWNlLAotCQkJCQkJICAgICZ0ei0+dGVtcF9jcml0LmF0dHIpOworCQkJCQkJICAgICZ0ZW1wLT50ZW1wX2NyaXQuYXR0cik7CiAJCQlpZiAocmVzdWx0KQogCQkJCWdvdG8gdW5yZWdpc3Rlcl9pbnB1dDsKIAkJfQpAQCAtNTM0LDEzICs1OTcsMTUgQEAKIAltdXRleF9sb2NrKCZ0aGVybWFsX2xpc3RfbG9jayk7CiAJaWYgKG5ld19od21vbl9kZXZpY2UpCiAJCWxpc3RfYWRkX3RhaWwoJmh3bW9uLT5ub2RlLCAmdGhlcm1hbF9od21vbl9saXN0KTsKLQlsaXN0X2FkZF90YWlsKCZ0ei0+aHdtb25fbm9kZSwgJmh3bW9uLT50el9saXN0KTsKKwlsaXN0X2FkZF90YWlsKCZ0ZW1wLT5od21vbl9ub2RlLCAmaHdtb24tPnR6X2xpc3QpOwogCW11dGV4X3VubG9jaygmdGhlcm1hbF9saXN0X2xvY2spOwogCiAJcmV0dXJuIDA7CiAKICB1bnJlZ2lzdGVyX2lucHV0OgotCWRldmljZV9yZW1vdmVfZmlsZShod21vbi0+ZGV2aWNlLCAmdHotPnRlbXBfaW5wdXQuYXR0cik7CisJZGV2aWNlX3JlbW92ZV9maWxlKGh3bW9uLT5kZXZpY2UsICZ0ZW1wLT50ZW1wX2lucHV0LmF0dHIpOworIGZyZWVfdGVtcF9tZW06CisJa2ZyZWUodGVtcCk7CiAgdW5yZWdpc3Rlcl9uYW1lOgogCWlmIChuZXdfaHdtb25fZGV2aWNlKSB7CiAJCWRldmljZV9yZW1vdmVfZmlsZShod21vbi0+ZGV2aWNlLCAmZGV2X2F0dHJfbmFtZSk7CkBAIC01NTYsMTUgKzYyMSwzMCBAQAogc3RhdGljIHZvaWQKIHRoZXJtYWxfcmVtb3ZlX2h3bW9uX3N5c2ZzKHN0cnVjdCB0aGVybWFsX3pvbmVfZGV2aWNlICp0eikKIHsKLQlzdHJ1Y3QgdGhlcm1hbF9od21vbl9kZXZpY2UgKmh3bW9uID0gdHotPmh3bW9uOworCXN0cnVjdCB0aGVybWFsX2h3bW9uX2RldmljZSAqaHdtb247CisJc3RydWN0IHRoZXJtYWxfaHdtb25fdGVtcCAqdGVtcDsKIAotCXR6LT5od21vbiA9IE5VTEw7Ci0JZGV2aWNlX3JlbW92ZV9maWxlKGh3bW9uLT5kZXZpY2UsICZ0ei0+dGVtcF9pbnB1dC5hdHRyKTsKKwlod21vbiA9IHRoZXJtYWxfaHdtb25fbG9va3VwX2J5X3R5cGUodHopOworCWlmICh1bmxpa2VseSghaHdtb24pKSB7CisJCS8qIFNob3VsZCBuZXZlciBoYXBwZW4uLi4gKi8KKwkJZGV2X2RiZygmdHotPmRldmljZSwgImh3bW9uIGRldmljZSBsb29rdXAgZmFpbGVkIVxuIik7CisJCXJldHVybjsKKwl9CisKKwl0ZW1wID0gdGhlcm1hbF9od21vbl9sb29rdXBfdGVtcChod21vbiwgdHopOworCWlmICh1bmxpa2VseSghdGVtcCkpIHsKKwkJLyogU2hvdWxkIG5ldmVyIGhhcHBlbi4uLiAqLworCQlkZXZfZGJnKCZ0ei0+ZGV2aWNlLCAidGVtcGVyYXR1cmUgaW5wdXQgbG9va3VwIGZhaWxlZCFcbiIpOworCQlyZXR1cm47CisJfQorCisJZGV2aWNlX3JlbW92ZV9maWxlKGh3bW9uLT5kZXZpY2UsICZ0ZW1wLT50ZW1wX2lucHV0LmF0dHIpOwogCWlmICh0ei0+b3BzLT5nZXRfY3JpdF90ZW1wKQotCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoaHdtb24tPmRldmljZSwgJnR6LT50ZW1wX2NyaXQuYXR0cik7CisJCWRldmljZV9yZW1vdmVfZmlsZShod21vbi0+ZGV2aWNlLCAmdGVtcC0+dGVtcF9jcml0LmF0dHIpOwogCiAJbXV0ZXhfbG9jaygmdGhlcm1hbF9saXN0X2xvY2spOwotCWxpc3RfZGVsKCZ0ei0+aHdtb25fbm9kZSk7CisJbGlzdF9kZWwoJnRlbXAtPmh3bW9uX25vZGUpOworCWtmcmVlKHRlbXApOwogCWlmICghbGlzdF9lbXB0eSgmaHdtb24tPnR6X2xpc3QpKSB7CiAJCW11dGV4X3VubG9jaygmdGhlcm1hbF9saXN0X2xvY2spOwogCQlyZXR1cm47CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvS2NvbmZpZyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9LY29uZmlnCmluZGV4IGNiNDBiODIuLjRkY2IzN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9LY29uZmlnCkBAIC05NTksNyArOTU5LDcgQEAKIAogY29uZmlnIFNFUklBTF9TSF9TQ0kKIAl0cmlzdGF0ZSAiU3VwZXJIIFNDSShGKSBzZXJpYWwgcG9ydCBzdXBwb3J0IgotCWRlcGVuZHMgb24gSEFWRV9DTEsgJiYgKFNVUEVSSCB8fCBIODMwMCB8fCBBUkNIX1NITU9CSUxFKQorCWRlcGVuZHMgb24gSEFWRV9DTEsgJiYgKFNVUEVSSCB8fCBBUkNIX1NITU9CSUxFKQogCXNlbGVjdCBTRVJJQUxfQ09SRQogCiBjb25maWcgU0VSSUFMX1NIX1NDSV9OUl9VQVJUUwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2lteC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2lteC5jCmluZGV4IDIyZmU4MDEuLjdlOTFiM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdHR5L3NlcmlhbC9pbXguYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvaW14LmMKQEAgLTQ1LDEwICs0NSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcmF0aW9uYWwuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxtYWNoL2hhcmR3YXJlLmg+CiAjaW5jbHVkZSA8bWFjaC9pbXgtdWFydC5oPgogCiAvKiBSZWdpc3RlciBkZWZpbml0aW9ucyAqLwpAQCAtNjYsOCArNjcsOSBAQAogI2RlZmluZSBVQklSICAweGE0IC8qIEJSTSBJbmNyZW1lbnRhbCBSZWdpc3RlciAqLwogI2RlZmluZSBVQk1SICAweGE4IC8qIEJSTSBNb2R1bGF0b3IgUmVnaXN0ZXIgKi8KICNkZWZpbmUgVUJSQyAgMHhhYyAvKiBCYXVkIFJhdGUgQ291bnQgUmVnaXN0ZXIgKi8KLSNkZWZpbmUgTVgyX09ORU1TIDB4YjAgLyogT25lIE1pbGxpc2Vjb25kIHJlZ2lzdGVyICovCi0jZGVmaW5lIFVUUyAoY3B1X2lzX214MSgpID8gMHhkMCA6IDB4YjQpIC8qIFVBUlQgVGVzdCBSZWdpc3RlciAqLworI2RlZmluZSBJTVgyMV9PTkVNUyAweGIwIC8qIE9uZSBNaWxsaXNlY29uZCByZWdpc3RlciAqLworI2RlZmluZSBJTVgxX1VUUyAweGQwIC8qIFVBUlQgVGVzdCBSZWdpc3RlciBvbiBpLm14MSAqLworI2RlZmluZSBJTVgyMV9VVFMgMHhiNCAvKiBVQVJUIFRlc3QgUmVnaXN0ZXIgb24gYWxsIG90aGVyIGkubXgqLwogCiAvKiBVQVJUIENvbnRyb2wgUmVnaXN0ZXIgQml0IEZpZWxkcy4qLwogI2RlZmluZSAgVVJYRF9DSEFSUkRZICAgICgxPDwxNSkKQEAgLTg3LDcgKzg5LDcgQEAKICNkZWZpbmUgIFVDUjFfUlRTREVOICAgICAoMTw8NSkJIC8qIFJUUyBkZWx0YSBpbnRlcnJ1cHQgZW5hYmxlICovCiAjZGVmaW5lICBVQ1IxX1NOREJSSyAgICAgKDE8PDQpCSAvKiBTZW5kIGJyZWFrICovCiAjZGVmaW5lICBVQ1IxX1RETUFFTiAgICAgKDE8PDMpCSAvKiBUcmFuc21pdHRlciByZWFkeSBETUEgZW5hYmxlICovCi0jZGVmaW5lICBNWDFfVUNSMV9VQVJUQ0xLRU4gICgxPDwyKQkgLyogVUFSVCBjbG9jayBlbmFibGVkLCBteDEgb25seSAqLworI2RlZmluZSAgSU1YMV9VQ1IxX1VBUlRDTEtFTiAgKDE8PDIpICAvKiBVQVJUIGNsb2NrIGVuYWJsZWQsIGkubXgxIG9ubHkgKi8KICNkZWZpbmUgIFVDUjFfRE9aRSAgICAgICAoMTw8MSkJIC8qIERvemUgKi8KICNkZWZpbmUgIFVDUjFfVUFSVEVOICAgICAoMTw8MCkJIC8qIFVBUlQgZW5hYmxlZCAqLwogI2RlZmluZSAgVUNSMl9FU0NJICAgICAJICgxPDwxNSkgLyogRXNjYXBlIHNlcSBpbnRlcnJ1cHQgZW5hYmxlICovCkBAIC0xMTMsOSArMTE1LDcgQEAKICNkZWZpbmUgIFVDUjNfUlhEU0VOCSAoMTw8NikgIC8qIFJlY2VpdmUgc3RhdHVzIGludGVycnVwdCBlbmFibGUgKi8KICNkZWZpbmUgIFVDUjNfQUlSSU5URU4gICAoMTw8NSkgIC8qIEFzeW5jIElSIHdha2UgaW50ZXJydXB0IGVuYWJsZSAqLwogI2RlZmluZSAgVUNSM19BV0FLRU4JICgxPDw0KSAgLyogQXN5bmMgd2FrZSBpbnRlcnJ1cHQgZW5hYmxlICovCi0jZGVmaW5lICBNWDFfVUNSM19SRUYyNSAJICgxPDwzKSAgLyogUmVmIGZyZXEgMjUgTUh6LCBvbmx5IG9uIG14MSAqLwotI2RlZmluZSAgTVgxX1VDUjNfUkVGMzAgCSAoMTw8MikgIC8qIFJlZiBGcmVxIDMwIE1Ieiwgb25seSBvbiBteDEgKi8KLSNkZWZpbmUgIE1YMl9VQ1IzX1JYRE1VWFNFTAkgKDE8PDIpICAvKiBSWEQgTXV4ZWQgSW5wdXQgU2VsZWN0LCBvbiBteDIvbXgzICovCisjZGVmaW5lICBJTVgyMV9VQ1IzX1JYRE1VWFNFTAkgKDE8PDIpICAvKiBSWEQgTXV4ZWQgSW5wdXQgU2VsZWN0ICovCiAjZGVmaW5lICBVQ1IzX0lOVlQgIAkgKDE8PDEpICAvKiBJbnZlcnRlZCBJbmZyYXJlZCB0cmFuc21pc3Npb24gKi8KICNkZWZpbmUgIFVDUjNfQlBFTiAgCSAoMTw8MCkgIC8qIFByZXNldCByZWdpc3RlcnMgZW5hYmxlICovCiAjZGVmaW5lICBVQ1I0X0NUU1RMX1NIRiAgMTAgICAgICAvKiBDVFMgdHJpZ2dlciBsZXZlbCBzaGlmdCAqLwpAQCAtMTgxLDYgKzE4MSwxOCBAQAogCiAjZGVmaW5lIFVBUlRfTlIgOAogCisvKiBpLm14MjEgdHlwZSB1YXJ0IHJ1bnMgb24gYWxsIGkubXggZXhjZXB0IGkubXgxICovCitlbnVtIGlteF91YXJ0X3R5cGUgeworCUlNWDFfVUFSVCwKKwlJTVgyMV9VQVJULAorfTsKKworLyogZGV2aWNlIHR5cGUgZGVwZW5kZW50IHN0dWZmICovCitzdHJ1Y3QgaW14X3VhcnRfZGF0YSB7CisJdW5zaWduZWQgdXRzX3JlZzsKKwllbnVtIGlteF91YXJ0X3R5cGUgZGV2dHlwZTsKK307CisKIHN0cnVjdCBpbXhfcG9ydCB7CiAJc3RydWN0IHVhcnRfcG9ydAlwb3J0OwogCXN0cnVjdCB0aW1lcl9saXN0CXRpbWVyOwpAQCAtMTkyLDYgKzIwNCw3IEBACiAJdW5zaWduZWQgaW50CQlpcmRhX2ludl90eDoxOwogCXVuc2lnbmVkIHNob3J0CQl0cmN2X2RlbGF5OyAvKiB0cmFuc2NlaXZlciBkZWxheSAqLwogCXN0cnVjdCBjbGsJCSpjbGs7CisJc3RydWN0IGlteF91YXJ0X2RhdGEJKmRldmRhdGE7CiB9OwogCiAjaWZkZWYgQ09ORklHX0lSREEKQEAgLTIwMCw2ICsyMTMsNTIgQEAKICNkZWZpbmUgVVNFX0lSREEoc3BvcnQpCSgwKQogI2VuZGlmCiAKK3N0YXRpYyBzdHJ1Y3QgaW14X3VhcnRfZGF0YSBpbXhfdWFydF9kZXZkYXRhW10gPSB7CisJW0lNWDFfVUFSVF0gPSB7CisJCS51dHNfcmVnID0gSU1YMV9VVFMsCisJCS5kZXZ0eXBlID0gSU1YMV9VQVJULAorCX0sCisJW0lNWDIxX1VBUlRdID0geworCQkudXRzX3JlZyA9IElNWDIxX1VUUywKKwkJLmRldnR5cGUgPSBJTVgyMV9VQVJULAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCBpbXhfdWFydF9kZXZ0eXBlW10gPSB7CisJeworCQkubmFtZSA9ICJpbXgxLXVhcnQiLAorCQkuZHJpdmVyX2RhdGEgPSAoa2VybmVsX3Vsb25nX3QpICZpbXhfdWFydF9kZXZkYXRhW0lNWDFfVUFSVF0sCisJfSwgeworCQkubmFtZSA9ICJpbXgyMS11YXJ0IiwKKwkJLmRyaXZlcl9kYXRhID0gKGtlcm5lbF91bG9uZ190KSAmaW14X3VhcnRfZGV2ZGF0YVtJTVgyMV9VQVJUXSwKKwl9LCB7CisJCS8qIHNlbnRpbmVsICovCisJfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGxhdGZvcm0sIGlteF91YXJ0X2RldnR5cGUpOworCitzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBpbXhfdWFydF9kdF9pZHNbXSA9IHsKKwl7IC5jb21wYXRpYmxlID0gImZzbCxpbXgxLXVhcnQiLCAuZGF0YSA9ICZpbXhfdWFydF9kZXZkYXRhW0lNWDFfVUFSVF0sIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsaW14MjEtdWFydCIsIC5kYXRhID0gJmlteF91YXJ0X2RldmRhdGFbSU1YMjFfVUFSVF0sIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgaW14X3VhcnRfZHRfaWRzKTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCB1dHNfcmVnKHN0cnVjdCBpbXhfcG9ydCAqc3BvcnQpCit7CisJcmV0dXJuIHNwb3J0LT5kZXZkYXRhLT51dHNfcmVnOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19pbXgxX3VhcnQoc3RydWN0IGlteF9wb3J0ICpzcG9ydCkKK3sKKwlyZXR1cm4gc3BvcnQtPmRldmRhdGEtPmRldnR5cGUgPT0gSU1YMV9VQVJUOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19pbXgyMV91YXJ0KHN0cnVjdCBpbXhfcG9ydCAqc3BvcnQpCit7CisJcmV0dXJuIHNwb3J0LT5kZXZkYXRhLT5kZXZ0eXBlID09IElNWDIxX1VBUlQ7Cit9CisKIC8qCiAgKiBIYW5kbGUgYW55IGNoYW5nZSBvZiBtb2RlbSBzdGF0dXMgc2lnbmFsIHNpbmNlIHdlIHdlcmUgbGFzdCBjYWxsZWQuCiAgKi8KQEAgLTMyNiw3ICszODUsOCBAQAogCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdCA9ICZzcG9ydC0+cG9ydC5zdGF0ZS0+eG1pdDsKIAogCXdoaWxlICghdWFydF9jaXJjX2VtcHR5KHhtaXQpICYmCi0JCQkhKHJlYWRsKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVVFMpICYgVVRTX1RYRlVMTCkpIHsKKwkJCSEocmVhZGwoc3BvcnQtPnBvcnQubWVtYmFzZSArIHV0c19yZWcoc3BvcnQpKQorCQkJCSYgVVRTX1RYRlVMTCkpIHsKIAkJLyogc2VuZCB4bWl0LT5idWZbeG1pdC0+dGFpbF0KIAkJICogb3V0IHRoZSBwb3J0IGhlcmUgKi8KIAkJd3JpdGVsKHhtaXQtPmJ1Zlt4bWl0LT50YWlsXSwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVSVFgwKTsKQEAgLTM3Myw3ICs0MzMsNyBAQAogCQl3cml0ZWwodGVtcCwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVDUjQpOwogCX0KIAotCWlmIChyZWFkbChzcG9ydC0+cG9ydC5tZW1iYXNlICsgVVRTKSAmIFVUU19UWEVNUFRZKQorCWlmIChyZWFkbChzcG9ydC0+cG9ydC5tZW1iYXNlICsgdXRzX3JlZyhzcG9ydCkpICYgVVRTX1RYRU1QVFkpCiAJCWlteF90cmFuc21pdF9idWZmZXIoc3BvcnQpOwogfQogCkBAIC02ODksOSArNzQ5LDkgQEAKIAkJfQogCX0KIAotCWlmICghY3B1X2lzX214MSgpKSB7CisJaWYgKGlzX2lteDIxX3VhcnQoc3BvcnQpKSB7CiAJCXRlbXAgPSByZWFkbChzcG9ydC0+cG9ydC5tZW1iYXNlICsgVUNSMyk7Ci0JCXRlbXAgfD0gTVgyX1VDUjNfUlhETVVYU0VMOworCQl0ZW1wIHw9IElNWDIxX1VDUjNfUlhETVVYU0VMOwogCQl3cml0ZWwodGVtcCwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVDUjMpOwogCX0KIApAQCAtOTIzLDkgKzk4Myw5IEBACiAJd3JpdGVsKG51bSwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVCSVIpOwogCXdyaXRlbChkZW5vbSwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVCTVIpOwogCi0JaWYgKCFjcHVfaXNfbXgxKCkpCisJaWYgKGlzX2lteDIxX3VhcnQoc3BvcnQpKQogCQl3cml0ZWwoc3BvcnQtPnBvcnQudWFydGNsayAvIGRpdiAvIDEwMDAsCi0JCQkJc3BvcnQtPnBvcnQubWVtYmFzZSArIE1YMl9PTkVNUyk7CisJCQkJc3BvcnQtPnBvcnQubWVtYmFzZSArIElNWDIxX09ORU1TKTsKIAogCXdyaXRlbChvbGRfdWNyMSwgc3BvcnQtPnBvcnQubWVtYmFzZSArIFVDUjEpOwogCkBAIC0xMDQxLDcgKzExMDEsNyBAQAogewogCXN0cnVjdCBpbXhfcG9ydCAqc3BvcnQgPSAoc3RydWN0IGlteF9wb3J0ICopcG9ydDsKIAotCXdoaWxlIChyZWFkbChzcG9ydC0+cG9ydC5tZW1iYXNlICsgVVRTKSAmIFVUU19UWEZVTEwpCisJd2hpbGUgKHJlYWRsKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyB1dHNfcmVnKHNwb3J0KSkgJiBVVFNfVFhGVUxMKQogCQliYXJyaWVyKCk7CiAKIAl3cml0ZWwoY2gsIHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVUlRYMCk7CkBAIC0xMDYyLDggKzExMjIsOCBAQAogCXVjcjEgPSBvbGRfdWNyMSA9IHJlYWRsKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1IxKTsKIAlvbGRfdWNyMiA9IHJlYWRsKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBVQ1IyKTsKIAotCWlmIChjcHVfaXNfbXgxKCkpCi0JCXVjcjEgfD0gTVgxX1VDUjFfVUFSVENMS0VOOworCWlmIChpc19pbXgxX3VhcnQoc3BvcnQpKQorCQl1Y3IxIHw9IElNWDFfVUNSMV9VQVJUQ0xLRU47CiAJdWNyMSB8PSBVQ1IxX1VBUlRFTjsKIAl1Y3IxICY9IH4oVUNSMV9UWE1QVFlFTiB8IFVDUjFfUlJEWUVOIHwgVUNSMV9SVFNERU4pOwogCkBAIC0xMjIyLDYgKzEyODIsNTggQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIENPTkZJR19PRgorc3RhdGljIGludCBzZXJpYWxfaW14X3Byb2JlX2R0KHN0cnVjdCBpbXhfcG9ydCAqc3BvcnQsCisJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RhdGljIGludCBwb3J0bnVtID0gMDsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqb2ZfaWQgPQorCQkJb2ZfbWF0Y2hfZGV2aWNlKGlteF91YXJ0X2R0X2lkcywgJnBkZXYtPmRldik7CisKKwlpZiAoIW5wKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXNwb3J0LT5wb3J0LmxpbmUgPSBwb3J0bnVtKys7CisJaWYgKHNwb3J0LT5wb3J0LmxpbmUgPj0gVUFSVF9OUikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCAiZnNsLHVhcnQtaGFzLXJ0c2N0cyIsIE5VTEwpKQorCQlzcG9ydC0+aGF2ZV9ydHNjdHMgPSAxOworCisJaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgImZzbCxpcmRhLW1vZGUiLCBOVUxMKSkKKwkJc3BvcnQtPnVzZV9pcmRhID0gMTsKKworCXNwb3J0LT5kZXZkYXRhID0gb2ZfaWQtPmRhdGE7CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBzZXJpYWxfaW14X3Byb2JlX2R0KHN0cnVjdCBpbXhfcG9ydCAqc3BvcnQsCisJCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgc2VyaWFsX2lteF9wcm9iZV9wZGF0YShzdHJ1Y3QgaW14X3BvcnQgKnNwb3J0LAorCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBpbXh1YXJ0X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CisKKwlzcG9ydC0+cG9ydC5saW5lID0gcGRldi0+aWQ7CisJc3BvcnQtPmRldmRhdGEgPSAoc3RydWN0IGlteF91YXJ0X2RhdGEJKikgcGRldi0+aWRfZW50cnktPmRyaXZlcl9kYXRhOworCisJaWYgKCFwZGF0YSkKKwkJcmV0dXJuOworCisJaWYgKHBkYXRhLT5mbGFncyAmIElNWFVBUlRfSEFWRV9SVFNDVFMpCisJCXNwb3J0LT5oYXZlX3J0c2N0cyA9IDE7CisKKwlpZiAocGRhdGEtPmZsYWdzICYgSU1YVUFSVF9JUkRBKQorCQlzcG9ydC0+dXNlX2lyZGEgPSAxOworfQorCiBzdGF0aWMgaW50IHNlcmlhbF9pbXhfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgaW14X3BvcnQgKnNwb3J0OwpAQCAtMTIzNCw2ICsxMzQ2LDEwIEBACiAJaWYgKCFzcG9ydCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlyZXQgPSBzZXJpYWxfaW14X3Byb2JlX2R0KHNwb3J0LCBwZGV2KTsKKwlpZiAocmV0ID09IC1FTk9ERVYpCisJCXNlcmlhbF9pbXhfcHJvYmVfcGRhdGEoc3BvcnQsIHBkZXYpOworCiAJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlpZiAoIXJlcykgewogCQlyZXQgPSAtRU5PREVWOwpAQCAtMTI1OCw3ICsxMzc0LDYgQEAKIAlzcG9ydC0+cG9ydC5maWZvc2l6ZSA9IDMyOwogCXNwb3J0LT5wb3J0Lm9wcyA9ICZpbXhfcG9wczsKIAlzcG9ydC0+cG9ydC5mbGFncyA9IFVQRl9CT09UX0FVVE9DT05GOwotCXNwb3J0LT5wb3J0LmxpbmUgPSBwZGV2LT5pZDsKIAlpbml0X3RpbWVyKCZzcG9ydC0+dGltZXIpOwogCXNwb3J0LT50aW1lci5mdW5jdGlvbiA9IGlteF90aW1lb3V0OwogCXNwb3J0LT50aW1lci5kYXRhICAgICA9ICh1bnNpZ25lZCBsb25nKXNwb3J0OwpAQCAtMTI3MiwxNyArMTM4Nyw5IEBACiAKIAlzcG9ydC0+cG9ydC51YXJ0Y2xrID0gY2xrX2dldF9yYXRlKHNwb3J0LT5jbGspOwogCi0JaW14X3BvcnRzW3BkZXYtPmlkXSA9IHNwb3J0OworCWlteF9wb3J0c1tzcG9ydC0+cG9ydC5saW5lXSA9IHNwb3J0OwogCiAJcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlpZiAocGRhdGEgJiYgKHBkYXRhLT5mbGFncyAmIElNWFVBUlRfSEFWRV9SVFNDVFMpKQotCQlzcG9ydC0+aGF2ZV9ydHNjdHMgPSAxOwotCi0jaWZkZWYgQ09ORklHX0lSREEKLQlpZiAocGRhdGEgJiYgKHBkYXRhLT5mbGFncyAmIElNWFVBUlRfSVJEQSkpCi0JCXNwb3J0LT51c2VfaXJkYSA9IDE7Ci0jZW5kaWYKLQogCWlmIChwZGF0YSAmJiBwZGF0YS0+aW5pdCkgewogCQlyZXQgPSBwZGF0YS0+aW5pdChwZGV2KTsKIAkJaWYgKHJldCkKQEAgLTEzNDAsOSArMTQ0NywxMSBAQAogCiAJLnN1c3BlbmQJPSBzZXJpYWxfaW14X3N1c3BlbmQsCiAJLnJlc3VtZQkJPSBzZXJpYWxfaW14X3Jlc3VtZSwKKwkuaWRfdGFibGUJPSBpbXhfdWFydF9kZXZ0eXBlLAogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJpbXgtdWFydCIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkub2ZfbWF0Y2hfdGFibGUgPSBpbXhfdWFydF9kdF9pZHMsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9zaC1zY2kuYyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zaC1zY2kuYwppbmRleCBlYmQ4NjI5Li5kMGE1NjIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvc2gtc2NpLmMKKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL3NoLXNjaS5jCkBAIC01NCwxMCArNTQsNiBAQAogI2luY2x1ZGUgPGFzbS9zaF9iaW9zLmg+CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19IODMwMAotI2luY2x1ZGUgPGFzbS9ncGlvLmg+Ci0jZW5kaWYKLQogI2luY2x1ZGUgInNoLXNjaS5oIgogCiBzdHJ1Y3Qgc2NpX3BvcnQgewpAQCAtNjYsMTIgKzYyLDYgQEAKIAkvKiBQbGF0Zm9ybSBjb25maWd1cmF0aW9uICovCiAJc3RydWN0IHBsYXRfc2NpX3BvcnQJKmNmZzsKIAotCS8qIFBvcnQgZW5hYmxlIGNhbGxiYWNrICovCi0Jdm9pZAkJCSgqZW5hYmxlKShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KTsKLQotCS8qIFBvcnQgZGlzYWJsZSBjYWxsYmFjayAqLwotCXZvaWQJCQkoKmRpc2FibGUpKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpOwotCiAJLyogQnJlYWsgdGltZXIgKi8KIAlzdHJ1Y3QgdGltZXJfbGlzdAlicmVha190aW1lcjsKIAlpbnQJCQlicmVha19mbGFnOwpAQCAtODEsNiArNzEsOCBAQAogCS8qIEZ1bmN0aW9uIGNsb2NrICovCiAJc3RydWN0IGNsawkJKmZjbGs7CiAKKwljaGFyCQkJKmlycXN0cltTQ0l4X05SX0lSUVNdOworCiAJc3RydWN0IGRtYV9jaGFuCQkJKmNoYW5fdHg7CiAJc3RydWN0IGRtYV9jaGFuCQkJKmNoYW5fcng7CiAKQEAgLTEyMSw2ICsxMTMsMjc4IEBACiAJcmV0dXJuIGNvbnRhaW5lcl9vZih1YXJ0LCBzdHJ1Y3Qgc2NpX3BvcnQsIHBvcnQpOwogfQogCitzdHJ1Y3QgcGxhdF9zY2lfcmVnIHsKKwl1OCBvZmZzZXQsIHNpemU7Cit9OworCisvKiBIZWxwZXIgZm9yIGludmFsaWRhdGluZyBzcGVjaWZpYyBlbnRyaWVzIG9mIGFuIGluaGVyaXRlZCBtYXAuICovCisjZGVmaW5lIHNjaV9yZWdfaW52YWxpZAl7IC5vZmZzZXQgPSAwLCAuc2l6ZSA9IDAgfQorCitzdGF0aWMgc3RydWN0IHBsYXRfc2NpX3JlZyBzY2lfcmVnbWFwW1NDSXhfTlJfUkVHVFlQRVNdW1NDSXhfTlJfUkVHU10gPSB7CisJW1NDSXhfUFJPQkVfUkVHVFlQRV0gPSB7CisJCVswIC4uLiBTQ0l4X05SX1JFR1MgLSAxXSA9IHNjaV9yZWdfaW52YWxpZCwKKwl9LAorCisJLyoKKwkgKiBDb21tb24gU0NJIGRlZmluaXRpb25zLCBkZXBlbmRlbnQgb24gdGhlIHBvcnQncyByZWdzaGlmdAorCSAqIHZhbHVlLgorCSAqLworCVtTQ0l4X1NDSV9SRUdUWVBFXSA9IHsKKwkJW1NDU01SXQkJPSB7IDB4MDAsICA4IH0sCisJCVtTQ0JSUl0JCT0geyAweDAxLCAgOCB9LAorCQlbU0NTQ1JdCQk9IHsgMHgwMiwgIDggfSwKKwkJW1NDeFREUl0JPSB7IDB4MDMsICA4IH0sCisJCVtTQ3hTUl0JCT0geyAweDA0LCAgOCB9LAorCQlbU0N4UkRSXQk9IHsgMHgwNSwgIDggfSwKKwkJW1NDRkNSXQkJPSBzY2lfcmVnX2ludmFsaWQsCisJCVtTQ0ZEUl0JCT0gc2NpX3JlZ19pbnZhbGlkLAorCQlbU0NURkRSXQk9IHNjaV9yZWdfaW52YWxpZCwKKwkJW1NDUkZEUl0JPSBzY2lfcmVnX2ludmFsaWQsCisJCVtTQ1NQVFJdCT0gc2NpX3JlZ19pbnZhbGlkLAorCQlbU0NMU1JdCQk9IHNjaV9yZWdfaW52YWxpZCwKKwl9LAorCisJLyoKKwkgKiBDb21tb24gZGVmaW5pdGlvbnMgZm9yIGxlZ2FjeSBJckRBIHBvcnRzLCBkZXBlbmRlbnQgb24KKwkgKiByZWdzaGlmdCB2YWx1ZS4KKwkgKi8KKwlbU0NJeF9JUkRBX1JFR1RZUEVdID0geworCQlbU0NTTVJdCQk9IHsgMHgwMCwgIDggfSwKKwkJW1NDQlJSXQkJPSB7IDB4MDEsICA4IH0sCisJCVtTQ1NDUl0JCT0geyAweDAyLCAgOCB9LAorCQlbU0N4VERSXQk9IHsgMHgwMywgIDggfSwKKwkJW1NDeFNSXQkJPSB7IDB4MDQsICA4IH0sCisJCVtTQ3hSRFJdCT0geyAweDA1LCAgOCB9LAorCQlbU0NGQ1JdCQk9IHsgMHgwNiwgIDggfSwKKwkJW1NDRkRSXQkJPSB7IDB4MDcsIDE2IH0sCisJCVtTQ1RGRFJdCT0gc2NpX3JlZ19pbnZhbGlkLAorCQlbU0NSRkRSXQk9IHNjaV9yZWdfaW52YWxpZCwKKwkJW1NDU1BUUl0JPSBzY2lfcmVnX2ludmFsaWQsCisJCVtTQ0xTUl0JCT0gc2NpX3JlZ19pbnZhbGlkLAorCX0sCisKKwkvKgorCSAqIENvbW1vbiBTQ0lGQSBkZWZpbml0aW9ucy4KKwkgKi8KKwlbU0NJeF9TQ0lGQV9SRUdUWVBFXSA9IHsKKwkJW1NDU01SXQkJPSB7IDB4MDAsIDE2IH0sCisJCVtTQ0JSUl0JCT0geyAweDA0LCAgOCB9LAorCQlbU0NTQ1JdCQk9IHsgMHgwOCwgMTYgfSwKKwkJW1NDeFREUl0JPSB7IDB4MjAsICA4IH0sCisJCVtTQ3hTUl0JCT0geyAweDE0LCAxNiB9LAorCQlbU0N4UkRSXQk9IHsgMHgyNCwgIDggfSwKKwkJW1NDRkNSXQkJPSB7IDB4MTgsIDE2IH0sCisJCVtTQ0ZEUl0JCT0geyAweDFjLCAxNiB9LAorCQlbU0NURkRSXQk9IHNjaV9yZWdfaW52YWxpZCwKKwkJW1NDUkZEUl0JPSBzY2lfcmVnX2ludmFsaWQsCisJCVtTQ1NQVFJdCT0gc2NpX3JlZ19pbnZhbGlkLAorCQlbU0NMU1JdCQk9IHNjaV9yZWdfaW52YWxpZCwKKwl9LAorCisJLyoKKwkgKiBDb21tb24gU0NJRkIgZGVmaW5pdGlvbnMuCisJICovCisJW1NDSXhfU0NJRkJfUkVHVFlQRV0gPSB7CisJCVtTQ1NNUl0JCT0geyAweDAwLCAxNiB9LAorCQlbU0NCUlJdCQk9IHsgMHgwNCwgIDggfSwKKwkJW1NDU0NSXQkJPSB7IDB4MDgsIDE2IH0sCisJCVtTQ3hURFJdCT0geyAweDQwLCAgOCB9LAorCQlbU0N4U1JdCQk9IHsgMHgxNCwgMTYgfSwKKwkJW1NDeFJEUl0JPSB7IDB4NjAsICA4IH0sCisJCVtTQ0ZDUl0JCT0geyAweDE4LCAxNiB9LAorCQlbU0NGRFJdCQk9IHsgMHgxYywgMTYgfSwKKwkJW1NDVEZEUl0JPSBzY2lfcmVnX2ludmFsaWQsCisJCVtTQ1JGRFJdCT0gc2NpX3JlZ19pbnZhbGlkLAorCQlbU0NTUFRSXQk9IHNjaV9yZWdfaW52YWxpZCwKKwkJW1NDTFNSXQkJPSBzY2lfcmVnX2ludmFsaWQsCisJfSwKKworCS8qCisJICogQ29tbW9uIFNILTMgU0NJRiBkZWZpbml0aW9ucy4KKwkgKi8KKwlbU0NJeF9TSDNfU0NJRl9SRUdUWVBFXSA9IHsKKwkJW1NDU01SXQkJPSB7IDB4MDAsICA4IH0sCisJCVtTQ0JSUl0JCT0geyAweDAyLCAgOCB9LAorCQlbU0NTQ1JdCQk9IHsgMHgwNCwgIDggfSwKKwkJW1NDeFREUl0JPSB7IDB4MDYsICA4IH0sCisJCVtTQ3hTUl0JCT0geyAweDA4LCAxNiB9LAorCQlbU0N4UkRSXQk9IHsgMHgwYSwgIDggfSwKKwkJW1NDRkNSXQkJPSB7IDB4MGMsICA4IH0sCisJCVtTQ0ZEUl0JCT0geyAweDBlLCAxNiB9LAorCQlbU0NURkRSXQk9IHNjaV9yZWdfaW52YWxpZCwKKwkJW1NDUkZEUl0JPSBzY2lfcmVnX2ludmFsaWQsCisJCVtTQ1NQVFJdCT0gc2NpX3JlZ19pbnZhbGlkLAorCQlbU0NMU1JdCQk9IHNjaV9yZWdfaW52YWxpZCwKKwl9LAorCisJLyoKKwkgKiBDb21tb24gU0gtNChBKSBTQ0lGKEIpIGRlZmluaXRpb25zLgorCSAqLworCVtTQ0l4X1NINF9TQ0lGX1JFR1RZUEVdID0geworCQlbU0NTTVJdCQk9IHsgMHgwMCwgMTYgfSwKKwkJW1NDQlJSXQkJPSB7IDB4MDQsICA4IH0sCisJCVtTQ1NDUl0JCT0geyAweDA4LCAxNiB9LAorCQlbU0N4VERSXQk9IHsgMHgwYywgIDggfSwKKwkJW1NDeFNSXQkJPSB7IDB4MTAsIDE2IH0sCisJCVtTQ3hSRFJdCT0geyAweDE0LCAgOCB9LAorCQlbU0NGQ1JdCQk9IHsgMHgxOCwgMTYgfSwKKwkJW1NDRkRSXQkJPSB7IDB4MWMsIDE2IH0sCisJCVtTQ1RGRFJdCT0gc2NpX3JlZ19pbnZhbGlkLAorCQlbU0NSRkRSXQk9IHNjaV9yZWdfaW52YWxpZCwKKwkJW1NDU1BUUl0JPSB7IDB4MjAsIDE2IH0sCisJCVtTQ0xTUl0JCT0geyAweDI0LCAxNiB9LAorCX0sCisKKwkvKgorCSAqIENvbW1vbiBTSC00KEEpIFNDSUYoQikgZGVmaW5pdGlvbnMgZm9yIHBvcnRzIHdpdGhvdXQgYW4gU0NTUFRSCisJICogcmVnaXN0ZXIuCisJICovCisJW1NDSXhfU0g0X1NDSUZfTk9fU0NTUFRSX1JFR1RZUEVdID0geworCQlbU0NTTVJdCQk9IHsgMHgwMCwgMTYgfSwKKwkJW1NDQlJSXQkJPSB7IDB4MDQsICA4IH0sCisJCVtTQ1NDUl0JCT0geyAweDA4LCAxNiB9LAorCQlbU0N4VERSXQk9IHsgMHgwYywgIDggfSwKKwkJW1NDeFNSXQkJPSB7IDB4MTAsIDE2IH0sCisJCVtTQ3hSRFJdCT0geyAweDE0LCAgOCB9LAorCQlbU0NGQ1JdCQk9IHsgMHgxOCwgMTYgfSwKKwkJW1NDRkRSXQkJPSB7IDB4MWMsIDE2IH0sCisJCVtTQ1RGRFJdCT0gc2NpX3JlZ19pbnZhbGlkLAorCQlbU0NSRkRSXQk9IHNjaV9yZWdfaW52YWxpZCwKKwkJW1NDU1BUUl0JPSBzY2lfcmVnX2ludmFsaWQsCisJCVtTQ0xTUl0JCT0geyAweDI0LCAxNiB9LAorCX0sCisKKwkvKgorCSAqIENvbW1vbiBTSC00KEEpIFNDSUYoQikgZGVmaW5pdGlvbnMgZm9yIHBvcnRzIHdpdGggRklGTyBkYXRhCisJICogY291bnQgcmVnaXN0ZXJzLgorCSAqLworCVtTQ0l4X1NINF9TQ0lGX0ZJRk9EQVRBX1JFR1RZUEVdID0geworCQlbU0NTTVJdCQk9IHsgMHgwMCwgMTYgfSwKKwkJW1NDQlJSXQkJPSB7IDB4MDQsICA4IH0sCisJCVtTQ1NDUl0JCT0geyAweDA4LCAxNiB9LAorCQlbU0N4VERSXQk9IHsgMHgwYywgIDggfSwKKwkJW1NDeFNSXQkJPSB7IDB4MTAsIDE2IH0sCisJCVtTQ3hSRFJdCT0geyAweDE0LCAgOCB9LAorCQlbU0NGQ1JdCQk9IHsgMHgxOCwgMTYgfSwKKwkJW1NDRkRSXQkJPSB7IDB4MWMsIDE2IH0sCisJCVtTQ1RGRFJdCT0geyAweDFjLCAxNiB9LAkvKiBhbGlhc2VkIHRvIFNDRkRSICovCisJCVtTQ1JGRFJdCT0geyAweDIwLCAxNiB9LAorCQlbU0NTUFRSXQk9IHsgMHgyNCwgMTYgfSwKKwkJW1NDTFNSXQkJPSB7IDB4MjgsIDE2IH0sCisJfSwKKworCS8qCisJICogU0g3NzA1LXN0eWxlIFNDSUYoQikgcG9ydHMsIGxhY2tpbmcgYm90aCBTQ1NQVFIgYW5kIFNDTFNSCisJICogcmVnaXN0ZXJzLgorCSAqLworCVtTQ0l4X1NINzcwNV9TQ0lGX1JFR1RZUEVdID0geworCQlbU0NTTVJdCQk9IHsgMHgwMCwgMTYgfSwKKwkJW1NDQlJSXQkJPSB7IDB4MDQsICA4IH0sCisJCVtTQ1NDUl0JCT0geyAweDA4LCAxNiB9LAorCQlbU0N4VERSXQk9IHsgMHgyMCwgIDggfSwKKwkJW1NDeFNSXQkJPSB7IDB4MTQsIDE2IH0sCisJCVtTQ3hSRFJdCT0geyAweDI0LCAgOCB9LAorCQlbU0NGQ1JdCQk9IHsgMHgxOCwgMTYgfSwKKwkJW1NDRkRSXQkJPSB7IDB4MWMsIDE2IH0sCisJCVtTQ1RGRFJdCT0gc2NpX3JlZ19pbnZhbGlkLAorCQlbU0NSRkRSXQk9IHNjaV9yZWdfaW52YWxpZCwKKwkJW1NDU1BUUl0JPSBzY2lfcmVnX2ludmFsaWQsCisJCVtTQ0xTUl0JCT0gc2NpX3JlZ19pbnZhbGlkLAorCX0sCit9OworCisjZGVmaW5lIHNjaV9nZXRyZWcodXAsIG9mZnNldCkJCShzY2lfcmVnbWFwW3RvX3NjaV9wb3J0KHVwKS0+Y2ZnLT5yZWd0eXBlXSArIG9mZnNldCkKKworLyoKKyAqIFRoZSAib2Zmc2V0IiBoZXJlIGlzIHJhdGhlciBtaXNsZWFkaW5nLCBpbiB0aGF0IGl0IHJlZmVycyB0byBhbiBlbnVtCisgKiB2YWx1ZSByZWxhdGl2ZSB0byB0aGUgcG9ydCBtYXBwaW5nIHJhdGhlciB0aGFuIHRoZSBmaXhlZCBvZmZzZXQKKyAqIGl0c2VsZiwgd2hpY2ggbmVlZHMgdG8gYmUgbWFudWFsbHkgcmV0cmlldmVkIGZyb20gdGhlIHBsYXRmb3JtJ3MKKyAqIHJlZ2lzdGVyIG1hcCBmb3IgdGhlIGdpdmVuIHBvcnQuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2NpX3NlcmlhbF9pbihzdHJ1Y3QgdWFydF9wb3J0ICpwLCBpbnQgb2Zmc2V0KQoreworCXN0cnVjdCBwbGF0X3NjaV9yZWcgKnJlZyA9IHNjaV9nZXRyZWcocCwgb2Zmc2V0KTsKKworCWlmIChyZWctPnNpemUgPT0gOCkKKwkJcmV0dXJuIGlvcmVhZDgocC0+bWVtYmFzZSArIChyZWctPm9mZnNldCA8PCBwLT5yZWdzaGlmdCkpOworCWVsc2UgaWYgKHJlZy0+c2l6ZSA9PSAxNikKKwkJcmV0dXJuIGlvcmVhZDE2KHAtPm1lbWJhc2UgKyAocmVnLT5vZmZzZXQgPDwgcC0+cmVnc2hpZnQpKTsKKwllbHNlCisJCVdBUk4oMSwgIkludmFsaWQgcmVnaXN0ZXIgYWNjZXNzXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzY2lfc2VyaWFsX291dChzdHJ1Y3QgdWFydF9wb3J0ICpwLCBpbnQgb2Zmc2V0LCBpbnQgdmFsdWUpCit7CisJc3RydWN0IHBsYXRfc2NpX3JlZyAqcmVnID0gc2NpX2dldHJlZyhwLCBvZmZzZXQpOworCisJaWYgKHJlZy0+c2l6ZSA9PSA4KQorCQlpb3dyaXRlOCh2YWx1ZSwgcC0+bWVtYmFzZSArIChyZWctPm9mZnNldCA8PCBwLT5yZWdzaGlmdCkpOworCWVsc2UgaWYgKHJlZy0+c2l6ZSA9PSAxNikKKwkJaW93cml0ZTE2KHZhbHVlLCBwLT5tZW1iYXNlICsgKHJlZy0+b2Zmc2V0IDw8IHAtPnJlZ3NoaWZ0KSk7CisJZWxzZQorCQlXQVJOKDEsICJJbnZhbGlkIHJlZ2lzdGVyIGFjY2Vzc1xuIik7Cit9CisKKyNkZWZpbmUgc2NpX2luKHVwLCBvZmZzZXQpCQkodXAtPnNlcmlhbF9pbih1cCwgb2Zmc2V0KSkKKyNkZWZpbmUgc2NpX291dCh1cCwgb2Zmc2V0LCB2YWx1ZSkJKHVwLT5zZXJpYWxfb3V0KHVwLCBvZmZzZXQsIHZhbHVlKSkKKworc3RhdGljIGludCBzY2lfcHJvYmVfcmVnbWFwKHN0cnVjdCBwbGF0X3NjaV9wb3J0ICpjZmcpCit7CisJc3dpdGNoIChjZmctPnR5cGUpIHsKKwljYXNlIFBPUlRfU0NJOgorCQljZmctPnJlZ3R5cGUgPSBTQ0l4X1NDSV9SRUdUWVBFOworCQlicmVhazsKKwljYXNlIFBPUlRfSVJEQToKKwkJY2ZnLT5yZWd0eXBlID0gU0NJeF9JUkRBX1JFR1RZUEU7CisJCWJyZWFrOworCWNhc2UgUE9SVF9TQ0lGQToKKwkJY2ZnLT5yZWd0eXBlID0gU0NJeF9TQ0lGQV9SRUdUWVBFOworCQlicmVhazsKKwljYXNlIFBPUlRfU0NJRkI6CisJCWNmZy0+cmVndHlwZSA9IFNDSXhfU0NJRkJfUkVHVFlQRTsKKwkJYnJlYWs7CisJY2FzZSBQT1JUX1NDSUY6CisJCS8qCisJCSAqIFRoZSBTSC00IGlzIGEgYml0IG9mIGEgbWlzbm9tZXIgaGVyZSwgYWx0aG91Z2ggdGhhdCdzCisJCSAqIHdoZXJlIHRoaXMgcGFydGljdWxhciBwb3J0IGxheW91dCBvcmlnaW5hdGVkLiBUaGlzCisJCSAqIGNvbmZpZ3VyYXRpb24gKG9yIHNvbWUgc2xpZ2h0IHZhcmlhdGlvbiB0aGVyZW9mKQorCQkgKiByZW1haW5zIHRoZSBkb21pbmFudCBtb2RlbCBmb3IgYWxsIFNDSUZzLgorCQkgKi8KKwkJY2ZnLT5yZWd0eXBlID0gU0NJeF9TSDRfU0NJRl9SRUdUWVBFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIkNhbid0IHByb2JlIHJlZ2lzdGVyIG1hcCBmb3IgZ2l2ZW4gcG9ydFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzY2lfcG9ydF9lbmFibGUoc3RydWN0IHNjaV9wb3J0ICpzY2lfcG9ydCkKK3sKKwlpZiAoIXNjaV9wb3J0LT5wb3J0LmRldikKKwkJcmV0dXJuOworCisJcG1fcnVudGltZV9nZXRfc3luYyhzY2lfcG9ydC0+cG9ydC5kZXYpOworCisJY2xrX2VuYWJsZShzY2lfcG9ydC0+aWNsayk7CisJc2NpX3BvcnQtPnBvcnQudWFydGNsayA9IGNsa19nZXRfcmF0ZShzY2lfcG9ydC0+aWNsayk7CisJY2xrX2VuYWJsZShzY2lfcG9ydC0+ZmNsayk7Cit9CisKK3N0YXRpYyB2b2lkIHNjaV9wb3J0X2Rpc2FibGUoc3RydWN0IHNjaV9wb3J0ICpzY2lfcG9ydCkKK3sKKwlpZiAoIXNjaV9wb3J0LT5wb3J0LmRldikKKwkJcmV0dXJuOworCisJY2xrX2Rpc2FibGUoc2NpX3BvcnQtPmZjbGspOworCWNsa19kaXNhYmxlKHNjaV9wb3J0LT5pY2xrKTsKKworCXBtX3J1bnRpbWVfcHV0X3N5bmMoc2NpX3BvcnQtPnBvcnQuZGV2KTsKK30KKwogI2lmIGRlZmluZWQoQ09ORklHX0NPTlNPTEVfUE9MTCkgfHwgZGVmaW5lZChDT05GSUdfU0VSSUFMX1NIX1NDSV9DT05TT0xFKQogCiAjaWZkZWYgQ09ORklHX0NPTlNPTEVfUE9MTApAQCAtMTY0LDIyNSArNDI4LDc4IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX0NPTlNPTEVfUE9MTCB8fCBDT05GSUdfU0VSSUFMX1NIX1NDSV9DT05TT0xFICovCiAKLSNpZiBkZWZpbmVkKF9fSDgzMDBIX18pIHx8IGRlZmluZWQoX19IODMwMFNfXykKIHN0YXRpYyB2b2lkIHNjaV9pbml0X3BpbnMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IGNmbGFnKQogewotCWludCBjaCA9IChwb3J0LT5tYXBiYXNlIC0gU01SMCkgPj4gMzsKKwlzdHJ1Y3Qgc2NpX3BvcnQgKnMgPSB0b19zY2lfcG9ydChwb3J0KTsKKwlzdHJ1Y3QgcGxhdF9zY2lfcmVnICpyZWcgPSBzY2lfcmVnbWFwW3MtPmNmZy0+cmVndHlwZV0gKyBTQ1NQVFI7CiAKLQkvKiBzZXQgRERSIHJlZ3MgKi8KLQlIODMwMF9HUElPX0REUihoODMwMF9zY2lfcGluc1tjaF0ucG9ydCwKLQkJICAgICAgIGg4MzAwX3NjaV9waW5zW2NoXS5yeCwKLQkJICAgICAgIEg4MzAwX0dQSU9fSU5QVVQpOwotCUg4MzAwX0dQSU9fRERSKGg4MzAwX3NjaV9waW5zW2NoXS5wb3J0LAotCQkgICAgICAgaDgzMDBfc2NpX3BpbnNbY2hdLnR4LAotCQkgICAgICAgSDgzMDBfR1BJT19PVVRQVVQpOwotCi0JLyogdHggbWFyayBvdXRwdXQqLwotCUg4MzAwX1NDSV9EUihjaCkgfD0gaDgzMDBfc2NpX3BpbnNbY2hdLnR4OwotfQotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTIpCi1zdGF0aWMgaW5saW5lIHZvaWQgc2NpX2luaXRfcGlucyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgY2ZsYWcpCi17Ci0JaWYgKHBvcnQtPm1hcGJhc2UgPT0gMHhBNDQwMDAwMCkgewotCQlfX3Jhd193cml0ZXcoX19yYXdfcmVhZHcoUEFDUikgJiAweGZmYzAsIFBBQ1IpOwotCQlfX3Jhd193cml0ZXcoX19yYXdfcmVhZHcoUEJDUikgJiAweDBmZmYsIFBCQ1IpOwotCX0gZWxzZSBpZiAocG9ydC0+bWFwYmFzZSA9PSAweEE0NDEwMDAwKQotCQlfX3Jhd193cml0ZXcoX19yYXdfcmVhZHcoUEJDUikgJiAweGYwMDMsIFBCQ1IpOwotfQotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIwKSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjEpCi1zdGF0aWMgaW5saW5lIHZvaWQgc2NpX2luaXRfcGlucyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgY2ZsYWcpCi17Ci0JdW5zaWduZWQgc2hvcnQgZGF0YTsKLQotCWlmIChjZmxhZyAmIENSVFNDVFMpIHsKLQkJLyogZW5hYmxlIFJUUy9DVFMgKi8KLQkJaWYgKHBvcnQtPm1hcGJhc2UgPT0gMHhhNDQzMDAwMCkgeyAvKiBTQ0lGMCAqLwotCQkJLyogQ2xlYXIgUFRDUiBiaXQgOS0yOyBlbmFibGUgYWxsIHNjaWYgcGlucyBidXQgc2NrICovCi0JCQlkYXRhID0gX19yYXdfcmVhZHcoUE9SVF9QVENSKTsKLQkJCV9fcmF3X3dyaXRldygoZGF0YSAmIDB4ZmMwMyksIFBPUlRfUFRDUik7Ci0JCX0gZWxzZSBpZiAocG9ydC0+bWFwYmFzZSA9PSAweGE0NDM4MDAwKSB7IC8qIFNDSUYxICovCi0JCQkvKiBDbGVhciBQVkNSIGJpdCA5LTIgKi8KLQkJCWRhdGEgPSBfX3Jhd19yZWFkdyhQT1JUX1BWQ1IpOwotCQkJX19yYXdfd3JpdGV3KChkYXRhICYgMHhmYzAzKSwgUE9SVF9QVkNSKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChwb3J0LT5tYXBiYXNlID09IDB4YTQ0MzAwMDApIHsgLyogU0NJRjAgKi8KLQkJCS8qIENsZWFyIFBUQ1IgYml0IDUtMjsgZW5hYmxlIG9ubHkgdHggYW5kIHJ4ICAqLwotCQkJZGF0YSA9IF9fcmF3X3JlYWR3KFBPUlRfUFRDUik7Ci0JCQlfX3Jhd193cml0ZXcoKGRhdGEgJiAweGZmYzMpLCBQT1JUX1BUQ1IpOwotCQl9IGVsc2UgaWYgKHBvcnQtPm1hcGJhc2UgPT0gMHhhNDQzODAwMCkgeyAvKiBTQ0lGMSAqLwotCQkJLyogQ2xlYXIgUFZDUiBiaXQgNS0yICovCi0JCQlkYXRhID0gX19yYXdfcmVhZHcoUE9SVF9QVkNSKTsKLQkJCV9fcmF3X3dyaXRldygoZGF0YSAmIDB4ZmZjMyksIFBPUlRfUFZDUik7Ci0JCX0KKwkvKgorCSAqIFVzZSBwb3J0LXNwZWNpZmljIGhhbmRsZXIgaWYgcHJvdmlkZWQuCisJICovCisJaWYgKHMtPmNmZy0+b3BzICYmIHMtPmNmZy0+b3BzLT5pbml0X3BpbnMpIHsKKwkJcy0+Y2ZnLT5vcHMtPmluaXRfcGlucyhwb3J0LCBjZmxhZyk7CisJCXJldHVybjsKIAl9Ci19Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU0gzKQotLyogRm9yIFNINzcwNSwgU0g3NzA2LCBTSDc3MDcsIFNINzcwOSwgU0g3NzA5QSwgU0g3NzI5ICovCi1zdGF0aWMgaW5saW5lIHZvaWQgc2NpX2luaXRfcGlucyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgY2ZsYWcpCi17Ci0JdW5zaWduZWQgc2hvcnQgZGF0YTsKIAotCS8qIFdlIG5lZWQgdG8gc2V0IFNDUENSIHRvIGVuYWJsZSBSVFMvQ1RTICovCi0JZGF0YSA9IF9fcmF3X3JlYWR3KFNDUENSKTsKLQkvKiBDbGVhciBvdXQgU0NQN01EMSwwLCBTQ1A2TUQxLDAsIFNDUDRNRDEsMCovCi0JX19yYXdfd3JpdGV3KGRhdGEgJiAweDBmY2YsIFNDUENSKTsKKwkvKgorCSAqIEZvciB0aGUgZ2VuZXJpYyBwYXRoIFNDU1BUUiBpcyBuZWNlc3NhcnkuIEJhaWwgb3V0IGlmIHRoYXQncworCSAqIHVuYXZhaWxhYmxlLCB0b28uCisJICovCisJaWYgKCFyZWctPnNpemUpCisJCXJldHVybjsKIAotCWlmICghKGNmbGFnICYgQ1JUU0NUUykpIHsKLQkJLyogV2UgbmVlZCB0byBzZXQgU0NQQ1IgdG8gZW5hYmxlIFJUUy9DVFMgKi8KLQkJZGF0YSA9IF9fcmF3X3JlYWR3KFNDUENSKTsKLQkJLyogQ2xlYXIgb3V0IFNDUDdNRDEsMCwgU0NQNE1EMSwwLAotCQkgICBTZXQgU0NQNk1EMSwwID0gezAxfSAob3V0cHV0KSAgKi8KLQkJX19yYXdfd3JpdGV3KChkYXRhICYgMHgwZmNmKSB8IDB4MTAwMCwgU0NQQ1IpOwotCi0JCWRhdGEgPSBfX3Jhd19yZWFkYihTQ1BEUik7Ci0JCS8qIFNldCAvUlRTMiAoYml0NikgPSAwICovCi0JCV9fcmF3X3dyaXRlYihkYXRhICYgMHhiZiwgU0NQRFIpOwotCX0KLX0KLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMikKLXN0YXRpYyBpbmxpbmUgdm9pZCBzY2lfaW5pdF9waW5zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBjZmxhZykKLXsKLQl1bnNpZ25lZCBzaG9ydCBkYXRhOwotCi0JaWYgKHBvcnQtPm1hcGJhc2UgPT0gMHhmZmUwMDAwMCkgewotCQlkYXRhID0gX19yYXdfcmVhZHcoUFNDUik7Ci0JCWRhdGEgJj0gfjB4MDNjZjsKLQkJaWYgKCEoY2ZsYWcgJiBDUlRTQ1RTKSkKLQkJCWRhdGEgfD0gMHgwMzQwOwotCi0JCV9fcmF3X3dyaXRldyhkYXRhLCBQU0NSKTsKLQl9Ci19Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTcpIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MykgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwKSB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUpIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NikgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0hYMykKLXN0YXRpYyBpbmxpbmUgdm9pZCBzY2lfaW5pdF9waW5zKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCBjZmxhZykKLXsKIAlpZiAoIShjZmxhZyAmIENSVFNDVFMpKQotCQlfX3Jhd193cml0ZXcoMHgwMDgwLCBTQ1NQVFIwKTsgLyogU2V0IFJUUyA9IDEgKi8KKwkJc2NpX291dChwb3J0LCBTQ1NQVFIsIDB4MDA4MCk7IC8qIFNldCBSVFMgPSAxICovCiB9Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU0g0KSAmJiAhZGVmaW5lZChDT05GSUdfQ1BVX1NINEEpCi1zdGF0aWMgaW5saW5lIHZvaWQgc2NpX2luaXRfcGlucyhzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0LCB1bnNpZ25lZCBpbnQgY2ZsYWcpCi17Ci0JaWYgKCEoY2ZsYWcgJiBDUlRTQ1RTKSkKLQkJX19yYXdfd3JpdGV3KDB4MDA4MCwgU0NTUFRSMik7IC8qIFNldCBSVFMgPSAxICovCi19Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIHNjaV9pbml0X3BpbnMoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IGNmbGFnKQotewotCS8qIE5vdGhpbmcgdG8gZG8gKi8KLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYwKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg1KSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg2KQotc3RhdGljIGludCBzY2lmX3R4ZmlsbChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQotewotCXJldHVybiBzY2lfaW4ocG9ydCwgU0NURkRSKSAmIDB4ZmY7Ci19Ci0KLXN0YXRpYyBpbnQgc2NpZl90eHJvb20oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKLXsKLQlyZXR1cm4gU0NJRl9UWFJPT01fTUFYIC0gc2NpZl90eGZpbGwocG9ydCk7Ci19Ci0KLXN0YXRpYyBpbnQgc2NpZl9yeGZpbGwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKLXsKLQlyZXR1cm4gc2NpX2luKHBvcnQsIFNDUkZEUikgJiAweGZmOwotfQotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzKQotc3RhdGljIGludCBzY2lmX3R4ZmlsbChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQotewotCWlmIChwb3J0LT5tYXBiYXNlID09IDB4ZmZlMDAwMDAgfHwKLQkgICAgcG9ydC0+bWFwYmFzZSA9PSAweGZmZTA4MDAwKQotCQkvKiBTQ0lGMC8xKi8KLQkJcmV0dXJuIHNjaV9pbihwb3J0LCBTQ1RGRFIpICYgMHhmZjsKLQllbHNlCi0JCS8qIFNDSUYyICovCi0JCXJldHVybiBzY2lfaW4ocG9ydCwgU0NGRFIpID4+IDg7Ci19Ci0KLXN0YXRpYyBpbnQgc2NpZl90eHJvb20oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKLXsKLQlpZiAocG9ydC0+bWFwYmFzZSA9PSAweGZmZTAwMDAwIHx8Ci0JICAgIHBvcnQtPm1hcGJhc2UgPT0gMHhmZmUwODAwMCkKLQkJLyogU0NJRjAvMSovCi0JCXJldHVybiBTQ0lGX1RYUk9PTV9NQVggLSBzY2lmX3R4ZmlsbChwb3J0KTsKLQllbHNlCi0JCS8qIFNDSUYyICovCi0JCXJldHVybiBTQ0lGMl9UWFJPT01fTUFYIC0gc2NpZl90eGZpbGwocG9ydCk7Ci19Ci0KLXN0YXRpYyBpbnQgc2NpZl9yeGZpbGwoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKLXsKLQlpZiAoKHBvcnQtPm1hcGJhc2UgPT0gMHhmZmUwMDAwMCkgfHwKLQkgICAgKHBvcnQtPm1hcGJhc2UgPT0gMHhmZmUwODAwMCkpIHsKLQkJLyogU0NJRjAvMSovCi0JCXJldHVybiBzY2lfaW4ocG9ydCwgU0NSRkRSKSAmIDB4ZmY7Ci0JfSBlbHNlIHsKLQkJLyogU0NJRjIgKi8KLQkJcmV0dXJuIHNjaV9pbihwb3J0LCBTQ0ZEUikgJiBTQ0lGMl9SRkRDX01BU0s7Ci0JfQotfQotI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9TSDczNzIpCi1zdGF0aWMgaW50IHNjaWZfdHhmaWxsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0JaWYgKHBvcnQtPnR5cGUgPT0gUE9SVF9TQ0lGQSkKLQkJcmV0dXJuIHNjaV9pbihwb3J0LCBTQ0ZEUikgPj4gODsKLQllbHNlCi0JCXJldHVybiBzY2lfaW4ocG9ydCwgU0NURkRSKTsKLX0KLQotc3RhdGljIGludCBzY2lmX3R4cm9vbShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQotewotCXJldHVybiBwb3J0LT5maWZvc2l6ZSAtIHNjaWZfdHhmaWxsKHBvcnQpOwotfQotCi1zdGF0aWMgaW50IHNjaWZfcnhmaWxsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0JaWYgKHBvcnQtPnR5cGUgPT0gUE9SVF9TQ0lGQSkKLQkJcmV0dXJuIHNjaV9pbihwb3J0LCBTQ0ZEUikgJiBTQ0lGX1JGRENfTUFTSzsKLQllbHNlCi0JCXJldHVybiBzY2lfaW4ocG9ydCwgU0NSRkRSKTsKLX0KLSNlbHNlCi1zdGF0aWMgaW50IHNjaWZfdHhmaWxsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0JcmV0dXJuIHNjaV9pbihwb3J0LCBTQ0ZEUikgPj4gODsKLX0KLQotc3RhdGljIGludCBzY2lmX3R4cm9vbShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQotewotCXJldHVybiBTQ0lGX1RYUk9PTV9NQVggLSBzY2lmX3R4ZmlsbChwb3J0KTsKLX0KLQotc3RhdGljIGludCBzY2lmX3J4ZmlsbChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQotewotCXJldHVybiBzY2lfaW4ocG9ydCwgU0NGRFIpICYgU0NJRl9SRkRDX01BU0s7Ci19Ci0jZW5kaWYKIAogc3RhdGljIGludCBzY2lfdHhmaWxsKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CisJc3RydWN0IHBsYXRfc2NpX3JlZyAqcmVnOworCisJcmVnID0gc2NpX2dldHJlZyhwb3J0LCBTQ1RGRFIpOworCWlmIChyZWctPnNpemUpCisJCXJldHVybiBzY2lfaW4ocG9ydCwgU0NURkRSKSAmIDB4ZmY7CisKKwlyZWcgPSBzY2lfZ2V0cmVnKHBvcnQsIFNDRkRSKTsKKwlpZiAocmVnLT5zaXplKQorCQlyZXR1cm4gc2NpX2luKHBvcnQsIFNDRkRSKSA+PiA4OworCiAJcmV0dXJuICEoc2NpX2luKHBvcnQsIFNDeFNSKSAmIFNDSV9URFJFKTsKIH0KIAogc3RhdGljIGludCBzY2lfdHhyb29tKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7Ci0JcmV0dXJuICFzY2lfdHhmaWxsKHBvcnQpOworCXJldHVybiBwb3J0LT5maWZvc2l6ZSAtIHNjaV90eGZpbGwocG9ydCk7CiB9CiAKIHN0YXRpYyBpbnQgc2NpX3J4ZmlsbChzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogeworCXN0cnVjdCBwbGF0X3NjaV9yZWcgKnJlZzsKKworCXJlZyA9IHNjaV9nZXRyZWcocG9ydCwgU0NSRkRSKTsKKwlpZiAocmVnLT5zaXplKQorCQlyZXR1cm4gc2NpX2luKHBvcnQsIFNDUkZEUikgJiAweGZmOworCisJcmVnID0gc2NpX2dldHJlZyhwb3J0LCBTQ0ZEUik7CisJaWYgKHJlZy0+c2l6ZSkKKwkJcmV0dXJuIHNjaV9pbihwb3J0LCBTQ0ZEUikgJiAoKHBvcnQtPmZpZm9zaXplIDw8IDEpIC0gMSk7CisKIAlyZXR1cm4gKHNjaV9pbihwb3J0LCBTQ3hTUikgJiBTQ3hTUl9SRHhGKHBvcnQpKSAhPSAwOwogfQogCisvKgorICogU0NJIGhlbHBlciBmb3IgY2hlY2tpbmcgdGhlIHN0YXRlIG9mIHRoZSBtdXhlZCBwb3J0L1JYRCBwaW5zLgorICovCitzdGF0aWMgaW5saW5lIGludCBzY2lfcnhkX2luKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHNjaV9wb3J0ICpzID0gdG9fc2NpX3BvcnQocG9ydCk7CisKKwlpZiAocy0+Y2ZnLT5wb3J0X3JlZyA8PSAwKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAhIV9fcmF3X3JlYWRiKHMtPmNmZy0+cG9ydF9yZWcpOworfQorCiAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICoKICAqICAgICAgICAgICAgICAgICAgIHRoZSBpbnRlcnJ1cHQgcmVsYXRlZCByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgKgogICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwpAQCAtNDA2LDEwICs1MjMsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKHBvcnQtPnR5cGUgPT0gUE9SVF9TQ0kpCi0JCWNvdW50ID0gc2NpX3R4cm9vbShwb3J0KTsKLQllbHNlCi0JCWNvdW50ID0gc2NpZl90eHJvb20ocG9ydCk7CisJY291bnQgPSBzY2lfdHhyb29tKHBvcnQpOwogCiAJZG8gewogCQl1bnNpZ25lZCBjaGFyIGM7CkBAIC00NjQsMTMgKzU3OCw4IEBACiAJCXJldHVybjsKIAogCXdoaWxlICgxKSB7Ci0JCWlmIChwb3J0LT50eXBlID09IFBPUlRfU0NJKQotCQkJY291bnQgPSBzY2lfcnhmaWxsKHBvcnQpOwotCQllbHNlCi0JCQljb3VudCA9IHNjaWZfcnhmaWxsKHBvcnQpOwotCiAJCS8qIERvbid0IGNvcHkgbW9yZSBieXRlcyB0aGFuIHRoZXJlIGlzIHJvb20gZm9yIGluIHRoZSBidWZmZXIgKi8KLQkJY291bnQgPSB0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIGNvdW50KTsKKwkJY291bnQgPSB0dHlfYnVmZmVyX3JlcXVlc3Rfcm9vbSh0dHksIHNjaV9yeGZpbGwocG9ydCkpOwogCiAJCS8qIElmIGZvciBhbnkgcmVhc29uIHdlIGNhbid0IGNvcHkgbW9yZSBkYXRhLCB3ZSdyZSBkb25lISAqLwogCQlpZiAoY291bnQgPT0gMCkKQEAgLTU2MSw4ICs2NzAsNyBAQAogewogCXN0cnVjdCBzY2lfcG9ydCAqcG9ydCA9IChzdHJ1Y3Qgc2NpX3BvcnQgKilkYXRhOwogCi0JaWYgKHBvcnQtPmVuYWJsZSkKLQkJcG9ydC0+ZW5hYmxlKCZwb3J0LT5wb3J0KTsKKwlzY2lfcG9ydF9lbmFibGUocG9ydCk7CiAKIAlpZiAoc2NpX3J4ZF9pbigmcG9ydC0+cG9ydCkgPT0gMCkgewogCQlwb3J0LT5icmVha19mbGFnID0gMTsKQEAgLTU3NCw4ICs2ODIsNyBAQAogCX0gZWxzZQogCQlwb3J0LT5icmVha19mbGFnID0gMDsKIAotCWlmIChwb3J0LT5kaXNhYmxlKQotCQlwb3J0LT5kaXNhYmxlKCZwb3J0LT5wb3J0KTsKKwlzY2lfcG9ydF9kaXNhYmxlKHBvcnQpOwogfQogCiBzdGF0aWMgaW50IHNjaV9oYW5kbGVfZXJyb3JzKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCkBAIC01ODMsMTMgKzY5MCwxOSBAQAogCWludCBjb3BpZWQgPSAwOwogCXVuc2lnbmVkIHNob3J0IHN0YXR1cyA9IHNjaV9pbihwb3J0LCBTQ3hTUik7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBvcnQtPnN0YXRlLT5wb3J0LnR0eTsKKwlzdHJ1Y3Qgc2NpX3BvcnQgKnMgPSB0b19zY2lfcG9ydChwb3J0KTsKIAotCWlmIChzdGF0dXMgJiBTQ3hTUl9PUkVSKHBvcnQpKSB7Ci0JCS8qIG92ZXJydW4gZXJyb3IgKi8KLQkJaWYgKHR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX09WRVJSVU4pKQotCQkJY29waWVkKys7CisJLyoKKwkgKiBIYW5kbGUgb3ZlcnJ1bnMsIGlmIHN1cHBvcnRlZC4KKwkgKi8KKwlpZiAocy0+Y2ZnLT5vdmVycnVuX2JpdCAhPSBTQ0l4X05PVF9TVVBQT1JURUQpIHsKKwkJaWYgKHN0YXR1cyAmICgxIDw8IHMtPmNmZy0+b3ZlcnJ1bl9iaXQpKSB7CisJCQkvKiBvdmVycnVuIGVycm9yICovCisJCQlpZiAodHR5X2luc2VydF9mbGlwX2NoYXIodHR5LCAwLCBUVFlfT1ZFUlJVTikpCisJCQkJY29waWVkKys7CiAKLQkJZGV2X25vdGljZShwb3J0LT5kZXYsICJvdmVycnVuIGVycm9yIik7CisJCQlkZXZfbm90aWNlKHBvcnQtPmRldiwgIm92ZXJydW4gZXJyb3IiKTsKKwkJfQogCX0KIAogCWlmIChzdGF0dXMgJiBTQ3hTUl9GRVIocG9ydCkpIHsKQEAgLTYzNywxMiArNzUwLDE1IEBACiBzdGF0aWMgaW50IHNjaV9oYW5kbGVfZmlmb19vdmVycnVuKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCiB7CiAJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSA9IHBvcnQtPnN0YXRlLT5wb3J0LnR0eTsKKwlzdHJ1Y3Qgc2NpX3BvcnQgKnMgPSB0b19zY2lfcG9ydChwb3J0KTsKKwlzdHJ1Y3QgcGxhdF9zY2lfcmVnICpyZWc7CiAJaW50IGNvcGllZCA9IDA7CiAKLQlpZiAocG9ydC0+dHlwZSAhPSBQT1JUX1NDSUYpCisJcmVnID0gc2NpX2dldHJlZyhwb3J0LCBTQ0xTUik7CisJaWYgKCFyZWctPnNpemUpCiAJCXJldHVybiAwOwogCi0JaWYgKChzY2lfaW4ocG9ydCwgU0NMU1IpICYgU0NJRl9PUkVSKSAhPSAwKSB7CisJaWYgKChzY2lfaW4ocG9ydCwgU0NMU1IpICYgKDEgPDwgcy0+Y2ZnLT5vdmVycnVuX2JpdCkpKSB7CiAJCXNjaV9vdXQocG9ydCwgU0NMU1IsIDApOwogCiAJCXR0eV9pbnNlcnRfZmxpcF9jaGFyKHR0eSwgMCwgVFRZX09WRVJSVU4pOwpAQCAtODQwLDc0ICs5NTYsMTAyIEBACiAJcmV0dXJuIE5PVElGWV9PSzsKIH0KIAotc3RhdGljIHZvaWQgc2NpX2Nsa19lbmFibGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKLXsKLQlzdHJ1Y3Qgc2NpX3BvcnQgKnNjaV9wb3J0ID0gdG9fc2NpX3BvcnQocG9ydCk7CitzdGF0aWMgc3RydWN0IHNjaV9pcnFfZGVzYyB7CisJY29uc3QgY2hhcgkqZGVzYzsKKwlpcnFfaGFuZGxlcl90CWhhbmRsZXI7Cit9IHNjaV9pcnFfZGVzY1tdID0geworCS8qCisJICogU3BsaXQgb3V0IGhhbmRsZXJzLCB0aGUgZGVmYXVsdCBjYXNlLgorCSAqLworCVtTQ0l4X0VSSV9JUlFdID0geworCQkuZGVzYyA9ICJyeCBlcnIiLAorCQkuaGFuZGxlciA9IHNjaV9lcl9pbnRlcnJ1cHQsCisJfSwKIAotCXBtX3J1bnRpbWVfZ2V0X3N5bmMocG9ydC0+ZGV2KTsKKwlbU0NJeF9SWElfSVJRXSA9IHsKKwkJLmRlc2MgPSAicnggZnVsbCIsCisJCS5oYW5kbGVyID0gc2NpX3J4X2ludGVycnVwdCwKKwl9LAogCi0JY2xrX2VuYWJsZShzY2lfcG9ydC0+aWNsayk7Ci0Jc2NpX3BvcnQtPnBvcnQudWFydGNsayA9IGNsa19nZXRfcmF0ZShzY2lfcG9ydC0+aWNsayk7Ci0JY2xrX2VuYWJsZShzY2lfcG9ydC0+ZmNsayk7Ci19CisJW1NDSXhfVFhJX0lSUV0gPSB7CisJCS5kZXNjID0gInR4IGVtcHR5IiwKKwkJLmhhbmRsZXIgPSBzY2lfdHhfaW50ZXJydXB0LAorCX0sCiAKLXN0YXRpYyB2b2lkIHNjaV9jbGtfZGlzYWJsZShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQotewotCXN0cnVjdCBzY2lfcG9ydCAqc2NpX3BvcnQgPSB0b19zY2lfcG9ydChwb3J0KTsKKwlbU0NJeF9CUklfSVJRXSA9IHsKKwkJLmRlc2MgPSAiYnJlYWsiLAorCQkuaGFuZGxlciA9IHNjaV9icl9pbnRlcnJ1cHQsCisJfSwKIAotCWNsa19kaXNhYmxlKHNjaV9wb3J0LT5mY2xrKTsKLQljbGtfZGlzYWJsZShzY2lfcG9ydC0+aWNsayk7Ci0KLQlwbV9ydW50aW1lX3B1dF9zeW5jKHBvcnQtPmRldik7Ci19CisJLyoKKwkgKiBTcGVjaWFsIG11eGVkIGhhbmRsZXIuCisJICovCisJW1NDSXhfTVVYX0lSUV0gPSB7CisJCS5kZXNjID0gIm11eCIsCisJCS5oYW5kbGVyID0gc2NpX21weGVkX2ludGVycnVwdCwKKwl9LAorfTsKIAogc3RhdGljIGludCBzY2lfcmVxdWVzdF9pcnEoc3RydWN0IHNjaV9wb3J0ICpwb3J0KQogewotCWludCBpOwotCWlycXJldHVybl90ICgqaGFuZGxlcnNbNF0pKGludCBpcnEsIHZvaWQgKnB0cikgPSB7Ci0JCXNjaV9lcl9pbnRlcnJ1cHQsIHNjaV9yeF9pbnRlcnJ1cHQsIHNjaV90eF9pbnRlcnJ1cHQsCi0JCXNjaV9icl9pbnRlcnJ1cHQsCi0JfTsKLQljb25zdCBjaGFyICpkZXNjW10gPSB7ICJTQ0kgUmVjZWl2ZSBFcnJvciIsICJTQ0kgUmVjZWl2ZSBEYXRhIEZ1bGwiLAotCQkJICAgICAgICJTQ0kgVHJhbnNtaXQgRGF0YSBFbXB0eSIsICJTQ0kgQnJlYWsiIH07CisJc3RydWN0IHVhcnRfcG9ydCAqdXAgPSAmcG9ydC0+cG9ydDsKKwlpbnQgaSwgaiwgcmV0ID0gMDsKIAotCWlmIChwb3J0LT5jZmctPmlycXNbMF0gPT0gcG9ydC0+Y2ZnLT5pcnFzWzFdKSB7Ci0JCWlmICh1bmxpa2VseSghcG9ydC0+Y2ZnLT5pcnFzWzBdKSkKLQkJCXJldHVybiAtRU5PREVWOworCWZvciAoaSA9IGogPSAwOyBpIDwgU0NJeF9OUl9JUlFTOyBpKyssIGorKykgeworCQlzdHJ1Y3Qgc2NpX2lycV9kZXNjICpkZXNjOworCQl1bnNpZ25lZCBpbnQgaXJxOwogCi0JCWlmIChyZXF1ZXN0X2lycShwb3J0LT5jZmctPmlycXNbMF0sIHNjaV9tcHhlZF9pbnRlcnJ1cHQsCi0JCQkJSVJRRl9ESVNBQkxFRCwgInNjaSIsIHBvcnQpKSB7Ci0JCQlkZXZfZXJyKHBvcnQtPnBvcnQuZGV2LCAiQ2FuJ3QgYWxsb2NhdGUgSVJRXG4iKTsKLQkJCXJldHVybiAtRU5PREVWOworCQlpZiAoU0NJeF9JUlFfSVNfTVVYRUQocG9ydCkpIHsKKwkJCWkgPSBTQ0l4X01VWF9JUlE7CisJCQlpcnEgPSB1cC0+aXJxOworCQl9IGVsc2UKKwkJCWlycSA9IHBvcnQtPmNmZy0+aXJxc1tpXTsKKworCQlkZXNjID0gc2NpX2lycV9kZXNjICsgaTsKKwkJcG9ydC0+aXJxc3RyW2pdID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlczolcyIsCisJCQkJCSAgICBkZXZfbmFtZSh1cC0+ZGV2KSwgZGVzYy0+ZGVzYyk7CisJCWlmICghcG9ydC0+aXJxc3RyW2pdKSB7CisJCQlkZXZfZXJyKHVwLT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgJXMgSVJRIHN0cmluZ1xuIiwKKwkJCQlkZXNjLT5kZXNjKTsKKwkJCWdvdG8gb3V0X25vbWVtOwogCQl9Ci0JfSBlbHNlIHsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaGFuZGxlcnMpOyBpKyspIHsKLQkJCWlmICh1bmxpa2VseSghcG9ydC0+Y2ZnLT5pcnFzW2ldKSkKLQkJCQljb250aW51ZTsKIAotCQkJaWYgKHJlcXVlc3RfaXJxKHBvcnQtPmNmZy0+aXJxc1tpXSwgaGFuZGxlcnNbaV0sCi0JCQkJCUlSUUZfRElTQUJMRUQsIGRlc2NbaV0sIHBvcnQpKSB7Ci0JCQkJZGV2X2Vycihwb3J0LT5wb3J0LmRldiwgIkNhbid0IGFsbG9jYXRlIElSUVxuIik7Ci0JCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCQl9CisJCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgZGVzYy0+aGFuZGxlciwgdXAtPmlycWZsYWdzLAorCQkJCSAgcG9ydC0+aXJxc3RyW2pdLCBwb3J0KTsKKwkJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJCWRldl9lcnIodXAtPmRldiwgIkNhbid0IGFsbG9jYXRlICVzIElSUVxuIiwgZGVzYy0+ZGVzYyk7CisJCQlnb3RvIG91dF9ub2lycTsKIAkJfQogCX0KIAogCXJldHVybiAwOworCitvdXRfbm9pcnE6CisJd2hpbGUgKC0taSA+PSAwKQorCQlmcmVlX2lycShwb3J0LT5jZmctPmlycXNbaV0sIHBvcnQpOworCitvdXRfbm9tZW06CisJd2hpbGUgKC0taiA+PSAwKQorCQlrZnJlZShwb3J0LT5pcnFzdHJbal0pOworCisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHZvaWQgc2NpX2ZyZWVfaXJxKHN0cnVjdCBzY2lfcG9ydCAqcG9ydCkKIHsKIAlpbnQgaTsKIAotCWlmIChwb3J0LT5jZmctPmlycXNbMF0gPT0gcG9ydC0+Y2ZnLT5pcnFzWzFdKQotCQlmcmVlX2lycShwb3J0LT5jZmctPmlycXNbMF0sIHBvcnQpOwotCWVsc2UgewotCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwb3J0LT5jZmctPmlycXMpOyBpKyspIHsKLQkJCWlmICghcG9ydC0+Y2ZnLT5pcnFzW2ldKQotCQkJCWNvbnRpbnVlOworCS8qCisJICogSW50ZW50aW9uYWxseSBpbiByZXZlcnNlIG9yZGVyIHNvIHdlIGl0ZXJhdGUgb3ZlciB0aGUgbXV4ZWQKKwkgKiBJUlEgZmlyc3QuCisJICovCisJZm9yIChpID0gMDsgaSA8IFNDSXhfTlJfSVJRUzsgaSsrKSB7CisJCWZyZWVfaXJxKHBvcnQtPmNmZy0+aXJxc1tpXSwgcG9ydCk7CisJCWtmcmVlKHBvcnQtPmlycXN0cltpXSk7CiAKLQkJCWZyZWVfaXJxKHBvcnQtPmNmZy0+aXJxc1tpXSwgcG9ydCk7CisJCWlmIChTQ0l4X0lSUV9JU19NVVhFRChwb3J0KSkgeworCQkJLyogSWYgdGhlcmUncyBvbmx5IG9uZSBJUlEsIHdlJ3JlIGRvbmUuICovCisJCQlyZXR1cm47CiAJCX0KIAl9CiB9CkBAIC05MTUsNyArMTA1OSw3IEBACiBzdGF0aWMgdW5zaWduZWQgaW50IHNjaV90eF9lbXB0eShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewogCXVuc2lnbmVkIHNob3J0IHN0YXR1cyA9IHNjaV9pbihwb3J0LCBTQ3hTUik7Ci0JdW5zaWduZWQgc2hvcnQgaW5fdHhfZmlmbyA9IHNjaWZfdHhmaWxsKHBvcnQpOworCXVuc2lnbmVkIHNob3J0IGluX3R4X2ZpZm8gPSBzY2lfdHhmaWxsKHBvcnQpOwogCiAJcmV0dXJuIChzdGF0dXMgJiBTQ3hTUl9URU5EKHBvcnQpKSAmJiAhaW5fdHhfZmlmbyA/IFRJT0NTRVJfVEVNVCA6IDA7CiB9CkBAIC0xNDM4LDggKzE1ODIsNyBAQAogCiAJZGV2X2RiZyhwb3J0LT5kZXYsICIlcyglZClcbiIsIF9fZnVuY19fLCBwb3J0LT5saW5lKTsKIAotCWlmIChzLT5lbmFibGUpCi0JCXMtPmVuYWJsZShwb3J0KTsKKwlzY2lfcG9ydF9lbmFibGUocyk7CiAKIAlyZXQgPSBzY2lfcmVxdWVzdF9pcnEocyk7CiAJaWYgKHVubGlrZWx5KHJldCA8IDApKQpAQCAtMTQ2NSw4ICsxNjA4LDcgQEAKIAlzY2lfZnJlZV9kbWEocG9ydCk7CiAJc2NpX2ZyZWVfaXJxKHMpOwogCi0JaWYgKHMtPmRpc2FibGUpCi0JCXMtPmRpc2FibGUocG9ydCk7CisJc2NpX3BvcnRfZGlzYWJsZShzKTsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCBzY2lfc2NicnJfY2FsYyh1bnNpZ25lZCBpbnQgYWxnb19pZCwgdW5zaWduZWQgaW50IGJwcywKQEAgLTE1MTMsOCArMTY1NSw3IEBACiAJaWYgKGxpa2VseShiYXVkICYmIHBvcnQtPnVhcnRjbGspKQogCQl0ID0gc2NpX3NjYnJyX2NhbGMocy0+Y2ZnLT5zY2Jycl9hbGdvX2lkLCBiYXVkLCBwb3J0LT51YXJ0Y2xrKTsKIAotCWlmIChzLT5lbmFibGUpCi0JCXMtPmVuYWJsZShwb3J0KTsKKwlzY2lfcG9ydF9lbmFibGUocyk7CiAKIAlkbyB7CiAJCXN0YXR1cyA9IHNjaV9pbihwb3J0LCBTQ3hTUik7CkBAIC0xNTg0LDggKzE3MjUsNyBAQAogCWlmICgodGVybWlvcy0+Y19jZmxhZyAmIENSRUFEKSAhPSAwKQogCQlzY2lfc3RhcnRfcngocG9ydCk7CiAKLQlpZiAocy0+ZGlzYWJsZSkKLQkJcy0+ZGlzYWJsZShwb3J0KTsKKwlzY2lfcG9ydF9kaXNhYmxlKHMpOwogfQogCiBzdGF0aWMgY29uc3QgY2hhciAqc2NpX3R5cGUoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKQEAgLTE3MjYsNiArMTg2Niw3IEBACiAJCQkJICAgICBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCAqcCkKIHsKIAlzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0ID0gJnNjaV9wb3J0LT5wb3J0OworCWludCByZXQ7CiAKIAlwb3J0LT5vcHMJPSAmc2NpX3VhcnRfb3BzOwogCXBvcnQtPmlvdHlwZQk9IFVQSU9fTUVNOwpAQCAtMTc0Niw2ICsxODg3LDEyIEBACiAJCWJyZWFrOwogCX0KIAorCWlmIChwLT5yZWd0eXBlID09IFNDSXhfUFJPQkVfUkVHVFlQRSkgeworCQlyZXQgPSBzY2lfcHJvYmVfcmVnbWFwKHApOworCQlpZiAodW5saWtlbHkoIXJldCkpCisJCQlyZXR1cm4gcmV0OworCX0KKwogCWlmIChkZXYpIHsKIAkJc2NpX3BvcnQtPmljbGsgPSBjbGtfZ2V0KCZkZXYtPmRldiwgInNjaV9pY2siKTsKIAkJaWYgKElTX0VSUihzY2lfcG9ydC0+aWNsaykpIHsKQEAgLTE3NjQsOCArMTkxMSw2IEBACiAJCWlmIChJU19FUlIoc2NpX3BvcnQtPmZjbGspKQogCQkJc2NpX3BvcnQtPmZjbGsgPSBOVUxMOwogCi0JCXNjaV9wb3J0LT5lbmFibGUgPSBzY2lfY2xrX2VuYWJsZTsKLQkJc2NpX3BvcnQtPmRpc2FibGUgPSBzY2lfY2xrX2Rpc2FibGU7CiAJCXBvcnQtPmRldiA9ICZkZXYtPmRldjsKIAogCQlwbV9ydW50aW1lX2VuYWJsZSgmZGV2LT5kZXYpOwpAQCAtMTc3NSwyMCArMTkyMCw1MSBAQAogCXNjaV9wb3J0LT5icmVha190aW1lci5mdW5jdGlvbiA9IHNjaV9icmVha190aW1lcjsKIAlpbml0X3RpbWVyKCZzY2lfcG9ydC0+YnJlYWtfdGltZXIpOwogCisJLyoKKwkgKiBFc3RhYmxpc2ggc29tZSBzZW5zaWJsZSBkZWZhdWx0cyBmb3IgdGhlIGVycm9yIGRldGVjdGlvbi4KKwkgKi8KKwlpZiAoIXAtPmVycm9yX21hc2spCisJCXAtPmVycm9yX21hc2sgPSAocC0+dHlwZSA9PSBQT1JUX1NDSSkgPworCQkJU0NJX0RFRkFVTFRfRVJST1JfTUFTSyA6IFNDSUZfREVGQVVMVF9FUlJPUl9NQVNLOworCisJLyoKKwkgKiBFc3RhYmxpc2ggc2Vuc2libGUgZGVmYXVsdHMgZm9yIHRoZSBvdmVycnVuIGRldGVjdGlvbiwgdW5sZXNzCisJICogdGhlIHBhcnQgaGFzIGV4cGxpY2l0bHkgZGlzYWJsZWQgc3VwcG9ydCBmb3IgaXQuCisJICovCisJaWYgKHAtPm92ZXJydW5fYml0ICE9IFNDSXhfTk9UX1NVUFBPUlRFRCkgeworCQlpZiAocC0+dHlwZSA9PSBQT1JUX1NDSSkKKwkJCXAtPm92ZXJydW5fYml0ID0gNTsKKwkJZWxzZSBpZiAocC0+c2NicnJfYWxnb19pZCA9PSBTQ0JSUl9BTEdPXzQpCisJCQlwLT5vdmVycnVuX2JpdCA9IDk7CisJCWVsc2UKKwkJCXAtPm92ZXJydW5fYml0ID0gMDsKKworCQkvKgorCQkgKiBNYWtlIHRoZSBlcnJvciBtYXNrIGluY2x1c2l2ZSBvZiBvdmVycnVuIGRldGVjdGlvbiwgaWYKKwkJICogc3VwcG9ydGVkLgorCQkgKi8KKwkJcC0+ZXJyb3JfbWFzayB8PSAoMSA8PCBwLT5vdmVycnVuX2JpdCk7CisJfQorCiAJc2NpX3BvcnQtPmNmZwkJPSBwOwogCiAJcG9ydC0+bWFwYmFzZQkJPSBwLT5tYXBiYXNlOwogCXBvcnQtPnR5cGUJCT0gcC0+dHlwZTsKIAlwb3J0LT5mbGFncwkJPSBwLT5mbGFnczsKKwlwb3J0LT5yZWdzaGlmdAkJPSBwLT5yZWdzaGlmdDsKIAogCS8qCi0JICogVGhlIFVBUlQgcG9ydCBuZWVkcyBhbiBJUlEgdmFsdWUsIHNvIHdlIHBlZyB0aGlzIHRvIHRoZSBUWCBJUlEKKwkgKiBUaGUgVUFSVCBwb3J0IG5lZWRzIGFuIElSUSB2YWx1ZSwgc28gd2UgcGVnIHRoaXMgdG8gdGhlIFJYIElSUQogCSAqIGZvciB0aGUgbXVsdGktSVJRIHBvcnRzLCB3aGljaCBpcyB3aGVyZSB3ZSBhcmUgcHJpbWFyaWx5CiAJICogY29uY2VybmVkIHdpdGggdGhlIHNodXRkb3duIHBhdGggc3luY2hyb25pemF0aW9uLgogCSAqCiAJICogRm9yIHRoZSBtdXhlZCBjYXNlIHRoZXJlJ3Mgbm90aGluZyBtb3JlIHRvIGRvLgogCSAqLwogCXBvcnQtPmlycQkJPSBwLT5pcnFzW1NDSXhfUlhJX0lSUV07CisJcG9ydC0+aXJxZmxhZ3MJCT0gSVJRRl9ESVNBQkxFRDsKKworCXBvcnQtPnNlcmlhbF9pbgkJPSBzY2lfc2VyaWFsX2luOworCXBvcnQtPnNlcmlhbF9vdXQJPSBzY2lfc2VyaWFsX291dDsKIAogCWlmIChwLT5kbWFfZGV2KQogCQlkZXZfZGJnKHBvcnQtPmRldiwgIkRNQSBkZXZpY2UgJXAsIHR4ICVkLCByeCAlZFxuIiwKQEAgLTE4MTQsOCArMTk5MCw3IEBACiAJc3RydWN0IHVhcnRfcG9ydCAqcG9ydCA9ICZzY2lfcG9ydC0+cG9ydDsKIAl1bnNpZ25lZCBzaG9ydCBiaXRzOwogCi0JaWYgKHNjaV9wb3J0LT5lbmFibGUpCi0JCXNjaV9wb3J0LT5lbmFibGUocG9ydCk7CisJc2NpX3BvcnRfZW5hYmxlKHNjaV9wb3J0KTsKIAogCXVhcnRfY29uc29sZV93cml0ZShwb3J0LCBzLCBjb3VudCwgc2VyaWFsX2NvbnNvbGVfcHV0Y2hhcik7CiAKQEAgLTE4MjQsOCArMTk5OSw3IEBACiAJd2hpbGUgKChzY2lfaW4ocG9ydCwgU0N4U1IpICYgYml0cykgIT0gYml0cykKIAkJY3B1X3JlbGF4KCk7CiAKLQlpZiAoc2NpX3BvcnQtPmRpc2FibGUpCi0JCXNjaV9wb3J0LT5kaXNhYmxlKHBvcnQpOworCXNjaV9wb3J0X2Rpc2FibGUoc2NpX3BvcnQpOwogfQogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzZXJpYWxfY29uc29sZV9zZXR1cChzdHJ1Y3QgY29uc29sZSAqY28sIGNoYXIgKm9wdGlvbnMpCkBAIC0xODU3LDIwICsyMDMxLDEzIEBACiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJcmV0dXJuIHJldDsKIAotCWlmIChzY2lfcG9ydC0+ZW5hYmxlKQotCQlzY2lfcG9ydC0+ZW5hYmxlKHBvcnQpOworCXNjaV9wb3J0X2VuYWJsZShzY2lfcG9ydCk7CiAKIAlpZiAob3B0aW9ucykKIAkJdWFydF9wYXJzZV9vcHRpb25zKG9wdGlvbnMsICZiYXVkLCAmcGFyaXR5LCAmYml0cywgJmZsb3cpOwogCi0JcmV0ID0gdWFydF9zZXRfb3B0aW9ucyhwb3J0LCBjbywgYmF1ZCwgcGFyaXR5LCBiaXRzLCBmbG93KTsKLSNpZiBkZWZpbmVkKF9fSDgzMDBIX18pIHx8IGRlZmluZWQoX19IODMwMFNfXykKLQkvKiBkaXNhYmxlIHJ4IGludGVycnVwdCAqLwotCWlmIChyZXQgPT0gMCkKLQkJc2NpX3N0b3BfcngocG9ydCk7Ci0jZW5kaWYKIAkvKiBUT0RPOiBkaXNhYmxlIGNsb2NrICovCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gdWFydF9zZXRfb3B0aW9ucyhwb3J0LCBjbywgYmF1ZCwgcGFyaXR5LCBiaXRzLCBmbG93KTsKIH0KIAogc3RhdGljIHN0cnVjdCBjb25zb2xlIHNlcmlhbF9jb25zb2xlID0gewpAQCAtMjA4MSwzICsyMjQ4LDUgQEAKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpzaC1zY2kiKTsKK01PRFVMRV9BVVRIT1IoIlBhdWwgTXVuZHQiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3VwZXJIIFNDSShGKSBzZXJpYWwgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3R0eS9zZXJpYWwvc2gtc2NpLmggYi9kcml2ZXJzL3R0eS9zZXJpYWwvc2gtc2NpLmgKaW5kZXggYjA0ZDkzNy4uZTliZWQwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3NoLXNjaS5oCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9zaC1zY2kuaApAQCAtMiwxNjkgKzIsMTQgQEAKICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX0g4MzAwNykgfHwgZGVmaW5lZChDT05GSUdfSDgzMDY4KQotI2luY2x1ZGUgPGFzbS9yZWdzMzA2eC5oPgotI2VuZGlmCi0jaWYgZGVmaW5lZChDT05GSUdfSDhTMjY3OCkKLSNpbmNsdWRlIDxhc20vcmVnczI2N3guaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA2KSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3KSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA4KSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA5KQotIyBkZWZpbmUgU0NQQ1IgIDB4QTQwMDAxMTYgLyogMTYgYml0IFNDSSBhbmQgU0NJRiAqLwotIyBkZWZpbmUgU0NQRFIgIDB4QTQwMDAxMzYgLyogOCAgYml0IFNDSSBhbmQgU0NJRiAqLwotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1KQotIyBkZWZpbmUgU0NJRjAJCTB4QTQ0MDAwMDAKLSMgZGVmaW5lIFNDSUYyCQkweEE0NDEwMDAwCi0jIGRlZmluZSBTQ1BDUiAweEE0MDAwMTE2Ci0jIGRlZmluZSBTQ1BEUiAweEE0MDAwMTM2Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjApIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMSkgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQVJDSF9TSDczQTApIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX0FSQ0hfU0g3MzY3KSB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19BUkNIX1NINzM3NykgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQVJDSF9TSDczNzIpCi0jIGRlZmluZSBQT1JUX1BUQ1IJICAgMHhBNDA1MDExRVVMCi0jIGRlZmluZSBQT1JUX1BWQ1IJICAgMHhBNDA1MDEyMlVMCi0jIGRlZmluZSBTQ0lGX09SRVIJICAgMHgwMjAwICAgLyogb3ZlcnJ1biBlcnJvciBiaXQgKi8KLSNlbGlmIGRlZmluZWQoQ09ORklHX1NIX1JUUzc3NTFSMkQpCi0jIGRlZmluZSBTQ1NQVFIxIDB4RkZFMDAwMUMgLyogOCBiaXQgU0NJRiAqLwotIyBkZWZpbmUgU0NTUFRSMiAweEZGRTgwMDIwIC8qIDE2IGJpdCBTQ0lGICovCi0jIGRlZmluZSBTQ0lGX09SRVIgMHgwMDAxICAgLyogb3ZlcnJ1biBlcnJvciBiaXQgKi8KLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MCkgIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFIpIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MFMpIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzA5MSkgIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MSkgIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MVIpCi0jIGRlZmluZSBTQ1NQVFIxIDB4ZmZlMDAwMWMgLyogOCAgYml0IFNDSSAqLwotIyBkZWZpbmUgU0NTUFRSMiAweEZGRTgwMDIwIC8qIDE2IGJpdCBTQ0lGICovCi0jIGRlZmluZSBTQ0lGX09SRVIgMHgwMDAxICAgLyogb3ZlcnJ1biBlcnJvciBiaXQgKi8KLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCkKLSMgZGVmaW5lIFNDU1BUUjAgMHhmZTYwMDAyNCAvKiAxNiBiaXQgU0NJRiAqLwotIyBkZWZpbmUgU0NTUFRSMSAweGZlNjEwMDI0IC8qIDE2IGJpdCBTQ0lGICovCi0jIGRlZmluZSBTQ1NQVFIyIDB4ZmU2MjAwMjQgLyogMTYgYml0IFNDSUYgKi8KLSMgZGVmaW5lIFNDSUZfT1JFUiAweDAwMDEgIC8qIG92ZXJydW4gZXJyb3IgYml0ICovCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMikKLSMgZGVmaW5lIFNDU1BUUjAgMHhBNDQwMDAwMAkgIC8qIDE2IGJpdCBTQ0lGICovCi0jIGRlZmluZSBTQ0lGX09SRVIgMHgwMDAxICAgLyogb3ZlcnJ1biBlcnJvciBiaXQgKi8KLSMgZGVmaW5lIFBBQ1IgMHhhNDA1MDEwMAotIyBkZWZpbmUgUEJDUiAweGE0MDUwMTAyCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMpCi0jIGRlZmluZSBTQ1NQVFIwIDB4ZmZlMDAwMTAJLyogMTYgYml0IFNDSUYgKi8KLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMikKLSMgZGVmaW5lIFBBRFIJCQkweEE0MDUwMTIwCi0jIGRlZmluZSBQU0RSCQkJMHhBNDA1MDEzZQotIyBkZWZpbmUgUFdEUgkJCTB4QTQwNTAxNjYKLSMgZGVmaW5lIFBTQ1IJCQkweEE0MDUwMTFFCi0jIGRlZmluZSBTQ0lGX09SRVIJCTB4MDAwMQkvKiBvdmVycnVuIGVycm9yIGJpdCAqLwotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzY2KQotIyBkZWZpbmUgU0NQRFIwCQkJMHhBNDA1MDEzRSAgICAgIC8qIDE2IGJpdCBTQ0lGMCBQU0RSICovCi0jIGRlZmluZSBTQ1NQVFIwCQlTQ1BEUjAKLSMgZGVmaW5lIFNDSUZfT1JFUgkJMHgwMDAxICAvKiBvdmVycnVuIGVycm9yIGJpdCAqLwotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzKQotIyBkZWZpbmUgU0NTUFRSMCAgICAgICAgICAgICAgICAweGE0MDUwMTYwCi0jIGRlZmluZSBTQ0lGX09SRVIgICAgICAgICAgICAgIDB4MDAwMSAgLyogb3ZlcnJ1biBlcnJvciBiaXQgKi8KLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNCkKLSMgZGVmaW5lIFNDSUZfT1JFUiAgICAgICAgICAgICAgMHgwMDAxICAvKiBvdmVycnVuIGVycm9yIGJpdCAqLwotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g0XzIwMikKLSMgZGVmaW5lIFNDU1BUUjIgMHhmZmU4MDAyMCAvKiAxNiBiaXQgU0NJRiAqLwotIyBkZWZpbmUgU0NJRl9PUkVSIDB4MDAwMSAgIC8qIG92ZXJydW4gZXJyb3IgYml0ICovCi0jZWxpZiBkZWZpbmVkKENPTkZJR19IODMwMDcpIHx8IGRlZmluZWQoQ09ORklHX0g4MzA2OCkKLSMgZGVmaW5lIEg4MzAwX1NDSV9EUihjaCkgKih2b2xhdGlsZSBjaGFyICopKFAxRFIgKyBoODMwMF9zY2lfcGluc1tjaF0ucG9ydCkKLSNlbGlmIGRlZmluZWQoQ09ORklHX0g4UzI2NzgpCi0jIGRlZmluZSBIODMwMF9TQ0lfRFIoY2gpICoodm9sYXRpbGUgY2hhciAqKShQMURSICsgaDgzMDBfc2NpX3BpbnNbY2hdLnBvcnQpCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTcpCi0jIGRlZmluZSBTQ1NQVFIwIDB4ZmU0YjAwMjAKLSMgZGVmaW5lIFNDSUZfT1JFUiAweDAwMDEKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MykKLSMgZGVmaW5lIFNDU1BUUjAgMHhmZmUwMDAyNCAvKiAxNiBiaXQgU0NJRiAqLwotIyBkZWZpbmUgU0NJRl9PUkVSIDB4MDAwMSAgLyogb3ZlcnJ1biBlcnJvciBiaXQgKi8KLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc3MCkKLSMgZGVmaW5lIFNDU1BUUjAgMHhmZjkyMzAyMCAvKiAxNiBiaXQgU0NJRiAqLwotIyBkZWZpbmUgU0NJRl9PUkVSIDB4MDAwMSAgLyogb3ZlcnJ1biBlcnJvciBiaXQgKi8KLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCkKLSMgZGVmaW5lIFNDU1BUUjAJMHhmZmUwMDAyNAkvKiAxNiBiaXQgU0NJRiAqLwotIyBkZWZpbmUgU0NJRl9PUkVSCTB4MDAwMQkJLyogT3ZlcnJ1biBlcnJvciBiaXQgKi8KLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NSkgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3Nzg2KQotIyBkZWZpbmUgU0NTUFRSMAkweGZmZWEwMDI0CS8qIDE2IGJpdCBTQ0lGICovCi0jIGRlZmluZSBTQ0lGX09SRVIJMHgwMDAxCQkvKiBPdmVycnVuIGVycm9yIGJpdCAqLwotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjAxKSB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDcyMDMpIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzIwNikgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjYzKQotIyBkZWZpbmUgU0NTUFRSMCAweGZmZmU4MDIwIC8qIDE2IGJpdCBTQ0lGICovCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MTkpCi0jIGRlZmluZSBTQ1NQVFIwIDB4Zjg0MDAwMjAgLyogMTYgYml0IFNDSUYgKi8KLSMgZGVmaW5lIFNDSUZfT1JFUiAweDAwMDEgIC8qIG92ZXJydW4gZXJyb3IgYml0ICovCi0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSFgzKQotIyBkZWZpbmUgU0NTUFRSMCAweGZmYzMwMDIwCQkvKiAxNiBiaXQgU0NJRiAqLwotIyBkZWZpbmUgU0NJRl9PUkVSIDB4MDAwMQkJLyogT3ZlcnJ1biBlcnJvciBiaXQgKi8KLSNlbHNlCi0jIGVycm9yIENQVSBzdWJ0eXBlIG5vdCBkZWZpbmVkCi0jZW5kaWYKLQotLyogU0N4U1IgU0NJICovCi0jZGVmaW5lIFNDSV9URFJFICAweDgwIC8qIDc3MDcgU0NJLCA3NzA4IFNDSSwgNzcwOSBTQ0ksIDc3NTAgU0NJICovCi0jZGVmaW5lIFNDSV9SRFJGICAweDQwIC8qIDc3MDcgU0NJLCA3NzA4IFNDSSwgNzcwOSBTQ0ksIDc3NTAgU0NJICovCi0jZGVmaW5lIFNDSV9PUkVSICAweDIwIC8qIDc3MDcgU0NJLCA3NzA4IFNDSSwgNzcwOSBTQ0ksIDc3NTAgU0NJICovCi0jZGVmaW5lIFNDSV9GRVIgICAweDEwIC8qIDc3MDcgU0NJLCA3NzA4IFNDSSwgNzcwOSBTQ0ksIDc3NTAgU0NJICovCi0jZGVmaW5lIFNDSV9QRVIgICAweDA4IC8qIDc3MDcgU0NJLCA3NzA4IFNDSSwgNzcwOSBTQ0ksIDc3NTAgU0NJICovCi0jZGVmaW5lIFNDSV9URU5EICAweDA0IC8qIDc3MDcgU0NJLCA3NzA4IFNDSSwgNzcwOSBTQ0ksIDc3NTAgU0NJICovCi0vKiAgICAgIFNDSV9NUEIgICAweDAyICAqIDc3MDcgU0NJLCA3NzA4IFNDSSwgNzcwOSBTQ0ksIDc3NTAgU0NJICovCi0vKiAgICAgIFNDSV9NUEJUICAweDAxICAqIDc3MDcgU0NJLCA3NzA4IFNDSSwgNzcwOSBTQ0ksIDc3NTAgU0NJICovCi0KLSNkZWZpbmUgU0NJX0VSUk9SUyAoIFNDSV9QRVIgfCBTQ0lfRkVSIHwgU0NJX09SRVIpCi0KLS8qIFNDeFNSIFNDSUYgKi8KLSNkZWZpbmUgU0NJRl9FUiAgICAweDAwODAgLyogNzcwNSBTQ0lGLCA3NzA3IFNDSUYsIDc3MDkgU0NJRiwgNzc1MCBTQ0lGICovCi0jZGVmaW5lIFNDSUZfVEVORCAgMHgwMDQwIC8qIDc3MDUgU0NJRiwgNzcwNyBTQ0lGLCA3NzA5IFNDSUYsIDc3NTAgU0NJRiAqLwotI2RlZmluZSBTQ0lGX1RERkUgIDB4MDAyMCAvKiA3NzA1IFNDSUYsIDc3MDcgU0NJRiwgNzcwOSBTQ0lGLCA3NzUwIFNDSUYgKi8KLSNkZWZpbmUgU0NJRl9CUksgICAweDAwMTAgLyogNzcwNSBTQ0lGLCA3NzA3IFNDSUYsIDc3MDkgU0NJRiwgNzc1MCBTQ0lGICovCi0jZGVmaW5lIFNDSUZfRkVSICAgMHgwMDA4IC8qIDc3MDUgU0NJRiwgNzcwNyBTQ0lGLCA3NzA5IFNDSUYsIDc3NTAgU0NJRiAqLwotI2RlZmluZSBTQ0lGX1BFUiAgIDB4MDAwNCAvKiA3NzA1IFNDSUYsIDc3MDcgU0NJRiwgNzcwOSBTQ0lGLCA3NzUwIFNDSUYgKi8KLSNkZWZpbmUgU0NJRl9SREYgICAweDAwMDIgLyogNzcwNSBTQ0lGLCA3NzA3IFNDSUYsIDc3MDkgU0NJRiwgNzc1MCBTQ0lGICovCi0jZGVmaW5lIFNDSUZfRFIgICAgMHgwMDAxIC8qIDc3MDUgU0NJRiwgNzcwNyBTQ0lGLCA3NzA5IFNDSUYsIDc3NTAgU0NJRiAqLwotCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1KSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIwKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIxKSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfQVJDSF9TSDczQTApIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19BUkNIX1NINzM2NykgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0FSQ0hfU0g3Mzc3KSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfQVJDSF9TSDczNzIpCi0jIGRlZmluZSBTQ0lGX09SRVIgICAgMHgwMjAwCi0jIGRlZmluZSBTQ0lGX0VSUk9SUyAoIFNDSUZfUEVSIHwgU0NJRl9GRVIgfCBTQ0lGX0VSIHwgU0NJRl9CUksgfCBTQ0lGX09SRVIpCi0jIGRlZmluZSBTQ0lGX1JGRENfTUFTSyAweDAwN2YKLSMgZGVmaW5lIFNDSUZfVFhST09NX01BWCA2NAotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzKQotIyBkZWZpbmUgU0NJRl9FUlJPUlMgKCBTQ0lGX1BFUiB8IFNDSUZfRkVSIHwgU0NJRl9FUiB8IFNDSUZfQlJLICkKLSMgZGVmaW5lIFNDSUZfUkZEQ19NQVNLIDB4MDA3ZgotIyBkZWZpbmUgU0NJRl9UWFJPT01fTUFYIDY0Ci0vKiBTSDc3NjMgU0NJRjIgc3VwcG9ydCAqLwotIyBkZWZpbmUgU0NJRjJfUkZEQ19NQVNLIDB4MDAxZgotIyBkZWZpbmUgU0NJRjJfVFhST09NX01BWCAxNgotI2Vsc2UKLSMgZGVmaW5lIFNDSUZfRVJST1JTICggU0NJRl9QRVIgfCBTQ0lGX0ZFUiB8IFNDSUZfRVIgfCBTQ0lGX0JSSykKLSMgZGVmaW5lIFNDSUZfUkZEQ19NQVNLIDB4MDAxZgotIyBkZWZpbmUgU0NJRl9UWFJPT01fTUFYIDE2Ci0jZW5kaWYKLQotI2lmbmRlZiBTQ0lGX09SRVIKLSNkZWZpbmUgU0NJRl9PUkVSCTB4MDAwMAotI2VuZGlmCi0KICNkZWZpbmUgU0N4U1JfVEVORChwb3J0KQkoKChwb3J0KS0+dHlwZSA9PSBQT1JUX1NDSSkgPyBTQ0lfVEVORCAgIDogU0NJRl9URU5EKQotI2RlZmluZSBTQ3hTUl9FUlJPUlMocG9ydCkJKCgocG9ydCktPnR5cGUgPT0gUE9SVF9TQ0kpID8gU0NJX0VSUk9SUyA6IFNDSUZfRVJST1JTKQogI2RlZmluZSBTQ3hTUl9SRHhGKHBvcnQpCSgoKHBvcnQpLT50eXBlID09IFBPUlRfU0NJKSA/IFNDSV9SRFJGICAgOiBTQ0lGX1JERikKICNkZWZpbmUgU0N4U1JfVER4RShwb3J0KQkoKChwb3J0KS0+dHlwZSA9PSBQT1JUX1NDSSkgPyBTQ0lfVERSRSAgIDogU0NJRl9UREZFKQogI2RlZmluZSBTQ3hTUl9GRVIocG9ydCkJCSgoKHBvcnQpLT50eXBlID09IFBPUlRfU0NJKSA/IFNDSV9GRVIgICAgOiBTQ0lGX0ZFUikKICNkZWZpbmUgU0N4U1JfUEVSKHBvcnQpCQkoKChwb3J0KS0+dHlwZSA9PSBQT1JUX1NDSSkgPyBTQ0lfUEVSICAgIDogU0NJRl9QRVIpCiAjZGVmaW5lIFNDeFNSX0JSSyhwb3J0KQkJKCgocG9ydCktPnR5cGUgPT0gUE9SVF9TQ0kpID8gMHgwMCAgICAgICA6IFNDSUZfQlJLKQotI2RlZmluZSBTQ3hTUl9PUkVSKHBvcnQpCSgoKHBvcnQpLT50eXBlID09IFBPUlRfU0NJKSA/IFNDSV9PUkVSCSA6IFNDSUZfT1JFUikKKworI2RlZmluZSBTQ3hTUl9FUlJPUlMocG9ydCkJKHRvX3NjaV9wb3J0KHBvcnQpLT5jZmctPmVycm9yX21hc2spCiAKICNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUpIHx8IFwKICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjApIHx8IFwKQEAgLTE5MSwyNzggKzM2LDMgQEAKIAogI2RlZmluZSBTQ0lfTUFKT1IJCTIwNAogI2RlZmluZSBTQ0lfTUlOT1JfU1RBUlQJCTgKLQotI2RlZmluZSBTQ0lfSU4oc2l6ZSwgb2Zmc2V0KQkJCQkJXAotICBpZiAoKHNpemUpID09IDgpIHsJCQkJCQlcCi0gICAgcmV0dXJuIGlvcmVhZDgocG9ydC0+bWVtYmFzZSArIChvZmZzZXQpKTsJCQlcCi0gIH0gZWxzZSB7CQkJCQkJCVwKLSAgICByZXR1cm4gaW9yZWFkMTYocG9ydC0+bWVtYmFzZSArIChvZmZzZXQpKTsJCQlcCi0gIH0KLSNkZWZpbmUgU0NJX09VVChzaXplLCBvZmZzZXQsIHZhbHVlKQkJCQlcCi0gIGlmICgoc2l6ZSkgPT0gOCkgewkJCQkJCVwKLSAgICBpb3dyaXRlOCh2YWx1ZSwgcG9ydC0+bWVtYmFzZSArIChvZmZzZXQpKTsJCQlcCi0gIH0gZWxzZSBpZiAoKHNpemUpID09IDE2KSB7CQkJCQlcCi0gICAgaW93cml0ZTE2KHZhbHVlLCBwb3J0LT5tZW1iYXNlICsgKG9mZnNldCkpOwkJCVwKLSAgfQotCi0jZGVmaW5lIENQVV9TQ0l4X0ZOUyhuYW1lLCBzY2lfb2Zmc2V0LCBzY2lfc2l6ZSwgc2NpZl9vZmZzZXQsIHNjaWZfc2l6ZSlcCi0gIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNjaV8jI25hbWUjI19pbihzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQlcCi0gIHsJCQkJCQkJCQlcCi0gICAgaWYgKHBvcnQtPnR5cGUgPT0gUE9SVF9TQ0lGIHx8IHBvcnQtPnR5cGUgPT0gUE9SVF9TQ0lGQikgewkJXAotICAgICAgU0NJX0lOKHNjaWZfc2l6ZSwgc2NpZl9vZmZzZXQpCQkJCQlcCi0gICAgfSBlbHNlIHsJLyogUE9SVF9TQ0kgb3IgUE9SVF9TQ0lGQSAqLwkJCQlcCi0gICAgICBTQ0lfSU4oc2NpX3NpemUsIHNjaV9vZmZzZXQpOwkJCQkJXAotICAgIH0JCQkJCQkJCQlcCi0gIH0JCQkJCQkJCQlcCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBzY2lfIyNuYW1lIyNfb3V0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCB2YWx1ZSkgXAotICB7CQkJCQkJCQkJXAotICAgIGlmIChwb3J0LT50eXBlID09IFBPUlRfU0NJRiB8fCBwb3J0LT50eXBlID09IFBPUlRfU0NJRkIpIHsJCVwKLSAgICAgIFNDSV9PVVQoc2NpZl9zaXplLCBzY2lmX29mZnNldCwgdmFsdWUpCQkJCVwKLSAgICB9IGVsc2UgewkvKiBQT1JUX1NDSSBvciBQT1JUX1NDSUZBICovCQkJCVwKLSAgICAgIFNDSV9PVVQoc2NpX3NpemUsIHNjaV9vZmZzZXQsIHZhbHVlKTsJCQkJXAotICAgIH0JCQkJCQkJCQlcCi0gIH0KLQotI2lmZGVmIENPTkZJR19IODMwMAotLyogaDgzMDAgZG9uJ3QgaGF2ZSBTQ0lGICovCi0jZGVmaW5lIENQVV9TQ0lGX0ZOUyhuYW1lKQkJCQkJCVwKLSAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc2NpXyMjbmFtZSMjX2luKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCVwKLSAgewkJCQkJCQkJCVwKLSAgICByZXR1cm4gMDsJCQkJCQkJCVwKLSAgfQkJCQkJCQkJCVwKLSAgc3RhdGljIGlubGluZSB2b2lkIHNjaV8jI25hbWUjI19vdXQoc3RydWN0IHVhcnRfcG9ydCAqcG9ydCwgdW5zaWduZWQgaW50IHZhbHVlKSBcCi0gIHsJCQkJCQkJCQlcCi0gIH0KLSNlbHNlCi0jZGVmaW5lIENQVV9TQ0lGX0ZOUyhuYW1lLCBzY2lmX29mZnNldCwgc2NpZl9zaXplKQkJCVwKLSAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgc2NpXyMjbmFtZSMjX2luKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCVwKLSAgewkJCQkJCQkJCVwKLSAgICBTQ0lfSU4oc2NpZl9zaXplLCBzY2lmX29mZnNldCk7CQkJCQlcCi0gIH0JCQkJCQkJCQlcCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBzY2lfIyNuYW1lIyNfb3V0KHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQsIHVuc2lnbmVkIGludCB2YWx1ZSkgXAotICB7CQkJCQkJCQkJXAotICAgIFNDSV9PVVQoc2NpZl9zaXplLCBzY2lmX29mZnNldCwgdmFsdWUpOwkJCQlcCi0gIH0KLSNlbmRpZgotCi0jZGVmaW5lIENQVV9TQ0lfRk5TKG5hbWUsIHNjaV9vZmZzZXQsIHNjaV9zaXplKQkJCQlcCi0gIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHNjaV8jI25hbWUjI19pbihzdHJ1Y3QgdWFydF9wb3J0KiBwb3J0KQlcCi0gIHsJCQkJCQkJCQlcCi0gICAgU0NJX0lOKHNjaV9zaXplLCBzY2lfb2Zmc2V0KTsJCQkJCVwKLSAgfQkJCQkJCQkJCVwKLSAgc3RhdGljIGlubGluZSB2b2lkIHNjaV8jI25hbWUjI19vdXQoc3RydWN0IHVhcnRfcG9ydCogcG9ydCwgdW5zaWduZWQgaW50IHZhbHVlKSBcCi0gIHsJCQkJCQkJCQlcCi0gICAgU0NJX09VVChzY2lfc2l6ZSwgc2NpX29mZnNldCwgdmFsdWUpOwkJCQlcCi0gIH0KLQotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TSDMpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19BUkNIX1NINzNBMCkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0FSQ0hfU0g3MzY3KSB8fCBcCi0gICAgZGVmaW5lZChDT05GSUdfQVJDSF9TSDczNzcpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19BUkNIX1NINzM3MikKLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MTApIHx8IGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcxMikKLSNkZWZpbmUgU0NJeF9GTlMobmFtZSwgc2gzX3NjaV9vZmZzZXQsIHNoM19zY2lfc2l6ZSwgc2g0X3NjaV9vZmZzZXQsIHNoNF9zY2lfc2l6ZSwgXAotCQkgICAgICAgICAgICAgICAgc2gzX3NjaWZfb2Zmc2V0LCBzaDNfc2NpZl9zaXplLCBzaDRfc2NpZl9vZmZzZXQsIHNoNF9zY2lmX3NpemUsIFwKLQkJICAgICAgICAgICAgICAgICBoOF9zY2lfb2Zmc2V0LCBoOF9zY2lfc2l6ZSkgXAotICBDUFVfU0NJeF9GTlMobmFtZSwgc2g0X3NjaV9vZmZzZXQsIHNoNF9zY2lfc2l6ZSwgc2g0X3NjaWZfb2Zmc2V0LCBzaDRfc2NpZl9zaXplKQotI2RlZmluZSBTQ0lGX0ZOUyhuYW1lLCBzaDNfc2NpZl9vZmZzZXQsIHNoM19zY2lmX3NpemUsIHNoNF9zY2lmX29mZnNldCwgc2g0X3NjaWZfc2l6ZSkgXAotCSAgQ1BVX1NDSUZfRk5TKG5hbWUsIHNoNF9zY2lmX29mZnNldCwgc2g0X3NjaWZfc2l6ZSkKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNSkgfHwgXAotICAgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIwKSB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjEpIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX0FSQ0hfU0g3MzY3KQotI2RlZmluZSBTQ0lGX0ZOUyhuYW1lLCBzY2lmX29mZnNldCwgc2NpZl9zaXplKSBcCi0gIENQVV9TQ0lGX0ZOUyhuYW1lLCBzY2lmX29mZnNldCwgc2NpZl9zaXplKQotI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9TSDczNzcpIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX0FSQ0hfU0g3MzcyKSB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19BUkNIX1NINzNBMCkKLSNkZWZpbmUgU0NJeF9GTlMobmFtZSwgc2g0X3NjaWZhX29mZnNldCwgc2g0X3NjaWZhX3NpemUsIHNoNF9zY2lmYl9vZmZzZXQsIHNoNF9zY2lmYl9zaXplKSBcCi0gIENQVV9TQ0l4X0ZOUyhuYW1lLCBzaDRfc2NpZmFfb2Zmc2V0LCBzaDRfc2NpZmFfc2l6ZSwgc2g0X3NjaWZiX29mZnNldCwgc2g0X3NjaWZiX3NpemUpCi0jZGVmaW5lIFNDSUZfRk5TKG5hbWUsIHNjaWZfb2Zmc2V0LCBzY2lmX3NpemUpIFwKLSAgQ1BVX1NDSUZfRk5TKG5hbWUsIHNjaWZfb2Zmc2V0LCBzY2lmX3NpemUpCi0jZWxzZQotI2RlZmluZSBTQ0l4X0ZOUyhuYW1lLCBzaDNfc2NpX29mZnNldCwgc2gzX3NjaV9zaXplLCBzaDRfc2NpX29mZnNldCwgc2g0X3NjaV9zaXplLCBcCi0JCSBzaDNfc2NpZl9vZmZzZXQsIHNoM19zY2lmX3NpemUsIHNoNF9zY2lmX29mZnNldCwgc2g0X3NjaWZfc2l6ZSwgXAotICAgICAgICAgICAgICAgICBoOF9zY2lfb2Zmc2V0LCBoOF9zY2lfc2l6ZSkgXAotICBDUFVfU0NJeF9GTlMobmFtZSwgc2gzX3NjaV9vZmZzZXQsIHNoM19zY2lfc2l6ZSwgc2gzX3NjaWZfb2Zmc2V0LCBzaDNfc2NpZl9zaXplKQotI2RlZmluZSBTQ0lGX0ZOUyhuYW1lLCBzaDNfc2NpZl9vZmZzZXQsIHNoM19zY2lmX3NpemUsIHNoNF9zY2lmX29mZnNldCwgc2g0X3NjaWZfc2l6ZSkgXAotICBDUFVfU0NJRl9GTlMobmFtZSwgc2gzX3NjaWZfb2Zmc2V0LCBzaDNfc2NpZl9zaXplKQotI2VuZGlmCi0jZWxpZiBkZWZpbmVkKF9fSDgzMDBIX18pIHx8IGRlZmluZWQoX19IODMwMFNfXykKLSNkZWZpbmUgU0NJeF9GTlMobmFtZSwgc2gzX3NjaV9vZmZzZXQsIHNoM19zY2lfc2l6ZSwgc2g0X3NjaV9vZmZzZXQsIHNoNF9zY2lfc2l6ZSwgXAotCQkgc2gzX3NjaWZfb2Zmc2V0LCBzaDNfc2NpZl9zaXplLCBzaDRfc2NpZl9vZmZzZXQsIHNoNF9zY2lmX3NpemUsIFwKLSAgICAgICAgICAgICAgICAgaDhfc2NpX29mZnNldCwgaDhfc2NpX3NpemUpIFwKLSAgQ1BVX1NDSV9GTlMobmFtZSwgaDhfc2NpX29mZnNldCwgaDhfc2NpX3NpemUpCi0jZGVmaW5lIFNDSUZfRk5TKG5hbWUsIHNoM19zY2lmX29mZnNldCwgc2gzX3NjaWZfc2l6ZSwgc2g0X3NjaWZfb2Zmc2V0LCBzaDRfc2NpZl9zaXplKSBcCi0gIENQVV9TQ0lGX0ZOUyhuYW1lKQotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIzKSB8fFwKLSAgICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyNCkKLSAgICAgICAgI2RlZmluZSBTQ0l4X0ZOUyhuYW1lLCBzaDRfc2NpZmFfb2Zmc2V0LCBzaDRfc2NpZmFfc2l6ZSwgc2g0X3NjaWZfb2Zmc2V0LCBzaDRfc2NpZl9zaXplKSBcCi0gICAgICAgICAgICAgICAgQ1BVX1NDSXhfRk5TKG5hbWUsIHNoNF9zY2lmYV9vZmZzZXQsIHNoNF9zY2lmYV9zaXplLCBzaDRfc2NpZl9vZmZzZXQsIHNoNF9zY2lmX3NpemUpCi0gICAgICAgICNkZWZpbmUgU0NJRl9GTlMobmFtZSwgc2g0X3NjaWZfb2Zmc2V0LCBzaDRfc2NpZl9zaXplKSBcCi0gICAgICAgICAgICAgICAgQ1BVX1NDSUZfRk5TKG5hbWUsIHNoNF9zY2lmX29mZnNldCwgc2g0X3NjaWZfc2l6ZSkKLSNlbHNlCi0jZGVmaW5lIFNDSXhfRk5TKG5hbWUsIHNoM19zY2lfb2Zmc2V0LCBzaDNfc2NpX3NpemUsIHNoNF9zY2lfb2Zmc2V0LCBzaDRfc2NpX3NpemUsIFwKLQkJIHNoM19zY2lmX29mZnNldCwgc2gzX3NjaWZfc2l6ZSwgc2g0X3NjaWZfb2Zmc2V0LCBzaDRfc2NpZl9zaXplLCBcCi0JCSBoOF9zY2lfb2Zmc2V0LCBoOF9zY2lfc2l6ZSkgXAotICBDUFVfU0NJeF9GTlMobmFtZSwgc2g0X3NjaV9vZmZzZXQsIHNoNF9zY2lfc2l6ZSwgc2g0X3NjaWZfb2Zmc2V0LCBzaDRfc2NpZl9zaXplKQotI2RlZmluZSBTQ0lGX0ZOUyhuYW1lLCBzaDNfc2NpZl9vZmZzZXQsIHNoM19zY2lmX3NpemUsIHNoNF9zY2lmX29mZnNldCwgc2g0X3NjaWZfc2l6ZSkgXAotICBDUFVfU0NJRl9GTlMobmFtZSwgc2g0X3NjaWZfb2Zmc2V0LCBzaDRfc2NpZl9zaXplKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjApIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjEpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19BUkNIX1NINzM2NykKLQotU0NJRl9GTlMoU0NTTVIsICAweDAwLCAxNikKLVNDSUZfRk5TKFNDQlJSLCAgMHgwNCwgIDgpCi1TQ0lGX0ZOUyhTQ1NDUiwgIDB4MDgsIDE2KQotU0NJRl9GTlMoU0N4U1IsICAweDE0LCAxNikKLVNDSUZfRk5TKFNDRkNSLCAgMHgxOCwgMTYpCi1TQ0lGX0ZOUyhTQ0ZEUiwgIDB4MWMsIDE2KQotU0NJRl9GTlMoU0N4VERSLCAweDIwLCAgOCkKLVNDSUZfRk5TKFNDeFJEUiwgMHgyNCwgIDgpCi1TQ0lGX0ZOUyhTQ0xTUiwgIDB4MDAsICAwKQotI2VsaWYgZGVmaW5lZChDT05GSUdfQVJDSF9TSDczNzcpIHx8IFwKLSAgICAgIGRlZmluZWQoQ09ORklHX0FSQ0hfU0g3MzcyKSB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19BUkNIX1NINzNBMCkKLVNDSUZfRk5TKFNDU01SLCAgMHgwMCwgMTYpCi1TQ0lGX0ZOUyhTQ0JSUiwgIDB4MDQsICA4KQotU0NJRl9GTlMoU0NTQ1IsICAweDA4LCAxNikKLVNDSUZfRk5TKFNDVERTUiwgMHgwYywgMTYpCi1TQ0lGX0ZOUyhTQ0ZFUiwgIDB4MTAsIDE2KQotU0NJRl9GTlMoU0N4U1IsICAweDE0LCAxNikKLVNDSUZfRk5TKFNDRkNSLCAgMHgxOCwgMTYpCi1TQ0lGX0ZOUyhTQ0ZEUiwgIDB4MWMsIDE2KQotU0NJRl9GTlMoU0NURkRSLCAweDM4LCAxNikKLVNDSUZfRk5TKFNDUkZEUiwgMHgzYywgMTYpCi1TQ0l4X0ZOUyhTQ3hURFIsIDB4MjAsICA4LCAweDQwLCAgOCkKLVNDSXhfRk5TKFNDeFJEUiwgMHgyNCwgIDgsIDB4NjAsICA4KQotU0NJRl9GTlMoU0NMU1IsICAweDAwLCAgMCkKLSNlbGlmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMykgfHxcCi0gICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MjQpCi1TQ0l4X0ZOUyhTQ1NNUiwgIDB4MDAsIDE2LCAweDAwLCAxNikKLVNDSXhfRk5TKFNDQlJSLCAgMHgwNCwgIDgsIDB4MDQsICA4KQotU0NJeF9GTlMoU0NTQ1IsICAweDA4LCAxNiwgMHgwOCwgMTYpCi1TQ0l4X0ZOUyhTQ3hURFIsIDB4MjAsICA4LCAweDBjLCAgOCkKLVNDSXhfRk5TKFNDeFNSLCAgMHgxNCwgMTYsIDB4MTAsIDE2KQotU0NJeF9GTlMoU0N4UkRSLCAweDI0LCAgOCwgMHgxNCwgIDgpCi1TQ0l4X0ZOUyhTQ1NQVFIsIDAsICAgICAwLCAgICAwLCAgMCkKLVNDSUZfRk5TKFNDRkNSLCAgMHgxOCwgMTYpCi1TQ0lGX0ZOUyhTQ0ZEUiwgIDB4MWMsIDE2KQotU0NJRl9GTlMoU0NMU1IsICAweDI0LCAxNikKLSNlbHNlCi0vKiAgICAgIHJlZyAgICAgIFNDSS9TSDMgICBTQ0kvU0g0ICBTQ0lGL1NIMyAgIFNDSUYvU0g0ICBTQ0kvSDgqLwotLyogICAgICBuYW1lICAgICBvZmYgIHN6ICAgb2ZmICBzeiAgIG9mZiAgc3ogICBvZmYgIHN6ICAgb2ZmICBzeiovCi1TQ0l4X0ZOUyhTQ1NNUiwgIDB4MDAsICA4LCAweDAwLCAgOCwgMHgwMCwgIDgsIDB4MDAsIDE2LCAweDAwLCAgOCkKLVNDSXhfRk5TKFNDQlJSLCAgMHgwMiwgIDgsIDB4MDQsICA4LCAweDAyLCAgOCwgMHgwNCwgIDgsIDB4MDEsICA4KQotU0NJeF9GTlMoU0NTQ1IsICAweDA0LCAgOCwgMHgwOCwgIDgsIDB4MDQsICA4LCAweDA4LCAxNiwgMHgwMiwgIDgpCi1TQ0l4X0ZOUyhTQ3hURFIsIDB4MDYsICA4LCAweDBjLCAgOCwgMHgwNiwgIDgsIDB4MEMsICA4LCAweDAzLCAgOCkKLVNDSXhfRk5TKFNDeFNSLCAgMHgwOCwgIDgsIDB4MTAsICA4LCAweDA4LCAxNiwgMHgxMCwgMTYsIDB4MDQsICA4KQotU0NJeF9GTlMoU0N4UkRSLCAweDBhLCAgOCwgMHgxNCwgIDgsIDB4MEEsICA4LCAweDE0LCAgOCwgMHgwNSwgIDgpCi1TQ0lGX0ZOUyhTQ0ZDUiwgICAgICAgICAgICAgICAgICAgICAgMHgwYywgIDgsIDB4MTgsIDE2KQotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc2MCkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NSkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4NikKLVNDSUZfRk5TKFNDRkRSLAkJCSAgICAgMHgwZSwgMTYsIDB4MUMsIDE2KQotU0NJRl9GTlMoU0NURkRSLAkJICAgICAweDBlLCAxNiwgMHgxQywgMTYpCi1TQ0lGX0ZOUyhTQ1JGRFIsCQkgICAgIDB4MGUsIDE2LCAweDIwLCAxNikKLVNDSUZfRk5TKFNDU1BUUiwJCQkwLCAgMCwgMHgyNCwgMTYpCi1TQ0lGX0ZOUyhTQ0xTUiwJCQkJMCwgIDAsIDB4MjgsIDE2KQotI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzYzKQotU0NJRl9GTlMoU0NGRFIsCQkJCTAsICAwLCAweDFDLCAxNikKLVNDSUZfRk5TKFNDVEZEUiwJCSAgICAgMHgwZSwgMTYsIDB4MUMsIDE2KQotU0NJRl9GTlMoU0NSRkRSLAkJICAgICAweDBlLCAxNiwgMHgyMCwgMTYpCi1TQ0lGX0ZOUyhTQ1NQVFIsCQkJMCwgIDAsIDB4MjQsIDE2KQotU0NJRl9GTlMoU0NMU1IsCQkJCTAsICAwLCAweDI4LCAxNikKLSNlbHNlCi1TQ0lGX0ZOUyhTQ0ZEUiwgICAgICAgICAgICAgICAgICAgICAgMHgwZSwgMTYsIDB4MUMsIDE2KQotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcyMikKLVNDSUZfRk5TKFNDU1BUUiwgICAgICAgICAgICAgICAgICAgICAgICAwLCAgMCwgMCwgMCkKLSNlbHNlCi1TQ0lGX0ZOUyhTQ1NQVFIsICAgICAgICAgICAgICAgICAgICAgICAgMCwgIDAsIDB4MjAsIDE2KQotI2VuZGlmCi1TQ0lGX0ZOUyhTQ0xTUiwgICAgICAgICAgICAgICAgICAgICAgICAgMCwgIDAsIDB4MjQsIDE2KQotI2VuZGlmCi0jZW5kaWYKLSNkZWZpbmUgc2NpX2luKHBvcnQsIHJlZykgc2NpXyMjcmVnIyNfaW4ocG9ydCkKLSNkZWZpbmUgc2NpX291dChwb3J0LCByZWcsIHZhbHVlKSBzY2lfIyNyZWcjI19vdXQocG9ydCwgdmFsdWUpCi0KLS8qIEg4LzMwMCBzZXJpZXMgU0NJIHBpbnMgYXNzaWdubWVudCAqLwotI2lmIGRlZmluZWQoX19IODMwMEhfXykgfHwgZGVmaW5lZChfX0g4MzAwU19fKQotc3RhdGljIGNvbnN0IHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSB7Ci0JaW50IHBvcnQ7ICAgICAgICAgICAgIC8qIEdQSU8gcG9ydCBubyAqLwotCXVuc2lnbmVkIHNob3J0IHJ4LHR4OyAvKiBHUElPIGJpdCBubyAqLwotfSBoODMwMF9zY2lfcGluc1tdID0gewotI2lmIGRlZmluZWQoQ09ORklHX0g4MzAwNykgfHwgZGVmaW5lZChDT05GSUdfSDgzMDY4KQotCXsgICAgLyogU0NJMCAqLwotCQkucG9ydCA9IEg4MzAwX0dQSU9fUDksCi0JCS5yeCAgID0gSDgzMDBfR1BJT19CMiwKLQkJLnR4ICAgPSBIODMwMF9HUElPX0IwLAotCX0sCi0JeyAgICAvKiBTQ0kxICovCi0JCS5wb3J0ID0gSDgzMDBfR1BJT19QOSwKLQkJLnJ4ICAgPSBIODMwMF9HUElPX0IzLAotCQkudHggICA9IEg4MzAwX0dQSU9fQjEsCi0JfSwKLQl7ICAgIC8qIFNDSTIgKi8KLQkJLnBvcnQgPSBIODMwMF9HUElPX1BCLAotCQkucnggICA9IEg4MzAwX0dQSU9fQjcsCi0JCS50eCAgID0gSDgzMDBfR1BJT19CNiwKLQl9Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19IOFMyNjc4KQotCXsgICAgLyogU0NJMCAqLwotCQkucG9ydCA9IEg4MzAwX0dQSU9fUDMsCi0JCS5yeCAgID0gSDgzMDBfR1BJT19CMiwKLQkJLnR4ICAgPSBIODMwMF9HUElPX0IwLAotCX0sCi0JeyAgICAvKiBTQ0kxICovCi0JCS5wb3J0ID0gSDgzMDBfR1BJT19QMywKLQkJLnJ4ICAgPSBIODMwMF9HUElPX0IzLAotCQkudHggICA9IEg4MzAwX0dQSU9fQjEsCi0JfSwKLQl7ICAgIC8qIFNDSTIgKi8KLQkJLnBvcnQgPSBIODMwMF9HUElPX1A1LAotCQkucnggICA9IEg4MzAwX0dQSU9fQjEsCi0JCS50eCAgID0gSDgzMDBfR1BJT19CMCwKLQl9Ci0jZW5kaWYKLX07Ci0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNikgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNykgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOCkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwOSkKLXN0YXRpYyBpbmxpbmUgaW50IHNjaV9yeGRfaW4oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKLXsKLQlpZiAocG9ydC0+bWFwYmFzZSA9PSAweGZmZmZmZTgwKQotCQlyZXR1cm4gX19yYXdfcmVhZGIoU0NQRFIpJjB4MDEgPyAxIDogMDsgLyogU0NJICovCi0JcmV0dXJuIDE7Ci19Ci0jZWxpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTApICB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTEpICB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTFSKSB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBSKSB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NTBTKSB8fCBcCi0gICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDcwOTEpCi1zdGF0aWMgaW5saW5lIGludCBzY2lfcnhkX2luKHN0cnVjdCB1YXJ0X3BvcnQgKnBvcnQpCi17Ci0JaWYgKHBvcnQtPm1hcGJhc2UgPT0gMHhmZmUwMDAwMCkKLQkJcmV0dXJuIF9fcmF3X3JlYWRiKFNDU1BUUjEpJjB4MDEgPyAxIDogMDsgLyogU0NJICovCi0JcmV0dXJuIDE7Ci19Ci0jZWxpZiBkZWZpbmVkKF9fSDgzMDBIX18pIHx8IGRlZmluZWQoX19IODMwMFNfXykKLXN0YXRpYyBpbmxpbmUgaW50IHNjaV9yeGRfaW4oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKLXsKLQlpbnQgY2ggPSAocG9ydC0+bWFwYmFzZSAtIFNNUjApID4+IDM7Ci0JcmV0dXJuIChIODMwMF9TQ0lfRFIoY2gpICYgaDgzMDBfc2NpX3BpbnNbY2hdLnJ4KSA/IDEgOiAwOwotfQotI2Vsc2UgLyogZGVmYXVsdCBjYXNlIGZvciBub24tU0NJIHByb2Nlc3NvcnMgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHNjaV9yeGRfaW4oc3RydWN0IHVhcnRfcG9ydCAqcG9ydCkKLXsKLQlyZXR1cm4gMTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3V2Y192NGwyLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdXZjX3Y0bDIuYwppbmRleCA1ZTgwN2YwLi41MmY4ZjllIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvdXZjX3Y0bDIuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdXZjX3Y0bDIuYwpAQCAtMTI0LDI0ICsxMjQsMTIgQEAKIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gdmlkZW9fZGV2ZGF0YShmaWxlKTsKIAlzdHJ1Y3QgdXZjX2RldmljZSAqdXZjID0gdmlkZW9fZ2V0X2RydmRhdGEodmRldik7CiAJc3RydWN0IHV2Y19maWxlX2hhbmRsZSAqaGFuZGxlOwotCWludCByZXQ7CiAKIAloYW5kbGUgPSBremFsbG9jKHNpemVvZigqaGFuZGxlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGhhbmRsZSA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXJldCA9IHY0bDJfZmhfaW5pdCgmaGFuZGxlLT52ZmgsIHZkZXYpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycm9yOwotCi0JcmV0ID0gdjRsMl9ldmVudF9pbml0KCZoYW5kbGUtPnZmaCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KLQlyZXQgPSB2NGwyX2V2ZW50X2FsbG9jKCZoYW5kbGUtPnZmaCwgOCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZXJyb3I7Ci0KKwl2NGwyX2ZoX2luaXQoJmhhbmRsZS0+dmZoLCB2ZGV2KTsKIAl2NGwyX2ZoX2FkZCgmaGFuZGxlLT52ZmgpOwogCiAJaGFuZGxlLT5kZXZpY2UgPSAmdXZjLT52aWRlbzsKQEAgLTE0OSwxMCArMTM3LDYgQEAKIAogCXV2Y19mdW5jdGlvbl9jb25uZWN0KHV2Yyk7CiAJcmV0dXJuIDA7Ci0KLWVycm9yOgotCXY0bDJfZmhfZXhpdCgmaGFuZGxlLT52ZmgpOwotCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTMxNCw3ICsyOTgsNyBAQAogCQlpZiAoc3ViLT50eXBlIDwgVVZDX0VWRU5UX0ZJUlNUIHx8IHN1Yi0+dHlwZSA+IFVWQ19FVkVOVF9MQVNUKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJcmV0dXJuIHY0bDJfZXZlbnRfc3Vic2NyaWJlKCZoYW5kbGUtPnZmaCwgYXJnKTsKKwkJcmV0dXJuIHY0bDJfZXZlbnRfc3Vic2NyaWJlKCZoYW5kbGUtPnZmaCwgYXJnLCAyKTsKIAl9CiAKIAljYXNlIFZJRElPQ19VTlNVQlNDUklCRV9FVkVOVDoKQEAgLTM1NCw3ICszMzgsNyBAQAogCXN0cnVjdCB1dmNfZmlsZV9oYW5kbGUgKmhhbmRsZSA9IHRvX3V2Y19maWxlX2hhbmRsZShmaWxlLT5wcml2YXRlX2RhdGEpOwogCXVuc2lnbmVkIGludCBtYXNrID0gMDsKIAotCXBvbGxfd2FpdChmaWxlLCAmaGFuZGxlLT52ZmguZXZlbnRzLT53YWl0LCB3YWl0KTsKKwlwb2xsX3dhaXQoZmlsZSwgJmhhbmRsZS0+dmZoLndhaXQsIHdhaXQpOwogCWlmICh2NGwyX2V2ZW50X3BlbmRpbmcoJmhhbmRsZS0+dmZoKSkKIAkJbWFzayB8PSBQT0xMUFJJOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9LY29uZmlnIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvS2NvbmZpZwppbmRleCAxZTU0YjhiLi4yNzhhZWFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9LY29uZmlnCisrKyBiL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L0tjb25maWcKQEAgLTMzNSw2ICszMzUsMTMgQEAKIAkgIElmIHlvdSBoYXZlIGEgYmFja2xpZ2h0IGRyaXZlbiBieSBhIE5YUCBQQ0Y1MDYzMyBNRkQsIHNheSBZIGhlcmUgdG8KIAkgIGVuYWJsZSBpdHMgZHJpdmVyLgogCitjb25maWcgQkFDS0xJR0hUX0FBVDI4NzAKKwl0cmlzdGF0ZSAiQW5hbG9naWNUZWNoIEFBVDI4NzAgQmFja2xpZ2h0IgorCWRlcGVuZHMgb24gQkFDS0xJR0hUX0NMQVNTX0RFVklDRSAmJiBNRkRfQUFUMjg3MF9DT1JFCisJaGVscAorCSAgSWYgeW91IGhhdmUgYSBBbmFsb2dpY1RlY2ggQUFUMjg3MCBzYXkgWSB0byBlbmFibGUgdGhlCisJICBiYWNrbGlnaHQgZHJpdmVyLgorCiBlbmRpZiAjIEJBQ0tMSUdIVF9DTEFTU19ERVZJQ0UKIAogZW5kaWYgIyBCQUNLTElHSFRfTENEX1NVUFBPUlQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYmFja2xpZ2h0L01ha2VmaWxlIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvTWFrZWZpbGUKaW5kZXggYmYxZGQ5Mi4uZmRkMWZjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvTWFrZWZpbGUKQEAgLTM4LDQgKzM4LDUgQEAKIG9iai0kKENPTkZJR19CQUNLTElHSFRfQURQODg3MCkJKz0gYWRwODg3MF9ibC5vCiBvYmotJChDT05GSUdfQkFDS0xJR0hUXzg4UE04NjBYKSArPSA4OHBtODYweF9ibC5vCiBvYmotJChDT05GSUdfQkFDS0xJR0hUX1BDRjUwNjMzKQkrPSBwY2Y1MDYzMy1iYWNrbGlnaHQubworb2JqLSQoQ09ORklHX0JBQ0tMSUdIVF9BQVQyODcwKSArPSBhYXQyODcwX2JsLm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYWF0Mjg3MF9ibC5jIGIvZHJpdmVycy92aWRlby9iYWNrbGlnaHQvYWF0Mjg3MF9ibC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMWYxZWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9hYXQyODcwX2JsLmMKQEAgLTAsMCArMSwyNDYgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL3ZpZGVvL2JhY2tsaWdodC9hYXQyODcwX2JsLmMKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIE5WSURJQSBDb3Jwb3JhdGlvbi4KKyAqIEF1dGhvcjogSmluIFBhcmsgPGppbnlvdW5ncEBudmlkaWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L21mZC9hYXQyODcwLmg+CisKK3N0cnVjdCBhYXQyODcwX2JsX2RyaXZlcl9kYXRhIHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2OworCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZDsKKworCWludCBjaGFubmVsczsKKwlpbnQgbWF4X2N1cnJlbnQ7CisJaW50IGJyaWdodG5lc3M7IC8qIGN1cnJlbnQgYnJpZ2h0bmVzcyAqLworfTsKKworc3RhdGljIGlubGluZSBpbnQgYWF0Mjg3MF9icmlnaHRuZXNzKHN0cnVjdCBhYXQyODcwX2JsX2RyaXZlcl9kYXRhICphYXQyODcwX2JsLAorCQkJCSAgICAgaW50IGJyaWdodG5lc3MpCit7CisJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkID0gYWF0Mjg3MF9ibC0+YmQ7CisJaW50IHZhbDsKKworCXZhbCA9IGJyaWdodG5lc3MgKiAoYWF0Mjg3MF9ibC0+bWF4X2N1cnJlbnQgLSAxKTsKKwl2YWwgLz0gYmQtPnByb3BzLm1heF9icmlnaHRuZXNzOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIGlubGluZSBpbnQgYWF0Mjg3MF9ibF9lbmFibGUoc3RydWN0IGFhdDI4NzBfYmxfZHJpdmVyX2RhdGEgKmFhdDI4NzBfYmwpCit7CisJc3RydWN0IGFhdDI4NzBfZGF0YSAqYWF0Mjg3MAorCQkJPSBkZXZfZ2V0X2RydmRhdGEoYWF0Mjg3MF9ibC0+cGRldi0+ZGV2LnBhcmVudCk7CisKKwlyZXR1cm4gYWF0Mjg3MC0+d3JpdGUoYWF0Mjg3MCwgQUFUMjg3MF9CTF9DSF9FTiwKKwkJCSAgICAgICh1OClhYXQyODcwX2JsLT5jaGFubmVscyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFhdDI4NzBfYmxfZGlzYWJsZShzdHJ1Y3QgYWF0Mjg3MF9ibF9kcml2ZXJfZGF0YSAqYWF0Mjg3MF9ibCkKK3sKKwlzdHJ1Y3QgYWF0Mjg3MF9kYXRhICphYXQyODcwCisJCQk9IGRldl9nZXRfZHJ2ZGF0YShhYXQyODcwX2JsLT5wZGV2LT5kZXYucGFyZW50KTsKKworCXJldHVybiBhYXQyODcwLT53cml0ZShhYXQyODcwLCBBQVQyODcwX0JMX0NIX0VOLCAweDApOworfQorCitzdGF0aWMgaW50IGFhdDI4NzBfYmxfZ2V0X2JyaWdodG5lc3Moc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQoreworCXJldHVybiBiZC0+cHJvcHMuYnJpZ2h0bmVzczsKK30KKworc3RhdGljIGludCBhYXQyODcwX2JsX3VwZGF0ZV9zdGF0dXMoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQoreworCXN0cnVjdCBhYXQyODcwX2JsX2RyaXZlcl9kYXRhICphYXQyODcwX2JsID0gZGV2X2dldF9kcnZkYXRhKCZiZC0+ZGV2KTsKKwlzdHJ1Y3QgYWF0Mjg3MF9kYXRhICphYXQyODcwID0KKwkJCWRldl9nZXRfZHJ2ZGF0YShhYXQyODcwX2JsLT5wZGV2LT5kZXYucGFyZW50KTsKKwlpbnQgYnJpZ2h0bmVzcyA9IGJkLT5wcm9wcy5icmlnaHRuZXNzOworCWludCByZXQ7CisKKwlpZiAoKGJyaWdodG5lc3MgPCAwKSB8fCAoYmQtPnByb3BzLm1heF9icmlnaHRuZXNzIDwgYnJpZ2h0bmVzcykpIHsKKwkJZGV2X2VycigmYmQtPmRldiwgImludmFsaWQgYnJpZ2h0bmVzcywgJWRcbiIsIGJyaWdodG5lc3MpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlkZXZfZGJnKCZiZC0+ZGV2LCAiYnJpZ2h0bmVzcz0lZCwgcG93ZXI9JWQsIHN0YXRlPSVkXG4iLAorCQkgYmQtPnByb3BzLmJyaWdodG5lc3MsIGJkLT5wcm9wcy5wb3dlciwgYmQtPnByb3BzLnN0YXRlKTsKKworCWlmICgoYmQtPnByb3BzLnBvd2VyICE9IEZCX0JMQU5LX1VOQkxBTkspIHx8CisJCQkoYmQtPnByb3BzLnN0YXRlICYgQkxfQ09SRV9GQkJMQU5LKSB8fAorCQkJKGJkLT5wcm9wcy5zdGF0ZSAmIEJMX0NPUkVfU1VTUEVOREVEKSkKKwkJYnJpZ2h0bmVzcyA9IDA7CisKKwlyZXQgPSBhYXQyODcwLT53cml0ZShhYXQyODcwLCBBQVQyODcwX0JMTSwKKwkJCSAgICAgKHU4KWFhdDI4NzBfYnJpZ2h0bmVzcyhhYXQyODcwX2JsLCBicmlnaHRuZXNzKSk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlpZiAoYnJpZ2h0bmVzcyA9PSAwKSB7CisJCXJldCA9IGFhdDI4NzBfYmxfZGlzYWJsZShhYXQyODcwX2JsKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0gZWxzZSBpZiAoYWF0Mjg3MF9ibC0+YnJpZ2h0bmVzcyA9PSAwKSB7CisJCXJldCA9IGFhdDI4NzBfYmxfZW5hYmxlKGFhdDI4NzBfYmwpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJYWF0Mjg3MF9ibC0+YnJpZ2h0bmVzcyA9IGJyaWdodG5lc3M7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYXQyODcwX2JsX2NoZWNrX2ZiKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCwgc3RydWN0IGZiX2luZm8gKmZpKQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGJhY2tsaWdodF9vcHMgYWF0Mjg3MF9ibF9vcHMgPSB7CisJLm9wdGlvbnMgPSBCTF9DT1JFX1NVU1BFTkRSRVNVTUUsCisJLmdldF9icmlnaHRuZXNzID0gYWF0Mjg3MF9ibF9nZXRfYnJpZ2h0bmVzcywKKwkudXBkYXRlX3N0YXR1cyA9IGFhdDI4NzBfYmxfdXBkYXRlX3N0YXR1cywKKwkuY2hlY2tfZmIgPSBhYXQyODcwX2JsX2NoZWNrX2ZiLAorfTsKKworc3RhdGljIGludCBhYXQyODcwX2JsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGFhdDI4NzBfYmxfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgYWF0Mjg3MF9ibF9kcml2ZXJfZGF0YSAqYWF0Mjg3MF9ibDsKKwlzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQ7CisJc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzIHByb3BzOworCWludCByZXQgPSAwOworCisJaWYgKCFwZGF0YSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJObyBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocGRldi0+aWQgIT0gQUFUMjg3MF9JRF9CTCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJJbnZhbGlkIGRldmljZSBJRCwgJWRcbiIsIHBkZXYtPmlkKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJYWF0Mjg3MF9ibCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhYXQyODcwX2JsX2RyaXZlcl9kYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFhYXQyODcwX2JsKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCSJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBhYXQyODcwIGJhY2tsaWdodFxuIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCW1lbXNldCgmcHJvcHMsIDAsIHNpemVvZihzdHJ1Y3QgYmFja2xpZ2h0X3Byb3BlcnRpZXMpKTsKKworCXByb3BzLnR5cGUgPSBCQUNLTElHSFRfUkFXOworCWJkID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcigiYWF0Mjg3MC1iYWNrbGlnaHQiLCAmcGRldi0+ZGV2LAorCQkJCSAgICAgICBhYXQyODcwX2JsLCAmYWF0Mjg3MF9ibF9vcHMsICZwcm9wcyk7CisJaWYgKElTX0VSUihiZCkpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJIkZhaWxlZCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGJhY2tsaWdodCBkZXZpY2VcbiIpOworCQlyZXQgPSBQVFJfRVJSKGJkKTsKKwkJZ290byBvdXRfa2ZyZWU7CisJfQorCisJYWF0Mjg3MF9ibC0+cGRldiA9IHBkZXY7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgYWF0Mjg3MF9ibCk7CisKKwlhYXQyODcwX2JsLT5iZCA9IGJkOworCisJaWYgKHBkYXRhLT5jaGFubmVscyA+IDApCisJCWFhdDI4NzBfYmwtPmNoYW5uZWxzID0gcGRhdGEtPmNoYW5uZWxzOworCWVsc2UKKwkJYWF0Mjg3MF9ibC0+Y2hhbm5lbHMgPSBBQVQyODcwX0JMX0NIX0FMTDsKKworCWlmIChwZGF0YS0+bWF4X2N1cnJlbnQgPiAwKQorCQlhYXQyODcwX2JsLT5tYXhfY3VycmVudCA9IHBkYXRhLT5tYXhfY3VycmVudDsKKwllbHNlCisJCWFhdDI4NzBfYmwtPm1heF9jdXJyZW50ID0gQUFUMjg3MF9DVVJSRU5UXzI3Xzk7CisKKwlpZiAocGRhdGEtPm1heF9icmlnaHRuZXNzID4gMCkKKwkJYmQtPnByb3BzLm1heF9icmlnaHRuZXNzID0gcGRhdGEtPm1heF9icmlnaHRuZXNzOworCWVsc2UKKwkJYmQtPnByb3BzLm1heF9icmlnaHRuZXNzID0gMjU1OworCisJYWF0Mjg3MF9ibC0+YnJpZ2h0bmVzcyA9IDA7CisJYmQtPnByb3BzLnBvd2VyID0gRkJfQkxBTktfVU5CTEFOSzsKKwliZC0+cHJvcHMuYnJpZ2h0bmVzcyA9IGJkLT5wcm9wcy5tYXhfYnJpZ2h0bmVzczsKKworCXJldCA9IGFhdDI4NzBfYmxfdXBkYXRlX3N0YXR1cyhiZCk7CisJaWYgKHJldCA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGluaXRpYWxpemVcbiIpOworCQlnb3RvIG91dF9ibF9kZXZfdW5yZWdpc3RlcjsKKwl9CisKKwlyZXR1cm4gMDsKKworb3V0X2JsX2Rldl91bnJlZ2lzdGVyOgorCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihiZCk7CitvdXRfa2ZyZWU6CisJa2ZyZWUoYWF0Mjg3MF9ibCk7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhYXQyODcwX2JsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhYXQyODcwX2JsX2RyaXZlcl9kYXRhICphYXQyODcwX2JsID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkID0gYWF0Mjg3MF9ibC0+YmQ7CisKKwliZC0+cHJvcHMucG93ZXIgPSBGQl9CTEFOS19QT1dFUkRPV047CisJYmQtPnByb3BzLmJyaWdodG5lc3MgPSAwOworCWJhY2tsaWdodF91cGRhdGVfc3RhdHVzKGJkKTsKKworCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihiZCk7CisJa2ZyZWUoYWF0Mjg3MF9ibCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYWF0Mjg3MF9ibF9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJPSAiYWF0Mjg3MC1iYWNrbGlnaHQiLAorCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkJPSBhYXQyODcwX2JsX3Byb2JlLAorCS5yZW1vdmUJCT0gYWF0Mjg3MF9ibF9yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhYXQyODcwX2JsX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhYXQyODcwX2JsX2RyaXZlcik7Cit9CitzdWJzeXNfaW5pdGNhbGwoYWF0Mjg3MF9ibF9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IGFhdDI4NzBfYmxfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZhYXQyODcwX2JsX2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChhYXQyODcwX2JsX2V4aXQpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFuYWxvZ2ljVGVjaCBBQVQyODcwIEJhY2tsaWdodCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiSmluIFBhcmsgPGppbnlvdW5ncEBudmlkaWEuY29tPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9wYW5lbC10YWFsLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rpc3BsYXlzL3BhbmVsLXRhYWwuYwppbmRleCBmZGQ1ZDRhZS4uNGU4ODhhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9wYW5lbC10YWFsLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kaXNwbGF5cy9wYW5lbC10YWFsLmMKQEAgLTUwNCwxNCArNTA0LDE4IEBACiAJCXJldHVybiAwOwogCiAJciA9IG9tYXBkc3NfZHNpX2Rpc3BsYXlfZW5hYmxlKGRzc2Rldik7Ci0JaWYgKHIpCi0JCWdvdG8gZXJyOworCWlmIChyKSB7CisJCWRldl9lcnIoJmRzc2Rldi0+ZGV2LCAiZmFpbGVkIHRvIGVuYWJsZSBEU0lcbiIpOworCQlnb3RvIGVycjE7CisJfQogCiAJb21hcGRzc19kc2lfdmNfZW5hYmxlX2hzKGRzc2RldiwgdGQtPmNoYW5uZWwsIHRydWUpOwogCiAJciA9IF90YWFsX2VuYWJsZV90ZShkc3NkZXYsIHRydWUpOwotCWlmIChyKQotCQlnb3RvIGVycjsKKwlpZiAocikgeworCQlkZXZfZXJyKCZkc3NkZXYtPmRldiwgImZhaWxlZCB0byByZS1lbmFibGUgVEUiKTsKKwkJZ290byBlcnIyOworCX0KIAogCWVuYWJsZV9pcnEoZ3Bpb190b19pcnEocGFuZWxfZGF0YS0+ZXh0X3RlX2dwaW8pKTsKIApAQCAtNTIxLDEzICs1MjUsMTUgQEAKIAogCXJldHVybiAwOwogCi1lcnI6Ci0JZGV2X2VycigmZHNzZGV2LT5kZXYsICJleGl0IFVMUFMgZmFpbGVkIik7CitlcnIyOgorCWRldl9lcnIoJmRzc2Rldi0+ZGV2LCAiZmFpbGVkIHRvIGV4aXQgVUxQUyIpOworCiAJciA9IHRhYWxfcGFuZWxfcmVzZXQoZHNzZGV2KTsKLQotCWVuYWJsZV9pcnEoZ3Bpb190b19pcnEocGFuZWxfZGF0YS0+ZXh0X3RlX2dwaW8pKTsKLQl0ZC0+dWxwc19lbmFibGVkID0gZmFsc2U7Ci0KKwlpZiAoIXIpIHsKKwkJZW5hYmxlX2lycShncGlvX3RvX2lycShwYW5lbF9kYXRhLT5leHRfdGVfZ3BpbykpOworCQl0ZC0+dWxwc19lbmFibGVkID0gZmFsc2U7CisJfQorZXJyMToKIAl0YWFsX3F1ZXVlX3VscHNfd29yayhkc3NkZXYpOwogCiAJcmV0dXJuIHI7CkBAIC0xMjQxLDExICsxMjQ3LDggQEAKIAlpbnQgcjsKIAogCXIgPSB0YWFsX2Rjc193cml0ZV8wKHRkLCBEQ1NfRElTUExBWV9PRkYpOwotCWlmICghcikgeworCWlmICghcikKIAkJciA9IHRhYWxfc2xlZXBfaW4odGQpOwotCQkvKiBIQUNLOiB3YWl0IGEgYml0IHNvIHRoYXQgdGhlIG1lc3NhZ2UgZ29lcyB0aHJvdWdoICovCi0JCW1zbGVlcCgxMCk7Ci0JfQogCiAJaWYgKHIpIHsKIAkJZGV2X2VycigmZHNzZGV2LT5kZXYsCkBAIC0xMzE3LDggKzEzMjAsMTEgQEAKIAlkc2lfYnVzX2xvY2soZHNzZGV2KTsKIAogCWlmIChkc3NkZXYtPnN0YXRlID09IE9NQVBfRFNTX0RJU1BMQVlfQUNUSVZFKSB7Ci0JCXRhYWxfd2FrZV91cChkc3NkZXYpOwotCQl0YWFsX3Bvd2VyX29mZihkc3NkZXYpOworCQlpbnQgcjsKKworCQlyID0gdGFhbF93YWtlX3VwKGRzc2Rldik7CisJCWlmICghcikKKwkJCXRhYWxfcG93ZXJfb2ZmKGRzc2Rldik7CiAJfQogCiAJZHNpX2J1c191bmxvY2soZHNzZGV2KTsKQEAgLTE4OTcsMjAgKzE5MDMsNiBAQAogCW11dGV4X3VubG9jaygmdGQtPmxvY2spOwogfQogCi1zdGF0aWMgaW50IHRhYWxfc2V0X3VwZGF0ZV9tb2RlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKLQkJZW51bSBvbWFwX2Rzc191cGRhdGVfbW9kZSBtb2RlKQotewotCWlmIChtb2RlICE9IE9NQVBfRFNTX1VQREFURV9NQU5VQUwpCi0JCXJldHVybiAtRUlOVkFMOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgZW51bSBvbWFwX2Rzc191cGRhdGVfbW9kZSB0YWFsX2dldF91cGRhdGVfbW9kZSgKLQkJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQotewotCXJldHVybiBPTUFQX0RTU19VUERBVEVfTUFOVUFMOwotfQotCiBzdGF0aWMgc3RydWN0IG9tYXBfZHNzX2RyaXZlciB0YWFsX2RyaXZlciA9IHsKIAkucHJvYmUJCT0gdGFhbF9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZXhpdF9wKHRhYWxfcmVtb3ZlKSwKQEAgLTE5MjAsOSArMTkxMiw2IEBACiAJLnN1c3BlbmQJPSB0YWFsX3N1c3BlbmQsCiAJLnJlc3VtZQkJPSB0YWFsX3Jlc3VtZSwKIAotCS5zZXRfdXBkYXRlX21vZGUgPSB0YWFsX3NldF91cGRhdGVfbW9kZSwKLQkuZ2V0X3VwZGF0ZV9tb2RlID0gdGFhbF9nZXRfdXBkYXRlX21vZGUsCi0KIAkudXBkYXRlCQk9IHRhYWxfdXBkYXRlLAogCS5zeW5jCQk9IHRhYWxfc3luYywKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvS2NvbmZpZyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL0tjb25maWcKaW5kZXggNmIzZTJkYS4uMGQxMjUyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvS2NvbmZpZworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9LY29uZmlnCkBAIC0xMTcsMTggKzExNyw2IEBACiAJICBNYXggRkNLIGlzIDE3M01Ieiwgc28gdGhpcyBkb2Vzbid0IHdvcmsgaWYgeW91ciBQQ0sKIAkgIGlzIHZlcnkgaGlnaC4KIAotY29uZmlnIE9NQVAyX0RTU19TTEVFUF9CRUZPUkVfUkVTRVQKLQlib29sICJTbGVlcCA1MG1zIGJlZm9yZSBEU1MgcmVzZXQiCi0JZGVmYXVsdCB5Ci0JaGVscAotCSAgRm9yIHNvbWUgdW5rbm93biByZWFzb24gd2UgbWF5IGdldCBTWU5DX0xPU1QgZXJyb3JzIGZyb20gdGhlIGRpc3BsYXkKLQkgIHN1YnN5c3RlbSBhdCBpbml0aWFsaXphdGlvbiB0aW1lIGlmIHdlIGRvbid0IHNsZWVwIGJlZm9yZSByZXNldHRpbmcKLQkgIHRoZSBEU1MuIFNlZSB0aGUgc291cmNlIChkc3MuYykgZm9yIG1vcmUgY29tbWVudHMuCi0KLQkgIEhvd2V2ZXIsIDUwbXMgaXMgcXVpdGUgbG9uZyB0aW1lIHRvIHNsZWVwLCBhbmQgd2l0aCBzb21lCi0JICBjb25maWd1cmF0aW9ucyB0aGUgU1lOQ19MT1NUIG1heSBuZXZlciBoYXBwZW4sIHNvIHRoZSBzbGVlcCBjYW4KLQkgIGJlIGRpc2FibGVkIGhlcmUuCi0KIGNvbmZpZyBPTUFQMl9EU1NfU0xFRVBfQUZURVJfVkVOQ19SRVNFVAogCWJvb2wgIlNsZWVwIDIwbXMgYWZ0ZXIgVkVOQyByZXNldCIKIAlkZWZhdWx0IHkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2NvcmUuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2NvcmUuYwppbmRleCAzZGE0MjY3Li43NjgyMWZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9jb3JlLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvY29yZS5jCkBAIC0xODMsOCArMTgzLDExIEBACiAJCWdvdG8gZXJyX2RzczsKIAl9CiAKLQkvKiBrZWVwIGNsb2NrcyBlbmFibGVkIHRvIHByZXZlbnQgY29udGV4dCBzYXZlcy9yZXN0b3JlcyBkdXJpbmcgaW5pdCAqLwotCWRzc19jbGtfZW5hYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0spOworCXIgPSBkaXNwY19pbml0X3BsYXRmb3JtX2RyaXZlcigpOworCWlmIChyKSB7CisJCURTU0VSUigiRmFpbGVkIHRvIGluaXRpYWxpemUgZGlzcGMgcGxhdGZvcm0gZHJpdmVyXG4iKTsKKwkJZ290byBlcnJfZGlzcGM7CisJfQogCiAJciA9IHJmYmlfaW5pdF9wbGF0Zm9ybV9kcml2ZXIoKTsKIAlpZiAocikgewpAQCAtMTkyLDEyICsxOTUsNiBAQAogCQlnb3RvIGVycl9yZmJpOwogCX0KIAotCXIgPSBkaXNwY19pbml0X3BsYXRmb3JtX2RyaXZlcigpOwotCWlmIChyKSB7Ci0JCURTU0VSUigiRmFpbGVkIHRvIGluaXRpYWxpemUgZGlzcGMgcGxhdGZvcm0gZHJpdmVyXG4iKTsKLQkJZ290byBlcnJfZGlzcGM7Ci0JfQotCiAJciA9IHZlbmNfaW5pdF9wbGF0Zm9ybV9kcml2ZXIoKTsKIAlpZiAocikgewogCQlEU1NFUlIoIkZhaWxlZCB0byBpbml0aWFsaXplIHZlbmMgcGxhdGZvcm0gZHJpdmVyXG4iKTsKQEAgLTIzOCw4ICsyMzUsNiBAQAogCQkJcGRhdGEtPmRlZmF1bHRfZGV2aWNlID0gZHNzZGV2OwogCX0KIAotCWRzc19jbGtfZGlzYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLKTsKLQogCXJldHVybiAwOwogCiBlcnJfcmVnaXN0ZXI6CkBAIC0yNjgsMTEgKzI2MywxMSBAQAogCiAJZHNzX3VuaW5pdGlhbGl6ZV9kZWJ1Z2ZzKCk7CiAKLQl2ZW5jX3VuaW5pdF9wbGF0Zm9ybV9kcml2ZXIoKTsKLQlkaXNwY191bmluaXRfcGxhdGZvcm1fZHJpdmVyKCk7Ci0JcmZiaV91bmluaXRfcGxhdGZvcm1fZHJpdmVyKCk7Ci0JZHNpX3VuaW5pdF9wbGF0Zm9ybV9kcml2ZXIoKTsKIAloZG1pX3VuaW5pdF9wbGF0Zm9ybV9kcml2ZXIoKTsKKwlkc2lfdW5pbml0X3BsYXRmb3JtX2RyaXZlcigpOworCXZlbmNfdW5pbml0X3BsYXRmb3JtX2RyaXZlcigpOworCXJmYmlfdW5pbml0X3BsYXRmb3JtX2RyaXZlcigpOworCWRpc3BjX3VuaW5pdF9wbGF0Zm9ybV9kcml2ZXIoKTsKIAlkc3NfdW5pbml0X3BsYXRmb3JtX2RyaXZlcigpOwogCiAJZHNzX3VuaW5pdF9vdmVybGF5cyhwZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rpc3BjLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kaXNwYy5jCmluZGV4IDdhOWEyZTcuLjBmMzk2MWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rpc3BjLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZGlzcGMuYwpAQCAtMzMsNiArMzMsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAKICNpbmNsdWRlIDxwbGF0L3NyYW0uaD4KICNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CkBAIC03Nyw2ICs3OSwxMiBAQAogCXM4IHZjMDA7CiB9OwogCitlbnVtIG9tYXBfYnVyc3Rfc2l6ZSB7CisJQlVSU1RfU0laRV9YMiA9IDAsCisJQlVSU1RfU0laRV9YNCA9IDEsCisJQlVSU1RfU0laRV9YOCA9IDIsCit9OworCiAjZGVmaW5lIFJFR19HRVQoaWR4LCBzdGFydCwgZW5kKSBcCiAJRkxEX0dFVChkaXNwY19yZWFkX3JlZyhpZHgpLCBzdGFydCwgZW5kKQogCkBAIC05Miw3ICsxMDAsMTEgQEAKIHN0YXRpYyBzdHJ1Y3QgewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAJdm9pZCBfX2lvbWVtICAgICpiYXNlOworCisJaW50CQljdHhfbG9zc19jbnQ7CisKIAlpbnQgaXJxOworCXN0cnVjdCBjbGsgKmRzc19jbGs7CiAKIAl1MzIJZmlmb19zaXplWzNdOwogCkBAIC0xMDIsNiArMTE0LDcgQEAKIAl1MzIgZXJyb3JfaXJxczsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgZXJyb3Jfd29yazsKIAorCWJvb2wJCWN0eF92YWxpZDsKIAl1MzIJCWN0eFtESVNQQ19TWl9SRUdTIC8gc2l6ZW9mKHUzMildOwogCiAjaWZkZWYgQ09ORklHX09NQVAyX0RTU19DT0xMRUNUX0lSUV9TVEFUUwpAQCAtMTM0LDE4ICsxNDcsMzQgQEAKIAlyZXR1cm4gX19yYXdfcmVhZGwoZGlzcGMuYmFzZSArIGlkeCk7CiB9CiAKK3N0YXRpYyBpbnQgZGlzcGNfZ2V0X2N0eF9sb3NzX2NvdW50KHZvaWQpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmRpc3BjLnBkZXYtPmRldjsKKwlzdHJ1Y3Qgb21hcF9kaXNwbGF5X3BsYXRmb3JtX2RhdGEgKnBkYXRhID0gZGV2LT5wbGF0Zm9ybV9kYXRhOworCXN0cnVjdCBvbWFwX2Rzc19ib2FyZF9pbmZvICpib2FyZF9kYXRhID0gcGRhdGEtPmJvYXJkX2RhdGE7CisJaW50IGNudDsKKworCWlmICghYm9hcmRfZGF0YS0+Z2V0X2NvbnRleHRfbG9zc19jb3VudCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwljbnQgPSBib2FyZF9kYXRhLT5nZXRfY29udGV4dF9sb3NzX2NvdW50KGRldik7CisKKwlXQVJOX09OQ0UoY250IDwgMCwgImdldF9jb250ZXh0X2xvc3NfY291bnQgZmFpbGVkOiAlZFxuIiwgY250KTsKKworCXJldHVybiBjbnQ7Cit9CisKICNkZWZpbmUgU1IocmVnKSBcCiAJZGlzcGMuY3R4W0RJU1BDXyMjcmVnIC8gc2l6ZW9mKHUzMildID0gZGlzcGNfcmVhZF9yZWcoRElTUENfIyNyZWcpCiAjZGVmaW5lIFJSKHJlZykgXAogCWRpc3BjX3dyaXRlX3JlZyhESVNQQ18jI3JlZywgZGlzcGMuY3R4W0RJU1BDXyMjcmVnIC8gc2l6ZW9mKHUzMildKQogCi12b2lkIGRpc3BjX3NhdmVfY29udGV4dCh2b2lkKQorc3RhdGljIHZvaWQgZGlzcGNfc2F2ZV9jb250ZXh0KHZvaWQpCiB7CiAJaW50IGk7Ci0JaWYgKGNwdV9pc19vbWFwMjR4eCgpKQotCQlyZXR1cm47CiAKLQlTUihTWVNDT05GSUcpOworCURTU0RCRygiZGlzcGNfc2F2ZV9jb250ZXh0XG4iKTsKKwogCVNSKElSUUVOQUJMRSk7CiAJU1IoQ09OVFJPTCk7CiAJU1IoQ09ORklHKTsKQEAgLTE1OCw3ICsxODcsOCBAQAogCVNSKFRJTUlOR19WKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7CiAJU1IoUE9MX0ZSRVEoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKIAlTUihESVZJU09SbyhPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwotCVNSKEdMT0JBTF9BTFBIQSk7CisJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0dMT0JBTF9BTFBIQSkpCisJCVNSKEdMT0JBTF9BTFBIQSk7CiAJU1IoU0laRV9NR1IoT01BUF9EU1NfQ0hBTk5FTF9ESUdJVCkpOwogCVNSKFNJWkVfTUdSKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7CiAJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX01HUl9MQ0QyKSkgewpAQCAtMTg4LDIwICsyMTgsMjUgQEAKIAlTUihEQVRBX0NZQ0xFMihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwogCVNSKERBVEFfQ1lDTEUzKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7CiAKLQlTUihDUFJfQ09FRl9SKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JU1IoQ1BSX0NPRUZfRyhPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwotCVNSKENQUl9DT0VGX0IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKKwlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfQ1BSKSkgeworCQlTUihDUFJfQ09FRl9SKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7CisJCVNSKENQUl9DT0VGX0coT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKKwkJU1IoQ1BSX0NPRUZfQihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOworCX0KIAlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfTUdSX0xDRDIpKSB7Ci0JCVNSKENQUl9DT0VGX0IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCVNSKENQUl9DT0VGX0coT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7Ci0JCVNSKENQUl9DT0VGX1IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7CisJCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9DUFIpKSB7CisJCQlTUihDUFJfQ09FRl9CKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOworCQkJU1IoQ1BSX0NPRUZfRyhPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKKwkJCVNSKENQUl9DT0VGX1IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7CisJCX0KIAogCQlTUihEQVRBX0NZQ0xFMShPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKIAkJU1IoREFUQV9DWUNMRTIoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7CiAJCVNSKERBVEFfQ1lDTEUzKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOwogCX0KIAotCVNSKE9WTF9QUkVMT0FEKE9NQVBfRFNTX0dGWCkpOworCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9QUkVMT0FEKSkKKwkJU1IoT1ZMX1BSRUxPQUQoT01BUF9EU1NfR0ZYKSk7CiAKIAkvKiBWSUQxICovCiAJU1IoT1ZMX0JBMChPTUFQX0RTU19WSURFTzEpKTsKQEAgLTIyNiw4ICsyNjEsMTAgQEAKIAlmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQogCQlTUihPVkxfQ09OVl9DT0VGKE9NQVBfRFNTX1ZJREVPMSwgaSkpOwogCi0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykKLQkJU1IoT1ZMX0ZJUl9DT0VGX1YoT01BUF9EU1NfVklERU8xLCBpKSk7CisJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0ZJUl9DT0VGX1YpKSB7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQlTUihPVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzEsIGkpKTsKKwl9CiAKIAlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfSEFORExFX1VWX1NFUEFSQVRFKSkgewogCQlTUihPVkxfQkEwX1VWKE9NQVBfRFNTX1ZJREVPMSkpOwpAQCAtMjQ4LDcgKzI4NSw4IEBACiAJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0FUVFIyKSkKIAkJU1IoT1ZMX0FUVFJJQlVURVMyKE9NQVBfRFNTX1ZJREVPMSkpOwogCi0JU1IoT1ZMX1BSRUxPQUQoT01BUF9EU1NfVklERU8xKSk7CisJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX1BSRUxPQUQpKQorCQlTUihPVkxfUFJFTE9BRChPTUFQX0RTU19WSURFTzEpKTsKIAogCS8qIFZJRDIgKi8KIAlTUihPVkxfQkEwKE9NQVBfRFNTX1ZJREVPMikpOwpAQCAtMjczLDggKzMxMSwxMCBAQAogCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCiAJCVNSKE9WTF9DT05WX0NPRUYoT01BUF9EU1NfVklERU8yLCBpKSk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQlTUihPVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIGkpKTsKKwlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfRklSX0NPRUZfVikpIHsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCVNSKE9WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMiwgaSkpOworCX0KIAogCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9IQU5ETEVfVVZfU0VQQVJBVEUpKSB7CiAJCVNSKE9WTF9CQTBfVVYoT01BUF9EU1NfVklERU8yKSk7CkBAIC0yOTUsMTYgKzMzNSwzNSBAQAogCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9BVFRSMikpCiAJCVNSKE9WTF9BVFRSSUJVVEVTMihPTUFQX0RTU19WSURFTzIpKTsKIAotCVNSKE9WTF9QUkVMT0FEKE9NQVBfRFNTX1ZJREVPMikpOworCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9QUkVMT0FEKSkKKwkJU1IoT1ZMX1BSRUxPQUQoT01BUF9EU1NfVklERU8yKSk7CiAKIAlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfQ09SRV9DTEtfRElWKSkKIAkJU1IoRElWSVNPUik7CisKKwlkaXNwYy5jdHhfbG9zc19jbnQgPSBkaXNwY19nZXRfY3R4X2xvc3NfY291bnQoKTsKKwlkaXNwYy5jdHhfdmFsaWQgPSB0cnVlOworCisJRFNTREJHKCJjb250ZXh0IHNhdmVkLCBjdHhfbG9zc19jb3VudCAlZFxuIiwgZGlzcGMuY3R4X2xvc3NfY250KTsKIH0KIAotdm9pZCBkaXNwY19yZXN0b3JlX2NvbnRleHQodm9pZCkKK3N0YXRpYyB2b2lkIGRpc3BjX3Jlc3RvcmVfY29udGV4dCh2b2lkKQogewotCWludCBpOwotCVJSKFNZU0NPTkZJRyk7CisJaW50IGksIGN0eDsKKworCURTU0RCRygiZGlzcGNfcmVzdG9yZV9jb250ZXh0XG4iKTsKKworCWlmICghZGlzcGMuY3R4X3ZhbGlkKQorCQlyZXR1cm47CisKKwljdHggPSBkaXNwY19nZXRfY3R4X2xvc3NfY291bnQoKTsKKworCWlmIChjdHggPj0gMCAmJiBjdHggPT0gZGlzcGMuY3R4X2xvc3NfY250KQorCQlyZXR1cm47CisKKwlEU1NEQkcoImN0eF9sb3NzX2NvdW50OiBzYXZlZCAlZCwgY3VycmVudCAlZFxuIiwKKwkJCWRpc3BjLmN0eF9sb3NzX2NudCwgY3R4KTsKKwogCS8qUlIoSVJRRU5BQkxFKTsqLwogCS8qUlIoQ09OVFJPTCk7Ki8KIAlSUihDT05GSUcpOwpAQCAtMzE3LDcgKzM3Niw4IEBACiAJUlIoVElNSU5HX1YoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKIAlSUihQT0xfRlJFUShPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwogCVJSKERJVklTT1JvKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JUlIoR0xPQkFMX0FMUEhBKTsKKwlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfR0xPQkFMX0FMUEhBKSkKKwkJUlIoR0xPQkFMX0FMUEhBKTsKIAlSUihTSVpFX01HUihPTUFQX0RTU19DSEFOTkVMX0RJR0lUKSk7CiAJUlIoU0laRV9NR1IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKIAlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfTUdSX0xDRDIpKSB7CkBAIC0zNDcsMjAgKzQwNywyNSBAQAogCVJSKERBVEFfQ1lDTEUyKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7CiAJUlIoREFUQV9DWUNMRTMoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKIAotCVJSKENQUl9DT0VGX1IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKLQlSUihDUFJfQ09FRl9HKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JUlIoQ1BSX0NPRUZfQihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOworCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9DUFIpKSB7CisJCVJSKENQUl9DT0VGX1IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKKwkJUlIoQ1BSX0NPRUZfRyhPTUFQX0RTU19DSEFOTkVMX0xDRCkpOworCQlSUihDUFJfQ09FRl9CKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7CisJfQogCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9NR1JfTENEMikpIHsKIAkJUlIoREFUQV9DWUNMRTEoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7CiAJCVJSKERBVEFfQ1lDTEUyKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOwogCQlSUihEQVRBX0NZQ0xFMyhPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKIAotCQlSUihDUFJfQ09FRl9CKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOwotCQlSUihDUFJfQ09FRl9HKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOwotCQlSUihDUFJfQ09FRl9SKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOworCQlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfQ1BSKSkgeworCQkJUlIoQ1BSX0NPRUZfQihPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKKwkJCVJSKENQUl9DT0VGX0coT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7CisJCQlSUihDUFJfQ09FRl9SKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOworCQl9CiAJfQogCi0JUlIoT1ZMX1BSRUxPQUQoT01BUF9EU1NfR0ZYKSk7CisJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX1BSRUxPQUQpKQorCQlSUihPVkxfUFJFTE9BRChPTUFQX0RTU19HRlgpKTsKIAogCS8qIFZJRDEgKi8KIAlSUihPVkxfQkEwKE9NQVBfRFNTX1ZJREVPMSkpOwpAQCAtMzg1LDggKzQ1MCwxMCBAQAogCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCiAJCVJSKE9WTF9DT05WX0NPRUYoT01BUF9EU1NfVklERU8xLCBpKSk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQlSUihPVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzEsIGkpKTsKKwlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfRklSX0NPRUZfVikpIHsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCVJSKE9WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgaSkpOworCX0KIAogCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9IQU5ETEVfVVZfU0VQQVJBVEUpKSB7CiAJCVJSKE9WTF9CQTBfVVYoT01BUF9EU1NfVklERU8xKSk7CkBAIC00MDcsNyArNDc0LDggQEAKIAlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfQVRUUjIpKQogCQlSUihPVkxfQVRUUklCVVRFUzIoT01BUF9EU1NfVklERU8xKSk7CiAKLQlSUihPVkxfUFJFTE9BRChPTUFQX0RTU19WSURFTzEpKTsKKwlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfUFJFTE9BRCkpCisJCVJSKE9WTF9QUkVMT0FEKE9NQVBfRFNTX1ZJREVPMSkpOwogCiAJLyogVklEMiAqLwogCVJSKE9WTF9CQTAoT01BUF9EU1NfVklERU8yKSk7CkBAIC00MzIsOCArNTAwLDEwIEBACiAJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKIAkJUlIoT1ZMX0NPTlZfQ09FRihPTUFQX0RTU19WSURFTzIsIGkpKTsKIAotCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCi0JCVJSKE9WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMiwgaSkpOworCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9GSVJfQ09FRl9WKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQorCQkJUlIoT1ZMX0ZJUl9DT0VGX1YoT01BUF9EU1NfVklERU8yLCBpKSk7CisJfQogCiAJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0hBTkRMRV9VVl9TRVBBUkFURSkpIHsKIAkJUlIoT1ZMX0JBMF9VVihPTUFQX0RTU19WSURFTzIpKTsKQEAgLTQ1NCw3ICs1MjQsOCBAQAogCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9BVFRSMikpCiAJCVJSKE9WTF9BVFRSSUJVVEVTMihPTUFQX0RTU19WSURFTzIpKTsKIAotCVJSKE9WTF9QUkVMT0FEKE9NQVBfRFNTX1ZJREVPMikpOworCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9QUkVMT0FEKSkKKwkJUlIoT1ZMX1BSRUxPQUQoT01BUF9EU1NfVklERU8yKSk7CiAKIAlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfQ09SRV9DTEtfRElWKSkKIAkJUlIoRElWSVNPUik7CkBAIC00NzEsMTkgKzU0MiwzNSBAQAogCSAqIHRoZSBjb250ZXh0IGlzIGZ1bGx5IHJlc3RvcmVkCiAJICovCiAJUlIoSVJRRU5BQkxFKTsKKworCURTU0RCRygiY29udGV4dCByZXN0b3JlZFxuIik7CiB9CiAKICN1bmRlZiBTUgogI3VuZGVmIFJSCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfY2xvY2tzKGJvb2wgZW5hYmxlKQoraW50IGRpc3BjX3J1bnRpbWVfZ2V0KHZvaWQpCiB7Ci0JaWYgKGVuYWJsZSkKLQkJZHNzX2Nsa19lbmFibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSyk7Ci0JZWxzZQotCQlkc3NfY2xrX2Rpc2FibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSyk7CisJaW50IHI7CisKKwlEU1NEQkcoImRpc3BjX3J1bnRpbWVfZ2V0XG4iKTsKKworCXIgPSBwbV9ydW50aW1lX2dldF9zeW5jKCZkaXNwYy5wZGV2LT5kZXYpOworCVdBUk5fT04ociA8IDApOworCXJldHVybiByIDwgMCA/IHIgOiAwOwogfQogCit2b2lkIGRpc3BjX3J1bnRpbWVfcHV0KHZvaWQpCit7CisJaW50IHI7CisKKwlEU1NEQkcoImRpc3BjX3J1bnRpbWVfcHV0XG4iKTsKKworCXIgPSBwbV9ydW50aW1lX3B1dCgmZGlzcGMucGRldi0+ZGV2KTsKKwlXQVJOX09OKHIgPCAwKTsKK30KKworCiBib29sIGRpc3BjX2dvX2J1c3koZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCkKIHsKIAlpbnQgYml0OwpAQCAtNTA1LDggKzU5Miw2IEBACiAJaW50IGJpdDsKIAlib29sIGVuYWJsZV9iaXQsIGdvX2JpdDsKIAotCWVuYWJsZV9jbG9ja3MoMSk7Ci0KIAlpZiAoY2hhbm5lbCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRCB8fAogCQkJY2hhbm5lbCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRDIpCiAJCWJpdCA9IDA7IC8qIExDREVOQUJMRSAqLwpAQCAtNTIwLDcgKzYwNSw3IEBACiAJCWVuYWJsZV9iaXQgPSBSRUdfR0VUKERJU1BDX0NPTlRST0wsIGJpdCwgYml0KSA9PSAxOwogCiAJaWYgKCFlbmFibGVfYml0KQotCQlnb3RvIGVuZDsKKwkJcmV0dXJuOwogCiAJaWYgKGNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QgfHwKIAkJCWNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKQpAQCAtNTM1LDcgKzYyMCw3IEBACiAKIAlpZiAoZ29fYml0KSB7CiAJCURTU0VSUigiR08gYml0IG5vdCBkb3duIGZvciBjaGFubmVsICVkXG4iLCBjaGFubmVsKTsKLQkJZ290byBlbmQ7CisJCXJldHVybjsKIAl9CiAKIAlEU1NEQkcoIkdPICVzXG4iLCBjaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEID8gIkxDRCIgOgpAQCAtNTQ1LDggKzYzMCw2IEBACiAJCVJFR19GTERfTU9EKERJU1BDX0NPTlRST0wyLCAxLCBiaXQsIGJpdCk7CiAJZWxzZQogCQlSRUdfRkxEX01PRChESVNQQ19DT05UUk9MLCAxLCBiaXQsIGJpdCk7Ci1lbmQ6Ci0JZW5hYmxlX2Nsb2NrcygwKTsKIH0KIAogc3RhdGljIHZvaWQgX2Rpc3BjX3dyaXRlX2ZpcmhfcmVnKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgaW50IHJlZywgdTMyIHZhbHVlKQpAQCAtOTIwLDcgKzEwMDMsNyBAQAogCVJFR19GTERfTU9EKERJU1BDX09WTF9BVFRSSUJVVEVTKHBsYW5lKSwgbSwgNCwgMSk7CiB9CiAKLXN0YXRpYyB2b2lkIF9kaXNwY19zZXRfY2hhbm5lbF9vdXQoZW51bSBvbWFwX3BsYW5lIHBsYW5lLAordm9pZCBkaXNwY19zZXRfY2hhbm5lbF9vdXQoZW51bSBvbWFwX3BsYW5lIHBsYW5lLAogCQllbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsKQogewogCWludCBzaGlmdDsKQEAgLTk2NywxMyArMTA1MCwxMCBAQAogCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19PVkxfQVRUUklCVVRFUyhwbGFuZSksIHZhbCk7CiB9CiAKLXZvaWQgZGlzcGNfc2V0X2J1cnN0X3NpemUoZW51bSBvbWFwX3BsYW5lIHBsYW5lLAorc3RhdGljIHZvaWQgZGlzcGNfc2V0X2J1cnN0X3NpemUoZW51bSBvbWFwX3BsYW5lIHBsYW5lLAogCQllbnVtIG9tYXBfYnVyc3Rfc2l6ZSBidXJzdF9zaXplKQogewogCWludCBzaGlmdDsKLQl1MzIgdmFsOwotCi0JZW5hYmxlX2Nsb2NrcygxKTsKIAogCXN3aXRjaCAocGxhbmUpIHsKIAljYXNlIE9NQVBfRFNTX0dGWDoKQEAgLTk4OCwxMSArMTA2OCwyNCBAQAogCQlyZXR1cm47CiAJfQogCi0JdmFsID0gZGlzcGNfcmVhZF9yZWcoRElTUENfT1ZMX0FUVFJJQlVURVMocGxhbmUpKTsKLQl2YWwgPSBGTERfTU9EKHZhbCwgYnVyc3Rfc2l6ZSwgc2hpZnQrMSwgc2hpZnQpOwotCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19PVkxfQVRUUklCVVRFUyhwbGFuZSksIHZhbCk7CisJUkVHX0ZMRF9NT0QoRElTUENfT1ZMX0FUVFJJQlVURVMocGxhbmUpLCBidXJzdF9zaXplLCBzaGlmdCArIDEsIHNoaWZ0KTsKK30KIAotCWVuYWJsZV9jbG9ja3MoMCk7CitzdGF0aWMgdm9pZCBkaXNwY19jb25maWd1cmVfYnVyc3Rfc2l6ZXModm9pZCkKK3sKKwlpbnQgaTsKKwljb25zdCBpbnQgYnVyc3Rfc2l6ZSA9IEJVUlNUX1NJWkVfWDg7CisKKwkvKiBDb25maWd1cmUgYnVyc3Qgc2l6ZSBhbHdheXMgdG8gbWF4aW11bSBzaXplICovCisJZm9yIChpID0gMDsgaSA8IG9tYXBfZHNzX2dldF9udW1fb3ZlcmxheXMoKTsgKytpKQorCQlkaXNwY19zZXRfYnVyc3Rfc2l6ZShpLCBidXJzdF9zaXplKTsKK30KKwordTMyIGRpc3BjX2dldF9idXJzdF9zaXplKGVudW0gb21hcF9wbGFuZSBwbGFuZSkKK3sKKwl1bnNpZ25lZCB1bml0ID0gZHNzX2ZlYXRfZ2V0X2J1cnN0X3NpemVfdW5pdCgpOworCS8qIGJ1cnN0IG11bHRpcGxpZXIgaXMgYWx3YXlzIHg4IChzZWUgZGlzcGNfY29uZmlndXJlX2J1cnN0X3NpemVzKCkpICovCisJcmV0dXJuIHVuaXQgKiA4OwogfQogCiB2b2lkIGRpc3BjX2VuYWJsZV9nYW1tYV90YWJsZShib29sIGVuYWJsZSkKQEAgLTEwMDksNiArMTEwMiw0MCBAQAogCVJFR19GTERfTU9EKERJU1BDX0NPTkZJRywgZW5hYmxlLCA5LCA5KTsKIH0KIAordm9pZCBkaXNwY19lbmFibGVfY3ByKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIGJvb2wgZW5hYmxlKQoreworCXUxNiByZWc7CisKKwlpZiAoY2hhbm5lbCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRCkKKwkJcmVnID0gRElTUENfQ09ORklHOworCWVsc2UgaWYgKGNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKQorCQlyZWcgPSBESVNQQ19DT05GSUcyOworCWVsc2UKKwkJcmV0dXJuOworCisJUkVHX0ZMRF9NT0QocmVnLCBlbmFibGUsIDE1LCAxNSk7Cit9CisKK3ZvaWQgZGlzcGNfc2V0X2Nwcl9jb2VmKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCisJCXN0cnVjdCBvbWFwX2Rzc19jcHJfY29lZnMgKmNvZWZzKQoreworCXUzMiBjb2VmX3IsIGNvZWZfZywgY29lZl9iOworCisJaWYgKGNoYW5uZWwgIT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QgJiYgY2hhbm5lbCAhPSBPTUFQX0RTU19DSEFOTkVMX0xDRDIpCisJCXJldHVybjsKKworCWNvZWZfciA9IEZMRF9WQUwoY29lZnMtPnJyLCAzMSwgMjIpIHwgRkxEX1ZBTChjb2Vmcy0+cmcsIDIwLCAxMSkgfAorCQlGTERfVkFMKGNvZWZzLT5yYiwgOSwgMCk7CisJY29lZl9nID0gRkxEX1ZBTChjb2Vmcy0+Z3IsIDMxLCAyMikgfCBGTERfVkFMKGNvZWZzLT5nZywgMjAsIDExKSB8CisJCUZMRF9WQUwoY29lZnMtPmdiLCA5LCAwKTsKKwljb2VmX2IgPSBGTERfVkFMKGNvZWZzLT5iciwgMzEsIDIyKSB8IEZMRF9WQUwoY29lZnMtPmJnLCAyMCwgMTEpIHwKKwkJRkxEX1ZBTChjb2Vmcy0+YmIsIDksIDApOworCisJZGlzcGNfd3JpdGVfcmVnKERJU1BDX0NQUl9DT0VGX1IoY2hhbm5lbCksIGNvZWZfcik7CisJZGlzcGNfd3JpdGVfcmVnKERJU1BDX0NQUl9DT0VGX0coY2hhbm5lbCksIGNvZWZfZyk7CisJZGlzcGNfd3JpdGVfcmVnKERJU1BDX0NQUl9DT0VGX0IoY2hhbm5lbCksIGNvZWZfYik7Cit9CisKIHN0YXRpYyB2b2lkIF9kaXNwY19zZXRfdmlkX2NvbG9yX2NvbnYoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBib29sIGVuYWJsZSkKIHsKIAl1MzIgdmFsOwpAQCAtMTAyOSw5ICsxMTU2LDcgQEAKIAllbHNlCiAJCWJpdCA9IDEwOwogCi0JZW5hYmxlX2Nsb2NrcygxKTsKIAlSRUdfRkxEX01PRChESVNQQ19PVkxfQVRUUklCVVRFUyhwbGFuZSksIGVuYWJsZSwgYml0LCBiaXQpOwotCWVuYWJsZV9jbG9ja3MoMCk7CiB9CiAKIHZvaWQgZGlzcGNfc2V0X2xjZF9zaXplKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIHUxNiB3aWR0aCwgdTE2IGhlaWdodCkKQEAgLTEwMzksOSArMTE2NCw3IEBACiAJdTMyIHZhbDsKIAlCVUdfT04oKHdpZHRoID4gKDEgPDwgMTEpKSB8fCAoaGVpZ2h0ID4gKDEgPDwgMTEpKSk7CiAJdmFsID0gRkxEX1ZBTChoZWlnaHQgLSAxLCAyNiwgMTYpIHwgRkxEX1ZBTCh3aWR0aCAtIDEsIDEwLCAwKTsKLQllbmFibGVfY2xvY2tzKDEpOwogCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19TSVpFX01HUihjaGFubmVsKSwgdmFsKTsKLQllbmFibGVfY2xvY2tzKDApOwogfQogCiB2b2lkIGRpc3BjX3NldF9kaWdpdF9zaXplKHUxNiB3aWR0aCwgdTE2IGhlaWdodCkKQEAgLTEwNDksOSArMTE3Miw3IEBACiAJdTMyIHZhbDsKIAlCVUdfT04oKHdpZHRoID4gKDEgPDwgMTEpKSB8fCAoaGVpZ2h0ID4gKDEgPDwgMTEpKSk7CiAJdmFsID0gRkxEX1ZBTChoZWlnaHQgLSAxLCAyNiwgMTYpIHwgRkxEX1ZBTCh3aWR0aCAtIDEsIDEwLCAwKTsKLQllbmFibGVfY2xvY2tzKDEpOwogCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19TSVpFX01HUihPTUFQX0RTU19DSEFOTkVMX0RJR0lUKSwgdmFsKTsKLQllbmFibGVfY2xvY2tzKDApOwogfQogCiBzdGF0aWMgdm9pZCBkaXNwY19yZWFkX3BsYW5lX2ZpZm9fc2l6ZXModm9pZCkKQEAgLTEwNTksMTggKzExODAsMTcgQEAKIAl1MzIgc2l6ZTsKIAlpbnQgcGxhbmU7CiAJdTggc3RhcnQsIGVuZDsKKwl1MzIgdW5pdDsKIAotCWVuYWJsZV9jbG9ja3MoMSk7CisJdW5pdCA9IGRzc19mZWF0X2dldF9idWZmZXJfc2l6ZV91bml0KCk7CiAKIAlkc3NfZmVhdF9nZXRfcmVnX2ZpZWxkKEZFQVRfUkVHX0ZJRk9TSVpFLCAmc3RhcnQsICZlbmQpOwogCiAJZm9yIChwbGFuZSA9IDA7IHBsYW5lIDwgQVJSQVlfU0laRShkaXNwYy5maWZvX3NpemUpOyArK3BsYW5lKSB7Ci0JCXNpemUgPSBGTERfR0VUKGRpc3BjX3JlYWRfcmVnKERJU1BDX09WTF9GSUZPX1NJWkVfU1RBVFVTKHBsYW5lKSksCi0JCQlzdGFydCwgZW5kKTsKKwkJc2l6ZSA9IFJFR19HRVQoRElTUENfT1ZMX0ZJRk9fU0laRV9TVEFUVVMocGxhbmUpLCBzdGFydCwgZW5kKTsKKwkJc2l6ZSAqPSB1bml0OwogCQlkaXNwYy5maWZvX3NpemVbcGxhbmVdID0gc2l6ZTsKIAl9Ci0KLQllbmFibGVfY2xvY2tzKDApOwogfQogCiB1MzIgZGlzcGNfZ2V0X3BsYW5lX2ZpZm9fc2l6ZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUpCkBAIC0xMDc4LDE1ICsxMTk4LDIyIEBACiAJcmV0dXJuIGRpc3BjLmZpZm9fc2l6ZVtwbGFuZV07CiB9CiAKLXZvaWQgZGlzcGNfc2V0dXBfcGxhbmVfZmlmbyhlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIHUzMiBsb3csIHUzMiBoaWdoKQordm9pZCBkaXNwY19zZXRfZmlmb190aHJlc2hvbGQoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCB1MzIgbG93LCB1MzIgaGlnaCkKIHsKIAl1OCBoaV9zdGFydCwgaGlfZW5kLCBsb19zdGFydCwgbG9fZW5kOworCXUzMiB1bml0OworCisJdW5pdCA9IGRzc19mZWF0X2dldF9idWZmZXJfc2l6ZV91bml0KCk7CisKKwlXQVJOX09OKGxvdyAlIHVuaXQgIT0gMCk7CisJV0FSTl9PTihoaWdoICUgdW5pdCAhPSAwKTsKKworCWxvdyAvPSB1bml0OworCWhpZ2ggLz0gdW5pdDsKIAogCWRzc19mZWF0X2dldF9yZWdfZmllbGQoRkVBVF9SRUdfRklGT0hJR0hUSFJFU0hPTEQsICZoaV9zdGFydCwgJmhpX2VuZCk7CiAJZHNzX2ZlYXRfZ2V0X3JlZ19maWVsZChGRUFUX1JFR19GSUZPTE9XVEhSRVNIT0xELCAmbG9fc3RhcnQsICZsb19lbmQpOwogCi0JZW5hYmxlX2Nsb2NrcygxKTsKLQogCURTU0RCRygiZmlmbyglZCkgbG93L2hpZ2ggb2xkICV1LyV1LCBuZXcgJXUvJXVcbiIsCiAJCQlwbGFuZSwKIAkJCVJFR19HRVQoRElTUENfT1ZMX0ZJRk9fVEhSRVNIT0xEKHBsYW5lKSwKQEAgLTEwOTgsMTggKzEyMjUsMTIgQEAKIAlkaXNwY193cml0ZV9yZWcoRElTUENfT1ZMX0ZJRk9fVEhSRVNIT0xEKHBsYW5lKSwKIAkJCUZMRF9WQUwoaGlnaCwgaGlfc3RhcnQsIGhpX2VuZCkgfAogCQkJRkxEX1ZBTChsb3csIGxvX3N0YXJ0LCBsb19lbmQpKTsKLQotCWVuYWJsZV9jbG9ja3MoMCk7CiB9CiAKIHZvaWQgZGlzcGNfZW5hYmxlX2ZpZm9tZXJnZShib29sIGVuYWJsZSkKIHsKLQllbmFibGVfY2xvY2tzKDEpOwotCiAJRFNTREJHKCJGSUZPIG1lcmdlICVzXG4iLCBlbmFibGUgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKIAlSRUdfRkxEX01PRChESVNQQ19DT05GSUcsIGVuYWJsZSA/IDEgOiAwLCAxNCwgMTQpOwotCi0JZW5hYmxlX2Nsb2NrcygwKTsKIH0KIAogc3RhdGljIHZvaWQgX2Rpc3BjX3NldF9maXIoZW51bSBvbWFwX3BsYW5lIHBsYW5lLApAQCAtMTcyOSwxNCArMTg1MCw3IEBACiAJcmV0dXJuIGRpc3BjX3BjbGtfcmF0ZShjaGFubmVsKSAqIHZmICogaGY7CiB9CiAKLXZvaWQgZGlzcGNfc2V0X2NoYW5uZWxfb3V0KGVudW0gb21hcF9wbGFuZSBwbGFuZSwgZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbF9vdXQpCi17Ci0JZW5hYmxlX2Nsb2NrcygxKTsKLQlfZGlzcGNfc2V0X2NoYW5uZWxfb3V0KHBsYW5lLCBjaGFubmVsX291dCk7Ci0JZW5hYmxlX2Nsb2NrcygwKTsKLX0KLQotc3RhdGljIGludCBfZGlzcGNfc2V0dXBfcGxhbmUoZW51bSBvbWFwX3BsYW5lIHBsYW5lLAoraW50IGRpc3BjX3NldHVwX3BsYW5lKGVudW0gb21hcF9wbGFuZSBwbGFuZSwKIAkJdTMyIHBhZGRyLCB1MTYgc2NyZWVuX3dpZHRoLAogCQl1MTYgcG9zX3gsIHUxNiBwb3NfeSwKIAkJdTE2IHdpZHRoLCB1MTYgaGVpZ2h0LApAQCAtMTc0NCw3ICsxODU4LDcgQEAKIAkJZW51bSBvbWFwX2NvbG9yX21vZGUgY29sb3JfbW9kZSwKIAkJYm9vbCBpbGFjZSwKIAkJZW51bSBvbWFwX2Rzc19yb3RhdGlvbl90eXBlIHJvdGF0aW9uX3R5cGUsCi0JCXU4IHJvdGF0aW9uLCBpbnQgbWlycm9yLAorCQl1OCByb3RhdGlvbiwgYm9vbCBtaXJyb3IsCiAJCXU4IGdsb2JhbF9hbHBoYSwgdTggcHJlX211bHRfYWxwaGEsCiAJCWVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIHUzMiBwdXZfYWRkcikKIHsKQEAgLTE3NTgsNiArMTg3MiwxNCBAQAogCXUxNiBmcmFtZV9oZWlnaHQgPSBoZWlnaHQ7CiAJdW5zaWduZWQgaW50IGZpZWxkX29mZnNldCA9IDA7CiAKKwlEU1NEQkcoImRpc3BjX3NldHVwX3BsYW5lICVkLCBwYSAleCwgc3cgJWQsICVkLCVkLCAlZHglZCAtPiAiCisJICAgICAgICIlZHglZCwgaWxhY2UgJWQsIGNtb2RlICV4LCByb3QgJWQsIG1pciAlZCBjaGFuICVkXG4iLAorCSAgICAgICBwbGFuZSwgcGFkZHIsIHNjcmVlbl93aWR0aCwgcG9zX3gsIHBvc195LAorCSAgICAgICB3aWR0aCwgaGVpZ2h0LAorCSAgICAgICBvdXRfd2lkdGgsIG91dF9oZWlnaHQsCisJICAgICAgIGlsYWNlLCBjb2xvcl9tb2RlLAorCSAgICAgICByb3RhdGlvbiwgbWlycm9yLCBjaGFubmVsKTsKKwogCWlmIChwYWRkciA9PSAwKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMTkwMyw5ICsyMDI1LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIF9kaXNwY19lbmFibGVfcGxhbmUoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBib29sIGVuYWJsZSkKK2ludCBkaXNwY19lbmFibGVfcGxhbmUoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCBib29sIGVuYWJsZSkKIHsKKwlEU1NEQkcoImRpc3BjX2VuYWJsZV9wbGFuZSAlZCwgJWRcbiIsIHBsYW5lLCBlbmFibGUpOworCiAJUkVHX0ZMRF9NT0QoRElTUENfT1ZMX0FUVFJJQlVURVMocGxhbmUpLCBlbmFibGUgPyAxIDogMCwgMCwgMCk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgZGlzcGNfZGlzYWJsZV9pc3Iodm9pZCAqZGF0YSwgdTMyIG1hc2spCkBAIC0xOTI5LDggKzIwNTUsNiBAQAogCWludCByOwogCXUzMiBpcnE7CiAKLQllbmFibGVfY2xvY2tzKDEpOwotCiAJLyogV2hlbiB3ZSBkaXNhYmxlIExDRCBvdXRwdXQsIHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBmcmFtZSBpcyBkb25lLgogCSAqIE90aGVyd2lzZSB0aGUgRFNTIGlzIHN0aWxsIHdvcmtpbmcsIGFuZCB0dXJuaW5nIG9mZiB0aGUgY2xvY2tzCiAJICogcHJldmVudHMgRFNTIGZyb20gZ29pbmcgdG8gT0ZGIG1vZGUgKi8KQEAgLTE5NjQsOCArMjA4OCw2IEBACiAJCWlmIChyKQogCQkJRFNTRVJSKCJmYWlsZWQgdG8gdW5yZWdpc3RlciBGUkFNRURPTkUgaXNyXG4iKTsKIAl9Ci0KLQllbmFibGVfY2xvY2tzKDApOwogfQogCiBzdGF0aWMgdm9pZCBfZW5hYmxlX2RpZ2l0X291dChib29sIGVuYWJsZSkKQEAgLTE5NzgsMTIgKzIxMDAsOCBAQAogCXN0cnVjdCBjb21wbGV0aW9uIGZyYW1lX2RvbmVfY29tcGxldGlvbjsKIAlpbnQgcjsKIAotCWVuYWJsZV9jbG9ja3MoMSk7Ci0KLQlpZiAoUkVHX0dFVChESVNQQ19DT05UUk9MLCAxLCAxKSA9PSBlbmFibGUpIHsKLQkJZW5hYmxlX2Nsb2NrcygwKTsKKwlpZiAoUkVHX0dFVChESVNQQ19DT05UUk9MLCAxLCAxKSA9PSBlbmFibGUpCiAJCXJldHVybjsKLQl9CiAKIAlpZiAoZW5hYmxlKSB7CiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0yMDM1LDggKzIxNTMsNiBAQAogCQlfb21hcF9kaXNwY19zZXRfaXJxcygpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkaXNwYy5pcnFfbG9jaywgZmxhZ3MpOwogCX0KLQotCWVuYWJsZV9jbG9ja3MoMCk7CiB9CiAKIGJvb2wgZGlzcGNfaXNfY2hhbm5lbF9lbmFibGVkKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwpCkBAIC0yMDY3LDkgKzIxODMsNyBAQAogCWlmICghZHNzX2hhc19mZWF0dXJlKEZFQVRfTENERU5BQkxFUE9MKSkKIAkJcmV0dXJuOwogCi0JZW5hYmxlX2Nsb2NrcygxKTsKIAlSRUdfRkxEX01PRChESVNQQ19DT05UUk9MLCBhY3RfaGlnaCA/IDEgOiAwLCAyOSwgMjkpOwotCWVuYWJsZV9jbG9ja3MoMCk7CiB9CiAKIHZvaWQgZGlzcGNfbGNkX2VuYWJsZV9zaWduYWwoYm9vbCBlbmFibGUpCkBAIC0yMDc3LDkgKzIxOTEsNyBAQAogCWlmICghZHNzX2hhc19mZWF0dXJlKEZFQVRfTENERU5BQkxFU0lHTkFMKSkKIAkJcmV0dXJuOwogCi0JZW5hYmxlX2Nsb2NrcygxKTsKIAlSRUdfRkxEX01PRChESVNQQ19DT05UUk9MLCBlbmFibGUgPyAxIDogMCwgMjgsIDI4KTsKLQllbmFibGVfY2xvY2tzKDApOwogfQogCiB2b2lkIGRpc3BjX3Bja19mcmVlX2VuYWJsZShib29sIGVuYWJsZSkKQEAgLTIwODcsMTkgKzIxOTksMTUgQEAKIAlpZiAoIWRzc19oYXNfZmVhdHVyZShGRUFUX1BDS0ZSRUVFTkFCTEUpKQogCQlyZXR1cm47CiAKLQllbmFibGVfY2xvY2tzKDEpOwogCVJFR19GTERfTU9EKERJU1BDX0NPTlRST0wsIGVuYWJsZSA/IDEgOiAwLCAyNywgMjcpOwotCWVuYWJsZV9jbG9ja3MoMCk7CiB9CiAKIHZvaWQgZGlzcGNfZW5hYmxlX2ZpZm9oYW5kY2hlY2soZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgYm9vbCBlbmFibGUpCiB7Ci0JZW5hYmxlX2Nsb2NrcygxKTsKIAlpZiAoY2hhbm5lbCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRDIpCiAJCVJFR19GTERfTU9EKERJU1BDX0NPTkZJRzIsIGVuYWJsZSA/IDEgOiAwLCAxNiwgMTYpOwogCWVsc2UKIAkJUkVHX0ZMRF9NT0QoRElTUENfQ09ORklHLCBlbmFibGUgPyAxIDogMCwgMTYsIDE2KTsKLQllbmFibGVfY2xvY2tzKDApOwogfQogCiAKQEAgLTIxMjIsMjcgKzIyMzAsMjEgQEAKIAkJcmV0dXJuOwogCX0KIAotCWVuYWJsZV9jbG9ja3MoMSk7CiAJaWYgKGNoYW5uZWwgPT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKQogCQlSRUdfRkxEX01PRChESVNQQ19DT05UUk9MMiwgbW9kZSwgMywgMyk7CiAJZWxzZQogCQlSRUdfRkxEX01PRChESVNQQ19DT05UUk9MLCBtb2RlLCAzLCAzKTsKLQllbmFibGVfY2xvY2tzKDApOwogfQogCiB2b2lkIGRpc3BjX3NldF9sb2FkbW9kZShlbnVtIG9tYXBfZHNzX2xvYWRfbW9kZSBtb2RlKQogewotCWVuYWJsZV9jbG9ja3MoMSk7CiAJUkVHX0ZMRF9NT0QoRElTUENfQ09ORklHLCBtb2RlLCAyLCAxKTsKLQllbmFibGVfY2xvY2tzKDApOwogfQogCiAKIHZvaWQgZGlzcGNfc2V0X2RlZmF1bHRfY29sb3IoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgdTMyIGNvbG9yKQogewotCWVuYWJsZV9jbG9ja3MoMSk7CiAJZGlzcGNfd3JpdGVfcmVnKERJU1BDX0RFRkFVTFRfQ09MT1IoY2hhbm5lbCksIGNvbG9yKTsKLQllbmFibGVfY2xvY2tzKDApOwogfQogCiB1MzIgZGlzcGNfZ2V0X2RlZmF1bHRfY29sb3IoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCkKQEAgLTIxNTMsOSArMjI1NSw3IEBACiAJCWNoYW5uZWwgIT0gT01BUF9EU1NfQ0hBTk5FTF9MQ0QgJiYKIAkJY2hhbm5lbCAhPSBPTUFQX0RTU19DSEFOTkVMX0xDRDIpOwogCi0JZW5hYmxlX2Nsb2NrcygxKTsKIAlsID0gZGlzcGNfcmVhZF9yZWcoRElTUENfREVGQVVMVF9DT0xPUihjaGFubmVsKSk7Ci0JZW5hYmxlX2Nsb2NrcygwKTsKIAogCXJldHVybiBsOwogfQpAQCAtMjE2NCw3ICsyMjY0LDYgQEAKIAkJZW51bSBvbWFwX2Rzc190cmFuc19rZXlfdHlwZSB0eXBlLAogCQl1MzIgdHJhbnNfa2V5KQogewotCWVuYWJsZV9jbG9ja3MoMSk7CiAJaWYgKGNoID09IE9NQVBfRFNTX0NIQU5ORUxfTENEKQogCQlSRUdfRkxEX01PRChESVNQQ19DT05GSUcsIHR5cGUsIDExLCAxMSk7CiAJZWxzZSBpZiAoY2ggPT0gT01BUF9EU1NfQ0hBTk5FTF9ESUdJVCkKQEAgLTIxNzMsMTQgKzIyNzIsMTIgQEAKIAkJUkVHX0ZMRF9NT0QoRElTUENfQ09ORklHMiwgdHlwZSwgMTEsIDExKTsKIAogCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19UUkFOU19DT0xPUihjaCksIHRyYW5zX2tleSk7Ci0JZW5hYmxlX2Nsb2NrcygwKTsKIH0KIAogdm9pZCBkaXNwY19nZXRfdHJhbnNfa2V5KGVudW0gb21hcF9jaGFubmVsIGNoLAogCQllbnVtIG9tYXBfZHNzX3RyYW5zX2tleV90eXBlICp0eXBlLAogCQl1MzIgKnRyYW5zX2tleSkKIHsKLQllbmFibGVfY2xvY2tzKDEpOwogCWlmICh0eXBlKSB7CiAJCWlmIChjaCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRCkKIAkJCSp0eXBlID0gUkVHX0dFVChESVNQQ19DT05GSUcsIDExLCAxMSk7CkBAIC0yMTk0LDMzICsyMjkxLDI4IEBACiAKIAlpZiAodHJhbnNfa2V5KQogCQkqdHJhbnNfa2V5ID0gZGlzcGNfcmVhZF9yZWcoRElTUENfVFJBTlNfQ09MT1IoY2gpKTsKLQllbmFibGVfY2xvY2tzKDApOwogfQogCiB2b2lkIGRpc3BjX2VuYWJsZV90cmFuc19rZXkoZW51bSBvbWFwX2NoYW5uZWwgY2gsIGJvb2wgZW5hYmxlKQogewotCWVuYWJsZV9jbG9ja3MoMSk7CiAJaWYgKGNoID09IE9NQVBfRFNTX0NIQU5ORUxfTENEKQogCQlSRUdfRkxEX01PRChESVNQQ19DT05GSUcsIGVuYWJsZSwgMTAsIDEwKTsKIAllbHNlIGlmIChjaCA9PSBPTUFQX0RTU19DSEFOTkVMX0RJR0lUKQogCQlSRUdfRkxEX01PRChESVNQQ19DT05GSUcsIGVuYWJsZSwgMTIsIDEyKTsKIAllbHNlIC8qIE9NQVBfRFNTX0NIQU5ORUxfTENEMiAqLwogCQlSRUdfRkxEX01PRChESVNQQ19DT05GSUcyLCBlbmFibGUsIDEwLCAxMCk7Ci0JZW5hYmxlX2Nsb2NrcygwKTsKIH0KIHZvaWQgZGlzcGNfZW5hYmxlX2FscGhhX2JsZW5kaW5nKGVudW0gb21hcF9jaGFubmVsIGNoLCBib29sIGVuYWJsZSkKIHsKIAlpZiAoIWRzc19oYXNfZmVhdHVyZShGRUFUX0dMT0JBTF9BTFBIQSkpCiAJCXJldHVybjsKIAotCWVuYWJsZV9jbG9ja3MoMSk7CiAJaWYgKGNoID09IE9NQVBfRFNTX0NIQU5ORUxfTENEKQogCQlSRUdfRkxEX01PRChESVNQQ19DT05GSUcsIGVuYWJsZSwgMTgsIDE4KTsKIAllbHNlIGlmIChjaCA9PSBPTUFQX0RTU19DSEFOTkVMX0RJR0lUKQogCQlSRUdfRkxEX01PRChESVNQQ19DT05GSUcsIGVuYWJsZSwgMTksIDE5KTsKIAllbHNlIC8qIE9NQVBfRFNTX0NIQU5ORUxfTENEMiAqLwogCQlSRUdfRkxEX01PRChESVNQQ19DT05GSUcyLCBlbmFibGUsIDE4LCAxOCk7Ci0JZW5hYmxlX2Nsb2NrcygwKTsKIH0KIGJvb2wgZGlzcGNfYWxwaGFfYmxlbmRpbmdfZW5hYmxlZChlbnVtIG9tYXBfY2hhbm5lbCBjaCkKIHsKQEAgLTIyMjksNyArMjMyMSw2IEBACiAJaWYgKCFkc3NfaGFzX2ZlYXR1cmUoRkVBVF9HTE9CQUxfQUxQSEEpKQogCQlyZXR1cm4gZmFsc2U7CiAKLQllbmFibGVfY2xvY2tzKDEpOwogCWlmIChjaCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRCkKIAkJZW5hYmxlZCA9IFJFR19HRVQoRElTUENfQ09ORklHLCAxOCwgMTgpOwogCWVsc2UgaWYgKGNoID09IE9NQVBfRFNTX0NIQU5ORUxfRElHSVQpCkBAIC0yMjM4LDcgKzIzMjksNiBAQAogCQllbmFibGVkID0gUkVHX0dFVChESVNQQ19DT05GSUcyLCAxOCwgMTgpOwogCWVsc2UKIAkJQlVHKCk7Ci0JZW5hYmxlX2Nsb2NrcygwKTsKIAogCXJldHVybiBlbmFibGVkOwogfQpAQCAtMjI0OCw3ICsyMzM4LDYgQEAKIHsKIAlib29sIGVuYWJsZWQ7CiAKLQllbmFibGVfY2xvY2tzKDEpOwogCWlmIChjaCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRCkKIAkJZW5hYmxlZCA9IFJFR19HRVQoRElTUENfQ09ORklHLCAxMCwgMTApOwogCWVsc2UgaWYgKGNoID09IE9NQVBfRFNTX0NIQU5ORUxfRElHSVQpCkBAIC0yMjU3LDcgKzIzNDYsNiBAQAogCQllbmFibGVkID0gUkVHX0dFVChESVNQQ19DT05GSUcyLCAxMCwgMTApOwogCWVsc2UKIAkJQlVHKCk7Ci0JZW5hYmxlX2Nsb2NrcygwKTsKIAogCXJldHVybiBlbmFibGVkOwogfQpAQCAtMjI4NSwxMiArMjM3MywxMCBAQAogCQlyZXR1cm47CiAJfQogCi0JZW5hYmxlX2Nsb2NrcygxKTsKIAlpZiAoY2hhbm5lbCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRDIpCiAJCVJFR19GTERfTU9EKERJU1BDX0NPTlRST0wyLCBjb2RlLCA5LCA4KTsKIAllbHNlCiAJCVJFR19GTERfTU9EKERJU1BDX0NPTlRST0wsIGNvZGUsIDksIDgpOwotCWVuYWJsZV9jbG9ja3MoMCk7CiB9CiAKIHZvaWQgZGlzcGNfc2V0X3BhcmFsbGVsX2ludGVyZmFjZV9tb2RlKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsCkBAIC0yMzIyLDggKzI0MDgsNiBAQAogCQlyZXR1cm47CiAJfQogCi0JZW5hYmxlX2Nsb2NrcygxKTsKLQogCWlmIChjaGFubmVsID09IE9NQVBfRFNTX0NIQU5ORUxfTENEMikgewogCQlsID0gZGlzcGNfcmVhZF9yZWcoRElTUENfQ09OVFJPTDIpOwogCQlsID0gRkxEX01PRChsLCBzdGFsbG1vZGUsIDExLCAxMSk7CkBAIC0yMzM1LDggKzI0MTksNiBAQAogCQlsID0gRkxEX01PRChsLCBncG91dDEsIDE2LCAxNik7CiAJCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19DT05UUk9MLCBsKTsKIAl9Ci0KLQllbmFibGVfY2xvY2tzKDApOwogfQogCiBzdGF0aWMgYm9vbCBfZGlzcGNfbGNkX3RpbWluZ3Nfb2soaW50IGhzdywgaW50IGhmcCwgaW50IGhicCwKQEAgLTIzODksMTAgKzI0NzEsOCBAQAogCQkJRkxEX1ZBTCh2YnAsIDMxLCAyMCk7CiAJfQogCi0JZW5hYmxlX2Nsb2NrcygxKTsKIAlkaXNwY193cml0ZV9yZWcoRElTUENfVElNSU5HX0goY2hhbm5lbCksIHRpbWluZ19oKTsKIAlkaXNwY193cml0ZV9yZWcoRElTUENfVElNSU5HX1YoY2hhbm5lbCksIHRpbWluZ192KTsKLQllbmFibGVfY2xvY2tzKDApOwogfQogCiAvKiBjaGFuZ2UgbmFtZSB0byBtb2RlPyAqLwpAQCAtMjQzNSwxMCArMjUxNSw4IEBACiAJQlVHX09OKGxja19kaXYgPCAxKTsKIAlCVUdfT04ocGNrX2RpdiA8IDIpOwogCi0JZW5hYmxlX2Nsb2NrcygxKTsKIAlkaXNwY193cml0ZV9yZWcoRElTUENfRElWSVNPUm8oY2hhbm5lbCksCiAJCQlGTERfVkFMKGxja19kaXYsIDIzLCAxNikgfCBGTERfVkFMKHBja19kaXYsIDcsIDApKTsKLQllbmFibGVfY2xvY2tzKDApOwogfQogCiBzdGF0aWMgdm9pZCBkaXNwY19nZXRfbGNkX2Rpdmlzb3IoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgaW50ICpsY2tfZGl2LApAQCAtMjQ1Nyw3ICsyNTM1LDcgQEAKIAogCXN3aXRjaCAoZHNzX2dldF9kaXNwY19jbGtfc291cmNlKCkpIHsKIAljYXNlIE9NQVBfRFNTX0NMS19TUkNfRkNLOgotCQlyID0gZHNzX2Nsa19nZXRfcmF0ZShEU1NfQ0xLX0ZDSyk7CisJCXIgPSBjbGtfZ2V0X3JhdGUoZGlzcGMuZHNzX2Nsayk7CiAJCWJyZWFrOwogCWNhc2UgT01BUF9EU1NfQ0xLX1NSQ19EU0lfUExMX0hTRElWX0RJU1BDOgogCQlkc2lkZXYgPSBkc2lfZ2V0X2RzaWRldl9mcm9tX2lkKDApOwpAQCAtMjQ4Nyw3ICsyNTY1LDcgQEAKIAogCXN3aXRjaCAoZHNzX2dldF9sY2RfY2xrX3NvdXJjZShjaGFubmVsKSkgewogCWNhc2UgT01BUF9EU1NfQ0xLX1NSQ19GQ0s6Ci0JCXIgPSBkc3NfY2xrX2dldF9yYXRlKERTU19DTEtfRkNLKTsKKwkJciA9IGNsa19nZXRfcmF0ZShkaXNwYy5kc3NfY2xrKTsKIAkJYnJlYWs7CiAJY2FzZSBPTUFQX0RTU19DTEtfU1JDX0RTSV9QTExfSFNESVZfRElTUEM6CiAJCWRzaWRldiA9IGRzaV9nZXRfZHNpZGV2X2Zyb21faWQoMCk7CkBAIC0yNTI2LDcgKzI2MDQsOCBAQAogCWVudW0gb21hcF9kc3NfY2xrX3NvdXJjZSBkaXNwY19jbGtfc3JjID0gZHNzX2dldF9kaXNwY19jbGtfc291cmNlKCk7CiAJZW51bSBvbWFwX2Rzc19jbGtfc291cmNlIGxjZF9jbGtfc3JjOwogCi0JZW5hYmxlX2Nsb2NrcygxKTsKKwlpZiAoZGlzcGNfcnVudGltZV9nZXQoKSkKKwkJcmV0dXJuOwogCiAJc2VxX3ByaW50ZihzLCAiLSBESVNQQyAtXG4iKTsKIApAQCAtMjU3NCw3ICsyNjUzLDggQEAKIAkJc2VxX3ByaW50ZihzLCAicGNrXHRcdCUtMTZsdXBjayBkaXZcdCV1XG4iLAogCQkJCWRpc3BjX3BjbGtfcmF0ZShPTUFQX0RTU19DSEFOTkVMX0xDRDIpLCBwY2QpOwogCX0KLQllbmFibGVfY2xvY2tzKDApOworCisJZGlzcGNfcnVudGltZV9wdXQoKTsKIH0KIAogI2lmZGVmIENPTkZJR19PTUFQMl9EU1NfQ09MTEVDVF9JUlFfU1RBVFMKQEAgLTI2MjksNyArMjcwOSw4IEBACiB7CiAjZGVmaW5lIERVTVBSRUcocikgc2VxX3ByaW50ZihzLCAiJS01MHMgJTA4eFxuIiwgI3IsIGRpc3BjX3JlYWRfcmVnKHIpKQogCi0JZHNzX2Nsa19lbmFibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSyk7CisJaWYgKGRpc3BjX3J1bnRpbWVfZ2V0KCkpCisJCXJldHVybjsKIAogCURVTVBSRUcoRElTUENfUkVWSVNJT04pOwogCURVTVBSRUcoRElTUENfU1lTQ09ORklHKTsKQEAgLTI2NDksNyArMjczMCw4IEBACiAJRFVNUFJFRyhESVNQQ19USU1JTkdfVihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwogCURVTVBSRUcoRElTUENfUE9MX0ZSRVEoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKIAlEVU1QUkVHKERJU1BDX0RJVklTT1JvKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JRFVNUFJFRyhESVNQQ19HTE9CQUxfQUxQSEEpOworCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9HTE9CQUxfQUxQSEEpKQorCQlEVU1QUkVHKERJU1BDX0dMT0JBTF9BTFBIQSk7CiAJRFVNUFJFRyhESVNQQ19TSVpFX01HUihPTUFQX0RTU19DSEFOTkVMX0RJR0lUKSk7CiAJRFVNUFJFRyhESVNQQ19TSVpFX01HUihPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwogCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9NR1JfTENEMikpIHsKQEAgLTI2ODAsMjAgKzI3NjIsMjUgQEAKIAlEVU1QUkVHKERJU1BDX0RBVEFfQ1lDTEUyKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7CiAJRFVNUFJFRyhESVNQQ19EQVRBX0NZQ0xFMyhPTUFQX0RTU19DSEFOTkVMX0xDRCkpOwogCi0JRFVNUFJFRyhESVNQQ19DUFJfQ09FRl9SKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JRFVNUFJFRyhESVNQQ19DUFJfQ09FRl9HKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7Ci0JRFVNUFJFRyhESVNQQ19DUFJfQ09FRl9CKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7CisJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0NQUikpIHsKKwkJRFVNUFJFRyhESVNQQ19DUFJfQ09FRl9SKE9NQVBfRFNTX0NIQU5ORUxfTENEKSk7CisJCURVTVBSRUcoRElTUENfQ1BSX0NPRUZfRyhPTUFQX0RTU19DSEFOTkVMX0xDRCkpOworCQlEVU1QUkVHKERJU1BDX0NQUl9DT0VGX0IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpKTsKKwl9CiAJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX01HUl9MQ0QyKSkgewogCQlEVU1QUkVHKERJU1BDX0RBVEFfQ1lDTEUxKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOwogCQlEVU1QUkVHKERJU1BDX0RBVEFfQ1lDTEUyKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOwogCQlEVU1QUkVHKERJU1BDX0RBVEFfQ1lDTEUzKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOwogCi0JCURVTVBSRUcoRElTUENfQ1BSX0NPRUZfUihPTUFQX0RTU19DSEFOTkVMX0xDRDIpKTsKLQkJRFVNUFJFRyhESVNQQ19DUFJfQ09FRl9HKE9NQVBfRFNTX0NIQU5ORUxfTENEMikpOwotCQlEVU1QUkVHKERJU1BDX0NQUl9DT0VGX0IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7CisJCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9DUFIpKSB7CisJCQlEVU1QUkVHKERJU1BDX0NQUl9DT0VGX1IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7CisJCQlEVU1QUkVHKERJU1BDX0NQUl9DT0VGX0coT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7CisJCQlEVU1QUkVHKERJU1BDX0NQUl9DT0VGX0IoT01BUF9EU1NfQ0hBTk5FTF9MQ0QyKSk7CisJCX0KIAl9CiAKLQlEVU1QUkVHKERJU1BDX09WTF9QUkVMT0FEKE9NQVBfRFNTX0dGWCkpOworCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9QUkVMT0FEKSkKKwkJRFVNUFJFRyhESVNQQ19PVkxfUFJFTE9BRChPTUFQX0RTU19HRlgpKTsKIAogCURVTVBSRUcoRElTUENfT1ZMX0JBMChPTUFQX0RTU19WSURFTzEpKTsKIAlEVU1QUkVHKERJU1BDX09WTF9CQTEoT01BUF9EU1NfVklERU8xKSk7CkBAIC0yNzQ0LDE0ICsyODMxLDE2IEBACiAJRFVNUFJFRyhESVNQQ19PVkxfQ09OVl9DT0VGKE9NQVBfRFNTX1ZJREVPMSwgMikpOwogCURVTVBSRUcoRElTUENfT1ZMX0NPTlZfQ09FRihPTUFQX0RTU19WSURFTzEsIDMpKTsKIAlEVU1QUkVHKERJU1BDX09WTF9DT05WX0NPRUYoT01BUF9EU1NfVklERU8xLCA0KSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzEsIDApKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgMSkpOwotCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX1YoT01BUF9EU1NfVklERU8xLCAyKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzEsIDMpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgNCkpOwotCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX1YoT01BUF9EU1NfVklERU8xLCA1KSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzEsIDYpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgNykpOworCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9GSVJfQ09FRl9WKSkgeworCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgMCkpOworCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgMSkpOworCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgMikpOworCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgMykpOworCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgNCkpOworCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgNSkpOworCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgNikpOworCQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMSwgNykpOworCX0KIAogCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9IQU5ETEVfVVZfU0VQQVJBVEUpKSB7CiAJCURVTVBSRUcoRElTUENfT1ZMX0JBMF9VVihPTUFQX0RTU19WSURFTzEpKTsKQEAgLTI4MTIsMTQgKzI5MDEsMTcgQEAKIAlEVU1QUkVHKERJU1BDX09WTF9DT05WX0NPRUYoT01BUF9EU1NfVklERU8yLCAyKSk7CiAJRFVNUFJFRyhESVNQQ19PVkxfQ09OVl9DT0VGKE9NQVBfRFNTX1ZJREVPMiwgMykpOwogCURVTVBSRUcoRElTUENfT1ZMX0NPTlZfQ09FRihPTUFQX0RTU19WSURFTzIsIDQpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMiwgMCkpOwotCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX1YoT01BUF9EU1NfVklERU8yLCAxKSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIDIpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMiwgMykpOwotCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX1YoT01BUF9EU1NfVklERU8yLCA0KSk7Ci0JRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIDUpKTsKLQlEVU1QUkVHKERJU1BDX09WTF9GSVJfQ09FRl9WKE9NQVBfRFNTX1ZJREVPMiwgNikpOwotCURVTVBSRUcoRElTUENfT1ZMX0ZJUl9DT0VGX1YoT01BUF9EU1NfVklERU8yLCA3KSk7CisKKwlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfRklSX0NPRUZfVikpIHsKKwkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIDApKTsKKwkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIDEpKTsKKwkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIDIpKTsKKwkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIDMpKTsKKwkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIDQpKTsKKwkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIDUpKTsKKwkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIDYpKTsKKwkJRFVNUFJFRyhESVNQQ19PVkxfRklSX0NPRUZfVihPTUFQX0RTU19WSURFTzIsIDcpKTsKKwl9CiAKIAlpZiAoZHNzX2hhc19mZWF0dXJlKEZFQVRfSEFORExFX1VWX1NFUEFSQVRFKSkgewogCQlEVU1QUkVHKERJU1BDX09WTF9CQTBfVVYoT01BUF9EU1NfVklERU8yKSk7CkBAIC0yODU4LDEwICsyOTUwLDEyIEBACiAJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0FUVFIyKSkKIAkJRFVNUFJFRyhESVNQQ19PVkxfQVRUUklCVVRFUzIoT01BUF9EU1NfVklERU8yKSk7CiAKLQlEVU1QUkVHKERJU1BDX09WTF9QUkVMT0FEKE9NQVBfRFNTX1ZJREVPMSkpOwotCURVTVBSRUcoRElTUENfT1ZMX1BSRUxPQUQoT01BUF9EU1NfVklERU8yKSk7CisJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX1BSRUxPQUQpKSB7CisJCURVTVBSRUcoRElTUENfT1ZMX1BSRUxPQUQoT01BUF9EU1NfVklERU8xKSk7CisJCURVTVBSRUcoRElTUENfT1ZMX1BSRUxPQUQoT01BUF9EU1NfVklERU8yKSk7CisJfQogCi0JZHNzX2Nsa19kaXNhYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0spOworCWRpc3BjX3J1bnRpbWVfcHV0KCk7CiAjdW5kZWYgRFVNUFJFRwogfQogCkBAIC0yODgyLDkgKzI5NzYsNyBAQAogCWwgfD0gRkxEX1ZBTChhY2JpLCAxMSwgOCk7CiAJbCB8PSBGTERfVkFMKGFjYiwgNywgMCk7CiAKLQllbmFibGVfY2xvY2tzKDEpOwogCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19QT0xfRlJFUShjaGFubmVsKSwgbCk7Ci0JZW5hYmxlX2Nsb2NrcygwKTsKIH0KIAogdm9pZCBkaXNwY19zZXRfcG9sX2ZyZXEoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwKQEAgLTMwMDUsMTUgKzMwOTcsMTEgQEAKIAkJbWFzayB8PSBpc3JfZGF0YS0+bWFzazsKIAl9CiAKLQllbmFibGVfY2xvY2tzKDEpOwotCiAJb2xkX21hc2sgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19JUlFFTkFCTEUpOwogCS8qIGNsZWFyIHRoZSBpcnFzdGF0dXMgZm9yIG5ld2x5IGVuYWJsZWQgaXJxcyAqLwogCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19JUlFTVEFUVVMsIChtYXNrIF4gb2xkX21hc2spICYgbWFzayk7CiAKIAlkaXNwY193cml0ZV9yZWcoRElTUENfSVJRRU5BQkxFLCBtYXNrKTsKLQotCWVuYWJsZV9jbG9ja3MoMCk7CiB9CiAKIGludCBvbWFwX2Rpc3BjX3JlZ2lzdGVyX2lzcihvbWFwX2Rpc3BjX2lzcl90IGlzciwgdm9pZCAqYXJnLCB1MzIgbWFzaykKQEAgLTM1MjIsMTMgKzM2MTAsNiBAQAogewogCXUzMiBsOwogCi0JbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX1NZU0NPTkZJRyk7Ci0JbCA9IEZMRF9NT0QobCwgMiwgMTMsIDEyKTsJLyogTUlETEVNT0RFOiBzbWFydCBzdGFuZGJ5ICovCi0JbCA9IEZMRF9NT0QobCwgMiwgNCwgMyk7CS8qIFNJRExFTU9ERTogc21hcnQgaWRsZSAqLwotCWwgPSBGTERfTU9EKGwsIDEsIDIsIDIpOwkvKiBFTldBS0VVUCAqLwotCWwgPSBGTERfTU9EKGwsIDEsIDAsIDApOwkvKiBBVVRPSURMRSAqLwotCWRpc3BjX3dyaXRlX3JlZyhESVNQQ19TWVNDT05GSUcsIGwpOwotCiAJLyogRXhjbHVzaXZlbHkgZW5hYmxlIERJU1BDX0NPUkVfQ0xLIGFuZCBzZXQgZGl2aWRlciB0byAxICovCiAJaWYgKGRzc19oYXNfZmVhdHVyZShGRUFUX0NPUkVfQ0xLX0RJVikpIHsKIAkJbCA9IGRpc3BjX3JlYWRfcmVnKERJU1BDX0RJVklTT1IpOwpAQCAtMzU1Miw1OCArMzYzMyw4IEBACiAJZGlzcGNfc2V0X2xvYWRtb2RlKE9NQVBfRFNTX0xPQURfRlJBTUVfT05MWSk7CiAKIAlkaXNwY19yZWFkX3BsYW5lX2ZpZm9fc2l6ZXMoKTsKLX0KIAotaW50IGRpc3BjX2VuYWJsZV9wbGFuZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsIGJvb2wgZW5hYmxlKQotewotCURTU0RCRygiZGlzcGNfZW5hYmxlX3BsYW5lICVkLCAlZFxuIiwgcGxhbmUsIGVuYWJsZSk7Ci0KLQllbmFibGVfY2xvY2tzKDEpOwotCV9kaXNwY19lbmFibGVfcGxhbmUocGxhbmUsIGVuYWJsZSk7Ci0JZW5hYmxlX2Nsb2NrcygwKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgZGlzcGNfc2V0dXBfcGxhbmUoZW51bSBvbWFwX3BsYW5lIHBsYW5lLAotCQkgICAgICAgdTMyIHBhZGRyLCB1MTYgc2NyZWVuX3dpZHRoLAotCQkgICAgICAgdTE2IHBvc194LCB1MTYgcG9zX3ksCi0JCSAgICAgICB1MTYgd2lkdGgsIHUxNiBoZWlnaHQsCi0JCSAgICAgICB1MTYgb3V0X3dpZHRoLCB1MTYgb3V0X2hlaWdodCwKLQkJICAgICAgIGVudW0gb21hcF9jb2xvcl9tb2RlIGNvbG9yX21vZGUsCi0JCSAgICAgICBib29sIGlsYWNlLAotCQkgICAgICAgZW51bSBvbWFwX2Rzc19yb3RhdGlvbl90eXBlIHJvdGF0aW9uX3R5cGUsCi0JCSAgICAgICB1OCByb3RhdGlvbiwgYm9vbCBtaXJyb3IsIHU4IGdsb2JhbF9hbHBoYSwKLQkJICAgICAgIHU4IHByZV9tdWx0X2FscGhhLCBlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsLAotCQkgICAgICAgdTMyIHB1dl9hZGRyKQotewotCWludCByID0gMDsKLQotCURTU0RCRygiZGlzcGNfc2V0dXBfcGxhbmUgJWQsIHBhICV4LCBzdyAlZCwgJWQsICVkLCAlZHglZCAtPiAiCi0JICAgICAgICIlZHglZCwgaWxhY2UgJWQsIGNtb2RlICV4LCByb3QgJWQsIG1pciAlZCBjaGFuICVkXG4iLAotCSAgICAgICBwbGFuZSwgcGFkZHIsIHNjcmVlbl93aWR0aCwgcG9zX3gsIHBvc195LAotCSAgICAgICB3aWR0aCwgaGVpZ2h0LAotCSAgICAgICBvdXRfd2lkdGgsIG91dF9oZWlnaHQsCi0JICAgICAgIGlsYWNlLCBjb2xvcl9tb2RlLAotCSAgICAgICByb3RhdGlvbiwgbWlycm9yLCBjaGFubmVsKTsKLQotCWVuYWJsZV9jbG9ja3MoMSk7Ci0KLQlyID0gX2Rpc3BjX3NldHVwX3BsYW5lKHBsYW5lLAotCQkJICAgcGFkZHIsIHNjcmVlbl93aWR0aCwKLQkJCSAgIHBvc194LCBwb3NfeSwKLQkJCSAgIHdpZHRoLCBoZWlnaHQsCi0JCQkgICBvdXRfd2lkdGgsIG91dF9oZWlnaHQsCi0JCQkgICBjb2xvcl9tb2RlLCBpbGFjZSwKLQkJCSAgIHJvdGF0aW9uX3R5cGUsCi0JCQkgICByb3RhdGlvbiwgbWlycm9yLAotCQkJICAgZ2xvYmFsX2FscGhhLAotCQkJICAgcHJlX211bHRfYWxwaGEsCi0JCQkgICBjaGFubmVsLCBwdXZfYWRkcik7Ci0KLQllbmFibGVfY2xvY2tzKDApOwotCi0JcmV0dXJuIHI7CisJZGlzcGNfY29uZmlndXJlX2J1cnN0X3NpemVzKCk7CiB9CiAKIC8qIERJU1BDIEhXIElQIGluaXRpYWxpc2F0aW9uICovCkBAIC0zNjEyLDkgKzM2NDMsMTkgQEAKIAl1MzIgcmV2OwogCWludCByID0gMDsKIAlzdHJ1Y3QgcmVzb3VyY2UgKmRpc3BjX21lbTsKKwlzdHJ1Y3QgY2xrICpjbGs7CiAKIAlkaXNwYy5wZGV2ID0gcGRldjsKIAorCWNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgImZjayIpOworCWlmIChJU19FUlIoY2xrKSkgeworCQlEU1NFUlIoImNhbid0IGdldCBmY2tcbiIpOworCQlyID0gUFRSX0VSUihjbGspOworCQlnb3RvIGVycl9nZXRfY2xrOworCX0KKworCWRpc3BjLmRzc19jbGsgPSBjbGs7CisKIAlzcGluX2xvY2tfaW5pdCgmZGlzcGMuaXJxX2xvY2spOwogCiAjaWZkZWYgQ09ORklHX09NQVAyX0RTU19DT0xMRUNUX0lSUV9TVEFUUwpAQCAtMzYyOCw2MiArMzY2OSwxMDMgQEAKIAlpZiAoIWRpc3BjX21lbSkgewogCQlEU1NFUlIoImNhbid0IGdldCBJT1JFU09VUkNFX01FTSBESVNQQ1xuIik7CiAJCXIgPSAtRUlOVkFMOwotCQlnb3RvIGZhaWwwOworCQlnb3RvIGVycl9pb3JlbWFwOwogCX0KIAlkaXNwYy5iYXNlID0gaW9yZW1hcChkaXNwY19tZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKGRpc3BjX21lbSkpOwogCWlmICghZGlzcGMuYmFzZSkgewogCQlEU1NFUlIoImNhbid0IGlvcmVtYXAgRElTUENcbiIpOwogCQlyID0gLUVOT01FTTsKLQkJZ290byBmYWlsMDsKKwkJZ290byBlcnJfaW9yZW1hcDsKIAl9CiAJZGlzcGMuaXJxID0gcGxhdGZvcm1fZ2V0X2lycShkaXNwYy5wZGV2LCAwKTsKIAlpZiAoZGlzcGMuaXJxIDwgMCkgewogCQlEU1NFUlIoInBsYXRmb3JtX2dldF9pcnEgZmFpbGVkXG4iKTsKIAkJciA9IC1FTk9ERVY7Ci0JCWdvdG8gZmFpbDE7CisJCWdvdG8gZXJyX2lycTsKIAl9CiAKIAlyID0gcmVxdWVzdF9pcnEoZGlzcGMuaXJxLCBvbWFwX2Rpc3BjX2lycV9oYW5kbGVyLCBJUlFGX1NIQVJFRCwKIAkJIk9NQVAgRElTUEMiLCBkaXNwYy5wZGV2KTsKIAlpZiAociA8IDApIHsKIAkJRFNTRVJSKCJyZXF1ZXN0X2lycSBmYWlsZWRcbiIpOwotCQlnb3RvIGZhaWwxOworCQlnb3RvIGVycl9pcnE7CiAJfQogCi0JZW5hYmxlX2Nsb2NrcygxKTsKKwlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKKworCXIgPSBkaXNwY19ydW50aW1lX2dldCgpOworCWlmIChyKQorCQlnb3RvIGVycl9ydW50aW1lX2dldDsKIAogCV9vbWFwX2Rpc3BjX2luaXRpYWxfY29uZmlnKCk7CiAKIAlfb21hcF9kaXNwY19pbml0aWFsaXplX2lycSgpOwogCi0JZGlzcGNfc2F2ZV9jb250ZXh0KCk7Ci0KIAlyZXYgPSBkaXNwY19yZWFkX3JlZyhESVNQQ19SRVZJU0lPTik7CiAJZGV2X2RiZygmcGRldi0+ZGV2LCAiT01BUCBESVNQQyByZXYgJWQuJWRcbiIsCiAJICAgICAgIEZMRF9HRVQocmV2LCA3LCA0KSwgRkxEX0dFVChyZXYsIDMsIDApKTsKIAotCWVuYWJsZV9jbG9ja3MoMCk7CisJZGlzcGNfcnVudGltZV9wdXQoKTsKIAogCXJldHVybiAwOwotZmFpbDE6CisKK2Vycl9ydW50aW1lX2dldDoKKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CisJZnJlZV9pcnEoZGlzcGMuaXJxLCBkaXNwYy5wZGV2KTsKK2Vycl9pcnE6CiAJaW91bm1hcChkaXNwYy5iYXNlKTsKLWZhaWwwOgorZXJyX2lvcmVtYXA6CisJY2xrX3B1dChkaXNwYy5kc3NfY2xrKTsKK2Vycl9nZXRfY2xrOgogCXJldHVybiByOwogfQogCiBzdGF0aWMgaW50IG9tYXBfZGlzcGNod19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CisKKwljbGtfcHV0KGRpc3BjLmRzc19jbGspOworCiAJZnJlZV9pcnEoZGlzcGMuaXJxLCBkaXNwYy5wZGV2KTsKIAlpb3VubWFwKGRpc3BjLmJhc2UpOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGRpc3BjX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJZGlzcGNfc2F2ZV9jb250ZXh0KCk7CisJY2xrX2Rpc2FibGUoZGlzcGMuZHNzX2Nsayk7CisJZHNzX3J1bnRpbWVfcHV0KCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkaXNwY19ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHI7CisKKwlyID0gZHNzX3J1bnRpbWVfZ2V0KCk7CisJaWYgKHIgPCAwKQorCQlyZXR1cm4gcjsKKworCWNsa19lbmFibGUoZGlzcGMuZHNzX2Nsayk7CisJZGlzcGNfcmVzdG9yZV9jb250ZXh0KCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGRpc3BjX3BtX29wcyA9IHsKKwkucnVudGltZV9zdXNwZW5kID0gZGlzcGNfcnVudGltZV9zdXNwZW5kLAorCS5ydW50aW1lX3Jlc3VtZSA9IGRpc3BjX3J1bnRpbWVfcmVzdW1lLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb21hcF9kaXNwY2h3X2RyaXZlciA9IHsKIAkucHJvYmUgICAgICAgICAgPSBvbWFwX2Rpc3BjaHdfcHJvYmUsCiAJLnJlbW92ZSAgICAgICAgID0gb21hcF9kaXNwY2h3X3JlbW92ZSwKIAkuZHJpdmVyICAgICAgICAgPSB7CiAJCS5uYW1lICAgPSAib21hcGRzc19kaXNwYyIsCiAJCS5vd25lciAgPSBUSElTX01PRFVMRSwKKwkJLnBtCT0gJmRpc3BjX3BtX29wcywKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZGlzcGxheS5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZGlzcGxheS5jCmluZGV4IGMyZGZjOGMuLjk0NDk1ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rpc3BsYXkuYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kaXNwbGF5LmMKQEAgLTI5LDYgKzI5LDcgQEAKIAogI2luY2x1ZGUgPHZpZGVvL29tYXBkc3MuaD4KICNpbmNsdWRlICJkc3MuaCIKKyNpbmNsdWRlICJkc3NfZmVhdHVyZXMuaCIKIAogc3RhdGljIHNzaXplX3QgZGlzcGxheV9lbmFibGVkX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAogCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQpAQCAtNjUsNDggKzY2LDYgQEAKIAlyZXR1cm4gc2l6ZTsKIH0KIAotc3RhdGljIHNzaXplX3QgZGlzcGxheV91cGRfbW9kZV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYgPSB0b19kc3NfZGV2aWNlKGRldik7Ci0JZW51bSBvbWFwX2Rzc191cGRhdGVfbW9kZSBtb2RlID0gT01BUF9EU1NfVVBEQVRFX0FVVE87Ci0JaWYgKGRzc2Rldi0+ZHJpdmVyLT5nZXRfdXBkYXRlX21vZGUpCi0JCW1vZGUgPSBkc3NkZXYtPmRyaXZlci0+Z2V0X3VwZGF0ZV9tb2RlKGRzc2Rldik7Ci0JcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIG1vZGUpOwotfQotCi1zdGF0aWMgc3NpemVfdCBkaXNwbGF5X3VwZF9tb2RlX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKLQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpCi17Ci0Jc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2ID0gdG9fZHNzX2RldmljZShkZXYpOwotCWludCB2YWwsIHI7Ci0JZW51bSBvbWFwX2Rzc191cGRhdGVfbW9kZSBtb2RlOwotCi0JaWYgKCFkc3NkZXYtPmRyaXZlci0+c2V0X3VwZGF0ZV9tb2RlKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXIgPSBrc3RydG9pbnQoYnVmLCAwLCAmdmFsKTsKLQlpZiAocikKLQkJcmV0dXJuIHI7Ci0KLQlzd2l0Y2ggKHZhbCkgewotCWNhc2UgT01BUF9EU1NfVVBEQVRFX0RJU0FCTEVEOgotCWNhc2UgT01BUF9EU1NfVVBEQVRFX0FVVE86Ci0JY2FzZSBPTUFQX0RTU19VUERBVEVfTUFOVUFMOgotCQltb2RlID0gKGVudW0gb21hcF9kc3NfdXBkYXRlX21vZGUpdmFsOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyID0gZHNzZGV2LT5kcml2ZXItPnNldF91cGRhdGVfbW9kZShkc3NkZXYsIG1vZGUpOwotCWlmIChyKQotCQlyZXR1cm4gcjsKLQotCXJldHVybiBzaXplOwotfQotCiBzdGF0aWMgc3NpemVfdCBkaXNwbGF5X3RlYXJfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCiAJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCiB7CkBAIC0yOTQsOCArMjUzLDYgQEAKIAogc3RhdGljIERFVklDRV9BVFRSKGVuYWJsZWQsIFNfSVJVR098U19JV1VTUiwKIAkJZGlzcGxheV9lbmFibGVkX3Nob3csIGRpc3BsYXlfZW5hYmxlZF9zdG9yZSk7Ci1zdGF0aWMgREVWSUNFX0FUVFIodXBkYXRlX21vZGUsIFNfSVJVR098U19JV1VTUiwKLQkJZGlzcGxheV91cGRfbW9kZV9zaG93LCBkaXNwbGF5X3VwZF9tb2RlX3N0b3JlKTsKIHN0YXRpYyBERVZJQ0VfQVRUUih0ZWFyX2VsaW0sIFNfSVJVR098U19JV1VTUiwKIAkJZGlzcGxheV90ZWFyX3Nob3csIGRpc3BsYXlfdGVhcl9zdG9yZSk7CiBzdGF0aWMgREVWSUNFX0FUVFIodGltaW5ncywgU19JUlVHT3xTX0lXVVNSLApAQCAtMzA5LDcgKzI2Niw2IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqZGlzcGxheV9zeXNmc19hdHRyc1tdID0gewogCSZkZXZfYXR0cl9lbmFibGVkLAotCSZkZXZfYXR0cl91cGRhdGVfbW9kZSwKIAkmZGV2X2F0dHJfdGVhcl9lbGltLAogCSZkZXZfYXR0cl90aW1pbmdzLAogCSZkZXZfYXR0cl9yb3RhdGUsCkBAIC0zMjcsMTYgKzI4MywxMyBAQAogRVhQT1JUX1NZTUJPTChvbWFwZHNzX2RlZmF1bHRfZ2V0X3Jlc29sdXRpb24pOwogCiB2b2lkIGRlZmF1bHRfZ2V0X292ZXJsYXlfZmlmb190aHJlc2hvbGRzKGVudW0gb21hcF9wbGFuZSBwbGFuZSwKLQkJdTMyIGZpZm9fc2l6ZSwgZW51bSBvbWFwX2J1cnN0X3NpemUgKmJ1cnN0X3NpemUsCisJCXUzMiBmaWZvX3NpemUsIHUzMiBidXJzdF9zaXplLAogCQl1MzIgKmZpZm9fbG93LCB1MzIgKmZpZm9faGlnaCkKIHsKLQl1bnNpZ25lZCBidXJzdF9zaXplX2J5dGVzOworCXVuc2lnbmVkIGJ1Zl91bml0ID0gZHNzX2ZlYXRfZ2V0X2J1ZmZlcl9zaXplX3VuaXQoKTsKIAotCSpidXJzdF9zaXplID0gT01BUF9EU1NfQlVSU1RfMTZ4MzI7Ci0JYnVyc3Rfc2l6ZV9ieXRlcyA9IDE2ICogMzIgLyA4OwotCi0JKmZpZm9faGlnaCA9IGZpZm9fc2l6ZSAtIDE7Ci0JKmZpZm9fbG93ID0gZmlmb19zaXplIC0gYnVyc3Rfc2l6ZV9ieXRlczsKKwkqZmlmb19oaWdoID0gZmlmb19zaXplIC0gYnVmX3VuaXQ7CisJKmZpZm9fbG93ID0gZmlmb19zaXplIC0gYnVyc3Rfc2l6ZTsKIH0KIAogaW50IG9tYXBkc3NfZGVmYXVsdF9nZXRfcmVjb21tZW5kZWRfYnBwKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2RwaS5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHBpLmMKaW5kZXggZmY2YmQzMC4uZjA1M2IxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHBpLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHBpLmMKQEAgLTIzLDcgKzIzLDYgQEAKICNkZWZpbmUgRFNTX1NVQlNZU19OQU1FICJEUEkiCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CkBAIC0xMzAsOCArMTI5LDYgQEAKIAlib29sIGlzX3RmdDsKIAlpbnQgciA9IDA7CiAKLQlkc3NfY2xrX2VuYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLKTsKLQogCWRpc3BjX3NldF9wb2xfZnJlcShkc3NkZXYtPm1hbmFnZXItPmlkLCBkc3NkZXYtPnBhbmVsLmNvbmZpZywKIAkJCWRzc2Rldi0+cGFuZWwuYWNiaSwgZHNzZGV2LT5wYW5lbC5hY2IpOwogCkBAIC0xNDQsNyArMTQxLDcgQEAKIAkJciA9IGRwaV9zZXRfZGlzcGNfY2xrKGRzc2RldiwgaXNfdGZ0LCB0LT5waXhlbF9jbG9jayAqIDEwMDAsCiAJCQkJJmZjaywgJmxja19kaXYsICZwY2tfZGl2KTsKIAlpZiAocikKLQkJZ290byBlcnIwOworCQlyZXR1cm4gcjsKIAogCXBjayA9IGZjayAvIGxja19kaXYgLyBwY2tfZGl2IC8gMTAwMDsKIApAQCAtMTU4LDEyICsxNTUsMTAgQEAKIAogCWRpc3BjX3NldF9sY2RfdGltaW5ncyhkc3NkZXYtPm1hbmFnZXItPmlkLCB0KTsKIAotZXJyMDoKLQlkc3NfY2xrX2Rpc2FibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSyk7Ci0JcmV0dXJuIHI7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZHBpX2Jhc2ljX2luaXQoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQorc3RhdGljIHZvaWQgZHBpX2Jhc2ljX2luaXQoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQogewogCWJvb2wgaXNfdGZ0OwogCkBAIC0xNzUsOCArMTcwLDYgQEAKIAkJCU9NQVBfRFNTX0xDRF9ESVNQTEFZX1RGVCA6IE9NQVBfRFNTX0xDRF9ESVNQTEFZX1NUTik7CiAJZGlzcGNfc2V0X3RmdF9kYXRhX2xpbmVzKGRzc2Rldi0+bWFuYWdlci0+aWQsCiAJCQlkc3NkZXYtPnBoeS5kcGkuZGF0YV9saW5lcyk7Ci0KLQlyZXR1cm4gMDsKIH0KIAogaW50IG9tYXBkc3NfZHBpX2Rpc3BsYXlfZW5hYmxlKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKQEAgLTE4NiwzMSArMTc5LDM4IEBACiAJciA9IG9tYXBfZHNzX3N0YXJ0X2RldmljZShkc3NkZXYpOwogCWlmIChyKSB7CiAJCURTU0VSUigiZmFpbGVkIHRvIHN0YXJ0IGRldmljZVxuIik7Ci0JCWdvdG8gZXJyMDsKKwkJZ290byBlcnJfc3RhcnRfZGV2OwogCX0KIAogCWlmIChjcHVfaXNfb21hcDM0eHgoKSkgewogCQlyID0gcmVndWxhdG9yX2VuYWJsZShkcGkudmRkc19kc2lfcmVnKTsKIAkJaWYgKHIpCi0JCQlnb3RvIGVycjE7CisJCQlnb3RvIGVycl9yZWdfZW5hYmxlOwogCX0KIAotCWRzc19jbGtfZW5hYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0spOwotCi0JciA9IGRwaV9iYXNpY19pbml0KGRzc2Rldik7CisJciA9IGRzc19ydW50aW1lX2dldCgpOwogCWlmIChyKQotCQlnb3RvIGVycjI7CisJCWdvdG8gZXJyX2dldF9kc3M7CisKKwlyID0gZGlzcGNfcnVudGltZV9nZXQoKTsKKwlpZiAocikKKwkJZ290byBlcnJfZ2V0X2Rpc3BjOworCisJZHBpX2Jhc2ljX2luaXQoZHNzZGV2KTsKIAogCWlmIChkcGlfdXNlX2RzaV9wbGwoZHNzZGV2KSkgewotCQlkc3NfY2xrX2VuYWJsZShEU1NfQ0xLX1NZU0NLKTsKKwkJciA9IGRzaV9ydW50aW1lX2dldChkcGkuZHNpZGV2KTsKKwkJaWYgKHIpCisJCQlnb3RvIGVycl9nZXRfZHNpOworCiAJCXIgPSBkc2lfcGxsX2luaXQoZHBpLmRzaWRldiwgMCwgMSk7CiAJCWlmIChyKQotCQkJZ290byBlcnIzOworCQkJZ290byBlcnJfZHNpX3BsbF9pbml0OwogCX0KIAogCXIgPSBkcGlfc2V0X21vZGUoZHNzZGV2KTsKIAlpZiAocikKLQkJZ290byBlcnI0OworCQlnb3RvIGVycl9zZXRfbW9kZTsKIAogCW1kZWxheSgyKTsKIApAQCAtMjE4LDE5ICsyMTgsMjIgQEAKIAogCXJldHVybiAwOwogCi1lcnI0OgorZXJyX3NldF9tb2RlOgogCWlmIChkcGlfdXNlX2RzaV9wbGwoZHNzZGV2KSkKIAkJZHNpX3BsbF91bmluaXQoZHBpLmRzaWRldiwgdHJ1ZSk7Ci1lcnIzOgorZXJyX2RzaV9wbGxfaW5pdDoKIAlpZiAoZHBpX3VzZV9kc2lfcGxsKGRzc2RldikpCi0JCWRzc19jbGtfZGlzYWJsZShEU1NfQ0xLX1NZU0NLKTsKLWVycjI6Ci0JZHNzX2Nsa19kaXNhYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0spOworCQlkc2lfcnVudGltZV9wdXQoZHBpLmRzaWRldik7CitlcnJfZ2V0X2RzaToKKwlkaXNwY19ydW50aW1lX3B1dCgpOworZXJyX2dldF9kaXNwYzoKKwlkc3NfcnVudGltZV9wdXQoKTsKK2Vycl9nZXRfZHNzOgogCWlmIChjcHVfaXNfb21hcDM0eHgoKSkKIAkJcmVndWxhdG9yX2Rpc2FibGUoZHBpLnZkZHNfZHNpX3JlZyk7Ci1lcnIxOgorZXJyX3JlZ19lbmFibGU6CiAJb21hcF9kc3Nfc3RvcF9kZXZpY2UoZHNzZGV2KTsKLWVycjA6CitlcnJfc3RhcnRfZGV2OgogCXJldHVybiByOwogfQogRVhQT1JUX1NZTUJPTChvbWFwZHNzX2RwaV9kaXNwbGF5X2VuYWJsZSk7CkBAIC0yNDIsMTAgKzI0NSwxMSBAQAogCWlmIChkcGlfdXNlX2RzaV9wbGwoZHNzZGV2KSkgewogCQlkc3Nfc2VsZWN0X2Rpc3BjX2Nsa19zb3VyY2UoT01BUF9EU1NfQ0xLX1NSQ19GQ0spOwogCQlkc2lfcGxsX3VuaW5pdChkcGkuZHNpZGV2LCB0cnVlKTsKLQkJZHNzX2Nsa19kaXNhYmxlKERTU19DTEtfU1lTQ0spOworCQlkc2lfcnVudGltZV9wdXQoZHBpLmRzaWRldik7CiAJfQogCi0JZHNzX2Nsa19kaXNhYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0spOworCWRpc3BjX3J1bnRpbWVfcHV0KCk7CisJZHNzX3J1bnRpbWVfcHV0KCk7CiAKIAlpZiAoY3B1X2lzX29tYXAzNHh4KCkpCiAJCXJlZ3VsYXRvcl9kaXNhYmxlKGRwaS52ZGRzX2RzaV9yZWcpOwpAQCAtMjU3LDExICsyNjEsMjYgQEAKIHZvaWQgZHBpX3NldF90aW1pbmdzKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldiwKIAkJCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgKnRpbWluZ3MpCiB7CisJaW50IHI7CisKIAlEU1NEQkcoImRwaV9zZXRfdGltaW5nc1xuIik7CiAJZHNzZGV2LT5wYW5lbC50aW1pbmdzID0gKnRpbWluZ3M7CiAJaWYgKGRzc2Rldi0+c3RhdGUgPT0gT01BUF9EU1NfRElTUExBWV9BQ1RJVkUpIHsKKwkJciA9IGRzc19ydW50aW1lX2dldCgpOworCQlpZiAocikKKwkJCXJldHVybjsKKworCQlyID0gZGlzcGNfcnVudGltZV9nZXQoKTsKKwkJaWYgKHIpIHsKKwkJCWRzc19ydW50aW1lX3B1dCgpOworCQkJcmV0dXJuOworCQl9CisKIAkJZHBpX3NldF9tb2RlKGRzc2Rldik7CiAJCWRpc3BjX2dvKGRzc2Rldi0+bWFuYWdlci0+aWQpOworCisJCWRpc3BjX3J1bnRpbWVfcHV0KCk7CisJCWRzc19ydW50aW1lX3B1dCgpOwogCX0KIH0KIEVYUE9SVF9TWU1CT0woZHBpX3NldF90aW1pbmdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2RzaS5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNpLmMKaW5kZXggMzQ1NzU3Yy4uN2FkYmJlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNpLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNpLmMKQEAgLTM2LDYgKzM2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogCiAjaW5jbHVkZSA8dmlkZW8vb21hcGRzcy5oPgogI2luY2x1ZGUgPHBsYXQvY2xvY2suaD4KQEAgLTI2Nyw4ICsyNjgsMTIgQEAKIHN0cnVjdCBkc2lfZGF0YSB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIAl2b2lkIF9faW9tZW0JKmJhc2U7CisKIAlpbnQgaXJxOwogCisJc3RydWN0IGNsayAqZHNzX2NsazsKKwlzdHJ1Y3QgY2xrICpzeXNfY2xrOworCiAJdm9pZCAoKmRzaV9tdXhfcGFkcykoYm9vbCBlbmFibGUpOwogCiAJc3RydWN0IGRzaV9jbG9ja19pbmZvIGN1cnJlbnRfY2luZm87CkBAIC0zODksMTUgKzM5NCw2IEBACiAJcmV0dXJuIF9fcmF3X3JlYWRsKGRzaS0+YmFzZSArIGlkeC5pZHgpOwogfQogCi0KLXZvaWQgZHNpX3NhdmVfY29udGV4dCh2b2lkKQotewotfQotCi12b2lkIGRzaV9yZXN0b3JlX2NvbnRleHQodm9pZCkKLXsKLX0KLQogdm9pZCBkc2lfYnVzX2xvY2soc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQogewogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldiA9IGRzaV9nZXRfZHNpZGV2X2Zyb21fZHNzZGV2KGRzc2Rldik7CkBAIC00OTMsOSArNDg5LDE4IEBACiAJCQl0b3RhbF9ieXRlcyAqIDEwMDAgLyB0b3RhbF91cyk7CiB9CiAjZWxzZQotI2RlZmluZSBkc2lfcGVyZl9tYXJrX3NldHVwKHgpCi0jZGVmaW5lIGRzaV9wZXJmX21hcmtfc3RhcnQoeCkKLSNkZWZpbmUgZHNpX3BlcmZfc2hvdyh4LCB5KQorc3RhdGljIGlubGluZSB2b2lkIGRzaV9wZXJmX21hcmtfc2V0dXAoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2KQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHNpX3BlcmZfbWFya19zdGFydChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkc2lfcGVyZl9zaG93KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldiwKKwkJY29uc3QgY2hhciAqbmFtZSkKK3sKK30KICNlbmRpZgogCiBzdGF0aWMgdm9pZCBwcmludF9pcnFfc3RhdHVzKHUzMiBzdGF0dXMpCkBAIC0xMDM5LDEzICsxMDQ0LDI3IEBACiAJcmV0dXJuIGU7CiB9CiAKLS8qIERTSSBmdW5jIGNsb2NrLiB0aGlzIGNvdWxkIGFsc28gYmUgZHNpX3BsbF9oc2Rpdl9kc2lfY2xrICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZW5hYmxlX2Nsb2Nrcyhib29sIGVuYWJsZSkKK2ludCBkc2lfcnVudGltZV9nZXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2KQogewotCWlmIChlbmFibGUpCi0JCWRzc19jbGtfZW5hYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0spOwotCWVsc2UKLQkJZHNzX2Nsa19kaXNhYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0spOworCWludCByOworCXN0cnVjdCBkc2lfZGF0YSAqZHNpID0gZHNpX2dldF9kc2lkcnZfZGF0YShkc2lkZXYpOworCisJRFNTREJHKCJkc2lfcnVudGltZV9nZXRcbiIpOworCisJciA9IHBtX3J1bnRpbWVfZ2V0X3N5bmMoJmRzaS0+cGRldi0+ZGV2KTsKKwlXQVJOX09OKHIgPCAwKTsKKwlyZXR1cm4gciA8IDAgPyByIDogMDsKK30KKwordm9pZCBkc2lfcnVudGltZV9wdXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2KQoreworCXN0cnVjdCBkc2lfZGF0YSAqZHNpID0gZHNpX2dldF9kc2lkcnZfZGF0YShkc2lkZXYpOworCWludCByOworCisJRFNTREJHKCJkc2lfcnVudGltZV9wdXRcbiIpOworCisJciA9IHBtX3J1bnRpbWVfcHV0KCZkc2ktPnBkZXYtPmRldik7CisJV0FSTl9PTihyIDwgMCk7CiB9CiAKIC8qIHNvdXJjZSBjbG9jayBmb3IgRFNJIFBMTC4gdGhpcyBjb3VsZCBhbHNvIGJlIFBDTEtGUkVFICovCkBAIC0xMDU1LDkgKzEwNzQsOSBAQAogCXN0cnVjdCBkc2lfZGF0YSAqZHNpID0gZHNpX2dldF9kc2lkcnZfZGF0YShkc2lkZXYpOwogCiAJaWYgKGVuYWJsZSkKLQkJZHNzX2Nsa19lbmFibGUoRFNTX0NMS19TWVNDSyk7CisJCWNsa19lbmFibGUoZHNpLT5zeXNfY2xrKTsKIAllbHNlCi0JCWRzc19jbGtfZGlzYWJsZShEU1NfQ0xLX1NZU0NLKTsKKwkJY2xrX2Rpc2FibGUoZHNpLT5zeXNfY2xrKTsKIAogCWlmIChlbmFibGUgJiYgZHNpLT5wbGxfbG9ja2VkKSB7CiAJCWlmICh3YWl0X2Zvcl9iaXRfY2hhbmdlKGRzaWRldiwgRFNJX1BMTF9TVEFUVVMsIDEsIDEpICE9IDEpCkBAIC0xMTUwLDEwICsxMTY5LDExIEBACiB7CiAJdW5zaWduZWQgbG9uZyByOwogCWludCBkc2lfbW9kdWxlID0gZHNpX2dldF9kc2lkZXZfaWQoZHNpZGV2KTsKKwlzdHJ1Y3QgZHNpX2RhdGEgKmRzaSA9IGRzaV9nZXRfZHNpZHJ2X2RhdGEoZHNpZGV2KTsKIAogCWlmIChkc3NfZ2V0X2RzaV9jbGtfc291cmNlKGRzaV9tb2R1bGUpID09IE9NQVBfRFNTX0NMS19TUkNfRkNLKSB7CiAJCS8qIERTSSBGQ0xLIHNvdXJjZSBpcyBEU1NfQ0xLX0ZDSyAqLwotCQlyID0gZHNzX2Nsa19nZXRfcmF0ZShEU1NfQ0xLX0ZDSyk7CisJCXIgPSBjbGtfZ2V0X3JhdGUoZHNpLT5kc3NfY2xrKTsKIAl9IGVsc2UgewogCQkvKiBEU0kgRkNMSyBzb3VyY2UgaXMgZHNpX3BsbF9oc2Rpdl9kc2lfY2xrICovCiAJCXIgPSBkc2lfZ2V0X3BsbF9oc2Rpdl9kc2lfcmF0ZShkc2lkZXYpOwpAQCAtMTI2Miw3ICsxMjgyLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZiAoY2luZm8tPnVzZV9zeXNfY2xrKSB7Ci0JCWNpbmZvLT5jbGtpbiA9IGRzc19jbGtfZ2V0X3JhdGUoRFNTX0NMS19TWVNDSyk7CisJCWNpbmZvLT5jbGtpbiA9IGNsa19nZXRfcmF0ZShkc2ktPnN5c19jbGspOwogCQkvKiBYWFggaXQgaXMgdW5jbGVhciBpZiBoaWdoZnJlcSBzaG91bGQgYmUgdXNlZAogCQkgKiB3aXRoIERTU19TWVNfQ0xLIHNvdXJjZSBhbHNvICovCiAJCWNpbmZvLT5oaWdoZnJlcSA9IDA7CkBAIC0xMzExLDcgKzEzMzEsNyBAQAogCWludCBtYXRjaCA9IDA7CiAJdW5zaWduZWQgbG9uZyBkc3Nfc3lzX2NsaywgbWF4X2Rzc19mY2s7CiAKLQlkc3Nfc3lzX2NsayA9IGRzc19jbGtfZ2V0X3JhdGUoRFNTX0NMS19TWVNDSyk7CisJZHNzX3N5c19jbGsgPSBjbGtfZ2V0X3JhdGUoZHNpLT5zeXNfY2xrKTsKIAogCW1heF9kc3NfZmNrID0gZHNzX2ZlYXRfZ2V0X3BhcmFtX21heChGRUFUX1BBUkFNX0RTU19GQ0spOwogCkBAIC0xNjAxLDcgKzE2MjEsNiBAQAogCQlkc2ktPnZkZHNfZHNpX3JlZyA9IHZkZHNfZHNpOwogCX0KIAotCWVuYWJsZV9jbG9ja3MoMSk7CiAJZHNpX2VuYWJsZV9wbGxfY2xvY2soZHNpZGV2LCAxKTsKIAkvKgogCSAqIE5vdGU6IFNDUCBDTEsgaXMgbm90IHJlcXVpcmVkIG9uIE9NQVAzLCBidXQgaXQgaXMgcmVxdWlyZWQgb24gT01BUDQuCkBAIC0xNjUzLDcgKzE2NzIsNiBAQAogCX0KIGVycjA6CiAJZHNpX2Rpc2FibGVfc2NwX2Nsayhkc2lkZXYpOwotCWVuYWJsZV9jbG9ja3MoMCk7CiAJZHNpX2VuYWJsZV9wbGxfY2xvY2soZHNpZGV2LCAwKTsKIAlyZXR1cm4gcjsKIH0KQEAgLTE2NzEsNyArMTY4OSw2IEBACiAJfQogCiAJZHNpX2Rpc2FibGVfc2NwX2Nsayhkc2lkZXYpOwotCWVuYWJsZV9jbG9ja3MoMCk7CiAJZHNpX2VuYWJsZV9wbGxfY2xvY2soZHNpZGV2LCAwKTsKIAogCURTU0RCRygiUExMIHVuaW5pdCBkb25lXG4iKTsKQEAgLTE2ODgsNyArMTcwNSw4IEBACiAJZGlzcGNfY2xrX3NyYyA9IGRzc19nZXRfZGlzcGNfY2xrX3NvdXJjZSgpOwogCWRzaV9jbGtfc3JjID0gZHNzX2dldF9kc2lfY2xrX3NvdXJjZShkc2lfbW9kdWxlKTsKIAotCWVuYWJsZV9jbG9ja3MoMSk7CisJaWYgKGRzaV9ydW50aW1lX2dldChkc2lkZXYpKQorCQlyZXR1cm47CiAKIAlzZXFfcHJpbnRmKHMsCSItIERTSSVkIFBMTCAtXG4iLCBkc2lfbW9kdWxlICsgMSk7CiAKQEAgLTE3MzEsNyArMTc0OSw3IEBACiAKIAlzZXFfcHJpbnRmKHMsCSJMUF9DTEtcdFx0JWx1XG4iLCBjaW5mby0+bHBfY2xrKTsKIAotCWVuYWJsZV9jbG9ja3MoMCk7CisJZHNpX3J1bnRpbWVfcHV0KGRzaWRldik7CiB9CiAKIHZvaWQgZHNpX2R1bXBfY2xvY2tzKHN0cnVjdCBzZXFfZmlsZSAqcykKQEAgLTE4NzMsNyArMTg5MSw4IEBACiB7CiAjZGVmaW5lIERVTVBSRUcocikgc2VxX3ByaW50ZihzLCAiJS0zNXMgJTA4eFxuIiwgI3IsIGRzaV9yZWFkX3JlZyhkc2lkZXYsIHIpKQogCi0JZHNzX2Nsa19lbmFibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSyk7CisJaWYgKGRzaV9ydW50aW1lX2dldChkc2lkZXYpKQorCQlyZXR1cm47CiAJZHNpX2VuYWJsZV9zY3BfY2xrKGRzaWRldik7CiAKIAlEVU1QUkVHKERTSV9SRVZJU0lPTik7CkBAIC0xOTQ3LDcgKzE5NjYsNyBAQAogCURVTVBSRUcoRFNJX1BMTF9DT05GSUdVUkFUSU9OMik7CiAKIAlkc2lfZGlzYWJsZV9zY3BfY2xrKGRzaWRldik7Ci0JZHNzX2Nsa19kaXNhYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0spOworCWRzaV9ydW50aW1lX3B1dChkc2lkZXYpOwogI3VuZGVmIERVTVBSRUcKIH0KIApAQCAtMjQ2MywyOCArMjQ4Miw2IEBACiAJCWRzaS0+ZHNpX211eF9wYWRzKGZhbHNlKTsKIH0KIAotc3RhdGljIGludCBfZHNpX3dhaXRfcmVzZXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2KQotewotCWludCB0ID0gMDsKLQotCXdoaWxlIChSRUdfR0VUKGRzaWRldiwgRFNJX1NZU1NUQVRVUywgMCwgMCkgPT0gMCkgewotCQlpZiAoKyt0ID4gNSkgewotCQkJRFNTRVJSKCJzb2Z0IHJlc2V0IGZhaWxlZFxuIik7Ci0JCQlyZXR1cm4gLUVOT0RFVjsKLQkJfQotCQl1ZGVsYXkoMSk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX2RzaV9yZXNldChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYpCi17Ci0JLyogU29mdCByZXNldCAqLwotCVJFR19GTERfTU9EKGRzaWRldiwgRFNJX1NZU0NPTkZJRywgMSwgMSwgMSk7Ci0JcmV0dXJuIF9kc2lfd2FpdF9yZXNldChkc2lkZXYpOwotfQotCiBzdGF0aWMgdm9pZCBkc2lfY29uZmlnX3R4X2ZpZm8oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2LAogCQllbnVtIGZpZm9fc2l6ZSBzaXplMSwgZW51bSBmaWZvX3NpemUgc2l6ZTIsCiAJCWVudW0gZmlmb19zaXplIHNpemUzLCBlbnVtIGZpZm9fc2l6ZSBzaXplNCkKQEAgLTMzODYsNiArMzM4MywxMCBAQAogCWRzaV91bnJlZ2lzdGVyX2lzcl9jaW8oZHNpZGV2LCBkc2lfY29tcGxldGlvbl9oYW5kbGVyLCAmY29tcGxldGlvbiwKIAkJCURTSV9DSU9fSVJRX1VMUFNBQ1RJVkVOT1RfQUxMMCk7CiAKKwkvKiBSZXNldCBMQU5FeF9VTFBTX1NJRzIgKi8KKwlSRUdfRkxEX01PRChkc2lkZXYsIERTSV9DT01QTEVYSU9fQ0ZHMiwgKDAgPDwgMCkgfCAoMCA8PCAxKSB8ICgwIDw8IDIpLAorCQk3LCA1KTsKKwogCWRzaV9jaW9fcG93ZXIoZHNpZGV2LCBEU0lfQ09NUExFWElPX1BPV0VSX1VMUFMpOwogCiAJZHNpX2lmX2VuYWJsZShkc2lkZXYsIGZhbHNlKTsKQEAgLTQxOTgsMjIgKzQxOTksNiBAQAogCWRzaV9wbGxfdW5pbml0KGRzaWRldiwgZGlzY29ubmVjdF9sYW5lcyk7CiB9CiAKLXN0YXRpYyBpbnQgZHNpX2NvcmVfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYpCi17Ci0JLyogQXV0b2lkbGUgKi8KLQlSRUdfRkxEX01PRChkc2lkZXYsIERTSV9TWVNDT05GSUcsIDEsIDAsIDApOwotCi0JLyogRU5XQUtFVVAgKi8KLQlSRUdfRkxEX01PRChkc2lkZXYsIERTSV9TWVNDT05GSUcsIDEsIDIsIDIpOwotCi0JLyogU0lETEVNT0RFIHNtYXJ0LWlkbGUgKi8KLQlSRUdfRkxEX01PRChkc2lkZXYsIERTSV9TWVNDT05GSUcsIDIsIDQsIDMpOwotCi0JX2RzaV9pbml0aWFsaXplX2lycShkc2lkZXYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIGludCBvbWFwZHNzX2RzaV9kaXNwbGF5X2VuYWJsZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCiB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2ID0gZHNpX2dldF9kc2lkZXZfZnJvbV9kc3NkZXYoZHNzZGV2KTsKQEAgLTQyMjksMzcgKzQyMTQsMzcgQEAKIAlyID0gb21hcF9kc3Nfc3RhcnRfZGV2aWNlKGRzc2Rldik7CiAJaWYgKHIpIHsKIAkJRFNTRVJSKCJmYWlsZWQgdG8gc3RhcnQgZGV2aWNlXG4iKTsKLQkJZ290byBlcnIwOworCQlnb3RvIGVycl9zdGFydF9kZXY7CiAJfQogCi0JZW5hYmxlX2Nsb2NrcygxKTsKKwlyID0gZHNpX3J1bnRpbWVfZ2V0KGRzaWRldik7CisJaWYgKHIpCisJCWdvdG8gZXJyX2dldF9kc2k7CisKIAlkc2lfZW5hYmxlX3BsbF9jbG9jayhkc2lkZXYsIDEpOwogCi0JciA9IF9kc2lfcmVzZXQoZHNpZGV2KTsKLQlpZiAocikKLQkJZ290byBlcnIxOwotCi0JZHNpX2NvcmVfaW5pdChkc2lkZXYpOworCV9kc2lfaW5pdGlhbGl6ZV9pcnEoZHNpZGV2KTsKIAogCXIgPSBkc2lfZGlzcGxheV9pbml0X2Rpc3BjKGRzc2Rldik7CiAJaWYgKHIpCi0JCWdvdG8gZXJyMTsKKwkJZ290byBlcnJfaW5pdF9kaXNwYzsKIAogCXIgPSBkc2lfZGlzcGxheV9pbml0X2RzaShkc3NkZXYpOwogCWlmIChyKQotCQlnb3RvIGVycjI7CisJCWdvdG8gZXJyX2luaXRfZHNpOwogCiAJbXV0ZXhfdW5sb2NrKCZkc2ktPmxvY2spOwogCiAJcmV0dXJuIDA7CiAKLWVycjI6CitlcnJfaW5pdF9kc2k6CiAJZHNpX2Rpc3BsYXlfdW5pbml0X2Rpc3BjKGRzc2Rldik7Ci1lcnIxOgotCWVuYWJsZV9jbG9ja3MoMCk7CitlcnJfaW5pdF9kaXNwYzoKIAlkc2lfZW5hYmxlX3BsbF9jbG9jayhkc2lkZXYsIDApOworCWRzaV9ydW50aW1lX3B1dChkc2lkZXYpOworZXJyX2dldF9kc2k6CiAJb21hcF9kc3Nfc3RvcF9kZXZpY2UoZHNzZGV2KTsKLWVycjA6CitlcnJfc3RhcnRfZGV2OgogCW11dGV4X3VubG9jaygmZHNpLT5sb2NrKTsKIAlEU1NEQkcoImRzaV9kaXNwbGF5X2VuYWJsZSBGQUlMRURcbiIpOwogCXJldHVybiByOwpAQCAtNDI3OCwxMSArNDI2MywxNiBAQAogCiAJbXV0ZXhfbG9jaygmZHNpLT5sb2NrKTsKIAorCWRzaV9zeW5jX3ZjKGRzaWRldiwgMCk7CisJZHNpX3N5bmNfdmMoZHNpZGV2LCAxKTsKKwlkc2lfc3luY192Yyhkc2lkZXYsIDIpOworCWRzaV9zeW5jX3ZjKGRzaWRldiwgMyk7CisKIAlkc2lfZGlzcGxheV91bmluaXRfZGlzcGMoZHNzZGV2KTsKIAogCWRzaV9kaXNwbGF5X3VuaW5pdF9kc2koZHNzZGV2LCBkaXNjb25uZWN0X2xhbmVzLCBlbnRlcl91bHBzKTsKIAotCWVuYWJsZV9jbG9ja3MoMCk7CisJZHNpX3J1bnRpbWVfcHV0KGRzaWRldik7CiAJZHNpX2VuYWJsZV9wbGxfY2xvY2soZHNpZGV2LCAwKTsKIAogCW9tYXBfZHNzX3N0b3BfZGV2aWNlKGRzc2Rldik7CkBAIC00MzAyLDE2ICs0MjkyLDExIEBACiBFWFBPUlRfU1lNQk9MKG9tYXBkc3NfZHNpX2VuYWJsZV90ZSk7CiAKIHZvaWQgZHNpX2dldF9vdmVybGF5X2ZpZm9fdGhyZXNob2xkcyhlbnVtIG9tYXBfcGxhbmUgcGxhbmUsCi0JCXUzMiBmaWZvX3NpemUsIGVudW0gb21hcF9idXJzdF9zaXplICpidXJzdF9zaXplLAorCQl1MzIgZmlmb19zaXplLCB1MzIgYnVyc3Rfc2l6ZSwKIAkJdTMyICpmaWZvX2xvdywgdTMyICpmaWZvX2hpZ2gpCiB7Ci0JdW5zaWduZWQgYnVyc3Rfc2l6ZV9ieXRlczsKLQotCSpidXJzdF9zaXplID0gT01BUF9EU1NfQlVSU1RfMTZ4MzI7Ci0JYnVyc3Rfc2l6ZV9ieXRlcyA9IDE2ICogMzIgLyA4OwotCi0JKmZpZm9faGlnaCA9IGZpZm9fc2l6ZSAtIGJ1cnN0X3NpemVfYnl0ZXM7Ci0JKmZpZm9fbG93ID0gZmlmb19zaXplIC0gYnVyc3Rfc2l6ZV9ieXRlcyAqIDI7CisJKmZpZm9faGlnaCA9IGZpZm9fc2l6ZSAtIGJ1cnN0X3NpemU7CisJKmZpZm9fbG93ID0gZmlmb19zaXplIC0gYnVyc3Rfc2l6ZSAqIDI7CiB9CiAKIGludCBkc2lfaW5pdF9kaXNwbGF5KHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKQEAgLTQ0MzcsNyArNDQyMiw0NyBAQAogCWRzaS0+bHBkaXZfbWF4ID0gZHNzX2ZlYXRfZ2V0X3BhcmFtX21heChGRUFUX1BBUkFNX0RTSVBMTF9MUERJVik7CiB9CiAKLXN0YXRpYyBpbnQgZHNpX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2KQorc3RhdGljIGludCBkc2lfZ2V0X2Nsb2NrcyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYpCit7CisJc3RydWN0IGRzaV9kYXRhICpkc2kgPSBkc2lfZ2V0X2RzaWRydl9kYXRhKGRzaWRldik7CisJc3RydWN0IGNsayAqY2xrOworCisJY2xrID0gY2xrX2dldCgmZHNpZGV2LT5kZXYsICJmY2siKTsKKwlpZiAoSVNfRVJSKGNsaykpIHsKKwkJRFNTRVJSKCJjYW4ndCBnZXQgZmNrXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKKwl9CisKKwlkc2ktPmRzc19jbGsgPSBjbGs7CisKKwlpZiAoY3B1X2lzX29tYXAzNHh4KCkgfHwgY3B1X2lzX29tYXAzNjMwKCkpCisJCWNsayA9IGNsa19nZXQoJmRzaWRldi0+ZGV2LCAiZHNzMl9hbHdvbl9mY2siKTsKKwllbHNlCisJCWNsayA9IGNsa19nZXQoJmRzaWRldi0+ZGV2LCAic3lzX2NsayIpOworCWlmIChJU19FUlIoY2xrKSkgeworCQlEU1NFUlIoImNhbid0IGdldCBzeXNfY2xrXG4iKTsKKwkJY2xrX3B1dChkc2ktPmRzc19jbGspOworCQlkc2ktPmRzc19jbGsgPSBOVUxMOworCQlyZXR1cm4gUFRSX0VSUihjbGspOworCX0KKworCWRzaS0+c3lzX2NsayA9IGNsazsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkc2lfcHV0X2Nsb2NrcyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYpCit7CisJc3RydWN0IGRzaV9kYXRhICpkc2kgPSBkc2lfZ2V0X2RzaWRydl9kYXRhKGRzaWRldik7CisKKwlpZiAoZHNpLT5kc3NfY2xrKQorCQljbGtfcHV0KGRzaS0+ZHNzX2Nsayk7CisJaWYgKGRzaS0+c3lzX2NsaykKKwkJY2xrX3B1dChkc2ktPnN5c19jbGspOworfQorCisvKiBEU0kxIEhXIElQIGluaXRpYWxpc2F0aW9uICovCitzdGF0aWMgaW50IG9tYXBfZHNpMWh3X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldikKIHsKIAlzdHJ1Y3Qgb21hcF9kaXNwbGF5X3BsYXRmb3JtX2RhdGEgKmRzc19wbGF0X2RhdGE7CiAJc3RydWN0IG9tYXBfZHNzX2JvYXJkX2luZm8gKmJvYXJkX2luZm87CkBAIC00NDQ5LDcgKzQ0NzQsNyBAQAogCWRzaSA9IGt6YWxsb2Moc2l6ZW9mKCpkc2kpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWRzaSkgewogCQlyID0gLUVOT01FTTsKLQkJZ290byBlcnIwOworCQlnb3RvIGVycl9hbGxvYzsKIAl9CiAKIAlkc2ktPnBkZXYgPSBkc2lkZXY7CkBAIC00NDcyLDYgKzQ0OTcsMTIgQEAKIAltdXRleF9pbml0KCZkc2ktPmxvY2spOwogCXNlbWFfaW5pdCgmZHNpLT5idXNfbG9jaywgMSk7CiAKKwlyID0gZHNpX2dldF9jbG9ja3MoZHNpZGV2KTsKKwlpZiAocikKKwkJZ290byBlcnJfZ2V0X2NsazsKKworCXBtX3J1bnRpbWVfZW5hYmxlKCZkc2lkZXYtPmRldik7CisKIAlJTklUX0RFTEFZRURfV09SS19ERUZFUlJBQkxFKCZkc2ktPmZyYW1lZG9uZV90aW1lb3V0X3dvcmssCiAJCQlkc2lfZnJhbWVkb25lX3RpbWVvdXRfd29ya19jYWxsYmFjayk7CiAKQEAgLTQ0ODQsMjYgKzQ1MTUsMjYgQEAKIAlpZiAoIWRzaV9tZW0pIHsKIAkJRFNTRVJSKCJjYW4ndCBnZXQgSU9SRVNPVVJDRV9NRU0gRFNJXG4iKTsKIAkJciA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyMTsKKwkJZ290byBlcnJfaW9yZW1hcDsKIAl9CiAJZHNpLT5iYXNlID0gaW9yZW1hcChkc2lfbWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShkc2lfbWVtKSk7CiAJaWYgKCFkc2ktPmJhc2UpIHsKIAkJRFNTRVJSKCJjYW4ndCBpb3JlbWFwIERTSVxuIik7CiAJCXIgPSAtRU5PTUVNOwotCQlnb3RvIGVycjE7CisJCWdvdG8gZXJyX2lvcmVtYXA7CiAJfQogCWRzaS0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShkc2ktPnBkZXYsIDApOwogCWlmIChkc2ktPmlycSA8IDApIHsKIAkJRFNTRVJSKCJwbGF0Zm9ybV9nZXRfaXJxIGZhaWxlZFxuIik7CiAJCXIgPSAtRU5PREVWOwotCQlnb3RvIGVycjI7CisJCWdvdG8gZXJyX2dldF9pcnE7CiAJfQogCiAJciA9IHJlcXVlc3RfaXJxKGRzaS0+aXJxLCBvbWFwX2RzaV9pcnFfaGFuZGxlciwgSVJRRl9TSEFSRUQsCiAJCWRldl9uYW1lKCZkc2lkZXYtPmRldiksIGRzaS0+cGRldik7CiAJaWYgKHIgPCAwKSB7CiAJCURTU0VSUigicmVxdWVzdF9pcnEgZmFpbGVkXG4iKTsKLQkJZ290byBlcnIyOworCQlnb3RvIGVycl9nZXRfaXJxOwogCX0KIAogCS8qIERTSSBWQ3MgaW5pdGlhbGl6YXRpb24gKi8KQEAgLTQ1MTUsNyArNDU0Niw5IEBACiAKIAlkc2lfY2FsY19jbG9ja19wYXJhbV9yYW5nZXMoZHNpZGV2KTsKIAotCWVuYWJsZV9jbG9ja3MoMSk7CisJciA9IGRzaV9ydW50aW1lX2dldChkc2lkZXYpOworCWlmIChyKQorCQlnb3RvIGVycl9nZXRfZHNpOwogCiAJcmV2ID0gZHNpX3JlYWRfcmVnKGRzaWRldiwgRFNJX1JFVklTSU9OKTsKIAlkZXZfZGJnKCZkc2lkZXYtPmRldiwgIk9NQVAgRFNJIHJldiAlZC4lZFxuIiwKQEAgLTQ1MjMsMjEgKzQ1NTYsMzIgQEAKIAogCWRzaS0+bnVtX2RhdGFfbGFuZXMgPSBkc2lfZ2V0X251bV9kYXRhX2xhbmVzKGRzaWRldik7CiAKLQllbmFibGVfY2xvY2tzKDApOworCWRzaV9ydW50aW1lX3B1dChkc2lkZXYpOwogCiAJcmV0dXJuIDA7Ci1lcnIyOgorCitlcnJfZ2V0X2RzaToKKwlmcmVlX2lycShkc2ktPmlycSwgZHNpLT5wZGV2KTsKK2Vycl9nZXRfaXJxOgogCWlvdW5tYXAoZHNpLT5iYXNlKTsKLWVycjE6CitlcnJfaW9yZW1hcDoKKwlwbV9ydW50aW1lX2Rpc2FibGUoJmRzaWRldi0+ZGV2KTsKK2Vycl9nZXRfY2xrOgogCWtmcmVlKGRzaSk7Ci1lcnIwOgorZXJyX2FsbG9jOgogCXJldHVybiByOwogfQogCi1zdGF0aWMgdm9pZCBkc2lfZXhpdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYpCitzdGF0aWMgaW50IG9tYXBfZHNpMWh3X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYpCiB7CiAJc3RydWN0IGRzaV9kYXRhICpkc2kgPSBkc2lfZ2V0X2RzaWRydl9kYXRhKGRzaWRldik7CiAKKwlXQVJOX09OKGRzaS0+c2NwX2Nsa19yZWZjb3VudCA+IDApOworCisJcG1fcnVudGltZV9kaXNhYmxlKCZkc2lkZXYtPmRldik7CisKKwlkc2lfcHV0X2Nsb2Nrcyhkc2lkZXYpOworCiAJaWYgKGRzaS0+dmRkc19kc2lfcmVnICE9IE5VTEwpIHsKIAkJaWYgKGRzaS0+dmRkc19kc2lfZW5hYmxlZCkgewogCQkJcmVndWxhdG9yX2Rpc2FibGUoZHNpLT52ZGRzX2RzaV9yZWcpOwpAQCAtNDU1MywzMSArNDU5Nyw0OCBAQAogCiAJa2ZyZWUoZHNpKTsKIAotCURTU0RCRygib21hcF9kc2lfZXhpdFxuIik7CisJcmV0dXJuIDA7CiB9CiAKLS8qIERTSTEgSFcgSVAgaW5pdGlhbGlzYXRpb24gKi8KLXN0YXRpYyBpbnQgb21hcF9kc2kxaHdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2KQorc3RhdGljIGludCBkc2lfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QgZHNpX2RhdGEgKmRzaSA9IGRzaV9nZXRfZHNpZHJ2X2RhdGEodG9fcGxhdGZvcm1fZGV2aWNlKGRldikpOworCisJY2xrX2Rpc2FibGUoZHNpLT5kc3NfY2xrKTsKKworCWRpc3BjX3J1bnRpbWVfcHV0KCk7CisJZHNzX3J1bnRpbWVfcHV0KCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkc2lfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBkc2lfZGF0YSAqZHNpID0gZHNpX2dldF9kc2lkcnZfZGF0YSh0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KSk7CiAJaW50IHI7CiAKLQlyID0gZHNpX2luaXQoZHNpZGV2KTsKLQlpZiAocikgewotCQlEU1NFUlIoIkZhaWxlZCB0byBpbml0aWFsaXplIERTSVxuIik7Ci0JCWdvdG8gZXJyX2RzaTsKLQl9Ci1lcnJfZHNpOgorCXIgPSBkc3NfcnVudGltZV9nZXQoKTsKKwlpZiAocikKKwkJZ290byBlcnJfZ2V0X2RzczsKKworCXIgPSBkaXNwY19ydW50aW1lX2dldCgpOworCWlmIChyKQorCQlnb3RvIGVycl9nZXRfZGlzcGM7CisKKwljbGtfZW5hYmxlKGRzaS0+ZHNzX2Nsayk7CisKKwlyZXR1cm4gMDsKKworZXJyX2dldF9kaXNwYzoKKwlkc3NfcnVudGltZV9wdXQoKTsKK2Vycl9nZXRfZHNzOgogCXJldHVybiByOwogfQogCi1zdGF0aWMgaW50IG9tYXBfZHNpMWh3X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYpCi17Ci0Jc3RydWN0IGRzaV9kYXRhICpkc2kgPSBkc2lfZ2V0X2RzaWRydl9kYXRhKGRzaWRldik7Ci0KLQlkc2lfZXhpdChkc2lkZXYpOwotCVdBUk5fT04oZHNpLT5zY3BfY2xrX3JlZmNvdW50ID4gMCk7Ci0JcmV0dXJuIDA7Ci19CitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgZHNpX3BtX29wcyA9IHsKKwkucnVudGltZV9zdXNwZW5kID0gZHNpX3J1bnRpbWVfc3VzcGVuZCwKKwkucnVudGltZV9yZXN1bWUgPSBkc2lfcnVudGltZV9yZXN1bWUsCit9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvbWFwX2RzaTFod19kcml2ZXIgPSB7CiAJLnByb2JlICAgICAgICAgID0gb21hcF9kc2kxaHdfcHJvYmUsCkBAIC00NTg1LDYgKzQ2NDYsNyBAQAogCS5kcml2ZXIgICAgICAgICA9IHsKIAkJLm5hbWUgICA9ICJvbWFwZHNzX2RzaTEiLAogCQkub3duZXIgID0gVEhJU19NT0RVTEUsCisJCS5wbQk9ICZkc2lfcG1fb3BzLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kc3MuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzcy5jCmluZGV4IGQ5NDg5ZDUuLjBmOWMzYTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzcy5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzcy5jCkBAIC0yOCw2ICsyOCw4IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KIAogI2luY2x1ZGUgPHZpZGVvL29tYXBkc3MuaD4KICNpbmNsdWRlIDxwbGF0L2Nsb2NrLmg+CkBAIC01OSwxNSArNjEsOSBAQAogc3RhdGljIHN0cnVjdCB7CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsKIAl2b2lkIF9faW9tZW0gICAgKmJhc2U7Ci0JaW50ICAgICAgICAgICAgIGN0eF9pZDsKIAogCXN0cnVjdCBjbGsJKmRwbGw0X200X2NrOwotCXN0cnVjdCBjbGsJKmRzc19pY2s7Ci0Jc3RydWN0IGNsawkqZHNzX2ZjazsKLQlzdHJ1Y3QgY2xrCSpkc3Nfc3lzX2NsazsKLQlzdHJ1Y3QgY2xrCSpkc3NfdHZfZmNrOwotCXN0cnVjdCBjbGsJKmRzc192aWRlb19mY2s7Ci0JdW5zaWduZWQJbnVtX2Nsa3NfZW5hYmxlZDsKKwlzdHJ1Y3QgY2xrCSpkc3NfY2xrOwogCiAJdW5zaWduZWQgbG9uZwljYWNoZV9yZXFfcGNrOwogCXVuc2lnbmVkIGxvbmcJY2FjaGVfcHJhdGU7CkBAIC03OCw2ICs3NCw3IEBACiAJZW51bSBvbWFwX2Rzc19jbGtfc291cmNlIGRpc3BjX2Nsa19zb3VyY2U7CiAJZW51bSBvbWFwX2Rzc19jbGtfc291cmNlIGxjZF9jbGtfc291cmNlW01BWF9EU1NfTENEX01BTkFHRVJTXTsKIAorCWJvb2wJCWN0eF92YWxpZDsKIAl1MzIJCWN0eFtEU1NfU1pfUkVHUyAvIHNpemVvZih1MzIpXTsKIH0gZHNzOwogCkBAIC04NywxMyArODQsNiBAQAogCVtPTUFQX0RTU19DTEtfU1JDX0ZDS10JCQk9ICJEU1NfRkNLIiwKIH07CiAKLXN0YXRpYyB2b2lkIGRzc19jbGtfZW5hYmxlX2FsbF9ub19jdHgodm9pZCk7Ci1zdGF0aWMgdm9pZCBkc3NfY2xrX2Rpc2FibGVfYWxsX25vX2N0eCh2b2lkKTsKLXN0YXRpYyB2b2lkIGRzc19jbGtfZW5hYmxlX25vX2N0eChlbnVtIGRzc19jbG9jayBjbGtzKTsKLXN0YXRpYyB2b2lkIGRzc19jbGtfZGlzYWJsZV9ub19jdHgoZW51bSBkc3NfY2xvY2sgY2xrcyk7Ci0KLXN0YXRpYyBpbnQgX29tYXBfZHNzX3dhaXRfcmVzZXQodm9pZCk7Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBkc3Nfd3JpdGVfcmVnKGNvbnN0IHN0cnVjdCBkc3NfcmVnIGlkeCwgdTMyIHZhbCkKIHsKIAlfX3Jhd193cml0ZWwodmFsLCBkc3MuYmFzZSArIGlkeC5pZHgpOwpAQCAtMTA5LDEyICs5OSwxMCBAQAogI2RlZmluZSBSUihyZWcpIFwKIAlkc3Nfd3JpdGVfcmVnKERTU18jI3JlZywgZHNzLmN0eFsoRFNTXyMjcmVnKS5pZHggLyBzaXplb2YodTMyKV0pCiAKLXZvaWQgZHNzX3NhdmVfY29udGV4dCh2b2lkKQorc3RhdGljIHZvaWQgZHNzX3NhdmVfY29udGV4dCh2b2lkKQogewotCWlmIChjcHVfaXNfb21hcDI0eHgoKSkKLQkJcmV0dXJuOworCURTU0RCRygiZHNzX3NhdmVfY29udGV4dFxuIik7CiAKLQlTUihTWVNDT05GSUcpOwogCVNSKENPTlRST0wpOwogCiAJaWYgKGRzc19mZWF0X2dldF9zdXBwb3J0ZWRfZGlzcGxheXMoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpICYKQEAgLTEyMiwxNCArMTEwLDE5IEBACiAJCVNSKFNESV9DT05UUk9MKTsKIAkJU1IoUExMX0NPTlRST0wpOwogCX0KKworCWRzcy5jdHhfdmFsaWQgPSB0cnVlOworCisJRFNTREJHKCJjb250ZXh0IHNhdmVkXG4iKTsKIH0KIAotdm9pZCBkc3NfcmVzdG9yZV9jb250ZXh0KHZvaWQpCitzdGF0aWMgdm9pZCBkc3NfcmVzdG9yZV9jb250ZXh0KHZvaWQpCiB7Ci0JaWYgKF9vbWFwX2Rzc193YWl0X3Jlc2V0KCkpCi0JCURTU0VSUigiRFNTIG5vdCBjb21pbmcgb3V0IG9mIHJlc2V0IGFmdGVyIHNsZWVwXG4iKTsKKwlEU1NEQkcoImRzc19yZXN0b3JlX2NvbnRleHRcbiIpOwogCi0JUlIoU1lTQ09ORklHKTsKKwlpZiAoIWRzcy5jdHhfdmFsaWQpCisJCXJldHVybjsKKwogCVJSKENPTlRST0wpOwogCiAJaWYgKGRzc19mZWF0X2dldF9zdXBwb3J0ZWRfZGlzcGxheXMoT01BUF9EU1NfQ0hBTk5FTF9MQ0QpICYKQEAgLTEzNyw2ICsxMzAsOCBAQAogCQlSUihTRElfQ09OVFJPTCk7CiAJCVJSKFBMTF9DT05UUk9MKTsKIAl9CisKKwlEU1NEQkcoImNvbnRleHQgcmVzdG9yZWRcbiIpOwogfQogCiAjdW5kZWYgU1IKQEAgLTIzNCw2ICsyMjksNyBAQAogCXJldHVybiBkc3NfZ2VuZXJpY19jbGtfc291cmNlX25hbWVzW2Nsa19zcmNdOwogfQogCisKIHZvaWQgZHNzX2R1bXBfY2xvY2tzKHN0cnVjdCBzZXFfZmlsZSAqcykKIHsKIAl1bnNpZ25lZCBsb25nIGRwbGw0X2NrX3JhdGU7CkBAIC0yNDEsMTMgKzIzNywxNCBAQAogCWNvbnN0IGNoYXIgKmZjbGtfbmFtZSwgKmZjbGtfcmVhbF9uYW1lOwogCXVuc2lnbmVkIGxvbmcgZmNsa19yYXRlOwogCi0JZHNzX2Nsa19lbmFibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSyk7CisJaWYgKGRzc19ydW50aW1lX2dldCgpKQorCQlyZXR1cm47CiAKIAlzZXFfcHJpbnRmKHMsICItIERTUyAtXG4iKTsKIAogCWZjbGtfbmFtZSA9IGRzc19nZXRfZ2VuZXJpY19jbGtfc291cmNlX25hbWUoT01BUF9EU1NfQ0xLX1NSQ19GQ0spOwogCWZjbGtfcmVhbF9uYW1lID0gZHNzX2ZlYXRfZ2V0X2Nsa19zb3VyY2VfbmFtZShPTUFQX0RTU19DTEtfU1JDX0ZDSyk7Ci0JZmNsa19yYXRlID0gZHNzX2Nsa19nZXRfcmF0ZShEU1NfQ0xLX0ZDSyk7CisJZmNsa19yYXRlID0gY2xrX2dldF9yYXRlKGRzcy5kc3NfY2xrKTsKIAogCWlmIChkc3MuZHBsbDRfbTRfY2spIHsKIAkJZHBsbDRfY2tfcmF0ZSA9IGNsa19nZXRfcmF0ZShjbGtfZ2V0X3BhcmVudChkc3MuZHBsbDRfbTRfY2spKTsKQEAgLTI3MywxNCArMjcwLDE1IEBACiAJCQkJZmNsa19yYXRlKTsKIAl9CiAKLQlkc3NfY2xrX2Rpc2FibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSyk7CisJZHNzX3J1bnRpbWVfcHV0KCk7CiB9CiAKIHZvaWQgZHNzX2R1bXBfcmVncyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCiB7CiAjZGVmaW5lIERVTVBSRUcocikgc2VxX3ByaW50ZihzLCAiJS0zNXMgJTA4eFxuIiwgI3IsIGRzc19yZWFkX3JlZyhyKSkKIAotCWRzc19jbGtfZW5hYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0spOworCWlmIChkc3NfcnVudGltZV9nZXQoKSkKKwkJcmV0dXJuOwogCiAJRFVNUFJFRyhEU1NfUkVWSVNJT04pOwogCURVTVBSRUcoRFNTX1NZU0NPTkZJRyk7CkBAIC0yOTQsNyArMjkyLDcgQEAKIAkJRFVNUFJFRyhEU1NfU0RJX1NUQVRVUyk7CiAJfQogCi0JZHNzX2Nsa19kaXNhYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0spOworCWRzc19ydW50aW1lX3B1dCgpOwogI3VuZGVmIERVTVBSRUcKIH0KIApAQCAtNDM3LDcgKzQzNSw3IEBACiAJfSBlbHNlIHsKIAkJaWYgKGNpbmZvLT5mY2tfZGl2ICE9IDApCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQkJY2luZm8tPmZjayA9IGRzc19jbGtfZ2V0X3JhdGUoRFNTX0NMS19GQ0spOworCQljaW5mby0+ZmNrID0gY2xrX2dldF9yYXRlKGRzcy5kc3NfY2xrKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTQ2Nyw3ICs0NjUsNyBAQAogCiBpbnQgZHNzX2dldF9jbG9ja19kaXYoc3RydWN0IGRzc19jbG9ja19pbmZvICpjaW5mbykKIHsKLQljaW5mby0+ZmNrID0gZHNzX2Nsa19nZXRfcmF0ZShEU1NfQ0xLX0ZDSyk7CisJY2luZm8tPmZjayA9IGNsa19nZXRfcmF0ZShkc3MuZHNzX2Nsayk7CiAKIAlpZiAoZHNzLmRwbGw0X200X2NrKSB7CiAJCXVuc2lnbmVkIGxvbmcgcHJhdGU7CkBAIC01MTIsNyArNTEwLDcgQEAKIAogCW1heF9kc3NfZmNrID0gZHNzX2ZlYXRfZ2V0X3BhcmFtX21heChGRUFUX1BBUkFNX0RTU19GQ0spOwogCi0JZmNrID0gZHNzX2Nsa19nZXRfcmF0ZShEU1NfQ0xLX0ZDSyk7CisJZmNrID0gY2xrX2dldF9yYXRlKGRzcy5kc3NfY2xrKTsKIAlpZiAocmVxX3BjayA9PSBkc3MuY2FjaGVfcmVxX3BjayAmJgogCQkJKChjcHVfaXNfb21hcDM0eHgoKSAmJiBwcmF0ZSA9PSBkc3MuY2FjaGVfcHJhdGUpIHx8CiAJCQkgZHNzLmNhY2hlX2Rzc19jaW5mby5mY2sgPT0gZmNrKSkgewpAQCAtNTM5LDcgKzUzNyw3IEBACiAJaWYgKGRzcy5kcGxsNF9tNF9jayA9PSBOVUxMKSB7CiAJCXN0cnVjdCBkaXNwY19jbG9ja19pbmZvIGN1cl9kaXNwYzsKIAkJLyogWFhYIGNhbiB3ZSBjaGFuZ2UgdGhlIGNsb2NrIG9uIG9tYXAyPyAqLwotCQlmY2sgPSBkc3NfY2xrX2dldF9yYXRlKERTU19DTEtfRkNLKTsKKwkJZmNrID0gY2xrX2dldF9yYXRlKGRzcy5kc3NfY2xrKTsKIAkJZmNrX2RpdiA9IDE7CiAKIAkJZGlzcGNfZmluZF9jbGtfZGl2cyhpc190ZnQsIHJlcV9wY2ssIGZjaywgJmN1cl9kaXNwYyk7CkBAIC02MTYsMjggKzYxNCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX29tYXBfZHNzX3dhaXRfcmVzZXQodm9pZCkKLXsKLQlpbnQgdCA9IDA7Ci0KLQl3aGlsZSAoUkVHX0dFVChEU1NfU1lTU1RBVFVTLCAwLCAwKSA9PSAwKSB7Ci0JCWlmICgrK3QgPiAxMDAwKSB7Ci0JCQlEU1NFUlIoInNvZnQgcmVzZXQgZmFpbGVkXG4iKTsKLQkJCXJldHVybiAtRU5PREVWOwotCQl9Ci0JCXVkZWxheSgxKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfb21hcF9kc3NfcmVzZXQodm9pZCkKLXsKLQkvKiBTb2Z0IHJlc2V0ICovCi0JUkVHX0ZMRF9NT0QoRFNTX1NZU0NPTkZJRywgMSwgMSwgMSk7Ci0JcmV0dXJuIF9vbWFwX2Rzc193YWl0X3Jlc2V0KCk7Ci19Ci0KIHZvaWQgZHNzX3NldF92ZW5jX291dHB1dChlbnVtIG9tYXBfZHNzX3ZlbmNfdHlwZSB0eXBlKQogewogCWludCBsID0gMDsKQEAgLTY2Myw0OCArNjM5LDEyNyBAQAogCVJFR19GTERfTU9EKERTU19DT05UUk9MLCBoZG1pLCAxNSwgMTUpOwkvKiBWRU5DX0hETUlfU1dJVENIICovCiB9CiAKLXN0YXRpYyBpbnQgZHNzX2luaXQodm9pZCkKK3N0YXRpYyBpbnQgZHNzX2dldF9jbG9ja3Modm9pZCkKK3sKKwlzdHJ1Y3QgY2xrICpjbGs7CisJaW50IHI7CisKKwljbGsgPSBjbGtfZ2V0KCZkc3MucGRldi0+ZGV2LCAiZmNrIik7CisJaWYgKElTX0VSUihjbGspKSB7CisJCURTU0VSUigiY2FuJ3QgZ2V0IGNsb2NrIGZja1xuIik7CisJCXIgPSBQVFJfRVJSKGNsayk7CisJCWdvdG8gZXJyOworCX0KKworCWRzcy5kc3NfY2xrID0gY2xrOworCisJaWYgKGNwdV9pc19vbWFwMzR4eCgpKSB7CisJCWNsayA9IGNsa19nZXQoTlVMTCwgImRwbGw0X200X2NrIik7CisJCWlmIChJU19FUlIoY2xrKSkgeworCQkJRFNTRVJSKCJGYWlsZWQgdG8gZ2V0IGRwbGw0X200X2NrXG4iKTsKKwkJCXIgPSBQVFJfRVJSKGNsayk7CisJCQlnb3RvIGVycjsKKwkJfQorCX0gZWxzZSBpZiAoY3B1X2lzX29tYXA0NHh4KCkpIHsKKwkJY2xrID0gY2xrX2dldChOVUxMLCAiZHBsbF9wZXJfbTV4Ml9jayIpOworCQlpZiAoSVNfRVJSKGNsaykpIHsKKwkJCURTU0VSUigiRmFpbGVkIHRvIGdldCBkcGxsX3Blcl9tNXgyX2NrXG4iKTsKKwkJCXIgPSBQVFJfRVJSKGNsayk7CisJCQlnb3RvIGVycjsKKwkJfQorCX0gZWxzZSB7IC8qIG9tYXAyNHh4ICovCisJCWNsayA9IE5VTEw7CisJfQorCisJZHNzLmRwbGw0X200X2NrID0gY2xrOworCisJcmV0dXJuIDA7CisKK2VycjoKKwlpZiAoZHNzLmRzc19jbGspCisJCWNsa19wdXQoZHNzLmRzc19jbGspOworCWlmIChkc3MuZHBsbDRfbTRfY2spCisJCWNsa19wdXQoZHNzLmRwbGw0X200X2NrKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgdm9pZCBkc3NfcHV0X2Nsb2Nrcyh2b2lkKQoreworCWlmIChkc3MuZHBsbDRfbTRfY2spCisJCWNsa19wdXQoZHNzLmRwbGw0X200X2NrKTsKKwljbGtfcHV0KGRzcy5kc3NfY2xrKTsKK30KKworc3RydWN0IGNsayAqZHNzX2dldF9pY2sodm9pZCkKK3sKKwlyZXR1cm4gY2xrX2dldCgmZHNzLnBkZXYtPmRldiwgImljayIpOworfQorCitpbnQgZHNzX3J1bnRpbWVfZ2V0KHZvaWQpCiB7CiAJaW50IHI7Ci0JdTMyIHJldjsKKworCURTU0RCRygiZHNzX3J1bnRpbWVfZ2V0XG4iKTsKKworCXIgPSBwbV9ydW50aW1lX2dldF9zeW5jKCZkc3MucGRldi0+ZGV2KTsKKwlXQVJOX09OKHIgPCAwKTsKKwlyZXR1cm4gciA8IDAgPyByIDogMDsKK30KKwordm9pZCBkc3NfcnVudGltZV9wdXQodm9pZCkKK3sKKwlpbnQgcjsKKworCURTU0RCRygiZHNzX3J1bnRpbWVfcHV0XG4iKTsKKworCXIgPSBwbV9ydW50aW1lX3B1dCgmZHNzLnBkZXYtPmRldik7CisJV0FSTl9PTihyIDwgMCk7Cit9CisKKy8qIERFQlVHRlMgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19GUykgJiYgZGVmaW5lZChDT05GSUdfT01BUDJfRFNTX0RFQlVHX1NVUFBPUlQpCit2b2lkIGRzc19kZWJ1Z19kdW1wX2Nsb2NrcyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCit7CisJZHNzX2R1bXBfY2xvY2tzKHMpOworCWRpc3BjX2R1bXBfY2xvY2tzKHMpOworI2lmZGVmIENPTkZJR19PTUFQMl9EU1NfRFNJCisJZHNpX2R1bXBfY2xvY2tzKHMpOworI2VuZGlmCit9CisjZW5kaWYKKworLyogRFNTIEhXIElQIGluaXRpYWxpc2F0aW9uICovCitzdGF0aWMgaW50IG9tYXBfZHNzaHdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKIAlzdHJ1Y3QgcmVzb3VyY2UgKmRzc19tZW07Ci0Jc3RydWN0IGNsayAqZHBsbDRfbTRfY2s7CisJdTMyIHJldjsKKwlpbnQgcjsKKworCWRzcy5wZGV2ID0gcGRldjsKIAogCWRzc19tZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UoZHNzLnBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlpZiAoIWRzc19tZW0pIHsKIAkJRFNTRVJSKCJjYW4ndCBnZXQgSU9SRVNPVVJDRV9NRU0gRFNTXG4iKTsKIAkJciA9IC1FSU5WQUw7Ci0JCWdvdG8gZmFpbDA7CisJCWdvdG8gZXJyX2lvcmVtYXA7CiAJfQogCWRzcy5iYXNlID0gaW9yZW1hcChkc3NfbWVtLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShkc3NfbWVtKSk7CiAJaWYgKCFkc3MuYmFzZSkgewogCQlEU1NFUlIoImNhbid0IGlvcmVtYXAgRFNTXG4iKTsKIAkJciA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbDA7CisJCWdvdG8gZXJyX2lvcmVtYXA7CiAJfQogCi0JLyogZGlzYWJsZSBMQ0QgYW5kIERJR0lUIG91dHB1dC4gVGhpcyBzZWVtcyB0byBmaXggdGhlIHN5bmNsb3N0Ci0JICogcHJvYmxlbSB0aGF0IHdlIGdldCwgaWYgdGhlIGJvb3Rsb2FkZXIgc3RhcnRzIHRoZSBEU1MgYW5kCi0JICogdGhlIGtlcm5lbCByZXNldHMgaXQgKi8KLQlvbWFwX3dyaXRlbChvbWFwX3JlYWRsKDB4NDgwNTA0NDApICYgfjB4MywgMHg0ODA1MDQ0MCk7CisJciA9IGRzc19nZXRfY2xvY2tzKCk7CisJaWYgKHIpCisJCWdvdG8gZXJyX2Nsb2NrczsKIAotI2lmZGVmIENPTkZJR19PTUFQMl9EU1NfU0xFRVBfQkVGT1JFX1JFU0VUCi0JLyogV2UgbmVlZCB0byB3YWl0IGhlcmUgYSBiaXQsIG90aGVyd2lzZSB3ZSBzb21ldGltZXMgc3RhcnQgdG8KLQkgKiBnZXQgc3luY2xvc3QgZXJyb3JzLCBhbmQgYWZ0ZXIgdGhhdCBvbmx5IHBvd2VyIGN5Y2xlIHdpbGwKLQkgKiByZXN0b3JlIERTUyBmdW5jdGlvbmFsaXR5LiBJIGhhdmUgbm8gaWRlYSB3aHkgdGhpcyBoYXBwZW5zLgotCSAqIEFuZCB3ZSBoYXZlIHRvIHdhaXQgX2JlZm9yZV8gcmVzZXR0aW5nIHRoZSBEU1MsIGJ1dCBhZnRlcgotCSAqIGVuYWJsaW5nIGNsb2Nrcy4KLQkgKgotCSAqIFRoaXMgYnVnIHdhcyBhdCBsZWFzdCBwcmVzZW50IG9uIE9NQVAzNDMwLiBJdCdzIHVua25vd24KLQkgKiBpZiBpdCBoYXBwZW5zIG9uIE9NQVAyIG9yIE9NQVAzNjMwLgotCSAqLwotCW1zbGVlcCg1MCk7Ci0jZW5kaWYKKwlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKIAotCV9vbWFwX2Rzc19yZXNldCgpOwotCi0JLyogYXV0b2lkbGUgKi8KLQlSRUdfRkxEX01PRChEU1NfU1lTQ09ORklHLCAxLCAwLCAwKTsKKwlyID0gZHNzX3J1bnRpbWVfZ2V0KCk7CisJaWYgKHIpCisJCWdvdG8gZXJyX3J1bnRpbWVfZ2V0OwogCiAJLyogU2VsZWN0IERQTEwgKi8KIAlSRUdfRkxEX01PRChEU1NfQ09OVFJPTCwgMCwgMCwgMCk7CkBAIC03MTQsNDA0ICs3NjksMTIgQEAKIAlSRUdfRkxEX01PRChEU1NfQ09OVFJPTCwgMSwgMywgMyk7CS8qIHZlbmMgY2xvY2sgNHggZW5hYmxlICovCiAJUkVHX0ZMRF9NT0QoRFNTX0NPTlRST0wsIDAsIDIsIDIpOwkvKiB2ZW5jIGNsb2NrIG1vZGUgPSBub3JtYWwgKi8KICNlbmRpZgotCWlmIChjcHVfaXNfb21hcDM0eHgoKSkgewotCQlkcGxsNF9tNF9jayA9IGNsa19nZXQoTlVMTCwgImRwbGw0X200X2NrIik7Ci0JCWlmIChJU19FUlIoZHBsbDRfbTRfY2spKSB7Ci0JCQlEU1NFUlIoIkZhaWxlZCB0byBnZXQgZHBsbDRfbTRfY2tcbiIpOwotCQkJciA9IFBUUl9FUlIoZHBsbDRfbTRfY2spOwotCQkJZ290byBmYWlsMTsKLQkJfQotCX0gZWxzZSBpZiAoY3B1X2lzX29tYXA0NHh4KCkpIHsKLQkJZHBsbDRfbTRfY2sgPSBjbGtfZ2V0KE5VTEwsICJkcGxsX3Blcl9tNXgyX2NrIik7Ci0JCWlmIChJU19FUlIoZHBsbDRfbTRfY2spKSB7Ci0JCQlEU1NFUlIoIkZhaWxlZCB0byBnZXQgZHBsbDRfbTRfY2tcbiIpOwotCQkJciA9IFBUUl9FUlIoZHBsbDRfbTRfY2spOwotCQkJZ290byBmYWlsMTsKLQkJfQotCX0gZWxzZSB7IC8qIG9tYXAyNHh4ICovCi0JCWRwbGw0X200X2NrID0gTlVMTDsKLQl9Ci0KLQlkc3MuZHBsbDRfbTRfY2sgPSBkcGxsNF9tNF9jazsKLQogCWRzcy5kc2lfY2xrX3NvdXJjZVswXSA9IE9NQVBfRFNTX0NMS19TUkNfRkNLOwogCWRzcy5kc2lfY2xrX3NvdXJjZVsxXSA9IE9NQVBfRFNTX0NMS19TUkNfRkNLOwogCWRzcy5kaXNwY19jbGtfc291cmNlID0gT01BUF9EU1NfQ0xLX1NSQ19GQ0s7CiAJZHNzLmxjZF9jbGtfc291cmNlWzBdID0gT01BUF9EU1NfQ0xLX1NSQ19GQ0s7CiAJZHNzLmxjZF9jbGtfc291cmNlWzFdID0gT01BUF9EU1NfQ0xLX1NSQ19GQ0s7CiAKLQlkc3Nfc2F2ZV9jb250ZXh0KCk7Ci0KLQlyZXYgPSBkc3NfcmVhZF9yZWcoRFNTX1JFVklTSU9OKTsKLQlwcmludGsoS0VSTl9JTkZPICJPTUFQIERTUyByZXYgJWQuJWRcbiIsCi0JCQlGTERfR0VUKHJldiwgNywgNCksIEZMRF9HRVQocmV2LCAzLCAwKSk7Ci0KLQlyZXR1cm4gMDsKLQotZmFpbDE6Ci0JaW91bm1hcChkc3MuYmFzZSk7Ci1mYWlsMDoKLQlyZXR1cm4gcjsKLX0KLQotc3RhdGljIHZvaWQgZHNzX2V4aXQodm9pZCkKLXsKLQlpZiAoZHNzLmRwbGw0X200X2NrKQotCQljbGtfcHV0KGRzcy5kcGxsNF9tNF9jayk7Ci0KLQlpb3VubWFwKGRzcy5iYXNlKTsKLX0KLQotLyogQ09OVEVYVCAqLwotc3RhdGljIGludCBkc3NfZ2V0X2N0eF9pZCh2b2lkKQotewotCXN0cnVjdCBvbWFwX2Rpc3BsYXlfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBkc3MucGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0JaW50IHI7Ci0KLQlpZiAoIXBkYXRhLT5ib2FyZF9kYXRhLT5nZXRfbGFzdF9vZmZfb25fdHJhbnNhY3Rpb25faWQpCi0JCXJldHVybiAwOwotCXIgPSBwZGF0YS0+Ym9hcmRfZGF0YS0+Z2V0X2xhc3Rfb2ZmX29uX3RyYW5zYWN0aW9uX2lkKCZkc3MucGRldi0+ZGV2KTsKLQlpZiAociA8IDApIHsKLQkJZGV2X2VycigmZHNzLnBkZXYtPmRldiwgImdldHRpbmcgdHJhbnNhY3Rpb24gSUQgZmFpbGVkLCAiCi0JCQkJIndpbGwgZm9yY2UgY29udGV4dCByZXN0b3JlXG4iKTsKLQkJciA9IC0xOwotCX0KLQlyZXR1cm4gcjsKLX0KLQotaW50IGRzc19uZWVkX2N0eF9yZXN0b3JlKHZvaWQpCi17Ci0JaW50IGlkID0gZHNzX2dldF9jdHhfaWQoKTsKLQotCWlmIChpZCA8IDAgfHwgaWQgIT0gZHNzLmN0eF9pZCkgewotCQlEU1NEQkcoImN0eCBpZCAlZCAtPiBpZCAlZFxuIiwKLQkJCQlkc3MuY3R4X2lkLCBpZCk7Ci0JCWRzcy5jdHhfaWQgPSBpZDsKLQkJcmV0dXJuIDE7Ci0JfSBlbHNlIHsKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBzYXZlX2FsbF9jdHgodm9pZCkKLXsKLQlEU1NEQkcoInNhdmUgY29udGV4dFxuIik7Ci0KLQlkc3NfY2xrX2VuYWJsZV9ub19jdHgoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSyk7Ci0KLQlkc3Nfc2F2ZV9jb250ZXh0KCk7Ci0JZGlzcGNfc2F2ZV9jb250ZXh0KCk7Ci0jaWZkZWYgQ09ORklHX09NQVAyX0RTU19EU0kKLQlkc2lfc2F2ZV9jb250ZXh0KCk7Ci0jZW5kaWYKLQotCWRzc19jbGtfZGlzYWJsZV9ub19jdHgoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlc3RvcmVfYWxsX2N0eCh2b2lkKQotewotCURTU0RCRygicmVzdG9yZSBjb250ZXh0XG4iKTsKLQotCWRzc19jbGtfZW5hYmxlX2FsbF9ub19jdHgoKTsKLQotCWRzc19yZXN0b3JlX2NvbnRleHQoKTsKLQlkaXNwY19yZXN0b3JlX2NvbnRleHQoKTsKLSNpZmRlZiBDT05GSUdfT01BUDJfRFNTX0RTSQotCWRzaV9yZXN0b3JlX2NvbnRleHQoKTsKLSNlbmRpZgotCi0JZHNzX2Nsa19kaXNhYmxlX2FsbF9ub19jdHgoKTsKLX0KLQotc3RhdGljIGludCBkc3NfZ2V0X2Nsb2NrKHN0cnVjdCBjbGsgKipjbG9jaywgY29uc3QgY2hhciAqY2xrX25hbWUpCi17Ci0Jc3RydWN0IGNsayAqY2xrOwotCi0JY2xrID0gY2xrX2dldCgmZHNzLnBkZXYtPmRldiwgY2xrX25hbWUpOwotCi0JaWYgKElTX0VSUihjbGspKSB7Ci0JCURTU0VSUigiY2FuJ3QgZ2V0IGNsb2NrICVzIiwgY2xrX25hbWUpOwotCQlyZXR1cm4gUFRSX0VSUihjbGspOwotCX0KLQotCSpjbG9jayA9IGNsazsKLQotCURTU0RCRygiY2xrICVzLCByYXRlICVsZFxuIiwgY2xrX25hbWUsIGNsa19nZXRfcmF0ZShjbGspKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGRzc19nZXRfY2xvY2tzKHZvaWQpCi17Ci0JaW50IHI7Ci0Jc3RydWN0IG9tYXBfZGlzcGxheV9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IGRzcy5wZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQotCWRzcy5kc3NfaWNrID0gTlVMTDsKLQlkc3MuZHNzX2ZjayA9IE5VTEw7Ci0JZHNzLmRzc19zeXNfY2xrID0gTlVMTDsKLQlkc3MuZHNzX3R2X2ZjayA9IE5VTEw7Ci0JZHNzLmRzc192aWRlb19mY2sgPSBOVUxMOwotCi0JciA9IGRzc19nZXRfY2xvY2soJmRzcy5kc3NfaWNrLCAiaWNrIik7Ci0JaWYgKHIpCi0JCWdvdG8gZXJyOwotCi0JciA9IGRzc19nZXRfY2xvY2soJmRzcy5kc3NfZmNrLCAiZmNrIik7Ci0JaWYgKHIpCi0JCWdvdG8gZXJyOwotCi0JaWYgKCFwZGF0YS0+b3B0X2Nsb2NrX2F2YWlsYWJsZSkgewotCQlyID0gLUVOT0RFVjsKLQkJZ290byBlcnI7Ci0JfQotCi0JaWYgKHBkYXRhLT5vcHRfY2xvY2tfYXZhaWxhYmxlKCJzeXNfY2xrIikpIHsKLQkJciA9IGRzc19nZXRfY2xvY2soJmRzcy5kc3Nfc3lzX2NsaywgInN5c19jbGsiKTsKLQkJaWYgKHIpCi0JCQlnb3RvIGVycjsKLQl9Ci0KLQlpZiAocGRhdGEtPm9wdF9jbG9ja19hdmFpbGFibGUoInR2X2NsayIpKSB7Ci0JCXIgPSBkc3NfZ2V0X2Nsb2NrKCZkc3MuZHNzX3R2X2ZjaywgInR2X2NsayIpOwotCQlpZiAocikKLQkJCWdvdG8gZXJyOwotCX0KLQotCWlmIChwZGF0YS0+b3B0X2Nsb2NrX2F2YWlsYWJsZSgidmlkZW9fY2xrIikpIHsKLQkJciA9IGRzc19nZXRfY2xvY2soJmRzcy5kc3NfdmlkZW9fZmNrLCAidmlkZW9fY2xrIik7Ci0JCWlmIChyKQotCQkJZ290byBlcnI7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLWVycjoKLQlpZiAoZHNzLmRzc19pY2spCi0JCWNsa19wdXQoZHNzLmRzc19pY2spOwotCWlmIChkc3MuZHNzX2ZjaykKLQkJY2xrX3B1dChkc3MuZHNzX2Zjayk7Ci0JaWYgKGRzcy5kc3Nfc3lzX2NsaykKLQkJY2xrX3B1dChkc3MuZHNzX3N5c19jbGspOwotCWlmIChkc3MuZHNzX3R2X2ZjaykKLQkJY2xrX3B1dChkc3MuZHNzX3R2X2Zjayk7Ci0JaWYgKGRzcy5kc3NfdmlkZW9fZmNrKQotCQljbGtfcHV0KGRzcy5kc3NfdmlkZW9fZmNrKTsKLQotCXJldHVybiByOwotfQotCi1zdGF0aWMgdm9pZCBkc3NfcHV0X2Nsb2Nrcyh2b2lkKQotewotCWlmIChkc3MuZHNzX3ZpZGVvX2ZjaykKLQkJY2xrX3B1dChkc3MuZHNzX3ZpZGVvX2Zjayk7Ci0JaWYgKGRzcy5kc3NfdHZfZmNrKQotCQljbGtfcHV0KGRzcy5kc3NfdHZfZmNrKTsKLQlpZiAoZHNzLmRzc19zeXNfY2xrKQotCQljbGtfcHV0KGRzcy5kc3Nfc3lzX2Nsayk7Ci0JY2xrX3B1dChkc3MuZHNzX2Zjayk7Ci0JY2xrX3B1dChkc3MuZHNzX2ljayk7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgZHNzX2Nsa19nZXRfcmF0ZShlbnVtIGRzc19jbG9jayBjbGspCi17Ci0Jc3dpdGNoIChjbGspIHsKLQljYXNlIERTU19DTEtfSUNLOgotCQlyZXR1cm4gY2xrX2dldF9yYXRlKGRzcy5kc3NfaWNrKTsKLQljYXNlIERTU19DTEtfRkNLOgotCQlyZXR1cm4gY2xrX2dldF9yYXRlKGRzcy5kc3NfZmNrKTsKLQljYXNlIERTU19DTEtfU1lTQ0s6Ci0JCXJldHVybiBjbGtfZ2V0X3JhdGUoZHNzLmRzc19zeXNfY2xrKTsKLQljYXNlIERTU19DTEtfVFZGQ0s6Ci0JCXJldHVybiBjbGtfZ2V0X3JhdGUoZHNzLmRzc190dl9mY2spOwotCWNhc2UgRFNTX0NMS19WSURGQ0s6Ci0JCXJldHVybiBjbGtfZ2V0X3JhdGUoZHNzLmRzc192aWRlb19mY2spOwotCX0KLQotCUJVRygpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdW5zaWduZWQgY291bnRfY2xrX2JpdHMoZW51bSBkc3NfY2xvY2sgY2xrcykKLXsKLQl1bnNpZ25lZCBudW1fY2xrcyA9IDA7Ci0KLQlpZiAoY2xrcyAmIERTU19DTEtfSUNLKQotCQkrK251bV9jbGtzOwotCWlmIChjbGtzICYgRFNTX0NMS19GQ0spCi0JCSsrbnVtX2Nsa3M7Ci0JaWYgKGNsa3MgJiBEU1NfQ0xLX1NZU0NLKQotCQkrK251bV9jbGtzOwotCWlmIChjbGtzICYgRFNTX0NMS19UVkZDSykKLQkJKytudW1fY2xrczsKLQlpZiAoY2xrcyAmIERTU19DTEtfVklERkNLKQotCQkrK251bV9jbGtzOwotCi0JcmV0dXJuIG51bV9jbGtzOwotfQotCi1zdGF0aWMgdm9pZCBkc3NfY2xrX2VuYWJsZV9ub19jdHgoZW51bSBkc3NfY2xvY2sgY2xrcykKLXsKLQl1bnNpZ25lZCBudW1fY2xrcyA9IGNvdW50X2Nsa19iaXRzKGNsa3MpOwotCi0JaWYgKGNsa3MgJiBEU1NfQ0xLX0lDSykKLQkJY2xrX2VuYWJsZShkc3MuZHNzX2ljayk7Ci0JaWYgKGNsa3MgJiBEU1NfQ0xLX0ZDSykKLQkJY2xrX2VuYWJsZShkc3MuZHNzX2Zjayk7Ci0JaWYgKChjbGtzICYgRFNTX0NMS19TWVNDSykgJiYgZHNzLmRzc19zeXNfY2xrKQotCQljbGtfZW5hYmxlKGRzcy5kc3Nfc3lzX2Nsayk7Ci0JaWYgKChjbGtzICYgRFNTX0NMS19UVkZDSykgJiYgZHNzLmRzc190dl9mY2spCi0JCWNsa19lbmFibGUoZHNzLmRzc190dl9mY2spOwotCWlmICgoY2xrcyAmIERTU19DTEtfVklERkNLKSAmJiBkc3MuZHNzX3ZpZGVvX2ZjaykKLQkJY2xrX2VuYWJsZShkc3MuZHNzX3ZpZGVvX2Zjayk7Ci0KLQlkc3MubnVtX2Nsa3NfZW5hYmxlZCArPSBudW1fY2xrczsKLX0KLQotdm9pZCBkc3NfY2xrX2VuYWJsZShlbnVtIGRzc19jbG9jayBjbGtzKQotewotCWJvb2wgY2hlY2tfY3R4ID0gZHNzLm51bV9jbGtzX2VuYWJsZWQgPT0gMDsKLQotCWRzc19jbGtfZW5hYmxlX25vX2N0eChjbGtzKTsKLQotCS8qCi0JICogSEFDSzogT24gb21hcDQgdGhlIHJlZ2lzdGVycyBtYXkgbm90IGJlIGFjY2Vzc2libGUgcmlnaHQgYWZ0ZXIKLQkgKiBlbmFibGluZyB0aGUgY2xvY2tzLiBBdCBzb21lIHBvaW50IHRoaXMgd2lsbCBiZSBoYW5kbGVkIGJ5Ci0JICogcG1fcnVudGltZSwgYnV0IGZvciB0aGUgdGltZSBiZWdpbiB0aGlzIHNob3VsZCBtYWtlIHRoaW5ncyB3b3JrLgotCSAqLwotCWlmIChjcHVfaXNfb21hcDQ0eHgoKSAmJiBjaGVja19jdHgpCi0JCXVkZWxheSgxMCk7Ci0KLQlpZiAoY2hlY2tfY3R4ICYmIGNwdV9pc19vbWFwMzR4eCgpICYmIGRzc19uZWVkX2N0eF9yZXN0b3JlKCkpCi0JCXJlc3RvcmVfYWxsX2N0eCgpOwotfQotCi1zdGF0aWMgdm9pZCBkc3NfY2xrX2Rpc2FibGVfbm9fY3R4KGVudW0gZHNzX2Nsb2NrIGNsa3MpCi17Ci0JdW5zaWduZWQgbnVtX2Nsa3MgPSBjb3VudF9jbGtfYml0cyhjbGtzKTsKLQotCWlmIChjbGtzICYgRFNTX0NMS19JQ0spCi0JCWNsa19kaXNhYmxlKGRzcy5kc3NfaWNrKTsKLQlpZiAoY2xrcyAmIERTU19DTEtfRkNLKQotCQljbGtfZGlzYWJsZShkc3MuZHNzX2Zjayk7Ci0JaWYgKChjbGtzICYgRFNTX0NMS19TWVNDSykgJiYgZHNzLmRzc19zeXNfY2xrKQotCQljbGtfZGlzYWJsZShkc3MuZHNzX3N5c19jbGspOwotCWlmICgoY2xrcyAmIERTU19DTEtfVFZGQ0spICYmIGRzcy5kc3NfdHZfZmNrKQotCQljbGtfZGlzYWJsZShkc3MuZHNzX3R2X2Zjayk7Ci0JaWYgKChjbGtzICYgRFNTX0NMS19WSURGQ0spICYmIGRzcy5kc3NfdmlkZW9fZmNrKQotCQljbGtfZGlzYWJsZShkc3MuZHNzX3ZpZGVvX2Zjayk7Ci0KLQlkc3MubnVtX2Nsa3NfZW5hYmxlZCAtPSBudW1fY2xrczsKLX0KLQotdm9pZCBkc3NfY2xrX2Rpc2FibGUoZW51bSBkc3NfY2xvY2sgY2xrcykKLXsKLQlpZiAoY3B1X2lzX29tYXAzNHh4KCkpIHsKLQkJdW5zaWduZWQgbnVtX2Nsa3MgPSBjb3VudF9jbGtfYml0cyhjbGtzKTsKLQotCQlCVUdfT04oZHNzLm51bV9jbGtzX2VuYWJsZWQgPCBudW1fY2xrcyk7Ci0KLQkJaWYgKGRzcy5udW1fY2xrc19lbmFibGVkID09IG51bV9jbGtzKQotCQkJc2F2ZV9hbGxfY3R4KCk7Ci0JfQotCi0JZHNzX2Nsa19kaXNhYmxlX25vX2N0eChjbGtzKTsKLX0KLQotc3RhdGljIHZvaWQgZHNzX2Nsa19lbmFibGVfYWxsX25vX2N0eCh2b2lkKQotewotCWVudW0gZHNzX2Nsb2NrIGNsa3M7Ci0KLQljbGtzID0gRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSyB8IERTU19DTEtfU1lTQ0sgfCBEU1NfQ0xLX1RWRkNLOwotCWlmIChjcHVfaXNfb21hcDM0eHgoKSkKLQkJY2xrcyB8PSBEU1NfQ0xLX1ZJREZDSzsKLQlkc3NfY2xrX2VuYWJsZV9ub19jdHgoY2xrcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGRzc19jbGtfZGlzYWJsZV9hbGxfbm9fY3R4KHZvaWQpCi17Ci0JZW51bSBkc3NfY2xvY2sgY2xrczsKLQotCWNsa3MgPSBEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLIHwgRFNTX0NMS19TWVNDSyB8IERTU19DTEtfVFZGQ0s7Ci0JaWYgKGNwdV9pc19vbWFwMzR4eCgpKQotCQljbGtzIHw9IERTU19DTEtfVklERkNLOwotCWRzc19jbGtfZGlzYWJsZV9ub19jdHgoY2xrcyk7Ci19Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19GUykgJiYgZGVmaW5lZChDT05GSUdfT01BUDJfRFNTX0RFQlVHX1NVUFBPUlQpCi0vKiBDTE9DS1MgKi8KLXN0YXRpYyB2b2lkIGNvcmVfZHVtcF9jbG9ja3Moc3RydWN0IHNlcV9maWxlICpzKQotewotCWludCBpOwotCXN0cnVjdCBjbGsgKmNsb2Nrc1s1XSA9IHsKLQkJZHNzLmRzc19pY2ssCi0JCWRzcy5kc3NfZmNrLAotCQlkc3MuZHNzX3N5c19jbGssCi0JCWRzcy5kc3NfdHZfZmNrLAotCQlkc3MuZHNzX3ZpZGVvX2ZjawotCX07Ci0KLQljb25zdCBjaGFyICpuYW1lc1s1XSA9IHsKLQkJImljayIsCi0JCSJmY2siLAotCQkic3lzX2NsayIsCi0JCSJ0dl9mY2siLAotCQkidmlkZW9fZmNrIgotCX07Ci0KLQlzZXFfcHJpbnRmKHMsICItIENPUkUgLVxuIik7Ci0KLQlzZXFfcHJpbnRmKHMsICJpbnRlcm5hbCBjbGsgY291bnRcdFx0JXVcbiIsIGRzcy5udW1fY2xrc19lbmFibGVkKTsKLQotCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJaWYgKCFjbG9ja3NbaV0pCi0JCQljb250aW51ZTsKLQkJc2VxX3ByaW50ZihzLCAiJXMgKCVzKSUqc1x0JWx1XHQlZFxuIiwKLQkJCQluYW1lc1tpXSwKLQkJCQljbG9ja3NbaV0tPm5hbWUsCi0JCQkJMjQgLSBzdHJsZW4obmFtZXNbaV0pIC0gc3RybGVuKGNsb2Nrc1tpXS0+bmFtZSksCi0JCQkJIiIsCi0JCQkJY2xrX2dldF9yYXRlKGNsb2Nrc1tpXSksCi0JCQkJY2xvY2tzW2ldLT51c2Vjb3VudCk7Ci0JfQotfQotI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX0RFQlVHX0ZTKSAmJiBkZWZpbmVkKENPTkZJR19PTUFQMl9EU1NfREVCVUdfU1VQUE9SVCkgKi8KLQotLyogREVCVUdGUyAqLwotI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX0ZTKSAmJiBkZWZpbmVkKENPTkZJR19PTUFQMl9EU1NfREVCVUdfU1VQUE9SVCkKLXZvaWQgZHNzX2RlYnVnX2R1bXBfY2xvY2tzKHN0cnVjdCBzZXFfZmlsZSAqcykKLXsKLQljb3JlX2R1bXBfY2xvY2tzKHMpOwotCWRzc19kdW1wX2Nsb2NrcyhzKTsKLQlkaXNwY19kdW1wX2Nsb2NrcyhzKTsKLSNpZmRlZiBDT05GSUdfT01BUDJfRFNTX0RTSQotCWRzaV9kdW1wX2Nsb2NrcyhzKTsKLSNlbmRpZgotfQotI2VuZGlmCi0KLQotLyogRFNTIEhXIElQIGluaXRpYWxpc2F0aW9uICovCi1zdGF0aWMgaW50IG9tYXBfZHNzaHdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlpbnQgcjsKLQotCWRzcy5wZGV2ID0gcGRldjsKLQotCXIgPSBkc3NfZ2V0X2Nsb2NrcygpOwotCWlmIChyKQotCQlnb3RvIGVycl9jbG9ja3M7Ci0KLQlkc3NfY2xrX2VuYWJsZV9hbGxfbm9fY3R4KCk7Ci0KLQlkc3MuY3R4X2lkID0gZHNzX2dldF9jdHhfaWQoKTsKLQlEU1NEQkcoImluaXRpYWwgY3R4IGlkICV1XG4iLCBkc3MuY3R4X2lkKTsKLQotCXIgPSBkc3NfaW5pdCgpOwotCWlmIChyKSB7Ci0JCURTU0VSUigiRmFpbGVkIHRvIGluaXRpYWxpemUgRFNTXG4iKTsKLQkJZ290byBlcnJfZHNzOwotCX0KLQogCXIgPSBkcGlfaW5pdCgpOwogCWlmIChyKSB7CiAJCURTU0VSUigiRmFpbGVkIHRvIGluaXRpYWxpemUgRFBJXG4iKTsKQEAgLTExMjQsNDIgKzc4Nyw2NiBAQAogCQlnb3RvIGVycl9zZGk7CiAJfQogCi0JZHNzX2Nsa19kaXNhYmxlX2FsbF9ub19jdHgoKTsKKwlyZXYgPSBkc3NfcmVhZF9yZWcoRFNTX1JFVklTSU9OKTsKKwlwcmludGsoS0VSTl9JTkZPICJPTUFQIERTUyByZXYgJWQuJWRcbiIsCisJCQlGTERfR0VUKHJldiwgNywgNCksIEZMRF9HRVQocmV2LCAzLCAwKSk7CisKKwlkc3NfcnVudGltZV9wdXQoKTsKKwogCXJldHVybiAwOwogZXJyX3NkaToKIAlkcGlfZXhpdCgpOwogZXJyX2RwaToKLQlkc3NfZXhpdCgpOwotZXJyX2RzczoKLQlkc3NfY2xrX2Rpc2FibGVfYWxsX25vX2N0eCgpOworCWRzc19ydW50aW1lX3B1dCgpOworZXJyX3J1bnRpbWVfZ2V0OgorCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKIAlkc3NfcHV0X2Nsb2NrcygpOwogZXJyX2Nsb2NrczoKKwlpb3VubWFwKGRzcy5iYXNlKTsKK2Vycl9pb3JlbWFwOgogCXJldHVybiByOwogfQogCiBzdGF0aWMgaW50IG9tYXBfZHNzaHdfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CisJZHBpX2V4aXQoKTsKKwlzZGlfZXhpdCgpOwogCi0JZHNzX2V4aXQoKTsKKwlpb3VubWFwKGRzcy5iYXNlKTsKIAotCS8qCi0JICogQXMgcGFydCBvZiBod21vZCBjaGFuZ2VzLCBEU1MgaXMgbm90IHRoZSBvbmx5IGNvbnRyb2xsZXIgb2YgZHNzCi0JICogY2xvY2tzOyBod21vZCBmcmFtZXdvcmsgaXRzZWxmIHdpbGwgYWxzbyBlbmFibGUgY2xvY2tzIGR1cmluZyBod21vZAotCSAqIGluaXQgZm9yIGRzcywgYW5kIGF1dG9pZGxlIGlzIHNldCBpbiBoL3cgZm9yIERTUy4gSGVuY2UsIHRoZXJlJ3Mgbm8KLQkgKiBuZWVkIHRvIGRpc2FibGUgY2xvY2tzIGlmIHRoZWlyIHVzZWNvdW50cyA+IDEuCi0JICovCi0JV0FSTl9PTihkc3MubnVtX2Nsa3NfZW5hYmxlZCA+IDApOworCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKIAogCWRzc19wdXRfY2xvY2tzKCk7CisKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBkc3NfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlkc3Nfc2F2ZV9jb250ZXh0KCk7CisJY2xrX2Rpc2FibGUoZHNzLmRzc19jbGspOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRzc19ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJY2xrX2VuYWJsZShkc3MuZHNzX2Nsayk7CisJZHNzX3Jlc3RvcmVfY29udGV4dCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgZHNzX3BtX29wcyA9IHsKKwkucnVudGltZV9zdXNwZW5kID0gZHNzX3J1bnRpbWVfc3VzcGVuZCwKKwkucnVudGltZV9yZXN1bWUgPSBkc3NfcnVudGltZV9yZXN1bWUsCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvbWFwX2Rzc2h3X2RyaXZlciA9IHsKIAkucHJvYmUgICAgICAgICAgPSBvbWFwX2Rzc2h3X3Byb2JlLAogCS5yZW1vdmUgICAgICAgICA9IG9tYXBfZHNzaHdfcmVtb3ZlLAogCS5kcml2ZXIgICAgICAgICA9IHsKIAkJLm5hbWUgICA9ICJvbWFwZHNzX2RzcyIsCiAJCS5vd25lciAgPSBUSElTX01PRFVMRSwKKwkJLnBtCT0gJmRzc19wbV9vcHMsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzcy5oIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNzLmgKaW5kZXggOGFiNmQ0My4uOWM5NGIxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNzLmgKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNzLmgKQEAgLTk3LDI2ICs5NywxMiBAQAogI2RlZmluZSBGTERfTU9EKG9yaWcsIHZhbCwgc3RhcnQsIGVuZCkgXAogCSgoKG9yaWcpICYgfkZMRF9NQVNLKHN0YXJ0LCBlbmQpKSB8IEZMRF9WQUwodmFsLCBzdGFydCwgZW5kKSkKIAotZW51bSBvbWFwX2J1cnN0X3NpemUgewotCU9NQVBfRFNTX0JVUlNUXzR4MzIgPSAwLAotCU9NQVBfRFNTX0JVUlNUXzh4MzIgPSAxLAotCU9NQVBfRFNTX0JVUlNUXzE2eDMyID0gMiwKLX07Ci0KIGVudW0gb21hcF9wYXJhbGxlbF9pbnRlcmZhY2VfbW9kZSB7CiAJT01BUF9EU1NfUEFSQUxMRUxNT0RFX0JZUEFTUywJCS8qIE1JUEkgRFBJICovCiAJT01BUF9EU1NfUEFSQUxMRUxNT0RFX1JGQkksCQkvKiBNSVBJIERCSSAqLwogCU9NQVBfRFNTX1BBUkFMTEVMTU9ERV9EU0ksCiB9OwogCi1lbnVtIGRzc19jbG9jayB7Ci0JRFNTX0NMS19JQ0sJPSAxIDw8IDAsCS8qIERTU19MM19JQ0xLIGFuZCBEU1NfTDRfSUNMSyAqLwotCURTU19DTEtfRkNLCT0gMSA8PCAxLAkvKiBEU1MxX0FMV09OX0ZDTEsgKi8KLQlEU1NfQ0xLX1NZU0NLCT0gMSA8PCAyLAkvKiBEU1MyX0FMV09OX0ZDTEsgKi8KLQlEU1NfQ0xLX1RWRkNLCT0gMSA8PCAzLAkvKiBEU1NfVFZfRkNMSyAqLwotCURTU19DTEtfVklERkNLCT0gMSA8PCA0LAkvKiBEU1NfOTZNX0ZDTEsqLwotfTsKLQogZW51bSBkc3NfaGRtaV92ZW5jX2Nsa19zb3VyY2Vfc2VsZWN0IHsKIAlEU1NfVkVOQ19UVl9DTEsgPSAwLAogCURTU19IRE1JX01fUENMSyA9IDEsCkBAIC0xOTQsNyArMTgwLDcgQEAKIGJvb2wgZHNzX3VzZV9yZXBsaWNhdGlvbihzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsCiAJCWVudW0gb21hcF9jb2xvcl9tb2RlIG1vZGUpOwogdm9pZCBkZWZhdWx0X2dldF9vdmVybGF5X2ZpZm9fdGhyZXNob2xkcyhlbnVtIG9tYXBfcGxhbmUgcGxhbmUsCi0JCXUzMiBmaWZvX3NpemUsIGVudW0gb21hcF9idXJzdF9zaXplICpidXJzdF9zaXplLAorCQl1MzIgZmlmb19zaXplLCB1MzIgYnVyc3Rfc2l6ZSwKIAkJdTMyICpmaWZvX2xvdywgdTMyICpmaWZvX2hpZ2gpOwogCiAvKiBtYW5hZ2VyICovCkBAIC0yMjAsMTMgKzIwNiwxMiBAQAogaW50IGRzc19pbml0X3BsYXRmb3JtX2RyaXZlcih2b2lkKTsKIHZvaWQgZHNzX3VuaW5pdF9wbGF0Zm9ybV9kcml2ZXIodm9pZCk7CiAKK2ludCBkc3NfcnVudGltZV9nZXQodm9pZCk7Cit2b2lkIGRzc19ydW50aW1lX3B1dCh2b2lkKTsKKworc3RydWN0IGNsayAqZHNzX2dldF9pY2sodm9pZCk7CisKIHZvaWQgZHNzX3NlbGVjdF9oZG1pX3ZlbmNfY2xrX3NvdXJjZShlbnVtIGRzc19oZG1pX3ZlbmNfY2xrX3NvdXJjZV9zZWxlY3QpOwotdm9pZCBkc3Nfc2F2ZV9jb250ZXh0KHZvaWQpOwotdm9pZCBkc3NfcmVzdG9yZV9jb250ZXh0KHZvaWQpOwotdm9pZCBkc3NfY2xrX2VuYWJsZShlbnVtIGRzc19jbG9jayBjbGtzKTsKLXZvaWQgZHNzX2Nsa19kaXNhYmxlKGVudW0gZHNzX2Nsb2NrIGNsa3MpOwotdW5zaWduZWQgbG9uZyBkc3NfY2xrX2dldF9yYXRlKGVudW0gZHNzX2Nsb2NrIGNsayk7Ci1pbnQgZHNzX25lZWRfY3R4X3Jlc3RvcmUodm9pZCk7CiBjb25zdCBjaGFyICpkc3NfZ2V0X2dlbmVyaWNfY2xrX3NvdXJjZV9uYW1lKGVudW0gb21hcF9kc3NfY2xrX3NvdXJjZSBjbGtfc3JjKTsKIHZvaWQgZHNzX2R1bXBfY2xvY2tzKHN0cnVjdCBzZXFfZmlsZSAqcyk7CiAKQEAgLTI4MywxNSArMjY4LDE1IEBACiBpbnQgZHNpX2luaXRfcGxhdGZvcm1fZHJpdmVyKHZvaWQpOwogdm9pZCBkc2lfdW5pbml0X3BsYXRmb3JtX2RyaXZlcih2b2lkKTsKIAoraW50IGRzaV9ydW50aW1lX2dldChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYpOwordm9pZCBkc2lfcnVudGltZV9wdXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2KTsKKwogdm9pZCBkc2lfZHVtcF9jbG9ja3Moc3RydWN0IHNlcV9maWxlICpzKTsKIHZvaWQgZHNpX2NyZWF0ZV9kZWJ1Z2ZzX2ZpbGVzX2lycShzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2RpciwKIAkJY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZGVidWdfZm9wcyk7CiB2b2lkIGRzaV9jcmVhdGVfZGVidWdmc19maWxlc19yZWcoc3RydWN0IGRlbnRyeSAqZGVidWdmc19kaXIsCiAJCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmRlYnVnX2ZvcHMpOwogCi12b2lkIGRzaV9zYXZlX2NvbnRleHQodm9pZCk7Ci12b2lkIGRzaV9yZXN0b3JlX2NvbnRleHQodm9pZCk7Ci0KIGludCBkc2lfaW5pdF9kaXNwbGF5KHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRpc3BsYXkpOwogdm9pZCBkc2lfaXJxX2hhbmRsZXIodm9pZCk7CiB1bnNpZ25lZCBsb25nIGRzaV9nZXRfcGxsX2hzZGl2X2Rpc3BjX3JhdGUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZHNpZGV2KTsKQEAgLTMwNCw3ICsyODksNyBAQAogCQlib29sIGVuYWJsZV9oc2Rpdik7CiB2b2lkIGRzaV9wbGxfdW5pbml0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldiwgYm9vbCBkaXNjb25uZWN0X2xhbmVzKTsKIHZvaWQgZHNpX2dldF9vdmVybGF5X2ZpZm9fdGhyZXNob2xkcyhlbnVtIG9tYXBfcGxhbmUgcGxhbmUsCi0JCXUzMiBmaWZvX3NpemUsIGVudW0gb21hcF9idXJzdF9zaXplICpidXJzdF9zaXplLAorCQl1MzIgZmlmb19zaXplLCB1MzIgYnVyc3Rfc2l6ZSwKIAkJdTMyICpmaWZvX2xvdywgdTMyICpmaWZvX2hpZ2gpOwogdm9pZCBkc2lfd2FpdF9wbGxfaHNkaXZfZGlzcGNfYWN0aXZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldik7CiB2b2lkIGRzaV93YWl0X3BsbF9oc2Rpdl9kc2lfYWN0aXZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldik7CkBAIC0zMTcsNiArMzAyLDEzIEBACiBzdGF0aWMgaW5saW5lIHZvaWQgZHNpX3VuaW5pdF9wbGF0Zm9ybV9kcml2ZXIodm9pZCkKIHsKIH0KK3N0YXRpYyBpbmxpbmUgaW50IGRzaV9ydW50aW1lX2dldChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkc2lkZXYpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgZHNpX3J1bnRpbWVfcHV0KHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldikKK3sKK30KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBkc2lfZ2V0X3BsbF9oc2Rpdl9kaXNwY19yYXRlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRzaWRldikKIHsKIAlXQVJOKCIlczogRFNJIG5vdCBjb21waWxlZCBpbiwgcmV0dXJuaW5nIHJhdGUgYXMgMFxuIiwgX19mdW5jX18pOwpAQCAtMzg0LDggKzM3Niw4IEBACiB2b2lkIGRpc3BjX2lycV9oYW5kbGVyKHZvaWQpOwogdm9pZCBkaXNwY19mYWtlX3ZzeW5jX2lycSh2b2lkKTsKIAotdm9pZCBkaXNwY19zYXZlX2NvbnRleHQodm9pZCk7Ci12b2lkIGRpc3BjX3Jlc3RvcmVfY29udGV4dCh2b2lkKTsKK2ludCBkaXNwY19ydW50aW1lX2dldCh2b2lkKTsKK3ZvaWQgZGlzcGNfcnVudGltZV9wdXQodm9pZCk7CiAKIHZvaWQgZGlzcGNfZW5hYmxlX3NpZGxlKHZvaWQpOwogdm9pZCBkaXNwY19kaXNhYmxlX3NpZGxlKHZvaWQpOwpAQCAtMzk4LDEwICszOTAsMTIgQEAKIHZvaWQgZGlzcGNfc2V0X2xjZF9zaXplKGVudW0gb21hcF9jaGFubmVsIGNoYW5uZWwsIHUxNiB3aWR0aCwgdTE2IGhlaWdodCk7CiB2b2lkIGRpc3BjX3NldF9kaWdpdF9zaXplKHUxNiB3aWR0aCwgdTE2IGhlaWdodCk7CiB1MzIgZGlzcGNfZ2V0X3BsYW5lX2ZpZm9fc2l6ZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUpOwotdm9pZCBkaXNwY19zZXR1cF9wbGFuZV9maWZvKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgdTMyIGxvdywgdTMyIGhpZ2gpOwordm9pZCBkaXNwY19zZXRfZmlmb190aHJlc2hvbGQoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCB1MzIgbG93LCB1MzIgaGlnaCk7CiB2b2lkIGRpc3BjX2VuYWJsZV9maWZvbWVyZ2UoYm9vbCBlbmFibGUpOwotdm9pZCBkaXNwY19zZXRfYnVyc3Rfc2l6ZShlbnVtIG9tYXBfcGxhbmUgcGxhbmUsCi0JCWVudW0gb21hcF9idXJzdF9zaXplIGJ1cnN0X3NpemUpOwordTMyIGRpc3BjX2dldF9idXJzdF9zaXplKGVudW0gb21hcF9wbGFuZSBwbGFuZSk7Cit2b2lkIGRpc3BjX2VuYWJsZV9jcHIoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwgYm9vbCBlbmFibGUpOwordm9pZCBkaXNwY19zZXRfY3ByX2NvZWYoZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbCwKKwkJc3RydWN0IG9tYXBfZHNzX2Nwcl9jb2VmcyAqY29lZnMpOwogCiB2b2lkIGRpc3BjX3NldF9wbGFuZV9iYTAoZW51bSBvbWFwX3BsYW5lIHBsYW5lLCB1MzIgcGFkZHIpOwogdm9pZCBkaXNwY19zZXRfcGxhbmVfYmExKGVudW0gb21hcF9wbGFuZSBwbGFuZSwgdTMyIHBhZGRyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2Rzc19mZWF0dXJlcy5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNzX2ZlYXR1cmVzLmMKaW5kZXggMWMxODg4OC4uYjQxNWM0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNzX2ZlYXR1cmVzLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNzX2ZlYXR1cmVzLmMKQEAgLTQ5LDYgKzQ5LDkgQEAKIAljb25zdCBlbnVtIG9tYXBfY29sb3JfbW9kZSAqc3VwcG9ydGVkX2NvbG9yX21vZGVzOwogCWNvbnN0IGNoYXIgKiBjb25zdCAqY2xrc3JjX25hbWVzOwogCWNvbnN0IHN0cnVjdCBkc3NfcGFyYW1fcmFuZ2UgKmRzc19wYXJhbXM7CisKKwljb25zdCB1MzIgYnVmZmVyX3NpemVfdW5pdDsKKwljb25zdCB1MzIgYnVyc3Rfc2l6ZV91bml0OwogfTsKIAogLyogVGhpcyBzdHJ1Y3QgaXMgYXNzaWduZWQgdG8gb25lIG9mIHRoZSBiZWxvdyBkdXJpbmcgaW5pdGlhbGl6YXRpb24gKi8KQEAgLTI3NCw2ICsyNzcsOCBAQAogCS5zdXBwb3J0ZWRfY29sb3JfbW9kZXMgPSBvbWFwMl9kc3Nfc3VwcG9ydGVkX2NvbG9yX21vZGVzLAogCS5jbGtzcmNfbmFtZXMgPSBvbWFwMl9kc3NfY2xrX3NvdXJjZV9uYW1lcywKIAkuZHNzX3BhcmFtcyA9IG9tYXAyX2Rzc19wYXJhbV9yYW5nZSwKKwkuYnVmZmVyX3NpemVfdW5pdCA9IDEsCisJLmJ1cnN0X3NpemVfdW5pdCA9IDgsCiB9OwogCiAvKiBPTUFQMyBEU1MgRmVhdHVyZXMgKi8KQEAgLTI4Niw3ICsyOTEsOSBAQAogCQlGRUFUX0xDREVOQUJMRVNJR05BTCB8IEZFQVRfUENLRlJFRUVOQUJMRSB8CiAJCUZFQVRfRlVOQ0dBVEVEIHwgRkVBVF9ST1dSRVBFQVRFTkFCTEUgfAogCQlGRUFUX0xJTkVCVUZGRVJTUExJVCB8IEZFQVRfUkVTSVpFQ09ORiB8Ci0JCUZFQVRfRFNJX1BMTF9GUkVRU0VMIHwgRkVBVF9EU0lfUkVWRVJTRV9UWENMS0VTQywKKwkJRkVBVF9EU0lfUExMX0ZSRVFTRUwgfCBGRUFUX0RTSV9SRVZFUlNFX1RYQ0xLRVNDIHwKKwkJRkVBVF9WRU5DX1JFUVVJUkVTX1RWX0RBQ19DTEsgfCBGRUFUX0NQUiB8IEZFQVRfUFJFTE9BRCB8CisJCUZFQVRfRklSX0NPRUZfViwKIAogCS5udW1fbWdycyA9IDIsCiAJLm51bV9vdmxzID0gMywKQEAgLTI5NCw2ICszMDEsOCBAQAogCS5zdXBwb3J0ZWRfY29sb3JfbW9kZXMgPSBvbWFwM19kc3Nfc3VwcG9ydGVkX2NvbG9yX21vZGVzLAogCS5jbGtzcmNfbmFtZXMgPSBvbWFwM19kc3NfY2xrX3NvdXJjZV9uYW1lcywKIAkuZHNzX3BhcmFtcyA9IG9tYXAzX2Rzc19wYXJhbV9yYW5nZSwKKwkuYnVmZmVyX3NpemVfdW5pdCA9IDEsCisJLmJ1cnN0X3NpemVfdW5pdCA9IDgsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9tYXBfZHNzX2ZlYXR1cmVzIG9tYXAzNjMwX2Rzc19mZWF0dXJlcyA9IHsKQEAgLTMwNiw3ICszMTUsOCBAQAogCQlGRUFUX1BSRV9NVUxUX0FMUEhBIHwgRkVBVF9GVU5DR0FURUQgfAogCQlGRUFUX1JPV1JFUEVBVEVOQUJMRSB8IEZFQVRfTElORUJVRkZFUlNQTElUIHwKIAkJRkVBVF9SRVNJWkVDT05GIHwgRkVBVF9EU0lfUExMX1BXUl9CVUcgfAotCQlGRUFUX0RTSV9QTExfRlJFUVNFTCwKKwkJRkVBVF9EU0lfUExMX0ZSRVFTRUwgfCBGRUFUX0NQUiB8IEZFQVRfUFJFTE9BRCB8CisJCUZFQVRfRklSX0NPRUZfViwKIAogCS5udW1fbWdycyA9IDIsCiAJLm51bV9vdmxzID0gMywKQEAgLTMxNCw2ICszMjQsOCBAQAogCS5zdXBwb3J0ZWRfY29sb3JfbW9kZXMgPSBvbWFwM19kc3Nfc3VwcG9ydGVkX2NvbG9yX21vZGVzLAogCS5jbGtzcmNfbmFtZXMgPSBvbWFwM19kc3NfY2xrX3NvdXJjZV9uYW1lcywKIAkuZHNzX3BhcmFtcyA9IG9tYXAzX2Rzc19wYXJhbV9yYW5nZSwKKwkuYnVmZmVyX3NpemVfdW5pdCA9IDEsCisJLmJ1cnN0X3NpemVfdW5pdCA9IDgsCiB9OwogCiAvKiBPTUFQNCBEU1MgRmVhdHVyZXMgKi8KQEAgLTMyNyw3ICszMzksOCBAQAogCQlGRUFUX01HUl9MQ0QyIHwgRkVBVF9HTE9CQUxfQUxQSEFfVklEMSB8CiAJCUZFQVRfQ09SRV9DTEtfRElWIHwgRkVBVF9MQ0RfQ0xLX1NSQyB8CiAJCUZFQVRfRFNJX0RDU19DTURfQ09ORklHX1ZDIHwgRkVBVF9EU0lfVkNfT0NQX1dJRFRIIHwKLQkJRkVBVF9EU0lfR05RIHwgRkVBVF9IQU5ETEVfVVZfU0VQQVJBVEUgfCBGRUFUX0FUVFIyLAorCQlGRUFUX0RTSV9HTlEgfCBGRUFUX0hBTkRMRV9VVl9TRVBBUkFURSB8IEZFQVRfQVRUUjIgfAorCQlGRUFUX0NQUiB8IEZFQVRfUFJFTE9BRCB8IEZFQVRfRklSX0NPRUZfViwKIAogCS5udW1fbWdycyA9IDMsCiAJLm51bV9vdmxzID0gMywKQEAgLTMzNSw2ICszNDgsOCBAQAogCS5zdXBwb3J0ZWRfY29sb3JfbW9kZXMgPSBvbWFwNF9kc3Nfc3VwcG9ydGVkX2NvbG9yX21vZGVzLAogCS5jbGtzcmNfbmFtZXMgPSBvbWFwNF9kc3NfY2xrX3NvdXJjZV9uYW1lcywKIAkuZHNzX3BhcmFtcyA9IG9tYXA0X2Rzc19wYXJhbV9yYW5nZSwKKwkuYnVmZmVyX3NpemVfdW5pdCA9IDE2LAorCS5idXJzdF9zaXplX3VuaXQgPSAxNiwKIH07CiAKIC8qIEZvciBhbGwgdGhlIG90aGVyIE9NQVA0IHZlcnNpb25zICovCkBAIC0zNDgsNyArMzYzLDggQEAKIAkJRkVBVF9DT1JFX0NMS19ESVYgfCBGRUFUX0xDRF9DTEtfU1JDIHwKIAkJRkVBVF9EU0lfRENTX0NNRF9DT05GSUdfVkMgfCBGRUFUX0RTSV9WQ19PQ1BfV0lEVEggfAogCQlGRUFUX0RTSV9HTlEgfCBGRUFUX0hETUlfQ1RTX1NXTU9ERSB8Ci0JCUZFQVRfSEFORExFX1VWX1NFUEFSQVRFIHwgRkVBVF9BVFRSMiwKKwkJRkVBVF9IQU5ETEVfVVZfU0VQQVJBVEUgfCBGRUFUX0FUVFIyIHwgRkVBVF9DUFIgfAorCQlGRUFUX1BSRUxPQUQgfCBGRUFUX0ZJUl9DT0VGX1YsCiAKIAkubnVtX21ncnMgPSAzLAogCS5udW1fb3ZscyA9IDMsCkBAIC0zNTYsNiArMzcyLDggQEAKIAkuc3VwcG9ydGVkX2NvbG9yX21vZGVzID0gb21hcDRfZHNzX3N1cHBvcnRlZF9jb2xvcl9tb2RlcywKIAkuY2xrc3JjX25hbWVzID0gb21hcDRfZHNzX2Nsa19zb3VyY2VfbmFtZXMsCiAJLmRzc19wYXJhbXMgPSBvbWFwNF9kc3NfcGFyYW1fcmFuZ2UsCisJLmJ1ZmZlcl9zaXplX3VuaXQgPSAxNiwKKwkuYnVyc3Rfc2l6ZV91bml0ID0gMTYsCiB9OwogCiAvKiBGdW5jdGlvbnMgcmV0dXJuaW5nIHZhbHVlcyByZWxhdGVkIHRvIGEgRFNTIGZlYXR1cmUgKi8KQEAgLTQwMSw2ICs0MTksMTYgQEAKIAlyZXR1cm4gb21hcF9jdXJyZW50X2Rzc19mZWF0dXJlcy0+Y2xrc3JjX25hbWVzW2lkXTsKIH0KIAordTMyIGRzc19mZWF0X2dldF9idWZmZXJfc2l6ZV91bml0KHZvaWQpCit7CisJcmV0dXJuIG9tYXBfY3VycmVudF9kc3NfZmVhdHVyZXMtPmJ1ZmZlcl9zaXplX3VuaXQ7Cit9CisKK3UzMiBkc3NfZmVhdF9nZXRfYnVyc3Rfc2l6ZV91bml0KHZvaWQpCit7CisJcmV0dXJuIG9tYXBfY3VycmVudF9kc3NfZmVhdHVyZXMtPmJ1cnN0X3NpemVfdW5pdDsKK30KKwogLyogRFNTIGhhc19mZWF0dXJlIGNoZWNrICovCiBib29sIGRzc19oYXNfZmVhdHVyZShlbnVtIGRzc19mZWF0X2lkIGlkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvZHNzX2ZlYXR1cmVzLmggYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kc3NfZmVhdHVyZXMuaAppbmRleCAwN2IzNDZmLi5iNzM5OGNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kc3NfZmVhdHVyZXMuaAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9kc3NfZmVhdHVyZXMuaApAQCAtNTEsNiArNTEsMTAgQEAKIAlGRUFUX0hETUlfQ1RTX1NXTU9ERQkJPSAxIDw8IDE5LAogCUZFQVRfSEFORExFX1VWX1NFUEFSQVRFICAgICAgICAgPSAxIDw8IDIwLAogCUZFQVRfQVRUUjIgICAgICAgICAgICAgICAgICAgICAgPSAxIDw8IDIxLAorCUZFQVRfVkVOQ19SRVFVSVJFU19UVl9EQUNfQ0xLCT0gMSA8PCAyMiwKKwlGRUFUX0NQUgkJCT0gMSA8PCAyMywKKwlGRUFUX1BSRUxPQUQJCQk9IDEgPDwgMjQsCisJRkVBVF9GSVJfQ09FRl9WCQkJPSAxIDw8IDI1LAogfTsKIAogLyogRFNTIHJlZ2lzdGVyIGZpZWxkIGlkICovCkBAIC05MCw2ICs5NCw5IEBACiAJCWVudW0gb21hcF9jb2xvcl9tb2RlIGNvbG9yX21vZGUpOwogY29uc3QgY2hhciAqZHNzX2ZlYXRfZ2V0X2Nsa19zb3VyY2VfbmFtZShlbnVtIG9tYXBfZHNzX2Nsa19zb3VyY2UgaWQpOwogCit1MzIgZHNzX2ZlYXRfZ2V0X2J1ZmZlcl9zaXplX3VuaXQodm9pZCk7CS8qIGluIGJ5dGVzICovCit1MzIgZHNzX2ZlYXRfZ2V0X2J1cnN0X3NpemVfdW5pdCh2b2lkKTsJCS8qIGluIGJ5dGVzICovCisKIGJvb2wgZHNzX2hhc19mZWF0dXJlKGVudW0gZHNzX2ZlYXRfaWQgaWQpOwogdm9pZCBkc3NfZmVhdF9nZXRfcmVnX2ZpZWxkKGVudW0gZHNzX2ZlYXRfcmVnX2ZpZWxkIGlkLCB1OCAqc3RhcnQsIHU4ICplbmQpOwogdm9pZCBkc3NfZmVhdHVyZXNfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2hkbWkuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL2hkbWkuYwppbmRleCBiMDU1NWY0Li4yNTZmMjdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9oZG1pLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvaGRtaS5jCkBAIC0yOSw2ICsyOSw5IEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDx2aWRlby9vbWFwZHNzLmg+CiAjaWYgZGVmaW5lZChDT05GSUdfU05EX09NQVBfU09DX09NQVA0X0hETUkpIHx8IFwKIAlkZWZpbmVkKENPTkZJR19TTkRfT01BUF9TT0NfT01BUDRfSERNSV9NT0RVTEUpCkBAIC01MSw2ICs1NCw5IEBACiAJdTggZWRpZF9zZXQ7CiAJYm9vbCBjdXN0b21fc2V0OwogCXN0cnVjdCBoZG1pX2NvbmZpZyBjZmc7CisKKwlzdHJ1Y3QgY2xrICpzeXNfY2xrOworCXN0cnVjdCBjbGsgKmhkbWlfY2xrOwogfSBoZG1pOwogCiAvKgpAQCAtMTYyLDYgKzE2OCwyNyBAQAogCXJldHVybiB2YWw7CiB9CiAKK3N0YXRpYyBpbnQgaGRtaV9ydW50aW1lX2dldCh2b2lkKQoreworCWludCByOworCisJRFNTREJHKCJoZG1pX3J1bnRpbWVfZ2V0XG4iKTsKKworCXIgPSBwbV9ydW50aW1lX2dldF9zeW5jKCZoZG1pLnBkZXYtPmRldik7CisJV0FSTl9PTihyIDwgMCk7CisJcmV0dXJuIHIgPCAwID8gciA6IDA7Cit9CisKK3N0YXRpYyB2b2lkIGhkbWlfcnVudGltZV9wdXQodm9pZCkKK3sKKwlpbnQgcjsKKworCURTU0RCRygiaGRtaV9ydW50aW1lX3B1dFxuIik7CisKKwlyID0gcG1fcnVudGltZV9wdXQoJmhkbWkucGRldi0+ZGV2KTsKKwlXQVJOX09OKHIgPCAwKTsKK30KKwogaW50IGhkbWlfaW5pdF9kaXNwbGF5KHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKIHsKIAlEU1NEQkcoImluaXRfZGlzcGxheVxuIik7CkBAIC0zMTEsMzAgKzMzOCwxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGhkbWlfd2FpdF9zb2Z0cmVzZXQodm9pZCkKLXsKLQkvKiByZXNldCBXMSAqLwotCVJFR19GTERfTU9EKEhETUlfV1BfU1lTQ09ORklHLCAweDEsIDAsIDApOwotCi0JLyogd2FpdCB0aWxsIFNPRlRSRVNFVCA9PSAwICovCi0JaWYgKGhkbWlfd2FpdF9mb3JfYml0X2NoYW5nZShIRE1JX1dQX1NZU0NPTkZJRywgMCwgMCwgMCkgIT0gMCkgewotCQlEU1NFUlIoInN5c2NvbmZpZyByZXNldCBmYWlsZWRcbiIpOwotCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBoZG1pX3BsbF9wcm9ncmFtKHN0cnVjdCBoZG1pX3BsbF9pbmZvICpmbXQpCiB7CiAJdTE2IHIgPSAwOwogCWVudW0gaGRtaV9jbGtfcmVmc2VsIHJlZnNlbDsKIAotCS8qIHdhaXQgZm9yIHdyYXBwZXIgcmVzZXQgKi8KLQlyID0gaGRtaV93YWl0X3NvZnRyZXNldCgpOwotCWlmIChyKQotCQlyZXR1cm4gcjsKLQogCXIgPSBoZG1pX3NldF9wbGxfcHdyKEhETUlfUExMUFdSQ01EX0FMTE9GRik7CiAJaWYgKHIpCiAJCXJldHVybiByOwpAQCAtMTA2NCw3ICsxMDcyLDcgQEAKIAl1bnNpZ25lZCBsb25nIGNsa2luLCByZWZjbGs7CiAJdTMyIG1mOwogCi0JY2xraW4gPSBkc3NfY2xrX2dldF9yYXRlKERTU19DTEtfU1lTQ0spIC8gMTAwMDA7CisJY2xraW4gPSBjbGtfZ2V0X3JhdGUoaGRtaS5zeXNfY2xrKSAvIDEwMDAwOwogCS8qCiAJICogSW5wdXQgY2xvY2sgaXMgcHJlZGl2aWRlZCBieSBOICsgMQogCSAqIG91dCBwdXQgb2Ygd2hpY2ggaXMgcmVmZXJlbmNlIGNsawpAQCAtMTA5OCwxNiArMTEwNiw2IEBACiAJRFNTREJHKCJyYW5nZSA9ICVkIHNkID0gJWRcbiIsIHBpLT5kY29mcmVxLCBwaS0+cmVnc2QpOwogfQogCi1zdGF0aWMgdm9pZCBoZG1pX2VuYWJsZV9jbG9ja3MoaW50IGVuYWJsZSkKLXsKLQlpZiAoZW5hYmxlKQotCQlkc3NfY2xrX2VuYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLIHwKLQkJCQlEU1NfQ0xLX1NZU0NLIHwgRFNTX0NMS19WSURGQ0spOwotCWVsc2UKLQkJZHNzX2Nsa19kaXNhYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0sgfAotCQkJCURTU19DTEtfU1lTQ0sgfCBEU1NfQ0xLX1ZJREZDSyk7Ci19Ci0KIHN0YXRpYyBpbnQgaGRtaV9wb3dlcl9vbihzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpCiB7CiAJaW50IHIsIGNvZGUgPSAwOwpAQCAtMTExNSw3ICsxMTEzLDkgQEAKIAlzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzICpwOwogCXVuc2lnbmVkIGxvbmcgcGh5OwogCi0JaGRtaV9lbmFibGVfY2xvY2tzKDEpOworCXIgPSBoZG1pX3J1bnRpbWVfZ2V0KCk7CisJaWYgKHIpCisJCXJldHVybiByOwogCiAJZGlzcGNfZW5hYmxlX2NoYW5uZWwoT01BUF9EU1NfQ0hBTk5FTF9ESUdJVCwgMCk7CiAKQEAgLTExODAsNyArMTE4MCw3IEBACiAKIAlyZXR1cm4gMDsKIGVycjoKLQloZG1pX2VuYWJsZV9jbG9ja3MoMCk7CisJaGRtaV9ydW50aW1lX3B1dCgpOwogCXJldHVybiAtRUlPOwogfQogCkBAIC0xMTkxLDcgKzExOTEsNyBAQAogCWhkbWlfd3BfdmlkZW9fc3RhcnQoMCk7CiAJaGRtaV9waHlfb2ZmKCk7CiAJaGRtaV9zZXRfcGxsX3B3cihIRE1JX1BMTFBXUkNNRF9BTExPRkYpOwotCWhkbWlfZW5hYmxlX2Nsb2NrcygwKTsKKwloZG1pX3J1bnRpbWVfcHV0KCk7CiAKIAloZG1pLmVkaWRfc2V0ID0gMDsKIH0KQEAgLTE2ODYsMTQgKzE2ODYsNDMgQEAKIH07CiAjZW5kaWYKIAorc3RhdGljIGludCBoZG1pX2dldF9jbG9ja3Moc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgY2xrICpjbGs7CisKKwljbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJzeXNfY2xrIik7CisJaWYgKElTX0VSUihjbGspKSB7CisJCURTU0VSUigiY2FuJ3QgZ2V0IHN5c19jbGtcbiIpOworCQlyZXR1cm4gUFRSX0VSUihjbGspOworCX0KKworCWhkbWkuc3lzX2NsayA9IGNsazsKKworCWNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgImRzc180OG1oel9jbGsiKTsKKwlpZiAoSVNfRVJSKGNsaykpIHsKKwkJRFNTRVJSKCJjYW4ndCBnZXQgaGRtaV9jbGtcbiIpOworCQljbGtfcHV0KGhkbWkuc3lzX2Nsayk7CisJCXJldHVybiBQVFJfRVJSKGNsayk7CisJfQorCisJaGRtaS5oZG1pX2NsayA9IGNsazsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBoZG1pX3B1dF9jbG9ja3Modm9pZCkKK3sKKwlpZiAoaGRtaS5zeXNfY2xrKQorCQljbGtfcHV0KGhkbWkuc3lzX2Nsayk7CisJaWYgKGhkbWkuaGRtaV9jbGspCisJCWNsa19wdXQoaGRtaS5oZG1pX2Nsayk7Cit9CisKIC8qIEhETUkgSFcgSVAgaW5pdGlhbGlzYXRpb24gKi8KIHN0YXRpYyBpbnQgb21hcGRzc19oZG1paHdfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgcmVzb3VyY2UgKmhkbWlfbWVtOwotI2lmIGRlZmluZWQoQ09ORklHX1NORF9PTUFQX1NPQ19PTUFQNF9IRE1JKSB8fCBcCi0JZGVmaW5lZChDT05GSUdfU05EX09NQVBfU09DX09NQVA0X0hETUlfTU9EVUxFKQotCWludCByZXQ7Ci0jZW5kaWYKKwlpbnQgcjsKIAogCWhkbWkucGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKIAloZG1pLnBkZXYgPSBwZGV2OwpAQCAtMTcxMywxNyArMTc0MiwyNSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKKwlyID0gaGRtaV9nZXRfY2xvY2tzKHBkZXYpOworCWlmIChyKSB7CisJCWlvdW5tYXAoaGRtaS5iYXNlX3dwKTsKKwkJcmV0dXJuIHI7CisJfQorCisJcG1fcnVudGltZV9lbmFibGUoJnBkZXYtPmRldik7CisKIAloZG1pX3BhbmVsX2luaXQoKTsKIAogI2lmIGRlZmluZWQoQ09ORklHX1NORF9PTUFQX1NPQ19PTUFQNF9IRE1JKSB8fCBcCiAJZGVmaW5lZChDT05GSUdfU05EX09NQVBfU09DX09NQVA0X0hETUlfTU9EVUxFKQogCiAJLyogUmVnaXN0ZXIgQVNvQyBjb2RlYyBEQUkgKi8KLQlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NvZGVjKCZwZGV2LT5kZXYsICZoZG1pX2F1ZGlvX2NvZGVjX2RydiwKKwlyID0gc25kX3NvY19yZWdpc3Rlcl9jb2RlYygmcGRldi0+ZGV2LCAmaGRtaV9hdWRpb19jb2RlY19kcnYsCiAJCQkJCSZoZG1pX2NvZGVjX2RhaV9kcnYsIDEpOwotCWlmIChyZXQpIHsKKwlpZiAocikgewogCQlEU1NFUlIoImNhbid0IHJlZ2lzdGVyIEFTb0MgSERNSSBhdWRpbyBjb2RlY1xuIik7Ci0JCXJldHVybiByZXQ7CisJCXJldHVybiByOwogCX0KICNlbmRpZgogCXJldHVybiAwOwpAQCAtMTczOCwxNyArMTc3NSw2MiBAQAogCXNuZF9zb2NfdW5yZWdpc3Rlcl9jb2RlYygmcGRldi0+ZGV2KTsKICNlbmRpZgogCisJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOworCisJaGRtaV9wdXRfY2xvY2tzKCk7CisKIAlpb3VubWFwKGhkbWkuYmFzZV93cCk7CiAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBoZG1pX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJY2xrX2Rpc2FibGUoaGRtaS5oZG1pX2Nsayk7CisJY2xrX2Rpc2FibGUoaGRtaS5zeXNfY2xrKTsKKworCWRpc3BjX3J1bnRpbWVfcHV0KCk7CisJZHNzX3J1bnRpbWVfcHV0KCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoZG1pX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlpbnQgcjsKKworCXIgPSBkc3NfcnVudGltZV9nZXQoKTsKKwlpZiAociA8IDApCisJCWdvdG8gZXJyX2dldF9kc3M7CisKKwlyID0gZGlzcGNfcnVudGltZV9nZXQoKTsKKwlpZiAociA8IDApCisJCWdvdG8gZXJyX2dldF9kaXNwYzsKKworCisJY2xrX2VuYWJsZShoZG1pLnN5c19jbGspOworCWNsa19lbmFibGUoaGRtaS5oZG1pX2Nsayk7CisKKwlyZXR1cm4gMDsKKworZXJyX2dldF9kaXNwYzoKKwlkc3NfcnVudGltZV9wdXQoKTsKK2Vycl9nZXRfZHNzOgorCXJldHVybiByOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgaGRtaV9wbV9vcHMgPSB7CisJLnJ1bnRpbWVfc3VzcGVuZCA9IGhkbWlfcnVudGltZV9zdXNwZW5kLAorCS5ydW50aW1lX3Jlc3VtZSA9IGhkbWlfcnVudGltZV9yZXN1bWUsCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvbWFwZHNzX2hkbWlod19kcml2ZXIgPSB7CiAJLnByb2JlICAgICAgICAgID0gb21hcGRzc19oZG1paHdfcHJvYmUsCiAJLnJlbW92ZSAgICAgICAgID0gb21hcGRzc19oZG1paHdfcmVtb3ZlLAogCS5kcml2ZXIgICAgICAgICA9IHsKIAkJLm5hbWUgICA9ICJvbWFwZHNzX2hkbWkiLAogCQkub3duZXIgID0gVEhJU19NT0RVTEUsCisJCS5wbQk9ICZoZG1pX3BtX29wcywKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvbWFuYWdlci5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvbWFuYWdlci5jCmluZGV4IDlhZWVhNTAuLjEzZDcyZDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL21hbmFnZXIuYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9tYW5hZ2VyLmMKQEAgLTI3NSw2ICsyNzUsMTA4IEBACiAJcmV0dXJuIHNpemU7CiB9CiAKK3N0YXRpYyBzc2l6ZV90IG1hbmFnZXJfY3ByX2VuYWJsZV9zaG93KHN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWdyLAorCQljaGFyICpidWYpCit7CisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFHRV9TSVpFLCAiJWRcbiIsIG1nci0+aW5mby5jcHJfZW5hYmxlKTsKK30KKworc3RhdGljIHNzaXplX3QgbWFuYWdlcl9jcHJfZW5hYmxlX3N0b3JlKHN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWdyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlcl9pbmZvIGluZm87CisJaW50IHY7CisJaW50IHI7CisJYm9vbCBlbmFibGU7CisKKwlpZiAoIWRzc19oYXNfZmVhdHVyZShGRUFUX0NQUikpCisJCXJldHVybiAtRU5PREVWOworCisJciA9IGtzdHJ0b2ludChidWYsIDAsICZ2KTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwllbmFibGUgPSAhIXY7CisKKwltZ3ItPmdldF9tYW5hZ2VyX2luZm8obWdyLCAmaW5mbyk7CisKKwlpZiAoaW5mby5jcHJfZW5hYmxlID09IGVuYWJsZSkKKwkJcmV0dXJuIHNpemU7CisKKwlpbmZvLmNwcl9lbmFibGUgPSBlbmFibGU7CisKKwlyID0gbWdyLT5zZXRfbWFuYWdlcl9pbmZvKG1nciwgJmluZm8pOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSBtZ3ItPmFwcGx5KG1ncik7CisJaWYgKHIpCisJCXJldHVybiByOworCisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBzc2l6ZV90IG1hbmFnZXJfY3ByX2NvZWZfc2hvdyhzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1nciwKKwkJY2hhciAqYnVmKQoreworCXN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlcl9pbmZvIGluZm87CisKKwltZ3ItPmdldF9tYW5hZ2VyX2luZm8obWdyLCAmaW5mbyk7CisKKwlyZXR1cm4gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsCisJCQkiJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWQgJWRcbiIsCisJCQlpbmZvLmNwcl9jb2Vmcy5yciwKKwkJCWluZm8uY3ByX2NvZWZzLnJnLAorCQkJaW5mby5jcHJfY29lZnMucmIsCisJCQlpbmZvLmNwcl9jb2Vmcy5nciwKKwkJCWluZm8uY3ByX2NvZWZzLmdnLAorCQkJaW5mby5jcHJfY29lZnMuZ2IsCisJCQlpbmZvLmNwcl9jb2Vmcy5iciwKKwkJCWluZm8uY3ByX2NvZWZzLmJnLAorCQkJaW5mby5jcHJfY29lZnMuYmIpOworfQorCitzdGF0aWMgc3NpemVfdCBtYW5hZ2VyX2Nwcl9jb2VmX3N0b3JlKHN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlciAqbWdyLAorCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplKQoreworCXN0cnVjdCBvbWFwX292ZXJsYXlfbWFuYWdlcl9pbmZvIGluZm87CisJc3RydWN0IG9tYXBfZHNzX2Nwcl9jb2VmcyBjb2VmczsKKwlpbnQgciwgaTsKKwlzMTYgKmFycjsKKworCWlmICghZHNzX2hhc19mZWF0dXJlKEZFQVRfQ1BSKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVoZCAlaGQgJWhkICVoZCAlaGQgJWhkICVoZCAlaGQgJWhkIiwKKwkJCQkmY29lZnMucnIsICZjb2Vmcy5yZywgJmNvZWZzLnJiLAorCQkJCSZjb2Vmcy5nciwgJmNvZWZzLmdnLCAmY29lZnMuZ2IsCisJCQkJJmNvZWZzLmJyLCAmY29lZnMuYmcsICZjb2Vmcy5iYikgIT0gOSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhcnIgPSAoczE2W10peyBjb2Vmcy5yciwgY29lZnMucmcsIGNvZWZzLnJiLAorCQljb2Vmcy5nciwgY29lZnMuZ2csIGNvZWZzLmdiLAorCQljb2Vmcy5iciwgY29lZnMuYmcsIGNvZWZzLmJiIH07CisKKwlmb3IgKGkgPSAwOyBpIDwgOTsgKytpKSB7CisJCWlmIChhcnJbaV0gPCAtNTEyIHx8IGFycltpXSA+IDUxMSkKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCW1nci0+Z2V0X21hbmFnZXJfaW5mbyhtZ3IsICZpbmZvKTsKKworCWluZm8uY3ByX2NvZWZzID0gY29lZnM7CisKKwlyID0gbWdyLT5zZXRfbWFuYWdlcl9pbmZvKG1nciwgJmluZm8pOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXIgPSBtZ3ItPmFwcGx5KG1ncik7CisJaWYgKHIpCisJCXJldHVybiByOworCisJcmV0dXJuIHNpemU7Cit9CisKIHN0cnVjdCBtYW5hZ2VyX2F0dHJpYnV0ZSB7CiAJc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwogCXNzaXplX3QgKCpzaG93KShzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKiwgY2hhciAqKTsKQEAgLTMwMCw2ICs0MDIsMTIgQEAKIHN0YXRpYyBNQU5BR0VSX0FUVFIoYWxwaGFfYmxlbmRpbmdfZW5hYmxlZCwgU19JUlVHT3xTX0lXVVNSLAogCQltYW5hZ2VyX2FscGhhX2JsZW5kaW5nX2VuYWJsZWRfc2hvdywKIAkJbWFuYWdlcl9hbHBoYV9ibGVuZGluZ19lbmFibGVkX3N0b3JlKTsKK3N0YXRpYyBNQU5BR0VSX0FUVFIoY3ByX2VuYWJsZSwgU19JUlVHT3xTX0lXVVNSLAorCQltYW5hZ2VyX2Nwcl9lbmFibGVfc2hvdywKKwkJbWFuYWdlcl9jcHJfZW5hYmxlX3N0b3JlKTsKK3N0YXRpYyBNQU5BR0VSX0FUVFIoY3ByX2NvZWYsIFNfSVJVR098U19JV1VTUiwKKwkJbWFuYWdlcl9jcHJfY29lZl9zaG93LAorCQltYW5hZ2VyX2Nwcl9jb2VmX3N0b3JlKTsKIAogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqbWFuYWdlcl9zeXNmc19hdHRyc1tdID0gewpAQCAtMzEwLDYgKzQxOCw4IEBACiAJJm1hbmFnZXJfYXR0cl90cmFuc19rZXlfdmFsdWUuYXR0ciwKIAkmbWFuYWdlcl9hdHRyX3RyYW5zX2tleV9lbmFibGVkLmF0dHIsCiAJJm1hbmFnZXJfYXR0cl9hbHBoYV9ibGVuZGluZ19lbmFibGVkLmF0dHIsCisJJm1hbmFnZXJfYXR0cl9jcHJfZW5hYmxlLmF0dHIsCisJJm1hbmFnZXJfYXR0cl9jcHJfY29lZi5hdHRyLAogCU5VTEwKIH07CiAKQEAgLTM5MSwzMyArNTAxLDE0IEBACiAKIAlib29sIGVuYWJsZWQ7CiAKLQl1MzIgcGFkZHI7Ci0Jdm9pZCBfX2lvbWVtICp2YWRkcjsKLQl1MzIgcF91dl9hZGRyOyAvKiByZWxldmFudCBmb3IgTlYxMiBmb3JtYXQgb25seSAqLwotCXUxNiBzY3JlZW5fd2lkdGg7Ci0JdTE2IHdpZHRoOwotCXUxNiBoZWlnaHQ7Ci0JZW51bSBvbWFwX2NvbG9yX21vZGUgY29sb3JfbW9kZTsKLQl1OCByb3RhdGlvbjsKLQllbnVtIG9tYXBfZHNzX3JvdGF0aW9uX3R5cGUgcm90YXRpb25fdHlwZTsKLQlib29sIG1pcnJvcjsKLQotCXUxNiBwb3NfeDsKLQl1MTYgcG9zX3k7Ci0JdTE2IG91dF93aWR0aDsJLyogaWYgMCwgb3V0X3dpZHRoID09IHdpZHRoICovCi0JdTE2IG91dF9oZWlnaHQ7CS8qIGlmIDAsIG91dF9oZWlnaHQgPT0gaGVpZ2h0ICovCi0JdTggZ2xvYmFsX2FscGhhOwotCXU4IHByZV9tdWx0X2FscGhhOworCXN0cnVjdCBvbWFwX292ZXJsYXlfaW5mbyBpbmZvOwogCiAJZW51bSBvbWFwX2NoYW5uZWwgY2hhbm5lbDsKIAlib29sIHJlcGxpY2F0aW9uOwogCWJvb2wgaWxhY2U7CiAKLQllbnVtIG9tYXBfYnVyc3Rfc2l6ZSBidXJzdF9zaXplOwogCXUzMiBmaWZvX2xvdzsKIAl1MzIgZmlmb19oaWdoOwotCi0JYm9vbCBtYW51YWxfdXBkYXRlOwogfTsKIAogc3RydWN0IG1hbmFnZXJfY2FjaGVfZGF0YSB7CkBAIC00MjksMTUgKzUyMCw4IEBACiAJICogVlNZTkMvRVZTWU5DICovCiAJYm9vbCBzaGFkb3dfZGlydHk7CiAKLQl1MzIgZGVmYXVsdF9jb2xvcjsKKwlzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXJfaW5mbyBpbmZvOwogCi0JZW51bSBvbWFwX2Rzc190cmFuc19rZXlfdHlwZSB0cmFuc19rZXlfdHlwZTsKLQl1MzIgdHJhbnNfa2V5OwotCWJvb2wgdHJhbnNfZW5hYmxlZDsKLQotCWJvb2wgYWxwaGFfZW5hYmxlZDsKLQotCWJvb2wgbWFudWFsX3VwZF9kaXNwbGF5OwogCWJvb2wgbWFudWFsX3VwZGF0ZTsKIAlib29sIGRvX21hbnVhbF91cGRhdGU7CiAKQEAgLTUzOSwyNCArNjIzLDE1IEBACiAJaWYgKCFkc3NkZXYgfHwgZHNzZGV2LT5zdGF0ZSAhPSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRSkKIAkJcmV0dXJuIDA7CiAKKwlpZiAoZHNzZGV2LT5jYXBzICYgT01BUF9EU1NfRElTUExBWV9DQVBfTUFOVUFMX1VQREFURSkKKwkJcmV0dXJuIDA7CisKIAlpZiAoZHNzZGV2LT50eXBlID09IE9NQVBfRElTUExBWV9UWVBFX1ZFTkMKIAkJCXx8IGRzc2Rldi0+dHlwZSA9PSBPTUFQX0RJU1BMQVlfVFlQRV9IRE1JKSB7CiAJCWlycSA9IERJU1BDX0lSUV9FVlNZTkNfT0REIHwgRElTUENfSVJRX0VWU1lOQ19FVkVOOwogCX0gZWxzZSB7Ci0JCWlmIChkc3NkZXYtPmNhcHMgJiBPTUFQX0RTU19ESVNQTEFZX0NBUF9NQU5VQUxfVVBEQVRFKSB7Ci0JCQllbnVtIG9tYXBfZHNzX3VwZGF0ZV9tb2RlIG1vZGU7Ci0JCQltb2RlID0gZHNzZGV2LT5kcml2ZXItPmdldF91cGRhdGVfbW9kZShkc3NkZXYpOwotCQkJaWYgKG1vZGUgIT0gT01BUF9EU1NfVVBEQVRFX0FVVE8pCi0JCQkJcmV0dXJuIDA7Ci0KLQkJCWlycSA9IChkc3NkZXYtPm1hbmFnZXItPmlkID09IE9NQVBfRFNTX0NIQU5ORUxfTENEKSA/Ci0JCQkJRElTUENfSVJRX0ZSQU1FRE9ORQotCQkJCTogRElTUENfSVJRX0ZSQU1FRE9ORTI7Ci0JCX0gZWxzZSB7Ci0JCQlpcnEgPSAoZHNzZGV2LT5tYW5hZ2VyLT5pZCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRCkgPwotCQkJCURJU1BDX0lSUV9WU1lOQwotCQkJCTogRElTUENfSVJRX1ZTWU5DMjsKLQkJfQorCQlpcnEgPSAoZHNzZGV2LT5tYW5hZ2VyLT5pZCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRCkgPworCQkJRElTUENfSVJRX1ZTWU5DIDogRElTUENfSVJRX1ZTWU5DMjsKIAl9CiAKIAltYyA9ICZkc3NfY2FjaGUubWFuYWdlcl9jYWNoZVttZ3ItPmlkXTsKQEAgLTYxNywyNCArNjkyLDE1IEBACiAJaWYgKCFkc3NkZXYgfHwgZHNzZGV2LT5zdGF0ZSAhPSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRSkKIAkJcmV0dXJuIDA7CiAKKwlpZiAoZHNzZGV2LT5jYXBzICYgT01BUF9EU1NfRElTUExBWV9DQVBfTUFOVUFMX1VQREFURSkKKwkJcmV0dXJuIDA7CisKIAlpZiAoZHNzZGV2LT50eXBlID09IE9NQVBfRElTUExBWV9UWVBFX1ZFTkMKIAkJCXx8IGRzc2Rldi0+dHlwZSA9PSBPTUFQX0RJU1BMQVlfVFlQRV9IRE1JKSB7CiAJCWlycSA9IERJU1BDX0lSUV9FVlNZTkNfT0REIHwgRElTUENfSVJRX0VWU1lOQ19FVkVOOwogCX0gZWxzZSB7Ci0JCWlmIChkc3NkZXYtPmNhcHMgJiBPTUFQX0RTU19ESVNQTEFZX0NBUF9NQU5VQUxfVVBEQVRFKSB7Ci0JCQllbnVtIG9tYXBfZHNzX3VwZGF0ZV9tb2RlIG1vZGU7Ci0JCQltb2RlID0gZHNzZGV2LT5kcml2ZXItPmdldF91cGRhdGVfbW9kZShkc3NkZXYpOwotCQkJaWYgKG1vZGUgIT0gT01BUF9EU1NfVVBEQVRFX0FVVE8pCi0JCQkJcmV0dXJuIDA7Ci0KLQkJCWlycSA9IChkc3NkZXYtPm1hbmFnZXItPmlkID09IE9NQVBfRFNTX0NIQU5ORUxfTENEKSA/Ci0JCQkJRElTUENfSVJRX0ZSQU1FRE9ORQotCQkJCTogRElTUENfSVJRX0ZSQU1FRE9ORTI7Ci0JCX0gZWxzZSB7Ci0JCQlpcnEgPSAoZHNzZGV2LT5tYW5hZ2VyLT5pZCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRCkgPwotCQkJCURJU1BDX0lSUV9WU1lOQwotCQkJCTogRElTUENfSVJRX1ZTWU5DMjsKLQkJfQorCQlpcnEgPSAoZHNzZGV2LT5tYW5hZ2VyLT5pZCA9PSBPTUFQX0RTU19DSEFOTkVMX0xDRCkgPworCQkJRElTUENfSVJRX1ZTWU5DIDogRElTUENfSVJRX1ZTWU5DMjsKIAl9CiAKIAlvYyA9ICZkc3NfY2FjaGUub3ZlcmxheV9jYWNoZVtvdmwtPmlkXTsKQEAgLTcyMCwxMCArNzg2LDEyIEBACiAKIHN0YXRpYyBib29sIGRpc3BjX2lzX292ZXJsYXlfc2NhbGVkKHN0cnVjdCBvdmVybGF5X2NhY2hlX2RhdGEgKm9jKQogewotCWlmIChvYy0+b3V0X3dpZHRoICE9IDAgJiYgb2MtPndpZHRoICE9IG9jLT5vdXRfd2lkdGgpCisJc3RydWN0IG9tYXBfb3ZlcmxheV9pbmZvICpvaSA9ICZvYy0+aW5mbzsKKworCWlmIChvaS0+b3V0X3dpZHRoICE9IDAgJiYgb2ktPndpZHRoICE9IG9pLT5vdXRfd2lkdGgpCiAJCXJldHVybiB0cnVlOwogCi0JaWYgKG9jLT5vdXRfaGVpZ2h0ICE9IDAgJiYgb2MtPmhlaWdodCAhPSBvYy0+b3V0X2hlaWdodCkKKwlpZiAob2ktPm91dF9oZWlnaHQgIT0gMCAmJiBvaS0+aGVpZ2h0ICE9IG9pLT5vdXRfaGVpZ2h0KQogCQlyZXR1cm4gdHJ1ZTsKIAogCXJldHVybiBmYWxzZTsKQEAgLTczMyw2ICs4MDEsOCBAQAogewogCXN0cnVjdCBvdmVybGF5X2NhY2hlX2RhdGEgKmM7CiAJc3RydWN0IG1hbmFnZXJfY2FjaGVfZGF0YSAqbWM7CisJc3RydWN0IG9tYXBfb3ZlcmxheV9pbmZvICpvaTsKKwlzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXJfaW5mbyAqbWk7CiAJdTE2IG91dHcsIG91dGg7CiAJdTE2IHgsIHksIHcsIGg7CiAJdTMyIHBhZGRyOwpAQCAtNzQyLDYgKzgxMiw3IEBACiAJRFNTREJHRigiJWQiLCBwbGFuZSk7CiAKIAljID0gJmRzc19jYWNoZS5vdmVybGF5X2NhY2hlW3BsYW5lXTsKKwlvaSA9ICZjLT5pbmZvOwogCiAJaWYgKCFjLT5lbmFibGVkKSB7CiAJCWRpc3BjX2VuYWJsZV9wbGFuZShwbGFuZSwgMCk7CkBAIC03NDksMjEgKzgyMCwyMiBAQAogCX0KIAogCW1jID0gJmRzc19jYWNoZS5tYW5hZ2VyX2NhY2hlW2MtPmNoYW5uZWxdOworCW1pID0gJm1jLT5pbmZvOwogCi0JeCA9IGMtPnBvc194OwotCXkgPSBjLT5wb3NfeTsKLQl3ID0gYy0+d2lkdGg7Ci0JaCA9IGMtPmhlaWdodDsKLQlvdXR3ID0gYy0+b3V0X3dpZHRoID09IDAgPyBjLT53aWR0aCA6IGMtPm91dF93aWR0aDsKLQlvdXRoID0gYy0+b3V0X2hlaWdodCA9PSAwID8gYy0+aGVpZ2h0IDogYy0+b3V0X2hlaWdodDsKLQlwYWRkciA9IGMtPnBhZGRyOworCXggPSBvaS0+cG9zX3g7CisJeSA9IG9pLT5wb3NfeTsKKwl3ID0gb2ktPndpZHRoOworCWggPSBvaS0+aGVpZ2h0OworCW91dHcgPSBvaS0+b3V0X3dpZHRoID09IDAgPyBvaS0+d2lkdGggOiBvaS0+b3V0X3dpZHRoOworCW91dGggPSBvaS0+b3V0X2hlaWdodCA9PSAwID8gb2ktPmhlaWdodCA6IG9pLT5vdXRfaGVpZ2h0OworCXBhZGRyID0gb2ktPnBhZGRyOwogCiAJb3JpZ193ID0gdzsKIAlvcmlnX2ggPSBoOwogCW9yaWdfb3V0dyA9IG91dHc7CiAJb3JpZ19vdXRoID0gb3V0aDsKIAotCWlmIChjLT5tYW51YWxfdXBkYXRlICYmIG1jLT5kb19tYW51YWxfdXBkYXRlKSB7CisJaWYgKG1jLT5tYW51YWxfdXBkYXRlICYmIG1jLT5kb19tYW51YWxfdXBkYXRlKSB7CiAJCXVuc2lnbmVkIGJwcDsKIAkJdW5zaWduZWQgc2NhbGVfeF9tID0gdywgc2NhbGVfeF9kID0gb3V0dzsKIAkJdW5zaWduZWQgc2NhbGVfeV9tID0gaCwgc2NhbGVfeV9kID0gb3V0aDsKQEAgLTc3NSw3ICs4NDcsNyBAQAogCQkJcmV0dXJuIDA7CiAJCX0KIAotCQlzd2l0Y2ggKGMtPmNvbG9yX21vZGUpIHsKKwkJc3dpdGNoIChvaS0+Y29sb3JfbW9kZSkgewogCQljYXNlIE9NQVBfRFNTX0NPTE9SX05WMTI6CiAJCQlicHAgPSA4OwogCQkJYnJlYWs7CkBAIC04MDUsMjMgKzg3NywyMyBAQAogCQkJQlVHKCk7CiAJCX0KIAotCQlpZiAobWMtPnggPiBjLT5wb3NfeCkgeworCQlpZiAobWMtPnggPiBvaS0+cG9zX3gpIHsKIAkJCXggPSAwOwotCQkJb3V0dyAtPSAobWMtPnggLSBjLT5wb3NfeCk7Ci0JCQlwYWRkciArPSAobWMtPnggLSBjLT5wb3NfeCkgKgorCQkJb3V0dyAtPSAobWMtPnggLSBvaS0+cG9zX3gpOworCQkJcGFkZHIgKz0gKG1jLT54IC0gb2ktPnBvc194KSAqCiAJCQkJc2NhbGVfeF9tIC8gc2NhbGVfeF9kICogYnBwIC8gODsKIAkJfSBlbHNlIHsKLQkJCXggPSBjLT5wb3NfeCAtIG1jLT54OworCQkJeCA9IG9pLT5wb3NfeCAtIG1jLT54OwogCQl9CiAKLQkJaWYgKG1jLT55ID4gYy0+cG9zX3kpIHsKKwkJaWYgKG1jLT55ID4gb2ktPnBvc195KSB7CiAJCQl5ID0gMDsKLQkJCW91dGggLT0gKG1jLT55IC0gYy0+cG9zX3kpOwotCQkJcGFkZHIgKz0gKG1jLT55IC0gYy0+cG9zX3kpICoKKwkJCW91dGggLT0gKG1jLT55IC0gb2ktPnBvc195KTsKKwkJCXBhZGRyICs9IChtYy0+eSAtIG9pLT5wb3NfeSkgKgogCQkJCXNjYWxlX3lfbSAvIHNjYWxlX3lfZCAqCi0JCQkJYy0+c2NyZWVuX3dpZHRoICogYnBwIC8gODsKKwkJCQlvaS0+c2NyZWVuX3dpZHRoICogYnBwIC8gODsKIAkJfSBlbHNlIHsKLQkJCXkgPSBjLT5wb3NfeSAtIG1jLT55OworCQkJeSA9IG9pLT5wb3NfeSAtIG1jLT55OwogCQl9CiAKIAkJaWYgKG1jLT53IDwgKHggKyBvdXR3KSkKQEAgLTg0MCw4ICs5MTIsOCBAQAogCQkgKiB0aGUgd2lkdGggaWYgdGhlIG9yaWdpbmFsIHdpZHRoIHdhcyBiaWdnZXIuCiAJCSAqLwogCQlpZiAoKHcgJiAxKSAmJgotCQkJCShjLT5jb2xvcl9tb2RlID09IE9NQVBfRFNTX0NPTE9SX1lVVjIgfHwKLQkJCQkgYy0+Y29sb3JfbW9kZSA9PSBPTUFQX0RTU19DT0xPUl9VWVZZKSkgeworCQkJCShvaS0+Y29sb3JfbW9kZSA9PSBPTUFQX0RTU19DT0xPUl9ZVVYyIHx8CisJCQkJIG9pLT5jb2xvcl9tb2RlID09IE9NQVBfRFNTX0NPTE9SX1VZVlkpKSB7CiAJCQlpZiAob3JpZ193ID4gdykKIAkJCQl3ICs9IDE7CiAJCQllbHNlCkBAIC04NTEsMTkgKzkyMywxOSBAQAogCiAJciA9IGRpc3BjX3NldHVwX3BsYW5lKHBsYW5lLAogCQkJcGFkZHIsCi0JCQljLT5zY3JlZW5fd2lkdGgsCisJCQlvaS0+c2NyZWVuX3dpZHRoLAogCQkJeCwgeSwKIAkJCXcsIGgsCiAJCQlvdXR3LCBvdXRoLAotCQkJYy0+Y29sb3JfbW9kZSwKKwkJCW9pLT5jb2xvcl9tb2RlLAogCQkJYy0+aWxhY2UsCi0JCQljLT5yb3RhdGlvbl90eXBlLAotCQkJYy0+cm90YXRpb24sCi0JCQljLT5taXJyb3IsCi0JCQljLT5nbG9iYWxfYWxwaGEsCi0JCQljLT5wcmVfbXVsdF9hbHBoYSwKKwkJCW9pLT5yb3RhdGlvbl90eXBlLAorCQkJb2ktPnJvdGF0aW9uLAorCQkJb2ktPm1pcnJvciwKKwkJCW9pLT5nbG9iYWxfYWxwaGEsCisJCQlvaS0+cHJlX211bHRfYWxwaGEsCiAJCQljLT5jaGFubmVsLAotCQkJYy0+cF91dl9hZGRyKTsKKwkJCW9pLT5wX3V2X2FkZHIpOwogCiAJaWYgKHIpIHsKIAkJLyogdGhpcyBzaG91bGRuJ3QgaGFwcGVuICovCkBAIC04NzQsOCArOTQ2LDcgQEAKIAogCWRpc3BjX2VuYWJsZV9yZXBsaWNhdGlvbihwbGFuZSwgYy0+cmVwbGljYXRpb24pOwogCi0JZGlzcGNfc2V0X2J1cnN0X3NpemUocGxhbmUsIGMtPmJ1cnN0X3NpemUpOwotCWRpc3BjX3NldHVwX3BsYW5lX2ZpZm8ocGxhbmUsIGMtPmZpZm9fbG93LCBjLT5maWZvX2hpZ2gpOworCWRpc3BjX3NldF9maWZvX3RocmVzaG9sZChwbGFuZSwgYy0+Zmlmb19sb3csIGMtPmZpZm9faGlnaCk7CiAKIAlkaXNwY19lbmFibGVfcGxhbmUocGxhbmUsIDEpOwogCkBAIC04ODQsMTYgKzk1NSwyMSBAQAogCiBzdGF0aWMgdm9pZCBjb25maWd1cmVfbWFuYWdlcihlbnVtIG9tYXBfY2hhbm5lbCBjaGFubmVsKQogewotCXN0cnVjdCBtYW5hZ2VyX2NhY2hlX2RhdGEgKmM7CisJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyX2luZm8gKm1pOwogCiAJRFNTREJHRigiJWQiLCBjaGFubmVsKTsKIAotCWMgPSAmZHNzX2NhY2hlLm1hbmFnZXJfY2FjaGVbY2hhbm5lbF07CisJLyogcGlja2luZyBpbmZvIGZyb20gdGhlIGNhY2hlICovCisJbWkgPSAmZHNzX2NhY2hlLm1hbmFnZXJfY2FjaGVbY2hhbm5lbF0uaW5mbzsKIAotCWRpc3BjX3NldF9kZWZhdWx0X2NvbG9yKGNoYW5uZWwsIGMtPmRlZmF1bHRfY29sb3IpOwotCWRpc3BjX3NldF90cmFuc19rZXkoY2hhbm5lbCwgYy0+dHJhbnNfa2V5X3R5cGUsIGMtPnRyYW5zX2tleSk7Ci0JZGlzcGNfZW5hYmxlX3RyYW5zX2tleShjaGFubmVsLCBjLT50cmFuc19lbmFibGVkKTsKLQlkaXNwY19lbmFibGVfYWxwaGFfYmxlbmRpbmcoY2hhbm5lbCwgYy0+YWxwaGFfZW5hYmxlZCk7CisJZGlzcGNfc2V0X2RlZmF1bHRfY29sb3IoY2hhbm5lbCwgbWktPmRlZmF1bHRfY29sb3IpOworCWRpc3BjX3NldF90cmFuc19rZXkoY2hhbm5lbCwgbWktPnRyYW5zX2tleV90eXBlLCBtaS0+dHJhbnNfa2V5KTsKKwlkaXNwY19lbmFibGVfdHJhbnNfa2V5KGNoYW5uZWwsIG1pLT50cmFuc19lbmFibGVkKTsKKwlkaXNwY19lbmFibGVfYWxwaGFfYmxlbmRpbmcoY2hhbm5lbCwgbWktPmFscGhhX2VuYWJsZWQpOworCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9DUFIpKSB7CisJCWRpc3BjX2VuYWJsZV9jcHIoY2hhbm5lbCwgbWktPmNwcl9lbmFibGUpOworCQlkaXNwY19zZXRfY3ByX2NvZWYoY2hhbm5lbCwgJm1pLT5jcHJfY29lZnMpOworCX0KIH0KIAogLyogY29uZmlndXJlX2Rpc3BjKCkgdHJpZXMgdG8gd3JpdGUgdmFsdWVzIGZyb20gY2FjaGUgdG8gc2hhZG93IHJlZ2lzdGVycy4KQEAgLTkyOCw3ICsxMDA0LDcgQEAKIAkJaWYgKCFvYy0+ZGlydHkpCiAJCQljb250aW51ZTsKIAotCQlpZiAob2MtPm1hbnVhbF91cGRhdGUgJiYgIW1jLT5kb19tYW51YWxfdXBkYXRlKQorCQlpZiAobWMtPm1hbnVhbF91cGRhdGUgJiYgIW1jLT5kb19tYW51YWxfdXBkYXRlKQogCQkJY29udGludWU7CiAKIAkJaWYgKG1ncl9idXN5W29jLT5jaGFubmVsXSkgewpAQCAtOTc2LDcgKzEwNTIsNyBAQAogCQkvKiBXZSBkb24ndCBuZWVkIEdPIHdpdGggbWFudWFsIHVwZGF0ZSBkaXNwbGF5LiBMQ0QgaWZhY2Ugd2lsbAogCQkgKiBhbHdheXMgYmUgdHVybmVkIG9mZiBhZnRlciBmcmFtZSwgYW5kIG5ldyBzZXR0aW5ncyB3aWxsIGJlCiAJCSAqIHRha2VuIGluIHRvIHVzZSBhdCBuZXh0IHVwZGF0ZSAqLwotCQlpZiAoIW1jLT5tYW51YWxfdXBkX2Rpc3BsYXkpCisJCWlmICghbWMtPm1hbnVhbF91cGRhdGUpCiAJCQlkaXNwY19nbyhpKTsKIAl9CiAKQEAgLTEwMTEsNiArMTA4Nyw3IEBACiB7CiAJc3RydWN0IG92ZXJsYXlfY2FjaGVfZGF0YSAqb2M7CiAJc3RydWN0IG1hbmFnZXJfY2FjaGVfZGF0YSAqbWM7CisJc3RydWN0IG9tYXBfb3ZlcmxheV9pbmZvICpvaTsKIAljb25zdCBpbnQgbnVtX292bHMgPSBkc3NfZmVhdF9nZXRfbnVtX292bHMoKTsKIAlzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgKm1ncjsKIAlpbnQgaTsKQEAgLTEwNTMsNiArMTEzMCw3IEBACiAJCQl1bnNpZ25lZCBvdXR3LCBvdXRoOwogCiAJCQlvYyA9ICZkc3NfY2FjaGUub3ZlcmxheV9jYWNoZVtpXTsKKwkJCW9pID0gJm9jLT5pbmZvOwogCiAJCQlpZiAob2MtPmNoYW5uZWwgIT0gbWdyLT5pZCkKIAkJCQljb250aW51ZTsKQEAgLTEwNjgsMzkgKzExNDYsMzkgQEAKIAkJCWlmICghZGlzcGNfaXNfb3ZlcmxheV9zY2FsZWQob2MpKQogCQkJCWNvbnRpbnVlOwogCi0JCQlvdXR3ID0gb2MtPm91dF93aWR0aCA9PSAwID8KLQkJCQlvYy0+d2lkdGggOiBvYy0+b3V0X3dpZHRoOwotCQkJb3V0aCA9IG9jLT5vdXRfaGVpZ2h0ID09IDAgPwotCQkJCW9jLT5oZWlnaHQgOiBvYy0+b3V0X2hlaWdodDsKKwkJCW91dHcgPSBvaS0+b3V0X3dpZHRoID09IDAgPworCQkJCW9pLT53aWR0aCA6IG9pLT5vdXRfd2lkdGg7CisJCQlvdXRoID0gb2ktPm91dF9oZWlnaHQgPT0gMCA/CisJCQkJb2ktPmhlaWdodCA6IG9pLT5vdXRfaGVpZ2h0OwogCiAJCQkvKiBpcyB0aGUgb3ZlcmxheSBvdXRzaWRlIHRoZSB1cGRhdGUgcmVnaW9uPyAqLwogCQkJaWYgKCFyZWN0YW5nbGVfaW50ZXJzZWN0cyh4LCB5LCB3LCBoLAotCQkJCQkJb2MtPnBvc194LCBvYy0+cG9zX3ksCisJCQkJCQlvaS0+cG9zX3gsIG9pLT5wb3NfeSwKIAkJCQkJCW91dHcsIG91dGgpKQogCQkJCWNvbnRpbnVlOwogCiAJCQkvKiBpZiB0aGUgb3ZlcmxheSB0b3RhbGx5IGluc2lkZSB0aGUgdXBkYXRlIHJlZ2lvbj8gKi8KLQkJCWlmIChyZWN0YW5nbGVfc3Vic2V0KG9jLT5wb3NfeCwgb2MtPnBvc195LCBvdXR3LCBvdXRoLAorCQkJaWYgKHJlY3RhbmdsZV9zdWJzZXQob2ktPnBvc194LCBvaS0+cG9zX3ksIG91dHcsIG91dGgsCiAJCQkJCQl4LCB5LCB3LCBoKSkKIAkJCQljb250aW51ZTsKIAotCQkJaWYgKHggPiBvYy0+cG9zX3gpCi0JCQkJeDEgPSBvYy0+cG9zX3g7CisJCQlpZiAoeCA+IG9pLT5wb3NfeCkKKwkJCQl4MSA9IG9pLT5wb3NfeDsKIAkJCWVsc2UKIAkJCQl4MSA9IHg7CiAKLQkJCWlmICh5ID4gb2MtPnBvc195KQotCQkJCXkxID0gb2MtPnBvc195OworCQkJaWYgKHkgPiBvaS0+cG9zX3kpCisJCQkJeTEgPSBvaS0+cG9zX3k7CiAJCQllbHNlCiAJCQkJeTEgPSB5OwogCi0JCQlpZiAoKHggKyB3KSA8IChvYy0+cG9zX3ggKyBvdXR3KSkKLQkJCQl4MiA9IG9jLT5wb3NfeCArIG91dHc7CisJCQlpZiAoKHggKyB3KSA8IChvaS0+cG9zX3ggKyBvdXR3KSkKKwkJCQl4MiA9IG9pLT5wb3NfeCArIG91dHc7CiAJCQllbHNlCiAJCQkJeDIgPSB4ICsgdzsKIAotCQkJaWYgKCh5ICsgaCkgPCAob2MtPnBvc195ICsgb3V0aCkpCi0JCQkJeTIgPSBvYy0+cG9zX3kgKyBvdXRoOworCQkJaWYgKCh5ICsgaCkgPCAob2ktPnBvc195ICsgb3V0aCkpCisJCQkJeTIgPSBvaS0+cG9zX3kgKyBvdXRoOwogCQkJZWxzZQogCQkJCXkyID0geSArIGg7CiAKQEAgLTEyMzYsNiArMTMxNCwxMCBAQAogCiAJRFNTREJHKCJvbWFwX2Rzc19tZ3JfYXBwbHkoJXMpXG4iLCBtZ3ItPm5hbWUpOwogCisJciA9IGRpc3BjX3J1bnRpbWVfZ2V0KCk7CisJaWYgKHIpCisJCXJldHVybiByOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRzc19jYWNoZS5sb2NrLCBmbGFncyk7CiAKIAkvKiBDb25maWd1cmUgb3ZlcmxheXMgKi8KQEAgLTEyNzUsMjMgKzEzNTcsNyBAQAogCiAJCW92bC0+aW5mb19kaXJ0eSA9IGZhbHNlOwogCQlvYy0+ZGlydHkgPSB0cnVlOwotCi0JCW9jLT5wYWRkciA9IG92bC0+aW5mby5wYWRkcjsKLQkJb2MtPnZhZGRyID0gb3ZsLT5pbmZvLnZhZGRyOwotCQlvYy0+cF91dl9hZGRyID0gb3ZsLT5pbmZvLnBfdXZfYWRkcjsKLQkJb2MtPnNjcmVlbl93aWR0aCA9IG92bC0+aW5mby5zY3JlZW5fd2lkdGg7Ci0JCW9jLT53aWR0aCA9IG92bC0+aW5mby53aWR0aDsKLQkJb2MtPmhlaWdodCA9IG92bC0+aW5mby5oZWlnaHQ7Ci0JCW9jLT5jb2xvcl9tb2RlID0gb3ZsLT5pbmZvLmNvbG9yX21vZGU7Ci0JCW9jLT5yb3RhdGlvbiA9IG92bC0+aW5mby5yb3RhdGlvbjsKLQkJb2MtPnJvdGF0aW9uX3R5cGUgPSBvdmwtPmluZm8ucm90YXRpb25fdHlwZTsKLQkJb2MtPm1pcnJvciA9IG92bC0+aW5mby5taXJyb3I7Ci0JCW9jLT5wb3NfeCA9IG92bC0+aW5mby5wb3NfeDsKLQkJb2MtPnBvc195ID0gb3ZsLT5pbmZvLnBvc195OwotCQlvYy0+b3V0X3dpZHRoID0gb3ZsLT5pbmZvLm91dF93aWR0aDsKLQkJb2MtPm91dF9oZWlnaHQgPSBvdmwtPmluZm8ub3V0X2hlaWdodDsKLQkJb2MtPmdsb2JhbF9hbHBoYSA9IG92bC0+aW5mby5nbG9iYWxfYWxwaGE7Ci0JCW9jLT5wcmVfbXVsdF9hbHBoYSA9IG92bC0+aW5mby5wcmVfbXVsdF9hbHBoYTsKKwkJb2MtPmluZm8gPSBvdmwtPmluZm87CiAKIAkJb2MtPnJlcGxpY2F0aW9uID0KIAkJCWRzc191c2VfcmVwbGljYXRpb24oZHNzZGV2LCBvdmwtPmluZm8uY29sb3JfbW9kZSk7CkBAIC0xMzAyLDExICsxMzY4LDYgQEAKIAogCQlvYy0+ZW5hYmxlZCA9IHRydWU7CiAKLQkJb2MtPm1hbnVhbF91cGRhdGUgPQotCQkJZHNzZGV2LT5jYXBzICYgT01BUF9EU1NfRElTUExBWV9DQVBfTUFOVUFMX1VQREFURSAmJgotCQkJZHNzZGV2LT5kcml2ZXItPmdldF91cGRhdGVfbW9kZShkc3NkZXYpICE9Ci0JCQkJT01BUF9EU1NfVVBEQVRFX0FVVE87Ci0KIAkJKytudW1fcGxhbmVzX2VuYWJsZWQ7CiAJfQogCkBAIC0xMzM0LDIwICsxMzk1LDEwIEBACiAKIAkJbWdyLT5pbmZvX2RpcnR5ID0gZmFsc2U7CiAJCW1jLT5kaXJ0eSA9IHRydWU7Ci0KLQkJbWMtPmRlZmF1bHRfY29sb3IgPSBtZ3ItPmluZm8uZGVmYXVsdF9jb2xvcjsKLQkJbWMtPnRyYW5zX2tleV90eXBlID0gbWdyLT5pbmZvLnRyYW5zX2tleV90eXBlOwotCQltYy0+dHJhbnNfa2V5ID0gbWdyLT5pbmZvLnRyYW5zX2tleTsKLQkJbWMtPnRyYW5zX2VuYWJsZWQgPSBtZ3ItPmluZm8udHJhbnNfZW5hYmxlZDsKLQkJbWMtPmFscGhhX2VuYWJsZWQgPSBtZ3ItPmluZm8uYWxwaGFfZW5hYmxlZDsKLQotCQltYy0+bWFudWFsX3VwZF9kaXNwbGF5ID0KLQkJCWRzc2Rldi0+Y2FwcyAmIE9NQVBfRFNTX0RJU1BMQVlfQ0FQX01BTlVBTF9VUERBVEU7CisJCW1jLT5pbmZvID0gbWdyLT5pbmZvOwogCiAJCW1jLT5tYW51YWxfdXBkYXRlID0KLQkJCWRzc2Rldi0+Y2FwcyAmIE9NQVBfRFNTX0RJU1BMQVlfQ0FQX01BTlVBTF9VUERBVEUgJiYKLQkJCWRzc2Rldi0+ZHJpdmVyLT5nZXRfdXBkYXRlX21vZGUoZHNzZGV2KSAhPQotCQkJCU9NQVBfRFNTX1VQREFURV9BVVRPOworCQkJZHNzZGV2LT5jYXBzICYgT01BUF9EU1NfRElTUExBWV9DQVBfTUFOVUFMX1VQREFURTsKIAl9CiAKIAkvKiBYWFggVE9ETzogVHJ5IHRvIGdldCBmaWZvbWVyZ2Ugd29ya2luZy4gVGhlIHByb2JsZW0gaXMgdGhhdCBpdApAQCAtMTM2OCw3ICsxNDE5LDcgQEAKIAkvKiBDb25maWd1cmUgb3ZlcmxheSBmaWZvcyAqLwogCWZvciAoaSA9IDA7IGkgPCBvbWFwX2Rzc19nZXRfbnVtX292ZXJsYXlzKCk7ICsraSkgewogCQlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXY7Ci0JCXUzMiBzaXplOworCQl1MzIgc2l6ZSwgYnVyc3Rfc2l6ZTsKIAogCQlvdmwgPSBvbWFwX2Rzc19nZXRfb3ZlcmxheShpKTsKIApAQCAtMTM4Niw2ICsxNDM3LDggQEAKIAkJaWYgKHVzZV9maWZvbWVyZ2UpCiAJCQlzaXplICo9IDM7CiAKKwkJYnVyc3Rfc2l6ZSA9IGRpc3BjX2dldF9idXJzdF9zaXplKG92bC0+aWQpOworCiAJCXN3aXRjaCAoZHNzZGV2LT50eXBlKSB7CiAJCWNhc2UgT01BUF9ESVNQTEFZX1RZUEVfRFBJOgogCQljYXNlIE9NQVBfRElTUExBWV9UWVBFX0RCSToKQEAgLTEzOTMsMTMgKzE0NDYsMTMgQEAKIAkJY2FzZSBPTUFQX0RJU1BMQVlfVFlQRV9WRU5DOgogCQljYXNlIE9NQVBfRElTUExBWV9UWVBFX0hETUk6CiAJCQlkZWZhdWx0X2dldF9vdmVybGF5X2ZpZm9fdGhyZXNob2xkcyhvdmwtPmlkLCBzaXplLAotCQkJCQkmb2MtPmJ1cnN0X3NpemUsICZvYy0+Zmlmb19sb3csCisJCQkJCWJ1cnN0X3NpemUsICZvYy0+Zmlmb19sb3csCiAJCQkJCSZvYy0+Zmlmb19oaWdoKTsKIAkJCWJyZWFrOwogI2lmZGVmIENPTkZJR19PTUFQMl9EU1NfRFNJCiAJCWNhc2UgT01BUF9ESVNQTEFZX1RZUEVfRFNJOgogCQkJZHNpX2dldF9vdmVybGF5X2ZpZm9fdGhyZXNob2xkcyhvdmwtPmlkLCBzaXplLAotCQkJCQkmb2MtPmJ1cnN0X3NpemUsICZvYy0+Zmlmb19sb3csCisJCQkJCWJ1cnN0X3NpemUsICZvYy0+Zmlmb19sb3csCiAJCQkJCSZvYy0+Zmlmb19oaWdoKTsKIAkJCWJyZWFrOwogI2VuZGlmCkBAIC0xNDA5LDcgKzE0NjIsNiBAQAogCX0KIAogCXIgPSAwOwotCWRzc19jbGtfZW5hYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0spOwogCWlmICghZHNzX2NhY2hlLmlycV9lbmFibGVkKSB7CiAJCXUzMiBtYXNrOwogCkBAIC0xNDIyLDEwICsxNDc0LDExIEBACiAJCWRzc19jYWNoZS5pcnFfZW5hYmxlZCA9IHRydWU7CiAJfQogCWNvbmZpZ3VyZV9kaXNwYygpOwotCWRzc19jbGtfZGlzYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzc19jYWNoZS5sb2NrLCBmbGFncyk7CiAKKwlkaXNwY19ydW50aW1lX3B1dCgpOworCiAJcmV0dXJuIHI7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL292ZXJsYXkuYyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL292ZXJsYXkuYwppbmRleCAwZjA4MDI1Li5jODQzODBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9vdmVybGF5LmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3Mvb3ZlcmxheS5jCkBAIC04NCwzMiArODQsNDIgQEAKIAogCW9sZF9tZ3IgPSBvdmwtPm1hbmFnZXI7CiAKKwlyID0gZGlzcGNfcnVudGltZV9nZXQoKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKIAkvKiBkZXRhY2ggb2xkIG1hbmFnZXIgKi8KIAlpZiAob2xkX21ncikgewogCQlyID0gb3ZsLT51bnNldF9tYW5hZ2VyKG92bCk7CiAJCWlmIChyKSB7CiAJCQlEU1NFUlIoImRldGFjaCBmYWlsZWRcbiIpOwotCQkJcmV0dXJuIHI7CisJCQlnb3RvIGVycjsKIAkJfQogCiAJCXIgPSBvbGRfbWdyLT5hcHBseShvbGRfbWdyKTsKIAkJaWYgKHIpCi0JCQlyZXR1cm4gcjsKKwkJCWdvdG8gZXJyOwogCX0KIAogCWlmIChtZ3IpIHsKIAkJciA9IG92bC0+c2V0X21hbmFnZXIob3ZsLCBtZ3IpOwogCQlpZiAocikgewogCQkJRFNTRVJSKCJGYWlsZWQgdG8gYXR0YWNoIG92ZXJsYXlcbiIpOwotCQkJcmV0dXJuIHI7CisJCQlnb3RvIGVycjsKIAkJfQogCiAJCXIgPSBtZ3ItPmFwcGx5KG1ncik7CiAJCWlmIChyKQotCQkJcmV0dXJuIHI7CisJCQlnb3RvIGVycjsKIAl9CiAKKwlkaXNwY19ydW50aW1lX3B1dCgpOworCiAJcmV0dXJuIHNpemU7CisKK2VycjoKKwlkaXNwY19ydW50aW1lX3B1dCgpOworCXJldHVybiByOwogfQogCiBzdGF0aWMgc3NpemVfdCBvdmVybGF5X2lucHV0X3NpemVfc2hvdyhzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmwsIGNoYXIgKmJ1ZikKQEAgLTIzOCw2ICsyNDgsOSBAQAogCXU4IGFscGhhOwogCXN0cnVjdCBvbWFwX292ZXJsYXlfaW5mbyBpbmZvOwogCisJaWYgKCFkc3NfaGFzX2ZlYXR1cmUoRkVBVF9HTE9CQUxfQUxQSEEpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwogCXIgPSBrc3RydG91OChidWYsIDAsICZhbHBoYSk7CiAJaWYgKHIpCiAJCXJldHVybiByOwpAQCAtNTA0LDcgKzUxNyw2IEBACiAKIAlvdmwtPm1hbmFnZXIgPSBtZ3I7CiAKLQlkc3NfY2xrX2VuYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLKTsKIAkvKiBYWFg6IFdoZW4gdGhlcmUgaXMgYW4gb3ZlcmxheSBvbiBhIERTSSBtYW51YWwgdXBkYXRlIGRpc3BsYXksIGFuZAogCSAqIHRoZSBvdmVybGF5IGlzIGZpcnN0IGRpc2FibGVkLCB0aGVuIG1vdmVkIHRvIHR2LCBhbmQgZW5hYmxlZCwgd2UKIAkgKiBzZWVtIHRvIGdldCBTWU5DX0xPU1RfRElHSVQgZXJyb3IuCkBAIC01MTgsNyArNTMwLDYgQEAKIAkgKiB0aGUgb3ZlcmxheSwgYnV0IGJlZm9yZSBtb3ZpbmcgdGhlIG92ZXJsYXkgdG8gVFYuCiAJICovCiAJZGlzcGNfc2V0X2NoYW5uZWxfb3V0KG92bC0+aWQsIG1nci0+aWQpOwotCWRzc19jbGtfZGlzYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLKTsKIAogCXJldHVybiAwOwogfQpAQCAtNzE5LDYgKzczMCw4IEBACiAJfQogCiAJaWYgKG1ncikgeworCQlkaXNwY19ydW50aW1lX2dldCgpOworCiAJCWZvciAoaSA9IDA7IGkgPCBkc3NfZmVhdF9nZXRfbnVtX292bHMoKTsgaSsrKSB7CiAJCQlzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmw7CiAJCQlvdmwgPSBvbWFwX2Rzc19nZXRfb3ZlcmxheShpKTsKQEAgLTcyOCw2ICs3NDEsOCBAQAogCQkJCW9tYXBfZHNzX3NldF9tYW5hZ2VyKG92bCwgbWdyKTsKIAkJCX0KIAkJfQorCisJCWRpc3BjX3J1bnRpbWVfcHV0KCk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9yZmJpLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9yZmJpLmMKaW5kZXggYzA2ZmJlMC4uMzlmNGM1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvcmZiaS5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3JmYmkuYwpAQCAtMzMsNiArMzMsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KIAogI2luY2x1ZGUgPHZpZGVvL29tYXBkc3MuaD4KICNpbmNsdWRlICJkc3MuaCIKQEAgLTEyMCwxMiArMTIyLDI1IEBACiAJcmV0dXJuIF9fcmF3X3JlYWRsKHJmYmkuYmFzZSArIGlkeC5pZHgpOwogfQogCi1zdGF0aWMgdm9pZCByZmJpX2VuYWJsZV9jbG9ja3MoYm9vbCBlbmFibGUpCitzdGF0aWMgaW50IHJmYmlfcnVudGltZV9nZXQodm9pZCkKIHsKLQlpZiAoZW5hYmxlKQotCQlkc3NfY2xrX2VuYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLKTsKLQllbHNlCi0JCWRzc19jbGtfZGlzYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLKTsKKwlpbnQgcjsKKworCURTU0RCRygicmZiaV9ydW50aW1lX2dldFxuIik7CisKKwlyID0gcG1fcnVudGltZV9nZXRfc3luYygmcmZiaS5wZGV2LT5kZXYpOworCVdBUk5fT04ociA8IDApOworCXJldHVybiByIDwgMCA/IHIgOiAwOworfQorCitzdGF0aWMgdm9pZCByZmJpX3J1bnRpbWVfcHV0KHZvaWQpCit7CisJaW50IHI7CisKKwlEU1NEQkcoInJmYmlfcnVudGltZV9wdXRcbiIpOworCisJciA9IHBtX3J1bnRpbWVfcHV0KCZyZmJpLnBkZXYtPmRldik7CisJV0FSTl9PTihyIDwgMCk7CiB9CiAKIHZvaWQgcmZiaV9idXNfbG9jayh2b2lkKQpAQCAtODA1LDcgKzgyMCw4IEBACiB7CiAjZGVmaW5lIERVTVBSRUcocikgc2VxX3ByaW50ZihzLCAiJS0zNXMgJTA4eFxuIiwgI3IsIHJmYmlfcmVhZF9yZWcocikpCiAKLQlkc3NfY2xrX2VuYWJsZShEU1NfQ0xLX0lDSyB8IERTU19DTEtfRkNLKTsKKwlpZiAocmZiaV9ydW50aW1lX2dldCgpKQorCQlyZXR1cm47CiAKIAlEVU1QUkVHKFJGQklfUkVWSVNJT04pOwogCURVTVBSRUcoUkZCSV9TWVNDT05GSUcpOwpAQCAtODM2LDcgKzg1Miw3IEBACiAJRFVNUFJFRyhSRkJJX1ZTWU5DX1dJRFRIKTsKIAlEVU1QUkVHKFJGQklfSFNZTkNfV0lEVEgpOwogCi0JZHNzX2Nsa19kaXNhYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0spOworCXJmYmlfcnVudGltZV9wdXQoKTsKICN1bmRlZiBEVU1QUkVHCiB9CiAKQEAgLTg0NCw3ICs4NjAsOSBAQAogewogCWludCByOwogCi0JcmZiaV9lbmFibGVfY2xvY2tzKDEpOworCXIgPSByZmJpX3J1bnRpbWVfZ2V0KCk7CisJaWYgKHIpCisJCXJldHVybiByOwogCiAJciA9IG9tYXBfZHNzX3N0YXJ0X2RldmljZShkc3NkZXYpOwogCWlmIChyKSB7CkBAIC04NzksNiArODk3LDcgQEAKIGVycjE6CiAJb21hcF9kc3Nfc3RvcF9kZXZpY2UoZHNzZGV2KTsKIGVycjA6CisJcmZiaV9ydW50aW1lX3B1dCgpOwogCXJldHVybiByOwogfQogRVhQT1JUX1NZTUJPTChvbWFwZHNzX3JmYmlfZGlzcGxheV9lbmFibGUpOwpAQCAtODg5LDcgKzkwOCw3IEBACiAJCQlESVNQQ19JUlFfRlJBTUVET05FKTsKIAlvbWFwX2Rzc19zdG9wX2RldmljZShkc3NkZXYpOwogCi0JcmZiaV9lbmFibGVfY2xvY2tzKDApOworCXJmYmlfcnVudGltZV9wdXQoKTsKIH0KIEVYUE9SVF9TWU1CT0wob21hcGRzc19yZmJpX2Rpc3BsYXlfZGlzYWJsZSk7CiAKQEAgLTkwNCw4ICs5MjMsOSBAQAogc3RhdGljIGludCBvbWFwX3JmYmlod19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXUzMiByZXY7Ci0JdTMyIGw7CiAJc3RydWN0IHJlc291cmNlICpyZmJpX21lbTsKKwlzdHJ1Y3QgY2xrICpjbGs7CisJaW50IHI7CiAKIAlyZmJpLnBkZXYgPSBwZGV2OwogCkBAIC05MTQsNDYgKzkzNCwxMDIgQEAKIAlyZmJpX21lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShyZmJpLnBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKIAlpZiAoIXJmYmlfbWVtKSB7CiAJCURTU0VSUigiY2FuJ3QgZ2V0IElPUkVTT1VSQ0VfTUVNIFJGQklcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX2lvcmVtYXA7CiAJfQogCXJmYmkuYmFzZSA9IGlvcmVtYXAocmZiaV9tZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJmYmlfbWVtKSk7CiAJaWYgKCFyZmJpLmJhc2UpIHsKIAkJRFNTRVJSKCJjYW4ndCBpb3JlbWFwIFJGQklcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2lvcmVtYXA7CiAJfQogCi0JcmZiaV9lbmFibGVfY2xvY2tzKDEpOworCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOworCisJciA9IHJmYmlfcnVudGltZV9nZXQoKTsKKwlpZiAocikKKwkJZ290byBlcnJfZ2V0X3JmYmk7CiAKIAltc2xlZXAoMTApOwogCi0JcmZiaS5sNF9raHogPSBkc3NfY2xrX2dldF9yYXRlKERTU19DTEtfSUNLKSAvIDEwMDA7CisJaWYgKGNwdV9pc19vbWFwMjR4eCgpIHx8IGNwdV9pc19vbWFwMzR4eCgpIHx8IGNwdV9pc19vbWFwMzYzMCgpKQorCQljbGsgPSBkc3NfZ2V0X2ljaygpOworCWVsc2UKKwkJY2xrID0gY2xrX2dldCgmcGRldi0+ZGV2LCAiaWNrIik7CisJaWYgKElTX0VSUihjbGspKSB7CisJCURTU0VSUigiY2FuJ3QgZ2V0IGlja1xuIik7CisJCXIgPSBQVFJfRVJSKGNsayk7CisJCWdvdG8gZXJyX2dldF9pY2s7CisJfQogCi0JLyogRW5hYmxlIGF1dG9pZGxlIGFuZCBzbWFydC1pZGxlICovCi0JbCA9IHJmYmlfcmVhZF9yZWcoUkZCSV9TWVNDT05GSUcpOwotCWwgfD0gKDEgPDwgMCkgfCAoMiA8PCAzKTsKLQlyZmJpX3dyaXRlX3JlZyhSRkJJX1NZU0NPTkZJRywgbCk7CisJcmZiaS5sNF9raHogPSBjbGtfZ2V0X3JhdGUoY2xrKSAvIDEwMDA7CisKKwljbGtfcHV0KGNsayk7CiAKIAlyZXYgPSByZmJpX3JlYWRfcmVnKFJGQklfUkVWSVNJT04pOwogCWRldl9kYmcoJnBkZXYtPmRldiwgIk9NQVAgUkZCSSByZXYgJWQuJWRcbiIsCiAJICAgICAgIEZMRF9HRVQocmV2LCA3LCA0KSwgRkxEX0dFVChyZXYsIDMsIDApKTsKIAotCXJmYmlfZW5hYmxlX2Nsb2NrcygwKTsKKwlyZmJpX3J1bnRpbWVfcHV0KCk7CiAKIAlyZXR1cm4gMDsKKworZXJyX2dldF9pY2s6CisJcmZiaV9ydW50aW1lX3B1dCgpOworZXJyX2dldF9yZmJpOgorCXBtX3J1bnRpbWVfZGlzYWJsZSgmcGRldi0+ZGV2KTsKKwlpb3VubWFwKHJmYmkuYmFzZSk7CitlcnJfaW9yZW1hcDoKKwlyZXR1cm4gcjsKIH0KIAogc3RhdGljIGludCBvbWFwX3JmYmlod19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CiAJaW91bm1hcChyZmJpLmJhc2UpOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHJmYmlfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlkaXNwY19ydW50aW1lX3B1dCgpOworCWRzc19ydW50aW1lX3B1dCgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmZiaV9ydW50aW1lX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IHI7CisKKwlyID0gZHNzX3J1bnRpbWVfZ2V0KCk7CisJaWYgKHIgPCAwKQorCQlnb3RvIGVycl9nZXRfZHNzOworCisJciA9IGRpc3BjX3J1bnRpbWVfZ2V0KCk7CisJaWYgKHIgPCAwKQorCQlnb3RvIGVycl9nZXRfZGlzcGM7CisKKwlyZXR1cm4gMDsKKworZXJyX2dldF9kaXNwYzoKKwlkc3NfcnVudGltZV9wdXQoKTsKK2Vycl9nZXRfZHNzOgorCXJldHVybiByOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgcmZiaV9wbV9vcHMgPSB7CisJLnJ1bnRpbWVfc3VzcGVuZCA9IHJmYmlfcnVudGltZV9zdXNwZW5kLAorCS5ydW50aW1lX3Jlc3VtZSA9IHJmYmlfcnVudGltZV9yZXN1bWUsCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBvbWFwX3JmYmlod19kcml2ZXIgPSB7CiAJLnByb2JlICAgICAgICAgID0gb21hcF9yZmJpaHdfcHJvYmUsCiAJLnJlbW92ZSAgICAgICAgID0gb21hcF9yZmJpaHdfcmVtb3ZlLAogCS5kcml2ZXIgICAgICAgICA9IHsKIAkJLm5hbWUgICA9ICJvbWFwZHNzX3JmYmkiLAogCQkub3duZXIgID0gVEhJU19NT0RVTEUsCisJCS5wbQk9ICZyZmJpX3BtX29wcywKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3Mvc2RpLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9zZGkuYwppbmRleCAwYmQ0YjAzLi4zYTY4OGM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9zZGkuYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy9zZGkuYwpAQCAtMjAsMTMgKzIwLDExIEBACiAjZGVmaW5lIERTU19TVUJTWVNfTkFNRSAiU0RJIgogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9lcnIuaD4KICNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KIAogI2luY2x1ZGUgPHZpZGVvL29tYXBkc3MuaD4KLSNpbmNsdWRlIDxwbGF0L2NwdS5oPgogI2luY2x1ZGUgImRzcy5oIgogCiBzdGF0aWMgc3RydWN0IHsKQEAgLTYwLDE0ICs1OCwyMCBAQAogCXIgPSBvbWFwX2Rzc19zdGFydF9kZXZpY2UoZHNzZGV2KTsKIAlpZiAocikgewogCQlEU1NFUlIoImZhaWxlZCB0byBzdGFydCBkZXZpY2VcbiIpOwotCQlnb3RvIGVycjA7CisJCWdvdG8gZXJyX3N0YXJ0X2RldjsKIAl9CiAKIAlyID0gcmVndWxhdG9yX2VuYWJsZShzZGkudmRkc19zZGlfcmVnKTsKIAlpZiAocikKLQkJZ290byBlcnIxOworCQlnb3RvIGVycl9yZWdfZW5hYmxlOwogCi0JZHNzX2Nsa19lbmFibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSyk7CisJciA9IGRzc19ydW50aW1lX2dldCgpOworCWlmIChyKQorCQlnb3RvIGVycl9nZXRfZHNzOworCisJciA9IGRpc3BjX3J1bnRpbWVfZ2V0KCk7CisJaWYgKHIpCisJCWdvdG8gZXJyX2dldF9kaXNwYzsKIAogCXNkaV9iYXNpY19pbml0KGRzc2Rldik7CiAKQEAgLTgwLDcgKzg0LDcgQEAKIAlyID0gZHNzX2NhbGNfY2xvY2tfZGl2KDEsIHQtPnBpeGVsX2Nsb2NrICogMTAwMCwKIAkJCSZkc3NfY2luZm8sICZkaXNwY19jaW5mbyk7CiAJaWYgKHIpCi0JCWdvdG8gZXJyMjsKKwkJZ290byBlcnJfY2FsY19jbG9ja19kaXY7CiAKIAlmY2sgPSBkc3NfY2luZm8uZmNrOwogCWxja19kaXYgPSBkaXNwY19jaW5mby5sY2tfZGl2OwpAQCAtMTAxLDI3ICsxMDUsMzQgQEAKIAogCXIgPSBkc3Nfc2V0X2Nsb2NrX2RpdigmZHNzX2NpbmZvKTsKIAlpZiAocikKLQkJZ290byBlcnIyOworCQlnb3RvIGVycl9zZXRfZHNzX2Nsb2NrX2RpdjsKIAogCXIgPSBkaXNwY19zZXRfY2xvY2tfZGl2KGRzc2Rldi0+bWFuYWdlci0+aWQsICZkaXNwY19jaW5mbyk7CiAJaWYgKHIpCi0JCWdvdG8gZXJyMjsKKwkJZ290byBlcnJfc2V0X2Rpc3BjX2Nsb2NrX2RpdjsKIAogCWRzc19zZGlfaW5pdChkc3NkZXYtPnBoeS5zZGkuZGF0YXBhaXJzKTsKIAlyID0gZHNzX3NkaV9lbmFibGUoKTsKIAlpZiAocikKLQkJZ290byBlcnIxOworCQlnb3RvIGVycl9zZGlfZW5hYmxlOwogCW1kZWxheSgyKTsKIAogCWRzc2Rldi0+bWFuYWdlci0+ZW5hYmxlKGRzc2Rldi0+bWFuYWdlcik7CiAKIAlyZXR1cm4gMDsKLWVycjI6Ci0JZHNzX2Nsa19kaXNhYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0spOworCitlcnJfc2RpX2VuYWJsZToKK2Vycl9zZXRfZGlzcGNfY2xvY2tfZGl2OgorZXJyX3NldF9kc3NfY2xvY2tfZGl2OgorZXJyX2NhbGNfY2xvY2tfZGl2OgorCWRpc3BjX3J1bnRpbWVfcHV0KCk7CitlcnJfZ2V0X2Rpc3BjOgorCWRzc19ydW50aW1lX3B1dCgpOworZXJyX2dldF9kc3M6CiAJcmVndWxhdG9yX2Rpc2FibGUoc2RpLnZkZHNfc2RpX3JlZyk7Ci1lcnIxOgorZXJyX3JlZ19lbmFibGU6CiAJb21hcF9kc3Nfc3RvcF9kZXZpY2UoZHNzZGV2KTsKLWVycjA6CitlcnJfc3RhcnRfZGV2OgogCXJldHVybiByOwogfQogRVhQT1JUX1NZTUJPTChvbWFwZHNzX3NkaV9kaXNwbGF5X2VuYWJsZSk7CkBAIC0xMzIsNyArMTQzLDggQEAKIAogCWRzc19zZGlfZGlzYWJsZSgpOwogCi0JZHNzX2Nsa19kaXNhYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0spOworCWRpc3BjX3J1bnRpbWVfcHV0KCk7CisJZHNzX3J1bnRpbWVfcHV0KCk7CiAKIAlyZWd1bGF0b3JfZGlzYWJsZShzZGkudmRkc19zZGlfcmVnKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvdmVuYy5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9kc3MvdmVuYy5jCmluZGV4IDk4MGY5MTkuLjE3M2M2NjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcDIvZHNzL3ZlbmMuYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL2Rzcy92ZW5jLmMKQEAgLTMzLDExICszMywxMyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogCiAjaW5jbHVkZSA8dmlkZW8vb21hcGRzcy5oPgogI2luY2x1ZGUgPHBsYXQvY3B1Lmg+CiAKICNpbmNsdWRlICJkc3MuaCIKKyNpbmNsdWRlICJkc3NfZmVhdHVyZXMuaCIKIAogLyogVmVuYyByZWdpc3RlcnMgKi8KICNkZWZpbmUgVkVOQ19SRVZfSUQJCQkJMHgwMApAQCAtMjkyLDYgKzI5NCw5IEBACiAJc3RydWN0IG11dGV4IHZlbmNfbG9jazsKIAl1MzIgd3NzX2RhdGE7CiAJc3RydWN0IHJlZ3VsYXRvciAqdmRkYV9kYWNfcmVnOworCisJc3RydWN0IGNsawkqdHZfY2xrOworCXN0cnVjdCBjbGsJKnR2X2RhY19jbGs7CiB9IHZlbmM7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB2ZW5jX3dyaXRlX3JlZyhpbnQgaWR4LCB1MzIgdmFsKQpAQCAtMzgwLDE0ICszODUsMjUgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgdm9pZCB2ZW5jX2VuYWJsZV9jbG9ja3MoaW50IGVuYWJsZSkKK3N0YXRpYyBpbnQgdmVuY19ydW50aW1lX2dldCh2b2lkKQogewotCWlmIChlbmFibGUpCi0JCWRzc19jbGtfZW5hYmxlKERTU19DTEtfSUNLIHwgRFNTX0NMS19GQ0sgfCBEU1NfQ0xLX1RWRkNLIHwKLQkJCQlEU1NfQ0xLX1ZJREZDSyk7Ci0JZWxzZQotCQlkc3NfY2xrX2Rpc2FibGUoRFNTX0NMS19JQ0sgfCBEU1NfQ0xLX0ZDSyB8IERTU19DTEtfVFZGQ0sgfAotCQkJCURTU19DTEtfVklERkNLKTsKKwlpbnQgcjsKKworCURTU0RCRygidmVuY19ydW50aW1lX2dldFxuIik7CisKKwlyID0gcG1fcnVudGltZV9nZXRfc3luYygmdmVuYy5wZGV2LT5kZXYpOworCVdBUk5fT04ociA8IDApOworCXJldHVybiByIDwgMCA/IHIgOiAwOworfQorCitzdGF0aWMgdm9pZCB2ZW5jX3J1bnRpbWVfcHV0KHZvaWQpCit7CisJaW50IHI7CisKKwlEU1NEQkcoInZlbmNfcnVudGltZV9wdXRcbiIpOworCisJciA9IHBtX3J1bnRpbWVfcHV0KCZ2ZW5jLnBkZXYtPmRldik7CisJV0FSTl9PTihyIDwgMCk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdmVuY19jb25maWcgKnZlbmNfdGltaW5nc190b19jb25maWcoCkBAIC00MDYsOCArNDIyLDYgQEAKIHsKIAl1MzIgbDsKIAotCXZlbmNfZW5hYmxlX2Nsb2NrcygxKTsKLQogCXZlbmNfcmVzZXQoKTsKIAl2ZW5jX3dyaXRlX2NvbmZpZyh2ZW5jX3RpbWluZ3NfdG9fY29uZmlnKCZkc3NkZXYtPnBhbmVsLnRpbWluZ3MpKTsKIApAQCAtNDQ4LDggKzQ2Miw2IEBACiAJCWRzc2Rldi0+cGxhdGZvcm1fZGlzYWJsZShkc3NkZXYpOwogCiAJcmVndWxhdG9yX2Rpc2FibGUodmVuYy52ZGRhX2RhY19yZWcpOwotCi0JdmVuY19lbmFibGVfY2xvY2tzKDApOwogfQogCiAKQEAgLTQ4Nyw2ICs0OTksMTAgQEAKIAkJZ290byBlcnIxOwogCX0KIAorCXIgPSB2ZW5jX3J1bnRpbWVfZ2V0KCk7CisJaWYgKHIpCisJCWdvdG8gZXJyMTsKKwogCXZlbmNfcG93ZXJfb24oZHNzZGV2KTsKIAogCXZlbmMud3NzX2RhdGEgPSAwOwpAQCAtNTIwLDYgKzUzNiw4IEBACiAKIAl2ZW5jX3Bvd2VyX29mZihkc3NkZXYpOwogCisJdmVuY19ydW50aW1lX3B1dCgpOworCiAJZHNzZGV2LT5zdGF0ZSA9IE9NQVBfRFNTX0RJU1BMQVlfRElTQUJMRUQ7CiAKIAlvbWFwX2Rzc19zdG9wX2RldmljZShkc3NkZXYpOwpAQCAtNTM4LDIwICs1NTYsNiBAQAogCXJldHVybiB2ZW5jX3BhbmVsX2VuYWJsZShkc3NkZXYpOwogfQogCi1zdGF0aWMgZW51bSBvbWFwX2Rzc191cGRhdGVfbW9kZSB2ZW5jX2dldF91cGRhdGVfbW9kZSgKLQkJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQotewotCXJldHVybiBPTUFQX0RTU19VUERBVEVfQVVUTzsKLX0KLQotc3RhdGljIGludCB2ZW5jX3NldF91cGRhdGVfbW9kZShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsCi0JCWVudW0gb21hcF9kc3NfdXBkYXRlX21vZGUgbW9kZSkKLXsKLQlpZiAobW9kZSAhPSBPTUFQX0RTU19VUERBVEVfQVVUTykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyB2b2lkIHZlbmNfZ2V0X3RpbWluZ3Moc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAogCQkJc3RydWN0IG9tYXBfdmlkZW9fdGltaW5ncyAqdGltaW5ncykKIHsKQEAgLTU5OCw2ICs2MDIsNyBAQAogc3RhdGljIGludCB2ZW5jX3NldF93c3Moc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAl1MzIgd3NzKQogewogCWNvbnN0IHN0cnVjdCB2ZW5jX2NvbmZpZyAqY29uZmlnOworCWludCByOwogCiAJRFNTREJHKCJ2ZW5jX3NldF93c3NcbiIpOwogCkBAIC02MDgsMTYgKzYxMywxOSBAQAogCS8qIEludmVydCBkdWUgdG8gVkVOQ19MMjFfV0NfQ1RMOklOVj0xICovCiAJdmVuYy53c3NfZGF0YSA9ICh3c3MgXiAweGZmZmZmKSA8PCA4OwogCi0JdmVuY19lbmFibGVfY2xvY2tzKDEpOworCXIgPSB2ZW5jX3J1bnRpbWVfZ2V0KCk7CisJaWYgKHIpCisJCWdvdG8gZXJyOwogCiAJdmVuY193cml0ZV9yZWcoVkVOQ19CU1RBTVBfV1NTX0RBVEEsIGNvbmZpZy0+YnN0YW1wX3dzc19kYXRhIHwKIAkJCXZlbmMud3NzX2RhdGEpOwogCi0JdmVuY19lbmFibGVfY2xvY2tzKDApOworCXZlbmNfcnVudGltZV9wdXQoKTsKIAorZXJyOgogCW11dGV4X3VubG9jaygmdmVuYy52ZW5jX2xvY2spOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIHI7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgb21hcF9kc3NfZHJpdmVyIHZlbmNfZHJpdmVyID0gewpAQCAtNjMyLDkgKzY0MCw2IEBACiAJLmdldF9yZXNvbHV0aW9uCT0gb21hcGRzc19kZWZhdWx0X2dldF9yZXNvbHV0aW9uLAogCS5nZXRfcmVjb21tZW5kZWRfYnBwID0gb21hcGRzc19kZWZhdWx0X2dldF9yZWNvbW1lbmRlZF9icHAsCiAKLQkuc2V0X3VwZGF0ZV9tb2RlID0gdmVuY19zZXRfdXBkYXRlX21vZGUsCi0JLmdldF91cGRhdGVfbW9kZSA9IHZlbmNfZ2V0X3VwZGF0ZV9tb2RlLAotCiAJLmdldF90aW1pbmdzCT0gdmVuY19nZXRfdGltaW5ncywKIAkuc2V0X3RpbWluZ3MJPSB2ZW5jX3NldF90aW1pbmdzLAogCS5jaGVja190aW1pbmdzCT0gdmVuY19jaGVja190aW1pbmdzLApAQCAtNjczLDcgKzY3OCw4IEBACiB7CiAjZGVmaW5lIERVTVBSRUcocikgc2VxX3ByaW50ZihzLCAiJS0zNXMgJTA4eFxuIiwgI3IsIHZlbmNfcmVhZF9yZWcocikpCiAKLQl2ZW5jX2VuYWJsZV9jbG9ja3MoMSk7CisJaWYgKHZlbmNfcnVudGltZV9nZXQoKSkKKwkJcmV0dXJuOwogCiAJRFVNUFJFRyhWRU5DX0ZfQ09OVFJPTCk7CiAJRFVNUFJFRyhWRU5DX1ZJRE9VVF9DVFJMKTsKQEAgLTcxNywxNiArNzIzLDU2IEBACiAJRFVNUFJFRyhWRU5DX09VVFBVVF9DT05UUk9MKTsKIAlEVU1QUkVHKFZFTkNfT1VUUFVUX1RFU1QpOwogCi0JdmVuY19lbmFibGVfY2xvY2tzKDApOworCXZlbmNfcnVudGltZV9wdXQoKTsKIAogI3VuZGVmIERVTVBSRUcKIH0KIAorc3RhdGljIGludCB2ZW5jX2dldF9jbG9ja3Moc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgY2xrICpjbGs7CisKKwljbGsgPSBjbGtfZ2V0KCZwZGV2LT5kZXYsICJmY2siKTsKKwlpZiAoSVNfRVJSKGNsaykpIHsKKwkJRFNTRVJSKCJjYW4ndCBnZXQgZmNrXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKKwl9CisKKwl2ZW5jLnR2X2NsayA9IGNsazsKKworCWlmIChkc3NfaGFzX2ZlYXR1cmUoRkVBVF9WRU5DX1JFUVVJUkVTX1RWX0RBQ19DTEspKSB7CisJCWlmIChjcHVfaXNfb21hcDM0eHgoKSB8fCBjcHVfaXNfb21hcDM2MzAoKSkKKwkJCWNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgImRzc185Nm1fZmNrIik7CisJCWVsc2UKKwkJCWNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgInR2X2RhY19jbGsiKTsKKwkJaWYgKElTX0VSUihjbGspKSB7CisJCQlEU1NFUlIoImNhbid0IGdldCB0dl9kYWNfY2xrXG4iKTsKKwkJCWNsa19wdXQodmVuYy50dl9jbGspOworCQkJcmV0dXJuIFBUUl9FUlIoY2xrKTsKKwkJfQorCX0gZWxzZSB7CisJCWNsayA9IE5VTEw7CisJfQorCisJdmVuYy50dl9kYWNfY2xrID0gY2xrOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZlbmNfcHV0X2Nsb2Nrcyh2b2lkKQoreworCWlmICh2ZW5jLnR2X2NsaykKKwkJY2xrX3B1dCh2ZW5jLnR2X2Nsayk7CisJaWYgKHZlbmMudHZfZGFjX2NsaykKKwkJY2xrX3B1dCh2ZW5jLnR2X2RhY19jbGspOworfQorCiAvKiBWRU5DIEhXIElQIGluaXRpYWxpc2F0aW9uICovCiBzdGF0aWMgaW50IG9tYXBfdmVuY2h3X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJdTggcmV2X2lkOwogCXN0cnVjdCByZXNvdXJjZSAqdmVuY19tZW07CisJaW50IHI7CiAKIAl2ZW5jLnBkZXYgPSBwZGV2OwogCkBAIC03MzcsMjIgKzc4Myw0MCBAQAogCXZlbmNfbWVtID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHZlbmMucGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwogCWlmICghdmVuY19tZW0pIHsKIAkJRFNTRVJSKCJjYW4ndCBnZXQgSU9SRVNPVVJDRV9NRU0gVkVOQ1xuIik7Ci0JCXJldHVybiAtRUlOVkFMOworCQlyID0gLUVJTlZBTDsKKwkJZ290byBlcnJfaW9yZW1hcDsKIAl9CiAJdmVuYy5iYXNlID0gaW9yZW1hcCh2ZW5jX21lbS0+c3RhcnQsIHJlc291cmNlX3NpemUodmVuY19tZW0pKTsKIAlpZiAoIXZlbmMuYmFzZSkgewogCQlEU1NFUlIoImNhbid0IGlvcmVtYXAgVkVOQ1xuIik7Ci0JCXJldHVybiAtRU5PTUVNOworCQlyID0gLUVOT01FTTsKKwkJZ290byBlcnJfaW9yZW1hcDsKIAl9CiAKLQl2ZW5jX2VuYWJsZV9jbG9ja3MoMSk7CisJciA9IHZlbmNfZ2V0X2Nsb2NrcyhwZGV2KTsKKwlpZiAocikKKwkJZ290byBlcnJfZ2V0X2NsazsKKworCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYpOworCisJciA9IHZlbmNfcnVudGltZV9nZXQoKTsKKwlpZiAocikKKwkJZ290byBlcnJfZ2V0X3ZlbmM7CiAKIAlyZXZfaWQgPSAodTgpKHZlbmNfcmVhZF9yZWcoVkVOQ19SRVZfSUQpICYgMHhmZik7CiAJZGV2X2RiZygmcGRldi0+ZGV2LCAiT01BUCBWRU5DIHJldiAlZFxuIiwgcmV2X2lkKTsKIAotCXZlbmNfZW5hYmxlX2Nsb2NrcygwKTsKKwl2ZW5jX3J1bnRpbWVfcHV0KCk7CiAKIAlyZXR1cm4gb21hcF9kc3NfcmVnaXN0ZXJfZHJpdmVyKCZ2ZW5jX2RyaXZlcik7CisKK2Vycl9nZXRfdmVuYzoKKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CisJdmVuY19wdXRfY2xvY2tzKCk7CitlcnJfZ2V0X2NsazoKKwlpb3VubWFwKHZlbmMuYmFzZSk7CitlcnJfaW9yZW1hcDoKKwlyZXR1cm4gcjsKIH0KIAogc3RhdGljIGludCBvbWFwX3ZlbmNod19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKQEAgLTc2MywxNiArODI3LDYxIEBACiAJfQogCW9tYXBfZHNzX3VucmVnaXN0ZXJfZHJpdmVyKCZ2ZW5jX2RyaXZlcik7CiAKKwlwbV9ydW50aW1lX2Rpc2FibGUoJnBkZXYtPmRldik7CisJdmVuY19wdXRfY2xvY2tzKCk7CisKIAlpb3VubWFwKHZlbmMuYmFzZSk7CiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgdmVuY19ydW50aW1lX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWlmICh2ZW5jLnR2X2RhY19jbGspCisJCWNsa19kaXNhYmxlKHZlbmMudHZfZGFjX2Nsayk7CisJY2xrX2Rpc2FibGUodmVuYy50dl9jbGspOworCisJZGlzcGNfcnVudGltZV9wdXQoKTsKKwlkc3NfcnVudGltZV9wdXQoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZlbmNfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCWludCByOworCisJciA9IGRzc19ydW50aW1lX2dldCgpOworCWlmIChyIDwgMCkKKwkJZ290byBlcnJfZ2V0X2RzczsKKworCXIgPSBkaXNwY19ydW50aW1lX2dldCgpOworCWlmIChyIDwgMCkKKwkJZ290byBlcnJfZ2V0X2Rpc3BjOworCisJY2xrX2VuYWJsZSh2ZW5jLnR2X2Nsayk7CisJaWYgKHZlbmMudHZfZGFjX2NsaykKKwkJY2xrX2VuYWJsZSh2ZW5jLnR2X2RhY19jbGspOworCisJcmV0dXJuIDA7CisKK2Vycl9nZXRfZGlzcGM6CisJZHNzX3J1bnRpbWVfcHV0KCk7CitlcnJfZ2V0X2RzczoKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHZlbmNfcG1fb3BzID0geworCS5ydW50aW1lX3N1c3BlbmQgPSB2ZW5jX3J1bnRpbWVfc3VzcGVuZCwKKwkucnVudGltZV9yZXN1bWUgPSB2ZW5jX3J1bnRpbWVfcmVzdW1lLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgb21hcF92ZW5jaHdfZHJpdmVyID0gewogCS5wcm9iZSAgICAgICAgICA9IG9tYXBfdmVuY2h3X3Byb2JlLAogCS5yZW1vdmUgICAgICAgICA9IG9tYXBfdmVuY2h3X3JlbW92ZSwKIAkuZHJpdmVyICAgICAgICAgPSB7CiAJCS5uYW1lICAgPSAib21hcGRzc192ZW5jIiwKIAkJLm93bmVyICA9IFRISVNfTU9EVUxFLAorCQkucG0JPSAmdmVuY19wbV9vcHMsCiAJfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcDIvb21hcGZiL29tYXBmYi1pb2N0bC5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLWlvY3RsLmMKaW5kZXggY2ZmNDUwMy4uNmIxYWMyMyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLWlvY3RsLmMKKysrIGIvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLWlvY3RsLmMKQEAgLTMxNiw2OCArMzE2LDY4IEBACiB9CiBFWFBPUlRfU1lNQk9MKG9tYXBmYl91cGRhdGVfd2luZG93KTsKIAotc3RhdGljIGludCBvbWFwZmJfc2V0X3VwZGF0ZV9tb2RlKHN0cnVjdCBmYl9pbmZvICpmYmksCitpbnQgb21hcGZiX3NldF91cGRhdGVfbW9kZShzdHJ1Y3QgZmJfaW5mbyAqZmJpLAogCQkJCSAgIGVudW0gb21hcGZiX3VwZGF0ZV9tb2RlIG1vZGUpCiB7CiAJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZGlzcGxheSA9IGZiMmRpc3BsYXkoZmJpKTsKLQllbnVtIG9tYXBfZHNzX3VwZGF0ZV9tb2RlIHVtOworCXN0cnVjdCBvbWFwZmJfaW5mbyAqb2ZiaSA9IEZCMk9GQihmYmkpOworCXN0cnVjdCBvbWFwZmIyX2RldmljZSAqZmJkZXYgPSBvZmJpLT5mYmRldjsKKwlzdHJ1Y3Qgb21hcGZiX2Rpc3BsYXlfZGF0YSAqZDsKIAlpbnQgcjsKIAotCWlmICghZGlzcGxheSB8fCAhZGlzcGxheS0+ZHJpdmVyLT5zZXRfdXBkYXRlX21vZGUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3dpdGNoIChtb2RlKSB7Ci0JY2FzZSBPTUFQRkJfVVBEQVRFX0RJU0FCTEVEOgotCQl1bSA9IE9NQVBfRFNTX1VQREFURV9ESVNBQkxFRDsKLQkJYnJlYWs7Ci0KLQljYXNlIE9NQVBGQl9BVVRPX1VQREFURToKLQkJdW0gPSBPTUFQX0RTU19VUERBVEVfQVVUTzsKLQkJYnJlYWs7Ci0KLQljYXNlIE9NQVBGQl9NQU5VQUxfVVBEQVRFOgotCQl1bSA9IE9NQVBfRFNTX1VQREFURV9NQU5VQUw7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JciA9IGRpc3BsYXktPmRyaXZlci0+c2V0X3VwZGF0ZV9tb2RlKGRpc3BsYXksIHVtKTsKLQotCXJldHVybiByOwotfQotCi1zdGF0aWMgaW50IG9tYXBmYl9nZXRfdXBkYXRlX21vZGUoc3RydWN0IGZiX2luZm8gKmZiaSwKLQkJZW51bSBvbWFwZmJfdXBkYXRlX21vZGUgKm1vZGUpCi17Ci0Jc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZGlzcGxheSA9IGZiMmRpc3BsYXkoZmJpKTsKLQllbnVtIG9tYXBfZHNzX3VwZGF0ZV9tb2RlIG07Ci0KIAlpZiAoIWRpc3BsYXkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKCFkaXNwbGF5LT5kcml2ZXItPmdldF91cGRhdGVfbW9kZSkgewotCQkqbW9kZSA9IE9NQVBGQl9BVVRPX1VQREFURTsKKwlpZiAobW9kZSAhPSBPTUFQRkJfQVVUT19VUERBVEUgJiYgbW9kZSAhPSBPTUFQRkJfTUFOVUFMX1VQREFURSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlvbWFwZmJfbG9jayhmYmRldik7CisKKwlkID0gZ2V0X2Rpc3BsYXlfZGF0YShmYmRldiwgZGlzcGxheSk7CisKKwlpZiAoZC0+dXBkYXRlX21vZGUgPT0gbW9kZSkgeworCQlvbWFwZmJfdW5sb2NrKGZiZGV2KTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JbSA9IGRpc3BsYXktPmRyaXZlci0+Z2V0X3VwZGF0ZV9tb2RlKGRpc3BsYXkpOworCXIgPSAwOwogCi0Jc3dpdGNoIChtKSB7Ci0JY2FzZSBPTUFQX0RTU19VUERBVEVfRElTQUJMRUQ6Ci0JCSptb2RlID0gT01BUEZCX1VQREFURV9ESVNBQkxFRDsKLQkJYnJlYWs7Ci0JY2FzZSBPTUFQX0RTU19VUERBVEVfQVVUTzoKLQkJKm1vZGUgPSBPTUFQRkJfQVVUT19VUERBVEU7Ci0JCWJyZWFrOwotCWNhc2UgT01BUF9EU1NfVVBEQVRFX01BTlVBTDoKLQkJKm1vZGUgPSBPTUFQRkJfTUFOVUFMX1VQREFURTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQlVHKCk7CisJaWYgKGRpc3BsYXktPmNhcHMgJiBPTUFQX0RTU19ESVNQTEFZX0NBUF9NQU5VQUxfVVBEQVRFKSB7CisJCWlmIChtb2RlID09IE9NQVBGQl9BVVRPX1VQREFURSkKKwkJCW9tYXBmYl9zdGFydF9hdXRvX3VwZGF0ZShmYmRldiwgZGlzcGxheSk7CisJCWVsc2UgLyogTUFOVUFMX1VQREFURSAqLworCQkJb21hcGZiX3N0b3BfYXV0b191cGRhdGUoZmJkZXYsIGRpc3BsYXkpOworCisJCWQtPnVwZGF0ZV9tb2RlID0gbW9kZTsKKwl9IGVsc2UgeyAvKiBBVVRPX1VQREFURSAqLworCQlpZiAobW9kZSA9PSBPTUFQRkJfTUFOVUFMX1VQREFURSkKKwkJCXIgPSAtRUlOVkFMOwogCX0KIAorCW9tYXBmYl91bmxvY2soZmJkZXYpOworCisJcmV0dXJuIHI7Cit9CisKK2ludCBvbWFwZmJfZ2V0X3VwZGF0ZV9tb2RlKHN0cnVjdCBmYl9pbmZvICpmYmksCisJCWVudW0gb21hcGZiX3VwZGF0ZV9tb2RlICptb2RlKQoreworCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRpc3BsYXkgPSBmYjJkaXNwbGF5KGZiaSk7CisJc3RydWN0IG9tYXBmYl9pbmZvICpvZmJpID0gRkIyT0ZCKGZiaSk7CisJc3RydWN0IG9tYXBmYjJfZGV2aWNlICpmYmRldiA9IG9mYmktPmZiZGV2OworCXN0cnVjdCBvbWFwZmJfZGlzcGxheV9kYXRhICpkOworCisJaWYgKCFkaXNwbGF5KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9tYXBmYl9sb2NrKGZiZGV2KTsKKworCWQgPSBnZXRfZGlzcGxheV9kYXRhKGZiZGV2LCBkaXNwbGF5KTsKKworCSptb2RlID0gZC0+dXBkYXRlX21vZGU7CisKKwlvbWFwZmJfdW5sb2NrKGZiZGV2KTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi9vbWFwZmItbWFpbi5jIGIvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLW1haW4uYwppbmRleCA1MDViYzEyLi42MDJiNzFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi9vbWFwZmItbWFpbi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb21hcDIvb21hcGZiL29tYXBmYi1tYWluLmMKQEAgLTQ2LDYgKzQ2LDEwIEBACiBzdGF0aWMgaW50IGRlZl92cmZiOwogc3RhdGljIGludCBkZWZfcm90YXRlOwogc3RhdGljIGludCBkZWZfbWlycm9yOworc3RhdGljIGJvb2wgYXV0b191cGRhdGU7CitzdGF0aWMgdW5zaWduZWQgaW50IGF1dG9fdXBkYXRlX2ZyZXE7Cittb2R1bGVfcGFyYW0oYXV0b191cGRhdGUsIGJvb2wsIDApOworbW9kdWxlX3BhcmFtKGF1dG9fdXBkYXRlX2ZyZXEsIHVpbnQsIDA2NDQpOwogCiAjaWZkZWYgREVCVUcKIHVuc2lnbmVkIGludCBvbWFwZmJfZGVidWc7CkBAIC0xMjQyLDYgKzEyNDYsNyBAQAogCXN0cnVjdCBvbWFwZmJfaW5mbyAqb2ZiaSA9IEZCMk9GQihmYmkpOwogCXN0cnVjdCBvbWFwZmIyX2RldmljZSAqZmJkZXYgPSBvZmJpLT5mYmRldjsKIAlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkaXNwbGF5ID0gZmIyZGlzcGxheShmYmkpOworCXN0cnVjdCBvbWFwZmJfZGlzcGxheV9kYXRhICpkOwogCWludCByID0gMDsKIAogCWlmICghZGlzcGxheSkKQEAgLTEyNDksNiArMTI1NCw4IEBACiAKIAlvbWFwZmJfbG9jayhmYmRldik7CiAKKwlkID0gZ2V0X2Rpc3BsYXlfZGF0YShmYmRldiwgZGlzcGxheSk7CisKIAlzd2l0Y2ggKGJsYW5rKSB7CiAJY2FzZSBGQl9CTEFOS19VTkJMQU5LOgogCQlpZiAoZGlzcGxheS0+c3RhdGUgIT0gT01BUF9EU1NfRElTUExBWV9TVVNQRU5ERUQpCkBAIC0xMjU3LDYgKzEyNjQsMTEgQEAKIAkJaWYgKGRpc3BsYXktPmRyaXZlci0+cmVzdW1lKQogCQkJciA9IGRpc3BsYXktPmRyaXZlci0+cmVzdW1lKGRpc3BsYXkpOwogCisJCWlmICgoZGlzcGxheS0+Y2FwcyAmIE9NQVBfRFNTX0RJU1BMQVlfQ0FQX01BTlVBTF9VUERBVEUpICYmCisJCQkJZC0+dXBkYXRlX21vZGUgPT0gT01BUEZCX0FVVE9fVVBEQVRFICYmCisJCQkJIWQtPmF1dG9fdXBkYXRlX3dvcmtfZW5hYmxlZCkKKwkJCW9tYXBmYl9zdGFydF9hdXRvX3VwZGF0ZShmYmRldiwgZGlzcGxheSk7CisKIAkJYnJlYWs7CiAKIAljYXNlIEZCX0JMQU5LX05PUk1BTDoKQEAgLTEyNjgsNiArMTI4MCw5IEBACiAJCWlmIChkaXNwbGF5LT5zdGF0ZSAhPSBPTUFQX0RTU19ESVNQTEFZX0FDVElWRSkKIAkJCWdvdG8gZXhpdDsKIAorCQlpZiAoZC0+YXV0b191cGRhdGVfd29ya19lbmFibGVkKQorCQkJb21hcGZiX3N0b3BfYXV0b191cGRhdGUoZmJkZXYsIGRpc3BsYXkpOworCiAJCWlmIChkaXNwbGF5LT5kcml2ZXItPnN1c3BlbmQpCiAJCQlyID0gZGlzcGxheS0+ZHJpdmVyLT5zdXNwZW5kKGRpc3BsYXkpOwogCkBAIC0xNzI0LDYgKzE3MzksNzggQEAKIAlyZXR1cm4gcjsKIH0KIAorc3RhdGljIHZvaWQgb21hcGZiX2F1dG9fdXBkYXRlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldjsKKwlzdHJ1Y3Qgb21hcF9kc3NfZHJpdmVyICpkc3NkcnY7CisJc3RydWN0IG9tYXBmYl9kaXNwbGF5X2RhdGEgKmQ7CisJdTE2IHcsIGg7CisJdW5zaWduZWQgaW50IGZyZXE7CisJc3RydWN0IG9tYXBmYjJfZGV2aWNlICpmYmRldjsKKworCWQgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG9tYXBmYl9kaXNwbGF5X2RhdGEsCisJCQlhdXRvX3VwZGF0ZV93b3JrLndvcmspOworCisJZHNzZGV2ID0gZC0+ZHNzZGV2OworCWRzc2RydiA9IGRzc2Rldi0+ZHJpdmVyOworCWZiZGV2ID0gZC0+ZmJkZXY7CisKKwlpZiAoIWRzc2RydiB8fCAhZHNzZHJ2LT51cGRhdGUpCisJCXJldHVybjsKKworCWlmIChkc3NkcnYtPnN5bmMpCisJCWRzc2Rydi0+c3luYyhkc3NkZXYpOworCisJZHNzZHJ2LT5nZXRfcmVzb2x1dGlvbihkc3NkZXYsICZ3LCAmaCk7CisJZHNzZHJ2LT51cGRhdGUoZHNzZGV2LCAwLCAwLCB3LCBoKTsKKworCWZyZXEgPSBhdXRvX3VwZGF0ZV9mcmVxOworCWlmIChmcmVxID09IDApCisJCWZyZXEgPSAyMDsKKwlxdWV1ZV9kZWxheWVkX3dvcmsoZmJkZXYtPmF1dG9fdXBkYXRlX3dxLAorCQkJJmQtPmF1dG9fdXBkYXRlX3dvcmssIEhaIC8gZnJlcSk7Cit9CisKK3ZvaWQgb21hcGZiX3N0YXJ0X2F1dG9fdXBkYXRlKHN0cnVjdCBvbWFwZmIyX2RldmljZSAqZmJkZXYsCisJCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRpc3BsYXkpCit7CisJc3RydWN0IG9tYXBmYl9kaXNwbGF5X2RhdGEgKmQ7CisKKwlpZiAoZmJkZXYtPmF1dG9fdXBkYXRlX3dxID09IE5VTEwpIHsKKwkJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndxOworCisJCXdxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoIm9tYXBmYl9hdXRvX3VwZGF0ZSIpOworCisJCWlmICh3cSA9PSBOVUxMKSB7CisJCQlkZXZfZXJyKGZiZGV2LT5kZXYsICJGYWlsZWQgdG8gY3JlYXRlIHdvcmtxdWV1ZSBmb3IgIgorCQkJCQkiYXV0by11cGRhdGVcbiIpOworCQkJcmV0dXJuOworCQl9CisKKwkJZmJkZXYtPmF1dG9fdXBkYXRlX3dxID0gd3E7CisJfQorCisJZCA9IGdldF9kaXNwbGF5X2RhdGEoZmJkZXYsIGRpc3BsYXkpOworCisJSU5JVF9ERUxBWUVEX1dPUksoJmQtPmF1dG9fdXBkYXRlX3dvcmssIG9tYXBmYl9hdXRvX3VwZGF0ZV93b3JrKTsKKworCWQtPmF1dG9fdXBkYXRlX3dvcmtfZW5hYmxlZCA9IHRydWU7CisKKwlvbWFwZmJfYXV0b191cGRhdGVfd29yaygmZC0+YXV0b191cGRhdGVfd29yay53b3JrKTsKK30KKwordm9pZCBvbWFwZmJfc3RvcF9hdXRvX3VwZGF0ZShzdHJ1Y3Qgb21hcGZiMl9kZXZpY2UgKmZiZGV2LAorCQlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkaXNwbGF5KQoreworCXN0cnVjdCBvbWFwZmJfZGlzcGxheV9kYXRhICpkOworCisJZCA9IGdldF9kaXNwbGF5X2RhdGEoZmJkZXYsIGRpc3BsYXkpOworCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZkLT5hdXRvX3VwZGF0ZV93b3JrKTsKKworCWQtPmF1dG9fdXBkYXRlX3dvcmtfZW5hYmxlZCA9IGZhbHNlOworfQorCiAvKiBpbml0aWFsaXplIGZiX2luZm8sIHZhciwgZml4IHRvIHNvbWV0aGluZyBzYW5lIGJhc2VkIG9uIHRoZSBkaXNwbGF5ICovCiBzdGF0aWMgaW50IG9tYXBmYl9mYl9pbml0KHN0cnVjdCBvbWFwZmIyX2RldmljZSAqZmJkZXYsIHN0cnVjdCBmYl9pbmZvICpmYmkpCiB7CkBAIC0xODU4LDEwICsxOTQ1LDIxIEBACiAJfQogCiAJZm9yIChpID0gMDsgaSA8IGZiZGV2LT5udW1fZGlzcGxheXM7IGkrKykgewotCQlpZiAoZmJkZXYtPmRpc3BsYXlzW2ldLT5zdGF0ZSAhPSBPTUFQX0RTU19ESVNQTEFZX0RJU0FCTEVEKQotCQkJZmJkZXYtPmRpc3BsYXlzW2ldLT5kcml2ZXItPmRpc2FibGUoZmJkZXYtPmRpc3BsYXlzW2ldKTsKKwkJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2ID0gZmJkZXYtPmRpc3BsYXlzW2ldLmRzc2RldjsKIAotCQlvbWFwX2Rzc19wdXRfZGV2aWNlKGZiZGV2LT5kaXNwbGF5c1tpXSk7CisJCWlmIChmYmRldi0+ZGlzcGxheXNbaV0uYXV0b191cGRhdGVfd29ya19lbmFibGVkKQorCQkJb21hcGZiX3N0b3BfYXV0b191cGRhdGUoZmJkZXYsIGRzc2Rldik7CisKKwkJaWYgKGRzc2Rldi0+c3RhdGUgIT0gT01BUF9EU1NfRElTUExBWV9ESVNBQkxFRCkKKwkJCWRzc2Rldi0+ZHJpdmVyLT5kaXNhYmxlKGRzc2Rldik7CisKKwkJb21hcF9kc3NfcHV0X2RldmljZShkc3NkZXYpOworCX0KKworCWlmIChmYmRldi0+YXV0b191cGRhdGVfd3EgIT0gTlVMTCkgeworCQlmbHVzaF93b3JrcXVldWUoZmJkZXYtPmF1dG9fdXBkYXRlX3dxKTsKKwkJZGVzdHJveV93b3JrcXVldWUoZmJkZXYtPmF1dG9fdXBkYXRlX3dxKTsKKwkJZmJkZXYtPmF1dG9fdXBkYXRlX3dxID0gTlVMTDsKIAl9CiAKIAlkZXZfc2V0X2RydmRhdGEoZmJkZXYtPmRldiwgTlVMTCk7CkBAIC0yMDg0LDE0ICsyMTgyLDE0IEBACiAJaW50IHI7CiAJdTggYnBwOwogCXN0cnVjdCBvbWFwX3ZpZGVvX3RpbWluZ3MgdGltaW5ncywgdGVtcF90aW1pbmdzOworCXN0cnVjdCBvbWFwZmJfZGlzcGxheV9kYXRhICpkOwogCiAJciA9IG9tYXBmYl9tb2RlX3RvX3RpbWluZ3MobW9kZV9zdHIsICZ0aW1pbmdzLCAmYnBwKTsKIAlpZiAocikKIAkJcmV0dXJuIHI7CiAKLQlmYmRldi0+YnBwX292ZXJyaWRlc1tmYmRldi0+bnVtX2JwcF9vdmVycmlkZXNdLmRzc2RldiA9IGRpc3BsYXk7Ci0JZmJkZXYtPmJwcF9vdmVycmlkZXNbZmJkZXYtPm51bV9icHBfb3ZlcnJpZGVzXS5icHAgPSBicHA7Ci0JKytmYmRldi0+bnVtX2JwcF9vdmVycmlkZXM7CisJZCA9IGdldF9kaXNwbGF5X2RhdGEoZmJkZXYsIGRpc3BsYXkpOworCWQtPmJwcF9vdmVycmlkZSA9IGJwcDsKIAogCWlmIChkaXNwbGF5LT5kcml2ZXItPmNoZWNrX3RpbWluZ3MpIHsKIAkJciA9IGRpc3BsYXktPmRyaXZlci0+Y2hlY2tfdGltaW5ncyhkaXNwbGF5LCAmdGltaW5ncyk7CkBAIC0yMTE3LDE0ICsyMjE1LDE0IEBACiBzdGF0aWMgaW50IG9tYXBmYl9nZXRfcmVjb21tZW5kZWRfYnBwKHN0cnVjdCBvbWFwZmIyX2RldmljZSAqZmJkZXYsCiAJCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKIHsKLQlpbnQgaTsKKwlzdHJ1Y3Qgb21hcGZiX2Rpc3BsYXlfZGF0YSAqZDsKIAogCUJVR19PTihkc3NkZXYtPmRyaXZlci0+Z2V0X3JlY29tbWVuZGVkX2JwcCA9PSBOVUxMKTsKIAotCWZvciAoaSA9IDA7IGkgPCBmYmRldi0+bnVtX2JwcF9vdmVycmlkZXM7ICsraSkgewotCQlpZiAoZHNzZGV2ID09IGZiZGV2LT5icHBfb3ZlcnJpZGVzW2ldLmRzc2RldikKLQkJCXJldHVybiBmYmRldi0+YnBwX292ZXJyaWRlc1tpXS5icHA7Ci0JfQorCWQgPSBnZXRfZGlzcGxheV9kYXRhKGZiZGV2LCBkc3NkZXYpOworCisJaWYgKGQtPmJwcF9vdmVycmlkZSAhPSAwKQorCQlyZXR1cm4gZC0+YnBwX292ZXJyaWRlOwogCiAJcmV0dXJuIGRzc2Rldi0+ZHJpdmVyLT5nZXRfcmVjb21tZW5kZWRfYnBwKGRzc2Rldik7CiB9CkBAIC0yMTU2LDkgKzIyNTQsOSBAQAogCiAJCWRpc3BsYXkgPSBOVUxMOwogCQlmb3IgKGkgPSAwOyBpIDwgZmJkZXYtPm51bV9kaXNwbGF5czsgKytpKSB7Ci0JCQlpZiAoc3RyY21wKGZiZGV2LT5kaXNwbGF5c1tpXS0+bmFtZSwKKwkJCWlmIChzdHJjbXAoZmJkZXYtPmRpc3BsYXlzW2ldLmRzc2Rldi0+bmFtZSwKIAkJCQkJCWRpc3BsYXlfc3RyKSA9PSAwKSB7Ci0JCQkJZGlzcGxheSA9IGZiZGV2LT5kaXNwbGF5c1tpXTsKKwkJCQlkaXNwbGF5ID0gZmJkZXYtPmRpc3BsYXlzW2ldLmRzc2RldjsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtMjE4Miw2ICsyMjgwLDcgQEAKIAkJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2KQogewogCXN0cnVjdCBvbWFwX2Rzc19kcml2ZXIgKmRzc2RydiA9IGRzc2Rldi0+ZHJpdmVyOworCXN0cnVjdCBvbWFwZmJfZGlzcGxheV9kYXRhICpkOwogCWludCByOwogCiAJciA9IGRzc2Rydi0+ZW5hYmxlKGRzc2Rldik7CkBAIC0yMTkxLDggKzIyOTAsMjAgQEAKIAkJcmV0dXJuIHI7CiAJfQogCisJZCA9IGdldF9kaXNwbGF5X2RhdGEoZmJkZXYsIGRzc2Rldik7CisKKwlkLT5mYmRldiA9IGZiZGV2OworCiAJaWYgKGRzc2Rldi0+Y2FwcyAmIE9NQVBfRFNTX0RJU1BMQVlfQ0FQX01BTlVBTF9VUERBVEUpIHsKIAkJdTE2IHcsIGg7CisKKwkJaWYgKGF1dG9fdXBkYXRlKSB7CisJCQlvbWFwZmJfc3RhcnRfYXV0b191cGRhdGUoZmJkZXYsIGRzc2Rldik7CisJCQlkLT51cGRhdGVfbW9kZSA9IE9NQVBGQl9BVVRPX1VQREFURTsKKwkJfSBlbHNlIHsKKwkJCWQtPnVwZGF0ZV9tb2RlID0gT01BUEZCX01BTlVBTF9VUERBVEU7CisJCX0KKwogCQlpZiAoZHNzZHJ2LT5lbmFibGVfdGUpIHsKIAkJCXIgPSBkc3NkcnYtPmVuYWJsZV90ZShkc3NkZXYsIDEpOwogCQkJaWYgKHIpIHsKQEAgLTIyMDEsMTYgKzIzMTIsNiBAQAogCQkJfQogCQl9CiAKLQkJaWYgKGRzc2Rydi0+c2V0X3VwZGF0ZV9tb2RlKSB7Ci0JCQlyID0gZHNzZHJ2LT5zZXRfdXBkYXRlX21vZGUoZHNzZGV2LAotCQkJCQlPTUFQX0RTU19VUERBVEVfTUFOVUFMKTsKLQkJCWlmIChyKSB7Ci0JCQkJZGV2X2VycihmYmRldi0+ZGV2LAotCQkJCQkJIkZhaWxlZCB0byBzZXQgdXBkYXRlIG1vZGVcbiIpOwotCQkJCXJldHVybiByOwotCQkJfQotCQl9Ci0KIAkJZHNzZHJ2LT5nZXRfcmVzb2x1dGlvbihkc3NkZXYsICZ3LCAmaCk7CiAJCXIgPSBkc3NkcnYtPnVwZGF0ZShkc3NkZXYsIDAsIDAsIHcsIGgpOwogCQlpZiAocikgewpAQCAtMjIxOSwxNSArMjMyMCw3IEBACiAJCQlyZXR1cm4gcjsKIAkJfQogCX0gZWxzZSB7Ci0JCWlmIChkc3NkcnYtPnNldF91cGRhdGVfbW9kZSkgewotCQkJciA9IGRzc2Rydi0+c2V0X3VwZGF0ZV9tb2RlKGRzc2RldiwKLQkJCQkJT01BUF9EU1NfVVBEQVRFX0FVVE8pOwotCQkJaWYgKHIpIHsKLQkJCQlkZXZfZXJyKGZiZGV2LT5kZXYsCi0JCQkJCQkiRmFpbGVkIHRvIHNldCB1cGRhdGUgbW9kZVxuIik7Ci0JCQkJcmV0dXJuIHI7Ci0JCQl9Ci0JCX0KKwkJZC0+dXBkYXRlX21vZGUgPSBPTUFQRkJfQVVUT19VUERBVEU7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0yMjc1LDYgKzIzNjgsOCBAQAogCWZiZGV2LT5udW1fZGlzcGxheXMgPSAwOwogCWRzc2RldiA9IE5VTEw7CiAJZm9yX2VhY2hfZHNzX2Rldihkc3NkZXYpIHsKKwkJc3RydWN0IG9tYXBmYl9kaXNwbGF5X2RhdGEgKmQ7CisKIAkJb21hcF9kc3NfZ2V0X2RldmljZShkc3NkZXYpOwogCiAJCWlmICghZHNzZGV2LT5kcml2ZXIpIHsKQEAgLTIyODIsNyArMjM3NywxMiBAQAogCQkJciA9IC1FTk9ERVY7CiAJCX0KIAotCQlmYmRldi0+ZGlzcGxheXNbZmJkZXYtPm51bV9kaXNwbGF5cysrXSA9IGRzc2RldjsKKwkJZCA9ICZmYmRldi0+ZGlzcGxheXNbZmJkZXYtPm51bV9kaXNwbGF5cysrXTsKKwkJZC0+ZHNzZGV2ID0gZHNzZGV2OworCQlpZiAoZHNzZGV2LT5jYXBzICYgT01BUF9EU1NfRElTUExBWV9DQVBfTUFOVUFMX1VQREFURSkKKwkJCWQtPnVwZGF0ZV9tb2RlID0gT01BUEZCX01BTlVBTF9VUERBVEU7CisJCWVsc2UKKwkJCWQtPnVwZGF0ZV9tb2RlID0gT01BUEZCX0FVVE9fVVBEQVRFOwogCX0KIAogCWlmIChyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLXN5c2ZzLmMgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi9vbWFwZmItc3lzZnMuYwppbmRleCAyZjVlODE3Li4xNTNiZjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi9vbWFwZmItc3lzZnMuYworKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi9vbWFwZmItc3lzZnMuYwpAQCAtNTE4LDYgKzUxOCwzOSBAQAogCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiVwXG4iLCBvZmJpLT5yZWdpb24tPnZhZGRyKTsKIH0KIAorc3RhdGljIHNzaXplX3Qgc2hvd191cGRfbW9kZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGZiX2luZm8gKmZiaSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWVudW0gb21hcGZiX3VwZGF0ZV9tb2RlIG1vZGU7CisJaW50IHI7CisKKwlyID0gb21hcGZiX2dldF91cGRhdGVfbW9kZShmYmksICZtb2RlKTsKKworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCXJldHVybiBzbnByaW50ZihidWYsIFBBR0VfU0laRSwgIiV1XG4iLCAodW5zaWduZWQpbW9kZSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX3VwZF9tb2RlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBmYl9pbmZvICpmYmkgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwl1bnNpZ25lZCBtb2RlOworCWludCByOworCisJciA9IGtzdHJ0b3VpbnQoYnVmLCAwLCAmbW9kZSk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJciA9IG9tYXBmYl9zZXRfdXBkYXRlX21vZGUoZmJpLCBtb2RlKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSBvbWFwZmJfYXR0cnNbXSA9IHsKIAlfX0FUVFIocm90YXRlX3R5cGUsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3JvdGF0ZV90eXBlLAogCQkJc3RvcmVfcm90YXRlX3R5cGUpLApAQCAtNTI4LDYgKzU2MSw3IEBACiAJCQlzdG9yZV9vdmVybGF5c19yb3RhdGUpLAogCV9fQVRUUihwaHlzX2FkZHIsIFNfSVJVR08sIHNob3dfcGh5cywgTlVMTCksCiAJX19BVFRSKHZpcnRfYWRkciwgU19JUlVHTywgc2hvd192aXJ0LCBOVUxMKSwKKwlfX0FUVFIodXBkYXRlX21vZGUsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3VwZF9tb2RlLCBzdG9yZV91cGRfbW9kZSksCiB9OwogCiBpbnQgb21hcGZiX2NyZWF0ZV9zeXNmcyhzdHJ1Y3Qgb21hcGZiMl9kZXZpY2UgKmZiZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9vbWFwMi9vbWFwZmIvb21hcGZiLmggYi9kcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi9vbWFwZmIuaAppbmRleCBhYTFiMWQ5Li5mZGYwZWRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi9vbWFwZmIuaAorKysgYi9kcml2ZXJzL3ZpZGVvL29tYXAyL29tYXBmYi9vbWFwZmIuaApAQCAtNzMsNiArNzMsMTUgQEAKIAlib29sIG1pcnJvcjsKIH07CiAKK3N0cnVjdCBvbWFwZmJfZGlzcGxheV9kYXRhIHsKKwlzdHJ1Y3Qgb21hcGZiMl9kZXZpY2UgKmZiZGV2OworCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldjsKKwl1OCBicHBfb3ZlcnJpZGU7CisJZW51bSBvbWFwZmJfdXBkYXRlX21vZGUgdXBkYXRlX21vZGU7CisJYm9vbCBhdXRvX3VwZGF0ZV93b3JrX2VuYWJsZWQ7CisJc3RydWN0IGRlbGF5ZWRfd29yayBhdXRvX3VwZGF0ZV93b3JrOworfTsKKwogc3RydWN0IG9tYXBmYjJfZGV2aWNlIHsKIAlzdHJ1Y3QgZGV2aWNlICpkZXY7CiAJc3RydWN0IG11dGV4ICBtdHg7CkBAIC04NiwxNyArOTUsMTMgQEAKIAlzdHJ1Y3Qgb21hcGZiMl9tZW1fcmVnaW9uIHJlZ2lvbnNbMTBdOwogCiAJdW5zaWduZWQgbnVtX2Rpc3BsYXlzOwotCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRpc3BsYXlzWzEwXTsKKwlzdHJ1Y3Qgb21hcGZiX2Rpc3BsYXlfZGF0YSBkaXNwbGF5c1sxMF07CiAJdW5zaWduZWQgbnVtX292ZXJsYXlzOwogCXN0cnVjdCBvbWFwX292ZXJsYXkgKm92ZXJsYXlzWzEwXTsKIAl1bnNpZ25lZCBudW1fbWFuYWdlcnM7CiAJc3RydWN0IG9tYXBfb3ZlcmxheV9tYW5hZ2VyICptYW5hZ2Vyc1sxMF07CiAKLQl1bnNpZ25lZCBudW1fYnBwX292ZXJyaWRlczsKLQlzdHJ1Y3QgewotCQlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXY7Ci0JCXU4IGJwcDsKLQl9IGJwcF9vdmVycmlkZXNbMTBdOworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICphdXRvX3VwZGF0ZV93cTsKIH07CiAKIHN0cnVjdCBvbWFwZmJfY29sb3Jtb2RlIHsKQEAgLTEyOCw2ICsxMzMsMTMgQEAKIGludCBvbWFwZmJfc2V0dXBfb3ZlcmxheShzdHJ1Y3QgZmJfaW5mbyAqZmJpLCBzdHJ1Y3Qgb21hcF9vdmVybGF5ICpvdmwsCiAJCXUxNiBwb3N4LCB1MTYgcG9zeSwgdTE2IG91dHcsIHUxNiBvdXRoKTsKIAordm9pZCBvbWFwZmJfc3RhcnRfYXV0b191cGRhdGUoc3RydWN0IG9tYXBmYjJfZGV2aWNlICpmYmRldiwKKwkJc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZGlzcGxheSk7Cit2b2lkIG9tYXBmYl9zdG9wX2F1dG9fdXBkYXRlKHN0cnVjdCBvbWFwZmIyX2RldmljZSAqZmJkZXYsCisJCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRpc3BsYXkpOworaW50IG9tYXBmYl9nZXRfdXBkYXRlX21vZGUoc3RydWN0IGZiX2luZm8gKmZiaSwgZW51bSBvbWFwZmJfdXBkYXRlX21vZGUgKm1vZGUpOworaW50IG9tYXBmYl9zZXRfdXBkYXRlX21vZGUoc3RydWN0IGZiX2luZm8gKmZiaSwgZW51bSBvbWFwZmJfdXBkYXRlX21vZGUgbW9kZSk7CisKIC8qIGZpbmQgdGhlIGRpc3BsYXkgY29ubmVjdGVkIHRvIHRoaXMgZmIsIGlmIGFueSAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpmYjJkaXNwbGF5KHN0cnVjdCBmYl9pbmZvICpmYmkpCiB7CkBAIC0xNDMsNiArMTU1LDE5IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG9tYXBmYl9kaXNwbGF5X2RhdGEgKmdldF9kaXNwbGF5X2RhdGEoCisJCXN0cnVjdCBvbWFwZmIyX2RldmljZSAqZmJkZXYsIHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2RldikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBmYmRldi0+bnVtX2Rpc3BsYXlzOyArK2kpCisJCWlmIChmYmRldi0+ZGlzcGxheXNbaV0uZHNzZGV2ID09IGRzc2RldikKKwkJCXJldHVybiAmZmJkZXYtPmRpc3BsYXlzW2ldOworCisJLyogVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuICovCisJQlVHKCk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBvbWFwZmJfbG9jayhzdHJ1Y3Qgb21hcGZiMl9kZXZpY2UgKmZiZGV2KQogewogCW11dGV4X2xvY2soJmZiZGV2LT5tdHgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnIGIvZHJpdmVycy93YXRjaGRvZy9LY29uZmlnCmluZGV4IDIxZDgxNmUuLjg2YjA3MzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvS2NvbmZpZworKysgYi9kcml2ZXJzL3dhdGNoZG9nL0tjb25maWcKQEAgLTI4LDYgKzI4LDE0IEBACiAKIGlmIFdBVENIRE9HCiAKK2NvbmZpZyBXQVRDSERPR19DT1JFCisJYm9vbCAiV2F0Y2hEb2cgVGltZXIgRHJpdmVyIENvcmUiCisJLS0taGVscC0tLQorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIG5ldyB3YXRjaGRvZyB0aW1lciBkcml2ZXIgY29yZS4KKwkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGEgZnJhbWV3b3JrIGZvciBhbGwgd2F0Y2hkb2cgdGltZXIgZHJpdmVycworCSAgYW5kIGdpdmVzIHRoZW0gdGhlIC9kZXYvd2F0Y2hkb2cgaW50ZXJmYWNlIChhbmQgbGF0ZXIgYWxzbyB0aGUKKwkgIHN5c2ZzIGludGVyZmFjZSkuCisKIGNvbmZpZyBXQVRDSERPR19OT1dBWU9VVAogCWJvb2wgIkRpc2FibGUgd2F0Y2hkb2cgc2h1dGRvd24gb24gY2xvc2UiCiAJaGVscApAQCAtMTg2LDYgKzE5NCwxNSBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2ExMTAwX3dkdC4KIAorY29uZmlnIERXX1dBVENIRE9HCisJdHJpc3RhdGUgIlN5bm9wc3lzIERlc2lnbldhcmUgd2F0Y2hkb2ciCisJZGVwZW5kcyBvbiBBUk0gJiYgSEFWRV9DTEsKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIFN5bm9wc3lzIERlc2lnbldhcmUKKwkgIHdhdGNoZG9nIHRpbWVyIGZvdW5kIGluIG1hbnkgQVJNIGNoaXBzLgorCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCisJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgZHdfd2R0LgorCiBjb25maWcgTVBDT1JFX1dBVENIRE9HCiAJdHJpc3RhdGUgIk1QY29yZSB3YXRjaGRvZyIKIAlkZXBlbmRzIG9uIEhBVkVfQVJNX1RXRApAQCAtMzIxLDcgKzMzOCw3IEBACiAKIGNvbmZpZyBJTVgyX1dEVAogCXRyaXN0YXRlICJJTVgyKyBXYXRjaGRvZyIKLQlkZXBlbmRzIG9uIEFSQ0hfTVgyIHx8IEFSQ0hfTVgyNSB8fCBBUkNIX01YMyB8fCBBUkNIX01YNQorCWRlcGVuZHMgb24gSU1YX0hBVkVfUExBVEZPUk1fSU1YMl9XRFQKIAloZWxwCiAJICBUaGlzIGlzIHRoZSBkcml2ZXIgZm9yIHRoZSBoYXJkd2FyZSB3YXRjaGRvZwogCSAgb24gdGhlIEZyZWVzY2FsZSBJTVgyIGFuZCBsYXRlciBwcm9jZXNzb3JzLgpAQCAtODc5LDYgKzg5NiwyMCBAQAogCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgbTU0eHhfd2R0LgogCisjIE1pY3JvQmxhemUgQXJjaGl0ZWN0dXJlCisKK2NvbmZpZyBYSUxJTlhfV0FUQ0hET0cKKwl0cmlzdGF0ZSAiWGlsaW54IFdhdGNoZG9nIHRpbWVyIgorCWRlcGVuZHMgb24gTUlDUk9CTEFaRQorCS0tLWhlbHAtLS0KKwkgIFdhdGNoZG9nIGRyaXZlciBmb3IgdGhlIHhwc190aW1lYmFzZV93ZHQgaXAgY29yZS4KKworCSAgSU1QT1JUQU5UOiBUaGUgeHBzX3RpbWViYXNlX3dkdCBwYXJlbnQgbXVzdCBoYXZlIHRoZSBwcm9wZXJ0eQorCSAgImNsb2NrLWZyZXF1ZW5jeSIgYXQgZGV2aWNlIHRyZWUuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG9mX3hpbGlueF93ZHQuCisKICMgTUlQUyBBcmNoaXRlY3R1cmUKIAogY29uZmlnIEFUSDc5X1dEVApkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9NYWtlZmlsZSBiL2RyaXZlcnMvd2F0Y2hkb2cvTWFrZWZpbGUKaW5kZXggZWQyNmY3MC4uNTViZDU3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3dhdGNoZG9nL01ha2VmaWxlCkBAIC0yLDYgKzIsMTAgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBXYXRjaERvZyBkZXZpY2UgZHJpdmVycy4KICMKIAorIyBUaGUgV2F0Y2hEb2cgVGltZXIgRHJpdmVyIENvcmUuCit3YXRjaGRvZy1vYmpzCSs9IHdhdGNoZG9nX2NvcmUubyB3YXRjaGRvZ19kZXYubworb2JqLSQoQ09ORklHX1dBVENIRE9HX0NPUkUpCSs9IHdhdGNoZG9nLm8KKwogIyBPbmx5IG9uZSB3YXRjaGRvZyBjYW4gc3VjY2VlZC4gV2UgcHJvYmUgdGhlIElTQS9QQ0kvVVNCIGJhc2VkCiAjIHdhdGNoZG9nLWNhcmRzIGZpcnN0LCB0aGVuIHRoZSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgd2F0Y2hkb2cKICMgZHJpdmVycyBhbmQgdGhlbiB0aGUgYXJjaGl0ZWN0dXJlIGluZGVwZW5kZW50ICJzb2Z0ZG9nIiBkcml2ZXIuCkBAIC0zNyw2ICs0MSw3IEBACiBvYmotJChDT05GSUdfS1M4Njk1X1dBVENIRE9HKSArPSBrczg2OTVfd2R0Lm8KIG9iai0kKENPTkZJR19TM0MyNDEwX1dBVENIRE9HKSArPSBzM2MyNDEwX3dkdC5vCiBvYmotJChDT05GSUdfU0ExMTAwX1dBVENIRE9HKSArPSBzYTExMDBfd2R0Lm8KK29iai0kKENPTkZJR19EV19XQVRDSERPRykgKz0gZHdfd2R0Lm8KIG9iai0kKENPTkZJR19NUENPUkVfV0FUQ0hET0cpICs9IG1wY29yZV93ZHQubwogb2JqLSQoQ09ORklHX0VQOTNYWF9XQVRDSERPRykgKz0gZXA5M3h4X3dkdC5vCiBvYmotJChDT05GSUdfUE5YNDAwOF9XQVRDSERPRykgKz0gcG54NDAwOF93ZHQubwpAQCAtMTA5LDYgKzExNCw5IEBACiAjIE02OEsgQXJjaGl0ZWN0dXJlCiBvYmotJChDT05GSUdfTTU0eHhfV0FUQ0hET0cpICs9IG01NHh4X3dkdC5vCiAKKyMgTWljcm9CbGF6ZSBBcmNoaXRlY3R1cmUKK29iai0kKENPTkZJR19YSUxJTlhfV0FUQ0hET0cpICs9IG9mX3hpbGlueF93ZHQubworCiAjIE1JUFMgQXJjaGl0ZWN0dXJlCiBvYmotJChDT05GSUdfQVRINzlfV0RUKSArPSBhdGg3OV93ZHQubwogb2JqLSQoQ09ORklHX0JDTTQ3WFhfV0RUKSArPSBiY200N3h4X3dkdC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2F0OTFzYW05X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9hdDkxc2FtOV93ZHQuYwppbmRleCBlYWMyNjAyLi44NzQ0NWIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2F0OTFzYW05X3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvYXQ5MXNhbTlfd2R0LmMKQEAgLTMxLDcgKzMxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAKLSNpbmNsdWRlIDxtYWNoL2F0OTFfd2R0Lmg+CisjaW5jbHVkZSAiYXQ5MXNhbTlfd2R0LmgiCiAKICNkZWZpbmUgRFJWX05BTUUgIkFUOTFTQU05IFdhdGNoZG9nIgogCkBAIC0yODQsMjcgKzI4NCw4IEBACiAJcmV0dXJuIHJlczsKIH0KIAotI2lmZGVmIENPTkZJR19QTQotCi1zdGF0aWMgaW50IGF0OTF3ZHRfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBhdDkxd2R0X3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCXJldHVybiAwOwotfQotCi0jZWxzZQotI2RlZmluZSBhdDkxd2R0X3N1c3BlbmQJTlVMTAotI2RlZmluZSBhdDkxd2R0X3Jlc3VtZQlOVUxMCi0jZW5kaWYKLQogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXQ5MXdkdF9kcml2ZXIgPSB7CiAJLnJlbW92ZQkJPSBfX2V4aXRfcChhdDkxd2R0X3JlbW92ZSksCi0JLnN1c3BlbmQJPSBhdDkxd2R0X3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBhdDkxd2R0X3Jlc3VtZSwKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAiYXQ5MV93ZHQiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MV93ZHQuaCBiL2RyaXZlcnMvd2F0Y2hkb2cvYXQ5MXNhbTlfd2R0LmgKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9hdDkxX3dkdC5oCnJlbmFtZSB0byBkcml2ZXJzL3dhdGNoZG9nL2F0OTFzYW05X3dkdC5oCmluZGV4IGZlY2MyZTkuLjc1N2Y5Y2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MV93ZHQuaAorKysgYi9kcml2ZXJzL3dhdGNoZG9nL2F0OTFzYW05X3dkdC5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIGFyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvYXQ5MV93ZHQuaAorICogZHJpdmVycy93YXRjaGRvZy9hdDkxc2FtOV93ZHQuaAogICoKICAqIENvcHlyaWdodCAoQykgMjAwNyBBbmRyZXcgVmljdG9yCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXRtZWwgQ29ycG9yYXRpb24uCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2R3X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9kd193ZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTBmOGMwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy93YXRjaGRvZy9kd193ZHQuYwpAQCAtMCwwICsxLDM3NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEwLTIwMTEgUGljb2NoaXAgTHRkLiwgSmFtaWUgSWxlcworICogaHR0cDovL3d3dy5waWNvY2hpcC5jb20KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgZHJpdmVyIGZvciB0aGUgU3lub3BzeXMgRGVzaWduV2FyZSB3YXRjaGRvZyBkZXZpY2UKKyAqIGluIHRoZSBtYW55IEFSTSBzdWJzeXN0ZW1zLiBUaGUgd2F0Y2hkb2cgaGFzIDE2IGRpZmZlcmVudCB0aW1lb3V0IHBlcmlvZHMKKyAqIGFuZCB0aGVzZSBhcmUgYSBmdW5jdGlvbiBvZiB0aGUgaW5wdXQgY2xvY2sgZnJlcXVlbmN5LgorICoKKyAqIFRoZSBEZXNpZ25XYXJlIHdhdGNoZG9nIGNhbm5vdCBiZSBzdG9wcGVkIG9uY2UgaXQgaGFzIGJlZW4gc3RhcnRlZCBzbyB3ZQorICogdXNlIGEgc29mdHdhcmUgdGltZXIgdG8gaW1wbGVtZW50IGEgcGluZyB0aGF0IHdpbGwga2VlcCB0aGUgd2F0Y2hkb2cgYWxpdmUuCisgKiBJZiB3ZSByZWNlaXZlIGFuIGV4cGVjdGVkIGNsb3NlIGZvciB0aGUgd2F0Y2hkb2cgdGhlbiB3ZSBrZWVwIHRoZSB0aW1lcgorICogcnVubmluZywgb3RoZXJ3aXNlIHRoZSB0aW1lciBpcyBzdG9wcGVkIGFuZCB0aGUgd2F0Y2hkb2cgd2lsbCBleHBpcmUuCisgKi8KKyNkZWZpbmUgcHJfZm10KGZtdCkgImR3X3dkdDogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKworI2RlZmluZSBXRE9HX0NPTlRST0xfUkVHX09GRlNFVAkJICAgIDB4MDAKKyNkZWZpbmUgV0RPR19DT05UUk9MX1JFR19XRFRfRU5fTUFTSwkgICAgMHgwMQorI2RlZmluZSBXRE9HX1RJTUVPVVRfUkFOR0VfUkVHX09GRlNFVAkgICAgMHgwNAorI2RlZmluZSBXRE9HX0NVUlJFTlRfQ09VTlRfUkVHX09GRlNFVAkgICAgMHgwOAorI2RlZmluZSBXRE9HX0NPVU5URVJfUkVTVEFSVF9SRUdfT0ZGU0VUICAgICAweDBjCisjZGVmaW5lIFdET0dfQ09VTlRFUl9SRVNUQVJUX0tJQ0tfVkFMVUUJICAgIDB4NzYKKworLyogVGhlIG1heGltdW0gVE9QICh0aW1lb3V0IHBlcmlvZCkgdmFsdWUgdGhhdCBjYW4gYmUgc2V0IGluIHRoZSB3YXRjaGRvZy4gKi8KKyNkZWZpbmUgRFdfV0RUX01BWF9UT1AJCTE1CisKK3N0YXRpYyBpbnQgbm93YXlvdXQgPSBXQVRDSERPR19OT1dBWU9VVDsKK21vZHVsZV9wYXJhbShub3dheW91dCwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0Mobm93YXlvdXQsICJXYXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZCBvbmNlIHN0YXJ0ZWQgIgorCQkgIihkZWZhdWx0PSIgX19NT0RVTEVfU1RSSU5HKFdBVENIRE9HX05PV0FZT1VUKSAiKSIpOworCisjZGVmaW5lIFdEVF9USU1FT1VUCQkoSFogLyAyKQorCitzdGF0aWMgc3RydWN0IHsKKwlzcGlubG9ja190CQlsb2NrOworCXZvaWQgX19pb21lbQkJKnJlZ3M7CisJc3RydWN0IGNsawkJKmNsazsKKwl1bnNpZ25lZCBsb25nCQlpbl91c2U7CisJdW5zaWduZWQgbG9uZwkJbmV4dF9oZWFydGJlYXQ7CisJc3RydWN0IHRpbWVyX2xpc3QJdGltZXI7CisJaW50CQkJZXhwZWN0X2Nsb3NlOworfSBkd193ZHQ7CisKK3N0YXRpYyBpbmxpbmUgaW50IGR3X3dkdF9pc19lbmFibGVkKHZvaWQpCit7CisJcmV0dXJuIHJlYWRsKGR3X3dkdC5yZWdzICsgV0RPR19DT05UUk9MX1JFR19PRkZTRVQpICYKKwkJV0RPR19DT05UUk9MX1JFR19XRFRfRU5fTUFTSzsKK30KKworc3RhdGljIGlubGluZSBpbnQgZHdfd2R0X3RvcF9pbl9zZWNvbmRzKHVuc2lnbmVkIHRvcCkKK3sKKwkvKgorCSAqIFRoZXJlIGFyZSAxNiBwb3NzaWJsZSB0aW1lb3V0IHZhbHVlcyBpbiAwLi4xNSB3aGVyZSB0aGUgbnVtYmVyIG9mCisJICogY3ljbGVzIGlzIDIgXiAoMTYgKyBpKSBhbmQgdGhlIHdhdGNoZG9nIGNvdW50cyBkb3duLgorCSAqLworCXJldHVybiAoMSA8PCAoMTYgKyB0b3ApKSAvIGNsa19nZXRfcmF0ZShkd193ZHQuY2xrKTsKK30KKworc3RhdGljIGludCBkd193ZHRfZ2V0X3RvcCh2b2lkKQoreworCWludCB0b3AgPSByZWFkbChkd193ZHQucmVncyArIFdET0dfVElNRU9VVF9SQU5HRV9SRUdfT0ZGU0VUKSAmIDB4RjsKKworCXJldHVybiBkd193ZHRfdG9wX2luX3NlY29uZHModG9wKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR3X3dkdF9zZXRfbmV4dF9oZWFydGJlYXQodm9pZCkKK3sKKwlkd193ZHQubmV4dF9oZWFydGJlYXQgPSBqaWZmaWVzICsgZHdfd2R0X2dldF90b3AoKSAqIEhaOworfQorCitzdGF0aWMgaW50IGR3X3dkdF9zZXRfdG9wKHVuc2lnbmVkIHRvcF9zKQoreworCWludCBpLCB0b3BfdmFsID0gRFdfV0RUX01BWF9UT1A7CisKKwkvKgorCSAqIEl0ZXJhdGUgb3ZlciB0aGUgdGltZW91dCB2YWx1ZXMgdW50aWwgd2UgZmluZCB0aGUgY2xvc2VzdCBtYXRjaC4gV2UKKwkgKiBhbHdheXMgbG9vayBmb3IgPj0uCisJICovCisJZm9yIChpID0gMDsgaSA8PSBEV19XRFRfTUFYX1RPUDsgKytpKQorCQlpZiAoZHdfd2R0X3RvcF9pbl9zZWNvbmRzKGkpID49IHRvcF9zKSB7CisJCQl0b3BfdmFsID0gaTsKKwkJCWJyZWFrOworCQl9CisKKwkvKiBTZXQgdGhlIG5ldyB2YWx1ZSBpbiB0aGUgd2F0Y2hkb2cuICovCisJd3JpdGVsKHRvcF92YWwsIGR3X3dkdC5yZWdzICsgV0RPR19USU1FT1VUX1JBTkdFX1JFR19PRkZTRVQpOworCisJZHdfd2R0X3NldF9uZXh0X2hlYXJ0YmVhdCgpOworCisJcmV0dXJuIGR3X3dkdF90b3BfaW5fc2Vjb25kcyh0b3BfdmFsKTsKK30KKworc3RhdGljIHZvaWQgZHdfd2R0X2tlZXBhbGl2ZSh2b2lkKQoreworCXdyaXRlbChXRE9HX0NPVU5URVJfUkVTVEFSVF9LSUNLX1ZBTFVFLCBkd193ZHQucmVncyArCisJICAgICAgIFdET0dfQ09VTlRFUl9SRVNUQVJUX1JFR19PRkZTRVQpOworfQorCitzdGF0aWMgdm9pZCBkd193ZHRfcGluZyh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGR3X3dkdC5uZXh0X2hlYXJ0YmVhdCkgfHwKKwkgICAgKCFub3dheW91dCAmJiAhZHdfd2R0LmluX3VzZSkpIHsKKwkJZHdfd2R0X2tlZXBhbGl2ZSgpOworCQltb2RfdGltZXIoJmR3X3dkdC50aW1lciwgamlmZmllcyArIFdEVF9USU1FT1VUKTsKKwl9IGVsc2UKKwkJcHJfY3JpdCgia2VlcGFsaXZlIG1pc3NlZCwgbWFjaGluZSB3aWxsIHJlc2V0XG4iKTsKK30KKworc3RhdGljIGludCBkd193ZHRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmZHdfd2R0LmluX3VzZSkpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBNYWtlIHN1cmUgd2UgZG9uJ3QgZ2V0IHVubG9hZGVkLiAqLworCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisKKwlzcGluX2xvY2soJmR3X3dkdC5sb2NrKTsKKwlpZiAoIWR3X3dkdF9pc19lbmFibGVkKCkpIHsKKwkJLyoKKwkJICogVGhlIHdhdGNoZG9nIGlzIG5vdCBjdXJyZW50bHkgZW5hYmxlZC4gU2V0IHRoZSB0aW1lb3V0IHRvCisJCSAqIHRoZSBtYXhpbXVtIGFuZCB0aGVuIHN0YXJ0IGl0LgorCQkgKi8KKwkJZHdfd2R0X3NldF90b3AoRFdfV0RUX01BWF9UT1ApOworCQl3cml0ZWwoV0RPR19DT05UUk9MX1JFR19XRFRfRU5fTUFTSywKKwkJICAgICAgIGR3X3dkdC5yZWdzICsgV0RPR19DT05UUk9MX1JFR19PRkZTRVQpOworCX0KKworCWR3X3dkdF9zZXRfbmV4dF9oZWFydGJlYXQoKTsKKworCXNwaW5fdW5sb2NrKCZkd193ZHQubG9jayk7CisKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlscCk7Cit9CisKK3NzaXplX3QgZHdfd2R0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuLAorCQkgICAgIGxvZmZfdCAqb2Zmc2V0KQoreworCWlmICghbGVuKQorCQlyZXR1cm4gMDsKKworCWlmICghbm93YXlvdXQpIHsKKwkJc2l6ZV90IGk7CisKKwkJZHdfd2R0LmV4cGVjdF9jbG9zZSA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7CisJCQljaGFyIGM7CisKKwkJCWlmIChnZXRfdXNlcihjLCBidWYgKyBpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkJaWYgKGMgPT0gJ1YnKSB7CisJCQkJZHdfd2R0LmV4cGVjdF9jbG9zZSA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlkd193ZHRfc2V0X25leHRfaGVhcnRiZWF0KCk7CisJbW9kX3RpbWVyKCZkd193ZHQudGltZXIsIGppZmZpZXMgKyBXRFRfVElNRU9VVCk7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgdTMyIGR3X3dkdF90aW1lX2xlZnQodm9pZCkKK3sKKwlyZXR1cm4gcmVhZGwoZHdfd2R0LnJlZ3MgKyBXRE9HX0NVUlJFTlRfQ09VTlRfUkVHX09GRlNFVCkgLworCQljbGtfZ2V0X3JhdGUoZHdfd2R0LmNsayk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyBkd193ZHRfaWRlbnQgPSB7CisJLm9wdGlvbnMJPSBXRElPRl9LRUVQQUxJVkVQSU5HIHwgV0RJT0ZfU0VUVElNRU9VVCB8CisJCQkgIFdESU9GX01BR0lDQ0xPU0UsCisJLmlkZW50aXR5CT0gIlN5bm9wc3lzIERlc2lnbldhcmUgV2F0Y2hkb2ciLAorfTsKKworc3RhdGljIGxvbmcgZHdfd2R0X2lvY3RsKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgdGltZW91dDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQlyZXR1cm4gY29weV90b191c2VyKChzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbyAqKWFyZywgJmR3X3dkdF9pZGVudCwKKwkJCQkgICAgc2l6ZW9mKGR3X3dkdF9pZGVudCkpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCXJldHVybiBwdXRfdXNlcigwLCAoaW50ICopYXJnKTsKKworCWNhc2UgV0RJT0NfS0VFUEFMSVZFOgorCQlkd193ZHRfc2V0X25leHRfaGVhcnRiZWF0KCk7CisJCXJldHVybiAwOworCisJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJdGltZW91dCA9IGR3X3dkdF9zZXRfdG9wKHZhbCk7CisJCXJldHVybiBwdXRfdXNlcih0aW1lb3V0ICwgKGludCBfX3VzZXIgKilhcmcpOworCisJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQlyZXR1cm4gcHV0X3VzZXIoZHdfd2R0X2dldF90b3AoKSwgKGludCBfX3VzZXIgKilhcmcpOworCisJY2FzZSBXRElPQ19HRVRUSU1FTEVGVDoKKwkJLyogR2V0IHRoZSB0aW1lIGxlZnQgdW50aWwgZXhwaXJ5LiAqLworCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIHB1dF91c2VyKGR3X3dkdF90aW1lX2xlZnQoKSwgKGludCBfX3VzZXIgKilhcmcpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FTk9UVFk7CisJfQorfQorCitzdGF0aWMgaW50IGR3X3dkdF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWNsZWFyX2JpdCgwLCAmZHdfd2R0LmluX3VzZSk7CisKKwlpZiAoIWR3X3dkdC5leHBlY3RfY2xvc2UpIHsKKwkJZGVsX3RpbWVyKCZkd193ZHQudGltZXIpOworCisJCWlmICghbm93YXlvdXQpCisJCQlwcl9jcml0KCJ1bmV4cGVjdGVkIGNsb3NlLCBzeXN0ZW0gd2lsbCByZWJvb3Qgc29vblxuIik7CisJCWVsc2UKKwkJCXByX2NyaXQoIndhdGNoZG9nIGNhbm5vdCBiZSBkaXNhYmxlZCwgc3lzdGVtIHdpbGwgcmVib290IHNvb25cbiIpOworCX0KKworCWR3X3dkdC5leHBlY3RfY2xvc2UgPSAwOworCisJcmV0dXJuIDA7Cit9CisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQgZHdfd2R0X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQoreworCWNsa19kaXNhYmxlKGR3X3dkdC5jbGspOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHdfd2R0X3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJaW50IGVyciA9IGNsa19lbmFibGUoZHdfd2R0LmNsayk7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZHdfd2R0X2tlZXBhbGl2ZSgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBkd193ZHRfcG1fb3BzID0geworCS5zdXNwZW5kCT0gZHdfd2R0X3N1c3BlbmQsCisJLnJlc3VtZQkJPSBkd193ZHRfcmVzdW1lLAorfTsKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgd2R0X2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5vcGVuCQk9IGR3X3dkdF9vcGVuLAorCS53cml0ZQkJPSBkd193ZHRfd3JpdGUsCisJLnVubG9ja2VkX2lvY3RsCT0gZHdfd2R0X2lvY3RsLAorCS5yZWxlYXNlCT0gZHdfd2R0X3JlbGVhc2UKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWlzY2RldmljZSBkd193ZHRfbWlzY2RldiA9IHsKKwkuZm9wcwkJPSAmd2R0X2ZvcHMsCisJLm5hbWUJCT0gIndhdGNoZG9nIiwKKwkubWlub3IJCT0gV0FUQ0hET0dfTUlOT1IsCit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBkd193ZHRfZHJ2X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKm1lbSA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisKKwlpZiAoIW1lbSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWRldm1fcmVxdWVzdF9tZW1fcmVnaW9uKCZwZGV2LT5kZXYsIG1lbS0+c3RhcnQsIHJlc291cmNlX3NpemUobWVtKSwKKwkJCQkgICAgICJkd193ZHQiKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkd193ZHQucmVncyA9IGRldm1faW9yZW1hcCgmcGRldi0+ZGV2LCBtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSkpOworCWlmICghZHdfd2R0LnJlZ3MpCisJCXJldHVybiAtRU5PTUVNOworCisJZHdfd2R0LmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CisJaWYgKElTX0VSUihkd193ZHQuY2xrKSkKKwkJcmV0dXJuIFBUUl9FUlIoZHdfd2R0LmNsayk7CisKKwlyZXQgPSBjbGtfZW5hYmxlKGR3X3dkdC5jbGspOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3B1dF9jbGs7CisKKwlzcGluX2xvY2tfaW5pdCgmZHdfd2R0LmxvY2spOworCisJcmV0ID0gbWlzY19yZWdpc3RlcigmZHdfd2R0X21pc2NkZXYpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2Rpc2FibGVfY2xrOworCisJZHdfd2R0X3NldF9uZXh0X2hlYXJ0YmVhdCgpOworCXNldHVwX3RpbWVyKCZkd193ZHQudGltZXIsIGR3X3dkdF9waW5nLCAwKTsKKwltb2RfdGltZXIoJmR3X3dkdC50aW1lciwgamlmZmllcyArIFdEVF9USU1FT1VUKTsKKworCXJldHVybiAwOworCitvdXRfZGlzYWJsZV9jbGs6CisJY2xrX2Rpc2FibGUoZHdfd2R0LmNsayk7CitvdXRfcHV0X2NsazoKKwljbGtfcHV0KGR3X3dkdC5jbGspOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgZHdfd2R0X2Rydl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJmR3X3dkdF9taXNjZGV2KTsKKworCWNsa19kaXNhYmxlKGR3X3dkdC5jbGspOworCWNsa19wdXQoZHdfd2R0LmNsayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZHdfd2R0X2RyaXZlciA9IHsKKwkucHJvYmUJCT0gZHdfd2R0X2Rydl9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGR3X3dkdF9kcnZfcmVtb3ZlKSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSAiZHdfd2R0IiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisjaWZkZWYgQ09ORklHX1BNCisJCS5wbQk9ICZkd193ZHRfcG1fb3BzLAorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBkd193ZHRfd2F0Y2hkb2dfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmR3X3dkdF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoZHdfd2R0X3dhdGNoZG9nX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgZHdfd2R0X3dhdGNoZG9nX2V4aXQodm9pZCkKK3sKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZHdfd2R0X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChkd193ZHRfd2F0Y2hkb2dfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIkphbWllIElsZXMiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU3lub3BzeXMgRGVzaWduV2FyZSBXYXRjaGRvZyBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19NSVNDREVWKFdBVENIRE9HX01JTk9SKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvaHB3ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvaHB3ZHQuYwppbmRleCA4Y2IyNjg1Li40MTBmYmE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2hwd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9ocHdkdC5jCkBAIC0zNiw3ICszNiw3IEBACiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNlbmRpZiAvKiBDT05GSUdfSFBXRFRfTk1JX0RFQ09ESU5HICovCiAKLSNkZWZpbmUgSFBXRFRfVkVSU0lPTgkJCSIxLjIuMCIKKyNkZWZpbmUgSFBXRFRfVkVSU0lPTgkJCSIxLjMuMCIKICNkZWZpbmUgU0VDU19UT19USUNLUyhzZWNzKQkJKChzZWNzKSAqIDEwMDAgLyAxMjgpCiAjZGVmaW5lIFRJQ0tTX1RPX1NFQ1ModGlja3MpCQkoKHRpY2tzKSAqIDEyOCAvIDEwMDApCiAjZGVmaW5lIEhQV0RUX01BWF9USU1FUgkJCVRJQ0tTX1RPX1NFQ1MoNjU1MzUpCkBAIC04Nyw2ICs4NywxOSBAQAogfTsKICNkZWZpbmUgU01CSU9TX0NSVTY0X0lORk9STUFUSU9OCTIxMgogCisvKiB0eXBlIDIxOSAqLworc3RydWN0IHNtYmlvc19wcm9saWFudF9pbmZvIHsKKwl1OCB0eXBlOworCXU4IGJ5dGVfbGVuZ3RoOworCXUxNiBoYW5kbGU7CisJdTMyIHBvd2VyX2ZlYXR1cmVzOworCXUzMiBvbWVnYV9mZWF0dXJlczsKKwl1MzIgcmVzZXJ2ZWQ7CisJdTMyIG1pc2NfZmVhdHVyZXM7Cit9OworI2RlZmluZSBTTUJJT1NfSUNSVV9JTkZPUk1BVElPTgkJMjE5CisKKwogc3RydWN0IGNtbl9yZWdpc3RlcnMgewogCXVuaW9uIHsKIAkJc3RydWN0IHsKQEAgLTEzMiw2ICsxNDUsNyBAQAogc3RhdGljIHVuc2lnbmVkIGludCBocHdkdF9ubWlfZGVjb2Rpbmc7CiBzdGF0aWMgdW5zaWduZWQgaW50IGFsbG93X2tkdW1wOwogc3RhdGljIHVuc2lnbmVkIGludCBwcmlvcml0eTsJCS8qIGhwd2R0IGF0IGVuZCBvZiBkaWVfbm90aWZ5IGxpc3QgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXNfaWNydTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0socm9tX2xvY2spOwogc3RhdGljIHZvaWQgKmNydV9yb21fYWRkcjsKIHN0YXRpYyBzdHJ1Y3QgY21uX3JlZ2lzdGVycyBjbW5fcmVnczsKQEAgLTQ3NiwxOSArNDkwLDIyIEBACiAJCWdvdG8gb3V0OwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnJvbV9sb2NrLCByb21fcGwpOwotCWlmICghZGllX25taV9jYWxsZWQpCisJaWYgKCFkaWVfbm1pX2NhbGxlZCAmJiAhaXNfaWNydSkKIAkJYXNtaW5saW5lX2NhbGwoJmNtbl9yZWdzLCBjcnVfcm9tX2FkZHIpOwogCWRpZV9ubWlfY2FsbGVkID0gMTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyb21fbG9jaywgcm9tX3BsKTsKLQlpZiAoY21uX3JlZ3MudTEucmFsID09IDApIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaHB3ZHQ6IEFuIE5NSSBvY2N1cnJlZCwgIgotCQkJImJ1dCB1bmFibGUgdG8gZGV0ZXJtaW5lIHNvdXJjZS5cbiIpOwotCX0gZWxzZSB7Ci0JCWlmIChhbGxvd19rZHVtcCkKLQkJCWhwd2R0X3N0b3AoKTsKLQkJcGFuaWMoIkFuIE5NSSBvY2N1cnJlZCwgcGxlYXNlIHNlZSB0aGUgSW50ZWdyYXRlZCAiCi0JCQkiTWFuYWdlbWVudCBMb2cgZm9yIGRldGFpbHMuXG4iKTsKKwlpZiAoIWlzX2ljcnUpIHsKKwkJaWYgKGNtbl9yZWdzLnUxLnJhbCA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJocHdkdDogQW4gTk1JIG9jY3VycmVkLCAiCisJCQkJImJ1dCB1bmFibGUgdG8gZGV0ZXJtaW5lIHNvdXJjZS5cbiIpOworCQl9CiAJfQorCisJaWYgKGFsbG93X2tkdW1wKQorCQlocHdkdF9zdG9wKCk7CisJcGFuaWMoIkFuIE5NSSBvY2N1cnJlZCwgcGxlYXNlIHNlZSB0aGUgSW50ZWdyYXRlZCAiCisJCSJNYW5hZ2VtZW50IExvZyBmb3IgZGV0YWlscy5cbiIpOworCiBvdXQ6CiAJcmV0dXJuIE5PVElGWV9PSzsKIH0KQEAgLTY1OSwzMCArNjc2LDYzIEBACiB9CiAjZW5kaWYgLyogQ09ORklHX1g4Nl9MT0NBTF9BUElDICovCiAKKy8qCisgKglkbWlfZmluZF9pY3J1CisgKgorICoJUm91dGluZSBEZXNjcmlwdGlvbjoKKyAqCVRoaXMgZnVuY3Rpb24gY2hlY2tzIHdoZXRoZXIgb3Igbm90IHdlIGFyZSBvbiBhbiBpQ1JVLWJhc2VkIHNlcnZlci4KKyAqCVRoaXMgY2hlY2sgaXMgaW5kZXBlbmRlbnQgb2YgYXJjaGl0ZWN0dXJlIGFuZCBuZWVkcyB0byBiZSBtYWRlIGZvcgorICoJYW55IFByb0xpYW50IHN5c3RlbS4KKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IGRtaV9maW5kX2ljcnUoY29uc3Qgc3RydWN0IGRtaV9oZWFkZXIgKmRtLCB2b2lkICpkdW1teSkKK3sKKwlzdHJ1Y3Qgc21iaW9zX3Byb2xpYW50X2luZm8gKnNtYmlvc19wcm9saWFudF9wdHI7CisKKwlpZiAoZG0tPnR5cGUgPT0gU01CSU9TX0lDUlVfSU5GT1JNQVRJT04pIHsKKwkJc21iaW9zX3Byb2xpYW50X3B0ciA9IChzdHJ1Y3Qgc21iaW9zX3Byb2xpYW50X2luZm8gKikgZG07CisJCWlmIChzbWJpb3NfcHJvbGlhbnRfcHRyLT5taXNjX2ZlYXR1cmVzICYgMHgwMSkKKwkJCWlzX2ljcnUgPSAxOworCX0KK30KKwogc3RhdGljIGludCBfX2RldmluaXQgaHB3ZHRfaW5pdF9ubWlfZGVjb2Rpbmcoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlpbnQgcmV0dmFsOwogCiAJLyoKLQkgKiBXZSBuZWVkIHRvIG1hcCB0aGUgUk9NIHRvIGdldCB0aGUgQ1JVIHNlcnZpY2UuCi0JICogRm9yIDMyIGJpdCBPcGVyYXRpbmcgU3lzdGVtcyB3ZSBuZWVkIHRvIGdvIHRocm91Z2ggdGhlIDMyIEJpdAotCSAqIEJJT1MgU2VydmljZSBEaXJlY3RvcnkKLQkgKiBGb3IgNjQgYml0IE9wZXJhdGluZyBTeXN0ZW1zIHdlIGdldCB0aGF0IHNlcnZpY2UgdGhyb3VnaCBTTUJJT1MuCisJICogT24gdHlwaWNhbCBDUlUtYmFzZWQgc3lzdGVtcyB3ZSBuZWVkIHRvIG1hcCB0aGF0IHNlcnZpY2UgaW4KKwkgKiB0aGUgQklPUy4gRm9yIDMyIGJpdCBPcGVyYXRpbmcgU3lzdGVtcyB3ZSBuZWVkIHRvIGdvIHRocm91Z2gKKwkgKiB0aGUgMzIgQml0IEJJT1MgU2VydmljZSBEaXJlY3RvcnkuIEZvciA2NCBiaXQgT3BlcmF0aW5nCisJICogU3lzdGVtcyB3ZSBnZXQgdGhhdCBzZXJ2aWNlIHRocm91Z2ggU01CSU9TLgorCSAqCisJICogT24gc3lzdGVtcyB0aGF0IHN1cHBvcnQgdGhlIG5ldyBpQ1JVIHNlcnZpY2UgYWxsIHdlIG5lZWQgdG8KKwkgKiBkbyBpcyBjYWxsIGRtaV93YWxrIHRvIGdldCB0aGUgc3VwcG9ydGVkIGZsYWcgdmFsdWUgYW5kIHNraXAKKwkgKiB0aGUgb2xkIGNydSBkZXRlY3QgY29kZS4KIAkgKi8KLQlyZXR2YWwgPSBkZXRlY3RfY3J1X3NlcnZpY2UoKTsKLQlpZiAocmV0dmFsIDwgMCkgewotCQlkZXZfd2FybigmZGV2LT5kZXYsCi0JCQkiVW5hYmxlIHRvIGRldGVjdCB0aGUgJWQgQml0IENSVSBTZXJ2aWNlLlxuIiwKLQkJCUhQV0RUX0FSQ0gpOwotCQlyZXR1cm4gcmV0dmFsOwotCX0KKwlkbWlfd2FsayhkbWlfZmluZF9pY3J1LCBOVUxMKTsKKwlpZiAoIWlzX2ljcnUpIHsKIAotCS8qCi0JICogV2Uga25vdyB0aGlzIGlzIHRoZSBvbmx5IENSVSBjYWxsIHdlIG5lZWQgdG8gbWFrZSBzbyBsZXRzIGtlZXAgYXMKLQkgKiBmZXcgaW5zdHJ1Y3Rpb25zIGFzIHBvc3NpYmxlIG9uY2UgdGhlIE5NSSBjb21lcyBpbi4KLQkgKi8KLQljbW5fcmVncy51MS5yYWggPSAweDBEOwotCWNtbl9yZWdzLnUxLnJhbCA9IDB4MDI7CisJCS8qCisJCSogV2UgbmVlZCB0byBtYXAgdGhlIFJPTSB0byBnZXQgdGhlIENSVSBzZXJ2aWNlLgorCQkqIEZvciAzMiBiaXQgT3BlcmF0aW5nIFN5c3RlbXMgd2UgbmVlZCB0byBnbyB0aHJvdWdoIHRoZSAzMiBCaXQKKwkJKiBCSU9TIFNlcnZpY2UgRGlyZWN0b3J5CisJCSogRm9yIDY0IGJpdCBPcGVyYXRpbmcgU3lzdGVtcyB3ZSBnZXQgdGhhdCBzZXJ2aWNlIHRocm91Z2ggU01CSU9TLgorCQkqLworCQlyZXR2YWwgPSBkZXRlY3RfY3J1X3NlcnZpY2UoKTsKKwkJaWYgKHJldHZhbCA8IDApIHsKKwkJCWRldl93YXJuKCZkZXYtPmRldiwKKwkJCQkiVW5hYmxlIHRvIGRldGVjdCB0aGUgJWQgQml0IENSVSBTZXJ2aWNlLlxuIiwKKwkJCQlIUFdEVF9BUkNIKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKworCQkvKgorCQkqIFdlIGtub3cgdGhpcyBpcyB0aGUgb25seSBDUlUgY2FsbCB3ZSBuZWVkIHRvIG1ha2Ugc28gbGV0cyBrZWVwIGFzCisJCSogZmV3IGluc3RydWN0aW9ucyBhcyBwb3NzaWJsZSBvbmNlIHRoZSBOTUkgY29tZXMgaW4uCisJCSovCisJCWNtbl9yZWdzLnUxLnJhaCA9IDB4MEQ7CisJCWNtbl9yZWdzLnUxLnJhbCA9IDB4MDI7CisJfQogCiAJLyoKIAkgKiBJZiB0aGUgcHJpb3JpdHkgaXMgc2V0IHRvIDEsIHRoZW4gd2Ugd2lsbCBiZSBwdXQgZmlyc3Qgb24gdGhlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2lUQ09fd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2lUQ09fd2R0LmMKaW5kZXggNWZkMDIwZC4uNzUxYTU5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9pVENPX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvaVRDT193ZHQuYwpAQCAtMTIwLDcyICsxMjAsMTIgQEAKIAlUQ09fMzQyMCwJLyogMzQyMCAqLwogCVRDT18zNDUwLAkvKiAzNDUwICovCiAJVENPX0VQODA1NzksCS8qIEVQODA1NzkgKi8KLQlUQ09fQ1BUMSwJLyogQ291Z2FyIFBvaW50ICovCi0JVENPX0NQVDIsCS8qIENvdWdhciBQb2ludCBEZXNrdG9wICovCi0JVENPX0NQVDMsCS8qIENvdWdhciBQb2ludCBNb2JpbGUgKi8KLQlUQ09fQ1BUNCwJLyogQ291Z2FyIFBvaW50ICovCi0JVENPX0NQVDUsCS8qIENvdWdhciBQb2ludCAqLwotCVRDT19DUFQ2LAkvKiBDb3VnYXIgUG9pbnQgKi8KLQlUQ09fQ1BUNywJLyogQ291Z2FyIFBvaW50ICovCi0JVENPX0NQVDgsCS8qIENvdWdhciBQb2ludCAqLwotCVRDT19DUFQ5LAkvKiBDb3VnYXIgUG9pbnQgKi8KLQlUQ09fQ1BUMTAsCS8qIENvdWdhciBQb2ludCAqLwotCVRDT19DUFQxMSwJLyogQ291Z2FyIFBvaW50ICovCi0JVENPX0NQVDEyLAkvKiBDb3VnYXIgUG9pbnQgKi8KLQlUQ09fQ1BUMTMsCS8qIENvdWdhciBQb2ludCAqLwotCVRDT19DUFQxNCwJLyogQ291Z2FyIFBvaW50ICovCi0JVENPX0NQVDE1LAkvKiBDb3VnYXIgUG9pbnQgKi8KLQlUQ09fQ1BUMTYsCS8qIENvdWdhciBQb2ludCAqLwotCVRDT19DUFQxNywJLyogQ291Z2FyIFBvaW50ICovCi0JVENPX0NQVDE4LAkvKiBDb3VnYXIgUG9pbnQgKi8KLQlUQ09fQ1BUMTksCS8qIENvdWdhciBQb2ludCAqLwotCVRDT19DUFQyMCwJLyogQ291Z2FyIFBvaW50ICovCi0JVENPX0NQVDIxLAkvKiBDb3VnYXIgUG9pbnQgKi8KLQlUQ09fQ1BUMjIsCS8qIENvdWdhciBQb2ludCAqLwotCVRDT19DUFQyMywJLyogQ291Z2FyIFBvaW50ICovCi0JVENPX0NQVDI0LAkvKiBDb3VnYXIgUG9pbnQgKi8KLQlUQ09fQ1BUMjUsCS8qIENvdWdhciBQb2ludCAqLwotCVRDT19DUFQyNiwJLyogQ291Z2FyIFBvaW50ICovCi0JVENPX0NQVDI3LAkvKiBDb3VnYXIgUG9pbnQgKi8KLQlUQ09fQ1BUMjgsCS8qIENvdWdhciBQb2ludCAqLwotCVRDT19DUFQyOSwJLyogQ291Z2FyIFBvaW50ICovCi0JVENPX0NQVDMwLAkvKiBDb3VnYXIgUG9pbnQgKi8KLQlUQ09fQ1BUMzEsCS8qIENvdWdhciBQb2ludCAqLwotCVRDT19QQkcxLAkvKiBQYXRzYnVyZyAqLwotCVRDT19QQkcyLAkvKiBQYXRzYnVyZyAqLworCVRDT19DUFQsCS8qIENvdWdhciBQb2ludCAqLworCVRDT19DUFRELAkvKiBDb3VnYXIgUG9pbnQgRGVza3RvcCAqLworCVRDT19DUFRNLAkvKiBDb3VnYXIgUG9pbnQgTW9iaWxlICovCisJVENPX1BCRywJLyogUGF0c2J1cmcgKi8KIAlUQ09fREg4OVhYQ0MsCS8qIERIODl4eENDICovCi0JVENPX1BQVDAsCS8qIFBhbnRoZXIgUG9pbnQgKi8KLQlUQ09fUFBUMSwJLyogUGFudGhlciBQb2ludCAqLwotCVRDT19QUFQyLAkvKiBQYW50aGVyIFBvaW50ICovCi0JVENPX1BQVDMsCS8qIFBhbnRoZXIgUG9pbnQgKi8KLQlUQ09fUFBUNCwJLyogUGFudGhlciBQb2ludCAqLwotCVRDT19QUFQ1LAkvKiBQYW50aGVyIFBvaW50ICovCi0JVENPX1BQVDYsCS8qIFBhbnRoZXIgUG9pbnQgKi8KLQlUQ09fUFBUNywJLyogUGFudGhlciBQb2ludCAqLwotCVRDT19QUFQ4LAkvKiBQYW50aGVyIFBvaW50ICovCi0JVENPX1BQVDksCS8qIFBhbnRoZXIgUG9pbnQgKi8KLQlUQ09fUFBUMTAsCS8qIFBhbnRoZXIgUG9pbnQgKi8KLQlUQ09fUFBUMTEsCS8qIFBhbnRoZXIgUG9pbnQgKi8KLQlUQ09fUFBUMTIsCS8qIFBhbnRoZXIgUG9pbnQgKi8KLQlUQ09fUFBUMTMsCS8qIFBhbnRoZXIgUG9pbnQgKi8KLQlUQ09fUFBUMTQsCS8qIFBhbnRoZXIgUG9pbnQgKi8KLQlUQ09fUFBUMTUsCS8qIFBhbnRoZXIgUG9pbnQgKi8KLQlUQ09fUFBUMTYsCS8qIFBhbnRoZXIgUG9pbnQgKi8KLQlUQ09fUFBUMTcsCS8qIFBhbnRoZXIgUG9pbnQgKi8KLQlUQ09fUFBUMTgsCS8qIFBhbnRoZXIgUG9pbnQgKi8KLQlUQ09fUFBUMTksCS8qIFBhbnRoZXIgUG9pbnQgKi8KLQlUQ09fUFBUMjAsCS8qIFBhbnRoZXIgUG9pbnQgKi8KLQlUQ09fUFBUMjEsCS8qIFBhbnRoZXIgUG9pbnQgKi8KLQlUQ09fUFBUMjIsCS8qIFBhbnRoZXIgUG9pbnQgKi8KLQlUQ09fUFBUMjMsCS8qIFBhbnRoZXIgUG9pbnQgKi8KLQlUQ09fUFBUMjQsCS8qIFBhbnRoZXIgUG9pbnQgKi8KLQlUQ09fUFBUMjUsCS8qIFBhbnRoZXIgUG9pbnQgKi8KLQlUQ09fUFBUMjYsCS8qIFBhbnRoZXIgUG9pbnQgKi8KLQlUQ09fUFBUMjcsCS8qIFBhbnRoZXIgUG9pbnQgKi8KLQlUQ09fUFBUMjgsCS8qIFBhbnRoZXIgUG9pbnQgKi8KLQlUQ09fUFBUMjksCS8qIFBhbnRoZXIgUG9pbnQgKi8KLQlUQ09fUFBUMzAsCS8qIFBhbnRoZXIgUG9pbnQgKi8KLQlUQ09fUFBUMzEsCS8qIFBhbnRoZXIgUG9pbnQgKi8KKwlUQ09fUFBULAkvKiBQYW50aGVyIFBvaW50ICovCiB9OwogCiBzdGF0aWMgc3RydWN0IHsKQEAgLTI0NCw4MyArMTg0LDE0IEBACiAJeyIzNDUwIiwgMn0sCiAJeyJFUDgwNTc5IiwgMn0sCiAJeyJDb3VnYXIgUG9pbnQiLCAyfSwKLQl7IkNvdWdhciBQb2ludCIsIDJ9LAotCXsiQ291Z2FyIFBvaW50IiwgMn0sCi0JeyJDb3VnYXIgUG9pbnQiLCAyfSwKLQl7IkNvdWdhciBQb2ludCIsIDJ9LAotCXsiQ291Z2FyIFBvaW50IiwgMn0sCi0JeyJDb3VnYXIgUG9pbnQiLCAyfSwKLQl7IkNvdWdhciBQb2ludCIsIDJ9LAotCXsiQ291Z2FyIFBvaW50IiwgMn0sCi0JeyJDb3VnYXIgUG9pbnQiLCAyfSwKLQl7IkNvdWdhciBQb2ludCIsIDJ9LAotCXsiQ291Z2FyIFBvaW50IiwgMn0sCi0JeyJDb3VnYXIgUG9pbnQiLCAyfSwKLQl7IkNvdWdhciBQb2ludCIsIDJ9LAotCXsiQ291Z2FyIFBvaW50IiwgMn0sCi0JeyJDb3VnYXIgUG9pbnQiLCAyfSwKLQl7IkNvdWdhciBQb2ludCIsIDJ9LAotCXsiQ291Z2FyIFBvaW50IiwgMn0sCi0JeyJDb3VnYXIgUG9pbnQiLCAyfSwKLQl7IkNvdWdhciBQb2ludCIsIDJ9LAotCXsiQ291Z2FyIFBvaW50IiwgMn0sCi0JeyJDb3VnYXIgUG9pbnQiLCAyfSwKLQl7IkNvdWdhciBQb2ludCIsIDJ9LAotCXsiQ291Z2FyIFBvaW50IiwgMn0sCi0JeyJDb3VnYXIgUG9pbnQiLCAyfSwKLQl7IkNvdWdhciBQb2ludCIsIDJ9LAotCXsiQ291Z2FyIFBvaW50IiwgMn0sCi0JeyJDb3VnYXIgUG9pbnQiLCAyfSwKLQl7IkNvdWdhciBQb2ludCIsIDJ9LAotCXsiQ291Z2FyIFBvaW50IiwgMn0sCi0JeyJDb3VnYXIgUG9pbnQiLCAyfSwKLQl7IlBhdHNidXJnIiwgMn0sCisJeyJDb3VnYXIgUG9pbnQgRGVza3RvcCIsIDJ9LAorCXsiQ291Z2FyIFBvaW50IE1vYmlsZSIsIDJ9LAogCXsiUGF0c2J1cmciLCAyfSwKIAl7IkRIODl4eENDIiwgMn0sCiAJeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCi0JeyJQYW50aGVyIFBvaW50IiwgMn0sCiAJe05VTEwsIDB9CiB9OwogCi0jZGVmaW5lIElUQ09fUENJX0RFVklDRShkZXYsIGRhdGEpIFwKLQkudmVuZG9yID0gUENJX1ZFTkRPUl9JRF9JTlRFTCwJXAotCS5kZXZpY2UgPSBkZXYsCQkJXAotCS5zdWJ2ZW5kb3IgPSBQQ0lfQU5ZX0lELAlcCi0JLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCVwKLQkuY2xhc3MgPSAwLAkJCVwKLQkuY2xhc3NfbWFzayA9IDAsCQlcCi0JLmRyaXZlcl9kYXRhID0gZGF0YQotCiAvKgogICogVGhpcyBkYXRhIG9ubHkgZXhpc3RzIGZvciBleHBvcnRpbmcgdGhlIHN1cHBvcnRlZCBQQ0kgaWRzCiAgKiB2aWEgTU9EVUxFX0RFVklDRV9UQUJMRS4gIFdlIGRvIG5vdCBhY3R1YWxseSByZWdpc3RlciBhCkBAIC0zMjgsMTM4ICsxOTksMTM4IEBACiAgKiBmdW5jdGlvbnMgdGhhdCBwcm9iYWJseSB3aWxsIGJlIHJlZ2lzdGVyZWQgYnkgb3RoZXIgZHJpdmVycy4KICAqLwogc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGlUQ09fd2R0X3BjaV90YmwpID0gewotCXsgSVRDT19QQ0lfREVWSUNFKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFBQV8wLAlUQ09fSUNIKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUFCXzAsCVRDT19JQ0gwKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUJBXzAsCVRDT19JQ0gyKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUJBXzEwLAlUQ09fSUNIMk0pfSwKLQl7IElUQ09fUENJX0RFVklDRShQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQ0FfMCwJVENPX0lDSDMpfSwKLQl7IElUQ09fUENJX0RFVklDRShQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQ0FfMTIsCVRDT19JQ0gzTSl9LAotCXsgSVRDT19QQ0lfREVWSUNFKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFEQl8wLAlUQ09fSUNINCl9LAotCXsgSVRDT19QQ0lfREVWSUNFKFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFEQl8xMiwJVENPX0lDSDRNKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUVfMCwJCVRDT19DSUNIKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUVCXzAsCVRDT19JQ0g1KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoUENJX0RFVklDRV9JRF9JTlRFTF9FU0JfMSwJCVRDT182MzAwRVNCKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g2XzAsCQlUQ09fSUNINil9LAotCXsgSVRDT19QQ0lfREVWSUNFKFBDSV9ERVZJQ0VfSURfSU5URUxfSUNINl8xLAkJVENPX0lDSDZNKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g2XzIsCQlUQ09fSUNINlcpfSwKLQl7IElUQ09fUENJX0RFVklDRShQQ0lfREVWSUNFX0lEX0lOVEVMX0VTQjJfMCwJCVRDT182MzFYRVNCKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgyNjcxLAkJCQlUQ09fNjMxWEVTQil9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MjY3MiwJCQkJVENPXzYzMVhFU0IpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDI2NzMsCQkJCVRDT182MzFYRVNCKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgyNjc0LAkJCQlUQ09fNjMxWEVTQil9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MjY3NSwJCQkJVENPXzYzMVhFU0IpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDI2NzYsCQkJCVRDT182MzFYRVNCKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgyNjc3LAkJCQlUQ09fNjMxWEVTQil9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MjY3OCwJCQkJVENPXzYzMVhFU0IpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDI2NzksCQkJCVRDT182MzFYRVNCKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgyNjdhLAkJCQlUQ09fNjMxWEVTQil9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MjY3YiwJCQkJVENPXzYzMVhFU0IpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDI2N2MsCQkJCVRDT182MzFYRVNCKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgyNjdkLAkJCQlUQ09fNjMxWEVTQil9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MjY3ZSwJCQkJVENPXzYzMVhFU0IpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDI2N2YsCQkJCVRDT182MzFYRVNCKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g3XzAsCQlUQ09fSUNINyl9LAotCXsgSVRDT19QQ0lfREVWSUNFKFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIN18zMCwJCVRDT19JQ0g3REgpfSwKLQl7IElUQ09fUENJX0RFVklDRShQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDdfMSwJCVRDT19JQ0g3TSl9LAotCXsgSVRDT19QQ0lfREVWSUNFKFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIN18zMSwJCVRDT19JQ0g3TURIKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgyN2JjLAkJCQlUQ09fTk0xMCl9LAotCXsgSVRDT19QQ0lfREVWSUNFKFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOF8wLAkJVENPX0lDSDgpfSwKLQl7IElUQ09fUENJX0RFVklDRShQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDhfMiwJCVRDT19JQ0g4REgpfSwKLQl7IElUQ09fUENJX0RFVklDRShQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDhfMywJCVRDT19JQ0g4RE8pfSwKLQl7IElUQ09fUENJX0RFVklDRShQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDhfNCwJCVRDT19JQ0g4TSl9LAotCXsgSVRDT19QQ0lfREVWSUNFKFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOF8xLAkJVENPX0lDSDhNRSl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MjkxOCwJCQkJVENPX0lDSDkpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDI5MTYsCQkJCVRDT19JQ0g5Uil9LAotCXsgSVRDT19QQ0lfREVWSUNFKFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOV8yLAkJVENPX0lDSDlESCl9LAotCXsgSVRDT19QQ0lfREVWSUNFKFBDSV9ERVZJQ0VfSURfSU5URUxfSUNIOV80LAkJVENPX0lDSDlETyl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MjkxOSwJCQkJVENPX0lDSDlNKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgyOTE3LAkJCQlUQ09fSUNIOU1FKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgzYTE4LAkJCQlUQ09fSUNIMTApfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDNhMTYsCQkJCVRDT19JQ0gxMFIpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDNhMWEsCQkJCVRDT19JQ0gxMEQpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDNhMTQsCQkJCVRDT19JQ0gxMERPKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgzYjAwLAkJCQlUQ09fUENIKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgzYjAxLAkJCQlUQ09fUENITSl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4M2IwMiwJCQkJVENPX1A1NSl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4M2IwMywJCQkJVENPX1BNNTUpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDNiMDYsCQkJCVRDT19INTUpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDNiMDcsCQkJCVRDT19RTTU3KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgzYjA4LAkJCQlUQ09fSDU3KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgzYjA5LAkJCQlUQ09fSE01NSl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4M2IwYSwJCQkJVENPX1E1Nyl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4M2IwYiwJCQkJVENPX0hNNTcpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDNiMGQsCQkJCVRDT19QQ0hNU0ZGKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgzYjBmLAkJCQlUQ09fUVM1Nyl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4M2IxMiwJCQkJVENPXzM0MDApfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDNiMTQsCQkJCVRDT18zNDIwKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgzYjE2LAkJCQlUQ09fMzQ1MCl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4NTAzMSwJCQkJVENPX0VQODA1NzkpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFjNDEsCQkJCVRDT19DUFQxKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxYzQyLAkJCQlUQ09fQ1BUMil9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWM0MywJCQkJVENPX0NQVDMpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFjNDQsCQkJCVRDT19DUFQ0KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxYzQ1LAkJCQlUQ09fQ1BUNSl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWM0NiwJCQkJVENPX0NQVDYpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFjNDcsCQkJCVRDT19DUFQ3KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxYzQ4LAkJCQlUQ09fQ1BUOCl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWM0OSwJCQkJVENPX0NQVDkpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFjNGEsCQkJCVRDT19DUFQxMCl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWM0YiwJCQkJVENPX0NQVDExKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxYzRjLAkJCQlUQ09fQ1BUMTIpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFjNGQsCQkJCVRDT19DUFQxMyl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWM0ZSwJCQkJVENPX0NQVDE0KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxYzRmLAkJCQlUQ09fQ1BUMTUpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFjNTAsCQkJCVRDT19DUFQxNil9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWM1MSwJCQkJVENPX0NQVDE3KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxYzUyLAkJCQlUQ09fQ1BUMTgpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFjNTMsCQkJCVRDT19DUFQxOSl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWM1NCwJCQkJVENPX0NQVDIwKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxYzU1LAkJCQlUQ09fQ1BUMjEpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFjNTYsCQkJCVRDT19DUFQyMil9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWM1NywJCQkJVENPX0NQVDIzKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxYzU4LAkJCQlUQ09fQ1BUMjQpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFjNTksCQkJCVRDT19DUFQyNSl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWM1YSwJCQkJVENPX0NQVDI2KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxYzViLAkJCQlUQ09fQ1BUMjcpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFjNWMsCQkJCVRDT19DUFQyOCl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWM1ZCwJCQkJVENPX0NQVDI5KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxYzVlLAkJCQlUQ09fQ1BUMzApfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFjNWYsCQkJCVRDT19DUFQzMSl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWQ0MCwJCQkJVENPX1BCRzEpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFkNDEsCQkJCVRDT19QQkcyKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgyMzEwLAkJCQlUQ09fREg4OVhYQ0MpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFlNDAsCQkJCVRDT19QUFQwKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxZTQxLAkJCQlUQ09fUFBUMSl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWU0MiwJCQkJVENPX1BQVDIpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFlNDMsCQkJCVRDT19QUFQzKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxZTQ0LAkJCQlUQ09fUFBUNCl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWU0NSwJCQkJVENPX1BQVDUpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFlNDYsCQkJCVRDT19QUFQ2KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxZTQ3LAkJCQlUQ09fUFBUNyl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWU0OCwJCQkJVENPX1BQVDgpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFlNDksCQkJCVRDT19QUFQ5KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxZTRhLAkJCQlUQ09fUFBUMTApfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFlNGIsCQkJCVRDT19QUFQxMSl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWU0YywJCQkJVENPX1BQVDEyKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxZTRkLAkJCQlUQ09fUFBUMTMpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFlNGUsCQkJCVRDT19QUFQxNCl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWU0ZiwJCQkJVENPX1BQVDE1KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxZTUwLAkJCQlUQ09fUFBUMTYpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFlNTEsCQkJCVRDT19QUFQxNyl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWU1MiwJCQkJVENPX1BQVDE4KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxZTUzLAkJCQlUQ09fUFBUMTkpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFlNTQsCQkJCVRDT19QUFQyMCl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWU1NSwJCQkJVENPX1BQVDIxKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxZTU2LAkJCQlUQ09fUFBUMjIpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFlNTcsCQkJCVRDT19QUFQyMyl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWU1OCwJCQkJVENPX1BQVDI0KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxZTU5LAkJCQlUQ09fUFBUMjUpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFlNWEsCQkJCVRDT19QUFQyNil9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWU1YiwJCQkJVENPX1BQVDI3KX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxZTVjLAkJCQlUQ09fUFBUMjgpfSwKLQl7IElUQ09fUENJX0RFVklDRSgweDFlNWQsCQkJCVRDT19QUFQyOSl9LAotCXsgSVRDT19QQ0lfREVWSUNFKDB4MWU1ZSwJCQkJVENPX1BQVDMwKX0sCi0JeyBJVENPX1BDSV9ERVZJQ0UoMHgxZTVmLAkJCQlUQ09fUFBUMzEpfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI0MTApLCBUQ09fSUNIfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI0MjApLCBUQ09fSUNIMH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNDQwKSwgVENPX0lDSDJ9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjQ0YyksIFRDT19JQ0gyTX0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNDgwKSwgVENPX0lDSDN9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjQ4YyksIFRDT19JQ0gzTX0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNGMwKSwgVENPX0lDSDR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjRjYyksIFRDT19JQ0g0TX0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNDUwKSwgVENPX0NJQ0h9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjRkMCksIFRDT19JQ0g1fSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI1YTEpLCBUQ09fNjMwMEVTQn0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNjQwKSwgVENPX0lDSDZ9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjY0MSksIFRDT19JQ0g2TX0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNjQyKSwgVENPX0lDSDZXfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI2NzApLCBUQ09fNjMxWEVTQn0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNjcxKSwgVENPXzYzMVhFU0J9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjY3MiksIFRDT182MzFYRVNCfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI2NzMpLCBUQ09fNjMxWEVTQn0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNjc0KSwgVENPXzYzMVhFU0J9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjY3NSksIFRDT182MzFYRVNCfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI2NzYpLCBUQ09fNjMxWEVTQn0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNjc3KSwgVENPXzYzMVhFU0J9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjY3OCksIFRDT182MzFYRVNCfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI2NzkpLCBUQ09fNjMxWEVTQn0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNjdhKSwgVENPXzYzMVhFU0J9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjY3YiksIFRDT182MzFYRVNCfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI2N2MpLCBUQ09fNjMxWEVTQn0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyNjdkKSwgVENPXzYzMVhFU0J9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjY3ZSksIFRDT182MzFYRVNCfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI2N2YpLCBUQ09fNjMxWEVTQn0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyN2I4KSwgVENPX0lDSDd9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjdiMCksIFRDT19JQ0g3REh9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjdiOSksIFRDT19JQ0g3TX0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyN2JkKSwgVENPX0lDSDdNREh9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjdiYyksIFRDT19OTTEwfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI4MTApLCBUQ09fSUNIOH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyODEyKSwgVENPX0lDSDhESH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyODE0KSwgVENPX0lDSDhET30sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyODE1KSwgVENPX0lDSDhNfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI4MTEpLCBUQ09fSUNIOE1FfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI5MTgpLCBUQ09fSUNIOX0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgyOTE2KSwgVENPX0lDSDlSfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI5MTIpLCBUQ09fSUNIOURIfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI5MTQpLCBUQ09fSUNIOURPfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDI5MTkpLCBUQ09fSUNIOU19LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MjkxNyksIFRDT19JQ0g5TUV9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4M2ExOCksIFRDT19JQ0gxMH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgzYTE2KSwgVENPX0lDSDEwUn0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgzYTFhKSwgVENPX0lDSDEwRH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgzYTE0KSwgVENPX0lDSDEwRE99LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4M2IwMCksIFRDT19QQ0h9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4M2IwMSksIFRDT19QQ0hNfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDNiMDIpLCBUQ09fUDU1fSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDNiMDMpLCBUQ09fUE01NX0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgzYjA2KSwgVENPX0g1NX0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgzYjA3KSwgVENPX1FNNTd9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4M2IwOCksIFRDT19INTd9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4M2IwOSksIFRDT19ITTU1fSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDNiMGEpLCBUQ09fUTU3fSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDNiMGIpLCBUQ09fSE01N30sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgzYjBkKSwgVENPX1BDSE1TRkZ9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4M2IwZiksIFRDT19RUzU3fSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDNiMTIpLCBUQ09fMzQwMH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgzYjE0KSwgVENPXzM0MjB9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4M2IxNiksIFRDT18zNDUwfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDUwMzEpLCBUQ09fRVA4MDU3OX0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYzQxKSwgVENPX0NQVH0sCisJeyBQQ0lfVkRFVklDRShJTlRFTCwgMHgxYzQyKSwgVENPX0NQVER9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWM0MyksIFRDT19DUFRNfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNDQpLCBUQ09fQ1BUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNDUpLCBUQ09fQ1BUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNDYpLCBUQ09fQ1BUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNDcpLCBUQ09fQ1BUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNDgpLCBUQ09fQ1BUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNDkpLCBUQ09fQ1BUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNGEpLCBUQ09fQ1BUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNGIpLCBUQ09fQ1BUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNGMpLCBUQ09fQ1BUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNGQpLCBUQ09fQ1BUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNGUpLCBUQ09fQ1BUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNGYpLCBUQ09fQ1BUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNTApLCBUQ09fQ1BUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNTEpLCBUQ09fQ1BUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNTIpLCBUQ09fQ1BUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNTMpLCBUQ09fQ1BUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNTQpLCBUQ09fQ1BUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNTUpLCBUQ09fQ1BUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNTYpLCBUQ09fQ1BUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNTcpLCBUQ09fQ1BUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNTgpLCBUQ09fQ1BUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNTkpLCBUQ09fQ1BUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNWEpLCBUQ09fQ1BUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNWIpLCBUQ09fQ1BUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNWMpLCBUQ09fQ1BUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNWQpLCBUQ09fQ1BUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNWUpLCBUQ09fQ1BUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFjNWYpLCBUQ09fQ1BUfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFkNDApLCBUQ09fUEJHfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDFkNDEpLCBUQ09fUEJHfSwKKwl7IFBDSV9WREVWSUNFKElOVEVMLCAweDIzMTApLCBUQ09fREg4OVhYQ0N9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU0MCksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU0MSksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU0MiksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU0MyksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU0NCksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU0NSksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU0NiksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU0NyksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU0OCksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU0OSksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU0YSksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU0YiksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU0YyksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU0ZCksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU0ZSksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU0ZiksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU1MCksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU1MSksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU1MiksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU1MyksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU1NCksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU1NSksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU1NiksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU1NyksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU1OCksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU1OSksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU1YSksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU1YiksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU1YyksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU1ZCksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU1ZSksIFRDT19QUFR9LAorCXsgUENJX1ZERVZJQ0UoSU5URUwsIDB4MWU1ZiksIFRDT19QUFR9LAogCXsgMCwgfSwJCQkvKiBFbmQgb2YgbGlzdCAqLwogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpVENPX3dkdF9wY2lfdGJsKTsKQEAgLTEwNTIsMTUgKzkyMywxMCBAQAogCWlUQ09fd2R0X3N0b3AoKTsKIH0KIAotI2RlZmluZSBpVENPX3dkdF9zdXNwZW5kIE5VTEwKLSNkZWZpbmUgaVRDT193ZHRfcmVzdW1lICBOVUxMCi0KIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGlUQ09fd2R0X2RyaXZlciA9IHsKIAkucHJvYmUgICAgICAgICAgPSBpVENPX3dkdF9wcm9iZSwKIAkucmVtb3ZlICAgICAgICAgPSBfX2RldmV4aXRfcChpVENPX3dkdF9yZW1vdmUpLAogCS5zaHV0ZG93biAgICAgICA9IGlUQ09fd2R0X3NodXRkb3duLAotCS5zdXNwZW5kICAgICAgICA9IGlUQ09fd2R0X3N1c3BlbmQsCi0JLnJlc3VtZSAgICAgICAgID0gaVRDT193ZHRfcmVzdW1lLAogCS5kcml2ZXIgICAgICAgICA9IHsKIAkJLm93bmVyICA9IFRISVNfTU9EVUxFLAogCQkubmFtZSAgID0gRFJWX05BTUUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2lteDJfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2lteDJfd2R0LmMKaW5kZXggODZmN2NhYy4uYjhlZjJjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9pbXgyX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvaW14Ml93ZHQuYwpAQCAtMzI5LDEyICszMjksMTggQEAKIAl9CiB9CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGlteDJfd2R0X2R0X2lkc1tdID0geworCXsgLmNvbXBhdGlibGUgPSAiZnNsLGlteDIxLXdkdCIsIH0sCisJeyAvKiBzZW50aW5lbCAqLyB9Cit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBpbXgyX3dkdF9kcml2ZXIgPSB7CiAJLnJlbW92ZQkJPSBfX2V4aXRfcChpbXgyX3dkdF9yZW1vdmUpLAogCS5zaHV0ZG93bgk9IGlteDJfd2R0X3NodXRkb3duLAogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9IERSSVZFUl9OQU1FLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gaW14Ml93ZHRfZHRfaWRzLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2l0ODcxMmZfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2l0ODcxMmZfd2R0LmMKaW5kZXggNjE0M2Y1Mi4uOGQyZDg1MCAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9pdDg3MTJmX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvaXQ4NzEyZl93ZHQuYwpAQCAtMjgsMTAgKzI4LDEwIEBACiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAKICNkZWZpbmUgTkFNRSAiaXQ4NzEyZl93ZHQiCiAKQEAgLTUxLDcgKzUxLDYgQEAKIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgd2R0X29wZW47CiBzdGF0aWMgdW5zaWduZWQgZXhwZWN0X2Nsb3NlOwotc3RhdGljIHNwaW5sb2NrX3QgaW9fbG9jazsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyIHJldmlzaW9uOwogCiAvKiBEb2cgRm9vZCBhZGRyZXNzIC0gV2UgdXNlIHRoZSBnYW1lIHBvcnQgYWRkcmVzcyAqLwpAQCAtMTIxLDIwICsxMjAsMjYgQEAKIAlvdXRiKGxkbiwgVkFMKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHN1cGVyaW9fZW50ZXIodm9pZCkKK3N0YXRpYyBpbmxpbmUgaW50IHN1cGVyaW9fZW50ZXIodm9pZCkKIHsKLQlzcGluX2xvY2soJmlvX2xvY2spOworCS8qCisJICogVHJ5IHRvIHJlc2VydmUgUkVHIGFuZCBSRUcgKyAxIGZvciBleGNsdXNpdmUgYWNjZXNzLgorCSAqLworCWlmICghcmVxdWVzdF9tdXhlZF9yZWdpb24oUkVHLCAyLCBOQU1FKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwogCW91dGIoMHg4NywgUkVHKTsKIAlvdXRiKDB4MDEsIFJFRyk7CiAJb3V0YigweDU1LCBSRUcpOwogCW91dGIoMHg1NSwgUkVHKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHN1cGVyaW9fZXhpdCh2b2lkKQogewogCW91dGIoMHgwMiwgUkVHKTsKIAlvdXRiKDB4MDIsIFZBTCk7Ci0Jc3Bpbl91bmxvY2soJmlvX2xvY2spOworCXJlbGVhc2VfcmVnaW9uKFJFRywgMik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpdDg3MTJmX3dkdF9waW5nKHZvaWQpCkBAIC0xNzMsMTAgKzE3OCwxMyBAQAogCQlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgaXQ4NzEyZl93ZHRfZW5hYmxlKHZvaWQpCitzdGF0aWMgaW50IGl0ODcxMmZfd2R0X2VuYWJsZSh2b2lkKQogeworCWludCByZXQgPSBzdXBlcmlvX2VudGVyKCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCXByaW50ayhLRVJOX0RFQlVHIE5BTUUgIjogZW5hYmxpbmcgd2F0Y2hkb2cgdGltZXJcbiIpOwotCXN1cGVyaW9fZW50ZXIoKTsKIAlzdXBlcmlvX3NlbGVjdChMRE5fR1BJTyk7CiAKIAlzdXBlcmlvX291dGIod2R0X2NvbnRyb2xfcmVnLCBXRFRfQ09OVFJPTCk7CkBAIC0xODYsMTMgKzE5NCwxNyBAQAogCXN1cGVyaW9fZXhpdCgpOwogCiAJaXQ4NzEyZl93ZHRfcGluZygpOworCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGl0ODcxMmZfd2R0X2Rpc2FibGUodm9pZCkKK3N0YXRpYyBpbnQgaXQ4NzEyZl93ZHRfZGlzYWJsZSh2b2lkKQogewotCXByaW50ayhLRVJOX0RFQlVHIE5BTUUgIjogZGlzYWJsaW5nIHdhdGNoZG9nIHRpbWVyXG4iKTsKKwlpbnQgcmV0ID0gc3VwZXJpb19lbnRlcigpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKLQlzdXBlcmlvX2VudGVyKCk7CisJcHJpbnRrKEtFUk5fREVCVUcgTkFNRSAiOiBkaXNhYmxpbmcgd2F0Y2hkb2cgdGltZXJcbiIpOwogCXN1cGVyaW9fc2VsZWN0KExETl9HUElPKTsKIAogCXN1cGVyaW9fb3V0YigwLCBXRFRfQ09ORklHKTsKQEAgLTIwMiw2ICsyMTQsNyBAQAogCXN1cGVyaW9fb3V0YigwLCBXRFRfVElNRU9VVCk7CiAKIAlzdXBlcmlvX2V4aXQoKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBpdDg3MTJmX3dkdF9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLApAQCAtMjUyLDYgKzI2NSw3IEBACiAJCQkJCQlXRElPRl9NQUdJQ0NMT1NFLAogCX07CiAJaW50IHZhbHVlOworCWludCByZXQ7CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgV0RJT0NfR0VUU1VQUE9SVDoKQEAgLTI1OSw3ICsyNzMsOSBAQAogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCXJldHVybiAwOwogCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgotCQlzdXBlcmlvX2VudGVyKCk7CisJCXJldCA9IHN1cGVyaW9fZW50ZXIoKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJCXN1cGVyaW9fc2VsZWN0KExETl9HUElPKTsKIAogCQl2YWx1ZSA9IGl0ODcxMmZfd2R0X2dldF9zdGF0dXMoKTsKQEAgLTI4MCw3ICsyOTYsOSBAQAogCQlpZiAodmFsdWUgPiAobWF4X3VuaXRzICogNjApKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCW1hcmdpbiA9IHZhbHVlOwotCQlzdXBlcmlvX2VudGVyKCk7CisJCXJldCA9IHN1cGVyaW9fZW50ZXIoKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CiAJCXN1cGVyaW9fc2VsZWN0KExETl9HUElPKTsKIAogCQlpdDg3MTJmX3dkdF91cGRhdGVfbWFyZ2luKCk7CkBAIC0yOTksMTAgKzMxNywxNCBAQAogCiBzdGF0aWMgaW50IGl0ODcxMmZfd2R0X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCiB7CisJaW50IHJldDsKIAkvKiBvbmx5IGFsbG93IG9uZSBhdCBhIHRpbWUgKi8KIAlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmd2R0X29wZW4pKQogCQlyZXR1cm4gLUVCVVNZOwotCWl0ODcxMmZfd2R0X2VuYWJsZSgpOworCisJcmV0ID0gaXQ4NzEyZl93ZHRfZW5hYmxlKCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7CiB9CiAKQEAgLTMxMyw3ICszMzUsOCBAQAogCQkJIjogd2F0Y2hkb2cgZGV2aWNlIGNsb3NlZCB1bmV4cGVjdGVkbHksIHdpbGwgbm90IgogCQkJIiBkaXNhYmxlIHRoZSB3YXRjaGRvZyB0aW1lclxuIik7CiAJfSBlbHNlIGlmICghbm93YXlvdXQpIHsKLQkJaXQ4NzEyZl93ZHRfZGlzYWJsZSgpOworCQlpZiAoaXQ4NzEyZl93ZHRfZGlzYWJsZSgpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyBOQU1FICJXYXRjaGRvZyBkaXNhYmxlIGZhaWxlZFxuIik7CiAJfQogCWV4cGVjdF9jbG9zZSA9IDA7CiAJY2xlYXJfYml0KDAsICZ3ZHRfb3Blbik7CkBAIC0zNDAsOCArMzYzLDEwIEBACiB7CiAJaW50IGVyciA9IC1FTk9ERVY7CiAJaW50IGNoaXBfdHlwZTsKKwlpbnQgcmV0ID0gc3VwZXJpb19lbnRlcigpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CiAKLQlzdXBlcmlvX2VudGVyKCk7CiAJY2hpcF90eXBlID0gc3VwZXJpb19pbncoREVWSUQpOwogCWlmIChjaGlwX3R5cGUgIT0gSVQ4NzEyRl9ERVZJRCkKIAkJZ290byBleGl0OwpAQCAtMzgyLDggKzQwNyw2IEBACiB7CiAJaW50IGVyciA9IDA7CiAKLQlzcGluX2xvY2tfaW5pdCgmaW9fbG9jayk7Ci0KIAlpZiAoaXQ4NzEyZl93ZHRfZmluZCgmYWRkcmVzcykpCiAJCXJldHVybiAtRU5PREVWOwogCkBAIC0zOTIsNyArNDE1LDExIEBACiAJCXJldHVybiAtRUJVU1k7CiAJfQogCi0JaXQ4NzEyZl93ZHRfZGlzYWJsZSgpOworCWVyciA9IGl0ODcxMmZfd2R0X2Rpc2FibGUoKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBOQU1FICI6IHVuYWJsZSB0byBkaXNhYmxlIHdhdGNoZG9nIHRpbWVyLlxuIik7CisJCWdvdG8gb3V0OworCX0KIAogCWVyciA9IHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmaXQ4NzEyZl93ZHRfbm90aWZpZXIpOwogCWlmIChlcnIpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvaXQ4N193ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvaXQ4N193ZHQuYwppbmRleCBiMWJjNzJmLi5hMmQ5YTEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2l0ODdfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9pdDg3X3dkdC5jCkBAIC0xMzcsNyArMTM3LDYgQEAKIAogc3RhdGljCXVuc2lnbmVkIGludCBiYXNlLCBncGFjdCwgY2lyYWN0LCBtYXhfdW5pdHMsIGNoaXBfdHlwZTsKIHN0YXRpYwl1bnNpZ25lZCBsb25nIHdkdF9zdGF0dXM7Ci1zdGF0aWMJREVGSU5FX1NQSU5MT0NLKHNwaW5sb2NrKTsKIAogc3RhdGljCWludCBub2dhbWVwb3J0ID0gREVGQVVMVF9OT0dBTUVQT1JUOwogc3RhdGljCWludCBleGNsdXNpdmUgID0gREVGQVVMVF9FWENMVVNJVkU7CkBAIC0xNjMsMTggKzE2MiwyNiBAQAogCiAvKiBTdXBlcmlvIENoaXAgKi8KIAotc3RhdGljIGlubGluZSB2b2lkIHN1cGVyaW9fZW50ZXIodm9pZCkKK3N0YXRpYyBpbmxpbmUgaW50IHN1cGVyaW9fZW50ZXIodm9pZCkKIHsKKwkvKgorCSAqIFRyeSB0byByZXNlcnZlIFJFRyBhbmQgUkVHICsgMSBmb3IgZXhjbHVzaXZlIGFjY2Vzcy4KKwkgKi8KKwlpZiAoIXJlcXVlc3RfbXV4ZWRfcmVnaW9uKFJFRywgMiwgV0FUQ0hET0dfTkFNRSkpCisJCXJldHVybiAtRUJVU1k7CisKIAlvdXRiKDB4ODcsIFJFRyk7CiAJb3V0YigweDAxLCBSRUcpOwogCW91dGIoMHg1NSwgUkVHKTsKIAlvdXRiKDB4NTUsIFJFRyk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzdXBlcmlvX2V4aXQodm9pZCkKIHsKIAlvdXRiKDB4MDIsIFJFRyk7CiAJb3V0YigweDAyLCBWQUwpOworCXJlbGVhc2VfcmVnaW9uKFJFRywgMik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzdXBlcmlvX3NlbGVjdChpbnQgbGRuKQpAQCAtMjU1LDEyICsyNjIsMTEgQEAKIAlzZXRfYml0KFdEVFNfS0VFUEFMSVZFLCAmd2R0X3N0YXR1cyk7CiB9CiAKLXN0YXRpYyB2b2lkIHdkdF9zdGFydCh2b2lkKQorc3RhdGljIGludCB3ZHRfc3RhcnQodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNwaW5sb2NrLCBmbGFncyk7Ci0Jc3VwZXJpb19lbnRlcigpOworCWludCByZXQgPSBzdXBlcmlvX2VudGVyKCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCXN1cGVyaW9fc2VsZWN0KEdQSU8pOwogCWlmICh0ZXN0X2JpdChXRFRTX1VTRV9HUCwgJndkdF9zdGF0dXMpKQpAQCAtMjcwLDE1ICsyNzYsMTUgQEAKIAl3ZHRfdXBkYXRlX3RpbWVvdXQoKTsKIAogCXN1cGVyaW9fZXhpdCgpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgd2R0X3N0b3Aodm9pZCkKK3N0YXRpYyBpbnQgd2R0X3N0b3Aodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNwaW5sb2NrLCBmbGFncyk7Ci0Jc3VwZXJpb19lbnRlcigpOworCWludCByZXQgPSBzdXBlcmlvX2VudGVyKCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCXN1cGVyaW9fc2VsZWN0KEdQSU8pOwogCXN1cGVyaW9fb3V0YigweDAwLCBXRFRDVFJMKTsKQEAgLTI4OCw3ICsyOTQsNyBAQAogCQlzdXBlcmlvX291dGIoMHgwMCwgV0RUVkFMTVNCKTsKIAogCXN1cGVyaW9fZXhpdCgpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwaW5sb2NrLCBmbGFncyk7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtMzAzLDggKzMwOSw2IEBACiAKIHN0YXRpYyBpbnQgd2R0X3NldF90aW1lb3V0KGludCB0KQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KIAlpZiAodCA8IDEgfHwgdCA+IG1heF91bml0cyAqIDYwKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMzEzLDE0ICszMTcsMTUgQEAKIAllbHNlCiAJCXRpbWVvdXQgPSB0OwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnNwaW5sb2NrLCBmbGFncyk7CiAJaWYgKHRlc3RfYml0KFdEVFNfVElNRVJfUlVOLCAmd2R0X3N0YXR1cykpIHsKLQkJc3VwZXJpb19lbnRlcigpOworCQlpbnQgcmV0ID0gc3VwZXJpb19lbnRlcigpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwogCQlzdXBlcmlvX3NlbGVjdChHUElPKTsKIAkJd2R0X3VwZGF0ZV90aW1lb3V0KCk7CiAJCXN1cGVyaW9fZXhpdCgpOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGlubG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwogfQogCkBAIC0zMzksMTIgKzM0NCwxMiBAQAogCiBzdGF0aWMgaW50IHdkdF9nZXRfc3RhdHVzKGludCAqc3RhdHVzKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KIAkqc3RhdHVzID0gMDsKIAlpZiAodGVzdG1vZGUpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnNwaW5sb2NrLCBmbGFncyk7Ci0JCXN1cGVyaW9fZW50ZXIoKTsKKwkJaW50IHJldCA9IHN1cGVyaW9fZW50ZXIoKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKIAkJc3VwZXJpb19zZWxlY3QoR1BJTyk7CiAJCWlmIChzdXBlcmlvX2luYihXRFRDVFJMKSAmIFdEVF9aRVJPKSB7CiAJCQlzdXBlcmlvX291dGIoMHgwMCwgV0RUQ1RSTCk7CkBAIC0zNTMsNyArMzU4LDYgQEAKIAkJfQogCiAJCXN1cGVyaW9fZXhpdCgpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGlubG9jaywgZmxhZ3MpOwogCX0KIAlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFdEVFNfS0VFUEFMSVZFLCAmd2R0X3N0YXR1cykpCiAJCSpzdGF0dXMgfD0gV0RJT0ZfS0VFUEFMSVZFUElORzsKQEAgLTM3OSw5ICszODMsMTcgQEAKIAlpZiAoZXhjbHVzaXZlICYmIHRlc3RfYW5kX3NldF9iaXQoV0RUU19ERVZfT1BFTiwgJndkdF9zdGF0dXMpKQogCQlyZXR1cm4gLUVCVVNZOwogCWlmICghdGVzdF9hbmRfc2V0X2JpdChXRFRTX1RJTUVSX1JVTiwgJndkdF9zdGF0dXMpKSB7CisJCWludCByZXQ7CiAJCWlmIChub3dheW91dCAmJiAhdGVzdF9hbmRfc2V0X2JpdChXRFRTX0xPQ0tFRCwgJndkdF9zdGF0dXMpKQogCQkJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKLQkJd2R0X3N0YXJ0KCk7CisKKwkJcmV0ID0gd2R0X3N0YXJ0KCk7CisJCWlmIChyZXQpIHsKKwkJCWNsZWFyX2JpdChXRFRTX0xPQ0tFRCwgJndkdF9zdGF0dXMpOworCQkJY2xlYXJfYml0KFdEVFNfVElNRVJfUlVOLCAmd2R0X3N0YXR1cyk7CisJCQljbGVhcl9iaXQoV0RUU19ERVZfT1BFTiwgJndkdF9zdGF0dXMpOworCQkJcmV0dXJuIHJldDsKKwkJfQogCX0KIAlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7CiB9CkBAIC00MDMsNyArNDE1LDE2IEBACiB7CiAJaWYgKHRlc3RfYml0KFdEVFNfVElNRVJfUlVOLCAmd2R0X3N0YXR1cykpIHsKIAkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChXRFRTX0VYUEVDVEVELCAmd2R0X3N0YXR1cykpIHsKLQkJCXdkdF9zdG9wKCk7CisJCQlpbnQgcmV0ID0gd2R0X3N0b3AoKTsKKwkJCWlmIChyZXQpIHsKKwkJCQkvKgorCQkJCSAqIFN0b3AgZmFpbGVkLiBKdXN0IGtlZXAgdGhlIHdhdGNoZG9nIGFsaXZlCisJCQkJICogYW5kIGhvcGUgbm90aGluZyBiYWQgaGFwcGVucy4KKwkJCQkgKi8KKwkJCQlzZXRfYml0KFdEVFNfRVhQRUNURUQsICZ3ZHRfc3RhdHVzKTsKKwkJCQl3ZHRfa2VlcGFsaXZlKCk7CisJCQkJcmV0dXJuIHJldDsKKwkJCX0KIAkJCWNsZWFyX2JpdChXRFRTX1RJTUVSX1JVTiwgJndkdF9zdGF0dXMpOwogCQl9IGVsc2UgewogCQkJd2R0X2tlZXBhbGl2ZSgpOwpAQCAtNDg0LDcgKzUwNSw5IEBACiAJCQkJICAgICZpZGVudCwgc2l6ZW9mKGlkZW50KSkgPyAtRUZBVUxUIDogMDsKIAogCWNhc2UgV0RJT0NfR0VUU1RBVFVTOgotCQl3ZHRfZ2V0X3N0YXR1cygmc3RhdHVzKTsKKwkJcmMgPSB3ZHRfZ2V0X3N0YXR1cygmc3RhdHVzKTsKKwkJaWYgKHJjKQorCQkJcmV0dXJuIHJjOwogCQlyZXR1cm4gcHV0X3VzZXIoc3RhdHVzLCB1YXJnLmkpOwogCiAJY2FzZSBXRElPQ19HRVRCT09UU1RBVFVTOgpAQCAtNTAwLDE0ICs1MjMsMjIgQEAKIAogCQlzd2l0Y2ggKG5ld19vcHRpb25zKSB7CiAJCWNhc2UgV0RJT1NfRElTQUJMRUNBUkQ6Ci0JCQlpZiAodGVzdF9iaXQoV0RUU19USU1FUl9SVU4sICZ3ZHRfc3RhdHVzKSkKLQkJCQl3ZHRfc3RvcCgpOworCQkJaWYgKHRlc3RfYml0KFdEVFNfVElNRVJfUlVOLCAmd2R0X3N0YXR1cykpIHsKKwkJCQlyYyA9IHdkdF9zdG9wKCk7CisJCQkJaWYgKHJjKQorCQkJCQlyZXR1cm4gcmM7CisJCQl9CiAJCQljbGVhcl9iaXQoV0RUU19USU1FUl9SVU4sICZ3ZHRfc3RhdHVzKTsKIAkJCXJldHVybiAwOwogCiAJCWNhc2UgV0RJT1NfRU5BQkxFQ0FSRDoKLQkJCWlmICghdGVzdF9hbmRfc2V0X2JpdChXRFRTX1RJTUVSX1JVTiwgJndkdF9zdGF0dXMpKQotCQkJCXdkdF9zdGFydCgpOworCQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KFdEVFNfVElNRVJfUlVOLCAmd2R0X3N0YXR1cykpIHsKKwkJCQlyYyA9IHdkdF9zdGFydCgpOworCQkJCWlmIChyYykgeworCQkJCQljbGVhcl9iaXQoV0RUU19USU1FUl9SVU4sICZ3ZHRfc3RhdHVzKTsKKwkJCQkJcmV0dXJuIHJjOworCQkJCX0KKwkJCX0KIAkJCXJldHVybiAwOwogCiAJCWRlZmF1bHQ6CkBAIC01NjAsMTYgKzU5MSwxNyBAQAogCWludCByYyA9IDA7CiAJaW50IHRyeV9nYW1lcG9ydCA9ICFub2dhbWVwb3J0OwogCXU4ICBjaGlwX3JldjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBncF9ycmVxX2ZhaWwgPSAwOwogCiAJd2R0X3N0YXR1cyA9IDA7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3BpbmxvY2ssIGZsYWdzKTsKLQlzdXBlcmlvX2VudGVyKCk7CisJcmMgPSBzdXBlcmlvX2VudGVyKCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKIAljaGlwX3R5cGUgPSBzdXBlcmlvX2ludyhDSElQSUQpOwogCWNoaXBfcmV2ICA9IHN1cGVyaW9faW5iKENISVBSRVYpICYgMHgwZjsKIAlzdXBlcmlvX2V4aXQoKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGlubG9jaywgZmxhZ3MpOwogCiAJc3dpdGNoIChjaGlwX3R5cGUpIHsKIAljYXNlIElUODcwMl9JRDoKQEAgLTYwMyw4ICs2MzUsOSBAQAogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmc3BpbmxvY2ssIGZsYWdzKTsKLQlzdXBlcmlvX2VudGVyKCk7CisJcmMgPSBzdXBlcmlvX2VudGVyKCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CiAKIAlzdXBlcmlvX3NlbGVjdChHUElPKTsKIAlzdXBlcmlvX291dGIoV0RUX1RPVjEsIFdEVENGRyk7CkBAIC02MjAsMjEgKzY1MywxNiBAQAogCQl9CiAJCWdwYWN0ID0gc3VwZXJpb19pbmIoQUNUUkVHKTsKIAkJc3VwZXJpb19vdXRiKDB4MDEsIEFDVFJFRyk7Ci0JCXN1cGVyaW9fZXhpdCgpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGlubG9jaywgZmxhZ3MpOwogCQlpZiAocmVxdWVzdF9yZWdpb24oYmFzZSwgMSwgV0FUQ0hET0dfTkFNRSkpCiAJCQlzZXRfYml0KFdEVFNfVVNFX0dQLCAmd2R0X3N0YXR1cyk7CiAJCWVsc2UKLQkJCXJjID0gLUVJTzsKLQl9IGVsc2UgewotCQlzdXBlcmlvX2V4aXQoKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3BpbmxvY2ssIGZsYWdzKTsKKwkJCWdwX3JyZXFfZmFpbCA9IDE7CiAJfQogCiAJLyogSWYgd2UgaGF2ZW4ndCBHYW1lcG9ydCBzdXBwb3J0LCB0cnkgdG8gZ2V0IENJUiBzdXBwb3J0ICovCiAJaWYgKCF0ZXN0X2JpdChXRFRTX1VTRV9HUCwgJndkdF9zdGF0dXMpKSB7CiAJCWlmICghcmVxdWVzdF9yZWdpb24oQ0lSX0JBU0UsIDgsIFdBVENIRE9HX05BTUUpKSB7Ci0JCQlpZiAocmMgPT0gLUVJTykKKwkJCWlmIChncF9ycmVxX2ZhaWwpCiAJCQkJcHJpbnRrKEtFUk5fRVJSIFBGWAogCQkJCQkiSS9PIEFkZHJlc3MgMHglMDR4IGFuZCAweCUwNHgiCiAJCQkJCSIgYWxyZWFkeSBpbiB1c2VcbiIsIGJhc2UsIENJUl9CQVNFKTsKQEAgLTY0NiwyMSArNjc0LDE2IEBACiAJCQlnb3RvIGVycl9vdXQ7CiAJCX0KIAkJYmFzZSA9IENJUl9CQVNFOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3BpbmxvY2ssIGZsYWdzKTsKLQkJc3VwZXJpb19lbnRlcigpOwogCiAJCXN1cGVyaW9fc2VsZWN0KENJUik7CiAJCXN1cGVyaW9fb3V0dyhiYXNlLCBCQVNFUkVHKTsKIAkJc3VwZXJpb19vdXRiKDB4MDAsIENJUl9JTFMpOwogCQljaXJhY3QgPSBzdXBlcmlvX2luYihBQ1RSRUcpOwogCQlzdXBlcmlvX291dGIoMHgwMSwgQUNUUkVHKTsKLQkJaWYgKHJjID09IC1FSU8pIHsKKwkJaWYgKGdwX3JyZXFfZmFpbCkgewogCQkJc3VwZXJpb19zZWxlY3QoR0FNRVBPUlQpOwogCQkJc3VwZXJpb19vdXRiKGdwYWN0LCBBQ1RSRUcpOwogCQl9Ci0KLQkJc3VwZXJpb19leGl0KCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwaW5sb2NrLCBmbGFncyk7CiAJfQogCiAJaWYgKHRpbWVvdXQgPCAxIHx8IHRpbWVvdXQgPiBtYXhfdW5pdHMgKiA2MCkgewpAQCAtNzA0LDYgKzcyNyw3IEBACiAJCSJub2dhbWVwb3J0PSVkKVxuIiwgY2hpcF90eXBlLCBjaGlwX3JldiwgdGltZW91dCwKIAkJbm93YXlvdXQsIHRlc3Rtb2RlLCBleGNsdXNpdmUsIG5vZ2FtZXBvcnQpOwogCisJc3VwZXJpb19leGl0KCk7CiAJcmV0dXJuIDA7CiAKIGVycl9vdXRfcmVib290OgpAQCAtNzExLDQ5ICs3MzUsMzcgQEAKIGVycl9vdXRfcmVnaW9uOgogCXJlbGVhc2VfcmVnaW9uKGJhc2UsIHRlc3RfYml0KFdEVFNfVVNFX0dQLCAmd2R0X3N0YXR1cykgPyAxIDogOCk7CiAJaWYgKCF0ZXN0X2JpdChXRFRTX1VTRV9HUCwgJndkdF9zdGF0dXMpKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZzcGlubG9jaywgZmxhZ3MpOwotCQlzdXBlcmlvX2VudGVyKCk7CiAJCXN1cGVyaW9fc2VsZWN0KENJUik7CiAJCXN1cGVyaW9fb3V0YihjaXJhY3QsIEFDVFJFRyk7Ci0JCXN1cGVyaW9fZXhpdCgpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGlubG9jaywgZmxhZ3MpOwogCX0KIGVycl9vdXQ6CiAJaWYgKHRyeV9nYW1lcG9ydCkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3BpbmxvY2ssIGZsYWdzKTsKLQkJc3VwZXJpb19lbnRlcigpOwogCQlzdXBlcmlvX3NlbGVjdChHQU1FUE9SVCk7CiAJCXN1cGVyaW9fb3V0YihncGFjdCwgQUNUUkVHKTsKLQkJc3VwZXJpb19leGl0KCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNwaW5sb2NrLCBmbGFncyk7CiAJfQogCisJc3VwZXJpb19leGl0KCk7CiAJcmV0dXJuIHJjOwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXQ4N193ZHRfZXhpdCh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IG5vbG9jazsKLQotCW5vbG9jayA9ICFzcGluX3RyeWxvY2tfaXJxc2F2ZSgmc3BpbmxvY2ssIGZsYWdzKTsKLQlzdXBlcmlvX2VudGVyKCk7Ci0Jc3VwZXJpb19zZWxlY3QoR1BJTyk7Ci0Jc3VwZXJpb19vdXRiKDB4MDAsIFdEVENUUkwpOwotCXN1cGVyaW9fb3V0YigweDAwLCBXRFRDRkcpOwotCXN1cGVyaW9fb3V0YigweDAwLCBXRFRWQUxMU0IpOwotCWlmIChtYXhfdW5pdHMgPiAyNTUpCi0JCXN1cGVyaW9fb3V0YigweDAwLCBXRFRWQUxNU0IpOwotCWlmICh0ZXN0X2JpdChXRFRTX1VTRV9HUCwgJndkdF9zdGF0dXMpKSB7Ci0JCXN1cGVyaW9fc2VsZWN0KEdBTUVQT1JUKTsKLQkJc3VwZXJpb19vdXRiKGdwYWN0LCBBQ1RSRUcpOwotCX0gZWxzZSB7Ci0JCXN1cGVyaW9fc2VsZWN0KENJUik7Ci0JCXN1cGVyaW9fb3V0YihjaXJhY3QsIEFDVFJFRyk7CisJaWYgKHN1cGVyaW9fZW50ZXIoKSA9PSAwKSB7CisJCXN1cGVyaW9fc2VsZWN0KEdQSU8pOworCQlzdXBlcmlvX291dGIoMHgwMCwgV0RUQ1RSTCk7CisJCXN1cGVyaW9fb3V0YigweDAwLCBXRFRDRkcpOworCQlzdXBlcmlvX291dGIoMHgwMCwgV0RUVkFMTFNCKTsKKwkJaWYgKG1heF91bml0cyA+IDI1NSkKKwkJCXN1cGVyaW9fb3V0YigweDAwLCBXRFRWQUxNU0IpOworCQlpZiAodGVzdF9iaXQoV0RUU19VU0VfR1AsICZ3ZHRfc3RhdHVzKSkgeworCQkJc3VwZXJpb19zZWxlY3QoR0FNRVBPUlQpOworCQkJc3VwZXJpb19vdXRiKGdwYWN0LCBBQ1RSRUcpOworCQl9IGVsc2UgeworCQkJc3VwZXJpb19zZWxlY3QoQ0lSKTsKKwkJCXN1cGVyaW9fb3V0YihjaXJhY3QsIEFDVFJFRyk7CisJCX0KKwkJc3VwZXJpb19leGl0KCk7CiAJfQotCXN1cGVyaW9fZXhpdCgpOwotCWlmICghbm9sb2NrKQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzcGlubG9jaywgZmxhZ3MpOwogCiAJbWlzY19kZXJlZ2lzdGVyKCZ3ZHRfbWlzY2Rldik7CiAJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJndkdF9ub3RpZmllcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL21wY29yZV93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvbXBjb3JlX3dkdC5jCmluZGV4IDJiNGFmMjIuLjRkYzMxMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvbXBjb3JlX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvbXBjb3JlX3dkdC5jCkBAIC00MDcsMTIgKzQwNywzNSBAQAogCXJldHVybiAwOwogfQogCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IG1wY29yZV93ZHRfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBtc2cpCit7CisJc3RydWN0IG1wY29yZV93ZHQgKndkdCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisJbXBjb3JlX3dkdF9zdG9wKHdkdCk7CQkvKiBUdXJuIHRoZSBXRFQgb2ZmICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbXBjb3JlX3dkdF9yZXN1bWUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQoreworCXN0cnVjdCBtcGNvcmVfd2R0ICp3ZHQgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShkZXYpOworCS8qIHJlLWFjdGl2YXRlIHRpbWVyICovCisJaWYgKHRlc3RfYml0KDAsICZ3ZHQtPnRpbWVyX2FsaXZlKSkKKwkJbXBjb3JlX3dkdF9zdGFydCh3ZHQpOworCXJldHVybiAwOworfQorI2Vsc2UKKyNkZWZpbmUgbXBjb3JlX3dkdF9zdXNwZW5kCU5VTEwKKyNkZWZpbmUgbXBjb3JlX3dkdF9yZXN1bWUJTlVMTAorI2VuZGlmCisKIC8qIHdvcmsgd2l0aCBob3RwbHVnIGFuZCBjb2xkcGx1ZyAqLwogTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTptcGNvcmVfd2R0Iik7CiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIG1wY29yZV93ZHRfZHJpdmVyID0gewogCS5wcm9iZQkJPSBtcGNvcmVfd2R0X3Byb2JlLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3AobXBjb3JlX3dkdF9yZW1vdmUpLAorCS5zdXNwZW5kCT0gbXBjb3JlX3dkdF9zdXNwZW5kLAorCS5yZXN1bWUJCT0gbXBjb3JlX3dkdF9yZXN1bWUsCiAJLnNodXRkb3duCT0gbXBjb3JlX3dkdF9zaHV0ZG93biwKIAkuZHJpdmVyCQk9IHsKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL210eC0xX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9tdHgtMV93ZHQuYwppbmRleCAwNDMwZTA5Li5hYzM3YmI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL210eC0xX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvbXR4LTFfd2R0LmMKQEAgLTIyNSwxMSArMjI1LDExIEBACiAKIAlyZXQgPSBtaXNjX3JlZ2lzdGVyKCZtdHgxX3dkdF9taXNjKTsKIAlpZiAocmV0IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIiBtdHgtMV93ZHQgOiBmYWlsZWQgdG8gcmVnaXN0ZXJcbiIpOworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXJcbiIpOwogCQlyZXR1cm4gcmV0OwogCX0KIAltdHgxX3dkdF9zdGFydCgpOwotCXByaW50ayhLRVJOX0lORk8gIk1UWC0xIFdhdGNoZG9nIGRyaXZlclxuIik7CisJZGV2X2luZm8oJnBkZXYtPmRldiwgIk1UWC0xIFdhdGNoZG9nIGRyaXZlclxuIik7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvbnZfdGNvLmMgYi9kcml2ZXJzL3dhdGNoZG9nL252X3Rjby5jCmluZGV4IGFmYTc4YTUuLjgwOWY0MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvbnZfdGNvLmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9udl90Y28uYwpAQCAtNDU4LDcgKzQ1OCwxNSBAQAogCiBzdGF0aWMgdm9pZCBudl90Y29fc2h1dGRvd24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2KQogeworCXUzMiB2YWw7CisKIAl0Y29fdGltZXJfc3RvcCgpOworCisJLyogU29tZSBCSU9TZXMgZmFpbCB0aGUgUE9TVCAob25jZSkgaWYgdGhlIE5PX1JFQk9PVCBmbGFnIGlzIG5vdAorCSAqIHVuc2V0IGR1cmluZyBzaHV0ZG93bi4gKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQodGNvX3BjaSwgTUNQNTFfU01CVVNfU0VUVVBfQiwgJnZhbCk7CisJdmFsICY9IH5NQ1A1MV9TTUJVU19TRVRVUF9CX1RDT19SRUJPT1Q7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZCh0Y29fcGNpLCBNQ1A1MV9TTUJVU19TRVRVUF9CLCB2YWwpOwogfQogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBudl90Y29fZHJpdmVyID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9vZl94aWxpbnhfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL29mX3hpbGlueF93ZHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWM3NDFhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy93YXRjaGRvZy9vZl94aWxpbnhfd2R0LmMKQEAgLTAsMCArMSw0MzMgQEAKKy8qCisqICAgb2ZfeGlsaW54X3dkdC5jICAxLjAxICBBIFdhdGNoZG9nIERldmljZSBEcml2ZXIgZm9yIFhpbGlueCB4cHNfdGltZWJhc2Vfd2R0CisqCisqICAgKEMpIENvcHlyaWdodCAyMDExIChBbGVqYW5kcm8gQ2FicmVyYSA8YWxkYXlhQGdtYWlsLmNvbT4pCisqCisqICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqCisqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKiAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqICAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisqICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoJMzAtTWF5LTIwMTEgQWxlamFuZHJvIENhYnJlcmEgPGFsZGF5YUBnbWFpbC5jb20+CisqCQktIElmICJ4bG54LHdkdC1lbmFibGUtb25jZSIgd2Fzbid0IGZvdW5kIG9uIGRldmljZSB0cmVlIHRoZQorKgkJICBtb2R1bGUgd2lsbCB1c2UgQ09ORklHX1dBVENIRE9HX05PV0FZT1VUCisqCQktIElmIHRoZSBkZXZpY2UgdHJlZSBwYXJhbWV0ZXJzICgiY2xvY2stZnJlcXVlbmN5IiBhbmQKKyoJCSAgInhsbngsd2R0LWludGVydmFsIikgd2Fzbid0IGZvdW5kIHRoZSBkcml2ZXIgd29uJ3QKKyoJCSAga25vdyB0aGUgd2R0IHJlc2V0IGludGVydmFsCisqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKworLyogUmVnaXN0ZXIgb2Zmc2V0cyBmb3IgdGhlIFdkdCBkZXZpY2UgKi8KKyNkZWZpbmUgWFdUX1RXQ1NSMF9PRkZTRVQgICAweDAgLyogQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIwICovCisjZGVmaW5lIFhXVF9UV0NTUjFfT0ZGU0VUICAgMHg0IC8qIENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyMSAqLworI2RlZmluZSBYV1RfVEJSX09GRlNFVCAgICAgIDB4OCAvKiBUaW1lYmFzZSBSZWdpc3RlciBPZmZzZXQgKi8KKworLyogQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXIgTWFza3MgICovCisjZGVmaW5lIFhXVF9DU1IwX1dSU19NQVNLICAgMHgwMDAwMDAwOCAvKiBSZXNldCBzdGF0dXMgKi8KKyNkZWZpbmUgWFdUX0NTUjBfV0RTX01BU0sgICAweDAwMDAwMDA0IC8qIFRpbWVyIHN0YXRlICAqLworI2RlZmluZSBYV1RfQ1NSMF9FV0RUMV9NQVNLIDB4MDAwMDAwMDIgLyogRW5hYmxlIGJpdCAxICovCisKKy8qIENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyIDAvMSBiaXRzICAqLworI2RlZmluZSBYV1RfQ1NSWF9FV0RUMl9NQVNLIDB4MDAwMDAwMDEgLyogRW5hYmxlIGJpdCAyICovCisKKy8qIFNlbGZUZXN0IGNvbnN0YW50cyAqLworI2RlZmluZSBYV1RfTUFYX1NFTEZURVNUX0xPT1BfQ09VTlQgMHgwMDAxMDAwMAorI2RlZmluZSBYV1RfVElNRVJfRkFJTEVEICAgICAgICAgICAgMHhGRkZGRkZGRgorCisjZGVmaW5lIFdBVENIRE9HX05BTUUgICAgICJYaWxpbnggV2F0Y2hkb2ciCisjZGVmaW5lIFBGWCBXQVRDSERPR19OQU1FICI6ICIKKworc3RydWN0IHh3ZHRfZGV2aWNlIHsKKwlzdHJ1Y3QgcmVzb3VyY2UgIHJlczsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJdTMyIG5vd2F5b3V0OworCXUzMiB3ZHRfaW50ZXJ2YWw7CisJdTMyIGJvb3Rfc3RhdHVzOworfTsKKworc3RhdGljIHN0cnVjdCB4d2R0X2RldmljZSB4ZGV2OworCitzdGF0aWMgIHUzMiB0aW1lb3V0Oworc3RhdGljICB1MzIgY29udHJvbF9zdGF0dXNfcmVnOworc3RhdGljICB1OCAgZXhwZWN0X2Nsb3NlOworc3RhdGljICB1OCAgbm9fdGltZW91dDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRyaXZlcl9vcGVuOworCitzdGF0aWMgIERFRklORV9TUElOTE9DSyhzcGlubG9jayk7CisKK3N0YXRpYyB2b2lkIHh3ZHRfc3RhcnQodm9pZCkKK3sKKwlzcGluX2xvY2soJnNwaW5sb2NrKTsKKworCS8qIENsZWFuIHByZXZpb3VzIHN0YXR1cyBhbmQgZW5hYmxlIHRoZSB3YXRjaGRvZyB0aW1lciAqLworCWNvbnRyb2xfc3RhdHVzX3JlZyA9IGlvcmVhZDMyKHhkZXYuYmFzZSArIFhXVF9UV0NTUjBfT0ZGU0VUKTsKKwljb250cm9sX3N0YXR1c19yZWcgfD0gKFhXVF9DU1IwX1dSU19NQVNLIHwgWFdUX0NTUjBfV0RTX01BU0spOworCisJaW93cml0ZTMyKChjb250cm9sX3N0YXR1c19yZWcgfCBYV1RfQ1NSMF9FV0RUMV9NQVNLKSwKKwkJCQl4ZGV2LmJhc2UgKyBYV1RfVFdDU1IwX09GRlNFVCk7CisKKwlpb3dyaXRlMzIoWFdUX0NTUlhfRVdEVDJfTUFTSywgeGRldi5iYXNlICsgWFdUX1RXQ1NSMV9PRkZTRVQpOworCisJc3Bpbl91bmxvY2soJnNwaW5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgeHdkdF9zdG9wKHZvaWQpCit7CisJc3Bpbl9sb2NrKCZzcGlubG9jayk7CisKKwljb250cm9sX3N0YXR1c19yZWcgPSBpb3JlYWQzMih4ZGV2LmJhc2UgKyBYV1RfVFdDU1IwX09GRlNFVCk7CisKKwlpb3dyaXRlMzIoKGNvbnRyb2xfc3RhdHVzX3JlZyAmIH5YV1RfQ1NSMF9FV0RUMV9NQVNLKSwKKwkJCQl4ZGV2LmJhc2UgKyBYV1RfVFdDU1IwX09GRlNFVCk7CisKKwlpb3dyaXRlMzIoMCwgeGRldi5iYXNlICsgWFdUX1RXQ1NSMV9PRkZTRVQpOworCisJc3Bpbl91bmxvY2soJnNwaW5sb2NrKTsKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiU3RvcHBlZCFcbiIpOworfQorCitzdGF0aWMgdm9pZCB4d2R0X2tlZXBhbGl2ZSh2b2lkKQoreworCXNwaW5fbG9jaygmc3BpbmxvY2spOworCisJY29udHJvbF9zdGF0dXNfcmVnID0gaW9yZWFkMzIoeGRldi5iYXNlICsgWFdUX1RXQ1NSMF9PRkZTRVQpOworCWNvbnRyb2xfc3RhdHVzX3JlZyB8PSAoWFdUX0NTUjBfV1JTX01BU0sgfCBYV1RfQ1NSMF9XRFNfTUFTSyk7CisJaW93cml0ZTMyKGNvbnRyb2xfc3RhdHVzX3JlZywgeGRldi5iYXNlICsgWFdUX1RXQ1NSMF9PRkZTRVQpOworCisJc3Bpbl91bmxvY2soJnNwaW5sb2NrKTsKK30KKworc3RhdGljIHZvaWQgeHdkdF9nZXRfc3RhdHVzKGludCAqc3RhdHVzKQoreworCWludCBuZXdfc3RhdHVzOworCisJc3Bpbl9sb2NrKCZzcGlubG9jayk7CisKKwljb250cm9sX3N0YXR1c19yZWcgPSBpb3JlYWQzMih4ZGV2LmJhc2UgKyBYV1RfVFdDU1IwX09GRlNFVCk7CisJbmV3X3N0YXR1cyA9ICgoY29udHJvbF9zdGF0dXNfcmVnICYKKwkJCShYV1RfQ1NSMF9XUlNfTUFTSyB8IFhXVF9DU1IwX1dEU19NQVNLKSkgIT0gMCk7CisJc3Bpbl91bmxvY2soJnNwaW5sb2NrKTsKKworCSpzdGF0dXMgPSAwOworCWlmIChuZXdfc3RhdHVzICYgMSkKKwkJKnN0YXR1cyB8PSBXRElPRl9DQVJEUkVTRVQ7Cit9CisKK3N0YXRpYyB1MzIgeHdkdF9zZWxmdGVzdCh2b2lkKQoreworCWludCBpOworCXUzMiB0aW1lcl92YWx1ZTE7CisJdTMyIHRpbWVyX3ZhbHVlMjsKKworCXNwaW5fbG9jaygmc3BpbmxvY2spOworCisJdGltZXJfdmFsdWUxID0gaW9yZWFkMzIoeGRldi5iYXNlICsgWFdUX1RCUl9PRkZTRVQpOworCXRpbWVyX3ZhbHVlMiA9IGlvcmVhZDMyKHhkZXYuYmFzZSArIFhXVF9UQlJfT0ZGU0VUKTsKKworCWZvciAoaSA9IDA7CisJCSgoaSA8PSBYV1RfTUFYX1NFTEZURVNUX0xPT1BfQ09VTlQpICYmCisJCQkodGltZXJfdmFsdWUyID09IHRpbWVyX3ZhbHVlMSkpOyBpKyspIHsKKwkJdGltZXJfdmFsdWUyID0gaW9yZWFkMzIoeGRldi5iYXNlICsgWFdUX1RCUl9PRkZTRVQpOworCX0KKworCXNwaW5fdW5sb2NrKCZzcGlubG9jayk7CisKKwlpZiAodGltZXJfdmFsdWUyICE9IHRpbWVyX3ZhbHVlMSkKKwkJcmV0dXJuIH5YV1RfVElNRVJfRkFJTEVEOworCWVsc2UKKwkJcmV0dXJuIFhXVF9USU1FUl9GQUlMRUQ7Cit9CisKK3N0YXRpYyBpbnQgeHdkdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qIE9ubHkgb25lIHByb2Nlc3MgY2FuIGhhbmRsZSB0aGUgd2R0IGF0IGEgdGltZSAqLworCWlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICZkcml2ZXJfb3BlbikpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBNYWtlIHN1cmUgdGhhdCB0aGUgbW9kdWxlIGFyZSBhbHdheXMgbG9hZGVkLi4uKi8KKwlpZiAoeGRldi5ub3dheW91dCkKKwkJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKKworCXh3ZHRfc3RhcnQoKTsKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiU3RhcnRlZC4uLlxuIik7CisKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgeHdkdF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChleHBlY3RfY2xvc2UgPT0gNDIpIHsKKwkJeHdkdF9zdG9wKCk7CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fQ1JJVCBQRlgKKwkJCSJVbmV4cGVjdGVkIGNsb3NlLCBub3Qgc3RvcHBpbmcgd2F0Y2hkb2chXG4iKTsKKwkJeHdkdF9rZWVwYWxpdmUoKTsKKwl9CisKKwljbGVhcl9iaXQoMCwgJmRyaXZlcl9vcGVuKTsKKwlleHBlY3RfY2xvc2UgPSAwOworCXJldHVybiAwOworfQorCisvKgorICogICAgICB4d2R0X3dyaXRlOgorICogICAgICBAZmlsZTogZmlsZSBoYW5kbGUgdG8gdGhlIHdhdGNoZG9nCisgKiAgICAgIEBidWY6IGJ1ZmZlciB0byB3cml0ZSAodW51c2VkIGFzIGRhdGEgZG9lcyBub3QgbWF0dGVyIGhlcmUKKyAqICAgICAgQGNvdW50OiBjb3VudCBvZiBieXRlcworICogICAgICBAcHBvczogcG9pbnRlciB0byB0aGUgcG9zaXRpb24gdG8gd3JpdGUuIE5vIHNlZWtzIGFsbG93ZWQKKyAqCisgKiAgICAgIEEgd3JpdGUgdG8gYSB3YXRjaGRvZyBkZXZpY2UgaXMgZGVmaW5lZCBhcyBhIGtlZXBhbGl2ZSBzaWduYWwuIEFueQorICogICAgICB3cml0ZSBvZiBkYXRhIHdpbGwgZG8sIGFzIHdlIGRvbid0IGRlZmluZSBjb250ZW50IG1lYW5pbmcuCisgKi8KK3N0YXRpYyBzc2l6ZV90IHh3ZHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkJCQlzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJaWYgKGxlbikgeworCQlpZiAoIXhkZXYubm93YXlvdXQpIHsKKwkJCXNpemVfdCBpOworCisJCQkvKiBJbiBjYXNlIGl0IHdhcyBzZXQgbG9uZyBhZ28gKi8KKwkJCWV4cGVjdF9jbG9zZSA9IDA7CisKKwkJCWZvciAoaSA9IDA7IGkgIT0gbGVuOyBpKyspIHsKKwkJCQljaGFyIGM7CisKKwkJCQlpZiAoZ2V0X3VzZXIoYywgYnVmICsgaSkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWlmIChjID09ICdWJykKKwkJCQkJZXhwZWN0X2Nsb3NlID0gNDI7CisJCQl9CisJCX0KKwkJeHdkdF9rZWVwYWxpdmUoKTsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB3YXRjaGRvZ19pbmZvIGlkZW50ID0geworCS5vcHRpb25zID0gIFdESU9GX01BR0lDQ0xPU0UgfAorCQkgICAgV0RJT0ZfS0VFUEFMSVZFUElORywKKwkuZmlybXdhcmVfdmVyc2lvbiA9CTEsCisJLmlkZW50aXR5ID0JV0FUQ0hET0dfTkFNRSwKK307CisKKy8qCisgKiAgICAgIHh3ZHRfaW9jdGw6CisgKiAgICAgIEBmaWxlOiBmaWxlIGhhbmRsZSB0byB0aGUgZGV2aWNlCisgKiAgICAgIEBjbWQ6IHdhdGNoZG9nIGNvbW1hbmQKKyAqICAgICAgQGFyZzogYXJndW1lbnQgcG9pbnRlcgorICoKKyAqICAgICAgVGhlIHdhdGNoZG9nIEFQSSBkZWZpbmVzIGEgY29tbW9uIHNldCBvZiBmdW5jdGlvbnMgZm9yIGFsbCB3YXRjaGRvZ3MKKyAqICAgICAgYWNjb3JkaW5nIHRvIHRoZWlyIGF2YWlsYWJsZSBmZWF0dXJlcy4KKyAqLworc3RhdGljIGxvbmcgeHdkdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHN0YXR1czsKKworCXVuaW9uIHsKKwkJc3RydWN0IHdhdGNoZG9nX2luZm8gX191c2VyICppZGVudDsKKwkJaW50IF9fdXNlciAqaTsKKwl9IHVhcmc7CisKKwl1YXJnLmkgPSAoaW50IF9fdXNlciAqKWFyZzsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQlyZXR1cm4gY29weV90b191c2VyKHVhcmcuaWRlbnQsICZpZGVudCwKKwkJCQkJc2l6ZW9mKGlkZW50KSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgV0RJT0NfR0VUQk9PVFNUQVRVUzoKKwkJcmV0dXJuIHB1dF91c2VyKHhkZXYuYm9vdF9zdGF0dXMsIHVhcmcuaSk7CisKKwljYXNlIFdESU9DX0dFVFNUQVRVUzoKKwkJeHdkdF9nZXRfc3RhdHVzKCZzdGF0dXMpOworCQlyZXR1cm4gcHV0X3VzZXIoc3RhdHVzLCB1YXJnLmkpOworCisJY2FzZSBXRElPQ19LRUVQQUxJVkU6CisJCXh3ZHRfa2VlcGFsaXZlKCk7CisJCXJldHVybiAwOworCisJY2FzZSBXRElPQ19HRVRUSU1FT1VUOgorCQlpZiAobm9fdGltZW91dCkKKwkJCXJldHVybiAtRU5PVFRZOworCQllbHNlCisJCQlyZXR1cm4gcHV0X3VzZXIodGltZW91dCwgdWFyZy5pKTsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PVFRZOworCX0KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgeHdkdF9mb3BzID0geworCS5vd25lciAgICAgID0gVEhJU19NT0RVTEUsCisJLmxsc2VlayAgICAgPSBub19sbHNlZWssCisJLndyaXRlICAgICAgPSB4d2R0X3dyaXRlLAorCS5vcGVuICAgICAgID0geHdkdF9vcGVuLAorCS5yZWxlYXNlICAgID0geHdkdF9yZWxlYXNlLAorCS51bmxvY2tlZF9pb2N0bCA9IHh3ZHRfaW9jdGwsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgeHdkdF9taXNjZGV2ID0geworCS5taW5vciAgICAgID0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUgICAgICAgPSAid2F0Y2hkb2ciLAorCS5mb3BzICAgICAgID0gJnh3ZHRfZm9wcywKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHh3ZHRfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlpbnQgcmM7CisJdTMyICp0bXB0cjsKKwl1MzIgKnBmcmVxOworCisJbm9fdGltZW91dCA9IDA7CisKKwlwZnJlcSA9ICh1MzIgKilvZl9nZXRfcHJvcGVydHkocGRldi0+ZGV2Lm9mX25vZGUtPnBhcmVudCwKKwkJCQkJImNsb2NrLWZyZXF1ZW5jeSIsIE5VTEwpOworCisJaWYgKHBmcmVxID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlgKKwkJCSJUaGUgd2F0Y2hkb2cgY2xvY2sgZnJlcXVlbmN5IGNhbm5vdCBiZSBvYnRhaW5lZCFcbiIpOworCQlub190aW1lb3V0ID0gMTsKKwl9CisKKwlyYyA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UocGRldi0+ZGV2Lm9mX25vZGUsIDAsICZ4ZGV2LnJlcyk7CisJaWYgKHJjKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJpbnZhbGlkIGFkZHJlc3MhXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXRtcHRyID0gKHUzMiAqKW9mX2dldF9wcm9wZXJ0eShwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJInhsbngsd2R0LWludGVydmFsIiwgTlVMTCk7CisJaWYgKHRtcHRyID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIlBhcmFtZXRlciBcInhsbngsd2R0LWludGVydmFsXCIiCisJCQkJCSIgbm90IGZvdW5kIGluIGRldmljZSB0cmVlIVxuIik7CisJCW5vX3RpbWVvdXQgPSAxOworCX0gZWxzZSB7CisJCXhkZXYud2R0X2ludGVydmFsID0gKnRtcHRyOworCX0KKworCXRtcHRyID0gKHUzMiAqKW9mX2dldF9wcm9wZXJ0eShwZGV2LT5kZXYub2Zfbm9kZSwKKwkJCQkJInhsbngsd2R0LWVuYWJsZS1vbmNlIiwgTlVMTCk7CisJaWYgKHRtcHRyID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIlBhcmFtZXRlciBcInhsbngsd2R0LWVuYWJsZS1vbmNlXCIiCisJCQkJCSIgbm90IGZvdW5kIGluIGRldmljZSB0cmVlIVxuIik7CisJCXhkZXYubm93YXlvdXQgPSBXQVRDSERPR19OT1dBWU9VVDsKKwl9CisKKy8qCisgKiAgVHdpY2Ugb2YgdGhlIDJed2R0X2ludGVydmFsIC8gZnJlcSAgYmVjYXVzZSB0aGUgZmlyc3Qgd2R0IG92ZXJmbG93IGlzCisgKiAgaWdub3JlZCAoaW50ZXJydXB0KSwgcmVzZXQgaXMgb25seSBnZW5lcmF0ZWQgYXQgc2Vjb25kIHdkdCBvdmVyZmxvdworICovCisJaWYgKCFub190aW1lb3V0KQorCQl0aW1lb3V0ID0gMiAqICgoMTw8eGRldi53ZHRfaW50ZXJ2YWwpIC8gKnBmcmVxKTsKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHhkZXYucmVzLnN0YXJ0LAorCQkJeGRldi5yZXMuZW5kIC0geGRldi5yZXMuc3RhcnQgKyAxLCBXQVRDSERPR19OQU1FKSkgeworCQlyYyA9IC1FTlhJTzsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibWVtb3J5IHJlcXVlc3QgZmFpbHVyZSFcbiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJeGRldi5iYXNlID0gaW9yZW1hcCh4ZGV2LnJlcy5zdGFydCwgeGRldi5yZXMuZW5kIC0geGRldi5yZXMuc3RhcnQgKyAxKTsKKwlpZiAoeGRldi5iYXNlID09IE5VTEwpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlwcmludGsoS0VSTl9FUlIgUEZYICJpb3JlbWFwIGZhaWx1cmUhXG4iKTsKKwkJZ290byByZWxlYXNlX21lbTsKKwl9CisKKwlyYyA9IHh3ZHRfc2VsZnRlc3QoKTsKKwlpZiAocmMgPT0gWFdUX1RJTUVSX0ZBSUxFRCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJTZWxmVGVzdCByb3V0aW5lIGVycm9yIVxuIik7CisJCWdvdG8gdW5tYXBfaW87CisJfQorCisJeHdkdF9nZXRfc3RhdHVzKCZ4ZGV2LmJvb3Rfc3RhdHVzKTsKKworCXJjID0gbWlzY19yZWdpc3RlcigmeHdkdF9taXNjZGV2KTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWAorCQkJImNhbm5vdCByZWdpc3RlciBtaXNjZGV2IG9uIG1pbm9yPSVkIChlcnI9JWQpXG4iLAorCQkJCQkJeHdkdF9taXNjZGV2Lm1pbm9yLCByYyk7CisJCWdvdG8gdW5tYXBfaW87CisJfQorCisJaWYgKG5vX3RpbWVvdXQpCisJCXByaW50ayhLRVJOX0lORk8gUEZYCisJCQkiZHJpdmVyIGxvYWRlZCAodGltZW91dD0/IHNlYywgbm93YXlvdXQ9JWQpXG4iLAorCQkJCQkJICAgIHhkZXYubm93YXlvdXQpOworCWVsc2UKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlgKKwkJCSJkcml2ZXIgbG9hZGVkICh0aW1lb3V0PSVkIHNlYywgbm93YXlvdXQ9JWQpXG4iLAorCQkJCQl0aW1lb3V0LCB4ZGV2Lm5vd2F5b3V0KTsKKworCWV4cGVjdF9jbG9zZSA9IDA7CisJY2xlYXJfYml0KDAsICZkcml2ZXJfb3Blbik7CisKKwlyZXR1cm4gMDsKKwordW5tYXBfaW86CisJaW91bm1hcCh4ZGV2LmJhc2UpOworcmVsZWFzZV9tZW06CisJcmVsZWFzZV9tZW1fcmVnaW9uKHhkZXYucmVzLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZ4ZGV2LnJlcykpOworZXJyX291dDoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZleGl0IHh3ZHRfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJnh3ZHRfbWlzY2Rldik7CisJaW91bm1hcCh4ZGV2LmJhc2UpOworCXJlbGVhc2VfbWVtX3JlZ2lvbih4ZGV2LnJlcy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmeGRldi5yZXMpKTsKKworCXJldHVybiAwOworfQorCisvKiBNYXRjaCB0YWJsZSBmb3Igb2ZfcGxhdGZvcm0gYmluZGluZyAqLworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgX19kZXZpbml0ZGF0YSB4d2R0X29mX21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJ4bG54LHhwcy10aW1lYmFzZS13ZHQtMS4wMS5hIiwgfSwKKwl7fSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCB4d2R0X29mX21hdGNoKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgeHdkdF9kcml2ZXIgPSB7CisJLnByb2JlICAgICAgID0geHdkdF9wcm9iZSwKKwkucmVtb3ZlICAgICAgPSBfX2RldmV4aXRfcCh4d2R0X3JlbW92ZSksCisJLmRyaXZlciA9IHsKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCisJCS5uYW1lICA9IFdBVENIRE9HX05BTUUsCisJCS5vZl9tYXRjaF90YWJsZSA9IHh3ZHRfb2ZfbWF0Y2gsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHh3ZHRfaW5pdCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnh3ZHRfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHh3ZHRfZXhpdCh2b2lkKQoreworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ4d2R0X2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHh3ZHRfaW5pdCk7Cittb2R1bGVfZXhpdCh4d2R0X2V4aXQpOworCitNT0RVTEVfQVVUSE9SKCJBbGVqYW5kcm8gQ2FicmVyYSA8YWxkYXlhQGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiWGlsaW54IFdhdGNoZG9nIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX01JU0NERVYoV0FUQ0hET0dfTUlOT1IpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9wYzg3NDEzX3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9wYzg3NDEzX3dkdC5jCmluZGV4IGI3YzEzOTAuLmU3OGQ4OTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvcGM4NzQxM193ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3BjODc0MTNfd2R0LmMKQEAgLTU2LDYgKzU2LDcgQEAKICNkZWZpbmUgSU9fREVGQVVMVAkweDJFCQkvKiBBZGRyZXNzIHVzZWQgb24gUG9ydHdlbGwgQm9hcmRzICovCiAKIHN0YXRpYyBpbnQgaW8gPSBJT19ERUZBVUxUOworc3RhdGljIGludCBzd2NfYmFzZV9hZGRyID0gLTE7CiAKIHN0YXRpYyBpbnQgdGltZW91dCA9IERFRkFVTFRfVElNRU9VVDsJLyogdGltZW91dCB2YWx1ZSAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgdGltZXJfZW5hYmxlZDsJLyogaXMgdGhlIHRpbWVyIGVuYWJsZWQ/ICovCkBAIC0xMTYsOSArMTE3LDggQEAKIAogLyogUmVhZCBTV0MgSS9PIGJhc2UgYWRkcmVzcyAqLwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBwYzg3NDEzX2dldF9zd2NfYmFzZSh2b2lkKQorc3RhdGljIHZvaWQgcGM4NzQxM19nZXRfc3djX2Jhc2VfYWRkcih2b2lkKQogewotCXVuc2lnbmVkIGludCAgc3djX2Jhc2VfYWRkciA9IDA7CiAJdW5zaWduZWQgY2hhciBhZGRyX2wsIGFkZHJfaCA9IDA7CiAKIAkvKiBTdGVwIDM6IFJlYWQgU1dDIEkvTyBCYXNlIEFkZHJlc3MgKi8KQEAgLTEzNiwxMiArMTM2LDExIEBACiAJCSJSZWFkIFNXQyBJL08gQmFzZSBBZGRyZXNzOiBsb3cgJWQsIGhpZ2ggJWQsIHJlcyAlZFxuIiwKIAkJCQkJCWFkZHJfbCwgYWRkcl9oLCBzd2NfYmFzZV9hZGRyKTsKICNlbmRpZgotCXJldHVybiBzd2NfYmFzZV9hZGRyOwogfQogCiAvKiBTZWxlY3QgQmFuayAzIG9mIFNXQyAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGM4NzQxM19zd2NfYmFuazModW5zaWduZWQgaW50IHN3Y19iYXNlX2FkZHIpCitzdGF0aWMgaW5saW5lIHZvaWQgcGM4NzQxM19zd2NfYmFuazModm9pZCkKIHsKIAkvKiBTdGVwIDQ6IFNlbGVjdCBCYW5rMyBvZiBTV0MgKi8KIAlvdXRiX3AoaW5iKHN3Y19iYXNlX2FkZHIgKyAweDBmKSB8IDB4MDMsIHN3Y19iYXNlX2FkZHIgKyAweDBmKTsKQEAgLTE1Miw4ICsxNTEsNyBAQAogCiAvKiBTZXQgd2F0Y2hkb2cgdGltZW91dCB0byB4IG1pbnV0ZXMgKi8KIAotc3RhdGljIGlubGluZSB2b2lkIHBjODc0MTNfcHJvZ3JhbW1fd2R0byh1bnNpZ25lZCBpbnQgc3djX2Jhc2VfYWRkciwKLQkJCQkJIGNoYXIgcGM4NzQxM190aW1lKQorc3RhdGljIGlubGluZSB2b2lkIHBjODc0MTNfcHJvZ3JhbW1fd2R0byhjaGFyIHBjODc0MTNfdGltZSkKIHsKIAkvKiBTdGVwIDU6IFByb2dyYW1tIFdEVE8sIFR3ZC4gKi8KIAlvdXRiX3AocGM4NzQxM190aW1lLCBzd2NfYmFzZV9hZGRyICsgV0RUTyk7CkBAIC0xNjQsNyArMTYyLDcgQEAKIAogLyogRW5hYmxlIFdERU4gKi8KIAotc3RhdGljIGlubGluZSB2b2lkIHBjODc0MTNfZW5hYmxlX3dkZW4odW5zaWduZWQgaW50IHN3Y19iYXNlX2FkZHIpCitzdGF0aWMgaW5saW5lIHZvaWQgcGM4NzQxM19lbmFibGVfd2Rlbih2b2lkKQogewogCS8qIFN0ZXAgNjogRW5hYmxlIFdERU4gKi8KIAlvdXRiX3AoaW5iKHN3Y19iYXNlX2FkZHIgKyBXRENUTCkgfCAweDAxLCBzd2NfYmFzZV9hZGRyICsgV0RDVEwpOwpAQCAtMTc0LDcgKzE3Miw3IEBACiB9CiAKIC8qIEVuYWJsZSBTV19XRF9UUkVOICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcGM4NzQxM19lbmFibGVfc3dfd2RfdHJlbih1bnNpZ25lZCBpbnQgc3djX2Jhc2VfYWRkcikKK3N0YXRpYyBpbmxpbmUgdm9pZCBwYzg3NDEzX2VuYWJsZV9zd193ZF90cmVuKHZvaWQpCiB7CiAJLyogRW5hYmxlIFNXX1dEX1RSRU4gKi8KIAlvdXRiX3AoaW5iKHN3Y19iYXNlX2FkZHIgKyBXRENGRykgfCAweDgwLCBzd2NfYmFzZV9hZGRyICsgV0RDRkcpOwpAQCAtMTg1LDcgKzE4Myw3IEBACiAKIC8qIERpc2FibGUgU1dfV0RfVFJFTiAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGM4NzQxM19kaXNhYmxlX3N3X3dkX3RyZW4odW5zaWduZWQgaW50IHN3Y19iYXNlX2FkZHIpCitzdGF0aWMgaW5saW5lIHZvaWQgcGM4NzQxM19kaXNhYmxlX3N3X3dkX3RyZW4odm9pZCkKIHsKIAkvKiBEaXNhYmxlIFNXX1dEX1RSRU4gKi8KIAlvdXRiX3AoaW5iKHN3Y19iYXNlX2FkZHIgKyBXRENGRykgJiAweDdmLCBzd2NfYmFzZV9hZGRyICsgV0RDRkcpOwpAQCAtMTk2LDcgKzE5NCw3IEBACiAKIC8qIEVuYWJsZSBTV19XRF9UUkcgKi8KIAotc3RhdGljIGlubGluZSB2b2lkIHBjODc0MTNfZW5hYmxlX3N3X3dkX3RyZyh1bnNpZ25lZCBpbnQgc3djX2Jhc2VfYWRkcikKK3N0YXRpYyBpbmxpbmUgdm9pZCBwYzg3NDEzX2VuYWJsZV9zd193ZF90cmcodm9pZCkKIHsKIAkvKiBFbmFibGUgU1dfV0RfVFJHICovCiAJb3V0Yl9wKGluYihzd2NfYmFzZV9hZGRyICsgV0RDVEwpIHwgMHg4MCwgc3djX2Jhc2VfYWRkciArIFdEQ1RMKTsKQEAgLTIwNyw3ICsyMDUsNyBAQAogCiAvKiBEaXNhYmxlIFNXX1dEX1RSRyAqLwogCi1zdGF0aWMgaW5saW5lIHZvaWQgcGM4NzQxM19kaXNhYmxlX3N3X3dkX3RyZyh1bnNpZ25lZCBpbnQgc3djX2Jhc2VfYWRkcikKK3N0YXRpYyBpbmxpbmUgdm9pZCBwYzg3NDEzX2Rpc2FibGVfc3dfd2RfdHJnKHZvaWQpCiB7CiAJLyogRGlzYWJsZSBTV19XRF9UUkcgKi8KIAlvdXRiX3AoaW5iKHN3Y19iYXNlX2FkZHIgKyBXRENUTCkgJiAweDdmLCBzd2NfYmFzZV9hZGRyICsgV0RDVEwpOwpAQCAtMjIyLDE4ICsyMjAsMTMgQEAKIAogc3RhdGljIHZvaWQgcGM4NzQxM19lbmFibGUodm9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgc3djX2Jhc2VfYWRkcjsKLQogCXNwaW5fbG9jaygmaW9fbG9jayk7CiAKLQlwYzg3NDEzX3NlbGVjdF93ZHRfb3V0KCk7Ci0JcGM4NzQxM19lbmFibGVfc3djKCk7Ci0Jc3djX2Jhc2VfYWRkciA9IHBjODc0MTNfZ2V0X3N3Y19iYXNlKCk7Ci0JcGM4NzQxM19zd2NfYmFuazMoc3djX2Jhc2VfYWRkcik7Ci0JcGM4NzQxM19wcm9ncmFtbV93ZHRvKHN3Y19iYXNlX2FkZHIsIHRpbWVvdXQpOwotCXBjODc0MTNfZW5hYmxlX3dkZW4oc3djX2Jhc2VfYWRkcik7Ci0JcGM4NzQxM19lbmFibGVfc3dfd2RfdHJlbihzd2NfYmFzZV9hZGRyKTsKLQlwYzg3NDEzX2VuYWJsZV9zd193ZF90cmcoc3djX2Jhc2VfYWRkcik7CisJcGM4NzQxM19zd2NfYmFuazMoKTsKKwlwYzg3NDEzX3Byb2dyYW1tX3dkdG8odGltZW91dCk7CisJcGM4NzQxM19lbmFibGVfd2RlbigpOworCXBjODc0MTNfZW5hYmxlX3N3X3dkX3RyZW4oKTsKKwlwYzg3NDEzX2VuYWJsZV9zd193ZF90cmcoKTsKIAogCXNwaW5fdW5sb2NrKCZpb19sb2NrKTsKIH0KQEAgLTI0MiwxNyArMjM1LDEyIEBACiAKIHN0YXRpYyB2b2lkIHBjODc0MTNfZGlzYWJsZSh2b2lkKQogewotCXVuc2lnbmVkIGludCBzd2NfYmFzZV9hZGRyOwotCiAJc3Bpbl9sb2NrKCZpb19sb2NrKTsKIAotCXBjODc0MTNfc2VsZWN0X3dkdF9vdXQoKTsKLQlwYzg3NDEzX2VuYWJsZV9zd2MoKTsKLQlzd2NfYmFzZV9hZGRyID0gcGM4NzQxM19nZXRfc3djX2Jhc2UoKTsKLQlwYzg3NDEzX3N3Y19iYW5rMyhzd2NfYmFzZV9hZGRyKTsKLQlwYzg3NDEzX2Rpc2FibGVfc3dfd2RfdHJlbihzd2NfYmFzZV9hZGRyKTsKLQlwYzg3NDEzX2Rpc2FibGVfc3dfd2RfdHJnKHN3Y19iYXNlX2FkZHIpOwotCXBjODc0MTNfcHJvZ3JhbW1fd2R0byhzd2NfYmFzZV9hZGRyLCAwKTsKKwlwYzg3NDEzX3N3Y19iYW5rMygpOworCXBjODc0MTNfZGlzYWJsZV9zd193ZF90cmVuKCk7CisJcGM4NzQxM19kaXNhYmxlX3N3X3dkX3RyZygpOworCXBjODc0MTNfcHJvZ3JhbW1fd2R0bygwKTsKIAogCXNwaW5fdW5sb2NrKCZpb19sb2NrKTsKIH0KQEAgLTI2MSwyMCArMjQ5LDE1IEBACiAKIHN0YXRpYyB2b2lkIHBjODc0MTNfcmVmcmVzaCh2b2lkKQogewotCXVuc2lnbmVkIGludCBzd2NfYmFzZV9hZGRyOwotCiAJc3Bpbl9sb2NrKCZpb19sb2NrKTsKIAotCXBjODc0MTNfc2VsZWN0X3dkdF9vdXQoKTsKLQlwYzg3NDEzX2VuYWJsZV9zd2MoKTsKLQlzd2NfYmFzZV9hZGRyID0gcGM4NzQxM19nZXRfc3djX2Jhc2UoKTsKLQlwYzg3NDEzX3N3Y19iYW5rMyhzd2NfYmFzZV9hZGRyKTsKLQlwYzg3NDEzX2Rpc2FibGVfc3dfd2RfdHJlbihzd2NfYmFzZV9hZGRyKTsKLQlwYzg3NDEzX2Rpc2FibGVfc3dfd2RfdHJnKHN3Y19iYXNlX2FkZHIpOwotCXBjODc0MTNfcHJvZ3JhbW1fd2R0byhzd2NfYmFzZV9hZGRyLCB0aW1lb3V0KTsKLQlwYzg3NDEzX2VuYWJsZV93ZGVuKHN3Y19iYXNlX2FkZHIpOwotCXBjODc0MTNfZW5hYmxlX3N3X3dkX3RyZW4oc3djX2Jhc2VfYWRkcik7Ci0JcGM4NzQxM19lbmFibGVfc3dfd2RfdHJnKHN3Y19iYXNlX2FkZHIpOworCXBjODc0MTNfc3djX2JhbmszKCk7CisJcGM4NzQxM19kaXNhYmxlX3N3X3dkX3RyZW4oKTsKKwlwYzg3NDEzX2Rpc2FibGVfc3dfd2RfdHJnKCk7CisJcGM4NzQxM19wcm9ncmFtbV93ZHRvKHRpbWVvdXQpOworCXBjODc0MTNfZW5hYmxlX3dkZW4oKTsKKwlwYzg3NDEzX2VuYWJsZV9zd193ZF90cmVuKCk7CisJcGM4NzQxM19lbmFibGVfc3dfd2RfdHJnKCk7CiAKIAlzcGluX3VubG9jaygmaW9fbG9jayk7CiB9CkBAIC01MjgsNyArNTExLDggQEAKIAlwcmludGsoS0VSTl9JTkZPIFBGWCAiVmVyc2lvbiAiIFZFUlNJT04gIiBhdCBpbyAweCVYXG4iLAogCQkJCQkJCVdEVF9JTkRFWF9JT19QT1JUKTsKIAotCS8qIHJlcXVlc3RfcmVnaW9uKGlvLCAyLCAicGM4NzQxMyIpOyAqLworCWlmICghcmVxdWVzdF9tdXhlZF9yZWdpb24oaW8sIDIsIE1PRE5BTUUpKQorCQlyZXR1cm4gLUVCVVNZOwogCiAJcmV0ID0gcmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZwYzg3NDEzX25vdGlmaWVyKTsKIAlpZiAocmV0ICE9IDApIHsKQEAgLTU0MSwxMiArNTI1LDMyIEBACiAJCXByaW50ayhLRVJOX0VSUiBQRlgKIAkJCSJjYW5ub3QgcmVnaXN0ZXIgbWlzY2RldiBvbiBtaW5vcj0lZCAoZXJyPSVkKVxuIiwKIAkJCVdBVENIRE9HX01JTk9SLCByZXQpOwotCQl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmcGM4NzQxM19ub3RpZmllcik7Ci0JCXJldHVybiByZXQ7CisJCWdvdG8gcmVib290X3VucmVnOwogCX0KIAlwcmludGsoS0VSTl9JTkZPIFBGWCAiaW5pdGlhbGl6ZWQuIHRpbWVvdXQ9JWQgbWluIFxuIiwgdGltZW91dCk7CisKKwlwYzg3NDEzX3NlbGVjdF93ZHRfb3V0KCk7CisJcGM4NzQxM19lbmFibGVfc3djKCk7CisJcGM4NzQxM19nZXRfc3djX2Jhc2VfYWRkcigpOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihzd2NfYmFzZV9hZGRyLCAweDIwLCBNT0ROQU1FKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYCisJCQkiY2Fubm90IHJlcXVlc3QgU1dDIHJlZ2lvbiBhdCAweCV4XG4iLCBzd2NfYmFzZV9hZGRyKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG1pc2NfdW5yZWc7CisJfQorCiAJcGM4NzQxM19lbmFibGUoKTsKKworCXJlbGVhc2VfcmVnaW9uKGlvLCAyKTsKIAlyZXR1cm4gMDsKKworbWlzY191bnJlZzoKKwltaXNjX2RlcmVnaXN0ZXIoJnBjODc0MTNfbWlzY2Rldik7CityZWJvb3RfdW5yZWc6CisJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnBjODc0MTNfbm90aWZpZXIpOworCXJlbGVhc2VfcmVnaW9uKGlvLCAyKTsKKwlyZXR1cm4gcmV0OwogfQogCiAvKioKQEAgLTU2OSw3ICs1NzMsNyBAQAogCiAJbWlzY19kZXJlZ2lzdGVyKCZwYzg3NDEzX21pc2NkZXYpOwogCXVucmVnaXN0ZXJfcmVib290X25vdGlmaWVyKCZwYzg3NDEzX25vdGlmaWVyKTsKLQkvKiByZWxlYXNlX3JlZ2lvbihpbywgMik7ICovCisJcmVsZWFzZV9yZWdpb24oc3djX2Jhc2VfYWRkciwgMHgyMCk7CiAKIAlwcmludGsoS0VSTl9JTkZPIE1PRE5BTUUgIiB3YXRjaGRvZyBjb21wb25lbnQgZHJpdmVyIHJlbW92ZWQuXG4iKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvczNjMjQxMF93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvczNjMjQxMF93ZHQuYwppbmRleCBmN2Y1YWEwLi4zMGRhODhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3MzYzI0MTBfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9zM2MyNDEwX3dkdC5jCkBAIC01ODksNiArNTg5LDE1IEBACiAjZGVmaW5lIHMzYzI0MTB3ZHRfcmVzdW1lICBOVUxMCiAjZW5kaWYgLyogQ09ORklHX1BNICovCiAKKyNpZmRlZiBDT05GSUdfT0YKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHMzYzI0MTBfd2R0X21hdGNoW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJzYW1zdW5nLHMzYzI0MTAtd2R0IiB9LAorCXt9LAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHMzYzI0MTBfd2R0X21hdGNoKTsKKyNlbHNlCisjZGVmaW5lIHMzYzI0MTBfd2R0X21hdGNoIE5VTEwKKyNlbmRpZgogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzM2MyNDEwd2R0X2RyaXZlciA9IHsKIAkucHJvYmUJCT0gczNjMjQxMHdkdF9wcm9iZSwKQEAgLTU5OSw2ICs2MDgsNyBAQAogCS5kcml2ZXIJCT0gewogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAkJLm5hbWUJPSAiczNjMjQxMC13ZHQiLAorCQkub2ZfbWF0Y2hfdGFibGUJPSBzM2MyNDEwX3dkdF9tYXRjaCwKIAl9LAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9zY2gzMTF4X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9zY2gzMTF4X3dkdC5jCmluZGV4IGM3Y2Y0YjAuLjAyOTQ2N2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvc2NoMzExeF93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3NjaDMxMXhfd2R0LmMKQEAgLTQ3MiwxNSArNDcyLDEwIEBACiAJc2NoMzExeF93ZHRfc3RvcCgpOwogfQogCi0jZGVmaW5lIHNjaDMxMXhfd2R0X3N1c3BlbmQgTlVMTAotI2RlZmluZSBzY2gzMTF4X3dkdF9yZXN1bWUgIE5VTEwKLQogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2NoMzExeF93ZHRfZHJpdmVyID0gewogCS5wcm9iZQkJPSBzY2gzMTF4X3dkdF9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNjaDMxMXhfd2R0X3JlbW92ZSksCiAJLnNodXRkb3duCT0gc2NoMzExeF93ZHRfc2h1dGRvd24sCi0JLnN1c3BlbmQJPSBzY2gzMTF4X3dkdF9zdXNwZW5kLAotCS5yZXN1bWUJCT0gc2NoMzExeF93ZHRfcmVzdW1lLAogCS5kcml2ZXIJCT0gewogCQkub3duZXIgPSBUSElTX01PRFVMRSwKIAkJLm5hbWUgPSBEUlZfTkFNRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvc2h3ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvc2h3ZHQuYwppbmRleCBkYjg0ZjIzLi5hMjY3ZGMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL3Nod2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9zaHdkdC5jCkBAIC02NCw3ICs2NCw3IEBACiAgKiBtaXNzZXMgaXRzIGRlYWRsaW5lLCB0aGUga2VybmVsIHRpbWVyIHdpbGwgYWxsb3cgdGhlIFdEVCB0byBvdmVyZmxvdy4KICAqLwogc3RhdGljIGludCBjbG9ja19kaXZpc2lvbl9yYXRpbyA9IFdUQ1NSX0NLU180MDk2OwotI2RlZmluZSBuZXh0X3BpbmdfcGVyaW9kKGNrcykJbXNlY3NfdG9famlmZmllcyhja3MgLSA0KQorI2RlZmluZSBuZXh0X3BpbmdfcGVyaW9kKGNrcykJKGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKGNrcyAtIDQpKQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHdhdGNoZG9nX2luZm8gc2hfd2R0X2luZm87CiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2hfd2R0X2RldjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvc3A4MDVfd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL3NwODA1X3dkdC5jCmluZGV4IDBkODBlMDguLmNjMmNmYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvd2F0Y2hkb2cvc3A4MDVfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9zcDgwNV93ZHQuYwpAQCAtMTM0LDYgKzEzNCw4IEBACiAJd3JpdGVsKElOVF9FTkFCTEUgfCBSRVNFVF9FTkFCTEUsIHdkdC0+YmFzZSArIFdEVENPTlRST0wpOwogCXdyaXRlbChMT0NLLCB3ZHQtPmJhc2UgKyBXRFRMT0NLKTsKIAorCS8qIEZsdXNoIHBvc3RlZCB3cml0ZXMuICovCisJcmVhZGwod2R0LT5iYXNlICsgV0RUTE9DSyk7CiAJc3Bpbl91bmxvY2soJndkdC0+bG9jayk7CiB9CiAKQEAgLTE0NCw5ICsxNDYsMTAgQEAKIAogCXdyaXRlbChVTkxPQ0ssIHdkdC0+YmFzZSArIFdEVExPQ0spOwogCXdyaXRlbCgwLCB3ZHQtPmJhc2UgKyBXRFRDT05UUk9MKTsKLQl3cml0ZWwoMCwgd2R0LT5iYXNlICsgV0RUTE9BRCk7CiAJd3JpdGVsKExPQ0ssIHdkdC0+YmFzZSArIFdEVExPQ0spOwogCisJLyogRmx1c2ggcG9zdGVkIHdyaXRlcy4gKi8KKwlyZWFkbCh3ZHQtPmJhc2UgKyBXRFRMT0NLKTsKIAlzcGluX3VubG9jaygmd2R0LT5sb2NrKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy93YXRjaGRvZ19jb3JlLmMgYi9kcml2ZXJzL3dhdGNoZG9nL3dhdGNoZG9nX2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmExYTE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy93YXRjaGRvZy93YXRjaGRvZ19jb3JlLmMKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKgl3YXRjaGRvZ19jb3JlLmMKKyAqCisgKgkoYykgQ29weXJpZ2h0IDIwMDgtMjAxMSBBbGFuIENveCA8YWxhbkBseG9yZ3VrLnVrdXUub3JnLnVrPiwKKyAqCQkJCQkJQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKgkoYykgQ29weXJpZ2h0IDIwMDgtMjAxMSBXaW0gVmFuIFNlYnJvZWNrIDx3aW1AaWd1YW5hLmJlPi4KKyAqCisgKglUaGlzIHNvdXJjZSBjb2RlIGlzIHBhcnQgb2YgdGhlIGdlbmVyaWMgY29kZSB0aGF0IGNhbiBiZSB1c2VkCisgKglieSBhbGwgdGhlIHdhdGNoZG9nIHRpbWVyIGRyaXZlcnMuCisgKgorICoJQmFzZWQgb24gc291cmNlIGNvZGUgb2YgdGhlIGZvbGxvd2luZyBhdXRob3JzOgorICoJICBNYXR0IERvbXNjaCA8TWF0dF9Eb21zY2hAZGVsbC5jb20+LAorICoJICBSb2IgUmFkZXogPHJvYkBvc2ludmVzdG9yLmNvbT4sCisgKgkgIFJ1c3R5IEx5bmNoIDxydXN0eUBsaW51eC5jby5pbnRlbC5jb20+CisgKgkgIFNhdHlhbSBTaGFybWEgPHNhdHlhbUBpbmZyYWRlYWQub3JnPgorICoJICBSYW5keSBEdW5sYXAgPHJhbmR5LmR1bmxhcEBvcmFjbGUuY29tPgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJTmVpdGhlciBBbGFuIENveCwgQ3ltcnVOZXQgTHRkLiwgV2ltIFZhbiBTZWJyb2VjayBub3IgSWd1YW5hIHZ6dy4KKyAqCWFkbWl0IGxpYWJpbGl0eSBub3IgcHJvdmlkZSB3YXJyYW50eSBmb3IgYW55IG9mIHRoaXMgc29mdHdhcmUuCisgKglUaGlzIG1hdGVyaWFsIGlzIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4JLyogRm9yIEVYUE9SVF9TWU1CT0wvbW9kdWxlIHN0dWZmLy4uLiAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CS8qIEZvciBzdGFuZGFyZCB0eXBlcyAqLworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CS8qIEZvciB0aGUgLUVOT0RFVi8uLi4gdmFsdWVzICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CS8qIEZvciBwcmludGsvcGFuaWMvLi4uICovCisjaW5jbHVkZSA8bGludXgvd2F0Y2hkb2cuaD4JLyogRm9yIHdhdGNoZG9nIHNwZWNpZmljIGl0ZW1zICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgkJLyogRm9yIF9faW5pdC9fX2V4aXQvLi4uICovCisKKyNpbmNsdWRlICJ3YXRjaGRvZ19kZXYuaCIJLyogRm9yIHdhdGNoZG9nX2Rldl9yZWdpc3Rlci8uLi4gKi8KKworLyoqCisgKiB3YXRjaGRvZ19yZWdpc3Rlcl9kZXZpY2UoKSAtIHJlZ2lzdGVyIGEgd2F0Y2hkb2cgZGV2aWNlCisgKiBAd2RkOiB3YXRjaGRvZyBkZXZpY2UKKyAqCisgKiBSZWdpc3RlciBhIHdhdGNoZG9nIGRldmljZSB3aXRoIHRoZSBrZXJuZWwgc28gdGhhdCB0aGUKKyAqIHdhdGNoZG9nIHRpbWVyIGNhbiBiZSBhY2Nlc3NlZCBmcm9tIHVzZXJzcGFjZS4KKyAqCisgKiBBIHplcm8gaXMgcmV0dXJuZWQgb24gc3VjY2VzcyBhbmQgYSBuZWdhdGl2ZSBlcnJubyBjb2RlIGZvcgorICogZmFpbHVyZS4KKyAqLworaW50IHdhdGNoZG9nX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZGQpCit7CisJaW50IHJldDsKKworCWlmICh3ZGQgPT0gTlVMTCB8fCB3ZGQtPmluZm8gPT0gTlVMTCB8fCB3ZGQtPm9wcyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIE1hbmRhdG9yeSBvcGVyYXRpb25zIG5lZWQgdG8gYmUgc3VwcG9ydGVkICovCisJaWYgKHdkZC0+b3BzLT5zdGFydCA9PSBOVUxMIHx8IHdkZC0+b3BzLT5zdG9wID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJLyoKKwkgKiBDaGVjayB0aGF0IHdlIGhhdmUgdmFsaWQgbWluIGFuZCBtYXggdGltZW91dCB2YWx1ZXMsIGlmCisJICogbm90IHJlc2V0IHRoZW0gYm90aCB0byAwICg9bm90IHVzZWQgb3IgdW5rbm93bikKKwkgKi8KKwlpZiAod2RkLT5taW5fdGltZW91dCA+IHdkZC0+bWF4X3RpbWVvdXQpIHsKKwkJcHJfaW5mbygiSW52YWxpZCBtaW4gYW5kIG1heCB0aW1lb3V0IHZhbHVlcywgcmVzZXR0aW5nIHRvIDAhXG4iKTsKKwkJd2RkLT5taW5fdGltZW91dCA9IDA7CisJCXdkZC0+bWF4X3RpbWVvdXQgPSAwOworCX0KKworCS8qCisJICogTm90ZTogbm93IHRoYXQgYWxsIHdhdGNoZG9nX2RldmljZSBkYXRhIGhhcyBiZWVuIHZlcmlmaWVkLCB3ZQorCSAqIHdpbGwgbm90IGNoZWNrIHRoaXMgYW55bW9yZSBpbiBvdGhlciBmdW5jdGlvbnMuIElmIGRhdGEgZ2V0cworCSAqIGNvcnJ1cHRlZCBpbiBhIGxhdGVyIHN0YWdlIHRoZW4gd2UgZXhwZWN0IGEga2VybmVsIHBhbmljIQorCSAqLworCisJLyogV2Ugb25seSBzdXBwb3J0IDEgd2F0Y2hkb2cgZGV2aWNlIHZpYSB0aGUgL2Rldi93YXRjaGRvZyBpbnRlcmZhY2UgKi8KKwlyZXQgPSB3YXRjaGRvZ19kZXZfcmVnaXN0ZXIod2RkKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiZXJyb3IgcmVnaXN0ZXJpbmcgL2Rldi93YXRjaGRvZyAoZXJyPSVkKS5cbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3YXRjaGRvZ19yZWdpc3Rlcl9kZXZpY2UpOworCisvKioKKyAqIHdhdGNoZG9nX3VucmVnaXN0ZXJfZGV2aWNlKCkgLSB1bnJlZ2lzdGVyIGEgd2F0Y2hkb2cgZGV2aWNlCisgKiBAd2RkOiB3YXRjaGRvZyBkZXZpY2UgdG8gdW5yZWdpc3RlcgorICoKKyAqIFVucmVnaXN0ZXIgYSB3YXRjaGRvZyBkZXZpY2UgdGhhdCB3YXMgcHJldmlvdXNseSBzdWNjZXNzZnVsbHkKKyAqIHJlZ2lzdGVyZWQgd2l0aCB3YXRjaGRvZ19yZWdpc3Rlcl9kZXZpY2UoKS4KKyAqLwordm9pZCB3YXRjaGRvZ191bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZGQpCit7CisJaW50IHJldDsKKworCWlmICh3ZGQgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJcmV0ID0gd2F0Y2hkb2dfZGV2X3VucmVnaXN0ZXIod2RkKTsKKwlpZiAocmV0KQorCQlwcl9lcnIoImVycm9yIHVucmVnaXN0ZXJpbmcgL2Rldi93YXRjaGRvZyAoZXJyPSVkKS5cbiIsIHJldCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh3YXRjaGRvZ191bnJlZ2lzdGVyX2RldmljZSk7CisKK01PRFVMRV9BVVRIT1IoIkFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+Iik7CitNT0RVTEVfQVVUSE9SKCJXaW0gVmFuIFNlYnJvZWNrIDx3aW1AaWd1YW5hLmJlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJXYXRjaERvZyBUaW1lciBEcml2ZXIgQ29yZSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy93YXRjaGRvZ19kZXYuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvd2F0Y2hkb2dfZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMzNTIwZAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvd2F0Y2hkb2dfZGV2LmMKQEAgLTAsMCArMSwzOTUgQEAKKy8qCisgKgl3YXRjaGRvZ19kZXYuYworICoKKyAqCShjKSBDb3B5cmlnaHQgMjAwOC0yMDExIEFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+LAorICoJCQkJCQlBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqCShjKSBDb3B5cmlnaHQgMjAwOC0yMDExIFdpbSBWYW4gU2Vicm9lY2sgPHdpbUBpZ3VhbmEuYmU+LgorICoKKyAqCisgKglUaGlzIHNvdXJjZSBjb2RlIGlzIHBhcnQgb2YgdGhlIGdlbmVyaWMgY29kZSB0aGF0IGNhbiBiZSB1c2VkCisgKglieSBhbGwgdGhlIHdhdGNoZG9nIHRpbWVyIGRyaXZlcnMuCisgKgorICoJVGhpcyBwYXJ0IG9mIHRoZSBnZW5lcmljIGNvZGUgdGFrZXMgY2FyZSBvZiB0aGUgZm9sbG93aW5nCisgKgltaXNjIGRldmljZTogL2Rldi93YXRjaGRvZy4KKyAqCisgKglCYXNlZCBvbiBzb3VyY2UgY29kZSBvZiB0aGUgZm9sbG93aW5nIGF1dGhvcnM6CisgKgkgIE1hdHQgRG9tc2NoIDxNYXR0X0RvbXNjaEBkZWxsLmNvbT4sCisgKgkgIFJvYiBSYWRleiA8cm9iQG9zaW52ZXN0b3IuY29tPiwKKyAqCSAgUnVzdHkgTHluY2ggPHJ1c3R5QGxpbnV4LmNvLmludGVsLmNvbT4KKyAqCSAgU2F0eWFtIFNoYXJtYSA8c2F0eWFtQGluZnJhZGVhZC5vcmc+CisgKgkgIFJhbmR5IER1bmxhcCA8cmFuZHkuZHVubGFwQG9yYWNsZS5jb20+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglOZWl0aGVyIEFsYW4gQ294LCBDeW1ydU5ldCBMdGQuLCBXaW0gVmFuIFNlYnJvZWNrIG5vciBJZ3VhbmEgdnp3LgorICoJYWRtaXQgbGlhYmlsaXR5IG5vciBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCVRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgkvKiBGb3IgbW9kdWxlIHN0dWZmLy4uLiAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CS8qIEZvciBzdGFuZGFyZCB0eXBlcyAobGlrZSBzaXplX3QpICovCisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4JLyogRm9yIHRoZSAtRU5PREVWLy4uLiB2YWx1ZXMgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4JLyogRm9yIHByaW50ay9wYW5pYy8uLi4gKi8KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgkJLyogRm9yIGZpbGUgb3BlcmF0aW9ucyAqLworI2luY2x1ZGUgPGxpbnV4L3dhdGNoZG9nLmg+CS8qIEZvciB3YXRjaGRvZyBzcGVjaWZpYyBpdGVtcyAqLworI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4JLyogRm9yIGhhbmRsaW5nIG1pc2MgZGV2aWNlcyAqLworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4JCS8qIEZvciBfX2luaXQvX19leGl0Ly4uLiAqLworI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4JLyogRm9yIGNvcHlfdG9fdXNlci9wdXRfdXNlci8uLi4gKi8KKworLyogbWFrZSBzdXJlIHdlIG9ubHkgcmVnaXN0ZXIgb25lIC9kZXYvd2F0Y2hkb2cgZGV2aWNlICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyB3YXRjaGRvZ19kZXZfYnVzeTsKKy8qIHRoZSB3YXRjaGRvZyBkZXZpY2UgYmVoaW5kIC9kZXYvd2F0Y2hkb2cgKi8KK3N0YXRpYyBzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZGQ7CisKKy8qCisgKgl3YXRjaGRvZ19waW5nOiBwaW5nIHRoZSB3YXRjaGRvZy4KKyAqCUB3ZGRldjogdGhlIHdhdGNoZG9nIGRldmljZSB0byBwaW5nCisgKgorICoJSWYgdGhlIHdhdGNoZG9nIGhhcyBubyBvd24gcGluZyBvcGVyYXRpb24gdGhlbiBpdCBuZWVkcyB0byBiZQorICoJcmVzdGFydGVkIHZpYSB0aGUgc3RhcnQgb3BlcmF0aW9uLiBUaGlzIHdyYXBwZXIgZnVuY3Rpb24gZG9lcworICoJZXhhY3RseSB0aGF0LgorICoJV2Ugb25seSBwaW5nIHdoZW4gdGhlIHdhdGNoZG9nIGRldmljZSBpcyBydW5uaW5nLgorICovCisKK3N0YXRpYyBpbnQgd2F0Y2hkb2dfcGluZyhzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICp3ZGRldikKK3sKKwlpZiAodGVzdF9iaXQoV0RPR19BQ1RJVkUsICZ3ZGQtPnN0YXR1cykpIHsKKwkJaWYgKHdkZGV2LT5vcHMtPnBpbmcpCisJCQlyZXR1cm4gd2RkZXYtPm9wcy0+cGluZyh3ZGRldik7ICAvKiBwaW5nIHRoZSB3YXRjaGRvZyAqLworCQllbHNlCisJCQlyZXR1cm4gd2RkZXYtPm9wcy0+c3RhcnQod2RkZXYpOyAvKiByZXN0YXJ0IHdhdGNoZG9nICovCisJfQorCXJldHVybiAwOworfQorCisvKgorICoJd2F0Y2hkb2dfc3RhcnQ6IHdyYXBwZXIgdG8gc3RhcnQgdGhlIHdhdGNoZG9nLgorICoJQHdkZGV2OiB0aGUgd2F0Y2hkb2cgZGV2aWNlIHRvIHN0YXJ0CisgKgorICoJU3RhcnQgdGhlIHdhdGNoZG9nIGlmIGl0IGlzIG5vdCBhY3RpdmUgYW5kIG1hcmsgaXQgYWN0aXZlLgorICoJVGhpcyBmdW5jdGlvbiByZXR1cm5zIHplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm5vIGNvZGUgZm9yCisgKglmYWlsdXJlLgorICovCisKK3N0YXRpYyBpbnQgd2F0Y2hkb2dfc3RhcnQoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RkZXYpCit7CisJaW50IGVycjsKKworCWlmICghdGVzdF9iaXQoV0RPR19BQ1RJVkUsICZ3ZGQtPnN0YXR1cykpIHsKKwkJZXJyID0gd2RkZXYtPm9wcy0+c3RhcnQod2RkZXYpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisKKwkJc2V0X2JpdChXRE9HX0FDVElWRSwgJndkZC0+c3RhdHVzKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKgl3YXRjaGRvZ19zdG9wOiB3cmFwcGVyIHRvIHN0b3AgdGhlIHdhdGNoZG9nLgorICoJQHdkZGV2OiB0aGUgd2F0Y2hkb2cgZGV2aWNlIHRvIHN0b3AKKyAqCisgKglTdG9wIHRoZSB3YXRjaGRvZyBpZiBpdCBpcyBzdGlsbCBhY3RpdmUgYW5kIHVubWFyayBpdCBhY3RpdmUuCisgKglUaGlzIGZ1bmN0aW9uIHJldHVybnMgemVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZXJybm8gY29kZSBmb3IKKyAqCWZhaWx1cmUuCisgKglJZiB0aGUgJ25vd2F5b3V0JyBmZWF0dXJlIHdhcyBzZXQsIHRoZSB3YXRjaGRvZyBjYW5ub3QgYmUgc3RvcHBlZC4KKyAqLworCitzdGF0aWMgaW50IHdhdGNoZG9nX3N0b3Aoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RkZXYpCit7CisJaW50IGVyciA9IC1FQlVTWTsKKworCWlmICh0ZXN0X2JpdChXRE9HX05PX1dBWV9PVVQsICZ3ZGQtPnN0YXR1cykpIHsKKwkJcHJfaW5mbygiJXM6IG5vd2F5b3V0IHByZXZlbnRzIHdhdGNoZG9nIHRvIGJlIHN0b3BwZWQhXG4iLAorCQkJCQkJCXdkZC0+aW5mby0+aWRlbnRpdHkpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmICh0ZXN0X2JpdChXRE9HX0FDVElWRSwgJndkZC0+c3RhdHVzKSkgeworCQllcnIgPSB3ZGRldi0+b3BzLT5zdG9wKHdkZGV2KTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCisJCWNsZWFyX2JpdChXRE9HX0FDVElWRSwgJndkZC0+c3RhdHVzKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKgl3YXRjaGRvZ193cml0ZTogd3JpdGVzIHRvIHRoZSB3YXRjaGRvZy4KKyAqCUBmaWxlOiBmaWxlIGZyb20gVkZTCisgKglAZGF0YTogdXNlciBhZGRyZXNzIG9mIGRhdGEKKyAqCUBsZW46IGxlbmd0aCBvZiBkYXRhCisgKglAcHBvczogcG9pbnRlciB0byB0aGUgZmlsZSBvZmZzZXQKKyAqCisgKglBIHdyaXRlIHRvIGEgd2F0Y2hkb2cgZGV2aWNlIGlzIGRlZmluZWQgYXMgYSBrZWVwYWxpdmUgcGluZy4KKyAqCVdyaXRpbmcgdGhlIG1hZ2ljICdWJyBzZXF1ZW5jZSBhbGxvd3MgdGhlIG5leHQgY2xvc2UgdG8gdHVybgorICoJb2ZmIHRoZSB3YXRjaGRvZyAoaWYgJ25vd2F5b3V0JyBpcyBub3Qgc2V0KS4KKyAqLworCitzdGF0aWMgc3NpemVfdCB3YXRjaGRvZ193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmRhdGEsCisJCQkJCQlzaXplX3QgbGVuLCBsb2ZmX3QgKnBwb3MpCit7CisJc2l6ZV90IGk7CisJY2hhciBjOworCisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogTm90ZToganVzdCBpbiBjYXNlIHNvbWVvbmUgd3JvdGUgdGhlIG1hZ2ljIGNoYXJhY3RlcgorCSAqIGZpdmUgbW9udGhzIGFnby4uLgorCSAqLworCWNsZWFyX2JpdChXRE9HX0FMTE9XX1JFTEVBU0UsICZ3ZGQtPnN0YXR1cyk7CisKKwkvKiBzY2FuIHRvIHNlZSB3aGV0aGVyIG9yIG5vdCB3ZSBnb3QgdGhlIG1hZ2ljIGNoYXJhY3RlciAqLworCWZvciAoaSA9IDA7IGkgIT0gbGVuOyBpKyspIHsKKwkJaWYgKGdldF91c2VyKGMsIGRhdGEgKyBpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoYyA9PSAnVicpCisJCQlzZXRfYml0KFdET0dfQUxMT1dfUkVMRUFTRSwgJndkZC0+c3RhdHVzKTsKKwl9CisKKwkvKiBzb21lb25lIHdyb3RlIHRvIHVzLCBzbyB3ZSBzZW5kIHRoZSB3YXRjaGRvZyBhIGtlZXBhbGl2ZSBwaW5nICovCisJd2F0Y2hkb2dfcGluZyh3ZGQpOworCisJcmV0dXJuIGxlbjsKK30KKworLyoKKyAqCXdhdGNoZG9nX2lvY3RsOiBoYW5kbGUgdGhlIGRpZmZlcmVudCBpb2N0bCdzIGZvciB0aGUgd2F0Y2hkb2cgZGV2aWNlLgorICoJQGZpbGU6IGZpbGUgaGFuZGxlIHRvIHRoZSBkZXZpY2UKKyAqCUBjbWQ6IHdhdGNoZG9nIGNvbW1hbmQKKyAqCUBhcmc6IGFyZ3VtZW50IHBvaW50ZXIKKyAqCisgKglUaGUgd2F0Y2hkb2cgQVBJIGRlZmluZXMgYSBjb21tb24gc2V0IG9mIGZ1bmN0aW9ucyBmb3IgYWxsIHdhdGNoZG9ncworICoJYWNjb3JkaW5nIHRvIHRoZWlyIGF2YWlsYWJsZSBmZWF0dXJlcy4KKyAqLworCitzdGF0aWMgbG9uZyB3YXRjaGRvZ19pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQkJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKwl1bnNpZ25lZCBpbnQgdmFsOworCWludCBlcnI7CisKKwlpZiAod2RkLT5vcHMtPmlvY3RsKSB7CisJCWVyciA9IHdkZC0+b3BzLT5pb2N0bCh3ZGQsIGNtZCwgYXJnKTsKKwkJaWYgKGVyciAhPSAtRU5PSU9DVExDTUQpCisJCQlyZXR1cm4gZXJyOworCX0KKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBXRElPQ19HRVRTVVBQT1JUOgorCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsIHdkZC0+aW5mbywKKwkJCXNpemVvZihzdHJ1Y3Qgd2F0Y2hkb2dfaW5mbykpID8gLUVGQVVMVCA6IDA7CisJY2FzZSBXRElPQ19HRVRTVEFUVVM6CisJCXZhbCA9IHdkZC0+b3BzLT5zdGF0dXMgPyB3ZGQtPm9wcy0+c3RhdHVzKHdkZCkgOiAwOworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwljYXNlIFdESU9DX0dFVEJPT1RTVEFUVVM6CisJCXJldHVybiBwdXRfdXNlcih3ZGQtPmJvb3RzdGF0dXMsIHApOworCWNhc2UgV0RJT0NfU0VUT1BUSU9OUzoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAmIFdESU9TX0RJU0FCTEVDQVJEKSB7CisJCQllcnIgPSB3YXRjaGRvZ19zdG9wKHdkZCk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJCWlmICh2YWwgJiBXRElPU19FTkFCTEVDQVJEKSB7CisJCQllcnIgPSB3YXRjaGRvZ19zdGFydCh3ZGQpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCQlyZXR1cm4gMDsKKwljYXNlIFdESU9DX0tFRVBBTElWRToKKwkJaWYgKCEod2RkLT5pbmZvLT5vcHRpb25zICYgV0RJT0ZfS0VFUEFMSVZFUElORykpCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCXdhdGNoZG9nX3Bpbmcod2RkKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBXRElPQ19TRVRUSU1FT1VUOgorCQlpZiAoKHdkZC0+b3BzLT5zZXRfdGltZW91dCA9PSBOVUxMKSB8fAorCQkgICAgISh3ZGQtPmluZm8tPm9wdGlvbnMgJiBXRElPRl9TRVRUSU1FT1VUKSkKKwkJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKCh3ZGQtPm1heF90aW1lb3V0ICE9IDApICYmCisJCSAgICAodmFsIDwgd2RkLT5taW5fdGltZW91dCB8fCB2YWwgPiB3ZGQtPm1heF90aW1lb3V0KSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZXJyID0gd2RkLT5vcHMtPnNldF90aW1lb3V0KHdkZCwgdmFsKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQl3ZGQtPnRpbWVvdXQgPSB2YWw7CisJCS8qIElmIHRoZSB3YXRjaGRvZyBpcyBhY3RpdmUgdGhlbiB3ZSBzZW5kIGEga2VlcGFsaXZlIHBpbmcKKwkJICogdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHdhdGNoZG9nIGtlZXAncyBydW5uaW5nIChhbmQgaWYKKwkJICogcG9zc2libGUgdGhhdCBpdCB0YWtlcyB0aGUgbmV3IHRpbWVvdXQpICovCisJCXdhdGNoZG9nX3Bpbmcod2RkKTsKKwkJLyogRmFsbCAqLworCWNhc2UgV0RJT0NfR0VUVElNRU9VVDoKKwkJLyogdGltZW91dCA9PSAwIG1lYW5zIHRoYXQgd2UgZG9uJ3Qga25vdyB0aGUgdGltZW91dCAqLworCQlpZiAod2RkLT50aW1lb3V0ID09IDApCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCXJldHVybiBwdXRfdXNlcih3ZGQtPnRpbWVvdXQsIHApOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU5PVFRZOworCX0KK30KKworLyoKKyAqCXdhdGNoZG9nX29wZW46IG9wZW4gdGhlIC9kZXYvd2F0Y2hkb2cgZGV2aWNlLgorICoJQGlub2RlOiBpbm9kZSBvZiBkZXZpY2UKKyAqCUBmaWxlOiBmaWxlIGhhbmRsZSB0byBkZXZpY2UKKyAqCisgKglXaGVuIHRoZSAvZGV2L3dhdGNoZG9nIGRldmljZSBnZXRzIG9wZW5lZCwgd2Ugc3RhcnQgdGhlIHdhdGNoZG9nLgorICoJV2F0Y2ggb3V0OiB0aGUgL2Rldi93YXRjaGRvZyBkZXZpY2UgaXMgc2luZ2xlIG9wZW4sIHNvIHdlIG1ha2Ugc3VyZQorICoJaXQgY2FuIG9ubHkgYmUgb3BlbmVkIG9uY2UuCisgKi8KKworc3RhdGljIGludCB3YXRjaGRvZ19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBlcnIgPSAtRUJVU1k7CisKKwkvKiB0aGUgd2F0Y2hkb2cgaXMgc2luZ2xlIG9wZW4hICovCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoV0RPR19ERVZfT1BFTiwgJndkZC0+c3RhdHVzKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCS8qCisJICogSWYgdGhlIC9kZXYvd2F0Y2hkb2cgZGV2aWNlIGlzIG9wZW4sIHdlIGRvbid0IHdhbnQgdGhlIG1vZHVsZQorCSAqIHRvIGJlIHVubG9hZGVkLgorCSAqLworCWlmICghdHJ5X21vZHVsZV9nZXQod2RkLT5vcHMtPm93bmVyKSkKKwkJZ290byBvdXQ7CisKKwllcnIgPSB3YXRjaGRvZ19zdGFydCh3ZGQpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIG91dF9tb2Q7CisKKwkvKiBkZXYvd2F0Y2hkb2cgaXMgYSB2aXJ0dWFsIChhbmQgdGh1cyBub24tc2Vla2FibGUpIGZpbGVzeXN0ZW0gKi8KKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7CisKK291dF9tb2Q6CisJbW9kdWxlX3B1dCh3ZGQtPm9wcy0+b3duZXIpOworb3V0OgorCWNsZWFyX2JpdChXRE9HX0RFVl9PUEVOLCAmd2RkLT5zdGF0dXMpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiAgICAgIHdhdGNoZG9nX3JlbGVhc2U6IHJlbGVhc2UgdGhlIC9kZXYvd2F0Y2hkb2cgZGV2aWNlLgorICogICAgICBAaW5vZGU6IGlub2RlIG9mIGRldmljZQorICogICAgICBAZmlsZTogZmlsZSBoYW5kbGUgdG8gZGV2aWNlCisgKgorICoJVGhpcyBpcyB0aGUgY29kZSBmb3Igd2hlbiAvZGV2L3dhdGNoZG9nIGdldHMgY2xvc2VkLiBXZSB3aWxsIG9ubHkKKyAqCXN0b3AgdGhlIHdhdGNoZG9nIHdoZW4gd2UgaGF2ZSByZWNlaXZlZCB0aGUgbWFnaWMgY2hhciAoYW5kIG5vd2F5b3V0CisgKgl3YXMgbm90IHNldCksIGVsc2UgdGhlIHdhdGNoZG9nIHdpbGwga2VlcCBydW5uaW5nLgorICovCisKK3N0YXRpYyBpbnQgd2F0Y2hkb2dfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgZXJyID0gLUVCVVNZOworCisJLyoKKwkgKiBXZSBvbmx5IHN0b3AgdGhlIHdhdGNoZG9nIGlmIHdlIHJlY2VpdmVkIHRoZSBtYWdpYyBjaGFyYWN0ZXIKKwkgKiBvciBpZiBXRElPRl9NQUdJQ0NMT1NFIGlzIG5vdCBzZXQuIElmIG5vd2F5b3V0IHdhcyBzZXQgdGhlbgorCSAqIHdhdGNoZG9nX3N0b3Agd2lsbCBmYWlsLgorCSAqLworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoV0RPR19BTExPV19SRUxFQVNFLCAmd2RkLT5zdGF0dXMpIHx8CisJICAgICEod2RkLT5pbmZvLT5vcHRpb25zICYgV0RJT0ZfTUFHSUNDTE9TRSkpCisJCWVyciA9IHdhdGNoZG9nX3N0b3Aod2RkKTsKKworCS8qIElmIHRoZSB3YXRjaGRvZyB3YXMgbm90IHN0b3BwZWQsIHNlbmQgYSBrZWVwYWxpdmUgcGluZyAqLworCWlmIChlcnIgPCAwKSB7CisJCXByX2NyaXQoIiVzOiB3YXRjaGRvZyBkaWQgbm90IHN0b3AhXG4iLCB3ZGQtPmluZm8tPmlkZW50aXR5KTsKKwkJd2F0Y2hkb2dfcGluZyh3ZGQpOworCX0KKworCS8qIEFsbG93IHRoZSBvd25lciBtb2R1bGUgdG8gYmUgdW5sb2FkZWQgYWdhaW4gKi8KKwltb2R1bGVfcHV0KHdkZC0+b3BzLT5vd25lcik7CisKKwkvKiBtYWtlIHN1cmUgdGhhdCAvZGV2L3dhdGNoZG9nIGNhbiBiZSByZS1vcGVuZWQgKi8KKwljbGVhcl9iaXQoV0RPR19ERVZfT1BFTiwgJndkZC0+c3RhdHVzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3YXRjaGRvZ19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkud3JpdGUJCT0gd2F0Y2hkb2dfd3JpdGUsCisJLnVubG9ja2VkX2lvY3RsCT0gd2F0Y2hkb2dfaW9jdGwsCisJLm9wZW4JCT0gd2F0Y2hkb2dfb3BlbiwKKwkucmVsZWFzZQk9IHdhdGNoZG9nX3JlbGVhc2UsCit9OworCitzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2Ugd2F0Y2hkb2dfbWlzY2RldiA9IHsKKwkubWlub3IJCT0gV0FUQ0hET0dfTUlOT1IsCisJLm5hbWUJCT0gIndhdGNoZG9nIiwKKwkuZm9wcwkJPSAmd2F0Y2hkb2dfZm9wcywKK307CisKKy8qCisgKgl3YXRjaGRvZ19kZXZfcmVnaXN0ZXI6CisgKglAd2F0Y2hkb2c6IHdhdGNoZG9nIGRldmljZQorICoKKyAqCVJlZ2lzdGVyIGEgd2F0Y2hkb2cgZGV2aWNlIGFzIC9kZXYvd2F0Y2hkb2cuIC9kZXYvd2F0Y2hkb2cKKyAqCWlzIGFjdHVhbGx5IGEgbWlzY2RldmljZSBhbmQgdGh1cyB3ZSBzZXQgaXQgdXAgbGlrZSB0aGF0LgorICovCisKK2ludCB3YXRjaGRvZ19kZXZfcmVnaXN0ZXIoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2F0Y2hkb2cpCit7CisJaW50IGVycjsKKworCS8qIE9ubHkgb25lIGRldmljZSBjYW4gcmVnaXN0ZXIgZm9yIC9kZXYvd2F0Y2hkb2cgKi8KKwlpZiAodGVzdF9hbmRfc2V0X2JpdCgwLCAmd2F0Y2hkb2dfZGV2X2J1c3kpKSB7CisJCXByX2Vycigib25seSBvbmUgd2F0Y2hkb2cgY2FuIHVzZSAvZGV2L3dhdGNoZG9nLlxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJd2RkID0gd2F0Y2hkb2c7CisKKwllcnIgPSBtaXNjX3JlZ2lzdGVyKCZ3YXRjaGRvZ19taXNjZGV2KTsKKwlpZiAoZXJyICE9IDApIHsKKwkJcHJfZXJyKCIlczogY2Fubm90IHJlZ2lzdGVyIG1pc2NkZXYgb24gbWlub3I9JWQgKGVycj0lZCkuXG4iLAorCQkJd2F0Y2hkb2ctPmluZm8tPmlkZW50aXR5LCBXQVRDSERPR19NSU5PUiwgZXJyKTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0dXJuIDA7CisKK291dDoKKwl3ZGQgPSBOVUxMOworCWNsZWFyX2JpdCgwLCAmd2F0Y2hkb2dfZGV2X2J1c3kpOworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKgl3YXRjaGRvZ19kZXZfdW5yZWdpc3RlcjoKKyAqCUB3YXRjaGRvZzogd2F0Y2hkb2cgZGV2aWNlCisgKgorICoJRGVyZWdpc3RlciB0aGUgL2Rldi93YXRjaGRvZyBkZXZpY2UuCisgKi8KKworaW50IHdhdGNoZG9nX2Rldl91bnJlZ2lzdGVyKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndhdGNoZG9nKQoreworCS8qIENoZWNrIHRoYXQgYSB3YXRjaGRvZyBkZXZpY2Ugd2FzIHJlZ2lzdGVyZWQgaW4gdGhlIHBhc3QgKi8KKwlpZiAoIXRlc3RfYml0KDAsICZ3YXRjaGRvZ19kZXZfYnVzeSkgfHwgIXdkZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBXZSBjYW4gb25seSB1bnJlZ2lzdGVyIHRoZSB3YXRjaGRvZyBkZXZpY2UgdGhhdCB3YXMgcmVnaXN0ZXJlZCAqLworCWlmICh3YXRjaGRvZyAhPSB3ZGQpIHsKKwkJcHJfZXJyKCIlczogd2F0Y2hkb2cgd2FzIG5vdCByZWdpc3RlcmVkIGFzIC9kZXYvd2F0Y2hkb2cuXG4iLAorCQkJd2F0Y2hkb2ctPmluZm8tPmlkZW50aXR5KTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbWlzY19kZXJlZ2lzdGVyKCZ3YXRjaGRvZ19taXNjZGV2KTsKKwl3ZGQgPSBOVUxMOworCWNsZWFyX2JpdCgwLCAmd2F0Y2hkb2dfZGV2X2J1c3kpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy93YXRjaGRvZ19kZXYuaCBiL2RyaXZlcnMvd2F0Y2hkb2cvd2F0Y2hkb2dfZGV2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM3NjEyYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvd2F0Y2hkb2dfZGV2LmgKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqCXdhdGNoZG9nX2NvcmUuaAorICoKKyAqCShjKSBDb3B5cmlnaHQgMjAwOC0yMDExIEFsYW4gQ294IDxhbGFuQGx4b3JndWsudWt1dS5vcmcudWs+LAorICoJCQkJCQlBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqCShjKSBDb3B5cmlnaHQgMjAwOC0yMDExIFdpbSBWYW4gU2Vicm9lY2sgPHdpbUBpZ3VhbmEuYmU+LgorICoKKyAqCVRoaXMgc291cmNlIGNvZGUgaXMgcGFydCBvZiB0aGUgZ2VuZXJpYyBjb2RlIHRoYXQgY2FuIGJlIHVzZWQKKyAqCWJ5IGFsbCB0aGUgd2F0Y2hkb2cgdGltZXIgZHJpdmVycy4KKyAqCisgKglCYXNlZCBvbiBzb3VyY2UgY29kZSBvZiB0aGUgZm9sbG93aW5nIGF1dGhvcnM6CisgKgkgIE1hdHQgRG9tc2NoIDxNYXR0X0RvbXNjaEBkZWxsLmNvbT4sCisgKgkgIFJvYiBSYWRleiA8cm9iQG9zaW52ZXN0b3IuY29tPiwKKyAqCSAgUnVzdHkgTHluY2ggPHJ1c3R5QGxpbnV4LmNvLmludGVsLmNvbT4KKyAqCSAgU2F0eWFtIFNoYXJtYSA8c2F0eWFtQGluZnJhZGVhZC5vcmc+CisgKgkgIFJhbmR5IER1bmxhcCA8cmFuZHkuZHVubGFwQG9yYWNsZS5jb20+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglOZWl0aGVyIEFsYW4gQ294LCBDeW1ydU5ldCBMdGQuLCBXaW0gVmFuIFNlYnJvZWNrIG5vciBJZ3VhbmEgdnp3LgorICoJYWRtaXQgbGlhYmlsaXR5IG5vciBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4KKyAqCVRoaXMgbWF0ZXJpYWwgaXMgcHJvdmlkZWQgIkFTLUlTIiBhbmQgYXQgbm8gY2hhcmdlLgorICovCisKKy8qCisgKglGdW5jdGlvbnMvcHJvY2VkdXJlcyB0byBiZSBjYWxsZWQgYnkgdGhlIGNvcmUKKyAqLworaW50IHdhdGNoZG9nX2Rldl9yZWdpc3RlcihzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICopOworaW50IHdhdGNoZG9nX2Rldl91bnJlZ2lzdGVyKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9ncmFudC10YWJsZS5jIGIvZHJpdmVycy94ZW4vZ3JhbnQtdGFibGUuYwppbmRleCBmZDcyNWNkLi40ZjQ0YjM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi9ncmFudC10YWJsZS5jCisrKyBiL2RyaXZlcnMveGVuL2dyYW50LXRhYmxlLmMKQEAgLTgyLDcgKzgyLDcgQEAKIHN0YXRpYyBpbnQgZ2V0X2ZyZWVfZW50cmllcyh1bnNpZ25lZCBjb3VudCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZWYsIHJjOworCWludCByZWYsIHJjID0gMDsKIAlncmFudF9yZWZfdCBoZWFkOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdudHRhYl9saXN0X2xvY2ssIGZsYWdzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbi1wY2liYWNrL3hlbmJ1cy5jIGIvZHJpdmVycy94ZW4veGVuLXBjaWJhY2sveGVuYnVzLmMKaW5kZXggMjA2YzRjZTAuLjk3OGQyYzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL3hlbi1wY2liYWNrL3hlbmJ1cy5jCisrKyBiL2RyaXZlcnMveGVuL3hlbi1wY2liYWNrL3hlbmJ1cy5jCkBAIC0xMSw3ICsxMSw2IEBACiAjaW5jbHVkZSA8eGVuL3hlbmJ1cy5oPgogI2luY2x1ZGUgPHhlbi9ldmVudHMuaD4KICNpbmNsdWRlIDxhc20veGVuL3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgInBjaWJhY2suaCIKIAogI2RlZmluZQlEUlZfTkFNRQkieGVuLXBjaWJhY2siCmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW4tc2VsZmJhbGxvb24uYyBiL2RyaXZlcnMveGVuL3hlbi1zZWxmYmFsbG9vbi5jCmluZGV4IDAxMDkzN2IuLjFiNGFmZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL3hlbi1zZWxmYmFsbG9vbi5jCisrKyBiL2RyaXZlcnMveGVuL3hlbi1zZWxmYmFsbG9vbi5jCkBAIC03MCwxMCArNzAsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KLQorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPHhlbi9iYWxsb29uLmg+Ci0KICNpbmNsdWRlIDx4ZW4vdG1lbS5oPgorI2luY2x1ZGUgPHhlbi94ZW4uaD4KIAogLyogRW5hYmxlL2Rpc2FibGUgd2l0aCBzeXNmcy4gKi8KIHN0YXRpYyBpbnQgeGVuX3NlbGZiYWxsb29uaW5nX2VuYWJsZWQgX19yZWFkX21vc3RseTsKZGlmZiAtLWdpdCBhL2ZzLzlwL2FjbC5jIGIvZnMvOXAvYWNsLmMKaW5kZXggZTljYjU3Zi4uOWExZDQyNiAxMDA2NDQKLS0tIGEvZnMvOXAvYWNsLmMKKysrIGIvZnMvOXAvYWNsLmMKQEAgLTE4MiwxMSArMTgyLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCB2OWZzX2FjbF9tb2RlKHN0cnVjdCBpbm9kZSAqZGlyLCBtb2RlX3QgKm1vZGVwLAoraW50IHY5ZnNfYWNsX21vZGUoc3RydWN0IGlub2RlICpkaXIsIHVtb2RlX3QgKm1vZGVwLAogCQkgIHN0cnVjdCBwb3NpeF9hY2wgKipkcGFjbCwgc3RydWN0IHBvc2l4X2FjbCAqKnBhY2wpCiB7CiAJaW50IHJldHZhbCA9IDA7Ci0JbW9kZV90IG1vZGUgPSAqbW9kZXA7CisJdW1vZGVfdCBtb2RlID0gKm1vZGVwOwogCXN0cnVjdCBwb3NpeF9hY2wgKmFjbCA9IE5VTEw7CiAKIAlpZiAoIVNfSVNMTksobW9kZSkpIHsKQEAgLTMxOSw3ICszMTksNyBAQAogCWNhc2UgQUNMX1RZUEVfQUNDRVNTOgogCQluYW1lID0gUE9TSVhfQUNMX1hBVFRSX0FDQ0VTUzsKIAkJaWYgKGFjbCkgewotCQkJbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOworCQkJdW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKIAkJCXJldHZhbCA9IHBvc2l4X2FjbF9lcXVpdl9tb2RlKGFjbCwgJm1vZGUpOwogCQkJaWYgKHJldHZhbCA8IDApCiAJCQkJZ290byBlcnJfb3V0OwpkaWZmIC0tZ2l0IGEvZnMvOXAvYWNsLmggYi9mcy85cC9hY2wuaAppbmRleCBkZGI3YWUxLi41NTk1NTY0IDEwMDY0NAotLS0gYS9mcy85cC9hY2wuaAorKysgYi9mcy85cC9hY2wuaApAQCAtMjAsNyArMjAsNyBAQAogZXh0ZXJuIGludCB2OWZzX2FjbF9jaG1vZChzdHJ1Y3QgZGVudHJ5ICopOwogZXh0ZXJuIGludCB2OWZzX3NldF9jcmVhdGVfYWNsKHN0cnVjdCBkZW50cnkgKiwKIAkJCSAgICAgICBzdHJ1Y3QgcG9zaXhfYWNsICoqLCBzdHJ1Y3QgcG9zaXhfYWNsICoqKTsKLWV4dGVybiBpbnQgdjlmc19hY2xfbW9kZShzdHJ1Y3QgaW5vZGUgKmRpciwgbW9kZV90ICptb2RlcCwKK2V4dGVybiBpbnQgdjlmc19hY2xfbW9kZShzdHJ1Y3QgaW5vZGUgKmRpciwgdW1vZGVfdCAqbW9kZXAsCiAJCQkgc3RydWN0IHBvc2l4X2FjbCAqKmRwYWNsLCBzdHJ1Y3QgcG9zaXhfYWNsICoqcGFjbCk7CiAjZWxzZQogI2RlZmluZSB2OWZzX2lvcF9nZXRfYWNsIE5VTEwKQEAgLTM4LDcgKzM4LDcgQEAKIHsKIAlyZXR1cm4gMDsKIH0KLXN0YXRpYyBpbmxpbmUgaW50IHY5ZnNfYWNsX21vZGUoc3RydWN0IGlub2RlICpkaXIsIG1vZGVfdCAqbW9kZXAsCitzdGF0aWMgaW5saW5lIGludCB2OWZzX2FjbF9tb2RlKHN0cnVjdCBpbm9kZSAqZGlyLCB1bW9kZV90ICptb2RlcCwKIAkJCQlzdHJ1Y3QgcG9zaXhfYWNsICoqZHBhY2wsCiAJCQkJc3RydWN0IHBvc2l4X2FjbCAqKnBhY2wpCiB7CmRpZmYgLS1naXQgYS9mcy85cC92ZnNfaW5vZGVfZG90bC5jIGIvZnMvOXAvdmZzX2lub2RlX2RvdGwuYwppbmRleCA5YTI2ZGNlLi5iNmM4ZWQyIDEwMDY0NAotLS0gYS9mcy85cC92ZnNfaW5vZGVfZG90bC5jCisrKyBiL2ZzLzlwL3Zmc19pbm9kZV9kb3RsLmMKQEAgLTIwNiw3ICsyMDYsNyBAQAogCWludCBlcnIgPSAwOwogCWdpZF90IGdpZDsKIAlpbnQgZmxhZ3M7Ci0JbW9kZV90IG1vZGU7CisJdW1vZGVfdCBtb2RlOwogCWNoYXIgKm5hbWUgPSBOVUxMOwogCXN0cnVjdCBmaWxlICpmaWxwOwogCXN0cnVjdCBwOV9xaWQgcWlkOwpAQCAtMzQ4LDcgKzM0OCw3IEBACiAJc3RydWN0IHA5X2ZpZCAqZmlkID0gTlVMTCwgKmRmaWQgPSBOVUxMOwogCWdpZF90IGdpZDsKIAljaGFyICpuYW1lOwotCW1vZGVfdCBtb2RlOworCXVtb2RlX3QgbW9kZTsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCXN0cnVjdCBwOV9xaWQgcWlkOwogCXN0cnVjdCBkZW50cnkgKmRpcl9kZW50cnk7CkBAIC03NTEsNyArNzUxLDcgQEAKIAlpbnQgZXJyOwogCWdpZF90IGdpZDsKIAljaGFyICpuYW1lOwotCW1vZGVfdCBtb2RlOworCXVtb2RlX3QgbW9kZTsKIAlzdHJ1Y3Qgdjlmc19zZXNzaW9uX2luZm8gKnY5c2VzOwogCXN0cnVjdCBwOV9maWQgKmZpZCA9IE5VTEwsICpkZmlkID0gTlVMTDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOwpkaWZmIC0tZ2l0IGEvZnMvS2NvbmZpZyBiL2ZzL0tjb25maWcKaW5kZXggMTk4OTFhYS4uOWZlMGIzNCAxMDA2NDQKLS0tIGEvZnMvS2NvbmZpZworKysgYi9mcy9LY29uZmlnCkBAIC0xMjcsMTQgKzEyNywyMSBAQAogCXNlbGVjdCBUTVBGU19YQVRUUgogCXNlbGVjdCBHRU5FUklDX0FDTAogCWhlbHAKLQkgIFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3RzIChBQ0xzKSBzdXBwb3J0IHBlcm1pc3Npb25zIGZvciB1c2VycyBhbmQKLQkgIGdyb3VwcyBiZXlvbmQgdGhlIG93bmVyL2dyb3VwL3dvcmxkIHNjaGVtZS4KKwkgIFBPU0lYIEFjY2VzcyBDb250cm9sIExpc3RzIChBQ0xzKSBzdXBwb3J0IGFkZGl0aW9uYWwgYWNjZXNzIHJpZ2h0cworCSAgZm9yIHVzZXJzIGFuZCBncm91cHMgYmV5b25kIHRoZSBzdGFuZGFyZCBvd25lci9ncm91cC93b3JsZCBzY2hlbWUsCisJICBhbmQgdGhpcyBvcHRpb24gc2VsZWN0cyBzdXBwb3J0IGZvciBBQ0xzIHNwZWNpZmljYWxseSBmb3IgdG1wZnMKKwkgIGZpbGVzeXN0ZW1zLgorCisJICBJZiB5b3UndmUgc2VsZWN0ZWQgVE1QRlMsIGl0J3MgcG9zc2libGUgdGhhdCB5b3UnbGwgYWxzbyBuZWVkCisJICB0aGlzIG9wdGlvbiBhcyB0aGVyZSBhcmUgYSBudW1iZXIgb2YgTGludXggZGlzdHJvcyB0aGF0IHJlcXVpcmUKKwkgIFBPU0lYIEFDTCBzdXBwb3J0IHVuZGVyIC9kZXYgZm9yIGNlcnRhaW4gZmVhdHVyZXMgdG8gd29yayBwcm9wZXJseS4KKwkgIEZvciBleGFtcGxlLCBzb21lIGRpc3Ryb3MgbmVlZCB0aGlzIGZlYXR1cmUgZm9yIEFMU0EtcmVsYXRlZCAvZGV2CisJICBmaWxlcyBmb3Igc291bmQgdG8gd29yayBwcm9wZXJseS4gIEluIHNob3J0LCBpZiB5b3UncmUgbm90IHN1cmUsCisJICBzYXkgWS4KIAogCSAgVG8gbGVhcm4gbW9yZSBhYm91dCBBY2Nlc3MgQ29udHJvbCBMaXN0cywgdmlzaXQgdGhlIFBPU0lYIEFDTHMgZm9yCiAJICBMaW51eCB3ZWJzaXRlIDxodHRwOi8vYWNsLmJlc3RiaXRzLmF0Lz4uCiAKLQkgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgQWNjZXNzIENvbnRyb2wgTGlzdHMgYXJlLCBzYXkgTi4KLQogY29uZmlnIFRNUEZTX1hBVFRSCiAJYm9vbCAiVG1wZnMgZXh0ZW5kZWQgYXR0cmlidXRlcyIKIAlkZXBlbmRzIG9uIFRNUEZTCmRpZmYgLS1naXQgYS9mcy9ibG9ja19kZXYuYyBiL2ZzL2Jsb2NrX2Rldi5jCmluZGV4IGY1NWFhZDQuLmZmNzcyNjIgMTAwNjQ0Ci0tLSBhL2ZzL2Jsb2NrX2Rldi5jCisrKyBiL2ZzL2Jsb2NrX2Rldi5jCkBAIC0zODcsNiArMzg3LDEwIEBACiAJc3RydWN0IGlub2RlICpiZF9pbm9kZSA9IGZpbHAtPmZfbWFwcGluZy0+aG9zdDsKIAlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2ID0gSV9CREVWKGJkX2lub2RlKTsKIAlpbnQgZXJyb3I7CisJCisJZXJyb3IgPSBmaWxlbWFwX3dyaXRlX2FuZF93YWl0X3JhbmdlKGZpbHAtPmZfbWFwcGluZywgc3RhcnQsIGVuZCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CiAKIAkvKgogCSAqIFRoZXJlIGlzIG5vIG5lZWQgdG8gc2VyaWFsaXNlIGNhbGxzIHRvIGJsa2Rldl9pc3N1ZV9mbHVzaCB3aXRoCkBAIC01NTIsNiArNTU2LDcgQEAKIAogCWlmIChpbm9kZS0+aV9zdGF0ZSAmIElfTkVXKSB7CiAJCWJkZXYtPmJkX2NvbnRhaW5zID0gTlVMTDsKKwkJYmRldi0+YmRfc3VwZXIgPSBOVUxMOwogCQliZGV2LT5iZF9pbm9kZSA9IGlub2RlOwogCQliZGV2LT5iZF9ibG9ja19zaXplID0gKDEgPDwgaW5vZGUtPmlfYmxrYml0cyk7CiAJCWJkZXYtPmJkX3BhcnRfY291bnQgPSAwOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvTWFrZWZpbGUgYi9mcy9idHJmcy9NYWtlZmlsZQppbmRleCA5YjcyZGNmLi40MGU2YWMwIDEwMDY0NAotLS0gYS9mcy9idHJmcy9NYWtlZmlsZQorKysgYi9mcy9idHJmcy9NYWtlZmlsZQpAQCAtNiw1ICs2LDcgQEAKIAkgICB0cmFuc2FjdGlvbi5vIGlub2RlLm8gZmlsZS5vIHRyZWUtZGVmcmFnLm8gXAogCSAgIGV4dGVudF9tYXAubyBzeXNmcy5vIHN0cnVjdC1mdW5jcy5vIHhhdHRyLm8gb3JkZXJlZC1kYXRhLm8gXAogCSAgIGV4dGVudF9pby5vIHZvbHVtZXMubyBhc3luYy10aHJlYWQubyBpb2N0bC5vIGxvY2tpbmcubyBvcnBoYW4ubyBcCi0JICAgZXhwb3J0Lm8gdHJlZS1sb2cubyBhY2wubyBmcmVlLXNwYWNlLWNhY2hlLm8gemxpYi5vIGx6by5vIFwKKwkgICBleHBvcnQubyB0cmVlLWxvZy5vIGZyZWUtc3BhY2UtY2FjaGUubyB6bGliLm8gbHpvLm8gXAogCSAgIGNvbXByZXNzaW9uLm8gZGVsYXllZC1yZWYubyByZWxvY2F0aW9uLm8gZGVsYXllZC1pbm9kZS5vIHNjcnViLm8KKworYnRyZnMtJChDT05GSUdfQlRSRlNfRlNfUE9TSVhfQUNMKSArPSBhY2wubwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvYWNsLmMgYi9mcy9idHJmcy9hY2wuYwppbmRleCA2NWE3MzVkLi5lYjE1OWFhIDEwMDY0NAotLS0gYS9mcy9idHJmcy9hY2wuYworKysgYi9mcy9idHJmcy9hY2wuYwpAQCAtMjgsOCArMjgsNiBAQAogI2luY2x1ZGUgImJ0cmZzX2lub2RlLmgiCiAjaW5jbHVkZSAieGF0dHIuaCIKIAotI2lmZGVmIENPTkZJR19CVFJGU19GU19QT1NJWF9BQ0wKLQogc3RydWN0IHBvc2l4X2FjbCAqYnRyZnNfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKIHsKIAlpbnQgc2l6ZTsKQEAgLTExMSw3ICsxMDksNiBAQAogCWludCByZXQsIHNpemUgPSAwOwogCWNvbnN0IGNoYXIgKm5hbWU7CiAJY2hhciAqdmFsdWUgPSBOVUxMOwotCW1vZGVfdCBtb2RlOwogCiAJaWYgKGFjbCkgewogCQlyZXQgPSBwb3NpeF9hY2xfdmFsaWQoYWNsKTsKQEAgLTEyMiwxMyArMTE5LDExIEBACiAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKLQkJbW9kZSA9IGlub2RlLT5pX21vZGU7CiAJCW5hbWUgPSBQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTOwogCQlpZiAoYWNsKSB7Ci0JCQlyZXQgPSBwb3NpeF9hY2xfZXF1aXZfbW9kZShhY2wsICZtb2RlKTsKKwkJCXJldCA9IHBvc2l4X2FjbF9lcXVpdl9tb2RlKGFjbCwgJmlub2RlLT5pX21vZGUpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJcmV0dXJuIHJldDsKLQkJCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCQl9CiAJCXJldCA9IDA7CiAJCWJyZWFrOwpAQCAtMjIyLDE5ICsyMTcsMTYgQEAKIAl9CiAKIAlpZiAoSVNfUE9TSVhBQ0woZGlyKSAmJiBhY2wpIHsKLQkJbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOwotCiAJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CiAJCQlyZXQgPSBidHJmc19zZXRfYWNsKHRyYW5zLCBpbm9kZSwgYWNsLAogCQkJCQkgICAgQUNMX1RZUEVfREVGQVVMVCk7CiAJCQlpZiAocmV0KQogCQkJCWdvdG8gZmFpbGVkOwogCQl9Ci0JCXJldCA9IHBvc2l4X2FjbF9jcmVhdGUoJmFjbCwgR0ZQX05PRlMsICZtb2RlKTsKKwkJcmV0ID0gcG9zaXhfYWNsX2NyZWF0ZSgmYWNsLCBHRlBfTk9GUywgJmlub2RlLT5pX21vZGUpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAKLQkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJCWlmIChyZXQgPiAwKSB7CiAJCQkvKiB3ZSBuZWVkIGFuIGFjbCAqLwogCQkJcmV0ID0gYnRyZnNfc2V0X2FjbCh0cmFucywgaW5vZGUsIGFjbCwgQUNMX1RZUEVfQUNDRVNTKTsKQEAgLTI4MiwxOCArMjc0LDMgQEAKIAkuZ2V0CT0gYnRyZnNfeGF0dHJfYWNsX2dldCwKIAkuc2V0CT0gYnRyZnNfeGF0dHJfYWNsX3NldCwKIH07Ci0KLSNlbHNlIC8qIENPTkZJR19CVFJGU19GU19QT1NJWF9BQ0wgKi8KLQotaW50IGJ0cmZzX2FjbF9jaG1vZChzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCXJldHVybiAwOwotfQotCi1pbnQgYnRyZnNfaW5pdF9hY2woc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnMsCi0JCSAgIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBpbm9kZSAqZGlyKQotewotCXJldHVybiAwOwotfQotCi0jZW5kaWYgLyogQ09ORklHX0JUUkZTX0ZTX1BPU0lYX0FDTCAqLwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvY29tcHJlc3Npb24uYyBiL2ZzL2J0cmZzL2NvbXByZXNzaW9uLmMKaW5kZXggYmZlNDJiMC4uOGVjNWQ4NiAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvY29tcHJlc3Npb24uYworKysgYi9mcy9idHJmcy9jb21wcmVzc2lvbi5jCkBAIC0zMzgsNiArMzM4LDcgQEAKIAl1NjQgZmlyc3RfYnl0ZSA9IGRpc2tfc3RhcnQ7CiAJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldjsKIAlpbnQgcmV0OworCWludCBza2lwX3N1bSA9IEJUUkZTX0koaW5vZGUpLT5mbGFncyAmIEJUUkZTX0lOT0RFX05PREFUQVNVTTsKIAogCVdBUk5fT04oc3RhcnQgJiAoKHU2NClQQUdFX0NBQ0hFX1NJWkUgLSAxKSk7CiAJY2IgPSBrbWFsbG9jKGNvbXByZXNzZWRfYmlvX3NpemUocm9vdCwgY29tcHJlc3NlZF9sZW4pLCBHRlBfTk9GUyk7CkBAIC0zOTIsOCArMzkzLDExIEBACiAJCQlyZXQgPSBidHJmc19iaW9fd3FfZW5kX2lvKHJvb3QtPmZzX2luZm8sIGJpbywgMCk7CiAJCQlCVUdfT04ocmV0KTsKIAotCQkJcmV0ID0gYnRyZnNfY3N1bV9vbmVfYmlvKHJvb3QsIGlub2RlLCBiaW8sIHN0YXJ0LCAxKTsKLQkJCUJVR19PTihyZXQpOworCQkJaWYgKCFza2lwX3N1bSkgeworCQkJCXJldCA9IGJ0cmZzX2NzdW1fb25lX2Jpbyhyb290LCBpbm9kZSwgYmlvLAorCQkJCQkJCSBzdGFydCwgMSk7CisJCQkJQlVHX09OKHJldCk7CisJCQl9CiAKIAkJCXJldCA9IGJ0cmZzX21hcF9iaW8ocm9vdCwgV1JJVEUsIGJpbywgMCwgMSk7CiAJCQlCVUdfT04ocmV0KTsKQEAgLTQxOCw4ICs0MjIsMTAgQEAKIAlyZXQgPSBidHJmc19iaW9fd3FfZW5kX2lvKHJvb3QtPmZzX2luZm8sIGJpbywgMCk7CiAJQlVHX09OKHJldCk7CiAKLQlyZXQgPSBidHJmc19jc3VtX29uZV9iaW8ocm9vdCwgaW5vZGUsIGJpbywgc3RhcnQsIDEpOwotCUJVR19PTihyZXQpOworCWlmICghc2tpcF9zdW0pIHsKKwkJcmV0ID0gYnRyZnNfY3N1bV9vbmVfYmlvKHJvb3QsIGlub2RlLCBiaW8sIHN0YXJ0LCAxKTsKKwkJQlVHX09OKHJldCk7CisJfQogCiAJcmV0ID0gYnRyZnNfbWFwX2Jpbyhyb290LCBXUklURSwgYmlvLCAwLCAxKTsKIAlCVUdfT04ocmV0KTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2N0cmVlLmggYi9mcy9idHJmcy9jdHJlZS5oCmluZGV4IDM2NWM0ZTEuLjA0NjkyNjMgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2N0cmVlLmgKKysrIGIvZnMvYnRyZnMvY3RyZWUuaApAQCAtMjQwNiw4ICsyNDA2LDggQEAKIAkJCSBidHJmc19yb290X2l0ZW0gKml0ZW0sIHN0cnVjdCBidHJmc19rZXkgKmtleSk7CiBpbnQgYnRyZnNfZmluZF9kZWFkX3Jvb3RzKHN0cnVjdCBidHJmc19yb290ICpyb290LCB1NjQgb2JqZWN0aWQpOwogaW50IGJ0cmZzX2ZpbmRfb3JwaGFuX3Jvb3RzKHN0cnVjdCBidHJmc19yb290ICp0cmVlX3Jvb3QpOwotaW50IGJ0cmZzX3NldF9yb290X25vZGUoc3RydWN0IGJ0cmZzX3Jvb3RfaXRlbSAqaXRlbSwKLQkJCXN0cnVjdCBleHRlbnRfYnVmZmVyICpub2RlKTsKK3ZvaWQgYnRyZnNfc2V0X3Jvb3Rfbm9kZShzdHJ1Y3QgYnRyZnNfcm9vdF9pdGVtICppdGVtLAorCQkJIHN0cnVjdCBleHRlbnRfYnVmZmVyICpub2RlKTsKIHZvaWQgYnRyZnNfY2hlY2tfYW5kX2luaXRfcm9vdF9pdGVtKHN0cnVjdCBidHJmc19yb290X2l0ZW0gKml0ZW0pOwogCiAvKiBkaXItaXRlbS5jICovCkBAIC0yNTIzLDYgKzI1MjMsMTQgQEAKICNkZWZpbmUgUGFnZUNoZWNrZWQgUGFnZUZzTWlzYwogI2VuZGlmCiAKKy8qIFRoaXMgZm9yY2VzIHJlYWRhaGVhZCBvbiBhIGdpdmVuIHJhbmdlIG9mIGJ5dGVzIGluIGFuIGlub2RlICovCitzdGF0aWMgaW5saW5lIHZvaWQgYnRyZnNfZm9yY2VfcmEoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCisJCQkJICBzdHJ1Y3QgZmlsZV9yYV9zdGF0ZSAqcmEsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgcGdvZmZfdCBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgcmVxX3NpemUpCit7CisJcGFnZV9jYWNoZV9zeW5jX3JlYWRhaGVhZChtYXBwaW5nLCByYSwgZmlsZSwgb2Zmc2V0LCByZXFfc2l6ZSk7Cit9CisKIHN0cnVjdCBpbm9kZSAqYnRyZnNfbG9va3VwX2RlbnRyeShzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5KTsKIGludCBidHJmc19zZXRfaW5vZGVfaW5kZXgoc3RydWN0IGlub2RlICpkaXIsIHU2NCAqaW5kZXgpOwogaW50IGJ0cmZzX3VubGlua19pbm9kZShzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKQEAgLTI1NTEsOSArMjU1OSw2IEBACiBpbnQgYnRyZnNfbWVyZ2VfYmlvX2hvb2soc3RydWN0IHBhZ2UgKnBhZ2UsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAogCQkJIHNpemVfdCBzaXplLCBzdHJ1Y3QgYmlvICpiaW8sIHVuc2lnbmVkIGxvbmcgYmlvX2ZsYWdzKTsKIAotdW5zaWduZWQgbG9uZyBidHJmc19mb3JjZV9yYShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKLQkJCSAgICAgIHN0cnVjdCBmaWxlX3JhX3N0YXRlICpyYSwgc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkgICAgICBwZ29mZl90IG9mZnNldCwgcGdvZmZfdCBsYXN0X2luZGV4KTsKIGludCBidHJmc19wYWdlX21rd3JpdGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCB2bV9mYXVsdCAqdm1mKTsKIGludCBidHJmc19yZWFkcGFnZShzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBhZ2UgKnBhZ2UpOwogdm9pZCBidHJmc19ldmljdF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKQEAgLTI2NDgsMTIgKzI2NTMsMjEgQEAKIC8qIGFjbC5jICovCiAjaWZkZWYgQ09ORklHX0JUUkZTX0ZTX1BPU0lYX0FDTAogc3RydWN0IHBvc2l4X2FjbCAqYnRyZnNfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSk7Ci0jZWxzZQotI2RlZmluZSBidHJmc19nZXRfYWNsIE5VTEwKLSNlbmRpZgogaW50IGJ0cmZzX2luaXRfYWNsKHN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zLAogCQkgICBzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgaW5vZGUgKmRpcik7CiBpbnQgYnRyZnNfYWNsX2NobW9kKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworI2Vsc2UKKyNkZWZpbmUgYnRyZnNfZ2V0X2FjbCBOVUxMCitzdGF0aWMgaW5saW5lIGludCBidHJmc19pbml0X2FjbChzdHJ1Y3QgYnRyZnNfdHJhbnNfaGFuZGxlICp0cmFucywKKwkJCQkgc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludCBidHJmc19hY2xfY2htb2Qoc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgogCiAvKiByZWxvY2F0aW9uLmMgKi8KIGludCBidHJmc19yZWxvY2F0ZV9ibG9ja19ncm91cChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwgdTY0IGdyb3VwX3N0YXJ0KTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2Rpci1pdGVtLmMgYi9mcy9idHJmcy9kaXItaXRlbS5jCmluZGV4IGMzNjBhODQuLjMxZDg0ZTcgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2Rpci1pdGVtLmMKKysrIGIvZnMvYnRyZnMvZGlyLWl0ZW0uYwpAQCAtMTk4LDggKzE5OCw2IEBACiAJc3RydWN0IGJ0cmZzX2tleSBrZXk7CiAJaW50IGluc19sZW4gPSBtb2QgPCAwID8gLTEgOiAwOwogCWludCBjb3cgPSBtb2QgIT0gMDsKLQlzdHJ1Y3QgYnRyZnNfa2V5IGZvdW5kX2tleTsKLQlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbGVhZjsKIAogCWtleS5vYmplY3RpZCA9IGRpcjsKIAlidHJmc19zZXRfa2V5X3R5cGUoJmtleSwgQlRSRlNfRElSX0lURU1fS0VZKTsKQEAgLTIwOSwxOCArMjA3LDcgQEAKIAlyZXQgPSBidHJmc19zZWFyY2hfc2xvdCh0cmFucywgcm9vdCwgJmtleSwgcGF0aCwgaW5zX2xlbiwgY293KTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIEVSUl9QVFIocmV0KTsKLQlpZiAocmV0ID4gMCkgewotCQlpZiAocGF0aC0+c2xvdHNbMF0gPT0gMCkKLQkJCXJldHVybiBOVUxMOwotCQlwYXRoLT5zbG90c1swXS0tOwotCX0KLQotCWxlYWYgPSBwYXRoLT5ub2Rlc1swXTsKLQlidHJmc19pdGVtX2tleV90b19jcHUobGVhZiwgJmZvdW5kX2tleSwgcGF0aC0+c2xvdHNbMF0pOwotCi0JaWYgKGZvdW5kX2tleS5vYmplY3RpZCAhPSBkaXIgfHwKLQkgICAgYnRyZnNfa2V5X3R5cGUoJmZvdW5kX2tleSkgIT0gQlRSRlNfRElSX0lURU1fS0VZIHx8Ci0JICAgIGZvdW5kX2tleS5vZmZzZXQgIT0ga2V5Lm9mZnNldCkKKwlpZiAocmV0ID4gMCkKIAkJcmV0dXJuIE5VTEw7CiAKIAlyZXR1cm4gYnRyZnNfbWF0Y2hfZGlyX2l0ZW1fbmFtZShyb290LCBwYXRoLCBuYW1lLCBuYW1lX2xlbik7CkBAIC0zMTUsOCArMzAyLDYgQEAKIAlzdHJ1Y3QgYnRyZnNfa2V5IGtleTsKIAlpbnQgaW5zX2xlbiA9IG1vZCA8IDAgPyAtMSA6IDA7CiAJaW50IGNvdyA9IG1vZCAhPSAwOwotCXN0cnVjdCBidHJmc19rZXkgZm91bmRfa2V5OwotCXN0cnVjdCBleHRlbnRfYnVmZmVyICpsZWFmOwogCiAJa2V5Lm9iamVjdGlkID0gZGlyOwogCWJ0cmZzX3NldF9rZXlfdHlwZSgma2V5LCBCVFJGU19YQVRUUl9JVEVNX0tFWSk7CkBAIC0zMjQsMTggKzMwOSw3IEBACiAJcmV0ID0gYnRyZnNfc2VhcmNoX3Nsb3QodHJhbnMsIHJvb3QsICZrZXksIHBhdGgsIGluc19sZW4sIGNvdyk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiBFUlJfUFRSKHJldCk7Ci0JaWYgKHJldCA+IDApIHsKLQkJaWYgKHBhdGgtPnNsb3RzWzBdID09IDApCi0JCQlyZXR1cm4gTlVMTDsKLQkJcGF0aC0+c2xvdHNbMF0tLTsKLQl9Ci0KLQlsZWFmID0gcGF0aC0+bm9kZXNbMF07Ci0JYnRyZnNfaXRlbV9rZXlfdG9fY3B1KGxlYWYsICZmb3VuZF9rZXksIHBhdGgtPnNsb3RzWzBdKTsKLQotCWlmIChmb3VuZF9rZXkub2JqZWN0aWQgIT0gZGlyIHx8Ci0JICAgIGJ0cmZzX2tleV90eXBlKCZmb3VuZF9rZXkpICE9IEJUUkZTX1hBVFRSX0lURU1fS0VZIHx8Ci0JICAgIGZvdW5kX2tleS5vZmZzZXQgIT0ga2V5Lm9mZnNldCkKKwlpZiAocmV0ID4gMCkKIAkJcmV0dXJuIE5VTEw7CiAKIAlyZXR1cm4gYnRyZnNfbWF0Y2hfZGlyX2l0ZW1fbmFtZShyb290LCBwYXRoLCBuYW1lLCBuYW1lX2xlbik7CmRpZmYgLS1naXQgYS9mcy9idHJmcy9leHRlbnQtdHJlZS5jIGIvZnMvYnRyZnMvZXh0ZW50LXRyZWUuYwppbmRleCA0ZDA4ZWQ3Li42NmJhYzIyIDEwMDY0NAotLS0gYS9mcy9idHJmcy9leHRlbnQtdHJlZS5jCisrKyBiL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMKQEAgLTY2Myw3ICs2NjMsOSBAQAogCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOwogCiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKLQlCVUdfT04oIXBhdGgpOworCWlmICghcGF0aCkKKwkJcmV0dXJuIC1FTk9NRU07CisKIAlrZXkub2JqZWN0aWQgPSBzdGFydDsKIAlrZXkub2Zmc2V0ID0gbGVuOwogCWJ0cmZzX3NldF9rZXlfdHlwZSgma2V5LCBCVFJGU19FWFRFTlRfSVRFTV9LRVkpOwpAQCAtMzI3Miw2ICszMjc0LDkgQEAKIAl9CiAKIAlyZXQgPSBidHJmc19hbGxvY19jaHVuayh0cmFucywgZXh0ZW50X3Jvb3QsIGZsYWdzKTsKKwlpZiAocmV0IDwgMCAmJiByZXQgIT0gLUVOT1NQQykKKwkJZ290byBvdXQ7CisKIAlzcGluX2xvY2soJnNwYWNlX2luZm8tPmxvY2spOwogCWlmIChyZXQpCiAJCXNwYWNlX2luZm8tPmZ1bGwgPSAxOwpAQCAtMzI4MSw2ICszMjg2LDcgQEAKIAlzcGFjZV9pbmZvLT5mb3JjZV9hbGxvYyA9IENIVU5LX0FMTE9DX05PX0ZPUkNFOwogCXNwYWNlX2luZm8tPmNodW5rX2FsbG9jID0gMDsKIAlzcGluX3VubG9jaygmc3BhY2VfaW5mby0+bG9jayk7CitvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZleHRlbnRfcm9vdC0+ZnNfaW5mby0+Y2h1bmtfbXV0ZXgpOwogCXJldHVybiByZXQ7CiB9CkBAIC00NDU2LDcgKzQ0NjIsOSBAQAogCQkJCXByaW50ayhLRVJOX0VSUiAidW1tLCBnb3QgJWQgYmFjayBmcm9tIHNlYXJjaCIKIAkJCQkgICAgICAgIiwgd2FzIGxvb2tpbmcgZm9yICVsbHVcbiIsIHJldCwKIAkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylieXRlbnIpOwotCQkJCWJ0cmZzX3ByaW50X2xlYWYoZXh0ZW50X3Jvb3QsIHBhdGgtPm5vZGVzWzBdKTsKKwkJCQlpZiAocmV0ID4gMCkKKwkJCQkJYnRyZnNfcHJpbnRfbGVhZihleHRlbnRfcm9vdCwKKwkJCQkJCQkgcGF0aC0+bm9kZXNbMF0pOwogCQkJfQogCQkJQlVHX09OKHJldCk7CiAJCQlleHRlbnRfc2xvdCA9IHBhdGgtPnNsb3RzWzBdOwpAQCAtNTA3Myw3ICs1MDgxLDkgQEAKIAkJCSAqIGdyb3VwIGlzIGRvZXMgcG9pbnQgdG8gYW5kIHRyeSBhZ2FpbgogCQkJICovCiAJCQlpZiAoIWxhc3RfcHRyX2xvb3AgJiYgbGFzdF9wdHItPmJsb2NrX2dyb3VwICYmCi0JCQkgICAgbGFzdF9wdHItPmJsb2NrX2dyb3VwICE9IGJsb2NrX2dyb3VwKSB7CisJCQkgICAgbGFzdF9wdHItPmJsb2NrX2dyb3VwICE9IGJsb2NrX2dyb3VwICYmCisJCQkgICAgaW5kZXggPD0KKwkJCQkgZ2V0X2Jsb2NrX2dyb3VwX2luZGV4KGxhc3RfcHRyLT5ibG9ja19ncm91cCkpIHsKIAogCQkJCWJ0cmZzX3B1dF9ibG9ja19ncm91cChibG9ja19ncm91cCk7CiAJCQkJYmxvY2tfZ3JvdXAgPSBsYXN0X3B0ci0+YmxvY2tfZ3JvdXA7CkBAIC01NTAxLDcgKzU1MTEsOCBAQAogCXUzMiBzaXplID0gc2l6ZW9mKCpleHRlbnRfaXRlbSkgKyBzaXplb2YoKmJsb2NrX2luZm8pICsgc2l6ZW9mKCppcmVmKTsKIAogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7Ci0JQlVHX09OKCFwYXRoKTsKKwlpZiAoIXBhdGgpCisJCXJldHVybiAtRU5PTUVNOwogCiAJcGF0aC0+bGVhdmVfc3Bpbm5pbmcgPSAxOwogCXJldCA9IGJ0cmZzX2luc2VydF9lbXB0eV9pdGVtKHRyYW5zLCBmc19pbmZvLT5leHRlbnRfcm9vdCwgcGF0aCwKQEAgLTYyNzIsMTAgKzYyODMsMTQgQEAKIAlpbnQgbGV2ZWw7CiAKIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwotCUJVR19PTighcGF0aCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCXdjID0ga3phbGxvYyhzaXplb2YoKndjKSwgR0ZQX05PRlMpOwotCUJVR19PTighd2MpOworCWlmICghd2MpIHsKKwkJYnRyZnNfZnJlZV9wYXRoKHBhdGgpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CiAKIAl0cmFucyA9IGJ0cmZzX3N0YXJ0X3RyYW5zYWN0aW9uKHRyZWVfcm9vdCwgMCk7CiAJQlVHX09OKElTX0VSUih0cmFucykpOwpAQCAtNjUzOCw4ICs2NTUzLDYgQEAKIAl1NjQgbWluX2FsbG9jYWJsZV9ieXRlczsKIAlpbnQgcmV0ID0gLUVOT1NQQzsKIAotCWlmIChjYWNoZS0+cm8pCi0JCXJldHVybiAwOwogCiAJLyoKIAkgKiBXZSBuZWVkIHNvbWUgbWV0YWRhdGEgc3BhY2UgYW5kIHN5c3RlbSBtZXRhZGF0YSBzcGFjZSBmb3IKQEAgLTY1NTUsNiArNjU2OCwxMiBAQAogCiAJc3Bpbl9sb2NrKCZzaW5mby0+bG9jayk7CiAJc3Bpbl9sb2NrKCZjYWNoZS0+bG9jayk7CisKKwlpZiAoY2FjaGUtPnJvKSB7CisJCXJldCA9IDA7CisJCWdvdG8gb3V0OworCX0KKwogCW51bV9ieXRlcyA9IGNhY2hlLT5rZXkub2Zmc2V0IC0gY2FjaGUtPnJlc2VydmVkIC0gY2FjaGUtPnBpbm5lZCAtCiAJCSAgICBjYWNoZS0+Ynl0ZXNfc3VwZXIgLSBidHJmc19ibG9ja19ncm91cF91c2VkKCZjYWNoZS0+aXRlbSk7CiAKQEAgLTY1NjgsNyArNjU4Nyw3IEBACiAJCWNhY2hlLT5ybyA9IDE7CiAJCXJldCA9IDA7CiAJfQotCitvdXQ6CiAJc3Bpbl91bmxvY2soJmNhY2hlLT5sb2NrKTsKIAlzcGluX3VubG9jaygmc2luZm8tPmxvY2spOwogCXJldHVybiByZXQ7CkBAIC03MTgzLDExICs3MjAyLDE1IEBACiAJc3Bpbl91bmxvY2soJmNsdXN0ZXItPnJlZmlsbF9sb2NrKTsKIAogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7Ci0JQlVHX09OKCFwYXRoKTsKKwlpZiAoIXBhdGgpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQogCiAJaW5vZGUgPSBsb29rdXBfZnJlZV9zcGFjZV9pbm9kZShyb290LCBibG9ja19ncm91cCwgcGF0aCk7CiAJaWYgKCFJU19FUlIoaW5vZGUpKSB7Ci0JCWJ0cmZzX29ycGhhbl9hZGQodHJhbnMsIGlub2RlKTsKKwkJcmV0ID0gYnRyZnNfb3JwaGFuX2FkZCh0cmFucywgaW5vZGUpOworCQlCVUdfT04ocmV0KTsKIAkJY2xlYXJfbmxpbmsoaW5vZGUpOwogCQkvKiBPbmUgZm9yIHRoZSBibG9jayBncm91cHMgcmVmICovCiAJCXNwaW5fbG9jaygmYmxvY2tfZ3JvdXAtPmxvY2spOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZXh0ZW50X2lvLmMgYi9mcy9idHJmcy9leHRlbnRfaW8uYwppbmRleCAwNjdiMTc0Li5kNDE4MTY0IDEwMDY0NAotLS0gYS9mcy9idHJmcy9leHRlbnRfaW8uYworKysgYi9mcy9idHJmcy9leHRlbnRfaW8uYwpAQCAtMjU0LDE0ICsyNTQsMTQgQEAKICAqCiAgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgd2l0aCB0aGUgdHJlZSBsb2NrIGhlbGQuCiAgKi8KLXN0YXRpYyBpbnQgbWVyZ2Vfc3RhdGUoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAotCQkgICAgICAgc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUpCitzdGF0aWMgdm9pZCBtZXJnZV9zdGF0ZShzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCisJCSAgICAgICAgc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUpCiB7CiAJc3RydWN0IGV4dGVudF9zdGF0ZSAqb3RoZXI7CiAJc3RydWN0IHJiX25vZGUgKm90aGVyX25vZGU7CiAKIAlpZiAoc3RhdGUtPnN0YXRlICYgKEVYVEVOVF9JT0JJVFMgfCBFWFRFTlRfQk9VTkRBUlkpKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuOwogCiAJb3RoZXJfbm9kZSA9IHJiX3ByZXYoJnN0YXRlLT5yYl9ub2RlKTsKIAlpZiAob3RoZXJfbm9kZSkgewpAQCAtMjg3LDE5ICsyODcsMTMgQEAKIAkJCWZyZWVfZXh0ZW50X3N0YXRlKG90aGVyKTsKIAkJfQogCX0KLQotCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNldF9zdGF0ZV9jYihzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsCitzdGF0aWMgdm9pZCBzZXRfc3RhdGVfY2Ioc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAogCQkJIHN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlLCBpbnQgKmJpdHMpCiB7Ci0JaWYgKHRyZWUtPm9wcyAmJiB0cmVlLT5vcHMtPnNldF9iaXRfaG9vaykgewotCQlyZXR1cm4gdHJlZS0+b3BzLT5zZXRfYml0X2hvb2sodHJlZS0+bWFwcGluZy0+aG9zdCwKLQkJCQkJICAgICAgIHN0YXRlLCBiaXRzKTsKLQl9Ci0KLQlyZXR1cm4gMDsKKwlpZiAodHJlZS0+b3BzICYmIHRyZWUtPm9wcy0+c2V0X2JpdF9ob29rKQorCQl0cmVlLT5vcHMtPnNldF9iaXRfaG9vayh0cmVlLT5tYXBwaW5nLT5ob3N0LCBzdGF0ZSwgYml0cyk7CiB9CiAKIHN0YXRpYyB2b2lkIGNsZWFyX3N0YXRlX2NiKHN0cnVjdCBleHRlbnRfaW9fdHJlZSAqdHJlZSwKQEAgLTMwOSw2ICszMDMsOSBAQAogCQl0cmVlLT5vcHMtPmNsZWFyX2JpdF9ob29rKHRyZWUtPm1hcHBpbmctPmhvc3QsIHN0YXRlLCBiaXRzKTsKIH0KIAorc3RhdGljIHZvaWQgc2V0X3N0YXRlX2JpdHMoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAorCQkJICAgc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUsIGludCAqYml0cyk7CisKIC8qCiAgKiBpbnNlcnQgYW4gZXh0ZW50X3N0YXRlIHN0cnVjdCBpbnRvIHRoZSB0cmVlLiAgJ2JpdHMnIGFyZSBzZXQgb24gdGhlCiAgKiBzdHJ1Y3QgYmVmb3JlIGl0IGlzIGluc2VydGVkLgpAQCAtMzI0LDggKzMyMSw2IEBACiAJCQlpbnQgKmJpdHMpCiB7CiAJc3RydWN0IHJiX25vZGUgKm5vZGU7Ci0JaW50IGJpdHNfdG9fc2V0ID0gKmJpdHMgJiB+RVhURU5UX0NUTEJJVFM7Ci0JaW50IHJldDsKIAogCWlmIChlbmQgPCBzdGFydCkgewogCQlwcmludGsoS0VSTl9FUlIgImJ0cmZzIGVuZCA8IHN0YXJ0ICVsbHUgJWxsdVxuIiwKQEAgLTMzNSwxMyArMzMwLDkgQEAKIAl9CiAJc3RhdGUtPnN0YXJ0ID0gc3RhcnQ7CiAJc3RhdGUtPmVuZCA9IGVuZDsKLQlyZXQgPSBzZXRfc3RhdGVfY2IodHJlZSwgc3RhdGUsIGJpdHMpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CiAKLQlpZiAoYml0c190b19zZXQgJiBFWFRFTlRfRElSVFkpCi0JCXRyZWUtPmRpcnR5X2J5dGVzICs9IGVuZCAtIHN0YXJ0ICsgMTsKLQlzdGF0ZS0+c3RhdGUgfD0gYml0c190b19zZXQ7CisJc2V0X3N0YXRlX2JpdHModHJlZSwgc3RhdGUsIGJpdHMpOworCiAJbm9kZSA9IHRyZWVfaW5zZXJ0KCZ0cmVlLT5zdGF0ZSwgZW5kLCAmc3RhdGUtPnJiX25vZGUpOwogCWlmIChub2RlKSB7CiAJCXN0cnVjdCBleHRlbnRfc3RhdGUgKmZvdW5kOwpAQCAtMzU3LDEzICszNDgsMTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzcGxpdF9jYihzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHN0cnVjdCBleHRlbnRfc3RhdGUgKm9yaWcsCitzdGF0aWMgdm9pZCBzcGxpdF9jYihzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHN0cnVjdCBleHRlbnRfc3RhdGUgKm9yaWcsCiAJCSAgICAgdTY0IHNwbGl0KQogewogCWlmICh0cmVlLT5vcHMgJiYgdHJlZS0+b3BzLT5zcGxpdF9leHRlbnRfaG9vaykKLQkJcmV0dXJuIHRyZWUtPm9wcy0+c3BsaXRfZXh0ZW50X2hvb2sodHJlZS0+bWFwcGluZy0+aG9zdCwKLQkJCQkJCSAgICBvcmlnLCBzcGxpdCk7Ci0JcmV0dXJuIDA7CisJCXRyZWUtPm9wcy0+c3BsaXRfZXh0ZW50X2hvb2sodHJlZS0+bWFwcGluZy0+aG9zdCwgb3JpZywgc3BsaXQpOwogfQogCiAvKgpAQCAtNjU5LDM0ICs2NDgsMjUgQEAKIAkJaWYgKHN0YXJ0ID4gZW5kKQogCQkJYnJlYWs7CiAKLQkJaWYgKG5lZWRfcmVzY2hlZCgpKSB7Ci0JCQlzcGluX3VubG9jaygmdHJlZS0+bG9jayk7Ci0JCQljb25kX3Jlc2NoZWQoKTsKLQkJCXNwaW5fbG9jaygmdHJlZS0+bG9jayk7Ci0JCX0KKwkJY29uZF9yZXNjaGVkX2xvY2soJnRyZWUtPmxvY2spOwogCX0KIG91dDoKIAlzcGluX3VubG9jaygmdHJlZS0+bG9jayk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2V0X3N0YXRlX2JpdHMoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAorc3RhdGljIHZvaWQgc2V0X3N0YXRlX2JpdHMoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLAogCQkJICAgc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUsCiAJCQkgICBpbnQgKmJpdHMpCiB7Ci0JaW50IHJldDsKIAlpbnQgYml0c190b19zZXQgPSAqYml0cyAmIH5FWFRFTlRfQ1RMQklUUzsKIAotCXJldCA9IHNldF9zdGF0ZV9jYih0cmVlLCBzdGF0ZSwgYml0cyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKKwlzZXRfc3RhdGVfY2IodHJlZSwgc3RhdGUsIGJpdHMpOwogCWlmICgoYml0c190b19zZXQgJiBFWFRFTlRfRElSVFkpICYmICEoc3RhdGUtPnN0YXRlICYgRVhURU5UX0RJUlRZKSkgewogCQl1NjQgcmFuZ2UgPSBzdGF0ZS0+ZW5kIC0gc3RhdGUtPnN0YXJ0ICsgMTsKIAkJdHJlZS0+ZGlydHlfYnl0ZXMgKz0gcmFuZ2U7CiAJfQogCXN0YXRlLT5zdGF0ZSB8PSBiaXRzX3RvX3NldDsKLQotCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBjYWNoZV9zdGF0ZShzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZSwKQEAgLTc3OSw5ICs3NTksNyBAQAogCQkJZ290byBvdXQ7CiAJCX0KIAotCQllcnIgPSBzZXRfc3RhdGVfYml0cyh0cmVlLCBzdGF0ZSwgJmJpdHMpOwotCQlpZiAoZXJyKQotCQkJZ290byBvdXQ7CisJCXNldF9zdGF0ZV9iaXRzKHRyZWUsIHN0YXRlLCAmYml0cyk7CiAKIAkJY2FjaGVfc3RhdGUoc3RhdGUsIGNhY2hlZF9zdGF0ZSk7CiAJCW1lcmdlX3N0YXRlKHRyZWUsIHN0YXRlKTsKQEAgLTgzMCw5ICs4MDgsNyBAQAogCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7CiAJCWlmIChzdGF0ZS0+ZW5kIDw9IGVuZCkgewotCQkJZXJyID0gc2V0X3N0YXRlX2JpdHModHJlZSwgc3RhdGUsICZiaXRzKTsKLQkJCWlmIChlcnIpCi0JCQkJZ290byBvdXQ7CisJCQlzZXRfc3RhdGVfYml0cyh0cmVlLCBzdGF0ZSwgJmJpdHMpOwogCQkJY2FjaGVfc3RhdGUoc3RhdGUsIGNhY2hlZF9zdGF0ZSk7CiAJCQltZXJnZV9zdGF0ZSh0cmVlLCBzdGF0ZSk7CiAJCQlpZiAobGFzdF9lbmQgPT0gKHU2NCktMSkKQEAgLTg5MywxMSArODY5LDcgQEAKIAkJZXJyID0gc3BsaXRfc3RhdGUodHJlZSwgc3RhdGUsIHByZWFsbG9jLCBlbmQgKyAxKTsKIAkJQlVHX09OKGVyciA9PSAtRUVYSVNUKTsKIAotCQllcnIgPSBzZXRfc3RhdGVfYml0cyh0cmVlLCBwcmVhbGxvYywgJmJpdHMpOwotCQlpZiAoZXJyKSB7Ci0JCQlwcmVhbGxvYyA9IE5VTEw7Ci0JCQlnb3RvIG91dDsKLQkJfQorCQlzZXRfc3RhdGVfYml0cyh0cmVlLCBwcmVhbGxvYywgJmJpdHMpOwogCQljYWNoZV9zdGF0ZShwcmVhbGxvYywgY2FjaGVkX3N0YXRlKTsKIAkJbWVyZ2Vfc3RhdGUodHJlZSwgcHJlYWxsb2MpOwogCQlwcmVhbGxvYyA9IE5VTEw7CkBAIC0xMDU5LDQ2ICsxMDMxLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIGZpbmQgdGhlIGZpcnN0IG9mZnNldCBpbiB0aGUgaW8gdHJlZSB3aXRoICdiaXRzJyBzZXQuIHplcm8gaXMKLSAqIHJldHVybmVkIGlmIHdlIGZpbmQgc29tZXRoaW5nLCBhbmQgKnN0YXJ0X3JldCBhbmQgKmVuZF9yZXQgYXJlCi0gKiBzZXQgdG8gcmVmbGVjdCB0aGUgc3RhdGUgc3RydWN0IHRoYXQgd2FzIGZvdW5kLgotICoKLSAqIElmIG5vdGhpbmcgd2FzIGZvdW5kLCAxIGlzIHJldHVybmVkLCA8IDAgb24gZXJyb3IKLSAqLwotaW50IGZpbmRfZmlyc3RfZXh0ZW50X2JpdChzdHJ1Y3QgZXh0ZW50X2lvX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwKLQkJCSAgdTY0ICpzdGFydF9yZXQsIHU2NCAqZW5kX3JldCwgaW50IGJpdHMpCi17Ci0Jc3RydWN0IHJiX25vZGUgKm5vZGU7Ci0Jc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGU7Ci0JaW50IHJldCA9IDE7Ci0KLQlzcGluX2xvY2soJnRyZWUtPmxvY2spOwotCS8qCi0JICogdGhpcyBzZWFyY2ggd2lsbCBmaW5kIGFsbCB0aGUgZXh0ZW50cyB0aGF0IGVuZCBhZnRlcgotCSAqIG91ciByYW5nZSBzdGFydHMuCi0JICovCi0Jbm9kZSA9IHRyZWVfc2VhcmNoKHRyZWUsIHN0YXJ0KTsKLQlpZiAoIW5vZGUpCi0JCWdvdG8gb3V0OwotCi0Jd2hpbGUgKDEpIHsKLQkJc3RhdGUgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgZXh0ZW50X3N0YXRlLCByYl9ub2RlKTsKLQkJaWYgKHN0YXRlLT5lbmQgPj0gc3RhcnQgJiYgKHN0YXRlLT5zdGF0ZSAmIGJpdHMpKSB7Ci0JCQkqc3RhcnRfcmV0ID0gc3RhdGUtPnN0YXJ0OwotCQkJKmVuZF9yZXQgPSBzdGF0ZS0+ZW5kOwotCQkJcmV0ID0gMDsKLQkJCWJyZWFrOwotCQl9Ci0JCW5vZGUgPSByYl9uZXh0KG5vZGUpOwotCQlpZiAoIW5vZGUpCi0JCQlicmVhazsKLQl9Ci1vdXQ6Ci0Jc3Bpbl91bmxvY2soJnRyZWUtPmxvY2spOwotCXJldHVybiByZXQ7Ci19Ci0KIC8qIGZpbmQgdGhlIGZpcnN0IHN0YXRlIHN0cnVjdCB3aXRoICdiaXRzJyBzZXQgYWZ0ZXIgJ3N0YXJ0JywgYW5kCiAgKiByZXR1cm4gaXQuICB0cmVlLT5sb2NrIG11c3QgYmUgaGVsZC4gIE5VTEwgd2lsbCByZXR1cm5lZCBpZgogICogbm90aGluZyB3YXMgZm91bmQgYWZ0ZXIgJ3N0YXJ0JwpAQCAtMTEzMSw2ICsxMDYzLDMwIEBACiB9CiAKIC8qCisgKiBmaW5kIHRoZSBmaXJzdCBvZmZzZXQgaW4gdGhlIGlvIHRyZWUgd2l0aCAnYml0cycgc2V0LiB6ZXJvIGlzCisgKiByZXR1cm5lZCBpZiB3ZSBmaW5kIHNvbWV0aGluZywgYW5kICpzdGFydF9yZXQgYW5kICplbmRfcmV0IGFyZQorICogc2V0IHRvIHJlZmxlY3QgdGhlIHN0YXRlIHN0cnVjdCB0aGF0IHdhcyBmb3VuZC4KKyAqCisgKiBJZiBub3RoaW5nIHdhcyBmb3VuZCwgMSBpcyByZXR1cm5lZCwgPCAwIG9uIGVycm9yCisgKi8KK2ludCBmaW5kX2ZpcnN0X2V4dGVudF9iaXQoc3RydWN0IGV4dGVudF9pb190cmVlICp0cmVlLCB1NjQgc3RhcnQsCisJCQkgIHU2NCAqc3RhcnRfcmV0LCB1NjQgKmVuZF9yZXQsIGludCBiaXRzKQoreworCXN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlOworCWludCByZXQgPSAxOworCisJc3Bpbl9sb2NrKCZ0cmVlLT5sb2NrKTsKKwlzdGF0ZSA9IGZpbmRfZmlyc3RfZXh0ZW50X2JpdF9zdGF0ZSh0cmVlLCBzdGFydCwgYml0cyk7CisJaWYgKHN0YXRlKSB7CisJCSpzdGFydF9yZXQgPSBzdGF0ZS0+c3RhcnQ7CisJCSplbmRfcmV0ID0gc3RhdGUtPmVuZDsKKwkJcmV0ID0gMDsKKwl9CisJc3Bpbl91bmxvY2soJnRyZWUtPmxvY2spOworCXJldHVybiByZXQ7Cit9CisKKy8qCiAgKiBmaW5kIGEgY29udGlndW91cyByYW5nZSBvZiBieXRlcyBpbiB0aGUgZmlsZSBtYXJrZWQgYXMgZGVsYWxsb2MsIG5vdAogICogbW9yZSB0aGFuICdtYXhfYnl0ZXMnLiAgc3RhcnQgYW5kIGVuZCBhcmUgdXNlZCB0byByZXR1cm4gdGhlIHJhbmdlLAogICoKQEAgLTI1NDYsNyArMjUwMiw2IEBACiAJCQkgIHN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQogewogCWludCByZXQ7Ci0Jc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlLT5tYXBwaW5nOwogCXN0cnVjdCBleHRlbnRfcGFnZV9kYXRhIGVwZCA9IHsKIAkJLmJpbyA9IE5VTEwsCiAJCS50cmVlID0gdHJlZSwKQEAgLTI1NTQsMTcgKzI1MDksOSBAQAogCQkuZXh0ZW50X2xvY2tlZCA9IDAsCiAJCS5zeW5jX2lvID0gd2JjLT5zeW5jX21vZGUgPT0gV0JfU1lOQ19BTEwsCiAJfTsKLQlzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgd2JjX3dyaXRlcGFnZXMgPSB7Ci0JCS5zeW5jX21vZGUJPSB3YmMtPnN5bmNfbW9kZSwKLQkJLm5yX3RvX3dyaXRlCT0gNjQsCi0JCS5yYW5nZV9zdGFydAk9IHBhZ2Vfb2Zmc2V0KHBhZ2UpICsgUEFHRV9DQUNIRV9TSVpFLAotCQkucmFuZ2VfZW5kCT0gKGxvZmZfdCktMSwKLQl9OwogCiAJcmV0ID0gX19leHRlbnRfd3JpdGVwYWdlKHBhZ2UsIHdiYywgJmVwZCk7CiAKLQlleHRlbnRfd3JpdGVfY2FjaGVfcGFnZXModHJlZSwgbWFwcGluZywgJndiY193cml0ZXBhZ2VzLAotCQkJCSBfX2V4dGVudF93cml0ZXBhZ2UsICZlcGQsIGZsdXNoX3dyaXRlX2Jpbyk7CiAJZmx1c2hfZXBkX3dyaXRlX2JpbygmZXBkKTsKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZXh0ZW50X2lvLmggYi9mcy9idHJmcy9leHRlbnRfaW8uaAppbmRleCAyMWE3Y2E5Li43YjJmMGMzIDEwMDY0NAotLS0gYS9mcy9idHJmcy9leHRlbnRfaW8uaAorKysgYi9mcy9idHJmcy9leHRlbnRfaW8uaApAQCAtNzYsMTUgKzc2LDE1IEBACiAJCQkJICAgIHN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlKTsKIAlpbnQgKCp3cml0ZXBhZ2VfZW5kX2lvX2hvb2spKHN0cnVjdCBwYWdlICpwYWdlLCB1NjQgc3RhcnQsIHU2NCBlbmQsCiAJCQkJICAgICAgc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUsIGludCB1cHRvZGF0ZSk7Ci0JaW50ICgqc2V0X2JpdF9ob29rKShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZSwKLQkJCSAgICBpbnQgKmJpdHMpOwotCWludCAoKmNsZWFyX2JpdF9ob29rKShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZSwKLQkJCSAgICAgIGludCAqYml0cyk7Ci0JaW50ICgqbWVyZ2VfZXh0ZW50X2hvb2spKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJIHN0cnVjdCBleHRlbnRfc3RhdGUgKm5ldywKLQkJCQkgc3RydWN0IGV4dGVudF9zdGF0ZSAqb3RoZXIpOwotCWludCAoKnNwbGl0X2V4dGVudF9ob29rKShzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCSBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpvcmlnLCB1NjQgc3BsaXQpOworCXZvaWQgKCpzZXRfYml0X2hvb2spKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlLAorCQkJICAgICBpbnQgKmJpdHMpOworCXZvaWQgKCpjbGVhcl9iaXRfaG9vaykoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUsCisJCQkgICAgICAgaW50ICpiaXRzKTsKKwl2b2lkICgqbWVyZ2VfZXh0ZW50X2hvb2spKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpuZXcsCisJCQkJICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpvdGhlcik7CisJdm9pZCAoKnNwbGl0X2V4dGVudF9ob29rKShzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgc3RydWN0IGV4dGVudF9zdGF0ZSAqb3JpZywgdTY0IHNwbGl0KTsKIAlpbnQgKCp3cml0ZV9jYWNoZV9wYWdlc19sb2NrX2hvb2spKHN0cnVjdCBwYWdlICpwYWdlKTsKIH07CiAKQEAgLTEwOCw4ICsxMDgsNiBAQAogCXdhaXRfcXVldWVfaGVhZF90IHdxOwogCWF0b21pY190IHJlZnM7CiAJdW5zaWduZWQgbG9uZyBzdGF0ZTsKLQl1NjQgc3BsaXRfc3RhcnQ7Ci0JdTY0IHNwbGl0X2VuZDsKIAogCS8qIGZvciB1c2UgYnkgdGhlIEZTICovCiAJdTY0IHByaXZhdGU7CmRpZmYgLS1naXQgYS9mcy9idHJmcy9leHRlbnRfbWFwLmMgYi9mcy9idHJmcy9leHRlbnRfbWFwLmMKaW5kZXggMmQwNDEwMy4uN2M5N2IzMyAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZXh0ZW50X21hcC5jCisrKyBiL2ZzL2J0cmZzL2V4dGVudF9tYXAuYwpAQCAtMTgzLDIyICsxODMsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHVucGluX2V4dGVudF9jYWNoZShzdHJ1Y3QgZXh0ZW50X21hcF90cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBsZW4pCitzdGF0aWMgdm9pZCB0cnlfbWVyZ2VfbWFwKHN0cnVjdCBleHRlbnRfbWFwX3RyZWUgKnRyZWUsIHN0cnVjdCBleHRlbnRfbWFwICplbSkKIHsKLQlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgZXh0ZW50X21hcCAqbWVyZ2UgPSBOVUxMOwogCXN0cnVjdCByYl9ub2RlICpyYjsKLQlzdHJ1Y3QgZXh0ZW50X21hcCAqZW07Ci0KLQl3cml0ZV9sb2NrKCZ0cmVlLT5sb2NrKTsKLQllbSA9IGxvb2t1cF9leHRlbnRfbWFwcGluZyh0cmVlLCBzdGFydCwgbGVuKTsKLQotCVdBUk5fT04oIWVtIHx8IGVtLT5zdGFydCAhPSBzdGFydCk7Ci0KLQlpZiAoIWVtKQotCQlnb3RvIG91dDsKLQotCWNsZWFyX2JpdChFWFRFTlRfRkxBR19QSU5ORUQsICZlbS0+ZmxhZ3MpOwogCiAJaWYgKGVtLT5zdGFydCAhPSAwKSB7CiAJCXJiID0gcmJfcHJldigmZW0tPnJiX25vZGUpOwpAQCAtMjI1LDYgKzIxMywyNCBAQAogCQltZXJnZS0+aW5fdHJlZSA9IDA7CiAJCWZyZWVfZXh0ZW50X21hcChtZXJnZSk7CiAJfQorfQorCitpbnQgdW5waW5fZXh0ZW50X2NhY2hlKHN0cnVjdCBleHRlbnRfbWFwX3RyZWUgKnRyZWUsIHU2NCBzdGFydCwgdTY0IGxlbikKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgZXh0ZW50X21hcCAqZW07CisKKwl3cml0ZV9sb2NrKCZ0cmVlLT5sb2NrKTsKKwllbSA9IGxvb2t1cF9leHRlbnRfbWFwcGluZyh0cmVlLCBzdGFydCwgbGVuKTsKKworCVdBUk5fT04oIWVtIHx8IGVtLT5zdGFydCAhPSBzdGFydCk7CisKKwlpZiAoIWVtKQorCQlnb3RvIG91dDsKKworCWNsZWFyX2JpdChFWFRFTlRfRkxBR19QSU5ORUQsICZlbS0+ZmxhZ3MpOworCisJdHJ5X21lcmdlX21hcCh0cmVlLCBlbSk7CiAKIAlmcmVlX2V4dGVudF9tYXAoZW0pOwogb3V0OgpAQCAtMjQ3LDcgKzI1Myw2IEBACiAJCSAgICAgICBzdHJ1Y3QgZXh0ZW50X21hcCAqZW0pCiB7CiAJaW50IHJldCA9IDA7Ci0Jc3RydWN0IGV4dGVudF9tYXAgKm1lcmdlID0gTlVMTDsKIAlzdHJ1Y3QgcmJfbm9kZSAqcmI7CiAJc3RydWN0IGV4dGVudF9tYXAgKmV4aXN0OwogCkBAIC0yNjMsMzAgKzI2OCw4IEBACiAJCWdvdG8gb3V0OwogCX0KIAlhdG9taWNfaW5jKCZlbS0+cmVmcyk7Ci0JaWYgKGVtLT5zdGFydCAhPSAwKSB7Ci0JCXJiID0gcmJfcHJldigmZW0tPnJiX25vZGUpOwotCQlpZiAocmIpCi0JCQltZXJnZSA9IHJiX2VudHJ5KHJiLCBzdHJ1Y3QgZXh0ZW50X21hcCwgcmJfbm9kZSk7Ci0JCWlmIChyYiAmJiBtZXJnYWJsZV9tYXBzKG1lcmdlLCBlbSkpIHsKLQkJCWVtLT5zdGFydCA9IG1lcmdlLT5zdGFydDsKLQkJCWVtLT5sZW4gKz0gbWVyZ2UtPmxlbjsKLQkJCWVtLT5ibG9ja19sZW4gKz0gbWVyZ2UtPmJsb2NrX2xlbjsKLQkJCWVtLT5ibG9ja19zdGFydCA9IG1lcmdlLT5ibG9ja19zdGFydDsKLQkJCW1lcmdlLT5pbl90cmVlID0gMDsKLQkJCXJiX2VyYXNlKCZtZXJnZS0+cmJfbm9kZSwgJnRyZWUtPm1hcCk7Ci0JCQlmcmVlX2V4dGVudF9tYXAobWVyZ2UpOwotCQl9Ci0JIH0KLQlyYiA9IHJiX25leHQoJmVtLT5yYl9ub2RlKTsKLQlpZiAocmIpCi0JCW1lcmdlID0gcmJfZW50cnkocmIsIHN0cnVjdCBleHRlbnRfbWFwLCByYl9ub2RlKTsKLQlpZiAocmIgJiYgbWVyZ2FibGVfbWFwcyhlbSwgbWVyZ2UpKSB7Ci0JCWVtLT5sZW4gKz0gbWVyZ2UtPmxlbjsKLQkJZW0tPmJsb2NrX2xlbiArPSBtZXJnZS0+bGVuOwotCQlyYl9lcmFzZSgmbWVyZ2UtPnJiX25vZGUsICZ0cmVlLT5tYXApOwotCQltZXJnZS0+aW5fdHJlZSA9IDA7Ci0JCWZyZWVfZXh0ZW50X21hcChtZXJnZSk7Ci0JfQorCisJdHJ5X21lcmdlX21hcCh0cmVlLCBlbSk7CiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTI5OSw2ICsyODIsMzQgQEAKIAlyZXR1cm4gc3RhcnQgKyBsZW47CiB9CiAKK3N0cnVjdCBleHRlbnRfbWFwICpfX2xvb2t1cF9leHRlbnRfbWFwcGluZyhzdHJ1Y3QgZXh0ZW50X21hcF90cmVlICp0cmVlLAorCQkJCQkgICB1NjQgc3RhcnQsIHU2NCBsZW4sIGludCBzdHJpY3QpCit7CisJc3RydWN0IGV4dGVudF9tYXAgKmVtOworCXN0cnVjdCByYl9ub2RlICpyYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICpwcmV2ID0gTlVMTDsKKwlzdHJ1Y3QgcmJfbm9kZSAqbmV4dCA9IE5VTEw7CisJdTY0IGVuZCA9IHJhbmdlX2VuZChzdGFydCwgbGVuKTsKKworCXJiX25vZGUgPSBfX3RyZWVfc2VhcmNoKCZ0cmVlLT5tYXAsIHN0YXJ0LCAmcHJldiwgJm5leHQpOworCWlmICghcmJfbm9kZSkgeworCQlpZiAocHJldikKKwkJCXJiX25vZGUgPSBwcmV2OworCQllbHNlIGlmIChuZXh0KQorCQkJcmJfbm9kZSA9IG5leHQ7CisJCWVsc2UKKwkJCXJldHVybiBOVUxMOworCX0KKworCWVtID0gcmJfZW50cnkocmJfbm9kZSwgc3RydWN0IGV4dGVudF9tYXAsIHJiX25vZGUpOworCisJaWYgKHN0cmljdCAmJiAhKGVuZCA+IGVtLT5zdGFydCAmJiBzdGFydCA8IGV4dGVudF9tYXBfZW5kKGVtKSkpCisJCXJldHVybiBOVUxMOworCisJYXRvbWljX2luYygmZW0tPnJlZnMpOworCXJldHVybiBlbTsKK30KKwogLyoqCiAgKiBsb29rdXBfZXh0ZW50X21hcHBpbmcgLSBsb29rdXAgZXh0ZW50X21hcAogICogQHRyZWU6CXRyZWUgdG8gbG9va3VwIGluCkBAIC0zMTMsNDIgKzMyNCw3IEBACiBzdHJ1Y3QgZXh0ZW50X21hcCAqbG9va3VwX2V4dGVudF9tYXBwaW5nKHN0cnVjdCBleHRlbnRfbWFwX3RyZWUgKnRyZWUsCiAJCQkJCSB1NjQgc3RhcnQsIHU2NCBsZW4pCiB7Ci0Jc3RydWN0IGV4dGVudF9tYXAgKmVtOwotCXN0cnVjdCByYl9ub2RlICpyYl9ub2RlOwotCXN0cnVjdCByYl9ub2RlICpwcmV2ID0gTlVMTDsKLQlzdHJ1Y3QgcmJfbm9kZSAqbmV4dCA9IE5VTEw7Ci0JdTY0IGVuZCA9IHJhbmdlX2VuZChzdGFydCwgbGVuKTsKLQotCXJiX25vZGUgPSBfX3RyZWVfc2VhcmNoKCZ0cmVlLT5tYXAsIHN0YXJ0LCAmcHJldiwgJm5leHQpOwotCWlmICghcmJfbm9kZSAmJiBwcmV2KSB7Ci0JCWVtID0gcmJfZW50cnkocHJldiwgc3RydWN0IGV4dGVudF9tYXAsIHJiX25vZGUpOwotCQlpZiAoZW5kID4gZW0tPnN0YXJ0ICYmIHN0YXJ0IDwgZXh0ZW50X21hcF9lbmQoZW0pKQotCQkJZ290byBmb3VuZDsKLQl9Ci0JaWYgKCFyYl9ub2RlICYmIG5leHQpIHsKLQkJZW0gPSByYl9lbnRyeShuZXh0LCBzdHJ1Y3QgZXh0ZW50X21hcCwgcmJfbm9kZSk7Ci0JCWlmIChlbmQgPiBlbS0+c3RhcnQgJiYgc3RhcnQgPCBleHRlbnRfbWFwX2VuZChlbSkpCi0JCQlnb3RvIGZvdW5kOwotCX0KLQlpZiAoIXJiX25vZGUpIHsKLQkJZW0gPSBOVUxMOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKElTX0VSUihyYl9ub2RlKSkgewotCQllbSA9IEVSUl9DQVNUKHJiX25vZGUpOwotCQlnb3RvIG91dDsKLQl9Ci0JZW0gPSByYl9lbnRyeShyYl9ub2RlLCBzdHJ1Y3QgZXh0ZW50X21hcCwgcmJfbm9kZSk7Ci0JaWYgKGVuZCA+IGVtLT5zdGFydCAmJiBzdGFydCA8IGV4dGVudF9tYXBfZW5kKGVtKSkKLQkJZ290byBmb3VuZDsKLQotCWVtID0gTlVMTDsKLQlnb3RvIG91dDsKLQotZm91bmQ6Ci0JYXRvbWljX2luYygmZW0tPnJlZnMpOwotb3V0OgotCXJldHVybiBlbTsKKwlyZXR1cm4gX19sb29rdXBfZXh0ZW50X21hcHBpbmcodHJlZSwgc3RhcnQsIGxlbiwgMSk7CiB9CiAKIC8qKgpAQCAtMzY1LDM4ICszNDEsNyBAQAogc3RydWN0IGV4dGVudF9tYXAgKnNlYXJjaF9leHRlbnRfbWFwcGluZyhzdHJ1Y3QgZXh0ZW50X21hcF90cmVlICp0cmVlLAogCQkJCQkgdTY0IHN0YXJ0LCB1NjQgbGVuKQogewotCXN0cnVjdCBleHRlbnRfbWFwICplbTsKLQlzdHJ1Y3QgcmJfbm9kZSAqcmJfbm9kZTsKLQlzdHJ1Y3QgcmJfbm9kZSAqcHJldiA9IE5VTEw7Ci0Jc3RydWN0IHJiX25vZGUgKm5leHQgPSBOVUxMOwotCi0JcmJfbm9kZSA9IF9fdHJlZV9zZWFyY2goJnRyZWUtPm1hcCwgc3RhcnQsICZwcmV2LCAmbmV4dCk7Ci0JaWYgKCFyYl9ub2RlICYmIHByZXYpIHsKLQkJZW0gPSByYl9lbnRyeShwcmV2LCBzdHJ1Y3QgZXh0ZW50X21hcCwgcmJfbm9kZSk7Ci0JCWdvdG8gZm91bmQ7Ci0JfQotCWlmICghcmJfbm9kZSAmJiBuZXh0KSB7Ci0JCWVtID0gcmJfZW50cnkobmV4dCwgc3RydWN0IGV4dGVudF9tYXAsIHJiX25vZGUpOwotCQlnb3RvIGZvdW5kOwotCX0KLQlpZiAoIXJiX25vZGUpIHsKLQkJZW0gPSBOVUxMOwotCQlnb3RvIG91dDsKLQl9Ci0JaWYgKElTX0VSUihyYl9ub2RlKSkgewotCQllbSA9IEVSUl9DQVNUKHJiX25vZGUpOwotCQlnb3RvIG91dDsKLQl9Ci0JZW0gPSByYl9lbnRyeShyYl9ub2RlLCBzdHJ1Y3QgZXh0ZW50X21hcCwgcmJfbm9kZSk7Ci0JZ290byBmb3VuZDsKLQotCWVtID0gTlVMTDsKLQlnb3RvIG91dDsKLQotZm91bmQ6Ci0JYXRvbWljX2luYygmZW0tPnJlZnMpOwotb3V0OgotCXJldHVybiBlbTsKKwlyZXR1cm4gX19sb29rdXBfZXh0ZW50X21hcHBpbmcodHJlZSwgc3RhcnQsIGxlbiwgMCk7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZmlsZS1pdGVtLmMgYi9mcy9idHJmcy9maWxlLWl0ZW0uYwppbmRleCAwOGJjZmE5Li5iOTEwNjk0IDEwMDY0NAotLS0gYS9mcy9idHJmcy9maWxlLWl0ZW0uYworKysgYi9mcy9idHJmcy9maWxlLWl0ZW0uYwpAQCAtMjkxLDcgKzI5MSw4IEBACiAJdTE2IGNzdW1fc2l6ZSA9IGJ0cmZzX3N1cGVyX2NzdW1fc2l6ZSgmcm9vdC0+ZnNfaW5mby0+c3VwZXJfY29weSk7CiAKIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwotCUJVR19PTighcGF0aCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCWlmIChzZWFyY2hfY29tbWl0KSB7CiAJCXBhdGgtPnNraXBfbG9ja2luZyA9IDE7CkBAIC02NzcsNyArNjc4LDkgQEAKIAkJYnRyZnNfc3VwZXJfY3N1bV9zaXplKCZyb290LT5mc19pbmZvLT5zdXBlcl9jb3B5KTsKIAogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7Ci0JQlVHX09OKCFwYXRoKTsKKwlpZiAoIXBhdGgpCisJCXJldHVybiAtRU5PTUVNOworCiAJc2VjdG9yX3N1bSA9IHN1bXMtPnN1bXM7CiBhZ2FpbjoKIAluZXh0X29mZnNldCA9ICh1NjQpLTE7CmRpZmYgLS1naXQgYS9mcy9idHJmcy9maWxlLmMgYi9mcy9idHJmcy9maWxlLmMKaW5kZXggYTM1ZTUxYy4uNjU4ZDY2OSAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvZmlsZS5jCisrKyBiL2ZzL2J0cmZzL2ZpbGUuYwpAQCAtNzQsNyArNzQsNyBAQAogICogSWYgYW4gZXhpc3RpbmcgcmVjb3JkIGlzIGZvdW5kIHRoZSBkZWZyYWcgaXRlbSB5b3UKICAqIHBhc3MgaW4gaXMgZnJlZWQKICAqLwotc3RhdGljIGludCBfX2J0cmZzX2FkZF9pbm9kZV9kZWZyYWcoc3RydWN0IGlub2RlICppbm9kZSwKK3N0YXRpYyB2b2lkIF9fYnRyZnNfYWRkX2lub2RlX2RlZnJhZyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSAgICBzdHJ1Y3QgaW5vZGVfZGVmcmFnICpkZWZyYWcpCiB7CiAJc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QgPSBCVFJGU19JKGlub2RlKS0+cm9vdDsKQEAgLTEwNiwxMSArMTA2LDExIEBACiAJQlRSRlNfSShpbm9kZSktPmluX2RlZnJhZyA9IDE7CiAJcmJfbGlua19ub2RlKCZkZWZyYWctPnJiX25vZGUsIHBhcmVudCwgcCk7CiAJcmJfaW5zZXJ0X2NvbG9yKCZkZWZyYWctPnJiX25vZGUsICZyb290LT5mc19pbmZvLT5kZWZyYWdfaW5vZGVzKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm47CiAKIGV4aXN0czoKIAlrZnJlZShkZWZyYWcpOwotCXJldHVybiAwOworCXJldHVybjsKIAogfQogCkBAIC0xMjMsNyArMTIzLDYgQEAKIHsKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OwogCXN0cnVjdCBpbm9kZV9kZWZyYWcgKmRlZnJhZzsKLQlpbnQgcmV0ID0gMDsKIAl1NjQgdHJhbnNpZDsKIAogCWlmICghYnRyZnNfdGVzdF9vcHQocm9vdCwgQVVUT19ERUZSQUcpKQpAQCAtMTUwLDkgKzE0OSw5IEBACiAKIAlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPmRlZnJhZ19pbm9kZXNfbG9jayk7CiAJaWYgKCFCVFJGU19JKGlub2RlKS0+aW5fZGVmcmFnKQotCQlyZXQgPSBfX2J0cmZzX2FkZF9pbm9kZV9kZWZyYWcoaW5vZGUsIGRlZnJhZyk7CisJCV9fYnRyZnNfYWRkX2lub2RlX2RlZnJhZyhpbm9kZSwgZGVmcmFnKTsKIAlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+ZGVmcmFnX2lub2Rlc19sb2NrKTsKLQlyZXR1cm4gcmV0OworCXJldHVybiAwOwogfQogCiAvKgpAQCAtODU1LDcgKzg1NCw4IEBACiAJYnRyZnNfZHJvcF9leHRlbnRfY2FjaGUoaW5vZGUsIHN0YXJ0LCBlbmQgLSAxLCAwKTsKIAogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7Ci0JQlVHX09OKCFwYXRoKTsKKwlpZiAoIXBhdGgpCisJCXJldHVybiAtRU5PTUVNOwogYWdhaW46CiAJcmVjb3cgPSAwOwogCXNwbGl0ID0gc3RhcnQ7CkBAIC0xMDU5LDcgKzEwNTksNyBAQAogc3RhdGljIG5vaW5saW5lIGludCBwcmVwYXJlX3BhZ2VzKHN0cnVjdCBidHJmc19yb290ICpyb290LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKIAkJCSBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBzaXplX3QgbnVtX3BhZ2VzLAogCQkJIGxvZmZfdCBwb3MsIHVuc2lnbmVkIGxvbmcgZmlyc3RfaW5kZXgsCi0JCQkgdW5zaWduZWQgbG9uZyBsYXN0X2luZGV4LCBzaXplX3Qgd3JpdGVfYnl0ZXMpCisJCQkgc2l6ZV90IHdyaXRlX2J5dGVzKQogewogCXN0cnVjdCBleHRlbnRfc3RhdGUgKmNhY2hlZF9zdGF0ZSA9IE5VTEw7CiAJaW50IGk7CkBAIC0xMTU5LDcgKzExNTksNiBAQAogCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShpbm9kZSktPnJvb3Q7CiAJc3RydWN0IHBhZ2UgKipwYWdlcyA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBmaXJzdF9pbmRleDsKLQl1bnNpZ25lZCBsb25nIGxhc3RfaW5kZXg7CiAJc2l6ZV90IG51bV93cml0dGVuID0gMDsKIAlpbnQgbnJwdHJzOwogCWludCByZXQgPSAwOwpAQCAtMTE3Miw3ICsxMTcxLDYgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlmaXJzdF9pbmRleCA9IHBvcyA+PiBQQUdFX0NBQ0hFX1NISUZUOwotCWxhc3RfaW5kZXggPSAocG9zICsgaW92X2l0ZXJfY291bnQoaSkpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CiAKIAl3aGlsZSAoaW92X2l0ZXJfY291bnQoaSkgPiAwKSB7CiAJCXNpemVfdCBvZmZzZXQgPSBwb3MgJiAoUEFHRV9DQUNIRV9TSVpFIC0gMSk7CkBAIC0xMjA2LDggKzEyMDQsNyBAQAogCQkgKiBjb250ZW50cyBvZiBwYWdlcyBmcm9tIGxvb3AgdG8gbG9vcAogCQkgKi8KIAkJcmV0ID0gcHJlcGFyZV9wYWdlcyhyb290LCBmaWxlLCBwYWdlcywgbnVtX3BhZ2VzLAotCQkJCSAgICBwb3MsIGZpcnN0X2luZGV4LCBsYXN0X2luZGV4LAotCQkJCSAgICB3cml0ZV9ieXRlcyk7CisJCQkJICAgIHBvcywgZmlyc3RfaW5kZXgsIHdyaXRlX2J5dGVzKTsKIAkJaWYgKHJldCkgewogCQkJYnRyZnNfZGVsYWxsb2NfcmVsZWFzZV9zcGFjZShpbm9kZSwKIAkJCQkJbnVtX3BhZ2VzIDw8IFBBR0VfQ0FDSEVfU0hJRlQpOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvaW5vZGUuYyBiL2ZzL2J0cmZzL2lub2RlLmMKaW5kZXggMTNlNjI1NS4uMTVmY2VlZiAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvaW5vZGUuYworKysgYi9mcy9idHJmcy9pbm9kZS5jCkBAIC0xMDYxLDcgKzEwNjEsOCBAQAogCXU2NCBpbm8gPSBidHJmc19pbm8oaW5vZGUpOwogCiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKLQlCVUdfT04oIXBhdGgpOworCWlmICghcGF0aCkKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlub2xvY2sgPSBidHJmc19pc19mcmVlX3NwYWNlX2lub2RlKHJvb3QsIGlub2RlKTsKIApAQCAtMTI4MiwxNyArMTI4MywxNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgYnRyZnNfc3BsaXRfZXh0ZW50X2hvb2soc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkgICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpvcmlnLCB1NjQgc3BsaXQpCitzdGF0aWMgdm9pZCBidHJmc19zcGxpdF9leHRlbnRfaG9vayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSAgICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpvcmlnLCB1NjQgc3BsaXQpCiB7CiAJLyogbm90IGRlbGFsbG9jLCBpZ25vcmUgaXQgKi8KIAlpZiAoIShvcmlnLT5zdGF0ZSAmIEVYVEVOVF9ERUxBTExPQykpCi0JCXJldHVybiAwOworCQlyZXR1cm47CiAKIAlzcGluX2xvY2soJkJUUkZTX0koaW5vZGUpLT5sb2NrKTsKIAlCVFJGU19JKGlub2RlKS0+b3V0c3RhbmRpbmdfZXh0ZW50cysrOwogCXNwaW5fdW5sb2NrKCZCVFJGU19JKGlub2RlKS0+bG9jayk7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xMzAxLDE4ICsxMzAxLDE3IEBACiAgKiBleHRlbnRzLCBzdWNoIGFzIHdoZW4gd2UgYXJlIGRvaW5nIHNlcXVlbnRpYWwgd3JpdGVzLCBzbyB3ZSBjYW4gcHJvcGVybHkKICAqIGFjY291bnQgZm9yIHRoZSBtZXRhZGF0YSBzcGFjZSB3ZSdsbCBuZWVkLgogICovCi1zdGF0aWMgaW50IGJ0cmZzX21lcmdlX2V4dGVudF9ob29rKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJICAgc3RydWN0IGV4dGVudF9zdGF0ZSAqbmV3LAotCQkJCSAgIHN0cnVjdCBleHRlbnRfc3RhdGUgKm90aGVyKQorc3RhdGljIHZvaWQgYnRyZnNfbWVyZ2VfZXh0ZW50X2hvb2soc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQkgICAgc3RydWN0IGV4dGVudF9zdGF0ZSAqbmV3LAorCQkJCSAgICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpvdGhlcikKIHsKIAkvKiBub3QgZGVsYWxsb2MsIGlnbm9yZSBpdCAqLwogCWlmICghKG90aGVyLT5zdGF0ZSAmIEVYVEVOVF9ERUxBTExPQykpCi0JCXJldHVybiAwOworCQlyZXR1cm47CiAKIAlzcGluX2xvY2soJkJUUkZTX0koaW5vZGUpLT5sb2NrKTsKIAlCVFJGU19JKGlub2RlKS0+b3V0c3RhbmRpbmdfZXh0ZW50cy0tOwogCXNwaW5fdW5sb2NrKCZCVFJGU19JKGlub2RlKS0+bG9jayk7Ci0JcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC0xMzIwLDggKzEzMTksOCBAQAogICogYnl0ZXMgaW4gdGhpcyBmaWxlLCBhbmQgdG8gbWFpbnRhaW4gdGhlIGxpc3Qgb2YgaW5vZGVzIHRoYXQKICAqIGhhdmUgcGVuZGluZyBkZWxhbGxvYyB3b3JrIHRvIGJlIGRvbmUuCiAgKi8KLXN0YXRpYyBpbnQgYnRyZnNfc2V0X2JpdF9ob29rKHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgICAgICBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZSwgaW50ICpiaXRzKQorc3RhdGljIHZvaWQgYnRyZnNfc2V0X2JpdF9ob29rKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgICAgc3RydWN0IGV4dGVudF9zdGF0ZSAqc3RhdGUsIGludCAqYml0cykKIHsKIAogCS8qCkBAIC0xMzUxLDE0ICsxMzUwLDEzIEBACiAJCX0KIAkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2xvY2spOwogCX0KLQlyZXR1cm4gMDsKIH0KIAogLyoKICAqIGV4dGVudF9pby5jIGNsZWFyX2JpdF9ob29rLCBzZWUgc2V0X2JpdF9ob29rIGZvciB3aHkKICAqLwotc3RhdGljIGludCBidHJmc19jbGVhcl9iaXRfaG9vayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJCXN0cnVjdCBleHRlbnRfc3RhdGUgKnN0YXRlLCBpbnQgKmJpdHMpCitzdGF0aWMgdm9pZCBidHJmc19jbGVhcl9iaXRfaG9vayhzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCSBzdHJ1Y3QgZXh0ZW50X3N0YXRlICpzdGF0ZSwgaW50ICpiaXRzKQogewogCS8qCiAJICogc2V0X2JpdCBhbmQgY2xlYXIgYml0IGhvb2tzIG5vcm1hbGx5IHJlcXVpcmUgX2lycXNhdmUvcmVzdG9yZQpAQCAtMTM5NSw3ICsxMzkzLDYgQEAKIAkJfQogCQlzcGluX3VubG9jaygmcm9vdC0+ZnNfaW5mby0+ZGVsYWxsb2NfbG9jayk7CiAJfQotCXJldHVybiAwOwogfQogCiAvKgpAQCAtMTY0NSw3ICsxNjQyLDggQEAKIAlpbnQgcmV0OwogCiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKLQlCVUdfT04oIXBhdGgpOworCWlmICghcGF0aCkKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlwYXRoLT5sZWF2ZV9zcGlubmluZyA9IDE7CiAKQEAgLTIyMTUsNyArMjIxMyw4IEBACiAKIAlpZiAoIXJvb3QtPm9ycGhhbl9ibG9ja19yc3YpIHsKIAkJYmxvY2tfcnN2ID0gYnRyZnNfYWxsb2NfYmxvY2tfcnN2KHJvb3QpOwotCQlCVUdfT04oIWJsb2NrX3Jzdik7CisJCWlmICghYmxvY2tfcnN2KQorCQkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJc3Bpbl9sb2NrKCZyb290LT5vcnBoYW5fbG9jayk7CkBAIC0yNTE3LDcgKzI1MTYsOSBAQAogCQlmaWxsZWQgPSB0cnVlOwogCiAJcGF0aCA9IGJ0cmZzX2FsbG9jX3BhdGgoKTsKLQlCVUdfT04oIXBhdGgpOworCWlmICghcGF0aCkKKwkJZ290byBtYWtlX2JhZDsKKwogCXBhdGgtPmxlYXZlX3NwaW5uaW5nID0gMTsKIAltZW1jcHkoJmxvY2F0aW9uLCAmQlRSRlNfSShpbm9kZSktPmxvY2F0aW9uLCBzaXplb2YobG9jYXRpb24pKTsKIApAQCAtMjk5OCwxMyArMjk5OSwxNiBAQAogCiAJcmV0ID0gYnRyZnNfdW5saW5rX2lub2RlKHRyYW5zLCByb290LCBkaXIsIGRlbnRyeS0+ZF9pbm9kZSwKIAkJCQkgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuKTsKLQlCVUdfT04ocmV0KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKIAogCWlmIChpbm9kZS0+aV9ubGluayA9PSAwKSB7CiAJCXJldCA9IGJ0cmZzX29ycGhhbl9hZGQodHJhbnMsIGlub2RlKTsKLQkJQlVHX09OKHJldCk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKIAl9CiAKK291dDoKIAluciA9IHRyYW5zLT5ibG9ja3NfdXNlZDsKIAlfX3VubGlua19lbmRfdHJhbnModHJhbnMsIHJvb3QpOwogCWJ0cmZzX2J0cmVlX2JhbGFuY2VfZGlydHkocm9vdCwgbnIpOwpAQCAtMzE0Nyw2ICszMTUxLDExIEBACiAKIAlCVUdfT04obmV3X3NpemUgPiAwICYmIG1pbl90eXBlICE9IEJUUkZTX0VYVEVOVF9EQVRBX0tFWSk7CiAKKwlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOworCWlmICghcGF0aCkKKwkJcmV0dXJuIC1FTk9NRU07CisJcGF0aC0+cmVhZGEgPSAtMTsKKwogCWlmIChyb290LT5yZWZfY293cyB8fCByb290ID09IHJvb3QtPmZzX2luZm8tPnRyZWVfcm9vdCkKIAkJYnRyZnNfZHJvcF9leHRlbnRfY2FjaGUoaW5vZGUsIG5ld19zaXplICYgKH5tYXNrKSwgKHU2NCktMSwgMCk7CiAKQEAgLTMxNTksMTAgKzMxNjgsNiBAQAogCWlmIChtaW5fdHlwZSA9PSAwICYmIHJvb3QgPT0gQlRSRlNfSShpbm9kZSktPnJvb3QpCiAJCWJ0cmZzX2tpbGxfZGVsYXllZF9pbm9kZV9pdGVtcyhpbm9kZSk7CiAKLQlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwotCUJVR19PTighcGF0aCk7Ci0JcGF0aC0+cmVhZGEgPSAtMTsKLQogCWtleS5vYmplY3RpZCA9IGlubzsKIAlrZXkub2Zmc2V0ID0gKHU2NCktMTsKIAlrZXkudHlwZSA9ICh1OCktMTsKQEAgLTM2OTAsNyArMzY5NSw4IEBACiAJaW50IHJldCA9IDA7CiAKIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwotCUJVR19PTighcGF0aCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gLUVOT01FTTsKIAogCWRpID0gYnRyZnNfbG9va3VwX2Rpcl9pdGVtKE5VTEwsIHJvb3QsIHBhdGgsIGJ0cmZzX2lubyhkaXIpLCBuYW1lLAogCQkJCSAgICBuYW1lbGVuLCAwKTsKQEAgLTM5NDYsNiArMzk1Miw3IEBACiAJCQkgc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIGludCAqbmV3KQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CisJaW50IGJhZF9pbm9kZSA9IDA7CiAKIAlpbm9kZSA9IGJ0cmZzX2lnZXRfbG9ja2VkKHMsIGxvY2F0aW9uLT5vYmplY3RpZCwgcm9vdCk7CiAJaWYgKCFpbm9kZSkKQEAgLTM5NTUsMTAgKzM5NjIsMTkgQEAKIAkJQlRSRlNfSShpbm9kZSktPnJvb3QgPSByb290OwogCQltZW1jcHkoJkJUUkZTX0koaW5vZGUpLT5sb2NhdGlvbiwgbG9jYXRpb24sIHNpemVvZigqbG9jYXRpb24pKTsKIAkJYnRyZnNfcmVhZF9sb2NrZWRfaW5vZGUoaW5vZGUpOwotCQlpbm9kZV90cmVlX2FkZChpbm9kZSk7Ci0JCXVubG9ja19uZXdfaW5vZGUoaW5vZGUpOwotCQlpZiAobmV3KQotCQkJKm5ldyA9IDE7CisJCWlmICghaXNfYmFkX2lub2RlKGlub2RlKSkgeworCQkJaW5vZGVfdHJlZV9hZGQoaW5vZGUpOworCQkJdW5sb2NrX25ld19pbm9kZShpbm9kZSk7CisJCQlpZiAobmV3KQorCQkJCSpuZXcgPSAxOworCQl9IGVsc2UgeworCQkJYmFkX2lub2RlID0gMTsKKwkJfQorCX0KKworCWlmIChiYWRfaW5vZGUpIHsKKwkJaXB1dChpbm9kZSk7CisJCWlub2RlID0gRVJSX1BUUigtRVNUQUxFKTsKIAl9CiAKIAlyZXR1cm4gaW5vZGU7CkBAIC0zOTkzLDEyICs0MDA5LDE5IEBACiAJc3RydWN0IGJ0cmZzX3Jvb3QgKnN1Yl9yb290ID0gcm9vdDsKIAlzdHJ1Y3QgYnRyZnNfa2V5IGxvY2F0aW9uOwogCWludCBpbmRleDsKLQlpbnQgcmV0OworCWludCByZXQgPSAwOwogCiAJaWYgKGRlbnRyeS0+ZF9uYW1lLmxlbiA+IEJUUkZTX05BTUVfTEVOKQogCQlyZXR1cm4gRVJSX1BUUigtRU5BTUVUT09MT05HKTsKIAotCXJldCA9IGJ0cmZzX2lub2RlX2J5X25hbWUoZGlyLCBkZW50cnksICZsb2NhdGlvbik7CisJaWYgKHVubGlrZWx5KGRfbmVlZF9sb29rdXAoZGVudHJ5KSkpIHsKKwkJbWVtY3B5KCZsb2NhdGlvbiwgZGVudHJ5LT5kX2ZzZGF0YSwgc2l6ZW9mKHN0cnVjdCBidHJmc19rZXkpKTsKKwkJa2ZyZWUoZGVudHJ5LT5kX2ZzZGF0YSk7CisJCWRlbnRyeS0+ZF9mc2RhdGEgPSBOVUxMOworCQlkX2NsZWFyX25lZWRfbG9va3VwKGRlbnRyeSk7CisJfSBlbHNlIHsKKwkJcmV0ID0gYnRyZnNfaW5vZGVfYnlfbmFtZShkaXIsIGRlbnRyeSwgJmxvY2F0aW9uKTsKKwl9CiAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIEVSUl9QVFIocmV0KTsKQEAgLTQwNTMsNiArNDA3NiwxMiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBidHJmc19kZW50cnlfcmVsZWFzZShzdHJ1Y3QgZGVudHJ5ICpkZW50cnkpCit7CisJaWYgKGRlbnRyeS0+ZF9mc2RhdGEpCisJCWtmcmVlKGRlbnRyeS0+ZF9mc2RhdGEpOworfQorCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqYnRyZnNfbG9va3VwKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgZGVudHJ5ICpkZW50cnksCiAJCQkJICAgc3RydWN0IG5hbWVpZGF0YSAqbmQpCiB7CkBAIC00MDc1LDYgKzQxMDQsNyBAQAogCXN0cnVjdCBidHJmc19wYXRoICpwYXRoOwogCXN0cnVjdCBsaXN0X2hlYWQgaW5zX2xpc3Q7CiAJc3RydWN0IGxpc3RfaGVhZCBkZWxfbGlzdDsKKwlzdHJ1Y3QgcXN0ciBxOwogCWludCByZXQ7CiAJc3RydWN0IGV4dGVudF9idWZmZXIgKmxlYWY7CiAJaW50IHNsb3Q7CkBAIC00MTY0LDYgKzQxOTQsNyBAQAogCiAJCXdoaWxlIChkaV9jdXIgPCBkaV90b3RhbCkgewogCQkJc3RydWN0IGJ0cmZzX2tleSBsb2NhdGlvbjsKKwkJCXN0cnVjdCBkZW50cnkgKnRtcDsKIAogCQkJaWYgKHZlcmlmeV9kaXJfaXRlbShyb290LCBsZWFmLCBkaSkpCiAJCQkJYnJlYWs7CkBAIC00MTg0LDYgKzQyMTUsMzMgQEAKIAkJCWRfdHlwZSA9IGJ0cmZzX2ZpbGV0eXBlX3RhYmxlW2J0cmZzX2Rpcl90eXBlKGxlYWYsIGRpKV07CiAJCQlidHJmc19kaXJfaXRlbV9rZXlfdG9fY3B1KGxlYWYsIGRpLCAmbG9jYXRpb24pOwogCisJCQlxLm5hbWUgPSBuYW1lX3B0cjsKKwkJCXEubGVuID0gbmFtZV9sZW47CisJCQlxLmhhc2ggPSBmdWxsX25hbWVfaGFzaChxLm5hbWUsIHEubGVuKTsKKwkJCXRtcCA9IGRfbG9va3VwKGZpbHAtPmZfZGVudHJ5LCAmcSk7CisJCQlpZiAoIXRtcCkgeworCQkJCXN0cnVjdCBidHJmc19rZXkgKm5ld2tleTsKKworCQkJCW5ld2tleSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBidHJmc19rZXkpLAorCQkJCQkJIEdGUF9OT0ZTKTsKKwkJCQlpZiAoIW5ld2tleSkKKwkJCQkJZ290byBub19kZW50cnk7CisJCQkJdG1wID0gZF9hbGxvYyhmaWxwLT5mX2RlbnRyeSwgJnEpOworCQkJCWlmICghdG1wKSB7CisJCQkJCWtmcmVlKG5ld2tleSk7CisJCQkJCWRwdXQodG1wKTsKKwkJCQkJZ290byBub19kZW50cnk7CisJCQkJfQorCQkJCW1lbWNweShuZXdrZXksICZsb2NhdGlvbiwKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBidHJmc19rZXkpKTsKKwkJCQl0bXAtPmRfZnNkYXRhID0gbmV3a2V5OworCQkJCXRtcC0+ZF9mbGFncyB8PSBEQ0FDSEVfTkVFRF9MT09LVVA7CisJCQkJZF9yZWhhc2godG1wKTsKKwkJCQlkcHV0KHRtcCk7CisJCQl9IGVsc2UgeworCQkJCWRwdXQodG1wKTsKKwkJCX0KK25vX2RlbnRyeToKIAkJCS8qIGlzIHRoaXMgYSByZWZlcmVuY2UgdG8gb3VyIG93biBzbmFwc2hvdD8gSWYgc28KIAkJCSAqIHNraXAgaXQKIAkJCSAqLwpAQCAtNDQwOSw3ICs0NDY3LDggQEAKIAlpbnQgb3duZXI7CiAKIAlwYXRoID0gYnRyZnNfYWxsb2NfcGF0aCgpOwotCUJVR19PTighcGF0aCk7CisJaWYgKCFwYXRoKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAogCWlub2RlID0gbmV3X2lub2RlKHJvb3QtPmZzX2luZm8tPnNiKTsKIAlpZiAoIWlub2RlKSB7CkBAIC02NjY5LDE5ICs2NzI4LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogaGVscGVyIGZ1bmN0aW9uIGZvciBmaWxlIGRlZnJhZyBhbmQgc3BhY2UgYmFsYW5jaW5nLiAgVGhpcwotICogZm9yY2VzIHJlYWRhaGVhZCBvbiBhIGdpdmVuIHJhbmdlIG9mIGJ5dGVzIGluIGFuIGlub2RlCi0gKi8KLXVuc2lnbmVkIGxvbmcgYnRyZnNfZm9yY2VfcmEoc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCi0JCQkgICAgICBzdHJ1Y3QgZmlsZV9yYV9zdGF0ZSAqcmEsIHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgICAgcGdvZmZfdCBvZmZzZXQsIHBnb2ZmX3QgbGFzdF9pbmRleCkKLXsKLQlwZ29mZl90IHJlcV9zaXplID0gbGFzdF9pbmRleCAtIG9mZnNldCArIDE7Ci0KLQlwYWdlX2NhY2hlX3N5bmNfcmVhZGFoZWFkKG1hcHBpbmcsIHJhLCBmaWxlLCBvZmZzZXQsIHJlcV9zaXplKTsKLQlyZXR1cm4gb2Zmc2V0ICsgcmVxX3NpemU7Ci19Ci0KIHN0cnVjdCBpbm9kZSAqYnRyZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3QgYnRyZnNfaW5vZGUgKmVpOwpAQCAtNzE2NCw3ICs3MjEwLDExIEBACiAJCWdvdG8gb3V0X3VubG9jazsKIAogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7Ci0JQlVHX09OKCFwYXRoKTsKKwlpZiAoIXBhdGgpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZHJvcF9pbm9kZSA9IDE7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CiAJa2V5Lm9iamVjdGlkID0gYnRyZnNfaW5vKGlub2RlKTsKIAlrZXkub2Zmc2V0ID0gMDsKIAlidHJmc19zZXRfa2V5X3R5cGUoJmtleSwgQlRSRlNfRVhURU5UX0RBVEFfS0VZKTsKQEAgLTc0MzAsNCArNzQ4MCw1IEBACiAKIGNvbnN0IHN0cnVjdCBkZW50cnlfb3BlcmF0aW9ucyBidHJmc19kZW50cnlfb3BlcmF0aW9ucyA9IHsKIAkuZF9kZWxldGUJPSBidHJmc19kZW50cnlfZGVsZXRlLAorCS5kX3JlbGVhc2UJPSBidHJmc19kZW50cnlfcmVsZWFzZSwKIH07CmRpZmYgLS1naXQgYS9mcy9idHJmcy9pb2N0bC5jIGIvZnMvYnRyZnMvaW9jdGwuYwppbmRleCAwYjk4MGFmLi43Y2YwMTMzIDEwMDY0NAotLS0gYS9mcy9idHJmcy9pb2N0bC5jCisrKyBiL2ZzL2J0cmZzL2lvY3RsLmMKQEAgLTE3NDksMTEgKzE3NDksMTAgQEAKIAkJa2V5Lm9iamVjdGlkID0ga2V5Lm9mZnNldDsKIAkJa2V5Lm9mZnNldCA9ICh1NjQpLTE7CiAJCWRpcmlkID0ga2V5Lm9iamVjdGlkOwotCiAJfQogCWlmIChwdHIgPCBuYW1lKQogCQlnb3RvIG91dDsKLQltZW1jcHkobmFtZSwgcHRyLCB0b3RhbF9sZW4pOworCW1lbW1vdmUobmFtZSwgcHRyLCB0b3RhbF9sZW4pOwogCW5hbWVbdG90YWxfbGVuXT0nXDAnOwogCXJldCA9IDA7CiBvdXQ6CmRpZmYgLS1naXQgYS9mcy9idHJmcy9yZWYtY2FjaGUuYyBiL2ZzL2J0cmZzL3JlZi1jYWNoZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmQ1NjljLi4wMDAwMDAwCi0tLSBhL2ZzL2J0cmZzL3JlZi1jYWNoZS5jCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBPcmFjbGUuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSB2MiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAotICogQm9zdG9uLCBNQSAwMjExMTAtMTMwNywgVVNBLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zb3J0Lmg+Ci0jaW5jbHVkZSAiY3RyZWUuaCIKLSNpbmNsdWRlICJyZWYtY2FjaGUuaCIKLSNpbmNsdWRlICJ0cmFuc2FjdGlvbi5oIgotCi1zdGF0aWMgc3RydWN0IHJiX25vZGUgKnRyZWVfaW5zZXJ0KHN0cnVjdCByYl9yb290ICpyb290LCB1NjQgYnl0ZW5yLAotCQkJCSAgIHN0cnVjdCByYl9ub2RlICpub2RlKQotewotCXN0cnVjdCByYl9ub2RlICoqcCA9ICZyb290LT5yYl9ub2RlOwotCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOwotCXN0cnVjdCBidHJmc19sZWFmX3JlZiAqZW50cnk7Ci0KLQl3aGlsZSAoKnApIHsKLQkJcGFyZW50ID0gKnA7Ci0JCWVudHJ5ID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgYnRyZnNfbGVhZl9yZWYsIHJiX25vZGUpOwotCi0JCWlmIChieXRlbnIgPCBlbnRyeS0+Ynl0ZW5yKQotCQkJcCA9ICYoKnApLT5yYl9sZWZ0OwotCQllbHNlIGlmIChieXRlbnIgPiBlbnRyeS0+Ynl0ZW5yKQotCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKLQkJZWxzZQotCQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQllbnRyeSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBidHJmc19sZWFmX3JlZiwgcmJfbm9kZSk7Ci0JcmJfbGlua19ub2RlKG5vZGUsIHBhcmVudCwgcCk7Ci0JcmJfaW5zZXJ0X2NvbG9yKG5vZGUsIHJvb3QpOwotCXJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgc3RydWN0IHJiX25vZGUgKnRyZWVfc2VhcmNoKHN0cnVjdCByYl9yb290ICpyb290LCB1NjQgYnl0ZW5yKQotewotCXN0cnVjdCByYl9ub2RlICpuID0gcm9vdC0+cmJfbm9kZTsKLQlzdHJ1Y3QgYnRyZnNfbGVhZl9yZWYgKmVudHJ5OwotCi0Jd2hpbGUgKG4pIHsKLQkJZW50cnkgPSByYl9lbnRyeShuLCBzdHJ1Y3QgYnRyZnNfbGVhZl9yZWYsIHJiX25vZGUpOwotCQlXQVJOX09OKCFlbnRyeS0+aW5fdHJlZSk7Ci0KLQkJaWYgKGJ5dGVuciA8IGVudHJ5LT5ieXRlbnIpCi0JCQluID0gbi0+cmJfbGVmdDsKLQkJZWxzZSBpZiAoYnl0ZW5yID4gZW50cnktPmJ5dGVucikKLQkJCW4gPSBuLT5yYl9yaWdodDsKLQkJZWxzZQotCQkJcmV0dXJuIG47Ci0JfQotCXJldHVybiBOVUxMOwotfQpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvcmVmLWNhY2hlLmggYi9mcy9idHJmcy9yZWYtY2FjaGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRmNzAwMS4uMDAwMDAwMAotLS0gYS9mcy9idHJmcy9yZWYtY2FjaGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggT3JhY2xlLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCi0gKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgdjIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCi0gKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCi0gKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKLSAqIEJvc3RvbiwgTUEgMDIxMTEwLTEzMDcsIFVTQS4KLSAqLwotI2lmbmRlZiBfX1JFRkNBQ0hFX18KLSNkZWZpbmUgX19SRUZDQUNIRV9fCi0KLXN0cnVjdCBidHJmc19leHRlbnRfaW5mbyB7Ci0JLyogYnl0ZW5yIGFuZCBudW1fYnl0ZXMgZmluZCB0aGUgZXh0ZW50IGluIHRoZSBleHRlbnQgYWxsb2NhdGlvbiB0cmVlICovCi0JdTY0IGJ5dGVucjsKLQl1NjQgbnVtX2J5dGVzOwotCi0JLyogb2JqZWN0aWQgYW5kIG9mZnNldCBmaW5kIHRoZSBiYWNrIHJlZmVyZW5jZSBmb3IgdGhlIGZpbGUgKi8KLQl1NjQgb2JqZWN0aWQ7Ci0JdTY0IG9mZnNldDsKLX07Ci0KLXN0cnVjdCBidHJmc19sZWFmX3JlZiB7Ci0Jc3RydWN0IHJiX25vZGUgcmJfbm9kZTsKLQlzdHJ1Y3QgYnRyZnNfbGVhZl9yZWZfdHJlZSAqdHJlZTsKLQlpbnQgaW5fdHJlZTsKLQlhdG9taWNfdCB1c2FnZTsKLQotCXU2NCByb290X2dlbjsKLQl1NjQgYnl0ZW5yOwotCXU2NCBvd25lcjsKLQl1NjQgZ2VuZXJhdGlvbjsKLQlpbnQgbnJpdGVtczsKLQotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlzdHJ1Y3QgYnRyZnNfZXh0ZW50X2luZm8gZXh0ZW50c1tdOwotfTsKLQotc3RhdGljIGlubGluZSBzaXplX3QgYnRyZnNfbGVhZl9yZWZfc2l6ZShpbnQgbnJfZXh0ZW50cykKLXsKLQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBidHJmc19sZWFmX3JlZikgKwotCSAgICAgICBzaXplb2Yoc3RydWN0IGJ0cmZzX2V4dGVudF9pbmZvKSAqIG5yX2V4dGVudHM7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3Jvb3QtdHJlZS5jIGIvZnMvYnRyZnMvcm9vdC10cmVlLmMKaW5kZXggZWJlNDU0NC4uZjQwOTk5MCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvcm9vdC10cmVlLmMKKysrIGIvZnMvYnRyZnMvcm9vdC10cmVlLmMKQEAgLTcxLDEzICs3MSwxMiBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBidHJmc19zZXRfcm9vdF9ub2RlKHN0cnVjdCBidHJmc19yb290X2l0ZW0gKml0ZW0sCi0JCQlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbm9kZSkKK3ZvaWQgYnRyZnNfc2V0X3Jvb3Rfbm9kZShzdHJ1Y3QgYnRyZnNfcm9vdF9pdGVtICppdGVtLAorCQkJIHN0cnVjdCBleHRlbnRfYnVmZmVyICpub2RlKQogewogCWJ0cmZzX3NldF9yb290X2J5dGVucihpdGVtLCBub2RlLT5zdGFydCk7CiAJYnRyZnNfc2V0X3Jvb3RfbGV2ZWwoaXRlbSwgYnRyZnNfaGVhZGVyX2xldmVsKG5vZGUpKTsKIAlidHJmc19zZXRfcm9vdF9nZW5lcmF0aW9uKGl0ZW0sIGJ0cmZzX2hlYWRlcl9nZW5lcmF0aW9uKG5vZGUpKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3RyYW5zYWN0aW9uLmMgYi9mcy9idHJmcy90cmFuc2FjdGlvbi5jCmluZGV4IGViNTU4NjMuLjdkYzM2ZmEgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3RyYW5zYWN0aW9uLmMKKysrIGIvZnMvYnRyZnMvdHJhbnNhY3Rpb24uYwpAQCAtMjE2LDE3ICsyMTYsMTEgQEAKIAlzcGluX2xvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOwogCWN1cl90cmFucyA9IHJvb3QtPmZzX2luZm8tPnJ1bm5pbmdfdHJhbnNhY3Rpb247CiAJaWYgKGN1cl90cmFucyAmJiBjdXJfdHJhbnMtPmJsb2NrZWQpIHsKLQkJREVGSU5FX1dBSVQod2FpdCk7CiAJCWF0b21pY19pbmMoJmN1cl90cmFucy0+dXNlX2NvdW50KTsKIAkJc3Bpbl91bmxvY2soJnJvb3QtPmZzX2luZm8tPnRyYW5zX2xvY2spOwotCQl3aGlsZSAoMSkgewotCQkJcHJlcGFyZV90b193YWl0KCZyb290LT5mc19pbmZvLT50cmFuc2FjdGlvbl93YWl0LCAmd2FpdCwKLQkJCQkJVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQkJaWYgKCFjdXJfdHJhbnMtPmJsb2NrZWQpCi0JCQkJYnJlYWs7Ci0JCQlzY2hlZHVsZSgpOwotCQl9Ci0JCWZpbmlzaF93YWl0KCZyb290LT5mc19pbmZvLT50cmFuc2FjdGlvbl93YWl0LCAmd2FpdCk7CisKKwkJd2FpdF9ldmVudChyb290LT5mc19pbmZvLT50cmFuc2FjdGlvbl93YWl0LAorCQkJICAgIWN1cl90cmFucy0+YmxvY2tlZCk7CiAJCXB1dF90cmFuc2FjdGlvbihjdXJfdHJhbnMpOwogCX0gZWxzZSB7CiAJCXNwaW5fdW5sb2NrKCZyb290LT5mc19pbmZvLT50cmFuc19sb2NrKTsKQEAgLTM1NywxOSArMzUxLDEwIEBACiB9CiAKIC8qIHdhaXQgZm9yIGEgdHJhbnNhY3Rpb24gY29tbWl0IHRvIGJlIGZ1bGx5IGNvbXBsZXRlICovCi1zdGF0aWMgbm9pbmxpbmUgaW50IHdhaXRfZm9yX2NvbW1pdChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKK3N0YXRpYyBub2lubGluZSB2b2lkIHdhaXRfZm9yX2NvbW1pdChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCwKIAkJCQkgICAgc3RydWN0IGJ0cmZzX3RyYW5zYWN0aW9uICpjb21taXQpCiB7Ci0JREVGSU5FX1dBSVQod2FpdCk7Ci0Jd2hpbGUgKCFjb21taXQtPmNvbW1pdF9kb25lKSB7Ci0JCXByZXBhcmVfdG9fd2FpdCgmY29tbWl0LT5jb21taXRfd2FpdCwgJndhaXQsCi0JCQkJVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQlpZiAoY29tbWl0LT5jb21taXRfZG9uZSkKLQkJCWJyZWFrOwotCQlzY2hlZHVsZSgpOwotCX0KLQlmaW5pc2hfd2FpdCgmY29tbWl0LT5jb21taXRfd2FpdCwgJndhaXQpOwotCXJldHVybiAwOworCXdhaXRfZXZlbnQoY29tbWl0LT5jb21taXRfd2FpdCwgY29tbWl0LT5jb21taXRfZG9uZSk7CiB9CiAKIGludCBidHJmc193YWl0X2Zvcl9jb21taXQoc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsIHU2NCB0cmFuc2lkKQpAQCAtMTA4NSwyMiArMTA3MCw3IEBACiBzdGF0aWMgdm9pZCB3YWl0X2N1cnJlbnRfdHJhbnNfY29tbWl0X3N0YXJ0KHN0cnVjdCBidHJmc19yb290ICpyb290LAogCQkJCQkgICAgc3RydWN0IGJ0cmZzX3RyYW5zYWN0aW9uICp0cmFucykKIHsKLQlERUZJTkVfV0FJVCh3YWl0KTsKLQotCWlmICh0cmFucy0+aW5fY29tbWl0KQotCQlyZXR1cm47Ci0KLQl3aGlsZSAoMSkgewotCQlwcmVwYXJlX3RvX3dhaXQoJnJvb3QtPmZzX2luZm8tPnRyYW5zYWN0aW9uX2Jsb2NrZWRfd2FpdCwgJndhaXQsCi0JCQkJVEFTS19VTklOVEVSUlVQVElCTEUpOwotCQlpZiAodHJhbnMtPmluX2NvbW1pdCkgewotCQkJZmluaXNoX3dhaXQoJnJvb3QtPmZzX2luZm8tPnRyYW5zYWN0aW9uX2Jsb2NrZWRfd2FpdCwKLQkJCQkgICAgJndhaXQpOwotCQkJYnJlYWs7Ci0JCX0KLQkJc2NoZWR1bGUoKTsKLQkJZmluaXNoX3dhaXQoJnJvb3QtPmZzX2luZm8tPnRyYW5zYWN0aW9uX2Jsb2NrZWRfd2FpdCwgJndhaXQpOwotCX0KKwl3YWl0X2V2ZW50KHJvb3QtPmZzX2luZm8tPnRyYW5zYWN0aW9uX2Jsb2NrZWRfd2FpdCwgdHJhbnMtPmluX2NvbW1pdCk7CiB9CiAKIC8qCkBAIC0xMTEwLDI0ICsxMDgwLDggQEAKIHN0YXRpYyB2b2lkIHdhaXRfY3VycmVudF90cmFuc19jb21taXRfc3RhcnRfYW5kX3VuYmxvY2soc3RydWN0IGJ0cmZzX3Jvb3QgKnJvb3QsCiAJCQkJCSBzdHJ1Y3QgYnRyZnNfdHJhbnNhY3Rpb24gKnRyYW5zKQogewotCURFRklORV9XQUlUKHdhaXQpOwotCi0JaWYgKHRyYW5zLT5jb21taXRfZG9uZSB8fCAodHJhbnMtPmluX2NvbW1pdCAmJiAhdHJhbnMtPmJsb2NrZWQpKQotCQlyZXR1cm47Ci0KLQl3aGlsZSAoMSkgewotCQlwcmVwYXJlX3RvX3dhaXQoJnJvb3QtPmZzX2luZm8tPnRyYW5zYWN0aW9uX3dhaXQsICZ3YWl0LAotCQkJCVRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKLQkJaWYgKHRyYW5zLT5jb21taXRfZG9uZSB8fAotCQkgICAgKHRyYW5zLT5pbl9jb21taXQgJiYgIXRyYW5zLT5ibG9ja2VkKSkgewotCQkJZmluaXNoX3dhaXQoJnJvb3QtPmZzX2luZm8tPnRyYW5zYWN0aW9uX3dhaXQsCi0JCQkJICAgICZ3YWl0KTsKLQkJCWJyZWFrOwotCQl9Ci0JCXNjaGVkdWxlKCk7Ci0JCWZpbmlzaF93YWl0KCZyb290LT5mc19pbmZvLT50cmFuc2FjdGlvbl93YWl0LAotCQkJICAgICZ3YWl0KTsKLQl9CisJd2FpdF9ldmVudChyb290LT5mc19pbmZvLT50cmFuc2FjdGlvbl93YWl0LAorCQkgICB0cmFucy0+Y29tbWl0X2RvbmUgfHwgKHRyYW5zLT5pbl9jb21taXQgJiYgIXRyYW5zLT5ibG9ja2VkKSk7CiB9CiAKIC8qCkBAIC0xMjM0LDggKzExODgsNyBAQAogCQlhdG9taWNfaW5jKCZjdXJfdHJhbnMtPnVzZV9jb3VudCk7CiAJCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CiAKLQkJcmV0ID0gd2FpdF9mb3JfY29tbWl0KHJvb3QsIGN1cl90cmFucyk7Ci0JCUJVR19PTihyZXQpOworCQl3YWl0X2Zvcl9jb21taXQocm9vdCwgY3VyX3RyYW5zKTsKIAogCQlwdXRfdHJhbnNhY3Rpb24oY3VyX3RyYW5zKTsKIApkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdHJlZS1sb2cuYyBiL2ZzL2J0cmZzL3RyZWUtbG9nLmMKaW5kZXggYWMyNzhkZC4uYmFiZWU2NSAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvdHJlZS1sb2cuYworKysgYi9mcy9idHJmcy90cmVlLWxvZy5jCkBAIC0xNjE3LDcgKzE2MTcsOCBAQAogCQlyZXR1cm4gMDsKIAogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7Ci0JQlVHX09OKCFwYXRoKTsKKwlpZiAoIXBhdGgpCisJCXJldHVybiAtRU5PTUVNOwogCiAJbnJpdGVtcyA9IGJ0cmZzX2hlYWRlcl9ucml0ZW1zKGViKTsKIAlmb3IgKGkgPSAwOyBpIDwgbnJpdGVtczsgaSsrKSB7CkBAIC0xNzIzLDcgKzE3MjQsOSBAQAogCQkJcmV0dXJuIC1FTk9NRU07CiAKIAkJaWYgKCpsZXZlbCA9PSAxKSB7Ci0JCQl3Yy0+cHJvY2Vzc19mdW5jKHJvb3QsIG5leHQsIHdjLCBwdHJfZ2VuKTsKKwkJCXJldCA9IHdjLT5wcm9jZXNzX2Z1bmMocm9vdCwgbmV4dCwgd2MsIHB0cl9nZW4pOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OwogCiAJCQlwYXRoLT5zbG90c1sqbGV2ZWxdKys7CiAJCQlpZiAod2MtPmZyZWUpIHsKQEAgLTE3ODgsOCArMTc5MSwxMSBAQAogCQkJCXBhcmVudCA9IHBhdGgtPm5vZGVzWypsZXZlbCArIDFdOwogCiAJCQlyb290X293bmVyID0gYnRyZnNfaGVhZGVyX293bmVyKHBhcmVudCk7Ci0JCQl3Yy0+cHJvY2Vzc19mdW5jKHJvb3QsIHBhdGgtPm5vZGVzWypsZXZlbF0sIHdjLAorCQkJcmV0ID0gd2MtPnByb2Nlc3NfZnVuYyhyb290LCBwYXRoLT5ub2Rlc1sqbGV2ZWxdLCB3YywKIAkJCQkgYnRyZnNfaGVhZGVyX2dlbmVyYXRpb24ocGF0aC0+bm9kZXNbKmxldmVsXSkpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCiAJCQlpZiAod2MtPmZyZWUpIHsKIAkJCQlzdHJ1Y3QgZXh0ZW50X2J1ZmZlciAqbmV4dDsKIApkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvdm9sdW1lcy5jIGIvZnMvYnRyZnMvdm9sdW1lcy5jCmluZGV4IGI4OWUzNzIuLjUzODc1YWU3MyAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvdm9sdW1lcy5jCisrKyBiL2ZzL2J0cmZzL3ZvbHVtZXMuYwpAQCAtMTAzNyw3ICsxMDM3LDggQEAKIAlzdHJ1Y3QgYnRyZnNfa2V5IGZvdW5kX2tleTsKIAogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7Ci0JQlVHX09OKCFwYXRoKTsKKwlpZiAoIXBhdGgpCisJCXJldHVybiAtRU5PTUVNOwogCiAJa2V5Lm9iamVjdGlkID0gb2JqZWN0aWQ7CiAJa2V5Lm9mZnNldCA9ICh1NjQpLTE7CkBAIC0yMDYxLDggKzIwNjIsMTAgQEAKIAogCS8qIHN0ZXAgdHdvLCByZWxvY2F0ZSBhbGwgdGhlIGNodW5rcyAqLwogCXBhdGggPSBidHJmc19hbGxvY19wYXRoKCk7Ci0JQlVHX09OKCFwYXRoKTsKLQorCWlmICghcGF0aCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycm9yOworCX0KIAlrZXkub2JqZWN0aWQgPSBCVFJGU19GSVJTVF9DSFVOS19UUkVFX09CSkVDVElEOwogCWtleS5vZmZzZXQgPSAodTY0KS0xOwogCWtleS50eXBlID0gQlRSRlNfQ0hVTktfSVRFTV9LRVk7CkBAIC0yNjYxLDcgKzI2NjQsOCBAQAogCiAJcmV0ID0gZmluZF9uZXh0X2NodW5rKGZzX2luZm8tPmNodW5rX3Jvb3QsCiAJCQkgICAgICBCVFJGU19GSVJTVF9DSFVOS19UUkVFX09CSkVDVElELCAmY2h1bmtfb2Zmc2V0KTsKLQlCVUdfT04ocmV0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OwogCiAJYWxsb2NfcHJvZmlsZSA9IEJUUkZTX0JMT0NLX0dST1VQX01FVEFEQVRBIHwKIAkJCShmc19pbmZvLT5tZXRhZGF0YV9hbGxvY19wcm9maWxlICYKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2VuY3J5cHQuYyBiL2ZzL2NpZnMvY2lmc2VuY3J5cHQuYwppbmRleCAyNTk5OTFiLi5lNzZiZmViIDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNlbmNyeXB0LmMKKysrIGIvZnMvY2lmcy9jaWZzZW5jcnlwdC5jCkBAIC04Nyw5ICs4NywxNSBAQAogCWlmICgoY2lmc19wZHUgPT0gTlVMTCkgfHwgKHNlcnZlciA9PSBOVUxMKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoKGNpZnNfcGR1LT5GbGFnczIgJiBTTUJGTEcyX1NFQ1VSSVRZX1NJR05BVFVSRSkgPT0gMCkKKwlpZiAoIShjaWZzX3BkdS0+RmxhZ3MyICYgU01CRkxHMl9TRUNVUklUWV9TSUdOQVRVUkUpIHx8CisJICAgIHNlcnZlci0+dGNwU3RhdHVzID09IENpZnNOZWVkTmVnb3RpYXRlKQogCQlyZXR1cm4gcmM7CiAKKwlpZiAoIXNlcnZlci0+c2Vzc2lvbl9lc3RhYikgeworCQlzdHJuY3B5KGNpZnNfcGR1LT5TaWduYXR1cmUuU2VjdXJpdHlTaWduYXR1cmUsICJCU1JTUFlMIiwgOCk7CisJCXJldHVybiByYzsKKwl9CisKIAljaWZzX3BkdS0+U2lnbmF0dXJlLlNlcXVlbmNlLlNlcXVlbmNlTnVtYmVyID0KIAkJCWNwdV90b19sZTMyKHNlcnZlci0+c2VxdWVuY2VfbnVtYmVyKTsKIAljaWZzX3BkdS0+U2lnbmF0dXJlLlNlcXVlbmNlLlJlc2VydmVkID0gMDsKQEAgLTE3OCw5ICsxODQsMTUgQEAKIAlpZiAoKGNpZnNfcGR1ID09IE5VTEwpIHx8IChzZXJ2ZXIgPT0gTlVMTCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKChjaWZzX3BkdS0+RmxhZ3MyICYgU01CRkxHMl9TRUNVUklUWV9TSUdOQVRVUkUpID09IDApCisJaWYgKCEoY2lmc19wZHUtPkZsYWdzMiAmIFNNQkZMRzJfU0VDVVJJVFlfU0lHTkFUVVJFKSB8fAorCSAgICBzZXJ2ZXItPnRjcFN0YXR1cyA9PSBDaWZzTmVlZE5lZ290aWF0ZSkKIAkJcmV0dXJuIHJjOwogCisJaWYgKCFzZXJ2ZXItPnNlc3Npb25fZXN0YWIpIHsKKwkJc3RybmNweShjaWZzX3BkdS0+U2lnbmF0dXJlLlNlY3VyaXR5U2lnbmF0dXJlLCAiQlNSU1BZTCIsIDgpOworCQlyZXR1cm4gcmM7CisJfQorCiAJY2lmc19wZHUtPlNpZ25hdHVyZS5TZXF1ZW5jZS5TZXF1ZW5jZU51bWJlciA9CiAJCQkJY3B1X3RvX2xlMzIoc2VydmVyLT5zZXF1ZW5jZV9udW1iZXIpOwogCWNpZnNfcGR1LT5TaWduYXR1cmUuU2VxdWVuY2UuUmVzZXJ2ZWQgPSAwOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9jaWZzZnMuYyBiL2ZzL2NpZnMvY2lmc2ZzLmMKaW5kZXggODY1NTE3NC4uMjEyZTU2MiAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzZnMuYworKysgYi9mcy9jaWZzL2NpZnNmcy5jCkBAIC04NiwyNCArODYsNiBAQAogZXh0ZXJuIG1lbXBvb2xfdCAqY2lmc19yZXFfcG9vbHA7CiBleHRlcm4gbWVtcG9vbF90ICpjaWZzX21pZF9wb29scDsKIAotdm9pZAotY2lmc19zYl9hY3RpdmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKLXsKLQlzdHJ1Y3QgY2lmc19zYl9pbmZvICpzZXJ2ZXIgPSBDSUZTX1NCKHNiKTsKLQotCWlmIChhdG9taWNfaW5jX3JldHVybigmc2VydmVyLT5hY3RpdmUpID09IDEpCi0JCWF0b21pY19pbmMoJnNiLT5zX2FjdGl2ZSk7Ci19Ci0KLXZvaWQKLWNpZnNfc2JfZGVhY3RpdmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKLXsKLQlzdHJ1Y3QgY2lmc19zYl9pbmZvICpzZXJ2ZXIgPSBDSUZTX1NCKHNiKTsKLQotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZzZXJ2ZXItPmFjdGl2ZSkpCi0JCWRlYWN0aXZhdGVfc3VwZXIoc2IpOwotfQotCiBzdGF0aWMgaW50CiBjaWZzX3JlYWRfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2ZzLmggYi9mcy9jaWZzL2NpZnNmcy5oCmluZGV4IGZiZDA1MGMuLmNiNzFkYzEgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY2lmc2ZzLmgKKysrIGIvZnMvY2lmcy9jaWZzZnMuaApAQCAtNDEsMTAgKzQxLDYgQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgYWRkcmVzc19zcGFjZV9vcGVyYXRpb25zIGNpZnNfYWRkcl9vcHM7CiBleHRlcm4gY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBjaWZzX2FkZHJfb3BzX3NtYWxsYnVmOwogCi0vKiBGdW5jdGlvbnMgcmVsYXRlZCB0byBzdXBlciBibG9jayBvcGVyYXRpb25zICovCi1leHRlcm4gdm9pZCBjaWZzX3NiX2FjdGl2ZShzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKLWV4dGVybiB2b2lkIGNpZnNfc2JfZGVhY3RpdmUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7Ci0KIC8qIEZ1bmN0aW9ucyByZWxhdGVkIHRvIGlub2RlcyAqLwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIGNpZnNfZGlyX2lub2RlX29wczsKIGV4dGVybiBzdHJ1Y3QgaW5vZGUgKmNpZnNfcm9vdF9pZ2V0KHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc2dsb2IuaCBiL2ZzL2NpZnMvY2lmc2dsb2IuaAppbmRleCAxZmNmNGU1Li4zOGNlNmQ0IDEwMDY0NAotLS0gYS9mcy9jaWZzL2NpZnNnbG9iLmgKKysrIGIvZnMvY2lmcy9jaWZzZ2xvYi5oCkBAIC05NDIsOCArOTQyLDYgQEAKIEdMT0JBTF9FWFRFUk4gc3BpbmxvY2tfdCBzaWRnaWRsb2NrOwogCiB2b2lkIGNpZnNfb3Bsb2NrX2JyZWFrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Ci12b2lkIGNpZnNfb3Bsb2NrX2JyZWFrX2dldChzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpjZmlsZSk7Ci12b2lkIGNpZnNfb3Bsb2NrX2JyZWFrX3B1dChzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpjZmlsZSk7CiAKIGV4dGVybiBjb25zdCBzdHJ1Y3Qgc2xvd193b3JrX29wcyBjaWZzX29wbG9ja19icmVha19vcHM7CiAKZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY2lmc3NtYi5jIGIvZnMvY2lmcy9jaWZzc21iLmMKaW5kZXggMWE5ZmU3Zi4uYWFjMzdkOSAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jaWZzc21iLmMKKysrIGIvZnMvY2lmcy9jaWZzc21iLmMKQEAgLTEwNyw3ICsxMDcsNyBAQAogc3RhdGljIGludAogY2lmc19yZWNvbm5lY3RfdGNvbihzdHJ1Y3QgY2lmc190Y29uICp0Y29uLCBpbnQgc21iX2NvbW1hbmQpCiB7Ci0JaW50IHJjID0gMDsKKwlpbnQgcmM7CiAJc3RydWN0IGNpZnNfc2VzICpzZXM7CiAJc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyOwogCXN0cnVjdCBubHNfdGFibGUgKm5sc19jb2RlcGFnZTsKQEAgLTU3MjAsNiArNTcyMCw3IEBACiAJY2hhciAqdGVtcF9wdHI7CiAJY2hhciAqZW5kX29mX3NtYjsKIAlfX3UxNiBwYXJhbXMsIGJ5dGVfY291bnQsIGRhdGFfb2Zmc2V0OworCXVuc2lnbmVkIGludCBlYV9uYW1lX2xlbiA9IGVhX25hbWUgPyBzdHJsZW4oZWFfbmFtZSkgOiAwOwogCiAJY0ZZSSgxLCAiSW4gUXVlcnkgQWxsIEVBcyBwYXRoICVzIiwgc2VhcmNoTmFtZSk7CiBRQWxsRUFzUmV0cnk6CkBAIC01ODM3LDcgKzU4MzgsOCBAQAogCQl9CiAKIAkJaWYgKGVhX25hbWUpIHsKLQkJCWlmIChzdHJuY21wKGVhX25hbWUsIHRlbXBfcHRyLCBuYW1lX2xlbikgPT0gMCkgeworCQkJaWYgKGVhX25hbWVfbGVuID09IG5hbWVfbGVuICYmCisJCQkgICAgc3RybmNtcChlYV9uYW1lLCB0ZW1wX3B0ciwgbmFtZV9sZW4pID09IDApIHsKIAkJCQl0ZW1wX3B0ciArPSBuYW1lX2xlbiArIDE7CiAJCQkJcmMgPSB2YWx1ZV9sZW47CiAJCQkJaWYgKGJ1Zl9zaXplID09IDApCmRpZmYgLS1naXQgYS9mcy9jaWZzL2Nvbm5lY3QuYyBiL2ZzL2NpZnMvY29ubmVjdC5jCmluZGV4IGU2NjI5N2IuLjgwYzJlM2EgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvY29ubmVjdC5jCisrKyBiL2ZzL2NpZnMvY29ubmVjdC5jCkBAIC0zMTksMzQ0ICszMTksMjIxIEBACiAJcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9ucnRfd3EsICZzZXJ2ZXItPmVjaG8sIFNNQl9FQ0hPX0lOVEVSVkFMKTsKIH0KIAotc3RhdGljIGludAotY2lmc19kZW11bHRpcGxleF90aHJlYWQodm9pZCAqcCkKK3N0YXRpYyBib29sCithbGxvY2F0ZV9idWZmZXJzKGNoYXIgKipiaWdidWYsIGNoYXIgKipzbWFsbGJ1ZiwgdW5zaWduZWQgaW50IHNpemUsCisJCSBib29sIGlzX2xhcmdlX2J1ZikKIHsKLQlpbnQgbGVuZ3RoOwotCXN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciA9IHA7Ci0JdW5zaWduZWQgaW50IHBkdV9sZW5ndGgsIHRvdGFsX3JlYWQ7Ci0Jc3RydWN0IHNtYl9oZHIgKnNtYl9idWZmZXIgPSBOVUxMOwotCXN0cnVjdCBzbWJfaGRyICpiaWdidWYgPSBOVUxMOwotCXN0cnVjdCBzbWJfaGRyICpzbWFsbGJ1ZiA9IE5VTEw7Ci0Jc3RydWN0IG1zZ2hkciBzbWJfbXNnOwotCXN0cnVjdCBrdmVjIGlvdjsKLQlzdHJ1Y3Qgc29ja2V0ICpjc29ja2V0ID0gc2VydmVyLT5zc29ja2V0OwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcCwgKnRtcDI7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrX3RvX3dha2UgPSBOVUxMOwotCXN0cnVjdCBtaWRfcV9lbnRyeSAqbWlkX2VudHJ5OwotCWNoYXIgdGVtcDsKLQlib29sIGlzTGFyZ2VCdWYgPSBmYWxzZTsKLQlib29sIGlzTXVsdGlSc3A7Ci0JaW50IHJlY29ubmVjdDsKKwljaGFyICpiYnVmID0gKmJpZ2J1ZiwgKnNidWYgPSAqc21hbGxidWY7CiAKLQljdXJyZW50LT5mbGFncyB8PSBQRl9NRU1BTExPQzsKLQljRllJKDEsICJEZW11bHRpcGxleCBQSUQ6ICVkIiwgdGFza19waWRfbnIoY3VycmVudCkpOwotCi0JbGVuZ3RoID0gYXRvbWljX2luY19yZXR1cm4oJnRjcFNlc0FsbG9jQ291bnQpOwotCWlmIChsZW5ndGggPiAxKQotCQltZW1wb29sX3Jlc2l6ZShjaWZzX3JlcV9wb29scCwgbGVuZ3RoICsgY2lmc19taW5fcmN2LAotCQkJCUdGUF9LRVJORUwpOwotCi0Jc2V0X2ZyZWV6YWJsZSgpOwotCXdoaWxlIChzZXJ2ZXItPnRjcFN0YXR1cyAhPSBDaWZzRXhpdGluZykgewotCQlpZiAodHJ5X3RvX2ZyZWV6ZSgpKQotCQkJY29udGludWU7Ci0JCWlmIChiaWdidWYgPT0gTlVMTCkgewotCQkJYmlnYnVmID0gY2lmc19idWZfZ2V0KCk7Ci0JCQlpZiAoIWJpZ2J1ZikgewotCQkJCWNFUlJPUigxLCAiTm8gbWVtb3J5IGZvciBsYXJnZSBTTUIgcmVzcG9uc2UiKTsKLQkJCQltc2xlZXAoMzAwMCk7Ci0JCQkJLyogcmV0cnkgd2lsbCBjaGVjayBpZiBleGl0aW5nICovCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoaXNMYXJnZUJ1ZikgewotCQkJLyogd2UgYXJlIHJldXNpbmcgYSBkaXJ0eSBsYXJnZSBidWYsIGNsZWFyIGl0cyBzdGFydCAqLwotCQkJbWVtc2V0KGJpZ2J1ZiwgMCwgc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSk7CisJaWYgKGJidWYgPT0gTlVMTCkgeworCQliYnVmID0gKGNoYXIgKiljaWZzX2J1Zl9nZXQoKTsKKwkJaWYgKCFiYnVmKSB7CisJCQljRVJST1IoMSwgIk5vIG1lbW9yeSBmb3IgbGFyZ2UgU01CIHJlc3BvbnNlIik7CisJCQltc2xlZXAoMzAwMCk7CisJCQkvKiByZXRyeSB3aWxsIGNoZWNrIGlmIGV4aXRpbmcgKi8KKwkJCXJldHVybiBmYWxzZTsKIAkJfQorCX0gZWxzZSBpZiAoaXNfbGFyZ2VfYnVmKSB7CisJCS8qIHdlIGFyZSByZXVzaW5nIGEgZGlydHkgbGFyZ2UgYnVmLCBjbGVhciBpdHMgc3RhcnQgKi8KKwkJbWVtc2V0KGJidWYsIDAsIHNpemUpOworCX0KIAotCQlpZiAoc21hbGxidWYgPT0gTlVMTCkgewotCQkJc21hbGxidWYgPSBjaWZzX3NtYWxsX2J1Zl9nZXQoKTsKLQkJCWlmICghc21hbGxidWYpIHsKLQkJCQljRVJST1IoMSwgIk5vIG1lbW9yeSBmb3IgU01CIHJlc3BvbnNlIik7Ci0JCQkJbXNsZWVwKDEwMDApOwotCQkJCS8qIHJldHJ5IHdpbGwgY2hlY2sgaWYgZXhpdGluZyAqLwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJLyogYmVnaW5uaW5nIG9mIHNtYiBidWZmZXIgaXMgY2xlYXJlZCBpbiBvdXIgYnVmX2dldCAqLwotCQl9IGVsc2UgLyogaWYgZXhpc3Rpbmcgc21hbGwgYnVmIGNsZWFyIGJlZ2lubmluZyAqLwotCQkJbWVtc2V0KHNtYWxsYnVmLCAwLCBzaXplb2Yoc3RydWN0IHNtYl9oZHIpKTsKLQotCQlpc0xhcmdlQnVmID0gZmFsc2U7Ci0JCWlzTXVsdGlSc3AgPSBmYWxzZTsKLQkJc21iX2J1ZmZlciA9IHNtYWxsYnVmOwotCQlpb3YuaW92X2Jhc2UgPSBzbWJfYnVmZmVyOwotCQlpb3YuaW92X2xlbiA9IDQ7Ci0JCXNtYl9tc2cubXNnX2NvbnRyb2wgPSBOVUxMOwotCQlzbWJfbXNnLm1zZ19jb250cm9sbGVuID0gMDsKLQkJcGR1X2xlbmd0aCA9IDQ7IC8qIGVub3VnaCB0byBnZXQgUkZDMTAwMSBoZWFkZXIgKi8KLQotaW5jb21wbGV0ZV9yY3Y6Ci0JCWlmIChlY2hvX3JldHJpZXMgPiAwICYmIHNlcnZlci0+dGNwU3RhdHVzID09IENpZnNHb29kICYmCi0JCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIHNlcnZlci0+bHN0cnAgKwotCQkJCQkoZWNob19yZXRyaWVzICogU01CX0VDSE9fSU5URVJWQUwpKSkgewotCQkJY0VSUk9SKDEsICJTZXJ2ZXIgJXMgaGFzIG5vdCByZXNwb25kZWQgaW4gJWQgc2Vjb25kcy4gIgotCQkJCSAgIlJlY29ubmVjdGluZy4uLiIsIHNlcnZlci0+aG9zdG5hbWUsCi0JCQkJICAoZWNob19yZXRyaWVzICogU01CX0VDSE9fSU5URVJWQUwgLyBIWikpOwotCQkJY2lmc19yZWNvbm5lY3Qoc2VydmVyKTsKLQkJCWNzb2NrZXQgPSBzZXJ2ZXItPnNzb2NrZXQ7Ci0JCQl3YWtlX3VwKCZzZXJ2ZXItPnJlc3BvbnNlX3EpOwotCQkJY29udGludWU7CisJaWYgKHNidWYgPT0gTlVMTCkgeworCQlzYnVmID0gKGNoYXIgKiljaWZzX3NtYWxsX2J1Zl9nZXQoKTsKKwkJaWYgKCFzYnVmKSB7CisJCQljRVJST1IoMSwgIk5vIG1lbW9yeSBmb3IgU01CIHJlc3BvbnNlIik7CisJCQltc2xlZXAoMTAwMCk7CisJCQkvKiByZXRyeSB3aWxsIGNoZWNrIGlmIGV4aXRpbmcgKi8KKwkJCXJldHVybiBmYWxzZTsKIAkJfQorCQkvKiBiZWdpbm5pbmcgb2Ygc21iIGJ1ZmZlciBpcyBjbGVhcmVkIGluIG91ciBidWZfZ2V0ICovCisJfSBlbHNlIHsKKwkJLyogaWYgZXhpc3Rpbmcgc21hbGwgYnVmIGNsZWFyIGJlZ2lubmluZyAqLworCQltZW1zZXQoc2J1ZiwgMCwgc2l6ZSk7CisJfQogCi0JCWxlbmd0aCA9Ci0JCSAgICBrZXJuZWxfcmVjdm1zZyhjc29ja2V0LCAmc21iX21zZywKLQkJCQkmaW92LCAxLCBwZHVfbGVuZ3RoLCAwIC8qIEJCIG90aGVyIGZsYWdzPyAqLyk7CisJKmJpZ2J1ZiA9IGJidWY7CisJKnNtYWxsYnVmID0gc2J1ZjsKIAorCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50CityZWFkX2Zyb21fc29ja2V0KHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwgc3RydWN0IG1zZ2hkciAqc21iX21zZywKKwkJIHN0cnVjdCBrdmVjICppb3YsIHVuc2lnbmVkIGludCB0b19yZWFkLAorCQkgdW5zaWduZWQgaW50ICpwdG90YWxfcmVhZCwgYm9vbCBpc19oZWFkZXJfcmVhZCkKK3sKKwlpbnQgbGVuZ3RoLCByYyA9IDA7CisJdW5zaWduZWQgaW50IHRvdGFsX3JlYWQ7CisJY2hhciAqYnVmID0gaW92LT5pb3ZfYmFzZTsKKworCWZvciAodG90YWxfcmVhZCA9IDA7IHRvdGFsX3JlYWQgPCB0b19yZWFkOyB0b3RhbF9yZWFkICs9IGxlbmd0aCkgeworCQlsZW5ndGggPSBrZXJuZWxfcmVjdm1zZyhzZXJ2ZXItPnNzb2NrZXQsIHNtYl9tc2csIGlvdiwgMSwKKwkJCQkJdG9fcmVhZCAtIHRvdGFsX3JlYWQsIDApOwogCQlpZiAoc2VydmVyLT50Y3BTdGF0dXMgPT0gQ2lmc0V4aXRpbmcpIHsKKwkJCS8qIHRoZW4gd2lsbCBleGl0ICovCisJCQlyYyA9IDI7CiAJCQlicmVhazsKIAkJfSBlbHNlIGlmIChzZXJ2ZXItPnRjcFN0YXR1cyA9PSBDaWZzTmVlZFJlY29ubmVjdCkgewotCQkJY0ZZSSgxLCAiUmVjb25uZWN0IGFmdGVyIHNlcnZlciBzdG9wcGVkIHJlc3BvbmRpbmciKTsKIAkJCWNpZnNfcmVjb25uZWN0KHNlcnZlcik7Ci0JCQljRllJKDEsICJjYWxsIHRvIHJlY29ubmVjdCBkb25lIik7Ci0JCQljc29ja2V0ID0gc2VydmVyLT5zc29ja2V0OwotCQkJY29udGludWU7CisJCQkvKiBSZWNvbm5lY3Qgd2FrZXMgdXAgcnNwbnMgcSAqLworCQkJLyogTm93IHdlIHdpbGwgcmVyZWFkIHNvY2sgKi8KKwkJCXJjID0gMTsKKwkJCWJyZWFrOwogCQl9IGVsc2UgaWYgKGxlbmd0aCA9PSAtRVJFU1RBUlRTWVMgfHwKIAkJCSAgIGxlbmd0aCA9PSAtRUFHQUlOIHx8CiAJCQkgICBsZW5ndGggPT0gLUVJTlRSKSB7Ci0JCQltc2xlZXAoMSk7IC8qIG1pbmltdW0gc2xlZXAgdG8gcHJldmVudCBsb29waW5nCi0JCQkJYWxsb3dpbmcgc29ja2V0IHRvIGNsZWFyIGFuZCBhcHAgdGhyZWFkcyB0byBzZXQKLQkJCQl0Y3BTdGF0dXMgQ2lmc05lZWRSZWNvbm5lY3QgaWYgc2VydmVyIGh1bmcgKi8KLQkJCWlmIChwZHVfbGVuZ3RoIDwgNCkgewotCQkJCWlvdi5pb3ZfYmFzZSA9ICg0IC0gcGR1X2xlbmd0aCkgKwotCQkJCQkJCShjaGFyICopc21iX2J1ZmZlcjsKLQkJCQlpb3YuaW92X2xlbiA9IHBkdV9sZW5ndGg7Ci0JCQkJc21iX21zZy5tc2dfY29udHJvbCA9IE5VTEw7Ci0JCQkJc21iX21zZy5tc2dfY29udHJvbGxlbiA9IDA7Ci0JCQkJZ290byBpbmNvbXBsZXRlX3JjdjsKLQkJCX0gZWxzZQotCQkJCWNvbnRpbnVlOwotCQl9IGVsc2UgaWYgKGxlbmd0aCA8PSAwKSB7Ci0JCQljRllJKDEsICJSZWNvbm5lY3QgYWZ0ZXIgdW5leHBlY3RlZCBwZWVrIGVycm9yICVkIiwKLQkJCQlsZW5ndGgpOwotCQkJY2lmc19yZWNvbm5lY3Qoc2VydmVyKTsKLQkJCWNzb2NrZXQgPSBzZXJ2ZXItPnNzb2NrZXQ7Ci0JCQl3YWtlX3VwKCZzZXJ2ZXItPnJlc3BvbnNlX3EpOwotCQkJY29udGludWU7Ci0JCX0gZWxzZSBpZiAobGVuZ3RoIDwgcGR1X2xlbmd0aCkgewotCQkJY0ZZSSgxLCAicmVxdWVzdGVkICVkIGJ5dGVzIGJ1dCBvbmx5IGdvdCAlZCBieXRlcyIsCi0JCQkJICBwZHVfbGVuZ3RoLCBsZW5ndGgpOwotCQkJcGR1X2xlbmd0aCAtPSBsZW5ndGg7Ci0JCQltc2xlZXAoMSk7Ci0JCQlnb3RvIGluY29tcGxldGVfcmN2OwotCQl9Ci0KLQkJLyogVGhlIHJpZ2h0IGFtb3VudCB3YXMgcmVhZCBmcm9tIHNvY2tldCAtIDQgYnl0ZXMgKi8KLQkJLyogc28gd2UgY2FuIG5vdyBpbnRlcnByZXQgdGhlIGxlbmd0aCBmaWVsZCAqLwotCi0JCS8qIHRoZSBmaXJzdCBieXRlIGJpZyBlbmRpYW4gb2YgdGhlIGxlbmd0aCBmaWVsZCwKLQkJaXMgYWN0dWFsbHkgbm90IHBhcnQgb2YgdGhlIGxlbmd0aCBidXQgdGhlIHR5cGUKLQkJd2l0aCB0aGUgbW9zdCBjb21tb24sIHplcm8sIGFzIHJlZ3VsYXIgZGF0YSAqLwotCQl0ZW1wID0gKigoY2hhciAqKSBzbWJfYnVmZmVyKTsKLQotCQkvKiBOb3RlIHRoYXQgRkMgMTAwMSBsZW5ndGggaXMgYmlnIGVuZGlhbiBvbiB0aGUgd2lyZSwKLQkJYnV0IHdlIGNvbnZlcnQgaXQgaGVyZSBzbyBpdCBpcyBhbHdheXMgbWFuaXB1bGF0ZWQKLQkJYXMgaG9zdCBieXRlIG9yZGVyICovCi0JCXBkdV9sZW5ndGggPSBiZTMyX3RvX2NwdShzbWJfYnVmZmVyLT5zbWJfYnVmX2xlbmd0aCk7Ci0KLQkJY0ZZSSgxLCAicmZjMTAwMiBsZW5ndGggMHgleCIsIHBkdV9sZW5ndGgrNCk7Ci0KLQkJaWYgKHRlbXAgPT0gKGNoYXIpIFJGQzEwMDJfU0VTU0lPTl9LRUVQX0FMSVZFKSB7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIGlmICh0ZW1wID09IChjaGFyKVJGQzEwMDJfUE9TSVRJVkVfU0VTU0lPTl9SRVNQT05TRSkgewotCQkJY0ZZSSgxLCAiR29vZCBSRkMgMTAwMiBzZXNzaW9uIHJzcCIpOwotCQkJY29udGludWU7Ci0JCX0gZWxzZSBpZiAodGVtcCA9PSAoY2hhcilSRkMxMDAyX05FR0FUSVZFX1NFU1NJT05fUkVTUE9OU0UpIHsKLQkJCS8qIHdlIGdldCB0aGlzIGZyb20gV2luZG93cyA5OCBpbnN0ZWFkIG9mCi0JCQkgICBhbiBlcnJvciBvbiBTTUIgbmVncHJvdCByZXNwb25zZSAqLwotCQkJY0ZZSSgxLCAiTmVnYXRpdmUgUkZDMTAwMiBTZXNzaW9uIFJlc3BvbnNlIEVycm9yIDB4JXgpIiwKLQkJCQlwZHVfbGVuZ3RoKTsKLQkJCS8qIGdpdmUgc2VydmVyIGEgc2Vjb25kIHRvIGNsZWFuIHVwICAqLwotCQkJbXNsZWVwKDEwMDApOwotCQkJLyogYWx3YXlzIHRyeSA0NDUgZmlyc3Qgb24gcmVjb25uZWN0IHNpbmNlIHdlIGdldCBOQUNLCi0JCQkgKiBvbiBzb21lIGlmIHdlIGV2ZXIgY29ubmVjdGVkIHRvIHBvcnQgMTM5ICh0aGUgTkFDSwotCQkJICogaXMgc2luY2Ugd2UgZG8gbm90IGJlZ2luIHdpdGggUkZDMTAwMSBzZXNzaW9uCi0JCQkgKiBpbml0aWFsaXplIGZyYW1lKQorCQkJLyoKKwkJCSAqIE1pbmltdW0gc2xlZXAgdG8gcHJldmVudCBsb29waW5nLCBhbGxvd2luZyBzb2NrZXQKKwkJCSAqIHRvIGNsZWFyIGFuZCBhcHAgdGhyZWFkcyB0byBzZXQgdGNwU3RhdHVzCisJCQkgKiBDaWZzTmVlZFJlY29ubmVjdCBpZiBzZXJ2ZXIgaHVuZy4KIAkJCSAqLwotCQkJY2lmc19zZXRfcG9ydCgoc3RydWN0IHNvY2thZGRyICopCi0JCQkJCSZzZXJ2ZXItPmRzdGFkZHIsIENJRlNfUE9SVCk7Ci0JCQljaWZzX3JlY29ubmVjdChzZXJ2ZXIpOwotCQkJY3NvY2tldCA9IHNlcnZlci0+c3NvY2tldDsKLQkJCXdha2VfdXAoJnNlcnZlci0+cmVzcG9uc2VfcSk7Ci0JCQljb250aW51ZTsKLQkJfSBlbHNlIGlmICh0ZW1wICE9IChjaGFyKSAwKSB7Ci0JCQljRVJST1IoMSwgIlVua25vd24gUkZDIDEwMDIgZnJhbWUiKTsKLQkJCWNpZnNfZHVtcF9tZW0oIiBSZWNlaXZlZCBEYXRhOiAiLCAoY2hhciAqKXNtYl9idWZmZXIsCi0JCQkJICAgICAgbGVuZ3RoKTsKLQkJCWNpZnNfcmVjb25uZWN0KHNlcnZlcik7Ci0JCQljc29ja2V0ID0gc2VydmVyLT5zc29ja2V0OwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBlbHNlIHdlIGhhdmUgYW4gU01CIHJlc3BvbnNlICovCi0JCWlmICgocGR1X2xlbmd0aCA+IENJRlNNYXhCdWZTaXplICsgTUFYX0NJRlNfSERSX1NJWkUgLSA0KSB8fAotCQkJICAgIChwZHVfbGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSAtIDEgLSA0KSkgewotCQkJY0VSUk9SKDEsICJJbnZhbGlkIHNpemUgU01CIGxlbmd0aCAlZCBwZHVfbGVuZ3RoICVkIiwKLQkJCQkJbGVuZ3RoLCBwZHVfbGVuZ3RoKzQpOwotCQkJY2lmc19yZWNvbm5lY3Qoc2VydmVyKTsKLQkJCWNzb2NrZXQgPSBzZXJ2ZXItPnNzb2NrZXQ7Ci0JCQl3YWtlX3VwKCZzZXJ2ZXItPnJlc3BvbnNlX3EpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQkvKiBlbHNlIGxlbmd0aCBvayAqLwotCQlyZWNvbm5lY3QgPSAwOwotCi0JCWlmIChwZHVfbGVuZ3RoID4gTUFYX0NJRlNfU01BTExfQlVGRkVSX1NJWkUgLSA0KSB7Ci0JCQlpc0xhcmdlQnVmID0gdHJ1ZTsKLQkJCW1lbWNweShiaWdidWYsIHNtYWxsYnVmLCA0KTsKLQkJCXNtYl9idWZmZXIgPSBiaWdidWY7Ci0JCX0KLQkJbGVuZ3RoID0gMDsKLQkJaW92Lmlvdl9iYXNlID0gNCArIChjaGFyICopc21iX2J1ZmZlcjsKLQkJaW92Lmlvdl9sZW4gPSBwZHVfbGVuZ3RoOwotCQlmb3IgKHRvdGFsX3JlYWQgPSAwOyB0b3RhbF9yZWFkIDwgcGR1X2xlbmd0aDsKLQkJICAgICB0b3RhbF9yZWFkICs9IGxlbmd0aCkgewotCQkJbGVuZ3RoID0ga2VybmVsX3JlY3Ztc2coY3NvY2tldCwgJnNtYl9tc2csICZpb3YsIDEsCi0JCQkJCQlwZHVfbGVuZ3RoIC0gdG90YWxfcmVhZCwgMCk7Ci0JCQlpZiAoc2VydmVyLT50Y3BTdGF0dXMgPT0gQ2lmc0V4aXRpbmcpIHsKLQkJCQkvKiB0aGVuIHdpbGwgZXhpdCAqLwotCQkJCXJlY29ubmVjdCA9IDI7Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgaWYgKHNlcnZlci0+dGNwU3RhdHVzID09IENpZnNOZWVkUmVjb25uZWN0KSB7Ci0JCQkJY2lmc19yZWNvbm5lY3Qoc2VydmVyKTsKLQkJCQljc29ja2V0ID0gc2VydmVyLT5zc29ja2V0OwotCQkJCS8qIFJlY29ubmVjdCB3YWtlcyB1cCByc3BucyBxICovCi0JCQkJLyogTm93IHdlIHdpbGwgcmVyZWFkIHNvY2sgKi8KLQkJCQlyZWNvbm5lY3QgPSAxOwotCQkJCWJyZWFrOwotCQkJfSBlbHNlIGlmIChsZW5ndGggPT0gLUVSRVNUQVJUU1lTIHx8Ci0JCQkJICAgbGVuZ3RoID09IC1FQUdBSU4gfHwKLQkJCQkgICBsZW5ndGggPT0gLUVJTlRSKSB7Ci0JCQkJbXNsZWVwKDEpOyAvKiBtaW5pbXVtIHNsZWVwIHRvIHByZXZlbnQgbG9vcGluZywKLQkJCQkJICAgICAgYWxsb3dpbmcgc29ja2V0IHRvIGNsZWFyIGFuZCBhcHAKLQkJCQkJICAgICAgdGhyZWFkcyB0byBzZXQgdGNwU3RhdHVzCi0JCQkJCSAgICAgIENpZnNOZWVkUmVjb25uZWN0IGlmIHNlcnZlciBodW5nKi8KLQkJCQlsZW5ndGggPSAwOworCQkJdXNsZWVwX3JhbmdlKDEwMDAsIDIwMDApOworCQkJbGVuZ3RoID0gMDsKKwkJCWlmICghaXNfaGVhZGVyX3JlYWQpCiAJCQkJY29udGludWU7Ci0JCQl9IGVsc2UgaWYgKGxlbmd0aCA8PSAwKSB7Ci0JCQkJY0VSUk9SKDEsICJSZWNlaXZlZCBubyBkYXRhLCBleHBlY3RpbmcgJWQiLAotCQkJCQkgICAgICBwZHVfbGVuZ3RoIC0gdG90YWxfcmVhZCk7Ci0JCQkJY2lmc19yZWNvbm5lY3Qoc2VydmVyKTsKLQkJCQljc29ja2V0ID0gc2VydmVyLT5zc29ja2V0OwotCQkJCXJlY29ubmVjdCA9IDE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlY29ubmVjdCA9PSAyKQorCQkJLyogU3BlY2lhbCBoYW5kbGluZyBmb3IgaGVhZGVyIHJlYWQgKi8KKwkJCWlmICh0b3RhbF9yZWFkKSB7CisJCQkJaW92LT5pb3ZfYmFzZSA9ICh0b19yZWFkIC0gdG90YWxfcmVhZCkgKworCQkJCQkJYnVmOworCQkJCWlvdi0+aW92X2xlbiA9IHRvX3JlYWQgLSB0b3RhbF9yZWFkOworCQkJCXNtYl9tc2ctPm1zZ19jb250cm9sID0gTlVMTDsKKwkJCQlzbWJfbXNnLT5tc2dfY29udHJvbGxlbiA9IDA7CisJCQkJcmMgPSAzOworCQkJfSBlbHNlCisJCQkJcmMgPSAxOwogCQkJYnJlYWs7Ci0JCWVsc2UgaWYgKHJlY29ubmVjdCA9PSAxKQotCQkJY29udGludWU7CisJCX0gZWxzZSBpZiAobGVuZ3RoIDw9IDApIHsKKwkJCWNFUlJPUigxLCAiUmVjZWl2ZWQgbm8gZGF0YSwgZXhwZWN0aW5nICVkIiwKKwkJCSAgICAgICB0b19yZWFkIC0gdG90YWxfcmVhZCk7CisJCQljaWZzX3JlY29ubmVjdChzZXJ2ZXIpOworCQkJcmMgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CiAKLQkJdG90YWxfcmVhZCArPSA0OyAvKiBhY2NvdW50IGZvciByZmMxMDAyIGhkciAqLworCSpwdG90YWxfcmVhZCA9IHRvdGFsX3JlYWQ7CisJcmV0dXJuIHJjOworfQogCi0JCWR1bXBfc21iKHNtYl9idWZmZXIsIHRvdGFsX3JlYWQpOworc3RhdGljIGJvb2wKK2NoZWNrX3JmYzEwMDJfaGVhZGVyKHN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciwgY2hhciAqYnVmKQoreworCWNoYXIgdGVtcCA9ICpidWY7CisJdW5zaWduZWQgaW50IHBkdV9sZW5ndGggPSBiZTMyX3RvX2NwdSgKKwkJCQkoKHN0cnVjdCBzbWJfaGRyICopYnVmKS0+c21iX2J1Zl9sZW5ndGgpOwogCisJLyoKKwkgKiBUaGUgZmlyc3QgYnl0ZSBiaWcgZW5kaWFuIG9mIHRoZSBsZW5ndGggZmllbGQsCisJICogaXMgYWN0dWFsbHkgbm90IHBhcnQgb2YgdGhlIGxlbmd0aCBidXQgdGhlIHR5cGUKKwkgKiB3aXRoIHRoZSBtb3N0IGNvbW1vbiwgemVybywgYXMgcmVndWxhciBkYXRhLgorCSAqLworCWlmICh0ZW1wID09IChjaGFyKSBSRkMxMDAyX1NFU1NJT05fS0VFUF9BTElWRSkgeworCQlyZXR1cm4gZmFsc2U7CisJfSBlbHNlIGlmICh0ZW1wID09IChjaGFyKVJGQzEwMDJfUE9TSVRJVkVfU0VTU0lPTl9SRVNQT05TRSkgeworCQljRllJKDEsICJHb29kIFJGQyAxMDAyIHNlc3Npb24gcnNwIik7CisJCXJldHVybiBmYWxzZTsKKwl9IGVsc2UgaWYgKHRlbXAgPT0gKGNoYXIpUkZDMTAwMl9ORUdBVElWRV9TRVNTSU9OX1JFU1BPTlNFKSB7CiAJCS8qCi0JCSAqIFdlIGtub3cgdGhhdCB3ZSByZWNlaXZlZCBlbm91Z2ggdG8gZ2V0IHRvIHRoZSBNSUQgYXMgd2UKLQkJICogY2hlY2tlZCB0aGUgcGR1X2xlbmd0aCBlYXJsaWVyLiBOb3cgY2hlY2sgdG8gc2VlCi0JCSAqIGlmIHRoZSByZXN0IG9mIHRoZSBoZWFkZXIgaXMgT0suIFdlIGJvcnJvdyB0aGUgbGVuZ3RoCi0JCSAqIHZhciBmb3IgdGhlIHJlc3Qgb2YgdGhlIGxvb3AgdG8gYXZvaWQgYSBuZXcgc3RhY2sgdmFyLgotCQkgKgotCQkgKiA0OCBieXRlcyBpcyBlbm91Z2ggdG8gZGlzcGxheSB0aGUgaGVhZGVyIGFuZCBhIGxpdHRsZSBiaXQKLQkJICogaW50byB0aGUgcGF5bG9hZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorCQkgKiBXZSBnZXQgdGhpcyBmcm9tIFdpbmRvd3MgOTggaW5zdGVhZCBvZiBhbiBlcnJvciBvbgorCQkgKiBTTUIgbmVncHJvdCByZXNwb25zZS4KIAkJICovCi0JCWxlbmd0aCA9IGNoZWNrU01CKHNtYl9idWZmZXIsIHNtYl9idWZmZXItPk1pZCwgdG90YWxfcmVhZCk7Ci0JCWlmIChsZW5ndGggIT0gMCkKLQkJCWNpZnNfZHVtcF9tZW0oIkJhZCBTTUI6ICIsIHNtYl9idWZmZXIsCi0JCQkJCW1pbl90KHVuc2lnbmVkIGludCwgdG90YWxfcmVhZCwgNDgpKTsKKwkJY0ZZSSgxLCAiTmVnYXRpdmUgUkZDMTAwMiBTZXNzaW9uIFJlc3BvbnNlIEVycm9yIDB4JXgpIiwKKwkJCXBkdV9sZW5ndGgpOworCQkvKiBnaXZlIHNlcnZlciBhIHNlY29uZCB0byBjbGVhbiB1cCAqLworCQltc2xlZXAoMTAwMCk7CisJCS8qCisJCSAqIEFsd2F5cyB0cnkgNDQ1IGZpcnN0IG9uIHJlY29ubmVjdCBzaW5jZSB3ZSBnZXQgTkFDSworCQkgKiBvbiBzb21lIGlmIHdlIGV2ZXIgY29ubmVjdGVkIHRvIHBvcnQgMTM5ICh0aGUgTkFDSworCQkgKiBpcyBzaW5jZSB3ZSBkbyBub3QgYmVnaW4gd2l0aCBSRkMxMDAxIHNlc3Npb24KKwkJICogaW5pdGlhbGl6ZSBmcmFtZSkuCisJCSAqLworCQljaWZzX3NldF9wb3J0KChzdHJ1Y3Qgc29ja2FkZHIgKikKKwkJCQkmc2VydmVyLT5kc3RhZGRyLCBDSUZTX1BPUlQpOworCQljaWZzX3JlY29ubmVjdChzZXJ2ZXIpOworCQl3YWtlX3VwKCZzZXJ2ZXItPnJlc3BvbnNlX3EpOworCQlyZXR1cm4gZmFsc2U7CisJfSBlbHNlIGlmICh0ZW1wICE9IChjaGFyKSAwKSB7CisJCWNFUlJPUigxLCAiVW5rbm93biBSRkMgMTAwMiBmcmFtZSIpOworCQljaWZzX2R1bXBfbWVtKCIgUmVjZWl2ZWQgRGF0YTogIiwgYnVmLCA0KTsKKwkJY2lmc19yZWNvbm5lY3Qoc2VydmVyKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KIAotCQltaWRfZW50cnkgPSBOVUxMOwotCQlzZXJ2ZXItPmxzdHJwID0gamlmZmllczsKKwkvKiBlbHNlIHdlIGhhdmUgYW4gU01CIHJlc3BvbnNlICovCisJaWYgKChwZHVfbGVuZ3RoID4gQ0lGU01heEJ1ZlNpemUgKyBNQVhfQ0lGU19IRFJfU0laRSAtIDQpIHx8CisJICAgIChwZHVfbGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSAtIDEgLSA0KSkgeworCQljRVJST1IoMSwgIkludmFsaWQgc2l6ZSBTTUIgbGVuZ3RoICVkIHBkdV9sZW5ndGggJWQiLAorCQkgICAgICAgNCwgcGR1X2xlbmd0aCs0KTsKKwkJY2lmc19yZWNvbm5lY3Qoc2VydmVyKTsKKwkJd2FrZV91cCgmc2VydmVyLT5yZXNwb25zZV9xKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KIAotCQlzcGluX2xvY2soJkdsb2JhbE1pZF9Mb2NrKTsKLQkJbGlzdF9mb3JfZWFjaF9zYWZlKHRtcCwgdG1wMiwgJnNlcnZlci0+cGVuZGluZ19taWRfcSkgewotCQkJbWlkX2VudHJ5ID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBtaWRfcV9lbnRyeSwgcWhlYWQpOworCXJldHVybiB0cnVlOworfQogCi0JCQlpZiAobWlkX2VudHJ5LT5taWQgIT0gc21iX2J1ZmZlci0+TWlkIHx8Ci0JCQkgICAgbWlkX2VudHJ5LT5taWRTdGF0ZSAhPSBNSURfUkVRVUVTVF9TVUJNSVRURUQgfHwKLQkJCSAgICBtaWRfZW50cnktPmNvbW1hbmQgIT0gc21iX2J1ZmZlci0+Q29tbWFuZCkgewotCQkJCW1pZF9lbnRyeSA9IE5VTEw7Ci0JCQkJY29udGludWU7Ci0JCQl9CitzdGF0aWMgc3RydWN0IG1pZF9xX2VudHJ5ICoKK2ZpbmRfY2lmc19taWQoc3RydWN0IFRDUF9TZXJ2ZXJfSW5mbyAqc2VydmVyLCBzdHJ1Y3Qgc21iX2hkciAqYnVmLAorCSAgICAgIGludCAqbGVuZ3RoLCBib29sIGlzX2xhcmdlX2J1ZiwgYm9vbCAqaXNfbXVsdGlfcnNwLCBjaGFyICoqYmlnYnVmKQoreworCXN0cnVjdCBtaWRfcV9lbnRyeSAqbWlkID0gTlVMTCwgKnRtcF9taWQsICpyZXQgPSBOVUxMOwogCi0JCQlpZiAobGVuZ3RoID09IDAgJiYKLQkJCSAgICBjaGVjazJuZFQyKHNtYl9idWZmZXIsIHNlcnZlci0+bWF4QnVmKSA+IDApIHsKLQkJCQkvKiBXZSBoYXZlIGEgbXVsdGlwYXJ0IHRyYW5zYWN0MiByZXNwICovCi0JCQkJaXNNdWx0aVJzcCA9IHRydWU7Ci0JCQkJaWYgKG1pZF9lbnRyeS0+cmVzcF9idWYpIHsKLQkJCQkJLyogbWVyZ2UgcmVzcG9uc2UgLSBmaXggdXAgMXN0Ki8KLQkJCQkJbGVuZ3RoID0gY29hbGVzY2VfdDIoc21iX2J1ZmZlciwKLQkJCQkJCQltaWRfZW50cnktPnJlc3BfYnVmKTsKLQkJCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQkJCWxlbmd0aCA9IDA7Ci0JCQkJCQltaWRfZW50cnktPm11bHRpUnNwID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLyogYWxsIHBhcnRzIHJlY2VpdmVkIG9yCi0JCQkJCQkgKiBwYWNrZXQgaXMgbWFsZm9ybWVkCi0JCQkJCQkgKi8KLQkJCQkJCW1pZF9lbnRyeS0+bXVsdGlFbmQgPSB0cnVlOwotCQkJCQkJZ290byBtdWx0aV90Ml9mbmQ7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoIWlzTGFyZ2VCdWYpIHsKLQkJCQkJCS8qCi0JCQkJCQkgKiBGSVhNRTogc3dpdGNoIHRvIGFscmVhZHkKLQkJCQkJCSAqICAgICAgICBhbGxvY2F0ZWQgbGFyZ2VidWY/Ci0JCQkJCQkgKi8KLQkJCQkJCWNFUlJPUigxLCAiMXN0IHRyYW5zMiByZXNwICIKLQkJCQkJCQkgICJuZWVkcyBiaWdidWYiKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8qIEhhdmUgZmlyc3QgYnVmZmVyICovCi0JCQkJCQltaWRfZW50cnktPnJlc3BfYnVmID0KLQkJCQkJCQkgc21iX2J1ZmZlcjsKLQkJCQkJCW1pZF9lbnRyeS0+bGFyZ2VCdWYgPSB0cnVlOwotCQkJCQkJYmlnYnVmID0gTlVMTDsKLQkJCQkJfQorCXNwaW5fbG9jaygmR2xvYmFsTWlkX0xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtaWQsIHRtcF9taWQsICZzZXJ2ZXItPnBlbmRpbmdfbWlkX3EsIHFoZWFkKSB7CisJCWlmIChtaWQtPm1pZCAhPSBidWYtPk1pZCB8fAorCQkgICAgbWlkLT5taWRTdGF0ZSAhPSBNSURfUkVRVUVTVF9TVUJNSVRURUQgfHwKKwkJICAgIG1pZC0+Y29tbWFuZCAhPSBidWYtPkNvbW1hbmQpCisJCQljb250aW51ZTsKKworCQlpZiAoKmxlbmd0aCA9PSAwICYmIGNoZWNrMm5kVDIoYnVmLCBzZXJ2ZXItPm1heEJ1ZikgPiAwKSB7CisJCQkvKiBXZSBoYXZlIGEgbXVsdGlwYXJ0IHRyYW5zYWN0MiByZXNwICovCisJCQkqaXNfbXVsdGlfcnNwID0gdHJ1ZTsKKwkJCWlmIChtaWQtPnJlc3BfYnVmKSB7CisJCQkJLyogbWVyZ2UgcmVzcG9uc2UgLSBmaXggdXAgMXN0Ki8KKwkJCQkqbGVuZ3RoID0gY29hbGVzY2VfdDIoYnVmLCBtaWQtPnJlc3BfYnVmKTsKKwkJCQlpZiAoKmxlbmd0aCA+IDApIHsKKwkJCQkJKmxlbmd0aCA9IDA7CisJCQkJCW1pZC0+bXVsdGlSc3AgPSB0cnVlOworCQkJCQlicmVhazsKIAkJCQl9Ci0JCQkJYnJlYWs7CisJCQkJLyogQWxsIHBhcnRzIHJlY2VpdmVkIG9yIHBhY2tldCBpcyBtYWxmb3JtZWQuICovCisJCQkJbWlkLT5tdWx0aUVuZCA9IHRydWU7CisJCQkJZ290byBtdWx0aV90Ml9mbmQ7CiAJCQl9Ci0JCQltaWRfZW50cnktPnJlc3BfYnVmID0gc21iX2J1ZmZlcjsKLQkJCW1pZF9lbnRyeS0+bGFyZ2VCdWYgPSBpc0xhcmdlQnVmOwotbXVsdGlfdDJfZm5kOgotCQkJaWYgKGxlbmd0aCA9PSAwKQotCQkJCW1pZF9lbnRyeS0+bWlkU3RhdGUgPSBNSURfUkVTUE9OU0VfUkVDRUlWRUQ7Ci0JCQllbHNlCi0JCQkJbWlkX2VudHJ5LT5taWRTdGF0ZSA9IE1JRF9SRVNQT05TRV9NQUxGT1JNRUQ7Ci0jaWZkZWYgQ09ORklHX0NJRlNfU1RBVFMyCi0JCQltaWRfZW50cnktPndoZW5fcmVjZWl2ZWQgPSBqaWZmaWVzOwotI2VuZGlmCi0JCQlsaXN0X2RlbF9pbml0KCZtaWRfZW50cnktPnFoZWFkKTsKKwkJCWlmICghaXNfbGFyZ2VfYnVmKSB7CisJCQkJLypGSVhNRTogc3dpdGNoIHRvIGFscmVhZHkgYWxsb2NhdGVkIGxhcmdlYnVmPyovCisJCQkJY0VSUk9SKDEsICIxc3QgdHJhbnMyIHJlc3AgbmVlZHMgYmlnYnVmIik7CisJCQl9IGVsc2UgeworCQkJCS8qIEhhdmUgZmlyc3QgYnVmZmVyICovCisJCQkJbWlkLT5yZXNwX2J1ZiA9IGJ1ZjsKKwkJCQltaWQtPmxhcmdlQnVmID0gdHJ1ZTsKKwkJCQkqYmlnYnVmID0gTlVMTDsKKwkJCX0KIAkJCWJyZWFrOwogCQl9Ci0JCXNwaW5fdW5sb2NrKCZHbG9iYWxNaWRfTG9jayk7CisJCW1pZC0+cmVzcF9idWYgPSBidWY7CisJCW1pZC0+bGFyZ2VCdWYgPSBpc19sYXJnZV9idWY7CittdWx0aV90Ml9mbmQ6CisJCWlmICgqbGVuZ3RoID09IDApCisJCQltaWQtPm1pZFN0YXRlID0gTUlEX1JFU1BPTlNFX1JFQ0VJVkVEOworCQllbHNlCisJCQltaWQtPm1pZFN0YXRlID0gTUlEX1JFU1BPTlNFX01BTEZPUk1FRDsKKyNpZmRlZiBDT05GSUdfQ0lGU19TVEFUUzIKKwkJbWlkLT53aGVuX3JlY2VpdmVkID0gamlmZmllczsKKyNlbmRpZgorCQlsaXN0X2RlbF9pbml0KCZtaWQtPnFoZWFkKTsKKwkJcmV0ID0gbWlkOworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soJkdsb2JhbE1pZF9Mb2NrKTsKIAotCQlpZiAobWlkX2VudHJ5ICE9IE5VTEwpIHsKLQkJCW1pZF9lbnRyeS0+Y2FsbGJhY2sobWlkX2VudHJ5KTsKLQkJCS8qIFdhcyBwcmV2aW91cyBidWYgcHV0IGluIG1weCBzdHJ1Y3QgZm9yIG11bHRpLXJzcD8gKi8KLQkJCWlmICghaXNNdWx0aVJzcCkgewotCQkJCS8qIHNtYiBidWZmZXIgd2lsbCBiZSBmcmVlZCBieSB1c2VyIHRocmVhZCAqLwotCQkJCWlmIChpc0xhcmdlQnVmKQotCQkJCQliaWdidWYgPSBOVUxMOwotCQkJCWVsc2UKLQkJCQkJc21hbGxidWYgPSBOVUxMOwotCQkJfQotCQl9IGVsc2UgaWYgKGxlbmd0aCAhPSAwKSB7Ci0JCQkvKiByZXNwb25zZSBzYW5pdHkgY2hlY2tzIGZhaWxlZCAqLwotCQkJY29udGludWU7Ci0JCX0gZWxzZSBpZiAoIWlzX3ZhbGlkX29wbG9ja19icmVhayhzbWJfYnVmZmVyLCBzZXJ2ZXIpICYmCi0JCQkgICAhaXNNdWx0aVJzcCkgewotCQkJY0VSUk9SKDEsICJObyB0YXNrIHRvIHdha2UsIHVua25vd24gZnJhbWUgcmVjZWl2ZWQhICIKLQkJCQkgICAiTnVtTWlkcyAlZCIsIGF0b21pY19yZWFkKCZtaWRDb3VudCkpOwotCQkJY2lmc19kdW1wX21lbSgiUmVjZWl2ZWQgRGF0YSBpczogIiwgKGNoYXIgKilzbWJfYnVmZmVyLAotCQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc21iX2hkcikpOwotI2lmZGVmIENPTkZJR19DSUZTX0RFQlVHMgotCQkJY2lmc19kdW1wX2RldGFpbChzbWJfYnVmZmVyKTsKLQkJCWNpZnNfZHVtcF9taWRzKHNlcnZlcik7Ci0jZW5kaWYgLyogQ0lGU19ERUJVRzIgKi8KKwlyZXR1cm4gcmV0OworfQogCi0JCX0KLQl9IC8qIGVuZCB3aGlsZSAhRVhJVElORyAqLworc3RhdGljIHZvaWQgY2xlYW5fZGVtdWx0aXBsZXhfaW5mbyhzdHJ1Y3QgVENQX1NlcnZlcl9JbmZvICpzZXJ2ZXIpCit7CisJaW50IGxlbmd0aDsKIAogCS8qIHRha2UgaXQgb2ZmIHRoZSBsaXN0LCBpZiBpdCdzIG5vdCBhbHJlYWR5ICovCiAJc3Bpbl9sb2NrKCZjaWZzX3RjcF9zZXNfbG9jayk7CkBAIC02NjgsMzUgKzU0NSwzOSBAQAogCXNwaW5fdW5sb2NrKCZHbG9iYWxNaWRfTG9jayk7CiAJd2FrZV91cF9hbGwoJnNlcnZlci0+cmVzcG9uc2VfcSk7CiAKLQkvKiBjaGVjayBpZiB3ZSBoYXZlIGJsb2NrZWQgcmVxdWVzdHMgdGhhdCBuZWVkIHRvIGZyZWUgKi8KLQkvKiBOb3RlIHRoYXQgY2lmc19tYXhfcGVuZGluZyBpcyBub3JtYWxseSA1MCwgYnV0Ci0JY2FuIGJlIHNldCBhdCBtb2R1bGUgaW5zdGFsbCB0aW1lIHRvIGFzIGxpdHRsZSBhcyB0d28gKi8KKwkvKgorCSAqIENoZWNrIGlmIHdlIGhhdmUgYmxvY2tlZCByZXF1ZXN0cyB0aGF0IG5lZWQgdG8gZnJlZS4gTm90ZSB0aGF0CisJICogY2lmc19tYXhfcGVuZGluZyBpcyBub3JtYWxseSA1MCwgYnV0IGNhbiBiZSBzZXQgYXQgbW9kdWxlIGluc3RhbGwKKwkgKiB0aW1lIHRvIGFzIGxpdHRsZSBhcyB0d28uCisJICovCiAJc3Bpbl9sb2NrKCZHbG9iYWxNaWRfTG9jayk7CiAJaWYgKGF0b21pY19yZWFkKCZzZXJ2ZXItPmluRmxpZ2h0KSA+PSBjaWZzX21heF9wZW5kaW5nKQogCQlhdG9taWNfc2V0KCZzZXJ2ZXItPmluRmxpZ2h0LCBjaWZzX21heF9wZW5kaW5nIC0gMSk7Ci0JLyogV2UgZG8gbm90IHdhbnQgdG8gc2V0IHRoZSBtYXhfcGVuZGluZyB0b28gbG93IG9yIHdlCi0JY291bGQgZW5kIHVwIHdpdGggdGhlIGNvdW50ZXIgZ29pbmcgbmVnYXRpdmUgKi8KKwkvKgorCSAqIFdlIGRvIG5vdCB3YW50IHRvIHNldCB0aGUgbWF4X3BlbmRpbmcgdG9vIGxvdyBvciB3ZSBjb3VsZCBlbmQgdXAKKwkgKiB3aXRoIHRoZSBjb3VudGVyIGdvaW5nIG5lZ2F0aXZlLgorCSAqLwogCXNwaW5fdW5sb2NrKCZHbG9iYWxNaWRfTG9jayk7Ci0JLyogQWx0aG91Z2ggdGhlcmUgc2hvdWxkIG5vdCBiZSBhbnkgcmVxdWVzdHMgYmxvY2tlZCBvbgotCXRoaXMgcXVldWUgaXQgY2FuIG5vdCBodXJ0IHRvIGJlIHBhcmFub2lkIGFuZCB0cnkgdG8gd2FrZSB1cCByZXF1ZXN0cwotCXRoYXQgbWF5IGhhdmVuIGJlZW4gYmxvY2tlZCB3aGVuIG1vcmUgdGhhbiA1MCBhdCB0aW1lIHdlcmUgb24gdGhlIHdpcmUKLQl0byB0aGUgc2FtZSBzZXJ2ZXIgLSB0aGV5IG5vdyB3aWxsIHNlZSB0aGUgc2Vzc2lvbiBpcyBpbiBleGl0IHN0YXRlCi0JYW5kIGdldCBvdXQgb2YgU2VuZFJlY2VpdmUuICAqLworCS8qCisJICogQWx0aG91Z2ggdGhlcmUgc2hvdWxkIG5vdCBiZSBhbnkgcmVxdWVzdHMgYmxvY2tlZCBvbiB0aGlzIHF1ZXVlIGl0CisJICogY2FuIG5vdCBodXJ0IHRvIGJlIHBhcmFub2lkIGFuZCB0cnkgdG8gd2FrZSB1cCByZXF1ZXN0cyB0aGF0IG1heQorCSAqIGhhdmVuIGJlZW4gYmxvY2tlZCB3aGVuIG1vcmUgdGhhbiA1MCBhdCB0aW1lIHdlcmUgb24gdGhlIHdpcmUgdG8gdGhlCisJICogc2FtZSBzZXJ2ZXIgLSB0aGV5IG5vdyB3aWxsIHNlZSB0aGUgc2Vzc2lvbiBpcyBpbiBleGl0IHN0YXRlIGFuZCBnZXQKKwkgKiBvdXQgb2YgU2VuZFJlY2VpdmUuCisJICovCiAJd2FrZV91cF9hbGwoJnNlcnZlci0+cmVxdWVzdF9xKTsKIAkvKiBnaXZlIHRob3NlIHJlcXVlc3RzIHRpbWUgdG8gZXhpdCAqLwogCW1zbGVlcCgxMjUpOwogCiAJaWYgKHNlcnZlci0+c3NvY2tldCkgewotCQlzb2NrX3JlbGVhc2UoY3NvY2tldCk7CisJCXNvY2tfcmVsZWFzZShzZXJ2ZXItPnNzb2NrZXQpOwogCQlzZXJ2ZXItPnNzb2NrZXQgPSBOVUxMOwogCX0KLQkvKiBidWZmZXIgdXN1YWxseSBmcmVlZCBpbiBmcmVlX21pZCAtIG5lZWQgdG8gZnJlZSBpdCBoZXJlIG9uIGV4aXQgKi8KLQljaWZzX2J1Zl9yZWxlYXNlKGJpZ2J1Zik7Ci0JaWYgKHNtYWxsYnVmKSAvKiBubyBzZW5zZSBsb2dnaW5nIGEgZGVidWcgbWVzc2FnZSBpZiBOVUxMICovCi0JCWNpZnNfc21hbGxfYnVmX3JlbGVhc2Uoc21hbGxidWYpOwogCiAJaWYgKCFsaXN0X2VtcHR5KCZzZXJ2ZXItPnBlbmRpbmdfbWlkX3EpKSB7CiAJCXN0cnVjdCBsaXN0X2hlYWQgZGlzcG9zZV9saXN0OworCQlzdHJ1Y3QgbWlkX3FfZW50cnkgKm1pZF9lbnRyeTsKKwkJc3RydWN0IGxpc3RfaGVhZCAqdG1wLCAqdG1wMjsKIAogCQlJTklUX0xJU1RfSEVBRCgmZGlzcG9zZV9saXN0KTsKIAkJc3Bpbl9sb2NrKCZHbG9iYWxNaWRfTG9jayk7CkBAIC03MjAsMjYgKzYwMSwxODQgQEAKIAl9CiAKIAlpZiAoIWxpc3RfZW1wdHkoJnNlcnZlci0+cGVuZGluZ19taWRfcSkpIHsKLQkJLyogbXB4IHRocmVhZHMgaGF2ZSBub3QgZXhpdGVkIHlldCBnaXZlIHRoZW0KLQkJYXQgbGVhc3QgdGhlIHNtYiBzZW5kIHRpbWVvdXQgdGltZSBmb3IgbG9uZyBvcHMgKi8KLQkJLyogZHVlIHRvIGRlbGF5cyBvbiBvcGxvY2sgYnJlYWsgcmVxdWVzdHMsIHdlIG5lZWQKLQkJdG8gd2FpdCBhdCBsZWFzdCA0NSBzZWNvbmRzIGJlZm9yZSBnaXZpbmcgdXAKLQkJb24gYSByZXF1ZXN0IGdldHRpbmcgYSByZXNwb25zZSBhbmQgZ29pbmcgYWhlYWQKLQkJYW5kIGtpbGxpbmcgY2lmc2QgKi8KKwkJLyoKKwkJICogbXB4IHRocmVhZHMgaGF2ZSBub3QgZXhpdGVkIHlldCBnaXZlIHRoZW0gYXQgbGVhc3QgdGhlIHNtYgorCQkgKiBzZW5kIHRpbWVvdXQgdGltZSBmb3IgbG9uZyBvcHMuCisJCSAqCisJCSAqIER1ZSB0byBkZWxheXMgb24gb3Bsb2NrIGJyZWFrIHJlcXVlc3RzLCB3ZSBuZWVkIHRvIHdhaXQgYXQKKwkJICogbGVhc3QgNDUgc2Vjb25kcyBiZWZvcmUgZ2l2aW5nIHVwIG9uIGEgcmVxdWVzdCBnZXR0aW5nIGEKKwkJICogcmVzcG9uc2UgYW5kIGdvaW5nIGFoZWFkIGFuZCBraWxsaW5nIGNpZnNkLgorCQkgKi8KIAkJY0ZZSSgxLCAiV2FpdCBmb3IgZXhpdCBmcm9tIGRlbXVsdGlwbGV4IHRocmVhZCIpOwogCQltc2xlZXAoNDYwMDApOwotCQkvKiBpZiB0aHJlYWRzIHN0aWxsIGhhdmUgbm90IGV4aXRlZCB0aGV5IGFyZSBwcm9iYWJseSBuZXZlcgotCQljb21pbmcgaG9tZSBub3QgbXVjaCBlbHNlIHdlIGNhbiBkbyBidXQgZnJlZSB0aGUgbWVtb3J5ICovCisJCS8qCisJCSAqIElmIHRocmVhZHMgc3RpbGwgaGF2ZSBub3QgZXhpdGVkIHRoZXkgYXJlIHByb2JhYmx5IG5ldmVyCisJCSAqIGNvbWluZyBob21lIG5vdCBtdWNoIGVsc2Ugd2UgY2FuIGRvIGJ1dCBmcmVlIHRoZSBtZW1vcnkuCisJCSAqLwogCX0KIAogCWtmcmVlKHNlcnZlci0+aG9zdG5hbWUpOwotCXRhc2tfdG9fd2FrZSA9IHhjaGcoJnNlcnZlci0+dHNrLCBOVUxMKTsKIAlrZnJlZShzZXJ2ZXIpOwogCiAJbGVuZ3RoID0gYXRvbWljX2RlY19yZXR1cm4oJnRjcFNlc0FsbG9jQ291bnQpOwotCWlmIChsZW5ndGggID4gMCkKKwlpZiAobGVuZ3RoID4gMCkKIAkJbWVtcG9vbF9yZXNpemUoY2lmc19yZXFfcG9vbHAsIGxlbmd0aCArIGNpZnNfbWluX3JjdiwKIAkJCQlHRlBfS0VSTkVMKTsKK30KKworc3RhdGljIGludAorY2lmc19kZW11bHRpcGxleF90aHJlYWQodm9pZCAqcCkKK3sKKwlpbnQgbGVuZ3RoOworCXN0cnVjdCBUQ1BfU2VydmVyX0luZm8gKnNlcnZlciA9IHA7CisJdW5zaWduZWQgaW50IHBkdV9sZW5ndGgsIHRvdGFsX3JlYWQ7CisJY2hhciAqYnVmID0gTlVMTCwgKmJpZ2J1ZiA9IE5VTEwsICpzbWFsbGJ1ZiA9IE5VTEw7CisJc3RydWN0IHNtYl9oZHIgKnNtYl9idWZmZXIgPSBOVUxMOworCXN0cnVjdCBtc2doZHIgc21iX21zZzsKKwlzdHJ1Y3Qga3ZlYyBpb3Y7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrX3RvX3dha2UgPSBOVUxMOworCXN0cnVjdCBtaWRfcV9lbnRyeSAqbWlkX2VudHJ5OworCWJvb2wgaXNMYXJnZUJ1ZiA9IGZhbHNlOworCWJvb2wgaXNNdWx0aVJzcCA9IGZhbHNlOworCWludCByYzsKKworCWN1cnJlbnQtPmZsYWdzIHw9IFBGX01FTUFMTE9DOworCWNGWUkoMSwgIkRlbXVsdGlwbGV4IFBJRDogJWQiLCB0YXNrX3BpZF9ucihjdXJyZW50KSk7CisKKwlsZW5ndGggPSBhdG9taWNfaW5jX3JldHVybigmdGNwU2VzQWxsb2NDb3VudCk7CisJaWYgKGxlbmd0aCA+IDEpCisJCW1lbXBvb2xfcmVzaXplKGNpZnNfcmVxX3Bvb2xwLCBsZW5ndGggKyBjaWZzX21pbl9yY3YsCisJCQkJR0ZQX0tFUk5FTCk7CisKKwlzZXRfZnJlZXphYmxlKCk7CisJd2hpbGUgKHNlcnZlci0+dGNwU3RhdHVzICE9IENpZnNFeGl0aW5nKSB7CisJCWlmICh0cnlfdG9fZnJlZXplKCkpCisJCQljb250aW51ZTsKKworCQlpZiAoIWFsbG9jYXRlX2J1ZmZlcnMoJmJpZ2J1ZiwgJnNtYWxsYnVmLAorCQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgc21iX2hkciksIGlzTGFyZ2VCdWYpKQorCQkJY29udGludWU7CisKKwkJaXNMYXJnZUJ1ZiA9IGZhbHNlOworCQlpc011bHRpUnNwID0gZmFsc2U7CisJCXNtYl9idWZmZXIgPSAoc3RydWN0IHNtYl9oZHIgKilzbWFsbGJ1ZjsKKwkJYnVmID0gc21hbGxidWY7CisJCWlvdi5pb3ZfYmFzZSA9IGJ1ZjsKKwkJaW92Lmlvdl9sZW4gPSA0OworCQlzbWJfbXNnLm1zZ19jb250cm9sID0gTlVMTDsKKwkJc21iX21zZy5tc2dfY29udHJvbGxlbiA9IDA7CisJCXBkdV9sZW5ndGggPSA0OyAvKiBlbm91Z2ggdG8gZ2V0IFJGQzEwMDEgaGVhZGVyICovCisKK2luY29tcGxldGVfcmN2OgorCQlpZiAoZWNob19yZXRyaWVzID4gMCAmJiBzZXJ2ZXItPnRjcFN0YXR1cyA9PSBDaWZzR29vZCAmJgorCQkgICAgdGltZV9hZnRlcihqaWZmaWVzLCBzZXJ2ZXItPmxzdHJwICsKKwkJCQkJKGVjaG9fcmV0cmllcyAqIFNNQl9FQ0hPX0lOVEVSVkFMKSkpIHsKKwkJCWNFUlJPUigxLCAiU2VydmVyICVzIGhhcyBub3QgcmVzcG9uZGVkIGluICVkIHNlY29uZHMuICIKKwkJCQkgICJSZWNvbm5lY3RpbmcuLi4iLCBzZXJ2ZXItPmhvc3RuYW1lLAorCQkJCSAgKGVjaG9fcmV0cmllcyAqIFNNQl9FQ0hPX0lOVEVSVkFMIC8gSFopKTsKKwkJCWNpZnNfcmVjb25uZWN0KHNlcnZlcik7CisJCQl3YWtlX3VwKCZzZXJ2ZXItPnJlc3BvbnNlX3EpOworCQkJY29udGludWU7CisJCX0KKworCQlyYyA9IHJlYWRfZnJvbV9zb2NrZXQoc2VydmVyLCAmc21iX21zZywgJmlvdiwgcGR1X2xlbmd0aCwKKwkJCQkgICAgICAmdG90YWxfcmVhZCwgdHJ1ZSAvKiBoZWFkZXIgcmVhZCAqLyk7CisJCWlmIChyYyA9PSAzKQorCQkJZ290byBpbmNvbXBsZXRlX3JjdjsKKwkJZWxzZSBpZiAocmMgPT0gMikKKwkJCWJyZWFrOworCQllbHNlIGlmIChyYyA9PSAxKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogVGhlIHJpZ2h0IGFtb3VudCB3YXMgcmVhZCBmcm9tIHNvY2tldCAtIDQgYnl0ZXMsCisJCSAqIHNvIHdlIGNhbiBub3cgaW50ZXJwcmV0IHRoZSBsZW5ndGggZmllbGQuCisJCSAqLworCisJCS8qCisJCSAqIE5vdGUgdGhhdCBSRkMgMTAwMSBsZW5ndGggaXMgYmlnIGVuZGlhbiBvbiB0aGUgd2lyZSwKKwkJICogYnV0IHdlIGNvbnZlcnQgaXQgaGVyZSBzbyBpdCBpcyBhbHdheXMgbWFuaXB1bGF0ZWQKKwkJICogYXMgaG9zdCBieXRlIG9yZGVyLgorCQkgKi8KKwkJcGR1X2xlbmd0aCA9IGJlMzJfdG9fY3B1KHNtYl9idWZmZXItPnNtYl9idWZfbGVuZ3RoKTsKKworCQljRllJKDEsICJyZmMxMDAyIGxlbmd0aCAweCV4IiwgcGR1X2xlbmd0aCs0KTsKKwkJaWYgKCFjaGVja19yZmMxMDAyX2hlYWRlcihzZXJ2ZXIsIGJ1ZikpCisJCQljb250aW51ZTsKKworCQkvKiBlbHNlIGxlbmd0aCBvayAqLworCQlpZiAocGR1X2xlbmd0aCA+IE1BWF9DSUZTX1NNQUxMX0JVRkZFUl9TSVpFIC0gNCkgeworCQkJaXNMYXJnZUJ1ZiA9IHRydWU7CisJCQltZW1jcHkoYmlnYnVmLCBzbWFsbGJ1ZiwgNCk7CisJCQlzbWJfYnVmZmVyID0gKHN0cnVjdCBzbWJfaGRyICopYmlnYnVmOworCQkJYnVmID0gYmlnYnVmOworCQl9CisKKwkJaW92Lmlvdl9iYXNlID0gNCArIGJ1ZjsKKwkJaW92Lmlvdl9sZW4gPSBwZHVfbGVuZ3RoOworCQlyYyA9IHJlYWRfZnJvbV9zb2NrZXQoc2VydmVyLCAmc21iX21zZywgJmlvdiwgcGR1X2xlbmd0aCwKKwkJCQkgICAgICAmdG90YWxfcmVhZCwgZmFsc2UpOworCQlpZiAocmMgPT0gMikKKwkJCWJyZWFrOworCQllbHNlIGlmIChyYyA9PSAxKQorCQkJY29udGludWU7CisKKwkJdG90YWxfcmVhZCArPSA0OyAvKiBhY2NvdW50IGZvciByZmMxMDAyIGhkciAqLworCisJCWR1bXBfc21iKHNtYl9idWZmZXIsIHRvdGFsX3JlYWQpOworCisJCS8qCisJCSAqIFdlIGtub3cgdGhhdCB3ZSByZWNlaXZlZCBlbm91Z2ggdG8gZ2V0IHRvIHRoZSBNSUQgYXMgd2UKKwkJICogY2hlY2tlZCB0aGUgcGR1X2xlbmd0aCBlYXJsaWVyLiBOb3cgY2hlY2sgdG8gc2VlCisJCSAqIGlmIHRoZSByZXN0IG9mIHRoZSBoZWFkZXIgaXMgT0suIFdlIGJvcnJvdyB0aGUgbGVuZ3RoCisJCSAqIHZhciBmb3IgdGhlIHJlc3Qgb2YgdGhlIGxvb3AgdG8gYXZvaWQgYSBuZXcgc3RhY2sgdmFyLgorCQkgKgorCQkgKiA0OCBieXRlcyBpcyBlbm91Z2ggdG8gZGlzcGxheSB0aGUgaGVhZGVyIGFuZCBhIGxpdHRsZSBiaXQKKwkJICogaW50byB0aGUgcGF5bG9hZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorCQkgKi8KKwkJbGVuZ3RoID0gY2hlY2tTTUIoc21iX2J1ZmZlciwgc21iX2J1ZmZlci0+TWlkLCB0b3RhbF9yZWFkKTsKKwkJaWYgKGxlbmd0aCAhPSAwKQorCQkJY2lmc19kdW1wX21lbSgiQmFkIFNNQjogIiwgYnVmLAorCQkJCSAgICAgIG1pbl90KHVuc2lnbmVkIGludCwgdG90YWxfcmVhZCwgNDgpKTsKKworCQlzZXJ2ZXItPmxzdHJwID0gamlmZmllczsKKworCQltaWRfZW50cnkgPSBmaW5kX2NpZnNfbWlkKHNlcnZlciwgc21iX2J1ZmZlciwgJmxlbmd0aCwKKwkJCQkJICBpc0xhcmdlQnVmLCAmaXNNdWx0aVJzcCwgJmJpZ2J1Zik7CisJCWlmIChtaWRfZW50cnkgIT0gTlVMTCkgeworCQkJbWlkX2VudHJ5LT5jYWxsYmFjayhtaWRfZW50cnkpOworCQkJLyogV2FzIHByZXZpb3VzIGJ1ZiBwdXQgaW4gbXB4IHN0cnVjdCBmb3IgbXVsdGktcnNwPyAqLworCQkJaWYgKCFpc011bHRpUnNwKSB7CisJCQkJLyogc21iIGJ1ZmZlciB3aWxsIGJlIGZyZWVkIGJ5IHVzZXIgdGhyZWFkICovCisJCQkJaWYgKGlzTGFyZ2VCdWYpCisJCQkJCWJpZ2J1ZiA9IE5VTEw7CisJCQkJZWxzZQorCQkJCQlzbWFsbGJ1ZiA9IE5VTEw7CisJCQl9CisJCX0gZWxzZSBpZiAobGVuZ3RoICE9IDApIHsKKwkJCS8qIHJlc3BvbnNlIHNhbml0eSBjaGVja3MgZmFpbGVkICovCisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmICghaXNfdmFsaWRfb3Bsb2NrX2JyZWFrKHNtYl9idWZmZXIsIHNlcnZlcikgJiYKKwkJCSAgICFpc011bHRpUnNwKSB7CisJCQljRVJST1IoMSwgIk5vIHRhc2sgdG8gd2FrZSwgdW5rbm93biBmcmFtZSByZWNlaXZlZCEgIgorCQkJCSAgICJOdW1NaWRzICVkIiwgYXRvbWljX3JlYWQoJm1pZENvdW50KSk7CisJCQljaWZzX2R1bXBfbWVtKCJSZWNlaXZlZCBEYXRhIGlzOiAiLCBidWYsCisJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBzbWJfaGRyKSk7CisjaWZkZWYgQ09ORklHX0NJRlNfREVCVUcyCisJCQljaWZzX2R1bXBfZGV0YWlsKHNtYl9idWZmZXIpOworCQkJY2lmc19kdW1wX21pZHMoc2VydmVyKTsKKyNlbmRpZiAvKiBDSUZTX0RFQlVHMiAqLworCisJCX0KKwl9IC8qIGVuZCB3aGlsZSAhRVhJVElORyAqLworCisJLyogYnVmZmVyIHVzdWFsbHkgZnJlZWQgaW4gZnJlZV9taWQgLSBuZWVkIHRvIGZyZWUgaXQgaGVyZSBvbiBleGl0ICovCisJY2lmc19idWZfcmVsZWFzZShiaWdidWYpOworCWlmIChzbWFsbGJ1ZikgLyogbm8gc2Vuc2UgbG9nZ2luZyBhIGRlYnVnIG1lc3NhZ2UgaWYgTlVMTCAqLworCQljaWZzX3NtYWxsX2J1Zl9yZWxlYXNlKHNtYWxsYnVmKTsKKworCXRhc2tfdG9fd2FrZSA9IHhjaGcoJnNlcnZlci0+dHNrLCBOVUxMKTsKKwljbGVhbl9kZW11bHRpcGxleF9pbmZvKHNlcnZlcik7CiAKIAkvKiBpZiBzZXJ2ZXItPnRzayB3YXMgTlVMTCB0aGVuIHdhaXQgZm9yIGEgc2lnbmFsIGJlZm9yZSBleGl0aW5nICovCiAJaWYgKCF0YXNrX3RvX3dha2UpIHsKQEAgLTMxOTMsMTUgKzMyMzIsOSBAQAogCQllbHNlCiAJCQljaWZzX3B1dF90Y3Bfc2Vzc2lvbihzcnZUY3ApOwogCQliZGlfZGVzdHJveSgmY2lmc19zYi0+YmRpKTsKLQkJZ290byBvdXQ7CiAJfQogCi0JLyogdm9sdW1lX2luZm8tPnBhc3N3b3JkIGlzIGZyZWVkIGFib3ZlIHdoZW4gZXhpc3Rpbmcgc2Vzc2lvbiBmb3VuZAotCShpbiB3aGljaCBjYXNlIGl0IGlzIG5vdCBuZWVkZWQgYW55bW9yZSkgYnV0IHdoZW4gbmV3IHNlc2lvbiBpcyBjcmVhdGVkCi0JdGhlIHBhc3N3b3JkIHB0ciBpcyBwdXQgaW4gdGhlIG5ldyBzZXNzaW9uIHN0cnVjdHVyZSAoaW4gd2hpY2ggY2FzZSB0aGUKLQlwYXNzd29yZCB3aWxsIGJlIGZyZWVkIGF0IHVubW91bnQgdGltZSkgKi8KIG91dDoKLQkvKiB6ZXJvIG91dCBwYXNzd29yZCBiZWZvcmUgZnJlZWluZyAqLwogCUZyZWVYaWQoeGlkKTsKIAlyZXR1cm4gcmM7CiB9CmRpZmYgLS1naXQgYS9mcy9jaWZzL2ZpbGUuYyBiL2ZzL2NpZnMvZmlsZS5jCmluZGV4IDM3OGFjZGFmLi45ZjQxYTEwIDEwMDY0NAotLS0gYS9mcy9jaWZzL2ZpbGUuYworKysgYi9mcy9jaWZzL2ZpbGUuYwpAQCAtMzE0LDYgKzMxNCw4IEBACiAJfQogCXNwaW5fdW5sb2NrKCZjaWZzX2ZpbGVfbGlzdF9sb2NrKTsKIAorCWNhbmNlbF93b3JrX3N5bmMoJmNpZnNfZmlsZS0+b3Bsb2NrX2JyZWFrKTsKKwogCWlmICghdGNvbi0+bmVlZF9yZWNvbm5lY3QgJiYgIWNpZnNfZmlsZS0+aW52YWxpZEhhbmRsZSkgewogCQlpbnQgeGlkLCByYzsKIApAQCAtMjQxOCwzMSArMjQyMCw2IEBACiAJCQkJIGNpbm9kZS0+Y2xpZW50Q2FuQ2FjaGVSZWFkID8gMSA6IDApOwogCQljRllJKDEsICJPcGxvY2sgcmVsZWFzZSByYyA9ICVkIiwgcmMpOwogCX0KLQotCS8qCi0JICogV2UgbWlnaHQgaGF2ZSBraWNrZWQgaW4gYmVmb3JlIGlzX3ZhbGlkX29wbG9ja19icmVhaygpCi0JICogZmluaXNoZWQgZ3JhYmJpbmcgcmVmZXJlbmNlIGZvciB1cy4gIE1ha2Ugc3VyZSBpdCdzIGRvbmUgYnkKLQkgKiB3YWl0aW5nIGZvciBjaWZzX2ZpbGVfbGlzdF9sb2NrLgotCSAqLwotCXNwaW5fbG9jaygmY2lmc19maWxlX2xpc3RfbG9jayk7Ci0Jc3Bpbl91bmxvY2soJmNpZnNfZmlsZV9saXN0X2xvY2spOwotCi0JY2lmc19vcGxvY2tfYnJlYWtfcHV0KGNmaWxlKTsKLX0KLQotLyogbXVzdCBiZSBjYWxsZWQgd2hpbGUgaG9sZGluZyBjaWZzX2ZpbGVfbGlzdF9sb2NrICovCi12b2lkIGNpZnNfb3Bsb2NrX2JyZWFrX2dldChzdHJ1Y3QgY2lmc0ZpbGVJbmZvICpjZmlsZSkKLXsKLQljaWZzX3NiX2FjdGl2ZShjZmlsZS0+ZGVudHJ5LT5kX3NiKTsKLQljaWZzRmlsZUluZm9fZ2V0KGNmaWxlKTsKLX0KLQotdm9pZCBjaWZzX29wbG9ja19icmVha19wdXQoc3RydWN0IGNpZnNGaWxlSW5mbyAqY2ZpbGUpCi17Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGNmaWxlLT5kZW50cnktPmRfc2I7Ci0KLQljaWZzRmlsZUluZm9fcHV0KGNmaWxlKTsKLQljaWZzX3NiX2RlYWN0aXZlKHNiKTsKIH0KIAogY29uc3Qgc3RydWN0IGFkZHJlc3Nfc3BhY2Vfb3BlcmF0aW9ucyBjaWZzX2FkZHJfb3BzID0gewpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9taXNjLmMgYi9mcy9jaWZzL21pc2MuYwppbmRleCAwM2ExZjQ5Li43YzE2OTMzIDEwMDY0NAotLS0gYS9mcy9jaWZzL21pc2MuYworKysgYi9mcy9jaWZzL21pc2MuYwpAQCAtNTg1LDE1ICs1ODUsOCBAQAogCiAJCQkJY2lmc19zZXRfb3Bsb2NrX2xldmVsKHBDaWZzSW5vZGUsCiAJCQkJCXBTTUItPk9wbG9ja0xldmVsID8gT1BMT0NLX1JFQUQgOiAwKTsKLQkJCQkvKgotCQkJCSAqIGNpZnNfb3Bsb2NrX2JyZWFrX3B1dCgpIGNhbid0IGJlIGNhbGxlZAotCQkJCSAqIGZyb20gaGVyZS4gIEdldCByZWZlcmVuY2UgYWZ0ZXIgcXVldWVpbmcKLQkJCQkgKiBzdWNjZWVkZWQuICBjaWZzX29wbG9ja19icmVhaygpIHdpbGwKLQkJCQkgKiBzeW5jaHJvbml6ZSB1c2luZyBjaWZzX2ZpbGVfbGlzdF9sb2NrLgotCQkJCSAqLwotCQkJCWlmIChxdWV1ZV93b3JrKHN5c3RlbV9ucnRfd3EsCi0JCQkJCSAgICAgICAmbmV0ZmlsZS0+b3Bsb2NrX2JyZWFrKSkKLQkJCQkJY2lmc19vcGxvY2tfYnJlYWtfZ2V0KG5ldGZpbGUpOworCQkJCXF1ZXVlX3dvcmsoc3lzdGVtX25ydF93cSwKKwkJCQkJICAgJm5ldGZpbGUtPm9wbG9ja19icmVhayk7CiAJCQkJbmV0ZmlsZS0+b3Bsb2NrX2JyZWFrX2NhbmNlbGxlZCA9IGZhbHNlOwogCiAJCQkJc3Bpbl91bmxvY2soJmNpZnNfZmlsZV9saXN0X2xvY2spOwpkaWZmIC0tZ2l0IGEvZnMvY2lmcy9zZXNzLmMgYi9mcy9jaWZzL3Nlc3MuYwppbmRleCBkM2U2MTk2Li4yNDNkNTg3IDEwMDY0NAotLS0gYS9mcy9jaWZzL3Nlc3MuYworKysgYi9mcy9jaWZzL3Nlc3MuYwpAQCAtMTI0LDcgKzEyNCw4IEBACiAJLyoJdGhhdCB3ZSB1c2UgaW4gbmV4dCBmZXcgbGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAkvKiBOb3RlIHRoYXQgaGVhZGVyIGlzIGluaXRpYWxpemVkIHRvIHplcm8gaW4gaGVhZGVyX2Fzc2VtYmxlICovCiAJcFNNQi0+cmVxLkFuZFhDb21tYW5kID0gMHhGRjsKLQlwU01CLT5yZXEuTWF4QnVmZmVyU2l6ZSA9IGNwdV90b19sZTE2KHNlcy0+c2VydmVyLT5tYXhCdWYpOworCXBTTUItPnJlcS5NYXhCdWZmZXJTaXplID0gY3B1X3RvX2xlMTYobWluX3QodTMyLCBDSUZTTWF4QnVmU2l6ZSAtIDQsCisJCQkJCQlVU0hSVF9NQVgpKTsKIAlwU01CLT5yZXEuTWF4TXB4Q291bnQgPSBjcHVfdG9fbGUxNihzZXMtPnNlcnZlci0+bWF4UmVxKTsKIAlwU01CLT5yZXEuVmNOdW1iZXIgPSBnZXRfbmV4dF92Y251bShzZXMpOwogCmRpZmYgLS1naXQgYS9mcy9kY2FjaGUuYyBiL2ZzL2RjYWNoZS5jCmluZGV4IGIwNWFhYzMuLmM4M2NhZTEgMTAwNjQ0Ci0tLSBhL2ZzL2RjYWNoZS5jCisrKyBiL2ZzL2RjYWNoZS5jCkBAIC0zMDEsNiArMzAxLDI3IEBACiAJcmV0dXJuIHBhcmVudDsKIH0KIAorLyoKKyAqIFVuaGFzaCBhIGRlbnRyeSB3aXRob3V0IGluc2VydGluZyBhbiBSQ1Ugd2FsayBiYXJyaWVyIG9yIGNoZWNraW5nIHRoYXQKKyAqIGRlbnRyeS0+ZF9sb2NrIGlzIGxvY2tlZC4gIFRoZSBjYWxsZXIgbXVzdCB0YWtlIGNhcmUgb2YgdGhhdCwgaWYKKyAqIGFwcHJvcHJpYXRlLgorICovCitzdGF0aWMgdm9pZCBfX2Rfc2hyaW5rKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpZiAoIWRfdW5oYXNoZWQoZGVudHJ5KSkgeworCQlzdHJ1Y3QgaGxpc3RfYmxfaGVhZCAqYjsKKwkJaWYgKHVubGlrZWx5KGRlbnRyeS0+ZF9mbGFncyAmIERDQUNIRV9ESVNDT05ORUNURUQpKQorCQkJYiA9ICZkZW50cnktPmRfc2ItPnNfYW5vbjsKKwkJZWxzZQorCQkJYiA9IGRfaGFzaChkZW50cnktPmRfcGFyZW50LCBkZW50cnktPmRfbmFtZS5oYXNoKTsKKworCQlobGlzdF9ibF9sb2NrKGIpOworCQlfX2hsaXN0X2JsX2RlbCgmZGVudHJ5LT5kX2hhc2gpOworCQlkZW50cnktPmRfaGFzaC5wcHJldiA9IE5VTEw7CisJCWhsaXN0X2JsX3VubG9jayhiKTsKKwl9Cit9CisKIC8qKgogICogZF9kcm9wIC0gZHJvcCBhIGRlbnRyeQogICogQGRlbnRyeTogZGVudHJ5IHRvIGRyb3AKQEAgLTMxOSwxNyArMzQwLDcgQEAKIHZvaWQgX19kX2Ryb3Aoc3RydWN0IGRlbnRyeSAqZGVudHJ5KQogewogCWlmICghZF91bmhhc2hlZChkZW50cnkpKSB7Ci0JCXN0cnVjdCBobGlzdF9ibF9oZWFkICpiOwotCQlpZiAodW5saWtlbHkoZGVudHJ5LT5kX2ZsYWdzICYgRENBQ0hFX0RJU0NPTk5FQ1RFRCkpCi0JCQliID0gJmRlbnRyeS0+ZF9zYi0+c19hbm9uOwotCQllbHNlCi0JCQliID0gZF9oYXNoKGRlbnRyeS0+ZF9wYXJlbnQsIGRlbnRyeS0+ZF9uYW1lLmhhc2gpOwotCi0JCWhsaXN0X2JsX2xvY2soYik7Ci0JCV9faGxpc3RfYmxfZGVsKCZkZW50cnktPmRfaGFzaCk7Ci0JCWRlbnRyeS0+ZF9oYXNoLnBwcmV2ID0gTlVMTDsKLQkJaGxpc3RfYmxfdW5sb2NrKGIpOwotCisJCV9fZF9zaHJpbmsoZGVudHJ5KTsKIAkJZGVudHJ5X3JjdXdhbGtfYmFycmllcihkZW50cnkpOwogCX0KIH0KQEAgLTc4NCw2ICs3OTUsNyBAQAogCiAvKioKICAqIHBydW5lX2RjYWNoZV9zYiAtIHNocmluayB0aGUgZGNhY2hlCisgKiBAc2I6IHN1cGVyYmxvY2sKICAqIEBucl90b19zY2FuOiBudW1iZXIgb2YgZW50cmllcyB0byB0cnkgdG8gZnJlZQogICoKICAqIEF0dGVtcHQgdG8gc2hyaW5rIHRoZSBzdXBlcmJsb2NrIGRjYWNoZSBMUlUgYnkgQG5yX3RvX3NjYW4gZW50cmllcy4gVGhpcyBpcwpAQCAtODI4LDQ0ICs4NDAsMjQgQEAKIHN0YXRpYyB2b2lkIHNocmlua19kY2FjaGVfZm9yX3Vtb3VudF9zdWJ0cmVlKHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQ7Ci0JdW5zaWduZWQgZGV0YWNoZWQgPSAwOwogCiAJQlVHX09OKCFJU19ST09UKGRlbnRyeSkpOwogCi0JLyogZGV0YWNoIHRoaXMgcm9vdCBmcm9tIHRoZSBzeXN0ZW0gKi8KLQlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKLQlkZW50cnlfbHJ1X2RlbChkZW50cnkpOwotCV9fZF9kcm9wKGRlbnRyeSk7Ci0Jc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKLQogCWZvciAoOzspIHsKIAkJLyogZGVzY2VuZCB0byB0aGUgZmlyc3QgbGVhZiBpbiB0aGUgY3VycmVudCBzdWJ0cmVlICovCi0JCXdoaWxlICghbGlzdF9lbXB0eSgmZGVudHJ5LT5kX3N1YmRpcnMpKSB7Ci0JCQlzdHJ1Y3QgZGVudHJ5ICpsb29wOwotCi0JCQkvKiB0aGlzIGlzIGEgYnJhbmNoIHdpdGggY2hpbGRyZW4gLSBkZXRhY2ggYWxsIG9mIHRoZW0KLQkJCSAqIGZyb20gdGhlIHN5c3RlbSBpbiBvbmUgZ28gKi8KLQkJCXNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOwotCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShsb29wLCAmZGVudHJ5LT5kX3N1YmRpcnMsCi0JCQkJCSAgICBkX3UuZF9jaGlsZCkgewotCQkJCXNwaW5fbG9ja19uZXN0ZWQoJmxvb3AtPmRfbG9jaywKLQkJCQkJCURFTlRSWV9EX0xPQ0tfTkVTVEVEKTsKLQkJCQlkZW50cnlfbHJ1X2RlbChsb29wKTsKLQkJCQlfX2RfZHJvcChsb29wKTsKLQkJCQlzcGluX3VubG9jaygmbG9vcC0+ZF9sb2NrKTsKLQkJCX0KLQkJCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7Ci0KLQkJCS8qIG1vdmUgdG8gdGhlIGZpcnN0IGNoaWxkICovCisJCXdoaWxlICghbGlzdF9lbXB0eSgmZGVudHJ5LT5kX3N1YmRpcnMpKQogCQkJZGVudHJ5ID0gbGlzdF9lbnRyeShkZW50cnktPmRfc3ViZGlycy5uZXh0LAogCQkJCQkgICAgc3RydWN0IGRlbnRyeSwgZF91LmRfY2hpbGQpOwotCQl9CiAKIAkJLyogY29uc3VtZSB0aGUgZGVudHJpZXMgZnJvbSB0aGlzIGxlYWYgdXAgdGhyb3VnaCBpdHMgcGFyZW50cwogCQkgKiB1bnRpbCB3ZSBmaW5kIG9uZSB3aXRoIGNoaWxkcmVuIG9yIHJ1biBvdXQgYWx0b2dldGhlciAqLwogCQlkbyB7CiAJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlOwogCisJCQkvKiBkZXRhY2ggZnJvbSB0aGUgc3lzdGVtICovCisJCQlkZW50cnlfbHJ1X2RlbChkZW50cnkpOworCQkJX19kX3NocmluayhkZW50cnkpOworCiAJCQlpZiAoZGVudHJ5LT5kX2NvdW50ICE9IDApIHsKIAkJCQlwcmludGsoS0VSTl9FUlIKIAkJCQkgICAgICAgIkJVRzogRGVudHJ5ICVwe2k9JWx4LG49JXN9IgpAQCAtODg2LDE0ICs4NzgsMTAgQEAKIAkJCQlsaXN0X2RlbCgmZGVudHJ5LT5kX3UuZF9jaGlsZCk7CiAJCQl9IGVsc2UgewogCQkJCXBhcmVudCA9IGRlbnRyeS0+ZF9wYXJlbnQ7Ci0JCQkJc3Bpbl9sb2NrKCZwYXJlbnQtPmRfbG9jayk7CiAJCQkJcGFyZW50LT5kX2NvdW50LS07CiAJCQkJbGlzdF9kZWwoJmRlbnRyeS0+ZF91LmRfY2hpbGQpOwotCQkJCXNwaW5fdW5sb2NrKCZwYXJlbnQtPmRfbG9jayk7CiAJCQl9CiAKLQkJCWRldGFjaGVkKys7Ci0KIAkJCWlub2RlID0gZGVudHJ5LT5kX2lub2RlOwogCQkJaWYgKGlub2RlKSB7CiAJCQkJZGVudHJ5LT5kX2lub2RlID0gTlVMTDsKQEAgLTkzOCw5ICs5MjYsNyBAQAogCiAJZGVudHJ5ID0gc2ItPnNfcm9vdDsKIAlzYi0+c19yb290ID0gTlVMTDsKLQlzcGluX2xvY2soJmRlbnRyeS0+ZF9sb2NrKTsKIAlkZW50cnktPmRfY291bnQtLTsKLQlzcGluX3VubG9jaygmZGVudHJ5LT5kX2xvY2spOwogCXNocmlua19kY2FjaGVfZm9yX3Vtb3VudF9zdWJ0cmVlKGRlbnRyeSk7CiAKIAl3aGlsZSAoIWhsaXN0X2JsX2VtcHR5KCZzYi0+c19hbm9uKSkgewpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMvaW5vZGUuYyBiL2ZzL2VjcnlwdGZzL2lub2RlLmMKaW5kZXggMzQwYzY1Ny4uMTFmODU4MiAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMvaW5vZGUuYworKysgYi9mcy9lY3J5cHRmcy9pbm9kZS5jCkBAIC02OSw2ICs2OSw3IEBACiAJaW5vZGUtPmlfaW5vID0gbG93ZXJfaW5vZGUtPmlfaW5vOwogCWlub2RlLT5pX3ZlcnNpb24rKzsKIAlpbm9kZS0+aV9tYXBwaW5nLT5hX29wcyA9ICZlY3J5cHRmc19hb3BzOworCWlub2RlLT5pX21hcHBpbmctPmJhY2tpbmdfZGV2X2luZm8gPSBpbm9kZS0+aV9zYi0+c19iZGk7CiAKIAlpZiAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKIAkJaW5vZGUtPmlfb3AgPSAmZWNyeXB0ZnNfc3ltbGlua19pb3BzOwpkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMva2V5c3RvcmUuYyBiL2ZzL2VjcnlwdGZzL2tleXN0b3JlLmMKaW5kZXggYzQ3MjUzMy4uMDhhMmI1MiAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMva2V5c3RvcmUuYworKysgYi9mcy9lY3J5cHRmcy9rZXlzdG9yZS5jCkBAIC0xODcxLDExICsxODcxLDYgQEAKIAkgKiBqdXN0IG9uZSB3aWxsIGJlIHN1ZmZpY2llbnQgdG8gZGVjcnlwdCB0byBnZXQgdGhlIEZFSy4gKi8KIGZpbmRfbmV4dF9tYXRjaGluZ19hdXRoX3RvazoKIAlmb3VuZF9hdXRoX3RvayA9IDA7Ci0JaWYgKGF1dGhfdG9rX2tleSkgewotCQl1cF93cml0ZSgmKGF1dGhfdG9rX2tleS0+c2VtKSk7Ci0JCWtleV9wdXQoYXV0aF90b2tfa2V5KTsKLQkJYXV0aF90b2tfa2V5ID0gTlVMTDsKLQl9CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShhdXRoX3Rva19saXN0X2l0ZW0sICZhdXRoX3Rva19saXN0LCBsaXN0KSB7CiAJCWNhbmRpZGF0ZV9hdXRoX3RvayA9ICZhdXRoX3Rva19saXN0X2l0ZW0tPmF1dGhfdG9rOwogCQlpZiAodW5saWtlbHkoZWNyeXB0ZnNfdmVyYm9zaXR5ID4gMCkpIHsKQEAgLTE5MTIsMTQgKzE5MDcsMjIgQEAKIAkJbWVtY3B5KCYoY2FuZGlkYXRlX2F1dGhfdG9rLT50b2tlbi5wcml2YXRlX2tleSksCiAJCSAgICAgICAmKG1hdGNoaW5nX2F1dGhfdG9rLT50b2tlbi5wcml2YXRlX2tleSksCiAJCSAgICAgICBzaXplb2Yoc3RydWN0IGVjcnlwdGZzX3ByaXZhdGVfa2V5KSk7CisJCXVwX3dyaXRlKCYoYXV0aF90b2tfa2V5LT5zZW0pKTsKKwkJa2V5X3B1dChhdXRoX3Rva19rZXkpOwogCQlyYyA9IGRlY3J5cHRfcGtpX2VuY3J5cHRlZF9zZXNzaW9uX2tleShjYW5kaWRhdGVfYXV0aF90b2ssCiAJCQkJCQkgICAgICAgY3J5cHRfc3RhdCk7CiAJfSBlbHNlIGlmIChjYW5kaWRhdGVfYXV0aF90b2stPnRva2VuX3R5cGUgPT0gRUNSWVBURlNfUEFTU1dPUkQpIHsKIAkJbWVtY3B5KCYoY2FuZGlkYXRlX2F1dGhfdG9rLT50b2tlbi5wYXNzd29yZCksCiAJCSAgICAgICAmKG1hdGNoaW5nX2F1dGhfdG9rLT50b2tlbi5wYXNzd29yZCksCiAJCSAgICAgICBzaXplb2Yoc3RydWN0IGVjcnlwdGZzX3Bhc3N3b3JkKSk7CisJCXVwX3dyaXRlKCYoYXV0aF90b2tfa2V5LT5zZW0pKTsKKwkJa2V5X3B1dChhdXRoX3Rva19rZXkpOwogCQlyYyA9IGRlY3J5cHRfcGFzc3BocmFzZV9lbmNyeXB0ZWRfc2Vzc2lvbl9rZXkoCiAJCQljYW5kaWRhdGVfYXV0aF90b2ssIGNyeXB0X3N0YXQpOworCX0gZWxzZSB7CisJCXVwX3dyaXRlKCYoYXV0aF90b2tfa2V5LT5zZW0pKTsKKwkJa2V5X3B1dChhdXRoX3Rva19rZXkpOworCQlyYyA9IC1FSU5WQUw7CiAJfQogCWlmIChyYykgewogCQlzdHJ1Y3QgZWNyeXB0ZnNfYXV0aF90b2tfbGlzdF9pdGVtICphdXRoX3Rva19saXN0X2l0ZW1fdG1wOwpAQCAtMTk1OSwxNSArMTk2MiwxMiBAQAogb3V0X3dpcGVfbGlzdDoKIAl3aXBlX2F1dGhfdG9rX2xpc3QoJmF1dGhfdG9rX2xpc3QpOwogb3V0OgotCWlmIChhdXRoX3Rva19rZXkpIHsKLQkJdXBfd3JpdGUoJihhdXRoX3Rva19rZXktPnNlbSkpOwotCQlrZXlfcHV0KGF1dGhfdG9rX2tleSk7Ci0JfQogCXJldHVybiByYzsKIH0KIAogc3RhdGljIGludAotcGtpX2VuY3J5cHRfc2Vzc2lvbl9rZXkoc3RydWN0IGVjcnlwdGZzX2F1dGhfdG9rICphdXRoX3RvaywKK3BraV9lbmNyeXB0X3Nlc3Npb25fa2V5KHN0cnVjdCBrZXkgKmF1dGhfdG9rX2tleSwKKwkJCXN0cnVjdCBlY3J5cHRmc19hdXRoX3RvayAqYXV0aF90b2ssCiAJCQlzdHJ1Y3QgZWNyeXB0ZnNfY3J5cHRfc3RhdCAqY3J5cHRfc3RhdCwKIAkJCXN0cnVjdCBlY3J5cHRmc19rZXlfcmVjb3JkICprZXlfcmVjKQogewpAQCAtMTk4Miw2ICsxOTgyLDggQEAKIAkJCQkJIGNyeXB0X3N0YXQtPmNpcGhlciwKIAkJCQkJIGNyeXB0X3N0YXQtPmtleV9zaXplKSwKIAkJCQkgY3J5cHRfc3RhdCwgJnBheWxvYWQsICZwYXlsb2FkX2xlbik7CisJdXBfd3JpdGUoJihhdXRoX3Rva19rZXktPnNlbSkpOworCWtleV9wdXQoYXV0aF90b2tfa2V5KTsKIAlpZiAocmMpIHsKIAkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiRXJyb3IgZ2VuZXJhdGluZyB0YWcgNjYgcGFja2V0XG4iKTsKIAkJZ290byBvdXQ7CkBAIC0yMDExLDYgKzIwMTMsOCBAQAogICogd3JpdGVfdGFnXzFfcGFja2V0IC0gV3JpdGUgYW4gUkZDMjQ0MC1jb21wYXRpYmxlIHRhZyAxIChwdWJsaWMga2V5KSBwYWNrZXQKICAqIEBkZXN0OiBCdWZmZXIgaW50byB3aGljaCB0byB3cml0ZSB0aGUgcGFja2V0CiAgKiBAcmVtYWluaW5nX2J5dGVzOiBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSB3cml0dG4KKyAqIEBhdXRoX3Rva19rZXk6IFRoZSBhdXRoZW50aWNhdGlvbiB0b2tlbiBrZXkgdG8gdW5sb2NrIGFuZCBwdXQgd2hlbiBkb25lIHdpdGgKKyAqICAgICAgICAgICAgICAgIEBhdXRoX3RvawogICogQGF1dGhfdG9rOiBUaGUgYXV0aGVudGljYXRpb24gdG9rZW4gdXNlZCBmb3IgZ2VuZXJhdGluZyB0aGUgdGFnIDEgcGFja2V0CiAgKiBAY3J5cHRfc3RhdDogVGhlIGNyeXB0b2dyYXBoaWMgY29udGV4dAogICogQGtleV9yZWM6IFRoZSBrZXkgcmVjb3JkIHN0cnVjdCBmb3IgdGhlIHRhZyAxIHBhY2tldApAQCAtMjAyMSw3ICsyMDI1LDcgQEAKICAqLwogc3RhdGljIGludAogd3JpdGVfdGFnXzFfcGFja2V0KGNoYXIgKmRlc3QsIHNpemVfdCAqcmVtYWluaW5nX2J5dGVzLAotCQkgICBzdHJ1Y3QgZWNyeXB0ZnNfYXV0aF90b2sgKmF1dGhfdG9rLAorCQkgICBzdHJ1Y3Qga2V5ICphdXRoX3Rva19rZXksIHN0cnVjdCBlY3J5cHRmc19hdXRoX3RvayAqYXV0aF90b2ssCiAJCSAgIHN0cnVjdCBlY3J5cHRmc19jcnlwdF9zdGF0ICpjcnlwdF9zdGF0LAogCQkgICBzdHJ1Y3QgZWNyeXB0ZnNfa2V5X3JlY29yZCAqa2V5X3JlYywgc2l6ZV90ICpwYWNrZXRfc2l6ZSkKIHsKQEAgLTIwNDIsMTIgKzIwNDYsMTUgQEAKIAkJbWVtY3B5KGtleV9yZWMtPmVuY19rZXksCiAJCSAgICAgICBhdXRoX3Rvay0+c2Vzc2lvbl9rZXkuZW5jcnlwdGVkX2tleSwKIAkJICAgICAgIGF1dGhfdG9rLT5zZXNzaW9uX2tleS5lbmNyeXB0ZWRfa2V5X3NpemUpOworCQl1cF93cml0ZSgmKGF1dGhfdG9rX2tleS0+c2VtKSk7CisJCWtleV9wdXQoYXV0aF90b2tfa2V5KTsKIAkJZ290byBlbmNyeXB0ZWRfc2Vzc2lvbl9rZXlfc2V0OwogCX0KIAlpZiAoYXV0aF90b2stPnNlc3Npb25fa2V5LmVuY3J5cHRlZF9rZXlfc2l6ZSA9PSAwKQogCQlhdXRoX3Rvay0+c2Vzc2lvbl9rZXkuZW5jcnlwdGVkX2tleV9zaXplID0KIAkJCWF1dGhfdG9rLT50b2tlbi5wcml2YXRlX2tleS5rZXlfc2l6ZTsKLQlyYyA9IHBraV9lbmNyeXB0X3Nlc3Npb25fa2V5KGF1dGhfdG9rLCBjcnlwdF9zdGF0LCBrZXlfcmVjKTsKKwlyYyA9IHBraV9lbmNyeXB0X3Nlc3Npb25fa2V5KGF1dGhfdG9rX2tleSwgYXV0aF90b2ssIGNyeXB0X3N0YXQsCisJCQkJICAgICBrZXlfcmVjKTsKIAlpZiAocmMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gZW5jcnlwdCBzZXNzaW9uIGtleSB2aWEgYSBrZXkgIgogCQkgICAgICAgIm1vZHVsZTsgcmMgPSBbJWRdXG4iLCByYyk7CkBAIC0yNDI0LDYgKzI0MzEsOCBAQAogCQkJCQkJJm1heCwgYXV0aF90b2ssCiAJCQkJCQljcnlwdF9zdGF0LCBrZXlfcmVjLAogCQkJCQkJJndyaXR0ZW4pOworCQkJdXBfd3JpdGUoJihhdXRoX3Rva19rZXktPnNlbSkpOworCQkJa2V5X3B1dChhdXRoX3Rva19rZXkpOwogCQkJaWYgKHJjKSB7CiAJCQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fV0FSTklORywgIkVycm9yICIKIAkJCQkJCSJ3cml0aW5nIHRhZyAzIHBhY2tldFxuIik7CkBAIC0yNDQxLDggKzI0NTAsOCBAQAogCQkJfQogCQkJKCpsZW4pICs9IHdyaXR0ZW47CiAJCX0gZWxzZSBpZiAoYXV0aF90b2stPnRva2VuX3R5cGUgPT0gRUNSWVBURlNfUFJJVkFURV9LRVkpIHsKLQkJCXJjID0gd3JpdGVfdGFnXzFfcGFja2V0KGRlc3RfYmFzZSArICgqbGVuKSwKLQkJCQkJCSZtYXgsIGF1dGhfdG9rLAorCQkJcmMgPSB3cml0ZV90YWdfMV9wYWNrZXQoZGVzdF9iYXNlICsgKCpsZW4pLCAmbWF4LAorCQkJCQkJYXV0aF90b2tfa2V5LCBhdXRoX3RvaywKIAkJCQkJCWNyeXB0X3N0YXQsIGtleV9yZWMsICZ3cml0dGVuKTsKIAkJCWlmIChyYykgewogCQkJCWVjcnlwdGZzX3ByaW50ayhLRVJOX1dBUk5JTkcsICJFcnJvciAiCkBAIC0yNDUxLDE0ICsyNDYwLDEzIEBACiAJCQl9CiAJCQkoKmxlbikgKz0gd3JpdHRlbjsKIAkJfSBlbHNlIHsKKwkJCXVwX3dyaXRlKCYoYXV0aF90b2tfa2V5LT5zZW0pKTsKKwkJCWtleV9wdXQoYXV0aF90b2tfa2V5KTsKIAkJCWVjcnlwdGZzX3ByaW50ayhLRVJOX1dBUk5JTkcsICJVbnN1cHBvcnRlZCAiCiAJCQkJCSJhdXRoZW50aWNhdGlvbiB0b2tlbiB0eXBlXG4iKTsKIAkJCXJjID0gLUVJTlZBTDsKIAkJCWdvdG8gb3V0X2ZyZWU7CiAJCX0KLQkJdXBfd3JpdGUoJihhdXRoX3Rva19rZXktPnNlbSkpOwotCQlrZXlfcHV0KGF1dGhfdG9rX2tleSk7Ci0JCWF1dGhfdG9rX2tleSA9IE5VTEw7CiAJfQogCWlmIChsaWtlbHkobWF4ID4gMCkpIHsKIAkJZGVzdF9iYXNlWygqbGVuKV0gPSAweDAwOwpAQCAtMjQ3MSwxMSArMjQ3OSw2IEBACiBvdXQ6CiAJaWYgKHJjKQogCQkoKmxlbikgPSAwOwotCWlmIChhdXRoX3Rva19rZXkpIHsKLQkJdXBfd3JpdGUoJihhdXRoX3Rva19rZXktPnNlbSkpOwotCQlrZXlfcHV0KGF1dGhfdG9rX2tleSk7Ci0JfQotCiAJbXV0ZXhfdW5sb2NrKCZjcnlwdF9zdGF0LT5rZXlzaWdfbGlzdF9tdXRleCk7CiAJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvZnMvZXh0Mi9hY2wuYyBiL2ZzL2V4dDIvYWNsLmMKaW5kZXggNTJjMDUzNy4uMzVkNmEzYyAxMDA2NDQKLS0tIGEvZnMvZXh0Mi9hY2wuYworKysgYi9mcy9leHQyL2FjbC5jCkBAIC0xOTQsMTIgKzE5NCwxMCBAQAogCQljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKIAkJCW5hbWVfaW5kZXggPSBFWFQyX1hBVFRSX0lOREVYX1BPU0lYX0FDTF9BQ0NFU1M7CiAJCQlpZiAoYWNsKSB7Ci0JCQkJbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOwotCQkJCWVycm9yID0gcG9zaXhfYWNsX2VxdWl2X21vZGUoYWNsLCAmbW9kZSk7CisJCQkJZXJyb3IgPSBwb3NpeF9hY2xfZXF1aXZfbW9kZShhY2wsICZpbm9kZS0+aV9tb2RlKTsKIAkJCQlpZiAoZXJyb3IgPCAwKQogCQkJCQlyZXR1cm4gZXJyb3I7CiAJCQkJZWxzZSB7Ci0JCQkJCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCQkJCQlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CiAJCQkJCW1hcmtfaW5vZGVfZGlydHkoaW5vZGUpOwogCQkJCQlpZiAoZXJyb3IgPT0gMCkKQEAgLTI1MywxNiArMjUxLDE0IEBACiAJCQlpbm9kZS0+aV9tb2RlICY9IH5jdXJyZW50X3VtYXNrKCk7CiAJfQogCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgUE9TSVhfQUNMKSAmJiBhY2wpIHsKLQkJbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOwogCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewogCQkJZXJyb3IgPSBleHQyX3NldF9hY2woaW5vZGUsIEFDTF9UWVBFX0RFRkFVTFQsIGFjbCk7CiAJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBjbGVhbnVwOwogCQl9Ci0JCWVycm9yID0gcG9zaXhfYWNsX2NyZWF0ZSgmYWNsLCBHRlBfS0VSTkVMLCAmbW9kZSk7CisJCWVycm9yID0gcG9zaXhfYWNsX2NyZWF0ZSgmYWNsLCBHRlBfS0VSTkVMLCAmaW5vZGUtPmlfbW9kZSk7CiAJCWlmIChlcnJvciA8IDApCiAJCQlyZXR1cm4gZXJyb3I7Ci0JCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCQlpZiAoZXJyb3IgPiAwKSB7CiAJCQkvKiBUaGlzIGlzIGFuIGV4dGVuZGVkIEFDTCAqLwogCQkJZXJyb3IgPSBleHQyX3NldF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgYWNsKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDIvYWNsLmggYi9mcy9leHQyL2FjbC5oCmluZGV4IDVjMGE2YTQuLjUwM2JmYjAgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDIvYWNsLmgKKysrIGIvZnMvZXh0Mi9hY2wuaApAQCAtNjEsNyArNjEsNiBAQAogI2Vsc2UKICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2RlZmluZSBleHQyX2dldF9hY2wJTlVMTAotI2RlZmluZSBleHQyX2dldF9hY2wJTlVMTAogI2RlZmluZSBleHQyX3NldF9hY2wJTlVMTAogCiBzdGF0aWMgaW5saW5lIGludApkaWZmIC0tZ2l0IGEvZnMvZXh0My9hY2wuYyBiL2ZzL2V4dDMvYWNsLmMKaW5kZXggNmMyOWJmMC4uMzA5MWY2MiAxMDA2NDQKLS0tIGEvZnMvZXh0My9hY2wuYworKysgYi9mcy9leHQzL2FjbC5jCkBAIC0xOTksMTIgKzE5OSwxMCBAQAogCQljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKIAkJCW5hbWVfaW5kZXggPSBFWFQzX1hBVFRSX0lOREVYX1BPU0lYX0FDTF9BQ0NFU1M7CiAJCQlpZiAoYWNsKSB7Ci0JCQkJbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOwotCQkJCWVycm9yID0gcG9zaXhfYWNsX2VxdWl2X21vZGUoYWNsLCAmbW9kZSk7CisJCQkJZXJyb3IgPSBwb3NpeF9hY2xfZXF1aXZfbW9kZShhY2wsICZpbm9kZS0+aV9tb2RlKTsKIAkJCQlpZiAoZXJyb3IgPCAwKQogCQkJCQlyZXR1cm4gZXJyb3I7CiAJCQkJZWxzZSB7Ci0JCQkJCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCQkJCQlpbm9kZS0+aV9jdGltZSA9IENVUlJFTlRfVElNRV9TRUM7CiAJCQkJCWV4dDNfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKIAkJCQkJaWYgKGVycm9yID09IDApCkBAIC0yNjEsMTkgKzI1OSwxNiBAQAogCQkJaW5vZGUtPmlfbW9kZSAmPSB+Y3VycmVudF91bWFzaygpOwogCX0KIAlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIFBPU0lYX0FDTCkgJiYgYWNsKSB7Ci0JCW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKLQogCQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSkgewogCQkJZXJyb3IgPSBleHQzX3NldF9hY2woaGFuZGxlLCBpbm9kZSwKIAkJCQkJICAgICBBQ0xfVFlQRV9ERUZBVUxULCBhY2wpOwogCQkJaWYgKGVycm9yKQogCQkJCWdvdG8gY2xlYW51cDsKIAkJfQotCQllcnJvciA9IHBvc2l4X2FjbF9jcmVhdGUoJmFjbCwgR0ZQX05PRlMsICZtb2RlKTsKKwkJZXJyb3IgPSBwb3NpeF9hY2xfY3JlYXRlKCZhY2wsIEdGUF9OT0ZTLCAmaW5vZGUtPmlfbW9kZSk7CiAJCWlmIChlcnJvciA8IDApCiAJCQlyZXR1cm4gZXJyb3I7CiAKLQkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJCWlmIChlcnJvciA+IDApIHsKIAkJCS8qIFRoaXMgaXMgYW4gZXh0ZW5kZWQgQUNMICovCiAJCQllcnJvciA9IGV4dDNfc2V0X2FjbChoYW5kbGUsIGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MsIGFjbCk7CmRpZmYgLS1naXQgYS9mcy9leHQ0L01ha2VmaWxlIGIvZnMvZXh0NC9NYWtlZmlsZQppbmRleCAwNDEwOTQ2MC4uNTZmZDhmODYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvTWFrZWZpbGUKKysrIGIvZnMvZXh0NC9NYWtlZmlsZQpAQCAtNyw3ICs3LDcgQEAKIGV4dDQteQk6PSBiYWxsb2MubyBiaXRtYXAubyBkaXIubyBmaWxlLm8gZnN5bmMubyBpYWxsb2MubyBpbm9kZS5vIHBhZ2UtaW8ubyBcCiAJCWlvY3RsLm8gbmFtZWkubyBzdXBlci5vIHN5bWxpbmsubyBoYXNoLm8gcmVzaXplLm8gZXh0ZW50cy5vIFwKIAkJZXh0NF9qYmQyLm8gbWlncmF0ZS5vIG1iYWxsb2MubyBibG9ja192YWxpZGl0eS5vIG1vdmVfZXh0ZW50Lm8gXAotCQltbXAubworCQltbXAubyBpbmRpcmVjdC5vCiAKIGV4dDQtJChDT05GSUdfRVhUNF9GU19YQVRUUikJCSs9IHhhdHRyLm8geGF0dHJfdXNlci5vIHhhdHRyX3RydXN0ZWQubwogZXh0NC0kKENPTkZJR19FWFQ0X0ZTX1BPU0lYX0FDTCkJKz0gYWNsLm8KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvYWNsLmMgYi9mcy9leHQ0L2FjbC5jCmluZGV4IGRjYTJkMWQuLmE1YzI5YmIgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvYWNsLmMKKysrIGIvZnMvZXh0NC9hY2wuYwpAQCAtMTk4LDEyICsxOTgsMTAgQEAKIAljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKIAkJbmFtZV9pbmRleCA9IEVYVDRfWEFUVFJfSU5ERVhfUE9TSVhfQUNMX0FDQ0VTUzsKIAkJaWYgKGFjbCkgewotCQkJbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOwotCQkJZXJyb3IgPSBwb3NpeF9hY2xfZXF1aXZfbW9kZShhY2wsICZtb2RlKTsKKwkJCWVycm9yID0gcG9zaXhfYWNsX2VxdWl2X21vZGUoYWNsLCAmaW5vZGUtPmlfbW9kZSk7CiAJCQlpZiAoZXJyb3IgPCAwKQogCQkJCXJldHVybiBlcnJvcjsKIAkJCWVsc2UgewotCQkJCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCQkJCWlub2RlLT5pX2N0aW1lID0gZXh0NF9jdXJyZW50X3RpbWUoaW5vZGUpOwogCQkJCWV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKIAkJCQlpZiAoZXJyb3IgPT0gMCkKQEAgLTI1OSwxOSArMjU3LDE2IEBACiAJCQlpbm9kZS0+aV9tb2RlICY9IH5jdXJyZW50X3VtYXNrKCk7CiAJfQogCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgUE9TSVhfQUNMKSAmJiBhY2wpIHsKLQkJbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOwotCiAJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CiAJCQllcnJvciA9IGV4dDRfc2V0X2FjbChoYW5kbGUsIGlub2RlLAogCQkJCQkgICAgIEFDTF9UWVBFX0RFRkFVTFQsIGFjbCk7CiAJCQlpZiAoZXJyb3IpCiAJCQkJZ290byBjbGVhbnVwOwogCQl9Ci0JCWVycm9yID0gcG9zaXhfYWNsX2NyZWF0ZSgmYWNsLCBHRlBfTk9GUywgJm1vZGUpOworCQllcnJvciA9IHBvc2l4X2FjbF9jcmVhdGUoJmFjbCwgR0ZQX05PRlMsICZpbm9kZS0+aV9tb2RlKTsKIAkJaWYgKGVycm9yIDwgMCkKIAkJCXJldHVybiBlcnJvcjsKIAotCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAkJaWYgKGVycm9yID4gMCkgewogCQkJLyogVGhpcyBpcyBhbiBleHRlbmRlZCBBQ0wgKi8KIAkJCWVycm9yID0gZXh0NF9zZXRfYWNsKGhhbmRsZSwgaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgYWNsKTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvYmFsbG9jLmMgYi9mcy9leHQ0L2JhbGxvYy5jCmluZGV4IDI2NGY2OTQuLmY4MjI0YWQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvYmFsbG9jLmMKKysrIGIvZnMvZXh0NC9iYWxsb2MuYwpAQCAtNjIwLDMgKzYyMCw1MSBAQAogCiB9CiAKKy8qKgorICoJZXh0NF9pbm9kZV90b19nb2FsX2Jsb2NrIC0gcmV0dXJuIGEgaGludCBmb3IgYmxvY2sgYWxsb2NhdGlvbgorICoJQGlub2RlOiBpbm9kZSBmb3IgYmxvY2sgYWxsb2NhdGlvbgorICoKKyAqCVJldHVybiB0aGUgaWRlYWwgbG9jYXRpb24gdG8gc3RhcnQgYWxsb2NhdGluZyBibG9ja3MgZm9yIGEKKyAqCW5ld2x5IGNyZWF0ZWQgaW5vZGUuCisgKi8KK2V4dDRfZnNibGtfdCBleHQ0X2lub2RlX3RvX2dvYWxfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7CisJZXh0NF9ncm91cF90IGJsb2NrX2dyb3VwOworCWV4dDRfZ3JwYmxrX3QgY29sb3VyOworCWludCBmbGV4X3NpemUgPSBleHQ0X2ZsZXhfYmdfc2l6ZShFWFQ0X1NCKGlub2RlLT5pX3NiKSk7CisJZXh0NF9mc2Jsa190IGJnX3N0YXJ0OworCWV4dDRfZnNibGtfdCBsYXN0X2Jsb2NrOworCisJYmxvY2tfZ3JvdXAgPSBlaS0+aV9ibG9ja19ncm91cDsKKwlpZiAoZmxleF9zaXplID49IEVYVDRfRkxFWF9TSVpFX0RJUl9BTExPQ19TQ0hFTUUpIHsKKwkJLyoKKwkJICogSWYgdGhlcmUgYXJlIGF0IGxlYXN0IEVYVDRfRkxFWF9TSVpFX0RJUl9BTExPQ19TQ0hFTUUKKwkJICogYmxvY2sgZ3JvdXBzIHBlciBmbGV4Z3JvdXAsIHJlc2VydmUgdGhlIGZpcnN0IGJsb2NrCisJCSAqIGdyb3VwIGZvciBkaXJlY3RvcmllcyBhbmQgc3BlY2lhbCBmaWxlcy4gIFJlZ3VsYXIKKwkJICogZmlsZXMgd2lsbCBzdGFydCBhdCB0aGUgc2Vjb25kIGJsb2NrIGdyb3VwLiAgVGhpcworCQkgKiB0ZW5kcyB0byBzcGVlZCB1cCBkaXJlY3RvcnkgYWNjZXNzIGFuZCBpbXByb3ZlcworCQkgKiBmc2NrIHRpbWVzLgorCQkgKi8KKwkJYmxvY2tfZ3JvdXAgJj0gfihmbGV4X3NpemUtMSk7CisJCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKQorCQkJYmxvY2tfZ3JvdXArKzsKKwl9CisJYmdfc3RhcnQgPSBleHQ0X2dyb3VwX2ZpcnN0X2Jsb2NrX25vKGlub2RlLT5pX3NiLCBibG9ja19ncm91cCk7CisJbGFzdF9ibG9jayA9IGV4dDRfYmxvY2tzX2NvdW50KEVYVDRfU0IoaW5vZGUtPmlfc2IpLT5zX2VzKSAtIDE7CisKKwkvKgorCSAqIElmIHdlIGFyZSBkb2luZyBkZWxheWVkIGFsbG9jYXRpb24sIHdlIGRvbid0IG5lZWQgdGFrZQorCSAqIGNvbG91ciBpbnRvIGFjY291bnQuCisJICovCisJaWYgKHRlc3Rfb3B0KGlub2RlLT5pX3NiLCBERUxBTExPQykpCisJCXJldHVybiBiZ19zdGFydDsKKworCWlmIChiZ19zdGFydCArIEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChpbm9kZS0+aV9zYikgPD0gbGFzdF9ibG9jaykKKwkJY29sb3VyID0gKGN1cnJlbnQtPnBpZCAlIDE2KSAqCisJCQkoRVhUNF9CTE9DS1NfUEVSX0dST1VQKGlub2RlLT5pX3NiKSAvIDE2KTsKKwllbHNlCisJCWNvbG91ciA9IChjdXJyZW50LT5waWQgJSAxNikgKiAoKGxhc3RfYmxvY2sgLSBiZ19zdGFydCkgLyAxNik7CisJcmV0dXJuIGJnX3N0YXJ0ICsgY29sb3VyOworfQorCmRpZmYgLS1naXQgYS9mcy9leHQ0L2Jsb2NrX3ZhbGlkaXR5LmMgYi9mcy9leHQ0L2Jsb2NrX3ZhbGlkaXR5LmMKaW5kZXggZmFjOTBmMy4uOGVmYjJmMCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9ibG9ja192YWxpZGl0eS5jCisrKyBiL2ZzL2V4dDQvYmxvY2tfdmFsaWRpdHkuYwpAQCAtMjQ2LDMgKzI0NiwyNCBAQAogCXJldHVybiAxOwogfQogCitpbnQgZXh0NF9jaGVja19ibG9ja3JlZihjb25zdCBjaGFyICpmdW5jdGlvbiwgdW5zaWduZWQgaW50IGxpbmUsCisJCQlzdHJ1Y3QgaW5vZGUgKmlub2RlLCBfX2xlMzIgKnAsIHVuc2lnbmVkIGludCBtYXgpCit7CisJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzID0gRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfZXM7CisJX19sZTMyICpicmVmID0gcDsKKwl1bnNpZ25lZCBpbnQgYmxrOworCisJd2hpbGUgKGJyZWYgPCBwK21heCkgeworCQlibGsgPSBsZTMyX3RvX2NwdSgqYnJlZisrKTsKKwkJaWYgKGJsayAmJgorCQkgICAgdW5saWtlbHkoIWV4dDRfZGF0YV9ibG9ja192YWxpZChFWFQ0X1NCKGlub2RlLT5pX3NiKSwKKwkJCQkJCSAgICBibGssIDEpKSkgeworCQkJZXMtPnNfbGFzdF9lcnJvcl9ibG9jayA9IGNwdV90b19sZTY0KGJsayk7CisJCQlleHQ0X2Vycm9yX2lub2RlKGlub2RlLCBmdW5jdGlvbiwgbGluZSwgYmxrLAorCQkJCQkgImludmFsaWQgYmxvY2siKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dDQuaCBiL2ZzL2V4dDQvZXh0NC5oCmluZGV4IGZhNDRkZjguLmU3MTdkZmQgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZXh0NC5oCisrKyBiL2ZzL2V4dDQvZXh0NC5oCkBAIC01MjYsNiArNTI2LDcgQEAKICNkZWZpbmUgRVhUNF9GUkVFX0JMT0NLU19NRVRBREFUQQkweDAwMDEKICNkZWZpbmUgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQJCTB4MDAwMgogI2RlZmluZSBFWFQ0X0ZSRUVfQkxPQ0tTX1ZBTElEQVRFRAkweDAwMDQKKyNkZWZpbmUgRVhUNF9GUkVFX0JMT0NLU19OT19RVU9UX1VQREFURQkweDAwMDgKIAogLyoKICAqIGlvY3RsIGNvbW1hbmRzCkBAIC05MzksNiArOTQwLDggQEAKICNkZWZpbmUgZXh0NF9maW5kX25leHRfemVyb19iaXQJCWZpbmRfbmV4dF96ZXJvX2JpdF9sZQogI2RlZmluZSBleHQ0X2ZpbmRfbmV4dF9iaXQJCWZpbmRfbmV4dF9iaXRfbGUKIAorZXh0ZXJuIHZvaWQgZXh0NF9zZXRfYml0cyh2b2lkICpibSwgaW50IGN1ciwgaW50IGxlbik7CisKIC8qCiAgKiBNYXhpbWFsIG1vdW50IGNvdW50cyBiZXR3ZWVuIHR3byBmaWxlc3lzdGVtIGNoZWNrcwogICovCkBAIC0xMTI2LDcgKzExMjksOCBAQAogCXN0cnVjdCBqb3VybmFsX3MgKnNfam91cm5hbDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHNfb3JwaGFuOwogCXN0cnVjdCBtdXRleCBzX29ycGhhbl9sb2NrOwotCXN0cnVjdCBtdXRleCBzX3Jlc2l6ZV9sb2NrOworCXVuc2lnbmVkIGxvbmcgc19yZXNpemVfZmxhZ3M7CQkvKiBGbGFncyBpbmRpY2F0aW5nIGlmIHRoZXJlCisJCQkJCQkgICBpcyBhIHJlc2l6ZXIgKi8KIAl1bnNpZ25lZCBsb25nIHNfY29tbWl0X2ludGVydmFsOwogCXUzMiBzX21heF9iYXRjaF90aW1lOwogCXUzMiBzX21pbl9iYXRjaF90aW1lOwpAQCAtMTIxNCw2ICsxMjE4LDkgQEAKIAogCS8qIEtlcm5lbCB0aHJlYWQgZm9yIG11bHRpcGxlIG1vdW50IHByb3RlY3Rpb24gKi8KIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnNfbW1wX3RzazsKKworCS8qIHJlY29yZCB0aGUgbGFzdCBtaW5sZW4gd2hlbiBGSVRSSU0gaXMgY2FsbGVkLiAqLworCWF0b21pY190IHNfbGFzdF90cmltX21pbmJsa3M7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBleHQ0X3NiX2luZm8gKkVYVDRfU0Ioc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKQEAgLTE3NDMsNiArMTc1MCw3IEBACiAJCQkJICAgICAgIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmRlc2MpOwogI2RlZmluZSBleHQ0X2ZyZWVfYmxvY2tzX2FmdGVyX2luaXQoc2IsIGdyb3VwLCBkZXNjKQkJCVwKIAkJZXh0NF9pbml0X2Jsb2NrX2JpdG1hcChzYiwgTlVMTCwgZ3JvdXAsIGRlc2MpCitleHQ0X2ZzYmxrX3QgZXh0NF9pbm9kZV90b19nb2FsX2Jsb2NrKHN0cnVjdCBpbm9kZSAqKTsKIAogLyogZGlyLmMgKi8KIGV4dGVybiBpbnQgX19leHQ0X2NoZWNrX2Rpcl9lbnRyeShjb25zdCBjaGFyICosIHVuc2lnbmVkIGludCwgc3RydWN0IGlub2RlICosCkBAIC0xNzkzLDcgKzE4MDEsNyBAQAogCQkJICAgICB1bnNpZ25lZCBsb25nIGNvdW50LCBpbnQgZmxhZ3MpOwogZXh0ZXJuIGludCBleHQ0X21iX2FkZF9ncm91cGluZm8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJZXh0NF9ncm91cF90IGksIHN0cnVjdCBleHQ0X2dyb3VwX2Rlc2MgKmRlc2MpOwotZXh0ZXJuIHZvaWQgZXh0NF9hZGRfZ3JvdXBibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKK2V4dGVybiBpbnQgZXh0NF9ncm91cF9hZGRfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkJZXh0NF9mc2Jsa190IGJsb2NrLCB1bnNpZ25lZCBsb25nIGNvdW50KTsKIGV4dGVybiBpbnQgZXh0NF90cmltX2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAqLCBzdHJ1Y3QgZnN0cmltX3JhbmdlICopOwogCkBAIC0xODM0LDYgKzE4NDIsMTcgQEAKIGV4dGVybiBxc2l6ZV90ICpleHQ0X2dldF9yZXNlcnZlZF9zcGFjZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKIGV4dGVybiB2b2lkIGV4dDRfZGFfdXBkYXRlX3Jlc2VydmVfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkJaW50IHVzZWQsIGludCBxdW90YV9jbGFpbSk7CisKKy8qIGluZGlyZWN0LmMgKi8KK2V4dGVybiBpbnQgZXh0NF9pbmRfbWFwX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJCXN0cnVjdCBleHQ0X21hcF9ibG9ja3MgKm1hcCwgaW50IGZsYWdzKTsKK2V4dGVybiBzc2l6ZV90IGV4dDRfaW5kX2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwKKwkJCQljb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgbG9mZl90IG9mZnNldCwKKwkJCQl1bnNpZ25lZCBsb25nIG5yX3NlZ3MpOworZXh0ZXJuIGludCBleHQ0X2luZF9jYWxjX21ldGFkYXRhX2Ftb3VudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBsYmxvY2spOworZXh0ZXJuIGludCBleHQ0X2luZF90cmFuc19ibG9ja3Moc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5yYmxvY2tzLCBpbnQgY2h1bmspOworZXh0ZXJuIHZvaWQgZXh0NF9pbmRfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSk7CisKIC8qIGlvY3RsLmMgKi8KIGV4dGVybiBsb25nIGV4dDRfaW9jdGwoc3RydWN0IGZpbGUgKiwgdW5zaWduZWQgaW50LCB1bnNpZ25lZCBsb25nKTsKIGV4dGVybiBsb25nIGV4dDRfY29tcGF0X2lvY3RsKHN0cnVjdCBmaWxlICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgbG9uZyk7CkBAIC0xODU1LDYgKzE4NzQsOSBAQAogCQkJCWV4dDRfZnNibGtfdCBuX2Jsb2Nrc19jb3VudCk7CiAKIC8qIHN1cGVyLmMgKi8KK2V4dGVybiB2b2lkICpleHQ0X2t2bWFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncyk7CitleHRlcm4gdm9pZCAqZXh0NF9rdnphbGxvYyhzaXplX3Qgc2l6ZSwgZ2ZwX3QgZmxhZ3MpOworZXh0ZXJuIHZvaWQgZXh0NF9rdmZyZWUodm9pZCAqcHRyKTsKIGV4dGVybiB2b2lkIF9fZXh0NF9lcnJvcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgY29uc3QgY2hhciAqLCB1bnNpZ25lZCBpbnQsCiAJCQkgY29uc3QgY2hhciAqLCAuLi4pCiAJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA0LCA1KSkpOwpAQCAtMjA2NywxMSArMjA4OSwxOSBAQAogCQkJCQkgKiA1IGZyZWUgOC1ibG9jayByZWdpb25zLiAqLwogfTsKIAotI2RlZmluZSBFWFQ0X0dST1VQX0lORk9fTkVFRF9JTklUX0JJVAkwCisjZGVmaW5lIEVYVDRfR1JPVVBfSU5GT19ORUVEX0lOSVRfQklUCQkwCisjZGVmaW5lIEVYVDRfR1JPVVBfSU5GT19XQVNfVFJJTU1FRF9CSVQJCTEKIAogI2RlZmluZSBFWFQ0X01CX0dSUF9ORUVEX0lOSVQoZ3JwKQlcCiAJKHRlc3RfYml0KEVYVDRfR1JPVVBfSU5GT19ORUVEX0lOSVRfQklULCAmKChncnApLT5iYl9zdGF0ZSkpKQogCisjZGVmaW5lIEVYVDRfTUJfR1JQX1dBU19UUklNTUVEKGdycCkJXAorCSh0ZXN0X2JpdChFWFQ0X0dST1VQX0lORk9fV0FTX1RSSU1NRURfQklULCAmKChncnApLT5iYl9zdGF0ZSkpKQorI2RlZmluZSBFWFQ0X01CX0dSUF9TRVRfVFJJTU1FRChncnApCVwKKwkoc2V0X2JpdChFWFQ0X0dST1VQX0lORk9fV0FTX1RSSU1NRURfQklULCAmKChncnApLT5iYl9zdGF0ZSkpKQorI2RlZmluZSBFWFQ0X01CX0dSUF9DTEVBUl9UUklNTUVEKGdycCkJXAorCShjbGVhcl9iaXQoRVhUNF9HUk9VUF9JTkZPX1dBU19UUklNTUVEX0JJVCwgJigoZ3JwKS0+YmJfc3RhdGUpKSkKKwogI2RlZmluZSBFWFQ0X01BWF9DT05URU5USU9OCQk4CiAjZGVmaW5lIEVYVDRfQ09OVEVOVElPTl9USFJFU0hPTEQJMgogCkBAIC0yMTIzLDYgKzIxNTMsMTkgQEAKIH0KIAogLyoKKyAqIEJsb2NrIHZhbGlkaXR5IGNoZWNraW5nCisgKi8KKyNkZWZpbmUgZXh0NF9jaGVja19pbmRpcmVjdF9ibG9ja3JlZihpbm9kZSwgYmgpCQkJCVwKKwlleHQ0X2NoZWNrX2Jsb2NrcmVmKF9fZnVuY19fLCBfX0xJTkVfXywgaW5vZGUsCQkJXAorCQkJICAgIChfX2xlMzIgKikoYmgpLT5iX2RhdGEsCQkJXAorCQkJICAgIEVYVDRfQUREUl9QRVJfQkxPQ0soKGlub2RlKS0+aV9zYikpCisKKyNkZWZpbmUgZXh0NF9pbmRfY2hlY2tfaW5vZGUoaW5vZGUpCQkJCQlcCisJZXh0NF9jaGVja19ibG9ja3JlZihfX2Z1bmNfXywgX19MSU5FX18sIGlub2RlLAkJCVwKKwkJCSAgICBFWFQ0X0koaW5vZGUpLT5pX2RhdGEsCQkJXAorCQkJICAgIEVYVDRfTkRJUl9CTE9DS1MpCisKKy8qCiAgKiBJbm9kZXMgYW5kIGZpbGVzIG9wZXJhdGlvbnMKICAqLwogCkBAIC0yMTUxLDYgKzIxOTQsOCBAQAogZXh0ZXJuIGludCBleHQ0X2RhdGFfYmxvY2tfdmFsaWQoc3RydWN0IGV4dDRfc2JfaW5mbyAqc2JpLAogCQkJCSBleHQ0X2ZzYmxrX3Qgc3RhcnRfYmxrLAogCQkJCSB1bnNpZ25lZCBpbnQgY291bnQpOworZXh0ZXJuIGludCBleHQ0X2NoZWNrX2Jsb2NrcmVmKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgaW50LAorCQkJICAgICAgIHN0cnVjdCBpbm9kZSAqLCBfX2xlMzIgKiwgdW5zaWduZWQgaW50KTsKIAogLyogZXh0ZW50cy5jICovCiBleHRlcm4gaW50IGV4dDRfZXh0X3RyZWVfaW5pdChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKik7CkBAIC0yMjMwLDYgKzIyNzUsMTAgQEAKIGV4dGVybiB3YWl0X3F1ZXVlX2hlYWRfdCBleHQ0X19pb2VuZF93cVtFWFQ0X1dRX0hBU0hfU1pdOwogZXh0ZXJuIHN0cnVjdCBtdXRleCBleHQ0X19haW9fbXV0ZXhbRVhUNF9XUV9IQVNIX1NaXTsKIAorI2RlZmluZSBFWFQ0X1JFU0laSU5HCTAKK2V4dGVybiBpbnQgZXh0NF9yZXNpemVfYmVnaW4oc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CitleHRlcm4gdm9pZCBleHQ0X3Jlc2l6ZV9lbmQoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CisKICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAKICNlbmRpZgkvKiBfRVhUNF9IICovCmRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dGVudHMuYyBiL2ZzL2V4dDQvZXh0ZW50cy5jCmluZGV4IGY4MTVjYzguLjU3Y2Y1NjggMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZXh0ZW50cy5jCisrKyBiL2ZzL2V4dDQvZXh0ZW50cy5jCkBAIC0xMTQsMTIgKzExNCw2IEBACiAJCQkgICAgICBzdHJ1Y3QgZXh0NF9leHRfcGF0aCAqcGF0aCwKIAkJCSAgICAgIGV4dDRfbGJsa190IGJsb2NrKQogewotCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTsKLQlleHQ0X2ZzYmxrX3QgYmdfc3RhcnQ7Ci0JZXh0NF9mc2Jsa190IGxhc3RfYmxvY2s7Ci0JZXh0NF9ncnBibGtfdCBjb2xvdXI7Ci0JZXh0NF9ncm91cF90IGJsb2NrX2dyb3VwOwotCWludCBmbGV4X3NpemUgPSBleHQ0X2ZsZXhfYmdfc2l6ZShFWFQ0X1NCKGlub2RlLT5pX3NiKSk7CiAJaW50IGRlcHRoOwogCiAJaWYgKHBhdGgpIHsKQEAgLTE2MSwzNiArMTU1LDcgQEAKIAl9CiAKIAkvKiBPSy4gdXNlIGlub2RlJ3MgZ3JvdXAgKi8KLQlibG9ja19ncm91cCA9IGVpLT5pX2Jsb2NrX2dyb3VwOwotCWlmIChmbGV4X3NpemUgPj0gRVhUNF9GTEVYX1NJWkVfRElSX0FMTE9DX1NDSEVNRSkgewotCQkvKgotCQkgKiBJZiB0aGVyZSBhcmUgYXQgbGVhc3QgRVhUNF9GTEVYX1NJWkVfRElSX0FMTE9DX1NDSEVNRQotCQkgKiBibG9jayBncm91cHMgcGVyIGZsZXhncm91cCwgcmVzZXJ2ZSB0aGUgZmlyc3QgYmxvY2sKLQkJICogZ3JvdXAgZm9yIGRpcmVjdG9yaWVzIGFuZCBzcGVjaWFsIGZpbGVzLiAgUmVndWxhcgotCQkgKiBmaWxlcyB3aWxsIHN0YXJ0IGF0IHRoZSBzZWNvbmQgYmxvY2sgZ3JvdXAuICBUaGlzCi0JCSAqIHRlbmRzIHRvIHNwZWVkIHVwIGRpcmVjdG9yeSBhY2Nlc3MgYW5kIGltcHJvdmVzCi0JCSAqIGZzY2sgdGltZXMuCi0JCSAqLwotCQlibG9ja19ncm91cCAmPSB+KGZsZXhfc2l6ZS0xKTsKLQkJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkpCi0JCQlibG9ja19ncm91cCsrOwotCX0KLQliZ19zdGFydCA9IGV4dDRfZ3JvdXBfZmlyc3RfYmxvY2tfbm8oaW5vZGUtPmlfc2IsIGJsb2NrX2dyb3VwKTsKLQlsYXN0X2Jsb2NrID0gZXh0NF9ibG9ja3NfY291bnQoRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfZXMpIC0gMTsKLQotCS8qCi0JICogSWYgd2UgYXJlIGRvaW5nIGRlbGF5ZWQgYWxsb2NhdGlvbiwgd2UgZG9uJ3QgbmVlZCB0YWtlCi0JICogY29sb3VyIGludG8gYWNjb3VudC4KLQkgKi8KLQlpZiAodGVzdF9vcHQoaW5vZGUtPmlfc2IsIERFTEFMTE9DKSkKLQkJcmV0dXJuIGJnX3N0YXJ0OwotCi0JaWYgKGJnX3N0YXJ0ICsgRVhUNF9CTE9DS1NfUEVSX0dST1VQKGlub2RlLT5pX3NiKSA8PSBsYXN0X2Jsb2NrKQotCQljb2xvdXIgPSAoY3VycmVudC0+cGlkICUgMTYpICoKLQkJCShFWFQ0X0JMT0NLU19QRVJfR1JPVVAoaW5vZGUtPmlfc2IpIC8gMTYpOwotCWVsc2UKLQkJY29sb3VyID0gKGN1cnJlbnQtPnBpZCAlIDE2KSAqICgobGFzdF9ibG9jayAtIGJnX3N0YXJ0KSAvIDE2KTsKLQlyZXR1cm4gYmdfc3RhcnQgKyBjb2xvdXIgKyBibG9jazsKKwlyZXR1cm4gZXh0NF9pbm9kZV90b19nb2FsX2Jsb2NrKGlub2RlKTsKIH0KIAogLyoKQEAgLTc3Niw2ICs3NDEsMTYgQEAKIAkJCQkgbG9naWNhbCwgbGUzMl90b19jcHUoY3VycC0+cF9pZHgtPmVpX2Jsb2NrKSk7CiAJCXJldHVybiAtRUlPOwogCX0KKworCWlmICh1bmxpa2VseShsZTE2X3RvX2NwdShjdXJwLT5wX2hkci0+ZWhfZW50cmllcykKKwkJCSAgICAgPj0gbGUxNl90b19jcHUoY3VycC0+cF9oZHItPmVoX21heCkpKSB7CisJCUVYVDRfRVJST1JfSU5PREUoaW5vZGUsCisJCQkJICJlaF9lbnRyaWVzICVkID49IGVoX21heCAlZCEiLAorCQkJCSBsZTE2X3RvX2NwdShjdXJwLT5wX2hkci0+ZWhfZW50cmllcyksCisJCQkJIGxlMTZfdG9fY3B1KGN1cnAtPnBfaGRyLT5laF9tYXgpKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCiAJbGVuID0gRVhUX01BWF9JTkRFWChjdXJwLT5wX2hkcikgLSBjdXJwLT5wX2lkeDsKIAlpZiAobG9naWNhbCA+IGxlMzJfdG9fY3B1KGN1cnAtPnBfaWR4LT5laV9ibG9jaykpIHsKIAkJLyogaW5zZXJ0IGFmdGVyICovCkBAIC04MDUsMTMgKzc4MCw2IEBACiAJZXh0NF9pZHhfc3RvcmVfcGJsb2NrKGl4LCBwdHIpOwogCWxlMTZfYWRkX2NwdSgmY3VycC0+cF9oZHItPmVoX2VudHJpZXMsIDEpOwogCi0JaWYgKHVubGlrZWx5KGxlMTZfdG9fY3B1KGN1cnAtPnBfaGRyLT5laF9lbnRyaWVzKQotCQkJICAgICA+IGxlMTZfdG9fY3B1KGN1cnAtPnBfaGRyLT5laF9tYXgpKSkgewotCQlFWFQ0X0VSUk9SX0lOT0RFKGlub2RlLAotCQkJCSAibG9naWNhbCAlZCA9PSBlaV9ibG9jayAlZCEiLAotCQkJCSBsb2dpY2FsLCBsZTMyX3RvX2NwdShjdXJwLT5wX2lkeC0+ZWlfYmxvY2spKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQogCWlmICh1bmxpa2VseShpeCA+IEVYVF9MQVNUX0lOREVYKGN1cnAtPnBfaGRyKSkpIHsKIAkJRVhUNF9FUlJPUl9JTk9ERShpbm9kZSwgIml4ID4gRVhUX0xBU1RfSU5ERVghIik7CiAJCXJldHVybiAtRUlPOwpAQCAtMTQ0Niw4ICsxNDE0LDcgQEAKICAqIGV4dDRfZXh0X25leHRfbGVhZl9ibG9jazoKICAqIHJldHVybnMgZmlyc3QgYWxsb2NhdGVkIGJsb2NrIGZyb20gbmV4dCBsZWFmIG9yIEVYVF9NQVhfQkxPQ0tTCiAgKi8KLXN0YXRpYyBleHQ0X2xibGtfdCBleHQ0X2V4dF9uZXh0X2xlYWZfYmxvY2soc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkJc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgpCitzdGF0aWMgZXh0NF9sYmxrX3QgZXh0NF9leHRfbmV4dF9sZWFmX2Jsb2NrKHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKQogewogCWludCBkZXB0aDsKIApAQCAtMTc1Nyw3ICsxNzI0LDYgQEAKIAkJZ290byBtZXJnZTsKIAl9CiAKLXJlcGVhdDoKIAlkZXB0aCA9IGV4dF9kZXB0aChpbm9kZSk7CiAJZWggPSBwYXRoW2RlcHRoXS5wX2hkcjsKIAlpZiAobGUxNl90b19jcHUoZWgtPmVoX2VudHJpZXMpIDwgbGUxNl90b19jcHUoZWgtPmVoX21heCkpCkBAIC0xNzY1LDkgKzE3MzEsMTAgQEAKIAogCS8qIHByb2JhYmx5IG5leHQgbGVhZiBoYXMgc3BhY2UgZm9yIHVzPyAqLwogCWZleCA9IEVYVF9MQVNUX0VYVEVOVChlaCk7Ci0JbmV4dCA9IGV4dDRfZXh0X25leHRfbGVhZl9ibG9jayhpbm9kZSwgcGF0aCk7Ci0JaWYgKGxlMzJfdG9fY3B1KG5ld2V4dC0+ZWVfYmxvY2spID4gbGUzMl90b19jcHUoZmV4LT5lZV9ibG9jaykKLQkgICAgJiYgbmV4dCAhPSBFWFRfTUFYX0JMT0NLUykgeworCW5leHQgPSBFWFRfTUFYX0JMT0NLUzsKKwlpZiAobGUzMl90b19jcHUobmV3ZXh0LT5lZV9ibG9jaykgPiBsZTMyX3RvX2NwdShmZXgtPmVlX2Jsb2NrKSkKKwkJbmV4dCA9IGV4dDRfZXh0X25leHRfbGVhZl9ibG9jayhwYXRoKTsKKwlpZiAobmV4dCAhPSBFWFRfTUFYX0JMT0NLUykgewogCQlleHRfZGVidWcoIm5leHQgbGVhZiBibG9jayAtICVkXG4iLCBuZXh0KTsKIAkJQlVHX09OKG5wYXRoICE9IE5VTEwpOwogCQlucGF0aCA9IGV4dDRfZXh0X2ZpbmRfZXh0ZW50KGlub2RlLCBuZXh0LCBOVUxMKTsKQEAgLTE3NzksNyArMTc0Niw3IEBACiAJCQlleHRfZGVidWcoIm5leHQgbGVhZiBpc24ndCBmdWxsKCVkKVxuIiwKIAkJCQkgIGxlMTZfdG9fY3B1KGVoLT5laF9lbnRyaWVzKSk7CiAJCQlwYXRoID0gbnBhdGg7Ci0JCQlnb3RvIHJlcGVhdDsKKwkJCWdvdG8gaGFzX3NwYWNlOwogCQl9CiAJCWV4dF9kZWJ1ZygibmV4dCBsZWFmIGhhcyBubyBmcmVlIHNwYWNlKCVkLCVkKVxuIiwKIAkJCSAgbGUxNl90b19jcHUoZWgtPmVoX2VudHJpZXMpLCBsZTE2X3RvX2NwdShlaC0+ZWhfbWF4KSk7CkBAIC0xODM5LDcgKzE4MDYsNyBAQAogCQkJCWV4dDRfZXh0X3BibG9jayhuZXdleHQpLAogCQkJCWV4dDRfZXh0X2lzX3VuaW5pdGlhbGl6ZWQobmV3ZXh0KSwKIAkJCQlleHQ0X2V4dF9nZXRfYWN0dWFsX2xlbihuZXdleHQpLAotCQkJCW5lYXJleCwgbGVuLCBuZWFyZXggKyAxLCBuZWFyZXggKyAyKTsKKwkJCQluZWFyZXgsIGxlbiwgbmVhcmV4LCBuZWFyZXggKyAxKTsKIAkJbWVtbW92ZShuZWFyZXggKyAxLCBuZWFyZXgsIGxlbik7CiAJCXBhdGhbZGVwdGhdLnBfZXh0ID0gbmVhcmV4OwogCX0KQEAgLTIwNTIsNyArMjAxOSw3IEBACiB9CiAKIC8qCi0gKiBleHQ0X2V4dF9pbl9jYWNoZSgpCisgKiBleHQ0X2V4dF9jaGVja19jYWNoZSgpCiAgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBnaXZlbiBibG9jayBpcyBpbiB0aGUgY2FjaGUuCiAgKiBJZiBpdCBpcywgdGhlIGNhY2hlZCBleHRlbnQgaXMgc3RvcmVkIGluIHRoZSBnaXZlbgogICogY2FjaGUgZXh0ZW50IHBvaW50ZXIuICBJZiB0aGUgY2FjaGVkIGV4dGVudCBpcyBhIGhvbGUsCkBAIC0yMTM0LDggKzIxMDEsNiBAQAogLyoKICAqIGV4dDRfZXh0X3JtX2lkeDoKICAqIHJlbW92ZXMgaW5kZXggZnJvbSB0aGUgaW5kZXggYmxvY2suCi0gKiBJdCdzIHVzZWQgaW4gdHJ1bmNhdGUgY2FzZSBvbmx5LCB0aHVzIGFsbCByZXF1ZXN0cyBhcmUgZm9yCi0gKiBsYXN0IGluZGV4IGluIHRoZSBibG9jayBvbmx5LgogICovCiBzdGF0aWMgaW50IGV4dDRfZXh0X3JtX2lkeChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJc3RydWN0IGV4dDRfZXh0X3BhdGggKnBhdGgpCkBAIC0yMTUzLDYgKzIxMTgsMTMgQEAKIAllcnIgPSBleHQ0X2V4dF9nZXRfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHBhdGgpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CisKKwlpZiAocGF0aC0+cF9pZHggIT0gRVhUX0xBU1RfSU5ERVgocGF0aC0+cF9oZHIpKSB7CisJCWludCBsZW4gPSBFWFRfTEFTVF9JTkRFWChwYXRoLT5wX2hkcikgLSBwYXRoLT5wX2lkeDsKKwkJbGVuICo9IHNpemVvZihzdHJ1Y3QgZXh0NF9leHRlbnRfaWR4KTsKKwkJbWVtbW92ZShwYXRoLT5wX2lkeCwgcGF0aC0+cF9pZHggKyAxLCBsZW4pOworCX0KKwogCWxlMTZfYWRkX2NwdSgmcGF0aC0+cF9oZHItPmVoX2VudHJpZXMsIC0xKTsKIAllcnIgPSBleHQ0X2V4dF9kaXJ0eShoYW5kbGUsIGlub2RlLCBwYXRoKTsKIAlpZiAoZXJyKQpAQCAtMjUzNCw4ICsyNTA2LDcgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIGludCBleHQ0X2V4dF9yZW1vdmVfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3Qgc3RhcnQsCi0JCQkJZXh0NF9sYmxrX3QgZW5kKQorc3RhdGljIGludCBleHQ0X2V4dF9yZW1vdmVfc3BhY2Uoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3Qgc3RhcnQpCiB7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOwogCWludCBkZXB0aCA9IGV4dF9kZXB0aChpbm9kZSk7CkBAIC0yNTc1LDcgKzI1NDYsNyBAQAogCQlpZiAoaSA9PSBkZXB0aCkgewogCQkJLyogdGhpcyBpcyBsZWFmIGJsb2NrICovCiAJCQllcnIgPSBleHQ0X2V4dF9ybV9sZWFmKGhhbmRsZSwgaW5vZGUsIHBhdGgsCi0JCQkJCXN0YXJ0LCBlbmQpOworCQkJCQlzdGFydCwgRVhUX01BWF9CTE9DS1MgLSAxKTsKIAkJCS8qIHJvb3QgbGV2ZWwgaGFzIHBfYmggPT0gTlVMTCwgYnJlbHNlKCkgZWF0cyB0aGlzICovCiAJCQlicmVsc2UocGF0aFtpXS5wX2JoKTsKIAkJCXBhdGhbaV0ucF9iaCA9IE5VTEw7CkBAIC0zMTA3LDEyICszMDc4LDEwIEBACiAJCQkJCSAgICAgIHN0cnVjdCBleHQ0X2V4dF9wYXRoICpwYXRoKQogewogCXN0cnVjdCBleHQ0X2V4dGVudCAqZXg7Ci0Jc3RydWN0IGV4dDRfZXh0ZW50X2hlYWRlciAqZWg7CiAJaW50IGRlcHRoOwogCWludCBlcnIgPSAwOwogCiAJZGVwdGggPSBleHRfZGVwdGgoaW5vZGUpOwotCWVoID0gcGF0aFtkZXB0aF0ucF9oZHI7CiAJZXggPSBwYXRoW2RlcHRoXS5wX2V4dDsKIAogCWV4dF9kZWJ1ZygiZXh0NF9jb252ZXJ0X3Vud3JpdHRlbl9leHRlbnRzX2VuZGlvOiBpbm9kZSAlbHUsIGxvZ2ljYWwiCkBAIC0zMzU3LDggKzMzMjYsOCBAQAogCXRyYWNlX2V4dDRfZXh0X21hcF9ibG9ja3NfZW50ZXIoaW5vZGUsIG1hcC0+bV9sYmxrLCBtYXAtPm1fbGVuLCBmbGFncyk7CiAKIAkvKiBjaGVjayBpbiBjYWNoZSAqLwotCWlmIChleHQ0X2V4dF9pbl9jYWNoZShpbm9kZSwgbWFwLT5tX2xibGssICZuZXdleCkgJiYKLQkJKChmbGFncyAmIEVYVDRfR0VUX0JMT0NLU19QVU5DSF9PVVRfRVhUKSA9PSAwKSkgeworCWlmICghKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX1BVTkNIX09VVF9FWFQpICYmCisJCWV4dDRfZXh0X2luX2NhY2hlKGlub2RlLCBtYXAtPm1fbGJsaywgJm5ld2V4KSkgewogCQlpZiAoIW5ld2V4LmVlX3N0YXJ0X2xvICYmICFuZXdleC5lZV9zdGFydF9oaSkgewogCQkJaWYgKChmbGFncyAmIEVYVDRfR0VUX0JMT0NLU19DUkVBVEUpID09IDApIHsKIAkJCQkvKgpAQCAtMzQ5Nyw4ICszNDY2LDI3IEBACiAKIAkJCWV4dDRfZXh0X21hcmtfdW5pbml0aWFsaXplZChleCk7CiAKLQkJCWVyciA9IGV4dDRfZXh0X3JlbW92ZV9zcGFjZShpbm9kZSwgbWFwLT5tX2xibGssCi0JCQkJbWFwLT5tX2xibGsgKyBwdW5jaGVkX291dCk7CisJCQlleHQ0X2V4dF9pbnZhbGlkYXRlX2NhY2hlKGlub2RlKTsKKworCQkJZXJyID0gZXh0NF9leHRfcm1fbGVhZihoYW5kbGUsIGlub2RlLCBwYXRoLAorCQkJCW1hcC0+bV9sYmxrLCBtYXAtPm1fbGJsayArIHB1bmNoZWRfb3V0KTsKKworCQkJaWYgKCFlcnIgJiYgcGF0aC0+cF9oZHItPmVoX2VudHJpZXMgPT0gMCkgeworCQkJCS8qCisJCQkJICogUHVuY2ggaG9sZSBmcmVlZCBhbGwgb2YgdGhpcyBzdWIgdHJlZSwKKwkJCQkgKiBzbyB3ZSBuZWVkIHRvIGNvcnJlY3QgZWhfZGVwdGgKKwkJCQkgKi8KKwkJCQllcnIgPSBleHQ0X2V4dF9nZXRfYWNjZXNzKGhhbmRsZSwgaW5vZGUsIHBhdGgpOworCQkJCWlmIChlcnIgPT0gMCkgeworCQkJCQlleHRfaW5vZGVfaGRyKGlub2RlKS0+ZWhfZGVwdGggPSAwOworCQkJCQlleHRfaW5vZGVfaGRyKGlub2RlKS0+ZWhfbWF4ID0KKwkJCQkJY3B1X3RvX2xlMTYoZXh0NF9leHRfc3BhY2Vfcm9vdCgKKwkJCQkJCWlub2RlLCAwKSk7CisKKwkJCQkJZXJyID0gZXh0NF9leHRfZGlydHkoCisJCQkJCQloYW5kbGUsIGlub2RlLCBwYXRoKTsKKwkJCQl9CisJCQl9CiAKIAkJCWdvdG8gb3V0MjsKIAkJfQpAQCAtMzU5NiwxNyArMzU4NCwxOCBAQAogCX0KIAogCWVyciA9IGNoZWNrX2VvZmJsb2Nrc19mbChoYW5kbGUsIGlub2RlLCBtYXAtPm1fbGJsaywgcGF0aCwgYXIubGVuKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDI7Ci0KLQllcnIgPSBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsICZuZXdleCwgZmxhZ3MpOworCWlmICghZXJyKQorCQllcnIgPSBleHQ0X2V4dF9pbnNlcnRfZXh0ZW50KGhhbmRsZSwgaW5vZGUsIHBhdGgsCisJCQkJCSAgICAgJm5ld2V4LCBmbGFncyk7CiAJaWYgKGVycikgeworCQlpbnQgZmJfZmxhZ3MgPSBmbGFncyAmIEVYVDRfR0VUX0JMT0NLU19ERUxBTExPQ19SRVNFUlZFID8KKwkJCUVYVDRfRlJFRV9CTE9DS1NfTk9fUVVPVF9VUERBVEUgOiAwOwogCQkvKiBmcmVlIGRhdGEgYmxvY2tzIHdlIGp1c3QgYWxsb2NhdGVkICovCiAJCS8qIG5vdCBhIGdvb2QgaWRlYSB0byBjYWxsIGRpc2NhcmQgaGVyZSBkaXJlY3RseSwKIAkJICogYnV0IG90aGVyd2lzZSB3ZSdkIG5lZWQgdG8gY2FsbCBpdCBldmVyeSBmcmVlKCkgKi8KIAkJZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTsKIAkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBOVUxMLCBleHQ0X2V4dF9wYmxvY2soJm5ld2V4KSwKLQkJCQkgZXh0NF9leHRfZ2V0X2FjdHVhbF9sZW4oJm5ld2V4KSwgMCk7CisJCQkJIGV4dDRfZXh0X2dldF9hY3R1YWxfbGVuKCZuZXdleCksIGZiX2ZsYWdzKTsKIAkJZ290byBvdXQyOwogCX0KIApAQCAtMzY5OSw3ICszNjg4LDcgQEAKIAogCWxhc3RfYmxvY2sgPSAoaW5vZGUtPmlfc2l6ZSArIHNiLT5zX2Jsb2Nrc2l6ZSAtIDEpCiAJCQk+PiBFWFQ0X0JMT0NLX1NJWkVfQklUUyhzYik7Ci0JZXJyID0gZXh0NF9leHRfcmVtb3ZlX3NwYWNlKGlub2RlLCBsYXN0X2Jsb2NrLCBFWFRfTUFYX0JMT0NLUyAtIDEpOworCWVyciA9IGV4dDRfZXh0X3JlbW92ZV9zcGFjZShpbm9kZSwgbGFzdF9ibG9jayk7CiAKIAkvKiBJbiBhIG11bHRpLXRyYW5zYWN0aW9uIHRydW5jYXRlLCB3ZSBvbmx5IG1ha2UgdGhlIGZpbmFsCiAJICogdHJhbnNhY3Rpb24gc3luY2hyb25vdXMuCkBAIC0zODM1LDcgKzM4MjQsNyBAQAogCQkJCQkJYmxrYml0cykgPj4gYmxrYml0cykpCiAJCQluZXdfc2l6ZSA9IG9mZnNldCArIGxlbjsKIAkJZWxzZQotCQkJbmV3X3NpemUgPSAobWFwLm1fbGJsayArIHJldCkgPDwgYmxrYml0czsKKwkJCW5ld19zaXplID0gKChsb2ZmX3QpIG1hcC5tX2xibGsgKyByZXQpIDw8IGJsa2JpdHM7CiAKIAkJZXh0NF9mYWxsb2NfdXBkYXRlX2lub2RlKGlub2RlLCBtb2RlLCBuZXdfc2l6ZSwKIAkJCQkJIChtYXAubV9mbGFncyAmIEVYVDRfTUFQX05FVykpOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9mc3luYy5jIGIvZnMvZXh0NC9mc3luYy5jCmluZGV4IGRhM2JlZDMuLjAzNmY3OGYgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvZnN5bmMuYworKysgYi9mcy9leHQ0L2ZzeW5jLmMKQEAgLTEyOSwxNSArMTI5LDMwIEBACiB7CiAJc3RydWN0IHdyaXRlYmFja19jb250cm9sIHdiYzsKIAlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBOVUxMOworCXN0cnVjdCBpbm9kZSAqbmV4dDsKIAlpbnQgcmV0ID0gMDsKIAotCXdoaWxlIChpbm9kZSAmJiBleHQ0X3Rlc3RfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTkVXRU5UUlkpKSB7CisJaWYgKCFleHQ0X3Rlc3RfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfTkVXRU5UUlkpKQorCQlyZXR1cm4gMDsKKwlpbm9kZSA9IGlncmFiKGlub2RlKTsKKwl3aGlsZSAoZXh0NF90ZXN0X2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX05FV0VOVFJZKSkgewogCQlleHQ0X2NsZWFyX2lub2RlX3N0YXRlKGlub2RlLCBFWFQ0X1NUQVRFX05FV0VOVFJZKTsKLQkJZGVudHJ5ID0gbGlzdF9lbnRyeShpbm9kZS0+aV9kZW50cnkubmV4dCwKLQkJCQkgICAgc3RydWN0IGRlbnRyeSwgZF9hbGlhcyk7Ci0JCWlmICghZGVudHJ5IHx8ICFkZW50cnktPmRfcGFyZW50IHx8ICFkZW50cnktPmRfcGFyZW50LT5kX2lub2RlKQorCQlkZW50cnkgPSBOVUxMOworCQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCQlpZiAoIWxpc3RfZW1wdHkoJmlub2RlLT5pX2RlbnRyeSkpIHsKKwkJCWRlbnRyeSA9IGxpc3RfZmlyc3RfZW50cnkoJmlub2RlLT5pX2RlbnRyeSwKKwkJCQkJCSAgc3RydWN0IGRlbnRyeSwgZF9hbGlhcyk7CisJCQlkZ2V0KGRlbnRyeSk7CisJCX0KKwkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQlpZiAoIWRlbnRyeSkKIAkJCWJyZWFrOwotCQlpbm9kZSA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGU7CisJCW5leHQgPSBpZ3JhYihkZW50cnktPmRfcGFyZW50LT5kX2lub2RlKTsKKwkJZHB1dChkZW50cnkpOworCQlpZiAoIW5leHQpCisJCQlicmVhazsKKwkJaXB1dChpbm9kZSk7CisJCWlub2RlID0gbmV4dDsKIAkJcmV0ID0gc3luY19tYXBwaW5nX2J1ZmZlcnMoaW5vZGUtPmlfbWFwcGluZyk7CiAJCWlmIChyZXQpCiAJCQlicmVhazsKQEAgLTE0OCw2ICsxNjMsNyBAQAogCQlpZiAocmV0KQogCQkJYnJlYWs7CiAJfQorCWlwdXQoaW5vZGUpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvaWFsbG9jLmMgYi9mcy9leHQ0L2lhbGxvYy5jCmluZGV4IDIxYmIyZjYuLjljNjNmMjcgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaWFsbG9jLmMKKysrIGIvZnMvZXh0NC9pYWxsb2MuYwpAQCAtMTI4Nyw3ICsxMjg3LDcgQEAKIAkJCSAgIGdyb3VwLCB1c2VkX2Jsa3MsCiAJCQkgICBleHQ0X2l0YWJsZV91bnVzZWRfY291bnQoc2IsIGdkcCkpOwogCQlyZXQgPSAxOwotCQlnb3RvIG91dDsKKwkJZ290byBlcnJfb3V0OwogCX0KIAogCWJsayA9IGV4dDRfaW5vZGVfdGFibGUoc2IsIGdkcCkgKyB1c2VkX2Jsa3M7CmRpZmYgLS1naXQgYS9mcy9leHQ0L2luZGlyZWN0LmMgYi9mcy9leHQ0L2luZGlyZWN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg2MDJjZAotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDQvaW5kaXJlY3QuYwpAQCAtMCwwICsxLDE0ODIgQEAKKy8qCisgKiAgbGludXgvZnMvZXh0NC9pbmRpcmVjdC5jCisgKgorICogIGZyb20KKyAqCisgKiAgbGludXgvZnMvZXh0NC9pbm9kZS5jCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1CisgKiBSZW15IENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpCisgKiBMYWJvcmF0b2lyZSBNQVNJIC0gSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqICBmcm9tCisgKgorICogIGxpbnV4L2ZzL21pbml4L2lub2RlLmMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcworICoKKyAqICBHb2FsLWRpcmVjdGVkIGJsb2NrIGFsbG9jYXRpb24gYnkgU3RlcGhlbiBUd2VlZGllCisgKgkoc2N0QHJlZGhhdC5jb20pLCAxOTkzLCAxOTk4CisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgImV4dDRfamJkMi5oIgorI2luY2x1ZGUgInRydW5jYXRlLmgiCisKKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvZXh0NC5oPgorCit0eXBlZGVmIHN0cnVjdCB7CisJX19sZTMyCSpwOworCV9fbGUzMglrZXk7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKK30gSW5kaXJlY3Q7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGRfY2hhaW4oSW5kaXJlY3QgKnAsIHN0cnVjdCBidWZmZXJfaGVhZCAqYmgsIF9fbGUzMiAqdikKK3sKKwlwLT5rZXkgPSAqKHAtPnAgPSB2KTsKKwlwLT5iaCA9IGJoOworfQorCisvKioKKyAqCWV4dDRfYmxvY2tfdG9fcGF0aCAtIHBhcnNlIHRoZSBibG9jayBudW1iZXIgaW50byBhcnJheSBvZiBvZmZzZXRzCisgKglAaW5vZGU6IGlub2RlIGluIHF1ZXN0aW9uICh3ZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGl0cyBzdXBlcmJsb2NrKQorICoJQGlfYmxvY2s6IGJsb2NrIG51bWJlciB0byBiZSBwYXJzZWQKKyAqCUBvZmZzZXRzOiBhcnJheSB0byBzdG9yZSB0aGUgb2Zmc2V0cyBpbgorICoJQGJvdW5kYXJ5OiBzZXQgdGhpcyBub24temVybyBpZiB0aGUgcmVmZXJyZWQtdG8gYmxvY2sgaXMgbGlrZWx5IHRvIGJlCisgKgkgICAgICAgZm9sbG93ZWQgKG9uIGRpc2spIGJ5IGFuIGluZGlyZWN0IGJsb2NrLgorICoKKyAqCVRvIHN0b3JlIHRoZSBsb2NhdGlvbnMgb2YgZmlsZSdzIGRhdGEgZXh0NCB1c2VzIGEgZGF0YSBzdHJ1Y3R1cmUgY29tbW9uCisgKglmb3IgVU5JWCBmaWxlc3lzdGVtcyAtIHRyZWUgb2YgcG9pbnRlcnMgYW5jaG9yZWQgaW4gdGhlIGlub2RlLCB3aXRoCisgKglkYXRhIGJsb2NrcyBhdCBsZWF2ZXMgYW5kIGluZGlyZWN0IGJsb2NrcyBpbiBpbnRlcm1lZGlhdGUgbm9kZXMuCisgKglUaGlzIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgdGhlIGJsb2NrIG51bWJlciBpbnRvIHBhdGggaW4gdGhhdCB0cmVlIC0KKyAqCXJldHVybiB2YWx1ZSBpcyB0aGUgcGF0aCBsZW5ndGggYW5kIEBvZmZzZXRzW25dIGlzIHRoZSBvZmZzZXQgb2YKKyAqCXBvaW50ZXIgdG8gKG4rMSl0aCBub2RlIGluIHRoZSBudGggb25lLiBJZiBAYmxvY2sgaXMgb3V0IG9mIHJhbmdlCisgKgkobmVnYXRpdmUgb3IgdG9vIGxhcmdlKSB3YXJuaW5nIGlzIHByaW50ZWQgYW5kIHplcm8gcmV0dXJuZWQuCisgKgorICoJTm90ZTogZnVuY3Rpb24gZG9lc24ndCBmaW5kIG5vZGUgYWRkcmVzc2VzLCBzbyBubyBJTyBpcyBuZWVkZWQuIEFsbAorICoJd2UgbmVlZCB0byBrbm93IGlzIHRoZSBjYXBhY2l0eSBvZiBpbmRpcmVjdCBibG9ja3MgKHRha2VuIGZyb20gdGhlCisgKglpbm9kZS0+aV9zYikuCisgKi8KKworLyoKKyAqIFBvcnRhYmlsaXR5IG5vdGU6IHRoZSBsYXN0IGNvbXBhcmlzb24gKGNoZWNrIHRoYXQgd2UgZml0IGludG8gdHJpcGxlCisgKiBpbmRpcmVjdCBibG9jaykgaXMgc3BlbGxlZCBkaWZmZXJlbnRseSwgYmVjYXVzZSBvdGhlcndpc2Ugb24gYW4KKyAqIGFyY2hpdGVjdHVyZSB3aXRoIDMyLWJpdCBsb25ncyBhbmQgOEtiIHBhZ2VzIHdlIG1pZ2h0IGdldCBpbnRvIHRyb3VibGUKKyAqIGlmIG91ciBmaWxlc3lzdGVtIGhhZCA4S2IgYmxvY2tzLiBXZSBtaWdodCB1c2UgbG9uZyBsb25nLCBidXQgdGhhdCB3b3VsZAorICoga2lsbCB1cyBvbiB4ODYuIE9oLCB3ZWxsLCBhdCBsZWFzdCB0aGUgc2lnbiBwcm9wYWdhdGlvbiBkb2VzIG5vdCBtYXR0ZXIgLQorICogaV9ibG9jayB3b3VsZCBoYXZlIHRvIGJlIG5lZ2F0aXZlIGluIHRoZSB2ZXJ5IGJlZ2lubmluZywgc28gd2Ugd291bGQgbm90CisgKiBnZXQgdGhlcmUgYXQgYWxsLgorICovCisKK3N0YXRpYyBpbnQgZXh0NF9ibG9ja190b19wYXRoKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICAgICBleHQ0X2xibGtfdCBpX2Jsb2NrLAorCQkJICAgICAgZXh0NF9sYmxrX3Qgb2Zmc2V0c1s0XSwgaW50ICpib3VuZGFyeSkKK3sKKwlpbnQgcHRycyA9IEVYVDRfQUREUl9QRVJfQkxPQ0soaW5vZGUtPmlfc2IpOworCWludCBwdHJzX2JpdHMgPSBFWFQ0X0FERFJfUEVSX0JMT0NLX0JJVFMoaW5vZGUtPmlfc2IpOworCWNvbnN0IGxvbmcgZGlyZWN0X2Jsb2NrcyA9IEVYVDRfTkRJUl9CTE9DS1MsCisJCWluZGlyZWN0X2Jsb2NrcyA9IHB0cnMsCisJCWRvdWJsZV9ibG9ja3MgPSAoMSA8PCAocHRyc19iaXRzICogMikpOworCWludCBuID0gMDsKKwlpbnQgZmluYWwgPSAwOworCisJaWYgKGlfYmxvY2sgPCBkaXJlY3RfYmxvY2tzKSB7CisJCW9mZnNldHNbbisrXSA9IGlfYmxvY2s7CisJCWZpbmFsID0gZGlyZWN0X2Jsb2NrczsKKwl9IGVsc2UgaWYgKChpX2Jsb2NrIC09IGRpcmVjdF9ibG9ja3MpIDwgaW5kaXJlY3RfYmxvY2tzKSB7CisJCW9mZnNldHNbbisrXSA9IEVYVDRfSU5EX0JMT0NLOworCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrOworCQlmaW5hbCA9IHB0cnM7CisJfSBlbHNlIGlmICgoaV9ibG9jayAtPSBpbmRpcmVjdF9ibG9ja3MpIDwgZG91YmxlX2Jsb2NrcykgeworCQlvZmZzZXRzW24rK10gPSBFWFQ0X0RJTkRfQkxPQ0s7CisJCW9mZnNldHNbbisrXSA9IGlfYmxvY2sgPj4gcHRyc19iaXRzOworCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrICYgKHB0cnMgLSAxKTsKKwkJZmluYWwgPSBwdHJzOworCX0gZWxzZSBpZiAoKChpX2Jsb2NrIC09IGRvdWJsZV9ibG9ja3MpID4+IChwdHJzX2JpdHMgKiAyKSkgPCBwdHJzKSB7CisJCW9mZnNldHNbbisrXSA9IEVYVDRfVElORF9CTE9DSzsKKwkJb2Zmc2V0c1tuKytdID0gaV9ibG9jayA+PiAocHRyc19iaXRzICogMik7CisJCW9mZnNldHNbbisrXSA9IChpX2Jsb2NrID4+IHB0cnNfYml0cykgJiAocHRycyAtIDEpOworCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrICYgKHB0cnMgLSAxKTsKKwkJZmluYWwgPSBwdHJzOworCX0gZWxzZSB7CisJCWV4dDRfd2FybmluZyhpbm9kZS0+aV9zYiwgImJsb2NrICVsdSA+IG1heCBpbiBpbm9kZSAlbHUiLAorCQkJICAgICBpX2Jsb2NrICsgZGlyZWN0X2Jsb2NrcyArCisJCQkgICAgIGluZGlyZWN0X2Jsb2NrcyArIGRvdWJsZV9ibG9ja3MsIGlub2RlLT5pX2lubyk7CisJfQorCWlmIChib3VuZGFyeSkKKwkJKmJvdW5kYXJ5ID0gZmluYWwgLSAxIC0gKGlfYmxvY2sgJiAocHRycyAtIDEpKTsKKwlyZXR1cm4gbjsKK30KKworLyoqCisgKglleHQ0X2dldF9icmFuY2ggLSByZWFkIHRoZSBjaGFpbiBvZiBpbmRpcmVjdCBibG9ja3MgbGVhZGluZyB0byBkYXRhCisgKglAaW5vZGU6IGlub2RlIGluIHF1ZXN0aW9uCisgKglAZGVwdGg6IGRlcHRoIG9mIHRoZSBjaGFpbiAoMSAtIGRpcmVjdCBwb2ludGVyLCBldGMuKQorICoJQG9mZnNldHM6IG9mZnNldHMgb2YgcG9pbnRlcnMgaW4gaW5vZGUvaW5kaXJlY3QgYmxvY2tzCisgKglAY2hhaW46IHBsYWNlIHRvIHN0b3JlIHRoZSByZXN1bHQKKyAqCUBlcnI6IGhlcmUgd2Ugc3RvcmUgdGhlIGVycm9yIHZhbHVlCisgKgorICoJRnVuY3Rpb24gZmlsbHMgdGhlIGFycmF5IG9mIHRyaXBsZXMgPGtleSwgcCwgYmg+IGFuZCByZXR1cm5zICVOVUxMCisgKglpZiBldmVyeXRoaW5nIHdlbnQgT0sgb3IgdGhlIHBvaW50ZXIgdG8gdGhlIGxhc3QgZmlsbGVkIHRyaXBsZQorICoJKGluY29tcGxldGUgb25lKSBvdGhlcndpc2UuIFVwb24gdGhlIHJldHVybiBjaGFpbltpXS5rZXkgY29udGFpbnMKKyAqCXRoZSBudW1iZXIgb2YgKGkrMSktdGggYmxvY2sgaW4gdGhlIGNoYWluIChhcyBpdCBpcyBzdG9yZWQgaW4gbWVtb3J5LAorICoJaS5lLiBsaXR0bGUtZW5kaWFuIDMyLWJpdCksIGNoYWluW2ldLnAgY29udGFpbnMgdGhlIGFkZHJlc3Mgb2YgdGhhdAorICoJbnVtYmVyIChpdCBwb2ludHMgaW50byBzdHJ1Y3QgaW5vZGUgZm9yIGk9PTAgYW5kIGludG8gdGhlIGJoLT5iX2RhdGEKKyAqCWZvciBpPjApIGFuZCBjaGFpbltpXS5iaCBwb2ludHMgdG8gdGhlIGJ1ZmZlcl9oZWFkIG9mIGktdGggaW5kaXJlY3QKKyAqCWJsb2NrIGZvciBpPjAgYW5kIE5VTEwgZm9yIGk9PTAuIEluIG90aGVyIHdvcmRzLCBpdCBob2xkcyB0aGUgYmxvY2sKKyAqCW51bWJlcnMgb2YgdGhlIGNoYWluLCBhZGRyZXNzZXMgdGhleSB3ZXJlIHRha2VuIGZyb20gKGFuZCB3aGVyZSB3ZSBjYW4KKyAqCXZlcmlmeSB0aGF0IGNoYWluIGRpZCBub3QgY2hhbmdlKSBhbmQgYnVmZmVyX2hlYWRzIGhvc3RpbmcgdGhlc2UKKyAqCW51bWJlcnMuCisgKgorICoJRnVuY3Rpb24gc3RvcHMgd2hlbiBpdCBzdHVtYmxlcyB1cG9uIHplcm8gcG9pbnRlciAoYWJzZW50IGJsb2NrKQorICoJCShwb2ludGVyIHRvIGxhc3QgdHJpcGxlIHJldHVybmVkLCAqQGVyciA9PSAwKQorICoJb3Igd2hlbiBpdCBnZXRzIGFuIElPIGVycm9yIHJlYWRpbmcgYW4gaW5kaXJlY3QgYmxvY2sKKyAqCQkoZGl0dG8sICpAZXJyID09IC1FSU8pCisgKglvciB3aGVuIGl0IHJlYWRzIGFsbCBAZGVwdGgtMSBpbmRpcmVjdCBibG9ja3Mgc3VjY2Vzc2Z1bGx5IGFuZCBmaW5kcworICoJdGhlIHdob2xlIGNoYWluLCBhbGwgd2F5IHRvIHRoZSBkYXRhIChyZXR1cm5zICVOVUxMLCAqZXJyID09IDApLgorICoKKyAqICAgICAgTmVlZCB0byBiZSBjYWxsZWQgd2l0aAorICogICAgICBkb3duX3JlYWQoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pCisgKi8KK3N0YXRpYyBJbmRpcmVjdCAqZXh0NF9nZXRfYnJhbmNoKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBkZXB0aCwKKwkJCQkgZXh0NF9sYmxrX3QgICpvZmZzZXRzLAorCQkJCSBJbmRpcmVjdCBjaGFpbls0XSwgaW50ICplcnIpCit7CisJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOworCUluZGlyZWN0ICpwID0gY2hhaW47CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKworCSplcnIgPSAwOworCS8qIGlfZGF0YSBpcyBub3QgZ29pbmcgYXdheSwgbm8gbG9jayBuZWVkZWQgKi8KKwlhZGRfY2hhaW4oY2hhaW4sIE5VTEwsIEVYVDRfSShpbm9kZSktPmlfZGF0YSArICpvZmZzZXRzKTsKKwlpZiAoIXAtPmtleSkKKwkJZ290byBub19ibG9jazsKKwl3aGlsZSAoLS1kZXB0aCkgeworCQliaCA9IHNiX2dldGJsayhzYiwgbGUzMl90b19jcHUocC0+a2V5KSk7CisJCWlmICh1bmxpa2VseSghYmgpKQorCQkJZ290byBmYWlsdXJlOworCisJCWlmICghYmhfdXB0b2RhdGVfb3JfbG9jayhiaCkpIHsKKwkJCWlmIChiaF9zdWJtaXRfcmVhZChiaCkgPCAwKSB7CisJCQkJcHV0X2JoKGJoKTsKKwkJCQlnb3RvIGZhaWx1cmU7CisJCQl9CisJCQkvKiB2YWxpZGF0ZSBibG9jayByZWZlcmVuY2VzICovCisJCQlpZiAoZXh0NF9jaGVja19pbmRpcmVjdF9ibG9ja3JlZihpbm9kZSwgYmgpKSB7CisJCQkJcHV0X2JoKGJoKTsKKwkJCQlnb3RvIGZhaWx1cmU7CisJCQl9CisJCX0KKworCQlhZGRfY2hhaW4oKytwLCBiaCwgKF9fbGUzMiAqKWJoLT5iX2RhdGEgKyAqKytvZmZzZXRzKTsKKwkJLyogUmVhZGVyOiBlbmQgKi8KKwkJaWYgKCFwLT5rZXkpCisJCQlnb3RvIG5vX2Jsb2NrOworCX0KKwlyZXR1cm4gTlVMTDsKKworZmFpbHVyZToKKwkqZXJyID0gLUVJTzsKK25vX2Jsb2NrOgorCXJldHVybiBwOworfQorCisvKioKKyAqCWV4dDRfZmluZF9uZWFyIC0gZmluZCBhIHBsYWNlIGZvciBhbGxvY2F0aW9uIHdpdGggc3VmZmljaWVudCBsb2NhbGl0eQorICoJQGlub2RlOiBvd25lcgorICoJQGluZDogZGVzY3JpcHRvciBvZiBpbmRpcmVjdCBibG9jay4KKyAqCisgKglUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHByZWZlcnJlZCBwbGFjZSBmb3IgYmxvY2sgYWxsb2NhdGlvbi4KKyAqCUl0IGlzIHVzZWQgd2hlbiBoZXVyaXN0aWMgZm9yIHNlcXVlbnRpYWwgYWxsb2NhdGlvbiBmYWlscy4KKyAqCVJ1bGVzIGFyZToKKyAqCSAgKyBpZiB0aGVyZSBpcyBhIGJsb2NrIHRvIHRoZSBsZWZ0IG9mIG91ciBwb3NpdGlvbiAtIGFsbG9jYXRlIG5lYXIgaXQuCisgKgkgICsgaWYgcG9pbnRlciB3aWxsIGxpdmUgaW4gaW5kaXJlY3QgYmxvY2sgLSBhbGxvY2F0ZSBuZWFyIHRoYXQgYmxvY2suCisgKgkgICsgaWYgcG9pbnRlciB3aWxsIGxpdmUgaW4gaW5vZGUgLSBhbGxvY2F0ZSBpbiB0aGUgc2FtZQorICoJICAgIGN5bGluZGVyIGdyb3VwLgorICoKKyAqIEluIHRoZSBsYXR0ZXIgY2FzZSB3ZSBjb2xvdXIgdGhlIHN0YXJ0aW5nIGJsb2NrIGJ5IHRoZSBjYWxsZXJzIFBJRCB0bworICogcHJldmVudCBpdCBmcm9tIGNsYXNoaW5nIHdpdGggY29uY3VycmVudCBhbGxvY2F0aW9ucyBmb3IgYSBkaWZmZXJlbnQgaW5vZGUKKyAqIGluIHRoZSBzYW1lIGJsb2NrIGdyb3VwLiAgIFRoZSBQSUQgaXMgdXNlZCBoZXJlIHNvIHRoYXQgZnVuY3Rpb25hbGx5IHJlbGF0ZWQKKyAqIGZpbGVzIHdpbGwgYmUgY2xvc2UtYnkgb24tZGlzay4KKyAqCisgKglDYWxsZXIgbXVzdCBtYWtlIHN1cmUgdGhhdCBAaW5kIGlzIHZhbGlkIGFuZCB3aWxsIHN0YXkgdGhhdCB3YXkuCisgKi8KK3N0YXRpYyBleHQ0X2ZzYmxrX3QgZXh0NF9maW5kX25lYXIoc3RydWN0IGlub2RlICppbm9kZSwgSW5kaXJlY3QgKmluZCkKK3sKKwlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7CisJX19sZTMyICpzdGFydCA9IGluZC0+YmggPyAoX19sZTMyICopIGluZC0+YmgtPmJfZGF0YSA6IGVpLT5pX2RhdGE7CisJX19sZTMyICpwOworCisJLyogVHJ5IHRvIGZpbmQgcHJldmlvdXMgYmxvY2sgKi8KKwlmb3IgKHAgPSBpbmQtPnAgLSAxOyBwID49IHN0YXJ0OyBwLS0pIHsKKwkJaWYgKCpwKQorCQkJcmV0dXJuIGxlMzJfdG9fY3B1KCpwKTsKKwl9CisKKwkvKiBObyBzdWNoIHRoaW5nLCBzbyBsZXQncyB0cnkgbG9jYXRpb24gb2YgaW5kaXJlY3QgYmxvY2sgKi8KKwlpZiAoaW5kLT5iaCkKKwkJcmV0dXJuIGluZC0+YmgtPmJfYmxvY2tucjsKKworCS8qCisJICogSXQgaXMgZ29pbmcgdG8gYmUgcmVmZXJyZWQgdG8gZnJvbSB0aGUgaW5vZGUgaXRzZWxmPyBPSywganVzdCBwdXQgaXQKKwkgKiBpbnRvIHRoZSBzYW1lIGN5bGluZGVyIGdyb3VwIHRoZW4uCisJICovCisJcmV0dXJuIGV4dDRfaW5vZGVfdG9fZ29hbF9ibG9jayhpbm9kZSk7Cit9CisKKy8qKgorICoJZXh0NF9maW5kX2dvYWwgLSBmaW5kIGEgcHJlZmVycmVkIHBsYWNlIGZvciBhbGxvY2F0aW9uLgorICoJQGlub2RlOiBvd25lcgorICoJQGJsb2NrOiAgYmxvY2sgd2Ugd2FudAorICoJQHBhcnRpYWw6IHBvaW50ZXIgdG8gdGhlIGxhc3QgdHJpcGxlIHdpdGhpbiBhIGNoYWluCisgKgorICoJTm9ybWFsbHkgdGhpcyBmdW5jdGlvbiBmaW5kIHRoZSBwcmVmZXJyZWQgcGxhY2UgZm9yIGJsb2NrIGFsbG9jYXRpb24sCisgKglyZXR1cm5zIGl0LgorICoJQmVjYXVzZSB0aGlzIGlzIG9ubHkgdXNlZCBmb3Igbm9uLWV4dGVudCBmaWxlcywgd2UgbGltaXQgdGhlIGJsb2NrIG5yCisgKgl0byAzMiBiaXRzLgorICovCitzdGF0aWMgZXh0NF9mc2Jsa190IGV4dDRfZmluZF9nb2FsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJsa190IGJsb2NrLAorCQkJCSAgIEluZGlyZWN0ICpwYXJ0aWFsKQoreworCWV4dDRfZnNibGtfdCBnb2FsOworCisJLyoKKwkgKiBYWFggbmVlZCB0byBnZXQgZ29hbCBibG9jayBmcm9tIG1iYWxsb2MncyBkYXRhIHN0cnVjdHVyZXMKKwkgKi8KKworCWdvYWwgPSBleHQ0X2ZpbmRfbmVhcihpbm9kZSwgcGFydGlhbCk7CisJZ29hbCA9IGdvYWwgJiBFWFQ0X01BWF9CTE9DS19GSUxFX1BIWVM7CisJcmV0dXJuIGdvYWw7Cit9CisKKy8qKgorICoJZXh0NF9ibGtzX3RvX2FsbG9jYXRlIC0gTG9vayB1cCB0aGUgYmxvY2sgbWFwIGFuZCBjb3VudCB0aGUgbnVtYmVyCisgKglvZiBkaXJlY3QgYmxvY2tzIG5lZWQgdG8gYmUgYWxsb2NhdGVkIGZvciB0aGUgZ2l2ZW4gYnJhbmNoLgorICoKKyAqCUBicmFuY2g6IGNoYWluIG9mIGluZGlyZWN0IGJsb2NrcworICoJQGs6IG51bWJlciBvZiBibG9ja3MgbmVlZCBmb3IgaW5kaXJlY3QgYmxvY2tzCisgKglAYmxrczogbnVtYmVyIG9mIGRhdGEgYmxvY2tzIHRvIGJlIG1hcHBlZC4KKyAqCUBibG9ja3NfdG9fYm91bmRhcnk6ICB0aGUgb2Zmc2V0IGluIHRoZSBpbmRpcmVjdCBibG9jaworICoKKyAqCXJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGJsb2NrcyB0byBiZSBhbGxvY2F0ZSwgaW5jbHVkaW5nIHRoZQorICoJZGlyZWN0IGFuZCBpbmRpcmVjdCBibG9ja3MuCisgKi8KK3N0YXRpYyBpbnQgZXh0NF9ibGtzX3RvX2FsbG9jYXRlKEluZGlyZWN0ICpicmFuY2gsIGludCBrLCB1bnNpZ25lZCBpbnQgYmxrcywKKwkJCQkgaW50IGJsb2Nrc190b19ib3VuZGFyeSkKK3sKKwl1bnNpZ25lZCBpbnQgY291bnQgPSAwOworCisJLyoKKwkgKiBTaW1wbGUgY2FzZSwgW3QsZF1JbmRpcmVjdCBibG9jayhzKSBoYXMgbm90IGFsbG9jYXRlZCB5ZXQKKwkgKiB0aGVuIGl0J3MgY2xlYXIgYmxvY2tzIG9uIHRoYXQgcGF0aCBoYXZlIG5vdCBhbGxvY2F0ZWQKKwkgKi8KKwlpZiAoayA+IDApIHsKKwkJLyogcmlnaHQgbm93IHdlIGRvbid0IGhhbmRsZSBjcm9zcyBib3VuZGFyeSBhbGxvY2F0aW9uICovCisJCWlmIChibGtzIDwgYmxvY2tzX3RvX2JvdW5kYXJ5ICsgMSkKKwkJCWNvdW50ICs9IGJsa3M7CisJCWVsc2UKKwkJCWNvdW50ICs9IGJsb2Nrc190b19ib3VuZGFyeSArIDE7CisJCXJldHVybiBjb3VudDsKKwl9CisKKwljb3VudCsrOworCXdoaWxlIChjb3VudCA8IGJsa3MgJiYgY291bnQgPD0gYmxvY2tzX3RvX2JvdW5kYXJ5ICYmCisJCWxlMzJfdG9fY3B1KCooYnJhbmNoWzBdLnAgKyBjb3VudCkpID09IDApIHsKKwkJY291bnQrKzsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCisvKioKKyAqCWV4dDRfYWxsb2NfYmxvY2tzOiBtdWx0aXBsZSBhbGxvY2F0ZSBibG9ja3MgbmVlZGVkIGZvciBhIGJyYW5jaAorICoJQGhhbmRsZTogaGFuZGxlIGZvciB0aGlzIHRyYW5zYWN0aW9uCisgKglAaW5vZGU6IGlub2RlIHdoaWNoIG5lZWRzIGFsbG9jYXRlZCBibG9ja3MKKyAqCUBpYmxvY2s6IHRoZSBsb2dpY2FsIGJsb2NrIHRvIHN0YXJ0IGFsbG9jYXRlZCBhdAorICoJQGdvYWw6IHByZWZlcnJlZCBwaHlzaWNhbCBibG9jayBvZiBhbGxvY2F0aW9uCisgKglAaW5kaXJlY3RfYmxrczogdGhlIG51bWJlciBvZiBibG9ja3MgbmVlZCB0byBhbGxvY2F0ZSBmb3IgaW5kaXJlY3QKKyAqCQkJYmxvY2tzCisgKglAYmxrczogbnVtYmVyIG9mIGRlc2lyZWQgYmxvY2tzCisgKglAbmV3X2Jsb2Nrczogb24gcmV0dXJuIGl0IHdpbGwgc3RvcmUgdGhlIG5ldyBibG9jayBudW1iZXJzIGZvcgorICoJdGhlIGluZGlyZWN0IGJsb2NrcyhpZiBuZWVkZWQpIGFuZCB0aGUgZmlyc3QgZGlyZWN0IGJsb2NrLAorICoJQGVycjogb24gcmV0dXJuIGl0IHdpbGwgc3RvcmUgdGhlIGVycm9yIGNvZGUKKyAqCisgKglUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2YgYmxvY2tzIGFsbG9jYXRlZCBhcworICoJcmVxdWVzdGVkIGJ5IHRoZSBwYXNzZWQtaW4gcGFyYW1ldGVycy4KKyAqLworc3RhdGljIGludCBleHQ0X2FsbG9jX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICBleHQ0X2xibGtfdCBpYmxvY2ssIGV4dDRfZnNibGtfdCBnb2FsLAorCQkJICAgICBpbnQgaW5kaXJlY3RfYmxrcywgaW50IGJsa3MsCisJCQkgICAgIGV4dDRfZnNibGtfdCBuZXdfYmxvY2tzWzRdLCBpbnQgKmVycikKK3sKKwlzdHJ1Y3QgZXh0NF9hbGxvY2F0aW9uX3JlcXVlc3QgYXI7CisJaW50IHRhcmdldCwgaTsKKwl1bnNpZ25lZCBsb25nIGNvdW50ID0gMCwgYmxrX2FsbG9jYXRlZCA9IDA7CisJaW50IGluZGV4ID0gMDsKKwlleHQ0X2ZzYmxrX3QgY3VycmVudF9ibG9jayA9IDA7CisJaW50IHJldCA9IDA7CisKKwkvKgorCSAqIEhlcmUgd2UgdHJ5IHRvIGFsbG9jYXRlIHRoZSByZXF1ZXN0ZWQgbXVsdGlwbGUgYmxvY2tzIGF0IG9uY2UsCisJICogb24gYSBiZXN0LWVmZm9ydCBiYXNpcy4KKwkgKiBUbyBidWlsZCBhIGJyYW5jaCwgd2Ugc2hvdWxkIGFsbG9jYXRlIGJsb2NrcyBmb3IKKwkgKiB0aGUgaW5kaXJlY3QgYmxvY2tzKGlmIG5vdCBhbGxvY2F0ZWQgeWV0KSwgYW5kIGF0IGxlYXN0CisJICogdGhlIGZpcnN0IGRpcmVjdCBibG9jayBvZiB0aGlzIGJyYW5jaC4gIFRoYXQncyB0aGUKKwkgKiBtaW5pbXVtIG51bWJlciBvZiBibG9ja3MgbmVlZCB0byBhbGxvY2F0ZShyZXF1aXJlZCkKKwkgKi8KKwkvKiBmaXJzdCB3ZSB0cnkgdG8gYWxsb2NhdGUgdGhlIGluZGlyZWN0IGJsb2NrcyAqLworCXRhcmdldCA9IGluZGlyZWN0X2Jsa3M7CisJd2hpbGUgKHRhcmdldCA+IDApIHsKKwkJY291bnQgPSB0YXJnZXQ7CisJCS8qIGFsbG9jYXRpbmcgYmxvY2tzIGZvciBpbmRpcmVjdCBibG9ja3MgYW5kIGRpcmVjdCBibG9ja3MgKi8KKwkJY3VycmVudF9ibG9jayA9IGV4dDRfbmV3X21ldGFfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIGdvYWwsCisJCQkJCQkgICAgIDAsICZjb3VudCwgZXJyKTsKKwkJaWYgKCplcnIpCisJCQlnb3RvIGZhaWxlZF9vdXQ7CisKKwkJaWYgKHVubGlrZWx5KGN1cnJlbnRfYmxvY2sgKyBjb3VudCA+IEVYVDRfTUFYX0JMT0NLX0ZJTEVfUEhZUykpIHsKKwkJCUVYVDRfRVJST1JfSU5PREUoaW5vZGUsCisJCQkJCSAiY3VycmVudF9ibG9jayAlbGx1ICsgY291bnQgJWx1ID4gJWQhIiwKKwkJCQkJIGN1cnJlbnRfYmxvY2ssIGNvdW50LAorCQkJCQkgRVhUNF9NQVhfQkxPQ0tfRklMRV9QSFlTKTsKKwkJCSplcnIgPSAtRUlPOworCQkJZ290byBmYWlsZWRfb3V0OworCQl9CisKKwkJdGFyZ2V0IC09IGNvdW50OworCQkvKiBhbGxvY2F0ZSBibG9ja3MgZm9yIGluZGlyZWN0IGJsb2NrcyAqLworCQl3aGlsZSAoaW5kZXggPCBpbmRpcmVjdF9ibGtzICYmIGNvdW50KSB7CisJCQluZXdfYmxvY2tzW2luZGV4KytdID0gY3VycmVudF9ibG9jaysrOworCQkJY291bnQtLTsKKwkJfQorCQlpZiAoY291bnQgPiAwKSB7CisJCQkvKgorCQkJICogc2F2ZSB0aGUgbmV3IGJsb2NrIG51bWJlcgorCQkJICogZm9yIHRoZSBmaXJzdCBkaXJlY3QgYmxvY2sKKwkJCSAqLworCQkJbmV3X2Jsb2Nrc1tpbmRleF0gPSBjdXJyZW50X2Jsb2NrOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgcmV0dXJuZWQgbW9yZSBibG9ja3MgdGhhbiAiCisJCQkJCQkicmVxdWVzdGVkXG4iLCBfX2Z1bmNfXyk7CisJCQlXQVJOX09OKDEpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwl0YXJnZXQgPSBibGtzIC0gY291bnQgOworCWJsa19hbGxvY2F0ZWQgPSBjb3VudDsKKwlpZiAoIXRhcmdldCkKKwkJZ290byBhbGxvY2F0ZWQ7CisJLyogTm93IGFsbG9jYXRlIGRhdGEgYmxvY2tzICovCisJbWVtc2V0KCZhciwgMCwgc2l6ZW9mKGFyKSk7CisJYXIuaW5vZGUgPSBpbm9kZTsKKwlhci5nb2FsID0gZ29hbDsKKwlhci5sZW4gPSB0YXJnZXQ7CisJYXIubG9naWNhbCA9IGlibG9jazsKKwlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKKwkJLyogZW5hYmxlIGluLWNvcmUgcHJlYWxsb2NhdGlvbiBvbmx5IGZvciByZWd1bGFyIGZpbGVzICovCisJCWFyLmZsYWdzID0gRVhUNF9NQl9ISU5UX0RBVEE7CisKKwljdXJyZW50X2Jsb2NrID0gZXh0NF9tYl9uZXdfYmxvY2tzKGhhbmRsZSwgJmFyLCBlcnIpOworCWlmICh1bmxpa2VseShjdXJyZW50X2Jsb2NrICsgYXIubGVuID4gRVhUNF9NQVhfQkxPQ0tfRklMRV9QSFlTKSkgeworCQlFWFQ0X0VSUk9SX0lOT0RFKGlub2RlLAorCQkJCSAiY3VycmVudF9ibG9jayAlbGx1ICsgYXIubGVuICVkID4gJWQhIiwKKwkJCQkgY3VycmVudF9ibG9jaywgYXIubGVuLAorCQkJCSBFWFQ0X01BWF9CTE9DS19GSUxFX1BIWVMpOworCQkqZXJyID0gLUVJTzsKKwkJZ290byBmYWlsZWRfb3V0OworCX0KKworCWlmICgqZXJyICYmICh0YXJnZXQgPT0gYmxrcykpIHsKKwkJLyoKKwkJICogaWYgdGhlIGFsbG9jYXRpb24gZmFpbGVkIGFuZCB3ZSBkaWRuJ3QgYWxsb2NhdGUKKwkJICogYW55IGJsb2NrcyBiZWZvcmUKKwkJICovCisJCWdvdG8gZmFpbGVkX291dDsKKwl9CisJaWYgKCEqZXJyKSB7CisJCWlmICh0YXJnZXQgPT0gYmxrcykgeworCQkJLyoKKwkJCSAqIHNhdmUgdGhlIG5ldyBibG9jayBudW1iZXIKKwkJCSAqIGZvciB0aGUgZmlyc3QgZGlyZWN0IGJsb2NrCisJCQkgKi8KKwkJCW5ld19ibG9ja3NbaW5kZXhdID0gY3VycmVudF9ibG9jazsKKwkJfQorCQlibGtfYWxsb2NhdGVkICs9IGFyLmxlbjsKKwl9CithbGxvY2F0ZWQ6CisJLyogdG90YWwgbnVtYmVyIG9mIGJsb2NrcyBhbGxvY2F0ZWQgZm9yIGRpcmVjdCBibG9ja3MgKi8KKwlyZXQgPSBibGtfYWxsb2NhdGVkOworCSplcnIgPSAwOworCXJldHVybiByZXQ7CitmYWlsZWRfb3V0OgorCWZvciAoaSA9IDA7IGkgPCBpbmRleDsgaSsrKQorCQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsIG5ld19ibG9ja3NbaV0sIDEsIDApOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICoJZXh0NF9hbGxvY19icmFuY2ggLSBhbGxvY2F0ZSBhbmQgc2V0IHVwIGEgY2hhaW4gb2YgYmxvY2tzLgorICoJQGhhbmRsZTogaGFuZGxlIGZvciB0aGlzIHRyYW5zYWN0aW9uCisgKglAaW5vZGU6IG93bmVyCisgKglAaW5kaXJlY3RfYmxrczogbnVtYmVyIG9mIGFsbG9jYXRlZCBpbmRpcmVjdCBibG9ja3MKKyAqCUBibGtzOiBudW1iZXIgb2YgYWxsb2NhdGVkIGRpcmVjdCBibG9ja3MKKyAqCUBnb2FsOiBwcmVmZXJyZWQgcGxhY2UgZm9yIGFsbG9jYXRpb24KKyAqCUBvZmZzZXRzOiBvZmZzZXRzIChpbiB0aGUgYmxvY2tzKSB0byBzdG9yZSB0aGUgcG9pbnRlcnMgdG8gbmV4dC4KKyAqCUBicmFuY2g6IHBsYWNlIHRvIHN0b3JlIHRoZSBjaGFpbiBpbi4KKyAqCisgKglUaGlzIGZ1bmN0aW9uIGFsbG9jYXRlcyBibG9ja3MsIHplcm9lcyBvdXQgYWxsIGJ1dCB0aGUgbGFzdCBvbmUsCisgKglsaW5rcyB0aGVtIGludG8gY2hhaW4gYW5kIChpZiB3ZSBhcmUgc3luY2hyb25vdXMpIHdyaXRlcyB0aGVtIHRvIGRpc2suCisgKglJbiBvdGhlciB3b3JkcywgaXQgcHJlcGFyZXMgYSBicmFuY2ggdGhhdCBjYW4gYmUgc3BsaWNlZCBvbnRvIHRoZQorICoJaW5vZGUuIEl0IHN0b3JlcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhhdCBjaGFpbiBpbiB0aGUgYnJhbmNoW10sIGluCisgKgl0aGUgc2FtZSBmb3JtYXQgYXMgZXh0NF9nZXRfYnJhbmNoKCkgd291bGQgZG8uIFdlIGFyZSBjYWxsaW5nIGl0IGFmdGVyCisgKgl3ZSBoYWQgcmVhZCB0aGUgZXhpc3RpbmcgcGFydCBvZiBjaGFpbiBhbmQgcGFydGlhbCBwb2ludHMgdG8gdGhlIGxhc3QKKyAqCXRyaXBsZSBvZiB0aGF0IChvbmUgd2l0aCB6ZXJvIC0+a2V5KS4gVXBvbiB0aGUgZXhpdCB3ZSBoYXZlIHRoZSBzYW1lCisgKglwaWN0dXJlIGFzIGFmdGVyIHRoZSBzdWNjZXNzZnVsIGV4dDRfZ2V0X2Jsb2NrKCksIGV4Y2VwdCB0aGF0IGluIG9uZQorICoJcGxhY2UgY2hhaW4gaXMgZGlzY29ubmVjdGVkIC0gKmJyYW5jaC0+cCBpcyBzdGlsbCB6ZXJvICh3ZSBkaWQgbm90CisgKglzZXQgdGhlIGxhc3QgbGluayksIGJ1dCBicmFuY2gtPmtleSBjb250YWlucyB0aGUgbnVtYmVyIHRoYXQgc2hvdWxkCisgKgliZSBwbGFjZWQgaW50byAqYnJhbmNoLT5wIHRvIGZpbGwgdGhhdCBnYXAuCisgKgorICoJSWYgYWxsb2NhdGlvbiBmYWlscyB3ZSBmcmVlIGFsbCBibG9ja3Mgd2UndmUgYWxsb2NhdGVkIChhbmQgZm9yZ2V0CisgKgl0aGVpciBidWZmZXJfaGVhZHMpIGFuZCByZXR1cm4gdGhlIGVycm9yIHZhbHVlIHRoZSBmcm9tIGZhaWxlZAorICoJZXh0NF9hbGxvY19ibG9jaygpIChub3JtYWxseSAtRU5PU1BDKS4gT3RoZXJ3aXNlIHdlIHNldCB0aGUgY2hhaW4KKyAqCWFzIGRlc2NyaWJlZCBhYm92ZSBhbmQgcmV0dXJuIDAuCisgKi8KK3N0YXRpYyBpbnQgZXh0NF9hbGxvY19icmFuY2goaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgZXh0NF9sYmxrX3QgaWJsb2NrLCBpbnQgaW5kaXJlY3RfYmxrcywKKwkJCSAgICAgaW50ICpibGtzLCBleHQ0X2ZzYmxrX3QgZ29hbCwKKwkJCSAgICAgZXh0NF9sYmxrX3QgKm9mZnNldHMsIEluZGlyZWN0ICpicmFuY2gpCit7CisJaW50IGJsb2Nrc2l6ZSA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwlpbnQgaSwgbiA9IDA7CisJaW50IGVyciA9IDA7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKKwlpbnQgbnVtOworCWV4dDRfZnNibGtfdCBuZXdfYmxvY2tzWzRdOworCWV4dDRfZnNibGtfdCBjdXJyZW50X2Jsb2NrOworCisJbnVtID0gZXh0NF9hbGxvY19ibG9ja3MoaGFuZGxlLCBpbm9kZSwgaWJsb2NrLCBnb2FsLCBpbmRpcmVjdF9ibGtzLAorCQkJCSpibGtzLCBuZXdfYmxvY2tzLCAmZXJyKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJYnJhbmNoWzBdLmtleSA9IGNwdV90b19sZTMyKG5ld19ibG9ja3NbMF0pOworCS8qCisJICogbWV0YWRhdGEgYmxvY2tzIGFuZCBkYXRhIGJsb2NrcyBhcmUgYWxsb2NhdGVkLgorCSAqLworCWZvciAobiA9IDE7IG4gPD0gaW5kaXJlY3RfYmxrczsgIG4rKykgeworCQkvKgorCQkgKiBHZXQgYnVmZmVyX2hlYWQgZm9yIHBhcmVudCBibG9jaywgemVybyBpdCBvdXQKKwkJICogYW5kIHNldCB0aGUgcG9pbnRlciB0byBuZXcgb25lLCB0aGVuIHNlbmQKKwkJICogcGFyZW50IHRvIGRpc2suCisJCSAqLworCQliaCA9IHNiX2dldGJsayhpbm9kZS0+aV9zYiwgbmV3X2Jsb2Nrc1tuLTFdKTsKKwkJaWYgKHVubGlrZWx5KCFiaCkpIHsKKwkJCWVyciA9IC1FSU87CisJCQlnb3RvIGZhaWxlZDsKKwkJfQorCisJCWJyYW5jaFtuXS5iaCA9IGJoOworCQlsb2NrX2J1ZmZlcihiaCk7CisJCUJVRkZFUl9UUkFDRShiaCwgImNhbGwgZ2V0X2NyZWF0ZV9hY2Nlc3MiKTsKKwkJZXJyID0gZXh0NF9qb3VybmFsX2dldF9jcmVhdGVfYWNjZXNzKGhhbmRsZSwgYmgpOworCQlpZiAoZXJyKSB7CisJCQkvKiBEb24ndCBicmVsc2UoYmgpIGhlcmU7IGl0J3MgZG9uZSBpbgorCQkJICogZXh0NF9qb3VybmFsX2ZvcmdldCgpIGJlbG93ICovCisJCQl1bmxvY2tfYnVmZmVyKGJoKTsKKwkJCWdvdG8gZmFpbGVkOworCQl9CisKKwkJbWVtc2V0KGJoLT5iX2RhdGEsIDAsIGJsb2Nrc2l6ZSk7CisJCWJyYW5jaFtuXS5wID0gKF9fbGUzMiAqKSBiaC0+Yl9kYXRhICsgb2Zmc2V0c1tuXTsKKwkJYnJhbmNoW25dLmtleSA9IGNwdV90b19sZTMyKG5ld19ibG9ja3Nbbl0pOworCQkqYnJhbmNoW25dLnAgPSBicmFuY2hbbl0ua2V5OworCQlpZiAobiA9PSBpbmRpcmVjdF9ibGtzKSB7CisJCQljdXJyZW50X2Jsb2NrID0gbmV3X2Jsb2Nrc1tuXTsKKwkJCS8qCisJCQkgKiBFbmQgb2YgY2hhaW4sIHVwZGF0ZSB0aGUgbGFzdCBuZXcgbWV0YWJsb2NrIG9mCisJCQkgKiB0aGUgY2hhaW4gdG8gcG9pbnQgdG8gdGhlIG5ldyBhbGxvY2F0ZWQKKwkJCSAqIGRhdGEgYmxvY2tzIG51bWJlcnMKKwkJCSAqLworCQkJZm9yIChpID0gMTsgaSA8IG51bTsgaSsrKQorCQkJCSooYnJhbmNoW25dLnAgKyBpKSA9IGNwdV90b19sZTMyKCsrY3VycmVudF9ibG9jayk7CisJCX0KKwkJQlVGRkVSX1RSQUNFKGJoLCAibWFya2luZyB1cHRvZGF0ZSIpOworCQlzZXRfYnVmZmVyX3VwdG9kYXRlKGJoKTsKKwkJdW5sb2NrX2J1ZmZlcihiaCk7CisKKwkJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOworCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBiaCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGZhaWxlZDsKKwl9CisJKmJsa3MgPSBudW07CisJcmV0dXJuIGVycjsKK2ZhaWxlZDoKKwkvKiBBbGxvY2F0aW9uIGZhaWxlZCwgZnJlZSB3aGF0IHdlIGFscmVhZHkgYWxsb2NhdGVkICovCisJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBOVUxMLCBuZXdfYmxvY2tzWzBdLCAxLCAwKTsKKwlmb3IgKGkgPSAxOyBpIDw9IG4gOyBpKyspIHsKKwkJLyoKKwkJICogYnJhbmNoW2ldLmJoIGlzIG5ld2x5IGFsbG9jYXRlZCwgc28gdGhlcmUgaXMgbm8KKwkJICogbmVlZCB0byByZXZva2UgdGhlIGJsb2NrLCB3aGljaCBpcyB3aHkgd2UgZG9uJ3QKKwkJICogbmVlZCB0byBzZXQgRVhUNF9GUkVFX0JMT0NLU19NRVRBREFUQS4KKwkJICovCisJCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgTlVMTCwgbmV3X2Jsb2Nrc1tpXSwgMSwKKwkJCQkgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpOworCX0KKwlmb3IgKGkgPSBuKzE7IGkgPCBpbmRpcmVjdF9ibGtzOyBpKyspCisJCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgTlVMTCwgbmV3X2Jsb2Nrc1tpXSwgMSwgMCk7CisKKwlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsIG5ld19ibG9ja3NbaV0sIG51bSwgMCk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKioKKyAqIGV4dDRfc3BsaWNlX2JyYW5jaCAtIHNwbGljZSB0aGUgYWxsb2NhdGVkIGJyYW5jaCBvbnRvIGlub2RlLgorICogQGhhbmRsZTogaGFuZGxlIGZvciB0aGlzIHRyYW5zYWN0aW9uCisgKiBAaW5vZGU6IG93bmVyCisgKiBAYmxvY2s6IChsb2dpY2FsKSBudW1iZXIgb2YgYmxvY2sgd2UgYXJlIGFkZGluZworICogQGNoYWluOiBjaGFpbiBvZiBpbmRpcmVjdCBibG9ja3MgKHdpdGggYSBtaXNzaW5nIGxpbmsgLSBzZWUKKyAqCWV4dDRfYWxsb2NfYnJhbmNoKQorICogQHdoZXJlOiBsb2NhdGlvbiBvZiBtaXNzaW5nIGxpbmsKKyAqIEBudW06ICAgbnVtYmVyIG9mIGluZGlyZWN0IGJsb2NrcyB3ZSBhcmUgYWRkaW5nCisgKiBAYmxrczogIG51bWJlciBvZiBkaXJlY3QgYmxvY2tzIHdlIGFyZSBhZGRpbmcKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGZpbGxzIHRoZSBtaXNzaW5nIGxpbmsgYW5kIGRvZXMgYWxsIGhvdXNla2VlcGluZyBuZWVkZWQgaW4KKyAqIGlub2RlICgtPmlfYmxvY2tzLCBldGMuKS4gSW4gY2FzZSBvZiBzdWNjZXNzIHdlIGVuZCB1cCB3aXRoIHRoZSBmdWxsCisgKiBjaGFpbiB0byBuZXcgYmxvY2sgYW5kIHJldHVybiAwLgorICovCitzdGF0aWMgaW50IGV4dDRfc3BsaWNlX2JyYW5jaChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICAgZXh0NF9sYmxrX3QgYmxvY2ssIEluZGlyZWN0ICp3aGVyZSwgaW50IG51bSwKKwkJCSAgICAgIGludCBibGtzKQoreworCWludCBpOworCWludCBlcnIgPSAwOworCWV4dDRfZnNibGtfdCBjdXJyZW50X2Jsb2NrOworCisJLyoKKwkgKiBJZiB3ZSdyZSBzcGxpY2luZyBpbnRvIGEgW3RkXWluZGlyZWN0IGJsb2NrIChhcyBvcHBvc2VkIHRvIHRoZQorCSAqIGlub2RlKSB0aGVuIHdlIG5lZWQgdG8gZ2V0IHdyaXRlIGFjY2VzcyB0byB0aGUgW3RkXWluZGlyZWN0IGJsb2NrCisJICogYmVmb3JlIHRoZSBzcGxpY2UuCisJICovCisJaWYgKHdoZXJlLT5iaCkgeworCQlCVUZGRVJfVFJBQ0Uod2hlcmUtPmJoLCAiZ2V0X3dyaXRlX2FjY2VzcyIpOworCQllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIHdoZXJlLT5iaCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl9vdXQ7CisJfQorCS8qIFRoYXQncyBpdCAqLworCisJKndoZXJlLT5wID0gd2hlcmUtPmtleTsKKworCS8qCisJICogVXBkYXRlIHRoZSBob3N0IGJ1ZmZlcl9oZWFkIG9yIGlub2RlIHRvIHBvaW50IHRvIG1vcmUganVzdCBhbGxvY2F0ZWQKKwkgKiBkaXJlY3QgYmxvY2tzIGJsb2NrcworCSAqLworCWlmIChudW0gPT0gMCAmJiBibGtzID4gMSkgeworCQljdXJyZW50X2Jsb2NrID0gbGUzMl90b19jcHUod2hlcmUtPmtleSkgKyAxOworCQlmb3IgKGkgPSAxOyBpIDwgYmxrczsgaSsrKQorCQkJKih3aGVyZS0+cCArIGkpID0gY3B1X3RvX2xlMzIoY3VycmVudF9ibG9jaysrKTsKKwl9CisKKwkvKiBXZSBhcmUgZG9uZSB3aXRoIGF0b21pYyBzdHVmZiwgbm93IGRvIHRoZSByZXN0IG9mIGhvdXNla2VlcGluZyAqLworCS8qIGhhZCB3ZSBzcGxpY2VkIGl0IG9udG8gaW5kaXJlY3QgYmxvY2s/ICovCisJaWYgKHdoZXJlLT5iaCkgeworCQkvKgorCQkgKiBJZiB3ZSBzcGxpY2VkIGl0IG9udG8gYW4gaW5kaXJlY3QgYmxvY2ssIHdlIGhhdmVuJ3QKKwkJICogYWx0ZXJlZCB0aGUgaW5vZGUuICBOb3RlIGhvd2V2ZXIgdGhhdCBpZiBpdCBpcyBiZWluZyBzcGxpY2VkCisJCSAqIG9udG8gYW4gaW5kaXJlY3QgYmxvY2sgYXQgdGhlIHZlcnkgZW5kIG9mIHRoZSBmaWxlICh0aGUKKwkJICogZmlsZSBpcyBncm93aW5nKSB0aGVuIHdlICp3aWxsKiBhbHRlciB0aGUgaW5vZGUgdG8gcmVmbGVjdAorCQkgKiB0aGUgbmV3IGlfc2l6ZS4gIEJ1dCB0aGF0IGlzIG5vdCBkb25lIGhlcmUgLSBpdCBpcyBkb25lIGluCisJCSAqIGdlbmVyaWNfY29tbWl0X3dyaXRlLT5fX21hcmtfaW5vZGVfZGlydHktPmV4dDRfZGlydHlfaW5vZGUuCisJCSAqLworCQlqYmRfZGVidWcoNSwgInNwbGljaW5nIGluZGlyZWN0IG9ubHlcbiIpOworCQlCVUZGRVJfVFJBQ0Uod2hlcmUtPmJoLCAiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOworCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCB3aGVyZS0+YmgpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfb3V0OworCX0gZWxzZSB7CisJCS8qCisJCSAqIE9LLCB3ZSBzcGxpY2VkIGl0IGludG8gdGhlIGlub2RlIGl0c2VsZiBvbiBhIGRpcmVjdCBibG9jay4KKwkJICovCisJCWV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKwkJamJkX2RlYnVnKDUsICJzcGxpY2luZyBkaXJlY3RcbiIpOworCX0KKwlyZXR1cm4gZXJyOworCitlcnJfb3V0OgorCWZvciAoaSA9IDE7IGkgPD0gbnVtOyBpKyspIHsKKwkJLyoKKwkJICogYnJhbmNoW2ldLmJoIGlzIG5ld2x5IGFsbG9jYXRlZCwgc28gdGhlcmUgaXMgbm8KKwkJICogbmVlZCB0byByZXZva2UgdGhlIGJsb2NrLCB3aGljaCBpcyB3aHkgd2UgZG9uJ3QKKwkJICogbmVlZCB0byBzZXQgRVhUNF9GUkVFX0JMT0NLU19NRVRBREFUQS4KKwkJICovCisJCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgd2hlcmVbaV0uYmgsIDAsIDEsCisJCQkJIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTsKKwl9CisJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBOVUxMLCBsZTMyX3RvX2NwdSh3aGVyZVtudW1dLmtleSksCisJCQkgYmxrcywgMCk7CisKKwlyZXR1cm4gZXJyOworfQorCisvKgorICogVGhlIGV4dDRfaW5kX21hcF9ibG9ja3MoKSBmdW5jdGlvbiBoYW5kbGVzIG5vbi1leHRlbnRzIGlub2RlcworICogKGkuZS4sIHVzaW5nIHRoZSB0cmFkaXRpb25hbCBpbmRpcmVjdC9kb3VibGUtaW5kaXJlY3QgaV9ibG9ja3MKKyAqIHNjaGVtZSkgZm9yIGV4dDRfbWFwX2Jsb2NrcygpLgorICoKKyAqIEFsbG9jYXRpb24gc3RyYXRlZ3kgaXMgc2ltcGxlOiBpZiB3ZSBoYXZlIHRvIGFsbG9jYXRlIHNvbWV0aGluZywgd2Ugd2lsbAorICogaGF2ZSB0byBnbyB0aGUgd2hvbGUgd2F5IHRvIGxlYWYuIFNvIGxldCdzIGRvIGl0IGJlZm9yZSBhdHRhY2hpbmcgYW55dGhpbmcKKyAqIHRvIHRyZWUsIHNldCBsaW5rYWdlIGJldHdlZW4gdGhlIG5ld2Jvcm4gYmxvY2tzLCB3cml0ZSB0aGVtIGlmIHN5bmMgaXMKKyAqIHJlcXVpcmVkLCByZWNoZWNrIHRoZSBwYXRoLCBmcmVlIGFuZCByZXBlYXQgaWYgY2hlY2sgZmFpbHMsIG90aGVyd2lzZQorICogc2V0IHRoZSBsYXN0IG1pc3NpbmcgbGluayAodGhhdCB3aWxsIHByb3RlY3QgdXMgZnJvbSBhbnkgdHJ1bmNhdGUtZ2VuZXJhdGVkCisgKiByZW1vdmFscyAtIGFsbCBibG9ja3Mgb24gdGhlIHBhdGggYXJlIGltbXVuZSBub3cpIGFuZCBwb3NzaWJseSBmb3JjZSB0aGUKKyAqIHdyaXRlIG9uIHRoZSBwYXJlbnQgYmxvY2suCisgKiBUaGF0IGhhcyBhIG5pY2UgYWRkaXRpb25hbCBwcm9wZXJ0eTogbm8gc3BlY2lhbCByZWNvdmVyeSBmcm9tIHRoZSBmYWlsZWQKKyAqIGFsbG9jYXRpb25zIGlzIG5lZWRlZCAtIHdlIHNpbXBseSByZWxlYXNlIGJsb2NrcyBhbmQgZG8gbm90IHRvdWNoIGFueXRoaW5nCisgKiByZWFjaGFibGUgZnJvbSBpbm9kZS4KKyAqCisgKiBgaGFuZGxlJyBjYW4gYmUgTlVMTCBpZiBjcmVhdGUgPT0gMC4KKyAqCisgKiByZXR1cm4gPiAwLCAjIG9mIGJsb2NrcyBtYXBwZWQgb3IgYWxsb2NhdGVkLgorICogcmV0dXJuID0gMCwgaWYgcGxhaW4gbG9va3VwIGZhaWxlZC4KKyAqIHJldHVybiA8IDAsIGVycm9yIGNhc2UuCisgKgorICogVGhlIGV4dDRfaW5kX2dldF9ibG9ja3MoKSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdpdGgKKyAqIGRvd25fd3JpdGUoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pIGlmIGFsbG9jYXRpbmcgZmlsZXN5c3RlbQorICogYmxvY2tzIChpLmUuLCBmbGFncyBoYXMgRVhUNF9HRVRfQkxPQ0tTX0NSRUFURSBzZXQpIG9yCisgKiBkb3duX3JlYWQoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pIGlmIG5vdCBhbGxvY2F0aW5nIGZpbGUgc3lzdGVtCisgKiBibG9ja3MuCisgKi8KK2ludCBleHQ0X2luZF9tYXBfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQlzdHJ1Y3QgZXh0NF9tYXBfYmxvY2tzICptYXAsCisJCQlpbnQgZmxhZ3MpCit7CisJaW50IGVyciA9IC1FSU87CisJZXh0NF9sYmxrX3Qgb2Zmc2V0c1s0XTsKKwlJbmRpcmVjdCBjaGFpbls0XTsKKwlJbmRpcmVjdCAqcGFydGlhbDsKKwlleHQ0X2ZzYmxrX3QgZ29hbDsKKwlpbnQgaW5kaXJlY3RfYmxrczsKKwlpbnQgYmxvY2tzX3RvX2JvdW5kYXJ5ID0gMDsKKwlpbnQgZGVwdGg7CisJaW50IGNvdW50ID0gMDsKKwlleHQ0X2ZzYmxrX3QgZmlyc3RfYmxvY2sgPSAwOworCisJdHJhY2VfZXh0NF9pbmRfbWFwX2Jsb2Nrc19lbnRlcihpbm9kZSwgbWFwLT5tX2xibGssIG1hcC0+bV9sZW4sIGZsYWdzKTsKKwlKX0FTU0VSVCghKGV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpKSk7CisJSl9BU1NFUlQoaGFuZGxlICE9IE5VTEwgfHwgKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX0NSRUFURSkgPT0gMCk7CisJZGVwdGggPSBleHQ0X2Jsb2NrX3RvX3BhdGgoaW5vZGUsIG1hcC0+bV9sYmxrLCBvZmZzZXRzLAorCQkJCSAgICZibG9ja3NfdG9fYm91bmRhcnkpOworCisJaWYgKGRlcHRoID09IDApCisJCWdvdG8gb3V0OworCisJcGFydGlhbCA9IGV4dDRfZ2V0X2JyYW5jaChpbm9kZSwgZGVwdGgsIG9mZnNldHMsIGNoYWluLCAmZXJyKTsKKworCS8qIFNpbXBsZXN0IGNhc2UgLSBibG9jayBmb3VuZCwgbm8gYWxsb2NhdGlvbiBuZWVkZWQgKi8KKwlpZiAoIXBhcnRpYWwpIHsKKwkJZmlyc3RfYmxvY2sgPSBsZTMyX3RvX2NwdShjaGFpbltkZXB0aCAtIDFdLmtleSk7CisJCWNvdW50Kys7CisJCS8qbWFwIG1vcmUgYmxvY2tzKi8KKwkJd2hpbGUgKGNvdW50IDwgbWFwLT5tX2xlbiAmJiBjb3VudCA8PSBibG9ja3NfdG9fYm91bmRhcnkpIHsKKwkJCWV4dDRfZnNibGtfdCBibGs7CisKKwkJCWJsayA9IGxlMzJfdG9fY3B1KCooY2hhaW5bZGVwdGgtMV0ucCArIGNvdW50KSk7CisKKwkJCWlmIChibGsgPT0gZmlyc3RfYmxvY2sgKyBjb3VudCkKKwkJCQljb3VudCsrOworCQkJZWxzZQorCQkJCWJyZWFrOworCQl9CisJCWdvdG8gZ290X2l0OworCX0KKworCS8qIE5leHQgc2ltcGxlIGNhc2UgLSBwbGFpbiBsb29rdXAgb3IgZmFpbGVkIHJlYWQgb2YgaW5kaXJlY3QgYmxvY2sgKi8KKwlpZiAoKGZsYWdzICYgRVhUNF9HRVRfQkxPQ0tTX0NSRUFURSkgPT0gMCB8fCBlcnIgPT0gLUVJTykKKwkJZ290byBjbGVhbnVwOworCisJLyoKKwkgKiBPa2F5LCB3ZSBuZWVkIHRvIGRvIGJsb2NrIGFsbG9jYXRpb24uCisJKi8KKwlnb2FsID0gZXh0NF9maW5kX2dvYWwoaW5vZGUsIG1hcC0+bV9sYmxrLCBwYXJ0aWFsKTsKKworCS8qIHRoZSBudW1iZXIgb2YgYmxvY2tzIG5lZWQgdG8gYWxsb2NhdGUgZm9yIFtkLHRdaW5kaXJlY3QgYmxvY2tzICovCisJaW5kaXJlY3RfYmxrcyA9IChjaGFpbiArIGRlcHRoKSAtIHBhcnRpYWwgLSAxOworCisJLyoKKwkgKiBOZXh0IGxvb2sgdXAgdGhlIGluZGlyZWN0IG1hcCB0byBjb3VudCB0aGUgdG90b2FsIG51bWJlciBvZgorCSAqIGRpcmVjdCBibG9ja3MgdG8gYWxsb2NhdGUgZm9yIHRoaXMgYnJhbmNoLgorCSAqLworCWNvdW50ID0gZXh0NF9ibGtzX3RvX2FsbG9jYXRlKHBhcnRpYWwsIGluZGlyZWN0X2Jsa3MsCisJCQkJICAgICAgbWFwLT5tX2xlbiwgYmxvY2tzX3RvX2JvdW5kYXJ5KTsKKwkvKgorCSAqIEJsb2NrIG91dCBleHQ0X3RydW5jYXRlIHdoaWxlIHdlIGFsdGVyIHRoZSB0cmVlCisJICovCisJZXJyID0gZXh0NF9hbGxvY19icmFuY2goaGFuZGxlLCBpbm9kZSwgbWFwLT5tX2xibGssIGluZGlyZWN0X2Jsa3MsCisJCQkJJmNvdW50LCBnb2FsLAorCQkJCW9mZnNldHMgKyAocGFydGlhbCAtIGNoYWluKSwgcGFydGlhbCk7CisKKwkvKgorCSAqIFRoZSBleHQ0X3NwbGljZV9icmFuY2ggY2FsbCB3aWxsIGZyZWUgYW5kIGZvcmdldCBhbnkgYnVmZmVycworCSAqIG9uIHRoZSBuZXcgY2hhaW4gaWYgdGhlcmUgaXMgYSBmYWlsdXJlLCBidXQgdGhhdCByaXNrcyB1c2luZworCSAqIHVwIHRyYW5zYWN0aW9uIGNyZWRpdHMsIGVzcGVjaWFsbHkgZm9yIGJpdG1hcHMgd2hlcmUgdGhlCisJICogY3JlZGl0cyBjYW5ub3QgYmUgcmV0dXJuZWQuICBDYW4gd2UgaGFuZGxlIHRoaXMgc29tZWhvdz8gIFdlCisJICogbWF5IG5lZWQgdG8gcmV0dXJuIC1FQUdBSU4gdXB3YXJkcyBpbiB0aGUgd29yc3QgY2FzZS4gIC0tc2N0CisJICovCisJaWYgKCFlcnIpCisJCWVyciA9IGV4dDRfc3BsaWNlX2JyYW5jaChoYW5kbGUsIGlub2RlLCBtYXAtPm1fbGJsaywKKwkJCQkJIHBhcnRpYWwsIGluZGlyZWN0X2Jsa3MsIGNvdW50KTsKKwlpZiAoZXJyKQorCQlnb3RvIGNsZWFudXA7CisKKwltYXAtPm1fZmxhZ3MgfD0gRVhUNF9NQVBfTkVXOworCisJZXh0NF91cGRhdGVfaW5vZGVfZnN5bmNfdHJhbnMoaGFuZGxlLCBpbm9kZSwgMSk7Citnb3RfaXQ6CisJbWFwLT5tX2ZsYWdzIHw9IEVYVDRfTUFQX01BUFBFRDsKKwltYXAtPm1fcGJsayA9IGxlMzJfdG9fY3B1KGNoYWluW2RlcHRoLTFdLmtleSk7CisJbWFwLT5tX2xlbiA9IGNvdW50OworCWlmIChjb3VudCA+IGJsb2Nrc190b19ib3VuZGFyeSkKKwkJbWFwLT5tX2ZsYWdzIHw9IEVYVDRfTUFQX0JPVU5EQVJZOworCWVyciA9IGNvdW50OworCS8qIENsZWFuIHVwIGFuZCBleGl0ICovCisJcGFydGlhbCA9IGNoYWluICsgZGVwdGggLSAxOwkvKiB0aGUgd2hvbGUgY2hhaW4gKi8KK2NsZWFudXA6CisJd2hpbGUgKHBhcnRpYWwgPiBjaGFpbikgeworCQlCVUZGRVJfVFJBQ0UocGFydGlhbC0+YmgsICJjYWxsIGJyZWxzZSIpOworCQlicmVsc2UocGFydGlhbC0+YmgpOworCQlwYXJ0aWFsLS07CisJfQorb3V0OgorCXRyYWNlX2V4dDRfaW5kX21hcF9ibG9ja3NfZXhpdChpbm9kZSwgbWFwLT5tX2xibGssCisJCQkJbWFwLT5tX3BibGssIG1hcC0+bV9sZW4sIGVycik7CisJcmV0dXJuIGVycjsKK30KKworLyoKKyAqIE9fRElSRUNUIGZvciBleHQzIChvciBpbmRpcmVjdCBtYXApIGJhc2VkIGZpbGVzCisgKgorICogSWYgdGhlIE9fRElSRUNUIHdyaXRlIHdpbGwgZXh0ZW5kIHRoZSBmaWxlIHRoZW4gYWRkIHRoaXMgaW5vZGUgdG8gdGhlCisgKiBvcnBoYW4gbGlzdC4gIFNvIHJlY292ZXJ5IHdpbGwgdHJ1bmNhdGUgaXQgYmFjayB0byB0aGUgb3JpZ2luYWwgc2l6ZQorICogaWYgdGhlIG1hY2hpbmUgY3Jhc2hlcyBkdXJpbmcgdGhlIHdyaXRlLgorICoKKyAqIElmIHRoZSBPX0RJUkVDVCB3cml0ZSBpcyBpbnRhbnRpYXRpbmcgaG9sZXMgaW5zaWRlIGlfc2l6ZSBhbmQgdGhlIG1hY2hpbmUKKyAqIGNyYXNoZXMgdGhlbiBzdGFsZSBkaXNrIGRhdGEgX21heV8gYmUgZXhwb3NlZCBpbnNpZGUgdGhlIGZpbGUuIEJ1dCBjdXJyZW50CisgKiBWRlMgY29kZSBmYWxscyBiYWNrIGludG8gYnVmZmVyZWQgcGF0aCBpbiB0aGF0IGNhc2Ugc28gd2UgYXJlIHNhZmUuCisgKi8KK3NzaXplX3QgZXh0NF9pbmRfZGlyZWN0X0lPKGludCBydywgc3RydWN0IGtpb2NiICppb2NiLAorCQkJICAgY29uc3Qgc3RydWN0IGlvdmVjICppb3YsIGxvZmZfdCBvZmZzZXQsCisJCQkgICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MpCit7CisJc3RydWN0IGZpbGUgKmZpbGUgPSBpb2NiLT5raV9maWxwOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX21hcHBpbmctPmhvc3Q7CisJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOworCWhhbmRsZV90ICpoYW5kbGU7CisJc3NpemVfdCByZXQ7CisJaW50IG9ycGhhbiA9IDA7CisJc2l6ZV90IGNvdW50ID0gaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpOworCWludCByZXRyaWVzID0gMDsKKworCWlmIChydyA9PSBXUklURSkgeworCQlsb2ZmX3QgZmluYWxfc2l6ZSA9IG9mZnNldCArIGNvdW50OworCisJCWlmIChmaW5hbF9zaXplID4gaW5vZGUtPmlfc2l6ZSkgeworCQkJLyogQ3JlZGl0cyBmb3Igc2IgKyBpbm9kZSB3cml0ZSAqLworCQkJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCAyKTsKKwkJCWlmIChJU19FUlIoaGFuZGxlKSkgeworCQkJCXJldCA9IFBUUl9FUlIoaGFuZGxlKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXJldCA9IGV4dDRfb3JwaGFuX2FkZChoYW5kbGUsIGlub2RlKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJb3JwaGFuID0gMTsKKwkJCWVpLT5pX2Rpc2tzaXplID0gaW5vZGUtPmlfc2l6ZTsKKwkJCWV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJCX0KKwl9CisKK3JldHJ5OgorCWlmIChydyA9PSBSRUFEICYmIGV4dDRfc2hvdWxkX2Rpb3JlYWRfbm9sb2NrKGlub2RlKSkKKwkJcmV0ID0gX19ibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLAorCQkJCSBpbm9kZS0+aV9zYi0+c19iZGV2LCBpb3YsCisJCQkJIG9mZnNldCwgbnJfc2VncywKKwkJCQkgZXh0NF9nZXRfYmxvY2ssIE5VTEwsIE5VTEwsIDApOworCWVsc2UgeworCQlyZXQgPSBibG9ja2Rldl9kaXJlY3RfSU8ocncsIGlvY2IsIGlub2RlLCBpb3YsCisJCQkJIG9mZnNldCwgbnJfc2VncywgZXh0NF9nZXRfYmxvY2spOworCisJCWlmICh1bmxpa2VseSgocncgJiBXUklURSkgJiYgcmV0IDwgMCkpIHsKKwkJCWxvZmZfdCBpc2l6ZSA9IGlfc2l6ZV9yZWFkKGlub2RlKTsKKwkJCWxvZmZfdCBlbmQgPSBvZmZzZXQgKyBpb3ZfbGVuZ3RoKGlvdiwgbnJfc2Vncyk7CisKKwkJCWlmIChlbmQgPiBpc2l6ZSkKKwkJCQlleHQ0X3RydW5jYXRlX2ZhaWxlZF93cml0ZShpbm9kZSk7CisJCX0KKwl9CisJaWYgKHJldCA9PSAtRU5PU1BDICYmIGV4dDRfc2hvdWxkX3JldHJ5X2FsbG9jKGlub2RlLT5pX3NiLCAmcmV0cmllcykpCisJCWdvdG8gcmV0cnk7CisKKwlpZiAob3JwaGFuKSB7CisJCWludCBlcnI7CisKKwkJLyogQ3JlZGl0cyBmb3Igc2IgKyBpbm9kZSB3cml0ZSAqLworCQloYW5kbGUgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIDIpOworCQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKKwkJCS8qIFRoaXMgaXMgcmVhbGx5IGJhZCBsdWNrLiBXZSd2ZSB3cml0dGVuIHRoZSBkYXRhCisJCQkgKiBidXQgY2Fubm90IGV4dGVuZCBpX3NpemUuIEJhaWwgb3V0IGFuZCBwcmV0ZW5kCisJCQkgKiB0aGUgd3JpdGUgZmFpbGVkLi4uICovCisJCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7CisJCQlpZiAoaW5vZGUtPmlfbmxpbmspCisJCQkJZXh0NF9vcnBoYW5fZGVsKE5VTEwsIGlub2RlKTsKKworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKGlub2RlLT5pX25saW5rKQorCQkJZXh0NF9vcnBoYW5fZGVsKGhhbmRsZSwgaW5vZGUpOworCQlpZiAocmV0ID4gMCkgeworCQkJbG9mZl90IGVuZCA9IG9mZnNldCArIHJldDsKKwkJCWlmIChlbmQgPiBpbm9kZS0+aV9zaXplKSB7CisJCQkJZWktPmlfZGlza3NpemUgPSBlbmQ7CisJCQkJaV9zaXplX3dyaXRlKGlub2RlLCBlbmQpOworCQkJCS8qCisJCQkJICogV2UncmUgZ29pbmcgdG8gcmV0dXJuIGEgcG9zaXRpdmUgYHJldCcKKwkJCQkgKiBoZXJlIGR1ZSB0byBub24temVyby1sZW5ndGggSS9PLCBzbyB0aGVyZSdzCisJCQkJICogbm8gd2F5IG9mIHJlcG9ydGluZyBlcnJvciByZXR1cm5zIGZyb20KKwkJCQkgKiBleHQ0X21hcmtfaW5vZGVfZGlydHkoKSB0byB1c2Vyc3BhY2UuICBTbworCQkJCSAqIGlnbm9yZSBpdC4KKwkJCQkgKi8KKwkJCQlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CisJCQl9CisJCX0KKwkJZXJyID0gZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJcmV0ID0gZXJyOworCX0KK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgbWV0YWRhdGEgYmxvY2tzIG5lZWQgdG8gcmVzZXJ2ZQorICogdG8gYWxsb2NhdGUgYSBuZXcgYmxvY2sgYXQgQGxibG9ja3MgZm9yIG5vbiBleHRlbnQgZmlsZSBiYXNlZCBmaWxlCisgKi8KK2ludCBleHQ0X2luZF9jYWxjX21ldGFkYXRhX2Ftb3VudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzZWN0b3JfdCBsYmxvY2spCit7CisJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOworCXNlY3Rvcl90IGRpbmRfbWFzayA9IH4oKHNlY3Rvcl90KUVYVDRfQUREUl9QRVJfQkxPQ0soaW5vZGUtPmlfc2IpIC0gMSk7CisJaW50IGJsa19iaXRzOworCisJaWYgKGxibG9jayA8IEVYVDRfTkRJUl9CTE9DS1MpCisJCXJldHVybiAwOworCisJbGJsb2NrIC09IEVYVDRfTkRJUl9CTE9DS1M7CisKKwlpZiAoZWktPmlfZGFfbWV0YWRhdGFfY2FsY19sZW4gJiYKKwkgICAgKGxibG9jayAmIGRpbmRfbWFzaykgPT0gZWktPmlfZGFfbWV0YWRhdGFfY2FsY19sYXN0X2xibG9jaykgeworCQllaS0+aV9kYV9tZXRhZGF0YV9jYWxjX2xlbisrOworCQlyZXR1cm4gMDsKKwl9CisJZWktPmlfZGFfbWV0YWRhdGFfY2FsY19sYXN0X2xibG9jayA9IGxibG9jayAmIGRpbmRfbWFzazsKKwllaS0+aV9kYV9tZXRhZGF0YV9jYWxjX2xlbiA9IDE7CisJYmxrX2JpdHMgPSBvcmRlcl9iYXNlXzIobGJsb2NrKTsKKwlyZXR1cm4gKGJsa19iaXRzIC8gRVhUNF9BRERSX1BFUl9CTE9DS19CSVRTKGlub2RlLT5pX3NiKSkgKyAxOworfQorCitpbnQgZXh0NF9pbmRfdHJhbnNfYmxvY2tzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBucmJsb2NrcywgaW50IGNodW5rKQoreworCWludCBpbmRpcmVjdHM7CisKKwkvKiBpZiBucmJsb2NrcyBhcmUgY29udGlndW91cyAqLworCWlmIChjaHVuaykgeworCQkvKgorCQkgKiBXaXRoIE4gY29udGlndW91cyBkYXRhIGJsb2Nrcywgd2UgbmVlZCBhdCBtb3N0CisJCSAqIE4vRVhUNF9BRERSX1BFUl9CTE9DSyhpbm9kZS0+aV9zYikgKyAxIGluZGlyZWN0IGJsb2NrcywKKwkJICogMiBkaW5kaXJlY3QgYmxvY2tzLCBhbmQgMSB0aW5kaXJlY3QgYmxvY2sKKwkJICovCisJCXJldHVybiBESVZfUk9VTkRfVVAobnJibG9ja3MsCisJCQkJICAgIEVYVDRfQUREUl9QRVJfQkxPQ0soaW5vZGUtPmlfc2IpKSArIDQ7CisJfQorCS8qCisJICogaWYgbnJibG9ja3MgYXJlIG5vdCBjb250aWd1b3VzLCB3b3JzZSBjYXNlLCBlYWNoIGJsb2NrIHRvdWNoCisJICogYSBpbmRpcmVjdCBibG9jaywgYW5kIGVhY2ggaW5kaXJlY3QgYmxvY2sgdG91Y2ggYSBkb3VibGUgaW5kaXJlY3QKKwkgKiBibG9jaywgcGx1cyBhIHRyaXBsZSBpbmRpcmVjdCBibG9jaworCSAqLworCWluZGlyZWN0cyA9IG5yYmxvY2tzICogMiArIDE7CisJcmV0dXJuIGluZGlyZWN0czsKK30KKworLyoKKyAqIFRydW5jYXRlIHRyYW5zYWN0aW9ucyBjYW4gYmUgY29tcGxleCBhbmQgYWJzb2x1dGVseSBodWdlLiAgU28gd2UgbmVlZCB0bworICogYmUgYWJsZSB0byByZXN0YXJ0IHRoZSB0cmFuc2FjdGlvbiBhdCBhIGNvbnZlbnRpZW50IGNoZWNrcG9pbnQgdG8gbWFrZQorICogc3VyZSB3ZSBkb24ndCBvdmVyZmxvdyB0aGUgam91cm5hbC4KKyAqCisgKiBzdGFydF90cmFuc2FjdGlvbiBnZXRzIHVzIGEgbmV3IGhhbmRsZSBmb3IgYSB0cnVuY2F0ZSB0cmFuc2FjdGlvbiwKKyAqIGFuZCBleHRlbmRfdHJhbnNhY3Rpb24gdHJpZXMgdG8gZXh0ZW5kIHRoZSBleGlzdGluZyBvbmUgYSBiaXQuICBJZgorICogZXh0ZW5kIGZhaWxzLCB3ZSBuZWVkIHRvIHByb3BhZ2F0ZSB0aGUgZmFpbHVyZSB1cCBhbmQgcmVzdGFydCB0aGUKKyAqIHRyYW5zYWN0aW9uIGluIHRoZSB0b3AtbGV2ZWwgdHJ1bmNhdGUgbG9vcC4gLS1zY3QKKyAqLworc3RhdGljIGhhbmRsZV90ICpzdGFydF90cmFuc2FjdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWhhbmRsZV90ICpyZXN1bHQ7CisKKwlyZXN1bHQgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIGV4dDRfYmxvY2tzX2Zvcl90cnVuY2F0ZShpbm9kZSkpOworCWlmICghSVNfRVJSKHJlc3VsdCkpCisJCXJldHVybiByZXN1bHQ7CisKKwlleHQ0X3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgUFRSX0VSUihyZXN1bHQpKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgorICogVHJ5IHRvIGV4dGVuZCB0aGlzIHRyYW5zYWN0aW9uIGZvciB0aGUgcHVycG9zZXMgb2YgdHJ1bmNhdGlvbi4KKyAqCisgKiBSZXR1cm5zIDAgaWYgd2UgbWFuYWdlZCB0byBjcmVhdGUgbW9yZSByb29tLiAgSWYgd2UgY2FuJ3QgY3JlYXRlIG1vcmUKKyAqIHJvb20sIGFuZCB0aGUgdHJhbnNhY3Rpb24gbXVzdCBiZSByZXN0YXJ0ZWQgd2UgcmV0dXJuIDEuCisgKi8KK3N0YXRpYyBpbnQgdHJ5X3RvX2V4dGVuZF90cmFuc2FjdGlvbihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWlmICghZXh0NF9oYW5kbGVfdmFsaWQoaGFuZGxlKSkKKwkJcmV0dXJuIDA7CisJaWYgKGV4dDRfaGFuZGxlX2hhc19lbm91Z2hfY3JlZGl0cyhoYW5kbGUsIEVYVDRfUkVTRVJWRV9UUkFOU19CTE9DS1MrMSkpCisJCXJldHVybiAwOworCWlmICghZXh0NF9qb3VybmFsX2V4dGVuZChoYW5kbGUsIGV4dDRfYmxvY2tzX2Zvcl90cnVuY2F0ZShpbm9kZSkpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFByb2JhYmx5IGl0IHNob3VsZCBiZSBhIGxpYnJhcnkgZnVuY3Rpb24uLi4gc2VhcmNoIGZvciBmaXJzdCBub24temVybyB3b3JkCisgKiBvciBtZW1jbXAgd2l0aCB6ZXJvX3BhZ2UsIHdoYXRldmVyIGlzIGJldHRlciBmb3IgcGFydGljdWxhciBhcmNoaXRlY3R1cmUuCisgKiBMaW51cz8KKyAqLworc3RhdGljIGlubGluZSBpbnQgYWxsX3plcm9lcyhfX2xlMzIgKnAsIF9fbGUzMiAqcSkKK3sKKwl3aGlsZSAocCA8IHEpCisJCWlmICgqcCsrKQorCQkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKy8qKgorICoJZXh0NF9maW5kX3NoYXJlZCAtIGZpbmQgdGhlIGluZGlyZWN0IGJsb2NrcyBmb3IgcGFydGlhbCB0cnVuY2F0aW9uLgorICoJQGlub2RlOgkgIGlub2RlIGluIHF1ZXN0aW9uCisgKglAZGVwdGg6CSAgZGVwdGggb2YgdGhlIGFmZmVjdGVkIGJyYW5jaAorICoJQG9mZnNldHM6IG9mZnNldHMgb2YgcG9pbnRlcnMgaW4gdGhhdCBicmFuY2ggKHNlZSBleHQ0X2Jsb2NrX3RvX3BhdGgpCisgKglAY2hhaW46CSAgcGxhY2UgdG8gc3RvcmUgdGhlIHBvaW50ZXJzIHRvIHBhcnRpYWwgaW5kaXJlY3QgYmxvY2tzCisgKglAdG9wOgkgIHBsYWNlIHRvIHRoZSAoZGV0YWNoZWQpIHRvcCBvZiBicmFuY2gKKyAqCisgKglUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgZXh0NF90cnVuY2F0ZSgpLgorICoKKyAqCVdoZW4gd2UgZG8gdHJ1bmNhdGUoKSB3ZSBtYXkgaGF2ZSB0byBjbGVhbiB0aGUgZW5kcyBvZiBzZXZlcmFsCisgKglpbmRpcmVjdCBibG9ja3MgYnV0IGxlYXZlIHRoZSBibG9ja3MgdGhlbXNlbHZlcyBhbGl2ZS4gQmxvY2sgaXMKKyAqCXBhcnRpYWxseSB0cnVuY2F0ZWQgaWYgc29tZSBkYXRhIGJlbG93IHRoZSBuZXcgaV9zaXplIGlzIHJlZmVycmVkCisgKglmcm9tIGl0IChhbmQgaXQgaXMgb24gdGhlIHBhdGggdG8gdGhlIGZpcnN0IGNvbXBsZXRlbHkgdHJ1bmNhdGVkCisgKglkYXRhIGJsb2NrLCBpbmRlZWQpLiAgV2UgaGF2ZSB0byBmcmVlIHRoZSB0b3Agb2YgdGhhdCBwYXRoIGFsb25nCisgKgl3aXRoIGV2ZXJ5dGhpbmcgdG8gdGhlIHJpZ2h0IG9mIHRoZSBwYXRoLiBTaW5jZSBubyBhbGxvY2F0aW9uCisgKglwYXN0IHRoZSB0cnVuY2F0aW9uIHBvaW50IGlzIHBvc3NpYmxlIHVudGlsIGV4dDRfdHJ1bmNhdGUoKQorICoJZmluaXNoZXMsIHdlIG1heSBzYWZlbHkgZG8gdGhlIGxhdHRlciwgYnV0IHRvcCBvZiBicmFuY2ggbWF5CisgKglyZXF1aXJlIHNwZWNpYWwgYXR0ZW50aW9uIC0gcGFnZW91dCBiZWxvdyB0aGUgdHJ1bmNhdGlvbiBwb2ludAorICoJbWlnaHQgdHJ5IHRvIHBvcHVsYXRlIGl0LgorICoKKyAqCVdlIGF0b21pY2FsbHkgZGV0YWNoIHRoZSB0b3Agb2YgYnJhbmNoIGZyb20gdGhlIHRyZWUsIHN0b3JlIHRoZQorICoJYmxvY2sgbnVtYmVyIG9mIGl0cyByb290IGluICpAdG9wLCBwb2ludGVycyB0byBidWZmZXJfaGVhZHMgb2YKKyAqCXBhcnRpYWxseSB0cnVuY2F0ZWQgYmxvY2tzIC0gaW4gQGNoYWluW10uYmggYW5kIHBvaW50ZXJzIHRvCisgKgl0aGVpciBsYXN0IGVsZW1lbnRzIHRoYXQgc2hvdWxkIG5vdCBiZSByZW1vdmVkIC0gaW4KKyAqCUBjaGFpbltdLnAuIFJldHVybiB2YWx1ZSBpcyB0aGUgcG9pbnRlciB0byBsYXN0IGZpbGxlZCBlbGVtZW50CisgKglvZiBAY2hhaW4uCisgKgorICoJVGhlIHdvcmsgbGVmdCB0byBjYWxsZXIgdG8gZG8gdGhlIGFjdHVhbCBmcmVlaW5nIG9mIHN1YnRyZWVzOgorICoJCWEpIGZyZWUgdGhlIHN1YnRyZWUgc3RhcnRpbmcgZnJvbSAqQHRvcAorICoJCWIpIGZyZWUgdGhlIHN1YnRyZWVzIHdob3NlIHJvb3RzIGFyZSBzdG9yZWQgaW4KKyAqCQkJKEBjaGFpbltpXS5wKzEgLi4gZW5kIG9mIEBjaGFpbltpXS5iaC0+Yl9kYXRhKQorICoJCWMpIGZyZWUgdGhlIHN1YnRyZWVzIGdyb3dpbmcgZnJvbSB0aGUgaW5vZGUgcGFzdCB0aGUgQGNoYWluWzBdLgorICoJCQkobm8gcGFydGlhbGx5IHRydW5jYXRlZCBzdHVmZiB0aGVyZSkuICAqLworCitzdGF0aWMgSW5kaXJlY3QgKmV4dDRfZmluZF9zaGFyZWQoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGRlcHRoLAorCQkJCSAgZXh0NF9sYmxrX3Qgb2Zmc2V0c1s0XSwgSW5kaXJlY3QgY2hhaW5bNF0sCisJCQkJICBfX2xlMzIgKnRvcCkKK3sKKwlJbmRpcmVjdCAqcGFydGlhbCwgKnA7CisJaW50IGssIGVycjsKKworCSp0b3AgPSAwOworCS8qIE1ha2UgayBpbmRleCB0aGUgZGVlcGVzdCBub24tbnVsbCBvZmZzZXQgKyAxICovCisJZm9yIChrID0gZGVwdGg7IGsgPiAxICYmICFvZmZzZXRzW2stMV07IGstLSkKKwkJOworCXBhcnRpYWwgPSBleHQ0X2dldF9icmFuY2goaW5vZGUsIGssIG9mZnNldHMsIGNoYWluLCAmZXJyKTsKKwkvKiBXcml0ZXI6IHBvaW50ZXJzICovCisJaWYgKCFwYXJ0aWFsKQorCQlwYXJ0aWFsID0gY2hhaW4gKyBrLTE7CisJLyoKKwkgKiBJZiB0aGUgYnJhbmNoIGFjcXVpcmVkIGNvbnRpbnVhdGlvbiBzaW5jZSB3ZSd2ZSBsb29rZWQgYXQgaXQgLQorCSAqIGZpbmUsIGl0IHNob3VsZCBhbGwgc3Vydml2ZSBhbmQgKG5ldykgdG9wIGRvZXNuJ3QgYmVsb25nIHRvIHVzLgorCSAqLworCWlmICghcGFydGlhbC0+a2V5ICYmICpwYXJ0aWFsLT5wKQorCQkvKiBXcml0ZXI6IGVuZCAqLworCQlnb3RvIG5vX3RvcDsKKwlmb3IgKHAgPSBwYXJ0aWFsOyAocCA+IGNoYWluKSAmJiBhbGxfemVyb2VzKChfX2xlMzIgKikgcC0+YmgtPmJfZGF0YSwgcC0+cCk7IHAtLSkKKwkJOworCS8qCisJICogT0ssIHdlJ3ZlIGZvdW5kIHRoZSBsYXN0IGJsb2NrIHRoYXQgbXVzdCBzdXJ2aXZlLiBUaGUgcmVzdCBvZiBvdXIKKwkgKiBicmFuY2ggc2hvdWxkIGJlIGRldGFjaGVkIGJlZm9yZSB1bmxvY2tpbmcuIEhvd2V2ZXIsIGlmIHRoYXQgcmVzdAorCSAqIG9mIGJyYW5jaCBpcyBhbGwgb3VycyBhbmQgZG9lcyBub3QgZ3JvdyBpbW1lZGlhdGVseSBmcm9tIHRoZSBpbm9kZQorCSAqIGl0J3MgZWFzaWVyIHRvIGNoZWF0IGFuZCBqdXN0IGRlY3JlbWVudCBwYXJ0aWFsLT5wLgorCSAqLworCWlmIChwID09IGNoYWluICsgayAtIDEgJiYgcCA+IGNoYWluKSB7CisJCXAtPnAtLTsKKwl9IGVsc2UgeworCQkqdG9wID0gKnAtPnA7CisJCS8qIE5vcGUsIGRvbid0IGRvIHRoaXMgaW4gZXh0NC4gIE11c3QgbGVhdmUgdGhlIHRyZWUgaW50YWN0ICovCisjaWYgMAorCQkqcC0+cCA9IDA7CisjZW5kaWYKKwl9CisJLyogV3JpdGVyOiBlbmQgKi8KKworCXdoaWxlIChwYXJ0aWFsID4gcCkgeworCQlicmVsc2UocGFydGlhbC0+YmgpOworCQlwYXJ0aWFsLS07CisJfQorbm9fdG9wOgorCXJldHVybiBwYXJ0aWFsOworfQorCisvKgorICogWmVybyBhIG51bWJlciBvZiBibG9jayBwb2ludGVycyBpbiBlaXRoZXIgYW4gaW5vZGUgb3IgYW4gaW5kaXJlY3QgYmxvY2suCisgKiBJZiB3ZSByZXN0YXJ0IHRoZSB0cmFuc2FjdGlvbiB3ZSBtdXN0IGFnYWluIGdldCB3cml0ZSBhY2Nlc3MgdG8gdGhlCisgKiBpbmRpcmVjdCBibG9jayBmb3IgZnVydGhlciBtb2RpZmljYXRpb24uCisgKgorICogV2UgcmVsZWFzZSBgY291bnQnIGJsb2NrcyBvbiBkaXNrLCBidXQgKGxhc3QgLSBmaXJzdCkgbWF5IGJlIGdyZWF0ZXIKKyAqIHRoYW4gYGNvdW50JyBiZWNhdXNlIHRoZXJlIGNhbiBiZSBob2xlcyBpbiB0aGVyZS4KKyAqCisgKiBSZXR1cm4gMCBvbiBzdWNjZXNzLCAxIG9uIGludmFsaWQgYmxvY2sgcmFuZ2UKKyAqIGFuZCA8IDAgb24gZmF0YWwgZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgZXh0NF9jbGVhcl9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwKKwkJCSAgICAgZXh0NF9mc2Jsa190IGJsb2NrX3RvX2ZyZWUsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgY291bnQsIF9fbGUzMiAqZmlyc3QsCisJCQkgICAgIF9fbGUzMiAqbGFzdCkKK3sKKwlfX2xlMzIgKnA7CisJaW50CWZsYWdzID0gRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQgfCBFWFQ0X0ZSRUVfQkxPQ0tTX1ZBTElEQVRFRDsKKwlpbnQJZXJyOworCisJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkgfHwgU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKKwkJZmxhZ3MgfD0gRVhUNF9GUkVFX0JMT0NLU19NRVRBREFUQTsKKworCWlmICghZXh0NF9kYXRhX2Jsb2NrX3ZhbGlkKEVYVDRfU0IoaW5vZGUtPmlfc2IpLCBibG9ja190b19mcmVlLAorCQkJCSAgIGNvdW50KSkgeworCQlFWFQ0X0VSUk9SX0lOT0RFKGlub2RlLCAiYXR0ZW1wdCB0byBjbGVhciBpbnZhbGlkICIKKwkJCQkgImJsb2NrcyAlbGx1IGxlbiAlbHUiLAorCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKSBibG9ja190b19mcmVlLCBjb3VudCk7CisJCXJldHVybiAxOworCX0KKworCWlmICh0cnlfdG9fZXh0ZW5kX3RyYW5zYWN0aW9uKGhhbmRsZSwgaW5vZGUpKSB7CisJCWlmIChiaCkgeworCQkJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOworCQkJZXJyID0gZXh0NF9oYW5kbGVfZGlydHlfbWV0YWRhdGEoaGFuZGxlLCBpbm9kZSwgYmgpOworCQkJaWYgKHVubGlrZWx5KGVycikpCisJCQkJZ290byBvdXRfZXJyOworCQl9CisJCWVyciA9IGV4dDRfbWFya19pbm9kZV9kaXJ0eShoYW5kbGUsIGlub2RlKTsKKwkJaWYgKHVubGlrZWx5KGVycikpCisJCQlnb3RvIG91dF9lcnI7CisJCWVyciA9IGV4dDRfdHJ1bmNhdGVfcmVzdGFydF90cmFucyhoYW5kbGUsIGlub2RlLAorCQkJCQlleHQ0X2Jsb2Nrc19mb3JfdHJ1bmNhdGUoaW5vZGUpKTsKKwkJaWYgKHVubGlrZWx5KGVycikpCisJCQlnb3RvIG91dF9lcnI7CisJCWlmIChiaCkgeworCQkJQlVGRkVSX1RSQUNFKGJoLCAicmV0YWtpbmcgd3JpdGUgYWNjZXNzIik7CisJCQllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKKwkJCWlmICh1bmxpa2VseShlcnIpKQorCQkJCWdvdG8gb3V0X2VycjsKKwkJfQorCX0KKworCWZvciAocCA9IGZpcnN0OyBwIDwgbGFzdDsgcCsrKQorCQkqcCA9IDA7CisKKwlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsIGJsb2NrX3RvX2ZyZWUsIGNvdW50LCBmbGFncyk7CisJcmV0dXJuIDA7CitvdXRfZXJyOgorCWV4dDRfc3RkX2Vycm9yKGlub2RlLT5pX3NiLCBlcnIpOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogZXh0NF9mcmVlX2RhdGEgLSBmcmVlIGEgbGlzdCBvZiBkYXRhIGJsb2NrcworICogQGhhbmRsZToJaGFuZGxlIGZvciB0aGlzIHRyYW5zYWN0aW9uCisgKiBAaW5vZGU6CWlub2RlIHdlIGFyZSBkZWFsaW5nIHdpdGgKKyAqIEB0aGlzX2JoOglpbmRpcmVjdCBidWZmZXJfaGVhZCB3aGljaCBjb250YWlucyAqQGZpcnN0IGFuZCAqQGxhc3QKKyAqIEBmaXJzdDoJYXJyYXkgb2YgYmxvY2sgbnVtYmVycworICogQGxhc3Q6CXBvaW50cyBpbW1lZGlhdGVseSBwYXN0IHRoZSBlbmQgb2YgYXJyYXkKKyAqCisgKiBXZSBhcmUgZnJlZWluZyBhbGwgYmxvY2tzIHJlZmVycmVkIGZyb20gdGhhdCBhcnJheSAobnVtYmVycyBhcmUgc3RvcmVkIGFzCisgKiBsaXR0bGUtZW5kaWFuIDMyLWJpdCkgYW5kIHVwZGF0aW5nIEBpbm9kZS0+aV9ibG9ja3MgYXBwcm9wcmlhdGVseS4KKyAqCisgKiBXZSBhY2N1bXVsYXRlIGNvbnRpZ3VvdXMgcnVucyBvZiBibG9ja3MgdG8gZnJlZS4gIENvbnZlbmllbnRseSwgaWYgdGhlc2UKKyAqIGJsb2NrcyBhcmUgY29udGlndW91cyB0aGVuIHJlbGVhc2luZyB0aGVtIGF0IG9uZSB0aW1lIHdpbGwgb25seSBhZmZlY3Qgb25lCisgKiBvciB0d28gYml0bWFwIGJsb2NrcyAoKyBncm91cCBkZXNjcmlwdG9yKHMpIGFuZCBzdXBlcmJsb2NrKSBhbmQgd2Ugd29uJ3QKKyAqIGFjdHVhbGx5IHVzZSBhIGxvdCBvZiBqb3VybmFsIHNwYWNlLgorICoKKyAqIEB0aGlzX2JoIHdpbGwgYmUgJU5VTEwgaWYgQGZpcnN0IGFuZCBAbGFzdCBwb2ludCBpbnRvIHRoZSBpbm9kZSdzIGRpcmVjdAorICogYmxvY2sgcG9pbnRlcnMuCisgKi8KK3N0YXRpYyB2b2lkIGV4dDRfZnJlZV9kYXRhKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRoaXNfYmgsCisJCQkgICBfX2xlMzIgKmZpcnN0LCBfX2xlMzIgKmxhc3QpCit7CisJZXh0NF9mc2Jsa190IGJsb2NrX3RvX2ZyZWUgPSAwOyAgICAvKiBTdGFydGluZyBibG9jayAjIG9mIGEgcnVuICovCisJdW5zaWduZWQgbG9uZyBjb3VudCA9IDA7CSAgICAvKiBOdW1iZXIgb2YgYmxvY2tzIGluIHRoZSBydW4gKi8KKwlfX2xlMzIgKmJsb2NrX3RvX2ZyZWVfcCA9IE5VTEw7CSAgICAvKiBQb2ludGVyIGludG8gaW5vZGUvaW5kCisJCQkJCSAgICAgICBjb3JyZXNwb25kaW5nIHRvCisJCQkJCSAgICAgICBibG9ja190b19mcmVlICovCisJZXh0NF9mc2Jsa190IG5yOwkJICAgIC8qIEN1cnJlbnQgYmxvY2sgIyAqLworCV9fbGUzMiAqcDsJCQkgICAgLyogUG9pbnRlciBpbnRvIGlub2RlL2luZAorCQkJCQkgICAgICAgZm9yIGN1cnJlbnQgYmxvY2sgKi8KKwlpbnQgZXJyID0gMDsKKworCWlmICh0aGlzX2JoKSB7CQkJCS8qIEZvciBpbmRpcmVjdCBibG9jayAqLworCQlCVUZGRVJfVFJBQ0UodGhpc19iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwkJZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCB0aGlzX2JoKTsKKwkJLyogSW1wb3J0YW50OiBpZiB3ZSBjYW4ndCB1cGRhdGUgdGhlIGluZGlyZWN0IHBvaW50ZXJzCisJCSAqIHRvIHRoZSBibG9ja3MsIHdlIGNhbid0IGZyZWUgdGhlbS4gKi8KKwkJaWYgKGVycikKKwkJCXJldHVybjsKKwl9CisKKwlmb3IgKHAgPSBmaXJzdDsgcCA8IGxhc3Q7IHArKykgeworCQluciA9IGxlMzJfdG9fY3B1KCpwKTsKKwkJaWYgKG5yKSB7CisJCQkvKiBhY2N1bXVsYXRlIGJsb2NrcyB0byBmcmVlIGlmIHRoZXkncmUgY29udGlndW91cyAqLworCQkJaWYgKGNvdW50ID09IDApIHsKKwkJCQlibG9ja190b19mcmVlID0gbnI7CisJCQkJYmxvY2tfdG9fZnJlZV9wID0gcDsKKwkJCQljb3VudCA9IDE7CisJCQl9IGVsc2UgaWYgKG5yID09IGJsb2NrX3RvX2ZyZWUgKyBjb3VudCkgeworCQkJCWNvdW50Kys7CisJCQl9IGVsc2UgeworCQkJCWVyciA9IGV4dDRfY2xlYXJfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIHRoaXNfYmgsCisJCQkJCQkgICAgICAgIGJsb2NrX3RvX2ZyZWUsIGNvdW50LAorCQkJCQkJICAgICAgICBibG9ja190b19mcmVlX3AsIHApOworCQkJCWlmIChlcnIpCisJCQkJCWJyZWFrOworCQkJCWJsb2NrX3RvX2ZyZWUgPSBucjsKKwkJCQlibG9ja190b19mcmVlX3AgPSBwOworCQkJCWNvdW50ID0gMTsKKwkJCX0KKwkJfQorCX0KKworCWlmICghZXJyICYmIGNvdW50ID4gMCkKKwkJZXJyID0gZXh0NF9jbGVhcl9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgdGhpc19iaCwgYmxvY2tfdG9fZnJlZSwKKwkJCQkJY291bnQsIGJsb2NrX3RvX2ZyZWVfcCwgcCk7CisJaWYgKGVyciA8IDApCisJCS8qIGZhdGFsIGVycm9yICovCisJCXJldHVybjsKKworCWlmICh0aGlzX2JoKSB7CisJCUJVRkZFUl9UUkFDRSh0aGlzX2JoLCAiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOworCisJCS8qCisJCSAqIFRoZSBidWZmZXIgaGVhZCBzaG91bGQgaGF2ZSBhbiBhdHRhY2hlZCBqb3VybmFsIGhlYWQgYXQgdGhpcworCQkgKiBwb2ludC4gSG93ZXZlciwgaWYgdGhlIGRhdGEgaXMgY29ycnVwdGVkIGFuZCBhbiBpbmRpcmVjdAorCQkgKiBibG9jayBwb2ludGVkIHRvIGl0c2VsZiwgaXQgd291bGQgaGF2ZSBiZWVuIGRldGFjaGVkIHdoZW4KKwkJICogdGhlIGJsb2NrIHdhcyBjbGVhcmVkLiBDaGVjayBmb3IgdGhpcyBpbnN0ZWFkIG9mIE9PUFNpbmcuCisJCSAqLworCQlpZiAoKEVYVDRfSk9VUk5BTChpbm9kZSkgPT0gTlVMTCkgfHwgYmgyamgodGhpc19iaCkpCisJCQlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCB0aGlzX2JoKTsKKwkJZWxzZQorCQkJRVhUNF9FUlJPUl9JTk9ERShpbm9kZSwKKwkJCQkJICJjaXJjdWxhciBpbmRpcmVjdCBibG9jayBkZXRlY3RlZCBhdCAiCisJCQkJCSAiYmxvY2sgJWxsdSIsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgdGhpc19iaC0+Yl9ibG9ja25yKTsKKwl9Cit9CisKKy8qKgorICoJZXh0NF9mcmVlX2JyYW5jaGVzIC0gZnJlZSBhbiBhcnJheSBvZiBicmFuY2hlcworICoJQGhhbmRsZTogSkJEIGhhbmRsZSBmb3IgdGhpcyB0cmFuc2FjdGlvbgorICoJQGlub2RlOglpbm9kZSB3ZSBhcmUgZGVhbGluZyB3aXRoCisgKglAcGFyZW50X2JoOiB0aGUgYnVmZmVyX2hlYWQgd2hpY2ggY29udGFpbnMgKkBmaXJzdCBhbmQgKkBsYXN0CisgKglAZmlyc3Q6CWFycmF5IG9mIGJsb2NrIG51bWJlcnMKKyAqCUBsYXN0Oglwb2ludGVyIGltbWVkaWF0ZWx5IHBhc3QgdGhlIGVuZCBvZiBhcnJheQorICoJQGRlcHRoOglkZXB0aCBvZiB0aGUgYnJhbmNoZXMgdG8gZnJlZQorICoKKyAqCVdlIGFyZSBmcmVlaW5nIGFsbCBibG9ja3MgcmVmZXJyZWQgZnJvbSB0aGVzZSBicmFuY2hlcyAobnVtYmVycyBhcmUKKyAqCXN0b3JlZCBhcyBsaXR0bGUtZW5kaWFuIDMyLWJpdCkgYW5kIHVwZGF0aW5nIEBpbm9kZS0+aV9ibG9ja3MKKyAqCWFwcHJvcHJpYXRlbHkuCisgKi8KK3N0YXRpYyB2b2lkIGV4dDRfZnJlZV9icmFuY2hlcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAorCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqcGFyZW50X2JoLAorCQkJICAgICAgIF9fbGUzMiAqZmlyc3QsIF9fbGUzMiAqbGFzdCwgaW50IGRlcHRoKQoreworCWV4dDRfZnNibGtfdCBucjsKKwlfX2xlMzIgKnA7CisKKwlpZiAoZXh0NF9oYW5kbGVfaXNfYWJvcnRlZChoYW5kbGUpKQorCQlyZXR1cm47CisKKwlpZiAoZGVwdGgtLSkgeworCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOworCQlpbnQgYWRkcl9wZXJfYmxvY2sgPSBFWFQ0X0FERFJfUEVSX0JMT0NLKGlub2RlLT5pX3NiKTsKKwkJcCA9IGxhc3Q7CisJCXdoaWxlICgtLXAgPj0gZmlyc3QpIHsKKwkJCW5yID0gbGUzMl90b19jcHUoKnApOworCQkJaWYgKCFucikKKwkJCQljb250aW51ZTsJCS8qIEEgaG9sZSAqLworCisJCQlpZiAoIWV4dDRfZGF0YV9ibG9ja192YWxpZChFWFQ0X1NCKGlub2RlLT5pX3NiKSwKKwkJCQkJCSAgIG5yLCAxKSkgeworCQkJCUVYVDRfRVJST1JfSU5PREUoaW5vZGUsCisJCQkJCQkgImludmFsaWQgaW5kaXJlY3QgbWFwcGVkICIKKwkJCQkJCSAiYmxvY2sgJWx1IChsZXZlbCAlZCkiLAorCQkJCQkJICh1bnNpZ25lZCBsb25nKSBuciwgZGVwdGgpOworCQkJCWJyZWFrOworCQkJfQorCisJCQkvKiBHbyByZWFkIHRoZSBidWZmZXIgZm9yIHRoZSBuZXh0IGxldmVsIGRvd24gKi8KKwkJCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIG5yKTsKKworCQkJLyoKKwkJCSAqIEEgcmVhZCBmYWlsdXJlPyBSZXBvcnQgZXJyb3IgYW5kIGNsZWFyIHNsb3QKKwkJCSAqIChzaG91bGQgYmUgcmFyZSkuCisJCQkgKi8KKwkJCWlmICghYmgpIHsKKwkJCQlFWFQ0X0VSUk9SX0lOT0RFX0JMT0NLKGlub2RlLCBuciwKKwkJCQkJCSAgICAgICAiUmVhZCBmYWlsdXJlIik7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIFRoaXMgemFwcyB0aGUgZW50aXJlIGJsb2NrLiAgQm90dG9tIHVwLiAqLworCQkJQlVGRkVSX1RSQUNFKGJoLCAiZnJlZSBjaGlsZCBicmFuY2hlcyIpOworCQkJZXh0NF9mcmVlX2JyYW5jaGVzKGhhbmRsZSwgaW5vZGUsIGJoLAorCQkJCQkoX19sZTMyICopIGJoLT5iX2RhdGEsCisJCQkJCShfX2xlMzIgKikgYmgtPmJfZGF0YSArIGFkZHJfcGVyX2Jsb2NrLAorCQkJCQlkZXB0aCk7CisJCQlicmVsc2UoYmgpOworCisJCQkvKgorCQkJICogRXZlcnl0aGluZyBiZWxvdyB0aGlzIHRoaXMgcG9pbnRlciBoYXMgYmVlbgorCQkJICogcmVsZWFzZWQuICBOb3cgbGV0IHRoaXMgdG9wLW9mLXN1YnRyZWUgZ28uCisJCQkgKgorCQkJICogV2Ugd2FudCB0aGUgZnJlZWluZyBvZiB0aGlzIGluZGlyZWN0IGJsb2NrIHRvIGJlCisJCQkgKiBhdG9taWMgaW4gdGhlIGpvdXJuYWwgd2l0aCB0aGUgdXBkYXRpbmcgb2YgdGhlCisJCQkgKiBiaXRtYXAgYmxvY2sgd2hpY2ggb3ducyBpdC4gIFNvIG1ha2Ugc29tZSByb29tIGluCisJCQkgKiB0aGUgam91cm5hbC4KKwkJCSAqCisJCQkgKiBXZSB6ZXJvIHRoZSBwYXJlbnQgcG9pbnRlciAqYWZ0ZXIqIGZyZWVpbmcgaXRzCisJCQkgKiBwb2ludGVlIGluIHRoZSBiaXRtYXBzLCBzbyBpZiBleHRlbmRfdHJhbnNhY3Rpb24oKQorCQkJICogZm9yIHNvbWUgcmVhc29uIGZhaWxzIHRvIHB1dCB0aGUgYml0bWFwIGNoYW5nZXMgYW5kCisJCQkgKiB0aGUgcmVsZWFzZSBpbnRvIHRoZSBzYW1lIHRyYW5zYWN0aW9uLCByZWNvdmVyeQorCQkJICogd2lsbCBtZXJlbHkgY29tcGxhaW4gYWJvdXQgcmVsZWFzaW5nIGEgZnJlZSBibG9jaywKKwkJCSAqIHJhdGhlciB0aGFuIGxlYWtpbmcgYmxvY2tzLgorCQkJICovCisJCQlpZiAoZXh0NF9oYW5kbGVfaXNfYWJvcnRlZChoYW5kbGUpKQorCQkJCXJldHVybjsKKwkJCWlmICh0cnlfdG9fZXh0ZW5kX3RyYW5zYWN0aW9uKGhhbmRsZSwgaW5vZGUpKSB7CisJCQkJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOworCQkJCWV4dDRfdHJ1bmNhdGVfcmVzdGFydF90cmFucyhoYW5kbGUsIGlub2RlLAorCQkJCQkgICAgZXh0NF9ibG9ja3NfZm9yX3RydW5jYXRlKGlub2RlKSk7CisJCQl9CisKKwkJCS8qCisJCQkgKiBUaGUgZm9yZ2V0IGZsYWcgaGVyZSBpcyBjcml0aWNhbCBiZWNhdXNlIGlmCisJCQkgKiB3ZSBhcmUgam91cm5hbGluZyAoYW5kIG5vdCBkb2luZyBkYXRhCisJCQkgKiBqb3VybmFsaW5nKSwgd2UgaGF2ZSB0byBtYWtlIHN1cmUgYSByZXZva2UKKwkJCSAqIHJlY29yZCBpcyB3cml0dGVuIHRvIHByZXZlbnQgdGhlIGpvdXJuYWwKKwkJCSAqIHJlcGxheSBmcm9tIG92ZXJ3cml0aW5nIHRoZSAoZm9ybWVyKQorCQkJICogaW5kaXJlY3QgYmxvY2sgaWYgaXQgZ2V0cyByZWFsbG9jYXRlZCBhcyBhCisJCQkgKiBkYXRhIGJsb2NrLiAgVGhpcyBtdXN0IGhhcHBlbiBpbiB0aGUgc2FtZQorCQkJICogdHJhbnNhY3Rpb24gd2hlcmUgdGhlIGRhdGEgYmxvY2tzIGFyZQorCQkJICogYWN0dWFsbHkgZnJlZWQuCisJCQkgKi8KKwkJCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgTlVMTCwgbnIsIDEsCisJCQkJCSBFWFQ0X0ZSRUVfQkxPQ0tTX01FVEFEQVRBfAorCQkJCQkgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpOworCisJCQlpZiAocGFyZW50X2JoKSB7CisJCQkJLyoKKwkJCQkgKiBUaGUgYmxvY2sgd2hpY2ggd2UgaGF2ZSBqdXN0IGZyZWVkIGlzCisJCQkJICogcG9pbnRlZCB0byBieSBhbiBpbmRpcmVjdCBibG9jazogam91cm5hbCBpdAorCQkJCSAqLworCQkJCUJVRkZFUl9UUkFDRShwYXJlbnRfYmgsICJnZXRfd3JpdGVfYWNjZXNzIik7CisJCQkJaWYgKCFleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsCisJCQkJCQkJCSAgIHBhcmVudF9iaCkpeworCQkJCQkqcCA9IDA7CisJCQkJCUJVRkZFUl9UUkFDRShwYXJlbnRfYmgsCisJCQkJCSJjYWxsIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhIik7CisJCQkJCWV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwKKwkJCQkJCQkJICAgaW5vZGUsCisJCQkJCQkJCSAgIHBhcmVudF9iaCk7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLyogV2UgaGF2ZSByZWFjaGVkIHRoZSBib3R0b20gb2YgdGhlIHRyZWUuICovCisJCUJVRkZFUl9UUkFDRShwYXJlbnRfYmgsICJmcmVlIGRhdGEgYmxvY2tzIik7CisJCWV4dDRfZnJlZV9kYXRhKGhhbmRsZSwgaW5vZGUsIHBhcmVudF9iaCwgZmlyc3QsIGxhc3QpOworCX0KK30KKwordm9pZCBleHQ0X2luZF90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCWhhbmRsZV90ICpoYW5kbGU7CisJc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOworCV9fbGUzMiAqaV9kYXRhID0gZWktPmlfZGF0YTsKKwlpbnQgYWRkcl9wZXJfYmxvY2sgPSBFWFQ0X0FERFJfUEVSX0JMT0NLKGlub2RlLT5pX3NiKTsKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisJZXh0NF9sYmxrX3Qgb2Zmc2V0c1s0XTsKKwlJbmRpcmVjdCBjaGFpbls0XTsKKwlJbmRpcmVjdCAqcGFydGlhbDsKKwlfX2xlMzIgbnIgPSAwOworCWludCBuID0gMDsKKwlleHQ0X2xibGtfdCBsYXN0X2Jsb2NrLCBtYXhfYmxvY2s7CisJdW5zaWduZWQgYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOworCisJaGFuZGxlID0gc3RhcnRfdHJhbnNhY3Rpb24oaW5vZGUpOworCWlmIChJU19FUlIoaGFuZGxlKSkKKwkJcmV0dXJuOwkJLyogQUtQTTogcmV0dXJuIHdoYXQ/ICovCisKKwlsYXN0X2Jsb2NrID0gKGlub2RlLT5pX3NpemUgKyBibG9ja3NpemUtMSkKKwkJCQkJPj4gRVhUNF9CTE9DS19TSVpFX0JJVFMoaW5vZGUtPmlfc2IpOworCW1heF9ibG9jayA9IChFWFQ0X1NCKGlub2RlLT5pX3NiKS0+c19iaXRtYXBfbWF4Ynl0ZXMgKyBibG9ja3NpemUtMSkKKwkJCQkJPj4gRVhUNF9CTE9DS19TSVpFX0JJVFMoaW5vZGUtPmlfc2IpOworCisJaWYgKGlub2RlLT5pX3NpemUgJiAoYmxvY2tzaXplIC0gMSkpCisJCWlmIChleHQ0X2Jsb2NrX3RydW5jYXRlX3BhZ2UoaGFuZGxlLCBtYXBwaW5nLCBpbm9kZS0+aV9zaXplKSkKKwkJCWdvdG8gb3V0X3N0b3A7CisKKwlpZiAobGFzdF9ibG9jayAhPSBtYXhfYmxvY2spIHsKKwkJbiA9IGV4dDRfYmxvY2tfdG9fcGF0aChpbm9kZSwgbGFzdF9ibG9jaywgb2Zmc2V0cywgTlVMTCk7CisJCWlmIChuID09IDApCisJCQlnb3RvIG91dF9zdG9wOwkvKiBlcnJvciAqLworCX0KKworCS8qCisJICogT0suICBUaGlzIHRydW5jYXRlIGlzIGdvaW5nIHRvIGhhcHBlbi4gIFdlIGFkZCB0aGUgaW5vZGUgdG8gdGhlCisJICogb3JwaGFuIGxpc3QsIHNvIHRoYXQgaWYgdGhpcyB0cnVuY2F0ZSBzcGFucyBtdWx0aXBsZSB0cmFuc2FjdGlvbnMsCisJICogYW5kIHdlIGNyYXNoLCB3ZSB3aWxsIHJlc3VtZSB0aGUgdHJ1bmNhdGUgd2hlbiB0aGUgZmlsZXN5c3RlbQorCSAqIHJlY292ZXJzLiAgSXQgYWxzbyBtYXJrcyB0aGUgaW5vZGUgZGlydHksIHRvIGNhdGNoIHRoZSBuZXcgc2l6ZS4KKwkgKgorCSAqIEltcGxpY2F0aW9uOiB0aGUgZmlsZSBtdXN0IGFsd2F5cyBiZSBpbiBhIHNhbmUsIGNvbnNpc3RlbnQKKwkgKiB0cnVuY2F0YWJsZSBzdGF0ZSB3aGlsZSBlYWNoIHRyYW5zYWN0aW9uIGNvbW1pdHMuCisJICovCisJaWYgKGV4dDRfb3JwaGFuX2FkZChoYW5kbGUsIGlub2RlKSkKKwkJZ290byBvdXRfc3RvcDsKKworCS8qCisJICogRnJvbSBoZXJlIHdlIGJsb2NrIG91dCBhbGwgZXh0NF9nZXRfYmxvY2soKSBjYWxsZXJzIHdobyB3YW50IHRvCisJICogbW9kaWZ5IHRoZSBibG9jayBhbGxvY2F0aW9uIHRyZWUuCisJICovCisJZG93bl93cml0ZSgmZWktPmlfZGF0YV9zZW0pOworCisJZXh0NF9kaXNjYXJkX3ByZWFsbG9jYXRpb25zKGlub2RlKTsKKworCS8qCisJICogVGhlIG9ycGhhbiBsaXN0IGVudHJ5IHdpbGwgbm93IHByb3RlY3QgdXMgZnJvbSBhbnkgY3Jhc2ggd2hpY2gKKwkgKiBvY2N1cnMgYmVmb3JlIHRoZSB0cnVuY2F0ZSBjb21wbGV0ZXMsIHNvIGl0IGlzIG5vdyBzYWZlIHRvIHByb3BhZ2F0ZQorCSAqIHRoZSBuZXcsIHNob3J0ZXIgaW5vZGUgc2l6ZSAoaGVsZCBmb3Igbm93IGluIGlfc2l6ZSkgaW50byB0aGUKKwkgKiBvbi1kaXNrIGlub2RlLiBXZSBkbyB0aGlzIHZpYSBpX2Rpc2tzaXplLCB3aGljaCBpcyB0aGUgdmFsdWUgd2hpY2gKKwkgKiBleHQ0ICpyZWFsbHkqIHdyaXRlcyBvbnRvIHRoZSBkaXNrIGlub2RlLgorCSAqLworCWVpLT5pX2Rpc2tzaXplID0gaW5vZGUtPmlfc2l6ZTsKKworCWlmIChsYXN0X2Jsb2NrID09IG1heF9ibG9jaykgeworCQkvKgorCQkgKiBJdCBpcyB1bm5lY2Vzc2FyeSB0byBmcmVlIGFueSBkYXRhIGJsb2NrcyBpZiBsYXN0X2Jsb2NrIGlzCisJCSAqIGVxdWFsIHRvIHRoZSBpbmRpcmVjdCBibG9jayBsaW1pdC4KKwkJICovCisJCWdvdG8gb3V0X3VubG9jazsKKwl9IGVsc2UgaWYgKG4gPT0gMSkgewkJLyogZGlyZWN0IGJsb2NrcyAqLworCQlleHQ0X2ZyZWVfZGF0YShoYW5kbGUsIGlub2RlLCBOVUxMLCBpX2RhdGErb2Zmc2V0c1swXSwKKwkJCSAgICAgICBpX2RhdGEgKyBFWFQ0X05ESVJfQkxPQ0tTKTsKKwkJZ290byBkb19pbmRpcmVjdHM7CisJfQorCisJcGFydGlhbCA9IGV4dDRfZmluZF9zaGFyZWQoaW5vZGUsIG4sIG9mZnNldHMsIGNoYWluLCAmbnIpOworCS8qIEtpbGwgdGhlIHRvcCBvZiBzaGFyZWQgYnJhbmNoIChub3QgZGV0YWNoZWQpICovCisJaWYgKG5yKSB7CisJCWlmIChwYXJ0aWFsID09IGNoYWluKSB7CisJCQkvKiBTaGFyZWQgYnJhbmNoIGdyb3dzIGZyb20gdGhlIGlub2RlICovCisJCQlleHQ0X2ZyZWVfYnJhbmNoZXMoaGFuZGxlLCBpbm9kZSwgTlVMTCwKKwkJCQkJICAgJm5yLCAmbnIrMSwgKGNoYWluK24tMSkgLSBwYXJ0aWFsKTsKKwkJCSpwYXJ0aWFsLT5wID0gMDsKKwkJCS8qCisJCQkgKiBXZSBtYXJrIHRoZSBpbm9kZSBkaXJ0eSBwcmlvciB0byByZXN0YXJ0LAorCQkJICogYW5kIHByaW9yIHRvIHN0b3AuICBObyBuZWVkIGZvciBpdCBoZXJlLgorCQkJICovCisJCX0gZWxzZSB7CisJCQkvKiBTaGFyZWQgYnJhbmNoIGdyb3dzIGZyb20gYW4gaW5kaXJlY3QgYmxvY2sgKi8KKwkJCUJVRkZFUl9UUkFDRShwYXJ0aWFsLT5iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKKwkJCWV4dDRfZnJlZV9icmFuY2hlcyhoYW5kbGUsIGlub2RlLCBwYXJ0aWFsLT5iaCwKKwkJCQkJcGFydGlhbC0+cCwKKwkJCQkJcGFydGlhbC0+cCsxLCAoY2hhaW4rbi0xKSAtIHBhcnRpYWwpOworCQl9CisJfQorCS8qIENsZWFyIHRoZSBlbmRzIG9mIGluZGlyZWN0IGJsb2NrcyBvbiB0aGUgc2hhcmVkIGJyYW5jaCAqLworCXdoaWxlIChwYXJ0aWFsID4gY2hhaW4pIHsKKwkJZXh0NF9mcmVlX2JyYW5jaGVzKGhhbmRsZSwgaW5vZGUsIHBhcnRpYWwtPmJoLCBwYXJ0aWFsLT5wICsgMSwKKwkJCQkgICAoX19sZTMyKilwYXJ0aWFsLT5iaC0+Yl9kYXRhK2FkZHJfcGVyX2Jsb2NrLAorCQkJCSAgIChjaGFpbituLTEpIC0gcGFydGlhbCk7CisJCUJVRkZFUl9UUkFDRShwYXJ0aWFsLT5iaCwgImNhbGwgYnJlbHNlIik7CisJCWJyZWxzZShwYXJ0aWFsLT5iaCk7CisJCXBhcnRpYWwtLTsKKwl9Citkb19pbmRpcmVjdHM6CisJLyogS2lsbCB0aGUgcmVtYWluaW5nICh3aG9sZSkgc3VidHJlZXMgKi8KKwlzd2l0Y2ggKG9mZnNldHNbMF0pIHsKKwlkZWZhdWx0OgorCQluciA9IGlfZGF0YVtFWFQ0X0lORF9CTE9DS107CisJCWlmIChucikgeworCQkJZXh0NF9mcmVlX2JyYW5jaGVzKGhhbmRsZSwgaW5vZGUsIE5VTEwsICZuciwgJm5yKzEsIDEpOworCQkJaV9kYXRhW0VYVDRfSU5EX0JMT0NLXSA9IDA7CisJCX0KKwljYXNlIEVYVDRfSU5EX0JMT0NLOgorCQluciA9IGlfZGF0YVtFWFQ0X0RJTkRfQkxPQ0tdOworCQlpZiAobnIpIHsKKwkJCWV4dDRfZnJlZV9icmFuY2hlcyhoYW5kbGUsIGlub2RlLCBOVUxMLCAmbnIsICZucisxLCAyKTsKKwkJCWlfZGF0YVtFWFQ0X0RJTkRfQkxPQ0tdID0gMDsKKwkJfQorCWNhc2UgRVhUNF9ESU5EX0JMT0NLOgorCQluciA9IGlfZGF0YVtFWFQ0X1RJTkRfQkxPQ0tdOworCQlpZiAobnIpIHsKKwkJCWV4dDRfZnJlZV9icmFuY2hlcyhoYW5kbGUsIGlub2RlLCBOVUxMLCAmbnIsICZucisxLCAzKTsKKwkJCWlfZGF0YVtFWFQ0X1RJTkRfQkxPQ0tdID0gMDsKKwkJfQorCWNhc2UgRVhUNF9USU5EX0JMT0NLOgorCQk7CisJfQorCitvdXRfdW5sb2NrOgorCXVwX3dyaXRlKCZlaS0+aV9kYXRhX3NlbSk7CisJaW5vZGUtPmlfbXRpbWUgPSBpbm9kZS0+aV9jdGltZSA9IGV4dDRfY3VycmVudF90aW1lKGlub2RlKTsKKwlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CisKKwkvKgorCSAqIEluIGEgbXVsdGktdHJhbnNhY3Rpb24gdHJ1bmNhdGUsIHdlIG9ubHkgbWFrZSB0aGUgZmluYWwgdHJhbnNhY3Rpb24KKwkgKiBzeW5jaHJvbm91cworCSAqLworCWlmIChJU19TWU5DKGlub2RlKSkKKwkJZXh0NF9oYW5kbGVfc3luYyhoYW5kbGUpOworb3V0X3N0b3A6CisJLyoKKwkgKiBJZiB0aGlzIHdhcyBhIHNpbXBsZSBmdHJ1bmNhdGUoKSwgYW5kIHRoZSBmaWxlIHdpbGwgcmVtYWluIGFsaXZlCisJICogdGhlbiB3ZSBuZWVkIHRvIGNsZWFyIHVwIHRoZSBvcnBoYW4gcmVjb3JkIHdoaWNoIHdlIGNyZWF0ZWQgYWJvdmUuCisJICogSG93ZXZlciwgaWYgdGhpcyB3YXMgYSByZWFsIHVubGluayB0aGVuIHdlIHdlcmUgY2FsbGVkIGJ5CisJICogZXh0NF9kZWxldGVfaW5vZGUoKSwgYW5kIHdlIGFsbG93IHRoYXQgZnVuY3Rpb24gdG8gY2xlYW4gdXAgdGhlCisJICogb3JwaGFuIGluZm8gZm9yIHVzLgorCSAqLworCWlmIChpbm9kZS0+aV9ubGluaykKKwkJZXh0NF9vcnBoYW5fZGVsKGhhbmRsZSwgaW5vZGUpOworCisJZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKKwl0cmFjZV9leHQ0X3RydW5jYXRlX2V4aXQoaW5vZGUpOworfQorCmRpZmYgLS1naXQgYS9mcy9leHQ0L2lub2RlLmMgYi9mcy9leHQ0L2lub2RlLmMKaW5kZXggM2U1MTkxZi4uZDQ3MjY0YyAxMDA2NDQKLS0tIGEvZnMvZXh0NC9pbm9kZS5jCisrKyBiL2ZzL2V4dDQvaW5vZGUuYwpAQCAtMTIsMTAgKzEyLDYgQEAKICAqCiAgKiAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyICBMaW51cyBUb3J2YWxkcwogICoKLSAqICBHb2FsLWRpcmVjdGVkIGJsb2NrIGFsbG9jYXRpb24gYnkgU3RlcGhlbiBUd2VlZGllCi0gKgkoc2N0QHJlZGhhdC5jb20pLCAxOTkzLCAxOTk4Ci0gKiAgQmlnLWVuZGlhbiB0byBsaXR0bGUtZW5kaWFuIGJ5dGUtc3dhcHBpbmcvYml0bWFwcyBieQotICogICAgICAgIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AY2FpcC5ydXRnZXJzLmVkdSksIDE5OTUKICAqICA2NC1iaXQgZmlsZSBzdXBwb3J0IG9uIDY0LWJpdCBwbGF0Zm9ybXMgYnkgSmFrdWIgSmVsaW5lawogICoJKGpqQHN1bnNpdGUubXMubWZmLmN1bmkuY3opCiAgKgpAQCAtNDcsNiArNDMsNyBAQAogI2luY2x1ZGUgInhhdHRyLmgiCiAjaW5jbHVkZSAiYWNsLmgiCiAjaW5jbHVkZSAiZXh0NF9leHRlbnRzLmgiCisjaW5jbHVkZSAidHJ1bmNhdGUuaCIKIAogI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9leHQ0Lmg+CiAKQEAgLTg5LDcyICs4Niw2IEBACiB9CiAKIC8qCi0gKiBXb3JrIG91dCBob3cgbWFueSBibG9ja3Mgd2UgbmVlZCB0byBwcm9jZWVkIHdpdGggdGhlIG5leHQgY2h1bmsgb2YgYQotICogdHJ1bmNhdGUgdHJhbnNhY3Rpb24uCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIGJsb2Nrc19mb3JfdHJ1bmNhdGUoc3RydWN0IGlub2RlICppbm9kZSkKLXsKLQlleHQ0X2xibGtfdCBuZWVkZWQ7Ci0KLQluZWVkZWQgPSBpbm9kZS0+aV9ibG9ja3MgPj4gKGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gOSk7Ci0KLQkvKiBHaXZlIG91cnNlbHZlcyBqdXN0IGVub3VnaCByb29tIHRvIGNvcGUgd2l0aCBpbm9kZXMgaW4gd2hpY2gKLQkgKiBpX2Jsb2NrcyBpcyBjb3JydXB0OiB3ZSd2ZSBzZWVuIGRpc2sgY29ycnVwdGlvbnMgaW4gdGhlIHBhc3QKLQkgKiB3aGljaCByZXN1bHRlZCBpbiByYW5kb20gZGF0YSBpbiBhbiBpbm9kZSB3aGljaCBsb29rZWQgZW5vdWdoCi0JICogbGlrZSBhIHJlZ3VsYXIgZmlsZSBmb3IgZXh0NCB0byB0cnkgdG8gZGVsZXRlIGl0LiAgVGhpbmdzCi0JICogd2lsbCBnbyBhIGJpdCBjcmF6eSBpZiB0aGF0IGhhcHBlbnMsIGJ1dCBhdCBsZWFzdCB3ZSBzaG91bGQKLQkgKiB0cnkgbm90IHRvIHBhbmljIHRoZSB3aG9sZSBrZXJuZWwuICovCi0JaWYgKG5lZWRlZCA8IDIpCi0JCW5lZWRlZCA9IDI7Ci0KLQkvKiBCdXQgd2UgbmVlZCB0byBib3VuZCB0aGUgdHJhbnNhY3Rpb24gc28gd2UgZG9uJ3Qgb3ZlcmZsb3cgdGhlCi0JICogam91cm5hbC4gKi8KLQlpZiAobmVlZGVkID4gRVhUNF9NQVhfVFJBTlNfREFUQSkKLQkJbmVlZGVkID0gRVhUNF9NQVhfVFJBTlNfREFUQTsKLQotCXJldHVybiBFWFQ0X0RBVEFfVFJBTlNfQkxPQ0tTKGlub2RlLT5pX3NiKSArIG5lZWRlZDsKLX0KLQotLyoKLSAqIFRydW5jYXRlIHRyYW5zYWN0aW9ucyBjYW4gYmUgY29tcGxleCBhbmQgYWJzb2x1dGVseSBodWdlLiAgU28gd2UgbmVlZCB0bwotICogYmUgYWJsZSB0byByZXN0YXJ0IHRoZSB0cmFuc2FjdGlvbiBhdCBhIGNvbnZlbnRpZW50IGNoZWNrcG9pbnQgdG8gbWFrZQotICogc3VyZSB3ZSBkb24ndCBvdmVyZmxvdyB0aGUgam91cm5hbC4KLSAqCi0gKiBzdGFydF90cmFuc2FjdGlvbiBnZXRzIHVzIGEgbmV3IGhhbmRsZSBmb3IgYSB0cnVuY2F0ZSB0cmFuc2FjdGlvbiwKLSAqIGFuZCBleHRlbmRfdHJhbnNhY3Rpb24gdHJpZXMgdG8gZXh0ZW5kIHRoZSBleGlzdGluZyBvbmUgYSBiaXQuICBJZgotICogZXh0ZW5kIGZhaWxzLCB3ZSBuZWVkIHRvIHByb3BhZ2F0ZSB0aGUgZmFpbHVyZSB1cCBhbmQgcmVzdGFydCB0aGUKLSAqIHRyYW5zYWN0aW9uIGluIHRoZSB0b3AtbGV2ZWwgdHJ1bmNhdGUgbG9vcC4gLS1zY3QKLSAqLwotc3RhdGljIGhhbmRsZV90ICpzdGFydF90cmFuc2FjdGlvbihzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCWhhbmRsZV90ICpyZXN1bHQ7Ci0KLQlyZXN1bHQgPSBleHQ0X2pvdXJuYWxfc3RhcnQoaW5vZGUsIGJsb2Nrc19mb3JfdHJ1bmNhdGUoaW5vZGUpKTsKLQlpZiAoIUlTX0VSUihyZXN1bHQpKQotCQlyZXR1cm4gcmVzdWx0OwotCi0JZXh0NF9zdGRfZXJyb3IoaW5vZGUtPmlfc2IsIFBUUl9FUlIocmVzdWx0KSk7Ci0JcmV0dXJuIHJlc3VsdDsKLX0KLQotLyoKLSAqIFRyeSB0byBleHRlbmQgdGhpcyB0cmFuc2FjdGlvbiBmb3IgdGhlIHB1cnBvc2VzIG9mIHRydW5jYXRpb24uCi0gKgotICogUmV0dXJucyAwIGlmIHdlIG1hbmFnZWQgdG8gY3JlYXRlIG1vcmUgcm9vbS4gIElmIHdlIGNhbid0IGNyZWF0ZSBtb3JlCi0gKiByb29tLCBhbmQgdGhlIHRyYW5zYWN0aW9uIG11c3QgYmUgcmVzdGFydGVkIHdlIHJldHVybiAxLgotICovCi1zdGF0aWMgaW50IHRyeV90b19leHRlbmRfdHJhbnNhY3Rpb24oaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSkKLXsKLQlpZiAoIWV4dDRfaGFuZGxlX3ZhbGlkKGhhbmRsZSkpCi0JCXJldHVybiAwOwotCWlmIChleHQ0X2hhbmRsZV9oYXNfZW5vdWdoX2NyZWRpdHMoaGFuZGxlLCBFWFQ0X1JFU0VSVkVfVFJBTlNfQkxPQ0tTKzEpKQotCQlyZXR1cm4gMDsKLQlpZiAoIWV4dDRfam91cm5hbF9leHRlbmQoaGFuZGxlLCBibG9ja3NfZm9yX3RydW5jYXRlKGlub2RlKSkpCi0JCXJldHVybiAwOwotCXJldHVybiAxOwotfQotCi0vKgogICogUmVzdGFydCB0aGUgdHJhbnNhY3Rpb24gYXNzb2NpYXRlZCB3aXRoICpoYW5kbGUuICBUaGlzIGRvZXMgYSBjb21taXQsCiAgKiBzbyBiZWZvcmUgd2UgY2FsbCBoZXJlIGV2ZXJ5dGhpbmcgbXVzdCBiZSBjb25zaXN0ZW50bHkgZGlydGllZCBhZ2FpbnN0CiAgKiB0aGlzIHRyYW5zYWN0aW9uLgpAQCAtMTkwLDYgKzEyMSwzMyBAQAogCiAJdHJhY2VfZXh0NF9ldmljdF9pbm9kZShpbm9kZSk7CiAJaWYgKGlub2RlLT5pX25saW5rKSB7CisJCS8qCisJCSAqIFdoZW4gam91cm5hbGxpbmcgZGF0YSBkaXJ0eSBidWZmZXJzIGFyZSB0cmFja2VkIG9ubHkgaW4gdGhlCisJCSAqIGpvdXJuYWwuIFNvIGFsdGhvdWdoIG1tIHRoaW5rcyBldmVyeXRoaW5nIGlzIGNsZWFuIGFuZAorCQkgKiByZWFkeSBmb3IgcmVhcGluZyB0aGUgaW5vZGUgbWlnaHQgc3RpbGwgaGF2ZSBzb21lIHBhZ2VzIHRvCisJCSAqIHdyaXRlIGluIHRoZSBydW5uaW5nIHRyYW5zYWN0aW9uIG9yIHdhaXRpbmcgdG8gYmUKKwkJICogY2hlY2twb2ludGVkLiBUaHVzIGNhbGxpbmcgamJkMl9qb3VybmFsX2ludmFsaWRhdGVwYWdlKCkKKwkJICogKHZpYSB0cnVuY2F0ZV9pbm9kZV9wYWdlcygpKSB0byBkaXNjYXJkIHRoZXNlIGJ1ZmZlcnMgY2FuCisJCSAqIGNhdXNlIGRhdGEgbG9zcy4gQWxzbyBldmVuIGlmIHdlIGRpZCBub3QgZGlzY2FyZCB0aGVzZQorCQkgKiBidWZmZXJzLCB3ZSB3b3VsZCBoYXZlIG5vIHdheSB0byBmaW5kIHRoZW0gYWZ0ZXIgdGhlIGlub2RlCisJCSAqIGlzIHJlYXBlZCBhbmQgdGh1cyB1c2VyIGNvdWxkIHNlZSBzdGFsZSBkYXRhIGlmIGhlIHRyaWVzIHRvCisJCSAqIHJlYWQgdGhlbSBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIGlzIGNoZWNrcG9pbnRlZC4gU28gYmUKKwkJICogY2FyZWZ1bCBhbmQgZm9yY2UgZXZlcnl0aGluZyB0byBkaXNrIGhlcmUuLi4gV2UgdXNlCisJCSAqIGVpLT5pX2RhdGFzeW5jX3RpZCB0byBzdG9yZSB0aGUgbmV3ZXN0IHRyYW5zYWN0aW9uCisJCSAqIGNvbnRhaW5pbmcgaW5vZGUncyBkYXRhLgorCQkgKgorCQkgKiBOb3RlIHRoYXQgZGlyZWN0b3JpZXMgZG8gbm90IGhhdmUgdGhpcyBwcm9ibGVtIGJlY2F1c2UgdGhleQorCQkgKiBkb24ndCB1c2UgcGFnZSBjYWNoZS4KKwkJICovCisJCWlmIChleHQ0X3Nob3VsZF9qb3VybmFsX2RhdGEoaW5vZGUpICYmCisJCSAgICAoU19JU0xOSyhpbm9kZS0+aV9tb2RlKSB8fCBTX0lTUkVHKGlub2RlLT5pX21vZGUpKSkgeworCQkJam91cm5hbF90ICpqb3VybmFsID0gRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfam91cm5hbDsKKwkJCXRpZF90IGNvbW1pdF90aWQgPSBFWFQ0X0koaW5vZGUpLT5pX2RhdGFzeW5jX3RpZDsKKworCQkJamJkMl9sb2dfc3RhcnRfY29tbWl0KGpvdXJuYWwsIGNvbW1pdF90aWQpOworCQkJamJkMl9sb2dfd2FpdF9jb21taXQoam91cm5hbCwgY29tbWl0X3RpZCk7CisJCQlmaWxlbWFwX3dyaXRlX2FuZF93YWl0KCZpbm9kZS0+aV9kYXRhKTsKKwkJfQogCQl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmaW5vZGUtPmlfZGF0YSwgMCk7CiAJCWdvdG8gbm9fZGVsZXRlOwogCX0KQEAgLTIwNCw3ICsxNjIsNyBAQAogCWlmIChpc19iYWRfaW5vZGUoaW5vZGUpKQogCQlnb3RvIG5vX2RlbGV0ZTsKIAotCWhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgYmxvY2tzX2Zvcl90cnVuY2F0ZShpbm9kZSkrMyk7CisJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCBleHQ0X2Jsb2Nrc19mb3JfdHJ1bmNhdGUoaW5vZGUpKzMpOwogCWlmIChJU19FUlIoaGFuZGxlKSkgewogCQlleHQ0X3N0ZF9lcnJvcihpbm9kZS0+aV9zYiwgUFRSX0VSUihoYW5kbGUpKTsKIAkJLyoKQEAgLTI3Nyw3OTMgKzIzNSw2IEBACiAJZXh0NF9jbGVhcl9pbm9kZShpbm9kZSk7CS8qIFdlIG11c3QgZ3VhcmFudGVlIGNsZWFyaW5nIG9mIGlub2RlLi4uICovCiB9CiAKLXR5cGVkZWYgc3RydWN0IHsKLQlfX2xlMzIJKnA7Ci0JX19sZTMyCWtleTsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwotfSBJbmRpcmVjdDsKLQotc3RhdGljIGlubGluZSB2b2lkIGFkZF9jaGFpbihJbmRpcmVjdCAqcCwgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgX19sZTMyICp2KQotewotCXAtPmtleSA9ICoocC0+cCA9IHYpOwotCXAtPmJoID0gYmg7Ci19Ci0KLS8qKgotICoJZXh0NF9ibG9ja190b19wYXRoIC0gcGFyc2UgdGhlIGJsb2NrIG51bWJlciBpbnRvIGFycmF5IG9mIG9mZnNldHMKLSAqCUBpbm9kZTogaW5vZGUgaW4gcXVlc3Rpb24gKHdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gaXRzIHN1cGVyYmxvY2spCi0gKglAaV9ibG9jazogYmxvY2sgbnVtYmVyIHRvIGJlIHBhcnNlZAotICoJQG9mZnNldHM6IGFycmF5IHRvIHN0b3JlIHRoZSBvZmZzZXRzIGluCi0gKglAYm91bmRhcnk6IHNldCB0aGlzIG5vbi16ZXJvIGlmIHRoZSByZWZlcnJlZC10byBibG9jayBpcyBsaWtlbHkgdG8gYmUKLSAqCSAgICAgICBmb2xsb3dlZCAob24gZGlzaykgYnkgYW4gaW5kaXJlY3QgYmxvY2suCi0gKgotICoJVG8gc3RvcmUgdGhlIGxvY2F0aW9ucyBvZiBmaWxlJ3MgZGF0YSBleHQ0IHVzZXMgYSBkYXRhIHN0cnVjdHVyZSBjb21tb24KLSAqCWZvciBVTklYIGZpbGVzeXN0ZW1zIC0gdHJlZSBvZiBwb2ludGVycyBhbmNob3JlZCBpbiB0aGUgaW5vZGUsIHdpdGgKLSAqCWRhdGEgYmxvY2tzIGF0IGxlYXZlcyBhbmQgaW5kaXJlY3QgYmxvY2tzIGluIGludGVybWVkaWF0ZSBub2Rlcy4KLSAqCVRoaXMgZnVuY3Rpb24gdHJhbnNsYXRlcyB0aGUgYmxvY2sgbnVtYmVyIGludG8gcGF0aCBpbiB0aGF0IHRyZWUgLQotICoJcmV0dXJuIHZhbHVlIGlzIHRoZSBwYXRoIGxlbmd0aCBhbmQgQG9mZnNldHNbbl0gaXMgdGhlIG9mZnNldCBvZgotICoJcG9pbnRlciB0byAobisxKXRoIG5vZGUgaW4gdGhlIG50aCBvbmUuIElmIEBibG9jayBpcyBvdXQgb2YgcmFuZ2UKLSAqCShuZWdhdGl2ZSBvciB0b28gbGFyZ2UpIHdhcm5pbmcgaXMgcHJpbnRlZCBhbmQgemVybyByZXR1cm5lZC4KLSAqCi0gKglOb3RlOiBmdW5jdGlvbiBkb2Vzbid0IGZpbmQgbm9kZSBhZGRyZXNzZXMsIHNvIG5vIElPIGlzIG5lZWRlZC4gQWxsCi0gKgl3ZSBuZWVkIHRvIGtub3cgaXMgdGhlIGNhcGFjaXR5IG9mIGluZGlyZWN0IGJsb2NrcyAodGFrZW4gZnJvbSB0aGUKLSAqCWlub2RlLT5pX3NiKS4KLSAqLwotCi0vKgotICogUG9ydGFiaWxpdHkgbm90ZTogdGhlIGxhc3QgY29tcGFyaXNvbiAoY2hlY2sgdGhhdCB3ZSBmaXQgaW50byB0cmlwbGUKLSAqIGluZGlyZWN0IGJsb2NrKSBpcyBzcGVsbGVkIGRpZmZlcmVudGx5LCBiZWNhdXNlIG90aGVyd2lzZSBvbiBhbgotICogYXJjaGl0ZWN0dXJlIHdpdGggMzItYml0IGxvbmdzIGFuZCA4S2IgcGFnZXMgd2UgbWlnaHQgZ2V0IGludG8gdHJvdWJsZQotICogaWYgb3VyIGZpbGVzeXN0ZW0gaGFkIDhLYiBibG9ja3MuIFdlIG1pZ2h0IHVzZSBsb25nIGxvbmcsIGJ1dCB0aGF0IHdvdWxkCi0gKiBraWxsIHVzIG9uIHg4Ni4gT2gsIHdlbGwsIGF0IGxlYXN0IHRoZSBzaWduIHByb3BhZ2F0aW9uIGRvZXMgbm90IG1hdHRlciAtCi0gKiBpX2Jsb2NrIHdvdWxkIGhhdmUgdG8gYmUgbmVnYXRpdmUgaW4gdGhlIHZlcnkgYmVnaW5uaW5nLCBzbyB3ZSB3b3VsZCBub3QKLSAqIGdldCB0aGVyZSBhdCBhbGwuCi0gKi8KLQotc3RhdGljIGludCBleHQ0X2Jsb2NrX3RvX3BhdGgoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCSAgICAgIGV4dDRfbGJsa190IGlfYmxvY2ssCi0JCQkgICAgICBleHQ0X2xibGtfdCBvZmZzZXRzWzRdLCBpbnQgKmJvdW5kYXJ5KQotewotCWludCBwdHJzID0gRVhUNF9BRERSX1BFUl9CTE9DSyhpbm9kZS0+aV9zYik7Ci0JaW50IHB0cnNfYml0cyA9IEVYVDRfQUREUl9QRVJfQkxPQ0tfQklUUyhpbm9kZS0+aV9zYik7Ci0JY29uc3QgbG9uZyBkaXJlY3RfYmxvY2tzID0gRVhUNF9ORElSX0JMT0NLUywKLQkJaW5kaXJlY3RfYmxvY2tzID0gcHRycywKLQkJZG91YmxlX2Jsb2NrcyA9ICgxIDw8IChwdHJzX2JpdHMgKiAyKSk7Ci0JaW50IG4gPSAwOwotCWludCBmaW5hbCA9IDA7Ci0KLQlpZiAoaV9ibG9jayA8IGRpcmVjdF9ibG9ja3MpIHsKLQkJb2Zmc2V0c1tuKytdID0gaV9ibG9jazsKLQkJZmluYWwgPSBkaXJlY3RfYmxvY2tzOwotCX0gZWxzZSBpZiAoKGlfYmxvY2sgLT0gZGlyZWN0X2Jsb2NrcykgPCBpbmRpcmVjdF9ibG9ja3MpIHsKLQkJb2Zmc2V0c1tuKytdID0gRVhUNF9JTkRfQkxPQ0s7Ci0JCW9mZnNldHNbbisrXSA9IGlfYmxvY2s7Ci0JCWZpbmFsID0gcHRyczsKLQl9IGVsc2UgaWYgKChpX2Jsb2NrIC09IGluZGlyZWN0X2Jsb2NrcykgPCBkb3VibGVfYmxvY2tzKSB7Ci0JCW9mZnNldHNbbisrXSA9IEVYVDRfRElORF9CTE9DSzsKLQkJb2Zmc2V0c1tuKytdID0gaV9ibG9jayA+PiBwdHJzX2JpdHM7Ci0JCW9mZnNldHNbbisrXSA9IGlfYmxvY2sgJiAocHRycyAtIDEpOwotCQlmaW5hbCA9IHB0cnM7Ci0JfSBlbHNlIGlmICgoKGlfYmxvY2sgLT0gZG91YmxlX2Jsb2NrcykgPj4gKHB0cnNfYml0cyAqIDIpKSA8IHB0cnMpIHsKLQkJb2Zmc2V0c1tuKytdID0gRVhUNF9USU5EX0JMT0NLOwotCQlvZmZzZXRzW24rK10gPSBpX2Jsb2NrID4+IChwdHJzX2JpdHMgKiAyKTsKLQkJb2Zmc2V0c1tuKytdID0gKGlfYmxvY2sgPj4gcHRyc19iaXRzKSAmIChwdHJzIC0gMSk7Ci0JCW9mZnNldHNbbisrXSA9IGlfYmxvY2sgJiAocHRycyAtIDEpOwotCQlmaW5hbCA9IHB0cnM7Ci0JfSBlbHNlIHsKLQkJZXh0NF93YXJuaW5nKGlub2RlLT5pX3NiLCAiYmxvY2sgJWx1ID4gbWF4IGluIGlub2RlICVsdSIsCi0JCQkgICAgIGlfYmxvY2sgKyBkaXJlY3RfYmxvY2tzICsKLQkJCSAgICAgaW5kaXJlY3RfYmxvY2tzICsgZG91YmxlX2Jsb2NrcywgaW5vZGUtPmlfaW5vKTsKLQl9Ci0JaWYgKGJvdW5kYXJ5KQotCQkqYm91bmRhcnkgPSBmaW5hbCAtIDEgLSAoaV9ibG9jayAmIChwdHJzIC0gMSkpOwotCXJldHVybiBuOwotfQotCi1zdGF0aWMgaW50IF9fZXh0NF9jaGVja19ibG9ja3JlZihjb25zdCBjaGFyICpmdW5jdGlvbiwgdW5zaWduZWQgaW50IGxpbmUsCi0JCQkJIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkJIF9fbGUzMiAqcCwgdW5zaWduZWQgaW50IG1heCkKLXsKLQlzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayAqZXMgPSBFWFQ0X1NCKGlub2RlLT5pX3NiKS0+c19lczsKLQlfX2xlMzIgKmJyZWYgPSBwOwotCXVuc2lnbmVkIGludCBibGs7Ci0KLQl3aGlsZSAoYnJlZiA8IHArbWF4KSB7Ci0JCWJsayA9IGxlMzJfdG9fY3B1KCpicmVmKyspOwotCQlpZiAoYmxrICYmCi0JCSAgICB1bmxpa2VseSghZXh0NF9kYXRhX2Jsb2NrX3ZhbGlkKEVYVDRfU0IoaW5vZGUtPmlfc2IpLAotCQkJCQkJICAgIGJsaywgMSkpKSB7Ci0JCQllcy0+c19sYXN0X2Vycm9yX2Jsb2NrID0gY3B1X3RvX2xlNjQoYmxrKTsKLQkJCWV4dDRfZXJyb3JfaW5vZGUoaW5vZGUsIGZ1bmN0aW9uLCBsaW5lLCBibGssCi0JCQkJCSAiaW52YWxpZCBibG9jayIpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLQotI2RlZmluZSBleHQ0X2NoZWNrX2luZGlyZWN0X2Jsb2NrcmVmKGlub2RlLCBiaCkgICAgICAgICAgICAgICAgICAgICAgICAgXAotCV9fZXh0NF9jaGVja19ibG9ja3JlZihfX2Z1bmNfXywgX19MSU5FX18sIGlub2RlLAkJXAotCQkJICAgICAgKF9fbGUzMiAqKShiaCktPmJfZGF0YSwJCQlcCi0JCQkgICAgICBFWFQ0X0FERFJfUEVSX0JMT0NLKChpbm9kZSktPmlfc2IpKQotCi0jZGVmaW5lIGV4dDRfY2hlY2tfaW5vZGVfYmxvY2tyZWYoaW5vZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JX19leHQ0X2NoZWNrX2Jsb2NrcmVmKF9fZnVuY19fLCBfX0xJTkVfXywgaW5vZGUsCQlcCi0JCQkgICAgICBFWFQ0X0koaW5vZGUpLT5pX2RhdGEsCQkJXAotCQkJICAgICAgRVhUNF9ORElSX0JMT0NLUykKLQotLyoqCi0gKglleHQ0X2dldF9icmFuY2ggLSByZWFkIHRoZSBjaGFpbiBvZiBpbmRpcmVjdCBibG9ja3MgbGVhZGluZyB0byBkYXRhCi0gKglAaW5vZGU6IGlub2RlIGluIHF1ZXN0aW9uCi0gKglAZGVwdGg6IGRlcHRoIG9mIHRoZSBjaGFpbiAoMSAtIGRpcmVjdCBwb2ludGVyLCBldGMuKQotICoJQG9mZnNldHM6IG9mZnNldHMgb2YgcG9pbnRlcnMgaW4gaW5vZGUvaW5kaXJlY3QgYmxvY2tzCi0gKglAY2hhaW46IHBsYWNlIHRvIHN0b3JlIHRoZSByZXN1bHQKLSAqCUBlcnI6IGhlcmUgd2Ugc3RvcmUgdGhlIGVycm9yIHZhbHVlCi0gKgotICoJRnVuY3Rpb24gZmlsbHMgdGhlIGFycmF5IG9mIHRyaXBsZXMgPGtleSwgcCwgYmg+IGFuZCByZXR1cm5zICVOVUxMCi0gKglpZiBldmVyeXRoaW5nIHdlbnQgT0sgb3IgdGhlIHBvaW50ZXIgdG8gdGhlIGxhc3QgZmlsbGVkIHRyaXBsZQotICoJKGluY29tcGxldGUgb25lKSBvdGhlcndpc2UuIFVwb24gdGhlIHJldHVybiBjaGFpbltpXS5rZXkgY29udGFpbnMKLSAqCXRoZSBudW1iZXIgb2YgKGkrMSktdGggYmxvY2sgaW4gdGhlIGNoYWluIChhcyBpdCBpcyBzdG9yZWQgaW4gbWVtb3J5LAotICoJaS5lLiBsaXR0bGUtZW5kaWFuIDMyLWJpdCksIGNoYWluW2ldLnAgY29udGFpbnMgdGhlIGFkZHJlc3Mgb2YgdGhhdAotICoJbnVtYmVyIChpdCBwb2ludHMgaW50byBzdHJ1Y3QgaW5vZGUgZm9yIGk9PTAgYW5kIGludG8gdGhlIGJoLT5iX2RhdGEKLSAqCWZvciBpPjApIGFuZCBjaGFpbltpXS5iaCBwb2ludHMgdG8gdGhlIGJ1ZmZlcl9oZWFkIG9mIGktdGggaW5kaXJlY3QKLSAqCWJsb2NrIGZvciBpPjAgYW5kIE5VTEwgZm9yIGk9PTAuIEluIG90aGVyIHdvcmRzLCBpdCBob2xkcyB0aGUgYmxvY2sKLSAqCW51bWJlcnMgb2YgdGhlIGNoYWluLCBhZGRyZXNzZXMgdGhleSB3ZXJlIHRha2VuIGZyb20gKGFuZCB3aGVyZSB3ZSBjYW4KLSAqCXZlcmlmeSB0aGF0IGNoYWluIGRpZCBub3QgY2hhbmdlKSBhbmQgYnVmZmVyX2hlYWRzIGhvc3RpbmcgdGhlc2UKLSAqCW51bWJlcnMuCi0gKgotICoJRnVuY3Rpb24gc3RvcHMgd2hlbiBpdCBzdHVtYmxlcyB1cG9uIHplcm8gcG9pbnRlciAoYWJzZW50IGJsb2NrKQotICoJCShwb2ludGVyIHRvIGxhc3QgdHJpcGxlIHJldHVybmVkLCAqQGVyciA9PSAwKQotICoJb3Igd2hlbiBpdCBnZXRzIGFuIElPIGVycm9yIHJlYWRpbmcgYW4gaW5kaXJlY3QgYmxvY2sKLSAqCQkoZGl0dG8sICpAZXJyID09IC1FSU8pCi0gKglvciB3aGVuIGl0IHJlYWRzIGFsbCBAZGVwdGgtMSBpbmRpcmVjdCBibG9ja3Mgc3VjY2Vzc2Z1bGx5IGFuZCBmaW5kcwotICoJdGhlIHdob2xlIGNoYWluLCBhbGwgd2F5IHRvIHRoZSBkYXRhIChyZXR1cm5zICVOVUxMLCAqZXJyID09IDApLgotICoKLSAqICAgICAgTmVlZCB0byBiZSBjYWxsZWQgd2l0aAotICogICAgICBkb3duX3JlYWQoJkVYVDRfSShpbm9kZSktPmlfZGF0YV9zZW0pCi0gKi8KLXN0YXRpYyBJbmRpcmVjdCAqZXh0NF9nZXRfYnJhbmNoKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBkZXB0aCwKLQkJCQkgZXh0NF9sYmxrX3QgICpvZmZzZXRzLAotCQkJCSBJbmRpcmVjdCBjaGFpbls0XSwgaW50ICplcnIpCi17Ci0Jc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOwotCUluZGlyZWN0ICpwID0gY2hhaW47Ci0Jc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsKLQotCSplcnIgPSAwOwotCS8qIGlfZGF0YSBpcyBub3QgZ29pbmcgYXdheSwgbm8gbG9jayBuZWVkZWQgKi8KLQlhZGRfY2hhaW4oY2hhaW4sIE5VTEwsIEVYVDRfSShpbm9kZSktPmlfZGF0YSArICpvZmZzZXRzKTsKLQlpZiAoIXAtPmtleSkKLQkJZ290byBub19ibG9jazsKLQl3aGlsZSAoLS1kZXB0aCkgewotCQliaCA9IHNiX2dldGJsayhzYiwgbGUzMl90b19jcHUocC0+a2V5KSk7Ci0JCWlmICh1bmxpa2VseSghYmgpKQotCQkJZ290byBmYWlsdXJlOwotCi0JCWlmICghYmhfdXB0b2RhdGVfb3JfbG9jayhiaCkpIHsKLQkJCWlmIChiaF9zdWJtaXRfcmVhZChiaCkgPCAwKSB7Ci0JCQkJcHV0X2JoKGJoKTsKLQkJCQlnb3RvIGZhaWx1cmU7Ci0JCQl9Ci0JCQkvKiB2YWxpZGF0ZSBibG9jayByZWZlcmVuY2VzICovCi0JCQlpZiAoZXh0NF9jaGVja19pbmRpcmVjdF9ibG9ja3JlZihpbm9kZSwgYmgpKSB7Ci0JCQkJcHV0X2JoKGJoKTsKLQkJCQlnb3RvIGZhaWx1cmU7Ci0JCQl9Ci0JCX0KLQotCQlhZGRfY2hhaW4oKytwLCBiaCwgKF9fbGUzMiAqKWJoLT5iX2RhdGEgKyAqKytvZmZzZXRzKTsKLQkJLyogUmVhZGVyOiBlbmQgKi8KLQkJaWYgKCFwLT5rZXkpCi0JCQlnb3RvIG5vX2Jsb2NrOwotCX0KLQlyZXR1cm4gTlVMTDsKLQotZmFpbHVyZToKLQkqZXJyID0gLUVJTzsKLW5vX2Jsb2NrOgotCXJldHVybiBwOwotfQotCi0vKioKLSAqCWV4dDRfZmluZF9uZWFyIC0gZmluZCBhIHBsYWNlIGZvciBhbGxvY2F0aW9uIHdpdGggc3VmZmljaWVudCBsb2NhbGl0eQotICoJQGlub2RlOiBvd25lcgotICoJQGluZDogZGVzY3JpcHRvciBvZiBpbmRpcmVjdCBibG9jay4KLSAqCi0gKglUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHByZWZlcnJlZCBwbGFjZSBmb3IgYmxvY2sgYWxsb2NhdGlvbi4KLSAqCUl0IGlzIHVzZWQgd2hlbiBoZXVyaXN0aWMgZm9yIHNlcXVlbnRpYWwgYWxsb2NhdGlvbiBmYWlscy4KLSAqCVJ1bGVzIGFyZToKLSAqCSAgKyBpZiB0aGVyZSBpcyBhIGJsb2NrIHRvIHRoZSBsZWZ0IG9mIG91ciBwb3NpdGlvbiAtIGFsbG9jYXRlIG5lYXIgaXQuCi0gKgkgICsgaWYgcG9pbnRlciB3aWxsIGxpdmUgaW4gaW5kaXJlY3QgYmxvY2sgLSBhbGxvY2F0ZSBuZWFyIHRoYXQgYmxvY2suCi0gKgkgICsgaWYgcG9pbnRlciB3aWxsIGxpdmUgaW4gaW5vZGUgLSBhbGxvY2F0ZSBpbiB0aGUgc2FtZQotICoJICAgIGN5bGluZGVyIGdyb3VwLgotICoKLSAqIEluIHRoZSBsYXR0ZXIgY2FzZSB3ZSBjb2xvdXIgdGhlIHN0YXJ0aW5nIGJsb2NrIGJ5IHRoZSBjYWxsZXJzIFBJRCB0bwotICogcHJldmVudCBpdCBmcm9tIGNsYXNoaW5nIHdpdGggY29uY3VycmVudCBhbGxvY2F0aW9ucyBmb3IgYSBkaWZmZXJlbnQgaW5vZGUKLSAqIGluIHRoZSBzYW1lIGJsb2NrIGdyb3VwLiAgIFRoZSBQSUQgaXMgdXNlZCBoZXJlIHNvIHRoYXQgZnVuY3Rpb25hbGx5IHJlbGF0ZWQKLSAqIGZpbGVzIHdpbGwgYmUgY2xvc2UtYnkgb24tZGlzay4KLSAqCi0gKglDYWxsZXIgbXVzdCBtYWtlIHN1cmUgdGhhdCBAaW5kIGlzIHZhbGlkIGFuZCB3aWxsIHN0YXkgdGhhdCB3YXkuCi0gKi8KLXN0YXRpYyBleHQ0X2ZzYmxrX3QgZXh0NF9maW5kX25lYXIoc3RydWN0IGlub2RlICppbm9kZSwgSW5kaXJlY3QgKmluZCkKLXsKLQlzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvICplaSA9IEVYVDRfSShpbm9kZSk7Ci0JX19sZTMyICpzdGFydCA9IGluZC0+YmggPyAoX19sZTMyICopIGluZC0+YmgtPmJfZGF0YSA6IGVpLT5pX2RhdGE7Ci0JX19sZTMyICpwOwotCWV4dDRfZnNibGtfdCBiZ19zdGFydDsKLQlleHQ0X2ZzYmxrX3QgbGFzdF9ibG9jazsKLQlleHQ0X2dycGJsa190IGNvbG91cjsKLQlleHQ0X2dyb3VwX3QgYmxvY2tfZ3JvdXA7Ci0JaW50IGZsZXhfc2l6ZSA9IGV4dDRfZmxleF9iZ19zaXplKEVYVDRfU0IoaW5vZGUtPmlfc2IpKTsKLQotCS8qIFRyeSB0byBmaW5kIHByZXZpb3VzIGJsb2NrICovCi0JZm9yIChwID0gaW5kLT5wIC0gMTsgcCA+PSBzdGFydDsgcC0tKSB7Ci0JCWlmICgqcCkKLQkJCXJldHVybiBsZTMyX3RvX2NwdSgqcCk7Ci0JfQotCi0JLyogTm8gc3VjaCB0aGluZywgc28gbGV0J3MgdHJ5IGxvY2F0aW9uIG9mIGluZGlyZWN0IGJsb2NrICovCi0JaWYgKGluZC0+YmgpCi0JCXJldHVybiBpbmQtPmJoLT5iX2Jsb2NrbnI7Ci0KLQkvKgotCSAqIEl0IGlzIGdvaW5nIHRvIGJlIHJlZmVycmVkIHRvIGZyb20gdGhlIGlub2RlIGl0c2VsZj8gT0ssIGp1c3QgcHV0IGl0Ci0JICogaW50byB0aGUgc2FtZSBjeWxpbmRlciBncm91cCB0aGVuLgotCSAqLwotCWJsb2NrX2dyb3VwID0gZWktPmlfYmxvY2tfZ3JvdXA7Ci0JaWYgKGZsZXhfc2l6ZSA+PSBFWFQ0X0ZMRVhfU0laRV9ESVJfQUxMT0NfU0NIRU1FKSB7Ci0JCWJsb2NrX2dyb3VwICY9IH4oZmxleF9zaXplLTEpOwotCQlpZiAoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSkKLQkJCWJsb2NrX2dyb3VwKys7Ci0JfQotCWJnX3N0YXJ0ID0gZXh0NF9ncm91cF9maXJzdF9ibG9ja19ubyhpbm9kZS0+aV9zYiwgYmxvY2tfZ3JvdXApOwotCWxhc3RfYmxvY2sgPSBleHQ0X2Jsb2Nrc19jb3VudChFWFQ0X1NCKGlub2RlLT5pX3NiKS0+c19lcykgLSAxOwotCi0JLyoKLQkgKiBJZiB3ZSBhcmUgZG9pbmcgZGVsYXllZCBhbGxvY2F0aW9uLCB3ZSBkb24ndCBuZWVkIHRha2UKLQkgKiBjb2xvdXIgaW50byBhY2NvdW50LgotCSAqLwotCWlmICh0ZXN0X29wdChpbm9kZS0+aV9zYiwgREVMQUxMT0MpKQotCQlyZXR1cm4gYmdfc3RhcnQ7Ci0KLQlpZiAoYmdfc3RhcnQgKyBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoaW5vZGUtPmlfc2IpIDw9IGxhc3RfYmxvY2spCi0JCWNvbG91ciA9IChjdXJyZW50LT5waWQgJSAxNikgKgotCQkJKEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChpbm9kZS0+aV9zYikgLyAxNik7Ci0JZWxzZQotCQljb2xvdXIgPSAoY3VycmVudC0+cGlkICUgMTYpICogKChsYXN0X2Jsb2NrIC0gYmdfc3RhcnQpIC8gMTYpOwotCXJldHVybiBiZ19zdGFydCArIGNvbG91cjsKLX0KLQotLyoqCi0gKglleHQ0X2ZpbmRfZ29hbCAtIGZpbmQgYSBwcmVmZXJyZWQgcGxhY2UgZm9yIGFsbG9jYXRpb24uCi0gKglAaW5vZGU6IG93bmVyCi0gKglAYmxvY2s6ICBibG9jayB3ZSB3YW50Ci0gKglAcGFydGlhbDogcG9pbnRlciB0byB0aGUgbGFzdCB0cmlwbGUgd2l0aGluIGEgY2hhaW4KLSAqCi0gKglOb3JtYWxseSB0aGlzIGZ1bmN0aW9uIGZpbmQgdGhlIHByZWZlcnJlZCBwbGFjZSBmb3IgYmxvY2sgYWxsb2NhdGlvbiwKLSAqCXJldHVybnMgaXQuCi0gKglCZWNhdXNlIHRoaXMgaXMgb25seSB1c2VkIGZvciBub24tZXh0ZW50IGZpbGVzLCB3ZSBsaW1pdCB0aGUgYmxvY2sgbnIKLSAqCXRvIDMyIGJpdHMuCi0gKi8KLXN0YXRpYyBleHQ0X2ZzYmxrX3QgZXh0NF9maW5kX2dvYWwoc3RydWN0IGlub2RlICppbm9kZSwgZXh0NF9sYmxrX3QgYmxvY2ssCi0JCQkJICAgSW5kaXJlY3QgKnBhcnRpYWwpCi17Ci0JZXh0NF9mc2Jsa190IGdvYWw7Ci0KLQkvKgotCSAqIFhYWCBuZWVkIHRvIGdldCBnb2FsIGJsb2NrIGZyb20gbWJhbGxvYydzIGRhdGEgc3RydWN0dXJlcwotCSAqLwotCi0JZ29hbCA9IGV4dDRfZmluZF9uZWFyKGlub2RlLCBwYXJ0aWFsKTsKLQlnb2FsID0gZ29hbCAmIEVYVDRfTUFYX0JMT0NLX0ZJTEVfUEhZUzsKLQlyZXR1cm4gZ29hbDsKLX0KLQotLyoqCi0gKglleHQ0X2Jsa3NfdG9fYWxsb2NhdGUgLSBMb29rIHVwIHRoZSBibG9jayBtYXAgYW5kIGNvdW50IHRoZSBudW1iZXIKLSAqCW9mIGRpcmVjdCBibG9ja3MgbmVlZCB0byBiZSBhbGxvY2F0ZWQgZm9yIHRoZSBnaXZlbiBicmFuY2guCi0gKgotICoJQGJyYW5jaDogY2hhaW4gb2YgaW5kaXJlY3QgYmxvY2tzCi0gKglAazogbnVtYmVyIG9mIGJsb2NrcyBuZWVkIGZvciBpbmRpcmVjdCBibG9ja3MKLSAqCUBibGtzOiBudW1iZXIgb2YgZGF0YSBibG9ja3MgdG8gYmUgbWFwcGVkLgotICoJQGJsb2Nrc190b19ib3VuZGFyeTogIHRoZSBvZmZzZXQgaW4gdGhlIGluZGlyZWN0IGJsb2NrCi0gKgotICoJcmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgYmxvY2tzIHRvIGJlIGFsbG9jYXRlLCBpbmNsdWRpbmcgdGhlCi0gKglkaXJlY3QgYW5kIGluZGlyZWN0IGJsb2Nrcy4KLSAqLwotc3RhdGljIGludCBleHQ0X2Jsa3NfdG9fYWxsb2NhdGUoSW5kaXJlY3QgKmJyYW5jaCwgaW50IGssIHVuc2lnbmVkIGludCBibGtzLAotCQkJCSBpbnQgYmxvY2tzX3RvX2JvdW5kYXJ5KQotewotCXVuc2lnbmVkIGludCBjb3VudCA9IDA7Ci0KLQkvKgotCSAqIFNpbXBsZSBjYXNlLCBbdCxkXUluZGlyZWN0IGJsb2NrKHMpIGhhcyBub3QgYWxsb2NhdGVkIHlldAotCSAqIHRoZW4gaXQncyBjbGVhciBibG9ja3Mgb24gdGhhdCBwYXRoIGhhdmUgbm90IGFsbG9jYXRlZAotCSAqLwotCWlmIChrID4gMCkgewotCQkvKiByaWdodCBub3cgd2UgZG9uJ3QgaGFuZGxlIGNyb3NzIGJvdW5kYXJ5IGFsbG9jYXRpb24gKi8KLQkJaWYgKGJsa3MgPCBibG9ja3NfdG9fYm91bmRhcnkgKyAxKQotCQkJY291bnQgKz0gYmxrczsKLQkJZWxzZQotCQkJY291bnQgKz0gYmxvY2tzX3RvX2JvdW5kYXJ5ICsgMTsKLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCWNvdW50Kys7Ci0Jd2hpbGUgKGNvdW50IDwgYmxrcyAmJiBjb3VudCA8PSBibG9ja3NfdG9fYm91bmRhcnkgJiYKLQkJbGUzMl90b19jcHUoKihicmFuY2hbMF0ucCArIGNvdW50KSkgPT0gMCkgewotCQljb3VudCsrOwotCX0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLS8qKgotICoJZXh0NF9hbGxvY19ibG9ja3M6IG11bHRpcGxlIGFsbG9jYXRlIGJsb2NrcyBuZWVkZWQgZm9yIGEgYnJhbmNoCi0gKglAaGFuZGxlOiBoYW5kbGUgZm9yIHRoaXMgdHJhbnNhY3Rpb24KLSAqCUBpbm9kZTogaW5vZGUgd2hpY2ggbmVlZHMgYWxsb2NhdGVkIGJsb2NrcwotICoJQGlibG9jazogdGhlIGxvZ2ljYWwgYmxvY2sgdG8gc3RhcnQgYWxsb2NhdGVkIGF0Ci0gKglAZ29hbDogcHJlZmVycmVkIHBoeXNpY2FsIGJsb2NrIG9mIGFsbG9jYXRpb24KLSAqCUBpbmRpcmVjdF9ibGtzOiB0aGUgbnVtYmVyIG9mIGJsb2NrcyBuZWVkIHRvIGFsbG9jYXRlIGZvciBpbmRpcmVjdAotICoJCQlibG9ja3MKLSAqCUBibGtzOiBudW1iZXIgb2YgZGVzaXJlZCBibG9ja3MKLSAqCUBuZXdfYmxvY2tzOiBvbiByZXR1cm4gaXQgd2lsbCBzdG9yZSB0aGUgbmV3IGJsb2NrIG51bWJlcnMgZm9yCi0gKgl0aGUgaW5kaXJlY3QgYmxvY2tzKGlmIG5lZWRlZCkgYW5kIHRoZSBmaXJzdCBkaXJlY3QgYmxvY2ssCi0gKglAZXJyOiBvbiByZXR1cm4gaXQgd2lsbCBzdG9yZSB0aGUgZXJyb3IgY29kZQotICoKLSAqCVRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiBibG9ja3MgYWxsb2NhdGVkIGFzCi0gKglyZXF1ZXN0ZWQgYnkgdGhlIHBhc3NlZC1pbiBwYXJhbWV0ZXJzLgotICovCi1zdGF0aWMgaW50IGV4dDRfYWxsb2NfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgICAgIGV4dDRfbGJsa190IGlibG9jaywgZXh0NF9mc2Jsa190IGdvYWwsCi0JCQkgICAgIGludCBpbmRpcmVjdF9ibGtzLCBpbnQgYmxrcywKLQkJCSAgICAgZXh0NF9mc2Jsa190IG5ld19ibG9ja3NbNF0sIGludCAqZXJyKQotewotCXN0cnVjdCBleHQ0X2FsbG9jYXRpb25fcmVxdWVzdCBhcjsKLQlpbnQgdGFyZ2V0LCBpOwotCXVuc2lnbmVkIGxvbmcgY291bnQgPSAwLCBibGtfYWxsb2NhdGVkID0gMDsKLQlpbnQgaW5kZXggPSAwOwotCWV4dDRfZnNibGtfdCBjdXJyZW50X2Jsb2NrID0gMDsKLQlpbnQgcmV0ID0gMDsKLQotCS8qCi0JICogSGVyZSB3ZSB0cnkgdG8gYWxsb2NhdGUgdGhlIHJlcXVlc3RlZCBtdWx0aXBsZSBibG9ja3MgYXQgb25jZSwKLQkgKiBvbiBhIGJlc3QtZWZmb3J0IGJhc2lzLgotCSAqIFRvIGJ1aWxkIGEgYnJhbmNoLCB3ZSBzaG91bGQgYWxsb2NhdGUgYmxvY2tzIGZvcgotCSAqIHRoZSBpbmRpcmVjdCBibG9ja3MoaWYgbm90IGFsbG9jYXRlZCB5ZXQpLCBhbmQgYXQgbGVhc3QKLQkgKiB0aGUgZmlyc3QgZGlyZWN0IGJsb2NrIG9mIHRoaXMgYnJhbmNoLiAgVGhhdCdzIHRoZQotCSAqIG1pbmltdW0gbnVtYmVyIG9mIGJsb2NrcyBuZWVkIHRvIGFsbG9jYXRlKHJlcXVpcmVkKQotCSAqLwotCS8qIGZpcnN0IHdlIHRyeSB0byBhbGxvY2F0ZSB0aGUgaW5kaXJlY3QgYmxvY2tzICovCi0JdGFyZ2V0ID0gaW5kaXJlY3RfYmxrczsKLQl3aGlsZSAodGFyZ2V0ID4gMCkgewotCQljb3VudCA9IHRhcmdldDsKLQkJLyogYWxsb2NhdGluZyBibG9ja3MgZm9yIGluZGlyZWN0IGJsb2NrcyBhbmQgZGlyZWN0IGJsb2NrcyAqLwotCQljdXJyZW50X2Jsb2NrID0gZXh0NF9uZXdfbWV0YV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgZ29hbCwKLQkJCQkJCSAgICAgMCwgJmNvdW50LCBlcnIpOwotCQlpZiAoKmVycikKLQkJCWdvdG8gZmFpbGVkX291dDsKLQotCQlpZiAodW5saWtlbHkoY3VycmVudF9ibG9jayArIGNvdW50ID4gRVhUNF9NQVhfQkxPQ0tfRklMRV9QSFlTKSkgewotCQkJRVhUNF9FUlJPUl9JTk9ERShpbm9kZSwKLQkJCQkJICJjdXJyZW50X2Jsb2NrICVsbHUgKyBjb3VudCAlbHUgPiAlZCEiLAotCQkJCQkgY3VycmVudF9ibG9jaywgY291bnQsCi0JCQkJCSBFWFQ0X01BWF9CTE9DS19GSUxFX1BIWVMpOwotCQkJKmVyciA9IC1FSU87Ci0JCQlnb3RvIGZhaWxlZF9vdXQ7Ci0JCX0KLQotCQl0YXJnZXQgLT0gY291bnQ7Ci0JCS8qIGFsbG9jYXRlIGJsb2NrcyBmb3IgaW5kaXJlY3QgYmxvY2tzICovCi0JCXdoaWxlIChpbmRleCA8IGluZGlyZWN0X2Jsa3MgJiYgY291bnQpIHsKLQkJCW5ld19ibG9ja3NbaW5kZXgrK10gPSBjdXJyZW50X2Jsb2NrKys7Ci0JCQljb3VudC0tOwotCQl9Ci0JCWlmIChjb3VudCA+IDApIHsKLQkJCS8qCi0JCQkgKiBzYXZlIHRoZSBuZXcgYmxvY2sgbnVtYmVyCi0JCQkgKiBmb3IgdGhlIGZpcnN0IGRpcmVjdCBibG9jawotCQkJICovCi0JCQluZXdfYmxvY2tzW2luZGV4XSA9IGN1cnJlbnRfYmxvY2s7Ci0JCQlwcmludGsoS0VSTl9JTkZPICIlcyByZXR1cm5lZCBtb3JlIGJsb2NrcyB0aGFuICIKLQkJCQkJCSJyZXF1ZXN0ZWRcbiIsIF9fZnVuY19fKTsKLQkJCVdBUk5fT04oMSk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXRhcmdldCA9IGJsa3MgLSBjb3VudCA7Ci0JYmxrX2FsbG9jYXRlZCA9IGNvdW50OwotCWlmICghdGFyZ2V0KQotCQlnb3RvIGFsbG9jYXRlZDsKLQkvKiBOb3cgYWxsb2NhdGUgZGF0YSBibG9ja3MgKi8KLQltZW1zZXQoJmFyLCAwLCBzaXplb2YoYXIpKTsKLQlhci5pbm9kZSA9IGlub2RlOwotCWFyLmdvYWwgPSBnb2FsOwotCWFyLmxlbiA9IHRhcmdldDsKLQlhci5sb2dpY2FsID0gaWJsb2NrOwotCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKQotCQkvKiBlbmFibGUgaW4tY29yZSBwcmVhbGxvY2F0aW9uIG9ubHkgZm9yIHJlZ3VsYXIgZmlsZXMgKi8KLQkJYXIuZmxhZ3MgPSBFWFQ0X01CX0hJTlRfREFUQTsKLQotCWN1cnJlbnRfYmxvY2sgPSBleHQ0X21iX25ld19ibG9ja3MoaGFuZGxlLCAmYXIsIGVycik7Ci0JaWYgKHVubGlrZWx5KGN1cnJlbnRfYmxvY2sgKyBhci5sZW4gPiBFWFQ0X01BWF9CTE9DS19GSUxFX1BIWVMpKSB7Ci0JCUVYVDRfRVJST1JfSU5PREUoaW5vZGUsCi0JCQkJICJjdXJyZW50X2Jsb2NrICVsbHUgKyBhci5sZW4gJWQgPiAlZCEiLAotCQkJCSBjdXJyZW50X2Jsb2NrLCBhci5sZW4sCi0JCQkJIEVYVDRfTUFYX0JMT0NLX0ZJTEVfUEhZUyk7Ci0JCSplcnIgPSAtRUlPOwotCQlnb3RvIGZhaWxlZF9vdXQ7Ci0JfQotCi0JaWYgKCplcnIgJiYgKHRhcmdldCA9PSBibGtzKSkgewotCQkvKgotCQkgKiBpZiB0aGUgYWxsb2NhdGlvbiBmYWlsZWQgYW5kIHdlIGRpZG4ndCBhbGxvY2F0ZQotCQkgKiBhbnkgYmxvY2tzIGJlZm9yZQotCQkgKi8KLQkJZ290byBmYWlsZWRfb3V0OwotCX0KLQlpZiAoISplcnIpIHsKLQkJaWYgKHRhcmdldCA9PSBibGtzKSB7Ci0JCQkvKgotCQkJICogc2F2ZSB0aGUgbmV3IGJsb2NrIG51bWJlcgotCQkJICogZm9yIHRoZSBmaXJzdCBkaXJlY3QgYmxvY2sKLQkJCSAqLwotCQkJbmV3X2Jsb2Nrc1tpbmRleF0gPSBjdXJyZW50X2Jsb2NrOwotCQl9Ci0JCWJsa19hbGxvY2F0ZWQgKz0gYXIubGVuOwotCX0KLWFsbG9jYXRlZDoKLQkvKiB0b3RhbCBudW1iZXIgb2YgYmxvY2tzIGFsbG9jYXRlZCBmb3IgZGlyZWN0IGJsb2NrcyAqLwotCXJldCA9IGJsa19hbGxvY2F0ZWQ7Ci0JKmVyciA9IDA7Ci0JcmV0dXJuIHJldDsKLWZhaWxlZF9vdXQ6Ci0JZm9yIChpID0gMDsgaSA8IGluZGV4OyBpKyspCi0JCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgTlVMTCwgbmV3X2Jsb2Nrc1tpXSwgMSwgMCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKglleHQ0X2FsbG9jX2JyYW5jaCAtIGFsbG9jYXRlIGFuZCBzZXQgdXAgYSBjaGFpbiBvZiBibG9ja3MuCi0gKglAaGFuZGxlOiBoYW5kbGUgZm9yIHRoaXMgdHJhbnNhY3Rpb24KLSAqCUBpbm9kZTogb3duZXIKLSAqCUBpbmRpcmVjdF9ibGtzOiBudW1iZXIgb2YgYWxsb2NhdGVkIGluZGlyZWN0IGJsb2NrcwotICoJQGJsa3M6IG51bWJlciBvZiBhbGxvY2F0ZWQgZGlyZWN0IGJsb2NrcwotICoJQGdvYWw6IHByZWZlcnJlZCBwbGFjZSBmb3IgYWxsb2NhdGlvbgotICoJQG9mZnNldHM6IG9mZnNldHMgKGluIHRoZSBibG9ja3MpIHRvIHN0b3JlIHRoZSBwb2ludGVycyB0byBuZXh0LgotICoJQGJyYW5jaDogcGxhY2UgdG8gc3RvcmUgdGhlIGNoYWluIGluLgotICoKLSAqCVRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIGJsb2NrcywgemVyb2VzIG91dCBhbGwgYnV0IHRoZSBsYXN0IG9uZSwKLSAqCWxpbmtzIHRoZW0gaW50byBjaGFpbiBhbmQgKGlmIHdlIGFyZSBzeW5jaHJvbm91cykgd3JpdGVzIHRoZW0gdG8gZGlzay4KLSAqCUluIG90aGVyIHdvcmRzLCBpdCBwcmVwYXJlcyBhIGJyYW5jaCB0aGF0IGNhbiBiZSBzcGxpY2VkIG9udG8gdGhlCi0gKglpbm9kZS4gSXQgc3RvcmVzIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGF0IGNoYWluIGluIHRoZSBicmFuY2hbXSwgaW4KLSAqCXRoZSBzYW1lIGZvcm1hdCBhcyBleHQ0X2dldF9icmFuY2goKSB3b3VsZCBkby4gV2UgYXJlIGNhbGxpbmcgaXQgYWZ0ZXIKLSAqCXdlIGhhZCByZWFkIHRoZSBleGlzdGluZyBwYXJ0IG9mIGNoYWluIGFuZCBwYXJ0aWFsIHBvaW50cyB0byB0aGUgbGFzdAotICoJdHJpcGxlIG9mIHRoYXQgKG9uZSB3aXRoIHplcm8gLT5rZXkpLiBVcG9uIHRoZSBleGl0IHdlIGhhdmUgdGhlIHNhbWUKLSAqCXBpY3R1cmUgYXMgYWZ0ZXIgdGhlIHN1Y2Nlc3NmdWwgZXh0NF9nZXRfYmxvY2soKSwgZXhjZXB0IHRoYXQgaW4gb25lCi0gKglwbGFjZSBjaGFpbiBpcyBkaXNjb25uZWN0ZWQgLSAqYnJhbmNoLT5wIGlzIHN0aWxsIHplcm8gKHdlIGRpZCBub3QKLSAqCXNldCB0aGUgbGFzdCBsaW5rKSwgYnV0IGJyYW5jaC0+a2V5IGNvbnRhaW5zIHRoZSBudW1iZXIgdGhhdCBzaG91bGQKLSAqCWJlIHBsYWNlZCBpbnRvICpicmFuY2gtPnAgdG8gZmlsbCB0aGF0IGdhcC4KLSAqCi0gKglJZiBhbGxvY2F0aW9uIGZhaWxzIHdlIGZyZWUgYWxsIGJsb2NrcyB3ZSd2ZSBhbGxvY2F0ZWQgKGFuZCBmb3JnZXQKLSAqCXRoZWlyIGJ1ZmZlcl9oZWFkcykgYW5kIHJldHVybiB0aGUgZXJyb3IgdmFsdWUgdGhlIGZyb20gZmFpbGVkCi0gKglleHQ0X2FsbG9jX2Jsb2NrKCkgKG5vcm1hbGx5IC1FTk9TUEMpLiBPdGhlcndpc2Ugd2Ugc2V0IHRoZSBjaGFpbgotICoJYXMgZGVzY3JpYmVkIGFib3ZlIGFuZCByZXR1cm4gMC4KLSAqLwotc3RhdGljIGludCBleHQ0X2FsbG9jX2JyYW5jaChoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJICAgICBleHQ0X2xibGtfdCBpYmxvY2ssIGludCBpbmRpcmVjdF9ibGtzLAotCQkJICAgICBpbnQgKmJsa3MsIGV4dDRfZnNibGtfdCBnb2FsLAotCQkJICAgICBleHQ0X2xibGtfdCAqb2Zmc2V0cywgSW5kaXJlY3QgKmJyYW5jaCkKLXsKLQlpbnQgYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOwotCWludCBpLCBuID0gMDsKLQlpbnQgZXJyID0gMDsKLQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwotCWludCBudW07Ci0JZXh0NF9mc2Jsa190IG5ld19ibG9ja3NbNF07Ci0JZXh0NF9mc2Jsa190IGN1cnJlbnRfYmxvY2s7Ci0KLQludW0gPSBleHQ0X2FsbG9jX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBpYmxvY2ssIGdvYWwsIGluZGlyZWN0X2Jsa3MsCi0JCQkJKmJsa3MsIG5ld19ibG9ja3MsICZlcnIpOwotCWlmIChlcnIpCi0JCXJldHVybiBlcnI7Ci0KLQlicmFuY2hbMF0ua2V5ID0gY3B1X3RvX2xlMzIobmV3X2Jsb2Nrc1swXSk7Ci0JLyoKLQkgKiBtZXRhZGF0YSBibG9ja3MgYW5kIGRhdGEgYmxvY2tzIGFyZSBhbGxvY2F0ZWQuCi0JICovCi0JZm9yIChuID0gMTsgbiA8PSBpbmRpcmVjdF9ibGtzOyAgbisrKSB7Ci0JCS8qCi0JCSAqIEdldCBidWZmZXJfaGVhZCBmb3IgcGFyZW50IGJsb2NrLCB6ZXJvIGl0IG91dAotCQkgKiBhbmQgc2V0IHRoZSBwb2ludGVyIHRvIG5ldyBvbmUsIHRoZW4gc2VuZAotCQkgKiBwYXJlbnQgdG8gZGlzay4KLQkJICovCi0JCWJoID0gc2JfZ2V0YmxrKGlub2RlLT5pX3NiLCBuZXdfYmxvY2tzW24tMV0pOwotCQlpZiAodW5saWtlbHkoIWJoKSkgewotCQkJZXJyID0gLUVJTzsKLQkJCWdvdG8gZmFpbGVkOwotCQl9Ci0KLQkJYnJhbmNoW25dLmJoID0gYmg7Ci0JCWxvY2tfYnVmZmVyKGJoKTsKLQkJQlVGRkVSX1RSQUNFKGJoLCAiY2FsbCBnZXRfY3JlYXRlX2FjY2VzcyIpOwotCQllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X2NyZWF0ZV9hY2Nlc3MoaGFuZGxlLCBiaCk7Ci0JCWlmIChlcnIpIHsKLQkJCS8qIERvbid0IGJyZWxzZShiaCkgaGVyZTsgaXQncyBkb25lIGluCi0JCQkgKiBleHQ0X2pvdXJuYWxfZm9yZ2V0KCkgYmVsb3cgKi8KLQkJCXVubG9ja19idWZmZXIoYmgpOwotCQkJZ290byBmYWlsZWQ7Ci0JCX0KLQotCQltZW1zZXQoYmgtPmJfZGF0YSwgMCwgYmxvY2tzaXplKTsKLQkJYnJhbmNoW25dLnAgPSAoX19sZTMyICopIGJoLT5iX2RhdGEgKyBvZmZzZXRzW25dOwotCQlicmFuY2hbbl0ua2V5ID0gY3B1X3RvX2xlMzIobmV3X2Jsb2Nrc1tuXSk7Ci0JCSpicmFuY2hbbl0ucCA9IGJyYW5jaFtuXS5rZXk7Ci0JCWlmIChuID09IGluZGlyZWN0X2Jsa3MpIHsKLQkJCWN1cnJlbnRfYmxvY2sgPSBuZXdfYmxvY2tzW25dOwotCQkJLyoKLQkJCSAqIEVuZCBvZiBjaGFpbiwgdXBkYXRlIHRoZSBsYXN0IG5ldyBtZXRhYmxvY2sgb2YKLQkJCSAqIHRoZSBjaGFpbiB0byBwb2ludCB0byB0aGUgbmV3IGFsbG9jYXRlZAotCQkJICogZGF0YSBibG9ja3MgbnVtYmVycwotCQkJICovCi0JCQlmb3IgKGkgPSAxOyBpIDwgbnVtOyBpKyspCi0JCQkJKihicmFuY2hbbl0ucCArIGkpID0gY3B1X3RvX2xlMzIoKytjdXJyZW50X2Jsb2NrKTsKLQkJfQotCQlCVUZGRVJfVFJBQ0UoYmgsICJtYXJraW5nIHVwdG9kYXRlIik7Ci0JCXNldF9idWZmZXJfdXB0b2RhdGUoYmgpOwotCQl1bmxvY2tfYnVmZmVyKGJoKTsKLQotCQlCVUZGRVJfVFJBQ0UoYmgsICJjYWxsIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhIik7Ci0JCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsIGJoKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZmFpbGVkOwotCX0KLQkqYmxrcyA9IG51bTsKLQlyZXR1cm4gZXJyOwotZmFpbGVkOgotCS8qIEFsbG9jYXRpb24gZmFpbGVkLCBmcmVlIHdoYXQgd2UgYWxyZWFkeSBhbGxvY2F0ZWQgKi8KLQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsIG5ld19ibG9ja3NbMF0sIDEsIDApOwotCWZvciAoaSA9IDE7IGkgPD0gbiA7IGkrKykgewotCQkvKgotCQkgKiBicmFuY2hbaV0uYmggaXMgbmV3bHkgYWxsb2NhdGVkLCBzbyB0aGVyZSBpcyBubwotCQkgKiBuZWVkIHRvIHJldm9rZSB0aGUgYmxvY2ssIHdoaWNoIGlzIHdoeSB3ZSBkb24ndAotCQkgKiBuZWVkIHRvIHNldCBFWFQ0X0ZSRUVfQkxPQ0tTX01FVEFEQVRBLgotCQkgKi8KLQkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBOVUxMLCBuZXdfYmxvY2tzW2ldLCAxLAotCQkJCSBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVCk7Ci0JfQotCWZvciAoaSA9IG4rMTsgaSA8IGluZGlyZWN0X2Jsa3M7IGkrKykKLQkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCBOVUxMLCBuZXdfYmxvY2tzW2ldLCAxLCAwKTsKLQotCWV4dDRfZnJlZV9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgTlVMTCwgbmV3X2Jsb2Nrc1tpXSwgbnVtLCAwKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLS8qKgotICogZXh0NF9zcGxpY2VfYnJhbmNoIC0gc3BsaWNlIHRoZSBhbGxvY2F0ZWQgYnJhbmNoIG9udG8gaW5vZGUuCi0gKiBAaGFuZGxlOiBoYW5kbGUgZm9yIHRoaXMgdHJhbnNhY3Rpb24KLSAqIEBpbm9kZTogb3duZXIKLSAqIEBibG9jazogKGxvZ2ljYWwpIG51bWJlciBvZiBibG9jayB3ZSBhcmUgYWRkaW5nCi0gKiBAY2hhaW46IGNoYWluIG9mIGluZGlyZWN0IGJsb2NrcyAod2l0aCBhIG1pc3NpbmcgbGluayAtIHNlZQotICoJZXh0NF9hbGxvY19icmFuY2gpCi0gKiBAd2hlcmU6IGxvY2F0aW9uIG9mIG1pc3NpbmcgbGluawotICogQG51bTogICBudW1iZXIgb2YgaW5kaXJlY3QgYmxvY2tzIHdlIGFyZSBhZGRpbmcKLSAqIEBibGtzOiAgbnVtYmVyIG9mIGRpcmVjdCBibG9ja3Mgd2UgYXJlIGFkZGluZwotICoKLSAqIFRoaXMgZnVuY3Rpb24gZmlsbHMgdGhlIG1pc3NpbmcgbGluayBhbmQgZG9lcyBhbGwgaG91c2VrZWVwaW5nIG5lZWRlZCBpbgotICogaW5vZGUgKC0+aV9ibG9ja3MsIGV0Yy4pLiBJbiBjYXNlIG9mIHN1Y2Nlc3Mgd2UgZW5kIHVwIHdpdGggdGhlIGZ1bGwKLSAqIGNoYWluIHRvIG5ldyBibG9jayBhbmQgcmV0dXJuIDAuCi0gKi8KLXN0YXRpYyBpbnQgZXh0NF9zcGxpY2VfYnJhbmNoKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgICAgICBleHQ0X2xibGtfdCBibG9jaywgSW5kaXJlY3QgKndoZXJlLCBpbnQgbnVtLAotCQkJICAgICAgaW50IGJsa3MpCi17Ci0JaW50IGk7Ci0JaW50IGVyciA9IDA7Ci0JZXh0NF9mc2Jsa190IGN1cnJlbnRfYmxvY2s7Ci0KLQkvKgotCSAqIElmIHdlJ3JlIHNwbGljaW5nIGludG8gYSBbdGRdaW5kaXJlY3QgYmxvY2sgKGFzIG9wcG9zZWQgdG8gdGhlCi0JICogaW5vZGUpIHRoZW4gd2UgbmVlZCB0byBnZXQgd3JpdGUgYWNjZXNzIHRvIHRoZSBbdGRdaW5kaXJlY3QgYmxvY2sKLQkgKiBiZWZvcmUgdGhlIHNwbGljZS4KLQkgKi8KLQlpZiAod2hlcmUtPmJoKSB7Ci0JCUJVRkZFUl9UUkFDRSh3aGVyZS0+YmgsICJnZXRfd3JpdGVfYWNjZXNzIik7Ci0JCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgd2hlcmUtPmJoKTsKLQkJaWYgKGVycikKLQkJCWdvdG8gZXJyX291dDsKLQl9Ci0JLyogVGhhdCdzIGl0ICovCi0KLQkqd2hlcmUtPnAgPSB3aGVyZS0+a2V5OwotCi0JLyoKLQkgKiBVcGRhdGUgdGhlIGhvc3QgYnVmZmVyX2hlYWQgb3IgaW5vZGUgdG8gcG9pbnQgdG8gbW9yZSBqdXN0IGFsbG9jYXRlZAotCSAqIGRpcmVjdCBibG9ja3MgYmxvY2tzCi0JICovCi0JaWYgKG51bSA9PSAwICYmIGJsa3MgPiAxKSB7Ci0JCWN1cnJlbnRfYmxvY2sgPSBsZTMyX3RvX2NwdSh3aGVyZS0+a2V5KSArIDE7Ci0JCWZvciAoaSA9IDE7IGkgPCBibGtzOyBpKyspCi0JCQkqKHdoZXJlLT5wICsgaSkgPSBjcHVfdG9fbGUzMihjdXJyZW50X2Jsb2NrKyspOwotCX0KLQotCS8qIFdlIGFyZSBkb25lIHdpdGggYXRvbWljIHN0dWZmLCBub3cgZG8gdGhlIHJlc3Qgb2YgaG91c2VrZWVwaW5nICovCi0JLyogaGFkIHdlIHNwbGljZWQgaXQgb250byBpbmRpcmVjdCBibG9jaz8gKi8KLQlpZiAod2hlcmUtPmJoKSB7Ci0JCS8qCi0JCSAqIElmIHdlIHNwbGljZWQgaXQgb250byBhbiBpbmRpcmVjdCBibG9jaywgd2UgaGF2ZW4ndAotCQkgKiBhbHRlcmVkIHRoZSBpbm9kZS4gIE5vdGUgaG93ZXZlciB0aGF0IGlmIGl0IGlzIGJlaW5nIHNwbGljZWQKLQkJICogb250byBhbiBpbmRpcmVjdCBibG9jayBhdCB0aGUgdmVyeSBlbmQgb2YgdGhlIGZpbGUgKHRoZQotCQkgKiBmaWxlIGlzIGdyb3dpbmcpIHRoZW4gd2UgKndpbGwqIGFsdGVyIHRoZSBpbm9kZSB0byByZWZsZWN0Ci0JCSAqIHRoZSBuZXcgaV9zaXplLiAgQnV0IHRoYXQgaXMgbm90IGRvbmUgaGVyZSAtIGl0IGlzIGRvbmUgaW4KLQkJICogZ2VuZXJpY19jb21taXRfd3JpdGUtPl9fbWFya19pbm9kZV9kaXJ0eS0+ZXh0NF9kaXJ0eV9pbm9kZS4KLQkJICovCi0JCWpiZF9kZWJ1Zyg1LCAic3BsaWNpbmcgaW5kaXJlY3Qgb25seVxuIik7Ci0JCUJVRkZFUl9UUkFDRSh3aGVyZS0+YmgsICJjYWxsIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhIik7Ci0JCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgaW5vZGUsIHdoZXJlLT5iaCk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIGVycl9vdXQ7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogT0ssIHdlIHNwbGljZWQgaXQgaW50byB0aGUgaW5vZGUgaXRzZWxmIG9uIGEgZGlyZWN0IGJsb2NrLgotCQkgKi8KLQkJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwotCQlqYmRfZGVidWcoNSwgInNwbGljaW5nIGRpcmVjdFxuIik7Ci0JfQotCXJldHVybiBlcnI7Ci0KLWVycl9vdXQ6Ci0JZm9yIChpID0gMTsgaSA8PSBudW07IGkrKykgewotCQkvKgotCQkgKiBicmFuY2hbaV0uYmggaXMgbmV3bHkgYWxsb2NhdGVkLCBzbyB0aGVyZSBpcyBubwotCQkgKiBuZWVkIHRvIHJldm9rZSB0aGUgYmxvY2ssIHdoaWNoIGlzIHdoeSB3ZSBkb24ndAotCQkgKiBuZWVkIHRvIHNldCBFWFQ0X0ZSRUVfQkxPQ0tTX01FVEFEQVRBLgotCQkgKi8KLQkJZXh0NF9mcmVlX2Jsb2NrcyhoYW5kbGUsIGlub2RlLCB3aGVyZVtpXS5iaCwgMCwgMSwKLQkJCQkgRVhUNF9GUkVFX0JMT0NLU19GT1JHRVQpOwotCX0KLQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsIGxlMzJfdG9fY3B1KHdoZXJlW251bV0ua2V5KSwKLQkJCSBibGtzLCAwKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLS8qCi0gKiBUaGUgZXh0NF9pbmRfbWFwX2Jsb2NrcygpIGZ1bmN0aW9uIGhhbmRsZXMgbm9uLWV4dGVudHMgaW5vZGVzCi0gKiAoaS5lLiwgdXNpbmcgdGhlIHRyYWRpdGlvbmFsIGluZGlyZWN0L2RvdWJsZS1pbmRpcmVjdCBpX2Jsb2NrcwotICogc2NoZW1lKSBmb3IgZXh0NF9tYXBfYmxvY2tzKCkuCi0gKgotICogQWxsb2NhdGlvbiBzdHJhdGVneSBpcyBzaW1wbGU6IGlmIHdlIGhhdmUgdG8gYWxsb2NhdGUgc29tZXRoaW5nLCB3ZSB3aWxsCi0gKiBoYXZlIHRvIGdvIHRoZSB3aG9sZSB3YXkgdG8gbGVhZi4gU28gbGV0J3MgZG8gaXQgYmVmb3JlIGF0dGFjaGluZyBhbnl0aGluZwotICogdG8gdHJlZSwgc2V0IGxpbmthZ2UgYmV0d2VlbiB0aGUgbmV3Ym9ybiBibG9ja3MsIHdyaXRlIHRoZW0gaWYgc3luYyBpcwotICogcmVxdWlyZWQsIHJlY2hlY2sgdGhlIHBhdGgsIGZyZWUgYW5kIHJlcGVhdCBpZiBjaGVjayBmYWlscywgb3RoZXJ3aXNlCi0gKiBzZXQgdGhlIGxhc3QgbWlzc2luZyBsaW5rICh0aGF0IHdpbGwgcHJvdGVjdCB1cyBmcm9tIGFueSB0cnVuY2F0ZS1nZW5lcmF0ZWQKLSAqIHJlbW92YWxzIC0gYWxsIGJsb2NrcyBvbiB0aGUgcGF0aCBhcmUgaW1tdW5lIG5vdykgYW5kIHBvc3NpYmx5IGZvcmNlIHRoZQotICogd3JpdGUgb24gdGhlIHBhcmVudCBibG9jay4KLSAqIFRoYXQgaGFzIGEgbmljZSBhZGRpdGlvbmFsIHByb3BlcnR5OiBubyBzcGVjaWFsIHJlY292ZXJ5IGZyb20gdGhlIGZhaWxlZAotICogYWxsb2NhdGlvbnMgaXMgbmVlZGVkIC0gd2Ugc2ltcGx5IHJlbGVhc2UgYmxvY2tzIGFuZCBkbyBub3QgdG91Y2ggYW55dGhpbmcKLSAqIHJlYWNoYWJsZSBmcm9tIGlub2RlLgotICoKLSAqIGBoYW5kbGUnIGNhbiBiZSBOVUxMIGlmIGNyZWF0ZSA9PSAwLgotICoKLSAqIHJldHVybiA+IDAsICMgb2YgYmxvY2tzIG1hcHBlZCBvciBhbGxvY2F0ZWQuCi0gKiByZXR1cm4gPSAwLCBpZiBwbGFpbiBsb29rdXAgZmFpbGVkLgotICogcmV0dXJuIDwgMCwgZXJyb3IgY2FzZS4KLSAqCi0gKiBUaGUgZXh0NF9pbmRfZ2V0X2Jsb2NrcygpIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2l0aAotICogZG93bl93cml0ZSgmRVhUNF9JKGlub2RlKS0+aV9kYXRhX3NlbSkgaWYgYWxsb2NhdGluZyBmaWxlc3lzdGVtCi0gKiBibG9ja3MgKGkuZS4sIGZsYWdzIGhhcyBFWFQ0X0dFVF9CTE9DS1NfQ1JFQVRFIHNldCkgb3IKLSAqIGRvd25fcmVhZCgmRVhUNF9JKGlub2RlKS0+aV9kYXRhX3NlbSkgaWYgbm90IGFsbG9jYXRpbmcgZmlsZSBzeXN0ZW0KLSAqIGJsb2Nrcy4KLSAqLwotc3RhdGljIGludCBleHQ0X2luZF9tYXBfYmxvY2tzKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgICAgICAgc3RydWN0IGV4dDRfbWFwX2Jsb2NrcyAqbWFwLAotCQkJICAgICAgIGludCBmbGFncykKLXsKLQlpbnQgZXJyID0gLUVJTzsKLQlleHQ0X2xibGtfdCBvZmZzZXRzWzRdOwotCUluZGlyZWN0IGNoYWluWzRdOwotCUluZGlyZWN0ICpwYXJ0aWFsOwotCWV4dDRfZnNibGtfdCBnb2FsOwotCWludCBpbmRpcmVjdF9ibGtzOwotCWludCBibG9ja3NfdG9fYm91bmRhcnkgPSAwOwotCWludCBkZXB0aDsKLQlpbnQgY291bnQgPSAwOwotCWV4dDRfZnNibGtfdCBmaXJzdF9ibG9jayA9IDA7Ci0KLQl0cmFjZV9leHQ0X2luZF9tYXBfYmxvY2tzX2VudGVyKGlub2RlLCBtYXAtPm1fbGJsaywgbWFwLT5tX2xlbiwgZmxhZ3MpOwotCUpfQVNTRVJUKCEoZXh0NF90ZXN0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfRVhURU5UUykpKTsKLQlKX0FTU0VSVChoYW5kbGUgIT0gTlVMTCB8fCAoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfQ1JFQVRFKSA9PSAwKTsKLQlkZXB0aCA9IGV4dDRfYmxvY2tfdG9fcGF0aChpbm9kZSwgbWFwLT5tX2xibGssIG9mZnNldHMsCi0JCQkJICAgJmJsb2Nrc190b19ib3VuZGFyeSk7Ci0KLQlpZiAoZGVwdGggPT0gMCkKLQkJZ290byBvdXQ7Ci0KLQlwYXJ0aWFsID0gZXh0NF9nZXRfYnJhbmNoKGlub2RlLCBkZXB0aCwgb2Zmc2V0cywgY2hhaW4sICZlcnIpOwotCi0JLyogU2ltcGxlc3QgY2FzZSAtIGJsb2NrIGZvdW5kLCBubyBhbGxvY2F0aW9uIG5lZWRlZCAqLwotCWlmICghcGFydGlhbCkgewotCQlmaXJzdF9ibG9jayA9IGxlMzJfdG9fY3B1KGNoYWluW2RlcHRoIC0gMV0ua2V5KTsKLQkJY291bnQrKzsKLQkJLyptYXAgbW9yZSBibG9ja3MqLwotCQl3aGlsZSAoY291bnQgPCBtYXAtPm1fbGVuICYmIGNvdW50IDw9IGJsb2Nrc190b19ib3VuZGFyeSkgewotCQkJZXh0NF9mc2Jsa190IGJsazsKLQotCQkJYmxrID0gbGUzMl90b19jcHUoKihjaGFpbltkZXB0aC0xXS5wICsgY291bnQpKTsKLQotCQkJaWYgKGJsayA9PSBmaXJzdF9ibG9jayArIGNvdW50KQotCQkJCWNvdW50Kys7Ci0JCQllbHNlCi0JCQkJYnJlYWs7Ci0JCX0KLQkJZ290byBnb3RfaXQ7Ci0JfQotCi0JLyogTmV4dCBzaW1wbGUgY2FzZSAtIHBsYWluIGxvb2t1cCBvciBmYWlsZWQgcmVhZCBvZiBpbmRpcmVjdCBibG9jayAqLwotCWlmICgoZmxhZ3MgJiBFWFQ0X0dFVF9CTE9DS1NfQ1JFQVRFKSA9PSAwIHx8IGVyciA9PSAtRUlPKQotCQlnb3RvIGNsZWFudXA7Ci0KLQkvKgotCSAqIE9rYXksIHdlIG5lZWQgdG8gZG8gYmxvY2sgYWxsb2NhdGlvbi4KLQkqLwotCWdvYWwgPSBleHQ0X2ZpbmRfZ29hbChpbm9kZSwgbWFwLT5tX2xibGssIHBhcnRpYWwpOwotCi0JLyogdGhlIG51bWJlciBvZiBibG9ja3MgbmVlZCB0byBhbGxvY2F0ZSBmb3IgW2QsdF1pbmRpcmVjdCBibG9ja3MgKi8KLQlpbmRpcmVjdF9ibGtzID0gKGNoYWluICsgZGVwdGgpIC0gcGFydGlhbCAtIDE7Ci0KLQkvKgotCSAqIE5leHQgbG9vayB1cCB0aGUgaW5kaXJlY3QgbWFwIHRvIGNvdW50IHRoZSB0b3RvYWwgbnVtYmVyIG9mCi0JICogZGlyZWN0IGJsb2NrcyB0byBhbGxvY2F0ZSBmb3IgdGhpcyBicmFuY2guCi0JICovCi0JY291bnQgPSBleHQ0X2Jsa3NfdG9fYWxsb2NhdGUocGFydGlhbCwgaW5kaXJlY3RfYmxrcywKLQkJCQkgICAgICBtYXAtPm1fbGVuLCBibG9ja3NfdG9fYm91bmRhcnkpOwotCS8qCi0JICogQmxvY2sgb3V0IGV4dDRfdHJ1bmNhdGUgd2hpbGUgd2UgYWx0ZXIgdGhlIHRyZWUKLQkgKi8KLQllcnIgPSBleHQ0X2FsbG9jX2JyYW5jaChoYW5kbGUsIGlub2RlLCBtYXAtPm1fbGJsaywgaW5kaXJlY3RfYmxrcywKLQkJCQkmY291bnQsIGdvYWwsCi0JCQkJb2Zmc2V0cyArIChwYXJ0aWFsIC0gY2hhaW4pLCBwYXJ0aWFsKTsKLQotCS8qCi0JICogVGhlIGV4dDRfc3BsaWNlX2JyYW5jaCBjYWxsIHdpbGwgZnJlZSBhbmQgZm9yZ2V0IGFueSBidWZmZXJzCi0JICogb24gdGhlIG5ldyBjaGFpbiBpZiB0aGVyZSBpcyBhIGZhaWx1cmUsIGJ1dCB0aGF0IHJpc2tzIHVzaW5nCi0JICogdXAgdHJhbnNhY3Rpb24gY3JlZGl0cywgZXNwZWNpYWxseSBmb3IgYml0bWFwcyB3aGVyZSB0aGUKLQkgKiBjcmVkaXRzIGNhbm5vdCBiZSByZXR1cm5lZC4gIENhbiB3ZSBoYW5kbGUgdGhpcyBzb21laG93PyAgV2UKLQkgKiBtYXkgbmVlZCB0byByZXR1cm4gLUVBR0FJTiB1cHdhcmRzIGluIHRoZSB3b3JzdCBjYXNlLiAgLS1zY3QKLQkgKi8KLQlpZiAoIWVycikKLQkJZXJyID0gZXh0NF9zcGxpY2VfYnJhbmNoKGhhbmRsZSwgaW5vZGUsIG1hcC0+bV9sYmxrLAotCQkJCQkgcGFydGlhbCwgaW5kaXJlY3RfYmxrcywgY291bnQpOwotCWlmIChlcnIpCi0JCWdvdG8gY2xlYW51cDsKLQotCW1hcC0+bV9mbGFncyB8PSBFWFQ0X01BUF9ORVc7Ci0KLQlleHQ0X3VwZGF0ZV9pbm9kZV9mc3luY190cmFucyhoYW5kbGUsIGlub2RlLCAxKTsKLWdvdF9pdDoKLQltYXAtPm1fZmxhZ3MgfD0gRVhUNF9NQVBfTUFQUEVEOwotCW1hcC0+bV9wYmxrID0gbGUzMl90b19jcHUoY2hhaW5bZGVwdGgtMV0ua2V5KTsKLQltYXAtPm1fbGVuID0gY291bnQ7Ci0JaWYgKGNvdW50ID4gYmxvY2tzX3RvX2JvdW5kYXJ5KQotCQltYXAtPm1fZmxhZ3MgfD0gRVhUNF9NQVBfQk9VTkRBUlk7Ci0JZXJyID0gY291bnQ7Ci0JLyogQ2xlYW4gdXAgYW5kIGV4aXQgKi8KLQlwYXJ0aWFsID0gY2hhaW4gKyBkZXB0aCAtIDE7CS8qIHRoZSB3aG9sZSBjaGFpbiAqLwotY2xlYW51cDoKLQl3aGlsZSAocGFydGlhbCA+IGNoYWluKSB7Ci0JCUJVRkZFUl9UUkFDRShwYXJ0aWFsLT5iaCwgImNhbGwgYnJlbHNlIik7Ci0JCWJyZWxzZShwYXJ0aWFsLT5iaCk7Ci0JCXBhcnRpYWwtLTsKLQl9Ci1vdXQ6Ci0JdHJhY2VfZXh0NF9pbmRfbWFwX2Jsb2Nrc19leGl0KGlub2RlLCBtYXAtPm1fbGJsaywKLQkJCQltYXAtPm1fcGJsaywgbWFwLT5tX2xlbiwgZXJyKTsKLQlyZXR1cm4gZXJyOwotfQotCiAjaWZkZWYgQ09ORklHX1FVT1RBCiBxc2l6ZV90ICpleHQ0X2dldF9yZXNlcnZlZF9zcGFjZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewpAQCAtMTA3MywzMyArMjQ0LDYgQEAKIAogLyoKICAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIG1ldGFkYXRhIGJsb2NrcyBuZWVkIHRvIHJlc2VydmUKLSAqIHRvIGFsbG9jYXRlIGEgbmV3IGJsb2NrIGF0IEBsYmxvY2tzIGZvciBub24gZXh0ZW50IGZpbGUgYmFzZWQgZmlsZQotICovCi1zdGF0aWMgaW50IGV4dDRfaW5kaXJlY3RfY2FsY19tZXRhZGF0YV9hbW91bnQoc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkJICAgICAgc2VjdG9yX3QgbGJsb2NrKQotewotCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTsKLQlzZWN0b3JfdCBkaW5kX21hc2sgPSB+KChzZWN0b3JfdClFWFQ0X0FERFJfUEVSX0JMT0NLKGlub2RlLT5pX3NiKSAtIDEpOwotCWludCBibGtfYml0czsKLQotCWlmIChsYmxvY2sgPCBFWFQ0X05ESVJfQkxPQ0tTKQotCQlyZXR1cm4gMDsKLQotCWxibG9jayAtPSBFWFQ0X05ESVJfQkxPQ0tTOwotCi0JaWYgKGVpLT5pX2RhX21ldGFkYXRhX2NhbGNfbGVuICYmCi0JICAgIChsYmxvY2sgJiBkaW5kX21hc2spID09IGVpLT5pX2RhX21ldGFkYXRhX2NhbGNfbGFzdF9sYmxvY2spIHsKLQkJZWktPmlfZGFfbWV0YWRhdGFfY2FsY19sZW4rKzsKLQkJcmV0dXJuIDA7Ci0JfQotCWVpLT5pX2RhX21ldGFkYXRhX2NhbGNfbGFzdF9sYmxvY2sgPSBsYmxvY2sgJiBkaW5kX21hc2s7Ci0JZWktPmlfZGFfbWV0YWRhdGFfY2FsY19sZW4gPSAxOwotCWJsa19iaXRzID0gb3JkZXJfYmFzZV8yKGxibG9jayk7Ci0JcmV0dXJuIChibGtfYml0cyAvIEVYVDRfQUREUl9QRVJfQkxPQ0tfQklUUyhpbm9kZS0+aV9zYikpICsgMTsKLX0KLQotLyoKLSAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIG1ldGFkYXRhIGJsb2NrcyBuZWVkIHRvIHJlc2VydmUKICAqIHRvIGFsbG9jYXRlIGEgYmxvY2sgbG9jYXRlZCBhdCBAbGJsb2NrCiAgKi8KIHN0YXRpYyBpbnQgZXh0NF9jYWxjX21ldGFkYXRhX2Ftb3VudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBsYmxvY2spCkBAIC0xMTA3LDcgKzI1MSw3IEBACiAJaWYgKGV4dDRfdGVzdF9pbm9kZV9mbGFnKGlub2RlLCBFWFQ0X0lOT0RFX0VYVEVOVFMpKQogCQlyZXR1cm4gZXh0NF9leHRfY2FsY19tZXRhZGF0YV9hbW91bnQoaW5vZGUsIGxibG9jayk7CiAKLQlyZXR1cm4gZXh0NF9pbmRpcmVjdF9jYWxjX21ldGFkYXRhX2Ftb3VudChpbm9kZSwgbGJsb2NrKTsKKwlyZXR1cm4gZXh0NF9pbmRfY2FsY19tZXRhZGF0YV9hbW91bnQoaW5vZGUsIGxibG9jayk7CiB9CiAKIC8qCkBAIC0xNTg5LDE2ICs3MzMsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qCi0gKiBUcnVuY2F0ZSBibG9ja3MgdGhhdCB3ZXJlIG5vdCB1c2VkIGJ5IHdyaXRlLiBXZSBoYXZlIHRvIHRydW5jYXRlIHRoZQotICogcGFnZWNhY2hlIGFzIHdlbGwgc28gdGhhdCBjb3JyZXNwb25kaW5nIGJ1ZmZlcnMgZ2V0IHByb3Blcmx5IHVubWFwcGVkLgotICovCi1zdGF0aWMgdm9pZCBleHQ0X3RydW5jYXRlX2ZhaWxlZF93cml0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQotewotCXRydW5jYXRlX2lub2RlX3BhZ2VzKGlub2RlLT5pX21hcHBpbmcsIGlub2RlLT5pX3NpemUpOwotCWV4dDRfdHJ1bmNhdGUoaW5vZGUpOwotfQotCiBzdGF0aWMgaW50IGV4dDRfZ2V0X2Jsb2NrX3dyaXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHNlY3Rvcl90IGlibG9jaywKIAkJICAgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaF9yZXN1bHQsIGludCBjcmVhdGUpOwogc3RhdGljIGludCBleHQ0X3dyaXRlX2JlZ2luKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKQEAgLTE4NjMsNiArOTk3LDcgQEAKIAlpZiAobmV3X2lfc2l6ZSA+IGlub2RlLT5pX3NpemUpCiAJCWlfc2l6ZV93cml0ZShpbm9kZSwgcG9zK2NvcGllZCk7CiAJZXh0NF9zZXRfaW5vZGVfc3RhdGUoaW5vZGUsIEVYVDRfU1RBVEVfSkRBVEEpOworCUVYVDRfSShpbm9kZSktPmlfZGF0YXN5bmNfdGlkID0gaGFuZGxlLT5oX3RyYW5zYWN0aW9uLT50X3RpZDsKIAlpZiAobmV3X2lfc2l6ZSA+IEVYVDRfSShpbm9kZSktPmlfZGlza3NpemUpIHsKIAkJZXh0NF91cGRhdGVfaV9kaXNrc2l6ZShpbm9kZSwgbmV3X2lfc2l6ZSk7CiAJCXJldDIgPSBleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CkBAIC0yNTcxLDYgKzE3MDYsNyBAQAogCQkJCXdyaXRlX2VuZF9mbik7CiAJaWYgKHJldCA9PSAwKQogCQlyZXQgPSBlcnI7CisJRVhUNF9JKGlub2RlKS0+aV9kYXRhc3luY190aWQgPSBoYW5kbGUtPmhfdHJhbnNhY3Rpb24tPnRfdGlkOwogCWVyciA9IGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CiAJaWYgKCFyZXQpCiAJCXJldCA9IGVycjsKQEAgLTM0NTAsMTEyICsyNTg2LDYgQEAKIH0KIAogLyoKLSAqIE9fRElSRUNUIGZvciBleHQzIChvciBpbmRpcmVjdCBtYXApIGJhc2VkIGZpbGVzCi0gKgotICogSWYgdGhlIE9fRElSRUNUIHdyaXRlIHdpbGwgZXh0ZW5kIHRoZSBmaWxlIHRoZW4gYWRkIHRoaXMgaW5vZGUgdG8gdGhlCi0gKiBvcnBoYW4gbGlzdC4gIFNvIHJlY292ZXJ5IHdpbGwgdHJ1bmNhdGUgaXQgYmFjayB0byB0aGUgb3JpZ2luYWwgc2l6ZQotICogaWYgdGhlIG1hY2hpbmUgY3Jhc2hlcyBkdXJpbmcgdGhlIHdyaXRlLgotICoKLSAqIElmIHRoZSBPX0RJUkVDVCB3cml0ZSBpcyBpbnRhbnRpYXRpbmcgaG9sZXMgaW5zaWRlIGlfc2l6ZSBhbmQgdGhlIG1hY2hpbmUKLSAqIGNyYXNoZXMgdGhlbiBzdGFsZSBkaXNrIGRhdGEgX21heV8gYmUgZXhwb3NlZCBpbnNpZGUgdGhlIGZpbGUuIEJ1dCBjdXJyZW50Ci0gKiBWRlMgY29kZSBmYWxscyBiYWNrIGludG8gYnVmZmVyZWQgcGF0aCBpbiB0aGF0IGNhc2Ugc28gd2UgYXJlIHNhZmUuCi0gKi8KLXN0YXRpYyBzc2l6ZV90IGV4dDRfaW5kX2RpcmVjdF9JTyhpbnQgcncsIHN0cnVjdCBraW9jYiAqaW9jYiwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LCBsb2ZmX3Qgb2Zmc2V0LAotCQkJICAgICAgdW5zaWduZWQgbG9uZyBucl9zZWdzKQotewotCXN0cnVjdCBmaWxlICpmaWxlID0gaW9jYi0+a2lfZmlscDsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9tYXBwaW5nLT5ob3N0OwotCXN0cnVjdCBleHQ0X2lub2RlX2luZm8gKmVpID0gRVhUNF9JKGlub2RlKTsKLQloYW5kbGVfdCAqaGFuZGxlOwotCXNzaXplX3QgcmV0OwotCWludCBvcnBoYW4gPSAwOwotCXNpemVfdCBjb3VudCA9IGlvdl9sZW5ndGgoaW92LCBucl9zZWdzKTsKLQlpbnQgcmV0cmllcyA9IDA7Ci0KLQlpZiAocncgPT0gV1JJVEUpIHsKLQkJbG9mZl90IGZpbmFsX3NpemUgPSBvZmZzZXQgKyBjb3VudDsKLQotCQlpZiAoZmluYWxfc2l6ZSA+IGlub2RlLT5pX3NpemUpIHsKLQkJCS8qIENyZWRpdHMgZm9yIHNiICsgaW5vZGUgd3JpdGUgKi8KLQkJCWhhbmRsZSA9IGV4dDRfam91cm5hbF9zdGFydChpbm9kZSwgMik7Ci0JCQlpZiAoSVNfRVJSKGhhbmRsZSkpIHsKLQkJCQlyZXQgPSBQVFJfRVJSKGhhbmRsZSk7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCQlyZXQgPSBleHQ0X29ycGhhbl9hZGQoaGFuZGxlLCBpbm9kZSk7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKTsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJCW9ycGhhbiA9IDE7Ci0JCQllaS0+aV9kaXNrc2l6ZSA9IGlub2RlLT5pX3NpemU7Ci0JCQlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOwotCQl9Ci0JfQotCi1yZXRyeToKLQlpZiAocncgPT0gUkVBRCAmJiBleHQ0X3Nob3VsZF9kaW9yZWFkX25vbG9jayhpbm9kZSkpCi0JCXJldCA9IF9fYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwKLQkJCQkgaW5vZGUtPmlfc2ItPnNfYmRldiwgaW92LAotCQkJCSBvZmZzZXQsIG5yX3NlZ3MsCi0JCQkJIGV4dDRfZ2V0X2Jsb2NrLCBOVUxMLCBOVUxMLCAwKTsKLQllbHNlIHsKLQkJcmV0ID0gYmxvY2tkZXZfZGlyZWN0X0lPKHJ3LCBpb2NiLCBpbm9kZSwgaW92LAotCQkJCSBvZmZzZXQsIG5yX3NlZ3MsIGV4dDRfZ2V0X2Jsb2NrKTsKLQotCQlpZiAodW5saWtlbHkoKHJ3ICYgV1JJVEUpICYmIHJldCA8IDApKSB7Ci0JCQlsb2ZmX3QgaXNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7Ci0JCQlsb2ZmX3QgZW5kID0gb2Zmc2V0ICsgaW92X2xlbmd0aChpb3YsIG5yX3NlZ3MpOwotCi0JCQlpZiAoZW5kID4gaXNpemUpCi0JCQkJZXh0NF90cnVuY2F0ZV9mYWlsZWRfd3JpdGUoaW5vZGUpOwotCQl9Ci0JfQotCWlmIChyZXQgPT0gLUVOT1NQQyAmJiBleHQ0X3Nob3VsZF9yZXRyeV9hbGxvYyhpbm9kZS0+aV9zYiwgJnJldHJpZXMpKQotCQlnb3RvIHJldHJ5OwotCi0JaWYgKG9ycGhhbikgewotCQlpbnQgZXJyOwotCi0JCS8qIENyZWRpdHMgZm9yIHNiICsgaW5vZGUgd3JpdGUgKi8KLQkJaGFuZGxlID0gZXh0NF9qb3VybmFsX3N0YXJ0KGlub2RlLCAyKTsKLQkJaWYgKElTX0VSUihoYW5kbGUpKSB7Ci0JCQkvKiBUaGlzIGlzIHJlYWxseSBiYWQgbHVjay4gV2UndmUgd3JpdHRlbiB0aGUgZGF0YQotCQkJICogYnV0IGNhbm5vdCBleHRlbmQgaV9zaXplLiBCYWlsIG91dCBhbmQgcHJldGVuZAotCQkJICogdGhlIHdyaXRlIGZhaWxlZC4uLiAqLwotCQkJcmV0ID0gUFRSX0VSUihoYW5kbGUpOwotCQkJaWYgKGlub2RlLT5pX25saW5rKQotCQkJCWV4dDRfb3JwaGFuX2RlbChOVUxMLCBpbm9kZSk7Ci0KLQkJCWdvdG8gb3V0OwotCQl9Ci0JCWlmIChpbm9kZS0+aV9ubGluaykKLQkJCWV4dDRfb3JwaGFuX2RlbChoYW5kbGUsIGlub2RlKTsKLQkJaWYgKHJldCA+IDApIHsKLQkJCWxvZmZfdCBlbmQgPSBvZmZzZXQgKyByZXQ7Ci0JCQlpZiAoZW5kID4gaW5vZGUtPmlfc2l6ZSkgewotCQkJCWVpLT5pX2Rpc2tzaXplID0gZW5kOwotCQkJCWlfc2l6ZV93cml0ZShpbm9kZSwgZW5kKTsKLQkJCQkvKgotCQkJCSAqIFdlJ3JlIGdvaW5nIHRvIHJldHVybiBhIHBvc2l0aXZlIGByZXQnCi0JCQkJICogaGVyZSBkdWUgdG8gbm9uLXplcm8tbGVuZ3RoIEkvTywgc28gdGhlcmUncwotCQkJCSAqIG5vIHdheSBvZiByZXBvcnRpbmcgZXJyb3IgcmV0dXJucyBmcm9tCi0JCQkJICogZXh0NF9tYXJrX2lub2RlX2RpcnR5KCkgdG8gdXNlcnNwYWNlLiAgU28KLQkJCQkgKiBpZ25vcmUgaXQuCi0JCQkJICovCi0JCQkJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwotCQkJfQotCQl9Ci0JCWVyciA9IGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7Ci0JCWlmIChyZXQgPT0gMCkKLQkJCXJldCA9IGVycjsKLQl9Ci1vdXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoKICAqIGV4dDRfZ2V0X2Jsb2NrIHVzZWQgd2hlbiBwcmVwYXJpbmcgZm9yIGEgRElPIHdyaXRlIG9yIGJ1ZmZlciB3cml0ZS4KICAqIFdlIGFsbG9jYXRlIGFuIHVpbml0aWFsaXplZCBleHRlbnQgaWYgYmxvY2tzIGhhdmVuJ3QgYmVlbiBhbGxvY2F0ZWQuCiAgKiBUaGUgZXh0ZW50IHdpbGwgYmUgY29udmVydGVkIHRvIGluaXRpYWxpemVkIGFmdGVyIHRoZSBJTyBpcyBjb21wbGV0ZS4KQEAgLTQwMzMsMzgzICszMDYzLDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0vKgotICogUHJvYmFibHkgaXQgc2hvdWxkIGJlIGEgbGlicmFyeSBmdW5jdGlvbi4uLiBzZWFyY2ggZm9yIGZpcnN0IG5vbi16ZXJvIHdvcmQKLSAqIG9yIG1lbWNtcCB3aXRoIHplcm9fcGFnZSwgd2hhdGV2ZXIgaXMgYmV0dGVyIGZvciBwYXJ0aWN1bGFyIGFyY2hpdGVjdHVyZS4KLSAqIExpbnVzPwotICovCi1zdGF0aWMgaW5saW5lIGludCBhbGxfemVyb2VzKF9fbGUzMiAqcCwgX19sZTMyICpxKQotewotCXdoaWxlIChwIDwgcSkKLQkJaWYgKCpwKyspCi0JCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKLX0KLQotLyoqCi0gKglleHQ0X2ZpbmRfc2hhcmVkIC0gZmluZCB0aGUgaW5kaXJlY3QgYmxvY2tzIGZvciBwYXJ0aWFsIHRydW5jYXRpb24uCi0gKglAaW5vZGU6CSAgaW5vZGUgaW4gcXVlc3Rpb24KLSAqCUBkZXB0aDoJICBkZXB0aCBvZiB0aGUgYWZmZWN0ZWQgYnJhbmNoCi0gKglAb2Zmc2V0czogb2Zmc2V0cyBvZiBwb2ludGVycyBpbiB0aGF0IGJyYW5jaCAoc2VlIGV4dDRfYmxvY2tfdG9fcGF0aCkKLSAqCUBjaGFpbjoJICBwbGFjZSB0byBzdG9yZSB0aGUgcG9pbnRlcnMgdG8gcGFydGlhbCBpbmRpcmVjdCBibG9ja3MKLSAqCUB0b3A6CSAgcGxhY2UgdG8gdGhlIChkZXRhY2hlZCkgdG9wIG9mIGJyYW5jaAotICoKLSAqCVRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gdXNlZCBieSBleHQ0X3RydW5jYXRlKCkuCi0gKgotICoJV2hlbiB3ZSBkbyB0cnVuY2F0ZSgpIHdlIG1heSBoYXZlIHRvIGNsZWFuIHRoZSBlbmRzIG9mIHNldmVyYWwKLSAqCWluZGlyZWN0IGJsb2NrcyBidXQgbGVhdmUgdGhlIGJsb2NrcyB0aGVtc2VsdmVzIGFsaXZlLiBCbG9jayBpcwotICoJcGFydGlhbGx5IHRydW5jYXRlZCBpZiBzb21lIGRhdGEgYmVsb3cgdGhlIG5ldyBpX3NpemUgaXMgcmVmZXJyZWQKLSAqCWZyb20gaXQgKGFuZCBpdCBpcyBvbiB0aGUgcGF0aCB0byB0aGUgZmlyc3QgY29tcGxldGVseSB0cnVuY2F0ZWQKLSAqCWRhdGEgYmxvY2ssIGluZGVlZCkuICBXZSBoYXZlIHRvIGZyZWUgdGhlIHRvcCBvZiB0aGF0IHBhdGggYWxvbmcKLSAqCXdpdGggZXZlcnl0aGluZyB0byB0aGUgcmlnaHQgb2YgdGhlIHBhdGguIFNpbmNlIG5vIGFsbG9jYXRpb24KLSAqCXBhc3QgdGhlIHRydW5jYXRpb24gcG9pbnQgaXMgcG9zc2libGUgdW50aWwgZXh0NF90cnVuY2F0ZSgpCi0gKglmaW5pc2hlcywgd2UgbWF5IHNhZmVseSBkbyB0aGUgbGF0dGVyLCBidXQgdG9wIG9mIGJyYW5jaCBtYXkKLSAqCXJlcXVpcmUgc3BlY2lhbCBhdHRlbnRpb24gLSBwYWdlb3V0IGJlbG93IHRoZSB0cnVuY2F0aW9uIHBvaW50Ci0gKgltaWdodCB0cnkgdG8gcG9wdWxhdGUgaXQuCi0gKgotICoJV2UgYXRvbWljYWxseSBkZXRhY2ggdGhlIHRvcCBvZiBicmFuY2ggZnJvbSB0aGUgdHJlZSwgc3RvcmUgdGhlCi0gKglibG9jayBudW1iZXIgb2YgaXRzIHJvb3QgaW4gKkB0b3AsIHBvaW50ZXJzIHRvIGJ1ZmZlcl9oZWFkcyBvZgotICoJcGFydGlhbGx5IHRydW5jYXRlZCBibG9ja3MgLSBpbiBAY2hhaW5bXS5iaCBhbmQgcG9pbnRlcnMgdG8KLSAqCXRoZWlyIGxhc3QgZWxlbWVudHMgdGhhdCBzaG91bGQgbm90IGJlIHJlbW92ZWQgLSBpbgotICoJQGNoYWluW10ucC4gUmV0dXJuIHZhbHVlIGlzIHRoZSBwb2ludGVyIHRvIGxhc3QgZmlsbGVkIGVsZW1lbnQKLSAqCW9mIEBjaGFpbi4KLSAqCi0gKglUaGUgd29yayBsZWZ0IHRvIGNhbGxlciB0byBkbyB0aGUgYWN0dWFsIGZyZWVpbmcgb2Ygc3VidHJlZXM6Ci0gKgkJYSkgZnJlZSB0aGUgc3VidHJlZSBzdGFydGluZyBmcm9tICpAdG9wCi0gKgkJYikgZnJlZSB0aGUgc3VidHJlZXMgd2hvc2Ugcm9vdHMgYXJlIHN0b3JlZCBpbgotICoJCQkoQGNoYWluW2ldLnArMSAuLiBlbmQgb2YgQGNoYWluW2ldLmJoLT5iX2RhdGEpCi0gKgkJYykgZnJlZSB0aGUgc3VidHJlZXMgZ3Jvd2luZyBmcm9tIHRoZSBpbm9kZSBwYXN0IHRoZSBAY2hhaW5bMF0uCi0gKgkJCShubyBwYXJ0aWFsbHkgdHJ1bmNhdGVkIHN0dWZmIHRoZXJlKS4gICovCi0KLXN0YXRpYyBJbmRpcmVjdCAqZXh0NF9maW5kX3NoYXJlZChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZGVwdGgsCi0JCQkJICBleHQ0X2xibGtfdCBvZmZzZXRzWzRdLCBJbmRpcmVjdCBjaGFpbls0XSwKLQkJCQkgIF9fbGUzMiAqdG9wKQotewotCUluZGlyZWN0ICpwYXJ0aWFsLCAqcDsKLQlpbnQgaywgZXJyOwotCi0JKnRvcCA9IDA7Ci0JLyogTWFrZSBrIGluZGV4IHRoZSBkZWVwZXN0IG5vbi1udWxsIG9mZnNldCArIDEgKi8KLQlmb3IgKGsgPSBkZXB0aDsgayA+IDEgJiYgIW9mZnNldHNbay0xXTsgay0tKQotCQk7Ci0JcGFydGlhbCA9IGV4dDRfZ2V0X2JyYW5jaChpbm9kZSwgaywgb2Zmc2V0cywgY2hhaW4sICZlcnIpOwotCS8qIFdyaXRlcjogcG9pbnRlcnMgKi8KLQlpZiAoIXBhcnRpYWwpCi0JCXBhcnRpYWwgPSBjaGFpbiArIGstMTsKLQkvKgotCSAqIElmIHRoZSBicmFuY2ggYWNxdWlyZWQgY29udGludWF0aW9uIHNpbmNlIHdlJ3ZlIGxvb2tlZCBhdCBpdCAtCi0JICogZmluZSwgaXQgc2hvdWxkIGFsbCBzdXJ2aXZlIGFuZCAobmV3KSB0b3AgZG9lc24ndCBiZWxvbmcgdG8gdXMuCi0JICovCi0JaWYgKCFwYXJ0aWFsLT5rZXkgJiYgKnBhcnRpYWwtPnApCi0JCS8qIFdyaXRlcjogZW5kICovCi0JCWdvdG8gbm9fdG9wOwotCWZvciAocCA9IHBhcnRpYWw7IChwID4gY2hhaW4pICYmIGFsbF96ZXJvZXMoKF9fbGUzMiAqKSBwLT5iaC0+Yl9kYXRhLCBwLT5wKTsgcC0tKQotCQk7Ci0JLyoKLQkgKiBPSywgd2UndmUgZm91bmQgdGhlIGxhc3QgYmxvY2sgdGhhdCBtdXN0IHN1cnZpdmUuIFRoZSByZXN0IG9mIG91cgotCSAqIGJyYW5jaCBzaG91bGQgYmUgZGV0YWNoZWQgYmVmb3JlIHVubG9ja2luZy4gSG93ZXZlciwgaWYgdGhhdCByZXN0Ci0JICogb2YgYnJhbmNoIGlzIGFsbCBvdXJzIGFuZCBkb2VzIG5vdCBncm93IGltbWVkaWF0ZWx5IGZyb20gdGhlIGlub2RlCi0JICogaXQncyBlYXNpZXIgdG8gY2hlYXQgYW5kIGp1c3QgZGVjcmVtZW50IHBhcnRpYWwtPnAuCi0JICovCi0JaWYgKHAgPT0gY2hhaW4gKyBrIC0gMSAmJiBwID4gY2hhaW4pIHsKLQkJcC0+cC0tOwotCX0gZWxzZSB7Ci0JCSp0b3AgPSAqcC0+cDsKLQkJLyogTm9wZSwgZG9uJ3QgZG8gdGhpcyBpbiBleHQ0LiAgTXVzdCBsZWF2ZSB0aGUgdHJlZSBpbnRhY3QgKi8KLSNpZiAwCi0JCSpwLT5wID0gMDsKLSNlbmRpZgotCX0KLQkvKiBXcml0ZXI6IGVuZCAqLwotCi0Jd2hpbGUgKHBhcnRpYWwgPiBwKSB7Ci0JCWJyZWxzZShwYXJ0aWFsLT5iaCk7Ci0JCXBhcnRpYWwtLTsKLQl9Ci1ub190b3A6Ci0JcmV0dXJuIHBhcnRpYWw7Ci19Ci0KLS8qCi0gKiBaZXJvIGEgbnVtYmVyIG9mIGJsb2NrIHBvaW50ZXJzIGluIGVpdGhlciBhbiBpbm9kZSBvciBhbiBpbmRpcmVjdCBibG9jay4KLSAqIElmIHdlIHJlc3RhcnQgdGhlIHRyYW5zYWN0aW9uIHdlIG11c3QgYWdhaW4gZ2V0IHdyaXRlIGFjY2VzcyB0byB0aGUKLSAqIGluZGlyZWN0IGJsb2NrIGZvciBmdXJ0aGVyIG1vZGlmaWNhdGlvbi4KLSAqCi0gKiBXZSByZWxlYXNlIGBjb3VudCcgYmxvY2tzIG9uIGRpc2ssIGJ1dCAobGFzdCAtIGZpcnN0KSBtYXkgYmUgZ3JlYXRlcgotICogdGhhbiBgY291bnQnIGJlY2F1c2UgdGhlcmUgY2FuIGJlIGhvbGVzIGluIHRoZXJlLgotICoKLSAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIDEgb24gaW52YWxpZCBibG9jayByYW5nZQotICogYW5kIDwgMCBvbiBmYXRhbCBlcnJvci4KLSAqLwotc3RhdGljIGludCBleHQ0X2NsZWFyX2Jsb2NrcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLAotCQkJICAgICBleHQ0X2ZzYmxrX3QgYmxvY2tfdG9fZnJlZSwKLQkJCSAgICAgdW5zaWduZWQgbG9uZyBjb3VudCwgX19sZTMyICpmaXJzdCwKLQkJCSAgICAgX19sZTMyICpsYXN0KQotewotCV9fbGUzMiAqcDsKLQlpbnQJZmxhZ3MgPSBFWFQ0X0ZSRUVfQkxPQ0tTX0ZPUkdFVCB8IEVYVDRfRlJFRV9CTE9DS1NfVkFMSURBVEVEOwotCWludAllcnI7Ci0KLQlpZiAoU19JU0RJUihpbm9kZS0+aV9tb2RlKSB8fCBTX0lTTE5LKGlub2RlLT5pX21vZGUpKQotCQlmbGFncyB8PSBFWFQ0X0ZSRUVfQkxPQ0tTX01FVEFEQVRBOwotCi0JaWYgKCFleHQ0X2RhdGFfYmxvY2tfdmFsaWQoRVhUNF9TQihpbm9kZS0+aV9zYiksIGJsb2NrX3RvX2ZyZWUsCi0JCQkJICAgY291bnQpKSB7Ci0JCUVYVDRfRVJST1JfSU5PREUoaW5vZGUsICJhdHRlbXB0IHRvIGNsZWFyIGludmFsaWQgIgotCQkJCSAiYmxvY2tzICVsbHUgbGVuICVsdSIsCi0JCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpIGJsb2NrX3RvX2ZyZWUsIGNvdW50KTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JaWYgKHRyeV90b19leHRlbmRfdHJhbnNhY3Rpb24oaGFuZGxlLCBpbm9kZSkpIHsKLQkJaWYgKGJoKSB7Ci0JCQlCVUZGRVJfVFJBQ0UoYmgsICJjYWxsIGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhIik7Ci0JCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCBiaCk7Ci0JCQlpZiAodW5saWtlbHkoZXJyKSkKLQkJCQlnb3RvIG91dF9lcnI7Ci0JCX0KLQkJZXJyID0gZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwotCQlpZiAodW5saWtlbHkoZXJyKSkKLQkJCWdvdG8gb3V0X2VycjsKLQkJZXJyID0gZXh0NF90cnVuY2F0ZV9yZXN0YXJ0X3RyYW5zKGhhbmRsZSwgaW5vZGUsCi0JCQkJCQkgIGJsb2Nrc19mb3JfdHJ1bmNhdGUoaW5vZGUpKTsKLQkJaWYgKHVubGlrZWx5KGVycikpCi0JCQlnb3RvIG91dF9lcnI7Ci0JCWlmIChiaCkgewotCQkJQlVGRkVSX1RSQUNFKGJoLCAicmV0YWtpbmcgd3JpdGUgYWNjZXNzIik7Ci0JCQllcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIGJoKTsKLQkJCWlmICh1bmxpa2VseShlcnIpKQotCQkJCWdvdG8gb3V0X2VycjsKLQkJfQotCX0KLQotCWZvciAocCA9IGZpcnN0OyBwIDwgbGFzdDsgcCsrKQotCQkqcCA9IDA7Ci0KLQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsIGJsb2NrX3RvX2ZyZWUsIGNvdW50LCBmbGFncyk7Ci0JcmV0dXJuIDA7Ci1vdXRfZXJyOgotCWV4dDRfc3RkX2Vycm9yKGlub2RlLT5pX3NiLCBlcnIpOwotCXJldHVybiBlcnI7Ci19Ci0KLS8qKgotICogZXh0NF9mcmVlX2RhdGEgLSBmcmVlIGEgbGlzdCBvZiBkYXRhIGJsb2NrcwotICogQGhhbmRsZToJaGFuZGxlIGZvciB0aGlzIHRyYW5zYWN0aW9uCi0gKiBAaW5vZGU6CWlub2RlIHdlIGFyZSBkZWFsaW5nIHdpdGgKLSAqIEB0aGlzX2JoOglpbmRpcmVjdCBidWZmZXJfaGVhZCB3aGljaCBjb250YWlucyAqQGZpcnN0IGFuZCAqQGxhc3QKLSAqIEBmaXJzdDoJYXJyYXkgb2YgYmxvY2sgbnVtYmVycwotICogQGxhc3Q6CXBvaW50cyBpbW1lZGlhdGVseSBwYXN0IHRoZSBlbmQgb2YgYXJyYXkKLSAqCi0gKiBXZSBhcmUgZnJlZWluZyBhbGwgYmxvY2tzIHJlZmVycmVkIGZyb20gdGhhdCBhcnJheSAobnVtYmVycyBhcmUgc3RvcmVkIGFzCi0gKiBsaXR0bGUtZW5kaWFuIDMyLWJpdCkgYW5kIHVwZGF0aW5nIEBpbm9kZS0+aV9ibG9ja3MgYXBwcm9wcmlhdGVseS4KLSAqCi0gKiBXZSBhY2N1bXVsYXRlIGNvbnRpZ3VvdXMgcnVucyBvZiBibG9ja3MgdG8gZnJlZS4gIENvbnZlbmllbnRseSwgaWYgdGhlc2UKLSAqIGJsb2NrcyBhcmUgY29udGlndW91cyB0aGVuIHJlbGVhc2luZyB0aGVtIGF0IG9uZSB0aW1lIHdpbGwgb25seSBhZmZlY3Qgb25lCi0gKiBvciB0d28gYml0bWFwIGJsb2NrcyAoKyBncm91cCBkZXNjcmlwdG9yKHMpIGFuZCBzdXBlcmJsb2NrKSBhbmQgd2Ugd29uJ3QKLSAqIGFjdHVhbGx5IHVzZSBhIGxvdCBvZiBqb3VybmFsIHNwYWNlLgotICoKLSAqIEB0aGlzX2JoIHdpbGwgYmUgJU5VTEwgaWYgQGZpcnN0IGFuZCBAbGFzdCBwb2ludCBpbnRvIHRoZSBpbm9kZSdzIGRpcmVjdAotICogYmxvY2sgcG9pbnRlcnMuCi0gKi8KLXN0YXRpYyB2b2lkIGV4dDRfZnJlZV9kYXRhKGhhbmRsZV90ICpoYW5kbGUsIHN0cnVjdCBpbm9kZSAqaW5vZGUsCi0JCQkgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRoaXNfYmgsCi0JCQkgICBfX2xlMzIgKmZpcnN0LCBfX2xlMzIgKmxhc3QpCi17Ci0JZXh0NF9mc2Jsa190IGJsb2NrX3RvX2ZyZWUgPSAwOyAgICAvKiBTdGFydGluZyBibG9jayAjIG9mIGEgcnVuICovCi0JdW5zaWduZWQgbG9uZyBjb3VudCA9IDA7CSAgICAvKiBOdW1iZXIgb2YgYmxvY2tzIGluIHRoZSBydW4gKi8KLQlfX2xlMzIgKmJsb2NrX3RvX2ZyZWVfcCA9IE5VTEw7CSAgICAvKiBQb2ludGVyIGludG8gaW5vZGUvaW5kCi0JCQkJCSAgICAgICBjb3JyZXNwb25kaW5nIHRvCi0JCQkJCSAgICAgICBibG9ja190b19mcmVlICovCi0JZXh0NF9mc2Jsa190IG5yOwkJICAgIC8qIEN1cnJlbnQgYmxvY2sgIyAqLwotCV9fbGUzMiAqcDsJCQkgICAgLyogUG9pbnRlciBpbnRvIGlub2RlL2luZAotCQkJCQkgICAgICAgZm9yIGN1cnJlbnQgYmxvY2sgKi8KLQlpbnQgZXJyID0gMDsKLQotCWlmICh0aGlzX2JoKSB7CQkJCS8qIEZvciBpbmRpcmVjdCBibG9jayAqLwotCQlCVUZGRVJfVFJBQ0UodGhpc19iaCwgImdldF93cml0ZV9hY2Nlc3MiKTsKLQkJZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCB0aGlzX2JoKTsKLQkJLyogSW1wb3J0YW50OiBpZiB3ZSBjYW4ndCB1cGRhdGUgdGhlIGluZGlyZWN0IHBvaW50ZXJzCi0JCSAqIHRvIHRoZSBibG9ja3MsIHdlIGNhbid0IGZyZWUgdGhlbS4gKi8KLQkJaWYgKGVycikKLQkJCXJldHVybjsKLQl9Ci0KLQlmb3IgKHAgPSBmaXJzdDsgcCA8IGxhc3Q7IHArKykgewotCQluciA9IGxlMzJfdG9fY3B1KCpwKTsKLQkJaWYgKG5yKSB7Ci0JCQkvKiBhY2N1bXVsYXRlIGJsb2NrcyB0byBmcmVlIGlmIHRoZXkncmUgY29udGlndW91cyAqLwotCQkJaWYgKGNvdW50ID09IDApIHsKLQkJCQlibG9ja190b19mcmVlID0gbnI7Ci0JCQkJYmxvY2tfdG9fZnJlZV9wID0gcDsKLQkJCQljb3VudCA9IDE7Ci0JCQl9IGVsc2UgaWYgKG5yID09IGJsb2NrX3RvX2ZyZWUgKyBjb3VudCkgewotCQkJCWNvdW50Kys7Ci0JCQl9IGVsc2UgewotCQkJCWVyciA9IGV4dDRfY2xlYXJfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIHRoaXNfYmgsCi0JCQkJCQkgICAgICAgIGJsb2NrX3RvX2ZyZWUsIGNvdW50LAotCQkJCQkJICAgICAgICBibG9ja190b19mcmVlX3AsIHApOwotCQkJCWlmIChlcnIpCi0JCQkJCWJyZWFrOwotCQkJCWJsb2NrX3RvX2ZyZWUgPSBucjsKLQkJCQlibG9ja190b19mcmVlX3AgPSBwOwotCQkJCWNvdW50ID0gMTsKLQkJCX0KLQkJfQotCX0KLQotCWlmICghZXJyICYmIGNvdW50ID4gMCkKLQkJZXJyID0gZXh0NF9jbGVhcl9ibG9ja3MoaGFuZGxlLCBpbm9kZSwgdGhpc19iaCwgYmxvY2tfdG9fZnJlZSwKLQkJCQkJY291bnQsIGJsb2NrX3RvX2ZyZWVfcCwgcCk7Ci0JaWYgKGVyciA8IDApCi0JCS8qIGZhdGFsIGVycm9yICovCi0JCXJldHVybjsKLQotCWlmICh0aGlzX2JoKSB7Ci0JCUJVRkZFUl9UUkFDRSh0aGlzX2JoLCAiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOwotCi0JCS8qCi0JCSAqIFRoZSBidWZmZXIgaGVhZCBzaG91bGQgaGF2ZSBhbiBhdHRhY2hlZCBqb3VybmFsIGhlYWQgYXQgdGhpcwotCQkgKiBwb2ludC4gSG93ZXZlciwgaWYgdGhlIGRhdGEgaXMgY29ycnVwdGVkIGFuZCBhbiBpbmRpcmVjdAotCQkgKiBibG9jayBwb2ludGVkIHRvIGl0c2VsZiwgaXQgd291bGQgaGF2ZSBiZWVuIGRldGFjaGVkIHdoZW4KLQkJICogdGhlIGJsb2NrIHdhcyBjbGVhcmVkLiBDaGVjayBmb3IgdGhpcyBpbnN0ZWFkIG9mIE9PUFNpbmcuCi0JCSAqLwotCQlpZiAoKEVYVDRfSk9VUk5BTChpbm9kZSkgPT0gTlVMTCkgfHwgYmgyamgodGhpc19iaCkpCi0JCQlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIGlub2RlLCB0aGlzX2JoKTsKLQkJZWxzZQotCQkJRVhUNF9FUlJPUl9JTk9ERShpbm9kZSwKLQkJCQkJICJjaXJjdWxhciBpbmRpcmVjdCBibG9jayBkZXRlY3RlZCBhdCAiCi0JCQkJCSAiYmxvY2sgJWxsdSIsCi0JCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgdGhpc19iaC0+Yl9ibG9ja25yKTsKLQl9Ci19Ci0KLS8qKgotICoJZXh0NF9mcmVlX2JyYW5jaGVzIC0gZnJlZSBhbiBhcnJheSBvZiBicmFuY2hlcwotICoJQGhhbmRsZTogSkJEIGhhbmRsZSBmb3IgdGhpcyB0cmFuc2FjdGlvbgotICoJQGlub2RlOglpbm9kZSB3ZSBhcmUgZGVhbGluZyB3aXRoCi0gKglAcGFyZW50X2JoOiB0aGUgYnVmZmVyX2hlYWQgd2hpY2ggY29udGFpbnMgKkBmaXJzdCBhbmQgKkBsYXN0Ci0gKglAZmlyc3Q6CWFycmF5IG9mIGJsb2NrIG51bWJlcnMKLSAqCUBsYXN0Oglwb2ludGVyIGltbWVkaWF0ZWx5IHBhc3QgdGhlIGVuZCBvZiBhcnJheQotICoJQGRlcHRoOglkZXB0aCBvZiB0aGUgYnJhbmNoZXMgdG8gZnJlZQotICoKLSAqCVdlIGFyZSBmcmVlaW5nIGFsbCBibG9ja3MgcmVmZXJyZWQgZnJvbSB0aGVzZSBicmFuY2hlcyAobnVtYmVycyBhcmUKLSAqCXN0b3JlZCBhcyBsaXR0bGUtZW5kaWFuIDMyLWJpdCkgYW5kIHVwZGF0aW5nIEBpbm9kZS0+aV9ibG9ja3MKLSAqCWFwcHJvcHJpYXRlbHkuCi0gKi8KLXN0YXRpYyB2b2lkIGV4dDRfZnJlZV9icmFuY2hlcyhoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkJICAgICAgIHN0cnVjdCBidWZmZXJfaGVhZCAqcGFyZW50X2JoLAotCQkJICAgICAgIF9fbGUzMiAqZmlyc3QsIF9fbGUzMiAqbGFzdCwgaW50IGRlcHRoKQotewotCWV4dDRfZnNibGtfdCBucjsKLQlfX2xlMzIgKnA7Ci0KLQlpZiAoZXh0NF9oYW5kbGVfaXNfYWJvcnRlZChoYW5kbGUpKQotCQlyZXR1cm47Ci0KLQlpZiAoZGVwdGgtLSkgewotCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwotCQlpbnQgYWRkcl9wZXJfYmxvY2sgPSBFWFQ0X0FERFJfUEVSX0JMT0NLKGlub2RlLT5pX3NiKTsKLQkJcCA9IGxhc3Q7Ci0JCXdoaWxlICgtLXAgPj0gZmlyc3QpIHsKLQkJCW5yID0gbGUzMl90b19jcHUoKnApOwotCQkJaWYgKCFucikKLQkJCQljb250aW51ZTsJCS8qIEEgaG9sZSAqLwotCi0JCQlpZiAoIWV4dDRfZGF0YV9ibG9ja192YWxpZChFWFQ0X1NCKGlub2RlLT5pX3NiKSwKLQkJCQkJCSAgIG5yLCAxKSkgewotCQkJCUVYVDRfRVJST1JfSU5PREUoaW5vZGUsCi0JCQkJCQkgImludmFsaWQgaW5kaXJlY3QgbWFwcGVkICIKLQkJCQkJCSAiYmxvY2sgJWx1IChsZXZlbCAlZCkiLAotCQkJCQkJICh1bnNpZ25lZCBsb25nKSBuciwgZGVwdGgpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQkvKiBHbyByZWFkIHRoZSBidWZmZXIgZm9yIHRoZSBuZXh0IGxldmVsIGRvd24gKi8KLQkJCWJoID0gc2JfYnJlYWQoaW5vZGUtPmlfc2IsIG5yKTsKLQotCQkJLyoKLQkJCSAqIEEgcmVhZCBmYWlsdXJlPyBSZXBvcnQgZXJyb3IgYW5kIGNsZWFyIHNsb3QKLQkJCSAqIChzaG91bGQgYmUgcmFyZSkuCi0JCQkgKi8KLQkJCWlmICghYmgpIHsKLQkJCQlFWFQ0X0VSUk9SX0lOT0RFX0JMT0NLKGlub2RlLCBuciwKLQkJCQkJCSAgICAgICAiUmVhZCBmYWlsdXJlIik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCS8qIFRoaXMgemFwcyB0aGUgZW50aXJlIGJsb2NrLiAgQm90dG9tIHVwLiAqLwotCQkJQlVGRkVSX1RSQUNFKGJoLCAiZnJlZSBjaGlsZCBicmFuY2hlcyIpOwotCQkJZXh0NF9mcmVlX2JyYW5jaGVzKGhhbmRsZSwgaW5vZGUsIGJoLAotCQkJCQkoX19sZTMyICopIGJoLT5iX2RhdGEsCi0JCQkJCShfX2xlMzIgKikgYmgtPmJfZGF0YSArIGFkZHJfcGVyX2Jsb2NrLAotCQkJCQlkZXB0aCk7Ci0JCQlicmVsc2UoYmgpOwotCi0JCQkvKgotCQkJICogRXZlcnl0aGluZyBiZWxvdyB0aGlzIHRoaXMgcG9pbnRlciBoYXMgYmVlbgotCQkJICogcmVsZWFzZWQuICBOb3cgbGV0IHRoaXMgdG9wLW9mLXN1YnRyZWUgZ28uCi0JCQkgKgotCQkJICogV2Ugd2FudCB0aGUgZnJlZWluZyBvZiB0aGlzIGluZGlyZWN0IGJsb2NrIHRvIGJlCi0JCQkgKiBhdG9taWMgaW4gdGhlIGpvdXJuYWwgd2l0aCB0aGUgdXBkYXRpbmcgb2YgdGhlCi0JCQkgKiBiaXRtYXAgYmxvY2sgd2hpY2ggb3ducyBpdC4gIFNvIG1ha2Ugc29tZSByb29tIGluCi0JCQkgKiB0aGUgam91cm5hbC4KLQkJCSAqCi0JCQkgKiBXZSB6ZXJvIHRoZSBwYXJlbnQgcG9pbnRlciAqYWZ0ZXIqIGZyZWVpbmcgaXRzCi0JCQkgKiBwb2ludGVlIGluIHRoZSBiaXRtYXBzLCBzbyBpZiBleHRlbmRfdHJhbnNhY3Rpb24oKQotCQkJICogZm9yIHNvbWUgcmVhc29uIGZhaWxzIHRvIHB1dCB0aGUgYml0bWFwIGNoYW5nZXMgYW5kCi0JCQkgKiB0aGUgcmVsZWFzZSBpbnRvIHRoZSBzYW1lIHRyYW5zYWN0aW9uLCByZWNvdmVyeQotCQkJICogd2lsbCBtZXJlbHkgY29tcGxhaW4gYWJvdXQgcmVsZWFzaW5nIGEgZnJlZSBibG9jaywKLQkJCSAqIHJhdGhlciB0aGFuIGxlYWtpbmcgYmxvY2tzLgotCQkJICovCi0JCQlpZiAoZXh0NF9oYW5kbGVfaXNfYWJvcnRlZChoYW5kbGUpKQotCQkJCXJldHVybjsKLQkJCWlmICh0cnlfdG9fZXh0ZW5kX3RyYW5zYWN0aW9uKGhhbmRsZSwgaW5vZGUpKSB7Ci0JCQkJZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwotCQkJCWV4dDRfdHJ1bmNhdGVfcmVzdGFydF90cmFucyhoYW5kbGUsIGlub2RlLAotCQkJCQkgICAgYmxvY2tzX2Zvcl90cnVuY2F0ZShpbm9kZSkpOwotCQkJfQotCi0JCQkvKgotCQkJICogVGhlIGZvcmdldCBmbGFnIGhlcmUgaXMgY3JpdGljYWwgYmVjYXVzZSBpZgotCQkJICogd2UgYXJlIGpvdXJuYWxpbmcgKGFuZCBub3QgZG9pbmcgZGF0YQotCQkJICogam91cm5hbGluZyksIHdlIGhhdmUgdG8gbWFrZSBzdXJlIGEgcmV2b2tlCi0JCQkgKiByZWNvcmQgaXMgd3JpdHRlbiB0byBwcmV2ZW50IHRoZSBqb3VybmFsCi0JCQkgKiByZXBsYXkgZnJvbSBvdmVyd3JpdGluZyB0aGUgKGZvcm1lcikKLQkJCSAqIGluZGlyZWN0IGJsb2NrIGlmIGl0IGdldHMgcmVhbGxvY2F0ZWQgYXMgYQotCQkJICogZGF0YSBibG9jay4gIFRoaXMgbXVzdCBoYXBwZW4gaW4gdGhlIHNhbWUKLQkJCSAqIHRyYW5zYWN0aW9uIHdoZXJlIHRoZSBkYXRhIGJsb2NrcyBhcmUKLQkJCSAqIGFjdHVhbGx5IGZyZWVkLgotCQkJICovCi0JCQlleHQ0X2ZyZWVfYmxvY2tzKGhhbmRsZSwgaW5vZGUsIE5VTEwsIG5yLCAxLAotCQkJCQkgRVhUNF9GUkVFX0JMT0NLU19NRVRBREFUQXwKLQkJCQkJIEVYVDRfRlJFRV9CTE9DS1NfRk9SR0VUKTsKLQotCQkJaWYgKHBhcmVudF9iaCkgewotCQkJCS8qCi0JCQkJICogVGhlIGJsb2NrIHdoaWNoIHdlIGhhdmUganVzdCBmcmVlZCBpcwotCQkJCSAqIHBvaW50ZWQgdG8gYnkgYW4gaW5kaXJlY3QgYmxvY2s6IGpvdXJuYWwgaXQKLQkJCQkgKi8KLQkJCQlCVUZGRVJfVFJBQ0UocGFyZW50X2JoLCAiZ2V0X3dyaXRlX2FjY2VzcyIpOwotCQkJCWlmICghZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLAotCQkJCQkJCQkgICBwYXJlbnRfYmgpKXsKLQkJCQkJKnAgPSAwOwotCQkJCQlCVUZGRVJfVFJBQ0UocGFyZW50X2JoLAotCQkJCQkiY2FsbCBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YSIpOwotCQkJCQlleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsCi0JCQkJCQkJCSAgIGlub2RlLAotCQkJCQkJCQkgICBwYXJlbnRfYmgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCS8qIFdlIGhhdmUgcmVhY2hlZCB0aGUgYm90dG9tIG9mIHRoZSB0cmVlLiAqLwotCQlCVUZGRVJfVFJBQ0UocGFyZW50X2JoLCAiZnJlZSBkYXRhIGJsb2NrcyIpOwotCQlleHQ0X2ZyZWVfZGF0YShoYW5kbGUsIGlub2RlLCBwYXJlbnRfYmgsIGZpcnN0LCBsYXN0KTsKLQl9Ci19Ci0KIGludCBleHQ0X2Nhbl90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewogCWlmIChTX0lTUkVHKGlub2RlLT5pX21vZGUpKQpAQCAtNDQ3NiwxOSArMzEyOSw2IEBACiAgKi8KIHZvaWQgZXh0NF90cnVuY2F0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCWhhbmRsZV90ICpoYW5kbGU7Ci0Jc3RydWN0IGV4dDRfaW5vZGVfaW5mbyAqZWkgPSBFWFQ0X0koaW5vZGUpOwotCV9fbGUzMiAqaV9kYXRhID0gZWktPmlfZGF0YTsKLQlpbnQgYWRkcl9wZXJfYmxvY2sgPSBFWFQ0X0FERFJfUEVSX0JMT0NLKGlub2RlLT5pX3NiKTsKLQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7Ci0JZXh0NF9sYmxrX3Qgb2Zmc2V0c1s0XTsKLQlJbmRpcmVjdCBjaGFpbls0XTsKLQlJbmRpcmVjdCAqcGFydGlhbDsKLQlfX2xlMzIgbnIgPSAwOwotCWludCBuID0gMDsKLQlleHQ0X2xibGtfdCBsYXN0X2Jsb2NrLCBtYXhfYmxvY2s7Ci0JdW5zaWduZWQgYmxvY2tzaXplID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOwotCiAJdHJhY2VfZXh0NF90cnVuY2F0ZV9lbnRlcihpbm9kZSk7CiAKIAlpZiAoIWV4dDRfY2FuX3RydW5jYXRlKGlub2RlKSkKQEAgLTQ0OTksMTQ5ICszMTM5LDExIEBACiAJaWYgKGlub2RlLT5pX3NpemUgPT0gMCAmJiAhdGVzdF9vcHQoaW5vZGUtPmlfc2IsIE5PX0FVVE9fREFfQUxMT0MpKQogCQlleHQ0X3NldF9pbm9kZV9zdGF0ZShpbm9kZSwgRVhUNF9TVEFURV9EQV9BTExPQ19DTE9TRSk7CiAKLQlpZiAoZXh0NF90ZXN0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfRVhURU5UUykpIHsKKwlpZiAoZXh0NF90ZXN0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfRVhURU5UUykpCiAJCWV4dDRfZXh0X3RydW5jYXRlKGlub2RlKTsKLQkJdHJhY2VfZXh0NF90cnVuY2F0ZV9leGl0KGlub2RlKTsKLQkJcmV0dXJuOwotCX0KKwllbHNlCisJCWV4dDRfaW5kX3RydW5jYXRlKGlub2RlKTsKIAotCWhhbmRsZSA9IHN0YXJ0X3RyYW5zYWN0aW9uKGlub2RlKTsKLQlpZiAoSVNfRVJSKGhhbmRsZSkpCi0JCXJldHVybjsJCS8qIEFLUE06IHJldHVybiB3aGF0PyAqLwotCi0JbGFzdF9ibG9jayA9IChpbm9kZS0+aV9zaXplICsgYmxvY2tzaXplLTEpCi0JCQkJCT4+IEVYVDRfQkxPQ0tfU0laRV9CSVRTKGlub2RlLT5pX3NiKTsKLQltYXhfYmxvY2sgPSAoRVhUNF9TQihpbm9kZS0+aV9zYiktPnNfYml0bWFwX21heGJ5dGVzICsgYmxvY2tzaXplLTEpCi0JCQkJCT4+IEVYVDRfQkxPQ0tfU0laRV9CSVRTKGlub2RlLT5pX3NiKTsKLQotCWlmIChpbm9kZS0+aV9zaXplICYgKGJsb2Nrc2l6ZSAtIDEpKQotCQlpZiAoZXh0NF9ibG9ja190cnVuY2F0ZV9wYWdlKGhhbmRsZSwgbWFwcGluZywgaW5vZGUtPmlfc2l6ZSkpCi0JCQlnb3RvIG91dF9zdG9wOwotCi0JaWYgKGxhc3RfYmxvY2sgIT0gbWF4X2Jsb2NrKSB7Ci0JCW4gPSBleHQ0X2Jsb2NrX3RvX3BhdGgoaW5vZGUsIGxhc3RfYmxvY2ssIG9mZnNldHMsIE5VTEwpOwotCQlpZiAobiA9PSAwKQotCQkJZ290byBvdXRfc3RvcDsJLyogZXJyb3IgKi8KLQl9Ci0KLQkvKgotCSAqIE9LLiAgVGhpcyB0cnVuY2F0ZSBpcyBnb2luZyB0byBoYXBwZW4uICBXZSBhZGQgdGhlIGlub2RlIHRvIHRoZQotCSAqIG9ycGhhbiBsaXN0LCBzbyB0aGF0IGlmIHRoaXMgdHJ1bmNhdGUgc3BhbnMgbXVsdGlwbGUgdHJhbnNhY3Rpb25zLAotCSAqIGFuZCB3ZSBjcmFzaCwgd2Ugd2lsbCByZXN1bWUgdGhlIHRydW5jYXRlIHdoZW4gdGhlIGZpbGVzeXN0ZW0KLQkgKiByZWNvdmVycy4gIEl0IGFsc28gbWFya3MgdGhlIGlub2RlIGRpcnR5LCB0byBjYXRjaCB0aGUgbmV3IHNpemUuCi0JICoKLQkgKiBJbXBsaWNhdGlvbjogdGhlIGZpbGUgbXVzdCBhbHdheXMgYmUgaW4gYSBzYW5lLCBjb25zaXN0ZW50Ci0JICogdHJ1bmNhdGFibGUgc3RhdGUgd2hpbGUgZWFjaCB0cmFuc2FjdGlvbiBjb21taXRzLgotCSAqLwotCWlmIChleHQ0X29ycGhhbl9hZGQoaGFuZGxlLCBpbm9kZSkpCi0JCWdvdG8gb3V0X3N0b3A7Ci0KLQkvKgotCSAqIEZyb20gaGVyZSB3ZSBibG9jayBvdXQgYWxsIGV4dDRfZ2V0X2Jsb2NrKCkgY2FsbGVycyB3aG8gd2FudCB0bwotCSAqIG1vZGlmeSB0aGUgYmxvY2sgYWxsb2NhdGlvbiB0cmVlLgotCSAqLwotCWRvd25fd3JpdGUoJmVpLT5pX2RhdGFfc2VtKTsKLQotCWV4dDRfZGlzY2FyZF9wcmVhbGxvY2F0aW9ucyhpbm9kZSk7Ci0KLQkvKgotCSAqIFRoZSBvcnBoYW4gbGlzdCBlbnRyeSB3aWxsIG5vdyBwcm90ZWN0IHVzIGZyb20gYW55IGNyYXNoIHdoaWNoCi0JICogb2NjdXJzIGJlZm9yZSB0aGUgdHJ1bmNhdGUgY29tcGxldGVzLCBzbyBpdCBpcyBub3cgc2FmZSB0byBwcm9wYWdhdGUKLQkgKiB0aGUgbmV3LCBzaG9ydGVyIGlub2RlIHNpemUgKGhlbGQgZm9yIG5vdyBpbiBpX3NpemUpIGludG8gdGhlCi0JICogb24tZGlzayBpbm9kZS4gV2UgZG8gdGhpcyB2aWEgaV9kaXNrc2l6ZSwgd2hpY2ggaXMgdGhlIHZhbHVlIHdoaWNoCi0JICogZXh0NCAqcmVhbGx5KiB3cml0ZXMgb250byB0aGUgZGlzayBpbm9kZS4KLQkgKi8KLQllaS0+aV9kaXNrc2l6ZSA9IGlub2RlLT5pX3NpemU7Ci0KLQlpZiAobGFzdF9ibG9jayA9PSBtYXhfYmxvY2spIHsKLQkJLyoKLQkJICogSXQgaXMgdW5uZWNlc3NhcnkgdG8gZnJlZSBhbnkgZGF0YSBibG9ja3MgaWYgbGFzdF9ibG9jayBpcwotCQkgKiBlcXVhbCB0byB0aGUgaW5kaXJlY3QgYmxvY2sgbGltaXQuCi0JCSAqLwotCQlnb3RvIG91dF91bmxvY2s7Ci0JfSBlbHNlIGlmIChuID09IDEpIHsJCS8qIGRpcmVjdCBibG9ja3MgKi8KLQkJZXh0NF9mcmVlX2RhdGEoaGFuZGxlLCBpbm9kZSwgTlVMTCwgaV9kYXRhK29mZnNldHNbMF0sCi0JCQkgICAgICAgaV9kYXRhICsgRVhUNF9ORElSX0JMT0NLUyk7Ci0JCWdvdG8gZG9faW5kaXJlY3RzOwotCX0KLQotCXBhcnRpYWwgPSBleHQ0X2ZpbmRfc2hhcmVkKGlub2RlLCBuLCBvZmZzZXRzLCBjaGFpbiwgJm5yKTsKLQkvKiBLaWxsIHRoZSB0b3Agb2Ygc2hhcmVkIGJyYW5jaCAobm90IGRldGFjaGVkKSAqLwotCWlmIChucikgewotCQlpZiAocGFydGlhbCA9PSBjaGFpbikgewotCQkJLyogU2hhcmVkIGJyYW5jaCBncm93cyBmcm9tIHRoZSBpbm9kZSAqLwotCQkJZXh0NF9mcmVlX2JyYW5jaGVzKGhhbmRsZSwgaW5vZGUsIE5VTEwsCi0JCQkJCSAgICZuciwgJm5yKzEsIChjaGFpbituLTEpIC0gcGFydGlhbCk7Ci0JCQkqcGFydGlhbC0+cCA9IDA7Ci0JCQkvKgotCQkJICogV2UgbWFyayB0aGUgaW5vZGUgZGlydHkgcHJpb3IgdG8gcmVzdGFydCwKLQkJCSAqIGFuZCBwcmlvciB0byBzdG9wLiAgTm8gbmVlZCBmb3IgaXQgaGVyZS4KLQkJCSAqLwotCQl9IGVsc2UgewotCQkJLyogU2hhcmVkIGJyYW5jaCBncm93cyBmcm9tIGFuIGluZGlyZWN0IGJsb2NrICovCi0JCQlCVUZGRVJfVFJBQ0UocGFydGlhbC0+YmgsICJnZXRfd3JpdGVfYWNjZXNzIik7Ci0JCQlleHQ0X2ZyZWVfYnJhbmNoZXMoaGFuZGxlLCBpbm9kZSwgcGFydGlhbC0+YmgsCi0JCQkJCXBhcnRpYWwtPnAsCi0JCQkJCXBhcnRpYWwtPnArMSwgKGNoYWluK24tMSkgLSBwYXJ0aWFsKTsKLQkJfQotCX0KLQkvKiBDbGVhciB0aGUgZW5kcyBvZiBpbmRpcmVjdCBibG9ja3Mgb24gdGhlIHNoYXJlZCBicmFuY2ggKi8KLQl3aGlsZSAocGFydGlhbCA+IGNoYWluKSB7Ci0JCWV4dDRfZnJlZV9icmFuY2hlcyhoYW5kbGUsIGlub2RlLCBwYXJ0aWFsLT5iaCwgcGFydGlhbC0+cCArIDEsCi0JCQkJICAgKF9fbGUzMiopcGFydGlhbC0+YmgtPmJfZGF0YSthZGRyX3Blcl9ibG9jaywKLQkJCQkgICAoY2hhaW4rbi0xKSAtIHBhcnRpYWwpOwotCQlCVUZGRVJfVFJBQ0UocGFydGlhbC0+YmgsICJjYWxsIGJyZWxzZSIpOwotCQlicmVsc2UocGFydGlhbC0+YmgpOwotCQlwYXJ0aWFsLS07Ci0JfQotZG9faW5kaXJlY3RzOgotCS8qIEtpbGwgdGhlIHJlbWFpbmluZyAod2hvbGUpIHN1YnRyZWVzICovCi0Jc3dpdGNoIChvZmZzZXRzWzBdKSB7Ci0JZGVmYXVsdDoKLQkJbnIgPSBpX2RhdGFbRVhUNF9JTkRfQkxPQ0tdOwotCQlpZiAobnIpIHsKLQkJCWV4dDRfZnJlZV9icmFuY2hlcyhoYW5kbGUsIGlub2RlLCBOVUxMLCAmbnIsICZucisxLCAxKTsKLQkJCWlfZGF0YVtFWFQ0X0lORF9CTE9DS10gPSAwOwotCQl9Ci0JY2FzZSBFWFQ0X0lORF9CTE9DSzoKLQkJbnIgPSBpX2RhdGFbRVhUNF9ESU5EX0JMT0NLXTsKLQkJaWYgKG5yKSB7Ci0JCQlleHQ0X2ZyZWVfYnJhbmNoZXMoaGFuZGxlLCBpbm9kZSwgTlVMTCwgJm5yLCAmbnIrMSwgMik7Ci0JCQlpX2RhdGFbRVhUNF9ESU5EX0JMT0NLXSA9IDA7Ci0JCX0KLQljYXNlIEVYVDRfRElORF9CTE9DSzoKLQkJbnIgPSBpX2RhdGFbRVhUNF9USU5EX0JMT0NLXTsKLQkJaWYgKG5yKSB7Ci0JCQlleHQ0X2ZyZWVfYnJhbmNoZXMoaGFuZGxlLCBpbm9kZSwgTlVMTCwgJm5yLCAmbnIrMSwgMyk7Ci0JCQlpX2RhdGFbRVhUNF9USU5EX0JMT0NLXSA9IDA7Ci0JCX0KLQljYXNlIEVYVDRfVElORF9CTE9DSzoKLQkJOwotCX0KLQotb3V0X3VubG9jazoKLQl1cF93cml0ZSgmZWktPmlfZGF0YV9zZW0pOwotCWlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBleHQ0X2N1cnJlbnRfdGltZShpbm9kZSk7Ci0JZXh0NF9tYXJrX2lub2RlX2RpcnR5KGhhbmRsZSwgaW5vZGUpOwotCi0JLyoKLQkgKiBJbiBhIG11bHRpLXRyYW5zYWN0aW9uIHRydW5jYXRlLCB3ZSBvbmx5IG1ha2UgdGhlIGZpbmFsIHRyYW5zYWN0aW9uCi0JICogc3luY2hyb25vdXMKLQkgKi8KLQlpZiAoSVNfU1lOQyhpbm9kZSkpCi0JCWV4dDRfaGFuZGxlX3N5bmMoaGFuZGxlKTsKLW91dF9zdG9wOgotCS8qCi0JICogSWYgdGhpcyB3YXMgYSBzaW1wbGUgZnRydW5jYXRlKCksIGFuZCB0aGUgZmlsZSB3aWxsIHJlbWFpbiBhbGl2ZQotCSAqIHRoZW4gd2UgbmVlZCB0byBjbGVhciB1cCB0aGUgb3JwaGFuIHJlY29yZCB3aGljaCB3ZSBjcmVhdGVkIGFib3ZlLgotCSAqIEhvd2V2ZXIsIGlmIHRoaXMgd2FzIGEgcmVhbCB1bmxpbmsgdGhlbiB3ZSB3ZXJlIGNhbGxlZCBieQotCSAqIGV4dDRfZGVsZXRlX2lub2RlKCksIGFuZCB3ZSBhbGxvdyB0aGF0IGZ1bmN0aW9uIHRvIGNsZWFuIHVwIHRoZQotCSAqIG9ycGhhbiBpbmZvIGZvciB1cy4KLQkgKi8KLQlpZiAoaW5vZGUtPmlfbmxpbmspCi0JCWV4dDRfb3JwaGFuX2RlbChoYW5kbGUsIGlub2RlKTsKLQotCWV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CiAJdHJhY2VfZXh0NF90cnVuY2F0ZV9leGl0KGlub2RlKTsKIH0KIApAQCAtNTAxMiw3ICszNTE0LDcgQEAKIAkJICAgKFNfSVNMTksoaW5vZGUtPmlfbW9kZSkgJiYKIAkJICAgICFleHQ0X2lub2RlX2lzX2Zhc3Rfc3ltbGluayhpbm9kZSkpKSB7CiAJCS8qIFZhbGlkYXRlIGJsb2NrIHJlZmVyZW5jZXMgd2hpY2ggYXJlIHBhcnQgb2YgaW5vZGUgKi8KLQkJcmV0ID0gZXh0NF9jaGVja19pbm9kZV9ibG9ja3JlZihpbm9kZSk7CisJCXJldCA9IGV4dDRfaW5kX2NoZWNrX2lub2RlKGlub2RlKTsKIAl9CiAJaWYgKHJldCkKIAkJZ290byBiYWRfaW5vZGU7CkBAIC01NDU5LDM0ICszOTYxLDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZXh0NF9pbmRpcmVjdF90cmFuc19ibG9ja3Moc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5yYmxvY2tzLAotCQkJCSAgICAgIGludCBjaHVuaykKLXsKLQlpbnQgaW5kaXJlY3RzOwotCi0JLyogaWYgbnJibG9ja3MgYXJlIGNvbnRpZ3VvdXMgKi8KLQlpZiAoY2h1bmspIHsKLQkJLyoKLQkJICogV2l0aCBOIGNvbnRpZ3VvdXMgZGF0YSBibG9ja3MsIHdlIG5lZWQgYXQgbW9zdAotCQkgKiBOL0VYVDRfQUREUl9QRVJfQkxPQ0soaW5vZGUtPmlfc2IpICsgMSBpbmRpcmVjdCBibG9ja3MsCi0JCSAqIDIgZGluZGlyZWN0IGJsb2NrcywgYW5kIDEgdGluZGlyZWN0IGJsb2NrCi0JCSAqLwotCQlyZXR1cm4gRElWX1JPVU5EX1VQKG5yYmxvY2tzLAotCQkJCSAgICBFWFQ0X0FERFJfUEVSX0JMT0NLKGlub2RlLT5pX3NiKSkgKyA0OwotCX0KLQkvKgotCSAqIGlmIG5yYmxvY2tzIGFyZSBub3QgY29udGlndW91cywgd29yc2UgY2FzZSwgZWFjaCBibG9jayB0b3VjaAotCSAqIGEgaW5kaXJlY3QgYmxvY2ssIGFuZCBlYWNoIGluZGlyZWN0IGJsb2NrIHRvdWNoIGEgZG91YmxlIGluZGlyZWN0Ci0JICogYmxvY2ssIHBsdXMgYSB0cmlwbGUgaW5kaXJlY3QgYmxvY2sKLQkgKi8KLQlpbmRpcmVjdHMgPSBucmJsb2NrcyAqIDIgKyAxOwotCXJldHVybiBpbmRpcmVjdHM7Ci19Ci0KIHN0YXRpYyBpbnQgZXh0NF9pbmRleF90cmFuc19ibG9ja3Moc3RydWN0IGlub2RlICppbm9kZSwgaW50IG5yYmxvY2tzLCBpbnQgY2h1bmspCiB7CiAJaWYgKCEoZXh0NF90ZXN0X2lub2RlX2ZsYWcoaW5vZGUsIEVYVDRfSU5PREVfRVhURU5UUykpKQotCQlyZXR1cm4gZXh0NF9pbmRpcmVjdF90cmFuc19ibG9ja3MoaW5vZGUsIG5yYmxvY2tzLCBjaHVuayk7CisJCXJldHVybiBleHQ0X2luZF90cmFuc19ibG9ja3MoaW5vZGUsIG5yYmxvY2tzLCBjaHVuayk7CiAJcmV0dXJuIGV4dDRfZXh0X2luZGV4X3RyYW5zX2Jsb2Nrcyhpbm9kZSwgbnJibG9ja3MsIGNodW5rKTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvZXh0NC9pb2N0bC5jIGIvZnMvZXh0NC9pb2N0bC5jCmluZGV4IDgwOGM1NTQuLmYxOGJmZTMgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvaW9jdGwuYworKysgYi9mcy9leHQ0L2lvY3RsLmMKQEAgLTIwMiw4ICsyMDIsOSBAQAogCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CiAJCWludCBlcnIsIGVycjI9MDsKIAotCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19SRVNPVVJDRSkpCi0JCQlyZXR1cm4gLUVQRVJNOworCQllcnIgPSBleHQ0X3Jlc2l6ZV9iZWdpbihzYik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCiAJCWlmIChnZXRfdXNlcihuX2Jsb2Nrc19jb3VudCwgKF9fdTMyIF9fdXNlciAqKWFyZykpCiAJCQlyZXR1cm4gLUVGQVVMVDsKQEAgLTIyMSw2ICsyMjIsNyBAQAogCQlpZiAoZXJyID09IDApCiAJCQllcnIgPSBlcnIyOwogCQltbnRfZHJvcF93cml0ZShmaWxwLT5mX3BhdGgubW50KTsKKwkJZXh0NF9yZXNpemVfZW5kKHNiKTsKIAogCQlyZXR1cm4gZXJyOwogCX0KQEAgLTI3MSw4ICsyNzMsOSBAQAogCQlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CiAJCWludCBlcnIsIGVycjI9MDsKIAotCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19SRVNPVVJDRSkpCi0JCQlyZXR1cm4gLUVQRVJNOworCQllcnIgPSBleHQ0X3Jlc2l6ZV9iZWdpbihzYik7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCiAJCWlmIChjb3B5X2Zyb21fdXNlcigmaW5wdXQsIChzdHJ1Y3QgZXh0NF9uZXdfZ3JvdXBfaW5wdXQgX191c2VyICopYXJnLAogCQkJCXNpemVvZihpbnB1dCkpKQpAQCAtMjkxLDYgKzI5NCw3IEBACiAJCWlmIChlcnIgPT0gMCkKIAkJCWVyciA9IGVycjI7CiAJCW1udF9kcm9wX3dyaXRlKGZpbHAtPmZfcGF0aC5tbnQpOworCQlleHQ0X3Jlc2l6ZV9lbmQoc2IpOwogCiAJCXJldHVybiBlcnI7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9tYmFsbG9jLmMgYi9mcy9leHQ0L21iYWxsb2MuYwppbmRleCA2ZWQ4NTlkLi4xN2E1YTU3IDEwMDY0NAotLS0gYS9mcy9leHQ0L21iYWxsb2MuYworKysgYi9mcy9leHQ0L21iYWxsb2MuYwpAQCAtNzUsOCArNzUsOCBAQAogICoKICAqIFRoZSBpbm9kZSBwcmVhbGxvY2F0aW9uIHNwYWNlIGlzIHVzZWQgbG9va2luZyBhdCB0aGUgX2xvZ2ljYWxfIHN0YXJ0CiAgKiBibG9jay4gSWYgb25seSB0aGUgbG9naWNhbCBmaWxlIGJsb2NrIGZhbGxzIHdpdGhpbiB0aGUgcmFuZ2Ugb2YgcHJlYWxsb2MKLSAqIHNwYWNlIHdlIHdpbGwgY29uc3VtZSB0aGUgcGFydGljdWxhciBwcmVhbGxvYyBzcGFjZS4gVGhpcyBtYWtlIHN1cmUgdGhhdAotICogdGhhdCB0aGUgd2UgaGF2ZSBjb250aWd1b3VzIHBoeXNpY2FsIGJsb2NrcyByZXByZXNlbnRpbmcgdGhlIGZpbGUgYmxvY2tzCisgKiBzcGFjZSB3ZSB3aWxsIGNvbnN1bWUgdGhlIHBhcnRpY3VsYXIgcHJlYWxsb2Mgc3BhY2UuIFRoaXMgbWFrZXMgc3VyZSB0aGF0CisgKiB3ZSBoYXZlIGNvbnRpZ3VvdXMgcGh5c2ljYWwgYmxvY2tzIHJlcHJlc2VudGluZyB0aGUgZmlsZSBibG9ja3MKICAqCiAgKiBUaGUgaW1wb3J0YW50IHRoaW5nIHRvIGJlIG5vdGVkIGluIGNhc2Ugb2YgaW5vZGUgcHJlYWxsb2Mgc3BhY2UgaXMgdGhhdAogICogd2UgZG9uJ3QgbW9kaWZ5IHRoZSB2YWx1ZXMgYXNzb2NpYXRlZCB0byBpbm9kZSBwcmVhbGxvYyBzcGFjZSBleGNlcHQKQEAgLTg0LDcgKzg0LDcgQEAKICAqCiAgKiBJZiB3ZSBhcmUgbm90IGFibGUgdG8gZmluZCBibG9ja3MgaW4gdGhlIGlub2RlIHByZWFsbG9jIHNwYWNlIGFuZCBpZiB3ZQogICogaGF2ZSB0aGUgZ3JvdXAgYWxsb2NhdGlvbiBmbGFnIHNldCB0aGVuIHdlIGxvb2sgYXQgdGhlIGxvY2FsaXR5IGdyb3VwCi0gKiBwcmVhbGxvYyBzcGFjZS4gVGhlc2UgYXJlIHBlciBDUFUgcHJlYWxsb2MgbGlzdCByZXByZWFzZW50ZWQgYXMKKyAqIHByZWFsbG9jIHNwYWNlLiBUaGVzZSBhcmUgcGVyIENQVSBwcmVhbGxvYyBsaXN0IHJlcHJlc2VudGVkIGFzCiAgKgogICogZXh0NF9zYl9pbmZvLnNfbG9jYWxpdHlfZ3JvdXBzW3NtcF9wcm9jZXNzb3JfaWQoKV0KICAqCkBAIC0xMjgsMTIgKzEyOCwxMyBAQAogICogd2UgYXJlIGRvaW5nIGEgZ3JvdXAgcHJlYWxsb2Mgd2UgdHJ5IHRvIG5vcm1hbGl6ZSB0aGUgcmVxdWVzdCB0bwogICogc2JpLT5zX21iX2dyb3VwX3ByZWFsbG9jLiBEZWZhdWx0IHZhbHVlIG9mIHNfbWJfZ3JvdXBfcHJlYWxsb2MgaXMKICAqIDUxMiBibG9ja3MuIFRoaXMgY2FuIGJlIHR1bmVkIHZpYQotICogL3N5cy9mcy9leHQ0LzxwYXJ0aXRpb24vbWJfZ3JvdXBfcHJlYWxsb2MuIFRoZSB2YWx1ZSBpcyByZXByZXNlbnRlZCBpbgorICogL3N5cy9mcy9leHQ0LzxwYXJ0aXRpb24+L21iX2dyb3VwX3ByZWFsbG9jLiBUaGUgdmFsdWUgaXMgcmVwcmVzZW50ZWQgaW4KICAqIHRlcm1zIG9mIG51bWJlciBvZiBibG9ja3MuIElmIHdlIGhhdmUgbW91bnRlZCB0aGUgZmlsZSBzeXN0ZW0gd2l0aCAtTwogICogc3RyaXBlPTx2YWx1ZT4gb3B0aW9uIHRoZSBncm91cCBwcmVhbGxvYyByZXF1ZXN0IGlzIG5vcm1hbGl6ZWQgdG8gdGhlCi0gKiBzdHJpcGUgdmFsdWUgKHNiaS0+c19zdHJpcGUpCisgKiB0aGUgc21hbGxlc3QgbXVsdGlwbGUgb2YgdGhlIHN0cmlwZSB2YWx1ZSAoc2JpLT5zX3N0cmlwZSkgd2hpY2ggaXMKKyAqIGdyZWF0ZXIgdGhhbiB0aGUgZGVmYXVsdCBtYl9ncm91cF9wcmVhbGxvYy4KICAqCi0gKiBUaGUgcmVndWxhciBhbGxvY2F0b3IodXNpbmcgdGhlIGJ1ZGR5IGNhY2hlKSBzdXBwb3J0cyBmZXcgdHVuYWJsZXMuCisgKiBUaGUgcmVndWxhciBhbGxvY2F0b3IgKHVzaW5nIHRoZSBidWRkeSBjYWNoZSkgc3VwcG9ydHMgYSBmZXcgdHVuYWJsZXMuCiAgKgogICogL3N5cy9mcy9leHQ0LzxwYXJ0aXRpb24+L21iX21pbl90b19zY2FuCiAgKiAvc3lzL2ZzL2V4dDQvPHBhcnRpdGlvbj4vbWJfbWF4X3RvX3NjYW4KQEAgLTE1Miw3ICsxNTMsNyBAQAogICogYmVzdCBleHRlbnQgaW4gdGhlIGZvdW5kIGV4dGVudHMuIFNlYXJjaGluZyBmb3IgdGhlIGJsb2NrcyBzdGFydHMgd2l0aAogICogdGhlIGdyb3VwIHNwZWNpZmllZCBhcyB0aGUgZ29hbCB2YWx1ZSBpbiBhbGxvY2F0aW9uIGNvbnRleHQgdmlhCiAgKiBhY19nX2V4LiBFYWNoIGdyb3VwIGlzIGZpcnN0IGNoZWNrZWQgYmFzZWQgb24gdGhlIGNyaXRlcmlhIHdoZXRoZXIgaXQKLSAqIGNhbiB1c2VkIGZvciBhbGxvY2F0aW9uLiBleHQ0X21iX2dvb2RfZ3JvdXAgZXhwbGFpbnMgaG93IHRoZSBncm91cHMgYXJlCisgKiBjYW4gYmUgdXNlZCBmb3IgYWxsb2NhdGlvbi4gZXh0NF9tYl9nb29kX2dyb3VwIGV4cGxhaW5zIGhvdyB0aGUgZ3JvdXBzIGFyZQogICogY2hlY2tlZC4KICAqCiAgKiBCb3RoIHRoZSBwcmVhbGxvYyBzcGFjZSBhcmUgZ2V0dGluZyBwb3B1bGF0ZWQgYXMgYWJvdmUuIFNvIGZvciB0aGUgZmlyc3QKQEAgLTQ5MiwxMCArNDkzLDExIEBACiAJCWIyID0gKHVuc2lnbmVkIGNoYXIgKikgYml0bWFwOwogCQlmb3IgKGkgPSAwOyBpIDwgZTRiLT5iZF9zYi0+c19ibG9ja3NpemU7IGkrKykgewogCQkJaWYgKGIxW2ldICE9IGIyW2ldKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJjb3JydXB0aW9uIGluIGdyb3VwICV1ICIKLQkJCQkgICAgICAgImF0IGJ5dGUgJXUoJXUpOiAleCBpbiBjb3B5ICE9ICV4ICIKLQkJCQkgICAgICAgIm9uIGRpc2svcHJlYWxsb2NcbiIsCi0JCQkJICAgICAgIGU0Yi0+YmRfZ3JvdXAsIGksIGkgKiA4LCBiMVtpXSwgYjJbaV0pOworCQkJCWV4dDRfbXNnKGU0Yi0+YmRfc2IsIEtFUk5fRVJSLAorCQkJCQkgImNvcnJ1cHRpb24gaW4gZ3JvdXAgJXUgIgorCQkJCQkgImF0IGJ5dGUgJXUoJXUpOiAleCBpbiBjb3B5ICE9ICV4ICIKKwkJCQkJICJvbiBkaXNrL3ByZWFsbG9jIiwKKwkJCQkJIGU0Yi0+YmRfZ3JvdXAsIGksIGkgKiA4LCBiMVtpXSwgYjJbaV0pOwogCQkJCUJVRygpOwogCQkJfQogCQl9CkBAIC0xMTI1LDcgKzExMjcsNyBAQAogCWdycCA9IGV4dDRfZ2V0X2dyb3VwX2luZm8oc2IsIGdyb3VwKTsKIAogCWU0Yi0+YmRfYmxrYml0cyA9IHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzOwotCWU0Yi0+YmRfaW5mbyA9IGV4dDRfZ2V0X2dyb3VwX2luZm8oc2IsIGdyb3VwKTsKKwllNGItPmJkX2luZm8gPSBncnA7CiAJZTRiLT5iZF9zYiA9IHNiOwogCWU0Yi0+YmRfZ3JvdXAgPSBncm91cDsKIAllNGItPmJkX2J1ZGR5X3BhZ2UgPSBOVUxMOwpAQCAtMTI4MSw3ICsxMjgzLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIG1iX3NldF9iaXRzKHZvaWQgKmJtLCBpbnQgY3VyLCBpbnQgbGVuKQordm9pZCBleHQ0X3NldF9iaXRzKHZvaWQgKmJtLCBpbnQgY3VyLCBpbnQgbGVuKQogewogCV9fdTMyICphZGRyOwogCkBAIC0xNTEwLDcgKzE1MTIsNyBAQAogCX0KIAltYl9zZXRfbGFyZ2VzdF9mcmVlX29yZGVyKGU0Yi0+YmRfc2IsIGU0Yi0+YmRfaW5mbyk7CiAKLQltYl9zZXRfYml0cyhFWFQ0X01CX0JJVE1BUChlNGIpLCBleC0+ZmVfc3RhcnQsIGxlbjApOworCWV4dDRfc2V0X2JpdHMoRVhUNF9NQl9CSVRNQVAoZTRiKSwgZXgtPmZlX3N0YXJ0LCBsZW4wKTsKIAltYl9jaGVja19idWRkeShlNGIpOwogCiAJcmV0dXJuIHJldDsKQEAgLTIyMjMsOCArMjIyNSw4IEBACiAJCQlFWFQ0X0RFU0NfUEVSX0JMT0NLX0JJVFMoc2IpOwogCQltZXRhX2dyb3VwX2luZm8gPSBrbWFsbG9jKG1ldGFsZW4sIEdGUF9LRVJORUwpOwogCQlpZiAobWV0YV9ncm91cF9pbmZvID09IE5VTEwpIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogY2FuJ3QgYWxsb2NhdGUgbWVtIGZvciBhICIKLQkJCSAgICAgICAiYnVkZHkgZ3JvdXBcbiIpOworCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiRVhUNC1mczogY2FuJ3QgYWxsb2NhdGUgbWVtICIKKwkJCQkgImZvciBhIGJ1ZGR5IGdyb3VwIik7CiAJCQlnb3RvIGV4aXRfbWV0YV9ncm91cF9pbmZvOwogCQl9CiAJCXNiaS0+c19ncm91cF9pbmZvW2dyb3VwID4+IEVYVDRfREVTQ19QRVJfQkxPQ0tfQklUUyhzYildID0KQEAgLTIyMzcsNyArMjIzOSw3IEBACiAKIAltZXRhX2dyb3VwX2luZm9baV0gPSBrbWVtX2NhY2hlX2FsbG9jKGNhY2hlcCwgR0ZQX0tFUk5FTCk7CiAJaWYgKG1ldGFfZ3JvdXBfaW5mb1tpXSA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogY2FuJ3QgYWxsb2NhdGUgYnVkZHkgbWVtXG4iKTsKKwkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAiRVhUNC1mczogY2FuJ3QgYWxsb2NhdGUgYnVkZHkgbWVtIik7CiAJCWdvdG8gZXhpdF9ncm91cF9pbmZvOwogCX0KIAltZW1zZXQobWV0YV9ncm91cF9pbmZvW2ldLCAwLCBrbWVtX2NhY2hlX3NpemUoY2FjaGVwKSk7CkBAIC0yMjc5LDggKzIyODEsMTAgQEAKIAogZXhpdF9ncm91cF9pbmZvOgogCS8qIElmIGEgbWV0YV9ncm91cF9pbmZvIHRhYmxlIGhhcyBiZWVuIGFsbG9jYXRlZCwgcmVsZWFzZSBpdCBub3cgKi8KLQlpZiAoZ3JvdXAgJSBFWFQ0X0RFU0NfUEVSX0JMT0NLKHNiKSA9PSAwKQorCWlmIChncm91cCAlIEVYVDRfREVTQ19QRVJfQkxPQ0soc2IpID09IDApIHsKIAkJa2ZyZWUoc2JpLT5zX2dyb3VwX2luZm9bZ3JvdXAgPj4gRVhUNF9ERVNDX1BFUl9CTE9DS19CSVRTKHNiKV0pOworCQlzYmktPnNfZ3JvdXBfaW5mb1tncm91cCA+PiBFWFQ0X0RFU0NfUEVSX0JMT0NLX0JJVFMoc2IpXSA9IE5VTEw7CisJfQogZXhpdF9tZXRhX2dyb3VwX2luZm86CiAJcmV0dXJuIC1FTk9NRU07CiB9IC8qIGV4dDRfbWJfYWRkX2dyb3VwaW5mbyAqLwpAQCAtMjMyOCwyMyArMjMzMiwyNiBAQAogCS8qIEFuIDhUQiBmaWxlc3lzdGVtIHdpdGggNjQtYml0IHBvaW50ZXJzIHJlcXVpcmVzIGEgNDA5NiBieXRlCiAJICoga21hbGxvYy4gQSAxMjhrYiBtYWxsb2Mgc2hvdWxkIHN1ZmZpY2UgZm9yIGEgMjU2VEIgZmlsZXN5c3RlbS4KIAkgKiBTbyBhIHR3byBsZXZlbCBzY2hlbWUgc3VmZmljZXMgZm9yIG5vdy4gKi8KLQlzYmktPnNfZ3JvdXBfaW5mbyA9IGt6YWxsb2MoYXJyYXlfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJc2JpLT5zX2dyb3VwX2luZm8gPSBleHQ0X2t2emFsbG9jKGFycmF5X3NpemUsIEdGUF9LRVJORUwpOwogCWlmIChzYmktPnNfZ3JvdXBfaW5mbyA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogY2FuJ3QgYWxsb2NhdGUgYnVkZHkgbWV0YSBncm91cFxuIik7CisJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgImNhbid0IGFsbG9jYXRlIGJ1ZGR5IG1ldGEgZ3JvdXAiKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXNiaS0+c19idWRkeV9jYWNoZSA9IG5ld19pbm9kZShzYik7CiAJaWYgKHNiaS0+c19idWRkeV9jYWNoZSA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogY2FuJ3QgZ2V0IG5ldyBpbm9kZVxuIik7CisJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwgImNhbid0IGdldCBuZXcgaW5vZGUiKTsKIAkJZ290byBlcnJfZnJlZXNnaTsKIAl9Ci0Jc2JpLT5zX2J1ZGR5X2NhY2hlLT5pX2lubyA9IGdldF9uZXh0X2lubygpOworCS8qIFRvIGF2b2lkIHBvdGVudGlhbGx5IGNvbGxpZGluZyB3aXRoIGFuIHZhbGlkIG9uLWRpc2sgaW5vZGUgbnVtYmVyLAorCSAqIHVzZSBFWFQ0X0JBRF9JTk8gZm9yIHRoZSBidWRkeSBjYWNoZSBpbm9kZSBudW1iZXIuICBUaGlzIGlub2RlIGlzCisJICogbm90IGluIHRoZSBpbm9kZSBoYXNoLCBzbyBpdCBzaG91bGQgbmV2ZXIgYmUgZm91bmQgYnkgaWdldCgpLCBidXQKKwkgKiB0aGlzIHdpbGwgYXZvaWQgY29uZnVzaW9uIGlmIGl0IGV2ZXIgc2hvd3MgdXAgZHVyaW5nIGRlYnVnZ2luZy4gKi8KKwlzYmktPnNfYnVkZHlfY2FjaGUtPmlfaW5vID0gRVhUNF9CQURfSU5POwogCUVYVDRfSShzYmktPnNfYnVkZHlfY2FjaGUpLT5pX2Rpc2tzaXplID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgbmdyb3VwczsgaSsrKSB7CiAJCWRlc2MgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBpLCBOVUxMKTsKIAkJaWYgKGRlc2MgPT0gTlVMTCkgewotCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJIkVYVDQtZnM6IGNhbid0IHJlYWQgZGVzY3JpcHRvciAldVxuIiwgaSk7CisJCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJjYW4ndCByZWFkIGRlc2NyaXB0b3IgJXUiLCBpKTsKIAkJCWdvdG8gZXJyX2ZyZWVidWRkeTsKIAkJfQogCQlpZiAoZXh0NF9tYl9hZGRfZ3JvdXBpbmZvKHNiLCBpLCBkZXNjKSAhPSAwKQpAQCAtMjM2Miw3ICsyMzY5LDcgQEAKIAkJa2ZyZWUoc2JpLT5zX2dyb3VwX2luZm9baV0pOwogCWlwdXQoc2JpLT5zX2J1ZGR5X2NhY2hlKTsKIGVycl9mcmVlc2dpOgotCWtmcmVlKHNiaS0+c19ncm91cF9pbmZvKTsKKwlleHQ0X2t2ZnJlZShzYmktPnNfZ3JvdXBfaW5mbyk7CiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKQEAgLTI0MDQsMTQgKzI0MTEsMTUgQEAKIAkJCQkJc2xhYl9zaXplLCAwLCBTTEFCX1JFQ0xBSU1fQUNDT1VOVCwKIAkJCQkJTlVMTCk7CiAKKwlleHQ0X2dyb3VwaW5mb19jYWNoZXNbY2FjaGVfaW5kZXhdID0gY2FjaGVwOworCiAJbXV0ZXhfdW5sb2NrKCZleHQ0X2dycGluZm9fc2xhYl9jcmVhdGVfbXV0ZXgpOwogCWlmICghY2FjaGVwKSB7Ci0JCXByaW50ayhLRVJOX0VNRVJHICJFWFQ0OiBubyBtZW1vcnkgZm9yIGdyb3VwaW5mbyBzbGFiIGNhY2hlXG4iKTsKKwkJcHJpbnRrKEtFUk5fRU1FUkcKKwkJICAgICAgICJFWFQ0LWZzOiBubyBtZW1vcnkgZm9yIGdyb3VwaW5mbyBzbGFiIGNhY2hlXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JZXh0NF9ncm91cGluZm9fY2FjaGVzW2NhY2hlX2luZGV4XSA9IGNhY2hlcDsKLQogCXJldHVybiAwOwogfQogCkBAIC0yNDU3LDEyICsyNDY1LDYgQEAKIAkJaSsrOwogCX0gd2hpbGUgKGkgPD0gc2ItPnNfYmxvY2tzaXplX2JpdHMgKyAxKTsKIAotCS8qIGluaXQgZmlsZSBmb3IgYnVkZHkgZGF0YSAqLwotCXJldCA9IGV4dDRfbWJfaW5pdF9iYWNrZW5kKHNiKTsKLQlpZiAocmV0ICE9IDApIHsKLQkJZ290byBvdXQ7Ci0JfQotCiAJc3Bpbl9sb2NrX2luaXQoJnNiaS0+c19tZF9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmc2JpLT5zX2JhbF9sb2NrKTsKIApAQCAtMjQ3Miw2ICsyNDc0LDE4IEBACiAJc2JpLT5zX21iX3N0cmVhbV9yZXF1ZXN0ID0gTUJfREVGQVVMVF9TVFJFQU1fVEhSRVNIT0xEOwogCXNiaS0+c19tYl9vcmRlcjJfcmVxcyA9IE1CX0RFRkFVTFRfT1JERVIyX1JFUVM7CiAJc2JpLT5zX21iX2dyb3VwX3ByZWFsbG9jID0gTUJfREVGQVVMVF9HUk9VUF9QUkVBTExPQzsKKwkvKgorCSAqIElmIHRoZXJlIGlzIGEgc19zdHJpcGUgPiAxLCB0aGVuIHdlIHNldCB0aGUgc19tYl9ncm91cF9wcmVhbGxvYworCSAqIHRvIHRoZSBsb3dlc3QgbXVsdGlwbGUgb2Ygc19zdHJpcGUgd2hpY2ggaXMgYmlnZ2VyIHRoYW4KKwkgKiB0aGUgc19tYl9ncm91cF9wcmVhbGxvYyBhcyBkZXRlcm1pbmVkIGFib3ZlLiBXZSB3YW50CisJICogdGhlIHByZWFsbG9jYXRpb24gc2l6ZSB0byBiZSBhbiBleGFjdCBtdWx0aXBsZSBvZiB0aGUKKwkgKiBSQUlEIHN0cmlwZSBzaXplIHNvIHRoYXQgcHJlYWxsb2NhdGlvbnMgZG9uJ3QgZnJhZ21lbnQKKwkgKiB0aGUgc3RyaXBlcy4KKwkgKi8KKwlpZiAoc2JpLT5zX3N0cmlwZSA+IDEpIHsKKwkJc2JpLT5zX21iX2dyb3VwX3ByZWFsbG9jID0gcm91bmR1cCgKKwkJCXNiaS0+c19tYl9ncm91cF9wcmVhbGxvYywgc2JpLT5zX3N0cmlwZSk7CisJfQogCiAJc2JpLT5zX2xvY2FsaXR5X2dyb3VwcyA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgZXh0NF9sb2NhbGl0eV9ncm91cCk7CiAJaWYgKHNiaS0+c19sb2NhbGl0eV9ncm91cHMgPT0gTlVMTCkgewpAQCAtMjQ4Nyw2ICsyNTAxLDEyIEBACiAJCXNwaW5fbG9ja19pbml0KCZsZy0+bGdfcHJlYWxsb2NfbG9jayk7CiAJfQogCisJLyogaW5pdCBmaWxlIGZvciBidWRkeSBkYXRhICovCisJcmV0ID0gZXh0NF9tYl9pbml0X2JhY2tlbmQoc2IpOworCWlmIChyZXQgIT0gMCkgeworCQlnb3RvIG91dDsKKwl9CisKIAlpZiAoc2JpLT5zX3Byb2MpCiAJCXByb2NfY3JlYXRlX2RhdGEoIm1iX2dyb3VwcyIsIFNfSVJVR08sIHNiaS0+c19wcm9jLAogCQkJCSAmZXh0NF9tYl9zZXFfZ3JvdXBzX2ZvcHMsIHNiKTsKQEAgLTI1NDQsMzIgKzI1NjQsMzIgQEAKIAkJCUVYVDRfREVTQ19QRVJfQkxPQ0tfQklUUyhzYik7CiAJCWZvciAoaSA9IDA7IGkgPCBudW1fbWV0YV9ncm91cF9pbmZvczsgaSsrKQogCQkJa2ZyZWUoc2JpLT5zX2dyb3VwX2luZm9baV0pOwotCQlrZnJlZShzYmktPnNfZ3JvdXBfaW5mbyk7CisJCWV4dDRfa3ZmcmVlKHNiaS0+c19ncm91cF9pbmZvKTsKIAl9CiAJa2ZyZWUoc2JpLT5zX21iX29mZnNldHMpOwogCWtmcmVlKHNiaS0+c19tYl9tYXhzKTsKIAlpZiAoc2JpLT5zX2J1ZGR5X2NhY2hlKQogCQlpcHV0KHNiaS0+c19idWRkeV9jYWNoZSk7CiAJaWYgKHNiaS0+c19tYl9zdGF0cykgewotCQlwcmludGsoS0VSTl9JTkZPCi0JCSAgICAgICAiRVhUNC1mczogbWJhbGxvYzogJXUgYmxvY2tzICV1IHJlcXMgKCV1IHN1Y2Nlc3MpXG4iLAorCQlleHQ0X21zZyhzYiwgS0VSTl9JTkZPLAorCQkgICAgICAgIm1iYWxsb2M6ICV1IGJsb2NrcyAldSByZXFzICgldSBzdWNjZXNzKSIsCiAJCQkJYXRvbWljX3JlYWQoJnNiaS0+c19iYWxfYWxsb2NhdGVkKSwKIAkJCQlhdG9taWNfcmVhZCgmc2JpLT5zX2JhbF9yZXFzKSwKIAkJCQlhdG9taWNfcmVhZCgmc2JpLT5zX2JhbF9zdWNjZXNzKSk7Ci0JCXByaW50ayhLRVJOX0lORk8KLQkJICAgICAgIkVYVDQtZnM6IG1iYWxsb2M6ICV1IGV4dGVudHMgc2Nhbm5lZCwgJXUgZ29hbCBoaXRzLCAiCi0JCQkJIiV1IDJeTiBoaXRzLCAldSBicmVha3MsICV1IGxvc3RcbiIsCisJCWV4dDRfbXNnKHNiLCBLRVJOX0lORk8sCisJCSAgICAgICJtYmFsbG9jOiAldSBleHRlbnRzIHNjYW5uZWQsICV1IGdvYWwgaGl0cywgIgorCQkJCSIldSAyXk4gaGl0cywgJXUgYnJlYWtzLCAldSBsb3N0IiwKIAkJCQlhdG9taWNfcmVhZCgmc2JpLT5zX2JhbF9leF9zY2FubmVkKSwKIAkJCQlhdG9taWNfcmVhZCgmc2JpLT5zX2JhbF9nb2FscyksCiAJCQkJYXRvbWljX3JlYWQoJnNiaS0+c19iYWxfMm9yZGVycyksCiAJCQkJYXRvbWljX3JlYWQoJnNiaS0+c19iYWxfYnJlYWtzKSwKIAkJCQlhdG9taWNfcmVhZCgmc2JpLT5zX21iX2xvc3RfY2h1bmtzKSk7Ci0JCXByaW50ayhLRVJOX0lORk8KLQkJICAgICAgICJFWFQ0LWZzOiBtYmFsbG9jOiAlbHUgZ2VuZXJhdGVkIGFuZCBpdCB0b29rICVMdVxuIiwKLQkJCQlzYmktPnNfbWJfYnVkZGllc19nZW5lcmF0ZWQrKywKKwkJZXh0NF9tc2coc2IsIEtFUk5fSU5GTywKKwkJICAgICAgICJtYmFsbG9jOiAlbHUgZ2VuZXJhdGVkIGFuZCBpdCB0b29rICVMdSIsCisJCQkJc2JpLT5zX21iX2J1ZGRpZXNfZ2VuZXJhdGVkLAogCQkJCXNiaS0+c19tYl9nZW5lcmF0aW9uX3RpbWUpOwotCQlwcmludGsoS0VSTl9JTkZPCi0JCSAgICAgICAiRVhUNC1mczogbWJhbGxvYzogJXUgcHJlYWxsb2NhdGVkLCAldSBkaXNjYXJkZWRcbiIsCisJCWV4dDRfbXNnKHNiLCBLRVJOX0lORk8sCisJCSAgICAgICAibWJhbGxvYzogJXUgcHJlYWxsb2NhdGVkLCAldSBkaXNjYXJkZWQiLAogCQkJCWF0b21pY19yZWFkKCZzYmktPnNfbWJfcHJlYWxsb2NhdGVkKSwKIAkJCQlhdG9taWNfcmVhZCgmc2JpLT5zX21iX2Rpc2NhcmRlZCkpOwogCX0KQEAgLTI2MjgsNiArMjY0OCwxNSBAQAogCQlyYl9lcmFzZSgmZW50cnktPm5vZGUsICYoZGItPmJiX2ZyZWVfcm9vdCkpOwogCQltYl9mcmVlX2Jsb2NrcyhOVUxMLCAmZTRiLCBlbnRyeS0+c3RhcnRfYmxrLCBlbnRyeS0+Y291bnQpOwogCisJCS8qCisJCSAqIENsZWFyIHRoZSB0cmltbWVkIGZsYWcgZm9yIHRoZSBncm91cCBzbyB0aGF0IHRoZSBuZXh0CisJCSAqIGV4dDRfdHJpbV9mcyBjYW4gdHJpbSBpdC4KKwkJICogSWYgdGhlIHZvbHVtZSBpcyBtb3VudGVkIHdpdGggLW8gZGlzY2FyZCwgb25saW5lIGRpc2NhcmQKKwkJICogaXMgc3VwcG9ydGVkIGFuZCB0aGUgZnJlZSBibG9ja3Mgd2lsbCBiZSB0cmltbWVkIG9ubGluZS4KKwkJICovCisJCWlmICghdGVzdF9vcHQoc2IsIERJU0NBUkQpKQorCQkJRVhUNF9NQl9HUlBfQ0xFQVJfVFJJTU1FRChkYik7CisKIAkJaWYgKCFkYi0+YmJfZnJlZV9yb290LnJiX25vZGUpIHsKIAkJCS8qIE5vIG1vcmUgaXRlbXMgaW4gdGhlIHBlciBncm91cCByYiB0cmVlCiAJCQkgKiBiYWxhbmNlIHJlZmNvdW50cyBmcm9tIGV4dDRfbWJfZnJlZV9tZXRhZGF0YSgpCkBAIC0yNzcxLDggKzI4MDAsOCBAQAogCQkgKiBXZSBsZWFrIHNvbWUgb2YgdGhlIGJsb2NrcyBoZXJlLgogCQkgKi8KIAkJZXh0NF9sb2NrX2dyb3VwKHNiLCBhYy0+YWNfYl9leC5mZV9ncm91cCk7Ci0JCW1iX3NldF9iaXRzKGJpdG1hcF9iaC0+Yl9kYXRhLCBhYy0+YWNfYl9leC5mZV9zdGFydCwKLQkJCSAgICBhYy0+YWNfYl9leC5mZV9sZW4pOworCQlleHQ0X3NldF9iaXRzKGJpdG1hcF9iaC0+Yl9kYXRhLCBhYy0+YWNfYl9leC5mZV9zdGFydCwKKwkJCSAgICAgIGFjLT5hY19iX2V4LmZlX2xlbik7CiAJCWV4dDRfdW5sb2NrX2dyb3VwKHNiLCBhYy0+YWNfYl9leC5mZV9ncm91cCk7CiAJCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgYml0bWFwX2JoKTsKIAkJaWYgKCFlcnIpCkBAIC0yNzkwLDcgKzI4MTksOCBAQAogCQl9CiAJfQogI2VuZGlmCi0JbWJfc2V0X2JpdHMoYml0bWFwX2JoLT5iX2RhdGEsIGFjLT5hY19iX2V4LmZlX3N0YXJ0LGFjLT5hY19iX2V4LmZlX2xlbik7CisJZXh0NF9zZXRfYml0cyhiaXRtYXBfYmgtPmJfZGF0YSwgYWMtPmFjX2JfZXguZmVfc3RhcnQsCisJCSAgICAgIGFjLT5hY19iX2V4LmZlX2xlbik7CiAJaWYgKGdkcC0+YmdfZmxhZ3MgJiBjcHVfdG9fbGUxNihFWFQ0X0JHX0JMT0NLX1VOSU5JVCkpIHsKIAkJZ2RwLT5iZ19mbGFncyAmPSBjcHVfdG9fbGUxNih+RVhUNF9CR19CTE9DS19VTklOSVQpOwogCQlleHQ0X2ZyZWVfYmxrc19zZXQoc2IsIGdkcCwKQEAgLTI4MzAsOCArMjg2MCw5IEBACiAKIC8qCiAgKiBoZXJlIHdlIG5vcm1hbGl6ZSByZXF1ZXN0IGZvciBsb2NhbGl0eSBncm91cAotICogR3JvdXAgcmVxdWVzdCBhcmUgbm9ybWFsaXplZCB0byBzX3N0cmlwIHNpemUgaWYgd2Ugc2V0IHRoZSBzYW1lIHZpYSBtb3VudAotICogb3B0aW9uLiBJZiBub3Qgd2Ugc2V0IGl0IHRvIHNfbWJfZ3JvdXBfcHJlYWxsb2Mgd2hpY2ggY2FuIGJlIGNvbmZpZ3VyZWQgdmlhCisgKiBHcm91cCByZXF1ZXN0IGFyZSBub3JtYWxpemVkIHRvIHNfbWJfZ3JvdXBfcHJlYWxsb2MsIHdoaWNoIGdvZXMgdG8KKyAqIHNfc3RyaXAgaWYgd2Ugc2V0IHRoZSBzYW1lIHZpYSBtb3VudCBvcHRpb24uCisgKiBzX21iX2dyb3VwX3ByZWFsbG9jIGNhbiBiZSBjb25maWd1cmVkIHZpYQogICogL3N5cy9mcy9leHQ0LzxwYXJ0aXRpb24+L21iX2dyb3VwX3ByZWFsbG9jCiAgKgogICogWFhYOiBzaG91bGQgd2UgdHJ5IHRvIHByZWFsbG9jYXRlIG1vcmUgdGhhbiB0aGUgZ3JvdXAgaGFzIG5vdz8KQEAgLTI4NDIsMTAgKzI4NzMsNyBAQAogCXN0cnVjdCBleHQ0X2xvY2FsaXR5X2dyb3VwICpsZyA9IGFjLT5hY19sZzsKIAogCUJVR19PTihsZyA9PSBOVUxMKTsKLQlpZiAoRVhUNF9TQihzYiktPnNfc3RyaXBlKQotCQlhYy0+YWNfZ19leC5mZV9sZW4gPSBFWFQ0X1NCKHNiKS0+c19zdHJpcGU7Ci0JZWxzZQotCQlhYy0+YWNfZ19leC5mZV9sZW4gPSBFWFQ0X1NCKHNiKS0+c19tYl9ncm91cF9wcmVhbGxvYzsKKwlhYy0+YWNfZ19leC5mZV9sZW4gPSBFWFQ0X1NCKHNiKS0+c19tYl9ncm91cF9wcmVhbGxvYzsKIAltYl9kZWJ1ZygxLCAiIyV1OiBnb2FsICV1IGJsb2NrcyBmb3IgbG9jYWxpdHkgZ3JvdXBcbiIsCiAJCWN1cnJlbnQtPnBpZCwgYWMtPmFjX2dfZXguZmVfbGVuKTsKIH0KQEAgLTMwMDEsOSArMzAyOSwxMCBAQAogCiAJaWYgKHN0YXJ0ICsgc2l6ZSA8PSBhYy0+YWNfb19leC5mZV9sb2dpY2FsICYmCiAJCQlzdGFydCA+IGFjLT5hY19vX2V4LmZlX2xvZ2ljYWwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJzdGFydCAlbHUsIHNpemUgJWx1LCBmZV9sb2dpY2FsICVsdVxuIiwKLQkJCSh1bnNpZ25lZCBsb25nKSBzdGFydCwgKHVuc2lnbmVkIGxvbmcpIHNpemUsCi0JCQkodW5zaWduZWQgbG9uZykgYWMtPmFjX29fZXguZmVfbG9naWNhbCk7CisJCWV4dDRfbXNnKGFjLT5hY19zYiwgS0VSTl9FUlIsCisJCQkgInN0YXJ0ICVsdSwgc2l6ZSAlbHUsIGZlX2xvZ2ljYWwgJWx1IiwKKwkJCSAodW5zaWduZWQgbG9uZykgc3RhcnQsICh1bnNpZ25lZCBsb25nKSBzaXplLAorCQkJICh1bnNpZ25lZCBsb25nKSBhYy0+YWNfb19leC5mZV9sb2dpY2FsKTsKIAl9CiAJQlVHX09OKHN0YXJ0ICsgc2l6ZSA8PSBhYy0+YWNfb19leC5mZV9sb2dpY2FsICYmCiAJCQlzdGFydCA+IGFjLT5hY19vX2V4LmZlX2xvZ2ljYWwpOwpAQCAtMzI2Miw3ICszMjkxLDcgQEAKIAogCXdoaWxlIChuKSB7CiAJCWVudHJ5ID0gcmJfZW50cnkobiwgc3RydWN0IGV4dDRfZnJlZV9kYXRhLCBub2RlKTsKLQkJbWJfc2V0X2JpdHMoYml0bWFwLCBlbnRyeS0+c3RhcnRfYmxrLCBlbnRyeS0+Y291bnQpOworCQlleHQ0X3NldF9iaXRzKGJpdG1hcCwgZW50cnktPnN0YXJ0X2JsaywgZW50cnktPmNvdW50KTsKIAkJbiA9IHJiX25leHQobik7CiAJfQogCXJldHVybjsKQEAgLTMzMDQsNyArMzMzMyw3IEBACiAJCWlmICh1bmxpa2VseShsZW4gPT0gMCkpCiAJCQljb250aW51ZTsKIAkJQlVHX09OKGdyb3VwbnIgIT0gZ3JvdXApOwotCQltYl9zZXRfYml0cyhiaXRtYXAsIHN0YXJ0LCBsZW4pOworCQlleHQ0X3NldF9iaXRzKGJpdG1hcCwgc3RhcnQsIGxlbik7CiAJCXByZWFsbG9jYXRlZCArPSBsZW47CiAJCWNvdW50Kys7CiAJfQpAQCAtMzU4NCwxMCArMzYxMywxMSBAQAogCQliaXQgPSBuZXh0ICsgMTsKIAl9CiAJaWYgKGZyZWUgIT0gcGEtPnBhX2ZyZWUpIHsKLQkJcHJpbnRrKEtFUk5fQ1JJVCAicGEgJXA6IGxvZ2ljICVsdSwgcGh5cy4gJWx1LCBsZW4gJWx1XG4iLAotCQkJcGEsICh1bnNpZ25lZCBsb25nKSBwYS0+cGFfbHN0YXJ0LAotCQkJKHVuc2lnbmVkIGxvbmcpIHBhLT5wYV9wc3RhcnQsCi0JCQkodW5zaWduZWQgbG9uZykgcGEtPnBhX2xlbik7CisJCWV4dDRfbXNnKGU0Yi0+YmRfc2IsIEtFUk5fQ1JJVCwKKwkJCSAicGEgJXA6IGxvZ2ljICVsdSwgcGh5cy4gJWx1LCBsZW4gJWx1IiwKKwkJCSBwYSwgKHVuc2lnbmVkIGxvbmcpIHBhLT5wYV9sc3RhcnQsCisJCQkgKHVuc2lnbmVkIGxvbmcpIHBhLT5wYV9wc3RhcnQsCisJCQkgKHVuc2lnbmVkIGxvbmcpIHBhLT5wYV9sZW4pOwogCQlleHQ0X2dycF9sb2NrZWRfZXJyb3Ioc2IsIGdyb3VwLCAwLCAwLCAiZnJlZSAldSwgcGFfZnJlZSAldSIsCiAJCQkJCWZyZWUsIHBhLT5wYV9mcmVlKTsKIAkJLyoKQEAgLTM3NzUsNyArMzgwNSw4IEBACiAJCQkgKiB1c2UgcHJlYWxsb2NhdGlvbiB3aGlsZSB3ZSdyZSBkaXNjYXJkaW5nIGl0ICovCiAJCQlzcGluX3VubG9jaygmcGEtPnBhX2xvY2spOwogCQkJc3Bpbl91bmxvY2soJmVpLT5pX3ByZWFsbG9jX2xvY2spOwotCQkJcHJpbnRrKEtFUk5fRVJSICJ1aC1vaCEgdXNlZCBwYSB3aGlsZSBkaXNjYXJkaW5nXG4iKTsKKwkJCWV4dDRfbXNnKHNiLCBLRVJOX0VSUiwKKwkJCQkgInVoLW9oISB1c2VkIHBhIHdoaWxlIGRpc2NhcmRpbmciKTsKIAkJCVdBUk5fT04oMSk7CiAJCQlzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZShIWik7CiAJCQlnb3RvIHJlcGVhdDsKQEAgLTM4NTIsMTIgKzM4ODMsMTMgQEAKIAkgICAgKEVYVDRfU0Ioc2IpLT5zX21vdW50X2ZsYWdzICYgRVhUNF9NRl9GU19BQk9SVEVEKSkKIAkJcmV0dXJuOwogCi0JcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBDYW4ndCBhbGxvY2F0ZToiCi0JCQkiIEFsbG9jYXRpb24gY29udGV4dCBkZXRhaWxzOlxuIik7Ci0JcHJpbnRrKEtFUk5fRVJSICJFWFQ0LWZzOiBzdGF0dXMgJWQgZmxhZ3MgJWRcbiIsCisJZXh0NF9tc2coYWMtPmFjX3NiLCBLRVJOX0VSUiwgIkVYVDQtZnM6IENhbid0IGFsbG9jYXRlOiIKKwkJCSIgQWxsb2NhdGlvbiBjb250ZXh0IGRldGFpbHM6Iik7CisJZXh0NF9tc2coYWMtPmFjX3NiLCBLRVJOX0VSUiwgIkVYVDQtZnM6IHN0YXR1cyAlZCBmbGFncyAlZCIsCiAJCQlhYy0+YWNfc3RhdHVzLCBhYy0+YWNfZmxhZ3MpOwotCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogb3JpZyAlbHUvJWx1LyVsdUAlbHUsIGdvYWwgJWx1LyVsdS8lbHVAJWx1LCAiCi0JCQkiYmVzdCAlbHUvJWx1LyVsdUAlbHUgY3IgJWRcbiIsCisJZXh0NF9tc2coYWMtPmFjX3NiLCBLRVJOX0VSUiwgIkVYVDQtZnM6IG9yaWcgJWx1LyVsdS8lbHVAJWx1LCAiCisJCSAJImdvYWwgJWx1LyVsdS8lbHVAJWx1LCAiCisJCQkiYmVzdCAlbHUvJWx1LyVsdUAlbHUgY3IgJWQiLAogCQkJKHVuc2lnbmVkIGxvbmcpYWMtPmFjX29fZXguZmVfZ3JvdXAsCiAJCQkodW5zaWduZWQgbG9uZylhYy0+YWNfb19leC5mZV9zdGFydCwKIAkJCSh1bnNpZ25lZCBsb25nKWFjLT5hY19vX2V4LmZlX2xlbiwKQEAgLTM4NzEsOSArMzkwMyw5IEBACiAJCQkodW5zaWduZWQgbG9uZylhYy0+YWNfYl9leC5mZV9sZW4sCiAJCQkodW5zaWduZWQgbG9uZylhYy0+YWNfYl9leC5mZV9sb2dpY2FsLAogCQkJKGludClhYy0+YWNfY3JpdGVyaWEpOwotCXByaW50ayhLRVJOX0VSUiAiRVhUNC1mczogJWx1IHNjYW5uZWQsICVkIGZvdW5kXG4iLCBhYy0+YWNfZXhfc2Nhbm5lZCwKLQkJYWMtPmFjX2ZvdW5kKTsKLQlwcmludGsoS0VSTl9FUlIgIkVYVDQtZnM6IGdyb3VwczogXG4iKTsKKwlleHQ0X21zZyhhYy0+YWNfc2IsIEtFUk5fRVJSLCAiRVhUNC1mczogJWx1IHNjYW5uZWQsICVkIGZvdW5kIiwKKwkJIGFjLT5hY19leF9zY2FubmVkLCBhYy0+YWNfZm91bmQpOworCWV4dDRfbXNnKGFjLT5hY19zYiwgS0VSTl9FUlIsICJFWFQ0LWZzOiBncm91cHM6ICIpOwogCW5ncm91cHMgPSBleHQ0X2dldF9ncm91cHNfY291bnQoc2IpOwogCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspIHsKIAkJc3RydWN0IGV4dDRfZ3JvdXBfaW5mbyAqZ3JwID0gZXh0NF9nZXRfZ3JvdXBfaW5mbyhzYiwgaSk7CkBAIC00NjM3LDcgKzQ2NjksNyBAQAogCX0KIAlleHQ0X21hcmtfc3VwZXJfZGlydHkoc2IpOwogZXJyb3JfcmV0dXJuOgotCWlmIChmcmVlZCkKKwlpZiAoZnJlZWQgJiYgIShmbGFncyAmIEVYVDRfRlJFRV9CTE9DS1NfTk9fUVVPVF9VUERBVEUpKQogCQlkcXVvdF9mcmVlX2Jsb2NrKGlub2RlLCBmcmVlZCk7CiAJYnJlbHNlKGJpdG1hcF9iaCk7CiAJZXh0NF9zdGRfZXJyb3Ioc2IsIGVycik7CkBAIC00NjQ1LDcgKzQ2NzcsNyBAQAogfQogCiAvKioKLSAqIGV4dDRfYWRkX2dyb3VwYmxvY2tzKCkgLS0gQWRkIGdpdmVuIGJsb2NrcyB0byBhbiBleGlzdGluZyBncm91cAorICogZXh0NF9ncm91cF9hZGRfYmxvY2tzKCkgLS0gQWRkIGdpdmVuIGJsb2NrcyB0byBhbiBleGlzdGluZyBncm91cAogICogQGhhbmRsZToJCQloYW5kbGUgdG8gdGhpcyB0cmFuc2FjdGlvbgogICogQHNiOgkJCQlzdXBlciBibG9jawogICogQGJsb2NrOgkJCXN0YXJ0IHBoeXNjaWFsIGJsb2NrIHRvIGFkZCB0byB0aGUgYmxvY2sgZ3JvdXAKQEAgLTQ2NTMsNyArNDY4NSw3IEBACiAgKgogICogVGhpcyBtYXJrcyB0aGUgYmxvY2tzIGFzIGZyZWUgaW4gdGhlIGJpdG1hcCBhbmQgYnVkZHkuCiAgKi8KLXZvaWQgZXh0NF9hZGRfZ3JvdXBibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKK2ludCBleHQ0X2dyb3VwX2FkZF9ibG9ja3MoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKIAkJCSBleHQ0X2ZzYmxrX3QgYmxvY2ssIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaXRtYXBfYmggPSBOVUxMOwpAQCAtNDY2NiwyNSArNDY5OCwzNSBAQAogCXN0cnVjdCBleHQ0X2J1ZGR5IGU0YjsKIAlpbnQgZXJyID0gMCwgcmV0LCBibGtfZnJlZV9jb3VudDsKIAlleHQ0X2dycGJsa190IGJsb2Nrc19mcmVlZDsKLQlzdHJ1Y3QgZXh0NF9ncm91cF9pbmZvICpncnA7CiAKIAlleHQ0X2RlYnVnKCJBZGRpbmcgYmxvY2socykgJWxsdS0lbGx1XG4iLCBibG9jaywgYmxvY2sgKyBjb3VudCAtIDEpOwogCisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiAwOworCiAJZXh0NF9nZXRfZ3JvdXBfbm9fYW5kX29mZnNldChzYiwgYmxvY2ssICZibG9ja19ncm91cCwgJmJpdCk7Ci0JZ3JwID0gZXh0NF9nZXRfZ3JvdXBfaW5mbyhzYiwgYmxvY2tfZ3JvdXApOwogCS8qCiAJICogQ2hlY2sgdG8gc2VlIGlmIHdlIGFyZSBmcmVlaW5nIGJsb2NrcyBhY3Jvc3MgYSBncm91cAogCSAqIGJvdW5kYXJ5LgogCSAqLwotCWlmIChiaXQgKyBjb3VudCA+IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikpCisJaWYgKGJpdCArIGNvdW50ID4gRVhUNF9CTE9DS1NfUEVSX0dST1VQKHNiKSkgeworCQlleHQ0X3dhcm5pbmcoc2IsICJ0b28gbXVjaCBibG9ja3MgYWRkZWQgdG8gZ3JvdXAgJXVcbiIsCisJCQkgICAgIGJsb2NrX2dyb3VwKTsKKwkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBlcnJvcl9yZXR1cm47CisJfQogCiAJYml0bWFwX2JoID0gZXh0NF9yZWFkX2Jsb2NrX2JpdG1hcChzYiwgYmxvY2tfZ3JvdXApOwotCWlmICghYml0bWFwX2JoKQorCWlmICghYml0bWFwX2JoKSB7CisJCWVyciA9IC1FSU87CiAJCWdvdG8gZXJyb3JfcmV0dXJuOworCX0KKwogCWRlc2MgPSBleHQ0X2dldF9ncm91cF9kZXNjKHNiLCBibG9ja19ncm91cCwgJmdkX2JoKTsKLQlpZiAoIWRlc2MpCisJaWYgKCFkZXNjKSB7CisJCWVyciA9IC1FSU87CiAJCWdvdG8gZXJyb3JfcmV0dXJuOworCX0KIAogCWlmIChpbl9yYW5nZShleHQ0X2Jsb2NrX2JpdG1hcChzYiwgZGVzYyksIGJsb2NrLCBjb3VudCkgfHwKIAkgICAgaW5fcmFuZ2UoZXh0NF9pbm9kZV9iaXRtYXAoc2IsIGRlc2MpLCBibG9jaywgY291bnQpIHx8CkBAIC00Njk0LDYgKzQ3MzYsNyBAQAogCQlleHQ0X2Vycm9yKHNiLCAiQWRkaW5nIGJsb2NrcyBpbiBzeXN0ZW0gem9uZXMgLSAiCiAJCQkgICAiQmxvY2sgPSAlbGx1LCBjb3VudCA9ICVsdSIsCiAJCQkgICBibG9jaywgY291bnQpOworCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIGVycm9yX3JldHVybjsKIAl9CiAKQEAgLTQ3NjIsNyArNDgwNSw3IEBACiBlcnJvcl9yZXR1cm46CiAJYnJlbHNlKGJpdG1hcF9iaCk7CiAJZXh0NF9zdGRfZXJyb3Ioc2IsIGVycik7Ci0JcmV0dXJuOworCXJldHVybiBlcnI7CiB9CiAKIC8qKgpAQCAtNDc4Miw2ICs0ODI1LDggQEAKIHsKIAlzdHJ1Y3QgZXh0NF9mcmVlX2V4dGVudCBleDsKIAorCXRyYWNlX2V4dDRfdHJpbV9leHRlbnQoc2IsIGdyb3VwLCBzdGFydCwgY291bnQpOworCiAJYXNzZXJ0X3NwaW5fbG9ja2VkKGV4dDRfZ3JvdXBfbG9ja19wdHIoc2IsIGdyb3VwKSk7CiAKIAlleC5mZV9zdGFydCA9IHN0YXJ0OwpAQCAtNDgwMiw3ICs0ODQ3LDcgQEAKIC8qKgogICogZXh0NF90cmltX2FsbF9mcmVlIC0tIGZ1bmN0aW9uIHRvIHRyaW0gYWxsIGZyZWUgc3BhY2UgaW4gYWxsb2MuIGdyb3VwCiAgKiBAc2I6CQkJc3VwZXIgYmxvY2sgZm9yIGZpbGUgc3lzdGVtCi0gKiBAZTRiOgkJZXh0NCBidWRkeQorICogQGdyb3VwOgkJZ3JvdXAgdG8gYmUgdHJpbW1lZAogICogQHN0YXJ0OgkJZmlyc3QgZ3JvdXAgYmxvY2sgdG8gZXhhbWluZQogICogQG1heDoJCWxhc3QgZ3JvdXAgYmxvY2sgdG8gZXhhbWluZQogICogQG1pbmJsb2NrczoJCW1pbmltdW0gZXh0ZW50IGJsb2NrIGNvdW50CkBAIC00ODIzLDEwICs0ODY4LDEyIEBACiAJCSAgIGV4dDRfZ3JwYmxrX3QgbWluYmxvY2tzKQogewogCXZvaWQgKmJpdG1hcDsKLQlleHQ0X2dycGJsa190IG5leHQsIGNvdW50ID0gMDsKKwlleHQ0X2dycGJsa190IG5leHQsIGNvdW50ID0gMCwgZnJlZV9jb3VudCA9IDA7CiAJc3RydWN0IGV4dDRfYnVkZHkgZTRiOwogCWludCByZXQ7CiAKKwl0cmFjZV9leHQ0X3RyaW1fYWxsX2ZyZWUoc2IsIGdyb3VwLCBzdGFydCwgbWF4KTsKKwogCXJldCA9IGV4dDRfbWJfbG9hZF9idWRkeShzYiwgZ3JvdXAsICZlNGIpOwogCWlmIChyZXQpIHsKIAkJZXh0NF9lcnJvcihzYiwgIkVycm9yIGluIGxvYWRpbmcgYnVkZHkgIgpAQCAtNDgzNiw2ICs0ODgzLDEwIEBACiAJYml0bWFwID0gZTRiLmJkX2JpdG1hcDsKIAogCWV4dDRfbG9ja19ncm91cChzYiwgZ3JvdXApOworCWlmIChFWFQ0X01CX0dSUF9XQVNfVFJJTU1FRChlNGIuYmRfaW5mbykgJiYKKwkgICAgbWluYmxvY2tzID49IGF0b21pY19yZWFkKCZFWFQ0X1NCKHNiKS0+c19sYXN0X3RyaW1fbWluYmxrcykpCisJCWdvdG8gb3V0OworCiAJc3RhcnQgPSAoZTRiLmJkX2luZm8tPmJiX2ZpcnN0X2ZyZWUgPiBzdGFydCkgPwogCQllNGIuYmRfaW5mby0+YmJfZmlyc3RfZnJlZSA6IHN0YXJ0OwogCkBAIC00ODUwLDYgKzQ5MDEsNyBAQAogCQkJCQkgbmV4dCAtIHN0YXJ0LCBncm91cCwgJmU0Yik7CiAJCQljb3VudCArPSBuZXh0IC0gc3RhcnQ7CiAJCX0KKwkJZnJlZV9jb3VudCArPSBuZXh0IC0gc3RhcnQ7CiAJCXN0YXJ0ID0gbmV4dCArIDE7CiAKIAkJaWYgKGZhdGFsX3NpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CkBAIC00ODYzLDkgKzQ5MTUsMTMgQEAKIAkJCWV4dDRfbG9ja19ncm91cChzYiwgZ3JvdXApOwogCQl9CiAKLQkJaWYgKChlNGIuYmRfaW5mby0+YmJfZnJlZSAtIGNvdW50KSA8IG1pbmJsb2NrcykKKwkJaWYgKChlNGIuYmRfaW5mby0+YmJfZnJlZSAtIGZyZWVfY291bnQpIDwgbWluYmxvY2tzKQogCQkJYnJlYWs7CiAJfQorCisJaWYgKCFyZXQpCisJCUVYVDRfTUJfR1JQX1NFVF9UUklNTUVEKGU0Yi5iZF9pbmZvKTsKK291dDoKIAlleHQ0X3VubG9ja19ncm91cChzYiwgZ3JvdXApOwogCWV4dDRfbWJfdW5sb2FkX2J1ZGR5KCZlNGIpOwogCkBAIC00OTA0LDYgKzQ5NjAsOCBAQAogCiAJaWYgKHVubGlrZWx5KG1pbmxlbiA+IEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYikpKQogCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc3RhcnQgKyBsZW4gPD0gZmlyc3RfZGF0YV9ibGspCisJCWdvdG8gb3V0OwogCWlmIChzdGFydCA8IGZpcnN0X2RhdGFfYmxrKSB7CiAJCWxlbiAtPSBmaXJzdF9kYXRhX2JsayAtIHN0YXJ0OwogCQlzdGFydCA9IGZpcnN0X2RhdGFfYmxrOwpAQCAtNDk1Miw1ICs1MDEwLDkgQEAKIAl9CiAJcmFuZ2UtPmxlbiA9IHRyaW1tZWQgKiBzYi0+c19ibG9ja3NpemU7CiAKKwlpZiAoIXJldCkKKwkJYXRvbWljX3NldCgmRVhUNF9TQihzYiktPnNfbGFzdF90cmltX21pbmJsa3MsIG1pbmxlbik7CisKK291dDoKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9tYmFsbG9jLmggYi9mcy9leHQ0L21iYWxsb2MuaAppbmRleCAyMGI1ZTdiLi45ZDRhNjM2IDEwMDY0NAotLS0gYS9mcy9leHQ0L21iYWxsb2MuaAorKysgYi9mcy9leHQ0L21iYWxsb2MuaApAQCAtMTg3LDcgKzE4Nyw2IEBACiAJX191MTYgYWNfZmxhZ3M7CQkvKiBhbGxvY2F0aW9uIGhpbnRzICovCiAJX191OCBhY19zdGF0dXM7CiAJX191OCBhY19jcml0ZXJpYTsKLQlfX3U4IGFjX3JlcGVhdHM7CiAJX191OCBhY18yb3JkZXI7CQkvKiBpZiByZXF1ZXN0IGlzIHRvIGFsbG9jYXRlIDJeTiBibG9ja3MgYW5kCiAJCQkJICogTiA+IDAsIHRoZSBmaWVsZCBzdG9yZXMgTiwgb3RoZXJ3aXNlIDAgKi8KIAlfX3U4IGFjX29wOwkJLyogb3BlcmF0aW9uLCBmb3IgaGlzdG9yeSBvbmx5ICovCmRpZmYgLS1naXQgYS9mcy9leHQ0L25hbWVpLmMgYi9mcy9leHQ0L25hbWVpLmMKaW5kZXggOGM5YmFiYS4uNTY1YTE1NCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9uYW1laS5jCisrKyBiL2ZzL2V4dDQvbmFtZWkuYwpAQCAtMjg5LDcgKzI4OSw3IEBACiAJCQkJd2hpbGUgKGxlbi0tKSBwcmludGsoIiVjIiwgKm5hbWUrKyk7CiAJCQkJZXh0NGZzX2Rpcmhhc2goZGUtPm5hbWUsIGRlLT5uYW1lX2xlbiwgJmgpOwogCQkJCXByaW50aygiOiV4LiV1ICIsIGguaGFzaCwKLQkJCQkgICAgICAgKChjaGFyICopIGRlIC0gYmFzZSkpOworCQkJCSAgICAgICAodW5zaWduZWQpICgoY2hhciAqKSBkZSAtIGJhc2UpKTsKIAkJCX0KIAkJCXNwYWNlICs9IEVYVDRfRElSX1JFQ19MRU4oZGUtPm5hbWVfbGVuKTsKIAkJCW5hbWVzKys7CkBAIC0xMDEzLDcgKzEwMTMsNyBAQAogCiAJKmVyciA9IC1FTk9FTlQ7CiBlcnJvdXQ6Ci0JZHh0cmFjZShwcmludGsoS0VSTl9ERUJVRyAiJXMgbm90IGZvdW5kXG4iLCBuYW1lKSk7CisJZHh0cmFjZShwcmludGsoS0VSTl9ERUJVRyAiJXMgbm90IGZvdW5kXG4iLCBkX25hbWUtPm5hbWUpKTsKIAlkeF9yZWxlYXNlIChmcmFtZXMpOwogCXJldHVybiBOVUxMOwogfQpAQCAtMTk4NSwxOCArMTk4NSwxMSBAQAogCWlmICghbGlzdF9lbXB0eSgmRVhUNF9JKGlub2RlKS0+aV9vcnBoYW4pKQogCQlnb3RvIG91dF91bmxvY2s7CiAKLQkvKiBPcnBoYW4gaGFuZGxpbmcgaXMgb25seSB2YWxpZCBmb3IgZmlsZXMgd2l0aCBkYXRhIGJsb2NrcwotCSAqIGJlaW5nIHRydW5jYXRlZCwgb3IgZmlsZXMgYmVpbmcgdW5saW5rZWQuICovCi0KLQkvKiBAQEAgRklYTUU6IE9ic2VydmF0aW9uIGZyb20gYXZpcm86Ci0JICogSSB0aGluayBJIGNhbiB0cmlnZ2VyIEpfQVNTRVJUIGluIGV4dDRfb3JwaGFuX2FkZCgpLiAgV2UgYmxvY2sKLQkgKiBoZXJlIChvbiBzX29ycGhhbl9sb2NrKSwgc28gcmFjZSB3aXRoIGV4dDRfbGluaygpIHdoaWNoIG1pZ2h0IGJ1bXAKLQkgKiAtPmlfbmxpbmsuIEZvciwgc2F5IGl0LCBjaGFyYWN0ZXIgZGV2aWNlLiBOb3QgYSByZWd1bGFyIGZpbGUsCi0JICogbm90IGEgZGlyZWN0b3J5LCBub3QgYSBzeW1saW5rIGFuZCAtPmlfbmxpbmsgPiAwLgotCSAqCi0JICogdHl0c28sIDQvMjUvMjAwOTogSSdtIG5vdCBzdXJlIGhvdyB0aGF0IGNvdWxkIGhhcHBlbjsKLQkgKiBzaG91bGRuJ3QgdGhlIGZzIGNvcmUgcHJvdGVjdCB1cyBmcm9tIHRoZXNlIHNvcnQgb2YKLQkgKiB1bmxpbmsoKS9saW5rKCkgcmFjZXM/CisJLyoKKwkgKiBPcnBoYW4gaGFuZGxpbmcgaXMgb25seSB2YWxpZCBmb3IgZmlsZXMgd2l0aCBkYXRhIGJsb2NrcworCSAqIGJlaW5nIHRydW5jYXRlZCwgb3IgZmlsZXMgYmVpbmcgdW5saW5rZWQuIE5vdGUgdGhhdCB3ZSBlaXRoZXIKKwkgKiBob2xkIGlfbXV0ZXgsIG9yIHRoZSBpbm9kZSBjYW4gbm90IGJlIHJlZmVyZW5jZWQgZnJvbSBvdXRzaWRlLAorCSAqIHNvIGlfbmxpbmsgc2hvdWxkIG5vdCBiZSBidW1wZWQgZHVlIHRvIHJhY2UKIAkgKi8KIAlKX0FTU0VSVCgoU19JU1JFRyhpbm9kZS0+aV9tb2RlKSB8fCBTX0lTRElSKGlub2RlLT5pX21vZGUpIHx8CiAJCSAgU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkgfHwgaW5vZGUtPmlfbmxpbmsgPT0gMCk7CmRpZmYgLS1naXQgYS9mcy9leHQ0L3BhZ2UtaW8uYyBiL2ZzL2V4dDQvcGFnZS1pby5jCmluZGV4IDdiYjhmNzYuLjQzMGM0MDEgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvcGFnZS1pby5jCisrKyBiL2ZzL2V4dDQvcGFnZS1pby5jCkBAIC0yODUsMTEgKzI4NSw3IEBACiAJaW9fZW5kID0gZXh0NF9pbml0X2lvX2VuZChpbm9kZSwgR0ZQX05PRlMpOwogCWlmICghaW9fZW5kKQogCQlyZXR1cm4gLUVOT01FTTsKLQlkbyB7Ci0JCWJpbyA9IGJpb19hbGxvYyhHRlBfTk9JTywgbnZlY3MpOwotCQludmVjcyA+Pj0gMTsKLQl9IHdoaWxlIChiaW8gPT0gTlVMTCk7Ci0KKwliaW8gPSBiaW9fYWxsb2MoR0ZQX05PSU8sIG1pbihudmVjcywgQklPX01BWF9QQUdFUykpOwogCWJpby0+Ymlfc2VjdG9yID0gYmgtPmJfYmxvY2tuciAqIChiaC0+Yl9zaXplID4+IDkpOwogCWJpby0+YmlfYmRldiA9IGJoLT5iX2JkZXY7CiAJYmlvLT5iaV9wcml2YXRlID0gaW8tPmlvX2VuZCA9IGlvX2VuZDsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvcmVzaXplLmMgYi9mcy9leHQ0L3Jlc2l6ZS5jCmluZGV4IDgwYmJjOWMuLjcwN2QzZjEgMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvcmVzaXplLmMKKysrIGIvZnMvZXh0NC9yZXNpemUuYwpAQCAtMTYsNiArMTYsMzUgQEAKIAogI2luY2x1ZGUgImV4dDRfamJkMi5oIgogCitpbnQgZXh0NF9yZXNpemVfYmVnaW4oc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICghY2FwYWJsZShDQVBfU1lTX1JFU09VUkNFKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCS8qCisJICogV2UgYXJlIG5vdCBhbGxvd2VkIHRvIGRvIG9ubGluZS1yZXNpemluZyBvbiBhIGZpbGVzeXN0ZW0gbW91bnRlZAorCSAqIHdpdGggZXJyb3IsIGJlY2F1c2UgaXQgY2FuIGRlc3Ryb3kgdGhlIGZpbGVzeXN0ZW0gZWFzaWx5LgorCSAqLworCWlmIChFWFQ0X1NCKHNiKS0+c19tb3VudF9zdGF0ZSAmIEVYVDRfRVJST1JfRlMpIHsKKwkJZXh0NF93YXJuaW5nKHNiLCAiVGhlcmUgYXJlIGVycm9ycyBpbiB0aGUgZmlsZXN5c3RlbSwgIgorCQkJICAgICAic28gb25saW5lIHJlc2l6aW5nIGlzIG5vdCBhbGxvd2VkXG4iKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlpZiAodGVzdF9hbmRfc2V0X2JpdF9sb2NrKEVYVDRfUkVTSVpJTkcsICZFWFQ0X1NCKHNiKS0+c19yZXNpemVfZmxhZ3MpKQorCQlyZXQgPSAtRUJVU1k7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGV4dDRfcmVzaXplX2VuZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKQoreworCWNsZWFyX2JpdF91bmxvY2soRVhUNF9SRVNJWklORywgJkVYVDRfU0Ioc2IpLT5zX3Jlc2l6ZV9mbGFncyk7CisJc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsKK30KKwogI2RlZmluZSBvdXRzaWRlKGIsIGZpcnN0LCBsYXN0KQkoKGIpIDwgKGZpcnN0KSB8fCAoYikgPj0gKGxhc3QpKQogI2RlZmluZSBpbnNpZGUoYiwgZmlyc3QsIGxhc3QpCSgoYikgPj0gKGZpcnN0KSAmJiAoYikgPCAobGFzdCkpCiAKQEAgLTExOCwxMCArMTQ3LDggQEAKIAkJYnJlbHNlKGJoKTsKIAkJYmggPSBFUlJfUFRSKGVycik7CiAJfSBlbHNlIHsKLQkJbG9ja19idWZmZXIoYmgpOwogCQltZW1zZXQoYmgtPmJfZGF0YSwgMCwgc2ItPnNfYmxvY2tzaXplKTsKIAkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7Ci0JCXVubG9ja19idWZmZXIoYmgpOwogCX0KIAogCXJldHVybiBiaDsKQEAgLTEzMiw4ICsxNTksNyBAQAogICogSWYgdGhhdCBmYWlscywgcmVzdGFydCB0aGUgdHJhbnNhY3Rpb24gJiByZWdhaW4gd3JpdGUgYWNjZXNzIGZvciB0aGUKICAqIGJ1ZmZlciBoZWFkIHdoaWNoIGlzIHVzZWQgZm9yIGJsb2NrX2JpdG1hcCBtb2RpZmljYXRpb25zLgogICovCi1zdGF0aWMgaW50IGV4dGVuZF9vcl9yZXN0YXJ0X3RyYW5zYWN0aW9uKGhhbmRsZV90ICpoYW5kbGUsIGludCB0aHJlc2gsCi0JCQkJCSBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoKQorc3RhdGljIGludCBleHRlbmRfb3JfcmVzdGFydF90cmFuc2FjdGlvbihoYW5kbGVfdCAqaGFuZGxlLCBpbnQgdGhyZXNoKQogewogCWludCBlcnI7CiAKQEAgLTE0NCw5ICsxNzAsOCBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCWlmIChlcnIpIHsKLQkJaWYgKChlcnIgPSBleHQ0X2pvdXJuYWxfcmVzdGFydChoYW5kbGUsIEVYVDRfTUFYX1RSQU5TX0RBVEEpKSkKLQkJCXJldHVybiBlcnI7Ci0JCWlmICgoZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBiaCkpKQorCQllcnIgPSBleHQ0X2pvdXJuYWxfcmVzdGFydChoYW5kbGUsIEVYVDRfTUFYX1RSQU5TX0RBVEEpOworCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAl9CiAKQEAgLTE4MSwyMSArMjA2LDcgQEAKIAlpZiAoSVNfRVJSKGhhbmRsZSkpCiAJCXJldHVybiBQVFJfRVJSKGhhbmRsZSk7CiAKLQltdXRleF9sb2NrKCZzYmktPnNfcmVzaXplX2xvY2spOwotCWlmIChpbnB1dC0+Z3JvdXAgIT0gc2JpLT5zX2dyb3Vwc19jb3VudCkgewotCQllcnIgPSAtRUJVU1k7Ci0JCWdvdG8gZXhpdF9qb3VybmFsOwotCX0KLQotCWlmIChJU19FUlIoYmggPSBiY2xlYW4oaGFuZGxlLCBzYiwgaW5wdXQtPmJsb2NrX2JpdG1hcCkpKSB7Ci0JCWVyciA9IFBUUl9FUlIoYmgpOwotCQlnb3RvIGV4aXRfam91cm5hbDsKLQl9Ci0KLQlpZiAoZXh0NF9iZ19oYXNfc3VwZXIoc2IsIGlucHV0LT5ncm91cCkpIHsKLQkJZXh0NF9kZWJ1ZygibWFyayBiYWNrdXAgc3VwZXJibG9jayAlIzA0bGx4ICgrMClcbiIsIHN0YXJ0KTsKLQkJZXh0NF9zZXRfYml0KDAsIGJoLT5iX2RhdGEpOwotCX0KKwlCVUdfT04oaW5wdXQtPmdyb3VwICE9IHNiaS0+c19ncm91cHNfY291bnQpOwogCiAJLyogQ29weSBhbGwgb2YgdGhlIEdEVCBibG9ja3MgaW50byB0aGUgYmFja3VwIGluIHRoaXMgZ3JvdXAgKi8KIAlmb3IgKGkgPSAwLCBiaXQgPSAxLCBibG9jayA9IHN0YXJ0ICsgMTsKQEAgLTIwMywyOSArMjE0LDI2IEBACiAJCXN0cnVjdCBidWZmZXJfaGVhZCAqZ2RiOwogCiAJCWV4dDRfZGVidWcoInVwZGF0ZSBiYWNrdXAgZ3JvdXAgJSMwNGxseCAoKyVkKVxuIiwgYmxvY2ssIGJpdCk7Ci0KLQkJaWYgKChlcnIgPSBleHRlbmRfb3JfcmVzdGFydF90cmFuc2FjdGlvbihoYW5kbGUsIDEsIGJoKSkpCi0JCQlnb3RvIGV4aXRfYmg7CisJCWVyciA9IGV4dGVuZF9vcl9yZXN0YXJ0X3RyYW5zYWN0aW9uKGhhbmRsZSwgMSk7CisJCWlmIChlcnIpCisJCQlnb3RvIGV4aXRfam91cm5hbDsKIAogCQlnZGIgPSBzYl9nZXRibGsoc2IsIGJsb2NrKTsKIAkJaWYgKCFnZGIpIHsKIAkJCWVyciA9IC1FSU87Ci0JCQlnb3RvIGV4aXRfYmg7CisJCQlnb3RvIGV4aXRfam91cm5hbDsKIAkJfQogCQlpZiAoKGVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgZ2RiKSkpIHsKIAkJCWJyZWxzZShnZGIpOwotCQkJZ290byBleGl0X2JoOworCQkJZ290byBleGl0X2pvdXJuYWw7CiAJCX0KLQkJbG9ja19idWZmZXIoZ2RiKTsKIAkJbWVtY3B5KGdkYi0+Yl9kYXRhLCBzYmktPnNfZ3JvdXBfZGVzY1tpXS0+Yl9kYXRhLCBnZGItPmJfc2l6ZSk7CiAJCXNldF9idWZmZXJfdXB0b2RhdGUoZ2RiKTsKLQkJdW5sb2NrX2J1ZmZlcihnZGIpOwogCQllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGdkYik7CiAJCWlmICh1bmxpa2VseShlcnIpKSB7CiAJCQlicmVsc2UoZ2RiKTsKLQkJCWdvdG8gZXhpdF9iaDsKKwkJCWdvdG8gZXhpdF9qb3VybmFsOwogCQl9Ci0JCWV4dDRfc2V0X2JpdChiaXQsIGJoLT5iX2RhdGEpOwogCQlicmVsc2UoZ2RiKTsKIAl9CiAKQEAgLTIzNSw5ICsyNDMsMjIgQEAKIAllcnIgPSBzYl9pc3N1ZV96ZXJvb3V0KHNiLCBnZGJsb2NrcyArIHN0YXJ0ICsgMSwgcmVzZXJ2ZWRfZ2RiLAogCQkJICAgICAgIEdGUF9OT0ZTKTsKIAlpZiAoZXJyKQotCQlnb3RvIGV4aXRfYmg7Ci0JZm9yIChpID0gMCwgYml0ID0gZ2RibG9ja3MgKyAxOyBpIDwgcmVzZXJ2ZWRfZ2RiOyBpKyssIGJpdCsrKQotCQlleHQ0X3NldF9iaXQoYml0LCBiaC0+Yl9kYXRhKTsKKwkJZ290byBleGl0X2pvdXJuYWw7CisKKwllcnIgPSBleHRlbmRfb3JfcmVzdGFydF90cmFuc2FjdGlvbihoYW5kbGUsIDIpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdF9qb3VybmFsOworCisJYmggPSBiY2xlYW4oaGFuZGxlLCBzYiwgaW5wdXQtPmJsb2NrX2JpdG1hcCk7CisJaWYgKElTX0VSUihiaCkpIHsKKwkJZXJyID0gUFRSX0VSUihiaCk7CisJCWdvdG8gZXhpdF9qb3VybmFsOworCX0KKworCWlmIChleHQ0X2JnX2hhc19zdXBlcihzYiwgaW5wdXQtPmdyb3VwKSkgeworCQlleHQ0X2RlYnVnKCJtYXJrIGJhY2t1cCBncm91cCB0YWJsZXMgJSMwNGxseCAoKzApXG4iLCBzdGFydCk7CisJCWV4dDRfc2V0X2JpdHMoYmgtPmJfZGF0YSwgMCwgZ2RibG9ja3MgKyByZXNlcnZlZF9nZGIgKyAxKTsKKwl9CiAKIAlleHQ0X2RlYnVnKCJtYXJrIGJsb2NrIGJpdG1hcCAlIzA0bGx4ICgrJWxsdSlcbiIsIGlucHV0LT5ibG9ja19iaXRtYXAsCiAJCSAgIGlucHV0LT5ibG9ja19iaXRtYXAgLSBzdGFydCk7CkBAIC0yNTMsMTIgKzI3NCw5IEBACiAJZXJyID0gc2JfaXNzdWVfemVyb291dChzYiwgYmxvY2ssIHNiaS0+c19pdGJfcGVyX2dyb3VwLCBHRlBfTk9GUyk7CiAJaWYgKGVycikKIAkJZ290byBleGl0X2JoOwotCWZvciAoaSA9IDAsIGJpdCA9IGlucHV0LT5pbm9kZV90YWJsZSAtIHN0YXJ0OwotCSAgICAgaSA8IHNiaS0+c19pdGJfcGVyX2dyb3VwOyBpKyssIGJpdCsrKQotCQlleHQ0X3NldF9iaXQoYml0LCBiaC0+Yl9kYXRhKTsKKwlleHQ0X3NldF9iaXRzKGJoLT5iX2RhdGEsIGlucHV0LT5pbm9kZV90YWJsZSAtIHN0YXJ0LAorCQkgICAgICBzYmktPnNfaXRiX3Blcl9ncm91cCk7CiAKLQlpZiAoKGVyciA9IGV4dGVuZF9vcl9yZXN0YXJ0X3RyYW5zYWN0aW9uKGhhbmRsZSwgMiwgYmgpKSkKLQkJZ290byBleGl0X2JoOwogCiAJZXh0NF9tYXJrX2JpdG1hcF9lbmQoaW5wdXQtPmJsb2Nrc19jb3VudCwgc2ItPnNfYmxvY2tzaXplICogOCwKIAkJCSAgICAgYmgtPmJfZGF0YSk7CkBAIC0yODUsNyArMzAzLDYgQEAKIAlicmVsc2UoYmgpOwogCiBleGl0X2pvdXJuYWw6Ci0JbXV0ZXhfdW5sb2NrKCZzYmktPnNfcmVzaXplX2xvY2spOwogCWlmICgoZXJyMiA9IGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSkpICYmICFlcnIpCiAJCWVyciA9IGVycjI7CiAKQEAgLTM3NywxNSArMzk0LDE1IEBACiAgKiBmYWlsIG9uY2Ugd2Ugc3RhcnQgbW9kaWZ5aW5nIHRoZSBkYXRhIG9uIGRpc2ssIGJlY2F1c2UgSkJEIGhhcyBubyByb2xsYmFjay4KICAqLwogc3RhdGljIGludCBhZGRfbmV3X2dkYihoYW5kbGVfdCAqaGFuZGxlLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQkgICAgICAgc3RydWN0IGV4dDRfbmV3X2dyb3VwX2RhdGEgKmlucHV0LAotCQkgICAgICAgc3RydWN0IGJ1ZmZlcl9oZWFkICoqcHJpbWFyeSkKKwkJICAgICAgIGV4dDRfZ3JvdXBfdCBncm91cCkKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CiAJc3RydWN0IGV4dDRfc3VwZXJfYmxvY2sgKmVzID0gRVhUNF9TQihzYiktPnNfZXM7Ci0JdW5zaWduZWQgbG9uZyBnZGJfbnVtID0gaW5wdXQtPmdyb3VwIC8gRVhUNF9ERVNDX1BFUl9CTE9DSyhzYik7CisJdW5zaWduZWQgbG9uZyBnZGJfbnVtID0gZ3JvdXAgLyBFWFQ0X0RFU0NfUEVSX0JMT0NLKHNiKTsKIAlleHQ0X2ZzYmxrX3QgZ2RibG9jayA9IEVYVDRfU0Ioc2IpLT5zX3NiaC0+Yl9ibG9ja25yICsgMSArIGdkYl9udW07CiAJc3RydWN0IGJ1ZmZlcl9oZWFkICoqb19ncm91cF9kZXNjLCAqKm5fZ3JvdXBfZGVzYzsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmRpbmQ7CisJc3RydWN0IGJ1ZmZlcl9oZWFkICpnZGJfYmg7CiAJaW50IGdkYmFja3VwczsKIAlzdHJ1Y3QgZXh0NF9pbG9jIGlsb2M7CiAJX19sZTMyICpkYXRhOwpAQCAtNDA4LDExICs0MjUsMTIgQEAKIAkJcmV0dXJuIC1FUEVSTTsKIAl9CiAKLQkqcHJpbWFyeSA9IHNiX2JyZWFkKHNiLCBnZGJsb2NrKTsKLQlpZiAoISpwcmltYXJ5KQorCWdkYl9iaCA9IHNiX2JyZWFkKHNiLCBnZGJsb2NrKTsKKwlpZiAoIWdkYl9iaCkKIAkJcmV0dXJuIC1FSU87CiAKLQlpZiAoKGdkYmFja3VwcyA9IHZlcmlmeV9yZXNlcnZlZF9nZGIoc2IsICpwcmltYXJ5KSkgPCAwKSB7CisJZ2RiYWNrdXBzID0gdmVyaWZ5X3Jlc2VydmVkX2dkYihzYiwgZ2RiX2JoKTsKKwlpZiAoZ2RiYWNrdXBzIDwgMCkgewogCQllcnIgPSBnZGJhY2t1cHM7CiAJCWdvdG8gZXhpdF9iaDsKIAl9CkBAIC00MjcsNyArNDQ1LDcgQEAKIAlkYXRhID0gKF9fbGUzMiAqKWRpbmQtPmJfZGF0YTsKIAlpZiAobGUzMl90b19jcHUoZGF0YVtnZGJfbnVtICUgRVhUNF9BRERSX1BFUl9CTE9DSyhzYildKSAhPSBnZGJsb2NrKSB7CiAJCWV4dDRfd2FybmluZyhzYiwgIm5ldyBncm91cCAldSBHRFQgYmxvY2sgJWxsdSBub3QgcmVzZXJ2ZWQiLAotCQkJICAgICBpbnB1dC0+Z3JvdXAsIGdkYmxvY2spOworCQkJICAgICBncm91cCwgZ2RibG9jayk7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gZXhpdF9kaW5kOwogCX0KQEAgLTQzNiw3ICs0NTQsNyBAQAogCWlmICh1bmxpa2VseShlcnIpKQogCQlnb3RvIGV4aXRfZGluZDsKIAotCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgKnByaW1hcnkpOworCWVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwgZ2RiX2JoKTsKIAlpZiAodW5saWtlbHkoZXJyKSkKIAkJZ290byBleGl0X3NiaDsKIApAQCAtNDQ5LDEyICs0NjcsMTMgQEAKIAlpZiAodW5saWtlbHkoZXJyKSkKIAkJZ290byBleGl0X2RpbmRqOwogCi0Jbl9ncm91cF9kZXNjID0ga21hbGxvYygoZ2RiX251bSArIDEpICogc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwKLQkJCUdGUF9OT0ZTKTsKKwluX2dyb3VwX2Rlc2MgPSBleHQ0X2t2bWFsbG9jKChnZGJfbnVtICsgMSkgKgorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBidWZmZXJfaGVhZCAqKSwKKwkJCQkgICAgIEdGUF9OT0ZTKTsKIAlpZiAoIW5fZ3JvdXBfZGVzYykgewogCQllcnIgPSAtRU5PTUVNOwotCQlleHQ0X3dhcm5pbmcoc2IsCi0JCQkgICAgICAibm90IGVub3VnaCBtZW1vcnkgZm9yICVsdSBncm91cHMiLCBnZGJfbnVtICsgMSk7CisJCWV4dDRfd2FybmluZyhzYiwgIm5vdCBlbm91Z2ggbWVtb3J5IGZvciAlbHUgZ3JvdXBzIiwKKwkJCSAgICAgZ2RiX251bSArIDEpOwogCQlnb3RvIGV4aXRfaW5vZGU7CiAJfQogCkBAIC00NzUsOCArNDk0LDggQEAKIAl9CiAJaW5vZGUtPmlfYmxvY2tzIC09IChnZGJhY2t1cHMgKyAxKSAqIHNiLT5zX2Jsb2Nrc2l6ZSA+PiA5OwogCWV4dDRfbWFya19pbG9jX2RpcnR5KGhhbmRsZSwgaW5vZGUsICZpbG9jKTsKLQltZW1zZXQoKCpwcmltYXJ5KS0+Yl9kYXRhLCAwLCBzYi0+c19ibG9ja3NpemUpOwotCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgKnByaW1hcnkpOworCW1lbXNldChnZGJfYmgtPmJfZGF0YSwgMCwgc2ItPnNfYmxvY2tzaXplKTsKKwllcnIgPSBleHQ0X2hhbmRsZV9kaXJ0eV9tZXRhZGF0YShoYW5kbGUsIE5VTEwsIGdkYl9iaCk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKIAkJZXh0NF9zdGRfZXJyb3Ioc2IsIGVycik7CiAJCWdvdG8gZXhpdF9pbm9kZTsKQEAgLTQ4NiwxMCArNTA1LDEwIEBACiAJb19ncm91cF9kZXNjID0gRVhUNF9TQihzYiktPnNfZ3JvdXBfZGVzYzsKIAltZW1jcHkobl9ncm91cF9kZXNjLCBvX2dyb3VwX2Rlc2MsCiAJICAgICAgIEVYVDRfU0Ioc2IpLT5zX2dkYl9jb3VudCAqIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKikpOwotCW5fZ3JvdXBfZGVzY1tnZGJfbnVtXSA9ICpwcmltYXJ5OworCW5fZ3JvdXBfZGVzY1tnZGJfbnVtXSA9IGdkYl9iaDsKIAlFWFQ0X1NCKHNiKS0+c19ncm91cF9kZXNjID0gbl9ncm91cF9kZXNjOwogCUVYVDRfU0Ioc2IpLT5zX2dkYl9jb3VudCsrOwotCWtmcmVlKG9fZ3JvdXBfZGVzYyk7CisJZXh0NF9rdmZyZWUob19ncm91cF9kZXNjKTsKIAogCWxlMTZfYWRkX2NwdSgmZXMtPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrcywgLTEpOwogCWVyciA9IGV4dDRfaGFuZGxlX2RpcnR5X21ldGFkYXRhKGhhbmRsZSwgTlVMTCwgRVhUNF9TQihzYiktPnNfc2JoKTsKQEAgLTQ5OSw2ICs1MTgsNyBAQAogCXJldHVybiBlcnI7CiAKIGV4aXRfaW5vZGU6CisJZXh0NF9rdmZyZWUobl9ncm91cF9kZXNjKTsKIAkvKiBleHQ0X2hhbmRsZV9yZWxlYXNlX2J1ZmZlcihoYW5kbGUsIGlsb2MuYmgpOyAqLwogCWJyZWxzZShpbG9jLmJoKTsKIGV4aXRfZGluZGo6CkBAIC01MDgsNyArNTI4LDcgQEAKIGV4aXRfZGluZDoKIAlicmVsc2UoZGluZCk7CiBleGl0X2JoOgotCWJyZWxzZSgqcHJpbWFyeSk7CisJYnJlbHNlKGdkYl9iaCk7CiAKIAlleHQ0X2RlYnVnKCJsZWF2aW5nIHdpdGggZXJyb3IgJWRcbiIsIGVycik7CiAJcmV0dXJuIGVycjsKQEAgLTUyOCw3ICs1NDgsNyBAQAogICogYmFja3VwIEdEVCBibG9ja3MgYXJlIHN0b3JlZCBpbiB0aGVpciByZXNlcnZlZCBwcmltYXJ5IEdEVCBibG9jay4KICAqLwogc3RhdGljIGludCByZXNlcnZlX2JhY2t1cF9nZGIoaGFuZGxlX3QgKmhhbmRsZSwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCSAgICAgIHN0cnVjdCBleHQ0X25ld19ncm91cF9kYXRhICppbnB1dCkKKwkJCSAgICAgIGV4dDRfZ3JvdXBfdCBncm91cCkKIHsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gaW5vZGUtPmlfc2I7CiAJaW50IHJlc2VydmVkX2dkYiA9bGUxNl90b19jcHUoRVhUNF9TQihzYiktPnNfZXMtPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2Nrcyk7CkBAIC01OTksNyArNjE5LDcgQEAKIAkgKiBGaW5hbGx5IHdlIGNhbiBhZGQgZWFjaCBvZiB0aGUgcmVzZXJ2ZWQgYmFja3VwIEdEVCBibG9ja3MgZnJvbQogCSAqIHRoZSBuZXcgZ3JvdXAgdG8gaXRzIHJlc2VydmVkIHByaW1hcnkgR0RUIGJsb2NrLgogCSAqLwotCWJsayA9IGlucHV0LT5ncm91cCAqIEVYVDRfQkxPQ0tTX1BFUl9HUk9VUChzYik7CisJYmxrID0gZ3JvdXAgKiBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpOwogCWZvciAoaSA9IDA7IGkgPCByZXNlcnZlZF9nZGI7IGkrKykgewogCQlpbnQgZXJyMjsKIAkJZGF0YSA9IChfX2xlMzIgKilwcmltYXJ5W2ldLT5iX2RhdGE7CkBAIC03OTksMTMgKzgxOSw2IEBACiAJCWdvdG8gZXhpdF9wdXQ7CiAJfQogCi0JbXV0ZXhfbG9jaygmc2JpLT5zX3Jlc2l6ZV9sb2NrKTsKLQlpZiAoaW5wdXQtPmdyb3VwICE9IHNiaS0+c19ncm91cHNfY291bnQpIHsKLQkJZXh0NF93YXJuaW5nKHNiLCAibXVsdGlwbGUgcmVzaXplcnMgcnVuIG9uIGZpbGVzeXN0ZW0hIik7Ci0JCWVyciA9IC1FQlVTWTsKLQkJZ290byBleGl0X2pvdXJuYWw7Ci0JfQotCiAJaWYgKChlcnIgPSBleHQ0X2pvdXJuYWxfZ2V0X3dyaXRlX2FjY2VzcyhoYW5kbGUsIHNiaS0+c19zYmgpKSkKIAkJZ290byBleGl0X2pvdXJuYWw7CiAKQEAgLTgyMCwxNiArODMzLDI1IEBACiAJCWlmICgoZXJyID0gZXh0NF9qb3VybmFsX2dldF93cml0ZV9hY2Nlc3MoaGFuZGxlLCBwcmltYXJ5KSkpCiAJCQlnb3RvIGV4aXRfam91cm5hbDsKIAotCQlpZiAocmVzZXJ2ZWRfZ2RiICYmIGV4dDRfYmdfbnVtX2dkYihzYiwgaW5wdXQtPmdyb3VwKSAmJgotCQkgICAgKGVyciA9IHJlc2VydmVfYmFja3VwX2dkYihoYW5kbGUsIGlub2RlLCBpbnB1dCkpKQorCQlpZiAocmVzZXJ2ZWRfZ2RiICYmIGV4dDRfYmdfbnVtX2dkYihzYiwgaW5wdXQtPmdyb3VwKSkgeworCQkJZXJyID0gcmVzZXJ2ZV9iYWNrdXBfZ2RiKGhhbmRsZSwgaW5vZGUsIGlucHV0LT5ncm91cCk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gZXhpdF9qb3VybmFsOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogTm90ZSB0aGF0IHdlIGNhbiBhY2Nlc3MgbmV3IGdyb3VwIGRlc2NyaXB0b3IgYmxvY2sgc2FmZWx5CisJCSAqIG9ubHkgaWYgYWRkX25ld19nZGIoKSBzdWNjZWVkcy4KKwkJICovCisJCWVyciA9IGFkZF9uZXdfZ2RiKGhhbmRsZSwgaW5vZGUsIGlucHV0LT5ncm91cCk7CisJCWlmIChlcnIpCiAJCQlnb3RvIGV4aXRfam91cm5hbDsKLQl9IGVsc2UgaWYgKChlcnIgPSBhZGRfbmV3X2dkYihoYW5kbGUsIGlub2RlLCBpbnB1dCwgJnByaW1hcnkpKSkKLQkJZ290byBleGl0X2pvdXJuYWw7CisJCXByaW1hcnkgPSBzYmktPnNfZ3JvdXBfZGVzY1tnZGJfbnVtXTsKKwl9CiAKICAgICAgICAgLyoKICAgICAgICAgICogT0ssIG5vdyB3ZSd2ZSBzZXQgdXAgdGhlIG5ldyBncm91cC4gIFRpbWUgdG8gbWFrZSBpdCBhY3RpdmUuCiAgICAgICAgICAqCi0gICAgICAgICAqIFdlIGRvIG5vdCBsb2NrIGFsbCBhbGxvY2F0aW9ucyB2aWEgc19yZXNpemVfbG9jawogICAgICAgICAgKiBzbyB3ZSBoYXZlIHRvIGJlIHNhZmUgd3J0LiBjb25jdXJyZW50IGFjY2Vzc2VzIHRoZSBncm91cAogICAgICAgICAgKiBkYXRhLiAgU28gd2UgbmVlZCB0byBiZSBjYXJlZnVsIHRvIHNldCBhbGwgb2YgdGhlIHJlbGV2YW50CiAgICAgICAgICAqIGdyb3VwIGRlc2NyaXB0b3IgZGF0YSBldGMuICpiZWZvcmUqIHdlIGVuYWJsZSB0aGUgZ3JvdXAuCkBAIC04ODYsMTMgKzkwOCw5IEBACiAJICoKIAkgKiBUaGUgcHJlY2lzZSBydWxlcyB3ZSB1c2UgYXJlOgogCSAqCi0JICogKiBXcml0ZXJzIG9mIHNfZ3JvdXBzX2NvdW50ICptdXN0KiBob2xkIHNfcmVzaXplX2xvY2sKLQkgKiBBTkQKIAkgKiAqIFdyaXRlcnMgbXVzdCBwZXJmb3JtIGEgc21wX3dtYigpIGFmdGVyIHVwZGF0aW5nIGFsbCBkZXBlbmRlbnQKIAkgKiAgIGRhdGEgYW5kIGJlZm9yZSBtb2RpZnlpbmcgdGhlIGdyb3VwcyBjb3VudAogCSAqCi0JICogKiBSZWFkZXJzIG11c3QgaG9sZCBzX3Jlc2l6ZV9sb2NrIG92ZXIgdGhlIGFjY2VzcwotCSAqIE9SCiAJICogKiBSZWFkZXJzIG11c3QgcGVyZm9ybSBhbiBzbXBfcm1iKCkgYWZ0ZXIgcmVhZGluZyB0aGUgZ3JvdXBzIGNvdW50CiAJICogICBhbmQgYmVmb3JlIHJlYWRpbmcgYW55IGRlcGVuZGVudCBkYXRhLgogCSAqCkBAIC05MzcsMTAgKzk1NSw5IEBACiAJZXh0NF9oYW5kbGVfZGlydHlfc3VwZXIoaGFuZGxlLCBzYik7CiAKIGV4aXRfam91cm5hbDoKLQltdXRleF91bmxvY2soJnNiaS0+c19yZXNpemVfbG9jayk7CiAJaWYgKChlcnIyID0gZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKSkgJiYgIWVycikKIAkJZXJyID0gZXJyMjsKLQlpZiAoIWVycikgeworCWlmICghZXJyICYmIHByaW1hcnkpIHsKIAkJdXBkYXRlX2JhY2t1cHMoc2IsIHNiaS0+c19zYmgtPmJfYmxvY2tuciwgKGNoYXIgKillcywKIAkJCSAgICAgICBzaXplb2Yoc3RydWN0IGV4dDRfc3VwZXJfYmxvY2spKTsKIAkJdXBkYXRlX2JhY2t1cHMoc2IsIHByaW1hcnktPmJfYmxvY2tuciwgcHJpbWFyeS0+Yl9kYXRhLApAQCAtOTY5LDE2ICs5ODYsMTMgQEAKIAlleHQ0X2dycGJsa190IGFkZDsKIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogCWhhbmRsZV90ICpoYW5kbGU7Ci0JaW50IGVycjsKKwlpbnQgZXJyLCBlcnIyOwogCWV4dDRfZ3JvdXBfdCBncm91cDsKIAotCS8qIFdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgbG9ja2luZyB3cnQgb3RoZXIgcmVzaXplcnMganVzdAotCSAqIHlldDogd2UncmUgZ29pbmcgdG8gcmV2YWxpZGF0ZSBlcy0+c19ibG9ja3NfY291bnQgYWZ0ZXIKLQkgKiB0YWtpbmcgdGhlIHNfcmVzaXplX2xvY2sgYmVsb3cuICovCiAJb19ibG9ja3NfY291bnQgPSBleHQ0X2Jsb2Nrc19jb3VudChlcyk7CiAKIAlpZiAodGVzdF9vcHQoc2IsIERFQlVHKSkKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkVYVDQtZnM6IGV4dGVuZGluZyBsYXN0IGdyb3VwIGZyb20gJWxsdSB1dG8gJWxsdSBibG9ja3NcbiIsCisJCXByaW50ayhLRVJOX0RFQlVHICJFWFQ0LWZzOiBleHRlbmRpbmcgbGFzdCBncm91cCBmcm9tICVsbHUgdG8gJWxsdSBibG9ja3NcbiIsCiAJCSAgICAgICBvX2Jsb2Nrc19jb3VudCwgbl9ibG9ja3NfY291bnQpOwogCiAJaWYgKG5fYmxvY2tzX2NvdW50ID09IDAgfHwgbl9ibG9ja3NfY291bnQgPT0gb19ibG9ja3NfY291bnQpCkBAIC05OTUsNyArMTAwOSw3IEBACiAKIAlpZiAobl9ibG9ja3NfY291bnQgPCBvX2Jsb2Nrc19jb3VudCkgewogCQlleHQ0X3dhcm5pbmcoc2IsICJjYW4ndCBzaHJpbmsgRlMgLSByZXNpemUgYWJvcnRlZCIpOwotCQlyZXR1cm4gLUVCVVNZOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAkvKiBIYW5kbGUgdGhlIHJlbWFpbmluZyBibG9ja3MgaW4gdGhlIGxhc3QgZ3JvdXAgb25seS4gKi8KQEAgLTEwMzgsMzIgKzEwNTIsMjUgQEAKIAkJZ290byBleGl0X3B1dDsKIAl9CiAKLQltdXRleF9sb2NrKCZFWFQ0X1NCKHNiKS0+c19yZXNpemVfbG9jayk7Ci0JaWYgKG9fYmxvY2tzX2NvdW50ICE9IGV4dDRfYmxvY2tzX2NvdW50KGVzKSkgewotCQlleHQ0X3dhcm5pbmcoc2IsICJtdWx0aXBsZSByZXNpemVycyBydW4gb24gZmlsZXN5c3RlbSEiKTsKLQkJbXV0ZXhfdW5sb2NrKCZFWFQ0X1NCKHNiKS0+c19yZXNpemVfbG9jayk7Ci0JCWV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7Ci0JCWVyciA9IC1FQlVTWTsKLQkJZ290byBleGl0X3B1dDsKLQl9Ci0KIAlpZiAoKGVyciA9IGV4dDRfam91cm5hbF9nZXRfd3JpdGVfYWNjZXNzKGhhbmRsZSwKIAkJCQkJCSBFWFQ0X1NCKHNiKS0+c19zYmgpKSkgewogCQlleHQ0X3dhcm5pbmcoc2IsICJlcnJvciAlZCBvbiBqb3VybmFsIHdyaXRlIGFjY2VzcyIsIGVycik7Ci0JCW11dGV4X3VubG9jaygmRVhUNF9TQihzYiktPnNfcmVzaXplX2xvY2spOwogCQlleHQ0X2pvdXJuYWxfc3RvcChoYW5kbGUpOwogCQlnb3RvIGV4aXRfcHV0OwogCX0KIAlleHQ0X2Jsb2Nrc19jb3VudF9zZXQoZXMsIG9fYmxvY2tzX2NvdW50ICsgYWRkKTsKLQltdXRleF91bmxvY2soJkVYVDRfU0Ioc2IpLT5zX3Jlc2l6ZV9sb2NrKTsKIAlleHQ0X2RlYnVnKCJmcmVlaW5nIGJsb2NrcyAlbGx1IHRocm91Z2ggJWxsdVxuIiwgb19ibG9ja3NfY291bnQsCiAJCSAgIG9fYmxvY2tzX2NvdW50ICsgYWRkKTsKIAkvKiBXZSBhZGQgdGhlIGJsb2NrcyB0byB0aGUgYml0bWFwIGFuZCBzZXQgdGhlIGdyb3VwIG5lZWQgaW5pdCBiaXQgKi8KLQlleHQ0X2FkZF9ncm91cGJsb2NrcyhoYW5kbGUsIHNiLCBvX2Jsb2Nrc19jb3VudCwgYWRkKTsKKwllcnIgPSBleHQ0X2dyb3VwX2FkZF9ibG9ja3MoaGFuZGxlLCBzYiwgb19ibG9ja3NfY291bnQsIGFkZCk7CiAJZXh0NF9oYW5kbGVfZGlydHlfc3VwZXIoaGFuZGxlLCBzYik7CiAJZXh0NF9kZWJ1ZygiZnJlZWQgYmxvY2tzICVsbHUgdGhyb3VnaCAlbGx1XG4iLCBvX2Jsb2Nrc19jb3VudCwKIAkJICAgb19ibG9ja3NfY291bnQgKyBhZGQpOwotCWlmICgoZXJyID0gZXh0NF9qb3VybmFsX3N0b3AoaGFuZGxlKSkpCisJZXJyMiA9IGV4dDRfam91cm5hbF9zdG9wKGhhbmRsZSk7CisJaWYgKCFlcnIgJiYgZXJyMikKKwkJZXJyID0gZXJyMjsKKworCWlmIChlcnIpCiAJCWdvdG8gZXhpdF9wdXQ7CiAKIAlpZiAodGVzdF9vcHQoc2IsIERFQlVHKSkKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvc3VwZXIuYyBiL2ZzL2V4dDQvc3VwZXIuYwppbmRleCA5ZWE3MWFhLi40Njg3ZmVhIDEwMDY0NAotLS0gYS9mcy9leHQ0L3N1cGVyLmMKKysrIGIvZnMvZXh0NC9zdXBlci5jCkBAIC0xMTAsNiArMTEwLDM1IEBACiAjZGVmaW5lIElTX0VYVDNfU0Ioc2IpICgwKQogI2VuZGlmCiAKK3ZvaWQgKmV4dDRfa3ZtYWxsb2Moc2l6ZV90IHNpemUsIGdmcF90IGZsYWdzKQoreworCXZvaWQgKnJldDsKKworCXJldCA9IGttYWxsb2Moc2l6ZSwgZmxhZ3MpOworCWlmICghcmV0KQorCQlyZXQgPSBfX3ZtYWxsb2Moc2l6ZSwgZmxhZ3MsIFBBR0VfS0VSTkVMKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkICpleHQ0X2t2emFsbG9jKHNpemVfdCBzaXplLCBnZnBfdCBmbGFncykKK3sKKwl2b2lkICpyZXQ7CisKKwlyZXQgPSBremFsbG9jKHNpemUsIGZsYWdzKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gX192bWFsbG9jKHNpemUsIGZsYWdzIHwgX19HRlBfWkVSTywgUEFHRV9LRVJORUwpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgZXh0NF9rdmZyZWUodm9pZCAqcHRyKQoreworCWlmIChpc192bWFsbG9jX2FkZHIocHRyKSkKKwkJdmZyZWUocHRyKTsKKwllbHNlCisJCWtmcmVlKHB0cik7CisKK30KKwogZXh0NF9mc2Jsa190IGV4dDRfYmxvY2tfYml0bWFwKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCiAJCQkgICAgICAgc3RydWN0IGV4dDRfZ3JvdXBfZGVzYyAqYmcpCiB7CkBAIC0yNjksNiArMjk4LDcgQEAKIAlqb3VybmFsX3QgKmpvdXJuYWw7CiAJaGFuZGxlX3QgICpoYW5kbGU7CiAKKwl0cmFjZV9leHQ0X2pvdXJuYWxfc3RhcnQoc2IsIG5ibG9ja3MsIF9SRVRfSVBfKTsKIAlpZiAoc2ItPnNfZmxhZ3MgJiBNU19SRE9OTFkpCiAJCXJldHVybiBFUlJfUFRSKC1FUk9GUyk7CiAKQEAgLTc4OSwxMSArODE5LDggQEAKIAogCWZvciAoaSA9IDA7IGkgPCBzYmktPnNfZ2RiX2NvdW50OyBpKyspCiAJCWJyZWxzZShzYmktPnNfZ3JvdXBfZGVzY1tpXSk7Ci0Ja2ZyZWUoc2JpLT5zX2dyb3VwX2Rlc2MpOwotCWlmIChpc192bWFsbG9jX2FkZHIoc2JpLT5zX2ZsZXhfZ3JvdXBzKSkKLQkJdmZyZWUoc2JpLT5zX2ZsZXhfZ3JvdXBzKTsKLQllbHNlCi0JCWtmcmVlKHNiaS0+c19mbGV4X2dyb3Vwcyk7CisJZXh0NF9rdmZyZWUoc2JpLT5zX2dyb3VwX2Rlc2MpOworCWV4dDRfa3ZmcmVlKHNiaS0+c19mbGV4X2dyb3Vwcyk7CiAJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2ZyZWVibG9ja3NfY291bnRlcik7CiAJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2ZyZWVpbm9kZXNfY291bnRlcik7CiAJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmc2JpLT5zX2RpcnNfY291bnRlcik7CkBAIC0xOTc2LDE1ICsyMDAzLDExIEBACiAJCQkoKGxlMTZfdG9fY3B1KHNiaS0+c19lcy0+c19yZXNlcnZlZF9nZHRfYmxvY2tzKSArIDEpIDw8CiAJCQkgICAgICBFWFQ0X0RFU0NfUEVSX0JMT0NLX0JJVFMoc2IpKSkgLyBncm91cHNfcGVyX2ZsZXg7CiAJc2l6ZSA9IGZsZXhfZ3JvdXBfY291bnQgKiBzaXplb2Yoc3RydWN0IGZsZXhfZ3JvdXBzKTsKLQlzYmktPnNfZmxleF9ncm91cHMgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCXNiaS0+c19mbGV4X2dyb3VwcyA9IGV4dDRfa3Z6YWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHNiaS0+c19mbGV4X2dyb3VwcyA9PSBOVUxMKSB7Ci0JCXNiaS0+c19mbGV4X2dyb3VwcyA9IHZ6YWxsb2Moc2l6ZSk7Ci0JCWlmIChzYmktPnNfZmxleF9ncm91cHMgPT0gTlVMTCkgewotCQkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLAotCQkJCSAibm90IGVub3VnaCBtZW1vcnkgZm9yICV1IGZsZXggZ3JvdXBzIiwKLQkJCQkgZmxleF9ncm91cF9jb3VudCk7Ci0JCQlnb3RvIGZhaWxlZDsKLQkJfQorCQlleHQ0X21zZyhzYiwgS0VSTl9FUlIsICJub3QgZW5vdWdoIG1lbW9yeSBmb3IgJXUgZmxleCBncm91cHMiLAorCQkJIGZsZXhfZ3JvdXBfY291bnQpOworCQlnb3RvIGZhaWxlZDsKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgc2JpLT5zX2dyb3Vwc19jb3VudDsgaSsrKSB7CkBAIC0yMzgzLDE3ICsyNDA2LDI1IEBACiAJdW5zaWduZWQgbG9uZyBzdHJpZGUgPSBsZTE2X3RvX2NwdShzYmktPnNfZXMtPnNfcmFpZF9zdHJpZGUpOwogCXVuc2lnbmVkIGxvbmcgc3RyaXBlX3dpZHRoID0KIAkJCWxlMzJfdG9fY3B1KHNiaS0+c19lcy0+c19yYWlkX3N0cmlwZV93aWR0aCk7CisJaW50IHJldDsKIAogCWlmIChzYmktPnNfc3RyaXBlICYmIHNiaS0+c19zdHJpcGUgPD0gc2JpLT5zX2Jsb2Nrc19wZXJfZ3JvdXApCi0JCXJldHVybiBzYmktPnNfc3RyaXBlOworCQlyZXQgPSBzYmktPnNfc3RyaXBlOworCWVsc2UgaWYgKHN0cmlwZV93aWR0aCA8PSBzYmktPnNfYmxvY2tzX3Blcl9ncm91cCkKKwkJcmV0ID0gc3RyaXBlX3dpZHRoOworCWVsc2UgaWYgKHN0cmlkZSA8PSBzYmktPnNfYmxvY2tzX3Blcl9ncm91cCkKKwkJcmV0ID0gc3RyaWRlOworCWVsc2UKKwkJcmV0ID0gMDsKIAotCWlmIChzdHJpcGVfd2lkdGggPD0gc2JpLT5zX2Jsb2Nrc19wZXJfZ3JvdXApCi0JCXJldHVybiBzdHJpcGVfd2lkdGg7CisJLyoKKwkgKiBJZiB0aGUgc3RyaXBlIHdpZHRoIGlzIDEsIHRoaXMgbWFrZXMgbm8gc2Vuc2UgYW5kCisJICogd2Ugc2V0IGl0IHRvIDAgdG8gdHVybiBvZmYgc3RyaXBlIGhhbmRsaW5nIGNvZGUuCisJICovCisJaWYgKHJldCA8PSAxKQorCQlyZXQgPSAwOwogCi0JaWYgKHN0cmlkZSA8PSBzYmktPnNfYmxvY2tzX3Blcl9ncm91cCkKLQkJcmV0dXJuIHN0cmlkZTsKLQotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIC8qIHN5c2ZzIHN1cHBydCAqLwpAQCAtMzQwOCw4ICszNDM5LDkgQEAKIAkJCShFWFQ0X01BWF9CTE9DS19GSUxFX1BIWVMgLyBFWFQ0X0JMT0NLU19QRVJfR1JPVVAoc2IpKSk7CiAJZGJfY291bnQgPSAoc2JpLT5zX2dyb3Vwc19jb3VudCArIEVYVDRfREVTQ19QRVJfQkxPQ0soc2IpIC0gMSkgLwogCQkgICBFWFQ0X0RFU0NfUEVSX0JMT0NLKHNiKTsKLQlzYmktPnNfZ3JvdXBfZGVzYyA9IGttYWxsb2MoZGJfY291bnQgKiBzaXplb2Yoc3RydWN0IGJ1ZmZlcl9oZWFkICopLAotCQkJCSAgICBHRlBfS0VSTkVMKTsKKwlzYmktPnNfZ3JvdXBfZGVzYyA9IGV4dDRfa3ZtYWxsb2MoZGJfY291bnQgKgorCQkJCQkgIHNpemVvZihzdHJ1Y3QgYnVmZmVyX2hlYWQgKiksCisJCQkJCSAgR0ZQX0tFUk5FTCk7CiAJaWYgKHNiaS0+c19ncm91cF9kZXNjID09IE5VTEwpIHsKIAkJZXh0NF9tc2coc2IsIEtFUk5fRVJSLCAibm90IGVub3VnaCBtZW1vcnkiKTsKIAkJZ290byBmYWlsZWRfbW91bnQ7CkBAIC0zNDkxLDcgKzM1MjMsNyBAQAogCiAJSU5JVF9MSVNUX0hFQUQoJnNiaS0+c19vcnBoYW4pOyAvKiB1bmxpbmtlZCBidXQgb3BlbiBmaWxlcyAqLwogCW11dGV4X2luaXQoJnNiaS0+c19vcnBoYW5fbG9jayk7Ci0JbXV0ZXhfaW5pdCgmc2JpLT5zX3Jlc2l6ZV9sb2NrKTsKKwlzYmktPnNfcmVzaXplX2ZsYWdzID0gMDsKIAogCXNiLT5zX3Jvb3QgPSBOVUxMOwogCkBAIC0zNzQxLDEyICszNzczLDggQEAKIAl9CiBmYWlsZWRfbW91bnQzOgogCWRlbF90aW1lcigmc2JpLT5zX2Vycl9yZXBvcnQpOwotCWlmIChzYmktPnNfZmxleF9ncm91cHMpIHsKLQkJaWYgKGlzX3ZtYWxsb2NfYWRkcihzYmktPnNfZmxleF9ncm91cHMpKQotCQkJdmZyZWUoc2JpLT5zX2ZsZXhfZ3JvdXBzKTsKLQkJZWxzZQotCQkJa2ZyZWUoc2JpLT5zX2ZsZXhfZ3JvdXBzKTsKLQl9CisJaWYgKHNiaS0+c19mbGV4X2dyb3VwcykKKwkJZXh0NF9rdmZyZWUoc2JpLT5zX2ZsZXhfZ3JvdXBzKTsKIAlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZnJlZWJsb2Nrc19jb3VudGVyKTsKIAlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZnJlZWlub2Rlc19jb3VudGVyKTsKIAlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZzYmktPnNfZGlyc19jb3VudGVyKTsKQEAgLTM3NTYsNyArMzc4NCw3IEBACiBmYWlsZWRfbW91bnQyOgogCWZvciAoaSA9IDA7IGkgPCBkYl9jb3VudDsgaSsrKQogCQlicmVsc2Uoc2JpLT5zX2dyb3VwX2Rlc2NbaV0pOwotCWtmcmVlKHNiaS0+c19ncm91cF9kZXNjKTsKKwlleHQ0X2t2ZnJlZShzYmktPnNfZ3JvdXBfZGVzYyk7CiBmYWlsZWRfbW91bnQ6CiAJaWYgKHNiaS0+c19wcm9jKSB7CiAJCXJlbW92ZV9wcm9jX2VudHJ5KHNiLT5zX2lkLCBleHQ0X3Byb2Nfcm9vdCk7CmRpZmYgLS1naXQgYS9mcy9leHQ0L3RydW5jYXRlLmggYi9mcy9leHQ0L3RydW5jYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDExYmE2NgotLS0gL2Rldi9udWxsCisrKyBiL2ZzL2V4dDQvdHJ1bmNhdGUuaApAQCAtMCwwICsxLDQzIEBACisvKgorICogbGludXgvZnMvZXh0NC90cnVuY2F0ZS5oCisgKgorICogQ29tbW9uIGlubGluZSBmdW5jdGlvbnMgbmVlZGVkIGZvciB0cnVuY2F0ZSBzdXBwb3J0CisgKi8KKworLyoKKyAqIFRydW5jYXRlIGJsb2NrcyB0aGF0IHdlcmUgbm90IHVzZWQgYnkgd3JpdGUuIFdlIGhhdmUgdG8gdHJ1bmNhdGUgdGhlCisgKiBwYWdlY2FjaGUgYXMgd2VsbCBzbyB0aGF0IGNvcnJlc3BvbmRpbmcgYnVmZmVycyBnZXQgcHJvcGVybHkgdW5tYXBwZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBleHQ0X3RydW5jYXRlX2ZhaWxlZF93cml0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQoreworCXRydW5jYXRlX2lub2RlX3BhZ2VzKGlub2RlLT5pX21hcHBpbmcsIGlub2RlLT5pX3NpemUpOworCWV4dDRfdHJ1bmNhdGUoaW5vZGUpOworfQorCisvKgorICogV29yayBvdXQgaG93IG1hbnkgYmxvY2tzIHdlIG5lZWQgdG8gcHJvY2VlZCB3aXRoIHRoZSBuZXh0IGNodW5rIG9mIGEKKyAqIHRydW5jYXRlIHRyYW5zYWN0aW9uLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZXh0NF9ibG9ja3NfZm9yX3RydW5jYXRlKHN0cnVjdCBpbm9kZSAqaW5vZGUpCit7CisJZXh0NF9sYmxrX3QgbmVlZGVkOworCisJbmVlZGVkID0gaW5vZGUtPmlfYmxvY2tzID4+IChpbm9kZS0+aV9zYi0+c19ibG9ja3NpemVfYml0cyAtIDkpOworCisJLyogR2l2ZSBvdXJzZWx2ZXMganVzdCBlbm91Z2ggcm9vbSB0byBjb3BlIHdpdGggaW5vZGVzIGluIHdoaWNoCisJICogaV9ibG9ja3MgaXMgY29ycnVwdDogd2UndmUgc2VlbiBkaXNrIGNvcnJ1cHRpb25zIGluIHRoZSBwYXN0CisJICogd2hpY2ggcmVzdWx0ZWQgaW4gcmFuZG9tIGRhdGEgaW4gYW4gaW5vZGUgd2hpY2ggbG9va2VkIGVub3VnaAorCSAqIGxpa2UgYSByZWd1bGFyIGZpbGUgZm9yIGV4dDQgdG8gdHJ5IHRvIGRlbGV0ZSBpdC4gIFRoaW5ncworCSAqIHdpbGwgZ28gYSBiaXQgY3JhenkgaWYgdGhhdCBoYXBwZW5zLCBidXQgYXQgbGVhc3Qgd2Ugc2hvdWxkCisJICogdHJ5IG5vdCB0byBwYW5pYyB0aGUgd2hvbGUga2VybmVsLiAqLworCWlmIChuZWVkZWQgPCAyKQorCQluZWVkZWQgPSAyOworCisJLyogQnV0IHdlIG5lZWQgdG8gYm91bmQgdGhlIHRyYW5zYWN0aW9uIHNvIHdlIGRvbid0IG92ZXJmbG93IHRoZQorCSAqIGpvdXJuYWwuICovCisJaWYgKG5lZWRlZCA+IEVYVDRfTUFYX1RSQU5TX0RBVEEpCisJCW5lZWRlZCA9IEVYVDRfTUFYX1RSQU5TX0RBVEE7CisKKwlyZXR1cm4gRVhUNF9EQVRBX1RSQU5TX0JMT0NLUyhpbm9kZS0+aV9zYikgKyBuZWVkZWQ7Cit9CisKZGlmZiAtLWdpdCBhL2ZzL2ZzLXdyaXRlYmFjay5jIGIvZnMvZnMtd3JpdGViYWNrLmMKaW5kZXggMTU5OWFhOS4uMDRjZjNiOSAxMDA2NDQKLS0tIGEvZnMvZnMtd3JpdGViYWNrLmMKKysrIGIvZnMvZnMtd3JpdGViYWNrLmMKQEAgLTYxOCw3ICs2MTgsMTIgQEAKIAkJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGlub2RlLT5pX3NiOwogCiAJCWlmICghZ3JhYl9zdXBlcl9wYXNzaXZlKHNiKSkgewotCQkJcmVxdWV1ZV9pbyhpbm9kZSwgd2IpOworCQkJLyoKKwkJCSAqIGdyYWJfc3VwZXJfcGFzc2l2ZSgpIG1heSBmYWlsIGNvbnNpc3RlbnRseSBkdWUgdG8KKwkJCSAqIHNfdW1vdW50IGJlaW5nIGdyYWJiZWQgYnkgc29tZW9uZSBlbHNlLiBEb24ndCB1c2UKKwkJCSAqIHJlcXVldWVfaW8oKSB0byBhdm9pZCBidXN5IHJldHJ5aW5nIHRoZSBpbm9kZS9zYi4KKwkJCSAqLworCQkJcmVkaXJ0eV90YWlsKGlub2RlLCB3Yik7CiAJCQljb250aW51ZTsKIAkJfQogCQl3cm90ZSArPSB3cml0ZWJhY2tfc2JfaW5vZGVzKHNiLCB3Yiwgd29yayk7CmRpZmYgLS1naXQgYS9mcy9nZW5lcmljX2FjbC5jIGIvZnMvZ2VuZXJpY19hY2wuYwppbmRleCBkNWUzM2EwLi5kMGRkZGFjIDEwMDY0NAotLS0gYS9mcy9nZW5lcmljX2FjbC5jCisrKyBiL2ZzL2dlbmVyaWNfYWNsLmMKQEAgLTgyLDE4ICs4MiwxNCBAQAogCQkJcmV0dXJuIFBUUl9FUlIoYWNsKTsKIAl9CiAJaWYgKGFjbCkgewotCQltb2RlX3QgbW9kZTsKLQogCQllcnJvciA9IHBvc2l4X2FjbF92YWxpZChhY2wpOwogCQlpZiAoZXJyb3IpCiAJCQlnb3RvIGZhaWxlZDsKIAkJc3dpdGNoICh0eXBlKSB7CiAJCWNhc2UgQUNMX1RZUEVfQUNDRVNTOgotCQkJbW9kZSA9IGlub2RlLT5pX21vZGU7Ci0JCQllcnJvciA9IHBvc2l4X2FjbF9lcXVpdl9tb2RlKGFjbCwgJm1vZGUpOworCQkJZXJyb3IgPSBwb3NpeF9hY2xfZXF1aXZfbW9kZShhY2wsICZpbm9kZS0+aV9tb2RlKTsKIAkJCWlmIChlcnJvciA8IDApCiAJCQkJZ290byBmYWlsZWQ7Ci0JCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKIAkJCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCQkJaWYgKGVycm9yID09IDApIHsKIAkJCQlwb3NpeF9hY2xfcmVsZWFzZShhY2wpOwpAQCAtMTI1LDIxICsxMjEsMjAgQEAKIGdlbmVyaWNfYWNsX2luaXQoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlub2RlICpkaXIpCiB7CiAJc3RydWN0IHBvc2l4X2FjbCAqYWNsID0gTlVMTDsKLQltb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7CiAJaW50IGVycm9yOwogCi0JaW5vZGUtPmlfbW9kZSA9IG1vZGUgJiB+Y3VycmVudF91bWFzaygpOwogCWlmICghU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKIAkJYWNsID0gZ2V0X2NhY2hlZF9hY2woZGlyLCBBQ0xfVFlQRV9ERUZBVUxUKTsKIAlpZiAoYWNsKSB7CiAJCWlmIChTX0lTRElSKGlub2RlLT5pX21vZGUpKQogCQkJc2V0X2NhY2hlZF9hY2woaW5vZGUsIEFDTF9UWVBFX0RFRkFVTFQsIGFjbCk7Ci0JCWVycm9yID0gcG9zaXhfYWNsX2NyZWF0ZSgmYWNsLCBHRlBfS0VSTkVMLCAmbW9kZSk7CisJCWVycm9yID0gcG9zaXhfYWNsX2NyZWF0ZSgmYWNsLCBHRlBfS0VSTkVMLCAmaW5vZGUtPmlfbW9kZSk7CiAJCWlmIChlcnJvciA8IDApCiAJCQlyZXR1cm4gZXJyb3I7Ci0JCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCQlpZiAoZXJyb3IgPiAwKQogCQkJc2V0X2NhY2hlZF9hY2woaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgYWNsKTsKKwl9IGVsc2UgeworCQlpbm9kZS0+aV9tb2RlICY9IH5jdXJyZW50X3VtYXNrKCk7CiAJfQogCWVycm9yID0gMDsKIApkaWZmIC0tZ2l0IGEvZnMvZ2ZzMi9hY2wuYyBiL2ZzL2dmczIvYWNsLmMKaW5kZXggODg0YzlhZi4uMzQ1MDFiNiAxMDA2NDQKLS0tIGEvZnMvZ2ZzMi9hY2wuYworKysgYi9mcy9nZnMyL2FjbC5jCkBAIC03Miw3ICs3Miw3IEBACiAJcmV0dXJuIGdmczJfYWNsX2dldChHRlMyX0koaW5vZGUpLCB0eXBlKTsKIH0KIAotc3RhdGljIGludCBnZnMyX3NldF9tb2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIG1vZGVfdCBtb2RlKQorc3RhdGljIGludCBnZnMyX3NldF9tb2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVtb2RlX3QgbW9kZSkKIHsKIAlpbnQgZXJyb3IgPSAwOwogCkBAIC0xMTcsNyArMTE3LDcgQEAKIHsKIAlzdHJ1Y3QgZ2ZzMl9zYmQgKnNkcCA9IEdGUzJfU0IoJmRpcC0+aV9pbm9kZSk7CiAJc3RydWN0IHBvc2l4X2FjbCAqYWNsOwotCW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKKwl1bW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOwogCWludCBlcnJvciA9IDA7CiAKIAlpZiAoIXNkcC0+c2RfYXJncy5hcl9wb3NpeF9hY2wpCkBAIC0yNzYsNyArMjc2LDcgQEAKIAkJZ290byBvdXRfcmVsZWFzZTsKIAogCWlmICh0eXBlID09IEFDTF9UWVBFX0FDQ0VTUykgewotCQltb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7CisJCXVtb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7CiAJCWVycm9yID0gcG9zaXhfYWNsX2VxdWl2X21vZGUoYWNsLCAmbW9kZSk7CiAKIAkJaWYgKGVycm9yIDw9IDApIHsKZGlmZiAtLWdpdCBhL2ZzL2hwcGZzL2hwcGZzLmMgYi9mcy9ocHBmcy9ocHBmcy5jCmluZGV4IDg2MzViZTUuLjk3MGVhOTggMTAwNjQ0Ci0tLSBhL2ZzL2hwcGZzL2hwcGZzLmMKKysrIGIvZnMvaHBwZnMvaHBwZnMuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3N0YXRmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcGlkX25hbWVzcGFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlICJvcy5oIgogCmRpZmYgLS1naXQgYS9mcy9pbm9kZS5jIGIvZnMvaW5vZGUuYwppbmRleCBkMGM3MmZmLi41YWFiODBkIDEwMDY0NAotLS0gYS9mcy9pbm9kZS5jCisrKyBiL2ZzL2lub2RlLmMKQEAgLTM5OSwxMiArMzk5LDEyIEBACiBFWFBPUlRfU1lNQk9MKF9faW5zZXJ0X2lub2RlX2hhc2gpOwogCiAvKioKLSAqCXJlbW92ZV9pbm9kZV9oYXNoIC0gcmVtb3ZlIGFuIGlub2RlIGZyb20gdGhlIGhhc2gKKyAqCV9fcmVtb3ZlX2lub2RlX2hhc2ggLSByZW1vdmUgYW4gaW5vZGUgZnJvbSB0aGUgaGFzaAogICoJQGlub2RlOiBpbm9kZSB0byB1bmhhc2gKICAqCiAgKglSZW1vdmUgYW4gaW5vZGUgZnJvbSB0aGUgc3VwZXJibG9jay4KICAqLwotdm9pZCByZW1vdmVfaW5vZGVfaGFzaChzdHJ1Y3QgaW5vZGUgKmlub2RlKQordm9pZCBfX3JlbW92ZV9pbm9kZV9oYXNoKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJc3Bpbl9sb2NrKCZpbm9kZV9oYXNoX2xvY2spOwogCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CkBAIC00MTIsNyArNDEyLDcgQEAKIAlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CiAJc3Bpbl91bmxvY2soJmlub2RlX2hhc2hfbG9jayk7CiB9Ci1FWFBPUlRfU1lNQk9MKHJlbW92ZV9pbm9kZV9oYXNoKTsKK0VYUE9SVF9TWU1CT0woX19yZW1vdmVfaW5vZGVfaGFzaCk7CiAKIHZvaWQgZW5kX3dyaXRlYmFjayhzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewpAQCAtNDU0LDcgKzQ1NCw5IEBACiAJQlVHX09OKCEoaW5vZGUtPmlfc3RhdGUgJiBJX0ZSRUVJTkcpKTsKIAlCVUdfT04oIWxpc3RfZW1wdHkoJmlub2RlLT5pX2xydSkpOwogCi0JaW5vZGVfd2JfbGlzdF9kZWwoaW5vZGUpOworCWlmICghbGlzdF9lbXB0eSgmaW5vZGUtPmlfd2JfbGlzdCkpCisJCWlub2RlX3diX2xpc3RfZGVsKGlub2RlKTsKKwogCWlub2RlX3NiX2xpc3RfZGVsKGlub2RlKTsKIAogCWlmIChvcC0+ZXZpY3RfaW5vZGUpIHsKQEAgLTEzMjgsNyArMTMzMCw4IEBACiAJfQogCiAJaW5vZGUtPmlfc3RhdGUgfD0gSV9GUkVFSU5HOwotCWlub2RlX2xydV9saXN0X2RlbChpbm9kZSk7CisJaWYgKCFsaXN0X2VtcHR5KCZpbm9kZS0+aV9scnUpKQorCQlpbm9kZV9scnVfbGlzdF9kZWwoaW5vZGUpOwogCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIAogCWV2aWN0KGlub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL2piZDIvY2hlY2twb2ludC5jIGIvZnMvamJkMi9jaGVja3BvaW50LmMKaW5kZXggMmM2MmM1YS4uMTZhNjk4YiAxMDA2NDQKLS0tIGEvZnMvamJkMi9jaGVja3BvaW50LmMKKysrIGIvZnMvamJkMi9jaGVja3BvaW50LmMKQEAgLTI1Nyw5ICsyNTcsMTIgQEAKIF9fZmx1c2hfYmF0Y2goam91cm5hbF90ICpqb3VybmFsLCBpbnQgKmJhdGNoX2NvdW50KQogewogCWludCBpOworCXN0cnVjdCBibGtfcGx1ZyBwbHVnOwogCisJYmxrX3N0YXJ0X3BsdWcoJnBsdWcpOwogCWZvciAoaSA9IDA7IGkgPCAqYmF0Y2hfY291bnQ7IGkrKykKLQkJd3JpdGVfZGlydHlfYnVmZmVyKGpvdXJuYWwtPmpfY2hrcHRfYmhzW2ldLCBXUklURSk7CisJCXdyaXRlX2RpcnR5X2J1ZmZlcihqb3VybmFsLT5qX2Noa3B0X2Joc1tpXSwgV1JJVEVfU1lOQyk7CisJYmxrX2ZpbmlzaF9wbHVnKCZwbHVnKTsKIAogCWZvciAoaSA9IDA7IGkgPCAqYmF0Y2hfY291bnQ7IGkrKykgewogCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoID0gam91cm5hbC0+al9jaGtwdF9iaHNbaV07CmRpZmYgLS1naXQgYS9mcy9qYmQyL2pvdXJuYWwuYyBiL2ZzL2piZDIvam91cm5hbC5jCmluZGV4IDBkZmE1YjU5Li5mMjRkZjEzIDEwMDY0NAotLS0gYS9mcy9qYmQyL2pvdXJuYWwuYworKysgYi9mcy9qYmQyL2pvdXJuYWwuYwpAQCAtMjM5MCw3MyArMjM5MCw2IEBACiAJamJkMl9qb3VybmFsX2Rlc3Ryb3lfY2FjaGVzKCk7CiB9CiAKLS8qIAotICogamJkMl9kZXZfdG9fbmFtZSBpcyBhIHV0aWxpdHkgZnVuY3Rpb24gdXNlZCBieSB0aGUgamJkMiBhbmQgZXh0NCAKLSAqIHRyYWNpbmcgaW5mcmFzdHJ1Y3R1cmUgdG8gbWFwIGEgZGV2X3QgdG8gYSBkZXZpY2UgbmFtZS4KLSAqCi0gKiBUaGUgY2FsbGVyIHNob3VsZCB1c2UgcmN1X3JlYWRfbG9jaygpIGluIG9yZGVyIHRvIG1ha2Ugc3VyZSB0aGUKLSAqIGRldmljZSBuYW1lIHN0YXlzIHZhbGlkIHVudGlsIGl0cyBkb25lIHdpdGggaXQuICBXZSB1c2UKLSAqIHJjdV9yZWFkX2xvY2soKSBhcyB3ZWxsIHRvIG1ha2Ugc3VyZSB3ZSdyZSBzYWZlIGluIGNhc2UgdGhlIGNhbGxlcgotICogZ2V0cyBzbG9wcHksIGFuZCBiZWNhdXNlIHJjdV9yZWFkX2xvY2soKSBpcyBjaGVhcCBhbmQgY2FuIGJlIHNhZmVseQotICogbmVzdGVkLgotICovCi1zdHJ1Y3QgZGV2bmFtZV9jYWNoZSB7Ci0Jc3RydWN0IHJjdV9oZWFkCXJjdTsKLQlkZXZfdAkJZGV2aWNlOwotCWNoYXIJCWRldm5hbWVbQkRFVk5BTUVfU0laRV07Ci19OwotI2RlZmluZSBDQUNIRV9TSVpFX0JJVFMgNgotc3RhdGljIHN0cnVjdCBkZXZuYW1lX2NhY2hlICpkZXZjYWNoZVsxIDw8IENBQ0hFX1NJWkVfQklUU107Ci1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRldm5hbWVfY2FjaGVfbG9jayk7Ci0KLXN0YXRpYyB2b2lkIGZyZWVfZGV2Y2FjaGUoc3RydWN0IHJjdV9oZWFkICpyY3UpCi17Ci0Ja2ZyZWUocmN1KTsKLX0KLQotY29uc3QgY2hhciAqamJkMl9kZXZfdG9fbmFtZShkZXZfdCBkZXZpY2UpCi17Ci0JaW50CWkgPSBoYXNoXzMyKGRldmljZSwgQ0FDSEVfU0laRV9CSVRTKTsKLQljaGFyCSpyZXQ7Ci0Jc3RydWN0IGJsb2NrX2RldmljZSAqYmQ7Ci0Jc3RhdGljIHN0cnVjdCBkZXZuYW1lX2NhY2hlICpuZXdfZGV2OwotCi0JcmN1X3JlYWRfbG9jaygpOwotCWlmIChkZXZjYWNoZVtpXSAmJiBkZXZjYWNoZVtpXS0+ZGV2aWNlID09IGRldmljZSkgewotCQlyZXQgPSBkZXZjYWNoZVtpXS0+ZGV2bmFtZTsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JbmV3X2RldiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBkZXZuYW1lX2NhY2hlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFuZXdfZGV2KQotCQlyZXR1cm4gIk5PREVWLUFMTE9DRkFJTFVSRSI7IC8qIFNvbWV0aGluZyBub24tTlVMTCAqLwotCWJkID0gYmRnZXQoZGV2aWNlKTsKLQlzcGluX2xvY2soJmRldm5hbWVfY2FjaGVfbG9jayk7Ci0JaWYgKGRldmNhY2hlW2ldKSB7Ci0JCWlmIChkZXZjYWNoZVtpXS0+ZGV2aWNlID09IGRldmljZSkgewotCQkJa2ZyZWUobmV3X2Rldik7Ci0JCQliZHB1dChiZCk7Ci0JCQlyZXQgPSBkZXZjYWNoZVtpXS0+ZGV2bmFtZTsKLQkJCXNwaW5fdW5sb2NrKCZkZXZuYW1lX2NhY2hlX2xvY2spOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCQljYWxsX3JjdSgmZGV2Y2FjaGVbaV0tPnJjdSwgZnJlZV9kZXZjYWNoZSk7Ci0JfQotCWRldmNhY2hlW2ldID0gbmV3X2RldjsKLQlkZXZjYWNoZVtpXS0+ZGV2aWNlID0gZGV2aWNlOwotCWlmIChiZCkgewotCQliZGV2bmFtZShiZCwgZGV2Y2FjaGVbaV0tPmRldm5hbWUpOwotCQliZHB1dChiZCk7Ci0JfSBlbHNlCi0JCV9fYmRldm5hbWUoZGV2aWNlLCBkZXZjYWNoZVtpXS0+ZGV2bmFtZSk7Ci0JcmV0ID0gZGV2Y2FjaGVbaV0tPmRldm5hbWU7Ci0Jc3Bpbl91bmxvY2soJmRldm5hbWVfY2FjaGVfbG9jayk7Ci0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0woamJkMl9kZXZfdG9fbmFtZSk7Ci0KIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIG1vZHVsZV9pbml0KGpvdXJuYWxfaW5pdCk7CiBtb2R1bGVfZXhpdChqb3VybmFsX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvYWNsLmMgYi9mcy9qZmZzMi9hY2wuYwppbmRleCAyN2M1MTFhLi45MjZkMDIwIDEwMDY0NAotLS0gYS9mcy9qZmZzMi9hY2wuYworKysgYi9mcy9qZmZzMi9hY2wuYwpAQCAtMjI3LDcgKzIyNyw3IEBACiAJY2FzZSBBQ0xfVFlQRV9BQ0NFU1M6CiAJCXhwcmVmaXggPSBKRkZTMl9YUFJFRklYX0FDTF9BQ0NFU1M7CiAJCWlmIChhY2wpIHsKLQkJCW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKKwkJCXVtb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7CiAJCQlyYyA9IHBvc2l4X2FjbF9lcXVpdl9tb2RlKGFjbCwgJm1vZGUpOwogCQkJaWYgKHJjIDwgMCkKIAkJCQlyZXR1cm4gcmM7CkBAIC0yNTksNyArMjU5LDcgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLWludCBqZmZzMl9pbml0X2FjbF9wcmUoc3RydWN0IGlub2RlICpkaXJfaSwgc3RydWN0IGlub2RlICppbm9kZSwgbW9kZV90ICppX21vZGUpCitpbnQgamZmczJfaW5pdF9hY2xfcHJlKHN0cnVjdCBpbm9kZSAqZGlyX2ksIHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVtb2RlX3QgKmlfbW9kZSkKIHsKIAlzdHJ1Y3QgcG9zaXhfYWNsICphY2w7CiAJaW50IHJjOwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvYWNsLmggYi9mcy9qZmZzMi9hY2wuaAppbmRleCBiMzQyMWM3Li45YjQ3NzI0IDEwMDY0NAotLS0gYS9mcy9qZmZzMi9hY2wuaAorKysgYi9mcy9qZmZzMi9hY2wuaApAQCAtMjgsNyArMjgsNyBAQAogCiBzdHJ1Y3QgcG9zaXhfYWNsICpqZmZzMl9nZXRfYWNsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKTsKIGV4dGVybiBpbnQgamZmczJfYWNsX2NobW9kKHN0cnVjdCBpbm9kZSAqKTsKLWV4dGVybiBpbnQgamZmczJfaW5pdF9hY2xfcHJlKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgaW5vZGUgKiwgbW9kZV90ICopOworZXh0ZXJuIGludCBqZmZzMl9pbml0X2FjbF9wcmUoc3RydWN0IGlub2RlICosIHN0cnVjdCBpbm9kZSAqLCB1bW9kZV90ICopOwogZXh0ZXJuIGludCBqZmZzMl9pbml0X2FjbF9wb3N0KHN0cnVjdCBpbm9kZSAqKTsKIAogZXh0ZXJuIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyIGpmZnMyX2FjbF9hY2Nlc3NfeGF0dHJfaGFuZGxlcjsKZGlmZiAtLWdpdCBhL2ZzL2pmZnMyL2ZzLmMgYi9mcy9qZmZzMi9mcy5jCmluZGV4IGI4MWIzNWQuLmJiY2I5NzUgMTAwNjQ0Ci0tLSBhL2ZzL2pmZnMyL2ZzLmMKKysrIGIvZnMvamZmczIvZnMuYwpAQCAtNDA2LDcgKzQwNiw3IEBACiAKIC8qIGpmZnMyX25ld19pbm9kZTogYWxsb2NhdGUgYSBuZXcgaW5vZGUgYW5kIGlub2NhY2hlLCBhZGQgaXQgdG8gdGhlIGhhc2gsCiAgICBmaWxsIGluIHRoZSByYXdfaW5vZGUgd2hpbGUgeW91J3JlIGF0IGl0LiAqLwotc3RydWN0IGlub2RlICpqZmZzMl9uZXdfaW5vZGUgKHN0cnVjdCBpbm9kZSAqZGlyX2ksIG1vZGVfdCBtb2RlLCBzdHJ1Y3QgamZmczJfcmF3X2lub2RlICpyaSkKK3N0cnVjdCBpbm9kZSAqamZmczJfbmV3X2lub2RlIChzdHJ1Y3QgaW5vZGUgKmRpcl9pLCB1bW9kZV90IG1vZGUsIHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKnJpKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGU7CiAJc3RydWN0IHN1cGVyX2Jsb2NrICpzYiA9IGRpcl9pLT5pX3NiOwpkaWZmIC0tZ2l0IGEvZnMvamZmczIvb3MtbGludXguaCBiL2ZzL2pmZnMyL29zLWxpbnV4LmgKaW5kZXggNTI2OTc5Yy4uNmMxNzU1YyAxMDA2NDQKLS0tIGEvZnMvamZmczIvb3MtbGludXguaAorKysgYi9mcy9qZmZzMi9vcy1saW51eC5oCkBAIC0xNzMsNyArMTczLDcgQEAKIHN0cnVjdCBpbm9kZSAqamZmczJfaWdldChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKiwgdW5zaWduZWQgbG9uZyk7CiB2b2lkIGpmZnMyX2V2aWN0X2lub2RlIChzdHJ1Y3QgaW5vZGUgKik7CiB2b2lkIGpmZnMyX2RpcnR5X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCBmbGFncyk7Ci1zdHJ1Y3QgaW5vZGUgKmpmZnMyX25ld19pbm9kZSAoc3RydWN0IGlub2RlICpkaXJfaSwgbW9kZV90IG1vZGUsCitzdHJ1Y3QgaW5vZGUgKmpmZnMyX25ld19pbm9kZSAoc3RydWN0IGlub2RlICpkaXJfaSwgdW1vZGVfdCBtb2RlLAogCQkJICAgICAgIHN0cnVjdCBqZmZzMl9yYXdfaW5vZGUgKnJpKTsKIGludCBqZmZzMl9zdGF0ZnMgKHN0cnVjdCBkZW50cnkgKiwgc3RydWN0IGtzdGF0ZnMgKik7CiBpbnQgamZmczJfcmVtb3VudF9mcyAoc3RydWN0IHN1cGVyX2Jsb2NrICosIGludCAqLCBjaGFyICopOwpkaWZmIC0tZ2l0IGEvZnMvamZzL2FjbC5jIGIvZnMvamZzL2FjbC5jCmluZGV4IGIzYTMyY2EuLjQ1NTU5ZGMgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy9hY2wuYworKysgYi9mcy9qZnMvYWNsLmMKQEAgLTEyNywxNiArMTI3LDE0IEBACiAJCXJldHVybiBQVFJfRVJSKGFjbCk7CiAKIAlpZiAoYWNsKSB7Ci0JCW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKIAkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKIAkJCXJjID0gamZzX3NldF9hY2wodGlkLCBpbm9kZSwgQUNMX1RZUEVfREVGQVVMVCwgYWNsKTsKIAkJCWlmIChyYykKIAkJCQlnb3RvIGNsZWFudXA7CiAJCX0KLQkJcmMgPSBwb3NpeF9hY2xfY3JlYXRlKCZhY2wsIEdGUF9LRVJORUwsICZtb2RlKTsKKwkJcmMgPSBwb3NpeF9hY2xfY3JlYXRlKCZhY2wsIEdGUF9LRVJORUwsICZpbm9kZS0+aV9tb2RlKTsKIAkJaWYgKHJjIDwgMCkKIAkJCWdvdG8gY2xlYW51cDsgLyogcG9zaXhfYWNsX3JlbGVhc2UoTlVMTCkgaXMgbm8tb3AgKi8KLQkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJCWlmIChyYyA+IDApCiAJCQlyYyA9IGpmc19zZXRfYWNsKHRpZCwgaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgYWNsKTsKIGNsZWFudXA6CmRpZmYgLS1naXQgYS9mcy9qZnMveGF0dHIuYyBiL2ZzL2pmcy94YXR0ci5jCmluZGV4IDI0ODM4ZjEuLmU4N2ZlZGUgMTAwNjQ0Ci0tLSBhL2ZzL2pmcy94YXR0ci5jCisrKyBiL2ZzL2pmcy94YXR0ci5jCkBAIC02OTMsOCArNjkzLDcgQEAKIAkJCXJldHVybiByYzsKIAkJfQogCQlpZiAoYWNsKSB7Ci0JCQltb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7Ci0JCQlyYyA9IHBvc2l4X2FjbF9lcXVpdl9tb2RlKGFjbCwgJm1vZGUpOworCQkJcmMgPSBwb3NpeF9hY2xfZXF1aXZfbW9kZShhY2wsICZpbm9kZS0+aV9tb2RlKTsKIAkJCXBvc2l4X2FjbF9yZWxlYXNlKGFjbCk7CiAJCQlpZiAocmMgPCAwKSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSCkBAIC03MDIsNyArNzAxLDYgQEAKIAkJCQkgICAgICAgcmMpOwogCQkJCXJldHVybiByYzsKIAkJCX0KLQkJCWlub2RlLT5pX21vZGUgPSBtb2RlOwogCQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CiAJCX0KIAkJLyoKZGlmZiAtLWdpdCBhL2ZzL25hbWVpLmMgYi9mcy9uYW1laS5jCmluZGV4IGY4YzY5ZDMuLjNkNjA3YmQgMTAwNjQ0Ci0tLSBhL2ZzL25hbWVpLmMKKysrIGIvZnMvbmFtZWkuYwpAQCAtMTc5LDE5ICsxNzksMTQgQEAKICNpZmRlZiBDT05GSUdfRlNfUE9TSVhfQUNMCiAJc3RydWN0IHBvc2l4X2FjbCAqYWNsOwogCi0JLyoKLQkgKiBVbmRlciBSQ1Ugd2Fsaywgd2UgY2Fubm90IGV2ZW4gZG8gYSAiZ2V0X2NhY2hlZF9hY2woKSIsCi0JICogYmVjYXVzZSB0aGF0IGludm9sdmVzIGxvY2tpbmcgYW5kIGdldHRpbmcgYSByZWZjb3VudCBvbgotCSAqIGEgY2FjaGVkIEFDTC4KLQkgKgotCSAqIFNvIHRoZSBvbmx5IGNhc2Ugd2UgaGFuZGxlIGR1cmluZyBSQ1Ugd2Fsa2luZyBpcyB0aGUKLQkgKiBjYXNlIG9mIGEgY2FjaGVkICJubyBBQ0wgYXQgYWxsIiwgd2hpY2ggbmVlZHMgbm8gbG9ja3MKLQkgKiBvciByZWZjb3VudHMuCi0JICovCiAJaWYgKG1hc2sgJiBNQVlfTk9UX0JMT0NLKSB7Ci0JICAgICAgICBpZiAobmVnYXRpdmVfY2FjaGVkX2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTKSkKKwkJYWNsID0gZ2V0X2NhY2hlZF9hY2xfcmN1KGlub2RlLCBBQ0xfVFlQRV9BQ0NFU1MpOworCSAgICAgICAgaWYgKCFhY2wpCiAJICAgICAgICAgICAgICAgIHJldHVybiAtRUFHQUlOOwotCSAgICAgICAgcmV0dXJuIC1FQ0hJTEQ7CisJCS8qIG5vIC0+Z2V0X2FjbCgpIGNhbGxzIGluIFJDVSBtb2RlLi4uICovCisJCWlmIChhY2wgPT0gQUNMX05PVF9DQUNIRUQpCisJCQlyZXR1cm4gLUVDSElMRDsKKwkgICAgICAgIHJldHVybiBwb3NpeF9hY2xfcGVybWlzc2lvbihpbm9kZSwgYWNsLCBtYXNrKTsKIAl9CiAKIAlhY2wgPSBnZXRfY2FjaGVkX2FjbChpbm9kZSwgQUNMX1RZUEVfQUNDRVNTKTsKQEAgLTcxNiwxOSArNzExLDI1IEBACiAJaWYgKChmbGFncyAmIExPT0tVUF9OT19BVVRPTU9VTlQpICYmICEoZmxhZ3MgJiBMT09LVVBfUEFSRU5UKSkKIAkJcmV0dXJuIC1FSVNESVI7IC8qIHdlIGFjdHVhbGx5IHdhbnQgdG8gc3RvcCBoZXJlICovCiAKLQkvKiBXZSB3YW50IHRvIG1vdW50IGlmIHNvbWVvbmUgaXMgdHJ5aW5nIHRvIG9wZW4vY3JlYXRlIGEgZmlsZSBvZiBhbnkKLQkgKiB0eXBlIHVuZGVyIHRoZSBtb3VudHBvaW50LCB3YW50cyB0byB0cmF2ZXJzZSB0aHJvdWdoIHRoZSBtb3VudHBvaW50Ci0JICogb3Igd2FudHMgdG8gb3BlbiB0aGUgbW91bnRlZCBkaXJlY3RvcnkuCi0JICoKKwkvKgogCSAqIFdlIGRvbid0IHdhbnQgdG8gbW91bnQgaWYgc29tZW9uZSdzIGp1c3QgZG9pbmcgYSBzdGF0IGFuZCB0aGV5J3ZlCiAJICogc2V0IEFUX1NZTUxJTktfTk9GT0xMT1cgLSB1bmxlc3MgdGhleSdyZSBzdGF0J2luZyBhIGRpcmVjdG9yeSBhbmQKIAkgKiBhcHBlbmRlZCBhICcvJyB0byB0aGUgbmFtZS4KIAkgKi8KLQlpZiAoIShmbGFncyAmIExPT0tVUF9GT0xMT1cpICYmCi0JICAgICEoZmxhZ3MgJiAoTE9PS1VQX1BBUkVOVCB8IExPT0tVUF9ESVJFQ1RPUlkgfAotCQkgICAgICAgTE9PS1VQX09QRU4gfCBMT09LVVBfQ1JFQVRFKSkpCi0JCXJldHVybiAtRUlTRElSOwotCisJaWYgKCEoZmxhZ3MgJiBMT09LVVBfRk9MTE9XKSkgeworCQkvKiBXZSBkbywgaG93ZXZlciwgd2FudCB0byBtb3VudCBpZiBzb21lb25lIHdhbnRzIHRvIG9wZW4gb3IKKwkJICogY3JlYXRlIGEgZmlsZSBvZiBhbnkgdHlwZSB1bmRlciB0aGUgbW91bnRwb2ludCwgd2FudHMgdG8KKwkJICogdHJhdmVyc2UgdGhyb3VnaCB0aGUgbW91bnRwb2ludCBvciB3YW50cyB0byBvcGVuIHRoZSBtb3VudGVkCisJCSAqIGRpcmVjdG9yeS4KKwkJICogQWxzbywgYXV0b2ZzIG1heSBtYXJrIG5lZ2F0aXZlIGRlbnRyaWVzIGFzIGJlaW5nIGF1dG9tb3VudAorCQkgKiBwb2ludHMuICBUaGVzZSB3aWxsIG5lZWQgdGhlIGF0dGVudGlvbnMgb2YgdGhlIGRhZW1vbiB0bworCQkgKiBpbnN0YW50aWF0ZSB0aGVtIGJlZm9yZSB0aGV5IGNhbiBiZSB1c2VkLgorCQkgKi8KKwkJaWYgKCEoZmxhZ3MgJiAoTE9PS1VQX1BBUkVOVCB8IExPT0tVUF9ESVJFQ1RPUlkgfAorCQkJICAgICBMT09LVVBfT1BFTiB8IExPT0tVUF9DUkVBVEUpKSAmJgorCQkgICAgcGF0aC0+ZGVudHJ5LT5kX2lub2RlKQorCQkJcmV0dXJuIC1FSVNESVI7CisJfQogCWN1cnJlbnQtPnRvdGFsX2xpbmtfY291bnQrKzsKIAlpZiAoY3VycmVudC0+dG90YWxfbGlua19jb3VudCA+PSA0MCkKIAkJcmV0dXJuIC1FTE9PUDsKZGlmZiAtLWdpdCBhL2ZzL25mcy9LY29uZmlnIGIvZnMvbmZzL0tjb25maWcKaW5kZXggMmNkZTVkOS4uYmUwMjA3NyAxMDA2NDQKLS0tIGEvZnMvbmZzL0tjb25maWcKKysrIGIvZnMvbmZzL0tjb25maWcKQEAgLTc5LDE1ICs3OSwyMSBAQAogCWRlcGVuZHMgb24gTkZTX0ZTICYmIE5GU19WNCAmJiBFWFBFUklNRU5UQUwKIAlzZWxlY3QgU1VOUlBDX0JBQ0tDSEFOTkVMCiAJc2VsZWN0IFBORlNfRklMRV9MQVlPVVQKKwlzZWxlY3QgUE5GU19CTE9DSworCXNlbGVjdCBNRAorCXNlbGVjdCBCTEtfREVWX0RNCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBtaW5vciB2ZXJzaW9uIDEgb2YgdGhlIE5GU3Y0IHByb3RvY29sCi0JICAoUkZDIDU2NjEpIGluIHRoZSBrZXJuZWwncyBORlMgY2xpZW50LgorCSAgKFJGQyA1NjYxIGFuZCBSRkMgNTY2MykgaW4gdGhlIGtlcm5lbCdzIE5GUyBjbGllbnQuCiAKIAkgIElmIHVuc3VyZSwgc2F5IE4uCiAKIGNvbmZpZyBQTkZTX0ZJTEVfTEFZT1VUCiAJdHJpc3RhdGUKIAorY29uZmlnIFBORlNfQkxPQ0sKKwl0cmlzdGF0ZQorCiBjb25maWcgUE5GU19PQkpMQVlPVVQKIAl0cmlzdGF0ZSAiUHJvdmlkZSBzdXBwb3J0IGZvciB0aGUgcE5GUyBPYmplY3RzIExheW91dCBEcml2ZXIgZm9yIE5GU3Y0LjEgcE5GUyAoRVhQRVJJTUVOVEFMKSIKIAlkZXBlbmRzIG9uIE5GU19GUyAmJiBORlNfVjRfMSAmJiBTQ1NJX09TRF9VTEQKZGlmZiAtLWdpdCBhL2ZzL25mcy9NYWtlZmlsZSBiL2ZzL25mcy9NYWtlZmlsZQppbmRleCA2YTM0ZjdkLi5iNTg2MTNkIDEwMDY0NAotLS0gYS9mcy9uZnMvTWFrZWZpbGUKKysrIGIvZnMvbmZzL01ha2VmaWxlCkBAIC0yMywzICsyMyw0IEBACiBuZnNfbGF5b3V0X25mc3Y0MV9maWxlcy15IDo9IG5mczRmaWxlbGF5b3V0Lm8gbmZzNGZpbGVsYXlvdXRkZXYubwogCiBvYmotJChDT05GSUdfUE5GU19PQkpMQVlPVVQpICs9IG9iamxheW91dC8KK29iai0kKENPTkZJR19QTkZTX0JMT0NLKSArPSBibG9ja2xheW91dC8KZGlmZiAtLWdpdCBhL2ZzL25mcy9ibG9ja2xheW91dC9NYWtlZmlsZSBiL2ZzL25mcy9ibG9ja2xheW91dC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTgxNTUwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL2Jsb2NrbGF5b3V0L01ha2VmaWxlCkBAIC0wLDAgKzEsNSBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIHBORlMgYmxvY2sgbGF5b3V0IGRyaXZlciBrZXJuZWwgbW9kdWxlCisjCitvYmotJChDT05GSUdfUE5GU19CTE9DSykgKz0gYmxvY2tsYXlvdXRkcml2ZXIubworYmxvY2tsYXlvdXRkcml2ZXItb2JqcyA6PSBibG9ja2xheW91dC5vIGV4dGVudHMubyBibG9ja2xheW91dGRldi5vIGJsb2NrbGF5b3V0ZG0ubwpkaWZmIC0tZ2l0IGEvZnMvbmZzL2Jsb2NrbGF5b3V0L2Jsb2NrbGF5b3V0LmMgYi9mcy9uZnMvYmxvY2tsYXlvdXQvYmxvY2tsYXlvdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTY1NjRkCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL2Jsb2NrbGF5b3V0L2Jsb2NrbGF5b3V0LmMKQEAgLTAsMCArMSwxMDE5IEBACisvKgorICogIGxpbnV4L2ZzL25mcy9ibG9ja2xheW91dC9ibG9ja2xheW91dC5jCisgKgorICogIE1vZHVsZSBmb3IgdGhlIE5GU3Y0LjEgcE5GUyBibG9jayBsYXlvdXQgZHJpdmVyLgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDYgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4uCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgQW5keSBBZGFtc29uIDxhbmRyb3NAY2l0aS51bWljaC5lZHU+CisgKiAgRnJlZCBJc2FtYW4gPGlpc2FtYW5AdW1pY2guZWR1PgorICoKKyAqIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byB1c2UsIGNvcHksIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIGFuZAorICogcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcyBmb3IgYW55IHB1cnBvc2UsCisgKiBzbyBsb25nIGFzIHRoZSBuYW1lIG9mIHRoZSB1bml2ZXJzaXR5IG9mIG1pY2hpZ2FuIGlzIG5vdCB1c2VkIGluCisgKiBhbnkgYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlIHVzZSBvciBkaXN0cmlidXRpb24KKyAqIG9mIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBhdXRob3JpemF0aW9uLiAgaWYKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIG9yIGFueSBvdGhlciBpZGVudGlmaWNhdGlvbiBvZiB0aGUKKyAqIHVuaXZlcnNpdHkgb2YgbWljaGlnYW4gaXMgaW5jbHVkZWQgaW4gYW55IGNvcHkgb2YgYW55IHBvcnRpb24gb2YKKyAqIHRoaXMgc29mdHdhcmUsIHRoZW4gdGhlIGRpc2NsYWltZXIgYmVsb3cgbXVzdCBhbHNvIGJlIGluY2x1ZGVkLgorICoKKyAqIHRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYXMgaXMsIHdpdGhvdXQgcmVwcmVzZW50YXRpb24gZnJvbSB0aGUKKyAqIHVuaXZlcnNpdHkgb2YgbWljaGlnYW4gYXMgdG8gaXRzIGZpdG5lc3MgZm9yIGFueSBwdXJwb3NlLCBhbmQgd2l0aG91dAorICogd2FycmFudHkgYnkgdGhlIHVuaXZlcnNpdHkgb2YgbWljaGlnYW4gb2YgYW55IGtpbmQsIGVpdGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YKKyAqIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuICB0aGUgcmVnZW50cworICogb2YgdGhlIHVuaXZlcnNpdHkgb2YgbWljaGlnYW4gc2hhbGwgbm90IGJlIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMsCisgKiBpbmNsdWRpbmcgc3BlY2lhbCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKKyAqIHdpdGggcmVzcGVjdCB0byBhbnkgY2xhaW0gYXJpc2luZyBvdXQgb3IgaW4gY29ubmVjdGlvbiB3aXRoIHRoZSB1c2UKKyAqIG9mIHRoZSBzb2Z0d2FyZSwgZXZlbiBpZiBpdCBoYXMgYmVlbiBvciBpcyBoZXJlYWZ0ZXIgYWR2aXNlZCBvZiB0aGUKKyAqIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+CisjaW5jbHVkZSA8bGludXgvbmFtZWkuaD4KKyNpbmNsdWRlIDxsaW51eC9iaW8uaD4JCS8qIHN0cnVjdCBiaW8gKi8KKyNpbmNsdWRlIDxsaW51eC9idWZmZXJfaGVhZC5oPgkvKiB2YXJpb3VzIHdyaXRlIGNhbGxzICovCisKKyNpbmNsdWRlICJibG9ja2xheW91dC5oIgorCisjZGVmaW5lIE5GU0RCR19GQUNJTElUWQlORlNEQkdfUE5GU19MRAorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJBbmR5IEFkYW1zb24gPGFuZHJvc0BjaXRpLnVtaWNoLmVkdT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiVGhlIE5GU3Y0LjEgcE5GUyBCbG9jayBsYXlvdXQgZHJpdmVyIik7CisKK3N0cnVjdCBkZW50cnkgKmJsX2RldmljZV9waXBlOword2FpdF9xdWV1ZV9oZWFkX3QgYmxfd3E7CisKK3N0YXRpYyB2b2lkIHByaW50X3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJZHByaW50aygiUFJJTlRQQUdFIHBhZ2UgJXBcbiIsIHBhZ2UpOworCWRwcmludGsoIglQYWdlUHJpdmF0ZSAlZFxuIiwgUGFnZVByaXZhdGUocGFnZSkpOworCWRwcmludGsoIglQYWdlVXB0b2RhdGUgJWRcbiIsIFBhZ2VVcHRvZGF0ZShwYWdlKSk7CisJZHByaW50aygiCVBhZ2VFcnJvciAlZFxuIiwgUGFnZUVycm9yKHBhZ2UpKTsKKwlkcHJpbnRrKCIJUGFnZURpcnR5ICVkXG4iLCBQYWdlRGlydHkocGFnZSkpOworCWRwcmludGsoIglQYWdlUmVmZXJlbmNlZCAlZFxuIiwgUGFnZVJlZmVyZW5jZWQocGFnZSkpOworCWRwcmludGsoIglQYWdlTG9ja2VkICVkXG4iLCBQYWdlTG9ja2VkKHBhZ2UpKTsKKwlkcHJpbnRrKCIJUGFnZVdyaXRlYmFjayAlZFxuIiwgUGFnZVdyaXRlYmFjayhwYWdlKSk7CisJZHByaW50aygiCVBhZ2VNYXBwZWRUb0Rpc2sgJWRcbiIsIFBhZ2VNYXBwZWRUb0Rpc2socGFnZSkpOworCWRwcmludGsoIlxuIik7Cit9CisKKy8qIEdpdmVuIHRoZSBiZSBhc3NvY2lhdGVkIHdpdGggaXNlY3QsIGRldGVybWluZSBpZiBwYWdlIGRhdGEgbmVlZHMgdG8gYmUKKyAqIGluaXRpYWxpemVkLgorICovCitzdGF0aWMgaW50IGlzX2hvbGUoc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50ICpiZSwgc2VjdG9yX3QgaXNlY3QpCit7CisJaWYgKGJlLT5iZV9zdGF0ZSA9PSBQTkZTX0JMT0NLX05PTkVfREFUQSkKKwkJcmV0dXJuIDE7CisJZWxzZSBpZiAoYmUtPmJlX3N0YXRlICE9IFBORlNfQkxPQ0tfSU5WQUxJRF9EQVRBKQorCQlyZXR1cm4gMDsKKwllbHNlCisJCXJldHVybiAhYmxfaXNfc2VjdG9yX2luaXQoYmUtPmJlX2ludmFsLCBpc2VjdCk7Cit9CisKKy8qIEdpdmVuIHRoZSBiZSBhc3NvY2lhdGVkIHdpdGggaXNlY3QsIGRldGVybWluZSBpZiBwYWdlIGRhdGEgY2FuIGJlCisgKiB3cml0dGVuIHRvIGRpc2suCisgKi8KK3N0YXRpYyBpbnQgaXNfd3JpdGFibGUoc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50ICpiZSwgc2VjdG9yX3QgaXNlY3QpCit7CisJcmV0dXJuIChiZS0+YmVfc3RhdGUgPT0gUE5GU19CTE9DS19SRUFEV1JJVEVfREFUQSB8fAorCQliZS0+YmVfc3RhdGUgPT0gUE5GU19CTE9DS19JTlZBTElEX0RBVEEpOworfQorCisvKiBUaGUgZGF0YSB3ZSBhcmUgaGFuZGVkIG1pZ2h0IGJlIHNwcmVhZCBhY3Jvc3Mgc2V2ZXJhbCBiaW9zLiAgV2UgbmVlZAorICogdG8gdHJhY2sgd2hlbiB0aGUgbGFzdCBvbmUgaXMgZmluaXNoZWQuCisgKi8KK3N0cnVjdCBwYXJhbGxlbF9pbyB7CisJc3RydWN0IGtyZWYgcmVmY250OworCXN0cnVjdCBycGNfY2FsbF9vcHMgY2FsbF9vcHM7CisJdm9pZCAoKnBuZnNfY2FsbGJhY2spICh2b2lkICpkYXRhKTsKKwl2b2lkICpkYXRhOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFyYWxsZWxfaW8gKmFsbG9jX3BhcmFsbGVsKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHBhcmFsbGVsX2lvICpydjsKKworCXJ2ICA9IGttYWxsb2Moc2l6ZW9mKCpydiksIEdGUF9OT0ZTKTsKKwlpZiAocnYpIHsKKwkJcnYtPmRhdGEgPSBkYXRhOworCQlrcmVmX2luaXQoJnJ2LT5yZWZjbnQpOworCX0KKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfcGFyYWxsZWwoc3RydWN0IHBhcmFsbGVsX2lvICpwKQoreworCWtyZWZfZ2V0KCZwLT5yZWZjbnQpOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X3BhcmFsbGVsKHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCBwYXJhbGxlbF9pbyAqcCA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgcGFyYWxsZWxfaW8sIHJlZmNudCk7CisKKwlkcHJpbnRrKCIlcyBlbnRlclxuIiwgX19mdW5jX18pOworCXAtPnBuZnNfY2FsbGJhY2socC0+ZGF0YSk7CisJa2ZyZWUocCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfcGFyYWxsZWwoc3RydWN0IHBhcmFsbGVsX2lvICpwKQoreworCWtyZWZfcHV0KCZwLT5yZWZjbnQsIGRlc3Ryb3lfcGFyYWxsZWwpOworfQorCitzdGF0aWMgc3RydWN0IGJpbyAqCitibF9zdWJtaXRfYmlvKGludCBydywgc3RydWN0IGJpbyAqYmlvKQoreworCWlmIChiaW8pIHsKKwkJZ2V0X3BhcmFsbGVsKGJpby0+YmlfcHJpdmF0ZSk7CisJCWRwcmludGsoIiVzIHN1Ym1pdHRpbmcgJXMgYmlvICV1QCVsbHVcbiIsIF9fZnVuY19fLAorCQkJcncgPT0gUkVBRCA/ICJyZWFkIiA6ICJ3cml0ZSIsCisJCQliaW8tPmJpX3NpemUsICh1bnNpZ25lZCBsb25nIGxvbmcpYmlvLT5iaV9zZWN0b3IpOworCQlzdWJtaXRfYmlvKHJ3LCBiaW8pOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBiaW8gKmJsX2FsbG9jX2luaXRfYmlvKGludCBucGcsIHNlY3Rvcl90IGlzZWN0LAorCQkJCSAgICAgc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50ICpiZSwKKwkJCQkgICAgIHZvaWQgKCplbmRfaW8pKHN0cnVjdCBiaW8gKiwgaW50IGVyciksCisJCQkJICAgICBzdHJ1Y3QgcGFyYWxsZWxfaW8gKnBhcikKK3sKKwlzdHJ1Y3QgYmlvICpiaW87CisKKwliaW8gPSBiaW9fYWxsb2MoR0ZQX05PSU8sIG5wZyk7CisJaWYgKCFiaW8pCisJCXJldHVybiBOVUxMOworCisJYmlvLT5iaV9zZWN0b3IgPSBpc2VjdCAtIGJlLT5iZV9mX29mZnNldCArIGJlLT5iZV92X29mZnNldDsKKwliaW8tPmJpX2JkZXYgPSBiZS0+YmVfbWRldjsKKwliaW8tPmJpX2VuZF9pbyA9IGVuZF9pbzsKKwliaW8tPmJpX3ByaXZhdGUgPSBwYXI7CisJcmV0dXJuIGJpbzsKK30KKworc3RhdGljIHN0cnVjdCBiaW8gKmJsX2FkZF9wYWdlX3RvX2JpbyhzdHJ1Y3QgYmlvICpiaW8sIGludCBucGcsIGludCBydywKKwkJCQkgICAgICBzZWN0b3JfdCBpc2VjdCwgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCQkJICAgICAgc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50ICpiZSwKKwkJCQkgICAgICB2b2lkICgqZW5kX2lvKShzdHJ1Y3QgYmlvICosIGludCBlcnIpLAorCQkJCSAgICAgIHN0cnVjdCBwYXJhbGxlbF9pbyAqcGFyKQoreworcmV0cnk6CisJaWYgKCFiaW8pIHsKKwkJYmlvID0gYmxfYWxsb2NfaW5pdF9iaW8obnBnLCBpc2VjdCwgYmUsIGVuZF9pbywgcGFyKTsKKwkJaWYgKCFiaW8pCisJCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisJaWYgKGJpb19hZGRfcGFnZShiaW8sIHBhZ2UsIFBBR0VfQ0FDSEVfU0laRSwgMCkgPCBQQUdFX0NBQ0hFX1NJWkUpIHsKKwkJYmlvID0gYmxfc3VibWl0X2JpbyhydywgYmlvKTsKKwkJZ290byByZXRyeTsKKwl9CisJcmV0dXJuIGJpbzsKK30KKworc3RhdGljIHZvaWQgYmxfc2V0X2xvX2ZhaWwoc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWcpCit7CisJaWYgKGxzZWctPnBsc19yYW5nZS5pb21vZGUgPT0gSU9NT0RFX1JXKSB7CisJCWRwcmludGsoIiVzIFNldHRpbmcgbGF5b3V0IElPTU9ERV9SVyBmYWlsIGJpdFxuIiwgX19mdW5jX18pOworCQlzZXRfYml0KGxvX2ZhaWxfYml0KElPTU9ERV9SVyksICZsc2VnLT5wbHNfbGF5b3V0LT5wbGhfZmxhZ3MpOworCX0gZWxzZSB7CisJCWRwcmludGsoIiVzIFNldHRpbmcgbGF5b3V0IElPTU9ERV9SRUFEIGZhaWwgYml0XG4iLCBfX2Z1bmNfXyk7CisJCXNldF9iaXQobG9fZmFpbF9iaXQoSU9NT0RFX1JFQUQpLCAmbHNlZy0+cGxzX2xheW91dC0+cGxoX2ZsYWdzKTsKKwl9Cit9CisKKy8qIFRoaXMgaXMgYmFzaWNhbGx5IGNvcGllZCBmcm9tIG1wYWdlX2VuZF9pb19yZWFkICovCitzdGF0aWMgdm9pZCBibF9lbmRfaW9fcmVhZChzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnIpCit7CisJc3RydWN0IHBhcmFsbGVsX2lvICpwYXIgPSBiaW8tPmJpX3ByaXZhdGU7CisJY29uc3QgaW50IHVwdG9kYXRlID0gdGVzdF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncyk7CisJc3RydWN0IGJpb192ZWMgKmJ2ZWMgPSBiaW8tPmJpX2lvX3ZlYyArIGJpby0+YmlfdmNudCAtIDE7CisJc3RydWN0IG5mc19yZWFkX2RhdGEgKnJkYXRhID0gKHN0cnVjdCBuZnNfcmVhZF9kYXRhICopcGFyLT5kYXRhOworCisJZG8geworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IGJ2ZWMtPmJ2X3BhZ2U7CisKKwkJaWYgKC0tYnZlYyA+PSBiaW8tPmJpX2lvX3ZlYykKKwkJCXByZWZldGNodygmYnZlYy0+YnZfcGFnZS0+ZmxhZ3MpOworCQlpZiAodXB0b2RhdGUpCisJCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJfSB3aGlsZSAoYnZlYyA+PSBiaW8tPmJpX2lvX3ZlYyk7CisJaWYgKCF1cHRvZGF0ZSkgeworCQlpZiAoIXJkYXRhLT5wbmZzX2Vycm9yKQorCQkJcmRhdGEtPnBuZnNfZXJyb3IgPSAtRUlPOworCQlibF9zZXRfbG9fZmFpbChyZGF0YS0+bHNlZyk7CisJfQorCWJpb19wdXQoYmlvKTsKKwlwdXRfcGFyYWxsZWwocGFyKTsKK30KKworc3RhdGljIHZvaWQgYmxfcmVhZF9jbGVhbnVwKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgcnBjX3Rhc2sgKnRhc2s7CisJc3RydWN0IG5mc19yZWFkX2RhdGEgKnJkYXRhOworCWRwcmludGsoIiVzIGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJdGFzayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcnBjX3Rhc2ssIHUudGtfd29yayk7CisJcmRhdGEgPSBjb250YWluZXJfb2YodGFzaywgc3RydWN0IG5mc19yZWFkX2RhdGEsIHRhc2spOworCXBuZnNfbGRfcmVhZF9kb25lKHJkYXRhKTsKK30KKworc3RhdGljIHZvaWQKK2JsX2VuZF9wYXJfaW9fcmVhZCh2b2lkICpkYXRhKQoreworCXN0cnVjdCBuZnNfcmVhZF9kYXRhICpyZGF0YSA9IGRhdGE7CisKKwlJTklUX1dPUksoJnJkYXRhLT50YXNrLnUudGtfd29yaywgYmxfcmVhZF9jbGVhbnVwKTsKKwlzY2hlZHVsZV93b3JrKCZyZGF0YS0+dGFzay51LnRrX3dvcmspOworfQorCisvKiBXZSBkb24ndCB3YW50IG5vcm1hbCAucnBjX2NhbGxfZG9uZSBjYWxsYmFjayB1c2VkLCBzbyB3ZSByZXBsYWNlIGl0CisgKiB3aXRoIHRoaXMgc3R1Yi4KKyAqLworc3RhdGljIHZvaWQgYmxfcnBjX2RvX25vdGhpbmcoc3RydWN0IHJwY190YXNrICp0YXNrLCB2b2lkICpjYWxsZGF0YSkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBlbnVtIHBuZnNfdHJ5X3N0YXR1cworYmxfcmVhZF9wYWdlbGlzdChzdHJ1Y3QgbmZzX3JlYWRfZGF0YSAqcmRhdGEpCit7CisJaW50IGksIGhvbGU7CisJc3RydWN0IGJpbyAqYmlvID0gTlVMTDsKKwlzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKmJlID0gTlVMTCwgKmNvd19yZWFkID0gTlVMTDsKKwlzZWN0b3JfdCBpc2VjdCwgZXh0ZW50X2xlbmd0aCA9IDA7CisJc3RydWN0IHBhcmFsbGVsX2lvICpwYXI7CisJbG9mZl90IGZfb2Zmc2V0ID0gcmRhdGEtPmFyZ3Mub2Zmc2V0OworCXNpemVfdCBjb3VudCA9IHJkYXRhLT5hcmdzLmNvdW50OworCXN0cnVjdCBwYWdlICoqcGFnZXMgPSByZGF0YS0+YXJncy5wYWdlczsKKwlpbnQgcGdfaW5kZXggPSByZGF0YS0+YXJncy5wZ2Jhc2UgPj4gUEFHRV9DQUNIRV9TSElGVDsKKworCWRwcmludGsoIiVzIGVudGVyIG5yX3BhZ2VzICV1IG9mZnNldCAlbGxkIGNvdW50ICVaZFxuIiwgX19mdW5jX18sCisJICAgICAgIHJkYXRhLT5ucGFnZXMsIGZfb2Zmc2V0LCBjb3VudCk7CisKKwlwYXIgPSBhbGxvY19wYXJhbGxlbChyZGF0YSk7CisJaWYgKCFwYXIpCisJCWdvdG8gdXNlX21kczsKKwlwYXItPmNhbGxfb3BzID0gKnJkYXRhLT5tZHNfb3BzOworCXBhci0+Y2FsbF9vcHMucnBjX2NhbGxfZG9uZSA9IGJsX3JwY19kb19ub3RoaW5nOworCXBhci0+cG5mc19jYWxsYmFjayA9IGJsX2VuZF9wYXJfaW9fcmVhZDsKKwkvKiBBdCB0aGlzIHBvaW50LCB3ZSBjYW4gbm8gbG9uZ2VyIGp1bXAgdG8gdXNlX21kcyAqLworCisJaXNlY3QgPSAoc2VjdG9yX3QpIChmX29mZnNldCA+PiBTRUNUT1JfU0hJRlQpOworCS8qIENvZGUgYXNzdW1lcyBleHRlbnRzIGFyZSBwYWdlLWFsaWduZWQgKi8KKwlmb3IgKGkgPSBwZ19pbmRleDsgaSA8IHJkYXRhLT5ucGFnZXM7IGkrKykgeworCQlpZiAoIWV4dGVudF9sZW5ndGgpIHsKKwkJCS8qIFdlJ3ZlIHVzZWQgdXAgdGhlIHByZXZpb3VzIGV4dGVudCAqLworCQkJYmxfcHV0X2V4dGVudChiZSk7CisJCQlibF9wdXRfZXh0ZW50KGNvd19yZWFkKTsKKwkJCWJpbyA9IGJsX3N1Ym1pdF9iaW8oUkVBRCwgYmlvKTsKKwkJCS8qIEdldCB0aGUgbmV4dCBvbmUgKi8KKwkJCWJlID0gYmxfZmluZF9nZXRfZXh0ZW50KEJMS19MU0VHMkVYVChyZGF0YS0+bHNlZyksCisJCQkJCSAgICAgaXNlY3QsICZjb3dfcmVhZCk7CisJCQlpZiAoIWJlKSB7CisJCQkJcmRhdGEtPnBuZnNfZXJyb3IgPSAtRUlPOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJZXh0ZW50X2xlbmd0aCA9IGJlLT5iZV9sZW5ndGggLQorCQkJCShpc2VjdCAtIGJlLT5iZV9mX29mZnNldCk7CisJCQlpZiAoY293X3JlYWQpIHsKKwkJCQlzZWN0b3JfdCBjb3dfbGVuZ3RoID0gY293X3JlYWQtPmJlX2xlbmd0aCAtCisJCQkJCShpc2VjdCAtIGNvd19yZWFkLT5iZV9mX29mZnNldCk7CisJCQkJZXh0ZW50X2xlbmd0aCA9IG1pbihleHRlbnRfbGVuZ3RoLCBjb3dfbGVuZ3RoKTsKKwkJCX0KKwkJfQorCQlob2xlID0gaXNfaG9sZShiZSwgaXNlY3QpOworCQlpZiAoaG9sZSAmJiAhY293X3JlYWQpIHsKKwkJCWJpbyA9IGJsX3N1Ym1pdF9iaW8oUkVBRCwgYmlvKTsKKwkJCS8qIEZpbGwgaG9sZSB3LyB6ZXJvZXMgdy9vIGFjY2Vzc2luZyBkZXZpY2UgKi8KKwkJCWRwcmludGsoIiVzIFplcm9pbmcgcGFnZSBmb3IgaG9sZVxuIiwgX19mdW5jX18pOworCQkJemVyb191c2VyX3NlZ21lbnQocGFnZXNbaV0sIDAsIFBBR0VfQ0FDSEVfU0laRSk7CisJCQlwcmludF9wYWdlKHBhZ2VzW2ldKTsKKwkJCVNldFBhZ2VVcHRvZGF0ZShwYWdlc1tpXSk7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKmJlX3JlYWQ7CisKKwkJCWJlX3JlYWQgPSAoaG9sZSAmJiBjb3dfcmVhZCkgPyBjb3dfcmVhZCA6IGJlOworCQkJYmlvID0gYmxfYWRkX3BhZ2VfdG9fYmlvKGJpbywgcmRhdGEtPm5wYWdlcyAtIGksIFJFQUQsCisJCQkJCQkgaXNlY3QsIHBhZ2VzW2ldLCBiZV9yZWFkLAorCQkJCQkJIGJsX2VuZF9pb19yZWFkLCBwYXIpOworCQkJaWYgKElTX0VSUihiaW8pKSB7CisJCQkJcmRhdGEtPnBuZnNfZXJyb3IgPSBQVFJfRVJSKGJpbyk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJaXNlY3QgKz0gUEFHRV9DQUNIRV9TRUNUT1JTOworCQlleHRlbnRfbGVuZ3RoIC09IFBBR0VfQ0FDSEVfU0VDVE9SUzsKKwl9CisJaWYgKChpc2VjdCA8PCBTRUNUT1JfU0hJRlQpID49IHJkYXRhLT5pbm9kZS0+aV9zaXplKSB7CisJCXJkYXRhLT5yZXMuZW9mID0gMTsKKwkJcmRhdGEtPnJlcy5jb3VudCA9IHJkYXRhLT5pbm9kZS0+aV9zaXplIC0gZl9vZmZzZXQ7CisJfSBlbHNlIHsKKwkJcmRhdGEtPnJlcy5jb3VudCA9IChpc2VjdCA8PCBTRUNUT1JfU0hJRlQpIC0gZl9vZmZzZXQ7CisJfQorb3V0OgorCWJsX3B1dF9leHRlbnQoYmUpOworCWJsX3B1dF9leHRlbnQoY293X3JlYWQpOworCWJsX3N1Ym1pdF9iaW8oUkVBRCwgYmlvKTsKKwlwdXRfcGFyYWxsZWwocGFyKTsKKwlyZXR1cm4gUE5GU19BVFRFTVBURUQ7CisKKyB1c2VfbWRzOgorCWRwcmludGsoIkdpdmluZyB1cCBhbmQgdXNpbmcgbm9ybWFsIE5GU1xuIik7CisJcmV0dXJuIFBORlNfTk9UX0FUVEVNUFRFRDsKK30KKworc3RhdGljIHZvaWQgbWFya19leHRlbnRzX3dyaXR0ZW4oc3RydWN0IHBuZnNfYmxvY2tfbGF5b3V0ICpibCwKKwkJCQkgX191NjQgb2Zmc2V0LCBfX3UzMiBjb3VudCkKK3sKKwlzZWN0b3JfdCBpc2VjdCwgZW5kOworCXN0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCAqYmU7CisKKwlkcHJpbnRrKCIlcyglbGx1LCAldSlcbiIsIF9fZnVuY19fLCBvZmZzZXQsIGNvdW50KTsKKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuOworCWlzZWN0ID0gKG9mZnNldCAmIChsb25nKShQQUdFX0NBQ0hFX01BU0spKSA+PiBTRUNUT1JfU0hJRlQ7CisJZW5kID0gKG9mZnNldCArIGNvdW50ICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgJiAobG9uZykoUEFHRV9DQUNIRV9NQVNLKTsKKwllbmQgPj49IFNFQ1RPUl9TSElGVDsKKwl3aGlsZSAoaXNlY3QgPCBlbmQpIHsKKwkJc2VjdG9yX3QgbGVuOworCQliZSA9IGJsX2ZpbmRfZ2V0X2V4dGVudChibCwgaXNlY3QsIE5VTEwpOworCQlCVUdfT04oIWJlKTsgLyogRklYTUUgKi8KKwkJbGVuID0gbWluKGVuZCwgYmUtPmJlX2Zfb2Zmc2V0ICsgYmUtPmJlX2xlbmd0aCkgLSBpc2VjdDsKKwkJaWYgKGJlLT5iZV9zdGF0ZSA9PSBQTkZTX0JMT0NLX0lOVkFMSURfREFUQSkKKwkJCWJsX21hcmtfZm9yX2NvbW1pdChiZSwgaXNlY3QsIGxlbik7IC8qIFdoYXQgaWYgZmFpbHM/ICovCisJCWlzZWN0ICs9IGxlbjsKKwkJYmxfcHV0X2V4dGVudChiZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBibF9lbmRfaW9fd3JpdGVfemVybyhzdHJ1Y3QgYmlvICpiaW8sIGludCBlcnIpCit7CisJc3RydWN0IHBhcmFsbGVsX2lvICpwYXIgPSBiaW8tPmJpX3ByaXZhdGU7CisJY29uc3QgaW50IHVwdG9kYXRlID0gdGVzdF9iaXQoQklPX1VQVE9EQVRFLCAmYmlvLT5iaV9mbGFncyk7CisJc3RydWN0IGJpb192ZWMgKmJ2ZWMgPSBiaW8tPmJpX2lvX3ZlYyArIGJpby0+YmlfdmNudCAtIDE7CisJc3RydWN0IG5mc193cml0ZV9kYXRhICp3ZGF0YSA9IChzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKilwYXItPmRhdGE7CisKKwlkbyB7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gYnZlYy0+YnZfcGFnZTsKKworCQlpZiAoLS1idmVjID49IGJpby0+YmlfaW9fdmVjKQorCQkJcHJlZmV0Y2h3KCZidmVjLT5idl9wYWdlLT5mbGFncyk7CisJCS8qIFRoaXMgaXMgdGhlIHplcm9pbmcgcGFnZSB3ZSBhZGRlZCAqLworCQllbmRfcGFnZV93cml0ZWJhY2socGFnZSk7CisJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwl9IHdoaWxlIChidmVjID49IGJpby0+YmlfaW9fdmVjKTsKKwlpZiAoIXVwdG9kYXRlKSB7CisJCWlmICghd2RhdGEtPnBuZnNfZXJyb3IpCisJCQl3ZGF0YS0+cG5mc19lcnJvciA9IC1FSU87CisJCWJsX3NldF9sb19mYWlsKHdkYXRhLT5sc2VnKTsKKwl9CisJYmlvX3B1dChiaW8pOworCXB1dF9wYXJhbGxlbChwYXIpOworfQorCisvKiBUaGlzIGlzIGJhc2ljYWxseSBjb3BpZWQgZnJvbSBtcGFnZV9lbmRfaW9fcmVhZCAqLworc3RhdGljIHZvaWQgYmxfZW5kX2lvX3dyaXRlKHN0cnVjdCBiaW8gKmJpbywgaW50IGVycikKK3sKKwlzdHJ1Y3QgcGFyYWxsZWxfaW8gKnBhciA9IGJpby0+YmlfcHJpdmF0ZTsKKwljb25zdCBpbnQgdXB0b2RhdGUgPSB0ZXN0X2JpdChCSU9fVVBUT0RBVEUsICZiaW8tPmJpX2ZsYWdzKTsKKwlzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKndkYXRhID0gKHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqKXBhci0+ZGF0YTsKKworCWlmICghdXB0b2RhdGUpIHsKKwkJaWYgKCF3ZGF0YS0+cG5mc19lcnJvcikKKwkJCXdkYXRhLT5wbmZzX2Vycm9yID0gLUVJTzsKKwkJYmxfc2V0X2xvX2ZhaWwod2RhdGEtPmxzZWcpOworCX0KKwliaW9fcHV0KGJpbyk7CisJcHV0X3BhcmFsbGVsKHBhcik7Cit9CisKKy8qIEZ1bmN0aW9uIHNjaGVkdWxlZCBmb3IgY2FsbCBkdXJpbmcgYmxfZW5kX3Bhcl9pb193cml0ZSwKKyAqIGl0IG1hcmtzIHNlY3RvcnMgYXMgd3JpdHRlbiBhbmQgZXh0ZW5kcyB0aGUgY29tbWl0bGlzdC4KKyAqLworc3RhdGljIHZvaWQgYmxfd3JpdGVfY2xlYW51cChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHJwY190YXNrICp0YXNrOworCXN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqd2RhdGE7CisJZHByaW50aygiJXMgZW50ZXJcbiIsIF9fZnVuY19fKTsKKwl0YXNrID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBycGNfdGFzaywgdS50a193b3JrKTsKKwl3ZGF0YSA9IGNvbnRhaW5lcl9vZih0YXNrLCBzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEsIHRhc2spOworCWlmICghd2RhdGEtPnBuZnNfZXJyb3IpIHsKKwkJLyogTWFya3MgZm9yIExBWU9VVENPTU1JVCAqLworCQltYXJrX2V4dGVudHNfd3JpdHRlbihCTEtfTFNFRzJFWFQod2RhdGEtPmxzZWcpLAorCQkJCSAgICAgd2RhdGEtPmFyZ3Mub2Zmc2V0LCB3ZGF0YS0+YXJncy5jb3VudCk7CisJfQorCXBuZnNfbGRfd3JpdGVfZG9uZSh3ZGF0YSk7Cit9CisKKy8qIENhbGxlZCB3aGVuIGxhc3Qgb2YgYmlvcyBhc3NvY2lhdGVkIHdpdGggYSBibF93cml0ZV9wYWdlbGlzdCBjYWxsIGZpbmlzaGVzICovCitzdGF0aWMgdm9pZCBibF9lbmRfcGFyX2lvX3dyaXRlKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG5mc193cml0ZV9kYXRhICp3ZGF0YSA9IGRhdGE7CisKKwl3ZGF0YS0+dGFzay50a19zdGF0dXMgPSAwOworCXdkYXRhLT52ZXJmLmNvbW1pdHRlZCA9IE5GU19GSUxFX1NZTkM7CisJSU5JVF9XT1JLKCZ3ZGF0YS0+dGFzay51LnRrX3dvcmssIGJsX3dyaXRlX2NsZWFudXApOworCXNjaGVkdWxlX3dvcmsoJndkYXRhLT50YXNrLnUudGtfd29yayk7Cit9CisKKy8qIEZJWE1FIFNUVUIgLSBtYXJrIGludGVyc2VjdGlvbiBvZiBsYXlvdXQgYW5kIHBhZ2UgYXMgYmFkLCBzbyBpcyBub3QKKyAqIHVzZWQgYWdhaW4uCisgKi8KK3N0YXRpYyB2b2lkIG1hcmtfYmFkX3JlYWQodm9pZCkKK3sKKwlyZXR1cm47Cit9CisKKy8qCisgKiBtYXBfYmxvY2s6ICBtYXAgYSByZXF1ZXN0ZWQgSS8wIGJsb2NrIChpc2VjdCkgaW50byBhbiBvZmZzZXQgaW4gdGhlIExWTQorICogYmxvY2tfZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkCittYXBfYmxvY2soc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgc2VjdG9yX3QgaXNlY3QsIHN0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCAqYmUpCit7CisJZHByaW50aygiJXMgZW50ZXIgYmU9JXBcbiIsIF9fZnVuY19fLCBiZSk7CisKKwlzZXRfYnVmZmVyX21hcHBlZChiaCk7CisJYmgtPmJfYmRldiA9IGJlLT5iZV9tZGV2OworCWJoLT5iX2Jsb2NrbnIgPSAoaXNlY3QgLSBiZS0+YmVfZl9vZmZzZXQgKyBiZS0+YmVfdl9vZmZzZXQpID4+CisJICAgIChiZS0+YmVfbWRldi0+YmRfaW5vZGUtPmlfYmxrYml0cyAtIFNFQ1RPUl9TSElGVCk7CisKKwlkcHJpbnRrKCIlcyBpc2VjdCAlbGx1LCBiaC0+Yl9ibG9ja25yICVsZCwgdXNpbmcgYnNpemUgJVpkXG4iLAorCQlfX2Z1bmNfXywgKHVuc2lnbmVkIGxvbmcgbG9uZylpc2VjdCwgKGxvbmcpYmgtPmJfYmxvY2tuciwKKwkJYmgtPmJfc2l6ZSk7CisJcmV0dXJuOworfQorCisvKiBHaXZlbiBhbiB1bm1hcHBlZCBwYWdlLCB6ZXJvIGl0IG9yIHJlYWQgaW4gcGFnZSBmb3IgQ09XLCBwYWdlIGlzIGxvY2tlZAorICogYnkgY2FsbGVyLgorICovCitzdGF0aWMgaW50Citpbml0X3BhZ2VfZm9yX3dyaXRlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKmNvd19yZWFkKQoreworCXN0cnVjdCBidWZmZXJfaGVhZCAqYmggPSBOVUxMOworCWludCByZXQgPSAwOworCXNlY3Rvcl90IGlzZWN0OworCisJZHByaW50aygiJXMgZW50ZXIsICVwXG4iLCBfX2Z1bmNfXywgcGFnZSk7CisJQlVHX09OKFBhZ2VVcHRvZGF0ZShwYWdlKSk7CisJaWYgKCFjb3dfcmVhZCkgeworCQl6ZXJvX3VzZXJfc2VnbWVudChwYWdlLCAwLCBQQUdFX1NJWkUpOworCQlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisJCWdvdG8gY2xlYW51cDsKKwl9CisKKwliaCA9IGFsbG9jX3BhZ2VfYnVmZmVycyhwYWdlLCBQQUdFX0NBQ0hFX1NJWkUsIDApOworCWlmICghYmgpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBjbGVhbnVwOworCX0KKworCWlzZWN0ID0gKHNlY3Rvcl90KSBwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NFQ1RPUl9TSElGVDsKKwltYXBfYmxvY2soYmgsIGlzZWN0LCBjb3dfcmVhZCk7CisJaWYgKCFiaF91cHRvZGF0ZV9vcl9sb2NrKGJoKSkKKwkJcmV0ID0gYmhfc3VibWl0X3JlYWQoYmgpOworCWlmIChyZXQpCisJCWdvdG8gY2xlYW51cDsKKwlTZXRQYWdlVXB0b2RhdGUocGFnZSk7CisKK2NsZWFudXA6CisJYmxfcHV0X2V4dGVudChjb3dfcmVhZCk7CisJaWYgKGJoKQorCQlmcmVlX2J1ZmZlcl9oZWFkKGJoKTsKKwlpZiAocmV0KSB7CisJCS8qIE5lZWQgdG8gbWFyayBsYXlvdXQgd2l0aCBiYWQgcmVhZC4uLnNob3VsZCBub3cKKwkJICoganVzdCB1c2UgbmZzNCBmb3IgcmVhZHMgYW5kIHdyaXRlcy4KKwkJICovCisJCW1hcmtfYmFkX3JlYWQoKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGVudW0gcG5mc190cnlfc3RhdHVzCitibF93cml0ZV9wYWdlbGlzdChzdHJ1Y3QgbmZzX3dyaXRlX2RhdGEgKndkYXRhLCBpbnQgc3luYykKK3sKKwlpbnQgaSwgcmV0LCBucGdfemVybywgcGdfaW5kZXgsIGxhc3QgPSAwOworCXN0cnVjdCBiaW8gKmJpbyA9IE5VTEw7CisJc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50ICpiZSA9IE5VTEwsICpjb3dfcmVhZCA9IE5VTEw7CisJc2VjdG9yX3QgaXNlY3QsIGxhc3RfaXNlY3QgPSAwLCBleHRlbnRfbGVuZ3RoID0gMDsKKwlzdHJ1Y3QgcGFyYWxsZWxfaW8gKnBhcjsKKwlsb2ZmX3Qgb2Zmc2V0ID0gd2RhdGEtPmFyZ3Mub2Zmc2V0OworCXNpemVfdCBjb3VudCA9IHdkYXRhLT5hcmdzLmNvdW50OworCXN0cnVjdCBwYWdlICoqcGFnZXMgPSB3ZGF0YS0+YXJncy5wYWdlczsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKwlwZ29mZl90IGluZGV4OworCXU2NCB0ZW1wOworCWludCBucGdfcGVyX2Jsb2NrID0KKwkgICAgTkZTX1NFUlZFUih3ZGF0YS0+aW5vZGUpLT5wbmZzX2Jsa3NpemUgPj4gUEFHRV9DQUNIRV9TSElGVDsKKworCWRwcmludGsoIiVzIGVudGVyLCAlWnVAJWxsZFxuIiwgX19mdW5jX18sIGNvdW50LCBvZmZzZXQpOworCS8qIEF0IHRoaXMgcG9pbnQsIHdkYXRhLT5wYWdlcyBpcyBhIChzZXF1ZW50aWFsKSBsaXN0IG9mIG5mc19wYWdlcy4KKwkgKiBXZSB3YW50IHRvIHdyaXRlIGVhY2gsIGFuZCBpZiB0aGVyZSBpcyBhbiBlcnJvciBzZXQgcG5mc19lcnJvcgorCSAqIHRvIGhhdmUgaXQgcmVkb25lIHVzaW5nIG5mcy4KKwkgKi8KKwlwYXIgPSBhbGxvY19wYXJhbGxlbCh3ZGF0YSk7CisJaWYgKCFwYXIpCisJCXJldHVybiBQTkZTX05PVF9BVFRFTVBURUQ7CisJcGFyLT5jYWxsX29wcyA9ICp3ZGF0YS0+bWRzX29wczsKKwlwYXItPmNhbGxfb3BzLnJwY19jYWxsX2RvbmUgPSBibF9ycGNfZG9fbm90aGluZzsKKwlwYXItPnBuZnNfY2FsbGJhY2sgPSBibF9lbmRfcGFyX2lvX3dyaXRlOworCS8qIEF0IHRoaXMgcG9pbnQsIGhhdmUgdG8gYmUgbW9yZSBjYXJlZnVsIHdpdGggZXJyb3IgaGFuZGxpbmcgKi8KKworCWlzZWN0ID0gKHNlY3Rvcl90KSAoKG9mZnNldCAmIChsb25nKVBBR0VfQ0FDSEVfTUFTSykgPj4gU0VDVE9SX1NISUZUKTsKKwliZSA9IGJsX2ZpbmRfZ2V0X2V4dGVudChCTEtfTFNFRzJFWFQod2RhdGEtPmxzZWcpLCBpc2VjdCwgJmNvd19yZWFkKTsKKwlpZiAoIWJlIHx8ICFpc193cml0YWJsZShiZSwgaXNlY3QpKSB7CisJCWRwcmludGsoIiVzIG5vIG1hdGNoaW5nIGV4dGVudHMhXG4iLCBfX2Z1bmNfXyk7CisJCXdkYXRhLT5wbmZzX2Vycm9yID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogRmlyc3QgcGFnZSBpbnNpZGUgSU5WQUxJRCBleHRlbnQgKi8KKwlpZiAoYmUtPmJlX3N0YXRlID09IFBORlNfQkxPQ0tfSU5WQUxJRF9EQVRBKSB7CisJCXRlbXAgPSBvZmZzZXQgPj4gUEFHRV9DQUNIRV9TSElGVDsKKwkJbnBnX3plcm8gPSBkb19kaXYodGVtcCwgbnBnX3Blcl9ibG9jayk7CisJCWlzZWN0ID0gKHNlY3Rvcl90KSAoKChvZmZzZXQgLSBucGdfemVybyAqIFBBR0VfQ0FDSEVfU0laRSkgJgorCQkJCSAgICAgKGxvbmcpUEFHRV9DQUNIRV9NQVNLKSA+PiBTRUNUT1JfU0hJRlQpOworCQlleHRlbnRfbGVuZ3RoID0gYmUtPmJlX2xlbmd0aCAtIChpc2VjdCAtIGJlLT5iZV9mX29mZnNldCk7CisKK2ZpbGxfaW52YWxpZF9leHQ6CisJCWRwcmludGsoIiVzIG5lZWQgdG8gemVybyAlZCBwYWdlc1xuIiwgX19mdW5jX18sIG5wZ196ZXJvKTsKKwkJZm9yICg7bnBnX3plcm8gPiAwOyBucGdfemVyby0tKSB7CisJCQkvKiBwYWdlIHJlZiByZWxlYXNlZCBpbiBibF9lbmRfaW9fd3JpdGVfemVybyAqLworCQkJaW5kZXggPSBpc2VjdCA+PiBQQUdFX0NBQ0hFX1NFQ1RPUl9TSElGVDsKKwkJCWRwcmludGsoIiVzIHplcm8gJWR0aCBwYWdlOiBpbmRleCAlbHUgaXNlY3QgJWxsdVxuIiwKKwkJCQlfX2Z1bmNfXywgbnBnX3plcm8sIGluZGV4LAorCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpaXNlY3QpOworCQkJcGFnZSA9CisJCQkgICAgZmluZF9vcl9jcmVhdGVfcGFnZSh3ZGF0YS0+aW5vZGUtPmlfbWFwcGluZywgaW5kZXgsCisJCQkJCQlHRlBfTk9GUyk7CisJCQlpZiAoIXBhZ2UpIHsKKwkJCQlkcHJpbnRrKCIlcyBvb21cbiIsIF9fZnVuY19fKTsKKwkJCQl3ZGF0YS0+cG5mc19lcnJvciA9IC1FTk9NRU07CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCS8qIFBhZ2VEaXJ0eTogT3RoZXIgd2lsbCB3cml0ZSB0aGlzIG91dAorCQkJICogUGFnZVdyaXRlYmFjazogT3RoZXIgaXMgd3JpdGluZyB0aGlzIG91dAorCQkJICogUGFnZVVwdG9kYXRlOiBJdCB3YXMgcmVhZCBiZWZvcmUKKwkJCSAqIHNlY3Rvcl9pbml0aWFsaXplZDogYWxyZWFkeSB3cml0dGVuIG91dAorCQkJICovCisJCQlpZiAoUGFnZURpcnR5KHBhZ2UpIHx8IFBhZ2VXcml0ZWJhY2socGFnZSkgfHwKKwkJCSAgICBibF9pc19zZWN0b3JfaW5pdChiZS0+YmVfaW52YWwsIGlzZWN0KSkgeworCQkJCXByaW50X3BhZ2UocGFnZSk7CisJCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCQkJCWdvdG8gbmV4dF9wYWdlOworCQkJfQorCQkJaWYgKCFQYWdlVXB0b2RhdGUocGFnZSkpIHsKKwkJCQkvKiBOZXcgcGFnZSwgcmVhZGluIG9yIHplcm8gaXQgKi8KKwkJCQlpbml0X3BhZ2VfZm9yX3dyaXRlKHBhZ2UsIGNvd19yZWFkKTsKKwkJCX0KKwkJCXNldF9wYWdlX3dyaXRlYmFjayhwYWdlKTsKKwkJCXVubG9ja19wYWdlKHBhZ2UpOworCisJCQlyZXQgPSBibF9tYXJrX3NlY3RvcnNfaW5pdChiZS0+YmVfaW52YWwsIGlzZWN0LAorCQkJCQkJICAgICAgIFBBR0VfQ0FDSEVfU0VDVE9SUywKKwkJCQkJCSAgICAgICBOVUxMKTsKKwkJCWlmICh1bmxpa2VseShyZXQpKSB7CisJCQkJZHByaW50aygiJXMgYmxfbWFya19zZWN0b3JzX2luaXQgZmFpbCAlZFxuIiwKKwkJCQkJX19mdW5jX18sIHJldCk7CisJCQkJZW5kX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKKwkJCQl3ZGF0YS0+cG5mc19lcnJvciA9IHJldDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWJpbyA9IGJsX2FkZF9wYWdlX3RvX2JpbyhiaW8sIG5wZ196ZXJvLCBXUklURSwKKwkJCQkJCSBpc2VjdCwgcGFnZSwgYmUsCisJCQkJCQkgYmxfZW5kX2lvX3dyaXRlX3plcm8sIHBhcik7CisJCQlpZiAoSVNfRVJSKGJpbykpIHsKKwkJCQl3ZGF0YS0+cG5mc19lcnJvciA9IFBUUl9FUlIoYmlvKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCS8qIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBkb25lIGluIGJpX2VuZF9pbyAqLworCQkJbWFya19leHRlbnRzX3dyaXR0ZW4oQkxLX0xTRUcyRVhUKHdkYXRhLT5sc2VnKSwKKwkJCQkJICAgICBwYWdlLT5pbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZULAorCQkJCQkgICAgIFBBR0VfQ0FDSEVfU0laRSk7CituZXh0X3BhZ2U6CisJCQlpc2VjdCArPSBQQUdFX0NBQ0hFX1NFQ1RPUlM7CisJCQlleHRlbnRfbGVuZ3RoIC09IFBBR0VfQ0FDSEVfU0VDVE9SUzsKKwkJfQorCQlpZiAobGFzdCkKKwkJCWdvdG8gd3JpdGVfZG9uZTsKKwl9CisJYmlvID0gYmxfc3VibWl0X2JpbyhXUklURSwgYmlvKTsKKworCS8qIE1pZGRsZSBwYWdlcyAqLworCXBnX2luZGV4ID0gd2RhdGEtPmFyZ3MucGdiYXNlID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJZm9yIChpID0gcGdfaW5kZXg7IGkgPCB3ZGF0YS0+bnBhZ2VzOyBpKyspIHsKKwkJaWYgKCFleHRlbnRfbGVuZ3RoKSB7CisJCQkvKiBXZSd2ZSB1c2VkIHVwIHRoZSBwcmV2aW91cyBleHRlbnQgKi8KKwkJCWJsX3B1dF9leHRlbnQoYmUpOworCQkJYmlvID0gYmxfc3VibWl0X2JpbyhXUklURSwgYmlvKTsKKwkJCS8qIEdldCB0aGUgbmV4dCBvbmUgKi8KKwkJCWJlID0gYmxfZmluZF9nZXRfZXh0ZW50KEJMS19MU0VHMkVYVCh3ZGF0YS0+bHNlZyksCisJCQkJCSAgICAgaXNlY3QsIE5VTEwpOworCQkJaWYgKCFiZSB8fCAhaXNfd3JpdGFibGUoYmUsIGlzZWN0KSkgeworCQkJCXdkYXRhLT5wbmZzX2Vycm9yID0gLUVJTlZBTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWV4dGVudF9sZW5ndGggPSBiZS0+YmVfbGVuZ3RoIC0KKwkJCSAgICAoaXNlY3QgLSBiZS0+YmVfZl9vZmZzZXQpOworCQl9CisJCWlmIChiZS0+YmVfc3RhdGUgPT0gUE5GU19CTE9DS19JTlZBTElEX0RBVEEpIHsKKwkJCXJldCA9IGJsX21hcmtfc2VjdG9yc19pbml0KGJlLT5iZV9pbnZhbCwgaXNlY3QsCisJCQkJCQkgICAgICAgUEFHRV9DQUNIRV9TRUNUT1JTLAorCQkJCQkJICAgICAgIE5VTEwpOworCQkJaWYgKHVubGlrZWx5KHJldCkpIHsKKwkJCQlkcHJpbnRrKCIlcyBibF9tYXJrX3NlY3RvcnNfaW5pdCBmYWlsICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcmV0KTsKKwkJCQl3ZGF0YS0+cG5mc19lcnJvciA9IHJldDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQliaW8gPSBibF9hZGRfcGFnZV90b19iaW8oYmlvLCB3ZGF0YS0+bnBhZ2VzIC0gaSwgV1JJVEUsCisJCQkJCSBpc2VjdCwgcGFnZXNbaV0sIGJlLAorCQkJCQkgYmxfZW5kX2lvX3dyaXRlLCBwYXIpOworCQlpZiAoSVNfRVJSKGJpbykpIHsKKwkJCXdkYXRhLT5wbmZzX2Vycm9yID0gUFRSX0VSUihiaW8pOworCQkJZ290byBvdXQ7CisJCX0KKwkJaXNlY3QgKz0gUEFHRV9DQUNIRV9TRUNUT1JTOworCQlsYXN0X2lzZWN0ID0gaXNlY3Q7CisJCWV4dGVudF9sZW5ndGggLT0gUEFHRV9DQUNIRV9TRUNUT1JTOworCX0KKworCS8qIExhc3QgcGFnZSBpbnNpZGUgSU5WQUxJRCBleHRlbnQgKi8KKwlpZiAoYmUtPmJlX3N0YXRlID09IFBORlNfQkxPQ0tfSU5WQUxJRF9EQVRBKSB7CisJCWJpbyA9IGJsX3N1Ym1pdF9iaW8oV1JJVEUsIGJpbyk7CisJCXRlbXAgPSBsYXN0X2lzZWN0ID4+IFBBR0VfQ0FDSEVfU0VDVE9SX1NISUZUOworCQlucGdfemVybyA9IG5wZ19wZXJfYmxvY2sgLSBkb19kaXYodGVtcCwgbnBnX3Blcl9ibG9jayk7CisJCWlmIChucGdfemVybyA8IG5wZ19wZXJfYmxvY2spIHsKKwkJCWxhc3QgPSAxOworCQkJZ290byBmaWxsX2ludmFsaWRfZXh0OworCQl9CisJfQorCit3cml0ZV9kb25lOgorCXdkYXRhLT5yZXMuY291bnQgPSAobGFzdF9pc2VjdCA8PCBTRUNUT1JfU0hJRlQpIC0gKG9mZnNldCk7CisJaWYgKGNvdW50IDwgd2RhdGEtPnJlcy5jb3VudCkgeworCQl3ZGF0YS0+cmVzLmNvdW50ID0gY291bnQ7CisJfQorb3V0OgorCWJsX3B1dF9leHRlbnQoYmUpOworCWJsX3N1Ym1pdF9iaW8oV1JJVEUsIGJpbyk7CisJcHV0X3BhcmFsbGVsKHBhcik7CisJcmV0dXJuIFBORlNfQVRURU1QVEVEOworfQorCisvKiBGSVhNRSAtIHJhbmdlIGlnbm9yZWQgKi8KK3N0YXRpYyB2b2lkCityZWxlYXNlX2V4dGVudHMoc3RydWN0IHBuZnNfYmxvY2tfbGF5b3V0ICpibCwgc3RydWN0IHBuZnNfbGF5b3V0X3JhbmdlICpyYW5nZSkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKmJlOworCisJc3Bpbl9sb2NrKCZibC0+YmxfZXh0X2xvY2spOworCWZvciAoaSA9IDA7IGkgPCBFWFRFTlRfTElTVFM7IGkrKykgeworCQl3aGlsZSAoIWxpc3RfZW1wdHkoJmJsLT5ibF9leHRlbnRzW2ldKSkgeworCQkJYmUgPSBsaXN0X2ZpcnN0X2VudHJ5KCZibC0+YmxfZXh0ZW50c1tpXSwKKwkJCQkJICAgICAgc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50LAorCQkJCQkgICAgICBiZV9ub2RlKTsKKwkJCWxpc3RfZGVsKCZiZS0+YmVfbm9kZSk7CisJCQlibF9wdXRfZXh0ZW50KGJlKTsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmYmwtPmJsX2V4dF9sb2NrKTsKK30KKworc3RhdGljIHZvaWQKK3JlbGVhc2VfaW52YWxfbWFya3Moc3RydWN0IHBuZnNfaW52YWxfbWFya2luZ3MgKm1hcmtzKQoreworCXN0cnVjdCBwbmZzX2ludmFsX3RyYWNraW5nICpwb3MsICp0ZW1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBvcywgdGVtcCwgJm1hcmtzLT5pbV90cmVlLm10dF9zdHViLCBpdF9saW5rKSB7CisJCWxpc3RfZGVsKCZwb3MtPml0X2xpbmspOworCQlrZnJlZShwb3MpOworCX0KKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGJsX2ZyZWVfbGF5b3V0X2hkcihzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbykKK3sKKwlzdHJ1Y3QgcG5mc19ibG9ja19sYXlvdXQgKmJsID0gQkxLX0xPMkVYVChsbyk7CisKKwlkcHJpbnRrKCIlcyBlbnRlclxuIiwgX19mdW5jX18pOworCXJlbGVhc2VfZXh0ZW50cyhibCwgTlVMTCk7CisJcmVsZWFzZV9pbnZhbF9tYXJrcygmYmwtPmJsX2ludmFsKTsKKwlrZnJlZShibCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpibF9hbGxvY19sYXlvdXRfaGRyKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJCQkgICBnZnBfdCBnZnBfZmxhZ3MpCit7CisJc3RydWN0IHBuZnNfYmxvY2tfbGF5b3V0ICpibDsKKworCWRwcmludGsoIiVzIGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJYmwgPSBremFsbG9jKHNpemVvZigqYmwpLCBnZnBfZmxhZ3MpOworCWlmICghYmwpCisJCXJldHVybiBOVUxMOworCXNwaW5fbG9ja19pbml0KCZibC0+YmxfZXh0X2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZibC0+YmxfZXh0ZW50c1swXSk7CisJSU5JVF9MSVNUX0hFQUQoJmJsLT5ibF9leHRlbnRzWzFdKTsKKwlJTklUX0xJU1RfSEVBRCgmYmwtPmJsX2NvbW1pdCk7CisJSU5JVF9MSVNUX0hFQUQoJmJsLT5ibF9jb21taXR0aW5nKTsKKwlibC0+YmxfY291bnQgPSAwOworCWJsLT5ibF9ibG9ja3NpemUgPSBORlNfU0VSVkVSKGlub2RlKS0+cG5mc19ibGtzaXplID4+IFNFQ1RPUl9TSElGVDsKKwlCTF9JTklUX0lOVkFMX01BUktTKCZibC0+YmxfaW52YWwsIGJsLT5ibF9ibG9ja3NpemUpOworCXJldHVybiAmYmwtPmJsX2xheW91dDsKK30KKworc3RhdGljIHZvaWQgYmxfZnJlZV9sc2VnKHN0cnVjdCBwbmZzX2xheW91dF9zZWdtZW50ICpsc2VnKQoreworCWRwcmludGsoIiVzIGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJa2ZyZWUobHNlZyk7Cit9CisKKy8qIFdlIHByZXR0eSBtdWNoIGlnbm9yZSBsc2VnLCBhbmQgc3RvcmUgYWxsIGRhdGEgbGF5b3V0IHdpZGUsIHNvIHdlCisgKiBjYW4gY29ycmVjdGx5IG1lcmdlLgorICovCitzdGF0aWMgc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmJsX2FsbG9jX2xzZWcoc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG8sCisJCQkJCQkgc3RydWN0IG5mczRfbGF5b3V0Z2V0X3JlcyAqbGdyLAorCQkJCQkJIGdmcF90IGdmcF9mbGFncykKK3sKKwlzdHJ1Y3QgcG5mc19sYXlvdXRfc2VnbWVudCAqbHNlZzsKKwlpbnQgc3RhdHVzOworCisJZHByaW50aygiJXMgZW50ZXJcbiIsIF9fZnVuY19fKTsKKwlsc2VnID0ga3phbGxvYyhzaXplb2YoKmxzZWcpLCBnZnBfZmxhZ3MpOworCWlmICghbHNlZykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJc3RhdHVzID0gbmZzNF9ibGtfcHJvY2Vzc19sYXlvdXRnZXQobG8sIGxnciwgZ2ZwX2ZsYWdzKTsKKwlpZiAoc3RhdHVzKSB7CisJCS8qIFdlIGRvbid0IHdhbnQgdG8gY2FsbCB0aGUgZnVsbC1ibG93biBibF9mcmVlX2xzZWcsCisJCSAqIHNpbmNlIG9uIGVycm9yIGV4dGVudHMgd2VyZSBub3QgdG91Y2hlZC4KKwkJICovCisJCWtmcmVlKGxzZWcpOworCQlyZXR1cm4gRVJSX1BUUihzdGF0dXMpOworCX0KKwlyZXR1cm4gbHNlZzsKK30KKworc3RhdGljIHZvaWQKK2JsX2VuY29kZV9sYXlvdXRjb21taXQoc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG8sIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmZzNF9sYXlvdXRjb21taXRfYXJncyAqYXJnKQoreworCWRwcmludGsoIiVzIGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJZW5jb2RlX3BuZnNfYmxvY2tfbGF5b3V0dXBkYXRlKEJMS19MTzJFWFQobG8pLCB4ZHIsIGFyZyk7Cit9CisKK3N0YXRpYyB2b2lkCitibF9jbGVhbnVwX2xheW91dGNvbW1pdChzdHJ1Y3QgbmZzNF9sYXlvdXRjb21taXRfZGF0YSAqbGNkYXRhKQoreworCXN0cnVjdCBwbmZzX2xheW91dF9oZHIgKmxvID0gTkZTX0kobGNkYXRhLT5hcmdzLmlub2RlKS0+bGF5b3V0OworCisJZHByaW50aygiJXMgZW50ZXJcbiIsIF9fZnVuY19fKTsKKwljbGVhbl9wbmZzX2Jsb2NrX2xheW91dHVwZGF0ZShCTEtfTE8yRVhUKGxvKSwgJmxjZGF0YS0+YXJncywgbGNkYXRhLT5yZXMuc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQgZnJlZV9ibGtfbW91bnRpZChzdHJ1Y3QgYmxvY2tfbW91bnRfaWQgKm1pZCkKK3sKKwlpZiAobWlkKSB7CisJCXN0cnVjdCBwbmZzX2Jsb2NrX2RldiAqZGV2OworCQlzcGluX2xvY2soJm1pZC0+Ym1fbG9jayk7CisJCXdoaWxlICghbGlzdF9lbXB0eSgmbWlkLT5ibV9kZXZsaXN0KSkgeworCQkJZGV2ID0gbGlzdF9maXJzdF9lbnRyeSgmbWlkLT5ibV9kZXZsaXN0LAorCQkJCQkgICAgICAgc3RydWN0IHBuZnNfYmxvY2tfZGV2LAorCQkJCQkgICAgICAgYm1fbm9kZSk7CisJCQlsaXN0X2RlbCgmZGV2LT5ibV9ub2RlKTsKKwkJCWJsX2ZyZWVfYmxvY2tfZGV2KGRldik7CisJCX0KKwkJc3Bpbl91bmxvY2soJm1pZC0+Ym1fbG9jayk7CisJCWtmcmVlKG1pZCk7CisJfQorfQorCisvKiBUaGlzIGlzIG1vc3RseSBjb3BpZWQgZnJvbSB0aGUgZmlsZWxheW91dCdzIGdldF9kZXZpY2VfaW5mbyBmdW5jdGlvbi4KKyAqIEl0IHNlZW1zIG11Y2ggb2YgdGhpcyBzaG91bGQgYmUgYXQgdGhlIGdlbmVyaWMgcG5mcyBsZXZlbC4KKyAqLworc3RhdGljIHN0cnVjdCBwbmZzX2Jsb2NrX2RldiAqCituZnM0X2Jsa19nZXRfZGV2aWNlaW5mbyhzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBjb25zdCBzdHJ1Y3QgbmZzX2ZoICpmaCwKKwkJCXN0cnVjdCBuZnM0X2RldmljZWlkICpkX2lkKQoreworCXN0cnVjdCBwbmZzX2RldmljZSAqZGV2OworCXN0cnVjdCBwbmZzX2Jsb2NrX2RldiAqcnYgPSBOVUxMOworCXUzMiBtYXhfcmVzcF9zejsKKwlpbnQgbWF4X3BhZ2VzOworCXN0cnVjdCBwYWdlICoqcGFnZXMgPSBOVUxMOworCWludCBpLCByYzsKKworCS8qCisJICogVXNlIHRoZSBzZXNzaW9uIG1heCByZXNwb25zZSBzaXplIGFzIHRoZSBiYXNpcyBmb3Igc2V0dGluZworCSAqIEdFVERFVklDRUlORk8ncyBtYXhjb3VudAorCSAqLworCW1heF9yZXNwX3N6ID0gc2VydmVyLT5uZnNfY2xpZW50LT5jbF9zZXNzaW9uLT5mY19hdHRycy5tYXhfcmVzcF9zejsKKwltYXhfcGFnZXMgPSBtYXhfcmVzcF9zeiA+PiBQQUdFX1NISUZUOworCWRwcmludGsoIiVzIG1heF9yZXNwX3N6ICV1IG1heF9wYWdlcyAlZFxuIiwKKwkJX19mdW5jX18sIG1heF9yZXNwX3N6LCBtYXhfcGFnZXMpOworCisJZGV2ID0ga21hbGxvYyhzaXplb2YoKmRldiksIEdGUF9OT0ZTKTsKKwlpZiAoIWRldikgeworCQlkcHJpbnRrKCIlcyBrbWFsbG9jIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlwYWdlcyA9IGt6YWxsb2MobWF4X3BhZ2VzICogc2l6ZW9mKHN0cnVjdCBwYWdlICopLCBHRlBfTk9GUyk7CisJaWYgKHBhZ2VzID09IE5VTEwpIHsKKwkJa2ZyZWUoZGV2KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWZvciAoaSA9IDA7IGkgPCBtYXhfcGFnZXM7IGkrKykgeworCQlwYWdlc1tpXSA9IGFsbG9jX3BhZ2UoR0ZQX05PRlMpOworCQlpZiAoIXBhZ2VzW2ldKQorCQkJZ290byBvdXRfZnJlZTsKKwl9CisKKwltZW1jcHkoJmRldi0+ZGV2X2lkLCBkX2lkLCBzaXplb2YoKmRfaWQpKTsKKwlkZXYtPmxheW91dF90eXBlID0gTEFZT1VUX0JMT0NLX1ZPTFVNRTsKKwlkZXYtPnBhZ2VzID0gcGFnZXM7CisJZGV2LT5wZ2Jhc2UgPSAwOworCWRldi0+cGdsZW4gPSBQQUdFX1NJWkUgKiBtYXhfcGFnZXM7CisJZGV2LT5taW5jb3VudCA9IDA7CisKKwlkcHJpbnRrKCIlczogZGV2X2lkOiAlc1xuIiwgX19mdW5jX18sIGRldi0+ZGV2X2lkLmRhdGEpOworCXJjID0gbmZzNF9wcm9jX2dldGRldmljZWluZm8oc2VydmVyLCBkZXYpOworCWRwcmludGsoIiVzIGdldGRldmljZSBpbmZvIHJldHVybnMgJWRcbiIsIF9fZnVuY19fLCByYyk7CisJaWYgKHJjKQorCQlnb3RvIG91dF9mcmVlOworCisJcnYgPSBuZnM0X2Jsa19kZWNvZGVfZGV2aWNlKHNlcnZlciwgZGV2KTsKKyBvdXRfZnJlZToKKwlmb3IgKGkgPSAwOyBpIDwgbWF4X3BhZ2VzOyBpKyspCisJCV9fZnJlZV9wYWdlKHBhZ2VzW2ldKTsKKwlrZnJlZShwYWdlcyk7CisJa2ZyZWUoZGV2KTsKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBpbnQKK2JsX3NldF9sYXlvdXRkcml2ZXIoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwgY29uc3Qgc3RydWN0IG5mc19maCAqZmgpCit7CisJc3RydWN0IGJsb2NrX21vdW50X2lkICpiX210X2lkID0gTlVMTDsKKwlzdHJ1Y3QgcG5mc19kZXZpY2VsaXN0ICpkbGlzdCA9IE5VTEw7CisJc3RydWN0IHBuZnNfYmxvY2tfZGV2ICpiZGV2OworCUxJU1RfSEVBRChibG9ja19kaXNrbGlzdCk7CisJaW50IHN0YXR1cyA9IDAsIGk7CisKKwlkcHJpbnRrKCIlcyBlbnRlclxuIiwgX19mdW5jX18pOworCisJaWYgKHNlcnZlci0+cG5mc19ibGtzaXplID09IDApIHsKKwkJZHByaW50aygiJXMgU2VydmVyIGRpZCBub3QgcmV0dXJuIGJsa3NpemVcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWJfbXRfaWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYmxvY2tfbW91bnRfaWQpLCBHRlBfTk9GUyk7CisJaWYgKCFiX210X2lkKSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2Vycm9yOworCX0KKwkvKiBJbml0aWFsaXplIG5mczQgYmxvY2sgbGF5b3V0IG1vdW50IGlkICovCisJc3Bpbl9sb2NrX2luaXQoJmJfbXRfaWQtPmJtX2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZiX210X2lkLT5ibV9kZXZsaXN0KTsKKworCWRsaXN0ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBuZnNfZGV2aWNlbGlzdCksIEdGUF9OT0ZTKTsKKwlpZiAoIWRsaXN0KSB7CisJCXN0YXR1cyA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2Vycm9yOworCX0KKwlkbGlzdC0+ZW9mID0gMDsKKwl3aGlsZSAoIWRsaXN0LT5lb2YpIHsKKwkJc3RhdHVzID0gbmZzNF9wcm9jX2dldGRldmljZWxpc3Qoc2VydmVyLCBmaCwgZGxpc3QpOworCQlpZiAoc3RhdHVzKQorCQkJZ290byBvdXRfZXJyb3I7CisJCWRwcmludGsoIiVzIEdFVERFVklDRUxJU1QgbnVtZGV2cz0laSwgZW9mPSVpXG4iLAorCQkJX19mdW5jX18sIGRsaXN0LT5udW1fZGV2cywgZGxpc3QtPmVvZik7CisJCWZvciAoaSA9IDA7IGkgPCBkbGlzdC0+bnVtX2RldnM7IGkrKykgeworCQkJYmRldiA9IG5mczRfYmxrX2dldF9kZXZpY2VpbmZvKHNlcnZlciwgZmgsCisJCQkJCQkgICAgICAgJmRsaXN0LT5kZXZfaWRbaV0pOworCQkJaWYgKCFiZGV2KSB7CisJCQkJc3RhdHVzID0gLUVOT0RFVjsKKwkJCQlnb3RvIG91dF9lcnJvcjsKKwkJCX0KKwkJCXNwaW5fbG9jaygmYl9tdF9pZC0+Ym1fbG9jayk7CisJCQlsaXN0X2FkZCgmYmRldi0+Ym1fbm9kZSwgJmJfbXRfaWQtPmJtX2Rldmxpc3QpOworCQkJc3Bpbl91bmxvY2soJmJfbXRfaWQtPmJtX2xvY2spOworCQl9CisJfQorCWRwcmludGsoIiVzIFNVQ0NFU1NcbiIsIF9fZnVuY19fKTsKKwlzZXJ2ZXItPnBuZnNfbGRfZGF0YSA9IGJfbXRfaWQ7CisKKyBvdXRfcmV0dXJuOgorCWtmcmVlKGRsaXN0KTsKKwlyZXR1cm4gc3RhdHVzOworCisgb3V0X2Vycm9yOgorCWZyZWVfYmxrX21vdW50aWQoYl9tdF9pZCk7CisJZ290byBvdXRfcmV0dXJuOworfQorCitzdGF0aWMgaW50CitibF9jbGVhcl9sYXlvdXRkcml2ZXIoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlcikKK3sKKwlzdHJ1Y3QgYmxvY2tfbW91bnRfaWQgKmJfbXRfaWQgPSBzZXJ2ZXItPnBuZnNfbGRfZGF0YTsKKworCWRwcmludGsoIiVzIGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJZnJlZV9ibGtfbW91bnRpZChiX210X2lkKTsKKwlkcHJpbnRrKCIlcyBSRVRVUk5TXG4iLCBfX2Z1bmNfXyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmZzX3BhZ2Vpb19vcHMgYmxfcGdfcmVhZF9vcHMgPSB7CisJLnBnX2luaXQgPSBwbmZzX2dlbmVyaWNfcGdfaW5pdF9yZWFkLAorCS5wZ190ZXN0ID0gcG5mc19nZW5lcmljX3BnX3Rlc3QsCisJLnBnX2RvaW8gPSBwbmZzX2dlbmVyaWNfcGdfcmVhZHBhZ2VzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZnNfcGFnZWlvX29wcyBibF9wZ193cml0ZV9vcHMgPSB7CisJLnBnX2luaXQgPSBwbmZzX2dlbmVyaWNfcGdfaW5pdF93cml0ZSwKKwkucGdfdGVzdCA9IHBuZnNfZ2VuZXJpY19wZ190ZXN0LAorCS5wZ19kb2lvID0gcG5mc19nZW5lcmljX3BnX3dyaXRlcGFnZXMsCit9OworCitzdGF0aWMgc3RydWN0IHBuZnNfbGF5b3V0ZHJpdmVyX3R5cGUgYmxvY2tsYXlvdXRfdHlwZSA9IHsKKwkuaWQJCQkJPSBMQVlPVVRfQkxPQ0tfVk9MVU1FLAorCS5uYW1lCQkJCT0gIkxBWU9VVF9CTE9DS19WT0xVTUUiLAorCS5yZWFkX3BhZ2VsaXN0CQkJPSBibF9yZWFkX3BhZ2VsaXN0LAorCS53cml0ZV9wYWdlbGlzdAkJCT0gYmxfd3JpdGVfcGFnZWxpc3QsCisJLmFsbG9jX2xheW91dF9oZHIJCT0gYmxfYWxsb2NfbGF5b3V0X2hkciwKKwkuZnJlZV9sYXlvdXRfaGRyCQk9IGJsX2ZyZWVfbGF5b3V0X2hkciwKKwkuYWxsb2NfbHNlZwkJCT0gYmxfYWxsb2NfbHNlZywKKwkuZnJlZV9sc2VnCQkJPSBibF9mcmVlX2xzZWcsCisJLmVuY29kZV9sYXlvdXRjb21taXQJCT0gYmxfZW5jb2RlX2xheW91dGNvbW1pdCwKKwkuY2xlYW51cF9sYXlvdXRjb21taXQJCT0gYmxfY2xlYW51cF9sYXlvdXRjb21taXQsCisJLnNldF9sYXlvdXRkcml2ZXIJCT0gYmxfc2V0X2xheW91dGRyaXZlciwKKwkuY2xlYXJfbGF5b3V0ZHJpdmVyCQk9IGJsX2NsZWFyX2xheW91dGRyaXZlciwKKwkucGdfcmVhZF9vcHMJCQk9ICZibF9wZ19yZWFkX29wcywKKwkucGdfd3JpdGVfb3BzCQkJPSAmYmxfcGdfd3JpdGVfb3BzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBycGNfcGlwZV9vcHMgYmxfdXBjYWxsX29wcyA9IHsKKwkudXBjYWxsCQk9IGJsX3BpcGVfdXBjYWxsLAorCS5kb3duY2FsbAk9IGJsX3BpcGVfZG93bmNhbGwsCisJLmRlc3Ryb3lfbXNnCT0gYmxfcGlwZV9kZXN0cm95X21zZywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG5mczRibG9ja2xheW91dF9pbml0KHZvaWQpCit7CisJc3RydWN0IHZmc21vdW50ICptbnQ7CisJc3RydWN0IHBhdGggcGF0aDsKKwlpbnQgcmV0OworCisJZHByaW50aygiJXM6IE5GU3Y0IEJsb2NrIExheW91dCBEcml2ZXIgUmVnaXN0ZXJpbmcuLi5cbiIsIF9fZnVuY19fKTsKKworCXJldCA9IHBuZnNfcmVnaXN0ZXJfbGF5b3V0ZHJpdmVyKCZibG9ja2xheW91dF90eXBlKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmJsX3dxKTsKKworCW1udCA9IHJwY19nZXRfbW91bnQoKTsKKwlpZiAoSVNfRVJSKG1udCkpIHsKKwkJcmV0ID0gUFRSX0VSUihtbnQpOworCQlnb3RvIG91dF9yZW1vdmU7CisJfQorCisJcmV0ID0gdmZzX3BhdGhfbG9va3VwKG1udC0+bW50X3Jvb3QsCisJCQkgICAgICBtbnQsCisJCQkgICAgICBORlNfUElQRV9ESVJOQU1FLCAwLCAmcGF0aCk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfcmVtb3ZlOworCisJYmxfZGV2aWNlX3BpcGUgPSBycGNfbWtwaXBlKHBhdGguZGVudHJ5LCAiYmxvY2tsYXlvdXQiLCBOVUxMLAorCQkJCSAgICAmYmxfdXBjYWxsX29wcywgMCk7CisJaWYgKElTX0VSUihibF9kZXZpY2VfcGlwZSkpIHsKKwkJcmV0ID0gUFRSX0VSUihibF9kZXZpY2VfcGlwZSk7CisJCWdvdG8gb3V0X3JlbW92ZTsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKKworb3V0X3JlbW92ZToKKwlwbmZzX3VucmVnaXN0ZXJfbGF5b3V0ZHJpdmVyKCZibG9ja2xheW91dF90eXBlKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgbmZzNGJsb2NrbGF5b3V0X2V4aXQodm9pZCkKK3sKKwlkcHJpbnRrKCIlczogTkZTdjQgQmxvY2sgTGF5b3V0IERyaXZlciBVbnJlZ2lzdGVyaW5nLi4uXG4iLAorCSAgICAgICBfX2Z1bmNfXyk7CisKKwlwbmZzX3VucmVnaXN0ZXJfbGF5b3V0ZHJpdmVyKCZibG9ja2xheW91dF90eXBlKTsKKwlycGNfdW5saW5rKGJsX2RldmljZV9waXBlKTsKK30KKworTU9EVUxFX0FMSUFTKCJuZnMtbGF5b3V0dHlwZTQtMyIpOworCittb2R1bGVfaW5pdChuZnM0YmxvY2tsYXlvdXRfaW5pdCk7Cittb2R1bGVfZXhpdChuZnM0YmxvY2tsYXlvdXRfZXhpdCk7CmRpZmYgLS1naXQgYS9mcy9uZnMvYmxvY2tsYXlvdXQvYmxvY2tsYXlvdXQuaCBiL2ZzL25mcy9ibG9ja2xheW91dC9ibG9ja2xheW91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyN2Q4MjcKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnMvYmxvY2tsYXlvdXQvYmxvY2tsYXlvdXQuaApAQCAtMCwwICsxLDIwNyBAQAorLyoKKyAqICBsaW51eC9mcy9uZnMvYmxvY2tsYXlvdXQvYmxvY2tsYXlvdXQuaAorICoKKyAqICBNb2R1bGUgZm9yIHRoZSBORlN2NC4xIHBORlMgYmxvY2sgbGF5b3V0IGRyaXZlci4KKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuLgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIEFuZHkgQWRhbXNvbiA8YW5kcm9zQGNpdGkudW1pY2guZWR1PgorICogIEZyZWQgSXNhbWFuIDxpaXNhbWFuQHVtaWNoLmVkdT4KKyAqCisgKiBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gdXNlLCBjb3B5LCBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBhbmQKKyAqIHJlZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MgZm9yIGFueSBwdXJwb3NlLAorICogc28gbG9uZyBhcyB0aGUgbmFtZSBvZiB0aGUgdW5pdmVyc2l0eSBvZiBtaWNoaWdhbiBpcyBub3QgdXNlZCBpbgorICogYW55IGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIHRoZSB1c2Ugb3IgZGlzdHJpYnV0aW9uCisgKiBvZiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgYXV0aG9yaXphdGlvbi4gIGlmCisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBvciBhbnkgb3RoZXIgaWRlbnRpZmljYXRpb24gb2YgdGhlCisgKiB1bml2ZXJzaXR5IG9mIG1pY2hpZ2FuIGlzIGluY2x1ZGVkIGluIGFueSBjb3B5IG9mIGFueSBwb3J0aW9uIG9mCisgKiB0aGlzIHNvZnR3YXJlLCB0aGVuIHRoZSBkaXNjbGFpbWVyIGJlbG93IG11c3QgYWxzbyBiZSBpbmNsdWRlZC4KKyAqCisgKiB0aGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGFzIGlzLCB3aXRob3V0IHJlcHJlc2VudGF0aW9uIGZyb20gdGhlCisgKiB1bml2ZXJzaXR5IG9mIG1pY2hpZ2FuIGFzIHRvIGl0cyBmaXRuZXNzIGZvciBhbnkgcHVycG9zZSwgYW5kIHdpdGhvdXQKKyAqIHdhcnJhbnR5IGJ5IHRoZSB1bml2ZXJzaXR5IG9mIG1pY2hpZ2FuIG9mIGFueSBraW5kLCBlaXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZCwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mCisgKiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiAgdGhlIHJlZ2VudHMKKyAqIG9mIHRoZSB1bml2ZXJzaXR5IG9mIG1pY2hpZ2FuIHNoYWxsIG5vdCBiZSBsaWFibGUgZm9yIGFueSBkYW1hZ2VzLAorICogaW5jbHVkaW5nIHNwZWNpYWwsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCisgKiB3aXRoIHJlc3BlY3QgdG8gYW55IGNsYWltIGFyaXNpbmcgb3V0IG9yIGluIGNvbm5lY3Rpb24gd2l0aCB0aGUgdXNlCisgKiBvZiB0aGUgc29mdHdhcmUsIGV2ZW4gaWYgaXQgaGFzIGJlZW4gb3IgaXMgaGVyZWFmdGVyIGFkdmlzZWQgb2YgdGhlCisgKiBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisgKi8KKyNpZm5kZWYgRlNfTkZTX05GUzRCTE9DS0xBWU9VVF9ICisjZGVmaW5lIEZTX05GU19ORlM0QkxPQ0tMQVlPVVRfSAorCisjaW5jbHVkZSA8bGludXgvZGV2aWNlLW1hcHBlci5oPgorI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9ycGNfcGlwZV9mcy5oPgorCisjaW5jbHVkZSAiLi4vcG5mcy5oIgorCisjZGVmaW5lIFBBR0VfQ0FDSEVfU0VDVE9SUyAoUEFHRV9DQUNIRV9TSVpFID4+IFNFQ1RPUl9TSElGVCkKKyNkZWZpbmUgUEFHRV9DQUNIRV9TRUNUT1JfU0hJRlQgKFBBR0VfQ0FDSEVfU0hJRlQgLSBTRUNUT1JfU0hJRlQpCisKK3N0cnVjdCBibG9ja19tb3VudF9pZCB7CisJc3BpbmxvY2tfdAkJCWJtX2xvY2s7ICAgIC8qIHByb3RlY3RzIGxpc3QgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCQlibV9kZXZsaXN0OyAvKiBob2xkcyBwbmZzX2Jsb2NrX2RldiAqLworfTsKKworc3RydWN0IHBuZnNfYmxvY2tfZGV2IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQlibV9ub2RlOworCXN0cnVjdCBuZnM0X2RldmljZWlkCQlibV9tZGV2aWQ7ICAgIC8qIGFzc29jaWF0ZWQgZGV2aWQgKi8KKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlCQkqYm1fbWRldjsgICAgIC8qIG1ldGEgZGV2aWNlIGl0c2VsZiAqLworfTsKKworZW51bSBleHN0YXRlNCB7CisJUE5GU19CTE9DS19SRUFEV1JJVEVfREFUQQk9IDAsCisJUE5GU19CTE9DS19SRUFEX0RBVEEJCT0gMSwKKwlQTkZTX0JMT0NLX0lOVkFMSURfREFUQQkJPSAyLCAvKiBtYXBwZWQsIGJ1dCBkYXRhIGlzIGludmFsaWQgKi8KKwlQTkZTX0JMT0NLX05PTkVfREFUQQkJPSAzICAvKiB1bm1hcHBlZCwgaXQncyBhIGhvbGUgKi8KK307CisKKyNkZWZpbmUgTVlfTUFYX1RBR1MgKDE1KSAvKiB0YWcgYml0bnVtcyB1c2VkIG11c3QgYmUgbGVzcyB0aGFuIHRoaXMgKi8KKworc3RydWN0IG15X3RyZWUgeworCXNlY3Rvcl90CQltdHRfc3RlcF9zaXplOwkvKiBJbnRlcm5hbCBzZWN0b3IgYWxpZ25tZW50ICovCisJc3RydWN0IGxpc3RfaGVhZAltdHRfc3R1YjsgLyogU2hvdWxkIGJlIGEgcmFkaXggdHJlZSAqLworfTsKKworc3RydWN0IHBuZnNfaW52YWxfbWFya2luZ3MgeworCXNwaW5sb2NrX3QJaW1fbG9jazsKKwlzdHJ1Y3QgbXlfdHJlZQlpbV90cmVlOwkvKiBTZWN0b3JzIHRoYXQgbmVlZCBMQVlPVVRDT01NSVQgKi8KKwlzZWN0b3JfdAlpbV9ibG9ja19zaXplOwkvKiBTZXJ2ZXIgYmxvY2tzaXplIGluIHNlY3RvcnMgKi8KK307CisKK3N0cnVjdCBwbmZzX2ludmFsX3RyYWNraW5nIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGl0X2xpbms7CisJaW50CQkgaXRfc2VjdG9yOworCWludAkJIGl0X3RhZ3M7Cit9OworCisvKiBzZWN0b3JfdCBmaWVsZHMgYXJlIGFsbCBpbiA1MTItYnl0ZSBzZWN0b3JzICovCitzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgeworCXN0cnVjdCBrcmVmCWJlX3JlZmNudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGJlX25vZGU7CS8qIGxpbmsgaW50byBsc2VnIGxpc3QgKi8KKwlzdHJ1Y3QgbmZzNF9kZXZpY2VpZCBiZV9kZXZpZDsgIC8qIEZJWE1FOiBjb3VsZCB1c2UgZGV2aWNlIGNhY2hlIGluc3RlYWQgKi8KKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZV9tZGV2OworCXNlY3Rvcl90CWJlX2Zfb2Zmc2V0OwkvKiB0aGUgc3RhcnRpbmcgb2Zmc2V0IGluIHRoZSBmaWxlICovCisJc2VjdG9yX3QJYmVfbGVuZ3RoOwkvKiB0aGUgc2l6ZSBvZiB0aGUgZXh0ZW50ICovCisJc2VjdG9yX3QJYmVfdl9vZmZzZXQ7CS8qIHRoZSBzdGFydGluZyBvZmZzZXQgaW4gdGhlIHZvbHVtZSAqLworCWVudW0gZXhzdGF0ZTQJYmVfc3RhdGU7CS8qIHRoZSBzdGF0ZSBvZiB0aGlzIGV4dGVudCAqLworCXN0cnVjdCBwbmZzX2ludmFsX21hcmtpbmdzICpiZV9pbnZhbDsgLyogdHJhY2tzIElOVkFMLT5SVyB0cmFuc2l0aW9uICovCit9OworCisvKiBTaG9ydGVuZWQgZXh0ZW50IHVzZWQgYnkgTEFZT1VUQ09NTUlUICovCitzdHJ1Y3QgcG5mc19ibG9ja19zaG9ydF9leHRlbnQgeworCXN0cnVjdCBsaXN0X2hlYWQgYnNlX25vZGU7CisJc3RydWN0IG5mczRfZGV2aWNlaWQgYnNlX2RldmlkOworCXN0cnVjdCBibG9ja19kZXZpY2UgKmJzZV9tZGV2OworCXNlY3Rvcl90CWJzZV9mX29mZnNldDsJLyogdGhlIHN0YXJ0aW5nIG9mZnNldCBpbiB0aGUgZmlsZSAqLworCXNlY3Rvcl90CWJzZV9sZW5ndGg7CS8qIHRoZSBzaXplIG9mIHRoZSBleHRlbnQgKi8KK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorQkxfSU5JVF9JTlZBTF9NQVJLUyhzdHJ1Y3QgcG5mc19pbnZhbF9tYXJraW5ncyAqbWFya3MsIHNlY3Rvcl90IGJsb2Nrc2l6ZSkKK3sKKwlzcGluX2xvY2tfaW5pdCgmbWFya3MtPmltX2xvY2spOworCUlOSVRfTElTVF9IRUFEKCZtYXJrcy0+aW1fdHJlZS5tdHRfc3R1Yik7CisJbWFya3MtPmltX2Jsb2NrX3NpemUgPSBibG9ja3NpemU7CisJbWFya3MtPmltX3RyZWUubXR0X3N0ZXBfc2l6ZSA9IG1pbigoc2VjdG9yX3QpUEFHRV9DQUNIRV9TRUNUT1JTLAorCQkJCQkgICBibG9ja3NpemUpOworfQorCitlbnVtIGV4dGVudGNsYXNzNCB7CisJUldfRVhURU5UICAgICAgID0gMCwgLyogUkVBRFdSVEUgYW5kIElOVkFMICovCisJUk9fRVhURU5UICAgICAgID0gMSwgLyogUkVBRCBhbmQgTk9ORSAqLworCUVYVEVOVF9MSVNUUyAgICA9IDIsCit9OworCitzdGF0aWMgaW5saW5lIGludCBibF9jaG9vc2VfbGlzdChlbnVtIGV4c3RhdGU0IHN0YXRlKQoreworCWlmIChzdGF0ZSA9PSBQTkZTX0JMT0NLX1JFQURfREFUQSB8fCBzdGF0ZSA9PSBQTkZTX0JMT0NLX05PTkVfREFUQSkKKwkJcmV0dXJuIFJPX0VYVEVOVDsKKwllbHNlCisJCXJldHVybiBSV19FWFRFTlQ7Cit9CisKK3N0cnVjdCBwbmZzX2Jsb2NrX2xheW91dCB7CisJc3RydWN0IHBuZnNfbGF5b3V0X2hkciBibF9sYXlvdXQ7CisJc3RydWN0IHBuZnNfaW52YWxfbWFya2luZ3MgYmxfaW52YWw7IC8qIHRyYWNrcyBJTlZBTC0+UlcgdHJhbnNpdGlvbiAqLworCXNwaW5sb2NrX3QJCWJsX2V4dF9sb2NrOyAgIC8qIFByb3RlY3RzIGxpc3QgbWFuaXB1bGF0aW9uICovCisJc3RydWN0IGxpc3RfaGVhZAlibF9leHRlbnRzW0VYVEVOVF9MSVNUU107IC8qIFIgYW5kIFJXIGV4dGVudHMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWJsX2NvbW1pdDsJLyogTmVlZHMgbGF5b3V0IGNvbW1pdCAqLworCXN0cnVjdCBsaXN0X2hlYWQJYmxfY29tbWl0dGluZzsJLyogTGF5b3V0IGNvbW1pdHRpbmcgKi8KKwl1bnNpZ25lZCBpbnQJCWJsX2NvdW50OwkvKiBlbnRyaWVzIGluIGJsX2NvbW1pdCAqLworCXNlY3Rvcl90CQlibF9ibG9ja3NpemU7ICAvKiBTZXJ2ZXIgYmxvY2tzaXplIGluIHNlY3RvcnMgKi8KK307CisKKyNkZWZpbmUgQkxLX0lEKGxvKSAoKHN0cnVjdCBibG9ja19tb3VudF9pZCAqKShORlNfU0VSVkVSKGxvLT5wbGhfaW5vZGUpLT5wbmZzX2xkX2RhdGEpKQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwbmZzX2Jsb2NrX2xheW91dCAqCitCTEtfTE8yRVhUKHN0cnVjdCBwbmZzX2xheW91dF9oZHIgKmxvKQoreworCXJldHVybiBjb250YWluZXJfb2YobG8sIHN0cnVjdCBwbmZzX2Jsb2NrX2xheW91dCwgYmxfbGF5b3V0KTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcG5mc19ibG9ja19sYXlvdXQgKgorQkxLX0xTRUcyRVhUKHN0cnVjdCBwbmZzX2xheW91dF9zZWdtZW50ICpsc2VnKQoreworCXJldHVybiBCTEtfTE8yRVhUKGxzZWctPnBsc19sYXlvdXQpOworfQorCitzdHJ1Y3QgYmxfZGV2X21zZyB7CisJaW50IHN0YXR1czsKKwl1aW50MzJfdCBtYWpvciwgbWlub3I7Cit9OworCitzdHJ1Y3QgYmxfbXNnX2hkciB7CisJdTggIHR5cGU7CisJdTE2IHRvdGFsbGVuOyAvKiBsZW5ndGggb2YgZW50aXJlIG1lc3NhZ2UsIGluY2x1ZGluZyBoZHIgaXRzZWxmICovCit9OworCitleHRlcm4gc3RydWN0IGRlbnRyeSAqYmxfZGV2aWNlX3BpcGU7CitleHRlcm4gd2FpdF9xdWV1ZV9oZWFkX3QgYmxfd3E7CisKKyNkZWZpbmUgQkxfREVWSUNFX1VNT1VOVCAgICAgICAgICAgICAgIDB4MCAvKiBVbW91bnQtLWRlbGV0ZSBkZXZpY2VzICovCisjZGVmaW5lIEJMX0RFVklDRV9NT1VOVCAgICAgICAgICAgICAgICAweDEgLyogTW91bnQtLWNyZWF0ZSBkZXZpY2VzKi8KKyNkZWZpbmUgQkxfREVWSUNFX1JFUVVFU1RfSU5JVCAgICAgICAgIDB4MCAvKiBTdGFydCByZXF1ZXN0ICovCisjZGVmaW5lIEJMX0RFVklDRV9SRVFVRVNUX1BST0MgICAgICAgICAweDEgLyogVXNlciBsZXZlbCBwcm9jZXNzIHN1Y2NlZWRzICovCisjZGVmaW5lIEJMX0RFVklDRV9SRVFVRVNUX0VSUiAgICAgICAgICAweDIgLyogVXNlciBsZXZlbCBwcm9jZXNzIGZhaWxzICovCisKKy8qIGJsb2NrbGF5b3V0ZGV2LmMgKi8KK3NzaXplX3QgYmxfcGlwZV91cGNhbGwoc3RydWN0IGZpbGUgKiwgc3RydWN0IHJwY19waXBlX21zZyAqLAorCQkgICAgICAgY2hhciBfX3VzZXIgKiwgc2l6ZV90KTsKK3NzaXplX3QgYmxfcGlwZV9kb3duY2FsbChzdHJ1Y3QgZmlsZSAqLCBjb25zdCBjaGFyIF9fdXNlciAqLCBzaXplX3QpOwordm9pZCBibF9waXBlX2Rlc3Ryb3lfbXNnKHN0cnVjdCBycGNfcGlwZV9tc2cgKik7CitzdHJ1Y3QgYmxvY2tfZGV2aWNlICpuZnM0X2Jsa2Rldl9nZXQoZGV2X3QgZGV2KTsKK2ludCBuZnM0X2Jsa2Rldl9wdXQoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldik7CitzdHJ1Y3QgcG5mc19ibG9ja19kZXYgKm5mczRfYmxrX2RlY29kZV9kZXZpY2Uoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwKKwkJCQkJCXN0cnVjdCBwbmZzX2RldmljZSAqZGV2KTsKK2ludCBuZnM0X2Jsa19wcm9jZXNzX2xheW91dGdldChzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbywKKwkJCQlzdHJ1Y3QgbmZzNF9sYXlvdXRnZXRfcmVzICpsZ3IsIGdmcF90IGdmcF9mbGFncyk7CisKKy8qIGJsb2NrbGF5b3V0ZG0uYyAqLwordm9pZCBibF9mcmVlX2Jsb2NrX2RldihzdHJ1Y3QgcG5mc19ibG9ja19kZXYgKmJkZXYpOworCisvKiBleHRlbnRzLmMgKi8KK3N0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCAqCitibF9maW5kX2dldF9leHRlbnQoc3RydWN0IHBuZnNfYmxvY2tfbGF5b3V0ICpibCwgc2VjdG9yX3QgaXNlY3QsCisJCXN0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCAqKmNvd19yZWFkKTsKK2ludCBibF9tYXJrX3NlY3RvcnNfaW5pdChzdHJ1Y3QgcG5mc19pbnZhbF9tYXJraW5ncyAqbWFya3MsCisJCQkgICAgIHNlY3Rvcl90IG9mZnNldCwgc2VjdG9yX3QgbGVuZ3RoLAorCQkJICAgICBzZWN0b3JfdCAqKnBhZ2VzKTsKK3ZvaWQgYmxfcHV0X2V4dGVudChzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKmJlKTsKK3N0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCAqYmxfYWxsb2NfZXh0ZW50KHZvaWQpOworaW50IGJsX2lzX3NlY3Rvcl9pbml0KHN0cnVjdCBwbmZzX2ludmFsX21hcmtpbmdzICptYXJrcywgc2VjdG9yX3QgaXNlY3QpOworaW50IGVuY29kZV9wbmZzX2Jsb2NrX2xheW91dHVwZGF0ZShzdHJ1Y3QgcG5mc19ibG9ja19sYXlvdXQgKmJsLAorCQkJCSAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgY29uc3Qgc3RydWN0IG5mczRfbGF5b3V0Y29tbWl0X2FyZ3MgKmFyZyk7Cit2b2lkIGNsZWFuX3BuZnNfYmxvY2tfbGF5b3V0dXBkYXRlKHN0cnVjdCBwbmZzX2Jsb2NrX2xheW91dCAqYmwsCisJCQkJICAgY29uc3Qgc3RydWN0IG5mczRfbGF5b3V0Y29tbWl0X2FyZ3MgKmFyZywKKwkJCQkgICBpbnQgc3RhdHVzKTsKK2ludCBibF9hZGRfbWVyZ2VfZXh0ZW50KHN0cnVjdCBwbmZzX2Jsb2NrX2xheW91dCAqYmwsCisJCQkgc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50ICpuZXcpOworaW50IGJsX21hcmtfZm9yX2NvbW1pdChzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKmJlLAorCQkJc2VjdG9yX3Qgb2Zmc2V0LCBzZWN0b3JfdCBsZW5ndGgpOworCisjZW5kaWYgLyogRlNfTkZTX05GUzRCTE9DS0xBWU9VVF9IICovCmRpZmYgLS1naXQgYS9mcy9uZnMvYmxvY2tsYXlvdXQvYmxvY2tsYXlvdXRkZXYuYyBiL2ZzL25mcy9ibG9ja2xheW91dC9ibG9ja2xheW91dGRldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4M2IzOTMKLS0tIC9kZXYvbnVsbAorKysgYi9mcy9uZnMvYmxvY2tsYXlvdXQvYmxvY2tsYXlvdXRkZXYuYwpAQCAtMCwwICsxLDQxMCBAQAorLyoKKyAqICBsaW51eC9mcy9uZnMvYmxvY2tsYXlvdXQvYmxvY2tsYXlvdXRkZXYuYworICoKKyAqICBEZXZpY2Ugb3BlcmF0aW9ucyBmb3IgdGhlIHBuZnMgbmZzNCBmaWxlIGxheW91dCBkcml2ZXIuCisgKgorICogIENvcHlyaWdodCAoYykgMjAwNiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBNaWNoaWdhbi4KKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqICBBbmR5IEFkYW1zb24gPGFuZHJvc0BjaXRpLnVtaWNoLmVkdT4KKyAqICBGcmVkIElzYW1hbiA8aWlzYW1hbkB1bWljaC5lZHU+CisgKgorICogcGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHVzZSwgY29weSwgY3JlYXRlIGRlcml2YXRpdmUgd29ya3MgYW5kCisgKiByZWRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzIGZvciBhbnkgcHVycG9zZSwKKyAqIHNvIGxvbmcgYXMgdGhlIG5hbWUgb2YgdGhlIHVuaXZlcnNpdHkgb2YgbWljaGlnYW4gaXMgbm90IHVzZWQgaW4KKyAqIGFueSBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byB0aGUgdXNlIG9yIGRpc3RyaWJ1dGlvbgorICogb2YgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIGF1dGhvcml6YXRpb24uICBpZgorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2Ugb3IgYW55IG90aGVyIGlkZW50aWZpY2F0aW9uIG9mIHRoZQorICogdW5pdmVyc2l0eSBvZiBtaWNoaWdhbiBpcyBpbmNsdWRlZCBpbiBhbnkgY29weSBvZiBhbnkgcG9ydGlvbiBvZgorICogdGhpcyBzb2Z0d2FyZSwgdGhlbiB0aGUgZGlzY2xhaW1lciBiZWxvdyBtdXN0IGFsc28gYmUgaW5jbHVkZWQuCisgKgorICogdGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBhcyBpcywgd2l0aG91dCByZXByZXNlbnRhdGlvbiBmcm9tIHRoZQorICogdW5pdmVyc2l0eSBvZiBtaWNoaWdhbiBhcyB0byBpdHMgZml0bmVzcyBmb3IgYW55IHB1cnBvc2UsIGFuZCB3aXRob3V0CisgKiB3YXJyYW50eSBieSB0aGUgdW5pdmVyc2l0eSBvZiBtaWNoaWdhbiBvZiBhbnkga2luZCwgZWl0aGVyIGV4cHJlc3MKKyAqIG9yIGltcGxpZWQsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIGltcGxpZWQgd2FycmFudGllcyBvZgorICogbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZS4gIHRoZSByZWdlbnRzCisgKiBvZiB0aGUgdW5pdmVyc2l0eSBvZiBtaWNoaWdhbiBzaGFsbCBub3QgYmUgbGlhYmxlIGZvciBhbnkgZGFtYWdlcywKKyAqIGluY2x1ZGluZyBzcGVjaWFsLCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzLAorICogd2l0aCByZXNwZWN0IHRvIGFueSBjbGFpbSBhcmlzaW5nIG91dCBvciBpbiBjb25uZWN0aW9uIHdpdGggdGhlIHVzZQorICogb2YgdGhlIHNvZnR3YXJlLCBldmVuIGlmIGl0IGhhcyBiZWVuIG9yIGlzIGhlcmVhZnRlciBhZHZpc2VkIG9mIHRoZQorICogcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYnVmZmVyX2hlYWQuaD4gLyogX19icmVhZCAqLworCisjaW5jbHVkZSA8bGludXgvZ2VuaGQuaD4KKyNpbmNsdWRlIDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXNoLmg+CisKKyNpbmNsdWRlICJibG9ja2xheW91dC5oIgorCisjZGVmaW5lIE5GU0RCR19GQUNJTElUWSAgICAgICAgIE5GU0RCR19QTkZTX0xECisKK3N0YXRpYyBpbnQgZGVjb2RlX3NlY3Rvcl9udW1iZXIoX19iZTMyICoqcnAsIHNlY3Rvcl90ICpzcCkKK3sKKwl1aW50NjRfdCBzOworCisJKnJwID0geGRyX2RlY29kZV9oeXBlcigqcnAsICZzKTsKKwlpZiAocyAmIDB4MWZmKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBzZWN0b3Igbm90IGFsaWduZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIC0xOworCX0KKwkqc3AgPSBzID4+IFNFQ1RPUl9TSElGVDsKKwlyZXR1cm4gMDsKK30KKworLyogT3BlbiBhIGJsb2NrX2RldmljZSBieSBkZXZpY2UgbnVtYmVyLiAqLworc3RydWN0IGJsb2NrX2RldmljZSAqbmZzNF9ibGtkZXZfZ2V0KGRldl90IGRldikKK3sKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZDsKKworCWRwcmludGsoIiVzIGVudGVyXG4iLCBfX2Z1bmNfXyk7CisJYmQgPSBibGtkZXZfZ2V0X2J5X2RldihkZXYsIEZNT0RFX1JFQUQsIE5VTEwpOworCWlmIChJU19FUlIoYmQpKQorCQlnb3RvIGZhaWw7CisJcmV0dXJuIGJkOworZmFpbDoKKwlkcHJpbnRrKCIlcyBmYWlsZWQgdG8gb3BlbiBkZXZpY2UgOiAlbGRcbiIsCisJCQlfX2Z1bmNfXywgUFRSX0VSUihiZCkpOworCXJldHVybiBOVUxMOworfQorCisvKgorICogUmVsZWFzZSB0aGUgYmxvY2sgZGV2aWNlCisgKi8KK2ludCBuZnM0X2Jsa2Rldl9wdXQoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3sKKwlkcHJpbnRrKCIlcyBmb3IgZGV2aWNlICVkOiVkXG4iLCBfX2Z1bmNfXywgTUFKT1IoYmRldi0+YmRfZGV2KSwKKwkJCU1JTk9SKGJkZXYtPmJkX2RldikpOworCXJldHVybiBibGtkZXZfcHV0KGJkZXYsIEZNT0RFX1JFQUQpOworfQorCisvKgorICogU2hvdWxkbid0IHRoZXJlIGJlIGEgcnBjX2dlbmVyaWNfdXBjYWxsKCkgdG8gZG8gdGhpcyBmb3IgdXM/CisgKi8KK3NzaXplX3QgYmxfcGlwZV91cGNhbGwoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBycGNfcGlwZV9tc2cgKm1zZywKKwkJICAgICAgIGNoYXIgX191c2VyICpkc3QsIHNpemVfdCBidWZsZW4pCit7CisJY2hhciAqZGF0YSA9IChjaGFyICopbXNnLT5kYXRhICsgbXNnLT5jb3BpZWQ7CisJc2l6ZV90IG1sZW4gPSBtaW4obXNnLT5sZW4gLSBtc2ctPmNvcGllZCwgYnVmbGVuKTsKKwl1bnNpZ25lZCBsb25nIGxlZnQ7CisKKwlsZWZ0ID0gY29weV90b191c2VyKGRzdCwgZGF0YSwgbWxlbik7CisJaWYgKGxlZnQgPT0gbWxlbikgeworCQltc2ctPmVycm5vID0gLUVGQVVMVDsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJbWxlbiAtPSBsZWZ0OworCW1zZy0+Y29waWVkICs9IG1sZW47CisJbXNnLT5lcnJubyA9IDA7CisJcmV0dXJuIG1sZW47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYmxfZGV2X21zZyBibF9tb3VudF9yZXBseTsKKworc3NpemVfdCBibF9waXBlX2Rvd25jYWxsKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqc3JjLAorCQkJIHNpemVfdCBtbGVuKQoreworCWlmIChtbGVuICE9IHNpemVvZiAoc3RydWN0IGJsX2Rldl9tc2cpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmYmxfbW91bnRfcmVwbHksIHNyYywgbWxlbikgIT0gMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwl3YWtlX3VwKCZibF93cSk7CisKKwlyZXR1cm4gbWxlbjsKK30KKwordm9pZCBibF9waXBlX2Rlc3Ryb3lfbXNnKHN0cnVjdCBycGNfcGlwZV9tc2cgKm1zZykKK3sKKwlpZiAobXNnLT5lcnJubyA+PSAwKQorCQlyZXR1cm47CisJd2FrZV91cCgmYmxfd3EpOworfQorCisvKgorICogRGVjb2RlcyBwbmZzX2Jsb2NrX2RldmljZWFkZHI0IHdoaWNoIGlzIFhEUiBlbmNvZGVkIGluIGRldi0+ZGV2X2FkZHJfYnVmLgorICovCitzdHJ1Y3QgcG5mc19ibG9ja19kZXYgKgorbmZzNF9ibGtfZGVjb2RlX2RldmljZShzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLAorCQkgICAgICAgc3RydWN0IHBuZnNfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBuZnNfYmxvY2tfZGV2ICpydiA9IE5VTEw7CisJc3RydWN0IGJsb2NrX2RldmljZSAqYmQgPSBOVUxMOworCXN0cnVjdCBycGNfcGlwZV9tc2cgbXNnOworCXN0cnVjdCBibF9tc2dfaGRyIGJsX21zZyA9IHsKKwkJLnR5cGUgPSBCTF9ERVZJQ0VfTU9VTlQsCisJCS50b3RhbGxlbiA9IGRldi0+bWluY291bnQsCisJfTsKKwl1aW50OF90ICpkYXRhcHRyOworCURFQ0xBUkVfV0FJVFFVRVVFKHdxLCBjdXJyZW50KTsKKwlzdHJ1Y3QgYmxfZGV2X21zZyAqcmVwbHkgPSAmYmxfbW91bnRfcmVwbHk7CisJaW50IG9mZnNldCwgbGVuLCBpOworCisJZHByaW50aygiJXMgQ1JFQVRJTkcgUElQRUZTIE1FU1NBR0VcbiIsIF9fZnVuY19fKTsKKwlkcHJpbnRrKCIlczogZGV2aWNlaWQ6ICVzLCBtaW5jb3VudDogJWRcbiIsIF9fZnVuY19fLCBkZXYtPmRldl9pZC5kYXRhLAorCQlkZXYtPm1pbmNvdW50KTsKKworCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CisJbXNnLmRhdGEgPSBremFsbG9jKHNpemVvZihibF9tc2cpICsgZGV2LT5taW5jb3VudCwgR0ZQX05PRlMpOworCWlmICghbXNnLmRhdGEpIHsKKwkJcnYgPSBFUlJfUFRSKC1FTk9NRU0pOworCQlnb3RvIG91dDsKKwl9CisKKwltZW1jcHkobXNnLmRhdGEsICZibF9tc2csIHNpemVvZihibF9tc2cpKTsKKwlkYXRhcHRyID0gKHVpbnQ4X3QgKikgbXNnLmRhdGE7CisJbGVuID0gZGV2LT5taW5jb3VudDsKKwlvZmZzZXQgPSBzaXplb2YoYmxfbXNnKTsKKwlmb3IgKGkgPSAwOyBsZW4gPiAwOyBpKyspIHsKKwkJbWVtY3B5KCZkYXRhcHRyW29mZnNldF0sIHBhZ2VfYWRkcmVzcyhkZXYtPnBhZ2VzW2ldKSwKKwkJCQlsZW4gPCBQQUdFX0NBQ0hFX1NJWkUgPyBsZW4gOiBQQUdFX0NBQ0hFX1NJWkUpOworCQlsZW4gLT0gUEFHRV9DQUNIRV9TSVpFOworCQlvZmZzZXQgKz0gUEFHRV9DQUNIRV9TSVpFOworCX0KKwltc2cubGVuID0gc2l6ZW9mKGJsX21zZykgKyBkZXYtPm1pbmNvdW50OworCisJZHByaW50aygiJXMgQ0FMTElORyBVU0VSU1BBQ0UgREFFTU9OXG4iLCBfX2Z1bmNfXyk7CisJYWRkX3dhaXRfcXVldWUoJmJsX3dxLCAmd3EpOworCWlmIChycGNfcXVldWVfdXBjYWxsKGJsX2RldmljZV9waXBlLT5kX2lub2RlLCAmbXNnKSA8IDApIHsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJmJsX3dxLCAmd3EpOworCQlnb3RvIG91dDsKKwl9CisKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJc2NoZWR1bGUoKTsKKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmJsX3dxLCAmd3EpOworCisJaWYgKHJlcGx5LT5zdGF0dXMgIT0gQkxfREVWSUNFX1JFUVVFU1RfUFJPQykgeworCQlkcHJpbnRrKCIlcyBmYWlsZWQgdG8gb3BlbiBkZXZpY2U6ICVkXG4iLAorCQkJX19mdW5jX18sIHJlcGx5LT5zdGF0dXMpOworCQlydiA9IEVSUl9QVFIoLUVJTlZBTCk7CisJCWdvdG8gb3V0OworCX0KKworCWJkID0gbmZzNF9ibGtkZXZfZ2V0KE1LREVWKHJlcGx5LT5tYWpvciwgcmVwbHktPm1pbm9yKSk7CisJaWYgKElTX0VSUihiZCkpIHsKKwkJZHByaW50aygiJXMgZmFpbGVkIHRvIG9wZW4gZGV2aWNlIDogJWxkXG4iLAorCQkJX19mdW5jX18sIFBUUl9FUlIoYmQpKTsKKwkJZ290byBvdXQ7CisJfQorCisJcnYgPSBremFsbG9jKHNpemVvZigqcnYpLCBHRlBfTk9GUyk7CisJaWYgKCFydikgeworCQlydiA9IEVSUl9QVFIoLUVOT01FTSk7CisJCWdvdG8gb3V0OworCX0KKworCXJ2LT5ibV9tZGV2ID0gYmQ7CisJbWVtY3B5KCZydi0+Ym1fbWRldmlkLCAmZGV2LT5kZXZfaWQsIHNpemVvZihzdHJ1Y3QgbmZzNF9kZXZpY2VpZCkpOworCWRwcmludGsoIiVzIENyZWF0ZWQgZGV2aWNlICVzIHdpdGggYmRfYmxvY2tfc2l6ZSAldVxuIiwKKwkJX19mdW5jX18sCisJCWJkLT5iZF9kaXNrLT5kaXNrX25hbWUsCisJCWJkLT5iZF9ibG9ja19zaXplKTsKKworb3V0OgorCWtmcmVlKG1zZy5kYXRhKTsKKwlyZXR1cm4gcnY7Cit9CisKKy8qIE1hcCBkZXZpY2VpZCByZXR1cm5lZCBieSB0aGUgc2VydmVyIHRvIGNvbnN0cnVjdGVkIGJsb2NrX2RldmljZSAqLworc3RhdGljIHN0cnVjdCBibG9ja19kZXZpY2UgKnRyYW5zbGF0ZV9kZXZpZChzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbywKKwkJCQkJICAgIHN0cnVjdCBuZnM0X2RldmljZWlkICppZCkKK3sKKwlzdHJ1Y3QgYmxvY2tfZGV2aWNlICpydiA9IE5VTEw7CisJc3RydWN0IGJsb2NrX21vdW50X2lkICptaWQ7CisJc3RydWN0IHBuZnNfYmxvY2tfZGV2ICpkZXY7CisKKwlkcHJpbnRrKCIlcyBlbnRlciwgbG89JXAsIGlkPSVwXG4iLCBfX2Z1bmNfXywgbG8sIGlkKTsKKwltaWQgPSBCTEtfSUQobG8pOworCXNwaW5fbG9jaygmbWlkLT5ibV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJm1pZC0+Ym1fZGV2bGlzdCwgYm1fbm9kZSkgeworCQlpZiAobWVtY21wKGlkLT5kYXRhLCBkZXYtPmJtX21kZXZpZC5kYXRhLAorCQkJICAgTkZTNF9ERVZJQ0VJRDRfU0laRSkgPT0gMCkgeworCQkJcnYgPSBkZXYtPmJtX21kZXY7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKyBvdXQ6CisJc3Bpbl91bmxvY2soJm1pZC0+Ym1fbG9jayk7CisJZHByaW50aygiJXMgcmV0dXJuaW5nICVwXG4iLCBfX2Z1bmNfXywgcnYpOworCXJldHVybiBydjsKK30KKworLyogVHJhY2tzIGluZm8gbmVlZGVkIHRvIGVuc3VyZSBleHRlbnRzIGluIGxheW91dCBvYmV5IGNvbnN0cmFpbnRzIG9mIHNwZWMgKi8KK3N0cnVjdCBsYXlvdXRfdmVyaWZpY2F0aW9uIHsKKwl1MzIgbW9kZTsJLyogUiBvciBSVyAqLworCXU2NCBzdGFydDsJLyogRXhwZWN0ZWQgc3RhcnQgb2YgbmV4dCBub24tQ09XIGV4dGVudCAqLworCXU2NCBpbnZhbDsJLyogU3RhcnQgb2YgSU5WQUwgY292ZXJhZ2UgKi8KKwl1NjQgY293cmVhZDsJLyogRW5kIG9mIENPVyByZWFkIGNvdmVyYWdlICovCit9OworCisvKiBWZXJpZnkgdGhlIGV4dGVudCBtZWV0cyB0aGUgbGF5b3V0IHJlcXVpcmVtZW50cyBvZiB0aGUgcG5mcy1ibG9jayBkcmFmdCwKKyAqIHNlY3Rpb24gMi4zLjEuCisgKi8KK3N0YXRpYyBpbnQgdmVyaWZ5X2V4dGVudChzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKmJlLAorCQkJIHN0cnVjdCBsYXlvdXRfdmVyaWZpY2F0aW9uICpsdikKK3sKKwlpZiAobHYtPm1vZGUgPT0gSU9NT0RFX1JFQUQpIHsKKwkJaWYgKGJlLT5iZV9zdGF0ZSA9PSBQTkZTX0JMT0NLX1JFQURXUklURV9EQVRBIHx8CisJCSAgICBiZS0+YmVfc3RhdGUgPT0gUE5GU19CTE9DS19JTlZBTElEX0RBVEEpCisJCQlyZXR1cm4gLUVJTzsKKwkJaWYgKGJlLT5iZV9mX29mZnNldCAhPSBsdi0+c3RhcnQpCisJCQlyZXR1cm4gLUVJTzsKKwkJbHYtPnN0YXJ0ICs9IGJlLT5iZV9sZW5ndGg7CisJCXJldHVybiAwOworCX0KKwkvKiBsdi0+bW9kZSA9PSBJT01PREVfUlcgKi8KKwlpZiAoYmUtPmJlX3N0YXRlID09IFBORlNfQkxPQ0tfUkVBRFdSSVRFX0RBVEEpIHsKKwkJaWYgKGJlLT5iZV9mX29mZnNldCAhPSBsdi0+c3RhcnQpCisJCQlyZXR1cm4gLUVJTzsKKwkJaWYgKGx2LT5jb3dyZWFkID4gbHYtPnN0YXJ0KQorCQkJcmV0dXJuIC1FSU87CisJCWx2LT5zdGFydCArPSBiZS0+YmVfbGVuZ3RoOworCQlsdi0+aW52YWwgPSBsdi0+c3RhcnQ7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoYmUtPmJlX3N0YXRlID09IFBORlNfQkxPQ0tfSU5WQUxJRF9EQVRBKSB7CisJCWlmIChiZS0+YmVfZl9vZmZzZXQgIT0gbHYtPnN0YXJ0KQorCQkJcmV0dXJuIC1FSU87CisJCWx2LT5zdGFydCArPSBiZS0+YmVfbGVuZ3RoOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKGJlLT5iZV9zdGF0ZSA9PSBQTkZTX0JMT0NLX1JFQURfREFUQSkgeworCQlpZiAoYmUtPmJlX2Zfb2Zmc2V0ID4gbHYtPnN0YXJ0KQorCQkJcmV0dXJuIC1FSU87CisJCWlmIChiZS0+YmVfZl9vZmZzZXQgPCBsdi0+aW52YWwpCisJCQlyZXR1cm4gLUVJTzsKKwkJaWYgKGJlLT5iZV9mX29mZnNldCA8IGx2LT5jb3dyZWFkKQorCQkJcmV0dXJuIC1FSU87CisJCS8qIEl0IGxvb2tzIGxpa2UgeW91IG1pZ2h0IHdhbnQgdG8gbWluIHRoaXMgd2l0aCBsdi0+c3RhcnQsCisJCSAqIGJ1dCB5b3UgcmVhbGx5IGRvbid0LgorCQkgKi8KKwkJbHYtPmludmFsID0gbHYtPmludmFsICsgYmUtPmJlX2xlbmd0aDsKKwkJbHYtPmNvd3JlYWQgPSBiZS0+YmVfZl9vZmZzZXQgKyBiZS0+YmVfbGVuZ3RoOworCQlyZXR1cm4gMDsKKwl9IGVsc2UKKwkJcmV0dXJuIC1FSU87Cit9CisKKy8qIFhEUiBkZWNvZGUgcG5mc19ibG9ja19sYXlvdXQ0IHN0cnVjdHVyZSAqLworaW50CituZnM0X2Jsa19wcm9jZXNzX2xheW91dGdldChzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbywKKwkJCSAgIHN0cnVjdCBuZnM0X2xheW91dGdldF9yZXMgKmxnciwgZ2ZwX3QgZ2ZwX2ZsYWdzKQoreworCXN0cnVjdCBwbmZzX2Jsb2NrX2xheW91dCAqYmwgPSBCTEtfTE8yRVhUKGxvKTsKKwlpbnQgaSwgc3RhdHVzID0gLUVJTzsKKwl1aW50MzJfdCBjb3VudDsKKwlzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKmJlID0gTlVMTCwgKnNhdmU7CisJc3RydWN0IHhkcl9zdHJlYW0gc3RyZWFtOworCXN0cnVjdCB4ZHJfYnVmIGJ1ZjsKKwlzdHJ1Y3QgcGFnZSAqc2NyYXRjaDsKKwlfX2JlMzIgKnA7CisJc3RydWN0IGxheW91dF92ZXJpZmljYXRpb24gbHYgPSB7CisJCS5tb2RlID0gbGdyLT5yYW5nZS5pb21vZGUsCisJCS5zdGFydCA9IGxnci0+cmFuZ2Uub2Zmc2V0ID4+IFNFQ1RPUl9TSElGVCwKKwkJLmludmFsID0gbGdyLT5yYW5nZS5vZmZzZXQgPj4gU0VDVE9SX1NISUZULAorCQkuY293cmVhZCA9IGxnci0+cmFuZ2Uub2Zmc2V0ID4+IFNFQ1RPUl9TSElGVCwKKwl9OworCUxJU1RfSEVBRChleHRlbnRzKTsKKworCWRwcmludGsoIi0tLT4gJXNcbiIsIF9fZnVuY19fKTsKKworCXNjcmF0Y2ggPSBhbGxvY19wYWdlKGdmcF9mbGFncyk7CisJaWYgKCFzY3JhdGNoKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXhkcl9pbml0X2RlY29kZV9wYWdlcygmc3RyZWFtLCAmYnVmLCBsZ3ItPmxheW91dHAtPnBhZ2VzLCBsZ3ItPmxheW91dHAtPmxlbik7CisJeGRyX3NldF9zY3JhdGNoX2J1ZmZlcigmc3RyZWFtLCBwYWdlX2FkZHJlc3Moc2NyYXRjaCksIFBBR0VfU0laRSk7CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoJnN0cmVhbSwgNCk7CisJaWYgKHVubGlrZWx5KCFwKSkKKwkJZ290byBvdXRfZXJyOworCisJY291bnQgPSBiZTMyX3RvX2NwdXAocCsrKTsKKworCWRwcmludGsoIiVzIGVudGVyLCBudW1iZXIgb2YgZXh0ZW50cyAlaVxuIiwgX19mdW5jX18sIGNvdW50KTsKKwlwID0geGRyX2lubGluZV9kZWNvZGUoJnN0cmVhbSwgKDI4ICsgTkZTNF9ERVZJQ0VJRDRfU0laRSkgKiBjb3VudCk7CisJaWYgKHVubGlrZWx5KCFwKSkKKwkJZ290byBvdXRfZXJyOworCisJLyogRGVjb2RlIGluZGl2aWR1YWwgZXh0ZW50cywgcHV0dGluZyB0aGVtIGluIHRlbXBvcmFyeQorCSAqIHN0YWdpbmcgYXJlYSB1bnRpbCB3aG9sZSBsYXlvdXQgaXMgZGVjb2RlZCB0byBtYWtlIGVycm9yCisJICogcmVjb3ZlcnkgZWFzaWVyLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWJlID0gYmxfYWxsb2NfZXh0ZW50KCk7CisJCWlmICghYmUpIHsKKwkJCXN0YXR1cyA9IC1FTk9NRU07CisJCQlnb3RvIG91dF9lcnI7CisJCX0KKwkJbWVtY3B5KCZiZS0+YmVfZGV2aWQsIHAsIE5GUzRfREVWSUNFSUQ0X1NJWkUpOworCQlwICs9IFhEUl9RVUFETEVOKE5GUzRfREVWSUNFSUQ0X1NJWkUpOworCQliZS0+YmVfbWRldiA9IHRyYW5zbGF0ZV9kZXZpZChsbywgJmJlLT5iZV9kZXZpZCk7CisJCWlmICghYmUtPmJlX21kZXYpCisJCQlnb3RvIG91dF9lcnI7CisKKwkJLyogVGhlIG5leHQgdGhyZWUgdmFsdWVzIGFyZSByZWFkIGluIGFzIGJ5dGVzLAorCQkgKiBidXQgc3RvcmVkIGFzIDUxMi1ieXRlIHNlY3RvciBsZW5ndGhzCisJCSAqLworCQlpZiAoZGVjb2RlX3NlY3Rvcl9udW1iZXIoJnAsICZiZS0+YmVfZl9vZmZzZXQpIDwgMCkKKwkJCWdvdG8gb3V0X2VycjsKKwkJaWYgKGRlY29kZV9zZWN0b3JfbnVtYmVyKCZwLCAmYmUtPmJlX2xlbmd0aCkgPCAwKQorCQkJZ290byBvdXRfZXJyOworCQlpZiAoZGVjb2RlX3NlY3Rvcl9udW1iZXIoJnAsICZiZS0+YmVfdl9vZmZzZXQpIDwgMCkKKwkJCWdvdG8gb3V0X2VycjsKKwkJYmUtPmJlX3N0YXRlID0gYmUzMl90b19jcHVwKHArKyk7CisJCWlmIChiZS0+YmVfc3RhdGUgPT0gUE5GU19CTE9DS19JTlZBTElEX0RBVEEpCisJCQliZS0+YmVfaW52YWwgPSAmYmwtPmJsX2ludmFsOworCQlpZiAodmVyaWZ5X2V4dGVudChiZSwgJmx2KSkgeworCQkJZHByaW50aygiJXMgdmVyaWZ5IGZhaWxlZFxuIiwgX19mdW5jX18pOworCQkJZ290byBvdXRfZXJyOworCQl9CisJCWxpc3RfYWRkX3RhaWwoJmJlLT5iZV9ub2RlLCAmZXh0ZW50cyk7CisJfQorCWlmIChsZ3ItPnJhbmdlLm9mZnNldCArIGxnci0+cmFuZ2UubGVuZ3RoICE9CisJCQlsdi5zdGFydCA8PCBTRUNUT1JfU0hJRlQpIHsKKwkJZHByaW50aygiJXMgRmluYWwgbGVuZ3RoIG1pc21hdGNoXG4iLCBfX2Z1bmNfXyk7CisJCWJlID0gTlVMTDsKKwkJZ290byBvdXRfZXJyOworCX0KKwlpZiAobHYuc3RhcnQgPCBsdi5jb3dyZWFkKSB7CisJCWRwcmludGsoIiVzIEZpbmFsIHVuY292ZXJlZCBDT1cgZXh0ZW50XG4iLCBfX2Z1bmNfXyk7CisJCWJlID0gTlVMTDsKKwkJZ290byBvdXRfZXJyOworCX0KKwkvKiBFeHRlbnRzIGRlY29kZWQgcHJvcGVybHksIG5vdyB0cnkgdG8gbWVyZ2UgdGhlbSBpbiB0bworCSAqIGV4aXN0aW5nIGxheW91dCBleHRlbnRzLgorCSAqLworCXNwaW5fbG9jaygmYmwtPmJsX2V4dF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoYmUsIHNhdmUsICZleHRlbnRzLCBiZV9ub2RlKSB7CisJCWxpc3RfZGVsKCZiZS0+YmVfbm9kZSk7CisJCXN0YXR1cyA9IGJsX2FkZF9tZXJnZV9leHRlbnQoYmwsIGJlKTsKKwkJaWYgKHN0YXR1cykgeworCQkJc3Bpbl91bmxvY2soJmJsLT5ibF9leHRfbG9jayk7CisJCQkvKiBUaGlzIGlzIGEgZmFpcmx5IGNhdGFzdHJvcGhpYyBlcnJvciwgYXMgdGhlCisJCQkgKiBlbnRpcmUgbGF5b3V0IGV4dGVudCBsaXN0cyBhcmUgbm93IGNvcnJ1cHRlZC4KKwkJCSAqIFdlIHNob3VsZCBoYXZlIHNvbWUgd2F5IHRvIGRpc3Rpbmd1aXNoIHRoaXMuCisJCQkgKi8KKwkJCWJlID0gTlVMTDsKKwkJCWdvdG8gb3V0X2VycjsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmYmwtPmJsX2V4dF9sb2NrKTsKKwlzdGF0dXMgPSAwOworIG91dDoKKwlfX2ZyZWVfcGFnZShzY3JhdGNoKTsKKwlkcHJpbnRrKCIlcyByZXR1cm5zICVpXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworCisgb3V0X2VycjoKKwlibF9wdXRfZXh0ZW50KGJlKTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmV4dGVudHMpKSB7CisJCWJlID0gbGlzdF9maXJzdF9lbnRyeSgmZXh0ZW50cywgc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50LAorCQkJCSAgICAgIGJlX25vZGUpOworCQlsaXN0X2RlbCgmYmUtPmJlX25vZGUpOworCQlibF9wdXRfZXh0ZW50KGJlKTsKKwl9CisJZ290byBvdXQ7Cit9CmRpZmYgLS1naXQgYS9mcy9uZnMvYmxvY2tsYXlvdXQvYmxvY2tsYXlvdXRkbS5jIGIvZnMvbmZzL2Jsb2NrbGF5b3V0L2Jsb2NrbGF5b3V0ZG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDU1Yzc1Ci0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL2Jsb2NrbGF5b3V0L2Jsb2NrbGF5b3V0ZG0uYwpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqICBsaW51eC9mcy9uZnMvYmxvY2tsYXlvdXQvYmxvY2tsYXlvdXRkbS5jCisgKgorICogIE1vZHVsZSBmb3IgdGhlIE5GU3Y0LjEgcE5GUyBibG9jayBsYXlvdXQgZHJpdmVyLgorICoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMDcgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4uCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgRnJlZCBJc2FtYW4gPGlpc2FtYW5AdW1pY2guZWR1PgorICogIEFuZHkgQWRhbXNvbiA8YW5kcm9zQGNpdGkudW1pY2guZWR1PgorICoKKyAqIHBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byB1c2UsIGNvcHksIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzIGFuZAorICogcmVkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcyBmb3IgYW55IHB1cnBvc2UsCisgKiBzbyBsb25nIGFzIHRoZSBuYW1lIG9mIHRoZSB1bml2ZXJzaXR5IG9mIG1pY2hpZ2FuIGlzIG5vdCB1c2VkIGluCisgKiBhbnkgYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlIHVzZSBvciBkaXN0cmlidXRpb24KKyAqIG9mIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBhdXRob3JpemF0aW9uLiAgaWYKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIG9yIGFueSBvdGhlciBpZGVudGlmaWNhdGlvbiBvZiB0aGUKKyAqIHVuaXZlcnNpdHkgb2YgbWljaGlnYW4gaXMgaW5jbHVkZWQgaW4gYW55IGNvcHkgb2YgYW55IHBvcnRpb24gb2YKKyAqIHRoaXMgc29mdHdhcmUsIHRoZW4gdGhlIGRpc2NsYWltZXIgYmVsb3cgbXVzdCBhbHNvIGJlIGluY2x1ZGVkLgorICoKKyAqIHRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYXMgaXMsIHdpdGhvdXQgcmVwcmVzZW50YXRpb24gZnJvbSB0aGUKKyAqIHVuaXZlcnNpdHkgb2YgbWljaGlnYW4gYXMgdG8gaXRzIGZpdG5lc3MgZm9yIGFueSBwdXJwb3NlLCBhbmQgd2l0aG91dAorICogd2FycmFudHkgYnkgdGhlIHVuaXZlcnNpdHkgb2YgbWljaGlnYW4gb2YgYW55IGtpbmQsIGVpdGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBpbXBsaWVkIHdhcnJhbnRpZXMgb2YKKyAqIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuICB0aGUgcmVnZW50cworICogb2YgdGhlIHVuaXZlcnNpdHkgb2YgbWljaGlnYW4gc2hhbGwgbm90IGJlIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMsCisgKiBpbmNsdWRpbmcgc3BlY2lhbCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywKKyAqIHdpdGggcmVzcGVjdCB0byBhbnkgY2xhaW0gYXJpc2luZyBvdXQgb3IgaW4gY29ubmVjdGlvbiB3aXRoIHRoZSB1c2UKKyAqIG9mIHRoZSBzb2Z0d2FyZSwgZXZlbiBpZiBpdCBoYXMgYmVlbiBvciBpcyBoZXJlYWZ0ZXIgYWR2aXNlZCBvZiB0aGUKKyAqIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZ2VuaGQuaD4gLyogZ2VuZGlzayAtIHVzZWQgaW4gYSBkcHJpbnRrKi8KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KKworI2luY2x1ZGUgImJsb2NrbGF5b3V0LmgiCisKKyNkZWZpbmUgTkZTREJHX0ZBQ0lMSVRZICAgICAgICAgTkZTREJHX1BORlNfTEQKKworc3RhdGljIHZvaWQgZGV2X3JlbW92ZShkZXZfdCBkZXYpCit7CisJc3RydWN0IHJwY19waXBlX21zZyBtc2c7CisJc3RydWN0IGJsX2Rldl9tc2cgYmxfdW1vdW50X3JlcXVlc3Q7CisJc3RydWN0IGJsX21zZ19oZHIgYmxfbXNnID0geworCQkudHlwZSA9IEJMX0RFVklDRV9VTU9VTlQsCisJCS50b3RhbGxlbiA9IHNpemVvZihibF91bW91bnRfcmVxdWVzdCksCisJfTsKKwl1aW50OF90ICpkYXRhcHRyOworCURFQ0xBUkVfV0FJVFFVRVVFKHdxLCBjdXJyZW50KTsKKworCWRwcmludGsoIkVudGVyaW5nICVzXG4iLCBfX2Z1bmNfXyk7CisKKwltZW1zZXQoJm1zZywgMCwgc2l6ZW9mKG1zZykpOworCW1zZy5kYXRhID0ga3phbGxvYygxICsgc2l6ZW9mKGJsX3Vtb3VudF9yZXF1ZXN0KSwgR0ZQX05PRlMpOworCWlmICghbXNnLmRhdGEpCisJCWdvdG8gb3V0OworCisJbWVtc2V0KCZibF91bW91bnRfcmVxdWVzdCwgMCwgc2l6ZW9mKGJsX3Vtb3VudF9yZXF1ZXN0KSk7CisJYmxfdW1vdW50X3JlcXVlc3QubWFqb3IgPSBNQUpPUihkZXYpOworCWJsX3Vtb3VudF9yZXF1ZXN0Lm1pbm9yID0gTUlOT1IoZGV2KTsKKworCW1lbWNweShtc2cuZGF0YSwgJmJsX21zZywgc2l6ZW9mKGJsX21zZykpOworCWRhdGFwdHIgPSAodWludDhfdCAqKSBtc2cuZGF0YTsKKwltZW1jcHkoJmRhdGFwdHJbc2l6ZW9mKGJsX21zZyldLCAmYmxfdW1vdW50X3JlcXVlc3QsIHNpemVvZihibF91bW91bnRfcmVxdWVzdCkpOworCW1zZy5sZW4gPSBzaXplb2YoYmxfbXNnKSArIGJsX21zZy50b3RhbGxlbjsKKworCWFkZF93YWl0X3F1ZXVlKCZibF93cSwgJndxKTsKKwlpZiAocnBjX3F1ZXVlX3VwY2FsbChibF9kZXZpY2VfcGlwZS0+ZF9pbm9kZSwgJm1zZykgPCAwKSB7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZibF93cSwgJndxKTsKKwkJZ290byBvdXQ7CisJfQorCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCXNjaGVkdWxlKCk7CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZibF93cSwgJndxKTsKKworb3V0OgorCWtmcmVlKG1zZy5kYXRhKTsKK30KKworLyoKKyAqIFJlbGVhc2UgbWV0YSBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgbmZzNF9ibGtfbWV0YWRldl9yZWxlYXNlKHN0cnVjdCBwbmZzX2Jsb2NrX2RldiAqYmRldikKK3sKKwlpbnQgcnY7CisKKwlkcHJpbnRrKCIlcyBSZWxlYXNpbmdcbiIsIF9fZnVuY19fKTsKKwlydiA9IG5mczRfYmxrZGV2X3B1dChiZGV2LT5ibV9tZGV2KTsKKwlpZiAocnYpCisJCXByaW50ayhLRVJOX0VSUiAiJXMgbmZzNF9ibGtkZXZfcHV0IHJldHVybnMgJWRcbiIsCisJCQkJX19mdW5jX18sIHJ2KTsKKworCWRldl9yZW1vdmUoYmRldi0+Ym1fbWRldi0+YmRfZGV2KTsKK30KKwordm9pZCBibF9mcmVlX2Jsb2NrX2RldihzdHJ1Y3QgcG5mc19ibG9ja19kZXYgKmJkZXYpCit7CisJaWYgKGJkZXYpIHsKKwkJaWYgKGJkZXYtPmJtX21kZXYpIHsKKwkJCWRwcmludGsoIiVzIFJlbW92aW5nIERNIGRldmljZTogJWQ6JWRcbiIsCisJCQkJX19mdW5jX18sCisJCQkJTUFKT1IoYmRldi0+Ym1fbWRldi0+YmRfZGV2KSwKKwkJCQlNSU5PUihiZGV2LT5ibV9tZGV2LT5iZF9kZXYpKTsKKwkJCW5mczRfYmxrX21ldGFkZXZfcmVsZWFzZShiZGV2KTsKKwkJfQorCQlrZnJlZShiZGV2KTsKKwl9Cit9CmRpZmYgLS1naXQgYS9mcy9uZnMvYmxvY2tsYXlvdXQvZXh0ZW50cy5jIGIvZnMvbmZzL2Jsb2NrbGF5b3V0L2V4dGVudHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWZhN2IwCi0tLSAvZGV2L251bGwKKysrIGIvZnMvbmZzL2Jsb2NrbGF5b3V0L2V4dGVudHMuYwpAQCAtMCwwICsxLDkzNSBAQAorLyoKKyAqICBsaW51eC9mcy9uZnMvYmxvY2tsYXlvdXQvYmxvY2tsYXlvdXQuaAorICoKKyAqICBNb2R1bGUgZm9yIHRoZSBORlN2NC4xIHBORlMgYmxvY2sgbGF5b3V0IGRyaXZlci4KKyAqCisgKiAgQ29weXJpZ2h0IChjKSAyMDA2IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIE1pY2hpZ2FuLgorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogIEFuZHkgQWRhbXNvbiA8YW5kcm9zQGNpdGkudW1pY2guZWR1PgorICogIEZyZWQgSXNhbWFuIDxpaXNhbWFuQHVtaWNoLmVkdT4KKyAqCisgKiBwZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gdXNlLCBjb3B5LCBjcmVhdGUgZGVyaXZhdGl2ZSB3b3JrcyBhbmQKKyAqIHJlZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MgZm9yIGFueSBwdXJwb3NlLAorICogc28gbG9uZyBhcyB0aGUgbmFtZSBvZiB0aGUgdW5pdmVyc2l0eSBvZiBtaWNoaWdhbiBpcyBub3QgdXNlZCBpbgorICogYW55IGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIHRoZSB1c2Ugb3IgZGlzdHJpYnV0aW9uCisgKiBvZiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgYXV0aG9yaXphdGlvbi4gIGlmCisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBvciBhbnkgb3RoZXIgaWRlbnRpZmljYXRpb24gb2YgdGhlCisgKiB1bml2ZXJzaXR5IG9mIG1pY2hpZ2FuIGlzIGluY2x1ZGVkIGluIGFueSBjb3B5IG9mIGFueSBwb3J0aW9uIG9mCisgKiB0aGlzIHNvZnR3YXJlLCB0aGVuIHRoZSBkaXNjbGFpbWVyIGJlbG93IG11c3QgYWxzbyBiZSBpbmNsdWRlZC4KKyAqCisgKiB0aGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGFzIGlzLCB3aXRob3V0IHJlcHJlc2VudGF0aW9uIGZyb20gdGhlCisgKiB1bml2ZXJzaXR5IG9mIG1pY2hpZ2FuIGFzIHRvIGl0cyBmaXRuZXNzIGZvciBhbnkgcHVycG9zZSwgYW5kIHdpdGhvdXQKKyAqIHdhcnJhbnR5IGJ5IHRoZSB1bml2ZXJzaXR5IG9mIG1pY2hpZ2FuIG9mIGFueSBraW5kLCBlaXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZCwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgaW1wbGllZCB3YXJyYW50aWVzIG9mCisgKiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiAgdGhlIHJlZ2VudHMKKyAqIG9mIHRoZSB1bml2ZXJzaXR5IG9mIG1pY2hpZ2FuIHNoYWxsIG5vdCBiZSBsaWFibGUgZm9yIGFueSBkYW1hZ2VzLAorICogaW5jbHVkaW5nIHNwZWNpYWwsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCisgKiB3aXRoIHJlc3BlY3QgdG8gYW55IGNsYWltIGFyaXNpbmcgb3V0IG9yIGluIGNvbm5lY3Rpb24gd2l0aCB0aGUgdXNlCisgKiBvZiB0aGUgc29mdHdhcmUsIGV2ZW4gaWYgaXQgaGFzIGJlZW4gb3IgaXMgaGVyZWFmdGVyIGFkdmlzZWQgb2YgdGhlCisgKiBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisgKi8KKworI2luY2x1ZGUgImJsb2NrbGF5b3V0LmgiCisjZGVmaW5lIE5GU0RCR19GQUNJTElUWSAgICAgICAgIE5GU0RCR19QTkZTX0xECisKKy8qIEJpdCBudW1iZXJzICovCisjZGVmaW5lIEVYVEVOVF9JTklUSUFMSVpFRCAwCisjZGVmaW5lIEVYVEVOVF9XUklUVEVOICAgICAxCisjZGVmaW5lIEVYVEVOVF9JTl9DT01NSVQgICAyCisjZGVmaW5lIElOVEVSTkFMX0VYSVNUUyAgICBNWV9NQVhfVEFHUworI2RlZmluZSBJTlRFUk5BTF9NQVNLICAgICAgKCgxIDw8IElOVEVSTkFMX0VYSVNUUykgLSAxKQorCisvKiBSZXR1cm5zIGxhcmdlc3QgdDw9cyBzLnQuIHQlYmFzZT09MCAqLworc3RhdGljIGlubGluZSBzZWN0b3JfdCBub3JtYWxpemUoc2VjdG9yX3QgcywgaW50IGJhc2UpCit7CisJc2VjdG9yX3QgdG1wID0gczsgLyogU2luY2UgZG9fZGl2IG1vZGlmaWVzIGl0cyBhcmd1bWVudCAqLworCXJldHVybiBzIC0gZG9fZGl2KHRtcCwgYmFzZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc2VjdG9yX3Qgbm9ybWFsaXplX3VwKHNlY3Rvcl90IHMsIGludCBiYXNlKQoreworCXJldHVybiBub3JtYWxpemUocyArIGJhc2UgLSAxLCBiYXNlKTsKK30KKworLyogQ29tcGxldGUgc3R1YiB1c2luZyBsaXN0IHdoaWxlIGRldGVybWluZSBBUEkgd2FudGVkICovCisKKy8qIFJldHVybnMgdGFncywgb3IgbmVnYXRpdmUgKi8KK3N0YXRpYyBpbnQzMl90IF9maW5kX2VudHJ5KHN0cnVjdCBteV90cmVlICp0cmVlLCB1NjQgcykKK3sKKwlzdHJ1Y3QgcG5mc19pbnZhbF90cmFja2luZyAqcG9zOworCisJZHByaW50aygiJXMoJWxsdSkgZW50ZXJcbiIsIF9fZnVuY19fLCBzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UocG9zLCAmdHJlZS0+bXR0X3N0dWIsIGl0X2xpbmspIHsKKwkJaWYgKHBvcy0+aXRfc2VjdG9yID4gcykKKwkJCWNvbnRpbnVlOworCQllbHNlIGlmIChwb3MtPml0X3NlY3RvciA9PSBzKQorCQkJcmV0dXJuIHBvcy0+aXRfdGFncyAmIElOVEVSTkFMX01BU0s7CisJCWVsc2UKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gLUVOT0VOVDsKK30KKworc3RhdGljIGlubGluZQoraW50IF9oYXNfdGFnKHN0cnVjdCBteV90cmVlICp0cmVlLCB1NjQgcywgaW50MzJfdCB0YWcpCit7CisJaW50MzJfdCB0YWdzOworCisJZHByaW50aygiJXMoJWxsdSwgJWkpIGVudGVyXG4iLCBfX2Z1bmNfXywgcywgdGFnKTsKKwlzID0gbm9ybWFsaXplKHMsIHRyZWUtPm10dF9zdGVwX3NpemUpOworCXRhZ3MgPSBfZmluZF9lbnRyeSh0cmVlLCBzKTsKKwlpZiAoKHRhZ3MgPCAwKSB8fCAhKHRhZ3MgJiAoMSA8PCB0YWcpKSkKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gMTsKK30KKworLyogQ3JlYXRlcyBlbnRyeSB3aXRoIHRhZywgb3IgaWYgZW50cnkgYWxyZWFkeSBleGlzdHMsIHVuaW9ucyB0YWcgdG8gaXQuCisgKiBJZiBzdG9yYWdlIGlzIG5vdCBOVUxMLCBuZXdseSBjcmVhdGVkIGVudHJ5IHdpbGwgdXNlIGl0LgorICogUmV0dXJucyBudW1iZXIgb2YgZW50cmllcyBhZGRlZCwgb3IgbmVnYXRpdmUgb24gZXJyb3IuCisgKi8KK3N0YXRpYyBpbnQgX2FkZF9lbnRyeShzdHJ1Y3QgbXlfdHJlZSAqdHJlZSwgdTY0IHMsIGludDMyX3QgdGFnLAorCQkgICAgICBzdHJ1Y3QgcG5mc19pbnZhbF90cmFja2luZyAqc3RvcmFnZSkKK3sKKwlpbnQgZm91bmQgPSAwOworCXN0cnVjdCBwbmZzX2ludmFsX3RyYWNraW5nICpwb3M7CisKKwlkcHJpbnRrKCIlcyglbGx1LCAlaSwgJXApIGVudGVyXG4iLCBfX2Z1bmNfXywgcywgdGFnLCBzdG9yYWdlKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UocG9zLCAmdHJlZS0+bXR0X3N0dWIsIGl0X2xpbmspIHsKKwkJaWYgKHBvcy0+aXRfc2VjdG9yID4gcykKKwkJCWNvbnRpbnVlOworCQllbHNlIGlmIChwb3MtPml0X3NlY3RvciA9PSBzKSB7CisJCQlmb3VuZCA9IDE7CisJCQlicmVhazsKKwkJfSBlbHNlCisJCQlicmVhazsKKwl9CisJaWYgKGZvdW5kKSB7CisJCXBvcy0+aXRfdGFncyB8PSAoMSA8PCB0YWcpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgcG5mc19pbnZhbF90cmFja2luZyAqbmV3OworCQlpZiAoc3RvcmFnZSkKKwkJCW5ldyA9IHN0b3JhZ2U7CisJCWVsc2UgeworCQkJbmV3ID0ga21hbGxvYyhzaXplb2YoKm5ldyksIEdGUF9OT0ZTKTsKKwkJCWlmICghbmV3KQorCQkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCW5ldy0+aXRfc2VjdG9yID0gczsKKwkJbmV3LT5pdF90YWdzID0gKDEgPDwgdGFnKTsKKwkJbGlzdF9hZGQoJm5ldy0+aXRfbGluaywgJnBvcy0+aXRfbGluayk7CisJCXJldHVybiAxOworCX0KK30KKworLyogWFhYWCBSZWFsbHkgd2FudCBvcHRpb24gdG8gbm90IGNyZWF0ZSAqLworLyogT3ZlciByYW5nZSwgdW5pb25zIHRhZyB3aXRoIGV4aXN0aW5nIGVudHJpZXMsIGVsc2UgY3JlYXRlcyBlbnRyeSB3aXRoIHRhZyAqLworc3RhdGljIGludCBfc2V0X3JhbmdlKHN0cnVjdCBteV90cmVlICp0cmVlLCBpbnQzMl90IHRhZywgdTY0IHMsIHU2NCBsZW5ndGgpCit7CisJdTY0IGk7CisKKwlkcHJpbnRrKCIlcyglaSwgJWxsdSwgJWxsdSkgZW50ZXJcbiIsIF9fZnVuY19fLCB0YWcsIHMsIGxlbmd0aCk7CisJZm9yIChpID0gbm9ybWFsaXplKHMsIHRyZWUtPm10dF9zdGVwX3NpemUpOyBpIDwgcyArIGxlbmd0aDsKKwkgICAgIGkgKz0gdHJlZS0+bXR0X3N0ZXBfc2l6ZSkKKwkJaWYgKF9hZGRfZW50cnkodHJlZSwgaSwgdGFnLCBOVUxMKSkKKwkJCXJldHVybiAtRU5PTUVNOworCXJldHVybiAwOworfQorCisvKiBFbnN1cmUgdGhhdCBmdXR1cmUgb3BlcmF0aW9ucyBvbiBnaXZlbiByYW5nZSBvZiB0cmVlIHdpbGwgbm90IG1hbGxvYyAqLworc3RhdGljIGludCBfcHJlbG9hZF9yYW5nZShzdHJ1Y3QgbXlfdHJlZSAqdHJlZSwgdTY0IG9mZnNldCwgdTY0IGxlbmd0aCkKK3sKKwl1NjQgc3RhcnQsIGVuZCwgczsKKwlpbnQgY291bnQsIGksIHVzZWQgPSAwLCBzdGF0dXMgPSAtRU5PTUVNOworCXN0cnVjdCBwbmZzX2ludmFsX3RyYWNraW5nICoqc3RvcmFnZTsKKworCWRwcmludGsoIiVzKCVsbHUsICVsbHUpIGVudGVyXG4iLCBfX2Z1bmNfXywgb2Zmc2V0LCBsZW5ndGgpOworCXN0YXJ0ID0gbm9ybWFsaXplKG9mZnNldCwgdHJlZS0+bXR0X3N0ZXBfc2l6ZSk7CisJZW5kID0gbm9ybWFsaXplX3VwKG9mZnNldCArIGxlbmd0aCwgdHJlZS0+bXR0X3N0ZXBfc2l6ZSk7CisJY291bnQgPSAoaW50KShlbmQgLSBzdGFydCkgLyAoaW50KXRyZWUtPm10dF9zdGVwX3NpemU7CisKKwkvKiBQcmUtbWFsbG9jIHdoYXQgbWVtb3J5IHdlIG1pZ2h0IG5lZWQgKi8KKwlzdG9yYWdlID0ga21hbGxvYyhzaXplb2YoKnN0b3JhZ2UpICogY291bnQsIEdGUF9OT0ZTKTsKKwlpZiAoIXN0b3JhZ2UpCisJCXJldHVybiAtRU5PTUVNOworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXN0b3JhZ2VbaV0gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcG5mc19pbnZhbF90cmFja2luZyksCisJCQkJICAgICBHRlBfTk9GUyk7CisJCWlmICghc3RvcmFnZVtpXSkKKwkJCWdvdG8gb3V0X2NsZWFudXA7CisJfQorCisJLyogTm93IG5lZWQgbG9jayAtIEhPVz8/PyAqLworCisJZm9yIChzID0gc3RhcnQ7IHMgPCBlbmQ7IHMgKz0gdHJlZS0+bXR0X3N0ZXBfc2l6ZSkKKwkJdXNlZCArPSBfYWRkX2VudHJ5KHRyZWUsIHMsIElOVEVSTkFMX0VYSVNUUywgc3RvcmFnZVt1c2VkXSk7CisKKwkvKiBVbmxvY2sgLSBIT1c/Pz8gKi8KKwlzdGF0dXMgPSAwOworCisgb3V0X2NsZWFudXA6CisJZm9yIChpID0gdXNlZDsgaSA8IGNvdW50OyBpKyspIHsKKwkJaWYgKCFzdG9yYWdlW2ldKQorCQkJYnJlYWs7CisJCWtmcmVlKHN0b3JhZ2VbaV0pOworCX0KKwlrZnJlZShzdG9yYWdlKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBzZXRfbmVlZHNfaW5pdChzZWN0b3JfdCAqYXJyYXksIHNlY3Rvcl90IG9mZnNldCkKK3sKKwlzZWN0b3JfdCAqcCA9IGFycmF5OworCisJZHByaW50aygiJXMgZW50ZXJcbiIsIF9fZnVuY19fKTsKKwlpZiAoIXApCisJCXJldHVybjsKKwl3aGlsZSAoKnAgPCBvZmZzZXQpCisJCXArKzsKKwlpZiAoKnAgPT0gb2Zmc2V0KQorCQlyZXR1cm47CisJZWxzZSBpZiAoKnAgPT0gfjApIHsKKwkJKnArKyA9IG9mZnNldDsKKwkJKnAgPSB+MDsKKwkJcmV0dXJuOworCX0gZWxzZSB7CisJCXNlY3Rvcl90ICpzYXZlID0gcDsKKwkJZHByaW50aygiJXMgQWRkaW5nICVsbHVcbiIsIF9fZnVuY19fLCAodTY0KW9mZnNldCk7CisJCXdoaWxlICgqcCAhPSB+MCkKKwkJCXArKzsKKwkJcCsrOworCQltZW1tb3ZlKHNhdmUgKyAxLCBzYXZlLCAoY2hhciAqKXAgLSAoY2hhciAqKXNhdmUpOworCQkqc2F2ZSA9IG9mZnNldDsKKwkJcmV0dXJuOworCX0KK30KKworLyogV2UgYXJlIHJlbHlpbmcgb24gcGFnZSBsb2NrIHRvIHNlcmlhbGl6ZSB0aGlzICovCitpbnQgYmxfaXNfc2VjdG9yX2luaXQoc3RydWN0IHBuZnNfaW52YWxfbWFya2luZ3MgKm1hcmtzLCBzZWN0b3JfdCBpc2VjdCkKK3sKKwlpbnQgcnY7CisKKwlzcGluX2xvY2soJm1hcmtzLT5pbV9sb2NrKTsKKwlydiA9IF9oYXNfdGFnKCZtYXJrcy0+aW1fdHJlZSwgaXNlY3QsIEVYVEVOVF9JTklUSUFMSVpFRCk7CisJc3Bpbl91bmxvY2soJm1hcmtzLT5pbV9sb2NrKTsKKwlyZXR1cm4gcnY7Cit9CisKKy8qIEFzc3VtZSBzdGFydCwgZW5kIGFscmVhZHkgc2VjdG9yIGFsaWduZWQgKi8KK3N0YXRpYyBpbnQKK19yYW5nZV9oYXNfdGFnKHN0cnVjdCBteV90cmVlICp0cmVlLCB1NjQgc3RhcnQsIHU2NCBlbmQsIGludDMyX3QgdGFnKQoreworCXN0cnVjdCBwbmZzX2ludmFsX3RyYWNraW5nICpwb3M7CisJdTY0IGV4cGVjdCA9IDA7CisKKwlkcHJpbnRrKCIlcyglbGx1LCAlbGx1LCAlaSkgZW50ZXJcbiIsIF9fZnVuY19fLCBzdGFydCwgZW5kLCB0YWcpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZShwb3MsICZ0cmVlLT5tdHRfc3R1YiwgaXRfbGluaykgeworCQlpZiAocG9zLT5pdF9zZWN0b3IgPj0gZW5kKQorCQkJY29udGludWU7CisJCWlmICghZXhwZWN0KSB7CisJCQlpZiAoKHBvcy0+aXRfc2VjdG9yID09IGVuZCAtIHRyZWUtPm10dF9zdGVwX3NpemUpICYmCisJCQkgICAgKHBvcy0+aXRfdGFncyAmICgxIDw8IHRhZykpKSB7CisJCQkJZXhwZWN0ID0gcG9zLT5pdF9zZWN0b3IgLSB0cmVlLT5tdHRfc3RlcF9zaXplOworCQkJCWlmIChwb3MtPml0X3NlY3RvciA8IHRyZWUtPm10dF9zdGVwX3NpemUgfHwgZXhwZWN0IDwgc3RhcnQpCisJCQkJCXJldHVybiAxOworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQlpZiAocG9zLT5pdF9zZWN0b3IgIT0gZXhwZWN0IHx8ICEocG9zLT5pdF90YWdzICYgKDEgPDwgdGFnKSkpCisJCQlyZXR1cm4gMDsKKwkJZXhwZWN0IC09IHRyZWUtPm10dF9zdGVwX3NpemU7CisJCWlmIChleHBlY3QgPCBzdGFydCkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpc19yYW5nZV93cml0dGVuKHN0cnVjdCBwbmZzX2ludmFsX21hcmtpbmdzICptYXJrcywKKwkJCSAgICBzZWN0b3JfdCBzdGFydCwgc2VjdG9yX3QgZW5kKQoreworCWludCBydjsKKworCXNwaW5fbG9jaygmbWFya3MtPmltX2xvY2spOworCXJ2ID0gX3JhbmdlX2hhc190YWcoJm1hcmtzLT5pbV90cmVlLCBzdGFydCwgZW5kLCBFWFRFTlRfV1JJVFRFTik7CisJc3Bpbl91bmxvY2soJm1hcmtzLT5pbV9sb2NrKTsKKwlyZXR1cm4gcnY7Cit9CisKKy8qIE1hcmtzIHNlY3RvcnMgaW4gW29mZmVzdCwgb2Zmc2V0X2xlbmd0aCkgYXMgaGF2aW5nIGJlZW4gaW5pdGlhbGl6ZWQuCisgKiBBbGwgbGVuZ3RocyBhcmUgc3RlcC1hbGlnbmVkLCB3aGVyZSBzdGVwIGlzIG1pbihwYWdlc2l6ZSwgYmxvY2tzaXplKS4KKyAqIE5vdGVzIHdoZXJlIHBhcnRpYWwgYmxvY2sgaXMgaW5pdGlhbGl6ZWQsIGFuZCBoZWxwcyBwcmVwYXJlIGl0IGZvcgorICogY29tcGxldGUgaW5pdGlhbGl6YXRpb24gbGF0ZXIuCisgKi8KKy8qIEN1cnJlbnRseSBhc3N1bWVzIG9mZnNldCBpcyBwYWdlLWFsaWduZWQgKi8KK2ludCBibF9tYXJrX3NlY3RvcnNfaW5pdChzdHJ1Y3QgcG5mc19pbnZhbF9tYXJraW5ncyAqbWFya3MsCisJCQkgICAgIHNlY3Rvcl90IG9mZnNldCwgc2VjdG9yX3QgbGVuZ3RoLAorCQkJICAgICBzZWN0b3JfdCAqKnBhZ2VzKQoreworCXNlY3Rvcl90IHMsIHN0YXJ0LCBlbmQ7CisJc2VjdG9yX3QgKmFycmF5ID0gTlVMTDsgLyogUGFnZXMgdG8gbWFyayAqLworCisJZHByaW50aygiJXMob2Zmc2V0PSVsbHUsbGVuPSVsbHUpIGVudGVyXG4iLAorCQlfX2Z1bmNfXywgKHU2NClvZmZzZXQsICh1NjQpbGVuZ3RoKTsKKwlzID0gbWF4KChzZWN0b3JfdCkgMywKKwkJMiAqIChtYXJrcy0+aW1fYmxvY2tfc2l6ZSAvIChQQUdFX0NBQ0hFX1NFQ1RPUlMpKSk7CisJZHByaW50aygiJXMgc2V0IG1heD0lbGx1XG4iLCBfX2Z1bmNfXywgKHU2NClzKTsKKwlpZiAocGFnZXMpIHsKKwkJYXJyYXkgPSBrbWFsbG9jKHMgKiBzaXplb2Yoc2VjdG9yX3QpLCBHRlBfTk9GUyk7CisJCWlmICghYXJyYXkpCisJCQlnb3RvIG91dGVycjsKKwkJYXJyYXlbMF0gPSB+MDsKKwl9CisKKwlzdGFydCA9IG5vcm1hbGl6ZShvZmZzZXQsIG1hcmtzLT5pbV9ibG9ja19zaXplKTsKKwllbmQgPSBub3JtYWxpemVfdXAob2Zmc2V0ICsgbGVuZ3RoLCBtYXJrcy0+aW1fYmxvY2tfc2l6ZSk7CisJaWYgKF9wcmVsb2FkX3JhbmdlKCZtYXJrcy0+aW1fdHJlZSwgc3RhcnQsIGVuZCAtIHN0YXJ0KSkKKwkJZ290byBvdXRlcnI7CisKKwlzcGluX2xvY2soJm1hcmtzLT5pbV9sb2NrKTsKKworCWZvciAocyA9IG5vcm1hbGl6ZV91cChzdGFydCwgUEFHRV9DQUNIRV9TRUNUT1JTKTsKKwkgICAgIHMgPCBvZmZzZXQ7IHMgKz0gUEFHRV9DQUNIRV9TRUNUT1JTKSB7CisJCWRwcmludGsoIiVzIHByZS1hcmVhIHBhZ2VzXG4iLCBfX2Z1bmNfXyk7CisJCS8qIFBvcnRpb24gb2YgdXNlZCBibG9jayBpcyBub3QgaW5pdGlhbGl6ZWQgKi8KKwkJaWYgKCFfaGFzX3RhZygmbWFya3MtPmltX3RyZWUsIHMsIEVYVEVOVF9JTklUSUFMSVpFRCkpCisJCQlzZXRfbmVlZHNfaW5pdChhcnJheSwgcyk7CisJfQorCWlmIChfc2V0X3JhbmdlKCZtYXJrcy0+aW1fdHJlZSwgRVhURU5UX0lOSVRJQUxJWkVELCBvZmZzZXQsIGxlbmd0aCkpCisJCWdvdG8gb3V0X3VubG9jazsKKwlmb3IgKHMgPSBub3JtYWxpemVfdXAob2Zmc2V0ICsgbGVuZ3RoLCBQQUdFX0NBQ0hFX1NFQ1RPUlMpOworCSAgICAgcyA8IGVuZDsgcyArPSBQQUdFX0NBQ0hFX1NFQ1RPUlMpIHsKKwkJZHByaW50aygiJXMgcG9zdC1hcmVhIHBhZ2VzXG4iLCBfX2Z1bmNfXyk7CisJCWlmICghX2hhc190YWcoJm1hcmtzLT5pbV90cmVlLCBzLCBFWFRFTlRfSU5JVElBTElaRUQpKQorCQkJc2V0X25lZWRzX2luaXQoYXJyYXksIHMpOworCX0KKworCXNwaW5fdW5sb2NrKCZtYXJrcy0+aW1fbG9jayk7CisKKwlpZiAocGFnZXMpIHsKKwkJaWYgKGFycmF5WzBdID09IH4wKSB7CisJCQlrZnJlZShhcnJheSk7CisJCQkqcGFnZXMgPSBOVUxMOworCQl9IGVsc2UKKwkJCSpwYWdlcyA9IGFycmF5OworCX0KKwlyZXR1cm4gMDsKKworIG91dF91bmxvY2s6CisJc3Bpbl91bmxvY2soJm1hcmtzLT5pbV9sb2NrKTsKKyBvdXRlcnI6CisJaWYgKHBhZ2VzKSB7CisJCWtmcmVlKGFycmF5KTsKKwkJKnBhZ2VzID0gTlVMTDsKKwl9CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qIE1hcmtzIHNlY3RvcnMgaW4gW29mZmVzdCwgb2Zmc2V0K2xlbmd0aCkgYXMgaGF2aW5nIGJlZW4gd3JpdHRlbiB0byBkaXNrLgorICogQWxsIGxlbmd0aHMgc2hvdWxkIGJlIGJsb2NrIGFsaWduZWQuCisgKi8KK3N0YXRpYyBpbnQgbWFya193cml0dGVuX3NlY3RvcnMoc3RydWN0IHBuZnNfaW52YWxfbWFya2luZ3MgKm1hcmtzLAorCQkJCXNlY3Rvcl90IG9mZnNldCwgc2VjdG9yX3QgbGVuZ3RoKQoreworCWludCBzdGF0dXM7CisKKwlkcHJpbnRrKCIlcyhvZmZzZXQ9JWxsdSxsZW49JWxsdSkgZW50ZXJcbiIsIF9fZnVuY19fLAorCQkodTY0KW9mZnNldCwgKHU2NClsZW5ndGgpOworCXNwaW5fbG9jaygmbWFya3MtPmltX2xvY2spOworCXN0YXR1cyA9IF9zZXRfcmFuZ2UoJm1hcmtzLT5pbV90cmVlLCBFWFRFTlRfV1JJVFRFTiwgb2Zmc2V0LCBsZW5ndGgpOworCXNwaW5fdW5sb2NrKCZtYXJrcy0+aW1fbG9jayk7CisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfc2hvcnRfZXh0ZW50KHN0cnVjdCBwbmZzX2Jsb2NrX3Nob3J0X2V4dGVudCAqYmUpCit7CisJZHByaW50aygiUFJJTlQgU0hPUlQgRVhURU5UIGV4dGVudCAlcFxuIiwgYmUpOworCWlmIChiZSkgeworCQlkcHJpbnRrKCIgICAgICAgIGJlX2Zfb2Zmc2V0ICVsbHVcbiIsICh1NjQpYmUtPmJzZV9mX29mZnNldCk7CisJCWRwcmludGsoIiAgICAgICAgYmVfbGVuZ3RoICAgJWxsdVxuIiwgKHU2NCliZS0+YnNlX2xlbmd0aCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBwcmludF9jbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJc3RydWN0IHBuZnNfYmxvY2tfc2hvcnRfZXh0ZW50ICpiZTsKKwl1bnNpZ25lZCBpbnQgaSA9IDA7CisKKwlpZmRlYnVnKEZBQ0lMSVRZKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIqKioqKioqKioqKioqKioqXG4iKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkV4dGVudCBsaXN0IGxvb2tzIGxpa2U6XG4iKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShiZSwgbGlzdCwgYnNlX25vZGUpIHsKKwkJCWkrKzsKKwkJCXByaW50X3Nob3J0X2V4dGVudChiZSk7CisJCX0KKwkJaWYgKGkgIT0gY291bnQpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiXG5cbkV4cGVjdGVkICV1IGVudHJpZXNcblxuXG4iLCBjb3VudCk7CisJCXByaW50ayhLRVJOX0RFQlVHICIqKioqKioqKioqKioqKioqXG4iKTsKKwl9Cit9CisKKy8qIE5vdGU6IEluIHRoZW9yeSwgd2Ugc2hvdWxkIGRvIG1vcmUgY2hlY2tpbmcgdGhhdCBkZXZpZCdzIG1hdGNoIGJldHdlZW4KKyAqIG9sZCBhbmQgbmV3LCBidXQgaWYgdGhleSBkb24ndCwgdGhlIGxpc3RzIGFyZSB0b28gY29ycnVwdCB0byBzYWx2YWdlIGFueXdheS4KKyAqLworLyogTm90ZSB0aGlzIGlzIHZlcnkgc2ltaWxhciB0byBibF9hZGRfbWVyZ2VfZXh0ZW50ICovCitzdGF0aWMgdm9pZCBhZGRfdG9fY29tbWl0bGlzdChzdHJ1Y3QgcG5mc19ibG9ja19sYXlvdXQgKmJsLAorCQkJICAgICAgc3RydWN0IHBuZnNfYmxvY2tfc2hvcnRfZXh0ZW50ICpuZXcpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqY2xpc3QgPSAmYmwtPmJsX2NvbW1pdDsKKwlzdHJ1Y3QgcG5mc19ibG9ja19zaG9ydF9leHRlbnQgKm9sZCwgKnNhdmU7CisJc2VjdG9yX3QgZW5kID0gbmV3LT5ic2VfZl9vZmZzZXQgKyBuZXctPmJzZV9sZW5ndGg7CisKKwlkcHJpbnRrKCIlcyBlbnRlclxuIiwgX19mdW5jX18pOworCXByaW50X3Nob3J0X2V4dGVudChuZXcpOworCXByaW50X2NsaXN0KGNsaXN0LCBibC0+YmxfY291bnQpOworCWJsLT5ibF9jb3VudCsrOworCS8qIFNjYW4gZm9yIHByb3BlciBwbGFjZSB0byBpbnNlcnQsIGV4dGVuZGluZyBuZXcgdG8gdGhlIGxlZnQKKwkgKiBhcyBtdWNoIGFzIHBvc3NpYmxlLgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShvbGQsIHNhdmUsIGNsaXN0LCBic2Vfbm9kZSkgeworCQlpZiAobmV3LT5ic2VfZl9vZmZzZXQgPCBvbGQtPmJzZV9mX29mZnNldCkKKwkJCWJyZWFrOworCQlpZiAoZW5kIDw9IG9sZC0+YnNlX2Zfb2Zmc2V0ICsgb2xkLT5ic2VfbGVuZ3RoKSB7CisJCQkvKiBSYW5nZSBpcyBhbHJlYWR5IGluIGxpc3QgKi8KKwkJCWJsLT5ibF9jb3VudC0tOworCQkJa2ZyZWUobmV3KTsKKwkJCXJldHVybjsKKwkJfSBlbHNlIGlmIChuZXctPmJzZV9mX29mZnNldCA8PQorCQkJCW9sZC0+YnNlX2Zfb2Zmc2V0ICsgb2xkLT5ic2VfbGVuZ3RoKSB7CisJCQkvKiBuZXcgb3ZlcmxhcHMgb3IgYWJ1dHMgZXhpc3RpbmcgYmUgKi8KKwkJCWlmIChuZXctPmJzZV9tZGV2ID09IG9sZC0+YnNlX21kZXYpIHsKKwkJCQkvKiBleHRlbmQgbmV3IHRvIGZ1bGx5IHJlcGxhY2Ugb2xkICovCisJCQkJbmV3LT5ic2VfbGVuZ3RoICs9IG5ldy0+YnNlX2Zfb2Zmc2V0IC0KKwkJCQkJCW9sZC0+YnNlX2Zfb2Zmc2V0OworCQkJCW5ldy0+YnNlX2Zfb2Zmc2V0ID0gb2xkLT5ic2VfZl9vZmZzZXQ7CisJCQkJbGlzdF9kZWwoJm9sZC0+YnNlX25vZGUpOworCQkJCWJsLT5ibF9jb3VudC0tOworCQkJCWtmcmVlKG9sZCk7CisJCQl9CisJCX0KKwl9CisJLyogTm90ZSB0aGF0IGlmIHdlIG5ldmVyIGhpdCB0aGUgYWJvdmUgYnJlYWssIG9sZCB3aWxsIG5vdCBwb2ludCB0byBhCisJICogdmFsaWQgZXh0ZW50LiAgSG93ZXZlciwgaW4gdGhhdCBjYXNlICZvbGQtPmJzZV9ub2RlPT1saXN0LgorCSAqLworCWxpc3RfYWRkX3RhaWwoJm5ldy0+YnNlX25vZGUsICZvbGQtPmJzZV9ub2RlKTsKKwkvKiBTY2FuIGZvcndhcmQgZm9yIG92ZXJsYXBzLiAgSWYgd2UgZmluZCBhbnksIGV4dGVuZCBuZXcgYW5kCisJICogcmVtb3ZlIHRoZSBvdmVybGFwcGVkIGV4dGVudC4KKwkgKi8KKwlvbGQgPSBsaXN0X3ByZXBhcmVfZW50cnkobmV3LCBjbGlzdCwgYnNlX25vZGUpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZV9jb250aW51ZShvbGQsIHNhdmUsIGNsaXN0LCBic2Vfbm9kZSkgeworCQlpZiAoZW5kIDwgb2xkLT5ic2VfZl9vZmZzZXQpCisJCQlicmVhazsKKwkJLyogbmV3IG92ZXJsYXBzIG9yIGFidXRzIG9sZCAqLworCQlpZiAobmV3LT5ic2VfbWRldiA9PSBvbGQtPmJzZV9tZGV2KSB7CisJCQlpZiAoZW5kIDwgb2xkLT5ic2VfZl9vZmZzZXQgKyBvbGQtPmJzZV9sZW5ndGgpIHsKKwkJCQkvKiBleHRlbmQgbmV3IHRvIGZ1bGx5IGNvdmVyIG9sZCAqLworCQkJCWVuZCA9IG9sZC0+YnNlX2Zfb2Zmc2V0ICsgb2xkLT5ic2VfbGVuZ3RoOworCQkJCW5ldy0+YnNlX2xlbmd0aCA9IGVuZCAtIG5ldy0+YnNlX2Zfb2Zmc2V0OworCQkJfQorCQkJbGlzdF9kZWwoJm9sZC0+YnNlX25vZGUpOworCQkJYmwtPmJsX2NvdW50LS07CisJCQlrZnJlZShvbGQpOworCQl9CisJfQorCWRwcmludGsoIiVzOiBhZnRlciBtZXJnaW5nXG4iLCBfX2Z1bmNfXyk7CisJcHJpbnRfY2xpc3QoY2xpc3QsIGJsLT5ibF9jb3VudCk7Cit9CisKKy8qIE5vdGUgdGhlIHJhbmdlIGRlc2NyaWJlZCBieSBvZmZzZXQsIGxlbmd0aCBpcyBndWFyYW50ZWVkIHRvIGJlIGNvbnRhaW5lZAorICogd2l0aGluIGJlLgorICovCitpbnQgYmxfbWFya19mb3JfY29tbWl0KHN0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCAqYmUsCisJCSAgICBzZWN0b3JfdCBvZmZzZXQsIHNlY3Rvcl90IGxlbmd0aCkKK3sKKwlzZWN0b3JfdCBuZXdfZW5kLCBlbmQgPSBvZmZzZXQgKyBsZW5ndGg7CisJc3RydWN0IHBuZnNfYmxvY2tfc2hvcnRfZXh0ZW50ICpuZXc7CisJc3RydWN0IHBuZnNfYmxvY2tfbGF5b3V0ICpibCA9IGNvbnRhaW5lcl9vZihiZS0+YmVfaW52YWwsCisJCQkJCQkgICAgc3RydWN0IHBuZnNfYmxvY2tfbGF5b3V0LAorCQkJCQkJICAgIGJsX2ludmFsKTsKKworCW5ldyA9IGttYWxsb2Moc2l6ZW9mKCpuZXcpLCBHRlBfTk9GUyk7CisJaWYgKCFuZXcpCisJCXJldHVybiAtRU5PTUVNOworCisJbWFya193cml0dGVuX3NlY3RvcnMoYmUtPmJlX2ludmFsLCBvZmZzZXQsIGxlbmd0aCk7CisJLyogV2Ugd2FudCB0byBhZGQgdGhlIHJhbmdlIHRvIGNvbW1pdCBsaXN0LCBidXQgaXQgbXVzdCBiZQorCSAqIGJsb2NrLW5vcm1hbGl6ZWQsIGFuZCB2ZXJpZmllZCB0aGF0IHRoZSBub3JtYWxpemVkIHJhbmdlIGhhcworCSAqIGJlZW4gZW50aXJlbHkgd3JpdHRlbiB0byBkaXNrLgorCSAqLworCW5ldy0+YnNlX2Zfb2Zmc2V0ID0gb2Zmc2V0OworCW9mZnNldCA9IG5vcm1hbGl6ZShvZmZzZXQsIGJsLT5ibF9ibG9ja3NpemUpOworCWlmIChvZmZzZXQgPCBuZXctPmJzZV9mX29mZnNldCkgeworCQlpZiAoaXNfcmFuZ2Vfd3JpdHRlbihiZS0+YmVfaW52YWwsIG9mZnNldCwgbmV3LT5ic2VfZl9vZmZzZXQpKQorCQkJbmV3LT5ic2VfZl9vZmZzZXQgPSBvZmZzZXQ7CisJCWVsc2UKKwkJCW5ldy0+YnNlX2Zfb2Zmc2V0ID0gb2Zmc2V0ICsgYmwtPmJsX2Jsb2Nrc2l6ZTsKKwl9CisJbmV3X2VuZCA9IG5vcm1hbGl6ZV91cChlbmQsIGJsLT5ibF9ibG9ja3NpemUpOworCWlmIChlbmQgPCBuZXdfZW5kKSB7CisJCWlmIChpc19yYW5nZV93cml0dGVuKGJlLT5iZV9pbnZhbCwgZW5kLCBuZXdfZW5kKSkKKwkJCWVuZCA9IG5ld19lbmQ7CisJCWVsc2UKKwkJCWVuZCA9IG5ld19lbmQgLSBibC0+YmxfYmxvY2tzaXplOworCX0KKwlpZiAoZW5kIDw9IG5ldy0+YnNlX2Zfb2Zmc2V0KSB7CisJCWtmcmVlKG5ldyk7CisJCXJldHVybiAwOworCX0KKwluZXctPmJzZV9sZW5ndGggPSBlbmQgLSBuZXctPmJzZV9mX29mZnNldDsKKwluZXctPmJzZV9kZXZpZCA9IGJlLT5iZV9kZXZpZDsKKwluZXctPmJzZV9tZGV2ID0gYmUtPmJlX21kZXY7CisKKwlzcGluX2xvY2soJmJsLT5ibF9leHRfbG9jayk7CisJLyogbmV3IHdpbGwgYmUgZnJlZWQsIGVpdGhlciBieSBhZGRfdG9fY29tbWl0bGlzdCBpZiBpdCBkZWNpZGVzIG5vdAorCSAqIHRvIHVzZSBpdCwgb3IgYWZ0ZXIgTEFZT1VUQ09NTUlUIHVzZXMgaXQgaW4gdGhlIGNvbW1pdGxpc3QuCisJICovCisJYWRkX3RvX2NvbW1pdGxpc3QoYmwsIG5ldyk7CisJc3Bpbl91bmxvY2soJmJsLT5ibF9leHRfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2JsX2V4dGVudChzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKmJlKQoreworCWRwcmludGsoIlBSSU5UIEVYVEVOVCBleHRlbnQgJXBcbiIsIGJlKTsKKwlpZiAoYmUpIHsKKwkJZHByaW50aygiICAgICAgICBiZV9mX29mZnNldCAlbGx1XG4iLCAodTY0KWJlLT5iZV9mX29mZnNldCk7CisJCWRwcmludGsoIiAgICAgICAgYmVfbGVuZ3RoICAgJWxsdVxuIiwgKHU2NCliZS0+YmVfbGVuZ3RoKTsKKwkJZHByaW50aygiICAgICAgICBiZV92X29mZnNldCAlbGx1XG4iLCAodTY0KWJlLT5iZV92X29mZnNldCk7CisJCWRwcmludGsoIiAgICAgICAgYmVfc3RhdGUgICAgJWRcbiIsIGJlLT5iZV9zdGF0ZSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorZGVzdHJveV9leHRlbnQoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50ICpiZTsKKworCWJlID0gY29udGFpbmVyX29mKGtyZWYsIHN0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCwgYmVfcmVmY250KTsKKwlkcHJpbnRrKCIlcyBiZT0lcFxuIiwgX19mdW5jX18sIGJlKTsKKwlrZnJlZShiZSk7Cit9CisKK3ZvaWQKK2JsX3B1dF9leHRlbnQoc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50ICpiZSkKK3sKKwlpZiAoYmUpIHsKKwkJZHByaW50aygiJXMgZW50ZXIgJXAgKCVpKVxuIiwgX19mdW5jX18sIGJlLAorCQkJYXRvbWljX3JlYWQoJmJlLT5iZV9yZWZjbnQucmVmY291bnQpKTsKKwkJa3JlZl9wdXQoJmJlLT5iZV9yZWZjbnQsIGRlc3Ryb3lfZXh0ZW50KTsKKwl9Cit9CisKK3N0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCAqYmxfYWxsb2NfZXh0ZW50KHZvaWQpCit7CisJc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50ICpiZTsKKworCWJlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50KSwgR0ZQX05PRlMpOworCWlmICghYmUpCisJCXJldHVybiBOVUxMOworCUlOSVRfTElTVF9IRUFEKCZiZS0+YmVfbm9kZSk7CisJa3JlZl9pbml0KCZiZS0+YmVfcmVmY250KTsKKwliZS0+YmVfaW52YWwgPSBOVUxMOworCXJldHVybiBiZTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfZWxpc3Qoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCkKK3sKKwlzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKmJlOworCWRwcmludGsoIioqKioqKioqKioqKioqKipcbiIpOworCWRwcmludGsoIkV4dGVudCBsaXN0IGxvb2tzIGxpa2U6XG4iKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJlLCBsaXN0LCBiZV9ub2RlKSB7CisJCXByaW50X2JsX2V4dGVudChiZSk7CisJfQorCWRwcmludGsoIioqKioqKioqKioqKioqKipcbiIpOworfQorCitzdGF0aWMgaW5saW5lIGludAorZXh0ZW50c19jb25zaXN0ZW50KHN0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCAqb2xkLCBzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKm5ldykKK3sKKwkvKiBOb3RlIHRoaXMgYXNzdW1lcyBuZXctPmJlX2Zfb2Zmc2V0ID49IG9sZC0+YmVfZl9vZmZzZXQgKi8KKwlyZXR1cm4gKG5ldy0+YmVfc3RhdGUgPT0gb2xkLT5iZV9zdGF0ZSkgJiYKKwkJKChuZXctPmJlX3N0YXRlID09IFBORlNfQkxPQ0tfTk9ORV9EQVRBKSB8fAorCQkgKChuZXctPmJlX3Zfb2Zmc2V0IC0gb2xkLT5iZV92X29mZnNldCA9PQorCQkgICBuZXctPmJlX2Zfb2Zmc2V0IC0gb2xkLT5iZV9mX29mZnNldCkgJiYKKwkJICBuZXctPmJlX21kZXYgPT0gb2xkLT5iZV9tZGV2KSk7Cit9CisKKy8qIEFkZHMgbmV3IHRvIGFwcHJvcHJpYXRlIGxpc3QgaW4gYmwsIG1vZGlmeWluZyBuZXcgYW5kIHJlbW92aW5nIGV4aXN0aW5nCisgKiBleHRlbnRzIGFzIGFwcHJvcHJpYXRlIHRvIGRlYWwgd2l0aCBvdmVybGFwcy4KKyAqCisgKiBTZWUgYmxfZmluZF9nZXRfZXh0ZW50IGZvciBsaXN0IGNvbnN0cmFpbnRzLgorICoKKyAqIFJlZmNvdW50IG9uIG5ldyBpcyBhbHJlYWR5IHNldC4gIElmIGVuZCB1cCBub3QgdXNpbmcgaXQsIG9yIGVycm9yIG91dCwKKyAqIG5lZWQgdG8gcHV0IHRoZSByZWZlcmVuY2UuCisgKgorICogYmwtPmJsX2V4dF9sb2NrIGlzIGhlbGQgYnkgY2FsbGVyLgorICovCitpbnQKK2JsX2FkZF9tZXJnZV9leHRlbnQoc3RydWN0IHBuZnNfYmxvY2tfbGF5b3V0ICpibCwKKwkJICAgICBzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKm5ldykKK3sKKwlzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKmJlLCAqdG1wOworCXNlY3Rvcl90IGVuZCA9IG5ldy0+YmVfZl9vZmZzZXQgKyBuZXctPmJlX2xlbmd0aDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCisJZHByaW50aygiJXMgZW50ZXIgd2l0aCBiZT0lcFxuIiwgX19mdW5jX18sIG5ldyk7CisJcHJpbnRfYmxfZXh0ZW50KG5ldyk7CisJbGlzdCA9ICZibC0+YmxfZXh0ZW50c1tibF9jaG9vc2VfbGlzdChuZXctPmJlX3N0YXRlKV07CisJcHJpbnRfZWxpc3QobGlzdCk7CisKKwkvKiBTY2FuIGZvciBwcm9wZXIgcGxhY2UgdG8gaW5zZXJ0LCBleHRlbmRpbmcgbmV3IHRvIHRoZSBsZWZ0CisJICogYXMgbXVjaCBhcyBwb3NzaWJsZS4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfcmV2ZXJzZShiZSwgdG1wLCBsaXN0LCBiZV9ub2RlKSB7CisJCWlmIChuZXctPmJlX2Zfb2Zmc2V0ID49IGJlLT5iZV9mX29mZnNldCArIGJlLT5iZV9sZW5ndGgpCisJCQlicmVhazsKKwkJaWYgKG5ldy0+YmVfZl9vZmZzZXQgPj0gYmUtPmJlX2Zfb2Zmc2V0KSB7CisJCQlpZiAoZW5kIDw9IGJlLT5iZV9mX29mZnNldCArIGJlLT5iZV9sZW5ndGgpIHsKKwkJCQkvKiBuZXcgaXMgYSBzdWJzZXQgb2YgZXhpc3RpbmcgYmUqLworCQkJCWlmIChleHRlbnRzX2NvbnNpc3RlbnQoYmUsIG5ldykpIHsKKwkJCQkJZHByaW50aygiJXM6IG5ldyBpcyBzdWJzZXQsIGlnbm9yaW5nXG4iLAorCQkJCQkJX19mdW5jX18pOworCQkJCQlibF9wdXRfZXh0ZW50KG5ldyk7CisJCQkJCXJldHVybiAwOworCQkJCX0gZWxzZSB7CisJCQkJCWdvdG8gb3V0X2VycjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCS8qIHw8LS0gICBiZSAgIC0tPnwKKwkJCQkgKiAgICAgICAgICB8PC0tICAgbmV3ICAgLS0+fCAqLworCQkJCWlmIChleHRlbnRzX2NvbnNpc3RlbnQoYmUsIG5ldykpIHsKKwkJCQkJLyogZXh0ZW5kIG5ldyB0byBmdWxseSByZXBsYWNlIGJlICovCisJCQkJCW5ldy0+YmVfbGVuZ3RoICs9IG5ldy0+YmVfZl9vZmZzZXQgLQorCQkJCQkJYmUtPmJlX2Zfb2Zmc2V0OworCQkJCQluZXctPmJlX2Zfb2Zmc2V0ID0gYmUtPmJlX2Zfb2Zmc2V0OworCQkJCQluZXctPmJlX3Zfb2Zmc2V0ID0gYmUtPmJlX3Zfb2Zmc2V0OworCQkJCQlkcHJpbnRrKCIlczogcmVtb3ZpbmcgJXBcbiIsIF9fZnVuY19fLCBiZSk7CisJCQkJCWxpc3RfZGVsKCZiZS0+YmVfbm9kZSk7CisJCQkJCWJsX3B1dF9leHRlbnQoYmUpOworCQkJCX0gZWxzZSB7CisJCQkJCWdvdG8gb3V0X2VycjsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAoZW5kID49IGJlLT5iZV9mX29mZnNldCArIGJlLT5iZV9sZW5ndGgpIHsKKwkJCS8qIG5ldyBleHRlbnQgb3ZlcmxhcCBleGlzdGluZyBiZSAqLworCQkJaWYgKGV4dGVudHNfY29uc2lzdGVudChiZSwgbmV3KSkgeworCQkJCS8qIGV4dGVuZCBuZXcgdG8gZnVsbHkgcmVwbGFjZSBiZSAqLworCQkJCWRwcmludGsoIiVzOiByZW1vdmluZyAlcFxuIiwgX19mdW5jX18sIGJlKTsKKwkJCQlsaXN0X2RlbCgmYmUtPmJlX25vZGUpOworCQkJCWJsX3B1dF9leHRlbnQoYmUpOworCQkJfSBlbHNlIHsKKwkJCQlnb3RvIG91dF9lcnI7CisJCQl9CisJCX0gZWxzZSBpZiAoZW5kID4gYmUtPmJlX2Zfb2Zmc2V0KSB7CisJCQkvKiAgICAgICAgICAgfDwtLSAgIGJlICAgLS0+fAorCQkJICp8PC0tICAgbmV3ICAgLS0+fCAqLworCQkJaWYgKGV4dGVudHNfY29uc2lzdGVudChuZXcsIGJlKSkgeworCQkJCS8qIGV4dGVuZCBuZXcgdG8gZnVsbHkgcmVwbGFjZSBiZSAqLworCQkJCW5ldy0+YmVfbGVuZ3RoICs9IGJlLT5iZV9mX29mZnNldCArIGJlLT5iZV9sZW5ndGggLQorCQkJCQluZXctPmJlX2Zfb2Zmc2V0IC0gbmV3LT5iZV9sZW5ndGg7CisJCQkJZHByaW50aygiJXM6IHJlbW92aW5nICVwXG4iLCBfX2Z1bmNfXywgYmUpOworCQkJCWxpc3RfZGVsKCZiZS0+YmVfbm9kZSk7CisJCQkJYmxfcHV0X2V4dGVudChiZSk7CisJCQl9IGVsc2UgeworCQkJCWdvdG8gb3V0X2VycjsKKwkJCX0KKwkJfQorCX0KKwkvKiBOb3RlIHRoYXQgaWYgd2UgbmV2ZXIgaGl0IHRoZSBhYm92ZSBicmVhaywgYmUgd2lsbCBub3QgcG9pbnQgdG8gYQorCSAqIHZhbGlkIGV4dGVudC4gIEhvd2V2ZXIsIGluIHRoYXQgY2FzZSAmYmUtPmJlX25vZGU9PWxpc3QuCisJICovCisJbGlzdF9hZGQoJm5ldy0+YmVfbm9kZSwgJmJlLT5iZV9ub2RlKTsKKwlkcHJpbnRrKCIlczogaW5zZXJ0aW5nIG5ld1xuIiwgX19mdW5jX18pOworCXByaW50X2VsaXN0KGxpc3QpOworCS8qIEZJWE1FIC0gVGhlIHBlci1saXN0IGNvbnNpc3RlbmN5IGNoZWNrcyBoYXZlIGFsbCBiZWVuIGRvbmUsCisJICogc2hvdWxkIG5vdyBjaGVjayBjcm9zcy1saXN0IGNvbnNpc3RlbmN5LgorCSAqLworCXJldHVybiAwOworCisgb3V0X2VycjoKKwlibF9wdXRfZXh0ZW50KG5ldyk7CisJcmV0dXJuIC1FSU87Cit9CisKKy8qIFJldHVybnMgZXh0ZW50LCBvciBOVUxMLiAgSWYgYSBzZWNvbmQgUkVBRCBleHRlbnQgZXhpc3RzLCBpdCBpcyByZXR1cm5lZAorICogaW4gY293X3JlYWQsIGlmIGdpdmVuLgorICoKKyAqIFRoZSBleHRlbnRzIGFyZSBrZXB0IGluIHR3byBzZXBlcmF0ZSBvcmRlcmVkIGxpc3RzLCBvbmUgZm9yIFJFQUQgYW5kIE5PTkUsCisgKiBvbmUgZm9yIFJFQURXUklURSBhbmQgSU5WQUxJRC4gIFdpdGhpbiBlYWNoIGxpc3QsIHdlIGFzc3VtZToKKyAqIDEuIEV4dGVudHMgYXJlIG9yZGVyZWQgYnkgZmlsZSBvZmZzZXQuCisgKiAyLiBGb3IgYW55IGdpdmVuIGlzZWN0LCB0aGVyZSBpcyBhdCBtb3N0IG9uZSBleHRlbnRzIHRoYXQgbWF0Y2hlcy4KKyAqLworc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50ICoKK2JsX2ZpbmRfZ2V0X2V4dGVudChzdHJ1Y3QgcG5mc19ibG9ja19sYXlvdXQgKmJsLCBzZWN0b3JfdCBpc2VjdCwKKwkgICAgc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50ICoqY293X3JlYWQpCit7CisJc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50ICpiZSwgKmNvdywgKnJldDsKKwlpbnQgaTsKKworCWRwcmludGsoIiVzIGVudGVyIHdpdGggaXNlY3QgJWxsdVxuIiwgX19mdW5jX18sICh1NjQpaXNlY3QpOworCWNvdyA9IHJldCA9IE5VTEw7CisJc3Bpbl9sb2NrKCZibC0+YmxfZXh0X2xvY2spOworCWZvciAoaSA9IDA7IGkgPCBFWFRFTlRfTElTVFM7IGkrKykgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoYmUsICZibC0+YmxfZXh0ZW50c1tpXSwgYmVfbm9kZSkgeworCQkJaWYgKGlzZWN0ID49IGJlLT5iZV9mX29mZnNldCArIGJlLT5iZV9sZW5ndGgpCisJCQkJYnJlYWs7CisJCQlpZiAoaXNlY3QgPj0gYmUtPmJlX2Zfb2Zmc2V0KSB7CisJCQkJLyogV2UgaGF2ZSBmb3VuZCBhbiBleHRlbnQgKi8KKwkJCQlkcHJpbnRrKCIlcyBHZXQgJXAgKCVpKVxuIiwgX19mdW5jX18sIGJlLAorCQkJCQlhdG9taWNfcmVhZCgmYmUtPmJlX3JlZmNudC5yZWZjb3VudCkpOworCQkJCWtyZWZfZ2V0KCZiZS0+YmVfcmVmY250KTsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gYmU7CisJCQkJZWxzZSBpZiAoYmUtPmJlX3N0YXRlICE9IFBORlNfQkxPQ0tfUkVBRF9EQVRBKQorCQkJCQlibF9wdXRfZXh0ZW50KGJlKTsKKwkJCQllbHNlCisJCQkJCWNvdyA9IGJlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmIChyZXQgJiYKKwkJICAgICghY293X3JlYWQgfHwgcmV0LT5iZV9zdGF0ZSAhPSBQTkZTX0JMT0NLX0lOVkFMSURfREFUQSkpCisJCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2soJmJsLT5ibF9leHRfbG9jayk7CisJaWYgKGNvd19yZWFkKQorCQkqY293X3JlYWQgPSBjb3c7CisJcHJpbnRfYmxfZXh0ZW50KHJldCk7CisJcmV0dXJuIHJldDsKK30KKworLyogU2ltaWxhciB0byBibF9maW5kX2dldF9leHRlbnQsIGJ1dCBjYWxsZWQgd2l0aCBsb2NrIGhlbGQsIGFuZCBpZ25vcmVzIGNvdyAqLworc3RhdGljIHN0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCAqCitibF9maW5kX2dldF9leHRlbnRfbG9ja2VkKHN0cnVjdCBwbmZzX2Jsb2NrX2xheW91dCAqYmwsIHNlY3Rvcl90IGlzZWN0KQoreworCXN0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCAqYmUsICpyZXQgPSBOVUxMOworCWludCBpOworCisJZHByaW50aygiJXMgZW50ZXIgd2l0aCBpc2VjdCAlbGx1XG4iLCBfX2Z1bmNfXywgKHU2NClpc2VjdCk7CisJZm9yIChpID0gMDsgaSA8IEVYVEVOVF9MSVNUUzsgaSsrKSB7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGJlLCAmYmwtPmJsX2V4dGVudHNbaV0sIGJlX25vZGUpIHsKKwkJCWlmIChpc2VjdCA+PSBiZS0+YmVfZl9vZmZzZXQgKyBiZS0+YmVfbGVuZ3RoKQorCQkJCWJyZWFrOworCQkJaWYgKGlzZWN0ID49IGJlLT5iZV9mX29mZnNldCkgeworCQkJCS8qIFdlIGhhdmUgZm91bmQgYW4gZXh0ZW50ICovCisJCQkJZHByaW50aygiJXMgR2V0ICVwICglaSlcbiIsIF9fZnVuY19fLCBiZSwKKwkJCQkJYXRvbWljX3JlYWQoJmJlLT5iZV9yZWZjbnQucmVmY291bnQpKTsKKwkJCQlrcmVmX2dldCgmYmUtPmJlX3JlZmNudCk7CisJCQkJcmV0ID0gYmU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcHJpbnRfYmxfZXh0ZW50KHJldCk7CisJcmV0dXJuIHJldDsKK30KKworaW50CitlbmNvZGVfcG5mc19ibG9ja19sYXlvdXR1cGRhdGUoc3RydWN0IHBuZnNfYmxvY2tfbGF5b3V0ICpibCwKKwkJCSAgICAgICBzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBuZnM0X2xheW91dGNvbW1pdF9hcmdzICphcmcpCit7CisJc3RydWN0IHBuZnNfYmxvY2tfc2hvcnRfZXh0ZW50ICpsY2UsICpzYXZlOworCXVuc2lnbmVkIGludCBjb3VudCA9IDA7CisJX19iZTMyICpwLCAqeGRyX3N0YXJ0OworCisJZHByaW50aygiJXMgZW50ZXJcbiIsIF9fZnVuY19fKTsKKwkvKiBCVUcgLSBjcmVhdGlvbiBvZiBibF9jb21taXQgaXMgYnVnZ3kgLSBuZWVkIHRvIHdhaXQgZm9yCisJICogZW50aXJlIGJsb2NrIHRvIGJlIG1hcmtlZCBXUklUVEVOIGJlZm9yZSBpdCBjYW4gYmUgYWRkZWQuCisJICovCisJc3Bpbl9sb2NrKCZibC0+YmxfZXh0X2xvY2spOworCS8qIFdhbnQgdG8gYWRqdXN0IGZvciBwb3NzaWJsZSB0cnVuY2F0ZSAqLworCS8qIFdlIG5vdyB3YW50IHRvIGFkanVzdCBhcmd1bWVudCByYW5nZSAqLworCisJLyogWERSIGVuY29kZSB0aGUgcmFuZ2VzIGZvdW5kICovCisJeGRyX3N0YXJ0ID0geGRyX3Jlc2VydmVfc3BhY2UoeGRyLCA4KTsKKwlpZiAoIXhkcl9zdGFydCkKKwkJZ290byBvdXQ7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxjZSwgc2F2ZSwgJmJsLT5ibF9jb21taXQsIGJzZV9ub2RlKSB7CisJCXAgPSB4ZHJfcmVzZXJ2ZV9zcGFjZSh4ZHIsIDcgKiA0ICsgc2l6ZW9mKGxjZS0+YnNlX2RldmlkLmRhdGEpKTsKKwkJaWYgKCFwKQorCQkJYnJlYWs7CisJCXAgPSB4ZHJfZW5jb2RlX29wYXF1ZV9maXhlZChwLCBsY2UtPmJzZV9kZXZpZC5kYXRhLCBORlM0X0RFVklDRUlENF9TSVpFKTsKKwkJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgbGNlLT5ic2VfZl9vZmZzZXQgPDwgU0VDVE9SX1NISUZUKTsKKwkJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgbGNlLT5ic2VfbGVuZ3RoIDw8IFNFQ1RPUl9TSElGVCk7CisJCXAgPSB4ZHJfZW5jb2RlX2h5cGVyKHAsIDBMTCk7CisJCSpwKysgPSBjcHVfdG9fYmUzMihQTkZTX0JMT0NLX1JFQURXUklURV9EQVRBKTsKKwkJbGlzdF9kZWwoJmxjZS0+YnNlX25vZGUpOworCQlsaXN0X2FkZF90YWlsKCZsY2UtPmJzZV9ub2RlLCAmYmwtPmJsX2NvbW1pdHRpbmcpOworCQlibC0+YmxfY291bnQtLTsKKwkJY291bnQrKzsKKwl9CisJeGRyX3N0YXJ0WzBdID0gY3B1X3RvX2JlMzIoKHhkci0+cCAtIHhkcl9zdGFydCAtIDEpICogNCk7CisJeGRyX3N0YXJ0WzFdID0gY3B1X3RvX2JlMzIoY291bnQpOworb3V0OgorCXNwaW5fdW5sb2NrKCZibC0+YmxfZXh0X2xvY2spOworCWRwcmludGsoIiVzIGZvdW5kICVpIHJhbmdlc1xuIiwgX19mdW5jX18sIGNvdW50KTsKKwlyZXR1cm4gMDsKK30KKworLyogSGVscGVyIGZ1bmN0aW9uIHRvIHNldF90b19ydyB0aGF0IGluaXRpYWxpemUgYSBuZXcgZXh0ZW50ICovCitzdGF0aWMgdm9pZAorX3ByZXBfbmV3X2V4dGVudChzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKm5ldywKKwkJIHN0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCAqb3JpZywKKwkJIHNlY3Rvcl90IG9mZnNldCwgc2VjdG9yX3QgbGVuZ3RoLCBpbnQgc3RhdGUpCit7CisJa3JlZl9pbml0KCZuZXctPmJlX3JlZmNudCk7CisJLyogZG9uJ3QgbmVlZCB0byBJTklUX0xJU1RfSEVBRCgmbmV3LT5iZV9ub2RlKSAqLworCW1lbWNweSgmbmV3LT5iZV9kZXZpZCwgJm9yaWctPmJlX2RldmlkLCBzaXplb2Yoc3RydWN0IG5mczRfZGV2aWNlaWQpKTsKKwluZXctPmJlX21kZXYgPSBvcmlnLT5iZV9tZGV2OworCW5ldy0+YmVfZl9vZmZzZXQgPSBvZmZzZXQ7CisJbmV3LT5iZV9sZW5ndGggPSBsZW5ndGg7CisJbmV3LT5iZV92X29mZnNldCA9IG9yaWctPmJlX3Zfb2Zmc2V0IC0gb3JpZy0+YmVfZl9vZmZzZXQgKyBvZmZzZXQ7CisJbmV3LT5iZV9zdGF0ZSA9IHN0YXRlOworCW5ldy0+YmVfaW52YWwgPSBvcmlnLT5iZV9pbnZhbDsKK30KKworLyogVHJpZXMgdG8gbWVyZ2UgYmUgd2l0aCBleHRlbnQgaW4gZnJvbnQgb2YgaXQgaW4gbGlzdC4KKyAqIEZyZWVzIHN0b3JhZ2UgaWYgbm90IHVzZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKgorX2Zyb250X21lcmdlKHN0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCAqYmUsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCisJICAgICBzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKnN0b3JhZ2UpCit7CisJc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50ICpwcmV2OworCisJaWYgKCFzdG9yYWdlKQorCQlnb3RvIG5vX21lcmdlOworCWlmICgmYmUtPmJlX25vZGUgPT0gaGVhZCB8fCBiZS0+YmVfbm9kZS5wcmV2ID09IGhlYWQpCisJCWdvdG8gbm9fbWVyZ2U7CisJcHJldiA9IGxpc3RfZW50cnkoYmUtPmJlX25vZGUucHJldiwgc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50LCBiZV9ub2RlKTsKKwlpZiAoKHByZXYtPmJlX2Zfb2Zmc2V0ICsgcHJldi0+YmVfbGVuZ3RoICE9IGJlLT5iZV9mX29mZnNldCkgfHwKKwkgICAgIWV4dGVudHNfY29uc2lzdGVudChwcmV2LCBiZSkpCisJCWdvdG8gbm9fbWVyZ2U7CisJX3ByZXBfbmV3X2V4dGVudChzdG9yYWdlLCBwcmV2LCBwcmV2LT5iZV9mX29mZnNldCwKKwkJCSBwcmV2LT5iZV9sZW5ndGggKyBiZS0+YmVfbGVuZ3RoLCBwcmV2LT5iZV9zdGF0ZSk7CisJbGlzdF9yZXBsYWNlKCZwcmV2LT5iZV9ub2RlLCAmc3RvcmFnZS0+YmVfbm9kZSk7CisJYmxfcHV0X2V4dGVudChwcmV2KTsKKwlsaXN0X2RlbCgmYmUtPmJlX25vZGUpOworCWJsX3B1dF9leHRlbnQoYmUpOworCXJldHVybiBzdG9yYWdlOworCisgbm9fbWVyZ2U6CisJa2ZyZWUoc3RvcmFnZSk7CisJcmV0dXJuIGJlOworfQorCitzdGF0aWMgdTY0CitzZXRfdG9fcncoc3RydWN0IHBuZnNfYmxvY2tfbGF5b3V0ICpibCwgdTY0IG9mZnNldCwgdTY0IGxlbmd0aCkKK3sKKwl1NjQgcnYgPSBvZmZzZXQgKyBsZW5ndGg7CisJc3RydWN0IHBuZnNfYmxvY2tfZXh0ZW50ICpiZSwgKmUxLCAqZTIsICplMywgKm5ldywgKm9sZDsKKwlzdHJ1Y3QgcG5mc19ibG9ja19leHRlbnQgKmNoaWxkcmVuWzNdOworCXN0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCAqbWVyZ2UxID0gTlVMTCwgKm1lcmdlMiA9IE5VTEw7CisJaW50IGkgPSAwLCBqOworCisJZHByaW50aygiJXMoJWxsdSwgJWxsdSlcbiIsIF9fZnVuY19fLCBvZmZzZXQsIGxlbmd0aCk7CisJLyogQ3JlYXRlIHN0b3JhZ2UgZm9yIHVwIHRvIHRocmVlIG5ldyBleHRlbnRzIGUxLCBlMiwgZTMgKi8KKwllMSA9IGttYWxsb2Moc2l6ZW9mKCplMSksIEdGUF9BVE9NSUMpOworCWUyID0ga21hbGxvYyhzaXplb2YoKmUyKSwgR0ZQX0FUT01JQyk7CisJZTMgPSBrbWFsbG9jKHNpemVvZigqZTMpLCBHRlBfQVRPTUlDKTsKKwkvKiBCVUcgLSB3ZSBhcmUgaWdub3JpbmcgYW55IGZhaWx1cmUgKi8KKwlpZiAoIWUxIHx8ICFlMiB8fCAhZTMpCisJCWdvdG8gb3V0X25vc3BsaXQ7CisKKwlzcGluX2xvY2soJmJsLT5ibF9leHRfbG9jayk7CisJYmUgPSBibF9maW5kX2dldF9leHRlbnRfbG9ja2VkKGJsLCBvZmZzZXQpOworCXJ2ID0gYmUtPmJlX2Zfb2Zmc2V0ICsgYmUtPmJlX2xlbmd0aDsKKwlpZiAoYmUtPmJlX3N0YXRlICE9IFBORlNfQkxPQ0tfSU5WQUxJRF9EQVRBKSB7CisJCXNwaW5fdW5sb2NrKCZibC0+YmxfZXh0X2xvY2spOworCQlnb3RvIG91dF9ub3NwbGl0OworCX0KKwkvKiBBZGQgZSogdG8gY2hpbGRyZW4sIGJ1bXBpbmcgZSoncyBrcmVmcyAqLworCWlmIChiZS0+YmVfZl9vZmZzZXQgIT0gb2Zmc2V0KSB7CisJCV9wcmVwX25ld19leHRlbnQoZTEsIGJlLCBiZS0+YmVfZl9vZmZzZXQsCisJCQkJIG9mZnNldCAtIGJlLT5iZV9mX29mZnNldCwKKwkJCQkgUE5GU19CTE9DS19JTlZBTElEX0RBVEEpOworCQljaGlsZHJlbltpKytdID0gZTE7CisJCXByaW50X2JsX2V4dGVudChlMSk7CisJfSBlbHNlCisJCW1lcmdlMSA9IGUxOworCV9wcmVwX25ld19leHRlbnQoZTIsIGJlLCBvZmZzZXQsCisJCQkgbWluKGxlbmd0aCwgYmUtPmJlX2Zfb2Zmc2V0ICsgYmUtPmJlX2xlbmd0aCAtIG9mZnNldCksCisJCQkgUE5GU19CTE9DS19SRUFEV1JJVEVfREFUQSk7CisJY2hpbGRyZW5baSsrXSA9IGUyOworCXByaW50X2JsX2V4dGVudChlMik7CisJaWYgKG9mZnNldCArIGxlbmd0aCA8IGJlLT5iZV9mX29mZnNldCArIGJlLT5iZV9sZW5ndGgpIHsKKwkJX3ByZXBfbmV3X2V4dGVudChlMywgYmUsIGUyLT5iZV9mX29mZnNldCArIGUyLT5iZV9sZW5ndGgsCisJCQkJIGJlLT5iZV9mX29mZnNldCArIGJlLT5iZV9sZW5ndGggLQorCQkJCSBvZmZzZXQgLSBsZW5ndGgsCisJCQkJIFBORlNfQkxPQ0tfSU5WQUxJRF9EQVRBKTsKKwkJY2hpbGRyZW5baSsrXSA9IGUzOworCQlwcmludF9ibF9leHRlbnQoZTMpOworCX0gZWxzZQorCQltZXJnZTIgPSBlMzsKKworCS8qIFJlbW92ZSBiZSBmcm9tIGxpc3QsIGFuZCBpbnNlcnQgdGhlIGUqICovCisJLyogV2UgZG9uJ3QgZ2V0IHJlZnMgb24gZSosIHNpbmNlIHRoaXMgbGlzdCBpcyB0aGUgYmFzZSByZWZlcmVuY2UKKwkgKiBzZXQgd2hlbiBpbml0J2VkLgorCSAqLworCWlmIChpIDwgMykKKwkJY2hpbGRyZW5baV0gPSBOVUxMOworCW5ldyA9IGNoaWxkcmVuWzBdOworCWxpc3RfcmVwbGFjZSgmYmUtPmJlX25vZGUsICZuZXctPmJlX25vZGUpOworCWJsX3B1dF9leHRlbnQoYmUpOworCW5ldyA9IF9mcm9udF9tZXJnZShuZXcsICZibC0+YmxfZXh0ZW50c1tSV19FWFRFTlRdLCBtZXJnZTEpOworCWZvciAoaiA9IDE7IGogPCBpOyBqKyspIHsKKwkJb2xkID0gbmV3OworCQluZXcgPSBjaGlsZHJlbltqXTsKKwkJbGlzdF9hZGQoJm5ldy0+YmVfbm9kZSwgJm9sZC0+YmVfbm9kZSk7CisJfQorCWlmIChtZXJnZTIpIHsKKwkJLyogVGhpcyBpcyBhIEhBQ0ssIHNob3VsZCBqdXN0IGNyZWF0ZSBhIF9iYWNrX21lcmdlIGZ1bmN0aW9uICovCisJCW5ldyA9IGxpc3RfZW50cnkobmV3LT5iZV9ub2RlLm5leHQsCisJCQkJIHN0cnVjdCBwbmZzX2Jsb2NrX2V4dGVudCwgYmVfbm9kZSk7CisJCW5ldyA9IF9mcm9udF9tZXJnZShuZXcsICZibC0+YmxfZXh0ZW50c1tSV19FWFRFTlRdLCBtZXJnZTIpOworCX0KKwlzcGluX3VubG9jaygmYmwtPmJsX2V4dF9sb2NrKTsKKworCS8qIFNpbmNlIHdlIHJlbW92ZWQgdGhlIGJhc2UgcmVmZXJlbmNlIGFib3ZlLCBiZSBpcyBub3cgc2NoZWR1bGVkIGZvcgorCSAqIGRlc3RydWN0aW9uLgorCSAqLworCWJsX3B1dF9leHRlbnQoYmUpOworCWRwcmludGsoIiVzIHJldHVybnMgJWxsdSBhZnRlciBzcGxpdFxuIiwgX19mdW5jX18sIHJ2KTsKKwlyZXR1cm4gcnY7CisKKyBvdXRfbm9zcGxpdDoKKwlrZnJlZShlMSk7CisJa2ZyZWUoZTIpOworCWtmcmVlKGUzKTsKKwlkcHJpbnRrKCIlcyByZXR1cm5zICVsbHUgd2l0aG91dCBzcGxpdHRpbmdcbiIsIF9fZnVuY19fLCBydik7CisJcmV0dXJuIHJ2OworfQorCit2b2lkCitjbGVhbl9wbmZzX2Jsb2NrX2xheW91dHVwZGF0ZShzdHJ1Y3QgcG5mc19ibG9ja19sYXlvdXQgKmJsLAorCQkJICAgICAgY29uc3Qgc3RydWN0IG5mczRfbGF5b3V0Y29tbWl0X2FyZ3MgKmFyZywKKwkJCSAgICAgIGludCBzdGF0dXMpCit7CisJc3RydWN0IHBuZnNfYmxvY2tfc2hvcnRfZXh0ZW50ICpsY2UsICpzYXZlOworCisJZHByaW50aygiJXMgc3RhdHVzICVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobGNlLCBzYXZlLCAmYmwtPmJsX2NvbW1pdHRpbmcsIGJzZV9ub2RlKSB7CisJCWlmIChsaWtlbHkoIXN0YXR1cykpIHsKKwkJCXU2NCBvZmZzZXQgPSBsY2UtPmJzZV9mX29mZnNldDsKKwkJCXU2NCBlbmQgPSBvZmZzZXQgKyBsY2UtPmJzZV9sZW5ndGg7CisKKwkJCWRvIHsKKwkJCQlvZmZzZXQgPSBzZXRfdG9fcncoYmwsIG9mZnNldCwgZW5kIC0gb2Zmc2V0KTsKKwkJCX0gd2hpbGUgKG9mZnNldCA8IGVuZCk7CisJCQlsaXN0X2RlbCgmbGNlLT5ic2Vfbm9kZSk7CisKKwkJCWtmcmVlKGxjZSk7CisJCX0gZWxzZSB7CisJCQlsaXN0X2RlbCgmbGNlLT5ic2Vfbm9kZSk7CisJCQlzcGluX2xvY2soJmJsLT5ibF9leHRfbG9jayk7CisJCQlhZGRfdG9fY29tbWl0bGlzdChibCwgbGNlKTsKKwkJCXNwaW5fdW5sb2NrKCZibC0+YmxfZXh0X2xvY2spOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvZnMvbmZzL2NsaWVudC5jIGIvZnMvbmZzL2NsaWVudC5jCmluZGV4IDE5ZWE3ZDkuLjU4MzNmYmIgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9jbGllbnQuYworKysgYi9mcy9uZnMvY2xpZW50LmMKQEAgLTEwNSw3ICsxMDUsNyBAQAogCS5ucnZlcnMJCQk9IEFSUkFZX1NJWkUobmZzX3ZlcnNpb24pLAogCS52ZXJzaW9uCQk9IG5mc192ZXJzaW9uLAogCS5zdGF0cwkJCT0gJm5mc19ycGNzdGF0LAotCS5waXBlX2Rpcl9uYW1lCQk9ICIvbmZzIiwKKwkucGlwZV9kaXJfbmFtZQkJPSBORlNfUElQRV9ESVJOQU1FLAogfTsKIAogc3RydWN0IHJwY19zdGF0IG5mc19ycGNzdGF0ID0gewpAQCAtOTA0LDcgKzkwNCw5IEBACiAvKgogICogTG9hZCB1cCB0aGUgc2VydmVyIHJlY29yZCBmcm9tIGluZm9ybWF0aW9uIGdhaW5lZCBpbiBhbiBmc2luZm8gcmVjb3JkCiAgKi8KLXN0YXRpYyB2b2lkIG5mc19zZXJ2ZXJfc2V0X2ZzaW5mbyhzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBzdHJ1Y3QgbmZzX2ZzaW5mbyAqZnNpbmZvKQorc3RhdGljIHZvaWQgbmZzX3NlcnZlcl9zZXRfZnNpbmZvKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsCisJCQkJICBzdHJ1Y3QgbmZzX2ZoICptbnRmaCwKKwkJCQkgIHN0cnVjdCBuZnNfZnNpbmZvICpmc2luZm8pCiB7CiAJdW5zaWduZWQgbG9uZyBtYXhfcnBjX3BheWxvYWQ7CiAKQEAgLTkzNCw3ICs5MzYsOCBAQAogCWlmIChzZXJ2ZXItPndzaXplID4gTkZTX01BWF9GSUxFX0lPX1NJWkUpCiAJCXNlcnZlci0+d3NpemUgPSBORlNfTUFYX0ZJTEVfSU9fU0laRTsKIAlzZXJ2ZXItPndwYWdlcyA9IChzZXJ2ZXItPndzaXplICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQlzZXRfcG5mc19sYXlvdXRkcml2ZXIoc2VydmVyLCBmc2luZm8tPmxheW91dHR5cGUpOworCXNlcnZlci0+cG5mc19ibGtzaXplID0gZnNpbmZvLT5ibGtzaXplOworCXNldF9wbmZzX2xheW91dGRyaXZlcihzZXJ2ZXIsIG1udGZoLCBmc2luZm8tPmxheW91dHR5cGUpOwogCiAJc2VydmVyLT53dG11bHQgPSBuZnNfYmxvY2tfYml0cyhmc2luZm8tPnd0bXVsdCwgTlVMTCk7CiAKQEAgLTk4MCw3ICs5ODMsNyBAQAogCWlmIChlcnJvciA8IDApCiAJCWdvdG8gb3V0X2Vycm9yOwogCi0JbmZzX3NlcnZlcl9zZXRfZnNpbmZvKHNlcnZlciwgJmZzaW5mbyk7CisJbmZzX3NlcnZlcl9zZXRfZnNpbmZvKHNlcnZlciwgbW50ZmgsICZmc2luZm8pOwogCiAJLyogR2V0IHNvbWUgZ2VuZXJhbCBmaWxlIHN5c3RlbSBpbmZvICovCiAJaWYgKHNlcnZlci0+bmFtZWxlbiA9PSAwKSB7CmRpZmYgLS1naXQgYS9mcy9uZnMvZGlyLmMgYi9mcy9uZnMvZGlyLmMKaW5kZXggNTdmNTc4ZS4uYjIzOGQ5NSAxMDA2NDQKLS0tIGEvZnMvbmZzL2Rpci5jCisrKyBiL2ZzL25mcy9kaXIuYwpAQCAtMTM0LDE4ICsxMzQsMTkgQEAKIAogI2VuZGlmIC8qIENPTkZJR19ORlNfVjQgKi8KIAotc3RhdGljIHN0cnVjdCBuZnNfb3Blbl9kaXJfY29udGV4dCAqYWxsb2NfbmZzX29wZW5fZGlyX2NvbnRleHQoc3RydWN0IHJwY19jcmVkICpjcmVkKQorc3RhdGljIHN0cnVjdCBuZnNfb3Blbl9kaXJfY29udGV4dCAqYWxsb2NfbmZzX29wZW5fZGlyX2NvbnRleHQoc3RydWN0IGlub2RlICpkaXIsIHN0cnVjdCBycGNfY3JlZCAqY3JlZCkKIHsKIAlzdHJ1Y3QgbmZzX29wZW5fZGlyX2NvbnRleHQgKmN0eDsKIAljdHggPSBrbWFsbG9jKHNpemVvZigqY3R4KSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGN0eCAhPSBOVUxMKSB7CiAJCWN0eC0+ZHVwZWQgPSAwOworCQljdHgtPmF0dHJfZ2VuY291bnQgPSBORlNfSShkaXIpLT5hdHRyX2dlbmNvdW50OwogCQljdHgtPmRpcl9jb29raWUgPSAwOwogCQljdHgtPmR1cF9jb29raWUgPSAwOwogCQljdHgtPmNyZWQgPSBnZXRfcnBjY3JlZChjcmVkKTsKLQl9IGVsc2UKLQkJY3R4ID0gRVJSX1BUUigtRU5PTUVNKTsKLQlyZXR1cm4gY3R4OworCQlyZXR1cm4gY3R4OworCX0KKwlyZXR1cm4gIEVSUl9QVFIoLUVOT01FTSk7CiB9CiAKIHN0YXRpYyB2b2lkIHB1dF9uZnNfb3Blbl9kaXJfY29udGV4dChzdHJ1Y3QgbmZzX29wZW5fZGlyX2NvbnRleHQgKmN0eCkKQEAgLTE3Myw3ICsxNzQsNyBAQAogCWNyZWQgPSBycGNfbG9va3VwX2NyZWQoKTsKIAlpZiAoSVNfRVJSKGNyZWQpKQogCQlyZXR1cm4gUFRSX0VSUihjcmVkKTsKLQljdHggPSBhbGxvY19uZnNfb3Blbl9kaXJfY29udGV4dChjcmVkKTsKKwljdHggPSBhbGxvY19uZnNfb3Blbl9kaXJfY29udGV4dChpbm9kZSwgY3JlZCk7CiAJaWYgKElTX0VSUihjdHgpKSB7CiAJCXJlcyA9IFBUUl9FUlIoY3R4KTsKIAkJZ290byBvdXQ7CkBAIC0zMjMsNyArMzI0LDYgQEAKIHsKIAlsb2ZmX3QgZGlmZiA9IGRlc2MtPmZpbGUtPmZfcG9zIC0gZGVzYy0+Y3VycmVudF9pbmRleDsKIAl1bnNpZ25lZCBpbnQgaW5kZXg7Ci0Jc3RydWN0IG5mc19vcGVuX2Rpcl9jb250ZXh0ICpjdHggPSBkZXNjLT5maWxlLT5wcml2YXRlX2RhdGE7CiAKIAlpZiAoZGlmZiA8IDApCiAJCWdvdG8gb3V0X2VvZjsKQEAgLTMzNiw3ICszMzYsNiBAQAogCWluZGV4ID0gKHVuc2lnbmVkIGludClkaWZmOwogCSpkZXNjLT5kaXJfY29va2llID0gYXJyYXktPmFycmF5W2luZGV4XS5jb29raWU7CiAJZGVzYy0+Y2FjaGVfZW50cnlfaW5kZXggPSBpbmRleDsKLQljdHgtPmR1cGVkID0gMDsKIAlyZXR1cm4gMDsKIG91dF9lb2Y6CiAJZGVzYy0+ZW9mID0gMTsKQEAgLTM0OSwxNCArMzQ4LDM0IEBACiAJaW50IGk7CiAJbG9mZl90IG5ld19wb3M7CiAJaW50IHN0YXR1cyA9IC1FQUdBSU47Ci0Jc3RydWN0IG5mc19vcGVuX2Rpcl9jb250ZXh0ICpjdHggPSBkZXNjLT5maWxlLT5wcml2YXRlX2RhdGE7CiAKIAlmb3IgKGkgPSAwOyBpIDwgYXJyYXktPnNpemU7IGkrKykgewogCQlpZiAoYXJyYXktPmFycmF5W2ldLmNvb2tpZSA9PSAqZGVzYy0+ZGlyX2Nvb2tpZSkgeworCQkJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGRlc2MtPmZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGUpOworCQkJc3RydWN0IG5mc19vcGVuX2Rpcl9jb250ZXh0ICpjdHggPSBkZXNjLT5maWxlLT5wcml2YXRlX2RhdGE7CisKIAkJCW5ld19wb3MgPSBkZXNjLT5jdXJyZW50X2luZGV4ICsgaTsKLQkJCWlmIChuZXdfcG9zIDwgZGVzYy0+ZmlsZS0+Zl9wb3MpIHsKKwkJCWlmIChjdHgtPmF0dHJfZ2VuY291bnQgIT0gbmZzaS0+YXR0cl9nZW5jb3VudAorCQkJICAgIHx8IChuZnNpLT5jYWNoZV92YWxpZGl0eSAmIChORlNfSU5PX0lOVkFMSURfQVRUUnxORlNfSU5PX0lOVkFMSURfREFUQSkpKSB7CisJCQkJY3R4LT5kdXBlZCA9IDA7CisJCQkJY3R4LT5hdHRyX2dlbmNvdW50ID0gbmZzaS0+YXR0cl9nZW5jb3VudDsKKwkJCX0gZWxzZSBpZiAobmV3X3BvcyA8IGRlc2MtPmZpbGUtPmZfcG9zKSB7CisJCQkJaWYgKGN0eC0+ZHVwZWQgPiAwCisJCQkJICAgICYmIGN0eC0+ZHVwX2Nvb2tpZSA9PSAqZGVzYy0+ZGlyX2Nvb2tpZSkgeworCQkJCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKSB7CisJCQkJCQlwcl9ub3RpY2UoIk5GUzogZGlyZWN0b3J5ICVzLyVzIGNvbnRhaW5zIGEgcmVhZGRpciBsb29wLiIKKwkJCQkJCQkJIlBsZWFzZSBjb250YWN0IHlvdXIgc2VydmVyIHZlbmRvci4gICIKKwkJCQkJCQkJIlRoZSBmaWxlOiAlcyBoYXMgZHVwbGljYXRlIGNvb2tpZSAlbGx1XG4iLAorCQkJCQkJCQlkZXNjLT5maWxlLT5mX2RlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLAorCQkJCQkJCQlkZXNjLT5maWxlLT5mX2RlbnRyeS0+ZF9uYW1lLm5hbWUsCisJCQkJCQkJCWFycmF5LT5hcnJheVtpXS5zdHJpbmcubmFtZSwKKwkJCQkJCQkJKmRlc2MtPmRpcl9jb29raWUpOworCQkJCQl9CisJCQkJCXN0YXR1cyA9IC1FTE9PUDsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQogCQkJCWN0eC0+ZHVwX2Nvb2tpZSA9ICpkZXNjLT5kaXJfY29va2llOwotCQkJCWN0eC0+ZHVwZWQgPSAxOworCQkJCWN0eC0+ZHVwZWQgPSAtMTsKIAkJCX0KIAkJCWRlc2MtPmZpbGUtPmZfcG9zID0gbmV3X3BvczsKIAkJCWRlc2MtPmNhY2hlX2VudHJ5X2luZGV4ID0gaTsKQEAgLTM2OCw2ICszODcsNyBAQAogCQlpZiAoKmRlc2MtPmRpcl9jb29raWUgPT0gYXJyYXktPmxhc3RfY29va2llKQogCQkJZGVzYy0+ZW9mID0gMTsKIAl9CitvdXQ6CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtNzQwLDE5ICs3NjAsNiBAQAogCXN0cnVjdCBuZnNfY2FjaGVfYXJyYXkgKmFycmF5ID0gTlVMTDsKIAlzdHJ1Y3QgbmZzX29wZW5fZGlyX2NvbnRleHQgKmN0eCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAotCWlmIChjdHgtPmR1cGVkICE9IDAgJiYgY3R4LT5kdXBfY29va2llID09ICpkZXNjLT5kaXJfY29va2llKSB7Ci0JCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpIHsKLQkJCXByX25vdGljZSgiTkZTOiBkaXJlY3RvcnkgJXMvJXMgY29udGFpbnMgYSByZWFkZGlyIGxvb3AuICAiCi0JCQkJIlBsZWFzZSBjb250YWN0IHlvdXIgc2VydmVyIHZlbmRvci4gICIKLQkJCQkiT2ZmZW5kaW5nIGNvb2tpZTogJWxsdVxuIiwKLQkJCQlmaWxlLT5mX2RlbnRyeS0+ZF9wYXJlbnQtPmRfbmFtZS5uYW1lLAotCQkJCWZpbGUtPmZfZGVudHJ5LT5kX25hbWUubmFtZSwKLQkJCQkqZGVzYy0+ZGlyX2Nvb2tpZSk7Ci0JCX0KLQkJcmVzID0gLUVMT09QOwotCQlnb3RvIG91dDsKLQl9Ci0KIAlhcnJheSA9IG5mc19yZWFkZGlyX2dldF9hcnJheShkZXNjLT5wYWdlKTsKIAlpZiAoSVNfRVJSKGFycmF5KSkgewogCQlyZXMgPSBQVFJfRVJSKGFycmF5KTsKQEAgLTc3NCw2ICs3ODEsOCBAQAogCQkJKmRlc2MtPmRpcl9jb29raWUgPSBhcnJheS0+YXJyYXlbaSsxXS5jb29raWU7CiAJCWVsc2UKIAkJCSpkZXNjLT5kaXJfY29va2llID0gYXJyYXktPmxhc3RfY29va2llOworCQlpZiAoY3R4LT5kdXBlZCAhPSAwKQorCQkJY3R4LT5kdXBlZCA9IDE7CiAJfQogCWlmIChhcnJheS0+ZW9mX2luZGV4ID49IDApCiAJCWRlc2MtPmVvZiA9IDE7CkBAIC04MDUsNiArODE0LDcgQEAKIAlzdHJ1Y3QgcGFnZQkqcGFnZSA9IE5VTEw7CiAJaW50CQlzdGF0dXM7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGRlc2MtPmZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IG5mc19vcGVuX2Rpcl9jb250ZXh0ICpjdHggPSBkZXNjLT5maWxlLT5wcml2YXRlX2RhdGE7CiAKIAlkZnByaW50ayhESVJDQUNIRSwgIk5GUzogdW5jYWNoZWRfcmVhZGRpcigpIHNlYXJjaGluZyBmb3IgY29va2llICVMdVxuIiwKIAkJCSh1bnNpZ25lZCBsb25nIGxvbmcpKmRlc2MtPmRpcl9jb29raWUpOwpAQCAtODE4LDYgKzgyOCw3IEBACiAJZGVzYy0+cGFnZV9pbmRleCA9IDA7CiAJZGVzYy0+bGFzdF9jb29raWUgPSAqZGVzYy0+ZGlyX2Nvb2tpZTsKIAlkZXNjLT5wYWdlID0gcGFnZTsKKwljdHgtPmR1cGVkID0gMDsKIAogCXN0YXR1cyA9IG5mc19yZWFkZGlyX3hkcl90b19hcnJheShkZXNjLCBwYWdlLCBpbm9kZSk7CiAJaWYgKHN0YXR1cyA8IDApCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzM2FjbC5jIGIvZnMvbmZzL25mczNhY2wuYwppbmRleCBlNDllNzMxLi43ZWYyMzk3IDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzM2FjbC5jCisrKyBiL2ZzL25mcy9uZnMzYWNsLmMKQEAgLTQxNSw3ICs0MTUsNyBAQAogfQogCiBpbnQgbmZzM19wcm9jX3NldF9kZWZhdWx0X2FjbChzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGlub2RlICppbm9kZSwKLQkJbW9kZV90IG1vZGUpCisJCXVtb2RlX3QgbW9kZSkKIHsKIAlzdHJ1Y3QgcG9zaXhfYWNsICpkZmFjbCwgKmFjbDsKIAlpbnQgZXJyb3IgPSAwOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczNwcm9jLmMgYi9mcy9uZnMvbmZzM3Byb2MuYwppbmRleCAzODA1M2Q4Li44NWYxNjkwIDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzM3Byb2MuYworKysgYi9mcy9uZnMvbmZzM3Byb2MuYwpAQCAtMzE2LDcgKzMxNiw3IEBACiAJCSBpbnQgZmxhZ3MsIHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHgpCiB7CiAJc3RydWN0IG5mczNfY3JlYXRlZGF0YSAqZGF0YTsKLQltb2RlX3QgbW9kZSA9IHNhdHRyLT5pYV9tb2RlOworCXVtb2RlX3QgbW9kZSA9IHNhdHRyLT5pYV9tb2RlOwogCWludCBzdGF0dXMgPSAtRU5PTUVNOwogCiAJZHByaW50aygiTkZTIGNhbGwgIGNyZWF0ZSAlc1xuIiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CkBAIC01NjIsNyArNTYyLDcgQEAKIG5mczNfcHJvY19ta2RpcihzdHJ1Y3QgaW5vZGUgKmRpciwgc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgaWF0dHIgKnNhdHRyKQogewogCXN0cnVjdCBuZnMzX2NyZWF0ZWRhdGEgKmRhdGE7Ci0JaW50IG1vZGUgPSBzYXR0ci0+aWFfbW9kZTsKKwl1bW9kZV90IG1vZGUgPSBzYXR0ci0+aWFfbW9kZTsKIAlpbnQgc3RhdHVzID0gLUVOT01FTTsKIAogCWRwcmludGsoIk5GUyBjYWxsICBta2RpciAlc1xuIiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CkBAIC02ODEsNyArNjgxLDcgQEAKIAkJZGV2X3QgcmRldikKIHsKIAlzdHJ1Y3QgbmZzM19jcmVhdGVkYXRhICpkYXRhOwotCW1vZGVfdCBtb2RlID0gc2F0dHItPmlhX21vZGU7CisJdW1vZGVfdCBtb2RlID0gc2F0dHItPmlhX21vZGU7CiAJaW50IHN0YXR1cyA9IC1FTk9NRU07CiAKIAlkcHJpbnRrKCJORlMgY2FsbCAgbWtub2QgJXMgJXU6JXVcbiIsIGRlbnRyeS0+ZF9uYW1lLm5hbWUsCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNF9mcy5oIGIvZnMvbmZzL25mczRfZnMuaAppbmRleCAxOTA5ZWU4Li4xZWMxYTg1IDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNF9mcy5oCisrKyBiL2ZzL25mcy9uZnM0X2ZzLmgKQEAgLTMxOCw3ICszMTgsNyBAQAogZXh0ZXJuIGNvbnN0IHUzMiBuZnM0X2ZhdHRyX2JpdG1hcFsyXTsKIGV4dGVybiBjb25zdCB1MzIgbmZzNF9zdGF0ZnNfYml0bWFwWzJdOwogZXh0ZXJuIGNvbnN0IHUzMiBuZnM0X3BhdGhjb25mX2JpdG1hcFsyXTsKLWV4dGVybiBjb25zdCB1MzIgbmZzNF9mc2luZm9fYml0bWFwWzJdOworZXh0ZXJuIGNvbnN0IHUzMiBuZnM0X2ZzaW5mb19iaXRtYXBbM107CiBleHRlcm4gY29uc3QgdTMyIG5mczRfZnNfbG9jYXRpb25zX2JpdG1hcFsyXTsKIAogLyogbmZzNHJlbmV3ZC5jICovCmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNGZpbGVsYXlvdXQuYyBiL2ZzL25mcy9uZnM0ZmlsZWxheW91dC5jCmluZGV4IGJlOTNhNjIuLmU4OTE1ZDQgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9uZnM0ZmlsZWxheW91dC5jCisrKyBiL2ZzL25mcy9uZnM0ZmlsZWxheW91dC5jCkBAIC0xNzAsNyArMTcwLDcgQEAKIAogCXBuZnNfc2V0X2xheW91dGNvbW1pdCh3ZGF0YSk7CiAJZHByaW50aygiJXMgaW9uZGUgJWx1IHBsc19lbmRfcG9zICVsdVxuIiwgX19mdW5jX18sIHdkYXRhLT5pbm9kZS0+aV9pbm8sCi0JCSh1bnNpZ25lZCBsb25nKSB3ZGF0YS0+bHNlZy0+cGxzX2VuZF9wb3MpOworCQkodW5zaWduZWQgbG9uZykgTkZTX0kod2RhdGEtPmlub2RlKS0+bGF5b3V0LT5wbGhfbHdiKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0cHJvYy5jIGIvZnMvbmZzL25mczRwcm9jLmMKaW5kZXggMDc5NjE0ZC4uOGM3NzAzOSAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczRwcm9jLmMKKysrIGIvZnMvbmZzL25mczRwcm9jLmMKQEAgLTE0MCwxMiArMTQwLDEzIEBACiAJMAogfTsKIAotY29uc3QgdTMyIG5mczRfZnNpbmZvX2JpdG1hcFsyXSA9IHsgRkFUVFI0X1dPUkQwX01BWEZJTEVTSVpFCitjb25zdCB1MzIgbmZzNF9mc2luZm9fYml0bWFwWzNdID0geyBGQVRUUjRfV09SRDBfTUFYRklMRVNJWkUKIAkJCXwgRkFUVFI0X1dPUkQwX01BWFJFQUQKIAkJCXwgRkFUVFI0X1dPUkQwX01BWFdSSVRFCiAJCQl8IEZBVFRSNF9XT1JEMF9MRUFTRV9USU1FLAogCQkJRkFUVFI0X1dPUkQxX1RJTUVfREVMVEEKLQkJCXwgRkFUVFI0X1dPUkQxX0ZTX0xBWU9VVF9UWVBFUworCQkJfCBGQVRUUjRfV09SRDFfRlNfTEFZT1VUX1RZUEVTLAorCQkJRkFUVFI0X1dPUkQyX0xBWU9VVF9CTEtTSVpFCiB9OwogCiBjb25zdCB1MzIgbmZzNF9mc19sb2NhdGlvbnNfYml0bWFwWzJdID0gewpAQCAtNTgzNCw2ICs1ODM1LDU0IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAorLyoKKyAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIERhdGEgU2VydmVyIGRldmljZXMgZnJvbSB0aGUgTURTLgorICovCitzdGF0aWMgaW50IF9uZnM0X2dldGRldmljZWxpc3Qoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwKKwkJCQkgICAgY29uc3Qgc3RydWN0IG5mc19maCAqZmgsCisJCQkJICAgIHN0cnVjdCBwbmZzX2RldmljZWxpc3QgKmRldmxpc3QpCit7CisJc3RydWN0IG5mczRfZ2V0ZGV2aWNlbGlzdF9hcmdzIGFyZ3MgPSB7CisJCS5maCA9IGZoLAorCQkubGF5b3V0Y2xhc3MgPSBzZXJ2ZXItPnBuZnNfY3Vycl9sZC0+aWQsCisJfTsKKwlzdHJ1Y3QgbmZzNF9nZXRkZXZpY2VsaXN0X3JlcyByZXMgPSB7CisJCS5kZXZsaXN0ID0gZGV2bGlzdCwKKwl9OworCXN0cnVjdCBycGNfbWVzc2FnZSBtc2cgPSB7CisJCS5ycGNfcHJvYyA9ICZuZnM0X3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9HRVRERVZJQ0VMSVNUXSwKKwkJLnJwY19hcmdwID0gJmFyZ3MsCisJCS5ycGNfcmVzcCA9ICZyZXMsCisJfTsKKwlpbnQgc3RhdHVzOworCisJZHByaW50aygiLS0+ICVzXG4iLCBfX2Z1bmNfXyk7CisJc3RhdHVzID0gbmZzNF9jYWxsX3N5bmMoc2VydmVyLT5jbGllbnQsIHNlcnZlciwgJm1zZywgJmFyZ3Muc2VxX2FyZ3MsCisJCQkJJnJlcy5zZXFfcmVzLCAwKTsKKwlkcHJpbnRrKCI8LS0gJXMgc3RhdHVzPSVkXG4iLCBfX2Z1bmNfXywgc3RhdHVzKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCitpbnQgbmZzNF9wcm9jX2dldGRldmljZWxpc3Qoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgbmZzX2ZoICpmaCwKKwkJCSAgICBzdHJ1Y3QgcG5mc19kZXZpY2VsaXN0ICpkZXZsaXN0KQoreworCXN0cnVjdCBuZnM0X2V4Y2VwdGlvbiBleGNlcHRpb24gPSB7IH07CisJaW50IGVycjsKKworCWRvIHsKKwkJZXJyID0gbmZzNF9oYW5kbGVfZXhjZXB0aW9uKHNlcnZlciwKKwkJCQlfbmZzNF9nZXRkZXZpY2VsaXN0KHNlcnZlciwgZmgsIGRldmxpc3QpLAorCQkJCSZleGNlcHRpb24pOworCX0gd2hpbGUgKGV4Y2VwdGlvbi5yZXRyeSk7CisKKwlkcHJpbnRrKCIlczogZXJyPSVkLCBudW1fZGV2cz0ldVxuIiwgX19mdW5jX18sCisJCWVyciwgZGV2bGlzdC0+bnVtX2RldnMpOworCisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG5mczRfcHJvY19nZXRkZXZpY2VsaXN0KTsKKwogc3RhdGljIGludAogX25mczRfcHJvY19nZXRkZXZpY2VpbmZvKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHN0cnVjdCBwbmZzX2RldmljZSAqcGRldikKIHsKQEAgLTU5MTIsOSArNTk2MSwxNiBAQAogc3RhdGljIHZvaWQgbmZzNF9sYXlvdXRjb21taXRfcmVsZWFzZSh2b2lkICpjYWxsZGF0YSkKIHsKIAlzdHJ1Y3QgbmZzNF9sYXlvdXRjb21taXRfZGF0YSAqZGF0YSA9IGNhbGxkYXRhOworCXN0cnVjdCBwbmZzX2xheW91dF9zZWdtZW50ICpsc2VnLCAqdG1wOwogCisJcG5mc19jbGVhbnVwX2xheW91dGNvbW1pdChkYXRhKTsKIAkvKiBNYXRjaGVkIGJ5IHJlZmVyZW5jZXMgaW4gcG5mc19zZXRfbGF5b3V0Y29tbWl0ICovCi0JcHV0X2xzZWcoZGF0YS0+bHNlZyk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxzZWcsIHRtcCwgJmRhdGEtPmxzZWdfbGlzdCwgcGxzX2xjX2xpc3QpIHsKKwkJbGlzdF9kZWxfaW5pdCgmbHNlZy0+cGxzX2xjX2xpc3QpOworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KE5GU19MU0VHX0xBWU9VVENPTU1JVCwKKwkJCQkgICAgICAgJmxzZWctPnBsc19mbGFncykpCisJCQlwdXRfbHNlZyhsc2VnKTsKKwl9CiAJcHV0X3JwY2NyZWQoZGF0YS0+Y3JlZCk7CiAJa2ZyZWUoZGF0YSk7CiB9CmRpZmYgLS1naXQgYS9mcy9uZnMvbmZzNHhkci5jIGIvZnMvbmZzL25mczR4ZHIuYwppbmRleCBjMTkxYTliLi4xZGNlMTJmIDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNHhkci5jCisrKyBiL2ZzL25mcy9uZnM0eGRyLmMKQEAgLTExMyw3ICsxMTMsMTEgQEAKICNkZWZpbmUgZW5jb2RlX3Jlc3RvcmVmaF9tYXhzeiAgKG9wX2VuY29kZV9oZHJfbWF4c3opCiAjZGVmaW5lIGRlY29kZV9yZXN0b3JlZmhfbWF4c3ogIChvcF9kZWNvZGVfaGRyX21heHN6KQogI2RlZmluZSBlbmNvZGVfZnNpbmZvX21heHN6CShlbmNvZGVfZ2V0YXR0cl9tYXhzeikKLSNkZWZpbmUgZGVjb2RlX2ZzaW5mb19tYXhzegkob3BfZGVjb2RlX2hkcl9tYXhzeiArIDE1KQorLyogVGhlIDUgYWNjb3VudHMgZm9yIHRoZSBQTkZTIGF0dHJpYnV0ZXMsIGFuZCBhc3N1bWVzIHRoYXQgYXQgbW9zdCB0aHJlZQorICogbGF5b3V0IHR5cGVzIHdpbGwgYmUgcmV0dXJuZWQuCisgKi8KKyNkZWZpbmUgZGVjb2RlX2ZzaW5mb19tYXhzegkob3BfZGVjb2RlX2hkcl9tYXhzeiArIFwKKwkJCQkgbmZzNF9mYXR0cl9iaXRtYXBfbWF4c3ogKyA0ICsgOCArIDUpCiAjZGVmaW5lIGVuY29kZV9yZW5ld19tYXhzegkob3BfZW5jb2RlX2hkcl9tYXhzeiArIDMpCiAjZGVmaW5lIGRlY29kZV9yZW5ld19tYXhzegkob3BfZGVjb2RlX2hkcl9tYXhzeikKICNkZWZpbmUgZW5jb2RlX3NldGNsaWVudGlkX21heHN6IFwKQEAgLTMxNCw2ICszMTgsMTcgQEAKIAkJCQlYRFJfUVVBRExFTihORlM0X01BWF9TRVNTSU9OSURfTEVOKSArIDUpCiAjZGVmaW5lIGVuY29kZV9yZWNsYWltX2NvbXBsZXRlX21heHN6CShvcF9lbmNvZGVfaGRyX21heHN6ICsgNCkKICNkZWZpbmUgZGVjb2RlX3JlY2xhaW1fY29tcGxldGVfbWF4c3oJKG9wX2RlY29kZV9oZHJfbWF4c3ogKyA0KQorI2RlZmluZSBlbmNvZGVfZ2V0ZGV2aWNlbGlzdF9tYXhzeiAob3BfZW5jb2RlX2hkcl9tYXhzeiArIDQgKyBcCisJCQkJZW5jb2RlX3ZlcmlmaWVyX21heHN6KQorI2RlZmluZSBkZWNvZGVfZ2V0ZGV2aWNlbGlzdF9tYXhzeiAob3BfZGVjb2RlX2hkcl9tYXhzeiArIFwKKwkJCQkyIC8qIG5mc19jb29raWU0IGdkbHJfY29va2llICovICsgXAorCQkJCWRlY29kZV92ZXJpZmllcl9tYXhzeiBcCisJCQkJICAvKiB2ZXJpZmllcjQgZ2Rscl92ZXJpZmllciAqLyArIFwKKwkJCQkxIC8qIGdkbHJfZGV2aWNlaWRfbGlzdCBjb3VudCAqLyArIFwKKwkJCQlYRFJfUVVBRExFTihORlM0X1BORlNfR0VUREVWTElTVF9NQVhOVU0gKiBcCisJCQkJCSAgICBORlM0X0RFVklDRUlENF9TSVpFKSBcCisJCQkJICAvKiBnZGxyX2RldmljZWlkX2xpc3QgKi8gKyBcCisJCQkJMSAvKiBib29sIGdkbHJfZW9mICovKQogI2RlZmluZSBlbmNvZGVfZ2V0ZGV2aWNlaW5mb19tYXhzeiAob3BfZW5jb2RlX2hkcl9tYXhzeiArIDQgKyBcCiAJCQkJWERSX1FVQURMRU4oTkZTNF9ERVZJQ0VJRDRfU0laRSkpCiAjZGVmaW5lIGRlY29kZV9nZXRkZXZpY2VpbmZvX21heHN6IChvcF9kZWNvZGVfaGRyX21heHN6ICsgXApAQCAtNzQ4LDYgKzc2MywxNCBAQAogI2RlZmluZSBORlM0X2RlY19yZWNsYWltX2NvbXBsZXRlX3N6CShjb21wb3VuZF9kZWNvZGVfaGRyX21heHN6ICsgXAogCQkJCQkgZGVjb2RlX3NlcXVlbmNlX21heHN6ICsgXAogCQkJCQkgZGVjb2RlX3JlY2xhaW1fY29tcGxldGVfbWF4c3opCisjZGVmaW5lIE5GUzRfZW5jX2dldGRldmljZWxpc3Rfc3ogKGNvbXBvdW5kX2VuY29kZV9oZHJfbWF4c3ogKyBcCisJCQkJZW5jb2RlX3NlcXVlbmNlX21heHN6ICsgXAorCQkJCWVuY29kZV9wdXRmaF9tYXhzeiArIFwKKwkJCQllbmNvZGVfZ2V0ZGV2aWNlbGlzdF9tYXhzeikKKyNkZWZpbmUgTkZTNF9kZWNfZ2V0ZGV2aWNlbGlzdF9zeiAoY29tcG91bmRfZGVjb2RlX2hkcl9tYXhzeiArIFwKKwkJCQlkZWNvZGVfc2VxdWVuY2VfbWF4c3ogKyBcCisJCQkJZGVjb2RlX3B1dGZoX21heHN6ICsgXAorCQkJCWRlY29kZV9nZXRkZXZpY2VsaXN0X21heHN6KQogI2RlZmluZSBORlM0X2VuY19nZXRkZXZpY2VpbmZvX3N6IChjb21wb3VuZF9lbmNvZGVfaGRyX21heHN6ICsgICAgXAogCQkJCWVuY29kZV9zZXF1ZW5jZV9tYXhzeiArXAogCQkJCWVuY29kZV9nZXRkZXZpY2VpbmZvX21heHN6KQpAQCAtMTEwNCw2ICsxMTI3LDM1IEBACiAJaGRyLT5yZXBsZW4gKz0gZGVjb2RlX2dldGF0dHJfbWF4c3o7CiB9CiAKK3N0YXRpYyB2b2lkCitlbmNvZGVfZ2V0YXR0cl90aHJlZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkgICAgIHVpbnQzMl90IGJtMCwgdWludDMyX3QgYm0xLCB1aW50MzJfdCBibTIsCisJCSAgICAgc3RydWN0IGNvbXBvdW5kX2hkciAqaGRyKQoreworCV9fYmUzMiAqcDsKKworCXAgPSByZXNlcnZlX3NwYWNlKHhkciwgNCk7CisJKnAgPSBjcHVfdG9fYmUzMihPUF9HRVRBVFRSKTsKKwlpZiAoYm0yKSB7CisJCXAgPSByZXNlcnZlX3NwYWNlKHhkciwgMTYpOworCQkqcCsrID0gY3B1X3RvX2JlMzIoMyk7CisJCSpwKysgPSBjcHVfdG9fYmUzMihibTApOworCQkqcCsrID0gY3B1X3RvX2JlMzIoYm0xKTsKKwkJKnAgPSBjcHVfdG9fYmUzMihibTIpOworCX0gZWxzZSBpZiAoYm0xKSB7CisJCXAgPSByZXNlcnZlX3NwYWNlKHhkciwgMTIpOworCQkqcCsrID0gY3B1X3RvX2JlMzIoMik7CisJCSpwKysgPSBjcHVfdG9fYmUzMihibTApOworCQkqcCA9IGNwdV90b19iZTMyKGJtMSk7CisJfSBlbHNlIHsKKwkJcCA9IHJlc2VydmVfc3BhY2UoeGRyLCA4KTsKKwkJKnArKyA9IGNwdV90b19iZTMyKDEpOworCQkqcCA9IGNwdV90b19iZTMyKGJtMCk7CisJfQorCWhkci0+bm9wcysrOworCWhkci0+cmVwbGVuICs9IGRlY29kZV9nZXRhdHRyX21heHN6OworfQorCiBzdGF0aWMgdm9pZCBlbmNvZGVfZ2V0ZmF0dHIoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgdTMyKiBiaXRtYXNrLCBzdHJ1Y3QgY29tcG91bmRfaGRyICpoZHIpCiB7CiAJZW5jb2RlX2dldGF0dHJfdHdvKHhkciwgYml0bWFza1swXSAmIG5mczRfZmF0dHJfYml0bWFwWzBdLApAQCAtMTExMiw4ICsxMTY0LDExIEBACiAKIHN0YXRpYyB2b2lkIGVuY29kZV9mc2luZm8oc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgY29uc3QgdTMyKiBiaXRtYXNrLCBzdHJ1Y3QgY29tcG91bmRfaGRyICpoZHIpCiB7Ci0JZW5jb2RlX2dldGF0dHJfdHdvKHhkciwgYml0bWFza1swXSAmIG5mczRfZnNpbmZvX2JpdG1hcFswXSwKLQkJCSAgIGJpdG1hc2tbMV0gJiBuZnM0X2ZzaW5mb19iaXRtYXBbMV0sIGhkcik7CisJZW5jb2RlX2dldGF0dHJfdGhyZWUoeGRyLAorCQkJICAgICBiaXRtYXNrWzBdICYgbmZzNF9mc2luZm9fYml0bWFwWzBdLAorCQkJICAgICBiaXRtYXNrWzFdICYgbmZzNF9mc2luZm9fYml0bWFwWzFdLAorCQkJICAgICBiaXRtYXNrWzJdICYgbmZzNF9mc2luZm9fYml0bWFwWzJdLAorCQkJICAgICBoZHIpOwogfQogCiBzdGF0aWMgdm9pZCBlbmNvZGVfZnNfbG9jYXRpb25zKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIGNvbnN0IHUzMiogYml0bWFzaywgc3RydWN0IGNvbXBvdW5kX2hkciAqaGRyKQpAQCAtMTg1NSw2ICsxOTEwLDI2IEBACiAKICNpZmRlZiBDT05GSUdfTkZTX1Y0XzEKIHN0YXRpYyB2b2lkCitlbmNvZGVfZ2V0ZGV2aWNlbGlzdChzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAorCQkgICAgIGNvbnN0IHN0cnVjdCBuZnM0X2dldGRldmljZWxpc3RfYXJncyAqYXJncywKKwkJICAgICBzdHJ1Y3QgY29tcG91bmRfaGRyICpoZHIpCit7CisJX19iZTMyICpwOworCW5mczRfdmVyaWZpZXIgZHVtbXkgPSB7CisJCS5kYXRhID0gImR1bW1tbW15IiwKKwl9OworCisJcCA9IHJlc2VydmVfc3BhY2UoeGRyLCAyMCk7CisJKnArKyA9IGNwdV90b19iZTMyKE9QX0dFVERFVklDRUxJU1QpOworCSpwKysgPSBjcHVfdG9fYmUzMihhcmdzLT5sYXlvdXRjbGFzcyk7CisJKnArKyA9IGNwdV90b19iZTMyKE5GUzRfUE5GU19HRVRERVZMSVNUX01BWE5VTSk7CisJeGRyX2VuY29kZV9oeXBlcihwLCAwVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvb2tpZSAqLworCWVuY29kZV9uZnM0X3ZlcmlmaWVyKHhkciwgJmR1bW15KTsKKwloZHItPm5vcHMrKzsKKwloZHItPnJlcGxlbiArPSBkZWNvZGVfZ2V0ZGV2aWNlbGlzdF9tYXhzejsKK30KKworc3RhdGljIHZvaWQKIGVuY29kZV9nZXRkZXZpY2VpbmZvKHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCiAJCSAgICAgY29uc3Qgc3RydWN0IG5mczRfZ2V0ZGV2aWNlaW5mb19hcmdzICphcmdzLAogCQkgICAgIHN0cnVjdCBjb21wb3VuZF9oZHIgKmhkcikKQEAgLTE5MTYsNyArMTk5MSw3IEBACiAJKnArKyA9IGNwdV90b19iZTMyKE9QX0xBWU9VVENPTU1JVCk7CiAJLyogT25seSB3aG9sZSBmaWxlIGxheW91dHMgKi8KIAlwID0geGRyX2VuY29kZV9oeXBlcihwLCAwKTsgLyogb2Zmc2V0ICovCi0JcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgTkZTNF9NQVhfVUlOVDY0KTsgLyogbGVuZ3RoICovCisJcCA9IHhkcl9lbmNvZGVfaHlwZXIocCwgYXJncy0+bGFzdGJ5dGV3cml0dGVuICsgMSk7CS8qIGxlbmd0aCAqLwogCSpwKysgPSBjcHVfdG9fYmUzMigwKTsgLyogcmVjbGFpbSAqLwogCXAgPSB4ZHJfZW5jb2RlX29wYXF1ZV9maXhlZChwLCBhcmdzLT5zdGF0ZWlkLmRhdGEsIE5GUzRfU1RBVEVJRF9TSVpFKTsKIAkqcCsrID0gY3B1X3RvX2JlMzIoMSk7IC8qIG5ld29mZnNldCA9IFRSVUUgKi8KQEAgLTI2MDQsNyArMjY3OSw3IEBACiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5ub3BzCT0gMCwKIAl9OwotCWNvbnN0IHUzMiBsZWFzZV9iaXRtYXBbMl0gPSB7IEZBVFRSNF9XT1JEMF9MRUFTRV9USU1FLCAwIH07CisJY29uc3QgdTMyIGxlYXNlX2JpdG1hcFszXSA9IHsgRkFUVFI0X1dPUkQwX0xFQVNFX1RJTUUgfTsKIAogCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOwogCWVuY29kZV9zZXRjbGllbnRpZF9jb25maXJtKHhkciwgYXJnLCAmaGRyKTsKQEAgLTI3NDgsNyArMjgyMyw3IEBACiAJc3RydWN0IGNvbXBvdW5kX2hkciBoZHIgPSB7CiAJCS5taW5vcnZlcnNpb24gPSBuZnM0X3hkcl9taW5vcnZlcnNpb24oJmFyZ3MtPmxhX3NlcV9hcmdzKSwKIAl9OwotCWNvbnN0IHUzMiBsZWFzZV9iaXRtYXBbMl0gPSB7IEZBVFRSNF9XT1JEMF9MRUFTRV9USU1FLCAwIH07CisJY29uc3QgdTMyIGxlYXNlX2JpdG1hcFszXSA9IHsgRkFUVFI0X1dPUkQwX0xFQVNFX1RJTUUgfTsKIAogCWVuY29kZV9jb21wb3VuZF9oZHIoeGRyLCByZXEsICZoZHIpOwogCWVuY29kZV9zZXF1ZW5jZSh4ZHIsICZhcmdzLT5sYV9zZXFfYXJncywgJmhkcik7CkBAIC0yNzc1LDYgKzI4NTAsMjQgQEAKIH0KIAogLyoKKyAqIEVuY29kZSBHRVRERVZJQ0VMSVNUIHJlcXVlc3QKKyAqLworc3RhdGljIHZvaWQgbmZzNF94ZHJfZW5jX2dldGRldmljZWxpc3Qoc3RydWN0IHJwY19ycXN0ICpyZXEsCisJCQkJICAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgICAgIHN0cnVjdCBuZnM0X2dldGRldmljZWxpc3RfYXJncyAqYXJncykKK3sKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkciA9IHsKKwkJLm1pbm9ydmVyc2lvbiA9IG5mczRfeGRyX21pbm9ydmVyc2lvbigmYXJncy0+c2VxX2FyZ3MpLAorCX07CisKKwllbmNvZGVfY29tcG91bmRfaGRyKHhkciwgcmVxLCAmaGRyKTsKKwllbmNvZGVfc2VxdWVuY2UoeGRyLCAmYXJncy0+c2VxX2FyZ3MsICZoZHIpOworCWVuY29kZV9wdXRmaCh4ZHIsIGFyZ3MtPmZoLCAmaGRyKTsKKwllbmNvZGVfZ2V0ZGV2aWNlbGlzdCh4ZHIsIGFyZ3MsICZoZHIpOworCWVuY29kZV9ub3BzKCZoZHIpOworfQorCisvKgogICogRW5jb2RlIEdFVERFVklDRUlORk8gcmVxdWVzdAogICovCiBzdGF0aWMgdm9pZCBuZnM0X3hkcl9lbmNfZ2V0ZGV2aWNlaW5mbyhzdHJ1Y3QgcnBjX3Jxc3QgKnJlcSwKQEAgLTMwMTEsMTQgKzMxMDQsMTcgQEAKIAkJZ290byBvdXRfb3ZlcmZsb3c7CiAJYm1sZW4gPSBiZTMyX3RvX2NwdXAocCk7CiAKLQliaXRtYXBbMF0gPSBiaXRtYXBbMV0gPSAwOworCWJpdG1hcFswXSA9IGJpdG1hcFsxXSA9IGJpdG1hcFsyXSA9IDA7CiAJcCA9IHhkcl9pbmxpbmVfZGVjb2RlKHhkciwgKGJtbGVuIDw8IDIpKTsKIAlpZiAodW5saWtlbHkoIXApKQogCQlnb3RvIG91dF9vdmVyZmxvdzsKIAlpZiAoYm1sZW4gPiAwKSB7CiAJCWJpdG1hcFswXSA9IGJlMzJfdG9fY3B1cChwKyspOwotCQlpZiAoYm1sZW4gPiAxKQotCQkJYml0bWFwWzFdID0gYmUzMl90b19jcHVwKHApOworCQlpZiAoYm1sZW4gPiAxKSB7CisJCQliaXRtYXBbMV0gPSBiZTMyX3RvX2NwdXAocCsrKTsKKwkJCWlmIChibWxlbiA+IDIpCisJCQkJYml0bWFwWzJdID0gYmUzMl90b19jcHVwKHApOworCQl9CiAJfQogCXJldHVybiAwOwogb3V0X292ZXJmbG93OgpAQCAtMzA1MCw4ICszMTQ2LDkgQEAKIAkJCXJldHVybiByZXQ7CiAJCWJpdG1hcFswXSAmPSB+RkFUVFI0X1dPUkQwX1NVUFBPUlRFRF9BVFRSUzsKIAl9IGVsc2UKLQkJYml0bWFza1swXSA9IGJpdG1hc2tbMV0gPSAwOwotCWRwcmludGsoIiVzOiBiaXRtYXNrPSUwOHg6JTA4eFxuIiwgX19mdW5jX18sIGJpdG1hc2tbMF0sIGJpdG1hc2tbMV0pOworCQliaXRtYXNrWzBdID0gYml0bWFza1sxXSA9IGJpdG1hc2tbMl0gPSAwOworCWRwcmludGsoIiVzOiBiaXRtYXNrPSUwOHg6JTA4eDolMDh4XG4iLCBfX2Z1bmNfXywKKwkJYml0bWFza1swXSwgYml0bWFza1sxXSwgYml0bWFza1syXSk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQxMDUsNyArNDIwMiw3IEBACiBzdGF0aWMgaW50IGRlY29kZV9zZXJ2ZXJfY2FwcyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzNF9zZXJ2ZXJfY2Fwc19yZXMgKnJlcykKIHsKIAlfX2JlMzIgKnNhdmVwOwotCXVpbnQzMl90IGF0dHJsZW4sIGJpdG1hcFsyXSA9IHswfTsKKwl1aW50MzJfdCBhdHRybGVuLCBiaXRtYXBbM10gPSB7MH07CiAJaW50IHN0YXR1czsKIAogCWlmICgoc3RhdHVzID0gZGVjb2RlX29wX2hkcih4ZHIsIE9QX0dFVEFUVFIpKSAhPSAwKQpAQCAtNDEzMSw3ICs0MjI4LDcgQEAKIHN0YXRpYyBpbnQgZGVjb2RlX3N0YXRmcyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCBzdHJ1Y3QgbmZzX2Zzc3RhdCAqZnNzdGF0KQogewogCV9fYmUzMiAqc2F2ZXA7Ci0JdWludDMyX3QgYXR0cmxlbiwgYml0bWFwWzJdID0gezB9OworCXVpbnQzMl90IGF0dHJsZW4sIGJpdG1hcFszXSA9IHswfTsKIAlpbnQgc3RhdHVzOwogCiAJaWYgKChzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkciwgT1BfR0VUQVRUUikpICE9IDApCkBAIC00MTYzLDcgKzQyNjAsNyBAQAogc3RhdGljIGludCBkZWNvZGVfcGF0aGNvbmYoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19wYXRoY29uZiAqcGF0aGNvbmYpCiB7CiAJX19iZTMyICpzYXZlcDsKLQl1aW50MzJfdCBhdHRybGVuLCBiaXRtYXBbMl0gPSB7MH07CisJdWludDMyX3QgYXR0cmxlbiwgYml0bWFwWzNdID0gezB9OwogCWludCBzdGF0dXM7CiAKIAlpZiAoKHN0YXR1cyA9IGRlY29kZV9vcF9oZHIoeGRyLCBPUF9HRVRBVFRSKSkgIT0gMCkKQEAgLTQzMDMsNyArNDQwMCw3IEBACiB7CiAJX19iZTMyICpzYXZlcDsKIAl1aW50MzJfdCBhdHRybGVuLAotCQkgYml0bWFwWzJdID0gezB9OworCQkgYml0bWFwWzNdID0gezB9OwogCWludCBzdGF0dXM7CiAKIAlzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkciwgT1BfR0VUQVRUUik7CkBAIC00Mzg5LDEwICs0NDg2LDMyIEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAorLyoKKyAqIFRoZSBwcmVmZXJlZCBibG9jayBzaXplIGZvciBsYXlvdXQgZGlyZWN0ZWQgaW8KKyAqLworc3RhdGljIGludCBkZWNvZGVfYXR0cl9sYXlvdXRfYmxrc2l6ZShzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLCB1aW50MzJfdCAqYml0bWFwLAorCQkJCSAgICAgIHVpbnQzMl90ICpyZXMpCit7CisJX19iZTMyICpwOworCisJZHByaW50aygiJXM6IGJpdG1hcCBpcyAleFxuIiwgX19mdW5jX18sIGJpdG1hcFsyXSk7CisJKnJlcyA9IDA7CisJaWYgKGJpdG1hcFsyXSAmIEZBVFRSNF9XT1JEMl9MQVlPVVRfQkxLU0laRSkgeworCQlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKKwkJaWYgKHVubGlrZWx5KCFwKSkgeworCQkJcHJpbnRfb3ZlcmZsb3dfbXNnKF9fZnVuY19fLCB4ZHIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJKnJlcyA9IGJlMzJfdG9fY3B1cChwKTsKKwkJYml0bWFwWzJdICY9IH5GQVRUUjRfV09SRDJfTEFZT1VUX0JMS1NJWkU7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGRlY29kZV9mc2luZm8oc3RydWN0IHhkcl9zdHJlYW0gKnhkciwgc3RydWN0IG5mc19mc2luZm8gKmZzaW5mbykKIHsKIAlfX2JlMzIgKnNhdmVwOwotCXVpbnQzMl90IGF0dHJsZW4sIGJpdG1hcFsyXTsKKwl1aW50MzJfdCBhdHRybGVuLCBiaXRtYXBbM107CiAJaW50IHN0YXR1czsKIAogCWlmICgoc3RhdHVzID0gZGVjb2RlX29wX2hkcih4ZHIsIE9QX0dFVEFUVFIpKSAhPSAwKQpAQCAtNDQyMCw2ICs0NTM5LDkgQEAKIAlzdGF0dXMgPSBkZWNvZGVfYXR0cl9wbmZzdHlwZSh4ZHIsIGJpdG1hcCwgJmZzaW5mby0+bGF5b3V0dHlwZSk7CiAJaWYgKHN0YXR1cyAhPSAwKQogCQlnb3RvIHhkcl9lcnJvcjsKKwlzdGF0dXMgPSBkZWNvZGVfYXR0cl9sYXlvdXRfYmxrc2l6ZSh4ZHIsIGJpdG1hcCwgJmZzaW5mby0+Ymxrc2l6ZSk7CisJaWYgKHN0YXR1cykKKwkJZ290byB4ZHJfZXJyb3I7CiAKIAlzdGF0dXMgPSB2ZXJpZnlfYXR0cl9sZW4oeGRyLCBzYXZlcCwgYXR0cmxlbik7CiB4ZHJfZXJyb3I6CkBAIC00ODM5LDcgKzQ5NjEsNyBAQAogewogCV9fYmUzMiAqc2F2ZXA7CiAJdWludDMyX3QgYXR0cmxlbiwKLQkJIGJpdG1hcFsyXSA9IHswfTsKKwkJIGJpdG1hcFszXSA9IHswfTsKIAlzdHJ1Y3Qga3ZlYyAqaW92ID0gcmVxLT5ycV9yY3ZfYnVmLmhlYWQ7CiAJaW50IHN0YXR1czsKIApAQCAtNTI2OCw2ICs1MzkwLDUzIEBACiB9CiAKICNpZiBkZWZpbmVkKENPTkZJR19ORlNfVjRfMSkKKy8qCisgKiBUT0RPOiBOZWVkIHRvIGhhbmRsZSBjYXNlIHdoZW4gRU9GICE9IHRydWU7CisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX2dldGRldmljZWxpc3Qoc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKKwkJCQlzdHJ1Y3QgcG5mc19kZXZpY2VsaXN0ICpyZXMpCit7CisJX19iZTMyICpwOworCWludCBzdGF0dXMsIGk7CisJc3RydWN0IG5mc193cml0ZXZlcmYgdmVyZnRlbXA7CisKKwlzdGF0dXMgPSBkZWNvZGVfb3BfaGRyKHhkciwgT1BfR0VUREVWSUNFTElTVCk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKworCXAgPSB4ZHJfaW5saW5lX2RlY29kZSh4ZHIsIDggKyA4ICsgNCk7CisJaWYgKHVubGlrZWx5KCFwKSkKKwkJZ290byBvdXRfb3ZlcmZsb3c7CisKKwkvKiBUT0RPOiBTa2lwIGNvb2tpZSBmb3Igbm93ICovCisJcCArPSAyOworCisJLyogUmVhZCB2ZXJpZmllciAqLworCXAgPSB4ZHJfZGVjb2RlX29wYXF1ZV9maXhlZChwLCB2ZXJmdGVtcC52ZXJpZmllciwgOCk7CisKKwlyZXMtPm51bV9kZXZzID0gYmUzMl90b19jcHVwKHApOworCisJZHByaW50aygiJXM6IG51bV9kZXYgJWRcbiIsIF9fZnVuY19fLCByZXMtPm51bV9kZXZzKTsKKworCWlmIChyZXMtPm51bV9kZXZzID4gTkZTNF9QTkZTX0dFVERFVkxJU1RfTUFYTlVNKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXMgdG9vIG1hbnkgcmVzdWx0IGRldl9udW0gJXVcbiIsCisJCQkJX19mdW5jX18sIHJlcy0+bnVtX2RldnMpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLAorCQkJICAgICAgcmVzLT5udW1fZGV2cyAqIE5GUzRfREVWSUNFSUQ0X1NJWkUgKyA0KTsKKwlpZiAodW5saWtlbHkoIXApKQorCQlnb3RvIG91dF9vdmVyZmxvdzsKKwlmb3IgKGkgPSAwOyBpIDwgcmVzLT5udW1fZGV2czsgaSsrKQorCQlwID0geGRyX2RlY29kZV9vcGFxdWVfZml4ZWQocCwgcmVzLT5kZXZfaWRbaV0uZGF0YSwKKwkJCQkJICAgIE5GUzRfREVWSUNFSUQ0X1NJWkUpOworCXJlcy0+ZW9mID0gYmUzMl90b19jcHVwKHApOworCXJldHVybiAwOworb3V0X292ZXJmbG93OgorCXByaW50X292ZXJmbG93X21zZyhfX2Z1bmNfXywgeGRyKTsKKwlyZXR1cm4gLUVJTzsKK30KIAogc3RhdGljIGludCBkZWNvZGVfZ2V0ZGV2aWNlaW5mbyhzdHJ1Y3QgeGRyX3N0cmVhbSAqeGRyLAogCQkJCXN0cnVjdCBwbmZzX2RldmljZSAqcGRldikKQEAgLTU0MzAsNiArNTU5OSw3IEBACiAJaW50IHN0YXR1czsKIAogCXN0YXR1cyA9IGRlY29kZV9vcF9oZHIoeGRyLCBPUF9MQVlPVVRDT01NSVQpOworCXJlcy0+c3RhdHVzID0gc3RhdHVzOwogCWlmIChzdGF0dXMpCiAJCXJldHVybiBzdGF0dXM7CiAKQEAgLTY1NDIsNiArNjcxMiwzMiBAQAogfQogCiAvKgorICogRGVjb2RlIEdFVERFVklDRUxJU1QgcmVzcG9uc2UKKyAqLworc3RhdGljIGludCBuZnM0X3hkcl9kZWNfZ2V0ZGV2aWNlbGlzdChzdHJ1Y3QgcnBjX3Jxc3QgKnJxc3RwLAorCQkJCSAgICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCisJCQkJICAgICAgc3RydWN0IG5mczRfZ2V0ZGV2aWNlbGlzdF9yZXMgKnJlcykKK3sKKwlzdHJ1Y3QgY29tcG91bmRfaGRyIGhkcjsKKwlpbnQgc3RhdHVzOworCisJZHByaW50aygiZW5jb2RpbmcgZ2V0ZGV2aWNlbGlzdCFcbiIpOworCisJc3RhdHVzID0gZGVjb2RlX2NvbXBvdW5kX2hkcih4ZHIsICZoZHIpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZGVjb2RlX3NlcXVlbmNlKHhkciwgJnJlcy0+c2VxX3JlcywgcnFzdHApOworCWlmIChzdGF0dXMgIT0gMCkKKwkJZ290byBvdXQ7CisJc3RhdHVzID0gZGVjb2RlX3B1dGZoKHhkcik7CisJaWYgKHN0YXR1cyAhPSAwKQorCQlnb3RvIG91dDsKKwlzdGF0dXMgPSBkZWNvZGVfZ2V0ZGV2aWNlbGlzdCh4ZHIsIHJlcy0+ZGV2bGlzdCk7CitvdXQ6CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoKICAqIERlY29kZSBHRVRERVZJTkZPIHJlc3BvbnNlCiAgKi8KIHN0YXRpYyBpbnQgbmZzNF94ZHJfZGVjX2dldGRldmljZWluZm8oc3RydWN0IHJwY19ycXN0ICpycXN0cCwKQEAgLTY3MjIsNyArNjkxOCw3IEBACiBpbnQgbmZzNF9kZWNvZGVfZGlyZW50KHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsIHN0cnVjdCBuZnNfZW50cnkgKmVudHJ5LAogCQkgICAgICAgaW50IHBsdXMpCiB7Ci0JdWludDMyX3QgYml0bWFwWzJdID0gezB9OworCXVpbnQzMl90IGJpdG1hcFszXSA9IHswfTsKIAl1aW50MzJfdCBsZW47CiAJX19iZTMyICpwID0geGRyX2lubGluZV9kZWNvZGUoeGRyLCA0KTsKIAlpZiAodW5saWtlbHkoIXApKQpAQCAtNjkwOCw2ICs3MTA0LDcgQEAKIAlQUk9DKFNFQ0lORk9fTk9fTkFNRSwJZW5jX3NlY2luZm9fbm9fbmFtZSwJZGVjX3NlY2luZm9fbm9fbmFtZSksCiAJUFJPQyhURVNUX1NUQVRFSUQsCWVuY190ZXN0X3N0YXRlaWQsCWRlY190ZXN0X3N0YXRlaWQpLAogCVBST0MoRlJFRV9TVEFURUlELAllbmNfZnJlZV9zdGF0ZWlkLAlkZWNfZnJlZV9zdGF0ZWlkKSwKKwlQUk9DKEdFVERFVklDRUxJU1QsCWVuY19nZXRkZXZpY2VsaXN0LAlkZWNfZ2V0ZGV2aWNlbGlzdCksCiAjZW5kaWYgLyogQ09ORklHX05GU19WNF8xICovCiB9OwogCmRpZmYgLS1naXQgYS9mcy9uZnMvcG5mcy5jIGIvZnMvbmZzL3BuZnMuYwppbmRleCAzOGU1NTA4Li5lNTUwZTg4IDEwMDY0NAotLS0gYS9mcy9uZnMvcG5mcy5jCisrKyBiL2ZzL25mcy9wbmZzLmMKQEAgLTc2LDggKzc2LDExIEBACiB2b2lkCiB1bnNldF9wbmZzX2xheW91dGRyaXZlcihzdHJ1Y3QgbmZzX3NlcnZlciAqbmZzcykKIHsKLQlpZiAobmZzcy0+cG5mc19jdXJyX2xkKQorCWlmIChuZnNzLT5wbmZzX2N1cnJfbGQpIHsKKwkJaWYgKG5mc3MtPnBuZnNfY3Vycl9sZC0+Y2xlYXJfbGF5b3V0ZHJpdmVyKQorCQkJbmZzcy0+cG5mc19jdXJyX2xkLT5jbGVhcl9sYXlvdXRkcml2ZXIobmZzcyk7CiAJCW1vZHVsZV9wdXQobmZzcy0+cG5mc19jdXJyX2xkLT5vd25lcik7CisJfQogCW5mc3MtPnBuZnNfY3Vycl9sZCA9IE5VTEw7CiB9CiAKQEAgLTg4LDcgKzkxLDggQEAKICAqIEBpZCBsYXlvdXQgdHlwZS4gWmVybyAoaWxsZWdhbCBsYXlvdXQgdHlwZSkgaW5kaWNhdGVzIHBORlMgbm90IGluIHVzZS4KICAqLwogdm9pZAotc2V0X3BuZnNfbGF5b3V0ZHJpdmVyKHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIsIHUzMiBpZCkKK3NldF9wbmZzX2xheW91dGRyaXZlcihzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLCBjb25zdCBzdHJ1Y3QgbmZzX2ZoICptbnRmaCwKKwkJICAgICAgdTMyIGlkKQogewogCXN0cnVjdCBwbmZzX2xheW91dGRyaXZlcl90eXBlICpsZF90eXBlID0gTlVMTDsKIApAQCAtMTE1LDYgKzExOSwxMyBAQAogCQlnb3RvIG91dF9ub19kcml2ZXI7CiAJfQogCXNlcnZlci0+cG5mc19jdXJyX2xkID0gbGRfdHlwZTsKKwlpZiAobGRfdHlwZS0+c2V0X2xheW91dGRyaXZlcgorCSAgICAmJiBsZF90eXBlLT5zZXRfbGF5b3V0ZHJpdmVyKHNlcnZlciwgbW50ZmgpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IEVycm9yIGluaXRpYWxpemluZyBwTkZTIGxheW91dCBkcml2ZXIgJXUuXG4iLAorCQkJCV9fZnVuY19fLCBpZCk7CisJCW1vZHVsZV9wdXQobGRfdHlwZS0+b3duZXIpOworCQlnb3RvIG91dF9ub19kcml2ZXI7CisJfQogCiAJZHByaW50aygiJXM6IHBORlMgbW9kdWxlIGZvciAldSBzZXRcbiIsIF9fZnVuY19fLCBpZCk7CiAJcmV0dXJuOwpAQCAtMTkwLDYgKzIwMSw3IEBACiBwbmZzX2ZyZWVfbGF5b3V0X2hkcihzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpsbykKIHsKIAlzdHJ1Y3QgcG5mc19sYXlvdXRkcml2ZXJfdHlwZSAqbGQgPSBORlNfU0VSVkVSKGxvLT5wbGhfaW5vZGUpLT5wbmZzX2N1cnJfbGQ7CisJcHV0X3JwY2NyZWQobG8tPnBsaF9sY19jcmVkKTsKIAlyZXR1cm4gbGQtPmFsbG9jX2xheW91dF9oZHIgPyBsZC0+ZnJlZV9sYXlvdXRfaGRyKGxvKSA6IGtmcmVlKGxvKTsKIH0KIApAQCAtMjI0LDYgKzIzNiw3IEBACiBpbml0X2xzZWcoc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG8sIHN0cnVjdCBwbmZzX2xheW91dF9zZWdtZW50ICpsc2VnKQogewogCUlOSVRfTElTVF9IRUFEKCZsc2VnLT5wbHNfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmxzZWctPnBsc19sY19saXN0KTsKIAlhdG9taWNfc2V0KCZsc2VnLT5wbHNfcmVmY291bnQsIDEpOwogCXNtcF9tYigpOwogCXNldF9iaXQoTkZTX0xTRUdfVkFMSUQsICZsc2VnLT5wbHNfZmxhZ3MpOwpAQCAtODE2LDcgKzgyOSw5IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICoKLWFsbG9jX2luaXRfbGF5b3V0X2hkcihzdHJ1Y3QgaW5vZGUgKmlubywgZ2ZwX3QgZ2ZwX2ZsYWdzKQorYWxsb2NfaW5pdF9sYXlvdXRfaGRyKHN0cnVjdCBpbm9kZSAqaW5vLAorCQkgICAgICBzdHJ1Y3QgbmZzX29wZW5fY29udGV4dCAqY3R4LAorCQkgICAgICBnZnBfdCBnZnBfZmxhZ3MpCiB7CiAJc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbG87CiAKQEAgLTgyOCwxMSArODQzLDE0IEBACiAJSU5JVF9MSVNUX0hFQUQoJmxvLT5wbGhfc2Vncyk7CiAJSU5JVF9MSVNUX0hFQUQoJmxvLT5wbGhfYnVsa19yZWNhbGwpOwogCWxvLT5wbGhfaW5vZGUgPSBpbm87CisJbG8tPnBsaF9sY19jcmVkID0gZ2V0X3JwY2NyZWQoY3R4LT5zdGF0ZS0+b3duZXItPnNvX2NyZWQpOwogCXJldHVybiBsbzsKIH0KIAogc3RhdGljIHN0cnVjdCBwbmZzX2xheW91dF9oZHIgKgotcG5mc19maW5kX2FsbG9jX2xheW91dChzdHJ1Y3QgaW5vZGUgKmlubywgZ2ZwX3QgZ2ZwX2ZsYWdzKQorcG5mc19maW5kX2FsbG9jX2xheW91dChzdHJ1Y3QgaW5vZGUgKmlubywKKwkJICAgICAgIHN0cnVjdCBuZnNfb3Blbl9jb250ZXh0ICpjdHgsCisJCSAgICAgICBnZnBfdCBnZnBfZmxhZ3MpCiB7CiAJc3RydWN0IG5mc19pbm9kZSAqbmZzaSA9IE5GU19JKGlubyk7CiAJc3RydWN0IHBuZnNfbGF5b3V0X2hkciAqbmV3ID0gTlVMTDsKQEAgLTg0Nyw3ICs4NjUsNyBAQAogCQkJcmV0dXJuIG5mc2ktPmxheW91dDsKIAl9CiAJc3Bpbl91bmxvY2soJmluby0+aV9sb2NrKTsKLQluZXcgPSBhbGxvY19pbml0X2xheW91dF9oZHIoaW5vLCBnZnBfZmxhZ3MpOworCW5ldyA9IGFsbG9jX2luaXRfbGF5b3V0X2hkcihpbm8sIGN0eCwgZ2ZwX2ZsYWdzKTsKIAlzcGluX2xvY2soJmluby0+aV9sb2NrKTsKIAogCWlmIChsaWtlbHkobmZzaS0+bGF5b3V0ID09IE5VTEwpKQkvKiBXb24gdGhlIHJhY2U/ICovCkBAIC05NDAsNyArOTU4LDcgQEAKIAlpZiAoIXBuZnNfZW5hYmxlZF9zYihORlNfU0VSVkVSKGlubykpKQogCQlyZXR1cm4gTlVMTDsKIAlzcGluX2xvY2soJmluby0+aV9sb2NrKTsKLQlsbyA9IHBuZnNfZmluZF9hbGxvY19sYXlvdXQoaW5vLCBnZnBfZmxhZ3MpOworCWxvID0gcG5mc19maW5kX2FsbG9jX2xheW91dChpbm8sIGN0eCwgZ2ZwX2ZsYWdzKTsKIAlpZiAobG8gPT0gTlVMTCkgewogCQlkcHJpbnRrKCIlcyBFUlJPUjogY2FuJ3QgZ2V0IHBuZnNfbGF5b3V0X2hkclxuIiwgX19mdW5jX18pOwogCQlnb3RvIG91dF91bmxvY2s7CkBAIC0xMzUwLDE2ICsxMzY4LDE3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChwbmZzX2dlbmVyaWNfcGdfcmVhZHBhZ2VzKTsKIAogLyoKLSAqIEN1cnJlbnRseSB0aGVyZSBpcyBvbmx5IG9uZSAod2hvbGUgZmlsZSkgd3JpdGUgbHNlZy4KKyAqIFRoZXJlIGNhbiBiZSBtdWx0aXBsZSBSVyBzZWdtZW50cy4KICAqLwotc3RhdGljIHN0cnVjdCBwbmZzX2xheW91dF9zZWdtZW50ICpwbmZzX2xpc3Rfd3JpdGVfbHNlZyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQorc3RhdGljIHZvaWQgcG5mc19saXN0X3dyaXRlX2xzZWcoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGxpc3RfaGVhZCAqbGlzdHApCiB7Ci0Jc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWcsICpydiA9IE5VTEw7CisJc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgKmxzZWc7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxzZWcsICZORlNfSShpbm9kZSktPmxheW91dC0+cGxoX3NlZ3MsIHBsc19saXN0KQotCQlpZiAobHNlZy0+cGxzX3JhbmdlLmlvbW9kZSA9PSBJT01PREVfUlcpCi0JCQlydiA9IGxzZWc7Ci0JcmV0dXJuIHJ2OworCWxpc3RfZm9yX2VhY2hfZW50cnkobHNlZywgJk5GU19JKGlub2RlKS0+bGF5b3V0LT5wbGhfc2VncywgcGxzX2xpc3QpIHsKKwkJaWYgKGxzZWctPnBsc19yYW5nZS5pb21vZGUgPT0gSU9NT0RFX1JXICYmCisJCSAgICB0ZXN0X2JpdChORlNfTFNFR19MQVlPVVRDT01NSVQsICZsc2VnLT5wbHNfZmxhZ3MpKQorCQkJbGlzdF9hZGQoJmxzZWctPnBsc19sY19saXN0LCBsaXN0cCk7CisJfQogfQogCiB2b2lkCkBAIC0xMzcxLDE3ICsxMzkwLDE5IEBACiAKIAlzcGluX2xvY2soJm5mc2ktPnZmc19pbm9kZS5pX2xvY2spOwogCWlmICghdGVzdF9hbmRfc2V0X2JpdChORlNfSU5PX0xBWU9VVENPTU1JVCwgJm5mc2ktPmZsYWdzKSkgewotCQkvKiByZWZlcmVuY2VzIG1hdGNoZWQgaW4gbmZzNF9sYXlvdXRjb21taXRfcmVsZWFzZSAqLwotCQlnZXRfbHNlZyh3ZGF0YS0+bHNlZyk7Ci0JCXdkYXRhLT5sc2VnLT5wbHNfbGNfY3JlZCA9Ci0JCQlnZXRfcnBjY3JlZCh3ZGF0YS0+YXJncy5jb250ZXh0LT5zdGF0ZS0+b3duZXItPnNvX2NyZWQpOwogCQltYXJrX2FzX2RpcnR5ID0gdHJ1ZTsKIAkJZHByaW50aygiJXM6IFNldCBsYXlvdXRjb21taXQgZm9yIGlub2RlICVsdSAiLAogCQkJX19mdW5jX18sIHdkYXRhLT5pbm9kZS0+aV9pbm8pOwogCX0KLQlpZiAoZW5kX3BvcyA+IHdkYXRhLT5sc2VnLT5wbHNfZW5kX3BvcykKLQkJd2RhdGEtPmxzZWctPnBsc19lbmRfcG9zID0gZW5kX3BvczsKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoTkZTX0xTRUdfTEFZT1VUQ09NTUlULCAmd2RhdGEtPmxzZWctPnBsc19mbGFncykpIHsKKwkJLyogcmVmZXJlbmNlcyBtYXRjaGVkIGluIG5mczRfbGF5b3V0Y29tbWl0X3JlbGVhc2UgKi8KKwkJZ2V0X2xzZWcod2RhdGEtPmxzZWcpOworCX0KKwlpZiAoZW5kX3BvcyA+IG5mc2ktPmxheW91dC0+cGxoX2x3YikKKwkJbmZzaS0+bGF5b3V0LT5wbGhfbHdiID0gZW5kX3BvczsKIAlzcGluX3VubG9jaygmbmZzaS0+dmZzX2lub2RlLmlfbG9jayk7CisJZHByaW50aygiJXM6IGxzZWcgJXAgZW5kX3BvcyAlbGx1XG4iLAorCQlfX2Z1bmNfXywgd2RhdGEtPmxzZWcsIG5mc2ktPmxheW91dC0+cGxoX2x3Yik7CiAKIAkvKiBpZiBwbmZzX2xheW91dGNvbW1pdF9pbm9kZSgpIHJ1bnMgYmV0d2VlbiBpbm9kZSBsb2NrcywgdGhlIG5leHQgb25lCiAJICogd2lsbCBiZSBhIG5vb3AgYmVjYXVzZSBORlNfSU5PX0xBWU9VVENPTU1JVCB3aWxsIG5vdCBiZSBzZXQgKi8KQEAgLTEzOTAsNiArMTQxMSwxNCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocG5mc19zZXRfbGF5b3V0Y29tbWl0KTsKIAordm9pZCBwbmZzX2NsZWFudXBfbGF5b3V0Y29tbWl0KHN0cnVjdCBuZnM0X2xheW91dGNvbW1pdF9kYXRhICpkYXRhKQoreworCXN0cnVjdCBuZnNfc2VydmVyICpuZnNzID0gTkZTX1NFUlZFUihkYXRhLT5hcmdzLmlub2RlKTsKKworCWlmIChuZnNzLT5wbmZzX2N1cnJfbGQtPmNsZWFudXBfbGF5b3V0Y29tbWl0KQorCQluZnNzLT5wbmZzX2N1cnJfbGQtPmNsZWFudXBfbGF5b3V0Y29tbWl0KGRhdGEpOworfQorCiAvKgogICogRm9yIHRoZSBMQVlPVVQ0X05GU1Y0XzFfRklMRVMgbGF5b3V0IHR5cGUsIE5GU19EQVRBX1NZTkMgV1JJVEVzIGFuZAogICogTkZTX1VOU1RBQkxFIFdSSVRFcyB3aXRoIGEgQ09NTUlUIHRvIGRhdGEgc2VydmVycyBtdXN0IHN0b3JlIGVub3VnaApAQCAtMTQwMyw4ICsxNDMyLDYgQEAKIHsKIAlzdHJ1Y3QgbmZzNF9sYXlvdXRjb21taXRfZGF0YSAqZGF0YTsKIAlzdHJ1Y3QgbmZzX2lub2RlICpuZnNpID0gTkZTX0koaW5vZGUpOwotCXN0cnVjdCBwbmZzX2xheW91dF9zZWdtZW50ICpsc2VnOwotCXN0cnVjdCBycGNfY3JlZCAqY3JlZDsKIAlsb2ZmX3QgZW5kX3BvczsKIAlpbnQgc3RhdHVzID0gMDsKIApAQCAtMTQyMSwzMCArMTQ0OCwyNSBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlJTklUX0xJU1RfSEVBRCgmZGF0YS0+bHNlZ19saXN0KTsKIAlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOwogCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KE5GU19JTk9fTEFZT1VUQ09NTUlULCAmbmZzaS0+ZmxhZ3MpKSB7CiAJCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIAkJa2ZyZWUoZGF0YSk7CiAJCWdvdG8gb3V0OwogCX0KLQkvKgotCSAqIEN1cnJlbnRseSBvbmx5IG9uZSAod2hvbGUgZmlsZSkgd3JpdGUgbHNlZyB3aGljaCBpcyByZWZlcmVuY2VkCi0JICogaW4gcG5mc19zZXRfbGF5b3V0Y29tbWl0IGFuZCB3aWxsIGJlIGZvdW5kLgotCSAqLwotCWxzZWcgPSBwbmZzX2xpc3Rfd3JpdGVfbHNlZyhpbm9kZSk7CiAKLQllbmRfcG9zID0gbHNlZy0+cGxzX2VuZF9wb3M7Ci0JY3JlZCA9IGxzZWctPnBsc19sY19jcmVkOwotCWxzZWctPnBsc19lbmRfcG9zID0gMDsKLQlsc2VnLT5wbHNfbGNfY3JlZCA9IE5VTEw7CisJcG5mc19saXN0X3dyaXRlX2xzZWcoaW5vZGUsICZkYXRhLT5sc2VnX2xpc3QpOworCisJZW5kX3BvcyA9IG5mc2ktPmxheW91dC0+cGxoX2x3YjsKKwluZnNpLT5sYXlvdXQtPnBsaF9sd2IgPSAwOwogCiAJbWVtY3B5KCZkYXRhLT5hcmdzLnN0YXRlaWQuZGF0YSwgbmZzaS0+bGF5b3V0LT5wbGhfc3RhdGVpZC5kYXRhLAogCQlzaXplb2YobmZzaS0+bGF5b3V0LT5wbGhfc3RhdGVpZC5kYXRhKSk7CiAJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOwogCiAJZGF0YS0+YXJncy5pbm9kZSA9IGlub2RlOwotCWRhdGEtPmxzZWcgPSBsc2VnOwotCWRhdGEtPmNyZWQgPSBjcmVkOworCWRhdGEtPmNyZWQgPSBnZXRfcnBjY3JlZChuZnNpLT5sYXlvdXQtPnBsaF9sY19jcmVkKTsKIAluZnNfZmF0dHJfaW5pdCgmZGF0YS0+ZmF0dHIpOwogCWRhdGEtPmFyZ3MuYml0bWFzayA9IE5GU19TRVJWRVIoaW5vZGUpLT5jYWNoZV9jb25zaXN0ZW5jeV9iaXRtYXNrOwogCWRhdGEtPnJlcy5mYXR0ciA9ICZkYXRhLT5mYXR0cjsKZGlmZiAtLWdpdCBhL2ZzL25mcy9wbmZzLmggYi9mcy9uZnMvcG5mcy5oCmluZGV4IDA3ODY3MGQuLjAxY2JmZDUgMTAwNjQ0Ci0tLSBhL2ZzL25mcy9wbmZzLmgKKysrIGIvZnMvbmZzL3BuZnMuaApAQCAtMzYsMTYgKzM2LDE2IEBACiBlbnVtIHsKIAlORlNfTFNFR19WQUxJRCA9IDAsCS8qIGNsZWFyZWQgd2hlbiBsc2VnIGlzIHJlY2FsbGVkL3JldHVybmVkICovCiAJTkZTX0xTRUdfUk9DLAkJLyogcm9jIGJpdCByZWNlaXZlZCBmcm9tIHNlcnZlciAqLworCU5GU19MU0VHX0xBWU9VVENPTU1JVCwJLyogbGF5b3V0Y29tbWl0IGJpdCBzZXQgZm9yIGxheW91dGNvbW1pdCAqLwogfTsKIAogc3RydWN0IHBuZnNfbGF5b3V0X3NlZ21lbnQgewogCXN0cnVjdCBsaXN0X2hlYWQgcGxzX2xpc3Q7CisJc3RydWN0IGxpc3RfaGVhZCBwbHNfbGNfbGlzdDsKIAlzdHJ1Y3QgcG5mc19sYXlvdXRfcmFuZ2UgcGxzX3JhbmdlOwogCWF0b21pY190IHBsc19yZWZjb3VudDsKIAl1bnNpZ25lZCBsb25nIHBsc19mbGFnczsKIAlzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICpwbHNfbGF5b3V0OwotCXN0cnVjdCBycGNfY3JlZAkqcGxzX2xjX2NyZWQ7IC8qIExBWU9VVENPTU1JVCBjcmVkZW50aWFsICovCi0JbG9mZl90IHBsc19lbmRfcG9zOyAvKiBMQVlPVVRDT01NSVQgd3JpdGUgZW5kICovCiB9OwogCiBlbnVtIHBuZnNfdHJ5X3N0YXR1cyB7CkBAIC04MCw2ICs4MCw5IEBACiAJc3RydWN0IG1vZHVsZSAqb3duZXI7CiAJdW5zaWduZWQgZmxhZ3M7CiAKKwlpbnQgKCpzZXRfbGF5b3V0ZHJpdmVyKSAoc3RydWN0IG5mc19zZXJ2ZXIgKiwgY29uc3Qgc3RydWN0IG5mc19maCAqKTsKKwlpbnQgKCpjbGVhcl9sYXlvdXRkcml2ZXIpIChzdHJ1Y3QgbmZzX3NlcnZlciAqKTsKKwogCXN0cnVjdCBwbmZzX2xheW91dF9oZHIgKiAoKmFsbG9jX2xheW91dF9oZHIpIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBnZnBfdCBnZnBfZmxhZ3MpOwogCXZvaWQgKCpmcmVlX2xheW91dF9oZHIpIChzdHJ1Y3QgcG5mc19sYXlvdXRfaGRyICopOwogCkBAIC0xMTAsNiArMTEzLDggQEAKIAkJCQkgICAgIHN0cnVjdCB4ZHJfc3RyZWFtICp4ZHIsCiAJCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZzNF9sYXlvdXRyZXR1cm5fYXJncyAqYXJncyk7CiAKKwl2b2lkICgqY2xlYW51cF9sYXlvdXRjb21taXQpIChzdHJ1Y3QgbmZzNF9sYXlvdXRjb21taXRfZGF0YSAqZGF0YSk7CisKIAl2b2lkICgqZW5jb2RlX2xheW91dGNvbW1pdCkgKHN0cnVjdCBwbmZzX2xheW91dF9oZHIgKmxheW91dGlkLAogCQkJCSAgICAgc3RydWN0IHhkcl9zdHJlYW0gKnhkciwKIAkJCQkgICAgIGNvbnN0IHN0cnVjdCBuZnM0X2xheW91dGNvbW1pdF9hcmdzICphcmdzKTsKQEAgLTEyNSw2ICsxMzAsOCBAQAogCXVuc2lnbmVkIGxvbmcJCXBsaF9ibG9ja19sZ2V0czsgLyogYmxvY2sgTEFZT1VUR0VUIGlmID4wICovCiAJdTMyCQkJcGxoX2JhcnJpZXI7IC8qIGlnbm9yZSBsb3dlciBzZXFpZHMgKi8KIAl1bnNpZ25lZCBsb25nCQlwbGhfZmxhZ3M7CisJbG9mZl90CQkJcGxoX2x3YjsgLyogbGFzdCB3cml0ZSBieXRlIGZvciBsYXlvdXRjb21taXQgKi8KKwlzdHJ1Y3QgcnBjX2NyZWQJCSpwbGhfbGNfY3JlZDsgLyogbGF5b3V0Y29tbWl0IGNyZWQgKi8KIAlzdHJ1Y3QgaW5vZGUJCSpwbGhfaW5vZGU7CiB9OwogCkBAIC0xMzcsMTAgKzE0NCwyMSBAQAogCXVuc2lnbmVkIGludCAgcGdsZW47CiB9OwogCisjZGVmaW5lIE5GUzRfUE5GU19HRVRERVZMSVNUX01BWE5VTSAxNgorCitzdHJ1Y3QgcG5mc19kZXZpY2VsaXN0IHsKKwl1bnNpZ25lZCBpbnQJCWVvZjsKKwl1bnNpZ25lZCBpbnQJCW51bV9kZXZzOworCXN0cnVjdCBuZnM0X2RldmljZWlkCWRldl9pZFtORlM0X1BORlNfR0VUREVWTElTVF9NQVhOVU1dOworfTsKKwogZXh0ZXJuIGludCBwbmZzX3JlZ2lzdGVyX2xheW91dGRyaXZlcihzdHJ1Y3QgcG5mc19sYXlvdXRkcml2ZXJfdHlwZSAqKTsKIGV4dGVybiB2b2lkIHBuZnNfdW5yZWdpc3Rlcl9sYXlvdXRkcml2ZXIoc3RydWN0IHBuZnNfbGF5b3V0ZHJpdmVyX3R5cGUgKik7CiAKIC8qIG5mczRwcm9jLmMgKi8KK2V4dGVybiBpbnQgbmZzNF9wcm9jX2dldGRldmljZWxpc3Qoc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgbmZzX2ZoICpmaCwKKwkJCQkgICBzdHJ1Y3QgcG5mc19kZXZpY2VsaXN0ICpkZXZsaXN0KTsKIGV4dGVybiBpbnQgbmZzNF9wcm9jX2dldGRldmljZWluZm8oc3RydWN0IG5mc19zZXJ2ZXIgKnNlcnZlciwKIAkJCQkgICBzdHJ1Y3QgcG5mc19kZXZpY2UgKmRldik7CiBleHRlcm4gaW50IG5mczRfcHJvY19sYXlvdXRnZXQoc3RydWN0IG5mczRfbGF5b3V0Z2V0ICpsZ3ApOwpAQCAtMTUzLDcgKzE3MSw3IEBACiBib29sIHBuZnNfcGFnZWlvX2luaXRfcmVhZChzdHJ1Y3QgbmZzX3BhZ2Vpb19kZXNjcmlwdG9yICosIHN0cnVjdCBpbm9kZSAqKTsKIGJvb2wgcG5mc19wYWdlaW9faW5pdF93cml0ZShzdHJ1Y3QgbmZzX3BhZ2Vpb19kZXNjcmlwdG9yICosIHN0cnVjdCBpbm9kZSAqLCBpbnQpOwogCi12b2lkIHNldF9wbmZzX2xheW91dGRyaXZlcihzdHJ1Y3QgbmZzX3NlcnZlciAqLCB1MzIgaWQpOwordm9pZCBzZXRfcG5mc19sYXlvdXRkcml2ZXIoc3RydWN0IG5mc19zZXJ2ZXIgKiwgY29uc3Qgc3RydWN0IG5mc19maCAqLCB1MzIpOwogdm9pZCB1bnNldF9wbmZzX2xheW91dGRyaXZlcihzdHJ1Y3QgbmZzX3NlcnZlciAqKTsKIHZvaWQgcG5mc19nZW5lcmljX3BnX2luaXRfcmVhZChzdHJ1Y3QgbmZzX3BhZ2Vpb19kZXNjcmlwdG9yICosIHN0cnVjdCBuZnNfcGFnZSAqKTsKIGludCBwbmZzX2dlbmVyaWNfcGdfcmVhZHBhZ2VzKHN0cnVjdCBuZnNfcGFnZWlvX2Rlc2NyaXB0b3IgKmRlc2MpOwpAQCAtMTc5LDYgKzE5Nyw3IEBACiB2b2lkIHBuZnNfcm9jX3NldF9iYXJyaWVyKHN0cnVjdCBpbm9kZSAqaW5vLCB1MzIgYmFycmllcik7CiBib29sIHBuZnNfcm9jX2RyYWluKHN0cnVjdCBpbm9kZSAqaW5vLCB1MzIgKmJhcnJpZXIpOwogdm9pZCBwbmZzX3NldF9sYXlvdXRjb21taXQoc3RydWN0IG5mc193cml0ZV9kYXRhICp3ZGF0YSk7Cit2b2lkIHBuZnNfY2xlYW51cF9sYXlvdXRjb21taXQoc3RydWN0IG5mczRfbGF5b3V0Y29tbWl0X2RhdGEgKmRhdGEpOwogaW50IHBuZnNfbGF5b3V0Y29tbWl0X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGJvb2wgc3luYyk7CiBpbnQgX3BuZnNfcmV0dXJuX2xheW91dChzdHJ1Y3QgaW5vZGUgKik7CiBpbnQgcG5mc19sZF93cml0ZV9kb25lKHN0cnVjdCBuZnNfd3JpdGVfZGF0YSAqKTsKQEAgLTM2MCw3ICszNzksOCBAQAogCXJldHVybiBmYWxzZTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHNldF9wbmZzX2xheW91dGRyaXZlcihzdHJ1Y3QgbmZzX3NlcnZlciAqcywgdTMyIGlkKQorc3RhdGljIGlubGluZSB2b2lkIHNldF9wbmZzX2xheW91dGRyaXZlcihzdHJ1Y3QgbmZzX3NlcnZlciAqcywKKwkJCQkJIGNvbnN0IHN0cnVjdCBuZnNfZmggKm1udGZoLCB1MzIgaWQpCiB7CiB9CiAKZGlmZiAtLWdpdCBhL2ZzL29jZnMyL2FjbC5jIGIvZnMvb2NmczIvYWNsLmMKaW5kZXggNzgzYzU4ZC4uYTcyMTkwNyAxMDA2NDQKLS0tIGEvZnMvb2NmczIvYWNsLmMKKysrIGIvZnMvb2NmczIvYWNsLmMKQEAgLTI0Nyw3ICsyNDcsNyBAQAogCWNhc2UgQUNMX1RZUEVfQUNDRVNTOgogCQluYW1lX2luZGV4ID0gT0NGUzJfWEFUVFJfSU5ERVhfUE9TSVhfQUNMX0FDQ0VTUzsKIAkJaWYgKGFjbCkgewotCQkJbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOworCQkJdW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKIAkJCXJldCA9IHBvc2l4X2FjbF9lcXVpdl9tb2RlKGFjbCwgJm1vZGUpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJcmV0dXJuIHJldDsKQEAgLTM1MSw3ICszNTEsNyBAQAogCXN0cnVjdCBvY2ZzMl9zdXBlciAqb3NiID0gT0NGUzJfU0IoaW5vZGUtPmlfc2IpOwogCXN0cnVjdCBwb3NpeF9hY2wgKmFjbCA9IE5VTEw7CiAJaW50IHJldCA9IDAsIHJldDI7Ci0JbW9kZV90IG1vZGU7CisJdW1vZGVfdCBtb2RlOwogCiAJaWYgKCFTX0lTTE5LKGlub2RlLT5pX21vZGUpKSB7CiAJCWlmIChvc2ItPnNfbW91bnRfb3B0ICYgT0NGUzJfTU9VTlRfUE9TSVhfQUNMKSB7CmRpZmYgLS1naXQgYS9mcy9wb3NpeF9hY2wuYyBiL2ZzL3Bvc2l4X2FjbC5jCmluZGV4IGQ0MzcyOWE3Li4xMDAyN2I0IDEwMDY0NAotLS0gYS9mcy9wb3NpeF9hY2wuYworKysgYi9mcy9wb3NpeF9hY2wuYwpAQCAtMTQ5LDEwICsxNDksMTAgQEAKICAqIGZpbGUgbW9kZSBwZXJtaXNzaW9uIGJpdHMsIG9yIGVsc2UgMS4gUmV0dXJucyAtRS4uLiBvbiBlcnJvci4KICAqLwogaW50Ci1wb3NpeF9hY2xfZXF1aXZfbW9kZShjb25zdCBzdHJ1Y3QgcG9zaXhfYWNsICphY2wsIG1vZGVfdCAqbW9kZV9wKQorcG9zaXhfYWNsX2VxdWl2X21vZGUoY29uc3Qgc3RydWN0IHBvc2l4X2FjbCAqYWNsLCB1bW9kZV90ICptb2RlX3ApCiB7CiAJY29uc3Qgc3RydWN0IHBvc2l4X2FjbF9lbnRyeSAqcGEsICpwZTsKLQltb2RlX3QgbW9kZSA9IDA7CisJdW1vZGVfdCBtb2RlID0gMDsKIAlpbnQgbm90X2VxdWl2ID0gMDsKIAogCUZPUkVBQ0hfQUNMX0VOVFJZKHBhLCBhY2wsIHBlKSB7CkBAIC0xODgsNyArMTg4LDcgQEAKICAqIENyZWF0ZSBhbiBBQ0wgcmVwcmVzZW50aW5nIHRoZSBmaWxlIG1vZGUgcGVybWlzc2lvbiBiaXRzIG9mIGFuIGlub2RlLgogICovCiBzdHJ1Y3QgcG9zaXhfYWNsICoKLXBvc2l4X2FjbF9mcm9tX21vZGUobW9kZV90IG1vZGUsIGdmcF90IGZsYWdzKQorcG9zaXhfYWNsX2Zyb21fbW9kZSh1bW9kZV90IG1vZGUsIGdmcF90IGZsYWdzKQogewogCXN0cnVjdCBwb3NpeF9hY2wgKmFjbCA9IHBvc2l4X2FjbF9hbGxvYygzLCBmbGFncyk7CiAJaWYgKCFhY2wpCkBAIC0yNzksMTEgKzI3OSwxMSBAQAogICogc3lzdGVtIGNhbGxzLiBBbGwgcGVybWlzc2lvbnMgdGhhdCBhcmUgbm90IGdyYW50ZWQgYnkgdGhlIGFjbCBhcmUgcmVtb3ZlZC4KICAqIFRoZSBwZXJtaXNzaW9ucyBpbiB0aGUgYWNsIGFyZSBjaGFuZ2VkIHRvIHJlZmxlY3QgdGhlIG1vZGVfcCBwYXJhbWV0ZXIuCiAgKi8KLXN0YXRpYyBpbnQgcG9zaXhfYWNsX2NyZWF0ZV9tYXNxKHN0cnVjdCBwb3NpeF9hY2wgKmFjbCwgbW9kZV90ICptb2RlX3ApCitzdGF0aWMgaW50IHBvc2l4X2FjbF9jcmVhdGVfbWFzcShzdHJ1Y3QgcG9zaXhfYWNsICphY2wsIHVtb2RlX3QgKm1vZGVfcCkKIHsKIAlzdHJ1Y3QgcG9zaXhfYWNsX2VudHJ5ICpwYSwgKnBlOwogCXN0cnVjdCBwb3NpeF9hY2xfZW50cnkgKmdyb3VwX29iaiA9IE5VTEwsICptYXNrX29iaiA9IE5VTEw7Ci0JbW9kZV90IG1vZGUgPSAqbW9kZV9wOworCXVtb2RlX3QgbW9kZSA9ICptb2RlX3A7CiAJaW50IG5vdF9lcXVpdiA9IDA7CiAKIAkvKiBhc3NlcnQoYXRvbWljX3JlYWQoYWNsLT5hX3JlZmNvdW50KSA9PSAxKTsgKi8KQEAgLTMzNiw3ICszMzYsNyBAQAogLyoKICAqIE1vZGlmeSB0aGUgQUNMIGZvciB0aGUgY2htb2Qgc3lzY2FsbC4KICAqLwotc3RhdGljIGludCBwb3NpeF9hY2xfY2htb2RfbWFzcShzdHJ1Y3QgcG9zaXhfYWNsICphY2wsIG1vZGVfdCBtb2RlKQorc3RhdGljIGludCBwb3NpeF9hY2xfY2htb2RfbWFzcShzdHJ1Y3QgcG9zaXhfYWNsICphY2wsIHVtb2RlX3QgbW9kZSkKIHsKIAlzdHJ1Y3QgcG9zaXhfYWNsX2VudHJ5ICpncm91cF9vYmogPSBOVUxMLCAqbWFza19vYmogPSBOVUxMOwogCXN0cnVjdCBwb3NpeF9hY2xfZW50cnkgKnBhLCAqcGU7CkBAIC0zODIsNyArMzgyLDcgQEAKIH0KIAogaW50Ci1wb3NpeF9hY2xfY3JlYXRlKHN0cnVjdCBwb3NpeF9hY2wgKiphY2wsIGdmcF90IGdmcCwgbW9kZV90ICptb2RlX3ApCitwb3NpeF9hY2xfY3JlYXRlKHN0cnVjdCBwb3NpeF9hY2wgKiphY2wsIGdmcF90IGdmcCwgdW1vZGVfdCAqbW9kZV9wKQogewogCXN0cnVjdCBwb3NpeF9hY2wgKmNsb25lID0gcG9zaXhfYWNsX2Nsb25lKCphY2wsIGdmcCk7CiAJaW50IGVyciA9IC1FTk9NRU07CkBAIC00MDAsNyArNDAwLDcgQEAKIEVYUE9SVF9TWU1CT0wocG9zaXhfYWNsX2NyZWF0ZSk7CiAKIGludAotcG9zaXhfYWNsX2NobW9kKHN0cnVjdCBwb3NpeF9hY2wgKiphY2wsIGdmcF90IGdmcCwgbW9kZV90IG1vZGUpCitwb3NpeF9hY2xfY2htb2Qoc3RydWN0IHBvc2l4X2FjbCAqKmFjbCwgZ2ZwX3QgZ2ZwLCB1bW9kZV90IG1vZGUpCiB7CiAJc3RydWN0IHBvc2l4X2FjbCAqY2xvbmUgPSBwb3NpeF9hY2xfY2xvbmUoKmFjbCwgZ2ZwKTsKIAlpbnQgZXJyID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2ZzL3BzdG9yZS9pbm9kZS5jIGIvZnMvcHN0b3JlL2lub2RlLmMKaW5kZXggOTc3ZWQyNy4uODkzYjk2MSAxMDA2NDQKLS0tIGEvZnMvcHN0b3JlL2lub2RlLmMKKysrIGIvZnMvcHN0b3JlL2lub2RlLmMKQEAgLTM5LDggKzM5LDkgQEAKICNkZWZpbmUJUFNUT1JFX05BTUVMRU4JNjQKIAogc3RydWN0IHBzdG9yZV9wcml2YXRlIHsKKwlzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaTsKKwllbnVtIHBzdG9yZV90eXBlX2lkIHR5cGU7CiAJdTY0CWlkOwotCWludAkoKmVyYXNlKSh1NjQpOwogCXNzaXplX3QJc2l6ZTsKIAljaGFyCWRhdGFbXTsKIH07CkBAIC03Myw3ICs3NCw3IEBACiB7CiAJc3RydWN0IHBzdG9yZV9wcml2YXRlICpwID0gZGVudHJ5LT5kX2lub2RlLT5pX3ByaXZhdGU7CiAKLQlwLT5lcmFzZShwLT5pZCk7CisJcC0+cHNpLT5lcmFzZShwLT50eXBlLCBwLT5pZCwgcC0+cHNpKTsKIAogCXJldHVybiBzaW1wbGVfdW5saW5rKGRpciwgZGVudHJ5KTsKIH0KQEAgLTE3NSw4ICsxNzYsOCBAQAogICogU2V0IHRoZSBtdGltZSAmIGN0aW1lIHRvIHRoZSBkYXRlIHRoYXQgdGhpcyByZWNvcmQgd2FzIG9yaWdpbmFsbHkgc3RvcmVkLgogICovCiBpbnQgcHN0b3JlX21rZmlsZShlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIGNoYXIgKnBzbmFtZSwgdTY0IGlkLAotCQkJICAgICAgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUsCi0JCQkgICAgICBzdHJ1Y3QgdGltZXNwZWMgdGltZSwgaW50ICgqZXJhc2UpKHU2NCkpCisJCSAgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUsIHN0cnVjdCB0aW1lc3BlYyB0aW1lLAorCQkgIHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKQogewogCXN0cnVjdCBkZW50cnkJCSpyb290ID0gcHN0b3JlX3NiLT5zX3Jvb3Q7CiAJc3RydWN0IGRlbnRyeQkJKmRlbnRyeTsKQEAgLTE5Miw4ICsxOTMsOSBAQAogCXByaXZhdGUgPSBrbWFsbG9jKHNpemVvZiAqcHJpdmF0ZSArIHNpemUsIEdGUF9LRVJORUwpOwogCWlmICghcHJpdmF0ZSkKIAkJZ290byBmYWlsX2FsbG9jOworCXByaXZhdGUtPnR5cGUgPSB0eXBlOwogCXByaXZhdGUtPmlkID0gaWQ7Ci0JcHJpdmF0ZS0+ZXJhc2UgPSBlcmFzZTsKKwlwcml2YXRlLT5wc2kgPSBwc2k7CiAKIAlzd2l0Y2ggKHR5cGUpIHsKIAljYXNlIFBTVE9SRV9UWVBFX0RNRVNHOgpkaWZmIC0tZ2l0IGEvZnMvcHN0b3JlL2ludGVybmFsLmggYi9mcy9wc3RvcmUvaW50ZXJuYWwuaAppbmRleCA4YzlmMjNlLi42MTFjMWIzIDEwMDY0NAotLS0gYS9mcy9wc3RvcmUvaW50ZXJuYWwuaAorKysgYi9mcy9wc3RvcmUvaW50ZXJuYWwuaApAQCAtMiw1ICsyLDUgQEAKIGV4dGVybiB2b2lkCXBzdG9yZV9nZXRfcmVjb3Jkcyh2b2lkKTsKIGV4dGVybiBpbnQJcHN0b3JlX21rZmlsZShlbnVtIHBzdG9yZV90eXBlX2lkLCBjaGFyICpwc25hbWUsIHU2NCBpZCwKIAkJCSAgICAgIGNoYXIgKmRhdGEsIHNpemVfdCBzaXplLAotCQkJICAgICAgc3RydWN0IHRpbWVzcGVjIHRpbWUsIGludCAoKmVyYXNlKSh1NjQpKTsKKwkJCSAgICAgIHN0cnVjdCB0aW1lc3BlYyB0aW1lLCBzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7CiBleHRlcm4gaW50CXBzdG9yZV9pc19tb3VudGVkKHZvaWQpOwpkaWZmIC0tZ2l0IGEvZnMvcHN0b3JlL3BsYXRmb3JtLmMgYi9mcy9wc3RvcmUvcGxhdGZvcm0uYwppbmRleCBmMmMzZmYyLi5jNTMwMGVjIDEwMDY0NAotLS0gYS9mcy9wc3RvcmUvcGxhdGZvcm0uYworKysgYi9mcy9wc3RvcmUvcGxhdGZvcm0uYwpAQCAtMzcsNiArMzcsOCBAQAogc3RhdGljIERFRklORV9TUElOTE9DSyhwc3RvcmVfbG9jayk7CiBzdGF0aWMgc3RydWN0IHBzdG9yZV9pbmZvICpwc2luZm87CiAKK3N0YXRpYyBjaGFyICpiYWNrZW5kOworCiAvKiBIb3cgbXVjaCBvZiB0aGUgY29uc29sZSBsb2cgdG8gc25hcHNob3QgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGttc2dfYnl0ZXMgPSAxMDI0MDsKIApAQCAtNjcsNyArNjksOCBAQAogCXVuc2lnbmVkIGxvbmcJc2l6ZSwgdG90YWwgPSAwOwogCWNoYXIJCSpkc3QsICp3aHk7CiAJdTY0CQlpZDsKLQlpbnQJCWhzaXplLCBwYXJ0ID0gMTsKKwlpbnQJCWhzaXplOworCXVuc2lnbmVkIGludAlwYXJ0ID0gMTsKIAogCWlmIChyZWFzb24gPCBBUlJBWV9TSVpFKHJlYXNvbl9zdHIpKQogCQl3aHkgPSByZWFzb25fc3RyW3JlYXNvbl07CkBAIC03OCw3ICs4MSw3IEBACiAJb29wc2NvdW50Kys7CiAJd2hpbGUgKHRvdGFsIDwga21zZ19ieXRlcykgewogCQlkc3QgPSBwc2luZm8tPmJ1ZjsKLQkJaHNpemUgPSBzcHJpbnRmKGRzdCwgIiVzIyVkIFBhcnQlZFxuIiwgd2h5LCBvb3BzY291bnQsIHBhcnQrKyk7CisJCWhzaXplID0gc3ByaW50Zihkc3QsICIlcyMlZCBQYXJ0JWRcbiIsIHdoeSwgb29wc2NvdW50LCBwYXJ0KTsKIAkJc2l6ZSA9IHBzaW5mby0+YnVmc2l6ZSAtIGhzaXplOwogCQlkc3QgKz0gaHNpemU7CiAKQEAgLTk0LDE0ICs5NywxNiBAQAogCQltZW1jcHkoZHN0LCBzMSArIHMxX3N0YXJ0LCBsMV9jcHkpOwogCQltZW1jcHkoZHN0ICsgbDFfY3B5LCBzMiArIHMyX3N0YXJ0LCBsMl9jcHkpOwogCi0JCWlkID0gcHNpbmZvLT53cml0ZShQU1RPUkVfVFlQRV9ETUVTRywgaHNpemUgKyBsMV9jcHkgKyBsMl9jcHkpOworCQlpZCA9IHBzaW5mby0+d3JpdGUoUFNUT1JFX1RZUEVfRE1FU0csIHBhcnQsCisJCQkJICAgaHNpemUgKyBsMV9jcHkgKyBsMl9jcHksIHBzaW5mbyk7CiAJCWlmIChyZWFzb24gPT0gS01TR19EVU1QX09PUFMgJiYgcHN0b3JlX2lzX21vdW50ZWQoKSkKIAkJCXBzdG9yZV9ta2ZpbGUoUFNUT1JFX1RZUEVfRE1FU0csIHBzaW5mby0+bmFtZSwgaWQsCiAJCQkJICAgICAgcHNpbmZvLT5idWYsIGhzaXplICsgbDFfY3B5ICsgbDJfY3B5LAotCQkJCSAgICAgIENVUlJFTlRfVElNRSwgcHNpbmZvLT5lcmFzZSk7CisJCQkJICAgICAgQ1VSUkVOVF9USU1FLCBwc2luZm8pOwogCQlsMSAtPSBsMV9jcHk7CiAJCWwyIC09IGwyX2NweTsKIAkJdG90YWwgKz0gbDFfY3B5ICsgbDJfY3B5OworCQlwYXJ0Kys7CiAJfQogCW11dGV4X3VubG9jaygmcHNpbmZvLT5idWZfbXV0ZXgpOwogfQpAQCAtMTI4LDYgKzEzMywxMiBAQAogCQlzcGluX3VubG9jaygmcHN0b3JlX2xvY2spOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KKworCWlmIChiYWNrZW5kICYmIHN0cmNtcChiYWNrZW5kLCBwc2ktPm5hbWUpKSB7CisJCXNwaW5fdW5sb2NrKCZwc3RvcmVfbG9jayk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCXBzaW5mbyA9IHBzaTsKIAlzcGluX3VubG9jaygmcHN0b3JlX2xvY2spOwogCkBAIC0xNjYsOSArMTc3LDkgQEAKIAlpZiAocmMpCiAJCWdvdG8gb3V0OwogCi0Jd2hpbGUgKChzaXplID0gcHNpLT5yZWFkKCZpZCwgJnR5cGUsICZ0aW1lKSkgPiAwKSB7CisJd2hpbGUgKChzaXplID0gcHNpLT5yZWFkKCZpZCwgJnR5cGUsICZ0aW1lLCBwc2kpKSA+IDApIHsKIAkJaWYgKHBzdG9yZV9ta2ZpbGUodHlwZSwgcHNpLT5uYW1lLCBpZCwgcHNpLT5idWYsIChzaXplX3Qpc2l6ZSwKLQkJCQkgIHRpbWUsIHBzaS0+ZXJhc2UpKQorCQkJCSAgdGltZSwgcHNpKSkKIAkJCWZhaWxlZCsrOwogCX0KIAlwc2ktPmNsb3NlKHBzaSk7CkBAIC0xOTYsMTIgKzIwNywxNSBAQAogCiAJbXV0ZXhfbG9jaygmcHNpbmZvLT5idWZfbXV0ZXgpOwogCW1lbWNweShwc2luZm8tPmJ1ZiwgYnVmLCBzaXplKTsKLQlpZCA9IHBzaW5mby0+d3JpdGUodHlwZSwgc2l6ZSk7CisJaWQgPSBwc2luZm8tPndyaXRlKHR5cGUsIDAsIHNpemUsIHBzaW5mbyk7CiAJaWYgKHBzdG9yZV9pc19tb3VudGVkKCkpCiAJCXBzdG9yZV9ta2ZpbGUoUFNUT1JFX1RZUEVfRE1FU0csIHBzaW5mby0+bmFtZSwgaWQsIHBzaW5mby0+YnVmLAotCQkJICAgICAgc2l6ZSwgQ1VSUkVOVF9USU1FLCBwc2luZm8tPmVyYXNlKTsKKwkJCSAgICAgIHNpemUsIENVUlJFTlRfVElNRSwgcHNpbmZvKTsKIAltdXRleF91bmxvY2soJnBzaW5mby0+YnVmX211dGV4KTsKIAogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocHN0b3JlX3dyaXRlKTsKKworbW9kdWxlX3BhcmFtKGJhY2tlbmQsIGNoYXJwLCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoYmFja2VuZCwgIlBzdG9yZSBiYWNrZW5kIHRvIHVzZSIpOwpkaWZmIC0tZ2l0IGEvZnMvcmVpc2VyZnMveGF0dHJfYWNsLmMgYi9mcy9yZWlzZXJmcy94YXR0cl9hY2wuYwppbmRleCA3MzYyY2Y0Li42ZGEwMzk2ZSAxMDA2NDQKLS0tIGEvZnMvcmVpc2VyZnMveGF0dHJfYWNsLmMKKysrIGIvZnMvcmVpc2VyZnMveGF0dHJfYWNsLmMKQEAgLTI3MiwxMiArMjcyLDEwIEBACiAJY2FzZSBBQ0xfVFlQRV9BQ0NFU1M6CiAJCW5hbWUgPSBQT1NJWF9BQ0xfWEFUVFJfQUNDRVNTOwogCQlpZiAoYWNsKSB7Ci0JCQltb2RlX3QgbW9kZSA9IGlub2RlLT5pX21vZGU7Ci0JCQllcnJvciA9IHBvc2l4X2FjbF9lcXVpdl9tb2RlKGFjbCwgJm1vZGUpOworCQkJZXJyb3IgPSBwb3NpeF9hY2xfZXF1aXZfbW9kZShhY2wsICZpbm9kZS0+aV9tb2RlKTsKIAkJCWlmIChlcnJvciA8IDApCiAJCQkJcmV0dXJuIGVycm9yOwogCQkJZWxzZSB7Ci0JCQkJaW5vZGUtPmlfbW9kZSA9IG1vZGU7CiAJCQkJaWYgKGVycm9yID09IDApCiAJCQkJCWFjbCA9IE5VTEw7CiAJCQl9CkBAIC0zNTQsOCArMzUyLDYgQEAKIAkJcmV0dXJuIFBUUl9FUlIoYWNsKTsKIAogCWlmIChhY2wpIHsKLQkJbW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOwotCiAJCS8qIENvcHkgdGhlIGRlZmF1bHQgQUNMIHRvIHRoZSBkZWZhdWx0IEFDTCBvZiBhIG5ldyBkaXJlY3RvcnkgKi8KIAkJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKIAkJCWVyciA9IHJlaXNlcmZzX3NldF9hY2wodGgsIGlub2RlLCBBQ0xfVFlQRV9ERUZBVUxULApAQCAtMzY2LDEyICszNjIsMTAgQEAKIAogCQkvKiBOb3cgd2UgcmVjb25jaWxlIHRoZSBuZXcgQUNMIGFuZCB0aGUgbW9kZSwKIAkJICAgcG90ZW50aWFsbHkgbW9kaWZ5aW5nIGJvdGggKi8KLQkJZXJyID0gcG9zaXhfYWNsX2NyZWF0ZSgmYWNsLCBHRlBfTk9GUywgJm1vZGUpOworCQllcnIgPSBwb3NpeF9hY2xfY3JlYXRlKCZhY2wsIEdGUF9OT0ZTLCAmaW5vZGUtPmlfbW9kZSk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAotCQlpbm9kZS0+aV9tb2RlID0gbW9kZTsKLQogCQkvKiBJZiB3ZSBuZWVkIGFuIEFDTC4uICovCiAJCWlmIChlcnIgPiAwKQogCQkJZXJyID0gcmVpc2VyZnNfc2V0X2FjbCh0aCwgaW5vZGUsIEFDTF9UWVBFX0FDQ0VTUywgYWNsKTsKZGlmZiAtLWdpdCBhL2ZzL3N0YWNrLmMgYi9mcy9zdGFjay5jCmluZGV4IDRhNmY3ZjQuLmI0ZjJhYjQ4IDEwMDY0NAotLS0gYS9mcy9zdGFjay5jCisrKyBiL2ZzL3N0YWNrLmMKQEAgLTI5LDEwICsyOSw3IEBACiAJICoKIAkgKiBXZSBkb24ndCBhY3R1YWxseSBrbm93IHdoYXQgbG9ja2luZyBpcyB1c2VkIGF0IHRoZSBsb3dlciBsZXZlbDsKIAkgKiBidXQgaWYgaXQncyBhIGZpbGVzeXN0ZW0gdGhhdCBzdXBwb3J0cyBxdW90YXMsIGl0IHdpbGwgYmUgdXNpbmcKLQkgKiBpX2xvY2sgYXMgaW4gaW5vZGVfYWRkX2J5dGVzKCkuICB0bXBmcyB1c2VzIG90aGVyIGxvY2tpbmcsIGFuZAotCSAqIGl0cyAzMi1iaXQgaXMgKGp1c3QpIGFibGUgdG8gZXhjZWVkIDJUQiBpX3NpemUgd2l0aCB0aGUgYWlkIG9mCi0JICogaG9sZXM7IGJ1dCBpdHMgaV9ibG9ja3MgY2Fubm90IGNhcnJ5IGludG8gdGhlIHVwcGVyIGxvbmcgd2l0aG91dAotCSAqIGFsbW9zdCAyVEIgc3dhcCAtIGxldCdzIGlnbm9yZSB0aGF0IGNhc2UuCisJICogaV9sb2NrIGFzIGluIGlub2RlX2FkZF9ieXRlcygpLgogCSAqLwogCWlmIChzaXplb2YoaV9ibG9ja3MpID4gc2l6ZW9mKGxvbmcpKQogCQlzcGluX2xvY2soJnNyYy0+aV9sb2NrKTsKZGlmZiAtLWdpdCBhL2ZzL3hmcy9saW51eC0yLjYveGZzX2FjbC5jIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYWNsLmMKaW5kZXggNDRjZTUxNi4uYjZjNGIzNyAxMDA2NDQKLS0tIGEvZnMveGZzL2xpbnV4LTIuNi94ZnNfYWNsLmMKKysrIGIvZnMveGZzL2xpbnV4LTIuNi94ZnNfYWNsLmMKQEAgLTIyMSw3ICsyMjEsNyBAQAogfQogCiBzdGF0aWMgaW50Ci14ZnNfc2V0X21vZGUoc3RydWN0IGlub2RlICppbm9kZSwgbW9kZV90IG1vZGUpCit4ZnNfc2V0X21vZGUoc3RydWN0IGlub2RlICppbm9kZSwgdW1vZGVfdCBtb2RlKQogewogCWludCBlcnJvciA9IDA7CiAKQEAgLTI2Nyw3ICsyNjcsNyBAQAogaW50CiB4ZnNfaW5oZXJpdF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHBvc2l4X2FjbCAqYWNsKQogewotCW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKKwl1bW9kZV90IG1vZGUgPSBpbm9kZS0+aV9tb2RlOwogCWludCBlcnJvciA9IDAsIGluaGVyaXQgPSAwOwogCiAJaWYgKFNfSVNESVIoaW5vZGUtPmlfbW9kZSkpIHsKQEAgLTM4MSw3ICszODEsNyBAQAogCQlnb3RvIG91dF9yZWxlYXNlOwogCiAJaWYgKHR5cGUgPT0gQUNMX1RZUEVfQUNDRVNTKSB7Ci0JCW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKKwkJdW1vZGVfdCBtb2RlID0gaW5vZGUtPmlfbW9kZTsKIAkJZXJyb3IgPSBwb3NpeF9hY2xfZXF1aXZfbW9kZShhY2wsICZtb2RlKTsKIAogCQlpZiAoZXJyb3IgPD0gMCkgewpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19hY2wuaCBiL2ZzL3hmcy94ZnNfYWNsLmgKaW5kZXggMmM2NTZlZi4uMzk2MzJkOSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19hY2wuaAorKysgYi9mcy94ZnMveGZzX2FjbC5oCkBAIC01MSw3ICs1MSwxMCBAQAogZXh0ZXJuIGNvbnN0IHN0cnVjdCB4YXR0cl9oYW5kbGVyIHhmc194YXR0cl9hY2xfYWNjZXNzX2hhbmRsZXI7CiBleHRlcm4gY29uc3Qgc3RydWN0IHhhdHRyX2hhbmRsZXIgeGZzX3hhdHRyX2FjbF9kZWZhdWx0X2hhbmRsZXI7CiAjZWxzZQotIyBkZWZpbmUgeGZzX2dldF9hY2woaW5vZGUsIHR5cGUpCQkJTlVMTAorc3RhdGljIGlubGluZSBzdHJ1Y3QgcG9zaXhfYWNsICp4ZnNfZ2V0X2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKK3sKKwlyZXR1cm4gTlVMTDsKK30KICMgZGVmaW5lIHhmc19pbmhlcml0X2FjbChpbm9kZSwgZGVmYXVsdF9hY2wpCQkwCiAjIGRlZmluZSB4ZnNfYWNsX2NobW9kKGlub2RlKQkJCQkwCiAjIGRlZmluZSBwb3NpeF9hY2xfYWNjZXNzX2V4aXN0cyhpbm9kZSkJCQkwCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaV9kcml2ZXJzLmggYi9pbmNsdWRlL2FjcGkvYWNwaV9kcml2ZXJzLmgKaW5kZXggMzA5MDQ3MS4uZTQ5YzM2ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjcGlfZHJpdmVycy5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3BpX2RyaXZlcnMuaApAQCAtMTI4LDcgKzEyOCw3IEBACiBleHRlcm4gaW50IHJlZ2lzdGVyX2RvY2tfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CiBleHRlcm4gdm9pZCB1bnJlZ2lzdGVyX2RvY2tfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYik7CiBleHRlcm4gaW50IHJlZ2lzdGVyX2hvdHBsdWdfZG9ja19kZXZpY2UoYWNwaV9oYW5kbGUgaGFuZGxlLAotCQkJCQlzdHJ1Y3QgYWNwaV9kb2NrX29wcyAqb3BzLAorCQkJCQljb25zdCBzdHJ1Y3QgYWNwaV9kb2NrX29wcyAqb3BzLAogCQkJCQl2b2lkICpjb250ZXh0KTsKIGV4dGVybiB2b2lkIHVucmVnaXN0ZXJfaG90cGx1Z19kb2NrX2RldmljZShhY3BpX2hhbmRsZSBoYW5kbGUpOwogI2Vsc2UKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY3BpeGYuaCBiL2luY2x1ZGUvYWNwaS9hY3BpeGYuaAppbmRleCAyZWQwYTg0Li5mNTU0YTkzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FjcGkvYWNwaXhmLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjcGl4Zi5oCkBAIC00Nyw3ICs0Nyw3IEBACiAKIC8qIEN1cnJlbnQgQUNQSUNBIHN1YnN5c3RlbSB2ZXJzaW9uIGluIFlZWVlNTUREIGZvcm1hdCAqLwogCi0jZGVmaW5lIEFDUElfQ0FfVkVSU0lPTiAgICAgICAgICAgICAgICAgMHgyMDExMDQxMworI2RlZmluZSBBQ1BJX0NBX1ZFUlNJT04gICAgICAgICAgICAgICAgIDB4MjAxMTA2MjMKIAogI2luY2x1ZGUgImFjdHlwZXMuaCIKICNpbmNsdWRlICJhY3RibC5oIgpAQCAtNjksNiArNjksNyBAQAogZXh0ZXJuIHUzMiBhY3BpX2dibF9lbmFibGVfYW1sX2RlYnVnX29iamVjdDsKIGV4dGVybiB1OCBhY3BpX2dibF9jb3B5X2RzZHRfbG9jYWxseTsKIGV4dGVybiB1OCBhY3BpX2dibF90cnVuY2F0ZV9pb19hZGRyZXNzZXM7CitleHRlcm4gdTggYWNwaV9nYmxfZGlzYWJsZV9hdXRvX3JlcGFpcjsKIAogZXh0ZXJuIHUzMiBhY3BpX2N1cnJlbnRfZ3BlX2NvdW50OwogZXh0ZXJuIHN0cnVjdCBhY3BpX3RhYmxlX2ZhZHQgYWNwaV9nYmxfRkFEVDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hcGVpLmggYi9pbmNsdWRlL2FjcGkvYXBlaS5oCmluZGV4IGU2N2I1MjMuLjUxYTUyN2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hcGVpLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FwZWkuaApAQCAtMTgsNiArMTgsMTEgQEAKIAogZXh0ZXJuIGludCBoZXN0X2Rpc2FibGU7CiBleHRlcm4gaW50IGVyc3RfZGlzYWJsZTsKKyNpZmRlZiBDT05GSUdfQUNQSV9BUEVJX0dIRVMKK2V4dGVybiBpbnQgZ2hlc19kaXNhYmxlOworI2Vsc2UKKyNkZWZpbmUgZ2hlc19kaXNhYmxlIDEKKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0FDUElfQVBFSQogdm9pZCBfX2luaXQgYWNwaV9oZXN0X2luaXQodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmgKaW5kZXggYmE0OTI4Yy4uNjcwNTVmMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oCisrKyBiL2luY2x1ZGUvYWNwaS9wcm9jZXNzb3IuaApAQCAtMzM3LDcgKzMzNyw3IEBACiAKIC8qIGluIHByb2Nlc3Nvcl90aGVybWFsLmMgKi8KIGludCBhY3BpX3Byb2Nlc3Nvcl9nZXRfbGltaXRfaW5mbyhzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKTsKLWV4dGVybiBzdHJ1Y3QgdGhlcm1hbF9jb29saW5nX2RldmljZV9vcHMgcHJvY2Vzc29yX2Nvb2xpbmdfb3BzOworZXh0ZXJuIGNvbnN0IHN0cnVjdCB0aGVybWFsX2Nvb2xpbmdfZGV2aWNlX29wcyBwcm9jZXNzb3JfY29vbGluZ19vcHM7CiAjaWZkZWYgQ09ORklHX0NQVV9GUkVRCiB2b2lkIGFjcGlfdGhlcm1hbF9jcHVmcmVxX2luaXQodm9pZCk7CiB2b2lkIGFjcGlfdGhlcm1hbF9jcHVmcmVxX2V4aXQodm9pZCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FjcGkuaCBiL2luY2x1ZGUvbGludXgvYWNwaS5oCmluZGV4IDFkZWIyYTcuLjYwMDFiNGRhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2FjcGkuaAorKysgYi9pbmNsdWRlL2xpbnV4L2FjcGkuaApAQCAtMjM4LDcgKzIzOCw2IEBACiBleHRlcm4gaW50IHBucGFjcGlfZGlzYWJsZWQ7CiAKICNkZWZpbmUgUFhNX0lOVkFMCSgtMSkKLSNkZWZpbmUgTklEX0lOVkFMCSgtMSkKIAogaW50IGFjcGlfY2hlY2tfcmVzb3VyY2VfY29uZmxpY3QoY29uc3Qgc3RydWN0IHJlc291cmNlICpyZXMpOwogCkBAIC0yODAsNiArMjc5LDggQEAKICNkZWZpbmUgT1NDX1NCX0NQVUhQX09TVF9TVVBQT1JUCTgKICNkZWZpbmUgT1NDX1NCX0FQRUlfU1VQUE9SVAkJMTYKIAorZXh0ZXJuIGJvb2wgb3NjX3NiX2FwZWlfc3VwcG9ydF9hY2tlZDsKKwogLyogUENJIGRlZmluZWQgX09TQyBiaXRzICovCiAvKiBfT1NDIERXMSBEZWZpbml0aW9uIChPUyBTdXBwb3J0IEZpZWxkcykgKi8KICNkZWZpbmUgT1NDX0VYVF9QQ0lfQ09ORklHX1NVUFBPUlQJCTEKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYWVyLmggYi9pbmNsdWRlL2xpbnV4L2Flci5oCmluZGV4IDg0MTRkZTIuLjU0NGFiZGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYWVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9hZXIuaApAQCAtNTEsNSArNTEsOCBAQAogCiBleHRlcm4gdm9pZCBjcGVyX3ByaW50X2Flcihjb25zdCBjaGFyICpwcmVmaXgsIGludCBjcGVyX3NldmVyaXR5LAogCQkJICAgc3RydWN0IGFlcl9jYXBhYmlsaXR5X3JlZ3MgKmFlcik7CitleHRlcm4gaW50IGNwZXJfc2V2ZXJpdHlfdG9fYWVyKGludCBjcGVyX3NldmVyaXR5KTsKK2V4dGVybiB2b2lkIGFlcl9yZWNvdmVyX3F1ZXVlKGludCBkb21haW4sIHVuc2lnbmVkIGludCBidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKKwkJCSAgICAgIGludCBzZXZlcml0eSk7CiAjZW5kaWYgLy9fQUVSX0hfCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYW1iYS9wbDA4eC5oIGIvaW5jbHVkZS9saW51eC9hbWJhL3BsMDh4LmgKaW5kZXggMzExMTM4NS4uZTZlMjhmMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hbWJhL3BsMDh4LmgKKysrIGIvaW5jbHVkZS9saW51eC9hbWJhL3BsMDh4LmgKQEAgLTE3Miw4ICsxNzIsMTEgQEAKIAlpbnQgcGh5Y2hhbl9ob2xkOwogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB0YXNrbGV0OwogCWNoYXIgKm5hbWU7Ci0Jc3RydWN0IHBsMDh4X2NoYW5uZWxfZGF0YSAqY2Q7Ci0JZG1hX2FkZHJfdCBydW50aW1lX2FkZHI7CisJY29uc3Qgc3RydWN0IHBsMDh4X2NoYW5uZWxfZGF0YSAqY2Q7CisJZG1hX2FkZHJfdCBzcmNfYWRkcjsKKwlkbWFfYWRkcl90IGRzdF9hZGRyOworCXUzMiBzcmNfY2N0bDsKKwl1MzIgZHN0X2NjdGw7CiAJZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24JcnVudGltZV9kaXJlY3Rpb247CiAJZG1hX2Nvb2tpZV90IGxjOwogCXN0cnVjdCBsaXN0X2hlYWQgcGVuZF9saXN0OwpAQCAtMjAyLDcgKzIwNSw3IEBACiAgKiBAbWVtX2J1c2VzOiBidXNlcyB3aGljaCBtZW1vcnkgY2FuIGJlIGFjY2Vzc2VkIGZyb206IFBMMDhYX0FIQjEgfCBQTDA4WF9BSEIyCiAgKi8KIHN0cnVjdCBwbDA4eF9wbGF0Zm9ybV9kYXRhIHsKLQlzdHJ1Y3QgcGwwOHhfY2hhbm5lbF9kYXRhICpzbGF2ZV9jaGFubmVsczsKKwljb25zdCBzdHJ1Y3QgcGwwOHhfY2hhbm5lbF9kYXRhICpzbGF2ZV9jaGFubmVsczsKIAl1bnNpZ25lZCBpbnQgbnVtX3NsYXZlX2NoYW5uZWxzOwogCXN0cnVjdCBwbDA4eF9jaGFubmVsX2RhdGEgbWVtY3B5X2NoYW5uZWw7CiAJaW50ICgqZ2V0X3NpZ25hbCkoc3RydWN0IHBsMDh4X2RtYV9jaGFuICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9iaXRtYXAuaCBiL2luY2x1ZGUvbGludXgvYml0bWFwLmgKaW5kZXggM2JhYzQ0Yy4uN2FkNjM0NSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iaXRtYXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L2JpdG1hcC5oCkBAIC0xNDYsNiArMTQ2LDcgQEAKIGV4dGVybiB2b2lkIGJpdG1hcF9jb3B5X2xlKHZvaWQgKmRzdCwgY29uc3QgdW5zaWduZWQgbG9uZyAqc3JjLCBpbnQgbmJpdHMpOwogZXh0ZXJuIGludCBiaXRtYXBfb3JkX3RvX3Bvcyhjb25zdCB1bnNpZ25lZCBsb25nICpiaXRtYXAsIGludCBuLCBpbnQgYml0cyk7CiAKKyNkZWZpbmUgQklUTUFQX0ZJUlNUX1dPUkRfTUFTSyhzdGFydCkgKH4wVUwgPDwgKChzdGFydCkgJSBCSVRTX1BFUl9MT05HKSkKICNkZWZpbmUgQklUTUFQX0xBU1RfV09SRF9NQVNLKG5iaXRzKQkJCQkJXAogKAkJCQkJCQkJCVwKIAkoKG5iaXRzKSAlIEJJVFNfUEVSX0xPTkcpID8JCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1aWRsZS5oIGIvaW5jbHVkZS9saW51eC9jcHVpZGxlLmgKaW5kZXggMzY3MTllYS4uYjUxNjI5ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcHVpZGxlLmgKKysrIGIvaW5jbHVkZS9saW51eC9jcHVpZGxlLmgKQEAgLTEyMiw2ICsxMjIsOCBAQAogfTsKIAogI2lmZGVmIENPTkZJR19DUFVfSURMRQorZXh0ZXJuIHZvaWQgZGlzYWJsZV9jcHVpZGxlKHZvaWQpOworZXh0ZXJuIGludCBjcHVpZGxlX2lkbGVfY2FsbCh2b2lkKTsKIAogZXh0ZXJuIGludCBjcHVpZGxlX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydik7CiBzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmNwdWlkbGVfZ2V0X2RyaXZlcih2b2lkKTsKQEAgLTEzNSw2ICsxMzcsOCBAQAogZXh0ZXJuIHZvaWQgY3B1aWRsZV9kaXNhYmxlX2RldmljZShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldik7CiAKICNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV9jcHVpZGxlKHZvaWQpIHsgfQorc3RhdGljIGlubGluZSBpbnQgY3B1aWRsZV9pZGxlX2NhbGwodm9pZCkgeyByZXR1cm4gLUVOT0RFVjsgfQogCiBzdGF0aWMgaW5saW5lIGludCBjcHVpZGxlX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydikKIHtyZXR1cm4gLUVOT0RFVjsgfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kZXZpY2UtbWFwcGVyLmggYi9pbmNsdWRlL2xpbnV4L2RldmljZS1tYXBwZXIuaAppbmRleCA0NDI3ZTA0Li4zZmExZjNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RldmljZS1tYXBwZXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RldmljZS1tYXBwZXIuaApAQCAtMjA4LDYgKzIwOCw0OSBAQAogaW50IGRtX3JlZ2lzdGVyX3RhcmdldChzdHJ1Y3QgdGFyZ2V0X3R5cGUgKnQpOwogdm9pZCBkbV91bnJlZ2lzdGVyX3RhcmdldChzdHJ1Y3QgdGFyZ2V0X3R5cGUgKnQpOwogCisvKgorICogVGFyZ2V0IGFyZ3VtZW50IHBhcnNpbmcuCisgKi8KK3N0cnVjdCBkbV9hcmdfc2V0IHsKKwl1bnNpZ25lZCBhcmdjOworCWNoYXIgKiphcmd2OworfTsKKworLyoKKyAqIFRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIHZhbHVlIG9mIGEgbnVtZXJpYyBhcmd1bWVudCwgdG9nZXRoZXIgd2l0aAorICogdGhlIGVycm9yIG1lc3NhZ2UgdG8gdXNlIGlmIHRoZSBudW1iZXIgaXMgZm91bmQgdG8gYmUgb3V0c2lkZSB0aGF0IHJhbmdlLgorICovCitzdHJ1Y3QgZG1fYXJnIHsKKwl1bnNpZ25lZCBtaW47CisJdW5zaWduZWQgbWF4OworCWNoYXIgKmVycm9yOworfTsKKworLyoKKyAqIFZhbGlkYXRlIHRoZSBuZXh0IGFyZ3VtZW50LCBlaXRoZXIgcmV0dXJuaW5nIGl0IGFzICp2YWx1ZSBvciwgaWYgaW52YWxpZCwKKyAqIHJldHVybmluZyAtRUlOVkFMIGFuZCBzZXR0aW5nICplcnJvci4KKyAqLworaW50IGRtX3JlYWRfYXJnKHN0cnVjdCBkbV9hcmcgKmFyZywgc3RydWN0IGRtX2FyZ19zZXQgKmFyZ19zZXQsCisJCXVuc2lnbmVkICp2YWx1ZSwgY2hhciAqKmVycm9yKTsKKworLyoKKyAqIFByb2Nlc3MgdGhlIG5leHQgYXJndW1lbnQgYXMgdGhlIHN0YXJ0IG9mIGEgZ3JvdXAgY29udGFpbmluZyBiZXR3ZWVuCisgKiBhcmctPm1pbiBhbmQgYXJnLT5tYXggZnVydGhlciBhcmd1bWVudHMuIEVpdGhlciByZXR1cm4gdGhlIHNpemUgYXMKKyAqICpudW1fYXJncyBvciwgaWYgaW52YWxpZCwgcmV0dXJuIC1FSU5WQUwgYW5kIHNldCAqZXJyb3IuCisgKi8KK2ludCBkbV9yZWFkX2FyZ19ncm91cChzdHJ1Y3QgZG1fYXJnICphcmcsIHN0cnVjdCBkbV9hcmdfc2V0ICphcmdfc2V0LAorCQkgICAgICB1bnNpZ25lZCAqbnVtX2FyZ3MsIGNoYXIgKiplcnJvcik7CisKKy8qCisgKiBSZXR1cm4gdGhlIGN1cnJlbnQgYXJndW1lbnQgYW5kIHNoaWZ0IHRvIHRoZSBuZXh0LgorICovCitjb25zdCBjaGFyICpkbV9zaGlmdF9hcmcoc3RydWN0IGRtX2FyZ19zZXQgKmFzKTsKKworLyoKKyAqIE1vdmUgdGhyb3VnaCBudW1fYXJncyBhcmd1bWVudHMuCisgKi8KK3ZvaWQgZG1fY29uc3VtZV9hcmdzKHN0cnVjdCBkbV9hcmdfc2V0ICphcywgdW5zaWduZWQgbnVtX2FyZ3MpOworCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiBGdW5jdGlvbnMgZm9yIGNyZWF0aW5nIGFuZCBtYW5pcHVsYXRpbmcgbWFwcGVkIGRldmljZXMuCiAgKiBEcm9wIHRoZSByZWZlcmVuY2Ugd2l0aCBkbV9wdXQgd2hlbiB5b3UgZmluaXNoIHdpdGggdGhlIG9iamVjdC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZG0taW9jdGwuaCBiL2luY2x1ZGUvbGludXgvZG0taW9jdGwuaAppbmRleCAzNzA4NDU1Li4wY2I4ZWZmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RtLWlvY3RsLmgKKysrIGIvaW5jbHVkZS9saW51eC9kbS1pb2N0bC5oCkBAIC0yNjcsOSArMjY3LDkgQEAKICNkZWZpbmUgRE1fREVWX1NFVF9HRU9NRVRSWQlfSU9XUihETV9JT0NUTCwgRE1fREVWX1NFVF9HRU9NRVRSWV9DTUQsIHN0cnVjdCBkbV9pb2N0bCkKIAogI2RlZmluZSBETV9WRVJTSU9OX01BSk9SCTQKLSNkZWZpbmUgRE1fVkVSU0lPTl9NSU5PUgkyMAorI2RlZmluZSBETV9WRVJTSU9OX01JTk9SCTIxCiAjZGVmaW5lIERNX1ZFUlNJT05fUEFUQ0hMRVZFTAkwCi0jZGVmaW5lIERNX1ZFUlNJT05fRVhUUkEJIi1pb2N0bCAoMjAxMS0wMi0wMikiCisjZGVmaW5lIERNX1ZFUlNJT05fRVhUUkEJIi1pb2N0bCAoMjAxMS0wNy0wNikiCiAKIC8qIFN0YXR1cyBiaXRzICovCiAjZGVmaW5lIERNX1JFQURPTkxZX0ZMQUcJKDEgPDwgMCkgLyogSW4vT3V0ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RtLWtjb3B5ZC5oIGIvaW5jbHVkZS9saW51eC9kbS1rY29weWQuaAppbmRleCAyOThkNTg3Li41ZTU0NDU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RtLWtjb3B5ZC5oCisrKyBiL2luY2x1ZGUvbGludXgvZG0ta2NvcHlkLmgKQEAgLTQyLDUgKzQyLDIwIEBACiAJCSAgIHVuc2lnbmVkIG51bV9kZXN0cywgc3RydWN0IGRtX2lvX3JlZ2lvbiAqZGVzdHMsCiAJCSAgIHVuc2lnbmVkIGZsYWdzLCBkbV9rY29weWRfbm90aWZ5X2ZuIGZuLCB2b2lkICpjb250ZXh0KTsKIAorLyoKKyAqIFByZXBhcmUgYSBjYWxsYmFjayBhbmQgc3VibWl0IGl0IHZpYSB0aGUga2NvcHlkIHRocmVhZC4KKyAqCisgKiBkbV9rY29weWRfcHJlcGFyZV9jYWxsYmFjayBhbGxvY2F0ZXMgYSBjYWxsYmFjayBzdHJ1Y3R1cmUgYW5kIHJldHVybnMgaXQuCisgKiBJdCBtdXN0IG5vdCBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dC4KKyAqIFRoZSByZXR1cm5lZCB2YWx1ZSBzaG91bGQgYmUgcGFzc2VkIGludG8gZG1fa2NvcHlkX2RvX2NhbGxiYWNrLgorICoKKyAqIGRtX2tjb3B5ZF9kb19jYWxsYmFjayBzdWJtaXRzIHRoZSBjYWxsYmFjay4KKyAqIEl0IG1heSBiZSBjYWxsZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dC4KKyAqIFRoZSBjYWxsYmFjayBpcyBpc3N1ZWQgZnJvbSB0aGUga2NvcHlkIHRocmVhZC4KKyAqLwordm9pZCAqZG1fa2NvcHlkX3ByZXBhcmVfY2FsbGJhY2soc3RydWN0IGRtX2tjb3B5ZF9jbGllbnQgKmtjLAorCQkJCSBkbV9rY29weWRfbm90aWZ5X2ZuIGZuLCB2b2lkICpjb250ZXh0KTsKK3ZvaWQgZG1fa2NvcHlkX2RvX2NhbGxiYWNrKHZvaWQgKmpvYiwgaW50IHJlYWRfZXJyLCB1bnNpZ25lZCBsb25nIHdyaXRlX2Vycik7CisKICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYJLyogX0xJTlVYX0RNX0tDT1BZRF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2R2Yi9hdWRpby5oIGIvaW5jbHVkZS9saW51eC9kdmIvYXVkaW8uaAppbmRleCBmZWM2NmJkLi5kNDdiY2NkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2R2Yi9hdWRpby5oCisrKyBiL2luY2x1ZGUvbGludXgvZHZiL2F1ZGlvLmgKQEAgLTY3LDcgKzY3LDcgQEAKIAogCiB0eXBlZGVmCi1zdHJ1Y3QgYXVkaW9fa2FyYW9rZXsgIC8qIGlmIFZvY2FsMSBvciBWb2NhbDIgYXJlIG5vbi16ZXJvLCB0aGV5IGdldCBtaXhlZCAgKi8KK3N0cnVjdCBhdWRpb19rYXJhb2tlIHsgIC8qIGlmIFZvY2FsMSBvciBWb2NhbDIgYXJlIG5vbi16ZXJvLCB0aGV5IGdldCBtaXhlZCAgKi8KIAlpbnQgdm9jYWwxOyAgICAvKiBpbnRvIGxlZnQgYW5kIHJpZ2h0IHQgYXQgNzAlIGVhY2ggKi8KIAlpbnQgdm9jYWwyOyAgICAvKiBpZiBib3RoLCBWb2NhbDEgYW5kIFZvY2FsMiBhcmUgbm9uLXplcm8sIFZvY2FsMSBnZXRzKi8KIAlpbnQgbWVsb2R5OyAgICAvKiBtaXhlZCBpbnRvIHRoZSBsZWZ0IGNoYW5uZWwgYW5kICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2VmaS5oIGIvaW5jbHVkZS9saW51eC9lZmkuaAppbmRleCBlYzI1NzI2Li4yMzYyYTBiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2VmaS5oCisrKyBiL2luY2x1ZGUvbGludXgvZWZpLmgKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ydGMuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9wZm4uaD4KKyNpbmNsdWRlIDxsaW51eC9wc3RvcmUuaD4KIAogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtMjMyLDYgKzIzMyw5IEBACiAjZGVmaW5lIFVWX1NZU1RFTV9UQUJMRV9HVUlEIFwKICAgICBFRklfR1VJRCggIDB4M2IxM2E3ZDQsIDB4NjMzZSwgMHgxMWRkLCAweDkzLCAweGVjLCAweGRhLCAweDI1LCAweDU2LCAweGQ4LCAweDk1LCAweDkzICkKIAorI2RlZmluZSBMSU5VWF9FRklfQ1JBU0hfR1VJRCBcCisgICAgRUZJX0dVSUQoICAweGNmYzhmYzc5LCAweGJlMmUsIDB4NGRkYywgMHg5NywgMHhmMCwgMHg5ZiwgMHg5OCwgMHhiZiwgMHhlMiwgMHg5OCwgMHhhMCApCisKIHR5cGVkZWYgc3RydWN0IHsKIAllZmlfZ3VpZF90IGd1aWQ7CiAJdW5zaWduZWQgbG9uZyB0YWJsZTsKQEAgLTQ1OCw2ICs0NjIsOCBAQAogCXN0cnVjdCBrc2V0ICprc2V0OwogCXN0cnVjdCBiaW5fYXR0cmlidXRlICpuZXdfdmFyLCAqZGVsX3ZhcjsKIAljb25zdCBzdHJ1Y3QgZWZpdmFyX29wZXJhdGlvbnMgKm9wczsKKwlzdHJ1Y3QgZWZpdmFyX2VudHJ5ICp3YWxrX2VudHJ5OworCXN0cnVjdCBwc3RvcmVfaW5mbyBlZmlfcHN0b3JlX2luZm87CiB9OwogCiBpbnQgcmVnaXN0ZXJfZWZpdmFycyhzdHJ1Y3QgZWZpdmFycyAqZWZpdmFycywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZmF1bHQtaW5qZWN0LmggYi9pbmNsdWRlL2xpbnV4L2ZhdWx0LWluamVjdC5oCmluZGV4IDNmZjA2MGEuLmM2Zjk5NmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZmF1bHQtaW5qZWN0LmgKKysrIGIvaW5jbHVkZS9saW51eC9mYXVsdC1pbmplY3QuaApAQCAtMjUsMTAgKzI1LDYgQEAKIAl1bnNpZ25lZCBsb25nIHJlamVjdF9lbmQ7CiAKIAl1bnNpZ25lZCBsb25nIGNvdW50OwotCi0jaWZkZWYgQ09ORklHX0ZBVUxUX0lOSkVDVElPTl9ERUJVR19GUwotCXN0cnVjdCBkZW50cnkgKmRpcjsKLSNlbmRpZgogfTsKIAogI2RlZmluZSBGQVVMVF9BVFRSX0lOSVRJQUxJWkVSIHsJCQkJXApAQCAtNDUsMTkgKzQxLDE1IEBACiAKICNpZmRlZiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OX0RFQlVHX0ZTCiAKLWludCBpbml0X2ZhdWx0X2F0dHJfZGVudHJpZXMoc3RydWN0IGZhdWx0X2F0dHIgKmF0dHIsIGNvbnN0IGNoYXIgKm5hbWUpOwotdm9pZCBjbGVhbnVwX2ZhdWx0X2F0dHJfZGVudHJpZXMoc3RydWN0IGZhdWx0X2F0dHIgKmF0dHIpOworc3RydWN0IGRlbnRyeSAqZmF1bHRfY3JlYXRlX2RlYnVnZnNfYXR0cihjb25zdCBjaGFyICpuYW1lLAorCQkJc3RydWN0IGRlbnRyeSAqcGFyZW50LCBzdHJ1Y3QgZmF1bHRfYXR0ciAqYXR0cik7CiAKICNlbHNlIC8qIENPTkZJR19GQVVMVF9JTkpFQ1RJT05fREVCVUdfRlMgKi8KIAotc3RhdGljIGlubGluZSBpbnQgaW5pdF9mYXVsdF9hdHRyX2RlbnRyaWVzKHN0cnVjdCBmYXVsdF9hdHRyICphdHRyLAotCQkJCQkgIGNvbnN0IGNoYXIgKm5hbWUpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBkZW50cnkgKmZhdWx0X2NyZWF0ZV9kZWJ1Z2ZzX2F0dHIoY29uc3QgY2hhciAqbmFtZSwKKwkJCXN0cnVjdCBkZW50cnkgKnBhcmVudCwgc3RydWN0IGZhdWx0X2F0dHIgKmF0dHIpCiB7Ci0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBjbGVhbnVwX2ZhdWx0X2F0dHJfZGVudHJpZXMoc3RydWN0IGZhdWx0X2F0dHIgKmF0dHIpCi17CisJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7CiB9CiAKICNlbmRpZiAvKiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OX0RFQlVHX0ZTICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ZzLmggYi9pbmNsdWRlL2xpbnV4L2ZzLmgKaW5kZXggZjIzYmNiNy4uNzg2YjNiMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mcy5oCisrKyBiL2luY2x1ZGUvbGludXgvZnMuaApAQCAtMjMxNywxMSArMjMxNywxOCBAQAogZXh0ZXJuIGludCBmaWxlX3JlbW92ZV9zdWlkKHN0cnVjdCBmaWxlICopOwogCiBleHRlcm4gdm9pZCBfX2luc2VydF9pbm9kZV9oYXNoKHN0cnVjdCBpbm9kZSAqLCB1bnNpZ25lZCBsb25nIGhhc2h2YWwpOwotZXh0ZXJuIHZvaWQgcmVtb3ZlX2lub2RlX2hhc2goc3RydWN0IGlub2RlICopOwogc3RhdGljIGlubGluZSB2b2lkIGluc2VydF9pbm9kZV9oYXNoKHN0cnVjdCBpbm9kZSAqaW5vZGUpCiB7CiAJX19pbnNlcnRfaW5vZGVfaGFzaChpbm9kZSwgaW5vZGUtPmlfaW5vKTsKIH0KKworZXh0ZXJuIHZvaWQgX19yZW1vdmVfaW5vZGVfaGFzaChzdHJ1Y3QgaW5vZGUgKik7CitzdGF0aWMgaW5saW5lIHZvaWQgcmVtb3ZlX2lub2RlX2hhc2goc3RydWN0IGlub2RlICppbm9kZSkKK3sKKwlpZiAoIWlub2RlX3VuaGFzaGVkKGlub2RlKSkKKwkJX19yZW1vdmVfaW5vZGVfaGFzaChpbm9kZSk7Cit9CisKIGV4dGVybiB2b2lkIGlub2RlX3NiX2xpc3RfYWRkKHN0cnVjdCBpbm9kZSAqaW5vZGUpOwogCiAjaWZkZWYgQ09ORklHX0JMT0NLCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dlbmFsbG9jLmggYi9pbmNsdWRlL2xpbnV4L2dlbmFsbG9jLmgKaW5kZXggNWJiZWJkYS4uNWU5OGVlYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9nZW5hbGxvYy5oCisrKyBiL2luY2x1ZGUvbGludXgvZ2VuYWxsb2MuaApAQCAtMSw4ICsxLDI2IEBACiAvKgotICogQmFzaWMgZ2VuZXJhbCBwdXJwb3NlIGFsbG9jYXRvciBmb3IgbWFuYWdpbmcgc3BlY2lhbCBwdXJwb3NlIG1lbW9yeQotICogbm90IG1hbmFnZWQgYnkgdGhlIHJlZ3VsYXIga21hbGxvYy9rZnJlZSBpbnRlcmZhY2UuCi0gKiBVc2VzIGZvciB0aGlzIGluY2x1ZGVzIG9uLWRldmljZSBzcGVjaWFsIG1lbW9yeSwgdW5jYWNoZWQgbWVtb3J5Ci0gKiBldGMuCisgKiBCYXNpYyBnZW5lcmFsIHB1cnBvc2UgYWxsb2NhdG9yIGZvciBtYW5hZ2luZyBzcGVjaWFsIHB1cnBvc2UKKyAqIG1lbW9yeSwgZm9yIGV4YW1wbGUsIG1lbW9yeSB0aGF0IGlzIG5vdCBtYW5hZ2VkIGJ5IHRoZSByZWd1bGFyCisgKiBrbWFsbG9jL2tmcmVlIGludGVyZmFjZS4gIFVzZXMgZm9yIHRoaXMgaW5jbHVkZXMgb24tZGV2aWNlIHNwZWNpYWwKKyAqIG1lbW9yeSwgdW5jYWNoZWQgbWVtb3J5IGV0Yy4KKyAqCisgKiBJdCBpcyBzYWZlIHRvIHVzZSB0aGUgYWxsb2NhdG9yIGluIE5NSSBoYW5kbGVycyBhbmQgb3RoZXIgc3BlY2lhbAorICogdW5ibG9ja2FibGUgY29udGV4dHMgdGhhdCBjb3VsZCBvdGhlcndpc2UgZGVhZGxvY2sgb24gbG9ja3MuICBUaGlzCisgKiBpcyBpbXBsZW1lbnRlZCBieSB1c2luZyBhdG9taWMgb3BlcmF0aW9ucyBhbmQgcmV0cmllcyBvbiBhbnkKKyAqIGNvbmZsaWN0cy4gIFRoZSBkaXNhZHZhbnRhZ2UgaXMgdGhhdCB0aGVyZSBtYXkgYmUgbGl2ZWxvY2tzIGluCisgKiBleHRyZW1lIGNhc2VzLiAgRm9yIGJldHRlciBzY2FsYWJpbGl0eSwgb25lIGFsbG9jYXRvciBjYW4gYmUgdXNlZAorICogZm9yIGVhY2ggQ1BVLgorICoKKyAqIFRoZSBsb2NrbGVzcyBvcGVyYXRpb24gb25seSB3b3JrcyBpZiB0aGVyZSBpcyBlbm91Z2ggbWVtb3J5CisgKiBhdmFpbGFibGUuICBJZiBuZXcgbWVtb3J5IGlzIGFkZGVkIHRvIHRoZSBwb29sIGEgbG9jayBoYXMgdG8gYmUKKyAqIHN0aWxsIHRha2VuLiAgU28gYW55IHVzZXIgcmVseWluZyBvbiBsb2NrbGVzc25lc3MgaGFzIHRvIGVuc3VyZQorICogdGhhdCBzdWZmaWNpZW50IG1lbW9yeSBpcyBwcmVhbGxvY2F0ZWQuCisgKgorICogVGhlIGJhc2ljIGF0b21pYyBvcGVyYXRpb24gb2YgdGhpcyBhbGxvY2F0b3IgaXMgY21weGNoZyBvbiBsb25nLgorICogT24gYXJjaGl0ZWN0dXJlcyB0aGF0IGRvbid0IGhhdmUgTk1JLXNhZmUgY21weGNoZyBpbXBsZW1lbnRhdGlvbiwKKyAqIHRoZSBhbGxvY2F0b3IgY2FuIE5PVCBiZSB1c2VkIGluIE5NSSBoYW5kbGVyLiAgU28gY29kZSB1c2VzIHRoZQorICogYWxsb2NhdG9yIGluIE5NSSBoYW5kbGVyIHNob3VsZCBkZXBlbmQgb24KKyAqIENPTkZJR19BUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRy4KICAqCiAgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKICAqIFZlcnNpb24gMi4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBtb3JlIGRldGFpbHMuCkBAIC0xNSw3ICszMyw3IEBACiAgKiAgR2VuZXJhbCBwdXJwb3NlIHNwZWNpYWwgbWVtb3J5IHBvb2wgZGVzY3JpcHRvci4KICAqLwogc3RydWN0IGdlbl9wb29sIHsKLQlyd2xvY2tfdCBsb2NrOworCXNwaW5sb2NrX3QgbG9jazsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGNodW5rczsJLyogbGlzdCBvZiBjaHVua3MgaW4gdGhpcyBwb29sICovCiAJaW50IG1pbl9hbGxvY19vcmRlcjsJCS8qIG1pbmltdW0gYWxsb2NhdGlvbiBvcmRlciAqLwogfTsKQEAgLTI0LDggKzQyLDggQEAKICAqICBHZW5lcmFsIHB1cnBvc2Ugc3BlY2lhbCBtZW1vcnkgcG9vbCBjaHVuayBkZXNjcmlwdG9yLgogICovCiBzdHJ1Y3QgZ2VuX3Bvb2xfY2h1bmsgewotCXNwaW5sb2NrX3QgbG9jazsKIAlzdHJ1Y3QgbGlzdF9oZWFkIG5leHRfY2h1bms7CS8qIG5leHQgY2h1bmsgaW4gcG9vbCAqLworCWF0b21pY190IGF2YWlsOwogCXBoeXNfYWRkcl90IHBoeXNfYWRkcjsJCS8qIHBoeXNpY2FsIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgbWVtb3J5IGNodW5rICovCiAJdW5zaWduZWQgbG9uZyBzdGFydF9hZGRyOwkvKiBzdGFydGluZyBhZGRyZXNzIG9mIG1lbW9yeSBjaHVuayAqLwogCXVuc2lnbmVkIGxvbmcgZW5kX2FkZHI7CQkvKiBlbmRpbmcgYWRkcmVzcyBvZiBtZW1vcnkgY2h1bmsgKi8KQEAgLTU2LDQgKzc0LDggQEAKIGV4dGVybiB2b2lkIGdlbl9wb29sX2Rlc3Ryb3koc3RydWN0IGdlbl9wb29sICopOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2VuX3Bvb2xfYWxsb2Moc3RydWN0IGdlbl9wb29sICosIHNpemVfdCk7CiBleHRlcm4gdm9pZCBnZW5fcG9vbF9mcmVlKHN0cnVjdCBnZW5fcG9vbCAqLCB1bnNpZ25lZCBsb25nLCBzaXplX3QpOworZXh0ZXJuIHZvaWQgZ2VuX3Bvb2xfZm9yX2VhY2hfY2h1bmsoc3RydWN0IGdlbl9wb29sICosCisJdm9pZCAoKikoc3RydWN0IGdlbl9wb29sICosIHN0cnVjdCBnZW5fcG9vbF9jaHVuayAqLCB2b2lkICopLCB2b2lkICopOworZXh0ZXJuIHNpemVfdCBnZW5fcG9vbF9hdmFpbChzdHJ1Y3QgZ2VuX3Bvb2wgKik7CitleHRlcm4gc2l6ZV90IGdlbl9wb29sX3NpemUoc3RydWN0IGdlbl9wb29sICopOwogI2VuZGlmIC8qIF9fR0VOQUxMT0NfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2dmcC5oIGIvaW5jbHVkZS9saW51eC9nZnAuaAppbmRleCBjYjQwODkyLi4zYTc2ZmFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2dmcC5oCisrKyBiL2luY2x1ZGUvbGludXgvZ2ZwLmgKQEAgLTkyLDcgKzkyLDcgQEAKICAqLwogI2RlZmluZSBfX0dGUF9OT1RSQUNLX0ZBTFNFX1BPU0lUSVZFIChfX0dGUF9OT1RSQUNLKQogCi0jZGVmaW5lIF9fR0ZQX0JJVFNfU0hJRlQgMjMJLyogUm9vbSBmb3IgMjMgX19HRlBfRk9PIGJpdHMgKi8KKyNkZWZpbmUgX19HRlBfQklUU19TSElGVCAyNAkvKiBSb29tIGZvciBOIF9fR0ZQX0ZPTyBiaXRzICovCiAjZGVmaW5lIF9fR0ZQX0JJVFNfTUFTSyAoKF9fZm9yY2UgZ2ZwX3QpKCgxIDw8IF9fR0ZQX0JJVFNfU0hJRlQpIC0gMSkpCiAKIC8qIFRoaXMgZXF1YWxzIDAsIGJ1dCB1c2UgY29uc3RhbnRzIGluIGNhc2UgdGhleSBldmVyIGNoYW5nZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZHIuaCBiL2luY2x1ZGUvbGludXgvaWRyLmgKaW5kZXggMTNhODAxZi4uMjU1NDkxYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZHIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2lkci5oCkBAIC0xNDYsNiArMTQ2LDEwIEBACiB2b2lkIGlkYV9kZXN0cm95KHN0cnVjdCBpZGEgKmlkYSk7CiB2b2lkIGlkYV9pbml0KHN0cnVjdCBpZGEgKmlkYSk7CiAKK2ludCBpZGFfc2ltcGxlX2dldChzdHJ1Y3QgaWRhICppZGEsIHVuc2lnbmVkIGludCBzdGFydCwgdW5zaWduZWQgaW50IGVuZCwKKwkJICAgZ2ZwX3QgZ2ZwX21hc2spOwordm9pZCBpZGFfc2ltcGxlX3JlbW92ZShzdHJ1Y3QgaWRhICppZGEsIHVuc2lnbmVkIGludCBpZCk7CisKIHZvaWQgX19pbml0IGlkcl9pbml0X2NhY2hlKHZvaWQpOwogCiAjZW5kaWYgLyogX19JRFJfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lvcG9ydC5oIGIvaW5jbHVkZS9saW51eC9pb3BvcnQuaAppbmRleCBjMmViZmU2Li45ZDU3YTcxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lvcG9ydC5oCisrKyBiL2luY2x1ZGUvbGludXgvaW9wb3J0LmgKQEAgLTE2Miw2ICsxNjIsNyBAQAogCQkJCQkJICAgICAgIHJlc291cmNlX3NpemVfdCwKIAkJCQkJCSAgICAgICByZXNvdXJjZV9zaXplX3QpLAogCQkJICAgICB2b2lkICphbGlnbmZfZGF0YSk7CitzdHJ1Y3QgcmVzb3VyY2UgKmxvb2t1cF9yZXNvdXJjZShzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QsIHJlc291cmNlX3NpemVfdCBzdGFydCk7CiBpbnQgYWRqdXN0X3Jlc291cmNlKHN0cnVjdCByZXNvdXJjZSAqcmVzLCByZXNvdXJjZV9zaXplX3Qgc3RhcnQsCiAJCSAgICByZXNvdXJjZV9zaXplX3Qgc2l6ZSk7CiByZXNvdXJjZV9zaXplX3QgcmVzb3VyY2VfYWxpZ25tZW50KHN0cnVjdCByZXNvdXJjZSAqcmVzKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXJxLmggYi9pbmNsdWRlL2xpbnV4L2lycS5oCmluZGV4IDVmNjk1MDQuLjg3YTA2ZjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXJxLmgKKysrIGIvaW5jbHVkZS9saW51eC9pcnEuaApAQCAtMTA4LDE0ICsxMDgsMTggQEAKIH07CiAKIHN0cnVjdCBtc2lfZGVzYzsKK3N0cnVjdCBpcnFfZG9tYWluOwogCiAvKioKICAqIHN0cnVjdCBpcnFfZGF0YSAtIHBlciBpcnEgYW5kIGlycSBjaGlwIGRhdGEgcGFzc2VkIGRvd24gdG8gY2hpcCBmdW5jdGlvbnMKICAqIEBpcnE6CQlpbnRlcnJ1cHQgbnVtYmVyCisgKiBAaHdpcnE6CQloYXJkd2FyZSBpbnRlcnJ1cHQgbnVtYmVyLCBsb2NhbCB0byB0aGUgaW50ZXJydXB0IGRvbWFpbgogICogQG5vZGU6CQlub2RlIGluZGV4IHVzZWZ1bCBmb3IgYmFsYW5jaW5nCiAgKiBAc3RhdGVfdXNlX2FjY2Vzc29yczogc3RhdHVzIGluZm9ybWF0aW9uIGZvciBpcnEgY2hpcCBmdW5jdGlvbnMuCiAgKgkJCVVzZSBhY2Nlc3NvciBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIGl0CiAgKiBAY2hpcDoJCWxvdyBsZXZlbCBpbnRlcnJ1cHQgaGFyZHdhcmUgYWNjZXNzCisgKiBAZG9tYWluOgkJSW50ZXJydXB0IHRyYW5zbGF0aW9uIGRvbWFpbjsgcmVzcG9uc2libGUgZm9yIG1hcHBpbmcKKyAqCQkJYmV0d2VlbiBod2lycSBudW1iZXIgYW5kIGxpbnV4IGlycSBudW1iZXIuCiAgKiBAaGFuZGxlcl9kYXRhOglwZXItSVJRIGRhdGEgZm9yIHRoZSBpcnFfY2hpcCBtZXRob2RzCiAgKiBAY2hpcF9kYXRhOgkJcGxhdGZvcm0tc3BlY2lmaWMgcGVyLWNoaXAgcHJpdmF0ZSBkYXRhIGZvciB0aGUgY2hpcAogICoJCQltZXRob2RzLCB0byBhbGxvdyBzaGFyZWQgY2hpcCBpbXBsZW1lbnRhdGlvbnMKQEAgLTEyOCw5ICsxMzIsMTEgQEAKICAqLwogc3RydWN0IGlycV9kYXRhIHsKIAl1bnNpZ25lZCBpbnQJCWlycTsKKwl1bnNpZ25lZCBsb25nCQlod2lycTsKIAl1bnNpZ25lZCBpbnQJCW5vZGU7CiAJdW5zaWduZWQgaW50CQlzdGF0ZV91c2VfYWNjZXNzb3JzOwogCXN0cnVjdCBpcnFfY2hpcAkJKmNoaXA7CisJc3RydWN0IGlycV9kb21haW4JKmRvbWFpbjsKIAl2b2lkCQkJKmhhbmRsZXJfZGF0YTsKIAl2b2lkCQkJKmNoaXBfZGF0YTsKIAlzdHJ1Y3QgbXNpX2Rlc2MJCSptc2lfZGVzYzsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXJxZG9tYWluLmggYi9pbmNsdWRlL2xpbnV4L2lycWRvbWFpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MDdhZDYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2lycWRvbWFpbi5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBpcnFfZG9tYWluIC0gSVJRIHRyYW5zbGF0aW9uIGRvbWFpbnMKKyAqCisgKiBUcmFuc2xhdGlvbiBpbmZyYXN0cnVjdHVyZSBiZXR3ZWVuIGh3IGFuZCBsaW51eCBpcnEgbnVtYmVycy4gIFRoaXMgaXMKKyAqIGhlbHBmdWwgZm9yIGludGVycnVwdCBjb250cm9sbGVycyB0byBpbXBsZW1lbnQgbWFwcGluZyBiZXR3ZWVuIGhhcmR3YXJlCisgKiBpcnEgbnVtYmVycyBhbmQgdGhlIExpbnV4IGlycSBudW1iZXIgc3BhY2UuCisgKgorICogaXJxX2RvbWFpbnMgYWxzbyBoYXZlIGEgaG9vayBmb3IgdHJhbnNsYXRpbmcgZGV2aWNlIHRyZWUgaW50ZXJydXB0CisgKiByZXByZXNlbnRhdGlvbiBpbnRvIGEgaGFyZHdhcmUgaXJxIG51bWJlciB0aGF0IGNhbiBiZSBtYXBwZWQgYmFjayB0byBhCisgKiBMaW51eCBpcnEgbnVtYmVyIHdpdGhvdXQgYW55IGV4dHJhIHBsYXRmb3JtIHN1cHBvcnQgY29kZS4KKyAqCisgKiBpcnFfZG9tYWluIGlzIGV4cGVjdGVkIHRvIGJlIGVtYmVkZGVkIGluIGFuIGludGVycnVwdCBjb250cm9sbGVyJ3MgcHJpdmF0ZQorICogZGF0YSBzdHJ1Y3R1cmUuCisgKi8KKyNpZm5kZWYgX0xJTlVYX0lSUURPTUFJTl9ICisjZGVmaW5lIF9MSU5VWF9JUlFET01BSU5fSAorCisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvbW9kX2RldmljZXRhYmxlLmg+CisKKyNpZmRlZiBDT05GSUdfSVJRX0RPTUFJTgorc3RydWN0IGRldmljZV9ub2RlOworc3RydWN0IGlycV9kb21haW47CisKKy8qKgorICogc3RydWN0IGlycV9kb21haW5fb3BzIC0gTWV0aG9kcyBmb3IgaXJxX2RvbWFpbiBvYmplY3RzCisgKiBAdG9faXJxOiAob3B0aW9uYWwpIGdpdmVuIGEgbG9jYWwgaGFyZHdhcmUgaXJxIG51bWJlciwgcmV0dXJuIHRoZSBsaW51eAorICogICAgICAgICAgaXJxIG51bWJlci4gIElmIHRvX2lycSBpcyBub3QgaW1wbGVtZW50ZWQsIHRoZW4gdGhlIGlycV9kb21haW4KKyAqICAgICAgICAgIHdpbGwgdXNlIHRoaXMgdHJhbnNsYXRpb246IGlycSA9IChkb21haW4tPmlycV9iYXNlICsgaHdpcnEpCisgKiBAZHRfdHJhbnNsYXRlOiBHaXZlbiBhIGRldmljZSB0cmVlIG5vZGUgYW5kIGludGVycnVwdCBzcGVjaWZpZXIsIGRlY29kZQorICogICAgICAgICAgICAgICAgdGhlIGhhcmR3YXJlIGlycSBudW1iZXIgYW5kIGxpbnV4IGlycSB0eXBlIHZhbHVlLgorICovCitzdHJ1Y3QgaXJxX2RvbWFpbl9vcHMgeworCXVuc2lnbmVkIGludCAoKnRvX2lycSkoc3RydWN0IGlycV9kb21haW4gKmQsIHVuc2lnbmVkIGxvbmcgaHdpcnEpOworCisjaWZkZWYgQ09ORklHX09GCisJaW50ICgqZHRfdHJhbnNsYXRlKShzdHJ1Y3QgaXJxX2RvbWFpbiAqZCwgc3RydWN0IGRldmljZV9ub2RlICpub2RlLAorCQkJICAgIGNvbnN0IHUzMiAqaW50c3BlYywgdW5zaWduZWQgaW50IGludHNpemUsCisJCQkgICAgdW5zaWduZWQgbG9uZyAqb3V0X2h3aXJxLCB1bnNpZ25lZCBpbnQgKm91dF90eXBlKTsKKyNlbmRpZiAvKiBDT05GSUdfT0YgKi8KK307CisKKy8qKgorICogc3RydWN0IGlycV9kb21haW4gLSBIYXJkd2FyZSBpbnRlcnJ1cHQgbnVtYmVyIHRyYW5zbGF0aW9uIG9iamVjdAorICogQGxpc3Q6IEVsZW1lbnQgaW4gZ2xvYmFsIGlycV9kb21haW4gbGlzdC4KKyAqIEBpcnFfYmFzZTogU3RhcnQgb2YgaXJxX2Rlc2MgcmFuZ2UgYXNzaWduZWQgdG8gdGhlIGlycV9kb21haW4uICBUaGUgY3JlYXRvcgorICogICAgICAgICAgICBvZiB0aGUgaXJxX2RvbWFpbiBpcyByZXNwb25zaWJsZSBmb3IgYWxsb2NhdGluZyB0aGUgYXJyYXkgb2YKKyAqICAgICAgICAgICAgaXJxX2Rlc2Mgc3RydWN0dXJlcy4KKyAqIEBucl9pcnE6IE51bWJlciBvZiBpcnFzIG1hbmFnZWQgYnkgdGhlIGlycSBkb21haW4KKyAqIEBvcHM6IHBvaW50ZXIgdG8gaXJxX2RvbWFpbiBtZXRob2RzCisgKiBAcHJpdjogcHJpdmF0ZSBkYXRhIHBvaW50ZXIgZm9yIHVzZSBieSBvd25lci4gIE5vdCB0b3VjaGVkIGJ5IGlycV9kb21haW4KKyAqICAgICAgICBjb3JlIGNvZGUuCisgKiBAb2Zfbm9kZTogKG9wdGlvbmFsKSBQb2ludGVyIHRvIGRldmljZSB0cmVlIG5vZGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAqICAgICAgICAgICBpcnFfZG9tYWluLiAgVXNlZCB3aGVuIGRlY29kaW5nIGRldmljZSB0cmVlIGludGVycnVwdCBzcGVjaWZpZXJzLgorICovCitzdHJ1Y3QgaXJxX2RvbWFpbiB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXVuc2lnbmVkIGludCBpcnFfYmFzZTsKKwl1bnNpZ25lZCBpbnQgbnJfaXJxOworCWNvbnN0IHN0cnVjdCBpcnFfZG9tYWluX29wcyAqb3BzOworCXZvaWQgKnByaXY7CisJc3RydWN0IGRldmljZV9ub2RlICpvZl9ub2RlOworfTsKKworLyoqCisgKiBpcnFfZG9tYWluX3RvX2lycSgpIC0gVHJhbnNsYXRlIGZyb20gYSBoYXJkd2FyZSBpcnEgdG8gYSBsaW51eCBpcnEgbnVtYmVyCisgKgorICogUmV0dXJucyB0aGUgbGludXggaXJxIG51bWJlciBhc3NvY2lhdGVkIHdpdGggYSBoYXJkd2FyZSBpcnEuICBCeSBkZWZhdWx0LAorICogdGhlIG1hcHBpbmcgaXMgaXJxID09IGRvbWFpbi0+aXJxX2Jhc2UgKyBod2lycSwgYnV0IHRoaXMgbWFwcGluZyBjYW4KKyAqIGJlIG92ZXJyaWRkZW4gaWYgdGhlIGlycV9kb21haW4gaW1wbGVtZW50cyBhIC50b19pcnEoKSBob29rLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBpcnFfZG9tYWluX3RvX2lycShzdHJ1Y3QgaXJxX2RvbWFpbiAqZCwKKwkJCQkJICAgICB1bnNpZ25lZCBsb25nIGh3aXJxKQoreworCXJldHVybiBkLT5vcHMtPnRvX2lycSA/IGQtPm9wcy0+dG9faXJxKGQsIGh3aXJxKSA6IGQtPmlycV9iYXNlICsgaHdpcnE7Cit9CisKK2V4dGVybiB2b2lkIGlycV9kb21haW5fYWRkKHN0cnVjdCBpcnFfZG9tYWluICpkb21haW4pOworZXh0ZXJuIHZvaWQgaXJxX2RvbWFpbl9kZWwoc3RydWN0IGlycV9kb21haW4gKmRvbWFpbik7CisjZW5kaWYgLyogQ09ORklHX0lSUV9ET01BSU4gKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0lSUV9ET01BSU4pICYmIGRlZmluZWQoQ09ORklHX09GX0lSUSkKK2V4dGVybiB2b2lkIGlycV9kb21haW5fYWRkX3NpbXBsZShzdHJ1Y3QgZGV2aWNlX25vZGUgKmNvbnRyb2xsZXIsIGludCBpcnFfYmFzZSk7CitleHRlcm4gdm9pZCBpcnFfZG9tYWluX2dlbmVyYXRlX3NpbXBsZShjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCwKKwkJCQkJdTY0IHBoeXNfYmFzZSwgdW5zaWduZWQgaW50IGlycV9zdGFydCk7CisjZWxzZSAvKiBDT05GSUdfSVJRX0RPTUFJTiAmJiBDT05GSUdfT0ZfSVJRICovCitzdGF0aWMgaW5saW5lIHZvaWQgaXJxX2RvbWFpbl9nZW5lcmF0ZV9zaW1wbGUoY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2gsCisJCQkJCXU2NCBwaHlzX2Jhc2UsIHVuc2lnbmVkIGludCBpcnFfc3RhcnQpIHsgfQorI2VuZGlmIC8qIENPTkZJR19JUlFfRE9NQUlOICYmIENPTkZJR19PRl9JUlEgKi8KKworI2VuZGlmIC8qIF9MSU5VWF9JUlFET01BSU5fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9qYmQyLmggYi9pbmNsdWRlL2xpbnV4L2piZDIuaAppbmRleCBkMDg3YzJlLi4zOGYzMDdiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2piZDIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2piZDIuaApAQCAtMTMyOSwxMiArMTMyOSw2IEBACiAjZGVmaW5lIEJVRkZFUl9UUkFDRTIoYmgsIGJoMiwgaW5mbykJZG8ge30gd2hpbGUgKDApCiAjZGVmaW5lIEpCVUZGRVJfVFJBQ0UoamgsIGluZm8pCWRvIHt9IHdoaWxlICgwKQogCi0vKiAKLSAqIGpiZDJfZGV2X3RvX25hbWUgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIHVzZWQgYnkgdGhlIGpiZDIgYW5kIGV4dDQgCi0gKiB0cmFjaW5nIGluZnJhc3RydWN0dXJlIHRvIG1hcCBhIGRldl90IHRvIGEgZGV2aWNlIG5hbWUuCi0gKi8KLWV4dGVybiBjb25zdCBjaGFyICpqYmQyX2Rldl90b19uYW1lKGRldl90IGRldmljZSk7Ci0KICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAKICNlbmRpZgkvKiBfTElOVVhfSkJEMl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2tjb25maWcuaCBiL2luY2x1ZGUvbGludXgva2NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2N2VkYTAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2tjb25maWcuaApAQCAtMCwwICsxLDMyIEBACisjaWZuZGVmIF9fTElOVVhfS0NPTkZJR19ICisjZGVmaW5lIF9fTElOVVhfS0NPTkZJR19ICisKKyNpbmNsdWRlIDxnZW5lcmF0ZWQvYXV0b2NvbmYuaD4KKworLyoKKyAqIEhlbHBlciBtYWNyb3MgdG8gdXNlIENPTkZJR18gb3B0aW9ucyBpbiBDIGV4cHJlc3Npb25zLiBOb3RlIHRoYXQKKyAqIHRoZXNlIG9ubHkgd29yayB3aXRoIGJvb2xlYW4gYW5kIHRyaXN0YXRlIG9wdGlvbnMuCisgKi8KKworLyoKKyAqIElTX0VOQUJMRUQoQ09ORklHX0ZPTykgZXZhbHVhdGVzIHRvIDEgaWYgQ09ORklHX0ZPTyBpcyBzZXQgdG8gJ3knIG9yICdtJywKKyAqIDAgb3RoZXJ3aXNlLgorICoKKyAqLworI2RlZmluZSBJU19FTkFCTEVEKG9wdGlvbikgXAorCShfX2VuYWJsZWRfICMjIG9wdGlvbiB8fCBfX2VuYWJsZWRfICMjIG9wdGlvbiAjIyBfTU9EVUxFKQorCisvKgorICogSVNfQlVJTFRJTihDT05GSUdfRk9PKSBldmFsdWF0ZXMgdG8gMSBpZiBDT05GSUdfRk9PIGlzIHNldCB0byAneScsIDAKKyAqIG90aGVyd2lzZS4gRm9yIGJvb2xlYW4gb3B0aW9ucywgdGhpcyBpcyBlcXVpdmFsZW50IHRvCisgKiBJU19FTkFCTEVEKENPTkZJR19GT08pLgorICovCisjZGVmaW5lIElTX0JVSUxUSU4ob3B0aW9uKSBfX2VuYWJsZWRfICMjIG9wdGlvbgorCisvKgorICogSVNfTU9EVUxFKENPTkZJR19GT08pIGV2YWx1YXRlcyB0byAxIGlmIENPTkZJR19GT08gaXMgc2V0IHRvICdtJywgMAorICogb3RoZXJ3aXNlLgorICovCisjZGVmaW5lIElTX01PRFVMRShvcHRpb24pIF9fZW5hYmxlZF8gIyMgb3B0aW9uICMjIF9NT0RVTEUKKworI2VuZGlmIC8qIF9fTElOVVhfS0NPTkZJR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xsaXN0LmggYi9pbmNsdWRlL2xpbnV4L2xsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEwYzhiNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvbGxpc3QuaApAQCAtMCwwICsxLDEyNiBAQAorI2lmbmRlZiBMTElTVF9ICisjZGVmaW5lIExMSVNUX0gKKy8qCisgKiBMb2NrLWxlc3MgTlVMTCB0ZXJtaW5hdGVkIHNpbmdsZSBsaW5rZWQgbGlzdAorICoKKyAqIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBwcm9kdWNlcnMgYW5kIG11bHRpcGxlIGNvbnN1bWVycywgbGxpc3RfYWRkCisgKiBjYW4gYmUgdXNlZCBpbiBwcm9kdWNlcnMgYW5kIGxsaXN0X2RlbF9hbGwgY2FuIGJlIHVzZWQgaW4KKyAqIGNvbnN1bWVycy4gIFRoZXkgY2FuIHdvcmsgc2ltdWx0YW5lb3VzbHkgd2l0aG91dCBsb2NrLiAgQnV0CisgKiBsbGlzdF9kZWxfZmlyc3QgY2FuIG5vdCBiZSB1c2VkIGhlcmUuICBCZWNhdXNlIGxsaXN0X2RlbF9maXJzdAorICogZGVwZW5kcyBvbiBsaXN0LT5maXJzdC0+bmV4dCBkb2VzIG5vdCBjaGFuZ2VkIGlmIGxpc3QtPmZpcnN0IGlzIG5vdAorICogY2hhbmdlZCBkdXJpbmcgaXRzIG9wZXJhdGlvbiwgYnV0IGxsaXN0X2RlbF9maXJzdCwgbGxpc3RfYWRkLAorICogbGxpc3RfYWRkIChvciBsbGlzdF9kZWxfYWxsLCBsbGlzdF9hZGQsIGxsaXN0X2FkZCkgc2VxdWVuY2UgaW4KKyAqIGFub3RoZXIgY29uc3VtZXIgbWF5IHZpb2xhdGUgdGhhdC4KKyAqCisgKiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgcHJvZHVjZXJzIGFuZCBvbmUgY29uc3VtZXIsIGxsaXN0X2FkZCBjYW4gYmUKKyAqIHVzZWQgaW4gcHJvZHVjZXJzIGFuZCBsbGlzdF9kZWxfYWxsIG9yIGxsaXN0X2RlbF9maXJzdCBjYW4gYmUgdXNlZAorICogaW4gdGhlIGNvbnN1bWVyLgorICoKKyAqIFRoaXMgY2FuIGJlIHN1bW1hcml6ZWQgYXMgZm9sbG93OgorICoKKyAqICAgICAgICAgICB8ICAgYWRkICAgIHwgZGVsX2ZpcnN0IHwgIGRlbF9hbGwKKyAqIGFkZCAgICAgICB8ICAgIC0gICAgIHwgICAgIC0gICAgIHwgICAgIC0KKyAqIGRlbF9maXJzdCB8ICAgICAgICAgIHwgICAgIEwgICAgIHwgICAgIEwKKyAqIGRlbF9hbGwgICB8ICAgICAgICAgIHwgICAgICAgICAgIHwgICAgIC0KKyAqCisgKiBXaGVyZSAiLSIgc3RhbmRzIGZvciBubyBsb2NrIGlzIG5lZWRlZCwgd2hpbGUgIkwiIHN0YW5kcyBmb3IgbG9jaworICogaXMgbmVlZGVkLgorICoKKyAqIFRoZSBsaXN0IGVudHJpZXMgZGVsZXRlZCB2aWEgbGxpc3RfZGVsX2FsbCBjYW4gYmUgdHJhdmVyc2VkIHdpdGgKKyAqIHRyYXZlcnNpbmcgZnVuY3Rpb24gc3VjaCBhcyBsbGlzdF9mb3JfZWFjaCBldGMuICBCdXQgdGhlIGxpc3QKKyAqIGVudHJpZXMgY2FuIG5vdCBiZSB0cmF2ZXJzZWQgc2FmZWx5IGJlZm9yZSBkZWxldGVkIGZyb20gdGhlIGxpc3QuCisgKiBUaGUgb3JkZXIgb2YgZGVsZXRlZCBlbnRyaWVzIGlzIGZyb20gdGhlIG5ld2VzdCB0byB0aGUgb2xkZXN0IGFkZGVkCisgKiBvbmUuICBJZiB5b3Ugd2FudCB0byB0cmF2ZXJzZSBmcm9tIHRoZSBvbGRlc3QgdG8gdGhlIG5ld2VzdCwgeW91CisgKiBtdXN0IHJldmVyc2UgdGhlIG9yZGVyIGJ5IHlvdXJzZWxmIGJlZm9yZSB0cmF2ZXJzaW5nLgorICoKKyAqIFRoZSBiYXNpYyBhdG9taWMgb3BlcmF0aW9uIG9mIHRoaXMgbGlzdCBpcyBjbXB4Y2hnIG9uIGxvbmcuICBPbgorICogYXJjaGl0ZWN0dXJlcyB0aGF0IGRvbid0IGhhdmUgTk1JLXNhZmUgY21weGNoZyBpbXBsZW1lbnRhdGlvbiwgdGhlCisgKiBsaXN0IGNhbiBOT1QgYmUgdXNlZCBpbiBOTUkgaGFuZGxlci4gIFNvIGNvZGUgdXNlcyB0aGUgbGlzdCBpbiBOTUkKKyAqIGhhbmRsZXIgc2hvdWxkIGRlcGVuZCBvbiBDT05GSUdfQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcuCisgKi8KKworc3RydWN0IGxsaXN0X2hlYWQgeworCXN0cnVjdCBsbGlzdF9ub2RlICpmaXJzdDsKK307CisKK3N0cnVjdCBsbGlzdF9ub2RlIHsKKwlzdHJ1Y3QgbGxpc3Rfbm9kZSAqbmV4dDsKK307CisKKyNkZWZpbmUgTExJU1RfSEVBRF9JTklUKG5hbWUpCXsgTlVMTCB9CisjZGVmaW5lIExMSVNUX0hFQUQobmFtZSkJc3RydWN0IGxsaXN0X2hlYWQgbmFtZSA9IExMSVNUX0hFQURfSU5JVChuYW1lKQorCisvKioKKyAqIGluaXRfbGxpc3RfaGVhZCAtIGluaXRpYWxpemUgbG9jay1sZXNzIGxpc3QgaGVhZAorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxvY2stbGVzcyBsaXN0CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2xsaXN0X2hlYWQoc3RydWN0IGxsaXN0X2hlYWQgKmxpc3QpCit7CisJbGlzdC0+Zmlyc3QgPSBOVUxMOworfQorCisvKioKKyAqIGxsaXN0X2VudHJ5IC0gZ2V0IHRoZSBzdHJ1Y3Qgb2YgdGhpcyBlbnRyeQorICogQHB0cjoJdGhlICZzdHJ1Y3QgbGxpc3Rfbm9kZSBwb2ludGVyLgorICogQHR5cGU6CXRoZSB0eXBlIG9mIHRoZSBzdHJ1Y3QgdGhpcyBpcyBlbWJlZGRlZCBpbi4KKyAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsbGlzdF9ub2RlIHdpdGhpbiB0aGUgc3RydWN0LgorICovCisjZGVmaW5lIGxsaXN0X2VudHJ5KHB0ciwgdHlwZSwgbWVtYmVyKQkJXAorCWNvbnRhaW5lcl9vZihwdHIsIHR5cGUsIG1lbWJlcikKKworLyoqCisgKiBsbGlzdF9mb3JfZWFjaCAtIGl0ZXJhdGUgb3ZlciBzb21lIGRlbGV0ZWQgZW50cmllcyBvZiBhIGxvY2stbGVzcyBsaXN0CisgKiBAcG9zOgl0aGUgJnN0cnVjdCBsbGlzdF9ub2RlIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yCisgKiBAbm9kZToJdGhlIGZpcnN0IGVudHJ5IG9mIGRlbGV0ZWQgbGlzdCBlbnRyaWVzCisgKgorICogSW4gZ2VuZXJhbCwgc29tZSBlbnRyaWVzIG9mIHRoZSBsb2NrLWxlc3MgbGlzdCBjYW4gYmUgdHJhdmVyc2VkCisgKiBzYWZlbHkgb25seSBhZnRlciBiZWluZyBkZWxldGVkIGZyb20gbGlzdCwgc28gc3RhcnQgd2l0aCBhbiBlbnRyeQorICogaW5zdGVhZCBvZiBsaXN0IGhlYWQuCisgKgorICogSWYgYmVpbmcgdXNlZCBvbiBlbnRyaWVzIGRlbGV0ZWQgZnJvbSBsb2NrLWxlc3MgbGlzdCBkaXJlY3RseSwgdGhlCisgKiB0cmF2ZXJzZSBvcmRlciBpcyBmcm9tIHRoZSBuZXdlc3QgdG8gdGhlIG9sZGVzdCBhZGRlZCBlbnRyeS4gIElmCisgKiB5b3Ugd2FudCB0byB0cmF2ZXJzZSBmcm9tIHRoZSBvbGRlc3QgdG8gdGhlIG5ld2VzdCwgeW91IG11c3QKKyAqIHJldmVyc2UgdGhlIG9yZGVyIGJ5IHlvdXJzZWxmIGJlZm9yZSB0cmF2ZXJzaW5nLgorICovCisjZGVmaW5lIGxsaXN0X2Zvcl9lYWNoKHBvcywgbm9kZSkJCQlcCisJZm9yICgocG9zKSA9IChub2RlKTsgcG9zOyAocG9zKSA9IChwb3MpLT5uZXh0KQorCisvKioKKyAqIGxsaXN0X2Zvcl9lYWNoX2VudHJ5IC0gaXRlcmF0ZSBvdmVyIHNvbWUgZGVsZXRlZCBlbnRyaWVzIG9mIGxvY2stbGVzcyBsaXN0IG9mIGdpdmVuIHR5cGUKKyAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAbm9kZToJdGhlIGZpc3QgZW50cnkgb2YgZGVsZXRlZCBsaXN0IGVudHJpZXMuCisgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbGxpc3Rfbm9kZSB3aXRoIHRoZSBzdHJ1Y3QuCisgKgorICogSW4gZ2VuZXJhbCwgc29tZSBlbnRyaWVzIG9mIHRoZSBsb2NrLWxlc3MgbGlzdCBjYW4gYmUgdHJhdmVyc2VkCisgKiBzYWZlbHkgb25seSBhZnRlciBiZWluZyByZW1vdmVkIGZyb20gbGlzdCwgc28gc3RhcnQgd2l0aCBhbiBlbnRyeQorICogaW5zdGVhZCBvZiBsaXN0IGhlYWQuCisgKgorICogSWYgYmVpbmcgdXNlZCBvbiBlbnRyaWVzIGRlbGV0ZWQgZnJvbSBsb2NrLWxlc3MgbGlzdCBkaXJlY3RseSwgdGhlCisgKiB0cmF2ZXJzZSBvcmRlciBpcyBmcm9tIHRoZSBuZXdlc3QgdG8gdGhlIG9sZGVzdCBhZGRlZCBlbnRyeS4gIElmCisgKiB5b3Ugd2FudCB0byB0cmF2ZXJzZSBmcm9tIHRoZSBvbGRlc3QgdG8gdGhlIG5ld2VzdCwgeW91IG11c3QKKyAqIHJldmVyc2UgdGhlIG9yZGVyIGJ5IHlvdXJzZWxmIGJlZm9yZSB0cmF2ZXJzaW5nLgorICovCisjZGVmaW5lIGxsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgbm9kZSwgbWVtYmVyKQkJCQlcCisJZm9yICgocG9zKSA9IGxsaXN0X2VudHJ5KChub2RlKSwgdHlwZW9mKCoocG9zKSksIG1lbWJlcik7CVwKKwkgICAgICYocG9zKS0+bWVtYmVyICE9IE5VTEw7CQkJCQlcCisJICAgICAocG9zKSA9IGxsaXN0X2VudHJ5KChwb3MpLT5tZW1iZXIubmV4dCwgdHlwZW9mKCoocG9zKSksIG1lbWJlcikpCisKKy8qKgorICogbGxpc3RfZW1wdHkgLSB0ZXN0cyB3aGV0aGVyIGEgbG9jay1sZXNzIGxpc3QgaXMgZW1wdHkKKyAqIEBoZWFkOgl0aGUgbGlzdCB0byB0ZXN0CisgKgorICogTm90IGd1YXJhbnRlZWQgdG8gYmUgYWNjdXJhdGUgb3IgdXAgdG8gZGF0ZS4gIEp1c3QgYSBxdWljayB3YXkgdG8KKyAqIHRlc3Qgd2hldGhlciB0aGUgbGlzdCBpcyBlbXB0eSB3aXRob3V0IGRlbGV0aW5nIHNvbWV0aGluZyBmcm9tIHRoZQorICogbGlzdC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbGxpc3RfZW1wdHkoY29uc3Qgc3RydWN0IGxsaXN0X2hlYWQgKmhlYWQpCit7CisJcmV0dXJuIEFDQ0VTU19PTkNFKGhlYWQtPmZpcnN0KSA9PSBOVUxMOworfQorCit2b2lkIGxsaXN0X2FkZChzdHJ1Y3QgbGxpc3Rfbm9kZSAqbmV3LCBzdHJ1Y3QgbGxpc3RfaGVhZCAqaGVhZCk7Cit2b2lkIGxsaXN0X2FkZF9iYXRjaChzdHJ1Y3QgbGxpc3Rfbm9kZSAqbmV3X2ZpcnN0LCBzdHJ1Y3QgbGxpc3Rfbm9kZSAqbmV3X2xhc3QsCisJCSAgICAgc3RydWN0IGxsaXN0X2hlYWQgKmhlYWQpOworc3RydWN0IGxsaXN0X25vZGUgKmxsaXN0X2RlbF9maXJzdChzdHJ1Y3QgbGxpc3RfaGVhZCAqaGVhZCk7CitzdHJ1Y3QgbGxpc3Rfbm9kZSAqbGxpc3RfZGVsX2FsbChzdHJ1Y3QgbGxpc3RfaGVhZCAqaGVhZCk7CisjZW5kaWYgLyogTExJU1RfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1jb250cm9sLmggYi9pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaAppbmRleCBiOTY2MDA3Li4zYjUzNWRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaAorKysgYi9pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaApAQCAtODYsOCArODYsNiBAQAogCiBleHRlcm4gdm9pZCBtZW1fY2dyb3VwX3VuY2hhcmdlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpOwogZXh0ZXJuIHZvaWQgbWVtX2Nncm91cF91bmNoYXJnZV9jYWNoZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKTsKLWV4dGVybiBpbnQgbWVtX2Nncm91cF9zaG1lbV9jaGFyZ2VfZmFsbGJhY2soc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCQlzdHJ1Y3QgbW1fc3RydWN0ICptbSwgZ2ZwX3QgZ2ZwX21hc2spOwogCiBleHRlcm4gdm9pZCBtZW1fY2dyb3VwX291dF9vZl9tZW1vcnkoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbSwgZ2ZwX3QgZ2ZwX21hc2spOwogaW50IHRhc2tfaW5fbWVtX2Nncm91cChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGNvbnN0IHN0cnVjdCBtZW1fY2dyb3VwICptZW0pOwpAQCAtMjI1LDEyICsyMjMsNiBAQAogewogfQogCi1zdGF0aWMgaW5saW5lIGludCBtZW1fY2dyb3VwX3NobWVtX2NoYXJnZV9mYWxsYmFjayhzdHJ1Y3QgcGFnZSAqcGFnZSwKLQkJCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBnZnBfdCBnZnBfbWFzaykKLXsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIG1lbV9jZ3JvdXBfYWRkX2xydV9saXN0KHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgbHJ1KQogewogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvYWF0Mjg3MC5oIGIvaW5jbHVkZS9saW51eC9tZmQvYWF0Mjg3MC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MzE2YzIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9hYXQyODcwLmgKQEAgLTAsMCArMSwxODEgQEAKKy8qCisgKiBsaW51eC9pbmNsdWRlL2xpbnV4L21mZC9hYXQyODcwLmgKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIE5WSURJQSBDb3Jwb3JhdGlvbi4KKyAqIEF1dGhvcjogSmluIFBhcmsgPGppbnlvdW5ncEBudmlkaWEuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqLworCisjaWZuZGVmIF9fTElOVVhfTUZEX0FBVDI4NzBfSAorI2RlZmluZSBfX0xJTlVYX01GRF9BQVQyODcwX0gKKworI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKworLyogUmVnaXN0ZXIgb2Zmc2V0cyAqLworI2RlZmluZSBBQVQyODcwX0JMX0NIX0VOCTB4MDAKKyNkZWZpbmUgQUFUMjg3MF9CTE0JCTB4MDEKKyNkZWZpbmUgQUFUMjg3MF9CTFMJCTB4MDIKKyNkZWZpbmUgQUFUMjg3MF9CTDEJCTB4MDMKKyNkZWZpbmUgQUFUMjg3MF9CTDIJCTB4MDQKKyNkZWZpbmUgQUFUMjg3MF9CTDMJCTB4MDUKKyNkZWZpbmUgQUFUMjg3MF9CTDQJCTB4MDYKKyNkZWZpbmUgQUFUMjg3MF9CTDUJCTB4MDcKKyNkZWZpbmUgQUFUMjg3MF9CTDYJCTB4MDgKKyNkZWZpbmUgQUFUMjg3MF9CTDcJCTB4MDkKKyNkZWZpbmUgQUFUMjg3MF9CTDgJCTB4MEEKKyNkZWZpbmUgQUFUMjg3MF9GTFIJCTB4MEIKKyNkZWZpbmUgQUFUMjg3MF9GTQkJMHgwQworI2RlZmluZSBBQVQyODcwX0ZTCQkweDBECisjZGVmaW5lIEFBVDI4NzBfQUxTX0NGRzAJMHgwRQorI2RlZmluZSBBQVQyODcwX0FMU19DRkcxCTB4MEYKKyNkZWZpbmUgQUFUMjg3MF9BTFNfQ0ZHMgkweDEwCisjZGVmaW5lIEFBVDI4NzBfQU1CCQkweDExCisjZGVmaW5lIEFBVDI4NzBfQUxTMAkJMHgxMgorI2RlZmluZSBBQVQyODcwX0FMUzEJCTB4MTMKKyNkZWZpbmUgQUFUMjg3MF9BTFMyCQkweDE0CisjZGVmaW5lIEFBVDI4NzBfQUxTMwkJMHgxNQorI2RlZmluZSBBQVQyODcwX0FMUzQJCTB4MTYKKyNkZWZpbmUgQUFUMjg3MF9BTFM1CQkweDE3CisjZGVmaW5lIEFBVDI4NzBfQUxTNgkJMHgxOAorI2RlZmluZSBBQVQyODcwX0FMUzcJCTB4MTkKKyNkZWZpbmUgQUFUMjg3MF9BTFM4CQkweDFBCisjZGVmaW5lIEFBVDI4NzBfQUxTOQkJMHgxQgorI2RlZmluZSBBQVQyODcwX0FMU0EJCTB4MUMKKyNkZWZpbmUgQUFUMjg3MF9BTFNCCQkweDFECisjZGVmaW5lIEFBVDI4NzBfQUxTQwkJMHgxRQorI2RlZmluZSBBQVQyODcwX0FMU0QJCTB4MUYKKyNkZWZpbmUgQUFUMjg3MF9BTFNFCQkweDIwCisjZGVmaW5lIEFBVDI4NzBfQUxTRgkJMHgyMQorI2RlZmluZSBBQVQyODcwX1NVQl9TRVQJCTB4MjIKKyNkZWZpbmUgQUFUMjg3MF9TVUJfQ1RSTAkweDIzCisjZGVmaW5lIEFBVDI4NzBfTERPX0FCCQkweDI0CisjZGVmaW5lIEFBVDI4NzBfTERPX0NECQkweDI1CisjZGVmaW5lIEFBVDI4NzBfTERPX0VOCQkweDI2CisjZGVmaW5lIEFBVDI4NzBfUkVHX05VTQkJMHgyNworCisvKiBEZXZpY2UgSURzICovCitlbnVtIGFhdDI4NzBfaWQgeworCUFBVDI4NzBfSURfQkwsCisJQUFUMjg3MF9JRF9MRE9BLAorCUFBVDI4NzBfSURfTERPQiwKKwlBQVQyODcwX0lEX0xET0MsCisJQUFUMjg3MF9JRF9MRE9ECit9OworCisvKiBCYWNrbGlnaHQgY2hhbm5lbHMgKi8KKyNkZWZpbmUgQUFUMjg3MF9CTF9DSDEJCTB4MDEKKyNkZWZpbmUgQUFUMjg3MF9CTF9DSDIJCTB4MDIKKyNkZWZpbmUgQUFUMjg3MF9CTF9DSDMJCTB4MDQKKyNkZWZpbmUgQUFUMjg3MF9CTF9DSDQJCTB4MDgKKyNkZWZpbmUgQUFUMjg3MF9CTF9DSDUJCTB4MTAKKyNkZWZpbmUgQUFUMjg3MF9CTF9DSDYJCTB4MjAKKyNkZWZpbmUgQUFUMjg3MF9CTF9DSDcJCTB4NDAKKyNkZWZpbmUgQUFUMjg3MF9CTF9DSDgJCTB4ODAKKyNkZWZpbmUgQUFUMjg3MF9CTF9DSF9BTEwJMHhGRgorCisvKiBCYWNrbGlnaHQgY3VycmVudCBtYWduaXR1ZGUgKG1BKSAqLworZW51bSBhYXQyODcwX2N1cnJlbnQgeworCUFBVDI4NzBfQ1VSUkVOVF8wXzQ1ID0gMSwKKwlBQVQyODcwX0NVUlJFTlRfMF85MCwKKwlBQVQyODcwX0NVUlJFTlRfMV84MCwKKwlBQVQyODcwX0NVUlJFTlRfMl83MCwKKwlBQVQyODcwX0NVUlJFTlRfM182MCwKKwlBQVQyODcwX0NVUlJFTlRfNF81MCwKKwlBQVQyODcwX0NVUlJFTlRfNV80MCwKKwlBQVQyODcwX0NVUlJFTlRfNl8zMCwKKwlBQVQyODcwX0NVUlJFTlRfN18yMCwKKwlBQVQyODcwX0NVUlJFTlRfOF8xMCwKKwlBQVQyODcwX0NVUlJFTlRfOV8wMCwKKwlBQVQyODcwX0NVUlJFTlRfOV85MCwKKwlBQVQyODcwX0NVUlJFTlRfMTBfOCwKKwlBQVQyODcwX0NVUlJFTlRfMTFfNywKKwlBQVQyODcwX0NVUlJFTlRfMTJfNiwKKwlBQVQyODcwX0NVUlJFTlRfMTNfNSwKKwlBQVQyODcwX0NVUlJFTlRfMTRfNCwKKwlBQVQyODcwX0NVUlJFTlRfMTVfMywKKwlBQVQyODcwX0NVUlJFTlRfMTZfMiwKKwlBQVQyODcwX0NVUlJFTlRfMTdfMSwKKwlBQVQyODcwX0NVUlJFTlRfMThfMCwKKwlBQVQyODcwX0NVUlJFTlRfMThfOSwKKwlBQVQyODcwX0NVUlJFTlRfMTlfOCwKKwlBQVQyODcwX0NVUlJFTlRfMjBfNywKKwlBQVQyODcwX0NVUlJFTlRfMjFfNiwKKwlBQVQyODcwX0NVUlJFTlRfMjJfNSwKKwlBQVQyODcwX0NVUlJFTlRfMjNfNCwKKwlBQVQyODcwX0NVUlJFTlRfMjRfMywKKwlBQVQyODcwX0NVUlJFTlRfMjVfMiwKKwlBQVQyODcwX0NVUlJFTlRfMjZfMSwKKwlBQVQyODcwX0NVUlJFTlRfMjdfMCwKKwlBQVQyODcwX0NVUlJFTlRfMjdfOQorfTsKKworc3RydWN0IGFhdDI4NzBfcmVnaXN0ZXIgeworCWJvb2wgcmVhZGFibGU7CisJYm9vbCB3cml0ZWFibGU7CisJdTggdmFsdWU7Cit9OworCitzdHJ1Y3QgYWF0Mjg3MF9kYXRhIHsKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKworCXN0cnVjdCBtdXRleCBpb19sb2NrOworCXN0cnVjdCBhYXQyODcwX3JlZ2lzdGVyICpyZWdfY2FjaGU7IC8qIHJlZ2lzdGVyIGNhY2hlICovCisJaW50IGVuX3BpbjsgLyogZW5hYmxlIEdQSU8gcGluIChpZiA8IDAsIGlnbm9yZSB0aGlzIHZhbHVlKSAqLworCWJvb2wgaXNfZW5hYmxlOworCisJLyogaW5pdCBhbmQgdW5pbml0IGZvciBwbGF0Zm9ybSBzcGVjaWZpZWQgKi8KKwlpbnQgKCppbml0KShzdHJ1Y3QgYWF0Mjg3MF9kYXRhICphYXQyODcwKTsKKwl2b2lkICgqdW5pbml0KShzdHJ1Y3QgYWF0Mjg3MF9kYXRhICphYXQyODcwKTsKKworCS8qIGkyYyBpbyBmdW5jbnRpb25zICovCisJaW50ICgqcmVhZCkoc3RydWN0IGFhdDI4NzBfZGF0YSAqYWF0Mjg3MCwgdTggYWRkciwgdTggKnZhbCk7CisJaW50ICgqd3JpdGUpKHN0cnVjdCBhYXQyODcwX2RhdGEgKmFhdDI4NzAsIHU4IGFkZHIsIHU4IHZhbCk7CisJaW50ICgqdXBkYXRlKShzdHJ1Y3QgYWF0Mjg3MF9kYXRhICphYXQyODcwLCB1OCBhZGRyLCB1OCBtYXNrLCB1OCB2YWwpOworCisJLyogZm9yIGRlYnVnZnMgKi8KKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnlfcm9vdDsKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnlfcmVnOworfTsKKworc3RydWN0IGFhdDI4NzBfc3ViZGV2X2luZm8geworCWludCBpZDsKKwljb25zdCBjaGFyICpuYW1lOworCXZvaWQgKnBsYXRmb3JtX2RhdGE7Cit9OworCitzdHJ1Y3QgYWF0Mjg3MF9wbGF0Zm9ybV9kYXRhIHsKKwlpbnQgZW5fcGluOyAvKiBlbmFibGUgR1BJTyBwaW4gKGlmIDwgMCwgaWdub3JlIHRoaXMgdmFsdWUpICovCisKKwlzdHJ1Y3QgYWF0Mjg3MF9zdWJkZXZfaW5mbyAqc3ViZGV2czsKKwlpbnQgbnVtX3N1YmRldnM7CisKKwkvKiBpbml0IGFuZCB1bmluaXQgZm9yIHBsYXRmb3JtIHNwZWNpZmllZCAqLworCWludCAoKmluaXQpKHN0cnVjdCBhYXQyODcwX2RhdGEgKmFhdDI4NzApOworCXZvaWQgKCp1bmluaXQpKHN0cnVjdCBhYXQyODcwX2RhdGEgKmFhdDI4NzApOworfTsKKworc3RydWN0IGFhdDI4NzBfYmxfcGxhdGZvcm1fZGF0YSB7CisJLyogYmFja2xpZ2h0IGNoYW5uZWxzLCBkZWZhdWx0IGlzIEFBVDI4NzBfQkxfQ0hfQUxMICovCisJaW50IGNoYW5uZWxzOworCS8qIGJhY2tsaWdodCBjdXJyZW50IG1hZ25pdHVkZSwgZGVmYXVsdCBpcyBBQVQyODcwX0NVUlJFTlRfMjdfOSAqLworCWludCBtYXhfY3VycmVudDsKKwkvKiBtYXhpbXVtIGJyaWdodG5lc3MsIGRlZmF1bHQgaXMgMjU1ICovCisJaW50IG1heF9icmlnaHRuZXNzOworfTsKKworI2VuZGlmIC8qIF9fTElOVVhfTUZEX0FBVDI4NzBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvYWI4NTAwLmggYi9pbmNsdWRlL2xpbnV4L21mZC9hYjg1MDAuaAppbmRleCBiMzE4NDMwLi44MzhjNmI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC9hYjg1MDAuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9hYjg1MDAuaApAQCAtMjgsNiArMjgsNyBAQAogI2RlZmluZSBBQjg1MDBfSU5URVJSVVBUCTB4RQogI2RlZmluZSBBQjg1MDBfUlRDCQkweEYKICNkZWZpbmUgQUI4NTAwX01JU0MJCTB4MTAKKyNkZWZpbmUgQUI4NTAwX0RFVkVMT1BNRU5UCTB4MTEKICNkZWZpbmUgQUI4NTAwX0RFQlVHCQkweDEyCiAjZGVmaW5lIEFCODUwMF9QUk9EX1RFU1QJMHgxMwogI2RlZmluZSBBQjg1MDBfT1RQX0VNVUwJCTB4MTUKQEAgLTc0LDEzICs3NSw2IEBACiAjZGVmaW5lIEFCODUwMF9JTlRfQUNDX0RFVEVDVF8yMURCX0YJMzcKICNkZWZpbmUgQUI4NTAwX0lOVF9BQ0NfREVURUNUXzIxREJfUgkzOAogI2RlZmluZSBBQjg1MDBfSU5UX0dQX1NXX0FEQ19DT05WX0VORAkzOQotI2RlZmluZSBBQjg1MDBfSU5UX0FDQ19ERVRFQ1RfMURCX0YJMzMKLSNkZWZpbmUgQUI4NTAwX0lOVF9BQ0NfREVURUNUXzFEQl9SCTM0Ci0jZGVmaW5lIEFCODUwMF9JTlRfQUNDX0RFVEVDVF8yMkRCX0YJMzUKLSNkZWZpbmUgQUI4NTAwX0lOVF9BQ0NfREVURUNUXzIyREJfUgkzNgotI2RlZmluZSBBQjg1MDBfSU5UX0FDQ19ERVRFQ1RfMjFEQl9GCTM3Ci0jZGVmaW5lIEFCODUwMF9JTlRfQUNDX0RFVEVDVF8yMURCX1IJMzgKLSNkZWZpbmUgQUI4NTAwX0lOVF9HUF9TV19BRENfQ09OVl9FTkQJMzkKICNkZWZpbmUgQUI4NTAwX0lOVF9HUElPNlIJCTQwCiAjZGVmaW5lIEFCODUwMF9JTlRfR1BJTzdSCQk0MQogI2RlZmluZSBBQjg1MDBfSU5UX0dQSU84UgkJNDIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL21heDg5OTcuaCBiL2luY2x1ZGUvbGludXgvbWZkL21heDg5OTcuaAppbmRleCA2MDkzMWQwLi4wYmJkMTNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC9tYXg4OTk3LmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvbWF4ODk5Ny5oCkBAIC0xMDcsMTEgKzEwNywxNiBAQAogCXVuc2lnbmVkIGludCBidWNrNV92b2x0YWdlWzhdOwogCWJvb2wgYnVjazVfZ3Bpb2R2czsKIAorCS8qIC0tLS0gQ2hhcmdlciBjb250cm9sIC0tLS0gKi8KKwkvKiBlb2Mgc3RhbmRzIGZvciAnZW5kIG9mIGNoYXJnZScgKi8KKwlpbnQgZW9jX21BOyAvKiA1MCB+IDIwMG1BIGJ5IDEwbUEgc3RlcCAqLworCS8qIGNoYXJnZSBGdWxsIFRpbWVvdXQgKi8KKwlpbnQgdGltZW91dDsgLyogMCAobm8gdGltZW91dCksIDUsIDYsIDcgaG91cnMgKi8KKwogCS8qIE1VSUM6IE5vdCBpbXBsZW1lbnRlZCAqLwogCS8qIEhBUFRJQzogTm90IGltcGxlbWVudGVkICovCiAJLyogUlRDOiBOb3QgaW1wbGVtZW50ZWQgKi8KIAkvKiBGbGFzaDogTm90IGltcGxlbWVudGVkICovCi0JLyogQ2hhcmdlciBjb250cm9sOiBOb3QgaW1wbGVtZW50ZWQgKi8KIH07CiAKICNlbmRpZiAvKiBfX0xJTlVYX01GRF9NQVg4OTk4X0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL21heDg5OTguaCBiL2luY2x1ZGUvbGludXgvbWZkL21heDg5OTguaAppbmRleCA2MWRhYTE2Li5mNGYwZGZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21mZC9tYXg4OTk4LmgKKysrIGIvaW5jbHVkZS9saW51eC9tZmQvbWF4ODk5OC5oCkBAIC04Nyw2ICs4NywxNSBAQAogICogQHdha2V1cDogQWxsb3cgdG8gd2FrZSB1cCBmcm9tIHN1c3BlbmQKICAqIEBydGNfZGVsYXk6IExQMzk3NCBSVEMgY2hpcCBidWcgdGhhdCByZXF1aXJlcyBkZWxheSBhZnRlciBhIHJlZ2lzdGVyCiAgKiB3cml0ZSBiZWZvcmUgcmVhZGluZyBpdC4KKyAqIEBlb2M6IEVuZCBvZiBDaGFyZ2UgTGV2ZWwgaW4gcGVyY2VudDogMTAlIH4gNDUlIGJ5IDUlIHN0ZXAKKyAqICAgSWYgaXQgZXF1YWxzIDAsIGxlYXZlIGl0IHVuY2hhbmdlZC4KKyAqICAgT3RoZXJ3aXNlLCBpdCBpcyBhIGludmFsaWQgdmFsdWUuCisgKiBAcmVzdGFydDogUmVzdGFydCBMZXZlbCBpbiBtVjogMTAwLCAxNTAsIDIwMCwgYW5kIC0xIGZvciBkaXNhYmxlLgorICogICBJZiBpdCBlcXVhbHMgMCwgbGVhdmUgaXQgdW5jaGFuZ2VkLgorICogICBPdGhlcndpc2UsIGl0IGlzIGEgaW52YWxpZCB2YWx1ZS4KKyAqIEB0aW1lb3V0OiBGdWxsIFRpbWVvdXQgaW4gaG91cnM6IDUsIDYsIDcsIGFuZCAtMSBmb3IgZGlzYWJsZS4KKyAqICAgSWYgaXQgZXF1YWxzIDAsIGxlYXZlIGl0IHVuY2hhbmdlZC4KKyAqICAgT3RoZXJ3aXNlLCBsZWF2ZSBpdCB1bmNoYW5nZWQuCiAgKi8KIHN0cnVjdCBtYXg4OTk4X3BsYXRmb3JtX2RhdGEgewogCXN0cnVjdCBtYXg4OTk4X3JlZ3VsYXRvcl9kYXRhCSpyZWd1bGF0b3JzOwpAQCAtMTA3LDYgKzExNiw5IEBACiAJaW50CQkJCWJ1Y2syX2RlZmF1bHRfaWR4OwogCWJvb2wJCQkJd2FrZXVwOwogCWJvb2wJCQkJcnRjX2RlbGF5OworCWludAkJCQllb2M7CisJaW50CQkJCXJlc3RhcnQ7CisJaW50CQkJCXRpbWVvdXQ7CiB9OwogCiAjZW5kaWYgLyogIF9fTElOVVhfTUZEX01BWDg5OThfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvc3RtcGUuaCBiL2luY2x1ZGUvbGludXgvbWZkL3N0bXBlLmgKaW5kZXggZTc2MmMyNy4uYmUxYWY3YyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvc3RtcGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC9zdG1wZS5oCkBAIC01Nyw2ICs1Nyw3IEBACiAgKiBAaXJxX2xvY2s6IElSUSBidXMgbG9jawogICogQGRldjogZGV2aWNlLCBtb3N0bHkgZm9yIGRldl9kYmcoKQogICogQGkyYzogaTJjIGNsaWVudAorICogQHBhcnRudW06IHBhcnQgbnVtYmVyCiAgKiBAdmFyaWFudDogdGhlIGRldGVjdGVkIFNUTVBFIG1vZGVsIG51bWJlcgogICogQHJlZ3M6IGxpc3Qgb2YgYWRkcmVzc2VzIG9mIHJlZ2lzdGVycyB3aGljaCBhcmUgYXQgZGlmZmVyZW50IGFkZHJlc3NlcyBvbgogICoJICBkaWZmZXJlbnQgdmFyaWFudHMuICBJbmRleGVkIGJ5IG9uZSBvZiBTVE1QRV9JRFhfKi4KQEAgLTEyMSw2ICsxMjIsOCBAQAogICogQG5vcmVxdWVzdF9tYXNrOiBiaXRtYXNrIHNwZWNpZnlpbmcgd2hpY2ggR1BJT3Mgc2hvdWxkIF9ub3RfIGJlCiAgKgkJICAgIHJlcXVlc3RhYmxlIGR1ZSB0byBkaWZmZXJlbnQgdXNhZ2UgKGUuZy4gdG91Y2gsIGtleXBhZCkKICAqCQkgICAgU1RNUEVfR1BJT19OT1JFUV8qIG1hY3JvcyBjYW4gYmUgdXNlZCBoZXJlLgorICogQHNldHVwOiBib2FyZCBzcGVjaWZpYyBzZXR1cCBjYWxsYmFjay4KKyAqIEByZW1vdmU6IGJvYXJkIHNwZWNpZmljIHJlbW92ZSBjYWxsYmFjawogICovCiBzdHJ1Y3Qgc3RtcGVfZ3Bpb19wbGF0Zm9ybV9kYXRhIHsKIAlpbnQgZ3Bpb19iYXNlOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvdHBzNjU5MTAuaCBiL2luY2x1ZGUvbGludXgvbWZkL3RwczY1OTEwLmgKaW5kZXggNzM1NzJjNi4uODJiNGM4OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvdHBzNjU5MTAuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC90cHM2NTkxMC5oCkBAIC03OTEsNiArNzkxLDcgQEAKIHZvaWQgdHBzNjU5MTBfZ3Bpb19pbml0KHN0cnVjdCB0cHM2NTkxMCAqdHBzNjU5MTAsIGludCBncGlvX2Jhc2UpOwogaW50IHRwczY1OTEwX2lycV9pbml0KHN0cnVjdCB0cHM2NTkxMCAqdHBzNjU5MTAsIGludCBpcnEsCiAJCXN0cnVjdCB0cHM2NTkxMF9wbGF0Zm9ybV9kYXRhICpwZGF0YSk7CitpbnQgdHBzNjU5MTBfaXJxX2V4aXQoc3RydWN0IHRwczY1OTEwICp0cHM2NTkxMCk7CiAKIHN0YXRpYyBpbmxpbmUgaW50IHRwczY1OTEwX2NoaXBfaWQoc3RydWN0IHRwczY1OTEwICp0cHM2NTkxMCkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWZkL3RwczY1OTEyLmggYi9pbmNsdWRlL2xpbnV4L21mZC90cHM2NTkxMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhY2VhYjQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC90cHM2NTkxMi5oCkBAIC0wLDAgKzEsMzI3IEBACisvKgorICogdHBzNjU5MTIuaCAgLS0gIFRJIFRQUzY1OTF4CisgKgorICogQ29weXJpZ2h0IDIwMTEgVGV4YXMgSW5zdHJ1bWVudHMgSW5jLgorICoKKyAqIEF1dGhvcjogTWFyZ2FyaXRhIE9sYXlhIDxtYWdpQHNsaW1sb2dpYy5jby51az4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKworI2lmbmRlZiBfX0xJTlVYX01GRF9UUFM2NTkxMl9ICisjZGVmaW5lIF9fTElOVVhfTUZEX1RQUzY1OTEyX0gKKworLyogVFBTIHJlZ3VsYXRvciB0eXBlIGxpc3QgKi8KKyNkZWZpbmUgUkVHVUxBVE9SX0xETwkJMAorI2RlZmluZSBSRUdVTEFUT1JfRENEQwkJMQorCisvKgorICogTGlzdCBvZiByZWdpc3RlcnMgZm9yIFRQUzY1OTEyCisgKi8KKworI2RlZmluZSBUUFM2NTkxMl9EQ0RDMV9DVFJMCQkweDAwCisjZGVmaW5lIFRQUzY1OTEyX0RDREMyX0NUUkwJCTB4MDEKKyNkZWZpbmUgVFBTNjU5MTJfRENEQzNfQ1RSTAkJMHgwMgorI2RlZmluZSBUUFM2NTkxMl9EQ0RDNF9DVFJMCQkweDAzCisjZGVmaW5lIFRQUzY1OTEyX0RDREMxX09QCQkweDA0CisjZGVmaW5lIFRQUzY1OTEyX0RDREMxX0FWUwkJMHgwNQorI2RlZmluZSBUUFM2NTkxMl9EQ0RDMV9MSU1JVAkJMHgwNgorI2RlZmluZSBUUFM2NTkxMl9EQ0RDMl9PUAkJMHgwNworI2RlZmluZSBUUFM2NTkxMl9EQ0RDMl9BVlMJCTB4MDgKKyNkZWZpbmUgVFBTNjU5MTJfRENEQzJfTElNSVQJCTB4MDkKKyNkZWZpbmUgVFBTNjU5MTJfRENEQzNfT1AJCTB4MEEKKyNkZWZpbmUgVFBTNjU5MTJfRENEQzNfQVZTCQkweDBCCisjZGVmaW5lIFRQUzY1OTEyX0RDREMzX0xJTUlUCQkweDBDCisjZGVmaW5lIFRQUzY1OTEyX0RDREM0X09QCQkweDBECisjZGVmaW5lIFRQUzY1OTEyX0RDREM0X0FWUwkJMHgwRQorI2RlZmluZSBUUFM2NTkxMl9EQ0RDNF9MSU1JVAkJMHgwRgorI2RlZmluZSBUUFM2NTkxMl9MRE8xX09QCQkweDEwCisjZGVmaW5lIFRQUzY1OTEyX0xETzFfQVZTCQkweDExCisjZGVmaW5lIFRQUzY1OTEyX0xETzFfTElNSVQJCTB4MTIKKyNkZWZpbmUgVFBTNjU5MTJfTERPMl9PUAkJMHgxMworI2RlZmluZSBUUFM2NTkxMl9MRE8yX0FWUwkJMHgxNAorI2RlZmluZSBUUFM2NTkxMl9MRE8yX0xJTUlUCQkweDE1CisjZGVmaW5lIFRQUzY1OTEyX0xETzNfT1AJCTB4MTYKKyNkZWZpbmUgVFBTNjU5MTJfTERPM19BVlMJCTB4MTcKKyNkZWZpbmUgVFBTNjU5MTJfTERPM19MSU1JVAkJMHgxOAorI2RlZmluZSBUUFM2NTkxMl9MRE80X09QCQkweDE5CisjZGVmaW5lIFRQUzY1OTEyX0xETzRfQVZTCQkweDFBCisjZGVmaW5lIFRQUzY1OTEyX0xETzRfTElNSVQJCTB4MUIKKyNkZWZpbmUgVFBTNjU5MTJfTERPNQkJCTB4MUMKKyNkZWZpbmUgVFBTNjU5MTJfTERPNgkJCTB4MUQKKyNkZWZpbmUgVFBTNjU5MTJfTERPNwkJCTB4MUUKKyNkZWZpbmUgVFBTNjU5MTJfTERPOAkJCTB4MUYKKyNkZWZpbmUgVFBTNjU5MTJfTERPOQkJCTB4MjAKKyNkZWZpbmUgVFBTNjU5MTJfTERPMTAJCQkweDIxCisjZGVmaW5lIFRQUzY1OTEyX1RIUk0JCQkweDIyCisjZGVmaW5lIFRQUzY1OTEyX0NMSzMyT1VUCQkweDIzCisjZGVmaW5lIFRQUzY1OTEyX0RFVkNUUkwJCTB4MjQKKyNkZWZpbmUgVFBTNjU5MTJfREVWQ1RSTDIJCTB4MjUKKyNkZWZpbmUgVFBTNjU5MTJfSTJDX1NQSV9DRkcJCTB4MjYKKyNkZWZpbmUgVFBTNjU5MTJfS0VFUF9PTgkJMHgyNworI2RlZmluZSBUUFM2NTkxMl9LRUVQX09OMgkJMHgyOAorI2RlZmluZSBUUFM2NTkxMl9TRVRfT0ZGMQkJMHgyOQorI2RlZmluZSBUUFM2NTkxMl9TRVRfT0ZGMgkJMHgyQQorI2RlZmluZSBUUFM2NTkxMl9ERUZfVk9MVAkJMHgyQgorI2RlZmluZSBUUFM2NTkxMl9ERUZfVk9MVF9NQVBQSU5HCTB4MkMKKyNkZWZpbmUgVFBTNjU5MTJfRElTQ0hBUkdFCQkweDJECisjZGVmaW5lIFRQUzY1OTEyX0RJU0NIQVJHRTIJCTB4MkUKKyNkZWZpbmUgVFBTNjU5MTJfRU4xX1NFVDEJCTB4MkYKKyNkZWZpbmUgVFBTNjU5MTJfRU4xX1NFVDIJCTB4MzAKKyNkZWZpbmUgVFBTNjU5MTJfRU4yX1NFVDEJCTB4MzEKKyNkZWZpbmUgVFBTNjU5MTJfRU4yX1NFVDIJCTB4MzIKKyNkZWZpbmUgVFBTNjU5MTJfRU4zX1NFVDEJCTB4MzMKKyNkZWZpbmUgVFBTNjU5MTJfRU4zX1NFVDIJCTB4MzQKKyNkZWZpbmUgVFBTNjU5MTJfRU40X1NFVDEJCTB4MzUKKyNkZWZpbmUgVFBTNjU5MTJfRU40X1NFVDIJCTB4MzYKKyNkZWZpbmUgVFBTNjU5MTJfUEdPT0QJCQkweDM3CisjZGVmaW5lIFRQUzY1OTEyX1BHT09EMgkJCTB4MzgKKyNkZWZpbmUgVFBTNjU5MTJfSU5UX1NUUwkJMHgzOQorI2RlZmluZSBUUFM2NTkxMl9JTlRfTVNLCQkweDNBCisjZGVmaW5lIFRQUzY1OTEyX0lOVF9TVFMyCQkweDNCCisjZGVmaW5lIFRQUzY1OTEyX0lOVF9NU0syCQkweDNDCisjZGVmaW5lIFRQUzY1OTEyX0lOVF9TVFMzCQkweDNECisjZGVmaW5lIFRQUzY1OTEyX0lOVF9NU0szCQkweDNFCisjZGVmaW5lIFRQUzY1OTEyX0lOVF9TVFM0CQkweDNGCisjZGVmaW5lIFRQUzY1OTEyX0lOVF9NU0s0CQkweDQwCisjZGVmaW5lIFRQUzY1OTEyX0dQSU8xCQkJMHg0MQorI2RlZmluZSBUUFM2NTkxMl9HUElPMgkJCTB4NDIKKyNkZWZpbmUgVFBTNjU5MTJfR1BJTzMJCQkweDQzCisjZGVmaW5lIFRQUzY1OTEyX0dQSU80CQkJMHg0NAorI2RlZmluZSBUUFM2NTkxMl9HUElPNQkJCTB4NDUKKyNkZWZpbmUgVFBTNjU5MTJfVk1PTgkJCTB4NDYKKyNkZWZpbmUgVFBTNjU5MTJfTEVEQV9DVFJMMQkJMHg0NworI2RlZmluZSBUUFM2NTkxMl9MRURBX0NUUkwyCQkweDQ4CisjZGVmaW5lIFRQUzY1OTEyX0xFREFfQ1RSTDMJCTB4NDkKKyNkZWZpbmUgVFBTNjU5MTJfTEVEQV9DVFJMNAkJMHg0QQorI2RlZmluZSBUUFM2NTkxMl9MRURBX0NUUkw1CQkweDRCCisjZGVmaW5lIFRQUzY1OTEyX0xFREFfQ1RSTDYJCTB4NEMKKyNkZWZpbmUgVFBTNjU5MTJfTEVEQV9DVFJMNwkJMHg0RAorI2RlZmluZSBUUFM2NTkxMl9MRURBX0NUUkw4CQkweDRFCisjZGVmaW5lIFRQUzY1OTEyX0xFREJfQ1RSTDEJCTB4NEYKKyNkZWZpbmUgVFBTNjU5MTJfTEVEQl9DVFJMMgkJMHg1MAorI2RlZmluZSBUUFM2NTkxMl9MRURCX0NUUkwzCQkweDUxCisjZGVmaW5lIFRQUzY1OTEyX0xFREJfQ1RSTDQJCTB4NTIKKyNkZWZpbmUgVFBTNjU5MTJfTEVEQl9DVFJMNQkJMHg1MworI2RlZmluZSBUUFM2NTkxMl9MRURCX0NUUkw2CQkweDU0CisjZGVmaW5lIFRQUzY1OTEyX0xFREJfQ1RSTDcJCTB4NTUKKyNkZWZpbmUgVFBTNjU5MTJfTEVEQl9DVFJMOAkJMHg1NgorI2RlZmluZSBUUFM2NTkxMl9MRURDX0NUUkwxCQkweDU3CisjZGVmaW5lIFRQUzY1OTEyX0xFRENfQ1RSTDIJCTB4NTgKKyNkZWZpbmUgVFBTNjU5MTJfTEVEQ19DVFJMMwkJMHg1OQorI2RlZmluZSBUUFM2NTkxMl9MRURDX0NUUkw0CQkweDVBCisjZGVmaW5lIFRQUzY1OTEyX0xFRENfQ1RSTDUJCTB4NUIKKyNkZWZpbmUgVFBTNjU5MTJfTEVEQ19DVFJMNgkJMHg1QworI2RlZmluZSBUUFM2NTkxMl9MRURDX0NUUkw3CQkweDVECisjZGVmaW5lIFRQUzY1OTEyX0xFRENfQ1RSTDgJCTB4NUUKKyNkZWZpbmUgVFBTNjU5MTJfTEVEX1JBTVBfVVBfVElNRQkweDVGCisjZGVmaW5lIFRQUzY1OTEyX0xFRF9SQU1QX0RPV05fVElNRQkweDYwCisjZGVmaW5lIFRQUzY1OTEyX0xFRF9TRVFfRU4JCTB4NjEKKyNkZWZpbmUgVFBTNjU5MTJfTE9BRFNXSVRDSAkJMHg2MgorI2RlZmluZSBUUFM2NTkxMl9TUEFSRQkJCTB4NjMKKyNkZWZpbmUgVFBTNjU5MTJfVkVSTlVNCQkJMHg2NAorI2RlZmluZSBUUFM2NTkxWF9NQVhfUkVHSVNURVIJCTB4NjQKKworLyogSVJRIERlZmluaXRpb25zICovCisjZGVmaW5lIFRQUzY1OTEyX0lSUV9QV1JIT0xEX0YJCTAKKyNkZWZpbmUgVFBTNjU5MTJfSVJRX1ZNT04JCTEKKyNkZWZpbmUgVFBTNjU5MTJfSVJRX1BXUk9OCQkyCisjZGVmaW5lIFRQUzY1OTEyX0lSUV9QV1JPTl9MUAkJMworI2RlZmluZSBUUFM2NTkxMl9JUlFfUFdSSE9MRF9SCQk0CisjZGVmaW5lIFRQUzY1OTEyX0lSUV9IT1RESUUJCTUKKyNkZWZpbmUgVFBTNjU5MTJfSVJRX0dQSU8xX1IJCTYKKyNkZWZpbmUgVFBTNjU5MTJfSVJRX0dQSU8xX0YJCTcKKyNkZWZpbmUgVFBTNjU5MTJfSVJRX0dQSU8yX1IJCTgKKyNkZWZpbmUgVFBTNjU5MTJfSVJRX0dQSU8yX0YJCTkKKyNkZWZpbmUgVFBTNjU5MTJfSVJRX0dQSU8zX1IJCTEwCisjZGVmaW5lIFRQUzY1OTEyX0lSUV9HUElPM19GCQkxMQorI2RlZmluZSBUUFM2NTkxMl9JUlFfR1BJTzRfUgkJMTIKKyNkZWZpbmUgVFBTNjU5MTJfSVJRX0dQSU80X0YJCTEzCisjZGVmaW5lIFRQUzY1OTEyX0lSUV9HUElPNV9SCQkxNAorI2RlZmluZSBUUFM2NTkxMl9JUlFfR1BJTzVfRgkJMTUKKyNkZWZpbmUgVFBTNjU5MTJfSVJRX1BHT09EX0RDREMxCTE2CisjZGVmaW5lIFRQUzY1OTEyX0lSUV9QR09PRF9EQ0RDMgkxNworI2RlZmluZSBUUFM2NTkxMl9JUlFfUEdPT0RfRENEQzMJMTgKKyNkZWZpbmUgVFBTNjU5MTJfSVJRX1BHT09EX0RDREM0CTE5CisjZGVmaW5lIFRQUzY1OTEyX0lSUV9QR09PRF9MRE8xCQkyMAorI2RlZmluZSBUUFM2NTkxMl9JUlFfUEdPT0RfTERPMgkJMjEKKyNkZWZpbmUgVFBTNjU5MTJfSVJRX1BHT09EX0xETzMJCTIyCisjZGVmaW5lIFRQUzY1OTEyX0lSUV9QR09PRF9MRE80CQkyMworI2RlZmluZSBUUFM2NTkxMl9JUlFfUEdPT0RfTERPNQkJMjQKKyNkZWZpbmUgVFBTNjU5MTJfSVJRX1BHT09EX0xETzYJCTI1CisjZGVmaW5lIFRQUzY1OTEyX0lSUV9QR09PRF9MRE83CQkyNgorI2RlZmluZSBUUFM2NTkxMl9JUlFfUEdPT0RfTEQwOAkJMjcKKyNkZWZpbmUgVFBTNjU5MTJfSVJRX1BHT09EX0xETzkJCTI4CisjZGVmaW5lIFRQUzY1OTEyX0lSUV9QR09PRF9MRE8xMAkyOQorCisjZGVmaW5lIFRQUzY1OTEyX05VTV9JUlEJCTMwCisKKy8qIEdQSU8gMSBhbmQgMiBSZWdpc3RlciBEZWZpbml0aW9ucyAqLworI2RlZmluZSBHUElPX1NMRUVQX01BU0sJCQkweDgwCisjZGVmaW5lIEdQSU9fU0xFRVBfU0hJRlQJCTcKKyNkZWZpbmUgR1BJT19ERUJfTUFTSwkJCTB4MTAKKyNkZWZpbmUgR1BJT19ERUJfU0hJRlQJCQk0CisjZGVmaW5lIEdQSU9fQ0ZHX01BU0sJCQkweDA0CisjZGVmaW5lIEdQSU9fQ0ZHX1NISUZUCQkJMgorI2RlZmluZSBHUElPX1NUU19NQVNLCQkJMHgwMgorI2RlZmluZSBHUElPX1NUU19TSElGVAkJCTEKKyNkZWZpbmUgR1BJT19TRVRfTUFTSwkJCTB4MDEKKyNkZWZpbmUgR1BJT19TRVRfU0hJRlQJCQkwCisKKy8qIEdQSU8gMyBSZWdpc3RlciBEZWZpbml0aW9ucyAqLworI2RlZmluZSBHUElPM19TTEVFUF9NQVNLCQkweDgwCisjZGVmaW5lIEdQSU8zX1NMRUVQX1NISUZUCQk3CisjZGVmaW5lIEdQSU8zX1NFTF9NQVNLCQkJMHg0MAorI2RlZmluZSBHUElPM19TRUxfU0hJRlQJCQk2CisjZGVmaW5lIEdQSU8zX09ERU5fTUFTSwkJCTB4MjAKKyNkZWZpbmUgR1BJTzNfT0RFTl9TSElGVAkJNQorI2RlZmluZSBHUElPM19ERUJfTUFTSwkJCTB4MTAKKyNkZWZpbmUgR1BJTzNfREVCX1NISUZUCQkJNAorI2RlZmluZSBHUElPM19QREVOX01BU0sJCQkweDA4CisjZGVmaW5lIEdQSU8zX1BERU5fU0hJRlQJCTMKKyNkZWZpbmUgR1BJTzNfQ0ZHX01BU0sJCQkweDA0CisjZGVmaW5lIEdQSU8zX0NGR19TSElGVAkJCTIKKyNkZWZpbmUgR1BJTzNfU1RTX01BU0sJCQkweDAyCisjZGVmaW5lIEdQSU8zX1NUU19TSElGVAkJCTEKKyNkZWZpbmUgR1BJTzNfU0VUX01BU0sJCQkweDAxCisjZGVmaW5lIEdQSU8zX1NFVF9TSElGVAkJCTAKKworLyogR1BJTyA0IFJlZ2lzdGVyIERlZmluaXRpb25zICovCisjZGVmaW5lIEdQSU80X1NMRUVQX01BU0sJCTB4ODAKKyNkZWZpbmUgR1BJTzRfU0xFRVBfU0hJRlQJCTcKKyNkZWZpbmUgR1BJTzRfU0VMX01BU0sJCQkweDQwCisjZGVmaW5lIEdQSU80X1NFTF9TSElGVAkJCTYKKyNkZWZpbmUgR1BJTzRfT0RFTl9NQVNLCQkJMHgyMAorI2RlZmluZSBHUElPNF9PREVOX1NISUZUCQk1CisjZGVmaW5lIEdQSU80X0RFQl9NQVNLCQkJMHgxMAorI2RlZmluZSBHUElPNF9ERUJfU0hJRlQJCQk0CisjZGVmaW5lIEdQSU80X1BERU5fTUFTSwkJCTB4MDgKKyNkZWZpbmUgR1BJTzRfUERFTl9TSElGVAkJMworI2RlZmluZSBHUElPNF9DRkdfTUFTSwkJCTB4MDQKKyNkZWZpbmUgR1BJTzRfQ0ZHX1NISUZUCQkJMgorI2RlZmluZSBHUElPNF9TVFNfTUFTSwkJCTB4MDIKKyNkZWZpbmUgR1BJTzRfU1RTX1NISUZUCQkJMQorI2RlZmluZSBHUElPNF9TRVRfTUFTSwkJCTB4MDEKKyNkZWZpbmUgR1BJTzRfU0VUX1NISUZUCQkJMAorCisvKiBSZWdpc3RlciBUSEVSTSAgKDB4ODApIHJlZ2lzdGVyLlJlZ2lzdGVyRGVzY3JpcHRpb24gKi8KKyNkZWZpbmUgVEhFUk1fVEhFUk1fSERfTUFTSwkJMHgyMAorI2RlZmluZSBUSEVSTV9USEVSTV9IRF9TSElGVAkJNQorI2RlZmluZSBUSEVSTV9USEVSTV9UU19NQVNLCQkweDEwCisjZGVmaW5lIFRIRVJNX1RIRVJNX1RTX1NISUZUCQk0CisjZGVmaW5lIFRIRVJNX1RIRVJNX0hEU0VMX01BU0sJCTB4MEMKKyNkZWZpbmUgVEhFUk1fVEhFUk1fSERTRUxfU0hJRlQJCTIKKyNkZWZpbmUgVEhFUk1fUlNWRDFfTUFTSwkJMHgwMgorI2RlZmluZSBUSEVSTV9SU1ZEMV9TSElGVAkJMQorI2RlZmluZSBUSEVSTV9USEVSTV9TVEFURV9NQVNLCQkweDAxCisjZGVmaW5lIFRIRVJNX1RIRVJNX1NUQVRFX1NISUZUCQkwCisKKy8qIFJlZ2lzdGVyIERDRENDVFJMMSByZWdpc3Rlci5SZWdpc3RlckRlc2NyaXB0aW9uICovCisjZGVmaW5lIERDRENDVFJMX1ZDT05fRU5BQkxFX01BU0sJMHg4MAorI2RlZmluZSBEQ0RDQ1RSTF9WQ09OX0VOQUJMRV9TSElGVAk3CisjZGVmaW5lIERDRENDVFJMX1ZDT05fUkFOR0UxX01BU0sJMHg0MAorI2RlZmluZSBEQ0RDQ1RSTF9WQ09OX1JBTkdFMV9TSElGVAk2CisjZGVmaW5lIERDRENDVFJMX1ZDT05fUkFOR0UwX01BU0sJMHgyMAorI2RlZmluZSBEQ0RDQ1RSTF9WQ09OX1JBTkdFMF9TSElGVAk1CisjZGVmaW5lIERDRENDVFJMX1RTVEVQMl9NQVNLCQkweDEwCisjZGVmaW5lIERDRENDVFJMX1RTVEVQMl9TSElGVAkJNAorI2RlZmluZSBEQ0RDQ1RSTF9UU1RFUDFfTUFTSwkJMHgwOAorI2RlZmluZSBEQ0RDQ1RSTF9UU1RFUDFfU0hJRlQJCTMKKyNkZWZpbmUgRENEQ0NUUkxfVFNURVAwX01BU0sJCTB4MDQKKyNkZWZpbmUgRENEQ0NUUkxfVFNURVAwX1NISUZUCQkyCisjZGVmaW5lIERDRENDVFJMX0RDREMxX01PREVfTUFTSwkweDAyCisjZGVmaW5lIERDRENDVFJMX0RDREMxX01PREVfU0hJRlQJMQorCisvKiBSZWdpc3RlciBEQ0RDQ1RSTDIgYW5kIERDRENDVFJMMyByZWdpc3Rlci5SZWdpc3RlckRlc2NyaXB0aW9uICovCisjZGVmaW5lIERDRENDVFJMX1RTVEVQMl9NQVNLCQkweDEwCisjZGVmaW5lIERDRENDVFJMX1RTVEVQMl9TSElGVAkJNAorI2RlZmluZSBEQ0RDQ1RSTF9UU1RFUDFfTUFTSwkJMHgwOAorI2RlZmluZSBEQ0RDQ1RSTF9UU1RFUDFfU0hJRlQJCTMKKyNkZWZpbmUgRENEQ0NUUkxfVFNURVAwX01BU0sJCTB4MDQKKyNkZWZpbmUgRENEQ0NUUkxfVFNURVAwX1NISUZUCQkyCisjZGVmaW5lIERDRENDVFJMX0RDRENfTU9ERV9NQVNLCQkweDAyCisjZGVmaW5lIERDRENDVFJMX0RDRENfTU9ERV9TSElGVAkxCisjZGVmaW5lIERDRENDVFJMX1JTVkQwX01BU0sJCTB4MDEKKyNkZWZpbmUgRENEQ0NUUkxfUlNWRDBfU0hJRlQJCTAKKworLyogUmVnaXN0ZXIgRENEQ0NUUkw0IHJlZ2lzdGVyLlJlZ2lzdGVyRGVzY3JpcHRpb24gKi8KKyNkZWZpbmUgRENEQ0NUUkxfUkFNUF9USU1FX01BU0sJCTB4MDEKKyNkZWZpbmUgRENEQ0NUUkxfUkFNUF9USU1FX1NISUZUCTAKKworLyogUmVnaXN0ZXIgRENEQ3hfQVZTICovCisjZGVmaW5lIERDRENfQVZTX0VOQUJMRV9NQVNLCQkweDgwCisjZGVmaW5lIERDRENfQVZTX0VOQUJMRV9TSElGVAkJNworI2RlZmluZSBEQ0RDX0FWU19FQ09fTUFTSwkJMHg0MAorI2RlZmluZSBEQ0RDX0FWU19FQ09fU0hJRlQJCTYKKworLyogUmVnaXN0ZXIgRENEQ3hfTElNSVQgKi8KKyNkZWZpbmUgRENEQ19MSU1JVF9SQU5HRV9NQVNLCQkweEMwCisjZGVmaW5lIERDRENfTElNSVRfUkFOR0VfU0hJRlQJCTYKKyNkZWZpbmUgRENEQ19MSU1JVF9NQVhfU0VMX01BU0sJCTB4M0YKKyNkZWZpbmUgRENEQ19MSU1JVF9NQVhfU0VMX1NISUZUCTAKKworLyoqCisgKiBzdHJ1Y3QgdHBzNjU5MTJfYm9hcmQKKyAqIEJvYXJkIHBsYXRmb3JtIGRhdCBtYXkgYmUgdXNlZCB0byBpbml0aWFsaXplIHJlZ3VsYXRvcnMuCisgKi8KK3N0cnVjdCB0cHM2NTkxMl9ib2FyZCB7CisJaW50IGlzX2RjZGMxX2F2czsKKwlpbnQgaXNfZGNkYzJfYXZzOworCWludCBpc19kY2RjM19hdnM7CisJaW50IGlzX2RjZGM0X2F2czsKKwlpbnQgaXJxOworCWludCBpcnFfYmFzZTsKKwlpbnQgZ3Bpb19iYXNlOworCXN0cnVjdCByZWd1bGF0b3JfaW5pdF9kYXRhICp0cHM2NTkxMl9wbWljX2luaXRfZGF0YTsKK307CisKKy8qKgorICogc3RydWN0IHRwczY1OTEyIC0gdHBzNjU5MTIgc3ViLWRyaXZlciBjaGlwIGFjY2VzcyByb3V0aW5lcworICovCisKK3N0cnVjdCB0cHM2NTkxMiB7CisJc3RydWN0IGRldmljZSAqZGV2OworCS8qIGZvciByZWFkL3dyaXRlIGFjY2VzICovCisJc3RydWN0IG11dGV4IGlvX211dGV4OworCisJLyogRm9yIGRldmljZSBJTyBpbnRlcmZhY2VzOiBJMkMgb3IgU1BJICovCisJdm9pZCAqY29udHJvbF9kYXRhOworCisJaW50ICgqcmVhZCkoc3RydWN0IHRwczY1OTEyICp0cHM2NTkxMiwgdTggcmVnLCBpbnQgc2l6ZSwgdm9pZCAqZGVzdCk7CisJaW50ICgqd3JpdGUpKHN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTIsIHU4IHJlZywgaW50IHNpemUsIHZvaWQgKnNyYyk7CisKKwkvKiBDbGllbnQgZGV2aWNlcyAqLworCXN0cnVjdCB0cHM2NTkxMl9wbWljICpwbWljOworCisJLyogR1BJTyBIYW5kbGluZyAqLworCXN0cnVjdCBncGlvX2NoaXAgZ3BpbzsKKworCS8qIElSUSBIYW5kbGluZyAqLworCXN0cnVjdCBtdXRleCBpcnFfbG9jazsKKwlpbnQgY2hpcF9pcnE7CisJaW50IGlycV9iYXNlOworCWludCBpcnFfbnVtOworCXUzMiBpcnFfbWFzazsKK307CisKK3N0cnVjdCB0cHM2NTkxMl9wbGF0Zm9ybV9kYXRhIHsKKwlpbnQgaXJxOworCWludCBpcnFfYmFzZTsKK307CisKK3Vuc2lnbmVkIGludCB0cHNfY2hpcCh2b2lkKTsKKworaW50IHRwczY1OTEyX3NldF9iaXRzKHN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTIsIHU4IHJlZywgdTggbWFzayk7CitpbnQgdHBzNjU5MTJfY2xlYXJfYml0cyhzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyLCB1OCByZWcsIHU4IG1hc2spOworaW50IHRwczY1OTEyX3JlZ19yZWFkKHN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTIsIHU4IHJlZyk7CitpbnQgdHBzNjU5MTJfcmVnX3dyaXRlKHN0cnVjdCB0cHM2NTkxMiAqdHBzNjU5MTIsIHU4IHJlZywgdTggdmFsKTsKK2ludCB0cHM2NTkxMl9kZXZpY2VfaW5pdChzdHJ1Y3QgdHBzNjU5MTIgKnRwczY1OTEyKTsKK3ZvaWQgdHBzNjU5MTJfZGV2aWNlX2V4aXQoc3RydWN0IHRwczY1OTEyICp0cHM2NTkxMik7CitpbnQgdHBzNjU5MTJfaXJxX2luaXQoc3RydWN0IHRwczY1OTEyICp0cHM2NTkxMiwgaW50IGlycSwKKwkJCXN0cnVjdCB0cHM2NTkxMl9wbGF0Zm9ybV9kYXRhICpwZGF0YSk7CisKKyNlbmRpZiAvKiAgX19MSU5VWF9NRkRfVFBTNjU5MTJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZmQvd204MzF4L2NvcmUuaCBiL2luY2x1ZGUvbGludXgvbWZkL3dtODMxeC9jb3JlLmgKaW5kZXggMGQ1MTVlZS4uOGRkYThkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZmQvd204MzF4L2NvcmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21mZC93bTgzMXgvY29yZS5oCkBAIC0xNyw2ICsxNyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogCiAvKgogICogUmVnaXN0ZXIgdmFsdWVzLgpAQCAtMjM0LDkgKzIzNSwxMTEgQEAKICNkZWZpbmUgV004MzFYX09OX1BJTl9UT19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMCAgLyogT05fUElOX1RPIC0gWzE6MF0gKi8KICNkZWZpbmUgV004MzFYX09OX1BJTl9UT19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMiAgLyogT05fUElOX1RPIC0gWzE6MF0gKi8KIAorLyoKKyAqIFIxNjUyOCAoMHg0MDkwKSAtIENsb2NrIENvbnRyb2wgMQorICovCisjZGVmaW5lIFdNODMxWF9DTEtPVVRfRU5BICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIENMS09VVF9FTkEgKi8KKyNkZWZpbmUgV004MzFYX0NMS09VVF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgIDB4ODAwMCAgLyogQ0xLT1VUX0VOQSAqLworI2RlZmluZSBXTTgzMVhfQ0xLT1VUX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDE1ICAvKiBDTEtPVVRfRU5BICovCisjZGVmaW5lIFdNODMxWF9DTEtPVVRfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIENMS09VVF9FTkEgKi8KKyNkZWZpbmUgV004MzFYX0NMS09VVF9PRCAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMCAgLyogQ0xLT1VUX09EICovCisjZGVmaW5lIFdNODMxWF9DTEtPVVRfT0RfTUFTSyAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIENMS09VVF9PRCAqLworI2RlZmluZSBXTTgzMVhfQ0xLT1VUX09EX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDEzICAvKiBDTEtPVVRfT0QgKi8KKyNkZWZpbmUgV004MzFYX0NMS09VVF9PRF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgMSAgLyogQ0xLT1VUX09EICovCisjZGVmaW5lIFdNODMxWF9DTEtPVVRfU0xPVF9NQVNLICAgICAgICAgICAgICAgICAweDA3MDAgIC8qIENMS09VVF9TTE9UIC0gWzEwOjhdICovCisjZGVmaW5lIFdNODMxWF9DTEtPVVRfU0xPVF9TSElGVCAgICAgICAgICAgICAgICAgICAgIDggIC8qIENMS09VVF9TTE9UIC0gWzEwOjhdICovCisjZGVmaW5lIFdNODMxWF9DTEtPVVRfU0xPVF9XSURUSCAgICAgICAgICAgICAgICAgICAgIDMgIC8qIENMS09VVF9TTE9UIC0gWzEwOjhdICovCisjZGVmaW5lIFdNODMxWF9DTEtPVVRfU0xQU0xPVF9NQVNLICAgICAgICAgICAgICAweDAwNzAgIC8qIENMS09VVF9TTFBTTE9UIC0gWzY6NF0gKi8KKyNkZWZpbmUgV004MzFYX0NMS09VVF9TTFBTTE9UX1NISUZUICAgICAgICAgICAgICAgICAgNCAgLyogQ0xLT1VUX1NMUFNMT1QgLSBbNjo0XSAqLworI2RlZmluZSBXTTgzMVhfQ0xLT1VUX1NMUFNMT1RfV0lEVEggICAgICAgICAgICAgICAgICAzICAvKiBDTEtPVVRfU0xQU0xPVCAtIFs2OjRdICovCisjZGVmaW5lIFdNODMxWF9DTEtPVVRfU1JDICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIENMS09VVF9TUkMgKi8KKyNkZWZpbmUgV004MzFYX0NMS09VVF9TUkNfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogQ0xLT1VUX1NSQyAqLworI2RlZmluZSBXTTgzMVhfQ0xLT1VUX1NSQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAwICAvKiBDTEtPVVRfU1JDICovCisjZGVmaW5lIFdNODMxWF9DTEtPVVRfU1JDX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIENMS09VVF9TUkMgKi8KKworLyoKKyAqIFIxNjUyOSAoMHg0MDkxKSAtIENsb2NrIENvbnRyb2wgMgorICovCisjZGVmaW5lIFdNODMxWF9YVEFMX0lOSCAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIFhUQUxfSU5IICovCisjZGVmaW5lIFdNODMxWF9YVEFMX0lOSF9NQVNLICAgICAgICAgICAgICAgICAgICAweDgwMDAgIC8qIFhUQUxfSU5IICovCisjZGVmaW5lIFdNODMxWF9YVEFMX0lOSF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTUgIC8qIFhUQUxfSU5IICovCisjZGVmaW5lIFdNODMxWF9YVEFMX0lOSF9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFhUQUxfSU5IICovCisjZGVmaW5lIFdNODMxWF9YVEFMX0VOQSAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIFhUQUxfRU5BICovCisjZGVmaW5lIFdNODMxWF9YVEFMX0VOQV9NQVNLICAgICAgICAgICAgICAgICAgICAweDIwMDAgIC8qIFhUQUxfRU5BICovCisjZGVmaW5lIFdNODMxWF9YVEFMX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgMTMgIC8qIFhUQUxfRU5BICovCisjZGVmaW5lIFdNODMxWF9YVEFMX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIFhUQUxfRU5BICovCisjZGVmaW5lIFdNODMxWF9YVEFMX0JLVVBFTkEgICAgICAgICAgICAgICAgICAgICAweDEwMDAgIC8qIFhUQUxfQktVUEVOQSAqLworI2RlZmluZSBXTTgzMVhfWFRBTF9CS1VQRU5BX01BU0sgICAgICAgICAgICAgICAgMHgxMDAwICAvKiBYVEFMX0JLVVBFTkEgKi8KKyNkZWZpbmUgV004MzFYX1hUQUxfQktVUEVOQV9TSElGVCAgICAgICAgICAgICAgICAgICAxMiAgLyogWFRBTF9CS1VQRU5BICovCisjZGVmaW5lIFdNODMxWF9YVEFMX0JLVVBFTkFfV0lEVEggICAgICAgICAgICAgICAgICAgIDEgIC8qIFhUQUxfQktVUEVOQSAqLworI2RlZmluZSBXTTgzMVhfRkxMX0FVVE8gICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBGTExfQVVUTyAqLworI2RlZmluZSBXTTgzMVhfRkxMX0FVVE9fTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDgwICAvKiBGTExfQVVUTyAqLworI2RlZmluZSBXTTgzMVhfRkxMX0FVVE9fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICA3ICAvKiBGTExfQVVUTyAqLworI2RlZmluZSBXTTgzMVhfRkxMX0FVVE9fV0lEVEggICAgICAgICAgICAgICAgICAgICAgICAxICAvKiBGTExfQVVUTyAqLworI2RlZmluZSBXTTgzMVhfRkxMX0FVVE9fRlJFUV9NQVNLICAgICAgICAgICAgICAgMHgwMDA3ICAvKiBGTExfQVVUT19GUkVRIC0gWzI6MF0gKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9BVVRPX0ZSRVFfU0hJRlQgICAgICAgICAgICAgICAgICAgMCAgLyogRkxMX0FVVE9fRlJFUSAtIFsyOjBdICovCisjZGVmaW5lIFdNODMxWF9GTExfQVVUT19GUkVRX1dJRFRIICAgICAgICAgICAgICAgICAgIDMgIC8qIEZMTF9BVVRPX0ZSRVEgLSBbMjowXSAqLworCisvKgorICogUjE2NTMwICgweDQwOTIpIC0gRkxMIENvbnRyb2wgMQorICovCisjZGVmaW5lIFdNODMxWF9GTExfRlJBQyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEZMTF9GUkFDICovCisjZGVmaW5lIFdNODMxWF9GTExfRlJBQ19NQVNLICAgICAgICAgICAgICAgICAgICAweDAwMDQgIC8qIEZMTF9GUkFDICovCisjZGVmaW5lIFdNODMxWF9GTExfRlJBQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDIgIC8qIEZMTF9GUkFDICovCisjZGVmaW5lIFdNODMxWF9GTExfRlJBQ19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEZMTF9GUkFDICovCisjZGVmaW5lIFdNODMxWF9GTExfT1NDX0VOQSAgICAgICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEZMTF9PU0NfRU5BICovCisjZGVmaW5lIFdNODMxWF9GTExfT1NDX0VOQV9NQVNLICAgICAgICAgICAgICAgICAweDAwMDIgIC8qIEZMTF9PU0NfRU5BICovCisjZGVmaW5lIFdNODMxWF9GTExfT1NDX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEZMTF9PU0NfRU5BICovCisjZGVmaW5lIFdNODMxWF9GTExfT1NDX0VOQV9XSURUSCAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEZMTF9PU0NfRU5BICovCisjZGVmaW5lIFdNODMxWF9GTExfRU5BICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEgIC8qIEZMTF9FTkEgKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9FTkFfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMSAgLyogRkxMX0VOQSAqLworI2RlZmluZSBXTTgzMVhfRkxMX0VOQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBGTExfRU5BICovCisjZGVmaW5lIFdNODMxWF9GTExfRU5BX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDEgIC8qIEZMTF9FTkEgKi8KKworLyoKKyAqIFIxNjUzMSAoMHg0MDkzKSAtIEZMTCBDb250cm9sIDIKKyAqLworI2RlZmluZSBXTTgzMVhfRkxMX09VVERJVl9NQVNLICAgICAgICAgICAgICAgICAgMHgzRjAwICAvKiBGTExfT1VURElWIC0gWzEzOjhdICovCisjZGVmaW5lIFdNODMxWF9GTExfT1VURElWX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDggIC8qIEZMTF9PVVRESVYgLSBbMTM6OF0gKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9PVVRESVZfV0lEVEggICAgICAgICAgICAgICAgICAgICAgNiAgLyogRkxMX09VVERJViAtIFsxMzo4XSAqLworI2RlZmluZSBXTTgzMVhfRkxMX0NUUkxfUkFURV9NQVNLICAgICAgICAgICAgICAgMHgwMDcwICAvKiBGTExfQ1RSTF9SQVRFIC0gWzY6NF0gKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9DVFJMX1JBVEVfU0hJRlQgICAgICAgICAgICAgICAgICAgNCAgLyogRkxMX0NUUkxfUkFURSAtIFs2OjRdICovCisjZGVmaW5lIFdNODMxWF9GTExfQ1RSTF9SQVRFX1dJRFRIICAgICAgICAgICAgICAgICAgIDMgIC8qIEZMTF9DVFJMX1JBVEUgLSBbNjo0XSAqLworI2RlZmluZSBXTTgzMVhfRkxMX0ZSQVRJT19NQVNLICAgICAgICAgICAgICAgICAgMHgwMDA3ICAvKiBGTExfRlJBVElPIC0gWzI6MF0gKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9GUkFUSU9fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgMCAgLyogRkxMX0ZSQVRJTyAtIFsyOjBdICovCisjZGVmaW5lIFdNODMxWF9GTExfRlJBVElPX1dJRFRIICAgICAgICAgICAgICAgICAgICAgIDMgIC8qIEZMTF9GUkFUSU8gLSBbMjowXSAqLworCisvKgorICogUjE2NTMyICgweDQwOTQpIC0gRkxMIENvbnRyb2wgMworICovCisjZGVmaW5lIFdNODMxWF9GTExfS19NQVNLICAgICAgICAgICAgICAgICAgICAgICAweEZGRkYgIC8qIEZMTF9LIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODMxWF9GTExfS19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEZMTF9LIC0gWzE1OjBdICovCisjZGVmaW5lIFdNODMxWF9GTExfS19XSURUSCAgICAgICAgICAgICAgICAgICAgICAgICAgMTYgIC8qIEZMTF9LIC0gWzE1OjBdICovCisKKy8qCisgKiBSMTY1MzMgKDB4NDA5NSkgLSBGTEwgQ29udHJvbCA0CisgKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9OX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4N0ZFMCAgLyogRkxMX04gLSBbMTQ6NV0gKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9OX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgNSAgLyogRkxMX04gLSBbMTQ6NV0gKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9OX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgICAxMCAgLyogRkxMX04gLSBbMTQ6NV0gKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9HQUlOX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwRiAgLyogRkxMX0dBSU4gLSBbMzowXSAqLworI2RlZmluZSBXTTgzMVhfRkxMX0dBSU5fU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwICAvKiBGTExfR0FJTiAtIFszOjBdICovCisjZGVmaW5lIFdNODMxWF9GTExfR0FJTl9XSURUSCAgICAgICAgICAgICAgICAgICAgICAgIDQgIC8qIEZMTF9HQUlOIC0gWzM6MF0gKi8KKworLyoKKyAqIFIxNjUzNCAoMHg0MDk2KSAtIEZMTCBDb250cm9sIDUKKyAqLworI2RlZmluZSBXTTgzMVhfRkxMX0NMS19SRUZfRElWX01BU0sgICAgICAgICAgICAgMHgwMDE4ICAvKiBGTExfQ0xLX1JFRl9ESVYgLSBbNDozXSAqLworI2RlZmluZSBXTTgzMVhfRkxMX0NMS19SRUZfRElWX1NISUZUICAgICAgICAgICAgICAgICAzICAvKiBGTExfQ0xLX1JFRl9ESVYgLSBbNDozXSAqLworI2RlZmluZSBXTTgzMVhfRkxMX0NMS19SRUZfRElWX1dJRFRIICAgICAgICAgICAgICAgICAyICAvKiBGTExfQ0xLX1JFRl9ESVYgLSBbNDozXSAqLworI2RlZmluZSBXTTgzMVhfRkxMX0NMS19TUkNfTUFTSyAgICAgICAgICAgICAgICAgMHgwMDAzICAvKiBGTExfQ0xLX1NSQyAtIFsxOjBdICovCisjZGVmaW5lIFdNODMxWF9GTExfQ0xLX1NSQ19TSElGVCAgICAgICAgICAgICAgICAgICAgIDAgIC8qIEZMTF9DTEtfU1JDIC0gWzE6MF0gKi8KKyNkZWZpbmUgV004MzFYX0ZMTF9DTEtfU1JDX1dJRFRIICAgICAgICAgICAgICAgICAgICAgMiAgLyogRkxMX0NMS19TUkMgLSBbMTowXSAqLworCiBzdHJ1Y3QgcmVndWxhdG9yX2RldjsKIAogI2RlZmluZSBXTTgzMVhfTlVNX0lSUV9SRUdTIDUKKyNkZWZpbmUgV004MzFYX05VTV9HUElPX1JFR1MgMTYKIAogZW51bSB3bTgzMXhfcGFyZW50IHsKIAlXTTgzMTAgPSAweDgzMTAsCkBAIC0yNDgsNiArMzUxLDEyIEBACiAJV004MzI2ID0gMHg4MzI2LAogfTsKIAorc3RydWN0IHdtODMxeDsKK2VudW0gd204MzF4X2F1eGFkYzsKKwordHlwZWRlZiBpbnQgKCp3bTgzMXhfYXV4YWRjX3JlYWRfZm4pKHN0cnVjdCB3bTgzMXggKndtODMxeCwKKwkJCQkgICAgIGVudW0gd204MzF4X2F1eGFkYyBpbnB1dCk7CisKIHN0cnVjdCB3bTgzMXggewogCXN0cnVjdCBtdXRleCBpb19sb2NrOwogCkBAIC0yNjEsNyArMzcwLDcgQEAKIAogCWludCBpcnE7ICAvKiBPdXIgY2hpcCBJUlEgKi8KIAlzdHJ1Y3QgbXV0ZXggaXJxX2xvY2s7Ci0JdW5zaWduZWQgaW50IGlycV9iYXNlOworCWludCBpcnFfYmFzZTsKIAlpbnQgaXJxX21hc2tzX2N1cltXTTgzMVhfTlVNX0lSUV9SRUdTXTsgICAvKiBDdXJyZW50bHkgYWN0aXZlIHZhbHVlICovCiAJaW50IGlycV9tYXNrc19jYWNoZVtXTTgzMVhfTlVNX0lSUV9SRUdTXTsgLyogQ2FjaGVkIGhhcmR3YXJlIHZhbHVlICovCiAKQEAgLTI3Miw4ICszODEsMTMgQEAKIAogCWludCBudW1fZ3BpbzsKIAorCS8qIFVzZWQgYnkgdGhlIGludGVycnVwdCBjb250cm9sbGVyIGNvZGUgdG8gcG9zdCB3cml0ZXMgKi8KKwlpbnQgZ3Bpb191cGRhdGVbV004MzFYX05VTV9HUElPX1JFR1NdOworCiAJc3RydWN0IG11dGV4IGF1eGFkY19sb2NrOwotCXN0cnVjdCBjb21wbGV0aW9uIGF1eGFkY19kb25lOworCXN0cnVjdCBsaXN0X2hlYWQgYXV4YWRjX3BlbmRpbmc7CisJdTE2IGF1eGFkY19hY3RpdmU7CisJd204MzF4X2F1eGFkY19yZWFkX2ZuIGF1eGFkY19yZWFkOwogCiAJLyogVGhlIFdNODMxeCBoYXMgYSBzZWN1cml0eSBrZXkgYmxvY2tpbmcgYWNjZXNzIHRvIGNlcnRhaW4KIAkgKiByZWdpc3RlcnMuICBUaGUgbXV0ZXggaXMgdGFrZW4gYnkgdGhlIGFjY2Vzc29ycyBmb3IgbG9ja2luZwpAQCAtMzAwLDUgKzQxNCw2IEBACiBpbnQgd204MzF4X2RldmljZV9zdXNwZW5kKHN0cnVjdCB3bTgzMXggKndtODMxeCk7CiBpbnQgd204MzF4X2lycV9pbml0KHN0cnVjdCB3bTgzMXggKndtODMxeCwgaW50IGlycSk7CiB2b2lkIHdtODMxeF9pcnFfZXhpdChzdHJ1Y3Qgd204MzF4ICp3bTgzMXgpOwordm9pZCB3bTgzMXhfYXV4YWRjX2luaXQoc3RydWN0IHdtODMxeCAqd204MzF4KTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21mZC93bTgzMXgvcGRhdGEuaCBiL2luY2x1ZGUvbGludXgvbWZkL3dtODMxeC9wZGF0YS5oCmluZGV4IGZmNDJkNzAuLjBiYTI0NTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWZkL3dtODMxeC9wZGF0YS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWZkL3dtODMxeC9wZGF0YS5oCkBAIC0xMjAsNiArMTIwLDkgQEAKIAkvKiogUHV0IHRoZSAvSVJRIGxpbmUgaW50byBDTU9TIG1vZGUgKi8KIAlib29sIGlycV9jbW9zOwogCisJLyoqIERpc2FibGUgdGhlIHRvdWNoc2NyZWVuICovCisJYm9vbCBkaXNhYmxlX3RvdWNoOworCiAJaW50IGlycV9iYXNlOwogCWludCBncGlvX2Jhc2U7CiAJaW50IGdwaW9fZGVmYXVsdHNbV004MzFYX0dQSU9fTlVNXTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbW0uaCBiL2luY2x1ZGUvbGludXgvbW0uaAppbmRleCAzMTcyYTFjLi5mMjY5MGNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21tLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbS5oCkBAIC0xNjAwLDYgKzE2MDAsNyBAQAogfTsKIGV4dGVybiB2b2lkIG1lbW9yeV9mYWlsdXJlKHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQgdHJhcG5vKTsKIGV4dGVybiBpbnQgX19tZW1vcnlfZmFpbHVyZSh1bnNpZ25lZCBsb25nIHBmbiwgaW50IHRyYXBubywgaW50IGZsYWdzKTsKK2V4dGVybiB2b2lkIG1lbW9yeV9mYWlsdXJlX3F1ZXVlKHVuc2lnbmVkIGxvbmcgcGZuLCBpbnQgdHJhcG5vLCBpbnQgZmxhZ3MpOwogZXh0ZXJuIGludCB1bnBvaXNvbl9tZW1vcnkodW5zaWduZWQgbG9uZyBwZm4pOwogZXh0ZXJuIGludCBzeXNjdGxfbWVtb3J5X2ZhaWx1cmVfZWFybHlfa2lsbDsKIGV4dGVybiBpbnQgc3lzY3RsX21lbW9yeV9mYWlsdXJlX3JlY292ZXJ5OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbV90eXBlcy5oIGIvaW5jbHVkZS9saW51eC9tbV90eXBlcy5oCmluZGV4IDAyNzkzNWMuLjc3NGI4OTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1fdHlwZXMuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tX3R5cGVzLmgKQEAgLTMwLDIzICszMCw2MSBAQAogICogbW9tZW50LiBOb3RlIHRoYXQgd2UgaGF2ZSBubyB3YXkgdG8gdHJhY2sgd2hpY2ggdGFza3MgYXJlIHVzaW5nCiAgKiBhIHBhZ2UsIHRob3VnaCBpZiBpdCBpcyBhIHBhZ2VjYWNoZSBwYWdlLCBybWFwIHN0cnVjdHVyZXMgY2FuIHRlbGwgdXMKICAqIHdobyBpcyBtYXBwaW5nIGl0LgorICoKKyAqIFRoZSBvYmplY3RzIGluIHN0cnVjdCBwYWdlIGFyZSBvcmdhbml6ZWQgaW4gZG91YmxlIHdvcmQgYmxvY2tzIGluCisgKiBvcmRlciB0byBhbGxvd3MgdXMgdG8gdXNlIGF0b21pYyBkb3VibGUgd29yZCBvcGVyYXRpb25zIG9uIHBvcnRpb25zCisgKiBvZiBzdHJ1Y3QgcGFnZS4gVGhhdCBpcyBjdXJyZW50bHkgb25seSB1c2VkIGJ5IHNsdWIgYnV0IHRoZSBhcnJhbmdlbWVudAorICogYWxsb3dzIHRoZSB1c2Ugb2YgYXRvbWljIGRvdWJsZSB3b3JkIG9wZXJhdGlvbnMgb24gdGhlIGZsYWdzL21hcHBpbmcKKyAqIGFuZCBscnUgbGlzdCBwb2ludGVycyBhbHNvLgogICovCiBzdHJ1Y3QgcGFnZSB7CisJLyogRmlyc3QgZG91YmxlIHdvcmQgYmxvY2sgKi8KIAl1bnNpZ25lZCBsb25nIGZsYWdzOwkJLyogQXRvbWljIGZsYWdzLCBzb21lIHBvc3NpYmx5CiAJCQkJCSAqIHVwZGF0ZWQgYXN5bmNocm9ub3VzbHkgKi8KLQlhdG9taWNfdCBfY291bnQ7CQkvKiBVc2FnZSBjb3VudCwgc2VlIGJlbG93LiAqLwotCXVuaW9uIHsKLQkJYXRvbWljX3QgX21hcGNvdW50OwkvKiBDb3VudCBvZiBwdGVzIG1hcHBlZCBpbiBtbXMsCi0JCQkJCSAqIHRvIHNob3cgd2hlbiBwYWdlIGlzIG1hcHBlZAotCQkJCQkgKiAmIGxpbWl0IHJldmVyc2UgbWFwIHNlYXJjaGVzLgorCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOwkvKiBJZiBsb3cgYml0IGNsZWFyLCBwb2ludHMgdG8KKwkJCQkJICogaW5vZGUgYWRkcmVzc19zcGFjZSwgb3IgTlVMTC4KKwkJCQkJICogSWYgcGFnZSBtYXBwZWQgYXMgYW5vbnltb3VzCisJCQkJCSAqIG1lbW9yeSwgbG93IGJpdCBpcyBzZXQsIGFuZAorCQkJCQkgKiBpdCBwb2ludHMgdG8gYW5vbl92bWEgb2JqZWN0OgorCQkJCQkgKiBzZWUgUEFHRV9NQVBQSU5HX0FOT04gYmVsb3cuCiAJCQkJCSAqLwotCQlzdHJ1Y3QgewkJLyogU0xVQiAqLwotCQkJdTE2IGludXNlOwotCQkJdTE2IG9iamVjdHM7CisJLyogU2Vjb25kIGRvdWJsZSB3b3JkICovCisJc3RydWN0IHsKKwkJdW5pb24geworCQkJcGdvZmZfdCBpbmRleDsJCS8qIE91ciBvZmZzZXQgd2l0aGluIG1hcHBpbmcuICovCisJCQl2b2lkICpmcmVlbGlzdDsJCS8qIHNsdWIgZmlyc3QgZnJlZSBvYmplY3QgKi8KKwkJfTsKKworCQl1bmlvbiB7CisJCQkvKiBVc2VkIGZvciBjbXB4Y2hnX2RvdWJsZSBpbiBzbHViICovCisJCQl1bnNpZ25lZCBsb25nIGNvdW50ZXJzOworCisJCQlzdHJ1Y3QgeworCisJCQkJdW5pb24geworCQkJCQlhdG9taWNfdCBfbWFwY291bnQ7CS8qIENvdW50IG9mIHB0ZXMgbWFwcGVkIGluIG1tcywKKwkJCQkJCQkgKiB0byBzaG93IHdoZW4gcGFnZSBpcyBtYXBwZWQKKwkJCQkJCQkgKiAmIGxpbWl0IHJldmVyc2UgbWFwIHNlYXJjaGVzLgorCQkJCQkJCSAqLworCisJCQkJCXN0cnVjdCB7CisJCQkJCQl1bnNpZ25lZCBpbnVzZToxNjsKKwkJCQkJCXVuc2lnbmVkIG9iamVjdHM6MTU7CisJCQkJCQl1bnNpZ25lZCBmcm96ZW46MTsKKwkJCQkJfTsKKwkJCQl9OworCQkJCWF0b21pY190IF9jb3VudDsJCS8qIFVzYWdlIGNvdW50LCBzZWUgYmVsb3cuICovCisJCQl9OwogCQl9OwogCX07CisKKwkvKiBUaGlyZCBkb3VibGUgd29yZCBibG9jayAqLworCXN0cnVjdCBsaXN0X2hlYWQgbHJ1OwkJLyogUGFnZW91dCBsaXN0LCBlZy4gYWN0aXZlX2xpc3QKKwkJCQkJICogcHJvdGVjdGVkIGJ5IHpvbmUtPmxydV9sb2NrICEKKwkJCQkJICovCisKKwkvKiBSZW1haW5kZXIgaXMgbm90IGRvdWJsZSB3b3JkIGFsaWduZWQgKi8KIAl1bmlvbiB7Ci0JICAgIHN0cnVjdCB7CiAJCXVuc2lnbmVkIGxvbmcgcHJpdmF0ZTsJCS8qIE1hcHBpbmctcHJpdmF0ZSBvcGFxdWUgZGF0YToKIAkJCQkJIAkgKiB1c3VhbGx5IHVzZWQgZm9yIGJ1ZmZlcl9oZWFkcwogCQkJCQkJICogaWYgUGFnZVByaXZhdGUgc2V0OyB1c2VkIGZvcgpAQCAtNTQsMjcgKzkyLDEzIEBACiAJCQkJCQkgKiBpbmRpY2F0ZXMgb3JkZXIgaW4gdGhlIGJ1ZGR5CiAJCQkJCQkgKiBzeXN0ZW0gaWYgUEdfYnVkZHkgaXMgc2V0LgogCQkJCQkJICovCi0JCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOwkvKiBJZiBsb3cgYml0IGNsZWFyLCBwb2ludHMgdG8KLQkJCQkJCSAqIGlub2RlIGFkZHJlc3Nfc3BhY2UsIG9yIE5VTEwuCi0JCQkJCQkgKiBJZiBwYWdlIG1hcHBlZCBhcyBhbm9ueW1vdXMKLQkJCQkJCSAqIG1lbW9yeSwgbG93IGJpdCBpcyBzZXQsIGFuZAotCQkJCQkJICogaXQgcG9pbnRzIHRvIGFub25fdm1hIG9iamVjdDoKLQkJCQkJCSAqIHNlZSBQQUdFX01BUFBJTkdfQU5PTiBiZWxvdy4KLQkJCQkJCSAqLwotCSAgICB9OwogI2lmIFVTRV9TUExJVF9QVExPQ0tTCi0JICAgIHNwaW5sb2NrX3QgcHRsOworCQlzcGlubG9ja190IHB0bDsKICNlbmRpZgotCSAgICBzdHJ1Y3Qga21lbV9jYWNoZSAqc2xhYjsJLyogU0xVQjogUG9pbnRlciB0byBzbGFiICovCi0JICAgIHN0cnVjdCBwYWdlICpmaXJzdF9wYWdlOwkvKiBDb21wb3VuZCB0YWlsIHBhZ2VzICovCisJCXN0cnVjdCBrbWVtX2NhY2hlICpzbGFiOwkvKiBTTFVCOiBQb2ludGVyIHRvIHNsYWIgKi8KKwkJc3RydWN0IHBhZ2UgKmZpcnN0X3BhZ2U7CS8qIENvbXBvdW5kIHRhaWwgcGFnZXMgKi8KIAl9OwotCXVuaW9uIHsKLQkJcGdvZmZfdCBpbmRleDsJCS8qIE91ciBvZmZzZXQgd2l0aGluIG1hcHBpbmcuICovCi0JCXZvaWQgKmZyZWVsaXN0OwkJLyogU0xVQjogZnJlZWxpc3QgcmVxLiBzbGFiIGxvY2sgKi8KLQl9OwotCXN0cnVjdCBsaXN0X2hlYWQgbHJ1OwkJLyogUGFnZW91dCBsaXN0LCBlZy4gYWN0aXZlX2xpc3QKLQkJCQkJICogcHJvdGVjdGVkIGJ5IHpvbmUtPmxydV9sb2NrICEKLQkJCQkJICovCisKIAkvKgogCSAqIE9uIG1hY2hpbmVzIHdoZXJlIGFsbCBSQU0gaXMgbWFwcGVkIGludG8ga2VybmVsIGFkZHJlc3Mgc3BhY2UsCiAJICogd2UgY2FuIHNpbXBseSBjYWxjdWxhdGUgdGhlIHZpcnR1YWwgYWRkcmVzcy4gT24gbWFjaGluZXMgd2l0aApAQCAtMTAwLDcgKzEyNCwxNiBAQAogCSAqLwogCXZvaWQgKnNoYWRvdzsKICNlbmRpZgotfTsKK30KKy8qCisgKiBJZiBhbm90aGVyIHN1YnN5c3RlbSBzdGFydHMgdXNpbmcgdGhlIGRvdWJsZSB3b3JkIHBhaXJpbmcgZm9yIGF0b21pYworICogb3BlcmF0aW9ucyBvbiBzdHJ1Y3QgcGFnZSB0aGVuIGl0IG11c3QgY2hhbmdlIHRoZSAjaWYgdG8gZW5zdXJlCisgKiBwcm9wZXIgYWxpZ25tZW50IG9mIHRoZSBwYWdlIHN0cnVjdC4KKyAqLworI2lmIGRlZmluZWQoQ09ORklHX1NMVUIpICYmIGRlZmluZWQoQ09ORklHX0NNUFhDSEdfTE9DQUwpCisJX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oMipzaXplb2YodW5zaWduZWQgbG9uZykpKSkKKyNlbmRpZgorOwogCiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgX19ub2Nhc3Qgdm1fZmxhZ3NfdDsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnMuaCBiL2luY2x1ZGUvbGludXgvbmZzLmgKaW5kZXggZjM4NzkxOS4uOGM2ZWU0NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mcy5oCkBAIC0yOSw2ICsyOSw4IEBACiAjZGVmaW5lIE5GU19NTlRfVkVSU0lPTgkJMQogI2RlZmluZSBORlNfTU5UM19WRVJTSU9OCTMKIAorI2RlZmluZSBORlNfUElQRV9ESVJOQU1FICIvbmZzIgorCiAvKgogICogTkZTIHN0YXRzLiBUaGUgZ29vZCB0aGluZyB3aXRoIHRoZXNlIHZhbHVlcyBpcyB0aGF0IE5GU3YzIGVycm9ycyBhcmUKICAqIGEgc3VwZXJzZXQgb2YgTkZTdjIgZXJyb3JzICh3aXRoIHRoZSBleGNlcHRpb24gb2YgTkZTRVJSX1dGTFVTSCB3aGljaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnM0LmggYi9pbmNsdWRlL2xpbnV4L25mczQuaAppbmRleCBhM2M0YmM4Li43NmY5OWU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mczQuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mczQuaApAQCAtNTY2LDYgKzU2Niw3IEBACiAJTkZTUFJPQzRfQ0xOVF9TRUNJTkZPX05PX05BTUUsCiAJTkZTUFJPQzRfQ0xOVF9URVNUX1NUQVRFSUQsCiAJTkZTUFJPQzRfQ0xOVF9GUkVFX1NUQVRFSUQsCisJTkZTUFJPQzRfQ0xOVF9HRVRERVZJQ0VMSVNULAogfTsKIAogLyogbmZzNDEgdHlwZXMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmZzX2ZzLmggYi9pbmNsdWRlL2xpbnV4L25mc19mcy5oCmluZGV4IDhiNTc5YmUuLmVhYWM3NzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZnNfZnMuaApAQCAtOTksOSArOTksMTAgQEAKIAogc3RydWN0IG5mc19vcGVuX2Rpcl9jb250ZXh0IHsKIAlzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQ7CisJdW5zaWduZWQgbG9uZyBhdHRyX2dlbmNvdW50OwogCV9fdTY0IGRpcl9jb29raWU7CiAJX191NjQgZHVwX2Nvb2tpZTsKLQlpbnQgZHVwZWQ7CisJc2lnbmVkIGNoYXIgZHVwZWQ7CiB9OwogCiAvKgpAQCAtNTY4LDEyICs1NjksMTIgQEAKIGV4dGVybiBpbnQgbmZzM19wcm9jX3NldGFjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSwKIAkJCSAgICBzdHJ1Y3QgcG9zaXhfYWNsICphY2wpOwogZXh0ZXJuIGludCBuZnMzX3Byb2Nfc2V0X2RlZmF1bHRfYWNsKHN0cnVjdCBpbm9kZSAqZGlyLCBzdHJ1Y3QgaW5vZGUgKmlub2RlLAotCQltb2RlX3QgbW9kZSk7CisJCXVtb2RlX3QgbW9kZSk7CiBleHRlcm4gdm9pZCBuZnMzX2ZvcmdldF9jYWNoZWRfYWNscyhzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBuZnMzX3Byb2Nfc2V0X2RlZmF1bHRfYWNsKHN0cnVjdCBpbm9kZSAqZGlyLAogCQkJCQkgICAgc3RydWN0IGlub2RlICppbm9kZSwKLQkJCQkJICAgIG1vZGVfdCBtb2RlKQorCQkJCQkgICAgdW1vZGVfdCBtb2RlKQogewogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNfZnNfc2IuaCBiL2luY2x1ZGUvbGludXgvbmZzX2ZzX3NiLmgKaW5kZXggNTBhNjYxZi4uYjU0NzlkZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZnNfZnNfc2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc19mc19zYi5oCkBAIC0xMzEsOCArMTMxLDkgQEAKIAlzdHJ1Y3QgZnNjYWNoZV9jb29raWUJKmZzY2FjaGU7CS8qIHN1cGVyYmxvY2sgY29va2llICovCiAjZW5kaWYKIAorCXUzMgkJCXBuZnNfYmxrc2l6ZTsJLyogbGF5b3V0X2Jsa3NpemUgYXR0ciAqLwogI2lmZGVmIENPTkZJR19ORlNfVjQKLQl1MzIJCQlhdHRyX2JpdG1hc2tbMl07LyogVjQgYml0bWFzayByZXByZXNlbnRpbmcgdGhlIHNldAorCXUzMgkJCWF0dHJfYml0bWFza1szXTsvKiBWNCBiaXRtYXNrIHJlcHJlc2VudGluZyB0aGUgc2V0CiAJCQkJCQkgICBvZiBhdHRyaWJ1dGVzIHN1cHBvcnRlZCBvbiB0aGlzCiAJCQkJCQkgICBmaWxlc3lzdGVtICovCiAJdTMyCQkJY2FjaGVfY29uc2lzdGVuY3lfYml0bWFza1syXTsKQEAgLTE0NSw2ICsxNDYsNyBAQAogCQkJCQkJICAgZmlsZXN5c3RlbSAqLwogCXN0cnVjdCBwbmZzX2xheW91dGRyaXZlcl90eXBlICAqcG5mc19jdXJyX2xkOyAvKiBBY3RpdmUgbGF5b3V0IGRyaXZlciAqLwogCXN0cnVjdCBycGNfd2FpdF9xdWV1ZQlyb2NfcnBjd2FpdHE7CisJdm9pZAkJCSpwbmZzX2xkX2RhdGE7CS8qIHBlciBtb3VudCBwb2ludCBkYXRhICovCiAKIAkvKiB0aGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgcHJvdGVjdGVkIGJ5IG5mc19jbGllbnQtPmNsX2xvY2sgKi8KIAlzdHJ1Y3QgcmJfcm9vdAkJc3RhdGVfb3duZXJzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnNfeGRyLmggYi9pbmNsdWRlL2xpbnV4L25mc194ZHIuaAppbmRleCA1YjExNTk1Li41NjllYTViIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mc194ZHIuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mc194ZHIuaApAQCAtMTIyLDYgKzEyMiw3IEBACiAJc3RydWN0IHRpbWVzcGVjCQl0aW1lX2RlbHRhOyAvKiBzZXJ2ZXIgdGltZSBncmFudWxhcml0eSAqLwogCV9fdTMyCQkJbGVhc2VfdGltZTsgLyogaW4gc2Vjb25kcyAqLwogCV9fdTMyCQkJbGF5b3V0dHlwZTsgLyogc3VwcG9ydGVkIHBuZnMgbGF5b3V0IGRyaXZlciAqLworCV9fdTMyCQkJYmxrc2l6ZTsgLyogcHJlZmVycmVkIHBuZnMgaW8gYmxvY2sgc2l6ZSAqLwogfTsKIAogc3RydWN0IG5mc19mc3N0YXQgewpAQCAtMjM1LDYgKzIzNiwxNyBAQAogCWdmcF90IGdmcF9mbGFnczsKIH07CiAKK3N0cnVjdCBuZnM0X2dldGRldmljZWxpc3RfYXJncyB7CisJY29uc3Qgc3RydWN0IG5mc19maCAqZmg7CisJdTMyIGxheW91dGNsYXNzOworCXN0cnVjdCBuZnM0X3NlcXVlbmNlX2FyZ3Mgc2VxX2FyZ3M7Cit9OworCitzdHJ1Y3QgbmZzNF9nZXRkZXZpY2VsaXN0X3JlcyB7CisJc3RydWN0IHBuZnNfZGV2aWNlbGlzdCAqZGV2bGlzdDsKKwlzdHJ1Y3QgbmZzNF9zZXF1ZW5jZV9yZXMgc2VxX3JlczsKK307CisKIHN0cnVjdCBuZnM0X2dldGRldmljZWluZm9fYXJncyB7CiAJc3RydWN0IHBuZnNfZGV2aWNlICpwZGV2OwogCXN0cnVjdCBuZnM0X3NlcXVlbmNlX2FyZ3Mgc2VxX2FyZ3M7CkBAIC0yNTcsMTIgKzI2OSwxMyBAQAogCXN0cnVjdCBuZnNfZmF0dHIgKmZhdHRyOwogCWNvbnN0IHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXI7CiAJc3RydWN0IG5mczRfc2VxdWVuY2VfcmVzIHNlcV9yZXM7CisJaW50IHN0YXR1czsKIH07CiAKIHN0cnVjdCBuZnM0X2xheW91dGNvbW1pdF9kYXRhIHsKIAlzdHJ1Y3QgcnBjX3Rhc2sgdGFzazsKIAlzdHJ1Y3QgbmZzX2ZhdHRyIGZhdHRyOwotCXN0cnVjdCBwbmZzX2xheW91dF9zZWdtZW50ICpsc2VnOworCXN0cnVjdCBsaXN0X2hlYWQgbHNlZ19saXN0OwogCXN0cnVjdCBycGNfY3JlZCAqY3JlZDsKIAlzdHJ1Y3QgbmZzNF9sYXlvdXRjb21taXRfYXJncyBhcmdzOwogCXN0cnVjdCBuZnM0X2xheW91dGNvbW1pdF9yZXMgcmVzOwpAQCAtOTQzLDcgKzk1Niw3IEBACiB9OwogCiBzdHJ1Y3QgbmZzNF9zZXJ2ZXJfY2Fwc19yZXMgewotCXUzMgkJCQlhdHRyX2JpdG1hc2tbMl07CisJdTMyCQkJCWF0dHJfYml0bWFza1szXTsKIAl1MzIJCQkJYWNsX2JpdG1hc2s7CiAJdTMyCQkJCWhhc19saW5rczsKIAl1MzIJCQkJaGFzX3N5bWxpbmtzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9vZi5oIGIvaW5jbHVkZS9saW51eC9vZi5oCmluZGV4IGJkNzE2ZjguLjAwODViYjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvb2YuaAorKysgYi9pbmNsdWRlL2xpbnV4L29mLmgKQEAgLTE5NiwxMiArMTk2LDEzIEBACiAJCQkJCSBjb25zdCBjaGFyICpuYW1lLAogCQkJCQkgaW50ICpsZW5wKTsKIGV4dGVybiBpbnQgb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCQkgICAgICBjaGFyICpwcm9wbmFtZSwKKwkJCQkgICAgICBjb25zdCBjaGFyICpwcm9wbmFtZSwKIAkJCQkgICAgICB1MzIgKm91dF92YWx1ZXMsCiAJCQkJICAgICAgc2l6ZV90IHN6KTsKIAotZXh0ZXJuIGludCBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCBjaGFyICpwcm9wbmFtZSwKLQkJCQkJY29uc3QgY2hhciAqKm91dF9zdHJpbmcpOworZXh0ZXJuIGludCBvZl9wcm9wZXJ0eV9yZWFkX3N0cmluZyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorCQkJCSAgIGNvbnN0IGNoYXIgKnByb3BuYW1lLAorCQkJCSAgIGNvbnN0IGNoYXIgKipvdXRfc3RyaW5nKTsKIGV4dGVybiBpbnQgb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpkZXZpY2UsCiAJCQkJICAgY29uc3QgY2hhciAqKTsKIGV4dGVybiBpbnQgb2ZfZGV2aWNlX2lzX2F2YWlsYWJsZShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldmljZSk7CkBAIC0yNDIsMTMgKzI0MywxNSBAQAogfQogCiBzdGF0aWMgaW5saW5lIGludCBvZl9wcm9wZXJ0eV9yZWFkX3UzMl9hcnJheShjb25zdCBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAotCQkJCWNoYXIgKnByb3BuYW1lLCB1MzIgKm91dF92YWx1ZXMsIHNpemVfdCBzeikKKwkJCQkJICAgICBjb25zdCBjaGFyICpwcm9wbmFtZSwKKwkJCQkJICAgICB1MzIgKm91dF92YWx1ZXMsIHNpemVfdCBzeikKIHsKIAlyZXR1cm4gLUVOT1NZUzsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgb2ZfcHJvcGVydHlfcmVhZF9zdHJpbmcoc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCQljaGFyICpwcm9wbmFtZSwgY29uc3QgY2hhciAqKm91dF9zdHJpbmcpCisJCQkJCSAgY29uc3QgY2hhciAqcHJvcG5hbWUsCisJCQkJCSAgY29uc3QgY2hhciAqKm91dF9zdHJpbmcpCiB7CiAJcmV0dXJuIC1FTk9TWVM7CiB9CkBAIC0yNTYsNyArMjU5LDcgQEAKICNlbmRpZiAvKiBDT05GSUdfT0YgKi8KIAogc3RhdGljIGlubGluZSBpbnQgb2ZfcHJvcGVydHlfcmVhZF91MzIoY29uc3Qgc3RydWN0IGRldmljZV9ub2RlICpucCwKLQkJCQkgICAgICAgY2hhciAqcHJvcG5hbWUsCisJCQkJICAgICAgIGNvbnN0IGNoYXIgKnByb3BuYW1lLAogCQkJCSAgICAgICB1MzIgKm91dF92YWx1ZSkKIHsKIAlyZXR1cm4gb2ZfcHJvcGVydHlfcmVhZF91MzJfYXJyYXkobnAsIHByb3BuYW1lLCBvdXRfdmFsdWUsIDEpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9vZl9ncGlvLmggYi9pbmNsdWRlL2xpbnV4L29mX2dwaW8uaAppbmRleCBhZWM4MDI1Li41MjI4MGEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L29mX2dwaW8uaAorKysgYi9pbmNsdWRlL2xpbnV4L29mX2dwaW8uaApAQCAtNTcsNiArNTcsOCBAQAogZXh0ZXJuIHZvaWQgb2ZfZ3Bpb2NoaXBfYWRkKHN0cnVjdCBncGlvX2NoaXAgKmdjKTsKIGV4dGVybiB2b2lkIG9mX2dwaW9jaGlwX3JlbW92ZShzdHJ1Y3QgZ3Bpb19jaGlwICpnYyk7CiBleHRlcm4gc3RydWN0IGdwaW9fY2hpcCAqb2Zfbm9kZV90b19ncGlvY2hpcChzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKK2V4dGVybiBpbnQgb2ZfZ3Bpb19zaW1wbGVfeGxhdGUoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJY29uc3Qgdm9pZCAqZ3Bpb19zcGVjLCB1MzIgKmZsYWdzKTsKIAogI2Vsc2UgLyogQ09ORklHX09GX0dQSU8gKi8KIApAQCAtNzIsNiArNzQsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgb2ZfZ3Bpb19zaW1wbGVfeGxhdGUoc3RydWN0IGdwaW9fY2hpcCAqZ2MsCisJCQkJICAgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAsCisJCQkJICAgICAgIGNvbnN0IHZvaWQgKmdwaW9fc3BlYywgdTMyICpmbGFncykKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKwogc3RhdGljIGlubGluZSB2b2lkIG9mX2dwaW9jaGlwX2FkZChzdHJ1Y3QgZ3Bpb19jaGlwICpnYykgeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgb2ZfZ3Bpb2NoaXBfcmVtb3ZlKHN0cnVjdCBncGlvX2NoaXAgKmdjKSB7IH0KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9vZl9pcnEuaCBiL2luY2x1ZGUvbGludXgvb2ZfaXJxLmgKaW5kZXggZTY5NTVmNS4uY2QyZTYxYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9vZl9pcnEuaAorKysgYi9pbmNsdWRlL2xpbnV4L29mX2lycS5oCkBAIC02Myw2ICs2Myw5IEBACiBleHRlcm4gdW5zaWduZWQgaW50IGlycV9jcmVhdGVfb2ZfbWFwcGluZyhzdHJ1Y3QgZGV2aWNlX25vZGUgKmNvbnRyb2xsZXIsCiAJCQkJCSAgY29uc3QgdTMyICppbnRzcGVjLAogCQkJCQkgIHVuc2lnbmVkIGludCBpbnRzaXplKTsKKyNpZmRlZiBDT05GSUdfSVJRX0RPTUFJTgorZXh0ZXJuIHZvaWQgaXJxX2Rpc3Bvc2VfbWFwcGluZyh1bnNpZ25lZCBpbnQgaXJxKTsKKyNlbmRpZgogZXh0ZXJuIGludCBvZl9pcnFfdG9fcmVzb3VyY2Uoc3RydWN0IGRldmljZV9ub2RlICpkZXYsIGludCBpbmRleCwKIAkJCSAgICAgIHN0cnVjdCByZXNvdXJjZSAqcik7CiBleHRlcm4gaW50IG9mX2lycV9jb3VudChzdHJ1Y3QgZGV2aWNlX25vZGUgKmRldik7CkBAIC03MCw2ICs3Myw3IEBACiAJCXN0cnVjdCByZXNvdXJjZSAqcmVzLCBpbnQgbnJfaXJxcyk7CiBleHRlcm4gc3RydWN0IGRldmljZV9ub2RlICpvZl9pcnFfZmluZF9wYXJlbnQoc3RydWN0IGRldmljZV9ub2RlICpjaGlsZCk7CiAKKwogI2VuZGlmIC8qIENPTkZJR19PRl9JUlEgKi8KICNlbmRpZiAvKiBDT05GSUdfT0YgKi8KICNlbmRpZiAvKiBfX09GX0lSUV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L29mX25ldC5oIGIvaW5jbHVkZS9saW51eC9vZl9uZXQuaAppbmRleCBlOTEzMDgxLi5mNDc0NjQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L29mX25ldC5oCisrKyBiL2luY2x1ZGUvbGludXgvb2ZfbmV0LmgKQEAgLTksNiArOSw3IEBACiAKICNpZmRlZiBDT05GSUdfT0ZfTkVUCiAjaW5jbHVkZSA8bGludXgvb2YuaD4KK2V4dGVybiBjb25zdCBpbnQgb2ZfZ2V0X3BoeV9tb2RlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnApOwogZXh0ZXJuIGNvbnN0IHZvaWQgKm9mX2dldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BhZ2UtZmxhZ3MuaCBiL2luY2x1ZGUvbGludXgvcGFnZS1mbGFncy5oCmluZGV4IDNlNWExYjEuLmU5MGE2NzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGFnZS1mbGFncy5oCisrKyBiL2luY2x1ZGUvbGludXgvcGFnZS1mbGFncy5oCkBAIC0xMjQsOSArMTI0LDYgQEAKIAogCS8qIFNMT0IgKi8KIAlQR19zbG9iX2ZyZWUgPSBQR19wcml2YXRlLAotCi0JLyogU0xVQiAqLwotCVBHX3NsdWJfZnJvemVuID0gUEdfYWN0aXZlLAogfTsKIAogI2lmbmRlZiBfX0dFTkVSQVRJTkdfQk9VTkRTX0gKQEAgLTIxMiw4ICsyMDksNiBAQAogCiBfX1BBR0VGTEFHKFNsb2JGcmVlLCBzbG9iX2ZyZWUpCiAKLV9fUEFHRUZMQUcoU2x1YkZyb3plbiwgc2x1Yl9mcm96ZW4pCi0KIC8qCiAgKiBQcml2YXRlIHBhZ2UgbWFya2luZ3MgdGhhdCBtYXkgYmUgdXNlZCBieSB0aGUgZmlsZXN5c3RlbSB0aGF0IG93bnMgdGhlIHBhZ2UKICAqIGZvciBpdHMgb3duIHB1cnBvc2VzLgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wY2kuaCBiL2luY2x1ZGUvbGludXgvcGNpLmgKaW5kZXggM2E1NjI2ZC4uZjI3ODkzYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BjaS5oCkBAIC04NDMsOCArODQzLDggQEAKIHZvaWQgcGNpX2Rpc2FibGVfaWRvKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHVuc2lnbmVkIGxvbmcgdHlwZSk7CiAKIGVudW0gcGNpX29iZmZfc2lnbmFsX3R5cGUgewotCVBDSV9FWFBfT0JGRl9TSUdOQUxfTDAsCi0JUENJX0VYUF9PQkZGX1NJR05BTF9BTFdBWVMsCisJUENJX0VYUF9PQkZGX1NJR05BTF9MMCA9IDAsCisJUENJX0VYUF9PQkZGX1NJR05BTF9BTFdBWVMgPSAxLAogfTsKIGludCBwY2lfZW5hYmxlX29iZmYoc3RydWN0IHBjaV9kZXYgKmRldiwgZW51bSBwY2lfb2JmZl9zaWduYWxfdHlwZSk7CiB2b2lkIHBjaV9kaXNhYmxlX29iZmYoc3RydWN0IHBjaV9kZXYgKmRldik7CkBAIC04NzksNyArODc5LDcgQEAKIHZvaWQgcGRldl9zb3J0X3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqLCBzdHJ1Y3QgcmVzb3VyY2VfbGlzdCAqKTsKIGludCBwY2lfZW5hYmxlX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2RldiAqLCBpbnQgbWFzayk7CiB2b2lkIHBjaV9maXh1cF9pcnFzKHU4ICgqKShzdHJ1Y3QgcGNpX2RldiAqLCB1OCAqKSwKLQkJICAgIGludCAoKikoc3RydWN0IHBjaV9kZXYgKiwgdTgsIHU4KSk7CisJCSAgICBpbnQgKCopKGNvbnN0IHN0cnVjdCBwY2lfZGV2ICosIHU4LCB1OCkpOwogI2RlZmluZSBIQVZFX1BDSV9SRVFfUkVHSU9OUwkyCiBpbnQgX19tdXN0X2NoZWNrIHBjaV9yZXF1ZXN0X3JlZ2lvbnMoc3RydWN0IHBjaV9kZXYgKiwgY29uc3QgY2hhciAqKTsKIGludCBfX211c3RfY2hlY2sgcGNpX3JlcXVlc3RfcmVnaW9uc19leGNsdXNpdmUoc3RydWN0IHBjaV9kZXYgKiwgY29uc3QgY2hhciAqKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKaW5kZXggYjAwYzRlYy4uYWU5NmJiZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKKysrIGIvaW5jbHVkZS9saW51eC9wY2lfaWRzLmgKQEAgLTI3MDksNiArMjcwOSwxNiBAQAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDEwXzUJMHgzYTYwCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfNV8zNDAwX1NFUklFU19MUENfTUlOCTB4M2IwMAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzVfMzQwMF9TRVJJRVNfTFBDX01BWAkweDNiMWYKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1NOQjAJMHgzYzIwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9TTkIxCTB4M2MyMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lPQVRfU05CMgkweDNjMjIKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1NOQjMJMHgzYzIzCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9TTkI0CTB4M2MyNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lPQVRfU05CNQkweDNjMjUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1NOQjYJMHgzYzI2CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9TTkI3CTB4M2MyNworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lPQVRfU05COAkweDNjMmUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF9JT0FUX1NOQjkJMHgzYzJmCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfSU9BVF9TTkIJMHg0MDJmCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfSU5URUxfNTEwMF8xNgkweDY1ZjAKICNkZWZpbmUgUENJX0RFVklDRV9JRF9JTlRFTF81MTAwXzIxCTB4NjVmNQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9waHkuaCBiL2luY2x1ZGUvbGludXgvcGh5LmgKaW5kZXggYWQ1MTg2My4uNTRmYzQxMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9waHkuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BoeS5oCkBAIC01Myw2ICs1Myw3IEBACiAKIC8qIEludGVyZmFjZSBNb2RlIGRlZmluaXRpb25zICovCiB0eXBlZGVmIGVudW0geworCVBIWV9JTlRFUkZBQ0VfTU9ERV9OQSwKIAlQSFlfSU5URVJGQUNFX01PREVfTUlJLAogCVBIWV9JTlRFUkZBQ0VfTU9ERV9HTUlJLAogCVBIWV9JTlRFUkZBQ0VfTU9ERV9TR01JSSwKQEAgLTYyLDcgKzYzLDggQEAKIAlQSFlfSU5URVJGQUNFX01PREVfUkdNSUlfSUQsCiAJUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJX1JYSUQsCiAJUEhZX0lOVEVSRkFDRV9NT0RFX1JHTUlJX1RYSUQsCi0JUEhZX0lOVEVSRkFDRV9NT0RFX1JUQkkKKwlQSFlfSU5URVJGQUNFX01PREVfUlRCSSwKKwlQSFlfSU5URVJGQUNFX01PREVfU01JSSwKIH0gcGh5X2ludGVyZmFjZV90OwogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9udGNfdGhlcm1pc3Rvci5oIGIvaW5jbHVkZS9saW51eC9wbGF0Zm9ybV9kYXRhL250Y190aGVybWlzdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkMjg2MgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvcGxhdGZvcm1fZGF0YS9udGNfdGhlcm1pc3Rvci5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBudGNfdGhlcm1pc3Rvci5oIC0gTlRDIFRoZXJtaXN0b3JzCisgKgorICogIENvcHlyaWdodCAoQykgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzCisgKiAgTXl1bmdKb28gSGFtIDxteXVuZ2pvby5oYW1Ac2Ftc3VuZy5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaWZuZGVmIF9MSU5VWF9OVENfSAorI2RlZmluZSBfTElOVVhfTlRDX0gKKworZW51bSBudGNfdGhlcm1pc3Rvcl90eXBlIHsKKwlUWVBFX05DUFhYV0I0NzMsCisJVFlQRV9OQ1BYWFdMMzMzLAorfTsKKworc3RydWN0IG50Y190aGVybWlzdG9yX3BsYXRmb3JtX2RhdGEgeworCS8qCisJICogT25lIChub3QgYm90aCkgb2YgcmVhZF91ViBhbmQgcmVhZF9vaG0gc2hvdWxkIGJlIHByb3ZpZGVkIGFuZCBvbmx5CisJICogb25lIG9mIHRoZSB0d28gc2hvdWxkIGJlIHByb3ZpZGVkLgorCSAqIEJvdGggZnVuY3Rpb25zIHNob3VsZCByZXR1cm4gbmVnYXRpdmUgdmFsdWUgZm9yIGFuIGVycm9yIGNhc2UuCisJICoKKwkgKiBwdWxsdXBfdVYsIHB1bGx1cF9vaG0sIHB1bGxkb3duX29obSwgYW5kIGNvbm5lY3QgYXJlIHJlcXVpcmVkIHRvIHVzZQorCSAqIHJlYWRfdVYoKQorCSAqCisJICogSG93IHRvIHNldHVwIHB1bGx1cF9vaG0sIHB1bGxkb3duX29obSwgYW5kIGNvbm5lY3QgaXMKKwkgKiBkZXNjcmliZWQgYXQgRG9jdW1lbnRhdGlvbi9od21vbi9udGMKKwkgKgorCSAqIHB1bGx1cC9kb3duX29obTogMCBmb3IgaW5maW5pdGUgLyBub3QtY29ubmVjdGVkCisJICovCisJaW50ICgqcmVhZF91Vikodm9pZCk7CisJdW5zaWduZWQgaW50IHB1bGx1cF91VjsKKworCXVuc2lnbmVkIGludCBwdWxsdXBfb2htOworCXVuc2lnbmVkIGludCBwdWxsZG93bl9vaG07CisJZW51bSB7IE5UQ19DT05ORUNURURfUE9TSVRJVkUsIE5UQ19DT05ORUNURURfR1JPVU5EIH0gY29ubmVjdDsKKworCWludCAoKnJlYWRfb2htKSh2b2lkKTsKK307CisKKyNlbmRpZiAvKiBfTElOVVhfTlRDX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG9zaXhfYWNsLmggYi9pbmNsdWRlL2xpbnV4L3Bvc2l4X2FjbC5oCmluZGV4IDlhNTNiOTkuLmI3NjgxMTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcG9zaXhfYWNsLmgKKysrIGIvaW5jbHVkZS9saW51eC9wb3NpeF9hY2wuaApAQCAtOSw2ICs5LDcgQEAKICNkZWZpbmUgX19MSU5VWF9QT1NJWF9BQ0xfSAogCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAKICNkZWZpbmUgQUNMX1VOREVGSU5FRF9JRAkoLTEpCiAKQEAgLTM4LDcgKzM5LDEwIEBACiB9OwogCiBzdHJ1Y3QgcG9zaXhfYWNsIHsKLQlhdG9taWNfdAkJYV9yZWZjb3VudDsKKwl1bmlvbiB7CisJCWF0b21pY190CQlhX3JlZmNvdW50OworCQlzdHJ1Y3QgcmN1X2hlYWQJCWFfcmN1OworCX07CiAJdW5zaWduZWQgaW50CQlhX2NvdW50OwogCXN0cnVjdCBwb3NpeF9hY2xfZW50cnkJYV9lbnRyaWVzWzBdOwogfTsKQEAgLTY1LDcgKzY5LDcgQEAKIHBvc2l4X2FjbF9yZWxlYXNlKHN0cnVjdCBwb3NpeF9hY2wgKmFjbCkKIHsKIAlpZiAoYWNsICYmIGF0b21pY19kZWNfYW5kX3Rlc3QoJmFjbC0+YV9yZWZjb3VudCkpCi0JCWtmcmVlKGFjbCk7CisJCWtmcmVlX3JjdShhY2wsIGFfcmN1KTsKIH0KIAogCkBAIC03NSwyOSArNzksMzEgQEAKIGV4dGVybiBzdHJ1Y3QgcG9zaXhfYWNsICpwb3NpeF9hY2xfYWxsb2MoaW50LCBnZnBfdCk7CiBleHRlcm4gaW50IHBvc2l4X2FjbF92YWxpZChjb25zdCBzdHJ1Y3QgcG9zaXhfYWNsICopOwogZXh0ZXJuIGludCBwb3NpeF9hY2xfcGVybWlzc2lvbihzdHJ1Y3QgaW5vZGUgKiwgY29uc3Qgc3RydWN0IHBvc2l4X2FjbCAqLCBpbnQpOwotZXh0ZXJuIHN0cnVjdCBwb3NpeF9hY2wgKnBvc2l4X2FjbF9mcm9tX21vZGUobW9kZV90LCBnZnBfdCk7Ci1leHRlcm4gaW50IHBvc2l4X2FjbF9lcXVpdl9tb2RlKGNvbnN0IHN0cnVjdCBwb3NpeF9hY2wgKiwgbW9kZV90ICopOwotZXh0ZXJuIGludCBwb3NpeF9hY2xfY3JlYXRlKHN0cnVjdCBwb3NpeF9hY2wgKiosIGdmcF90LCBtb2RlX3QgKik7Ci1leHRlcm4gaW50IHBvc2l4X2FjbF9jaG1vZChzdHJ1Y3QgcG9zaXhfYWNsICoqLCBnZnBfdCwgbW9kZV90KTsKK2V4dGVybiBzdHJ1Y3QgcG9zaXhfYWNsICpwb3NpeF9hY2xfZnJvbV9tb2RlKHVtb2RlX3QsIGdmcF90KTsKK2V4dGVybiBpbnQgcG9zaXhfYWNsX2VxdWl2X21vZGUoY29uc3Qgc3RydWN0IHBvc2l4X2FjbCAqLCB1bW9kZV90ICopOworZXh0ZXJuIGludCBwb3NpeF9hY2xfY3JlYXRlKHN0cnVjdCBwb3NpeF9hY2wgKiosIGdmcF90LCB1bW9kZV90ICopOworZXh0ZXJuIGludCBwb3NpeF9hY2xfY2htb2Qoc3RydWN0IHBvc2l4X2FjbCAqKiwgZ2ZwX3QsIHVtb2RlX3QpOwogCiBleHRlcm4gc3RydWN0IHBvc2l4X2FjbCAqZ2V0X3Bvc2l4X2FjbChzdHJ1Y3QgaW5vZGUgKiwgaW50KTsKIGV4dGVybiBpbnQgc2V0X3Bvc2l4X2FjbChzdHJ1Y3QgaW5vZGUgKiwgaW50LCBzdHJ1Y3QgcG9zaXhfYWNsICopOwogCiAjaWZkZWYgQ09ORklHX0ZTX1BPU0lYX0FDTAotc3RhdGljIGlubGluZSBzdHJ1Y3QgcG9zaXhfYWNsICpnZXRfY2FjaGVkX2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBvc2l4X2FjbCAqKmFjbF9ieV90eXBlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGludCB0eXBlKQogewotCXN0cnVjdCBwb3NpeF9hY2wgKipwLCAqYWNsOwogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgQUNMX1RZUEVfQUNDRVNTOgotCQlwID0gJmlub2RlLT5pX2FjbDsKLQkJYnJlYWs7CisJCXJldHVybiAmaW5vZGUtPmlfYWNsOwogCWNhc2UgQUNMX1RZUEVfREVGQVVMVDoKLQkJcCA9ICZpbm9kZS0+aV9kZWZhdWx0X2FjbDsKLQkJYnJlYWs7CisJCXJldHVybiAmaW5vZGUtPmlfZGVmYXVsdF9hY2w7CiAJZGVmYXVsdDoKLQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJCUJVRygpOwogCX0KLQlhY2wgPSBBQ0NFU1NfT05DRSgqcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBvc2l4X2FjbCAqZ2V0X2NhY2hlZF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpCit7CisJc3RydWN0IHBvc2l4X2FjbCAqKnAgPSBhY2xfYnlfdHlwZShpbm9kZSwgdHlwZSk7CisJc3RydWN0IHBvc2l4X2FjbCAqYWNsID0gQUNDRVNTX09OQ0UoKnApOwogCWlmIChhY2wpIHsKIAkJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKIAkJYWNsID0gKnA7CkBAIC0xMDgsNDEgKzExNCwyMCBAQAogCXJldHVybiBhY2w7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IG5lZ2F0aXZlX2NhY2hlZF9hY2woc3RydWN0IGlub2RlICppbm9kZSwgaW50IHR5cGUpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwb3NpeF9hY2wgKmdldF9jYWNoZWRfYWNsX3JjdShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKIHsKLQlzdHJ1Y3QgcG9zaXhfYWNsICoqcCwgKmFjbDsKLQlzd2l0Y2ggKHR5cGUpIHsKLQljYXNlIEFDTF9UWVBFX0FDQ0VTUzoKLQkJcCA9ICZpbm9kZS0+aV9hY2w7Ci0JCWJyZWFrOwotCWNhc2UgQUNMX1RZUEVfREVGQVVMVDoKLQkJcCA9ICZpbm9kZS0+aV9kZWZhdWx0X2FjbDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JfQotCWFjbCA9IEFDQ0VTU19PTkNFKCpwKTsKLQlpZiAoYWNsKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKKwlyZXR1cm4gcmN1X2RlcmVmZXJlbmNlKCphY2xfYnlfdHlwZShpbm9kZSwgdHlwZSkpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2NhY2hlZF9hY2woc3RydWN0IGlub2RlICppbm9kZSwKIAkJCQkgIGludCB0eXBlLAogCQkJCSAgc3RydWN0IHBvc2l4X2FjbCAqYWNsKQogewotCXN0cnVjdCBwb3NpeF9hY2wgKm9sZCA9IE5VTEw7CisJc3RydWN0IHBvc2l4X2FjbCAqKnAgPSBhY2xfYnlfdHlwZShpbm9kZSwgdHlwZSk7CisJc3RydWN0IHBvc2l4X2FjbCAqb2xkOwogCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7Ci0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBBQ0xfVFlQRV9BQ0NFU1M6Ci0JCW9sZCA9IGlub2RlLT5pX2FjbDsKLQkJaW5vZGUtPmlfYWNsID0gcG9zaXhfYWNsX2R1cChhY2wpOwotCQlicmVhazsKLQljYXNlIEFDTF9UWVBFX0RFRkFVTFQ6Ci0JCW9sZCA9IGlub2RlLT5pX2RlZmF1bHRfYWNsOwotCQlpbm9kZS0+aV9kZWZhdWx0X2FjbCA9IHBvc2l4X2FjbF9kdXAoYWNsKTsKLQkJYnJlYWs7Ci0JfQorCW9sZCA9ICpwOworCXJjdV9hc3NpZ25fcG9pbnRlcigqcCwgcG9zaXhfYWNsX2R1cChhY2wpKTsKIAlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CiAJaWYgKG9sZCAhPSBBQ0xfTk9UX0NBQ0hFRCkKIAkJcG9zaXhfYWNsX3JlbGVhc2Uob2xkKTsKQEAgLTE1MCwxOCArMTM1LDExIEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmb3JnZXRfY2FjaGVkX2FjbChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgdHlwZSkKIHsKLQlzdHJ1Y3QgcG9zaXhfYWNsICpvbGQgPSBOVUxMOworCXN0cnVjdCBwb3NpeF9hY2wgKipwID0gYWNsX2J5X3R5cGUoaW5vZGUsIHR5cGUpOworCXN0cnVjdCBwb3NpeF9hY2wgKm9sZDsKIAlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOwotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgQUNMX1RZUEVfQUNDRVNTOgotCQlvbGQgPSBpbm9kZS0+aV9hY2w7Ci0JCWlub2RlLT5pX2FjbCA9IEFDTF9OT1RfQ0FDSEVEOwotCQlicmVhazsKLQljYXNlIEFDTF9UWVBFX0RFRkFVTFQ6Ci0JCW9sZCA9IGlub2RlLT5pX2RlZmF1bHRfYWNsOwotCQlpbm9kZS0+aV9kZWZhdWx0X2FjbCA9IEFDTF9OT1RfQ0FDSEVEOwotCQlicmVhazsKLQl9CisJb2xkID0gKnA7CisJKnAgPSBBQ0xfTk9UX0NBQ0hFRDsKIAlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CiAJaWYgKG9sZCAhPSBBQ0xfTk9UX0NBQ0hFRCkKIAkJcG9zaXhfYWNsX3JlbGVhc2Uob2xkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG93ZXIvYnEyMHo3NS5oIGIvaW5jbHVkZS9saW51eC9wb3dlci9icTIwejc1LmgKaW5kZXggYjA4NDNiNi4uMTM5OGViMCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wb3dlci9icTIwejc1LmgKKysrIGIvaW5jbHVkZS9saW51eC9wb3dlci9icTIwejc1LmgKQEAgLTI5LDExICsyOSwxNCBAQAogICogQGJhdHRlcnlfZGV0ZWN0OgkJR1BJTyB3aGljaCBpcyB1c2VkIHRvIGRldGVjdCBiYXR0ZXJ5IHByZXNlbmNlCiAgKiBAYmF0dGVyeV9kZXRlY3RfcHJlc2VudDoJZ3BpbyBzdGF0ZSB3aGVuIGJhdHRlcnkgaXMgcHJlc2VudCAoMCAvIDEpCiAgKiBAaTJjX3JldHJ5X2NvdW50OgkJIyBvZiB0aW1lcyB0byByZXRyeSBvbiBpMmMgSU8gZmFpbHVyZQorICogQHBvbGxfcmV0cnlfY291bnQ6CQkjIG9mIHRpbWVzIHRvIHJldHJ5IGxvb2tpbmcgZm9yIG5ldyBzdGF0dXMgYWZ0ZXIKKyAqCQkJCWV4dGVybmFsIGNoYW5nZSBub3RpZmljYXRpb24KICAqLwogc3RydWN0IGJxMjB6NzVfcGxhdGZvcm1fZGF0YSB7CiAJaW50IGJhdHRlcnlfZGV0ZWN0OwogCWludCBiYXR0ZXJ5X2RldGVjdF9wcmVzZW50OwogCWludCBpMmNfcmV0cnlfY291bnQ7CisJaW50IHBvbGxfcmV0cnlfY291bnQ7CiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcG93ZXIvbWF4MTcwNDJfYmF0dGVyeS5oIGIvaW5jbHVkZS9saW51eC9wb3dlci9tYXgxNzA0Ml9iYXR0ZXJ5LmgKaW5kZXggNzk5NWRlYi4uZmU5OTIxMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wb3dlci9tYXgxNzA0Ml9iYXR0ZXJ5LmgKKysrIGIvaW5jbHVkZS9saW51eC9wb3dlci9tYXgxNzA0Ml9iYXR0ZXJ5LmgKQEAgLTIzLDggKzIzLDk5IEBACiAjaWZuZGVmIF9fTUFYMTcwNDJfQkFUVEVSWV9IXwogI2RlZmluZSBfX01BWDE3MDQyX0JBVFRFUllfSF8KIAorI2RlZmluZSBNQVgxNzA0Ml9TVEFUVVNfQmF0dEFic2VudAkoMSA8PCAzKQorI2RlZmluZSBNQVgxNzA0Ml9CQVRURVJZX0ZVTEwJKDEwMCkKKyNkZWZpbmUgTUFYMTcwNDJfREVGQVVMVF9TTlNfUkVTSVNUT1IJKDEwMDAwKQorCitlbnVtIG1heDE3MDQyX3JlZ2lzdGVyIHsKKwlNQVgxNzA0Ml9TVEFUVVMJCT0gMHgwMCwKKwlNQVgxNzA0Ml9WQUxSVF9UaAk9IDB4MDEsCisJTUFYMTcwNDJfVEFMUlRfVGgJPSAweDAyLAorCU1BWDE3MDQyX1NBTFJUX1RoCT0gMHgwMywKKwlNQVgxNzA0Ml9BdFJhdGUJCT0gMHgwNCwKKwlNQVgxNzA0Ml9SZXBDYXAJCT0gMHgwNSwKKwlNQVgxNzA0Ml9SZXBTT0MJCT0gMHgwNiwKKwlNQVgxNzA0Ml9BZ2UJCT0gMHgwNywKKwlNQVgxNzA0Ml9URU1QCQk9IDB4MDgsCisJTUFYMTcwNDJfVkNFTEwJCT0gMHgwOSwKKwlNQVgxNzA0Ml9DdXJyZW50CT0gMHgwQSwKKwlNQVgxNzA0Ml9BdmdDdXJyZW50CT0gMHgwQiwKKwlNQVgxNzA0Ml9RcmVzaWR1YWwJPSAweDBDLAorCU1BWDE3MDQyX1NPQwkJPSAweDBELAorCU1BWDE3MDQyX0F2U09DCQk9IDB4MEUsCisJTUFYMTcwNDJfUmVtQ2FwCQk9IDB4MEYsCisJTUFYMTc0MDJfRnVsbENBUAk9IDB4MTAsCisJTUFYMTcwNDJfVFRFCQk9IDB4MTEsCisJTUFYMTcwNDJfVl9lbXB0eQk9IDB4MTIsCisKKwlNQVgxNzA0Ml9SU0xPVwkJPSAweDE0LAorCisJTUFYMTcwNDJfQXZnVEEJCT0gMHgxNiwKKwlNQVgxNzA0Ml9DeWNsZXMJCT0gMHgxNywKKwlNQVgxNzA0Ml9EZXNpZ25DYXAJPSAweDE4LAorCU1BWDE3MDQyX0F2Z1ZDRUxMCT0gMHgxOSwKKwlNQVgxNzA0Ml9NaW5NYXhUZW1wCT0gMHgxQSwKKwlNQVgxNzA0Ml9NaW5NYXhWb2x0CT0gMHgxQiwKKwlNQVgxNzA0Ml9NaW5NYXhDdXJyCT0gMHgxQywKKwlNQVgxNzA0Ml9DT05GSUcJCT0gMHgxRCwKKwlNQVgxNzA0Ml9JQ0hHVGVybQk9IDB4MUUsCisJTUFYMTcwNDJfQXZDYXAJCT0gMHgxRiwKKwlNQVgxNzA0Ml9NYW5OYW1lCT0gMHgyMCwKKwlNQVgxNzA0Ml9EZXZOYW1lCT0gMHgyMSwKKwlNQVgxNzA0Ml9EZXZDaGVtCT0gMHgyMiwKKworCU1BWDE3MDQyX1RlbXBOb20JPSAweDI0LAorCU1BWDE3MDQyX1RlbXBDb2xkCT0gMHgyNSwKKwlNQVgxNzA0Ml9UZW1wSG90CT0gMHgyNiwKKwlNQVgxNzA0Ml9BSU4JCT0gMHgyNywKKwlNQVgxNzA0Ml9MZWFybkNGRwk9IDB4MjgsCisJTUFYMTcwNDJfU0hGVENGRwk9IDB4MjksCisJTUFYMTcwNDJfUmVsYXhDRkcJPSAweDJBLAorCU1BWDE3MDQyX01pc2NDRkcJPSAweDJCLAorCU1BWDE3MDQyX1RHQUlOCQk9IDB4MkMsCisJTUF4MTcwNDJfVE9GRgkJPSAweDJELAorCU1BWDE3MDQyX0NHQUlOCQk9IDB4MkUsCisJTUFYMTcwNDJfQ09GRgkJPSAweDJGLAorCisJTUFYMTcwNDJfUV9lbXB0eQk9IDB4MzMsCisJTUFYMTcwNDJfVF9lbXB0eQk9IDB4MzQsCisKKwlNQVgxNzA0Ml9SQ09NUDAJCT0gMHgzOCwKKwlNQVgxNzA0Ml9UZW1wQ28JCT0gMHgzOSwKKwlNQVgxNzA0Ml9SeAkJPSAweDNBLAorCU1BWDE3MDQyX1RfZW1wdHkwCT0gMHgzQiwKKwlNQVgxNzA0Ml9UYXNrUGVyaW9kCT0gMHgzQywKKwlNQVgxNzA0Ml9GU1RBVAkJPSAweDNELAorCisJTUFYMTcwNDJfU0hETlRJTUVSCT0gMHgzRiwKKworCU1BWDE3MDQyX1ZGUmVtQ2FwCT0gMHg0QSwKKworCU1BWDE3MDQyX1FICQk9IDB4NEQsCisJTUFYMTcwNDJfUUwJCT0gMHg0RSwKK307CisKKy8qCisgKiB1c2VkIGZvciBzZXR0aW5nIGEgcmVnaXN0ZXIgdG8gYSBkZXNpcmVkIHZhbHVlCisgKiBhZGRyIDogYWRkcmVzcyBmb3IgYSByZWdpc3RlcgorICogZGF0YSA6IHNldHRpbmcgdmFsdWUgZm9yIHRoZSByZWdpc3RlcgorICovCitzdHJ1Y3QgbWF4MTcwNDJfcmVnX2RhdGEgeworCXU4IGFkZHI7CisJdTE2IGRhdGE7Cit9OworCiBzdHJ1Y3QgbWF4MTcwNDJfcGxhdGZvcm1fZGF0YSB7CisJc3RydWN0IG1heDE3MDQyX3JlZ19kYXRhICppbml0X2RhdGE7CisJaW50IG51bV9pbml0X2RhdGE7IC8qIE51bWJlciBvZiBlbnRpZXMgaW4gaW5pdF9kYXRhIGFycmF5ICovCiAJYm9vbCBlbmFibGVfY3VycmVudF9zZW5zZTsKKworCS8qCisJICogUl9zbnMgaW4gbWljcm8tb2htcy4KKwkgKiBkZWZhdWx0IDEwMDAwIChpZiByX3NucyA9IDApIGFzIGl0IGlzIHRoZSByZWNvbW1lbmRlZCB2YWx1ZSBieQorCSAqIHRoZSBkYXRhc2hlZXQgYWx0aG91Z2ggaXQgY2FuIGJlIGNoYW5nZWQgYnkgYm9hcmQgZGVzaWduZXJzLgorCSAqLworCXVuc2lnbmVkIGludCByX3NuczsKIH07CiAKICNlbmRpZiAvKiBfX01BWDE3MDQyX0JBVFRFUllfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHN0b3JlLmggYi9pbmNsdWRlL2xpbnV4L3BzdG9yZS5oCmluZGV4IDI0NTVlZjIuLmNjMDNiYmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcHN0b3JlLmgKKysrIGIvaW5jbHVkZS9saW51eC9wc3RvcmUuaApAQCAtMzgsOSArMzgsMTIgQEAKIAlpbnQJCSgqb3Blbikoc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpOwogCWludAkJKCpjbG9zZSkoc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpOwogCXNzaXplX3QJCSgqcmVhZCkodTY0ICppZCwgZW51bSBwc3RvcmVfdHlwZV9pZCAqdHlwZSwKLQkJCXN0cnVjdCB0aW1lc3BlYyAqdGltZSk7Ci0JdTY0CQkoKndyaXRlKShlbnVtIHBzdG9yZV90eXBlX2lkIHR5cGUsIHNpemVfdCBzaXplKTsKLQlpbnQJCSgqZXJhc2UpKHU2NCBpZCk7CisJCQlzdHJ1Y3QgdGltZXNwZWMgKnRpbWUsIHN0cnVjdCBwc3RvcmVfaW5mbyAqcHNpKTsKKwl1NjQJCSgqd3JpdGUpKGVudW0gcHN0b3JlX3R5cGVfaWQgdHlwZSwgdW5zaWduZWQgaW50IHBhcnQsCisJCQlzaXplX3Qgc2l6ZSwgc3RydWN0IHBzdG9yZV9pbmZvICpwc2kpOworCWludAkJKCplcmFzZSkoZW51bSBwc3RvcmVfdHlwZV9pZCB0eXBlLCB1NjQgaWQsCisJCQlzdHJ1Y3QgcHN0b3JlX2luZm8gKnBzaSk7CisJdm9pZAkJKmRhdGE7CiB9OwogCiAjaWZkZWYgQ09ORklHX1BTVE9SRQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yYWRpeC10cmVlLmggYi9pbmNsdWRlL2xpbnV4L3JhZGl4LXRyZWUuaAppbmRleCAyMzI0MWMyLi45ZDQ1MzljIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JhZGl4LXRyZWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JhZGl4LXRyZWUuaApAQCAtMzksNyArMzksMTUgQEAKICAqIHdoZW4gaXQgaXMgc2hydW5rLCBiZWZvcmUgd2UgcmN1IGZyZWUgdGhlIG5vZGUuIFNlZSBzaHJpbmsgY29kZSBmb3IKICAqIGRldGFpbHMuCiAgKi8KLSNkZWZpbmUgUkFESVhfVFJFRV9JTkRJUkVDVF9QVFIJMQorI2RlZmluZSBSQURJWF9UUkVFX0lORElSRUNUX1BUUgkJMQorLyoKKyAqIEEgY29tbW9uIHVzZSBvZiB0aGUgcmFkaXggdHJlZSBpcyB0byBzdG9yZSBwb2ludGVycyB0byBzdHJ1Y3QgcGFnZXM7CisgKiBidXQgc2htZW0vdG1wZnMgbmVlZHMgYWxzbyB0byBzdG9yZSBzd2FwIGVudHJpZXMgaW4gdGhlIHNhbWUgdHJlZToKKyAqIHRob3NlIGFyZSBtYXJrZWQgYXMgZXhjZXB0aW9uYWwgZW50cmllcyB0byBkaXN0aW5ndWlzaCB0aGVtLgorICogRVhDRVBUSU9OQUxfRU5UUlkgdGVzdHMgdGhlIGJpdCwgRVhDRVBUSU9OQUxfU0hJRlQgc2hpZnRzIGNvbnRlbnQgcGFzdCBpdC4KKyAqLworI2RlZmluZSBSQURJWF9UUkVFX0VYQ0VQVElPTkFMX0VOVFJZCTIKKyNkZWZpbmUgUkFESVhfVFJFRV9FWENFUFRJT05BTF9TSElGVAkyCiAKICNkZWZpbmUgcmFkaXhfdHJlZV9pbmRpcmVjdF90b19wdHIocHRyKSBcCiAJcmFkaXhfdHJlZV9pbmRpcmVjdF90b19wdHIoKHZvaWQgX19mb3JjZSAqKShwdHIpKQpAQCAtMTc0LDYgKzE4MiwyOCBAQAogfQogCiAvKioKKyAqIHJhZGl4X3RyZWVfZXhjZXB0aW9uYWxfZW50cnkJLSByYWRpeF90cmVlX2RlcmVmX3Nsb3QgZ2F2ZSBleGNlcHRpb25hbCBlbnRyeT8KKyAqIEBhcmc6CXZhbHVlIHJldHVybmVkIGJ5IHJhZGl4X3RyZWVfZGVyZWZfc2xvdAorICogUmV0dXJuczoJMCBpZiB3ZWxsLWFsaWduZWQgcG9pbnRlciwgbm9uLTAgaWYgZXhjZXB0aW9uYWwgZW50cnkuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJhZGl4X3RyZWVfZXhjZXB0aW9uYWxfZW50cnkodm9pZCAqYXJnKQoreworCS8qIE5vdCB1bmxpa2VseSBiZWNhdXNlIHJhZGl4X3RyZWVfZXhjZXB0aW9uIG9mdGVuIHRlc3RlZCBmaXJzdCAqLworCXJldHVybiAodW5zaWduZWQgbG9uZylhcmcgJiBSQURJWF9UUkVFX0VYQ0VQVElPTkFMX0VOVFJZOworfQorCisvKioKKyAqIHJhZGl4X3RyZWVfZXhjZXB0aW9uCS0gcmFkaXhfdHJlZV9kZXJlZl9zbG90IHJldHVybmVkIGVpdGhlciBleGNlcHRpb24/CisgKiBAYXJnOgl2YWx1ZSByZXR1cm5lZCBieSByYWRpeF90cmVlX2RlcmVmX3Nsb3QKKyAqIFJldHVybnM6CTAgaWYgd2VsbC1hbGlnbmVkIHBvaW50ZXIsIG5vbi0wIGlmIGVpdGhlciBraW5kIG9mIGV4Y2VwdGlvbi4KKyAqLworc3RhdGljIGlubGluZSBpbnQgcmFkaXhfdHJlZV9leGNlcHRpb24odm9pZCAqYXJnKQoreworCXJldHVybiB1bmxpa2VseSgodW5zaWduZWQgbG9uZylhcmcgJgorCQkoUkFESVhfVFJFRV9JTkRJUkVDVF9QVFIgfCBSQURJWF9UUkVFX0VYQ0VQVElPTkFMX0VOVFJZKSk7Cit9CisKKy8qKgogICogcmFkaXhfdHJlZV9yZXBsYWNlX3Nsb3QJLSByZXBsYWNlIGl0ZW0gaW4gYSBzbG90CiAgKiBAcHNsb3Q6CXBvaW50ZXIgdG8gc2xvdCwgcmV0dXJuZWQgYnkgcmFkaXhfdHJlZV9sb29rdXBfc2xvdAogICogQGl0ZW06CW5ldyBpdGVtIHRvIHN0b3JlIGluIHRoZSBzbG90LgpAQCAtMTk0LDggKzIyNCw4IEBACiB1bnNpZ25lZCBpbnQKIHJhZGl4X3RyZWVfZ2FuZ19sb29rdXAoc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwgdm9pZCAqKnJlc3VsdHMsCiAJCQl1bnNpZ25lZCBsb25nIGZpcnN0X2luZGV4LCB1bnNpZ25lZCBpbnQgbWF4X2l0ZW1zKTsKLXVuc2lnbmVkIGludAotcmFkaXhfdHJlZV9nYW5nX2xvb2t1cF9zbG90KHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsIHZvaWQgKioqcmVzdWx0cywKK3Vuc2lnbmVkIGludCByYWRpeF90cmVlX2dhbmdfbG9va3VwX3Nsb3Qoc3RydWN0IHJhZGl4X3RyZWVfcm9vdCAqcm9vdCwKKwkJCXZvaWQgKioqcmVzdWx0cywgdW5zaWduZWQgbG9uZyAqaW5kaWNlcywKIAkJCXVuc2lnbmVkIGxvbmcgZmlyc3RfaW5kZXgsIHVuc2lnbmVkIGludCBtYXhfaXRlbXMpOwogdW5zaWduZWQgbG9uZyByYWRpeF90cmVlX25leHRfaG9sZShzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LAogCQkJCXVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgbWF4X3NjYW4pOwpAQCAtMjIyLDYgKzI1Miw3IEBACiAJCXVuc2lnbmVkIGxvbmcgbnJfdG9fdGFnLAogCQl1bnNpZ25lZCBpbnQgZnJvbXRhZywgdW5zaWduZWQgaW50IHRvdGFnKTsKIGludCByYWRpeF90cmVlX3RhZ2dlZChzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LCB1bnNpZ25lZCBpbnQgdGFnKTsKK3Vuc2lnbmVkIGxvbmcgcmFkaXhfdHJlZV9sb2NhdGVfaXRlbShzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LCB2b2lkICppdGVtKTsKIAogc3RhdGljIGlubGluZSB2b2lkIHJhZGl4X3RyZWVfcHJlbG9hZF9lbmQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmggYi9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oCmluZGV4IDllODdjMWMuLjI2ZjZlYTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2NvbnN1bWVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaApAQCAtMTIyLDYgKzEyMiw5IEBACiBzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YSB7CiAJY29uc3QgY2hhciAqc3VwcGx5OwogCXN0cnVjdCByZWd1bGF0b3IgKmNvbnN1bWVyOworCisJLyogSW50ZXJuYWwgdXNlICovCisJaW50IHJldDsKIH07CiAKICNpZiBkZWZpbmVkKENPTkZJR19SRUdVTEFUT1IpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3JlZ3VsYXRvci9kcml2ZXIuaCBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2RyaXZlci5oCmluZGV4IDZjNDMzYjguLjFhODBiYzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2RyaXZlci5oCisrKyBiL2luY2x1ZGUvbGludXgvcmVndWxhdG9yL2RyaXZlci5oCkBAIC0xODgsMTggKzE4OCwxNiBAQAogCiAJLyogbGlzdHMgd2UgYmVsb25nIHRvICovCiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OyAvKiBsaXN0IG9mIGFsbCByZWd1bGF0b3JzICovCi0Jc3RydWN0IGxpc3RfaGVhZCBzbGlzdDsgLyogbGlzdCBvZiBzdXBwbGllZCByZWd1bGF0b3JzICovCiAKIAkvKiBsaXN0cyB3ZSBvd24gKi8KIAlzdHJ1Y3QgbGlzdF9oZWFkIGNvbnN1bWVyX2xpc3Q7IC8qIGNvbnN1bWVycyB3ZSBzdXBwbHkgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIHN1cHBseV9saXN0OyAvKiByZWd1bGF0b3JzIHdlIHN1cHBseSAqLwogCiAJc3RydWN0IGJsb2NraW5nX25vdGlmaWVyX2hlYWQgbm90aWZpZXI7CiAJc3RydWN0IG11dGV4IG11dGV4OyAvKiBjb25zdW1lciBsb2NrICovCiAJc3RydWN0IG1vZHVsZSAqb3duZXI7CiAJc3RydWN0IGRldmljZSBkZXY7CiAJc3RydWN0IHJlZ3VsYXRpb25fY29uc3RyYWludHMgKmNvbnN0cmFpbnRzOwotCXN0cnVjdCByZWd1bGF0b3JfZGV2ICpzdXBwbHk7CS8qIGZvciB0cmVlICovCisJc3RydWN0IHJlZ3VsYXRvciAqc3VwcGx5OwkvKiBmb3IgdHJlZSAqLwogCiAJdm9pZCAqcmVnX2RhdGE7CQkvKiByZWd1bGF0b3JfZGV2IGRhdGEgKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zZXJpYWxfc2NpLmggYi9pbmNsdWRlL2xpbnV4L3NlcmlhbF9zY2kuaAppbmRleCBhMmFmYzlmLi44YmZmZTlhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NlcmlhbF9zY2kuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NlcmlhbF9zY2kuaApAQCAtOCw2ICs4LDggQEAKICAqIEdlbmVyaWMgaGVhZGVyIGZvciBTdXBlckggU0NJKEYpICh1c2VkIGJ5IHNoL3NoNjQvaDgzMDAgYW5kIHJlbGF0ZWQgcGFydHMpCiAgKi8KIAorI2RlZmluZSBTQ0l4X05PVF9TVVBQT1JURUQJKC0xKQorCiBlbnVtIHsKIAlTQ0JSUl9BTEdPXzEsCQkvKiAoKGNsayArIDE2ICogYnBzKSAvICgxNiAqIGJwcykgLSAxKSAqLwogCVNDQlJSX0FMR09fMiwJCS8qICgoY2xrICsgMTYgKiBicHMpIC8gKDMyICogYnBzKSAtIDEpICovCkBAIC0yNSw2ICsyNywyOCBAQAogI2RlZmluZSBTQ1NDUl9DS0UxCSgxIDw8IDEpCiAjZGVmaW5lIFNDU0NSX0NLRTAJKDEgPDwgMCkKIAorLyogU0N4U1IgU0NJICovCisjZGVmaW5lIFNDSV9URFJFICAweDgwCisjZGVmaW5lIFNDSV9SRFJGICAweDQwCisjZGVmaW5lIFNDSV9PUkVSICAweDIwCisjZGVmaW5lIFNDSV9GRVIgICAweDEwCisjZGVmaW5lIFNDSV9QRVIgICAweDA4CisjZGVmaW5lIFNDSV9URU5EICAweDA0CisKKyNkZWZpbmUgU0NJX0RFRkFVTFRfRVJST1JfTUFTSyAoU0NJX1BFUiB8IFNDSV9GRVIpCisKKy8qIFNDeFNSIFNDSUYgKi8KKyNkZWZpbmUgU0NJRl9FUiAgICAweDAwODAKKyNkZWZpbmUgU0NJRl9URU5EICAweDAwNDAKKyNkZWZpbmUgU0NJRl9UREZFICAweDAwMjAKKyNkZWZpbmUgU0NJRl9CUksgICAweDAwMTAKKyNkZWZpbmUgU0NJRl9GRVIgICAweDAwMDgKKyNkZWZpbmUgU0NJRl9QRVIgICAweDAwMDQKKyNkZWZpbmUgU0NJRl9SREYgICAweDAwMDIKKyNkZWZpbmUgU0NJRl9EUiAgICAweDAwMDEKKworI2RlZmluZSBTQ0lGX0RFRkFVTFRfRVJST1JfTUFTSyAoU0NJRl9QRVIgfCBTQ0lGX0ZFUiB8IFNDSUZfRVIgfCBTQ0lGX0JSSykKKwogLyogT2Zmc2V0cyBpbnRvIHRoZSBzY2lfcG9ydC0+aXJxcyBhcnJheSAqLwogZW51bSB7CiAJU0NJeF9FUklfSVJRLApAQCAtMzIsNiArNTYsMjQgQEAKIAlTQ0l4X1RYSV9JUlEsCiAJU0NJeF9CUklfSVJRLAogCVNDSXhfTlJfSVJRUywKKworCVNDSXhfTVVYX0lSUSA9IFNDSXhfTlJfSVJRUywJLyogc3BlY2lhbCBjYXNlICovCit9OworCitlbnVtIHsKKwlTQ0l4X1BST0JFX1JFR1RZUEUsCisKKwlTQ0l4X1NDSV9SRUdUWVBFLAorCVNDSXhfSVJEQV9SRUdUWVBFLAorCVNDSXhfU0NJRkFfUkVHVFlQRSwKKwlTQ0l4X1NDSUZCX1JFR1RZUEUsCisJU0NJeF9TSDNfU0NJRl9SRUdUWVBFLAorCVNDSXhfU0g0X1NDSUZfUkVHVFlQRSwKKwlTQ0l4X1NINF9TQ0lGX05PX1NDU1BUUl9SRUdUWVBFLAorCVNDSXhfU0g0X1NDSUZfRklGT0RBVEFfUkVHVFlQRSwKKwlTQ0l4X1NINzcwNV9TQ0lGX1JFR1RZUEUsCisKKwlTQ0l4X05SX1JFR1RZUEVTLAogfTsKIAogI2RlZmluZSBTQ0l4X0lSUV9NVVhFRChpcnEpCQlcCkBAIC00Miw4ICs4NCwyOSBAQAogCVtTQ0l4X0JSSV9JUlFdCT0gKGlycSksCVwKIH0KIAorI2RlZmluZSBTQ0l4X0lSUV9JU19NVVhFRChwb3J0KQkJCVwKKwkoKHBvcnQpLT5jZmctPmlycXNbU0NJeF9FUklfSVJRXSA9PQlcCisJIChwb3J0KS0+Y2ZnLT5pcnFzW1NDSXhfUlhJX0lSUV0pIHx8CVwKKwkoKHBvcnQpLT5jZmctPmlycXNbU0NJeF9FUklfSVJRXSAmJglcCisJICEocG9ydCktPmNmZy0+aXJxc1tTQ0l4X1JYSV9JUlFdKQorLyoKKyAqIFNDSSByZWdpc3RlciBzdWJzZXQgY29tbW9uIGZvciBhbGwgcG9ydCB0eXBlcy4KKyAqIE5vdCBhbGwgcmVnaXN0ZXJzIHdpbGwgZXhpc3Qgb24gYWxsIHBhcnRzLgorICovCitlbnVtIHsKKwlTQ1NNUiwgU0NCUlIsIFNDU0NSLCBTQ3hTUiwKKwlTQ0ZDUiwgU0NGRFIsIFNDeFREUiwgU0N4UkRSLAorCVNDTFNSLCBTQ1RGRFIsIFNDUkZEUiwgU0NTUFRSLAorCisJU0NJeF9OUl9SRUdTLAorfTsKKwogc3RydWN0IGRldmljZTsKIAorc3RydWN0IHBsYXRfc2NpX3BvcnRfb3BzIHsKKwl2b2lkICgqaW5pdF9waW5zKShzdHJ1Y3QgdWFydF9wb3J0ICosIHVuc2lnbmVkIGludCBjZmxhZyk7Cit9OworCiAvKgogICogUGxhdGZvcm0gZGV2aWNlIHNwZWNpZmljIHBsYXRmb3JtX2RhdGEgc3RydWN0CiAgKi8KQEAgLTU2LDYgKzExOSwxOCBAQAogCXVuc2lnbmVkIGludAlzY2Jycl9hbGdvX2lkOwkJLyogU0NCUlIgY2FsY3VsYXRpb24gYWxnbyAqLwogCXVuc2lnbmVkIGludAlzY3NjcjsJCQkvKiBTQ1NDUiBpbml0aWFsaXphdGlvbiAqLwogCisJLyoKKwkgKiBQbGF0Zm9ybSBvdmVycmlkZXMgaWYgbmVjZXNzYXJ5LCBkZWZhdWx0cyBvdGhlcndpc2UuCisJICovCisJaW50CQlvdmVycnVuX2JpdDsKKwl1bnNpZ25lZCBpbnQJZXJyb3JfbWFzazsKKworCWludAkJcG9ydF9yZWc7CisJdW5zaWduZWQgY2hhcglyZWdzaGlmdDsKKwl1bnNpZ25lZCBjaGFyCXJlZ3R5cGU7CisKKwlzdHJ1Y3QgcGxhdF9zY2lfcG9ydF9vcHMJKm9wczsKKwogCXN0cnVjdCBkZXZpY2UJKmRtYV9kZXY7CiAKIAl1bnNpZ25lZCBpbnQJZG1hX3NsYXZlX3R4OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zaF9jbGsuaCBiL2luY2x1ZGUvbGludXgvc2hfY2xrLmgKaW5kZXggOWE1MmY3Mi4uM2NjZjE4NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zaF9jbGsuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NoX2Nsay5oCkBAIC0xNDcsNCArMTQ3LDggQEAKIGludCBzaF9jbGtfZGl2Nl9yZWdpc3RlcihzdHJ1Y3QgY2xrICpjbGtzLCBpbnQgbnIpOwogaW50IHNoX2Nsa19kaXY2X3JlcGFyZW50X3JlZ2lzdGVyKHN0cnVjdCBjbGsgKmNsa3MsIGludCBucik7CiAKKyNkZWZpbmUgQ0xLREVWX0NPTl9JRChfaWQsIF9jbGspIHsgLmNvbl9pZCA9IF9pZCwgLmNsayA9IF9jbGsgfQorI2RlZmluZSBDTEtERVZfREVWX0lEKF9pZCwgX2NsaykgeyAuZGV2X2lkID0gX2lkLCAuY2xrID0gX2NsayB9CisjZGVmaW5lIENMS0RFVl9JQ0tfSUQoX2NpZCwgX2RpZCwgX2NsaykgeyAuY29uX2lkID0gX2NpZCwgLmRldl9pZCA9IF9kaWQsIC5jbGsgPSBfY2xrIH0KKwogI2VuZGlmIC8qIF9fU0hfQ0xPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zaF9kbWEuaCBiL2luY2x1ZGUvbGludXgvc2hfZG1hLmgKaW5kZXggYjA4Y2Q0ZS4uY2IyZGQxMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zaF9kbWEuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NoX2RtYS5oCkBAIC02Miw2ICs2MiwxMiBAQAogCWNvbnN0IHVuc2lnbmVkIGludCAqdHNfc2hpZnQ7CiAJaW50IHRzX3NoaWZ0X251bTsKIAl1MTYgZG1hb3JfaW5pdDsKKwl1bnNpZ25lZCBpbnQgY2hjcl9vZmZzZXQ7CisJdTMyIGNoY3JfaWVfYml0OworCisJdW5zaWduZWQgaW50IGRtYW9yX2lzXzMyYml0OjE7CisJdW5zaWduZWQgaW50IG5lZWRzX3RlbmRfc2V0OjE7CisJdW5zaWduZWQgaW50IG5vX2RtYXJzOjE7CiB9OwogCiAvKiBETUEgcmVnaXN0ZXIgKi8KQEAgLTcxLDYgKzc3LDggQEAKICNkZWZpbmUgQ0hDUgkweDBDCiAjZGVmaW5lIERNQU9SCTB4NDAKIAorI2RlZmluZSBURU5ECTB4MTggLyogVVNCLURNQUMgKi8KKwogLyogRE1BT1IgZGVmaW5pdGlvbnMgKi8KICNkZWZpbmUgRE1BT1JfQUUJMHgwMDAwMDAwNAogI2RlZmluZSBETUFPUl9OTUlGCTB4MDAwMDAwMDIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2htLmggYi9pbmNsdWRlL2xpbnV4L3NobS5oCmluZGV4IDdkMjdmZmQuLjkyODA4YjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2htLmgKKysrIGIvaW5jbHVkZS9saW51eC9zaG0uaApAQCAtOTUsNiArOTUsOSBAQAogCXBpZF90CQkJc2htX2NwcmlkOwogCXBpZF90CQkJc2htX2xwcmlkOwogCXN0cnVjdCB1c2VyX3N0cnVjdAkqbWxvY2tfdXNlcjsKKworCS8qIFRoZSB0YXNrIGNyZWF0ZWQgdGhlIHNobSBvYmplY3QuICBOVUxMIGlmIHRoZSB0YXNrIGlzIGRlYWQuICovCisJc3RydWN0IHRhc2tfc3RydWN0CSpzaG1fY3JlYXRvcjsKIH07CiAKIC8qIHNobV9tb2RlIHVwcGVyIGJ5dGUgZmxhZ3MgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2htZW1fZnMuaCBiL2luY2x1ZGUvbGludXgvc2htZW1fZnMuaAppbmRleCBhYTA4ZmE4Li45MjkxYWMzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NobWVtX2ZzLmgKKysrIGIvaW5jbHVkZS9saW51eC9zaG1lbV9mcy5oCkBAIC04LDIyICs4LDE1IEBACiAKIC8qIGlub2RlIGluLWtlcm5lbCBkYXRhICovCiAKLSNkZWZpbmUgU0hNRU1fTlJfRElSRUNUIDE2Ci0KLSNkZWZpbmUgU0hNRU1fU1lNTElOS19JTkxJTkVfTEVOIChTSE1FTV9OUl9ESVJFQ1QgKiBzaXplb2Yoc3dwX2VudHJ5X3QpKQotCiBzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyB7CiAJc3BpbmxvY2tfdAkJbG9jazsKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAl1bnNpZ25lZCBsb25nCQlhbGxvY2VkOwkvKiBkYXRhIHBhZ2VzIGFsbG9jZWQgdG8gZmlsZSAqLwotCXVuc2lnbmVkIGxvbmcJCXN3YXBwZWQ7CS8qIHN1YnRvdGFsIGFzc2lnbmVkIHRvIHN3YXAgKi8KLQl1bnNpZ25lZCBsb25nCQluZXh0X2luZGV4OwkvKiBoaWdoZXN0IGFsbG9jZWQgaW5kZXggKyAxICovCi0Jc3RydWN0IHNoYXJlZF9wb2xpY3kJcG9saWN5OwkJLyogTlVNQSBtZW1vcnkgYWxsb2MgcG9saWN5ICovCi0Jc3RydWN0IHBhZ2UJCSppX2luZGlyZWN0OwkvKiB0b3AgaW5kaXJlY3QgYmxvY2tzIHBhZ2UgKi8KIAl1bmlvbiB7Ci0JCXN3cF9lbnRyeV90CWlfZGlyZWN0W1NITUVNX05SX0RJUkVDVF07IC8qIGZpcnN0IGJsb2NrcyAqLwotCQljaGFyCQlpbmxpbmVfc3ltbGlua1tTSE1FTV9TWU1MSU5LX0lOTElORV9MRU5dOworCQl1bnNpZ25lZCBsb25nCXN3YXBwZWQ7CS8qIHN1YnRvdGFsIGFzc2lnbmVkIHRvIHN3YXAgKi8KKwkJY2hhcgkJKnN5bWxpbms7CS8qIHVuc3dhcHBhYmxlIHNob3J0IHN5bWxpbmsgKi8KIAl9OworCXN0cnVjdCBzaGFyZWRfcG9saWN5CXBvbGljeTsJCS8qIE5VTUEgbWVtb3J5IGFsbG9jIHBvbGljeSAqLwogCXN0cnVjdCBsaXN0X2hlYWQJc3dhcGxpc3Q7CS8qIGNoYWluIG9mIG1heWJlcyBvbiBzd2FwICovCiAJc3RydWN0IGxpc3RfaGVhZAl4YXR0cl9saXN0OwkvKiBsaXN0IG9mIHNobWVtX3hhdHRyICovCiAJc3RydWN0IGlub2RlCQl2ZnNfaW5vZGU7CkBAIC00OSw3ICs0Miw3IEBACiAvKgogICogRnVuY3Rpb25zIGluIG1tL3NobWVtLmMgY2FsbGVkIGRpcmVjdGx5IGZyb20gZWxzZXdoZXJlOgogICovCi1leHRlcm4gaW50IGluaXRfdG1wZnModm9pZCk7CitleHRlcm4gaW50IHNobWVtX2luaXQodm9pZCk7CiBleHRlcm4gaW50IHNobWVtX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCk7CiBleHRlcm4gc3RydWN0IGZpbGUgKnNobWVtX2ZpbGVfc2V0dXAoY29uc3QgY2hhciAqbmFtZSwKIAkJCQkJbG9mZl90IHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwpAQCAtNTksOCArNTIsNiBAQAogCQkJCQlwZ29mZl90IGluZGV4LCBnZnBfdCBnZnBfbWFzayk7CiBleHRlcm4gdm9pZCBzaG1lbV90cnVuY2F0ZV9yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQpOwogZXh0ZXJuIGludCBzaG1lbV91bnVzZShzd3BfZW50cnlfdCBlbnRyeSwgc3RydWN0IHBhZ2UgKnBhZ2UpOwotZXh0ZXJuIHZvaWQgbWVtX2Nncm91cF9nZXRfc2htZW1fdGFyZ2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHBnb2ZmX3QgcGdvZmYsCi0JCQkJCXN0cnVjdCBwYWdlICoqcGFnZXAsIHN3cF9lbnRyeV90ICplbnQpOwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpzaG1lbV9yZWFkX21hcHBpbmdfcGFnZSgKIAkJCQlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywgcGdvZmZfdCBpbmRleCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2x1Yl9kZWYuaCBiL2luY2x1ZGUvbGludXgvc2x1Yl9kZWYuaAppbmRleCA0YjM1YzA2Li5mNThkNjQxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NsdWJfZGVmLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbHViX2RlZi5oCkBAIC0yNCw2ICsyNCw3IEBACiAJQUxMT0NfRlJPTV9QQVJUSUFMLAkvKiBDcHUgc2xhYiBhY3F1aXJlZCBmcm9tIHBhcnRpYWwgbGlzdCAqLwogCUFMTE9DX1NMQUIsCQkvKiBDcHUgc2xhYiBhY3F1aXJlZCBmcm9tIHBhZ2UgYWxsb2NhdG9yICovCiAJQUxMT0NfUkVGSUxMLAkJLyogUmVmaWxsIGNwdSBzbGFiIGZyb20gc2xhYiBmcmVlbGlzdCAqLworCUFMTE9DX05PREVfTUlTTUFUQ0gsCS8qIFN3aXRjaGluZyBjcHUgc2xhYiAqLwogCUZSRUVfU0xBQiwJCS8qIFNsYWIgZnJlZWQgdG8gdGhlIHBhZ2UgYWxsb2NhdG9yICovCiAJQ1BVU0xBQl9GTFVTSCwJCS8qIEFiYW5kb25pbmcgb2YgdGhlIGNwdSBzbGFiICovCiAJREVBQ1RJVkFURV9GVUxMLAkvKiBDcHUgc2xhYiB3YXMgZnVsbCB3aGVuIGRlYWN0aXZhdGVkICovCkBAIC0zMSw4ICszMiwxMCBAQAogCURFQUNUSVZBVEVfVE9fSEVBRCwJLyogQ3B1IHNsYWIgd2FzIG1vdmVkIHRvIHRoZSBoZWFkIG9mIHBhcnRpYWxzICovCiAJREVBQ1RJVkFURV9UT19UQUlMLAkvKiBDcHUgc2xhYiB3YXMgbW92ZWQgdG8gdGhlIHRhaWwgb2YgcGFydGlhbHMgKi8KIAlERUFDVElWQVRFX1JFTU9URV9GUkVFUywvKiBTbGFiIGNvbnRhaW5lZCByZW1vdGVseSBmcmVlZCBvYmplY3RzICovCisJREVBQ1RJVkFURV9CWVBBU1MsCS8qIEltcGxpY2l0IGRlYWN0aXZhdGlvbiAqLwogCU9SREVSX0ZBTExCQUNLLAkJLyogTnVtYmVyIG9mIHRpbWVzIGZhbGxiYWNrIHdhcyBuZWNlc3NhcnkgKi8KIAlDTVBYQ0hHX0RPVUJMRV9DUFVfRkFJTCwvKiBGYWlsdXJlIG9mIHRoaXNfY3B1X2NtcHhjaGdfZG91YmxlICovCisJQ01QWENIR19ET1VCTEVfRkFJTCwJLyogTnVtYmVyIG9mIHRpbWVzIHRoYXQgY21weGNoZyBkb3VibGUgZGlkIG5vdCBtYXRjaCAqLwogCU5SX1NMVUJfU1RBVF9JVEVNUyB9OwogCiBzdHJ1Y3Qga21lbV9jYWNoZV9jcHUgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zd2Fwb3BzLmggYi9pbmNsdWRlL2xpbnV4L3N3YXBvcHMuaAppbmRleCBjZDQyZTMwLi4yMTg5ZDNmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N3YXBvcHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N3YXBvcHMuaApAQCAtMSwzICsxLDggQEAKKyNpZm5kZWYgX0xJTlVYX1NXQVBPUFNfSAorI2RlZmluZSBfTElOVVhfU1dBUE9QU19ICisKKyNpbmNsdWRlIDxsaW51eC9yYWRpeC10cmVlLmg+CisKIC8qCiAgKiBzd2FwY2FjaGUgcGFnZXMgYXJlIHN0b3JlZCBpbiB0aGUgc3dhcHBlcl9zcGFjZSByYWRpeCB0cmVlLiAgV2Ugd2FudCB0bwogICogZ2V0IGdvb2QgcGFja2luZyBkZW5zaXR5IGluIHRoYXQgdHJlZSwgc28gdGhlIGluZGV4IHNob3VsZCBiZSBkZW5zZSBpbgpAQCAtNzYsNiArODEsMjIgQEAKIAlyZXR1cm4gX19zd3BfZW50cnlfdG9fcHRlKGFyY2hfZW50cnkpOwogfQogCitzdGF0aWMgaW5saW5lIHN3cF9lbnRyeV90IHJhZGl4X3RvX3N3cF9lbnRyeSh2b2lkICphcmcpCit7CisJc3dwX2VudHJ5X3QgZW50cnk7CisKKwllbnRyeS52YWwgPSAodW5zaWduZWQgbG9uZylhcmcgPj4gUkFESVhfVFJFRV9FWENFUFRJT05BTF9TSElGVDsKKwlyZXR1cm4gZW50cnk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqc3dwX3RvX3JhZGl4X2VudHJ5KHN3cF9lbnRyeV90IGVudHJ5KQoreworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisKKwl2YWx1ZSA9IGVudHJ5LnZhbCA8PCBSQURJWF9UUkVFX0VYQ0VQVElPTkFMX1NISUZUOworCXJldHVybiAodm9pZCAqKSh2YWx1ZSB8IFJBRElYX1RSRUVfRVhDRVBUSU9OQUxfRU5UUlkpOworfQorCiAjaWZkZWYgQ09ORklHX01JR1JBVElPTgogc3RhdGljIGlubGluZSBzd3BfZW50cnlfdCBtYWtlX21pZ3JhdGlvbl9lbnRyeShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IHdyaXRlKQogewpAQCAtMTY5LDMgKzE5MCw1IEBACiAJcmV0dXJuIDA7CiB9CiAjZW5kaWYKKworI2VuZGlmIC8qIF9MSU5VWF9TV0FQT1BTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGhlcm1hbC5oIGIvaW5jbHVkZS9saW51eC90aGVybWFsLmgKaW5kZXggZDNlYzg5Zi4uNDdiNGEyNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90aGVybWFsLmgKKysrIGIvaW5jbHVkZS9saW51eC90aGVybWFsLmgKQEAgLTg1LDIyICs4NSw2IEBACiAJCQkJKChsb25nKXQtMjczMis1KS8xMCA6ICgobG9uZyl0LTI3MzItNSkvMTApCiAjZGVmaW5lIENFTFNJVVNfVE9fS0VMVklOKHQpCSgodCkqMTArMjczMikKIAotI2lmIGRlZmluZWQoQ09ORklHX1RIRVJNQUxfSFdNT04pCi0vKiB0aGVybWFsIHpvbmUgZGV2aWNlcyB3aXRoIHRoZSBzYW1lIHR5cGUgc2hhcmUgb25lIGh3bW9uIGRldmljZSAqLwotc3RydWN0IHRoZXJtYWxfaHdtb25fZGV2aWNlIHsKLQljaGFyIHR5cGVbVEhFUk1BTF9OQU1FX0xFTkdUSF07Ci0Jc3RydWN0IGRldmljZSAqZGV2aWNlOwotCWludCBjb3VudDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHR6X2xpc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZCBub2RlOwotfTsKLQotc3RydWN0IHRoZXJtYWxfaHdtb25fYXR0ciB7Ci0Jc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgYXR0cjsKLQljaGFyIG5hbWVbMTZdOwotfTsKLSNlbmRpZgotCiBzdHJ1Y3QgdGhlcm1hbF96b25lX2RldmljZSB7CiAJaW50IGlkOwogCWNoYXIgdHlwZVtUSEVSTUFMX05BTUVfTEVOR1RIXTsKQEAgLTEyMCwxMiArMTA0LDYgQEAKIAlzdHJ1Y3QgbXV0ZXggbG9jazsJLyogcHJvdGVjdCBjb29saW5nIGRldmljZXMgbGlzdCAqLwogCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIHBvbGxfcXVldWU7Ci0jaWYgZGVmaW5lZChDT05GSUdfVEhFUk1BTF9IV01PTikKLQlzdHJ1Y3QgbGlzdF9oZWFkIGh3bW9uX25vZGU7Ci0Jc3RydWN0IHRoZXJtYWxfaHdtb25fZGV2aWNlICpod21vbjsKLQlzdHJ1Y3QgdGhlcm1hbF9od21vbl9hdHRyIHRlbXBfaW5wdXQ7CS8qIGh3bW9uIHN5cyBhdHRyICovCi0Jc3RydWN0IHRoZXJtYWxfaHdtb25fYXR0ciB0ZW1wX2NyaXQ7CS8qIGh3bW9uIHN5cyBhdHRyICovCi0jZW5kaWYKIH07CiAvKiBBZGRpbmcgZXZlbnQgbm90aWZpY2F0aW9uIHN1cHBvcnQgZWxlbWVudHMgKi8KICNkZWZpbmUgVEhFUk1BTF9HRU5MX0ZBTUlMWV9OQU1FICAgICAgICAgICAgICAgICJ0aGVybWFsX2V2ZW50IgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaCBiL2luY2x1ZGUvbGludXgvdmlkZW9kZXYyLmgKaW5kZXggOGE0YzMwOS4uZmNhMjRjYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC92aWRlb2RldjIuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Mi5oCkBAIC0zNzYsNyArMzc2LDE2IEBACiAjZGVmaW5lIFY0TDJfUElYX0ZNVF9NSlBFRyAgICB2NGwyX2ZvdXJjYygnTScsICdKJywgJ1AnLCAnRycpIC8qIE1vdGlvbi1KUEVHICAgKi8KICNkZWZpbmUgVjRMMl9QSVhfRk1UX0pQRUcgICAgIHY0bDJfZm91cmNjKCdKJywgJ1AnLCAnRScsICdHJykgLyogSkZJRiBKUEVHICAgICAqLwogI2RlZmluZSBWNEwyX1BJWF9GTVRfRFYgICAgICAgdjRsMl9mb3VyY2MoJ2QnLCAndicsICdzJywgJ2QnKSAvKiAxMzk0ICAgICAgICAgICovCi0jZGVmaW5lIFY0TDJfUElYX0ZNVF9NUEVHICAgICB2NGwyX2ZvdXJjYygnTScsICdQJywgJ0UnLCAnRycpIC8qIE1QRUctMS8yLzQgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX01QRUcgICAgIHY0bDJfZm91cmNjKCdNJywgJ1AnLCAnRScsICdHJykgLyogTVBFRy0xLzIvNCBNdWx0aXBsZXhlZCAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfSDI2NCAgICAgdjRsMl9mb3VyY2MoJ0gnLCAnMicsICc2JywgJzQnKSAvKiBIMjY0IHdpdGggc3RhcnQgY29kZXMgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0gyNjRfTk9fU0MgdjRsMl9mb3VyY2MoJ0EnLCAnVicsICdDJywgJzEnKSAvKiBIMjY0IHdpdGhvdXQgc3RhcnQgY29kZXMgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX0gyNjMgICAgIHY0bDJfZm91cmNjKCdIJywgJzInLCAnNicsICczJykgLyogSDI2MyAgICAgICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfTVBFRzEgICAgdjRsMl9mb3VyY2MoJ00nLCAnUCcsICdHJywgJzEnKSAvKiBNUEVHLTEgRVMgICAgICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9NUEVHMiAgICB2NGwyX2ZvdXJjYygnTScsICdQJywgJ0cnLCAnMicpIC8qIE1QRUctMiBFUyAgICAgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX01QRUc0ICAgIHY0bDJfZm91cmNjKCdNJywgJ1AnLCAnRycsICc0JykgLyogTVBFRy00IEVTICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfWFZJRCAgICAgdjRsMl9mb3VyY2MoJ1gnLCAnVicsICdJJywgJ0QnKSAvKiBYdmlkICAgICAgICAgICAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfVkMxX0FOTkVYX0cgdjRsMl9mb3VyY2MoJ1YnLCAnQycsICcxJywgJ0cnKSAvKiBTTVBURSA0MjFNIEFubmV4IEcgY29tcGxpYW50IHN0cmVhbSAqLworI2RlZmluZSBWNEwyX1BJWF9GTVRfVkMxX0FOTkVYX0wgdjRsMl9mb3VyY2MoJ1YnLCAnQycsICcxJywgJ0wnKSAvKiBTTVBURSA0MjFNIEFubmV4IEwgY29tcGxpYW50IHN0cmVhbSAqLwogCiAvKiAgVmVuZG9yLXNwZWNpZmljIGZvcm1hdHMgICAqLwogI2RlZmluZSBWNEwyX1BJWF9GTVRfQ1BJQTEgICAgdjRsMl9mb3VyY2MoJ0MnLCAnUCcsICdJJywgJ0EnKSAvKiBjcGlhMSBZVVYgKi8KQEAgLTQwMiw2ICs0MTEsNyBAQAogI2RlZmluZSBWNEwyX1BJWF9GTVRfQ0lUX1lZVllVWSB2NGwyX2ZvdXJjYygnQycsICdJJywgJ1QnLCAnVicpIC8qIG9uZSBsaW5lIG9mIFkgdGhlbiAxIGxpbmUgb2YgVllVWSAqLwogI2RlZmluZSBWNEwyX1BJWF9GTVRfS09OSUNBNDIwICB2NGwyX2ZvdXJjYygnSycsICdPJywgJ04nLCAnSScpIC8qIFlVVjQyMCBwbGFuYXIgaW4gYmxvY2tzIG9mIDI1NiBwaXhlbHMgKi8KICNkZWZpbmUgVjRMMl9QSVhfRk1UX0pQR0wJdjRsMl9mb3VyY2MoJ0onLCAnUCcsICdHJywgJ0wnKSAvKiBKUEVHLUxpdGUgKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1NFNDAxICAgICAgdjRsMl9mb3VyY2MoJ1MnLCAnNCcsICcwJywgJzEnKSAvKiBzZTQwMSBqYW5nZ3UgY29tcHJlc3NlZCByZ2IgKi8KIAogLyoKICAqCUYgTyBSIE0gQSBUICAgRSBOIFUgTSBFIFIgQSBUIEkgTyBOCkBAIC0xMDI2LDYgKzEwMzYsNyBAQAogI2RlZmluZSBWNEwyX0NUUkxfQ0xBU1NfTVBFRyAweDAwOTkwMDAwCS8qIE1QRUctY29tcHJlc3Npb24gY29udHJvbHMgKi8KICNkZWZpbmUgVjRMMl9DVFJMX0NMQVNTX0NBTUVSQSAweDAwOWEwMDAwCS8qIENhbWVyYSBjbGFzcyBjb250cm9scyAqLwogI2RlZmluZSBWNEwyX0NUUkxfQ0xBU1NfRk1fVFggMHgwMDliMDAwMAkvKiBGTSBNb2R1bGF0b3IgY29udHJvbCBjbGFzcyAqLworI2RlZmluZSBWNEwyX0NUUkxfQ0xBU1NfRkxBU0ggMHgwMDljMDAwMAkvKiBDYW1lcmEgZmxhc2ggY29udHJvbHMgKi8KIAogI2RlZmluZSBWNEwyX0NUUkxfSURfTUFTSyAgICAgIAkgICgweDBmZmZmZmZmKQogI2RlZmluZSBWNEwyX0NUUkxfSUQyQ0xBU1MoaWQpICAgICgoaWQpICYgMHgwZmZmMDAwMFVMKQpAQCAtMTAzOSw2ICsxMDUwLDcgQEAKIAlWNEwyX0NUUkxfVFlQRV9JTlRFR0VSNjQgICAgID0gNSwKIAlWNEwyX0NUUkxfVFlQRV9DVFJMX0NMQVNTICAgID0gNiwKIAlWNEwyX0NUUkxfVFlQRV9TVFJJTkcgICAgICAgID0gNywKKwlWNEwyX0NUUkxfVFlQRV9CSVRNQVNLICAgICAgID0gOCwKIH07CiAKIC8qICBVc2VkIGluIHRoZSBWSURJT0NfUVVFUllDVFJMIGlvY3RsIGZvciBxdWVyeWluZyBjb250cm9scyAqLwpAQCAtMTE0NCwxNCArMTE1NiwxOSBAQAogI2RlZmluZSBWNEwyX0NJRF9JTExVTUlOQVRPUlNfMQkJCShWNEwyX0NJRF9CQVNFKzM3KQogI2RlZmluZSBWNEwyX0NJRF9JTExVTUlOQVRPUlNfMgkJCShWNEwyX0NJRF9CQVNFKzM4KQogCisjZGVmaW5lIFY0TDJfQ0lEX01JTl9CVUZGRVJTX0ZPUl9DQVBUVVJFCShWNEwyX0NJRF9CQVNFKzM5KQorI2RlZmluZSBWNEwyX0NJRF9NSU5fQlVGRkVSU19GT1JfT1VUUFVUCQkoVjRMMl9DSURfQkFTRSs0MCkKKwogLyogbGFzdCBDSUQgKyAxICovCi0jZGVmaW5lIFY0TDJfQ0lEX0xBU1RQMSAgICAgICAgICAgICAgICAgICAgICAgICAoVjRMMl9DSURfQkFTRSszOSkKKyNkZWZpbmUgVjRMMl9DSURfTEFTVFAxICAgICAgICAgICAgICAgICAgICAgICAgIChWNEwyX0NJRF9CQVNFKzQxKQorCisvKiBNaW5pbXVtIG51bWJlciBvZiBidWZmZXIgbmVlZGUgYnkgdGhlIGRldmljZSAqLwogCiAvKiAgTVBFRy1jbGFzcyBjb250cm9sIElEcyBkZWZpbmVkIGJ5IFY0TDIgKi8KICNkZWZpbmUgVjRMMl9DSURfTVBFR19CQVNFIAkJCShWNEwyX0NUUkxfQ0xBU1NfTVBFRyB8IDB4OTAwKQogI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NMQVNTIAkJCShWNEwyX0NUUkxfQ0xBU1NfTVBFRyB8IDEpCiAKLS8qICBNUEVHIHN0cmVhbXMgKi8KKy8qICBNUEVHIHN0cmVhbXMsIHNwZWNpZmljIHRvIG11bHRpcGxleGVkIHN0cmVhbXMgKi8KICNkZWZpbmUgVjRMMl9DSURfTVBFR19TVFJFQU1fVFlQRSAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMCkKIGVudW0gdjRsMl9tcGVnX3N0cmVhbV90eXBlIHsKIAlWNEwyX01QRUdfU1RSRUFNX1RZUEVfTVBFRzJfUFMgICA9IDAsIC8qIE1QRUctMiBwcm9ncmFtIHN0cmVhbSAqLwpAQCAtMTE3Myw3ICsxMTkwLDcgQEAKIAlWNEwyX01QRUdfU1RSRUFNX1ZCSV9GTVRfSVZUViA9IDEsICAvKiBWQkkgaW4gcHJpdmF0ZSBwYWNrZXRzLCBJVlRWIGZvcm1hdCAqLwogfTsKIAotLyogIE1QRUcgYXVkaW8gKi8KKy8qICBNUEVHIGF1ZGlvIGNvbnRyb2xzIHNwZWNpZmljIHRvIG11bHRpcGxleGVkIHN0cmVhbXMgICovCiAjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUSAJKFY0TDJfQ0lEX01QRUdfQkFTRSsxMDApCiBlbnVtIHY0bDJfbXBlZ19hdWRpb19zYW1wbGluZ19mcmVxIHsKIAlWNEwyX01QRUdfQVVESU9fU0FNUExJTkdfRlJFUV80NDEwMCA9IDAsCkBAIC0xMjg5LDcgKzEzMDYsNyBAQAogCVY0TDJfTVBFR19BVURJT19BQzNfQklUUkFURV82NDBLID0gMTgsCiB9OwogCi0vKiAgTVBFRyB2aWRlbyAqLworLyogIE1QRUcgdmlkZW8gY29udHJvbHMgc3BlY2lmaWMgdG8gbXVsdGlwbGV4ZWQgc3RyZWFtcyAqLwogI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0VOQ09ESU5HIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDApCiBlbnVtIHY0bDJfbXBlZ192aWRlb19lbmNvZGluZyB7CiAJVjRMMl9NUEVHX1ZJREVPX0VOQ09ESU5HX01QRUdfMSAgICAgPSAwLApAQCAtMTMxNyw2ICsxMzM0LDE0MSBAQAogI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX1RFTVBPUkFMX0RFQ0lNQVRJT04gKFY0TDJfQ0lEX01QRUdfQkFTRSsyMDkpCiAjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVVURSAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjEwKQogI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VVEVfWVVWIAkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMTEpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fREVDT0RFUl9TTElDRV9JTlRFUkZBQ0UJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjEyKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0RFQ09ERVJfTVBFRzRfREVCTE9DS19GSUxURVIJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMTMpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fQ1lDTElDX0lOVFJBX1JFRlJFU0hfTUIJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjE0KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0ZSQU1FX1JDX0VOQUJMRQkJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjE1KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0hFQURFUl9NT0RFCQkJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjE2KQorZW51bSB2NGwyX21wZWdfdmlkZW9faGVhZGVyX21vZGUgeworCVY0TDJfTVBFR19WSURFT19IRUFERVJfTU9ERV9TRVBBUkFURQkJCT0gMCwKKwlWNEwyX01QRUdfVklERU9fSEVBREVSX01PREVfSk9JTkVEX1dJVEhfMVNUX0ZSQU1FCT0gMSwKKworfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NQVhfUkVGX1BJQwkJCShWNEwyX0NJRF9NUEVHX0JBU0UrMjE3KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01CX1JDX0VOQUJMRQkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMTgpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVVMVElfU0xJQ0VfTUFYX0JZVEVTCShWNEwyX0NJRF9NUEVHX0JBU0UrMjE5KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01VTFRJX1NMSUNFX01BWF9NQgkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMjApCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVVMVElfU0xJQ0VfTU9ERQkJKFY0TDJfQ0lEX01QRUdfQkFTRSsyMjEpCitlbnVtIHY0bDJfbXBlZ192aWRlb19tdWx0aV9zbGljZV9tb2RlIHsKKwlWNEwyX01QRUdfVklERU9fTVVMVElfU0xJQ0VfTU9ERV9TSU5HTEUJCT0gMCwKKwlWNEwyX01QRUdfVklERU9fTVVMVElfU0lDRV9NT0RFX01BWF9NQgkJPSAxLAorCVY0TDJfTVBFR19WSURFT19NVUxUSV9TSUNFX01PREVfTUFYX0JZVEVTCT0gMiwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fVkJWX1NJWkUJCQkoVjRMMl9DSURfTVBFR19CQVNFKzIyMikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjYzX0lfRlJBTUVfUVAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzAwKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjNfUF9GUkFNRV9RUAkJKFY0TDJfQ0lEX01QRUdfQkFTRSszMDEpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2M19CX0ZSQU1FX1FQCQkoVjRMMl9DSURfTVBFR19CQVNFKzMwMikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjYzX01JTl9RUAkJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzAzKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjNfTUFYX1FQCQkJKFY0TDJfQ0lEX01QRUdfQkFTRSszMDQpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9JX0ZSQU1FX1FQCQkoVjRMMl9DSURfTVBFR19CQVNFKzM1MCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1BfRlJBTUVfUVAJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzUxKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfQl9GUkFNRV9RUAkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNTIpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9NSU5fUVAJCQkoVjRMMl9DSURfTVBFR19CQVNFKzM1MykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X01BWF9RUAkJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzU0KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfOFg4X1RSQU5TRk9STQkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNTUpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9DUEJfU0laRQkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNTYpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9FTlRST1BZX01PREUJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzU3KQorZW51bSB2NGwyX21wZWdfdmlkZW9faDI2NF9lbnRyb3B5X21vZGUgeworCVY0TDJfTVBFR19WSURFT19IMjY0X0VOVFJPUFlfTU9ERV9DQVZMQwk9IDAsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfRU5UUk9QWV9NT0RFX0NBQkFDCT0gMSwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9JX1BFUklPRAkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNTgpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fSDI2NF9MRVZFTAkJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzU5KQorZW51bSB2NGwyX21wZWdfdmlkZW9faDI2NF9sZXZlbCB7CisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMV8wCT0gMCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8xQgk9IDEsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMV8xCT0gMiwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8xXzIJPSAzLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzFfMwk9IDQsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfMl8wCT0gNSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8yXzEJPSA2LAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzJfMgk9IDcsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTEVWRUxfM18wCT0gOCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9MRVZFTF8zXzEJPSA5LAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzNfMgk9IDEwLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzRfMAk9IDExLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzRfMQk9IDEyLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzRfMgk9IDEzLAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzVfMAk9IDE0LAorCVY0TDJfTVBFR19WSURFT19IMjY0X0xFVkVMXzVfMQk9IDE1LAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX0FMUEhBCShWNEwyX0NJRF9NUEVHX0JBU0UrMzYwKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfTE9PUF9GSUxURVJfQkVUQQkoVjRMMl9DSURfTVBFR19CQVNFKzM2MSkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX01PREUJKFY0TDJfQ0lEX01QRUdfQkFTRSszNjIpCitlbnVtIHY0bDJfbXBlZ192aWRlb19oMjY0X2xvb3BfZmlsdGVyX21vZGUgeworCVY0TDJfTVBFR19WSURFT19IMjY0X0xPT1BfRklMVEVSX01PREVfRU5BQkxFRAkJCQk9IDAsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTE9PUF9GSUxURVJfTU9ERV9ESVNBQkxFRAkJCQk9IDEsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfTE9PUF9GSUxURVJfTU9ERV9ESVNBQkxFRF9BVF9TTElDRV9CT1VOREFSWQk9IDIsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRQkJKFY0TDJfQ0lEX01QRUdfQkFTRSszNjMpCitlbnVtIHY0bDJfbXBlZ192aWRlb19oMjY0X3Byb2ZpbGUgeworCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfQkFTRUxJTkUJCQk9IDAsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9DT05TVFJBSU5FRF9CQVNFTElORQk9IDEsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9NQUlOCQkJPSAyLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfRVhURU5ERUQJCQk9IDMsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdICQkJPSA0LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF8xMAkJCT0gNSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX0hJR0hfNDIyCQkJPSA2LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF80NDRfUFJFRElDVElWRQk9IDcsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIXzEwX0lOVFJBCQk9IDgsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9ISUdIXzQyMl9JTlRSQQkJPSA5LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1BST0ZJTEVfSElHSF80NDRfSU5UUkEJCT0gMTAsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9DQVZMQ180NDRfSU5UUkEJCT0gMTEsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9TQ0FMQUJMRV9CQVNFTElORQkJPSAxMiwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX1NDQUxBQkxFX0hJR0gJCT0gMTMsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9TQ0FMQUJMRV9ISUdIX0lOVFJBCT0gMTQsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfUFJPRklMRV9TVEVSRU9fSElHSAkJPSAxNSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9QUk9GSUxFX01VTFRJVklFV19ISUdICQk9IDE2LAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1ZVSV9FWFRfU0FSX0hFSUdIVAkoVjRMMl9DSURfTVBFR19CQVNFKzM2NCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19IMjY0X1ZVSV9FWFRfU0FSX1dJRFRICShWNEwyX0NJRF9NUEVHX0JBU0UrMzY1KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9FTkFCTEUJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzY2KQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JREMJCShWNEwyX0NJRF9NUEVHX0JBU0UrMzY3KQorZW51bSB2NGwyX21wZWdfdmlkZW9faDI2NF92dWlfc2FyX2lkYyB7CisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfVU5TUEVDSUZJRUQJPSAwLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzF4MQkJPSAxLAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzEyeDExCQk9IDIsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMTB4MTEJCT0gMywKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18xNngxMQkJPSA0LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzQweDMzCQk9IDUsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfMjR4MTEJCT0gNiwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18yMHgxMQkJPSA3LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzMyeDExCQk9IDgsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfODB4MzMJCT0gOSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18xOHgxMQkJPSAxMCwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18xNXgxMQkJPSAxMSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ182NHgzMwkJPSAxMiwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18xNjB4OTkJCT0gMTMsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfNHgzCQk9IDE0LAorCVY0TDJfTVBFR19WSURFT19IMjY0X1ZVSV9TQVJfSURDXzN4MgkJPSAxNSwKKwlWNEwyX01QRUdfVklERU9fSDI2NF9WVUlfU0FSX0lEQ18yeDEJCT0gMTYsCisJVjRMMl9NUEVHX1ZJREVPX0gyNjRfVlVJX1NBUl9JRENfRVhURU5ERUQJPSAxNywKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfSV9GUkFNRV9RUAkoVjRMMl9DSURfTVBFR19CQVNFKzQwMCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9QX0ZSQU1FX1FQCShWNEwyX0NJRF9NUEVHX0JBU0UrNDAxKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X0JfRlJBTUVfUVAJKFY0TDJfQ0lEX01QRUdfQkFTRSs0MDIpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfTUlOX1FQCShWNEwyX0NJRF9NUEVHX0JBU0UrNDAzKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX1ZJREVPX01QRUc0X01BWF9RUAkoVjRMMl9DSURfTVBFR19CQVNFKzQwNCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9MRVZFTAkJKFY0TDJfQ0lEX01QRUdfQkFTRSs0MDUpCitlbnVtIHY0bDJfbXBlZ192aWRlb19tcGVnNF9sZXZlbCB7CisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzAJPSAwLAorCVY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF8wQgk9IDEsCisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzEJPSAyLAorCVY0TDJfTVBFR19WSURFT19NUEVHNF9MRVZFTF8yCT0gMywKKwlWNEwyX01QRUdfVklERU9fTVBFRzRfTEVWRUxfMwk9IDQsCisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzNCCT0gNSwKKwlWNEwyX01QRUdfVklERU9fTVBFRzRfTEVWRUxfNAk9IDYsCisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X0xFVkVMXzUJPSA3LAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19WSURFT19NUEVHNF9QUk9GSUxFCShWNEwyX0NJRF9NUEVHX0JBU0UrNDA2KQorZW51bSB2NGwyX21wZWdfdmlkZW9fbXBlZzRfcHJvZmlsZSB7CisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEVfU0lNUExFCQkJCT0gMCwKKwlWNEwyX01QRUdfVklERU9fTVBFRzRfUFJPRklMRV9BRFZBTkNFRF9TSU1QTEUJCQk9IDEsCisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEVfQ09SRQkJCQk9IDIsCisJVjRMMl9NUEVHX1ZJREVPX01QRUc0X1BST0ZJTEVfU0lNUExFX1NDQUxBQkxFCQkJPSAzLAorCVY0TDJfTVBFR19WSURFT19NUEVHNF9QUk9GSUxFX0FEVkFOQ0VEX0NPRElOR19FRkZJQ0lFTkNZCT0gNCwKK307CisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfVklERU9fTVBFRzRfUVBFTAkJKFY0TDJfQ0lEX01QRUdfQkFTRSs0MDcpCiAKIC8qICBNUEVHLWNsYXNzIGNvbnRyb2wgSURzIHNwZWNpZmljIHRvIHRoZSBDWDIzNDF4IGRyaXZlciBhcyBkZWZpbmVkIGJ5IFY0TDIgKi8KICNkZWZpbmUgVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UgCQkJCShWNEwyX0NUUkxfQ0xBU1NfTVBFRyB8IDB4MTAwMCkKQEAgLTEzNTksNiArMTUxMSwzMyBAQAogI2RlZmluZSBWNEwyX0NJRF9NUEVHX0NYMjM0MVhfVklERU9fQ0hST01BX01FRElBTl9GSUxURVJfVE9QIAkoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrMTApCiAjZGVmaW5lIFY0TDJfQ0lEX01QRUdfQ1gyMzQxWF9TVFJFQU1fSU5TRVJUX05BVl9QQUNLRVRTIAkoVjRMMl9DSURfTVBFR19DWDIzNDFYX0JBU0UrMTEpCiAKKy8qICBNUEVHLWNsYXNzIGNvbnRyb2wgSURzIHNwZWNpZmljIHRvIHRoZSBTYW1zdW5nIE1GQyA1LjEgZHJpdmVyIGFzIGRlZmluZWQgYnkgVjRMMiAqLworI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UJCQkJKFY0TDJfQ1RSTF9DTEFTU19NUEVHIHwgMHgxMTAwKQorCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fREVDT0RFUl9IMjY0X0RJU1BMQVlfREVMQVkJCShWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UrMCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19ERUNPREVSX0gyNjRfRElTUExBWV9ERUxBWV9FTkFCTEUJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSsxKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0ZSQU1FX1NLSVBfTU9ERQkJCShWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UrMikKK2VudW0gdjRsMl9tcGVnX21mYzUxX3ZpZGVvX2ZyYW1lX3NraXBfbW9kZSB7CisJVjRMMl9NUEVHX01GQzUxX1ZJREVPX0ZSQU1FX1NLSVBfTU9ERV9ESVNBQkxFRAkJPSAwLAorCVY0TDJfTVBFR19NRkM1MV9WSURFT19GUkFNRV9TS0lQX01PREVfTEVWRUxfTElNSVQJPSAxLAorCVY0TDJfTVBFR19NRkM1MV9WSURFT19GUkFNRV9TS0lQX01PREVfQlVGX0xJTUlUCQk9IDIsCit9OworI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0ZPUkNFX0ZSQU1FX1RZUEUJCQkoVjRMMl9DSURfTVBFR19NRkM1MV9CQVNFKzMpCitlbnVtIHY0bDJfbXBlZ19tZmM1MV92aWRlb19mb3JjZV9mcmFtZV90eXBlIHsKKwlWNEwyX01QRUdfTUZDNTFfVklERU9fRk9SQ0VfRlJBTUVfVFlQRV9ESVNBQkxFRAkJPSAwLAorCVY0TDJfTVBFR19NRkM1MV9WSURFT19GT1JDRV9GUkFNRV9UWVBFX0lfRlJBTUUJCT0gMSwKKwlWNEwyX01QRUdfTUZDNTFfVklERU9fRk9SQ0VfRlJBTUVfVFlQRV9OT1RfQ09ERUQJPSAyLAorfTsKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19QQURESU5HCQkJCShWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UrNCkKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19QQURESU5HX1lVVgkJCQkoVjRMMl9DSURfTVBFR19NRkM1MV9CQVNFKzUpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fUkNfRklYRURfVEFSR0VUX0JJVAkJCShWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UrNikKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19SQ19SRUFDVElPTl9DT0VGRgkJCShWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UrNykKKyNkZWZpbmUgVjRMMl9DSURfTVBFR19NRkM1MV9WSURFT19IMjY0X0FEQVBUSVZFX1JDX0FDVElWSVRZCQkoVjRMMl9DSURfTVBFR19NRkM1MV9CQVNFKzUwKQorI2RlZmluZSBWNEwyX0NJRF9NUEVHX01GQzUxX1ZJREVPX0gyNjRfQURBUFRJVkVfUkNfREFSSwkJCShWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UrNTEpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fSDI2NF9BREFQVElWRV9SQ19TTU9PVEgJCShWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UrNTIpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fSDI2NF9BREFQVElWRV9SQ19TVEFUSUMJCShWNEwyX0NJRF9NUEVHX01GQzUxX0JBU0UrNTMpCisjZGVmaW5lIFY0TDJfQ0lEX01QRUdfTUZDNTFfVklERU9fSDI2NF9OVU1fUkVGX1BJQ19GT1JfUAkJKFY0TDJfQ0lEX01QRUdfTUZDNTFfQkFTRSs1NCkKKwogLyogIENhbWVyYSBjbGFzcyBjb250cm9sIElEcyAqLwogI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSAJKFY0TDJfQ1RSTF9DTEFTU19DQU1FUkEgfCAweDkwMCkKICNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX0NMQVNTIAkJKFY0TDJfQ1RSTF9DTEFTU19DQU1FUkEgfCAxKQpAQCAtMTQyNyw2ICsxNjA2LDQxIEBACiAjZGVmaW5lIFY0TDJfQ0lEX1RVTkVfUE9XRVJfTEVWRUwJCShWNEwyX0NJRF9GTV9UWF9DTEFTU19CQVNFICsgMTEzKQogI2RlZmluZSBWNEwyX0NJRF9UVU5FX0FOVEVOTkFfQ0FQQUNJVE9SCQkoVjRMMl9DSURfRk1fVFhfQ0xBU1NfQkFTRSArIDExNCkKIAorLyogRmxhc2ggYW5kIHByaXZhY3kgKGluZGljYXRvcikgbGlnaHQgY29udHJvbHMgKi8KKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfQ0xBU1NfQkFTRQkJKFY0TDJfQ1RSTF9DTEFTU19GTEFTSCB8IDB4OTAwKQorI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9DTEFTUwkJCShWNEwyX0NUUkxfQ0xBU1NfRkxBU0ggfCAxKQorCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX0xFRF9NT0RFCQkJKFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UgKyAxKQorZW51bSB2NGwyX2ZsYXNoX2xlZF9tb2RlIHsKKwlWNEwyX0ZMQVNIX0xFRF9NT0RFX05PTkUsCisJVjRMMl9GTEFTSF9MRURfTU9ERV9GTEFTSCwKKwlWNEwyX0ZMQVNIX0xFRF9NT0RFX1RPUkNILAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9TVFJPQkVfU09VUkNFCQkoVjRMMl9DSURfRkxBU0hfQ0xBU1NfQkFTRSArIDIpCitlbnVtIHY0bDJfZmxhc2hfc3Ryb2JlX3NvdXJjZSB7CisJVjRMMl9GTEFTSF9TVFJPQkVfU09VUkNFX1NPRlRXQVJFLAorCVY0TDJfRkxBU0hfU1RST0JFX1NPVVJDRV9FWFRFUk5BTCwKK307CisKKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfU1RST0JFCQkJKFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UgKyAzKQorI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9TVFJPQkVfU1RPUAkJKFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UgKyA0KQorI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9TVFJPQkVfU1RBVFVTCQkoVjRMMl9DSURfRkxBU0hfQ0xBU1NfQkFTRSArIDUpCisKKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfVElNRU9VVAkJCShWNEwyX0NJRF9GTEFTSF9DTEFTU19CQVNFICsgNikKKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfSU5URU5TSVRZCQkoVjRMMl9DSURfRkxBU0hfQ0xBU1NfQkFTRSArIDcpCisjZGVmaW5lIFY0TDJfQ0lEX0ZMQVNIX1RPUkNIX0lOVEVOU0lUWQkJKFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UgKyA4KQorI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9JTkRJQ0FUT1JfSU5URU5TSVRZCShWNEwyX0NJRF9GTEFTSF9DTEFTU19CQVNFICsgOSkKKworI2RlZmluZSBWNEwyX0NJRF9GTEFTSF9GQVVMVAkJCShWNEwyX0NJRF9GTEFTSF9DTEFTU19CQVNFICsgMTApCisjZGVmaW5lIFY0TDJfRkxBU0hfRkFVTFRfT1ZFUl9WT0xUQUdFCQkoMSA8PCAwKQorI2RlZmluZSBWNEwyX0ZMQVNIX0ZBVUxUX1RJTUVPVVQJCSgxIDw8IDEpCisjZGVmaW5lIFY0TDJfRkxBU0hfRkFVTFRfT1ZFUl9URU1QRVJBVFVSRQkoMSA8PCAyKQorI2RlZmluZSBWNEwyX0ZMQVNIX0ZBVUxUX1NIT1JUX0NJUkNVSVQJCSgxIDw8IDMpCisKKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfQ0hBUkdFCQkJKFY0TDJfQ0lEX0ZMQVNIX0NMQVNTX0JBU0UgKyAxMSkKKyNkZWZpbmUgVjRMMl9DSURfRkxBU0hfUkVBRFkJCQkoVjRMMl9DSURfRkxBU0hfQ0xBU1NfQkFTRSArIDEyKQorCiAvKgogICoJVCBVIE4gSSBOIEcKICAqLwpAQCAtMTc5MSw2ICsyMDA1LDcgQEAKICNkZWZpbmUgVjRMMl9FVkVOVF9BTEwJCQkJMAogI2RlZmluZSBWNEwyX0VWRU5UX1ZTWU5DCQkJMQogI2RlZmluZSBWNEwyX0VWRU5UX0VPUwkJCQkyCisjZGVmaW5lIFY0TDJfRVZFTlRfQ1RSTAkJCQkzCiAjZGVmaW5lIFY0TDJfRVZFTlRfUFJJVkFURV9TVEFSVAkJMHgwODAwMDAwMAogCiAvKiBQYXlsb2FkIGZvciBWNEwyX0VWRU5UX1ZTWU5DICovCkBAIC0xNzk5LDIxICsyMDE0LDQ2IEBACiAJX191OCBmaWVsZDsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCisvKiBQYXlsb2FkIGZvciBWNEwyX0VWRU5UX0NUUkwgKi8KKyNkZWZpbmUgVjRMMl9FVkVOVF9DVFJMX0NIX1ZBTFVFCQkoMSA8PCAwKQorI2RlZmluZSBWNEwyX0VWRU5UX0NUUkxfQ0hfRkxBR1MJCSgxIDw8IDEpCisKK3N0cnVjdCB2NGwyX2V2ZW50X2N0cmwgeworCV9fdTMyIGNoYW5nZXM7CisJX191MzIgdHlwZTsKKwl1bmlvbiB7CisJCV9fczMyIHZhbHVlOworCQlfX3M2NCB2YWx1ZTY0OworCX07CisJX191MzIgZmxhZ3M7CisJX19zMzIgbWluaW11bTsKKwlfX3MzMiBtYXhpbXVtOworCV9fczMyIHN0ZXA7CisJX19zMzIgZGVmYXVsdF92YWx1ZTsKK307CisKIHN0cnVjdCB2NGwyX2V2ZW50IHsKIAlfX3UzMgkJCQl0eXBlOwogCXVuaW9uIHsKIAkJc3RydWN0IHY0bDJfZXZlbnRfdnN5bmMgdnN5bmM7CisJCXN0cnVjdCB2NGwyX2V2ZW50X2N0cmwJY3RybDsKIAkJX191OAkJCWRhdGFbNjRdOwogCX0gdTsKIAlfX3UzMgkJCQlwZW5kaW5nOwogCV9fdTMyCQkJCXNlcXVlbmNlOwogCXN0cnVjdCB0aW1lc3BlYwkJCXRpbWVzdGFtcDsKLQlfX3UzMgkJCQlyZXNlcnZlZFs5XTsKKwlfX3UzMgkJCQlpZDsKKwlfX3UzMgkJCQlyZXNlcnZlZFs4XTsKIH07CiAKKyNkZWZpbmUgVjRMMl9FVkVOVF9TVUJfRkxfU0VORF9JTklUSUFMCQkoMSA8PCAwKQorI2RlZmluZSBWNEwyX0VWRU5UX1NVQl9GTF9BTExPV19GRUVEQkFDSwkoMSA8PCAxKQorCiBzdHJ1Y3QgdjRsMl9ldmVudF9zdWJzY3JpcHRpb24gewogCV9fdTMyCQkJCXR5cGU7Ci0JX191MzIJCQkJcmVzZXJ2ZWRbN107CisJX191MzIJCQkJaWQ7CisJX191MzIJCQkJZmxhZ3M7CisJX191MzIJCQkJcmVzZXJ2ZWRbNV07CiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC93YXRjaGRvZy5oIGIvaW5jbHVkZS9saW51eC93YXRjaGRvZy5oCmluZGV4IDAxMWJjZmUuLjExMTg0M2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvd2F0Y2hkb2cuaAorKysgYi9pbmNsdWRlL2xpbnV4L3dhdGNoZG9nLmgKQEAgLTU5LDYgKzU5LDg0IEBACiAjZGVmaW5lIFdBVENIRE9HX05PV0FZT1VUCTAKICNlbmRpZgogCitzdHJ1Y3Qgd2F0Y2hkb2dfb3BzOworc3RydWN0IHdhdGNoZG9nX2RldmljZTsKKworLyoqIHN0cnVjdCB3YXRjaGRvZ19vcHMgLSBUaGUgd2F0Y2hkb2ctZGV2aWNlcyBvcGVyYXRpb25zCisgKgorICogQG93bmVyOglUaGUgbW9kdWxlIG93bmVyLgorICogQHN0YXJ0OglUaGUgcm91dGluZSBmb3Igc3RhcnRpbmcgdGhlIHdhdGNoZG9nIGRldmljZS4KKyAqIEBzdG9wOglUaGUgcm91dGluZSBmb3Igc3RvcHBpbmcgdGhlIHdhdGNoZG9nIGRldmljZS4KKyAqIEBwaW5nOglUaGUgcm91dGluZSB0aGF0IHNlbmRzIGEga2VlcGFsaXZlIHBpbmcgdG8gdGhlIHdhdGNoZG9nIGRldmljZS4KKyAqIEBzdGF0dXM6CVRoZSByb3V0aW5lIHRoYXQgc2hvd3MgdGhlIHN0YXR1cyBvZiB0aGUgd2F0Y2hkb2cgZGV2aWNlLgorICogQHNldF90aW1lb3V0OlRoZSByb3V0aW5lIGZvciBzZXR0aW5nIHRoZSB3YXRjaGRvZyBkZXZpY2VzIHRpbWVvdXQgdmFsdWUuCisgKiBAaW9jdGw6CVRoZSByb3V0aW5lcyB0aGF0IGhhbmRsZXMgZXh0cmEgaW9jdGwgY2FsbHMuCisgKgorICogVGhlIHdhdGNoZG9nX29wcyBzdHJ1Y3R1cmUgY29udGFpbnMgYSBsaXN0IG9mIGxvdy1sZXZlbCBvcGVyYXRpb25zCisgKiB0aGF0IGNvbnRyb2wgYSB3YXRjaGRvZyBkZXZpY2UuIEl0IGFsc28gY29udGFpbnMgdGhlIG1vZHVsZSB0aGF0IG93bnMKKyAqIHRoZXNlIG9wZXJhdGlvbnMuIFRoZSBzdGFydCBhbmQgc3RvcCBmdW5jdGlvbiBhcmUgbWFuZGF0b3J5LCBhbGwgb3RoZXIKKyAqIGZ1bmN0aW9ucyBhcmUgb3B0b25hbC4KKyAqLworc3RydWN0IHdhdGNoZG9nX29wcyB7CisJc3RydWN0IG1vZHVsZSAqb3duZXI7CisJLyogbWFuZGF0b3J5IG9wZXJhdGlvbnMgKi8KKwlpbnQgKCpzdGFydCkoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqKTsKKwlpbnQgKCpzdG9wKShzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICopOworCS8qIG9wdGlvbmFsIG9wZXJhdGlvbnMgKi8KKwlpbnQgKCpwaW5nKShzdHJ1Y3Qgd2F0Y2hkb2dfZGV2aWNlICopOworCXVuc2lnbmVkIGludCAoKnN0YXR1cykoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqKTsKKwlpbnQgKCpzZXRfdGltZW91dCkoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqLCB1bnNpZ25lZCBpbnQpOworCWxvbmcgKCppb2N0bCkoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqLCB1bnNpZ25lZCBpbnQsIHVuc2lnbmVkIGxvbmcpOworfTsKKworLyoqIHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgLSBUaGUgc3RydWN0dXJlIHRoYXQgZGVmaW5lcyBhIHdhdGNoZG9nIGRldmljZQorICoKKyAqIEBpbmZvOglQb2ludGVyIHRvIGEgd2F0Y2hkb2dfaW5mbyBzdHJ1Y3R1cmUuCisgKiBAb3BzOglQb2ludGVyIHRvIHRoZSBsaXN0IG9mIHdhdGNoZG9nIG9wZXJhdGlvbnMuCisgKiBAYm9vdHN0YXR1czoJU3RhdHVzIG9mIHRoZSB3YXRjaGRvZyBkZXZpY2UgYXQgYm9vdC4KKyAqIEB0aW1lb3V0OglUaGUgd2F0Y2hkb2cgZGV2aWNlcyB0aW1lb3V0IHZhbHVlLgorICogQG1pbl90aW1lb3V0OlRoZSB3YXRjaGRvZyBkZXZpY2VzIG1pbmltdW0gdGltZW91dCB2YWx1ZS4KKyAqIEBtYXhfdGltZW91dDpUaGUgd2F0Y2hkb2cgZGV2aWNlcyBtYXhpbXVtIHRpbWVvdXQgdmFsdWUuCisgKiBAZHJpdmVyLWRhdGE6UG9pbnRlciB0byB0aGUgZHJpdmVycyBwcml2YXRlIGRhdGEuCisgKiBAc3RhdHVzOglGaWVsZCB0aGF0IGNvbnRhaW5zIHRoZSBkZXZpY2VzIGludGVybmFsIHN0YXR1cyBiaXRzLgorICoKKyAqIFRoZSB3YXRjaGRvZ19kZXZpY2Ugc3RydWN0dXJlIGNvbnRhaW5zIGFsbCBpbmZvcm1hdGlvbiBhYm91dCBhCisgKiB3YXRjaGRvZyB0aW1lciBkZXZpY2UuCisgKgorICogVGhlIGRyaXZlci1kYXRhIGZpZWxkIG1heSBub3QgYmUgYWNjZXNzZWQgZGlyZWN0bHkuIEl0IG11c3QgYmUgYWNjZXNzZWQKKyAqIHZpYSB0aGUgd2F0Y2hkb2dfc2V0X2RydmRhdGEgYW5kIHdhdGNoZG9nX2dldF9kcnZkYXRhIGhlbHBlcnMuCisgKi8KK3N0cnVjdCB3YXRjaGRvZ19kZXZpY2UgeworCWNvbnN0IHN0cnVjdCB3YXRjaGRvZ19pbmZvICppbmZvOworCWNvbnN0IHN0cnVjdCB3YXRjaGRvZ19vcHMgKm9wczsKKwl1bnNpZ25lZCBpbnQgYm9vdHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgdGltZW91dDsKKwl1bnNpZ25lZCBpbnQgbWluX3RpbWVvdXQ7CisJdW5zaWduZWQgaW50IG1heF90aW1lb3V0OworCXZvaWQgKmRyaXZlcl9kYXRhOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworLyogQml0IG51bWJlcnMgZm9yIHN0YXR1cyBmbGFncyAqLworI2RlZmluZSBXRE9HX0FDVElWRQkJMAkvKiBJcyB0aGUgd2F0Y2hkb2cgcnVubmluZy9hY3RpdmUgKi8KKyNkZWZpbmUgV0RPR19ERVZfT1BFTgkJMQkvKiBPcGVuZWQgdmlhIC9kZXYvd2F0Y2hkb2cgPyAqLworI2RlZmluZSBXRE9HX0FMTE9XX1JFTEVBU0UJMgkvKiBEaWQgd2UgcmVjZWl2ZSB0aGUgbWFnaWMgY2hhciA/ICovCisjZGVmaW5lIFdET0dfTk9fV0FZX09VVAkJMwkvKiBJcyAnbm93YXlvdXQnIGZlYXR1cmUgc2V0ID8gKi8KK307CisKKy8qIFVzZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIHdhdGNoZG9nIGRyaXZlciBzcGVjaWZpYyBkYXRhICovCitzdGF0aWMgaW5saW5lIHZvaWQgd2F0Y2hkb2dfc2V0X2RydmRhdGEoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqd2RkLCB2b2lkICpkYXRhKQoreworCXdkZC0+ZHJpdmVyX2RhdGEgPSBkYXRhOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgKndhdGNoZG9nX2dldF9kcnZkYXRhKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKndkZCkKK3sKKwlyZXR1cm4gd2RkLT5kcml2ZXJfZGF0YTsKK30KKworLyogZHJpdmVycy93YXRjaGRvZy9jb3JlL3dhdGNoZG9nX2NvcmUuYyAqLworZXh0ZXJuIGludCB3YXRjaGRvZ19yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IHdhdGNoZG9nX2RldmljZSAqKTsKK2V4dGVybiB2b2lkIHdhdGNoZG9nX3VucmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCB3YXRjaGRvZ19kZXZpY2UgKik7CisKICNlbmRpZgkvKiBfX0tFUk5FTF9fICovCiAKICNlbmRpZiAgLyogaWZuZGVmIF9MSU5VWF9XQVRDSERPR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL2FkcDE2NTMuaCBiL2luY2x1ZGUvbWVkaWEvYWRwMTY1My5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYTFhZjgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL2FkcDE2NTMuaApAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIGluY2x1ZGUvbWVkaWEvYWRwMTY1My5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4LS0yMDExIE5va2lhIENvcnBvcmF0aW9uCisgKgorICogQ29udGFjdDogU2FrYXJpIEFpbHVzIDxzYWthcmkuYWlsdXNAbWF4d2VsbC5yZXNlYXJjaC5ub2tpYS5jb20+CisgKgorICogQ29udHJpYnV0b3JzOgorICoJU2FrYXJpIEFpbHVzIDxzYWthcmkuYWlsdXNAbWF4d2VsbC5yZXNlYXJjaC5ub2tpYS5jb20+CisgKglUdXVra2EgVG9pdm9uZW4gPHR1dWtrYXQ3NkBnbWFpbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICoKKyAqLworCisjaWZuZGVmIEFEUDE2NTNfSAorI2RlZmluZSBBRFAxNjUzX0gKKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jdHJscy5oPgorI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+CisKKyNkZWZpbmUgQURQMTY1M19OQU1FCQkJCSJhZHAxNjUzIgorI2RlZmluZSBBRFAxNjUzX0kyQ19BRERSCQkJKDB4NjAgPj4gMSkKKworLyogUmVnaXN0ZXIgZGVmaW5pdGlvbnMgKi8KKyNkZWZpbmUgQURQMTY1M19SRUdfT1VUX1NFTAkJCTB4MDAKKyNkZWZpbmUgQURQMTY1M19SRUdfT1VUX1NFTF9IUExFRF9UT1JDSF9NSU4JMHgwMQorI2RlZmluZSBBRFAxNjUzX1JFR19PVVRfU0VMX0hQTEVEX1RPUkNIX01BWAkweDBiCisjZGVmaW5lIEFEUDE2NTNfUkVHX09VVF9TRUxfSFBMRURfRkxBU0hfTUlOCTB4MGMKKyNkZWZpbmUgQURQMTY1M19SRUdfT1VUX1NFTF9IUExFRF9GTEFTSF9NQVgJMHgxZgorI2RlZmluZSBBRFAxNjUzX1JFR19PVVRfU0VMX0hQTEVEX1NISUZUCQkzCisjZGVmaW5lIEFEUDE2NTNfUkVHX09VVF9TRUxfSUxFRF9NQVgJCTB4MDcKKyNkZWZpbmUgQURQMTY1M19SRUdfT1VUX1NFTF9JTEVEX1NISUZUCQkwCisKKyNkZWZpbmUgQURQMTY1M19SRUdfQ09ORklHCQkJMHgwMQorI2RlZmluZSBBRFAxNjUzX1JFR19DT05GSUdfVE1SX0NGRwkJKDEgPDwgNCkKKyNkZWZpbmUgQURQMTY1M19SRUdfQ09ORklHX1RNUl9TRVRfTUFYCQkweDBmCisjZGVmaW5lIEFEUDE2NTNfUkVHX0NPTkZJR19UTVJfU0VUX1NISUZUCTAKKworI2RlZmluZSBBRFAxNjUzX1JFR19TV19TVFJPQkUJCQkweDAyCisjZGVmaW5lIEFEUDE2NTNfUkVHX1NXX1NUUk9CRV9TV19TVFJPQkUJCSgxIDw8IDApCisKKyNkZWZpbmUgQURQMTY1M19SRUdfRkFVTFQJCQkweDAzCisjZGVmaW5lIEFEUDE2NTNfUkVHX0ZBVUxUX0ZMVF9TQ1AJCSgxIDw8IDMpCisjZGVmaW5lIEFEUDE2NTNfUkVHX0ZBVUxUX0ZMVF9PVAkJKDEgPDwgMikKKyNkZWZpbmUgQURQMTY1M19SRUdfRkFVTFRfRkxUX1RNUgkJKDEgPDwgMSkKKyNkZWZpbmUgQURQMTY1M19SRUdfRkFVTFRfRkxUX09WCQkoMSA8PCAwKQorCisjZGVmaW5lIEFEUDE2NTNfSU5ESUNBVE9SX0lOVEVOU0lUWV9NSU4JCTAKKyNkZWZpbmUgQURQMTY1M19JTkRJQ0FUT1JfSU5URU5TSVRZX1NURVAJMjUwMAorI2RlZmluZSBBRFAxNjUzX0lORElDQVRPUl9JTlRFTlNJVFlfTUFYCQlcCisJKEFEUDE2NTNfUkVHX09VVF9TRUxfSUxFRF9NQVggKiBBRFAxNjUzX0lORElDQVRPUl9JTlRFTlNJVFlfU1RFUCkKKyNkZWZpbmUgQURQMTY1M19JTkRJQ0FUT1JfSU5URU5TSVRZX3VBX1RPX1JFRyhhKSBcCisJKChhKSAvIEFEUDE2NTNfSU5ESUNBVE9SX0lOVEVOU0lUWV9TVEVQKQorI2RlZmluZSBBRFAxNjUzX0lORElDQVRPUl9JTlRFTlNJVFlfUkVHX1RPX3VBKGEpIFwKKwkoKGEpICogQURQMTY1M19JTkRJQ0FUT1JfSU5URU5TSVRZX1NURVApCisKKyNkZWZpbmUgQURQMTY1M19GTEFTSF9JTlRFTlNJVFlfQkFTRQkJMzUKKyNkZWZpbmUgQURQMTY1M19GTEFTSF9JTlRFTlNJVFlfU1RFUAkJMTUKKyNkZWZpbmUgQURQMTY1M19GTEFTSF9JTlRFTlNJVFlfTUlOCQkJCQlcCisJKEFEUDE2NTNfRkxBU0hfSU5URU5TSVRZX0JBU0UJCQkJCVwKKwkgKyBBRFAxNjUzX1JFR19PVVRfU0VMX0hQTEVEX0ZMQVNIX01JTiAqIEFEUDE2NTNfRkxBU0hfSU5URU5TSVRZX1NURVApCisjZGVmaW5lIEFEUDE2NTNfRkxBU0hfSU5URU5TSVRZX01BWAkJCVwKKwkoQURQMTY1M19GTEFTSF9JTlRFTlNJVFlfTUlOICsJCQlcCisJIChBRFAxNjUzX1JFR19PVVRfU0VMX0hQTEVEX0ZMQVNIX01BWCAtCQlcCisJICBBRFAxNjUzX1JFR19PVVRfU0VMX0hQTEVEX0ZMQVNIX01JTiArIDEpICoJXAorCSBBRFAxNjUzX0ZMQVNIX0lOVEVOU0lUWV9TVEVQKQorCisjZGVmaW5lIEFEUDE2NTNfRkxBU0hfSU5URU5TSVRZX21BX1RPX1JFRyhhKQkJCQlcCisJKChhKSA8IEFEUDE2NTNfRkxBU0hfSU5URU5TSVRZX0JBU0UgPyAwIDoJCQlcCisJICgoKGEpIC0gQURQMTY1M19GTEFTSF9JTlRFTlNJVFlfQkFTRSkgLyBBRFAxNjUzX0ZMQVNIX0lOVEVOU0lUWV9TVEVQKSkKKyNkZWZpbmUgQURQMTY1M19GTEFTSF9JTlRFTlNJVFlfUkVHX1RPX21BKGEpCQlcCisJKChhKSAqIEFEUDE2NTNfRkxBU0hfSU5URU5TSVRZX1NURVAgKyBBRFAxNjUzX0ZMQVNIX0lOVEVOU0lUWV9CQVNFKQorCisjZGVmaW5lIEFEUDE2NTNfVE9SQ0hfSU5URU5TSVRZX01JTgkJCQkJXAorCShBRFAxNjUzX0ZMQVNIX0lOVEVOU0lUWV9CQVNFCQkJCQlcCisJICsgQURQMTY1M19SRUdfT1VUX1NFTF9IUExFRF9UT1JDSF9NSU4gKiBBRFAxNjUzX0ZMQVNIX0lOVEVOU0lUWV9TVEVQKQorI2RlZmluZSBBRFAxNjUzX1RPUkNIX0lOVEVOU0lUWV9NQVgJCQlcCisJKEFEUDE2NTNfVE9SQ0hfSU5URU5TSVRZX01JTiArCQkJXAorCSAoQURQMTY1M19SRUdfT1VUX1NFTF9IUExFRF9UT1JDSF9NQVggLQkJXAorCSAgQURQMTY1M19SRUdfT1VUX1NFTF9IUExFRF9UT1JDSF9NSU4gKyAxKSAqCVwKKwkgQURQMTY1M19GTEFTSF9JTlRFTlNJVFlfU1RFUCkKKworc3RydWN0IGFkcDE2NTNfcGxhdGZvcm1fZGF0YSB7CisJaW50ICgqcG93ZXIpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIGludCBvbik7CisKKwl1MzIgbWF4X2ZsYXNoX3RpbWVvdXQ7CQkvKiBmbGFzaCBsaWdodCB0aW1lb3V0IGluIHVzICovCisJdTMyIG1heF9mbGFzaF9pbnRlbnNpdHk7CS8qIGxlZCBpbnRlbnNpdHksIGZsYXNoIG1vZGUgKi8KKwl1MzIgbWF4X3RvcmNoX2ludGVuc2l0eTsJLyogbGVkIGludGVuc2l0eSwgdG9yY2ggbW9kZSAqLworCXUzMiBtYXhfaW5kaWNhdG9yX2ludGVuc2l0eTsJLyogaW5kaWNhdG9yIGxlZCBpbnRlbnNpdHkgKi8KK307CisKKyNkZWZpbmUgdG9fYWRwMTY1M19mbGFzaChzZCkJY29udGFpbmVyX29mKHNkLCBzdHJ1Y3QgYWRwMTY1M19mbGFzaCwgc3ViZGV2KQorCitzdHJ1Y3QgYWRwMTY1M19mbGFzaCB7CisJc3RydWN0IHY0bDJfc3ViZGV2IHN1YmRldjsKKwlzdHJ1Y3QgYWRwMTY1M19wbGF0Zm9ybV9kYXRhICpwbGF0Zm9ybV9kYXRhOworCisJc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyIGN0cmxzOworCXN0cnVjdCB2NGwyX2N0cmwgKmxlZF9tb2RlOworCXN0cnVjdCB2NGwyX2N0cmwgKmZsYXNoX3RpbWVvdXQ7CisJc3RydWN0IHY0bDJfY3RybCAqZmxhc2hfaW50ZW5zaXR5OworCXN0cnVjdCB2NGwyX2N0cmwgKnRvcmNoX2ludGVuc2l0eTsKKwlzdHJ1Y3QgdjRsMl9jdHJsICppbmRpY2F0b3JfaW50ZW5zaXR5OworCisJc3RydWN0IG11dGV4IHBvd2VyX2xvY2s7CisJaW50IHBvd2VyX2NvdW50OworCWludCBmYXVsdDsKK307CisKKyNlbmRpZiAvKiBBRFAxNjUzX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvYXRtZWwtaXNpLmggYi9pbmNsdWRlL21lZGlhL2F0bWVsLWlzaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2Y2VjZTUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL2F0bWVsLWlzaS5oCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogUmVnaXN0ZXIgZGVmaW5pdGlvbnMgZm9yIHRoZSBBdG1lbCBJbWFnZSBTZW5zb3IgSW50ZXJmYWNlLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBBdG1lbCBDb3Jwb3JhdGlvbgorICogSm9zaCBXdSwgPGpvc2gud3VAYXRtZWwuY29tPgorICoKKyAqIEJhc2VkIG9uIHByZXZpb3VzIHdvcmsgYnkgTGFycyBIYXJpbmcsIDxsYXJzLmhhcmluZ0BhdG1lbC5jb20+CisgKiBhbmQgU2VkamkgR2FvdWFvdQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpZm5kZWYgX19BVE1FTF9JU0lfSF9fCisjZGVmaW5lIF9fQVRNRUxfSVNJX0hfXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogSVNJX1YyIHJlZ2lzdGVyIG9mZnNldHMgKi8KKyNkZWZpbmUgSVNJX0NGRzEJCQkJMHgwMDAwCisjZGVmaW5lIElTSV9DRkcyCQkJCTB4MDAwNAorI2RlZmluZSBJU0lfUFNJWkUJCQkJMHgwMDA4CisjZGVmaW5lIElTSV9QREVDRgkJCQkweDAwMGMKKyNkZWZpbmUgSVNJX1kyUl9TRVQwCQkJCTB4MDAxMAorI2RlZmluZSBJU0lfWTJSX1NFVDEJCQkJMHgwMDE0CisjZGVmaW5lIElTSV9SMllfU0VUMAkJCQkweDAwMTgKKyNkZWZpbmUgSVNJX1IyWV9TRVQxCQkJCTB4MDAxQworI2RlZmluZSBJU0lfUjJZX1NFVDIJCQkJMHgwMDIwCisjZGVmaW5lIElTSV9DVFJMCQkJCTB4MDAyNAorI2RlZmluZSBJU0lfU1RBVFVTCQkJCTB4MDAyOAorI2RlZmluZSBJU0lfSU5URU4JCQkJMHgwMDJDCisjZGVmaW5lIElTSV9JTlRESVMJCQkJMHgwMDMwCisjZGVmaW5lIElTSV9JTlRNQVNLCQkJCTB4MDAzNAorI2RlZmluZSBJU0lfRE1BX0NIRVIJCQkJMHgwMDM4CisjZGVmaW5lIElTSV9ETUFfQ0hEUgkJCQkweDAwM0MKKyNkZWZpbmUgSVNJX0RNQV9DSFNSCQkJCTB4MDA0MAorI2RlZmluZSBJU0lfRE1BX1BfQUREUgkJCQkweDAwNDQKKyNkZWZpbmUgSVNJX0RNQV9QX0NUUkwJCQkJMHgwMDQ4CisjZGVmaW5lIElTSV9ETUFfUF9EU0NSCQkJCTB4MDA0QworI2RlZmluZSBJU0lfRE1BX0NfQUREUgkJCQkweDAwNTAKKyNkZWZpbmUgSVNJX0RNQV9DX0NUUkwJCQkJMHgwMDU0CisjZGVmaW5lIElTSV9ETUFfQ19EU0NSCQkJCTB4MDA1OAorCisvKiBCaXRmaWVsZHMgaW4gQ0ZHMSAqLworI2RlZmluZSBJU0lfQ0ZHMV9IU1lOQ19QT0xfQUNUSVZFX0xPVwkJKDEgPDwgMikKKyNkZWZpbmUgSVNJX0NGRzFfVlNZTkNfUE9MX0FDVElWRV9MT1cJCSgxIDw8IDMpCisjZGVmaW5lIElTSV9DRkcxX1BJWENMS19QT0xfQUNUSVZFX0ZBTExJTkcJKDEgPDwgNCkKKyNkZWZpbmUgSVNJX0NGRzFfRU1CX1NZTkMJCQkoMSA8PCA2KQorI2RlZmluZSBJU0lfQ0ZHMV9DUkNfU1lOQwkJCSgxIDw8IDcpCisvKiBDb25zdGFudHMgZm9yIEZSQVRFKElTSV9WMikgKi8KKyNkZWZpbmUJCUlTSV9DRkcxX0ZSQVRFX0NBUFRVUkVfQUxMCSgwIDw8IDgpCisjZGVmaW5lCQlJU0lfQ0ZHMV9GUkFURV9ESVZfMgkJKDEgPDwgOCkKKyNkZWZpbmUJCUlTSV9DRkcxX0ZSQVRFX0RJVl8zCQkoMiA8PCA4KQorI2RlZmluZQkJSVNJX0NGRzFfRlJBVEVfRElWXzQJCSgzIDw8IDgpCisjZGVmaW5lCQlJU0lfQ0ZHMV9GUkFURV9ESVZfNQkJKDQgPDwgOCkKKyNkZWZpbmUJCUlTSV9DRkcxX0ZSQVRFX0RJVl82CQkoNSA8PCA4KQorI2RlZmluZQkJSVNJX0NGRzFfRlJBVEVfRElWXzcJCSg2IDw8IDgpCisjZGVmaW5lCQlJU0lfQ0ZHMV9GUkFURV9ESVZfOAkJKDcgPDwgOCkKKyNkZWZpbmUgSVNJX0NGRzFfRElTQ1IJCQkJKDEgPDwgMTEpCisjZGVmaW5lIElTSV9DRkcxX0ZVTExfTU9ERQkJCSgxIDw8IDEyKQorCisvKiBCaXRmaWVsZHMgaW4gQ0ZHMiAqLworI2RlZmluZSBJU0lfQ0ZHMl9HUkFZU0NBTEUJCQkoMSA8PCAxMykKKy8qIENvbnN0YW50cyBmb3IgWUNDX1NXQVAoSVNJX1YyKSAqLworI2RlZmluZQkJSVNJX0NGRzJfWUNDX1NXQVBfREVGQVVMVAkoMCA8PCAyOCkKKyNkZWZpbmUJCUlTSV9DRkcyX1lDQ19TV0FQX01PREVfMQkoMSA8PCAyOCkKKyNkZWZpbmUJCUlTSV9DRkcyX1lDQ19TV0FQX01PREVfMgkoMiA8PCAyOCkKKyNkZWZpbmUJCUlTSV9DRkcyX1lDQ19TV0FQX01PREVfMwkoMyA8PCAyOCkKKyNkZWZpbmUgSVNJX0NGRzJfSU1fVlNJWkVfT0ZGU0VUCQkwCisjZGVmaW5lIElTSV9DRkcyX0lNX0hTSVpFX09GRlNFVAkJMTYKKyNkZWZpbmUgSVNJX0NGRzJfSU1fVlNJWkVfTUFTSwkJKDB4N0ZGIDw8IElTSV9DRkcyX0lNX1ZTSVpFX09GRlNFVCkKKyNkZWZpbmUgSVNJX0NGRzJfSU1fSFNJWkVfTUFTSwkJKDB4N0ZGIDw8IElTSV9DRkcyX0lNX0hTSVpFX09GRlNFVCkKKworLyogQml0ZmllbGRzIGluIENUUkwgKi8KKy8qIEFsc28gdXNpbmcgaW4gU1IoSVNJX1YyKSAqLworI2RlZmluZSBJU0lfQ1RSTF9FTgkJCQkoMSA8PCAwKQorI2RlZmluZSBJU0lfQ1RSTF9DREMJCQkJKDEgPDwgOCkKKy8qIEFsc28gdXNpbmcgaW4gU1IvSUVSL0lEUi9JTVIoSVNJX1YyKSAqLworI2RlZmluZSBJU0lfQ1RSTF9ESVMJCQkJKDEgPDwgMSkKKyNkZWZpbmUgSVNJX0NUUkxfU1JTVAkJCQkoMSA8PCAyKQorCisvKiBCaXRmaWVsZHMgaW4gU1IgKi8KKyNkZWZpbmUgSVNJX1NSX1NJUAkJCQkoMSA8PCAxOSkKKy8qIEFsc28gdXNpbmcgaW4gU1IvSUVSL0lEUi9JTVIgKi8KKyNkZWZpbmUgSVNJX1NSX1ZTWU5DCQkJCSgxIDw8IDEwKQorI2RlZmluZSBJU0lfU1JfUFhGUl9ET05FCQkJKDEgPDwgMTYpCisjZGVmaW5lIElTSV9TUl9DWEZSX0RPTkUJCQkoMSA8PCAxNykKKyNkZWZpbmUgSVNJX1NSX1BfT1ZSCQkJCSgxIDw8IDI0KQorI2RlZmluZSBJU0lfU1JfQ19PVlIJCQkJKDEgPDwgMjUpCisjZGVmaW5lIElTSV9TUl9DUkNfRVJSCQkJCSgxIDw8IDI2KQorI2RlZmluZSBJU0lfU1JfRlJfT1ZSCQkJCSgxIDw8IDI3KQorCisvKiBCaXRmaWVsZHMgaW4gRE1BX0NfQ1RSTCAmIGluIERNQV9QX0NUUkwgKi8KKyNkZWZpbmUgSVNJX0RNQV9DVFJMX0ZFVENICQkJKDEgPDwgMCkKKyNkZWZpbmUgSVNJX0RNQV9DVFJMX1dCCQkJCSgxIDw8IDEpCisjZGVmaW5lIElTSV9ETUFfQ1RSTF9JRU4JCQkoMSA8PCAyKQorI2RlZmluZSBJU0lfRE1BX0NUUkxfRE9ORQkJCSgxIDw8IDMpCisKKy8qIEJpdGZpZWxkcyBpbiBETUFfQ0hTUi9DSEVSL0NIRFIgKi8KKyNkZWZpbmUgSVNJX0RNQV9DSFNSX1BfQ0gJCQkoMSA8PCAwKQorI2RlZmluZSBJU0lfRE1BX0NIU1JfQ19DSAkJCSgxIDw8IDEpCisKKy8qIERlZmluaXRpb24gZm9yIGlzaV9wbGF0Zm9ybV9kYXRhICovCisjZGVmaW5lIElTSV9EQVRBV0lEVEhfOAkJCQkweDAxCisjZGVmaW5lIElTSV9EQVRBV0lEVEhfMTAJCQkweDAyCisKK3N0cnVjdCBpc2lfcGxhdGZvcm1fZGF0YSB7CisJdTggaGFzX2VtYl9zeW5jOworCXU4IGVtYl9jcmNfc3luYzsKKwl1OCBoc3luY19hY3RfbG93OworCXU4IHZzeW5jX2FjdF9sb3c7CisJdTggcGNsa19hY3RfZmFsbGluZzsKKwl1OCBpc2lfZnVsbF9tb2RlOworCXUzMiBkYXRhX3dpZHRoX2ZsYWdzOworCS8qIFVzaW5nIGZvciBJU0lfQ0ZHMSAqLworCXUzMiBmcmF0ZTsKK307CisKKyNlbmRpZiAvKiBfX0FUTUVMX0lTSV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvZGF2aW5jaS92cGJlLmggYi9pbmNsdWRlL21lZGlhL2RhdmluY2kvdnBiZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMTFmYjAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL2RhdmluY2kvdnBiZS5oCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRleGFzIEluc3RydW1lbnRzIEluYworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiB2ZXJzaW9uIDIuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworI2lmbmRlZiBfVlBCRV9ICisjZGVmaW5lIF9WUEJFX0gKKworI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorCisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3ZwYmVfb3NkLmg+CisjaW5jbHVkZSA8bWVkaWEvZGF2aW5jaS92cGJlX3ZlbmMuaD4KKyNpbmNsdWRlIDxtZWRpYS9kYXZpbmNpL3ZwYmVfdHlwZXMuaD4KKworLyogT1NEIGNvbmZpZ3VyYXRpb24gaW5mbyAqLworc3RydWN0IG9zZF9jb25maWdfaW5mbyB7CisJY2hhciBtb2R1bGVfbmFtZVszMl07Cit9OworCitzdHJ1Y3QgdnBiZV9vdXRwdXQgeworCXN0cnVjdCB2NGwyX291dHB1dCBvdXRwdXQ7CisJLyoKKwkgKiBJZiBvdXRwdXQgY2FwYWJpbGl0aWVzIGluY2x1ZGUgZHZfcHJlc2V0LCBsaXN0IHN1cHBvcnRlZCBwcmVzZXRzCisJICogYmVsb3cKKwkgKi8KKwljaGFyICpzdWJkZXZfbmFtZTsKKwkvKgorCSAqIGRlZnVhbHRfbW9kZSBpZGVudGlmaWVzIHRoZSBkZWZhdWx0IHRpbWluZ3Mgc2V0IGF0IHRoZSB2ZW5jIG9yCisJICogZXh0ZXJuYWwgZW5jb2Rlci4KKwkgKi8KKwljaGFyICpkZWZhdWx0X21vZGU7CisJLyoKKwkgKiBGaWVsZHMgYmVsb3cgYXJlIHVzZWQgZm9yIHN1cHBvcnRpbmcgbXVsdGlwbGUgbW9kZXMuIEZvciBleGFtcGxlLAorCSAqIExDRCBwYW5lbCBtaWdodCBzdXBwb3J0IGRpZmZlcmVudCBtb2RlcyBhbmQgdGhleSBhcmUgbGlzdGVkIGhlcmUuCisJICogU2ltaWxhcmx5IGZvciBzdXBwb3J0aW5nIGV4dGVybmFsIGVuY29kZXJzLCBsY2QgY29udHJvbGxlciBwb3J0CisJICogcmVxdWlyZXMgYSBzZXQgb2Ygbm9uLXN0YW5kYXJkIHRpbWluZyB2YWx1ZXMgdG8gYmUgbGlzdGVkIGhlcmUgZm9yCisJICogZWFjaCBzdXBwb3J0ZWQgbW9kZSBzaW5jZSB2ZW5jIGlzIHVzZWQgaW4gbm9uLXN0YW5kYXJkIHRpbWluZyBtb2RlCisJICogZm9yIGludGVyZmFjaW5nIHdpdGggZXh0ZXJuYWwgZW5jb2RlciBzaW1pbGFyIHRvIGNvbmZpZ3VyaW5nIGxjZAorCSAqIHBhbmVsIHRpbWluZ3MKKwkgKi8KKwl1bnNpZ25lZCBpbnQgbnVtX21vZGVzOworCXN0cnVjdCB2cGJlX2VuY19tb2RlX2luZm8gKm1vZGVzOworCS8qCisJICogQnVzIGNvbmZpZ3VyYXRpb24gZ29lcyBoZXJlIGZvciBleHRlcm5hbCBlbmNvZGVycy4gU29tZSBlbmNvZGVycworCSAqIG1heSByZXF1aXJlIG11bHRpcGxlIGludGVyZmFjZSB0eXBlcyBmb3IgZWFjaCBvZiB0aGUgb3V0cHV0LiBGb3IKKwkgKiBleGFtcGxlLCBTRCBtb2RlcyB3b3VsZCB1c2UgWUNDOCB3aGVyZSBhcyBIRCBtb2RlIHdvdWxkIHVzZSBZQ0MxNi4KKwkgKiBOb3Qgc3VyZSBpZiB0aGlzIGlzIG5lZWRlZCBvbiBhIHBlciBtb2RlIGJhc2lzIGluc3RlYWQgb2YgcGVyCisJICogb3V0cHV0IGJhc2lzLiBJZiBwZXIgbW9kZSBpcyBuZWVkZWQsIHdlIG1heSBoYXZlIHRvIG1vdmUgdGhpcyB0bworCSAqIG1vZGVfaW5mbyBzdHJ1Y3R1cmUKKwkgKi8KK307CisKKy8qIGVuY29kZXIgY29uZmlndXJhdGlvbiBpbmZvICovCitzdHJ1Y3QgZW5jb2Rlcl9jb25maWdfaW5mbyB7CisJY2hhciBtb2R1bGVfbmFtZVszMl07CisJLyogSXMgdGhpcyBhbiBpMmMgZGV2aWNlID8gKi8KKwl1bnNpZ25lZCBpbnQgaXNfaTJjOjE7CisJLyogaTJjIHN1YmRldmljZSBib2FyZCBpbmZvICovCisJc3RydWN0IGkyY19ib2FyZF9pbmZvIGJvYXJkX2luZm87Cit9OworCisvKiBzdHJ1Y3R1cmUgZm9yIGRlZmluaW5nIHZwYmUgZGlzcGxheSBzdWJzeXN0ZW0gY29tcG9uZW50cyAqLworc3RydWN0IHZwYmVfY29uZmlnIHsKKwljaGFyIG1vZHVsZV9uYW1lWzMyXTsKKwkvKiBpMmMgYnVzIGFkYXB0ZXIgbm8gKi8KKwlpbnQgaTJjX2FkYXB0ZXJfaWQ7CisJc3RydWN0IG9zZF9jb25maWdfaW5mbyBvc2Q7CisJc3RydWN0IGVuY29kZXJfY29uZmlnX2luZm8gdmVuYzsKKwkvKiBleHRlcm5hbCBlbmNvZGVyIGluZm9ybWF0aW9uIGdvZXMgaGVyZSAqLworCWludCBudW1fZXh0X2VuY29kZXJzOworCXN0cnVjdCBlbmNvZGVyX2NvbmZpZ19pbmZvICpleHRfZW5jb2RlcnM7CisJaW50IG51bV9vdXRwdXRzOworCS8qIE9yZGVyIGlzIHZlbmMgb3V0cHV0cyBmb2xsb3dlZCBieSBMQ0QgYW5kIHRoZW4gZXh0ZXJuYWwgZW5jb2RlcnMgKi8KKwlzdHJ1Y3QgdnBiZV9vdXRwdXQgKm91dHB1dHM7Cit9OworCitzdHJ1Y3QgdnBiZV9kZXZpY2U7CisKK3N0cnVjdCB2cGJlX2RldmljZV9vcHMgeworCS8qIGNyb3AgY2FwIGZvciB0aGUgZGlzcGxheSAqLworCWludCAoKmdfY3JvcGNhcCkoc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiwKKwkJCSBzdHJ1Y3QgdjRsMl9jcm9wY2FwICpjcm9wY2FwKTsKKworCS8qIEVudW1lcmF0ZSB0aGUgb3V0cHV0cyAqLworCWludCAoKmVudW1fb3V0cHV0cykoc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiwKKwkJCSAgICBzdHJ1Y3QgdjRsMl9vdXRwdXQgKm91dHB1dCk7CisKKwkvKiBTZXQgb3V0cHV0IHRvIHRoZSBnaXZlbiBpbmRleCAqLworCWludCAoKnNldF9vdXRwdXQpKHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYsCisJCQkgaW50IGluZGV4KTsKKworCS8qIEdldCBjdXJyZW50IG91dHB1dCAqLworCXVuc2lnbmVkIGludCAoKmdldF9vdXRwdXQpKHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYpOworCisJLyogU2V0IERWIHByZXNldCBhdCBjdXJyZW50IG91dHB1dCAqLworCWludCAoKnNfZHZfcHJlc2V0KShzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2LAorCQkJICAgc3RydWN0IHY0bDJfZHZfcHJlc2V0ICpkdl9wcmVzZXQpOworCisJLyogR2V0IERWIHByZXNldHMgc3VwcG9ydGVkIGF0IHRoZSBvdXRwdXQgKi8KKwlpbnQgKCpnX2R2X3ByZXNldCkoc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiwKKwkJCSAgIHN0cnVjdCB2NGwyX2R2X3ByZXNldCAqZHZfcHJlc2V0KTsKKworCS8qIEVudW1lcmF0ZSB0aGUgRFYgUHJlc2V0cyBzdXBwb3J0ZWQgYXQgdGhlIG91dHB1dCAqLworCWludCAoKmVudW1fZHZfcHJlc2V0cykoc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiwKKwkJCSAgICAgICBzdHJ1Y3QgdjRsMl9kdl9lbnVtX3ByZXNldCAqcHJlc2V0X2luZm8pOworCisJLyogU2V0IHN0ZCBhdCB0aGUgb3V0cHV0ICovCisJaW50ICgqc19zdGQpKHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYsIHY0bDJfc3RkX2lkICpzdGRfaWQpOworCisJLyogR2V0IHRoZSBjdXJyZW50IHN0ZCBhdCB0aGUgb3V0cHV0ICovCisJaW50ICgqZ19zdGQpKHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYsIHY0bDJfc3RkX2lkICpzdGRfaWQpOworCisJLyogaW5pdGlhbGl6ZSB0aGUgZGV2aWNlICovCisJaW50ICgqaW5pdGlhbGl6ZSkoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2KTsKKworCS8qIERlLWluaXRpYWxpemUgdGhlIGRldmljZSAqLworCXZvaWQgKCpkZWluaXRpYWxpemUpKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2Rldik7CisKKwkvKiBHZXQgdGhlIGN1cnJlbnQgbW9kZSBpbmZvICovCisJaW50ICgqZ2V0X21vZGVfaW5mbykoc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldiwKKwkJCSAgICAgc3RydWN0IHZwYmVfZW5jX21vZGVfaW5mbyopOworCisJLyoKKwkgKiBTZXQgdGhlIGN1cnJlbnQgbW9kZSBpbiB0aGUgZW5jb2Rlci4gQWx0ZXJuYXRlIHdheSBvZiBzZXR0aW5nCisJICogc3RhbmRhcmQgb3IgRFYgcHJlc2V0IG9yIGN1c3RvbSB0aW1pbmdzIGluIHRoZSBlbmNvZGVyCisJICovCisJaW50ICgqc2V0X21vZGUpKHN0cnVjdCB2cGJlX2RldmljZSAqdnBiZV9kZXYsCisJCQlzdHJ1Y3QgdnBiZV9lbmNfbW9kZV9pbmZvKik7CisJLyogUG93ZXIgbWFuYWdlbWVudCBvcGVyYXRpb25zICovCisJaW50ICgqc3VzcGVuZCkoc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2Rldik7CisJaW50ICgqcmVzdW1lKShzdHJ1Y3QgdnBiZV9kZXZpY2UgKnZwYmVfZGV2KTsKK307CisKKy8qIHN0cnVjdCBmb3IgdnBiZSBkZXZpY2UgKi8KK3N0cnVjdCB2cGJlX2RldmljZSB7CisJLyogVjRsMiBkZXZpY2UgKi8KKwlzdHJ1Y3QgdjRsMl9kZXZpY2UgdjRsMl9kZXY7CisJLyogdnBiZSBkaXNwYXkgY29udHJvbGxlciBjZmcgKi8KKwlzdHJ1Y3QgdnBiZV9jb25maWcgKmNmZzsKKwkvKiBwYXJlbnQgZGV2aWNlICovCisJc3RydWN0IGRldmljZSAqcGRldjsKKwkvKiBleHRlcm5hbCBlbmNvZGVyIHY0bDIgc3ViIGRldmljZXMgKi8KKwlzdHJ1Y3QgdjRsMl9zdWJkZXYgKiplbmNvZGVyczsKKwkvKiBjdXJyZW50IGVuY29kZXIgaW5kZXggKi8KKwlpbnQgY3VycmVudF9zZF9pbmRleDsKKwlzdHJ1Y3QgbXV0ZXggbG9jazsKKwkvKiBkZXZpY2UgaW5pdGlhbGl6ZWQgKi8KKwlpbnQgaW5pdGlhbGl6ZWQ7CisJLyogdnBiZSBkYWMgY2xvY2sgKi8KKwlzdHJ1Y3QgY2xrICpkYWNfY2xrOworCS8qIG9zZF9kZXZpY2UgcG9pbnRlciAqLworCXN0cnVjdCBvc2Rfc3RhdGUgKm9zZF9kZXZpY2U7CisJLyoKKwkgKiBmaWVsZHMgYmVsb3cgYXJlIGFjY2Vzc2VkIGJ5IHVzZXJzIG9mIHZwYmVfZGV2aWNlLiBOb3QgdGhlCisJICogb25lcyBhYm92ZQorCSAqLworCisJLyogY3VycmVudCBvdXRwdXQgKi8KKwlpbnQgY3VycmVudF9vdXRfaW5kZXg7CisJLyogbG9jayB1c2VkIGJ5IGNhbGxlciB0byBkbyBhdG9taWMgb3BlcmF0aW9uIG9uIHZwYmUgZGV2aWNlICovCisJLyogY3VycmVudCB0aW1pbmdzIHNldCBpbiB0aGUgY29udHJvbGxlciAqLworCXN0cnVjdCB2cGJlX2VuY19tb2RlX2luZm8gY3VycmVudF90aW1pbmdzOworCS8qIHZlbmMgc3ViIGRldmljZSAqLworCXN0cnVjdCB2NGwyX3N1YmRldiAqdmVuYzsKKwkvKiBkZXZpY2Ugb3BlcmF0aW9ucyBiZWxvdyAqLworCXN0cnVjdCB2cGJlX2RldmljZV9vcHMgb3BzOworfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL2RhdmluY2kvdnBiZV9kaXNwbGF5LmggYi9pbmNsdWRlL21lZGlhL2RhdmluY2kvdnBiZV9kaXNwbGF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJmNmIzNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvZGF2aW5jaS92cGJlX2Rpc3BsYXkuaApAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRpLmNvbS8KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gdmVyc2lvbiAyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBXSVRIT1VUIEFOWSBXQVJSQU5UWSBvZiBhbnkKKyAqIGtpbmQsIHdoZXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkKKyAqIG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpZm5kZWYgVlBCRV9ESVNQTEFZX0gKKyNkZWZpbmUgVlBCRV9ESVNQTEFZX0gKKworLyogSGVhZGVyIGZpbGVzICovCisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1jb21tb24uaD4KKyNpbmNsdWRlIDxtZWRpYS92aWRlb2J1Zi1kbWEtY29udGlnLmg+CisjaW5jbHVkZSA8bWVkaWEvZGF2aW5jaS92cGJlX3R5cGVzLmg+CisjaW5jbHVkZSA8bWVkaWEvZGF2aW5jaS92cGJlX29zZC5oPgorI2luY2x1ZGUgPG1lZGlhL2RhdmluY2kvdnBiZS5oPgorCisjZGVmaW5lIFZQQkVfRElTUExBWV9NQVhfREVWSUNFUyAyCisKK2VudW0gdnBiZV9kaXNwbGF5X2RldmljZV9pZCB7CisJVlBCRV9ESVNQTEFZX0RFVklDRV8wLAorCVZQQkVfRElTUExBWV9ERVZJQ0VfMQorfTsKKworI2RlZmluZSBWUEJFX0RJU1BMQVlfRFJWX05BTUUJInZwYmUtZGlzcGxheSIKKworI2RlZmluZSBWUEJFX0RJU1BMQVlfTUFKT1JfUkVMRUFTRSAgICAgICAgICAgICAgMQorI2RlZmluZSBWUEJFX0RJU1BMQVlfTUlOT1JfUkVMRUFTRSAgICAgICAgICAgICAgMAorI2RlZmluZSBWUEJFX0RJU1BMQVlfQlVJTEQgICAgICAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBWUEJFX0RJU1BMQVlfVkVSU0lPTl9DT0RFICgoVlBCRV9ESVNQTEFZX01BSk9SX1JFTEVBU0UgPDwgMTYpIHwgXAorCShWUEJFX0RJU1BMQVlfTUlOT1JfUkVMRUFTRSA8PCA4KSAgfCBcCisJVlBCRV9ESVNQTEFZX0JVSUxEKQorCisjZGVmaW5lIFZQQkVfRElTUExBWV9WQUxJRF9GSUVMRChmaWVsZCkgICAoKFY0TDJfRklFTERfTk9ORSA9PSBmaWVsZCkgfHwgXAorCSAoVjRMMl9GSUVMRF9BTlkgPT0gZmllbGQpIHx8IChWNEwyX0ZJRUxEX0lOVEVSTEFDRUQgPT0gZmllbGQpKQorCisvKiBFeHAgcmF0aW8gbnVtZXJhdG9yIGFuZCBkZW5vbWluYXRvciBjb25zdGFudHMgKi8KKyNkZWZpbmUgVlBCRV9ESVNQTEFZX0hfRVhQX1JBVElPX04JOQorI2RlZmluZSBWUEJFX0RJU1BMQVlfSF9FWFBfUkFUSU9fRAk4CisjZGVmaW5lIFZQQkVfRElTUExBWV9WX0VYUF9SQVRJT19OCTYKKyNkZWZpbmUgVlBCRV9ESVNQTEFZX1ZfRVhQX1JBVElPX0QJNQorCisvKiBab29tIG11bHRpcGxpY2F0aW9uIGZhY3RvciAqLworI2RlZmluZSBWUEJFX0RJU1BMQVlfWk9PTV80WAk0CisjZGVmaW5lIFZQQkVfRElTUExBWV9aT09NXzJYCTIKKworLyogU3RydWN0dXJlcyAqLworc3RydWN0IGRpc3BsYXlfbGF5ZXJfaW5mbyB7CisJaW50IGVuYWJsZTsKKwkvKiBMYXllciBJRCB1c2VkIGJ5IERpc3BsYXkgTWFuYWdlciAqLworCWVudW0gb3NkX2xheWVyIGlkOworCXN0cnVjdCBvc2RfbGF5ZXJfY29uZmlnIGNvbmZpZzsKKwllbnVtIG9zZF96b29tX2ZhY3RvciBoX3pvb207CisJZW51bSBvc2Rfem9vbV9mYWN0b3Igdl96b29tOworCWVudW0gb3NkX2hfZXhwX3JhdGlvIGhfZXhwOworCWVudW0gb3NkX3ZfZXhwX3JhdGlvIHZfZXhwOworfTsKKworLyogdnBiZSBkaXNwbGF5IG9iamVjdCBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCB2cGJlX2xheWVyIHsKKwkvKiBudW1iZXIgb2YgYnVmZmVycyBpbiBmYnVmZmVycyAqLworCXVuc2lnbmVkIGludCBudW1idWZmZXJzOworCS8qIFBvaW50ZXIgdG8gdGhlIHZwYmVfZGlzcGxheSAqLworCXN0cnVjdCB2cGJlX2Rpc3BsYXkgKmRpc3BfZGV2OworCS8qIFBvaW50ZXIgcG9pbnRpbmcgdG8gY3VycmVudCB2NGwyX2J1ZmZlciAqLworCXN0cnVjdCB2aWRlb2J1Zl9idWZmZXIgKmN1cl9mcm07CisJLyogUG9pbnRlciBwb2ludGluZyB0byBuZXh0IHY0bDJfYnVmZmVyICovCisJc3RydWN0IHZpZGVvYnVmX2J1ZmZlciAqbmV4dF9mcm07CisJLyogdmlkZW9idWYgc3BlY2lmaWMgcGFyYW1ldGVycworCSAqIEJ1ZmZlciBxdWV1ZSB1c2VkIGluIHZpZGVvLWJ1ZgorCSAqLworCXN0cnVjdCB2aWRlb2J1Zl9xdWV1ZSBidWZmZXJfcXVldWU7CisJLyogUXVldWUgb2YgZmlsbGVkIGZyYW1lcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgZG1hX3F1ZXVlOworCS8qIFVzZWQgaW4gdmlkZW8tYnVmICovCisJc3BpbmxvY2tfdCBpcnFsb2NrOworCS8qIFY0bDIgc3BlY2lmaWMgcGFyYW1ldGVycyAqLworCS8qIElkZW50aWZpZXMgdmlkZW8gZGV2aWNlIGZvciB0aGlzIGxheWVyICovCisJc3RydWN0IHZpZGVvX2RldmljZSB2aWRlb19kZXY7CisJLyogVGhpcyBmaWVsZCBrZWVwcyB0cmFjayBvZiB0eXBlIG9mIGJ1ZmZlciBleGNoYW5nZSBtZWNoYW5pc20gdXNlcgorCSAqIGhhcyBzZWxlY3RlZAorCSAqLworCWVudW0gdjRsMl9tZW1vcnkgbWVtb3J5OworCS8qIFVzZWQgdG8ga2VlcCB0cmFjayBvZiBzdGF0ZSBvZiB0aGUgcHJpb3JpdHkgKi8KKwlzdHJ1Y3QgdjRsMl9wcmlvX3N0YXRlIHByaW87CisJLyogVXNlZCB0byBzdG9yZSBwaXhlbCBmb3JtYXQgKi8KKwlzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0IHBpeF9mbXQ7CisJZW51bSB2NGwyX2ZpZWxkIGJ1Zl9maWVsZDsKKwkvKiBWaWRlbyBsYXllciBjb25maWd1cmF0aW9uIHBhcmFtcyAqLworCXN0cnVjdCBkaXNwbGF5X2xheWVyX2luZm8gbGF5ZXJfaW5mbzsKKwkvKiB2cGJlIHNwZWNpZmljIHBhcmFtZXRlcnMKKwkgKiBlbmFibGUgd2luZG93IGZvciBkaXNwbGF5CisJICovCisJdW5zaWduZWQgY2hhciB3aW5kb3dfZW5hYmxlOworCS8qIG51bWJlciBvZiBvcGVuIGluc3RhbmNlcyBvZiB0aGUgbGF5ZXIgKi8KKwl1bnNpZ25lZCBpbnQgdXNyczsKKwkvKiBudW1iZXIgb2YgdXNlcnMgcGVyZm9ybWluZyBJTyAqLworCXVuc2lnbmVkIGludCBpb191c3JzOworCS8qIEluZGljYXRlcyBpZCBvZiB0aGUgZmllbGQgd2hpY2ggaXMgYmVpbmcgZGlzcGxheWVkICovCisJdW5zaWduZWQgaW50IGZpZWxkX2lkOworCS8qIEluZGljYXRlcyB3aGV0aGVyIHN0cmVhbWluZyBzdGFydGVkICovCisJdW5zaWduZWQgY2hhciBzdGFydGVkOworCS8qIElkZW50aWZpZXMgZGV2aWNlIG9iamVjdCAqLworCWVudW0gdnBiZV9kaXNwbGF5X2RldmljZV9pZCBkZXZpY2VfaWQ7CisJLyogZmFjaWxpdGF0aW9uIG9mIGlvY3RsIG9wcyBsb2NrIGJ5IHY0bDIqLworCXN0cnVjdCBtdXRleCBvcHNsb2NrOworCXU4IGxheWVyX2ZpcnN0X2ludDsKK307CisKKy8qIHZwYmUgZGV2aWNlIHN0cnVjdHVyZSAqLworc3RydWN0IHZwYmVfZGlzcGxheSB7CisJLyogbGF5ZXIgc3BlY2lmaWMgcGFyYW1ldGVycyAqLworCS8qIGxvY2sgZm9yIGlzciB1cGRhdGVzIHRvIGJ1ZiBsYXllcnMqLworCXNwaW5sb2NrX3QgZG1hX3F1ZXVlX2xvY2s7CisJLyogQy1QbGFuZSBvZmZzZXQgZnJvbSBzdGFydCBvZiB5LXBsYW5lICovCisJdW5zaWduZWQgaW50IGNiY3Jfb2ZzdDsKKwlzdHJ1Y3QgdnBiZV9sYXllciAqZGV2W1ZQQkVfRElTUExBWV9NQVhfREVWSUNFU107CisJc3RydWN0IHZwYmVfZGV2aWNlICp2cGJlX2RldjsKKwlzdHJ1Y3Qgb3NkX3N0YXRlICpvc2RfZGV2aWNlOworfTsKKworLyogRmlsZSBoYW5kbGUgc3RydWN0dXJlICovCitzdHJ1Y3QgdnBiZV9maCB7CisJLyogdnBiZSBkZXZpY2Ugc3RydWN0dXJlICovCisJc3RydWN0IHZwYmVfZGlzcGxheSAqZGlzcF9kZXY7CisJLyogcG9pbnRlciB0byBsYXllciBvYmplY3QgZm9yIG9wZW5lZCBkZXZpY2UgKi8KKwlzdHJ1Y3QgdnBiZV9sYXllciAqbGF5ZXI7CisJLyogSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBmaWxlIGhhbmRsZSBpcyBkb2luZyBJTyAqLworCXVuc2lnbmVkIGNoYXIgaW9fYWxsb3dlZDsKKwkvKiBVc2VkIHRvIGtlZXAgdHJhY2sgcHJpb3JpdHkgb2YgdGhpcyBpbnN0YW5jZSAqLworCWVudW0gdjRsMl9wcmlvcml0eSBwcmlvOworfTsKKworc3RydWN0IGJ1Zl9jb25maWdfcGFyYW1zIHsKKwl1bnNpZ25lZCBjaGFyIG1pbl9udW1idWZmZXJzOworCXVuc2lnbmVkIGNoYXIgbnVtYnVmZmVyc1tWUEJFX0RJU1BMQVlfTUFYX0RFVklDRVNdOworCXVuc2lnbmVkIGludCBtaW5fYnVmc2l6ZVtWUEJFX0RJU1BMQVlfTUFYX0RFVklDRVNdOworCXVuc2lnbmVkIGludCBsYXllcl9idWZzaXplW1ZQQkVfRElTUExBWV9NQVhfREVWSUNFU107Cit9OworCisjZW5kaWYJLyogVlBCRV9ESVNQTEFZX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvZGF2aW5jaS92cGJlX29zZC5oIGIvaW5jbHVkZS9tZWRpYS9kYXZpbmNpL3ZwYmVfb3NkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdlMzk3YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvZGF2aW5jaS92cGJlX29zZC5oCkBAIC0wLDAgKzEsMzk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVGV4YXMgSW5zdHJ1bWVudHMgSW5jCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICoKKyAqIEFuZHkgTG93ZSAoYWxvd2VAbXZpc3RhLmNvbSksIE1vbnRhVmlzdGEgU29mdHdhcmUKKyAqIC0gSW5pdGlhbCB2ZXJzaW9uCisgKiBNdXJhbGkgS2FyaWNoZXJpIChta2FyaWNoZXJpQGdtYWlsLmNvbSksIFRleGFzIEluc3RydW1lbnRzIEx0ZC4KKyAqIC0gcG9ydGVkIHRvIHN1YiBkZXZpY2UgaW50ZXJmYWNlCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKyAqCisgKi8KKyNpZm5kZWYgX09TRF9ICisjZGVmaW5lIF9PU0RfSAorCisjaW5jbHVkZSA8bWVkaWEvZGF2aW5jaS92cGJlX3R5cGVzLmg+CisKKyNkZWZpbmUgVlBCRV9PU0RfU1VCREVWX05BTUUgInZwYmUtb3NkIgorCisvKioKKyAqIGVudW0gb3NkX2xheWVyCisgKiBAV0lOX09TRDA6IE9uLVNjcmVlbiBEaXNwbGF5IFdpbmRvdyAwCisgKiBAV0lOX1ZJRDA6IFZpZGVvIFdpbmRvdyAwCisgKiBAV0lOX09TRDE6IE9uLVNjcmVlbiBEaXNwbGF5IFdpbmRvdyAxCisgKiBAV0lOX1ZJRDE6IFZpZGVvIFdpbmRvdyAxCisgKgorICogRGVzY3JpcHRpb246CisgKiBBbiBlbnVtZXJhdGlvbiBvZiB0aGUgb3NkIGRpc3BsYXkgbGF5ZXJzLgorICovCitlbnVtIG9zZF9sYXllciB7CisJV0lOX09TRDAsCisJV0lOX1ZJRDAsCisJV0lOX09TRDEsCisJV0lOX1ZJRDEsCit9OworCisvKioKKyAqIGVudW0gb3NkX3dpbl9sYXllcgorICogQE9TRFdJTl9PU0QwOiBPbi1TY3JlZW4gRGlzcGxheSBXaW5kb3cgMAorICogQE9TRFdJTl9PU0QxOiBPbi1TY3JlZW4gRGlzcGxheSBXaW5kb3cgMQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQW4gZW51bWVyYXRpb24gb2YgdGhlIE9TRCBXaW5kb3cgbGF5ZXJzLgorICovCitlbnVtIG9zZF93aW5fbGF5ZXIgeworCU9TRFdJTl9PU0QwLAorCU9TRFdJTl9PU0QxLAorfTsKKworLyoqCisgKiBlbnVtIG9zZF9waXhfZm9ybWF0CisgKiBAUElYRk1UXzFCUFA6IDEtYml0LXBlci1waXhlbCBiaXRtYXAKKyAqIEBQSVhGTVRfMkJQUDogMi1iaXRzLXBlci1waXhlbCBiaXRtYXAKKyAqIEBQSVhGTVRfNEJQUDogNC1iaXRzLXBlci1waXhlbCBiaXRtYXAKKyAqIEBQSVhGTVRfOEJQUDogOC1iaXRzLXBlci1waXhlbCBiaXRtYXAKKyAqIEBQSVhGTVRfUkdCNTY1OiAxNi1iaXRzLXBlci1waXhlbCBSR0I1NjUKKyAqIEBQSVhGTVRfWUNiQ3JJOiBZVVYgNDoyOjIKKyAqIEBQSVhGTVRfUkdCODg4OiAyNC1iaXRzLXBlci1waXhlbCBSR0I4ODgKKyAqIEBQSVhGTVRfWUNyQ2JJOiBZVVYgNDoyOjIgd2l0aCBjaHJvbWEgc3dhcAorICogQFBJWEZNVF9OVjEyOiBZVVYgNDoyOjAgcGxhbmFyCisgKiBAUElYRk1UX09TRF9BVFRSOiBPU0QgQXR0cmlidXRlIFdpbmRvdyBwaXhlbCBmb3JtYXQgKDRicHApCisgKgorICogRGVzY3JpcHRpb246CisgKiBBbiBlbnVtZXJhdGlvbiBvZiB0aGUgRGFWaW5jaSBwaXhlbCBmb3JtYXRzLgorICovCitlbnVtIG9zZF9waXhfZm9ybWF0IHsKKwlQSVhGTVRfMUJQUCA9IDAsCisJUElYRk1UXzJCUFAsCisJUElYRk1UXzRCUFAsCisJUElYRk1UXzhCUFAsCisJUElYRk1UX1JHQjU2NSwKKwlQSVhGTVRfWUNiQ3JJLAorCVBJWEZNVF9SR0I4ODgsCisJUElYRk1UX1lDckNiSSwKKwlQSVhGTVRfTlYxMiwKKwlQSVhGTVRfT1NEX0FUVFIsCit9OworCisvKioKKyAqIGVudW0gb3NkX2hfZXhwX3JhdGlvCisgKiBASF9FWFBfT0ZGOiBubyBleHBhbnNpb24gKDEvMSkKKyAqIEBIX0VYUF85X09WRVJfODogOS84IGV4cGFuc2lvbiByYXRpbworICogQEhfRVhQXzNfT1ZFUl8yOiAzLzIgZXhwYW5zaW9uIHJhdGlvCisgKgorICogRGVzY3JpcHRpb246CisgKiBBbiBlbnVtZXJhdGlvbiBvZiB0aGUgYXZhaWxhYmxlIGhvcml6b250YWwgZXhwYW5zaW9uIHJhdGlvcy4KKyAqLworZW51bSBvc2RfaF9leHBfcmF0aW8geworCUhfRVhQX09GRiwKKwlIX0VYUF85X09WRVJfOCwKKwlIX0VYUF8zX09WRVJfMiwKK307CisKKy8qKgorICogZW51bSBvc2Rfdl9leHBfcmF0aW8KKyAqIEBWX0VYUF9PRkY6IG5vIGV4cGFuc2lvbiAoMS8xKQorICogQFZfRVhQXzZfT1ZFUl81OiA2LzUgZXhwYW5zaW9uIHJhdGlvCisgKgorICogRGVzY3JpcHRpb246CisgKiBBbiBlbnVtZXJhdGlvbiBvZiB0aGUgYXZhaWxhYmxlIHZlcnRpY2FsIGV4cGFuc2lvbiByYXRpb3MuCisgKi8KK2VudW0gb3NkX3ZfZXhwX3JhdGlvIHsKKwlWX0VYUF9PRkYsCisJVl9FWFBfNl9PVkVSXzUsCit9OworCisvKioKKyAqIGVudW0gb3NkX3pvb21fZmFjdG9yCisgKiBAWk9PTV9YMTogbm8gem9vbSAoeDEpCisgKiBAWk9PTV9YMjogeDIgem9vbQorICogQFpPT01fWDQ6IHg0IHpvb20KKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEFuIGVudW1lcmF0aW9uIG9mIHRoZSBhdmFpbGFibGUgem9vbSBmYWN0b3JzLgorICovCitlbnVtIG9zZF96b29tX2ZhY3RvciB7CisJWk9PTV9YMSwKKwlaT09NX1gyLAorCVpPT01fWDQsCit9OworCisvKioKKyAqIGVudW0gb3NkX2NsdXQKKyAqIEBST01fQ0xVVDogUk9NIENMVVQKKyAqIEBSQU1fQ0xVVDogUkFNIENMVVQKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEFuIGVudW1lcmF0aW9uIG9mIHRoZSBhdmFpbGFibGUgQ29sb3IgTG9va3VwIFRhYmxlcyAoQ0xVVHMpLgorICovCitlbnVtIG9zZF9jbHV0IHsKKwlST01fQ0xVVCwKKwlSQU1fQ0xVVCwKK307CisKKy8qKgorICogZW51bSBvc2Rfcm9tX2NsdXQKKyAqIEBST01fQ0xVVDA6IE1hY2ludG9zaCBDTFVUCisgKiBAUk9NX0NMVVQxOiBDTFVUIGZyb20gRE0yNzAgYW5kIHByaW9yIGRldmljZXMKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIEFuIGVudW1lcmF0aW9uIG9mIHRoZSBST00gQ29sb3IgTG9va3VwIFRhYmxlIChDTFVUKSBvcHRpb25zLgorICovCitlbnVtIG9zZF9yb21fY2x1dCB7CisJUk9NX0NMVVQwLAorCVJPTV9DTFVUMSwKK307CisKKy8qKgorICogZW51bSBvc2RfYmxlbmRpbmdfZmFjdG9yCisgKiBAT1NEXzBfVklEXzg6IE9TRCBwaXhlbHMgYXJlIGZ1bGx5IHRyYW5zcGFyZW50CisgKiBAT1NEXzFfVklEXzc6IE9TRCBwaXhlbHMgY29udHJpYnV0ZSAxLzgsIHZpZGVvIHBpeGVscyBjb250cmlidXRlIDcvOAorICogQE9TRF8yX1ZJRF82OiBPU0QgcGl4ZWxzIGNvbnRyaWJ1dGUgMi84LCB2aWRlbyBwaXhlbHMgY29udHJpYnV0ZSA2LzgKKyAqIEBPU0RfM19WSURfNTogT1NEIHBpeGVscyBjb250cmlidXRlIDMvOCwgdmlkZW8gcGl4ZWxzIGNvbnRyaWJ1dGUgNS84CisgKiBAT1NEXzRfVklEXzQ6IE9TRCBwaXhlbHMgY29udHJpYnV0ZSA0LzgsIHZpZGVvIHBpeGVscyBjb250cmlidXRlIDQvOAorICogQE9TRF81X1ZJRF8zOiBPU0QgcGl4ZWxzIGNvbnRyaWJ1dGUgNS84LCB2aWRlbyBwaXhlbHMgY29udHJpYnV0ZSAzLzgKKyAqIEBPU0RfNl9WSURfMjogT1NEIHBpeGVscyBjb250cmlidXRlIDYvOCwgdmlkZW8gcGl4ZWxzIGNvbnRyaWJ1dGUgMi84CisgKiBAT1NEXzhfVklEXzA6IE9TRCBwaXhlbHMgYXJlIGZ1bGx5IG9wYXF1ZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQW4gZW51bWVyYXRpb24gb2YgdGhlIERhVmluY2kgcGl4ZWwgYmxlbmRpbmcgZmFjdG9yIG9wdGlvbnMuCisgKi8KK2VudW0gb3NkX2JsZW5kaW5nX2ZhY3RvciB7CisJT1NEXzBfVklEXzgsCisJT1NEXzFfVklEXzcsCisJT1NEXzJfVklEXzYsCisJT1NEXzNfVklEXzUsCisJT1NEXzRfVklEXzQsCisJT1NEXzVfVklEXzMsCisJT1NEXzZfVklEXzIsCisJT1NEXzhfVklEXzAsCit9OworCisvKioKKyAqIGVudW0gb3NkX2JsaW5rX2ludGVydmFsCisgKiBAQkxJTktfWDE6IGJsaW5rIGludGVydmFsIGlzIDEgdmVydGljYWwgcmVmcmVzaCBjeWNsZQorICogQEJMSU5LX1gyOiBibGluayBpbnRlcnZhbCBpcyAyIHZlcnRpY2FsIHJlZnJlc2ggY3ljbGVzCisgKiBAQkxJTktfWDM6IGJsaW5rIGludGVydmFsIGlzIDMgdmVydGljYWwgcmVmcmVzaCBjeWNsZXMKKyAqIEBCTElOS19YNDogYmxpbmsgaW50ZXJ2YWwgaXMgNCB2ZXJ0aWNhbCByZWZyZXNoIGN5Y2xlcworICoKKyAqIERlc2NyaXB0aW9uOgorICogQW4gZW51bWVyYXRpb24gb2YgdGhlIERhVmluY2kgcGl4ZWwgYmxpbmtpbmcgaW50ZXJ2YWwgb3B0aW9ucy4KKyAqLworZW51bSBvc2RfYmxpbmtfaW50ZXJ2YWwgeworCUJMSU5LX1gxLAorCUJMSU5LX1gyLAorCUJMSU5LX1gzLAorCUJMSU5LX1g0LAorfTsKKworLyoqCisgKiBlbnVtIG9zZF9jdXJzb3JfaF93aWR0aAorICogQEhfV0lEVEhfMTogaG9yaXpvbnRhbCBsaW5lIHdpZHRoIGlzIDEgcGl4ZWwKKyAqIEBIX1dJRFRIXzQ6IGhvcml6b250YWwgbGluZSB3aWR0aCBpcyA0IHBpeGVscworICogQEhfV0lEVEhfODogaG9yaXpvbnRhbCBsaW5lIHdpZHRoIGlzIDggcGl4ZWxzCisgKiBASF9XSURUSF8xMjogaG9yaXpvbnRhbCBsaW5lIHdpZHRoIGlzIDEyIHBpeGVscworICogQEhfV0lEVEhfMTY6IGhvcml6b250YWwgbGluZSB3aWR0aCBpcyAxNiBwaXhlbHMKKyAqIEBIX1dJRFRIXzIwOiBob3Jpem9udGFsIGxpbmUgd2lkdGggaXMgMjAgcGl4ZWxzCisgKiBASF9XSURUSF8yNDogaG9yaXpvbnRhbCBsaW5lIHdpZHRoIGlzIDI0IHBpeGVscworICogQEhfV0lEVEhfMjg6IGhvcml6b250YWwgbGluZSB3aWR0aCBpcyAyOCBwaXhlbHMKKyAqLworZW51bSBvc2RfY3Vyc29yX2hfd2lkdGggeworCUhfV0lEVEhfMSwKKwlIX1dJRFRIXzQsCisJSF9XSURUSF84LAorCUhfV0lEVEhfMTIsCisJSF9XSURUSF8xNiwKKwlIX1dJRFRIXzIwLAorCUhfV0lEVEhfMjQsCisJSF9XSURUSF8yOCwKK307CisKKy8qKgorICogZW51bSBkYXZpbmNpX2N1cnNvcl92X3dpZHRoCisgKiBAVl9XSURUSF8xOiB2ZXJ0aWNhbCBsaW5lIHdpZHRoIGlzIDEgbGluZQorICogQFZfV0lEVEhfMjogdmVydGljYWwgbGluZSB3aWR0aCBpcyAyIGxpbmVzCisgKiBAVl9XSURUSF80OiB2ZXJ0aWNhbCBsaW5lIHdpZHRoIGlzIDQgbGluZXMKKyAqIEBWX1dJRFRIXzY6IHZlcnRpY2FsIGxpbmUgd2lkdGggaXMgNiBsaW5lcworICogQFZfV0lEVEhfODogdmVydGljYWwgbGluZSB3aWR0aCBpcyA4IGxpbmVzCisgKiBAVl9XSURUSF8xMDogdmVydGljYWwgbGluZSB3aWR0aCBpcyAxMCBsaW5lcworICogQFZfV0lEVEhfMTI6IHZlcnRpY2FsIGxpbmUgd2lkdGggaXMgMTIgbGluZXMKKyAqIEBWX1dJRFRIXzE0OiB2ZXJ0aWNhbCBsaW5lIHdpZHRoIGlzIDE0IGxpbmVzCisgKi8KK2VudW0gb3NkX2N1cnNvcl92X3dpZHRoIHsKKwlWX1dJRFRIXzEsCisJVl9XSURUSF8yLAorCVZfV0lEVEhfNCwKKwlWX1dJRFRIXzYsCisJVl9XSURUSF84LAorCVZfV0lEVEhfMTAsCisJVl9XSURUSF8xMiwKKwlWX1dJRFRIXzE0LAorfTsKKworLyoqCisgKiBzdHJ1Y3Qgb3NkX2N1cnNvcl9jb25maWcKKyAqIEB4c2l6ZTogaG9yaXpvbnRhbCBzaXplIGluIHBpeGVscworICogQHlzaXplOiB2ZXJ0aWNhbCBzaXplIGluIGxpbmVzCisgKiBAeHBvczogaG9yaXpvbnRhbCBvZmZzZXQgaW4gcGl4ZWxzIGZyb20gdGhlIGxlZnQgZWRnZSBvZiB0aGUgZGlzcGxheQorICogQHlwb3M6IHZlcnRpY2FsIG9mZnNldCBpbiBsaW5lcyBmcm9tIHRoZSB0b3Agb2YgdGhlIGRpc3BsYXkKKyAqIEBpbnRlcmxhY2VkOiBOb24temVybyBpZiB0aGUgZGlzcGxheSBpcyBpbnRlcmxhY2VkLCBvciB6ZXJvIG90aGVyd2lzZQorICogQGhfd2lkdGg6IGhvcml6b250YWwgbGluZSB3aWR0aAorICogQHZfd2lkdGg6IHZlcnRpY2FsIGxpbmUgd2lkdGgKKyAqIEBjbHV0OiB0aGUgQ0xVVCBzZWxlY3RvciAoUk9NIG9yIFJBTSkgZm9yIHRoZSBjdXJzb3IgY29sb3IKKyAqIEBjbHV0X2luZGV4OiBhbiBpbmRleCBpbnRvIHRoZSBDTFVUIGZvciB0aGUgY3Vyc29yIGNvbG9yCisgKgorICogRGVzY3JpcHRpb246CisgKiBBIHN0cnVjdHVyZSBkZXNjcmliaW5nIHRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgb2YgdGhlIGhhcmR3YXJlCisgKiByZWN0YW5ndWxhciBjdXJzb3IuCisgKi8KK3N0cnVjdCBvc2RfY3Vyc29yX2NvbmZpZyB7CisJdW5zaWduZWQgeHNpemU7CisJdW5zaWduZWQgeXNpemU7CisJdW5zaWduZWQgeHBvczsKKwl1bnNpZ25lZCB5cG9zOworCWludCBpbnRlcmxhY2VkOworCWVudW0gb3NkX2N1cnNvcl9oX3dpZHRoIGhfd2lkdGg7CisJZW51bSBvc2RfY3Vyc29yX3Zfd2lkdGggdl93aWR0aDsKKwllbnVtIG9zZF9jbHV0IGNsdXQ7CisJdW5zaWduZWQgY2hhciBjbHV0X2luZGV4OworfTsKKworLyoqCisgKiBzdHJ1Y3Qgb3NkX2xheWVyX2NvbmZpZworICogQHBpeGZtdDogcGl4ZWwgZm9ybWF0CisgKiBAbGluZV9sZW5ndGg6IG9mZnNldCBpbiBieXRlcyBiZXR3ZWVuIHN0YXJ0IG9mIGVhY2ggbGluZSBpbiBtZW1vcnkKKyAqIEB4c2l6ZTogbnVtYmVyIG9mIGhvcml6b250YWwgcGl4ZWxzIGRpc3BsYXllZCBwZXIgbGluZQorICogQHlzaXplOiBudW1iZXIgb2YgbGluZXMgZGlzcGxheWVkCisgKiBAeHBvczogaG9yaXpvbnRhbCBvZmZzZXQgaW4gcGl4ZWxzIGZyb20gdGhlIGxlZnQgZWRnZSBvZiB0aGUgZGlzcGxheQorICogQHlwb3M6IHZlcnRpY2FsIG9mZnNldCBpbiBsaW5lcyBmcm9tIHRoZSB0b3Agb2YgdGhlIGRpc3BsYXkKKyAqIEBpbnRlcmxhY2VkOiBOb24temVybyBpZiB0aGUgZGlzcGxheSBpcyBpbnRlcmxhY2VkLCBvciB6ZXJvIG90aGVyd2lzZQorICoKKyAqIERlc2NyaXB0aW9uOgorICogQSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyB0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIG9mIGFuIE9uLVNjcmVlbiBEaXNwbGF5CisgKiAoT1NEKSBvciB2aWRlbyBsYXllciByZWxhdGVkIHRvIGhvdyB0aGUgaW1hZ2UgaXMgc3RvcmVkIGluIG1lbW9yeS4KKyAqIEBsaW5lX2xlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdGhlIGNhY2hlIGxpbmUgc2l6ZSAoMzIgYnl0ZXMpLgorICovCitzdHJ1Y3Qgb3NkX2xheWVyX2NvbmZpZyB7CisJZW51bSBvc2RfcGl4X2Zvcm1hdCBwaXhmbXQ7CisJdW5zaWduZWQgbGluZV9sZW5ndGg7CisJdW5zaWduZWQgeHNpemU7CisJdW5zaWduZWQgeXNpemU7CisJdW5zaWduZWQgeHBvczsKKwl1bnNpZ25lZCB5cG9zOworCWludCBpbnRlcmxhY2VkOworfTsKKworLyogcGFyYW1ldGVycyB0aGF0IGFwcGx5IG9uIGEgcGVyLXdpbmRvdyAoT1NEIG9yIHZpZGVvKSBiYXNpcyAqLworc3RydWN0IG9zZF93aW5kb3dfc3RhdGUgeworCWludCBpc19hbGxvY2F0ZWQ7CisJaW50IGlzX2VuYWJsZWQ7CisJdW5zaWduZWQgbG9uZyBmYl9iYXNlX3BoeXM7CisJZW51bSBvc2Rfem9vbV9mYWN0b3IgaF96b29tOworCWVudW0gb3NkX3pvb21fZmFjdG9yIHZfem9vbTsKKwlzdHJ1Y3Qgb3NkX2xheWVyX2NvbmZpZyBsY29uZmlnOworfTsKKworLyogcGFyYW1ldGVycyB0aGF0IGFwcGx5IG9uIGEgcGVyLU9TRC13aW5kb3cgYmFzaXMgKi8KK3N0cnVjdCBvc2Rfb3Nkd2luX3N0YXRlIHsKKwllbnVtIG9zZF9jbHV0IGNsdXQ7CisJZW51bSBvc2RfYmxlbmRpbmdfZmFjdG9yIGJsZW5kOworCWludCBjb2xvcmtleV9ibGVuZGluZzsKKwl1bnNpZ25lZCBjb2xvcmtleTsKKwlpbnQgcmVjNjAxX2F0dGVudWF0aW9uOworCS8qIGluZGV4IGlzIHBpeGVsIHZhbHVlICovCisJdW5zaWduZWQgY2hhciBwYWxldHRlX21hcFsxNl07Cit9OworCisvKiBoYXJkd2FyZSByZWN0YW5ndWxhciBjdXJzb3IgcGFyYW1ldGVycyAqLworc3RydWN0IG9zZF9jdXJzb3Jfc3RhdGUgeworCWludCBpc19lbmFibGVkOworCXN0cnVjdCBvc2RfY3Vyc29yX2NvbmZpZyBjb25maWc7Cit9OworCitzdHJ1Y3Qgb3NkX3N0YXRlOworCitzdHJ1Y3QgdnBiZV9vc2Rfb3BzIHsKKwlpbnQgKCppbml0aWFsaXplKShzdHJ1Y3Qgb3NkX3N0YXRlICpzZCk7CisJaW50ICgqcmVxdWVzdF9sYXllcikoc3RydWN0IG9zZF9zdGF0ZSAqc2QsIGVudW0gb3NkX2xheWVyIGxheWVyKTsKKwl2b2lkICgqcmVsZWFzZV9sYXllcikoc3RydWN0IG9zZF9zdGF0ZSAqc2QsIGVudW0gb3NkX2xheWVyIGxheWVyKTsKKwlpbnQgKCplbmFibGVfbGF5ZXIpKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCBlbnVtIG9zZF9sYXllciBsYXllciwKKwkJCSAgICBpbnQgb3RoZXJ3aW4pOworCXZvaWQgKCpkaXNhYmxlX2xheWVyKShzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwgZW51bSBvc2RfbGF5ZXIgbGF5ZXIpOworCWludCAoKnNldF9sYXllcl9jb25maWcpKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCBlbnVtIG9zZF9sYXllciBsYXllciwKKwkJCQlzdHJ1Y3Qgb3NkX2xheWVyX2NvbmZpZyAqbGNvbmZpZyk7CisJdm9pZCAoKmdldF9sYXllcl9jb25maWcpKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLCBlbnVtIG9zZF9sYXllciBsYXllciwKKwkJCQkgc3RydWN0IG9zZF9sYXllcl9jb25maWcgKmxjb25maWcpOworCXZvaWQgKCpzdGFydF9sYXllcikoc3RydWN0IG9zZF9zdGF0ZSAqc2QsIGVudW0gb3NkX2xheWVyIGxheWVyLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgZmJfYmFzZV9waHlzLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgY2Jjcl9vZnN0KTsKKwl2b2lkICgqc2V0X2xlZnRfbWFyZ2luKShzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwgdTMyIHZhbCk7CisJdm9pZCAoKnNldF90b3BfbWFyZ2luKShzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwgdTMyIHZhbCk7CisJdm9pZCAoKnNldF9pbnRlcnBvbGF0aW9uX2ZpbHRlcikoc3RydWN0IG9zZF9zdGF0ZSAqc2QsIGludCBmaWx0ZXIpOworCWludCAoKnNldF92aWRfZXhwYW5zaW9uKShzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwKKwkJCQkJZW51bSBvc2RfaF9leHBfcmF0aW8gaF9leHAsCisJCQkJCWVudW0gb3NkX3ZfZXhwX3JhdGlvIHZfZXhwKTsKKwl2b2lkICgqZ2V0X3ZpZF9leHBhbnNpb24pKHN0cnVjdCBvc2Rfc3RhdGUgKnNkLAorCQkJCQllbnVtIG9zZF9oX2V4cF9yYXRpbyAqaF9leHAsCisJCQkJCWVudW0gb3NkX3ZfZXhwX3JhdGlvICp2X2V4cCk7CisJdm9pZCAoKnNldF96b29tKShzdHJ1Y3Qgb3NkX3N0YXRlICpzZCwgZW51bSBvc2RfbGF5ZXIgbGF5ZXIsCisJCQkJZW51bSBvc2Rfem9vbV9mYWN0b3IgaF96b29tLAorCQkJCWVudW0gb3NkX3pvb21fZmFjdG9yIHZfem9vbSk7Cit9OworCitzdHJ1Y3Qgb3NkX3N0YXRlIHsKKwllbnVtIHZwYmVfdmVyc2lvbiB2cGJlX3R5cGU7CisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlkbWFfYWRkcl90IG9zZF9iYXNlX3BoeXM7CisJdW5zaWduZWQgbG9uZyBvc2RfYmFzZTsKKwl1bnNpZ25lZCBsb25nIG9zZF9zaXplOworCS8qIDEtLT50aGUgaXNyIHdpbGwgdG9nZ2xlIHRoZSBWSUQwIHBpbmctcG9uZyBidWZmZXIgKi8KKwlpbnQgcGluZ3Bvbmc7CisJaW50IGludGVycG9sYXRpb25fZmlsdGVyOworCWludCBmaWVsZF9pbnZlcnNpb247CisJZW51bSBvc2RfaF9leHBfcmF0aW8gb3NkX2hfZXhwOworCWVudW0gb3NkX3ZfZXhwX3JhdGlvIG9zZF92X2V4cDsKKwllbnVtIG9zZF9oX2V4cF9yYXRpbyB2aWRfaF9leHA7CisJZW51bSBvc2Rfdl9leHBfcmF0aW8gdmlkX3ZfZXhwOworCWVudW0gb3NkX2NsdXQgYmFja2dfY2x1dDsKKwl1bnNpZ25lZCBiYWNrZ19jbHV0X2luZGV4OworCWVudW0gb3NkX3JvbV9jbHV0IHJvbV9jbHV0OworCWludCBpc19ibGlua2luZzsKKwkvKiBhdHRyaWJ1dGUgd2luZG93IGJsaW5raW5nIGVuYWJsZWQgKi8KKwllbnVtIG9zZF9ibGlua19pbnRlcnZhbCBibGluazsKKwkvKiBZQ2JDckkgb3IgWUNyQ2JJICovCisJZW51bSBvc2RfcGl4X2Zvcm1hdCB5Y19waXhmbXQ7CisJLyogY29sdW1ucyBhcmUgWSwgQ2IsIENyICovCisJdW5zaWduZWQgY2hhciBjbHV0X3JhbVsyNTZdWzNdOworCXN0cnVjdCBvc2RfY3Vyc29yX3N0YXRlIGN1cnNvcjsKKwkvKiBPU0QwLCBWSUQwLCBPU0QxLCBWSUQxICovCisJc3RydWN0IG9zZF93aW5kb3dfc3RhdGUgd2luWzRdOworCS8qIE9TRDAsIE9TRDEgKi8KKwlzdHJ1Y3Qgb3NkX29zZHdpbl9zdGF0ZSBvc2R3aW5bMl07CisJLyogT1NEIGRldmljZSBPcGVyYXRpb25zICovCisJc3RydWN0IHZwYmVfb3NkX29wcyBvcHM7Cit9OworCitzdHJ1Y3Qgb3NkX3BsYXRmb3JtX2RhdGEgeworCWVudW0gdnBiZV92ZXJzaW9uIHZwYmVfdHlwZTsKKwlpbnQgIGZpZWxkX2ludl93YV9lbmFibGU7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvZGF2aW5jaS92cGJlX3R5cGVzLmggYi9pbmNsdWRlL21lZGlhL2RhdmluY2kvdnBiZV90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyN2Y1NTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL2RhdmluY2kvdnBiZV90eXBlcy5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaWZuZGVmIF9WUEJFX1RZUEVTX0gKKyNkZWZpbmUgX1ZQQkVfVFlQRVNfSAorCitlbnVtIHZwYmVfdmVyc2lvbiB7CisJVlBCRV9WRVJTSU9OXzEgPSAxLAorCVZQQkVfVkVSU0lPTl8yLAorCVZQQkVfVkVSU0lPTl8zLAorfTsKKworLyogdnBiZV90aW1pbmdfdHlwZSAtIFRpbWluZyB0eXBlcyB1c2VkIGluIHZwYmUgZGV2aWNlICovCitlbnVtIHZwYmVfZW5jX3RpbWluZ3NfdHlwZSB7CisJVlBCRV9FTkNfU1REID0gMHgxLAorCVZQQkVfRU5DX0RWX1BSRVNFVCA9IDB4MiwKKwlWUEJFX0VOQ19DVVNUT01fVElNSU5HUyA9IDB4NCwKKwkvKiBVc2VkIHdoZW4gc2V0IHRpbWluZ3MgdGhyb3VnaCBGQiBkZXZpY2UgaW50ZXJmYWNlICovCisJVlBCRV9FTkNfVElNSU5HU19JTlZBTElEID0gMHg4LAorfTsKKwordW5pb24gdnBiZV90aW1pbmdzIHsKKwl2NGwyX3N0ZF9pZCBzdGRfaWQ7CisJdW5zaWduZWQgaW50IGR2X3ByZXNldDsKK307CisKKy8qCisgKiBzdHJ1Y3QgdnBiZV9lbmNfbW9kZV9pbmZvCisgKiBAbmFtZTogcHRyIHRvIG5hbWUgc3RyaW5nIG9mIHRoZSBzdGFuZGFyZCwgIk5UU0MiLCAiUEFMIiBldGMKKyAqIEBzdGQ6IHN0YW5kYXJkIG9yIG5vbi1zdGFuZGFyZCBtb2RlLiAxIC0gc3RhbmRhcmQsIDAgLSBub25zdGFuZGFyZAorICogQGludGVybGFjZWQ6IDEgLSBpbnRlcmxhY2VkLCAwIC0gbm9uIGludGVybGFjZWQvcHJvZ3Jlc3NpdmUKKyAqIEB4cmVzOiB4IG9yIGhvcml6b250YWwgcmVzb2x1dGlvbiBvZiB0aGUgZGlzcGxheQorICogQHlyZXM6IHkgb3IgdmVydGljYWwgcmVzb2x1dGlvbiBvZiB0aGUgZGlzcGxheQorICogQGZwczogZnJhbWUgcGVyIHNlY29uZAorICogQGxlZnRfbWFyZ2luOiBsZWZ0IG1hcmdpbiBvZiB0aGUgZGlzcGxheQorICogQHJpZ2h0X21hcmdpbjogcmlnaHQgbWFyZ2luIG9mIHRoZSBkaXNwbGF5CisgKiBAdXBwZXJfbWFyZ2luOiB1cHBlciBtYXJnaW4gb2YgdGhlIGRpc3BsYXkKKyAqIEBsb3dlcl9tYXJnaW46IGxvd2VyIG1hcmdpbiBvZiB0aGUgZGlzcGxheQorICogQGhzeW5jX2xlbjogaC1zeW5jIGxlbmd0aAorICogQHZzeW5jX2xlbjogdi1zeW5jIGxlbmd0aAorICogQGZsYWdzOiBiaXQgZmllbGQ6IGJpdCB1c2FnZSBpcyBkb2N1bWVudGVkIGJlbG93CisgKgorICogRGVzY3JpcHRpb246CisgKiAgU3RydWN0dXJlIGhvbGRpbmcgdGltaW5nIGFuZCByZXNvbHV0aW9uIGluZm9ybWF0aW9uIG9mIGEgc3RhbmRhcmQuCisgKiBVc2VkIGJ5IHZwYmVfZGV2aWNlIHRvIHNldCByZXF1aXJlZCBub24tc3RhbmRhcmQgdGltaW5nIGluIHRoZQorICogdmVuYyB3aGVuIGxjZCBjb250cm9sbGVyIG91dHB1dCBpcyBjb25uZWN0ZWQgdG8gYSBleHRlcm5hbCBlbmNvZGVyLgorICogQSB0YWJsZSBvZiB0aW1pbmdzIGlzIG1haW50YWluZWQgaW4gdnBiZSBkZXZpY2UgdG8gc2V0IHRoaXMgaW4KKyAqIHZlbmMgd2hlbiBleHRlcm5hbCBlbmNvZGVyIGlzIGNvbm5lY3RlZCB0byBsY2QgY29udHJvbGxlciBvdXRwdXQuCisgKiBFbmNvZGVyIG1heSBwcm92aWRlIGEgZ19kdl90aW1pbmdzKCkgQVBJIHRvIG92ZXJyaWRlIHRoZXNlIHZhbHVlcworICogYXMgbmVlZGVkLgorICoKKyAqICBOb3RlcworICogIC0tLS0tLQorICogIGlmX3R5cGUgc2hvdWxkIGJlIHVzZWQgb25seSBieSBlbmNvZGVyIG1hbmFnZXIgYW5kIGVuY29kZXIuCisgKiAgZmxhZ3MgdXNhZ2UKKyAqICAgICBiMCAoTFNCKSAtIGhzeW5jIHBvbGFyaXR5LCAwIC0gbmVnYXRpdmUsIDEgLSBwb3NpdGl2ZQorICogICAgIGIxICAgICAgIC0gdnN5bmMgcG9sYXJpdHksIDAgLSBuZWdhdGl2ZSwgMSAtIHBvc2l0aXZlCisgKiAgICAgYjIgICAgICAgLSBmaWVsZCBpZCBwb2xhcml0eSwgMCAtIG5lZ2F0aXZlLCAxICAtIHBvc2l0aXZlCisgKi8KK3N0cnVjdCB2cGJlX2VuY19tb2RlX2luZm8geworCXVuc2lnbmVkIGNoYXIgKm5hbWU7CisJZW51bSB2cGJlX2VuY190aW1pbmdzX3R5cGUgdGltaW5nc190eXBlOworCXVuaW9uIHZwYmVfdGltaW5ncyB0aW1pbmdzOworCXVuc2lnbmVkIGludCBpbnRlcmxhY2VkOworCXVuc2lnbmVkIGludCB4cmVzOworCXVuc2lnbmVkIGludCB5cmVzOworCXN0cnVjdCB2NGwyX2ZyYWN0IGFzcGVjdDsKKwlzdHJ1Y3QgdjRsMl9mcmFjdCBmcHM7CisJdW5zaWduZWQgaW50IGxlZnRfbWFyZ2luOworCXVuc2lnbmVkIGludCByaWdodF9tYXJnaW47CisJdW5zaWduZWQgaW50IHVwcGVyX21hcmdpbjsKKwl1bnNpZ25lZCBpbnQgbG93ZXJfbWFyZ2luOworCXVuc2lnbmVkIGludCBoc3luY19sZW47CisJdW5zaWduZWQgaW50IHZzeW5jX2xlbjsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvZGF2aW5jaS92cGJlX3ZlbmMuaCBiL2luY2x1ZGUvbWVkaWEvZGF2aW5jaS92cGJlX3ZlbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjZjMjA1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9kYXZpbmNpL3ZwYmVfdmVuYy5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGV4YXMgSW5zdHJ1bWVudHMgSW5jCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHZlcnNpb24gMi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisjaWZuZGVmIF9WUEJFX1ZFTkNfSAorI2RlZmluZSBfVlBCRV9WRU5DX0gKKworI2luY2x1ZGUgPG1lZGlhL3Y0bDItc3ViZGV2Lmg+CisjaW5jbHVkZSA8bWVkaWEvZGF2aW5jaS92cGJlX3R5cGVzLmg+CisKKyNkZWZpbmUgVlBCRV9WRU5DX1NVQkRFVl9OQU1FICJ2cGJlLXZlbmMiCisKKy8qIHZlbmMgZXZlbnRzICovCisjZGVmaW5lIFZFTkNfRU5EX09GX0ZSQU1FCUJJVCgwKQorI2RlZmluZSBWRU5DX0ZJUlNUX0ZJRUxECUJJVCgxKQorI2RlZmluZSBWRU5DX1NFQ09ORF9GSUVMRAlCSVQoMikKKworc3RydWN0IHZlbmNfcGxhdGZvcm1fZGF0YSB7CisJZW51bSB2cGJlX3ZlcnNpb24gdmVuY190eXBlOworCWludCAoKnNldHVwX2Nsb2NrKShlbnVtIHZwYmVfZW5jX3RpbWluZ3NfdHlwZSB0eXBlLAorCQkJICAgdW5zaWduZWQgaW50IG1vZGUpOworCS8qIE51bWJlciBvZiBMQ0Qgb3V0cHV0cyBzdXBwb3J0ZWQgKi8KKwlpbnQgbnVtX2xjZF9vdXRwdXRzOworfTsKKworZW51bSB2ZW5jX2lvY3RscyB7CisJVkVOQ19HRVRfRkxEID0gMSwKK307CisKKy8qIGV4cG9ydGVkIGZ1bmN0aW9ucyAqLworc3RydWN0IHY0bDJfc3ViZGV2ICp2ZW5jX3N1Yl9kZXZfaW5pdChzdHJ1Y3QgdjRsMl9kZXZpY2UgKnY0bDJfZGV2LAorCQljb25zdCBjaGFyICp2ZW5jX25hbWUpOworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL21tcC1jYW1lcmEuaCBiL2luY2x1ZGUvbWVkaWEvbW1wLWNhbWVyYS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MTE5NjMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL21tcC1jYW1lcmEuaApAQCAtMCwwICsxLDkgQEAKKy8qCisgKiBJbmZvcm1hdGlvbiBmb3IgdGhlIE1hcnZlbGwgQXJtYWRhIE1NUCBjYW1lcmEKKyAqLworCitzdHJ1Y3QgbW1wX2NhbWVyYV9wbGF0Zm9ybV9kYXRhIHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICppMmNfZGV2aWNlOworCWludCBzZW5zb3JfcG93ZXJfZ3BpbzsKKwlpbnQgc2Vuc29yX3Jlc2V0X2dwaW87Cit9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vdjc2NzAuaCBiL2luY2x1ZGUvbWVkaWEvb3Y3NjcwLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGRyaXZlcnMvbWVkaWEvdmlkZW8vb3Y3NjcwLmgKcmVuYW1lIHRvIGluY2x1ZGUvbWVkaWEvb3Y3NjcwLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvcmMtY29yZS5oIGIvaW5jbHVkZS9tZWRpYS9yYy1jb3JlLmgKaW5kZXggNjA1MzZjNy4uYjFmMTliNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9yYy1jb3JlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9yYy1jb3JlLmgKQEAgLTExNyw3ICsxMTcsNyBAQAogCWludAkJCQkoKnNfdHhfY2Fycmllcikoc3RydWN0IHJjX2RldiAqZGV2LCB1MzIgY2Fycmllcik7CiAJaW50CQkJCSgqc190eF9kdXR5X2N5Y2xlKShzdHJ1Y3QgcmNfZGV2ICpkZXYsIHUzMiBkdXR5X2N5Y2xlKTsKIAlpbnQJCQkJKCpzX3J4X2NhcnJpZXJfcmFuZ2UpKHN0cnVjdCByY19kZXYgKmRldiwgdTMyIG1pbiwgdTMyIG1heCk7Ci0JaW50CQkJCSgqdHhfaXIpKHN0cnVjdCByY19kZXYgKmRldiwgaW50ICp0eGJ1ZiwgdTMyIG4pOworCWludAkJCQkoKnR4X2lyKShzdHJ1Y3QgcmNfZGV2ICpkZXYsIHVuc2lnbmVkICp0eGJ1ZiwgdW5zaWduZWQgbik7CiAJdm9pZAkJCQkoKnNfaWRsZSkoc3RydWN0IHJjX2RldiAqZGV2LCBib29sIGVuYWJsZSk7CiAJaW50CQkJCSgqc19sZWFybmluZ19tb2RlKShzdHJ1Y3QgcmNfZGV2ICpkZXYsIGludCBlbmFibGUpOwogCWludAkJCQkoKnNfY2Fycmllcl9yZXBvcnQpIChzdHJ1Y3QgcmNfZGV2ICpkZXYsIGludCBlbmFibGUpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9yYy1tYXAuaCBiL2luY2x1ZGUvbWVkaWEvcmMtbWFwLmgKaW5kZXggNGUxNDA5ZS4uMTdjOTc1OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9yYy1tYXAuaAorKysgYi9pbmNsdWRlL21lZGlhL3JjLW1hcC5oCkBAIC0xOCwxMiArMTgsMTMgQEAKICNkZWZpbmUgUkNfVFlQRV9KVkMJKDEgIDw8IDMpCS8qIEpWQyBwcm90b2NvbCAqLwogI2RlZmluZSBSQ19UWVBFX1NPTlkJKDEgIDw8IDQpCS8qIFNvbnkxMi8xNS8yMCBwcm90b2NvbCAqLwogI2RlZmluZSBSQ19UWVBFX1JDNV9TWgkoMSAgPDwgNSkJLyogUkM1IHZhcmlhbnQgdXNlZCBieSBTdHJlYW16YXAgKi8KKyNkZWZpbmUgUkNfVFlQRV9NQ0VfS0JECSgxICA8PCAyOSkJLyogUkM2LWlzaCBNQ0Uga2V5Ym9hcmQvbW91c2UgKi8KICNkZWZpbmUgUkNfVFlQRV9MSVJDCSgxICA8PCAzMCkJLyogUGFzcyByYXcgSVIgdG8gbGlyYyB1c2Vyc3BhY2UgKi8KICNkZWZpbmUgUkNfVFlQRV9PVEhFUgkoMXUgPDwgMzEpCiAKICNkZWZpbmUgUkNfVFlQRV9BTEwgKFJDX1RZUEVfUkM1IHwgUkNfVFlQRV9ORUMgIHwgUkNfVFlQRV9SQzYgIHwgXAogCQkgICAgIFJDX1RZUEVfSlZDIHwgUkNfVFlQRV9TT05ZIHwgUkNfVFlQRV9MSVJDIHwgXAotCQkgICAgIFJDX1RZUEVfUkM1X1NaIHwgUkNfVFlQRV9PVEhFUikKKwkJICAgICBSQ19UWVBFX1JDNV9TWiB8IFJDX1RZUEVfTUNFX0tCRCB8IFJDX1RZUEVfT1RIRVIpCiAKIHN0cnVjdCByY19tYXBfdGFibGUgewogCXUzMglzY2FuY29kZTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc2hfbW9iaWxlX2NldS5oIGIvaW5jbHVkZS9tZWRpYS9zaF9tb2JpbGVfY2V1LmgKaW5kZXggODAzNDZhNi4uNDg0MTNiNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zaF9tb2JpbGVfY2V1LmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zaF9tb2JpbGVfY2V1LmgKQEAgLTcsMTAgKzcsMTggQEAKICNkZWZpbmUgU0hfQ0VVX0ZMQUdfVlNZTkNfTE9XCQkoMSA8PCAzKSAvKiBkZWZhdWx0IEhpZ2ggaWYgcG9zc2libGUgKi8KIAogc3RydWN0IGRldmljZTsKK3N0cnVjdCByZXNvdXJjZTsKKworc3RydWN0IHNoX21vYmlsZV9jZXVfY29tcGFuaW9uIHsKKwl1MzIJCW51bV9yZXNvdXJjZXM7CisJc3RydWN0IHJlc291cmNlCSpyZXNvdXJjZTsKKwlpbnQJCWlkOworCXZvaWQJCSpwbGF0Zm9ybV9kYXRhOworfTsKIAogc3RydWN0IHNoX21vYmlsZV9jZXVfaW5mbyB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgZGV2aWNlICpjc2kyX2RldjsKKwlzdHJ1Y3Qgc2hfbW9iaWxlX2NldV9jb21wYW5pb24gKmNzaTI7CiB9OwogCiAjZW5kaWYgLyogX19BU01fU0hfTU9CSUxFX0NFVV9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc2hfbW9iaWxlX2NzaTIuaCBiL2luY2x1ZGUvbWVkaWEvc2hfbW9iaWxlX2NzaTIuaAppbmRleCA0ZDI2MTUxLi5jNTg2YzRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3NoX21vYmlsZV9jc2kyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zaF9tb2JpbGVfY3NpMi5oCkBAIC0xMSw2ICsxMSw4IEBACiAjaWZuZGVmIFNIX01JUElfQ1NJCiAjZGVmaW5lIFNIX01JUElfQ1NJCiAKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisKIGVudW0gc2hfY3NpMl9waHkgewogCVNIX0NTSTJfUEhZX01BSU4sCiAJU0hfQ1NJMl9QSFlfU1VCLApAQCAtMzMsMTQgKzM1LDE0IEBACiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldjsJLyogY2xpZW50IHBsYXRmb3JtIGRldmljZSAqLwogfTsKIAorc3RydWN0IHY0bDJfZGV2aWNlOworCiBzdHJ1Y3Qgc2hfY3NpMl9wZGF0YSB7CiAJZW51bSBzaF9jc2kyX3R5cGUgdHlwZTsKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7CiAJc3RydWN0IHNoX2NzaTJfY2xpZW50X2NvbmZpZyAqY2xpZW50czsKIAlpbnQgbnVtX2NsaWVudHM7CisJc3RydWN0IHY0bDJfZGV2aWNlICp2NGwyX2RldjsKIH07CiAKLXN0cnVjdCBkZXZpY2U7Ci1zdHJ1Y3QgdjRsMl9kZXZpY2U7Ci0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zb2NfY2FtZXJhLmggYi9pbmNsdWRlL21lZGlhL3NvY19jYW1lcmEuaAppbmRleCAyMzhiZDMzLi43NTgyOTUyIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3NvY19jYW1lcmEuaAorKysgYi9pbmNsdWRlL21lZGlhL3NvY19jYW1lcmEuaApAQCAtMjAsMTQgKzIwLDE1IEBACiAjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYyLWNvcmUuaD4KICNpbmNsdWRlIDxtZWRpYS92NGwyLWRldmljZS5oPgogCi1leHRlcm4gc3RydWN0IGJ1c190eXBlIHNvY19jYW1lcmFfYnVzX3R5cGU7Ci0KIHN0cnVjdCBmaWxlOworc3RydWN0IHNvY19jYW1lcmFfbGluazsKIAogc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0Jc3RydWN0IGRldmljZSBkZXY7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkJLyogbGlzdCBvZiBhbGwgcmVnaXN0ZXJlZCBkZXZpY2VzICovCisJc3RydWN0IHNvY19jYW1lcmFfbGluayAqbGluazsKIAlzdHJ1Y3QgZGV2aWNlICpwZGV2OwkJLyogUGxhdGZvcm0gZGV2aWNlICovCisJc3RydWN0IGRldmljZSAqcGFyZW50OwkJLyogQ2FtZXJhIGhvc3QgZGV2aWNlICovCisJc3RydWN0IGRldmljZSAqY29udHJvbDsJCS8qIEUuZy4sIHRoZSBpMmMgY2xpZW50ICovCiAJczMyIHVzZXJfd2lkdGg7CiAJczMyIHVzZXJfaGVpZ2h0OwogCXUzMiBieXRlc3BlcmxpbmU7CQkvKiBmb3IgcGFkZGluZywgemVybyBpZiB1bnVzZWQgKi8KQEAgLTY2LDggKzY3LDYgQEAKIAlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKIAlpbnQgKCphZGQpKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqKTsKIAl2b2lkICgqcmVtb3ZlKShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKik7Ci0JaW50ICgqc3VzcGVuZCkoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICosIHBtX21lc3NhZ2VfdCk7Ci0JaW50ICgqcmVzdW1lKShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKik7CiAJLyoKIAkgKiAuZ2V0X2Zvcm1hdHMoKSBpcyBjYWxsZWQgZm9yIGVhY2ggY2xpZW50IGRldmljZSBmb3JtYXQsIGJ1dAogCSAqIC5wdXRfZm9ybWF0cygpIGlzIG9ubHkgY2FsbGVkIG9uY2UuIEZ1cnRoZXIsIGlmIGFueSBvZiB0aGUgY2FsbHMgdG8KQEAgLTEwOSwxMiArMTA4LDYgQEAKICNkZWZpbmUgU09DQU1fU0VOU09SX0lOVkVSVF9IU1lOQwkoMSA8PCAyKQogI2RlZmluZSBTT0NBTV9TRU5TT1JfSU5WRVJUX1ZTWU5DCSgxIDw8IDMpCiAjZGVmaW5lIFNPQ0FNX1NFTlNPUl9JTlZFUlRfREFUQQkoMSA8PCA0KQotI2RlZmluZSBTT0NBTV9NSVBJXzFMQU5FCQkoMSA8PCA1KQotI2RlZmluZSBTT0NBTV9NSVBJXzJMQU5FCQkoMSA8PCA2KQotI2RlZmluZSBTT0NBTV9NSVBJXzNMQU5FCQkoMSA8PCA3KQotI2RlZmluZSBTT0NBTV9NSVBJXzRMQU5FCQkoMSA8PCA4KQotI2RlZmluZSBTT0NBTV9NSVBJCShTT0NBTV9NSVBJXzFMQU5FIHwgU09DQU1fTUlQSV8yTEFORSB8IFwKLQkJCVNPQ0FNX01JUElfM0xBTkUgfCBTT0NBTV9NSVBJXzRMQU5FKQogCiBzdHJ1Y3QgaTJjX2JvYXJkX2luZm87CiBzdHJ1Y3QgcmVndWxhdG9yX2J1bGtfZGF0YTsKQEAgLTEzNCwxMSArMTI3LDExIEBACiAJaW50IG51bV9yZWd1bGF0b3JzOwogCiAJLyoKLQkgKiBGb3Igbm9uLUkyQyBkZXZpY2VzIHBsYXRmb3JtIHBsYXRmb3JtIGhhcyB0byBwcm92aWRlIG1ldGhvZHMgdG8KLQkgKiBhZGQgYSBkZXZpY2UgdG8gdGhlIHN5c3RlbSBhbmQgdG8gcmVtb3ZlCisJICogRm9yIG5vbi1JMkMgZGV2aWNlcyBwbGF0Zm9ybSBoYXMgdG8gcHJvdmlkZSBtZXRob2RzIHRvIGFkZCBhIGRldmljZQorCSAqIHRvIHRoZSBzeXN0ZW0gYW5kIHRvIHJlbW92ZSBpdAogCSAqLwotCWludCAoKmFkZF9kZXZpY2UpKHN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKiwgc3RydWN0IGRldmljZSAqKTsKLQl2b2lkICgqZGVsX2RldmljZSkoc3RydWN0IHNvY19jYW1lcmFfbGluayAqKTsKKwlpbnQgKCphZGRfZGV2aWNlKShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKik7CisJdm9pZCAoKmRlbF9kZXZpY2UpKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqKTsKIAkvKiBPcHRpb25hbCBjYWxsYmFja3MgdG8gcG93ZXIgb24gb3Igb2ZmIGFuZCByZXNldCB0aGUgc2Vuc29yICovCiAJaW50ICgqcG93ZXIpKHN0cnVjdCBkZXZpY2UgKiwgaW50KTsKIAlpbnQgKCpyZXNldCkoc3RydWN0IGRldmljZSAqKTsKQEAgLTE1MiwxMiArMTQ1LDYgQEAKIAl2b2lkICgqZnJlZV9idXMpKHN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKik7CiB9OwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqdG9fc29jX2NhbWVyYV9kZXYoCi0JY29uc3Qgc3RydWN0IGRldmljZSAqZGV2KQotewotCXJldHVybiBjb250YWluZXJfb2YoZGV2LCBzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UsIGRldik7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNvY19jYW1lcmFfaG9zdCAqdG9fc29jX2NhbWVyYV9ob3N0KAogCWNvbnN0IHN0cnVjdCBkZXZpY2UgKmRldikKIHsKQEAgLTE2OSwxMyArMTU2LDEzIEBACiBzdGF0aWMgaW5saW5lIHN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKnRvX3NvY19jYW1lcmFfbGluaygKIAljb25zdCBzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKIHsKLQlyZXR1cm4gaWNkLT5kZXYucGxhdGZvcm1fZGF0YTsKKwlyZXR1cm4gaWNkLT5saW5rOwogfQogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBkZXZpY2UgKnRvX3NvY19jYW1lcmFfY29udHJvbCgKIAljb25zdCBzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKIHsKLQlyZXR1cm4gZGV2X2dldF9kcnZkYXRhKCZpY2QtPmRldik7CisJcmV0dXJuIGljZC0+Y29udHJvbDsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNvY19jYW1lcmFfdG9fc3ViZGV2KApAQCAtMjA3LDExICsxOTQsOCBAQAogfTsKIAogc3RydWN0IHNvY19jYW1lcmFfb3BzIHsKLQlpbnQgKCpzdXNwZW5kKShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKLQlpbnQgKCpyZXN1bWUpKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqKTsKIAl1bnNpZ25lZCBsb25nICgqcXVlcnlfYnVzX3BhcmFtKShzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKik7CiAJaW50ICgqc2V0X2J1c19wYXJhbSkoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICosIHVuc2lnbmVkIGxvbmcpOwotCWludCAoKmVudW1faW5wdXQpKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqLCBzdHJ1Y3QgdjRsMl9pbnB1dCAqKTsKIAljb25zdCBzdHJ1Y3QgdjRsMl9xdWVyeWN0cmwgKmNvbnRyb2xzOwogCWludCBudW1fY29udHJvbHM7CiB9OwpAQCAtMjcwLDYgKzI1NCwxMiBAQAogI2RlZmluZSBTT0NBTV9QQ0xLX1NBTVBMRV9GQUxMSU5HCSgxIDw8IDEzKQogI2RlZmluZSBTT0NBTV9EQVRBX0FDVElWRV9ISUdICQkoMSA8PCAxNCkKICNkZWZpbmUgU09DQU1fREFUQV9BQ1RJVkVfTE9XCQkoMSA8PCAxNSkKKyNkZWZpbmUgU09DQU1fTUlQSV8xTEFORQkJKDEgPDwgMTYpCisjZGVmaW5lIFNPQ0FNX01JUElfMkxBTkUJCSgxIDw8IDE3KQorI2RlZmluZSBTT0NBTV9NSVBJXzNMQU5FCQkoMSA8PCAxOCkKKyNkZWZpbmUgU09DQU1fTUlQSV80TEFORQkJKDEgPDwgMTkpCisjZGVmaW5lIFNPQ0FNX01JUEkJKFNPQ0FNX01JUElfMUxBTkUgfCBTT0NBTV9NSVBJXzJMQU5FIHwgXAorCQkJU09DQU1fTUlQSV8zTEFORSB8IFNPQ0FNX01JUElfNExBTkUpCiAKICNkZWZpbmUgU09DQU1fREFUQVdJRFRIX01BU0sgKFNPQ0FNX0RBVEFXSURUSF80IHwgU09DQU1fREFUQVdJRFRIXzggfCBcCiAJCQkgICAgICBTT0NBTV9EQVRBV0lEVEhfOSB8IFNPQ0FNX0RBVEFXSURUSF8xMCB8IFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvc29jX2NhbWVyYV9wbGF0Zm9ybS5oIGIvaW5jbHVkZS9tZWRpYS9zb2NfY2FtZXJhX3BsYXRmb3JtLmgKaW5kZXggNmQ3YTRmZC4uNzRmMGZhMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS9zb2NfY2FtZXJhX3BsYXRmb3JtLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9zb2NfY2FtZXJhX3BsYXRmb3JtLmgKQEAgLTIxLDcgKzIxLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZvcm1hdF9kZXB0aDsKIAlzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10IGZvcm1hdDsKIAl1bnNpZ25lZCBsb25nIGJ1c19wYXJhbTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2Q7CiAJaW50ICgqc2V0X2NhcHR1cmUpKHN0cnVjdCBzb2NfY2FtZXJhX3BsYXRmb3JtX2luZm8gKmluZm8sIGludCBlbmFibGUpOwogfTsKIApAQCAtMzAsOCArMzAsNyBAQAogCSpwZGV2ID0gTlVMTDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgc29jX2NhbWVyYV9wbGF0Zm9ybV9hZGQoY29uc3Qgc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsLAotCQkJCQkgIHN0cnVjdCBkZXZpY2UgKmRldiwKK3N0YXRpYyBpbmxpbmUgaW50IHNvY19jYW1lcmFfcGxhdGZvcm1fYWRkKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAogCQkJCQkgIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKipwZGV2LAogCQkJCQkgIHN0cnVjdCBzb2NfY2FtZXJhX2xpbmsgKnBsaW5rLAogCQkJCQkgIHZvaWQgKCpyZWxlYXNlKShzdHJ1Y3QgZGV2aWNlICpkZXYpLApAQCAtNDAsNyArMzksNyBAQAogCXN0cnVjdCBzb2NfY2FtZXJhX3BsYXRmb3JtX2luZm8gKmluZm8gPSBwbGluay0+cHJpdjsKIAlpbnQgcmV0OwogCi0JaWYgKGljbCAhPSBwbGluaykKKwlpZiAoaWNkLT5saW5rICE9IHBsaW5rKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCWlmICgqcGRldikKQEAgLTUwLDcgKzQ5LDcgQEAKIAlpZiAoISpwZGV2KQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWluZm8tPmRldiA9IGRldjsKKwlpbmZvLT5pY2QgPSBpY2Q7CiAKIAkoKnBkZXYpLT5kZXYucGxhdGZvcm1fZGF0YSA9IGluZm87CiAJKCpwZGV2KS0+ZGV2LnJlbGVhc2UgPSByZWxlYXNlOwpAQCAtNTksMTcgKzU4LDE3IEBACiAJaWYgKHJldCA8IDApIHsKIAkJcGxhdGZvcm1fZGV2aWNlX3B1dCgqcGRldik7CiAJCSpwZGV2ID0gTlVMTDsKLQkJaW5mby0+ZGV2ID0gTlVMTDsKKwkJaW5mby0+aWNkID0gTlVMTDsKIAl9CiAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc29jX2NhbWVyYV9wbGF0Zm9ybV9kZWwoY29uc3Qgc3RydWN0IHNvY19jYW1lcmFfbGluayAqaWNsLAorc3RhdGljIGlubGluZSB2b2lkIHNvY19jYW1lcmFfcGxhdGZvcm1fZGVsKGNvbnN0IHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkLAogCQkJCQkgICBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LAogCQkJCQkgICBjb25zdCBzdHJ1Y3Qgc29jX2NhbWVyYV9saW5rICpwbGluaykKIHsKLQlpZiAoaWNsICE9IHBsaW5rIHx8ICFwZGV2KQorCWlmIChpY2QtPmxpbmsgIT0gcGxpbmsgfHwgIXBkZXYpCiAJCXJldHVybjsKIAogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBkZXYpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS90aW1iX3JhZGlvLmggYi9pbmNsdWRlL21lZGlhL3RpbWJfcmFkaW8uaAppbmRleCBhNTlhODQ4Li5hNDBhNmEzIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3RpbWJfcmFkaW8uaAorKysgYi9pbmNsdWRlL21lZGlhL3RpbWJfcmFkaW8uaApAQCAtMjMsMTMgKzIzLDggQEAKIAogc3RydWN0IHRpbWJfcmFkaW9fcGxhdGZvcm1fZGF0YSB7CiAJaW50IGkyY19hZGFwdGVyOyAvKiBJMkMgYWRhcHRlciB3aGVyZSB0aGUgdHVuZXIgYW5kIGRzcCBhcmUgYXR0YWNoZWQgKi8KLQlzdHJ1Y3QgewotCQlzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmluZm87Ci0JfSB0dW5lcjsKLQlzdHJ1Y3QgewotCQljb25zdCBjaGFyICptb2R1bGVfbmFtZTsKLQkJc3RydWN0IGkyY19ib2FyZF9pbmZvICppbmZvOwotCX0gZHNwOworCXN0cnVjdCBpMmNfYm9hcmRfaW5mbyAqdHVuZXI7CisJc3RydWN0IGkyY19ib2FyZF9pbmZvICpkc3A7CiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdHVuZXIuaCBiL2luY2x1ZGUvbWVkaWEvdHVuZXIuaAppbmRleCA5NjNlMzM0Li44OWMyOTBiIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3R1bmVyLmgKKysrIGIvaW5jbHVkZS9tZWRpYS90dW5lci5oCkBAIC0xMjcsNiArMTI3LDggQEAKICNkZWZpbmUgVFVORVJfUEhJTElQU19GTUQxMjE2TUVYX01LMwk3OAogI2RlZmluZSBUVU5FUl9QSElMSVBTX0ZNMTIxNk1LNQkJNzkKICNkZWZpbmUgVFVORVJfUEhJTElQU19GUTEyMTZMTUVfTUszCTgwCS8qIEFjdGl2ZSBsb29wdGhyb3VnaCwgbm8gRk0gKi8KKyNkZWZpbmUgVFVORVJfWEM0MDAwCQkJODEJLyogWGNlaXZlIFNpbGljb24gVHVuZXIgKi8KKwogI2RlZmluZSBUVU5FUl9QQVJUU05JQ19QVElfNU5GMDUJODEKICNkZWZpbmUgVFVORVJfUEhJTElQU19DVTEyMTZMICAgICAgICAgICA4MgogI2RlZmluZSBUVU5FUl9OWFBfVERBMTgyNzEJCTgzCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3Y0bDItY2hpcC1pZGVudC5oIGIvaW5jbHVkZS9tZWRpYS92NGwyLWNoaXAtaWRlbnQuaAppbmRleCBiM2VkYjY3Li42M2ZkOWQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3Y0bDItY2hpcC1pZGVudC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdjRsMi1jaGlwLWlkZW50LmgKQEAgLTc2LDYgKzc2LDcgQEAKIAlWNEwyX0lERU5UX09WNjY1MCA9IDI1OCwKIAlWNEwyX0lERU5UX09WMjY0MCA9IDI1OSwKIAlWNEwyX0lERU5UX09WOTc0MCA9IDI2MCwKKwlWNEwyX0lERU5UX09WNTY0MiA9IDI2MSwKIAogCS8qIG1vZHVsZSBzYWE3MTQ2OiByZXNlcnZlZCByYW5nZSAzMDAtMzA5ICovCiAJVjRMMl9JREVOVF9TQUE3MTQ2ID0gMzAwLApAQCAtMTg1LDggKzE4Niw5IEBACiAJLyogbW9kdWxlIHdtODc3NToganVzdCBpZGVudCA4Nzc1ICovCiAJVjRMMl9JREVOVF9XTTg3NzUgPSA4Nzc1LAogCi0JLyogbW9kdWxlIGNhZmVfY2NpYywganVzdCBpZGVudCA4ODAxICovCisJLyogTWFydmVsbCBjb250cm9sbGVycyBzdGFydGluZyBhdCA4ODAxICovCiAJVjRMMl9JREVOVF9DQUZFID0gODgwMSwKKwlWNEwyX0lERU5UX0FSTUFEQTYxMCA9IDg4MDIsCiAKIAkvKiBBS00gQUs4ODEzL0FLODgxNCAqLwogCVY0TDJfSURFTlRfQUs4ODEzID0gODgxMywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdjRsMi1jdHJscy5oIGIvaW5jbHVkZS9tZWRpYS92NGwyLWN0cmxzLmgKaW5kZXggOTdkMDYzOC4uMTNmZTRkNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92NGwyLWN0cmxzLmgKKysrIGIvaW5jbHVkZS9tZWRpYS92NGwyLWN0cmxzLmgKQEAgLTI3LDkgKzI3LDEyIEBACiAKIC8qIGZvcndhcmQgcmVmZXJlbmNlcyAqLwogc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyOworc3RydWN0IHY0bDJfY3RybF9oZWxwZXI7CiBzdHJ1Y3QgdjRsMl9jdHJsOwogc3RydWN0IHZpZGVvX2RldmljZTsKIHN0cnVjdCB2NGwyX3N1YmRldjsKK3N0cnVjdCB2NGwyX3N1YnNjcmliZWRfZXZlbnQ7CitzdHJ1Y3QgdjRsMl9maDsKIAogLyoqIHN0cnVjdCB2NGwyX2N0cmxfb3BzIC0gVGhlIGNvbnRyb2wgb3BlcmF0aW9ucyB0aGF0IHRoZSBkcml2ZXIgaGFzIHRvIHByb3ZpZGUuCiAgICogQGdfdm9sYXRpbGVfY3RybDogR2V0IGEgbmV3IHZhbHVlIGZvciB0aGlzIGNvbnRyb2wuIEdlbmVyYWxseSBvbmx5IHJlbGV2YW50CkBAIC01MSw2ICs1NCw3IEBACiAKIC8qKiBzdHJ1Y3QgdjRsMl9jdHJsIC0gVGhlIGNvbnRyb2wgc3RydWN0dXJlLgogICAqIEBub2RlOglUaGUgbGlzdCBub2RlLgorICAqIEBldl9zdWJzOglUaGUgbGlzdCBvZiBjb250cm9sIGV2ZW50IHN1YnNjcmlwdGlvbnMuCiAgICogQGhhbmRsZXI6CVRoZSBoYW5kbGVyIHRoYXQgb3ducyB0aGUgY29udHJvbC4KICAgKiBAY2x1c3RlcjoJUG9pbnQgdG8gc3RhcnQgb2YgY2x1c3RlciBhcnJheS4KICAgKiBAbmNvbnRyb2xzOglOdW1iZXIgb2YgY29udHJvbHMgaW4gY2x1c3RlciBhcnJheS4KQEAgLTY1LDYgKzY5LDE1IEBACiAgICoJCWNvbnRyb2wncyBjdXJyZW50IHZhbHVlIGNhbm5vdCBiZSBjYWNoZWQgYW5kIG5lZWRzIHRvIGJlCiAgICoJCXJldHJpZXZlZCB0aHJvdWdoIHRoZSBnX3ZvbGF0aWxlX2N0cmwgb3AuIERyaXZlcnMgY2FuIHNldAogICAqCQl0aGlzIGZsYWcuCisgICogQGlzX2F1dG86ICAgSWYgc2V0LCB0aGVuIHRoaXMgY29udHJvbCBzZWxlY3RzIHdoZXRoZXIgdGhlIG90aGVyIGNsdXN0ZXIKKyAgKgkJbWVtYmVycyBhcmUgaW4gJ2F1dG9tYXRpYycgbW9kZSBvciAnbWFudWFsJyBtb2RlLiBUaGlzIGlzCisgICoJCXVzZWQgZm9yIGF1dG9nYWluL2dhaW4gdHlwZSBjbHVzdGVycy4gRHJpdmVycyBzaG91bGQgbmV2ZXIKKyAgKgkJc2V0IHRoaXMgZmxhZyBkaXJlY3RseS4KKyAgKiBAbWFudWFsX21vZGVfdmFsdWU6IElmIHRoZSBpc19hdXRvIGZsYWcgaXMgc2V0LCB0aGVuIHRoaXMgaXMgdGhlIHZhbHVlCisgICoJCW9mIHRoZSBhdXRvIGNvbnRyb2wgdGhhdCBkZXRlcm1pbmVzIGlmIHRoYXQgY29udHJvbCBpcyBpbgorICAqCQltYW51YWwgbW9kZS4gU28gaWYgdGhlIHZhbHVlIG9mIHRoZSBhdXRvIGNvbnRyb2wgZXF1YWxzIHRoaXMKKyAgKgkJdmFsdWUsIHRoZW4gdGhlIHdob2xlIGNsdXN0ZXIgaXMgaW4gbWFudWFsIG1vZGUuIERyaXZlcnMgc2hvdWxkCisgICoJCW5ldmVyIHNldCB0aGlzIGZsYWcgZGlyZWN0bHkuCiAgICogQG9wczoJVGhlIGNvbnRyb2wgb3BzLgogICAqIEBpZDoJVGhlIGNvbnRyb2wgSUQuCiAgICogQG5hbWU6CVRoZSBjb250cm9sIG5hbWUuCkBAIC05Nyw2ICsxMTAsNyBAQAogc3RydWN0IHY0bDJfY3RybCB7CiAJLyogQWRtaW5pc3RyYXRpdmUgZmllbGRzICovCiAJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCXN0cnVjdCBsaXN0X2hlYWQgZXZfc3ViczsKIAlzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgKmhhbmRsZXI7CiAJc3RydWN0IHY0bDJfY3RybCAqKmNsdXN0ZXI7CiAJdW5zaWduZWQgbmNvbnRyb2xzOwpAQCAtMTA1LDYgKzExOSw4IEBACiAJdW5zaWduZWQgaW50IGlzX25ldzoxOwogCXVuc2lnbmVkIGludCBpc19wcml2YXRlOjE7CiAJdW5zaWduZWQgaW50IGlzX3ZvbGF0aWxlOjE7CisJdW5zaWduZWQgaW50IGlzX2F1dG86MTsKKwl1bnNpZ25lZCBpbnQgbWFudWFsX21vZGVfdmFsdWU6ODsKIAogCWNvbnN0IHN0cnVjdCB2NGwyX2N0cmxfb3BzICpvcHM7CiAJdTMyIGlkOwpAQCAtMTM0LDYgKzE1MCw3IEBACiAgICogQG5vZGU6CUxpc3Qgbm9kZSBmb3IgdGhlIHNvcnRlZCBsaXN0LgogICAqIEBuZXh0OglTaW5nbGUtbGluayBsaXN0IG5vZGUgZm9yIHRoZSBoYXNoLgogICAqIEBjdHJsOglUaGUgYWN0dWFsIGNvbnRyb2wgaW5mb3JtYXRpb24uCisgICogQGhlbHBlcjoJUG9pbnRlciB0byBoZWxwZXIgc3RydWN0LiBVc2VkIGludGVybmFsbHkgaW4gcHJlcGFyZV9leHRfY3RybHMoKS4KICAgKgogICAqIEVhY2ggY29udHJvbCBoYW5kbGVyIGhhcyBhIGxpc3Qgb2YgdGhlc2UgcmVmcy4gVGhlIGxpc3RfaGVhZCBpcyB1c2VkIHRvCiAgICoga2VlcCBhIHNvcnRlZC1ieS1jb250cm9sLUlEIGxpc3Qgb2YgYWxsIGNvbnRyb2xzLCB3aGlsZSB0aGUgbmV4dCBwb2ludGVyCkBAIC0xNDMsNiArMTYwLDcgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CiAJc3RydWN0IHY0bDJfY3RybF9yZWYgKm5leHQ7CiAJc3RydWN0IHY0bDJfY3RybCAqY3RybDsKKwlzdHJ1Y3QgdjRsMl9jdHJsX2hlbHBlciAqaGVscGVyOwogfTsKIAogLyoqIHN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciAtIFRoZSBjb250cm9sIGhhbmRsZXIga2VlcHMgdHJhY2sgb2YgYWxsIHRoZQpAQCAtMzYzLDYgKzM4MSw0MCBAQAogdm9pZCB2NGwyX2N0cmxfY2x1c3Rlcih1bnNpZ25lZCBuY29udHJvbHMsIHN0cnVjdCB2NGwyX2N0cmwgKipjb250cm9scyk7CiAKIAorLyoqIHY0bDJfY3RybF9hdXRvX2NsdXN0ZXIoKSAtIE1hcmsgYWxsIGNvbnRyb2xzIGluIHRoZSBjbHVzdGVyIGFzIGJlbG9uZ2luZyB0bworICAqIHRoYXQgY2x1c3RlciBhbmQgc2V0IGl0IHVwIGZvciBhdXRvZm9vL2Zvby10eXBlIGhhbmRsaW5nLgorICAqIEBuY29udHJvbHM6CVRoZSBudW1iZXIgb2YgY29udHJvbHMgaW4gdGhpcyBjbHVzdGVyLgorICAqIEBjb250cm9sczoJVGhlIGNsdXN0ZXIgY29udHJvbCBhcnJheSBvZiBzaXplIEBuY29udHJvbHMuIFRoZSBmaXJzdCBjb250cm9sCisgICoJCW11c3QgYmUgdGhlICdhdXRvJyBjb250cm9sIChlLmcuIGF1dG9nYWluLCBhdXRvZXhwb3N1cmUsIGV0Yy4pCisgICogQG1hbnVhbF92YWw6IFRoZSB2YWx1ZSBmb3IgdGhlIGZpcnN0IGNvbnRyb2wgaW4gdGhlIGNsdXN0ZXIgdGhhdCBlcXVhbHMgdGhlCisgICoJCW1hbnVhbCBzZXR0aW5nLgorICAqIEBzZXRfdm9sYXRpbGU6IElmIHRydWUsIHRoZW4gYWxsIGNvbnRyb2xzIGV4Y2VwdCB0aGUgZmlyc3QgYXV0byBjb250cm9sIHdpbGwKKyAgKgkJaGF2ZSBpc192b2xhdGlsZSBzZXQgdG8gdHJ1ZS4gSWYgZmFsc2UsIHRoZW4gaXNfdm9sYXRpbGUgd2lsbCBub3QKKyAgKgkJYmUgdG91Y2hlZC4KKyAgKgorICAqIFVzZSBmb3IgY29udHJvbCBncm91cHMgd2hlcmUgb25lIGNvbnRyb2wgc2VsZWN0cyBzb21lIGF1dG9tYXRpYyBmZWF0dXJlIGFuZAorICAqIHRoZSBvdGhlciBjb250cm9scyBhcmUgb25seSBhY3RpdmUgd2hlbmV2ZXIgdGhlIGF1dG9tYXRpYyBmZWF0dXJlIGlzIHR1cm5lZAorICAqIG9mZiAobWFudWFsIG1vZGUpLiBUeXBpY2FsIGV4YW1wbGVzOiBhdXRvZ2FpbiB2cyBnYWluLCBhdXRvLXdoaXRlYmFsYW5jZSB2cworICAqIHJlZCBhbmQgYmx1ZSBiYWxhbmNlLCBldGMuCisgICoKKyAgKiBUaGUgYmVoYXZpb3Igb2Ygc3VjaCBjb250cm9scyBpcyBhcyBmb2xsb3dzOgorICAqCisgICogV2hlbiB0aGUgYXV0b2ZvbyBjb250cm9sIGlzIHNldCB0byBhdXRvbWF0aWMsIHRoZW4gYW55IG1hbnVhbCBjb250cm9scworICAqIGFyZSBzZXQgdG8gaW5hY3RpdmUgYW5kIGFueSByZWFkcyB3aWxsIGNhbGwgZ192b2xhdGlsZV9jdHJsIChpZiB0aGUgY29udHJvbAorICAqIHdhcyBtYXJrZWQgdm9sYXRpbGUpLgorICAqCisgICogV2hlbiB0aGUgYXV0b2ZvbyBjb250cm9sIGlzIHNldCB0byBtYW51YWwsIHRoZW4gYW55IG1hbnVhbCBjb250cm9scyB3aWxsCisgICogYmUgbWFya2VkIGFjdGl2ZSwgYW5kIGFueSByZWFkcyB3aWxsIGp1c3QgcmV0dXJuIHRoZSBjdXJyZW50IHZhbHVlIHdpdGhvdXQKKyAgKiBnb2luZyB0aHJvdWdoIGdfdm9sYXRpbGVfY3RybC4KKyAgKgorICAqIEluIGFkZGl0aW9uLCB0aGlzIGZ1bmN0aW9uIHdpbGwgc2V0IHRoZSBWNEwyX0NUUkxfRkxBR19VUERBVEUgZmxhZworICAqIG9uIHRoZSBhdXRvZm9vIGNvbnRyb2wgYW5kIFY0TDJfQ1RSTF9GTEFHX0lOQUNUSVZFIG9uIHRoZSBmb28gY29udHJvbChzKQorICAqIGlmIGF1dG9mb28gaXMgaW4gYXV0byBtb2RlLgorICAqLwordm9pZCB2NGwyX2N0cmxfYXV0b19jbHVzdGVyKHVuc2lnbmVkIG5jb250cm9scywgc3RydWN0IHY0bDJfY3RybCAqKmNvbnRyb2xzLAorCQkJdTggbWFudWFsX3ZhbCwgYm9vbCBzZXRfdm9sYXRpbGUpOworCisKIC8qKiB2NGwyX2N0cmxfZmluZCgpIC0gRmluZCBhIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gSUQuCiAgICogQGhkbDoJVGhlIGNvbnRyb2wgaGFuZGxlci4KICAgKiBAaWQ6CVRoZSBjb250cm9sIElEIHRvIGZpbmQuCkBAIC0zNzksOSArNDMxLDkgQEAKICAgKiBUaGlzIHNldHMgb3IgY2xlYXJzIHRoZSBWNEwyX0NUUkxfRkxBR19JTkFDVElWRSBmbGFnIGF0b21pY2FsbHkuCiAgICogRG9lcyBub3RoaW5nIGlmIEBjdHJsID09IE5VTEwuCiAgICogVGhpcyB3aWxsIHVzdWFsbHkgYmUgY2FsbGVkIGZyb20gd2l0aGluIHRoZSBzX2N0cmwgb3AuCisgICogVGhlIFY0TDJfRVZFTlRfQ1RSTCBldmVudCB3aWxsIGJlIGdlbmVyYXRlZCBhZnRlcndhcmRzLgogICAqCi0gICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgY29udHJvbCBoYW5kbGVyCi0gICogaXMgbG9ja2VkIG9yIG5vdC4KKyAgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGUgY29udHJvbCBoYW5kbGVyIGlzIGxvY2tlZC4KICAgKi8KIHZvaWQgdjRsMl9jdHJsX2FjdGl2YXRlKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwsIGJvb2wgYWN0aXZlKTsKIApAQCAtMzkxLDExICs0NDMsMTIgQEAKICAgKgogICAqIFRoaXMgc2V0cyBvciBjbGVhcnMgdGhlIFY0TDJfQ1RSTF9GTEFHX0dSQUJCRUQgZmxhZyBhdG9taWNhbGx5LgogICAqIERvZXMgbm90aGluZyBpZiBAY3RybCA9PSBOVUxMLgorICAqIFRoZSBWNEwyX0VWRU5UX0NUUkwgZXZlbnQgd2lsbCBiZSBnZW5lcmF0ZWQgYWZ0ZXJ3YXJkcy4KICAgKiBUaGlzIHdpbGwgdXN1YWxseSBiZSBjYWxsZWQgd2hlbiBzdGFydGluZyBvciBzdG9wcGluZyBzdHJlYW1pbmcgaW4gdGhlCiAgICogZHJpdmVyLgogICAqCi0gICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgY29udHJvbCBoYW5kbGVyCi0gICogaXMgbG9ja2VkIG9yIG5vdC4KKyAgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB0aGUgY29udHJvbCBoYW5kbGVyIGlzIG5vdCBsb2NrZWQgYW5kIHdpbGwKKyAgKiB0YWtlIHRoZSBsb2NrIGl0c2VsZi4KICAgKi8KIHZvaWQgdjRsMl9jdHJsX2dyYWIoc3RydWN0IHY0bDJfY3RybCAqY3RybCwgYm9vbCBncmFiYmVkKTsKIApAQCAtNDQwLDE1ICs0OTMsMjIgQEAKICAgKi8KIGludCB2NGwyX2N0cmxfc19jdHJsKHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwsIHMzMiB2YWwpOwogCisvKiBJbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb25zIHRoYXQgZGVhbCB3aXRoIGNvbnRyb2wgZXZlbnRzLiAqLwordm9pZCB2NGwyX2N0cmxfYWRkX2V2ZW50KHN0cnVjdCB2NGwyX2N0cmwgKmN0cmwsCisJCXN0cnVjdCB2NGwyX3N1YnNjcmliZWRfZXZlbnQgKnNldik7Cit2b2lkIHY0bDJfY3RybF9kZWxfZXZlbnQoc3RydWN0IHY0bDJfY3RybCAqY3RybCwKKwkJc3RydWN0IHY0bDJfc3Vic2NyaWJlZF9ldmVudCAqc2V2KTsKIAogLyogSGVscGVycyBmb3IgaW9jdGxfb3BzLiBJZiBoZGwgPT0gTlVMTCB0aGVuIHRoZXkgd2lsbCBhbGwgcmV0dXJuIC1FSU5WQUwuICovCiBpbnQgdjRsMl9xdWVyeWN0cmwoc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyICpoZGwsIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCAqcWMpOwogaW50IHY0bDJfcXVlcnltZW51KHN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciAqaGRsLCBzdHJ1Y3QgdjRsMl9xdWVyeW1lbnUgKnFtKTsKIGludCB2NGwyX2dfY3RybChzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgKmhkbCwgc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCk7Ci1pbnQgdjRsMl9zX2N0cmwoc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyICpoZGwsIHN0cnVjdCB2NGwyX2NvbnRyb2wgKmN0cmwpOworaW50IHY0bDJfc19jdHJsKHN0cnVjdCB2NGwyX2ZoICpmaCwgc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyICpoZGwsCisJCQkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sICpjdHJsKTsKIGludCB2NGwyX2dfZXh0X2N0cmxzKHN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciAqaGRsLCBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgKmMpOwogaW50IHY0bDJfdHJ5X2V4dF9jdHJscyhzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgKmhkbCwgc3RydWN0IHY0bDJfZXh0X2NvbnRyb2xzICpjKTsKLWludCB2NGwyX3NfZXh0X2N0cmxzKHN0cnVjdCB2NGwyX2N0cmxfaGFuZGxlciAqaGRsLCBzdHJ1Y3QgdjRsMl9leHRfY29udHJvbHMgKmMpOworaW50IHY0bDJfc19leHRfY3RybHMoc3RydWN0IHY0bDJfZmggKmZoLCBzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgKmhkbCwKKwkJCQkJCXN0cnVjdCB2NGwyX2V4dF9jb250cm9scyAqYyk7CiAKIC8qIEhlbHBlcnMgZm9yIHN1YmRldmljZXMuIElmIHRoZSBhc3NvY2lhdGVkIGN0cmxfaGFuZGxlciA9PSBOVUxMIHRoZW4gdGhleQogICAgd2lsbCBhbGwgcmV0dXJuIC1FSU5WQUwuICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3Y0bDItZXZlbnQuaCBiL2luY2x1ZGUvbWVkaWEvdjRsMi1ldmVudC5oCmluZGV4IDNiODYxNzcuLjVmMTRlODggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdjRsMi1ldmVudC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdjRsMi1ldmVudC5oCkBAIC0yOSwzOSArMjksOTUgQEAKICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAKKy8qCisgKiBPdmVydmlldzoKKyAqCisgKiBFdmVudHMgYXJlIHN1YnNjcmliZWQgcGVyLWZpbGVoYW5kbGUuIEFuIGV2ZW50IHNwZWNpZmljYXRpb24gY29uc2lzdHMgb2YgYQorICogdHlwZSBhbmQgaXMgb3B0aW9uYWxseSBhc3NvY2lhdGVkIHdpdGggYW4gb2JqZWN0IGlkZW50aWZpZWQgdGhyb3VnaCB0aGUKKyAqICdpZCcgZmllbGQuIFNvIGFuIGV2ZW50IGlzIHVuaXF1ZWx5IGlkZW50aWZpZWQgYnkgdGhlICh0eXBlLCBpZCkgdHVwbGUuCisgKgorICogVGhlIHY0bDItZmggc3RydWN0IGhhcyBhIGxpc3Qgb2Ygc3Vic2NyaWJlZCBldmVudHMuIFRoZSB2NGwyX3N1YnNjcmliZWRfZXZlbnQKKyAqIHN0cnVjdCBpcyBhZGRlZCB0byB0aGF0IGxpc3QsIG9uZSBmb3IgZXZlcnkgc3Vic2NyaWJlZCBldmVudC4KKyAqCisgKiBFYWNoIHY0bDJfc3Vic2NyaWJlZF9ldmVudCBzdHJ1Y3QgZW5kcyB3aXRoIGFuIGFycmF5IG9mIHY0bDJfa2V2ZW50IHN0cnVjdHMuCisgKiBUaGlzIGFycmF5IChyaW5nYnVmZmVyLCByZWFsbHkpIGlzIHVzZWQgdG8gc3RvcmUgYW55IGV2ZW50cyByYWlzZWQgYnkgdGhlCisgKiBkcml2ZXIuIFRoZSB2NGwyX2tldmVudCBzdHJ1Y3QgbGlua3MgaW50byB0aGUgJ2F2YWlsYWJsZScgbGlzdCBvZiB0aGUKKyAqIHY0bDJfZmggc3RydWN0IHNvIFZJRElPQ19EUUVWRU5UIHdpbGwga25vdyB3aGljaCBldmVudCB0byBkZXF1ZXVlIGZpcnN0LgorICoKKyAqIEZpbmFsbHksIGlmIHRoZSBldmVudCBzdWJzY3JpcHRpb24gaXMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBvYmplY3QKKyAqIHN1Y2ggYXMgYSBWNEwyIGNvbnRyb2wsIHRoZW4gdGhhdCBvYmplY3QgbmVlZHMgdG8ga25vdyBhYm91dCB0aGF0IGFzIHdlbGwKKyAqIHNvIHRoYXQgYW4gZXZlbnQgY2FuIGJlIHJhaXNlZCBieSB0aGF0IG9iamVjdC4gU28gdGhlICdub2RlJyBmaWVsZCBjYW4KKyAqIGJlIHVzZWQgdG8gbGluayB0aGUgdjRsMl9zdWJzY3JpYmVkX2V2ZW50IHN0cnVjdCBpbnRvIGEgbGlzdCBvZiB0aGF0CisgKiBvYmplY3QuCisgKgorICogU28gdG8gc3VtbWFyaXplOgorICoKKyAqIHN0cnVjdCB2NGwyX2ZoIGhhcyB0d28gbGlzdHM6IG9uZSBvZiB0aGUgc3Vic2NyaWJlZCBldmVudHMsIGFuZCBvbmUgb2YgdGhlCisgKiBwZW5kaW5nIGV2ZW50cy4KKyAqCisgKiBzdHJ1Y3QgdjRsMl9zdWJzY3JpYmVkX2V2ZW50IGhhcyBhIHJpbmdidWZmZXIgb2YgcmFpc2VkIChwZW5kaW5nKSBldmVudHMgb2YKKyAqIHRoYXQgcGFydGljdWxhciB0eXBlLgorICoKKyAqIElmIHN0cnVjdCB2NGwyX3N1YnNjcmliZWRfZXZlbnQgaXMgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgb2JqZWN0LCB0aGVuCisgKiB0aGF0IG9iamVjdCB3aWxsIGhhdmUgYW4gaW50ZXJuYWwgbGlzdCBvZiBzdHJ1Y3QgdjRsMl9zdWJzY3JpYmVkX2V2ZW50IHNvCisgKiBpdCBrbm93cyB3aG8gc3Vic2NyaWJlZCBhbiBldmVudCB0byB0aGF0IG9iamVjdC4KKyAqLworCiBzdHJ1Y3QgdjRsMl9maDsKK3N0cnVjdCB2NGwyX3N1YnNjcmliZWRfZXZlbnQ7CiBzdHJ1Y3QgdmlkZW9fZGV2aWNlOwogCisvKiogc3RydWN0IHY0bDJfa2V2ZW50IC0gSW50ZXJuYWwga2VybmVsIGV2ZW50IHN0cnVjdC4KKyAgKiBAbGlzdDoJTGlzdCBub2RlIGZvciB0aGUgdjRsMl9maC0+YXZhaWxhYmxlIGxpc3QuCisgICogQHNldjoJUG9pbnRlciB0byBwYXJlbnQgdjRsMl9zdWJzY3JpYmVkX2V2ZW50LgorICAqIEBldmVudDoJVGhlIGV2ZW50IGl0c2VsZi4KKyAgKi8KIHN0cnVjdCB2NGwyX2tldmVudCB7CiAJc3RydWN0IGxpc3RfaGVhZAlsaXN0OworCXN0cnVjdCB2NGwyX3N1YnNjcmliZWRfZXZlbnQgKnNldjsKIAlzdHJ1Y3QgdjRsMl9ldmVudAlldmVudDsKIH07CiAKKy8qKiBzdHJ1Y3QgdjRsMl9zdWJzY3JpYmVkX2V2ZW50IC0gSW50ZXJuYWwgc3RydWN0IHJlcHJlc2VudGluZyBhIHN1YnNjcmliZWQgZXZlbnQuCisgICogQGxpc3Q6CUxpc3Qgbm9kZSBmb3IgdGhlIHY0bDJfZmgtPnN1YnNjcmliZWQgbGlzdC4KKyAgKiBAdHlwZToJRXZlbnQgdHlwZS4KKyAgKiBAaWQ6CUFzc29jaWF0ZWQgb2JqZWN0IElEIChlLmcuIGNvbnRyb2wgSUQpLiAwIGlmIHRoZXJlIGlzbid0IGFueS4KKyAgKiBAZmxhZ3M6CUNvcHkgb2YgdjRsMl9ldmVudF9zdWJzY3JpcHRpb24tPmZsYWdzLgorICAqIEBmaDoJRmlsZWhhbmRsZSB0aGF0IHN1YnNjcmliZWQgdG8gdGhpcyBldmVudC4KKyAgKiBAbm9kZToJTGlzdCBub2RlIHRoYXQgaG9va3MgaW50byB0aGUgb2JqZWN0J3MgZXZlbnQgbGlzdCAoaWYgdGhlcmUgaXMgb25lKS4KKyAgKiBAcmVwbGFjZToJT3B0aW9uYWwgY2FsbGJhY2sgdGhhdCBjYW4gcmVwbGFjZSBldmVudCAnb2xkJyB3aXRoIGV2ZW50ICduZXcnLgorICAqIEBtZXJnZToJT3B0aW9uYWwgY2FsbGJhY2sgdGhhdCBjYW4gbWVyZ2UgZXZlbnQgJ29sZCcgaW50byBldmVudCAnbmV3Jy4KKyAgKiBAZWxlbXM6CVRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGV2ZW50cyBhcnJheS4KKyAgKiBAZmlyc3Q6CVRoZSBpbmRleCBvZiB0aGUgZXZlbnRzIGNvbnRhaW5pbmcgdGhlIG9sZGVzdCBhdmFpbGFibGUgZXZlbnQuCisgICogQGluX3VzZToJVGhlIG51bWJlciBvZiBxdWV1ZWQgZXZlbnRzLgorICAqIEBldmVudHM6CUFuIGFycmF5IG9mIEBlbGVtcyBldmVudHMuCisgICovCiBzdHJ1Y3QgdjRsMl9zdWJzY3JpYmVkX2V2ZW50IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CiAJdTMyCQkJdHlwZTsKKwl1MzIJCQlpZDsKKwl1MzIJCQlmbGFnczsKKwlzdHJ1Y3QgdjRsMl9maAkJKmZoOworCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKKwl2b2lkCQkJKCpyZXBsYWNlKShzdHJ1Y3QgdjRsMl9ldmVudCAqb2xkLAorCQkJCQkgICBjb25zdCBzdHJ1Y3QgdjRsMl9ldmVudCAqbmV3KTsKKwl2b2lkCQkJKCptZXJnZSkoY29uc3Qgc3RydWN0IHY0bDJfZXZlbnQgKm9sZCwKKwkJCQkJIHN0cnVjdCB2NGwyX2V2ZW50ICpuZXcpOworCXVuc2lnbmVkCQllbGVtczsKKwl1bnNpZ25lZAkJZmlyc3Q7CisJdW5zaWduZWQJCWluX3VzZTsKKwlzdHJ1Y3QgdjRsMl9rZXZlbnQJZXZlbnRzW107CiB9OwogCi1zdHJ1Y3QgdjRsMl9ldmVudHMgewotCXdhaXRfcXVldWVfaGVhZF90CXdhaXQ7Ci0Jc3RydWN0IGxpc3RfaGVhZAlzdWJzY3JpYmVkOyAvKiBTdWJzY3JpYmVkIGV2ZW50cyAqLwotCXN0cnVjdCBsaXN0X2hlYWQJZnJlZTsgLyogRXZlbnRzIHJlYWR5IGZvciB1c2UgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkCWF2YWlsYWJsZTsgLyogRGVxdWV1ZWFibGUgZXZlbnQgKi8KLQl1bnNpZ25lZCBpbnQJCW5hdmFpbGFibGU7Ci0JdW5zaWduZWQgaW50CQluYWxsb2NhdGVkOyAvKiBOdW1iZXIgb2YgYWxsb2NhdGVkIGV2ZW50cyAqLwotCXUzMgkJCXNlcXVlbmNlOwotfTsKLQotaW50IHY0bDJfZXZlbnRfaW5pdChzdHJ1Y3QgdjRsMl9maCAqZmgpOwotaW50IHY0bDJfZXZlbnRfYWxsb2Moc3RydWN0IHY0bDJfZmggKmZoLCB1bnNpZ25lZCBpbnQgbik7Ci12b2lkIHY0bDJfZXZlbnRfZnJlZShzdHJ1Y3QgdjRsMl9maCAqZmgpOwogaW50IHY0bDJfZXZlbnRfZGVxdWV1ZShzdHJ1Y3QgdjRsMl9maCAqZmgsIHN0cnVjdCB2NGwyX2V2ZW50ICpldmVudCwKIAkJICAgICAgIGludCBub25ibG9ja2luZyk7CiB2b2lkIHY0bDJfZXZlbnRfcXVldWUoc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiwgY29uc3Qgc3RydWN0IHY0bDJfZXZlbnQgKmV2KTsKK3ZvaWQgdjRsMl9ldmVudF9xdWV1ZV9maChzdHJ1Y3QgdjRsMl9maCAqZmgsIGNvbnN0IHN0cnVjdCB2NGwyX2V2ZW50ICpldik7CiBpbnQgdjRsMl9ldmVudF9wZW5kaW5nKHN0cnVjdCB2NGwyX2ZoICpmaCk7CiBpbnQgdjRsMl9ldmVudF9zdWJzY3JpYmUoc3RydWN0IHY0bDJfZmggKmZoLAotCQkJIHN0cnVjdCB2NGwyX2V2ZW50X3N1YnNjcmlwdGlvbiAqc3ViKTsKKwkJCSBzdHJ1Y3QgdjRsMl9ldmVudF9zdWJzY3JpcHRpb24gKnN1YiwgdW5zaWduZWQgZWxlbXMpOwogaW50IHY0bDJfZXZlbnRfdW5zdWJzY3JpYmUoc3RydWN0IHY0bDJfZmggKmZoLAogCQkJICAgc3RydWN0IHY0bDJfZXZlbnRfc3Vic2NyaXB0aW9uICpzdWIpOwordm9pZCB2NGwyX2V2ZW50X3Vuc3Vic2NyaWJlX2FsbChzdHJ1Y3QgdjRsMl9maCAqZmgpOwogCiAjZW5kaWYgLyogVjRMMl9FVkVOVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL3Y0bDItZmguaCBiL2luY2x1ZGUvbWVkaWEvdjRsMi1maC5oCmluZGV4IDAyMDZhYTUuLjUyNTEzYzIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdjRsMi1maC5oCisrKyBiL2luY2x1ZGUvbWVkaWEvdjRsMi1maC5oCkBAIC0yOSwxMyArMjksMjAgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAKIHN0cnVjdCB2aWRlb19kZXZpY2U7Ci1zdHJ1Y3QgdjRsMl9ldmVudHM7CitzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXI7CiAKIHN0cnVjdCB2NGwyX2ZoIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CiAJc3RydWN0IHZpZGVvX2RldmljZQkqdmRldjsKLQlzdHJ1Y3QgdjRsMl9ldmVudHMgICAgICAqZXZlbnRzOyAvKiBldmVudHMsIHBlbmRpbmcgYW5kIHN1YnNjcmliZWQgKi8KKwlzdHJ1Y3QgdjRsMl9jdHJsX2hhbmRsZXIgKmN0cmxfaGFuZGxlcjsKIAllbnVtIHY0bDJfcHJpb3JpdHkJcHJpbzsKKworCS8qIEV2ZW50cyAqLworCXdhaXRfcXVldWVfaGVhZF90CXdhaXQ7CisJc3RydWN0IGxpc3RfaGVhZAlzdWJzY3JpYmVkOyAvKiBTdWJzY3JpYmVkIGV2ZW50cyAqLworCXN0cnVjdCBsaXN0X2hlYWQJYXZhaWxhYmxlOyAvKiBEZXF1ZXVlYWJsZSBldmVudCAqLworCXVuc2lnbmVkIGludAkJbmF2YWlsYWJsZTsKKwl1MzIJCQlzZXF1ZW5jZTsKIH07CiAKIC8qCkBAIC00NCw3ICs1MSw3IEBACiAgKiBmcm9tIGRyaXZlcidzIHY0bDJfZmlsZV9vcGVyYXRpb25zLT5vcGVuKCkgaGFuZGxlciBpZiB0aGUgZHJpdmVyCiAgKiB1c2VzIHY0bDJfZmguCiAgKi8KLWludCB2NGwyX2ZoX2luaXQoc3RydWN0IHY0bDJfZmggKmZoLCBzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2KTsKK3ZvaWQgdjRsMl9maF9pbml0KHN0cnVjdCB2NGwyX2ZoICpmaCwgc3RydWN0IHZpZGVvX2RldmljZSAqdmRldik7CiAvKgogICogQWRkIHRoZSBmaCB0byB0aGUgbGlzdCBvZiBmaWxlIGhhbmRsZXMgb24gYSB2aWRlb19kZXZpY2UuIFRoZSBmaWxlCiAgKiBoYW5kbGUgbXVzdCBiZSBpbml0aWFsaXNlZCBmaXJzdC4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvdjRsMi1tZWRpYWJ1cy5oIGIvaW5jbHVkZS9tZWRpYS92NGwyLW1lZGlhYnVzLmgKaW5kZXggOTcxYzdmYS4uNjExNDAwNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZWRpYS92NGwyLW1lZGlhYnVzLmgKKysrIGIvaW5jbHVkZS9tZWRpYS92NGwyLW1lZGlhYnVzLmgKQEAgLTEzLDYgKzEzLDY5IEBACiAKICNpbmNsdWRlIDxsaW51eC92NGwyLW1lZGlhYnVzLmg+CiAKKy8qIFBhcmFsbGVsIGZsYWdzICovCisvKgorICogQ2FuIHRoZSBjbGllbnQgcnVuIGluIG1hc3RlciBvciBpbiBzbGF2ZSBtb2RlLiBCeSAiTWFzdGVyIG1vZGUiIGFuIG9wZXJhdGlvbgorICogbW9kZSBpcyBtZWFudCwgd2hlbiB0aGUgY2xpZW50IChlLmcuLCBhIGNhbWVyYSBzZW5zb3IpIGlzIHByb2R1Y2luZworICogaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgc3luY2hyb25pc2F0aW9uLiBJbiAiU2xhdmUgbW9kZSIgdGhlIGhvc3QgaXMKKyAqIHByb3ZpZGluZyB0aGVzZSBzaWduYWxzIHRvIHRoZSBzbGF2ZS4KKyAqLworI2RlZmluZSBWNEwyX01CVVNfTUFTVEVSCQkJKDEgPDwgMCkKKyNkZWZpbmUgVjRMMl9NQlVTX1NMQVZFCQkJCSgxIDw8IDEpCisvKiBXaGljaCBzaWduYWwgcG9sYXJpdGllcyBpdCBzdXBwb3J0cyAqLworLyogTm90ZTogaW4gQlQuNjU2IG1vZGUgSFNZTkMgYW5kIFZTWU5DIGFyZSB1bnVzZWQgKi8KKyNkZWZpbmUgVjRMMl9NQlVTX0hTWU5DX0FDVElWRV9ISUdICQkoMSA8PCAyKQorI2RlZmluZSBWNEwyX01CVVNfSFNZTkNfQUNUSVZFX0xPVwkJKDEgPDwgMykKKyNkZWZpbmUgVjRMMl9NQlVTX1ZTWU5DX0FDVElWRV9ISUdICQkoMSA8PCA0KQorI2RlZmluZSBWNEwyX01CVVNfVlNZTkNfQUNUSVZFX0xPVwkJKDEgPDwgNSkKKyNkZWZpbmUgVjRMMl9NQlVTX1BDTEtfU0FNUExFX1JJU0lORwkJKDEgPDwgNikKKyNkZWZpbmUgVjRMMl9NQlVTX1BDTEtfU0FNUExFX0ZBTExJTkcJCSgxIDw8IDcpCisjZGVmaW5lIFY0TDJfTUJVU19EQVRBX0FDVElWRV9ISUdICQkoMSA8PCA4KQorI2RlZmluZSBWNEwyX01CVVNfREFUQV9BQ1RJVkVfTE9XCQkoMSA8PCA5KQorCisvKiBTZXJpYWwgZmxhZ3MgKi8KKy8qIEhvdyBtYW55IGxhbmVzIHRoZSBjbGllbnQgY2FuIHVzZSAqLworI2RlZmluZSBWNEwyX01CVVNfQ1NJMl8xX0xBTkUJCQkoMSA8PCAwKQorI2RlZmluZSBWNEwyX01CVVNfQ1NJMl8yX0xBTkUJCQkoMSA8PCAxKQorI2RlZmluZSBWNEwyX01CVVNfQ1NJMl8zX0xBTkUJCQkoMSA8PCAyKQorI2RlZmluZSBWNEwyX01CVVNfQ1NJMl80X0xBTkUJCQkoMSA8PCAzKQorLyogT24gd2hpY2ggY2hhbm5lbHMgaXQgY2FuIHNlbmQgdmlkZW8gZGF0YSAqLworI2RlZmluZSBWNEwyX01CVVNfQ1NJMl9DSEFOTkVMXzAJCSgxIDw8IDQpCisjZGVmaW5lIFY0TDJfTUJVU19DU0kyX0NIQU5ORUxfMQkJKDEgPDwgNSkKKyNkZWZpbmUgVjRMMl9NQlVTX0NTSTJfQ0hBTk5FTF8yCQkoMSA8PCA2KQorI2RlZmluZSBWNEwyX01CVVNfQ1NJMl9DSEFOTkVMXzMJCSgxIDw8IDcpCisvKiBEb2VzIGl0IHN1cHBvcnQgb25seSBjb250aW51b3VzIG9yIGFsc28gbm9uLWNvbnRpbnVvdXMgY2xvY2sgbW9kZSAqLworI2RlZmluZSBWNEwyX01CVVNfQ1NJMl9DT05USU5VT1VTX0NMT0NLCQkoMSA8PCA4KQorI2RlZmluZSBWNEwyX01CVVNfQ1NJMl9OT05DT05USU5VT1VTX0NMT0NLCSgxIDw8IDkpCisKKyNkZWZpbmUgVjRMMl9NQlVTX0NTSTJfTEFORVMJCShWNEwyX01CVVNfQ1NJMl8xX0xBTkUgfCBWNEwyX01CVVNfQ1NJMl8yX0xBTkUgfCBcCisJCQkJCSBWNEwyX01CVVNfQ1NJMl8zX0xBTkUgfCBWNEwyX01CVVNfQ1NJMl80X0xBTkUpCisjZGVmaW5lIFY0TDJfTUJVU19DU0kyX0NIQU5ORUxTCQkoVjRMMl9NQlVTX0NTSTJfQ0hBTk5FTF8wIHwgVjRMMl9NQlVTX0NTSTJfQ0hBTk5FTF8xIHwgXAorCQkJCQkgVjRMMl9NQlVTX0NTSTJfQ0hBTk5FTF8yIHwgVjRMMl9NQlVTX0NTSTJfQ0hBTk5FTF8zKQorCisvKioKKyAqIHY0bDJfbWJ1c190eXBlIC0gbWVkaWEgYnVzIHR5cGUKKyAqIEBWNEwyX01CVVNfUEFSQUxMRUw6CXBhcmFsbGVsIGludGVyZmFjZSB3aXRoIGhzeW5jIGFuZCB2c3luYworICogQFY0TDJfTUJVU19CVDY1NjoJcGFyYWxsZWwgaW50ZXJmYWNlIHdpdGggZW1iZWRkZWQgc3luY2hyb25pc2F0aW9uLCBjYW4KKyAqCQkJYWxzbyBiZSB1c2VkIGZvciBCVC4xMTIwCisgKiBAVjRMMl9NQlVTX0NTSTI6CU1JUEkgQ1NJLTIgc2VyaWFsIGludGVyZmFjZQorICovCitlbnVtIHY0bDJfbWJ1c190eXBlIHsKKwlWNEwyX01CVVNfUEFSQUxMRUwsCisJVjRMMl9NQlVTX0JUNjU2LAorCVY0TDJfTUJVU19DU0kyLAorfTsKKworLyoqCisgKiB2NGwyX21idXNfY29uZmlnIC0gbWVkaWEgYnVzIGNvbmZpZ3VyYXRpb24KKyAqIEB0eXBlOglpbjogaW50ZXJmYWNlIHR5cGUKKyAqIEBmbGFnczoJaW4gLyBvdXQ6IGNvbmZpZ3VyYXRpb24gZmxhZ3MsIGRlcGVuZGluZyBvbiBAdHlwZQorICovCitzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyB7CisJZW51bSB2NGwyX21idXNfdHlwZSB0eXBlOworCXVuc2lnbmVkIGludCBmbGFnczsKK307CisKIHN0YXRpYyBpbmxpbmUgdm9pZCB2NGwyX2ZpbGxfcGl4X2Zvcm1hdChzdHJ1Y3QgdjRsMl9waXhfZm9ybWF0ICpwaXhfZm10LAogCQkJCWNvbnN0IHN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKm1idXNfZm10KQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS92NGwyLXN1YmRldi5oIGIvaW5jbHVkZS9tZWRpYS92NGwyLXN1YmRldi5oCmluZGV4IDI4ODRlM2UuLjI1N2RhMWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWVkaWEvdjRsMi1zdWJkZXYuaAorKysgYi9pbmNsdWRlL21lZGlhL3Y0bDItc3ViZGV2LmgKQEAgLTIyOSw2ICsyMjksMTIgQEAKICAgIHNfc3RkX291dHB1dDogc2V0IHY0bDJfc3RkX2lkIGZvciB2aWRlbyBPVVRQVVQgZGV2aWNlcy4gVGhpcyBpcyBpZ25vcmVkIGJ5CiAJdmlkZW8gaW5wdXQgZGV2aWNlcy4KIAorICAgZ19zdGRfb3V0cHV0OiBnZXQgY3VycmVudCBzdGFuZGFyZCBmb3IgdmlkZW8gT1VUUFVUIGRldmljZXMuIFRoaXMgaXMgaWdub3JlZAorCWJ5IHZpZGVvIGlucHV0IGRldmljZXMuCisKKyAgIGdfdHZub3Jtc19vdXRwdXQ6IGdldCB2NGwyX3N0ZF9pZCB3aXRoIGFsbCBzdGFuZGFyZHMgc3VwcG9ydGVkIGJ5IHZpZGVvCisJT1VUUFVUIGRldmljZS4gVGhpcyBpcyBpZ25vcmVkIGJ5IHZpZGVvIGlucHV0IGRldmljZXMuCisKICAgIHNfY3J5c3RhbF9mcmVxOiBzZXRzIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGNyeXN0YWwgdXNlZCB0byBnZW5lcmF0ZSB0aGUKIAljbG9ja3MgaW4gSHouIEFuIGV4dHJhIGZsYWdzIGZpZWxkIGFsbG93cyBkZXZpY2Ugc3BlY2lmaWMgY29uZmlndXJhdGlvbgogCXJlZ2FyZGluZyBjbG9jayBmcmVxdWVuY3kgZGl2aWRlcnMsIGV0Yy4gSWYgbm90IHVzZWQsIHRoZW4gc2V0IGZsYWdzCkBAIC0yNDMsNiArMjQ5LDggQEAKICAgIHNfZHZfcHJlc2V0OiBzZXQgZHYgKERpZ2l0YWwgVmlkZW8pIHByZXNldCBpbiB0aGUgc3ViIGRldmljZS4gU2ltaWxhciB0bwogCXNfc3RkKCkKIAorICAgZ19kdl9wcmVzZXQ6IGdldCBjdXJyZW50IGR2IChEaWdpdGFsIFZpZGVvKSBwcmVzZXQgaW4gdGhlIHN1YiBkZXZpY2UuCisKICAgIHF1ZXJ5X2R2X3ByZXNldDogcXVlcnkgZHYgcHJlc2V0IGluIHRoZSBzdWIgZGV2aWNlLiBUaGlzIGlzIHNpbWlsYXIgdG8KIAlxdWVyeXN0ZCgpCiAKQEAgLTI1OSwxMiArMjY3LDIwIEBACiAgICB0cnlfbWJ1c19mbXQ6IHRyeSB0byBzZXQgYSBwaXhlbCBmb3JtYXQgb24gYSB2aWRlbyBkYXRhIHNvdXJjZQogCiAgICBzX21idXNfZm10OiBzZXQgYSBwaXhlbCBmb3JtYXQgb24gYSB2aWRlbyBkYXRhIHNvdXJjZQorCisgICBnX21idXNfY29uZmlnOiBnZXQgc3VwcG9ydGVkIG1lZGlhYnVzIGNvbmZpZ3VyYXRpb25zCisKKyAgIHNfbWJ1c19jb25maWc6IHNldCBhIGNlcnRhaW4gbWVkaWFidXMgY29uZmlndXJhdGlvbi4gVGhpcyBvcGVyYXRpb24gaXMgYWRkZWQKKwlmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHNvYy1jYW1lcmEgZHJpdmVycyBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IG5ldworCXNvZnR3YXJlLgogICovCiBzdHJ1Y3QgdjRsMl9zdWJkZXZfdmlkZW9fb3BzIHsKIAlpbnQgKCpzX3JvdXRpbmcpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiBpbnB1dCwgdTMyIG91dHB1dCwgdTMyIGNvbmZpZyk7CiAJaW50ICgqc19jcnlzdGFsX2ZyZXEpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHUzMiBmcmVxLCB1MzIgZmxhZ3MpOwogCWludCAoKnNfc3RkX291dHB1dCkoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdjRsMl9zdGRfaWQgc3RkKTsKKwlpbnQgKCpnX3N0ZF9vdXRwdXQpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsIHY0bDJfc3RkX2lkICpzdGQpOwogCWludCAoKnF1ZXJ5c3RkKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB2NGwyX3N0ZF9pZCAqc3RkKTsKKwlpbnQgKCpnX3R2bm9ybXNfb3V0cHV0KShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCB2NGwyX3N0ZF9pZCAqc3RkKTsKIAlpbnQgKCpnX2lucHV0X3N0YXR1cykoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgdTMyICpzdGF0dXMpOwogCWludCAoKnNfc3RyZWFtKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBpbnQgZW5hYmxlKTsKIAlpbnQgKCpjcm9wY2FwKShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9jcm9wY2FwICpjYyk7CkBAIC0yODIsNiArMjk4LDggQEAKIAkJCXN0cnVjdCB2NGwyX2R2X2VudW1fcHJlc2V0ICpwcmVzZXQpOwogCWludCAoKnNfZHZfcHJlc2V0KShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAogCQkJc3RydWN0IHY0bDJfZHZfcHJlc2V0ICpwcmVzZXQpOworCWludCAoKmdfZHZfcHJlc2V0KShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAorCQkJc3RydWN0IHY0bDJfZHZfcHJlc2V0ICpwcmVzZXQpOwogCWludCAoKnF1ZXJ5X2R2X3ByZXNldCkoc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwKIAkJCXN0cnVjdCB2NGwyX2R2X3ByZXNldCAqcHJlc2V0KTsKIAlpbnQgKCpzX2R2X3RpbWluZ3MpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCkBAIC0yOTgsNiArMzE2LDEwIEBACiAJCQkgICAgc3RydWN0IHY0bDJfbWJ1c19mcmFtZWZtdCAqZm10KTsKIAlpbnQgKCpzX21idXNfZm10KShzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLAogCQkJICBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICpmbXQpOworCWludCAoKmdfbWJ1c19jb25maWcpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkgICAgIHN0cnVjdCB2NGwyX21idXNfY29uZmlnICpjZmcpOworCWludCAoKnNfbWJ1c19jb25maWcpKHN0cnVjdCB2NGwyX3N1YmRldiAqc2QsCisJCQkgICAgIGNvbnN0IHN0cnVjdCB2NGwyX21idXNfY29uZmlnICpjZmcpOwogfTsKIAogLyoKQEAgLTUxMyw4ICs1MzUsNiBAQAogCXZvaWQgKmhvc3RfcHJpdjsKIAkvKiBzdWJkZXYgZGV2aWNlIG5vZGUgKi8KIAlzdHJ1Y3QgdmlkZW9fZGV2aWNlIGRldm5vZGU7Ci0JLyogbnVtYmVyIG9mIGV2ZW50cyB0byBiZSBhbGxvY2F0ZWQgb24gb3BlbiAqLwotCXVuc2lnbmVkIGludCBuZXZlbnRzOwogfTsKIAogI2RlZmluZSBtZWRpYV9lbnRpdHlfdG9fdjRsMl9zdWJkZXYoZW50KSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BjbWNpYS9kZXZpY2VfaWQuaCBiL2luY2x1ZGUvcGNtY2lhL2RldmljZV9pZC5oCmluZGV4IDYzZTViOGYuLjAwZGJmYWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvcGNtY2lhL2RldmljZV9pZC5oCisrKyBiL2luY2x1ZGUvcGNtY2lhL2RldmljZV9pZC5oCkBAIC05NSw2ICs5NSwxNSBAQAogCS5wcm9kX2lkID0geyAodjEpLCBOVUxMLCBOVUxMLCBOVUxMIH0sIFwKIAkucHJvZF9pZF9oYXNoID0geyAodmgxKSwgMCwgMCwgMCB9LCB9CiAKKyNkZWZpbmUgUENNQ0lBX0RFVklDRV9NQU5GX0NBUkRfUFJPRF9JRDMobWFuZiwgY2FyZCwgdjMsIHZoMykgeyBcCisJLm1hdGNoX2ZsYWdzID0gUENNQ0lBX0RFVl9JRF9NQVRDSF9NQU5GX0lEfCBcCisJCQlQQ01DSUFfREVWX0lEX01BVENIX0NBUkRfSUR8IFwKKwkJCVBDTUNJQV9ERVZfSURfTUFUQ0hfUFJPRF9JRDMsIFwKKwkubWFuZl9pZCA9IChtYW5mKSwgXAorCS5jYXJkX2lkID0gKGNhcmQpLCBcCisJLnByb2RfaWQgPSB7IE5VTEwsIE5VTEwsICh2MyksIE5VTEwgfSwgXAorCS5wcm9kX2lkX2hhc2ggPSB7IDAsIDAsICh2aDMpLCAwIH0sIH0KKwogCiAvKiBtdWx0aS1mdW5jdGlvbiBkZXZpY2VzICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2NzaS9mY19mcmFtZS5oIGIvaW5jbHVkZS9zY3NpL2ZjX2ZyYW1lLmgKaW5kZXggNGFkMDIwNC4uODIyNWQ4MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL2ZjX2ZyYW1lLmgKKysrIGIvaW5jbHVkZS9zY3NpL2ZjX2ZyYW1lLmgKQEAgLTc4LDcgKzc4LDYgQEAKIH07CiAKIHN0cnVjdCBmY29lX3Jjdl9pbmZvIHsKLQlzdHJ1Y3QgcGFja2V0X3R5cGUgICpwdHlwZTsKIAlzdHJ1Y3QgZmNfbHBvcnQJKmZyX2RldjsJLyogdHJhbnNwb3J0IGxheWVyIHByaXZhdGUgcG9pbnRlciAqLwogCXN0cnVjdCBmY19zZXEJKmZyX3NlcTsJLyogZm9yIHVzZSB3aXRoIGV4Y2hhbmdlIG1hbmFnZXIgKi8KIAlzdHJ1Y3QgZmNfZmNwX3BrdCAqZnJfZnNwOwkvKiBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgZmNwIEkvTyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZC90ZWE1NzV4LXR1bmVyLmggYi9pbmNsdWRlL3NvdW5kL3RlYTU3NXgtdHVuZXIuaAppbmRleCBkMmVhMTEyLi43MjZlOTQ3IDEwMDY0NAotLS0gYS9pbmNsdWRlL3NvdW5kL3RlYTU3NXgtdHVuZXIuaAorKysgYi9pbmNsdWRlL3NvdW5kL3RlYTU3NXgtdHVuZXIuaApAQCAtMjMsOCArMjMsOCBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWN0cmxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXYuaD4KLSNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CiAKICNkZWZpbmUgVEVBNTc1WF9GTUlGCTEwNzAwCiAKQEAgLTQyLDE4ICs0MiwyMCBAQAogfTsKIAogc3RydWN0IHNuZF90ZWE1NzV4IHsKLQlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZDsJLyogdmlkZW8gZGV2aWNlICovCisJc3RydWN0IHZpZGVvX2RldmljZSB2ZDsJCS8qIHZpZGVvIGRldmljZSAqLwogCWJvb2wgdGVhNTc1OTsJCQkvKiA1NzU5IGNoaXAgaXMgcHJlc2VudCAqLwogCWJvb2wgbXV0ZTsJCQkvKiBEZXZpY2UgaXMgbXV0ZWQ/ICovCiAJYm9vbCBzdGVyZW87CQkJLyogcmVjZWl2aW5nIHN0ZXJlbyAqLwogCWJvb2wgdHVuZWQ7CQkJLyogdHVuZWQgdG8gYSBzdGF0aW9uICovCiAJdW5zaWduZWQgaW50IHZhbDsJCS8qIGh3IHZhbHVlICovCiAJdW5zaWduZWQgbG9uZyBmcmVxOwkJLyogZnJlcXVlbmN5ICovCi0JdW5zaWduZWQgbG9uZyBpbl91c2U7CQkvKiBzZXQgaWYgdGhlIGRldmljZSBpcyBpbiB1c2UgKi8KKwlzdHJ1Y3QgbXV0ZXggbXV0ZXg7CiAJc3RydWN0IHNuZF90ZWE1NzV4X29wcyAqb3BzOwogCXZvaWQgKnByaXZhdGVfZGF0YTsKIAl1OCBjYXJkWzMyXTsKIAl1OCBidXNfaW5mb1szMl07CisJc3RydWN0IHY0bDJfY3RybF9oYW5kbGVyIGN0cmxfaGFuZGxlcjsKKwlpbnQgKCpleHRfaW5pdCkoc3RydWN0IHNuZF90ZWE1NzV4ICp0ZWEpOwogfTsKIAogaW50IHNuZF90ZWE1NzV4X2luaXQoc3RydWN0IHNuZF90ZWE1NzV4ICp0ZWEpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvZXh0NC5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvZXh0NC5oCmluZGV4IDYzNjMxOTMuLmI1MGE1NDcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2V4dDQuaAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9leHQ0LmgKQEAgLTIzLDcgKzIzLDcgQEAKIAlUUF9TVFJVQ1RfX2VudHJ5KAogCQlfX2ZpZWxkKAlkZXZfdCwJZGV2CQkJKQogCQlfX2ZpZWxkKAlpbm9fdCwJaW5vCQkJKQotCQlfX2ZpZWxkKAl1bW9kZV90LCBtb2RlCQkJKQorCQlfX2ZpZWxkKAlfX3UxNiwgbW9kZQkJCSkKIAkJX19maWVsZCgJdWlkX3QsCXVpZAkJCSkKIAkJX19maWVsZCgJZ2lkX3QsCWdpZAkJCSkKIAkJX19maWVsZCgJX191NjQsIGJsb2NrcwkJCSkKQEAgLTUyLDcgKzUyLDcgQEAKIAlUUF9TVFJVQ1RfX2VudHJ5KAogCQlfX2ZpZWxkKAlkZXZfdCwJZGV2CQkJKQogCQlfX2ZpZWxkKAlpbm9fdCwJZGlyCQkJKQotCQlfX2ZpZWxkKAl1bW9kZV90LCBtb2RlCQkJKQorCQlfX2ZpZWxkKAlfX3UxNiwgbW9kZQkJCSkKIAkpLAogCiAJVFBfZmFzdF9hc3NpZ24oCkBAIC03NSw3ICs3NSw3IEBACiAJCV9fZmllbGQoCWRldl90LAlkZXYJCQkpCiAJCV9fZmllbGQoCWlub190LAlpbm8JCQkpCiAJCV9fZmllbGQoCWlub190LAlkaXIJCQkpCi0JCV9fZmllbGQoCXVtb2RlX3QsIG1vZGUJCQkpCisJCV9fZmllbGQoCV9fdTE2LAltb2RlCQkJKQogCSksCiAKIAlUUF9mYXN0X2Fzc2lnbigKQEAgLTcyNSw3ICs3MjUsNyBAQAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCV9fZmllbGQoCWRldl90LAlkZXYJCQkpCiAJCV9fZmllbGQoCWlub190LAlpbm8JCQkpCi0JCV9fZmllbGQoCXVtb2RlX3QsIG1vZGUJCQkpCisJCV9fZmllbGQoCV9fdTE2LAltb2RlCQkJKQogCQlfX2ZpZWxkKAlfX3U2NCwJYmxvY2sJCQkpCiAJCV9fZmllbGQoCXVuc2lnbmVkIGxvbmcsCWNvdW50CQkpCiAJCV9fZmllbGQoCWludCwJZmxhZ3MJCQkpCkBAIC0xMDEyLDcgKzEwMTIsNyBAQAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCV9fZmllbGQoCWRldl90LAlkZXYJCQkpCiAJCV9fZmllbGQoCWlub190LAlpbm8JCQkpCi0JCV9fZmllbGQoCXVtb2RlX3QsIG1vZGUJCQkpCisJCV9fZmllbGQoCV9fdTE2LAltb2RlCQkJKQogCQlfX2ZpZWxkKAlpbnQsCWlzX21ldGFkYXRhCQkpCiAJCV9fZmllbGQoCV9fdTY0LAlibG9jawkJCSkKIAkpLApAQCAtMTAzOSw3ICsxMDM5LDcgQEAKIAlUUF9TVFJVQ1RfX2VudHJ5KAogCQlfX2ZpZWxkKAlkZXZfdCwJZGV2CQkJKQogCQlfX2ZpZWxkKAlpbm9fdCwJaW5vCQkJKQotCQlfX2ZpZWxkKAl1bW9kZV90LCBtb2RlCQkJKQorCQlfX2ZpZWxkKAlfX3UxNiwJbW9kZQkJCSkKIAkJX19maWVsZCgJX191NjQsCWlfYmxvY2tzCQkpCiAJCV9fZmllbGQoCWludCwJdXNlZF9ibG9ja3MJCSkKIAkJX19maWVsZCgJaW50LAlyZXNlcnZlZF9kYXRhX2Jsb2NrcwkpCkBAIC0xMDc2LDcgKzEwNzYsNyBAQAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCV9fZmllbGQoCWRldl90LAlkZXYJCQkpCiAJCV9fZmllbGQoCWlub190LAlpbm8JCQkpCi0JCV9fZmllbGQoCXVtb2RlX3QsIG1vZGUJCQkpCisJCV9fZmllbGQoCV9fdTE2LCAgbW9kZQkJCSkKIAkJX19maWVsZCgJX191NjQsCWlfYmxvY2tzCQkpCiAJCV9fZmllbGQoCWludCwJbWRfbmVlZGVkCQkpCiAJCV9fZmllbGQoCWludCwJcmVzZXJ2ZWRfZGF0YV9ibG9ja3MJKQpAQCAtMTExMCw3ICsxMTEwLDcgQEAKIAlUUF9TVFJVQ1RfX2VudHJ5KAogCQlfX2ZpZWxkKAlkZXZfdCwJZGV2CQkJKQogCQlfX2ZpZWxkKAlpbm9fdCwJaW5vCQkJKQotCQlfX2ZpZWxkKAl1bW9kZV90LCBtb2RlCQkJKQorCQlfX2ZpZWxkKAlfX3UxNiwgIG1vZGUJCQkpCiAJCV9fZmllbGQoCV9fdTY0LAlpX2Jsb2NrcwkJKQogCQlfX2ZpZWxkKAlpbnQsCWZyZWVkX2Jsb2NrcwkJKQogCQlfX2ZpZWxkKAlpbnQsCXJlc2VydmVkX2RhdGFfYmxvY2tzCSkKQEAgLTE1MTgsNiArMTUxOCw3NyBAQAogCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8pCiApOwogCitUUkFDRV9FVkVOVChleHQ0X2pvdXJuYWxfc3RhcnQsCisJVFBfUFJPVE8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgaW50IG5ibG9ja3MsIHVuc2lnbmVkIGxvbmcgSVApLAorCisJVFBfQVJHUyhzYiwgbmJsb2NrcywgSVApLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJZGV2X3QsCWRldgkJCSkKKwkJX19maWVsZCgJICBpbnQsIAluYmxvY2tzCQkJKQorCQlfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsCWlwCQkJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+ZGV2CSA9IHNiLT5zX2RldjsKKwkJX19lbnRyeS0+bmJsb2NrcyA9IG5ibG9ja3M7CisJCV9fZW50cnktPmlwCSA9IElQOworCSksCisKKwlUUF9wcmludGsoImRldiAlZCwlZCBuYmxvY2tzICVkIGNhbGxlciAlcEYiLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCisJCSAgX19lbnRyeS0+bmJsb2NrcywgKHZvaWQgKilfX2VudHJ5LT5pcCkKKyk7CisKK0RFQ0xBUkVfRVZFTlRfQ0xBU1MoZXh0NF9fdHJpbSwKKwlUUF9QUk9UTyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAorCQkgZXh0NF9ncm91cF90IGdyb3VwLAorCQkgZXh0NF9ncnBibGtfdCBzdGFydCwKKwkJIGV4dDRfZ3JwYmxrX3QgbGVuKSwKKworCVRQX0FSR1Moc2IsIGdyb3VwLCBzdGFydCwgbGVuKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoCWludCwJZGV2X21ham9yCQkpCisJCV9fZmllbGQoCWludCwJZGV2X21pbm9yCQkpCisJCV9fZmllbGQoCV9fdTMyLCAJZ3JvdXAJCQkpCisJCV9fZmllbGQoCWludCwJc3RhcnQJCQkpCisJCV9fZmllbGQoCWludCwJbGVuCQkJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+ZGV2X21ham9yCT0gTUFKT1Ioc2ItPnNfZGV2KTsKKwkJX19lbnRyeS0+ZGV2X21pbm9yCT0gTUlOT1Ioc2ItPnNfZGV2KTsKKwkJX19lbnRyeS0+Z3JvdXAJCT0gZ3JvdXA7CisJCV9fZW50cnktPnN0YXJ0CQk9IHN0YXJ0OworCQlfX2VudHJ5LT5sZW4JCT0gbGVuOworCSksCisKKwlUUF9wcmludGsoImRldiAlZCwlZCBncm91cCAldSwgc3RhcnQgJWQsIGxlbiAlZCIsCisJCSAgX19lbnRyeS0+ZGV2X21ham9yLCBfX2VudHJ5LT5kZXZfbWlub3IsCisJCSAgX19lbnRyeS0+Z3JvdXAsIF9fZW50cnktPnN0YXJ0LCBfX2VudHJ5LT5sZW4pCispOworCitERUZJTkVfRVZFTlQoZXh0NF9fdHJpbSwgZXh0NF90cmltX2V4dGVudCwKKworCVRQX1BST1RPKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCisJCSBleHQ0X2dyb3VwX3QgZ3JvdXAsCisJCSBleHQ0X2dycGJsa190IHN0YXJ0LAorCQkgZXh0NF9ncnBibGtfdCBsZW4pLAorCisJVFBfQVJHUyhzYiwgZ3JvdXAsIHN0YXJ0LCBsZW4pCispOworCitERUZJTkVfRVZFTlQoZXh0NF9fdHJpbSwgZXh0NF90cmltX2FsbF9mcmVlLAorCisJVFBfUFJPVE8oc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJIGV4dDRfZ3JvdXBfdCBncm91cCwKKwkJIGV4dDRfZ3JwYmxrX3Qgc3RhcnQsCisJCSBleHQ0X2dycGJsa190IGxlbiksCisKKwlUUF9BUkdTKHNiLCBncm91cCwgc3RhcnQsIGxlbikKKyk7CisKICNlbmRpZiAvKiBfVFJBQ0VfRVhUNF9IICovCiAKIC8qIFRoaXMgcGFydCBtdXN0IGJlIG91dHNpZGUgcHJvdGVjdGlvbiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvamJkMi5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvamJkMi5oCmluZGV4IGJmMTY1NDUuLjc1OTY0NDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2piZDIuaAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9qYmQyLmgKQEAgLTI2LDggKzI2LDggQEAKIAkJX19lbnRyeS0+cmVzdWx0CQk9IHJlc3VsdDsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJXMgcmVzdWx0ICVkIiwKLQkJICBqYmQyX2Rldl90b19uYW1lKF9fZW50cnktPmRldiksIF9fZW50cnktPnJlc3VsdCkKKwlUUF9wcmludGsoImRldiAlZCwlZCByZXN1bHQgJWQiLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksIF9fZW50cnktPnJlc3VsdCkKICk7CiAKIERFQ0xBUkVfRVZFTlRfQ0xBU1MoamJkMl9jb21taXQsCkBAIC00OCw5ICs0OCw5IEBACiAJCV9fZW50cnktPnRyYW5zYWN0aW9uCT0gY29tbWl0X3RyYW5zYWN0aW9uLT50X3RpZDsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJXMgdHJhbnNhY3Rpb24gJWQgc3luYyAlZCIsCi0JCSAgamJkMl9kZXZfdG9fbmFtZShfX2VudHJ5LT5kZXYpLCBfX2VudHJ5LT50cmFuc2FjdGlvbiwKLQkJICBfX2VudHJ5LT5zeW5jX2NvbW1pdCkKKwlUUF9wcmludGsoImRldiAlZCwlZCB0cmFuc2FjdGlvbiAlZCBzeW5jICVkIiwKKwkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAorCQkgIF9fZW50cnktPnRyYW5zYWN0aW9uLCBfX2VudHJ5LT5zeW5jX2NvbW1pdCkKICk7CiAKIERFRklORV9FVkVOVChqYmQyX2NvbW1pdCwgamJkMl9zdGFydF9jb21taXQsCkBAIC0xMDAsOSArMTAwLDkgQEAKIAkJX19lbnRyeS0+aGVhZAkJPSBqb3VybmFsLT5qX3RhaWxfc2VxdWVuY2U7CiAJKSwKIAotCVRQX3ByaW50aygiZGV2ICVzIHRyYW5zYWN0aW9uICVkIHN5bmMgJWQgaGVhZCAlZCIsCi0JCSAgamJkMl9kZXZfdG9fbmFtZShfX2VudHJ5LT5kZXYpLCBfX2VudHJ5LT50cmFuc2FjdGlvbiwKLQkJICBfX2VudHJ5LT5zeW5jX2NvbW1pdCwgX19lbnRyeS0+aGVhZCkKKwlUUF9wcmludGsoImRldiAlZCwlZCB0cmFuc2FjdGlvbiAlZCBzeW5jICVkIGhlYWQgJWQiLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCisJCSAgX19lbnRyeS0+dHJhbnNhY3Rpb24sIF9fZW50cnktPnN5bmNfY29tbWl0LCBfX2VudHJ5LT5oZWFkKQogKTsKIAogVFJBQ0VfRVZFTlQoamJkMl9zdWJtaXRfaW5vZGVfZGF0YSwKQEAgLTEyMCw4ICsxMjAsOSBAQAogCQlfX2VudHJ5LT5pbm8JPSBpbm9kZS0+aV9pbm87CiAJKSwKIAotCVRQX3ByaW50aygiZGV2ICVzIGlubyAlbHUiLAotCQkgIGpiZDJfZGV2X3RvX25hbWUoX19lbnRyeS0+ZGV2KSwgKHVuc2lnbmVkIGxvbmcpIF9fZW50cnktPmlubykKKwlUUF9wcmludGsoImRldiAlZCwlZCBpbm8gJWx1IiwKKwkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAorCQkgICh1bnNpZ25lZCBsb25nKSBfX2VudHJ5LT5pbm8pCiApOwogCiBUUkFDRV9FVkVOVChqYmQyX3J1bl9zdGF0cywKQEAgLTE1Niw5ICsxNTcsOSBAQAogCQlfX2VudHJ5LT5ibG9ja3NfbG9nZ2VkCT0gc3RhdHMtPnJzX2Jsb2Nrc19sb2dnZWQ7CiAJKSwKIAotCVRQX3ByaW50aygiZGV2ICVzIHRpZCAlbHUgd2FpdCAldSBydW5uaW5nICV1IGxvY2tlZCAldSBmbHVzaGluZyAldSAiCisJVFBfcHJpbnRrKCJkZXYgJWQsJWQgdGlkICVsdSB3YWl0ICV1IHJ1bm5pbmcgJXUgbG9ja2VkICV1IGZsdXNoaW5nICV1ICIKIAkJICAibG9nZ2luZyAldSBoYW5kbGVfY291bnQgJXUgYmxvY2tzICV1IGJsb2Nrc19sb2dnZWQgJXUiLAotCQkgIGpiZDJfZGV2X3RvX25hbWUoX19lbnRyeS0+ZGV2KSwgX19lbnRyeS0+dGlkLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksIF9fZW50cnktPnRpZCwKIAkJICBqaWZmaWVzX3RvX21zZWNzKF9fZW50cnktPndhaXQpLAogCQkgIGppZmZpZXNfdG9fbXNlY3MoX19lbnRyeS0+cnVubmluZyksCiAJCSAgamlmZmllc190b19tc2VjcyhfX2VudHJ5LT5sb2NrZWQpLApAQCAtMTkyLDkgKzE5Myw5IEBACiAJCV9fZW50cnktPmRyb3BwZWQJPSBzdGF0cy0+Y3NfZHJvcHBlZDsKIAkpLAogCi0JVFBfcHJpbnRrKCJkZXYgJXMgdGlkICVsdSBjaHBfdGltZSAldSBmb3JjZWRfdG9fY2xvc2UgJXUgIgorCVRQX3ByaW50aygiZGV2ICVkLCVkIHRpZCAlbHUgY2hwX3RpbWUgJXUgZm9yY2VkX3RvX2Nsb3NlICV1ICIKIAkJICAid3JpdHRlbiAldSBkcm9wcGVkICV1IiwKLQkJICBqYmQyX2Rldl90b19uYW1lKF9fZW50cnktPmRldiksIF9fZW50cnktPnRpZCwKKwkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLCBfX2VudHJ5LT50aWQsCiAJCSAgamlmZmllc190b19tc2VjcyhfX2VudHJ5LT5jaHBfdGltZSksCiAJCSAgX19lbnRyeS0+Zm9yY2VkX3RvX2Nsb3NlLCBfX2VudHJ5LT53cml0dGVuLCBfX2VudHJ5LT5kcm9wcGVkKQogKTsKQEAgLTIyMiw5ICsyMjMsMTAgQEAKIAkJX19lbnRyeS0+ZnJlZWQJCT0gZnJlZWQ7CiAJKSwKIAotCVRQX3ByaW50aygiZGV2ICVzIGZyb20gJXUgdG8gJXUgb2Zmc2V0ICVsdSBmcmVlZCAlbHUiLAotCQkgIGpiZDJfZGV2X3RvX25hbWUoX19lbnRyeS0+ZGV2KSwgX19lbnRyeS0+dGFpbF9zZXF1ZW5jZSwKLQkJICBfX2VudHJ5LT5maXJzdF90aWQsIF9fZW50cnktPmJsb2NrX25yLCBfX2VudHJ5LT5mcmVlZCkKKwlUUF9wcmludGsoImRldiAlZCwlZCBmcm9tICV1IHRvICV1IG9mZnNldCAlbHUgZnJlZWQgJWx1IiwKKwkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAorCQkgIF9fZW50cnktPnRhaWxfc2VxdWVuY2UsIF9fZW50cnktPmZpcnN0X3RpZCwKKwkJICBfX2VudHJ5LT5ibG9ja19uciwgX19lbnRyeS0+ZnJlZWQpCiApOwogCiAjZW5kaWYgLyogX1RSQUNFX0pCRDJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMveGVuLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy94ZW4uaAppbmRleCA0NGQ4ZGVjLi45MmYxYTc5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy94ZW4uaAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy94ZW4uaApAQCAtOCw2ICs4LDggQEAKICNpbmNsdWRlIDxhc20vcGFyYXZpcnRfdHlwZXMuaD4KICNpbmNsdWRlIDxhc20veGVuL3RyYWNlX3R5cGVzLmg+CiAKK3N0cnVjdCBtdWx0aWNhbGxfZW50cnk7CisKIC8qIE11bHRpY2FsbHMgKi8KIERFQ0xBUkVfRVZFTlRfQ0xBU1MoeGVuX21jX19iYXRjaCwKIAkgICAgVFBfUFJPVE8oZW51bSBwYXJhdmlydF9sYXp5X21vZGUgbW9kZSksCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ZpZGVvL29tYXBkc3MuaCBiL2luY2x1ZGUvdmlkZW8vb21hcGRzcy5oCmluZGV4IDg5MmI5N2YuLjNiNTVlZjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdmlkZW8vb21hcGRzcy5oCisrKyBiL2luY2x1ZGUvdmlkZW8vb21hcGRzcy5oCkBAIC0yMSw4ICsyMSw2IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tvYmplY3QuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKICNkZWZpbmUgRElTUENfSVJRX0ZSQU1FRE9ORQkJKDEgPDwgMCkKICNkZWZpbmUgRElTUENfSVJRX1ZTWU5DCQkJKDEgPDwgMSkKQEAgLTEzNiwxMiArMTM0LDYgQEAKIAlPTUFQX0RTU19ESVNQTEFZX0NBUF9URUFSX0VMSU0JCT0gMSA8PCAxLAogfTsKIAotZW51bSBvbWFwX2Rzc191cGRhdGVfbW9kZSB7Ci0JT01BUF9EU1NfVVBEQVRFX0RJU0FCTEVEID0gMCwKLQlPTUFQX0RTU19VUERBVEVfQVVUTywKLQlPTUFQX0RTU19VUERBVEVfTUFOVUFMLAotfTsKLQogZW51bSBvbWFwX2Rzc19kaXNwbGF5X3N0YXRlIHsKIAlPTUFQX0RTU19ESVNQTEFZX0RJU0FCTEVEID0gMCwKIAlPTUFQX0RTU19ESVNQTEFZX0FDVElWRSwKQEAgLTI0Niw3ICsyMzgsNyBAQAogCiAvKiBCb2FyZCBzcGVjaWZpYyBkYXRhICovCiBzdHJ1Y3Qgb21hcF9kc3NfYm9hcmRfaW5mbyB7Ci0JaW50ICgqZ2V0X2xhc3Rfb2ZmX29uX3RyYW5zYWN0aW9uX2lkKShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCWludCAoKmdldF9jb250ZXh0X2xvc3NfY291bnQpKHN0cnVjdCBkZXZpY2UgKmRldik7CiAJaW50IG51bV9kZXZpY2VzOwogCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKipkZXZpY2VzOwogCXN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRlZmF1bHRfZGV2aWNlOwpAQCAtMjY2LDggKzI1OCw2IEBACiBzdHJ1Y3Qgb21hcF9kaXNwbGF5X3BsYXRmb3JtX2RhdGEgewogCXN0cnVjdCBvbWFwX2Rzc19ib2FyZF9pbmZvICpib2FyZF9kYXRhOwogCS8qIFRPRE86IEFkZGl0aW9uYWwgbWVtYmVycyB0byBiZSBhZGRlZCB3aGVuIFBNIGlzIGNvbnNpZGVyZWQgKi8KLQotCWJvb2wgKCpvcHRfY2xvY2tfYXZhaWxhYmxlKShjb25zdCBjaGFyICpjbGtfcm9sZSk7CiB9OwogCiBzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzIHsKQEAgLTMwMCw2ICsyOTAsMTIgQEAKIGV4dGVybiBjb25zdCBzdHJ1Y3Qgb21hcF92aWRlb190aW1pbmdzIG9tYXBfZHNzX250c2NfdGltaW5nczsKICNlbmRpZgogCitzdHJ1Y3Qgb21hcF9kc3NfY3ByX2NvZWZzIHsKKwlzMTYgcnIsIHJnLCByYjsKKwlzMTYgZ3IsIGdnLCBnYjsKKwlzMTYgYnIsIGJnLCBiYjsKK307CisKIHN0cnVjdCBvbWFwX292ZXJsYXlfaW5mbyB7CiAJYm9vbCBlbmFibGVkOwogCkBAIC0zNTksNiArMzU1LDkgQEAKIAlib29sIHRyYW5zX2VuYWJsZWQ7CiAKIAlib29sIGFscGhhX2VuYWJsZWQ7CisKKwlib29sIGNwcl9lbmFibGU7CisJc3RydWN0IG9tYXBfZHNzX2Nwcl9jb2VmcyBjcHJfY29lZnM7CiB9OwogCiBzdHJ1Y3Qgb21hcF9vdmVybGF5X21hbmFnZXIgewpAQCAtNTI2LDExICs1MjUsNiBAQAogCWludCAoKnJlc3VtZSkoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZGlzcGxheSk7CiAJaW50ICgqcnVuX3Rlc3QpKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRpc3BsYXksIGludCB0ZXN0KTsKIAotCWludCAoKnNldF91cGRhdGVfbW9kZSkoc3RydWN0IG9tYXBfZHNzX2RldmljZSAqZHNzZGV2LAotCQkJZW51bSBvbWFwX2Rzc191cGRhdGVfbW9kZSk7Ci0JZW51bSBvbWFwX2Rzc191cGRhdGVfbW9kZSAoKmdldF91cGRhdGVfbW9kZSkoCi0JCQlzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYpOwotCiAJaW50ICgqdXBkYXRlKShzdHJ1Y3Qgb21hcF9kc3NfZGV2aWNlICpkc3NkZXYsCiAJCQkgICAgICAgdTE2IHgsIHUxNiB5LCB1MTYgdywgdTE2IGgpOwogCWludCAoKnN5bmMpKHN0cnVjdCBvbWFwX2Rzc19kZXZpY2UgKmRzc2Rldik7CmRpZmYgLS1naXQgYS9pbml0L21haW4uYyBiL2luaXQvbWFpbi5jCmluZGV4IGQ3MjExZmEuLjljNTFlZTcgMTAwNjQ0Ci0tLSBhL2luaXQvbWFpbi5jCisrKyBiL2luaXQvbWFpbi5jCkBAIC0zNjksOSArMzY5LDEyIEBACiAJaW5pdF9pZGxlX2Jvb3R1cF90YXNrKGN1cnJlbnQpOwogCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKIAlzY2hlZHVsZSgpOwotCXByZWVtcHRfZGlzYWJsZSgpOworCisJLyogQXQgdGhpcyBwb2ludCwgd2UgY2FuIGVuYWJsZSB1c2VyIG1vZGUgaGVscGVyIGZ1bmN0aW9uYWxpdHkgKi8KKwl1c2VybW9kZWhlbHBlcl9lbmFibGUoKTsKIAogCS8qIENhbGwgaW50byBjcHVfaWRsZSB3aXRoIHByZWVtcHQgZGlzYWJsZWQgKi8KKwlwcmVlbXB0X2Rpc2FibGUoKTsKIAljcHVfaWRsZSgpOwogfQogCkBAIC03MTUsNyArNzE4LDcgQEAKIHsKIAljcHVzZXRfaW5pdF9zbXAoKTsKIAl1c2VybW9kZWhlbHBlcl9pbml0KCk7Ci0JaW5pdF90bXBmcygpOworCXNobWVtX2luaXQoKTsKIAlkcml2ZXJfaW5pdCgpOwogCWluaXRfaXJxX3Byb2MoKTsKIAlkb19jdG9ycygpOwpkaWZmIC0tZ2l0IGEvaXBjL3NobS5jIGIvaXBjL3NobS5jCmluZGV4IDNmNWIxNDMuLjAyZWNmMmMgMTAwNjQ0Ci0tLSBhL2lwYy9zaG0uYworKysgYi9pcGMvc2htLmMKQEAgLTEwNSw5ICsxMDUsMTYgQEAKIH0KICNlbmRpZgogCi12b2lkIF9faW5pdCBzaG1faW5pdCAodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IGlwY19uc19pbml0KHZvaWQpCiB7CiAJc2htX2luaXRfbnMoJmluaXRfaXBjX25zKTsKKwlyZXR1cm4gMDsKK30KKworcHVyZV9pbml0Y2FsbChpcGNfbnNfaW5pdCk7CisKK3ZvaWQgX19pbml0IHNobV9pbml0ICh2b2lkKQorewogCWlwY19pbml0X3Byb2NfaW50ZXJmYWNlKCJzeXN2aXBjL3NobSIsCiAjaWYgQklUU19QRVJfTE9ORyA8PSAzMgogCQkJCSIgICAgICAga2V5ICAgICAgc2htaWQgcGVybXMgICAgICAgc2l6ZSAgY3BpZCAgbHBpZCBuYXR0Y2ggICB1aWQgICBnaWQgIGN1aWQgIGNnaWQgICAgICBhdGltZSAgICAgIGR0aW1lICAgICAgY3RpbWUgICAgICAgIHJzcyAgICAgICBzd2FwXG4iLApAQCAtMTMxLDYgKzEzOCwxMiBAQAogCXJldHVybiBjb250YWluZXJfb2YoaXBjcCwgc3RydWN0IHNobWlkX2tlcm5lbCwgc2htX3Blcm0pOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgc2htX2xvY2tfYnlfcHRyKHN0cnVjdCBzaG1pZF9rZXJuZWwgKmlwY3ApCit7CisJcmN1X3JlYWRfbG9jaygpOworCXNwaW5fbG9jaygmaXBjcC0+c2htX3Blcm0ubG9jayk7Cit9CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNobWlkX2tlcm5lbCAqc2htX2xvY2tfY2hlY2soc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zLAogCQkJCQkJaW50IGlkKQogewpAQCAtMjMxLDc2ICsyNDQsODAgQEAKIAl1cF93cml0ZSgmc2htX2lkcyhucykucndfbXV0ZXgpOwogfQogCisvKiBDYWxsZWQgd2l0aCBucy0+c2htX2lkcyhucykucndfbXV0ZXggbG9ja2VkICovCiBzdGF0aWMgaW50IHNobV90cnlfZGVzdHJveV9jdXJyZW50KGludCBpZCwgdm9pZCAqcCwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMgPSBkYXRhOwotCXN0cnVjdCBzaG1pZF9rZXJuZWwgKnNocCA9IHNobV9sb2NrKG5zLCBpZCk7CisJc3RydWN0IGtlcm5faXBjX3Blcm0gKmlwY3AgPSBwOworCXN0cnVjdCBzaG1pZF9rZXJuZWwgKnNocCA9IGNvbnRhaW5lcl9vZihpcGNwLCBzdHJ1Y3Qgc2htaWRfa2VybmVsLCBzaG1fcGVybSk7CiAKLQlpZiAoSVNfRVJSKHNocCkpCisJaWYgKHNocC0+c2htX2NyZWF0b3IgIT0gY3VycmVudCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoc2hwLT5zaG1fY3ByaWQgIT0gdGFza190Z2lkX3ZucihjdXJyZW50KSkgewotCQlzaG1fdW5sb2NrKHNocCk7Ci0JCXJldHVybiAwOwotCX0KKwkvKgorCSAqIE1hcmsgaXQgYXMgb3JwaGFuZWQgdG8gZGVzdHJveSB0aGUgc2VnbWVudCB3aGVuCisJICoga2VybmVsLnNobV9ybWlkX2ZvcmNlZCBpcyBjaGFuZ2VkLgorCSAqIEl0IGlzIG5vb3AgaWYgdGhlIGZvbGxvd2luZyBzaG1fbWF5X2Rlc3Ryb3koKSByZXR1cm5zIHRydWUuCisJICovCisJc2hwLT5zaG1fY3JlYXRvciA9IE5VTEw7CiAKLQlpZiAoc2htX21heV9kZXN0cm95KG5zLCBzaHApKQorCS8qCisJICogRG9uJ3QgZXZlbiB0cnkgdG8gZGVzdHJveSBpdC4gIElmIHNobV9ybWlkX2ZvcmNlZD0wIGFuZCBJUENfUk1JRAorCSAqIGlzIG5vdCBzZXQsIGl0IHNob3VsZG4ndCBiZSBkZWxldGVkIGhlcmUuCisJICovCisJaWYgKCFucy0+c2htX3JtaWRfZm9yY2VkKQorCQlyZXR1cm4gMDsKKworCWlmIChzaG1fbWF5X2Rlc3Ryb3kobnMsIHNocCkpIHsKKwkJc2htX2xvY2tfYnlfcHRyKHNocCk7CiAJCXNobV9kZXN0cm95KG5zLCBzaHApOwotCWVsc2UKLQkJc2htX3VubG9jayhzaHApOworCX0KIAlyZXR1cm4gMDsKIH0KIAorLyogQ2FsbGVkIHdpdGggbnMtPnNobV9pZHMobnMpLnJ3X211dGV4IGxvY2tlZCAqLwogc3RhdGljIGludCBzaG1fdHJ5X2Rlc3Ryb3lfb3JwaGFuZWQoaW50IGlkLCB2b2lkICpwLCB2b2lkICpkYXRhKQogewogCXN0cnVjdCBpcGNfbmFtZXNwYWNlICpucyA9IGRhdGE7Ci0Jc3RydWN0IHNobWlkX2tlcm5lbCAqc2hwID0gc2htX2xvY2sobnMsIGlkKTsKLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7Ci0KLQlpZiAoSVNfRVJSKHNocCkpCi0JCXJldHVybiAwOworCXN0cnVjdCBrZXJuX2lwY19wZXJtICppcGNwID0gcDsKKwlzdHJ1Y3Qgc2htaWRfa2VybmVsICpzaHAgPSBjb250YWluZXJfb2YoaXBjcCwgc3RydWN0IHNobWlkX2tlcm5lbCwgc2htX3Blcm0pOwogCiAJLyoKIAkgKiBXZSB3YW50IHRvIGRlc3Ryb3kgc2VnbWVudHMgd2l0aG91dCB1c2VycyBhbmQgd2l0aCBhbHJlYWR5CiAJICogZXhpdCdlZCBvcmlnaW5hdGluZyBwcm9jZXNzLgogCSAqCi0JICogWFhYOiB0aGUgb3JpZ2luYXRpbmcgcHJvY2VzcyBtYXkgZXhpc3QgaW4gYW5vdGhlciBwaWQgbmFtZXNwYWNlLgorCSAqIEFzIHNocC0+KiBhcmUgY2hhbmdlZCB1bmRlciByd19tdXRleCwgaXQncyBzYWZlIHRvIHNraXAgc2hwIGxvY2tpbmcuCiAJICovCi0JdGFzayA9IGZpbmRfdGFza19ieV92cGlkKHNocC0+c2htX2NwcmlkKTsKLQlpZiAodGFzayAhPSBOVUxMKSB7Ci0JCXNobV91bmxvY2soc2hwKTsKKwlpZiAoc2hwLT5zaG1fY3JlYXRvciAhPSBOVUxMKQogCQlyZXR1cm4gMDsKLQl9CiAKLQlpZiAoc2htX21heV9kZXN0cm95KG5zLCBzaHApKQorCWlmIChzaG1fbWF5X2Rlc3Ryb3kobnMsIHNocCkpIHsKKwkJc2htX2xvY2tfYnlfcHRyKHNocCk7CiAJCXNobV9kZXN0cm95KG5zLCBzaHApOwotCWVsc2UKLQkJc2htX3VubG9jayhzaHApOworCX0KIAlyZXR1cm4gMDsKIH0KIAogdm9pZCBzaG1fZGVzdHJveV9vcnBoYW5lZChzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnMpCiB7CiAJZG93bl93cml0ZSgmc2htX2lkcyhucykucndfbXV0ZXgpOwotCWlkcl9mb3JfZWFjaCgmc2htX2lkcyhucykuaXBjc19pZHIsICZzaG1fdHJ5X2Rlc3Ryb3lfb3JwaGFuZWQsIG5zKTsKKwlpZiAoc2htX2lkcyhucykuaW5fdXNlKQorCQlpZHJfZm9yX2VhY2goJnNobV9pZHMobnMpLmlwY3NfaWRyLCAmc2htX3RyeV9kZXN0cm95X29ycGhhbmVkLCBucyk7CiAJdXBfd3JpdGUoJnNobV9pZHMobnMpLnJ3X211dGV4KTsKIH0KIAogCiB2b2lkIGV4aXRfc2htKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKLQlzdHJ1Y3QgbnNwcm94eSAqbnNwID0gdGFzay0+bnNwcm94eTsKLQlzdHJ1Y3QgaXBjX25hbWVzcGFjZSAqbnM7CisJc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zID0gdGFzay0+bnNwcm94eS0+aXBjX25zOwogCi0JaWYgKCFuc3ApCi0JCXJldHVybjsKLQlucyA9IG5zcC0+aXBjX25zOwotCWlmICghbnMgfHwgIW5zLT5zaG1fcm1pZF9mb3JjZWQpCisJaWYgKHNobV9pZHMobnMpLmluX3VzZSA9PSAwKQogCQlyZXR1cm47CiAKIAkvKiBEZXN0cm95IGFsbCBhbHJlYWR5IGNyZWF0ZWQgc2VnbWVudHMsIGJ1dCBub3QgbWFwcGVkIHlldCAqLwogCWRvd25fd3JpdGUoJnNobV9pZHMobnMpLnJ3X211dGV4KTsKLQlpZHJfZm9yX2VhY2goJnNobV9pZHMobnMpLmlwY3NfaWRyLCAmc2htX3RyeV9kZXN0cm95X2N1cnJlbnQsIG5zKTsKKwlpZiAoc2htX2lkcyhucykuaW5fdXNlKQorCQlpZHJfZm9yX2VhY2goJnNobV9pZHMobnMpLmlwY3NfaWRyLCAmc2htX3RyeV9kZXN0cm95X2N1cnJlbnQsIG5zKTsKIAl1cF93cml0ZSgmc2htX2lkcyhucykucndfbXV0ZXgpOwogfQogCkBAIC00OTQsNiArNTExLDcgQEAKIAlzaHAtPnNobV9zZWdzeiA9IHNpemU7CiAJc2hwLT5zaG1fbmF0dGNoID0gMDsKIAlzaHAtPnNobV9maWxlID0gZmlsZTsKKwlzaHAtPnNobV9jcmVhdG9yID0gY3VycmVudDsKIAkvKgogCSAqIHNobWlkIGdldHMgcmVwb3J0ZWQgYXMgImlub2RlIyIgaW4gL3Byb2MvcGlkL21hcHMuCiAJICogcHJvYy1wcyB0b29scyB1c2UgdGhpcy4gQ2hhbmdpbmcgdGhpcyB3aWxsIGJyZWFrIHRoZW0uCmRpZmYgLS1naXQgYS9rZXJuZWwvY29tcGF0LmMgYi9rZXJuZWwvY29tcGF0LmMKaW5kZXggNjE2Yzc4MS4uZTI0MzVlZSAxMDA2NDQKLS0tIGEva2VybmVsL2NvbXBhdC5jCisrKyBiL2tlcm5lbC9jb21wYXQuYwpAQCAtMTU4LDYgKzE1OCw3IEBACiAJCQlfX3B1dF91c2VyKHRzLT50dl9zZWMsICZjdHMtPnR2X3NlYykgfHwKIAkJCV9fcHV0X3VzZXIodHMtPnR2X25zZWMsICZjdHMtPnR2X25zZWMpKSA/IC1FRkFVTFQgOiAwOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocHV0X2NvbXBhdF90aW1lc3BlYyk7CiAKIHN0YXRpYyBsb25nIGNvbXBhdF9uYW5vc2xlZXBfcmVzdGFydChzdHJ1Y3QgcmVzdGFydF9ibG9jayAqcmVzdGFydCkKIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC9kZWJ1Zy9nZGJzdHViLmMgYi9rZXJuZWwvZGVidWcvZ2Ric3R1Yi5jCmluZGV4IGExMWRiOTUuLjM0ODcyNDggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9kZWJ1Zy9nZGJzdHViLmMKKysrIGIva2VybmVsL2RlYnVnL2dkYnN0dWIuYwpAQCAtNDIsNiArNDIsOCBAQAogLyogT3VyIEkvTyBidWZmZXJzLiAqLwogc3RhdGljIGNoYXIJCQlyZW1jb21faW5fYnVmZmVyW0JVRk1BWF07CiBzdGF0aWMgY2hhcgkJCXJlbWNvbV9vdXRfYnVmZmVyW0JVRk1BWF07CitzdGF0aWMgaW50CQkJZ2Ric3R1Yl91c2VfcHJldl9pbl9idWY7CitzdGF0aWMgaW50CQkJZ2Ric3R1Yl9wcmV2X2luX2J1Zl9wb3M7CiAKIC8qIFN0b3JhZ2UgZm9yIHRoZSByZWdpc3RlcnMsIGluIEdEQiBmb3JtYXQuICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZwkJZ2RiX3JlZ3NbKE5VTVJFR0JZVEVTICsKQEAgLTU4LDYgKzYwLDEzIEBACiAJaW50IHJldCA9IC0xOwogCWludCBpOwogCisJaWYgKHVubGlrZWx5KGdkYnN0dWJfdXNlX3ByZXZfaW5fYnVmKSkgeworCQlpZiAoZ2Ric3R1Yl9wcmV2X2luX2J1Zl9wb3MgPCBnZGJzdHViX3VzZV9wcmV2X2luX2J1ZikKKwkJCXJldHVybiByZW1jb21faW5fYnVmZmVyW2dkYnN0dWJfcHJldl9pbl9idWZfcG9zKytdOworCQllbHNlCisJCQlnZGJzdHViX3VzZV9wcmV2X2luX2J1ZiA9IDA7CisJfQorCiAJLyogcG9sbCBhbnkgYWRkaXRpb25hbCBJL08gaW50ZXJmYWNlcyB0aGF0IGFyZSBkZWZpbmVkICovCiAJd2hpbGUgKHJldCA8IDApCiAJCWZvciAoaSA9IDA7IGtkYl9wb2xsX2Z1bmNzW2ldICE9IE5VTEw7IGkrKykgewpAQCAtMTA5LDcgKzExOCw2IEBACiAJCQlidWZmZXJbY291bnRdID0gY2g7CiAJCQljb3VudCA9IGNvdW50ICsgMTsKIAkJfQotCQlidWZmZXJbY291bnRdID0gMDsKIAogCQlpZiAoY2ggPT0gJyMnKSB7CiAJCQl4bWl0Y3N1bSA9IGhleF90b19iaW4oZ2Ric3R1Yl9yZWFkX3dhaXQoKSkgPDwgNDsKQEAgLTEyNCw2ICsxMzIsNyBAQAogCQkJaWYgKGRiZ19pb19vcHMtPmZsdXNoKQogCQkJCWRiZ19pb19vcHMtPmZsdXNoKCk7CiAJCX0KKwkJYnVmZmVyW2NvdW50XSA9IDA7CiAJfSB3aGlsZSAoY2hlY2tzdW0gIT0geG1pdGNzdW0pOwogfQogCkBAIC0xMDgyLDEyICsxMDkxLDExIEBACiAJY2FzZSAnYyc6CiAJCXN0cmNweShyZW1jb21faW5fYnVmZmVyLCBjbWQpOwogCQlyZXR1cm4gMDsKLQljYXNlICc/JzoKLQkJZ2RiX2NtZF9zdGF0dXMoa3MpOwotCQlicmVhazsKLQljYXNlICdcMCc6Ci0JCXN0cmNweShyZW1jb21fb3V0X2J1ZmZlciwgIiIpOwotCQlicmVhazsKKwljYXNlICckJzoKKwkJc3RyY3B5KHJlbWNvbV9pbl9idWZmZXIsIGNtZCk7CisJCWdkYnN0dWJfdXNlX3ByZXZfaW5fYnVmID0gc3RybGVuKHJlbWNvbV9pbl9idWZmZXIpOworCQlnZGJzdHViX3ByZXZfaW5fYnVmX3BvcyA9IDA7CisJCXJldHVybiAwOwogCX0KIAlkYmdfaW9fb3BzLT53cml0ZV9jaGFyKCcrJyk7CiAJcHV0X3BhY2tldChyZW1jb21fb3V0X2J1ZmZlcik7CmRpZmYgLS1naXQgYS9rZXJuZWwvZGVidWcva2RiL2tkYl9idC5jIGIva2VybmVsL2RlYnVnL2tkYi9rZGJfYnQuYwppbmRleCAyZjYyZmU4Li43MTc5ZWFjIDEwMDY0NAotLS0gYS9rZXJuZWwvZGVidWcva2RiL2tkYl9idC5jCisrKyBiL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX2J0LmMKQEAgLTExMiw5ICsxMTIsOCBAQAogCXVuc2lnbmVkIGxvbmcgYWRkcjsKIAlsb25nIG9mZnNldDsKIAotCWtkYmdldGludGVudigiQlRBUkdTIiwgJmFyZ2NvdW50KTsJLyogQXJndW1lbnRzIHRvIHByaW50ICovCi0Ja2RiZ2V0aW50ZW52KCJCVEFQUk9NUFQiLCAmYnRhcHJvbXB0KTsJLyogUHJvbXB0IGFmdGVyIGVhY2gKLQkJCQkJCSAqIHByb2MgaW4gYnRhICovCisJLyogUHJvbXB0IGFmdGVyIGVhY2ggcHJvYyBpbiBidGEgKi8KKwlrZGJnZXRpbnRlbnYoIkJUQVBST01QVCIsICZidGFwcm9tcHQpOwogCiAJaWYgKHN0cmNtcChhcmd2WzBdLCAiYnRhIikgPT0gMCkgewogCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmcsICpwOwpkaWZmIC0tZ2l0IGEva2VybmVsL2RlYnVnL2tkYi9rZGJfY21kcyBiL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX2NtZHMKaW5kZXggNTZjODhlNC4uOTgzNGFkMyAxMDA2NDQKLS0tIGEva2VybmVsL2RlYnVnL2tkYi9rZGJfY21kcworKysgYi9rZXJuZWwvZGVidWcva2RiL2tkYl9jbWRzCkBAIC0xOCwxNiArMTgsMTIgQEAKIGVuZGVmY21kCiAKIGRlZmNtZCBkdW1wYWxsICIiICJGaXJzdCBsaW5lIGRlYnVnZ2luZyIKLSAgc2V0IEJUU1lNQVJHIDEKLSAgc2V0IEJUQVJHUyA5CiAgIHBpZCBSCiAgIC1kdW1wY29tbW9uCiAgIC1idGEKIGVuZGVmY21kCiAKIGRlZmNtZCBkdW1wY3B1ICIiICJTYW1lIGFzIGR1bXBhbGwgYnV0IG9ubHkgdGFza3Mgb24gY3B1cyIKLSAgc2V0IEJUU1lNQVJHIDEKLSAgc2V0IEJUQVJHUyA5CiAgIHBpZCBSCiAgIC1kdW1wY29tbW9uCiAgIC1idGMKZGlmZiAtLWdpdCBhL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX2RlYnVnZ2VyLmMgYi9rZXJuZWwvZGVidWcva2RiL2tkYl9kZWJ1Z2dlci5jCmluZGV4IGRkMGIxYjcuLmQ5Y2E5YWEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX2RlYnVnZ2VyLmMKKysrIGIva2VybmVsL2RlYnVnL2tkYi9rZGJfZGVidWdnZXIuYwpAQCAtMzAsNiArMzAsOCBAQAogaW50IGtkYl9wb2xsX2lkeCA9IDE7CiBFWFBPUlRfU1lNQk9MX0dQTChrZGJfcG9sbF9pZHgpOwogCitzdGF0aWMgc3RydWN0IGtnZGJfc3RhdGUgKmtkYl9rczsKKwogaW50IGtkYl9zdHViKHN0cnVjdCBrZ2RiX3N0YXRlICprcykKIHsKIAlpbnQgZXJyb3IgPSAwOwpAQCAtMzksNiArNDEsNyBAQAogCWtkYl9kYnRyYXBfdCBkYl9yZXN1bHQgPSBLREJfREJfTk9CUFQ7CiAJaW50IGk7CiAKKwlrZGJfa3MgPSBrczsKIAlpZiAoS0RCX1NUQVRFKFJFRU5UUlkpKSB7CiAJCXJlYXNvbiA9IEtEQl9SRUFTT05fU1dJVENIOwogCQlLREJfU1RBVEVfQ0xFQVIoUkVFTlRSWSk7CkBAIC0xMjMsMjAgKzEyNiw4IEBACiAJS0RCX1NUQVRFX0NMRUFSKFBBR0VSKTsKIAlrZGJuZWFyc3ltX2NsZWFudXAoKTsKIAlpZiAoZXJyb3IgPT0gS0RCX0NNRF9LR0RCKSB7Ci0JCWlmIChLREJfU1RBVEUoRE9JTkdfS0dEQikgfHwgS0RCX1NUQVRFKERPSU5HX0tHREIyKSkgewotCS8qCi0JICogVGhpcyBpbnRlZmFjZSBnbHVlIHdoaWNoIGFsbG93cyBrZGIgdG8gdHJhbnNpdGlvbiBpbiBpbnRvCi0JICogdGhlIGdkYiBzdHViLiAgSW4gb3JkZXIgdG8gZG8gdGhpcyB0aGUgJz8nIG9yICcnIGdkYiBzZXJpYWwKLQkgKiBwYWNrZXQgcmVzcG9uc2UgaXMgcHJvY2Vzc2VkIGhlcmUuICBBbmQgdGhlbiBjb250cm9sIGlzCi0JICogcGFzc2VkIHRvIHRoZSBnZGJzdHViLgotCSAqLwotCQkJaWYgKEtEQl9TVEFURShET0lOR19LR0RCKSkKLQkJCQlnZGJzdHViX3N0YXRlKGtzLCAiPyIpOwotCQkJZWxzZQotCQkJCWdkYnN0dWJfc3RhdGUoa3MsICIiKTsKKwkJaWYgKEtEQl9TVEFURShET0lOR19LR0RCKSkKIAkJCUtEQl9TVEFURV9DTEVBUihET0lOR19LR0RCKTsKLQkJCUtEQl9TVEFURV9DTEVBUihET0lOR19LR0RCMik7Ci0JCX0KIAkJcmV0dXJuIERCR19QQVNTX0VWRU5UOwogCX0KIAlrZGJfYnBfaW5zdGFsbChrcy0+bGludXhfcmVncyk7CkBAIC0xNjYsMyArMTU3LDcgQEAKIAlyZXR1cm4ga2dkYl9pbmZvW2tzLT5jcHVdLnJldF9zdGF0ZTsKIH0KIAordm9pZCBrZGJfZ2RiX3N0YXRlX3Bhc3MoY2hhciAqYnVmKQoreworCWdkYnN0dWJfc3RhdGUoa2RiX2tzLCBidWYpOworfQpkaWZmIC0tZ2l0IGEva2VybmVsL2RlYnVnL2tkYi9rZGJfaW8uYyBiL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX2lvLmMKaW5kZXggOTZmZGFhYy4uNDgwMmViNSAxMDA2NDQKLS0tIGEva2VybmVsL2RlYnVnL2tkYi9rZGJfaW8uYworKysgYi9rZXJuZWwvZGVidWcva2RiL2tkYl9pby5jCkBAIC0zMSwxNSArMzEsMjEgQEAKIAogaW50IGtkYl90cmFwX3ByaW50azsKIAotc3RhdGljIHZvaWQga2dkYl90cmFuc2l0aW9uX2NoZWNrKGNoYXIgKmJ1ZmZlcikKK3N0YXRpYyBpbnQga2dkYl90cmFuc2l0aW9uX2NoZWNrKGNoYXIgKmJ1ZmZlcikKIHsKLQlpbnQgc2xlbiA9IHN0cmxlbihidWZmZXIpOwotCWlmIChzdHJuY21wKGJ1ZmZlciwgIiQ/IzNmIiwgc2xlbikgIT0gMCAmJgotCSAgICBzdHJuY21wKGJ1ZmZlciwgIiRxU3VwcG9ydGVkIzM3Iiwgc2xlbikgIT0gMCAmJgotCSAgICBzdHJuY21wKGJ1ZmZlciwgIiskcVN1cHBvcnRlZCMzNyIsIHNsZW4pICE9IDApIHsKKwlpZiAoYnVmZmVyWzBdICE9ICcrJyAmJiBidWZmZXJbMF0gIT0gJyQnKSB7CiAJCUtEQl9TVEFURV9TRVQoS0dEQl9UUkFOUyk7CiAJCWtkYl9wcmludGYoIiVzIiwgYnVmZmVyKTsKKwl9IGVsc2UgeworCQlpbnQgc2xlbiA9IHN0cmxlbihidWZmZXIpOworCQlpZiAoc2xlbiA+IDMgJiYgYnVmZmVyW3NsZW4gLSAzXSA9PSAnIycpIHsKKwkJCWtkYl9nZGJfc3RhdGVfcGFzcyhidWZmZXIpOworCQkJc3RyY3B5KGJ1ZmZlciwgImtnZGIiKTsKKwkJCUtEQl9TVEFURV9TRVQoRE9JTkdfS0dEQik7CisJCQlyZXR1cm4gMTsKKwkJfQogCX0KKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBrZGJfcmVhZF9nZXRfa2V5KGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGJ1ZnNpemUpCkBAIC0yNTEsNiArMjU3LDEwIEBACiAJY2FzZSAxMzogLyogZW50ZXIgKi8KIAkJKmxhc3RjaGFyKysgPSAnXG4nOwogCQkqbGFzdGNoYXIrKyA9ICdcMCc7CisJCWlmICghS0RCX1NUQVRFKEtHREJfVFJBTlMpKSB7CisJCQlLREJfU1RBVEVfU0VUKEtHREJfVFJBTlMpOworCQkJa2RiX3ByaW50ZigiJXMiLCBidWZmZXIpOworCQl9CiAJCWtkYl9wcmludGYoIlxuIik7CiAJCXJldHVybiBidWZmZXI7CiAJY2FzZSA0OiAvKiBEZWwgKi8KQEAgLTM4MiwyMiArMzkyLDI2IEBACiAJCQkJICogcHJpbnRlZCBjaGFyYWN0ZXJzIGlmIHdlIHRoaW5rIHRoYXQKIAkJCQkgKiBrZ2RiIGlzIGNvbm5lY3RpbmcsIHVudGlsIHRoZSBjaGVjawogCQkJCSAqIGZhaWxzICovCi0JCQkJaWYgKCFLREJfU1RBVEUoS0dEQl9UUkFOUykpCi0JCQkJCWtnZGJfdHJhbnNpdGlvbl9jaGVjayhidWZmZXIpOwotCQkJCWVsc2UKKwkJCQlpZiAoIUtEQl9TVEFURShLR0RCX1RSQU5TKSkgeworCQkJCQlpZiAoa2dkYl90cmFuc2l0aW9uX2NoZWNrKGJ1ZmZlcikpCisJCQkJCQlyZXR1cm4gYnVmZmVyOworCQkJCX0gZWxzZSB7CiAJCQkJCWtkYl9wcmludGYoIiVjIiwga2V5KTsKKwkJCQl9CiAJCQl9CiAJCQkvKiBTcGVjaWFsIGVzY2FwZSB0byBrZ2RiICovCiAJCQlpZiAobGFzdGNoYXIgLSBidWZmZXIgPj0gNSAmJgogCQkJICAgIHN0cmNtcChsYXN0Y2hhciAtIDUsICIkPyMzZiIpID09IDApIHsKKwkJCQlrZGJfZ2RiX3N0YXRlX3Bhc3MobGFzdGNoYXIgLSA1KTsKIAkJCQlzdHJjcHkoYnVmZmVyLCAia2dkYiIpOwogCQkJCUtEQl9TVEFURV9TRVQoRE9JTkdfS0dEQik7CiAJCQkJcmV0dXJuIGJ1ZmZlcjsKIAkJCX0KLQkJCWlmIChsYXN0Y2hhciAtIGJ1ZmZlciA+PSAxNCAmJgotCQkJICAgIHN0cmNtcChsYXN0Y2hhciAtIDE0LCAiJHFTdXBwb3J0ZWQjMzciKSA9PSAwKSB7CisJCQlpZiAobGFzdGNoYXIgLSBidWZmZXIgPj0gMTEgJiYKKwkJCSAgICBzdHJjbXAobGFzdGNoYXIgLSAxMSwgIiRxU3VwcG9ydGVkIikgPT0gMCkgeworCQkJCWtkYl9nZGJfc3RhdGVfcGFzcyhsYXN0Y2hhciAtIDExKTsKIAkJCQlzdHJjcHkoYnVmZmVyLCAia2dkYiIpOwotCQkJCUtEQl9TVEFURV9TRVQoRE9JTkdfS0dEQjIpOworCQkJCUtEQl9TVEFURV9TRVQoRE9JTkdfS0dEQik7CiAJCQkJcmV0dXJuIGJ1ZmZlcjsKIAkJCX0KIAkJfQpkaWZmIC0tZ2l0IGEva2VybmVsL2RlYnVnL2tkYi9rZGJfbWFpbi5jIGIva2VybmVsL2RlYnVnL2tkYi9rZGJfbWFpbi5jCmluZGV4IGJlMTQ3NzkuLjYzNzg2ZTcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX21haW4uYworKysgYi9rZXJuZWwvZGVidWcva2RiL2tkYl9tYWluLmMKQEAgLTE0NSw3ICsxNDUsNiBAQAogI2VuZGlmCiAgIlJBRElYPTE2IiwKICAiTURDT1VOVD04IiwJCQkvKiBsaW5lcyBvZiBtZCBvdXRwdXQgKi8KLSAiQlRBUkdTPTkiLAkJCS8qIDkgcG9zc2libGUgYXJncyBpbiBidCAqLwogIEtEQl9QTEFURk9STV9FTlYsCiAgIkRUQUJDT1VOVD0zMCIsCiAgIk5PU0VDVD0xIiwKQEAgLTE3Miw2ICsxNzEsNyBAQAogIChjaGFyICopMCwKICAoY2hhciAqKTAsCiAgKGNoYXIgKikwLAorIChjaGFyICopMCwKIH07CiAKIHN0YXRpYyBjb25zdCBpbnQgX19uZW52ID0gKHNpemVvZihfX2VudikgLyBzaXplb2YoY2hhciAqKSk7CkBAIC0xMzg2LDcgKzEzODYsNyBAQAogCQl9CiAKIAkJaWYgKHJlc3VsdCA9PSBLREJfQ01EX0tHREIpIHsKLQkJCWlmICghKEtEQl9TVEFURShET0lOR19LR0RCKSB8fCBLREJfU1RBVEUoRE9JTkdfS0dEQjIpKSkKKwkJCWlmICghS0RCX1NUQVRFKERPSU5HX0tHREIpKQogCQkJCWtkYl9wcmludGYoIkVudGVyaW5nIHBsZWFzZSBhdHRhY2ggZGVidWdnZXIgIgogCQkJCQkgICAib3IgdXNlICREIzQ0KyBvciAkMyMzM1xuIik7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX3ByaXZhdGUuaCBiL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX3ByaXZhdGUuaAppbmRleCAzNWQ2OWVkLi5lMzgxZDEwIDEwMDY0NAotLS0gYS9rZXJuZWwvZGVidWcva2RiL2tkYl9wcml2YXRlLmgKKysrIGIva2VybmVsL2RlYnVnL2tkYi9rZGJfcHJpdmF0ZS5oCkBAIC0yMSw3ICsyMSw2IEBACiAjZGVmaW5lIEtEQl9DTURfU1MJKC0xMDAzKQogI2RlZmluZSBLREJfQ01EX1NTQgkoLTEwMDQpCiAjZGVmaW5lIEtEQl9DTURfS0dEQiAoLTEwMDUpCi0jZGVmaW5lIEtEQl9DTURfS0dEQjIgKC0xMDA2KQogCiAvKiBJbnRlcm5hbCBkZWJ1ZyBmbGFncyAqLwogI2RlZmluZSBLREJfREVCVUdfRkxBR19CUAkweDAwMDIJLyogQnJlYWtwb2ludCBzdWJzeXN0ZW0gZGVidWcgKi8KQEAgLTE0Niw3ICsxNDUsNiBAQAogCQkJCQkJICoga2V5Ym9hcmQgb24gdGhpcyBjcHUgKi8KICNkZWZpbmUgS0RCX1NUQVRFX0tFWEVDCQkweDAwMDQwMDAwCS8qIGtleGVjIGlzc3VlZCAqLwogI2RlZmluZSBLREJfU1RBVEVfRE9JTkdfS0dEQgkweDAwMDgwMDAwCS8qIGtnZGIgZW50ZXIgbm93IGlzc3VlZCAqLwotI2RlZmluZSBLREJfU1RBVEVfRE9JTkdfS0dEQjIJMHgwMDEwMDAwMAkvKiBrZ2RiIGVudGVyIG5vdyBpc3N1ZWQgKi8KICNkZWZpbmUgS0RCX1NUQVRFX0tHREJfVFJBTlMJMHgwMDIwMDAwMAkvKiBUcmFuc2l0aW9uIHRvIGtnZGIgKi8KICNkZWZpbmUgS0RCX1NUQVRFX0FSQ0gJCTB4ZmYwMDAwMDAJLyogUmVzZXJ2ZWQgZm9yIGFyY2gKIAkJCQkJCSAqIHNwZWNpZmljIHVzZSAqLwpAQCAtMjE4LDYgKzIxNiw3IEBACiBleHRlcm4gdm9pZCBrZGJfc2VuZF9zaWdfaW5mbyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBzaWdpbmZvICppbmZvKTsKIGV4dGVybiB2b2lkIGtkYl9tZW1pbmZvX3Byb2Nfc2hvdyh2b2lkKTsKIGV4dGVybiBjaGFyICprZGJfZ2V0c3RyKGNoYXIgKiwgc2l6ZV90LCBjaGFyICopOworZXh0ZXJuIHZvaWQga2RiX2dkYl9zdGF0ZV9wYXNzKGNoYXIgKmJ1Zik7CiAKIC8qIERlZmluZXMgZm9yIGtkYl9zeW1ib2xfcHJpbnQgKi8KICNkZWZpbmUgS0RCX1NQX1NQQUNFQgkweDAwMDEJCS8qIFNwYWNlIGJlZm9yZSBzdHJpbmcgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9mdXRleC5jIGIva2VybmVsL2Z1dGV4LmMKaW5kZXggMGEzMDg5Ny4uMTFjYmUwNSAxMDA2NDQKLS0tIGEva2VybmVsL2Z1dGV4LmMKKysrIGIva2VybmVsL2Z1dGV4LmMKQEAgLTIxOCw2ICsyMTgsOCBAQAogICogQHVhZGRyOgl2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGZ1dGV4CiAgKiBAZnNoYXJlZDoJMCBmb3IgYSBQUk9DRVNTX1BSSVZBVEUgZnV0ZXgsIDEgZm9yIFBST0NFU1NfU0hBUkVECiAgKiBAa2V5OglhZGRyZXNzIHdoZXJlIHJlc3VsdCBpcyBzdG9yZWQuCisgKiBAcnc6CQltYXBwaW5nIG5lZWRzIHRvIGJlIHJlYWQvd3JpdGUgKHZhbHVlczogVkVSSUZZX1JFQUQsCisgKiAgICAgICAgICAgICAgVkVSSUZZX1dSSVRFKQogICoKICAqIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9yIDAKICAqIFRoZSBrZXkgd29yZHMgYXJlIHN0b3JlZCBpbiAqa2V5IG9uIHN1Y2Nlc3MuCkBAIC0yMjksMTIgKzIzMSwxMiBAQAogICogbG9ja19wYWdlKCkgbWlnaHQgc2xlZXAsIHRoZSBjYWxsZXIgc2hvdWxkIG5vdCBob2xkIGEgc3BpbmxvY2suCiAgKi8KIHN0YXRpYyBpbnQKLWdldF9mdXRleF9rZXkodTMyIF9fdXNlciAqdWFkZHIsIGludCBmc2hhcmVkLCB1bmlvbiBmdXRleF9rZXkgKmtleSkKK2dldF9mdXRleF9rZXkodTMyIF9fdXNlciAqdWFkZHIsIGludCBmc2hhcmVkLCB1bmlvbiBmdXRleF9rZXkgKmtleSwgaW50IHJ3KQogewogCXVuc2lnbmVkIGxvbmcgYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKXVhZGRyOwogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CiAJc3RydWN0IHBhZ2UgKnBhZ2UsICpwYWdlX2hlYWQ7Ci0JaW50IGVycjsKKwlpbnQgZXJyLCBybyA9IDA7CiAKIAkvKgogCSAqIFRoZSBmdXRleCBhZGRyZXNzIG11c3QgYmUgIm5hdHVyYWxseSIgYWxpZ25lZC4KQEAgLTI2Miw4ICsyNjQsMTggQEAKIAogYWdhaW46CiAJZXJyID0gZ2V0X3VzZXJfcGFnZXNfZmFzdChhZGRyZXNzLCAxLCAxLCAmcGFnZSk7CisJLyoKKwkgKiBJZiB3cml0ZSBhY2Nlc3MgaXMgbm90IHJlcXVpcmVkIChlZy4gRlVURVhfV0FJVCksIHRyeQorCSAqIGFuZCBnZXQgcmVhZC1vbmx5IGFjY2Vzcy4KKwkgKi8KKwlpZiAoZXJyID09IC1FRkFVTFQgJiYgcncgPT0gVkVSSUZZX1JFQUQpIHsKKwkJZXJyID0gZ2V0X3VzZXJfcGFnZXNfZmFzdChhZGRyZXNzLCAxLCAwLCAmcGFnZSk7CisJCXJvID0gMTsKKwl9CiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CisJZWxzZQorCQllcnIgPSAwOwogCiAjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCiAJcGFnZV9oZWFkID0gcGFnZTsKQEAgLTMwNSw2ICszMTcsMTMgQEAKIAlpZiAoIXBhZ2VfaGVhZC0+bWFwcGluZykgewogCQl1bmxvY2tfcGFnZShwYWdlX2hlYWQpOwogCQlwdXRfcGFnZShwYWdlX2hlYWQpOworCQkvKgorCQkqIFpFUk9fUEFHRSBwYWdlcyBkb24ndCBoYXZlIGEgbWFwcGluZy4gQXZvaWQgYSBidXN5IGxvb3AKKwkJKiB0cnlpbmcgdG8gZmluZCBvbmUuIFJXIG1hcHBpbmcgd291bGQgaGF2ZSBDT1cnZCAoYW5kIHRodXMKKwkJKiBoYXZlIGEgbWFwcGluZykgc28gdGhpcyBwYWdlIGlzIFJPIGFuZCB3b24ndCBldmVyIGNoYW5nZS4KKwkJKi8KKwkJaWYgKChwYWdlX2hlYWQgPT0gWkVST19QQUdFKGFkZHJlc3MpKSkKKwkJCXJldHVybiAtRUZBVUxUOwogCQlnb3RvIGFnYWluOwogCX0KIApAQCAtMzE2LDYgKzMzNSwxNSBAQAogCSAqIHRoZSBvYmplY3Qgbm90IHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3MuCiAJICovCiAJaWYgKFBhZ2VBbm9uKHBhZ2VfaGVhZCkpIHsKKwkJLyoKKwkJICogQSBSTyBhbm9ueW1vdXMgcGFnZSB3aWxsIG5ldmVyIGNoYW5nZSBhbmQgdGh1cyBkb2Vzbid0IG1ha2UKKwkJICogc2Vuc2UgZm9yIGZ1dGV4IG9wZXJhdGlvbnMuCisJCSAqLworCQlpZiAocm8pIHsKKwkJCWVyciA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCiAJCWtleS0+Ym90aC5vZmZzZXQgfD0gRlVUX09GRl9NTVNIQVJFRDsgLyogcmVmIHRha2VuIG9uIG1tICovCiAJCWtleS0+cHJpdmF0ZS5tbSA9IG1tOwogCQlrZXktPnByaXZhdGUuYWRkcmVzcyA9IGFkZHJlc3M7CkBAIC0zMjcsOSArMzU1LDEwIEBACiAKIAlnZXRfZnV0ZXhfa2V5X3JlZnMoa2V5KTsKIAorb3V0OgogCXVubG9ja19wYWdlKHBhZ2VfaGVhZCk7CiAJcHV0X3BhZ2UocGFnZV9oZWFkKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcHV0X2Z1dGV4X2tleSh1bmlvbiBmdXRleF9rZXkgKmtleSkKQEAgLTk0MCw3ICs5NjksNyBAQAogCWlmICghYml0c2V0KQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIsIGZsYWdzICYgRkxBR1NfU0hBUkVELCAma2V5KTsKKwlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyLCBmbGFncyAmIEZMQUdTX1NIQVJFRCwgJmtleSwgVkVSSUZZX1JFQUQpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCWdvdG8gb3V0OwogCkBAIC05ODYsMTAgKzEwMTUsMTAgQEAKIAlpbnQgcmV0LCBvcF9yZXQ7CiAKIHJldHJ5OgotCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIxLCBmbGFncyAmIEZMQUdTX1NIQVJFRCwgJmtleTEpOworCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIxLCBmbGFncyAmIEZMQUdTX1NIQVJFRCwgJmtleTEsIFZFUklGWV9SRUFEKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQogCQlnb3RvIG91dDsKLQlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyMiwgZmxhZ3MgJiBGTEFHU19TSEFSRUQsICZrZXkyKTsKKwlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyMiwgZmxhZ3MgJiBGTEFHU19TSEFSRUQsICZrZXkyLCBWRVJJRllfV1JJVEUpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCWdvdG8gb3V0X3B1dF9rZXkxOwogCkBAIC0xMjQzLDEwICsxMjcyLDExIEBACiAJCXBpX3N0YXRlID0gTlVMTDsKIAl9CiAKLQlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyMSwgZmxhZ3MgJiBGTEFHU19TSEFSRUQsICZrZXkxKTsKKwlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyMSwgZmxhZ3MgJiBGTEFHU19TSEFSRUQsICZrZXkxLCBWRVJJRllfUkVBRCk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJZ290byBvdXQ7Ci0JcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkcjIsIGZsYWdzICYgRkxBR1NfU0hBUkVELCAma2V5Mik7CisJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkcjIsIGZsYWdzICYgRkxBR1NfU0hBUkVELCAma2V5MiwKKwkJCSAgICByZXF1ZXVlX3BpID8gVkVSSUZZX1dSSVRFIDogVkVSSUZZX1JFQUQpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCiAJCWdvdG8gb3V0X3B1dF9rZXkxOwogCkBAIC0xNzkwLDcgKzE4MjAsNyBAQAogCSAqIHdoaWxlIHRoZSBzeXNjYWxsIGV4ZWN1dGVzLgogCSAqLwogcmV0cnk6Ci0JcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkciwgZmxhZ3MgJiBGTEFHU19TSEFSRUQsICZxLT5rZXkpOworCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIsIGZsYWdzICYgRkxBR1NfU0hBUkVELCAmcS0+a2V5LCBWRVJJRllfUkVBRCk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJcmV0dXJuIHJldDsKIApAQCAtMTk0MSw3ICsxOTcxLDcgQEAKIAl9CiAKIHJldHJ5OgotCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIsIGZsYWdzICYgRkxBR1NfU0hBUkVELCAmcS5rZXkpOworCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIsIGZsYWdzICYgRkxBR1NfU0hBUkVELCAmcS5rZXksIFZFUklGWV9XUklURSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJZ290byBvdXQ7CiAKQEAgLTIwNjAsNyArMjA5MCw3IEBACiAJaWYgKCh1dmFsICYgRlVURVhfVElEX01BU0spICE9IHZwaWQpCiAJCXJldHVybiAtRVBFUk07CiAKLQlyZXQgPSBnZXRfZnV0ZXhfa2V5KHVhZGRyLCBmbGFncyAmIEZMQUdTX1NIQVJFRCwgJmtleSk7CisJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkciwgZmxhZ3MgJiBGTEFHU19TSEFSRUQsICZrZXksIFZFUklGWV9XUklURSk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJZ290byBvdXQ7CiAKQEAgLTIyNDksNyArMjI3OSw3IEBACiAJZGVidWdfcnRfbXV0ZXhfaW5pdF93YWl0ZXIoJnJ0X3dhaXRlcik7CiAJcnRfd2FpdGVyLnRhc2sgPSBOVUxMOwogCi0JcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkcjIsIGZsYWdzICYgRkxBR1NfU0hBUkVELCAma2V5Mik7CisJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkcjIsIGZsYWdzICYgRkxBR1NfU0hBUkVELCAma2V5MiwgVkVSSUZZX1dSSVRFKTsKIAlpZiAodW5saWtlbHkocmV0ICE9IDApKQogCQlnb3RvIG91dDsKIApkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9LY29uZmlnIGIva2VybmVsL2lycS9LY29uZmlnCmluZGV4IGQxZDA1MWIzLi41YTM4YmY0IDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL0tjb25maWcKKysrIGIva2VybmVsL2lycS9LY29uZmlnCkBAIC01Miw2ICs1MiwxMCBAQAogY29uZmlnIEdFTkVSSUNfSVJRX0NISVAKICAgICAgICBib29sCiAKKyMgR2VuZXJpYyBpcnFfZG9tYWluIGh3IDwtLT4gbGludXggaXJxIG51bWJlciB0cmFuc2xhdGlvbgorY29uZmlnIElSUV9ET01BSU4KKwlib29sCisKICMgU3VwcG9ydCBmb3JjZWQgaXJxIHRocmVhZGluZwogY29uZmlnIElSUV9GT1JDRURfVEhSRUFESU5HCiAgICAgICAgYm9vbApkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9NYWtlZmlsZSBiL2tlcm5lbC9pcnEvTWFrZWZpbGUKaW5kZXggNzMyOTAwNS4uZmZmMTczOCAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9NYWtlZmlsZQorKysgYi9rZXJuZWwvaXJxL01ha2VmaWxlCkBAIC0yLDYgKzIsNyBAQAogb2JqLXkgOj0gaXJxZGVzYy5vIGhhbmRsZS5vIG1hbmFnZS5vIHNwdXJpb3VzLm8gcmVzZW5kLm8gY2hpcC5vIGR1bW15Y2hpcC5vIGRldnJlcy5vCiBvYmotJChDT05GSUdfR0VORVJJQ19JUlFfQ0hJUCkgKz0gZ2VuZXJpYy1jaGlwLm8KIG9iai0kKENPTkZJR19HRU5FUklDX0lSUV9QUk9CRSkgKz0gYXV0b3Byb2JlLm8KK29iai0kKENPTkZJR19JUlFfRE9NQUlOKSArPSBpcnFkb21haW4ubwogb2JqLSQoQ09ORklHX1BST0NfRlMpICs9IHByb2Mubwogb2JqLSQoQ09ORklHX0dFTkVSSUNfUEVORElOR19JUlEpICs9IG1pZ3JhdGlvbi5vCiBvYmotJChDT05GSUdfUE1fU0xFRVApICs9IHBtLm8KZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvaXJxZG9tYWluLmMgYi9rZXJuZWwvaXJxL2lycWRvbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ODI4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9rZXJuZWwvaXJxL2lycWRvbWFpbi5jCkBAIC0wLDAgKzEsMTgwIEBACisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaXJxZG9tYWluLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2FkZHJlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKK3N0YXRpYyBMSVNUX0hFQUQoaXJxX2RvbWFpbl9saXN0KTsKK3N0YXRpYyBERUZJTkVfTVVURVgoaXJxX2RvbWFpbl9tdXRleCk7CisKKy8qKgorICogaXJxX2RvbWFpbl9hZGQoKSAtIFJlZ2lzdGVyIGFuIGlycV9kb21haW4KKyAqIEBkb21haW46IHB0ciB0byBpbml0aWFsaXplZCBpcnFfZG9tYWluIHN0cnVjdHVyZQorICoKKyAqIFJlZ2lzdGVycyBhbiBpcnFfZG9tYWluIHN0cnVjdHVyZS4gIFRoZSBpcnFfZG9tYWluIG11c3QgYXQgYSBtaW5pbXVtIGJlCisgKiBpbml0aWFsaXplZCB3aXRoIGFuIG9wcyBzdHJ1Y3R1cmUgcG9pbnRlciwgYW5kIGVpdGhlciBhIC0+dG9faXJxIGhvb2sgb3IKKyAqIGEgdmFsaWQgaXJxX2Jhc2UgdmFsdWUuICBFdmVyeXRoaW5nIGVsc2UgaXMgb3B0aW9uYWwuCisgKi8KK3ZvaWQgaXJxX2RvbWFpbl9hZGQoc3RydWN0IGlycV9kb21haW4gKmRvbWFpbikKK3sKKwlzdHJ1Y3QgaXJxX2RhdGEgKmQ7CisJaW50IGh3aXJxOworCisJLyoKKwkgKiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgaXJxX2RvbWFpbiBvd25lciBoYXMgYWxyZWFkeSBhbGxvY2F0ZWQKKwkgKiB0aGUgaXJxX2Rlc2NzLiAgVGhpcyBibG9jayB3aWxsIGJlIHJlbW92ZWQgd2hlbiBzdXBwb3J0IGZvciBkeW5hbWljCisJICogYWxsb2NhdGlvbiBvZiBpcnFfZGVzY3MgaXMgYWRkZWQgdG8gaXJxX2RvbWFpbi4KKwkgKi8KKwlmb3IgKGh3aXJxID0gMDsgaHdpcnEgPCBkb21haW4tPm5yX2lycTsgaHdpcnErKykgeworCQlkID0gaXJxX2dldF9pcnFfZGF0YShpcnFfZG9tYWluX3RvX2lycShkb21haW4sIGh3aXJxKSk7CisJCWlmIChkIHx8IGQtPmRvbWFpbikgeworCQkJLyogdGhpbmdzIGFyZSBicm9rZW47IGp1c3QgcmVwb3J0LCBkb24ndCBjbGVhbiB1cCAqLworCQkJV0FSTigxLCAiZXJyb3I6IGlycV9kZXNjIGFscmVhZHkgYXNzaWduZWQgdG8gYSBkb21haW4iKTsKKwkJCXJldHVybjsKKwkJfQorCQlkLT5kb21haW4gPSBkb21haW47CisJCWQtPmh3aXJxID0gaHdpcnE7CisJfQorCisJbXV0ZXhfbG9jaygmaXJxX2RvbWFpbl9tdXRleCk7CisJbGlzdF9hZGQoJmRvbWFpbi0+bGlzdCwgJmlycV9kb21haW5fbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZpcnFfZG9tYWluX211dGV4KTsKK30KKworLyoqCisgKiBpcnFfZG9tYWluX2RlbCgpIC0gVW5yZWdpc3RlciBhbiBpcnFfZG9tYWluCisgKiBAZG9tYWluOiBwdHIgdG8gcmVnaXN0ZXJlZCBpcnFfZG9tYWluLgorICovCit2b2lkIGlycV9kb21haW5fZGVsKHN0cnVjdCBpcnFfZG9tYWluICpkb21haW4pCit7CisJc3RydWN0IGlycV9kYXRhICpkOworCWludCBod2lycTsKKworCW11dGV4X2xvY2soJmlycV9kb21haW5fbXV0ZXgpOworCWxpc3RfZGVsKCZkb21haW4tPmxpc3QpOworCW11dGV4X3VubG9jaygmaXJxX2RvbWFpbl9tdXRleCk7CisKKwkvKiBDbGVhciB0aGUgaXJxX2RvbWFpbiBhc3NpZ25tZW50cyAqLworCWZvciAoaHdpcnEgPSAwOyBod2lycSA8IGRvbWFpbi0+bnJfaXJxOyBod2lycSsrKSB7CisJCWQgPSBpcnFfZ2V0X2lycV9kYXRhKGlycV9kb21haW5fdG9faXJxKGRvbWFpbiwgaHdpcnEpKTsKKwkJZC0+ZG9tYWluID0gTlVMTDsKKwl9Cit9CisKKyNpZiBkZWZpbmVkKENPTkZJR19PRl9JUlEpCisvKioKKyAqIGlycV9jcmVhdGVfb2ZfbWFwcGluZygpIC0gTWFwIGEgbGludXggaXJxIG51bWJlciBmcm9tIGEgRFQgaW50ZXJydXB0IHNwZWMKKyAqCisgKiBVc2VkIGJ5IHRoZSBkZXZpY2UgdHJlZSBpbnRlcnJ1cHQgbWFwcGluZyBjb2RlIHRvIHRyYW5zbGF0ZSBhIGRldmljZSB0cmVlCisgKiBpbnRlcnJ1cHQgc3BlY2lmaWVyIHRvIGEgdmFsaWQgbGludXggaXJxIG51bWJlci4gIFJldHVybnMgZWl0aGVyIGEgdmFsaWQKKyAqIGxpbnV4IElSUSBudW1iZXIgb3IgMC4KKyAqCisgKiBXaGVuIHRoZSBjYWxsZXIgbm8gbG9uZ2VyIG5lZWQgdGhlIGlycSBudW1iZXIgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiBpdAorICogc2hvdWxkIGFycmFuZ2UgdG8gY2FsbCBpcnFfZGlzcG9zZV9tYXBwaW5nKCkuCisgKi8KK3Vuc2lnbmVkIGludCBpcnFfY3JlYXRlX29mX21hcHBpbmcoc3RydWN0IGRldmljZV9ub2RlICpjb250cm9sbGVyLAorCQkJCSAgIGNvbnN0IHUzMiAqaW50c3BlYywgdW5zaWduZWQgaW50IGludHNpemUpCit7CisJc3RydWN0IGlycV9kb21haW4gKmRvbWFpbjsKKwl1bnNpZ25lZCBsb25nIGh3aXJxOworCXVuc2lnbmVkIGludCBpcnEsIHR5cGU7CisJaW50IHJjID0gLUVJTlZBTDsKKworCS8qIEZpbmQgYSBkb21haW4gd2hpY2ggY2FuIHRyYW5zbGF0ZSB0aGUgaXJxIHNwZWMgKi8KKwltdXRleF9sb2NrKCZpcnFfZG9tYWluX211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRvbWFpbiwgJmlycV9kb21haW5fbGlzdCwgbGlzdCkgeworCQlpZiAoIWRvbWFpbi0+b3BzLT5kdF90cmFuc2xhdGUpCisJCQljb250aW51ZTsKKwkJcmMgPSBkb21haW4tPm9wcy0+ZHRfdHJhbnNsYXRlKGRvbWFpbiwgY29udHJvbGxlciwKKwkJCQkJaW50c3BlYywgaW50c2l6ZSwgJmh3aXJxLCAmdHlwZSk7CisJCWlmIChyYyA9PSAwKQorCQkJYnJlYWs7CisJfQorCW11dGV4X3VubG9jaygmaXJxX2RvbWFpbl9tdXRleCk7CisKKwlpZiAocmMgIT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpcnEgPSBpcnFfZG9tYWluX3RvX2lycShkb21haW4sIGh3aXJxKTsKKwlpZiAodHlwZSAhPSBJUlFfVFlQRV9OT05FKQorCQlpcnFfc2V0X2lycV90eXBlKGlycSwgdHlwZSk7CisJcHJfZGVidWcoIiVzOiBtYXBwZWQgaHdpcnE9JWkgdG8gaXJxPSVpLCBmbGFncz0leFxuIiwKKwkJIGNvbnRyb2xsZXItPmZ1bGxfbmFtZSwgKGludClod2lycSwgaXJxLCB0eXBlKTsKKwlyZXR1cm4gaXJxOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaXJxX2NyZWF0ZV9vZl9tYXBwaW5nKTsKKworLyoqCisgKiBpcnFfZGlzcG9zZV9tYXBwaW5nKCkgLSBEaXNjYXJkIGEgbWFwcGluZyBjcmVhdGVkIGJ5IGlycV9jcmVhdGVfb2ZfbWFwcGluZygpCisgKiBAaXJxOiBsaW51eCBpcnEgbnVtYmVyIHRvIGJlIGRpc2NhcmRlZAorICoKKyAqIENhbGxpbmcgdGhpcyBmdW5jdGlvbiBpbmRpY2F0ZXMgdGhlIGNhbGxlciBubyBsb25nZXIgbmVlZHMgYSByZWZlcmVuY2UgdG8KKyAqIHRoZSBsaW51eCBpcnEgbnVtYmVyIHJldHVybmVkIGJ5IGEgcHJpb3IgY2FsbCB0byBpcnFfY3JlYXRlX29mX21hcHBpbmcoKS4KKyAqLwordm9pZCBpcnFfZGlzcG9zZV9tYXBwaW5nKHVuc2lnbmVkIGludCBpcnEpCit7CisJLyoKKwkgKiBub3RoaW5nIHlldDsgd2lsbCBiZSBmaWxsZWQgd2hlbiBzdXBwb3J0IGZvciBkeW5hbWljIGFsbG9jYXRpb24gb2YKKwkgKiBpcnFfZGVzY3MgaXMgYWRkZWQgdG8gaXJxX2RvbWFpbgorCSAqLworfQorRVhQT1JUX1NZTUJPTF9HUEwoaXJxX2Rpc3Bvc2VfbWFwcGluZyk7CisKK2ludCBpcnFfZG9tYWluX3NpbXBsZV9kdF90cmFuc2xhdGUoc3RydWN0IGlycV9kb21haW4gKmQsCisJCQkgICAgc3RydWN0IGRldmljZV9ub2RlICpjb250cm9sbGVyLAorCQkJICAgIGNvbnN0IHUzMiAqaW50c3BlYywgdW5zaWduZWQgaW50IGludHNpemUsCisJCQkgICAgdW5zaWduZWQgbG9uZyAqb3V0X2h3aXJxLCB1bnNpZ25lZCBpbnQgKm91dF90eXBlKQoreworCWlmIChkLT5vZl9ub2RlICE9IGNvbnRyb2xsZXIpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChpbnRzaXplIDwgMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqb3V0X2h3aXJxID0gaW50c3BlY1swXTsKKwkqb3V0X3R5cGUgPSBJUlFfVFlQRV9OT05FOworCWlmIChpbnRzaXplID4gMSkKKwkJKm91dF90eXBlID0gaW50c3BlY1sxXSAmIElSUV9UWVBFX1NFTlNFX01BU0s7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBpcnFfZG9tYWluX29wcyBpcnFfZG9tYWluX3NpbXBsZV9vcHMgPSB7CisJLmR0X3RyYW5zbGF0ZSA9IGlycV9kb21haW5fc2ltcGxlX2R0X3RyYW5zbGF0ZSwKK307CitFWFBPUlRfU1lNQk9MX0dQTChpcnFfZG9tYWluX3NpbXBsZV9vcHMpOworCisvKioKKyAqIGlycV9kb21haW5fY3JlYXRlX3NpbXBsZSgpIC0gU2V0IHVwIGEgJ3NpbXBsZScgdHJhbnNsYXRpb24gcmFuZ2UKKyAqLwordm9pZCBpcnFfZG9tYWluX2FkZF9zaW1wbGUoc3RydWN0IGRldmljZV9ub2RlICpjb250cm9sbGVyLCBpbnQgaXJxX2Jhc2UpCit7CisJc3RydWN0IGlycV9kb21haW4gKmRvbWFpbjsKKworCWRvbWFpbiA9IGt6YWxsb2Moc2l6ZW9mKCpkb21haW4pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRvbWFpbikgeworCQlXQVJOX09OKDEpOworCQlyZXR1cm47CisJfQorCisJZG9tYWluLT5pcnFfYmFzZSA9IGlycV9iYXNlOworCWRvbWFpbi0+b2Zfbm9kZSA9IG9mX25vZGVfZ2V0KGNvbnRyb2xsZXIpOworCWRvbWFpbi0+b3BzID0gJmlycV9kb21haW5fc2ltcGxlX29wczsKKwlpcnFfZG9tYWluX2FkZChkb21haW4pOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaXJxX2RvbWFpbl9hZGRfc2ltcGxlKTsKKwordm9pZCBpcnFfZG9tYWluX2dlbmVyYXRlX3NpbXBsZShjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCwKKwkJCQl1NjQgcGh5c19iYXNlLCB1bnNpZ25lZCBpbnQgaXJxX3N0YXJ0KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKKwlwcl9pbmZvKCJsb29raW5nIGZvciBwaHlzX2Jhc2U9JWxseCwgaXJxX3N0YXJ0PSVpXG4iLAorCQkodW5zaWduZWQgbG9uZyBsb25nKSBwaHlzX2Jhc2UsIChpbnQpIGlycV9zdGFydCk7CisJbm9kZSA9IG9mX2ZpbmRfbWF0Y2hpbmdfbm9kZV9ieV9hZGRyZXNzKE5VTEwsIG1hdGNoLCBwaHlzX2Jhc2UpOworCWlmIChub2RlKQorCQlpcnFfZG9tYWluX2FkZF9zaW1wbGUobm9kZSwgaXJxX3N0YXJ0KTsKKwllbHNlCisJCXByX2luZm8oIm5vIG5vZGUgZm91bmRcbiIpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaXJxX2RvbWFpbl9nZW5lcmF0ZV9zaW1wbGUpOworI2VuZGlmIC8qIENPTkZJR19PRl9JUlEgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9rbW9kLmMgYi9rZXJuZWwva21vZC5jCmluZGV4IDQ3NjEzZGYuLmRkYzc2NDQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9rbW9kLmMKKysrIGIva2VybmVsL2ttb2QuYwpAQCAtMjc0LDcgKzI3NCw3IEBACiAgKiAodXNlZCBmb3IgcHJldmVudGluZyB1c2VyIGxhbmQgcHJvY2Vzc2VzIGZyb20gYmVpbmcgY3JlYXRlZCBhZnRlciB0aGUgdXNlcgogICogbGFuZCBoYXMgYmVlbiBmcm96ZW4gZHVyaW5nIGEgc3lzdGVtLXdpZGUgaGliZXJuYXRpb24gb3Igc3VzcGVuZCBvcGVyYXRpb24pLgogICovCi1zdGF0aWMgaW50IHVzZXJtb2RlaGVscGVyX2Rpc2FibGVkOworc3RhdGljIGludCB1c2VybW9kZWhlbHBlcl9kaXNhYmxlZCA9IDE7CiAKIC8qIE51bWJlciBvZiBoZWxwZXJzIHJ1bm5pbmcgKi8KIHN0YXRpYyBhdG9taWNfdCBydW5uaW5nX2hlbHBlcnMgPSBBVE9NSUNfSU5JVCgwKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9sb2NrZGVwLmMgYi9rZXJuZWwvbG9ja2RlcC5jCmluZGV4IDM5NTZmNTEuLjhjMjQyOTQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9sb2NrZGVwLmMKKysrIGIva2VybmVsL2xvY2tkZXAuYwpAQCAtMjQ2OCw3ICsyNDY4LDcgQEAKIAogCQlCVUdfT04odXNhZ2VfYml0ID49IExPQ0tfVVNBR0VfU1RBVEVTKTsKIAotCQlpZiAoaGxvY2tfY2xhc3MoaGxvY2spLT5rZXkgPT0gJl9fbG9ja2RlcF9ub192YWxpZGF0ZV9fKQorCQlpZiAoaGxvY2tfY2xhc3MoaGxvY2spLT5rZXkgPT0gX19sb2NrZGVwX25vX3ZhbGlkYXRlX18uc3Via2V5cykKIAkJCWNvbnRpbnVlOwogCiAJCWlmICghbWFya19sb2NrKGN1cnIsIGhsb2NrLCB1c2FnZV9iaXQpKQpAQCAtMjQ4NSwyMyArMjQ4NSw5IEBACiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyID0gY3VycmVudDsKIAotCWlmIChERUJVR19MT0NLU19XQVJOX09OKHVubGlrZWx5KGVhcmx5X2Jvb3RfaXJxc19kaXNhYmxlZCkpKQotCQlyZXR1cm47Ci0KLQlpZiAodW5saWtlbHkoY3Vyci0+aGFyZGlycXNfZW5hYmxlZCkpIHsKLQkJLyoKLQkJICogTmVpdGhlciBpcnEgbm9yIHByZWVtcHRpb24gYXJlIGRpc2FibGVkIGhlcmUKLQkJICogc28gdGhpcyBpcyByYWN5IGJ5IG5hdHVyZSBidXQgbG9zaW5nIG9uZSBoaXQKLQkJICogaW4gYSBzdGF0IGlzIG5vdCBhIGJpZyBkZWFsLgotCQkgKi8KLQkJX19kZWJ1Z19hdG9taWNfaW5jKHJlZHVuZGFudF9oYXJkaXJxc19vbik7Ci0JCXJldHVybjsKLQl9CiAJLyogd2UnbGwgZG8gYW4gT0ZGIC0+IE9OIHRyYW5zaXRpb246ICovCiAJY3Vyci0+aGFyZGlycXNfZW5hYmxlZCA9IDE7CiAKLQlpZiAoREVCVUdfTE9DS1NfV0FSTl9PTihjdXJyZW50LT5oYXJkaXJxX2NvbnRleHQpKQotCQlyZXR1cm47CiAJLyoKIAkgKiBXZSBhcmUgZ29pbmcgdG8gdHVybiBoYXJkaXJxcyBvbiwgc28gc2V0IHRoZQogCSAqIHVzYWdlIGJpdCBmb3IgYWxsIGhlbGQgbG9ja3M6CkBAIC0yNTI5LDkgKzI1MTUsMjUgQEAKIAlpZiAodW5saWtlbHkoIWRlYnVnX2xvY2tzIHx8IGN1cnJlbnQtPmxvY2tkZXBfcmVjdXJzaW9uKSkKIAkJcmV0dXJuOwogCisJaWYgKHVubGlrZWx5KGN1cnJlbnQtPmhhcmRpcnFzX2VuYWJsZWQpKSB7CisJCS8qCisJCSAqIE5laXRoZXIgaXJxIG5vciBwcmVlbXB0aW9uIGFyZSBkaXNhYmxlZCBoZXJlCisJCSAqIHNvIHRoaXMgaXMgcmFjeSBieSBuYXR1cmUgYnV0IGxvc2luZyBvbmUgaGl0CisJCSAqIGluIGEgc3RhdCBpcyBub3QgYSBiaWcgZGVhbC4KKwkJICovCisJCV9fZGVidWdfYXRvbWljX2luYyhyZWR1bmRhbnRfaGFyZGlycXNfb24pOworCQlyZXR1cm47CisJfQorCiAJaWYgKERFQlVHX0xPQ0tTX1dBUk5fT04oIWlycXNfZGlzYWJsZWQoKSkpCiAJCXJldHVybjsKIAorCWlmIChERUJVR19MT0NLU19XQVJOX09OKHVubGlrZWx5KGVhcmx5X2Jvb3RfaXJxc19kaXNhYmxlZCkpKQorCQlyZXR1cm47CisKKwlpZiAoREVCVUdfTE9DS1NfV0FSTl9PTihjdXJyZW50LT5oYXJkaXJxX2NvbnRleHQpKQorCQlyZXR1cm47CisKIAljdXJyZW50LT5sb2NrZGVwX3JlY3Vyc2lvbiA9IDE7CiAJX190cmFjZV9oYXJkaXJxc19vbl9jYWxsZXIoaXApOwogCWN1cnJlbnQtPmxvY2tkZXBfcmVjdXJzaW9uID0gMDsKQEAgLTI4NzIsMTAgKzI4NzQsNyBAQAogdm9pZCBsb2NrZGVwX2luaXRfbWFwKHN0cnVjdCBsb2NrZGVwX21hcCAqbG9jaywgY29uc3QgY2hhciAqbmFtZSwKIAkJICAgICAgc3RydWN0IGxvY2tfY2xhc3Nfa2V5ICprZXksIGludCBzdWJjbGFzcykKIHsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBOUl9MT0NLREVQX0NBQ0hJTkdfQ0xBU1NFUzsgaSsrKQotCQlsb2NrLT5jbGFzc19jYWNoZVtpXSA9IE5VTEw7CisJbWVtc2V0KGxvY2ssIDAsIHNpemVvZigqbG9jaykpOwogCiAjaWZkZWYgQ09ORklHX0xPQ0tfU1RBVAogCWxvY2stPmNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcmVzb3VyY2UuYyBiL2tlcm5lbC9yZXNvdXJjZS5jCmluZGV4IDNmZjQwMTcuLjNiM2NlZGMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yZXNvdXJjZS5jCisrKyBiL2tlcm5lbC9yZXNvdXJjZS5jCkBAIC01NTMsNiArNTUzLDI3IEBACiAKIEVYUE9SVF9TWU1CT0woYWxsb2NhdGVfcmVzb3VyY2UpOwogCisvKioKKyAqIGxvb2t1cF9yZXNvdXJjZSAtIGZpbmQgYW4gZXhpc3RpbmcgcmVzb3VyY2UgYnkgYSByZXNvdXJjZSBzdGFydCBhZGRyZXNzCisgKiBAcm9vdDogcm9vdCByZXNvdXJjZSBkZXNjcmlwdG9yCisgKiBAc3RhcnQ6IHJlc291cmNlIHN0YXJ0IGFkZHJlc3MKKyAqCisgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgcmVzb3VyY2UgaWYgZm91bmQsIE5VTEwgb3RoZXJ3aXNlCisgKi8KK3N0cnVjdCByZXNvdXJjZSAqbG9va3VwX3Jlc291cmNlKHN0cnVjdCByZXNvdXJjZSAqcm9vdCwgcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0KQoreworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJcmVhZF9sb2NrKCZyZXNvdXJjZV9sb2NrKTsKKwlmb3IgKHJlcyA9IHJvb3QtPmNoaWxkOyByZXM7IHJlcyA9IHJlcy0+c2libGluZykgeworCQlpZiAocmVzLT5zdGFydCA9PSBzdGFydCkKKwkJCWJyZWFrOworCX0KKwlyZWFkX3VubG9jaygmcmVzb3VyY2VfbG9jayk7CisKKwlyZXR1cm4gcmVzOworfQorCiAvKgogICogSW5zZXJ0IGEgcmVzb3VyY2UgaW50byB0aGUgcmVzb3VyY2UgdHJlZS4gSWYgc3VjY2Vzc2Z1bCwgcmV0dXJuIE5VTEwsCiAgKiBvdGhlcndpc2UgcmV0dXJuIHRoZSBjb25mbGljdGluZyByZXNvdXJjZSAoY29tcGFyZSB0byBfX3JlcXVlc3RfcmVzb3VyY2UoKSkKZGlmZiAtLWdpdCBhL2tlcm5lbC90YXNrc3RhdHMuYyBiL2tlcm5lbC90YXNrc3RhdHMuYwppbmRleCBkMWRiMjg4Li5lMTljZTE0IDEwMDY0NAotLS0gYS9rZXJuZWwvdGFza3N0YXRzLmMKKysrIGIva2VybmVsL3Rhc2tzdGF0cy5jCkBAIC0yOTEsMzAgKzI5MSwyOCBAQAogCWlmICghY3B1bWFza19zdWJzZXQobWFzaywgY3B1X3Bvc3NpYmxlX21hc2spKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXMgPSBOVUxMOwogCWlmIChpc2FkZCA9PSBSRUdJU1RFUikgewogCQlmb3JfZWFjaF9jcHUoY3B1LCBtYXNrKSB7Ci0JCQlpZiAoIXMpCi0JCQkJcyA9IGttYWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IGxpc3RlbmVyKSwKLQkJCQkJCSBHRlBfS0VSTkVMLCBjcHVfdG9fbm9kZShjcHUpKTsKKwkJCXMgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBsaXN0ZW5lciksCisJCQkJCUdGUF9LRVJORUwsIGNwdV90b19ub2RlKGNwdSkpOwogCQkJaWYgKCFzKQogCQkJCWdvdG8gY2xlYW51cDsKKwogCQkJcy0+cGlkID0gcGlkOwotCQkJSU5JVF9MSVNUX0hFQUQoJnMtPmxpc3QpOwogCQkJcy0+dmFsaWQgPSAxOwogCiAJCQlsaXN0ZW5lcnMgPSAmcGVyX2NwdShsaXN0ZW5lcl9hcnJheSwgY3B1KTsKIAkJCWRvd25fd3JpdGUoJmxpc3RlbmVycy0+c2VtKTsKLQkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzMiwgdG1wLCAmbGlzdGVuZXJzLT5saXN0LCBsaXN0KSB7Ci0JCQkJaWYgKHMyLT5waWQgPT0gcGlkKQotCQkJCQlnb3RvIG5leHRfY3B1OworCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShzMiwgJmxpc3RlbmVycy0+bGlzdCwgbGlzdCkgeworCQkJCWlmIChzMi0+cGlkID09IHBpZCAmJiBzMi0+dmFsaWQpCisJCQkJCWdvdG8gZXhpc3RzOwogCQkJfQogCQkJbGlzdF9hZGQoJnMtPmxpc3QsICZsaXN0ZW5lcnMtPmxpc3QpOwogCQkJcyA9IE5VTEw7Ci1uZXh0X2NwdToKK2V4aXN0czoKIAkJCXVwX3dyaXRlKCZsaXN0ZW5lcnMtPnNlbSk7CisJCQlrZnJlZShzKTsgLyogbm9wIGlmIE5VTEwgKi8KIAkJfQotCQlrZnJlZShzKTsKIAkJcmV0dXJuIDA7CiAJfQogCmRpZmYgLS1naXQgYS9saWIvS2NvbmZpZyBiL2xpYi9LY29uZmlnCmluZGV4IDMyZjNlNWEuLjZjNjk1ZmYgMTAwNjQ0Ci0tLSBhL2xpYi9LY29uZmlnCisrKyBiL2xpYi9LY29uZmlnCkBAIC0yNzYsNCArMjc2LDcgQEAKIAkgIHNvIGl0cyBjYWxjdWxhdGlvbnMgYXJlIGluIGZpeGVkIHBvaW50LiBNb2R1bGVzIGNhbiBzZWxlY3QgdGhpcwogCSAgd2hlbiB0aGV5IHJlcXVpcmUgdGhpcyBmdW5jdGlvbi4gTW9kdWxlIHdpbGwgYmUgY2FsbGVkIGNvcmRpYy4KIAorY29uZmlnIExMSVNUCisJYm9vbAorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9saWIvTWFrZWZpbGUgYi9saWIvTWFrZWZpbGUKaW5kZXggODkyZjRlMi4uNjQ1N2FmNGEgMTAwNjQ0Ci0tLSBhL2xpYi9NYWtlZmlsZQorKysgYi9saWIvTWFrZWZpbGUKQEAgLTExNSw2ICsxMTUsOCBAQAogCiBvYmotJChDT05GSUdfQ09SRElDKSArPSBjb3JkaWMubwogCitvYmotJChDT05GSUdfTExJU1QpICs9IGxsaXN0Lm8KKwogaG9zdHByb2dzLXkJOj0gZ2VuX2NyYzMydGFibGUKIGNsZWFuLWZpbGVzCTo9IGNyYzMydGFibGUuaAogCmRpZmYgLS1naXQgYS9saWIvYml0bWFwLmMgYi9saWIvYml0bWFwLmMKaW5kZXggMzdlZjRiMC4uMmY0NDEyZSAxMDA2NDQKLS0tIGEvbGliL2JpdG1hcC5jCisrKyBiL2xpYi9iaXRtYXAuYwpAQCAtMjcxLDggKzI3MSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKF9fYml0bWFwX3dlaWdodCk7CiAKLSNkZWZpbmUgQklUTUFQX0ZJUlNUX1dPUkRfTUFTSyhzdGFydCkgKH4wVUwgPDwgKChzdGFydCkgJSBCSVRTX1BFUl9MT05HKSkKLQogdm9pZCBiaXRtYXBfc2V0KHVuc2lnbmVkIGxvbmcgKm1hcCwgaW50IHN0YXJ0LCBpbnQgbnIpCiB7CiAJdW5zaWduZWQgbG9uZyAqcCA9IG1hcCArIEJJVF9XT1JEKHN0YXJ0KTsKZGlmZiAtLWdpdCBhL2xpYi9mYXVsdC1pbmplY3QuYyBiL2xpYi9mYXVsdC1pbmplY3QuYwppbmRleCAyNTc3YjEyLi5mMTkzYjc3IDEwMDY0NAotLS0gYS9saWIvZmF1bHQtaW5qZWN0LmMKKysrIGIvbGliL2ZhdWx0LWluamVjdC5jCkBAIC0xOTcsMjEgKzE5NywxNSBAQAogCXJldHVybiBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG5hbWUsIG1vZGUsIHBhcmVudCwgdmFsdWUsICZmb3BzX2F0b21pY190KTsKIH0KIAotdm9pZCBjbGVhbnVwX2ZhdWx0X2F0dHJfZGVudHJpZXMoc3RydWN0IGZhdWx0X2F0dHIgKmF0dHIpCi17Ci0JZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGF0dHItPmRpcik7Ci19Ci0KLWludCBpbml0X2ZhdWx0X2F0dHJfZGVudHJpZXMoc3RydWN0IGZhdWx0X2F0dHIgKmF0dHIsIGNvbnN0IGNoYXIgKm5hbWUpCitzdHJ1Y3QgZGVudHJ5ICpmYXVsdF9jcmVhdGVfZGVidWdmc19hdHRyKGNvbnN0IGNoYXIgKm5hbWUsCisJCQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsIHN0cnVjdCBmYXVsdF9hdHRyICphdHRyKQogewogCW1vZGVfdCBtb2RlID0gU19JRlJFRyB8IFNfSVJVU1IgfCBTX0lXVVNSOwogCXN0cnVjdCBkZW50cnkgKmRpcjsKIAotCWRpciA9IGRlYnVnZnNfY3JlYXRlX2RpcihuYW1lLCBOVUxMKTsKKwlkaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIobmFtZSwgcGFyZW50KTsKIAlpZiAoIWRpcikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlhdHRyLT5kaXIgPSBkaXI7CisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogCiAJaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV91bCgicHJvYmFiaWxpdHkiLCBtb2RlLCBkaXIsICZhdHRyLT5wcm9iYWJpbGl0eSkpCiAJCWdvdG8gZmFpbDsKQEAgLTI0MywxMSArMjM3LDExIEBACiAKICNlbmRpZiAvKiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OX1NUQUNLVFJBQ0VfRklMVEVSICovCiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZGlyOwogZmFpbDoKLQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoYXR0ci0+ZGlyKTsKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZGlyKTsKIAotCXJldHVybiAtRU5PTUVNOworCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwogfQogCiAjZW5kaWYgLyogQ09ORklHX0ZBVUxUX0lOSkVDVElPTl9ERUJVR19GUyAqLwpkaWZmIC0tZ2l0IGEvbGliL2dlbmFsbG9jLmMgYi9saWIvZ2VuYWxsb2MuYwppbmRleCA1NzdkZGY4Li5mMzUyY2M0IDEwMDY0NAotLS0gYS9saWIvZ2VuYWxsb2MuYworKysgYi9saWIvZ2VuYWxsb2MuYwpAQCAtMSw4ICsxLDI2IEBACiAvKgotICogQmFzaWMgZ2VuZXJhbCBwdXJwb3NlIGFsbG9jYXRvciBmb3IgbWFuYWdpbmcgc3BlY2lhbCBwdXJwb3NlIG1lbW9yeQotICogbm90IG1hbmFnZWQgYnkgdGhlIHJlZ3VsYXIga21hbGxvYy9rZnJlZSBpbnRlcmZhY2UuCi0gKiBVc2VzIGZvciB0aGlzIGluY2x1ZGVzIG9uLWRldmljZSBzcGVjaWFsIG1lbW9yeSwgdW5jYWNoZWQgbWVtb3J5Ci0gKiBldGMuCisgKiBCYXNpYyBnZW5lcmFsIHB1cnBvc2UgYWxsb2NhdG9yIGZvciBtYW5hZ2luZyBzcGVjaWFsIHB1cnBvc2UKKyAqIG1lbW9yeSwgZm9yIGV4YW1wbGUsIG1lbW9yeSB0aGF0IGlzIG5vdCBtYW5hZ2VkIGJ5IHRoZSByZWd1bGFyCisgKiBrbWFsbG9jL2tmcmVlIGludGVyZmFjZS4gIFVzZXMgZm9yIHRoaXMgaW5jbHVkZXMgb24tZGV2aWNlIHNwZWNpYWwKKyAqIG1lbW9yeSwgdW5jYWNoZWQgbWVtb3J5IGV0Yy4KKyAqCisgKiBJdCBpcyBzYWZlIHRvIHVzZSB0aGUgYWxsb2NhdG9yIGluIE5NSSBoYW5kbGVycyBhbmQgb3RoZXIgc3BlY2lhbAorICogdW5ibG9ja2FibGUgY29udGV4dHMgdGhhdCBjb3VsZCBvdGhlcndpc2UgZGVhZGxvY2sgb24gbG9ja3MuICBUaGlzCisgKiBpcyBpbXBsZW1lbnRlZCBieSB1c2luZyBhdG9taWMgb3BlcmF0aW9ucyBhbmQgcmV0cmllcyBvbiBhbnkKKyAqIGNvbmZsaWN0cy4gIFRoZSBkaXNhZHZhbnRhZ2UgaXMgdGhhdCB0aGVyZSBtYXkgYmUgbGl2ZWxvY2tzIGluCisgKiBleHRyZW1lIGNhc2VzLiAgRm9yIGJldHRlciBzY2FsYWJpbGl0eSwgb25lIGFsbG9jYXRvciBjYW4gYmUgdXNlZAorICogZm9yIGVhY2ggQ1BVLgorICoKKyAqIFRoZSBsb2NrbGVzcyBvcGVyYXRpb24gb25seSB3b3JrcyBpZiB0aGVyZSBpcyBlbm91Z2ggbWVtb3J5CisgKiBhdmFpbGFibGUuICBJZiBuZXcgbWVtb3J5IGlzIGFkZGVkIHRvIHRoZSBwb29sIGEgbG9jayBoYXMgdG8gYmUKKyAqIHN0aWxsIHRha2VuLiAgU28gYW55IHVzZXIgcmVseWluZyBvbiBsb2NrbGVzc25lc3MgaGFzIHRvIGVuc3VyZQorICogdGhhdCBzdWZmaWNpZW50IG1lbW9yeSBpcyBwcmVhbGxvY2F0ZWQuCisgKgorICogVGhlIGJhc2ljIGF0b21pYyBvcGVyYXRpb24gb2YgdGhpcyBhbGxvY2F0b3IgaXMgY21weGNoZyBvbiBsb25nLgorICogT24gYXJjaGl0ZWN0dXJlcyB0aGF0IGRvbid0IGhhdmUgTk1JLXNhZmUgY21weGNoZyBpbXBsZW1lbnRhdGlvbiwKKyAqIHRoZSBhbGxvY2F0b3IgY2FuIE5PVCBiZSB1c2VkIGluIE5NSSBoYW5kbGVyLiAgU28gY29kZSB1c2VzIHRoZQorICogYWxsb2NhdG9yIGluIE5NSSBoYW5kbGVyIHNob3VsZCBkZXBlbmQgb24KKyAqIENPTkZJR19BUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRy4KICAqCiAgKiBDb3B5cmlnaHQgMjAwNSAoQykgSmVzIFNvcmVuc2VuIDxqZXNAdHJhaW5lZC1tb25rZXkub3JnPgogICoKQEAgLTEzLDggKzMxLDEwOSBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZ2VuYWxsb2MuaD4KIAorc3RhdGljIGludCBzZXRfYml0c19sbCh1bnNpZ25lZCBsb25nICphZGRyLCB1bnNpZ25lZCBsb25nIG1hc2tfdG9fc2V0KQoreworCXVuc2lnbmVkIGxvbmcgdmFsLCBudmFsOworCisJbnZhbCA9ICphZGRyOworCWRvIHsKKwkJdmFsID0gbnZhbDsKKwkJaWYgKHZhbCAmIG1hc2tfdG9fc2V0KQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJY3B1X3JlbGF4KCk7CisJfSB3aGlsZSAoKG52YWwgPSBjbXB4Y2hnKGFkZHIsIHZhbCwgdmFsIHwgbWFza190b19zZXQpKSAhPSB2YWwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2xlYXJfYml0c19sbCh1bnNpZ25lZCBsb25nICphZGRyLCB1bnNpZ25lZCBsb25nIG1hc2tfdG9fY2xlYXIpCit7CisJdW5zaWduZWQgbG9uZyB2YWwsIG52YWw7CisKKwludmFsID0gKmFkZHI7CisJZG8geworCQl2YWwgPSBudmFsOworCQlpZiAoKHZhbCAmIG1hc2tfdG9fY2xlYXIpICE9IG1hc2tfdG9fY2xlYXIpCisJCQlyZXR1cm4gLUVCVVNZOworCQljcHVfcmVsYXgoKTsKKwl9IHdoaWxlICgobnZhbCA9IGNtcHhjaGcoYWRkciwgdmFsLCB2YWwgJiB+bWFza190b19jbGVhcikpICE9IHZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIGJpdG1hcF9zZXRfbGwgLSBzZXQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYml0cyBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uCisgKiBAbWFwOiBwb2ludGVyIHRvIGEgYml0bWFwCisgKiBAc3RhcnQ6IGEgYml0IHBvc2l0aW9uIGluIEBtYXAKKyAqIEBucjogbnVtYmVyIG9mIGJpdHMgdG8gc2V0CisgKgorICogU2V0IEBuciBiaXRzIHN0YXJ0IGZyb20gQHN0YXJ0IGluIEBtYXAgbG9jay1sZXNzbHkuIFNldmVyYWwgdXNlcnMKKyAqIGNhbiBzZXQvY2xlYXIgdGhlIHNhbWUgYml0bWFwIHNpbXVsdGFuZW91c2x5IHdpdGhvdXQgbG9jay4gSWYgdHdvCisgKiB1c2VycyBzZXQgdGhlIHNhbWUgYml0LCBvbmUgdXNlciB3aWxsIHJldHVybiByZW1haW4gYml0cywgb3RoZXJ3aXNlCisgKiByZXR1cm4gMC4KKyAqLworc3RhdGljIGludCBiaXRtYXBfc2V0X2xsKHVuc2lnbmVkIGxvbmcgKm1hcCwgaW50IHN0YXJ0LCBpbnQgbnIpCit7CisJdW5zaWduZWQgbG9uZyAqcCA9IG1hcCArIEJJVF9XT1JEKHN0YXJ0KTsKKwljb25zdCBpbnQgc2l6ZSA9IHN0YXJ0ICsgbnI7CisJaW50IGJpdHNfdG9fc2V0ID0gQklUU19QRVJfTE9ORyAtIChzdGFydCAlIEJJVFNfUEVSX0xPTkcpOworCXVuc2lnbmVkIGxvbmcgbWFza190b19zZXQgPSBCSVRNQVBfRklSU1RfV09SRF9NQVNLKHN0YXJ0KTsKKworCXdoaWxlIChuciAtIGJpdHNfdG9fc2V0ID49IDApIHsKKwkJaWYgKHNldF9iaXRzX2xsKHAsIG1hc2tfdG9fc2V0KSkKKwkJCXJldHVybiBucjsKKwkJbnIgLT0gYml0c190b19zZXQ7CisJCWJpdHNfdG9fc2V0ID0gQklUU19QRVJfTE9ORzsKKwkJbWFza190b19zZXQgPSB+MFVMOworCQlwKys7CisJfQorCWlmIChucikgeworCQltYXNrX3RvX3NldCAmPSBCSVRNQVBfTEFTVF9XT1JEX01BU0soc2l6ZSk7CisJCWlmIChzZXRfYml0c19sbChwLCBtYXNrX3RvX3NldCkpCisJCQlyZXR1cm4gbnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBiaXRtYXBfY2xlYXJfbGwgLSBjbGVhciB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBiaXRzIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24KKyAqIEBtYXA6IHBvaW50ZXIgdG8gYSBiaXRtYXAKKyAqIEBzdGFydDogYSBiaXQgcG9zaXRpb24gaW4gQG1hcAorICogQG5yOiBudW1iZXIgb2YgYml0cyB0byBzZXQKKyAqCisgKiBDbGVhciBAbnIgYml0cyBzdGFydCBmcm9tIEBzdGFydCBpbiBAbWFwIGxvY2stbGVzc2x5LiBTZXZlcmFsIHVzZXJzCisgKiBjYW4gc2V0L2NsZWFyIHRoZSBzYW1lIGJpdG1hcCBzaW11bHRhbmVvdXNseSB3aXRob3V0IGxvY2suIElmIHR3bworICogdXNlcnMgY2xlYXIgdGhlIHNhbWUgYml0LCBvbmUgdXNlciB3aWxsIHJldHVybiByZW1haW4gYml0cywKKyAqIG90aGVyd2lzZSByZXR1cm4gMC4KKyAqLworc3RhdGljIGludCBiaXRtYXBfY2xlYXJfbGwodW5zaWduZWQgbG9uZyAqbWFwLCBpbnQgc3RhcnQsIGludCBucikKK3sKKwl1bnNpZ25lZCBsb25nICpwID0gbWFwICsgQklUX1dPUkQoc3RhcnQpOworCWNvbnN0IGludCBzaXplID0gc3RhcnQgKyBucjsKKwlpbnQgYml0c190b19jbGVhciA9IEJJVFNfUEVSX0xPTkcgLSAoc3RhcnQgJSBCSVRTX1BFUl9MT05HKTsKKwl1bnNpZ25lZCBsb25nIG1hc2tfdG9fY2xlYXIgPSBCSVRNQVBfRklSU1RfV09SRF9NQVNLKHN0YXJ0KTsKKworCXdoaWxlIChuciAtIGJpdHNfdG9fY2xlYXIgPj0gMCkgeworCQlpZiAoY2xlYXJfYml0c19sbChwLCBtYXNrX3RvX2NsZWFyKSkKKwkJCXJldHVybiBucjsKKwkJbnIgLT0gYml0c190b19jbGVhcjsKKwkJYml0c190b19jbGVhciA9IEJJVFNfUEVSX0xPTkc7CisJCW1hc2tfdG9fY2xlYXIgPSB+MFVMOworCQlwKys7CisJfQorCWlmIChucikgeworCQltYXNrX3RvX2NsZWFyICY9IEJJVE1BUF9MQVNUX1dPUkRfTUFTSyhzaXplKTsKKwkJaWYgKGNsZWFyX2JpdHNfbGwocCwgbWFza190b19jbGVhcikpCisJCQlyZXR1cm4gbnI7CisJfQorCisJcmV0dXJuIDA7Cit9CiAKIC8qKgogICogZ2VuX3Bvb2xfY3JlYXRlIC0gY3JlYXRlIGEgbmV3IHNwZWNpYWwgbWVtb3J5IHBvb2wKQEAgLTMwLDcgKzE0OSw3IEBACiAKIAlwb29sID0ga21hbGxvY19ub2RlKHNpemVvZihzdHJ1Y3QgZ2VuX3Bvb2wpLCBHRlBfS0VSTkVMLCBuaWQpOwogCWlmIChwb29sICE9IE5VTEwpIHsKLQkJcndsb2NrX2luaXQoJnBvb2wtPmxvY2spOworCQlzcGluX2xvY2tfaW5pdCgmcG9vbC0+bG9jayk7CiAJCUlOSVRfTElTVF9IRUFEKCZwb29sLT5jaHVua3MpOwogCQlwb29sLT5taW5fYWxsb2Nfb3JkZXIgPSBtaW5fYWxsb2Nfb3JkZXI7CiAJfQpAQCAtNjMsMTQgKzE4MiwxNCBAQAogCWlmICh1bmxpa2VseShjaHVuayA9PSBOVUxMKSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlzcGluX2xvY2tfaW5pdCgmY2h1bmstPmxvY2spOwogCWNodW5rLT5waHlzX2FkZHIgPSBwaHlzOwogCWNodW5rLT5zdGFydF9hZGRyID0gdmlydDsKIAljaHVuay0+ZW5kX2FkZHIgPSB2aXJ0ICsgc2l6ZTsKKwlhdG9taWNfc2V0KCZjaHVuay0+YXZhaWwsIHNpemUpOwogCi0Jd3JpdGVfbG9jaygmcG9vbC0+bG9jayk7Ci0JbGlzdF9hZGQoJmNodW5rLT5uZXh0X2NodW5rLCAmcG9vbC0+Y2h1bmtzKTsKLQl3cml0ZV91bmxvY2soJnBvb2wtPmxvY2spOworCXNwaW5fbG9jaygmcG9vbC0+bG9jayk7CisJbGlzdF9hZGRfcmN1KCZjaHVuay0+bmV4dF9jaHVuaywgJnBvb2wtPmNodW5rcyk7CisJc3Bpbl91bmxvY2soJnBvb2wtPmxvY2spOwogCiAJcmV0dXJuIDA7CiB9CkBAIC04NSwxOSArMjA0LDE5IEBACiAgKi8KIHBoeXNfYWRkcl90IGdlbl9wb29sX3ZpcnRfdG9fcGh5cyhzdHJ1Y3QgZ2VuX3Bvb2wgKnBvb2wsIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfY2h1bms7CiAJc3RydWN0IGdlbl9wb29sX2NodW5rICpjaHVuazsKKwlwaHlzX2FkZHJfdCBwYWRkciA9IC0xOwogCi0JcmVhZF9sb2NrKCZwb29sLT5sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKF9jaHVuaywgJnBvb2wtPmNodW5rcykgewotCQljaHVuayA9IGxpc3RfZW50cnkoX2NodW5rLCBzdHJ1Y3QgZ2VuX3Bvb2xfY2h1bmssIG5leHRfY2h1bmspOwotCi0JCWlmIChhZGRyID49IGNodW5rLT5zdGFydF9hZGRyICYmIGFkZHIgPCBjaHVuay0+ZW5kX2FkZHIpCi0JCQlyZXR1cm4gY2h1bmstPnBoeXNfYWRkciArIGFkZHIgLSBjaHVuay0+c3RhcnRfYWRkcjsKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY2h1bmssICZwb29sLT5jaHVua3MsIG5leHRfY2h1bmspIHsKKwkJaWYgKGFkZHIgPj0gY2h1bmstPnN0YXJ0X2FkZHIgJiYgYWRkciA8IGNodW5rLT5lbmRfYWRkcikgeworCQkJcGFkZHIgPSBjaHVuay0+cGh5c19hZGRyICsgKGFkZHIgLSBjaHVuay0+c3RhcnRfYWRkcik7CisJCQlicmVhazsKKwkJfQogCX0KLQlyZWFkX3VubG9jaygmcG9vbC0+bG9jayk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQlyZXR1cm4gLTE7CisJcmV0dXJuIHBhZGRyOwogfQogRVhQT1JUX1NZTUJPTChnZW5fcG9vbF92aXJ0X3RvX3BoeXMpOwogCkBAIC0xMTUsNyArMjM0LDYgQEAKIAlpbnQgb3JkZXIgPSBwb29sLT5taW5fYWxsb2Nfb3JkZXI7CiAJaW50IGJpdCwgZW5kX2JpdDsKIAotCiAJbGlzdF9mb3JfZWFjaF9zYWZlKF9jaHVuaywgX25leHRfY2h1bmssICZwb29sLT5jaHVua3MpIHsKIAkJY2h1bmsgPSBsaXN0X2VudHJ5KF9jaHVuaywgc3RydWN0IGdlbl9wb29sX2NodW5rLCBuZXh0X2NodW5rKTsKIAkJbGlzdF9kZWwoJmNodW5rLT5uZXh0X2NodW5rKTsKQEAgLTEzNyw0NCArMjU1LDUwIEBACiAgKiBAc2l6ZTogbnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlIGZyb20gdGhlIHBvb2wKICAqCiAgKiBBbGxvY2F0ZSB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBzcGVjaWZpZWQgcG9vbC4KLSAqIFVzZXMgYSBmaXJzdC1maXQgYWxnb3JpdGhtLgorICogVXNlcyBhIGZpcnN0LWZpdCBhbGdvcml0aG0uIENhbiBub3QgYmUgdXNlZCBpbiBOTUkgaGFuZGxlciBvbgorICogYXJjaGl0ZWN0dXJlcyB3aXRob3V0IE5NSS1zYWZlIGNtcHhjaGcgaW1wbGVtZW50YXRpb24uCiAgKi8KIHVuc2lnbmVkIGxvbmcgZ2VuX3Bvb2xfYWxsb2Moc3RydWN0IGdlbl9wb29sICpwb29sLCBzaXplX3Qgc2l6ZSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfY2h1bms7CiAJc3RydWN0IGdlbl9wb29sX2NodW5rICpjaHVuazsKLQl1bnNpZ25lZCBsb25nIGFkZHIsIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgYWRkciA9IDA7CiAJaW50IG9yZGVyID0gcG9vbC0+bWluX2FsbG9jX29yZGVyOwotCWludCBuYml0cywgc3RhcnRfYml0LCBlbmRfYml0OworCWludCBuYml0cywgc3RhcnRfYml0ID0gMCwgZW5kX2JpdCwgcmVtYWluOworCisjaWZuZGVmIENPTkZJR19BUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRworCUJVR19PTihpbl9ubWkoKSk7CisjZW5kaWYKIAogCWlmIChzaXplID09IDApCiAJCXJldHVybiAwOwogCiAJbmJpdHMgPSAoc2l6ZSArICgxVUwgPDwgb3JkZXIpIC0gMSkgPj4gb3JkZXI7Ci0KLQlyZWFkX2xvY2soJnBvb2wtPmxvY2spOwotCWxpc3RfZm9yX2VhY2goX2NodW5rLCAmcG9vbC0+Y2h1bmtzKSB7Ci0JCWNodW5rID0gbGlzdF9lbnRyeShfY2h1bmssIHN0cnVjdCBnZW5fcG9vbF9jaHVuaywgbmV4dF9jaHVuayk7CisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGNodW5rLCAmcG9vbC0+Y2h1bmtzLCBuZXh0X2NodW5rKSB7CisJCWlmIChzaXplID4gYXRvbWljX3JlYWQoJmNodW5rLT5hdmFpbCkpCisJCQljb250aW51ZTsKIAogCQllbmRfYml0ID0gKGNodW5rLT5lbmRfYWRkciAtIGNodW5rLT5zdGFydF9hZGRyKSA+PiBvcmRlcjsKLQotCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2h1bmstPmxvY2ssIGZsYWdzKTsKLQkJc3RhcnRfYml0ID0gYml0bWFwX2ZpbmRfbmV4dF96ZXJvX2FyZWEoY2h1bmstPmJpdHMsIGVuZF9iaXQsIDAsCi0JCQkJCQluYml0cywgMCk7Ci0JCWlmIChzdGFydF9iaXQgPj0gZW5kX2JpdCkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2h1bmstPmxvY2ssIGZsYWdzKTsKK3JldHJ5OgorCQlzdGFydF9iaXQgPSBiaXRtYXBfZmluZF9uZXh0X3plcm9fYXJlYShjaHVuay0+Yml0cywgZW5kX2JpdCwKKwkJCQkJCSAgICAgICBzdGFydF9iaXQsIG5iaXRzLCAwKTsKKwkJaWYgKHN0YXJ0X2JpdCA+PSBlbmRfYml0KQogCQkJY29udGludWU7CisJCXJlbWFpbiA9IGJpdG1hcF9zZXRfbGwoY2h1bmstPmJpdHMsIHN0YXJ0X2JpdCwgbmJpdHMpOworCQlpZiAocmVtYWluKSB7CisJCQlyZW1haW4gPSBiaXRtYXBfY2xlYXJfbGwoY2h1bmstPmJpdHMsIHN0YXJ0X2JpdCwKKwkJCQkJCSBuYml0cyAtIHJlbWFpbik7CisJCQlCVUdfT04ocmVtYWluKTsKKwkJCWdvdG8gcmV0cnk7CiAJCX0KIAogCQlhZGRyID0gY2h1bmstPnN0YXJ0X2FkZHIgKyAoKHVuc2lnbmVkIGxvbmcpc3RhcnRfYml0IDw8IG9yZGVyKTsKLQotCQliaXRtYXBfc2V0KGNodW5rLT5iaXRzLCBzdGFydF9iaXQsIG5iaXRzKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2h1bmstPmxvY2ssIGZsYWdzKTsKLQkJcmVhZF91bmxvY2soJnBvb2wtPmxvY2spOwotCQlyZXR1cm4gYWRkcjsKKwkJc2l6ZSA9IG5iaXRzIDw8IG9yZGVyOworCQlhdG9taWNfc3ViKHNpemUsICZjaHVuay0+YXZhaWwpOworCQlicmVhazsKIAl9Ci0JcmVhZF91bmxvY2soJnBvb2wtPmxvY2spOwotCXJldHVybiAwOworCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiBhZGRyOwogfQogRVhQT1JUX1NZTUJPTChnZW5fcG9vbF9hbGxvYyk7CiAKQEAgLTE4NCwzMyArMzA4LDk1IEBACiAgKiBAYWRkcjogc3RhcnRpbmcgYWRkcmVzcyBvZiBtZW1vcnkgdG8gZnJlZSBiYWNrIHRvIHBvb2wKICAqIEBzaXplOiBzaXplIGluIGJ5dGVzIG9mIG1lbW9yeSB0byBmcmVlCiAgKgotICogRnJlZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBzcGVjaWFsIG1lbW9yeSBiYWNrIHRvIHRoZSBzcGVjaWZpZWQgcG9vbC4KKyAqIEZyZWUgcHJldmlvdXNseSBhbGxvY2F0ZWQgc3BlY2lhbCBtZW1vcnkgYmFjayB0byB0aGUgc3BlY2lmaWVkCisgKiBwb29sLiAgQ2FuIG5vdCBiZSB1c2VkIGluIE5NSSBoYW5kbGVyIG9uIGFyY2hpdGVjdHVyZXMgd2l0aG91dAorICogTk1JLXNhZmUgY21weGNoZyBpbXBsZW1lbnRhdGlvbi4KICAqLwogdm9pZCBnZW5fcG9vbF9mcmVlKHN0cnVjdCBnZW5fcG9vbCAqcG9vbCwgdW5zaWduZWQgbG9uZyBhZGRyLCBzaXplX3Qgc2l6ZSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpfY2h1bms7CiAJc3RydWN0IGdlbl9wb29sX2NodW5rICpjaHVuazsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBvcmRlciA9IHBvb2wtPm1pbl9hbGxvY19vcmRlcjsKLQlpbnQgYml0LCBuYml0czsKKwlpbnQgc3RhcnRfYml0LCBuYml0cywgcmVtYWluOworCisjaWZuZGVmIENPTkZJR19BUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRworCUJVR19PTihpbl9ubWkoKSk7CisjZW5kaWYKIAogCW5iaXRzID0gKHNpemUgKyAoMVVMIDw8IG9yZGVyKSAtIDEpID4+IG9yZGVyOwotCi0JcmVhZF9sb2NrKCZwb29sLT5sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKF9jaHVuaywgJnBvb2wtPmNodW5rcykgewotCQljaHVuayA9IGxpc3RfZW50cnkoX2NodW5rLCBzdHJ1Y3QgZ2VuX3Bvb2xfY2h1bmssIG5leHRfY2h1bmspOwotCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGNodW5rLCAmcG9vbC0+Y2h1bmtzLCBuZXh0X2NodW5rKSB7CiAJCWlmIChhZGRyID49IGNodW5rLT5zdGFydF9hZGRyICYmIGFkZHIgPCBjaHVuay0+ZW5kX2FkZHIpIHsKIAkJCUJVR19PTihhZGRyICsgc2l6ZSA+IGNodW5rLT5lbmRfYWRkcik7Ci0JCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2h1bmstPmxvY2ssIGZsYWdzKTsKLQkJCWJpdCA9IChhZGRyIC0gY2h1bmstPnN0YXJ0X2FkZHIpID4+IG9yZGVyOwotCQkJd2hpbGUgKG5iaXRzLS0pCi0JCQkJX19jbGVhcl9iaXQoYml0KyssIGNodW5rLT5iaXRzKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNodW5rLT5sb2NrLCBmbGFncyk7Ci0JCQlicmVhazsKKwkJCXN0YXJ0X2JpdCA9IChhZGRyIC0gY2h1bmstPnN0YXJ0X2FkZHIpID4+IG9yZGVyOworCQkJcmVtYWluID0gYml0bWFwX2NsZWFyX2xsKGNodW5rLT5iaXRzLCBzdGFydF9iaXQsIG5iaXRzKTsKKwkJCUJVR19PTihyZW1haW4pOworCQkJc2l6ZSA9IG5iaXRzIDw8IG9yZGVyOworCQkJYXRvbWljX2FkZChzaXplLCAmY2h1bmstPmF2YWlsKTsKKwkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJcmV0dXJuOwogCQl9CiAJfQotCUJVR19PTihuYml0cyA+IDApOwotCXJlYWRfdW5sb2NrKCZwb29sLT5sb2NrKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlCVUcoKTsKIH0KIEVYUE9SVF9TWU1CT0woZ2VuX3Bvb2xfZnJlZSk7CisKKy8qKgorICogZ2VuX3Bvb2xfZm9yX2VhY2hfY2h1bmsgLSBjYWxsIGZ1bmMgZm9yIGV2ZXJ5IGNodW5rIG9mIGdlbmVyaWMgbWVtb3J5IHBvb2wKKyAqIEBwb29sOgl0aGUgZ2VuZXJpYyBtZW1vcnkgcG9vbAorICogQGZ1bmM6CWZ1bmMgdG8gY2FsbAorICogQGRhdGE6CWFkZGl0aW9uYWwgZGF0YSB1c2VkIGJ5IEBmdW5jCisgKgorICogQ2FsbCBAZnVuYyBmb3IgZXZlcnkgY2h1bmsgb2YgZ2VuZXJpYyBtZW1vcnkgcG9vbC4gIFRoZSBAZnVuYyBpcworICogY2FsbGVkIHdpdGggcmN1X3JlYWRfbG9jayBoZWxkLgorICovCit2b2lkIGdlbl9wb29sX2Zvcl9lYWNoX2NodW5rKHN0cnVjdCBnZW5fcG9vbCAqcG9vbCwKKwl2b2lkICgqZnVuYykoc3RydWN0IGdlbl9wb29sICpwb29sLCBzdHJ1Y3QgZ2VuX3Bvb2xfY2h1bmsgKmNodW5rLCB2b2lkICpkYXRhKSwKKwl2b2lkICpkYXRhKQoreworCXN0cnVjdCBnZW5fcG9vbF9jaHVuayAqY2h1bms7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY2h1bmssICYocG9vbCktPmNodW5rcywgbmV4dF9jaHVuaykKKwkJZnVuYyhwb29sLCBjaHVuaywgZGF0YSk7CisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CitFWFBPUlRfU1lNQk9MKGdlbl9wb29sX2Zvcl9lYWNoX2NodW5rKTsKKworLyoqCisgKiBnZW5fcG9vbF9hdmFpbCAtIGdldCBhdmFpbGFibGUgZnJlZSBzcGFjZSBvZiB0aGUgcG9vbAorICogQHBvb2w6IHBvb2wgdG8gZ2V0IGF2YWlsYWJsZSBmcmVlIHNwYWNlCisgKgorICogUmV0dXJuIGF2YWlsYWJsZSBmcmVlIHNwYWNlIG9mIHRoZSBzcGVjaWZpZWQgcG9vbC4KKyAqLworc2l6ZV90IGdlbl9wb29sX2F2YWlsKHN0cnVjdCBnZW5fcG9vbCAqcG9vbCkKK3sKKwlzdHJ1Y3QgZ2VuX3Bvb2xfY2h1bmsgKmNodW5rOworCXNpemVfdCBhdmFpbCA9IDA7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY2h1bmssICZwb29sLT5jaHVua3MsIG5leHRfY2h1bmspCisJCWF2YWlsICs9IGF0b21pY19yZWFkKCZjaHVuay0+YXZhaWwpOworCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiBhdmFpbDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdlbl9wb29sX2F2YWlsKTsKKworLyoqCisgKiBnZW5fcG9vbF9zaXplIC0gZ2V0IHNpemUgaW4gYnl0ZXMgb2YgbWVtb3J5IG1hbmFnZWQgYnkgdGhlIHBvb2wKKyAqIEBwb29sOiBwb29sIHRvIGdldCBzaXplCisgKgorICogUmV0dXJuIHNpemUgaW4gYnl0ZXMgb2YgbWVtb3J5IG1hbmFnZWQgYnkgdGhlIHBvb2wuCisgKi8KK3NpemVfdCBnZW5fcG9vbF9zaXplKHN0cnVjdCBnZW5fcG9vbCAqcG9vbCkKK3sKKwlzdHJ1Y3QgZ2VuX3Bvb2xfY2h1bmsgKmNodW5rOworCXNpemVfdCBzaXplID0gMDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjaHVuaywgJnBvb2wtPmNodW5rcywgbmV4dF9jaHVuaykKKwkJc2l6ZSArPSBjaHVuay0+ZW5kX2FkZHIgLSBjaHVuay0+c3RhcnRfYWRkcjsKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gc2l6ZTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGdlbl9wb29sX3NpemUpOwpkaWZmIC0tZ2l0IGEvbGliL2lkci5jIGIvbGliL2lkci5jCmluZGV4IGUxNTUwMmUuLmRiMDQwY2UgMTAwNjQ0Ci0tLSBhL2xpYi9pZHIuYworKysgYi9saWIvaWRyLmMKQEAgLTM0LDggKzM0LDEwIEBACiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaWRyLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KIAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICppZHJfbGF5ZXJfY2FjaGU7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHNpbXBsZV9pZGFfbG9jayk7CiAKIHN0YXRpYyBzdHJ1Y3QgaWRyX2xheWVyICpnZXRfZnJvbV9mcmVlX2xpc3Qoc3RydWN0IGlkciAqaWRwKQogewpAQCAtOTI2LDYgKzkyOCw3MSBAQAogRVhQT1JUX1NZTUJPTChpZGFfZGVzdHJveSk7CiAKIC8qKgorICogaWRhX3NpbXBsZV9nZXQgLSBnZXQgYSBuZXcgaWQuCisgKiBAaWRhOiB0aGUgKGluaXRpYWxpemVkKSBpZGEuCisgKiBAc3RhcnQ6IHRoZSBtaW5pbXVtIGlkIChpbmNsdXNpdmUsIDwgMHg4MDAwMDAwKQorICogQGVuZDogdGhlIG1heGltdW0gaWQgKGV4Y2x1c2l2ZSwgPCAweDgwMDAwMDAgb3IgMCkKKyAqIEBnZnBfbWFzazogbWVtb3J5IGFsbG9jYXRpb24gZmxhZ3MKKyAqCisgKiBBbGxvY2F0ZXMgYW4gaWQgaW4gdGhlIHJhbmdlIHN0YXJ0IDw9IGlkIDwgZW5kLCBvciByZXR1cm5zIC1FTk9TUEMuCisgKiBPbiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLCByZXR1cm5zIC1FTk9NRU0uCisgKgorICogVXNlIGlkYV9zaW1wbGVfcmVtb3ZlKCkgdG8gZ2V0IHJpZCBvZiBhbiBpZC4KKyAqLworaW50IGlkYV9zaW1wbGVfZ2V0KHN0cnVjdCBpZGEgKmlkYSwgdW5zaWduZWQgaW50IHN0YXJ0LCB1bnNpZ25lZCBpbnQgZW5kLAorCQkgICBnZnBfdCBnZnBfbWFzaykKK3sKKwlpbnQgcmV0LCBpZDsKKwl1bnNpZ25lZCBpbnQgbWF4OworCisJQlVHX09OKChpbnQpc3RhcnQgPCAwKTsKKwlCVUdfT04oKGludCllbmQgPCAwKTsKKworCWlmIChlbmQgPT0gMCkKKwkJbWF4ID0gMHg4MDAwMDAwMDsKKwllbHNlIHsKKwkJQlVHX09OKGVuZCA8IHN0YXJ0KTsKKwkJbWF4ID0gZW5kIC0gMTsKKwl9CisKK2FnYWluOgorCWlmICghaWRhX3ByZV9nZXQoaWRhLCBnZnBfbWFzaykpCisJCXJldHVybiAtRU5PTUVNOworCisJc3Bpbl9sb2NrKCZzaW1wbGVfaWRhX2xvY2spOworCXJldCA9IGlkYV9nZXRfbmV3X2Fib3ZlKGlkYSwgc3RhcnQsICZpZCk7CisJaWYgKCFyZXQpIHsKKwkJaWYgKGlkID4gbWF4KSB7CisJCQlpZGFfcmVtb3ZlKGlkYSwgaWQpOworCQkJcmV0ID0gLUVOT1NQQzsKKwkJfSBlbHNlIHsKKwkJCXJldCA9IGlkOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZzaW1wbGVfaWRhX2xvY2spOworCisJaWYgKHVubGlrZWx5KHJldCA9PSAtRUFHQUlOKSkKKwkJZ290byBhZ2FpbjsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGlkYV9zaW1wbGVfZ2V0KTsKKworLyoqCisgKiBpZGFfc2ltcGxlX3JlbW92ZSAtIHJlbW92ZSBhbiBhbGxvY2F0ZWQgaWQuCisgKiBAaWRhOiB0aGUgKGluaXRpYWxpemVkKSBpZGEuCisgKiBAaWQ6IHRoZSBpZCByZXR1cm5lZCBieSBpZGFfc2ltcGxlX2dldC4KKyAqLwordm9pZCBpZGFfc2ltcGxlX3JlbW92ZShzdHJ1Y3QgaWRhICppZGEsIHVuc2lnbmVkIGludCBpZCkKK3sKKwlCVUdfT04oKGludClpZCA8IDApOworCXNwaW5fbG9jaygmc2ltcGxlX2lkYV9sb2NrKTsKKwlpZGFfcmVtb3ZlKGlkYSwgaWQpOworCXNwaW5fdW5sb2NrKCZzaW1wbGVfaWRhX2xvY2spOworfQorRVhQT1JUX1NZTUJPTChpZGFfc2ltcGxlX3JlbW92ZSk7CisKKy8qKgogICogaWRhX2luaXQgLSBpbml0aWFsaXplIGlkYSBoYW5kbGUKICAqIEBpZGE6CWlkYSBoYW5kbGUKICAqCmRpZmYgLS1naXQgYS9saWIvbGxpc3QuYyBiL2xpYi9sbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNDQ1NzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbGxpc3QuYwpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIExvY2stbGVzcyBOVUxMIHRlcm1pbmF0ZWQgc2luZ2xlIGxpbmtlZCBsaXN0CisgKgorICogVGhlIGJhc2ljIGF0b21pYyBvcGVyYXRpb24gb2YgdGhpcyBsaXN0IGlzIGNtcHhjaGcgb24gbG9uZy4gIE9uCisgKiBhcmNoaXRlY3R1cmVzIHRoYXQgZG9uJ3QgaGF2ZSBOTUktc2FmZSBjbXB4Y2hnIGltcGxlbWVudGF0aW9uLCB0aGUKKyAqIGxpc3QgY2FuIE5PVCBiZSB1c2VkIGluIE5NSSBoYW5kbGVyLiAgU28gY29kZSB1c2VzIHRoZSBsaXN0IGluIE5NSQorICogaGFuZGxlciBzaG91bGQgZGVwZW5kIG9uIENPTkZJR19BUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRy4KKyAqCisgKiBDb3B5cmlnaHQgMjAxMCwyMDExIEludGVsIENvcnAuCisgKiAgIEF1dGhvcjogSHVhbmcgWWluZyA8eWluZy5odWFuZ0BpbnRlbC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbgorICogMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbGxpc3QuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworLyoqCisgKiBsbGlzdF9hZGQgLSBhZGQgYSBuZXcgZW50cnkKKyAqIEBuZXc6CW5ldyBlbnRyeSB0byBiZSBhZGRlZAorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxvY2stbGVzcyBsaXN0CisgKi8KK3ZvaWQgbGxpc3RfYWRkKHN0cnVjdCBsbGlzdF9ub2RlICpuZXcsIHN0cnVjdCBsbGlzdF9oZWFkICpoZWFkKQoreworCXN0cnVjdCBsbGlzdF9ub2RlICplbnRyeSwgKm9sZF9lbnRyeTsKKworI2lmbmRlZiBDT05GSUdfQVJDSF9IQVZFX05NSV9TQUZFX0NNUFhDSEcKKwlCVUdfT04oaW5fbm1pKCkpOworI2VuZGlmCisKKwllbnRyeSA9IGhlYWQtPmZpcnN0OworCWRvIHsKKwkJb2xkX2VudHJ5ID0gZW50cnk7CisJCW5ldy0+bmV4dCA9IGVudHJ5OworCQljcHVfcmVsYXgoKTsKKwl9IHdoaWxlICgoZW50cnkgPSBjbXB4Y2hnKCZoZWFkLT5maXJzdCwgb2xkX2VudHJ5LCBuZXcpKSAhPSBvbGRfZW50cnkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobGxpc3RfYWRkKTsKKworLyoqCisgKiBsbGlzdF9hZGRfYmF0Y2ggLSBhZGQgc2V2ZXJhbCBsaW5rZWQgZW50cmllcyBpbiBiYXRjaAorICogQG5ld19maXJzdDoJZmlyc3QgZW50cnkgaW4gYmF0Y2ggdG8gYmUgYWRkZWQKKyAqIEBuZXdfbGFzdDoJbGFzdCBlbnRyeSBpbiBiYXRjaCB0byBiZSBhZGRlZAorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxvY2stbGVzcyBsaXN0CisgKi8KK3ZvaWQgbGxpc3RfYWRkX2JhdGNoKHN0cnVjdCBsbGlzdF9ub2RlICpuZXdfZmlyc3QsIHN0cnVjdCBsbGlzdF9ub2RlICpuZXdfbGFzdCwKKwkJICAgICBzdHJ1Y3QgbGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgbGxpc3Rfbm9kZSAqZW50cnksICpvbGRfZW50cnk7CisKKyNpZm5kZWYgQ09ORklHX0FSQ0hfSEFWRV9OTUlfU0FGRV9DTVBYQ0hHCisJQlVHX09OKGluX25taSgpKTsKKyNlbmRpZgorCisJZW50cnkgPSBoZWFkLT5maXJzdDsKKwlkbyB7CisJCW9sZF9lbnRyeSA9IGVudHJ5OworCQluZXdfbGFzdC0+bmV4dCA9IGVudHJ5OworCQljcHVfcmVsYXgoKTsKKwl9IHdoaWxlICgoZW50cnkgPSBjbXB4Y2hnKCZoZWFkLT5maXJzdCwgb2xkX2VudHJ5LCBuZXdfZmlyc3QpKSAhPSBvbGRfZW50cnkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobGxpc3RfYWRkX2JhdGNoKTsKKworLyoqCisgKiBsbGlzdF9kZWxfZmlyc3QgLSBkZWxldGUgdGhlIGZpcnN0IGVudHJ5IG9mIGxvY2stbGVzcyBsaXN0CisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbG9jay1sZXNzIGxpc3QKKyAqCisgKiBJZiBsaXN0IGlzIGVtcHR5LCByZXR1cm4gTlVMTCwgb3RoZXJ3aXNlLCByZXR1cm4gdGhlIGZpcnN0IGVudHJ5CisgKiBkZWxldGVkLCB0aGlzIGlzIHRoZSBuZXdlc3QgYWRkZWQgb25lLgorICoKKyAqIE9ubHkgb25lIGxsaXN0X2RlbF9maXJzdCB1c2VyIGNhbiBiZSB1c2VkIHNpbXVsdGFuZW91c2x5IHdpdGgKKyAqIG11bHRpcGxlIGxsaXN0X2FkZCB1c2VycyB3aXRob3V0IGxvY2suICBCZWNhdXNlIG90aGVyd2lzZQorICogbGxpc3RfZGVsX2ZpcnN0LCBsbGlzdF9hZGQsIGxsaXN0X2FkZCAob3IgbGxpc3RfZGVsX2FsbCwgbGxpc3RfYWRkLAorICogbGxpc3RfYWRkKSBzZXF1ZW5jZSBpbiBhbm90aGVyIHVzZXIgbWF5IGNoYW5nZSBAaGVhZC0+Zmlyc3QtPm5leHQsCisgKiBidXQga2VlcCBAaGVhZC0+Zmlyc3QuICBJZiBtdWx0aXBsZSBjb25zdW1lcnMgYXJlIG5lZWRlZCwgcGxlYXNlCisgKiB1c2UgbGxpc3RfZGVsX2FsbCBvciB1c2UgbG9jayBiZXR3ZWVuIGNvbnN1bWVycy4KKyAqLworc3RydWN0IGxsaXN0X25vZGUgKmxsaXN0X2RlbF9maXJzdChzdHJ1Y3QgbGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgbGxpc3Rfbm9kZSAqZW50cnksICpvbGRfZW50cnksICpuZXh0OworCisjaWZuZGVmIENPTkZJR19BUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRworCUJVR19PTihpbl9ubWkoKSk7CisjZW5kaWYKKworCWVudHJ5ID0gaGVhZC0+Zmlyc3Q7CisJZG8geworCQlpZiAoZW50cnkgPT0gTlVMTCkKKwkJCXJldHVybiBOVUxMOworCQlvbGRfZW50cnkgPSBlbnRyeTsKKwkJbmV4dCA9IGVudHJ5LT5uZXh0OworCQljcHVfcmVsYXgoKTsKKwl9IHdoaWxlICgoZW50cnkgPSBjbXB4Y2hnKCZoZWFkLT5maXJzdCwgb2xkX2VudHJ5LCBuZXh0KSkgIT0gb2xkX2VudHJ5KTsKKworCXJldHVybiBlbnRyeTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGxsaXN0X2RlbF9maXJzdCk7CisKKy8qKgorICogbGxpc3RfZGVsX2FsbCAtIGRlbGV0ZSBhbGwgZW50cmllcyBmcm9tIGxvY2stbGVzcyBsaXN0CisgKiBAaGVhZDoJdGhlIGhlYWQgb2YgbG9jay1sZXNzIGxpc3QgdG8gZGVsZXRlIGFsbCBlbnRyaWVzCisgKgorICogSWYgbGlzdCBpcyBlbXB0eSwgcmV0dXJuIE5VTEwsIG90aGVyd2lzZSwgZGVsZXRlIGFsbCBlbnRyaWVzIGFuZAorICogcmV0dXJuIHRoZSBwb2ludGVyIHRvIHRoZSBmaXJzdCBlbnRyeS4gIFRoZSBvcmRlciBvZiBlbnRyaWVzCisgKiBkZWxldGVkIGlzIGZyb20gdGhlIG5ld2VzdCB0byB0aGUgb2xkZXN0IGFkZGVkIG9uZS4KKyAqLworc3RydWN0IGxsaXN0X25vZGUgKmxsaXN0X2RlbF9hbGwoc3RydWN0IGxsaXN0X2hlYWQgKmhlYWQpCit7CisjaWZuZGVmIENPTkZJR19BUkNIX0hBVkVfTk1JX1NBRkVfQ01QWENIRworCUJVR19PTihpbl9ubWkoKSk7CisjZW5kaWYKKworCXJldHVybiB4Y2hnKCZoZWFkLT5maXJzdCwgTlVMTCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChsbGlzdF9kZWxfYWxsKTsKZGlmZiAtLWdpdCBhL2xpYi9yYWRpeC10cmVlLmMgYi9saWIvcmFkaXgtdHJlZS5jCmluZGV4IDdlYTJlMDMuLmEyZjlkYTUgMTAwNjQ0Ci0tLSBhL2xpYi9yYWRpeC10cmVlLmMKKysrIGIvbGliL3JhZGl4LXRyZWUuYwpAQCAtODIzLDggKzgyMyw4IEBACiBFWFBPUlRfU1lNQk9MKHJhZGl4X3RyZWVfcHJldl9ob2xlKTsKIAogc3RhdGljIHVuc2lnbmVkIGludAotX19sb29rdXAoc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqc2xvdCwgdm9pZCAqKipyZXN1bHRzLCB1bnNpZ25lZCBsb25nIGluZGV4LAotCXVuc2lnbmVkIGludCBtYXhfaXRlbXMsIHVuc2lnbmVkIGxvbmcgKm5leHRfaW5kZXgpCitfX2xvb2t1cChzdHJ1Y3QgcmFkaXhfdHJlZV9ub2RlICpzbG90LCB2b2lkICoqKnJlc3VsdHMsIHVuc2lnbmVkIGxvbmcgKmluZGljZXMsCisJdW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgaW50IG1heF9pdGVtcywgdW5zaWduZWQgbG9uZyAqbmV4dF9pbmRleCkKIHsKIAl1bnNpZ25lZCBpbnQgbnJfZm91bmQgPSAwOwogCXVuc2lnbmVkIGludCBzaGlmdCwgaGVpZ2h0OwpAQCAtODU3LDEyICs4NTcsMTYgQEAKIAogCS8qIEJvdHRvbSBsZXZlbDogZ3JhYiBzb21lIGl0ZW1zICovCiAJZm9yIChpID0gaW5kZXggJiBSQURJWF9UUkVFX01BUF9NQVNLOyBpIDwgUkFESVhfVFJFRV9NQVBfU0laRTsgaSsrKSB7Ci0JCWluZGV4Kys7CiAJCWlmIChzbG90LT5zbG90c1tpXSkgewotCQkJcmVzdWx0c1tucl9mb3VuZCsrXSA9ICYoc2xvdC0+c2xvdHNbaV0pOwotCQkJaWYgKG5yX2ZvdW5kID09IG1heF9pdGVtcykKKwkJCXJlc3VsdHNbbnJfZm91bmRdID0gJihzbG90LT5zbG90c1tpXSk7CisJCQlpZiAoaW5kaWNlcykKKwkJCQlpbmRpY2VzW25yX2ZvdW5kXSA9IGluZGV4OworCQkJaWYgKCsrbnJfZm91bmQgPT0gbWF4X2l0ZW1zKSB7CisJCQkJaW5kZXgrKzsKIAkJCQlnb3RvIG91dDsKKwkJCX0KIAkJfQorCQlpbmRleCsrOwogCX0KIG91dDoKIAkqbmV4dF9pbmRleCA9IGluZGV4OwpAQCAtOTE4LDggKzkyMiw4IEBACiAKIAkJaWYgKGN1cl9pbmRleCA+IG1heF9pbmRleCkKIAkJCWJyZWFrOwotCQlzbG90c19mb3VuZCA9IF9fbG9va3VwKG5vZGUsICh2b2lkICoqKilyZXN1bHRzICsgcmV0LCBjdXJfaW5kZXgsCi0JCQkJCW1heF9pdGVtcyAtIHJldCwgJm5leHRfaW5kZXgpOworCQlzbG90c19mb3VuZCA9IF9fbG9va3VwKG5vZGUsICh2b2lkICoqKilyZXN1bHRzICsgcmV0LCBOVUxMLAorCQkJCWN1cl9pbmRleCwgbWF4X2l0ZW1zIC0gcmV0LCAmbmV4dF9pbmRleCk7CiAJCW5yX2ZvdW5kID0gMDsKIAkJZm9yIChpID0gMDsgaSA8IHNsb3RzX2ZvdW5kOyBpKyspIHsKIAkJCXN0cnVjdCByYWRpeF90cmVlX25vZGUgKnNsb3Q7CkBAIC05NDQsNiArOTQ4LDcgQEAKICAqCXJhZGl4X3RyZWVfZ2FuZ19sb29rdXBfc2xvdCAtIHBlcmZvcm0gbXVsdGlwbGUgc2xvdCBsb29rdXAgb24gcmFkaXggdHJlZQogICoJQHJvb3Q6CQlyYWRpeCB0cmVlIHJvb3QKICAqCUByZXN1bHRzOgl3aGVyZSB0aGUgcmVzdWx0cyBvZiB0aGUgbG9va3VwIGFyZSBwbGFjZWQKKyAqCUBpbmRpY2VzOgl3aGVyZSB0aGVpciBpbmRpY2VzIHNob3VsZCBiZSBwbGFjZWQgKGJ1dCB1c3VhbGx5IE5VTEwpCiAgKglAZmlyc3RfaW5kZXg6CXN0YXJ0IHRoZSBsb29rdXAgZnJvbSB0aGlzIGtleQogICoJQG1heF9pdGVtczoJcGxhY2UgdXAgdG8gdGhpcyBtYW55IGl0ZW1zIGF0ICpyZXN1bHRzCiAgKgpAQCAtOTU4LDcgKzk2Myw4IEBACiAgKglwcm90ZWN0aW9uLCByYWRpeF90cmVlX2RlcmVmX3Nsb3QgbWF5IGZhaWwgcmVxdWlyaW5nIGEgcmV0cnkuCiAgKi8KIHVuc2lnbmVkIGludAotcmFkaXhfdHJlZV9nYW5nX2xvb2t1cF9zbG90KHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsIHZvaWQgKioqcmVzdWx0cywKK3JhZGl4X3RyZWVfZ2FuZ19sb29rdXBfc2xvdChzdHJ1Y3QgcmFkaXhfdHJlZV9yb290ICpyb290LAorCQkJdm9pZCAqKipyZXN1bHRzLCB1bnNpZ25lZCBsb25nICppbmRpY2VzLAogCQkJdW5zaWduZWQgbG9uZyBmaXJzdF9pbmRleCwgdW5zaWduZWQgaW50IG1heF9pdGVtcykKIHsKIAl1bnNpZ25lZCBsb25nIG1heF9pbmRleDsKQEAgLTk3NCw2ICs5ODAsOCBAQAogCQlpZiAoZmlyc3RfaW5kZXggPiAwKQogCQkJcmV0dXJuIDA7CiAJCXJlc3VsdHNbMF0gPSAodm9pZCAqKikmcm9vdC0+cm5vZGU7CisJCWlmIChpbmRpY2VzKQorCQkJaW5kaWNlc1swXSA9IDA7CiAJCXJldHVybiAxOwogCX0KIAlub2RlID0gaW5kaXJlY3RfdG9fcHRyKG5vZGUpOwpAQCAtOTg3LDggKzk5NSw5IEBACiAKIAkJaWYgKGN1cl9pbmRleCA+IG1heF9pbmRleCkKIAkJCWJyZWFrOwotCQlzbG90c19mb3VuZCA9IF9fbG9va3VwKG5vZGUsIHJlc3VsdHMgKyByZXQsIGN1cl9pbmRleCwKLQkJCQkJbWF4X2l0ZW1zIC0gcmV0LCAmbmV4dF9pbmRleCk7CisJCXNsb3RzX2ZvdW5kID0gX19sb29rdXAobm9kZSwgcmVzdWx0cyArIHJldCwKKwkJCQlpbmRpY2VzID8gaW5kaWNlcyArIHJldCA6IE5VTEwsCisJCQkJY3VyX2luZGV4LCBtYXhfaXRlbXMgLSByZXQsICZuZXh0X2luZGV4KTsKIAkJcmV0ICs9IHNsb3RzX2ZvdW5kOwogCQlpZiAobmV4dF9pbmRleCA9PSAwKQogCQkJYnJlYWs7CkBAIC0xMTk0LDYgKzEyMDMsOTggQEAKIH0KIEVYUE9SVF9TWU1CT0wocmFkaXhfdHJlZV9nYW5nX2xvb2t1cF90YWdfc2xvdCk7CiAKKyNpZiBkZWZpbmVkKENPTkZJR19TSE1FTSkgJiYgZGVmaW5lZChDT05GSUdfU1dBUCkKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPiAvKiBmb3IgY29uZF9yZXNjaGVkKCkgKi8KKworLyoKKyAqIFRoaXMgbGluZWFyIHNlYXJjaCBpcyBhdCBwcmVzZW50IG9ubHkgdXNlZnVsIHRvIHNobWVtX3VudXNlX2lub2RlKCkuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9fbG9jYXRlKHN0cnVjdCByYWRpeF90cmVlX25vZGUgKnNsb3QsIHZvaWQgKml0ZW0sCisJCQkgICAgICB1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nICpmb3VuZF9pbmRleCkKK3sKKwl1bnNpZ25lZCBpbnQgc2hpZnQsIGhlaWdodDsKKwl1bnNpZ25lZCBsb25nIGk7CisKKwloZWlnaHQgPSBzbG90LT5oZWlnaHQ7CisJc2hpZnQgPSAoaGVpZ2h0LTEpICogUkFESVhfVFJFRV9NQVBfU0hJRlQ7CisKKwlmb3IgKCA7IGhlaWdodCA+IDE7IGhlaWdodC0tKSB7CisJCWkgPSAoaW5kZXggPj4gc2hpZnQpICYgUkFESVhfVFJFRV9NQVBfTUFTSzsKKwkJZm9yICg7OykgeworCQkJaWYgKHNsb3QtPnNsb3RzW2ldICE9IE5VTEwpCisJCQkJYnJlYWs7CisJCQlpbmRleCAmPSB+KCgxVUwgPDwgc2hpZnQpIC0gMSk7CisJCQlpbmRleCArPSAxVUwgPDwgc2hpZnQ7CisJCQlpZiAoaW5kZXggPT0gMCkKKwkJCQlnb3RvIG91dDsJLyogMzItYml0IHdyYXBhcm91bmQgKi8KKwkJCWkrKzsKKwkJCWlmIChpID09IFJBRElYX1RSRUVfTUFQX1NJWkUpCisJCQkJZ290byBvdXQ7CisJCX0KKworCQlzaGlmdCAtPSBSQURJWF9UUkVFX01BUF9TSElGVDsKKwkJc2xvdCA9IHJjdV9kZXJlZmVyZW5jZV9yYXcoc2xvdC0+c2xvdHNbaV0pOworCQlpZiAoc2xvdCA9PSBOVUxMKQorCQkJZ290byBvdXQ7CisJfQorCisJLyogQm90dG9tIGxldmVsOiBjaGVjayBpdGVtcyAqLworCWZvciAoaSA9IDA7IGkgPCBSQURJWF9UUkVFX01BUF9TSVpFOyBpKyspIHsKKwkJaWYgKHNsb3QtPnNsb3RzW2ldID09IGl0ZW0pIHsKKwkJCSpmb3VuZF9pbmRleCA9IGluZGV4ICsgaTsKKwkJCWluZGV4ID0gMDsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCWluZGV4ICs9IFJBRElYX1RSRUVfTUFQX1NJWkU7CitvdXQ6CisJcmV0dXJuIGluZGV4OworfQorCisvKioKKyAqCXJhZGl4X3RyZWVfbG9jYXRlX2l0ZW0gLSBzZWFyY2ggdGhyb3VnaCByYWRpeCB0cmVlIGZvciBpdGVtCisgKglAcm9vdDoJCXJhZGl4IHRyZWUgcm9vdAorICoJQGl0ZW06CQlpdGVtIHRvIGJlIGZvdW5kCisgKgorICoJUmV0dXJucyBpbmRleCB3aGVyZSBpdGVtIHdhcyBmb3VuZCwgb3IgLTEgaWYgbm90IGZvdW5kLgorICoJQ2FsbGVyIG11c3QgaG9sZCBubyBsb2NrIChzaW5jZSB0aGlzIHRpbWUtY29uc3VtaW5nIGZ1bmN0aW9uIG5lZWRzCisgKgl0byBiZSBwcmVlbXB0aWJsZSksIGFuZCBtdXN0IGNoZWNrIGFmdGVyd2FyZHMgaWYgaXRlbSBpcyBzdGlsbCB0aGVyZS4KKyAqLwordW5zaWduZWQgbG9uZyByYWRpeF90cmVlX2xvY2F0ZV9pdGVtKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsIHZvaWQgKml0ZW0pCit7CisJc3RydWN0IHJhZGl4X3RyZWVfbm9kZSAqbm9kZTsKKwl1bnNpZ25lZCBsb25nIG1heF9pbmRleDsKKwl1bnNpZ25lZCBsb25nIGN1cl9pbmRleCA9IDA7CisJdW5zaWduZWQgbG9uZyBmb3VuZF9pbmRleCA9IC0xOworCisJZG8geworCQlyY3VfcmVhZF9sb2NrKCk7CisJCW5vZGUgPSByY3VfZGVyZWZlcmVuY2VfcmF3KHJvb3QtPnJub2RlKTsKKwkJaWYgKCFyYWRpeF90cmVlX2lzX2luZGlyZWN0X3B0cihub2RlKSkgeworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQlpZiAobm9kZSA9PSBpdGVtKQorCQkJCWZvdW5kX2luZGV4ID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJbm9kZSA9IGluZGlyZWN0X3RvX3B0cihub2RlKTsKKwkJbWF4X2luZGV4ID0gcmFkaXhfdHJlZV9tYXhpbmRleChub2RlLT5oZWlnaHQpOworCQlpZiAoY3VyX2luZGV4ID4gbWF4X2luZGV4KQorCQkJYnJlYWs7CisKKwkJY3VyX2luZGV4ID0gX19sb2NhdGUobm9kZSwgaXRlbSwgY3VyX2luZGV4LCAmZm91bmRfaW5kZXgpOworCQlyY3VfcmVhZF91bmxvY2soKTsKKwkJY29uZF9yZXNjaGVkKCk7CisJfSB3aGlsZSAoY3VyX2luZGV4ICE9IDAgJiYgY3VyX2luZGV4IDw9IG1heF9pbmRleCk7CisKKwlyZXR1cm4gZm91bmRfaW5kZXg7Cit9CisjZWxzZQordW5zaWduZWQgbG9uZyByYWRpeF90cmVlX2xvY2F0ZV9pdGVtKHN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QsIHZvaWQgKml0ZW0pCit7CisJcmV0dXJuIC0xOworfQorI2VuZGlmIC8qIENPTkZJR19TSE1FTSAmJiBDT05GSUdfU1dBUCAqLwogCiAvKioKICAqCXJhZGl4X3RyZWVfc2hyaW5rICAgIC0gICAgc2hyaW5rIGhlaWdodCBvZiBhIHJhZGl4IHRyZWUgdG8gbWluaW1hbApkaWZmIC0tZ2l0IGEvbW0vZmFpbHNsYWIuYyBiL21tL2ZhaWxzbGFiLmMKaW5kZXggMWNlNThjMi4uMGRkN2I4ZiAxMDA2NDQKLS0tIGEvbW0vZmFpbHNsYWIuYworKysgYi9tbS9mYWlsc2xhYi5jCkBAIC0zNCwyMyArMzQsMjMgQEAKICNpZmRlZiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OX0RFQlVHX0ZTCiBzdGF0aWMgaW50IF9faW5pdCBmYWlsc2xhYl9kZWJ1Z2ZzX2luaXQodm9pZCkKIHsKKwlzdHJ1Y3QgZGVudHJ5ICpkaXI7CiAJbW9kZV90IG1vZGUgPSBTX0lGUkVHIHwgU19JUlVTUiB8IFNfSVdVU1I7Ci0JaW50IGVycjsKIAotCWVyciA9IGluaXRfZmF1bHRfYXR0cl9kZW50cmllcygmZmFpbHNsYWIuYXR0ciwgImZhaWxzbGFiIik7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKKwlkaXIgPSBmYXVsdF9jcmVhdGVfZGVidWdmc19hdHRyKCJmYWlsc2xhYiIsIE5VTEwsICZmYWlsc2xhYi5hdHRyKTsKKwlpZiAoSVNfRVJSKGRpcikpCisJCXJldHVybiBQVFJfRVJSKGRpcik7CiAKLQlpZiAoIWRlYnVnZnNfY3JlYXRlX2Jvb2woImlnbm9yZS1nZnAtd2FpdCIsIG1vZGUsIGZhaWxzbGFiLmF0dHIuZGlyLAorCWlmICghZGVidWdmc19jcmVhdGVfYm9vbCgiaWdub3JlLWdmcC13YWl0IiwgbW9kZSwgZGlyLAogCQkJCSZmYWlsc2xhYi5pZ25vcmVfZ2ZwX3dhaXQpKQogCQlnb3RvIGZhaWw7Ci0JaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV9ib29sKCJjYWNoZS1maWx0ZXIiLCBtb2RlLCBmYWlsc2xhYi5hdHRyLmRpciwKKwlpZiAoIWRlYnVnZnNfY3JlYXRlX2Jvb2woImNhY2hlLWZpbHRlciIsIG1vZGUsIGRpciwKIAkJCQkmZmFpbHNsYWIuY2FjaGVfZmlsdGVyKSkKIAkJZ290byBmYWlsOwogCiAJcmV0dXJuIDA7CiBmYWlsOgotCWNsZWFudXBfZmF1bHRfYXR0cl9kZW50cmllcygmZmFpbHNsYWIuYXR0cik7CisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGRpcik7CiAKIAlyZXR1cm4gLUVOT01FTTsKIH0KZGlmZiAtLWdpdCBhL21tL2ZpbGVtYXAuYyBiL21tL2ZpbGVtYXAuYwppbmRleCA4NjdkNDAyLi42NDVhMDgwIDEwMDY0NAotLS0gYS9tbS9maWxlbWFwLmMKKysrIGIvbW0vZmlsZW1hcC5jCkBAIC0zMyw3ICszMyw2IEBACiAjaW5jbHVkZSA8bGludXgvY3B1c2V0Lmg+CiAjaW5jbHVkZSA8bGludXgvaGFyZGlycS5oPiAvKiBmb3IgQlVHX09OKCFpbl9hdG9taWMoKSkgb25seSAqLwogI2luY2x1ZGUgPGxpbnV4L21lbWNvbnRyb2wuaD4KLSNpbmNsdWRlIDxsaW51eC9tbV9pbmxpbmUuaD4gLyogZm9yIHBhZ2VfaXNfZmlsZV9jYWNoZSgpICovCiAjaW5jbHVkZSA8bGludXgvY2xlYW5jYWNoZS5oPgogI2luY2x1ZGUgImludGVybmFsLmgiCiAKQEAgLTQ2Miw2ICs0NjEsNyBAQAogCWludCBlcnJvcjsKIAogCVZNX0JVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CisJVk1fQlVHX09OKFBhZ2VTd2FwQmFja2VkKHBhZ2UpKTsKIAogCWVycm9yID0gbWVtX2Nncm91cF9jYWNoZV9jaGFyZ2UocGFnZSwgY3VycmVudC0+bW0sCiAJCQkJCWdmcF9tYXNrICYgR0ZQX1JFQ0xBSU1fTUFTSyk7CkBAIC00NzksOCArNDc5LDYgQEAKIAkJaWYgKGxpa2VseSghZXJyb3IpKSB7CiAJCQltYXBwaW5nLT5ucnBhZ2VzKys7CiAJCQlfX2luY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfRklMRV9QQUdFUyk7Ci0JCQlpZiAoUGFnZVN3YXBCYWNrZWQocGFnZSkpCi0JCQkJX19pbmNfem9uZV9wYWdlX3N0YXRlKHBhZ2UsIE5SX1NITUVNKTsKIAkJCXNwaW5fdW5sb2NrX2lycSgmbWFwcGluZy0+dHJlZV9sb2NrKTsKIAkJfSBlbHNlIHsKIAkJCXBhZ2UtPm1hcHBpbmcgPSBOVUxMOwpAQCAtNTAyLDIyICs1MDAsOSBAQAogewogCWludCByZXQ7CiAKLQkvKgotCSAqIFNwbGljZV9yZWFkIGFuZCByZWFkYWhlYWQgYWRkIHNobWVtL3RtcGZzIHBhZ2VzIGludG8gdGhlIHBhZ2UgY2FjaGUKLQkgKiBiZWZvcmUgc2htZW1fcmVhZHBhZ2UgaGFzIGEgY2hhbmNlIHRvIG1hcmsgdGhlbSBhcyBTd2FwQmFja2VkOiB0aGV5Ci0JICogbmVlZCB0byBnbyBvbiB0aGUgYW5vbiBscnUgYmVsb3csIGFuZCBtZW1fY2dyb3VwX2NhY2hlX2NoYXJnZQotCSAqIChjYWxsZWQgaW4gYWRkX3RvX3BhZ2VfY2FjaGUpIG5lZWRzIHRvIGtub3cgd2hlcmUgdGhleSdyZSBnb2luZyB0b28uCi0JICovCi0JaWYgKG1hcHBpbmdfY2FwX3N3YXBfYmFja2VkKG1hcHBpbmcpKQotCQlTZXRQYWdlU3dhcEJhY2tlZChwYWdlKTsKLQogCXJldCA9IGFkZF90b19wYWdlX2NhY2hlKHBhZ2UsIG1hcHBpbmcsIG9mZnNldCwgZ2ZwX21hc2spOwotCWlmIChyZXQgPT0gMCkgewotCQlpZiAocGFnZV9pc19maWxlX2NhY2hlKHBhZ2UpKQotCQkJbHJ1X2NhY2hlX2FkZF9maWxlKHBhZ2UpOwotCQllbHNlCi0JCQlscnVfY2FjaGVfYWRkX2Fub24ocGFnZSk7Ci0JfQorCWlmIChyZXQgPT0gMCkKKwkJbHJ1X2NhY2hlX2FkZF9maWxlKHBhZ2UpOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChhZGRfdG9fcGFnZV9jYWNoZV9scnUpOwpAQCAtNzE0LDkgKzY5OSwxNiBAQAogCQlwYWdlID0gcmFkaXhfdHJlZV9kZXJlZl9zbG90KHBhZ2VwKTsKIAkJaWYgKHVubGlrZWx5KCFwYWdlKSkKIAkJCWdvdG8gb3V0OwotCQlpZiAocmFkaXhfdHJlZV9kZXJlZl9yZXRyeShwYWdlKSkKLQkJCWdvdG8gcmVwZWF0OwotCisJCWlmIChyYWRpeF90cmVlX2V4Y2VwdGlvbihwYWdlKSkgeworCQkJaWYgKHJhZGl4X3RyZWVfZGVyZWZfcmV0cnkocGFnZSkpCisJCQkJZ290byByZXBlYXQ7CisJCQkvKgorCQkJICogT3RoZXJ3aXNlLCBzaG1lbS90bXBmcyBtdXN0IGJlIHN0b3JpbmcgYSBzd2FwIGVudHJ5CisJCQkgKiBoZXJlIGFzIGFuIGV4Y2VwdGlvbmFsIGVudHJ5OiBzbyByZXR1cm4gaXQgd2l0aG91dAorCQkJICogYXR0ZW1wdGluZyB0byByYWlzZSBwYWdlIGNvdW50LgorCQkJICovCisJCQlnb3RvIG91dDsKKwkJfQogCQlpZiAoIXBhZ2VfY2FjaGVfZ2V0X3NwZWN1bGF0aXZlKHBhZ2UpKQogCQkJZ290byByZXBlYXQ7CiAKQEAgLTc1Myw3ICs3NDUsNyBAQAogCiByZXBlYXQ6CiAJcGFnZSA9IGZpbmRfZ2V0X3BhZ2UobWFwcGluZywgb2Zmc2V0KTsKLQlpZiAocGFnZSkgeworCWlmIChwYWdlICYmICFyYWRpeF90cmVlX2V4Y2VwdGlvbihwYWdlKSkgewogCQlsb2NrX3BhZ2UocGFnZSk7CiAJCS8qIEhhcyB0aGUgcGFnZSBiZWVuIHRydW5jYXRlZD8gKi8KIAkJaWYgKHVubGlrZWx5KHBhZ2UtPm1hcHBpbmcgIT0gbWFwcGluZykpIHsKQEAgLTg0MCw3ICs4MzIsNyBAQAogCXJjdV9yZWFkX2xvY2soKTsKIHJlc3RhcnQ6CiAJbnJfZm91bmQgPSByYWRpeF90cmVlX2dhbmdfbG9va3VwX3Nsb3QoJm1hcHBpbmctPnBhZ2VfdHJlZSwKLQkJCQkodm9pZCAqKiopcGFnZXMsIHN0YXJ0LCBucl9wYWdlcyk7CisJCQkJKHZvaWQgKioqKXBhZ2VzLCBOVUxMLCBzdGFydCwgbnJfcGFnZXMpOwogCXJldCA9IDA7CiAJZm9yIChpID0gMDsgaSA8IG5yX2ZvdW5kOyBpKyspIHsKIAkJc3RydWN0IHBhZ2UgKnBhZ2U7CkBAIC04NDksMTMgKzg0MSwyMiBAQAogCQlpZiAodW5saWtlbHkoIXBhZ2UpKQogCQkJY29udGludWU7CiAKLQkJLyoKLQkJICogVGhpcyBjYW4gb25seSB0cmlnZ2VyIHdoZW4gdGhlIGVudHJ5IGF0IGluZGV4IDAgbW92ZXMgb3V0Ci0JCSAqIG9mIG9yIGJhY2sgdG8gdGhlIHJvb3Q6IG5vbmUgeWV0IGdvdHRlbiwgc2FmZSB0byByZXN0YXJ0LgotCQkgKi8KLQkJaWYgKHJhZGl4X3RyZWVfZGVyZWZfcmV0cnkocGFnZSkpIHsKLQkJCVdBUk5fT04oc3RhcnQgfCBpKTsKLQkJCWdvdG8gcmVzdGFydDsKKwkJaWYgKHJhZGl4X3RyZWVfZXhjZXB0aW9uKHBhZ2UpKSB7CisJCQlpZiAocmFkaXhfdHJlZV9kZXJlZl9yZXRyeShwYWdlKSkgeworCQkJCS8qCisJCQkJICogVHJhbnNpZW50IGNvbmRpdGlvbiB3aGljaCBjYW4gb25seSB0cmlnZ2VyCisJCQkJICogd2hlbiBlbnRyeSBhdCBpbmRleCAwIG1vdmVzIG91dCBvZiBvciBiYWNrCisJCQkJICogdG8gcm9vdDogbm9uZSB5ZXQgZ290dGVuLCBzYWZlIHRvIHJlc3RhcnQuCisJCQkJICovCisJCQkJV0FSTl9PTihzdGFydCB8IGkpOworCQkJCWdvdG8gcmVzdGFydDsKKwkJCX0KKwkJCS8qCisJCQkgKiBPdGhlcndpc2UsIHNobWVtL3RtcGZzIG11c3QgYmUgc3RvcmluZyBhIHN3YXAgZW50cnkKKwkJCSAqIGhlcmUgYXMgYW4gZXhjZXB0aW9uYWwgZW50cnk6IHNvIHNraXAgb3ZlciBpdCAtCisJCQkgKiB3ZSBvbmx5IHJlYWNoIHRoaXMgZnJvbSBpbnZhbGlkYXRlX21hcHBpbmdfcGFnZXMoKS4KKwkJCSAqLworCQkJY29udGludWU7CiAJCX0KIAogCQlpZiAoIXBhZ2VfY2FjaGVfZ2V0X3NwZWN1bGF0aXZlKHBhZ2UpKQpAQCAtOTAzLDcgKzkwNCw3IEBACiAJcmN1X3JlYWRfbG9jaygpOwogcmVzdGFydDoKIAlucl9mb3VuZCA9IHJhZGl4X3RyZWVfZ2FuZ19sb29rdXBfc2xvdCgmbWFwcGluZy0+cGFnZV90cmVlLAotCQkJCSh2b2lkICoqKilwYWdlcywgaW5kZXgsIG5yX3BhZ2VzKTsKKwkJCQkodm9pZCAqKiopcGFnZXMsIE5VTEwsIGluZGV4LCBucl9wYWdlcyk7CiAJcmV0ID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgbnJfZm91bmQ7IGkrKykgewogCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKQEAgLTkxMiwxMiArOTEzLDIyIEBACiAJCWlmICh1bmxpa2VseSghcGFnZSkpCiAJCQljb250aW51ZTsKIAotCQkvKgotCQkgKiBUaGlzIGNhbiBvbmx5IHRyaWdnZXIgd2hlbiB0aGUgZW50cnkgYXQgaW5kZXggMCBtb3ZlcyBvdXQKLQkJICogb2Ygb3IgYmFjayB0byB0aGUgcm9vdDogbm9uZSB5ZXQgZ290dGVuLCBzYWZlIHRvIHJlc3RhcnQuCi0JCSAqLwotCQlpZiAocmFkaXhfdHJlZV9kZXJlZl9yZXRyeShwYWdlKSkKLQkJCWdvdG8gcmVzdGFydDsKKwkJaWYgKHJhZGl4X3RyZWVfZXhjZXB0aW9uKHBhZ2UpKSB7CisJCQlpZiAocmFkaXhfdHJlZV9kZXJlZl9yZXRyeShwYWdlKSkgeworCQkJCS8qCisJCQkJICogVHJhbnNpZW50IGNvbmRpdGlvbiB3aGljaCBjYW4gb25seSB0cmlnZ2VyCisJCQkJICogd2hlbiBlbnRyeSBhdCBpbmRleCAwIG1vdmVzIG91dCBvZiBvciBiYWNrCisJCQkJICogdG8gcm9vdDogbm9uZSB5ZXQgZ290dGVuLCBzYWZlIHRvIHJlc3RhcnQuCisJCQkJICovCisJCQkJZ290byByZXN0YXJ0OworCQkJfQorCQkJLyoKKwkJCSAqIE90aGVyd2lzZSwgc2htZW0vdG1wZnMgbXVzdCBiZSBzdG9yaW5nIGEgc3dhcCBlbnRyeQorCQkJICogaGVyZSBhcyBhbiBleGNlcHRpb25hbCBlbnRyeTogc28gc3RvcCBsb29raW5nIGZvcgorCQkJICogY29udGlndW91cyBwYWdlcy4KKwkJCSAqLworCQkJYnJlYWs7CisJCX0KIAogCQlpZiAoIXBhZ2VfY2FjaGVfZ2V0X3NwZWN1bGF0aXZlKHBhZ2UpKQogCQkJZ290byByZXBlYXQ7CkBAIC05NzcsMTIgKzk4OCwyMSBAQAogCQlpZiAodW5saWtlbHkoIXBhZ2UpKQogCQkJY29udGludWU7CiAKLQkJLyoKLQkJICogVGhpcyBjYW4gb25seSB0cmlnZ2VyIHdoZW4gdGhlIGVudHJ5IGF0IGluZGV4IDAgbW92ZXMgb3V0Ci0JCSAqIG9mIG9yIGJhY2sgdG8gdGhlIHJvb3Q6IG5vbmUgeWV0IGdvdHRlbiwgc2FmZSB0byByZXN0YXJ0LgotCQkgKi8KLQkJaWYgKHJhZGl4X3RyZWVfZGVyZWZfcmV0cnkocGFnZSkpCi0JCQlnb3RvIHJlc3RhcnQ7CisJCWlmIChyYWRpeF90cmVlX2V4Y2VwdGlvbihwYWdlKSkgeworCQkJaWYgKHJhZGl4X3RyZWVfZGVyZWZfcmV0cnkocGFnZSkpIHsKKwkJCQkvKgorCQkJCSAqIFRyYW5zaWVudCBjb25kaXRpb24gd2hpY2ggY2FuIG9ubHkgdHJpZ2dlcgorCQkJCSAqIHdoZW4gZW50cnkgYXQgaW5kZXggMCBtb3ZlcyBvdXQgb2Ygb3IgYmFjaworCQkJCSAqIHRvIHJvb3Q6IG5vbmUgeWV0IGdvdHRlbiwgc2FmZSB0byByZXN0YXJ0LgorCQkJCSAqLworCQkJCWdvdG8gcmVzdGFydDsKKwkJCX0KKwkJCS8qCisJCQkgKiBUaGlzIGZ1bmN0aW9uIGlzIG5ldmVyIHVzZWQgb24gYSBzaG1lbS90bXBmcworCQkJICogbWFwcGluZywgc28gYSBzd2FwIGVudHJ5IHdvbid0IGJlIGZvdW5kIGhlcmUuCisJCQkgKi8KKwkJCUJVRygpOworCQl9CiAKIAkJaWYgKCFwYWdlX2NhY2hlX2dldF9zcGVjdWxhdGl2ZShwYWdlKSkKIAkJCWdvdG8gcmVwZWF0OwpkaWZmIC0tZ2l0IGEvbW0vbWVtY29udHJvbC5jIGIvbW0vbWVtY29udHJvbC5jCmluZGV4IDVmODRkMjMuLmY0ZWM0ZTcgMTAwNjQ0Ci0tLSBhL21tL21lbWNvbnRyb2wuYworKysgYi9tbS9tZW1jb250cm9sLmMKQEAgLTM1LDcgKzM1LDYgQEAKICNpbmNsdWRlIDxsaW51eC9saW1pdHMuaD4KICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NobWVtX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxsaW51eC9zd2Fwb3BzLmg+CkBAIC0yODczLDMwICsyODcyLDYgQEAKIAkJcmV0dXJuIDA7CiAJaWYgKFBhZ2VDb21wb3VuZChwYWdlKSkKIAkJcmV0dXJuIDA7Ci0JLyoKLQkgKiBDb3JuZXIgY2FzZSBoYW5kbGluZy4gVGhpcyBpcyBjYWxsZWQgZnJvbSBhZGRfdG9fcGFnZV9jYWNoZSgpCi0JICogaW4gdXN1YWwuIEJ1dCBzb21lIEZTIChzaG1lbSkgcHJlY2hhcmdlcyB0aGlzIHBhZ2UgYmVmb3JlIGNhbGxpbmcgaXQKLQkgKiBhbmQgY2FsbCBhZGRfdG9fcGFnZV9jYWNoZSgpIHdpdGggR0ZQX05PV0FJVC4KLQkgKgotCSAqIEZvciBHRlBfTk9XQUlUIGNhc2UsIHRoZSBwYWdlIG1heSBiZSBwcmUtY2hhcmdlZCBiZWZvcmUgY2FsbGluZwotCSAqIGFkZF90b19wYWdlX2NhY2hlKCkuIChTZWUgc2htZW0uYykgY2hlY2sgaXQgaGVyZSBhbmQgYXZvaWQgdG8gY2FsbAotCSAqIGNoYXJnZSB0d2ljZS4gKEl0IHdvcmtzIGJ1dCBoYXMgdG8gcGF5IGEgYml0IGxhcmdlciBjb3N0LikKLQkgKiBBbmQgd2hlbiB0aGUgcGFnZSBpcyBTd2FwQ2FjaGUsIGl0IHNob3VsZCB0YWtlIHN3YXAgaW5mb3JtYXRpb24KLQkgKiBpbnRvIGFjY291bnQuIFRoaXMgaXMgdW5kZXIgbG9ja19wYWdlKCkgbm93LgotCSAqLwotCWlmICghKGdmcF9tYXNrICYgX19HRlBfV0FJVCkpIHsKLQkJc3RydWN0IHBhZ2VfY2dyb3VwICpwYzsKLQotCQlwYyA9IGxvb2t1cF9wYWdlX2Nncm91cChwYWdlKTsKLQkJaWYgKCFwYykKLQkJCXJldHVybiAwOwotCQlsb2NrX3BhZ2VfY2dyb3VwKHBjKTsKLQkJaWYgKFBhZ2VDZ3JvdXBVc2VkKHBjKSkgewotCQkJdW5sb2NrX3BhZ2VfY2dyb3VwKHBjKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXVubG9ja19wYWdlX2Nncm91cChwYyk7Ci0JfQogCiAJaWYgKHVubGlrZWx5KCFtbSkpCiAJCW1tID0gJmluaXRfbW07CkBAIC0zNDg2LDMxICszNDYxLDYgQEAKIAljZ3JvdXBfcmVsZWFzZV9hbmRfd2FrZXVwX3JtZGlyKCZtZW0tPmNzcyk7CiB9CiAKLS8qCi0gKiBBIGNhbGwgdG8gdHJ5IHRvIHNocmluayBtZW1vcnkgdXNhZ2Ugb24gY2hhcmdlIGZhaWx1cmUgYXQgc2htZW0ncyBzd2FwaW4uCi0gKiBDYWxsaW5nIGhpZXJhcmNoaWNhbF9yZWNsYWltIGlzIG5vdCBlbm91Z2ggYmVjYXVzZSB3ZSBzaG91bGQgdXBkYXRlCi0gKiBsYXN0X29vbV9qaWZmaWVzIHRvIHByZXZlbnQgcGFnZWZhdWx0X291dF9vZl9tZW1vcnkgZnJvbSBpbnZva2luZyBnbG9iYWwgT09NLgotICogTW9yZW92ZXIgY29uc2lkZXJpbmcgaGllcmFyY2h5LCB3ZSBzaG91bGQgcmVjbGFpbSBmcm9tIHRoZSBtZW1fb3Zlcl9saW1pdCwKLSAqIG5vdCBmcm9tIHRoZSBtZW1jZyB3aGljaCB0aGlzIHBhZ2Ugd291bGQgYmUgY2hhcmdlZCB0by4KLSAqIHRyeV9jaGFyZ2Vfc3dhcGluIGRvZXMgYWxsIG9mIHRoZXNlIHdvcmtzIHByb3Blcmx5LgotICovCi1pbnQgbWVtX2Nncm91cF9zaG1lbV9jaGFyZ2VfZmFsbGJhY2soc3RydWN0IHBhZ2UgKnBhZ2UsCi0JCQkgICAgc3RydWN0IG1tX3N0cnVjdCAqbW0sCi0JCQkgICAgZ2ZwX3QgZ2ZwX21hc2spCi17Ci0Jc3RydWN0IG1lbV9jZ3JvdXAgKm1lbTsKLQlpbnQgcmV0OwotCi0JaWYgKG1lbV9jZ3JvdXBfZGlzYWJsZWQoKSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXQgPSBtZW1fY2dyb3VwX3RyeV9jaGFyZ2Vfc3dhcGluKG1tLCBwYWdlLCBnZnBfbWFzaywgJm1lbSk7Ci0JaWYgKCFyZXQpCi0JCW1lbV9jZ3JvdXBfY2FuY2VsX2NoYXJnZV9zd2FwaW4obWVtKTsgLyogaXQgZG9lcyAhbWVtIGNoZWNrICovCi0KLQlyZXR1cm4gcmV0OwotfQotCiAjaWZkZWYgQ09ORklHX0RFQlVHX1ZNCiBzdGF0aWMgc3RydWN0IHBhZ2VfY2dyb3VwICpsb29rdXBfcGFnZV9jZ3JvdXBfdXNlZChzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKQEAgLTUzMzAsMTUgKzUyODAsMTcgQEAKIAkJcGdvZmYgPSBwdGVfdG9fcGdvZmYocHRlbnQpOwogCiAJLyogcGFnZSBpcyBtb3ZlZCBldmVuIGlmIGl0J3Mgbm90IFJTUyBvZiB0aGlzIHRhc2socGFnZS1mYXVsdGVkKS4gKi8KLQlpZiAoIW1hcHBpbmdfY2FwX3N3YXBfYmFja2VkKG1hcHBpbmcpKSB7IC8qIG5vcm1hbCBmaWxlICovCi0JCXBhZ2UgPSBmaW5kX2dldF9wYWdlKG1hcHBpbmcsIHBnb2ZmKTsKLQl9IGVsc2UgeyAvKiBzaG1lbS90bXBmcyBmaWxlLiB3ZSBzaG91bGQgdGFrZSBhY2NvdW50IG9mIHN3YXAgdG9vLiAqLwotCQlzd3BfZW50cnlfdCBlbnQ7Ci0JCW1lbV9jZ3JvdXBfZ2V0X3NobWVtX3RhcmdldChpbm9kZSwgcGdvZmYsICZwYWdlLCAmZW50KTsKLQkJaWYgKGRvX3N3YXBfYWNjb3VudCkKLQkJCWVudHJ5LT52YWwgPSBlbnQudmFsOwotCX0KKwlwYWdlID0gZmluZF9nZXRfcGFnZShtYXBwaW5nLCBwZ29mZik7CiAKKyNpZmRlZiBDT05GSUdfU1dBUAorCS8qIHNobWVtL3RtcGZzIG1heSByZXBvcnQgcGFnZSBvdXQgb24gc3dhcDogYWNjb3VudCBmb3IgdGhhdCB0b28uICovCisJaWYgKHJhZGl4X3RyZWVfZXhjZXB0aW9uYWxfZW50cnkocGFnZSkpIHsKKwkJc3dwX2VudHJ5X3Qgc3dhcCA9IHJhZGl4X3RvX3N3cF9lbnRyeShwYWdlKTsKKwkJaWYgKGRvX3N3YXBfYWNjb3VudCkKKwkJCSplbnRyeSA9IHN3YXA7CisJCXBhZ2UgPSBmaW5kX2dldF9wYWdlKCZzd2FwcGVyX3NwYWNlLCBzd2FwLnZhbCk7CisJfQorI2VuZGlmCiAJcmV0dXJuIHBhZ2U7CiB9CiAKZGlmZiAtLWdpdCBhL21tL21lbW9yeS1mYWlsdXJlLmMgYi9tbS9tZW1vcnktZmFpbHVyZS5jCmluZGV4IDc0MGM0ZjUuLjJiNDNiYTAgMTAwNjQ0Ci0tLSBhL21tL21lbW9yeS1mYWlsdXJlLmMKKysrIGIvbW0vbWVtb3J5LWZhaWx1cmUuYwpAQCAtNTMsNiArNTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2h1Z2V0bGIuaD4KICNpbmNsdWRlIDxsaW51eC9tZW1vcnlfaG90cGx1Zy5oPgogI2luY2x1ZGUgPGxpbnV4L21tX2lubGluZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tmaWZvLmg+CiAjaW5jbHVkZSAiaW50ZXJuYWwuaCIKIAogaW50IHN5c2N0bF9tZW1vcnlfZmFpbHVyZV9lYXJseV9raWxsIF9fcmVhZF9tb3N0bHkgPSAwOwpAQCAtMTE3OCw2ICsxMTc5LDk3IEBACiAJX19tZW1vcnlfZmFpbHVyZShwZm4sIHRyYXBubywgMCk7CiB9CiAKKyNkZWZpbmUgTUVNT1JZX0ZBSUxVUkVfRklGT19PUkRFUgk0CisjZGVmaW5lIE1FTU9SWV9GQUlMVVJFX0ZJRk9fU0laRQkoMSA8PCBNRU1PUllfRkFJTFVSRV9GSUZPX09SREVSKQorCitzdHJ1Y3QgbWVtb3J5X2ZhaWx1cmVfZW50cnkgeworCXVuc2lnbmVkIGxvbmcgcGZuOworCWludCB0cmFwbm87CisJaW50IGZsYWdzOworfTsKKworc3RydWN0IG1lbW9yeV9mYWlsdXJlX2NwdSB7CisJREVDTEFSRV9LRklGTyhmaWZvLCBzdHJ1Y3QgbWVtb3J5X2ZhaWx1cmVfZW50cnksCisJCSAgICAgIE1FTU9SWV9GQUlMVVJFX0ZJRk9fU0laRSk7CisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrOworfTsKKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBtZW1vcnlfZmFpbHVyZV9jcHUsIG1lbW9yeV9mYWlsdXJlX2NwdSk7CisKKy8qKgorICogbWVtb3J5X2ZhaWx1cmVfcXVldWUgLSBTY2hlZHVsZSBoYW5kbGluZyBtZW1vcnkgZmFpbHVyZSBvZiBhIHBhZ2UuCisgKiBAcGZuOiBQYWdlIE51bWJlciBvZiB0aGUgY29ycnVwdGVkIHBhZ2UKKyAqIEB0cmFwbm86IFRyYXAgbnVtYmVyIHJlcG9ydGVkIGluIHRoZSBzaWduYWwgdG8gdXNlciBzcGFjZS4KKyAqIEBmbGFnczogRmxhZ3MgZm9yIG1lbW9yeSBmYWlsdXJlIGhhbmRsaW5nCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSBlcnJvciBoYW5kbGVyCisgKiB3aGVuIGl0IGRldGVjdHMgaGFyZHdhcmUgbWVtb3J5IGNvcnJ1cHRpb24gb2YgYSBwYWdlLiBJdCBzY2hlZHVsZXMKKyAqIHRoZSByZWNvdmVyaW5nIG9mIGVycm9yIHBhZ2UsIGluY2x1ZGluZyBkcm9wcGluZyBwYWdlcywga2lsbGluZworICogcHJvY2Vzc2VzIGV0Yy4KKyAqCisgKiBUaGUgZnVuY3Rpb24gaXMgcHJpbWFyaWx5IG9mIHVzZSBmb3IgY29ycnVwdGlvbnMgdGhhdAorICogaGFwcGVuIG91dHNpZGUgdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGNvbnRleHQgKGUuZy4gd2hlbgorICogZGV0ZWN0ZWQgYnkgYSBiYWNrZ3JvdW5kIHNjcnViYmVyKQorICoKKyAqIENhbiBydW4gaW4gSVJRIGNvbnRleHQuCisgKi8KK3ZvaWQgbWVtb3J5X2ZhaWx1cmVfcXVldWUodW5zaWduZWQgbG9uZyBwZm4sIGludCB0cmFwbm8sIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgbWVtb3J5X2ZhaWx1cmVfY3B1ICptZl9jcHU7CisJdW5zaWduZWQgbG9uZyBwcm9jX2ZsYWdzOworCXN0cnVjdCBtZW1vcnlfZmFpbHVyZV9lbnRyeSBlbnRyeSA9IHsKKwkJLnBmbiA9CQlwZm4sCisJCS50cmFwbm8gPQl0cmFwbm8sCisJCS5mbGFncyA9CWZsYWdzLAorCX07CisKKwltZl9jcHUgPSAmZ2V0X2NwdV92YXIobWVtb3J5X2ZhaWx1cmVfY3B1KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWZfY3B1LT5sb2NrLCBwcm9jX2ZsYWdzKTsKKwlpZiAoa2ZpZm9fcHV0KCZtZl9jcHUtPmZpZm8sICZlbnRyeSkpCisJCXNjaGVkdWxlX3dvcmtfb24oc21wX3Byb2Nlc3Nvcl9pZCgpLCAmbWZfY3B1LT53b3JrKTsKKwllbHNlCisJCXByX2VycigiTWVtb3J5IGZhaWx1cmU6IGJ1ZmZlciBvdmVyZmxvdyB3aGVuIHF1ZXVpbmcgbWVtb3J5IGZhaWx1cmUgYXQgMHglI2x4XG4iLAorCQkgICAgICAgcGZuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZl9jcHUtPmxvY2ssIHByb2NfZmxhZ3MpOworCXB1dF9jcHVfdmFyKG1lbW9yeV9mYWlsdXJlX2NwdSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtZW1vcnlfZmFpbHVyZV9xdWV1ZSk7CisKK3N0YXRpYyB2b2lkIG1lbW9yeV9mYWlsdXJlX3dvcmtfZnVuYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IG1lbW9yeV9mYWlsdXJlX2NwdSAqbWZfY3B1OworCXN0cnVjdCBtZW1vcnlfZmFpbHVyZV9lbnRyeSBlbnRyeSA9IHsgMCwgfTsKKwl1bnNpZ25lZCBsb25nIHByb2NfZmxhZ3M7CisJaW50IGdvdHRlbjsKKworCW1mX2NwdSA9ICZfX2dldF9jcHVfdmFyKG1lbW9yeV9mYWlsdXJlX2NwdSk7CisJZm9yICg7OykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbWZfY3B1LT5sb2NrLCBwcm9jX2ZsYWdzKTsKKwkJZ290dGVuID0ga2ZpZm9fZ2V0KCZtZl9jcHUtPmZpZm8sICZlbnRyeSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1mX2NwdS0+bG9jaywgcHJvY19mbGFncyk7CisJCWlmICghZ290dGVuKQorCQkJYnJlYWs7CisJCV9fbWVtb3J5X2ZhaWx1cmUoZW50cnkucGZuLCBlbnRyeS50cmFwbm8sIGVudHJ5LmZsYWdzKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG1lbW9yeV9mYWlsdXJlX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgbWVtb3J5X2ZhaWx1cmVfY3B1ICptZl9jcHU7CisJaW50IGNwdTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJbWZfY3B1ID0gJnBlcl9jcHUobWVtb3J5X2ZhaWx1cmVfY3B1LCBjcHUpOworCQlzcGluX2xvY2tfaW5pdCgmbWZfY3B1LT5sb2NrKTsKKwkJSU5JVF9LRklGTyhtZl9jcHUtPmZpZm8pOworCQlJTklUX1dPUksoJm1mX2NwdS0+d29yaywgbWVtb3J5X2ZhaWx1cmVfd29ya19mdW5jKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KK2NvcmVfaW5pdGNhbGwobWVtb3J5X2ZhaWx1cmVfaW5pdCk7CisKIC8qKgogICogdW5wb2lzb25fbWVtb3J5IC0gVW5wb2lzb24gYSBwcmV2aW91c2x5IHBvaXNvbmVkIHBhZ2UKICAqIEBwZm46IFBhZ2UgbnVtYmVyIG9mIHRoZSB0byBiZSB1bnBvaXNvbmVkIHBhZ2UKZGlmZiAtLWdpdCBhL21tL21pbmNvcmUuYyBiL21tL21pbmNvcmUuYwppbmRleCBhNGU2YjlkLi42MzZhODY4IDEwMDY0NAotLS0gYS9tbS9taW5jb3JlLmMKKysrIGIvbW0vbWluY29yZS5jCkBAIC02OSwxMiArNjksMTUgQEAKIAkgKiBmaWxlIHdpbGwgbm90IGdldCBhIHN3cF9lbnRyeV90IGluIGl0cyBwdGUsIGJ1dCByYXRoZXIgaXQgaXMgbGlrZQogCSAqIGFueSBvdGhlciBmaWxlIG1hcHBpbmcgKGllLiBtYXJrZWQgIXByZXNlbnQgYW5kIGZhdWx0ZWQgaW4gd2l0aAogCSAqIHRtcGZzJ3MgLmZhdWx0KS4gU28gc3dhcHBlZCBvdXQgdG1wZnMgbWFwcGluZ3MgYXJlIHRlc3RlZCBoZXJlLgotCSAqCi0JICogSG93ZXZlciB3aGVuIHRtcGZzIG1vdmVzIHRoZSBwYWdlIGZyb20gcGFnZWNhY2hlIGFuZCBpbnRvIHN3YXBjYWNoZSwKLQkgKiBpdCBpcyBzdGlsbCBpbiBjb3JlLCBidXQgdGhlIGZpbmRfZ2V0X3BhZ2UgYmVsb3cgd29uJ3QgZmluZCBpdC4KLQkgKiBObyBiaWcgZGVhbCwgYnV0IG1ha2UgYSBub3RlIG9mIGl0LgogCSAqLwogCXBhZ2UgPSBmaW5kX2dldF9wYWdlKG1hcHBpbmcsIHBnb2ZmKTsKKyNpZmRlZiBDT05GSUdfU1dBUAorCS8qIHNobWVtL3RtcGZzIG1heSByZXR1cm4gc3dhcDogYWNjb3VudCBmb3Igc3dhcGNhY2hlIHBhZ2UgdG9vLiAqLworCWlmIChyYWRpeF90cmVlX2V4Y2VwdGlvbmFsX2VudHJ5KHBhZ2UpKSB7CisJCXN3cF9lbnRyeV90IHN3YXAgPSByYWRpeF90b19zd3BfZW50cnkocGFnZSk7CisJCXBhZ2UgPSBmaW5kX2dldF9wYWdlKCZzd2FwcGVyX3NwYWNlLCBzd2FwLnZhbCk7CisJfQorI2VuZGlmCiAJaWYgKHBhZ2UpIHsKIAkJcHJlc2VudCA9IFBhZ2VVcHRvZGF0ZShwYWdlKTsKIAkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwpkaWZmIC0tZ2l0IGEvbW0vb29tX2tpbGwuYyBiL21tL29vbV9raWxsLmMKaW5kZXggZWFmZmY4OS4uNjI2MzAzYiAxMDA2NDQKLS0tIGEvbW0vb29tX2tpbGwuYworKysgYi9tbS9vb21fa2lsbC5jCkBAIC0zMDMsNyArMzAzLDcgQEAKIAlkb19lYWNoX3RocmVhZChnLCBwKSB7CiAJCXVuc2lnbmVkIGludCBwb2ludHM7CiAKLQkJaWYgKCFwLT5tbSkKKwkJaWYgKHAtPmV4aXRfc3RhdGUpCiAJCQljb250aW51ZTsKIAkJaWYgKG9vbV91bmtpbGxhYmxlX3Rhc2socCwgbWVtLCBub2RlbWFzaykpCiAJCQljb250aW51ZTsKQEAgLTMxOSw2ICszMTksOCBAQAogCQkgKi8KIAkJaWYgKHRlc3RfdHNrX3RocmVhZF9mbGFnKHAsIFRJRl9NRU1ESUUpKQogCQkJcmV0dXJuIEVSUl9QVFIoLTFVTCk7CisJCWlmICghcC0+bW0pCisJCQljb250aW51ZTsKIAogCQlpZiAocC0+ZmxhZ3MgJiBQRl9FWElUSU5HKSB7CiAJCQkvKgpkaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvYy5jIGIvbW0vcGFnZV9hbGxvYy5jCmluZGV4IDFkYmNmODguLjZlOGVjYjYgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfYWxsb2MuYworKysgYi9tbS9wYWdlX2FsbG9jLmMKQEAgLTE0MDksMTQgKzE0MDksMTEgQEAKIHsKIAltb2RlX3QgbW9kZSA9IFNfSUZSRUcgfCBTX0lSVVNSIHwgU19JV1VTUjsKIAlzdHJ1Y3QgZGVudHJ5ICpkaXI7Ci0JaW50IGVycjsKIAotCWVyciA9IGluaXRfZmF1bHRfYXR0cl9kZW50cmllcygmZmFpbF9wYWdlX2FsbG9jLmF0dHIsCi0JCQkJICAgICAgICJmYWlsX3BhZ2VfYWxsb2MiKTsKLQlpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JZGlyID0gZmFpbF9wYWdlX2FsbG9jLmF0dHIuZGlyOworCWRpciA9IGZhdWx0X2NyZWF0ZV9kZWJ1Z2ZzX2F0dHIoImZhaWxfcGFnZV9hbGxvYyIsIE5VTEwsCisJCQkJCSZmYWlsX3BhZ2VfYWxsb2MuYXR0cik7CisJaWYgKElTX0VSUihkaXIpKQorCQlyZXR1cm4gUFRSX0VSUihkaXIpOwogCiAJaWYgKCFkZWJ1Z2ZzX2NyZWF0ZV9ib29sKCJpZ25vcmUtZ2ZwLXdhaXQiLCBtb2RlLCBkaXIsCiAJCQkJJmZhaWxfcGFnZV9hbGxvYy5pZ25vcmVfZ2ZwX3dhaXQpKQpAQCAtMTQzMCw3ICsxNDI3LDcgQEAKIAogCXJldHVybiAwOwogZmFpbDoKLQljbGVhbnVwX2ZhdWx0X2F0dHJfZGVudHJpZXMoJmZhaWxfcGFnZV9hbGxvYy5hdHRyKTsKKwlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoZGlyKTsKIAogCXJldHVybiAtRU5PTUVNOwogfQpkaWZmIC0tZ2l0IGEvbW0vc2htZW0uYyBiL21tL3NobWVtLmMKaW5kZXggNWNjMjFmOC4uMzJmNjc2MyAxMDA2NDQKLS0tIGEvbW0vc2htZW0uYworKysgYi9tbS9zaG1lbS5jCkBAIC02LDcgKzYsOCBAQAogICoJCSAyMDAwLTIwMDEgQ2hyaXN0b3BoIFJvaGxhbmQKICAqCQkgMjAwMC0yMDAxIFNBUCBBRwogICoJCSAyMDAyIFJlZCBIYXQgSW5jLgotICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgSHVnaCBEaWNraW5zLgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMTEgSHVnaCBEaWNraW5zLgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBWRVJJVEFTIFNvZnR3YXJlIENvcnBvcmF0aW9uLgogICogQ29weXJpZ2h0IChDKSAyMDA0IEFuZGkgS2xlZW4sIFN1U0UgTGFicwogICoKQEAgLTI4LDcgKzI5LDYgQEAKICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wZXJjcHVfY291bnRlci5oPgogI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KIAogc3RhdGljIHN0cnVjdCB2ZnNtb3VudCAqc2htX21udDsKQEAgLTUxLDYgKzUxLDggQEAKICNpbmNsdWRlIDxsaW51eC9zaG1lbV9mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3dyaXRlYmFjay5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2V2ZWMuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHVfY291bnRlci5oPgogI2luY2x1ZGUgPGxpbnV4L3NwbGljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcG9wcy5oPgpAQCAtNjMsNDMgKzY1LDE3IEBACiAjaW5jbHVkZSA8bGludXgvbWFnaWMuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KIAotLyoKLSAqIFRoZSBtYXhpbXVtIHNpemUgb2YgYSBzaG1lbS90bXBmcyBmaWxlIGlzIGxpbWl0ZWQgYnkgdGhlIG1heGltdW0gc2l6ZSBvZgotICogaXRzIHRyaXBsZS1pbmRpcmVjdCBzd2FwIHZlY3RvciAtIHNlZSBpbGx1c3RyYXRpb24gYXQgc2htZW1fc3dwX2VudHJ5KCkuCi0gKgotICogV2l0aCA0a0IgcGFnZSBzaXplLCBtYXhpbXVtIGZpbGUgc2l6ZSBpcyBqdXN0IG92ZXIgMlRCIG9uIGEgMzItYml0IGtlcm5lbCwKLSAqIGJ1dCBvbmUgZWlnaHRoIG9mIHRoYXQgb24gYSA2NC1iaXQga2VybmVsLiAgV2l0aCA4a0IgcGFnZSBzaXplLCBtYXhpbXVtCi0gKiBmaWxlIHNpemUgaXMganVzdCBvdmVyIDRUQiBvbiBhIDY0LWJpdCBrZXJuZWwsIGJ1dCAxNlRCIG9uIGEgMzItYml0IGtlcm5lbCwKLSAqIE1BWF9MRlNfRklMRVNJWkUgYmVpbmcgdGhlbiBtb3JlIHJlc3RyaWN0aXZlIHRoYW4gc3dhcCB2ZWN0b3IgbGF5b3V0LgotICoKLSAqIFdlIHVzZSAvIGFuZCAqIGluc3RlYWQgb2Ygc2hpZnRzIGluIHRoZSBkZWZpbml0aW9ucyBiZWxvdywgc28gdGhhdCB0aGUgc3dhcAotICogdmVjdG9yIGNhbiBiZSB0ZXN0ZWQgd2l0aCBzbWFsbCBldmVuIHZhbHVlcyAoZS5nLiAyMCkgZm9yIEVOVFJJRVNfUEVSX1BBR0UuCi0gKi8KLSNkZWZpbmUgRU5UUklFU19QRVJfUEFHRSAoUEFHRV9DQUNIRV9TSVpFL3NpemVvZih1bnNpZ25lZCBsb25nKSkKLSNkZWZpbmUgRU5UUklFU19QRVJfUEFHRVBBR0UgKCh1bnNpZ25lZCBsb25nIGxvbmcpRU5UUklFU19QRVJfUEFHRSpFTlRSSUVTX1BFUl9QQUdFKQotCi0jZGVmaW5lIFNITVNXUF9NQVhfSU5ERVggKFNITUVNX05SX0RJUkVDVCArIChFTlRSSUVTX1BFUl9QQUdFUEFHRS8yKSAqIChFTlRSSUVTX1BFUl9QQUdFKzEpKQotI2RlZmluZSBTSE1TV1BfTUFYX0JZVEVTIChTSE1TV1BfTUFYX0lOREVYIDw8IFBBR0VfQ0FDSEVfU0hJRlQpCi0KLSNkZWZpbmUgU0hNRU1fTUFYX0JZVEVTICBtaW5fdCh1bnNpZ25lZCBsb25nIGxvbmcsIFNITVNXUF9NQVhfQllURVMsIE1BWF9MRlNfRklMRVNJWkUpCi0jZGVmaW5lIFNITUVNX01BWF9JTkRFWCAgKCh1bnNpZ25lZCBsb25nKSgoU0hNRU1fTUFYX0JZVEVTKzEpID4+IFBBR0VfQ0FDSEVfU0hJRlQpKQotCiAjZGVmaW5lIEJMT0NLU19QRVJfUEFHRSAgKFBBR0VfQ0FDSEVfU0laRS81MTIpCiAjZGVmaW5lIFZNX0FDQ1Qoc2l6ZSkgICAgKFBBR0VfQ0FDSEVfQUxJR04oc2l6ZSkgPj4gUEFHRV9TSElGVCkKIAotLyogaW5mby0+ZmxhZ3MgbmVlZHMgVk1fZmxhZ3MgdG8gaGFuZGxlIHBhZ2Vpbi90cnVuY2F0ZSByYWNlcyBlZmZpY2llbnRseSAqLwotI2RlZmluZSBTSE1FTV9QQUdFSU4JIFZNX1JFQUQKLSNkZWZpbmUgU0hNRU1fVFJVTkNBVEUJIFZNX1dSSVRFCi0KLS8qIERlZmluaXRpb24gdG8gbGltaXQgc2htZW1fdHJ1bmNhdGUncyBzdGVwcyBiZXR3ZWVuIGNvbmRfcmVzY2hlZHMgKi8KLSNkZWZpbmUgTEFURU5DWV9MSU1JVAkgNjQKLQogLyogUHJldGVuZCB0aGF0IGVhY2ggZW50cnkgaXMgb2YgdGhpcyBzaXplIGluIGRpcmVjdG9yeSdzIGlfc2l6ZSAqLwogI2RlZmluZSBCT0dPX0RJUkVOVF9TSVpFIDIwCiAKKy8qIFN5bWxpbmsgdXAgdG8gdGhpcyBzaXplIGlzIGttYWxsb2MnZWQgaW5zdGVhZCBvZiB1c2luZyBhIHN3YXBwYWJsZSBwYWdlICovCisjZGVmaW5lIFNIT1JUX1NZTUxJTktfTEVOIDEyOAorCiBzdHJ1Y3Qgc2htZW1feGF0dHIgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJLyogYW5jaG9yZWQgYnkgc2htZW1faW5vZGVfaW5mby0+eGF0dHJfbGlzdCAqLwogCWNoYXIgKm5hbWU7CQkvKiB4YXR0ciBuYW1lICovCkBAIC0xMDcsNyArODMsNyBAQAogCWNoYXIgdmFsdWVbMF07CiB9OwogCi0vKiBGbGFnIGFsbG9jYXRpb24gcmVxdWlyZW1lbnRzIHRvIHNobWVtX2dldHBhZ2UgYW5kIHNobWVtX3N3cF9hbGxvYyAqLworLyogRmxhZyBhbGxvY2F0aW9uIHJlcXVpcmVtZW50cyB0byBzaG1lbV9nZXRwYWdlICovCiBlbnVtIHNncF90eXBlIHsKIAlTR1BfUkVBRCwJLyogZG9uJ3QgZXhjZWVkIGlfc2l6ZSwgZG9uJ3QgYWxsb2NhdGUgcGFnZSAqLwogCVNHUF9DQUNIRSwJLyogZG9uJ3QgZXhjZWVkIGlfc2l6ZSwgbWF5IGFsbG9jYXRlIHBhZ2UgKi8KQEAgLTEzNyw1NiArMTEzLDYgQEAKIAkJCW1hcHBpbmdfZ2ZwX21hc2soaW5vZGUtPmlfbWFwcGluZyksIGZhdWx0X3R5cGUpOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpzaG1lbV9kaXJfYWxsb2MoZ2ZwX3QgZ2ZwX21hc2spCi17Ci0JLyoKLQkgKiBUaGUgYWJvdmUgZGVmaW5pdGlvbiBvZiBFTlRSSUVTX1BFUl9QQUdFLCBhbmQgdGhlIHVzZSBvZgotCSAqIEJMT0NLU19QRVJfUEFHRSBvbiBpbmRpcmVjdCBwYWdlcywgYXNzdW1lIFBBR0VfQ0FDSEVfU0laRToKLQkgKiBtaWdodCBiZSByZWNvbnNpZGVyZWQgaWYgaXQgZXZlciBkaXZlcmdlcyBmcm9tIFBBR0VfU0laRS4KLQkgKgotCSAqIE1vYmlsaXR5IGZsYWdzIGFyZSBtYXNrZWQgb3V0IGFzIHN3YXAgdmVjdG9ycyBjYW5ub3QgbW92ZQotCSAqLwotCXJldHVybiBhbGxvY19wYWdlcygoZ2ZwX21hc2sgJiB+R0ZQX01PVkFCTEVfTUFTSykgfCBfX0dGUF9aRVJPLAotCQkJCVBBR0VfQ0FDSEVfU0hJRlQtUEFHRV9TSElGVCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzaG1lbV9kaXJfZnJlZShzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQlfX2ZyZWVfcGFnZXMocGFnZSwgUEFHRV9DQUNIRV9TSElGVC1QQUdFX1NISUZUKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwYWdlICoqc2htZW1fZGlyX21hcChzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQlyZXR1cm4gKHN0cnVjdCBwYWdlICoqKWttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIwKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNobWVtX2Rpcl91bm1hcChzdHJ1Y3QgcGFnZSAqKmRpcikKLXsKLQlrdW5tYXBfYXRvbWljKGRpciwgS01fVVNFUjApOwotfQotCi1zdGF0aWMgc3dwX2VudHJ5X3QgKnNobWVtX3N3cF9tYXAoc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JcmV0dXJuIChzd3BfZW50cnlfdCAqKWttYXBfYXRvbWljKHBhZ2UsIEtNX1VTRVIxKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNobWVtX3N3cF9iYWxhbmNlX3VubWFwKHZvaWQpCi17Ci0JLyoKLQkgKiBXaGVuIHBhc3NpbmcgYSBwb2ludGVyIHRvIGFuIGlfZGlyZWN0IGVudHJ5LCB0byBjb2RlIHdoaWNoCi0JICogYWxzbyBoYW5kbGVzIGluZGlyZWN0IGVudHJpZXMgYW5kIHNvIHdpbGwgc2htZW1fc3dwX3VubWFwLAotCSAqIHdlIG11c3QgYXJyYW5nZSBmb3IgdGhlIHByZWVtcHQgY291bnQgdG8gcmVtYWluIGluIGJhbGFuY2UuCi0JICogV2hhdCBrbWFwX2F0b21pYyBvZiBhIGxvd21lbSBwYWdlIGRvZXMgZGVwZW5kcyBvbiBjb25maWcKLQkgKiBhbmQgYXJjaGl0ZWN0dXJlLCBzbyBwcmV0ZW5kIHRvIGttYXBfYXRvbWljIHNvbWUgbG93bWVtIHBhZ2UuCi0JICovCi0JKHZvaWQpIGttYXBfYXRvbWljKFpFUk9fUEFHRSgwKSwgS01fVVNFUjEpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2htZW1fc3dwX3VubWFwKHN3cF9lbnRyeV90ICplbnRyeSkKLXsKLQlrdW5tYXBfYXRvbWljKGVudHJ5LCBLTV9VU0VSMSk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNobWVtX3NiX2luZm8gKlNITUVNX1NCKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCiB7CiAJcmV0dXJuIHNiLT5zX2ZzX2luZm87CkBAIC0yNDQsMTUgKzE3MCw2IEBACiBzdGF0aWMgTElTVF9IRUFEKHNobWVtX3N3YXBsaXN0KTsKIHN0YXRpYyBERUZJTkVfTVVURVgoc2htZW1fc3dhcGxpc3RfbXV0ZXgpOwogCi1zdGF0aWMgdm9pZCBzaG1lbV9mcmVlX2Jsb2NrcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb25nIHBhZ2VzKQotewotCXN0cnVjdCBzaG1lbV9zYl9pbmZvICpzYmluZm8gPSBTSE1FTV9TQihpbm9kZS0+aV9zYik7Ci0JaWYgKHNiaW5mby0+bWF4X2Jsb2NrcykgewotCQlwZXJjcHVfY291bnRlcl9hZGQoJnNiaW5mby0+dXNlZF9ibG9ja3MsIC1wYWdlcyk7Ci0JCWlub2RlLT5pX2Jsb2NrcyAtPSBwYWdlcypCTE9DS1NfUEVSX1BBR0U7Ci0JfQotfQotCiBzdGF0aWMgaW50IHNobWVtX3Jlc2VydmVfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKIAlzdHJ1Y3Qgc2htZW1fc2JfaW5mbyAqc2JpbmZvID0gU0hNRU1fU0Ioc2IpOwpAQCAtMjc5LDcgKzE5Niw3IEBACiB9CiAKIC8qKgotICogc2htZW1fcmVjYWxjX2lub2RlIC0gcmVjYWxjdWxhdGUgdGhlIHNpemUgb2YgYW4gaW5vZGUKKyAqIHNobWVtX3JlY2FsY19pbm9kZSAtIHJlY2FsY3VsYXRlIHRoZSBibG9jayB1c2FnZSBvZiBhbiBpbm9kZQogICogQGlub2RlOiBpbm9kZSB0byByZWNhbGMKICAqCiAgKiBXZSBoYXZlIHRvIGNhbGN1bGF0ZSB0aGUgZnJlZSBibG9ja3Mgc2luY2UgdGhlIG1tIGNhbiBkcm9wCkBAIC0yOTcsNDc0ICsyMTQsMjk3IEBACiAKIAlmcmVlZCA9IGluZm8tPmFsbG9jZWQgLSBpbmZvLT5zd2FwcGVkIC0gaW5vZGUtPmlfbWFwcGluZy0+bnJwYWdlczsKIAlpZiAoZnJlZWQgPiAwKSB7CisJCXN0cnVjdCBzaG1lbV9zYl9pbmZvICpzYmluZm8gPSBTSE1FTV9TQihpbm9kZS0+aV9zYik7CisJCWlmIChzYmluZm8tPm1heF9ibG9ja3MpCisJCQlwZXJjcHVfY291bnRlcl9hZGQoJnNiaW5mby0+dXNlZF9ibG9ja3MsIC1mcmVlZCk7CiAJCWluZm8tPmFsbG9jZWQgLT0gZnJlZWQ7CisJCWlub2RlLT5pX2Jsb2NrcyAtPSBmcmVlZCAqIEJMT0NLU19QRVJfUEFHRTsKIAkJc2htZW1fdW5hY2N0X2Jsb2NrcyhpbmZvLT5mbGFncywgZnJlZWQpOwotCQlzaG1lbV9mcmVlX2Jsb2Nrcyhpbm9kZSwgZnJlZWQpOwogCX0KIH0KIAotLyoqCi0gKiBzaG1lbV9zd3BfZW50cnkgLSBmaW5kIHRoZSBzd2FwIHZlY3RvciBwb3NpdGlvbiBpbiB0aGUgaW5mbyBzdHJ1Y3R1cmUKLSAqIEBpbmZvOiAgaW5mbyBzdHJ1Y3R1cmUgZm9yIHRoZSBpbm9kZQotICogQGluZGV4OiBpbmRleCBvZiB0aGUgcGFnZSB0byBmaW5kCi0gKiBAcGFnZTogIG9wdGlvbmFsIHBhZ2UgdG8gYWRkIHRvIHRoZSBzdHJ1Y3R1cmUuIEhhcyB0byBiZSBwcmVzZXQgdG8KLSAqICAgICAgICAgYWxsIHplcm9zCi0gKgotICogSWYgdGhlcmUgaXMgbm8gc3BhY2UgYWxsb2NhdGVkIHlldCBpdCB3aWxsIHJldHVybiBOVUxMIHdoZW4KLSAqIHBhZ2UgaXMgTlVMTCwgZWxzZSBpdCB3aWxsIHVzZSB0aGUgcGFnZSBmb3IgdGhlIG5lZWRlZCBibG9jaywKLSAqIHNldHRpbmcgaXQgdG8gTlVMTCBvbiByZXR1cm4gdG8gaW5kaWNhdGUgdGhhdCBpdCBoYXMgYmVlbiB1c2VkLgotICoKLSAqIFRoZSBzd2FwIHZlY3RvciBpcyBvcmdhbml6ZWQgdGhlIGZvbGxvd2luZyB3YXk6Ci0gKgotICogVGhlcmUgYXJlIFNITUVNX05SX0RJUkVDVCBlbnRyaWVzIGRpcmVjdGx5IHN0b3JlZCBpbiB0aGUKLSAqIHNobWVtX2lub2RlX2luZm8gc3RydWN0dXJlLiBTbyBzbWFsbCBmaWxlcyBkbyBub3QgbmVlZCBhbiBhZGRpb25hbAotICogYWxsb2NhdGlvbi4KLSAqCi0gKiBGb3IgcGFnZXMgd2l0aCBpbmRleCA+IFNITUVNX05SX0RJUkVDVCB0aGVyZSBpcyB0aGUgcG9pbnRlcgotICogaV9pbmRpcmVjdCB3aGljaCBwb2ludHMgdG8gYSBwYWdlIHdoaWNoIGhvbGRzIGluIHRoZSBmaXJzdCBoYWxmCi0gKiBkb3VibHkgaW5kaXJlY3QgYmxvY2tzLCBpbiB0aGUgc2Vjb25kIGhhbGYgdHJpcGxlIGluZGlyZWN0IGJsb2NrczoKLSAqCi0gKiBGb3IgYW4gYXJ0aWZpY2lhbCBFTlRSSUVTX1BFUl9QQUdFID0gNCB0aGlzIHdvdWxkIGxlYWQgdG8gdGhlCi0gKiBmb2xsb3dpbmcgbGF5b3V0IChmb3IgU0hNRU1fTlJfRElSRUNUID09IDE2KToKLSAqCi0gKiBpX2luZGlyZWN0IC0+IGRpciAtLT4gMTYtMTkKLSAqIAkgICAgICB8CSAgICAgKy0+IDIwLTIzCi0gKiAJICAgICAgfAotICogCSAgICAgICstLT5kaXIyIC0tPiAyNC0yNwotICogCSAgICAgIHwJICAgICAgICstPiAyOC0zMQotICogCSAgICAgIHwJICAgICAgICstPiAzMi0zNQotICogCSAgICAgIHwJICAgICAgICstPiAzNi0zOQotICogCSAgICAgIHwKLSAqIAkgICAgICArLS0+ZGlyMyAtLT4gNDAtNDMKLSAqIAkgICAgICAgCSAgICAgICArLT4gNDQtNDcKLSAqIAkgICAgICAJICAgICAgICstPiA0OC01MQotICogCSAgICAgIAkgICAgICAgKy0+IDUyLTU1CisvKgorICogUmVwbGFjZSBpdGVtIGV4cGVjdGVkIGluIHJhZGl4IHRyZWUgYnkgYSBuZXcgaXRlbSwgd2hpbGUgaG9sZGluZyB0cmVlIGxvY2suCiAgKi8KLXN0YXRpYyBzd3BfZW50cnlfdCAqc2htZW1fc3dwX2VudHJ5KHN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvICppbmZvLCB1bnNpZ25lZCBsb25nIGluZGV4LCBzdHJ1Y3QgcGFnZSAqKnBhZ2UpCitzdGF0aWMgaW50IHNobWVtX3JhZGl4X3RyZWVfcmVwbGFjZShzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCXBnb2ZmX3QgaW5kZXgsIHZvaWQgKmV4cGVjdGVkLCB2b2lkICpyZXBsYWNlbWVudCkKIHsKLQl1bnNpZ25lZCBsb25nIG9mZnNldDsKLQlzdHJ1Y3QgcGFnZSAqKmRpcjsKLQlzdHJ1Y3QgcGFnZSAqc3ViZGlyOworCXZvaWQgKipwc2xvdDsKKwl2b2lkICppdGVtID0gTlVMTDsKIAotCWlmIChpbmRleCA8IFNITUVNX05SX0RJUkVDVCkgewotCQlzaG1lbV9zd3BfYmFsYW5jZV91bm1hcCgpOwotCQlyZXR1cm4gaW5mby0+aV9kaXJlY3QraW5kZXg7Ci0JfQotCWlmICghaW5mby0+aV9pbmRpcmVjdCkgewotCQlpZiAocGFnZSkgewotCQkJaW5mby0+aV9pbmRpcmVjdCA9ICpwYWdlOwotCQkJKnBhZ2UgPSBOVUxMOworCVZNX0JVR19PTighZXhwZWN0ZWQpOworCXBzbG90ID0gcmFkaXhfdHJlZV9sb29rdXBfc2xvdCgmbWFwcGluZy0+cGFnZV90cmVlLCBpbmRleCk7CisJaWYgKHBzbG90KQorCQlpdGVtID0gcmFkaXhfdHJlZV9kZXJlZl9zbG90X3Byb3RlY3RlZChwc2xvdCwKKwkJCQkJCQkmbWFwcGluZy0+dHJlZV9sb2NrKTsKKwlpZiAoaXRlbSAhPSBleHBlY3RlZCkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJaWYgKHJlcGxhY2VtZW50KQorCQlyYWRpeF90cmVlX3JlcGxhY2Vfc2xvdChwc2xvdCwgcmVwbGFjZW1lbnQpOworCWVsc2UKKwkJcmFkaXhfdHJlZV9kZWxldGUoJm1hcHBpbmctPnBhZ2VfdHJlZSwgaW5kZXgpOworCXJldHVybiAwOworfQorCisvKgorICogTGlrZSBhZGRfdG9fcGFnZV9jYWNoZV9sb2NrZWQsIGJ1dCBlcnJvciBpZiBleHBlY3RlZCBpdGVtIGhhcyBnb25lLgorICovCitzdGF0aWMgaW50IHNobWVtX2FkZF90b19wYWdlX2NhY2hlKHN0cnVjdCBwYWdlICpwYWdlLAorCQkJCSAgIHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJCSAgIHBnb2ZmX3QgaW5kZXgsIGdmcF90IGdmcCwgdm9pZCAqZXhwZWN0ZWQpCit7CisJaW50IGVycm9yID0gMDsKKworCVZNX0JVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CisJVk1fQlVHX09OKCFQYWdlU3dhcEJhY2tlZChwYWdlKSk7CisKKwlpZiAoIWV4cGVjdGVkKQorCQllcnJvciA9IHJhZGl4X3RyZWVfcHJlbG9hZChnZnAgJiBHRlBfUkVDTEFJTV9NQVNLKTsKKwlpZiAoIWVycm9yKSB7CisJCXBhZ2VfY2FjaGVfZ2V0KHBhZ2UpOworCQlwYWdlLT5tYXBwaW5nID0gbWFwcGluZzsKKwkJcGFnZS0+aW5kZXggPSBpbmRleDsKKworCQlzcGluX2xvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOworCQlpZiAoIWV4cGVjdGVkKQorCQkJZXJyb3IgPSByYWRpeF90cmVlX2luc2VydCgmbWFwcGluZy0+cGFnZV90cmVlLAorCQkJCQkJCWluZGV4LCBwYWdlKTsKKwkJZWxzZQorCQkJZXJyb3IgPSBzaG1lbV9yYWRpeF90cmVlX3JlcGxhY2UobWFwcGluZywgaW5kZXgsCisJCQkJCQkJZXhwZWN0ZWQsIHBhZ2UpOworCQlpZiAoIWVycm9yKSB7CisJCQltYXBwaW5nLT5ucnBhZ2VzKys7CisJCQlfX2luY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfRklMRV9QQUdFUyk7CisJCQlfX2luY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfU0hNRU0pOworCQkJc3Bpbl91bmxvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOworCQl9IGVsc2UgeworCQkJcGFnZS0+bWFwcGluZyA9IE5VTEw7CisJCQlzcGluX3VubG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCX0KLQkJcmV0dXJuIE5VTEw7CQkJLyogbmVlZCBhbm90aGVyIHBhZ2UgKi8KKwkJaWYgKCFleHBlY3RlZCkKKwkJCXJhZGl4X3RyZWVfcHJlbG9hZF9lbmQoKTsKIAl9CisJaWYgKGVycm9yKQorCQltZW1fY2dyb3VwX3VuY2hhcmdlX2NhY2hlX3BhZ2UocGFnZSk7CisJcmV0dXJuIGVycm9yOworfQogCi0JaW5kZXggLT0gU0hNRU1fTlJfRElSRUNUOwotCW9mZnNldCA9IGluZGV4ICUgRU5UUklFU19QRVJfUEFHRTsKLQlpbmRleCAvPSBFTlRSSUVTX1BFUl9QQUdFOwotCWRpciA9IHNobWVtX2Rpcl9tYXAoaW5mby0+aV9pbmRpcmVjdCk7CisvKgorICogTGlrZSBkZWxldGVfZnJvbV9wYWdlX2NhY2hlLCBidXQgc3Vic3RpdHV0ZXMgc3dhcCBmb3IgcGFnZS4KKyAqLworc3RhdGljIHZvaWQgc2htZW1fZGVsZXRlX2Zyb21fcGFnZV9jYWNoZShzdHJ1Y3QgcGFnZSAqcGFnZSwgdm9pZCAqcmFkc3dhcCkKK3sKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHBhZ2UtPm1hcHBpbmc7CisJaW50IGVycm9yOwogCi0JaWYgKGluZGV4ID49IEVOVFJJRVNfUEVSX1BBR0UvMikgewotCQlpbmRleCAtPSBFTlRSSUVTX1BFUl9QQUdFLzI7Ci0JCWRpciArPSBFTlRSSUVTX1BFUl9QQUdFLzIgKyBpbmRleC9FTlRSSUVTX1BFUl9QQUdFOwotCQlpbmRleCAlPSBFTlRSSUVTX1BFUl9QQUdFOwotCQlzdWJkaXIgPSAqZGlyOwotCQlpZiAoIXN1YmRpcikgewotCQkJaWYgKHBhZ2UpIHsKLQkJCQkqZGlyID0gKnBhZ2U7Ci0JCQkJKnBhZ2UgPSBOVUxMOworCXNwaW5fbG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7CisJZXJyb3IgPSBzaG1lbV9yYWRpeF90cmVlX3JlcGxhY2UobWFwcGluZywgcGFnZS0+aW5kZXgsIHBhZ2UsIHJhZHN3YXApOworCXBhZ2UtPm1hcHBpbmcgPSBOVUxMOworCW1hcHBpbmctPm5ycGFnZXMtLTsKKwlfX2RlY196b25lX3BhZ2Vfc3RhdGUocGFnZSwgTlJfRklMRV9QQUdFUyk7CisJX19kZWNfem9uZV9wYWdlX3N0YXRlKHBhZ2UsIE5SX1NITUVNKTsKKwlzcGluX3VubG9ja19pcnEoJm1hcHBpbmctPnRyZWVfbG9jayk7CisJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCUJVR19PTihlcnJvcik7Cit9CisKKy8qCisgKiBMaWtlIGZpbmRfZ2V0X3BhZ2VzLCBidXQgY29sbGVjdGluZyBzd2FwIGVudHJpZXMgYXMgd2VsbCBhcyBwYWdlcy4KKyAqLworc3RhdGljIHVuc2lnbmVkIHNobWVtX2ZpbmRfZ2V0X3BhZ2VzX2FuZF9zd2FwKHN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nLAorCQkJCQlwZ29mZl90IHN0YXJ0LCB1bnNpZ25lZCBpbnQgbnJfcGFnZXMsCisJCQkJCXN0cnVjdCBwYWdlICoqcGFnZXMsIHBnb2ZmX3QgKmluZGljZXMpCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgbnJfZm91bmQ7CisKKwlyY3VfcmVhZF9sb2NrKCk7CityZXN0YXJ0OgorCW5yX2ZvdW5kID0gcmFkaXhfdHJlZV9nYW5nX2xvb2t1cF9zbG90KCZtYXBwaW5nLT5wYWdlX3RyZWUsCisJCQkJKHZvaWQgKioqKXBhZ2VzLCBpbmRpY2VzLCBzdGFydCwgbnJfcGFnZXMpOworCXJldCA9IDA7CisJZm9yIChpID0gMDsgaSA8IG5yX2ZvdW5kOyBpKyspIHsKKwkJc3RydWN0IHBhZ2UgKnBhZ2U7CityZXBlYXQ6CisJCXBhZ2UgPSByYWRpeF90cmVlX2RlcmVmX3Nsb3QoKHZvaWQgKiopcGFnZXNbaV0pOworCQlpZiAodW5saWtlbHkoIXBhZ2UpKQorCQkJY29udGludWU7CisJCWlmIChyYWRpeF90cmVlX2V4Y2VwdGlvbihwYWdlKSkgeworCQkJaWYgKHJhZGl4X3RyZWVfZGVyZWZfcmV0cnkocGFnZSkpCisJCQkJZ290byByZXN0YXJ0OworCQkJLyoKKwkJCSAqIE90aGVyd2lzZSwgd2UgbXVzdCBiZSBzdG9yaW5nIGEgc3dhcCBlbnRyeQorCQkJICogaGVyZSBhcyBhbiBleGNlcHRpb25hbCBlbnRyeTogc28gcmV0dXJuIGl0CisJCQkgKiB3aXRob3V0IGF0dGVtcHRpbmcgdG8gcmFpc2UgcGFnZSBjb3VudC4KKwkJCSAqLworCQkJZ290byBleHBvcnQ7CisJCX0KKwkJaWYgKCFwYWdlX2NhY2hlX2dldF9zcGVjdWxhdGl2ZShwYWdlKSkKKwkJCWdvdG8gcmVwZWF0OworCisJCS8qIEhhcyB0aGUgcGFnZSBtb3ZlZD8gKi8KKwkJaWYgKHVubGlrZWx5KHBhZ2UgIT0gKigodm9pZCAqKilwYWdlc1tpXSkpKSB7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CisJCQlnb3RvIHJlcGVhdDsKKwkJfQorZXhwb3J0OgorCQlpbmRpY2VzW3JldF0gPSBpbmRpY2VzW2ldOworCQlwYWdlc1tyZXRdID0gcGFnZTsKKwkJcmV0Kys7CisJfQorCWlmICh1bmxpa2VseSghcmV0ICYmIG5yX2ZvdW5kKSkKKwkJZ290byByZXN0YXJ0OworCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBSZW1vdmUgc3dhcCBlbnRyeSBmcm9tIHJhZGl4IHRyZWUsIGZyZWUgdGhlIHN3YXAgYW5kIGl0cyBwYWdlIGNhY2hlLgorICovCitzdGF0aWMgaW50IHNobWVtX2ZyZWVfc3dhcChzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZywKKwkJCSAgIHBnb2ZmX3QgaW5kZXgsIHZvaWQgKnJhZHN3YXApCit7CisJaW50IGVycm9yOworCisJc3Bpbl9sb2NrX2lycSgmbWFwcGluZy0+dHJlZV9sb2NrKTsKKwllcnJvciA9IHNobWVtX3JhZGl4X3RyZWVfcmVwbGFjZShtYXBwaW5nLCBpbmRleCwgcmFkc3dhcCwgTlVMTCk7CisJc3Bpbl91bmxvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOworCWlmICghZXJyb3IpCisJCWZyZWVfc3dhcF9hbmRfY2FjaGUocmFkaXhfdG9fc3dwX2VudHJ5KHJhZHN3YXApKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKKy8qCisgKiBQYWdldmVjIG1heSBjb250YWluIHN3YXAgZW50cmllcywgc28gc2h1ZmZsZSB1cCBwYWdlcyBiZWZvcmUgcmVsZWFzaW5nLgorICovCitzdGF0aWMgdm9pZCBzaG1lbV9wYWdldmVjX3JlbGVhc2Uoc3RydWN0IHBhZ2V2ZWMgKnB2ZWMpCit7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwLCBqID0gMDsgaSA8IHBhZ2V2ZWNfY291bnQocHZlYyk7IGkrKykgeworCQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IHB2ZWMtPnBhZ2VzW2ldOworCQlpZiAoIXJhZGl4X3RyZWVfZXhjZXB0aW9uYWxfZW50cnkocGFnZSkpCisJCQlwdmVjLT5wYWdlc1tqKytdID0gcGFnZTsKKwl9CisJcHZlYy0+bnIgPSBqOworCXBhZ2V2ZWNfcmVsZWFzZShwdmVjKTsKK30KKworLyoKKyAqIFJlbW92ZSByYW5nZSBvZiBwYWdlcyBhbmQgc3dhcCBlbnRyaWVzIGZyb20gcmFkaXggdHJlZSwgYW5kIGZyZWUgdGhlbS4KKyAqLwordm9pZCBzaG1lbV90cnVuY2F0ZV9yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3QgbHN0YXJ0LCBsb2ZmX3QgbGVuZCkKK3sKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CisJc3RydWN0IHNobWVtX2lub2RlX2luZm8gKmluZm8gPSBTSE1FTV9JKGlub2RlKTsKKwlwZ29mZl90IHN0YXJ0ID0gKGxzdGFydCArIFBBR0VfQ0FDSEVfU0laRSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CisJdW5zaWduZWQgcGFydGlhbCA9IGxzdGFydCAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKKwlwZ29mZl90IGVuZCA9IChsZW5kID4+IFBBR0VfQ0FDSEVfU0hJRlQpOworCXN0cnVjdCBwYWdldmVjIHB2ZWM7CisJcGdvZmZfdCBpbmRpY2VzW1BBR0VWRUNfU0laRV07CisJbG9uZyBucl9zd2Fwc19mcmVlZCA9IDA7CisJcGdvZmZfdCBpbmRleDsKKwlpbnQgaTsKKworCUJVR19PTigobGVuZCAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSkgIT0gKFBBR0VfQ0FDSEVfU0laRSAtIDEpKTsKKworCXBhZ2V2ZWNfaW5pdCgmcHZlYywgMCk7CisJaW5kZXggPSBzdGFydDsKKwl3aGlsZSAoaW5kZXggPD0gZW5kKSB7CisJCXB2ZWMubnIgPSBzaG1lbV9maW5kX2dldF9wYWdlc19hbmRfc3dhcChtYXBwaW5nLCBpbmRleCwKKwkJCW1pbihlbmQgLSBpbmRleCwgKHBnb2ZmX3QpUEFHRVZFQ19TSVpFIC0gMSkgKyAxLAorCQkJCQkJCXB2ZWMucGFnZXMsIGluZGljZXMpOworCQlpZiAoIXB2ZWMubnIpCisJCQlicmVhazsKKwkJbWVtX2Nncm91cF91bmNoYXJnZV9zdGFydCgpOworCQlmb3IgKGkgPSAwOyBpIDwgcGFnZXZlY19jb3VudCgmcHZlYyk7IGkrKykgeworCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwdmVjLnBhZ2VzW2ldOworCisJCQlpbmRleCA9IGluZGljZXNbaV07CisJCQlpZiAoaW5kZXggPiBlbmQpCisJCQkJYnJlYWs7CisKKwkJCWlmIChyYWRpeF90cmVlX2V4Y2VwdGlvbmFsX2VudHJ5KHBhZ2UpKSB7CisJCQkJbnJfc3dhcHNfZnJlZWQgKz0gIXNobWVtX2ZyZWVfc3dhcChtYXBwaW5nLAorCQkJCQkJCQlpbmRleCwgcGFnZSk7CisJCQkJY29udGludWU7CiAJCQl9Ci0JCQlzaG1lbV9kaXJfdW5tYXAoZGlyKTsKLQkJCXJldHVybiBOVUxMOwkJLyogbmVlZCBhbm90aGVyIHBhZ2UgKi8KKworCQkJaWYgKCF0cnlsb2NrX3BhZ2UocGFnZSkpCisJCQkJY29udGludWU7CisJCQlpZiAocGFnZS0+bWFwcGluZyA9PSBtYXBwaW5nKSB7CisJCQkJVk1fQlVHX09OKFBhZ2VXcml0ZWJhY2socGFnZSkpOworCQkJCXRydW5jYXRlX2lub2RlX3BhZ2UobWFwcGluZywgcGFnZSk7CisJCQl9CisJCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJfQotCQlzaG1lbV9kaXJfdW5tYXAoZGlyKTsKLQkJZGlyID0gc2htZW1fZGlyX21hcChzdWJkaXIpOworCQlzaG1lbV9wYWdldmVjX3JlbGVhc2UoJnB2ZWMpOworCQltZW1fY2dyb3VwX3VuY2hhcmdlX2VuZCgpOworCQljb25kX3Jlc2NoZWQoKTsKKwkJaW5kZXgrKzsKIAl9CiAKLQlkaXIgKz0gaW5kZXg7Ci0Jc3ViZGlyID0gKmRpcjsKLQlpZiAoIXN1YmRpcikgewotCQlpZiAoIXBhZ2UgfHwgIShzdWJkaXIgPSAqcGFnZSkpIHsKLQkJCXNobWVtX2Rpcl91bm1hcChkaXIpOwotCQkJcmV0dXJuIE5VTEw7CQkvKiBuZWVkIGEgcGFnZSAqLworCWlmIChwYXJ0aWFsKSB7CisJCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKKwkJc2htZW1fZ2V0cGFnZShpbm9kZSwgc3RhcnQgLSAxLCAmcGFnZSwgU0dQX1JFQUQsIE5VTEwpOworCQlpZiAocGFnZSkgeworCQkJemVyb191c2VyX3NlZ21lbnQocGFnZSwgcGFydGlhbCwgUEFHRV9DQUNIRV9TSVpFKTsKKwkJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CisJCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7CiAJCX0KLQkJKmRpciA9IHN1YmRpcjsKLQkJKnBhZ2UgPSBOVUxMOwogCX0KLQlzaG1lbV9kaXJfdW5tYXAoZGlyKTsKLQlyZXR1cm4gc2htZW1fc3dwX21hcChzdWJkaXIpICsgb2Zmc2V0OwotfQogCi1zdGF0aWMgdm9pZCBzaG1lbV9zd3Bfc2V0KHN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvICppbmZvLCBzd3BfZW50cnlfdCAqZW50cnksIHVuc2lnbmVkIGxvbmcgdmFsdWUpCi17Ci0JbG9uZyBpbmNkZWMgPSB2YWx1ZT8gMTogLTE7Ci0KLQllbnRyeS0+dmFsID0gdmFsdWU7Ci0JaW5mby0+c3dhcHBlZCArPSBpbmNkZWM7Ci0JaWYgKCh1bnNpZ25lZCBsb25nKShlbnRyeSAtIGluZm8tPmlfZGlyZWN0KSA+PSBTSE1FTV9OUl9ESVJFQ1QpIHsKLQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBrbWFwX2F0b21pY190b19wYWdlKGVudHJ5KTsKLQkJc2V0X3BhZ2VfcHJpdmF0ZShwYWdlLCBwYWdlX3ByaXZhdGUocGFnZSkgKyBpbmNkZWMpOwotCX0KLX0KLQotLyoqCi0gKiBzaG1lbV9zd3BfYWxsb2MgLSBnZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBzd2FwIGVudHJ5IGZvciB0aGUgcGFnZS4KLSAqIEBpbmZvOglpbmZvIHN0cnVjdHVyZSBmb3IgdGhlIGlub2RlCi0gKiBAaW5kZXg6CWluZGV4IG9mIHRoZSBwYWdlIHRvIGZpbmQKLSAqIEBzZ3A6CWNoZWNrIGFuZCByZWNoZWNrIGlfc2l6ZT8gc2tpcCBhbGxvY2F0aW9uPwotICogQGdmcDoJZ2ZwIG1hc2sgdG8gdXNlIGZvciBhbnkgcGFnZSBhbGxvY2F0aW9uCi0gKgotICogSWYgdGhlIGVudHJ5IGRvZXMgbm90IGV4aXN0LCBhbGxvY2F0ZSBpdC4KLSAqLwotc3RhdGljIHN3cF9lbnRyeV90ICpzaG1lbV9zd3BfYWxsb2Moc3RydWN0IHNobWVtX2lub2RlX2luZm8gKmluZm8sCi0JCQl1bnNpZ25lZCBsb25nIGluZGV4LCBlbnVtIHNncF90eXBlIHNncCwgZ2ZwX3QgZ2ZwKQotewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSAmaW5mby0+dmZzX2lub2RlOwotCXN0cnVjdCBzaG1lbV9zYl9pbmZvICpzYmluZm8gPSBTSE1FTV9TQihpbm9kZS0+aV9zYik7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwotCXN3cF9lbnRyeV90ICplbnRyeTsKLQotCWlmIChzZ3AgIT0gU0dQX1dSSVRFICYmCi0JICAgICgobG9mZl90KSBpbmRleCA8PCBQQUdFX0NBQ0hFX1NISUZUKSA+PSBpX3NpemVfcmVhZChpbm9kZSkpCi0JCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwotCi0Jd2hpbGUgKCEoZW50cnkgPSBzaG1lbV9zd3BfZW50cnkoaW5mbywgaW5kZXgsICZwYWdlKSkpIHsKLQkJaWYgKHNncCA9PSBTR1BfUkVBRCkKLQkJCXJldHVybiBzaG1lbV9zd3BfbWFwKFpFUk9fUEFHRSgwKSk7Ci0JCS8qCi0JCSAqIFRlc3QgdXNlZF9ibG9ja3MgYWdhaW5zdCAxIGxlc3MgbWF4X2Jsb2Nrcywgc2luY2Ugd2UgaGF2ZSAxIGRhdGEKLQkJICogcGFnZSAoYW5kIHBlcmhhcHMgaW5kaXJlY3QgaW5kZXggcGFnZXMpIHlldCB0byBhbGxvY2F0ZToKLQkJICogYSB3YXN0ZSB0byBhbGxvY2F0ZSBpbmRleCBpZiB3ZSBjYW5ub3QgYWxsb2NhdGUgZGF0YS4KLQkJICovCi0JCWlmIChzYmluZm8tPm1heF9ibG9ja3MpIHsKLQkJCWlmIChwZXJjcHVfY291bnRlcl9jb21wYXJlKCZzYmluZm8tPnVzZWRfYmxvY2tzLAotCQkJCQkJc2JpbmZvLT5tYXhfYmxvY2tzIC0gMSkgPj0gMCkKLQkJCQlyZXR1cm4gRVJSX1BUUigtRU5PU1BDKTsKLQkJCXBlcmNwdV9jb3VudGVyX2luYygmc2JpbmZvLT51c2VkX2Jsb2Nrcyk7Ci0JCQlpbm9kZS0+aV9ibG9ja3MgKz0gQkxPQ0tTX1BFUl9QQUdFOworCWluZGV4ID0gc3RhcnQ7CisJZm9yICggOyA7ICkgeworCQljb25kX3Jlc2NoZWQoKTsKKwkJcHZlYy5uciA9IHNobWVtX2ZpbmRfZ2V0X3BhZ2VzX2FuZF9zd2FwKG1hcHBpbmcsIGluZGV4LAorCQkJbWluKGVuZCAtIGluZGV4LCAocGdvZmZfdClQQUdFVkVDX1NJWkUgLSAxKSArIDEsCisJCQkJCQkJcHZlYy5wYWdlcywgaW5kaWNlcyk7CisJCWlmICghcHZlYy5ucikgeworCQkJaWYgKGluZGV4ID09IHN0YXJ0KQorCQkJCWJyZWFrOworCQkJaW5kZXggPSBzdGFydDsKKwkJCWNvbnRpbnVlOwogCQl9Ci0KLQkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotCQlwYWdlID0gc2htZW1fZGlyX2FsbG9jKGdmcCk7Ci0JCXNwaW5fbG9jaygmaW5mby0+bG9jayk7Ci0KLQkJaWYgKCFwYWdlKSB7Ci0JCQlzaG1lbV9mcmVlX2Jsb2Nrcyhpbm9kZSwgMSk7Ci0JCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKLQkJfQotCQlpZiAoc2dwICE9IFNHUF9XUklURSAmJgotCQkgICAgKChsb2ZmX3QpIGluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpID49IGlfc2l6ZV9yZWFkKGlub2RlKSkgewotCQkJZW50cnkgPSBFUlJfUFRSKC1FSU5WQUwpOworCQlpZiAoaW5kZXggPT0gc3RhcnQgJiYgaW5kaWNlc1swXSA+IGVuZCkgeworCQkJc2htZW1fcGFnZXZlY19yZWxlYXNlKCZwdmVjKTsKIAkJCWJyZWFrOwogCQl9Ci0JCWlmIChpbmZvLT5uZXh0X2luZGV4IDw9IGluZGV4KQotCQkJaW5mby0+bmV4dF9pbmRleCA9IGluZGV4ICsgMTsKLQl9Ci0JaWYgKHBhZ2UpIHsKLQkJLyogYW5vdGhlciB0YXNrIGdhdmUgaXRzIHBhZ2UsIG9yIHRydW5jYXRlZCB0aGUgZmlsZSAqLwotCQlzaG1lbV9mcmVlX2Jsb2Nrcyhpbm9kZSwgMSk7Ci0JCXNobWVtX2Rpcl9mcmVlKHBhZ2UpOwotCX0KLQlpZiAoaW5mby0+bmV4dF9pbmRleCA8PSBpbmRleCAmJiAhSVNfRVJSKGVudHJ5KSkKLQkJaW5mby0+bmV4dF9pbmRleCA9IGluZGV4ICsgMTsKLQlyZXR1cm4gZW50cnk7Ci19CisJCW1lbV9jZ3JvdXBfdW5jaGFyZ2Vfc3RhcnQoKTsKKwkJZm9yIChpID0gMDsgaSA8IHBhZ2V2ZWNfY291bnQoJnB2ZWMpOyBpKyspIHsKKwkJCXN0cnVjdCBwYWdlICpwYWdlID0gcHZlYy5wYWdlc1tpXTsKIAotLyoqCi0gKiBzaG1lbV9mcmVlX3N3cCAtIGZyZWUgc29tZSBzd2FwIGVudHJpZXMgaW4gYSBkaXJlY3RvcnkKLSAqIEBkaXI6ICAgICAgICBwb2ludGVyIHRvIHRoZSBkaXJlY3RvcnkKLSAqIEBlZGlyOiAgICAgICBwb2ludGVyIGFmdGVyIGxhc3QgZW50cnkgb2YgdGhlIGRpcmVjdG9yeQotICogQHB1bmNoX2xvY2s6IHBvaW50ZXIgdG8gc3BpbmxvY2sgd2hlbiBuZWVkZWQgZm9yIHRoZSBob2xlcHVuY2ggY2FzZQotICovCi1zdGF0aWMgaW50IHNobWVtX2ZyZWVfc3dwKHN3cF9lbnRyeV90ICpkaXIsIHN3cF9lbnRyeV90ICplZGlyLAotCQkJCQkJc3BpbmxvY2tfdCAqcHVuY2hfbG9jaykKLXsKLQlzcGlubG9ja190ICpwdW5jaF91bmxvY2sgPSBOVUxMOwotCXN3cF9lbnRyeV90ICpwdHI7Ci0JaW50IGZyZWVkID0gMDsKKwkJCWluZGV4ID0gaW5kaWNlc1tpXTsKKwkJCWlmIChpbmRleCA+IGVuZCkKKwkJCQlicmVhazsKIAotCWZvciAocHRyID0gZGlyOyBwdHIgPCBlZGlyOyBwdHIrKykgewotCQlpZiAocHRyLT52YWwpIHsKLQkJCWlmICh1bmxpa2VseShwdW5jaF9sb2NrKSkgewotCQkJCXB1bmNoX3VubG9jayA9IHB1bmNoX2xvY2s7Ci0JCQkJcHVuY2hfbG9jayA9IE5VTEw7Ci0JCQkJc3Bpbl9sb2NrKHB1bmNoX3VubG9jayk7Ci0JCQkJaWYgKCFwdHItPnZhbCkKLQkJCQkJY29udGludWU7CisJCQlpZiAocmFkaXhfdHJlZV9leGNlcHRpb25hbF9lbnRyeShwYWdlKSkgeworCQkJCW5yX3N3YXBzX2ZyZWVkICs9ICFzaG1lbV9mcmVlX3N3YXAobWFwcGluZywKKwkJCQkJCQkJaW5kZXgsIHBhZ2UpOworCQkJCWNvbnRpbnVlOwogCQkJfQotCQkJZnJlZV9zd2FwX2FuZF9jYWNoZSgqcHRyKTsKLQkJCSpwdHIgPSAoc3dwX2VudHJ5X3QpezB9OwotCQkJZnJlZWQrKzsKLQkJfQotCX0KLQlpZiAocHVuY2hfdW5sb2NrKQotCQlzcGluX3VubG9jayhwdW5jaF91bmxvY2spOwotCXJldHVybiBmcmVlZDsKLX0KIAotc3RhdGljIGludCBzaG1lbV9tYXBfYW5kX2ZyZWVfc3dwKHN0cnVjdCBwYWdlICpzdWJkaXIsIGludCBvZmZzZXQsCi0JCWludCBsaW1pdCwgc3RydWN0IHBhZ2UgKioqZGlyLCBzcGlubG9ja190ICpwdW5jaF9sb2NrKQotewotCXN3cF9lbnRyeV90ICpwdHI7Ci0JaW50IGZyZWVkID0gMDsKLQotCXB0ciA9IHNobWVtX3N3cF9tYXAoc3ViZGlyKTsKLQlmb3IgKDsgb2Zmc2V0IDwgbGltaXQ7IG9mZnNldCArPSBMQVRFTkNZX0xJTUlUKSB7Ci0JCWludCBzaXplID0gbGltaXQgLSBvZmZzZXQ7Ci0JCWlmIChzaXplID4gTEFURU5DWV9MSU1JVCkKLQkJCXNpemUgPSBMQVRFTkNZX0xJTUlUOwotCQlmcmVlZCArPSBzaG1lbV9mcmVlX3N3cChwdHIrb2Zmc2V0LCBwdHIrb2Zmc2V0K3NpemUsCi0JCQkJCQkJcHVuY2hfbG9jayk7Ci0JCWlmIChuZWVkX3Jlc2NoZWQoKSkgewotCQkJc2htZW1fc3dwX3VubWFwKHB0cik7Ci0JCQlpZiAoKmRpcikgewotCQkJCXNobWVtX2Rpcl91bm1hcCgqZGlyKTsKLQkJCQkqZGlyID0gTlVMTDsKKwkJCWxvY2tfcGFnZShwYWdlKTsKKwkJCWlmIChwYWdlLT5tYXBwaW5nID09IG1hcHBpbmcpIHsKKwkJCQlWTV9CVUdfT04oUGFnZVdyaXRlYmFjayhwYWdlKSk7CisJCQkJdHJ1bmNhdGVfaW5vZGVfcGFnZShtYXBwaW5nLCBwYWdlKTsKIAkJCX0KLQkJCWNvbmRfcmVzY2hlZCgpOwotCQkJcHRyID0gc2htZW1fc3dwX21hcChzdWJkaXIpOworCQkJdW5sb2NrX3BhZ2UocGFnZSk7CiAJCX0KLQl9Ci0Jc2htZW1fc3dwX3VubWFwKHB0cik7Ci0JcmV0dXJuIGZyZWVkOwotfQotCi1zdGF0aWMgdm9pZCBzaG1lbV9mcmVlX3BhZ2VzKHN0cnVjdCBsaXN0X2hlYWQgKm5leHQpCi17Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JaW50IGZyZWVkID0gMDsKLQotCWRvIHsKLQkJcGFnZSA9IGNvbnRhaW5lcl9vZihuZXh0LCBzdHJ1Y3QgcGFnZSwgbHJ1KTsKLQkJbmV4dCA9IG5leHQtPm5leHQ7Ci0JCXNobWVtX2Rpcl9mcmVlKHBhZ2UpOwotCQlmcmVlZCsrOwotCQlpZiAoZnJlZWQgPj0gTEFURU5DWV9MSU1JVCkgewotCQkJY29uZF9yZXNjaGVkKCk7Ci0JCQlmcmVlZCA9IDA7Ci0JCX0KLQl9IHdoaWxlIChuZXh0KTsKLX0KLQotdm9pZCBzaG1lbV90cnVuY2F0ZV9yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQpCi17Ci0Jc3RydWN0IHNobWVtX2lub2RlX2luZm8gKmluZm8gPSBTSE1FTV9JKGlub2RlKTsKLQl1bnNpZ25lZCBsb25nIGlkeDsKLQl1bnNpZ25lZCBsb25nIHNpemU7Ci0JdW5zaWduZWQgbG9uZyBsaW1pdDsKLQl1bnNpZ25lZCBsb25nIHN0YWdlOwotCXVuc2lnbmVkIGxvbmcgZGlyb2ZmOwotCXN0cnVjdCBwYWdlICoqZGlyOwotCXN0cnVjdCBwYWdlICp0b3BkaXI7Ci0Jc3RydWN0IHBhZ2UgKm1pZGRpcjsKLQlzdHJ1Y3QgcGFnZSAqc3ViZGlyOwotCXN3cF9lbnRyeV90ICpwdHI7Ci0JTElTVF9IRUFEKHBhZ2VzX3RvX2ZyZWUpOwotCWxvbmcgbnJfcGFnZXNfdG9fZnJlZSA9IDA7Ci0JbG9uZyBucl9zd2Fwc19mcmVlZCA9IDA7Ci0JaW50IG9mZnNldDsKLQlpbnQgZnJlZWQ7Ci0JaW50IHB1bmNoX2hvbGU7Ci0Jc3BpbmxvY2tfdCAqbmVlZHNfbG9jazsKLQlzcGlubG9ja190ICpwdW5jaF9sb2NrOwotCXVuc2lnbmVkIGxvbmcgdXBwZXJfbGltaXQ7Ci0KLQl0cnVuY2F0ZV9pbm9kZV9wYWdlc19yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBzdGFydCwgZW5kKTsKLQotCWlub2RlLT5pX2N0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUU7Ci0JaWR4ID0gKHN0YXJ0ICsgUEFHRV9DQUNIRV9TSVpFIC0gMSkgPj4gUEFHRV9DQUNIRV9TSElGVDsKLQlpZiAoaWR4ID49IGluZm8tPm5leHRfaW5kZXgpCi0JCXJldHVybjsKLQotCXNwaW5fbG9jaygmaW5mby0+bG9jayk7Ci0JaW5mby0+ZmxhZ3MgfD0gU0hNRU1fVFJVTkNBVEU7Ci0JaWYgKGxpa2VseShlbmQgPT0gKGxvZmZfdCkgLTEpKSB7Ci0JCWxpbWl0ID0gaW5mby0+bmV4dF9pbmRleDsKLQkJdXBwZXJfbGltaXQgPSBTSE1FTV9NQVhfSU5ERVg7Ci0JCWluZm8tPm5leHRfaW5kZXggPSBpZHg7Ci0JCW5lZWRzX2xvY2sgPSBOVUxMOwotCQlwdW5jaF9ob2xlID0gMDsKLQl9IGVsc2UgewotCQlpZiAoZW5kICsgMSA+PSBpbm9kZS0+aV9zaXplKSB7CS8qIHdlIG1heSBmcmVlIGEgbGl0dGxlIG1vcmUgKi8KLQkJCWxpbWl0ID0gKGlub2RlLT5pX3NpemUgKyBQQUdFX0NBQ0hFX1NJWkUgLSAxKSA+PgotCQkJCQkJCVBBR0VfQ0FDSEVfU0hJRlQ7Ci0JCQl1cHBlcl9saW1pdCA9IFNITUVNX01BWF9JTkRFWDsKLQkJfSBlbHNlIHsKLQkJCWxpbWl0ID0gKGVuZCArIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7Ci0JCQl1cHBlcl9saW1pdCA9IGxpbWl0OwotCQl9Ci0JCW5lZWRzX2xvY2sgPSAmaW5mby0+bG9jazsKLQkJcHVuY2hfaG9sZSA9IDE7Ci0JfQotCi0JdG9wZGlyID0gaW5mby0+aV9pbmRpcmVjdDsKLQlpZiAodG9wZGlyICYmIGlkeCA8PSBTSE1FTV9OUl9ESVJFQ1QgJiYgIXB1bmNoX2hvbGUpIHsKLQkJaW5mby0+aV9pbmRpcmVjdCA9IE5VTEw7Ci0JCW5yX3BhZ2VzX3RvX2ZyZWUrKzsKLQkJbGlzdF9hZGQoJnRvcGRpci0+bHJ1LCAmcGFnZXNfdG9fZnJlZSk7Ci0JfQotCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKLQotCWlmIChpbmZvLT5zd2FwcGVkICYmIGlkeCA8IFNITUVNX05SX0RJUkVDVCkgewotCQlwdHIgPSBpbmZvLT5pX2RpcmVjdDsKLQkJc2l6ZSA9IGxpbWl0OwotCQlpZiAoc2l6ZSA+IFNITUVNX05SX0RJUkVDVCkKLQkJCXNpemUgPSBTSE1FTV9OUl9ESVJFQ1Q7Ci0JCW5yX3N3YXBzX2ZyZWVkID0gc2htZW1fZnJlZV9zd3AocHRyK2lkeCwgcHRyK3NpemUsIG5lZWRzX2xvY2spOwotCX0KLQotCS8qCi0JICogSWYgdGhlcmUgYXJlIG5vIGluZGlyZWN0IGJsb2NrcyBvciB3ZSBhcmUgcHVuY2hpbmcgYSBob2xlCi0JICogYmVsb3cgaW5kaXJlY3QgYmxvY2tzLCBub3RoaW5nIHRvIGJlIGRvbmUuCi0JICovCi0JaWYgKCF0b3BkaXIgfHwgbGltaXQgPD0gU0hNRU1fTlJfRElSRUNUKQotCQlnb3RvIGRvbmUyOwotCi0JLyoKLQkgKiBUaGUgdHJ1bmNhdGlvbiBjYXNlIGhhcyBhbHJlYWR5IGRyb3BwZWQgaW5mby0+bG9jaywgYW5kIHdlJ3JlIHNhZmUKLQkgKiBiZWNhdXNlIGlfc2l6ZSBhbmQgbmV4dF9pbmRleCBoYXZlIGFscmVhZHkgYmVlbiBsb3dlcmVkLCBwcmV2ZW50aW5nCi0JICogYWNjZXNzIGJleW9uZC4gIEJ1dCBpbiB0aGUgcHVuY2hfaG9sZSBjYXNlLCB3ZSBzdGlsbCBuZWVkIHRvIHRha2UKLQkgKiB0aGUgbG9jayB3aGVuIHVwZGF0aW5nIHRoZSBzd2FwIGRpcmVjdG9yeSwgYmVjYXVzZSB0aGVyZSBtaWdodCBiZQotCSAqIHJhY2luZyBhY2Nlc3NlcyBieSBzaG1lbV9nZXRwYWdlKFNHUF9DQUNIRSksIHNobWVtX3VudXNlX2lub2RlIG9yCi0JICogc2htZW1fd3JpdGVwYWdlLiAgSG93ZXZlciwgd2hlbmV2ZXIgd2UgZmluZCB3ZSBjYW4gcmVtb3ZlIGEgd2hvbGUKLQkgKiBkaXJlY3RvcnkgcGFnZSAobm90IGF0IHRoZSBtaXNhbGlnbmVkIHN0YXJ0IG9yIGVuZCBvZiB0aGUgcmFuZ2UpLAotCSAqIHdlIGZpcnN0IE5VTExpZnkgaXRzIHBvaW50ZXIgaW4gdGhlIGxldmVsIGFib3ZlLCBhbmQgdGhlbiBoYXZlIG5vCi0JICogbmVlZCB0byB0YWtlIHRoZSBsb2NrIHdoZW4gdXBkYXRpbmcgaXRzIGNvbnRlbnRzOiBuZWVkc19sb2NrIGFuZAotCSAqIHB1bmNoX2xvY2sgKGVpdGhlciBwb2ludGluZyB0byBpbmZvLT5sb2NrIG9yIE5VTEwpIG1hbmFnZSB0aGlzLgotCSAqLwotCi0JdXBwZXJfbGltaXQgLT0gU0hNRU1fTlJfRElSRUNUOwotCWxpbWl0IC09IFNITUVNX05SX0RJUkVDVDsKLQlpZHggPSAoaWR4ID4gU0hNRU1fTlJfRElSRUNUKT8gKGlkeCAtIFNITUVNX05SX0RJUkVDVCk6IDA7Ci0Jb2Zmc2V0ID0gaWR4ICUgRU5UUklFU19QRVJfUEFHRTsKLQlpZHggLT0gb2Zmc2V0OwotCi0JZGlyID0gc2htZW1fZGlyX21hcCh0b3BkaXIpOwotCXN0YWdlID0gRU5UUklFU19QRVJfUEFHRVBBR0UvMjsKLQlpZiAoaWR4IDwgRU5UUklFU19QRVJfUEFHRVBBR0UvMikgewotCQltaWRkaXIgPSB0b3BkaXI7Ci0JCWRpcm9mZiA9IGlkeC9FTlRSSUVTX1BFUl9QQUdFOwotCX0gZWxzZSB7Ci0JCWRpciArPSBFTlRSSUVTX1BFUl9QQUdFLzI7Ci0JCWRpciArPSAoaWR4IC0gRU5UUklFU19QRVJfUEFHRVBBR0UvMikvRU5UUklFU19QRVJfUEFHRVBBR0U7Ci0JCXdoaWxlIChzdGFnZSA8PSBpZHgpCi0JCQlzdGFnZSArPSBFTlRSSUVTX1BFUl9QQUdFUEFHRTsKLQkJbWlkZGlyID0gKmRpcjsKLQkJaWYgKCpkaXIpIHsKLQkJCWRpcm9mZiA9ICgoaWR4IC0gRU5UUklFU19QRVJfUEFHRVBBR0UvMikgJQotCQkJCUVOVFJJRVNfUEVSX1BBR0VQQUdFKSAvIEVOVFJJRVNfUEVSX1BBR0U7Ci0JCQlpZiAoIWRpcm9mZiAmJiAhb2Zmc2V0ICYmIHVwcGVyX2xpbWl0ID49IHN0YWdlKSB7Ci0JCQkJaWYgKG5lZWRzX2xvY2spIHsKLQkJCQkJc3Bpbl9sb2NrKG5lZWRzX2xvY2spOwotCQkJCQkqZGlyID0gTlVMTDsKLQkJCQkJc3Bpbl91bmxvY2sobmVlZHNfbG9jayk7Ci0JCQkJCW5lZWRzX2xvY2sgPSBOVUxMOwotCQkJCX0gZWxzZQotCQkJCQkqZGlyID0gTlVMTDsKLQkJCQlucl9wYWdlc190b19mcmVlKys7Ci0JCQkJbGlzdF9hZGQoJm1pZGRpci0+bHJ1LCAmcGFnZXNfdG9fZnJlZSk7Ci0JCQl9Ci0JCQlzaG1lbV9kaXJfdW5tYXAoZGlyKTsKLQkJCWRpciA9IHNobWVtX2Rpcl9tYXAobWlkZGlyKTsKLQkJfSBlbHNlIHsKLQkJCWRpcm9mZiA9IDA7Ci0JCQlvZmZzZXQgPSAwOwotCQkJaWR4ID0gc3RhZ2U7Ci0JCX0KLQl9Ci0KLQlmb3IgKDsgaWR4IDwgbGltaXQ7IGlkeCArPSBFTlRSSUVTX1BFUl9QQUdFLCBkaXJvZmYrKykgewotCQlpZiAodW5saWtlbHkoaWR4ID09IHN0YWdlKSkgewotCQkJc2htZW1fZGlyX3VubWFwKGRpcik7Ci0JCQlkaXIgPSBzaG1lbV9kaXJfbWFwKHRvcGRpcikgKwotCQkJICAgIEVOVFJJRVNfUEVSX1BBR0UvMiArIGlkeC9FTlRSSUVTX1BFUl9QQUdFUEFHRTsKLQkJCXdoaWxlICghKmRpcikgewotCQkJCWRpcisrOwotCQkJCWlkeCArPSBFTlRSSUVTX1BFUl9QQUdFUEFHRTsKLQkJCQlpZiAoaWR4ID49IGxpbWl0KQotCQkJCQlnb3RvIGRvbmUxOwotCQkJfQotCQkJc3RhZ2UgPSBpZHggKyBFTlRSSUVTX1BFUl9QQUdFUEFHRTsKLQkJCW1pZGRpciA9ICpkaXI7Ci0JCQlpZiAocHVuY2hfaG9sZSkKLQkJCQluZWVkc19sb2NrID0gJmluZm8tPmxvY2s7Ci0JCQlpZiAodXBwZXJfbGltaXQgPj0gc3RhZ2UpIHsKLQkJCQlpZiAobmVlZHNfbG9jaykgewotCQkJCQlzcGluX2xvY2sobmVlZHNfbG9jayk7Ci0JCQkJCSpkaXIgPSBOVUxMOwotCQkJCQlzcGluX3VubG9jayhuZWVkc19sb2NrKTsKLQkJCQkJbmVlZHNfbG9jayA9IE5VTEw7Ci0JCQkJfSBlbHNlCi0JCQkJCSpkaXIgPSBOVUxMOwotCQkJCW5yX3BhZ2VzX3RvX2ZyZWUrKzsKLQkJCQlsaXN0X2FkZCgmbWlkZGlyLT5scnUsICZwYWdlc190b19mcmVlKTsKLQkJCX0KLQkJCXNobWVtX2Rpcl91bm1hcChkaXIpOwotCQkJY29uZF9yZXNjaGVkKCk7Ci0JCQlkaXIgPSBzaG1lbV9kaXJfbWFwKG1pZGRpcik7Ci0JCQlkaXJvZmYgPSAwOwotCQl9Ci0JCXB1bmNoX2xvY2sgPSBuZWVkc19sb2NrOwotCQlzdWJkaXIgPSBkaXJbZGlyb2ZmXTsKLQkJaWYgKHN1YmRpciAmJiAhb2Zmc2V0ICYmIHVwcGVyX2xpbWl0LWlkeCA+PSBFTlRSSUVTX1BFUl9QQUdFKSB7Ci0JCQlpZiAobmVlZHNfbG9jaykgewotCQkJCXNwaW5fbG9jayhuZWVkc19sb2NrKTsKLQkJCQlkaXJbZGlyb2ZmXSA9IE5VTEw7Ci0JCQkJc3Bpbl91bmxvY2sobmVlZHNfbG9jayk7Ci0JCQkJcHVuY2hfbG9jayA9IE5VTEw7Ci0JCQl9IGVsc2UKLQkJCQlkaXJbZGlyb2ZmXSA9IE5VTEw7Ci0JCQlucl9wYWdlc190b19mcmVlKys7Ci0JCQlsaXN0X2FkZCgmc3ViZGlyLT5scnUsICZwYWdlc190b19mcmVlKTsKLQkJfQotCQlpZiAoc3ViZGlyICYmIHBhZ2VfcHJpdmF0ZShzdWJkaXIpIC8qIGhhcyBzd2FwIGVudHJpZXMgKi8pIHsKLQkJCXNpemUgPSBsaW1pdCAtIGlkeDsKLQkJCWlmIChzaXplID4gRU5UUklFU19QRVJfUEFHRSkKLQkJCQlzaXplID0gRU5UUklFU19QRVJfUEFHRTsKLQkJCWZyZWVkID0gc2htZW1fbWFwX2FuZF9mcmVlX3N3cChzdWJkaXIsCi0JCQkJCW9mZnNldCwgc2l6ZSwgJmRpciwgcHVuY2hfbG9jayk7Ci0JCQlpZiAoIWRpcikKLQkJCQlkaXIgPSBzaG1lbV9kaXJfbWFwKG1pZGRpcik7Ci0JCQlucl9zd2Fwc19mcmVlZCArPSBmcmVlZDsKLQkJCWlmIChvZmZzZXQgfHwgcHVuY2hfbG9jaykgewotCQkJCXNwaW5fbG9jaygmaW5mby0+bG9jayk7Ci0JCQkJc2V0X3BhZ2VfcHJpdmF0ZShzdWJkaXIsCi0JCQkJCXBhZ2VfcHJpdmF0ZShzdWJkaXIpIC0gZnJlZWQpOwotCQkJCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKLQkJCX0gZWxzZQotCQkJCUJVR19PTihwYWdlX3ByaXZhdGUoc3ViZGlyKSAhPSBmcmVlZCk7Ci0JCX0KLQkJb2Zmc2V0ID0gMDsKLQl9Ci1kb25lMToKLQlzaG1lbV9kaXJfdW5tYXAoZGlyKTsKLWRvbmUyOgotCWlmIChpbm9kZS0+aV9tYXBwaW5nLT5ucnBhZ2VzICYmIChpbmZvLT5mbGFncyAmIFNITUVNX1BBR0VJTikpIHsKLQkJLyoKLQkJICogQ2FsbCB0cnVuY2F0ZV9pbm9kZV9wYWdlcyBhZ2FpbjogcmFjaW5nIHNobWVtX3VudXNlX2lub2RlCi0JCSAqIG1heSBoYXZlIHN3aXp6bGVkIGEgcGFnZSBpbiBmcm9tIHN3YXAgc2luY2UKLQkJICogdHJ1bmNhdGVfcGFnZWNhY2hlIG9yIGdlbmVyaWNfZGVsZXRlX2lub2RlIGRpZCBpdCwgYmVmb3JlIHdlCi0JCSAqIGxvd2VyZWQgbmV4dF9pbmRleC4gIEFsc28sIHRob3VnaCBzaG1lbV9nZXRwYWdlIGNoZWNrcwotCQkgKiBpX3NpemUgYmVmb3JlIGFkZGluZyB0byBjYWNoZSwgbm8gcmVjaGVjayBhZnRlcjogc28gZml4IHRoZQotCQkgKiBuYXJyb3cgd2luZG93IHRoZXJlIHRvby4KLQkJICovCi0JCXRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIHN0YXJ0LCBlbmQpOworCQlzaG1lbV9wYWdldmVjX3JlbGVhc2UoJnB2ZWMpOworCQltZW1fY2dyb3VwX3VuY2hhcmdlX2VuZCgpOworCQlpbmRleCsrOwogCX0KIAogCXNwaW5fbG9jaygmaW5mby0+bG9jayk7Ci0JaW5mby0+ZmxhZ3MgJj0gflNITUVNX1RSVU5DQVRFOwogCWluZm8tPnN3YXBwZWQgLT0gbnJfc3dhcHNfZnJlZWQ7Ci0JaWYgKG5yX3BhZ2VzX3RvX2ZyZWUpCi0JCXNobWVtX2ZyZWVfYmxvY2tzKGlub2RlLCBucl9wYWdlc190b19mcmVlKTsKIAlzaG1lbV9yZWNhbGNfaW5vZGUoaW5vZGUpOwogCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKIAotCS8qCi0JICogRW1wdHkgc3dhcCB2ZWN0b3IgZGlyZWN0b3J5IHBhZ2VzIHRvIGJlIGZyZWVkPwotCSAqLwotCWlmICghbGlzdF9lbXB0eSgmcGFnZXNfdG9fZnJlZSkpIHsKLQkJcGFnZXNfdG9fZnJlZS5wcmV2LT5uZXh0ID0gTlVMTDsKLQkJc2htZW1fZnJlZV9wYWdlcyhwYWdlc190b19mcmVlLm5leHQpOwotCX0KKwlpbm9kZS0+aV9jdGltZSA9IGlub2RlLT5pX210aW1lID0gQ1VSUkVOVF9USU1FOwogfQogRVhQT1JUX1NZTUJPTF9HUEwoc2htZW1fdHJ1bmNhdGVfcmFuZ2UpOwogCkBAIC03ODAsMzcgKzUyMCw3IEBACiAJaWYgKFNfSVNSRUcoaW5vZGUtPmlfbW9kZSkgJiYgKGF0dHItPmlhX3ZhbGlkICYgQVRUUl9TSVpFKSkgewogCQlsb2ZmX3Qgb2xkc2l6ZSA9IGlub2RlLT5pX3NpemU7CiAJCWxvZmZfdCBuZXdzaXplID0gYXR0ci0+aWFfc2l6ZTsKLQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwogCi0JCWlmIChuZXdzaXplIDwgb2xkc2l6ZSkgewotCQkJLyoKLQkJCSAqIElmIHRydW5jYXRpbmcgZG93biB0byBhIHBhcnRpYWwgcGFnZSwgdGhlbgotCQkJICogaWYgdGhhdCBwYWdlIGlzIGFscmVhZHkgYWxsb2NhdGVkLCBob2xkIGl0Ci0JCQkgKiBpbiBtZW1vcnkgdW50aWwgdGhlIHRydW5jYXRpb24gaXMgb3Zlciwgc28KLQkJCSAqIHRydW5jYXRlX3BhcnRpYWxfcGFnZSBjYW5ub3QgbWlzcyBpdCB3ZXJlCi0JCQkgKiBpdCBhc3NpZ25lZCB0byBzd2FwLgotCQkJICovCi0JCQlpZiAobmV3c2l6ZSAmIChQQUdFX0NBQ0hFX1NJWkUtMSkpIHsKLQkJCQkodm9pZCkgc2htZW1fZ2V0cGFnZShpbm9kZSwKLQkJCQkJbmV3c2l6ZSA+PiBQQUdFX0NBQ0hFX1NISUZULAotCQkJCQkJJnBhZ2UsIFNHUF9SRUFELCBOVUxMKTsKLQkJCQlpZiAocGFnZSkKLQkJCQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCQl9Ci0JCQkvKgotCQkJICogUmVzZXQgU0hNRU1fUEFHRUlOIGZsYWcgc28gdGhhdCBzaG1lbV90cnVuY2F0ZSBjYW4KLQkJCSAqIGRldGVjdCBpZiBhbnkgcGFnZXMgbWlnaHQgaGF2ZSBiZWVuIGFkZGVkIHRvIGNhY2hlCi0JCQkgKiBhZnRlciB0cnVuY2F0ZV9pbm9kZV9wYWdlcy4gIEJ1dCB3ZSBuZWVkbid0IGJvdGhlcgotCQkJICogaWYgaXQncyBiZWluZyBmdWxseSB0cnVuY2F0ZWQgdG8gemVyby1sZW5ndGg6IHRoZQotCQkJICogbnJwYWdlcyBjaGVjayBpcyBlZmZpY2llbnQgZW5vdWdoIGluIHRoYXQgY2FzZS4KLQkJCSAqLwotCQkJaWYgKG5ld3NpemUpIHsKLQkJCQlzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqaW5mbyA9IFNITUVNX0koaW5vZGUpOwotCQkJCXNwaW5fbG9jaygmaW5mby0+bG9jayk7Ci0JCQkJaW5mby0+ZmxhZ3MgJj0gflNITUVNX1BBR0VJTjsKLQkJCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7Ci0JCQl9Ci0JCX0KIAkJaWYgKG5ld3NpemUgIT0gb2xkc2l6ZSkgewogCQkJaV9zaXplX3dyaXRlKGlub2RlLCBuZXdzaXplKTsKIAkJCWlub2RlLT5pX2N0aW1lID0gaW5vZGUtPmlfbXRpbWUgPSBDVVJSRU5UX1RJTUU7CkBAIC04MjIsOCArNTMyLDYgQEAKIAkJCS8qIHVubWFwIGFnYWluIHRvIHJlbW92ZSByYWNpbHkgQ09XZWQgcHJpdmF0ZSBwYWdlcyAqLwogCQkJdW5tYXBfbWFwcGluZ19yYW5nZShpbm9kZS0+aV9tYXBwaW5nLCBob2xlYmVnaW4sIDAsIDEpOwogCQl9Ci0JCWlmIChwYWdlKQotCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCX0KIAogCXNldGF0dHJfY29weShpbm9kZSwgYXR0cik7CkBAIC04NDgsNyArNTU2LDggQEAKIAkJCWxpc3RfZGVsX2luaXQoJmluZm8tPnN3YXBsaXN0KTsKIAkJCW11dGV4X3VubG9jaygmc2htZW1fc3dhcGxpc3RfbXV0ZXgpOwogCQl9Ci0JfQorCX0gZWxzZQorCQlrZnJlZShpbmZvLT5zeW1saW5rKTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh4YXR0ciwgbnhhdHRyLCAmaW5mby0+eGF0dHJfbGlzdCwgbGlzdCkgewogCQlrZnJlZSh4YXR0ci0+bmFtZSk7CkBAIC04NTksMTA2ICs1NjgsMjcgQEAKIAllbmRfd3JpdGViYWNrKGlub2RlKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgc2htZW1fZmluZF9zd3Aoc3dwX2VudHJ5X3QgZW50cnksIHN3cF9lbnRyeV90ICpkaXIsIHN3cF9lbnRyeV90ICplZGlyKQorLyoKKyAqIElmIHN3YXAgZm91bmQgaW4gaW5vZGUsIGZyZWUgaXQgYW5kIG1vdmUgcGFnZSBmcm9tIHN3YXBjYWNoZSB0byBmaWxlY2FjaGUuCisgKi8KK3N0YXRpYyBpbnQgc2htZW1fdW51c2VfaW5vZGUoc3RydWN0IHNobWVtX2lub2RlX2luZm8gKmluZm8sCisJCQkgICAgIHN3cF9lbnRyeV90IHN3YXAsIHN0cnVjdCBwYWdlICpwYWdlKQogewotCXN3cF9lbnRyeV90ICpwdHI7Ci0KLQlmb3IgKHB0ciA9IGRpcjsgcHRyIDwgZWRpcjsgcHRyKyspIHsKLQkJaWYgKHB0ci0+dmFsID09IGVudHJ5LnZhbCkKLQkJCXJldHVybiBwdHIgLSBkaXI7Ci0JfQotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGludCBzaG1lbV91bnVzZV9pbm9kZShzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqaW5mbywgc3dwX2VudHJ5X3QgZW50cnksIHN0cnVjdCBwYWdlICpwYWdlKQotewotCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nOwotCXVuc2lnbmVkIGxvbmcgaWR4OwotCXVuc2lnbmVkIGxvbmcgc2l6ZTsKLQl1bnNpZ25lZCBsb25nIGxpbWl0OwotCXVuc2lnbmVkIGxvbmcgc3RhZ2U7Ci0Jc3RydWN0IHBhZ2UgKipkaXI7Ci0Jc3RydWN0IHBhZ2UgKnN1YmRpcjsKLQlzd3BfZW50cnlfdCAqcHRyOwotCWludCBvZmZzZXQ7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBpbmZvLT52ZnNfaW5vZGUuaV9tYXBwaW5nOworCXZvaWQgKnJhZHN3YXA7CisJcGdvZmZfdCBpbmRleDsKIAlpbnQgZXJyb3I7CiAKLQlpZHggPSAwOwotCXB0ciA9IGluZm8tPmlfZGlyZWN0OwotCXNwaW5fbG9jaygmaW5mby0+bG9jayk7Ci0JaWYgKCFpbmZvLT5zd2FwcGVkKSB7Ci0JCWxpc3RfZGVsX2luaXQoJmluZm8tPnN3YXBsaXN0KTsKLQkJZ290byBsb3N0MjsKLQl9Ci0JbGltaXQgPSBpbmZvLT5uZXh0X2luZGV4OwotCXNpemUgPSBsaW1pdDsKLQlpZiAoc2l6ZSA+IFNITUVNX05SX0RJUkVDVCkKLQkJc2l6ZSA9IFNITUVNX05SX0RJUkVDVDsKLQlvZmZzZXQgPSBzaG1lbV9maW5kX3N3cChlbnRyeSwgcHRyLCBwdHIrc2l6ZSk7Ci0JaWYgKG9mZnNldCA+PSAwKSB7Ci0JCXNobWVtX3N3cF9iYWxhbmNlX3VubWFwKCk7Ci0JCWdvdG8gZm91bmQ7Ci0JfQotCWlmICghaW5mby0+aV9pbmRpcmVjdCkKLQkJZ290byBsb3N0MjsKLQotCWRpciA9IHNobWVtX2Rpcl9tYXAoaW5mby0+aV9pbmRpcmVjdCk7Ci0Jc3RhZ2UgPSBTSE1FTV9OUl9ESVJFQ1QgKyBFTlRSSUVTX1BFUl9QQUdFUEFHRS8yOwotCi0JZm9yIChpZHggPSBTSE1FTV9OUl9ESVJFQ1Q7IGlkeCA8IGxpbWl0OyBpZHggKz0gRU5UUklFU19QRVJfUEFHRSwgZGlyKyspIHsKLQkJaWYgKHVubGlrZWx5KGlkeCA9PSBzdGFnZSkpIHsKLQkJCXNobWVtX2Rpcl91bm1hcChkaXItMSk7Ci0JCQlpZiAoY29uZF9yZXNjaGVkX2xvY2soJmluZm8tPmxvY2spKSB7Ci0JCQkJLyogY2hlY2sgaXQgaGFzIG5vdCBiZWVuIHRydW5jYXRlZCAqLwotCQkJCWlmIChsaW1pdCA+IGluZm8tPm5leHRfaW5kZXgpIHsKLQkJCQkJbGltaXQgPSBpbmZvLT5uZXh0X2luZGV4OwotCQkJCQlpZiAoaWR4ID49IGxpbWl0KQotCQkJCQkJZ290byBsb3N0MjsKLQkJCQl9Ci0JCQl9Ci0JCQlkaXIgPSBzaG1lbV9kaXJfbWFwKGluZm8tPmlfaW5kaXJlY3QpICsKLQkJCSAgICBFTlRSSUVTX1BFUl9QQUdFLzIgKyBpZHgvRU5UUklFU19QRVJfUEFHRVBBR0U7Ci0JCQl3aGlsZSAoISpkaXIpIHsKLQkJCQlkaXIrKzsKLQkJCQlpZHggKz0gRU5UUklFU19QRVJfUEFHRVBBR0U7Ci0JCQkJaWYgKGlkeCA+PSBsaW1pdCkKLQkJCQkJZ290byBsb3N0MTsKLQkJCX0KLQkJCXN0YWdlID0gaWR4ICsgRU5UUklFU19QRVJfUEFHRVBBR0U7Ci0JCQlzdWJkaXIgPSAqZGlyOwotCQkJc2htZW1fZGlyX3VubWFwKGRpcik7Ci0JCQlkaXIgPSBzaG1lbV9kaXJfbWFwKHN1YmRpcik7Ci0JCX0KLQkJc3ViZGlyID0gKmRpcjsKLQkJaWYgKHN1YmRpciAmJiBwYWdlX3ByaXZhdGUoc3ViZGlyKSkgewotCQkJcHRyID0gc2htZW1fc3dwX21hcChzdWJkaXIpOwotCQkJc2l6ZSA9IGxpbWl0IC0gaWR4OwotCQkJaWYgKHNpemUgPiBFTlRSSUVTX1BFUl9QQUdFKQotCQkJCXNpemUgPSBFTlRSSUVTX1BFUl9QQUdFOwotCQkJb2Zmc2V0ID0gc2htZW1fZmluZF9zd3AoZW50cnksIHB0ciwgcHRyK3NpemUpOwotCQkJc2htZW1fc3dwX3VubWFwKHB0cik7Ci0JCQlpZiAob2Zmc2V0ID49IDApIHsKLQkJCQlzaG1lbV9kaXJfdW5tYXAoZGlyKTsKLQkJCQlwdHIgPSBzaG1lbV9zd3BfbWFwKHN1YmRpcik7Ci0JCQkJZ290byBmb3VuZDsKLQkJCX0KLQkJfQotCX0KLWxvc3QxOgotCXNobWVtX2Rpcl91bm1hcChkaXItMSk7Ci1sb3N0MjoKLQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7Ci0JcmV0dXJuIDA7Ci1mb3VuZDoKLQlpZHggKz0gb2Zmc2V0OwotCXB0ciArPSBvZmZzZXQ7CisJcmFkc3dhcCA9IHN3cF90b19yYWRpeF9lbnRyeShzd2FwKTsKKwlpbmRleCA9IHJhZGl4X3RyZWVfbG9jYXRlX2l0ZW0oJm1hcHBpbmctPnBhZ2VfdHJlZSwgcmFkc3dhcCk7CisJaWYgKGluZGV4ID09IC0xKQorCQlyZXR1cm4gMDsKIAogCS8qCiAJICogTW92ZSBfaGVhZF8gdG8gc3RhcnQgc2VhcmNoIGZvciBuZXh0IGZyb20gaGVyZS4KIAkgKiBCdXQgYmUgY2FyZWZ1bDogc2htZW1fZXZpY3RfaW5vZGUgY2hlY2tzIGxpc3RfZW1wdHkgd2l0aG91dCB0YWtpbmcKIAkgKiBtdXRleCwgYW5kIHRoZXJlJ3MgYW4gaW5zdGFudCBpbiBsaXN0X21vdmVfdGFpbCB3aGVuIGluZm8tPnN3YXBsaXN0Ci0JICogd291bGQgYXBwZWFyIGVtcHR5LCBpZiBpdCB3ZXJlIHRoZSBvbmx5IG9uZSBvbiBzaG1lbV9zd2FwbGlzdC4gIFdlCi0JICogY291bGQgYXZvaWQgZG9pbmcgaXQgaWYgaW5vZGUgTlVMTDsgb3IgdXNlIHRoaXMgbWlub3Igb3B0aW1pemF0aW9uLgorCSAqIHdvdWxkIGFwcGVhciBlbXB0eSwgaWYgaXQgd2VyZSB0aGUgb25seSBvbmUgb24gc2htZW1fc3dhcGxpc3QuCiAJICovCiAJaWYgKHNobWVtX3N3YXBsaXN0Lm5leHQgIT0gJmluZm8tPnN3YXBsaXN0KQogCQlsaXN0X21vdmVfdGFpbCgmc2htZW1fc3dhcGxpc3QsICZpbmZvLT5zd2FwbGlzdCk7CkBAIC05NjgsMjkgKzU5OCwzNCBAQAogCSAqIGJ1dCBhbHNvIHRvIGhvbGQgdXAgc2htZW1fZXZpY3RfaW5vZGUoKTogc28gaW5vZGUgY2Fubm90IGJlIGZyZWVkCiAJICogYmVuZWF0aCB1cyAocGFnZWxvY2sgZG9lc24ndCBoZWxwIHVudGlsIHRoZSBwYWdlIGlzIGluIHBhZ2VjYWNoZSkuCiAJICovCi0JbWFwcGluZyA9IGluZm8tPnZmc19pbm9kZS5pX21hcHBpbmc7Ci0JZXJyb3IgPSBhZGRfdG9fcGFnZV9jYWNoZV9sb2NrZWQocGFnZSwgbWFwcGluZywgaWR4LCBHRlBfTk9XQUlUKTsKKwllcnJvciA9IHNobWVtX2FkZF90b19wYWdlX2NhY2hlKHBhZ2UsIG1hcHBpbmcsIGluZGV4LAorCQkJCQkJR0ZQX05PV0FJVCwgcmFkc3dhcCk7CiAJLyogd2hpY2ggZG9lcyBtZW1fY2dyb3VwX3VuY2hhcmdlX2NhY2hlX3BhZ2Ugb24gZXJyb3IgKi8KIAogCWlmIChlcnJvciAhPSAtRU5PTUVNKSB7CisJCS8qCisJCSAqIFRydW5jYXRpb24gYW5kIGV2aWN0aW9uIHVzZSBmcmVlX3N3YXBfYW5kX2NhY2hlKCksIHdoaWNoCisJCSAqIG9ubHkgZG9lcyB0cnlsb2NrIHBhZ2U6IGlmIHdlIHJhY2VkLCBiZXN0IGNsZWFuIHVwIGhlcmUuCisJCSAqLwogCQlkZWxldGVfZnJvbV9zd2FwX2NhY2hlKHBhZ2UpOwogCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKLQkJaW5mby0+ZmxhZ3MgfD0gU0hNRU1fUEFHRUlOOwotCQlzaG1lbV9zd3Bfc2V0KGluZm8sIHB0ciwgMCk7Ci0JCXN3YXBfZnJlZShlbnRyeSk7CisJCWlmICghZXJyb3IpIHsKKwkJCXNwaW5fbG9jaygmaW5mby0+bG9jayk7CisJCQlpbmZvLT5zd2FwcGVkLS07CisJCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7CisJCQlzd2FwX2ZyZWUoc3dhcCk7CisJCX0KIAkJZXJyb3IgPSAxOwkvKiBub3QgYW4gZXJyb3IsIGJ1dCBlbnRyeSB3YXMgZm91bmQgKi8KIAl9Ci0Jc2htZW1fc3dwX3VubWFwKHB0cik7Ci0Jc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwogCXJldHVybiBlcnJvcjsKIH0KIAogLyoKLSAqIHNobWVtX3VudXNlKCkgc2VhcmNoIGZvciBhbiBldmVudHVhbGx5IHN3YXBwZWQgb3V0IHNobWVtIHBhZ2UuCisgKiBTZWFyY2ggdGhyb3VnaCBzd2FwcGVkIGlub2RlcyB0byBmaW5kIGFuZCByZXBsYWNlIHN3YXAgYnkgcGFnZS4KICAqLwotaW50IHNobWVtX3VudXNlKHN3cF9lbnRyeV90IGVudHJ5LCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK2ludCBzaG1lbV91bnVzZShzd3BfZW50cnlfdCBzd2FwLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwLCAqbmV4dDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0aGlzLCAqbmV4dDsKIAlzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqaW5mbzsKIAlpbnQgZm91bmQgPSAwOwogCWludCBlcnJvcjsKQEAgLTk5OSwzMiArNjM0LDI1IEBACiAJICogQ2hhcmdlIHBhZ2UgdXNpbmcgR0ZQX0tFUk5FTCB3aGlsZSB3ZSBjYW4gd2FpdCwgYmVmb3JlIHRha2luZwogCSAqIHRoZSBzaG1lbV9zd2FwbGlzdF9tdXRleCB3aGljaCBtaWdodCBob2xkIHVwIHNobWVtX3dyaXRlcGFnZSgpLgogCSAqIENoYXJnZWQgYmFjayB0byB0aGUgdXNlciAobm90IHRvIGNhbGxlcikgd2hlbiBzd2FwIGFjY291bnQgaXMgdXNlZC4KLQkgKiBhZGRfdG9fcGFnZV9jYWNoZSgpIHdpbGwgYmUgY2FsbGVkIHdpdGggR0ZQX05PV0FJVC4KIAkgKi8KIAllcnJvciA9IG1lbV9jZ3JvdXBfY2FjaGVfY2hhcmdlKHBhZ2UsIGN1cnJlbnQtPm1tLCBHRlBfS0VSTkVMKTsKIAlpZiAoZXJyb3IpCiAJCWdvdG8gb3V0OwotCS8qCi0JICogVHJ5IHRvIHByZWxvYWQgd2hpbGUgd2UgY2FuIHdhaXQsIHRvIG5vdCBtYWtlIGEgaGFiaXQgb2YKLQkgKiBkcmFpbmluZyBhdG9taWMgcmVzZXJ2ZXM7IGJ1dCBkb24ndCBsYXRjaCBvbiB0byB0aGlzIGNwdSwKLQkgKiBpdCdzIG9rYXkgaWYgc29tZXRpbWVzIHdlIGdldCByZXNjaGVkdWxlZCBhZnRlciB0aGlzLgotCSAqLwotCWVycm9yID0gcmFkaXhfdHJlZV9wcmVsb2FkKEdGUF9LRVJORUwpOwotCWlmIChlcnJvcikKLQkJZ290byB1bmNoYXJnZTsKLQlyYWRpeF90cmVlX3ByZWxvYWRfZW5kKCk7CisJLyogTm8gcmFkaXhfdHJlZV9wcmVsb2FkOiBzd2FwIGVudHJ5IGtlZXBzIGEgcGxhY2UgZm9yIHBhZ2UgaW4gdHJlZSAqLwogCiAJbXV0ZXhfbG9jaygmc2htZW1fc3dhcGxpc3RfbXV0ZXgpOwotCWxpc3RfZm9yX2VhY2hfc2FmZShwLCBuZXh0LCAmc2htZW1fc3dhcGxpc3QpIHsKLQkJaW5mbyA9IGxpc3RfZW50cnkocCwgc3RydWN0IHNobWVtX2lub2RlX2luZm8sIHN3YXBsaXN0KTsKLQkJZm91bmQgPSBzaG1lbV91bnVzZV9pbm9kZShpbmZvLCBlbnRyeSwgcGFnZSk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKHRoaXMsIG5leHQsICZzaG1lbV9zd2FwbGlzdCkgeworCQlpbmZvID0gbGlzdF9lbnRyeSh0aGlzLCBzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbywgc3dhcGxpc3QpOworCQlpZiAoaW5mby0+c3dhcHBlZCkKKwkJCWZvdW5kID0gc2htZW1fdW51c2VfaW5vZGUoaW5mbywgc3dhcCwgcGFnZSk7CisJCWVsc2UKKwkJCWxpc3RfZGVsX2luaXQoJmluZm8tPnN3YXBsaXN0KTsKIAkJY29uZF9yZXNjaGVkKCk7CiAJCWlmIChmb3VuZCkKIAkJCWJyZWFrOwogCX0KIAltdXRleF91bmxvY2soJnNobWVtX3N3YXBsaXN0X211dGV4KTsKIAotdW5jaGFyZ2U6CiAJaWYgKCFmb3VuZCkKIAkJbWVtX2Nncm91cF91bmNoYXJnZV9jYWNoZV9wYWdlKHBhZ2UpOwogCWlmIChmb3VuZCA8IDApCkBAIC0xMDQxLDEwICs2NjksMTAgQEAKIHN0YXRpYyBpbnQgc2htZW1fd3JpdGVwYWdlKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3Qgd3JpdGViYWNrX2NvbnRyb2wgKndiYykKIHsKIAlzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqaW5mbzsKLQlzd3BfZW50cnlfdCAqZW50cnksIHN3YXA7CiAJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7Ci0JdW5zaWduZWQgbG9uZyBpbmRleDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN3cF9lbnRyeV90IHN3YXA7CisJcGdvZmZfdCBpbmRleDsKIAogCUJVR19PTighUGFnZUxvY2tlZChwYWdlKSk7CiAJbWFwcGluZyA9IHBhZ2UtPm1hcHBpbmc7CkBAIC0xMDczLDUwICs3MDEsMzIgQEAKIAogCS8qCiAJICogQWRkIGlub2RlIHRvIHNobWVtX3VudXNlKCkncyBsaXN0IG9mIHN3YXBwZWQtb3V0IGlub2RlcywKLQkgKiBpZiBpdCdzIG5vdCBhbHJlYWR5IHRoZXJlLiAgRG8gaXQgbm93IGJlY2F1c2Ugd2UgY2Fubm90IHRha2UKLQkgKiBtdXRleCB3aGlsZSBob2xkaW5nIHNwaW5sb2NrLCBhbmQgbXVzdCBkbyBzbyBiZWZvcmUgdGhlIHBhZ2UKLQkgKiBpcyBtb3ZlZCB0byBzd2FwIGNhY2hlLCB3aGVuIGl0cyBwYWdlbG9jayBubyBsb25nZXIgcHJvdGVjdHMKKwkgKiBpZiBpdCdzIG5vdCBhbHJlYWR5IHRoZXJlLiAgRG8gaXQgbm93IGJlZm9yZSB0aGUgcGFnZSBpcworCSAqIG1vdmVkIHRvIHN3YXAgY2FjaGUsIHdoZW4gaXRzIHBhZ2Vsb2NrIG5vIGxvbmdlciBwcm90ZWN0cwogCSAqIHRoZSBpbm9kZSBmcm9tIGV2aWN0aW9uLiAgQnV0IGRvbid0IHVubG9jayB0aGUgbXV0ZXggdW50aWwKLQkgKiB3ZSd2ZSB0YWtlbiB0aGUgc3BpbmxvY2ssIGJlY2F1c2Ugc2htZW1fdW51c2VfaW5vZGUoKSB3aWxsCi0JICogcHJ1bmUgYSAhc3dhcHBlZCBpbm9kZSBmcm9tIHRoZSBzd2FwbGlzdCB1bmRlciBib3RoIGxvY2tzLgorCSAqIHdlJ3ZlIGluY3JlbWVudGVkIHN3YXBwZWQsIGJlY2F1c2Ugc2htZW1fdW51c2VfaW5vZGUoKSB3aWxsCisJICogcHJ1bmUgYSAhc3dhcHBlZCBpbm9kZSBmcm9tIHRoZSBzd2FwbGlzdCB1bmRlciB0aGlzIG11dGV4LgogCSAqLwogCW11dGV4X2xvY2soJnNobWVtX3N3YXBsaXN0X211dGV4KTsKIAlpZiAobGlzdF9lbXB0eSgmaW5mby0+c3dhcGxpc3QpKQogCQlsaXN0X2FkZF90YWlsKCZpbmZvLT5zd2FwbGlzdCwgJnNobWVtX3N3YXBsaXN0KTsKIAotCXNwaW5fbG9jaygmaW5mby0+bG9jayk7Ci0JbXV0ZXhfdW5sb2NrKCZzaG1lbV9zd2FwbGlzdF9tdXRleCk7Ci0KLQlpZiAoaW5kZXggPj0gaW5mby0+bmV4dF9pbmRleCkgewotCQlCVUdfT04oIShpbmZvLT5mbGFncyAmIFNITUVNX1RSVU5DQVRFKSk7Ci0JCWdvdG8gdW5sb2NrOwotCX0KLQllbnRyeSA9IHNobWVtX3N3cF9lbnRyeShpbmZvLCBpbmRleCwgTlVMTCk7Ci0JaWYgKGVudHJ5LT52YWwpIHsKLQkJV0FSTl9PTl9PTkNFKDEpOwkvKiBTdGlsbCBoYXBwZW5zPyBUZWxsIHVzIGFib3V0IGl0ISAqLwotCQlmcmVlX3N3YXBfYW5kX2NhY2hlKCplbnRyeSk7Ci0JCXNobWVtX3N3cF9zZXQoaW5mbywgZW50cnksIDApOwotCX0KLQlzaG1lbV9yZWNhbGNfaW5vZGUoaW5vZGUpOwotCiAJaWYgKGFkZF90b19zd2FwX2NhY2hlKHBhZ2UsIHN3YXAsIEdGUF9BVE9NSUMpID09IDApIHsKLQkJZGVsZXRlX2Zyb21fcGFnZV9jYWNoZShwYWdlKTsKLQkJc2htZW1fc3dwX3NldChpbmZvLCBlbnRyeSwgc3dhcC52YWwpOwotCQlzaG1lbV9zd3BfdW5tYXAoZW50cnkpOwogCQlzd2FwX3NobWVtX2FsbG9jKHN3YXApOworCQlzaG1lbV9kZWxldGVfZnJvbV9wYWdlX2NhY2hlKHBhZ2UsIHN3cF90b19yYWRpeF9lbnRyeShzd2FwKSk7CisKKwkJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKKwkJaW5mby0+c3dhcHBlZCsrOworCQlzaG1lbV9yZWNhbGNfaW5vZGUoaW5vZGUpOwogCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7CisKKwkJbXV0ZXhfdW5sb2NrKCZzaG1lbV9zd2FwbGlzdF9tdXRleCk7CiAJCUJVR19PTihwYWdlX21hcHBlZChwYWdlKSk7CiAJCXN3YXBfd3JpdGVwYWdlKHBhZ2UsIHdiYyk7CiAJCXJldHVybiAwOwogCX0KIAotCXNobWVtX3N3cF91bm1hcChlbnRyeSk7Ci11bmxvY2s6Ci0Jc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotCS8qCi0JICogYWRkX3RvX3N3YXBfY2FjaGUoKSBkb2Vzbid0IHJldHVybiAtRUVYSVNULCBzbyB3ZSBjYW4gc2FmZWx5Ci0JICogY2xlYXIgU1dBUF9IQVNfQ0FDSEUgZmxhZy4KLQkgKi8KKwltdXRleF91bmxvY2soJnNobWVtX3N3YXBsaXN0X211dGV4KTsKIAlzd2FwY2FjaGVfZnJlZShzd2FwLCBOVUxMKTsKIHJlZGlydHk6CiAJc2V0X3BhZ2VfZGlydHkocGFnZSk7CkBAIC0xMTUzLDM1ICs3NjMsMzMgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfVE1QRlMgKi8KIAotc3RhdGljIHN0cnVjdCBwYWdlICpzaG1lbV9zd2FwaW4oc3dwX2VudHJ5X3QgZW50cnksIGdmcF90IGdmcCwKLQkJCXN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvICppbmZvLCB1bnNpZ25lZCBsb25nIGlkeCkKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqc2htZW1fc3dhcGluKHN3cF9lbnRyeV90IHN3YXAsIGdmcF90IGdmcCwKKwkJCXN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvICppbmZvLCBwZ29mZl90IGluZGV4KQogewogCXN0cnVjdCBtZW1wb2xpY3kgbXBvbCwgKnNwb2w7CiAJc3RydWN0IHZtX2FyZWFfc3RydWN0IHB2bWE7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7CiAKIAlzcG9sID0gbXBvbF9jb25kX2NvcHkoJm1wb2wsCi0JCQkJbXBvbF9zaGFyZWRfcG9saWN5X2xvb2t1cCgmaW5mby0+cG9saWN5LCBpZHgpKTsKKwkJCW1wb2xfc2hhcmVkX3BvbGljeV9sb29rdXAoJmluZm8tPnBvbGljeSwgaW5kZXgpKTsKIAogCS8qIENyZWF0ZSBhIHBzZXVkbyB2bWEgdGhhdCBqdXN0IGNvbnRhaW5zIHRoZSBwb2xpY3kgKi8KIAlwdm1hLnZtX3N0YXJ0ID0gMDsKLQlwdm1hLnZtX3Bnb2ZmID0gaWR4OworCXB2bWEudm1fcGdvZmYgPSBpbmRleDsKIAlwdm1hLnZtX29wcyA9IE5VTEw7CiAJcHZtYS52bV9wb2xpY3kgPSBzcG9sOwotCXBhZ2UgPSBzd2FwaW5fcmVhZGFoZWFkKGVudHJ5LCBnZnAsICZwdm1hLCAwKTsKLQlyZXR1cm4gcGFnZTsKKwlyZXR1cm4gc3dhcGluX3JlYWRhaGVhZChzd2FwLCBnZnAsICZwdm1hLCAwKTsKIH0KIAogc3RhdGljIHN0cnVjdCBwYWdlICpzaG1lbV9hbGxvY19wYWdlKGdmcF90IGdmcCwKLQkJCXN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvICppbmZvLCB1bnNpZ25lZCBsb25nIGlkeCkKKwkJCXN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvICppbmZvLCBwZ29mZl90IGluZGV4KQogewogCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCBwdm1hOwogCiAJLyogQ3JlYXRlIGEgcHNldWRvIHZtYSB0aGF0IGp1c3QgY29udGFpbnMgdGhlIHBvbGljeSAqLwogCXB2bWEudm1fc3RhcnQgPSAwOwotCXB2bWEudm1fcGdvZmYgPSBpZHg7CisJcHZtYS52bV9wZ29mZiA9IGluZGV4OwogCXB2bWEudm1fb3BzID0gTlVMTDsKLQlwdm1hLnZtX3BvbGljeSA9IG1wb2xfc2hhcmVkX3BvbGljeV9sb29rdXAoJmluZm8tPnBvbGljeSwgaWR4KTsKKwlwdm1hLnZtX3BvbGljeSA9IG1wb2xfc2hhcmVkX3BvbGljeV9sb29rdXAoJmluZm8tPnBvbGljeSwgaW5kZXgpOwogCiAJLyoKIAkgKiBhbGxvY19wYWdlX3ZtYSgpIHdpbGwgZHJvcCB0aGUgc2hhcmVkIHBvbGljeSByZWZlcmVuY2UKQEAgLTExOTAsMTkgKzc5OCwxOSBAQAogfQogI2Vsc2UgLyogIUNPTkZJR19OVU1BICovCiAjaWZkZWYgQ09ORklHX1RNUEZTCi1zdGF0aWMgaW5saW5lIHZvaWQgc2htZW1fc2hvd19tcG9sKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgbWVtcG9saWN5ICpwKQorc3RhdGljIGlubGluZSB2b2lkIHNobWVtX3Nob3dfbXBvbChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgc3RydWN0IG1lbXBvbGljeSAqbXBvbCkKIHsKIH0KICNlbmRpZiAvKiBDT05GSUdfVE1QRlMgKi8KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqc2htZW1fc3dhcGluKHN3cF9lbnRyeV90IGVudHJ5LCBnZnBfdCBnZnAsCi0JCQlzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqaW5mbywgdW5zaWduZWQgbG9uZyBpZHgpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpzaG1lbV9zd2FwaW4oc3dwX2VudHJ5X3Qgc3dhcCwgZ2ZwX3QgZ2ZwLAorCQkJc3RydWN0IHNobWVtX2lub2RlX2luZm8gKmluZm8sIHBnb2ZmX3QgaW5kZXgpCiB7Ci0JcmV0dXJuIHN3YXBpbl9yZWFkYWhlYWQoZW50cnksIGdmcCwgTlVMTCwgMCk7CisJcmV0dXJuIHN3YXBpbl9yZWFkYWhlYWQoc3dhcCwgZ2ZwLCBOVUxMLCAwKTsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqc2htZW1fYWxsb2NfcGFnZShnZnBfdCBnZnAsCi0JCQlzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqaW5mbywgdW5zaWduZWQgbG9uZyBpZHgpCisJCQlzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqaW5mbywgcGdvZmZfdCBpbmRleCkKIHsKIAlyZXR1cm4gYWxsb2NfcGFnZShnZnApOwogfQpAQCAtMTIyMiwyNDMgKzgzMCwxOTAgQEAKICAqIHZtLiBJZiB3ZSBzd2FwIGl0IGluIHdlIG1hcmsgaXQgZGlydHkgc2luY2Ugd2UgYWxzbyBmcmVlIHRoZSBzd2FwCiAgKiBlbnRyeSBzaW5jZSBhIHBhZ2UgY2Fubm90IGxpdmUgaW4gYm90aCB0aGUgc3dhcCBhbmQgcGFnZSBjYWNoZQogICovCi1zdGF0aWMgaW50IHNobWVtX2dldHBhZ2VfZ2ZwKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHBnb2ZmX3QgaWR4LAorc3RhdGljIGludCBzaG1lbV9nZXRwYWdlX2dmcChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBwZ29mZl90IGluZGV4LAogCXN0cnVjdCBwYWdlICoqcGFnZXAsIGVudW0gc2dwX3R5cGUgc2dwLCBnZnBfdCBnZnAsIGludCAqZmF1bHRfdHlwZSkKIHsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7Ci0Jc3RydWN0IHNobWVtX2lub2RlX2luZm8gKmluZm8gPSBTSE1FTV9JKGlub2RlKTsKKwlzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqaW5mbzsKIAlzdHJ1Y3Qgc2htZW1fc2JfaW5mbyAqc2JpbmZvOwogCXN0cnVjdCBwYWdlICpwYWdlOwotCXN0cnVjdCBwYWdlICpwcmVhbGxvY19wYWdlID0gTlVMTDsKLQlzd3BfZW50cnlfdCAqZW50cnk7CiAJc3dwX2VudHJ5X3Qgc3dhcDsKIAlpbnQgZXJyb3I7Ci0JaW50IHJldDsKKwlpbnQgb25jZSA9IDA7CiAKLQlpZiAoaWR4ID49IFNITUVNX01BWF9JTkRFWCkKKwlpZiAoaW5kZXggPiAoTUFYX0xGU19GSUxFU0laRSA+PiBQQUdFX0NBQ0hFX1NISUZUKSkKIAkJcmV0dXJuIC1FRkJJRzsKIHJlcGVhdDoKLQlwYWdlID0gZmluZF9sb2NrX3BhZ2UobWFwcGluZywgaWR4KTsKLQlpZiAocGFnZSkgeworCXN3YXAudmFsID0gMDsKKwlwYWdlID0gZmluZF9sb2NrX3BhZ2UobWFwcGluZywgaW5kZXgpOworCWlmIChyYWRpeF90cmVlX2V4Y2VwdGlvbmFsX2VudHJ5KHBhZ2UpKSB7CisJCXN3YXAgPSByYWRpeF90b19zd3BfZW50cnkocGFnZSk7CisJCXBhZ2UgPSBOVUxMOworCX0KKworCWlmIChzZ3AgIT0gU0dQX1dSSVRFICYmCisJICAgICgobG9mZl90KWluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpID49IGlfc2l6ZV9yZWFkKGlub2RlKSkgeworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gZmFpbGVkOworCX0KKworCWlmIChwYWdlIHx8IChzZ3AgPT0gU0dQX1JFQUQgJiYgIXN3YXAudmFsKSkgewogCQkvKgogCQkgKiBPbmNlIHdlIGNhbiBnZXQgdGhlIHBhZ2UgbG9jaywgaXQgbXVzdCBiZSB1cHRvZGF0ZToKIAkJICogaWYgdGhlcmUgd2VyZSBhbiBlcnJvciBpbiByZWFkaW5nIGJhY2sgZnJvbSBzd2FwLAogCQkgKiB0aGUgcGFnZSB3b3VsZCBub3QgYmUgaW5zZXJ0ZWQgaW50byB0aGUgZmlsZWNhY2hlLgogCQkgKi8KLQkJQlVHX09OKCFQYWdlVXB0b2RhdGUocGFnZSkpOwotCQlnb3RvIGRvbmU7CisJCUJVR19PTihwYWdlICYmICFQYWdlVXB0b2RhdGUocGFnZSkpOworCQkqcGFnZXAgPSBwYWdlOworCQlyZXR1cm4gMDsKIAl9CiAKIAkvKgotCSAqIFRyeSB0byBwcmVsb2FkIHdoaWxlIHdlIGNhbiB3YWl0LCB0byBub3QgbWFrZSBhIGhhYml0IG9mCi0JICogZHJhaW5pbmcgYXRvbWljIHJlc2VydmVzOyBidXQgZG9uJ3QgbGF0Y2ggb24gdG8gdGhpcyBjcHUuCisJICogRmFzdCBjYWNoZSBsb29rdXAgZGlkIG5vdCBmaW5kIGl0OgorCSAqIGJyaW5nIGl0IGJhY2sgZnJvbSBzd2FwIG9yIGFsbG9jYXRlLgogCSAqLwotCWVycm9yID0gcmFkaXhfdHJlZV9wcmVsb2FkKGdmcCAmIEdGUF9SRUNMQUlNX01BU0spOwotCWlmIChlcnJvcikKLQkJZ290byBvdXQ7Ci0JcmFkaXhfdHJlZV9wcmVsb2FkX2VuZCgpOwotCi0JaWYgKHNncCAhPSBTR1BfUkVBRCAmJiAhcHJlYWxsb2NfcGFnZSkgewotCQlwcmVhbGxvY19wYWdlID0gc2htZW1fYWxsb2NfcGFnZShnZnAsIGluZm8sIGlkeCk7Ci0JCWlmIChwcmVhbGxvY19wYWdlKSB7Ci0JCQlTZXRQYWdlU3dhcEJhY2tlZChwcmVhbGxvY19wYWdlKTsKLQkJCWlmIChtZW1fY2dyb3VwX2NhY2hlX2NoYXJnZShwcmVhbGxvY19wYWdlLAotCQkJCQljdXJyZW50LT5tbSwgR0ZQX0tFUk5FTCkpIHsKLQkJCQlwYWdlX2NhY2hlX3JlbGVhc2UocHJlYWxsb2NfcGFnZSk7Ci0JCQkJcHJlYWxsb2NfcGFnZSA9IE5VTEw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzcGluX2xvY2soJmluZm8tPmxvY2spOwotCXNobWVtX3JlY2FsY19pbm9kZShpbm9kZSk7Ci0JZW50cnkgPSBzaG1lbV9zd3BfYWxsb2MoaW5mbywgaWR4LCBzZ3AsIGdmcCk7Ci0JaWYgKElTX0VSUihlbnRyeSkpIHsKLQkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotCQllcnJvciA9IFBUUl9FUlIoZW50cnkpOwotCQlnb3RvIG91dDsKLQl9Ci0Jc3dhcCA9ICplbnRyeTsKKwlpbmZvID0gU0hNRU1fSShpbm9kZSk7CisJc2JpbmZvID0gU0hNRU1fU0IoaW5vZGUtPmlfc2IpOwogCiAJaWYgKHN3YXAudmFsKSB7CiAJCS8qIExvb2sgaXQgdXAgYW5kIHJlYWQgaXQgaW4uLiAqLwogCQlwYWdlID0gbG9va3VwX3N3YXBfY2FjaGUoc3dhcCk7CiAJCWlmICghcGFnZSkgewotCQkJc2htZW1fc3dwX3VubWFwKGVudHJ5KTsKLQkJCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKIAkJCS8qIGhlcmUgd2UgYWN0dWFsbHkgZG8gdGhlIGlvICovCiAJCQlpZiAoZmF1bHRfdHlwZSkKIAkJCQkqZmF1bHRfdHlwZSB8PSBWTV9GQVVMVF9NQUpPUjsKLQkJCXBhZ2UgPSBzaG1lbV9zd2FwaW4oc3dhcCwgZ2ZwLCBpbmZvLCBpZHgpOworCQkJcGFnZSA9IHNobWVtX3N3YXBpbihzd2FwLCBnZnAsIGluZm8sIGluZGV4KTsKIAkJCWlmICghcGFnZSkgewotCQkJCXNwaW5fbG9jaygmaW5mby0+bG9jayk7Ci0JCQkJZW50cnkgPSBzaG1lbV9zd3BfYWxsb2MoaW5mbywgaWR4LCBzZ3AsIGdmcCk7Ci0JCQkJaWYgKElTX0VSUihlbnRyeSkpCi0JCQkJCWVycm9yID0gUFRSX0VSUihlbnRyeSk7Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChlbnRyeS0+dmFsID09IHN3YXAudmFsKQotCQkJCQkJZXJyb3IgPSAtRU5PTUVNOwotCQkJCQlzaG1lbV9zd3BfdW5tYXAoZW50cnkpOwotCQkJCX0KLQkJCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7Ci0JCQkJaWYgKGVycm9yKQotCQkJCQlnb3RvIG91dDsKLQkJCQlnb3RvIHJlcGVhdDsKKwkJCQllcnJvciA9IC1FTk9NRU07CisJCQkJZ290byBmYWlsZWQ7CiAJCQl9Ci0JCQl3YWl0X29uX3BhZ2VfbG9ja2VkKHBhZ2UpOwotCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCQkJZ290byByZXBlYXQ7CiAJCX0KIAogCQkvKiBXZSBoYXZlIHRvIGRvIHRoaXMgd2l0aCBwYWdlIGxvY2tlZCB0byBwcmV2ZW50IHJhY2VzICovCi0JCWlmICghdHJ5bG9ja19wYWdlKHBhZ2UpKSB7Ci0JCQlzaG1lbV9zd3BfdW5tYXAoZW50cnkpOwotCQkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotCQkJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKLQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLQkJCWdvdG8gcmVwZWF0OwotCQl9Ci0JCWlmIChQYWdlV3JpdGViYWNrKHBhZ2UpKSB7Ci0JCQlzaG1lbV9zd3BfdW5tYXAoZW50cnkpOwotCQkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotCQkJd2FpdF9vbl9wYWdlX3dyaXRlYmFjayhwYWdlKTsKLQkJCXVubG9ja19wYWdlKHBhZ2UpOwotCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCQkJZ290byByZXBlYXQ7Ci0JCX0KKwkJbG9ja19wYWdlKHBhZ2UpOwogCQlpZiAoIVBhZ2VVcHRvZGF0ZShwYWdlKSkgewotCQkJc2htZW1fc3dwX3VubWFwKGVudHJ5KTsKLQkJCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKLQkJCXVubG9ja19wYWdlKHBhZ2UpOwotCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwogCQkJZXJyb3IgPSAtRUlPOwotCQkJZ290byBvdXQ7CisJCQlnb3RvIGZhaWxlZDsKKwkJfQorCQl3YWl0X29uX3BhZ2Vfd3JpdGViYWNrKHBhZ2UpOworCisJCS8qIFNvbWVvbmUgbWF5IGhhdmUgYWxyZWFkeSBkb25lIGl0IGZvciB1cyAqLworCQlpZiAocGFnZS0+bWFwcGluZykgeworCQkJaWYgKHBhZ2UtPm1hcHBpbmcgPT0gbWFwcGluZyAmJgorCQkJICAgIHBhZ2UtPmluZGV4ID09IGluZGV4KQorCQkJCWdvdG8gZG9uZTsKKwkJCWVycm9yID0gLUVFWElTVDsKKwkJCWdvdG8gZmFpbGVkOwogCQl9CiAKLQkJZXJyb3IgPSBhZGRfdG9fcGFnZV9jYWNoZV9sb2NrZWQocGFnZSwgbWFwcGluZywKLQkJCQkJCSBpZHgsIEdGUF9OT1dBSVQpOwotCQlpZiAoZXJyb3IpIHsKLQkJCXNobWVtX3N3cF91bm1hcChlbnRyeSk7Ci0JCQlzcGluX3VubG9jaygmaW5mby0+bG9jayk7Ci0JCQlpZiAoZXJyb3IgPT0gLUVOT01FTSkgewotCQkJCS8qCi0JCQkJICogcmVjbGFpbSBmcm9tIHByb3BlciBtZW1vcnkgY2dyb3VwIGFuZAotCQkJCSAqIGNhbGwgbWVtY2cncyBPT00gaWYgbmVlZGVkLgotCQkJCSAqLwotCQkJCWVycm9yID0gbWVtX2Nncm91cF9zaG1lbV9jaGFyZ2VfZmFsbGJhY2soCi0JCQkJCQlwYWdlLCBjdXJyZW50LT5tbSwgZ2ZwKTsKLQkJCQlpZiAoZXJyb3IpIHsKLQkJCQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLQkJCQkJZ290byBvdXQ7Ci0JCQkJfQotCQkJfQotCQkJdW5sb2NrX3BhZ2UocGFnZSk7Ci0JCQlwYWdlX2NhY2hlX3JlbGVhc2UocGFnZSk7Ci0JCQlnb3RvIHJlcGVhdDsKLQkJfQorCQllcnJvciA9IG1lbV9jZ3JvdXBfY2FjaGVfY2hhcmdlKHBhZ2UsIGN1cnJlbnQtPm1tLAorCQkJCQkJZ2ZwICYgR0ZQX1JFQ0xBSU1fTUFTSyk7CisJCWlmICghZXJyb3IpCisJCQllcnJvciA9IHNobWVtX2FkZF90b19wYWdlX2NhY2hlKHBhZ2UsIG1hcHBpbmcsIGluZGV4LAorCQkJCQkJZ2ZwLCBzd3BfdG9fcmFkaXhfZW50cnkoc3dhcCkpOworCQlpZiAoZXJyb3IpCisJCQlnb3RvIGZhaWxlZDsKIAotCQlpbmZvLT5mbGFncyB8PSBTSE1FTV9QQUdFSU47Ci0JCXNobWVtX3N3cF9zZXQoaW5mbywgZW50cnksIDApOwotCQlzaG1lbV9zd3BfdW5tYXAoZW50cnkpOwotCQlkZWxldGVfZnJvbV9zd2FwX2NhY2hlKHBhZ2UpOworCQlzcGluX2xvY2soJmluZm8tPmxvY2spOworCQlpbmZvLT5zd2FwcGVkLS07CisJCXNobWVtX3JlY2FsY19pbm9kZShpbm9kZSk7CiAJCXNwaW5fdW5sb2NrKCZpbmZvLT5sb2NrKTsKKworCQlkZWxldGVfZnJvbV9zd2FwX2NhY2hlKHBhZ2UpOwogCQlzZXRfcGFnZV9kaXJ0eShwYWdlKTsKIAkJc3dhcF9mcmVlKHN3YXApOwogCi0JfSBlbHNlIGlmIChzZ3AgPT0gU0dQX1JFQUQpIHsKLQkJc2htZW1fc3dwX3VubWFwKGVudHJ5KTsKLQkJcGFnZSA9IGZpbmRfZ2V0X3BhZ2UobWFwcGluZywgaWR4KTsKLQkJaWYgKHBhZ2UgJiYgIXRyeWxvY2tfcGFnZShwYWdlKSkgewotCQkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotCQkJd2FpdF9vbl9wYWdlX2xvY2tlZChwYWdlKTsKLQkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKLQkJCWdvdG8gcmVwZWF0OworCX0gZWxzZSB7CisJCWlmIChzaG1lbV9hY2N0X2Jsb2NrKGluZm8tPmZsYWdzKSkgeworCQkJZXJyb3IgPSAtRU5PU1BDOworCQkJZ290byBmYWlsZWQ7CiAJCX0KLQkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotCi0JfSBlbHNlIGlmIChwcmVhbGxvY19wYWdlKSB7Ci0JCXNobWVtX3N3cF91bm1hcChlbnRyeSk7Ci0JCXNiaW5mbyA9IFNITUVNX1NCKGlub2RlLT5pX3NiKTsKIAkJaWYgKHNiaW5mby0+bWF4X2Jsb2NrcykgewogCQkJaWYgKHBlcmNwdV9jb3VudGVyX2NvbXBhcmUoJnNiaW5mby0+dXNlZF9ibG9ja3MsCi0JCQkJCQlzYmluZm8tPm1heF9ibG9ja3MpID49IDAgfHwKLQkJCSAgICBzaG1lbV9hY2N0X2Jsb2NrKGluZm8tPmZsYWdzKSkKLQkJCQlnb3RvIG5vc3BhY2U7CisJCQkJCQlzYmluZm8tPm1heF9ibG9ja3MpID49IDApIHsKKwkJCQllcnJvciA9IC1FTk9TUEM7CisJCQkJZ290byB1bmFjY3Q7CisJCQl9CiAJCQlwZXJjcHVfY291bnRlcl9pbmMoJnNiaW5mby0+dXNlZF9ibG9ja3MpOwotCQkJaW5vZGUtPmlfYmxvY2tzICs9IEJMT0NLU19QRVJfUEFHRTsKLQkJfSBlbHNlIGlmIChzaG1lbV9hY2N0X2Jsb2NrKGluZm8tPmZsYWdzKSkKLQkJCWdvdG8gbm9zcGFjZTsKLQotCQlwYWdlID0gcHJlYWxsb2NfcGFnZTsKLQkJcHJlYWxsb2NfcGFnZSA9IE5VTEw7Ci0KLQkJZW50cnkgPSBzaG1lbV9zd3BfYWxsb2MoaW5mbywgaWR4LCBzZ3AsIGdmcCk7Ci0JCWlmIChJU19FUlIoZW50cnkpKQotCQkJZXJyb3IgPSBQVFJfRVJSKGVudHJ5KTsKLQkJZWxzZSB7Ci0JCQlzd2FwID0gKmVudHJ5OwotCQkJc2htZW1fc3dwX3VubWFwKGVudHJ5KTsKLQkJfQotCQlyZXQgPSBlcnJvciB8fCBzd2FwLnZhbDsKLQkJaWYgKHJldCkKLQkJCW1lbV9jZ3JvdXBfdW5jaGFyZ2VfY2FjaGVfcGFnZShwYWdlKTsKLQkJZWxzZQotCQkJcmV0ID0gYWRkX3RvX3BhZ2VfY2FjaGVfbHJ1KHBhZ2UsIG1hcHBpbmcsCi0JCQkJCQlpZHgsIEdGUF9OT1dBSVQpOwotCQkvKgotCQkgKiBBdCBhZGRfdG9fcGFnZV9jYWNoZV9scnUoKSBmYWlsdXJlLAotCQkgKiB1bmNoYXJnZSB3aWxsIGJlIGRvbmUgYXV0b21hdGljYWxseS4KLQkJICovCi0JCWlmIChyZXQpIHsKLQkJCXNobWVtX3VuYWNjdF9ibG9ja3MoaW5mby0+ZmxhZ3MsIDEpOwotCQkJc2htZW1fZnJlZV9ibG9ja3MoaW5vZGUsIDEpOwotCQkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotCQkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOwotCQkJaWYgKGVycm9yKQotCQkJCWdvdG8gb3V0OwotCQkJZ290byByZXBlYXQ7CiAJCX0KIAotCQlpbmZvLT5mbGFncyB8PSBTSE1FTV9QQUdFSU47CisJCXBhZ2UgPSBzaG1lbV9hbGxvY19wYWdlKGdmcCwgaW5mbywgaW5kZXgpOworCQlpZiAoIXBhZ2UpIHsKKwkJCWVycm9yID0gLUVOT01FTTsKKwkJCWdvdG8gZGVjdXNlZDsKKwkJfQorCisJCVNldFBhZ2VTd2FwQmFja2VkKHBhZ2UpOworCQlfX3NldF9wYWdlX2xvY2tlZChwYWdlKTsKKwkJZXJyb3IgPSBtZW1fY2dyb3VwX2NhY2hlX2NoYXJnZShwYWdlLCBjdXJyZW50LT5tbSwKKwkJCQkJCWdmcCAmIEdGUF9SRUNMQUlNX01BU0spOworCQlpZiAoIWVycm9yKQorCQkJZXJyb3IgPSBzaG1lbV9hZGRfdG9fcGFnZV9jYWNoZShwYWdlLCBtYXBwaW5nLCBpbmRleCwKKwkJCQkJCWdmcCwgTlVMTCk7CisJCWlmIChlcnJvcikKKwkJCWdvdG8gZGVjdXNlZDsKKwkJbHJ1X2NhY2hlX2FkZF9hbm9uKHBhZ2UpOworCisJCXNwaW5fbG9jaygmaW5mby0+bG9jayk7CiAJCWluZm8tPmFsbG9jZWQrKzsKKwkJaW5vZGUtPmlfYmxvY2tzICs9IEJMT0NLU19QRVJfUEFHRTsKKwkJc2htZW1fcmVjYWxjX2lub2RlKGlub2RlKTsKIAkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOworCiAJCWNsZWFyX2hpZ2hwYWdlKHBhZ2UpOwogCQlmbHVzaF9kY2FjaGVfcGFnZShwYWdlKTsKIAkJU2V0UGFnZVVwdG9kYXRlKHBhZ2UpOwogCQlpZiAoc2dwID09IFNHUF9ESVJUWSkKIAkJCXNldF9wYWdlX2RpcnR5KHBhZ2UpOwotCi0JfSBlbHNlIHsKLQkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotCQllcnJvciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwogCX0KIGRvbmU6Ci0JKnBhZ2VwID0gcGFnZTsKLQllcnJvciA9IDA7Ci1vdXQ6Ci0JaWYgKHByZWFsbG9jX3BhZ2UpIHsKLQkJbWVtX2Nncm91cF91bmNoYXJnZV9jYWNoZV9wYWdlKHByZWFsbG9jX3BhZ2UpOwotCQlwYWdlX2NhY2hlX3JlbGVhc2UocHJlYWxsb2NfcGFnZSk7CisJLyogUGVyaGFwcyB0aGUgZmlsZSBoYXMgYmVlbiB0cnVuY2F0ZWQgc2luY2Ugd2UgY2hlY2tlZCAqLworCWlmIChzZ3AgIT0gU0dQX1dSSVRFICYmCisJICAgICgobG9mZl90KWluZGV4IDw8IFBBR0VfQ0FDSEVfU0hJRlQpID49IGlfc2l6ZV9yZWFkKGlub2RlKSkgeworCQllcnJvciA9IC1FSU5WQUw7CisJCWdvdG8gdHJ1bmM7CiAJfQotCXJldHVybiBlcnJvcjsKKwkqcGFnZXAgPSBwYWdlOworCXJldHVybiAwOwogCi1ub3NwYWNlOgogCS8qCi0JICogUGVyaGFwcyB0aGUgcGFnZSB3YXMgYnJvdWdodCBpbiBmcm9tIHN3YXAgYmV0d2VlbiBmaW5kX2xvY2tfcGFnZQotCSAqIGFuZCB0YWtpbmcgaW5mby0+bG9jaz8gIFdlIGFsbG93IGZvciB0aGF0IGF0IGFkZF90b19wYWdlX2NhY2hlX2xydSwKLQkgKiBidXQgbXVzdCBhbHNvIGF2b2lkIHJlcG9ydGluZyBhIHNwdXJpb3VzIEVOT1NQQyB3aGlsZSB3b3JraW5nIG9uIGEKLQkgKiBmdWxsIHRtcGZzLgorCSAqIEVycm9yIHJlY292ZXJ5LgogCSAqLwotCXBhZ2UgPSBmaW5kX2dldF9wYWdlKG1hcHBpbmcsIGlkeCk7Cit0cnVuYzoKKwlDbGVhclBhZ2VEaXJ0eShwYWdlKTsKKwlkZWxldGVfZnJvbV9wYWdlX2NhY2hlKHBhZ2UpOworCXNwaW5fbG9jaygmaW5mby0+bG9jayk7CisJaW5mby0+YWxsb2NlZC0tOworCWlub2RlLT5pX2Jsb2NrcyAtPSBCTE9DS1NfUEVSX1BBR0U7CiAJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOworZGVjdXNlZDoKKwlpZiAoc2JpbmZvLT5tYXhfYmxvY2tzKQorCQlwZXJjcHVfY291bnRlcl9hZGQoJnNiaW5mby0+dXNlZF9ibG9ja3MsIC0xKTsKK3VuYWNjdDoKKwlzaG1lbV91bmFjY3RfYmxvY2tzKGluZm8tPmZsYWdzLCAxKTsKK2ZhaWxlZDoKKwlpZiAoc3dhcC52YWwgJiYgZXJyb3IgIT0gLUVJTlZBTCkgeworCQlzdHJ1Y3QgcGFnZSAqdGVzdCA9IGZpbmRfZ2V0X3BhZ2UobWFwcGluZywgaW5kZXgpOworCQlpZiAodGVzdCAmJiAhcmFkaXhfdHJlZV9leGNlcHRpb25hbF9lbnRyeSh0ZXN0KSkKKwkJCXBhZ2VfY2FjaGVfcmVsZWFzZSh0ZXN0KTsKKwkJLyogSGF2ZSBhbm90aGVyIHRyeSBpZiB0aGUgZW50cnkgaGFzIGNoYW5nZWQgKi8KKwkJaWYgKHRlc3QgIT0gc3dwX3RvX3JhZGl4X2VudHJ5KHN3YXApKQorCQkJZXJyb3IgPSAtRUVYSVNUOworCX0KIAlpZiAocGFnZSkgeworCQl1bmxvY2tfcGFnZShwYWdlKTsKIAkJcGFnZV9jYWNoZV9yZWxlYXNlKHBhZ2UpOworCX0KKwlpZiAoZXJyb3IgPT0gLUVOT1NQQyAmJiAhb25jZSsrKSB7CisJCWluZm8gPSBTSE1FTV9JKGlub2RlKTsKKwkJc3Bpbl9sb2NrKCZpbmZvLT5sb2NrKTsKKwkJc2htZW1fcmVjYWxjX2lub2RlKGlub2RlKTsKKwkJc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwogCQlnb3RvIHJlcGVhdDsKIAl9Ci0JZXJyb3IgPSAtRU5PU1BDOwotCWdvdG8gb3V0OworCWlmIChlcnJvciA9PSAtRUVYSVNUKQorCQlnb3RvIHJlcGVhdDsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIHN0YXRpYyBpbnQgc2htZW1fZmF1bHQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCB2bV9mYXVsdCAqdm1mKQpAQCAtMTQ2Nyw5ICsxMDIyLDYgQEAKIAlpbnQgZXJyb3I7CiAJaW50IHJldCA9IFZNX0ZBVUxUX0xPQ0tFRDsKIAotCWlmICgoKGxvZmZfdCl2bWYtPnBnb2ZmIDw8IFBBR0VfQ0FDSEVfU0hJRlQpID49IGlfc2l6ZV9yZWFkKGlub2RlKSkKLQkJcmV0dXJuIFZNX0ZBVUxUX1NJR0JVUzsKLQogCWVycm9yID0gc2htZW1fZ2V0cGFnZShpbm9kZSwgdm1mLT5wZ29mZiwgJnZtZi0+cGFnZSwgU0dQX0NBQ0hFLCAmcmV0KTsKIAlpZiAoZXJyb3IpCiAJCXJldHVybiAoKGVycm9yID09IC1FTk9NRU0pID8gVk1fRkFVTFRfT09NIDogVk1fRkFVTFRfU0lHQlVTKTsKQEAgLTE0ODIsMjAgKzEwMzQsMjAgQEAKIH0KIAogI2lmZGVmIENPTkZJR19OVU1BCi1zdGF0aWMgaW50IHNobWVtX3NldF9wb2xpY3koc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHN0cnVjdCBtZW1wb2xpY3kgKm5ldykKK3N0YXRpYyBpbnQgc2htZW1fc2V0X3BvbGljeShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IG1lbXBvbGljeSAqbXBvbCkKIHsKLQlzdHJ1Y3QgaW5vZGUgKmkgPSB2bWEtPnZtX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7Ci0JcmV0dXJuIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3koJlNITUVNX0koaSktPnBvbGljeSwgdm1hLCBuZXcpOworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSB2bWEtPnZtX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CisJcmV0dXJuIG1wb2xfc2V0X3NoYXJlZF9wb2xpY3koJlNITUVNX0koaW5vZGUpLT5wb2xpY3ksIHZtYSwgbXBvbCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbWVtcG9saWN5ICpzaG1lbV9nZXRfcG9saWN5KHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAogCQkJCQkgIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKLQlzdHJ1Y3QgaW5vZGUgKmkgPSB2bWEtPnZtX2ZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7Ci0JdW5zaWduZWQgbG9uZyBpZHg7CisJc3RydWN0IGlub2RlICppbm9kZSA9IHZtYS0+dm1fZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKKwlwZ29mZl90IGluZGV4OwogCi0JaWR4ID0gKChhZGRyIC0gdm1hLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVCkgKyB2bWEtPnZtX3Bnb2ZmOwotCXJldHVybiBtcG9sX3NoYXJlZF9wb2xpY3lfbG9va3VwKCZTSE1FTV9JKGkpLT5wb2xpY3ksIGlkeCk7CisJaW5kZXggPSAoKGFkZHIgLSB2bWEtPnZtX3N0YXJ0KSA+PiBQQUdFX1NISUZUKSArIHZtYS0+dm1fcGdvZmY7CisJcmV0dXJuIG1wb2xfc2hhcmVkX3BvbGljeV9sb29rdXAoJlNITUVNX0koaW5vZGUpLT5wb2xpY3ksIGluZGV4KTsKIH0KICNlbmRpZgogCkBAIC0xNTkzLDcgKzExNDUsNyBAQAogCiAjaWZkZWYgQ09ORklHX1RNUEZTCiBzdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc2htZW1fc3ltbGlua19pbm9kZV9vcGVyYXRpb25zOwotc3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHNobWVtX3N5bWxpbmtfaW5saW5lX29wZXJhdGlvbnM7CitzdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc2htZW1fc2hvcnRfc3ltbGlua19vcGVyYXRpb25zOwogCiBzdGF0aWMgaW50CiBzaG1lbV93cml0ZV9iZWdpbihzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcsCkBAIC0xNjI2LDcgKzExNzgsOCBAQAogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gaW5vZGUtPmlfbWFwcGluZzsKLQl1bnNpZ25lZCBsb25nIGluZGV4LCBvZmZzZXQ7CisJcGdvZmZfdCBpbmRleDsKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKIAllbnVtIHNncF90eXBlIHNncCA9IFNHUF9SRUFEOwogCiAJLyoKQEAgLTE2NDIsNyArMTE5NSw4IEBACiAKIAlmb3IgKDs7KSB7CiAJCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKLQkJdW5zaWduZWQgbG9uZyBlbmRfaW5kZXgsIG5yLCByZXQ7CisJCXBnb2ZmX3QgZW5kX2luZGV4OworCQl1bnNpZ25lZCBsb25nIG5yLCByZXQ7CiAJCWxvZmZfdCBpX3NpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CiAKIAkJZW5kX2luZGV4ID0gaV9zaXplID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CkBAIC0xODgwLDggKzE0MzQsOSBAQAogCWJ1Zi0+Zl9uYW1lbGVuID0gTkFNRV9NQVg7CiAJaWYgKHNiaW5mby0+bWF4X2Jsb2NrcykgewogCQlidWYtPmZfYmxvY2tzID0gc2JpbmZvLT5tYXhfYmxvY2tzOwotCQlidWYtPmZfYmF2YWlsID0gYnVmLT5mX2JmcmVlID0KLQkJCQlzYmluZm8tPm1heF9ibG9ja3MgLSBwZXJjcHVfY291bnRlcl9zdW0oJnNiaW5mby0+dXNlZF9ibG9ja3MpOworCQlidWYtPmZfYmF2YWlsID0KKwkJYnVmLT5mX2JmcmVlICA9IHNiaW5mby0+bWF4X2Jsb2NrcyAtCisJCQkJcGVyY3B1X2NvdW50ZXJfc3VtKCZzYmluZm8tPnVzZWRfYmxvY2tzKTsKIAl9CiAJaWYgKHNiaW5mby0+bWF4X2lub2RlcykgewogCQlidWYtPmZfZmlsZXMgPSBzYmluZm8tPm1heF9pbm9kZXM7CkBAIC0yMDU1LDEwICsxNjEwLDEzIEBACiAKIAlpbmZvID0gU0hNRU1fSShpbm9kZSk7CiAJaW5vZGUtPmlfc2l6ZSA9IGxlbi0xOwotCWlmIChsZW4gPD0gU0hNRU1fU1lNTElOS19JTkxJTkVfTEVOKSB7Ci0JCS8qIGRvIGl0IGlubGluZSAqLwotCQltZW1jcHkoaW5mby0+aW5saW5lX3N5bWxpbmssIHN5bW5hbWUsIGxlbik7Ci0JCWlub2RlLT5pX29wID0gJnNobWVtX3N5bWxpbmtfaW5saW5lX29wZXJhdGlvbnM7CisJaWYgKGxlbiA8PSBTSE9SVF9TWU1MSU5LX0xFTikgeworCQlpbmZvLT5zeW1saW5rID0ga21lbWR1cChzeW1uYW1lLCBsZW4sIEdGUF9LRVJORUwpOworCQlpZiAoIWluZm8tPnN5bWxpbmspIHsKKwkJCWlwdXQoaW5vZGUpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJaW5vZGUtPmlfb3AgPSAmc2htZW1fc2hvcnRfc3ltbGlua19vcGVyYXRpb25zOwogCX0gZWxzZSB7CiAJCWVycm9yID0gc2htZW1fZ2V0cGFnZShpbm9kZSwgMCwgJnBhZ2UsIFNHUF9XUklURSwgTlVMTCk7CiAJCWlmIChlcnJvcikgewpAQCAtMjA4MSwxNyArMTYzOSwxNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCAqc2htZW1fZm9sbG93X2xpbmtfaW5saW5lKHN0cnVjdCBkZW50cnkgKmRlbnRyeSwgc3RydWN0IG5hbWVpZGF0YSAqbmQpCitzdGF0aWMgdm9pZCAqc2htZW1fZm9sbG93X3Nob3J0X3N5bWxpbmsoc3RydWN0IGRlbnRyeSAqZGVudHJ5LCBzdHJ1Y3QgbmFtZWlkYXRhICpuZCkKIHsKLQluZF9zZXRfbGluayhuZCwgU0hNRU1fSShkZW50cnktPmRfaW5vZGUpLT5pbmxpbmVfc3ltbGluayk7CisJbmRfc2V0X2xpbmsobmQsIFNITUVNX0koZGVudHJ5LT5kX2lub2RlKS0+c3ltbGluayk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyB2b2lkICpzaG1lbV9mb2xsb3dfbGluayhzdHJ1Y3QgZGVudHJ5ICpkZW50cnksIHN0cnVjdCBuYW1laWRhdGEgKm5kKQogewogCXN0cnVjdCBwYWdlICpwYWdlID0gTlVMTDsKLQlpbnQgcmVzID0gc2htZW1fZ2V0cGFnZShkZW50cnktPmRfaW5vZGUsIDAsICZwYWdlLCBTR1BfUkVBRCwgTlVMTCk7Ci0JbmRfc2V0X2xpbmsobmQsIHJlcyA/IEVSUl9QVFIocmVzKSA6IGttYXAocGFnZSkpOworCWludCBlcnJvciA9IHNobWVtX2dldHBhZ2UoZGVudHJ5LT5kX2lub2RlLCAwLCAmcGFnZSwgU0dQX1JFQUQsIE5VTEwpOworCW5kX3NldF9saW5rKG5kLCBlcnJvciA/IEVSUl9QVFIoZXJyb3IpIDoga21hcChwYWdlKSk7CiAJaWYgKHBhZ2UpCiAJCXVubG9ja19wYWdlKHBhZ2UpOwogCXJldHVybiBwYWdlOwpAQCAtMjIwMiw3ICsxNzYwLDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeGF0dHJfaGFuZGxlciAqc2htZW1feGF0dHJfaGFuZGxlcnNbXSA9IHsKICNpZmRlZiBDT05GSUdfVE1QRlNfUE9TSVhfQUNMCiAJJmdlbmVyaWNfYWNsX2FjY2Vzc19oYW5kbGVyLApAQCAtMjMzMiw5ICsxODg5LDkgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfVE1QRlNfWEFUVFIgKi8KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBpbm9kZV9vcGVyYXRpb25zIHNobWVtX3N5bWxpbmtfaW5saW5lX29wZXJhdGlvbnMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGlub2RlX29wZXJhdGlvbnMgc2htZW1fc2hvcnRfc3ltbGlua19vcGVyYXRpb25zID0gewogCS5yZWFkbGluawk9IGdlbmVyaWNfcmVhZGxpbmssCi0JLmZvbGxvd19saW5rCT0gc2htZW1fZm9sbG93X2xpbmtfaW5saW5lLAorCS5mb2xsb3dfbGluawk9IHNobWVtX2ZvbGxvd19zaG9ydF9zeW1saW5rLAogI2lmZGVmIENPTkZJR19UTVBGU19YQVRUUgogCS5zZXR4YXR0cgk9IHNobWVtX3NldHhhdHRyLAogCS5nZXR4YXR0cgk9IHNobWVtX2dldHhhdHRyLApAQCAtMjUzNCw4ICsyMDkxLDcgQEAKIAlpZiAoY29uZmlnLm1heF9pbm9kZXMgPCBpbm9kZXMpCiAJCWdvdG8gb3V0OwogCS8qCi0JICogVGhvc2UgdGVzdHMgYWxzbyBkaXNhbGxvdyBsaW1pdGVkLT51bmxpbWl0ZWQgd2hpbGUgYW55IGFyZSBpbgotCSAqIHVzZSwgc28gaV9ibG9ja3Mgd2lsbCBhbHdheXMgYmUgemVybyB3aGVuIG1heF9ibG9ja3MgaXMgemVybzsKKwkgKiBUaG9zZSB0ZXN0cyBkaXNhbGxvdyBsaW1pdGVkLT51bmxpbWl0ZWQgd2hpbGUgYW55IGFyZSBpbiB1c2U7CiAJICogYnV0IHdlIG11c3Qgc2VwYXJhdGVseSBkaXNhbGxvdyB1bmxpbWl0ZWQtPmxpbWl0ZWQsIGJlY2F1c2UKIAkgKiBpbiB0aGF0IGNhc2Ugd2UgaGF2ZSBubyByZWNvcmQgb2YgaG93IG11Y2ggaXMgYWxyZWFkeSBpbiB1c2UuCiAJICovCkBAIC0yNjI3LDcgKzIxODMsNyBAQAogCQlnb3RvIGZhaWxlZDsKIAlzYmluZm8tPmZyZWVfaW5vZGVzID0gc2JpbmZvLT5tYXhfaW5vZGVzOwogCi0Jc2ItPnNfbWF4Ynl0ZXMgPSBTSE1FTV9NQVhfQllURVM7CisJc2ItPnNfbWF4Ynl0ZXMgPSBNQVhfTEZTX0ZJTEVTSVpFOwogCXNiLT5zX2Jsb2Nrc2l6ZSA9IFBBR0VfQ0FDSEVfU0laRTsKIAlzYi0+c19ibG9ja3NpemVfYml0cyA9IFBBR0VfQ0FDSEVfU0hJRlQ7CiAJc2ItPnNfbWFnaWMgPSBUTVBGU19NQUdJQzsKQEAgLTI2NjIsMTQgKzIyMTgsMTQgQEAKIAogc3RhdGljIHN0cnVjdCBpbm9kZSAqc2htZW1fYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYikKIHsKLQlzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqcDsKLQlwID0gKHN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvICopa21lbV9jYWNoZV9hbGxvYyhzaG1lbV9pbm9kZV9jYWNoZXAsIEdGUF9LRVJORUwpOwotCWlmICghcCkKKwlzdHJ1Y3Qgc2htZW1faW5vZGVfaW5mbyAqaW5mbzsKKwlpbmZvID0ga21lbV9jYWNoZV9hbGxvYyhzaG1lbV9pbm9kZV9jYWNoZXAsIEdGUF9LRVJORUwpOworCWlmICghaW5mbykKIAkJcmV0dXJuIE5VTEw7Ci0JcmV0dXJuICZwLT52ZnNfaW5vZGU7CisJcmV0dXJuICZpbmZvLT52ZnNfaW5vZGU7CiB9CiAKLXN0YXRpYyB2b2lkIHNobWVtX2lfY2FsbGJhY2soc3RydWN0IHJjdV9oZWFkICpoZWFkKQorc3RhdGljIHZvaWQgc2htZW1fZGVzdHJveV9jYWxsYmFjayhzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCiB7CiAJc3RydWN0IGlub2RlICppbm9kZSA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgaW5vZGUsIGlfcmN1KTsKIAlJTklUX0xJU1RfSEVBRCgmaW5vZGUtPmlfZGVudHJ5KTsKQEAgLTI2NzgsMjkgKzIyMzQsMjYgQEAKIAogc3RhdGljIHZvaWQgc2htZW1fZGVzdHJveV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCWlmICgoaW5vZGUtPmlfbW9kZSAmIFNfSUZNVCkgPT0gU19JRlJFRykgewotCQkvKiBvbmx5IHN0cnVjdCBpbm9kZSBpcyB2YWxpZCBpZiBpdCdzIGFuIGlubGluZSBzeW1saW5rICovCisJaWYgKChpbm9kZS0+aV9tb2RlICYgU19JRk1UKSA9PSBTX0lGUkVHKQogCQltcG9sX2ZyZWVfc2hhcmVkX3BvbGljeSgmU0hNRU1fSShpbm9kZSktPnBvbGljeSk7Ci0JfQotCWNhbGxfcmN1KCZpbm9kZS0+aV9yY3UsIHNobWVtX2lfY2FsbGJhY2spOworCWNhbGxfcmN1KCZpbm9kZS0+aV9yY3UsIHNobWVtX2Rlc3Ryb3lfY2FsbGJhY2spOwogfQogCi1zdGF0aWMgdm9pZCBpbml0X29uY2Uodm9pZCAqZm9vKQorc3RhdGljIHZvaWQgc2htZW1faW5pdF9pbm9kZSh2b2lkICpmb28pCiB7Ci0Jc3RydWN0IHNobWVtX2lub2RlX2luZm8gKnAgPSAoc3RydWN0IHNobWVtX2lub2RlX2luZm8gKikgZm9vOwotCi0JaW5vZGVfaW5pdF9vbmNlKCZwLT52ZnNfaW5vZGUpOworCXN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvICppbmZvID0gZm9vOworCWlub2RlX2luaXRfb25jZSgmaW5mby0+dmZzX2lub2RlKTsKIH0KIAotc3RhdGljIGludCBpbml0X2lub2RlY2FjaGUodm9pZCkKK3N0YXRpYyBpbnQgc2htZW1faW5pdF9pbm9kZWNhY2hlKHZvaWQpCiB7CiAJc2htZW1faW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGUoInNobWVtX2lub2RlX2NhY2hlIiwKIAkJCQlzaXplb2Yoc3RydWN0IHNobWVtX2lub2RlX2luZm8pLAotCQkJCTAsIFNMQUJfUEFOSUMsIGluaXRfb25jZSk7CisJCQkJMCwgU0xBQl9QQU5JQywgc2htZW1faW5pdF9pbm9kZSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGRlc3Ryb3lfaW5vZGVjYWNoZSh2b2lkKQorc3RhdGljIHZvaWQgc2htZW1fZGVzdHJveV9pbm9kZWNhY2hlKHZvaWQpCiB7CiAJa21lbV9jYWNoZV9kZXN0cm95KHNobWVtX2lub2RlX2NhY2hlcCk7CiB9CkBAIC0yNzk3LDIxICsyMzUwLDIwIEBACiAjZW5kaWYKIH07CiAKLQogc3RhdGljIHN0cnVjdCBkZW50cnkgKnNobWVtX21vdW50KHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlICpmc190eXBlLAogCWludCBmbGFncywgY29uc3QgY2hhciAqZGV2X25hbWUsIHZvaWQgKmRhdGEpCiB7CiAJcmV0dXJuIG1vdW50X25vZGV2KGZzX3R5cGUsIGZsYWdzLCBkYXRhLCBzaG1lbV9maWxsX3N1cGVyKTsKIH0KIAotc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHRtcGZzX2ZzX3R5cGUgPSB7CitzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgc2htZW1fZnNfdHlwZSA9IHsKIAkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJLm5hbWUJCT0gInRtcGZzIiwKIAkubW91bnQJCT0gc2htZW1fbW91bnQsCiAJLmtpbGxfc2IJPSBraWxsX2xpdHRlcl9zdXBlciwKIH07CiAKLWludCBfX2luaXQgaW5pdF90bXBmcyh2b2lkKQoraW50IF9faW5pdCBzaG1lbV9pbml0KHZvaWQpCiB7CiAJaW50IGVycm9yOwogCkBAIC0yODE5LDE4ICsyMzcxLDE4IEBACiAJaWYgKGVycm9yKQogCQlnb3RvIG91dDQ7CiAKLQllcnJvciA9IGluaXRfaW5vZGVjYWNoZSgpOworCWVycm9yID0gc2htZW1faW5pdF9pbm9kZWNhY2hlKCk7CiAJaWYgKGVycm9yKQogCQlnb3RvIG91dDM7CiAKLQllcnJvciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnRtcGZzX2ZzX3R5cGUpOworCWVycm9yID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmc2htZW1fZnNfdHlwZSk7CiAJaWYgKGVycm9yKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IHJlZ2lzdGVyIHRtcGZzXG4iKTsKIAkJZ290byBvdXQyOwogCX0KIAotCXNobV9tbnQgPSB2ZnNfa2Vybl9tb3VudCgmdG1wZnNfZnNfdHlwZSwgTVNfTk9VU0VSLAotCQkJCXRtcGZzX2ZzX3R5cGUubmFtZSwgTlVMTCk7CisJc2htX21udCA9IHZmc19rZXJuX21vdW50KCZzaG1lbV9mc190eXBlLCBNU19OT1VTRVIsCisJCQkJIHNobWVtX2ZzX3R5cGUubmFtZSwgTlVMTCk7CiAJaWYgKElTX0VSUihzaG1fbW50KSkgewogCQllcnJvciA9IFBUUl9FUlIoc2htX21udCk7CiAJCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IGtlcm5fbW91bnQgdG1wZnNcbiIpOwpAQCAtMjgzOSw5ICsyMzkxLDkgQEAKIAlyZXR1cm4gMDsKIAogb3V0MToKLQl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnRtcGZzX2ZzX3R5cGUpOworCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmc2htZW1fZnNfdHlwZSk7CiBvdXQyOgotCWRlc3Ryb3lfaW5vZGVjYWNoZSgpOworCXNobWVtX2Rlc3Ryb3lfaW5vZGVjYWNoZSgpOwogb3V0MzoKIAliZGlfZGVzdHJveSgmc2htZW1fYmFja2luZ19kZXZfaW5mbyk7CiBvdXQ0OgpAQCAtMjg0OSw0NSArMjQwMSw2IEBACiAJcmV0dXJuIGVycm9yOwogfQogCi0jaWZkZWYgQ09ORklHX0NHUk9VUF9NRU1fUkVTX0NUTFIKLS8qKgotICogbWVtX2Nncm91cF9nZXRfc2htZW1fdGFyZ2V0IC0gZmluZCBhIHBhZ2Ugb3IgZW50cnkgYXNzaWduZWQgdG8gdGhlIHNobWVtIGZpbGUKLSAqIEBpbm9kZTogdGhlIGlub2RlIHRvIGJlIHNlYXJjaGVkCi0gKiBAcGdvZmY6IHRoZSBvZmZzZXQgdG8gYmUgc2VhcmNoZWQKLSAqIEBwYWdlcDogdGhlIHBvaW50ZXIgZm9yIHRoZSBmb3VuZCBwYWdlIHRvIGJlIHN0b3JlZAotICogQGVudDogdGhlIHBvaW50ZXIgZm9yIHRoZSBmb3VuZCBzd2FwIGVudHJ5IHRvIGJlIHN0b3JlZAotICoKLSAqIElmIGEgcGFnZSBpcyBmb3VuZCwgcmVmY291bnQgb2YgaXQgaXMgaW5jcmVtZW50ZWQuIENhbGxlcnMgc2hvdWxkIGhhbmRsZQotICogdGhlc2UgcmVmY291bnQuCi0gKi8KLXZvaWQgbWVtX2Nncm91cF9nZXRfc2htZW1fdGFyZ2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHBnb2ZmX3QgcGdvZmYsCi0JCQkJCXN0cnVjdCBwYWdlICoqcGFnZXAsIHN3cF9lbnRyeV90ICplbnQpCi17Ci0Jc3dwX2VudHJ5X3QgZW50cnkgPSB7IC52YWwgPSAwIH0sICpwdHI7Ci0Jc3RydWN0IHBhZ2UgKnBhZ2UgPSBOVUxMOwotCXN0cnVjdCBzaG1lbV9pbm9kZV9pbmZvICppbmZvID0gU0hNRU1fSShpbm9kZSk7Ci0KLQlpZiAoKHBnb2ZmIDw8IFBBR0VfQ0FDSEVfU0hJRlQpID49IGlfc2l6ZV9yZWFkKGlub2RlKSkKLQkJZ290byBvdXQ7Ci0KLQlzcGluX2xvY2soJmluZm8tPmxvY2spOwotCXB0ciA9IHNobWVtX3N3cF9lbnRyeShpbmZvLCBwZ29mZiwgTlVMTCk7Ci0jaWZkZWYgQ09ORklHX1NXQVAKLQlpZiAocHRyICYmIHB0ci0+dmFsKSB7Ci0JCWVudHJ5LnZhbCA9IHB0ci0+dmFsOwotCQlwYWdlID0gZmluZF9nZXRfcGFnZSgmc3dhcHBlcl9zcGFjZSwgZW50cnkudmFsKTsKLQl9IGVsc2UKLSNlbmRpZgotCQlwYWdlID0gZmluZF9nZXRfcGFnZShpbm9kZS0+aV9tYXBwaW5nLCBwZ29mZik7Ci0JaWYgKHB0cikKLQkJc2htZW1fc3dwX3VubWFwKHB0cik7Ci0Jc3Bpbl91bmxvY2soJmluZm8tPmxvY2spOwotb3V0OgotCSpwYWdlcCA9IHBhZ2U7Ci0JKmVudCA9IGVudHJ5OwotfQotI2VuZGlmCi0KICNlbHNlIC8qICFDT05GSUdfU0hNRU0gKi8KIAogLyoKQEAgLTI5MDEsMjMgKzI0MTQsMjMgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3JhbWZzLmg+CiAKLXN0YXRpYyBzdHJ1Y3QgZmlsZV9zeXN0ZW1fdHlwZSB0bXBmc19mc190eXBlID0geworc3RhdGljIHN0cnVjdCBmaWxlX3N5c3RlbV90eXBlIHNobWVtX2ZzX3R5cGUgPSB7CiAJLm5hbWUJCT0gInRtcGZzIiwKIAkubW91bnQJCT0gcmFtZnNfbW91bnQsCiAJLmtpbGxfc2IJPSBraWxsX2xpdHRlcl9zdXBlciwKIH07CiAKLWludCBfX2luaXQgaW5pdF90bXBmcyh2b2lkKQoraW50IF9faW5pdCBzaG1lbV9pbml0KHZvaWQpCiB7Ci0JQlVHX09OKHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnRtcGZzX2ZzX3R5cGUpICE9IDApOworCUJVR19PTihyZWdpc3Rlcl9maWxlc3lzdGVtKCZzaG1lbV9mc190eXBlKSAhPSAwKTsKIAotCXNobV9tbnQgPSBrZXJuX21vdW50KCZ0bXBmc19mc190eXBlKTsKKwlzaG1fbW50ID0ga2Vybl9tb3VudCgmc2htZW1fZnNfdHlwZSk7CiAJQlVHX09OKElTX0VSUihzaG1fbW50KSk7CiAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHNobWVtX3VudXNlKHN3cF9lbnRyeV90IGVudHJ5LCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK2ludCBzaG1lbV91bnVzZShzd3BfZW50cnlfdCBzd2FwLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKIAlyZXR1cm4gMDsKIH0KQEAgLTI5MjcsNDMgKzI0NDAsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBzaG1lbV90cnVuY2F0ZV9yYW5nZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBsb2ZmX3Qgc3RhcnQsIGxvZmZfdCBlbmQpCit2b2lkIHNobWVtX3RydW5jYXRlX3JhbmdlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBsc3RhcnQsIGxvZmZfdCBsZW5kKQogewotCXRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIHN0YXJ0LCBlbmQpOworCXRydW5jYXRlX2lub2RlX3BhZ2VzX3JhbmdlKGlub2RlLT5pX21hcHBpbmcsIGxzdGFydCwgbGVuZCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChzaG1lbV90cnVuY2F0ZV9yYW5nZSk7CiAKLSNpZmRlZiBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUgotLyoqCi0gKiBtZW1fY2dyb3VwX2dldF9zaG1lbV90YXJnZXQgLSBmaW5kIGEgcGFnZSBvciBlbnRyeSBhc3NpZ25lZCB0byB0aGUgc2htZW0gZmlsZQotICogQGlub2RlOiB0aGUgaW5vZGUgdG8gYmUgc2VhcmNoZWQKLSAqIEBwZ29mZjogdGhlIG9mZnNldCB0byBiZSBzZWFyY2hlZAotICogQHBhZ2VwOiB0aGUgcG9pbnRlciBmb3IgdGhlIGZvdW5kIHBhZ2UgdG8gYmUgc3RvcmVkCi0gKiBAZW50OiB0aGUgcG9pbnRlciBmb3IgdGhlIGZvdW5kIHN3YXAgZW50cnkgdG8gYmUgc3RvcmVkCi0gKgotICogSWYgYSBwYWdlIGlzIGZvdW5kLCByZWZjb3VudCBvZiBpdCBpcyBpbmNyZW1lbnRlZC4gQ2FsbGVycyBzaG91bGQgaGFuZGxlCi0gKiB0aGVzZSByZWZjb3VudC4KLSAqLwotdm9pZCBtZW1fY2dyb3VwX2dldF9zaG1lbV90YXJnZXQoc3RydWN0IGlub2RlICppbm9kZSwgcGdvZmZfdCBwZ29mZiwKLQkJCQkJc3RydWN0IHBhZ2UgKipwYWdlcCwgc3dwX2VudHJ5X3QgKmVudCkKLXsKLQlzdHJ1Y3QgcGFnZSAqcGFnZSA9IE5VTEw7Ci0KLQlpZiAoKHBnb2ZmIDw8IFBBR0VfQ0FDSEVfU0hJRlQpID49IGlfc2l6ZV9yZWFkKGlub2RlKSkKLQkJZ290byBvdXQ7Ci0JcGFnZSA9IGZpbmRfZ2V0X3BhZ2UoaW5vZGUtPmlfbWFwcGluZywgcGdvZmYpOwotb3V0OgotCSpwYWdlcCA9IHBhZ2U7Ci0JKmVudCA9IChzd3BfZW50cnlfdCl7IC52YWwgPSAwIH07Ci19Ci0jZW5kaWYKLQogI2RlZmluZSBzaG1lbV92bV9vcHMJCQkJZ2VuZXJpY19maWxlX3ZtX29wcwogI2RlZmluZSBzaG1lbV9maWxlX29wZXJhdGlvbnMJCQlyYW1mc19maWxlX29wZXJhdGlvbnMKICNkZWZpbmUgc2htZW1fZ2V0X2lub2RlKHNiLCBkaXIsIG1vZGUsIGRldiwgZmxhZ3MpCXJhbWZzX2dldF9pbm9kZShzYiwgZGlyLCBtb2RlLCBkZXYpCiAjZGVmaW5lIHNobWVtX2FjY3Rfc2l6ZShmbGFncywgc2l6ZSkJCTAKICNkZWZpbmUgc2htZW1fdW5hY2N0X3NpemUoZmxhZ3MsIHNpemUpCQlkbyB7fSB3aGlsZSAoMCkKLSNkZWZpbmUgU0hNRU1fTUFYX0JZVEVTCQkJCU1BWF9MRlNfRklMRVNJWkUKIAogI2VuZGlmIC8qIENPTkZJR19TSE1FTSAqLwogCkBAIC0yOTg3LDcgKzI0NzQsNyBAQAogCWlmIChJU19FUlIoc2htX21udCkpCiAJCXJldHVybiAodm9pZCAqKXNobV9tbnQ7CiAKLQlpZiAoc2l6ZSA8IDAgfHwgc2l6ZSA+IFNITUVNX01BWF9CWVRFUykKKwlpZiAoc2l6ZSA8IDAgfHwgc2l6ZSA+IE1BWF9MRlNfRklMRVNJWkUpCiAJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOwogCiAJaWYgKHNobWVtX2FjY3Rfc2l6ZShmbGFncywgc2l6ZSkpCmRpZmYgLS1naXQgYS9tbS9zbGFiLmMgYi9tbS9zbGFiLmMKaW5kZXggMWU1MjNlZC4uNmQ5MGEwOSAxMDA2NDQKLS0tIGEvbW0vc2xhYi5jCisrKyBiL21tL3NsYWIuYwpAQCAtNjIyLDYgKzYyMiw1MSBAQAogc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSBvbl9zbGFiX2wzX2tleTsKIHN0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgb25fc2xhYl9hbGNfa2V5OwogCitzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IGRlYnVnb2JqX2wzX2tleTsKK3N0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgZGVidWdvYmpfYWxjX2tleTsKKworc3RhdGljIHZvaWQgc2xhYl9zZXRfbG9ja19jbGFzc2VzKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsCisJCXN0cnVjdCBsb2NrX2NsYXNzX2tleSAqbDNfa2V5LCBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgKmFsY19rZXksCisJCWludCBxKQoreworCXN0cnVjdCBhcnJheV9jYWNoZSAqKmFsYzsKKwlzdHJ1Y3Qga21lbV9saXN0MyAqbDM7CisJaW50IHI7CisKKwlsMyA9IGNhY2hlcC0+bm9kZWxpc3RzW3FdOworCWlmICghbDMpCisJCXJldHVybjsKKworCWxvY2tkZXBfc2V0X2NsYXNzKCZsMy0+bGlzdF9sb2NrLCBsM19rZXkpOworCWFsYyA9IGwzLT5hbGllbjsKKwkvKgorCSAqIEZJWE1FOiBUaGlzIGNoZWNrIGZvciBCQURfQUxJRU5fTUFHSUMKKwkgKiBzaG91bGQgZ28gYXdheSB3aGVuIGNvbW1vbiBzbGFiIGNvZGUgaXMgdGF1Z2h0IHRvCisJICogd29yayBldmVuIHdpdGhvdXQgYWxpZW4gY2FjaGVzLgorCSAqIEN1cnJlbnRseSwgbm9uIE5VTUEgY29kZSByZXR1cm5zIEJBRF9BTElFTl9NQUdJQworCSAqIGZvciBhbGxvY19hbGllbl9jYWNoZSwKKwkgKi8KKwlpZiAoIWFsYyB8fCAodW5zaWduZWQgbG9uZylhbGMgPT0gQkFEX0FMSUVOX01BR0lDKQorCQlyZXR1cm47CisJZm9yX2VhY2hfbm9kZShyKSB7CisJCWlmIChhbGNbcl0pCisJCQlsb2NrZGVwX3NldF9jbGFzcygmYWxjW3JdLT5sb2NrLCBhbGNfa2V5KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNsYWJfc2V0X2RlYnVnb2JqX2xvY2tfY2xhc3Nlc19ub2RlKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXAsIGludCBub2RlKQoreworCXNsYWJfc2V0X2xvY2tfY2xhc3NlcyhjYWNoZXAsICZkZWJ1Z29ial9sM19rZXksICZkZWJ1Z29ial9hbGNfa2V5LCBub2RlKTsKK30KKworc3RhdGljIHZvaWQgc2xhYl9zZXRfZGVidWdvYmpfbG9ja19jbGFzc2VzKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXApCit7CisJaW50IG5vZGU7CisKKwlmb3JfZWFjaF9vbmxpbmVfbm9kZShub2RlKQorCQlzbGFiX3NldF9kZWJ1Z29ial9sb2NrX2NsYXNzZXNfbm9kZShjYWNoZXAsIG5vZGUpOworfQorCiBzdGF0aWMgdm9pZCBpbml0X25vZGVfbG9ja19rZXlzKGludCBxKQogewogCXN0cnVjdCBjYWNoZV9zaXplcyAqcyA9IG1hbGxvY19zaXplczsKQEAgLTYzMCwyOSArNjc1LDE0IEBACiAJCXJldHVybjsKIAogCWZvciAocyA9IG1hbGxvY19zaXplczsgcy0+Y3Nfc2l6ZSAhPSBVTE9OR19NQVg7IHMrKykgewotCQlzdHJ1Y3QgYXJyYXlfY2FjaGUgKiphbGM7CiAJCXN0cnVjdCBrbWVtX2xpc3QzICpsMzsKLQkJaW50IHI7CiAKIAkJbDMgPSBzLT5jc19jYWNoZXAtPm5vZGVsaXN0c1txXTsKIAkJaWYgKCFsMyB8fCBPRkZfU0xBQihzLT5jc19jYWNoZXApKQogCQkJY29udGludWU7Ci0JCWxvY2tkZXBfc2V0X2NsYXNzKCZsMy0+bGlzdF9sb2NrLCAmb25fc2xhYl9sM19rZXkpOwotCQlhbGMgPSBsMy0+YWxpZW47Ci0JCS8qCi0JCSAqIEZJWE1FOiBUaGlzIGNoZWNrIGZvciBCQURfQUxJRU5fTUFHSUMKLQkJICogc2hvdWxkIGdvIGF3YXkgd2hlbiBjb21tb24gc2xhYiBjb2RlIGlzIHRhdWdodCB0bwotCQkgKiB3b3JrIGV2ZW4gd2l0aG91dCBhbGllbiBjYWNoZXMuCi0JCSAqIEN1cnJlbnRseSwgbm9uIE5VTUEgY29kZSByZXR1cm5zIEJBRF9BTElFTl9NQUdJQwotCQkgKiBmb3IgYWxsb2NfYWxpZW5fY2FjaGUsCi0JCSAqLwotCQlpZiAoIWFsYyB8fCAodW5zaWduZWQgbG9uZylhbGMgPT0gQkFEX0FMSUVOX01BR0lDKQotCQkJY29udGludWU7Ci0JCWZvcl9lYWNoX25vZGUocikgewotCQkJaWYgKGFsY1tyXSkKLQkJCQlsb2NrZGVwX3NldF9jbGFzcygmYWxjW3JdLT5sb2NrLAotCQkJCQkmb25fc2xhYl9hbGNfa2V5KTsKLQkJfQorCisJCXNsYWJfc2V0X2xvY2tfY2xhc3NlcyhzLT5jc19jYWNoZXAsICZvbl9zbGFiX2wzX2tleSwKKwkJCQkmb25fc2xhYl9hbGNfa2V5LCBxKTsKIAl9CiB9CiAKQEAgLTY3MSw2ICs3MDEsMTQgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2xvY2tfa2V5cyh2b2lkKQogewogfQorCitzdGF0aWMgdm9pZCBzbGFiX3NldF9kZWJ1Z29ial9sb2NrX2NsYXNzZXNfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwLCBpbnQgbm9kZSkKK3sKK30KKworc3RhdGljIHZvaWQgc2xhYl9zZXRfZGVidWdvYmpfbG9ja19jbGFzc2VzKHN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXApCit7Cit9CiAjZW5kaWYKIAogLyoKQEAgLTEyNjQsNiArMTMwMiw4IEBACiAJCXNwaW5fdW5sb2NrX2lycSgmbDMtPmxpc3RfbG9jayk7CiAJCWtmcmVlKHNoYXJlZCk7CiAJCWZyZWVfYWxpZW5fY2FjaGUoYWxpZW4pOworCQlpZiAoY2FjaGVwLT5mbGFncyAmIFNMQUJfREVCVUdfT0JKRUNUUykKKwkJCXNsYWJfc2V0X2RlYnVnb2JqX2xvY2tfY2xhc3Nlc19ub2RlKGNhY2hlcCwgbm9kZSk7CiAJfQogCWluaXRfbm9kZV9sb2NrX2tleXMobm9kZSk7CiAKQEAgLTE2MjYsNiArMTY2Niw5IEBACiB7CiAJc3RydWN0IGttZW1fY2FjaGUgKmNhY2hlcDsKIAorCS8qIEFubm90YXRlIHNsYWIgZm9yIGxvY2tkZXAgLS0gYW5ub3RhdGUgdGhlIG1hbGxvYyBjYWNoZXMgKi8KKwlpbml0X2xvY2tfa2V5cygpOworCiAJLyogNikgcmVzaXplIHRoZSBoZWFkIGFycmF5cyB0byB0aGVpciBmaW5hbCBzaXplcyAqLwogCW11dGV4X2xvY2soJmNhY2hlX2NoYWluX211dGV4KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNhY2hlcCwgJmNhY2hlX2NoYWluLCBuZXh0KQpAQCAtMTYzNiw5ICsxNjc5LDYgQEAKIAkvKiBEb25lISAqLwogCWdfY3B1Y2FjaGVfdXAgPSBGVUxMOwogCi0JLyogQW5ub3RhdGUgc2xhYiBmb3IgbG9ja2RlcCAtLSBhbm5vdGF0ZSB0aGUgbWFsbG9jIGNhY2hlcyAqLwotCWluaXRfbG9ja19rZXlzKCk7Ci0KIAkvKgogCSAqIFJlZ2lzdGVyIGEgY3B1IHN0YXJ0dXAgbm90aWZpZXIgY2FsbGJhY2sgdGhhdCBpbml0aWFsaXplcwogCSAqIGNwdV9jYWNoZV9nZXQgZm9yIGFsbCBuZXcgY3B1cwpAQCAtMjQyNiw2ICsyNDY2LDE2IEBACiAJCWdvdG8gb29wczsKIAl9CiAKKwlpZiAoZmxhZ3MgJiBTTEFCX0RFQlVHX09CSkVDVFMpIHsKKwkJLyoKKwkJICogV291bGQgZGVhZGxvY2sgdGhyb3VnaCBzbGFiX2Rlc3Ryb3koKS0+Y2FsbF9yY3UoKS0+CisJCSAqIGRlYnVnX29iamVjdF9hY3RpdmF0ZSgpLT5rbWVtX2NhY2hlX2FsbG9jKCkuCisJCSAqLworCQlXQVJOX09OX09OQ0UoZmxhZ3MgJiBTTEFCX0RFU1RST1lfQllfUkNVKTsKKworCQlzbGFiX3NldF9kZWJ1Z29ial9sb2NrX2NsYXNzZXMoY2FjaGVwKTsKKwl9CisKIAkvKiBjYWNoZSBzZXR1cCBjb21wbGV0ZWQsIGxpbmsgaXQgaW50byB0aGUgbGlzdCAqLwogCWxpc3RfYWRkKCZjYWNoZXAtPm5leHQsICZjYWNoZV9jaGFpbik7CiBvb3BzOgpAQCAtMzQwMyw3ICszNDUzLDcgQEAKIAljYWNoZV9hbGxvY19kZWJ1Z2NoZWNrX2JlZm9yZShjYWNoZXAsIGZsYWdzKTsKIAlsb2NhbF9pcnFfc2F2ZShzYXZlX2ZsYWdzKTsKIAotCWlmIChub2RlaWQgPT0gLTEpCisJaWYgKG5vZGVpZCA9PSBOVU1BX05PX05PREUpCiAJCW5vZGVpZCA9IHNsYWJfbm9kZTsKIAogCWlmICh1bmxpa2VseSghY2FjaGVwLT5ub2RlbGlzdHNbbm9kZWlkXSkpIHsKQEAgLTM5MzQsNyArMzk4NCw3IEBACiAKIHN0cnVjdCBjY3VwZGF0ZV9zdHJ1Y3QgewogCXN0cnVjdCBrbWVtX2NhY2hlICpjYWNoZXA7Ci0Jc3RydWN0IGFycmF5X2NhY2hlICpuZXdbTlJfQ1BVU107CisJc3RydWN0IGFycmF5X2NhY2hlICpuZXdbMF07CiB9OwogCiBzdGF0aWMgdm9pZCBkb19jY3VwZGF0ZV9sb2NhbCh2b2lkICppbmZvKQpAQCAtMzk1Niw3ICs0MDA2LDggQEAKIAlzdHJ1Y3QgY2N1cGRhdGVfc3RydWN0ICpuZXc7CiAJaW50IGk7CiAKLQluZXcgPSBremFsbG9jKHNpemVvZigqbmV3KSwgZ2ZwKTsKKwluZXcgPSBremFsbG9jKHNpemVvZigqbmV3KSArIG5yX2NwdV9pZHMgKiBzaXplb2Yoc3RydWN0IGFycmF5X2NhY2hlICopLAorCQkgICAgICBnZnApOwogCWlmICghbmV3KQogCQlyZXR1cm4gLUVOT01FTTsKIApkaWZmIC0tZ2l0IGEvbW0vc2x1Yi5jIGIvbW0vc2x1Yi5jCmluZGV4IGY4ZjVlOGUuLmViNWE4ZjkgMTAwNjQ0Ci0tLSBhL21tL3NsdWIuYworKysgYi9tbS9zbHViLmMKQEAgLTIsMTAgKzIsMTEgQEAKICAqIFNMVUI6IEEgc2xhYiBhbGxvY2F0b3IgdGhhdCBsaW1pdHMgY2FjaGUgbGluZSB1c2UgaW5zdGVhZCBvZiBxdWV1aW5nCiAgKiBvYmplY3RzIGluIHBlciBjcHUgYW5kIHBlciBub2RlIGxpc3RzLgogICoKLSAqIFRoZSBhbGxvY2F0b3Igc3luY2hyb25pemVzIHVzaW5nIHBlciBzbGFiIGxvY2tzIGFuZCBvbmx5Ci0gKiB1c2VzIGEgY2VudHJhbGl6ZWQgbG9jayB0byBtYW5hZ2UgYSBwb29sIG9mIHBhcnRpYWwgc2xhYnMuCisgKiBUaGUgYWxsb2NhdG9yIHN5bmNocm9uaXplcyB1c2luZyBwZXIgc2xhYiBsb2NrcyBvciBhdG9taWMgb3BlcmF0aW9zCisgKiBhbmQgb25seSB1c2VzIGEgY2VudHJhbGl6ZWQgbG9jayB0byBtYW5hZ2UgYSBwb29sIG9mIHBhcnRpYWwgc2xhYnMuCiAgKgogICogKEMpIDIwMDcgU0dJLCBDaHJpc3RvcGggTGFtZXRlcgorICogKEMpIDIwMTEgTGludXggRm91bmRhdGlvbiwgQ2hyaXN0b3BoIExhbWV0ZXIKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW0uaD4KQEAgLTMzLDE1ICszNCwyNyBAQAogCiAvKgogICogTG9jayBvcmRlcjoKLSAqICAgMS4gc2xhYl9sb2NrKHBhZ2UpCi0gKiAgIDIuIHNsYWItPmxpc3RfbG9jaworICogICAxLiBzbHViX2xvY2sgKEdsb2JhbCBTZW1hcGhvcmUpCisgKiAgIDIuIG5vZGUtPmxpc3RfbG9jaworICogICAzLiBzbGFiX2xvY2socGFnZSkgKE9ubHkgb24gc29tZSBhcmNoZXMgYW5kIGZvciBkZWJ1Z2dpbmcpCiAgKgotICogICBUaGUgc2xhYl9sb2NrIHByb3RlY3RzIG9wZXJhdGlvbnMgb24gdGhlIG9iamVjdCBvZiBhIHBhcnRpY3VsYXIKLSAqICAgc2xhYiBhbmQgaXRzIG1ldGFkYXRhIGluIHRoZSBwYWdlIHN0cnVjdC4gSWYgdGhlIHNsYWIgbG9jawotICogICBoYXMgYmVlbiB0YWtlbiB0aGVuIG5vIGFsbG9jYXRpb25zIG5vciBmcmVlcyBjYW4gYmUgcGVyZm9ybWVkCi0gKiAgIG9uIHRoZSBvYmplY3RzIGluIHRoZSBzbGFiIG5vciBjYW4gdGhlIHNsYWIgYmUgYWRkZWQgb3IgcmVtb3ZlZAotICogICBmcm9tIHRoZSBwYXJ0aWFsIG9yIGZ1bGwgbGlzdHMgc2luY2UgdGhpcyB3b3VsZCBtZWFuIG1vZGlmeWluZwotICogICB0aGUgcGFnZV9zdHJ1Y3Qgb2YgdGhlIHNsYWIuCisgKiAgIHNsdWJfbG9jaworICoKKyAqICAgVGhlIHJvbGUgb2YgdGhlIHNsdWJfbG9jayBpcyB0byBwcm90ZWN0IHRoZSBsaXN0IG9mIGFsbCB0aGUgc2xhYnMKKyAqICAgYW5kIHRvIHN5bmNocm9uaXplIG1ham9yIG1ldGFkYXRhIGNoYW5nZXMgdG8gc2xhYiBjYWNoZSBzdHJ1Y3R1cmVzLgorICoKKyAqICAgVGhlIHNsYWJfbG9jayBpcyBvbmx5IHVzZWQgZm9yIGRlYnVnZ2luZyBhbmQgb24gYXJjaGVzIHRoYXQgZG8gbm90CisgKiAgIGhhdmUgdGhlIGFiaWxpdHkgdG8gZG8gYSBjbXB4Y2hnX2RvdWJsZS4gSXQgb25seSBwcm90ZWN0cyB0aGUgc2Vjb25kCisgKiAgIGRvdWJsZSB3b3JkIGluIHRoZSBwYWdlIHN0cnVjdC4gTWVhbmluZworICoJQS4gcGFnZS0+ZnJlZWxpc3QJLT4gTGlzdCBvZiBvYmplY3QgZnJlZSBpbiBhIHBhZ2UKKyAqCUIuIHBhZ2UtPmNvdW50ZXJzCS0+IENvdW50ZXJzIG9mIG9iamVjdHMKKyAqCUMuIHBhZ2UtPmZyb3plbgkJLT4gZnJvemVuIHN0YXRlCisgKgorICogICBJZiBhIHNsYWIgaXMgZnJvemVuIHRoZW4gaXQgaXMgZXhlbXB0IGZyb20gbGlzdCBtYW5hZ2VtZW50LiBJdCBpcyBub3QKKyAqICAgb24gYW55IGxpc3QuIFRoZSBwcm9jZXNzb3IgdGhhdCBmcm96ZSB0aGUgc2xhYiBpcyB0aGUgb25lIHdobyBjYW4KKyAqICAgcGVyZm9ybSBsaXN0IG9wZXJhdGlvbnMgb24gdGhlIHBhZ2UuIE90aGVyIHByb2Nlc3NvcnMgbWF5IHB1dCBvYmplY3RzCisgKiAgIG9udG8gdGhlIGZyZWVsaXN0IGJ1dCB0aGUgcHJvY2Vzc29yIHRoYXQgZnJvemUgdGhlIHNsYWIgaXMgdGhlIG9ubHkKKyAqICAgb25lIHRoYXQgY2FuIHJldHJpZXZlIHRoZSBvYmplY3RzIGZyb20gdGhlIHBhZ2UncyBmcmVlbGlzdC4KICAqCiAgKiAgIFRoZSBsaXN0X2xvY2sgcHJvdGVjdHMgdGhlIHBhcnRpYWwgYW5kIGZ1bGwgbGlzdCBvbiBlYWNoIG5vZGUgYW5kCiAgKiAgIHRoZSBwYXJ0aWFsIHNsYWIgY291bnRlci4gSWYgdGFrZW4gdGhlbiBubyBuZXcgc2xhYnMgbWF5IGJlIGFkZGVkIG9yCkBAIC01NCwyMCArNjcsNiBAQAogICogICBzbGFicywgb3BlcmF0aW9ucyBjYW4gY29udGludWUgd2l0aG91dCBhbnkgY2VudHJhbGl6ZWQgbG9jay4gRi5lLgogICogICBhbGxvY2F0aW5nIGEgbG9uZyBzZXJpZXMgb2Ygb2JqZWN0cyB0aGF0IGZpbGwgdXAgc2xhYnMgZG9lcyBub3QgcmVxdWlyZQogICogICB0aGUgbGlzdCBsb2NrLgotICoKLSAqICAgVGhlIGxvY2sgb3JkZXIgaXMgc29tZXRpbWVzIGludmVydGVkIHdoZW4gd2UgYXJlIHRyeWluZyB0byBnZXQgYSBzbGFiCi0gKiAgIG9mZiBhIGxpc3QuIFdlIHRha2UgdGhlIGxpc3RfbG9jayBhbmQgdGhlbiBsb29rIGZvciBhIHBhZ2Ugb24gdGhlIGxpc3QKLSAqICAgdG8gdXNlLiBXaGlsZSB3ZSBkbyB0aGF0IG9iamVjdHMgaW4gdGhlIHNsYWJzIG1heSBiZSBmcmVlZC4gV2UgY2FuCi0gKiAgIG9ubHkgb3BlcmF0ZSBvbiB0aGUgc2xhYiBpZiB3ZSBoYXZlIGFsc28gdGFrZW4gdGhlIHNsYWJfbG9jay4gU28gd2UgdXNlCi0gKiAgIGEgc2xhYl90cnlsb2NrKCkgb24gdGhlIHNsYWIuIElmIHRyeWxvY2sgd2FzIHN1Y2Nlc3NmdWwgdGhlbiBubyBmcmVlcwotICogICBjYW4gb2NjdXIgYW55bW9yZSBhbmQgd2UgY2FuIHVzZSB0aGUgc2xhYiBmb3IgYWxsb2NhdGlvbnMgZXRjLiBJZiB0aGUKLSAqICAgc2xhYl90cnlsb2NrKCkgZG9lcyBub3Qgc3VjY2VlZCB0aGVuIGZyZWVzIGFyZSBpbiBwcm9ncmVzcyBpbiB0aGUgc2xhYiBhbmQKLSAqICAgd2UgbXVzdCBzdGF5IGF3YXkgZnJvbSBpdCBmb3IgYSB3aGlsZSBzaW5jZSB3ZSBtYXkgY2F1c2UgYSBib3VuY2luZwotICogICBjYWNoZWxpbmUgaWYgd2UgdHJ5IHRvIGFjcXVpcmUgdGhlIGxvY2suIFNvIGdvIG9udG8gdGhlIG5leHQgc2xhYi4KLSAqICAgSWYgYWxsIHBhZ2VzIGFyZSBidXN5IHRoZW4gd2UgbWF5IGFsbG9jYXRlIGEgbmV3IHNsYWIgaW5zdGVhZCBvZiByZXVzaW5nCi0gKiAgIGEgcGFydGlhbCBzbGFiLiBBIG5ldyBzbGFiIGhhcyBubyBvbmUgb3BlcmF0aW5nIG9uIGl0IGFuZCB0aHVzIHRoZXJlIGlzCi0gKiAgIG5vIGRhbmdlciBvZiBjYWNoZWxpbmUgY29udGVudGlvbi4KLSAqCiAgKiAgIEludGVycnVwdHMgYXJlIGRpc2FibGVkIGR1cmluZyBhbGxvY2F0aW9uIGFuZCBkZWFsbG9jYXRpb24gaW4gb3JkZXIgdG8KICAqICAgbWFrZSB0aGUgc2xhYiBhbGxvY2F0b3Igc2FmZSB0byB1c2UgaW4gdGhlIGNvbnRleHQgb2YgYW4gaXJxLiBJbiBhZGRpdGlvbgogICogICBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCB0byBlbnN1cmUgdGhhdCB0aGUgcHJvY2Vzc29yIGRvZXMgbm90IGNoYW5nZQpAQCAtMTMyLDYgKzEzMSw5IEBACiAvKiBFbmFibGUgdG8gdGVzdCByZWNvdmVyeSBmcm9tIHNsYWIgY29ycnVwdGlvbiBvbiBib290ICovCiAjdW5kZWYgU0xVQl9SRVNJTElFTkNZX1RFU1QKIAorLyogRW5hYmxlIHRvIGxvZyBjbXB4Y2hnIGZhaWx1cmVzICovCisjdW5kZWYgU0xVQl9ERUJVR19DTVBYQ0hHCisKIC8qCiAgKiBNaW5pbnVtIG51bWJlciBvZiBwYXJ0aWFsIHNsYWJzLiBUaGVzZSB3aWxsIGJlIGxlZnQgb24gdGhlIHBhcnRpYWwKICAqIGxpc3RzIGV2ZW4gaWYgdGhleSBhcmUgZW1wdHkuIGttZW1fY2FjaGVfc2hyaW5rIG1heSByZWNsYWltIHRoZW0uCkBAIC0xNjcsMTAgKzE2OSwxMSBAQAogCiAjZGVmaW5lIE9PX1NISUZUCTE2CiAjZGVmaW5lIE9PX01BU0sJCSgoMSA8PCBPT19TSElGVCkgLSAxKQotI2RlZmluZSBNQVhfT0JKU19QRVJfUEFHRQk2NTUzNSAvKiBzaW5jZSBwYWdlLm9iamVjdHMgaXMgdTE2ICovCisjZGVmaW5lIE1BWF9PQkpTX1BFUl9QQUdFCTMyNzY3IC8qIHNpbmNlIHBhZ2Uub2JqZWN0cyBpcyB1MTUgKi8KIAogLyogSW50ZXJuYWwgU0xVQiBmbGFncyAqLwogI2RlZmluZSBfX09CSkVDVF9QT0lTT04JCTB4ODAwMDAwMDBVTCAvKiBQb2lzb24gb2JqZWN0ICovCisjZGVmaW5lIF9fQ01QWENIR19ET1VCTEUJMHg0MDAwMDAwMFVMIC8qIFVzZSBjbXB4Y2hnX2RvdWJsZSAqLwogCiBzdGF0aWMgaW50IGttZW1fc2l6ZSA9IHNpemVvZihzdHJ1Y3Qga21lbV9jYWNoZSk7CiAKQEAgLTM0MywxMSArMzQ2LDk5IEBACiAJcmV0dXJuIHgueCAmIE9PX01BU0s7CiB9CiAKKy8qCisgKiBQZXIgc2xhYiBsb2NraW5nIHVzaW5nIHRoZSBwYWdlbG9jaworICovCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgc2xhYl9sb2NrKHN0cnVjdCBwYWdlICpwYWdlKQoreworCWJpdF9zcGluX2xvY2soUEdfbG9ja2VkLCAmcGFnZS0+ZmxhZ3MpOworfQorCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgc2xhYl91bmxvY2soc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJX19iaXRfc3Bpbl91bmxvY2soUEdfbG9ja2VkLCAmcGFnZS0+ZmxhZ3MpOworfQorCisvKiBJbnRlcnJ1cHRzIG11c3QgYmUgZGlzYWJsZWQgKGZvciB0aGUgZmFsbGJhY2sgY29kZSB0byB3b3JrIHJpZ2h0KSAqLworc3RhdGljIGlubGluZSBib29sIF9fY21weGNoZ19kb3VibGVfc2xhYihzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UsCisJCXZvaWQgKmZyZWVsaXN0X29sZCwgdW5zaWduZWQgbG9uZyBjb3VudGVyc19vbGQsCisJCXZvaWQgKmZyZWVsaXN0X25ldywgdW5zaWduZWQgbG9uZyBjb3VudGVyc19uZXcsCisJCWNvbnN0IGNoYXIgKm4pCit7CisJVk1fQlVHX09OKCFpcnFzX2Rpc2FibGVkKCkpOworI2lmZGVmIENPTkZJR19DTVBYQ0hHX0RPVUJMRQorCWlmIChzLT5mbGFncyAmIF9fQ01QWENIR19ET1VCTEUpIHsKKwkJaWYgKGNtcHhjaGdfZG91YmxlKCZwYWdlLT5mcmVlbGlzdCwKKwkJCWZyZWVsaXN0X29sZCwgY291bnRlcnNfb2xkLAorCQkJZnJlZWxpc3RfbmV3LCBjb3VudGVyc19uZXcpKQorCQlyZXR1cm4gMTsKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJc2xhYl9sb2NrKHBhZ2UpOworCQlpZiAocGFnZS0+ZnJlZWxpc3QgPT0gZnJlZWxpc3Rfb2xkICYmIHBhZ2UtPmNvdW50ZXJzID09IGNvdW50ZXJzX29sZCkgeworCQkJcGFnZS0+ZnJlZWxpc3QgPSBmcmVlbGlzdF9uZXc7CisJCQlwYWdlLT5jb3VudGVycyA9IGNvdW50ZXJzX25ldzsKKwkJCXNsYWJfdW5sb2NrKHBhZ2UpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJc2xhYl91bmxvY2socGFnZSk7CisJfQorCisJY3B1X3JlbGF4KCk7CisJc3RhdChzLCBDTVBYQ0hHX0RPVUJMRV9GQUlMKTsKKworI2lmZGVmIFNMVUJfREVCVUdfQ01QWENIRworCXByaW50ayhLRVJOX0lORk8gIiVzICVzOiBjbXB4Y2hnIGRvdWJsZSByZWRvICIsIG4sIHMtPm5hbWUpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBib29sIGNtcHhjaGdfZG91YmxlX3NsYWIoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlLAorCQl2b2lkICpmcmVlbGlzdF9vbGQsIHVuc2lnbmVkIGxvbmcgY291bnRlcnNfb2xkLAorCQl2b2lkICpmcmVlbGlzdF9uZXcsIHVuc2lnbmVkIGxvbmcgY291bnRlcnNfbmV3LAorCQljb25zdCBjaGFyICpuKQoreworI2lmZGVmIENPTkZJR19DTVBYQ0hHX0RPVUJMRQorCWlmIChzLT5mbGFncyAmIF9fQ01QWENIR19ET1VCTEUpIHsKKwkJaWYgKGNtcHhjaGdfZG91YmxlKCZwYWdlLT5mcmVlbGlzdCwKKwkJCWZyZWVsaXN0X29sZCwgY291bnRlcnNfb2xkLAorCQkJZnJlZWxpc3RfbmV3LCBjb3VudGVyc19uZXcpKQorCQlyZXR1cm4gMTsKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJCXNsYWJfbG9jayhwYWdlKTsKKwkJaWYgKHBhZ2UtPmZyZWVsaXN0ID09IGZyZWVsaXN0X29sZCAmJiBwYWdlLT5jb3VudGVycyA9PSBjb3VudGVyc19vbGQpIHsKKwkJCXBhZ2UtPmZyZWVsaXN0ID0gZnJlZWxpc3RfbmV3OworCQkJcGFnZS0+Y291bnRlcnMgPSBjb3VudGVyc19uZXc7CisJCQlzbGFiX3VubG9jayhwYWdlKTsKKwkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJCXJldHVybiAxOworCQl9CisJCXNsYWJfdW5sb2NrKHBhZ2UpOworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJfQorCisJY3B1X3JlbGF4KCk7CisJc3RhdChzLCBDTVBYQ0hHX0RPVUJMRV9GQUlMKTsKKworI2lmZGVmIFNMVUJfREVCVUdfQ01QWENIRworCXByaW50ayhLRVJOX0lORk8gIiVzICVzOiBjbXB4Y2hnIGRvdWJsZSByZWRvICIsIG4sIHMtPm5hbWUpOworI2VuZGlmCisKKwlyZXR1cm4gMDsKK30KKwogI2lmZGVmIENPTkZJR19TTFVCX0RFQlVHCiAvKgogICogRGV0ZXJtaW5lIGEgbWFwIG9mIG9iamVjdCBpbiB1c2Ugb24gYSBwYWdlLgogICoKLSAqIFNsYWIgbG9jayBvciBub2RlIGxpc3Rsb2NrIG11c3QgYmUgaGVsZCB0byBndWFyYW50ZWUgdGhhdCB0aGUgcGFnZSBkb2VzCisgKiBOb2RlIGxpc3Rsb2NrIG11c3QgYmUgaGVsZCB0byBndWFyYW50ZWUgdGhhdCB0aGUgcGFnZSBkb2VzCiAgKiBub3QgdmFuaXNoIGZyb20gdW5kZXIgdXMuCiAgKi8KIHN0YXRpYyB2b2lkIGdldF9tYXAoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBsb25nICptYXApCkBAIC04MzgsMTAgKzkyOSwxMSBAQAogc3RhdGljIGludCBvbl9mcmVlbGlzdChzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UsIHZvaWQgKnNlYXJjaCkKIHsKIAlpbnQgbnIgPSAwOwotCXZvaWQgKmZwID0gcGFnZS0+ZnJlZWxpc3Q7CisJdm9pZCAqZnA7CiAJdm9pZCAqb2JqZWN0ID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIG1heF9vYmplY3RzOwogCisJZnAgPSBwYWdlLT5mcmVlbGlzdDsKIAl3aGlsZSAoZnAgJiYgbnIgPD0gcGFnZS0+b2JqZWN0cykgewogCQlpZiAoZnAgPT0gc2VhcmNoKQogCQkJcmV0dXJuIDE7CkBAIC05NDYsMjYgKzEwMzgsMjcgQEAKIAogLyoKICAqIFRyYWNraW5nIG9mIGZ1bGx5IGFsbG9jYXRlZCBzbGFicyBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorICoKKyAqIGxpc3RfbG9jayBtdXN0IGJlIGhlbGQuCiAgKi8KLXN0YXRpYyB2b2lkIGFkZF9mdWxsKHN0cnVjdCBrbWVtX2NhY2hlX25vZGUgKm4sIHN0cnVjdCBwYWdlICpwYWdlKQorc3RhdGljIHZvaWQgYWRkX2Z1bGwoc3RydWN0IGttZW1fY2FjaGUgKnMsCisJc3RydWN0IGttZW1fY2FjaGVfbm9kZSAqbiwgc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0Jc3Bpbl9sb2NrKCZuLT5saXN0X2xvY2spOwotCWxpc3RfYWRkKCZwYWdlLT5scnUsICZuLT5mdWxsKTsKLQlzcGluX3VubG9jaygmbi0+bGlzdF9sb2NrKTsKLX0KLQotc3RhdGljIHZvaWQgcmVtb3ZlX2Z1bGwoc3RydWN0IGttZW1fY2FjaGUgKnMsIHN0cnVjdCBwYWdlICpwYWdlKQotewotCXN0cnVjdCBrbWVtX2NhY2hlX25vZGUgKm47Ci0KIAlpZiAoIShzLT5mbGFncyAmIFNMQUJfU1RPUkVfVVNFUikpCiAJCXJldHVybjsKIAotCW4gPSBnZXRfbm9kZShzLCBwYWdlX3RvX25pZChwYWdlKSk7CisJbGlzdF9hZGQoJnBhZ2UtPmxydSwgJm4tPmZ1bGwpOworfQogCi0Jc3Bpbl9sb2NrKCZuLT5saXN0X2xvY2spOworLyoKKyAqIGxpc3RfbG9jayBtdXN0IGJlIGhlbGQuCisgKi8KK3N0YXRpYyB2b2lkIHJlbW92ZV9mdWxsKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlpZiAoIShzLT5mbGFncyAmIFNMQUJfU1RPUkVfVVNFUikpCisJCXJldHVybjsKKwogCWxpc3RfZGVsKCZwYWdlLT5scnUpOwotCXNwaW5fdW5sb2NrKCZuLT5saXN0X2xvY2spOwogfQogCiAvKiBUcmFja2luZyBvZiB0aGUgbnVtYmVyIG9mIHNsYWJzIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgKi8KQEAgLTEwMjEsMTEgKzExMTQsNiBAQAogCWlmICghY2hlY2tfc2xhYihzLCBwYWdlKSkKIAkJZ290byBiYWQ7CiAKLQlpZiAoIW9uX2ZyZWVsaXN0KHMsIHBhZ2UsIG9iamVjdCkpIHsKLQkJb2JqZWN0X2VycihzLCBwYWdlLCBvYmplY3QsICJPYmplY3QgYWxyZWFkeSBhbGxvY2F0ZWQiKTsKLQkJZ290byBiYWQ7Ci0JfQotCiAJaWYgKCFjaGVja192YWxpZF9wb2ludGVyKHMsIHBhZ2UsIG9iamVjdCkpIHsKIAkJb2JqZWN0X2VycihzLCBwYWdlLCBvYmplY3QsICJGcmVlbGlzdCBQb2ludGVyIGNoZWNrIGZhaWxzIik7CiAJCWdvdG8gYmFkOwpAQCAtMTA1OCw2ICsxMTQ2LDEyIEBACiBzdGF0aWMgbm9pbmxpbmUgaW50IGZyZWVfZGVidWdfcHJvY2Vzc2luZyhzdHJ1Y3Qga21lbV9jYWNoZSAqcywKIAkJIHN0cnVjdCBwYWdlICpwYWdlLCB2b2lkICpvYmplY3QsIHVuc2lnbmVkIGxvbmcgYWRkcikKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYyA9IDA7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJc2xhYl9sb2NrKHBhZ2UpOworCiAJaWYgKCFjaGVja19zbGFiKHMsIHBhZ2UpKQogCQlnb3RvIGZhaWw7CiAKQEAgLTEwNzIsNyArMTE2Niw3IEBACiAJfQogCiAJaWYgKCFjaGVja19vYmplY3QocywgcGFnZSwgb2JqZWN0LCBTTFVCX1JFRF9BQ1RJVkUpKQotCQlyZXR1cm4gMDsKKwkJZ290byBvdXQ7CiAKIAlpZiAodW5saWtlbHkocyAhPSBwYWdlLT5zbGFiKSkgewogCQlpZiAoIVBhZ2VTbGFiKHBhZ2UpKSB7CkBAIC0xMDg5LDE4ICsxMTgzLDE5IEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKLQkvKiBTcGVjaWFsIGRlYnVnIGFjdGl2aXRpZXMgZm9yIGZyZWVpbmcgb2JqZWN0cyAqLwotCWlmICghUGFnZVNsdWJGcm96ZW4ocGFnZSkgJiYgIXBhZ2UtPmZyZWVsaXN0KQotCQlyZW1vdmVfZnVsbChzLCBwYWdlKTsKIAlpZiAocy0+ZmxhZ3MgJiBTTEFCX1NUT1JFX1VTRVIpCiAJCXNldF90cmFjayhzLCBvYmplY3QsIFRSQUNLX0ZSRUUsIGFkZHIpOwogCXRyYWNlKHMsIHBhZ2UsIG9iamVjdCwgMCk7CiAJaW5pdF9vYmplY3Qocywgb2JqZWN0LCBTTFVCX1JFRF9JTkFDVElWRSk7Ci0JcmV0dXJuIDE7CisJcmMgPSAxOworb3V0OgorCXNsYWJfdW5sb2NrKHBhZ2UpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gcmM7CiAKIGZhaWw6CiAJc2xhYl9maXgocywgIk9iamVjdCBhdCAweCVwIG5vdCBmcmVlZCIsIG9iamVjdCk7Ci0JcmV0dXJuIDA7CisJZ290byBvdXQ7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHNldHVwX3NsdWJfZGVidWcoY2hhciAqc3RyKQpAQCAtMTIwMCw3ICsxMjk1LDkgQEAKIAkJCXsgcmV0dXJuIDE7IH0KIHN0YXRpYyBpbmxpbmUgaW50IGNoZWNrX29iamVjdChzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UsCiAJCQl2b2lkICpvYmplY3QsIHU4IHZhbCkgeyByZXR1cm4gMTsgfQotc3RhdGljIGlubGluZSB2b2lkIGFkZF9mdWxsKHN0cnVjdCBrbWVtX2NhY2hlX25vZGUgKm4sIHN0cnVjdCBwYWdlICpwYWdlKSB7fQorc3RhdGljIGlubGluZSB2b2lkIGFkZF9mdWxsKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlICpuLAorCQkJCQlzdHJ1Y3QgcGFnZSAqcGFnZSkge30KK3N0YXRpYyBpbmxpbmUgdm9pZCByZW1vdmVfZnVsbChzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UpIHt9CiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcga21lbV9jYWNoZV9mbGFncyh1bnNpZ25lZCBsb25nIG9ianNpemUsCiAJdW5zaWduZWQgbG9uZyBmbGFncywgY29uc3QgY2hhciAqbmFtZSwKIAl2b2lkICgqY3Rvcikodm9pZCAqKSkKQEAgLTEyNTIsNiArMTM0OSwxMSBAQAogCXN0cnVjdCBrbWVtX2NhY2hlX29yZGVyX29iamVjdHMgb28gPSBzLT5vbzsKIAlnZnBfdCBhbGxvY19nZnA7CiAKKwlmbGFncyAmPSBnZnBfYWxsb3dlZF9tYXNrOworCisJaWYgKGZsYWdzICYgX19HRlBfV0FJVCkKKwkJbG9jYWxfaXJxX2VuYWJsZSgpOworCiAJZmxhZ3MgfD0gcy0+YWxsb2NmbGFnczsKIAogCS8qCkBAIC0xMjY4LDEyICsxMzcwLDE3IEBACiAJCSAqIFRyeSBhIGxvd2VyIG9yZGVyIGFsbG9jIGlmIHBvc3NpYmxlCiAJCSAqLwogCQlwYWdlID0gYWxsb2Nfc2xhYl9wYWdlKGZsYWdzLCBub2RlLCBvbyk7Ci0JCWlmICghcGFnZSkKLQkJCXJldHVybiBOVUxMOwogCi0JCXN0YXQocywgT1JERVJfRkFMTEJBQ0spOworCQlpZiAocGFnZSkKKwkJCXN0YXQocywgT1JERVJfRkFMTEJBQ0spOwogCX0KIAorCWlmIChmbGFncyAmIF9fR0ZQX1dBSVQpCisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisKKwlpZiAoIXBhZ2UpCisJCXJldHVybiBOVUxMOworCiAJaWYgKGttZW1jaGVja19lbmFibGVkCiAJCSYmICEocy0+ZmxhZ3MgJiAoU0xBQl9OT1RSQUNLIHwgREVCVUdfREVGQVVMVF9GTEFHUykpKSB7CiAJCWludCBwYWdlcyA9IDEgPDwgb29fb3JkZXIob28pOwpAQCAtMTM0MSw2ICsxNDQ4LDcgQEAKIAogCXBhZ2UtPmZyZWVsaXN0ID0gc3RhcnQ7CiAJcGFnZS0+aW51c2UgPSAwOworCXBhZ2UtPmZyb3plbiA9IDE7CiBvdXQ6CiAJcmV0dXJuIHBhZ2U7CiB9CkBAIC0xNDE4LDc3ICsxNTI2LDg3IEBACiB9CiAKIC8qCi0gKiBQZXIgc2xhYiBsb2NraW5nIHVzaW5nIHRoZSBwYWdlbG9jaworICogTWFuYWdlbWVudCBvZiBwYXJ0aWFsbHkgYWxsb2NhdGVkIHNsYWJzLgorICoKKyAqIGxpc3RfbG9jayBtdXN0IGJlIGhlbGQuCiAgKi8KLXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBzbGFiX2xvY2soc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0JYml0X3NwaW5fbG9jayhQR19sb2NrZWQsICZwYWdlLT5mbGFncyk7Ci19Ci0KLXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBzbGFiX3VubG9jayhzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQlfX2JpdF9zcGluX3VubG9jayhQR19sb2NrZWQsICZwYWdlLT5mbGFncyk7Ci19Ci0KLXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IHNsYWJfdHJ5bG9jayhzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQlpbnQgcmMgPSAxOwotCi0JcmMgPSBiaXRfc3Bpbl90cnlsb2NrKFBHX2xvY2tlZCwgJnBhZ2UtPmZsYWdzKTsKLQlyZXR1cm4gcmM7Ci19Ci0KLS8qCi0gKiBNYW5hZ2VtZW50IG9mIHBhcnRpYWxseSBhbGxvY2F0ZWQgc2xhYnMKLSAqLwotc3RhdGljIHZvaWQgYWRkX3BhcnRpYWwoc3RydWN0IGttZW1fY2FjaGVfbm9kZSAqbiwKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGRfcGFydGlhbChzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlICpuLAogCQkJCXN0cnVjdCBwYWdlICpwYWdlLCBpbnQgdGFpbCkKIHsKLQlzcGluX2xvY2soJm4tPmxpc3RfbG9jayk7CiAJbi0+bnJfcGFydGlhbCsrOwogCWlmICh0YWlsKQogCQlsaXN0X2FkZF90YWlsKCZwYWdlLT5scnUsICZuLT5wYXJ0aWFsKTsKIAllbHNlCiAJCWxpc3RfYWRkKCZwYWdlLT5scnUsICZuLT5wYXJ0aWFsKTsKLQlzcGluX3VubG9jaygmbi0+bGlzdF9sb2NrKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIF9fcmVtb3ZlX3BhcnRpYWwoc3RydWN0IGttZW1fY2FjaGVfbm9kZSAqbiwKKy8qCisgKiBsaXN0X2xvY2sgbXVzdCBiZSBoZWxkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcmVtb3ZlX3BhcnRpYWwoc3RydWN0IGttZW1fY2FjaGVfbm9kZSAqbiwKIAkJCQkJc3RydWN0IHBhZ2UgKnBhZ2UpCiB7CiAJbGlzdF9kZWwoJnBhZ2UtPmxydSk7CiAJbi0+bnJfcGFydGlhbC0tOwogfQogCi1zdGF0aWMgdm9pZCByZW1vdmVfcGFydGlhbChzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UpCi17Ci0Jc3RydWN0IGttZW1fY2FjaGVfbm9kZSAqbiA9IGdldF9ub2RlKHMsIHBhZ2VfdG9fbmlkKHBhZ2UpKTsKLQotCXNwaW5fbG9jaygmbi0+bGlzdF9sb2NrKTsKLQlfX3JlbW92ZV9wYXJ0aWFsKG4sIHBhZ2UpOwotCXNwaW5fdW5sb2NrKCZuLT5saXN0X2xvY2spOwotfQotCiAvKgotICogTG9jayBzbGFiIGFuZCByZW1vdmUgZnJvbSB0aGUgcGFydGlhbCBsaXN0LgorICogTG9jayBzbGFiLCByZW1vdmUgZnJvbSB0aGUgcGFydGlhbCBsaXN0IGFuZCBwdXQgdGhlIG9iamVjdCBpbnRvIHRoZQorICogcGVyIGNwdSBmcmVlbGlzdC4KICAqCiAgKiBNdXN0IGhvbGQgbGlzdF9sb2NrLgogICovCi1zdGF0aWMgaW5saW5lIGludCBsb2NrX2FuZF9mcmVlemVfc2xhYihzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlICpuLAotCQkJCQkJCXN0cnVjdCBwYWdlICpwYWdlKQorc3RhdGljIGlubGluZSBpbnQgYWNxdWlyZV9zbGFiKHN0cnVjdCBrbWVtX2NhY2hlICpzLAorCQlzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlICpuLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQlpZiAoc2xhYl90cnlsb2NrKHBhZ2UpKSB7Ci0JCV9fcmVtb3ZlX3BhcnRpYWwobiwgcGFnZSk7Ci0JCV9fU2V0UGFnZVNsdWJGcm96ZW4ocGFnZSk7CisJdm9pZCAqZnJlZWxpc3Q7CisJdW5zaWduZWQgbG9uZyBjb3VudGVyczsKKwlzdHJ1Y3QgcGFnZSBuZXc7CisKKwkvKgorCSAqIFphcCB0aGUgZnJlZWxpc3QgYW5kIHNldCB0aGUgZnJvemVuIGJpdC4KKwkgKiBUaGUgb2xkIGZyZWVsaXN0IGlzIHRoZSBsaXN0IG9mIG9iamVjdHMgZm9yIHRoZQorCSAqIHBlciBjcHUgYWxsb2NhdGlvbiBsaXN0LgorCSAqLworCWRvIHsKKwkJZnJlZWxpc3QgPSBwYWdlLT5mcmVlbGlzdDsKKwkJY291bnRlcnMgPSBwYWdlLT5jb3VudGVyczsKKwkJbmV3LmNvdW50ZXJzID0gY291bnRlcnM7CisJCW5ldy5pbnVzZSA9IHBhZ2UtPm9iamVjdHM7CisKKwkJVk1fQlVHX09OKG5ldy5mcm96ZW4pOworCQluZXcuZnJvemVuID0gMTsKKworCX0gd2hpbGUgKCFfX2NtcHhjaGdfZG91YmxlX3NsYWIocywgcGFnZSwKKwkJCWZyZWVsaXN0LCBjb3VudGVycywKKwkJCU5VTEwsIG5ldy5jb3VudGVycywKKwkJCSJsb2NrIGFuZCBmcmVlemUiKSk7CisKKwlyZW1vdmVfcGFydGlhbChuLCBwYWdlKTsKKworCWlmIChmcmVlbGlzdCkgeworCQkvKiBQb3B1bGF0ZSB0aGUgcGVyIGNwdSBmcmVlbGlzdCAqLworCQl0aGlzX2NwdV93cml0ZShzLT5jcHVfc2xhYi0+ZnJlZWxpc3QsIGZyZWVsaXN0KTsKKwkJdGhpc19jcHVfd3JpdGUocy0+Y3B1X3NsYWItPnBhZ2UsIHBhZ2UpOworCQl0aGlzX2NwdV93cml0ZShzLT5jcHVfc2xhYi0+bm9kZSwgcGFnZV90b19uaWQocGFnZSkpOwogCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBTbGFiIHBhZ2UgY2FtZSBmcm9tIHRoZSB3cm9uZyBsaXN0LiBObyBvYmplY3QgdG8gYWxsb2NhdGUKKwkJICogZnJvbS4gUHV0IGl0IG9udG8gdGhlIGNvcnJlY3QgbGlzdCBhbmQgY29udGludWUgcGFydGlhbAorCQkgKiBzY2FuLgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICJTTFVCOiAlcyA6IFBhZ2Ugd2l0aG91dCBhdmFpbGFibGUgb2JqZWN0cyBvbiIKKwkJCSIgcGFydGlhbCBsaXN0XG4iLCBzLT5uYW1lKTsKKwkJcmV0dXJuIDA7CiAJfQotCXJldHVybiAwOwogfQogCiAvKgogICogVHJ5IHRvIGFsbG9jYXRlIGEgcGFydGlhbCBzbGFiIGZyb20gYSBzcGVjaWZpYyBub2RlLgogICovCi1zdGF0aWMgc3RydWN0IHBhZ2UgKmdldF9wYXJ0aWFsX25vZGUoc3RydWN0IGttZW1fY2FjaGVfbm9kZSAqbikKK3N0YXRpYyBzdHJ1Y3QgcGFnZSAqZ2V0X3BhcnRpYWxfbm9kZShzdHJ1Y3Qga21lbV9jYWNoZSAqcywKKwkJCQkJc3RydWN0IGttZW1fY2FjaGVfbm9kZSAqbikKIHsKIAlzdHJ1Y3QgcGFnZSAqcGFnZTsKIApAQCAtMTUwMyw3ICsxNjIxLDcgQEAKIAogCXNwaW5fbG9jaygmbi0+bGlzdF9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBhZ2UsICZuLT5wYXJ0aWFsLCBscnUpCi0JCWlmIChsb2NrX2FuZF9mcmVlemVfc2xhYihuLCBwYWdlKSkKKwkJaWYgKGFjcXVpcmVfc2xhYihzLCBuLCBwYWdlKSkKIAkJCWdvdG8gb3V0OwogCXBhZ2UgPSBOVUxMOwogb3V0OgpAQCAtMTU1NCw3ICsxNjcyLDcgQEAKIAogCQlpZiAobiAmJiBjcHVzZXRfem9uZV9hbGxvd2VkX2hhcmR3YWxsKHpvbmUsIGZsYWdzKSAmJgogCQkJCW4tPm5yX3BhcnRpYWwgPiBzLT5taW5fcGFydGlhbCkgewotCQkJcGFnZSA9IGdldF9wYXJ0aWFsX25vZGUobik7CisJCQlwYWdlID0gZ2V0X3BhcnRpYWxfbm9kZShzLCBuKTsKIAkJCWlmIChwYWdlKSB7CiAJCQkJcHV0X21lbXNfYWxsb3dlZCgpOwogCQkJCXJldHVybiBwYWdlOwpAQCAtMTU3NCw2MCArMTY5MiwxMyBAQAogCXN0cnVjdCBwYWdlICpwYWdlOwogCWludCBzZWFyY2hub2RlID0gKG5vZGUgPT0gTlVNQV9OT19OT0RFKSA/IG51bWFfbm9kZV9pZCgpIDogbm9kZTsKIAotCXBhZ2UgPSBnZXRfcGFydGlhbF9ub2RlKGdldF9ub2RlKHMsIHNlYXJjaG5vZGUpKTsKKwlwYWdlID0gZ2V0X3BhcnRpYWxfbm9kZShzLCBnZXRfbm9kZShzLCBzZWFyY2hub2RlKSk7CiAJaWYgKHBhZ2UgfHwgbm9kZSAhPSBOVU1BX05PX05PREUpCiAJCXJldHVybiBwYWdlOwogCiAJcmV0dXJuIGdldF9hbnlfcGFydGlhbChzLCBmbGFncyk7CiB9CiAKLS8qCi0gKiBNb3ZlIGEgcGFnZSBiYWNrIHRvIHRoZSBsaXN0cy4KLSAqCi0gKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBzbGFiIGxvY2sgaGVsZC4KLSAqCi0gKiBPbiBleGl0IHRoZSBzbGFiIGxvY2sgd2lsbCBoYXZlIGJlZW4gZHJvcHBlZC4KLSAqLwotc3RhdGljIHZvaWQgdW5mcmVlemVfc2xhYihzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UsIGludCB0YWlsKQotCV9fcmVsZWFzZXMoYml0bG9jaykKLXsKLQlzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlICpuID0gZ2V0X25vZGUocywgcGFnZV90b19uaWQocGFnZSkpOwotCi0JX19DbGVhclBhZ2VTbHViRnJvemVuKHBhZ2UpOwotCWlmIChwYWdlLT5pbnVzZSkgewotCi0JCWlmIChwYWdlLT5mcmVlbGlzdCkgewotCQkJYWRkX3BhcnRpYWwobiwgcGFnZSwgdGFpbCk7Ci0JCQlzdGF0KHMsIHRhaWwgPyBERUFDVElWQVRFX1RPX1RBSUwgOiBERUFDVElWQVRFX1RPX0hFQUQpOwotCQl9IGVsc2UgewotCQkJc3RhdChzLCBERUFDVElWQVRFX0ZVTEwpOwotCQkJaWYgKGttZW1fY2FjaGVfZGVidWcocykgJiYgKHMtPmZsYWdzICYgU0xBQl9TVE9SRV9VU0VSKSkKLQkJCQlhZGRfZnVsbChuLCBwYWdlKTsKLQkJfQotCQlzbGFiX3VubG9jayhwYWdlKTsKLQl9IGVsc2UgewotCQlzdGF0KHMsIERFQUNUSVZBVEVfRU1QVFkpOwotCQlpZiAobi0+bnJfcGFydGlhbCA8IHMtPm1pbl9wYXJ0aWFsKSB7Ci0JCQkvKgotCQkJICogQWRkaW5nIGFuIGVtcHR5IHNsYWIgdG8gdGhlIHBhcnRpYWwgc2xhYnMgaW4gb3JkZXIKLQkJCSAqIHRvIGF2b2lkIHBhZ2UgYWxsb2NhdG9yIG92ZXJoZWFkLiBUaGlzIHNsYWIgbmVlZHMKLQkJCSAqIHRvIGNvbWUgYWZ0ZXIgdGhlIG90aGVyIHNsYWJzIHdpdGggb2JqZWN0cyBpbgotCQkJICogc28gdGhhdCB0aGUgb3RoZXJzIGdldCBmaWxsZWQgZmlyc3QuIFRoYXQgd2F5IHRoZQotCQkJICogc2l6ZSBvZiB0aGUgcGFydGlhbCBsaXN0IHN0YXlzIHNtYWxsLgotCQkJICoKLQkJCSAqIGttZW1fY2FjaGVfc2hyaW5rIGNhbiByZWNsYWltIGFueSBlbXB0eSBzbGFicyBmcm9tCi0JCQkgKiB0aGUgcGFydGlhbCBsaXN0LgotCQkJICovCi0JCQlhZGRfcGFydGlhbChuLCBwYWdlLCAxKTsKLQkJCXNsYWJfdW5sb2NrKHBhZ2UpOwotCQl9IGVsc2UgewotCQkJc2xhYl91bmxvY2socGFnZSk7Ci0JCQlzdGF0KHMsIEZSRUVfU0xBQik7Ci0JCQlkaXNjYXJkX3NsYWIocywgcGFnZSk7Ci0JCX0KLQl9Ci19Ci0KICNpZmRlZiBDT05GSUdfUFJFRU1QVAogLyoKICAqIENhbGN1bGF0ZSB0aGUgbmV4dCBnbG9iYWxseSB1bmlxdWUgdHJhbnNhY3Rpb24gZm9yIGRpc2FtYmlndWlhdGlvbgpAQCAtMTY5Nyw0MiArMTc2OCwxNjEgQEAKIC8qCiAgKiBSZW1vdmUgdGhlIGNwdSBzbGFiCiAgKi8KKworLyoKKyAqIFJlbW92ZSB0aGUgY3B1IHNsYWIKKyAqLwogc3RhdGljIHZvaWQgZGVhY3RpdmF0ZV9zbGFiKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3Qga21lbV9jYWNoZV9jcHUgKmMpCi0JX19yZWxlYXNlcyhiaXRsb2NrKQogeworCWVudW0gc2xhYl9tb2RlcyB7IE1fTk9ORSwgTV9QQVJUSUFMLCBNX0ZVTEwsIE1fRlJFRSB9OwogCXN0cnVjdCBwYWdlICpwYWdlID0gYy0+cGFnZTsKLQlpbnQgdGFpbCA9IDE7CisJc3RydWN0IGttZW1fY2FjaGVfbm9kZSAqbiA9IGdldF9ub2RlKHMsIHBhZ2VfdG9fbmlkKHBhZ2UpKTsKKwlpbnQgbG9jayA9IDA7CisJZW51bSBzbGFiX21vZGVzIGwgPSBNX05PTkUsIG0gPSBNX05PTkU7CisJdm9pZCAqZnJlZWxpc3Q7CisJdm9pZCAqbmV4dGZyZWU7CisJaW50IHRhaWwgPSAwOworCXN0cnVjdCBwYWdlIG5ldzsKKwlzdHJ1Y3QgcGFnZSBvbGQ7CiAKLQlpZiAocGFnZS0+ZnJlZWxpc3QpCisJaWYgKHBhZ2UtPmZyZWVsaXN0KSB7CiAJCXN0YXQocywgREVBQ1RJVkFURV9SRU1PVEVfRlJFRVMpOwotCS8qCi0JICogTWVyZ2UgY3B1IGZyZWVsaXN0IGludG8gc2xhYiBmcmVlbGlzdC4gVHlwaWNhbGx5IHdlIGdldCBoZXJlCi0JICogYmVjYXVzZSBib3RoIGZyZWVsaXN0cyBhcmUgZW1wdHkuIFNvIHRoaXMgaXMgdW5saWtlbHkKLQkgKiB0byBvY2N1ci4KLQkgKi8KLQl3aGlsZSAodW5saWtlbHkoYy0+ZnJlZWxpc3QpKSB7Ci0JCXZvaWQgKipvYmplY3Q7Ci0KLQkJdGFpbCA9IDA7CS8qIEhvdCBvYmplY3RzLiBQdXQgdGhlIHNsYWIgZmlyc3QgKi8KLQotCQkvKiBSZXRyaWV2ZSBvYmplY3QgZnJvbSBjcHVfZnJlZWxpc3QgKi8KLQkJb2JqZWN0ID0gYy0+ZnJlZWxpc3Q7Ci0JCWMtPmZyZWVsaXN0ID0gZ2V0X2ZyZWVwb2ludGVyKHMsIGMtPmZyZWVsaXN0KTsKLQotCQkvKiBBbmQgcHV0IG9udG8gdGhlIHJlZ3VsYXIgZnJlZWxpc3QgKi8KLQkJc2V0X2ZyZWVwb2ludGVyKHMsIG9iamVjdCwgcGFnZS0+ZnJlZWxpc3QpOwotCQlwYWdlLT5mcmVlbGlzdCA9IG9iamVjdDsKLQkJcGFnZS0+aW51c2UtLTsKKwkJdGFpbCA9IDE7CiAJfQotCWMtPnBhZ2UgPSBOVUxMOworCiAJYy0+dGlkID0gbmV4dF90aWQoYy0+dGlkKTsKLQl1bmZyZWV6ZV9zbGFiKHMsIHBhZ2UsIHRhaWwpOworCWMtPnBhZ2UgPSBOVUxMOworCWZyZWVsaXN0ID0gYy0+ZnJlZWxpc3Q7CisJYy0+ZnJlZWxpc3QgPSBOVUxMOworCisJLyoKKwkgKiBTdGFnZSBvbmU6IEZyZWUgYWxsIGF2YWlsYWJsZSBwZXIgY3B1IG9iamVjdHMgYmFjaworCSAqIHRvIHRoZSBwYWdlIGZyZWVsaXN0IHdoaWxlIGl0IGlzIHN0aWxsIGZyb3plbi4gTGVhdmUgdGhlCisJICogbGFzdCBvbmUuCisJICoKKwkgKiBUaGVyZSBpcyBubyBuZWVkIHRvIHRha2UgdGhlIGxpc3QtPmxvY2sgYmVjYXVzZSB0aGUgcGFnZQorCSAqIGlzIHN0aWxsIGZyb3plbi4KKwkgKi8KKwl3aGlsZSAoZnJlZWxpc3QgJiYgKG5leHRmcmVlID0gZ2V0X2ZyZWVwb2ludGVyKHMsIGZyZWVsaXN0KSkpIHsKKwkJdm9pZCAqcHJpb3I7CisJCXVuc2lnbmVkIGxvbmcgY291bnRlcnM7CisKKwkJZG8geworCQkJcHJpb3IgPSBwYWdlLT5mcmVlbGlzdDsKKwkJCWNvdW50ZXJzID0gcGFnZS0+Y291bnRlcnM7CisJCQlzZXRfZnJlZXBvaW50ZXIocywgZnJlZWxpc3QsIHByaW9yKTsKKwkJCW5ldy5jb3VudGVycyA9IGNvdW50ZXJzOworCQkJbmV3LmludXNlLS07CisJCQlWTV9CVUdfT04oIW5ldy5mcm96ZW4pOworCisJCX0gd2hpbGUgKCFfX2NtcHhjaGdfZG91YmxlX3NsYWIocywgcGFnZSwKKwkJCXByaW9yLCBjb3VudGVycywKKwkJCWZyZWVsaXN0LCBuZXcuY291bnRlcnMsCisJCQkiZHJhaW4gcGVyY3B1IGZyZWVsaXN0IikpOworCisJCWZyZWVsaXN0ID0gbmV4dGZyZWU7CisJfQorCisJLyoKKwkgKiBTdGFnZSB0d286IEVuc3VyZSB0aGF0IHRoZSBwYWdlIGlzIHVuZnJvemVuIHdoaWxlIHRoZQorCSAqIGxpc3QgcHJlc2VuY2UgcmVmbGVjdHMgdGhlIGFjdHVhbCBudW1iZXIgb2Ygb2JqZWN0cworCSAqIGR1cmluZyB1bmZyZWV6ZS4KKwkgKgorCSAqIFdlIHNldHVwIHRoZSBsaXN0IG1lbWJlcnNoaXAgYW5kIHRoZW4gcGVyZm9ybSBhIGNtcHhjaGcKKwkgKiB3aXRoIHRoZSBjb3VudC4gSWYgdGhlcmUgaXMgYSBtaXNtYXRjaCB0aGVuIHRoZSBwYWdlCisJICogaXMgbm90IHVuZnJvemVuIGJ1dCB0aGUgcGFnZSBpcyBvbiB0aGUgd3JvbmcgbGlzdC4KKwkgKgorCSAqIFRoZW4gd2UgcmVzdGFydCB0aGUgcHJvY2VzcyB3aGljaCBtYXkgaGF2ZSB0byByZW1vdmUKKwkgKiB0aGUgcGFnZSBmcm9tIHRoZSBsaXN0IHRoYXQgd2UganVzdCBwdXQgaXQgb24gYWdhaW4KKwkgKiBiZWNhdXNlIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBpbiB0aGUgc2xhYiBtYXkgaGF2ZQorCSAqIGNoYW5nZWQuCisJICovCityZWRvOgorCisJb2xkLmZyZWVsaXN0ID0gcGFnZS0+ZnJlZWxpc3Q7CisJb2xkLmNvdW50ZXJzID0gcGFnZS0+Y291bnRlcnM7CisJVk1fQlVHX09OKCFvbGQuZnJvemVuKTsKKworCS8qIERldGVybWluZSB0YXJnZXQgc3RhdGUgb2YgdGhlIHNsYWIgKi8KKwluZXcuY291bnRlcnMgPSBvbGQuY291bnRlcnM7CisJaWYgKGZyZWVsaXN0KSB7CisJCW5ldy5pbnVzZS0tOworCQlzZXRfZnJlZXBvaW50ZXIocywgZnJlZWxpc3QsIG9sZC5mcmVlbGlzdCk7CisJCW5ldy5mcmVlbGlzdCA9IGZyZWVsaXN0OworCX0gZWxzZQorCQluZXcuZnJlZWxpc3QgPSBvbGQuZnJlZWxpc3Q7CisKKwluZXcuZnJvemVuID0gMDsKKworCWlmICghbmV3LmludXNlICYmIG4tPm5yX3BhcnRpYWwgPCBzLT5taW5fcGFydGlhbCkKKwkJbSA9IE1fRlJFRTsKKwllbHNlIGlmIChuZXcuZnJlZWxpc3QpIHsKKwkJbSA9IE1fUEFSVElBTDsKKwkJaWYgKCFsb2NrKSB7CisJCQlsb2NrID0gMTsKKwkJCS8qCisJCQkgKiBUYWtpbmcgdGhlIHNwaW5sb2NrIHJlbW92ZXMgdGhlIHBvc3NpYmxpdHkKKwkJCSAqIHRoYXQgYWNxdWlyZV9zbGFiKCkgd2lsbCBzZWUgYSBzbGFiIHBhZ2UgdGhhdAorCQkJICogaXMgZnJvemVuCisJCQkgKi8KKwkJCXNwaW5fbG9jaygmbi0+bGlzdF9sb2NrKTsKKwkJfQorCX0gZWxzZSB7CisJCW0gPSBNX0ZVTEw7CisJCWlmIChrbWVtX2NhY2hlX2RlYnVnKHMpICYmICFsb2NrKSB7CisJCQlsb2NrID0gMTsKKwkJCS8qCisJCQkgKiBUaGlzIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBzY2FubmluZyBvZiBmdWxsCisJCQkgKiBzbGFicyBmcm9tIGRpYWdub3N0aWMgZnVuY3Rpb25zIHdpbGwgbm90IHNlZQorCQkJICogYW55IGZyb3plbiBzbGFicy4KKwkJCSAqLworCQkJc3Bpbl9sb2NrKCZuLT5saXN0X2xvY2spOworCQl9CisJfQorCisJaWYgKGwgIT0gbSkgeworCisJCWlmIChsID09IE1fUEFSVElBTCkKKworCQkJcmVtb3ZlX3BhcnRpYWwobiwgcGFnZSk7CisKKwkJZWxzZSBpZiAobCA9PSBNX0ZVTEwpCisKKwkJCXJlbW92ZV9mdWxsKHMsIHBhZ2UpOworCisJCWlmIChtID09IE1fUEFSVElBTCkgeworCisJCQlhZGRfcGFydGlhbChuLCBwYWdlLCB0YWlsKTsKKwkJCXN0YXQocywgdGFpbCA/IERFQUNUSVZBVEVfVE9fVEFJTCA6IERFQUNUSVZBVEVfVE9fSEVBRCk7CisKKwkJfSBlbHNlIGlmIChtID09IE1fRlVMTCkgeworCisJCQlzdGF0KHMsIERFQUNUSVZBVEVfRlVMTCk7CisJCQlhZGRfZnVsbChzLCBuLCBwYWdlKTsKKworCQl9CisJfQorCisJbCA9IG07CisJaWYgKCFfX2NtcHhjaGdfZG91YmxlX3NsYWIocywgcGFnZSwKKwkJCQlvbGQuZnJlZWxpc3QsIG9sZC5jb3VudGVycywKKwkJCQluZXcuZnJlZWxpc3QsIG5ldy5jb3VudGVycywKKwkJCQkidW5mcmVlemluZyBzbGFiIikpCisJCWdvdG8gcmVkbzsKKworCWlmIChsb2NrKQorCQlzcGluX3VubG9jaygmbi0+bGlzdF9sb2NrKTsKKworCWlmIChtID09IE1fRlJFRSkgeworCQlzdGF0KHMsIERFQUNUSVZBVEVfRU1QVFkpOworCQlkaXNjYXJkX3NsYWIocywgcGFnZSk7CisJCXN0YXQocywgRlJFRV9TTEFCKTsKKwl9CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9zbGFiKHN0cnVjdCBrbWVtX2NhY2hlICpzLCBzdHJ1Y3Qga21lbV9jYWNoZV9jcHUgKmMpCiB7CiAJc3RhdChzLCBDUFVTTEFCX0ZMVVNIKTsKLQlzbGFiX2xvY2soYy0+cGFnZSk7CiAJZGVhY3RpdmF0ZV9zbGFiKHMsIGMpOwogfQogCkBAIC0xODYxLDYgKzIwNTEsOCBAQAogCXZvaWQgKipvYmplY3Q7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcGFnZSBuZXc7CisJdW5zaWduZWQgbG9uZyBjb3VudGVyczsKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKICNpZmRlZiBDT05GSUdfUFJFRU1QVApAQCAtMTg3OSw3MiArMjA3MSw5NyBAQAogCWlmICghcGFnZSkKIAkJZ290byBuZXdfc2xhYjsKIAotCXNsYWJfbG9jayhwYWdlKTsKLQlpZiAodW5saWtlbHkoIW5vZGVfbWF0Y2goYywgbm9kZSkpKQotCQlnb3RvIGFub3RoZXJfc2xhYjsKKwlpZiAodW5saWtlbHkoIW5vZGVfbWF0Y2goYywgbm9kZSkpKSB7CisJCXN0YXQocywgQUxMT0NfTk9ERV9NSVNNQVRDSCk7CisJCWRlYWN0aXZhdGVfc2xhYihzLCBjKTsKKwkJZ290byBuZXdfc2xhYjsKKwl9CisKKwlzdGF0KHMsIEFMTE9DX1NMT1dQQVRIKTsKKworCWRvIHsKKwkJb2JqZWN0ID0gcGFnZS0+ZnJlZWxpc3Q7CisJCWNvdW50ZXJzID0gcGFnZS0+Y291bnRlcnM7CisJCW5ldy5jb3VudGVycyA9IGNvdW50ZXJzOworCQlWTV9CVUdfT04oIW5ldy5mcm96ZW4pOworCisJCS8qCisJCSAqIElmIHRoZXJlIGlzIG5vIG9iamVjdCBsZWZ0IHRoZW4gd2UgdXNlIHRoaXMgbG9vcCB0bworCQkgKiBkZWFjdGl2YXRlIHRoZSBzbGFiIHdoaWNoIGlzIHNpbXBsZSBzaW5jZSBubyBvYmplY3RzCisJCSAqIGFyZSBsZWZ0IGluIHRoZSBzbGFiIGFuZCB0aGVyZWZvcmUgd2UgZG8gbm90IG5lZWQgdG8KKwkJICogcHV0IHRoZSBwYWdlIGJhY2sgb250byB0aGUgcGFydGlhbCBsaXN0LgorCQkgKgorCQkgKiBJZiB0aGVyZSBhcmUgb2JqZWN0cyBsZWZ0IHRoZW4gd2UgcmV0cmlldmUgdGhlbQorCQkgKiBhbmQgdXNlIHRoZW0gdG8gcmVmaWxsIHRoZSBwZXIgY3B1IHF1ZXVlLgorCQkqLworCisJCW5ldy5pbnVzZSA9IHBhZ2UtPm9iamVjdHM7CisJCW5ldy5mcm96ZW4gPSBvYmplY3QgIT0gTlVMTDsKKworCX0gd2hpbGUgKCFfX2NtcHhjaGdfZG91YmxlX3NsYWIocywgcGFnZSwKKwkJCW9iamVjdCwgY291bnRlcnMsCisJCQlOVUxMLCBuZXcuY291bnRlcnMsCisJCQkiX19zbGFiX2FsbG9jIikpOworCisJaWYgKHVubGlrZWx5KCFvYmplY3QpKSB7CisJCWMtPnBhZ2UgPSBOVUxMOworCQlzdGF0KHMsIERFQUNUSVZBVEVfQllQQVNTKTsKKwkJZ290byBuZXdfc2xhYjsKKwl9CiAKIAlzdGF0KHMsIEFMTE9DX1JFRklMTCk7CiAKIGxvYWRfZnJlZWxpc3Q6Ci0Jb2JqZWN0ID0gcGFnZS0+ZnJlZWxpc3Q7Ci0JaWYgKHVubGlrZWx5KCFvYmplY3QpKQotCQlnb3RvIGFub3RoZXJfc2xhYjsKLQlpZiAoa21lbV9jYWNoZV9kZWJ1ZyhzKSkKLQkJZ290byBkZWJ1ZzsKLQorCVZNX0JVR19PTighcGFnZS0+ZnJvemVuKTsKIAljLT5mcmVlbGlzdCA9IGdldF9mcmVlcG9pbnRlcihzLCBvYmplY3QpOwotCXBhZ2UtPmludXNlID0gcGFnZS0+b2JqZWN0czsKLQlwYWdlLT5mcmVlbGlzdCA9IE5VTEw7Ci0KLQlzbGFiX3VubG9jayhwYWdlKTsKIAljLT50aWQgPSBuZXh0X3RpZChjLT50aWQpOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQlzdGF0KHMsIEFMTE9DX1NMT1dQQVRIKTsKIAlyZXR1cm4gb2JqZWN0OwogCi1hbm90aGVyX3NsYWI6Ci0JZGVhY3RpdmF0ZV9zbGFiKHMsIGMpOwotCiBuZXdfc2xhYjoKIAlwYWdlID0gZ2V0X3BhcnRpYWwocywgZ2ZwZmxhZ3MsIG5vZGUpOwogCWlmIChwYWdlKSB7CiAJCXN0YXQocywgQUxMT0NfRlJPTV9QQVJUSUFMKTsKLQkJYy0+bm9kZSA9IHBhZ2VfdG9fbmlkKHBhZ2UpOwotCQljLT5wYWdlID0gcGFnZTsKKwkJb2JqZWN0ID0gYy0+ZnJlZWxpc3Q7CisKKwkJaWYgKGttZW1fY2FjaGVfZGVidWcocykpCisJCQlnb3RvIGRlYnVnOwogCQlnb3RvIGxvYWRfZnJlZWxpc3Q7CiAJfQogCi0JZ2ZwZmxhZ3MgJj0gZ2ZwX2FsbG93ZWRfbWFzazsKLQlpZiAoZ2ZwZmxhZ3MgJiBfX0dGUF9XQUlUKQotCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0KIAlwYWdlID0gbmV3X3NsYWIocywgZ2ZwZmxhZ3MsIG5vZGUpOwogCi0JaWYgKGdmcGZsYWdzICYgX19HRlBfV0FJVCkKLQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQogCWlmIChwYWdlKSB7CiAJCWMgPSBfX3RoaXNfY3B1X3B0cihzLT5jcHVfc2xhYik7Ci0JCXN0YXQocywgQUxMT0NfU0xBQik7CiAJCWlmIChjLT5wYWdlKQogCQkJZmx1c2hfc2xhYihzLCBjKTsKIAotCQlzbGFiX2xvY2socGFnZSk7Ci0JCV9fU2V0UGFnZVNsdWJGcm96ZW4ocGFnZSk7CisJCS8qCisJCSAqIE5vIG90aGVyIHJlZmVyZW5jZSB0byB0aGUgcGFnZSB5ZXQgc28gd2UgY2FuCisJCSAqIG11Y2sgYXJvdW5kIHdpdGggaXQgZnJlZWx5IHdpdGhvdXQgY21weGNoZworCQkgKi8KKwkJb2JqZWN0ID0gcGFnZS0+ZnJlZWxpc3Q7CisJCXBhZ2UtPmZyZWVsaXN0ID0gTlVMTDsKKwkJcGFnZS0+aW51c2UgPSBwYWdlLT5vYmplY3RzOworCisJCXN0YXQocywgQUxMT0NfU0xBQik7CiAJCWMtPm5vZGUgPSBwYWdlX3RvX25pZChwYWdlKTsKIAkJYy0+cGFnZSA9IHBhZ2U7CisKKwkJaWYgKGttZW1fY2FjaGVfZGVidWcocykpCisJCQlnb3RvIGRlYnVnOwogCQlnb3RvIGxvYWRfZnJlZWxpc3Q7CiAJfQogCWlmICghKGdmcGZsYWdzICYgX19HRlBfTk9XQVJOKSAmJiBwcmludGtfcmF0ZWxpbWl0KCkpCiAJCXNsYWJfb3V0X29mX21lbW9yeShzLCBnZnBmbGFncywgbm9kZSk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCXJldHVybiBOVUxMOwotZGVidWc6Ci0JaWYgKCFhbGxvY19kZWJ1Z19wcm9jZXNzaW5nKHMsIHBhZ2UsIG9iamVjdCwgYWRkcikpCi0JCWdvdG8gYW5vdGhlcl9zbGFiOwogCi0JcGFnZS0+aW51c2UrKzsKLQlwYWdlLT5mcmVlbGlzdCA9IGdldF9mcmVlcG9pbnRlcihzLCBvYmplY3QpOworZGVidWc6CisJaWYgKCFvYmplY3QgfHwgIWFsbG9jX2RlYnVnX3Byb2Nlc3NpbmcocywgcGFnZSwgb2JqZWN0LCBhZGRyKSkKKwkJZ290byBuZXdfc2xhYjsKKworCWMtPmZyZWVsaXN0ID0gZ2V0X2ZyZWVwb2ludGVyKHMsIG9iamVjdCk7CiAJZGVhY3RpdmF0ZV9zbGFiKHMsIGMpOwogCWMtPnBhZ2UgPSBOVUxMOwogCWMtPm5vZGUgPSBOVU1BX05PX05PREU7CkBAIC0yMDk2LDQwICsyMzEzLDc1IEBACiB7CiAJdm9pZCAqcHJpb3I7CiAJdm9pZCAqKm9iamVjdCA9ICh2b2lkICopeDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB3YXNfZnJvemVuOworCWludCBpbnVzZTsKKwlzdHJ1Y3QgcGFnZSBuZXc7CisJdW5zaWduZWQgbG9uZyBjb3VudGVyczsKKwlzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlICpuID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIHVuaW5pdGlhbGl6ZWRfdmFyKGZsYWdzKTsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlzbGFiX2xvY2socGFnZSk7CiAJc3RhdChzLCBGUkVFX1NMT1dQQVRIKTsKIAogCWlmIChrbWVtX2NhY2hlX2RlYnVnKHMpICYmICFmcmVlX2RlYnVnX3Byb2Nlc3NpbmcocywgcGFnZSwgeCwgYWRkcikpCi0JCWdvdG8gb3V0X3VubG9jazsKKwkJcmV0dXJuOwogCi0JcHJpb3IgPSBwYWdlLT5mcmVlbGlzdDsKLQlzZXRfZnJlZXBvaW50ZXIocywgb2JqZWN0LCBwcmlvcik7Ci0JcGFnZS0+ZnJlZWxpc3QgPSBvYmplY3Q7Ci0JcGFnZS0+aW51c2UtLTsKKwlkbyB7CisJCXByaW9yID0gcGFnZS0+ZnJlZWxpc3Q7CisJCWNvdW50ZXJzID0gcGFnZS0+Y291bnRlcnM7CisJCXNldF9mcmVlcG9pbnRlcihzLCBvYmplY3QsIHByaW9yKTsKKwkJbmV3LmNvdW50ZXJzID0gY291bnRlcnM7CisJCXdhc19mcm96ZW4gPSBuZXcuZnJvemVuOworCQluZXcuaW51c2UtLTsKKwkJaWYgKCghbmV3LmludXNlIHx8ICFwcmlvcikgJiYgIXdhc19mcm96ZW4gJiYgIW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBnZXRfbm9kZShzLCBwYWdlX3RvX25pZChwYWdlKSk7CisJCQkvKgorCQkJICogU3BlY3VsYXRpdmVseSBhY3F1aXJlIHRoZSBsaXN0X2xvY2suCisJCQkgKiBJZiB0aGUgY21weGNoZyBkb2VzIG5vdCBzdWNjZWVkIHRoZW4gd2UgbWF5CisJCQkgKiBkcm9wIHRoZSBsaXN0X2xvY2sgd2l0aG91dCBhbnkgcHJvY2Vzc2luZy4KKwkJCSAqCisJCQkgKiBPdGhlcndpc2UgdGhlIGxpc3RfbG9jayB3aWxsIHN5bmNocm9uaXplIHdpdGgKKwkJCSAqIG90aGVyIHByb2Nlc3NvcnMgdXBkYXRpbmcgdGhlIGxpc3Qgb2Ygc2xhYnMuCisJCQkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZuLT5saXN0X2xvY2ssIGZsYWdzKTsKKwkJfQorCQlpbnVzZSA9IG5ldy5pbnVzZTsKIAotCWlmICh1bmxpa2VseShQYWdlU2x1YkZyb3plbihwYWdlKSkpIHsKLQkJc3RhdChzLCBGUkVFX0ZST1pFTik7Ci0JCWdvdG8gb3V0X3VubG9jazsKLQl9CisJfSB3aGlsZSAoIWNtcHhjaGdfZG91YmxlX3NsYWIocywgcGFnZSwKKwkJcHJpb3IsIGNvdW50ZXJzLAorCQlvYmplY3QsIG5ldy5jb3VudGVycywKKwkJIl9fc2xhYl9mcmVlIikpOwogCi0JaWYgKHVubGlrZWx5KCFwYWdlLT5pbnVzZSkpCi0JCWdvdG8gc2xhYl9lbXB0eTsKKwlpZiAobGlrZWx5KCFuKSkgeworICAgICAgICAgICAgICAgIC8qCisJCSAqIFRoZSBsaXN0IGxvY2sgd2FzIG5vdCB0YWtlbiB0aGVyZWZvcmUgbm8gbGlzdAorCQkgKiBhY3Rpdml0eSBjYW4gYmUgbmVjZXNzYXJ5LgorCQkgKi8KKyAgICAgICAgICAgICAgICBpZiAod2FzX2Zyb3plbikKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXQocywgRlJFRV9GUk9aRU4pOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogCiAJLyoKLQkgKiBPYmplY3RzIGxlZnQgaW4gdGhlIHNsYWIuIElmIGl0IHdhcyBub3Qgb24gdGhlIHBhcnRpYWwgbGlzdCBiZWZvcmUKLQkgKiB0aGVuIGFkZCBpdC4KKwkgKiB3YXNfZnJvemVuIG1heSBoYXZlIGJlZW4gc2V0IGFmdGVyIHdlIGFjcXVpcmVkIHRoZSBsaXN0X2xvY2sgaW4KKwkgKiBhbiBlYXJsaWVyIGxvb3AuIFNvIHdlIG5lZWQgdG8gY2hlY2sgaXQgaGVyZSBhZ2Fpbi4KIAkgKi8KLQlpZiAodW5saWtlbHkoIXByaW9yKSkgewotCQlhZGRfcGFydGlhbChnZXRfbm9kZShzLCBwYWdlX3RvX25pZChwYWdlKSksIHBhZ2UsIDEpOwotCQlzdGF0KHMsIEZSRUVfQUREX1BBUlRJQUwpOwotCX0KKwlpZiAod2FzX2Zyb3plbikKKwkJc3RhdChzLCBGUkVFX0ZST1pFTik7CisJZWxzZSB7CisJCWlmICh1bmxpa2VseSghaW51c2UgJiYgbi0+bnJfcGFydGlhbCA+IHMtPm1pbl9wYXJ0aWFsKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gc2xhYl9lbXB0eTsKIAotb3V0X3VubG9jazoKLQlzbGFiX3VubG9jayhwYWdlKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCS8qCisJCSAqIE9iamVjdHMgbGVmdCBpbiB0aGUgc2xhYi4gSWYgaXQgd2FzIG5vdCBvbiB0aGUgcGFydGlhbCBsaXN0IGJlZm9yZQorCQkgKiB0aGVuIGFkZCBpdC4KKwkJICovCisJCWlmICh1bmxpa2VseSghcHJpb3IpKSB7CisJCQlyZW1vdmVfZnVsbChzLCBwYWdlKTsKKwkJCWFkZF9wYXJ0aWFsKG4sIHBhZ2UsIDApOworCQkJc3RhdChzLCBGUkVFX0FERF9QQVJUSUFMKTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuLT5saXN0X2xvY2ssIGZsYWdzKTsKIAlyZXR1cm47CiAKIHNsYWJfZW1wdHk6CkBAIC0yMTM3LDExICsyMzg5LDExIEBACiAJCS8qCiAJCSAqIFNsYWIgc3RpbGwgb24gdGhlIHBhcnRpYWwgbGlzdC4KIAkJICovCi0JCXJlbW92ZV9wYXJ0aWFsKHMsIHBhZ2UpOworCQlyZW1vdmVfcGFydGlhbChuLCBwYWdlKTsKIAkJc3RhdChzLCBGUkVFX1JFTU9WRV9QQVJUSUFMKTsKIAl9Ci0Jc2xhYl91bmxvY2socGFnZSk7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbi0+bGlzdF9sb2NrLCBmbGFncyk7CiAJc3RhdChzLCBGUkVFX1NMQUIpOwogCWRpc2NhcmRfc2xhYihzLCBwYWdlKTsKIH0KQEAgLTI0MTUsNyArMjY2Nyw2IEBACiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJc3RydWN0IGttZW1fY2FjaGVfbm9kZSAqbjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJQlVHX09OKGttZW1fY2FjaGVfbm9kZS0+c2l6ZSA8IHNpemVvZihzdHJ1Y3Qga21lbV9jYWNoZV9ub2RlKSk7CiAKQEAgLTI0MzMsNiArMjY4NCw3IEBACiAJQlVHX09OKCFuKTsKIAlwYWdlLT5mcmVlbGlzdCA9IGdldF9mcmVlcG9pbnRlcihrbWVtX2NhY2hlX25vZGUsIG4pOwogCXBhZ2UtPmludXNlKys7CisJcGFnZS0+ZnJvemVuID0gMDsKIAlrbWVtX2NhY2hlX25vZGUtPm5vZGVbbm9kZV0gPSBuOwogI2lmZGVmIENPTkZJR19TTFVCX0RFQlVHCiAJaW5pdF9vYmplY3Qoa21lbV9jYWNoZV9ub2RlLCBuLCBTTFVCX1JFRF9BQ1RJVkUpOwpAQCAtMjQ0MSwxNCArMjY5Myw3IEBACiAJaW5pdF9rbWVtX2NhY2hlX25vZGUobiwga21lbV9jYWNoZV9ub2RlKTsKIAlpbmNfc2xhYnNfbm9kZShrbWVtX2NhY2hlX25vZGUsIG5vZGUsIHBhZ2UtPm9iamVjdHMpOwogCi0JLyoKLQkgKiBsb2NrZGVwIHJlcXVpcmVzIGNvbnNpc3RlbnQgaXJxIHVzYWdlIGZvciBlYWNoIGxvY2sKLQkgKiBzbyBldmVuIHRob3VnaCB0aGVyZSBjYW5ub3QgYmUgYSByYWNlIHRoaXMgZWFybHkgaW4KLQkgKiB0aGUgYm9vdCBzZXF1ZW5jZSwgd2Ugc3RpbGwgZGlzYWJsZSBpcnFzLgotCSAqLwotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlhZGRfcGFydGlhbChuLCBwYWdlLCAwKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIGZyZWVfa21lbV9jYWNoZV9ub2RlcyhzdHJ1Y3Qga21lbV9jYWNoZSAqcykKQEAgLTI2NTQsNiArMjg5OSwxMiBAQAogCQl9CiAJfQogCisjaWZkZWYgQ09ORklHX0NNUFhDSEdfRE9VQkxFCisJaWYgKHN5c3RlbV9oYXNfY21weGNoZ19kb3VibGUoKSAmJiAocy0+ZmxhZ3MgJiBTTEFCX0RFQlVHX0ZMQUdTKSA9PSAwKQorCQkvKiBFbmFibGUgZmFzdCBtb2RlICovCisJCXMtPmZsYWdzIHw9IF9fQ01QWENIR19ET1VCTEU7CisjZW5kaWYKKwogCS8qCiAJICogVGhlIGxhcmdlciB0aGUgb2JqZWN0IHNpemUgaXMsIHRoZSBtb3JlIHBhZ2VzIHdlIHdhbnQgb24gdGhlIHBhcnRpYWwKIAkgKiBsaXN0IHRvIGF2b2lkIHBvdW5kaW5nIHRoZSBwYWdlIGFsbG9jYXRvciBleGNlc3NpdmVseS4KQEAgLTI3MjYsNyArMjk3Nyw3IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJm4tPmxpc3RfbG9jaywgZmxhZ3MpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYWdlLCBoLCAmbi0+cGFydGlhbCwgbHJ1KSB7CiAJCWlmICghcGFnZS0+aW51c2UpIHsKLQkJCV9fcmVtb3ZlX3BhcnRpYWwobiwgcGFnZSk7CisJCQlyZW1vdmVfcGFydGlhbChuLCBwYWdlKTsKIAkJCWRpc2NhcmRfc2xhYihzLCBwYWdlKTsKIAkJfSBlbHNlIHsKIAkJCWxpc3Rfc2xhYl9vYmplY3RzKHMsIHBhZ2UsCkBAIC0zMDk0LDE0ICszMzQ1LDggQEAKIAkJICogbGlzdF9sb2NrLiBwYWdlLT5pbnVzZSBoZXJlIGlzIHRoZSB1cHBlciBsaW1pdC4KIAkJICovCiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYWdlLCB0LCAmbi0+cGFydGlhbCwgbHJ1KSB7Ci0JCQlpZiAoIXBhZ2UtPmludXNlICYmIHNsYWJfdHJ5bG9jayhwYWdlKSkgewotCQkJCS8qCi0JCQkJICogTXVzdCBob2xkIHNsYWIgbG9jayBoZXJlIGJlY2F1c2Ugc2xhYl9mcmVlCi0JCQkJICogbWF5IGhhdmUgZnJlZWQgdGhlIGxhc3Qgb2JqZWN0IGFuZCBiZQotCQkJCSAqIHdhaXRpbmcgdG8gcmVsZWFzZSB0aGUgc2xhYi4KLQkJCQkgKi8KLQkJCQlfX3JlbW92ZV9wYXJ0aWFsKG4sIHBhZ2UpOwotCQkJCXNsYWJfdW5sb2NrKHBhZ2UpOworCQkJaWYgKCFwYWdlLT5pbnVzZSkgeworCQkJCXJlbW92ZV9wYXJ0aWFsKG4sIHBhZ2UpOwogCQkJCWRpc2NhcmRfc2xhYihzLCBwYWdlKTsKIAkJCX0gZWxzZSB7CiAJCQkJbGlzdF9tb3ZlKCZwYWdlLT5scnUsCkBAIC0zNjg5LDEyICszOTM0LDkgQEAKIHN0YXRpYyB2b2lkIHZhbGlkYXRlX3NsYWJfc2xhYihzdHJ1Y3Qga21lbV9jYWNoZSAqcywgc3RydWN0IHBhZ2UgKnBhZ2UsCiAJCQkJCQl1bnNpZ25lZCBsb25nICptYXApCiB7Ci0JaWYgKHNsYWJfdHJ5bG9jayhwYWdlKSkgewotCQl2YWxpZGF0ZV9zbGFiKHMsIHBhZ2UsIG1hcCk7Ci0JCXNsYWJfdW5sb2NrKHBhZ2UpOwotCX0gZWxzZQotCQlwcmludGsoS0VSTl9JTkZPICJTTFVCICVzOiBTa2lwcGVkIGJ1c3kgc2xhYiAweCVwXG4iLAotCQkJcy0+bmFtZSwgcGFnZSk7CisJc2xhYl9sb2NrKHBhZ2UpOworCXZhbGlkYXRlX3NsYWIocywgcGFnZSwgbWFwKTsKKwlzbGFiX3VubG9jayhwYWdlKTsKIH0KIAogc3RhdGljIGludCB2YWxpZGF0ZV9zbGFiX25vZGUoc3RydWN0IGttZW1fY2FjaGUgKnMsCkBAIC00MzQyLDggKzQ1ODQsMTAgQEAKIAkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW5ndGgpCiB7CiAJcy0+ZmxhZ3MgJj0gflNMQUJfREVCVUdfRlJFRTsKLQlpZiAoYnVmWzBdID09ICcxJykKKwlpZiAoYnVmWzBdID09ICcxJykgeworCQlzLT5mbGFncyAmPSB+X19DTVBYQ0hHX0RPVUJMRTsKIAkJcy0+ZmxhZ3MgfD0gU0xBQl9ERUJVR19GUkVFOworCX0KIAlyZXR1cm4gbGVuZ3RoOwogfQogU0xBQl9BVFRSKHNhbml0eV9jaGVja3MpOwpAQCAtNDM1Nyw4ICs0NjAxLDEwIEBACiAJCQkJCQkJc2l6ZV90IGxlbmd0aCkKIHsKIAlzLT5mbGFncyAmPSB+U0xBQl9UUkFDRTsKLQlpZiAoYnVmWzBdID09ICcxJykKKwlpZiAoYnVmWzBdID09ICcxJykgeworCQlzLT5mbGFncyAmPSB+X19DTVBYQ0hHX0RPVUJMRTsKIAkJcy0+ZmxhZ3MgfD0gU0xBQl9UUkFDRTsKKwl9CiAJcmV0dXJuIGxlbmd0aDsKIH0KIFNMQUJfQVRUUih0cmFjZSk7CkBAIC00Mzc1LDggKzQ2MjEsMTAgQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAogCXMtPmZsYWdzICY9IH5TTEFCX1JFRF9aT05FOwotCWlmIChidWZbMF0gPT0gJzEnKQorCWlmIChidWZbMF0gPT0gJzEnKSB7CisJCXMtPmZsYWdzICY9IH5fX0NNUFhDSEdfRE9VQkxFOwogCQlzLT5mbGFncyB8PSBTTEFCX1JFRF9aT05FOworCX0KIAljYWxjdWxhdGVfc2l6ZXMocywgLTEpOwogCXJldHVybiBsZW5ndGg7CiB9CkBAIC00Mzk0LDggKzQ2NDIsMTAgQEAKIAkJcmV0dXJuIC1FQlVTWTsKIAogCXMtPmZsYWdzICY9IH5TTEFCX1BPSVNPTjsKLQlpZiAoYnVmWzBdID09ICcxJykKKwlpZiAoYnVmWzBdID09ICcxJykgeworCQlzLT5mbGFncyAmPSB+X19DTVBYQ0hHX0RPVUJMRTsKIAkJcy0+ZmxhZ3MgfD0gU0xBQl9QT0lTT047CisJfQogCWNhbGN1bGF0ZV9zaXplcyhzLCAtMSk7CiAJcmV0dXJuIGxlbmd0aDsKIH0KQEAgLTQ0MTMsOCArNDY2MywxMCBAQAogCQlyZXR1cm4gLUVCVVNZOwogCiAJcy0+ZmxhZ3MgJj0gflNMQUJfU1RPUkVfVVNFUjsKLQlpZiAoYnVmWzBdID09ICcxJykKKwlpZiAoYnVmWzBdID09ICcxJykgeworCQlzLT5mbGFncyAmPSB+X19DTVBYQ0hHX0RPVUJMRTsKIAkJcy0+ZmxhZ3MgfD0gU0xBQl9TVE9SRV9VU0VSOworCX0KIAljYWxjdWxhdGVfc2l6ZXMocywgLTEpOwogCXJldHVybiBsZW5ndGg7CiB9CkBAIC00NTc5LDYgKzQ4MzEsNyBAQAogU1RBVF9BVFRSKEFMTE9DX0ZST01fUEFSVElBTCwgYWxsb2NfZnJvbV9wYXJ0aWFsKTsKIFNUQVRfQVRUUihBTExPQ19TTEFCLCBhbGxvY19zbGFiKTsKIFNUQVRfQVRUUihBTExPQ19SRUZJTEwsIGFsbG9jX3JlZmlsbCk7CitTVEFUX0FUVFIoQUxMT0NfTk9ERV9NSVNNQVRDSCwgYWxsb2Nfbm9kZV9taXNtYXRjaCk7CiBTVEFUX0FUVFIoRlJFRV9TTEFCLCBmcmVlX3NsYWIpOwogU1RBVF9BVFRSKENQVVNMQUJfRkxVU0gsIGNwdXNsYWJfZmx1c2gpOwogU1RBVF9BVFRSKERFQUNUSVZBVEVfRlVMTCwgZGVhY3RpdmF0ZV9mdWxsKTsKQEAgLTQ1ODYsNyArNDgzOSwxMCBAQAogU1RBVF9BVFRSKERFQUNUSVZBVEVfVE9fSEVBRCwgZGVhY3RpdmF0ZV90b19oZWFkKTsKIFNUQVRfQVRUUihERUFDVElWQVRFX1RPX1RBSUwsIGRlYWN0aXZhdGVfdG9fdGFpbCk7CiBTVEFUX0FUVFIoREVBQ1RJVkFURV9SRU1PVEVfRlJFRVMsIGRlYWN0aXZhdGVfcmVtb3RlX2ZyZWVzKTsKK1NUQVRfQVRUUihERUFDVElWQVRFX0JZUEFTUywgZGVhY3RpdmF0ZV9ieXBhc3MpOwogU1RBVF9BVFRSKE9SREVSX0ZBTExCQUNLLCBvcmRlcl9mYWxsYmFjayk7CitTVEFUX0FUVFIoQ01QWENIR19ET1VCTEVfQ1BVX0ZBSUwsIGNtcHhjaGdfZG91YmxlX2NwdV9mYWlsKTsKK1NUQVRfQVRUUihDTVBYQ0hHX0RPVUJMRV9GQUlMLCBjbXB4Y2hnX2RvdWJsZV9mYWlsKTsKICNlbmRpZgogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqc2xhYl9hdHRyc1tdID0gewpAQCAtNDYzNiw2ICs0ODkyLDcgQEAKIAkmYWxsb2NfZnJvbV9wYXJ0aWFsX2F0dHIuYXR0ciwKIAkmYWxsb2Nfc2xhYl9hdHRyLmF0dHIsCiAJJmFsbG9jX3JlZmlsbF9hdHRyLmF0dHIsCisJJmFsbG9jX25vZGVfbWlzbWF0Y2hfYXR0ci5hdHRyLAogCSZmcmVlX3NsYWJfYXR0ci5hdHRyLAogCSZjcHVzbGFiX2ZsdXNoX2F0dHIuYXR0ciwKIAkmZGVhY3RpdmF0ZV9mdWxsX2F0dHIuYXR0ciwKQEAgLTQ2NDMsNyArNDkwMCwxMCBAQAogCSZkZWFjdGl2YXRlX3RvX2hlYWRfYXR0ci5hdHRyLAogCSZkZWFjdGl2YXRlX3RvX3RhaWxfYXR0ci5hdHRyLAogCSZkZWFjdGl2YXRlX3JlbW90ZV9mcmVlc19hdHRyLmF0dHIsCisJJmRlYWN0aXZhdGVfYnlwYXNzX2F0dHIuYXR0ciwKIAkmb3JkZXJfZmFsbGJhY2tfYXR0ci5hdHRyLAorCSZjbXB4Y2hnX2RvdWJsZV9mYWlsX2F0dHIuYXR0ciwKKwkmY21weGNoZ19kb3VibGVfY3B1X2ZhaWxfYXR0ci5hdHRyLAogI2VuZGlmCiAjaWZkZWYgQ09ORklHX0ZBSUxTTEFCCiAJJmZhaWxzbGFiX2F0dHIuYXR0ciwKZGlmZiAtLWdpdCBhL21tL3N3YXBmaWxlLmMgYi9tbS9zd2FwZmlsZS5jCmluZGV4IDFiOGMzMzkuLjE3YmMyMjQgMTAwNjQ0Ci0tLSBhL21tL3N3YXBmaWxlLmMKKysrIGIvbW0vc3dhcGZpbGUuYwpAQCAtMTkyNCwyMCArMTkyNCwyNCBAQAogCiAJLyoKIAkgKiBGaW5kIG91dCBob3cgbWFueSBwYWdlcyBhcmUgYWxsb3dlZCBmb3IgYSBzaW5nbGUgc3dhcAotCSAqIGRldmljZS4gVGhlcmUgYXJlIHR3byBsaW1pdGluZyBmYWN0b3JzOiAxKSB0aGUgbnVtYmVyIG9mCi0JICogYml0cyBmb3IgdGhlIHN3YXAgb2Zmc2V0IGluIHRoZSBzd3BfZW50cnlfdCB0eXBlIGFuZAotCSAqIDIpIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgYSBzd2FwIHB0ZSBhcyBkZWZpbmVkIGJ5Ci0JICogdGhlIGRpZmZlcmVudCBhcmNoaXRlY3R1cmVzLiBJbiBvcmRlciB0byBmaW5kIHRoZQotCSAqIGxhcmdlc3QgcG9zc2libGUgYml0IG1hc2sgYSBzd2FwIGVudHJ5IHdpdGggc3dhcCB0eXBlIDAKKwkgKiBkZXZpY2UuIFRoZXJlIGFyZSB0aHJlZSBsaW1pdGluZyBmYWN0b3JzOiAxKSB0aGUgbnVtYmVyCisJICogb2YgYml0cyBmb3IgdGhlIHN3YXAgb2Zmc2V0IGluIHRoZSBzd3BfZW50cnlfdCB0eXBlLCBhbmQKKwkgKiAyKSB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhlIHN3YXAgcHRlIGFzIGRlZmluZWQgYnkgdGhlCisJICogdGhlIGRpZmZlcmVudCBhcmNoaXRlY3R1cmVzLCBhbmQgMykgdGhlIG51bWJlciBvZiBmcmVlIGJpdHMKKwkgKiBpbiBhbiBleGNlcHRpb25hbCByYWRpeF90cmVlIGVudHJ5LiBJbiBvcmRlciB0byBmaW5kIHRoZQorCSAqIGxhcmdlc3QgcG9zc2libGUgYml0IG1hc2ssIGEgc3dhcCBlbnRyeSB3aXRoIHN3YXAgdHlwZSAwCiAJICogYW5kIHN3YXAgb2Zmc2V0IH4wVUwgaXMgY3JlYXRlZCwgZW5jb2RlZCB0byBhIHN3YXAgcHRlLAotCSAqIGRlY29kZWQgdG8gYSBzd3BfZW50cnlfdCBhZ2FpbiBhbmQgZmluYWxseSB0aGUgc3dhcAorCSAqIGRlY29kZWQgdG8gYSBzd3BfZW50cnlfdCBhZ2FpbiwgYW5kIGZpbmFsbHkgdGhlIHN3YXAKIAkgKiBvZmZzZXQgaXMgZXh0cmFjdGVkLiBUaGlzIHdpbGwgbWFzayBhbGwgdGhlIGJpdHMgZnJvbQogCSAqIHRoZSBpbml0aWFsIH4wVUwgbWFzayB0aGF0IGNhbid0IGJlIGVuY29kZWQgaW4gZWl0aGVyCiAJICogdGhlIHN3cF9lbnRyeV90IG9yIHRoZSBhcmNoaXRlY3R1cmUgZGVmaW5pdGlvbiBvZiBhCi0JICogc3dhcCBwdGUuCisJICogc3dhcCBwdGUuICBUaGVuIHRoZSBzYW1lIGlzIGRvbmUgZm9yIGEgcmFkaXhfdHJlZSBlbnRyeS4KIAkgKi8KIAltYXhwYWdlcyA9IHN3cF9vZmZzZXQocHRlX3RvX3N3cF9lbnRyeSgKLQkJCXN3cF9lbnRyeV90b19wdGUoc3dwX2VudHJ5KDAsIH4wVUwpKSkpICsgMTsKKwkJCXN3cF9lbnRyeV90b19wdGUoc3dwX2VudHJ5KDAsIH4wVUwpKSkpOworCW1heHBhZ2VzID0gc3dwX29mZnNldChyYWRpeF90b19zd3BfZW50cnkoCisJCQlzd3BfdG9fcmFkaXhfZW50cnkoc3dwX2VudHJ5KDAsIG1heHBhZ2VzKSkpKSArIDE7CisKIAlpZiAobWF4cGFnZXMgPiBzd2FwX2hlYWRlci0+aW5mby5sYXN0X3BhZ2UpIHsKIAkJbWF4cGFnZXMgPSBzd2FwX2hlYWRlci0+aW5mby5sYXN0X3BhZ2UgKyAxOwogCQkvKiBwLT5tYXggaXMgYW4gdW5zaWduZWQgaW50OiBkb24ndCBvdmVyZmxvdyBpdCAqLwpkaWZmIC0tZ2l0IGEvbW0vdHJ1bmNhdGUuYyBiL21tL3RydW5jYXRlLmMKaW5kZXggMjMyZWIyNy4uYjQwYWM2ZCAxMDA2NDQKLS0tIGEvbW0vdHJ1bmNhdGUuYworKysgYi9tbS90cnVuY2F0ZS5jCkBAIC0zMzYsNiArMzM2LDE0IEBACiAJdW5zaWduZWQgbG9uZyBjb3VudCA9IDA7CiAJaW50IGk7CiAKKwkvKgorCSAqIE5vdGU6IHRoaXMgZnVuY3Rpb24gbWF5IGdldCBjYWxsZWQgb24gYSBzaG1lbS90bXBmcyBtYXBwaW5nOgorCSAqIHBhZ2V2ZWNfbG9va3VwKCkgbWlnaHQgdGhlbiByZXR1cm4gMCBwcmVtYXR1cmVseSAoYmVjYXVzZSBpdAorCSAqIGdvdCBhIGdhbmdmdWwgb2Ygc3dhcCBlbnRyaWVzKTsgYnV0IGl0J3MgaGFyZGx5IHdvcnRoIHdvcnJ5aW5nCisJICogYWJvdXQgLSBpdCBjYW4gcmFyZWx5IGhhdmUgYW55dGhpbmcgdG8gZnJlZSBmcm9tIHN1Y2ggYSBtYXBwaW5nCisJICogKG1vc3QgcGFnZXMgYXJlIGRpcnR5KSwgYW5kIGFscmVhZHkgc2tpcHMgb3ZlciBhbnkgZGlmZmljdWx0aWVzLgorCSAqLworCiAJcGFnZXZlY19pbml0KCZwdmVjLCAwKTsKIAl3aGlsZSAoaW5kZXggPD0gZW5kICYmIHBhZ2V2ZWNfbG9va3VwKCZwdmVjLCBtYXBwaW5nLCBpbmRleCwKIAkJCW1pbihlbmQgLSBpbmRleCwgKHBnb2ZmX3QpUEFHRVZFQ19TSVpFIC0gMSkgKyAxKSkgewpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL01ha2VmaWxlIGIvc2NyaXB0cy9rY29uZmlnL01ha2VmaWxlCmluZGV4IDBiNDI3NmMuLjgyZDJlYjIgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9NYWtlZmlsZQorKysgYi9zY3JpcHRzL2tjb25maWcvTWFrZWZpbGUKQEAgLTE3MCw4ICsxNzAsOCBAQAogbmNvbmYtb2JqcyAgICAgOj0gbmNvbmYubyB6Y29uZi50YWIubyBuY29uZi5ndWkubwoga3hnZXR0ZXh0LW9ianMJOj0ga3hnZXR0ZXh0Lm8gemNvbmYudGFiLm8KIHFjb25mLWN4eG9ianMJOj0gcWNvbmYubwotcWNvbmYtb2Jqcwk6PSBrY29uZmlnX2xvYWQubyB6Y29uZi50YWIubwotZ2NvbmYtb2Jqcwk6PSBnY29uZi5vIGtjb25maWdfbG9hZC5vIHpjb25mLnRhYi5vCitxY29uZi1vYmpzCTo9IHpjb25mLnRhYi5vCitnY29uZi1vYmpzCTo9IGdjb25mLm8gemNvbmYudGFiLm8KIAogaG9zdHByb2dzLXkgOj0gY29uZgogCkBAIC0yMDMsNyArMjAzLDcgQEAKIAlob3N0cHJvZ3MteSArPSBnY29uZgogZW5kaWYKIAotY2xlYW4tZmlsZXMJOj0gbGtjX2RlZnMuaCBxY29uZi5tb2MgLnRtcF9xdGNoZWNrIC50bXBfZ3RrY2hlY2sKK2NsZWFuLWZpbGVzCTo9IHFjb25mLm1vYyAudG1wX3F0Y2hlY2sgLnRtcF9ndGtjaGVjawogY2xlYW4tZmlsZXMJKz0gemNvbmYudGFiLmMgemNvbmYubGV4LmMgemNvbmYuaGFzaC5jIGdjb25mLmdsYWRlLmgKIGNsZWFuLWZpbGVzICAgICArPSBtY29uZiBxY29uZiBnY29uZiBuY29uZgogY2xlYW4tZmlsZXMgICAgICs9IGNvbmZpZy5wb3QgbGludXgucG90CkBAIC0yMjYsMTIgKzIyNiwxMiBAQAogTEVYX1BSRUZJWF96Y29uZgk6PSB6Y29uZgogWUFDQ19QUkVGSVhfemNvbmYJOj0gemNvbmYKIAotSE9TVExPQURMSUJFU19xY29uZgk9ICQoS0NfUVRfTElCUykgLWxkbAotSE9TVENYWEZMQUdTX3Fjb25mLm8JPSAkKEtDX1FUX0NGTEFHUykgLUQgTEtDX0RJUkVDVF9MSU5LCitIT1NUTE9BRExJQkVTX3Fjb25mCT0gJChLQ19RVF9MSUJTKQorSE9TVENYWEZMQUdTX3Fjb25mLm8JPSAkKEtDX1FUX0NGTEFHUykKIAotSE9TVExPQURMSUJFU19nY29uZgk9IGBwa2ctY29uZmlnIC0tbGlicyBndGsrLTIuMCBnbW9kdWxlLTIuMCBsaWJnbGFkZS0yLjBgIC1sZGwKK0hPU1RMT0FETElCRVNfZ2NvbmYJPSBgcGtnLWNvbmZpZyAtLWxpYnMgZ3RrKy0yLjAgZ21vZHVsZS0yLjAgbGliZ2xhZGUtMi4wYAogSE9TVENGTEFHU19nY29uZi5vCT0gYHBrZy1jb25maWcgLS1jZmxhZ3MgZ3RrKy0yLjAgZ21vZHVsZS0yLjAgbGliZ2xhZGUtMi4wYCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC1EIExLQ19ESVJFQ1RfTElOSworICAgICAgICAgICAgICAgICAgICAgICAgICAtV25vLW1pc3NpbmctcHJvdG90eXBlcwogCiBIT1NUTE9BRExJQkVTX21jb25mICAgPSAkKHNoZWxsICQoQ09ORklHX1NIRUxMKSAkKGNoZWNrLWx4ZGlhbG9nKSAtbGRmbGFncyAkKEhPU1RDQykpCiAKQEAgLTMyMSwxOCArMzIxLDExIEBACiAKICQob2JqKS96Y29uZi50YWIubzogJChvYmopL3pjb25mLmxleC5jICQob2JqKS96Y29uZi5oYXNoLmMKIAotJChvYmopL2tjb25maWdfbG9hZC5vOiAkKG9iaikvbGtjX2RlZnMuaAotCi0kKG9iaikvcWNvbmYubzogJChvYmopL3Fjb25mLm1vYyAkKG9iaikvbGtjX2RlZnMuaAotCi0kKG9iaikvZ2NvbmYubzogJChvYmopL2xrY19kZWZzLmgKKyQob2JqKS9xY29uZi5vOiAkKG9iaikvcWNvbmYubW9jCiAKICQob2JqKS8lLm1vYzogJChzcmMpLyUuaAogCSQoS0NfUVRfTU9DKSAtaSAkPCAtbyAkQAogCi0kKG9iaikvbGtjX2RlZnMuaDogJChzcmMpL2xrY19wcm90by5oCi0JJChRKXNlZCA8ICQ8ID4gJEAgJ3MvUChcKFteLF0qXCksLiovI2RlZmluZSBcMSAoXCpcMV9wKS8nCi0KICMgRXh0cmFjdCBnY29uZiBtZW51IGl0ZW1zIGZvciBJMThOIHN1cHBvcnQKICQob2JqKS9nY29uZi5nbGFkZS5oOiAkKG9iaikvZ2NvbmYuZ2xhZGUKIAkkKFEpaW50bHRvb2wtZXh0cmFjdCAtLXR5cGU9Z2V0dGV4dC9nbGFkZSAtLXNyY2Rpcj0kKHNyY3RyZWUpIFwKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9jb25mLmMgYi9zY3JpcHRzL2tjb25maWcvY29uZi5jCmluZGV4IDAwNmFkODEuLmYyMDhmOTAgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9jb25mLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL2NvbmYuYwpAQCAtMTQsMTEgKzE0LDExIEBACiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgogCi0jZGVmaW5lIExLQ19ESVJFQ1RfTElOSwogI2luY2x1ZGUgImxrYy5oIgogCiBzdGF0aWMgdm9pZCBjb25mKHN0cnVjdCBtZW51ICptZW51KTsKIHN0YXRpYyB2b2lkIGNoZWNrX2NvbmYoc3RydWN0IG1lbnUgKm1lbnUpOworc3RhdGljIHZvaWQgeGZnZXRzKGNoYXIgKnN0ciwgaW50IHNpemUsIEZJTEUgKmluKTsKIAogZW51bSBpbnB1dF9tb2RlIHsKIAlvbGRhc2tjb25maWcsCkBAIC0zNSw4ICszNSw2IEBACiAJb2xkbm9jb25maWcsCiB9IGlucHV0X21vZGUgPSBvbGRhc2tjb25maWc7CiAKLWNoYXIgKmRlZmNvbmZpZ19maWxlOwotCiBzdGF0aWMgaW50IGluZGVudCA9IDE7CiBzdGF0aWMgaW50IHZhbGlkX3N0ZGluID0gMTsKIHN0YXRpYyBpbnQgc3luY19rY29uZmlnOwpAQCAtMTA2LDYgKzEwNCw3IEBACiAJCQlyZXR1cm4gMDsKIAkJfQogCQljaGVja19zdGRpbigpOworCQkvKiBmYWxsIHRocm91Z2ggKi8KIAljYXNlIG9sZGFza2NvbmZpZzoKIAkJZmZsdXNoKHN0ZG91dCk7CiAJCXhmZ2V0cyhsaW5lLCAxMjgsIHN0ZGluKTsKQEAgLTE1MCw2ICsxNDksNyBAQAogCQkJCWRlZiA9IE5VTEw7CiAJCQkJYnJlYWs7CiAJCQl9CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KIAkJZGVmYXVsdDoKIAkJCWxpbmVbc3RybGVuKGxpbmUpLTFdID0gMDsKIAkJCWRlZiA9IGxpbmU7CkBAIC0zMDQsNiArMzA0LDcgQEAKIAkJCQlicmVhazsKIAkJCX0KIAkJCWNoZWNrX3N0ZGluKCk7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KIAkJY2FzZSBvbGRhc2tjb25maWc6CiAJCQlmZmx1c2goc3Rkb3V0KTsKIAkJCXhmZ2V0cyhsaW5lLCAxMjgsIHN0ZGluKTsKQEAgLTM2OSw2ICszNzAsNyBAQAogCQkJCWNoZWNrX2NvbmYobWVudSk7CiAJCQkJcmV0dXJuOwogCQkJfQorCQkJLyogZmFsbCB0aHJvdWdoICovCiAJCWNhc2UgUF9DT01NRU5UOgogCQkJcHJvbXB0ID0gbWVudV9nZXRfcHJvbXB0KG1lbnUpOwogCQkJaWYgKHByb21wdCkKQEAgLTQ1NiwxMCArNDU4LDMwIEBACiAJe05VTEwsIDAsIE5VTEwsIDB9CiB9OwogCitzdGF0aWMgdm9pZCBjb25mX3VzYWdlKGNvbnN0IGNoYXIgKnByb2duYW1lKQoreworCisJcHJpbnRmKCJVc2FnZTogJXMgW29wdGlvbl0gPGtjb25maWctZmlsZT5cbiIsIHByb2duYW1lKTsKKwlwcmludGYoIltvcHRpb25dIGlzIF9vbmVfIG9mIHRoZSBmb2xsb3dpbmc6XG4iKTsKKwlwcmludGYoIiAgLS1saXN0bmV3Y29uZmlnICAgICAgICAgTGlzdCBuZXcgb3B0aW9uc1xuIik7CisJcHJpbnRmKCIgIC0tb2xkYXNrY29uZmlnICAgICAgICAgIFN0YXJ0IGEgbmV3IGNvbmZpZ3VyYXRpb24gdXNpbmcgYSBsaW5lLW9yaWVudGVkIHByb2dyYW1cbiIpOworCXByaW50ZigiICAtLW9sZGNvbmZpZyAgICAgICAgICAgICBVcGRhdGUgYSBjb25maWd1cmF0aW9uIHVzaW5nIGEgcHJvdmlkZWQgLmNvbmZpZyBhcyBiYXNlXG4iKTsKKwlwcmludGYoIiAgLS1zaWxlbnRvbGRjb25maWcgICAgICAgU2FtZSBhcyBvbGRjb25maWcsIGJ1dCBxdWlldGx5LCBhZGRpdGlvbmFsbHkgdXBkYXRlIGRlcHNcbiIpOworCXByaW50ZigiICAtLW9sZG5vY29uZmlnICAgICAgICAgICBTYW1lIGFzIHNpbGVudG9sZGNvbmZpZyBidXQgc2V0IG5ldyBzeW1ib2xzIHRvIG5vXG4iKTsKKwlwcmludGYoIiAgLS1kZWZjb25maWcgPGZpbGU+ICAgICAgTmV3IGNvbmZpZyB3aXRoIGRlZmF1bHQgZGVmaW5lZCBpbiA8ZmlsZT5cbiIpOworCXByaW50ZigiICAtLXNhdmVkZWZjb25maWcgPGZpbGU+ICBTYXZlIHRoZSBtaW5pbWFsIGN1cnJlbnQgY29uZmlndXJhdGlvbiB0byA8ZmlsZT5cbiIpOworCXByaW50ZigiICAtLWFsbG5vY29uZmlnICAgICAgICAgICBOZXcgY29uZmlnIHdoZXJlIGFsbCBvcHRpb25zIGFyZSBhbnN3ZXJlZCB3aXRoIG5vXG4iKTsKKwlwcmludGYoIiAgLS1hbGx5ZXNjb25maWcgICAgICAgICAgTmV3IGNvbmZpZyB3aGVyZSBhbGwgb3B0aW9ucyBhcmUgYW5zd2VyZWQgd2l0aCB5ZXNcbiIpOworCXByaW50ZigiICAtLWFsbG1vZGNvbmZpZyAgICAgICAgICBOZXcgY29uZmlnIHdoZXJlIGFsbCBvcHRpb25zIGFyZSBhbnN3ZXJlZCB3aXRoIG1vZFxuIik7CisJcHJpbnRmKCIgIC0tYWxsZGVmY29uZmlnICAgICAgICAgIE5ldyBjb25maWcgd2l0aCBhbGwgc3ltYm9scyBzZXQgdG8gZGVmYXVsdFxuIik7CisJcHJpbnRmKCIgIC0tcmFuZGNvbmZpZyAgICAgICAgICAgIE5ldyBjb25maWcgd2l0aCByYW5kb20gYW5zd2VyIHRvIGFsbCBvcHRpb25zXG4iKTsKK30KKwogaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpCiB7CisJY29uc3QgY2hhciAqcHJvZ25hbWUgPSBhdlswXTsKIAlpbnQgb3B0OwotCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqbmFtZSwgKmRlZmNvbmZpZ19maWxlID0gTlVMTCAvKiBnY2MgdW5pbml0ICovOwogCXN0cnVjdCBzdGF0IHRtcHN0YXQ7CiAKIAlzZXRsb2NhbGUoTENfQUxMLCAiIik7CkBAIC00OTEsMTQgKzUxMywyNCBAQAogCQkJc3JhbmQoc2VlZCk7CiAJCQlicmVhazsKIAkJfQorCQljYXNlIG9sZGFza2NvbmZpZzoKKwkJY2FzZSBvbGRjb25maWc6CisJCWNhc2UgYWxsbm9jb25maWc6CisJCWNhc2UgYWxseWVzY29uZmlnOgorCQljYXNlIGFsbG1vZGNvbmZpZzoKKwkJY2FzZSBhbGxkZWZjb25maWc6CisJCWNhc2UgbGlzdG5ld2NvbmZpZzoKKwkJY2FzZSBvbGRub2NvbmZpZzoKKwkJCWJyZWFrOwogCQljYXNlICc/JzoKLQkJCWZwcmludGYoc3RkZXJyLCBfKCJTZWUgUkVBRE1FIGZvciB1c2FnZSBpbmZvXG4iKSk7CisJCQljb25mX3VzYWdlKHByb2duYW1lKTsKIAkJCWV4aXQoMSk7CiAJCQlicmVhazsKIAkJfQogCX0KIAlpZiAoYWMgPT0gb3B0aW5kKSB7CiAJCXByaW50ZihfKCIlczogS2NvbmZpZyBmaWxlIG1pc3NpbmdcbiIpLCBhdlswXSk7CisJCWNvbmZfdXNhZ2UocHJvZ25hbWUpOwogCQlleGl0KDEpOwogCX0KIAluYW1lID0gYXZbb3B0aW5kXTsKQEAgLTY0MSwxMyArNjczLDExIEBACiAJfQogCXJldHVybiAwOwogfQorCiAvKgogICogSGVscGVyIGZ1bmN0aW9uIHRvIGZhY2lsaXRhdGUgZmdldHMoKSBieSBKZWFuIFNhY3Jlbi4KICAqLwotdm9pZCB4ZmdldHMoc3RyLCBzaXplLCBpbikKLQljaGFyICpzdHI7Ci0JaW50IHNpemU7Ci0JRklMRSAqaW47Cit2b2lkIHhmZ2V0cyhjaGFyICpzdHIsIGludCBzaXplLCBGSUxFICppbikKIHsKIAlpZiAoZmdldHMoc3RyLCBzaXplLCBpbikgPT0gTlVMTCkKIAkJZnByaW50ZihzdGRlcnIsICJcbkVycm9yIGluIHJlYWRpbmcgb3IgZW5kIG9mIGZpbGUuXG4iKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jIGIvc2NyaXB0cy9rY29uZmlnL2NvbmZkYXRhLmMKaW5kZXggMmJhZmQ5YS4uNTliNjY3YyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2NvbmZkYXRhLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL2NvbmZkYXRhLmMKQEAgLTcsMTMgKzcsMTMgQEAKICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2RlZmluZSBMS0NfRElSRUNUX0xJTksKICNpbmNsdWRlICJsa2MuaCIKIAogc3RhdGljIHZvaWQgY29uZl93YXJuaW5nKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQpAQCAtMTI4LDYgKzEyOCw3IEBACiAJCQlzeW0tPmZsYWdzIHw9IGRlZl9mbGFnczsKIAkJCWJyZWFrOwogCQl9CisJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgU19CT09MRUFOOgogCQlpZiAocFswXSA9PSAneScpIHsKIAkJCXN5bS0+ZGVmW2RlZl0udHJpID0geWVzOwpAQCAtMTQwLDcgKzE0MSw3IEBACiAJCQlicmVhazsKIAkJfQogCQljb25mX3dhcm5pbmcoInN5bWJvbCB2YWx1ZSAnJXMnIGludmFsaWQgZm9yICVzIiwgcCwgc3ltLT5uYW1lKTsKLQkJYnJlYWs7CisJCXJldHVybiAxOwogCWNhc2UgU19PVEhFUjoKIAkJaWYgKCpwICE9ICciJykgewogCQkJZm9yIChwMiA9IHA7ICpwMiAmJiAhaXNzcGFjZSgqcDIpOyBwMisrKQpAQCAtMTQ4LDYgKzE0OSw3IEBACiAJCQlzeW0tPnR5cGUgPSBTX1NUUklORzsKIAkJCWdvdG8gZG9uZTsKIAkJfQorCQkvKiBmYWxsIHRocm91Z2ggKi8KIAljYXNlIFNfU1RSSU5HOgogCQlpZiAoKnArKyAhPSAnIicpCiAJCQlicmVhazsKQEAgLTE2Miw2ICsxNjQsNyBAQAogCQkJY29uZl93YXJuaW5nKCJpbnZhbGlkIHN0cmluZyBmb3VuZCIpOwogCQkJcmV0dXJuIDE7CiAJCX0KKwkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBTX0lOVDoKIAljYXNlIFNfSEVYOgogCWRvbmU6CkBAIC0yMzcsNiArMjQwLDcgQEAKIAkJY2FzZSBTX1NUUklORzoKIAkJCWlmIChzeW0tPmRlZltkZWZdLnZhbCkKIAkJCQlmcmVlKHN5bS0+ZGVmW2RlZl0udmFsKTsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLwogCQlkZWZhdWx0OgogCQkJc3ltLT5kZWZbZGVmXS52YWwgPSBOVUxMOwogCQkJc3ltLT5kZWZbZGVmXS50cmkgPSBubzsKQEAgLTM2Myw2ICszNjcsNyBAQAogCQkJCQlicmVhazsKIAkJCQlpZiAoIXN5bV9pc19jaG9pY2Uoc3ltKSkKIAkJCQkJZ290byBzeW1fb2s7CisJCQkJLyogZmFsbCB0aHJvdWdoICovCiAJCQlkZWZhdWx0OgogCQkJCWlmICghc3RyY21wKHN5bS0+Y3Vyci52YWwsIHN5bS0+ZGVmW1NfREVGX1VTRVJdLnZhbCkpCiAJCQkJCWdvdG8gc3ltX29rOwpAQCAtNDE3LDY0ICs0MjIsMjAyIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qIFdyaXRlIGEgU19TVFJJTkcgKi8KLXN0YXRpYyB2b2lkIGNvbmZfd3JpdGVfc3RyaW5nKGJvb2wgaGVhZGVyZmlsZSwgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0ciwgRklMRSAqb3V0KQorLyoKKyAqIEtjb25maWcgY29uZmlndXJhdGlvbiBwcmludGVyCisgKgorICogVGhpcyBwcmludGVyIGlzIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHRoZSByZXN1bHRpbmcgY29uZmlndXJhdGlvbiBhZnRlcgorICoga2NvbmZpZyBpbnZvY2F0aW9uIGFuZCBgZGVmY29uZmlnJyBmaWxlcy4gVW5zZXQgc3ltYm9sIG1pZ2h0IGJlIG9taXR0ZWQgYnkKKyAqIHBhc3NpbmcgYSBub24tTlVMTCBhcmd1bWVudCB0byB0aGUgcHJpbnRlci4KKyAqCisgKi8KK3N0YXRpYyB2b2lkCitrY29uZmlnX3ByaW50X3N5bWJvbChGSUxFICpmcCwgc3RydWN0IHN5bWJvbCAqc3ltLCBjb25zdCBjaGFyICp2YWx1ZSwgdm9pZCAqYXJnKQogewotCWludCBsOwotCWlmIChoZWFkZXJmaWxlKQotCQlmcHJpbnRmKG91dCwgIiNkZWZpbmUgJXMlcyBcIiIsIENPTkZJR18sIG5hbWUpOwotCWVsc2UKLQkJZnByaW50ZihvdXQsICIlcyVzPVwiIiwgQ09ORklHXywgbmFtZSk7Ci0KLQl3aGlsZSAoMSkgewotCQlsID0gc3RyY3NwbihzdHIsICJcIlxcIik7Ci0JCWlmIChsKSB7Ci0JCQl4ZndyaXRlKHN0ciwgbCwgMSwgb3V0KTsKLQkJCXN0ciArPSBsOwotCQl9Ci0JCWlmICghKnN0cikKLQkJCWJyZWFrOwotCQlmcHJpbnRmKG91dCwgIlxcJWMiLCAqc3RyKyspOwotCX0KLQlmcHV0cygiXCJcbiIsIG91dCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvbmZfd3JpdGVfc3ltYm9sKHN0cnVjdCBzeW1ib2wgKnN5bSwgRklMRSAqb3V0LCBib29sIHdyaXRlX25vKQotewotCWNvbnN0IGNoYXIgKnN0cjsKIAogCXN3aXRjaCAoc3ltLT50eXBlKSB7CiAJY2FzZSBTX0JPT0xFQU46CiAJY2FzZSBTX1RSSVNUQVRFOgotCQlzd2l0Y2ggKHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKSkgewotCQljYXNlIG5vOgotCQkJaWYgKHdyaXRlX25vKQotCQkJCWZwcmludGYob3V0LCAiIyAlcyVzIGlzIG5vdCBzZXRcbiIsCisJCWlmICgqdmFsdWUgPT0gJ24nKSB7CisJCQlib29sIHNraXBfdW5zZXQgPSAoYXJnICE9IE5VTEwpOworCisJCQlpZiAoIXNraXBfdW5zZXQpCisJCQkJZnByaW50ZihmcCwgIiMgJXMlcyBpcyBub3Qgc2V0XG4iLAogCQkJCSAgICBDT05GSUdfLCBzeW0tPm5hbWUpOwotCQkJYnJlYWs7Ci0JCWNhc2UgbW9kOgotCQkJZnByaW50ZihvdXQsICIlcyVzPW1cbiIsIENPTkZJR18sIHN5bS0+bmFtZSk7Ci0JCQlicmVhazsKLQkJY2FzZSB5ZXM6Ci0JCQlmcHJpbnRmKG91dCwgIiVzJXM9eVxuIiwgQ09ORklHXywgc3ltLT5uYW1lKTsKLQkJCWJyZWFrOworCQkJcmV0dXJuOwogCQl9CiAJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWZwcmludGYoZnAsICIlcyVzPSVzXG4iLCBDT05GSUdfLCBzeW0tPm5hbWUsIHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQKK2tjb25maWdfcHJpbnRfY29tbWVudChGSUxFICpmcCwgY29uc3QgY2hhciAqdmFsdWUsIHZvaWQgKmFyZykKK3sKKwljb25zdCBjaGFyICpwID0gdmFsdWU7CisJc2l6ZV90IGw7CisKKwlmb3IgKDs7KSB7CisJCWwgPSBzdHJjc3BuKHAsICJcbiIpOworCQlmcHJpbnRmKGZwLCAiIyIpOworCQlpZiAobCkgeworCQkJZnByaW50ZihmcCwgIiAiKTsKKwkJCWZ3cml0ZShwLCBsLCAxLCBmcCk7CisJCQlwICs9IGw7CisJCX0KKwkJZnByaW50ZihmcCwgIlxuIik7CisJCWlmICgqcCsrID09ICdcMCcpCisJCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29uZl9wcmludGVyIGtjb25maWdfcHJpbnRlcl9jYiA9Cit7CisJLnByaW50X3N5bWJvbCA9IGtjb25maWdfcHJpbnRfc3ltYm9sLAorCS5wcmludF9jb21tZW50ID0ga2NvbmZpZ19wcmludF9jb21tZW50LAorfTsKKworLyoKKyAqIEhlYWRlciBwcmludGVyCisgKgorICogVGhpcyBwcmludGVyIGlzIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHRoZSBgaW5jbHVkZS9nZW5lcmF0ZWQvYXV0b2NvbmYuaCcgZmlsZS4KKyAqLworc3RhdGljIHZvaWQKK2hlYWRlcl9wcmludF9zeW1ib2woRklMRSAqZnAsIHN0cnVjdCBzeW1ib2wgKnN5bSwgY29uc3QgY2hhciAqdmFsdWUsIHZvaWQgKmFyZykKK3sKKworCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJY2FzZSBTX0JPT0xFQU46CisJY2FzZSBTX1RSSVNUQVRFOiB7CisJCWNvbnN0IGNoYXIgKnN1ZmZpeCA9ICIiOworCisJCXN3aXRjaCAoKnZhbHVlKSB7CisJCWNhc2UgJ24nOgorCQkJYnJlYWs7CisJCWNhc2UgJ20nOgorCQkJc3VmZml4ID0gIl9NT0RVTEUiOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKGZwLCAiI2RlZmluZSAlcyVzJXMgMVxuIiwKKwkJCSAgICBDT05GSUdfLCBzeW0tPm5hbWUsIHN1ZmZpeCk7CisJCX0KKwkJLyoKKwkJICogR2VuZXJhdGUgdGhlIF9fZW5hYmxlZF9DT05GSUdfKiBhbmQKKwkJICogX19lbmFibGVkX0NPTkZJR18qX01PRFVMRSBtYWNyb3MgZm9yIHVzZSBieSB0aGUKKwkJICogSVNfe0VOQUJMRUQsQlVJTFRJTixNT0RVTEV9IG1hY3Jvcy4gVGhlIF9NT0RVTEUgdmFyaWFudCBpcworCQkgKiBnZW5lcmF0ZWQgZXZlbiBmb3IgYm9vbGVhbnMgc28gdGhhdCB0aGUgSVNfRU5BQkxFRCgpIG1hY3JvCisJCSAqIHdvcmtzLgorCQkgKi8KKwkJZnByaW50ZihmcCwgIiNkZWZpbmUgX19lbmFibGVkXyIgQ09ORklHXyAiJXMgJWRcbiIsCisJCQkJc3ltLT5uYW1lLCAoKnZhbHVlID09ICd5JykpOworCQlmcHJpbnRmKGZwLCAiI2RlZmluZSBfX2VuYWJsZWRfIiBDT05GSUdfICIlc19NT0RVTEUgJWRcbiIsCisJCQkJc3ltLT5uYW1lLCAoKnZhbHVlID09ICdtJykpOworCQlicmVhazsKKwl9CisJY2FzZSBTX0hFWDogeworCQljb25zdCBjaGFyICpwcmVmaXggPSAiIjsKKworCQlpZiAodmFsdWVbMF0gIT0gJzAnIHx8ICh2YWx1ZVsxXSAhPSAneCcgJiYgdmFsdWVbMV0gIT0gJ1gnKSkKKwkJCXByZWZpeCA9ICIweCI7CisJCWZwcmludGYoZnAsICIjZGVmaW5lICVzJXMgJXMlc1xuIiwKKwkJICAgIENPTkZJR18sIHN5bS0+bmFtZSwgcHJlZml4LCB2YWx1ZSk7CisJCWJyZWFrOworCX0KIAljYXNlIFNfU1RSSU5HOgotCQljb25mX3dyaXRlX3N0cmluZyhmYWxzZSwgc3ltLT5uYW1lLCBzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pLCBvdXQpOwotCQlicmVhazsKLQljYXNlIFNfSEVYOgogCWNhc2UgU19JTlQ6Ci0JCXN0ciA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSk7Ci0JCWZwcmludGYob3V0LCAiJXMlcz0lc1xuIiwgQ09ORklHXywgc3ltLT5uYW1lLCBzdHIpOworCQlmcHJpbnRmKGZwLCAiI2RlZmluZSAlcyVzICVzXG4iLAorCQkgICAgQ09ORklHXywgc3ltLT5uYW1lLCB2YWx1ZSk7CiAJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworfQorCitzdGF0aWMgdm9pZAoraGVhZGVyX3ByaW50X2NvbW1lbnQoRklMRSAqZnAsIGNvbnN0IGNoYXIgKnZhbHVlLCB2b2lkICphcmcpCit7CisJY29uc3QgY2hhciAqcCA9IHZhbHVlOworCXNpemVfdCBsOworCisJZnByaW50ZihmcCwgIi8qXG4iKTsKKwlmb3IgKDs7KSB7CisJCWwgPSBzdHJjc3BuKHAsICJcbiIpOworCQlmcHJpbnRmKGZwLCAiICoiKTsKKwkJaWYgKGwpIHsKKwkJCWZwcmludGYoZnAsICIgIik7CisJCQlmd3JpdGUocCwgbCwgMSwgZnApOworCQkJcCArPSBsOworCQl9CisJCWZwcmludGYoZnAsICJcbiIpOworCQlpZiAoKnArKyA9PSAnXDAnKQorCQkJYnJlYWs7CisJfQorCWZwcmludGYoZnAsICIgKi9cbiIpOworfQorCitzdGF0aWMgc3RydWN0IGNvbmZfcHJpbnRlciBoZWFkZXJfcHJpbnRlcl9jYiA9Cit7CisJLnByaW50X3N5bWJvbCA9IGhlYWRlcl9wcmludF9zeW1ib2wsCisJLnByaW50X2NvbW1lbnQgPSBoZWFkZXJfcHJpbnRfY29tbWVudCwKK307CisKKy8qCisgKiBUcmlzdGF0ZSBwcmludGVyCisgKgorICogVGhpcyBwcmludGVyIGlzIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHRoZSBgaW5jbHVkZS9jb25maWcvdHJpc3RhdGUuY29uZicgZmlsZS4KKyAqLworc3RhdGljIHZvaWQKK3RyaXN0YXRlX3ByaW50X3N5bWJvbChGSUxFICpmcCwgc3RydWN0IHN5bWJvbCAqc3ltLCBjb25zdCBjaGFyICp2YWx1ZSwgdm9pZCAqYXJnKQoreworCisJaWYgKHN5bS0+dHlwZSA9PSBTX1RSSVNUQVRFICYmICp2YWx1ZSAhPSAnbicpCisJCWZwcmludGYoZnAsICIlcyVzPSVjXG4iLCBDT05GSUdfLCBzeW0tPm5hbWUsIChjaGFyKXRvdXBwZXIoKnZhbHVlKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY29uZl9wcmludGVyIHRyaXN0YXRlX3ByaW50ZXJfY2IgPQoreworCS5wcmludF9zeW1ib2wgPSB0cmlzdGF0ZV9wcmludF9zeW1ib2wsCisJLnByaW50X2NvbW1lbnQgPSBrY29uZmlnX3ByaW50X2NvbW1lbnQsCit9OworCitzdGF0aWMgdm9pZCBjb25mX3dyaXRlX3N5bWJvbChGSUxFICpmcCwgc3RydWN0IHN5bWJvbCAqc3ltLAorCQkJICAgICAgc3RydWN0IGNvbmZfcHJpbnRlciAqcHJpbnRlciwgdm9pZCAqcHJpbnRlcl9hcmcpCit7CisJY29uc3QgY2hhciAqc3RyOworCisJc3dpdGNoIChzeW0tPnR5cGUpIHsKIAljYXNlIFNfT1RIRVI6CiAJY2FzZSBTX1VOS05PV046CiAJCWJyZWFrOworCWNhc2UgU19TVFJJTkc6CisJCXN0ciA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSk7CisJCXN0ciA9IHN5bV9lc2NhcGVfc3RyaW5nX3ZhbHVlKHN0cik7CisJCXByaW50ZXItPnByaW50X3N5bWJvbChmcCwgc3ltLCBzdHIsIHByaW50ZXJfYXJnKTsKKwkJZnJlZSgodm9pZCAqKXN0cik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXN0ciA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSk7CisJCXByaW50ZXItPnByaW50X3N5bWJvbChmcCwgc3ltLCBzdHIsIHByaW50ZXJfYXJnKTsKIAl9CiB9CiAKK3N0YXRpYyB2b2lkCitjb25mX3dyaXRlX2hlYWRpbmcoRklMRSAqZnAsIHN0cnVjdCBjb25mX3ByaW50ZXIgKnByaW50ZXIsIHZvaWQgKnByaW50ZXJfYXJnKQoreworCWNoYXIgYnVmWzI1Nl07CisKKwlzbnByaW50ZihidWYsIHNpemVvZihidWYpLAorCSAgICAiXG4iCisJICAgICJBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaWxlOyBETyBOT1QgRURJVC5cbiIKKwkgICAgIiVzXG4iLAorCSAgICByb290bWVudS5wcm9tcHQtPnRleHQpOworCisJcHJpbnRlci0+cHJpbnRfY29tbWVudChmcCwgYnVmLCBwcmludGVyX2FyZyk7Cit9CisKIC8qCiAgKiBXcml0ZSBvdXQgYSBtaW5pbWFsIGNvbmZpZy4KICAqIEFsbCB2YWx1ZXMgdGhhdCBoYXMgZGVmYXVsdCB2YWx1ZXMgYXJlIHNraXBwZWQgYXMgdGhpcyBpcyByZWR1bmRhbnQuCkBAIC01MzEsNyArNjc0LDcgQEAKIAkJCQkJCWdvdG8gbmV4dF9tZW51OwogCQkJCX0KIAkJCX0KLQkJCWNvbmZfd3JpdGVfc3ltYm9sKHN5bSwgb3V0LCB0cnVlKTsKKwkJCWNvbmZfd3JpdGVfc3ltYm9sKG91dCwgc3ltLCAma2NvbmZpZ19wcmludGVyX2NiLCBOVUxMKTsKIAkJfQogbmV4dF9tZW51OgogCQlpZiAobWVudS0+bGlzdCAhPSBOVUxMKSB7CkBAIC01OTYsMTEgKzczOSw3IEBACiAJaWYgKCFvdXQpCiAJCXJldHVybiAxOwogCi0JZnByaW50ZihvdXQsIF8oIiNcbiIKLQkJICAgICAgICIjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0XG4iCi0JCSAgICAgICAiIyAlc1xuIgotCQkgICAgICAgIiNcbiIpLAotCQkgICAgIHJvb3RtZW51LnByb21wdC0+dGV4dCk7CisJY29uZl93cml0ZV9oZWFkaW5nKG91dCwgJmtjb25maWdfcHJpbnRlcl9jYiwgTlVMTCk7CiAKIAlpZiAoIWNvbmZfZ2V0X2NoYW5nZWQoKSkKIAkJc3ltX2NsZWFyX2FsbF92YWxpZCgpOwpAQCAtNjIxLDggKzc2MCw4IEBACiAJCQlpZiAoIShzeW0tPmZsYWdzICYgU1lNQk9MX1dSSVRFKSkKIAkJCQlnb3RvIG5leHQ7CiAJCQlzeW0tPmZsYWdzICY9IH5TWU1CT0xfV1JJVEU7Ci0JCQkvKiBXcml0ZSBjb25maWcgc3ltYm9sIHRvIGZpbGUgKi8KLQkJCWNvbmZfd3JpdGVfc3ltYm9sKHN5bSwgb3V0LCB0cnVlKTsKKworCQkJY29uZl93cml0ZV9zeW1ib2wob3V0LCBzeW0sICZrY29uZmlnX3ByaW50ZXJfY2IsIE5VTEwpOwogCQl9CiAKIG5leHQ6CkBAIC03NzEsNyArOTEwLDYgQEAKIGludCBjb25mX3dyaXRlX2F1dG9jb25mKHZvaWQpCiB7CiAJc3RydWN0IHN5bWJvbCAqc3ltOwotCWNvbnN0IGNoYXIgKnN0cjsKIAljb25zdCBjaGFyICpuYW1lOwogCUZJTEUgKm91dCwgKnRyaXN0YXRlLCAqb3V0X2g7CiAJaW50IGk7CkBAIC04MDAsNjggKzkzOCwyMyBAQAogCQlyZXR1cm4gMTsKIAl9CiAKLQlmcHJpbnRmKG91dCwgIiNcbiIKLQkJICAgICAiIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdFxuIgotCQkgICAgICIjICVzXG4iCi0JCSAgICAgIiNcbiIsCi0JCSAgICAgcm9vdG1lbnUucHJvbXB0LT50ZXh0KTsKLQlmcHJpbnRmKHRyaXN0YXRlLCAiI1xuIgotCQkJICAiIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCAtIGRvIG5vdCBlZGl0XG4iCi0JCQkgICJcbiIpOwotCWZwcmludGYob3V0X2gsICIvKlxuIgotCQkgICAgICAgIiAqIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIEMgY29uZmlnOiBkb24ndCBlZGl0XG4iCi0JCSAgICAgICAiICogJXNcbiIKLQkJICAgICAgICIgKi9cbiIsCi0JCSAgICAgICByb290bWVudS5wcm9tcHQtPnRleHQpOworCWNvbmZfd3JpdGVfaGVhZGluZyhvdXQsICZrY29uZmlnX3ByaW50ZXJfY2IsIE5VTEwpOworCisJY29uZl93cml0ZV9oZWFkaW5nKHRyaXN0YXRlLCAmdHJpc3RhdGVfcHJpbnRlcl9jYiwgTlVMTCk7CisKKwljb25mX3dyaXRlX2hlYWRpbmcob3V0X2gsICZoZWFkZXJfcHJpbnRlcl9jYiwgTlVMTCk7CiAKIAlmb3JfYWxsX3N5bWJvbHMoaSwgc3ltKSB7CiAJCXN5bV9jYWxjX3ZhbHVlKHN5bSk7CiAJCWlmICghKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfV1JJVEUpIHx8ICFzeW0tPm5hbWUpCiAJCQljb250aW51ZTsKIAotCQkvKiB3cml0ZSBzeW1ib2wgdG8gY29uZmlnIGZpbGUgKi8KLQkJY29uZl93cml0ZV9zeW1ib2woc3ltLCBvdXQsIGZhbHNlKTsKKwkJLyogd3JpdGUgc3ltYm9sIHRvIGF1dG8uY29uZiwgdHJpc3RhdGUgYW5kIGhlYWRlciBmaWxlcyAqLworCQljb25mX3dyaXRlX3N5bWJvbChvdXQsIHN5bSwgJmtjb25maWdfcHJpbnRlcl9jYiwgKHZvaWQgKikxKTsKIAotCQkvKiB1cGRhdGUgYXV0b2NvbmYgYW5kIHRyaXN0YXRlIGZpbGVzICovCi0JCXN3aXRjaCAoc3ltLT50eXBlKSB7Ci0JCWNhc2UgU19CT09MRUFOOgotCQljYXNlIFNfVFJJU1RBVEU6Ci0JCQlzd2l0Y2ggKHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKSkgewotCQkJY2FzZSBubzoKLQkJCQlicmVhazsKLQkJCWNhc2UgbW9kOgotCQkJCWZwcmludGYodHJpc3RhdGUsICIlcyVzPU1cbiIsCi0JCQkJICAgIENPTkZJR18sIHN5bS0+bmFtZSk7Ci0JCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgJXMlc19NT0RVTEUgMVxuIiwKLQkJCQkgICAgQ09ORklHXywgc3ltLT5uYW1lKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgeWVzOgotCQkJCWlmIChzeW0tPnR5cGUgPT0gU19UUklTVEFURSkKLQkJCQkJZnByaW50Zih0cmlzdGF0ZSwiJXMlcz1ZXG4iLAotCQkJCQkgICAgQ09ORklHXywgc3ltLT5uYW1lKTsKLQkJCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSAlcyVzIDFcbiIsCi0JCQkJICAgIENPTkZJR18sIHN5bS0+bmFtZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBTX1NUUklORzoKLQkJCWNvbmZfd3JpdGVfc3RyaW5nKHRydWUsIHN5bS0+bmFtZSwgc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKSwgb3V0X2gpOwotCQkJYnJlYWs7Ci0JCWNhc2UgU19IRVg6Ci0JCQlzdHIgPSBzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pOwotCQkJaWYgKHN0clswXSAhPSAnMCcgfHwgKHN0clsxXSAhPSAneCcgJiYgc3RyWzFdICE9ICdYJykpIHsKLQkJCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSAlcyVzIDB4JXNcbiIsCi0JCQkJICAgIENPTkZJR18sIHN5bS0+bmFtZSwgc3RyKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJY2FzZSBTX0lOVDoKLQkJCXN0ciA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSk7Ci0JCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSAlcyVzICVzXG4iLAotCQkJICAgIENPTkZJR18sIHN5bS0+bmFtZSwgc3RyKTsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KKwkJY29uZl93cml0ZV9zeW1ib2wodHJpc3RhdGUsIHN5bSwgJnRyaXN0YXRlX3ByaW50ZXJfY2IsICh2b2lkICopMSk7CisKKwkJY29uZl93cml0ZV9zeW1ib2wob3V0X2gsIHN5bSwgJmhlYWRlcl9wcmludGVyX2NiLCBOVUxMKTsKIAl9CiAJZmNsb3NlKG91dCk7CiAJZmNsb3NlKHRyaXN0YXRlKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9leHByLmMgYi9zY3JpcHRzL2tjb25maWcvZXhwci5jCmluZGV4IDAwMTAwMzQuLjI5MGNlNDEgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9leHByLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL2V4cHIuYwpAQCAtNywxNSArNywxMyBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCi0jZGVmaW5lIExLQ19ESVJFQ1RfTElOSwogI2luY2x1ZGUgImxrYy5oIgogCiAjZGVmaW5lIERFQlVHX0VYUFIJMAogCiBzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY19zeW1ib2woc3RydWN0IHN5bWJvbCAqc3ltKQogewotCXN0cnVjdCBleHByICplID0gbWFsbG9jKHNpemVvZigqZSkpOwotCW1lbXNldChlLCAwLCBzaXplb2YoKmUpKTsKKwlzdHJ1Y3QgZXhwciAqZSA9IGNhbGxvYygxLCBzaXplb2YoKmUpKTsKIAllLT50eXBlID0gRV9TWU1CT0w7CiAJZS0+bGVmdC5zeW0gPSBzeW07CiAJcmV0dXJuIGU7CkBAIC0yMyw4ICsyMSw3IEBACiAKIHN0cnVjdCBleHByICpleHByX2FsbG9jX29uZShlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3QgZXhwciAqY2UpCiB7Ci0Jc3RydWN0IGV4cHIgKmUgPSBtYWxsb2Moc2l6ZW9mKCplKSk7Ci0JbWVtc2V0KGUsIDAsIHNpemVvZigqZSkpOworCXN0cnVjdCBleHByICplID0gY2FsbG9jKDEsIHNpemVvZigqZSkpOwogCWUtPnR5cGUgPSB0eXBlOwogCWUtPmxlZnQuZXhwciA9IGNlOwogCXJldHVybiBlOwpAQCAtMzIsOCArMjksNyBAQAogCiBzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY190d28oZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpCiB7Ci0Jc3RydWN0IGV4cHIgKmUgPSBtYWxsb2Moc2l6ZW9mKCplKSk7Ci0JbWVtc2V0KGUsIDAsIHNpemVvZigqZSkpOworCXN0cnVjdCBleHByICplID0gY2FsbG9jKDEsIHNpemVvZigqZSkpOwogCWUtPnR5cGUgPSB0eXBlOwogCWUtPmxlZnQuZXhwciA9IGUxOwogCWUtPnJpZ2h0LmV4cHIgPSBlMjsKQEAgLTQyLDggKzM4LDcgQEAKIAogc3RydWN0IGV4cHIgKmV4cHJfYWxsb2NfY29tcChlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3Qgc3ltYm9sICpzMSwgc3RydWN0IHN5bWJvbCAqczIpCiB7Ci0Jc3RydWN0IGV4cHIgKmUgPSBtYWxsb2Moc2l6ZW9mKCplKSk7Ci0JbWVtc2V0KGUsIDAsIHNpemVvZigqZSkpOworCXN0cnVjdCBleHByICplID0gY2FsbG9jKDEsIHNpemVvZigqZSkpOwogCWUtPnR5cGUgPSB0eXBlOwogCWUtPmxlZnQuc3ltID0gczE7CiAJZS0+cmlnaHQuc3ltID0gczI7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvZXhwci5oIGIvc2NyaXB0cy9rY29uZmlnL2V4cHIuaAppbmRleCAxNmJmYWUyLi44MGZjZTU3IDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvZXhwci5oCisrKyBiL3NjcmlwdHMva2NvbmZpZy9leHByLmgKQEAgLTE3Miw4ICsxNzIsNiBAQAogI2RlZmluZSBNRU5VX0NIQU5HRUQJCTB4MDAwMQogI2RlZmluZSBNRU5VX1JPT1QJCTB4MDAwMgogCi0jaWZuZGVmIFNXSUcKLQogZXh0ZXJuIHN0cnVjdCBmaWxlICpmaWxlX2xpc3Q7CiBleHRlcm4gc3RydWN0IGZpbGUgKmN1cnJlbnRfZmlsZTsKIHN0cnVjdCBmaWxlICpsb29rdXBfZmlsZShjb25zdCBjaGFyICpuYW1lKTsKQEAgLTIxOCw3ICsyMTYsNiBAQAogewogCXJldHVybiBlICYmIChlLT50eXBlID09IEVfU1lNQk9MICYmIGUtPmxlZnQuc3ltID09ICZzeW1ib2xfbm8pOwogfQotI2VuZGlmCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2djb25mLmMgYi9zY3JpcHRzL2tjb25maWcvZ2NvbmYuYwppbmRleCBhMTFkNWY3Li45ZjQ0MzgwIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvZ2NvbmYuYworKysgYi9zY3JpcHRzL2tjb25maWcvZ2NvbmYuYwpAQCAtMjg1LDggKzI4NSw2IEBACiBzdGF0aWMgdm9pZCByZW5kZXJlcl9lZGl0ZWQoR3RrQ2VsbFJlbmRlcmVyVGV4dCAqIGNlbGwsCiAJCQkgICAgY29uc3QgZ2NoYXIgKiBwYXRoX3N0cmluZywKIAkJCSAgICBjb25zdCBnY2hhciAqIG5ld190ZXh0LCBncG9pbnRlciB1c2VyX2RhdGEpOwotc3RhdGljIHZvaWQgcmVuZGVyZXJfdG9nZ2xlZChHdGtDZWxsUmVuZGVyZXJUb2dnbGUgKiBjZWxscmVuZGVyZXJ0b2dnbGUsCi0JCQkgICAgIGdjaGFyICogYXJnMSwgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKIAogdm9pZCBpbml0X3JpZ2h0X3RyZWUodm9pZCkKIHsKQEAgLTMyMCw4ICszMTgsNiBAQAogCQkJCQkgICAgImluY29uc2lzdGVudCIsIENPTF9CVE5JTkMsCiAJCQkJCSAgICAidmlzaWJsZSIsIENPTF9CVE5WSVMsCiAJCQkJCSAgICAicmFkaW8iLCBDT0xfQlROUkFELCBOVUxMKTsKLQkvKmdfc2lnbmFsX2Nvbm5lY3QoR19PQkpFQ1QocmVuZGVyZXIpLCAidG9nZ2xlZCIsCi0JICAgR19DQUxMQkFDSyhyZW5kZXJlcl90b2dnbGVkKSwgTlVMTCk7ICovCiAJcmVuZGVyZXIgPSBndGtfY2VsbF9yZW5kZXJlcl90ZXh0X25ldygpOwogCWd0a190cmVlX3ZpZXdfY29sdW1uX3BhY2tfc3RhcnQoR1RLX1RSRUVfVklFV19DT0xVTU4oY29sdW1uKSwKIAkJCQkJcmVuZGVyZXIsIEZBTFNFKTsKQEAgLTg4OCwzNSArODg0LDYgQEAKIAkJZGlzcGxheV90cmVlX3BhcnQoKTsJLy9maXhtZToga2VlcCBleHAvY29sbAogfQogCi1zdGF0aWMgdm9pZCByZW5kZXJlcl90b2dnbGVkKEd0a0NlbGxSZW5kZXJlclRvZ2dsZSAqIGNlbGwsCi0JCQkgICAgIGdjaGFyICogcGF0aF9zdHJpbmcsIGdwb2ludGVyIHVzZXJfZGF0YSkKLXsKLQlHdGtUcmVlUGF0aCAqcGF0aCwgKnNlbF9wYXRoID0gTlVMTDsKLQlHdGtUcmVlSXRlciBpdGVyLCBzZWxfaXRlcjsKLQlHdGtUcmVlU2VsZWN0aW9uICpzZWw7Ci0Jc3RydWN0IG1lbnUgKm1lbnU7Ci0KLQlwYXRoID0gZ3RrX3RyZWVfcGF0aF9uZXdfZnJvbV9zdHJpbmcocGF0aF9zdHJpbmcpOwotCWlmICghZ3RrX3RyZWVfbW9kZWxfZ2V0X2l0ZXIobW9kZWwyLCAmaXRlciwgcGF0aCkpCi0JCXJldHVybjsKLQotCXNlbCA9IGd0a190cmVlX3ZpZXdfZ2V0X3NlbGVjdGlvbihHVEtfVFJFRV9WSUVXKHRyZWUyX3cpKTsKLQlpZiAoZ3RrX3RyZWVfc2VsZWN0aW9uX2dldF9zZWxlY3RlZChzZWwsIE5VTEwsICZzZWxfaXRlcikpCi0JCXNlbF9wYXRoID0gZ3RrX3RyZWVfbW9kZWxfZ2V0X3BhdGgobW9kZWwyLCAmc2VsX2l0ZXIpOwotCWlmICghc2VsX3BhdGgpCi0JCWdvdG8gb3V0MTsKLQlpZiAoZ3RrX3RyZWVfcGF0aF9jb21wYXJlKHBhdGgsIHNlbF9wYXRoKSkKLQkJZ290byBvdXQyOwotCi0JZ3RrX3RyZWVfbW9kZWxfZ2V0KG1vZGVsMiwgJml0ZXIsIENPTF9NRU5VLCAmbWVudSwgLTEpOwotCXRvZ2dsZV9zeW1fdmFsdWUobWVudSk7Ci0KLSAgICAgIG91dDI6Ci0JZ3RrX3RyZWVfcGF0aF9mcmVlKHNlbF9wYXRoKTsKLSAgICAgIG91dDE6Ci0JZ3RrX3RyZWVfcGF0aF9mcmVlKHBhdGgpOwotfQotCiBzdGF0aWMgZ2ludCBjb2x1bW4yaW5kZXgoR3RrVHJlZVZpZXdDb2x1bW4gKiBjb2x1bW4pCiB7CiAJZ2ludCBpOwpAQCAtMTE3Miw2ICsxMTM5LDcgQEAKIAkJCXJvd1tDT0xfQlROVklTXSA9IEdJTlRfVE9fUE9JTlRFUihUUlVFKTsKIAkJaWYgKHN5bV9pc19jaG9pY2Uoc3ltKSkKIAkJCWJyZWFrOworCQkvKiBmYWxsIHRocm91Z2ggKi8KIAljYXNlIFNfVFJJU1RBVEU6CiAJCXZhbCA9IHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKTsKIAkJc3dpdGNoICh2YWwpIHsKQEAgLTE1MDYsMTAgKzE0NzQsNiBAQAogCWNoYXIgKmVudjsKIAlnY2hhciAqZ2xhZGVfZmlsZTsKIAotI2lmbmRlZiBMS0NfRElSRUNUX0xJTksKLQlrY29uZmlnX2xvYWQoKTsKLSNlbmRpZgotCiAJYmluZHRleHRkb21haW4oUEFDS0FHRSwgTE9DQUxFRElSKTsKIAliaW5kX3RleHRkb21haW5fY29kZXNldChQQUNLQUdFLCAiVVRGLTgiKTsKIAl0ZXh0ZG9tYWluKFBBQ0tBR0UpOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2tjb25maWdfbG9hZC5jIGIvc2NyaXB0cy9rY29uZmlnL2tjb25maWdfbG9hZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmRjYWFkOC4uMDAwMDAwMAotLS0gYS9zY3JpcHRzL2tjb25maWcva2NvbmZpZ19sb2FkLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jaW5jbHVkZSA8ZGxmY24uaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0jaW5jbHVkZSAibGtjLmgiCi0KLSNkZWZpbmUgUChuYW1lLHR5cGUsYXJnKQl0eXBlICgqbmFtZSAjIyBfcCkgYXJnCi0jaW5jbHVkZSAibGtjX3Byb3RvLmgiCi0jdW5kZWYgUAotCi12b2lkIGtjb25maWdfbG9hZCh2b2lkKQotewotCXZvaWQgKmhhbmRsZTsKLQljaGFyICplcnJvcjsKLQotCWhhbmRsZSA9IGRsb3BlbigiLi9saWJrY29uZmlnLnNvIiwgUlRMRF9MQVpZKTsKLQlpZiAoIWhhbmRsZSkgewotCQloYW5kbGUgPSBkbG9wZW4oIi4vc2NyaXB0cy9rY29uZmlnL2xpYmtjb25maWcuc28iLCBSVExEX0xBWlkpOwotCQlpZiAoIWhhbmRsZSkgewotCQkJZnByaW50ZihzdGRlcnIsICIlc1xuIiwgZGxlcnJvcigpKTsKLQkJCWV4aXQoMSk7Ci0JCX0KLQl9Ci0KLSNkZWZpbmUgUChuYW1lLHR5cGUsYXJnKQkJCVwKLXsJCQkJCQlcCi0JbmFtZSAjIyBfcCA9IGRsc3ltKGhhbmRsZSwgI25hbWUpOwlcCi0gICAgICAgIGlmICgoZXJyb3IgPSBkbGVycm9yKCkpKSAgewkJXAotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGVycm9yKTsJXAotCQlleGl0KDEpOwkJCVwKLQl9CQkJCQlcCi19Ci0jaW5jbHVkZSAibGtjX3Byb3RvLmgiCi0jdW5kZWYgUAotfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2t4Z2V0dGV4dC5jIGIvc2NyaXB0cy9rY29uZmlnL2t4Z2V0dGV4dC5jCmluZGV4IGU5ZDhlNzkuLjI4NTg3MzggMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9reGdldHRleHQuYworKysgYi9zY3JpcHRzL2tjb25maWcva3hnZXR0ZXh0LmMKQEAgLTcsNyArNyw2IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKLSNkZWZpbmUgTEtDX0RJUkVDVF9MSU5LCiAjaW5jbHVkZSAibGtjLmgiCiAKIHN0YXRpYyBjaGFyICplc2NhcGUoY29uc3QgY2hhciogdGV4dCwgY2hhciAqYmYsIGludCBsZW4pCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbGtjLmggYi9zY3JpcHRzL2tjb25maWcvbGtjLmgKaW5kZXggZjM0YTBhOS4uYjYzM2JkYiAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL2xrYy5oCisrKyBiL3NjcmlwdHMva2NvbmZpZy9sa2MuaApAQCAtMjEsMTIgKzIxLDcgQEAKIGV4dGVybiAiQyIgewogI2VuZGlmCiAKLSNpZmRlZiBMS0NfRElSRUNUX0xJTksKICNkZWZpbmUgUChuYW1lLHR5cGUsYXJnKQlleHRlcm4gdHlwZSBuYW1lIGFyZwotI2Vsc2UKLSNpbmNsdWRlICJsa2NfZGVmcy5oIgotI2RlZmluZSBQKG5hbWUsdHlwZSxhcmcpCWV4dGVybiB0eXBlICgqbmFtZSAjIyBfcCkgYXJnCi0jZW5kaWYKICNpbmNsdWRlICJsa2NfcHJvdG8uaCIKICN1bmRlZiBQCiAKQEAgLTc5LDkgKzc0LDYgQEAKIGludCB6Y29uZl9saW5lbm8odm9pZCk7CiBjb25zdCBjaGFyICp6Y29uZl9jdXJuYW1lKHZvaWQpOwogCi0vKiBjb25mLmMgKi8KLXZvaWQgeGZnZXRzKGNoYXIgKnN0ciwgaW50IHNpemUsIEZJTEUgKmluKTsKLQogLyogY29uZmRhdGEuYyAqLwogY29uc3QgY2hhciAqY29uZl9nZXRfY29uZmlnbmFtZSh2b2lkKTsKIGNvbnN0IGNoYXIgKmNvbmZfZ2V0X2F1dG9jb25maWdfbmFtZSh2b2lkKTsKQEAgLTkwLDYgKzgyLDExIEBACiB2b2lkIHN5bV9hZGRfY2hhbmdlX2NvdW50KGludCBjb3VudCk7CiB2b2lkIGNvbmZfc2V0X2FsbF9uZXdfc3ltYm9scyhlbnVtIGNvbmZfZGVmX21vZGUgbW9kZSk7CiAKK3N0cnVjdCBjb25mX3ByaW50ZXIgeworCXZvaWQgKCpwcmludF9zeW1ib2wpKEZJTEUgKiwgc3RydWN0IHN5bWJvbCAqLCBjb25zdCBjaGFyICosIHZvaWQgKik7CisJdm9pZCAoKnByaW50X2NvbW1lbnQpKEZJTEUgKiwgY29uc3QgY2hhciAqLCB2b2lkICopOworfTsKKwogLyogY29uZmRhdGEuYyBhbmQgZXhwci5jICovCiBzdGF0aWMgaW5saW5lIHZvaWQgeGZ3cml0ZShjb25zdCB2b2lkICpzdHIsIHNpemVfdCBsZW4sIHNpemVfdCBjb3VudCwgRklMRSAqb3V0KQogewpAQCAtOTcsOSArOTQsNiBAQAogCQlmcHJpbnRmKHN0ZGVyciwgIlxuRXJyb3IgaW4gd3JpdGluZyBvciBlbmQgb2YgZmlsZS5cbiIpOwogfQogCi0vKiBrY29uZmlnX2xvYWQuYyAqLwotdm9pZCBrY29uZmlnX2xvYWQodm9pZCk7Ci0KIC8qIG1lbnUuYyAqLwogdm9pZCBfbWVudV9pbml0KHZvaWQpOwogdm9pZCBtZW51X3dhcm4oc3RydWN0IG1lbnUgKm1lbnUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9sa2NfcHJvdG8uaCBiL3NjcmlwdHMva2NvbmZpZy9sa2NfcHJvdG8uaAppbmRleCAxNzM0MmZlLi40N2ZlOWMzIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvbGtjX3Byb3RvLmgKKysrIGIvc2NyaXB0cy9rY29uZmlnL2xrY19wcm90by5oCkBAIC0zMSw2ICszMSw3IEBACiBQKHN5bV9sb29rdXAsc3RydWN0IHN5bWJvbCAqLChjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZ3MpKTsKIFAoc3ltX2ZpbmQsc3RydWN0IHN5bWJvbCAqLChjb25zdCBjaGFyICpuYW1lKSk7CiBQKHN5bV9leHBhbmRfc3RyaW5nX3ZhbHVlLGNvbnN0IGNoYXIgKiwoY29uc3QgY2hhciAqaW4pKTsKK1Aoc3ltX2VzY2FwZV9zdHJpbmdfdmFsdWUsIGNvbnN0IGNoYXIgKiwoY29uc3QgY2hhciAqaW4pKTsKIFAoc3ltX3JlX3NlYXJjaCxzdHJ1Y3Qgc3ltYm9sICoqLChjb25zdCBjaGFyICpwYXR0ZXJuKSk7CiBQKHN5bV90eXBlX25hbWUsY29uc3QgY2hhciAqLChlbnVtIHN5bWJvbF90eXBlIHR5cGUpKTsKIFAoc3ltX2NhbGNfdmFsdWUsdm9pZCwoc3RydWN0IHN5bWJvbCAqc3ltKSk7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbWNvbmYuYyBiL3NjcmlwdHMva2NvbmZpZy9tY29uZi5jCmluZGV4IGQ0MzNjN2EuLjgyMGQyYjYgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9tY29uZi5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9tY29uZi5jCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8bG9jYWxlLmg+CiAKLSNkZWZpbmUgTEtDX0RJUkVDVF9MSU5LCiAjaW5jbHVkZSAibGtjLmgiCiAjaW5jbHVkZSAibHhkaWFsb2cvZGlhbG9nLmgiCiAKQEAgLTg0NSw2ICs4NDQsNyBAQAogCQkJCSJcblxuIikpOwogCQkJcmV0dXJuIDE7CiAJCX0KKwkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSAtMToKIAkJcHJpbnRmKF8oIlxuXG4iCiAJCQkiKioqIEVuZCBvZiB0aGUgY29uZmlndXJhdGlvbi5cbiIKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9tZW51LmMgYi9zY3JpcHRzL2tjb25maWcvbWVudS5jCmluZGV4IDVmZGYxMGQuLmQ2NjAwODYgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9tZW51LmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL21lbnUuYwpAQCAtMywxMCArMywxMSBAQAogICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCiAgKi8KIAorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKLSNkZWZpbmUgTEtDX0RJUkVDVF9MSU5LCiAjaW5jbHVkZSAibGtjLmgiCiAKIHN0YXRpYyBjb25zdCBjaGFyIG5vaGVscF90ZXh0W10gPSBOXygKQEAgLTM1MCw3ICszNTEsNyBAQAogCQkJbGFzdF9tZW51LT5uZXh0ID0gTlVMTDsKIAkJfQogCi0JCXN5bS0+ZGlyX2RlcC5leHByID0gcGFyZW50LT5kZXA7CisJCXN5bS0+ZGlyX2RlcC5leHByID0gZXhwcl9hbGxvY19vcihzeW0tPmRpcl9kZXAuZXhwciwgcGFyZW50LT5kZXApOwogCX0KIAlmb3IgKG1lbnUgPSBwYXJlbnQtPmxpc3Q7IG1lbnU7IG1lbnUgPSBtZW51LT5uZXh0KSB7CiAJCWlmIChzeW0gJiYgc3ltX2lzX2Nob2ljZShzeW0pICYmCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbmNvbmYuYyBiL3NjcmlwdHMva2NvbmZpZy9uY29uZi5jCmluZGV4IDQ4OGRkNzQuLjM5Y2ExZjEgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9uY29uZi5jCisrKyBiL3NjcmlwdHMva2NvbmZpZy9uY29uZi5jCkBAIC03LDcgKzcsNyBAQAogICovCiAjZGVmaW5lIF9HTlVfU09VUkNFCiAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0jZGVmaW5lIExLQ19ESVJFQ1RfTElOSworCiAjaW5jbHVkZSAibGtjLmgiCiAjaW5jbHVkZSAibmNvbmYuaCIKICNpbmNsdWRlIDxjdHlwZS5oPgpAQCAtMTA2Nyw3ICsxMDY3LDYgQEAKIAlzdHJ1Y3QgbWVudSAqc3VibWVudSA9IDA7CiAJY29uc3QgY2hhciAqcHJvbXB0ID0gbWVudV9nZXRfcHJvbXB0KG1lbnUpOwogCXN0cnVjdCBzeW1ib2wgKnN5bTsKLQlzdHJ1Y3QgbWVudSAqYWN0aXZlX21lbnUgPSBOVUxMOwogCWludCByZXM7CiAJaW50IGN1cnJlbnRfaW5kZXggPSAwOwogCWludCBsYXN0X3RvcF9yb3cgPSAwOwpAQCAtMTE1MiwxMyArMTE1MSw5IEBACiAJCQljb250aW51ZTsKIAogCQlzdWJtZW51ID0gKHN0cnVjdCBtZW51ICopIGl0ZW1fZGF0YSgpOwotCQlhY3RpdmVfbWVudSA9IChzdHJ1Y3QgbWVudSAqKWl0ZW1fZGF0YSgpOwogCQlpZiAoIXN1Ym1lbnUgfHwgIW1lbnVfaXNfdmlzaWJsZShzdWJtZW51KSkKIAkJCWNvbnRpbnVlOwotCQlpZiAoc3VibWVudSkKLQkJCXN5bSA9IHN1Ym1lbnUtPnN5bTsKLQkJZWxzZQotCQkJc3ltID0gTlVMTDsKKwkJc3ltID0gc3VibWVudS0+c3ltOwogCiAJCXN3aXRjaCAocmVzKSB7CiAJCWNhc2UgJyAnOgpAQCAtMTIyMiwyMCArMTIxNywxMyBAQAogCiBzdGF0aWMgdm9pZCBzaG93X2hlbHAoc3RydWN0IG1lbnUgKm1lbnUpCiB7Ci0Jc3RydWN0IGdzdHIgaGVscCA9IHN0cl9uZXcoKTsKKwlzdHJ1Y3QgZ3N0ciBoZWxwOwogCi0JaWYgKG1lbnUgJiYgbWVudS0+c3ltICYmIG1lbnVfaGFzX2hlbHAobWVudSkpIHsKLQkJaWYgKG1lbnUtPnN5bS0+bmFtZSkgewotCQkJc3RyX3ByaW50ZigmaGVscCwgIiVzJXM6XG5cbiIsIENPTkZJR18sIG1lbnUtPnN5bS0+bmFtZSk7Ci0JCQlzdHJfYXBwZW5kKCZoZWxwLCBfKG1lbnVfZ2V0X2hlbHAobWVudSkpKTsKLQkJCXN0cl9hcHBlbmQoJmhlbHAsICJcbiIpOwotCQkJZ2V0X3N5bWJvbF9zdHIoJmhlbHAsIG1lbnUtPnN5bSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdHJfYXBwZW5kKCZoZWxwLCBfKG1lbnVfZ2V0X2hlbHAobWVudSkpKTsKLQkJfQotCX0gZWxzZSB7Ci0JCXN0cl9hcHBlbmQoJmhlbHAsIG5vaGVscF90ZXh0KTsKLQl9CisJaWYgKCFtZW51KQorCQlyZXR1cm47CisKKwloZWxwID0gc3RyX25ldygpOworCW1lbnVfZ2V0X2V4dF9oZWxwKG1lbnUsICZoZWxwKTsKIAlzaG93X3Njcm9sbF93aW4obWFpbl93aW5kb3csIF8obWVudV9nZXRfcHJvbXB0KG1lbnUpKSwgc3RyX2dldCgmaGVscCkpOwogCXN0cl9mcmVlKCZoZWxwKTsKIH0KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9xY29uZi5jYyBiL3NjcmlwdHMva2NvbmZpZy9xY29uZi5jYwppbmRleCBjMjc5NmI4Li5kZjI3NGZlIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvcWNvbmYuY2MKKysrIGIvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmNjCkBAIC0xNDc4LDEwICsxNDc4LDEzIEBACiAJQ29uZmlnVmlldzo6dXBkYXRlTGlzdEFsbCgpOwogfQogCi12b2lkIENvbmZpZ01haW5XaW5kb3c6OnNhdmVDb25maWcodm9pZCkKK2Jvb2wgQ29uZmlnTWFpbldpbmRvdzo6c2F2ZUNvbmZpZyh2b2lkKQogewotCWlmIChjb25mX3dyaXRlKE5VTEwpKQorCWlmIChjb25mX3dyaXRlKE5VTEwpKSB7CiAJCVFNZXNzYWdlQm94OjppbmZvcm1hdGlvbih0aGlzLCAicWNvbmYiLCBfKCJVbmFibGUgdG8gc2F2ZSBjb25maWd1cmF0aW9uISIpKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBDb25maWdNYWluV2luZG93OjpzYXZlQ29uZmlnQXModm9pZCkKQEAgLTE2NDIsNyArMTY0NSwxMSBAQAogCW1iLnNldEJ1dHRvblRleHQoUU1lc3NhZ2VCb3g6OkNhbmNlbCwgXygiQ2FuY2VsIEV4aXQiKSk7CiAJc3dpdGNoIChtYi5leGVjKCkpIHsKIAljYXNlIFFNZXNzYWdlQm94OjpZZXM6Ci0JCXNhdmVDb25maWcoKTsKKwkJaWYgKHNhdmVDb25maWcoKSkKKwkJCWUtPmFjY2VwdCgpOworCQllbHNlCisJCQllLT5pZ25vcmUoKTsKKwkJYnJlYWs7CiAJY2FzZSBRTWVzc2FnZUJveDo6Tm86CiAJCWUtPmFjY2VwdCgpOwogCQlicmVhazsKQEAgLTE3NDUsMTAgKzE3NTIsNiBAQAogCWJpbmR0ZXh0ZG9tYWluKFBBQ0tBR0UsIExPQ0FMRURJUik7CiAJdGV4dGRvbWFpbihQQUNLQUdFKTsKIAotI2lmbmRlZiBMS0NfRElSRUNUX0xJTksKLQlrY29uZmlnX2xvYWQoKTsKLSNlbmRpZgotCiAJcHJvZ25hbWUgPSBhdlswXTsKIAljb25maWdBcHAgPSBuZXcgUUFwcGxpY2F0aW9uKGFjLCBhdik7CiAJaWYgKGFjID4gMSAmJiBhdlsxXVswXSA9PSAnLScpIHsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9xY29uZi5oIGIvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmgKaW5kZXggOTE2NzdkOS4uMzcxNWIzZSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmgKKysrIGIvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmgKQEAgLTMxMSw3ICszMTEsNyBAQAogCXZvaWQgbGlzdEZvY3VzQ2hhbmdlZCh2b2lkKTsKIAl2b2lkIGdvQmFjayh2b2lkKTsKIAl2b2lkIGxvYWRDb25maWcodm9pZCk7Ci0Jdm9pZCBzYXZlQ29uZmlnKHZvaWQpOworCWJvb2wgc2F2ZUNvbmZpZyh2b2lkKTsKIAl2b2lkIHNhdmVDb25maWdBcyh2b2lkKTsKIAl2b2lkIHNlYXJjaENvbmZpZyh2b2lkKTsKIAl2b2lkIHNob3dTaW5nbGVWaWV3KHZvaWQpOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3N5bWJvbC5jIGIvc2NyaXB0cy9rY29uZmlnL3N5bWJvbC5jCmluZGV4IGE3OTZjOTUuLjA3MWYwMGMgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy9zeW1ib2wuYworKysgYi9zY3JpcHRzL2tjb25maWcvc3ltYm9sLmMKQEAgLTksNyArOSw2IEBACiAjaW5jbHVkZSA8cmVnZXguaD4KICNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgogCi0jZGVmaW5lIExLQ19ESVJFQ1RfTElOSwogI2luY2x1ZGUgImxrYy5oIgogCiBzdHJ1Y3Qgc3ltYm9sIHN5bWJvbF95ZXMgPSB7CkBAIC03NTEsNyArNzUwLDggQEAKIAkJY2FzZSBubzoKIAkJCXJldHVybiAibiI7CiAJCWNhc2UgbW9kOgotCQkJcmV0dXJuICJtIjsKKwkJCXN5bV9jYWxjX3ZhbHVlKG1vZHVsZXNfc3ltKTsKKwkJCXJldHVybiAobW9kdWxlc19zeW0tPmN1cnIudHJpID09IG5vKSA/ICJuIiA6ICJtIjsKIAkJY2FzZSB5ZXM6CiAJCQlyZXR1cm4gInkiOwogCQl9CkBAIC04OTMsNiArODkzLDQ5IEBACiAJcmV0dXJuIHJlczsKIH0KIAorY29uc3QgY2hhciAqc3ltX2VzY2FwZV9zdHJpbmdfdmFsdWUoY29uc3QgY2hhciAqaW4pCit7CisJY29uc3QgY2hhciAqcDsKKwlzaXplX3QgcmVzbGVuOworCWNoYXIgKnJlczsKKwlzaXplX3QgbDsKKworCXJlc2xlbiA9IHN0cmxlbihpbikgKyBzdHJsZW4oIlwiXCIiKSArIDE7CisKKwlwID0gaW47CisJZm9yICg7OykgeworCQlsID0gc3RyY3NwbihwLCAiXCJcXCIpOworCQlwICs9IGw7CisKKwkJaWYgKHBbMF0gPT0gJ1wwJykKKwkJCWJyZWFrOworCisJCXJlc2xlbisrOworCQlwKys7CisJfQorCisJcmVzID0gbWFsbG9jKHJlc2xlbik7CisJcmVzWzBdID0gJ1wwJzsKKworCXN0cmNhdChyZXMsICJcIiIpOworCisJcCA9IGluOworCWZvciAoOzspIHsKKwkJbCA9IHN0cmNzcG4ocCwgIlwiXFwiKTsKKwkJc3RybmNhdChyZXMsIHAsIGwpOworCQlwICs9IGw7CisKKwkJaWYgKHBbMF0gPT0gJ1wwJykKKwkJCWJyZWFrOworCisJCXN0cmNhdChyZXMsICJcXCIpOworCQlzdHJuY2F0KHJlcywgcCsrLCAxKTsKKwl9CisKKwlzdHJjYXQocmVzLCAiXCIiKTsKKwlyZXR1cm4gcmVzOworfQorCiBzdHJ1Y3Qgc3ltYm9sICoqc3ltX3JlX3NlYXJjaChjb25zdCBjaGFyICpwYXR0ZXJuKQogewogCXN0cnVjdCBzeW1ib2wgKnN5bSwgKipzeW1fYXJyID0gTlVMTDsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy91dGlsLmMgYi9zY3JpcHRzL2tjb25maWcvdXRpbC5jCmluZGV4IDYzMzBjYzguLmQwYjhiMjMgMTAwNjQ0Ci0tLSBhL3NjcmlwdHMva2NvbmZpZy91dGlsLmMKKysrIGIvc2NyaXB0cy9rY29uZmlnL3V0aWwuYwpAQCAtNSw2ICs1LDggQEAKICAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgogICovCiAKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlICJsa2MuaCIKIApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3pjb25mLmwgYi9zY3JpcHRzL2tjb25maWcvemNvbmYubAppbmRleCBkZGVlNWZjLi4wMGY5ZDNhIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvemNvbmYubAorKysgYi9zY3JpcHRzL2tjb25maWcvemNvbmYubApAQCAtMTQsNyArMTQsNiBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCi0jZGVmaW5lIExLQ19ESVJFQ1RfTElOSwogI2luY2x1ZGUgImxrYy5oIgogCiAjZGVmaW5lIFNUQVJUX1NUUlNJWkUJMTYKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy96Y29uZi5sZXguY19zaGlwcGVkIGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLmxleC5jX3NoaXBwZWQKaW5kZXggOTA2YzA5OS4uYzMyYjFhNCAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3pjb25mLmxleC5jX3NoaXBwZWQKKysrIGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLmxleC5jX3NoaXBwZWQKQEAgLTc3Niw3ICs3NzYsNiBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogCi0jZGVmaW5lIExLQ19ESVJFQ1RfTElOSwogI2luY2x1ZGUgImxrYy5oIgogCiAjZGVmaW5lIFNUQVJUX1NUUlNJWkUJMTYKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy96Y29uZi50YWIuY19zaGlwcGVkIGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLnRhYi5jX3NoaXBwZWQKaW5kZXggMjExZTFhMi4uZjYzNjE0MSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3pjb25mLnRhYi5jX3NoaXBwZWQKKysrIGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLnRhYi5jX3NoaXBwZWQKQEAgLTg3LDcgKzg3LDYgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzdGRib29sLmg+CiAKLSNkZWZpbmUgTEtDX0RJUkVDVF9MSU5LCiAjaW5jbHVkZSAibGtjLmgiCiAKICNkZWZpbmUgcHJpbnRkKG1hc2ssIGZtdC4uLikgaWYgKGNkZWJ1ZyAmIChtYXNrKSkgcHJpbnRmKGZtdCkKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy96Y29uZi55IGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLnkKaW5kZXggYzM4Y2M1YS4uODY0ZGEwNyAxMDA2NDQKLS0tIGEvc2NyaXB0cy9rY29uZmlnL3pjb25mLnkKKysrIGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLnkKQEAgLTExLDcgKzExLDYgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzdGRib29sLmg+CiAKLSNkZWZpbmUgTEtDX0RJUkVDVF9MSU5LCiAjaW5jbHVkZSAibGtjLmgiCiAKICNkZWZpbmUgcHJpbnRkKG1hc2ssIGZtdC4uLikgaWYgKGNkZWJ1ZyAmIChtYXNrKSkgcHJpbnRmKGZtdCkKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcGNtX2NvbXBhdC5jIGIvc291bmQvY29yZS9wY21fY29tcGF0LmMKaW5kZXggNWZiMmUyOC4uOTFjZGY5NCAxMDA2NDQKLS0tIGEvc291bmQvY29yZS9wY21fY29tcGF0LmMKKysrIGIvc291bmQvY29yZS9wY21fY29tcGF0LmMKQEAgLTM0Miw3ICszNDIsNyBAQAogCQkJa2ZyZWUoYnVmcyk7CiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJfQotCQlidWZzW2NoXSA9IGNvbXBhdF9wdHIocHRyKTsKKwkJYnVmc1tpXSA9IGNvbXBhdF9wdHIocHRyKTsKIAkJYnVmcHRyKys7CiAJfQogCWlmIChkaXIgPT0gU05EUlZfUENNX1NUUkVBTV9QTEFZQkFDSykKZGlmZiAtLWdpdCBhL3NvdW5kL2NvcmUvcnRjdGltZXIuYyBiL3NvdW5kL2NvcmUvcnRjdGltZXIuYwppbmRleCAwODUxY2QxLi5lODVlNzJiIDEwMDY0NAotLS0gYS9zb3VuZC9jb3JlL3J0Y3RpbWVyLmMKKysrIGIvc291bmQvY29yZS9ydGN0aW1lci5jCkBAIC0yMiw3ICsyMiw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CiAjaW5jbHVkZSA8c291bmQvY29yZS5oPgogI2luY2x1ZGUgPHNvdW5kL3RpbWVyLmg+CmRpZmYgLS1naXQgYS9zb3VuZC9pMmMvb3RoZXIvdGVhNTc1eC10dW5lci5jIGIvc291bmQvaTJjL290aGVyL3RlYTU3NXgtdHVuZXIuYwppbmRleCA0ODMxODAwLi40ODRhMzViIDEwMDY0NAotLS0gYS9zb3VuZC9pMmMvb3RoZXIvdGVhNTc1eC10dW5lci5jCisrKyBiL3NvdW5kL2kyYy9vdGhlci90ZWE1NzV4LXR1bmVyLmMKQEAgLTIyLDExICsyMiwxMSBAQAogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KLSNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+CisjaW5jbHVkZSA8bWVkaWEvdjRsMi1kZXYuaD4KKyNpbmNsdWRlIDxtZWRpYS92NGwyLWlvY3RsLmg+CiAjaW5jbHVkZSA8c291bmQvdGVhNTc1eC10dW5lci5oPgogCiBNT0RVTEVfQVVUSE9SKCJKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHBlcmV4LmN6PiIpOwpAQCAtNjIsMTcgKzYyLDYgQEAKICNkZWZpbmUgVEVBNTc1WF9CSVRfRFVNTVkJKDE8PDE1KQkJLyogYnVmZmVyICovCiAjZGVmaW5lIFRFQTU3NVhfQklUX0ZSRVFfTUFTSwkweDdmZmYKIAotc3RhdGljIHN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCByYWRpb19xY3RybFtdID0gewotCXsKLQkJLmlkICAgICAgICAgICAgPSBWNEwyX0NJRF9BVURJT19NVVRFLAotCQkubmFtZSAgICAgICAgICA9ICJNdXRlIiwKLQkJLm1pbmltdW0gICAgICAgPSAwLAotCQkubWF4aW11bSAgICAgICA9IDEsCi0JCS5kZWZhdWx0X3ZhbHVlID0gMSwKLQkJLnR5cGUgICAgICAgICAgPSBWNEwyX0NUUkxfVFlQRV9CT09MRUFOLAotCX0KLX07Ci0KIC8qCiAgKiBsb3dsZXZlbCBwYXJ0CiAgKi8KQEAgLTI2Niw4MyArMjU1LDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgdmlkaW9jX3F1ZXJ5Y3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQkJc3RydWN0IHY0bDJfcXVlcnljdHJsICpxYykKK3N0YXRpYyBpbnQgdGVhNTc1eF9zX2N0cmwoc3RydWN0IHY0bDJfY3RybCAqY3RybCkKIHsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJhZGlvX3FjdHJsKTsgaSsrKSB7Ci0JCWlmIChxYy0+aWQgJiYgcWMtPmlkID09IHJhZGlvX3FjdHJsW2ldLmlkKSB7Ci0JCQltZW1jcHkocWMsICYocmFkaW9fcWN0cmxbaV0pLAotCQkJCQkJc2l6ZW9mKCpxYykpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQgdmlkaW9jX2dfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKLXsKLQlzdHJ1Y3Qgc25kX3RlYTU3NXggKnRlYSA9IHZpZGVvX2RydmRhdGEoZmlsZSk7CisJc3RydWN0IHNuZF90ZWE1NzV4ICp0ZWEgPSBjb250YWluZXJfb2YoY3RybC0+aGFuZGxlciwgc3RydWN0IHNuZF90ZWE1NzV4LCBjdHJsX2hhbmRsZXIpOwogCiAJc3dpdGNoIChjdHJsLT5pZCkgewogCWNhc2UgVjRMMl9DSURfQVVESU9fTVVURToKLQkJY3RybC0+dmFsdWUgPSB0ZWEtPm11dGU7CisJCXRlYS0+bXV0ZSA9IGN0cmwtPnZhbDsKKwkJc25kX3RlYTU3NXhfc2V0X2ZyZXEodGVhKTsKIAkJcmV0dXJuIDA7CiAJfQorCiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKLXN0YXRpYyBpbnQgdmlkaW9jX3NfY3RybChzdHJ1Y3QgZmlsZSAqZmlsZSwgdm9pZCAqcHJpdiwKLQkJCQkJc3RydWN0IHY0bDJfY29udHJvbCAqY3RybCkKLXsKLQlzdHJ1Y3Qgc25kX3RlYTU3NXggKnRlYSA9IHZpZGVvX2RydmRhdGEoZmlsZSk7Ci0KLQlzd2l0Y2ggKGN0cmwtPmlkKSB7Ci0JY2FzZSBWNEwyX0NJRF9BVURJT19NVVRFOgotCQlpZiAodGVhLT5tdXRlICE9IGN0cmwtPnZhbHVlKSB7Ci0JCQl0ZWEtPm11dGUgPSBjdHJsLT52YWx1ZTsKLQkJCXNuZF90ZWE1NzV4X3NldF9mcmVxKHRlYSk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19nX2lucHV0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgKmkpCi17Ci0JKmkgPSAwOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHZpZGlvY19zX2lucHV0KHN0cnVjdCBmaWxlICpmaWxwLCB2b2lkICpwcml2LCB1bnNpZ25lZCBpbnQgaSkKLXsKLQlpZiAoaSAhPSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzbmRfdGVhNTc1eF9leGNsdXNpdmVfb3BlbihzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3Qgc25kX3RlYTU3NXggKnRlYSA9IHZpZGVvX2RydmRhdGEoZmlsZSk7Ci0KLQlyZXR1cm4gdGVzdF9hbmRfc2V0X2JpdCgwLCAmdGVhLT5pbl91c2UpID8gLUVCVVNZIDogMDsKLX0KLQotc3RhdGljIGludCBzbmRfdGVhNTc1eF9leGNsdXNpdmVfcmVsZWFzZShzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlzdHJ1Y3Qgc25kX3RlYTU3NXggKnRlYSA9IHZpZGVvX2RydmRhdGEoZmlsZSk7Ci0KLQljbGVhcl9iaXQoMCwgJnRlYS0+aW5fdXNlKTsKLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2ZpbGVfb3BlcmF0aW9ucyB0ZWE1NzV4X2ZvcHMgPSB7CiAJLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS5vcGVuICAgICAgICAgICA9IHNuZF90ZWE1NzV4X2V4Y2x1c2l2ZV9vcGVuLAotCS5yZWxlYXNlICAgICAgICA9IHNuZF90ZWE1NzV4X2V4Y2x1c2l2ZV9yZWxlYXNlLAotCS5pb2N0bAkJPSB2aWRlb19pb2N0bDIsCisJLnVubG9ja2VkX2lvY3RsCT0gdmlkZW9faW9jdGwyLAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCB2NGwyX2lvY3RsX29wcyB0ZWE1NzV4X2lvY3RsX29wcyA9IHsKQEAgLTM1MSwyMCArMjgwLDE5IEBACiAJLnZpZGlvY19zX3R1bmVyICAgICA9IHZpZGlvY19zX3R1bmVyLAogCS52aWRpb2NfZ19hdWRpbyAgICAgPSB2aWRpb2NfZ19hdWRpbywKIAkudmlkaW9jX3NfYXVkaW8gICAgID0gdmlkaW9jX3NfYXVkaW8sCi0JLnZpZGlvY19nX2lucHV0ICAgICA9IHZpZGlvY19nX2lucHV0LAotCS52aWRpb2Nfc19pbnB1dCAgICAgPSB2aWRpb2Nfc19pbnB1dCwKIAkudmlkaW9jX2dfZnJlcXVlbmN5ID0gdmlkaW9jX2dfZnJlcXVlbmN5LAogCS52aWRpb2Nfc19mcmVxdWVuY3kgPSB2aWRpb2Nfc19mcmVxdWVuY3ksCi0JLnZpZGlvY19xdWVyeWN0cmwgICA9IHZpZGlvY19xdWVyeWN0cmwsCi0JLnZpZGlvY19nX2N0cmwgICAgICA9IHZpZGlvY19nX2N0cmwsCi0JLnZpZGlvY19zX2N0cmwgICAgICA9IHZpZGlvY19zX2N0cmwsCiB9OwogCiBzdGF0aWMgc3RydWN0IHZpZGVvX2RldmljZSB0ZWE1NzV4X3JhZGlvID0gewogCS5uYW1lICAgICAgICAgICA9ICJ0ZWE1NzV4LXR1bmVyIiwKIAkuZm9wcyAgICAgICAgICAgPSAmdGVhNTc1eF9mb3BzLAogCS5pb2N0bF9vcHMgCT0gJnRlYTU3NXhfaW9jdGxfb3BzLAotCS5yZWxlYXNlCT0gdmlkZW9fZGV2aWNlX3JlbGVhc2UsCisJLnJlbGVhc2UJPSB2aWRlb19kZXZpY2VfcmVsZWFzZV9lbXB0eSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdjRsMl9jdHJsX29wcyB0ZWE1NzV4X2N0cmxfb3BzID0geworCS5zX2N0cmwgPSB0ZWE1NzV4X3NfY3RybCwKIH07CiAKIC8qCkBAIC0zNzMsNyArMzAxLDYgQEAKIGludCBzbmRfdGVhNTc1eF9pbml0KHN0cnVjdCBzbmRfdGVhNTc1eCAqdGVhKQogewogCWludCByZXR2YWw7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdGVhNTc1eF9yYWRpb19pbnN0OwogCiAJdGVhLT5tdXRlID0gMTsKIApAQCAtMzgxLDQzICszMDgsNDkgQEAKIAlpZiAoc25kX3RlYTU3NXhfcmVhZCh0ZWEpICE9IDB4NTVBQSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQl0ZWEtPmluX3VzZSA9IDA7CiAJdGVhLT52YWwgPSBURUE1NzVYX0JJVF9CQU5EX0ZNIHwgVEVBNTc1WF9CSVRfU0VBUkNIXzEwXzQwOwogCXRlYS0+ZnJlcSA9IDkwNTAwICogMTY7CQkvKiA5MC41TWh6IGRlZmF1bHQgKi8KKwlzbmRfdGVhNTc1eF9zZXRfZnJlcSh0ZWEpOwogCi0JdGVhNTc1eF9yYWRpb19pbnN0ID0gdmlkZW9fZGV2aWNlX2FsbG9jKCk7Ci0JaWYgKHRlYTU3NXhfcmFkaW9faW5zdCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAidGVhNTc1eC10dW5lcjogbm90IGVub3VnaCBtZW1vcnlcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9CisJdGVhLT52ZCA9IHRlYTU3NXhfcmFkaW87CisJdmlkZW9fc2V0X2RydmRhdGEoJnRlYS0+dmQsIHRlYSk7CisJbXV0ZXhfaW5pdCgmdGVhLT5tdXRleCk7CisJdGVhLT52ZC5sb2NrID0gJnRlYS0+bXV0ZXg7CiAKLQltZW1jcHkodGVhNTc1eF9yYWRpb19pbnN0LCAmdGVhNTc1eF9yYWRpbywgc2l6ZW9mKHRlYTU3NXhfcmFkaW8pKTsKLQotCXN0cmNweSh0ZWE1NzV4X3JhZGlvLm5hbWUsIHRlYS0+dGVhNTc1OSA/Ci0JCQkJICAgIlRFQTU3NTkgcmFkaW8iIDogIlRFQTU3NTcgcmFkaW8iKTsKLQotCXZpZGVvX3NldF9kcnZkYXRhKHRlYTU3NXhfcmFkaW9faW5zdCwgdGVhKTsKLQotCXJldHZhbCA9IHZpZGVvX3JlZ2lzdGVyX2RldmljZSh0ZWE1NzV4X3JhZGlvX2luc3QsCi0JCQkJICAgICAgIFZGTF9UWVBFX1JBRElPLCByYWRpb19ucik7CisJdjRsMl9jdHJsX2hhbmRsZXJfaW5pdCgmdGVhLT5jdHJsX2hhbmRsZXIsIDEpOworCXRlYS0+dmQuY3RybF9oYW5kbGVyID0gJnRlYS0+Y3RybF9oYW5kbGVyOworCXY0bDJfY3RybF9uZXdfc3RkKCZ0ZWEtPmN0cmxfaGFuZGxlciwgJnRlYTU3NXhfY3RybF9vcHMsIFY0TDJfQ0lEX0FVRElPX01VVEUsIDAsIDEsIDEsIDEpOworCXJldHZhbCA9IHRlYS0+Y3RybF9oYW5kbGVyLmVycm9yOwogCWlmIChyZXR2YWwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJ0ZWE1NzV4LXR1bmVyOiBjYW4ndCByZWdpc3RlciB2aWRlbyBkZXZpY2UhXG4iKTsKLQkJa2ZyZWUodGVhNTc1eF9yYWRpb19pbnN0KTsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0ZWE1NzV4LXR1bmVyOiBjYW4ndCBpbml0aWFsaXplIGNvbnRyb2xzXG4iKTsKKwkJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmdGVhLT5jdHJsX2hhbmRsZXIpOwogCQlyZXR1cm4gcmV0dmFsOwogCX0KIAotCXNuZF90ZWE1NzV4X3NldF9mcmVxKHRlYSk7Ci0JdGVhLT52ZCA9IHRlYTU3NXhfcmFkaW9faW5zdDsKKwlpZiAodGVhLT5leHRfaW5pdCkgeworCQlyZXR2YWwgPSB0ZWEtPmV4dF9pbml0KHRlYSk7CisJCWlmIChyZXR2YWwpIHsKKwkJCXY0bDJfY3RybF9oYW5kbGVyX2ZyZWUoJnRlYS0+Y3RybF9oYW5kbGVyKTsKKwkJCXJldHVybiByZXR2YWw7CisJCX0KKwl9CisKKwl2NGwyX2N0cmxfaGFuZGxlcl9zZXR1cCgmdGVhLT5jdHJsX2hhbmRsZXIpOworCisJcmV0dmFsID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKCZ0ZWEtPnZkLCBWRkxfVFlQRV9SQURJTywgcmFkaW9fbnIpOworCWlmIChyZXR2YWwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0ZWE1NzV4LXR1bmVyOiBjYW4ndCByZWdpc3RlciB2aWRlbyBkZXZpY2UhXG4iKTsKKwkJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmdGVhLT5jdHJsX2hhbmRsZXIpOworCQlyZXR1cm4gcmV0dmFsOworCX0KIAogCXJldHVybiAwOwogfQogCiB2b2lkIHNuZF90ZWE1NzV4X2V4aXQoc3RydWN0IHNuZF90ZWE1NzV4ICp0ZWEpCiB7Ci0JaWYgKHRlYS0+dmQpIHsKLQkJdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UodGVhLT52ZCk7Ci0JCXRlYS0+dmQgPSBOVUxMOwotCX0KKwl2aWRlb191bnJlZ2lzdGVyX2RldmljZSgmdGVhLT52ZCk7CisJdjRsMl9jdHJsX2hhbmRsZXJfZnJlZSgmdGVhLT5jdHJsX2hhbmRsZXIpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCBhbHNhX3RlYTU3NXhfbW9kdWxlX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL3NvdW5kL3BjaS9LY29uZmlnIGIvc291bmQvcGNpL0tjb25maWcKaW5kZXggZTkwZDEwMy4uNTBhYmY1YiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL0tjb25maWcKKysrIGIvc291bmQvcGNpL0tjb25maWcKQEAgLTU2NSw4ICs1NjUsOCBAQAogCiBjb25maWcgU05EX1RFQTU3NVgKIAl0cmlzdGF0ZQotCWRlcGVuZHMgb24gU05EX0ZNODAxX1RFQTU3NVhfQk9PTCB8fCBTTkRfRVMxOTY4X1JBRElPCi0JZGVmYXVsdCBTTkRfRk04MDEgfHwgU05EX0VTMTk2OAorCWRlcGVuZHMgb24gU05EX0ZNODAxX1RFQTU3NVhfQk9PTCB8fCBTTkRfRVMxOTY4X1JBRElPIHx8IFJBRElPX1NGMTZGTVIyCisJZGVmYXVsdCBTTkRfRk04MDEgfHwgU05EX0VTMTk2OCB8fCBSQURJT19TRjE2Rk1SMgogCiBzb3VyY2UgInNvdW5kL3BjaS9oZGEvS2NvbmZpZyIKIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2FzaWhwaS9ocGlkc3BjZC5jIGIvc291bmQvcGNpL2FzaWhwaS9ocGlkc3BjZC5jCmluZGV4IDNhN2FmYTMuLjcxZDMyYzggMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hc2locGkvaHBpZHNwY2QuYworKysgYi9zb3VuZC9wY2kvYXNpaHBpL2hwaWRzcGNkLmMKQEAgLTQzLDYgKzQzLDcgQEAKIAlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gb3NfZGF0YTsKIAlzdHJ1Y3QgY29kZV9oZWFkZXIgaGVhZGVyOwogCWNoYXIgZndfbmFtZVsyMF07CisJc2hvcnQgZXJyX3JldCA9IEhQSV9FUlJPUl9EU1BfRklMRV9OT1RfRk9VTkQ7CiAJaW50IGVycjsKIAogCXNwcmludGYoZndfbmFtZSwgImFzaWhwaS9kc3AlMDR4LmJpbiIsIGFkYXB0ZXIpOwpAQCAtODUsOCArODYsMTAgQEAKIAogCUhQSV9ERUJVR19MT0coREVCVUcsICJkc3AgY29kZSAlcyBvcGVuZWRcbiIsIGZ3X25hbWUpOwogCWRzcF9jb2RlLT5wdnQgPSBrbWFsbG9jKHNpemVvZigqZHNwX2NvZGUtPnB2dCksIEdGUF9LRVJORUwpOwotCWlmICghZHNwX2NvZGUtPnB2dCkKLQkJcmV0dXJuIEhQSV9FUlJPUl9NRU1PUllfQUxMT0M7CisJaWYgKCFkc3BfY29kZS0+cHZ0KSB7CisJCWVycl9yZXQgPSBIUElfRVJST1JfTUVNT1JZX0FMTE9DOworCQlnb3RvIGVycm9yMjsKKwl9CiAKIAlkc3BfY29kZS0+cHZ0LT5kZXYgPSBkZXY7CiAJZHNwX2NvZGUtPnB2dC0+ZmlybXdhcmUgPSBmaXJtd2FyZTsKQEAgLTk5LDcgKzEwMiw3IEBACiAJcmVsZWFzZV9maXJtd2FyZShmaXJtd2FyZSk7CiBlcnJvcjE6CiAJZHNwX2NvZGUtPmJsb2NrX2xlbmd0aCA9IDA7Ci0JcmV0dXJuIEhQSV9FUlJPUl9EU1BfRklMRV9OT1RfRk9VTkQ7CisJcmV0dXJuIGVycl9yZXQ7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvYXNpaHBpL2hwaW9jdGwuYyBiL3NvdW5kL3BjaS9hc2locGkvaHBpb2N0bC5jCmluZGV4IDk2ODNmODQuLmEzMjUwMmUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9hc2locGkvaHBpb2N0bC5jCisrKyBiL3NvdW5kL3BjaS9hc2locGkvaHBpb2N0bC5jCkBAIC0xNzcsMTYgKzE3NywyMSBAQAogCX0gZWxzZSB7CiAJCXUxNiBfX3VzZXIgKnB0ciA9IE5VTEw7CiAJCXUzMiBzaXplID0gMDsKLQorCQl1MzIgYWRhcHRlcl9wcmVzZW50OwogCQkvKiAtMT1ubyBkYXRhIDA9cmVhZCBmcm9tIHVzZXIgbWVtLCAxPXdyaXRlIHRvIHVzZXIgbWVtICovCiAJCWludCB3cmZsYWcgPSAtMTsKLQkJdTMyIGFkYXB0ZXIgPSBobS0+aC5hZGFwdGVyX2luZGV4OwotCQlzdHJ1Y3QgaHBpX2FkYXB0ZXIgKnBhID0gJmFkYXB0ZXJzW2FkYXB0ZXJdOworCQlzdHJ1Y3QgaHBpX2FkYXB0ZXIgKnBhOwogCi0JCWlmICgoYWRhcHRlciA+PSBIUElfTUFYX0FEQVBURVJTKSB8fCAoIXBhLT50eXBlKSkgewotCQkJaHBpX2luaXRfcmVzcG9uc2UoJmhyLT5yMCwgSFBJX09CSl9BREFQVEVSLAotCQkJCUhQSV9BREFQVEVSX09QRU4sCi0JCQkJSFBJX0VSUk9SX0JBRF9BREFQVEVSX05VTUJFUik7CisJCWlmIChobS0+aC5hZGFwdGVyX2luZGV4IDwgSFBJX01BWF9BREFQVEVSUykgeworCQkJcGEgPSAmYWRhcHRlcnNbaG0tPmguYWRhcHRlcl9pbmRleF07CisJCQlhZGFwdGVyX3ByZXNlbnQgPSBwYS0+dHlwZTsKKwkJfSBlbHNlIHsKKwkJCWFkYXB0ZXJfcHJlc2VudCA9IDA7CisJCX0KKworCQlpZiAoIWFkYXB0ZXJfcHJlc2VudCkgeworCQkJaHBpX2luaXRfcmVzcG9uc2UoJmhyLT5yMCwgaG0tPmgub2JqZWN0LAorCQkJCWhtLT5oLmZ1bmN0aW9uLCBIUElfRVJST1JfQkFEX0FEQVBURVJfTlVNQkVSKTsKIAogCQkJdW5jb3BpZWRfYnl0ZXMgPQogCQkJCWNvcHlfdG9fdXNlcihwdWhyLCBociwgc2l6ZW9mKGhyLT5oKSk7CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwbS5jIGIvc291bmQvcGNpL3JtZTk2NTIvaGRzcG0uYwppbmRleCBhZjEzMGVlLi42ZWRjNjdjIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvcm1lOTY1Mi9oZHNwbS5jCisrKyBiL3NvdW5kL3BjaS9ybWU5NjUyL2hkc3BtLmMKQEAgLTUyMSw2ICs1MjEsNyBAQAogI2RlZmluZSBIRFNQTV9ETUFfQVJFQV9LSUxPQllURVMgKEhEU1BNX0RNQV9BUkVBX0JZVEVTLzEwMjQpCiAKIC8qIHJldmlzaW9ucyA+PSAyMzAgaW5kaWNhdGUgQUVTMzIgY2FyZCAqLworI2RlZmluZSBIRFNQTV9NQURJX0FOQ0lFTlRfUkVWCTIwNAogI2RlZmluZSBIRFNQTV9NQURJX09MRF9SRVYJMjA3CiAjZGVmaW5lIEhEU1BNX01BRElfUkVWCQkyMTAKICNkZWZpbmUgSERTUE1fUkFZREFUX1JFVgkyMTEKQEAgLTEyMTcsNiArMTIxOCwyMiBAQAogCQkJCXJhdGUgPSAwOwogCQkJCWJyZWFrOwogCQkJfQorCisJCQkvKiBRUyBhbmQgRFMgcmF0ZXMgbm9ybWFsbHkgY2FuIG5vdCBiZSBkZXRlY3RlZAorCQkJICogYXV0b21hdGljYWxseSBieSB0aGUgY2FyZC4gT25seSBleGNlcHRpb24gaXMgTUFESQorCQkJICogaW4gOTZrIGZyYW1lIG1vZGUuCisJCQkgKgorCQkJICogU28gaWYgd2UgcmVhZCBTUyB2YWx1ZXMgKDMyIC4uIDQ4ayksIGNoZWNrIGZvcgorCQkJICogdXNlci1wcm92aWRlZCBEUy9RUyBiaXRzIGluIHRoZSBjb250cm9sIHJlZ2lzdGVyCisJCQkgKiBhbmQgbXVsdGlwbHkgdGhlIGJhc2UgZnJlcXVlbmN5IGFjY29yZGluZ2x5LgorCQkJICovCisJCQlpZiAocmF0ZSA8PSA0ODAwMCkgeworCQkJCWlmIChoZHNwbS0+Y29udHJvbF9yZWdpc3RlciAmIEhEU1BNX1F1YWRTcGVlZCkKKwkJCQkJcmF0ZSAqPSA0OworCQkJCWVsc2UgaWYgKGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyICYKKwkJCQkJCUhEU1BNX0RvdWJsZVNwZWVkKQorCQkJCQlyYXRlICo9IDI7CisJCQl9CiAJCX0KIAkJYnJlYWs7CiAJfQpAQCAtMzQxNSw2ICszNDMyLDkxIEBACiAJcmV0dXJuIGNoYW5nZTsKIH0KIAorI2RlZmluZSBIRFNQTV9NQURJX1NQRUVETU9ERSh4bmFtZSwgeGluZGV4KSBcCit7CS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLCBcCisJLm5hbWUgPSB4bmFtZSwgXAorCS5pbmRleCA9IHhpbmRleCwgXAorCS5pbmZvID0gc25kX2hkc3BtX2luZm9fbWFkaV9zcGVlZG1vZGUsIFwKKwkuZ2V0ID0gc25kX2hkc3BtX2dldF9tYWRpX3NwZWVkbW9kZSwgXAorCS5wdXQgPSBzbmRfaGRzcG1fcHV0X21hZGlfc3BlZWRtb2RlIFwKK30KKworc3RhdGljIGludCBoZHNwbV9tYWRpX3NwZWVkbW9kZShzdHJ1Y3QgaGRzcG0gKmhkc3BtKQoreworCWlmIChoZHNwbS0+Y29udHJvbF9yZWdpc3RlciAmIEhEU1BNX1F1YWRTcGVlZCkKKwkJcmV0dXJuIDI7CisJaWYgKGhkc3BtLT5jb250cm9sX3JlZ2lzdGVyICYgSERTUE1fRG91YmxlU3BlZWQpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhkc3BtX3NldF9tYWRpX3NwZWVkbW9kZShzdHJ1Y3QgaGRzcG0gKmhkc3BtLCBpbnQgbW9kZSkKK3sKKwloZHNwbS0+Y29udHJvbF9yZWdpc3RlciAmPSB+KEhEU1BNX0RvdWJsZVNwZWVkIHwgSERTUE1fUXVhZFNwZWVkKTsKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIDA6CisJCWJyZWFrOworCWNhc2UgMToKKwkJaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgfD0gSERTUE1fRG91YmxlU3BlZWQ7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIgfD0gSERTUE1fUXVhZFNwZWVkOworCQlicmVhazsKKwl9CisJaGRzcG1fd3JpdGUoaGRzcG0sIEhEU1BNX2NvbnRyb2xSZWdpc3RlciwgaGRzcG0tPmNvbnRyb2xfcmVnaXN0ZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BtX2luZm9fbWFkaV9zcGVlZG1vZGUoc3RydWN0IHNuZF9rY29udHJvbCAqa2NvbnRyb2wsCisJCQkJICAgICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJc3RhdGljIGNoYXIgKnRleHRzW10gPSB7ICJTaW5nbGUiLCAiRG91YmxlIiwgIlF1YWQiIH07CisKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9FTEVNX1RZUEVfRU5VTUVSQVRFRDsKKwl1aW5mby0+Y291bnQgPSAxOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gMzsKKworCWlmICh1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID49IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zKQorCQl1aW5mby0+dmFsdWUuZW51bWVyYXRlZC5pdGVtID0KKwkJICAgIHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zIC0gMTsKKwlzdHJjcHkodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwKKwkgICAgICAgdGV4dHNbdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbV0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BtX2dldF9tYWRpX3NwZWVkbW9kZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRzcG0gKmhkc3BtID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCisJc3Bpbl9sb2NrX2lycSgmaGRzcG0tPmxvY2spOworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPSBoZHNwbV9tYWRpX3NwZWVkbW9kZShoZHNwbSk7CisJc3Bpbl91bmxvY2tfaXJxKCZoZHNwbS0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25kX2hkc3BtX3B1dF9tYWRpX3NwZWVkbW9kZShzdHJ1Y3Qgc25kX2tjb250cm9sICprY29udHJvbCwKKwkJCQkgICAgICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgaGRzcG0gKmhkc3BtID0gc25kX2tjb250cm9sX2NoaXAoa2NvbnRyb2wpOworCWludCBjaGFuZ2U7CisJaW50IHZhbDsKKworCWlmICghc25kX2hkc3BtX3VzZV9pc19leGNsdXNpdmUoaGRzcG0pKQorCQlyZXR1cm4gLUVCVVNZOworCXZhbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCWlmICh2YWwgPCAwKQorCQl2YWwgPSAwOworCWlmICh2YWwgPiAyKQorCQl2YWwgPSAyOworCXNwaW5fbG9ja19pcnEoJmhkc3BtLT5sb2NrKTsKKwljaGFuZ2UgPSB2YWwgIT0gaGRzcG1fbWFkaV9zcGVlZG1vZGUoaGRzcG0pOworCWhkc3BtX3NldF9tYWRpX3NwZWVkbW9kZShoZHNwbSwgdmFsKTsKKwlzcGluX3VubG9ja19pcnEoJmhkc3BtLT5sb2NrKTsKKwlyZXR1cm4gY2hhbmdlOworfQogCiAjZGVmaW5lIEhEU1BNX01JWEVSKHhuYW1lLCB4aW5kZXgpIFwKIHsgLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfSFdERVAsIFwKQEAgLTQyODksNyArNDM5MSw4IEBACiAJSERTUE1fVFhfNjQoIlRYIDY0IGNoYW5uZWxzIG1vZGUiLCAwKSwKIAlIRFNQTV9DX1RNUygiQ2xlYXIgVHJhY2sgTWFya2VyIiwgMCksCiAJSERTUE1fU0FGRV9NT0RFKCJTYWZlIE1vZGUiLCAwKSwKLQlIRFNQTV9JTlBVVF9TRUxFQ1QoIklucHV0IFNlbGVjdCIsIDApCisJSERTUE1fSU5QVVRfU0VMRUNUKCJJbnB1dCBTZWxlY3QiLCAwKSwKKwlIRFNQTV9NQURJX1NQRUVETU9ERSgiTUFESSBTcGVlZCBNb2RlIiwgMCkKIH07CiAKIApAQCAtNDMwMiw3ICs0NDA1LDggQEAKIAlIRFNQTV9TWU5DX0NIRUNLKCJNQURJIFN5bmNDaGVjayIsIDApLAogCUhEU1BNX1RYXzY0KCJUWCA2NCBjaGFubmVscyBtb2RlIiwgMCksCiAJSERTUE1fQ19UTVMoIkNsZWFyIFRyYWNrIE1hcmtlciIsIDApLAotCUhEU1BNX1NBRkVfTU9ERSgiU2FmZSBNb2RlIiwgMCkKKwlIRFNQTV9TQUZFX01PREUoIlNhZmUgTW9kZSIsIDApLAorCUhEU1BNX01BRElfU1BFRURNT0RFKCJNQURJIFNwZWVkIE1vZGUiLCAwKQogfTsKIAogc3RhdGljIHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNuZF9oZHNwbV9jb250cm9sc19haW9bXSA9IHsKQEAgLTYzODEsNiArNjQ4NSw3IEBACiAJc3dpdGNoIChoZHNwbS0+ZmlybXdhcmVfcmV2KSB7CiAJY2FzZSBIRFNQTV9NQURJX1JFVjoKIAljYXNlIEhEU1BNX01BRElfT0xEX1JFVjoKKwljYXNlIEhEU1BNX01BRElfQU5DSUVOVF9SRVY6CiAJCWhkc3BtLT5pb190eXBlID0gTUFESTsKIAkJaGRzcG0tPmNhcmRfbmFtZSA9ICJSTUUgTUFESSI7CiAJCWhkc3BtLT5taWRpUG9ydHMgPSAzOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3R4eDkvdHh4OWFjbGMuYyBiL3NvdW5kL3NvYy90eHg5L3R4eDlhY2xjLmMKaW5kZXggMzRhYTk3Mi4uM2RlOTlhZiAxMDA2NDQKLS0tIGEvc291bmQvc29jL3R4eDkvdHh4OWFjbGMuYworKysgYi9zb3VuZC9zb2MvdHh4OS90eHg5YWNsYy5jCkBAIC0yOTAsNiArMjkwLDcgQEAKIAogc3RhdGljIGludCB0eHg5YWNsY19wY21fbmV3KHN0cnVjdCBzbmRfc29jX3BjbV9ydW50aW1lICpydGQpCiB7CisJc3RydWN0IHNuZF9jYXJkICpjYXJkID0gcnRkLT5jYXJkLT5zbmRfY2FyZDsKIAlzdHJ1Y3Qgc25kX3NvY19kYWkgKmRhaSA9IHJ0ZC0+Y3B1X2RhaTsKIAlzdHJ1Y3Qgc25kX3BjbSAqcGNtID0gcnRkLT5wY207CiAJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiA9IHRvX3BsYXRmb3JtX2RldmljZShkYWktPnBsYXRmb3JtLT5kZXYpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvLmdpdGlnbm9yZSBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE4M2RkMgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyLy5naXRpZ25vcmUKQEAgLTAsMCArMSwyMiBAQAorLmxpYnMKK2xpYmNwdXBvd2VyLnNvCitsaWJjcHVwb3dlci5zby4wCitsaWJjcHVwb3dlci5zby4wLjAuMAorYnVpbGQvY2NkdgorY3B1ZnJlcS1pbmZvCitjcHVmcmVxLXNldAorY3B1ZnJlcS1hcGVyZgorbGliLy5saWJzCitsaWIvY3B1ZnJlcS5sbworbGliL2NwdWZyZXEubworbGliL3Byb2MubG8KK2xpYi9wcm9jLm8KK2xpYi9zeXNmcy5sbworbGliL3N5c2ZzLm8KK3BvL2NwdXBvd2VydXRpbHMucG90Citwby8qLmdtbwordXRpbHMvY3B1ZnJlcS1pbmZvLm8KK3V0aWxzL2NwdWZyZXEtc2V0Lm8KK3V0aWxzL2NwdWZyZXEtYXBlcmYubworY3B1cG93ZXIKK2JlbmNoL2NwdWZyZXEtYmVuY2gKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL01ha2VmaWxlIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRjMmNmMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL01ha2VmaWxlCkBAIC0wLDAgKzEsMjc5IEBACisjIE1ha2VmaWxlIGZvciBjcHVwb3dlcgorIworIyBDb3B5cmlnaHQgKEMpIDIwMDUsMjAwNiBEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAZG9taW5pa2Jyb2Rvd3NraS5uZXQ+CisjCisjIEJhc2VkIGxhcmdlbHkgb24gdGhlIE1ha2VmaWxlIGZvciB1ZGV2IGJ5OgorIworIyBDb3B5cmlnaHQgKEMpIDIwMDMsMjAwNCBHcmVnIEtyb2FoLUhhcnRtYW4gPGdyZWdAa3JvYWguY29tPgorIworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisjCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisjIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyMKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyMKKworIyAtLS0gQ09ORklHVVJBVElPTiBCRUdJTiAtLS0KKworIyBTZXQgdGhlIGZvbGxvd2luZyB0byBgdHJ1ZScgdG8gbWFrZSBhIHVuc3RyaXBwZWQsIHVub3B0aW1pemVkCisjIGJpbmFyeS4gTGVhdmUgdGhpcyBzZXQgdG8gYGZhbHNlJyBmb3IgcHJvZHVjdGlvbiB1c2UuCitERUJVRyA/PQlmYWxzZQorCisjIG1ha2UgdGhlIGJ1aWxkIHNpbGVudC4gU2V0IHRoaXMgdG8gc29tZXRoaW5nIGVsc2UgdG8gbWFrZSBpdCBub2lzeSBhZ2Fpbi4KK1YgPz0JCWZhbHNlCisKKyMgSW50ZXJuYXRpb25hbGl6YXRpb24gc3VwcG9ydCAob3V0cHV0IGluIGRpZmZlcmVudCBsYW5ndWFnZXMpLgorIyBSZXF1aXJlcyBnZXR0ZXh0LgorTkxTID89CQl0cnVlCisKKyMgU2V0IHRoZSBmb2xsb3dpbmcgdG8gJ3RydWUnIHRvIGJ1aWxkL2luc3RhbGwgdGhlCisjIGNwdWZyZXEtYmVuY2ggYmVuY2htYXJraW5nIHRvb2wKK0NQVUZSUV9CRU5DSCA/PSB0cnVlCisKKyMgUHJlZml4IHRvIHRoZSBkaXJlY3RvcmllcyB3ZSdyZSBpbnN0YWxsaW5nIHRvCitERVNURElSID89CisKKyMgLS0tIENPTkZJR1VSQVRJT04gRU5EIC0tLQorCisKKworIyBQYWNrYWdlLXJlbGF0ZWQgZGVmaW5pdGlvbnMuIERpc3RyaWJ1dGlvbnMgY2FuIG1vZGlmeSB0aGUgdmVyc2lvbgorIyBhbmQgX3Nob3VsZF8gbW9kaWZ5IHRoZSBQQUNLQUdFX0JVR1JFUE9SVCBkZWZpbml0aW9uCisKK1ZFUlNJT049CQkJJChzaGVsbCAuL3V0aWxzL3ZlcnNpb24tZ2VuLnNoKQorTElCX01BSj0JCQkwLjAuMAorTElCX01JTj0JCQkwCisKK1BBQ0tBR0UgPQkJCWNwdXBvd2VyCitQQUNLQUdFX0JVR1JFUE9SVCA9CQljcHVmcmVxQHZnZXIua2VybmVsLm9yZworTEFOR1VBR0VTID0gCQkJZGUgZnIgaXQgY3MgcHQKKworCisjIERpcmVjdG9yeSBkZWZpbml0aW9ucy4gVGhlc2UgYXJlIGRlZmF1bHQgYW5kIG1vc3QgcHJvYmFibHkKKyMgZG8gbm90IG5lZWQgdG8gYmUgY2hhbmdlZC4gUGxlYXNlIG5vdGUgdGhhdCBERVNURElSIGlzCisjIGFkZGVkIGluIGZyb250IG9mIGFueSBvZiB0aGVtCisKK2JpbmRpciA/PQkvdXNyL2Jpbgorc2JpbmRpciA/PQkvdXNyL3NiaW4KK21hbmRpciA/PQkvdXNyL21hbgoraW5jbHVkZWRpciA/PQkvdXNyL2luY2x1ZGUKK2xpYmRpciA/PQkvdXNyL2xpYgorbG9jYWxlZGlyID89CS91c3Ivc2hhcmUvbG9jYWxlCitkb2NkaXIgPz0gICAgICAgL3Vzci9zaGFyZS9kb2MvcGFja2FnZXMvY3B1cG93ZXIKK2NvbmZkaXIgPz0gICAgICAvZXRjLworCisjIFRvb2xjaGFpbjogd2hhdCB0b29scyBkbyB3ZSB1c2UsIGFuZCB3aGF0IG9wdGlvbnMgZG8gdGhleSBuZWVkOgorCitDUCA9IGNwIC1mcFIKK0lOU1RBTEwgPSAvdXNyL2Jpbi9pbnN0YWxsIC1jCitJTlNUQUxMX1BST0dSQU0gPSAke0lOU1RBTEx9CitJTlNUQUxMX0RBVEEgID0gJHtJTlNUQUxMfSAtbSA2NDQKK0lOU1RBTExfU0NSSVBUID0gJHtJTlNUQUxMX1BST0dSQU19CisKKyMgSWYgeW91IGFyZSBydW5uaW5nIGEgY3Jvc3MgY29tcGlsZXIsIHlvdSBtYXkgd2FudCB0byBzZXQgdGhpcworIyB0byBzb21ldGhpbmcgbW9yZSBpbnRlcmVzdGluZywgbGlrZSAiYXJtLWxpbnV4LSIuICBJZiB5b3Ugd2FudAorIyB0byBjb21waWxlIHZzIHVDbGliYywgdGhhdCBjYW4gYmUgZG9uZSBoZXJlIGFzIHdlbGwuCitDUk9TUyA9ICMvdXNyL2kzODYtbGludXgtdWNsaWJjL3Vzci9iaW4vaTM4Ni11Y2xpYmMtCitDQyA9ICQoQ1JPU1MpZ2NjCitMRCA9ICQoQ1JPU1MpZ2NjCitBUiA9ICQoQ1JPU1MpYXIKK1NUUklQID0gJChDUk9TUylzdHJpcAorUkFOTElCID0gJChDUk9TUylyYW5saWIKK0hPU1RDQyA9IGdjYworCisKKyMgTm93IHdlIHNldCB1cCB0aGUgYnVpbGQgc3lzdGVtCisjCisKKyMgc2V0IHVwIFBXRCBzbyB0aGF0IG9sZGVyIHZlcnNpb25zIG9mIG1ha2Ugd2lsbCB3b3JrIHdpdGggb3VyIGJ1aWxkLgorUFdEID0gJChzaGVsbCBwd2QpCisKK0dNT19GSUxFUyA9ICR7c2hlbGwgZm9yIEhMQU5HIGluICR7TEFOR1VBR0VTfTsgZG8gZWNobyBwby8kJEhMQU5HLmdtbzsgZG9uZTt9CisKK2V4cG9ydCBDUk9TUyBDQyBBUiBTVFJJUCBSQU5MSUIgQ0ZMQUdTIExERkxBR1MgTElCX09CSlMKKworIyBjaGVjayBpZiBjb21waWxlciBvcHRpb24gaXMgc3VwcG9ydGVkCitjYy1zdXBwb3J0cyA9ICR7c2hlbGwgaWYgJChDQykgJHsxfSAtUyAtbyAvZGV2L251bGwgLXhjIC9kZXYvbnVsbCA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuIGVjaG8gIiQoMSkiOyBmaTt9CisKKyMgdXNlICctT3MnIG9wdGltaXphdGlvbiBpZiBhdmFpbGFibGUsIGVsc2UgdXNlIC1PMgorT1BUSU1JWkFUSU9OIDo9ICQoY2FsbCBjYy1zdXBwb3J0cywtT3MsLU8yKQorCitXQVJOSU5HUyA6PSAtV2FsbCAtV2NoYXItc3Vic2NyaXB0cyAtV3BvaW50ZXItYXJpdGggLVdzaWduLWNvbXBhcmUKK1dBUk5JTkdTICs9ICQoY2FsbCBjYy1zdXBwb3J0cywtV25vLXBvaW50ZXItc2lnbikKK1dBUk5JTkdTICs9ICQoY2FsbCBjYy1zdXBwb3J0cywtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCkKK1dBUk5JTkdTICs9IC1Xc2hhZG93CisKK0NGTEFHUyArPSAtRFZFUlNJT049XCIkKFZFUlNJT04pXCIgLURQQUNLQUdFPVwiJChQQUNLQUdFKVwiIFwKKwkJLURQQUNLQUdFX0JVR1JFUE9SVD1cIiQoUEFDS0FHRV9CVUdSRVBPUlQpXCIgLURfR05VX1NPVVJDRQorCitVVElMX09CSlMgPSAgdXRpbHMvaGVscGVycy9hbWQubyB1dGlscy9oZWxwZXJzL3RvcG9sb2d5Lm8gdXRpbHMvaGVscGVycy9tc3IubyBcCisJdXRpbHMvaGVscGVycy9zeXNmcy5vIHV0aWxzL2hlbHBlcnMvbWlzYy5vIHV0aWxzL2hlbHBlcnMvY3B1aWQubyBcCisJdXRpbHMvaGVscGVycy9wY2kubyB1dGlscy9oZWxwZXJzL2JpdG1hc2subyBcCisJdXRpbHMvaWRsZV9tb25pdG9yL25obV9pZGxlLm8gdXRpbHMvaWRsZV9tb25pdG9yL3NuYl9pZGxlLm8gXAorCXV0aWxzL2lkbGVfbW9uaXRvci9hbWRfZmFtMTRoX2lkbGUubyB1dGlscy9pZGxlX21vbml0b3IvY3B1aWRsZV9zeXNmcy5vIFwKKwl1dGlscy9pZGxlX21vbml0b3IvbXBlcmZfbW9uaXRvci5vIHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLm8gXAorCXV0aWxzL2NwdXBvd2VyLm8gdXRpbHMvY3B1ZnJlcS1pbmZvLm8gdXRpbHMvY3B1ZnJlcS1zZXQubyBcCisJdXRpbHMvY3B1cG93ZXItc2V0Lm8gdXRpbHMvY3B1cG93ZXItaW5mby5vIHV0aWxzL2NwdWlkbGUtaW5mby5vCisKK1VUSUxfSEVBREVSUyA9IHV0aWxzL2hlbHBlcnMvaGVscGVycy5oIHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmggXAorCXV0aWxzL2hlbHBlcnMvYml0bWFzay5oIFwKKwl1dGlscy9pZGxlX21vbml0b3IvaWRsZV9tb25pdG9ycy5oIHV0aWxzL2lkbGVfbW9uaXRvci9pZGxlX21vbml0b3JzLmRlZgorCitVVElMX1NSQyA6PSAkKFVUSUxfT0JKUzoubz0uYykKKworTElCX0hFQURFUlMgPSAJbGliL2NwdWZyZXEuaCBsaWIvc3lzZnMuaAorTElCX1NSQyA9IAlsaWIvY3B1ZnJlcS5jIGxpYi9zeXNmcy5jCitMSUJfT0JKUyA9IAlsaWIvY3B1ZnJlcS5vIGxpYi9zeXNmcy5vCisKK0NGTEFHUyArPQktcGlwZQorCitpZmVxICgkKHN0cmlwICQoTkxTKSksdHJ1ZSkKKwlJTlNUQUxMX05MUyArPSBpbnN0YWxsLWdtbworCUNPTVBJTEVfTkxTICs9IGNyZWF0ZS1nbW8KK2VuZGlmCisKK2lmZXEgKCQoc3RyaXAgJChDUFVGUlFfQkVOQ0gpKSx0cnVlKQorCUlOU1RBTExfQkVOQ0ggKz0gaW5zdGFsbC1iZW5jaAorCUNPTVBJTEVfQkVOQ0ggKz0gY29tcGlsZS1iZW5jaAorZW5kaWYKKworQ0ZMQUdTICs9ICQoV0FSTklOR1MpCisKK2lmZXEgKCQoc3RyaXAgJChWKSksZmFsc2UpCisJUVVJRVQ9QAorCUVDSE89QGVjaG8KK2Vsc2UKKwlRVUlFVD0KKwlFQ0hPPUBcIworZW5kaWYKK2V4cG9ydCBRVUlFVCBFQ0hPCisKKyMgaWYgREVCVUcgaXMgZW5hYmxlZCwgdGhlbiB3ZSBkbyBub3Qgc3RyaXAgb3Igb3B0aW1pemUKK2lmZXEgKCQoc3RyaXAgJChERUJVRykpLHRydWUpCisJQ0ZMQUdTICs9IC1PMSAtZyAtRERFQlVHCisJU1RSSVBDTUQgPSAvYmluL3RydWUgLVNpbmNlX3dlX2FyZV9kZWJ1Z2dpbmcKK2Vsc2UKKwlDRkxBR1MgKz0gJChPUFRJTUlaQVRJT04pIC1mb21pdC1mcmFtZS1wb2ludGVyCisJU1RSSVBDTUQgPSAkKFNUUklQKSAtcyAtLXJlbW92ZS1zZWN0aW9uPS5ub3RlIC0tcmVtb3ZlLXNlY3Rpb249LmNvbW1lbnQKK2VuZGlmCisKKworIyB0aGUgYWN0dWFsIG1ha2UgcnVsZXMKKworYWxsOiBsaWJjcHVwb3dlciBjcHVwb3dlciAkKENPTVBJTEVfTkxTKSAkKENPTVBJTEVfQkVOQ0gpCisKK2xpYi8lLm86ICQoTElCX1NSQykgJChMSUJfSEVBREVSUykKKwkkKEVDSE8pICIgIENDICAgICAgIiAkQAorCSQoUVVJRVQpICQoQ0MpICQoQ0ZMQUdTKSAtZlBJQyAtbyAkQCAtYyBsaWIvJCouYworCitsaWJjcHVwb3dlci5zby4kKExJQl9NQUopOiAkKExJQl9PQkpTKQorCSQoRUNITykgIiAgTEQgICAgICAiICRACisJJChRVUlFVCkgJChDQykgLXNoYXJlZCAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkQCBcCisJCS1XbCwtc29uYW1lLGxpYmNwdXBvd2VyLnNvLiQoTElCX01JTikgJChMSUJfT0JKUykKKwlAbG4gLXNmICRAIGxpYmNwdXBvd2VyLnNvCisJQGxuIC1zZiAkQCBsaWJjcHVwb3dlci5zby4kKExJQl9NSU4pCisKK2xpYmNwdXBvd2VyOiBsaWJjcHVwb3dlci5zby4kKExJQl9NQUopCisKKyMgTGV0IGFsbCAubyBmaWxlcyBkZXBlbmQgb24gaXRzIC5jIGZpbGUgYW5kIGFsbCBoZWFkZXJzCisjIE1pZ2h0IGJlIHdvcnRoIHRvIHB1dCB0aGlzIGludG8gdXRpbHMvTWFrZWZpbGUgYXQgc29tZSBwb2ludCBvZiB0aW1lCiskKFVUSUxfT0JKUyk6ICQoVVRJTF9IRUFERVJTKQorCisuYy5vOgorCSQoRUNITykgIiAgQ0MgICAgICAiICRACisJJChRVUlFVCkgJChDQykgJChDRkxBR1MpIC1JLi9saWIgLUkgLi91dGlscyAtbyAkQCAtYyAkKi5jCisKK2NwdXBvd2VyOiAkKFVUSUxfT0JKUykgbGliY3B1cG93ZXIuc28uJChMSUJfTUFKKQorCSQoRUNITykgIiAgQ0MgICAgICAiICRACisJJChRVUlFVCkgJChDQykgJChDRkxBR1MpICQoTERGTEFHUykgLWxjcHVwb3dlciAtbHJ0IC1scGNpIC1MLiAtbyAkQCAkKFVUSUxfT0JKUykKKwkkKFFVSUVUKSAkKFNUUklQQ01EKSAkQAorCitwby8kKFBBQ0tBR0UpLnBvdDogJChVVElMX1NSQykKKwkkKEVDSE8pICIgIEdFVFRFWFQgIiAkQAorCSQoUVVJRVQpIHhnZXR0ZXh0IC0tZGVmYXVsdC1kb21haW49JChQQUNLQUdFKSAtLWFkZC1jb21tZW50cyBcCisJCS0ta2V5d29yZD1fIC0ta2V5d29yZD1OXyAkKFVUSUxfU1JDKSAmJiBcCisJdGVzdCAtZiAkKFBBQ0tBR0UpLnBvICYmIFwKKwltdiAtZiAkKFBBQ0tBR0UpLnBvIHBvLyQoUEFDS0FHRSkucG90CisKK3BvLyUuZ21vOiBwby8lLnBvCisJJChFQ0hPKSAiICBNU0dGTVQgICIgJEAKKwkkKFFVSUVUKSBtc2dmbXQgLW8gJEAgcG8vJCoucG8KKworY3JlYXRlLWdtbzogJHtHTU9fRklMRVN9CisKK3VwZGF0ZS1wbzogcG8vJChQQUNLQUdFKS5wb3QKKwkkKEVDSE8pICIgIE1TR01SRyAgIiAkQAorCSQoUVVJRVQpIEBmb3IgSExBTkcgaW4gJChMQU5HVUFHRVMpOyBkbyBcCisJCWVjaG8gLW4gIlVwZGF0aW5nICQkSExBTkcgIjsgXAorCQlpZiBtc2dtZXJnZSBwby8kJEhMQU5HLnBvIHBvLyQoUEFDS0FHRSkucG90IC1vIFwKKwkJICAgcG8vJCRITEFORy5uZXcucG87IHRoZW4gXAorCQkJbXYgLWYgcG8vJCRITEFORy5uZXcucG8gcG8vJCRITEFORy5wbzsgXAorCQllbHNlIFwKKwkJCWVjaG8gIm1zZ21lcmdlIGZvciAkJEhMQU5HIGZhaWxlZCEiOyBcCisJCQlybSAtZiBwby8kJEhMQU5HLm5ldy5wbzsgXAorCQlmaTsgXAorCWRvbmU7CisKK2NvbXBpbGUtYmVuY2g6IGxpYmNwdXBvd2VyLnNvLiQoTElCX01BSikKKwlAVj0kKFYpIGNvbmZkaXI9JChjb25mZGlyKSAkKE1BS0UpIC1DIGJlbmNoCisKK2NsZWFuOgorCS1maW5kIC4gXCggLW5vdCAtdHlwZSBkIFwpIC1hbmQgXCggLW5hbWUgJyp+JyAtbyAtbmFtZSAnKi5bb2FzXScgXCkgLXR5cGUgZiAtcHJpbnQgXAorCSB8IHhhcmdzIHJtIC1mCisJLXJtIC1mICQoVVRJTF9CSU5TKQorCS1ybSAtZiAkKElETEVfT0JKUykKKwktcm0gLWYgY3B1cG93ZXIKKwktcm0gLWYgbGliY3B1cG93ZXIuc28qCisJLXJtIC1yZiBwby8qLmdtbyBwby8qLnBvdAorCSQoTUFLRSkgLUMgYmVuY2ggY2xlYW4KKworCitpbnN0YWxsLWxpYjoKKwkkKElOU1RBTEwpIC1kICQoREVTVERJUikke2xpYmRpcn0KKwkkKENQKSBsaWJjcHVwb3dlci5zbyogJChERVNURElSKSR7bGliZGlyfS8KKwkkKElOU1RBTEwpIC1kICQoREVTVERJUikke2luY2x1ZGVkaXJ9CisJJChJTlNUQUxMX0RBVEEpIGxpYi9jcHVmcmVxLmggJChERVNURElSKSR7aW5jbHVkZWRpcn0vY3B1ZnJlcS5oCisKK2luc3RhbGwtdG9vbHM6CisJJChJTlNUQUxMKSAtZCAkKERFU1RESVIpJHtiaW5kaXJ9CisJJChJTlNUQUxMX1BST0dSQU0pIGNwdXBvd2VyICQoREVTVERJUikke2JpbmRpcn0KKworaW5zdGFsbC1tYW46CisJJChJTlNUQUxMX0RBVEEpIC1EIG1hbi9jcHVwb3dlci4xICQoREVTVERJUikke21hbmRpcn0vbWFuMS9jcHVwb3dlci4xCisJJChJTlNUQUxMX0RBVEEpIC1EIG1hbi9jcHVwb3dlci1mcmVxdWVuY3ktc2V0LjEgJChERVNURElSKSR7bWFuZGlyfS9tYW4xL2NwdXBvd2VyLWZyZXF1ZW5jeS1zZXQuMQorCSQoSU5TVEFMTF9EQVRBKSAtRCBtYW4vY3B1cG93ZXItZnJlcXVlbmN5LWluZm8uMSAkKERFU1RESVIpJHttYW5kaXJ9L21hbjEvY3B1cG93ZXItZnJlcXVlbmN5LWluZm8uMQorCSQoSU5TVEFMTF9EQVRBKSAtRCBtYW4vY3B1cG93ZXItc2V0LjEgJChERVNURElSKSR7bWFuZGlyfS9tYW4xL2NwdXBvd2VyLXNldC4xCisJJChJTlNUQUxMX0RBVEEpIC1EIG1hbi9jcHVwb3dlci1pbmZvLjEgJChERVNURElSKSR7bWFuZGlyfS9tYW4xL2NwdXBvd2VyLWluZm8uMQorCSQoSU5TVEFMTF9EQVRBKSAtRCBtYW4vY3B1cG93ZXItbW9uaXRvci4xICQoREVTVERJUikke21hbmRpcn0vbWFuMS9jcHVwb3dlci1tb25pdG9yLjEKKworaW5zdGFsbC1nbW86CisJJChJTlNUQUxMKSAtZCAkKERFU1RESVIpJHtsb2NhbGVkaXJ9CisJZm9yIEhMQU5HIGluICQoTEFOR1VBR0VTKTsgZG8gXAorCQllY2hvICckKElOU1RBTExfREFUQSkgLUQgcG8vJCRITEFORy5nbW8gJChERVNURElSKSR7bG9jYWxlZGlyfS8kJEhMQU5HL0xDX01FU1NBR0VTL2NwdXBvd2VyLm1vJzsgXAorCQkkKElOU1RBTExfREFUQSkgLUQgcG8vJCRITEFORy5nbW8gJChERVNURElSKSR7bG9jYWxlZGlyfS8kJEhMQU5HL0xDX01FU1NBR0VTL2NwdXBvd2VyLm1vOyBcCisJZG9uZTsKKworaW5zdGFsbC1iZW5jaDoKKwlAI0RFU1RESVIgbXVzdCBiZSBzZXQgZnJvbSBvdXRzaWRlIHRvIHN1cnZpdmUKKwlAc2JpbmRpcj0kKHNiaW5kaXIpIGJpbmRpcj0kKGJpbmRpcikgZG9jZGlyPSQoZG9jZGlyKSBjb25mZGlyPSQoY29uZmRpcikgJChNQUtFKSAtQyBiZW5jaCBpbnN0YWxsCisKK2luc3RhbGw6IGFsbCBpbnN0YWxsLWxpYiBpbnN0YWxsLXRvb2xzIGluc3RhbGwtbWFuICQoSU5TVEFMTF9OTFMpICQoSU5TVEFMTF9CRU5DSCkKKwordW5pbnN0YWxsOgorCS0gcm0gLWYgJChERVNURElSKSR7bGliZGlyfS9saWJjcHVwb3dlci4qCisJLSBybSAtZiAkKERFU1RESVIpJHtpbmNsdWRlZGlyfS9jcHVmcmVxLmgKKwktIHJtIC1mICQoREVTVERJUikke2JpbmRpcn0vdXRpbHMvY3B1cG93ZXIKKwktIHJtIC1mICQoREVTVERJUikke21hbmRpcn0vbWFuMS9jcHVmcmVxLXNldC4xCisJLSBybSAtZiAkKERFU1RESVIpJHttYW5kaXJ9L21hbjEvY3B1ZnJlcS1pbmZvLjEKKwktIGZvciBITEFORyBpbiAkKExBTkdVQUdFUyk7IGRvIFwKKwkJcm0gLWYgJChERVNURElSKSR7bG9jYWxlZGlyfS8kJEhMQU5HL0xDX01FU1NBR0VTL2NwdXBvd2VyLm1vOyBcCisJICBkb25lOworCisuUEhPTlk6IGFsbCB1dGlscyBsaWJjcHVwb3dlciB1cGRhdGUtcG8gY3JlYXRlLWdtbyBpbnN0YWxsLWxpYiBpbnN0YWxsLXRvb2xzIGluc3RhbGwtbWFuIGluc3RhbGwtZ21vIGluc3RhbGwgdW5pbnN0YWxsIGNsZWFuCmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci9SRUFETUUgYi90b29scy9wb3dlci9jcHVwb3dlci9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ5ZDRjMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL1JFQURNRQpAQCAtMCwwICsxLDQ5IEBACitUaGUgY3B1ZnJlcXV0aWxzIHBhY2thZ2UgKGhvbWVwYWdlOiAKK2h0dHA6Ly93d3cua2VybmVsLm9yZy9wdWIvbGludXgvdXRpbHMva2VybmVsL2NwdWZyZXEvY3B1ZnJlcXV0aWxzLmh0bWwgKSAKK2NvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgZWxlbWVudHM6CisKK3JlcXVpcmVtZW50cworLS0tLS0tLS0tLS0tCisKK09uIHg4NiBwY2l1dGlscyBpcyBuZWVkZWQgYXQgcnVudGltZSAoLWxwY2kpLgorRm9yIGNvbXBpbGF0aW9uIHBjaXV0aWxzLWRldmVsIChwY2kvcGNpLmgpIGFuZCBhIGdjYyB2ZXJzaW9uCitwcm92aWRpbmcgY3B1aWQuaCBpcyBuZWVkZWQuCitGb3IgYm90aCBpdCdzIG5vdCBleHBsaWNpdGx5IGNoZWNrZWQgZm9yICh5ZXQpLgorCisKK2xpYmNwdWZyZXEKKy0tLS0tLS0tLS0KKworImxpYmNwdWZyZXEiIGlzIGEgbGlicmFyeSB3aGljaCBvZmZlcnMgYSB1bmlmaWVkIGFjY2VzcyBtZXRob2QgZm9yIHVzZXJzcGFjZQordG9vbHMgYW5kIHByb2dyYW1zIHRvIHRoZSBjcHVmcmVxIGNvcmUgYW5kIGRyaXZlcnMgaW4gdGhlIExpbnV4IGtlcm5lbC4gVGhpcworYWxsb3dzIGZvciBjb2RlIHJlZHVjdGlvbiBpbiB1c2Vyc3BhY2UgdG9vbHMsIGEgY2xlYW4gaW1wbGVtZW50YXRpb24gb2YKK3RoZSBpbnRlcmFjdGlvbiB0byB0aGUgY3B1ZnJlcSBjb3JlLCBhbmQgc3VwcG9ydCBmb3IgYm90aCB0aGUgc3lzZnMgYW5kIHByb2MKK2ludGVyZmFjZXMgW2RlcGVuZGluZyBvbiBjb25maWd1cmF0aW9uLCBzZWUgYmVsb3ddLgorCisKK2NvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworbWFrZQorc3UKK21ha2UgaW5zdGFsbAorCitzaG91bGQgc3VmZmljZSBvbiBtb3N0IHN5c3RlbXMuIEl0IGJ1aWxkcyBkZWZhdWx0IGxpYmNwdWZyZXEsCitjcHVmcmVxLXNldCBhbmQgY3B1ZnJlcS1pbmZvIGZpbGVzIGFuZCBpbnN0YWxscyB0aGVtIGluIC91c3IvbGliIGFuZAorL3Vzci9iaW4sIHJlc3BlY3RpdmVseS4gSWYgeW91IHdhbnQgdG8gc2V0IHVwIHRoZSBwYXRocyBkaWZmZXJlbnRseSBhbmQvb3IKK3dhbnQgdG8gY29uZmlndXJlIHRoZSBwYWNrYWdlIHRvIHlvdXIgc3BlY2lmaWMgbmVlZHMsIHlvdSBuZWVkIHRvIG9wZW4KKyJNYWtlZmlsZSIgd2l0aCBhbiBlZGl0b3Igb2YgeW91ciBjaG9pY2UgYW5kIGVkaXQgdGhlIGJsb2NrIG1hcmtlZAorQ09ORklHVVJBVElPTi4KKworCitUSEFOS1MKKy0tLS0tLQorTWFueSB0aGFua3MgdG8gTWF0dGlhIERvbmdpbGkgd2hvIHdyb3RlIHRoZSBhdXRvdG9vbGl6YXRpb24gYW5kCitsaWJ0b29saXphdGlvbiwgdGhlIG1hbnBhZ2VzIGFuZCB0aGUgaXRhbGlhbiBsYW5ndWFnZSBmaWxlIGZvciBjcHVmcmVxdXRpbHM7Cit0byBEYXZlIEpvbmVzIGZvciBoaXMgZmVlZGJhY2sgYW5kIGhpcyBkdW1wX3BzYiB0b29sOyB0byBCcnVubyBEdWNyb3QgZm9yIGhpcworcG93ZXJub3ctazgtZGVjb2RlIGFuZCBpbnRlbF9nc2ljIHRvb2xzIGFzIHdlbGwgYXMgdGhlIGZyZW5jaCBsYW5ndWFnZSBmaWxlOworYW5kIHRvIHZhcmlvdXMgb3RoZXJzIGNvbW1lbnRpbmcgb24gdGhlIHByZXZpb3VzIChwcmUtKXJlbGVhc2VzIG9mIAorY3B1ZnJlcXV0aWxzLgorCisKKyAgICAgICAgRG9taW5payBCcm9kb3dza2kKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL1RvRG8gYi90b29scy9wb3dlci9jcHVwb3dlci9Ub0RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NGI3OGIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci9Ub0RvCkBAIC0wLDAgKzEsMTEgQEAKK1RvRG9zIHNvcnRlZCBieSBwcmlvcml0eToKKworLSBVc2UgYml0bWFzayBmdW5jdGlvbnMgdG8gcGFyc2UgQ1BVIHRvcG9sb2d5IG1vcmUgcm9idXN0CisgIChjdXJyZW50IGltcGxlbWVudGF0aW9uIGhhcyBpc3N1ZXMgb24gQU1EKQorLSBUcnkgdG8gcmVhZCBvdXQgYm9vc3Qgc3RhdGVzIGFuZCBmcmVxdWVuY2llcyBvbiBJbnRlbAorLSBBZGp1c3QgUkVBRE1FCistIFNvbWV3aGVyZSBzYXcgdGhlIGFiaWxpdHkgdG8gcmVhZCBwb3dlciBjb25zdW1wdGlvbiBvZgorICBSQU0gZnJvbSBIVyBvbiBJbnRlbCBTYW5keUJyaWRnZSAtPiBhbm90aGVyIG1vbml0b3I/CistIEFkZCBhbm90aGVyIGMxZSBkZWJ1ZyBpZGxlIG1vbml0b3IKKyAgLT4gSXMgYnkgZGVzaWduIHJhY3kgd2l0aCBCSU9TLCBidXQgY291bGQgYmUgYWRkZWQKKyAgICAgd2l0aCBhIC0tZm9yY2Ugb3B0aW9uIGFuZCBzb21lICJiZSBjYXJlZnVsIiBtZXNzYWdlcwpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvYmVuY2gvTWFrZWZpbGUgYi90b29scy9wb3dlci9jcHVwb3dlci9iZW5jaC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjY3NjA2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvYmVuY2gvTWFrZWZpbGUKQEAgLTAsMCArMSwyOSBAQAorTElCUyA9IC1MLi4vIC1sbSAtbGNwdXBvd2VyCisKK09CSlMgPSBtYWluLm8gcGFyc2UubyBzeXN0ZW0ubyBiZW5jaG1hcmsubworQ0ZMQUdTICs9IC1EX0dOVV9TT1VSQ0UgLUkuLi9saWIgLURERUZBVUxUX0NPTkZJR19GSUxFPVwiJChjb25mZGlyKS9jcHVmcmVxLWJlbmNoLmNvbmZcIgorCislLm8gOiAlLmMKKwkkKEVDSE8pICIgIENDICAgICAgIiAkQAorCSQoUVVJRVQpICQoQ0MpIC1jICQoQ0ZMQUdTKSAkPCAtbyAkQAorCitjcHVmcmVxLWJlbmNoOiAkKE9CSlMpCisJJChFQ0hPKSAiICBDQyAgICAgICIgJEAKKwkkKFFVSUVUKSAkKENDKSAtbyAkQCAkKENGTEFHUykgJChPQkpTKSAkKExJQlMpCisKK2FsbDogY3B1ZnJlcS1iZW5jaAorCitpbnN0YWxsOgorCW1rZGlyIC1wICQoREVTVERJUikvJChzYmluZGlyKQorCW1rZGlyIC1wICQoREVTVERJUikvJChiaW5kaXIpCisJbWtkaXIgLXAgJChERVNURElSKS8kKGRvY2RpcikKKwlta2RpciAtcCAkKERFU1RESVIpLyQoY29uZmRpcikKKwlpbnN0YWxsIC1tIDc1NSBjcHVmcmVxLWJlbmNoICQoREVTVERJUikvJChzYmluZGlyKS9jcHVmcmVxLWJlbmNoCisJaW5zdGFsbCAtbSA3NTUgY3B1ZnJlcS1iZW5jaF9wbG90LnNoICQoREVTVERJUikvJChiaW5kaXIpL2NwdWZyZXEtYmVuY2hfcGxvdC5zaAorCWluc3RhbGwgLW0gNjQ0IFJFQURNRS1CRU5DSCAkKERFU1RESVIpLyQoZG9jZGlyKS9SRUFETUUtQkVOQ0gKKwlpbnN0YWxsIC1tIDc1NSBjcHVmcmVxLWJlbmNoX3NjcmlwdC5zaCAkKERFU1RESVIpLyQoZG9jZGlyKS9jcHVmcmVxLWJlbmNoX3NjcmlwdC5zaAorCWluc3RhbGwgLW0gNjQ0IGV4YW1wbGUuY2ZnICQoREVTVERJUikvJChjb25mZGlyKS9jcHVmcmVxLWJlbmNoLmNvbmYKKworY2xlYW46CisJcm0gLWYgKi5vCisJcm0gLWYgY3B1ZnJlcS1iZW5jaApkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvYmVuY2gvUkVBRE1FLUJFTkNIIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvYmVuY2gvUkVBRE1FLUJFTkNICm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwOTNlYzcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci9iZW5jaC9SRUFETUUtQkVOQ0gKQEAgLTAsMCArMSwxMjQgQEAKK1RoaXMgaXMgY3B1ZnJlcS1iZW5jaCwgYSBtaWNyb2JlbmNobWFyayBmb3IgdGhlIGNwdWZyZXEgZnJhbWV3b3JrLgorCitQdXJwb3NlCis9PT09PT09CisKK1doYXQgaXMgdGhpcyBiZW5jaG1hcmsgZm9yOgorICAtIElkZW50aWZ5IHdvcnN0IGNhc2UgcGVyZm9ybWFuY2UgbG9zcyB3aGVuIGRvaW5nIGR5bmFtaWMgZnJlcXVlbmN5CisgICAgc2NhbGluZyB1c2luZyBMaW51eCBrZXJuZWwgZ292ZXJub3JzCisgIC0gSWRlbnRpZnkgYXZlcmFnZSByZWFjdGlvbiB0aW1lIG9mIGEgZ292ZXJub3IgdG8gQ1BVIGxvYWQgY2hhbmdlcworICAtIChTdHJlc3MpIFRlc3Rpbmcgd2hldGhlciBhIGNwdWZyZXEgbG93IGxldmVsIGRyaXZlciBvciBnb3Zlcm5vciB3b3JrcworICAgIGFzIGV4cGVjdGVkCisgIC0gSWRlbnRpZnkgY3B1ZnJlcSByZWxhdGVkIHBlcmZvcm1hbmNlIHJlZ3Jlc3Npb25zIGJldHdlZW4ga2VybmVscworICAtIFBvc3NpYmx5IFJlYWwgdGltZSBwcmlvcml0eSB0ZXN0aW5nPyAtPiB3aGF0IGhhcHBlbnMgaWYgdGhlcmUgYXJlCisgICAgcHJvY2Vzc2VzIHdpdGggYSBoaWdoZXIgcHJpbyB0aGFuIHRoZSBnb3Zlcm5vcidzIGtlcm5lbCB0aHJlYWQKKyAgLSAuLi4KKworV2hhdCB0aGlzIGJlbmNobWFyayBkb2VzICpub3QqIGNvdmVyOgorICAtIFBvd2VyIHNhdmluZyByZWxhdGVkIHJlZ3Jlc3Npb25zIChJbiBmYWN0IGFzIGJldHRlciB0aGUgcGVyZm9ybWFuY2UKKyAgICB0aHJvdWdocHV0IGlzLCB0aGUgd29yc2UgdGhlIHBvd2VyIHNhdmluZ3Mgd2lsbCBiZSwgYnV0IHRoZSBmaXJzdCBzaG91bGQKKyAgICBtb3N0bHkgY291bnQgbW9yZS4uLikKKyAgLSBSZWFsIHdvcmxkICh3b3JrbG9hZHMpCisKKworRGVzY3JpcHRpb24KKz09PT09PT09PT09CisKK2NwdWZyZXEtYmVuY2ggaGVscHMgdG8gdGVzdCB0aGUgY29uZGl0aW9uIG9mIGEgZ2l2ZW4gY3B1ZnJlcSBnb3Zlcm5vci4KK0ZvciB0aGF0IHB1cnBvc2UsIGl0IGNvbXBhcmVzIHRoZSBwZXJmb3JtYW5jZSBnb3Zlcm5vciB0byBhIGNvbmZpZ3VyZWQKK3Bvd2Vyc2F2ZSBtb2R1bGUuCisKKworSG93IGl0IHdvcmtzCis9PT09PT09PT09PT0KK1lvdSBjYW4gc3BlY2lmeSBsb2FkICgxMDAlIENQVSBsb2FkKSBhbmQgc2xlZXAgKDAlIENQVSBsb2FkKSB0aW1lcyBpbiB1cyB3aGljaAord2lsbCBiZSBydW4gWCB0aW1lIGluIGEgcm93IChjeWNsZXMpOgorCisgICAgICAgICBzbGVlcD0yNTAwMAorICAgICAgICAgbG9hZD0yNTAwMAorICAgICAgICAgY3ljbGVzPTIwCisKK1RoaXMgcGFydCBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHdpbGwgY3JlYXRlIDI1bXMgbG9hZC9zbGVlcCB0dXJucywKK3JlcGVhdGVkIDIwIHRpbWVzLgorCitBZGRpbmcgdGhpczoKKyAgICAgICAgIHNsZWVwX3N0ZXA9MjUwMDAKKyAgICAgICAgIGxvYWRfc3RlcD0yNTAwMAorICAgICAgICAgcm91bmRzPTUKK1dpbGwgaW5jcmVhc2UgbG9hZCBhbmQgc2xlZXAgdGltZSBieSAyNW1zIDUgdGltZXMuCitUb2dldGhlciB5b3UgZ2V0IGZvbGxvd2luZyB0ZXN0OgorMjVtcyAgbG9hZC9zbGVlcCB0aW1lIHJlcGVhdGVkIDIwIHRpbWVzIChjeWNsZXMpLgorNTBtcyAgbG9hZC9zbGVlcCB0aW1lIHJlcGVhdGVkIDIwIHRpbWVzIChjeWNsZXMpLgorLi4KKzEwMG1zIGxvYWQvc2xlZXAgdGltZSByZXBlYXRlZCAyMCB0aW1lcyAoY3ljbGVzKS4KKworRmlyc3QgaXQgaXMgY2FsaWJyYXRlZCBob3cgbG9uZyBhIHNwZWNpZmljIENQVSBpbnRlbnNpdmUgY2FsY3VsYXRpb24KK3Rha2VzIG9uIHRoaXMgbWFjaGluZSBhbmQgbmVlZHMgdG8gYmUgcnVuIGluIGEgbG9vcCB1c2luZyB0aGUgcGVyZm9ybWFuY2UKK2dvdmVybm9yLgorVGhlbiB0aGUgYWJvdmUgdGVzdCBydW5zIGFyZSBwcm9jZXNzZWQgdXNpbmcgdGhlIHBlcmZvcm1hbmNlIGdvdmVybm9yCithbmQgdGhlIGdvdmVybm9yIHRvIHRlc3QuIFRoZSB0aW1lIHRoZSBjYWxjdWxhdGlvbiByZWFsbHkgbmVlZGVkCit3aXRoIHRoZSBkeW5hbWljIGZyZXEgc2NhbGluZyBnb3Zlcm5vciBpcyBjb21wYXJlZCB3aXRoIHRoZSB0aW1lIG5lZWRlZAorb24gZnVsbCBwZXJmb3JtYW5jZSBhbmQgeW91IGdldCB0aGUgb3ZlcmFsbCBwZXJmb3JtYW5jZSBsb3NzLgorCisKK0V4YW1wbGUgb2YgZXhwZWN0ZWQgcmVzdWx0cyB3aXRoIG9uZGVtYW5kIGdvdmVybm9yOgorCitUaGlzIHNob3dzIGV4cGVjdGVkIHJlc3VsdHMgb2YgdGhlIGZpcnN0IHR3byB0ZXN0IHJ1biByb3VuZHMgZnJvbQorYWJvdmUgY29uZmlnLCB5b3UgdGhlcmUgaGF2ZToKKworMTAwJSBDUFUgbG9hZCAobG9hZCkgfCAwICUgQ1BVIGxvYWQgKHNsZWVwKSAgfCByb3VuZAorICAgMjUgbXMgICAgICAgICAgICAgfCAgICAyNSBtcyAgICAgICAgICAgICAgfCAgIDEKKyAgIDUwIG1zICAgICAgICAgICAgIHwgICAgNTAgbXMgICAgICAgICAgICAgIHwgICAyCisKK0ZvciBleGFtcGxlIGlmIG9uZGVtYW5kIGdvdmVybm9yIGlzIGNvbmZpZ3VyZWQgdG8gaGF2ZSBhIDUwbXMKK3NhbXBsaW5nIHJhdGUgeW91IGdldDoKKworSW4gcm91bmQgMSwgb25kZW1hbmQgc2hvdWxkIGhhdmUgcmF0aGVyIHN0YXRpYyA1MCUgbG9hZCBhbmQgcHJvYmFibHkKK3dvbid0IGV2ZXIgc3dpdGNoIHVwIChhcyBsb25nIGFzIHVwX3RocmVzaG9sZCBpcyBhYm92ZSkuCisKK0luIHJvdW5kIDIsIGlmIHRoZSBvbmRlbWFuZCBzYW1wbGluZyB0aW1lcyBleGFjdGx5IG1hdGNoIHRoZSBsb2FkL3NsZWVwCit0cmlnZ2VyIG9mIHRoZSBjcHVmcmVxLWJlbmNoLCB5b3Ugd2lsbCBzZWUgbm8gcGVyZm9ybWFuY2UgbG9zcyAoY29tcGFyZSB3aXRoCitiZWxvdyBwb3NzaWJsZSBvbmRlbWFuZCBzYW1wbGUga2ljayBpbnMgKDEpKToKKworQnV0IGlmIG9uZGVtYW5kIGFsd2F5cyBraWNrcyBpbiBpbiB0aGUgbWlkZGxlIG9mIHRoZSBsb2FkIHNsZWVwIGN5Y2xlcywgaXQKK3dpbGwgYWx3YXlzIHNlZSA1MCUgbG9hZHMgYW5kIHlvdSBnZXQgd29yc3QgcGVyZm9ybWFuY2UgaW1wYWN0IG5ldmVyCitzd2l0Y2hpbmcgdXAgKGNvbXBhcmUgd2l0aCBiZWxvdyBwb3NzaWJsZSBvbmRlbWFuZCBzYW1wbGUga2ljayBpbnMgKDIpKTo6CisKKyAgICAgIDUwICAgICA1MCAgIDUwICAgNTBtcyAtPnRpbWUKK2xvYWQgLS0tLS18ICAgICB8LS0tLS18ICAgICB8LS0tLS18ICAgICB8LS0tLS18CisgICAgICAgICAgfCAgICAgfCAgICAgfCAgICAgfCAgICAgfCAgICAgfCAgICAgfAorc2xlZXAgICAgIHwtLS0tLXwgICAgIHwtLS0tLXwgICAgIHwtLS0tLXwgICAgIHwtLS0tCisgICAgfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0tfC0tLS0gIG9uZGVtYW5kIHNhbXBsaW5nICgxKQorICAgICAgICAgMTAwICAgIDAgICAgMTAwICAgIDAgICAgMTAwICAgIDAgICAgMTAwICAgICBsb2FkIHNlZW4gYnkgb25kZW1hbmQoJSkKKyAgICAgICB8LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0tLS18LS0gICBvbmRlbWFuZCBzYW1wbGluZyAoMikKKyAgICAgIDUwICAgICA1MCAgICA1MCAgICA1MCAgICA1MCAgICA1MCAgICA1MCAgICAgICAgbG9hZCBzZWVuIGJ5IG9uZGVtYW5kKCUpCisKK1lvdSBjYW4gZWFzaWx5IHRlc3QgYWxsIGtpbmQgb2YgbG9hZC9zbGVlcCB0aW1lcyBhbmQgY2hlY2sgd2hldGhlciB5b3VyCitnb3Zlcm5vciBpbiBhdmVyYWdlIGJlaGF2ZXMgYXMgZXhwZWN0ZWQuCisKKworVG9EbworPT09PQorCitQcm92aWRlIGEgZ251cGxvdCB1dGlsaXR5IHNjcmlwdCBmb3IgZWFzeSBnZW5lcmF0aW9uIG9mIHBsb3RzIHRvIHByZXNlbnQKK3RoZSBvdXRjb21lIG5pY2VseS4KKworCitjcHVmcmVxLWJlbmNoIENvbW1hbmQgVXNhZ2UKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorLWwsIC0tbG9hZD08bG9uZyBpbnQ+ICAgICAgICAgICBpbml0aWFsIGxvYWQgdGltZSBpbiB1cworLXMsIC0tc2xlZXA9PGxvbmcgaW50PiAgICAgICAgICBpbml0aWFsIHNsZWVwIHRpbWUgaW4gdXMKKy14LCAtLWxvYWQtc3RlcD08bG9uZyBpbnQ+ICAgICAgdGltZSB0byBiZSBhZGRlZCB0byBsb2FkIHRpbWUsIGluIHVzCisteSwgLS1zbGVlcC1zdGVwPTxsb25nIGludD4gICAgIHRpbWUgdG8gYmUgYWRkZWQgdG8gc2xlZXAgdGltZSwgaW4gdXMKKy1jLCAtLWNwdT08dW5zaWduZWQgaW50PiAgICAgICAgQ1BVIE51bWJlciB0byB1c2UsIHN0YXJ0aW5nIGF0IDAKKy1wLCAtLXByaW89PHByaW9yaXR5PiAgICAgICAgICAgc2NoZWR1bGVyIHByaW9yaXR5LCBISUdILCBMT1cgb3IgREVGQVVMVAorLWcsIC0tZ292ZXJub3I9PGdvdmVybm9yPiAgICAgICBjcHVmcmVxIGdvdmVybm9yIHRvIHRlc3QKKy1uLCAtLWN5Y2xlcz08aW50PiAgICAgICAgICAgICAgbG9hZC9zbGVlcCBjeWNsZXMgdG8gZ2V0IGFuIGF2YXJhZ2UgdmFsdWUgdG8gY29tcGFyZQorLXIsIC0tcm91bmRzPGludD4gICAgICAgICAgICAgICBsb2FkL3NsZWVwIHJvdW5kcworLWYsIC0tZmlsZT08Y29uZmlnZmlsZT4gICAgICAgICBjb25maWcgZmlsZSB0byB1c2UKKy1vLCAtLW91dHB1dD08ZGlyPiAgICAgICAgICAgICAgb3V0cHV0IGRpciwgbXVzdCBleGlzdAorLXYsIC0tdmVyYm9zZSAgICAgICAgICAgICAgICAgICB2ZXJib3NlIG91dHB1dCBvbi9vZmYKKworRHVlIHRvIHRoZSBoaWdoIHByaW9yaXR5LCB0aGUgYXBwbGljYXRpb24gbWF5IG5vdCBiZSByZXNwb25zaWJsZSBmb3Igc29tZSB0aW1lLgorQWZ0ZXIgdGhlIGJlbmNobWFyaywgdGhlIGxvZ2ZpbGUgaXMgc2F2ZWQgaW4gT1VUUFVURElSL2JlbmNobWFya19USU1FU1RBTVAubG9nCisKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2JlbmNoL2JlbmNobWFyay5jIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvYmVuY2gvYmVuY2htYXJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFiMWM0OAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2JlbmNoL2JlbmNobWFyay5jCkBAIC0wLDAgKzEsMTk0IEBACisvKiAgY3B1ZnJlcS1iZW5jaCBDUFVGcmVxIG1pY3JvYmVuY2htYXJrCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOCBDaHJpc3RpYW4gS29ybmFja2VyIDxja29ybmFja2VyQHN1c2UuZGU+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgInN5c3RlbS5oIgorI2luY2x1ZGUgImJlbmNobWFyay5oIgorCisvKiBQcmludCBvdXQgcHJvZ3Jlc3MgaWYgd2UgbG9nIGludG8gYSBmaWxlICovCisjZGVmaW5lIHNob3dfcHJvZ3Jlc3ModG90YWxfdGltZSwgcHJvZ3Jlc3NfdGltZSkJXAoraWYgKGNvbmZpZy0+b3V0cHV0ICE9IHN0ZG91dCkgewkJCQlcCisJZnByaW50ZihzdGRvdXQsICJQcm9ncmVzczogJTAybHUgJSVcciIsCQlcCisJCShwcm9ncmVzc190aW1lICogMTAwKSAvIHRvdGFsX3RpbWUpOwlcCisJZmZsdXNoKHN0ZG91dCk7CQkJCQlcCit9CisKKy8qKgorICogY29tcHV0ZSBob3cgbWFueSByb3VuZHMgb2YgY2FsY3VsYXRpb24gd2Ugc2hvdWxkIGRvCisgKiB0byBnZXQgdGhlIGdpdmVuIGxvYWQgdGltZQorICoKKyAqIEBwYXJhbSBsb2FkIGFpbWVkIGxvYWQgdGltZSBpbiDCtXMKKyAqCisgKiBAcmV0dmFsIHJvdW5kcyBvZiBjYWxjdWxhdGlvbgorICoqLworCit1bnNpZ25lZCBpbnQgY2FsY3VsYXRlX3RpbWVzcGFjZShsb25nIGxvYWQsIHN0cnVjdCBjb25maWcgKmNvbmZpZykKK3sKKwlpbnQgaTsKKwlsb25nIGxvbmcgbm93LCB0aGVuOworCXVuc2lnbmVkIGludCBlc3RpbWF0ZWQgPSBHQVVHRUNPVU5UOworCXVuc2lnbmVkIGludCByb3VuZHMgPSAwOworCXVuc2lnbmVkIGludCB0aW1lZCA9IDA7CisKKwlpZiAoY29uZmlnLT52ZXJib3NlKQorCQlwcmludGYoImNhbGlicmF0aW5nIGxvYWQgb2YgJWxpdXMsIHBsZWFzZSB3YWl0Li4uXG4iLCBsb2FkKTsKKworCS8qIGdldCB0aGUgaW5pdGlhbCBjYWxjdWxhdGlvbiB0aW1lIGZvciBhIHNwZWNpZmljIG51bWJlciBvZiByb3VuZHMgKi8KKwlub3cgPSBnZXRfdGltZSgpOworCVJPVU5EUyhlc3RpbWF0ZWQpOworCXRoZW4gPSBnZXRfdGltZSgpOworCisJdGltZWQgPSAodW5zaWduZWQgaW50KSh0aGVuIC0gbm93KTsKKworCS8qIGFwcHJveGltYXRpb24gb2YgdGhlIHdhbnRlZCBsb2FkIHRpbWUgYnkgY29tcGFyaW5nIHdpdGggdGhlCisJICogaW5pdGlhbCBjYWxjdWxhdGlvbiB0aW1lICovCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlyb3VuZHMgPSAodW5zaWduZWQgaW50KShsb2FkICogZXN0aW1hdGVkIC8gdGltZWQpOworCQlkcHJpbnRmKCJjYWxpYnJhdGluZyB3aXRoICV1IHJvdW5kc1xuIiwgcm91bmRzKTsKKwkJbm93ID0gZ2V0X3RpbWUoKTsKKwkJUk9VTkRTKHJvdW5kcyk7CisJCXRoZW4gPSBnZXRfdGltZSgpOworCisJCXRpbWVkID0gKHVuc2lnbmVkIGludCkodGhlbiAtIG5vdyk7CisJCWVzdGltYXRlZCA9IHJvdW5kczsKKwl9CisJaWYgKGNvbmZpZy0+dmVyYm9zZSkKKwkJcHJpbnRmKCJjYWxpYnJhdGlvbiBkb25lXG4iKTsKKworCXJldHVybiBlc3RpbWF0ZWQ7Cit9CisKKy8qKgorICogYmVuY2htYXJrCisgKiBnZW5lcmF0ZXMgYSBzcGVjaWZpYyBzbGVlcCBhbiBsb2FkIHRpbWUgd2l0aCB0aGUgcGVyZm9ybWFuY2UKKyAqIGdvdmVybm9yIGFuZCBjb21wYXJlcyB0aGUgdXNlZCB0aW1lIGZvciBzYW1lIGNhbGN1bGF0aW9ucyBkb25lCisgKiB3aXRoIHRoZSBjb25maWd1cmVkIHBvd2Vyc2F2ZSBnb3Zlcm5vcgorICoKKyAqIEBwYXJhbSBjb25maWcgY29uZmlnIHZhbHVlcyBmb3IgdGhlIGJlbmNobWFyaworICoKKyAqKi8KKwordm9pZCBzdGFydF9iZW5jaG1hcmsoc3RydWN0IGNvbmZpZyAqY29uZmlnKQoreworCXVuc2lnbmVkIGludCBfcm91bmQsIGN5Y2xlOworCWxvbmcgbG9uZyBub3csIHRoZW47CisJbG9uZyBzbGVlcF90aW1lID0gMCwgbG9hZF90aW1lID0gMDsKKwlsb25nIHBlcmZvcm1hbmNlX3RpbWUgPSAwLCBwb3dlcnNhdmVfdGltZSA9IDA7CisJdW5zaWduZWQgaW50IGNhbGN1bGF0aW9uczsKKwl1bnNpZ25lZCBsb25nIHRvdGFsX3RpbWUgPSAwLCBwcm9ncmVzc190aW1lID0gMDsKKworCXNsZWVwX3RpbWUgPSBjb25maWctPnNsZWVwOworCWxvYWRfdGltZSA9IGNvbmZpZy0+bG9hZDsKKworCS8qIEZvciB0aGUgcHJvZ3Jlc3MgYmFyICovCisJZm9yIChfcm91bmQgPSAxOyBfcm91bmQgPD0gY29uZmlnLT5yb3VuZHM7IF9yb3VuZCsrKQorCQl0b3RhbF90aW1lICs9IF9yb3VuZCAqIChjb25maWctPnNsZWVwICsgY29uZmlnLT5sb2FkKTsKKwl0b3RhbF90aW1lICo9IDI7IC8qIHBvd2Vyc2F2ZSBhbmQgcGVyZm9ybWFuY2UgY3ljbGVzICovCisKKwlmb3IgKF9yb3VuZCA9IDA7IF9yb3VuZCA8IGNvbmZpZy0+cm91bmRzOyBfcm91bmQrKykgeworCQlwZXJmb3JtYW5jZV90aW1lID0gMExMOworCQlwb3dlcnNhdmVfdGltZSA9IDBMTDsKKworCQlzaG93X3Byb2dyZXNzKHRvdGFsX3RpbWUsIHByb2dyZXNzX3RpbWUpOworCisJCS8qIHNldCB0aGUgY3B1ZnJlcSBnb3Zlcm5vciB0byAicGVyZm9ybWFuY2UiIHdoaWNoIGRpc2FibGVzCisJCSAqIFAtU3RhdGUgc3dpdGNoaW5nLiAqLworCQlpZiAoc2V0X2NwdWZyZXFfZ292ZXJub3IoInBlcmZvcm1hbmNlIiwgY29uZmlnLT5jcHUpICE9IDApCisJCQlyZXR1cm47CisKKwkJLyogY2FsaWJyYXRlIHRoZSBjYWxjdWxhdGlvbiB0aW1lLiB0aGUgcmVzdWx0aW5nIGNhbGN1bGF0aW9uCisJCSAqIF9yb3VuZHMgc2hvdWxkIHByb2R1Y2UgYSBsb2FkIHdoaWNoIG1hdGNoZXMgdGhlIGNvbmZpZ3VyZWQKKwkJICogbG9hZCB0aW1lICovCisJCWNhbGN1bGF0aW9ucyA9IGNhbGN1bGF0ZV90aW1lc3BhY2UobG9hZF90aW1lLCBjb25maWcpOworCisJCWlmIChjb25maWctPnZlcmJvc2UpCisJCQlwcmludGYoIl9yb3VuZCAlaTogZG9pbmcgJXUgY3ljbGVzIHdpdGggJXUgY2FsY3VsYXRpb25zIgorCQkJICAgICAgICIgZm9yICVsaXVzXG4iLCBfcm91bmQgKyAxLCBjb25maWctPmN5Y2xlcywKKwkJCSAgICAgICBjYWxjdWxhdGlvbnMsIGxvYWRfdGltZSk7CisKKwkJZnByaW50Zihjb25maWctPm91dHB1dCwgIiV1ICVsaSAlbGkgIiwKKwkJCV9yb3VuZCwgbG9hZF90aW1lLCBzbGVlcF90aW1lKTsKKworCQlpZiAoY29uZmlnLT52ZXJib3NlKQorCQkJcHJpbnRmKCJhdmFyYWdlOiAlbGl1cywgcnBzOiVsaVxuIiwKKwkJCQlsb2FkX3RpbWUgLyBjYWxjdWxhdGlvbnMsCisJCQkJMTAwMDAwMCAqIGNhbGN1bGF0aW9ucyAvIGxvYWRfdGltZSk7CisKKwkJLyogZG8gc29tZSBzbGVlcC9sb2FkIGN5Y2xlcyB3aXRoIHRoZSBwZXJmb3JtYW5jZSBnb3Zlcm5vciAqLworCQlmb3IgKGN5Y2xlID0gMDsgY3ljbGUgPCBjb25maWctPmN5Y2xlczsgY3ljbGUrKykgeworCQkJbm93ID0gZ2V0X3RpbWUoKTsKKwkJCXVzbGVlcChzbGVlcF90aW1lKTsKKwkJCVJPVU5EUyhjYWxjdWxhdGlvbnMpOworCQkJdGhlbiA9IGdldF90aW1lKCk7CisJCQlwZXJmb3JtYW5jZV90aW1lICs9IHRoZW4gLSBub3cgLSBzbGVlcF90aW1lOworCQkJaWYgKGNvbmZpZy0+dmVyYm9zZSkKKwkJCQlwcmludGYoInBlcmZvcm1hbmNlIGN5Y2xlIHRvb2sgJWxpdXMsICIKKwkJCQkJInNsZWVwOiAlbGl1cywgIgorCQkJCQkibG9hZDogJWxpdXMsIHJvdW5kczogJXVcbiIsCisJCQkJCShsb25nKSh0aGVuIC0gbm93KSwgc2xlZXBfdGltZSwKKwkJCQkJbG9hZF90aW1lLCBjYWxjdWxhdGlvbnMpOworCQl9CisJCWZwcmludGYoY29uZmlnLT5vdXRwdXQsICIlbGkgIiwKKwkJCXBlcmZvcm1hbmNlX3RpbWUgLyBjb25maWctPmN5Y2xlcyk7CisKKwkJcHJvZ3Jlc3NfdGltZSArPSBzbGVlcF90aW1lICsgbG9hZF90aW1lOworCQlzaG93X3Byb2dyZXNzKHRvdGFsX3RpbWUsIHByb2dyZXNzX3RpbWUpOworCisJCS8qIHNldCB0aGUgcG93ZXJzYXZlIGdvdmVybm9yIHdoaWNoIGFjdGl2YXRlcyBQLVN0YXRlIHN3aXRjaGluZworCQkgKiBhZ2FpbiAqLworCQlpZiAoc2V0X2NwdWZyZXFfZ292ZXJub3IoY29uZmlnLT5nb3Zlcm5vciwgY29uZmlnLT5jcHUpICE9IDApCisJCQlyZXR1cm47CisKKwkJLyogYWdhaW4sIGRvIHNvbWUgc2xlZXAvbG9hZCBjeWNsZXMgd2l0aCB0aGUKKwkJICogcG93ZXJzYXZlIGdvdmVybm9yICovCisJCWZvciAoY3ljbGUgPSAwOyBjeWNsZSA8IGNvbmZpZy0+Y3ljbGVzOyBjeWNsZSsrKSB7CisJCQlub3cgPSBnZXRfdGltZSgpOworCQkJdXNsZWVwKHNsZWVwX3RpbWUpOworCQkJUk9VTkRTKGNhbGN1bGF0aW9ucyk7CisJCQl0aGVuID0gZ2V0X3RpbWUoKTsKKwkJCXBvd2Vyc2F2ZV90aW1lICs9IHRoZW4gLSBub3cgLSBzbGVlcF90aW1lOworCQkJaWYgKGNvbmZpZy0+dmVyYm9zZSkKKwkJCQlwcmludGYoInBvd2Vyc2F2ZSBjeWNsZSB0b29rICVsaXVzLCAiCisJCQkJCSJzbGVlcDogJWxpdXMsICIKKwkJCQkJImxvYWQ6ICVsaXVzLCByb3VuZHM6ICV1XG4iLAorCQkJCQkobG9uZykodGhlbiAtIG5vdyksIHNsZWVwX3RpbWUsCisJCQkJCWxvYWRfdGltZSwgY2FsY3VsYXRpb25zKTsKKwkJfQorCisJCXByb2dyZXNzX3RpbWUgKz0gc2xlZXBfdGltZSArIGxvYWRfdGltZTsKKworCQkvKiBjb21wYXJlIHRoZSBhdmFyYWdlIHNsZWVwL2xvYWQgY3ljbGVzICAqLworCQlmcHJpbnRmKGNvbmZpZy0+b3V0cHV0LCAiJWxpICIsCisJCQlwb3dlcnNhdmVfdGltZSAvIGNvbmZpZy0+Y3ljbGVzKTsKKwkJZnByaW50Zihjb25maWctPm91dHB1dCwgIiUuM2ZcbiIsCisJCQlwZXJmb3JtYW5jZV90aW1lICogMTAwLjAgLyBwb3dlcnNhdmVfdGltZSk7CisJCWZmbHVzaChjb25maWctPm91dHB1dCk7CisKKwkJaWYgKGNvbmZpZy0+dmVyYm9zZSkKKwkJCXByaW50ZigicGVyZm9ybWFuY2UgaXMgYXQgJS4yZiUlXG4iLAorCQkJCXBlcmZvcm1hbmNlX3RpbWUgKiAxMDAuMCAvIHBvd2Vyc2F2ZV90aW1lKTsKKworCQlzbGVlcF90aW1lICs9IGNvbmZpZy0+c2xlZXBfc3RlcDsKKwkJbG9hZF90aW1lICs9IGNvbmZpZy0+bG9hZF9zdGVwOworCX0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2JlbmNoL2JlbmNobWFyay5oIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvYmVuY2gvYmVuY2htYXJrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTFkN2Y1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2JlbmNoL2JlbmNobWFyay5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qICBjcHVmcmVxLWJlbmNoIENQVUZyZXEgbWljcm9iZW5jaG1hcmsKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IENocmlzdGlhbiBLb3JuYWNrZXIgPGNrb3JuYWNrZXJAc3VzZS5kZT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworLyogbG9hZCBsb29wLCB0aGlzIHNjaG91bGQgdGFrZSBhYm91dCAxIHRvIDJtcyB0byBjb21wbGV0ZSAqLworI2RlZmluZSBST1VORFMoeCkge3Vuc2lnbmVkIGludCByY250OwkJCSAgICAgICBcCisJCWZvciAocmNudCA9IDA7IHJjbnQgPCB4KjEwMDA7IHJjbnQrKykgeyBcCisJCQkodm9pZCkoKChpbnQpKHBvdyhyY250LCByY250KSAqIFwKKwkJCQkgICAgICBzcXJ0KHJjbnQqNzIzMDk3MCkpIF4gNzIzMDcxNikgXiBcCisJCQkJICAgICAgKGludClhdGFuMihyY250LCByY250KSk7CSAgICAgICBcCisJCX0gfQkJCQkJCQlcCisKKwordm9pZCBzdGFydF9iZW5jaG1hcmsoc3RydWN0IGNvbmZpZyAqY29uZmlnKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2JlbmNoL2NvbmZpZy5oIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvYmVuY2gvY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU2ZjI1OAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2JlbmNoL2NvbmZpZy5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qICBjcHVmcmVxLWJlbmNoIENQVUZyZXEgbWljcm9iZW5jaG1hcmsKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IENocmlzdGlhbiBLb3JuYWNrZXIgPGNrb3JuYWNrZXJAc3VzZS5kZT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworLyogaW5pdGlhbCBsb29wIGNvdW50IGZvciB0aGUgbG9hZCBjYWxpYnJhdGlvbiAqLworI2RlZmluZSBHQVVHRUNPVU5UCTE1MDAKKworLyogZGVmYXVsdCBzY2hlZHVsaW5nIHBvbGljeSBTQ0hFRF9PVEhFUiAqLworI2RlZmluZSBTQ0hFRFVMRVIJU0NIRURfT1RIRVIKKworI2RlZmluZSBQUklPUklUWV9ERUZBVUxUIDAKKyNkZWZpbmUgUFJJT1JJVFlfSElHSAkgc2NoZWRfZ2V0X3ByaW9yaXR5X21heChTQ0hFRFVMRVIpCisjZGVmaW5lIFBSSU9SSVRZX0xPVwkgc2NoZWRfZ2V0X3ByaW9yaXR5X21pbihTQ0hFRFVMRVIpCisKKy8qIGVuYWJsZSBmdXJ0aGVyIGRlYnVnIG1lc3NhZ2VzICovCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgZHByaW50ZiBwcmludGYKKyNlbHNlCisjZGVmaW5lIGRwcmludGYoLi4uKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvYmVuY2gvY3B1ZnJlcS1iZW5jaF9wbG90LnNoIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvYmVuY2gvY3B1ZnJlcS1iZW5jaF9wbG90LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMDAyMWEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci9iZW5jaC9jcHVmcmVxLWJlbmNoX3Bsb3Quc2gKQEAgLTAsMCArMSwxMDQgQEAKKyMhL2Jpbi9iYXNoCisKKyMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorIyBhbnkgbGF0ZXIgdmVyc2lvbi4KKworIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisjIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisjIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyMgMDIxMTAtMTMwMSwgVVNBLgorCisjIEF1dGhvci9Db3B5cmlnaHQoYyk6IDIwMDksIFRob21hcyBSZW5uaW5nZXIgPHRyZW5uQHN1c2UuZGU+LCBOb3ZlbGwgSW5jLgorCisjIEhlbHBlciBzY3JpcHQgdG8gZWFzaWx5IGNyZWF0ZSBuaWNlIHBsb3RzIG9mIHlvdXIgY3B1ZnJlcS1iZW5jaCByZXN1bHRzCisKK2Rpcj1gbWt0ZW1wIC1kYAorb3V0cHV0X2ZpbGU9ImNwdWZyZXEtYmVuY2gucG5nIgorZ2xvYmFsX3RpdGxlPSJjcHVmcmVxLWJlbmNoIHBsb3QiCitwaWN0dXJlX3R5cGU9ImpwZWciCitmaWxlWzBdPSIiCisKK2Z1bmN0aW9uIHVzYWdlKCkKK3sKKyAgICBlY2hvICJjcHVmcmVxLWJlbmNoX3Bsb3Quc2ggW09QVElPTlNdIGxvZ2ZpbGUgW21lYXN1cmVfdGl0bGVdIFtsb2dmaWxlIFttZWFzdXJlX3RpdGxlXV0gLi4uXSIKKyAgICBlY2hvCisgICAgZWNobyAiT3B0aW9ucyIKKyAgICBlY2hvICIgICAtbyBvdXRwdXRfZmlsZSIKKyAgICBlY2hvICIgICAtdCBnbG9iYWxfdGl0bGUiCisgICAgZWNobyAiICAgLXAgcGljdHVyZV90eXBlIFtqcGVnfGdpZnxwbmd8cG9zdHNjcmlwdHwuLi5dIgorICAgIGV4aXQgMQorfQorCitpZiBbICQjIC1lcSAwIF07dGhlbgorCWVjaG8gIk5vIGJlbmNobWFyayByZXN1bHRzIGZpbGUgcHJvdmlkZWQiCisJZWNobworCXVzYWdlCitmaQorCit3aGlsZSBnZXRvcHRzIG86dDpwOiBuYW1lIDsgZG8KKyAgICBjYXNlICRuYW1lIGluCisJbykKKwkgICAgb3V0cHV0X2ZpbGU9IiRPUFRBUkciLiRwaWN0dXJlX3R5cGUKKwkgICAgOzsKKwl0KQorCSAgICBnbG9iYWxfdGl0bGU9IiRPUFRBUkciCisJICAgIDs7CisJcCkKKwkgICAgcGljdHVyZV90eXBlPSIkT1BUQVJHIgorCSAgICA7OworICAgICAgICA/KQorCSAgICB1c2FnZQorCSAgICA7OworICAgIGVzYWMKK2RvbmUKK3NoaWZ0ICQoKCRPUFRJTkQgLTEpKQorCitwbG90cz0wCit3aGlsZSBbICIkMSIgXTtkbworICAgIGlmIFsgISAtZiAiJDEiIF07dGhlbgorCWVjaG8gIkZpbGUgJDEgZG9lcyBub3QgZXhpc3QiCisJdXNhZ2UKKyAgICBmaQorICAgIGZpbGVbJHBsb3RzXT0iJDEiCisgICAgdGl0bGVbJHBsb3RzXT0iJDIiCisgICAgIyBlY2hvICJGaWxlOiAke2ZpbGVbJHBsb3RzXX0gLSAke3RpdGxlW3Bsb3RzXX0iCisgICAgc2hpZnQ7c2hpZnQKKyAgICBwbG90cz0kKChwbG90cyArIDEpKQorZG9uZQorCitlY2hvICJzZXQgdGVybWluYWwgJHBpY3R1cmVfdHlwZSIJPj4gJGRpci9wbG90X3NjcmlwdC5ncGwKK2VjaG8gInNldCBvdXRwdXQgXCIkb3V0cHV0X2ZpbGVcIiIJPj4gJGRpci9wbG90X3NjcmlwdC5ncGwKK2VjaG8gInNldCB0aXRsZSBcIiRnbG9iYWxfdGl0bGVcIiIJPj4gJGRpci9wbG90X3NjcmlwdC5ncGwKK2VjaG8gInNldCB4bGFiZWwgXCJzbGVlcC9sb2FkIHRpbWVcIiIJPj4gJGRpci9wbG90X3NjcmlwdC5ncGwKK2VjaG8gInNldCB5bGFiZWwgXCJQZXJmb3JtYW5jZSAoJSlcIiIJPj4gJGRpci9wbG90X3NjcmlwdC5ncGwKKworZm9yKChwbG90PTA7cGxvdDwkcGxvdHM7cGxvdCsrKSk7ZG8KKworICAgICMgU2FuaXR5IGNoZWNrCisgICAgIyMjIyMjIEkgYW0gdG8gZHVtcCB0byBnZXQgdGhpcyByZWRpcmVjdGVkIHRvIHN0ZGVyci9zdGRvdXQgaW4gb25lIGF3ayBjYWxsLi4uICMjIyMjCisgICAgY2F0ICR7ZmlsZVskcGxvdF19IHxncmVwIC12ICJeIyIgfGF3ayAne2lmICgkMiAhPSAkMykgcHJpbnRmKCJFcnJvciBpbiBtZWFzdXJlICVkOkxvYWQgdGltZSAlcyBkb2VzIG5vdCBlcXVhbCBzbGVlcCB0aW1lICVzLCBwbG90IHdpbGwgbm90IGJlIGNvcnJlY3RcbiIsICQxLCAkMiwgJDMpOyBFUlI9MX0nCisgICAgIyMjIyMjIEkgYW0gdG8gZHVtcCB0byBnZXQgdGhpcyByZWRpcmVjdGVkIGluIG9uZSBhd2sgY2FsbC4uLiAjIyMjIworCisgICAgIyBQYXJzZSBvdXQgbG9hZCB0aW1lICh3aGljaCBtdXN0IGJlIGVxdWFsIHRvIHNsZWVwIHRpbWUgZm9yIGEgcGxvdCksIGRpdmlkZSBpdCBieSAxMDAwCisgICAgIyB0byBnZXQgbXMgYW5kIHBhcnNlIG91dCB0aGUgcGVyZm9ybWFuY2UgaW4gcGVyY2VudGFnZSBhbmQgd3JpdGUgaXQgdG8gYSB0ZW1wIGZpbGUgZm9yIHBsb3R0aW5nCisgICAgY2F0ICR7ZmlsZVskcGxvdF19IHxncmVwIC12ICJeIyIgfGF3ayAne3ByaW50ZiAiJWx1ICUuMWZcbiIsJDIvMTAwMCwgJDZ9JyA+JGRpci9kYXRhXyRwbG90CisKKyAgICBpZiBbICRwbG90IC1lcSAwIF07dGhlbgorCWVjaG8gLW4gInBsb3QgIiA+PiAkZGlyL3Bsb3Rfc2NyaXB0LmdwbAorICAgIGZpCisgICAgZWNobyAtbiAiXCIkZGlyL2RhdGFfJHBsb3RcIiB0aXRsZSBcIiR7dGl0bGVbJHBsb3RdfVwiIHdpdGggbGluZXMiID4+ICRkaXIvcGxvdF9zY3JpcHQuZ3BsCisgICAgaWYgWyAkKCgkcGxvdCArIDEpKSAtbmUgJHBsb3RzIF07dGhlbgorCWVjaG8gLW4gIiwgIiA+PiAkZGlyL3Bsb3Rfc2NyaXB0LmdwbAorICAgIGZpCitkb25lCitlY2hvID4+ICRkaXIvcGxvdF9zY3JpcHQuZ3BsCisKK2dudXBsb3QgJGRpci9wbG90X3NjcmlwdC5ncGwKK3JtIC1yICRkaXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci9iZW5jaC9jcHVmcmVxLWJlbmNoX3NjcmlwdC5zaCBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2JlbmNoL2NwdWZyZXEtYmVuY2hfc2NyaXB0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMjBkMmEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci9iZW5jaC9jcHVmcmVxLWJlbmNoX3NjcmlwdC5zaApAQCAtMCwwICsxLDEwMSBAQAorIyEvYmluL2Jhc2gKKworIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorIyBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pCisjIGFueSBsYXRlciB2ZXJzaW9uLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorIyAwMjExMC0xMzAxLCBVU0EuCisKKyMgQXV0aG9yL0NvcHlyaWdodChjKTogMjAwOSwgVGhvbWFzIFJlbm5pbmdlciA8dHJlbm5Ac3VzZS5kZT4sIE5vdmVsbCBJbmMuCisKKyMgT25kZW1hbmQgdXBfdGhyZXNob2xkIGFuZCBzYW1wbGluZyByYXRlIHRlc3Qgc2NyaXB0IGZvciBjcHVmcmVxLWJlbmNoCisjIG1pcmNvYmVuY2htYXJrLgorIyBNb2RpZnkgdGhlIGdlbmVyYWwgdmFyaWFibGVzIGF0IHRoZSB0b3Agb3IgZXh0ZW5kIG9yIGNvcHkgb3V0IHBhcnRzCisjIGlmIHlvdSB3YW50IHRvIHRlc3Qgb3RoZXIgdGhpbmdzCisjCisKKyMgRGVmYXVsdCB3aXRoIGxhdGVzdCBrZXJuZWxzIGlzIDk1LCBiZWZvcmUgbWljcm8gYWNjb3VudCBwYXRjaGVzCisjIGl0IHdhcyA4MCwgY21wLiB3aXRoIGdpdCBjb21taXQgODA4MDA5MTMxMDQ2YjYyYWM0MzRkYmM3OTYKK1VQX1RIUkVTSE9MRD0iNjAgODAgOTUiCisjIERlcGVuZGluZyBvbiB0aGUga2VybmVsIGFuZCB0aGUgSFcgc2FtcGxpbmcgcmF0ZSBjb3VsZCBiZSByZXN0cmljdGVkCisjIGFuZCBjYW5ub3QgYmUgc2V0IHRoYXQgbG93Li4uCisjIEUuZy4gYmVmb3JlIGdpdCBjb21taXQgY2VmOTYxNWE4NTNlYmM0OTcyMDg0Zjcgb25lIGNvdWxkIG9ubHkgc2V0CisjIG1pbiBzYW1wbGluZyByYXRlIG9mIDgwMDAwIGlmIENPTkZJR19IWj0yNTAKK1NBTVBMSU5HX1JBVEU9IjIwMDAwIDgwMDAwIgorCitmdW5jdGlvbiBtZWFzdXJlKCkKK3sKKyAgICBsb2NhbCAtaSB1cF90aHJlc2hvbGRfc2V0CisgICAgbG9jYWwgLWkgc2FtcGxpbmdfcmF0ZV9zZXQKKworICAgIGZvciB1cF90aHJlc2hvbGQgaW4gJFVQX1RIUkVTSE9MRDtkbworCWZvciBzYW1wbGluZ19yYXRlIGluICRTQU1QTElOR19SQVRFO2RvCisJICAgICMgU2V0IHZhbHVlcyBpbiBzeXNmcworCSAgICBlY2hvICR1cF90aHJlc2hvbGQgPi9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdTAvY3B1ZnJlcS9vbmRlbWFuZC91cF90aHJlc2hvbGQKKwkgICAgZWNobyAkc2FtcGxpbmdfcmF0ZSA+L3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1MC9jcHVmcmVxL29uZGVtYW5kL3NhbXBsaW5nX3JhdGUKKwkgICAgdXBfdGhyZXNob2xkX3NldD0kKGNhdCAvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUwL2NwdWZyZXEvb25kZW1hbmQvdXBfdGhyZXNob2xkKQorCSAgICBzYW1wbGluZ19yYXRlX3NldD0kKGNhdCAvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUwL2NwdWZyZXEvb25kZW1hbmQvc2FtcGxpbmdfcmF0ZSkKKworCSAgICAjIFZlcmlmeSBzZXQgdmFsdWVzIGluIHN5c2ZzCisJICAgIGlmIFsgJHt1cF90aHJlc2hvbGRfc2V0fSAtZXEgJHt1cF90aHJlc2hvbGR9IF07dGhlbgorCQllY2hvICJ1cF90aHJlc2hvbGQ6ICR1cF90aHJlc2hvbGQsIHNldCBpbiBzeXNmczogJHt1cF90aHJlc2hvbGRfc2V0fSIKKwkgICAgZWxzZQorCQllY2hvICJXQVJOSU5HOiBUcmllZCB0byBzZXQgdXBfdGhyZXNob2xkOiAkdXBfdGhyZXNob2xkLCBzZXQgaW4gc3lzZnM6ICR7dXBfdGhyZXNob2xkX3NldH0iCisJICAgIGZpCisJICAgIGlmIFsgJHtzYW1wbGluZ19yYXRlX3NldH0gLWVxICR7c2FtcGxpbmdfcmF0ZX0gXTt0aGVuCisJCWVjaG8gInNhbXBsaW5nX3JhdGU6ICRzYW1wbGluZ19yYXRlLCBzZXQgaW4gc3lzZnM6ICR7c2FtcGxpbmdfcmF0ZV9zZXR9IgorCSAgICBlbHNlCisJCWVjaG8gIldBUk5JTkc6IFRyaWVkIHRvIHNldCBzYW1wbGluZ19yYXRlOiAkc2FtcGxpbmdfcmF0ZSwgc2V0IGluIHN5c2ZzOiAke3NhbXBsaW5nX3JhdGVfc2V0fSIKKwkgICAgZmkKKworCSAgICAjIEJlbmNobWFyaworCSAgICBjcHVmcmVxLWJlbmNoIC1vIC92YXIvbG9nL2NwdWZyZXEtYmVuY2gvdXBfdGhyZXNob2xkXyR7dXBfdGhyZXNob2xkfV9zYW1wbGluZ19yYXRlXyR7c2FtcGxpbmdfcmF0ZX0KKwlkb25lCisgICAgZG9uZQorfQorCitmdW5jdGlvbiBjcmVhdGVfcGxvdHMoKQoreworICAgIGxvY2FsIGNvbW1hbmQKKworICAgIGZvciB1cF90aHJlc2hvbGQgaW4gJFVQX1RIUkVTSE9MRDtkbworCWNvbW1hbmQ9ImNwdWZyZXEtYmVuY2hfcGxvdC5zaCAtbyBcInNhbXBsaW5nX3JhdGVfJHtTQU1QTElOR19SQVRFfV91cF90aHJlc2hvbGRfJHt1cF90aHJlc2hvbGR9XCIgLXQgXCJPbmRlbWFuZCBzYW1wbGluZ19yYXRlOiAke1NBTVBMSU5HX1JBVEV9IGNvbXBhcmlzb24gLSBVcF90aHJlc2hvbGQ6ICR1cF90aHJlc2hvbGQgJVwiIgorCWZvciBzYW1wbGluZ19yYXRlIGluICRTQU1QTElOR19SQVRFO2RvCisJICAgIGNvbW1hbmQ9IiR7Y29tbWFuZH0gL3Zhci9sb2cvY3B1ZnJlcS1iZW5jaC91cF90aHJlc2hvbGRfJHt1cF90aHJlc2hvbGR9X3NhbXBsaW5nX3JhdGVfJHtzYW1wbGluZ19yYXRlfS8qIFwic2FtcGxpbmdfcmF0ZSA9ICRzYW1wbGluZ19yYXRlXCIiCisJZG9uZQorCWVjaG8gJGNvbW1hbmQKKwlldmFsICIkY29tbWFuZCIKKwllY2hvCisgICAgZG9uZQorCisgICAgZm9yIHNhbXBsaW5nX3JhdGUgaW4gJFNBTVBMSU5HX1JBVEU7ZG8KKwljb21tYW5kPSJjcHVmcmVxLWJlbmNoX3Bsb3Quc2ggLW8gXCJ1cF90aHJlc2hvbGRfJHtVUF9USFJFU0hPTER9X3NhbXBsaW5nX3JhdGVfJHtzYW1wbGluZ19yYXRlfVwiIC10IFwiT25kZW1hbmQgdXBfdGhyZXNob2xkOiAke1VQX1RIUkVTSE9MRH0gJSBjb21wYXJpc29uIC0gc2FtcGxpbmdfcmF0ZTogJHNhbXBsaW5nX3JhdGVcIiIKKwlmb3IgdXBfdGhyZXNob2xkIGluICRVUF9USFJFU0hPTEQ7ZG8KKwkgICAgY29tbWFuZD0iJHtjb21tYW5kfSAvdmFyL2xvZy9jcHVmcmVxLWJlbmNoL3VwX3RocmVzaG9sZF8ke3VwX3RocmVzaG9sZH1fc2FtcGxpbmdfcmF0ZV8ke3NhbXBsaW5nX3JhdGV9LyogXCJ1cF90aHJlc2hvbGQgPSAkdXBfdGhyZXNob2xkXCIiCisJZG9uZQorCWVjaG8gJGNvbW1hbmQKKwlldmFsICIkY29tbWFuZCIKKwllY2hvCisgICAgZG9uZQorCisgICAgY29tbWFuZD0iY3B1ZnJlcS1iZW5jaF9wbG90LnNoIC1vIFwidXBfdGhyZXNob2xkXyR7VVBfVEhSRVNIT0xEfV9zYW1wbGluZ19yYXRlXyR7U0FNUExJTkdfUkFURX1cIiAtdCBcIk9uZGVtYW5kIHVwX3RocmVzaG9sZDogJHtVUF9USFJFU0hPTER9IGFuZCBzYW1wbGluZ19yYXRlICR7U0FNUExJTkdfUkFURX0gY29tcGFyaXNvblwiIgorICAgIGZvciBzYW1wbGluZ19yYXRlIGluICRTQU1QTElOR19SQVRFO2RvCisJZm9yIHVwX3RocmVzaG9sZCBpbiAkVVBfVEhSRVNIT0xEO2RvCisJICAgIGNvbW1hbmQ9IiR7Y29tbWFuZH0gL3Zhci9sb2cvY3B1ZnJlcS1iZW5jaC91cF90aHJlc2hvbGRfJHt1cF90aHJlc2hvbGR9X3NhbXBsaW5nX3JhdGVfJHtzYW1wbGluZ19yYXRlfS8qIFwidXBfdGhyZXNob2xkID0gJHVwX3RocmVzaG9sZCAtIHNhbXBsaW5nX3JhdGUgPSAkc2FtcGxpbmdfcmF0ZVwiIgorCWRvbmUKKyAgICBkb25lCisgICAgZWNobyAiJGNvbW1hbmQiCisgICAgZXZhbCAiJGNvbW1hbmQiCit9CisKK21lYXN1cmUKK2NyZWF0ZV9wbG90cwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2JlbmNoL2V4YW1wbGUuY2ZnIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvYmVuY2gvZXhhbXBsZS5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkxZjY0MwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2JlbmNoL2V4YW1wbGUuY2ZnCkBAIC0wLDAgKzEsMTEgQEAKK3NsZWVwID0gNTAwMDAKK2xvYWQgPSA1MDAwMAorY3B1ID0gMAorcHJpb3JpdHkgPSBMT1cKK291dHB1dCA9IC92YXIvbG9nL2NwdWZyZXEtYmVuY2gKK3NsZWVwX3N0ZXAgPSA1MDAwMAorbG9hZF9zdGVwID0gNTAwMDAKK2N5Y2xlcyA9IDIwCityb3VuZHMgPSA0MAordmVyYm9zZSA9IDAKK2dvdmVybm9yID0gb25kZW1hbmQKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2JlbmNoL21haW4uYyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2JlbmNoL21haW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDkxMDMxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvYmVuY2gvbWFpbi5jCkBAIC0wLDAgKzEsMjAyIEBACisvKiAgY3B1ZnJlcS1iZW5jaCBDUFVGcmVxIG1pY3JvYmVuY2htYXJrCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOCBDaHJpc3RpYW4gS29ybmFja2VyIDxja29ybmFja2VyQHN1c2UuZGU+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJzeXN0ZW0uaCIKKyNpbmNsdWRlICJiZW5jaG1hcmsuaCIKKworc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisJeyJvdXRwdXQiLAkxLAkwLAknbyd9LAorCXsic2xlZXAiLAkxLAkwLAkncyd9LAorCXsibG9hZCIsCTEsCTAsCSdsJ30sCisJeyJ2ZXJib3NlIiwJMCwJMCwJJ3YnfSwKKwl7ImNwdSIsCQkxLAkwLAknYyd9LAorCXsiZ292ZXJub3IiLAkxLAkwLAknZyd9LAorCXsicHJpbyIsCTEsCTAsCSdwJ30sCisJeyJmaWxlIiwJMSwJMCwJJ2YnfSwKKwl7ImN5Y2xlcyIsCTEsCTAsCSduJ30sCisJeyJyb3VuZHMiLAkxLAkwLAkncid9LAorCXsibG9hZC1zdGVwIiwJMSwJMCwJJ3gnfSwKKwl7InNsZWVwLXN0ZXAiLAkxLAkwLAkneSd9LAorCXsiaGVscCIsCTAsCTAsCSdoJ30sCisJezAsIDAsIDAsIDB9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIHVzYWdlCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIHVzYWdlKCkKK3sKKwlwcmludGYoInVzYWdlOiAuL2JlbmNoXG4iKTsKKwlwcmludGYoIk9wdGlvbnM6XG4iKTsKKwlwcmludGYoIiAtbCwgLS1sb2FkPTxsb25nIGludD5cdFx0aW5pdGlhbCBsb2FkIHRpbWUgaW4gdXNcbiIpOworCXByaW50ZigiIC1zLCAtLXNsZWVwPTxsb25nIGludD5cdFx0aW5pdGlhbCBzbGVlcCB0aW1lIGluIHVzXG4iKTsKKwlwcmludGYoIiAteCwgLS1sb2FkLXN0ZXA9PGxvbmcgaW50Plx0dGltZSB0byBiZSBhZGRlZCB0byBsb2FkIHRpbWUsIGluIHVzXG4iKTsKKwlwcmludGYoIiAteSwgLS1zbGVlcC1zdGVwPTxsb25nIGludD5cdHRpbWUgdG8gYmUgYWRkZWQgdG8gc2xlZXAgdGltZSwgaW4gdXNcbiIpOworCXByaW50ZigiIC1jLCAtLWNwdT08Y3B1ICM+XHRcdFx0Q1BVIE5yLiB0byB1c2UsIHN0YXJ0aW5nIGF0IDBcbiIpOworCXByaW50ZigiIC1wLCAtLXByaW89PHByaW9yaXR5Plx0XHRcdHNjaGVkdWxlciBwcmlvcml0eSwgSElHSCwgTE9XIG9yIERFRkFVTFRcbiIpOworCXByaW50ZigiIC1nLCAtLWdvdmVybm9yPTxnb3Zlcm5vcj5cdFx0Y3B1ZnJlcSBnb3Zlcm5vciB0byB0ZXN0XG4iKTsKKwlwcmludGYoIiAtbiwgLS1jeWNsZXM9PGludD5cdFx0XHRsb2FkL3NsZWVwIGN5Y2xlc1xuIik7CisJcHJpbnRmKCIgLXIsIC0tcm91bmRzPGludD5cdFx0XHRsb2FkL3NsZWVwIHJvdW5kc1xuIik7CisJcHJpbnRmKCIgLWYsIC0tZmlsZT08Y29uZmlnZmlsZT5cdFx0Y29uZmlnIGZpbGUgdG8gdXNlXG4iKTsKKwlwcmludGYoIiAtbywgLS1vdXRwdXQ9PGRpcj5cdFx0XHRvdXRwdXQgcGF0aC4gRmlsZW5hbWUgd2lsbCBiZSBPVVRQVVRQQVRIL2JlbmNobWFya19USU1FU1RBTVAubG9nXG4iKTsKKwlwcmludGYoIiAtdiwgLS12ZXJib3NlXHRcdFx0XHR2ZXJib3NlIG91dHB1dCBvbi9vZmZcbiIpOworCXByaW50ZigiIC1oLCAtLWhlbHBcdFx0XHRcdFByaW50IHRoaXMgaGVscCBzY3JlZW5cbiIpOworCWV4aXQoMSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgbWFpbgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBjOworCWludCBvcHRpb25faW5kZXggPSAwOworCXN0cnVjdCBjb25maWcgKmNvbmZpZyA9IE5VTEw7CisKKwljb25maWcgPSBwcmVwYXJlX2RlZmF1bHRfY29uZmlnKCk7CisKKwlpZiAoY29uZmlnID09IE5VTEwpCisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisKKwl3aGlsZSAoMSkgeworCQljID0gZ2V0b3B0X2xvbmcgKGFyZ2MsIGFyZ3YsICJoZzpvOnM6bDp2YzpwOmY6bjpyOng6eToiLAorCQkJCWxvbmdfb3B0aW9ucywgJm9wdGlvbl9pbmRleCk7CisJCWlmIChjID09IC0xKQorCQkJYnJlYWs7CisKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ28nOgorCQkJaWYgKGNvbmZpZy0+b3V0cHV0ICE9IE5VTEwpCisJCQkJZmNsb3NlKGNvbmZpZy0+b3V0cHV0KTsKKworCQkJY29uZmlnLT5vdXRwdXQgPSBwcmVwYXJlX291dHB1dChvcHRhcmcpOworCisJCQlpZiAoY29uZmlnLT5vdXRwdXQgPT0gTlVMTCkKKwkJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCisJCQlkcHJpbnRmKCJ1c2VyIG91dHB1dCBwYXRoIC0+ICVzXG4iLCBvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJc3NjYW5mKG9wdGFyZywgIiVsaSIsICZjb25maWctPnNsZWVwKTsKKwkJCWRwcmludGYoInVzZXIgc2xlZXAgdGltZSAtPiAlc1xuIiwgb3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdsJzoKKwkJCXNzY2FuZihvcHRhcmcsICIlbGkiLCAmY29uZmlnLT5sb2FkKTsKKwkJCWRwcmludGYoInVzZXIgbG9hZCB0aW1lIC0+ICVzXG4iLCBvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ2MnOgorCQkJc3NjYW5mKG9wdGFyZywgIiV1IiwgJmNvbmZpZy0+Y3B1KTsKKwkJCWRwcmludGYoInVzZXIgY3B1IC0+ICVzXG4iLCBvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ2cnOgorCQkJc3RybmNweShjb25maWctPmdvdmVybm9yLCBvcHRhcmcsIDE0KTsKKwkJCWRwcmludGYoInVzZXIgZ292ZXJub3IgLT4gJXNcbiIsIG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlpZiAoc3RyaW5nX3RvX3ByaW8ob3B0YXJnKSAhPSBTQ0hFRF9FUlIpIHsKKwkJCQljb25maWctPnByaW8gPSBzdHJpbmdfdG9fcHJpbyhvcHRhcmcpOworCQkJCWRwcmludGYoInVzZXIgcHJpbyAtPiAlc1xuIiwgb3B0YXJnKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGNvbmZpZyAhPSBOVUxMKSB7CisJCQkJCWlmIChjb25maWctPm91dHB1dCAhPSBOVUxMKQorCQkJCQkJZmNsb3NlKGNvbmZpZy0+b3V0cHV0KTsKKwkJCQkJZnJlZShjb25maWcpOworCQkJCX0KKwkJCQl1c2FnZSgpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ24nOgorCQkJc3NjYW5mKG9wdGFyZywgIiV1IiwgJmNvbmZpZy0+Y3ljbGVzKTsKKwkJCWRwcmludGYoInVzZXIgY3ljbGVzIC0+ICVzXG4iLCBvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ3InOgorCQkJc3NjYW5mKG9wdGFyZywgIiV1IiwgJmNvbmZpZy0+cm91bmRzKTsKKwkJCWRwcmludGYoInVzZXIgcm91bmRzIC0+ICVzXG4iLCBvcHRhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgJ3gnOgorCQkJc3NjYW5mKG9wdGFyZywgIiVsaSIsICZjb25maWctPmxvYWRfc3RlcCk7CisJCQlkcHJpbnRmKCJ1c2VyIGxvYWRfc3RlcCAtPiAlc1xuIiwgb3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICd5JzoKKwkJCXNzY2FuZihvcHRhcmcsICIlbGkiLCAmY29uZmlnLT5zbGVlcF9zdGVwKTsKKwkJCWRwcmludGYoInVzZXIgc2xlZXBfc3RlcCAtPiAlc1xuIiwgb3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdmJzoKKwkJCWlmIChwcmVwYXJlX2NvbmZpZyhvcHRhcmcsIGNvbmZpZykpCisJCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJCWJyZWFrOworCQljYXNlICd2JzoKKwkJCWNvbmZpZy0+dmVyYm9zZSA9IDE7CisJCQlkcHJpbnRmKCJ2ZXJib3NlIG91dHB1dCBlbmFibGVkXG4iKTsKKwkJCWJyZWFrOworCQljYXNlICdoJzoKKwkJY2FzZSAnPyc6CisJCWRlZmF1bHQ6CisJCQlpZiAoY29uZmlnICE9IE5VTEwpIHsKKwkJCQlpZiAoY29uZmlnLT5vdXRwdXQgIT0gTlVMTCkKKwkJCQkJZmNsb3NlKGNvbmZpZy0+b3V0cHV0KTsKKwkJCQlmcmVlKGNvbmZpZyk7CisJCQl9CisJCQl1c2FnZSgpOworCQl9CisJfQorCisJaWYgKGNvbmZpZy0+dmVyYm9zZSkgeworCQlwcmludGYoInN0YXJ0aW5nIGJlbmNobWFyayB3aXRoIHBhcmFtZXRlcnM6XG4iKTsKKwkJcHJpbnRmKCJjb25maWc6XG5cdCIKKwkJICAgICAgICJzbGVlcD0lbGlcblx0IgorCQkgICAgICAgImxvYWQ9JWxpXG5cdCIKKwkJICAgICAgICJzbGVlcF9zdGVwPSVsaVxuXHQiCisJCSAgICAgICAibG9hZF9zdGVwPSVsaVxuXHQiCisJCSAgICAgICAiY3B1PSV1XG5cdCIKKwkJICAgICAgICJjeWNsZXM9JXVcblx0IgorCQkgICAgICAgInJvdW5kcz0ldVxuXHQiCisJCSAgICAgICAiZ292ZXJub3I9JXNcblxuIiwKKwkJICAgICAgIGNvbmZpZy0+c2xlZXAsCisJCSAgICAgICBjb25maWctPmxvYWQsCisJCSAgICAgICBjb25maWctPnNsZWVwX3N0ZXAsCisJCSAgICAgICBjb25maWctPmxvYWRfc3RlcCwKKwkJICAgICAgIGNvbmZpZy0+Y3B1LAorCQkgICAgICAgY29uZmlnLT5jeWNsZXMsCisJCSAgICAgICBjb25maWctPnJvdW5kcywKKwkJICAgICAgIGNvbmZpZy0+Z292ZXJub3IpOworCX0KKworCXByZXBhcmVfdXNlcihjb25maWcpOworCXByZXBhcmVfc3lzdGVtKGNvbmZpZyk7CisJc3RhcnRfYmVuY2htYXJrKGNvbmZpZyk7CisKKwlpZiAoY29uZmlnLT5vdXRwdXQgIT0gc3Rkb3V0KQorCQlmY2xvc2UoY29uZmlnLT5vdXRwdXQpOworCisJZnJlZShjb25maWcpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKwpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvYmVuY2gvcGFyc2UuYyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2JlbmNoL3BhcnNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQzYmJhMQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2JlbmNoL3BhcnNlLmMKQEAgLTAsMCArMSwyMjUgQEAKKy8qICBjcHVmcmVxLWJlbmNoIENQVUZyZXEgbWljcm9iZW5jaG1hcmsKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IENocmlzdGlhbiBLb3JuYWNrZXIgPGNrb3JuYWNrZXJAc3VzZS5kZT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorCisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSAicGFyc2UuaCIKKyNpbmNsdWRlICJjb25maWcuaCIKKworLyoqCisgKiBjb252ZXJ0cyBwcmlvcml0eSBzdHJpbmcgdG8gcHJpb3JpdHkKKyAqCisgKiBAcGFyYW0gc3RyIHN0cmluZyB0aGF0IHJlcHJlc2VudHMgYSBzY2hlZHVsZXIgcHJpb3JpdHkKKyAqCisgKiBAcmV0dmFsIHByaW9yaXR5CisgKiBAcmV0dmFsIFNDSEVEX0VSUiB3aGVuIHRoZSBwcmlvcml0eSBkb2Vzbid0IGV4aXQKKyAqKi8KKworZW51bSBzY2hlZF9wcmlvIHN0cmluZ190b19wcmlvKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpZiAoc3RybmNhc2VjbXAoImhpZ2giLCBzdHIsIHN0cmxlbihzdHIpKSA9PSAwKQorCQlyZXR1cm4gIFNDSEVEX0hJR0g7CisJZWxzZSBpZiAoc3RybmNhc2VjbXAoImRlZmF1bHQiLCBzdHIsIHN0cmxlbihzdHIpKSA9PSAwKQorCQlyZXR1cm4gU0NIRURfREVGQVVMVDsKKwllbHNlIGlmIChzdHJuY2FzZWNtcCgibG93Iiwgc3RyLCBzdHJsZW4oc3RyKSkgPT0gMCkKKwkJcmV0dXJuIFNDSEVEX0xPVzsKKwllbHNlCisJCXJldHVybiBTQ0hFRF9FUlI7Cit9CisKKy8qKgorICogY3JlYXRlIGFuZCBvcGVuIGxvZ2ZpbGUKKyAqCisgKiBAcGFyYW0gZGlyIGRpcmVjdG9yeSBpbiB3aGljaCB0aGUgbG9nZmlsZSBzaG91bGQgYmUgY3JlYXRlZAorICoKKyAqIEByZXR2YWwgbG9nZmlsZSBvbiBzdWNjZXNzCisgKiBAcmV0dmFsIE5VTEwgd2hlbiB0aGUgZmlsZSBjYW4ndCBiZSBjcmVhdGVkCisgKiovCisKK0ZJTEUgKnByZXBhcmVfb3V0cHV0KGNvbnN0IGNoYXIgKmRpcm5hbWUpCit7CisJRklMRSAqb3V0cHV0ID0gTlVMTDsKKwlpbnQgbGVuOworCWNoYXIgKmZpbGVuYW1lOworCXN0cnVjdCB1dHNuYW1lIHN5c2RhdGE7CisJRElSICpkaXI7CisKKwlkaXIgPSBvcGVuZGlyKGRpcm5hbWUpOworCWlmIChkaXIgPT0gTlVMTCkgeworCQlpZiAobWtkaXIoZGlybmFtZSwgMDc1NSkpIHsKKwkJCXBlcnJvcigibWtkaXIiKTsKKwkJCWZwcmludGYoc3RkZXJyLCAiZXJyb3I6IENhbm5vdCBjcmVhdGUgZGlyICVzXG4iLAorCQkJCWRpcm5hbWUpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisKKwlsZW4gPSBzdHJsZW4oZGlybmFtZSkgKyAzMDsKKwlmaWxlbmFtZSA9IG1hbGxvYyhzaXplb2YoY2hhcikgKiBsZW4pOworCisJaWYgKHVuYW1lKCZzeXNkYXRhKSA9PSAwKSB7CisJCWxlbiArPSBzdHJsZW4oc3lzZGF0YS5ub2RlbmFtZSkgKyBzdHJsZW4oc3lzZGF0YS5yZWxlYXNlKTsKKwkJZmlsZW5hbWUgPSByZWFsbG9jKGZpbGVuYW1lLCBzaXplb2YoY2hhcikgKiBsZW4pOworCisJCWlmIChmaWxlbmFtZSA9PSBOVUxMKSB7CisJCQlwZXJyb3IoInJlYWxsb2MiKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJc25wcmludGYoZmlsZW5hbWUsIGxlbiAtIDEsICIlcy9iZW5jaG1hcmtfJXNfJXNfJWxpLmxvZyIsCisJCQlkaXJuYW1lLCBzeXNkYXRhLm5vZGVuYW1lLCBzeXNkYXRhLnJlbGVhc2UsIHRpbWUoTlVMTCkpOworCX0gZWxzZSB7CisJCXNucHJpbnRmKGZpbGVuYW1lLCBsZW4gLSAxLCAiJXMvYmVuY2htYXJrXyVsaS5sb2ciLAorCQkJZGlybmFtZSwgdGltZShOVUxMKSk7CisJfQorCisJZHByaW50ZigibG9naWxlbmFtZTogJXNcbiIsIGZpbGVuYW1lKTsKKworCW91dHB1dCA9IGZvcGVuKGZpbGVuYW1lLCAidysiKTsKKwlpZiAob3V0cHV0ID09IE5VTEwpIHsKKwkJcGVycm9yKCJmb3BlbiIpOworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yOiB1bmFibGUgdG8gb3BlbiBsb2dmaWxlXG4iKTsKKwl9CisKKwlmcHJpbnRmKHN0ZG91dCwgIkxvZ2ZpbGU6ICVzXG4iLCBmaWxlbmFtZSk7CisKKwlmcmVlKGZpbGVuYW1lKTsKKwlmcHJpbnRmKG91dHB1dCwgIiNyb3VuZCBsb2FkIHNsZWVwIHBlcmZvcm1hbmNlIHBvd2Vyc2F2ZSBwZXJjZW50YWdlXG4iKTsKKwlyZXR1cm4gb3V0cHV0OworfQorCisvKioKKyAqIHJldHVybnMgdGhlIGRlZmF1bHQgY29uZmlnCisgKgorICogQHJldHZhbCBkZWZhdWx0IGNvbmZpZyBvbiBzdWNjZXNzCisgKiBAcmV0dmFsIE5VTEwgd2hlbiB0aGUgb3V0cHV0IGZpbGUgY2FuJ3QgYmUgY3JlYXRlZAorICoqLworCitzdHJ1Y3QgY29uZmlnICpwcmVwYXJlX2RlZmF1bHRfY29uZmlnKCkKK3sKKwlzdHJ1Y3QgY29uZmlnICpjb25maWcgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBjb25maWcpKTsKKworCWRwcmludGYoImxvYWRpbmcgZGVmYXVsdHNcbiIpOworCisJY29uZmlnLT5zbGVlcCA9IDUwMDAwMDsKKwljb25maWctPmxvYWQgPSA1MDAwMDA7CisJY29uZmlnLT5zbGVlcF9zdGVwID0gNTAwMDAwOworCWNvbmZpZy0+bG9hZF9zdGVwID0gNTAwMDAwOworCWNvbmZpZy0+Y3ljbGVzID0gNTsKKwljb25maWctPnJvdW5kcyA9IDUwOworCWNvbmZpZy0+Y3B1ID0gMDsKKwljb25maWctPnByaW8gPSBTQ0hFRF9ISUdIOworCWNvbmZpZy0+dmVyYm9zZSA9IDA7CisJc3RybmNweShjb25maWctPmdvdmVybm9yLCAib25kZW1hbmQiLCA4KTsKKworCWNvbmZpZy0+b3V0cHV0ID0gc3Rkb3V0OworCisjaWZkZWYgREVGQVVMVF9DT05GSUdfRklMRQorCWlmIChwcmVwYXJlX2NvbmZpZyhERUZBVUxUX0NPTkZJR19GSUxFLCBjb25maWcpKQorCQlyZXR1cm4gTlVMTDsKKyNlbmRpZgorCXJldHVybiBjb25maWc7Cit9CisKKy8qKgorICogcGFyc2VzIGNvbmZpZyBmaWxlIGFuZCByZXR1cm5zIHRoZSBjb25maWcgdG8gdGhlIGNhbGxlcgorICoKKyAqIEBwYXJhbSBwYXRoIGNvbmZpZyBmaWxlIG5hbWUKKyAqCisgKiBAcmV0dmFsIDEgb24gZXJyb3IKKyAqIEByZXR2YWwgMCBvbiBzdWNjZXNzCisgKiovCisKK2ludCBwcmVwYXJlX2NvbmZpZyhjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgY29uZmlnICpjb25maWcpCit7CisJc2l6ZV90IGxlbiA9IDA7CisJY2hhciAqb3B0LCAqdmFsLCAqbGluZSA9IE5VTEw7CisJRklMRSAqY29uZmlnZmlsZSA9IGZvcGVuKHBhdGgsICJyIik7CisKKwlpZiAoY29uZmlnID09IE5VTEwpIHsKKwkJZnByaW50ZihzdGRlcnIsICJlcnJvcjogY29uZmlnIGlzIE5VTExcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoY29uZmlnZmlsZSA9PSBOVUxMKSB7CisJCXBlcnJvcigiZm9wZW4iKTsKKwkJZnByaW50ZihzdGRlcnIsICJlcnJvcjogdW5hYmxlIHRvIHJlYWQgY29uZmlnZmlsZVxuIik7CisJCWZyZWUoY29uZmlnKTsKKwkJcmV0dXJuIDE7CisJfQorCisJd2hpbGUgKGdldGxpbmUoJmxpbmUsICZsZW4sIGNvbmZpZ2ZpbGUpICE9IC0xKSB7CisJCWlmIChsaW5lWzBdID09ICcjJyB8fCBsaW5lWzBdID09ICcgJykKKwkJCWNvbnRpbnVlOworCisJCXNzY2FuZihsaW5lLCAiJWFzID0gJWFzIiwgJm9wdCwgJnZhbCk7CisKKwkJZHByaW50ZigicGFyc2luZzogJXMgLT4gJXNcbiIsIG9wdCwgdmFsKTsKKworCQlpZiAoc3RybmNtcCgic2xlZXAiLCBvcHQsIHN0cmxlbihvcHQpKSA9PSAwKQorCQkJc3NjYW5mKHZhbCwgIiVsaSIsICZjb25maWctPnNsZWVwKTsKKworCQllbHNlIGlmIChzdHJuY21wKCJsb2FkIiwgb3B0LCBzdHJsZW4ob3B0KSkgPT0gMCkKKwkJCXNzY2FuZih2YWwsICIlbGkiLCAmY29uZmlnLT5sb2FkKTsKKworCQllbHNlIGlmIChzdHJuY21wKCJsb2FkX3N0ZXAiLCBvcHQsIHN0cmxlbihvcHQpKSA9PSAwKQorCQkJc3NjYW5mKHZhbCwgIiVsaSIsICZjb25maWctPmxvYWRfc3RlcCk7CisKKwkJZWxzZSBpZiAoc3RybmNtcCgic2xlZXBfc3RlcCIsIG9wdCwgc3RybGVuKG9wdCkpID09IDApCisJCQlzc2NhbmYodmFsLCAiJWxpIiwgJmNvbmZpZy0+c2xlZXBfc3RlcCk7CisKKwkJZWxzZSBpZiAoc3RybmNtcCgiY3ljbGVzIiwgb3B0LCBzdHJsZW4ob3B0KSkgPT0gMCkKKwkJCXNzY2FuZih2YWwsICIldSIsICZjb25maWctPmN5Y2xlcyk7CisKKwkJZWxzZSBpZiAoc3RybmNtcCgicm91bmRzIiwgb3B0LCBzdHJsZW4ob3B0KSkgPT0gMCkKKwkJCXNzY2FuZih2YWwsICIldSIsICZjb25maWctPnJvdW5kcyk7CisKKwkJZWxzZSBpZiAoc3RybmNtcCgidmVyYm9zZSIsIG9wdCwgc3RybGVuKG9wdCkpID09IDApCisJCQlzc2NhbmYodmFsLCAiJXUiLCAmY29uZmlnLT52ZXJib3NlKTsKKworCQllbHNlIGlmIChzdHJuY21wKCJvdXRwdXQiLCBvcHQsIHN0cmxlbihvcHQpKSA9PSAwKQorCQkJY29uZmlnLT5vdXRwdXQgPSBwcmVwYXJlX291dHB1dCh2YWwpOyAKKworCQllbHNlIGlmIChzdHJuY21wKCJjcHUiLCBvcHQsIHN0cmxlbihvcHQpKSA9PSAwKQorCQkJc3NjYW5mKHZhbCwgIiV1IiwgJmNvbmZpZy0+Y3B1KTsKKworCQllbHNlIGlmIChzdHJuY21wKCJnb3Zlcm5vciIsIG9wdCwgMTQpID09IDApCisJCQlzdHJuY3B5KGNvbmZpZy0+Z292ZXJub3IsIHZhbCwgMTQpOworCisJCWVsc2UgaWYgKHN0cm5jbXAoInByaW9yaXR5Iiwgb3B0LCBzdHJsZW4ob3B0KSkgPT0gMCkgeworCQkJaWYgKHN0cmluZ190b19wcmlvKHZhbCkgIT0gU0NIRURfRVJSKQorCQkJCWNvbmZpZy0+cHJpbyA9IHN0cmluZ190b19wcmlvKHZhbCk7CisJCX0KKwl9CisKKwlmcmVlKGxpbmUpOworCWZyZWUob3B0KTsKKwlmcmVlKHZhbCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2JlbmNoL3BhcnNlLmggYi90b29scy9wb3dlci9jcHVwb3dlci9iZW5jaC9wYXJzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZGM2MzIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci9iZW5jaC9wYXJzZS5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qICBjcHVmcmVxLWJlbmNoIENQVUZyZXEgbWljcm9iZW5jaG1hcmsKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4IENocmlzdGlhbiBLb3JuYWNrZXIgPGNrb3JuYWNrZXJAc3VzZS5kZT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworLyogc3RydWN0IHRoYXQgaG9sZHMgdGhlIHJlcXVpcmVkIGNvbmZpZyBwYXJhbWV0ZXJzICovCitzdHJ1Y3QgY29uZmlnCit7CisJbG9uZyBzbGVlcDsJCS8qIHNsZWVwIHRpbWUgaW4gwrVzICovCisJbG9uZyBsb2FkOwkJLyogbG9hZCB0aW1lIGluIMK1cyAqLworCWxvbmcgc2xlZXBfc3RlcDsJLyogdGltZSB2YWx1ZSB3aGljaCBjaGFuZ2VzIHRoZQorCQkJCSAqIHNsZWVwIHRpbWUgYWZ0ZXIgZXZlcnkgcm91bmQgaW4gwrVzICovCisJbG9uZyBsb2FkX3N0ZXA7CQkvKiB0aW1lIHZhbHVlIHdoaWNoIGNoYW5nZXMgdGhlCisJCQkJICogbG9hZCB0aW1lIGFmdGVyIGV2ZXJ5IHJvdW5kIGluIMK1cyAqLworCXVuc2lnbmVkIGludCBjeWNsZXM7CS8qIGNhbGN1bGF0aW9uIGN5Y2xlcyB3aXRoIHRoZSBzYW1lIHNsZWVwL2xvYWQgdGltZSAqLworCXVuc2lnbmVkIGludCByb3VuZHM7CS8qIGNhbGN1bGF0aW9uIHJvdW5kcyB3aXRoIGl0ZXJhdGVkIHNsZWVwL2xvYWQgdGltZSAqLworCXVuc2lnbmVkIGludCBjcHU7CS8qIGNwdSBmb3Igd2hpY2ggdGhlIGFmZmluaXR5IGlzIHNldCAqLworCWNoYXIgZ292ZXJub3JbMTVdOwkvKiBjcHVmcmVxIGdvdmVybm9yICovCisJZW51bSBzY2hlZF9wcmlvCQkvKiBwb3NzaWJsZSBzY2hlZHVsZXIgcHJpb3JpdGllcyAqLworCXsKKwkJU0NIRURfRVJSID0gLTEsCisJCVNDSEVEX0hJR0gsCisJCVNDSEVEX0RFRkFVTFQsCisJCVNDSEVEX0xPVworCX0gcHJpbzsKKworCXVuc2lnbmVkIGludCB2ZXJib3NlOwkvKiB2ZXJib3NlIG91dHB1dCAqLworCUZJTEUgKm91dHB1dDsJCS8qIGxvZ2ZpbGUgKi8KKwljaGFyICpvdXRwdXRfZmlsZW5hbWU7CS8qIGxvZ2ZpbGUgbmFtZSwgbXVzdCBiZSBmcmVlZCBhdCB0aGUgZW5kCisJCQkJICAgaWYgb3V0cHV0ICE9IE5VTEwgYW5kIG91dHB1dCAhPSBzdGRvdXQqLworfTsKKworZW51bSBzY2hlZF9wcmlvIHN0cmluZ190b19wcmlvKGNvbnN0IGNoYXIgKnN0cik7CisKK0ZJTEUgKnByZXBhcmVfb3V0cHV0KGNvbnN0IGNoYXIgKmRpcik7CisKK2ludCBwcmVwYXJlX2NvbmZpZyhjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3QgY29uZmlnICpjb25maWcpOworc3RydWN0IGNvbmZpZyAqcHJlcGFyZV9kZWZhdWx0X2NvbmZpZygpOworCmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci9iZW5jaC9zeXN0ZW0uYyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2JlbmNoL3N5c3RlbS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMWUzZjQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci9iZW5jaC9zeXN0ZW0uYwpAQCAtMCwwICsxLDE5MSBAQAorLyogIGNwdWZyZXEtYmVuY2ggQ1BVRnJlcSBtaWNyb2JlbmNobWFyaworICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDggQ2hyaXN0aWFuIEtvcm5hY2tlciA8Y2tvcm5hY2tlckBzdXNlLmRlPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHNjaGVkLmg+CisKKyNpbmNsdWRlIDxjcHVmcmVxLmg+CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJzeXN0ZW0uaCIKKworLyoqCisgKiByZXR1cm5zIHRpbWUgc2luY2UgZXBvY2ggaW4gwrVzCisgKgorICogQHJldHZhbCB0aW1lCisgKiovCisKK2xvbmcgbG9uZyBpbnQgZ2V0X3RpbWUoKQoreworCXN0cnVjdCB0aW1ldmFsIG5vdzsKKworCWdldHRpbWVvZmRheSgmbm93LCBOVUxMKTsKKworCXJldHVybiAobG9uZyBsb25nIGludCkobm93LnR2X3NlYyAqIDEwMDAwMDBMTCArIG5vdy50dl91c2VjKTsKK30KKworLyoqCisgKiBzZXRzIHRoZSBjcHVmcmVxIGdvdmVybm9yCisgKgorICogQHBhcmFtIGdvdmVybm9yIGNwdWZyZXEgZ292ZXJub3IgbmFtZQorICogQHBhcmFtIGNwdSBjcHUgZm9yIHdoaWNoIHRoZSBnb3Zlcm5vciBzaG91bGQgYmUgc2V0CisgKgorICogQHJldHZhbCAwIG9uIHN1Y2Nlc3MKKyAqIEByZXR2YWwgLTEgd2hlbiBmYWlsZWQKKyAqKi8KKworaW50IHNldF9jcHVmcmVxX2dvdmVybm9yKGNoYXIgKmdvdmVybm9yLCB1bnNpZ25lZCBpbnQgY3B1KQoreworCisJZHByaW50Zigic2V0ICVzIGFzIGNwdWZyZXEgZ292ZXJub3JcbiIsIGdvdmVybm9yKTsKKworCWlmIChjcHVmcmVxX2NwdV9leGlzdHMoY3B1KSAhPSAwKSB7CisJCXBlcnJvcigiY3B1ZnJlcV9jcHVfZXhpc3RzIik7CisJCWZwcmludGYoc3RkZXJyLCAiZXJyb3I6IGNwdSAldSBkb2VzIG5vdCBleGlzdFxuIiwgY3B1KTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChjcHVmcmVxX21vZGlmeV9wb2xpY3lfZ292ZXJub3IoY3B1LCBnb3Zlcm5vcikgIT0gMCkgeworCQlwZXJyb3IoImNwdWZyZXFfbW9kaWZ5X3BvbGljeV9nb3Zlcm5vciIpOworCQlmcHJpbnRmKHN0ZGVyciwgImVycm9yOiB1bmFibGUgdG8gc2V0ICVzIGdvdmVybm9yXG4iLCBnb3Zlcm5vcik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBzZXRzIGNwdSBhZmZpbml0eSBmb3IgdGhlIHByb2Nlc3MKKyAqCisgKiBAcGFyYW0gY3B1IGNwdSMgdG8gd2hpY2ggdGhlIGFmZmluaXR5IHNob3VsZCBiZSBzZXQKKyAqCisgKiBAcmV0dmFsIDAgb24gc3VjY2VzcworICogQHJldHZhbCAtMSB3aGVuIHNldHRpbmcgdGhlIGFmZmluaXR5IGZhaWxlZAorICoqLworCitpbnQgc2V0X2NwdV9hZmZpbml0eSh1bnNpZ25lZCBpbnQgY3B1KQoreworCWNwdV9zZXRfdCBjcHVzZXQ7CisKKwlDUFVfWkVSTygmY3B1c2V0KTsKKwlDUFVfU0VUKGNwdSwgJmNwdXNldCk7CisKKwlkcHJpbnRmKCJzZXQgYWZmaW5pdHkgdG8gY3B1ICMldVxuIiwgY3B1KTsKKworCWlmIChzY2hlZF9zZXRhZmZpbml0eShnZXRwaWQoKSwgc2l6ZW9mKGNwdV9zZXRfdCksICZjcHVzZXQpIDwgMCkgeworCQlwZXJyb3IoInNjaGVkX3NldGFmZmluaXR5Iik7CisJCWZwcmludGYoc3RkZXJyLCAid2FybmluZzogdW5hYmxlIHRvIHNldCBjcHUgYWZmaW5pdHlcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc2V0cyB0aGUgcHJvY2VzcyBwcmlvcml0eSBwYXJhbWV0ZXIKKyAqCisgKiBAcGFyYW0gcHJpb3JpdHkgcHJpb3JpdHkgdmFsdWUKKyAqCisgKiBAcmV0dmFsIDAgb24gc3VjY2VzcworICogQHJldHZhbCAtMSB3aGVuIHNldHRpbmcgdGhlIHByaW9yaXR5IGZhaWxlZAorICoqLworCitpbnQgc2V0X3Byb2Nlc3NfcHJpb3JpdHkoaW50IHByaW9yaXR5KQoreworCXN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbTsKKworCWRwcmludGYoInNldCBzY2hlZHVsZXIgcHJpb3JpdHkgdG8gJWlcbiIsIHByaW9yaXR5KTsKKworCXBhcmFtLnNjaGVkX3ByaW9yaXR5ID0gcHJpb3JpdHk7CisKKwlpZiAoc2NoZWRfc2V0c2NoZWR1bGVyKDAsIFNDSEVEVUxFUiwgJnBhcmFtKSA8IDApIHsKKwkJcGVycm9yKCJzY2hlZF9zZXRzY2hlZHVsZXIiKTsKKwkJZnByaW50ZihzdGRlcnIsICJ3YXJuaW5nOiB1bmFibGUgdG8gc2V0IHNjaGVkdWxlciBwcmlvcml0eVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBub3RpZmllcyB0aGUgdXNlciB0aGF0IHRoZSBiZW5jaG1hcmsgbWF5IHJ1biBzb21lIHRpbWUKKyAqCisgKiBAcGFyYW0gY29uZmlnIGJlbmNobWFyayBjb25maWcgdmFsdWVzCisgKgorICoqLworCit2b2lkIHByZXBhcmVfdXNlcihjb25zdCBzdHJ1Y3QgY29uZmlnICpjb25maWcpCit7CisJdW5zaWduZWQgbG9uZyBzbGVlcF90aW1lID0gMDsKKwl1bnNpZ25lZCBsb25nIGxvYWRfdGltZSA9IDA7CisJdW5zaWduZWQgaW50IHJvdW5kOworCisJZm9yIChyb3VuZCA9IDA7IHJvdW5kIDwgY29uZmlnLT5yb3VuZHM7IHJvdW5kKyspIHsKKwkJc2xlZXBfdGltZSArPSAgMiAqIGNvbmZpZy0+Y3ljbGVzICoKKwkJCShjb25maWctPnNsZWVwICsgY29uZmlnLT5zbGVlcF9zdGVwICogcm91bmQpOworCQlsb2FkX3RpbWUgKz0gMiAqIGNvbmZpZy0+Y3ljbGVzICoKKwkJCShjb25maWctPmxvYWQgKyBjb25maWctPmxvYWRfc3RlcCAqIHJvdW5kKSArCisJCQkoY29uZmlnLT5sb2FkICsgY29uZmlnLT5sb2FkX3N0ZXAgKiByb3VuZCAqIDQpOworCX0KKworCWlmIChjb25maWctPnZlcmJvc2UgfHwgY29uZmlnLT5vdXRwdXQgIT0gc3Rkb3V0KQorCQlwcmludGYoImFwcHJveC4gdGVzdCBkdXJhdGlvbjogJWltXG4iLAorCQkgICAgICAgKGludCkoKHNsZWVwX3RpbWUgKyBsb2FkX3RpbWUpIC8gNjAwMDAwMDApKTsKK30KKworLyoqCisgKiBzZXRzIHVwIHRoZSBjcHUgYWZmaW5pdHkgYW5kIHNjaGVkdWxlciBwcmlvcml0eQorICoKKyAqIEBwYXJhbSBjb25maWcgYmVuY2htYXJrIGNvbmZpZyB2YWx1ZXMKKyAqCisgKiovCisKK3ZvaWQgcHJlcGFyZV9zeXN0ZW0oY29uc3Qgc3RydWN0IGNvbmZpZyAqY29uZmlnKQoreworCWlmIChjb25maWctPnZlcmJvc2UpCisJCXByaW50Zigic2V0IGNwdSBhZmZpbml0eSB0byBjcHUgIyV1XG4iLCBjb25maWctPmNwdSk7CisKKwlzZXRfY3B1X2FmZmluaXR5KGNvbmZpZy0+Y3B1KTsKKworCXN3aXRjaCAoY29uZmlnLT5wcmlvKSB7CisJY2FzZSBTQ0hFRF9ISUdIOgorCQlpZiAoY29uZmlnLT52ZXJib3NlKQorCQkJcHJpbnRmKCJoaWdoIHByaW9yaXR5IGNvbmRpdGlvbiByZXF1ZXN0ZWRcbiIpOworCisJCXNldF9wcm9jZXNzX3ByaW9yaXR5KFBSSU9SSVRZX0hJR0gpOworCQlicmVhazsKKwljYXNlIFNDSEVEX0xPVzoKKwkJaWYgKGNvbmZpZy0+dmVyYm9zZSkKKwkJCXByaW50ZigibG93IHByaW9yaXR5IGNvbmRpdGlvbiByZXF1ZXN0ZWRcbiIpOworCisJCXNldF9wcm9jZXNzX3ByaW9yaXR5KFBSSU9SSVRZX0xPVyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWlmIChjb25maWctPnZlcmJvc2UpCisJCQlwcmludGYoImRlZmF1bHQgcHJpb3JpdHkgY29uZGl0aW9uIHJlcXVlc3RlZFxuIik7CisKKwkJc2V0X3Byb2Nlc3NfcHJpb3JpdHkoUFJJT1JJVFlfREVGQVVMVCk7CisJfQorfQorCmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci9iZW5jaC9zeXN0ZW0uaCBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2JlbmNoL3N5c3RlbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOGM4NTgKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci9iZW5jaC9zeXN0ZW0uaApAQCAtMCwwICsxLDI5IEBACisvKiAgY3B1ZnJlcS1iZW5jaCBDUFVGcmVxIG1pY3JvYmVuY2htYXJrCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOCBDaHJpc3RpYW4gS29ybmFja2VyIDxja29ybmFja2VyQHN1c2UuZGU+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlICJwYXJzZS5oIgorCitsb25nIGxvbmcgZ2V0X3RpbWUoKTsKKworaW50IHNldF9jcHVmcmVxX2dvdmVybm9yKGNoYXIgKmdvdmVybm9yLCB1bnNpZ25lZCBpbnQgY3B1KTsKK2ludCBzZXRfY3B1X2FmZmluaXR5KHVuc2lnbmVkIGludCBjcHUpOworaW50IHNldF9wcm9jZXNzX3ByaW9yaXR5KGludCBwcmlvcml0eSk7CisKK3ZvaWQgcHJlcGFyZV91c2VyKGNvbnN0IHN0cnVjdCBjb25maWcgKmNvbmZpZyk7Cit2b2lkIHByZXBhcmVfc3lzdGVtKGNvbnN0IHN0cnVjdCBjb25maWcgKmNvbmZpZyk7CmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci9kZWJ1Zy9pMzg2L01ha2VmaWxlIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvZGVidWcvaTM4Ni9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDhjYzFlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvZGVidWcvaTM4Ni9NYWtlZmlsZQpAQCAtMCwwICsxLDIwIEBACitkZWZhdWx0OiBhbGwKKworY2VudHJpbm8tZGVjb2RlOiBjZW50cmluby1kZWNvZGUuYworCSQoQ0MpICQoQ0ZMQUdTKSAtbyBjZW50cmluby1kZWNvZGUgY2VudHJpbm8tZGVjb2RlLmMKKworZHVtcF9wc2I6IGR1bXBfcHNiLmMKKwkkKENDKSAkKENGTEFHUykgLW8gZHVtcF9wc2IgZHVtcF9wc2IuYworCitpbnRlbF9nc2ljOiBpbnRlbF9nc2ljLmMKKwkkKENDKSAkKENGTEFHUykgLW8gaW50ZWxfZ3NpYyAtbGxybWkgaW50ZWxfZ3NpYy5jCisKK3Bvd2Vybm93LWs4LWRlY29kZTogcG93ZXJub3ctazgtZGVjb2RlLmMKKwkkKENDKSAkKENGTEFHUykgLW8gcG93ZXJub3ctazgtZGVjb2RlIHBvd2Vybm93LWs4LWRlY29kZS5jCisKK2FsbDogY2VudHJpbm8tZGVjb2RlIGR1bXBfcHNiIGludGVsX2dzaWMgcG93ZXJub3ctazgtZGVjb2RlCisKK2NsZWFuOgorCXJtIC1yZiBjZW50cmluby1kZWNvZGUgZHVtcF9wc2IgaW50ZWxfZ3NpYyBwb3dlcm5vdy1rOC1kZWNvZGUKKworLlBIT05ZOiBhbGwgZGVmYXVsdCBjbGVhbgpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvZGVidWcvaTM4Ni9jZW50cmluby1kZWNvZGUuYyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2RlYnVnL2kzODYvY2VudHJpbm8tZGVjb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VmMjRjYwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2RlYnVnL2kzODYvY2VudHJpbm8tZGVjb2RlLmMKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiAgKEMpIDIwMDMgLSAyMDA0ICBEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAZG9taW5pa2Jyb2Rvd3NraS5kZT4KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqIEJhc2VkIG9uIGNvZGUgZm91bmQgaW4KKyAqIGxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvc3BlZWRzdGVwLWNlbnRyaW5vLmMKKyAqIGFuZCBvcmlnaW5hbGx5IGRldmVsb3BlZCBieSBKZXJlbXkgRml0emhhcmRpbmdlLgorICoKKyAqIFVTQUdFOiBzaW1wbHkgcnVuIGl0IHRvIGRlY29kZSB0aGUgY3VycmVudCBzZXR0aW5ncyBvbiBDUFUgMCwKKyAqCSAgb3IgcGFzcyB0aGUgQ1BVIG51bWJlciBhcyBhcmd1bWVudCwgb3IgcGFzcyB0aGUgTVNSIGNvbnRlbnQKKyAqCSAgYXMgYXJndW1lbnQuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2RlZmluZSBNQ1BVCTMyCisKKyNkZWZpbmUgTVNSX0lBMzJfUEVSRl9TVEFUVVMJMHgxOTgKKworc3RhdGljIGludCByZG1zcih1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBpbnQgbXNyLAorCQkgdW5zaWduZWQgaW50ICpsbywgdW5zaWduZWQgaW50ICpoaSkKK3sKKwlpbnQgZmQ7CisJY2hhciBmaWxlWzIwXTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdmFsOworCWludCByZXR2YWwgPSAtMTsKKworCSpsbyA9ICpoaSA9IDA7CisKKwlpZiAoY3B1ID4gTUNQVSkKKwkJZ290byBlcnIxOworCisJc3ByaW50ZihmaWxlLCAiL2Rldi9jcHUvJWQvbXNyIiwgY3B1KTsKKwlmZCA9IG9wZW4oZmlsZSwgT19SRE9OTFkpOworCisJaWYgKGZkIDwgMCkKKwkJZ290byBlcnIxOworCisJaWYgKGxzZWVrKGZkLCBtc3IsIFNFRUtfQ1VSKSA9PSAtMSkKKwkJZ290byBlcnIyOworCisJaWYgKHJlYWQoZmQsICZ2YWwsIDgpICE9IDgpCisJCWdvdG8gZXJyMjsKKworCSpsbyA9ICh1aW50MzJfdCApKHZhbCAmIDB4ZmZmZmZmZmZ1bGwpOworCSpoaSA9ICh1aW50MzJfdCApKHZhbD4+MzIgJiAweGZmZmZmZmZmdWxsKTsKKworCXJldHZhbCA9IDA7CitlcnIyOgorCWNsb3NlKGZkKTsKK2VycjE6CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHZvaWQgZGVjb2RlICh1bnNpZ25lZCBpbnQgbXNyKQoreworCXVuc2lnbmVkIGludCBtdWx0aXBsaWVyOworCXVuc2lnbmVkIGludCBtdjsKKworCW11bHRpcGxpZXIgPSAoKG1zciA+PiA4KSAmIDB4RkYpOworCisJbXYgPSAoKChtc3IgJiAweEZGKSAqIDE2KSArIDcwMCk7CisKKwlwcmludGYoIjB4JXggbWVhbnMgbXVsdGlwbGllciAlZCBAICVkIG1WXG4iLCBtc3IsIG11bHRpcGxpZXIsIG12KTsKK30KKworc3RhdGljIGludCBkZWNvZGVfbGl2ZSh1bnNpZ25lZCBpbnQgY3B1KQoreworCXVuc2lnbmVkIGludCBsbywgaGk7CisJaW50IGVycjsKKworCWVyciA9IHJkbXNyKGNwdSwgTVNSX0lBMzJfUEVSRl9TVEFUVVMsICZsbywgJmhpKTsKKworCWlmIChlcnIpIHsKKwkJcHJpbnRmKCJjYW4ndCBnZXQgTVNSX0lBMzJfUEVSRl9TVEFUVVMgZm9yIGNwdSAlZFxuIiwgY3B1KTsKKwkJcHJpbnRmKCJQb3NzaWJsZSB0cm91YmxlOiB5b3UgZG9uJ3QgcnVuIGFuIEVuaGFuY2VkIFNwZWVkU3RlcCBjYXBhYmxlIGNwdVxuIik7CisJCXByaW50Zigib3IgeW91IGFyZSBub3Qgcm9vdCwgb3IgdGhlIG1zciBkcml2ZXIgaXMgbm90IHByZXNlbnRcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkZWNvZGUobG8pOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBtYWluIChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgaW50IGNwdSwgbW9kZSA9IDA7CisKKwlpZiAoYXJnYyA8IDIpCisJCWNwdSA9IDA7CisJZWxzZSB7CisJCWNwdSA9IHN0cnRvdWwoYXJndlsxXSwgTlVMTCwgMCk7CisJCWlmIChjcHUgPj0gTUNQVSkKKwkJCW1vZGUgPSAxOworCX0KKworCWlmIChtb2RlKQorCQlkZWNvZGUoY3B1KTsKKwllbHNlCisJCWRlY29kZV9saXZlKGNwdSk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2RlYnVnL2kzODYvZHVtcF9wc2IuYyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2RlYnVnL2kzODYvZHVtcF9wc2IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDZhNDc1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvZGVidWcvaTM4Ni9kdW1wX3BzYi5jCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogZHVtcF9wc2IuIChjKSAyMDA0LCBEYXZlIEpvbmVzLCBSZWQgSGF0IEluYy4KKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBHUEwgdjIuCisgKi8KKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2RlZmluZSBfR05VX1NPVVJDRQorI2luY2x1ZGUgPGdldG9wdC5oPgorCisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKworI2RlZmluZSBMRU4gKDB4MTAwMDAwIC0gMHhjMDAwMCkKKyNkZWZpbmUgT0ZGU0VUICgweGMwMDAwKQorCisjaWZuZGVmIF9fcGFja2VkCisjZGVmaW5lIF9fcGFja2VkIF9fYXR0cmlidXRlKChwYWNrZWQpKQorI2VuZGlmCisKK3N0YXRpYyBsb25nIHJlbGV2YW50OworCitzdGF0aWMgY29uc3QgaW50IGZpZF90b19tdWx0WzMyXSA9IHsKKwkxMTAsIDExNSwgMTIwLCAxMjUsIDUwLCA1NSwgNjAsIDY1LAorCTcwLCA3NSwgODAsIDg1LCA5MCwgOTUsIDEwMCwgMTA1LAorCTMwLCAxOTAsIDQwLCAyMDAsIDEzMCwgMTM1LCAxNDAsIDIxMCwKKwkxNTAsIDIyNSwgMTYwLCAxNjUsIDE3MCwgMTgwLCAtMSwgLTEsCit9OworCitzdGF0aWMgY29uc3QgaW50IHZpZF90b192b2x0YWdlWzMyXSA9IHsKKwkyMDAwLCAxOTUwLCAxOTAwLCAxODUwLCAxODAwLCAxNzUwLCAxNzAwLCAxNjUwLAorCTE2MDAsIDE1NTAsIDE1MDAsIDE0NTAsIDE0MDAsIDEzNTAsIDEzMDAsIDAsCisJMTI3NSwgMTI1MCwgMTIyNSwgMTIwMCwgMTE3NSwgMTE1MCwgMTEyNSwgMTEwMCwKKwkxMDc1LCAxMDUwLCAxMDI0LCAxMDAwLCA5NzUsIDk1MCwgOTI1LCAwLAorfTsKKworc3RydWN0IHBzYl9oZWFkZXIgeworCWNoYXIgc2lnbmF0dXJlWzEwXTsKKwl1X2NoYXIgdmVyc2lvbjsKKwl1X2NoYXIgZmxhZ3M7CisJdV9zaG9ydCBzZXR0bGluZ3RpbWU7CisJdV9jaGFyIHJlczE7CisJdV9jaGFyIG51bXBzdDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBwc3RfaGVhZGVyIHsKKwl1X2ludDMyX3QgY3B1aWQ7CisJdV9jaGFyIGZzYjsKKwl1X2NoYXIgbWF4ZmlkOworCXVfY2hhciBzdGFydHZpZDsKKwl1X2NoYXIgbnVtcHN0YXRlczsKK30gX19wYWNrZWQ7CisKK3N0YXRpYyB1X2ludCBmc2I7CitzdGF0aWMgdV9pbnQgc2d0YzsKKworc3RhdGljIGludAorZGVjb2RlX3BzdChjaGFyICpwLCBpbnQgbnBzdGF0ZXMpCit7CisJaW50IGk7CisJaW50IGZyZXEsIGZpZCwgdmlkOworCisJZm9yIChpID0gMDsgaSA8IG5wc3RhdGVzOyArK2kpIHsKKwkJZmlkID0gKnArKzsKKwkJdmlkID0gKnArKzsKKwkJZnJlcSA9IDEwMCAqIGZpZF90b19tdWx0W2ZpZF0gKiBmc2I7CisKKwkJcHJpbnRmKCIgICAlMmQgJThka0h6ICBGSUQgJTAyeCAoJTJkLiUwMWQpICBWSUQgJTAyeCAoJTRkbVYpXG4iLAorCQkgICAgICAgaSwKKwkJICAgICAgIGZyZXEsCisJCSAgICAgICBmaWQsIGZpZF90b19tdWx0W2ZpZF0vMTAsIGZpZF90b19tdWx0W2ZpZF0lMTAsCisJCSAgICAgICB2aWQsIHZpZF90b192b2x0YWdlW3ZpZF0pOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMKK3ZvaWQgZGVjb2RlX3BzYihjaGFyICpwLCBpbnQgbnVtcHN0KQoreworCWludCBpOworCXN0cnVjdCBwc2JfaGVhZGVyICpwc2I7CisJc3RydWN0IHBzdF9oZWFkZXIgKnBzdDsKKworCXBzYiA9IChzdHJ1Y3QgcHNiX2hlYWRlciopIHA7CisKKwlpZiAocHNiLT52ZXJzaW9uICE9IDB4MTIpCisJCXJldHVybjsKKworCXByaW50ZigiUFNCIHZlcnNpb246ICVoaHggZmxhZ3M6ICVoaHggc2V0dGxpbmcgdGltZSAlaGh1dXMgcmVzMSAlaGh4IG51bSBwc3QgJWhodVxuIiwKKwkJCXBzYi0+dmVyc2lvbiwKKwkJCXBzYi0+ZmxhZ3MsCisJCQlwc2ItPnNldHRsaW5ndGltZSwKKwkJCXBzYi0+cmVzMSwKKwkJCXBzYi0+bnVtcHN0KTsKKwlzZ3RjID0gcHNiLT5zZXR0bGluZ3RpbWUgKiAxMDA7CisKKwlpZiAoc2d0YyA8IDEwMDAwKQorCQlzZ3RjID0gMTAwMDA7CisKKwlwID0gKChjaGFyICopIHBzYikgKyBzaXplb2Yoc3RydWN0IHBzYl9oZWFkZXIpOworCisJaWYgKG51bXBzdCA8IDApCisJCW51bXBzdCA9IHBzYi0+bnVtcHN0OworCWVsc2UKKwkJcHJpbnRmKCJPdmVycmlkaW5nIG51bWJlciBvZiBwc3QgOiVkXG4iLCBudW1wc3QpOworCisJZm9yIChpID0gMDsgaSA8IG51bXBzdDsgaSsrKSB7CisJCXBzdCA9IChzdHJ1Y3QgcHN0X2hlYWRlciopIHA7CisKKwkJaWYgKHJlbGV2YW50ICE9IDApIHsKKwkJCWlmIChyZWxldmFudCE9IHBzdC0+Y3B1aWQpCisJCQkJZ290byBuZXh0X29uZTsKKwkJfQorCisJCXByaW50ZigiICBQU1QgJWQgIGNwdWlkICUuM3ggZnNiICVoaHUgbWZpZCAlaGh4IHN2aWQgJWhoeCBudW1iZXJzdGF0ZXMgJWhodVxuIiwKKwkJCQlpKzEsCisJCQkJcHN0LT5jcHVpZCwKKwkJCQlwc3QtPmZzYiwKKwkJCQlwc3QtPm1heGZpZCwKKwkJCQlwc3QtPnN0YXJ0dmlkLAorCQkJCXBzdC0+bnVtcHN0YXRlcyk7CisKKwkJZnNiID0gcHN0LT5mc2I7CisJCWRlY29kZV9wc3QocCArIHNpemVvZihzdHJ1Y3QgcHN0X2hlYWRlciksIHBzdC0+bnVtcHN0YXRlcyk7CisKK25leHRfb25lOgorCQlwICs9IHNpemVvZihzdHJ1Y3QgcHN0X2hlYWRlcikgKyAyKnBzdC0+bnVtcHN0YXRlczsKKwl9CisKK30KKworc3RhdGljIHN0cnVjdCBvcHRpb24gaW5mb19vcHRzW10gPSB7CisJey5uYW1lID0gIm51bXBzdCIsCS5oYXNfYXJnPW5vX2FyZ3VtZW50LAkuZmxhZz1OVUxMLCAudmFsPSduJ30sCit9OworCit2b2lkIHByaW50X2hlbHAodm9pZCkKK3sKKwlwcmludGYgKCJVc2FnZTogZHVtcF9wc2IgW29wdGlvbnNdXG4iKTsKKwlwcmludGYgKCJPcHRpb25zOlxuIik7CisJcHJpbnRmICgiICAtbiwgLS1udW1wc3QgICAgIFNldCBudW1iZXIgb2YgUFNUIHRhYmxlcyB0byBzY2FuXG4iKTsKKwlwcmludGYgKCIgIC1yLCAtLXJlbGV2YW50ICAgT25seSBkaXNwbGF5IFBTVHMgcmVsZXZhbnQgdG8gY3B1aWQgTlxuIik7Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWludCBmZDsKKwlpbnQgbnVtcHN0PS0xOworCWludCByZXQ9MCwgY29udD0xOworCWNoYXIgKm1lbSA9IE5VTEw7CisJY2hhciAqcDsKKworCWRvIHsKKwkJcmV0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgImhyOm46IiwgaW5mb19vcHRzLCBOVUxMKTsKKwkJc3dpdGNoIChyZXQpeworCQljYXNlICc/JzoKKwkJY2FzZSAnaCc6CisJCQlwcmludF9oZWxwKCk7CisJCQljb250ID0gMDsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCXJlbGV2YW50ID0gc3RydG9sKG9wdGFyZywgTlVMTCwgMTYpOworCQkJYnJlYWs7CisJCWNhc2UgJ24nOgorCQkJbnVtcHN0ID0gc3RydG9sKG9wdGFyZywgTlVMTCwgMTApOworCQkJYnJlYWs7CisJCWNhc2UgLTE6CisJCQljb250ID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwl9IHdoaWxlKGNvbnQpOworCisJZmQgPSBvcGVuKCIvZGV2L21lbSIsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKSB7CisJCXByaW50ZiAoIkNvdWxkbid0IG9wZW4gL2Rldi9tZW0uIEFyZSB5b3Ugcm9vdD9cbiIpOworCQlleGl0KDEpOworCX0KKworCW1lbSA9IG1tYXAobWVtLCAweDEwMDAwMCAtIDB4YzAwMDAsIFBST1RfUkVBRCwgTUFQX1NIQVJFRCwgZmQsIDB4YzAwMDApOworCWNsb3NlKGZkKTsKKworCWZvciAocCA9IG1lbTsgcCAtIG1lbSA8IExFTjsgcCs9MTYpIHsKKwkJaWYgKG1lbWNtcChwLCAiQU1ESzdQTk9XISIsIDEwKSA9PSAwKSB7CisJCQlkZWNvZGVfcHNiKHAsIG51bXBzdCk7CisJCQlicmVhazsKKwkJfQorCX0KKworCW11bm1hcChtZW0sIExFTik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci9kZWJ1Zy9pMzg2L2ludGVsX2dzaWMuYyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2RlYnVnL2kzODYvaW50ZWxfZ3NpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZjUyOTMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci9kZWJ1Zy9pMzg2L2ludGVsX2dzaWMuYwpAQCAtMCwwICsxLDc4IEBACisvKgorICogIChDKSAyMDAzICBCcnVubyBEdWNyb3QKKyAqICAoQykgMjAwNCAgRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGRvbWluaWticm9kb3dza2kuZGU+CisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMi4KKyAqCisgKiBCYXNlZCBvbiBjb2RlIGZvdW5kIGluCisgKiBsaW51eC9pbmNsdWRlL2FzbS1pMzg2L2lzdC5oIGFuZCBsaW51eC9hcmNoL2kzODYva2VybmVsL3NldHVwLmMKKyAqIGFuZCBvcmlnaW5hbGx5IGRldmVsb3BlZCBieSBBbmR5IEdyb3ZlciA8YW5kcmV3Lmdyb3ZlckBpbnRlbC5jb20+CisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bHJtaS5oPgorCitpbnQgbWFpbiAodm9pZCkKK3sKKwlzdHJ1Y3QgTFJNSV9yZWdzCXI7CisJaW50CQkJcmV0dmFsOworCisJaWYgKCFMUk1JX2luaXQoKSkKKwkJcmV0dXJuIDA7CisKKwltZW1zZXQoJnIsIDAsIHNpemVvZihyKSk7CisKKwlyLmVheCA9IDB4MDAwMEU5ODA7CisJci5lZHggPSAweDQ3NTM0OTQzOworCisJcmV0dmFsID0gTFJNSV9pbnQoMHgxNSwgJnIpOworCisJaWYgKCFyZXR2YWwpIHsKKwkJcHJpbnRmKCJGYWlsZWQhXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChyLmVheCA9PSAweDQ3NTM0OTQzKSB7CisJCXByaW50ZigiQklPUyBzdXBwb3J0cyBHU0lDIGNhbGw6XG4iKTsKKwkJcHJpbnRmKCJcdHNpZ25hdHVyZTogJWMlYyVjJWNcbiIsCisJCSAgICAgICAoci5lYXggPj4gMjQpICYgMHhmZiwKKwkJICAgICAgIChyLmVheCA+PiAxNikgJiAweGZmLAorCQkgICAgICAgKHIuZWF4ID4+IDgpICYgMHhmZiwKKwkJICAgICAgIChyLmVheCkgJiAweGZmKTsKKwkJcHJpbnRmKCJcdGNvbW1hbmQgcG9ydCA9IDB4JS40eFxuIiwKKwkJICAgICAgIHIuZWJ4ICYgMHhmZmZmKTsKKwkJcHJpbnRmKCJcdGNvbW1hbmQgPSAgICAgIDB4JS40eFxuIiwKKwkJICAgICAgIChyLmVieCA+PiAxNikgJiAweGZmZmYpOworCQlwcmludGYoIlx0ZXZlbnQgcG9ydCA9ICAgMHglLjh4XG4iLCByLmVjeCk7CisJCXByaW50ZigiXHRmbGFncyA9ICAgICAgICAweCUuOHhcbiIsIHIuZWR4KTsKKwkJaWYgKCgoci5lYnggPj4gMTYpICYgMHhmZmZmKSAhPSAweDgyKSB7CisJCQlwcmludGYoIm5vbi1kZWZhdWx0IGNvbW1hbmQgdmFsdWUuIElmIHNwZWVkc3RlcC1zbWkgIgorCQkJICAgICAgICJkb2Vzbid0IHdvcmsgb3V0IG9mIHRoZSBib3gsXG55b3UgbWF5IHdhbnQgdG8gIgorCQkJICAgICAgICJ0cnkgb3V0IHRoZSBkZWZhdWx0IHZhbHVlIGJ5IHBhc3NpbmcgIgorCQkJICAgICAgICJzbWlfY21kPTB4ODIgdG8gdGhlIG1vZHVsZVxuIE9OIFlPVVIgT1dOICIKKwkJCSAgICAgICAiUklTSy5cbiIpOworCQl9CisJCWlmICgoci5lYnggJiAweGZmZmYpICE9IDB4YjIpIHsKKwkJCXByaW50Zigibm9uLWRlZmF1bHQgY29tbWFuZCBwb3J0LiBJZiBzcGVlZHN0ZXAtc21pICIKKwkJCSAgICAgICAiZG9lc24ndCB3b3JrIG91dCBvZiB0aGUgYm94LFxueW91IG1heSB3YW50IHRvICIKKwkJCSAgICAgICAidHJ5IG91dCB0aGUgZGVmYXVsdCB2YWx1ZSBieSBwYXNzaW5nICIKKwkJCSAgICAgICAic21pX3BvcnQ9MHg4MiB0byB0aGUgbW9kdWxlXG4gT04gWU9VUiBPV04gIgorCQkJICAgICAgICJSSVNLLlxuIik7CisJCX0KKwl9IGVsc2UgeworCQlwcmludGYoIkJJT1MgRE9FUyBOT1Qgc3VwcG9ydCBHU0lDIGNhbGwuICBEdW1waW5nIHJlZ2lzdGVycyBhbnl3YXk6XG4iKTsKKwkJcHJpbnRmKCJlYXggPSAweCUuOHhcbiIsIHIuZWF4KTsKKwkJcHJpbnRmKCJlYnggPSAweCUuOHhcbiIsIHIuZWJ4KTsKKwkJcHJpbnRmKCJlY3ggPSAweCUuOHhcbiIsIHIuZWN4KTsKKwkJcHJpbnRmKCJlZHggPSAweCUuOHhcbiIsIHIuZWR4KTsKKwkJcHJpbnRmKCJOb3RlIGFsc28gdGhhdCBzb21lIEJJT1MgZG8gbm90IHN1cHBvcnQgdGhlIGluaXRpYWwgIgorCQkgICAgICAgIkdTSUMgY2FsbCwgYnV0IHRoZSBuZXdlclxuc3BlZWVkc3RlcC1zbWkgZHJpdmVyIG1heSAiCisJCSAgICAgICAid29yay5cbkZvciB0aGlzLCB5b3UgbmVlZCB0byBwYXNzIHNvbWUgYXJndW1lbnRzIHRvICIKKwkJICAgICAgICJ0aGUgc3BlZWRzdGVwLXNtaSBkcml2ZXI6XG4iKTsKKwkJcHJpbnRmKCJcdHNtaV9jbWQ9MHg/PyBzbWlfcG9ydD0weD8/IHNtaV9zaWc9MVxuIik7CisJCXByaW50ZigiXG5VbmZvcnR1bmF0ZWx5LCB5b3UgaGF2ZSB0byBrbm93IHdoYXQgZXhhY3RseSBhcmUgIgorCQkgICAgICAgInNtaV9jbWQgYW5kIHNtaV9wb3J0LCBhbmQgdGhpc1xuaXMgc3lzdGVtICIKKwkJICAgICAgICJkZXBlbmRhbnQuXG4iKTsKKwl9CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci9kZWJ1Zy9pMzg2L3Bvd2Vybm93LWs4LWRlY29kZS5jIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvZGVidWcvaTM4Ni9wb3dlcm5vdy1rOC1kZWNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzhhNmIzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvZGVidWcvaTM4Ni9wb3dlcm5vdy1rOC1kZWNvZGUuYwpAQCAtMCwwICsxLDk2IEBACisvKgorICogIChDKSAyMDA0IEJydW5vIER1Y3JvdCA8ZHVjcm90QHBvdXBpbm91Lm9yZz4KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqIEJhc2VkIG9uIGNvZGUgZm91bmQgaW4KKyAqIGxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazguYworICogYW5kIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGJ5IFBhdWwgRGV2cmllbmR0CisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2RlZmluZSBNQ1BVIDMyCisKKyNkZWZpbmUgTVNSX0ZJRFZJRF9TVEFUVVMJMHhjMDAxMDA0MgorCisjZGVmaW5lIE1TUl9TX0hJX0NVUlJFTlRfVklECTB4MDAwMDAwMWYKKyNkZWZpbmUgTVNSX1NfTE9fQ1VSUkVOVF9GSUQJMHgwMDAwMDAzZgorCitzdGF0aWMgaW50IGdldF9maWR2aWQodWludDMyX3QgY3B1LCB1aW50MzJfdCAqZmlkLCB1aW50MzJfdCAqdmlkKQoreworCWludCBlcnIgPSAxOworCXVpbnQ2NF90IG1zciA9IDA7CisJaW50IGZkOworCWNoYXIgZmlsZVsyMF07CisKKwlpZiAoY3B1ID4gTUNQVSkKKwkJZ290byBvdXQ7CisKKwlzcHJpbnRmKGZpbGUsICIvZGV2L2NwdS8lZC9tc3IiLCBjcHUpOworCisJZmQgPSBvcGVuKGZpbGUsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKQorCQlnb3RvIG91dDsKKwlsc2VlayhmZCwgTVNSX0ZJRFZJRF9TVEFUVVMsIFNFRUtfQ1VSKTsKKwlpZiAocmVhZChmZCwgJm1zciwgOCkgIT0gOCkKKwkJZ290byBlcnIxOworCisJKmZpZCA9ICgodWludDMyX3QgKShtc3IgJiAweGZmZmZmZmZmdWxsKSkgJiBNU1JfU19MT19DVVJSRU5UX0ZJRDsKKwkqdmlkID0gKCh1aW50MzJfdCApKG1zcj4+MzIgJiAweGZmZmZmZmZmdWxsKSkgJiBNU1JfU19ISV9DVVJSRU5UX1ZJRDsKKwllcnIgPSAwOworZXJyMToKKwljbG9zZShmZCk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworCisvKiBSZXR1cm4gYSBmcmVxdWVuY3kgaW4gTUh6LCBnaXZlbiBhbiBpbnB1dCBmaWQgKi8KK3N0YXRpYyB1aW50MzJfdCBmaW5kX2ZyZXFfZnJvbV9maWQodWludDMyX3QgZmlkKQoreworCXJldHVybiA4MDAgKyAoZmlkICogMTAwKTsKK30KKworLyogUmV0dXJuIGEgdm9sdGFnZSBpbiBtaWxpVm9sdHMsIGdpdmVuIGFuIGlucHV0IHZpZCAqLworc3RhdGljIHVpbnQzMl90IGZpbmRfbWlsbGl2b2x0c19mcm9tX3ZpZCh1aW50MzJfdCB2aWQpCit7CisJcmV0dXJuIDE1NTAtdmlkKjI1OworfQorCitpbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgZXJyOworCWludCBjcHU7CisJdWludDMyX3QgZmlkLCB2aWQ7CisKKwlpZiAoYXJnYyA8IDIpCisJCWNwdSA9IDA7CisJZWxzZQorCQljcHUgPSBzdHJ0b3VsKGFyZ3ZbMV0sIE5VTEwsIDApOworCisJZXJyID0gZ2V0X2ZpZHZpZChjcHUsICZmaWQsICZ2aWQpOworCisJaWYgKGVycikgeworCQlwcmludGYoImNhbid0IGdldCBmaWQsIHZpZCBmcm9tIE1TUlxuIik7CisJCXByaW50ZigiUG9zc2libGUgdHJvdWJsZTogeW91IGRvbid0IHJ1biBhIHBvd2Vybm93LWs4IGNhcGFibGUgY3B1XG4iKTsKKwkJcHJpbnRmKCJvciB5b3UgYXJlIG5vdCByb290LCBvciB0aGUgbXNyIGRyaXZlciBpcyBub3QgcHJlc2VudFxuIik7CisJCWV4aXQoMSk7CisJfQorCisJCisJcHJpbnRmKCJjcHUgJWQgY3VycmVudGx5IGF0ICVkIE1IeiBhbmQgJWQgbVZcbiIsCisJCQljcHUsCisJCQlmaW5kX2ZyZXFfZnJvbV9maWQoZmlkKSwKKwkJCWZpbmRfbWlsbGl2b2x0c19mcm9tX3ZpZCh2aWQpKTsKKwkKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2RlYnVnL2tlcm5lbC9NYWtlZmlsZSBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2RlYnVnL2tlcm5lbC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmIxNDZmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvZGVidWcva2VybmVsL01ha2VmaWxlCkBAIC0wLDAgKzEsMjMgQEAKK29iai1tCTo9CisKK0tESVIJOj0gL2xpYi9tb2R1bGVzLyQoc2hlbGwgdW5hbWUgLXIpL2J1aWxkCitQV0QJCTo9ICQoc2hlbGwgcHdkKQorS01JU0MgICA6PSAvbGliL21vZHVsZXMvJChzaGVsbCB1bmFtZSAtcikvY3B1ZnJlcXV0aWxzLworCitpZmVxICgiJChDT05GSUdfWDg2X1RTQykiLCAieSIpCisgIG9iai1tCSArPSBjcHVmcmVxLXRlc3RfdHNjLm8KK2VuZGlmCisKK2RlZmF1bHQ6CisJJChNQUtFKSAtQyAkKEtESVIpIE09JChQV0QpCisKK2NsZWFuOgorCS0gcm0gLXJmICoubyAqLmtvIC50bXAtdmVyc2lvbnMgLiouY21kIC4qLm1vZC4qICoubW9kLmMKKwktIHJtIC1yZiAudG1wX3ZlcnNpb25zKiBNb2R1bGUuc3ltdmVycyBtb2R1bGVzLm9yZGVyCisKK2luc3RhbGw6IGRlZmF1bHQKKwlpbnN0YWxsIC1kICQoS01JU0MpCisJaW5zdGFsbCAtbSA2NDQgLWMgKi5rbyAkKEtNSVNDKQorCS9zYmluL2RlcG1vZCAtYQorCithbGw6CWRlZmF1bHQKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2RlYnVnL2tlcm5lbC9jcHVmcmVxLXRlc3RfdHNjLmMgYi90b29scy9wb3dlci9jcHVwb3dlci9kZWJ1Zy9rZXJuZWwvY3B1ZnJlcS10ZXN0X3RzYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2Y2FjZTYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci9kZWJ1Zy9rZXJuZWwvY3B1ZnJlcS10ZXN0X3RzYy5jCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogdGVzdCBtb2R1bGUgdG8gY2hlY2sgd2hldGhlciB0aGUgVFNDLWJhc2VkIGRlbGF5IHJvdXRpbmUgY29udGludWVzCisgKiB0byB3b3JrIHByb3Blcmx5IGFmdGVyIGNwdWZyZXEgdHJhbnNpdGlvbnMuIE5lZWRzIEFDUEkgdG8gd29yaworICogcHJvcGVybHkuCisgKgorICogQmFzZWQgcGFydGx5IG9uIHRoZSBQb3dlciBNYW5hZ2VtZW50IFRpbWVyIChQTVRNUikgY29kZSB0byBiZSBmb3VuZAorICogaW4gYXJjaC9pMzg2L2tlcm5lbC90aW1lcnMvdGltZXJfcG0uYyBvbiByZWNlbnQgMi42LiBrZXJuZWxzLCBlc3BlY2lhbGx5CisgKiBjb2RlIHdyaXR0ZW4gYnkgSm9obiBTdHVsdHouIFRoZSByZWFkX3BtdG1yIGZ1bmN0aW9uIHdhcyBjb3BpZWQgdmVyYmF0aW0KKyAqIGZyb20gdGhhdCBmaWxlLgorICoKKyAqIChDKSAyMDA0IERvbWluaWsgQnJvZG93c2tpCisgKgorICogVG8gdXNlOgorICogMS4pIHBhc3MgY2xvY2s9dHNjIHRvIHRoZSBrZXJuZWwgb24geW91ciBib290bG9hZGVyCisgKiAyLikgbW9kcHJvYmUgdGhpcyBtb2R1bGUgKGl0J2xsIGZhaWwpCisgKiAzLikgY2hhbmdlIENQVSBmcmVxdWVuY3kKKyAqIDQuKSBtb2Rwcm9iZSB0aGlzIG1vZHVsZSBhZ2FpbgorICogNS4pIGlmIHRoZSB0aGlyZCB2YWx1ZSwgImRpZmZfcG10bXIiLCBjaGFuZ2VzIGJldHdlZW4gMi4gYW5kIDQuLCB0aGUKKyAqICAgICBUU0MtYmFzZWQgZGVsYXkgcm91dGluZSBvbiB0aGUgTGludXgga2VybmVsIGRvZXMgbm90IGNvcnJlY3RseQorICogICAgIGhhbmRsZSB0aGUgY3B1ZnJlcSB0cmFuc2l0aW9uLiBQbGVhc2UgcmVwb3J0IHRoaXMgdG8KKyAqICAgICBjcHVmcmVxQHZnZXIua2VybmVsLm9yZworICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgorI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CisKK3N0YXRpYyBpbnQgcG1fdG1yX2lvcG9ydCA9IDA7CisKKy8qaGVscGVyIGZ1bmN0aW9uIHRvIHNhZmVseSByZWFkIGFjcGkgcG0gdGltZXNvdXJjZSovCitzdGF0aWMgdTMyIHJlYWRfcG10bXIodm9pZCkKK3sKKwl1MzIgdjE9MCx2Mj0wLHYzPTA7CisJLyogSXQgaGFzIGJlZW4gcmVwb3J0ZWQgdGhhdCBiZWNhdXNlIG9mIHZhcmlvdXMgYnJva2VuCisJICogY2hpcHNldHMgKElDSDQsIFBJSVg0IGFuZCBQSUlYNEUpIHdoZXJlIHRoZSBBQ1BJIFBNIHRpbWUKKwkgKiBzb3VyY2UgaXMgbm90IGxhdGNoZWQsIHNvIHlvdSBtdXN0IHJlYWQgaXQgbXVsdGlwbGUKKwkgKiB0aW1lcyB0byBpbnN1cmUgYSBzYWZlIHZhbHVlIGlzIHJlYWQuCisJICovCisJZG8geworCQl2MSA9IGlubChwbV90bXJfaW9wb3J0KTsKKwkJdjIgPSBpbmwocG1fdG1yX2lvcG9ydCk7CisJCXYzID0gaW5sKHBtX3Rtcl9pb3BvcnQpOworCX0gd2hpbGUgKCh2MSA+IHYyICYmIHYxIDwgdjMpIHx8ICh2MiA+IHYzICYmIHYyIDwgdjEpCisJCSB8fCAodjMgPiB2MSAmJiB2MyA8IHYyKSk7CisKKwkvKiBtYXNrIHRoZSBvdXRwdXQgdG8gMjQgYml0cyAqLworCXJldHVybiAodjIgJiAweEZGRkZGRik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGNwdWZyZXFfdGVzdF90c2Modm9pZCkKK3sKKwl1MzIgbm93LCB0aGVuLCBkaWZmOworCXU2NCBub3dfdHNjLCB0aGVuX3RzYywgZGlmZl90c2M7CisJaW50IGk7CisKKwkvKiB0aGUgZm9sbG93aW5nIGNvZGUgc25pcHBlZCBpcyBjb3BpZWQgZnJvbSBhcmNoL3g4Ni9rZXJuZWwvYWNwaS9ib290LmMKKwkgICBvZiBMaW51eCB2Mi42LjI1LiAqLworCisJLyogZGV0ZWN0IHRoZSBsb2NhdGlvbiBvZiB0aGUgQUNQSSBQTSBUaW1lciAqLworCWlmIChhY3BpX2dibF9GQURULmhlYWRlci5yZXZpc2lvbiA+PSBGQURUMl9SRVZJU0lPTl9JRCkgeworCQkvKiBGQURUIHJldi4gMiAqLworCQlpZiAoYWNwaV9nYmxfRkFEVC54cG1fdGltZXJfYmxvY2suc3BhY2VfaWQgIT0KKwkJICAgIEFDUElfQURSX1NQQUNFX1NZU1RFTV9JTykKKwkJCXJldHVybiAwOworCisJCXBtX3Rtcl9pb3BvcnQgPSBhY3BpX2dibF9GQURULnhwbV90aW1lcl9ibG9jay5hZGRyZXNzOworCQkvKgorCQkgKiAiWCIgZmllbGRzIGFyZSBvcHRpb25hbCBleHRlbnNpb25zIHRvIHRoZSBvcmlnaW5hbCBWMS4wCisJCSAqIGZpZWxkcywgc28gd2UgbXVzdCBzZWxlY3RpdmVseSBleHBhbmQgVjEuMCBmaWVsZHMgaWYgdGhlCisJCSAqIGNvcnJlc3BvbmRpbmcgWCBmaWVsZCBpcyB6ZXJvLgorCSAJICovCisJCWlmICghcG1fdG1yX2lvcG9ydCkKKwkJCXBtX3Rtcl9pb3BvcnQgPSBhY3BpX2dibF9GQURULnBtX3RpbWVyX2Jsb2NrOworCX0gZWxzZSB7CisJCS8qIEZBRFQgcmV2LiAxICovCisJCXBtX3Rtcl9pb3BvcnQgPSBhY3BpX2dibF9GQURULnBtX3RpbWVyX2Jsb2NrOworCX0KKworCXByaW50ayhLRVJOX0RFQlVHICJzdGFydC0tPiBcbiIpOworCXRoZW4gPSByZWFkX3BtdG1yKCk7CisgICAgICAgIHJkdHNjbGwodGhlbl90c2MpOworCWZvciAoaT0wO2k8MjA7aSsrKSB7CisJCW1kZWxheSgxMDApOworCQlub3cgPSByZWFkX3BtdG1yKCk7CisJCXJkdHNjbGwobm93X3RzYyk7CisJCWRpZmYgPSAobm93IC0gdGhlbikgJiAweEZGRkZGRjsKKwkJZGlmZl90c2MgPSBub3dfdHNjIC0gdGhlbl90c2M7CisJCXByaW50ayhLRVJOX0RFQlVHICJ0MTogJTA4dSB0MjogJTA4dSBkaWZmX3BtdG1yOiAlMDh1IGRpZmZfdHNjOiAlMDE2bGx1XG4iLCB0aGVuLCBub3csIGRpZmYsIGRpZmZfdHNjKTsKKwkJdGhlbiA9IG5vdzsKKwkJdGhlbl90c2MgPSBub3dfdHNjOworCX0KKwlwcmludGsoS0VSTl9ERUJVRyAiPC0tIGVuZCBcbiIpOworCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY3B1ZnJlcV9ub25lKHZvaWQpCit7CisJcmV0dXJuOworfQorCittb2R1bGVfaW5pdChjcHVmcmVxX3Rlc3RfdHNjKQorbW9kdWxlX2V4aXQoY3B1ZnJlcV9ub25lKQorCisKK01PRFVMRV9BVVRIT1IoIkRvbWluaWsgQnJvZG93c2tpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlZlcmlmeSB0aGUgVFNDIGNwdWZyZXEgbm90aWZpZXIgd29ya2luZyBjb3JyZWN0bHkgLS0gbmVlZHMgQUNQSS1lbmFibGVkIHN5c3RlbSIpOworTU9EVUxFX0xJQ0VOU0UgKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2RlYnVnL3g4Nl82NC9NYWtlZmlsZSBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2RlYnVnL3g4Nl82NC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmYxMzk5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvZGVidWcveDg2XzY0L01ha2VmaWxlCkBAIC0wLDAgKzEsMTQgQEAKK2RlZmF1bHQ6IGFsbAorCitjZW50cmluby1kZWNvZGU6IGNlbnRyaW5vLWRlY29kZS5jCisJJChDQykgJChDRkxBR1MpIC1vIGNlbnRyaW5vLWRlY29kZSBjZW50cmluby1kZWNvZGUuYworCitwb3dlcm5vdy1rOC1kZWNvZGU6IHBvd2Vybm93LWs4LWRlY29kZS5jCisJJChDQykgJChDRkxBR1MpIC1vIHBvd2Vybm93LWs4LWRlY29kZSBwb3dlcm5vdy1rOC1kZWNvZGUuYworCithbGw6IGNlbnRyaW5vLWRlY29kZSBwb3dlcm5vdy1rOC1kZWNvZGUKKworY2xlYW46CisJcm0gLXJmIGNlbnRyaW5vLWRlY29kZSBwb3dlcm5vdy1rOC1kZWNvZGUKKworLlBIT05ZOiBhbGwgZGVmYXVsdCBjbGVhbgpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvZGVidWcveDg2XzY0L2NlbnRyaW5vLWRlY29kZS5jIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvZGVidWcveDg2XzY0L2NlbnRyaW5vLWRlY29kZS5jCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjI2ZmIzZjEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci9kZWJ1Zy94ODZfNjQvY2VudHJpbm8tZGVjb2RlLmMKQEAgLTAsMCArMSBAQAorLi4vaTM4Ni9jZW50cmluby1kZWNvZGUuYwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2RlYnVnL3g4Nl82NC9wb3dlcm5vdy1rOC1kZWNvZGUuYyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2RlYnVnL3g4Nl82NC9wb3dlcm5vdy1rOC1kZWNvZGUuYwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5lYjMwYzc5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvZGVidWcveDg2XzY0L3Bvd2Vybm93LWs4LWRlY29kZS5jCkBAIC0wLDAgKzEgQEAKKy4uL2kzODYvcG93ZXJub3ctazgtZGVjb2RlLmMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci9saWIvY3B1ZnJlcS5jIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvbGliL2NwdWZyZXEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTYxMTAxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvbGliL2NwdWZyZXEuYwpAQCAtMCwwICsxLDIwOCBAQAorLyoKKyAqICAoQykgMjAwNC0yMDA5ICBEb21pbmlrIEJyb2Rvd3NraSA8bGludXhAZG9taW5pa2Jyb2Rvd3NraS5kZT4KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgImNwdWZyZXEuaCIKKyNpbmNsdWRlICJzeXNmcy5oIgorCitpbnQgY3B1ZnJlcV9jcHVfZXhpc3RzKHVuc2lnbmVkIGludCBjcHUpCit7CisJcmV0dXJuIHN5c2ZzX2NwdV9leGlzdHMoY3B1KTsKK30KKwordW5zaWduZWQgbG9uZyBjcHVmcmVxX2dldF9mcmVxX2tlcm5lbCh1bnNpZ25lZCBpbnQgY3B1KQoreworCXJldHVybiBzeXNmc19nZXRfZnJlcV9rZXJuZWwoY3B1KTsKK30KKwordW5zaWduZWQgbG9uZyBjcHVmcmVxX2dldF9mcmVxX2hhcmR3YXJlKHVuc2lnbmVkIGludCBjcHUpCit7CisJcmV0dXJuIHN5c2ZzX2dldF9mcmVxX2hhcmR3YXJlKGNwdSk7Cit9CisKK3Vuc2lnbmVkIGxvbmcgY3B1ZnJlcV9nZXRfdHJhbnNpdGlvbl9sYXRlbmN5KHVuc2lnbmVkIGludCBjcHUpCit7CisJcmV0dXJuIHN5c2ZzX2dldF9mcmVxX3RyYW5zaXRpb25fbGF0ZW5jeShjcHUpOworfQorCitpbnQgY3B1ZnJlcV9nZXRfaGFyZHdhcmVfbGltaXRzKHVuc2lnbmVkIGludCBjcHUsCisJCQkJdW5zaWduZWQgbG9uZyAqbWluLAorCQkJCXVuc2lnbmVkIGxvbmcgKm1heCkKK3sKKwlpZiAoKCFtaW4pIHx8ICghbWF4KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHN5c2ZzX2dldF9mcmVxX2hhcmR3YXJlX2xpbWl0cyhjcHUsIG1pbiwgbWF4KTsKK30KKworY2hhciAqY3B1ZnJlcV9nZXRfZHJpdmVyKHVuc2lnbmVkIGludCBjcHUpCit7CisJcmV0dXJuIHN5c2ZzX2dldF9mcmVxX2RyaXZlcihjcHUpOworfQorCit2b2lkIGNwdWZyZXFfcHV0X2RyaXZlcihjaGFyICpwdHIpCit7CisJaWYgKCFwdHIpCisJCXJldHVybjsKKwlmcmVlKHB0cik7Cit9CisKK3N0cnVjdCBjcHVmcmVxX3BvbGljeSAqY3B1ZnJlcV9nZXRfcG9saWN5KHVuc2lnbmVkIGludCBjcHUpCit7CisJcmV0dXJuIHN5c2ZzX2dldF9mcmVxX3BvbGljeShjcHUpOworfQorCit2b2lkIGNwdWZyZXFfcHV0X3BvbGljeShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlpZiAoKCFwb2xpY3kpIHx8ICghcG9saWN5LT5nb3Zlcm5vcikpCisJCXJldHVybjsKKworCWZyZWUocG9saWN5LT5nb3Zlcm5vcik7CisJcG9saWN5LT5nb3Zlcm5vciA9IE5VTEw7CisJZnJlZShwb2xpY3kpOworfQorCitzdHJ1Y3QgY3B1ZnJlcV9hdmFpbGFibGVfZ292ZXJub3JzICpjcHVmcmVxX2dldF9hdmFpbGFibGVfZ292ZXJub3JzKHVuc2lnbmVkCisJCQkJCQkJCWludCBjcHUpCit7CisJcmV0dXJuIHN5c2ZzX2dldF9mcmVxX2F2YWlsYWJsZV9nb3Zlcm5vcnMoY3B1KTsKK30KKwordm9pZCBjcHVmcmVxX3B1dF9hdmFpbGFibGVfZ292ZXJub3JzKHN0cnVjdCBjcHVmcmVxX2F2YWlsYWJsZV9nb3Zlcm5vcnMgKmFueSkKK3sKKwlzdHJ1Y3QgY3B1ZnJlcV9hdmFpbGFibGVfZ292ZXJub3JzICp0bXAsICpuZXh0OworCisJaWYgKCFhbnkpCisJCXJldHVybjsKKworCXRtcCA9IGFueS0+Zmlyc3Q7CisJd2hpbGUgKHRtcCkgeworCQluZXh0ID0gdG1wLT5uZXh0OworCQlpZiAodG1wLT5nb3Zlcm5vcikKKwkJCWZyZWUodG1wLT5nb3Zlcm5vcik7CisJCWZyZWUodG1wKTsKKwkJdG1wID0gbmV4dDsKKwl9Cit9CisKKworc3RydWN0IGNwdWZyZXFfYXZhaWxhYmxlX2ZyZXF1ZW5jaWVzCisqY3B1ZnJlcV9nZXRfYXZhaWxhYmxlX2ZyZXF1ZW5jaWVzKHVuc2lnbmVkIGludCBjcHUpCit7CisJcmV0dXJuIHN5c2ZzX2dldF9hdmFpbGFibGVfZnJlcXVlbmNpZXMoY3B1KTsKK30KKwordm9pZCBjcHVmcmVxX3B1dF9hdmFpbGFibGVfZnJlcXVlbmNpZXMoc3RydWN0IGNwdWZyZXFfYXZhaWxhYmxlX2ZyZXF1ZW5jaWVzCisJCQkJKmFueSkgeworCXN0cnVjdCBjcHVmcmVxX2F2YWlsYWJsZV9mcmVxdWVuY2llcyAqdG1wLCAqbmV4dDsKKworCWlmICghYW55KQorCQlyZXR1cm47CisKKwl0bXAgPSBhbnktPmZpcnN0OworCXdoaWxlICh0bXApIHsKKwkJbmV4dCA9IHRtcC0+bmV4dDsKKwkJZnJlZSh0bXApOworCQl0bXAgPSBuZXh0OworCX0KK30KKworCitzdHJ1Y3QgY3B1ZnJlcV9hZmZlY3RlZF9jcHVzICpjcHVmcmVxX2dldF9hZmZlY3RlZF9jcHVzKHVuc2lnbmVkIGludCBjcHUpCit7CisJcmV0dXJuIHN5c2ZzX2dldF9mcmVxX2FmZmVjdGVkX2NwdXMoY3B1KTsKK30KKwordm9pZCBjcHVmcmVxX3B1dF9hZmZlY3RlZF9jcHVzKHN0cnVjdCBjcHVmcmVxX2FmZmVjdGVkX2NwdXMgKmFueSkKK3sKKwlzdHJ1Y3QgY3B1ZnJlcV9hZmZlY3RlZF9jcHVzICp0bXAsICpuZXh0OworCisJaWYgKCFhbnkpCisJCXJldHVybjsKKworCXRtcCA9IGFueS0+Zmlyc3Q7CisJd2hpbGUgKHRtcCkgeworCQluZXh0ID0gdG1wLT5uZXh0OworCQlmcmVlKHRtcCk7CisJCXRtcCA9IG5leHQ7CisJfQorfQorCisKK3N0cnVjdCBjcHVmcmVxX2FmZmVjdGVkX2NwdXMgKmNwdWZyZXFfZ2V0X3JlbGF0ZWRfY3B1cyh1bnNpZ25lZCBpbnQgY3B1KQoreworCXJldHVybiBzeXNmc19nZXRfZnJlcV9yZWxhdGVkX2NwdXMoY3B1KTsKK30KKwordm9pZCBjcHVmcmVxX3B1dF9yZWxhdGVkX2NwdXMoc3RydWN0IGNwdWZyZXFfYWZmZWN0ZWRfY3B1cyAqYW55KQoreworCWNwdWZyZXFfcHV0X2FmZmVjdGVkX2NwdXMoYW55KTsKK30KKworCitpbnQgY3B1ZnJlcV9zZXRfcG9saWN5KHVuc2lnbmVkIGludCBjcHUsIHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCWlmICghcG9saWN5IHx8ICEocG9saWN5LT5nb3Zlcm5vcikpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHN5c2ZzX3NldF9mcmVxX3BvbGljeShjcHUsIHBvbGljeSk7Cit9CisKKworaW50IGNwdWZyZXFfbW9kaWZ5X3BvbGljeV9taW4odW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgbG9uZyBtaW5fZnJlcSkKK3sKKwlyZXR1cm4gc3lzZnNfbW9kaWZ5X2ZyZXFfcG9saWN5X21pbihjcHUsIG1pbl9mcmVxKTsKK30KKworCitpbnQgY3B1ZnJlcV9tb2RpZnlfcG9saWN5X21heCh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBsb25nIG1heF9mcmVxKQoreworCXJldHVybiBzeXNmc19tb2RpZnlfZnJlcV9wb2xpY3lfbWF4KGNwdSwgbWF4X2ZyZXEpOworfQorCisKK2ludCBjcHVmcmVxX21vZGlmeV9wb2xpY3lfZ292ZXJub3IodW5zaWduZWQgaW50IGNwdSwgY2hhciAqZ292ZXJub3IpCit7CisJaWYgKCghZ292ZXJub3IpIHx8IChzdHJsZW4oZ292ZXJub3IpID4gMTkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBzeXNmc19tb2RpZnlfZnJlcV9wb2xpY3lfZ292ZXJub3IoY3B1LCBnb3Zlcm5vcik7Cit9CisKK2ludCBjcHVmcmVxX3NldF9mcmVxdWVuY3kodW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgbG9uZyB0YXJnZXRfZnJlcXVlbmN5KQoreworCXJldHVybiBzeXNmc19zZXRfZnJlcXVlbmN5KGNwdSwgdGFyZ2V0X2ZyZXF1ZW5jeSk7Cit9CisKK3N0cnVjdCBjcHVmcmVxX3N0YXRzICpjcHVmcmVxX2dldF9zdGF0cyh1bnNpZ25lZCBpbnQgY3B1LAorCQkJCQl1bnNpZ25lZCBsb25nIGxvbmcgKnRvdGFsX3RpbWUpCit7CisJcmV0dXJuIHN5c2ZzX2dldF9mcmVxX3N0YXRzKGNwdSwgdG90YWxfdGltZSk7Cit9CisKK3ZvaWQgY3B1ZnJlcV9wdXRfc3RhdHMoc3RydWN0IGNwdWZyZXFfc3RhdHMgKmFueSkKK3sKKwlzdHJ1Y3QgY3B1ZnJlcV9zdGF0cyAqdG1wLCAqbmV4dDsKKworCWlmICghYW55KQorCQlyZXR1cm47CisKKwl0bXAgPSBhbnktPmZpcnN0OworCXdoaWxlICh0bXApIHsKKwkJbmV4dCA9IHRtcC0+bmV4dDsKKwkJZnJlZSh0bXApOworCQl0bXAgPSBuZXh0OworCX0KK30KKwordW5zaWduZWQgbG9uZyBjcHVmcmVxX2dldF90cmFuc2l0aW9ucyh1bnNpZ25lZCBpbnQgY3B1KQoreworCXJldHVybiBzeXNmc19nZXRfZnJlcV90cmFuc2l0aW9ucyhjcHUpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvbGliL2NwdWZyZXEuaCBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2xpYi9jcHVmcmVxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FhZThlNwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2xpYi9jcHVmcmVxLmgKQEAgLTAsMCArMSwyMjMgQEAKKy8qCisgKiAgY3B1ZnJlcS5oIC0gZGVmaW5pdGlvbnMgZm9yIGxpYmNwdWZyZXEKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDkgIERvbWluaWsgQnJvZG93c2tpIDxsaW51eEBkb21pbmlrYnJvZG93c2tpLmRlPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQorICovCisKKyNpZm5kZWYgX0NQVUZSRVFfSAorI2RlZmluZSBfQ1BVRlJFUV9IIDEKKworc3RydWN0IGNwdWZyZXFfcG9saWN5IHsKKwl1bnNpZ25lZCBsb25nIG1pbjsKKwl1bnNpZ25lZCBsb25nIG1heDsKKwljaGFyICpnb3Zlcm5vcjsKK307CisKK3N0cnVjdCBjcHVmcmVxX2F2YWlsYWJsZV9nb3Zlcm5vcnMgeworCWNoYXIgKmdvdmVybm9yOworCXN0cnVjdCBjcHVmcmVxX2F2YWlsYWJsZV9nb3Zlcm5vcnMgKm5leHQ7CisJc3RydWN0IGNwdWZyZXFfYXZhaWxhYmxlX2dvdmVybm9ycyAqZmlyc3Q7Cit9OworCitzdHJ1Y3QgY3B1ZnJlcV9hdmFpbGFibGVfZnJlcXVlbmNpZXMgeworCXVuc2lnbmVkIGxvbmcgZnJlcXVlbmN5OworCXN0cnVjdCBjcHVmcmVxX2F2YWlsYWJsZV9mcmVxdWVuY2llcyAqbmV4dDsKKwlzdHJ1Y3QgY3B1ZnJlcV9hdmFpbGFibGVfZnJlcXVlbmNpZXMgKmZpcnN0OworfTsKKworCitzdHJ1Y3QgY3B1ZnJlcV9hZmZlY3RlZF9jcHVzIHsKKwl1bnNpZ25lZCBpbnQgY3B1OworCXN0cnVjdCBjcHVmcmVxX2FmZmVjdGVkX2NwdXMgKm5leHQ7CisJc3RydWN0IGNwdWZyZXFfYWZmZWN0ZWRfY3B1cyAqZmlyc3Q7Cit9OworCitzdHJ1Y3QgY3B1ZnJlcV9zdGF0cyB7CisJdW5zaWduZWQgbG9uZyBmcmVxdWVuY3k7CisJdW5zaWduZWQgbG9uZyBsb25nIHRpbWVfaW5fc3RhdGU7CisJc3RydWN0IGNwdWZyZXFfc3RhdHMgKm5leHQ7CisJc3RydWN0IGNwdWZyZXFfc3RhdHMgKmZpcnN0OworfTsKKworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyoKKyAqIHJldHVybnMgMCBpZiB0aGUgc3BlY2lmaWVkIENQVSBpcyBwcmVzZW50IChpdCBkb2Vzbid0IHNheQorICogd2hldGhlciBpdCBpcyBvbmxpbmUhKSwgYW5kIGFuIGVycm9yIHZhbHVlIGlmIG5vdC4KKyAqLworCitleHRlcm4gaW50IGNwdWZyZXFfY3B1X2V4aXN0cyh1bnNpZ25lZCBpbnQgY3B1KTsKKworLyogZGV0ZXJtaW5lIGN1cnJlbnQgQ1BVIGZyZXF1ZW5jeQorICogLSBfa2VybmVsIHZhcmlhbnQgbWVhbnMga2VybmVsJ3Mgb3BpbmlvbiBvZiBDUFUgZnJlcXVlbmN5CisgKiAtIF9oYXJkd2FyZSB2YXJpYW50IG1lYW5zIGFjdHVhbCBoYXJkd2FyZSBDUFUgZnJlcXVlbmN5LAorICogICAgd2hpY2ggaXMgb25seSBhdmFpbGFibGUgdG8gcm9vdC4KKyAqCisgKiByZXR1cm5zIDAgb24gZmFpbHVyZSwgZWxzZSBmcmVxdWVuY3kgaW4ga0h6LgorICovCisKK2V4dGVybiB1bnNpZ25lZCBsb25nIGNwdWZyZXFfZ2V0X2ZyZXFfa2VybmVsKHVuc2lnbmVkIGludCBjcHUpOworCitleHRlcm4gdW5zaWduZWQgbG9uZyBjcHVmcmVxX2dldF9mcmVxX2hhcmR3YXJlKHVuc2lnbmVkIGludCBjcHUpOworCisjZGVmaW5lIGNwdWZyZXFfZ2V0KGNwdSkgY3B1ZnJlcV9nZXRfZnJlcV9rZXJuZWwoY3B1KTsKKworCisvKiBkZXRlcm1pbmUgQ1BVIHRyYW5zaXRpb24gbGF0ZW5jeQorICoKKyAqIHJldHVybnMgMCBvbiBmYWlsdXJlLCBlbHNlIHRyYW5zaXRpb24gbGF0ZW5jeSBpbiAxMF4oLTkpIHMgPSBuYW5vc2Vjb25kcworICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBjcHVmcmVxX2dldF90cmFuc2l0aW9uX2xhdGVuY3kodW5zaWduZWQgaW50IGNwdSk7CisKKworLyogZGV0ZXJtaW5lIGhhcmR3YXJlIENQVSBmcmVxdWVuY3kgbGltaXRzCisgKgorICogVGhlc2UgbWF5IGJlIGxpbWl0ZWQgZnVydGhlciBieSB0aGVybWFsLCBlbmVyZ3kgb3Igb3RoZXIKKyAqIGNvbnNpZGVyYXRpb25zIGJ5IGNwdWZyZXEgcG9saWN5IG5vdGlmaWVycyBpbiB0aGUga2VybmVsLgorICovCisKK2V4dGVybiBpbnQgY3B1ZnJlcV9nZXRfaGFyZHdhcmVfbGltaXRzKHVuc2lnbmVkIGludCBjcHUsCisJCQkJdW5zaWduZWQgbG9uZyAqbWluLAorCQkJCXVuc2lnbmVkIGxvbmcgKm1heCk7CisKKworLyogZGV0ZXJtaW5lIENQVWZyZXEgZHJpdmVyIHVzZWQKKyAqCisgKiBSZW1lbWJlciB0byBjYWxsIGNwdWZyZXFfcHV0X2RyaXZlciB3aGVuIG5vIGxvbmdlciBuZWVkZWQKKyAqIHRvIGF2b2lkIG1lbW9yeSBsZWFrYWdlLCBwbGVhc2UuCisgKi8KKworZXh0ZXJuIGNoYXIgKmNwdWZyZXFfZ2V0X2RyaXZlcih1bnNpZ25lZCBpbnQgY3B1KTsKKworZXh0ZXJuIHZvaWQgY3B1ZnJlcV9wdXRfZHJpdmVyKGNoYXIgKnB0cik7CisKKworLyogZGV0ZXJtaW5lIENQVWZyZXEgcG9saWN5IGN1cnJlbnRseSB1c2VkCisgKgorICogUmVtZW1iZXIgdG8gY2FsbCBjcHVmcmVxX3B1dF9wb2xpY3kgd2hlbiBubyBsb25nZXIgbmVlZGVkCisgKiB0byBhdm9pZCBtZW1vcnkgbGVha2FnZSwgcGxlYXNlLgorICovCisKKworZXh0ZXJuIHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqY3B1ZnJlcV9nZXRfcG9saWN5KHVuc2lnbmVkIGludCBjcHUpOworCitleHRlcm4gdm9pZCBjcHVmcmVxX3B1dF9wb2xpY3koc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpOworCisKKy8qIGRldGVybWluZSBDUFVmcmVxIGdvdmVybm9ycyBjdXJyZW50bHkgYXZhaWxhYmxlCisgKgorICogbWF5IGJlIG1vZGlmaWVkIGJ5IG1vZHByb2JlJ2luZyBvciBybW1vZCdpbmcgb3RoZXIgZ292ZXJub3JzLiBQbGVhc2UKKyAqIGZyZWUgYWxsb2NhdGVkIG1lbW9yeSBieSBjYWxsaW5nIGNwdWZyZXFfcHV0X2F2YWlsYWJsZV9nb3Zlcm5vcnMKKyAqIGFmdGVyIHVzZS4KKyAqLworCisKK2V4dGVybiBzdHJ1Y3QgY3B1ZnJlcV9hdmFpbGFibGVfZ292ZXJub3JzCisqY3B1ZnJlcV9nZXRfYXZhaWxhYmxlX2dvdmVybm9ycyh1bnNpZ25lZCBpbnQgY3B1KTsKKworZXh0ZXJuIHZvaWQgY3B1ZnJlcV9wdXRfYXZhaWxhYmxlX2dvdmVybm9ycygKKwlzdHJ1Y3QgY3B1ZnJlcV9hdmFpbGFibGVfZ292ZXJub3JzICpmaXJzdCk7CisKKworLyogZGV0ZXJtaW5lIENQVSBmcmVxdWVuY3kgc3RhdGVzIGF2YWlsYWJsZQorICoKKyAqIE9ubHkgcHJlc2VudCBvbiBfc29tZV8gLT50YXJnZXQoKSBjcHVmcmVxIGRyaXZlcnMuIEZvciBpbmZvcm1hdGlvbiBwdXJwb3NlcworICogb25seS4gUGxlYXNlIGZyZWUgYWxsb2NhdGVkIG1lbW9yeSBieSBjYWxsaW5nCisgKiBjcHVmcmVxX3B1dF9hdmFpbGFibGVfZnJlcXVlbmNpZXMgYWZ0ZXIgdXNlLgorICovCisKK2V4dGVybiBzdHJ1Y3QgY3B1ZnJlcV9hdmFpbGFibGVfZnJlcXVlbmNpZXMKKypjcHVmcmVxX2dldF9hdmFpbGFibGVfZnJlcXVlbmNpZXModW5zaWduZWQgaW50IGNwdSk7CisKK2V4dGVybiB2b2lkIGNwdWZyZXFfcHV0X2F2YWlsYWJsZV9mcmVxdWVuY2llcygKKwkJc3RydWN0IGNwdWZyZXFfYXZhaWxhYmxlX2ZyZXF1ZW5jaWVzICpmaXJzdCk7CisKKworLyogZGV0ZXJtaW5lIGFmZmVjdGVkIENQVXMKKyAqCisgKiBSZW1lbWJlciB0byBjYWxsIGNwdWZyZXFfcHV0X2FmZmVjdGVkX2NwdXMgd2hlbiBubyBsb25nZXIgbmVlZGVkCisgKiB0byBhdm9pZCBtZW1vcnkgbGVha2FnZSwgcGxlYXNlLgorICovCisKK2V4dGVybiBzdHJ1Y3QgY3B1ZnJlcV9hZmZlY3RlZF9jcHVzICpjcHVmcmVxX2dldF9hZmZlY3RlZF9jcHVzKHVuc2lnbmVkCisJCQkJCQkJaW50IGNwdSk7CisKK2V4dGVybiB2b2lkIGNwdWZyZXFfcHV0X2FmZmVjdGVkX2NwdXMoc3RydWN0IGNwdWZyZXFfYWZmZWN0ZWRfY3B1cyAqZmlyc3QpOworCisKKy8qIGRldGVybWluZSByZWxhdGVkIENQVXMKKyAqCisgKiBSZW1lbWJlciB0byBjYWxsIGNwdWZyZXFfcHV0X3JlbGF0ZWRfY3B1cyB3aGVuIG5vIGxvbmdlciBuZWVkZWQKKyAqIHRvIGF2b2lkIG1lbW9yeSBsZWFrYWdlLCBwbGVhc2UuCisgKi8KKworZXh0ZXJuIHN0cnVjdCBjcHVmcmVxX2FmZmVjdGVkX2NwdXMgKmNwdWZyZXFfZ2V0X3JlbGF0ZWRfY3B1cyh1bnNpZ25lZAorCQkJCQkJCWludCBjcHUpOworCitleHRlcm4gdm9pZCBjcHVmcmVxX3B1dF9yZWxhdGVkX2NwdXMoc3RydWN0IGNwdWZyZXFfYWZmZWN0ZWRfY3B1cyAqZmlyc3QpOworCisKKy8qIGRldGVybWluZSBzdGF0cyBmb3IgY3B1ZnJlcSBzdWJzeXN0ZW0KKyAqCisgKiBUaGlzIGlzIG5vdCBhdmFpbGFibGUgaW4gYWxsIGtlcm5lbCB2ZXJzaW9ucyBvciBjb25maWd1cmF0aW9ucy4KKyAqLworCitleHRlcm4gc3RydWN0IGNwdWZyZXFfc3RhdHMgKmNwdWZyZXFfZ2V0X3N0YXRzKHVuc2lnbmVkIGludCBjcHUsCisJCQkJCXVuc2lnbmVkIGxvbmcgbG9uZyAqdG90YWxfdGltZSk7CisKK2V4dGVybiB2b2lkIGNwdWZyZXFfcHV0X3N0YXRzKHN0cnVjdCBjcHVmcmVxX3N0YXRzICpzdGF0cyk7CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIGNwdWZyZXFfZ2V0X3RyYW5zaXRpb25zKHVuc2lnbmVkIGludCBjcHUpOworCisKKy8qIHNldCBuZXcgY3B1ZnJlcSBwb2xpY3kKKyAqCisgKiBUcmllcyB0byBzZXQgdGhlIHBhc3NlZCBwb2xpY3kgYXMgbmV3IHBvbGljeSBhcyBjbG9zZSBhcyBwb3NzaWJsZSwKKyAqIGJ1dCByZXN1bHRzIG1heSBkaWZmZXIgZGVwZW5kaW5nIGUuZy4gb24gZ292ZXJub3JzIGJlaW5nIGF2YWlsYWJsZS4KKyAqLworCitleHRlcm4gaW50IGNwdWZyZXFfc2V0X3BvbGljeSh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSk7CisKKworLyogbW9kaWZ5IGEgcG9saWN5IGJ5IG9ubHkgY2hhbmdpbmcgbWluL21heCBmcmVxIG9yIGdvdmVybm9yCisgKgorICogRG9lcyBub3QgY2hlY2sgd2hldGhlciByZXN1bHQgaXMgd2hhdCB3YXMgaW50ZW5kZWQuCisgKi8KKworZXh0ZXJuIGludCBjcHVmcmVxX21vZGlmeV9wb2xpY3lfbWluKHVuc2lnbmVkIGludCBjcHUsIHVuc2lnbmVkIGxvbmcgbWluX2ZyZXEpOworZXh0ZXJuIGludCBjcHVmcmVxX21vZGlmeV9wb2xpY3lfbWF4KHVuc2lnbmVkIGludCBjcHUsIHVuc2lnbmVkIGxvbmcgbWF4X2ZyZXEpOworZXh0ZXJuIGludCBjcHVmcmVxX21vZGlmeV9wb2xpY3lfZ292ZXJub3IodW5zaWduZWQgaW50IGNwdSwgY2hhciAqZ292ZXJub3IpOworCisKKy8qIHNldCBhIHNwZWNpZmljIGZyZXF1ZW5jeQorICoKKyAqIERvZXMgb25seSB3b3JrIGlmIHVzZXJzcGFjZSBnb3Zlcm5vciBjYW4gYmUgdXNlZCBhbmQgbm8gZXh0ZXJuYWwKKyAqIGludGVyZmVyZW5jZSAob3RoZXIgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbiBvciB0byBzZXQvbW9kaWZ5X3BvbGljeSkKKyAqIG9jY3Vycy4gQWxzbyBkb2VzIG5vdCB3b3JrIG9uIC0+cmFuZ2UoKSBjcHVmcmVxIGRyaXZlcnMuCisgKi8KKworZXh0ZXJuIGludCBjcHVmcmVxX3NldF9mcmVxdWVuY3kodW5zaWduZWQgaW50IGNwdSwKKwkJCQl1bnNpZ25lZCBsb25nIHRhcmdldF9mcmVxdWVuY3kpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX0NQVUZSRVFfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvbGliL3N5c2ZzLmMgYi90b29scy9wb3dlci9jcHVwb3dlci9saWIvc3lzZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzA3MTNhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvbGliL3N5c2ZzLmMKQEAgLTAsMCArMSw2NzIgQEAKKy8qCisgKiAgKEMpIDIwMDQtMjAwOSAgRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGRvbWluaWticm9kb3dza2kuZGU+CisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMi4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgImNwdWZyZXEuaCIKKworI2RlZmluZSBQQVRIX1RPX0NQVSAiL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvIgorI2RlZmluZSBNQVhfTElORV9MRU4gNDA5NgorI2RlZmluZSBTWVNGU19QQVRIX01BWCAyNTUKKworCitzdGF0aWMgdW5zaWduZWQgaW50IHN5c2ZzX3JlYWRfZmlsZShjb25zdCBjaGFyICpwYXRoLCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pCit7CisJaW50IGZkOworCXNzaXplX3QgbnVtcmVhZDsKKworCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisJaWYgKGZkID09IC0xKQorCQlyZXR1cm4gMDsKKworCW51bXJlYWQgPSByZWFkKGZkLCBidWYsIGJ1ZmxlbiAtIDEpOworCWlmIChudW1yZWFkIDwgMSkgeworCQljbG9zZShmZCk7CisJCXJldHVybiAwOworCX0KKworCWJ1ZltudW1yZWFkXSA9ICdcMCc7CisJY2xvc2UoZmQpOworCisJcmV0dXJuICh1bnNpZ25lZCBpbnQpIG51bXJlYWQ7Cit9CisKKworLyogQ1BVRlJFUSBzeXNmcyBhY2Nlc3MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGhlbHBlciBmdW5jdGlvbiB0byByZWFkIGZpbGUgZnJvbSAvc3lzIGludG8gZ2l2ZW4gYnVmZmVyICovCisvKiBmbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggdW5kZXIgImNwdVgvY3B1ZnJlcSIgZGlyICovCitzdGF0aWMgdW5zaWduZWQgaW50IHN5c2ZzX2NwdWZyZXFfcmVhZF9maWxlKHVuc2lnbmVkIGludCBjcHUsIGNvbnN0IGNoYXIgKmZuYW1lLAorCQkJCQkgICAgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQoreworCWNoYXIgcGF0aFtTWVNGU19QQVRIX01BWF07CisKKwlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFBBVEhfVE9fQ1BVICJjcHUldS9jcHVmcmVxLyVzIiwKKwkJCSBjcHUsIGZuYW1lKTsKKwlyZXR1cm4gc3lzZnNfcmVhZF9maWxlKHBhdGgsIGJ1ZiwgYnVmbGVuKTsKK30KKworLyogaGVscGVyIGZ1bmN0aW9uIHRvIHdyaXRlIGEgbmV3IHZhbHVlIHRvIGEgL3N5cyBmaWxlICovCisvKiBmbmFtZSBpcyBhIHJlbGF0aXZlIHBhdGggdW5kZXIgImNwdVgvY3B1ZnJlcSIgZGlyICovCitzdGF0aWMgdW5zaWduZWQgaW50IHN5c2ZzX2NwdWZyZXFfd3JpdGVfZmlsZSh1bnNpZ25lZCBpbnQgY3B1LAorCQkJCQkgICAgIGNvbnN0IGNoYXIgKmZuYW1lLAorCQkJCQkgICAgIGNvbnN0IGNoYXIgKnZhbHVlLCBzaXplX3QgbGVuKQoreworCWNoYXIgcGF0aFtTWVNGU19QQVRIX01BWF07CisJaW50IGZkOworCXNzaXplX3QgbnVtd3JpdGU7CisKKwlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksIFBBVEhfVE9fQ1BVICJjcHUldS9jcHVmcmVxLyVzIiwKKwkJCSBjcHUsIGZuYW1lKTsKKworCWZkID0gb3BlbihwYXRoLCBPX1dST05MWSk7CisJaWYgKGZkID09IC0xKQorCQlyZXR1cm4gMDsKKworCW51bXdyaXRlID0gd3JpdGUoZmQsIHZhbHVlLCBsZW4pOworCWlmIChudW13cml0ZSA8IDEpIHsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gMDsKKwl9CisKKwljbG9zZShmZCk7CisKKwlyZXR1cm4gKHVuc2lnbmVkIGludCkgbnVtd3JpdGU7Cit9CisKKy8qIHJlYWQgYWNjZXNzIHRvIGZpbGVzIHdoaWNoIGNvbnRhaW4gb25lIG51bWVyaWMgdmFsdWUgKi8KKworZW51bSBjcHVmcmVxX3ZhbHVlIHsKKwlDUFVJTkZPX0NVUl9GUkVRLAorCUNQVUlORk9fTUlOX0ZSRVEsCisJQ1BVSU5GT19NQVhfRlJFUSwKKwlDUFVJTkZPX0xBVEVOQ1ksCisJU0NBTElOR19DVVJfRlJFUSwKKwlTQ0FMSU5HX01JTl9GUkVRLAorCVNDQUxJTkdfTUFYX0ZSRVEsCisJU1RBVFNfTlVNX1RSQU5TSVRJT05TLAorCU1BWF9DUFVGUkVRX1ZBTFVFX1JFQURfRklMRVMKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjcHVmcmVxX3ZhbHVlX2ZpbGVzW01BWF9DUFVGUkVRX1ZBTFVFX1JFQURfRklMRVNdID0geworCVtDUFVJTkZPX0NVUl9GUkVRXSA9ICJjcHVpbmZvX2N1cl9mcmVxIiwKKwlbQ1BVSU5GT19NSU5fRlJFUV0gPSAiY3B1aW5mb19taW5fZnJlcSIsCisJW0NQVUlORk9fTUFYX0ZSRVFdID0gImNwdWluZm9fbWF4X2ZyZXEiLAorCVtDUFVJTkZPX0xBVEVOQ1ldICA9ICJjcHVpbmZvX3RyYW5zaXRpb25fbGF0ZW5jeSIsCisJW1NDQUxJTkdfQ1VSX0ZSRVFdID0gInNjYWxpbmdfY3VyX2ZyZXEiLAorCVtTQ0FMSU5HX01JTl9GUkVRXSA9ICJzY2FsaW5nX21pbl9mcmVxIiwKKwlbU0NBTElOR19NQVhfRlJFUV0gPSAic2NhbGluZ19tYXhfZnJlcSIsCisJW1NUQVRTX05VTV9UUkFOU0lUSU9OU10gPSAic3RhdHMvdG90YWxfdHJhbnMiCit9OworCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHN5c2ZzX2NwdWZyZXFfZ2V0X29uZV92YWx1ZSh1bnNpZ25lZCBpbnQgY3B1LAorCQkJCQkJIGVudW0gY3B1ZnJlcV92YWx1ZSB3aGljaCkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCXVuc2lnbmVkIGludCBsZW47CisJY2hhciBsaW5lYnVmW01BWF9MSU5FX0xFTl07CisJY2hhciAqZW5kcDsKKworCWlmICh3aGljaCA+PSBNQVhfQ1BVRlJFUV9WQUxVRV9SRUFEX0ZJTEVTKQorCQlyZXR1cm4gMDsKKworCWxlbiA9IHN5c2ZzX2NwdWZyZXFfcmVhZF9maWxlKGNwdSwgY3B1ZnJlcV92YWx1ZV9maWxlc1t3aGljaF0sCisJCQkJbGluZWJ1Ziwgc2l6ZW9mKGxpbmVidWYpKTsKKworCWlmIChsZW4gPT0gMCkKKwkJcmV0dXJuIDA7CisKKwl2YWx1ZSA9IHN0cnRvdWwobGluZWJ1ZiwgJmVuZHAsIDApOworCisJaWYgKGVuZHAgPT0gbGluZWJ1ZiB8fCBlcnJubyA9PSBFUkFOR0UpCisJCXJldHVybiAwOworCisJcmV0dXJuIHZhbHVlOworfQorCisvKiByZWFkIGFjY2VzcyB0byBmaWxlcyB3aGljaCBjb250YWluIG9uZSBzdHJpbmcgKi8KKworZW51bSBjcHVmcmVxX3N0cmluZyB7CisJU0NBTElOR19EUklWRVIsCisJU0NBTElOR19HT1ZFUk5PUiwKKwlNQVhfQ1BVRlJFUV9TVFJJTkdfRklMRVMKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjcHVmcmVxX3N0cmluZ19maWxlc1tNQVhfQ1BVRlJFUV9TVFJJTkdfRklMRVNdID0geworCVtTQ0FMSU5HX0RSSVZFUl0gPSAic2NhbGluZ19kcml2ZXIiLAorCVtTQ0FMSU5HX0dPVkVSTk9SXSA9ICJzY2FsaW5nX2dvdmVybm9yIiwKK307CisKKworc3RhdGljIGNoYXIgKnN5c2ZzX2NwdWZyZXFfZ2V0X29uZV9zdHJpbmcodW5zaWduZWQgaW50IGNwdSwKKwkJCQkJICAgZW51bSBjcHVmcmVxX3N0cmluZyB3aGljaCkKK3sKKwljaGFyIGxpbmVidWZbTUFYX0xJTkVfTEVOXTsKKwljaGFyICpyZXN1bHQ7CisJdW5zaWduZWQgaW50IGxlbjsKKworCWlmICh3aGljaCA+PSBNQVhfQ1BVRlJFUV9TVFJJTkdfRklMRVMpCisJCXJldHVybiBOVUxMOworCisJbGVuID0gc3lzZnNfY3B1ZnJlcV9yZWFkX2ZpbGUoY3B1LCBjcHVmcmVxX3N0cmluZ19maWxlc1t3aGljaF0sCisJCQkJbGluZWJ1Ziwgc2l6ZW9mKGxpbmVidWYpKTsKKwlpZiAobGVuID09IDApCisJCXJldHVybiBOVUxMOworCisJcmVzdWx0ID0gc3RyZHVwKGxpbmVidWYpOworCWlmIChyZXN1bHQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAocmVzdWx0W3N0cmxlbihyZXN1bHQpIC0gMV0gPT0gJ1xuJykKKwkJcmVzdWx0W3N0cmxlbihyZXN1bHQpIC0gMV0gPSAnXDAnOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyogd3JpdGUgYWNjZXNzICovCisKK2VudW0gY3B1ZnJlcV93cml0ZSB7CisJV1JJVEVfU0NBTElOR19NSU5fRlJFUSwKKwlXUklURV9TQ0FMSU5HX01BWF9GUkVRLAorCVdSSVRFX1NDQUxJTkdfR09WRVJOT1IsCisJV1JJVEVfU0NBTElOR19TRVRfU1BFRUQsCisJTUFYX0NQVUZSRVFfV1JJVEVfRklMRVMKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjcHVmcmVxX3dyaXRlX2ZpbGVzW01BWF9DUFVGUkVRX1dSSVRFX0ZJTEVTXSA9IHsKKwlbV1JJVEVfU0NBTElOR19NSU5fRlJFUV0gPSAic2NhbGluZ19taW5fZnJlcSIsCisJW1dSSVRFX1NDQUxJTkdfTUFYX0ZSRVFdID0gInNjYWxpbmdfbWF4X2ZyZXEiLAorCVtXUklURV9TQ0FMSU5HX0dPVkVSTk9SXSA9ICJzY2FsaW5nX2dvdmVybm9yIiwKKwlbV1JJVEVfU0NBTElOR19TRVRfU1BFRURdID0gInNjYWxpbmdfc2V0c3BlZWQiLAorfTsKKworc3RhdGljIGludCBzeXNmc19jcHVmcmVxX3dyaXRlX29uZV92YWx1ZSh1bnNpZ25lZCBpbnQgY3B1LAorCQkJCQkgZW51bSBjcHVmcmVxX3dyaXRlIHdoaWNoLAorCQkJCQkgY29uc3QgY2hhciAqbmV3X3ZhbHVlLCBzaXplX3QgbGVuKQoreworCWlmICh3aGljaCA+PSBNQVhfQ1BVRlJFUV9XUklURV9GSUxFUykKKwkJcmV0dXJuIDA7CisKKwlpZiAoc3lzZnNfY3B1ZnJlcV93cml0ZV9maWxlKGNwdSwgY3B1ZnJlcV93cml0ZV9maWxlc1t3aGljaF0sCisJCQkJCW5ld192YWx1ZSwgbGVuKSAhPSBsZW4pCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIDA7Cit9OworCit1bnNpZ25lZCBsb25nIHN5c2ZzX2dldF9mcmVxX2tlcm5lbCh1bnNpZ25lZCBpbnQgY3B1KQoreworCXJldHVybiBzeXNmc19jcHVmcmVxX2dldF9vbmVfdmFsdWUoY3B1LCBTQ0FMSU5HX0NVUl9GUkVRKTsKK30KKwordW5zaWduZWQgbG9uZyBzeXNmc19nZXRfZnJlcV9oYXJkd2FyZSh1bnNpZ25lZCBpbnQgY3B1KQoreworCXJldHVybiBzeXNmc19jcHVmcmVxX2dldF9vbmVfdmFsdWUoY3B1LCBDUFVJTkZPX0NVUl9GUkVRKTsKK30KKwordW5zaWduZWQgbG9uZyBzeXNmc19nZXRfZnJlcV90cmFuc2l0aW9uX2xhdGVuY3kodW5zaWduZWQgaW50IGNwdSkKK3sKKwlyZXR1cm4gc3lzZnNfY3B1ZnJlcV9nZXRfb25lX3ZhbHVlKGNwdSwgQ1BVSU5GT19MQVRFTkNZKTsKK30KKworaW50IHN5c2ZzX2dldF9mcmVxX2hhcmR3YXJlX2xpbWl0cyh1bnNpZ25lZCBpbnQgY3B1LAorCQkJICAgICAgdW5zaWduZWQgbG9uZyAqbWluLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyAqbWF4KQoreworCWlmICgoIW1pbikgfHwgKCFtYXgpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCSptaW4gPSBzeXNmc19jcHVmcmVxX2dldF9vbmVfdmFsdWUoY3B1LCBDUFVJTkZPX01JTl9GUkVRKTsKKwlpZiAoISptaW4pCisJCXJldHVybiAtRU5PREVWOworCisJKm1heCA9IHN5c2ZzX2NwdWZyZXFfZ2V0X29uZV92YWx1ZShjcHUsIENQVUlORk9fTUFYX0ZSRVEpOworCWlmICghKm1heCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gMDsKK30KKworY2hhciAqc3lzZnNfZ2V0X2ZyZXFfZHJpdmVyKHVuc2lnbmVkIGludCBjcHUpCit7CisJcmV0dXJuIHN5c2ZzX2NwdWZyZXFfZ2V0X29uZV9zdHJpbmcoY3B1LCBTQ0FMSU5HX0RSSVZFUik7Cit9CisKK3N0cnVjdCBjcHVmcmVxX3BvbGljeSAqc3lzZnNfZ2V0X2ZyZXFfcG9saWN5KHVuc2lnbmVkIGludCBjcHUpCit7CisJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3k7CisKKwlwb2xpY3kgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBjcHVmcmVxX3BvbGljeSkpOworCWlmICghcG9saWN5KQorCQlyZXR1cm4gTlVMTDsKKworCXBvbGljeS0+Z292ZXJub3IgPSBzeXNmc19jcHVmcmVxX2dldF9vbmVfc3RyaW5nKGNwdSwgU0NBTElOR19HT1ZFUk5PUik7CisJaWYgKCFwb2xpY3ktPmdvdmVybm9yKSB7CisJCWZyZWUocG9saWN5KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCXBvbGljeS0+bWluID0gc3lzZnNfY3B1ZnJlcV9nZXRfb25lX3ZhbHVlKGNwdSwgU0NBTElOR19NSU5fRlJFUSk7CisJcG9saWN5LT5tYXggPSBzeXNmc19jcHVmcmVxX2dldF9vbmVfdmFsdWUoY3B1LCBTQ0FMSU5HX01BWF9GUkVRKTsKKwlpZiAoKCFwb2xpY3ktPm1pbikgfHwgKCFwb2xpY3ktPm1heCkpIHsKKwkJZnJlZShwb2xpY3ktPmdvdmVybm9yKTsKKwkJZnJlZShwb2xpY3kpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlyZXR1cm4gcG9saWN5OworfQorCitzdHJ1Y3QgY3B1ZnJlcV9hdmFpbGFibGVfZ292ZXJub3JzICoKK3N5c2ZzX2dldF9mcmVxX2F2YWlsYWJsZV9nb3Zlcm5vcnModW5zaWduZWQgaW50IGNwdSkgeworCXN0cnVjdCBjcHVmcmVxX2F2YWlsYWJsZV9nb3Zlcm5vcnMgKmZpcnN0ID0gTlVMTDsKKwlzdHJ1Y3QgY3B1ZnJlcV9hdmFpbGFibGVfZ292ZXJub3JzICpjdXJyZW50ID0gTlVMTDsKKwljaGFyIGxpbmVidWZbTUFYX0xJTkVfTEVOXTsKKwl1bnNpZ25lZCBpbnQgcG9zLCBpOworCXVuc2lnbmVkIGludCBsZW47CisKKwlsZW4gPSBzeXNmc19jcHVmcmVxX3JlYWRfZmlsZShjcHUsICJzY2FsaW5nX2F2YWlsYWJsZV9nb3Zlcm5vcnMiLAorCQkJCWxpbmVidWYsIHNpemVvZihsaW5lYnVmKSk7CisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCXBvcyA9IDA7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmIChsaW5lYnVmW2ldID09ICcgJyB8fCBsaW5lYnVmW2ldID09ICdcbicpIHsKKwkJCWlmIChpIC0gcG9zIDwgMikKKwkJCQljb250aW51ZTsKKwkJCWlmIChjdXJyZW50KSB7CisJCQkJY3VycmVudC0+bmV4dCA9IG1hbGxvYyhzaXplb2YoKmN1cnJlbnQpKTsKKwkJCQlpZiAoIWN1cnJlbnQtPm5leHQpCisJCQkJCWdvdG8gZXJyb3Jfb3V0OworCQkJCWN1cnJlbnQgPSBjdXJyZW50LT5uZXh0OworCQkJfSBlbHNlIHsKKwkJCQlmaXJzdCA9IG1hbGxvYyhzaXplb2YoKmZpcnN0KSk7CisJCQkJaWYgKCFmaXJzdCkKKwkJCQkJZ290byBlcnJvcl9vdXQ7CisJCQkJY3VycmVudCA9IGZpcnN0OworCQkJfQorCQkJY3VycmVudC0+Zmlyc3QgPSBmaXJzdDsKKwkJCWN1cnJlbnQtPm5leHQgPSBOVUxMOworCisJCQljdXJyZW50LT5nb3Zlcm5vciA9IG1hbGxvYyhpIC0gcG9zICsgMSk7CisJCQlpZiAoIWN1cnJlbnQtPmdvdmVybm9yKQorCQkJCWdvdG8gZXJyb3Jfb3V0OworCisJCQltZW1jcHkoY3VycmVudC0+Z292ZXJub3IsIGxpbmVidWYgKyBwb3MsIGkgLSBwb3MpOworCQkJY3VycmVudC0+Z292ZXJub3JbaSAtIHBvc10gPSAnXDAnOworCQkJcG9zID0gaSArIDE7CisJCX0KKwl9CisKKwlyZXR1cm4gZmlyc3Q7CisKKyBlcnJvcl9vdXQ6CisJd2hpbGUgKGZpcnN0KSB7CisJCWN1cnJlbnQgPSBmaXJzdC0+bmV4dDsKKwkJaWYgKGZpcnN0LT5nb3Zlcm5vcikKKwkJCWZyZWUoZmlyc3QtPmdvdmVybm9yKTsKKwkJZnJlZShmaXJzdCk7CisJCWZpcnN0ID0gY3VycmVudDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKworc3RydWN0IGNwdWZyZXFfYXZhaWxhYmxlX2ZyZXF1ZW5jaWVzICoKK3N5c2ZzX2dldF9hdmFpbGFibGVfZnJlcXVlbmNpZXModW5zaWduZWQgaW50IGNwdSkgeworCXN0cnVjdCBjcHVmcmVxX2F2YWlsYWJsZV9mcmVxdWVuY2llcyAqZmlyc3QgPSBOVUxMOworCXN0cnVjdCBjcHVmcmVxX2F2YWlsYWJsZV9mcmVxdWVuY2llcyAqY3VycmVudCA9IE5VTEw7CisJY2hhciBvbmVfdmFsdWVbU1lTRlNfUEFUSF9NQVhdOworCWNoYXIgbGluZWJ1ZltNQVhfTElORV9MRU5dOworCXVuc2lnbmVkIGludCBwb3MsIGk7CisJdW5zaWduZWQgaW50IGxlbjsKKworCWxlbiA9IHN5c2ZzX2NwdWZyZXFfcmVhZF9maWxlKGNwdSwgInNjYWxpbmdfYXZhaWxhYmxlX2ZyZXF1ZW5jaWVzIiwKKwkJCQlsaW5lYnVmLCBzaXplb2YobGluZWJ1ZikpOworCWlmIChsZW4gPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlwb3MgPSAwOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpZiAobGluZWJ1ZltpXSA9PSAnICcgfHwgbGluZWJ1ZltpXSA9PSAnXG4nKSB7CisJCQlpZiAoaSAtIHBvcyA8IDIpCisJCQkJY29udGludWU7CisJCQlpZiAoaSAtIHBvcyA+PSBTWVNGU19QQVRIX01BWCkKKwkJCQlnb3RvIGVycm9yX291dDsKKwkJCWlmIChjdXJyZW50KSB7CisJCQkJY3VycmVudC0+bmV4dCA9IG1hbGxvYyhzaXplb2YoKmN1cnJlbnQpKTsKKwkJCQlpZiAoIWN1cnJlbnQtPm5leHQpCisJCQkJCWdvdG8gZXJyb3Jfb3V0OworCQkJCWN1cnJlbnQgPSBjdXJyZW50LT5uZXh0OworCQkJfSBlbHNlIHsKKwkJCQlmaXJzdCA9IG1hbGxvYyhzaXplb2YoKmZpcnN0KSk7CisJCQkJaWYgKCFmaXJzdCkKKwkJCQkJZ290byBlcnJvcl9vdXQ7CisJCQkJY3VycmVudCA9IGZpcnN0OworCQkJfQorCQkJY3VycmVudC0+Zmlyc3QgPSBmaXJzdDsKKwkJCWN1cnJlbnQtPm5leHQgPSBOVUxMOworCisJCQltZW1jcHkob25lX3ZhbHVlLCBsaW5lYnVmICsgcG9zLCBpIC0gcG9zKTsKKwkJCW9uZV92YWx1ZVtpIC0gcG9zXSA9ICdcMCc7CisJCQlpZiAoc3NjYW5mKG9uZV92YWx1ZSwgIiVsdSIsICZjdXJyZW50LT5mcmVxdWVuY3kpICE9IDEpCisJCQkJZ290byBlcnJvcl9vdXQ7CisKKwkJCXBvcyA9IGkgKyAxOworCQl9CisJfQorCisJcmV0dXJuIGZpcnN0OworCisgZXJyb3Jfb3V0OgorCXdoaWxlIChmaXJzdCkgeworCQljdXJyZW50ID0gZmlyc3QtPm5leHQ7CisJCWZyZWUoZmlyc3QpOworCQlmaXJzdCA9IGN1cnJlbnQ7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfYWZmZWN0ZWRfY3B1cyAqc3lzZnNfZ2V0X2NwdV9saXN0KHVuc2lnbmVkIGludCBjcHUsCisJCQkJCQkJY29uc3QgY2hhciAqZmlsZSkKK3sKKwlzdHJ1Y3QgY3B1ZnJlcV9hZmZlY3RlZF9jcHVzICpmaXJzdCA9IE5VTEw7CisJc3RydWN0IGNwdWZyZXFfYWZmZWN0ZWRfY3B1cyAqY3VycmVudCA9IE5VTEw7CisJY2hhciBvbmVfdmFsdWVbU1lTRlNfUEFUSF9NQVhdOworCWNoYXIgbGluZWJ1ZltNQVhfTElORV9MRU5dOworCXVuc2lnbmVkIGludCBwb3MsIGk7CisJdW5zaWduZWQgaW50IGxlbjsKKworCWxlbiA9IHN5c2ZzX2NwdWZyZXFfcmVhZF9maWxlKGNwdSwgZmlsZSwgbGluZWJ1Ziwgc2l6ZW9mKGxpbmVidWYpKTsKKwlpZiAobGVuID09IDApCisJCXJldHVybiBOVUxMOworCisJcG9zID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJaWYgKGkgPT0gbGVuIHx8IGxpbmVidWZbaV0gPT0gJyAnIHx8IGxpbmVidWZbaV0gPT0gJ1xuJykgeworCQkJaWYgKGkgLSBwb3MgIDwgMSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChpIC0gcG9zID49IFNZU0ZTX1BBVEhfTUFYKQorCQkJCWdvdG8gZXJyb3Jfb3V0OworCQkJaWYgKGN1cnJlbnQpIHsKKwkJCQljdXJyZW50LT5uZXh0ID0gbWFsbG9jKHNpemVvZigqY3VycmVudCkpOworCQkJCWlmICghY3VycmVudC0+bmV4dCkKKwkJCQkJZ290byBlcnJvcl9vdXQ7CisJCQkJY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7CisJCQl9IGVsc2UgeworCQkJCWZpcnN0ID0gbWFsbG9jKHNpemVvZigqZmlyc3QpKTsKKwkJCQlpZiAoIWZpcnN0KQorCQkJCQlnb3RvIGVycm9yX291dDsKKwkJCQljdXJyZW50ID0gZmlyc3Q7CisJCQl9CisJCQljdXJyZW50LT5maXJzdCA9IGZpcnN0OworCQkJY3VycmVudC0+bmV4dCA9IE5VTEw7CisKKwkJCW1lbWNweShvbmVfdmFsdWUsIGxpbmVidWYgKyBwb3MsIGkgLSBwb3MpOworCQkJb25lX3ZhbHVlW2kgLSBwb3NdID0gJ1wwJzsKKworCQkJaWYgKHNzY2FuZihvbmVfdmFsdWUsICIldSIsICZjdXJyZW50LT5jcHUpICE9IDEpCisJCQkJZ290byBlcnJvcl9vdXQ7CisKKwkJCXBvcyA9IGkgKyAxOworCQl9CisJfQorCisJcmV0dXJuIGZpcnN0OworCisgZXJyb3Jfb3V0OgorCXdoaWxlIChmaXJzdCkgeworCQljdXJyZW50ID0gZmlyc3QtPm5leHQ7CisJCWZyZWUoZmlyc3QpOworCQlmaXJzdCA9IGN1cnJlbnQ7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgY3B1ZnJlcV9hZmZlY3RlZF9jcHVzICpzeXNmc19nZXRfZnJlcV9hZmZlY3RlZF9jcHVzKHVuc2lnbmVkIGludCBjcHUpCit7CisJcmV0dXJuIHN5c2ZzX2dldF9jcHVfbGlzdChjcHUsICJhZmZlY3RlZF9jcHVzIik7Cit9CisKK3N0cnVjdCBjcHVmcmVxX2FmZmVjdGVkX2NwdXMgKnN5c2ZzX2dldF9mcmVxX3JlbGF0ZWRfY3B1cyh1bnNpZ25lZCBpbnQgY3B1KQoreworCXJldHVybiBzeXNmc19nZXRfY3B1X2xpc3QoY3B1LCAicmVsYXRlZF9jcHVzIik7Cit9CisKK3N0cnVjdCBjcHVmcmVxX3N0YXRzICpzeXNmc19nZXRfZnJlcV9zdGF0cyh1bnNpZ25lZCBpbnQgY3B1LAorCQkJCQl1bnNpZ25lZCBsb25nIGxvbmcgKnRvdGFsX3RpbWUpIHsKKwlzdHJ1Y3QgY3B1ZnJlcV9zdGF0cyAqZmlyc3QgPSBOVUxMOworCXN0cnVjdCBjcHVmcmVxX3N0YXRzICpjdXJyZW50ID0gTlVMTDsKKwljaGFyIG9uZV92YWx1ZVtTWVNGU19QQVRIX01BWF07CisJY2hhciBsaW5lYnVmW01BWF9MSU5FX0xFTl07CisJdW5zaWduZWQgaW50IHBvcywgaTsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJbGVuID0gc3lzZnNfY3B1ZnJlcV9yZWFkX2ZpbGUoY3B1LCAic3RhdHMvdGltZV9pbl9zdGF0ZSIsCisJCQkJbGluZWJ1Ziwgc2l6ZW9mKGxpbmVidWYpKTsKKwlpZiAobGVuID09IDApCisJCXJldHVybiBOVUxMOworCisJKnRvdGFsX3RpbWUgPSAwOworCXBvcyA9IDA7CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmIChpID09IHN0cmxlbihsaW5lYnVmKSB8fCBsaW5lYnVmW2ldID09ICdcbicpCXsKKwkJCWlmIChpIC0gcG9zIDwgMikKKwkJCQljb250aW51ZTsKKwkJCWlmICgoaSAtIHBvcykgPj0gU1lTRlNfUEFUSF9NQVgpCisJCQkJZ290byBlcnJvcl9vdXQ7CisJCQlpZiAoY3VycmVudCkgeworCQkJCWN1cnJlbnQtPm5leHQgPSBtYWxsb2Moc2l6ZW9mKCpjdXJyZW50KSk7CisJCQkJaWYgKCFjdXJyZW50LT5uZXh0KQorCQkJCQlnb3RvIGVycm9yX291dDsKKwkJCQljdXJyZW50ID0gY3VycmVudC0+bmV4dDsKKwkJCX0gZWxzZSB7CisJCQkJZmlyc3QgPSBtYWxsb2Moc2l6ZW9mKCpmaXJzdCkpOworCQkJCWlmICghZmlyc3QpCisJCQkJCWdvdG8gZXJyb3Jfb3V0OworCQkJCWN1cnJlbnQgPSBmaXJzdDsKKwkJCX0KKwkJCWN1cnJlbnQtPmZpcnN0ID0gZmlyc3Q7CisJCQljdXJyZW50LT5uZXh0ID0gTlVMTDsKKworCQkJbWVtY3B5KG9uZV92YWx1ZSwgbGluZWJ1ZiArIHBvcywgaSAtIHBvcyk7CisJCQlvbmVfdmFsdWVbaSAtIHBvc10gPSAnXDAnOworCQkJaWYgKHNzY2FuZihvbmVfdmFsdWUsICIlbHUgJWxsdSIsCisJCQkJCSZjdXJyZW50LT5mcmVxdWVuY3ksCisJCQkJCSZjdXJyZW50LT50aW1lX2luX3N0YXRlKSAhPSAyKQorCQkJCWdvdG8gZXJyb3Jfb3V0OworCisJCQkqdG90YWxfdGltZSA9ICp0b3RhbF90aW1lICsgY3VycmVudC0+dGltZV9pbl9zdGF0ZTsKKwkJCXBvcyA9IGkgKyAxOworCQl9CisJfQorCisJcmV0dXJuIGZpcnN0OworCisgZXJyb3Jfb3V0OgorCXdoaWxlIChmaXJzdCkgeworCQljdXJyZW50ID0gZmlyc3QtPm5leHQ7CisJCWZyZWUoZmlyc3QpOworCQlmaXJzdCA9IGN1cnJlbnQ7CisJfQorCXJldHVybiBOVUxMOworfQorCit1bnNpZ25lZCBsb25nIHN5c2ZzX2dldF9mcmVxX3RyYW5zaXRpb25zKHVuc2lnbmVkIGludCBjcHUpCit7CisJcmV0dXJuIHN5c2ZzX2NwdWZyZXFfZ2V0X29uZV92YWx1ZShjcHUsIFNUQVRTX05VTV9UUkFOU0lUSU9OUyk7Cit9CisKK3N0YXRpYyBpbnQgdmVyaWZ5X2dvdihjaGFyICpuZXdfZ292LCBjaGFyICpwYXNzZWRfZ292KQoreworCXVuc2lnbmVkIGludCBpLCBqID0gMDsKKworCWlmICghcGFzc2VkX2dvdiB8fCAoc3RybGVuKHBhc3NlZF9nb3YpID4gMTkpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN0cm5jcHkobmV3X2dvdiwgcGFzc2VkX2dvdiwgMjApOworCWZvciAoaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisJCWlmIChqKSB7CisJCQluZXdfZ292W2ldID0gJ1wwJzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgobmV3X2dvdltpXSA+PSAnYScpICYmIChuZXdfZ292W2ldIDw9ICd6JykpCisJCQljb250aW51ZTsKKworCQlpZiAoKG5ld19nb3ZbaV0gPj0gJ0EnKSAmJiAobmV3X2dvdltpXSA8PSAnWicpKQorCQkJY29udGludWU7CisKKwkJaWYgKG5ld19nb3ZbaV0gPT0gJy0nKQorCQkJY29udGludWU7CisKKwkJaWYgKG5ld19nb3ZbaV0gPT0gJ18nKQorCQkJY29udGludWU7CisKKwkJaWYgKG5ld19nb3ZbaV0gPT0gJ1wwJykgeworCQkJaiA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbmV3X2dvdlsxOV0gPSAnXDAnOworCXJldHVybiAwOworfQorCitpbnQgc3lzZnNfbW9kaWZ5X2ZyZXFfcG9saWN5X2dvdmVybm9yKHVuc2lnbmVkIGludCBjcHUsIGNoYXIgKmdvdmVybm9yKQoreworCWNoYXIgbmV3X2dvdltTWVNGU19QQVRIX01BWF07CisKKwlpZiAoIWdvdmVybm9yKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh2ZXJpZnlfZ292KG5ld19nb3YsIGdvdmVybm9yKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gc3lzZnNfY3B1ZnJlcV93cml0ZV9vbmVfdmFsdWUoY3B1LCBXUklURV9TQ0FMSU5HX0dPVkVSTk9SLAorCQkJCQkgICAgIG5ld19nb3YsIHN0cmxlbihuZXdfZ292KSk7Cit9OworCitpbnQgc3lzZnNfbW9kaWZ5X2ZyZXFfcG9saWN5X21heCh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBsb25nIG1heF9mcmVxKQoreworCWNoYXIgdmFsdWVbU1lTRlNfUEFUSF9NQVhdOworCisJc25wcmludGYodmFsdWUsIFNZU0ZTX1BBVEhfTUFYLCAiJWx1IiwgbWF4X2ZyZXEpOworCisJcmV0dXJuIHN5c2ZzX2NwdWZyZXFfd3JpdGVfb25lX3ZhbHVlKGNwdSwgV1JJVEVfU0NBTElOR19NQVhfRlJFUSwKKwkJCQkJICAgICB2YWx1ZSwgc3RybGVuKHZhbHVlKSk7Cit9OworCisKK2ludCBzeXNmc19tb2RpZnlfZnJlcV9wb2xpY3lfbWluKHVuc2lnbmVkIGludCBjcHUsIHVuc2lnbmVkIGxvbmcgbWluX2ZyZXEpCit7CisJY2hhciB2YWx1ZVtTWVNGU19QQVRIX01BWF07CisKKwlzbnByaW50Zih2YWx1ZSwgU1lTRlNfUEFUSF9NQVgsICIlbHUiLCBtaW5fZnJlcSk7CisKKwlyZXR1cm4gc3lzZnNfY3B1ZnJlcV93cml0ZV9vbmVfdmFsdWUoY3B1LCBXUklURV9TQ0FMSU5HX01JTl9GUkVRLAorCQkJCQkgICAgIHZhbHVlLCBzdHJsZW4odmFsdWUpKTsKK307CisKKworaW50IHN5c2ZzX3NldF9mcmVxX3BvbGljeSh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwljaGFyIG1pbltTWVNGU19QQVRIX01BWF07CisJY2hhciBtYXhbU1lTRlNfUEFUSF9NQVhdOworCWNoYXIgZ292W1NZU0ZTX1BBVEhfTUFYXTsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgb2xkX21pbjsKKwlpbnQgd3JpdGVfbWF4X2ZpcnN0OworCisJaWYgKCFwb2xpY3kgfHwgIShwb2xpY3ktPmdvdmVybm9yKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAocG9saWN5LT5tYXggPCBwb2xpY3ktPm1pbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodmVyaWZ5X2dvdihnb3YsIHBvbGljeS0+Z292ZXJub3IpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNucHJpbnRmKG1pbiwgU1lTRlNfUEFUSF9NQVgsICIlbHUiLCBwb2xpY3ktPm1pbik7CisJc25wcmludGYobWF4LCBTWVNGU19QQVRIX01BWCwgIiVsdSIsIHBvbGljeS0+bWF4KTsKKworCW9sZF9taW4gPSBzeXNmc19jcHVmcmVxX2dldF9vbmVfdmFsdWUoY3B1LCBTQ0FMSU5HX01JTl9GUkVRKTsKKwl3cml0ZV9tYXhfZmlyc3QgPSAob2xkX21pbiAmJiAocG9saWN5LT5tYXggPCBvbGRfbWluKSA/IDAgOiAxKTsKKworCWlmICh3cml0ZV9tYXhfZmlyc3QpIHsKKwkJcmV0ID0gc3lzZnNfY3B1ZnJlcV93cml0ZV9vbmVfdmFsdWUoY3B1LCBXUklURV9TQ0FMSU5HX01BWF9GUkVRLAorCQkJCQkJICAgIG1heCwgc3RybGVuKG1heCkpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBzeXNmc19jcHVmcmVxX3dyaXRlX29uZV92YWx1ZShjcHUsIFdSSVRFX1NDQUxJTkdfTUlOX0ZSRVEsIG1pbiwKKwkJCQkJICAgIHN0cmxlbihtaW4pKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKCF3cml0ZV9tYXhfZmlyc3QpIHsKKwkJcmV0ID0gc3lzZnNfY3B1ZnJlcV93cml0ZV9vbmVfdmFsdWUoY3B1LCBXUklURV9TQ0FMSU5HX01BWF9GUkVRLAorCQkJCQkJICAgIG1heCwgc3RybGVuKG1heCkpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gc3lzZnNfY3B1ZnJlcV93cml0ZV9vbmVfdmFsdWUoY3B1LCBXUklURV9TQ0FMSU5HX0dPVkVSTk9SLAorCQkJCQkgICAgIGdvdiwgc3RybGVuKGdvdikpOworfQorCitpbnQgc3lzZnNfc2V0X2ZyZXF1ZW5jeSh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBsb25nIHRhcmdldF9mcmVxdWVuY3kpCit7CisJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2wgPSBzeXNmc19nZXRfZnJlcV9wb2xpY3koY3B1KTsKKwljaGFyIHVzZXJzcGFjZV9nb3ZbXSA9ICJ1c2Vyc3BhY2UiOworCWNoYXIgZnJlcVtTWVNGU19QQVRIX01BWF07CisJaW50IHJldDsKKworCWlmICghcG9sKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChzdHJuY21wKHBvbC0+Z292ZXJub3IsIHVzZXJzcGFjZV9nb3YsIDkpICE9IDApIHsKKwkJcmV0ID0gc3lzZnNfbW9kaWZ5X2ZyZXFfcG9saWN5X2dvdmVybm9yKGNwdSwgdXNlcnNwYWNlX2dvdik7CisJCWlmIChyZXQpIHsKKwkJCWNwdWZyZXFfcHV0X3BvbGljeShwb2wpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCWNwdWZyZXFfcHV0X3BvbGljeShwb2wpOworCisJc25wcmludGYoZnJlcSwgU1lTRlNfUEFUSF9NQVgsICIlbHUiLCB0YXJnZXRfZnJlcXVlbmN5KTsKKworCXJldHVybiBzeXNmc19jcHVmcmVxX3dyaXRlX29uZV92YWx1ZShjcHUsIFdSSVRFX1NDQUxJTkdfU0VUX1NQRUVELAorCQkJCQkgICAgIGZyZXEsIHN0cmxlbihmcmVxKSk7Cit9CisKKy8qIENQVUZSRVEgc3lzZnMgYWNjZXNzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBHZW5lcmFsIHN5c2ZzIGFjY2VzcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBzeXNmc19jcHVfZXhpc3RzKHVuc2lnbmVkIGludCBjcHUpCit7CisJY2hhciBmaWxlW1NZU0ZTX1BBVEhfTUFYXTsKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCisJc25wcmludGYoZmlsZSwgU1lTRlNfUEFUSF9NQVgsIFBBVEhfVE9fQ1BVICJjcHUldS8iLCBjcHUpOworCisJaWYgKHN0YXQoZmlsZSwgJnN0YXRidWYpICE9IDApCisJCXJldHVybiAtRU5PU1lTOworCisJcmV0dXJuIFNfSVNESVIoc3RhdGJ1Zi5zdF9tb2RlKSA/IDAgOiAtRU5PU1lTOworfQorCisvKiBHZW5lcmFsIHN5c2ZzIGFjY2VzcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2xpYi9zeXNmcy5oIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvbGliL3N5c2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc2YTVlMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL2xpYi9zeXNmcy5oCkBAIC0wLDAgKzEsMzEgQEAKKy8qIEdlbmVyYWwgKi8KK2V4dGVybiB1bnNpZ25lZCBpbnQgc3lzZnNfY3B1X2V4aXN0cyh1bnNpZ25lZCBpbnQgY3B1KTsKKworLyogQ1BVZnJlcSAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc3lzZnNfZ2V0X2ZyZXFfa2VybmVsKHVuc2lnbmVkIGludCBjcHUpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc3lzZnNfZ2V0X2ZyZXFfaGFyZHdhcmUodW5zaWduZWQgaW50IGNwdSk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBzeXNmc19nZXRfZnJlcV90cmFuc2l0aW9uX2xhdGVuY3kodW5zaWduZWQgaW50IGNwdSk7CitleHRlcm4gaW50IHN5c2ZzX2dldF9mcmVxX2hhcmR3YXJlX2xpbWl0cyh1bnNpZ25lZCBpbnQgY3B1LAorCQkJCQl1bnNpZ25lZCBsb25nICptaW4sIHVuc2lnbmVkIGxvbmcgKm1heCk7CitleHRlcm4gY2hhciAqc3lzZnNfZ2V0X2ZyZXFfZHJpdmVyKHVuc2lnbmVkIGludCBjcHUpOworZXh0ZXJuIHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqc3lzZnNfZ2V0X2ZyZXFfcG9saWN5KHVuc2lnbmVkIGludCBjcHUpOworZXh0ZXJuIHN0cnVjdCBjcHVmcmVxX2F2YWlsYWJsZV9nb3Zlcm5vcnMgKnN5c2ZzX2dldF9mcmVxX2F2YWlsYWJsZV9nb3Zlcm5vcnMoCisJdW5zaWduZWQgaW50IGNwdSk7CitleHRlcm4gc3RydWN0IGNwdWZyZXFfYXZhaWxhYmxlX2ZyZXF1ZW5jaWVzICpzeXNmc19nZXRfYXZhaWxhYmxlX2ZyZXF1ZW5jaWVzKAorCXVuc2lnbmVkIGludCBjcHUpOworZXh0ZXJuIHN0cnVjdCBjcHVmcmVxX2FmZmVjdGVkX2NwdXMgKnN5c2ZzX2dldF9mcmVxX2FmZmVjdGVkX2NwdXMoCisJdW5zaWduZWQgaW50IGNwdSk7CitleHRlcm4gc3RydWN0IGNwdWZyZXFfYWZmZWN0ZWRfY3B1cyAqc3lzZnNfZ2V0X2ZyZXFfcmVsYXRlZF9jcHVzKAorCXVuc2lnbmVkIGludCBjcHUpOworZXh0ZXJuIHN0cnVjdCBjcHVmcmVxX3N0YXRzICpzeXNmc19nZXRfZnJlcV9zdGF0cyh1bnNpZ25lZCBpbnQgY3B1LAorCQkJCQkJdW5zaWduZWQgbG9uZyBsb25nICp0b3RhbF90aW1lKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHN5c2ZzX2dldF9mcmVxX3RyYW5zaXRpb25zKHVuc2lnbmVkIGludCBjcHUpOworZXh0ZXJuIGludCBzeXNmc19zZXRfZnJlcV9wb2xpY3kodW5zaWduZWQgaW50IGNwdSwKKwkJCQlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSk7CitleHRlcm4gaW50IHN5c2ZzX21vZGlmeV9mcmVxX3BvbGljeV9taW4odW5zaWduZWQgaW50IGNwdSwKKwkJCQkJdW5zaWduZWQgbG9uZyBtaW5fZnJlcSk7CitleHRlcm4gaW50IHN5c2ZzX21vZGlmeV9mcmVxX3BvbGljeV9tYXgodW5zaWduZWQgaW50IGNwdSwKKwkJCQkJdW5zaWduZWQgbG9uZyBtYXhfZnJlcSk7CitleHRlcm4gaW50IHN5c2ZzX21vZGlmeV9mcmVxX3BvbGljeV9nb3Zlcm5vcih1bnNpZ25lZCBpbnQgY3B1LCBjaGFyICpnb3Zlcm5vcik7CitleHRlcm4gaW50IHN5c2ZzX3NldF9mcmVxdWVuY3kodW5zaWduZWQgaW50IGNwdSwKKwkJCXVuc2lnbmVkIGxvbmcgdGFyZ2V0X2ZyZXF1ZW5jeSk7CmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci9tYW4vY3B1cG93ZXItZnJlcXVlbmN5LWluZm8uMSBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL21hbi9jcHVwb3dlci1mcmVxdWVuY3ktaW5mby4xCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxOTQ4MTEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci9tYW4vY3B1cG93ZXItZnJlcXVlbmN5LWluZm8uMQpAQCAtMCwwICsxLDc2IEBACisuVEggImNwdWZyZXEtaW5mbyIgIjEiICIwLjEiICJNYXR0aWEgRG9uZ2lsaSIgIiIKKy5TSCAiTkFNRSIKKy5MUCAKK2NwdWZyZXFcLWluZm8gXC0gVXRpbGl0eSB0byByZXRyaWV2ZSBjcHVmcmVxIGtlcm5lbCBpbmZvcm1hdGlvbgorLlNIICJTWU5UQVgiCisuTFAgCitjcHVmcmVxXC1pbmZvIFtcZklvcHRpb25zXGZQXQorLlNIICJERVNDUklQVElPTiIKKy5MUCAKK0Egc21hbGwgdG9vbCB3aGljaCBwcmludHMgb3V0IGNwdWZyZXEgaW5mb3JtYXRpb24gaGVscGZ1bCB0byBkZXZlbG9wZXJzIGFuZCBpbnRlcmVzdGVkIHVzZXJzLgorLlNIICJPUFRJT05TIgorLkxQIAorLlRQICAKK1xmQlwtZVxmUiBcZkJcLVwtZGVidWdcZlIKK1ByaW50cyBvdXQgZGVidWcgaW5mb3JtYXRpb24uCisuVFAgIAorXGZCXC1mXGZSIFxmQlwtXC1mcmVxXGZSCitHZXQgZnJlcXVlbmN5IHRoZSBDUFUgY3VycmVudGx5IHJ1bnMgYXQsIGFjY29yZGluZyB0byB0aGUgY3B1ZnJlcSBjb3JlLgorLlRQICAKK1xmQlwtd1xmUiBcZkJcLVwtaHdmcmVxXGZSCitHZXQgZnJlcXVlbmN5IHRoZSBDUFUgY3VycmVudGx5IHJ1bnMgYXQsIGJ5IHJlYWRpbmcgaXQgZnJvbSBoYXJkd2FyZSAob25seSBhdmFpbGFibGUgdG8gcm9vdCkuCisuVFAgIAorXGZCXC1sXGZSIFxmQlwtXC1od2xpbWl0c1xmUgorRGV0ZXJtaW5lIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIENQVSBmcmVxdWVuY3kgYWxsb3dlZC4KKy5UUCAgCitcZkJcLWRcZlIgXGZCXC1cLWRyaXZlclxmUgorRGV0ZXJtaW5lcyB0aGUgdXNlZCBjcHVmcmVxIGtlcm5lbCBkcml2ZXIuCisuVFAgIAorXGZCXC1wXGZSIFxmQlwtXC1wb2xpY3lcZlIKK0dldHMgdGhlIGN1cnJlbnRseSB1c2VkIGNwdWZyZXEgcG9saWN5LgorLlRQICAKK1xmQlwtZ1xmUiBcZkJcLVwtZ292ZXJub3JzXGZSCitEZXRlcm1pbmVzIGF2YWlsYWJsZSBjcHVmcmVxIGdvdmVybm9ycy4KKy5UUCAgCitcZkJcLWFcZlIgXGZCXC1cLXJlbGF0ZWRcLWNwdXNcZlIKK0RldGVybWluZXMgd2hpY2ggQ1BVcyBydW4gYXQgdGhlIHNhbWUgaGFyZHdhcmUgZnJlcXVlbmN5LgorLlRQICAKK1xmQlwtYVxmUiBcZkJcLVwtYWZmZWN0ZWRcLWNwdXNcZlIKK0RldGVybWluZXMgd2hpY2ggQ1BVcyBuZWVkIHRvIGhhdmUgdGhlaXIgZnJlcXVlbmN5IGNvb3JkaW5hdGVkIGJ5IHNvZnR3YXJlLgorLlRQICAKK1xmQlwtc1xmUiBcZkJcLVwtc3RhdHNcZlIKK1Nob3dzIGNwdWZyZXEgc3RhdGlzdGljcyBpZiBhdmFpbGFibGUuCisuVFAgIAorXGZCXC15XGZSIFxmQlwtXC1sYXRlbmN5XGZSCitEZXRlcm1pbmVzIHRoZSBtYXhpbXVtIGxhdGVuY3kgb24gQ1BVIGZyZXF1ZW5jeSBjaGFuZ2VzLgorLlRQICAKK1xmQlwtb1xmUiBcZkJcLVwtcHJvY1xmUgorUHJpbnRzIG91dCBpbmZvcm1hdGlvbiBsaWtlIHByb3ZpZGVkIGJ5IHRoZSAvcHJvYy9jcHVmcmVxIGludGVyZmFjZSBpbiAyLjQuIGFuZCBlYXJseSAyLjYuIGtlcm5lbHMuCisuVFAgIAorXGZCXC1tXGZSIFxmQlwtXC1odW1hblxmUgoraHVtYW5cLXJlYWRhYmxlIG91dHB1dCBmb3IgdGhlIFwtZiwgXC13LCBcLXMgYW5kIFwteSBwYXJhbWV0ZXJzLgorLlRQICAKK1xmQlwtaFxmUiBcZkJcLVwtaGVscFxmUgorUHJpbnRzIG91dCB0aGUgaGVscCBzY3JlZW4uCisuU0ggIlJFTUFSS1MiCisuTFAgCitCeSBkZWZhdWx0IG9ubHkgdmFsdWVzIG9mIGNvcmUgemVybyBhcmUgZGlzcGxheWVkLiBIb3cgdG8gZGlzcGxheSBzZXR0aW5ncyBvZgorb3RoZXIgY29yZXMgaXMgZGVzY3JpYmVkIGluIHRoZSBjcHVwb3dlcigxKSBtYW5wYWdlIGluIHRoZSBcLVwtY3B1IG9wdGlvbiBzZWN0aW9uLgorLkxQIAorWW91IGNhbid0IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBvZiB0aGUgb3V0cHV0IHNwZWNpZmljIG9wdGlvbnMgXC1vIFwtZSBcLWEgXC1nIFwtcCBcLWQgXC1sIFwtdyBcLWYgXC15LgorLkxQIAorWW91IGFsc28gY2FuJ3Qgc3BlY2lmeSB0aGUgXC1vIG9wdGlvbiBjb21iaW5lZCB3aXRoIHRoZSBcLWMgb3B0aW9uLgorLlNIICJGSUxFUyIKKy5uZiAKK1xmSS9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdSovY3B1ZnJlcS9cZlAgIAorXGZJL3Byb2MvY3B1ZnJlcVxmUCAoZGVwcmVjYXRlZCkgCitcZkkvcHJvYy9zeXMvY3B1L1xmUCAoZGVwcmVjYXRlZCkKKy5maSAKKy5TSCAiQVVUSE9SUyIKKy5uZgorRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGJyb2RvLmRlPiBcLSBhdXRob3IgCitNYXR0aWEgRG9uZ2lsaTxtYWxhdHRpYUBnbWFpbC5jb20+IFwtIGZpcnN0IGF1dG9saWJ0b29saXphdGlvbgorLmZpCisuU0ggIlNFRSBBTFNPIgorLkxQIAorY3B1cG93ZXJcLWZyZXF1ZW5jeVwtc2V0KDEpLCBjcHVwb3dlcigxKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvbWFuL2NwdXBvd2VyLWZyZXF1ZW5jeS1zZXQuMSBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL21hbi9jcHVwb3dlci1mcmVxdWVuY3ktc2V0LjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZlM2UxMwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL21hbi9jcHVwb3dlci1mcmVxdWVuY3ktc2V0LjEKQEAgLTAsMCArMSw1NCBAQAorLlRIICJjcHVmcmVxLXNldCIgIjEiICIwLjEiICJNYXR0aWEgRG9uZ2lsaSIgIiIKKy5TSCAiTkFNRSIKKy5MUCAKK2NwdWZyZXFcLXNldCBcLSBBIHNtYWxsIHRvb2wgd2hpY2ggYWxsb3dzIHRvIG1vZGlmeSBjcHVmcmVxIHNldHRpbmdzLgorLlNIICJTWU5UQVgiCisuTFAgCitjcHVmcmVxXC1zZXQgW1xmSW9wdGlvbnNcZlBdCisuU0ggIkRFU0NSSVBUSU9OIgorLkxQIAorY3B1ZnJlcVwtc2V0IGFsbG93cyB5b3UgdG8gbW9kaWZ5IGNwdWZyZXEgc2V0dGluZ3Mgd2l0aG91dCBoYXZpbmcgdG8gdHlwZSBlLmcuICIvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUwL2NwdWZyZXEvc2NhbGluZ19zZXRfc3BlZWQiIGFsbCB0aGUgdGltZS4KKy5TSCAiT1BUSU9OUyIKKy5MUCAKKy5UUCAKK1xmQlwtZFxmUiBcZkJcLVwtbWluXGZSIDxGUkVRPgorbmV3IG1pbmltdW0gQ1BVIGZyZXF1ZW5jeSB0aGUgZ292ZXJub3IgbWF5IHNlbGVjdC4KKy5UUCAKK1xmQlwtdVxmUiBcZkJcLVwtbWF4XGZSIDxGUkVRPgorbmV3IG1heGltdW0gQ1BVIGZyZXF1ZW5jeSB0aGUgZ292ZXJub3IgbWF5IHNlbGVjdC4KKy5UUCAKK1xmQlwtZ1xmUiBcZkJcLVwtZ292ZXJub3JcZlIgPEdPVj4KK25ldyBjcHVmcmVxIGdvdmVybm9yLgorLlRQIAorXGZCXC1mXGZSIFxmQlwtXC1mcmVxXGZSIDxGUkVRPgorc3BlY2lmaWMgZnJlcXVlbmN5IHRvIGJlIHNldC4gUmVxdWlyZXMgdXNlcnNwYWNlIGdvdmVybm9yIHRvIGJlIGF2YWlsYWJsZSBhbmQgbG9hZGVkLgorLlRQIAorXGZCXC1yXGZSIFxmQlwtXC1yZWxhdGVkXGZSCittb2RpZnkgYWxsIGhhcmR3YXJlLXJlbGF0ZWQgQ1BVcyBhdCB0aGUgc2FtZSB0aW1lCisuVFAgCitcZkJcLWhcZlIgXGZCXC1cLWhlbHBcZlIKK1ByaW50cyBvdXQgdGhlIGhlbHAgc2NyZWVuLgorLlNIICJSRU1BUktTIgorLkxQIAorQnkgZGVmYXVsdCB2YWx1ZXMgYXJlIGFwcGxpZWQgb24gYWxsIGNvcmVzLiBIb3cgdG8gbW9kaWZ5IHNpbmdsZSBjb3JlCitjb25maWd1cmF0aW9ucyBpcyBkZXNjcmliZWQgaW4gdGhlIGNwdXBvd2VyKDEpIG1hbnBhZ2UgaW4gdGhlIFwtXC1jcHUgb3B0aW9uIHNlY3Rpb24uCisuTFAgCitUaGUgXC1mIEZSRVEsIFwtXC1mcmVxIEZSRVEgcGFyYW1ldGVyIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIGFueSBvdGhlciBwYXJhbWV0ZXIuCisuTFAgCitGUkVRdWVuY2llcyBjYW4gYmUgcGFzc2VkIGluIEh6LCBrSHogKGRlZmF1bHQpLCBNSHosIEdIeiwgb3IgVEh6IGJ5IHBvc3RmaXhpbmcgdGhlIHZhbHVlIHdpdGggdGhlIHdhbnRlZCB1bml0IG5hbWUsIHdpdGhvdXQgYW55IHNwYWNlIChmcmVxdWVuY3kgaW4ga0h6ID1eIEh6ICogMC4wMDEgPV4gTUh6ICogMTAwMCA9XiBHSHogKiAxMDAwMDAwKS4KKy5MUCAKK09uIExpbnV4IGtlcm5lbHMgdXAgdG8gMi42LjI5LCB0aGUgXC1yIG9yIFwtXC1yZWxhdGVkIHBhcmFtZXRlciBpcyBpZ25vcmVkLgorLlNIICJGSUxFUyIgCisubmYKK1xmSS9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdSovY3B1ZnJlcS9cZlAgIAorXGZJL3Byb2MvY3B1ZnJlcVxmUCAoZGVwcmVjYXRlZCkgCitcZkkvcHJvYy9zeXMvY3B1L1xmUCAoZGVwcmVjYXRlZCkKKy5maSAKKy5TSCAiQVVUSE9SUyIKKy5uZiAKK0RvbWluaWsgQnJvZG93c2tpIDxsaW51eEBicm9kby5kZT4gXC0gYXV0aG9yIAorTWF0dGlhIERvbmdpbGk8bWFsYXR0aWFAZ21haWwuY29tPiBcLSBmaXJzdCBhdXRvbGlidG9vbGl6YXRpb24KKy5maQorLlNIICJTRUUgQUxTTyIKKy5MUCAKK2NwdXBvd2VyXC1mcmVxdWVuY3lcLWluZm8oMSksIGNwdXBvd2VyKDEpCmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci9tYW4vY3B1cG93ZXItaW5mby4xIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvbWFuL2NwdXBvd2VyLWluZm8uMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGUyMTE5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvbWFuL2NwdXBvd2VyLWluZm8uMQpAQCAtMCwwICsxLDE5IEBACisuVEggQ1BVUE9XRVJcLUlORk8gIjEiICIyMi8wMi8yMDExIiAiIiAiY3B1cG93ZXIgTWFudWFsIgorLlNIIE5BTUUKK2NwdXBvd2VyXC1pbmZvIFwtIFNob3dzIHByb2Nlc3NvciBwb3dlciByZWxhdGVkIGtlcm5lbCBvciBoYXJkd2FyZSBjb25maWd1cmF0aW9ucworLlNIIFNZTk9QU0lTCisuZnQgQgorLkIgY3B1cG93ZXIgaW5mbyBbIFwtYiBdIFsgXC1zIF0gWyBcLW0gXQorCisuU0ggREVTQ1JJUFRJT04KK1xmQmNwdXBvd2VyIGluZm8gXGZQIHNob3dzIGtlcm5lbCBjb25maWd1cmF0aW9ucyBvciBwcm9jZXNzb3IgaGFyZHdhcmUKK3JlZ2lzdGVycyBhZmZlY3RpbmcgcHJvY2Vzc29yIHBvd2VyIHNhdmluZyBwb2xpY2llcy4KKworU29tZSBvcHRpb25zIGFyZSBwbGF0Zm9ybSB3aWRlLCBzb21lIGFmZmVjdCBzaW5nbGUgY29yZXMuIEJ5IGRlZmF1bHQgdmFsdWVzCitvZiBjb3JlIHplcm8gYXJlIGRpc3BsYXllZCBvbmx5LiBjcHVwb3dlciAtLWNwdSBhbGwgY3B1aW5mbyB3aWxsIHNob3cgdGhlCitzZXR0aW5ncyBvZiBhbGwgY29yZXMsIHNlZSBjcHVwb3dlcigxKSBob3cgdG8gY2hvb3NlIHNwZWNpZmljIGNvcmVzLgorCisuU0ggIlNFRSBBTFNPIgorT3B0aW9ucyBhcmUgZGVzY3JpYmVkIGluIGRldGFpbCBpbjoKKworY3B1cG93ZXIoMSksIGNwdXBvd2VyLXNldCgxKQpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvbWFuL2NwdXBvd2VyLW1vbml0b3IuMSBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL21hbi9jcHVwb3dlci1tb25pdG9yLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVjZmEyNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL21hbi9jcHVwb3dlci1tb25pdG9yLjEKQEAgLTAsMCArMSwxNzkgQEAKKy5USCBDUFVQT1dFUlwtTU9OSVRPUiAiMSIgIjIyLzAyLzIwMTEiICIiICJjcHVwb3dlciBNYW51YWwiCisuU0ggTkFNRQorY3B1cG93ZXJcLW1vbml0b3IgXC0gUmVwb3J0IHByb2Nlc3NvciBmcmVxdWVuY3kgYW5kIGlkbGUgc3RhdGlzdGljcworLlNIIFNZTk9QU0lTCisuZnQgQgorLkIgY3B1cG93ZXIgbW9uaXRvcgorLlJCICJcLWwiCisKKy5CIGNwdXBvd2VyIG1vbml0b3IKKy5SQiBbICJcLW0gPG1vbjE+LCIgWyAiPG1vbjI+LC4uLiIgXSBdCisuUkIgWyAiXC1pIHNlY29uZHMiIF0KKy5icgorLkIgY3B1cG93ZXIgbW9uaXRvcgorLlJCIFsgIlwtbSA8bW9uMT4sIiBbICI8bW9uMj4sLi4uIiBdIF0KKy5SQiBjb21tYW5kCisuYnIKKy5TSCBERVNDUklQVElPTgorXGZCY3B1cG93ZXItbW9uaXRvciBcZlAgcmVwb3J0cyBwcm9jZXNzb3IgdG9wb2xvZ3ksIGZyZXF1ZW5jeSBhbmQgaWRsZSBwb3dlcgorc3RhdGUgc3RhdGlzdGljcy4gRWl0aGVyIFxmQmNvbW1hbmRcZlAgaXMgZm9ya2VkIGFuZAorc3RhdGlzdGljcyBhcmUgcHJpbnRlZCB1cG9uIGl0cyBjb21wbGV0aW9uLCBvciBzdGF0aXN0aWNzIGFyZSBwcmludGVkIHBlcmlvZGljYWxseS4KKworXGZCY3B1cG93ZXItbW9uaXRvciBcZlAgaW1wbGVtZW50cyBpbmRlcGVuZGVudCBwcm9jZXNzb3Igc2xlZXAgc3RhdGUgYW5kCitmcmVxdWVuY3kgY291bnRlcnMuIFNvbWUgYXJlIHJldHJpZXZlZCBmcm9tIGtlcm5lbCBzdGF0aXN0aWNzLCBzb21lIGFyZQorZGlyZWN0bHkgcmVhZGluZyBvdXQgaGFyZHdhcmUgcmVnaXN0ZXJzLiBVc2UgXC1sIHRvIGdldCBhbiBvdmVydmlldyB3aGljaCBhcmUKK3N1cHBvcnRlZCBvbiB5b3VyIHN5c3RlbS4KKworLlNIIE9wdGlvbnMKKy5QUAorXC1sCisuUlMgNAorTGlzdCBhdmFpbGFibGUgbW9uaXRvcnMgb24geW91ciBzeXN0ZW0uIEFkZGl0aW9uYWwgZGV0YWlscyBhYm91dCBlYWNoIG1vbml0b3IKK2FyZSBzaG93bjoKKy5SUyAyCisuSVAgXChidQorVGhlIG5hbWUgaW4gcXVvdGF0aW9uIG1hcmtzIHdoaWNoIGNhbiBiZSBwYXNzZWQgdG8gdGhlIFwtbSBwYXJhbWV0ZXIuCisuSVAgXChidQorVGhlIG51bWJlciBvZiBkaWZmZXJlbnQgY291bnRlcnMgdGhlIG1vbml0b3Igc3VwcG9ydHMgaW4gYnJhY2tldHMuCisuSVAgXChidQorVGhlIGFtb3VudCBvZiB0aW1lIGluIHNlY29uZHMgdGhlIGNvdW50ZXJzIG1pZ2h0IG92ZXJmbG93LCBkdWUgdG8KK2ltcGxlbWVudGF0aW9uIGNvbnN0cmFpbnRzLgorLklQIFwoYnUKK1RoZSBuYW1lIGFuZCBhIGRlc2NyaXB0aW9uIG9mIGVhY2ggY291bnRlciBhbmQgaXRzIHByb2Nlc3NvciBoaWVyYXJjaHkgbGV2ZWwKK2NvdmVyYWdlIGluIHNxdWFyZSBicmFja2V0czoKKy5SUyA0CisuSVAgXChidQorW1RdIFwtPiBUaHJlYWQKKy5JUCBcKGJ1CitbQ10gXC0+IENvcmUKKy5JUCBcKGJ1CitbUF0gXC0+IFByb2Nlc3NvciBQYWNrYWdlIChTb2NrZXQpCisuSVAgXChidQorW01dIFwtPiBNYWNoaW5lL1BsYXRmb3JtIHdpZGUgY291bnRlcgorLlJFCisuUkUKKy5SRQorLlBQCitcLW0gPG1vbjE+LDxtb24yPiwuLi4KKy5SUyA0CitPbmx5IGRpc3BsYXkgc3BlY2lmaWMgbW9uaXRvcnMuIFVzZSB0aGUgbW9uaXRvciBzdHJpbmcocykgcHJvdmlkZWQgYnkgXC1sIG9wdGlvbi4KKy5SRQorLlBQCitcLWkgc2Vjb25kcworLlJTIDQKK01lYXN1cmUgaW50ZXJ2YWxsLgorLlJFCisuUFAKK2NvbW1hbmQKKy5SUyA0CitNZWFzdXJlIGlkbGUgYW5kIGZyZXF1ZW5jeSBjaGFyYWN0ZXJpc3RpY3Mgb2YgYW4gYXJiaXRyYXJ5IGNvbW1hbmQvd29ya2xvYWQuCitUaGUgZXhlY3V0YWJsZSBcZkJjb21tYW5kXGZQIGlzIGZvcmtlZCBhbmQgdXBvbiBpdHMgZXhpdCwgc3RhdGlzdGljcyBnYXRoZXJlZCBzaW5jZSBpdCB3YXMKK2ZvcmtlZCBhcmUgZGlzcGxheWVkLgorLlJFCisuUFAKK1wtdgorLlJTIDQKK0luY3JlYXNlIHZlcmJvc2l0eSBpZiB0aGUgYmluYXJ5IHdhcyBjb21waWxlZCB3aXRoIHRoZSBERUJVRyBvcHRpb24gc2V0LgorLlJFCisKKy5TSCBNT05JVE9SIERFU0NSSVBUSU9OUworLlNTICJJZGxlX1N0YXRzIgorU2hvd3Mgc3RhdGlzdGljcyBvZiB0aGUgY3B1aWRsZSBrZXJuZWwgc3Vic3lzdGVtLiBWYWx1ZXMgYXJlIHJldHJpZXZlZCBmcm9tCisvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUqL2NwdWlkbGUvc3RhdGUqLy4KK1RoZSBrZXJuZWwgdXBkYXRlcyB0aGVzZSB2YWx1ZXMgZXZlcnkgdGltZSBhbiBpZGxlIHN0YXRlIGlzIGVudGVyZWQgb3IKK2xlZnQuIFRoZXJlZm9yZSB0aGVyZSBjYW4gYmUgc29tZSBpbmFjY3VyYWN5IHdoZW4gY29yZXMgYXJlIGluIGFuIGlkbGUKK3N0YXRlIGZvciBzb21lIHRpbWUgd2hlbiB0aGUgbWVhc3VyZSBzdGFydHMgb3IgZW5kcy4gSW4gd29yc3QgY2FzZSBpdCBjYW4gaGFwcGVuCit0aGF0IG9uZSBjb3JlIHN0YXllZCBpbiBhbiBpZGxlIHN0YXRlIGZvciB0aGUgd2hvbGUgbWVhc3VyZSB0aW1lIGFuZCB0aGUgaWRsZQorc3RhdGUgdXNhZ2UgdGltZSBhcyBleHBvcnRlZCBieSB0aGUga2VybmVsIGRpZCBub3QgZ2V0IHVwZGF0ZWQuIEluIHRoaXMgY2FzZQorYSBzdGF0ZSByZXNpZGVuY3kgb2YgMCBwZXJjZW50IGlzIHNob3duIHdoaWxlIGl0IHdhcyAxMDAuCisKKy5TUyAiTXBlcmYiCitUaGUgbmFtZSBjb21lcyBmcm9tIHRoZSBhcGVyZi9tcGVyZiAoYXZlcmFnZSBhbmQgbWF4aW11bSkgTVNSIHJlZ2lzdGVycyB1c2VkCit3aGljaCBhcmUgYXZhaWxhYmxlIG9uIHJlY2VudCBYODYgcHJvY2Vzc29ycy4gSXQgc2hvd3MgdGhlIGF2ZXJhZ2UgZnJlcXVlbmN5CisoaW5jbHVkaW5nIGJvb3N0IGZyZXF1ZW5jaWVzKS4KK1RoZSBmYWN0IHRoYXQgb24gYWxsIHJlY2VudCBoYXJkd2FyZSB0aGUgbXBlcmYgdGltZXIgc3RvcHMgdGlja2luZyBpbiBhbnkgaWRsZQorc3RhdGUgaXQgaXMgYWxzbyB1c2VkIHRvIHNob3cgQzAgKHByb2Nlc3NvciBpcyBhY3RpdmUpIGFuZCBDeCAocHJvY2Vzc29yIGlzIGluCithbnkgc2xlZXAgc3RhdGUpIHRpbWVzLiBUaGVzZSBjb3VudGVycyBkbyBub3QgaGF2ZSB0aGUgaW5hY2N1cmFjeSByZXN0cmljdGlvbnMKK3RoZSAiSWRsZV9TdGF0cyIgY291bnRlcnMgbWF5IHNob3cuCitNYXkgd29yayBwb29ybHkgb24gTGludXgtMi42LjIwIHRocm91Z2ggMi42LjI5LCBhcyB0aGUgXGZCYWNwaS1jcHVmcmVxIFxmUAora2VybmVsIGZyZXF1ZW5jeSBkcml2ZXIgcGVyaW9kaWNhbGx5IGNsZWFyZWQgYXBlcmYvbXBlcmYgcmVnaXN0ZXJzIGluIHRob3NlCitrZXJuZWxzLgorCisuU1MgIk5laGFsZW0iICJTYW5keUJyaWRnZSIKK0ludGVsIENvcmUgYW5kIFBhY2thZ2Ugc2xlZXAgc3RhdGUgY291bnRlcnMuCitUaHJlYWRzIChoeXBlcnRocmVhZGVkIGNvcmVzKSBtYXkgbm90IGJlIGFibGUgdG8gZW50ZXIgZGVlcGVyIGNvcmUgc3RhdGVzIGlmCitpdHMgc2libGluZyBpcyB1dGlsaXplZC4KK0RlZXBlc3QgcGFja2FnZSBzbGVlcCBzdGF0ZXMgbWF5IGluIHJlYWxpdHkgc2hvdyB1cCBhcyBtYWNoaW5lL3BsYXRmb3JtIHdpZGUKK3NsZWVwIHN0YXRlcyBhbmQgY2FuIG9ubHkgYmUgZW50ZXJlZCBpZiBhbGwgY29yZXMgYXJlIGlkbGUuIExvb2sgdXAgSW50ZWwKK21hbnVhbHMgKHNvbWUgYXJlIHByb3ZpZGVkIGluIHRoZSBSZWZlcmVuY2VzIHNlY3Rpb24pIGZvciBmdXJ0aGVyIGRldGFpbHMuCisKKy5TUyAiT250YXJpbyIgIkxpYW5vIgorQU1EIGxhcHRvcCBhbmQgZGVza3RvcCBwcm9jZXNzb3IgKGZhbWlseSAxMmggYW5kIDE0aCkgc2xlZXAgc3RhdGUgY291bnRlcnMuCitUaGUgcmVnaXN0ZXJzIGFyZSBhY2Nlc3NlZCB2aWEgUENJIGFuZCB0aGVyZWZvcmUgY2FuIHN0aWxsIGJlIHJlYWQgb3V0IHdoaWxlCitjb3JlcyBoYXZlIGJlZW4gb2ZmbGluZWQuCisKK1RoZXJlIGlzIG9uZSBzcGVjaWFsIGNvdW50ZXI6IE5CUDEgKE5vcnRoIEJyaWRnZSBQMSkuCitUaGlzIG9uZSBhbHdheXMgcmV0dXJucyAwIG9yIDEsIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBOb3J0aCBCcmlkZ2UgUDEKK3Bvd2VyIHN0YXRlIGdvdCBlbnRlcmVkIGF0IGxlYXN0IG9uY2UgZHVyaW5nIG1lYXN1cmUgdGltZS4KK0JlaW5nIGFibGUgdG8gZW50ZXIgTkJQMSBzdGF0ZSBhbHNvIGRlcGVuZHMgb24gZ3JhcGhpY3MgcG93ZXIgbWFuYWdlbWVudC4KK1RoZXJlZm9yZSB0aGlzIGNvdW50ZXIgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHdoZXRoZXIgdGhlIGdyYXBoaWNzJyBkcml2ZXIKK3Bvd2VyIG1hbmFnZW1lbnQgaXMgd29ya2luZyBhcyBleHBlY3RlZC4KKworLlNIIEVYQU1QTEVTCisKK2NwdXBvd2VyIG1vbml0b3IgLWwiIG1heSBzaG93OgorLlJTIDQKK01vbml0b3IgIk1wZXJmIiAoMyBzdGF0ZXMpIFwtIE1pZ2h0IG92ZXJmbG93IGFmdGVyIDkyMjAwMDAwMCBzCisKKyAgIC4uLgorCitNb25pdG9yICJJZGxlX1N0YXRzIiAoMyBzdGF0ZXMpIFwtIE1pZ2h0IG92ZXJmbG93IGFmdGVyIDQyOTQ5NjcyOTUgcworCisgICAuLi4KKworLlJFCitjcHVwb3dlciBtb25pdG9yIFwtbSAiSWRsZV9TdGF0cyxNcGVyZiIgc2NwIC90bXAvdGVzdCAvbmZzL3RtcAorCitNb25pdG9yIHRoZSBzY3AgY29tbWFuZCwgc2hvdyBib3RoIE1wZXJmIGFuZCBJZGxlX1N0YXRzIHN0YXRlcyBjb3VudGVyCitzdGF0aXN0aWNzLCBidXQgaW4gZXhjaGFuZ2VkIG9yZGVyLgorCisKKworLlJFCitCZSBjYXJlZnVsIHRoYXQgdGhlIHR5cGljYWwgY29tbWFuZCB0byBmdWxseSB1dGlsaXplIG9uZSBDUFUgYnkgZG9pbmc6CisKK2NwdXBvd2VyIG1vbml0b3IgY2F0IC9kZXYvemVybyA+L2Rldi9udWxsCisKK0RvZXMgbm90IHdvcmsgYXMgZXhwZWN0ZWQsIGJlY2F1c2UgdGhlIG1lYXN1cmVkIG91dHB1dCBpcyByZWRpcmVjdGVkIHRvCisvZGV2L251bGwuIFRoaXMgY291bGQgZ2V0IHdvcmthcm91bmRlZCBieSBwdXR0aW5nIHRoZSBsaW5lIGludG8gYW4gb3duLCB0aW55CitzaGVsbCBzY3JpcHQuIEhpdCBDVFJMXC1jIHRvIHRlcm1pbmF0ZSB0aGUgY29tbWFuZCBhbmQgZ2V0IHRoZSBtZWFzdXJlIG91dHB1dAorZGlzcGxheWVkLgorCisuU0ggUkVGRVJFTkNFUworIkJJT1MgYW5kIEtlcm5lbCBEZXZlbG9wZXLigJlzIEd1aWRlIChCS0RHKSBmb3IgQU1EIEZhbWlseSAxNGggUHJvY2Vzc29ycyIKK2h0dHA6Ly9zdXBwb3J0LmFtZC5jb20vdXMvUHJvY2Vzc29yX1RlY2hEb2NzLzQzMTcwLnBkZgorCisiSW50ZWzCriBUdXJibyBCb29zdCBUZWNobm9sb2d5CitpbiBJbnRlbMKuIENvcmXihKIgTWljcm9hcmNoaXRlY3R1cmUgKE5laGFsZW0pIEJhc2VkIFByb2Nlc3NvcnMiCitodHRwOi8vZG93bmxvYWQuaW50ZWwuY29tL2Rlc2lnbi9wcm9jZXNzb3IvYXBwbG5vdHMvMzIwMzU0LnBkZgorCisiSW50ZWzCriA2NCBhbmQgSUEtMzIgQXJjaGl0ZWN0dXJlcyBTb2Z0d2FyZSBEZXZlbG9wZXIncyBNYW51YWwKK1ZvbHVtZSAzQjogU3lzdGVtIFByb2dyYW1taW5nIEd1aWRlIgoraHR0cDovL3d3dy5pbnRlbC5jb20vcHJvZHVjdHMvcHJvY2Vzc29yL21hbnVhbHMKKworLlNIIEZJTEVTCisudGEKKy5uZgorL2Rldi9jcHUvKi9tc3IKKy9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdSovY3B1aWRsZS9zdGF0ZSovLgorLmZpCisKKy5TSCAiU0VFIEFMU08iCitwb3dlcnRvcCg4KSwgbXNyKDQpLCB2bXN0YXQoOCkKKy5QUAorLlNIIEFVVEhPUlMKKy5uZgorV3JpdHRlbiBieSBUaG9tYXMgUmVubmluZ2VyIDx0cmVubkBzdXNlLmRlPgorCitOZWhhbGVtLCBTYW5keUJyaWRnZSBtb25pdG9ycyBhbmQgY29tbWFuZCBwYXNzaW5nCitiYXNlZCBvbiB0dXJib3N0YXQuOCBmcm9tIExlbiBCcm93biA8bGVuLmJyb3duQGludGVsLmNvbT4KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL21hbi9jcHVwb3dlci1zZXQuMSBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL21hbi9jcHVwb3dlci1zZXQuMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDk1NGE5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvbWFuL2NwdXBvd2VyLXNldC4xCkBAIC0wLDAgKzEsMTAzIEBACisuVEggQ1BVUE9XRVJcLVNFVCAiMSIgIjIyLzAyLzIwMTEiICIiICJjcHVwb3dlciBNYW51YWwiCisuU0ggTkFNRQorY3B1cG93ZXJcLXNldCBcLSBTZXQgcHJvY2Vzc29yIHBvd2VyIHJlbGF0ZWQga2VybmVsIG9yIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb25zCisuU0ggU1lOT1BTSVMKKy5mdCBCCisuQiBjcHVwb3dlciBzZXQgWyBcLWIgVkFMIF0gWyBcLXMgVkFMIF0gWyBcLW0gVkFMIF0KKworCisuU0ggREVTQ1JJUFRJT04KK1xmQmNwdXBvd2VyIHNldCBcZlAgc2V0cyBrZXJuZWwgY29uZmlndXJhdGlvbnMgb3IgZGlyZWN0bHkgYWNjZXNzZXMgaGFyZHdhcmUKK3JlZ2lzdGVycyBhZmZlY3RpbmcgcHJvY2Vzc29yIHBvd2VyIHNhdmluZyBwb2xpY2llcy4KKworU29tZSBvcHRpb25zIGFyZSBwbGF0Zm9ybSB3aWRlLCBzb21lIGFmZmVjdCBzaW5nbGUgY29yZXMuIEJ5IGRlZmF1bHQgdmFsdWVzCithcmUgYXBwbGllZCBvbiBhbGwgY29yZXMuIEhvdyB0byBtb2RpZnkgc2luZ2xlIGNvcmUgY29uZmlndXJhdGlvbnMgaXMKK2Rlc2NyaWJlZCBpbiB0aGUgY3B1cG93ZXIoMSkgbWFucGFnZSBpbiB0aGUgXC1cLWNwdSBvcHRpb24gc2VjdGlvbi4gV2hldGhlciBhbgorb3B0aW9uIGFmZmVjdHMgdGhlIHdob2xlIHN5c3RlbSBvciBjYW4gYmUgYXBwbGllZCB0byBpbmRpdmlkdWFsIGNvcmVzIGlzCitkZXNjcmliZWQgaW4gdGhlIE9wdGlvbnMgc2VjdGlvbnMuCisKK1VzZSBcZkJjcHVwb3dlciBpbmZvIFxmUCB0byByZWFkIG91dCBjdXJyZW50IHNldHRpbmdzIGFuZCB3aGV0aGVyIHRoZXkgYXJlCitzdXBwb3J0ZWQgb24gdGhlIHN5c3RlbSBhdCBhbGwuCisKKy5TSCBPcHRpb25zCisuUFAKK1wtXC1wZXJmLWJpYXMsIFwtYgorLlJTIDQKK1NldHMgYSByZWdpc3RlciBvbiBzdXBwb3J0ZWQgSW50ZWwgcHJvY2Vzc29yZSB3aGljaCBhbGxvd3Mgc29mdHdhcmUgdG8gY29udmV5CitpdHMgcG9saWN5IGZvciB0aGUgcmVsYXRpdmUgaW1wb3J0YW5jZSBvZiBwZXJmb3JtYW5jZSB2ZXJzdXMgZW5lcmd5IHNhdmluZ3MgdG8KK3RoZSAgcHJvY2Vzc29yLgorCitUaGUgcmFuZ2Ugb2YgdmFsaWQgbnVtYmVycyBpcyAwLTE1LCB3aGVyZSAwIGlzIG1heGltdW0KK3BlcmZvcm1hbmNlIGFuZCAxNSBpcyBtYXhpbXVtIGVuZXJneSBlZmZpY2llbmN5LgorCitUaGUgcHJvY2Vzc29yIHVzZXMgdGhpcyBpbmZvcm1hdGlvbiBpbiBtb2RlbC1zcGVjaWZpYyB3YXlzCit3aGVuIGl0IG11c3Qgc2VsZWN0IHRyYWRlLW9mZnMgYmV0d2VlbiBwZXJmb3JtYW5jZSBhbmQKK2VuZXJneSBlZmZpY2llbmN5LgorCitUaGlzIHBvbGljeSBoaW50IGRvZXMgbm90IHN1cGVyc2VkZSBQcm9jZXNzb3IgUGVyZm9ybWFuY2Ugc3RhdGVzCisoUC1zdGF0ZXMpIG9yIENQVSBJZGxlIHBvd2VyIHN0YXRlcyAoQy1zdGF0ZXMpLCBidXQgYWxsb3dzCitzb2Z0d2FyZSB0byBoYXZlIGluZmx1ZW5jZSB3aGVyZSBpdCB3b3VsZCBvdGhlcndpc2UgYmUgdW5hYmxlCit0byBleHByZXNzIGEgcHJlZmVyZW5jZS4KKworRm9yIGV4YW1wbGUsIHRoaXMgc2V0dGluZyBtYXkgdGVsbCB0aGUgaGFyZHdhcmUgaG93CithZ2dyZXNzaXZlbHkgb3IgY29uc2VydmF0aXZlbHkgdG8gY29udHJvbCBmcmVxdWVuY3kKK2luIHRoZSAidHVyYm8gcmFuZ2UiIGFib3ZlIHRoZSBleHBsaWNpdGx5IE9TLWNvbnRyb2xsZWQKK1Atc3RhdGUgZnJlcXVlbmN5IHJhbmdlLiAgSXQgbWF5IGFsc28gdGVsbCB0aGUgaGFyZHdhcmUKK2hvdyBhZ2dyZXNzaXZlbHkgaXQgc2hvdWxkIGVudGVyIHRoZSBPUyByZXF1ZXN0ZWQgQy1zdGF0ZXMuCisKK1RoaXMgb3B0aW9uIGNhbiBiZSBhcHBsaWVkIHRvIGluZGl2aWR1YWwgY29yZXMgb25seSB2aWEgdGhlIFwtXC1jcHUgb3B0aW9uLAorY3B1cG93ZXIoMSkuCisKK1NldHRpbmcgdGhlIHBlcmZvcm1hbmNlIGJpYXMgdmFsdWUgb24gb25lIENQVSBjYW4gbW9kaWZ5IHRoZSBzZXR0aW5nIG9uCityZWxhdGVkIENQVXMgYXMgd2VsbCAoZm9yIGV4YW1wbGUgYWxsIENQVXMgb24gb25lIHNvY2tldCksIGJlY2F1c2Ugb2YKK2hhcmR3YXJlIHJlc3RyaWN0aW9ucy4KK1VzZSBcZkJjcHVwb3dlciAtYyBhbGwgaW5mbyAtYlxmUCB0byB2ZXJpZnkuCisKK1RoaXMgb3B0aW9ucyBuZWVkcyB0aGUgbXNyIGtlcm5lbCBkcml2ZXIgKENPTkZJR19YODZfTVNSKSBsb2FkZWQuCisuUkUKKy5QUAorXC1cLXNjaGVkXC1tYywgIFwtbSBbIFZBTCBdCisuUkUKK1wtXC1zY2hlZFwtc210LCBcLXMgWyBWQUwgXQorLlJTIDQKK1wtXC1zY2hlZFwtbWMgdXRpbGl6ZXMgY29yZXMgaW4gb25lIHByb2Nlc3NvciBwYWNrYWdlL3NvY2tldCBmaXJzdCBiZWZvcmUKK3Byb2Nlc3NlcyBhcmUgc2NoZWR1bGVkIHRvIG90aGVyIHByb2Nlc3NvciBwYWNrYWdlcy9zb2NrZXRzLgorCitcLVwtc2NoZWRcLXNtdCB1dGlsaXplcyB0aHJlYWQgc2libGluZ3Mgb2Ygb25lIHByb2Nlc3NvciBjb3JlIGZpcnN0IGJlZm9yZQorcHJvY2Vzc2VzIGFyZSBzY2hlZHVsZWQgdG8gb3RoZXIgY29yZXMuCisKK1RoZSBpbXBhY3Qgb24gcG93ZXIgY29uc3VtcHRpb24gYW5kIHBlcmZvcm1hbmNlIChwb3NpdGl2IG9yIG5lZ2F0aXYpIGhlYXZpbHkKK2RlcGVuZHMgb24gcHJvY2Vzc29yIHN1cHBvcnQgZm9yIGRlZXAgc2xlZXAgc3RhdGVzLCBmcmVxdWVuY3kgc2NhbGluZyBhbmQKK2ZyZXF1ZW5jeSBib29zdCBtb2RlcyBhbmQgdGhlaXIgZGVwZW5kZW5jaWVzIGJldHdlZW4gb3RoZXIgdGhyZWFkIHNpYmxpbmdzCithbmQgcHJvY2Vzc29yIGNvcmVzLgorCitUYWtlbiBvdmVyIGZyb20ga2VybmVsIGRvY3VtZW50YXRpb246CisKK0FkanVzdCB0aGUga2VybmVsJ3MgbXVsdGktY29yZSBzY2hlZHVsZXIgc3VwcG9ydC4KKworUG9zc2libGUgdmFsdWVzIGFyZToKKy5SUyAyCiswIC0gTm8gcG93ZXIgc2F2aW5nIGxvYWQgYmFsYW5jZSAoZGVmYXVsdCB2YWx1ZSkKKworMSAtIEZpbGwgb25lIHRocmVhZC9jb3JlL3BhY2thZ2UgZmlyc3QgZm9yIGxvbmcgcnVubmluZyB0aHJlYWRzCisKKzIgLSBBbHNvIGJpYXMgdGFzayB3YWtldXBzIHRvIHNlbWktaWRsZSBjcHUgcGFja2FnZSBmb3IgcG93ZXIKK3NhdmluZ3MKKy5SRQorCitzY2hlZF9tY19wb3dlcl9zYXZpbmdzIGlzIGRlcGVuZGVudCB1cG9uIFNDSEVEX01DLCB3aGljaCBpcworaXRzZWxmIGFyY2hpdGVjdHVyZSBkZXBlbmRlbnQuCisKK3NjaGVkX3NtdF9wb3dlcl9zYXZpbmdzIGlzIGRlcGVuZGVudCB1cG9uIFNDSEVEX1NNVCwgd2hpY2gKK2lzIGl0c2VsZiBhcmNoaXRlY3R1cmUgZGVwZW5kZW50LgorCitUaGUgdHdvIGZpbGVzIGFyZSBpbmRlcGVuZGVudCBvZiBlYWNoIG90aGVyLiBJdCBpcyBwb3NzaWJsZQordGhhdCBvbmUgZmlsZSBtYXkgYmUgcHJlc2VudCB3aXRob3V0IHRoZSBvdGhlci4KKworLlNIICJTRUUgQUxTTyIKK2NwdXBvd2VyLWluZm8oMSksIGNwdXBvd2VyLW1vbml0b3IoMSksIHBvd2VydG9wKDEpCisuUFAKKy5TSCBBVVRIT1JTCisubmYKK1wtXC1wZXJmXC1iaWFzIHBhcnRzIHdyaXR0ZW4gYnkgTGVuIEJyb3duIDxsZW4uYnJvd25AaW50ZWwuY29tPgorVGhvbWFzIFJlbm5pbmdlciA8dHJlbm5Ac3VzZS5kZT4KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL21hbi9jcHVwb3dlci4xIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvbWFuL2NwdXBvd2VyLjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhjMjBmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL21hbi9jcHVwb3dlci4xCkBAIC0wLDAgKzEsNzIgQEAKKy5USCBDUFVQT1dFUiAiMSIgIjA3LzAzLzIwMTEiICIiICJjcHVwb3dlciBNYW51YWwiCisuU0ggTkFNRQorY3B1cG93ZXIgXC0gU2hvd3MgYW5kIHNldHMgcHJvY2Vzc29yIHBvd2VyIHJlbGF0ZWQgdmFsdWVzCisuU0ggU1lOT1BTSVMKKy5mdCBCCisuQiBjcHVwb3dlciBbIFwtYyBjcHVsaXN0IF0gc3ViY29tbWFuZCBbQVJHU10KKworLkIgY3B1cG93ZXIgXC12fFwtXC12ZXJzaW9uCisKKy5CIGNwdXBvd2VyIFwtaHxcLVwtaGVscAorCisuU0ggREVTQ1JJUFRJT04KK1xmQmNwdXBvd2VyIFxmUCBpcyBhIGNvbGxlY3Rpb24gb2YgdG9vbHMgdG8gZXhhbWluZSBhbmQgdHVuZSBwb3dlciBzYXZpbmcKK3JlbGF0ZWQgZmVhdHVyZXMgb2YgeW91ciBwcm9jZXNzb3IuCisKK1RoZSBtYW5wYWdlcyBvZiB0aGUgc3ViY29tbWFuZHMgKGNwdXBvd2VyXC08c3ViY29tbWFuZD4oMSkpIHByb3ZpZGUgZGV0YWlsZWQKK2Rlc2NyaXB0aW9ucyBvZiBzdXBwb3J0ZWQgZmVhdHVyZXMuIFJ1biBcZkJjcHVwb3dlciBoZWxwXGZQIHRvIGdldCBhbiBvdmVydmlldworb2Ygc3VwcG9ydGVkIHN1YmNvbW1hbmRzLgorCisuU0ggT3B0aW9ucworLlBQCitcLVwtaGVscCwgXC1oCisuUlMgNAorU2hvd3Mgc3VwcG9ydGVkIHN1YmNvbW1hbmRzIGFuZCBnZW5lcmFsIHVzYWdlLgorLlJFCisuUFAKK1wtXC1jcHUgY3B1bGlzdCwgIFwtYyBjcHVsaXN0CisuUlMgNAorT25seSBzaG93IG9yIHNldCB2YWx1ZXMgZm9yIHNwZWNpZmljIGNvcmVzLgorVGhpcyBvcHRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBhbGwgc3ViY29tbWFuZHMsIGRldGFpbHMgY2FuIGJlIGZvdW5kIGluIHRoZQorbWFucGFnZXMgb2YgdGhlIHN1YmNvbW1hbmRzLgorCitTb21lIHN1YmNvbW1hbmRzIGFjY2VzcyBhbGwgY29yZXMgKHR5cGljYWxseSB0aGUgKlwtc2V0IGNvbW1hbmRzKSwgc29tZSBvbmx5Cit0aGUgZmlyc3QgY29yZSAodHlwaWNhbGx5IHRoZSAqXC1pbmZvIGNvbW1hbmRzKSBieSBkZWZhdWx0LgorCitUaGUgc3ludGF4IGZvciA8Y3B1bGlzdD4gaXMgYmFzZWQgb24gaG93IHRoZSBrZXJuZWwgZXhwb3J0cyBDUFUgYml0bWFza3MgdmlhCitzeXNmcyBmaWxlcy4gU29tZSBleGFtcGxlczoKKy5SUyA0CisuVFAgMTYKK0lucHV0CitFcXVpdmFsZW50IHRvCisuVFAKK2FsbAorYWxsIGNvcmVzCisuVFAKKzBcLTMKKzAsMSwyLDMKKy5UUAorMFwtNzoyCiswLDIsNCw2CisuVFAKKzEsMyw1LTcKKzEsMyw1LDYsNworLlRQCiswXC0zOjIsOFwtMTU6NAorMCwyLDgsMTIJCisuUkUKKy5SRQorLlBQCitcLVwtdmVyc2lvbiwgIFwtdgorLlJTIDQKK1ByaW50IHRoZSBwYWNrYWdlIG5hbWUgYW5kIHZlcnNpb24gbnVtYmVyLgorCisuU0ggIlNFRSBBTFNPIgorY3B1cG93ZXItc2V0KDEpLCBjcHVwb3dlci1pbmZvKDEpLCBjcHVwb3dlci1pZGxlKDEpLAorY3B1cG93ZXItZnJlcXVlbmN5LXNldCgxKSwgY3B1cG93ZXItZnJlcXVlbmN5LWluZm8oMSksIGNwdXBvd2VyLW1vbml0b3IoMSksCitwb3dlcnRvcCgxKQorLlBQCisuU0ggQVVUSE9SUworLm5mCitcLVwtcGVyZlwtYmlhcyBwYXJ0cyB3cml0dGVuIGJ5IExlbiBCcm93biA8bGVuLmJyb3duQGludGVsLmNvbT4KK1Rob21hcyBSZW5uaW5nZXIgPHRyZW5uQHN1c2UuZGU+CmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci9wby9jcy5wbyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3BvL2NzLnBvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMjJjNDUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci9wby9jcy5wbwpAQCAtMCwwICsxLDk0NCBAQAorIyB0cmFuc2xhdGlvbiBvZiBjcy5wbyB0byBDemVjaAorIyBDemVjaCB0cmFuc2xhdGlvbiBmb3IgY3B1ZnJlcXV0aWxzIHBhY2thZ2UKKyMgQ3plY2ggbWVzc2FnZXMgZm9yIGNwdWZyZXF1dGlscy4KKyMgQ29weXJpZ2h0IChDKSAyMDA3IGthdm9sCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSBjcHVmcmVxdXRpbHMgcGFja2FnZS4KKyMKKyMgS2FyZWwgVm9sbsO9IDxrYXZvbEBzZXpuYW0uY3o+LCAyMDA3LCAyMDA4LgorbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogY3NcbiIKKyJSZXBvcnQtTXNnaWQtQnVncy1UbzogXG4iCisiUE9ULUNyZWF0aW9uLURhdGU6IDIwMTEtMDMtMDggMTc6MDMrMDEwMFxuIgorIlBPLVJldmlzaW9uLURhdGU6IDIwMDgtMDYtMTEgMTY6MjYrMDIwMFxuIgorIkxhc3QtVHJhbnNsYXRvcjogS2FyZWwgVm9sbsO9IDxrYXZvbEBzZXpuYW0uY3o+XG4iCisiTGFuZ3VhZ2UtVGVhbTogQ3plY2ggPGRpc2t1emVAbGlzdHMubDEwbi5jej5cbiIKKyJMYW5ndWFnZTogY3NcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJQbHVyYWwtRm9ybXM6ICBucGx1cmFscz0zOyBwbHVyYWw9KG49PTEpID8gMCA6IChuPj0yICYmIG48PTQpID8gMSA6IDI7XG4iCisiWC1HZW5lcmF0b3I6IEtCYWJlbCAxLjExLjRcbiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL25obV9pZGxlLmM6MzYKK21zZ2lkICJQcm9jZXNzb3IgQ29yZSBDMyIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvbmhtX2lkbGUuYzo0MworbXNnaWQgIlByb2Nlc3NvciBDb3JlIEM2IgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9uaG1faWRsZS5jOjUxCittc2dpZCAiUHJvY2Vzc29yIFBhY2thZ2UgQzMiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL25obV9pZGxlLmM6NTggdXRpbHMvaWRsZV9tb25pdG9yL2FtZF9mYW0xNGhfaWRsZS5jOjcwCittc2dpZCAiUHJvY2Vzc29yIFBhY2thZ2UgQzYiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL3NuYl9pZGxlLmM6MzMKK21zZ2lkICJQcm9jZXNzb3IgQ29yZSBDNyIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3Ivc25iX2lkbGUuYzo0MAorbXNnaWQgIlByb2Nlc3NvciBQYWNrYWdlIEMyIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9zbmJfaWRsZS5jOjQ3Cittc2dpZCAiUHJvY2Vzc29yIFBhY2thZ2UgQzciCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2FtZF9mYW0xNGhfaWRsZS5jOjU2Cittc2dpZCAiUGFja2FnZSBpbiBzbGVlcCBzdGF0ZSAoUEMxIG9yIGRlZXBlcikiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2FtZF9mYW0xNGhfaWRsZS5jOjYzCittc2dpZCAiUHJvY2Vzc29yIFBhY2thZ2UgQzEiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2FtZF9mYW0xNGhfaWRsZS5jOjc3Cittc2dpZCAiTm9ydGggQnJpZGdlIFAxIGJvb2xlYW4gY291bnRlciAocmV0dXJucyAwIG9yIDEpIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9tcGVyZl9tb25pdG9yLmM6MzUKK21zZ2lkICJQcm9jZXNzb3IgQ29yZSBub3QgaWRsZSIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvbXBlcmZfbW9uaXRvci5jOjQyCittc2dpZCAiUHJvY2Vzc29yIENvcmUgaW4gYW4gaWRsZSBzdGF0ZSIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvbXBlcmZfbW9uaXRvci5jOjUwCittc2dpZCAiQXZlcmFnZSBGcmVxdWVuY3kgKGluY2x1ZGluZyBib29zdCkgaW4gTUh6IgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorImNwdXBvd2VyIG1vbml0b3I6IFstaF0gWyBbLXRdIHwgWy1sXSB8IFstbSA8bW9uMT4sWzxtb24yPl0gXSBdIFstaSAiCisiaW50ZXJ2YWxfc2VjIHwgLWMgY29tbWFuZCAuLi5dXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo2OQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiY3B1cG93ZXIgbW9uaXRvcjogWy12XSBbLWhdIFsgWy10XSB8IFstbF0gfCBbLW0gPG1vbjE+LFs8bW9uMj5dIF0gXSBbLWkgIgorImludGVydmFsX3NlYyB8IC1jIGNvbW1hbmQgLi4uXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiXHQgLXY6IGJlIG1vcmUgdmVyYm9zZVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiXHQgLWg6IHByaW50IHRoaXMgaGVscFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiXHQgLWk6IHRpbWUgaW50ZXJ2YWxsIHRvIG1lYXN1cmUgZm9yIGluIHNlY29uZHMgKGRlZmF1bHQgMSlcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjc1CisjLCBjLWZvcm1hdAorbXNnaWQgIlx0IC10OiBzaG93IENQVSB0b3BvbG9neS9oaWVyYXJjaHlcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjc2CisjLCBjLWZvcm1hdAorbXNnaWQgIlx0IC1sOiBsaXN0IGF2YWlsYWJsZSBDUFUgc2xlZXAgbW9uaXRvcnMgKGZvciB1c2Ugd2l0aCAtbSlcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjc3CisjLCBjLWZvcm1hdAorbXNnaWQgIlx0IC1tOiBzaG93IHNwZWNpZmljIENQVSBzbGVlcCBtb25pdG9ycyBvbmx5IChpbiBzYW1lIG9yZGVyKVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIm9ubHkgb25lIG9mOiAtdCwgLWwsIC1tIGFyZSBhbGxvd2VkXG4iCisiSWYgbm9uZSBvZiB0aGVtIGlzIHBhc3NlZCwiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo4MAorIywgYy1mb3JtYXQKK21zZ2lkICIgYWxsIHN1cHBvcnRlZCBtb25pdG9ycyBhcmUgc2hvd25cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjE5NworIywgYy1mb3JtYXQKK21zZ2lkICJNb25pdG9yICVzLCBDb3VudGVyICVzIGhhcyBubyBjb3VudCBmdW5jdGlvbi4gSW1wbGVtZW50YXRpb24gZXJyb3JcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjIwNworIywgYy1mb3JtYXQKK21zZ2lkICIgKmlzIG9mZmxpbmVcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjIzNgorIywgYy1mb3JtYXQKK21zZ2lkICIlczogbWF4IG1vbml0b3IgbmFtZSBsZW5ndGggKCVkKSBleGNlZWRlZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6MjUwCisjLCBjLWZvcm1hdAorbXNnaWQgIk5vIG1hdGNoaW5nIG1vbml0b3IgZm91bmQgaW4gJXMsIHRyeSAtbCBvcHRpb25cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjI2NgorIywgYy1mb3JtYXQKK21zZ2lkICJNb25pdG9yIFwiJXNcIiAoJWQgc3RhdGVzKSAtIE1pZ2h0IG92ZXJmbG93IGFmdGVyICV1IHNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjMxOQorIywgYy1mb3JtYXQKK21zZ2lkICIlcyB0b29rICUuNWYgc2Vjb25kcyBhbmQgZXhpdGVkIHdpdGggc3RhdHVzICVkXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo0MDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IHJlYWQgbnVtYmVyIG9mIGF2YWlsYWJsZSBwcm9jZXNzb3JzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo0MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiQXZhaWxhYmxlIG1vbml0b3IgJXMgbmVlZHMgcm9vdCBhY2Nlc3NcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjQyOAorIywgYy1mb3JtYXQKK21zZ2lkICJObyBIVyBDc3RhdGUgbW9uaXRvcnMgZm91bmRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjc4CisjLCBjLWZvcm1hdAorbXNnaWQgImNwdXBvd2VyIFsgLWMgY3B1bGlzdCBdIHN1YmNvbW1hbmQgW0FSR1NdXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzo3OQorIywgYy1mb3JtYXQKK21zZ2lkICJjcHVwb3dlciAtLXZlcnNpb25cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjgwCisjLCBjLWZvcm1hdAorbXNnaWQgIlN1cHBvcnRlZCBzdWJjb21tYW5kcyBhcmU6XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzo4MworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiU29tZSBzdWJjb21tYW5kcyBjYW4gbWFrZSB1c2Ugb2YgdGhlIC1jIGNwdWxpc3Qgb3B0aW9uLlxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLmM6ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiTG9vayBhdCB0aGUgZ2VuZXJhbCBjcHVwb3dlciBtYW5wYWdlIGhvdyB0byB1c2UgaXRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjg1CisjLCBjLWZvcm1hdAorbXNnaWQgImFuZCByZWFkIHVwIHRoZSBzdWJjb21tYW5kJ3MgbWFucGFnZSB3aGV0aGVyIGl0IGlzIHN1cHBvcnRlZC5cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjg2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyJVc2UgY3B1cG93ZXIgaGVscCBzdWJjb21tYW5kIGZvciBnZXR0aW5nIGhlbHAgZm9yIGFib3ZlIHN1YmNvbW1hbmRzLlxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLmM6OTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVwb3J0IGVycm9ycyBhbmQgYnVncyB0byAlcywgcGxlYXNlLlxuIgorbXNnc3RyICIiCisiQ2h5YnkgdiBwcm9ncmFtdSBwcm9zw61tIGhsYXN0ZSBuYSAlcyAoYW5nbGlja3kpLlxuIgorIkNoeWJ5IHYgcMWZZWtsYWR1IHByb3PDrW0gaGxhc3RlIG5hIGthdm9sQHNlem5hbS5jeiAoxI1lc2t5IDstKVxuIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjExNAorIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBwYXJzaW5nIGNwdSBsaXN0XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzoxNzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiU3ViY29tbWFuZCAlcyBuZWVkcyByb290IHByaXZpbGVnZXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzozMQorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZG4ndCBjb3VudCB0aGUgbnVtYmVyIG9mIENQVXMgKCVzOiAlcyksIGFzc3VtaW5nIDFcbiIKK21zZ3N0ciAiTmVsemUgemppc3RpdCBwb8SNZXQgQ1BVICglczogJXMpLCBwxZllZHBva2zDoWTDoSBzZSAxLlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo2MworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAgICAgICAgIG1pbmltdW0gQ1BVIGZyZXF1ZW5jeSAgLSAgbWF4aW11bSBDUFUgZnJlcXVlbmN5ICAtICBnb3Zlcm5vclxuIgorbXNnc3RyICIiCisiICAgICAgICAgbWluaW3DoWxuw60gZnJla3ZlbmNlIENQVSAtIG1heGltw6FsbsOtIGZyZWt2ZW5jZSBDUFUgLSAgcmVndWzDoXRvclxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxNTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3Igd2hpbGUgZXZhbHVhdGluZyBCb29zdCBDYXBhYmlsaXRpZXMgb24gQ1BVICVkIC0tIGFyZSB5b3Ugcm9vdD9cbiIKK21zZ3N0ciAiIgorCisjLiBQIHN0YXRlIGNoYW5nZXMgdmlhIE1TUiBhcmUgaWRlbnRpZmllZCB2aWEgY3B1aWQgODAwMDAwMDcKKyMuIG9uIEludGVsIGFuZCBBTUQsIGJ1dCB3ZSBhc3N1bWUgYm9vc3QgY2FwYWJsZSBtYWNoaW5lcyBjYW4gZG8gdGhhdAorIy4gaWYgKGNwdWlkX2VheCgweDgwMDAwMDAwKSA+PSAweDgwMDAwMDA3CisjLiAmJiAoY3B1aWRfZWR4KDB4ODAwMDAwMDcpICYgKDEgPDwgNykpKQorIy4KKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE2MQorIywgYy1mb3JtYXQKK21zZ2lkICIgIGJvb3N0IHN0YXRlIHN1cHBvcnQ6IFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE2MworIywgYy1mb3JtYXQKK21zZ2lkICIgICAgU3VwcG9ydGVkOiAlc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE2MyB1dGlscy9jcHVmcmVxLWluZm8uYzoxNjQKK21zZ2lkICJ5ZXMiCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTYzIHV0aWxzL2NwdWZyZXEtaW5mby5jOjE2NAorbXNnaWQgIm5vIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE2NAorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiICAgIEFjdGl2ZTogJXNcbiIKK21zZ3N0ciAiICBvdmxhZGHEjTogJXNcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTc3CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgICBCb29zdCBTdGF0ZXM6ICVkXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTc4CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgICBUb3RhbCBTdGF0ZXM6ICVkXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTgxCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgICBQc3RhdGUtUGIlZDogJWx1TUh6IChib29zdCBzdGF0ZSlcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgIFBzdGF0ZS1QJWQ6ICAlbHVNSHpcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyMTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBubyBvciB1bmtub3duIGNwdWZyZXEgZHJpdmVyIGlzIGFjdGl2ZSBvbiB0aGlzIENQVVxuIgorbXNnc3RyICIgIHBybyB0ZW50byBDUFUgbmVuw60gYWt0aXZuw60gxb7DoWRuw70gem7DoW3DvSBvdmxhZGHEjSBjcHVmcmVxXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjIxMworIywgYy1mb3JtYXQKK21zZ2lkICIgIGRyaXZlcjogJXNcbiIKK21zZ3N0ciAiICBvdmxhZGHEjTogJXNcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjE5CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIgIENQVXMgd2hpY2ggcnVuIGF0IHRoZSBzYW1lIGhhcmR3YXJlIGZyZXF1ZW5jeTogIgorbXNnc3RyICIgIENQVSwga3RlcsOpIG11c8OtIG3Em25pdCBmcmVrdmVuY2kgesOhcm92ZcWIOiAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjIzMAorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiICBDUFVzIHdoaWNoIG5lZWQgdG8gaGF2ZSB0aGVpciBmcmVxdWVuY3kgY29vcmRpbmF0ZWQgYnkgc29mdHdhcmU6ICIKK21zZ3N0ciAiICBDUFUsIGt0ZXLDqSBtdXPDrSBtxJtuaXQgZnJla3ZlbmNpIHrDoXJvdmXFiDogIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyNDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBtYXhpbXVtIHRyYW5zaXRpb24gbGF0ZW5jeTogIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjI0NworIywgYy1mb3JtYXQKK21zZ2lkICIgIGhhcmR3YXJlIGxpbWl0czogIgorbXNnc3RyICIgIGhhcmR3YXJvdsOpIG1lemU6ICIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjU2CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgYXZhaWxhYmxlIGZyZXF1ZW5jeSBzdGVwczogIgorbXNnc3RyICIgIGRvc3R1cG7DqSBmcmVrdmVuY2U6ICIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjY5CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgYXZhaWxhYmxlIGNwdWZyZXEgZ292ZXJub3JzOiAiCittc2dzdHIgIiAgZG9zdHVwbsOpIHJlZ3Vsw6F0b3J5OiAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjI4MAorIywgYy1mb3JtYXQKK21zZ2lkICIgIGN1cnJlbnQgcG9saWN5OiBmcmVxdWVuY3kgc2hvdWxkIGJlIHdpdGhpbiAiCittc2dzdHIgIiAgc291xI1hc27DoSB0YWt0aWthOiBmcmVrdmVuY2UgYnkgbcSbbGEgYsO9dCBtZXppICIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjgyCisjLCBjLWZvcm1hdAorbXNnaWQgIiBhbmQgIgorbXNnc3RyICIgYSAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjI4NgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiVGhlIGdvdmVybm9yIFwiJXNcIiBtYXkgZGVjaWRlIHdoaWNoIHNwZWVkIHRvIHVzZVxuIgorIiAgICAgICAgICAgICAgICAgIHdpdGhpbiB0aGlzIHJhbmdlLlxuIgorbXNnc3RyICIiCisiICBSZWd1bMOhdG9yIFwiJXNcIiBtxa/FvmUgcm96aG9kbm91dCBqYWtvdSBmcmVrdmVuY2kgcG91xb7DrXRcbiIKKyIgICAgICAgICAgICAgICAgICAgIHYgdMSbY2h0byBtZXrDrWNoLlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyOTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBjdXJyZW50IENQVSBmcmVxdWVuY3kgaXMgIgorbXNnc3RyICIgIHNvdcSNYXNuw6EgZnJla3ZlbmNlIENQVSBqZSAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjI5NgorIywgYy1mb3JtYXQKK21zZ2lkICIgKGFzc2VydGVkIGJ5IGNhbGwgdG8gaGFyZHdhcmUpIgorbXNnc3RyICIgICh6amnFoXTEm25vIGhhcmR3YXJvdsO9bSB2b2zDoW7DrW0pIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzozMDQKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBjcHVmcmVxIHN0YXRzOiAiCittc2dzdHIgIiAgc3RhdGlzdGlrYSBjcHVmcmVxOiAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ3MgorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiVXNhZ2U6IGNwdXBvd2VyIGZyZXFpbmZvIFtvcHRpb25zXVxuIgorbXNnc3RyICJVxb5pdMOtOiBjcHVmcmVxLWluZm8gW3DFmWVww61uYcSNZV1cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDczIHV0aWxzL2NwdWZyZXEtc2V0LmM6MjYgdXRpbHMvY3B1cG93ZXItc2V0LmM6MjMKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoyMiB1dGlscy9jcHVpZGxlLWluZm8uYzoxNDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiT3B0aW9uczpcbiIKK21zZ3N0ciAiUMWZZXDDrW5hxI1lOlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0NzQKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiAgLWUsIC0tZGVidWcgICAgICAgICAgUHJpbnRzIG91dCBkZWJ1ZyBpbmZvcm1hdGlvbiBbZGVmYXVsdF1cbiIKK21zZ3N0ciAiICAtZSwgLS1kZWJ1ZyAgICAgICAgICBWeXDDrcWhZSBsYWRpY8OtIGluZm9ybWFjZVxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0NzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLWYsIC0tZnJlcSAgICAgICAgICAgR2V0IGZyZXF1ZW5jeSB0aGUgQ1BVIGN1cnJlbnRseSBydW5zIGF0LCBhY2NvcmRpbmdcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBjcHVmcmVxIGNvcmUgKlxuIgorbXNnc3RyICIiCisiICAtZiwgLS1mcmVxICAgICAgICAgICBaamlzdMOtIGFrdHXDoWxuw60gZnJla3ZlbmNpLCBuYSBrdGVyw6kgQ1BVIGLEm8W+w61cbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIHBvZGxlIGNwdWZyZXEgKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0NzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLXcsIC0taHdmcmVxICAgICAgICAgR2V0IGZyZXF1ZW5jeSB0aGUgQ1BVIGN1cnJlbnRseSBydW5zIGF0LCBieSByZWFkaW5nXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBpdCBmcm9tIGhhcmR3YXJlIChvbmx5IGF2YWlsYWJsZSB0byByb290KSAqXG4iCittc2dzdHIgIiIKKyIgIC13LCAtLWh3ZnJlcSAgICAgICAgIFpqaXN0w60gYWt0dcOhbG7DrSBmcmVrdmVuY2ksIG5hIGt0ZXLDqSBDUFUgYsSbxb7DrVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgeiBoYXJkd2FyZSAoZG9zdHVwbsOpIGplbiB1xb5pdmF0ZWxpIHJvb3QpICpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDc5CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1sLCAtLWh3bGltaXRzICAgICAgIERldGVybWluZSB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBDUFUgZnJlcXVlbmN5ICIKKyJhbGxvd2VkICpcbiIKK21zZ3N0ciAiIgorIiAgLWwsIC0taHdsaW1pdHMgICAgICAgWmppc3TDrSBtaW5pbcOhbG7DrSBhIG1heGltw6FsbsOtIGRvc3R1cG5vdSBmcmVrdmVuY2kgQ1BVICIKKyIqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4MAorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1kLCAtLWRyaXZlciAgICAgICAgIERldGVybWluZXMgdGhlIHVzZWQgY3B1ZnJlcSBrZXJuZWwgZHJpdmVyICpcbiIKK21zZ3N0ciAiICAtZCwgLS1kcml2ZXIgICAgICAgICBaamlzdMOtIGFrdGl2bsOtIG92bGFkYcSNIGNwdWZyZXEgKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtcCwgLS1wb2xpY3kgICAgICAgICBHZXRzIHRoZSBjdXJyZW50bHkgdXNlZCBjcHVmcmVxIHBvbGljeSAqXG4iCittc2dzdHIgIiAgLXAsIC0tcG9saWN5ICAgICAgICAgWmppc3TDrSBha3R1w6FsbsOtIHRha3Rpa3UgY3B1ZnJlcSAqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4MgorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1nLCAtLWdvdmVybm9ycyAgICAgIERldGVybWluZXMgYXZhaWxhYmxlIGNwdWZyZXEgZ292ZXJub3JzICpcbiIKK21zZ3N0ciAiICAtZywgLS1nb3Zlcm5vcnMgICAgICBaamlzdMOtIGRvc3R1cG7DqSByZWd1bMOhdG9yeSBjcHVmcmVxICpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDgzCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtciwgLS1yZWxhdGVkLWNwdXMgICBEZXRlcm1pbmVzIHdoaWNoIENQVXMgcnVuIGF0IHRoZSBzYW1lIGhhcmR3YXJlICIKKyJmcmVxdWVuY3kgKlxuIgorbXNnc3RyICIiCisiICAtYSwgLS1hZmZlY3RlZC1jcHVzICBaamlzdMOtLCBrdGVyw6kgQ1BVIG11c8OtIG3Em25pdCBmcmVrdmVuY2kgesOhcm92ZcWIICpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDg0CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtYSwgLS1hZmZlY3RlZC1jcHVzICBEZXRlcm1pbmVzIHdoaWNoIENQVXMgbmVlZCB0byBoYXZlIHRoZWlyIGZyZXF1ZW5jeVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZWQgYnkgc29mdHdhcmUgKlxuIgorbXNnc3RyICIiCisiICAtYSwgLS1hZmZlY3RlZC1jcHVzICBaamlzdMOtLCBrdGVyw6kgQ1BVIG11c8OtIG3Em25pdCBmcmVrdmVuY2kgesOhcm92ZcWIICpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDg2CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgLXMsIC0tc3RhdHMgICAgICAgICAgU2hvd3MgY3B1ZnJlcSBzdGF0aXN0aWNzIGlmIGF2YWlsYWJsZVxuIgorbXNnc3RyICIgIC1zLCAtLXN0YXRzICAgICAgICAgIFpvYnJhesOtIHN0YXRpc3Rpa3UgY3B1ZnJlcSwgamUtbGkgZG9zdHVwbsOhXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4NworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLXksIC0tbGF0ZW5jeSAgICAgICAgRGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBsYXRlbmN5IG9uIENQVSBmcmVxdWVuY3kgIgorImNoYW5nZXMgKlxuIgorbXNnc3RyICIiCisiICAtbCwgLS1od2xpbWl0cyAgICAgICBaamlzdMOtIG1pbmltw6FsbsOtIGEgbWF4aW3DoWxuw60gZG9zdHVwbm91IGZyZWt2ZW5jaSBDUFUgIgorIipcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDg4CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgLWIsIC0tYm9vc3QgICAgICAgICAgQ2hlY2tzIGZvciB0dXJibyBvciBib29zdCBtb2RlcyAgKlxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4OQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtbywgLS1wcm9jICAgICAgICAgICBQcmludHMgb3V0IGluZm9ybWF0aW9uIGxpa2UgcHJvdmlkZWQgYnkgdGhlIC9wcm9jLyIKKyJjcHVmcmVxXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UgaW4gMi40LiBhbmQgZWFybHkgMi42LiBrZXJuZWxzXG4iCittc2dzdHIgIiIKKyIgIC1vLCAtLXByb2MgICAgICAgICAgIFZ5cMOtxaFlIGluZm9ybWFjZSB2ZSBmb3Jtw6F0dSwgamFrw70gcG91xb7DrXZhbG8gcm96aHJhbsOtXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAvcHJvYy9jcHVmcmVxIHYga2VybmVsZWNoIMWZYWR5IDIuNCBhIMSNYXNuw6kgMi42XG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ5MQorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLW0sIC0taHVtYW4gICAgICAgICAgaHVtYW4tcmVhZGFibGUgb3V0cHV0IGZvciB0aGUgLWYsIC13LCAtcyBhbmQgLXkgIgorInBhcmFtZXRlcnNcbiIKK21zZ3N0ciAiIgorIiAgLW0sIC0taHVtYW4gICAgICAgICAgVsO9c3R1cCBwYXJhbWV0csWvIC1mLCAtdyBhIC1zIHYg4oCebGlkbWkgxI1pdGVsbsOpbeKAnCAiCisiZm9ybcOhdHVcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDkyIHV0aWxzL2NwdWlkbGUtaW5mby5jOjE1MgorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1oLCAtLWhlbHAgICAgICAgICAgIFByaW50cyBvdXQgdGhpcyBzY3JlZW5cbiIKK21zZ3N0ciAiICAtaCwgLS1oZWxwICAgICAgICAgICBWeXDDrcWhZSB0dXRvIG7DoXBvdsSbZHVcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDk1CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJJZiBubyBhcmd1bWVudCBvciBvbmx5IHRoZSAtYywgLS1jcHUgcGFyYW1ldGVyIGlzIGdpdmVuLCBkZWJ1ZyBvdXRwdXQgYWJvdXRcbiIKKyJjcHVmcmVxIGlzIHByaW50ZWQgd2hpY2ggaXMgdXNlZnVsIGUuZy4gZm9yIHJlcG9ydGluZyBidWdzLlxuIgorbXNnc3RyICIiCisiTmVuw60tbGkgemFkw6FuIMW+w6FkbsO9IHBhcmFtZXRyIG5lYm8gamUtbGkgemFkw6FuIHBvdXplIHDFmWVww61uYcSNIC1jLCAtLWNwdSwgIgorImpzb3VcbiIKKyJ2eXBzw6FueSBsYWRpY8OtIGluZm9ybWFjZSwgY2/FviBtxa/FvmUgYsO9dCB1xb5pdGXEjW7DqSBuYXDFmcOta2xhZCBwxZlpIGhsw6HFoWVuw60gY2h5Yi5cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDk3CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGb3IgdGhlIGFyZ3VtZW50cyBtYXJrZWQgd2l0aCAqLCBvbWl0dGluZyB0aGUgLWMgb3IgLS1jcHUgYXJndW1lbnQgaXNcbiIKKyJlcXVpdmFsZW50IHRvIHNldHRpbmcgaXQgdG8gemVyb1xuIgorbXNnc3RyICIiCisiTmVuw60tbGkgcMWZaSBwb3XFvml0w60gcMWZZXDDrW5hxI3FryBvem5hxI1lbsO9Y2ggKiB6YWTDoW4gcGFyYW1ldHIgLWMgbmVibyAtLWNwdSxcbiIKKyJwxZllZHBva2zDoWTDoSBzZSBqZWhvIGhvZG5vdGEgMC5cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NTgwCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJUaGUgYXJndW1lbnQgcGFzc2VkIHRvIHRoaXMgdG9vbCBjYW4ndCBiZSBjb21iaW5lZCB3aXRoIHBhc3NpbmcgYSAtLWNwdSAiCisiYXJndW1lbnRcbiIKK21zZ3N0ciAiWmFkYW7DvSBwYXJhbWV0ciBuZW3Fr8W+ZSBiw710IHBvdcW+aXQgesOhcm92ZcWIIHMgcMWZZXDDrW5hxI1lbSAtYyBuZWJvIC0tY3B1XG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjU5NgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiWW91IGNhbid0IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSAtLWNwdSBwYXJhbWV0ZXIgYW5kL29yXG4iCisibW9yZSB0aGFuIG9uZSBvdXRwdXQtc3BlY2lmaWMgYXJndW1lbnRcbiIKK21zZ3N0ciAiIgorIk5lbHplIHphZGF0IHbDrWNlIG5lxb4gamVkZW4gcGFyYW1ldHIgLWMgbmVibyAtLWNwdVxuIgorImFuZWJvIHbDrWNlIG5lxb4gamVkZW4gcGFyYW1ldHIgdXLEjXVqw61jw60gdsO9c3R1cFxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo2MDAgdXRpbHMvY3B1ZnJlcS1zZXQuYzo4MiB1dGlscy9jcHVwb3dlci1zZXQuYzo0MgorIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjQyIHV0aWxzL2NwdWlkbGUtaW5mby5jOjIxMworIywgYy1mb3JtYXQKK21zZ2lkICJpbnZhbGlkIG9yIHVua25vd24gYXJndW1lbnRcbiIKK21zZ3N0ciAibmVwbGF0bsO9IG5lYm8gbmV6bsOhbcO9IHBhcmFtZXRyXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjYxNworIywgYy1mb3JtYXQKK21zZ2lkICJjb3VsZG4ndCBhbmFseXplIENQVSAlZCBhcyBpdCBkb2Vzbid0IHNlZW0gdG8gYmUgcHJlc2VudFxuIgorbXNnc3RyICJuZWx6ZSBhbmFseXpvdmF0IENQVSAlZCwgdnlwYWTDoSB0bywgxb5lIG5lbsOtIHDFmcOtdG9tZW5cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NjIwIHV0aWxzL2NwdXBvd2VyLWluZm8uYzoxNDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiYW5hbHl6aW5nIENQVSAlZDpcbiIKK21zZ3N0ciAiYW5hbHl6dWppIENQVSAlZDpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzoyNQorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiVXNhZ2U6IGNwdXBvd2VyIGZyZXF1ZW5jeS1zZXQgW29wdGlvbnNdXG4iCittc2dzdHIgIlXFvml0w606IGNwdWZyZXEtc2V0IFtwxZllcMOtbmHEjWVdXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLWQgRlJFUSwgLS1taW4gRlJFUSAgICAgIG5ldyBtaW5pbXVtIENQVSBmcmVxdWVuY3kgdGhlIGdvdmVybm9yIG1heSAiCisic2VsZWN0XG4iCittc2dzdHIgIiIKKyIgIC1kIEZSRVEsIC0tbWluIEZSRVEgICAgICBOb3bDoSBuZWpuacW+xaHDrSBmcmVrdmVuY2UsIGt0ZXJvdSBtxa/FvmUgcmVndWzDoXRvciAiCisidnlicmF0XG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLXUgRlJFUSwgLS1tYXggRlJFUSAgICAgIG5ldyBtYXhpbXVtIENQVSBmcmVxdWVuY3kgdGhlIGdvdmVybm9yIG1heSAiCisic2VsZWN0XG4iCittc2dzdHIgIiIKKyIgIC11IEZSRVEsIC0tbWF4IEZSRVEgICAgICBOb3bDoSBuZWp2ecWhxaHDrSBmcmVrdmVuY2UsIGt0ZXJvdSBtxa/FvmUgcmVndWzDoXRvciAiCisienZvbGl0XG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtZyBHT1YsIC0tZ292ZXJub3IgR09WICAgbmV3IGNwdWZyZXEgZ292ZXJub3JcbiIKK21zZ3N0ciAiICAtZyBHT1YsIC0tZ292ZXJub3JzIEdPViAgTm92w70gcmVndWzDoXRvciBjcHVmcmVxXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLWYgRlJFUSwgLS1mcmVxIEZSRVEgICAgIHNwZWNpZmljIGZyZXF1ZW5jeSB0byBiZSBzZXQuIFJlcXVpcmVzIHVzZXJzcGFjZVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdmVybm9yIHRvIGJlIGF2YWlsYWJsZSBhbmQgbG9hZGVkXG4iCittc2dzdHIgIiIKKyIgIC1mIEZSRVEsIC0tZnJlcSBGUkVRICAgICBGcmVrdmVuY2UsIGt0ZXLDoSBtw6EgYsO9dCBuYXN0YXZlbmEuIFZ5xb5hZHVqZSwgYWJ5ICIKKyJieWxcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICB2IGrDoWTFmWUgbmFocsOhbiByZWd1bMOhdG9yIOKAmnVzZXJzcGFjZeKAmC5cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzozMgorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1yLCAtLXJlbGF0ZWQgICAgICAgICAgICBTd2l0Y2hlcyBhbGwgaGFyZHdhcmUtcmVsYXRlZCBDUFVzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzozMyB1dGlscy9jcHVwb3dlci1zZXQuYzoyOCB1dGlscy9jcHVwb3dlci1pbmZvLmM6MjcKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiAgLWgsIC0taGVscCAgICAgICAgICAgICAgIFByaW50cyBvdXQgdGhpcyBzY3JlZW5cbiIKK21zZ3N0ciAiICAtaCwgLS1oZWxwICAgICAgICAgICBWeXDDrcWhZSB0dXRvIG7DoXBvdsSbZHVcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzozNQorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiIgorIk5vdGVzOlxuIgorIjEuIE9taXR0aW5nIHRoZSAtYyBvciAtLWNwdSBhcmd1bWVudCBpcyBlcXVpdmFsZW50IHRvIHNldHRpbmcgaXQgdG8gXCJhbGxcIlxuIgorbXNnc3RyICIiCisiTmVuw60tbGkgcMWZaSBwb3XFvml0w60gcMWZZXDDrW5hxI3FryBvem5hxI1lbsO9Y2ggKiB6YWTDoW4gcGFyYW1ldHIgLWMgbmVibyAtLWNwdSxcbiIKKyJwxZllZHBva2zDoWTDoSBzZSBqZWhvIGhvZG5vdGEgMC5cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzozNworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiIgorIjIuIFRoZSAtZiBGUkVRLCAtLWZyZXEgRlJFUSBwYXJhbWV0ZXIgY2Fubm90IGJlIGNvbWJpbmVkIHdpdGggYW55IG90aGVyICIKKyJwYXJhbWV0ZXJcbiIKKyIgICBleGNlcHQgdGhlIC1jIENQVSwgLS1jcHUgQ1BVIHBhcmFtZXRlclxuIgorIjMuIEZSRVF1ZW5jaWVzIGNhbiBiZSBwYXNzZWQgaW4gSHosIGtIeiAoZGVmYXVsdCksIE1IeiwgR0h6LCBvciBUSHpcbiIKKyIgICBieSBwb3N0Zml4aW5nIHRoZSB2YWx1ZSB3aXRoIHRoZSB3YW50ZWQgdW5pdCBuYW1lLCB3aXRob3V0IGFueSBzcGFjZVxuIgorIiAgIChGUkVRdWVuY3kgaW4ga0h6ID1eIEh6ICogMC4wMDEgPV4gTUh6ICogMTAwMCA9XiBHSHogKiAxMDAwMDAwKS5cbiIKK21zZ3N0ciAiIgorIlBvem7DoW1reTpcbiIKKyIxLiBWeW5lY2jDoW7DrSBwYXJhbWV0cnUgLWMgbmVibyAtLWNwdSBqZSBla3ZpdmFsZW50bsOtIGplaG8gbmFzdGF2ZW7DrSBuYSAwXG4iCisiMi4gUMWZZXDDrW5hxI0gLWYgbmVibyAtLWZyZXEgbmVtxa/FvmUgYsO9dCBwb3XFvml0IHrDoXJvdmXFiCBzIMW+w6FkbsO9bSBqaW7DvW0gdnlqbWEgLSIKKyJjXG4iCisiICAgbmVibyAtLWNwdVxuIgorIjMuIEZyZWt2ZW5jZSAoRlJFUSkgbW9ob3UgYsO9dCB6YWTDoW55IHYgSHosIGtIeiAodsO9Y2hvesOtKSwgTUh6LCBHSHogbmVibyBUSHpcbiIKKyIgICBwxZlpcG9qZW7DrW0gbsOhenZ1IGplZG5vdGt5IGJleiBtZXplcnkgbWV6aSDEjcOtc2xlbSBhIGplZG5vdGtvdVxuIgorIiAgIChGUkVRIHYga0h6ID1eIEh6ICogMCwwMDEgPSBeIE1IeiAqIDEwMDAgPV4gR0h6ICogMTAwMDAwMClcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzo1NworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3Igc2V0dGluZyBuZXcgdmFsdWVzLiBDb21tb24gZXJyb3JzOlxuIgorIi0gRG8geW91IGhhdmUgcHJvcGVyIGFkbWluaXN0cmF0aW9uIHJpZ2h0cz8gKHN1cGVyLXVzZXI/KVxuIgorIi0gSXMgdGhlIGdvdmVybm9yIHlvdSByZXF1ZXN0ZWQgYXZhaWxhYmxlIGFuZCBtb2Rwcm9iZWQ/XG4iCisiLSBUcnlpbmcgdG8gc2V0IGFuIGludmFsaWQgcG9saWN5P1xuIgorIi0gVHJ5aW5nIHRvIHNldCBhIHNwZWNpZmljIGZyZXF1ZW5jeSwgYnV0IHVzZXJzcGFjZSBnb3Zlcm5vciBpcyBub3QgIgorImF2YWlsYWJsZSxcbiIKKyIgICBmb3IgZXhhbXBsZSBiZWNhdXNlIG9mIGhhcmR3YXJlIHdoaWNoIGNhbm5vdCBiZSBzZXQgdG8gYSBzcGVjaWZpYyAiCisiZnJlcXVlbmN5XG4iCisiICAgb3IgYmVjYXVzZSB0aGUgdXNlcnNwYWNlIGdvdmVybm9yIGlzbid0IGxvYWRlZD9cbiIKK21zZ3N0ciAiIgorIkNoeWJhIHDFmWkgbmFzdGF2b3bDoW7DrSBub3bDvWNoIGhvZG5vdC4gT2J2eWtsw6kgcHJvYmzDqW15OlxuIgorIi0gTcOhdGUgcGF0xZlpxI1uw6EgYWRtaW5pc3Ryw6F0b3Jza8OhIHByw6F2YT8gKHJvb3Q/KVxuIgorIi0gSmUgcG/FvmFkb3ZhbsO9IHJlZ3Vsw6F0b3IgZG9zdHVwbsO9IHYgasOhZMWZZT8gKG1vZHByb2JlPylcbiIKKyItIFNuYcW+w610ZSBzZSBuYXN0YXZpdCBuZXBsYXRub3UgdGFrdGlrdT9cbiIKKyItIFNuYcW+w610ZSBzZSBuYXN0YXZpdCB1csSNaXRvdSBmcmVrdmVuY2ksIGFsZSBuZW7DrSBkb3N0dXBuw71cbiIKKyIgIHJlZ3Vsw6F0b3Ig4oCadXNlcnNwYWNl4oCYLCBuYXDFmcOta2xhZCBwcm90b8W+ZSBuZW7DrSBuYWhyw6FuIHYgasOhZMWZZSxcbiIKKyIgIG5lYm8gbmVsemUgbmEgdG9tdG8gaGFyZHdhcmUgbmFzdGF2aXQgdXLEjWl0b3UgZnJla3ZlbmNpP1xuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjE3MAorIywgYy1mb3JtYXQKK21zZ2lkICJ3cm9uZywgdW5rbm93biBvciB1bmhhbmRsZWQgQ1BVP1xuIgorbXNnc3RyICJuZXpuw6Ftw70gbmVibyBuZXBvZHBvcm92YW7DvSBDUFU/XG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzAyCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJ0aGUgLWYvLS1mcmVxIHBhcmFtZXRlciBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCAtZC8tLW1pbiwgLXUvLS1tYXggb3JcbiIKKyItZy8tLWdvdmVybm9yIHBhcmFtZXRlcnNcbiIKK21zZ3N0ciAiIgorInDFmWVww61uYcSNIC1mLy0tZnJlcSBuZW3Fr8W+ZSBiw710IHBvdcW+aXQgesOhcm92ZcWIXG4iCisicyBwxZllcMOtbmHEjWVtIC1kLy0tbWluLCAtdS8tLW1heCBuZWJvIC1nLy0tZ292ZXJub3JcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzozMDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgb3V0IG9mIC1mLy0tZnJlcSwgLWQvLS1taW4sIC11Ly0tbWF4LCBhbmRcbiIKKyItZy8tLWdvdmVybm9yIG11c3QgYmUgcGFzc2VkXG4iCittc2dzdHIgIiIKKyJNdXPDrSBiw710IHphZMOhbiBhbGVzcG/FiCBqZWRlbiBwxZllcMOtbmHEjVxuIgorIi1mLy0tZnJlcSwgLWQvLS1taW4sIC11Ly0tbWF4IG5lYm8gLWcvLS1nb3Zlcm5vclxuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjM0NworIywgYy1mb3JtYXQKK21zZ2lkICJTZXR0aW5nIGNwdTogJWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzoyMgorIywgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogY3B1cG93ZXIgc2V0IFsgLWIgdmFsIF0gWyAtbSB2YWwgXSBbIC1zIHZhbCBdXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6MjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLWIsIC0tcGVyZi1iaWFzIFtWQUxdICAgIFNldHMgQ1BVJ3MgcG93ZXIgdnMgcGVyZm9ybWFuY2UgcG9saWN5IG9uIHNvbWVcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBtb2RlbHMgWzAtMTVdLCBzZWUgbWFucGFnZSBmb3IgZGV0YWlsc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjI2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1tLCAtLXNjaGVkLW1jICBbVkFMXSAgICBTZXRzIHRoZSBrZXJuZWwncyBtdWx0aSBjb3JlIHNjaGVkdWxlciBwb2xpY3kuXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6MjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLXMsIC0tc2NoZWQtc210IFtWQUxdICAgIFNldHMgdGhlIGtlcm5lbCdzIHRocmVhZCBzaWJsaW5nIHNjaGVkdWxlciAiCisicG9saWN5LlxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjgwCisjLCBjLWZvcm1hdAorbXNnaWQgIi0tcGVyZi1iaWFzIHBhcmFtIG91dCBvZiByYW5nZSBbMC0lZF1cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzo5MQorIywgYy1mb3JtYXQKK21zZ2lkICItLXNjaGVkLW1jIHBhcmFtIG91dCBvZiByYW5nZSBbMC0lZF1cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzoxMDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiLS1zY2hlZC1zbXQgcGFyYW0gb3V0IG9mIHJhbmdlIFswLSVkXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjEyMQorIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBzZXR0aW5nIHNjaGVkLW1jICVzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6MTI3CisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHNldHRpbmcgc2NoZWQtc210ICVzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6MTQ2CisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHNldHRpbmcgcGVyZi1iaWFzIHZhbHVlIG9uIENQVSAlZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoyMQorIywgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogY3B1cG93ZXIgaW5mbyBbIC1iIF0gWyAtbSBdIFsgLXMgXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoyMworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtYiwgLS1wZXJmLWJpYXMgICAgR2V0cyBDUFUncyBwb3dlciB2cyBwZXJmb3JtYW5jZSBwb2xpY3kgb24gc29tZVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIG1vZGVscyBbMC0xNV0sIHNlZSBtYW5wYWdlIGZvciBkZXRhaWxzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjI1CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIgIC1tLCAtLXNjaGVkLW1jICAgICBHZXRzIHRoZSBrZXJuZWwncyBtdWx0aSBjb3JlIHNjaGVkdWxlciBwb2xpY3kuXG4iCittc2dzdHIgIiAgLXAsIC0tcG9saWN5ICAgICAgICAgWmppc3TDrSBha3R1w6FsbsOtIHRha3Rpa3UgY3B1ZnJlcSAqXG4iCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoyNgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtcywgLS1zY2hlZC1zbXQgICAgR2V0cyB0aGUga2VybmVsJ3MgdGhyZWFkIHNpYmxpbmcgc2NoZWR1bGVyIHBvbGljeS5cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIlBhc3Npbmcgbm8gb3B0aW9uIHdpbGwgc2hvdyBhbGwgaW5mbywgYnkgZGVmYXVsdCBvbmx5IG9uIGNvcmUgMFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoxMDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiU3lzdGVtJ3MgbXVsdGkgY29yZSBzY2hlZHVsZXIgc2V0dGluZzogIgorbXNnc3RyICIiCisKKyMuIGlmIHN5c2ZzIGZpbGUgaXMgbWlzc2luZyBpdCdzOiBlcnJubyA9PSBFTk9FTlQKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoxMDUgdXRpbHMvY3B1cG93ZXItaW5mby5jOjExNAorIywgYy1mb3JtYXQKK21zZ2lkICJub3Qgc3VwcG9ydGVkXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjExMQorIywgYy1mb3JtYXQKK21zZ2lkICJTeXN0ZW0ncyB0aHJlYWQgc2libGluZyBzY2hlZHVsZXIgc2V0dGluZzogIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoxMjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiSW50ZWwncyBwZXJmb3JtYW5jZSBiaWFzIHNldHRpbmcgbmVlZHMgcm9vdCBwcml2aWxlZ2VzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjEyOAorIywgYy1mb3JtYXQKK21zZ2lkICJTeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBJbnRlbCdzIHBlcmZvcm1hbmNlIGJpYXMgc2V0dGluZ1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoxNDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IHJlYWQgcGVyZi1iaWFzIHZhbHVlXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjE1MAorIywgYy1mb3JtYXQKK21zZ2lkICJwZXJmLWJpYXM6ICVkXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MjgKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkFuYWx5emluZyBDUFUgJWQ6XG4iCittc2dzdHIgImFuYWx5enVqaSBDUFUgJWQ6XG4iCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjMyCisjLCBjLWZvcm1hdAorbXNnaWQgIkNQVSAldTogTm8gaWRsZSBzdGF0ZXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzozNgorIywgYy1mb3JtYXQKK21zZ2lkICJDUFUgJXU6IENhbid0IHJlYWQgaWRsZSBzdGF0ZSBpbmZvXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6NDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGRldGVybWluZSBtYXggaWRsZSBzdGF0ZSAldVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjQ2CisjLCBjLWZvcm1hdAorbXNnaWQgIk51bWJlciBvZiBpZGxlIHN0YXRlczogJWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo0OAorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQXZhaWxhYmxlIGlkbGUgc3RhdGVzOiIKK21zZ3N0ciAiICBkb3N0dXBuw6kgZnJla3ZlbmNlOiAiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjcxCisjLCBjLWZvcm1hdAorbXNnaWQgIkZsYWdzL0Rlc2NyaXB0aW9uOiAlc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjc0CisjLCBjLWZvcm1hdAorbXNnaWQgIkxhdGVuY3k6ICVsdVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjc2CisjLCBjLWZvcm1hdAorbXNnaWQgIlVzYWdlOiAlbHVcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo3OAorIywgYy1mb3JtYXQKK21zZ2lkICJEdXJhdGlvbjogJWxsdVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjkwCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkZXRlcm1pbmUgY3B1aWRsZSBkcml2ZXJcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo5NAorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ1BVaWRsZSBkcml2ZXI6ICVzXG4iCittc2dzdHIgIiAgb3ZsYWRhxI06ICVzXG4iCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjk5CisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkZXRlcm1pbmUgY3B1aWRsZSBnb3Zlcm5vclxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEwMworIywgYy1mb3JtYXQKK21zZ2lkICJDUFVpZGxlIGdvdmVybm9yOiAlc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEyMgorIywgYy1mb3JtYXQKK21zZ2lkICJDUFUgJXU6IENhbid0IHJlYWQgQy1zdGF0ZSBpbmZvXG4iCittc2dzdHIgIiIKKworIy4gcHJpbnRmKCJDc3RhdGVzOiAlZFxuIiwgY3N0YXRlcyk7CisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiYWN0aXZlIHN0YXRlOiAgICAgICAgICAgIEMwXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTI4CisjLCBjLWZvcm1hdAorbXNnaWQgIm1heF9jc3RhdGU6ICAgICAgICAgICAgICBDJXVcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMjkKKyMsIGMtZm9ybWF0Cittc2dpZCAibWF4aW11bSBhbGxvd2VkIGxhdGVuY3k6ICVsdSB1c2VjXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTMwCisjLCBjLWZvcm1hdAorbXNnaWQgInN0YXRlczpcdFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEzMgorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgQyVkOiAgICAgICAgICAgICAgICAgIHR5cGVbQyVkXSAiCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTM0CisjLCBjLWZvcm1hdAorbXNnaWQgInByb21vdGlvblstLV0gZGVtb3Rpb25bLS1dICIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMzUKKyMsIGMtZm9ybWF0Cittc2dpZCAibGF0ZW5jeVslMDNsdV0gIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEzNworIywgYy1mb3JtYXQKK21zZ2lkICJ1c2FnZVslMDhsdV0gIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEzOQorIywgYy1mb3JtYXQKK21zZ2lkICJkdXJhdGlvblslMDIwTHVdIFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjE0NworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiVXNhZ2U6IGNwdXBvd2VyIGlkbGVpbmZvIFtvcHRpb25zXVxuIgorbXNnc3RyICJVxb5pdMOtOiBjcHVmcmVxLWluZm8gW3DFmWVww61uYcSNZV1cbiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTQ5CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIgIC1zLCAtLXNpbGVudCAgICAgICAgIE9ubHkgc2hvdyBnZW5lcmFsIEMtc3RhdGUgaW5mb3JtYXRpb25cbiIKK21zZ3N0ciAiICAtZSwgLS1kZWJ1ZyAgICAgICAgICBWeXDDrcWhZSBsYWRpY8OtIGluZm9ybWFjZVxuIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxNTAKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1vLCAtLXByb2MgICAgICAgICAgIFByaW50cyBvdXQgaW5mb3JtYXRpb24gbGlrZSBwcm92aWRlZCBieSB0aGUgL3Byb2MvIgorImFjcGkvcHJvY2Vzc29yLyovcG93ZXJcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZSBpbiBvbGRlciBrZXJuZWxzXG4iCittc2dzdHIgIiIKKyIgIC1vLCAtLXByb2MgICAgICAgICAgIFZ5cMOtxaFlIGluZm9ybWFjZSB2ZSBmb3Jtw6F0dSwgamFrw70gcG91xb7DrXZhbG8gcm96aHJhbsOtXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAvcHJvYy9jcHVmcmVxIHYga2VybmVsZWNoIMWZYWR5IDIuNCBhIMSNYXNuw6kgMi42XG4iCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjIwOQorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiWW91IGNhbid0IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBvdXRwdXQtc3BlY2lmaWMgYXJndW1lbnRcbiIKK21zZ3N0ciAiIgorIk5lbHplIHphZGF0IHbDrWNlIG5lxb4gamVkZW4gcGFyYW1ldHIgLWMgbmVibyAtLWNwdVxuIgorImFuZWJvIHbDrWNlIG5lxb4gamVkZW4gcGFyYW1ldHIgdXLEjXVqw61jw60gdsO9c3R1cFxuIgorCisjfiBtc2dpZCAiIgorI34gIiAgLWMgQ1BVLCAtLWNwdSBDUFUgICAgQ1BVIG51bWJlciB3aGljaCBpbmZvcm1hdGlvbiBzaGFsbCBiZSBkZXRlcm1pbmVkICIKKyN+ICJhYm91dFxuIgorI34gbXNnc3RyICIiCisjfiAiICAtYyBDUFUsIC0tY3B1IENQVSAgICDEjMOtc2xvIENQVSwgbyBrdGVyw6ltIHNlIG1hasOtIHpqaXN0aXQgaW5mb3JtYWNlXG4iCisKKyN+IG1zZ2lkICIiCisjfiAiICAtYyBDUFUsIC0tY3B1IENQVSAgICAgICAgbnVtYmVyIG9mIENQVSB3aGVyZSBjcHVmcmVxIHNldHRpbmdzIHNoYWxsIGJlICIKKyN+ICJtb2RpZmllZFxuIgorI34gbXNnc3RyICIiCisjfiAiICAtYyBDUFUsIC0tY3B1IENQVSAgICAgICAgxIzDrXNsbyBDUFUgcHJvIGt0ZXLDvSBzZSBtw6EgcHJvdsOpc3QgbmFzdGF2ZW7DrSAiCisjfiAiY3B1ZnJlcVxuIgpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvcG8vZGUucG8gYi90b29scy9wb3dlci9jcHVwb3dlci9wby9kZS5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGMwOWU1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvcG8vZGUucG8KQEAgLTAsMCArMSw5NjEgQEAKKyMgR2VybWFuIHRyYW5zbGF0aW9ucyBmb3IgY3B1ZnJlcXV0aWxzIHBhY2thZ2UKKyMgR2VybWFuIG1lc3NhZ2VzIGZvciBjcHVmcmVxdXRpbHMuCisjIENvcHlyaWdodCAoQykgMjAwNC0yMDA5IERvbWluaWsgQnJvZG93c2tpIDxsaW51eEBkb21pbmlrYnJvZG93c2tpLm5ldD4KKyMgVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBzYW1lIGxpY2Vuc2UgYXMgdGhlIGNwdWZyZXF1dGlscyBwYWNrYWdlLgorIworbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogY3B1ZnJlcXV0aWxzIDAwNlxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBcbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxMS0wMy0wOCAxNzowMyswMTAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAwOS0wOC0wOCAxNzoxOCswMTAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiAgPGxpbnV4QGRvbWluaWticm9kb3dza2kubmV0PlxuIgorIkxhbmd1YWdlLVRlYW06IE5PTkVcbiIKKyJMYW5ndWFnZTogXG4iCisiTUlNRS1WZXJzaW9uOiAxLjBcbiIKKyJDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9SVNPLTg4NTktMVxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKyJQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD0obiAhPSAxKTtcbiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL25obV9pZGxlLmM6MzYKK21zZ2lkICJQcm9jZXNzb3IgQ29yZSBDMyIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvbmhtX2lkbGUuYzo0MworbXNnaWQgIlByb2Nlc3NvciBDb3JlIEM2IgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9uaG1faWRsZS5jOjUxCittc2dpZCAiUHJvY2Vzc29yIFBhY2thZ2UgQzMiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL25obV9pZGxlLmM6NTggdXRpbHMvaWRsZV9tb25pdG9yL2FtZF9mYW0xNGhfaWRsZS5jOjcwCittc2dpZCAiUHJvY2Vzc29yIFBhY2thZ2UgQzYiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL3NuYl9pZGxlLmM6MzMKK21zZ2lkICJQcm9jZXNzb3IgQ29yZSBDNyIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3Ivc25iX2lkbGUuYzo0MAorbXNnaWQgIlByb2Nlc3NvciBQYWNrYWdlIEMyIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9zbmJfaWRsZS5jOjQ3Cittc2dpZCAiUHJvY2Vzc29yIFBhY2thZ2UgQzciCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2FtZF9mYW0xNGhfaWRsZS5jOjU2Cittc2dpZCAiUGFja2FnZSBpbiBzbGVlcCBzdGF0ZSAoUEMxIG9yIGRlZXBlcikiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2FtZF9mYW0xNGhfaWRsZS5jOjYzCittc2dpZCAiUHJvY2Vzc29yIFBhY2thZ2UgQzEiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2FtZF9mYW0xNGhfaWRsZS5jOjc3Cittc2dpZCAiTm9ydGggQnJpZGdlIFAxIGJvb2xlYW4gY291bnRlciAocmV0dXJucyAwIG9yIDEpIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9tcGVyZl9tb25pdG9yLmM6MzUKK21zZ2lkICJQcm9jZXNzb3IgQ29yZSBub3QgaWRsZSIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvbXBlcmZfbW9uaXRvci5jOjQyCittc2dpZCAiUHJvY2Vzc29yIENvcmUgaW4gYW4gaWRsZSBzdGF0ZSIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvbXBlcmZfbW9uaXRvci5jOjUwCittc2dpZCAiQXZlcmFnZSBGcmVxdWVuY3kgKGluY2x1ZGluZyBib29zdCkgaW4gTUh6IgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorImNwdXBvd2VyIG1vbml0b3I6IFstaF0gWyBbLXRdIHwgWy1sXSB8IFstbSA8bW9uMT4sWzxtb24yPl0gXSBdIFstaSAiCisiaW50ZXJ2YWxfc2VjIHwgLWMgY29tbWFuZCAuLi5dXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo2OQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiY3B1cG93ZXIgbW9uaXRvcjogWy12XSBbLWhdIFsgWy10XSB8IFstbF0gfCBbLW0gPG1vbjE+LFs8bW9uMj5dIF0gXSBbLWkgIgorImludGVydmFsX3NlYyB8IC1jIGNvbW1hbmQgLi4uXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiXHQgLXY6IGJlIG1vcmUgdmVyYm9zZVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiXHQgLWg6IHByaW50IHRoaXMgaGVscFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiXHQgLWk6IHRpbWUgaW50ZXJ2YWxsIHRvIG1lYXN1cmUgZm9yIGluIHNlY29uZHMgKGRlZmF1bHQgMSlcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjc1CisjLCBjLWZvcm1hdAorbXNnaWQgIlx0IC10OiBzaG93IENQVSB0b3BvbG9neS9oaWVyYXJjaHlcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjc2CisjLCBjLWZvcm1hdAorbXNnaWQgIlx0IC1sOiBsaXN0IGF2YWlsYWJsZSBDUFUgc2xlZXAgbW9uaXRvcnMgKGZvciB1c2Ugd2l0aCAtbSlcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjc3CisjLCBjLWZvcm1hdAorbXNnaWQgIlx0IC1tOiBzaG93IHNwZWNpZmljIENQVSBzbGVlcCBtb25pdG9ycyBvbmx5IChpbiBzYW1lIG9yZGVyKVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIm9ubHkgb25lIG9mOiAtdCwgLWwsIC1tIGFyZSBhbGxvd2VkXG4iCisiSWYgbm9uZSBvZiB0aGVtIGlzIHBhc3NlZCwiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo4MAorIywgYy1mb3JtYXQKK21zZ2lkICIgYWxsIHN1cHBvcnRlZCBtb25pdG9ycyBhcmUgc2hvd25cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjE5NworIywgYy1mb3JtYXQKK21zZ2lkICJNb25pdG9yICVzLCBDb3VudGVyICVzIGhhcyBubyBjb3VudCBmdW5jdGlvbi4gSW1wbGVtZW50YXRpb24gZXJyb3JcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjIwNworIywgYy1mb3JtYXQKK21zZ2lkICIgKmlzIG9mZmxpbmVcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjIzNgorIywgYy1mb3JtYXQKK21zZ2lkICIlczogbWF4IG1vbml0b3IgbmFtZSBsZW5ndGggKCVkKSBleGNlZWRlZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6MjUwCisjLCBjLWZvcm1hdAorbXNnaWQgIk5vIG1hdGNoaW5nIG1vbml0b3IgZm91bmQgaW4gJXMsIHRyeSAtbCBvcHRpb25cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjI2NgorIywgYy1mb3JtYXQKK21zZ2lkICJNb25pdG9yIFwiJXNcIiAoJWQgc3RhdGVzKSAtIE1pZ2h0IG92ZXJmbG93IGFmdGVyICV1IHNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjMxOQorIywgYy1mb3JtYXQKK21zZ2lkICIlcyB0b29rICUuNWYgc2Vjb25kcyBhbmQgZXhpdGVkIHdpdGggc3RhdHVzICVkXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo0MDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IHJlYWQgbnVtYmVyIG9mIGF2YWlsYWJsZSBwcm9jZXNzb3JzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo0MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiQXZhaWxhYmxlIG1vbml0b3IgJXMgbmVlZHMgcm9vdCBhY2Nlc3NcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjQyOAorIywgYy1mb3JtYXQKK21zZ2lkICJObyBIVyBDc3RhdGUgbW9uaXRvcnMgZm91bmRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjc4CisjLCBjLWZvcm1hdAorbXNnaWQgImNwdXBvd2VyIFsgLWMgY3B1bGlzdCBdIHN1YmNvbW1hbmQgW0FSR1NdXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzo3OQorIywgYy1mb3JtYXQKK21zZ2lkICJjcHVwb3dlciAtLXZlcnNpb25cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjgwCisjLCBjLWZvcm1hdAorbXNnaWQgIlN1cHBvcnRlZCBzdWJjb21tYW5kcyBhcmU6XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzo4MworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiU29tZSBzdWJjb21tYW5kcyBjYW4gbWFrZSB1c2Ugb2YgdGhlIC1jIGNwdWxpc3Qgb3B0aW9uLlxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLmM6ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiTG9vayBhdCB0aGUgZ2VuZXJhbCBjcHVwb3dlciBtYW5wYWdlIGhvdyB0byB1c2UgaXRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjg1CisjLCBjLWZvcm1hdAorbXNnaWQgImFuZCByZWFkIHVwIHRoZSBzdWJjb21tYW5kJ3MgbWFucGFnZSB3aGV0aGVyIGl0IGlzIHN1cHBvcnRlZC5cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjg2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyJVc2UgY3B1cG93ZXIgaGVscCBzdWJjb21tYW5kIGZvciBnZXR0aW5nIGhlbHAgZm9yIGFib3ZlIHN1YmNvbW1hbmRzLlxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLmM6OTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVwb3J0IGVycm9ycyBhbmQgYnVncyB0byAlcywgcGxlYXNlLlxuIgorbXNnc3RyICJCaXR0ZSBtZWxkZW4gU2llIEZlaGxlciBhbiAlcy5cbiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzoxMTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcGFyc2luZyBjcHUgbGlzdFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLmM6MTcyCisjLCBjLWZvcm1hdAorbXNnaWQgIlN1YmNvbW1hbmQgJXMgbmVlZHMgcm9vdCBwcml2aWxlZ2VzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGRuJ3QgY291bnQgdGhlIG51bWJlciBvZiBDUFVzICglczogJXMpLCBhc3N1bWluZyAxXG4iCittc2dzdHIgIiIKKyJLb25udGUgbmljaHQgZGllIEFuemFobCBkZXIgQ1BVcyBoZXJhdXNmaW5kZW4gKCVzIDogJXMpLCBuZWhtZSBkYWhlciAxIGFuLlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo2MworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAgICAgICAgIG1pbmltdW0gQ1BVIGZyZXF1ZW5jeSAgLSAgbWF4aW11bSBDUFUgZnJlcXVlbmN5ICAtICBnb3Zlcm5vclxuIgorbXNnc3RyICIiCisiICAgICAgICAgIG1pbmltYWxlIENQVS1UYWt0ZnJlcS4gLSAgbWF4aW1hbGUgQ1BVLVRha3RmcmVxLiAtICBSZWdsZXIgIFxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxNTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3Igd2hpbGUgZXZhbHVhdGluZyBCb29zdCBDYXBhYmlsaXRpZXMgb24gQ1BVICVkIC0tIGFyZSB5b3Ugcm9vdD9cbiIKK21zZ3N0ciAiIgorCisjLiBQIHN0YXRlIGNoYW5nZXMgdmlhIE1TUiBhcmUgaWRlbnRpZmllZCB2aWEgY3B1aWQgODAwMDAwMDcKKyMuIG9uIEludGVsIGFuZCBBTUQsIGJ1dCB3ZSBhc3N1bWUgYm9vc3QgY2FwYWJsZSBtYWNoaW5lcyBjYW4gZG8gdGhhdAorIy4gaWYgKGNwdWlkX2VheCgweDgwMDAwMDAwKSA+PSAweDgwMDAwMDA3CisjLiAmJiAoY3B1aWRfZWR4KDB4ODAwMDAwMDcpICYgKDEgPDwgNykpKQorIy4KKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE2MQorIywgYy1mb3JtYXQKK21zZ2lkICIgIGJvb3N0IHN0YXRlIHN1cHBvcnQ6IFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE2MworIywgYy1mb3JtYXQKK21zZ2lkICIgICAgU3VwcG9ydGVkOiAlc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE2MyB1dGlscy9jcHVmcmVxLWluZm8uYzoxNjQKK21zZ2lkICJ5ZXMiCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTYzIHV0aWxzL2NwdWZyZXEtaW5mby5jOjE2NAorbXNnaWQgIm5vIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE2NAorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiICAgIEFjdGl2ZTogJXNcbiIKK21zZ3N0ciAiICBUcmVpYmVyOiAlc1xuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxNzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgIEJvb3N0IFN0YXRlczogJWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxNzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgIFRvdGFsIFN0YXRlczogJWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgIFBzdGF0ZS1QYiVkOiAlbHVNSHogKGJvb3N0IHN0YXRlKVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE4NAorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgUHN0YXRlLVAlZDogICVsdU1IelxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjIxMQorIywgYy1mb3JtYXQKK21zZ2lkICIgIG5vIG9yIHVua25vd24gY3B1ZnJlcSBkcml2ZXIgaXMgYWN0aXZlIG9uIHRoaXMgQ1BVXG4iCittc2dzdHIgIiAga2VpbiBvZGVyIG5pY2h0IGJlc3RpbW1iYXJlciBjcHVmcmVxLVRyZWliZXIgYWt0aXZcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjEzCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgZHJpdmVyOiAlc1xuIgorbXNnc3RyICIgIFRyZWliZXI6ICVzXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjIxOQorIywgYy1mb3JtYXQKK21zZ2lkICIgIENQVXMgd2hpY2ggcnVuIGF0IHRoZSBzYW1lIGhhcmR3YXJlIGZyZXF1ZW5jeTogIgorbXNnc3RyICIgIEZvbGdlbmRlIENQVXMgbGF1ZmVuIG1pdCBkZXIgZ2xlaWNoZW4gSGFyZHdhcmUtVGFrdGZyZXF1ZW56OiAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjIzMAorIywgYy1mb3JtYXQKK21zZ2lkICIgIENQVXMgd2hpY2ggbmVlZCB0byBoYXZlIHRoZWlyIGZyZXF1ZW5jeSBjb29yZGluYXRlZCBieSBzb2Z0d2FyZTogIgorbXNnc3RyICIgIERpZSBUYWt0ZnJlcXVlbnogZm9sZ2VuZGVyIENQVXMgd2VyZGVuIHBlciBTb2Z0d2FyZSBrb29yZGluaWVydDogIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyNDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBtYXhpbXVtIHRyYW5zaXRpb24gbGF0ZW5jeTogIgorbXNnc3RyICIgIE1heGltYWxlIERhdWVyIGVpbmVzIFRha3RmcmVxdWVuendlY2hzZWxzOiAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjI0NworIywgYy1mb3JtYXQKK21zZ2lkICIgIGhhcmR3YXJlIGxpbWl0czogIgorbXNnc3RyICIgIEhhcmR3YXJlYmVkaW5ndGUgR3JlbnplbiBkZXIgVGFrdGZyZXF1ZW56OiAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjI1NgorIywgYy1mb3JtYXQKK21zZ2lkICIgIGF2YWlsYWJsZSBmcmVxdWVuY3kgc3RlcHM6ICIKK21zZ3N0ciAiICBt9mdsaWNoZSBUYWt0ZnJlcXVlbnplbjogIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyNjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBhdmFpbGFibGUgY3B1ZnJlcSBnb3Zlcm5vcnM6ICIKK21zZ3N0ciAiICBt9mdsaWNoZSBSZWdsZXI6ICIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjgwCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgY3VycmVudCBwb2xpY3k6IGZyZXF1ZW5jeSBzaG91bGQgYmUgd2l0aGluICIKK21zZ3N0ciAiICBtb21lbnRhbmUgVGFrdGlrOiBkaWUgRnJlcXVlbnogc29sbCBpbm5lcmhhbGIgIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiIGFuZCAiCittc2dzdHIgIiB1bmQgIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlRoZSBnb3Zlcm5vciBcIiVzXCIgbWF5IGRlY2lkZSB3aGljaCBzcGVlZCB0byB1c2VcbiIKKyIgICAgICAgICAgICAgICAgICB3aXRoaW4gdGhpcyByYW5nZS5cbiIKK21zZ3N0ciAiIgorIiAgbGllZ2VuLiBEZXIgUmVnbGVyIFwiJXNcIiBrYW5uIGZyZWkgZW50c2NoZWlkZW4sXG4iCisiICAgICAgICAgICAgICAgICAgICB3ZWxjaGUgVGFrdGZyZXF1ZW56IGlubmVyaGFsYiBkaWVzZXIgR3JlbnplIHZlcndlbmRldCAiCisid2lyZC5cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjkzCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgY3VycmVudCBDUFUgZnJlcXVlbmN5IGlzICIKK21zZ3N0ciAiICBtb21lbnRhbmUgVGFrdGZyZXF1ZW56IGlzdCAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjI5NgorIywgYy1mb3JtYXQKK21zZ2lkICIgKGFzc2VydGVkIGJ5IGNhbGwgdG8gaGFyZHdhcmUpIgorbXNnc3RyICIgICh2ZXJpZml6aWVydCBkdXJjaCBOYWNoZnJhZ2UgYmVpIGRlciBIYXJkd2FyZSkiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjMwNAorIywgYy1mb3JtYXQKK21zZ2lkICIgIGNwdWZyZXEgc3RhdHM6ICIKK21zZ3N0ciAiICBTdGF0aXN0aWs6IgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0NzIKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIlVzYWdlOiBjcHVwb3dlciBmcmVxaW5mbyBbb3B0aW9uc11cbiIKK21zZ3N0ciAiQXVmcnVmOiBjcHVmcmVxLWluZm8gW09wdGlvbmVuXVxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0NzMgdXRpbHMvY3B1ZnJlcS1zZXQuYzoyNiB1dGlscy9jcHVwb3dlci1zZXQuYzoyMworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjIyIHV0aWxzL2NwdWlkbGUtaW5mby5jOjE0OAorIywgYy1mb3JtYXQKK21zZ2lkICJPcHRpb25zOlxuIgorbXNnc3RyICJPcHRpb25lbjpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDc0CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIgIC1lLCAtLWRlYnVnICAgICAgICAgIFByaW50cyBvdXQgZGVidWcgaW5mb3JtYXRpb24gW2RlZmF1bHRdXG4iCittc2dzdHIgIiIKKyIgIC1lLCAtLWRlYnVnICAgICAgICAgIEVyemV1Z3QgZGV0YWlsbGllcnRlIEluZm9ybWF0aW9uZW4sIGhpbGZyZWljaFxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgenVtIEF1ZnNw/HJlbiB2b24gRmVobGVyblxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0NzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLWYsIC0tZnJlcSAgICAgICAgICAgR2V0IGZyZXF1ZW5jeSB0aGUgQ1BVIGN1cnJlbnRseSBydW5zIGF0LCBhY2NvcmRpbmdcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBjcHVmcmVxIGNvcmUgKlxuIgorbXNnc3RyICIiCisiICAtZiwgLS1mcmVxICAgICAgICAgICBGaW5kZXQgZGllIG1vbWVudGFuZSBDUFUtVGFrdGZycXVlbnogaGVyYXVzIChuYWNoXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBNZWludW5nIGRlcyBCZXRyaWVic3N5c3RlbXMpICpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDc3CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC13LCAtLWh3ZnJlcSAgICAgICAgIEdldCBmcmVxdWVuY3kgdGhlIENQVSBjdXJyZW50bHkgcnVucyBhdCwgYnkgcmVhZGluZ1xuIgorIiAgICAgICAgICAgICAgICAgICAgICAgaXQgZnJvbSBoYXJkd2FyZSAob25seSBhdmFpbGFibGUgdG8gcm9vdCkgKlxuIgorbXNnc3RyICIiCisiICAtdywgLS1od2ZyZXEgICAgICAgICBGaW5kZXQgZGllIG1vbWVudGFuZSBDUFUtVGFrdGZyZXF1ZW56IGhlcmF1c1xuIgorIiAgICAgICAgICAgICAgICAgICAgICAgKHZlcmlmaXppZXJ0IGR1cmNoIE5hY2hmcmFnZSBiZWkgZGVyIEhhcmR3YXJlKVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgW251ciBkZXIgQWRtaW5pc3RyYXRvciBrYW5uIGRpZXMgdHVuXSAqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ3OQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtbCwgLS1od2xpbWl0cyAgICAgICBEZXRlcm1pbmUgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gQ1BVIGZyZXF1ZW5jeSAiCisiYWxsb3dlZCAqXG4iCittc2dzdHIgIiIKKyIgIC1sLCAtLWh3bGltaXRzICAgICAgIEZpbmRldCBkaWUgbWluaW1hbGUgdW5kIG1heGltYWxlIFRha3RmcmVxdWVueiBoZXJhdXMgIgorIipcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDgwCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgLWQsIC0tZHJpdmVyICAgICAgICAgRGV0ZXJtaW5lcyB0aGUgdXNlZCBjcHVmcmVxIGtlcm5lbCBkcml2ZXIgKlxuIgorbXNnc3RyICIgIC1kLCAtLWRyaXZlciAgICAgICAgIEZpbmRldCBkZW4gbW9tZW50YW5lbiBUcmVpYmVyIGhlcmF1cyAqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4MQorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1wLCAtLXBvbGljeSAgICAgICAgIEdldHMgdGhlIGN1cnJlbnRseSB1c2VkIGNwdWZyZXEgcG9saWN5ICpcbiIKK21zZ3N0ciAiICAtcCwgLS1wb2xpY3kgICAgICAgICBGaW5kZXQgZGllIG1vbWVudGFuZSBUYWt0aWsgaGVyYXVzICpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDgyCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgLWcsIC0tZ292ZXJub3JzICAgICAgRGV0ZXJtaW5lcyBhdmFpbGFibGUgY3B1ZnJlcSBnb3Zlcm5vcnMgKlxuIgorbXNnc3RyICIgIC1nLCAtLWdvdmVybm9ycyAgICAgIEVyemV1Z3QgZWluZSBMaXN0ZSBtaXQgdmVyZvxnYmFyZW4gUmVnbGVybiAqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4MworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtciwgLS1yZWxhdGVkLWNwdXMgICBEZXRlcm1pbmVzIHdoaWNoIENQVXMgcnVuIGF0IHRoZSBzYW1lIGhhcmR3YXJlICIKKyJmcmVxdWVuY3kgKlxuIgorbXNnc3RyICIiCisiICAtciwgLS1yZWxhdGVkLWNwdXMgICBGaW5kZXQgaGVyYXVzLCB3ZWxjaGUgQ1BVcyBtaXQgZGVyc2VsYmVuICIKKyJwaHlzaWthbGlzY2hlblxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgVGFrdGZyZXF1ZW56IGxhdWZlbiAqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4NAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtYSwgLS1hZmZlY3RlZC1jcHVzICBEZXRlcm1pbmVzIHdoaWNoIENQVXMgbmVlZCB0byBoYXZlIHRoZWlyIGZyZXF1ZW5jeVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZWQgYnkgc29mdHdhcmUgKlxuIgorbXNnc3RyICIiCisiICAtYSwgLS1hZmZlY3RlZC1jcHVzICBGaW5kZXQgaGVyYXVzLCB2b24gd2VsY2hlbiBDUFVzIGRpZSBUYWt0ZnJlcXVlbnogIgorImR1cmNoXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBTb2Z0d2FyZSBrb29yZGluaWVydCB3ZXJkZW4gbXVzcyAqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4NgorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1zLCAtLXN0YXRzICAgICAgICAgIFNob3dzIGNwdWZyZXEgc3RhdGlzdGljcyBpZiBhdmFpbGFibGVcbiIKK21zZ3N0ciAiIgorIiAgLXMsIC0tc3RhdHMgICAgICAgICAgWmVpZ3QsIHNvZmVybiBt9mdsaWNoLCBTdGF0aXN0aWtlbiD8YmVyIGNwdWZyZXEgYW4uXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4NworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAteSwgLS1sYXRlbmN5ICAgICAgICBEZXRlcm1pbmVzIHRoZSBtYXhpbXVtIGxhdGVuY3kgb24gQ1BVIGZyZXF1ZW5jeSAiCisiY2hhbmdlcyAqXG4iCittc2dzdHIgIiIKKyIgIC15LCAtLWxhdGVuY3kgICAgICAgIEZpbmRldCBkaWUgbWF4aW1hbGUgRGF1ZXIgZWluZXMgVGFrdGZyZXF1ZW56d2VjaHNlbHMgIgorImhlcmF1cyAqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4OAorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1iLCAtLWJvb3N0ICAgICAgICAgIENoZWNrcyBmb3IgdHVyYm8gb3IgYm9vc3QgbW9kZXMgICpcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLW8sIC0tcHJvYyAgICAgICAgICAgUHJpbnRzIG91dCBpbmZvcm1hdGlvbiBsaWtlIHByb3ZpZGVkIGJ5IHRoZSAvcHJvYy8iCisiY3B1ZnJlcVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlIGluIDIuNC4gYW5kIGVhcmx5IDIuNi4ga2VybmVsc1xuIgorbXNnc3RyICIiCisiICAtbywgLS1wcm9jICAgICAgICAgICBFcnpldWd0IEluZm9ybWF0aW9uZW4gaW4gZWluZW0g5GhubGljaGVtIEZvcm1hdCB6dSAiCisiZGVtXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBkZXIgL3Byb2MvY3B1ZnJlcS1EYXRlaSBpbiAyLjQuIHVuZCBmcvxoZW4gMi42LlxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgS2VybmVsLVZlcnNpb25lblxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0OTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLW0sIC0taHVtYW4gICAgICAgICAgaHVtYW4tcmVhZGFibGUgb3V0cHV0IGZvciB0aGUgLWYsIC13LCAtcyBhbmQgLXkgIgorInBhcmFtZXRlcnNcbiIKK21zZ3N0ciAiIgorIiAgLW0sIC0taHVtYW4gICAgICAgICAgRm9ybWF0aWVydCBUYWt0ZnJlcXVlbnotIHVuZCBaZWl0ZGF1ZXJhbmdhYmVuIGluICIKKyJiZXNzZXJcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIGxlc2JhcmVyIEZvcm0gKE1IeiwgR0h6OyB1cywgbXMpXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ5MiB1dGlscy9jcHVpZGxlLWluZm8uYzoxNTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtaCwgLS1oZWxwICAgICAgICAgICBQcmludHMgb3V0IHRoaXMgc2NyZWVuXG4iCittc2dzdHIgIiAgLWgsIC0taGVscCAgICAgICAgICAgR2lidCBkaWVzZSBLdXJ6/GJlcnNpY2h0IGF1c1xuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0OTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIklmIG5vIGFyZ3VtZW50IG9yIG9ubHkgdGhlIC1jLCAtLWNwdSBwYXJhbWV0ZXIgaXMgZ2l2ZW4sIGRlYnVnIG91dHB1dCBhYm91dFxuIgorImNwdWZyZXEgaXMgcHJpbnRlZCB3aGljaCBpcyB1c2VmdWwgZS5nLiBmb3IgcmVwb3J0aW5nIGJ1Z3MuXG4iCittc2dzdHIgIiIKKyJTb2Zlcm4ga2VpbiBhbmRlcmVyIFBhcmFtZXRlciBhbHMgJy1jLCAtLWNwdScgYW5nZWdlYmVuIHdpcmQsIGxpZWZlcnQgIgorImRpZXNlc1xuIgorIlByb2dyYW1tIEluZm9ybWF0aW9uZW4sIGRpZSB6LkIuIHp1bSBCZXJpY2h0ZW4gdm9uIEZlaGxlcm4gbvx0emxpY2ggc2luZC5cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDk3CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJGb3IgdGhlIGFyZ3VtZW50cyBtYXJrZWQgd2l0aCAqLCBvbWl0dGluZyB0aGUgLWMgb3IgLS1jcHUgYXJndW1lbnQgaXNcbiIKKyJlcXVpdmFsZW50IHRvIHNldHRpbmcgaXQgdG8gemVyb1xuIgorbXNnc3RyICIiCisiQmVpIGRlbiBtaXQgKiBtYXJraWVydGVuIFBhcmFtZXRlcm4gd2lyZCAnLS1jcHUgMCcgYW5nZW5vbW1lbiwgc293ZWl0IG5pY2h0XG4iCisibWl0dGVscyAtYyBvZGVyIC0tY3B1IGV0d2FzIGFuZGVyZXMgYW5nZWdlYmVuIHdpcmRcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NTgwCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJUaGUgYXJndW1lbnQgcGFzc2VkIHRvIHRoaXMgdG9vbCBjYW4ndCBiZSBjb21iaW5lZCB3aXRoIHBhc3NpbmcgYSAtLWNwdSAiCisiYXJndW1lbnRcbiIKK21zZ3N0ciAiRGllc2UgT3B0aW9uIGthbm4gbmljaHQgbWl0IGRlciAtLWNwdS1PcHRpb24ga29tYmluaWVydCB3ZXJkZW5cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NTk2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJZb3UgY2FuJ3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIC0tY3B1IHBhcmFtZXRlciBhbmQvb3JcbiIKKyJtb3JlIHRoYW4gb25lIG91dHB1dC1zcGVjaWZpYyBhcmd1bWVudFxuIgorbXNnc3RyICIiCisiTWFuIGthbm4gbmljaHQgbWVociBhbHMgZWluZW4gLS1jcHUtUGFyYW1ldGVyIHVuZC9vZGVyIG1laHIgYWxzIGVpbmVuXG4iCisiaW5mb3JtYXRpb25zc3BlemlmaXNjaGVuIFBhcmFtZXRlciBnbGVpY2h6ZWl0aWcgYW5nZWJlblxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo2MDAgdXRpbHMvY3B1ZnJlcS1zZXQuYzo4MiB1dGlscy9jcHVwb3dlci1zZXQuYzo0MgorIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjQyIHV0aWxzL2NwdWlkbGUtaW5mby5jOjIxMworIywgYy1mb3JtYXQKK21zZ2lkICJpbnZhbGlkIG9yIHVua25vd24gYXJndW1lbnRcbiIKK21zZ3N0ciAidW5iZWthbm50ZXIgb2RlciBmYWxzY2hlciBQYXJhbWV0ZXJcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NjE3CisjLCBjLWZvcm1hdAorbXNnaWQgImNvdWxkbid0IGFuYWx5emUgQ1BVICVkIGFzIGl0IGRvZXNuJ3Qgc2VlbSB0byBiZSBwcmVzZW50XG4iCittc2dzdHIgIiIKKyJLb25udGUgbmljaHQgZGllIENQVSAlZCBhbmFseXNpZXJlbiwgZGEgc2llIChzY2hlaW5iYXI/KSBuaWNodCBleGlzdGllcnQuXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjYyMCB1dGlscy9jcHVwb3dlci1pbmZvLmM6MTQyCisjLCBjLWZvcm1hdAorbXNnaWQgImFuYWx5emluZyBDUFUgJWQ6XG4iCittc2dzdHIgImFuYWx5c2llcmUgQ1BVICVkOlxuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjI1CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogY3B1cG93ZXIgZnJlcXVlbmN5LXNldCBbb3B0aW9uc11cbiIKK21zZ3N0ciAiQXVmcnVmOiBjcHVmcmVxLXNldCBbT3B0aW9uZW5dXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLWQgRlJFUSwgLS1taW4gRlJFUSAgICAgIG5ldyBtaW5pbXVtIENQVSBmcmVxdWVuY3kgdGhlIGdvdmVybm9yIG1heSAiCisic2VsZWN0XG4iCittc2dzdHIgIiIKKyIgIC1kIEZSRVEsIC0tbWluIEZSRVEgICAgICBuZXVlIG1pbmltYWxlIFRha3RmcmVxdWVueiwgZGllIGRlciBSZWdsZXJcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXN35GhsZW4gZGFyZlxuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjI4CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC11IEZSRVEsIC0tbWF4IEZSRVEgICAgICBuZXcgbWF4aW11bSBDUFUgZnJlcXVlbmN5IHRoZSBnb3Zlcm5vciBtYXkgIgorInNlbGVjdFxuIgorbXNnc3RyICIiCisiICAtdSBGUkVRLCAtLW1heCBGUkVRICAgICAgbmV1ZSBtYXhpbWFsZSBUYWt0ZnJlcXVlbnosIGRpZSBkZXIgUmVnbGVyXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVzd+RobGVuIGRhcmZcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzoyOQorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1nIEdPViwgLS1nb3Zlcm5vciBHT1YgICBuZXcgY3B1ZnJlcSBnb3Zlcm5vclxuIgorbXNnc3RyICIgIC1nIEdPViwgLS1nb3Zlcm5vcnMgR09WICB3ZWNoc2xlIHp1IFJlZ2xlciBHT1ZcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzozMAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtZiBGUkVRLCAtLWZyZXEgRlJFUSAgICAgc3BlY2lmaWMgZnJlcXVlbmN5IHRvIGJlIHNldC4gUmVxdWlyZXMgdXNlcnNwYWNlXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgZ292ZXJub3IgdG8gYmUgYXZhaWxhYmxlIGFuZCBsb2FkZWRcbiIKK21zZ3N0ciAiIgorIiAgLWYgRlJFUSwgLS1mcmVxIEZSRVEgICAgIHNldHplIGV4YWt0ZSBUYWt0ZnJlcXVlbnouIEJlbvZ0aWd0IGRlbiBSZWdsZXJcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlcnNwYWNlJy5cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzozMgorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1yLCAtLXJlbGF0ZWQgICAgICAgICAgICBTd2l0Y2hlcyBhbGwgaGFyZHdhcmUtcmVsYXRlZCBDUFVzXG4iCittc2dzdHIgIiIKKyIgIC1yLCAtLXJlbGF0ZWQgICAgICAgICAgICBTZXR6ZSBXZXJ0ZSBm/HIgYWxsZSBDUFVzLCBkZXJlbiBUYWt0ZnJlcXVlbnpcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZWJlZGluZ3QgaWRlbnRpc2NoIGlzdC5cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzozMyB1dGlscy9jcHVwb3dlci1zZXQuYzoyOCB1dGlscy9jcHVwb3dlci1pbmZvLmM6MjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtaCwgLS1oZWxwICAgICAgICAgICAgICAgUHJpbnRzIG91dCB0aGlzIHNjcmVlblxuIgorbXNnc3RyICIgIC1oLCAtLWhlbHAgICAgICAgICAgICAgICBHaWJ0IGRpZXNlIEt1cnr8YmVyc2ljaHQgYXVzXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzUKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiIKKyJOb3RlczpcbiIKKyIxLiBPbWl0dGluZyB0aGUgLWMgb3IgLS1jcHUgYXJndW1lbnQgaXMgZXF1aXZhbGVudCB0byBzZXR0aW5nIGl0IHRvIFwiYWxsXCJcbiIKK21zZ3N0ciAiIgorIkJlaSBkZW4gbWl0ICogbWFya2llcnRlbiBQYXJhbWV0ZXJuIHdpcmQgJy0tY3B1IDAnIGFuZ2Vub21tZW4sIHNvd2VpdCBuaWNodFxuIgorIm1pdHRlbHMgLWMgb2RlciAtLWNwdSBldHdhcyBhbmRlcmVzIGFuZ2VnZWJlbiB3aXJkXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzcKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiIKKyIyLiBUaGUgLWYgRlJFUSwgLS1mcmVxIEZSRVEgcGFyYW1ldGVyIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIGFueSBvdGhlciAiCisicGFyYW1ldGVyXG4iCisiICAgZXhjZXB0IHRoZSAtYyBDUFUsIC0tY3B1IENQVSBwYXJhbWV0ZXJcbiIKKyIzLiBGUkVRdWVuY2llcyBjYW4gYmUgcGFzc2VkIGluIEh6LCBrSHogKGRlZmF1bHQpLCBNSHosIEdIeiwgb3IgVEh6XG4iCisiICAgYnkgcG9zdGZpeGluZyB0aGUgdmFsdWUgd2l0aCB0aGUgd2FudGVkIHVuaXQgbmFtZSwgd2l0aG91dCBhbnkgc3BhY2VcbiIKKyIgICAoRlJFUXVlbmN5IGluIGtIeiA9XiBIeiAqIDAuMDAxID1eIE1IeiAqIDEwMDAgPV4gR0h6ICogMTAwMDAwMCkuXG4iCittc2dzdHIgIiIKKyJIaW53ZWlzZTpcbiIKKyIxLiBTb2Zlcm4ga2VpbiAtYyBvZGVyIC0tY3B1LVBhcmFtZXRlciBhbmdlZ2ViZW4gaXN0LCB3aXJkICctLWNwdSAwJ1xuIgorIiAgIGFuZ2Vub21tZW5cbiIKKyIyLiBEZXIgUGFyYW1ldGVyIC1mIGJ6dy4gLS1mcmVxIGthbm4gbWl0IGtlaW5lbSBhbmRlcmVuIGFscyBkZW0gUGFyYW1ldGVyXG4iCisiICAgLWMgYnp3LiAtLWNwdSBrb21iaW5pZXJ0IHdlcmRlblxuIgorIjMuIEZSRVF1ZW56ZW4ga/ZubmVuIGluIEh6LCBrSHogKFN0YW5kYXJkKSwgTUh6LCBHSHogb2RlciBUSHogZWluZ2VnZWJlblxuIgorIiAgIHdlcmRlbiwgaW5kZW0gZGVyIFdlcnQgdW5kIHVubWl0dGVsYmFyIGFuc2NobGll32VuZCAob2huZSBMZWVyemVpY2hlbiEpXG4iCisiICAgZGllIEVpbmhlaXQgYW5nZWdlYmVuIHdlcmRlbi4gKEJzcDogMUdIeiApXG4iCisiICAgKEZSRVF1ZW56IGluIGtIeiA9XiBNSHogKiAxMDAwID1eIEdIeiAqIDEwMDAwMDApLlxuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjU3CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBzZXR0aW5nIG5ldyB2YWx1ZXMuIENvbW1vbiBlcnJvcnM6XG4iCisiLSBEbyB5b3UgaGF2ZSBwcm9wZXIgYWRtaW5pc3RyYXRpb24gcmlnaHRzPyAoc3VwZXItdXNlcj8pXG4iCisiLSBJcyB0aGUgZ292ZXJub3IgeW91IHJlcXVlc3RlZCBhdmFpbGFibGUgYW5kIG1vZHByb2JlZD9cbiIKKyItIFRyeWluZyB0byBzZXQgYW4gaW52YWxpZCBwb2xpY3k/XG4iCisiLSBUcnlpbmcgdG8gc2V0IGEgc3BlY2lmaWMgZnJlcXVlbmN5LCBidXQgdXNlcnNwYWNlIGdvdmVybm9yIGlzIG5vdCAiCisiYXZhaWxhYmxlLFxuIgorIiAgIGZvciBleGFtcGxlIGJlY2F1c2Ugb2YgaGFyZHdhcmUgd2hpY2ggY2Fubm90IGJlIHNldCB0byBhIHNwZWNpZmljICIKKyJmcmVxdWVuY3lcbiIKKyIgICBvciBiZWNhdXNlIHRoZSB1c2Vyc3BhY2UgZ292ZXJub3IgaXNuJ3QgbG9hZGVkP1xuIgorbXNnc3RyICIiCisiQmVpbSBFaW5zdGVsbGVuIGlzdCBlaW4gRmVobGVyIGF1ZmdldHJldGVuLiBUeXBpc2NoZSBGZWhsZXJxdWVsbGVuIHNpbmQ6XG4iCisiLSBuaWNodCBhdXNyZWljaGVuZGUgUmVjaHRlIChBZG1pbmlzdHJhdG9yKVxuIgorIi0gZGVyIFJlZ2xlciBpc3QgbmljaHQgdmVyZvxnYmFyIGJ6dy4gbmljaHQgZ2VsYWRlblxuIgorIi0gZGllIGFuZ2VnZWJlbmUgVGFrdGlrIGlzdCBpbmtvcnJla3RcbiIKKyItIGVpbmUgc3BlemlmaXNjaGUgRnJlcXVlbnogd3VyZGUgYW5nZWdlYmVuLCBhYmVyIGRlciBSZWdsZXIgJ3VzZXJzcGFjZSdcbiIKKyIgIGthbm4gZW50d2VkZXIgaGFyZHdhcmViZWRpbmd0IG5pY2h0IGdlbnV0enQgd2VyZGVuIG9kZXIgaXN0IG5pY2h0IGdlbGFkZW5cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzoxNzAKKyMsIGMtZm9ybWF0Cittc2dpZCAid3JvbmcsIHVua25vd24gb3IgdW5oYW5kbGVkIENQVT9cbiIKK21zZ3N0ciAidW5iZWthbm50ZSBvZGVyIG5pY2h0IHJlZ2VsYmFyZSBDUFVcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzozMDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorInRoZSAtZi8tLWZyZXEgcGFyYW1ldGVyIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIC1kLy0tbWluLCAtdS8tLW1heCBvclxuIgorIi1nLy0tZ292ZXJub3IgcGFyYW1ldGVyc1xuIgorbXNnc3RyICIiCisiRGVyIC1mIGJ6dy4gLS1mcmVxLVBhcmFtZXRlciBrYW5uIG5pY2h0IG1pdCBkZW4gUGFyYW1ldGVybiAtZC8tLW1pbiwgLXUvLS0iCisibWF4XG4iCisib2RlciAtZy8tLWdvdmVybm9yIGtvbWJpbmllcnQgd2VyZGVuXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzA4CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJBdCBsZWFzdCBvbmUgcGFyYW1ldGVyIG91dCBvZiAtZi8tLWZyZXEsIC1kLy0tbWluLCAtdS8tLW1heCwgYW5kXG4iCisiLWcvLS1nb3Zlcm5vciBtdXN0IGJlIHBhc3NlZFxuIgorbXNnc3RyICIiCisiRXMgbXVzcyBtaW5kZXN0ZW5zIGVpbiBQYXJhbWV0ZXIgYXVzIC1mLy0tZnJlcSwgLWQvLS1taW4sIC11Ly0tbWF4IG9kZXJcbiIKKyItZy8tLWdvdmVybm9yIGFuZ2VnZWJlbiB3ZXJkZW4uXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIlNldHRpbmcgY3B1OiAlZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjIyCisjLCBjLWZvcm1hdAorbXNnaWQgIlVzYWdlOiBjcHVwb3dlciBzZXQgWyAtYiB2YWwgXSBbIC1tIHZhbCBdIFsgLXMgdmFsIF1cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzoyNAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtYiwgLS1wZXJmLWJpYXMgW1ZBTF0gICAgU2V0cyBDUFUncyBwb3dlciB2cyBwZXJmb3JtYW5jZSBwb2xpY3kgb24gc29tZVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIG1vZGVscyBbMC0xNV0sIHNlZSBtYW5wYWdlIGZvciBkZXRhaWxzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6MjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLW0sIC0tc2NoZWQtbWMgIFtWQUxdICAgIFNldHMgdGhlIGtlcm5lbCdzIG11bHRpIGNvcmUgc2NoZWR1bGVyIHBvbGljeS5cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzoyNworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtcywgLS1zY2hlZC1zbXQgW1ZBTF0gICAgU2V0cyB0aGUga2VybmVsJ3MgdGhyZWFkIHNpYmxpbmcgc2NoZWR1bGVyICIKKyJwb2xpY3kuXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiLS1wZXJmLWJpYXMgcGFyYW0gb3V0IG9mIHJhbmdlIFswLSVkXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjkxCisjLCBjLWZvcm1hdAorbXNnaWQgIi0tc2NoZWQtbWMgcGFyYW0gb3V0IG9mIHJhbmdlIFswLSVkXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjEwMgorIywgYy1mb3JtYXQKK21zZ2lkICItLXNjaGVkLXNtdCBwYXJhbSBvdXQgb2YgcmFuZ2UgWzAtJWRdXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6MTIxCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHNldHRpbmcgc2NoZWQtbWMgJXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzoxMjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3Igc2V0dGluZyBzY2hlZC1zbXQgJXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzoxNDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3Igc2V0dGluZyBwZXJmLWJpYXMgdmFsdWUgb24gQ1BVICVkXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjIxCisjLCBjLWZvcm1hdAorbXNnaWQgIlVzYWdlOiBjcHVwb3dlciBpbmZvIFsgLWIgXSBbIC1tIF0gWyAtcyBdXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjIzCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1iLCAtLXBlcmYtYmlhcyAgICBHZXRzIENQVSdzIHBvd2VyIHZzIHBlcmZvcm1hbmNlIHBvbGljeSBvbiBzb21lXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgbW9kZWxzIFswLTE1XSwgc2VlIG1hbnBhZ2UgZm9yIGRldGFpbHNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MjUKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiAgLW0sIC0tc2NoZWQtbWMgICAgIEdldHMgdGhlIGtlcm5lbCdzIG11bHRpIGNvcmUgc2NoZWR1bGVyIHBvbGljeS5cbiIKK21zZ3N0ciAiICAtcCwgLS1wb2xpY3kgICAgICAgICBGaW5kZXQgZGllIG1vbWVudGFuZSBUYWt0aWsgaGVyYXVzICpcbiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjI2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1zLCAtLXNjaGVkLXNtdCAgICBHZXRzIHRoZSBrZXJuZWwncyB0aHJlYWQgc2libGluZyBzY2hlZHVsZXIgcG9saWN5LlxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoyOAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiUGFzc2luZyBubyBvcHRpb24gd2lsbCBzaG93IGFsbCBpbmZvLCBieSBkZWZhdWx0IG9ubHkgb24gY29yZSAwXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjEwMgorIywgYy1mb3JtYXQKK21zZ2lkICJTeXN0ZW0ncyBtdWx0aSBjb3JlIHNjaGVkdWxlciBzZXR0aW5nOiAiCittc2dzdHIgIiIKKworIy4gaWYgc3lzZnMgZmlsZSBpcyBtaXNzaW5nIGl0J3M6IGVycm5vID09IEVOT0VOVAorIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjEwNSB1dGlscy9jcHVwb3dlci1pbmZvLmM6MTE0CisjLCBjLWZvcm1hdAorbXNnaWQgIm5vdCBzdXBwb3J0ZWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MTExCisjLCBjLWZvcm1hdAorbXNnaWQgIlN5c3RlbSdzIHRocmVhZCBzaWJsaW5nIHNjaGVkdWxlciBzZXR0aW5nOiAiCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjEyNgorIywgYy1mb3JtYXQKK21zZ2lkICJJbnRlbCdzIHBlcmZvcm1hbmNlIGJpYXMgc2V0dGluZyBuZWVkcyByb290IHByaXZpbGVnZXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MTI4CisjLCBjLWZvcm1hdAorbXNnaWQgIlN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IEludGVsJ3MgcGVyZm9ybWFuY2UgYmlhcyBzZXR0aW5nXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjE0NworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgcmVhZCBwZXJmLWJpYXMgdmFsdWVcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MTUwCisjLCBjLWZvcm1hdAorbXNnaWQgInBlcmYtYmlhczogJWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoyOAorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQW5hbHl6aW5nIENQVSAlZDpcbiIKK21zZ3N0ciAiYW5hbHlzaWVyZSBDUFUgJWQ6XG4iCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjMyCisjLCBjLWZvcm1hdAorbXNnaWQgIkNQVSAldTogTm8gaWRsZSBzdGF0ZXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzozNgorIywgYy1mb3JtYXQKK21zZ2lkICJDUFUgJXU6IENhbid0IHJlYWQgaWRsZSBzdGF0ZSBpbmZvXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6NDEKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGQgbm90IGRldGVybWluZSBtYXggaWRsZSBzdGF0ZSAldVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjQ2CisjLCBjLWZvcm1hdAorbXNnaWQgIk51bWJlciBvZiBpZGxlIHN0YXRlczogJWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo0OAorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQXZhaWxhYmxlIGlkbGUgc3RhdGVzOiIKK21zZ3N0ciAiICBt9mdsaWNoZSBUYWt0ZnJlcXVlbnplbjogIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo3MQorIywgYy1mb3JtYXQKK21zZ2lkICJGbGFncy9EZXNjcmlwdGlvbjogJXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo3NAorIywgYy1mb3JtYXQKK21zZ2lkICJMYXRlbmN5OiAlbHVcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo3NgorIywgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogJWx1XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6NzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRHVyYXRpb246ICVsbHVcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo5MAorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZGV0ZXJtaW5lIGNwdWlkbGUgZHJpdmVyXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6OTQKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNQVWlkbGUgZHJpdmVyOiAlc1xuIgorbXNnc3RyICIgIFRyZWliZXI6ICVzXG4iCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjk5CisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkZXRlcm1pbmUgY3B1aWRsZSBnb3Zlcm5vclxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEwMworIywgYy1mb3JtYXQKK21zZ2lkICJDUFVpZGxlIGdvdmVybm9yOiAlc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEyMgorIywgYy1mb3JtYXQKK21zZ2lkICJDUFUgJXU6IENhbid0IHJlYWQgQy1zdGF0ZSBpbmZvXG4iCittc2dzdHIgIiIKKworIy4gcHJpbnRmKCJDc3RhdGVzOiAlZFxuIiwgY3N0YXRlcyk7CisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiYWN0aXZlIHN0YXRlOiAgICAgICAgICAgIEMwXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTI4CisjLCBjLWZvcm1hdAorbXNnaWQgIm1heF9jc3RhdGU6ICAgICAgICAgICAgICBDJXVcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMjkKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIm1heGltdW0gYWxsb3dlZCBsYXRlbmN5OiAlbHUgdXNlY1xuIgorbXNnc3RyICIgIE1heGltYWxlIERhdWVyIGVpbmVzIFRha3RmcmVxdWVuendlY2hzZWxzOiAiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEzMAorIywgYy1mb3JtYXQKK21zZ2lkICJzdGF0ZXM6XHRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgIEMlZDogICAgICAgICAgICAgICAgICB0eXBlW0MlZF0gIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEzNAorIywgYy1mb3JtYXQKK21zZ2lkICJwcm9tb3Rpb25bLS1dIGRlbW90aW9uWy0tXSAiCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTM1CisjLCBjLWZvcm1hdAorbXNnaWQgImxhdGVuY3lbJTAzbHVdICIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMzcKKyMsIGMtZm9ybWF0Cittc2dpZCAidXNhZ2VbJTA4bHVdICIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiZHVyYXRpb25bJTAyMEx1XSBcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxNDcKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIlVzYWdlOiBjcHVwb3dlciBpZGxlaW5mbyBbb3B0aW9uc11cbiIKK21zZ3N0ciAiQXVmcnVmOiBjcHVmcmVxLWluZm8gW09wdGlvbmVuXVxuIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxNDkKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiAgLXMsIC0tc2lsZW50ICAgICAgICAgT25seSBzaG93IGdlbmVyYWwgQy1zdGF0ZSBpbmZvcm1hdGlvblxuIgorbXNnc3RyICIiCisiICAtZSwgLS1kZWJ1ZyAgICAgICAgICBFcnpldWd0IGRldGFpbGxpZXJ0ZSBJbmZvcm1hdGlvbmVuLCBoaWxmcmVpY2hcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIHp1bSBBdWZzcPxyZW4gdm9uIEZlaGxlcm5cbiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTUwCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtbywgLS1wcm9jICAgICAgICAgICBQcmludHMgb3V0IGluZm9ybWF0aW9uIGxpa2UgcHJvdmlkZWQgYnkgdGhlIC9wcm9jLyIKKyJhY3BpL3Byb2Nlc3Nvci8qL3Bvd2VyXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UgaW4gb2xkZXIga2VybmVsc1xuIgorbXNnc3RyICIiCisiICAtbywgLS1wcm9jICAgICAgICAgICBFcnpldWd0IEluZm9ybWF0aW9uZW4gaW4gZWluZW0g5GhubGljaGVtIEZvcm1hdCB6dSAiCisiZGVtXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBkZXIgL3Byb2MvY3B1ZnJlcS1EYXRlaSBpbiAyLjQuIHVuZCBmcvxoZW4gMi42LlxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgS2VybmVsLVZlcnNpb25lblxuIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoyMDkKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIllvdSBjYW4ndCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgb3V0cHV0LXNwZWNpZmljIGFyZ3VtZW50XG4iCittc2dzdHIgIiIKKyJNYW4ga2FubiBuaWNodCBtZWhyIGFscyBlaW5lbiAtLWNwdS1QYXJhbWV0ZXIgdW5kL29kZXIgbWVociBhbHMgZWluZW5cbiIKKyJpbmZvcm1hdGlvbnNzcGV6aWZpc2NoZW4gUGFyYW1ldGVyIGdsZWljaHplaXRpZyBhbmdlYmVuXG4iCisKKyN+IG1zZ2lkICIiCisjfiAiICAtYyBDUFUsIC0tY3B1IENQVSAgICBDUFUgbnVtYmVyIHdoaWNoIGluZm9ybWF0aW9uIHNoYWxsIGJlIGRldGVybWluZWQgIgorI34gImFib3V0XG4iCisjfiBtc2dzdHIgIiIKKyN+ICIgIC1jIENQVSwgLS1jcHUgQ1BVICAgIE51bW1lciBkZXIgQ1BVLCD8YmVyIGRpZSBJbmZvcm1hdGlvbmVuICIKKyN+ICJoZXJhdXNnZWZ1bmRlbiB3ZXJkZW4gc29sbGVuXG4iCisKKyN+IG1zZ2lkICIiCisjfiAiICAtYyBDUFUsIC0tY3B1IENQVSAgICAgICAgbnVtYmVyIG9mIENQVSB3aGVyZSBjcHVmcmVxIHNldHRpbmdzIHNoYWxsIGJlICIKKyN+ICJtb2RpZmllZFxuIgorI34gbXNnc3RyICIiCisjfiAiICAtYyBDUFUsIC0tY3B1IENQVSAgICAgICAgTnVtbWVyIGRlciBDUFUsIGRlcmVuIFRha3RmcmVxdWVuei0iCisjfiAiRWluc3RlbGx1bmdcbiIKKyN+ICIgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZXJkZW4gc29sbFxuIgpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvcG8vZnIucG8gYi90b29scy9wb3dlci9jcHVwb3dlci9wby9mci5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDVhZDIwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvcG8vZnIucG8KQEAgLTAsMCArMSw5NDcgQEAKKyMgRnJlbmNoIHRyYW5zbGF0aW9ucyBmb3IgY3B1ZnJlcXV0aWxzIHBhY2thZ2UKKyMgQ29weXJpZ2h0IChDKSAyMDA0IFRIRSBQQUNLQUdFJ1MgQ09QWVJJR0hUIEhPTERFUgorIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHNhbWUgbGljZW5zZSBhcyB0aGUgY3B1ZnJlcXV0aWxzIHBhY2thZ2UuCisjIER1Y3JvdCBCcnVubyA8ZHVjcm90QHBvdXBpbm91Lm9yZz4sIDIwMDQuCisjCisjLCBmdXp6eQorbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogY3B1ZnJlcXV0aWxzIDAuMS1wcmUyXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IFxuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDExLTAzLTA4IDE3OjAzKzAxMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDA0LTExLTE3IDE1OjUzKzEwMDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IEJydW5vIER1Y3JvdCA8ZHVjcm90QHBvdXBpbm91Lm9yZz5cbiIKKyJMYW5ndWFnZS1UZWFtOiBOT05FXG4iCisiTGFuZ3VhZ2U6IFxuIgorIk1JTUUtVmVyc2lvbjogMS4wXG4iCisiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PUlTTy04ODU5LTFcbiIKKyJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0XG4iCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9uaG1faWRsZS5jOjM2Cittc2dpZCAiUHJvY2Vzc29yIENvcmUgQzMiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL25obV9pZGxlLmM6NDMKK21zZ2lkICJQcm9jZXNzb3IgQ29yZSBDNiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvbmhtX2lkbGUuYzo1MQorbXNnaWQgIlByb2Nlc3NvciBQYWNrYWdlIEMzIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9uaG1faWRsZS5jOjU4IHV0aWxzL2lkbGVfbW9uaXRvci9hbWRfZmFtMTRoX2lkbGUuYzo3MAorbXNnaWQgIlByb2Nlc3NvciBQYWNrYWdlIEM2IgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9zbmJfaWRsZS5jOjMzCittc2dpZCAiUHJvY2Vzc29yIENvcmUgQzciCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL3NuYl9pZGxlLmM6NDAKK21zZ2lkICJQcm9jZXNzb3IgUGFja2FnZSBDMiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3Ivc25iX2lkbGUuYzo0NworbXNnaWQgIlByb2Nlc3NvciBQYWNrYWdlIEM3IgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9hbWRfZmFtMTRoX2lkbGUuYzo1NgorbXNnaWQgIlBhY2thZ2UgaW4gc2xlZXAgc3RhdGUgKFBDMSBvciBkZWVwZXIpIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9hbWRfZmFtMTRoX2lkbGUuYzo2MworbXNnaWQgIlByb2Nlc3NvciBQYWNrYWdlIEMxIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9hbWRfZmFtMTRoX2lkbGUuYzo3NworbXNnaWQgIk5vcnRoIEJyaWRnZSBQMSBib29sZWFuIGNvdW50ZXIgKHJldHVybnMgMCBvciAxKSIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvbXBlcmZfbW9uaXRvci5jOjM1Cittc2dpZCAiUHJvY2Vzc29yIENvcmUgbm90IGlkbGUiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL21wZXJmX21vbml0b3IuYzo0MgorbXNnaWQgIlByb2Nlc3NvciBDb3JlIGluIGFuIGlkbGUgc3RhdGUiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL21wZXJmX21vbml0b3IuYzo1MAorbXNnaWQgIkF2ZXJhZ2UgRnJlcXVlbmN5IChpbmNsdWRpbmcgYm9vc3QpIGluIE1IeiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjY2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJjcHVwb3dlciBtb25pdG9yOiBbLWhdIFsgWy10XSB8IFstbF0gfCBbLW0gPG1vbjE+LFs8bW9uMj5dIF0gXSBbLWkgIgorImludGVydmFsX3NlYyB8IC1jIGNvbW1hbmQgLi4uXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorImNwdXBvd2VyIG1vbml0b3I6IFstdl0gWy1oXSBbIFstdF0gfCBbLWxdIHwgWy1tIDxtb24xPixbPG1vbjI+XSBdIF0gWy1pICIKKyJpbnRlcnZhbF9zZWMgfCAtYyBjb21tYW5kIC4uLl1cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjcxCisjLCBjLWZvcm1hdAorbXNnaWQgIlx0IC12OiBiZSBtb3JlIHZlcmJvc2VcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjczCisjLCBjLWZvcm1hdAorbXNnaWQgIlx0IC1oOiBwcmludCB0aGlzIGhlbHBcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjc0CisjLCBjLWZvcm1hdAorbXNnaWQgIlx0IC1pOiB0aW1lIGludGVydmFsbCB0byBtZWFzdXJlIGZvciBpbiBzZWNvbmRzIChkZWZhdWx0IDEpXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo3NQorIywgYy1mb3JtYXQKK21zZ2lkICJcdCAtdDogc2hvdyBDUFUgdG9wb2xvZ3kvaGllcmFyY2h5XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo3NgorIywgYy1mb3JtYXQKK21zZ2lkICJcdCAtbDogbGlzdCBhdmFpbGFibGUgQ1BVIHNsZWVwIG1vbml0b3JzIChmb3IgdXNlIHdpdGggLW0pXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo3NworIywgYy1mb3JtYXQKK21zZ2lkICJcdCAtbTogc2hvdyBzcGVjaWZpYyBDUFUgc2xlZXAgbW9uaXRvcnMgb25seSAoaW4gc2FtZSBvcmRlcilcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjc5CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJvbmx5IG9uZSBvZjogLXQsIC1sLCAtbSBhcmUgYWxsb3dlZFxuIgorIklmIG5vbmUgb2YgdGhlbSBpcyBwYXNzZWQsIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiIGFsbCBzdXBwb3J0ZWQgbW9uaXRvcnMgYXJlIHNob3duXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzoxOTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiTW9uaXRvciAlcywgQ291bnRlciAlcyBoYXMgbm8gY291bnQgZnVuY3Rpb24uIEltcGxlbWVudGF0aW9uIGVycm9yXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzoyMDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiICppcyBvZmZsaW5lXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzoyMzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXM6IG1heCBtb25pdG9yIG5hbWUgbGVuZ3RoICglZCkgZXhjZWVkZWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjI1MAorIywgYy1mb3JtYXQKK21zZ2lkICJObyBtYXRjaGluZyBtb25pdG9yIGZvdW5kIGluICVzLCB0cnkgLWwgb3B0aW9uXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzoyNjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiTW9uaXRvciBcIiVzXCIgKCVkIHN0YXRlcykgLSBNaWdodCBvdmVyZmxvdyBhZnRlciAldSBzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzozMTkKKyMsIGMtZm9ybWF0Cittc2dpZCAiJXMgdG9vayAlLjVmIHNlY29uZHMgYW5kIGV4aXRlZCB3aXRoIHN0YXR1cyAlZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NDA2CisjLCBjLWZvcm1hdAorbXNnaWQgIkNhbm5vdCByZWFkIG51bWJlciBvZiBhdmFpbGFibGUgcHJvY2Vzc29yc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NDE3CisjLCBjLWZvcm1hdAorbXNnaWQgIkF2YWlsYWJsZSBtb25pdG9yICVzIG5lZWRzIHJvb3QgYWNjZXNzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo0MjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiTm8gSFcgQ3N0YXRlIG1vbml0b3JzIGZvdW5kXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzo3OAorIywgYy1mb3JtYXQKK21zZ2lkICJjcHVwb3dlciBbIC1jIGNwdWxpc3QgXSBzdWJjb21tYW5kIFtBUkdTXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLmM6NzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiY3B1cG93ZXIgLS12ZXJzaW9uXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzo4MAorIywgYy1mb3JtYXQKK21zZ2lkICJTdXBwb3J0ZWQgc3ViY29tbWFuZHMgYXJlOlxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLmM6ODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlxuIgorIlNvbWUgc3ViY29tbWFuZHMgY2FuIG1ha2UgdXNlIG9mIHRoZSAtYyBjcHVsaXN0IG9wdGlvbi5cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjg0CisjLCBjLWZvcm1hdAorbXNnaWQgIkxvb2sgYXQgdGhlIGdlbmVyYWwgY3B1cG93ZXIgbWFucGFnZSBob3cgdG8gdXNlIGl0XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzo4NQorIywgYy1mb3JtYXQKK21zZ2lkICJhbmQgcmVhZCB1cCB0aGUgc3ViY29tbWFuZCdzIG1hbnBhZ2Ugd2hldGhlciBpdCBpcyBzdXBwb3J0ZWQuXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzo4NgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiVXNlIGNwdXBvd2VyIGhlbHAgc3ViY29tbWFuZCBmb3IgZ2V0dGluZyBoZWxwIGZvciBhYm92ZSBzdWJjb21tYW5kcy5cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjkxCisjLCBjLWZvcm1hdAorbXNnaWQgIlJlcG9ydCBlcnJvcnMgYW5kIGJ1Z3MgdG8gJXMsIHBsZWFzZS5cbiIKK21zZ3N0ciAiVmV1aWxsZXogcmFwcG9ydGV6IGxlcyBlcnJldXJzIGV0IGxlcyBib2d1ZXMg4CAlcywgcydpbCB2b3VzIHBsYWl0LlxuIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjExNAorIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBwYXJzaW5nIGNwdSBsaXN0XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzoxNzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiU3ViY29tbWFuZCAlcyBuZWVkcyByb290IHByaXZpbGVnZXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzozMQorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZG4ndCBjb3VudCB0aGUgbnVtYmVyIG9mIENQVXMgKCVzOiAlcyksIGFzc3VtaW5nIDFcbiIKK21zZ3N0ciAiROl0ZXJtaW5hdGlvbiBkdSBub21icmUgZGUgQ1BVcyAoJXMgOiAlcykgaW1wb3NzaWJsZS4gIEFzc3VtZSAxXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjYzCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgICAgICAgICAgbWluaW11bSBDUFUgZnJlcXVlbmN5ICAtICBtYXhpbXVtIENQVSBmcmVxdWVuY3kgIC0gIGdvdmVybm9yXG4iCittc2dzdHIgIiIKKyIgICAgICAgICBGculxdWVuY2UgQ1BVIG1pbmltYWxlIC0gRnLpcXVlbmNlIENQVSBtYXhpbWFsZSAgLSBy6Wd1bGF0ZXVyXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE1MQorIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciB3aGlsZSBldmFsdWF0aW5nIEJvb3N0IENhcGFiaWxpdGllcyBvbiBDUFUgJWQgLS0gYXJlIHlvdSByb290P1xuIgorbXNnc3RyICIiCisKKyMuIFAgc3RhdGUgY2hhbmdlcyB2aWEgTVNSIGFyZSBpZGVudGlmaWVkIHZpYSBjcHVpZCA4MDAwMDAwNworIy4gb24gSW50ZWwgYW5kIEFNRCwgYnV0IHdlIGFzc3VtZSBib29zdCBjYXBhYmxlIG1hY2hpbmVzIGNhbiBkbyB0aGF0CisjLiBpZiAoY3B1aWRfZWF4KDB4ODAwMDAwMDApID49IDB4ODAwMDAwMDcKKyMuICYmIChjcHVpZF9lZHgoMHg4MDAwMDAwNykgJiAoMSA8PCA3KSkpCisjLgorIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTYxCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgYm9vc3Qgc3RhdGUgc3VwcG9ydDogXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTYzCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgICBTdXBwb3J0ZWQ6ICVzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTYzIHV0aWxzL2NwdWZyZXEtaW5mby5jOjE2NAorbXNnaWQgInllcyIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxNjMgdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTY0Cittc2dpZCAibm8iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTY0CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIgICAgQWN0aXZlOiAlc1xuIgorbXNnc3RyICIgIHBpbG90ZSA6ICVzXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE3NworIywgYy1mb3JtYXQKK21zZ2lkICIgICAgQm9vc3QgU3RhdGVzOiAlZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE3OAorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgVG90YWwgU3RhdGVzOiAlZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE4MQorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgUHN0YXRlLVBiJWQ6ICVsdU1IeiAoYm9vc3Qgc3RhdGUpXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTg0CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgICBQc3RhdGUtUCVkOiAgJWx1TUh6XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjExCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgbm8gb3IgdW5rbm93biBjcHVmcmVxIGRyaXZlciBpcyBhY3RpdmUgb24gdGhpcyBDUFVcbiIKK21zZ3N0ciAiICBwYXMgZGUgcGlsb3RlcyBjcHVmcmVxIHJlY29ubnUgcG91ciBjZSBDUFVcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjEzCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgZHJpdmVyOiAlc1xuIgorbXNnc3RyICIgIHBpbG90ZSA6ICVzXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjIxOQorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiICBDUFVzIHdoaWNoIHJ1biBhdCB0aGUgc2FtZSBoYXJkd2FyZSBmcmVxdWVuY3k6ICIKK21zZ3N0ciAiICBDUFVzIHF1aSBkb2l2ZW50IGNoYW5nZXIgZGUgZnLpcXVlbmNlcyBlbiBt6m1lIHRlbXBzIDogIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyMzAKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiAgQ1BVcyB3aGljaCBuZWVkIHRvIGhhdmUgdGhlaXIgZnJlcXVlbmN5IGNvb3JkaW5hdGVkIGJ5IHNvZnR3YXJlOiAiCittc2dzdHIgIiAgQ1BVcyBxdWkgZG9pdmVudCBjaGFuZ2VyIGRlIGZy6XF1ZW5jZXMgZW4gbeptZSB0ZW1wcyA6ICIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjQxCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgbWF4aW11bSB0cmFuc2l0aW9uIGxhdGVuY3k6ICIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyNDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBoYXJkd2FyZSBsaW1pdHM6ICIKK21zZ3N0ciAiICBsaW1pdGF0aW9uIG1hdOlyaWVsbGUgOiAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjI1NgorIywgYy1mb3JtYXQKK21zZ2lkICIgIGF2YWlsYWJsZSBmcmVxdWVuY3kgc3RlcHM6ICIKK21zZ3N0ciAiICBwbGFnZSBkZSBmculxdWVuY2UgOiAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjI2OQorIywgYy1mb3JtYXQKK21zZ2lkICIgIGF2YWlsYWJsZSBjcHVmcmVxIGdvdmVybm9yczogIgorbXNnc3RyICIgIHLpZ3VsYXRldXJzIGRpc3BvbmlibGVzIDogIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBjdXJyZW50IHBvbGljeTogZnJlcXVlbmN5IHNob3VsZCBiZSB3aXRoaW4gIgorbXNnc3RyICIgIHRhY3RpcXVlIGFjdHVlbGxlIDogbGEgZnLpcXVlbmNlIGRvaXQg6nRyZSBjb21wcmlzZSBlbnRyZSAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjI4MgorIywgYy1mb3JtYXQKK21zZ2lkICIgYW5kICIKK21zZ3N0ciAiIGV0ICIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6Mjg2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJUaGUgZ292ZXJub3IgXCIlc1wiIG1heSBkZWNpZGUgd2hpY2ggc3BlZWQgdG8gdXNlXG4iCisiICAgICAgICAgICAgICAgICAgd2l0aGluIHRoaXMgcmFuZ2UuXG4iCittc2dzdHIgIiIKKyJMZSBy6Wd1bGF0ZXVyIFwiJXNcIiBlc3QgbGlicmUgZGUgY2hvaXNpciBsYSB2aXRlc3NlXG4iCisiICAgICAgICAgICAgICAgICAgZGFucyBjZXR0ZSBwbGFnZSBkZSBmculxdWVuY2VzLlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyOTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBjdXJyZW50IENQVSBmcmVxdWVuY3kgaXMgIgorbXNnc3RyICIgIGxhIGZy6XF1ZW5jZSBhY3R1ZWxsZSBkZSBjZSBDUFUgZXN0ICIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6Mjk2CisjLCBjLWZvcm1hdAorbXNnaWQgIiAoYXNzZXJ0ZWQgYnkgY2FsbCB0byBoYXJkd2FyZSkiCittc2dzdHIgIiAodulyaWZp6SBwYXIgdW4gYXBwZWwgZGlyZWN0IGR1IG1hdOlyaWVsKSIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MzA0CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgY3B1ZnJlcSBzdGF0czogIgorbXNnc3RyICIgIGRlcyBzdGF0aXN0aXF1ZSBjb25jZXJuYW50IGNwdWZyZXE6IgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0NzIKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIlVzYWdlOiBjcHVwb3dlciBmcmVxaW5mbyBbb3B0aW9uc11cbiIKK21zZ3N0ciAiVXNhZ2UgOiBjcHVmcmVxLWluZm8gW29wdGlvbnNdXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ3MyB1dGlscy9jcHVmcmVxLXNldC5jOjI2IHV0aWxzL2NwdXBvd2VyLXNldC5jOjIzCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MjIgdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIk9wdGlvbnM6XG4iCittc2dzdHIgIk9wdGlvbnMgOlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0NzQKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiAgLWUsIC0tZGVidWcgICAgICAgICAgUHJpbnRzIG91dCBkZWJ1ZyBpbmZvcm1hdGlvbiBbZGVmYXVsdF1cbiIKK21zZ3N0ciAiICAtZSwgLS1kZWJ1ZyAgICAgICAgICBBZmZpY2hlciBsZXMgaW5mb3JtYXRpb25zIGRlIGTpYm9ndWFnZVxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0NzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLWYsIC0tZnJlcSAgICAgICAgICAgR2V0IGZyZXF1ZW5jeSB0aGUgQ1BVIGN1cnJlbnRseSBydW5zIGF0LCBhY2NvcmRpbmdcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBjcHVmcmVxIGNvcmUgKlxuIgorbXNnc3RyICIiCisiICAtZiwgLS1mcmVxICAgICAgICAgICBPYnRlbmlyIGxhIGZy6XF1ZW5jZSBhY3R1ZWxsZSBkdSBDUFUgc2Vsb24gbGUgcG9pbnRcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIGRlIHZ1ZSBkdSBjb2V1ciBkdSBzeXN06G1lIGRlIGNwdWZyZXEgKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0NzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLXcsIC0taHdmcmVxICAgICAgICAgR2V0IGZyZXF1ZW5jeSB0aGUgQ1BVIGN1cnJlbnRseSBydW5zIGF0LCBieSByZWFkaW5nXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBpdCBmcm9tIGhhcmR3YXJlIChvbmx5IGF2YWlsYWJsZSB0byByb290KSAqXG4iCittc2dzdHIgIiIKKyIgIC13LCAtLWh3ZnJlcSAgICAgICAgIE9idGVuaXIgbGEgZnLpcXVlbmNlIGFjdHVlbGxlIGR1IENQVSBkaXJlY3RlbWVudCBwYXJcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIGxlIG1hdOlyaWVsIChkb2l0IOp0cmUgcm9vdCkgKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0NzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLWwsIC0taHdsaW1pdHMgICAgICAgRGV0ZXJtaW5lIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIENQVSBmcmVxdWVuY3kgIgorImFsbG93ZWQgKlxuIgorbXNnc3RyICIiCisiICAtbCwgLS1od2xpbWl0cyAgICAgICBBZmZpY2hlIGxlcyBmculxdWVuY2VzIG1pbmltYWxlcyBldCBtYXhpbWFsZXMgZHUgQ1BVICIKKyIqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4MAorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1kLCAtLWRyaXZlciAgICAgICAgIERldGVybWluZXMgdGhlIHVzZWQgY3B1ZnJlcSBrZXJuZWwgZHJpdmVyICpcbiIKK21zZ3N0ciAiICAtZCwgLS1kcml2ZXIgICAgICAgICBBZmZpY2hlIGxlIHBpbG90ZSBjcHVmcmVxIHV0aWxpc+kgKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtcCwgLS1wb2xpY3kgICAgICAgICBHZXRzIHRoZSBjdXJyZW50bHkgdXNlZCBjcHVmcmVxIHBvbGljeSAqXG4iCittc2dzdHIgIiAgLXAsIC0tcG9saWN5ICAgICAgICAgQWZmaWNoZSBsYSB0YWN0aXF1ZSBhY3R1ZWxsZSBkZSBjcHVmcmVxICpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDgyCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgLWcsIC0tZ292ZXJub3JzICAgICAgRGV0ZXJtaW5lcyBhdmFpbGFibGUgY3B1ZnJlcSBnb3Zlcm5vcnMgKlxuIgorbXNnc3RyICIiCisiICAtZywgLS1nb3Zlcm5vcnMgICAgICBBZmZpY2hlIGxlcyBy6Wd1bGF0ZXVycyBkaXNwb25pYmxlcyBkZSBjcHVmcmVxICpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDgzCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtciwgLS1yZWxhdGVkLWNwdXMgICBEZXRlcm1pbmVzIHdoaWNoIENQVXMgcnVuIGF0IHRoZSBzYW1lIGhhcmR3YXJlICIKKyJmcmVxdWVuY3kgKlxuIgorbXNnc3RyICIiCisiICAtYSwgLS1hZmZlY3RlZC1jcHVzICAgQWZmaWNoZSBxdWVscyBzb250IGxlcyBDUFVzIHF1aSBkb2l2ZW50IGNoYW5nZXIgZGVcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICBmculxdWVuY2VzIGVuIG3qbWUgdGVtcHMgKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODQKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1hLCAtLWFmZmVjdGVkLWNwdXMgIERldGVybWluZXMgd2hpY2ggQ1BVcyBuZWVkIHRvIGhhdmUgdGhlaXIgZnJlcXVlbmN5XG4iCisiICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlZCBieSBzb2Z0d2FyZSAqXG4iCittc2dzdHIgIiIKKyIgIC1hLCAtLWFmZmVjdGVkLWNwdXMgICBBZmZpY2hlIHF1ZWxzIHNvbnQgbGVzIENQVXMgcXVpIGRvaXZlbnQgY2hhbmdlciBkZVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgIGZy6XF1ZW5jZXMgZW4gbeptZSB0ZW1wcyAqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4NgorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1zLCAtLXN0YXRzICAgICAgICAgIFNob3dzIGNwdWZyZXEgc3RhdGlzdGljcyBpZiBhdmFpbGFibGVcbiIKK21zZ3N0ciAiIgorIiAgLXMsIC0tc3RhdHMgICAgICAgICAgSW5kaXF1ZSBkZXMgc3RhdGlzdGlxdWVzIGNvbmNlcm5hbnQgY3B1ZnJlcSwgc2lcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIGRpc3BvbmlibGVzXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4NworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLXksIC0tbGF0ZW5jeSAgICAgICAgRGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBsYXRlbmN5IG9uIENQVSBmcmVxdWVuY3kgIgorImNoYW5nZXMgKlxuIgorbXNnc3RyICIiCisiICAtbCwgLS1od2xpbWl0cyAgICAgICBBZmZpY2hlIGxlcyBmculxdWVuY2VzIG1pbmltYWxlcyBldCBtYXhpbWFsZXMgZHUgQ1BVICIKKyIqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4OAorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1iLCAtLWJvb3N0ICAgICAgICAgIENoZWNrcyBmb3IgdHVyYm8gb3IgYm9vc3QgbW9kZXMgICpcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLW8sIC0tcHJvYyAgICAgICAgICAgUHJpbnRzIG91dCBpbmZvcm1hdGlvbiBsaWtlIHByb3ZpZGVkIGJ5IHRoZSAvcHJvYy8iCisiY3B1ZnJlcVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlIGluIDIuNC4gYW5kIGVhcmx5IDIuNi4ga2VybmVsc1xuIgorbXNnc3RyICIiCisiICAtbywgLS1wcm9jICAgICAgICAgICBBZmZpY2hlIGxlcyBpbmZvcm1hdGlvbnMgZW4gdXRpbGlzYW50IGwnaW50ZXJmYWNlXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBmb3VybmllIHBhciAvcHJvYy9jcHVmcmVxLCBwculzZW50ZSBkYW5zIGxlcyAiCisidmVyc2lvbnNcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIDIuNCBldCBsZXMgYW5jaWVubmVzIHZlcnNpb25zIDIuNiBkdSBub3lhdVxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0OTEKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1tLCAtLWh1bWFuICAgICAgICAgIGh1bWFuLXJlYWRhYmxlIG91dHB1dCBmb3IgdGhlIC1mLCAtdywgLXMgYW5kIC15ICIKKyJwYXJhbWV0ZXJzXG4iCittc2dzdHIgIiIKKyIgIC1tLCAtLWh1bWFuICAgICAgICAgICBhZmZpY2hlIGRhbnMgdW4gZm9ybWF0IGxpc2libGUgcG91ciB1biBodW1haW5cbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICBwb3VyIGxlcyBvcHRpb25zIC1mLCAtdyBldCAtcyAoTUh6LCBHSHopXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ5MiB1dGlscy9jcHVpZGxlLWluZm8uYzoxNTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtaCwgLS1oZWxwICAgICAgICAgICBQcmludHMgb3V0IHRoaXMgc2NyZWVuXG4iCittc2dzdHIgIiAgLWgsIC0taGVscCAgICAgICAgICAgYWZmaWNoZSBsJ2FpZGUtbeltb2lyZVxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0OTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIklmIG5vIGFyZ3VtZW50IG9yIG9ubHkgdGhlIC1jLCAtLWNwdSBwYXJhbWV0ZXIgaXMgZ2l2ZW4sIGRlYnVnIG91dHB1dCBhYm91dFxuIgorImNwdWZyZXEgaXMgcHJpbnRlZCB3aGljaCBpcyB1c2VmdWwgZS5nLiBmb3IgcmVwb3J0aW5nIGJ1Z3MuXG4iCittc2dzdHIgIiIKKyJQYXIgZOlmYXV0LCBsZXMgaW5mb3JtYXRpb25zIGRlIGTpYm9ndWFnZSBzZXJvbnQgYWZmaWNo6WVzIHNpIGF1Y3VuXG4iCisiYXJndW1lbnQsIG91IGJpZW4gc2kgc2V1bGVtZW50IGwnYXJndW1lbnQgLWMgKC0tY3B1KSBlc3QgZG9ubuksIGFmaW4gZGVcbiIKKyJmYWNpbGl0ZXIgbGVzIHJhcHBvcnRzIGRlIGJvZ3VlcyBwYXIgZXhlbXBsZVxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0OTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkZvciB0aGUgYXJndW1lbnRzIG1hcmtlZCB3aXRoICosIG9taXR0aW5nIHRoZSAtYyBvciAtLWNwdSBhcmd1bWVudCBpc1xuIgorImVxdWl2YWxlbnQgdG8gc2V0dGluZyBpdCB0byB6ZXJvXG4iCittc2dzdHIgIkxlcyBhcmd1bWVudHMgYXZlYyB1biAqIHV0aWxpc2Vyb250IGxlIENQVSAwIHNpIC1jICgtLWNwdSkgZXN0IG9taXNcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NTgwCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJUaGUgYXJndW1lbnQgcGFzc2VkIHRvIHRoaXMgdG9vbCBjYW4ndCBiZSBjb21iaW5lZCB3aXRoIHBhc3NpbmcgYSAtLWNwdSAiCisiYXJndW1lbnRcbiIKK21zZ3N0ciAiQ2V0dGUgb3B0aW9uIGVzdCBpbmNvbXBhdGlibGUgYXZlYyAtLWNwdVxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo1OTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIllvdSBjYW4ndCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgLS1jcHUgcGFyYW1ldGVyIGFuZC9vclxuIgorIm1vcmUgdGhhbiBvbmUgb3V0cHV0LXNwZWNpZmljIGFyZ3VtZW50XG4iCittc2dzdHIgIiIKKyJPbiBuZSBwZXV0IGluZGlxdWVyIHBsdXMgZCd1biBwYXJhbeh0cmUgLS1jcHUsIHRvdXQgY29tbWUgbCdvbiBuZSBwZXV0XG4iCisic3DpY2lmaWVyIHBsdXMgZCd1biBhcmd1bWVudCBkZSBmb3JtYXRhZ2VcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NjAwIHV0aWxzL2NwdWZyZXEtc2V0LmM6ODIgdXRpbHMvY3B1cG93ZXItc2V0LmM6NDIKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzo0MiB1dGlscy9jcHVpZGxlLWluZm8uYzoyMTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiaW52YWxpZCBvciB1bmtub3duIGFyZ3VtZW50XG4iCittc2dzdHIgIm9wdGlvbiBpbnZhbGlkZVxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo2MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiY291bGRuJ3QgYW5hbHl6ZSBDUFUgJWQgYXMgaXQgZG9lc24ndCBzZWVtIHRvIGJlIHByZXNlbnRcbiIKK21zZ3N0ciAiYW5hbHlzZSBkdSBDUFUgJWQgaW1wb3NzaWJsZSBwdWlzcXUnaWwgbmUgc2VtYmxlIHBhcyDqdHJlIHBy6XNlbnRcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NjIwIHV0aWxzL2NwdXBvd2VyLWluZm8uYzoxNDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiYW5hbHl6aW5nIENQVSAlZDpcbiIKK21zZ3N0ciAiYW5hbHlzZSBkdSBDUFUgJWQgOlxuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjI1CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogY3B1cG93ZXIgZnJlcXVlbmN5LXNldCBbb3B0aW9uc11cbiIKK21zZ3N0ciAiVXNhZ2UgOiBjcHVmcmVxLXNldCBbb3B0aW9uc11cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzoyNworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtZCBGUkVRLCAtLW1pbiBGUkVRICAgICAgbmV3IG1pbmltdW0gQ1BVIGZyZXF1ZW5jeSB0aGUgZ292ZXJub3IgbWF5ICIKKyJzZWxlY3RcbiIKK21zZ3N0ciAiIgorIiAgLWQgRlJFUSwgLS1taW4gRlJFUSAgICAgICBub3V2ZWxsZSBmculxdWVuY2UgbWluaW1hbGUgZHUgQ1BVIOAgdXRpbGlzZXJcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyIGxlIHLpZ3VsYXRldXJcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzoyOAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtdSBGUkVRLCAtLW1heCBGUkVRICAgICAgbmV3IG1heGltdW0gQ1BVIGZyZXF1ZW5jeSB0aGUgZ292ZXJub3IgbWF5ICIKKyJzZWxlY3RcbiIKK21zZ3N0ciAiIgorIiAgLXUgRlJFUSwgLS1tYXggRlJFUSAgICAgICBub3V2ZWxsZSBmculxdWVuY2UgbWF4aW1hbGUgZHUgQ1BVIOAgdXRpbGlzZXJcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyIGxlIHLpZ3VsYXRldXJcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzoyOQorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1nIEdPViwgLS1nb3Zlcm5vciBHT1YgICBuZXcgY3B1ZnJlcSBnb3Zlcm5vclxuIgorbXNnc3RyICIgIC1nIEdPViwgLS1nb3Zlcm5vciBHT1YgICBhY3RpdmUgbGUgculndWxhdGV1ciBHT1ZcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzozMAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtZiBGUkVRLCAtLWZyZXEgRlJFUSAgICAgc3BlY2lmaWMgZnJlcXVlbmN5IHRvIGJlIHNldC4gUmVxdWlyZXMgdXNlcnNwYWNlXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgZ292ZXJub3IgdG8gYmUgYXZhaWxhYmxlIGFuZCBsb2FkZWRcbiIKK21zZ3N0ciAiIgorIiAgLWYgRlJFUSwgLS1mcmVxIEZSRVEgICAgIGZpeGUgbGEgZnLpcXVlbmNlIGR1IHByb2Nlc3NldXIg4CBGUkVRLiBJbCBmYXV0XG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlIGxlIHLpZ3VsYXRldXIgqyB1c2Vyc3BhY2UguyBzb2l0IGRpc3BvbmlibGUgXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgZXQgYWN0aXbpLlxuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjMyCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgLXIsIC0tcmVsYXRlZCAgICAgICAgICAgIFN3aXRjaGVzIGFsbCBoYXJkd2FyZS1yZWxhdGVkIENQVXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjMzIHV0aWxzL2NwdXBvd2VyLXNldC5jOjI4IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoyNworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiICAtaCwgLS1oZWxwICAgICAgICAgICAgICAgUHJpbnRzIG91dCB0aGlzIHNjcmVlblxuIgorbXNnc3RyICIgIC1oLCAtLWhlbHAgICAgICAgICAgIGFmZmljaGUgbCdhaWRlLW3pbW9pcmVcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzozNQorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiIgorIk5vdGVzOlxuIgorIjEuIE9taXR0aW5nIHRoZSAtYyBvciAtLWNwdSBhcmd1bWVudCBpcyBlcXVpdmFsZW50IHRvIHNldHRpbmcgaXQgdG8gXCJhbGxcIlxuIgorbXNnc3RyICJMZXMgYXJndW1lbnRzIGF2ZWMgdW4gKiB1dGlsaXNlcm9udCBsZSBDUFUgMCBzaSAtYyAoLS1jcHUpIGVzdCBvbWlzXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzcKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiIKKyIyLiBUaGUgLWYgRlJFUSwgLS1mcmVxIEZSRVEgcGFyYW1ldGVyIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIGFueSBvdGhlciAiCisicGFyYW1ldGVyXG4iCisiICAgZXhjZXB0IHRoZSAtYyBDUFUsIC0tY3B1IENQVSBwYXJhbWV0ZXJcbiIKKyIzLiBGUkVRdWVuY2llcyBjYW4gYmUgcGFzc2VkIGluIEh6LCBrSHogKGRlZmF1bHQpLCBNSHosIEdIeiwgb3IgVEh6XG4iCisiICAgYnkgcG9zdGZpeGluZyB0aGUgdmFsdWUgd2l0aCB0aGUgd2FudGVkIHVuaXQgbmFtZSwgd2l0aG91dCBhbnkgc3BhY2VcbiIKKyIgICAoRlJFUXVlbmN5IGluIGtIeiA9XiBIeiAqIDAuMDAxID1eIE1IeiAqIDEwMDAgPV4gR0h6ICogMTAwMDAwMCkuXG4iCittc2dzdHIgIiIKKyJSZW1hcnF1ZSA6XG4iCisiMS4gTGUgQ1BVIG51belybyAwIHNlcmEgdXRpbGlz6SBwYXIgZOlmYXV0IHNpIC1jIChvdSAtLWNwdSkgZXN0IG9taXMgO1xuIgorIjIuIGwnYXJndW1lbnQgLWYgRlJFUSAob3UgLS1mcmVxIEZSRVEpIG5lIHBldXQg6nRyZSB1dGlsaXPpIHF1J2F2ZWMgLS1jcHUgO1xuIgorIjMuIG9uIHBvdXJyYSBwculjaXNlciBsJ3VuaXTpIGRlcyBmculxdWVuY2VzIGVuIHBvc3RmaXhhbnQgc2FucyBhdWN1bmUgIgorImVzcGFjZVxuIgorIiAgIGxlcyB2YWxldXJzIHBhciBoeiwga0h6IChwYXIgZOlmYXV0KSwgTUh6LCBHSHogb3UgVEh6XG4iCisiICAgKGtIeiA9XiBIeiAqIDAuMDAxID1eIE1IeiAqIDEwMDAgPV4gR0h6ICogMTAwMDAwMCkuXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6NTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkVycm9yIHNldHRpbmcgbmV3IHZhbHVlcy4gQ29tbW9uIGVycm9yczpcbiIKKyItIERvIHlvdSBoYXZlIHByb3BlciBhZG1pbmlzdHJhdGlvbiByaWdodHM/IChzdXBlci11c2VyPylcbiIKKyItIElzIHRoZSBnb3Zlcm5vciB5b3UgcmVxdWVzdGVkIGF2YWlsYWJsZSBhbmQgbW9kcHJvYmVkP1xuIgorIi0gVHJ5aW5nIHRvIHNldCBhbiBpbnZhbGlkIHBvbGljeT9cbiIKKyItIFRyeWluZyB0byBzZXQgYSBzcGVjaWZpYyBmcmVxdWVuY3ksIGJ1dCB1c2Vyc3BhY2UgZ292ZXJub3IgaXMgbm90ICIKKyJhdmFpbGFibGUsXG4iCisiICAgZm9yIGV4YW1wbGUgYmVjYXVzZSBvZiBoYXJkd2FyZSB3aGljaCBjYW5ub3QgYmUgc2V0IHRvIGEgc3BlY2lmaWMgIgorImZyZXF1ZW5jeVxuIgorIiAgIG9yIGJlY2F1c2UgdGhlIHVzZXJzcGFjZSBnb3Zlcm5vciBpc24ndCBsb2FkZWQ/XG4iCittc2dzdHIgIiIKKyJFbiBhanVzdGFudCBsZXMgbm91dmVhdXggcGFyYW3odHJlcywgdW5lIGVycmV1ciBlc3QgYXBwYXJ1ZS4gTGVzIHNvdXJjZXNcbiIKKyJkJ2VycmV1ciB0eXBpcXVlIHNvbnQgOlxuIgorIi0gZHJvaXQgZCdhZG1pbmlzdHJhdGlvbiBpbnN1ZmZpc2FudCAo6nRlcy12b3VzIHJvb3QgPykgO1xuIgorIi0gbGUgculndWxhdGV1ciBjaG9pc2kgbidlc3QgcGFzIGRpc3BvbmlibGUsIG91IGJpZW4gbidlc3QgcGFzIGRpc3BvbmlibGUgIgorImVuXG4iCisiICB0YW50IHF1ZSBtb2R1bGUgbm95YXUgO1xuIgorIi0gbGEgdGFjdGlxdWUgbidlc3QgcGFzIGRpc3BvbmlibGUgO1xuIgorIi0gdm91cyB2b3VsZXogdXRpbGlzZXIgbCdvcHRpb24gLWYvLS1mcmVxLCBtYWlzIGxlIHLpZ3VsYXRldXIgqyB1c2Vyc3BhY2Ugu1xuIgorIiAgbidlc3QgcGFzIGRpc3BvbmlibGUsIHBhciBleGVtcGxlIHBhcmNlIHF1ZSBsZSBtYXTpcmllbCBuZSBsZSBzdXBwb3J0ZVxuIgorIiAgcGFzLCBvdSBiaWVuIG4nZXN0IHRvdXQgc2ltcGxlbWVudCBwYXMgY2hhcmfpLlxuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjE3MAorIywgYy1mb3JtYXQKK21zZ2lkICJ3cm9uZywgdW5rbm93biBvciB1bmhhbmRsZWQgQ1BVP1xuIgorbXNnc3RyICJDUFUgaW5jb25udSBvdSBub24gc3VwcG9ydOkgP1xuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjMwMgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisidGhlIC1mLy0tZnJlcSBwYXJhbWV0ZXIgY2Fubm90IGJlIGNvbWJpbmVkIHdpdGggLWQvLS1taW4sIC11Ly0tbWF4IG9yXG4iCisiLWcvLS1nb3Zlcm5vciBwYXJhbWV0ZXJzXG4iCittc2dzdHIgIiIKKyJsJ29wdGlvbiAtZi8tLWZyZXEgZXN0IGluY29tcGF0aWJsZSBhdmVjIGxlcyBvcHRpb25zIC1kLy0tbWluLCAtdS8tLW1heCBldFxuIgorIi1nLy0tZ292ZXJub3JcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzozMDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgb3V0IG9mIC1mLy0tZnJlcSwgLWQvLS1taW4sIC11Ly0tbWF4LCBhbmRcbiIKKyItZy8tLWdvdmVybm9yIG11c3QgYmUgcGFzc2VkXG4iCittc2dzdHIgIiIKKyJMJ3VuIGRlIGNlcyBwYXJhbeh0cmVzIGVzdCBvYmxpZ2F0b2lyZSA6IC1mLy0tZnJlcSwgLWQvLS1taW4sIC11Ly0tbWF4IGV0XG4iCisiLWcvLS1nb3Zlcm5vclxuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjM0NworIywgYy1mb3JtYXQKK21zZ2lkICJTZXR0aW5nIGNwdTogJWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzoyMgorIywgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogY3B1cG93ZXIgc2V0IFsgLWIgdmFsIF0gWyAtbSB2YWwgXSBbIC1zIHZhbCBdXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6MjQKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLWIsIC0tcGVyZi1iaWFzIFtWQUxdICAgIFNldHMgQ1BVJ3MgcG93ZXIgdnMgcGVyZm9ybWFuY2UgcG9saWN5IG9uIHNvbWVcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBtb2RlbHMgWzAtMTVdLCBzZWUgbWFucGFnZSBmb3IgZGV0YWlsc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjI2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1tLCAtLXNjaGVkLW1jICBbVkFMXSAgICBTZXRzIHRoZSBrZXJuZWwncyBtdWx0aSBjb3JlIHNjaGVkdWxlciBwb2xpY3kuXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6MjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLXMsIC0tc2NoZWQtc210IFtWQUxdICAgIFNldHMgdGhlIGtlcm5lbCdzIHRocmVhZCBzaWJsaW5nIHNjaGVkdWxlciAiCisicG9saWN5LlxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjgwCisjLCBjLWZvcm1hdAorbXNnaWQgIi0tcGVyZi1iaWFzIHBhcmFtIG91dCBvZiByYW5nZSBbMC0lZF1cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzo5MQorIywgYy1mb3JtYXQKK21zZ2lkICItLXNjaGVkLW1jIHBhcmFtIG91dCBvZiByYW5nZSBbMC0lZF1cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzoxMDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiLS1zY2hlZC1zbXQgcGFyYW0gb3V0IG9mIHJhbmdlIFswLSVkXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjEyMQorIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciBzZXR0aW5nIHNjaGVkLW1jICVzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6MTI3CisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHNldHRpbmcgc2NoZWQtc210ICVzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6MTQ2CisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHNldHRpbmcgcGVyZi1iaWFzIHZhbHVlIG9uIENQVSAlZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoyMQorIywgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogY3B1cG93ZXIgaW5mbyBbIC1iIF0gWyAtbSBdIFsgLXMgXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoyMworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtYiwgLS1wZXJmLWJpYXMgICAgR2V0cyBDUFUncyBwb3dlciB2cyBwZXJmb3JtYW5jZSBwb2xpY3kgb24gc29tZVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIG1vZGVscyBbMC0xNV0sIHNlZSBtYW5wYWdlIGZvciBkZXRhaWxzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjI1CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIgIC1tLCAtLXNjaGVkLW1jICAgICBHZXRzIHRoZSBrZXJuZWwncyBtdWx0aSBjb3JlIHNjaGVkdWxlciBwb2xpY3kuXG4iCittc2dzdHIgIiAgLXAsIC0tcG9saWN5ICAgICAgICAgQWZmaWNoZSBsYSB0YWN0aXF1ZSBhY3R1ZWxsZSBkZSBjcHVmcmVxICpcbiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjI2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1zLCAtLXNjaGVkLXNtdCAgICBHZXRzIHRoZSBrZXJuZWwncyB0aHJlYWQgc2libGluZyBzY2hlZHVsZXIgcG9saWN5LlxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoyOAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiUGFzc2luZyBubyBvcHRpb24gd2lsbCBzaG93IGFsbCBpbmZvLCBieSBkZWZhdWx0IG9ubHkgb24gY29yZSAwXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjEwMgorIywgYy1mb3JtYXQKK21zZ2lkICJTeXN0ZW0ncyBtdWx0aSBjb3JlIHNjaGVkdWxlciBzZXR0aW5nOiAiCittc2dzdHIgIiIKKworIy4gaWYgc3lzZnMgZmlsZSBpcyBtaXNzaW5nIGl0J3M6IGVycm5vID09IEVOT0VOVAorIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjEwNSB1dGlscy9jcHVwb3dlci1pbmZvLmM6MTE0CisjLCBjLWZvcm1hdAorbXNnaWQgIm5vdCBzdXBwb3J0ZWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MTExCisjLCBjLWZvcm1hdAorbXNnaWQgIlN5c3RlbSdzIHRocmVhZCBzaWJsaW5nIHNjaGVkdWxlciBzZXR0aW5nOiAiCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjEyNgorIywgYy1mb3JtYXQKK21zZ2lkICJJbnRlbCdzIHBlcmZvcm1hbmNlIGJpYXMgc2V0dGluZyBuZWVkcyByb290IHByaXZpbGVnZXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MTI4CisjLCBjLWZvcm1hdAorbXNnaWQgIlN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IEludGVsJ3MgcGVyZm9ybWFuY2UgYmlhcyBzZXR0aW5nXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjE0NworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgcmVhZCBwZXJmLWJpYXMgdmFsdWVcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MTUwCisjLCBjLWZvcm1hdAorbXNnaWQgInBlcmYtYmlhczogJWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoyOAorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQW5hbHl6aW5nIENQVSAlZDpcbiIKK21zZ3N0ciAiYW5hbHlzZSBkdSBDUFUgJWQgOlxuIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzozMgorIywgYy1mb3JtYXQKK21zZ2lkICJDUFUgJXU6IE5vIGlkbGUgc3RhdGVzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MzYKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ1BVICV1OiBDYW4ndCByZWFkIGlkbGUgc3RhdGUgaW5mb1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjQxCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkZXRlcm1pbmUgbWF4IGlkbGUgc3RhdGUgJXVcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo0NgorIywgYy1mb3JtYXQKK21zZ2lkICJOdW1iZXIgb2YgaWRsZSBzdGF0ZXM6ICVkXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6NDgKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkF2YWlsYWJsZSBpZGxlIHN0YXRlczoiCittc2dzdHIgIiAgcGxhZ2UgZGUgZnLpcXVlbmNlIDogIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo3MQorIywgYy1mb3JtYXQKK21zZ2lkICJGbGFncy9EZXNjcmlwdGlvbjogJXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo3NAorIywgYy1mb3JtYXQKK21zZ2lkICJMYXRlbmN5OiAlbHVcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo3NgorIywgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogJWx1XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6NzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRHVyYXRpb246ICVsbHVcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo5MAorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZGV0ZXJtaW5lIGNwdWlkbGUgZHJpdmVyXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6OTQKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNQVWlkbGUgZHJpdmVyOiAlc1xuIgorbXNnc3RyICIgIHBpbG90ZSA6ICVzXG4iCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjk5CisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkZXRlcm1pbmUgY3B1aWRsZSBnb3Zlcm5vclxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEwMworIywgYy1mb3JtYXQKK21zZ2lkICJDUFVpZGxlIGdvdmVybm9yOiAlc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEyMgorIywgYy1mb3JtYXQKK21zZ2lkICJDUFUgJXU6IENhbid0IHJlYWQgQy1zdGF0ZSBpbmZvXG4iCittc2dzdHIgIiIKKworIy4gcHJpbnRmKCJDc3RhdGVzOiAlZFxuIiwgY3N0YXRlcyk7CisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiYWN0aXZlIHN0YXRlOiAgICAgICAgICAgIEMwXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTI4CisjLCBjLWZvcm1hdAorbXNnaWQgIm1heF9jc3RhdGU6ICAgICAgICAgICAgICBDJXVcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMjkKKyMsIGMtZm9ybWF0Cittc2dpZCAibWF4aW11bSBhbGxvd2VkIGxhdGVuY3k6ICVsdSB1c2VjXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTMwCisjLCBjLWZvcm1hdAorbXNnaWQgInN0YXRlczpcdFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEzMgorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgQyVkOiAgICAgICAgICAgICAgICAgIHR5cGVbQyVkXSAiCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTM0CisjLCBjLWZvcm1hdAorbXNnaWQgInByb21vdGlvblstLV0gZGVtb3Rpb25bLS1dICIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMzUKKyMsIGMtZm9ybWF0Cittc2dpZCAibGF0ZW5jeVslMDNsdV0gIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEzNworIywgYy1mb3JtYXQKK21zZ2lkICJ1c2FnZVslMDhsdV0gIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEzOQorIywgYy1mb3JtYXQKK21zZ2lkICJkdXJhdGlvblslMDIwTHVdIFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjE0NworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiVXNhZ2U6IGNwdXBvd2VyIGlkbGVpbmZvIFtvcHRpb25zXVxuIgorbXNnc3RyICJVc2FnZSA6IGNwdWZyZXEtaW5mbyBbb3B0aW9uc11cbiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTQ5CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIgIC1zLCAtLXNpbGVudCAgICAgICAgIE9ubHkgc2hvdyBnZW5lcmFsIEMtc3RhdGUgaW5mb3JtYXRpb25cbiIKK21zZ3N0ciAiICAtZSwgLS1kZWJ1ZyAgICAgICAgICBBZmZpY2hlciBsZXMgaW5mb3JtYXRpb25zIGRlIGTpYm9ndWFnZVxuIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxNTAKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1vLCAtLXByb2MgICAgICAgICAgIFByaW50cyBvdXQgaW5mb3JtYXRpb24gbGlrZSBwcm92aWRlZCBieSB0aGUgL3Byb2MvIgorImFjcGkvcHJvY2Vzc29yLyovcG93ZXJcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZSBpbiBvbGRlciBrZXJuZWxzXG4iCittc2dzdHIgIiIKKyIgIC1vLCAtLXByb2MgICAgICAgICAgIEFmZmljaGUgbGVzIGluZm9ybWF0aW9ucyBlbiB1dGlsaXNhbnQgbCdpbnRlcmZhY2VcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIGZvdXJuaWUgcGFyIC9wcm9jL2NwdWZyZXEsIHBy6XNlbnRlIGRhbnMgbGVzICIKKyJ2ZXJzaW9uc1xuIgorIiAgICAgICAgICAgICAgICAgICAgICAgMi40IGV0IGxlcyBhbmNpZW5uZXMgdmVyc2lvbnMgMi42IGR1IG5veWF1XG4iCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjIwOQorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiWW91IGNhbid0IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSBvdXRwdXQtc3BlY2lmaWMgYXJndW1lbnRcbiIKK21zZ3N0ciAiIgorIk9uIG5lIHBldXQgaW5kaXF1ZXIgcGx1cyBkJ3VuIHBhcmFt6HRyZSAtLWNwdSwgdG91dCBjb21tZSBsJ29uIG5lIHBldXRcbiIKKyJzcOljaWZpZXIgcGx1cyBkJ3VuIGFyZ3VtZW50IGRlIGZvcm1hdGFnZVxuIgorCisjfiBtc2dpZCAiIgorI34gIiAgLWMgQ1BVLCAtLWNwdSBDUFUgICAgQ1BVIG51bWJlciB3aGljaCBpbmZvcm1hdGlvbiBzaGFsbCBiZSBkZXRlcm1pbmVkICIKKyN+ICJhYm91dFxuIgorI34gbXNnc3RyICIiCisjfiAiICAtYyBDUFUsIC0tY3B1IENQVSAgICBOdW3pcm8gZHUgQ1BVIHBvdXIgbGVxdWVsIGwnaW5mb3JtYXRpb24gc2VyYSAiCisjfiAiYWZmaWNo6WVcbiIKKworI34gbXNnaWQgIiIKKyN+ICIgIC1jIENQVSwgLS1jcHUgQ1BVICAgICAgICBudW1iZXIgb2YgQ1BVIHdoZXJlIGNwdWZyZXEgc2V0dGluZ3Mgc2hhbGwgYmUgIgorI34gIm1vZGlmaWVkXG4iCisjfiBtc2dzdHIgIiIKKyN+ICIgIC1jIENQVSwgLS1jcHUgQ1BVICAgICAgICBudW3pcm8gZHUgQ1BVIOAgcHJlbmRyZSBlbiBjb21wdGUgcG91ciBsZXNcbiIKKyN+ICIgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VtZW50c1xuIgpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvcG8vaXQucG8gYi90b29scy9wb3dlci9jcHVwb3dlci9wby9pdC5wbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODBjNGRkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvcG8vaXQucG8KQEAgLTAsMCArMSw5NjEgQEAKKyMgSXRhbGlhbiB0cmFuc2xhdGlvbnMgZm9yIGNwdWZyZXF1dGlscyBwYWNrYWdlCisjIENvcHlyaWdodCAoQykgMjAwNC0yMDA5CisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSBjcHVmcmVxdXRpbHMgcGFja2FnZS4KKyMgTWF0dGlhIERvbmdpbGkgPG1hbGF0dGlhQGdtYWlsLmNvbT4uCisjCisjCittc2dpZCAiIgorbXNnc3RyICIiCisiUHJvamVjdC1JZC1WZXJzaW9uOiBjcHVmcmVxdXRpbHMgMC4zXG4iCisiUmVwb3J0LU1zZ2lkLUJ1Z3MtVG86IFxuIgorIlBPVC1DcmVhdGlvbi1EYXRlOiAyMDExLTAzLTA4IDE3OjAzKzAxMDBcbiIKKyJQTy1SZXZpc2lvbi1EYXRlOiAyMDA5LTA4LTE1IDEyOjAwKzA5MDBcbiIKKyJMYXN0LVRyYW5zbGF0b3I6IE1hdHRpYSBEb25naWxpIDxtYWxhdHRpYUBnbWFpbC5jb20+XG4iCisiTGFuZ3VhZ2UtVGVhbTogTk9ORVxuIgorIkxhbmd1YWdlOiBcbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL25obV9pZGxlLmM6MzYKK21zZ2lkICJQcm9jZXNzb3IgQ29yZSBDMyIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvbmhtX2lkbGUuYzo0MworbXNnaWQgIlByb2Nlc3NvciBDb3JlIEM2IgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9uaG1faWRsZS5jOjUxCittc2dpZCAiUHJvY2Vzc29yIFBhY2thZ2UgQzMiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL25obV9pZGxlLmM6NTggdXRpbHMvaWRsZV9tb25pdG9yL2FtZF9mYW0xNGhfaWRsZS5jOjcwCittc2dpZCAiUHJvY2Vzc29yIFBhY2thZ2UgQzYiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL3NuYl9pZGxlLmM6MzMKK21zZ2lkICJQcm9jZXNzb3IgQ29yZSBDNyIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3Ivc25iX2lkbGUuYzo0MAorbXNnaWQgIlByb2Nlc3NvciBQYWNrYWdlIEMyIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9zbmJfaWRsZS5jOjQ3Cittc2dpZCAiUHJvY2Vzc29yIFBhY2thZ2UgQzciCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2FtZF9mYW0xNGhfaWRsZS5jOjU2Cittc2dpZCAiUGFja2FnZSBpbiBzbGVlcCBzdGF0ZSAoUEMxIG9yIGRlZXBlcikiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2FtZF9mYW0xNGhfaWRsZS5jOjYzCittc2dpZCAiUHJvY2Vzc29yIFBhY2thZ2UgQzEiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2FtZF9mYW0xNGhfaWRsZS5jOjc3Cittc2dpZCAiTm9ydGggQnJpZGdlIFAxIGJvb2xlYW4gY291bnRlciAocmV0dXJucyAwIG9yIDEpIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9tcGVyZl9tb25pdG9yLmM6MzUKK21zZ2lkICJQcm9jZXNzb3IgQ29yZSBub3QgaWRsZSIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvbXBlcmZfbW9uaXRvci5jOjQyCittc2dpZCAiUHJvY2Vzc29yIENvcmUgaW4gYW4gaWRsZSBzdGF0ZSIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvbXBlcmZfbW9uaXRvci5jOjUwCittc2dpZCAiQXZlcmFnZSBGcmVxdWVuY3kgKGluY2x1ZGluZyBib29zdCkgaW4gTUh6IgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorImNwdXBvd2VyIG1vbml0b3I6IFstaF0gWyBbLXRdIHwgWy1sXSB8IFstbSA8bW9uMT4sWzxtb24yPl0gXSBdIFstaSAiCisiaW50ZXJ2YWxfc2VjIHwgLWMgY29tbWFuZCAuLi5dXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo2OQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiY3B1cG93ZXIgbW9uaXRvcjogWy12XSBbLWhdIFsgWy10XSB8IFstbF0gfCBbLW0gPG1vbjE+LFs8bW9uMj5dIF0gXSBbLWkgIgorImludGVydmFsX3NlYyB8IC1jIGNvbW1hbmQgLi4uXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiXHQgLXY6IGJlIG1vcmUgdmVyYm9zZVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiXHQgLWg6IHByaW50IHRoaXMgaGVscFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiXHQgLWk6IHRpbWUgaW50ZXJ2YWxsIHRvIG1lYXN1cmUgZm9yIGluIHNlY29uZHMgKGRlZmF1bHQgMSlcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjc1CisjLCBjLWZvcm1hdAorbXNnaWQgIlx0IC10OiBzaG93IENQVSB0b3BvbG9neS9oaWVyYXJjaHlcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjc2CisjLCBjLWZvcm1hdAorbXNnaWQgIlx0IC1sOiBsaXN0IGF2YWlsYWJsZSBDUFUgc2xlZXAgbW9uaXRvcnMgKGZvciB1c2Ugd2l0aCAtbSlcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjc3CisjLCBjLWZvcm1hdAorbXNnaWQgIlx0IC1tOiBzaG93IHNwZWNpZmljIENQVSBzbGVlcCBtb25pdG9ycyBvbmx5IChpbiBzYW1lIG9yZGVyKVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIm9ubHkgb25lIG9mOiAtdCwgLWwsIC1tIGFyZSBhbGxvd2VkXG4iCisiSWYgbm9uZSBvZiB0aGVtIGlzIHBhc3NlZCwiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo4MAorIywgYy1mb3JtYXQKK21zZ2lkICIgYWxsIHN1cHBvcnRlZCBtb25pdG9ycyBhcmUgc2hvd25cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjE5NworIywgYy1mb3JtYXQKK21zZ2lkICJNb25pdG9yICVzLCBDb3VudGVyICVzIGhhcyBubyBjb3VudCBmdW5jdGlvbi4gSW1wbGVtZW50YXRpb24gZXJyb3JcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjIwNworIywgYy1mb3JtYXQKK21zZ2lkICIgKmlzIG9mZmxpbmVcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjIzNgorIywgYy1mb3JtYXQKK21zZ2lkICIlczogbWF4IG1vbml0b3IgbmFtZSBsZW5ndGggKCVkKSBleGNlZWRlZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6MjUwCisjLCBjLWZvcm1hdAorbXNnaWQgIk5vIG1hdGNoaW5nIG1vbml0b3IgZm91bmQgaW4gJXMsIHRyeSAtbCBvcHRpb25cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjI2NgorIywgYy1mb3JtYXQKK21zZ2lkICJNb25pdG9yIFwiJXNcIiAoJWQgc3RhdGVzKSAtIE1pZ2h0IG92ZXJmbG93IGFmdGVyICV1IHNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjMxOQorIywgYy1mb3JtYXQKK21zZ2lkICIlcyB0b29rICUuNWYgc2Vjb25kcyBhbmQgZXhpdGVkIHdpdGggc3RhdHVzICVkXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo0MDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IHJlYWQgbnVtYmVyIG9mIGF2YWlsYWJsZSBwcm9jZXNzb3JzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo0MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiQXZhaWxhYmxlIG1vbml0b3IgJXMgbmVlZHMgcm9vdCBhY2Nlc3NcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjQyOAorIywgYy1mb3JtYXQKK21zZ2lkICJObyBIVyBDc3RhdGUgbW9uaXRvcnMgZm91bmRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjc4CisjLCBjLWZvcm1hdAorbXNnaWQgImNwdXBvd2VyIFsgLWMgY3B1bGlzdCBdIHN1YmNvbW1hbmQgW0FSR1NdXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzo3OQorIywgYy1mb3JtYXQKK21zZ2lkICJjcHVwb3dlciAtLXZlcnNpb25cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjgwCisjLCBjLWZvcm1hdAorbXNnaWQgIlN1cHBvcnRlZCBzdWJjb21tYW5kcyBhcmU6XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzo4MworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiU29tZSBzdWJjb21tYW5kcyBjYW4gbWFrZSB1c2Ugb2YgdGhlIC1jIGNwdWxpc3Qgb3B0aW9uLlxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLmM6ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiTG9vayBhdCB0aGUgZ2VuZXJhbCBjcHVwb3dlciBtYW5wYWdlIGhvdyB0byB1c2UgaXRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjg1CisjLCBjLWZvcm1hdAorbXNnaWQgImFuZCByZWFkIHVwIHRoZSBzdWJjb21tYW5kJ3MgbWFucGFnZSB3aGV0aGVyIGl0IGlzIHN1cHBvcnRlZC5cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjg2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyJVc2UgY3B1cG93ZXIgaGVscCBzdWJjb21tYW5kIGZvciBnZXR0aW5nIGhlbHAgZm9yIGFib3ZlIHN1YmNvbW1hbmRzLlxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLmM6OTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVwb3J0IGVycm9ycyBhbmQgYnVncyB0byAlcywgcGxlYXNlLlxuIgorbXNnc3RyICJQZXIgZmF2b3JlLCBjb211bmljYXJlIGVycm9yaSBlIG1hbGZ1bnppb25hbWVudGkgYSAlcy5cbiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzoxMTQKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3IgcGFyc2luZyBjcHUgbGlzdFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLmM6MTcyCisjLCBjLWZvcm1hdAorbXNnaWQgIlN1YmNvbW1hbmQgJXMgbmVlZHMgcm9vdCBwcml2aWxlZ2VzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ291bGRuJ3QgY291bnQgdGhlIG51bWJlciBvZiBDUFVzICglczogJXMpLCBhc3N1bWluZyAxXG4iCittc2dzdHIgIkltcG9zc2liaWxlIGRldGVybWluYXJlIGlsIG51bWVybyBkaSBDUFUgKCVzOiAlcyksIGFzc3VtbyBzaWEgMVxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo2MworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAgICAgICAgIG1pbmltdW0gQ1BVIGZyZXF1ZW5jeSAgLSAgbWF4aW11bSBDUFUgZnJlcXVlbmN5ICAtICBnb3Zlcm5vclxuIgorbXNnc3RyICIiCisiICAgICAgICAgIGZyZXF1ZW56YSBtaW5pbWEgQ1BVICAgLSAgZnJlcXVlbnphIG1hc3NpbWEgQ1BVICAtICBnZXN0b3JlXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE1MQorIywgYy1mb3JtYXQKK21zZ2lkICJFcnJvciB3aGlsZSBldmFsdWF0aW5nIEJvb3N0IENhcGFiaWxpdGllcyBvbiBDUFUgJWQgLS0gYXJlIHlvdSByb290P1xuIgorbXNnc3RyICIiCisKKyMuIFAgc3RhdGUgY2hhbmdlcyB2aWEgTVNSIGFyZSBpZGVudGlmaWVkIHZpYSBjcHVpZCA4MDAwMDAwNworIy4gb24gSW50ZWwgYW5kIEFNRCwgYnV0IHdlIGFzc3VtZSBib29zdCBjYXBhYmxlIG1hY2hpbmVzIGNhbiBkbyB0aGF0CisjLiBpZiAoY3B1aWRfZWF4KDB4ODAwMDAwMDApID49IDB4ODAwMDAwMDcKKyMuICYmIChjcHVpZF9lZHgoMHg4MDAwMDAwNykgJiAoMSA8PCA3KSkpCisjLgorIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTYxCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgYm9vc3Qgc3RhdGUgc3VwcG9ydDogXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTYzCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgICBTdXBwb3J0ZWQ6ICVzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTYzIHV0aWxzL2NwdWZyZXEtaW5mby5jOjE2NAorbXNnaWQgInllcyIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxNjMgdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTY0Cittc2dpZCAibm8iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTY0CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIgICAgQWN0aXZlOiAlc1xuIgorbXNnc3RyICIgIG1vZHVsbyAlc1xuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxNzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgIEJvb3N0IFN0YXRlczogJWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxNzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgIFRvdGFsIFN0YXRlczogJWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxODEKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAgIFBzdGF0ZS1QYiVkOiAlbHVNSHogKGJvb3N0IHN0YXRlKVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE4NAorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgUHN0YXRlLVAlZDogICVsdU1IelxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjIxMQorIywgYy1mb3JtYXQKK21zZ2lkICIgIG5vIG9yIHVua25vd24gY3B1ZnJlcSBkcml2ZXIgaXMgYWN0aXZlIG9uIHRoaXMgQ1BVXG4iCittc2dzdHIgIiAgbmVzc3VuIG1vZHVsbyBvIG1vZHVsbyBjcHVmcmVxIHNjb25vc2NpdXRvIHBlciBxdWVzdGEgQ1BVXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjIxMworIywgYy1mb3JtYXQKK21zZ2lkICIgIGRyaXZlcjogJXNcbiIKK21zZ3N0ciAiICBtb2R1bG8gJXNcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjE5CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgQ1BVcyB3aGljaCBydW4gYXQgdGhlIHNhbWUgaGFyZHdhcmUgZnJlcXVlbmN5OiAiCittc2dzdHIgIiAgQ1BVIGNoZSBvcGVyYW5vIGFsbGEgc3Rlc3NhIGZyZXF1ZW56YSBoYXJkd2FyZTogIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyMzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBDUFVzIHdoaWNoIG5lZWQgdG8gaGF2ZSB0aGVpciBmcmVxdWVuY3kgY29vcmRpbmF0ZWQgYnkgc29mdHdhcmU6ICIKK21zZ3N0ciAiICBDUFUgY2hlIMOoIG5lY2Vzc2FyaW8gc2lhbm8gY29vcmRpbmF0ZSBkYWwgc29mdHdhcmU6ICIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjQxCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgbWF4aW11bSB0cmFuc2l0aW9uIGxhdGVuY3k6ICIKK21zZ3N0ciAiICBsYXRlbnphIG1hc3NpbWEgZHVyYW50ZSBsYSB0cmFuc2l6aW9uZTogIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyNDcKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBoYXJkd2FyZSBsaW1pdHM6ICIKK21zZ3N0ciAiICBsaW1pdGkgaGFyZHdhcmU6ICIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjU2CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgYXZhaWxhYmxlIGZyZXF1ZW5jeSBzdGVwczogIgorbXNnc3RyICIgIGZyZXF1ZW56ZSBkaXNwb25pYmlsaTogIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyNjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBhdmFpbGFibGUgY3B1ZnJlcSBnb3Zlcm5vcnM6ICIKK21zZ3N0ciAiICBnZXN0b3JpIGRpc3BvbmliaWxpOiAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjI4MAorIywgYy1mb3JtYXQKK21zZ2lkICIgIGN1cnJlbnQgcG9saWN5OiBmcmVxdWVuY3kgc2hvdWxkIGJlIHdpdGhpbiAiCittc2dzdHIgIiAgZ2VzdG9yZSBhdHR1YWxlOiBsYSBmcmVxdWVuemEgZGV2ZSBtYW50ZW5lcnNpIHRyYSAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjI4MgorIywgYy1mb3JtYXQKK21zZ2lkICIgYW5kICIKK21zZ3N0ciAiIGUgIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlRoZSBnb3Zlcm5vciBcIiVzXCIgbWF5IGRlY2lkZSB3aGljaCBzcGVlZCB0byB1c2VcbiIKKyIgICAgICAgICAgICAgICAgICB3aXRoaW4gdGhpcyByYW5nZS5cbiIKK21zZ3N0ciAiIgorIiBJbCBnZXN0b3JlIFwiJXNcIiBwdcOyIGRlY2lkZXJlIHF1YWxlIHZlbG9jaXTDoCB1c2FyZVxuIgorIiAgICAgICAgICAgICAgICAgIGluIHF1ZXN0byBpbnRlcnZhbGxvLlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyOTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBjdXJyZW50IENQVSBmcmVxdWVuY3kgaXMgIgorbXNnc3RyICIgIGxhIGZyZXF1ZW56YSBhdHR1YWxlIGRlbGxhIENQVSDDqCAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjI5NgorIywgYy1mb3JtYXQKK21zZ2lkICIgKGFzc2VydGVkIGJ5IGNhbGwgdG8gaGFyZHdhcmUpIgorbXNnc3RyICIgKG90dGVudXRhIGRhIHVuYSBjaGlhbWF0YSBkaXJldHRhIGFsbCdoYXJkd2FyZSkiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjMwNAorIywgYy1mb3JtYXQKK21zZ2lkICIgIGNwdWZyZXEgc3RhdHM6ICIKK21zZ3N0ciAiIHN0YXRpc3RpY2hlIGNwdWZyZXE6IgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0NzIKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIlVzYWdlOiBjcHVwb3dlciBmcmVxaW5mbyBbb3B0aW9uc11cbiIKK21zZ3N0ciAiVXNvOiBjcHVmcmVxLWluZm8gW29wemlvbmldXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ3MyB1dGlscy9jcHVmcmVxLXNldC5jOjI2IHV0aWxzL2NwdXBvd2VyLXNldC5jOjIzCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MjIgdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTQ4CisjLCBjLWZvcm1hdAorbXNnaWQgIk9wdGlvbnM6XG4iCittc2dzdHIgIk9wemlvbmk6XG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ3NAorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiICAtZSwgLS1kZWJ1ZyAgICAgICAgICBQcmludHMgb3V0IGRlYnVnIGluZm9ybWF0aW9uIFtkZWZhdWx0XVxuIgorbXNnc3RyICIgIC1lLCAtLWRlYnVnICAgICAgICAgIE1vc3RyYSBpbmZvcm1hemlvbmkgZGkgZGVidWdcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDc1CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1mLCAtLWZyZXEgICAgICAgICAgIEdldCBmcmVxdWVuY3kgdGhlIENQVSBjdXJyZW50bHkgcnVucyBhdCwgYWNjb3JkaW5nXG4iCisiICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgY3B1ZnJlcSBjb3JlICpcbiIKK21zZ3N0ciAiIgorIiAgLWYsIC0tZnJlcSAgICAgICAgICAgTW9zdHJhIGxhIGZyZXF1ZW56YSBhdHR1YWxlIGRlbGxhIENQVSBzZWNvbmRvXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBpbCBtb2R1bG8gY3B1ZnJlcSAqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ3NworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtdywgLS1od2ZyZXEgICAgICAgICBHZXQgZnJlcXVlbmN5IHRoZSBDUFUgY3VycmVudGx5IHJ1bnMgYXQsIGJ5IHJlYWRpbmdcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIGl0IGZyb20gaGFyZHdhcmUgKG9ubHkgYXZhaWxhYmxlIHRvIHJvb3QpICpcbiIKK21zZ3N0ciAiIgorIiAgLXcsIC0taHdmcmVxICAgICAgICAgTW9zdHJhIGxhIGZyZXF1ZW56YSBhdHR1YWxlIGRlbGxhIENQVSBsZWdnZW5kb2xhXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBkYWxsJ2hhcmR3YXJlIChkaXNwb25pYmlsZSBzb2xvIHBlciBsJ3V0ZW50ZSByb290KSAqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ3OQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtbCwgLS1od2xpbWl0cyAgICAgICBEZXRlcm1pbmUgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gQ1BVIGZyZXF1ZW5jeSAiCisiYWxsb3dlZCAqXG4iCittc2dzdHIgIiIKKyIgIC1sLCAtLWh3bGltaXRzICAgICAgIERldGVybWluYSBsZSBmcmVxdWVuemUgbWluaW1hIGUgbWFzc2ltYSBwb3NzaWJpbGkgcGVyICIKKyJsYSBDUFUgKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtZCwgLS1kcml2ZXIgICAgICAgICBEZXRlcm1pbmVzIHRoZSB1c2VkIGNwdWZyZXEga2VybmVsIGRyaXZlciAqXG4iCittc2dzdHIgIiIKKyIgIC1kLCAtLWRyaXZlciAgICAgICAgIERldGVybWluYSBpbCBtb2R1bG8gY3B1ZnJlcSBkZWwga2VybmVsIGluIHVzbyAqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4MQorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1wLCAtLXBvbGljeSAgICAgICAgIEdldHMgdGhlIGN1cnJlbnRseSB1c2VkIGNwdWZyZXEgcG9saWN5ICpcbiIKK21zZ3N0ciAiIgorIiAgLXAsIC0tcG9saWN5ICAgICAgICAgTW9zdHJhIGlsIGdlc3RvcmUgY3B1ZnJlcSBhdHR1YWxtZW50ZSBpbiB1c28gKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODIKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtZywgLS1nb3Zlcm5vcnMgICAgICBEZXRlcm1pbmVzIGF2YWlsYWJsZSBjcHVmcmVxIGdvdmVybm9ycyAqXG4iCittc2dzdHIgIiAgLWcsIC0tZ292ZXJub3JzICAgICAgRGV0ZXJtaW5hIGkgZ2VzdG9yaSBjcHVmcmVxIGRpc3BvbmliaWxpICpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDgzCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1yLCAtLXJlbGF0ZWQtY3B1cyAgIERldGVybWluZXMgd2hpY2ggQ1BVcyBydW4gYXQgdGhlIHNhbWUgaGFyZHdhcmUgIgorImZyZXF1ZW5jeSAqXG4iCittc2dzdHIgIiIKKyIgIC1yLCAtLXJlbGF0ZWQtY3B1cyAgIERldGVybWluYSBxdWFsaSBDUFUgb3BlcmFubyBhbGxhIHN0ZXNzYSBmcmVxdWVuemEgKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLWEsIC0tYWZmZWN0ZWQtY3B1cyAgRGV0ZXJtaW5lcyB3aGljaCBDUFVzIG5lZWQgdG8gaGF2ZSB0aGVpciBmcmVxdWVuY3lcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVkIGJ5IHNvZnR3YXJlICpcbiIKK21zZ3N0ciAiIgorIiAgLWEsIC0tYWZmZWN0ZWQtY3B1cyAgRGV0ZXJtaW5hIHF1YWxpIENQVSBkZXZvbm8gYXZlcmUgbGEgZnJlcXVlbnphXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRhIGRhbCBzb2Z0d2FyZSAqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4NgorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1zLCAtLXN0YXRzICAgICAgICAgIFNob3dzIGNwdWZyZXEgc3RhdGlzdGljcyBpZiBhdmFpbGFibGVcbiIKK21zZ3N0ciAiICAtcywgLS1zdGF0cyAgICAgICAgICBNb3N0cmEgbGUgc3RhdGlzdGljaGUgc2UgZGlzcG9uaWJpbGlcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDg3CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC15LCAtLWxhdGVuY3kgICAgICAgIERldGVybWluZXMgdGhlIG1heGltdW0gbGF0ZW5jeSBvbiBDUFUgZnJlcXVlbmN5ICIKKyJjaGFuZ2VzICpcbiIKK21zZ3N0ciAiIgorIiAgLXksIC0tbGF0ZW5jeSAgICAgICAgRGV0ZXJtaW5hIGxhIGxhdGVuemEgbWFzc2ltYSBkdXJhbnRlIGkgY2FtYmkgZGkgIgorImZyZXF1ZW56YSAqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4OAorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1iLCAtLWJvb3N0ICAgICAgICAgIENoZWNrcyBmb3IgdHVyYm8gb3IgYm9vc3QgbW9kZXMgICpcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLW8sIC0tcHJvYyAgICAgICAgICAgUHJpbnRzIG91dCBpbmZvcm1hdGlvbiBsaWtlIHByb3ZpZGVkIGJ5IHRoZSAvcHJvYy8iCisiY3B1ZnJlcVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlIGluIDIuNC4gYW5kIGVhcmx5IDIuNi4ga2VybmVsc1xuIgorbXNnc3RyICIiCisiICAtbywgLS1wcm9jICAgICAgICAgICBTdGFtcGEgbGUgaW5mb3JtYXppb25pIGNvbWUgc2UgcHJvdmVuaXNzZXJvIGRhbGxhXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2NpYSBjcHVmcmVxIC9wcm9jLyBwcmVzZW50ZSBuZWkga2VybmVsXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAyLjQgZWQgaSBwcmltaSAyLjZcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDkxCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1tLCAtLWh1bWFuICAgICAgICAgIGh1bWFuLXJlYWRhYmxlIG91dHB1dCBmb3IgdGhlIC1mLCAtdywgLXMgYW5kIC15ICIKKyJwYXJhbWV0ZXJzXG4iCittc2dzdHIgIiIKKyIgIC1tLCAtLWh1bWFuICAgICAgICAgIGZvcm1hdHRhIGwnb3V0cHV0IGRlbGxlIG9wemlvbmkgLWYsIC13LCAtcyBlIC15IGluICIKKyJtYW5pZXJhXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBsZWdnaWJpbGUgZGEgdW4gZXNzZXJlIHVtYW5vXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ5MiB1dGlscy9jcHVpZGxlLWluZm8uYzoxNTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtaCwgLS1oZWxwICAgICAgICAgICBQcmludHMgb3V0IHRoaXMgc2NyZWVuXG4iCittc2dzdHIgIiAgLWgsIC0taGVscCAgICAgICAgICAgU3RhbXBhIHF1ZXN0YSBzY2hlcm1hdGFcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDk1CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJJZiBubyBhcmd1bWVudCBvciBvbmx5IHRoZSAtYywgLS1jcHUgcGFyYW1ldGVyIGlzIGdpdmVuLCBkZWJ1ZyBvdXRwdXQgYWJvdXRcbiIKKyJjcHVmcmVxIGlzIHByaW50ZWQgd2hpY2ggaXMgdXNlZnVsIGUuZy4gZm9yIHJlcG9ydGluZyBidWdzLlxuIgorbXNnc3RyICIiCisiU2Ugbm9uIHZpZW5lIHNwZWNpZmljYXRhIG5lc3N1bmEgb3B6aW9uZSBvIHZpZW5lIHNwZWNpZmljYXRhIHNvbG8gbCdvcHppb25lIC0iCisiYywgLS1jcHUsXG4iCisibGUgaW5mb3JtYXppb25pIGRpIGRlYnVnIHBlciBjcHVmcmVxIHNhcmFubm8gdXRpbGkgYWQgZXNlbXBpbyBhIHJpcG9ydGFyZSBpICIKKyJidWcuXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ5NworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRm9yIHRoZSBhcmd1bWVudHMgbWFya2VkIHdpdGggKiwgb21pdHRpbmcgdGhlIC1jIG9yIC0tY3B1IGFyZ3VtZW50IGlzXG4iCisiZXF1aXZhbGVudCB0byBzZXR0aW5nIGl0IHRvIHplcm9cbiIKK21zZ3N0ciAiIgorIlBlciBsZSBvcHppb25pIHNlZ25hbGF0ZSBjb24gKiwgb21ldHRlcmUgbCdvcHppb25lIC1jIG8gLS1jcHUgw6ggY29tZSAiCisic3BlY2lmaWNhcmxhXG4iCisiY29uIGlsIHZhbG9yZSAwXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjU4MAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiVGhlIGFyZ3VtZW50IHBhc3NlZCB0byB0aGlzIHRvb2wgY2FuJ3QgYmUgY29tYmluZWQgd2l0aCBwYXNzaW5nIGEgLS1jcHUgIgorImFyZ3VtZW50XG4iCittc2dzdHIgIiIKKyJMJ29wemlvbmUgc3BlY2lmaWNhdGEgYSBxdWVzdG8gcHJvZ3JhbW1hIG5vbiBwdcOyIGVzc2VyZSBjb21iaW5hdGEgY29uIC0tY3B1XG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjU5NgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiWW91IGNhbid0IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSAtLWNwdSBwYXJhbWV0ZXIgYW5kL29yXG4iCisibW9yZSB0aGFuIG9uZSBvdXRwdXQtc3BlY2lmaWMgYXJndW1lbnRcbiIKK21zZ3N0ciAiIgorIk5vbiDDqCBwb3NzaWJpbGUgc3BlY2lmaWNhcmUgcGnDuSBkaSB1bmEgdm9sdGEgbCdvcHppb25lIC0tY3B1IGUvb1xuIgorInNwZWNpZmljYXJlIHBpw7kgZGkgdW4gcGFyYW1ldHJvIGRpIG91dHB1dCBzcGVjaWZpY29cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NjAwIHV0aWxzL2NwdWZyZXEtc2V0LmM6ODIgdXRpbHMvY3B1cG93ZXItc2V0LmM6NDIKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzo0MiB1dGlscy9jcHVpZGxlLWluZm8uYzoyMTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiaW52YWxpZCBvciB1bmtub3duIGFyZ3VtZW50XG4iCittc2dzdHIgIm9wemlvbmUgc2Nvbm9zY2l1dGEgbyBub24gdmFsaWRhXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjYxNworIywgYy1mb3JtYXQKK21zZ2lkICJjb3VsZG4ndCBhbmFseXplIENQVSAlZCBhcyBpdCBkb2Vzbid0IHNlZW0gdG8gYmUgcHJlc2VudFxuIgorbXNnc3RyICJpbXBvc3NpYmlsZSBhbmFsaXp6YXJlIGxhIENQVSAlZCBwb2ljaMOpIG5vbiBzZW1icmEgZXNzZXJlIHByZXNlbnRlXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjYyMCB1dGlscy9jcHVwb3dlci1pbmZvLmM6MTQyCisjLCBjLWZvcm1hdAorbXNnaWQgImFuYWx5emluZyBDUFUgJWQ6XG4iCittc2dzdHIgImFuYWxpc2kgZGVsbGEgQ1BVICVkOlxuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjI1CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogY3B1cG93ZXIgZnJlcXVlbmN5LXNldCBbb3B0aW9uc11cbiIKK21zZ3N0ciAiVXNvOiBjcHVmcmVxLXNldCBbb3B6aW9uaV1cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzoyNworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtZCBGUkVRLCAtLW1pbiBGUkVRICAgICAgbmV3IG1pbmltdW0gQ1BVIGZyZXF1ZW5jeSB0aGUgZ292ZXJub3IgbWF5ICIKKyJzZWxlY3RcbiIKK21zZ3N0ciAiIgorIiAgLWQgRlJFUSwgLS1taW4gRlJFUSAgICAgIGxhIG51b3ZhIGZyZXF1ZW56YSBtaW5pbWEgY2hlIGlsIGdlc3RvcmUgY3B1ZnJlcSAiCisicHXDsiBzY2VnbGllcmVcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzoyOAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtdSBGUkVRLCAtLW1heCBGUkVRICAgICAgbmV3IG1heGltdW0gQ1BVIGZyZXF1ZW5jeSB0aGUgZ292ZXJub3IgbWF5ICIKKyJzZWxlY3RcbiIKK21zZ3N0ciAiIgorIiAgLXUgRlJFUSwgLS1tYXggRlJFUSAgICAgIGxhIG51b3ZhIGZyZXF1ZW56YSBtYXNzaW1hIGNoZSBpbCBnZXN0b3JlIGNwdWZyZXEgIgorInB1w7Igc2NlZ2xpZXJlXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtZyBHT1YsIC0tZ292ZXJub3IgR09WICAgbmV3IGNwdWZyZXEgZ292ZXJub3JcbiIKK21zZ3N0ciAiICAtZyBHT1YsIC0tZ292ZXJub3IgR09WICAgbnVvdm8gZ2VzdG9yZSBjcHVmcmVxXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzAKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLWYgRlJFUSwgLS1mcmVxIEZSRVEgICAgIHNwZWNpZmljIGZyZXF1ZW5jeSB0byBiZSBzZXQuIFJlcXVpcmVzIHVzZXJzcGFjZVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdmVybm9yIHRvIGJlIGF2YWlsYWJsZSBhbmQgbG9hZGVkXG4iCittc2dzdHIgIiIKKyIgIC1mIEZSRVEsIC0tZnJlcSBGUkVRICAgICBzcGVjaWZpY2EgbGEgZnJlcXVlbnphIGEgY3VpIGltcG9zdGFyZSBsYSBDUFUuXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgw4ggbmVjZXNzYXJpbyBjaGUgaWwgZ2VzdG9yZSB1c2Vyc3BhY2Ugc2lhICIKKyJkaXNwb25pYmlsZSBlIGNhcmljYXRvXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtciwgLS1yZWxhdGVkICAgICAgICAgICAgU3dpdGNoZXMgYWxsIGhhcmR3YXJlLXJlbGF0ZWQgQ1BVc1xuIgorbXNnc3RyICIiCisiICAtciwgLS1yZWxhdGVkICAgICAgICAgICAgTW9kaWZpY2EgdHV0dGUgbGUgQ1BVIGNvb3JkaW5hdGUgZGFsbCdoYXJkd2FyZVxuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjMzIHV0aWxzL2NwdXBvd2VyLXNldC5jOjI4IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoyNworIywgYy1mb3JtYXQKK21zZ2lkICIgIC1oLCAtLWhlbHAgICAgICAgICAgICAgICBQcmludHMgb3V0IHRoaXMgc2NyZWVuXG4iCittc2dzdHIgIiAgLWgsIC0taGVscCAgICAgICAgICAgICAgIFN0YW1wYSBxdWVzdGEgc2NoZXJtYXRhXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzUKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiIKKyJOb3RlczpcbiIKKyIxLiBPbWl0dGluZyB0aGUgLWMgb3IgLS1jcHUgYXJndW1lbnQgaXMgZXF1aXZhbGVudCB0byBzZXR0aW5nIGl0IHRvIFwiYWxsXCJcbiIKK21zZ3N0ciAiIgorIlBlciBsZSBvcHppb25pIHNlZ25hbGF0ZSBjb24gKiwgb21ldHRlcmUgbCdvcHppb25lIC1jIG8gLS1jcHUgw6ggY29tZSAiCisic3BlY2lmaWNhcmxhXG4iCisiY29uIGlsIHZhbG9yZSAwXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzcKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiIKKyIyLiBUaGUgLWYgRlJFUSwgLS1mcmVxIEZSRVEgcGFyYW1ldGVyIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIGFueSBvdGhlciAiCisicGFyYW1ldGVyXG4iCisiICAgZXhjZXB0IHRoZSAtYyBDUFUsIC0tY3B1IENQVSBwYXJhbWV0ZXJcbiIKKyIzLiBGUkVRdWVuY2llcyBjYW4gYmUgcGFzc2VkIGluIEh6LCBrSHogKGRlZmF1bHQpLCBNSHosIEdIeiwgb3IgVEh6XG4iCisiICAgYnkgcG9zdGZpeGluZyB0aGUgdmFsdWUgd2l0aCB0aGUgd2FudGVkIHVuaXQgbmFtZSwgd2l0aG91dCBhbnkgc3BhY2VcbiIKKyIgICAoRlJFUXVlbmN5IGluIGtIeiA9XiBIeiAqIDAuMDAxID1eIE1IeiAqIDEwMDAgPV4gR0h6ICogMTAwMDAwMCkuXG4iCittc2dzdHIgIiIKKyJOb3RlOlxuIgorIjEuIE9tZXR0ZXJlIGwnb3B6aW9uZSAtYyBvIC0tY3B1IMOoIGVxdWl2YWxlbnRlIGEgaW1wb3N0YXJsbyBhIDBcbiIKKyIyLiBsJ29wemlvbmUgLWYgRlJFUSwgLS1mcmVxIEZSRVEgbm9uIHB1w7IgZXNzZXJlIHNwZWNpZmljYXRhIGNvbiBhbHRyZSAiCisib3B6aW9uaVxuIgorIiAgIGFkIGVjY2V6aW9uZSBkZWxsJ29wemlvbmUgLWMgQ1BVIG8gLS1jcHUgQ1BVXG4iCisiMy4gbGUgRlJFUXVlbnplIHBvc3Nvbm8gZXNzZXJlIHNwZWN1ZmljYXRlIGluICBIeiwga0h6IChkZWZhdWx0KSwgTUh6LCBHSHosICIKKyJvciBUSHpcbiIKKyIgICBwb3N0cG9uZW5kbyBsJ3VuaXTDoCBkaSBtaXN1cmEgYWwgdmFsb3JlIHNlbnphIG5lc3N1bm8gc3BhemlvIGZyYSBsb3JvXG4iCisiICAgKEZSRVF1ZW56YSBpbiBrSHogPV4gSHogKiAwLjAwMSA9XiBNSHogKiAxMDAwID1eIEdIeiAqIDEwMDAwMDApLlxuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjU3CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJFcnJvciBzZXR0aW5nIG5ldyB2YWx1ZXMuIENvbW1vbiBlcnJvcnM6XG4iCisiLSBEbyB5b3UgaGF2ZSBwcm9wZXIgYWRtaW5pc3RyYXRpb24gcmlnaHRzPyAoc3VwZXItdXNlcj8pXG4iCisiLSBJcyB0aGUgZ292ZXJub3IgeW91IHJlcXVlc3RlZCBhdmFpbGFibGUgYW5kIG1vZHByb2JlZD9cbiIKKyItIFRyeWluZyB0byBzZXQgYW4gaW52YWxpZCBwb2xpY3k/XG4iCisiLSBUcnlpbmcgdG8gc2V0IGEgc3BlY2lmaWMgZnJlcXVlbmN5LCBidXQgdXNlcnNwYWNlIGdvdmVybm9yIGlzIG5vdCAiCisiYXZhaWxhYmxlLFxuIgorIiAgIGZvciBleGFtcGxlIGJlY2F1c2Ugb2YgaGFyZHdhcmUgd2hpY2ggY2Fubm90IGJlIHNldCB0byBhIHNwZWNpZmljICIKKyJmcmVxdWVuY3lcbiIKKyIgICBvciBiZWNhdXNlIHRoZSB1c2Vyc3BhY2UgZ292ZXJub3IgaXNuJ3QgbG9hZGVkP1xuIgorbXNnc3RyICIiCisiU2kgc29ubyB2ZXJpZmljYXRpIGRlZ2xpIGVycm9yaSBpbXBvc3RhbmRvIGkgbnVvdmkgdmFsb3JpLlxuIgorIkFsY3VuaSBlcnJvcmkgY29tdW5pIHBvc3Nvbm8gZXNzZXJlOlxuIgorIi0gSGFpIGkgbmVjZXNzYXJpIGRpcml0dGkgZGkgYW1taW5pc3RyYXppb25lPyAoc3VwZXItdXNlcj8pXG4iCisiLSBJbCBnZXN0b3JlIGNoZSBoYWkgcmljaGllc3RvIMOoIGRpc3BvbmliaWxlIGUgY2FyaWNhdG8/XG4iCisiLSBTdGFpIHByb3ZhbmRvIGFkIGltcG9zdGFyZSB1bmEgcG9saXRpY2EgZGkgZ2VzdGlvbmUgbm9uIHZhbGlkYT9cbiIKKyItIFN0YWkgcHJvdmFuZG8gYSBpbXBvc3RhcmUgdW5hIHNwZWNpZmljYSBmcmVxdWVuemEgbWEgaWwgZ2VzdG9yZVxuIgorIiAgdXNlcnNwYWNlIG5vbiDDqCBkaXNwb25pYmlsZSwgcGVyIGVzZW1waW8gYSBjYXVzYSBkZWxsJ2hhcmR3YXJlXG4iCisiICBjaGUgbm9uIHN1cHBvcnRhIGZyZXF1ZW56ZSBmaXNzZSBvIGEgY2F1c2EgZGVsIGZhdHRvIGNoZVxuIgorIiAgaWwgZ2VzdG9yZSB1c2Vyc3BhY2Ugbm9uIMOoIGNhcmljYXRvP1xuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjE3MAorIywgYy1mb3JtYXQKK21zZ2lkICJ3cm9uZywgdW5rbm93biBvciB1bmhhbmRsZWQgQ1BVP1xuIgorbXNnc3RyICJDUFUgZXJyYXRhLCBzY29ub3NjaXV0YSBvIG5vbiBnZXN0aXRhP1xuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjMwMgorIywgYy1mb3JtYXQKK21zZ2lkICIiCisidGhlIC1mLy0tZnJlcSBwYXJhbWV0ZXIgY2Fubm90IGJlIGNvbWJpbmVkIHdpdGggLWQvLS1taW4sIC11Ly0tbWF4IG9yXG4iCisiLWcvLS1nb3Zlcm5vciBwYXJhbWV0ZXJzXG4iCittc2dzdHIgIiIKKyJsJ29wemlvbmUgLWYvLS1mcmVxIG5vbiBwdcOyIHZlbmlyZSBjb21iaW5hdGEgY29uIGkgcGFyYW1ldHJpXG4iCisiIC1kLy0tbWluLCAtdS8tLW1heCBvIC1nLy0tZ292ZXJub3JcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzozMDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgb3V0IG9mIC1mLy0tZnJlcSwgLWQvLS1taW4sIC11Ly0tbWF4LCBhbmRcbiIKKyItZy8tLWdvdmVybm9yIG11c3QgYmUgcGFzc2VkXG4iCittc2dzdHIgIiIKKyJBbG1lbm8gdW5hIGRlbGxlIG9wemlvbmkgLWYvLS1mcmVxLCAtZC8tLW1pbiwgLXUvLS1tYXgsIGUgLWcvLS1nb3Zlcm5vclxuIgorImRldmUgZXNzZXJlIHNwZWNpZmljYXRhXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIlNldHRpbmcgY3B1OiAlZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjIyCisjLCBjLWZvcm1hdAorbXNnaWQgIlVzYWdlOiBjcHVwb3dlciBzZXQgWyAtYiB2YWwgXSBbIC1tIHZhbCBdIFsgLXMgdmFsIF1cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzoyNAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtYiwgLS1wZXJmLWJpYXMgW1ZBTF0gICAgU2V0cyBDUFUncyBwb3dlciB2cyBwZXJmb3JtYW5jZSBwb2xpY3kgb24gc29tZVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIG1vZGVscyBbMC0xNV0sIHNlZSBtYW5wYWdlIGZvciBkZXRhaWxzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6MjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLW0sIC0tc2NoZWQtbWMgIFtWQUxdICAgIFNldHMgdGhlIGtlcm5lbCdzIG11bHRpIGNvcmUgc2NoZWR1bGVyIHBvbGljeS5cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzoyNworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtcywgLS1zY2hlZC1zbXQgW1ZBTF0gICAgU2V0cyB0aGUga2VybmVsJ3MgdGhyZWFkIHNpYmxpbmcgc2NoZWR1bGVyICIKKyJwb2xpY3kuXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiLS1wZXJmLWJpYXMgcGFyYW0gb3V0IG9mIHJhbmdlIFswLSVkXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjkxCisjLCBjLWZvcm1hdAorbXNnaWQgIi0tc2NoZWQtbWMgcGFyYW0gb3V0IG9mIHJhbmdlIFswLSVkXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjEwMgorIywgYy1mb3JtYXQKK21zZ2lkICItLXNjaGVkLXNtdCBwYXJhbSBvdXQgb2YgcmFuZ2UgWzAtJWRdXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6MTIxCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHNldHRpbmcgc2NoZWQtbWMgJXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzoxMjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3Igc2V0dGluZyBzY2hlZC1zbXQgJXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzoxNDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3Igc2V0dGluZyBwZXJmLWJpYXMgdmFsdWUgb24gQ1BVICVkXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjIxCisjLCBjLWZvcm1hdAorbXNnaWQgIlVzYWdlOiBjcHVwb3dlciBpbmZvIFsgLWIgXSBbIC1tIF0gWyAtcyBdXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjIzCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1iLCAtLXBlcmYtYmlhcyAgICBHZXRzIENQVSdzIHBvd2VyIHZzIHBlcmZvcm1hbmNlIHBvbGljeSBvbiBzb21lXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgbW9kZWxzIFswLTE1XSwgc2VlIG1hbnBhZ2UgZm9yIGRldGFpbHNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MjUKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiAgLW0sIC0tc2NoZWQtbWMgICAgIEdldHMgdGhlIGtlcm5lbCdzIG11bHRpIGNvcmUgc2NoZWR1bGVyIHBvbGljeS5cbiIKK21zZ3N0ciAiIgorIiAgLXAsIC0tcG9saWN5ICAgICAgICAgTW9zdHJhIGlsIGdlc3RvcmUgY3B1ZnJlcSBhdHR1YWxtZW50ZSBpbiB1c28gKlxuIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLXMsIC0tc2NoZWQtc210ICAgIEdldHMgdGhlIGtlcm5lbCdzIHRocmVhZCBzaWJsaW5nIHNjaGVkdWxlciBwb2xpY3kuXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjI4CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyJQYXNzaW5nIG5vIG9wdGlvbiB3aWxsIHNob3cgYWxsIGluZm8sIGJ5IGRlZmF1bHQgb25seSBvbiBjb3JlIDBcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MTAyCisjLCBjLWZvcm1hdAorbXNnaWQgIlN5c3RlbSdzIG11bHRpIGNvcmUgc2NoZWR1bGVyIHNldHRpbmc6ICIKK21zZ3N0ciAiIgorCisjLiBpZiBzeXNmcyBmaWxlIGlzIG1pc3NpbmcgaXQnczogZXJybm8gPT0gRU5PRU5UCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MTA1IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoxMTQKKyMsIGMtZm9ybWF0Cittc2dpZCAibm90IHN1cHBvcnRlZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoxMTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiU3lzdGVtJ3MgdGhyZWFkIHNpYmxpbmcgc2NoZWR1bGVyIHNldHRpbmc6ICIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MTI2CisjLCBjLWZvcm1hdAorbXNnaWQgIkludGVsJ3MgcGVyZm9ybWFuY2UgYmlhcyBzZXR0aW5nIG5lZWRzIHJvb3QgcHJpdmlsZWdlc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoxMjgKKyMsIGMtZm9ybWF0Cittc2dpZCAiU3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgSW50ZWwncyBwZXJmb3JtYW5jZSBiaWFzIHNldHRpbmdcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MTQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCByZWFkIHBlcmYtYmlhcyB2YWx1ZVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoxNTAKKyMsIGMtZm9ybWF0Cittc2dpZCAicGVyZi1iaWFzOiAlZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjI4CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJBbmFseXppbmcgQ1BVICVkOlxuIgorbXNnc3RyICJhbmFsaXNpIGRlbGxhIENQVSAlZDpcbiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ1BVICV1OiBObyBpZGxlIHN0YXRlc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjM2CisjLCBjLWZvcm1hdAorbXNnaWQgIkNQVSAldTogQ2FuJ3QgcmVhZCBpZGxlIHN0YXRlIGluZm9cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo0MQorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZGV0ZXJtaW5lIG1heCBpZGxlIHN0YXRlICV1XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6NDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiTnVtYmVyIG9mIGlkbGUgc3RhdGVzOiAlZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjQ4CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJBdmFpbGFibGUgaWRsZSBzdGF0ZXM6IgorbXNnc3RyICIgIGZyZXF1ZW56ZSBkaXNwb25pYmlsaTogIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo3MQorIywgYy1mb3JtYXQKK21zZ2lkICJGbGFncy9EZXNjcmlwdGlvbjogJXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo3NAorIywgYy1mb3JtYXQKK21zZ2lkICJMYXRlbmN5OiAlbHVcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo3NgorIywgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogJWx1XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6NzgKKyMsIGMtZm9ybWF0Cittc2dpZCAiRHVyYXRpb246ICVsbHVcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo5MAorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZGV0ZXJtaW5lIGNwdWlkbGUgZHJpdmVyXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6OTQKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIkNQVWlkbGUgZHJpdmVyOiAlc1xuIgorbXNnc3RyICIgIG1vZHVsbyAlc1xuIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo5OQorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZGV0ZXJtaW5lIGNwdWlkbGUgZ292ZXJub3JcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ1BVaWRsZSBnb3Zlcm5vcjogJXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ1BVICV1OiBDYW4ndCByZWFkIEMtc3RhdGUgaW5mb1xuIgorbXNnc3RyICIiCisKKyMuIHByaW50ZigiQ3N0YXRlczogJWRcbiIsIGNzdGF0ZXMpOworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTI3CisjLCBjLWZvcm1hdAorbXNnaWQgImFjdGl2ZSBzdGF0ZTogICAgICAgICAgICBDMFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEyOAorIywgYy1mb3JtYXQKK21zZ2lkICJtYXhfY3N0YXRlOiAgICAgICAgICAgICAgQyV1XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTI5CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJtYXhpbXVtIGFsbG93ZWQgbGF0ZW5jeTogJWx1IHVzZWNcbiIKK21zZ3N0ciAiICBsYXRlbnphIG1hc3NpbWEgZHVyYW50ZSBsYSB0cmFuc2l6aW9uZTogIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMzAKKyMsIGMtZm9ybWF0Cittc2dpZCAic3RhdGVzOlx0XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTMyCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgICBDJWQ6ICAgICAgICAgICAgICAgICAgdHlwZVtDJWRdICIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMzQKKyMsIGMtZm9ybWF0Cittc2dpZCAicHJvbW90aW9uWy0tXSBkZW1vdGlvblstLV0gIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEzNQorIywgYy1mb3JtYXQKK21zZ2lkICJsYXRlbmN5WyUwM2x1XSAiCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTM3CisjLCBjLWZvcm1hdAorbXNnaWQgInVzYWdlWyUwOGx1XSAiCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTM5CisjLCBjLWZvcm1hdAorbXNnaWQgImR1cmF0aW9uWyUwMjBMdV0gXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTQ3CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJVc2FnZTogY3B1cG93ZXIgaWRsZWluZm8gW29wdGlvbnNdXG4iCittc2dzdHIgIlVzbzogY3B1ZnJlcS1pbmZvIFtvcHppb25pXVxuIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxNDkKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiAgLXMsIC0tc2lsZW50ICAgICAgICAgT25seSBzaG93IGdlbmVyYWwgQy1zdGF0ZSBpbmZvcm1hdGlvblxuIgorbXNnc3RyICIgIC1lLCAtLWRlYnVnICAgICAgICAgIE1vc3RyYSBpbmZvcm1hemlvbmkgZGkgZGVidWdcbiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTUwCisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtbywgLS1wcm9jICAgICAgICAgICBQcmludHMgb3V0IGluZm9ybWF0aW9uIGxpa2UgcHJvdmlkZWQgYnkgdGhlIC9wcm9jLyIKKyJhY3BpL3Byb2Nlc3Nvci8qL3Bvd2VyXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UgaW4gb2xkZXIga2VybmVsc1xuIgorbXNnc3RyICIiCisiICAtbywgLS1wcm9jICAgICAgICAgICBTdGFtcGEgbGUgaW5mb3JtYXppb25pIGNvbWUgc2UgcHJvdmVuaXNzZXJvIGRhbGxhXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2NpYSBjcHVmcmVxIC9wcm9jLyBwcmVzZW50ZSBuZWkga2VybmVsXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAyLjQgZWQgaSBwcmltaSAyLjZcbiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MjA5CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJZb3UgY2FuJ3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIG91dHB1dC1zcGVjaWZpYyBhcmd1bWVudFxuIgorbXNnc3RyICIiCisiTm9uIMOoIHBvc3NpYmlsZSBzcGVjaWZpY2FyZSBwacO5IGRpIHVuYSB2b2x0YSBsJ29wemlvbmUgLS1jcHUgZS9vXG4iCisic3BlY2lmaWNhcmUgcGnDuSBkaSB1biBwYXJhbWV0cm8gZGkgb3V0cHV0IHNwZWNpZmljb1xuIgorCisjfiBtc2dpZCAiIgorI34gIiAgLWMgQ1BVLCAtLWNwdSBDUFUgICAgQ1BVIG51bWJlciB3aGljaCBpbmZvcm1hdGlvbiBzaGFsbCBiZSBkZXRlcm1pbmVkICIKKyN+ICJhYm91dFxuIgorI34gbXNnc3RyICIiCisjfiAiICAtYyBDUFUsIC0tY3B1IENQVSAgICBOdW1lcm8gZGkgQ1BVIHBlciBsYSBxdWFsZSBvdHRlbmVyZSBsZSAiCisjfiAiaW5mb3JtYXppb25pXG4iCisKKyN+IG1zZ2lkICIiCisjfiAiICAtYyBDUFUsIC0tY3B1IENQVSAgICAgICAgbnVtYmVyIG9mIENQVSB3aGVyZSBjcHVmcmVxIHNldHRpbmdzIHNoYWxsIGJlICIKKyN+ICJtb2RpZmllZFxuIgorI34gbXNnc3RyICIiCisjfiAiICAtYyBDUFUsIC0tY3B1IENQVSAgICAgICAgbnVtZXJvIGRpIENQVSBwZXIgbGEgcXVhbGUgbW9kaWZpY2FyZSBsZSAiCisjfiAiaW1wb3N0YXppb25pXG4iCisKKyMsIGZ1enp5CisjfiBtc2dpZCAiICBDUFVzIHdoaWNoIGNvb3JkaW5hdGUgc29mdHdhcmUgZnJlcXVlbmN5IHJlcXVpcmVtZW50czogIgorI34gbXNnc3RyICIiCisjfiAiICBDUFUgcGVyIGxlIHF1YWxpIGVgIG5lY2Vzc2FyaW8gY2FtYmlhcmUgbGEgZnJlcXVlbnphICIKKyN+ICJjb250ZW1wb3JhbmVhbWVudGU6ICIKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3BvL3B0LnBvIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvcG8vcHQucG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkwZjUyNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3BvL3B0LnBvCkBAIC0wLDAgKzEsOTU3IEBACisjIEJyYXppbGlhbiBQb3J0dWd1ZXNlIHRyYW5zbGF0aW9ucyBmb3IgY3B1ZnJlcXV0aWxzIHBhY2thZ2UKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFRIRSBjcHVmcmVxdXRpbHMnUyBDT1BZUklHSFQgSE9MREVSCisjIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgc2FtZSBsaWNlbnNlIGFzIHRoZSBjcHVmcmVxdXRpbHMgcGFja2FnZS4KKyMgQ2xhdWRpbyBFZHVhcmRvIDxjbGF1ZGlvZWRkeUBnbWFpbC5jb20+LCAyMDA5LgorIworIworbXNnaWQgIiIKK21zZ3N0ciAiIgorIlByb2plY3QtSWQtVmVyc2lvbjogY3B1ZnJlcXV0aWxzIDAwNFxuIgorIlJlcG9ydC1Nc2dpZC1CdWdzLVRvOiBcbiIKKyJQT1QtQ3JlYXRpb24tRGF0ZTogMjAxMS0wMy0wOCAxNzowMyswMTAwXG4iCisiUE8tUmV2aXNpb24tRGF0ZTogMjAwOC0wNi0xNCAyMjoxNi0wNDAwXG4iCisiTGFzdC1UcmFuc2xhdG9yOiBDbGF1ZGlvIEVkdWFyZG8gPGNsYXVkaW9lZGR5QGdtYWlsLmNvbT5cbiIKKyJNSU1FLVZlcnNpb246IDEuMFxuIgorIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFxuIgorIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXRcbiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL25obV9pZGxlLmM6MzYKK21zZ2lkICJQcm9jZXNzb3IgQ29yZSBDMyIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvbmhtX2lkbGUuYzo0MworbXNnaWQgIlByb2Nlc3NvciBDb3JlIEM2IgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9uaG1faWRsZS5jOjUxCittc2dpZCAiUHJvY2Vzc29yIFBhY2thZ2UgQzMiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL25obV9pZGxlLmM6NTggdXRpbHMvaWRsZV9tb25pdG9yL2FtZF9mYW0xNGhfaWRsZS5jOjcwCittc2dpZCAiUHJvY2Vzc29yIFBhY2thZ2UgQzYiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL3NuYl9pZGxlLmM6MzMKK21zZ2lkICJQcm9jZXNzb3IgQ29yZSBDNyIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3Ivc25iX2lkbGUuYzo0MAorbXNnaWQgIlByb2Nlc3NvciBQYWNrYWdlIEMyIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9zbmJfaWRsZS5jOjQ3Cittc2dpZCAiUHJvY2Vzc29yIFBhY2thZ2UgQzciCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2FtZF9mYW0xNGhfaWRsZS5jOjU2Cittc2dpZCAiUGFja2FnZSBpbiBzbGVlcCBzdGF0ZSAoUEMxIG9yIGRlZXBlcikiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2FtZF9mYW0xNGhfaWRsZS5jOjYzCittc2dpZCAiUHJvY2Vzc29yIFBhY2thZ2UgQzEiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2FtZF9mYW0xNGhfaWRsZS5jOjc3Cittc2dpZCAiTm9ydGggQnJpZGdlIFAxIGJvb2xlYW4gY291bnRlciAocmV0dXJucyAwIG9yIDEpIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9tcGVyZl9tb25pdG9yLmM6MzUKK21zZ2lkICJQcm9jZXNzb3IgQ29yZSBub3QgaWRsZSIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvbXBlcmZfbW9uaXRvci5jOjQyCittc2dpZCAiUHJvY2Vzc29yIENvcmUgaW4gYW4gaWRsZSBzdGF0ZSIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvbXBlcmZfbW9uaXRvci5jOjUwCittc2dpZCAiQXZlcmFnZSBGcmVxdWVuY3kgKGluY2x1ZGluZyBib29zdCkgaW4gTUh6IgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorImNwdXBvd2VyIG1vbml0b3I6IFstaF0gWyBbLXRdIHwgWy1sXSB8IFstbSA8bW9uMT4sWzxtb24yPl0gXSBdIFstaSAiCisiaW50ZXJ2YWxfc2VjIHwgLWMgY29tbWFuZCAuLi5dXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo2OQorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiY3B1cG93ZXIgbW9uaXRvcjogWy12XSBbLWhdIFsgWy10XSB8IFstbF0gfCBbLW0gPG1vbjE+LFs8bW9uMj5dIF0gXSBbLWkgIgorImludGVydmFsX3NlYyB8IC1jIGNvbW1hbmQgLi4uXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NzEKKyMsIGMtZm9ybWF0Cittc2dpZCAiXHQgLXY6IGJlIG1vcmUgdmVyYm9zZVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NzMKKyMsIGMtZm9ybWF0Cittc2dpZCAiXHQgLWg6IHByaW50IHRoaXMgaGVscFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NzQKKyMsIGMtZm9ybWF0Cittc2dpZCAiXHQgLWk6IHRpbWUgaW50ZXJ2YWxsIHRvIG1lYXN1cmUgZm9yIGluIHNlY29uZHMgKGRlZmF1bHQgMSlcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjc1CisjLCBjLWZvcm1hdAorbXNnaWQgIlx0IC10OiBzaG93IENQVSB0b3BvbG9neS9oaWVyYXJjaHlcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjc2CisjLCBjLWZvcm1hdAorbXNnaWQgIlx0IC1sOiBsaXN0IGF2YWlsYWJsZSBDUFUgc2xlZXAgbW9uaXRvcnMgKGZvciB1c2Ugd2l0aCAtbSlcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjc3CisjLCBjLWZvcm1hdAorbXNnaWQgIlx0IC1tOiBzaG93IHNwZWNpZmljIENQVSBzbGVlcCBtb25pdG9ycyBvbmx5IChpbiBzYW1lIG9yZGVyKVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6NzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIm9ubHkgb25lIG9mOiAtdCwgLWwsIC1tIGFyZSBhbGxvd2VkXG4iCisiSWYgbm9uZSBvZiB0aGVtIGlzIHBhc3NlZCwiCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo4MAorIywgYy1mb3JtYXQKK21zZ2lkICIgYWxsIHN1cHBvcnRlZCBtb25pdG9ycyBhcmUgc2hvd25cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjE5NworIywgYy1mb3JtYXQKK21zZ2lkICJNb25pdG9yICVzLCBDb3VudGVyICVzIGhhcyBubyBjb3VudCBmdW5jdGlvbi4gSW1wbGVtZW50YXRpb24gZXJyb3JcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjIwNworIywgYy1mb3JtYXQKK21zZ2lkICIgKmlzIG9mZmxpbmVcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjIzNgorIywgYy1mb3JtYXQKK21zZ2lkICIlczogbWF4IG1vbml0b3IgbmFtZSBsZW5ndGggKCVkKSBleGNlZWRlZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmM6MjUwCisjLCBjLWZvcm1hdAorbXNnaWQgIk5vIG1hdGNoaW5nIG1vbml0b3IgZm91bmQgaW4gJXMsIHRyeSAtbCBvcHRpb25cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjI2NgorIywgYy1mb3JtYXQKK21zZ2lkICJNb25pdG9yIFwiJXNcIiAoJWQgc3RhdGVzKSAtIE1pZ2h0IG92ZXJmbG93IGFmdGVyICV1IHNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjMxOQorIywgYy1mb3JtYXQKK21zZ2lkICIlcyB0b29rICUuNWYgc2Vjb25kcyBhbmQgZXhpdGVkIHdpdGggc3RhdHVzICVkXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo0MDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ2Fubm90IHJlYWQgbnVtYmVyIG9mIGF2YWlsYWJsZSBwcm9jZXNzb3JzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuYzo0MTcKKyMsIGMtZm9ybWF0Cittc2dpZCAiQXZhaWxhYmxlIG1vbml0b3IgJXMgbmVlZHMgcm9vdCBhY2Nlc3NcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jOjQyOAorIywgYy1mb3JtYXQKK21zZ2lkICJObyBIVyBDc3RhdGUgbW9uaXRvcnMgZm91bmRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjc4CisjLCBjLWZvcm1hdAorbXNnaWQgImNwdXBvd2VyIFsgLWMgY3B1bGlzdCBdIHN1YmNvbW1hbmQgW0FSR1NdXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzo3OQorIywgYy1mb3JtYXQKK21zZ2lkICJjcHVwb3dlciAtLXZlcnNpb25cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjgwCisjLCBjLWZvcm1hdAorbXNnaWQgIlN1cHBvcnRlZCBzdWJjb21tYW5kcyBhcmU6XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXIuYzo4MworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiU29tZSBzdWJjb21tYW5kcyBjYW4gbWFrZSB1c2Ugb2YgdGhlIC1jIGNwdWxpc3Qgb3B0aW9uLlxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLmM6ODQKKyMsIGMtZm9ybWF0Cittc2dpZCAiTG9vayBhdCB0aGUgZ2VuZXJhbCBjcHVwb3dlciBtYW5wYWdlIGhvdyB0byB1c2UgaXRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjg1CisjLCBjLWZvcm1hdAorbXNnaWQgImFuZCByZWFkIHVwIHRoZSBzdWJjb21tYW5kJ3MgbWFucGFnZSB3aGV0aGVyIGl0IGlzIHN1cHBvcnRlZC5cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjg2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJcbiIKKyJVc2UgY3B1cG93ZXIgaGVscCBzdWJjb21tYW5kIGZvciBnZXR0aW5nIGhlbHAgZm9yIGFib3ZlIHN1YmNvbW1hbmRzLlxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLmM6OTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiUmVwb3J0IGVycm9ycyBhbmQgYnVncyB0byAlcywgcGxlYXNlLlxuIgorbXNnc3RyICJSZXBvcnRlIGVycm9zIGUgYnVncyBwYXJhICVzLCBwb3IgZmF2b3IuXG4iCisKKyM6IHV0aWxzL2NwdXBvd2VyLmM6MTE0CisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHBhcnNpbmcgY3B1IGxpc3RcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci5jOjE3MgorIywgYy1mb3JtYXQKK21zZ2lkICJTdWJjb21tYW5kICVzIG5lZWRzIHJvb3QgcHJpdmlsZWdlc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjMxCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkbid0IGNvdW50IHRoZSBudW1iZXIgb2YgQ1BVcyAoJXM6ICVzKSwgYXNzdW1pbmcgMVxuIgorbXNnc3RyICJOw6NvIGZvaSBwb3Nzw612ZWwgY29udGFyIG8gbsO6bWVybyBkZSBDUFVzICglczogJXMpLCBhc3N1bWluZG8gMVxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo2MworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAgICAgICAgIG1pbmltdW0gQ1BVIGZyZXF1ZW5jeSAgLSAgbWF4aW11bSBDUFUgZnJlcXVlbmN5ICAtICBnb3Zlcm5vclxuIgorbXNnc3RyICIiCisiICAgICAgICAgIGZyZXF1w6puY2lhIG3DrW5pbmEgZG8gQ1BVICAtICBmcmVxdcOqbmNpYSBtw6F4aW1hIGRvIENQVSAgLSAgIgorInJlZ3VsYWRvclxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoxNTEKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3Igd2hpbGUgZXZhbHVhdGluZyBCb29zdCBDYXBhYmlsaXRpZXMgb24gQ1BVICVkIC0tIGFyZSB5b3Ugcm9vdD9cbiIKK21zZ3N0ciAiIgorCisjLiBQIHN0YXRlIGNoYW5nZXMgdmlhIE1TUiBhcmUgaWRlbnRpZmllZCB2aWEgY3B1aWQgODAwMDAwMDcKKyMuIG9uIEludGVsIGFuZCBBTUQsIGJ1dCB3ZSBhc3N1bWUgYm9vc3QgY2FwYWJsZSBtYWNoaW5lcyBjYW4gZG8gdGhhdAorIy4gaWYgKGNwdWlkX2VheCgweDgwMDAwMDAwKSA+PSAweDgwMDAwMDA3CisjLiAmJiAoY3B1aWRfZWR4KDB4ODAwMDAwMDcpICYgKDEgPDwgNykpKQorIy4KKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE2MQorIywgYy1mb3JtYXQKK21zZ2lkICIgIGJvb3N0IHN0YXRlIHN1cHBvcnQ6IFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE2MworIywgYy1mb3JtYXQKK21zZ2lkICIgICAgU3VwcG9ydGVkOiAlc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE2MyB1dGlscy9jcHVmcmVxLWluZm8uYzoxNjQKK21zZ2lkICJ5ZXMiCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTYzIHV0aWxzL2NwdWZyZXEtaW5mby5jOjE2NAorbXNnaWQgIm5vIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE2NAorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiICAgIEFjdGl2ZTogJXNcbiIKK21zZ3N0ciAiICBkcml2ZXI6ICVzXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE3NworIywgYy1mb3JtYXQKK21zZ2lkICIgICAgQm9vc3QgU3RhdGVzOiAlZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE3OAorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgVG90YWwgU3RhdGVzOiAlZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjE4MQorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgUHN0YXRlLVBiJWQ6ICVsdU1IeiAoYm9vc3Qgc3RhdGUpXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MTg0CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgICBQc3RhdGUtUCVkOiAgJWx1TUh6XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjExCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgbm8gb3IgdW5rbm93biBjcHVmcmVxIGRyaXZlciBpcyBhY3RpdmUgb24gdGhpcyBDUFVcbiIKK21zZ3N0ciAiICBuZW5odW0gb3UgZHJpdmVyIGRvIGNwdWZyZXEgZGVjb25oZWNpZG8gZXN0w6EgYXRpdm8gbmVzc2UgQ1BVXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjIxMworIywgYy1mb3JtYXQKK21zZ2lkICIgIGRyaXZlcjogJXNcbiIKK21zZ3N0ciAiICBkcml2ZXI6ICVzXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjIxOQorIywgYy1mb3JtYXQKK21zZ2lkICIgIENQVXMgd2hpY2ggcnVuIGF0IHRoZSBzYW1lIGhhcmR3YXJlIGZyZXF1ZW5jeTogIgorbXNnc3RyICIgIENQVXMgcXVlIHJvZGFtIG5hIG1lc21hIGZyZXF1w6puY2lhIGRlIGhhcmR3YXJlOiAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjIzMAorIywgYy1mb3JtYXQKK21zZ2lkICIgIENQVXMgd2hpY2ggbmVlZCB0byBoYXZlIHRoZWlyIGZyZXF1ZW5jeSBjb29yZGluYXRlZCBieSBzb2Z0d2FyZTogIgorbXNnc3RyICIgIENQVXMgcXVlIHByZWNpc2FtIHRlciBzdWFzIGZyZXF1w6puY2lhcyBjb29yZGVuYWRhcyBwb3Igc29mdHdhcmU6ICIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjQxCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgbWF4aW11bSB0cmFuc2l0aW9uIGxhdGVuY3k6ICIKK21zZ3N0ciAiICBtYWlvciBsYXTDqm5jaWEgZGUgdHJhbnNpw6fDo286ICIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgaGFyZHdhcmUgbGltaXRzOiAiCittc2dzdHIgIiAgbGltaXRlcyBkbyBoYXJkd2FyZTogIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyNTYKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBhdmFpbGFibGUgZnJlcXVlbmN5IHN0ZXBzOiAiCittc2dzdHIgIiAgbsOtdmVpcyBkZSBmcmVxdcOqbmNpYSBkaXNwb27DrXZlaXM6ICIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjY5CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgYXZhaWxhYmxlIGNwdWZyZXEgZ292ZXJub3JzOiAiCittc2dzdHIgIiAgcmVndWxhZG9yZXMgZG8gY3B1ZnJlcSBkaXNwb27DrXZlaXM6ICIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6MjgwCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgY3VycmVudCBwb2xpY3k6IGZyZXF1ZW5jeSBzaG91bGQgYmUgd2l0aGluICIKK21zZ3N0ciAiICBwb2zDrXRpY2EgZGUgZnJlcXXDqm5jaWEgYXR1YWwgZGV2ZSBlc3RhciBlbnRyZSAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjI4MgorIywgYy1mb3JtYXQKK21zZ2lkICIgYW5kICIKK21zZ3N0ciAiIGUgIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyODYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIlRoZSBnb3Zlcm5vciBcIiVzXCIgbWF5IGRlY2lkZSB3aGljaCBzcGVlZCB0byB1c2VcbiIKKyIgICAgICAgICAgICAgICAgICB3aXRoaW4gdGhpcyByYW5nZS5cbiIKK21zZ3N0ciAiIgorIk8gcmVndWxhZG9yIFwiJXNcIiBkZXZlIGRlY2lkaXIgcXVhbCB2ZWxvY2lkYWRlIHVzYXJcbiIKKyIgICAgICAgICAgICAgICAgICBkZW50cm8gZGVzc2UgbGltaXRlLlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzoyOTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiICBjdXJyZW50IENQVSBmcmVxdWVuY3kgaXMgIgorbXNnc3RyICIgIGZyZXF1w6puY2lhIGF0dWFsIGRvIENQVSDDqSAiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjI5NgorIywgYy1mb3JtYXQKK21zZ2lkICIgKGFzc2VydGVkIGJ5IGNhbGwgdG8gaGFyZHdhcmUpIgorbXNnc3RyICIgKGRlY2xhcmFkbyBwb3IgY2hhbWFkYSBhbyBoYXJkd2FyZSkiCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjMwNAorIywgYy1mb3JtYXQKK21zZ2lkICIgIGNwdWZyZXEgc3RhdHM6ICIKK21zZ3N0ciAiICBzdGF0dXMgZG8gY3B1ZnJlcTogIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0NzIKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIlVzYWdlOiBjcHVwb3dlciBmcmVxaW5mbyBbb3B0aW9uc11cbiIKK21zZ3N0ciAiVXNvOiBjcHVmcmVxLWluZm8gW29ww6fDtWVzXVxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0NzMgdXRpbHMvY3B1ZnJlcS1zZXQuYzoyNiB1dGlscy9jcHVwb3dlci1zZXQuYzoyMworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjIyIHV0aWxzL2NwdWlkbGUtaW5mby5jOjE0OAorIywgYy1mb3JtYXQKK21zZ2lkICJPcHRpb25zOlxuIgorbXNnc3RyICJPcMOnw7VlczpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDc0CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICIgIC1lLCAtLWRlYnVnICAgICAgICAgIFByaW50cyBvdXQgZGVidWcgaW5mb3JtYXRpb24gW2RlZmF1bHRdXG4iCittc2dzdHIgIiAgLWUsIC0tZGVidWcgICAgICAgICAgTW9zdHJhIGluZm9ybWHDp8OjbyBkZSBkZWJ1Z1xuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0NzUKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLWYsIC0tZnJlcSAgICAgICAgICAgR2V0IGZyZXF1ZW5jeSB0aGUgQ1BVIGN1cnJlbnRseSBydW5zIGF0LCBhY2NvcmRpbmdcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBjcHVmcmVxIGNvcmUgKlxuIgorbXNnc3RyICIiCisiICAtZiwgLS1mcmVxICAgICAgICAgICBPYnRlbSBhIGZyZXF1w6puY2lhIG5hIHF1YWwgbyBDUFUgcm9kYSBubyBtb21lbnRvLCBkZSAiCisiYWNvcmRvXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBjb20gbyBuw7pjbGVvIGRvIGNwdWZyZXEgKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0NzcKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLXcsIC0taHdmcmVxICAgICAgICAgR2V0IGZyZXF1ZW5jeSB0aGUgQ1BVIGN1cnJlbnRseSBydW5zIGF0LCBieSByZWFkaW5nXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBpdCBmcm9tIGhhcmR3YXJlIChvbmx5IGF2YWlsYWJsZSB0byByb290KSAqXG4iCittc2dzdHIgIiIKKyIgIC13LCAtLWh3ZnJlcSAgICAgICAgIE9idGVtIGEgZnJlcXXDqm5jaWEgbmEgcXVhbCBvIENQVSBlc3TDoSBvcGVyYW5kbyBubyAiCisibW9tZW50byxcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIGF0cmF2w6lzIGRlIGxlaXR1cmEgbm8gaGFyZHdhcmUgKGRpc3BvbsOtdmVsIHNvbWVudGUgIgorInBhcmEgcm9vdCkgKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0NzkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLWwsIC0taHdsaW1pdHMgICAgICAgRGV0ZXJtaW5lIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIENQVSBmcmVxdWVuY3kgIgorImFsbG93ZWQgKlxuIgorbXNnc3RyICIiCisiICAtbCwgLS1od2xpbWl0cyAgICAgICBEZXRlcm1pbmEgYSBmcmVxdcOqbmNpYSBtw61uaW1hIGUgbcOheGltYSBkbyBDUFUgIgorInBlcm1pdGlkYSAqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4MAorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1kLCAtLWRyaXZlciAgICAgICAgIERldGVybWluZXMgdGhlIHVzZWQgY3B1ZnJlcSBrZXJuZWwgZHJpdmVyICpcbiIKK21zZ3N0ciAiIgorIiAgLWQsICAtLWRyaXZlciAgICAgICAgIERldGVybWluYSBvIGRyaXZlciBkbyBrZXJuZWwgZG8gY3B1ZnJlcSB1c2FkbyAqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4MQorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1wLCAtLXBvbGljeSAgICAgICAgIEdldHMgdGhlIGN1cnJlbnRseSB1c2VkIGNwdWZyZXEgcG9saWN5ICpcbiIKK21zZ3N0ciAiIgorIi0tcCwgLS1wb2xpY3kgICAgICAgICBPYnRlbSBhIHBvbMOtdGljYSBkbyBjcHVmcmVxIGVtIHVzbyBubyBtb21lbnRvICpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDgyCisjLCBjLWZvcm1hdAorbXNnaWQgIiAgLWcsIC0tZ292ZXJub3JzICAgICAgRGV0ZXJtaW5lcyBhdmFpbGFibGUgY3B1ZnJlcSBnb3Zlcm5vcnMgKlxuIgorbXNnc3RyICIiCisiICAtZywgLS1nb3Zlcm5vcnMgICAgICBEZXRlcm1pbmEgcmVndWxhZG9yZXMgZG8gY3B1ZnJlcSBkaXNwb27DrXZlaXMgKlxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODMKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLXIsIC0tcmVsYXRlZC1jcHVzICAgRGV0ZXJtaW5lcyB3aGljaCBDUFVzIHJ1biBhdCB0aGUgc2FtZSBoYXJkd2FyZSAiCisiZnJlcXVlbmN5ICpcbiIKK21zZ3N0ciAiIgorIiAgLXIsIC0tcmVsYXRlZC1jcHVzICAgRGV0ZXJtaW5hIHF1YWlzIENQVXMgcm9kYW0gbmEgbWVzbWEgZnJlcXXDqm5jaWEgZGUgIgorImhhcmR3YXJlICpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDg0CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1hLCAtLWFmZmVjdGVkLWNwdXMgIERldGVybWluZXMgd2hpY2ggQ1BVcyBuZWVkIHRvIGhhdmUgdGhlaXIgZnJlcXVlbmN5XG4iCisiICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlZCBieSBzb2Z0d2FyZSAqXG4iCittc2dzdHIgIiIKKyIgIC1hLCAtLWFmZmVjdGVkLWNwdXMgIERldGVybWluYSBxdWFpcyBDUFVzIHByZWNpc2FtIHRlciBzdWFzIGZyZXF1w6puY2lhc1xuIgorIiAgICAgICAgICAgICAgICAgICAgICAgY29vcmRlbmFkYXMgcG9yIHNvZnR3YXJlICpcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDg2CisjLCBjLWZvcm1hdAorbXNnaWQgIiAgLXMsIC0tc3RhdHMgICAgICAgICAgU2hvd3MgY3B1ZnJlcSBzdGF0aXN0aWNzIGlmIGF2YWlsYWJsZVxuIgorbXNnc3RyICIgIC1zLCAtLXN0YXRzICAgICAgICAgIE1vc3RyYSBlc3RhdMOtc3RpY2FzIGRvIGNwdWZyZXEgc2UgZGlzcG9uw612ZWlzXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4NworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAteSwgLS1sYXRlbmN5ICAgICAgICBEZXRlcm1pbmVzIHRoZSBtYXhpbXVtIGxhdGVuY3kgb24gQ1BVIGZyZXF1ZW5jeSAiCisiY2hhbmdlcyAqXG4iCittc2dzdHIgIiIKKyIgIC15LCAtLWxhdGVuY3kgICAgICAgIERldGVybWluYSBhIGxhdMOqbmNpYSBtw6F4aW1hIG5hcyB0cm9jYXMgZGUgZnJlcXXDqm5jaWEgIgorImRvIENQVSAqXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ4OAorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1iLCAtLWJvb3N0ICAgICAgICAgIENoZWNrcyBmb3IgdHVyYm8gb3IgYm9vc3QgbW9kZXMgICpcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0ODkKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLW8sIC0tcHJvYyAgICAgICAgICAgUHJpbnRzIG91dCBpbmZvcm1hdGlvbiBsaWtlIHByb3ZpZGVkIGJ5IHRoZSAvcHJvYy8iCisiY3B1ZnJlcVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlIGluIDIuNC4gYW5kIGVhcmx5IDIuNi4ga2VybmVsc1xuIgorbXNnc3RyICIiCisiICAtbywgLS1wcm9jICAgICAgICAgICBNb3N0cmEgaW5mb3JtYcOnw6NvIGRvIHRpcG8gcHJvdmlkYSBwZWxhIGludGVyZmFjZSAvIgorInByb2MvY3B1ZnJlcVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgZW0ga2VybmVscyAyLjQuIGUgbWFpcyByZWNlbnRlcyAyLjZcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NDkxCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1tLCAtLWh1bWFuICAgICAgICAgIGh1bWFuLXJlYWRhYmxlIG91dHB1dCBmb3IgdGhlIC1mLCAtdywgLXMgYW5kIC15ICIKKyJwYXJhbWV0ZXJzXG4iCittc2dzdHIgIiIKKyIgIC1tLCAtLWh1bWFuICAgICAgICAgIHNhw61kYSBsZWfDrXZlbCBwYXJhIGh1bWFub3MgcGFyYSBvcyBwYXLDom1ldHJvcyAtZiwgLXcsICIKKyItcyBlIC15XG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ5MiB1dGlscy9jcHVpZGxlLWluZm8uYzoxNTIKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtaCwgLS1oZWxwICAgICAgICAgICBQcmludHMgb3V0IHRoaXMgc2NyZWVuXG4iCittc2dzdHIgIiAtaCwgLS1oZWxwICAgICAgICAgICBJbXByaW1lIGVzc2EgdGVsYVxuIgorCisjOiB1dGlscy9jcHVmcmVxLWluZm8uYzo0OTUKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIklmIG5vIGFyZ3VtZW50IG9yIG9ubHkgdGhlIC1jLCAtLWNwdSBwYXJhbWV0ZXIgaXMgZ2l2ZW4sIGRlYnVnIG91dHB1dCBhYm91dFxuIgorImNwdWZyZXEgaXMgcHJpbnRlZCB3aGljaCBpcyB1c2VmdWwgZS5nLiBmb3IgcmVwb3J0aW5nIGJ1Z3MuXG4iCittc2dzdHIgIiIKKyJTZSBuZW5odW0gYXJndW1lbnRvIG91IHNvbWVudGUgbyBwYXLDom1ldHJvIC1jLCAtLWNwdSDDqSBkYWRvLCBpbmZvcm1hw6fDo28gZGUgIgorImRlYnVnIHNvYnJlXG4iCisibyBjcHVmcmVxIMOpIG1vc3RyYWRhLCBvIHF1ZSDDqSDDunRpbCBwb3IgZXhlbXBsbyBwYXJhIHJlcG9ydGFyIGJ1Z3MuXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjQ5NworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRm9yIHRoZSBhcmd1bWVudHMgbWFya2VkIHdpdGggKiwgb21pdHRpbmcgdGhlIC1jIG9yIC0tY3B1IGFyZ3VtZW50IGlzXG4iCisiZXF1aXZhbGVudCB0byBzZXR0aW5nIGl0IHRvIHplcm9cbiIKK21zZ3N0ciAiIgorIlBhcmEgb3MgYXJndW1lbnRvcyBtYXJjYWRvcyBjb20gKiwgb21pdGlyIG8gYXJndW1lbnRvIC1jIG91IC0tY3B1IMOpXG4iCisiZXF1aXZhbGVudGUgYSBzZXTDoS1sbyBjb21vIHplcm9cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NTgwCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJUaGUgYXJndW1lbnQgcGFzc2VkIHRvIHRoaXMgdG9vbCBjYW4ndCBiZSBjb21iaW5lZCB3aXRoIHBhc3NpbmcgYSAtLWNwdSAiCisiYXJndW1lbnRcbiIKK21zZ3N0ciAiIgorIk8gYXJndW1lbnRvIHVzYWRvIHByYSBlc3NhIGZlcnJhbWVudGEgbsOjbyBwb2RlIHNlciBjb21iaW5hZG8gY29tIHVtICIKKyJhcmd1bWVudG8gLS1jcHVcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NTk2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyJZb3UgY2FuJ3Qgc3BlY2lmeSBtb3JlIHRoYW4gb25lIC0tY3B1IHBhcmFtZXRlciBhbmQvb3JcbiIKKyJtb3JlIHRoYW4gb25lIG91dHB1dC1zcGVjaWZpYyBhcmd1bWVudFxuIgorbXNnc3RyICIiCisiVm9jw6ogbsOjbyBwb2RlIGVzcGVjaWZpY2FyIG1haXMgZG8gcXVlIHVtIHBhcsOibWV0cm8gLS1jcHUgZS9vdVxuIgorIm1haXMgZG8gcXVlIHVtIGFyZ3VtZW50byBkZSBzYcOtZGEgZXNwZWPDrWZpY29cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1pbmZvLmM6NjAwIHV0aWxzL2NwdWZyZXEtc2V0LmM6ODIgdXRpbHMvY3B1cG93ZXItc2V0LmM6NDIKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzo0MiB1dGlscy9jcHVpZGxlLWluZm8uYzoyMTMKKyMsIGMtZm9ybWF0Cittc2dpZCAiaW52YWxpZCBvciB1bmtub3duIGFyZ3VtZW50XG4iCittc2dzdHIgImFyZ3VtZW50byBpbnbDoWxpZG8gb3UgZGVzY29uaGVjaWRvXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjYxNworIywgYy1mb3JtYXQKK21zZ2lkICJjb3VsZG4ndCBhbmFseXplIENQVSAlZCBhcyBpdCBkb2Vzbid0IHNlZW0gdG8gYmUgcHJlc2VudFxuIgorbXNnc3RyICIiCisibsOjbyBmb2kgcG9zc8OtdmVsIGFuYWxpc2FyIG8gQ1BVICUgasOhIHF1ZSBvIG1lc21vIHBhcmVjZSBuw6NvIGVzdGFyIHByZXNlbnRlXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtaW5mby5jOjYyMCB1dGlscy9jcHVwb3dlci1pbmZvLmM6MTQyCisjLCBjLWZvcm1hdAorbXNnaWQgImFuYWx5emluZyBDUFUgJWQ6XG4iCittc2dzdHIgImFuYWxpc2FuZG8gbyBDUFUgJWQ6XG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MjUKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIlVzYWdlOiBjcHVwb3dlciBmcmVxdWVuY3ktc2V0IFtvcHRpb25zXVxuIgorbXNnc3RyICJVc286IGNwdWZyZXEtc2V0IFtvcMOnw7Vlc11cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzoyNworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtZCBGUkVRLCAtLW1pbiBGUkVRICAgICAgbmV3IG1pbmltdW0gQ1BVIGZyZXF1ZW5jeSB0aGUgZ292ZXJub3IgbWF5ICIKKyJzZWxlY3RcbiIKK21zZ3N0ciAiIgorIiAgLWQgRlJFUSwgLS1taW4gRlJFUSAgICAgIG5vdmEgZnJlcXXDqm5jaWEgbcOtbmltYSBkbyBDUFUgcXVlIG8gcmVndWxhZG9yICIKKyJkZXZlIHNlbGVjaW9uYXJcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzoyOAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtdSBGUkVRLCAtLW1heCBGUkVRICAgICAgbmV3IG1heGltdW0gQ1BVIGZyZXF1ZW5jeSB0aGUgZ292ZXJub3IgbWF5ICIKKyJzZWxlY3RcbiIKK21zZ3N0ciAiIgorIiAgLXUgRlJFUSwgLS1tYXggRlJFUSAgICAgIG5vdmEgZnJlcXXDqm5jaWEgbcOheGltYSBkbyBDUFUgcXVlIG8gcmVndWxhZG9yICIKKyJkZXZlIGVzY29saGVyXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MjkKKyMsIGMtZm9ybWF0Cittc2dpZCAiICAtZyBHT1YsIC0tZ292ZXJub3IgR09WICAgbmV3IGNwdWZyZXEgZ292ZXJub3JcbiIKK21zZ3N0ciAiICAtZyBHT1YsIC0tZ292ZXJub3IgR09WICAgbm92byByZWd1bGFkb3IgZG8gY3B1ZnJlcVxuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjMwCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1mIEZSRVEsIC0tZnJlcSBGUkVRICAgICBzcGVjaWZpYyBmcmVxdWVuY3kgdG8gYmUgc2V0LiBSZXF1aXJlcyB1c2Vyc3BhY2VcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3Zlcm5vciB0byBiZSBhdmFpbGFibGUgYW5kIGxvYWRlZFxuIgorbXNnc3RyICIiCisiICAtZiBGUkVRLCAtLWZyZXEgRlJFUSAgICAgZnJlcXXDqm5jaWEgZXNwZWPDrWZpY2EgcGFyYSBzZXIgc2V0YWRhLiBOZWNlc3NpdGEgIgorInF1ZSBvIHJlZ3VsYWRvciBlbVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgIG7DrXZlbCBkZSB1c3XDoXJpbyBlc3RlamEgZGlzcG9uw612ZWwgZSBjYXJyZWdhZG9cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzozMgorIywgYy1mb3JtYXQKK21zZ2lkICIgIC1yLCAtLXJlbGF0ZWQgICAgICAgICAgICBTd2l0Y2hlcyBhbGwgaGFyZHdhcmUtcmVsYXRlZCBDUFVzXG4iCittc2dzdHIgIiIKKyIgIC1yLCAtLXJlbGF0ZWQgICAgICAgICAgICBNb2RpZmljYSB0b2RvcyBvcyBDUFVzIHJlbGFjaW9uYWRvcyBhbyBoYXJkd2FyZVxuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjMzIHV0aWxzL2NwdXBvd2VyLXNldC5jOjI4IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoyNworIywgYy1mb3JtYXQKK21zZ2lkICIgIC1oLCAtLWhlbHAgICAgICAgICAgICAgICBQcmludHMgb3V0IHRoaXMgc2NyZWVuXG4iCittc2dzdHIgIiAtaCwgLS1oZWxwICAgICAgICAgICBNb3N0cmEgZXNzYSB0ZWxhXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzUKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiIKKyJOb3RlczpcbiIKKyIxLiBPbWl0dGluZyB0aGUgLWMgb3IgLS1jcHUgYXJndW1lbnQgaXMgZXF1aXZhbGVudCB0byBzZXR0aW5nIGl0IHRvIFwiYWxsXCJcbiIKK21zZ3N0ciAiIgorIlBhcmEgb3MgYXJndW1lbnRvcyBtYXJjYWRvcyBjb20gKiwgb21pdGlyIG8gYXJndW1lbnRvIC1jIG91IC0tY3B1IMOpXG4iCisiZXF1aXZhbGVudGUgYSBzZXTDoS1sbyBjb21vIHplcm9cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzozNworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiIgorIjIuIFRoZSAtZiBGUkVRLCAtLWZyZXEgRlJFUSBwYXJhbWV0ZXIgY2Fubm90IGJlIGNvbWJpbmVkIHdpdGggYW55IG90aGVyICIKKyJwYXJhbWV0ZXJcbiIKKyIgICBleGNlcHQgdGhlIC1jIENQVSwgLS1jcHUgQ1BVIHBhcmFtZXRlclxuIgorIjMuIEZSRVF1ZW5jaWVzIGNhbiBiZSBwYXNzZWQgaW4gSHosIGtIeiAoZGVmYXVsdCksIE1IeiwgR0h6LCBvciBUSHpcbiIKKyIgICBieSBwb3N0Zml4aW5nIHRoZSB2YWx1ZSB3aXRoIHRoZSB3YW50ZWQgdW5pdCBuYW1lLCB3aXRob3V0IGFueSBzcGFjZVxuIgorIiAgIChGUkVRdWVuY3kgaW4ga0h6ID1eIEh6ICogMC4wMDEgPV4gTUh6ICogMTAwMCA9XiBHSHogKiAxMDAwMDAwKS5cbiIKK21zZ3N0ciAiIgorIk5vdGFzOlxuIgorIjEuIE9taXRpciBvIGFyZ3VtZW50byAtYyBvciAtLWNwdSDDqSBlcXVpdmFsZW50ZSBhIHNldMOhLWxvIGNvbW8gemVyb1xuIgorIjIuIE8gcGFyw6JtZXRybyAtZiBGUkVRLCAtLWZyZXEgRlJFUSBuw6NvIHBvZGUgc2VyIGNvbWJpbmFkbyBjb20gcXVhbHF1ZXIgIgorIm91dHJvIHBhcsOibWV0cm9cbiIKKyIgICBleGNldG8gY29tIG8gcGFyw6JtZXRybyAtYyBDUFUsIC0tY3B1IENQVVxuIgorIjMuIEZSRVF1w6puY2lhcyBwb2RlbSBzZXIgdXNhZGFzIGVtIEh6LCBrSHogKHBhZHLDo28pLCBNSHosIEdIeiwgbyBUSHpcbiIKKyIgICBjb2xvY2FuZG8gbyBub21lIGRlc2VqYWRvIGRhIHVuaWRhZGUgYXDDs3MgbyB2YWxvciwgc2VtIHF1YWxxdWVyIGVzcGHDp29cbiIKKyIgICAoRlJFUXXDqm5jaWEgZW0ga0h6ID1eIEh6ICogMC4wMDEgPV4gTUh6ICogMTAwMCA9XiBHSHogKiAxMDAwMDAwKS5cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzo1NworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiRXJyb3Igc2V0dGluZyBuZXcgdmFsdWVzLiBDb21tb24gZXJyb3JzOlxuIgorIi0gRG8geW91IGhhdmUgcHJvcGVyIGFkbWluaXN0cmF0aW9uIHJpZ2h0cz8gKHN1cGVyLXVzZXI/KVxuIgorIi0gSXMgdGhlIGdvdmVybm9yIHlvdSByZXF1ZXN0ZWQgYXZhaWxhYmxlIGFuZCBtb2Rwcm9iZWQ/XG4iCisiLSBUcnlpbmcgdG8gc2V0IGFuIGludmFsaWQgcG9saWN5P1xuIgorIi0gVHJ5aW5nIHRvIHNldCBhIHNwZWNpZmljIGZyZXF1ZW5jeSwgYnV0IHVzZXJzcGFjZSBnb3Zlcm5vciBpcyBub3QgIgorImF2YWlsYWJsZSxcbiIKKyIgICBmb3IgZXhhbXBsZSBiZWNhdXNlIG9mIGhhcmR3YXJlIHdoaWNoIGNhbm5vdCBiZSBzZXQgdG8gYSBzcGVjaWZpYyAiCisiZnJlcXVlbmN5XG4iCisiICAgb3IgYmVjYXVzZSB0aGUgdXNlcnNwYWNlIGdvdmVybm9yIGlzbid0IGxvYWRlZD9cbiIKK21zZ3N0ciAiIgorIkVycm8gYW8gc2V0YXIgbm92b3MgdmFsb3Jlcy4gRXJyb3MgY29tdW5zOlxuIgorIi0gVm9jw6ogdGVtIGRpcmVpdG9zIGFkbWluaXN0cmF0aXZvcyBuZWNlc3PDoXJpb3M/IChzdXBlci11c3XDoXJpbz8pXG4iCisiLSBPIHJlZ3VsYWRvciBxdWUgdm9jw6ogcmVxdWVzaXRvdSBlc3TDoSBkaXNwb27DrXZlbCBlIGZvaSBcIm1vZHByb2JlZFwiP1xuIgorIi0gVGVudGFuZG8gc2V0YXIgdW1hIHBvbMOtdGljYSBpbnbDoWxpZGE/XG4iCisiLSBUZW50YW5kbyBzZXRhciB1bWEgZnJlcXXDqm5jaWEgZXNwZWPDrWZpY2EsIG1hcyBvIHJlZ3VsYWRvciBlbSBuw612ZWwgZGUgIgorInVzdcOhcmlvIG7Do28gZXN0w6EgZGlzcG9uw612ZWwsXG4iCisiICAgcG9yIGV4ZW1wbG8gZGV2aWRvIGFvIGhhcmR3YXJlIHF1ZSBuw6NvIHBvZGUgc2VyIHNldGFkbyBwcmEgdW1hIGZyZXF1w6puY2lhICIKKyJlc3BlY8OtZmljYVxuIgorIiAgIG91IHBvcnF1ZSBvIHJlZ3VsYWRvciBlbSBuw612ZWwgZGUgdXN1w6FyaW8gbsOjbyBmb2kgY2FycmVnYWRvP1xuIgorCisjOiB1dGlscy9jcHVmcmVxLXNldC5jOjE3MAorIywgYy1mb3JtYXQKK21zZ2lkICJ3cm9uZywgdW5rbm93biBvciB1bmhhbmRsZWQgQ1BVP1xuIgorbXNnc3RyICJDUFUgZXJyYWRvLCBkZXNjb25oZWNpZG8gb3UgaW5lc3BlcmFkbz9cbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzozMDIKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorInRoZSAtZi8tLWZyZXEgcGFyYW1ldGVyIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIC1kLy0tbWluLCAtdS8tLW1heCBvclxuIgorIi1nLy0tZ292ZXJub3IgcGFyYW1ldGVyc1xuIgorbXNnc3RyICIiCisibyBwYXLDom1ldHJvIC1mLy0tZnJlcSBuw6NvIHBvZGUgc2VyIGNvbWJpbmFkbyBjb20gb3MgcGFyw6JtZXRyb3MgLWQvLS1taW4sIC0iCisidS8tLW1heCBvdVxuIgorIi1nLy0tZ292ZXJub3JcbiIKKworIzogdXRpbHMvY3B1ZnJlcS1zZXQuYzozMDgKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIkF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgb3V0IG9mIC1mLy0tZnJlcSwgLWQvLS1taW4sIC11Ly0tbWF4LCBhbmRcbiIKKyItZy8tLWdvdmVybm9yIG11c3QgYmUgcGFzc2VkXG4iCittc2dzdHIgIiIKKyJQZWxvIG1lbm9zIHVtIHBhcsOibWV0cm8gZW50cmUgLWYvLS1mcmVxLCAtZC8tLW1pbiwgLXUvLS1tYXgsIGVcbiIKKyItZy8tLWdvdmVybm9yIGRldmUgc2VyIHVzYWRvXG4iCisKKyM6IHV0aWxzL2NwdWZyZXEtc2V0LmM6MzQ3CisjLCBjLWZvcm1hdAorbXNnaWQgIlNldHRpbmcgY3B1OiAlZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjIyCisjLCBjLWZvcm1hdAorbXNnaWQgIlVzYWdlOiBjcHVwb3dlciBzZXQgWyAtYiB2YWwgXSBbIC1tIHZhbCBdIFsgLXMgdmFsIF1cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzoyNAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtYiwgLS1wZXJmLWJpYXMgW1ZBTF0gICAgU2V0cyBDUFUncyBwb3dlciB2cyBwZXJmb3JtYW5jZSBwb2xpY3kgb24gc29tZVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIG1vZGVscyBbMC0xNV0sIHNlZSBtYW5wYWdlIGZvciBkZXRhaWxzXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6MjYKKyMsIGMtZm9ybWF0Cittc2dpZCAiIgorIiAgLW0sIC0tc2NoZWQtbWMgIFtWQUxdICAgIFNldHMgdGhlIGtlcm5lbCdzIG11bHRpIGNvcmUgc2NoZWR1bGVyIHBvbGljeS5cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzoyNworIywgYy1mb3JtYXQKK21zZ2lkICIiCisiICAtcywgLS1zY2hlZC1zbXQgW1ZBTF0gICAgU2V0cyB0aGUga2VybmVsJ3MgdGhyZWFkIHNpYmxpbmcgc2NoZWR1bGVyICIKKyJwb2xpY3kuXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6ODAKKyMsIGMtZm9ybWF0Cittc2dpZCAiLS1wZXJmLWJpYXMgcGFyYW0gb3V0IG9mIHJhbmdlIFswLSVkXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjkxCisjLCBjLWZvcm1hdAorbXNnaWQgIi0tc2NoZWQtbWMgcGFyYW0gb3V0IG9mIHJhbmdlIFswLSVkXVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLXNldC5jOjEwMgorIywgYy1mb3JtYXQKK21zZ2lkICItLXNjaGVkLXNtdCBwYXJhbSBvdXQgb2YgcmFuZ2UgWzAtJWRdXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItc2V0LmM6MTIxCisjLCBjLWZvcm1hdAorbXNnaWQgIkVycm9yIHNldHRpbmcgc2NoZWQtbWMgJXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzoxMjcKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3Igc2V0dGluZyBzY2hlZC1zbXQgJXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1zZXQuYzoxNDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiRXJyb3Igc2V0dGluZyBwZXJmLWJpYXMgdmFsdWUgb24gQ1BVICVkXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjIxCisjLCBjLWZvcm1hdAorbXNnaWQgIlVzYWdlOiBjcHVwb3dlciBpbmZvIFsgLWIgXSBbIC1tIF0gWyAtcyBdXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjIzCisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1iLCAtLXBlcmYtYmlhcyAgICBHZXRzIENQVSdzIHBvd2VyIHZzIHBlcmZvcm1hbmNlIHBvbGljeSBvbiBzb21lXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgbW9kZWxzIFswLTE1XSwgc2VlIG1hbnBhZ2UgZm9yIGRldGFpbHNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MjUKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiAgLW0sIC0tc2NoZWQtbWMgICAgIEdldHMgdGhlIGtlcm5lbCdzIG11bHRpIGNvcmUgc2NoZWR1bGVyIHBvbGljeS5cbiIKK21zZ3N0ciAiIgorIi0tcCwgLS1wb2xpY3kgICAgICAgICBPYnRlbSBhIHBvbMOtdGljYSBkbyBjcHVmcmVxIGVtIHVzbyBubyBtb21lbnRvICpcbiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjI2CisjLCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1zLCAtLXNjaGVkLXNtdCAgICBHZXRzIHRoZSBrZXJuZWwncyB0aHJlYWQgc2libGluZyBzY2hlZHVsZXIgcG9saWN5LlxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdXBvd2VyLWluZm8uYzoyOAorIywgYy1mb3JtYXQKK21zZ2lkICIiCisiXG4iCisiUGFzc2luZyBubyBvcHRpb24gd2lsbCBzaG93IGFsbCBpbmZvLCBieSBkZWZhdWx0IG9ubHkgb24gY29yZSAwXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjEwMgorIywgYy1mb3JtYXQKK21zZ2lkICJTeXN0ZW0ncyBtdWx0aSBjb3JlIHNjaGVkdWxlciBzZXR0aW5nOiAiCittc2dzdHIgIiIKKworIy4gaWYgc3lzZnMgZmlsZSBpcyBtaXNzaW5nIGl0J3M6IGVycm5vID09IEVOT0VOVAorIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjEwNSB1dGlscy9jcHVwb3dlci1pbmZvLmM6MTE0CisjLCBjLWZvcm1hdAorbXNnaWQgIm5vdCBzdXBwb3J0ZWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MTExCisjLCBjLWZvcm1hdAorbXNnaWQgIlN5c3RlbSdzIHRocmVhZCBzaWJsaW5nIHNjaGVkdWxlciBzZXR0aW5nOiAiCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjEyNgorIywgYy1mb3JtYXQKK21zZ2lkICJJbnRlbCdzIHBlcmZvcm1hbmNlIGJpYXMgc2V0dGluZyBuZWVkcyByb290IHByaXZpbGVnZXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MTI4CisjLCBjLWZvcm1hdAorbXNnaWQgIlN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IEludGVsJ3MgcGVyZm9ybWFuY2UgYmlhcyBzZXR0aW5nXG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1cG93ZXItaW5mby5jOjE0NworIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgcmVhZCBwZXJmLWJpYXMgdmFsdWVcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVwb3dlci1pbmZvLmM6MTUwCisjLCBjLWZvcm1hdAorbXNnaWQgInBlcmYtYmlhczogJWRcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoyOAorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQW5hbHl6aW5nIENQVSAlZDpcbiIKK21zZ3N0ciAiYW5hbGlzYW5kbyBvIENQVSAlZDpcbiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MzIKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ1BVICV1OiBObyBpZGxlIHN0YXRlc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjM2CisjLCBjLWZvcm1hdAorbXNnaWQgIkNQVSAldTogQ2FuJ3QgcmVhZCBpZGxlIHN0YXRlIGluZm9cbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo0MQorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZGV0ZXJtaW5lIG1heCBpZGxlIHN0YXRlICV1XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6NDYKKyMsIGMtZm9ybWF0Cittc2dpZCAiTnVtYmVyIG9mIGlkbGUgc3RhdGVzOiAlZFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjQ4CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJBdmFpbGFibGUgaWRsZSBzdGF0ZXM6IgorbXNnc3RyICIgIG7DrXZlaXMgZGUgZnJlcXXDqm5jaWEgZGlzcG9uw612ZWlzOiAiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjcxCisjLCBjLWZvcm1hdAorbXNnaWQgIkZsYWdzL0Rlc2NyaXB0aW9uOiAlc1xuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjc0CisjLCBjLWZvcm1hdAorbXNnaWQgIkxhdGVuY3k6ICVsdVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjc2CisjLCBjLWZvcm1hdAorbXNnaWQgIlVzYWdlOiAlbHVcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo3OAorIywgYy1mb3JtYXQKK21zZ2lkICJEdXJhdGlvbjogJWxsdVxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjkwCisjLCBjLWZvcm1hdAorbXNnaWQgIkNvdWxkIG5vdCBkZXRlcm1pbmUgY3B1aWRsZSBkcml2ZXJcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo5NAorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiQ1BVaWRsZSBkcml2ZXI6ICVzXG4iCittc2dzdHIgIiAgZHJpdmVyOiAlc1xuIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzo5OQorIywgYy1mb3JtYXQKK21zZ2lkICJDb3VsZCBub3QgZGV0ZXJtaW5lIGNwdWlkbGUgZ292ZXJub3JcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMDMKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ1BVaWRsZSBnb3Zlcm5vcjogJXNcbiIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMjIKKyMsIGMtZm9ybWF0Cittc2dpZCAiQ1BVICV1OiBDYW4ndCByZWFkIEMtc3RhdGUgaW5mb1xuIgorbXNnc3RyICIiCisKKyMuIHByaW50ZigiQ3N0YXRlczogJWRcbiIsIGNzdGF0ZXMpOworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTI3CisjLCBjLWZvcm1hdAorbXNnaWQgImFjdGl2ZSBzdGF0ZTogICAgICAgICAgICBDMFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEyOAorIywgYy1mb3JtYXQKK21zZ2lkICJtYXhfY3N0YXRlOiAgICAgICAgICAgICAgQyV1XG4iCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTI5CisjLCBmdXp6eSwgYy1mb3JtYXQKK21zZ2lkICJtYXhpbXVtIGFsbG93ZWQgbGF0ZW5jeTogJWx1IHVzZWNcbiIKK21zZ3N0ciAiICBtYWlvciBsYXTDqm5jaWEgZGUgdHJhbnNpw6fDo286ICIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTMwCisjLCBjLWZvcm1hdAorbXNnaWQgInN0YXRlczpcdFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEzMgorIywgYy1mb3JtYXQKK21zZ2lkICIgICAgQyVkOiAgICAgICAgICAgICAgICAgIHR5cGVbQyVkXSAiCittc2dzdHIgIiIKKworIzogdXRpbHMvY3B1aWRsZS1pbmZvLmM6MTM0CisjLCBjLWZvcm1hdAorbXNnaWQgInByb21vdGlvblstLV0gZGVtb3Rpb25bLS1dICIKK21zZ3N0ciAiIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxMzUKKyMsIGMtZm9ybWF0Cittc2dpZCAibGF0ZW5jeVslMDNsdV0gIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEzNworIywgYy1mb3JtYXQKK21zZ2lkICJ1c2FnZVslMDhsdV0gIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjEzOQorIywgYy1mb3JtYXQKK21zZ2lkICJkdXJhdGlvblslMDIwTHVdIFxuIgorbXNnc3RyICIiCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjE0NworIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiVXNhZ2U6IGNwdXBvd2VyIGlkbGVpbmZvIFtvcHRpb25zXVxuIgorbXNnc3RyICJVc286IGNwdWZyZXEtaW5mbyBbb3DDp8O1ZXNdXG4iCisKKyM6IHV0aWxzL2NwdWlkbGUtaW5mby5jOjE0OQorIywgZnV6enksIGMtZm9ybWF0Cittc2dpZCAiICAtcywgLS1zaWxlbnQgICAgICAgICBPbmx5IHNob3cgZ2VuZXJhbCBDLXN0YXRlIGluZm9ybWF0aW9uXG4iCittc2dzdHIgIiAgLWUsIC0tZGVidWcgICAgICAgICAgTW9zdHJhIGluZm9ybWHDp8OjbyBkZSBkZWJ1Z1xuIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoxNTAKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIiIKKyIgIC1vLCAtLXByb2MgICAgICAgICAgIFByaW50cyBvdXQgaW5mb3JtYXRpb24gbGlrZSBwcm92aWRlZCBieSB0aGUgL3Byb2MvIgorImFjcGkvcHJvY2Vzc29yLyovcG93ZXJcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZSBpbiBvbGRlciBrZXJuZWxzXG4iCittc2dzdHIgIiIKKyIgIC1vLCAtLXByb2MgICAgICAgICAgIE1vc3RyYSBpbmZvcm1hw6fDo28gZG8gdGlwbyBwcm92aWRhIHBlbGEgaW50ZXJmYWNlIC8iCisicHJvYy9jcHVmcmVxXG4iCisiICAgICAgICAgICAgICAgICAgICAgICBlbSBrZXJuZWxzIDIuNC4gZSBtYWlzIHJlY2VudGVzIDIuNlxuIgorCisjOiB1dGlscy9jcHVpZGxlLWluZm8uYzoyMDkKKyMsIGZ1enp5LCBjLWZvcm1hdAorbXNnaWQgIllvdSBjYW4ndCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgb3V0cHV0LXNwZWNpZmljIGFyZ3VtZW50XG4iCittc2dzdHIgIiIKKyJWb2PDqiBuw6NvIHBvZGUgZXNwZWNpZmljYXIgbWFpcyBkbyBxdWUgdW0gcGFyw6JtZXRybyAtLWNwdSBlL291XG4iCisibWFpcyBkbyBxdWUgdW0gYXJndW1lbnRvIGRlIHNhw61kYSBlc3BlY8OtZmljb1xuIgorCisjfiBtc2dpZCAiIgorI34gIiAgLWMgQ1BVLCAtLWNwdSBDUFUgICAgQ1BVIG51bWJlciB3aGljaCBpbmZvcm1hdGlvbiBzaGFsbCBiZSBkZXRlcm1pbmVkICIKKyN+ICJhYm91dFxuIgorI34gbXNnc3RyICIiCisjfiAiICAtYyBDUFUsIC0tY3B1IENQVSAgICBuw7ptZXJvIGRvIENQVSBzb2JyZSBvIHF1YWwgYXMgaW5mb3LDp8O1ZXMgZGV2ZW0gc2VyICIKKyN+ICJkZXRlcm1pbmFkYXNcbiIKKworI34gbXNnaWQgIiIKKyN+ICIgIC1jIENQVSwgLS1jcHUgQ1BVICAgICAgICBudW1iZXIgb2YgQ1BVIHdoZXJlIGNwdWZyZXEgc2V0dGluZ3Mgc2hhbGwgYmUgIgorI34gIm1vZGlmaWVkXG4iCisjfiBtc2dzdHIgIiIKKyN+ICIgIC1jIENQVSwgLS1jcHUgQ1BVICAgICAgICBuw7ptZXJvIGRvIENQVSBvbmRlIGFzIGNvbmZpZ3VyYcOnw7VlcyBkbyBjcHVmcmVxICIKKyN+ICJ2w6NvIHNlciBtb2RpZmljYWRhc1xuIgpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvYnVpbHRpbi5oIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvYnVpbHRpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NzBmZmIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9idWlsdGluLmgKQEAgLTAsMCArMSwxOCBAQAorI2lmbmRlZiBCVUlMVElOX0gKKyNkZWZpbmUgQlVJTFRJTl9ICisKK2V4dGVybiBpbnQgY21kX3NldChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpOworZXh0ZXJuIGludCBjbWRfaW5mbyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpOworZXh0ZXJuIGludCBjbWRfZnJlcV9zZXQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KTsKK2V4dGVybiBpbnQgY21kX2ZyZXFfaW5mbyhpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpOworZXh0ZXJuIGludCBjbWRfaWRsZV9pbmZvKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndik7CitleHRlcm4gaW50IGNtZF9tb25pdG9yKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndik7CisKK2V4dGVybiB2b2lkIHNldF9oZWxwKHZvaWQpOworZXh0ZXJuIHZvaWQgaW5mb19oZWxwKHZvaWQpOworZXh0ZXJuIHZvaWQgZnJlcV9zZXRfaGVscCh2b2lkKTsKK2V4dGVybiB2b2lkIGZyZXFfaW5mb19oZWxwKHZvaWQpOworZXh0ZXJuIHZvaWQgaWRsZV9pbmZvX2hlbHAodm9pZCk7CitleHRlcm4gdm9pZCBtb25pdG9yX2hlbHAodm9pZCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvY3B1ZnJlcS1pbmZvLmMgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9jcHVmcmVxLWluZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTFkMjVmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvY3B1ZnJlcS1pbmZvLmMKQEAgLTAsMCArMSw3MDggQEAKKy8qCisgKiAgKEMpIDIwMDQtMjAwOSAgRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGRvbWluaWticm9kb3dza2kuZGU+CisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMi4KKyAqLworCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKworI2luY2x1ZGUgImNwdWZyZXEuaCIKKyNpbmNsdWRlICJoZWxwZXJzL2hlbHBlcnMuaCIKKyNpbmNsdWRlICJoZWxwZXJzL2JpdG1hc2suaCIKKworI2RlZmluZSBMSU5FX0xFTiAxMAorCitzdGF0aWMgdW5zaWduZWQgaW50IGNvdW50X2NwdXModm9pZCkKK3sKKwlGSUxFICpmcDsKKwljaGFyIHZhbHVlW0xJTkVfTEVOXTsKKwl1bnNpZ25lZCBpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBpbnQgY3B1bnIgPSAwOworCisJZnAgPSBmb3BlbigiL3Byb2Mvc3RhdCIsICJyIik7CisJaWYgKCFmcCkgeworCQlwcmludGYoXygiQ291bGRuJ3QgY291bnQgdGhlIG51bWJlciBvZiBDUFVzICglczogJXMpLCBhc3N1bWluZyAxXG4iKSwgIi9wcm9jL3N0YXQiLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gMTsKKwl9CisKKwl3aGlsZSAoIWZlb2YoZnApKSB7CisJCWlmICghZmdldHModmFsdWUsIExJTkVfTEVOLCBmcCkpCisJCQljb250aW51ZTsKKwkJdmFsdWVbTElORV9MRU4gLSAxXSA9ICdcMCc7CisJCWlmIChzdHJsZW4odmFsdWUpIDwgKExJTkVfTEVOIC0gMikpCisJCQljb250aW51ZTsKKwkJaWYgKHN0cnN0cih2YWx1ZSwgImNwdSAiKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoc3NjYW5mKHZhbHVlLCAiY3B1JWQgIiwgJmNwdW5yKSAhPSAxKQorCQkJY29udGludWU7CisJCWlmIChjcHVuciA+IHJldCkKKwkJCXJldCA9IGNwdW5yOworCX0KKwlmY2xvc2UoZnApOworCisJLyogY3B1IGNvdW50IHN0YXJ0cyBmcm9tIDAsIG9uIGVycm9yIHJldHVybiAxIChVUCkgKi8KKwlyZXR1cm4gcmV0ICsgMTsKK30KKworCitzdGF0aWMgdm9pZCBwcm9jX2NwdWZyZXFfb3V0cHV0KHZvaWQpCit7CisJdW5zaWduZWQgaW50IGNwdSwgbnJfY3B1czsKKwlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeTsKKwl1bnNpZ25lZCBpbnQgbWluX3BjdGcgPSAwOworCXVuc2lnbmVkIGludCBtYXhfcGN0ZyA9IDA7CisJdW5zaWduZWQgbG9uZyBtaW4sIG1heDsKKworCXByaW50ZihfKCIgICAgICAgICAgbWluaW11bSBDUFUgZnJlcXVlbmN5ICAtICBtYXhpbXVtIENQVSBmcmVxdWVuY3kgIC0gIGdvdmVybm9yXG4iKSk7CisKKwlucl9jcHVzID0gY291bnRfY3B1cygpOworCWZvciAoY3B1ID0gMDsgY3B1IDwgbnJfY3B1czsgY3B1KyspIHsKKwkJcG9saWN5ID0gY3B1ZnJlcV9nZXRfcG9saWN5KGNwdSk7CisJCWlmICghcG9saWN5KQorCQkJY29udGludWU7CisKKwkJaWYgKGNwdWZyZXFfZ2V0X2hhcmR3YXJlX2xpbWl0cyhjcHUsICZtaW4sICZtYXgpKSB7CisJCQltYXggPSAwOworCQl9IGVsc2UgeworCQkJbWluX3BjdGcgPSAocG9saWN5LT5taW4gKiAxMDApIC8gbWF4OworCQkJbWF4X3BjdGcgPSAocG9saWN5LT5tYXggKiAxMDApIC8gbWF4OworCQl9CisJCXByaW50ZigiQ1BVJTNkICAgICU5bHUga0h6ICglM2QgJSUpICAtICAlOWx1IGtIeiAoJTNkICUlKSAgLSAgJXNcbiIsCisJCQljcHUgLCBwb2xpY3ktPm1pbiwgbWF4ID8gbWluX3BjdGcgOiAwLCBwb2xpY3ktPm1heCwKKwkJCW1heCA/IG1heF9wY3RnIDogMCwgcG9saWN5LT5nb3Zlcm5vcik7CisKKwkJY3B1ZnJlcV9wdXRfcG9saWN5KHBvbGljeSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBwcmludF9zcGVlZCh1bnNpZ25lZCBsb25nIHNwZWVkKQoreworCXVuc2lnbmVkIGxvbmcgdG1wOworCisJaWYgKHNwZWVkID4gMTAwMDAwMCkgeworCQl0bXAgPSBzcGVlZCAlIDEwMDAwOworCQlpZiAodG1wID49IDUwMDApCisJCQlzcGVlZCArPSAxMDAwMDsKKwkJcHJpbnRmKCIldS4lMDJ1IEdIeiIsICgodW5zaWduZWQgaW50KSBzcGVlZC8xMDAwMDAwKSwKKwkJCSgodW5zaWduZWQgaW50KSAoc3BlZWQlMTAwMDAwMCkvMTAwMDApKTsKKwl9IGVsc2UgaWYgKHNwZWVkID4gMTAwMDAwKSB7CisJCXRtcCA9IHNwZWVkICUgMTAwMDsKKwkJaWYgKHRtcCA+PSA1MDApCisJCQlzcGVlZCArPSAxMDAwOworCQlwcmludGYoIiV1IE1IeiIsICgodW5zaWduZWQgaW50KSBzcGVlZCAvIDEwMDApKTsKKwl9IGVsc2UgaWYgKHNwZWVkID4gMTAwMCkgeworCQl0bXAgPSBzcGVlZCAlIDEwMDsKKwkJaWYgKHRtcCA+PSA1MCkKKwkJCXNwZWVkICs9IDEwMDsKKwkJcHJpbnRmKCIldS4lMDF1IE1IeiIsICgodW5zaWduZWQgaW50KSBzcGVlZC8xMDAwKSwKKwkJCSgodW5zaWduZWQgaW50KSAoc3BlZWQlMTAwMCkvMTAwKSk7CisJfSBlbHNlCisJCXByaW50ZigiJWx1IGtIeiIsIHNwZWVkKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfZHVyYXRpb24odW5zaWduZWQgbG9uZyBkdXJhdGlvbikKK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCWlmIChkdXJhdGlvbiA+IDEwMDAwMDApIHsKKwkJdG1wID0gZHVyYXRpb24gJSAxMDAwMDsKKwkJaWYgKHRtcCA+PSA1MDAwKQorCQkJZHVyYXRpb24gKz0gMTAwMDA7CisJCXByaW50ZigiJXUuJTAydSBtcyIsICgodW5zaWduZWQgaW50KSBkdXJhdGlvbi8xMDAwMDAwKSwKKwkJCSgodW5zaWduZWQgaW50KSAoZHVyYXRpb24lMTAwMDAwMCkvMTAwMDApKTsKKwl9IGVsc2UgaWYgKGR1cmF0aW9uID4gMTAwMDAwKSB7CisJCXRtcCA9IGR1cmF0aW9uICUgMTAwMDsKKwkJaWYgKHRtcCA+PSA1MDApCisJCQlkdXJhdGlvbiArPSAxMDAwOworCQlwcmludGYoIiV1IHVzIiwgKCh1bnNpZ25lZCBpbnQpIGR1cmF0aW9uIC8gMTAwMCkpOworCX0gZWxzZSBpZiAoZHVyYXRpb24gPiAxMDAwKSB7CisJCXRtcCA9IGR1cmF0aW9uICUgMTAwOworCQlpZiAodG1wID49IDUwKQorCQkJZHVyYXRpb24gKz0gMTAwOworCQlwcmludGYoIiV1LiUwMXUgdXMiLCAoKHVuc2lnbmVkIGludCkgZHVyYXRpb24vMTAwMCksCisJCQkoKHVuc2lnbmVkIGludCkgKGR1cmF0aW9uJTEwMDApLzEwMCkpOworCX0gZWxzZQorCQlwcmludGYoIiVsdSBucyIsIGR1cmF0aW9uKTsKKworCXJldHVybjsKK30KKworLyogLS1ib29zdCAvIC1iICovCisKK3N0YXRpYyBpbnQgZ2V0X2Jvb3N0X21vZGUodW5zaWduZWQgaW50IGNwdSkKK3sKKwlpbnQgc3VwcG9ydCwgYWN0aXZlLCBiX3N0YXRlcyA9IDAsIHJldCwgcHN0YXRlX25vLCBpOworCS8qIFRvRG86IE1ha2UgdGhpcyBtb3JlIGdsb2JhbCAqLworCXVuc2lnbmVkIGxvbmcgcHN0YXRlc1tNQVhfSFdfUFNUQVRFU10gPSB7MCx9OworCisJaWYgKGNwdXBvd2VyX2NwdV9pbmZvLnZlbmRvciAhPSBYODZfVkVORE9SX0FNRCAmJgorCSAgICBjcHVwb3dlcl9jcHVfaW5mby52ZW5kb3IgIT0gWDg2X1ZFTkRPUl9JTlRFTCkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBjcHVmcmVxX2hhc19ib29zdF9zdXBwb3J0KGNwdSwgJnN1cHBvcnQsICZhY3RpdmUsICZiX3N0YXRlcyk7CisJaWYgKHJldCkgeworCQlwcmludGYoXygiRXJyb3Igd2hpbGUgZXZhbHVhdGluZyBCb29zdCBDYXBhYmlsaXRpZXMiCisJCQkJIiBvbiBDUFUgJWQgLS0gYXJlIHlvdSByb290P1xuIiksIGNwdSk7CisJCXJldHVybiByZXQ7CisJfQorCS8qIFAgc3RhdGUgY2hhbmdlcyB2aWEgTVNSIGFyZSBpZGVudGlmaWVkIHZpYSBjcHVpZCA4MDAwMDAwNworCSAgIG9uIEludGVsIGFuZCBBTUQsIGJ1dCB3ZSBhc3N1bWUgYm9vc3QgY2FwYWJsZSBtYWNoaW5lcyBjYW4gZG8gdGhhdAorCSAgIGlmIChjcHVpZF9lYXgoMHg4MDAwMDAwMCkgPj0gMHg4MDAwMDAwNworCSAgICYmIChjcHVpZF9lZHgoMHg4MDAwMDAwNykgJiAoMSA8PCA3KSkpCisJKi8KKworCXByaW50ZihfKCIgIGJvb3N0IHN0YXRlIHN1cHBvcnQ6XG4iKSk7CisKKwlwcmludGYoXygiICAgIFN1cHBvcnRlZDogJXNcbiIpLCBzdXBwb3J0ID8gXygieWVzIikgOiBfKCJubyIpKTsKKwlwcmludGYoXygiICAgIEFjdGl2ZTogJXNcbiIpLCBhY3RpdmUgPyBfKCJ5ZXMiKSA6IF8oIm5vIikpOworCisJaWYgKGNwdXBvd2VyX2NwdV9pbmZvLnZlbmRvciA9PSBYODZfVkVORE9SX0FNRCAmJgorCSAgICBjcHVwb3dlcl9jcHVfaW5mby5mYW1pbHkgPj0gMHgxMCkgeworCQlyZXQgPSBkZWNvZGVfcHN0YXRlcyhjcHUsIGNwdXBvd2VyX2NwdV9pbmZvLmZhbWlseSwgYl9zdGF0ZXMsCisJCQkJICAgICBwc3RhdGVzLCAmcHN0YXRlX25vKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcHJpbnRmKF8oIiAgICBCb29zdCBTdGF0ZXM6ICVkXG4iKSwgYl9zdGF0ZXMpOworCQlwcmludGYoXygiICAgIFRvdGFsIFN0YXRlczogJWRcbiIpLCBwc3RhdGVfbm8pOworCQlmb3IgKGkgPSAwOyBpIDwgcHN0YXRlX25vOyBpKyspIHsKKwkJCWlmIChpIDwgYl9zdGF0ZXMpCisJCQkJcHJpbnRmKF8oIiAgICBQc3RhdGUtUGIlZDogJWx1TUh6IChib29zdCBzdGF0ZSkiCisJCQkJCSAiXG4iKSwgaSwgcHN0YXRlc1tpXSk7CisJCQllbHNlCisJCQkJcHJpbnRmKF8oIiAgICBQc3RhdGUtUCVkOiAgJWx1TUh6XG4iKSwKKwkJCQkgICAgICAgaSAtIGJfc3RhdGVzLCBwc3RhdGVzW2ldKTsKKwkJfQorCX0gZWxzZSBpZiAoY3B1cG93ZXJfY3B1X2luZm8uY2FwcyAmIENQVVBPV0VSX0NBUF9IQVNfVFVSQk9fUkFUSU8pIHsKKwkJZG91YmxlIGJjbGs7CisJCXVuc2lnbmVkIGxvbmcgbG9uZyBpbnRlbF90dXJib19yYXRpbyA9IDA7CisJCXVuc2lnbmVkIGludCByYXRpbzsKKworCQkvKiBBbnkgd2F5IHRvIGF1dG9kZXRlY3QgdGhpcyA/ICovCisJCWlmIChjcHVwb3dlcl9jcHVfaW5mby5jYXBzICYgQ1BVUE9XRVJfQ0FQX0lTX1NOQikKKwkJCWJjbGsgPSAxMDAuMDA7CisJCWVsc2UKKwkJCWJjbGsgPSAxMzMuMzM7CisJCWludGVsX3R1cmJvX3JhdGlvID0gbXNyX2ludGVsX2dldF90dXJib19yYXRpbyhjcHUpOworCQlkcHJpbnQgKCIgICAgUmF0aW86IDB4JWxseCAtIGJjbGs6ICVmXG4iLAorCQkJaW50ZWxfdHVyYm9fcmF0aW8sIGJjbGspOworCisJCXJhdGlvID0gKGludGVsX3R1cmJvX3JhdGlvID4+IDI0KSAmIDB4RkY7CisJCWlmIChyYXRpbykKKwkJCXByaW50ZihfKCIgICAgJS4wZiBNSHogbWF4IHR1cmJvIDQgYWN0aXZlIGNvcmVzXG4iKSwKKwkJCSAgICAgICByYXRpbyAqIGJjbGspOworCisJCXJhdGlvID0gKGludGVsX3R1cmJvX3JhdGlvID4+IDE2KSAmIDB4RkY7CisJCWlmIChyYXRpbykKKwkJCXByaW50ZihfKCIgICAgJS4wZiBNSHogbWF4IHR1cmJvIDMgYWN0aXZlIGNvcmVzXG4iKSwKKwkJCSAgICAgICByYXRpbyAqIGJjbGspOworCisJCXJhdGlvID0gKGludGVsX3R1cmJvX3JhdGlvID4+IDgpICYgMHhGRjsKKwkJaWYgKHJhdGlvKQorCQkJcHJpbnRmKF8oIiAgICAlLjBmIE1IeiBtYXggdHVyYm8gMiBhY3RpdmUgY29yZXNcbiIpLAorCQkJICAgICAgIHJhdGlvICogYmNsayk7CisKKwkJcmF0aW8gPSAoaW50ZWxfdHVyYm9fcmF0aW8gPj4gMCkgJiAweEZGOworCQlpZiAocmF0aW8pCisJCQlwcmludGYoXygiICAgICUuMGYgTUh6IG1heCB0dXJibyAxIGFjdGl2ZSBjb3Jlc1xuIiksCisJCQkgICAgICAgcmF0aW8gKiBiY2xrKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRlYnVnX291dHB1dF9vbmUodW5zaWduZWQgaW50IGNwdSkKK3sKKwljaGFyICpkcml2ZXI7CisJc3RydWN0IGNwdWZyZXFfYWZmZWN0ZWRfY3B1cyAqY3B1czsKKwlzdHJ1Y3QgY3B1ZnJlcV9hdmFpbGFibGVfZnJlcXVlbmNpZXMgKmZyZXFzOworCXVuc2lnbmVkIGxvbmcgbWluLCBtYXgsIGZyZXFfa2VybmVsLCBmcmVxX2hhcmR3YXJlOworCXVuc2lnbmVkIGxvbmcgdG90YWxfdHJhbnMsIGxhdGVuY3k7CisJdW5zaWduZWQgbG9uZyBsb25nIHRvdGFsX3RpbWU7CisJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3k7CisJc3RydWN0IGNwdWZyZXFfYXZhaWxhYmxlX2dvdmVybm9ycyAqZ292ZXJub3JzOworCXN0cnVjdCBjcHVmcmVxX3N0YXRzICpzdGF0czsKKworCWlmIChjcHVmcmVxX2NwdV9leGlzdHMoY3B1KSkKKwkJcmV0dXJuOworCisJZnJlcV9rZXJuZWwgPSBjcHVmcmVxX2dldF9mcmVxX2tlcm5lbChjcHUpOworCWZyZXFfaGFyZHdhcmUgPSBjcHVmcmVxX2dldF9mcmVxX2hhcmR3YXJlKGNwdSk7CisKKwlkcml2ZXIgPSBjcHVmcmVxX2dldF9kcml2ZXIoY3B1KTsKKwlpZiAoIWRyaXZlcikgeworCQlwcmludGYoXygiICBubyBvciB1bmtub3duIGNwdWZyZXEgZHJpdmVyIGlzIGFjdGl2ZSBvbiB0aGlzIENQVVxuIikpOworCX0gZWxzZSB7CisJCXByaW50ZihfKCIgIGRyaXZlcjogJXNcbiIpLCBkcml2ZXIpOworCQljcHVmcmVxX3B1dF9kcml2ZXIoZHJpdmVyKTsKKwl9CisKKwljcHVzID0gY3B1ZnJlcV9nZXRfcmVsYXRlZF9jcHVzKGNwdSk7CisJaWYgKGNwdXMpIHsKKwkJcHJpbnRmKF8oIiAgQ1BVcyB3aGljaCBydW4gYXQgdGhlIHNhbWUgaGFyZHdhcmUgZnJlcXVlbmN5OiAiKSk7CisJCXdoaWxlIChjcHVzLT5uZXh0KSB7CisJCQlwcmludGYoIiVkICIsIGNwdXMtPmNwdSk7CisJCQljcHVzID0gY3B1cy0+bmV4dDsKKwkJfQorCQlwcmludGYoIiVkXG4iLCBjcHVzLT5jcHUpOworCQljcHVmcmVxX3B1dF9yZWxhdGVkX2NwdXMoY3B1cyk7CisJfQorCisJY3B1cyA9IGNwdWZyZXFfZ2V0X2FmZmVjdGVkX2NwdXMoY3B1KTsKKwlpZiAoY3B1cykgeworCQlwcmludGYoXygiICBDUFVzIHdoaWNoIG5lZWQgdG8gaGF2ZSB0aGVpciBmcmVxdWVuY3kgY29vcmRpbmF0ZWQgYnkgc29mdHdhcmU6ICIpKTsKKwkJd2hpbGUgKGNwdXMtPm5leHQpIHsKKwkJCXByaW50ZigiJWQgIiwgY3B1cy0+Y3B1KTsKKwkJCWNwdXMgPSBjcHVzLT5uZXh0OworCQl9CisJCXByaW50ZigiJWRcbiIsIGNwdXMtPmNwdSk7CisJCWNwdWZyZXFfcHV0X2FmZmVjdGVkX2NwdXMoY3B1cyk7CisJfQorCisJbGF0ZW5jeSA9IGNwdWZyZXFfZ2V0X3RyYW5zaXRpb25fbGF0ZW5jeShjcHUpOworCWlmIChsYXRlbmN5KSB7CisJCXByaW50ZihfKCIgIG1heGltdW0gdHJhbnNpdGlvbiBsYXRlbmN5OiAiKSk7CisJCXByaW50X2R1cmF0aW9uKGxhdGVuY3kpOworCQlwcmludGYoIi5cbiIpOworCX0KKworCWlmICghKGNwdWZyZXFfZ2V0X2hhcmR3YXJlX2xpbWl0cyhjcHUsICZtaW4sICZtYXgpKSkgeworCQlwcmludGYoXygiICBoYXJkd2FyZSBsaW1pdHM6ICIpKTsKKwkJcHJpbnRfc3BlZWQobWluKTsKKwkJcHJpbnRmKCIgLSAiKTsKKwkJcHJpbnRfc3BlZWQobWF4KTsKKwkJcHJpbnRmKCJcbiIpOworCX0KKworCWZyZXFzID0gY3B1ZnJlcV9nZXRfYXZhaWxhYmxlX2ZyZXF1ZW5jaWVzKGNwdSk7CisJaWYgKGZyZXFzKSB7CisJCXByaW50ZihfKCIgIGF2YWlsYWJsZSBmcmVxdWVuY3kgc3RlcHM6ICIpKTsKKwkJd2hpbGUgKGZyZXFzLT5uZXh0KSB7CisJCQlwcmludF9zcGVlZChmcmVxcy0+ZnJlcXVlbmN5KTsKKwkJCXByaW50ZigiLCAiKTsKKwkJCWZyZXFzID0gZnJlcXMtPm5leHQ7CisJCX0KKwkJcHJpbnRfc3BlZWQoZnJlcXMtPmZyZXF1ZW5jeSk7CisJCXByaW50ZigiXG4iKTsKKwkJY3B1ZnJlcV9wdXRfYXZhaWxhYmxlX2ZyZXF1ZW5jaWVzKGZyZXFzKTsKKwl9CisKKwlnb3Zlcm5vcnMgPSBjcHVmcmVxX2dldF9hdmFpbGFibGVfZ292ZXJub3JzKGNwdSk7CisJaWYgKGdvdmVybm9ycykgeworCQlwcmludGYoXygiICBhdmFpbGFibGUgY3B1ZnJlcSBnb3Zlcm5vcnM6ICIpKTsKKwkJd2hpbGUgKGdvdmVybm9ycy0+bmV4dCkgeworCQkJcHJpbnRmKCIlcywgIiwgZ292ZXJub3JzLT5nb3Zlcm5vcik7CisJCQlnb3Zlcm5vcnMgPSBnb3Zlcm5vcnMtPm5leHQ7CisJCX0KKwkJcHJpbnRmKCIlc1xuIiwgZ292ZXJub3JzLT5nb3Zlcm5vcik7CisJCWNwdWZyZXFfcHV0X2F2YWlsYWJsZV9nb3Zlcm5vcnMoZ292ZXJub3JzKTsKKwl9CisKKwlwb2xpY3kgPSBjcHVmcmVxX2dldF9wb2xpY3koY3B1KTsKKwlpZiAocG9saWN5KSB7CisJCXByaW50ZihfKCIgIGN1cnJlbnQgcG9saWN5OiBmcmVxdWVuY3kgc2hvdWxkIGJlIHdpdGhpbiAiKSk7CisJCXByaW50X3NwZWVkKHBvbGljeS0+bWluKTsKKwkJcHJpbnRmKF8oIiBhbmQgIikpOworCQlwcmludF9zcGVlZChwb2xpY3ktPm1heCk7CisKKwkJcHJpbnRmKCIuXG4gICAgICAgICAgICAgICAgICAiKTsKKwkJcHJpbnRmKF8oIlRoZSBnb3Zlcm5vciBcIiVzXCIgbWF5IgorCQkgICAgICAgIiBkZWNpZGUgd2hpY2ggc3BlZWQgdG8gdXNlXG4gICAgICAgICAgICAgICAgICB3aXRoaW4gdGhpcyByYW5nZS5cbiIpLAorCQkgICAgICAgcG9saWN5LT5nb3Zlcm5vcik7CisJCWNwdWZyZXFfcHV0X3BvbGljeShwb2xpY3kpOworCX0KKworCWlmIChmcmVxX2tlcm5lbCB8fCBmcmVxX2hhcmR3YXJlKSB7CisJCXByaW50ZihfKCIgIGN1cnJlbnQgQ1BVIGZyZXF1ZW5jeSBpcyAiKSk7CisJCWlmIChmcmVxX2hhcmR3YXJlKSB7CisJCQlwcmludF9zcGVlZChmcmVxX2hhcmR3YXJlKTsKKwkJCXByaW50ZihfKCIgKGFzc2VydGVkIGJ5IGNhbGwgdG8gaGFyZHdhcmUpIikpOworCQl9IGVsc2UKKwkJCXByaW50X3NwZWVkKGZyZXFfa2VybmVsKTsKKwkJcHJpbnRmKCIuXG4iKTsKKwl9CisJc3RhdHMgPSBjcHVmcmVxX2dldF9zdGF0cyhjcHUsICZ0b3RhbF90aW1lKTsKKwlpZiAoc3RhdHMpIHsKKwkJcHJpbnRmKF8oIiAgY3B1ZnJlcSBzdGF0czogIikpOworCQl3aGlsZSAoc3RhdHMpIHsKKwkJCXByaW50X3NwZWVkKHN0YXRzLT5mcmVxdWVuY3kpOworCQkJcHJpbnRmKCI6JS4yZiUlIiwgKDEwMC4wICogc3RhdHMtPnRpbWVfaW5fc3RhdGUpIC8gdG90YWxfdGltZSk7CisJCQlzdGF0cyA9IHN0YXRzLT5uZXh0OworCQkJaWYgKHN0YXRzKQorCQkJCXByaW50ZigiLCAiKTsKKwkJfQorCQljcHVmcmVxX3B1dF9zdGF0cyhzdGF0cyk7CisJCXRvdGFsX3RyYW5zID0gY3B1ZnJlcV9nZXRfdHJhbnNpdGlvbnMoY3B1KTsKKwkJaWYgKHRvdGFsX3RyYW5zKQorCQkJcHJpbnRmKCIgICglbHUpXG4iLCB0b3RhbF90cmFucyk7CisJCWVsc2UKKwkJCXByaW50ZigiXG4iKTsKKwl9CisJZ2V0X2Jvb3N0X21vZGUoY3B1KTsKKworfQorCisvKiAtLWZyZXEgLyAtZiAqLworCitzdGF0aWMgaW50IGdldF9mcmVxX2tlcm5lbCh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBpbnQgaHVtYW4pCit7CisJdW5zaWduZWQgbG9uZyBmcmVxID0gY3B1ZnJlcV9nZXRfZnJlcV9rZXJuZWwoY3B1KTsKKwlpZiAoIWZyZXEpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChodW1hbikgeworCQlwcmludF9zcGVlZChmcmVxKTsKKwkJcHJpbnRmKCJcbiIpOworCX0gZWxzZQorCQlwcmludGYoIiVsdVxuIiwgZnJlcSk7CisJcmV0dXJuIDA7Cit9CisKKworLyogLS1od2ZyZXEgLyAtdyAqLworCitzdGF0aWMgaW50IGdldF9mcmVxX2hhcmR3YXJlKHVuc2lnbmVkIGludCBjcHUsIHVuc2lnbmVkIGludCBodW1hbikKK3sKKwl1bnNpZ25lZCBsb25nIGZyZXEgPSBjcHVmcmVxX2dldF9mcmVxX2hhcmR3YXJlKGNwdSk7CisJaWYgKCFmcmVxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoaHVtYW4pIHsKKwkJcHJpbnRfc3BlZWQoZnJlcSk7CisJCXByaW50ZigiXG4iKTsKKwl9IGVsc2UKKwkJcHJpbnRmKCIlbHVcbiIsIGZyZXEpOworCXJldHVybiAwOworfQorCisvKiAtLWh3bGltaXRzIC8gLWwgKi8KKworc3RhdGljIGludCBnZXRfaGFyZHdhcmVfbGltaXRzKHVuc2lnbmVkIGludCBjcHUpCit7CisJdW5zaWduZWQgbG9uZyBtaW4sIG1heDsKKwlpZiAoY3B1ZnJlcV9nZXRfaGFyZHdhcmVfbGltaXRzKGNwdSwgJm1pbiwgJm1heCkpCisJCXJldHVybiAtRUlOVkFMOworCXByaW50ZigiJWx1ICVsdVxuIiwgbWluLCBtYXgpOworCXJldHVybiAwOworfQorCisvKiAtLWRyaXZlciAvIC1kICovCisKK3N0YXRpYyBpbnQgZ2V0X2RyaXZlcih1bnNpZ25lZCBpbnQgY3B1KQoreworCWNoYXIgKmRyaXZlciA9IGNwdWZyZXFfZ2V0X2RyaXZlcihjcHUpOworCWlmICghZHJpdmVyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwcmludGYoIiVzXG4iLCBkcml2ZXIpOworCWNwdWZyZXFfcHV0X2RyaXZlcihkcml2ZXIpOworCXJldHVybiAwOworfQorCisvKiAtLXBvbGljeSAvIC1wICovCisKK3N0YXRpYyBpbnQgZ2V0X3BvbGljeSh1bnNpZ25lZCBpbnQgY3B1KQoreworCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5ID0gY3B1ZnJlcV9nZXRfcG9saWN5KGNwdSk7CisJaWYgKCFwb2xpY3kpCisJCXJldHVybiAtRUlOVkFMOworCXByaW50ZigiJWx1ICVsdSAlc1xuIiwgcG9saWN5LT5taW4sIHBvbGljeS0+bWF4LCBwb2xpY3ktPmdvdmVybm9yKTsKKwljcHVmcmVxX3B1dF9wb2xpY3kocG9saWN5KTsKKwlyZXR1cm4gMDsKK30KKworLyogLS1nb3Zlcm5vcnMgLyAtZyAqLworCitzdGF0aWMgaW50IGdldF9hdmFpbGFibGVfZ292ZXJub3JzKHVuc2lnbmVkIGludCBjcHUpCit7CisJc3RydWN0IGNwdWZyZXFfYXZhaWxhYmxlX2dvdmVybm9ycyAqZ292ZXJub3JzID0KKwkJY3B1ZnJlcV9nZXRfYXZhaWxhYmxlX2dvdmVybm9ycyhjcHUpOworCWlmICghZ292ZXJub3JzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXdoaWxlIChnb3Zlcm5vcnMtPm5leHQpIHsKKwkJcHJpbnRmKCIlcyAiLCBnb3Zlcm5vcnMtPmdvdmVybm9yKTsKKwkJZ292ZXJub3JzID0gZ292ZXJub3JzLT5uZXh0OworCX0KKwlwcmludGYoIiVzXG4iLCBnb3Zlcm5vcnMtPmdvdmVybm9yKTsKKwljcHVmcmVxX3B1dF9hdmFpbGFibGVfZ292ZXJub3JzKGdvdmVybm9ycyk7CisJcmV0dXJuIDA7Cit9CisKKworLyogLS1hZmZlY3RlZC1jcHVzICAvIC1hICovCisKK3N0YXRpYyBpbnQgZ2V0X2FmZmVjdGVkX2NwdXModW5zaWduZWQgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgY3B1ZnJlcV9hZmZlY3RlZF9jcHVzICpjcHVzID0gY3B1ZnJlcV9nZXRfYWZmZWN0ZWRfY3B1cyhjcHUpOworCWlmICghY3B1cykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl3aGlsZSAoY3B1cy0+bmV4dCkgeworCQlwcmludGYoIiVkICIsIGNwdXMtPmNwdSk7CisJCWNwdXMgPSBjcHVzLT5uZXh0OworCX0KKwlwcmludGYoIiVkXG4iLCBjcHVzLT5jcHUpOworCWNwdWZyZXFfcHV0X2FmZmVjdGVkX2NwdXMoY3B1cyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tcmVsYXRlZC1jcHVzICAvIC1yICovCisKK3N0YXRpYyBpbnQgZ2V0X3JlbGF0ZWRfY3B1cyh1bnNpZ25lZCBpbnQgY3B1KQoreworCXN0cnVjdCBjcHVmcmVxX2FmZmVjdGVkX2NwdXMgKmNwdXMgPSBjcHVmcmVxX2dldF9yZWxhdGVkX2NwdXMoY3B1KTsKKwlpZiAoIWNwdXMpCisJCXJldHVybiAtRUlOVkFMOworCisJd2hpbGUgKGNwdXMtPm5leHQpIHsKKwkJcHJpbnRmKCIlZCAiLCBjcHVzLT5jcHUpOworCQljcHVzID0gY3B1cy0+bmV4dDsKKwl9CisJcHJpbnRmKCIlZFxuIiwgY3B1cy0+Y3B1KTsKKwljcHVmcmVxX3B1dF9yZWxhdGVkX2NwdXMoY3B1cyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIC0tc3RhdHMgLyAtcyAqLworCitzdGF0aWMgaW50IGdldF9mcmVxX3N0YXRzKHVuc2lnbmVkIGludCBjcHUsIHVuc2lnbmVkIGludCBodW1hbikKK3sKKwl1bnNpZ25lZCBsb25nIHRvdGFsX3RyYW5zID0gY3B1ZnJlcV9nZXRfdHJhbnNpdGlvbnMoY3B1KTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdG90YWxfdGltZTsKKwlzdHJ1Y3QgY3B1ZnJlcV9zdGF0cyAqc3RhdHMgPSBjcHVmcmVxX2dldF9zdGF0cyhjcHUsICZ0b3RhbF90aW1lKTsKKwl3aGlsZSAoc3RhdHMpIHsKKwkJaWYgKGh1bWFuKSB7CisJCQlwcmludF9zcGVlZChzdGF0cy0+ZnJlcXVlbmN5KTsKKwkJCXByaW50ZigiOiUuMmYlJSIsCisJCQkJKDEwMC4wICogc3RhdHMtPnRpbWVfaW5fc3RhdGUpIC8gdG90YWxfdGltZSk7CisJCX0gZWxzZQorCQkJcHJpbnRmKCIlbHU6JWxsdSIsCisJCQkJc3RhdHMtPmZyZXF1ZW5jeSwgc3RhdHMtPnRpbWVfaW5fc3RhdGUpOworCQlzdGF0cyA9IHN0YXRzLT5uZXh0OworCQlpZiAoc3RhdHMpCisJCQlwcmludGYoIiwgIik7CisJfQorCWNwdWZyZXFfcHV0X3N0YXRzKHN0YXRzKTsKKwlpZiAodG90YWxfdHJhbnMpCisJCXByaW50ZigiICAoJWx1KVxuIiwgdG90YWxfdHJhbnMpOworCXJldHVybiAwOworfQorCisvKiAtLWxhdGVuY3kgLyAteSAqLworCitzdGF0aWMgaW50IGdldF9sYXRlbmN5KHVuc2lnbmVkIGludCBjcHUsIHVuc2lnbmVkIGludCBodW1hbikKK3sKKwl1bnNpZ25lZCBsb25nIGxhdGVuY3kgPSBjcHVmcmVxX2dldF90cmFuc2l0aW9uX2xhdGVuY3koY3B1KTsKKwlpZiAoIWxhdGVuY3kpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGh1bWFuKSB7CisJCXByaW50X2R1cmF0aW9uKGxhdGVuY3kpOworCQlwcmludGYoIlxuIik7CisJfSBlbHNlCisJCXByaW50ZigiJWx1XG4iLCBsYXRlbmN5KTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBmcmVxX2luZm9faGVscCh2b2lkKQoreworCXByaW50ZihfKCJVc2FnZTogY3B1cG93ZXIgZnJlcWluZm8gW29wdGlvbnNdXG4iKSk7CisJcHJpbnRmKF8oIk9wdGlvbnM6XG4iKSk7CisJcHJpbnRmKF8oIiAgLWUsIC0tZGVidWcgICAgICAgICAgUHJpbnRzIG91dCBkZWJ1ZyBpbmZvcm1hdGlvbiBbZGVmYXVsdF1cbiIpKTsKKwlwcmludGYoXygiICAtZiwgLS1mcmVxICAgICAgICAgICBHZXQgZnJlcXVlbmN5IHRoZSBDUFUgY3VycmVudGx5IHJ1bnMgYXQsIGFjY29yZGluZ1xuIgorCSAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgY3B1ZnJlcSBjb3JlICpcbiIpKTsKKwlwcmludGYoXygiICAtdywgLS1od2ZyZXEgICAgICAgICBHZXQgZnJlcXVlbmN5IHRoZSBDUFUgY3VycmVudGx5IHJ1bnMgYXQsIGJ5IHJlYWRpbmdcbiIKKwkgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgaXQgZnJvbSBoYXJkd2FyZSAob25seSBhdmFpbGFibGUgdG8gcm9vdCkgKlxuIikpOworCXByaW50ZihfKCIgIC1sLCAtLWh3bGltaXRzICAgICAgIERldGVybWluZSB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBDUFUgZnJlcXVlbmN5IGFsbG93ZWQgKlxuIikpOworCXByaW50ZihfKCIgIC1kLCAtLWRyaXZlciAgICAgICAgIERldGVybWluZXMgdGhlIHVzZWQgY3B1ZnJlcSBrZXJuZWwgZHJpdmVyICpcbiIpKTsKKwlwcmludGYoXygiICAtcCwgLS1wb2xpY3kgICAgICAgICBHZXRzIHRoZSBjdXJyZW50bHkgdXNlZCBjcHVmcmVxIHBvbGljeSAqXG4iKSk7CisJcHJpbnRmKF8oIiAgLWcsIC0tZ292ZXJub3JzICAgICAgRGV0ZXJtaW5lcyBhdmFpbGFibGUgY3B1ZnJlcSBnb3Zlcm5vcnMgKlxuIikpOworCXByaW50ZihfKCIgIC1yLCAtLXJlbGF0ZWQtY3B1cyAgIERldGVybWluZXMgd2hpY2ggQ1BVcyBydW4gYXQgdGhlIHNhbWUgaGFyZHdhcmUgZnJlcXVlbmN5ICpcbiIpKTsKKwlwcmludGYoXygiICAtYSwgLS1hZmZlY3RlZC1jcHVzICBEZXRlcm1pbmVzIHdoaWNoIENQVXMgbmVlZCB0byBoYXZlIHRoZWlyIGZyZXF1ZW5jeVxuIgorCQkJIiAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZWQgYnkgc29mdHdhcmUgKlxuIikpOworCXByaW50ZihfKCIgIC1zLCAtLXN0YXRzICAgICAgICAgIFNob3dzIGNwdWZyZXEgc3RhdGlzdGljcyBpZiBhdmFpbGFibGVcbiIpKTsKKwlwcmludGYoXygiICAteSwgLS1sYXRlbmN5ICAgICAgICBEZXRlcm1pbmVzIHRoZSBtYXhpbXVtIGxhdGVuY3kgb24gQ1BVIGZyZXF1ZW5jeSBjaGFuZ2VzICpcbiIpKTsKKwlwcmludGYoXygiICAtYiwgLS1ib29zdCAgICAgICAgICBDaGVja3MgZm9yIHR1cmJvIG9yIGJvb3N0IG1vZGVzICAqXG4iKSk7CisJcHJpbnRmKF8oIiAgLW8sIC0tcHJvYyAgICAgICAgICAgUHJpbnRzIG91dCBpbmZvcm1hdGlvbiBsaWtlIHByb3ZpZGVkIGJ5IHRoZSAvcHJvYy9jcHVmcmVxXG4iCisJICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZSBpbiAyLjQuIGFuZCBlYXJseSAyLjYuIGtlcm5lbHNcbiIpKTsKKwlwcmludGYoXygiICAtbSwgLS1odW1hbiAgICAgICAgICBodW1hbi1yZWFkYWJsZSBvdXRwdXQgZm9yIHRoZSAtZiwgLXcsIC1zIGFuZCAteSBwYXJhbWV0ZXJzXG4iKSk7CisJcHJpbnRmKF8oIiAgLWgsIC0taGVscCAgICAgICAgICAgUHJpbnRzIG91dCB0aGlzIHNjcmVlblxuIikpOworCisJcHJpbnRmKCJcbiIpOworCXByaW50ZihfKCJJZiBubyBhcmd1bWVudCBpcyBnaXZlbiwgZnVsbCBvdXRwdXQgYWJvdXRcbiIKKwkgICAgICAgImNwdWZyZXEgaXMgcHJpbnRlZCB3aGljaCBpcyB1c2VmdWwgZS5nLiBmb3IgcmVwb3J0aW5nIGJ1Z3MuXG5cbiIpKTsKKwlwcmludGYoXygiQnkgZGVmYXVsdCBpbmZvIG9mIENQVSAwIGlzIHNob3duIHdoaWNoIGNhbiBiZSBvdmVycmlkZGVuXG4iCisJCSAid2l0aCB0aGUgY3B1cG93ZXIgLS1jcHUgbWFpbiBjb21tYW5kIG9wdGlvbi5cbiIpKTsKK30KKworc3RhdGljIHN0cnVjdCBvcHRpb24gaW5mb19vcHRzW10gPSB7CisJeyAubmFtZSA9ICJkZWJ1ZyIsCS5oYXNfYXJnID0gbm9fYXJndW1lbnQsCQkuZmxhZyA9IE5VTEwsCS52YWwgPSAnZSd9LAorCXsgLm5hbWUgPSAiYm9vc3QiLAkuaGFzX2FyZyA9IG5vX2FyZ3VtZW50LAkJLmZsYWcgPSBOVUxMLAkudmFsID0gJ2InfSwKKwl7IC5uYW1lID0gImZyZXEiLAkuaGFzX2FyZyA9IG5vX2FyZ3VtZW50LAkJLmZsYWcgPSBOVUxMLAkudmFsID0gJ2YnfSwKKwl7IC5uYW1lID0gImh3ZnJlcSIsCS5oYXNfYXJnID0gbm9fYXJndW1lbnQsCQkuZmxhZyA9IE5VTEwsCS52YWwgPSAndyd9LAorCXsgLm5hbWUgPSAiaHdsaW1pdHMiLAkuaGFzX2FyZyA9IG5vX2FyZ3VtZW50LAkJLmZsYWcgPSBOVUxMLAkudmFsID0gJ2wnfSwKKwl7IC5uYW1lID0gImRyaXZlciIsCS5oYXNfYXJnID0gbm9fYXJndW1lbnQsCQkuZmxhZyA9IE5VTEwsCS52YWwgPSAnZCd9LAorCXsgLm5hbWUgPSAicG9saWN5IiwJLmhhc19hcmcgPSBub19hcmd1bWVudCwJCS5mbGFnID0gTlVMTCwJLnZhbCA9ICdwJ30sCisJeyAubmFtZSA9ICJnb3Zlcm5vcnMiLAkuaGFzX2FyZyA9IG5vX2FyZ3VtZW50LAkJLmZsYWcgPSBOVUxMLAkudmFsID0gJ2cnfSwKKwl7IC5uYW1lID0gInJlbGF0ZWQtY3B1cyIsIC5oYXNfYXJnID0gbm9fYXJndW1lbnQsCS5mbGFnID0gTlVMTCwJLnZhbCA9ICdyJ30sCisJeyAubmFtZSA9ICJhZmZlY3RlZC1jcHVzIiwuaGFzX2FyZyA9IG5vX2FyZ3VtZW50LAkuZmxhZyA9IE5VTEwsCS52YWwgPSAnYSd9LAorCXsgLm5hbWUgPSAic3RhdHMiLAkuaGFzX2FyZyA9IG5vX2FyZ3VtZW50LAkJLmZsYWcgPSBOVUxMLAkudmFsID0gJ3MnfSwKKwl7IC5uYW1lID0gImxhdGVuY3kiLAkuaGFzX2FyZyA9IG5vX2FyZ3VtZW50LAkJLmZsYWcgPSBOVUxMLAkudmFsID0gJ3knfSwKKwl7IC5uYW1lID0gInByb2MiLAkuaGFzX2FyZyA9IG5vX2FyZ3VtZW50LAkJLmZsYWcgPSBOVUxMLAkudmFsID0gJ28nfSwKKwl7IC5uYW1lID0gImh1bWFuIiwJLmhhc19hcmcgPSBub19hcmd1bWVudCwJCS5mbGFnID0gTlVMTCwJLnZhbCA9ICdtJ30sCisJeyAubmFtZSA9ICJoZWxwIiwJLmhhc19hcmcgPSBub19hcmd1bWVudCwJCS5mbGFnID0gTlVMTCwJLnZhbCA9ICdoJ30sCisJeyB9LAorfTsKKworaW50IGNtZF9mcmVxX2luZm8oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWV4dGVybiBjaGFyICpvcHRhcmc7CisJZXh0ZXJuIGludCBvcHRpbmQsIG9wdGVyciwgb3B0b3B0OworCWludCByZXQgPSAwLCBjb250ID0gMTsKKwl1bnNpZ25lZCBpbnQgY3B1ID0gMDsKKwl1bnNpZ25lZCBpbnQgaHVtYW4gPSAwOworCWludCBvdXRwdXRfcGFyYW0gPSAwOworCisJZG8geworCQlyZXQgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiaG9lZndsZHBncmFzbXliIiwgaW5mb19vcHRzLCBOVUxMKTsKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSAnPyc6CisJCQlvdXRwdXRfcGFyYW0gPSAnPyc7CisJCQljb250ID0gMDsKKwkJCWJyZWFrOworCQljYXNlICdoJzoKKwkJCW91dHB1dF9wYXJhbSA9ICdoJzsKKwkJCWNvbnQgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgLTE6CisJCQljb250ID0gMDsKKwkJCWJyZWFrOworCQljYXNlICdiJzoKKwkJY2FzZSAnbyc6CisJCWNhc2UgJ2EnOgorCQljYXNlICdyJzoKKwkJY2FzZSAnZyc6CisJCWNhc2UgJ3AnOgorCQljYXNlICdkJzoKKwkJY2FzZSAnbCc6CisJCWNhc2UgJ3cnOgorCQljYXNlICdmJzoKKwkJY2FzZSAnZSc6CisJCWNhc2UgJ3MnOgorCQljYXNlICd5JzoKKwkJCWlmIChvdXRwdXRfcGFyYW0pIHsKKwkJCQlvdXRwdXRfcGFyYW0gPSAtMTsKKwkJCQljb250ID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW91dHB1dF9wYXJhbSA9IHJldDsKKwkJCWJyZWFrOworCQljYXNlICdtJzoKKwkJCWlmIChodW1hbikgeworCQkJCW91dHB1dF9wYXJhbSA9IC0xOworCQkJCWNvbnQgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJaHVtYW4gPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgb3IgdW5rbm93biBhcmd1bWVudFxuIik7CisJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCQl9CisJfSB3aGlsZSAoY29udCk7CisKKwlzd2l0Y2ggKG91dHB1dF9wYXJhbSkgeworCWNhc2UgJ28nOgorCQlpZiAoIWJpdG1hc2tfaXNhbGxjbGVhcihjcHVzX2Nob3NlbikpIHsKKwkJCXByaW50ZihfKCJUaGUgYXJndW1lbnQgcGFzc2VkIHRvIHRoaXMgdG9vbCBjYW4ndCBiZSAiCisJCQkJICJjb21iaW5lZCB3aXRoIHBhc3NpbmcgYSAtLWNwdSBhcmd1bWVudFxuIikpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAwOgorCQlvdXRwdXRfcGFyYW0gPSAnZSc7CisJfQorCisJcmV0ID0gMDsKKworCS8qIERlZmF1bHQgaXM6IHNob3cgb3V0cHV0IG9mIENQVSAwIG9ubHkgKi8KKwlpZiAoYml0bWFza19pc2FsbGNsZWFyKGNwdXNfY2hvc2VuKSkKKwkJYml0bWFza19zZXRiaXQoY3B1c19jaG9zZW4sIDApOworCisJc3dpdGNoIChvdXRwdXRfcGFyYW0pIHsKKwljYXNlIC0xOgorCQlwcmludGYoXygiWW91IGNhbid0IHNwZWNpZnkgbW9yZSB0aGFuIG9uZSAtLWNwdSBwYXJhbWV0ZXIgYW5kL29yXG4iCisJCSAgICAgICAibW9yZSB0aGFuIG9uZSBvdXRwdXQtc3BlY2lmaWMgYXJndW1lbnRcbiIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSAnPyc6CisJCXByaW50ZihfKCJpbnZhbGlkIG9yIHVua25vd24gYXJndW1lbnRcbiIpKTsKKwkJZnJlcV9pbmZvX2hlbHAoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSAnaCc6CisJCWZyZXFfaW5mb19oZWxwKCk7CisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJY2FzZSAnbyc6CisJCXByb2NfY3B1ZnJlcV9vdXRwdXQoKTsKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwlmb3IgKGNwdSA9IGJpdG1hc2tfZmlyc3QoY3B1c19jaG9zZW4pOworCSAgICAgY3B1IDw9IGJpdG1hc2tfbGFzdChjcHVzX2Nob3Nlbik7IGNwdSsrKSB7CisKKwkJaWYgKCFiaXRtYXNrX2lzYml0c2V0KGNwdXNfY2hvc2VuLCBjcHUpKQorCQkJY29udGludWU7CisJCWlmIChjcHVmcmVxX2NwdV9leGlzdHMoY3B1KSkgeworCQkJcHJpbnRmKF8oImNvdWxkbid0IGFuYWx5emUgQ1BVICVkIGFzIGl0IGRvZXNuJ3Qgc2VlbSB0byBiZSBwcmVzZW50XG4iKSwgY3B1KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXByaW50ZihfKCJhbmFseXppbmcgQ1BVICVkOlxuIiksIGNwdSk7CisKKwkJc3dpdGNoIChvdXRwdXRfcGFyYW0pIHsKKwkJY2FzZSAnYic6CisJCQlnZXRfYm9vc3RfbW9kZShjcHUpOworCQkJYnJlYWs7CisJCWNhc2UgJ2UnOgorCQkJZGVidWdfb3V0cHV0X29uZShjcHUpOworCQkJYnJlYWs7CisJCWNhc2UgJ2EnOgorCQkJcmV0ID0gZ2V0X2FmZmVjdGVkX2NwdXMoY3B1KTsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCXJldCA9IGdldF9yZWxhdGVkX2NwdXMoY3B1KTsKKwkJCWJyZWFrOworCQljYXNlICdnJzoKKwkJCXJldCA9IGdldF9hdmFpbGFibGVfZ292ZXJub3JzKGNwdSk7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQlyZXQgPSBnZXRfcG9saWN5KGNwdSk7CisJCQlicmVhazsKKwkJY2FzZSAnZCc6CisJCQlyZXQgPSBnZXRfZHJpdmVyKGNwdSk7CisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCQlyZXQgPSBnZXRfaGFyZHdhcmVfbGltaXRzKGNwdSk7CisJCQlicmVhazsKKwkJY2FzZSAndyc6CisJCQlyZXQgPSBnZXRfZnJlcV9oYXJkd2FyZShjcHUsIGh1bWFuKTsKKwkJCWJyZWFrOworCQljYXNlICdmJzoKKwkJCXJldCA9IGdldF9mcmVxX2tlcm5lbChjcHUsIGh1bWFuKTsKKwkJCWJyZWFrOworCQljYXNlICdzJzoKKwkJCXJldCA9IGdldF9mcmVxX3N0YXRzKGNwdSwgaHVtYW4pOworCQkJYnJlYWs7CisJCWNhc2UgJ3knOgorCQkJcmV0ID0gZ2V0X2xhdGVuY3koY3B1LCBodW1hbik7CisJCQlicmVhazsKKwkJfQorCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2NwdWZyZXEtc2V0LmMgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9jcHVmcmVxLXNldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNzgzNjIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9jcHVmcmVxLXNldC5jCkBAIC0wLDAgKzEsMzU4IEBACisvKgorICogIChDKSAyMDA0LTIwMDkgIERvbWluaWsgQnJvZG93c2tpIDxsaW51eEBkb21pbmlrYnJvZG93c2tpLmRlPgorICoKKyAqICBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgTGljZW5zZSB2ZXJzaW9uIDIuCisgKi8KKworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKworI2luY2x1ZGUgImNwdWZyZXEuaCIKKyNpbmNsdWRlICJoZWxwZXJzL2hlbHBlcnMuaCIKKworI2RlZmluZSBOT1JNX0ZSRVFfTEVOIDMyCisKK3ZvaWQgZnJlcV9zZXRfaGVscCh2b2lkKQoreworCXByaW50ZihfKCJVc2FnZTogY3B1cG93ZXIgZnJlcXVlbmN5LXNldCBbb3B0aW9uc11cbiIpKTsKKwlwcmludGYoXygiT3B0aW9uczpcbiIpKTsKKwlwcmludGYoXygiICAtZCBGUkVRLCAtLW1pbiBGUkVRICAgICAgbmV3IG1pbmltdW0gQ1BVIGZyZXF1ZW5jeSB0aGUgZ292ZXJub3IgbWF5IHNlbGVjdFxuIikpOworCXByaW50ZihfKCIgIC11IEZSRVEsIC0tbWF4IEZSRVEgICAgICBuZXcgbWF4aW11bSBDUFUgZnJlcXVlbmN5IHRoZSBnb3Zlcm5vciBtYXkgc2VsZWN0XG4iKSk7CisJcHJpbnRmKF8oIiAgLWcgR09WLCAtLWdvdmVybm9yIEdPViAgIG5ldyBjcHVmcmVxIGdvdmVybm9yXG4iKSk7CisJcHJpbnRmKF8oIiAgLWYgRlJFUSwgLS1mcmVxIEZSRVEgICAgIHNwZWNpZmljIGZyZXF1ZW5jeSB0byBiZSBzZXQuIFJlcXVpcmVzIHVzZXJzcGFjZVxuIgorCSAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgZ292ZXJub3IgdG8gYmUgYXZhaWxhYmxlIGFuZCBsb2FkZWRcbiIpKTsKKwlwcmludGYoXygiICAtciwgLS1yZWxhdGVkICAgICAgICAgICAgU3dpdGNoZXMgYWxsIGhhcmR3YXJlLXJlbGF0ZWQgQ1BVc1xuIikpOworCXByaW50ZihfKCIgIC1oLCAtLWhlbHAgICAgICAgICAgICAgICBQcmludHMgb3V0IHRoaXMgc2NyZWVuXG4iKSk7CisJcHJpbnRmKCJcbiIpOworCXByaW50ZihfKCJOb3RlczpcbiIKKwkgICAgICAgIjEuIE9taXR0aW5nIHRoZSAtYyBvciAtLWNwdSBhcmd1bWVudCBpcyBlcXVpdmFsZW50IHRvIHNldHRpbmcgaXQgdG8gXCJhbGxcIlxuIikpOworCXByaW50ZihfKCIyLiBUaGUgLWYgRlJFUSwgLS1mcmVxIEZSRVEgcGFyYW1ldGVyIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIGFueSBvdGhlciBwYXJhbWV0ZXJcbiIKKwkgICAgICAgIiAgIGV4Y2VwdCB0aGUgLWMgQ1BVLCAtLWNwdSBDUFUgcGFyYW1ldGVyXG4iCisJICAgICAgICIzLiBGUkVRdWVuY2llcyBjYW4gYmUgcGFzc2VkIGluIEh6LCBrSHogKGRlZmF1bHQpLCBNSHosIEdIeiwgb3IgVEh6XG4iCisJICAgICAgICIgICBieSBwb3N0Zml4aW5nIHRoZSB2YWx1ZSB3aXRoIHRoZSB3YW50ZWQgdW5pdCBuYW1lLCB3aXRob3V0IGFueSBzcGFjZVxuIgorCSAgICAgICAiICAgKEZSRVF1ZW5jeSBpbiBrSHogPV4gSHogKiAwLjAwMSA9XiBNSHogKiAxMDAwID1eIEdIeiAqIDEwMDAwMDApLlxuIikpOworCit9CisKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uIHNldF9vcHRzW10gPSB7CisJeyAubmFtZSA9ICJtaW4iLAkuaGFzX2FyZyA9IHJlcXVpcmVkX2FyZ3VtZW50LAkuZmxhZyA9IE5VTEwsCS52YWwgPSAnZCd9LAorCXsgLm5hbWUgPSAibWF4IiwJLmhhc19hcmcgPSByZXF1aXJlZF9hcmd1bWVudCwJLmZsYWcgPSBOVUxMLAkudmFsID0gJ3UnfSwKKwl7IC5uYW1lID0gImdvdmVybm9yIiwJLmhhc19hcmcgPSByZXF1aXJlZF9hcmd1bWVudCwJLmZsYWcgPSBOVUxMLAkudmFsID0gJ2cnfSwKKwl7IC5uYW1lID0gImZyZXEiLAkuaGFzX2FyZyA9IHJlcXVpcmVkX2FyZ3VtZW50LAkuZmxhZyA9IE5VTEwsCS52YWwgPSAnZid9LAorCXsgLm5hbWUgPSAiaGVscCIsCS5oYXNfYXJnID0gbm9fYXJndW1lbnQsCQkuZmxhZyA9IE5VTEwsCS52YWwgPSAnaCd9LAorCXsgLm5hbWUgPSAicmVsYXRlZCIsCS5oYXNfYXJnID0gbm9fYXJndW1lbnQsCQkuZmxhZyA9IE5VTEwsCS52YWw9J3InfSwKKwl7IH0sCit9OworCitzdGF0aWMgdm9pZCBwcmludF9lcnJvcih2b2lkKQoreworCXByaW50ZihfKCJFcnJvciBzZXR0aW5nIG5ldyB2YWx1ZXMuIENvbW1vbiBlcnJvcnM6XG4iCisJCQkiLSBEbyB5b3UgaGF2ZSBwcm9wZXIgYWRtaW5pc3RyYXRpb24gcmlnaHRzPyAoc3VwZXItdXNlcj8pXG4iCisJCQkiLSBJcyB0aGUgZ292ZXJub3IgeW91IHJlcXVlc3RlZCBhdmFpbGFibGUgYW5kIG1vZHByb2JlZD9cbiIKKwkJCSItIFRyeWluZyB0byBzZXQgYW4gaW52YWxpZCBwb2xpY3k/XG4iCisJCQkiLSBUcnlpbmcgdG8gc2V0IGEgc3BlY2lmaWMgZnJlcXVlbmN5LCBidXQgdXNlcnNwYWNlIGdvdmVybm9yIGlzIG5vdCBhdmFpbGFibGUsXG4iCisJCQkiICAgZm9yIGV4YW1wbGUgYmVjYXVzZSBvZiBoYXJkd2FyZSB3aGljaCBjYW5ub3QgYmUgc2V0IHRvIGEgc3BlY2lmaWMgZnJlcXVlbmN5XG4iCisJCQkiICAgb3IgYmVjYXVzZSB0aGUgdXNlcnNwYWNlIGdvdmVybm9yIGlzbid0IGxvYWRlZD9cbiIpKTsKK307CisKK3N0cnVjdCBmcmVxX3VuaXRzIHsKKwljaGFyCQkqc3RyX3VuaXQ7CisJaW50CQlwb3dlcl9vZl90ZW47Cit9OworCitjb25zdCBzdHJ1Y3QgZnJlcV91bml0cyBkZWZfdW5pdHNbXSA9IHsKKwl7Imh6IiwgLTN9LAorCXsia2h6IiwgMH0sIC8qIGRlZmF1bHQgKi8KKwl7Im1oeiIsIDN9LAorCXsiZ2h6IiwgNn0sCisJeyJ0aHoiLCA5fSwKKwl7TlVMTCwgMH0KK307CisKK3N0YXRpYyB2b2lkIHByaW50X3Vua25vd25fYXJnKHZvaWQpCit7CisJcHJpbnRmKF8oImludmFsaWQgb3IgdW5rbm93biBhcmd1bWVudFxuIikpOworCWZyZXFfc2V0X2hlbHAoKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgc3RyaW5nX3RvX2ZyZXF1ZW5jeShjb25zdCBjaGFyICpzdHIpCit7CisJY2hhciBub3JtYWxpemVkW05PUk1fRlJFUV9MRU5dOworCWNvbnN0IHN0cnVjdCBmcmVxX3VuaXRzICp1bml0OworCWNvbnN0IGNoYXIgKnNjYW47CisJY2hhciAqZW5kOworCXVuc2lnbmVkIGxvbmcgZnJlcTsKKwlpbnQgcG93ZXIgPSAwLCBtYXRjaF9jb3VudCA9IDAsIGksIGNwLCBwYWQ7CisKKwl3aGlsZSAoKnN0ciA9PSAnMCcpCisJCXN0cisrOworCisJZm9yIChzY2FuID0gc3RyOyBpc2RpZ2l0KCpzY2FuKSB8fCAqc2NhbiA9PSAnLic7IHNjYW4rKykgeworCQlpZiAoKnNjYW4gPT0gJy4nICYmIG1hdGNoX2NvdW50ID09IDApCisJCQltYXRjaF9jb3VudCA9IDE7CisJCWVsc2UgaWYgKCpzY2FuID09ICcuJyAmJiBtYXRjaF9jb3VudCA9PSAxKQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKCpzY2FuKSB7CisJCW1hdGNoX2NvdW50ID0gMDsKKwkJZm9yICh1bml0ID0gZGVmX3VuaXRzOyB1bml0LT5zdHJfdW5pdDsgdW5pdCsrKSB7CisJCQlmb3IgKGkgPSAwOworCQkJICAgICBzY2FuW2ldICYmIHRvbG93ZXIoc2NhbltpXSkgPT0gdW5pdC0+c3RyX3VuaXRbaV07CisJCQkgICAgICsraSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChzY2FuW2ldKQorCQkJCWNvbnRpbnVlOworCQkJbWF0Y2hfY291bnQrKzsKKwkJCXBvd2VyID0gdW5pdC0+cG93ZXJfb2ZfdGVuOworCQl9CisJCWlmIChtYXRjaF9jb3VudCAhPSAxKQorCQkJcmV0dXJuIDA7CisJfQorCisJLyogY291bnQgdGhlIG51bWJlciBvZiBkaWdpdHMgdG8gYmUgY29waWVkICovCisJZm9yIChjcCA9IDA7IGlzZGlnaXQoc3RyW2NwXSk7IGNwKyspCisJCWNvbnRpbnVlOworCisJaWYgKHN0cltjcF0gPT0gJy4nKSB7CisJCXdoaWxlIChwb3dlciA+IC0xICYmIGlzZGlnaXQoc3RyW2NwKzFdKSkKKwkJCWNwKyssIHBvd2VyLS07CisJfQorCWlmIChwb3dlciA+PSAtMSkJLyogbm90IGVub3VnaCA9PiBwYWQgKi8KKwkJcGFkID0gcG93ZXIgKyAxOworCWVsc2UJCQkvKiB0byBtdWNoID0+IHN0cmlwICovCisJCXBhZCA9IDAsIGNwICs9IHBvd2VyICsgMTsKKwkvKiBjaGVjayBib3VuZHMgKi8KKwlpZiAoY3AgPD0gMCB8fCBjcCArIHBhZCA+IE5PUk1fRlJFUV9MRU4gLSAxKQorCQlyZXR1cm4gMDsKKworCS8qIGNvcHkgZGlnaXRzICovCisJZm9yIChpID0gMDsgaSA8IGNwOyBpKyssIHN0cisrKSB7CisJCWlmICgqc3RyID09ICcuJykKKwkJCXN0cisrOworCQlub3JtYWxpemVkW2ldID0gKnN0cjsKKwl9CisJLyogYW5kIHBhZCAqLworCWZvciAoOyBpIDwgY3AgKyBwYWQ7IGkrKykKKwkJbm9ybWFsaXplZFtpXSA9ICcwJzsKKworCS8qIHJvdW5kIHVwLCBkb3duID8gKi8KKwltYXRjaF9jb3VudCA9IChub3JtYWxpemVkW2ktMV0gPj0gJzUnKTsKKwkvKiBhbmQgZHJvcCB0aGUgZGVjaW1hbCBwYXJ0ICovCisJbm9ybWFsaXplZFtpLTFdID0gMDsgLyogY3AgPiAwICYmIHBhZCA+PSAwID09PiBpID4gMCAqLworCisJLyogZmluYWwgY29udmVyc2lvbiAoYW5kIGFwcGx5aW5nIHJvdW5kaW5nKSAqLworCWVycm5vID0gMDsKKwlmcmVxID0gc3RydG91bChub3JtYWxpemVkLCAmZW5kLCAxMCk7CisJaWYgKGVycm5vKQorCQlyZXR1cm4gMDsKKwllbHNlIHsKKwkJaWYgKG1hdGNoX2NvdW50ICYmIGZyZXEgIT0gVUxPTkdfTUFYKQorCQkJZnJlcSsrOworCQlyZXR1cm4gZnJlcTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZG9fbmV3X3BvbGljeSh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKm5ld19wb2wpCit7CisJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpjdXJfcG9sID0gY3B1ZnJlcV9nZXRfcG9saWN5KGNwdSk7CisJaW50IHJldDsKKworCWlmICghY3VyX3BvbCkgeworCQlwcmludGYoXygid3JvbmcsIHVua25vd24gb3IgdW5oYW5kbGVkIENQVT9cbiIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFuZXdfcG9sLT5taW4pCisJCW5ld19wb2wtPm1pbiA9IGN1cl9wb2wtPm1pbjsKKworCWlmICghbmV3X3BvbC0+bWF4KQorCQluZXdfcG9sLT5tYXggPSBjdXJfcG9sLT5tYXg7CisKKwlpZiAoIW5ld19wb2wtPmdvdmVybm9yKQorCQluZXdfcG9sLT5nb3Zlcm5vciA9IGN1cl9wb2wtPmdvdmVybm9yOworCisJcmV0ID0gY3B1ZnJlcV9zZXRfcG9saWN5KGNwdSwgbmV3X3BvbCk7CisKKwljcHVmcmVxX3B1dF9wb2xpY3koY3VyX3BvbCk7CisKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgZG9fb25lX2NwdSh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKm5ld19wb2wsCisJCXVuc2lnbmVkIGxvbmcgZnJlcSwgdW5zaWduZWQgaW50IHBjKQoreworCXN3aXRjaCAocGMpIHsKKwljYXNlIDA6CisJCXJldHVybiBjcHVmcmVxX3NldF9mcmVxdWVuY3koY3B1LCBmcmVxKTsKKworCWNhc2UgMToKKwkJLyogaWYgb25seSBvbmUgdmFsdWUgb2YgYSBwb2xpY3kgaXMgdG8gYmUgY2hhbmdlZCwgd2UgY2FuCisJCSAqIHVzZSBhICJmYXN0IHBhdGgiLgorCQkgKi8KKwkJaWYgKG5ld19wb2wtPm1pbikKKwkJCXJldHVybiBjcHVmcmVxX21vZGlmeV9wb2xpY3lfbWluKGNwdSwgbmV3X3BvbC0+bWluKTsKKwkJZWxzZSBpZiAobmV3X3BvbC0+bWF4KQorCQkJcmV0dXJuIGNwdWZyZXFfbW9kaWZ5X3BvbGljeV9tYXgoY3B1LCBuZXdfcG9sLT5tYXgpOworCQllbHNlIGlmIChuZXdfcG9sLT5nb3Zlcm5vcikKKwkJCXJldHVybiBjcHVmcmVxX21vZGlmeV9wb2xpY3lfZ292ZXJub3IoY3B1LAorCQkJCQkJCW5ld19wb2wtPmdvdmVybm9yKTsKKworCWRlZmF1bHQ6CisJCS8qIHNsb3cgcGF0aCAqLworCQlyZXR1cm4gZG9fbmV3X3BvbGljeShjcHUsIG5ld19wb2wpOworCX0KK30KKworaW50IGNtZF9mcmVxX3NldChpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJZXh0ZXJuIGNoYXIgKm9wdGFyZzsKKwlleHRlcm4gaW50IG9wdGluZCwgb3B0ZXJyLCBvcHRvcHQ7CisJaW50IHJldCA9IDAsIGNvbnQgPSAxOworCWludCBkb3VibGVfcGFybSA9IDAsIHJlbGF0ZWQgPSAwLCBwb2xpY3ljaGFuZ2UgPSAwOworCXVuc2lnbmVkIGxvbmcgZnJlcSA9IDA7CisJY2hhciBnb3ZbMjBdOworCXVuc2lnbmVkIGludCBjcHU7CisKKwlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgbmV3X3BvbCA9IHsKKwkJLm1pbiA9IDAsCisJCS5tYXggPSAwLAorCQkuZ292ZXJub3IgPSBOVUxMLAorCX07CisKKwkvKiBwYXJhbWV0ZXIgcGFyc2luZyAqLworCWRvIHsKKwkJcmV0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgImQ6dTpnOmY6aHIiLCBzZXRfb3B0cywgTlVMTCk7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgJz8nOgorCQkJcHJpbnRfdW5rbm93bl9hcmcoKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQljYXNlICdoJzoKKwkJCWZyZXFfc2V0X2hlbHAoKTsKKwkJCXJldHVybiAwOworCQljYXNlIC0xOgorCQkJY29udCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQlpZiAocmVsYXRlZCkKKwkJCQlkb3VibGVfcGFybSsrOworCQkJcmVsYXRlZCsrOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkJaWYgKG5ld19wb2wubWluKQorCQkJCWRvdWJsZV9wYXJtKys7CisJCQlwb2xpY3ljaGFuZ2UrKzsKKwkJCW5ld19wb2wubWluID0gc3RyaW5nX3RvX2ZyZXF1ZW5jeShvcHRhcmcpOworCQkJaWYgKG5ld19wb2wubWluID09IDApIHsKKwkJCQlwcmludF91bmtub3duX2FyZygpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ3UnOgorCQkJaWYgKG5ld19wb2wubWF4KQorCQkJCWRvdWJsZV9wYXJtKys7CisJCQlwb2xpY3ljaGFuZ2UrKzsKKwkJCW5ld19wb2wubWF4ID0gc3RyaW5nX3RvX2ZyZXF1ZW5jeShvcHRhcmcpOworCQkJaWYgKG5ld19wb2wubWF4ID09IDApIHsKKwkJCQlwcmludF91bmtub3duX2FyZygpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ2YnOgorCQkJaWYgKGZyZXEpCisJCQkJZG91YmxlX3Bhcm0rKzsKKwkJCWZyZXEgPSBzdHJpbmdfdG9fZnJlcXVlbmN5KG9wdGFyZyk7CisJCQlpZiAoZnJlcSA9PSAwKSB7CisJCQkJcHJpbnRfdW5rbm93bl9hcmcoKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdnJzoKKwkJCWlmIChuZXdfcG9sLmdvdmVybm9yKQorCQkJCWRvdWJsZV9wYXJtKys7CisJCQlwb2xpY3ljaGFuZ2UrKzsKKwkJCWlmICgoc3RybGVuKG9wdGFyZykgPCAzKSB8fCAoc3RybGVuKG9wdGFyZykgPiAxOCkpIHsKKwkJCQlwcmludF91bmtub3duX2FyZygpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJaWYgKChzc2NhbmYob3B0YXJnLCAiJXMiLCBnb3YpKSAhPSAxKSB7CisJCQkJcHJpbnRfdW5rbm93bl9hcmcoKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCW5ld19wb2wuZ292ZXJub3IgPSBnb3Y7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKGNvbnQpOworCisJLyogcGFyYW1ldGVyIGNoZWNraW5nICovCisJaWYgKGRvdWJsZV9wYXJtKSB7CisJCXByaW50ZigidGhlIHNhbWUgcGFyYW1ldGVyIHdhcyBwYXNzZWQgbW9yZSB0aGFuIG9uY2VcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZnJlcSAmJiBwb2xpY3ljaGFuZ2UpIHsKKwkJcHJpbnRmKF8oInRoZSAtZi8tLWZyZXEgcGFyYW1ldGVyIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIC1kLy0tbWluLCAtdS8tLW1heCBvclxuIgorCQkJCSItZy8tLWdvdmVybm9yIHBhcmFtZXRlcnNcbiIpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFmcmVxICYmICFwb2xpY3ljaGFuZ2UpIHsKKwkJcHJpbnRmKF8oIkF0IGxlYXN0IG9uZSBwYXJhbWV0ZXIgb3V0IG9mIC1mLy0tZnJlcSwgLWQvLS1taW4sIC11Ly0tbWF4LCBhbmRcbiIKKwkJCQkiLWcvLS1nb3Zlcm5vciBtdXN0IGJlIHBhc3NlZFxuIikpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBEZWZhdWx0IGlzOiBzZXQgYWxsIENQVXMgKi8KKwlpZiAoYml0bWFza19pc2FsbGNsZWFyKGNwdXNfY2hvc2VuKSkKKwkJYml0bWFza19zZXRhbGwoY3B1c19jaG9zZW4pOworCisJLyogQWxzbyBzZXQgZnJlcXVlbmN5IHNldHRpbmdzIGZvciByZWxhdGVkIENQVXMgaWYgLXIgaXMgcGFzc2VkICovCisJaWYgKHJlbGF0ZWQpIHsKKwkJZm9yIChjcHUgPSBiaXRtYXNrX2ZpcnN0KGNwdXNfY2hvc2VuKTsKKwkJICAgICBjcHUgPD0gYml0bWFza19sYXN0KGNwdXNfY2hvc2VuKTsgY3B1KyspIHsKKwkJCXN0cnVjdCBjcHVmcmVxX2FmZmVjdGVkX2NwdXMgKmNwdXM7CisKKwkJCWlmICghYml0bWFza19pc2JpdHNldChjcHVzX2Nob3NlbiwgY3B1KSB8fAorCQkJICAgIGNwdWZyZXFfY3B1X2V4aXN0cyhjcHUpKQorCQkJCWNvbnRpbnVlOworCisJCQljcHVzID0gY3B1ZnJlcV9nZXRfcmVsYXRlZF9jcHVzKGNwdSk7CisJCQlpZiAoIWNwdXMpCisJCQkJYnJlYWs7CisJCQl3aGlsZSAoY3B1cy0+bmV4dCkgeworCQkJCWJpdG1hc2tfc2V0Yml0KGNwdXNfY2hvc2VuLCBjcHVzLT5jcHUpOworCQkJCWNwdXMgPSBjcHVzLT5uZXh0OworCQkJfQorCQkJY3B1ZnJlcV9wdXRfcmVsYXRlZF9jcHVzKGNwdXMpOworCQl9CisJfQorCisKKwkvKiBsb29wIG92ZXIgQ1BVcyAqLworCWZvciAoY3B1ID0gYml0bWFza19maXJzdChjcHVzX2Nob3Nlbik7CisJICAgICBjcHUgPD0gYml0bWFza19sYXN0KGNwdXNfY2hvc2VuKTsgY3B1KyspIHsKKworCQlpZiAoIWJpdG1hc2tfaXNiaXRzZXQoY3B1c19jaG9zZW4sIGNwdSkgfHwKKwkJICAgIGNwdWZyZXFfY3B1X2V4aXN0cyhjcHUpKQorCQkJY29udGludWU7CisKKwkJcHJpbnRmKF8oIlNldHRpbmcgY3B1OiAlZFxuIiksIGNwdSk7CisJCXJldCA9IGRvX29uZV9jcHUoY3B1LCAmbmV3X3BvbCwgZnJlcSwgcG9saWN5Y2hhbmdlKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCX0KKworCWlmIChyZXQpCisJCXByaW50X2Vycm9yKCk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvY3B1aWRsZS1pbmZvLmMgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9jcHVpZGxlLWluZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGRhMzU3Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvY3B1aWRsZS1pbmZvLmMKQEAgLTAsMCArMSwyNDQgQEAKKy8qCisgKiAgKEMpIDIwMDQtMjAwOSAgRG9taW5payBCcm9kb3dza2kgPGxpbnV4QGRvbWluaWticm9kb3dza2kuZGU+CisgKiAgKEMpIDIwMTAgICAgICAgVGhvbWFzIFJlbm5pbmdlciA8dHJlbm5Ac3VzZS5kZT4KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICovCisKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxjcHVmcmVxLmg+CisKKyNpbmNsdWRlICJoZWxwZXJzL2hlbHBlcnMuaCIKKyNpbmNsdWRlICJoZWxwZXJzL3N5c2ZzLmgiCisjaW5jbHVkZSAiaGVscGVycy9iaXRtYXNrLmgiCisKKyNkZWZpbmUgTElORV9MRU4gMTAKKworc3RhdGljIHZvaWQgY3B1aWRsZV9jcHVfb3V0cHV0KHVuc2lnbmVkIGludCBjcHUsIGludCB2ZXJib3NlKQoreworCWludCBpZGxlc3RhdGVzLCBpZGxlc3RhdGU7CisJY2hhciAqdG1wOworCisJcHJpbnRmKF8gKCJBbmFseXppbmcgQ1BVICVkOlxuIiksIGNwdSk7CisKKwlpZGxlc3RhdGVzID0gc3lzZnNfZ2V0X2lkbGVzdGF0ZV9jb3VudChjcHUpOworCWlmIChpZGxlc3RhdGVzID09IDApIHsKKwkJcHJpbnRmKF8oIkNQVSAldTogTm8gaWRsZSBzdGF0ZXNcbiIpLCBjcHUpOworCQlyZXR1cm47CisJfSBlbHNlIGlmIChpZGxlc3RhdGVzIDw9IDApIHsKKwkJcHJpbnRmKF8oIkNQVSAldTogQ2FuJ3QgcmVhZCBpZGxlIHN0YXRlIGluZm9cbiIpLCBjcHUpOworCQlyZXR1cm47CisJfQorCXRtcCA9IHN5c2ZzX2dldF9pZGxlc3RhdGVfbmFtZShjcHUsIGlkbGVzdGF0ZXMgLSAxKTsKKwlpZiAoIXRtcCkgeworCQlwcmludGYoXygiQ291bGQgbm90IGRldGVybWluZSBtYXggaWRsZSBzdGF0ZSAldVxuIiksCisJCSAgICAgICBpZGxlc3RhdGVzIC0gMSk7CisJCXJldHVybjsKKwl9CisKKwlwcmludGYoXygiTnVtYmVyIG9mIGlkbGUgc3RhdGVzOiAlZFxuIiksIGlkbGVzdGF0ZXMpOworCisJcHJpbnRmKF8oIkF2YWlsYWJsZSBpZGxlIHN0YXRlczoiKSk7CisJZm9yIChpZGxlc3RhdGUgPSAxOyBpZGxlc3RhdGUgPCBpZGxlc3RhdGVzOyBpZGxlc3RhdGUrKykgeworCQl0bXAgPSBzeXNmc19nZXRfaWRsZXN0YXRlX25hbWUoY3B1LCBpZGxlc3RhdGUpOworCQlpZiAoIXRtcCkKKwkJCWNvbnRpbnVlOworCQlwcmludGYoIiAlcyIsIHRtcCk7CisJCWZyZWUodG1wKTsKKwl9CisJcHJpbnRmKCJcbiIpOworCisJaWYgKCF2ZXJib3NlKQorCQlyZXR1cm47CisKKwlmb3IgKGlkbGVzdGF0ZSA9IDE7IGlkbGVzdGF0ZSA8IGlkbGVzdGF0ZXM7IGlkbGVzdGF0ZSsrKSB7CisJCXRtcCA9IHN5c2ZzX2dldF9pZGxlc3RhdGVfbmFtZShjcHUsIGlkbGVzdGF0ZSk7CisJCWlmICghdG1wKQorCQkJY29udGludWU7CisJCXByaW50ZigiJXM6XG4iLCB0bXApOworCQlmcmVlKHRtcCk7CisKKwkJdG1wID0gc3lzZnNfZ2V0X2lkbGVzdGF0ZV9kZXNjKGNwdSwgaWRsZXN0YXRlKTsKKwkJaWYgKCF0bXApCisJCQljb250aW51ZTsKKwkJcHJpbnRmKF8oIkZsYWdzL0Rlc2NyaXB0aW9uOiAlc1xuIiksIHRtcCk7CisJCWZyZWUodG1wKTsKKworCQlwcmludGYoXygiTGF0ZW5jeTogJWx1XG4iKSwKKwkJICAgICAgIHN5c2ZzX2dldF9pZGxlc3RhdGVfbGF0ZW5jeShjcHUsIGlkbGVzdGF0ZSkpOworCQlwcmludGYoXygiVXNhZ2U6ICVsdVxuIiksCisJCSAgICAgICBzeXNmc19nZXRfaWRsZXN0YXRlX3VzYWdlKGNwdSwgaWRsZXN0YXRlKSk7CisJCXByaW50ZihfKCJEdXJhdGlvbjogJWxsdVxuIiksCisJCSAgICAgICBzeXNmc19nZXRfaWRsZXN0YXRlX3RpbWUoY3B1LCBpZGxlc3RhdGUpKTsKKwl9CisJcHJpbnRmKCJcbiIpOworfQorCitzdGF0aWMgdm9pZCBjcHVpZGxlX2dlbmVyYWxfb3V0cHV0KHZvaWQpCit7CisJY2hhciAqdG1wOworCisJdG1wID0gc3lzZnNfZ2V0X2NwdWlkbGVfZHJpdmVyKCk7CisJaWYgKCF0bXApIHsKKwkJcHJpbnRmKF8oIkNvdWxkIG5vdCBkZXRlcm1pbmUgY3B1aWRsZSBkcml2ZXJcbiIpKTsKKwkJcmV0dXJuOworCX0KKworCXByaW50ZihfKCJDUFVpZGxlIGRyaXZlcjogJXNcbiIpLCB0bXApOworCWZyZWUodG1wKTsKKworCXRtcCA9IHN5c2ZzX2dldF9jcHVpZGxlX2dvdmVybm9yKCk7CisJaWYgKCF0bXApIHsKKwkJcHJpbnRmKF8oIkNvdWxkIG5vdCBkZXRlcm1pbmUgY3B1aWRsZSBnb3Zlcm5vclxuIikpOworCQlyZXR1cm47CisJfQorCisJcHJpbnRmKF8oIkNQVWlkbGUgZ292ZXJub3I6ICVzXG4iKSwgdG1wKTsKKwlmcmVlKHRtcCk7Cit9CisKK3N0YXRpYyB2b2lkIHByb2NfY3B1aWRsZV9jcHVfb3V0cHV0KHVuc2lnbmVkIGludCBjcHUpCit7CisJbG9uZyBtYXhfYWxsb3dlZF9jc3RhdGUgPSAyMDAwMDAwMDAwOworCWludCBjc3RhdGVzLCBjc3RhdGU7CisKKwljc3RhdGVzID0gc3lzZnNfZ2V0X2lkbGVzdGF0ZV9jb3VudChjcHUpOworCWlmIChjc3RhdGVzID09IDApIHsKKwkJLyoKKwkJICogR28gb24gYW5kIHByaW50IHNhbWUgdXNlbGVzcyBpbmZvIGFzIHlvdSdkIHNlZSB3aXRoCisJCSAqIGNhdCAvcHJvYy9hY3BpL3Byb2Nlc3Nvci8uLi9wb3dlcgorCQkgKglwcmludGYoXygiQ1BVICV1OiBObyBDLXN0YXRlcyBhdmFpbGFibGVcbiIpLCBjcHUpOworCQkgKglyZXR1cm47CisJCSAqLworCX0gZWxzZSBpZiAoY3N0YXRlcyA8PSAwKSB7CisJCXByaW50ZihfKCJDUFUgJXU6IENhbid0IHJlYWQgQy1zdGF0ZSBpbmZvXG4iKSwgY3B1KTsKKwkJcmV0dXJuOworCX0KKwkvKiBwcmludGYoIkNzdGF0ZXM6ICVkXG4iLCBjc3RhdGVzKTsgKi8KKworCXByaW50ZihfKCJhY3RpdmUgc3RhdGU6ICAgICAgICAgICAgQzBcbiIpKTsKKwlwcmludGYoXygibWF4X2NzdGF0ZTogICAgICAgICAgICAgIEMldVxuIiksIGNzdGF0ZXMtMSk7CisJcHJpbnRmKF8oIm1heGltdW0gYWxsb3dlZCBsYXRlbmN5OiAlbHUgdXNlY1xuIiksIG1heF9hbGxvd2VkX2NzdGF0ZSk7CisJcHJpbnRmKF8oInN0YXRlczpcdFxuIikpOworCWZvciAoY3N0YXRlID0gMTsgY3N0YXRlIDwgY3N0YXRlczsgY3N0YXRlKyspIHsKKwkJcHJpbnRmKF8oIiAgICBDJWQ6ICAgICAgICAgICAgICAgICAgIgorCQkJICJ0eXBlW0MlZF0gIiksIGNzdGF0ZSwgY3N0YXRlKTsKKwkJcHJpbnRmKF8oInByb21vdGlvblstLV0gZGVtb3Rpb25bLS1dICIpKTsKKwkJcHJpbnRmKF8oImxhdGVuY3lbJTAzbHVdICIpLAorCQkgICAgICAgc3lzZnNfZ2V0X2lkbGVzdGF0ZV9sYXRlbmN5KGNwdSwgY3N0YXRlKSk7CisJCXByaW50ZihfKCJ1c2FnZVslMDhsdV0gIiksCisJCSAgICAgICBzeXNmc19nZXRfaWRsZXN0YXRlX3VzYWdlKGNwdSwgY3N0YXRlKSk7CisJCXByaW50ZihfKCJkdXJhdGlvblslMDIwTHVdIFxuIiksCisJCSAgICAgICBzeXNmc19nZXRfaWRsZXN0YXRlX3RpbWUoY3B1LCBjc3RhdGUpKTsKKwl9Cit9CisKKy8qIC0tZnJlcSAvIC1mICovCisKK3ZvaWQgaWRsZV9pbmZvX2hlbHAodm9pZCkKK3sKKwlwcmludGYoXyAoIlVzYWdlOiBjcHVwb3dlciBpZGxlaW5mbyBbb3B0aW9uc11cbiIpKTsKKwlwcmludGYoXyAoIk9wdGlvbnM6XG4iKSk7CisJcHJpbnRmKF8gKCIgIC1zLCAtLXNpbGVudCAgICAgICAgIE9ubHkgc2hvdyBnZW5lcmFsIEMtc3RhdGUgaW5mb3JtYXRpb25cbiIpKTsKKwlwcmludGYoXyAoIiAgLW8sIC0tcHJvYyAgICAgICAgICAgUHJpbnRzIG91dCBpbmZvcm1hdGlvbiBsaWtlIHByb3ZpZGVkIGJ5IHRoZSAvcHJvYy9hY3BpL3Byb2Nlc3Nvci8qL3Bvd2VyXG4iCisJICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZSBpbiBvbGRlciBrZXJuZWxzXG4iKSk7CisJcHJpbnRmKF8gKCIgIC1oLCAtLWhlbHAgICAgICAgICAgIFByaW50cyBvdXQgdGhpcyBzY3JlZW5cbiIpKTsKKworCXByaW50ZigiXG4iKTsKK30KKworc3RhdGljIHN0cnVjdCBvcHRpb24gaW5mb19vcHRzW10gPSB7CisJeyAubmFtZSA9ICJzaWxlbnQiLAkuaGFzX2FyZyA9IG5vX2FyZ3VtZW50LAkuZmxhZyA9IE5VTEwsCS52YWwgPSAncyd9LAorCXsgLm5hbWUgPSAicHJvYyIsCS5oYXNfYXJnID0gbm9fYXJndW1lbnQsCS5mbGFnID0gTlVMTCwJLnZhbCA9ICdvJ30sCisJeyAubmFtZSA9ICJoZWxwIiwJLmhhc19hcmcgPSBub19hcmd1bWVudCwJLmZsYWcgPSBOVUxMLAkudmFsID0gJ2gnfSwKKwl7IH0sCit9OworCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1aWRsZV9leGl0KGludCBmYWlsKQoreworCWlkbGVfaW5mb19oZWxwKCk7CisJZXhpdChFWElUX0ZBSUxVUkUpOworfQorCitpbnQgY21kX2lkbGVfaW5mbyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJZXh0ZXJuIGNoYXIgKm9wdGFyZzsKKwlleHRlcm4gaW50IG9wdGluZCwgb3B0ZXJyLCBvcHRvcHQ7CisJaW50IHJldCA9IDAsIGNvbnQgPSAxLCBvdXRwdXRfcGFyYW0gPSAwLCB2ZXJib3NlID0gMTsKKwl1bnNpZ25lZCBpbnQgY3B1ID0gMDsKKworCWRvIHsKKwkJcmV0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgImhvcyIsIGluZm9fb3B0cywgTlVMTCk7CisJCWlmIChyZXQgPT0gLTEpCisJCQlicmVhazsKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSAnPyc6CisJCQlvdXRwdXRfcGFyYW0gPSAnPyc7CisJCQljb250ID0gMDsKKwkJCWJyZWFrOworCQljYXNlICdoJzoKKwkJCW91dHB1dF9wYXJhbSA9ICdoJzsKKwkJCWNvbnQgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJdmVyYm9zZSA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAtMToKKwkJCWNvbnQgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgJ28nOgorCQkJaWYgKG91dHB1dF9wYXJhbSkgeworCQkJCW91dHB1dF9wYXJhbSA9IC0xOworCQkJCWNvbnQgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJb3V0cHV0X3BhcmFtID0gcmV0OworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlIChjb250KTsKKworCXN3aXRjaCAob3V0cHV0X3BhcmFtKSB7CisJY2FzZSAtMToKKwkJcHJpbnRmKF8oIllvdSBjYW4ndCBzcGVjaWZ5IG1vcmUgdGhhbiBvbmUgIgorCQkJICJvdXRwdXQtc3BlY2lmaWMgYXJndW1lbnRcbiIpKTsKKwkJY3B1aWRsZV9leGl0KEVYSVRfRkFJTFVSRSk7CisJY2FzZSAnPyc6CisJCXByaW50ZihfKCJpbnZhbGlkIG9yIHVua25vd24gYXJndW1lbnRcbiIpKTsKKwkJY3B1aWRsZV9leGl0KEVYSVRfRkFJTFVSRSk7CisJY2FzZSAnaCc6CisJCWNwdWlkbGVfZXhpdChFWElUX1NVQ0NFU1MpOworCX0KKworCS8qIERlZmF1bHQgaXM6IHNob3cgb3V0cHV0IG9mIENQVSAwIG9ubHkgKi8KKwlpZiAoYml0bWFza19pc2FsbGNsZWFyKGNwdXNfY2hvc2VuKSkKKwkJYml0bWFza19zZXRiaXQoY3B1c19jaG9zZW4sIDApOworCisJaWYgKG91dHB1dF9wYXJhbSA9PSAwKQorCQljcHVpZGxlX2dlbmVyYWxfb3V0cHV0KCk7CisKKwlmb3IgKGNwdSA9IGJpdG1hc2tfZmlyc3QoY3B1c19jaG9zZW4pOworCSAgICAgY3B1IDw9IGJpdG1hc2tfbGFzdChjcHVzX2Nob3Nlbik7IGNwdSsrKSB7CisKKwkJaWYgKCFiaXRtYXNrX2lzYml0c2V0KGNwdXNfY2hvc2VuLCBjcHUpIHx8CisJCSAgICBjcHVmcmVxX2NwdV9leGlzdHMoY3B1KSkKKwkJCWNvbnRpbnVlOworCisJCXN3aXRjaCAob3V0cHV0X3BhcmFtKSB7CisKKwkJY2FzZSAnbyc6CisJCQlwcm9jX2NwdWlkbGVfY3B1X291dHB1dChjcHUpOworCQkJYnJlYWs7CisJCWNhc2UgMDoKKwkJCXByaW50ZigiXG4iKTsKKwkJCWNwdWlkbGVfY3B1X291dHB1dChjcHUsIHZlcmJvc2UpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2NwdXBvd2VyLWluZm8uYyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2NwdXBvd2VyLWluZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTI1M2NiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvY3B1cG93ZXItaW5mby5jCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogIChDKSAyMDExIFRob21hcyBSZW5uaW5nZXIgPHRyZW5uQHN1c2UuZGU+LCBOb3ZlbGwgSW5jLgorICoKKyAqICBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgTGljZW5zZSB2ZXJzaW9uIDIuCisgKi8KKworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorCisjaW5jbHVkZSA8Y3B1ZnJlcS5oPgorI2luY2x1ZGUgImhlbHBlcnMvaGVscGVycy5oIgorI2luY2x1ZGUgImhlbHBlcnMvc3lzZnMuaCIKKwordm9pZCBpbmZvX2hlbHAodm9pZCkKK3sKKwlwcmludGYoXygiVXNhZ2U6IGNwdXBvd2VyIGluZm8gWyAtYiBdIFsgLW0gXSBbIC1zIF1cbiIpKTsKKwlwcmludGYoXygiT3B0aW9uczpcbiIpKTsKKwlwcmludGYoXygiICAtYiwgLS1wZXJmLWJpYXMgICAgR2V0cyBDUFUncyBwb3dlciB2cyBwZXJmb3JtYW5jZSBwb2xpY3kgb24gc29tZVxuIgorCSAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgbW9kZWxzIFswLTE1XSwgc2VlIG1hbnBhZ2UgZm9yIGRldGFpbHNcbiIpKTsKKwlwcmludGYoXygiICAtbSwgLS1zY2hlZC1tYyAgICAgR2V0cyB0aGUga2VybmVsJ3MgbXVsdGkgY29yZSBzY2hlZHVsZXIgcG9saWN5LlxuIikpOworCXByaW50ZihfKCIgIC1zLCAtLXNjaGVkLXNtdCAgICBHZXRzIHRoZSBrZXJuZWwncyB0aHJlYWQgc2libGluZyBzY2hlZHVsZXIgcG9saWN5LlxuIikpOworCXByaW50ZihfKCIgIC1oLCAtLWhlbHAgICAgICAgICAgICAgICBQcmludHMgb3V0IHRoaXMgc2NyZWVuXG4iKSk7CisJcHJpbnRmKF8oIlxuUGFzc2luZyBubyBvcHRpb24gd2lsbCBzaG93IGFsbCBpbmZvLCBieSBkZWZhdWx0IG9ubHkgb24gY29yZSAwXG4iKSk7CisJcHJpbnRmKCJcbiIpOworfQorCitzdGF0aWMgc3RydWN0IG9wdGlvbiBzZXRfb3B0c1tdID0geworCXsgLm5hbWUgPSAicGVyZi1iaWFzIiwJLmhhc19hcmcgPSBvcHRpb25hbF9hcmd1bWVudCwJLmZsYWcgPSBOVUxMLAkudmFsID0gJ2InfSwKKwl7IC5uYW1lID0gInNjaGVkLW1jIiwJLmhhc19hcmcgPSBvcHRpb25hbF9hcmd1bWVudCwJLmZsYWcgPSBOVUxMLAkudmFsID0gJ20nfSwKKwl7IC5uYW1lID0gInNjaGVkLXNtdCIsCS5oYXNfYXJnID0gb3B0aW9uYWxfYXJndW1lbnQsCS5mbGFnID0gTlVMTCwJLnZhbCA9ICdzJ30sCisJeyAubmFtZSA9ICJoZWxwIiwJLmhhc19hcmcgPSBub19hcmd1bWVudCwJCS5mbGFnID0gTlVMTCwJLnZhbCA9ICdoJ30sCisJeyB9LAorfTsKKworc3RhdGljIHZvaWQgcHJpbnRfd3JvbmdfYXJnX2V4aXQodm9pZCkKK3sKKwlwcmludGYoXygiaW52YWxpZCBvciB1bmtub3duIGFyZ3VtZW50XG4iKSk7CisJaW5mb19oZWxwKCk7CisJZXhpdChFWElUX0ZBSUxVUkUpOworfQorCitpbnQgY21kX2luZm8oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWV4dGVybiBjaGFyICpvcHRhcmc7CisJZXh0ZXJuIGludCBvcHRpbmQsIG9wdGVyciwgb3B0b3B0OworCXVuc2lnbmVkIGludCBjcHU7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlpbnQgc2NoZWRfbWM6MTsKKwkJCWludCBzY2hlZF9zbXQ6MTsKKwkJCWludCBwZXJmX2JpYXM6MTsKKwkJfTsKKwkJaW50IHBhcmFtczsKKwl9IHBhcmFtcyA9IHt9OworCWludCByZXQgPSAwOworCisJc2V0bG9jYWxlKExDX0FMTCwgIiIpOworCXRleHRkb21haW4oUEFDS0FHRSk7CisKKwkvKiBwYXJhbWV0ZXIgcGFyc2luZyAqLworCXdoaWxlICgocmV0ID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIm1zYmgiLCBzZXRfb3B0cywgTlVMTCkpICE9IC0xKSB7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgJ2gnOgorCQkJaW5mb19oZWxwKCk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSAnYic6CisJCQlpZiAocGFyYW1zLnBlcmZfYmlhcykKKwkJCQlwcmludF93cm9uZ19hcmdfZXhpdCgpOworCQkJcGFyYW1zLnBlcmZfYmlhcyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnbSc6CisJCQlpZiAocGFyYW1zLnNjaGVkX21jKQorCQkJCXByaW50X3dyb25nX2FyZ19leGl0KCk7CisJCQlwYXJhbXMuc2NoZWRfbWMgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJaWYgKHBhcmFtcy5zY2hlZF9zbXQpCisJCQkJcHJpbnRfd3JvbmdfYXJnX2V4aXQoKTsKKwkJCXBhcmFtcy5zY2hlZF9zbXQgPSAxOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludF93cm9uZ19hcmdfZXhpdCgpOworCQl9CisJfTsKKworCWlmICghcGFyYW1zLnBhcmFtcykKKwkJcGFyYW1zLnBhcmFtcyA9IDB4NzsKKworCS8qIERlZmF1bHQgaXM6IHNob3cgb3V0cHV0IG9mIENQVSAwIG9ubHkgKi8KKwlpZiAoYml0bWFza19pc2FsbGNsZWFyKGNwdXNfY2hvc2VuKSkKKwkJYml0bWFza19zZXRiaXQoY3B1c19jaG9zZW4sIDApOworCisJaWYgKHBhcmFtcy5zY2hlZF9tYykgeworCQlyZXQgPSBzeXNmc19nZXRfc2NoZWQoIm1jIik7CisJCXByaW50ZihfKCJTeXN0ZW0ncyBtdWx0aSBjb3JlIHNjaGVkdWxlciBzZXR0aW5nOiAiKSk7CisJCWlmIChyZXQgPCAwKQorCQkJLyogaWYgc3lzZnMgZmlsZSBpcyBtaXNzaW5nIGl0J3M6IGVycm5vID09IEVOT0VOVCAqLworCQkJcHJpbnRmKF8oIm5vdCBzdXBwb3J0ZWRcbiIpKTsKKwkJZWxzZQorCQkJcHJpbnRmKCIlZFxuIiwgcmV0KTsKKwl9CisJaWYgKHBhcmFtcy5zY2hlZF9zbXQpIHsKKwkJcmV0ID0gc3lzZnNfZ2V0X3NjaGVkKCJzbXQiKTsKKwkJcHJpbnRmKF8oIlN5c3RlbSdzIHRocmVhZCBzaWJsaW5nIHNjaGVkdWxlciBzZXR0aW5nOiAiKSk7CisJCWlmIChyZXQgPCAwKQorCQkJLyogaWYgc3lzZnMgZmlsZSBpcyBtaXNzaW5nIGl0J3M6IGVycm5vID09IEVOT0VOVCAqLworCQkJcHJpbnRmKF8oIm5vdCBzdXBwb3J0ZWRcbiIpKTsKKwkJZWxzZQorCQkJcHJpbnRmKCIlZFxuIiwgcmV0KTsKKwl9CisKKwkvKiBBZGQgbW9yZSBwZXIgY3B1IG9wdGlvbnMgaGVyZSAqLworCWlmICghcGFyYW1zLnBlcmZfYmlhcykKKwkJcmV0dXJuIHJldDsKKworCWlmIChwYXJhbXMucGVyZl9iaWFzKSB7CisJCWlmICghcnVuX2FzX3Jvb3QpIHsKKwkJCXBhcmFtcy5wZXJmX2JpYXMgPSAwOworCQkJcHJpbnRmKF8oIkludGVsJ3MgcGVyZm9ybWFuY2UgYmlhcyBzZXR0aW5nIG5lZWRzIHJvb3QgcHJpdmlsZWdlc1xuIikpOworCQl9IGVsc2UgaWYgKCEoY3B1cG93ZXJfY3B1X2luZm8uY2FwcyAmIENQVVBPV0VSX0NBUF9QRVJGX0JJQVMpKSB7CisJCQlwcmludGYoXygiU3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgSW50ZWwncyBwZXJmb3JtYW5jZSIKKwkJCQkgIiBiaWFzIHNldHRpbmdcbiIpKTsKKwkJCXBhcmFtcy5wZXJmX2JpYXMgPSAwOworCQl9CisJfQorCisJLyogbG9vcCBvdmVyIENQVXMgKi8KKwlmb3IgKGNwdSA9IGJpdG1hc2tfZmlyc3QoY3B1c19jaG9zZW4pOworCSAgICAgY3B1IDw9IGJpdG1hc2tfbGFzdChjcHVzX2Nob3Nlbik7IGNwdSsrKSB7CisKKwkJaWYgKCFiaXRtYXNrX2lzYml0c2V0KGNwdXNfY2hvc2VuLCBjcHUpIHx8CisJCSAgICBjcHVmcmVxX2NwdV9leGlzdHMoY3B1KSkKKwkJCWNvbnRpbnVlOworCisJCXByaW50ZihfKCJhbmFseXppbmcgQ1BVICVkOlxuIiksIGNwdSk7CisKKwkJaWYgKHBhcmFtcy5wZXJmX2JpYXMpIHsKKwkJCXJldCA9IG1zcl9pbnRlbF9nZXRfcGVyZl9iaWFzKGNwdSk7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCXByaW50ZihfKCJDb3VsZCBub3QgcmVhZCBwZXJmLWJpYXMgdmFsdWVcbiIpKTsKKwkJCQlicmVhazsKKwkJCX0gZWxzZQorCQkJCXByaW50ZihfKCJwZXJmLWJpYXM6ICVkXG4iKSwgcmV0KTsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvY3B1cG93ZXItc2V0LmMgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9jcHVwb3dlci1zZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzFiMzkxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvY3B1cG93ZXItc2V0LmMKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiAgKEMpIDIwMTEgVGhvbWFzIFJlbm5pbmdlciA8dHJlbm5Ac3VzZS5kZT4sIE5vdmVsbCBJbmMuCisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMi4KKyAqLworCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKKyNpbmNsdWRlIDxjcHVmcmVxLmg+CisjaW5jbHVkZSAiaGVscGVycy9oZWxwZXJzLmgiCisjaW5jbHVkZSAiaGVscGVycy9zeXNmcy5oIgorI2luY2x1ZGUgImhlbHBlcnMvYml0bWFzay5oIgorCit2b2lkIHNldF9oZWxwKHZvaWQpCit7CisJcHJpbnRmKF8oIlVzYWdlOiBjcHVwb3dlciBzZXQgWyAtYiB2YWwgXSBbIC1tIHZhbCBdIFsgLXMgdmFsIF1cbiIpKTsKKwlwcmludGYoXygiT3B0aW9uczpcbiIpKTsKKwlwcmludGYoXygiICAtYiwgLS1wZXJmLWJpYXMgW1ZBTF0gICAgU2V0cyBDUFUncyBwb3dlciB2cyBwZXJmb3JtYW5jZSBwb2xpY3kgb24gc29tZVxuIgorCSAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgbW9kZWxzIFswLTE1XSwgc2VlIG1hbnBhZ2UgZm9yIGRldGFpbHNcbiIpKTsKKwlwcmludGYoXygiICAtbSwgLS1zY2hlZC1tYyAgW1ZBTF0gICAgU2V0cyB0aGUga2VybmVsJ3MgbXVsdGkgY29yZSBzY2hlZHVsZXIgcG9saWN5LlxuIikpOworCXByaW50ZihfKCIgIC1zLCAtLXNjaGVkLXNtdCBbVkFMXSAgICBTZXRzIHRoZSBrZXJuZWwncyB0aHJlYWQgc2libGluZyBzY2hlZHVsZXIgcG9saWN5LlxuIikpOworCXByaW50ZihfKCIgIC1oLCAtLWhlbHAgICAgICAgICAgICAgICBQcmludHMgb3V0IHRoaXMgc2NyZWVuXG4iKSk7CisJcHJpbnRmKCJcbiIpOworfQorCitzdGF0aWMgc3RydWN0IG9wdGlvbiBzZXRfb3B0c1tdID0geworCXsgLm5hbWUgPSAicGVyZi1iaWFzIiwJLmhhc19hcmcgPSBvcHRpb25hbF9hcmd1bWVudCwJLmZsYWcgPSBOVUxMLAkudmFsID0gJ2InfSwKKwl7IC5uYW1lID0gInNjaGVkLW1jIiwJLmhhc19hcmcgPSBvcHRpb25hbF9hcmd1bWVudCwJLmZsYWcgPSBOVUxMLAkudmFsID0gJ20nfSwKKwl7IC5uYW1lID0gInNjaGVkLXNtdCIsCS5oYXNfYXJnID0gb3B0aW9uYWxfYXJndW1lbnQsCS5mbGFnID0gTlVMTCwJLnZhbCA9ICdzJ30sCisJeyAubmFtZSA9ICJoZWxwIiwJLmhhc19hcmcgPSBub19hcmd1bWVudCwJCS5mbGFnID0gTlVMTCwJLnZhbCA9ICdoJ30sCisJeyB9LAorfTsKKworc3RhdGljIHZvaWQgcHJpbnRfd3JvbmdfYXJnX2V4aXQodm9pZCkKK3sKKwlwcmludGYoXygiaW52YWxpZCBvciB1bmtub3duIGFyZ3VtZW50XG4iKSk7CisJc2V0X2hlbHAoKTsKKwlleGl0KEVYSVRfRkFJTFVSRSk7Cit9CisKK2ludCBjbWRfc2V0KGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlleHRlcm4gY2hhciAqb3B0YXJnOworCWV4dGVybiBpbnQgb3B0aW5kLCBvcHRlcnIsIG9wdG9wdDsKKwl1bnNpZ25lZCBpbnQgY3B1OworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJaW50IHNjaGVkX21jOjE7CisJCQlpbnQgc2NoZWRfc210OjE7CisJCQlpbnQgcGVyZl9iaWFzOjE7CisJCX07CisJCWludCBwYXJhbXM7CisJfSBwYXJhbXM7CisJaW50IHNjaGVkX21jID0gMCwgc2NoZWRfc210ID0gMCwgcGVyZl9iaWFzID0gMDsKKwlpbnQgcmV0ID0gMDsKKworCXNldGxvY2FsZShMQ19BTEwsICIiKTsKKwl0ZXh0ZG9tYWluKFBBQ0tBR0UpOworCisJcGFyYW1zLnBhcmFtcyA9IDA7CisJLyogcGFyYW1ldGVyIHBhcnNpbmcgKi8KKwl3aGlsZSAoKHJldCA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJtOnM6YjpoIiwKKwkJCQkJCXNldF9vcHRzLCBOVUxMKSkgIT0gLTEpIHsKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSAnaCc6CisJCQlzZXRfaGVscCgpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgJ2InOgorCQkJaWYgKHBhcmFtcy5wZXJmX2JpYXMpCisJCQkJcHJpbnRfd3JvbmdfYXJnX2V4aXQoKTsKKwkJCXBlcmZfYmlhcyA9IGF0b2kob3B0YXJnKTsKKwkJCWlmIChwZXJmX2JpYXMgPCAwIHx8IHBlcmZfYmlhcyA+IDE1KSB7CisJCQkJcHJpbnRmKF8oIi0tcGVyZi1iaWFzIHBhcmFtIG91dCAiCisJCQkJCSAib2YgcmFuZ2UgWzAtJWRdXG4iKSwgMTUpOworCQkJCXByaW50X3dyb25nX2FyZ19leGl0KCk7CisJCQl9CisJCQlwYXJhbXMucGVyZl9iaWFzID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdtJzoKKwkJCWlmIChwYXJhbXMuc2NoZWRfbWMpCisJCQkJcHJpbnRfd3JvbmdfYXJnX2V4aXQoKTsKKwkJCXNjaGVkX21jID0gYXRvaShvcHRhcmcpOworCQkJaWYgKHNjaGVkX21jIDwgMCB8fCBzY2hlZF9tYyA+IDIpIHsKKwkJCQlwcmludGYoXygiLS1zY2hlZC1tYyBwYXJhbSBvdXQgIgorCQkJCQkgIm9mIHJhbmdlIFswLSVkXVxuIiksIDIpOworCQkJCXByaW50X3dyb25nX2FyZ19leGl0KCk7CisJCQl9CisJCQlwYXJhbXMuc2NoZWRfbWMgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJaWYgKHBhcmFtcy5zY2hlZF9zbXQpCisJCQkJcHJpbnRfd3JvbmdfYXJnX2V4aXQoKTsKKwkJCXNjaGVkX3NtdCA9IGF0b2kob3B0YXJnKTsKKwkJCWlmIChzY2hlZF9zbXQgPCAwIHx8IHNjaGVkX3NtdCA+IDIpIHsKKwkJCQlwcmludGYoXygiLS1zY2hlZC1zbXQgcGFyYW0gb3V0ICIKKwkJCQkJICJvZiByYW5nZSBbMC0lZF1cbiIpLCAyKTsKKwkJCQlwcmludF93cm9uZ19hcmdfZXhpdCgpOworCQkJfQorCQkJcGFyYW1zLnNjaGVkX3NtdCA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50X3dyb25nX2FyZ19leGl0KCk7CisJCX0KKwl9OworCisJaWYgKCFwYXJhbXMucGFyYW1zKSB7CisJCXNldF9oZWxwKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChwYXJhbXMuc2NoZWRfbWMpIHsKKwkJcmV0ID0gc3lzZnNfc2V0X3NjaGVkKCJtYyIsIHNjaGVkX21jKTsKKwkJaWYgKHJldCkKKwkJCWZwcmludGYoc3RkZXJyLCBfKCJFcnJvciBzZXR0aW5nIHNjaGVkLW1jICVzXG4iKSwKKwkJCQkocmV0ID09IC1FTk9ERVYpID8gIm5vdCBzdXBwb3J0ZWQiIDogIiIpOworCX0KKwlpZiAocGFyYW1zLnNjaGVkX3NtdCkgeworCQlyZXQgPSBzeXNmc19zZXRfc2NoZWQoInNtdCIsIHNjaGVkX3NtdCk7CisJCWlmIChyZXQpCisJCQlmcHJpbnRmKHN0ZGVyciwgXygiRXJyb3Igc2V0dGluZyBzY2hlZC1zbXQgJXNcbiIpLAorCQkJCShyZXQgPT0gLUVOT0RFVikgPyAibm90IHN1cHBvcnRlZCIgOiAiIik7CisJfQorCisJLyogRGVmYXVsdCBpczogc2V0IGFsbCBDUFVzICovCisJaWYgKGJpdG1hc2tfaXNhbGxjbGVhcihjcHVzX2Nob3NlbikpCisJCWJpdG1hc2tfc2V0YWxsKGNwdXNfY2hvc2VuKTsKKworCS8qIGxvb3Agb3ZlciBDUFVzICovCisJZm9yIChjcHUgPSBiaXRtYXNrX2ZpcnN0KGNwdXNfY2hvc2VuKTsKKwkgICAgIGNwdSA8PSBiaXRtYXNrX2xhc3QoY3B1c19jaG9zZW4pOyBjcHUrKykgeworCisJCWlmICghYml0bWFza19pc2JpdHNldChjcHVzX2Nob3NlbiwgY3B1KSB8fAorCQkgICAgY3B1ZnJlcV9jcHVfZXhpc3RzKGNwdSkpCisJCQljb250aW51ZTsKKworCQlpZiAocGFyYW1zLnBlcmZfYmlhcykgeworCQkJcmV0ID0gbXNyX2ludGVsX3NldF9wZXJmX2JpYXMoY3B1LCBwZXJmX2JpYXMpOworCQkJaWYgKHJldCkgeworCQkJCWZwcmludGYoc3RkZXJyLCBfKCJFcnJvciBzZXR0aW5nIHBlcmYtYmlhcyAiCisJCQkJCQkgICJ2YWx1ZSBvbiBDUFUgJWRcbiIpLCBjcHUpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9jcHVwb3dlci5jIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvY3B1cG93ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODQ0YWUwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvY3B1cG93ZXIuYwpAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqICAoQykgMjAxMCwyMDExICAgICAgIFRob21hcyBSZW5uaW5nZXIgPHRyZW5uQHN1c2UuZGU+LCBOb3ZlbGwgSW5jLgorICoKKyAqICBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgTGljZW5zZSB2ZXJzaW9uIDIuCisgKgorICogIElkZWFzIHRha2VuIG92ZXIgZnJvbSB0aGUgcGVyZiB1c2Vyc3BhY2UgdG9vbCAoaW5jbHVkZWQgaW4gdGhlIExpbnVzCisgKiAga2VybmVsIGdpdCByZXBvKTogc3ViY29tbWFuZCBidWlsdGlucyBhbmQgcGFyYW0gcGFyc2luZy4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgImJ1aWx0aW4uaCIKKyNpbmNsdWRlICJoZWxwZXJzL2hlbHBlcnMuaCIKKyNpbmNsdWRlICJoZWxwZXJzL2JpdG1hc2suaCIKKworc3RydWN0IGNtZF9zdHJ1Y3QgeworCWNvbnN0IGNoYXIgKmNtZDsKKwlpbnQgKCptYWluKShpbnQsIGNvbnN0IGNoYXIgKiopOworCXZvaWQgKCp1c2FnZSkodm9pZCk7CisJaW50IG5lZWRzX3Jvb3Q7Cit9OworCisjZGVmaW5lIEFSUkFZX1NJWkUoeCkgKHNpemVvZih4KS9zaXplb2YoeFswXSkpCisKK2ludCBjbWRfaGVscChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpOworCisvKiBHbG9iYWwgY3B1X2luZm8gb2JqZWN0IGF2YWlsYWJsZSBmb3IgYWxsIGJpbmFyaWVzCisgKiBJbmZvIG9ubHkgcmV0cmlldmVkIGZyb20gQ1BVIDAKKyAqCisgKiBWYWx1ZXMgd2lsbCBiZSB6ZXJvL3Vua25vd24gb24gbm9uIFg4NiBhcmNocworICovCitzdHJ1Y3QgY3B1cG93ZXJfY3B1X2luZm8gY3B1cG93ZXJfY3B1X2luZm87CitpbnQgcnVuX2FzX3Jvb3Q7CisvKiBBZmZlY3RlZCBjcHVzIGNob3NlbiBieSAtYy8tLWNwdSBwYXJhbSAqLworc3RydWN0IGJpdG1hc2sgKmNwdXNfY2hvc2VuOworCisjaWZkZWYgREVCVUcKK2ludCBiZV92ZXJib3NlOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIHByaW50X2hlbHAodm9pZCk7CisKK3N0YXRpYyBzdHJ1Y3QgY21kX3N0cnVjdCBjb21tYW5kc1tdID0geworCXsgImZyZXF1ZW5jeS1pbmZvIiwJY21kX2ZyZXFfaW5mbywJZnJlcV9pbmZvX2hlbHAsCTAJfSwKKwl7ICJmcmVxdWVuY3ktc2V0IiwJY21kX2ZyZXFfc2V0LAlmcmVxX3NldF9oZWxwLAkxCX0sCisJeyAiaWRsZS1pbmZvIiwJCWNtZF9pZGxlX2luZm8sCWlkbGVfaW5mb19oZWxwLAkwCX0sCisJeyAic2V0IiwJCWNtZF9zZXQsCXNldF9oZWxwLAkxCX0sCisJeyAiaW5mbyIsCQljbWRfaW5mbywJaW5mb19oZWxwLAkwCX0sCisJeyAibW9uaXRvciIsCQljbWRfbW9uaXRvciwJbW9uaXRvcl9oZWxwLAkwCX0sCisJeyAiaGVscCIsCQljbWRfaGVscCwJcHJpbnRfaGVscCwJMAl9LAorCS8qCXsgImJlbmNoIiwJY21kX2JlbmNoLAlOVUxMLAkJMQl9LCAqLworfTsKKworaW50IGNtZF9oZWxwKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmIChhcmdjID4gMSkgeworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb21tYW5kcyk7IGkrKykgeworCQkJc3RydWN0IGNtZF9zdHJ1Y3QgKnAgPSBjb21tYW5kcyArIGk7CisJCQlpZiAoc3RyY21wKHAtPmNtZCwgYXJndlsxXSkpCisJCQkJY29udGludWU7CisJCQlpZiAocC0+dXNhZ2UpIHsKKwkJCQlwLT51c2FnZSgpOworCQkJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJCQl9CisJCX0KKwl9CisJcHJpbnRfaGVscCgpOworCWlmIChhcmdjID09IDEpCisJCXJldHVybiBFWElUX1NVQ0NFU1M7IC8qIGNwdXBvd2VyIGhlbHAgKi8KKwlyZXR1cm4gRVhJVF9GQUlMVVJFOworfQorCitzdGF0aWMgdm9pZCBwcmludF9oZWxwKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGk7CisKKyNpZmRlZiBERUJVRworCXByaW50ZihfKCJjcHVwb3dlciBbIC1kIF1bIC1jIGNwdWxpc3QgXSBzdWJjb21tYW5kIFtBUkdTXVxuIikpOworCXByaW50ZihfKCIgIC1kLCAtLWRlYnVnICAgICAgTWF5IGluY3JlYXNlIG91dHB1dCAoc3RkZXJyKSBvbiBzb21lIHN1YmNvbW1hbmRzXG4iKSk7CisjZWxzZQorCXByaW50ZihfKCJjcHVwb3dlciBbIC1jIGNwdWxpc3QgXSBzdWJjb21tYW5kIFtBUkdTXVxuIikpOworI2VuZGlmCisJcHJpbnRmKF8oImNwdXBvd2VyIC0tdmVyc2lvblxuIikpOworCXByaW50ZihfKCJTdXBwb3J0ZWQgc3ViY29tbWFuZHMgYXJlOlxuIikpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvbW1hbmRzKTsgaSsrKQorCQlwcmludGYoIlx0JXNcbiIsIGNvbW1hbmRzW2ldLmNtZCk7CisJcHJpbnRmKF8oIlxuU29tZSBzdWJjb21tYW5kcyBjYW4gbWFrZSB1c2Ugb2YgdGhlIC1jIGNwdWxpc3Qgb3B0aW9uLlxuIikpOworCXByaW50ZihfKCJMb29rIGF0IHRoZSBnZW5lcmFsIGNwdXBvd2VyIG1hbnBhZ2UgaG93IHRvIHVzZSBpdFxuIikpOworCXByaW50ZihfKCJhbmQgcmVhZCB1cCB0aGUgc3ViY29tbWFuZCdzIG1hbnBhZ2Ugd2hldGhlciBpdCBpcyBzdXBwb3J0ZWQuXG4iKSk7CisJcHJpbnRmKF8oIlxuVXNlIGNwdXBvd2VyIGhlbHAgc3ViY29tbWFuZCBmb3IgZ2V0dGluZyBoZWxwIGZvciBhYm92ZSBzdWJjb21tYW5kcy5cbiIpKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfdmVyc2lvbih2b2lkKQoreworCXByaW50ZihQQUNLQUdFICIgIiBWRVJTSU9OICJcbiIpOworCXByaW50ZihfKCJSZXBvcnQgZXJyb3JzIGFuZCBidWdzIHRvICVzLCBwbGVhc2UuXG4iKSwgUEFDS0FHRV9CVUdSRVBPUlQpOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfb3B0aW9ucyhpbnQgKmFyZ2MsIGNvbnN0IGNoYXIgKioqYXJndikKK3sKKwlpbnQgcmV0LCB4LCBuZXdfYXJnYyA9IDA7CisKKwlpZiAoKmFyZ2MgPCAxKQorCQlyZXR1cm47CisKKwlmb3IgKHggPSAwOyAgeCA8ICphcmdjICYmICgoKmFyZ3YpW3hdKVswXSA9PSAnLSc7IHgrKykgeworCQljb25zdCBjaGFyICpwYXJhbSA9ICgqYXJndilbeF07CisJCWlmICghc3RyY21wKHBhcmFtLCAiLWgiKSB8fCAhc3RyY21wKHBhcmFtLCAiLS1oZWxwIikpIHsKKwkJCXByaW50X2hlbHAoKTsKKwkJCWV4aXQoRVhJVF9TVUNDRVNTKTsKKwkJfSBlbHNlIGlmICghc3RyY21wKHBhcmFtLCAiLWMiKSB8fCAhc3RyY21wKHBhcmFtLCAiLS1jcHUiKSkgeworCQkJaWYgKCphcmdjIDwgMikgeworCQkJCXByaW50X2hlbHAoKTsKKwkJCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJCQl9CisJCQlpZiAoIXN0cmNtcCgoKmFyZ3YpW3grMV0sICJhbGwiKSkKKwkJCQliaXRtYXNrX3NldGFsbChjcHVzX2Nob3Nlbik7CisJCQllbHNlIHsKKwkJCQlyZXQgPSBiaXRtYXNrX3BhcnNlbGlzdCgKKwkJCQkJCSgqYXJndilbeCsxXSwgY3B1c19jaG9zZW4pOworCQkJCWlmIChyZXQgPCAwKSB7CisJCQkJCWZwcmludGYoc3RkZXJyLCBfKCJFcnJvciBwYXJzaW5nIGNwdSAiCisJCQkJCQkJICAibGlzdFxuIikpOworCQkJCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJCQkJfQorCQkJfQorCQkJeCArPSAxOworCQkJLyogQ3V0IG91dCBwYXJhbTogY3B1cG93ZXIgLWMgMSBpbmZvIC0+IGNwdXBvd2VyIGluZm8gKi8KKwkJCW5ld19hcmdjICs9IDI7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmICghc3RyY21wKHBhcmFtLCAiLXYiKSB8fAorCQkJIXN0cmNtcChwYXJhbSwgIi0tdmVyc2lvbiIpKSB7CisJCQlwcmludF92ZXJzaW9uKCk7CisJCQlleGl0KEVYSVRfU1VDQ0VTUyk7CisjaWZkZWYgREVCVUcKKwkJfSBlbHNlIGlmICghc3RyY21wKHBhcmFtLCAiLWQiKSB8fCAhc3RyY21wKHBhcmFtLCAiLS1kZWJ1ZyIpKSB7CisJCQliZV92ZXJib3NlID0gMTsKKwkJCW5ld19hcmdjKys7CisJCQljb250aW51ZTsKKyNlbmRpZgorCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJVbmtub3duIG9wdGlvbjogJXNcbiIsIHBhcmFtKTsKKwkJCXByaW50X2hlbHAoKTsKKwkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwkJfQorCX0KKwkqYXJnYyAtPSBuZXdfYXJnYzsKKwkqYXJndiArPSBuZXdfYXJnYzsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkKK3sKKwljb25zdCBjaGFyICpjbWQ7CisJdW5zaWduZWQgaW50IGksIHJldDsKKworCWNwdXNfY2hvc2VuID0gYml0bWFza19hbGxvYyhzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19DT05GKSk7CisKKwlhcmdjLS07CisJYXJndiArPSAxOworCisJaGFuZGxlX29wdGlvbnMoJmFyZ2MsICZhcmd2KTsKKworCWNtZCA9IGFyZ3ZbMF07CisKKwlpZiAoYXJnYyA8IDEpIHsKKwkJcHJpbnRfaGVscCgpOworCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCX0KKworCXNldGxvY2FsZShMQ19BTEwsICIiKTsKKwl0ZXh0ZG9tYWluKFBBQ0tBR0UpOworCisJLyogVHVybiAicGVyZiBjbWQgLS1oZWxwIiBpbnRvICJwZXJmIGhlbHAgY21kIiAqLworCWlmIChhcmdjID4gMSAmJiAhc3RyY21wKGFyZ3ZbMV0sICItLWhlbHAiKSkgeworCQlhcmd2WzFdID0gYXJndlswXTsKKwkJYXJndlswXSA9IGNtZCA9ICJoZWxwIjsKKwl9CisKKwlnZXRfY3B1X2luZm8oMCwgJmNwdXBvd2VyX2NwdV9pbmZvKTsKKwlydW5fYXNfcm9vdCA9ICFnZXR1aWQoKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNvbW1hbmRzKTsgaSsrKSB7CisJCXN0cnVjdCBjbWRfc3RydWN0ICpwID0gY29tbWFuZHMgKyBpOworCQlpZiAoc3RyY21wKHAtPmNtZCwgY21kKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXJ1bl9hc19yb290ICYmIHAtPm5lZWRzX3Jvb3QpIHsKKwkJCWZwcmludGYoc3RkZXJyLCBfKCJTdWJjb21tYW5kICVzIG5lZWRzIHJvb3QgIgorCQkJCQkgICJwcml2aWxlZ2VzXG4iKSwgY21kKTsKKwkJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJCX0KKwkJcmV0ID0gcC0+bWFpbihhcmdjLCBhcmd2KTsKKwkJaWYgKGNwdXNfY2hvc2VuKQorCQkJYml0bWFza19mcmVlKGNwdXNfY2hvc2VuKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcHJpbnRfaGVscCgpOworCXJldHVybiBFWElUX0ZBSUxVUkU7Cit9CmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9oZWxwZXJzL2FtZC5jIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaGVscGVycy9hbWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2Q1NjA1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaGVscGVycy9hbWQuYwpAQCAtMCwwICsxLDEzNyBAQAorI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxwY2kvcGNpLmg+CisKKyNpbmNsdWRlICJoZWxwZXJzL2hlbHBlcnMuaCIKKworI2RlZmluZSBNU1JfQU1EX1BTVEFURV9TVEFUVVMJMHhjMDAxMDA2MworI2RlZmluZSBNU1JfQU1EX1BTVEFURQkJMHhjMDAxMDA2NAorI2RlZmluZSBNU1JfQU1EX1BTVEFURV9MSU1JVAkweGMwMDEwMDYxCisKK3VuaW9uIG1zcl9wc3RhdGUgeworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGZpZDo2OworCQl1bnNpZ25lZCBkaWQ6MzsKKwkJdW5zaWduZWQgdmlkOjc7CisJCXVuc2lnbmVkIHJlczE6NjsKKwkJdW5zaWduZWQgbmJkaWQ6MTsKKwkJdW5zaWduZWQgcmVzMjoyOworCQl1bnNpZ25lZCBuYnZpZDo3OworCQl1bnNpZ25lZCBpZGR2YWw6ODsKKwkJdW5zaWduZWQgaWRkZGl2OjI7CisJCXVuc2lnbmVkIHJlczM6MjE7CisJCXVuc2lnbmVkIGVuOjE7CisJfSBiaXRzOworCXVuc2lnbmVkIGxvbmcgbG9uZyB2YWw7Cit9OworCitzdGF0aWMgaW50IGdldF9kaWQoaW50IGZhbWlseSwgdW5pb24gbXNyX3BzdGF0ZSBwc3RhdGUpCit7CisJaW50IHQ7CisKKwlpZiAoZmFtaWx5ID09IDB4MTIpCisJCXQgPSBwc3RhdGUudmFsICYgMHhmOworCWVsc2UKKwkJdCA9IHBzdGF0ZS5iaXRzLmRpZDsKKworCXJldHVybiB0OworfQorCitzdGF0aWMgaW50IGdldF9jb2YoaW50IGZhbWlseSwgdW5pb24gbXNyX3BzdGF0ZSBwc3RhdGUpCit7CisJaW50IHQ7CisJaW50IGZpZCwgZGlkOworCisJZGlkID0gZ2V0X2RpZChmYW1pbHksIHBzdGF0ZSk7CisKKwl0ID0gMHgxMDsKKwlmaWQgPSBwc3RhdGUuYml0cy5maWQ7CisJaWYgKGZhbWlseSA9PSAweDExKQorCQl0ID0gMHg4OworCisJcmV0dXJuICgxMDAgKiAoZmlkICsgdCkpID4+IGRpZDsKK30KKworLyogTmVlZHM6CisgKiBjcHUgICAgICAgICAgLT4gdGhlIGNwdSB0aGF0IGdldHMgZXZhbHVhdGVkCisgKiBjcHVfZmFtaWx5ICAgLT4gVGhlIGNwdSdzIGZhbWlseSAoMHgxMCwgMHgxMiwuLi4pCisgKiBib290c19zdGF0ZXMgLT4gaG93IG11Y2ggYm9vc3Qgc3RhdGVzIHRoZSBtYWNoaW5lcyBzdXBwb3J0CisgKgorICogRmlsbHMgdXA6CisgKiBwc3RhdGVzIC0+IGEgcG9pbnRlciB0byBhbiBhcnJheSBvZiBzaXplIE1BWF9IV19QU1RBVEVTCisgKiAgICAgICAgICAgIG11c3QgYmUgaW5pdGlhbGl6ZWQgd2l0aCB6ZXJvcy4KKyAqICAgICAgICAgICAgQWxsIGF2YWlsYWJsZSAgSFcgcHN0YXRlcyAoaW5jbHVkaW5nIGJvb3N0IHN0YXRlcykKKyAqIG5vICAgICAgLT4gYW1vdW50IG9mIHBzdGF0ZXMgYWJvdmUgYXJyYXkgZ290IGZpbGxlZCB1cCB3aXRoCisgKgorICogcmV0dXJucyB6ZXJvIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUKKyAqLworaW50IGRlY29kZV9wc3RhdGVzKHVuc2lnbmVkIGludCBjcHUsIHVuc2lnbmVkIGludCBjcHVfZmFtaWx5LAorCQkgICBpbnQgYm9vc3Rfc3RhdGVzLCB1bnNpZ25lZCBsb25nICpwc3RhdGVzLCBpbnQgKm5vKQoreworCWludCBpLCBwc21heCwgcHNjdXI7CisJdW5pb24gbXNyX3BzdGF0ZSBwc3RhdGU7CisJdW5zaWduZWQgbG9uZyBsb25nIHZhbDsKKworCS8qIE9ubHkgcmVhZCBvdXQgZnJlcXVlbmNpZXMgZnJvbSBIVyB3aGVuIENQVSBtaWdodCBiZSBib29zdGFibGUKKwkgICB0byBrZWVwIHRoZSBjb2RlIGFzIHNob3J0IGFuZCBjbGVhbiBhcyBwb3NzaWJsZS4KKwkgICBPdGhlcndpc2UgZnJlcXVlbmNpZXMgYXJlIGV4cG9ydGVkIHZpYSBBQ1BJIHRhYmxlcy4KKwkqLworCWlmIChjcHVfZmFtaWx5IDwgMHgxMCB8fCBjcHVfZmFtaWx5ID09IDB4MTQpCisJCXJldHVybiAtMTsKKworCWlmIChyZWFkX21zcihjcHUsIE1TUl9BTURfUFNUQVRFX0xJTUlULCAmdmFsKSkKKwkJcmV0dXJuIC0xOworCisJcHNtYXggPSAodmFsID4+IDQpICYgMHg3OworCisJaWYgKHJlYWRfbXNyKGNwdSwgTVNSX0FNRF9QU1RBVEVfU1RBVFVTLCAmdmFsKSkKKwkJcmV0dXJuIC0xOworCisJcHNjdXIgPSB2YWwgJiAweDc7CisKKwlwc2N1ciArPSBib29zdF9zdGF0ZXM7CisJcHNtYXggKz0gYm9vc3Rfc3RhdGVzOworCWZvciAoaSA9IDA7IGkgPD0gcHNtYXg7IGkrKykgeworCQlpZiAoaSA+PSBNQVhfSFdfUFNUQVRFUykgeworCQkJZnByaW50ZihzdGRlcnIsICJIVyBwc3RhdGVzIFslZF0gZXhjZWVkaW5nIG1heCBbJWRdXG4iLAorCQkJCXBzbWF4LCBNQVhfSFdfUFNUQVRFUyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKHJlYWRfbXNyKGNwdSwgTVNSX0FNRF9QU1RBVEUgKyBpLCAmcHN0YXRlLnZhbCkpCisJCQlyZXR1cm4gLTE7CisJCXBzdGF0ZXNbaV0gPSBnZXRfY29mKGNwdV9mYW1pbHksIHBzdGF0ZSk7CisJfQorCSpubyA9IGk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBhbWRfcGNpX2dldF9udW1fYm9vc3Rfc3RhdGVzKGludCAqYWN0aXZlLCBpbnQgKnN0YXRlcykKK3sKKwlzdHJ1Y3QgcGNpX2FjY2VzcyAqcGNpX2FjYzsKKwlpbnQgdmVuZG9yX2lkID0gMHgxMDIyOworCWludCBib29zdF9kZXZfaWRzWzRdID0gezB4MTIwNCwgMHgxNjA0LCAweDE3MDQsIDB9OworCXN0cnVjdCBwY2lfZGV2ICpkZXZpY2U7CisJdWludDhfdCB2YWwgPSAwOworCisJKmFjdGl2ZSA9ICpzdGF0ZXMgPSAwOworCisJZGV2aWNlID0gcGNpX2FjY19pbml0KCZwY2lfYWNjLCB2ZW5kb3JfaWQsIGJvb3N0X2Rldl9pZHMpOworCisJaWYgKGRldmljZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXZhbCA9IHBjaV9yZWFkX2J5dGUoZGV2aWNlLCAweDE1Yyk7CisJaWYgKHZhbCAmIDMpCisJCSphY3RpdmUgPSAxOworCWVsc2UKKwkJKmFjdGl2ZSA9IDA7CisJKnN0YXRlcyA9ICh2YWwgPj4gMikgJiA3OworCisJcGNpX2NsZWFudXAocGNpX2FjYyk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaGVscGVycy9iaXRtYXNrLmMgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9oZWxwZXJzL2JpdG1hc2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzA3NGM2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaGVscGVycy9iaXRtYXNrLmMKQEAgLTAsMCArMSwyOTIgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8aGVscGVycy9iaXRtYXNrLmg+CisKKy8qIEhvdyBtYW55IGJpdHMgaW4gYW4gdW5zaWduZWQgbG9uZyAqLworI2RlZmluZSBiaXRzcGVybG9uZyAoOCAqIHNpemVvZih1bnNpZ25lZCBsb25nKSkKKworLyogaG93bWFueShhLGIpIDogaG93IG1hbnkgZWxlbWVudHMgb2Ygc2l6ZSBiIG5lZWRlZCB0byBob2xkIGFsbCBvZiBhICovCisjZGVmaW5lIGhvd21hbnkoeCwgeSkgKCgoeCkrKCh5KS0xKSkvKHkpKQorCisvKiBIb3cgbWFueSBsb25ncyBpbiBtYXNrIG9mIG4gYml0cyAqLworI2RlZmluZSBsb25nc3BlcmJpdHMobikgaG93bWFueShuLCBiaXRzcGVybG9uZykKKworI2RlZmluZSBtYXgoYSwgYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKKworLyoKKyAqIEFsbG9jYXRlIGFuZCBmcmVlIGBzdHJ1Y3QgYml0bWFzayAqYAorICovCisKKy8qIEFsbG9jYXRlIGEgbmV3IGBzdHJ1Y3QgYml0bWFza2Agd2l0aCBhIHNpemUgb2YgbiBiaXRzICovCitzdHJ1Y3QgYml0bWFzayAqYml0bWFza19hbGxvYyh1bnNpZ25lZCBpbnQgbikKK3sKKwlzdHJ1Y3QgYml0bWFzayAqYm1wOworCisJYm1wID0gbWFsbG9jKHNpemVvZigqYm1wKSk7CisJaWYgKGJtcCA9PSAwKQorCQlyZXR1cm4gMDsKKwlibXAtPnNpemUgPSBuOworCWJtcC0+bWFza3AgPSBjYWxsb2MobG9uZ3NwZXJiaXRzKG4pLCBzaXplb2YodW5zaWduZWQgbG9uZykpOworCWlmIChibXAtPm1hc2twID09IDApIHsKKwkJZnJlZShibXApOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIGJtcDsKK30KKworLyogRnJlZSBgc3RydWN0IGJpdG1hc2tgICovCit2b2lkIGJpdG1hc2tfZnJlZShzdHJ1Y3QgYml0bWFzayAqYm1wKQoreworCWlmIChibXAgPT0gMCkKKwkJcmV0dXJuOworCWZyZWUoYm1wLT5tYXNrcCk7CisJYm1wLT5tYXNrcCA9ICh1bnNpZ25lZCBsb25nICopMHhkZWFkY2RlZjsgIC8qIGRvdWJsZSBmcmVlIHRyaXB3aXJlICovCisJZnJlZShibXApOworfQorCisvKgorICogVGhlIHJvdXRpbmVzIF9nZXRiaXQoKSBhbmQgX3NldGJpdCgpIGFyZSB0aGUgb25seQorICogcm91dGluZXMgdGhhdCBhY3R1YWxseSB1bmRlcnN0YW5kIHRoZSBsYXlvdXQgb2YgYm1wLT5tYXNrcFtdLgorICoKKyAqIE9uIGxpdHRsZSBlbmRpYW4gYXJjaGl0ZWN0dXJlcywgdGhpcyBjb3VsZCBzaW1wbHkgYmUgYW4gYXJyYXkgb2YKKyAqIGJ5dGVzLiAgQnV0IHRoZSBrZXJuZWwgbGF5b3V0IG9mIGJpdG1hc2tzIF9pc18gdmlzaWJsZSB0byB1c2Vyc3BhY2UKKyAqIHZpYSB0aGUgc2NoZWRfKHNldC9nZXQpYWZmaW5pdHkgY2FsbHMgaW4gTGludXggMi42LCBhbmQgb24gYmlnCisgKiBlbmRpYW4gYXJjaGl0ZWN0dXJlcywgaXQgaXMgcGFpbmZ1bGx5IG9idmlvdXMgdGhhdCB0aGlzIGlzIGFuCisgKiBhcnJheSBvZiB1bnNpZ25lZCBsb25ncy4KKyAqLworCisvKiBSZXR1cm4gdGhlIHZhbHVlICgwIG9yIDEpIG9mIGJpdCBuIGluIGJpdG1hc2sgYm1wICovCitzdGF0aWMgdW5zaWduZWQgaW50IF9nZXRiaXQoY29uc3Qgc3RydWN0IGJpdG1hc2sgKmJtcCwgdW5zaWduZWQgaW50IG4pCit7CisJaWYgKG4gPCBibXAtPnNpemUpCisJCXJldHVybiAoYm1wLT5tYXNrcFtuL2JpdHNwZXJsb25nXSA+PiAobiAlIGJpdHNwZXJsb25nKSkgJiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qIFNldCBiaXQgbiBpbiBiaXRtYXNrIGJtcCB0byB2YWx1ZSB2ICgwIG9yIDEpICovCitzdGF0aWMgdm9pZCBfc2V0Yml0KHN0cnVjdCBiaXRtYXNrICpibXAsIHVuc2lnbmVkIGludCBuLCB1bnNpZ25lZCBpbnQgdikKK3sKKwlpZiAobiA8IGJtcC0+c2l6ZSkgeworCQlpZiAodikKKwkJCWJtcC0+bWFza3Bbbi9iaXRzcGVybG9uZ10gfD0gMVVMIDw8IChuICUgYml0c3BlcmxvbmcpOworCQllbHNlCisJCQlibXAtPm1hc2twW24vYml0c3BlcmxvbmddICY9CisJCQkJfigxVUwgPDwgKG4gJSBiaXRzcGVybG9uZykpOworCX0KK30KKworLyoKKyAqIFdoZW4gcGFyc2luZyBiaXRtYXNrIGxpc3RzLCBvbmx5IGFsbG93IG51bWJlcnMsIHNlcGFyYXRlZCBieSBvbmUKKyAqIG9mIHRoZSBhbGxvd2VkIG5leHQgY2hhcmFjdGVycy4KKyAqCisgKiBUaGUgcGFyYW1ldGVyICdzcmV0JyBpcyB0aGUgcmV0dXJuIGZyb20gYSBzc2NhbmYgIiV1JWMiLiAgSXQgaXMKKyAqIC0xIGlmIHRoZSBzc2NhbmYgaW5wdXQgc3RyaW5nIHdhcyBlbXB0eS4gIEl0IGlzIDAgaWYgdGhlIGZpcnN0CisgKiBjaGFyYWN0ZXIgaW4gdGhlIHNzY2FuZiBpbnB1dCBzdHJpbmcgd2FzIG5vdCBhIGRlY2ltYWwgbnVtYmVyLgorICogSXQgaXMgMSBpZiB0aGUgdW5zaWduZWQgbnVtYmVyIG1hdGNoaW5nIHRoZSAiJXUiIHdhcyB0aGUgZW5kIG9mIHRoZQorICogaW5wdXQgc3RyaW5nLiAgSXQgaXMgMiBpZiBvbmUgb3IgbW9yZSBhZGRpdGlvbmFsIGNoYXJhY3RlcnMgZm9sbG93ZWQKKyAqIHRoZSBtYXRjaGVkIHVuc2lnbmVkIG51bWJlci4gIElmIGl0IGlzIDIsIHRoZW4gJ25leHRjJyBpcyB0aGUgZmlyc3QKKyAqIGNoYXJhY3RlciBmb2xsb3dpbmcgdGhlIG51bWJlci4gIFRoZSBwYXJhbWV0ZXIgJ29rX25leHRfY2hhcnMnCisgKiBpcyB0aGUgbnVsLXRlcm1pbmF0ZWQgbGlzdCBvZiBhbGxvd2VkIG5leHQgY2hhcmFjdGVycy4KKyAqCisgKiBUaGUgbWFzayB0ZXJtIGp1c3Qgc2Nhbm5lZCB3YXMgb2sgaWYgYW5kIG9ubHkgaWYgZWl0aGVyIHRoZSBudW1iZXJzCisgKiBtYXRjaGluZyB0aGUgJXUgd2VyZSBhbGwgb2YgdGhlIGlucHV0IG9yIGlmIHRoZSBuZXh0IGNoYXJhY3RlciBpbgorICogdGhlIGlucHV0IHBhc3QgdGhlIG51bWJlcnMgd2FzIG9uZSBvZiB0aGUgYWxsb3dlZCBuZXh0IGNoYXJhY3RlcnMuCisgKi8KK3N0YXRpYyBpbnQgc2Nhbl93YXNfb2soaW50IHNyZXQsIGNoYXIgbmV4dGMsIGNvbnN0IGNoYXIgKm9rX25leHRfY2hhcnMpCit7CisJcmV0dXJuIHNyZXQgPT0gMSB8fAorCQkoc3JldCA9PSAyICYmIHN0cmNocihva19uZXh0X2NoYXJzLCBuZXh0YykgIT0gTlVMTCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpuZXh0dG9rZW4oY29uc3QgY2hhciAqcSwgIGludCBzZXApCit7CisJaWYgKHEpCisJCXEgPSBzdHJjaHIocSwgc2VwKTsKKwlpZiAocSkKKwkJcSsrOworCXJldHVybiBxOworfQorCisvKiBTZXQgYSBzaW5nbGUgYml0IGkgaW4gYml0bWFzayAqLworc3RydWN0IGJpdG1hc2sgKmJpdG1hc2tfc2V0Yml0KHN0cnVjdCBiaXRtYXNrICpibXAsIHVuc2lnbmVkIGludCBpKQoreworCV9zZXRiaXQoYm1wLCBpLCAxKTsKKwlyZXR1cm4gYm1wOworfQorCisvKiBTZXQgYWxsIGJpdHMgaW4gYml0bWFzazogYm1wID0gfjAgKi8KK3N0cnVjdCBiaXRtYXNrICpiaXRtYXNrX3NldGFsbChzdHJ1Y3QgYml0bWFzayAqYm1wKQoreworCXVuc2lnbmVkIGludCBpOworCWZvciAoaSA9IDA7IGkgPCBibXAtPnNpemU7IGkrKykKKwkJX3NldGJpdChibXAsIGksIDEpOworCXJldHVybiBibXA7Cit9CisKKy8qIENsZWFyIGFsbCBiaXRzIGluIGJpdG1hc2s6IGJtcCA9IDAgKi8KK3N0cnVjdCBiaXRtYXNrICpiaXRtYXNrX2NsZWFyYWxsKHN0cnVjdCBiaXRtYXNrICpibXApCit7CisJdW5zaWduZWQgaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGJtcC0+c2l6ZTsgaSsrKQorCQlfc2V0Yml0KGJtcCwgaSwgMCk7CisJcmV0dXJuIGJtcDsKK30KKworLyogVHJ1ZSBpZiBhbGwgYml0cyBhcmUgY2xlYXIgKi8KK2ludCBiaXRtYXNrX2lzYWxsY2xlYXIoY29uc3Qgc3RydWN0IGJpdG1hc2sgKmJtcCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgYm1wLT5zaXplOyBpKyspCisJCWlmIChfZ2V0Yml0KGJtcCwgaSkpCisJCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworLyogVHJ1ZSBpZiBzcGVjaWZpZWQgYml0IGkgaXMgc2V0ICovCitpbnQgYml0bWFza19pc2JpdHNldChjb25zdCBzdHJ1Y3QgYml0bWFzayAqYm1wLCB1bnNpZ25lZCBpbnQgaSkKK3sKKwlyZXR1cm4gX2dldGJpdChibXAsIGkpOworfQorCisvKiBOdW1iZXIgb2YgbG93ZXN0IHNldCBiaXQgKG1pbikgKi8KK3Vuc2lnbmVkIGludCBiaXRtYXNrX2ZpcnN0KGNvbnN0IHN0cnVjdCBiaXRtYXNrICpibXApCit7CisJcmV0dXJuIGJpdG1hc2tfbmV4dChibXAsIDApOworfQorCisvKiBOdW1iZXIgb2YgaGlnaGVzdCBzZXQgYml0IChtYXgpICovCit1bnNpZ25lZCBpbnQgYml0bWFza19sYXN0KGNvbnN0IHN0cnVjdCBiaXRtYXNrICpibXApCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IG0gPSBibXAtPnNpemU7CisJZm9yIChpID0gMDsgaSA8IGJtcC0+c2l6ZTsgaSsrKQorCQlpZiAoX2dldGJpdChibXAsIGkpKQorCQkJbSA9IGk7CisJcmV0dXJuIG07Cit9CisKKy8qIE51bWJlciBvZiBuZXh0IHNldCBiaXQgYXQgb3IgYWJvdmUgZ2l2ZW4gYml0IGkgKi8KK3Vuc2lnbmVkIGludCBiaXRtYXNrX25leHQoY29uc3Qgc3RydWN0IGJpdG1hc2sgKmJtcCwgdW5zaWduZWQgaW50IGkpCit7CisJdW5zaWduZWQgaW50IG47CisJZm9yIChuID0gaTsgbiA8IGJtcC0+c2l6ZTsgbisrKQorCQlpZiAoX2dldGJpdChibXAsIG4pKQorCQkJYnJlYWs7CisJcmV0dXJuIG47Cit9CisKKy8qCisgKiBQYXJzZXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBudW1iZXJzIGFuZCByYW5nZXMgb2YgbnVtYmVycywKKyAqIHdpdGggb3B0aW9uYWwgJzoldScgc3RyaWRlcyBtb2RpZnlpbmcgcmFuZ2VzLCBpbnRvIHByb3ZpZGVkIGJpdG1hc2suCisgKiBTb21lIGV4YW1wbGVzIG9mIGlucHV0IGxpc3RzIGFuZCB0aGVpciBlcXVpdmFsZW50IHNpbXBsZSBsaXN0OgorICoJSW5wdXQJCUVxdWl2YWxlbnQgdG8KKyAqCTAtMwkJMCwxLDIsMworICoJMC03OjIJCTAsMiw0LDYKKyAqCTEsMyw1LTcJCTEsMyw1LDYsNworICoJMC0zOjIsOC0xNTo0CTAsMiw4LDEyCisgKi8KK2ludCBiaXRtYXNrX3BhcnNlbGlzdChjb25zdCBjaGFyICpidWYsIHN0cnVjdCBiaXRtYXNrICpibXApCit7CisJY29uc3QgY2hhciAqcCwgKnE7CisKKwliaXRtYXNrX2NsZWFyYWxsKGJtcCk7CisKKwlxID0gYnVmOworCXdoaWxlIChwID0gcSwgcSA9IG5leHR0b2tlbihxLCAnLCcpLCBwKSB7CisJCXVuc2lnbmVkIGludCBhOwkJLyogYmVnaW4gb2YgcmFuZ2UgKi8KKwkJdW5zaWduZWQgaW50IGI7CQkvKiBlbmQgb2YgcmFuZ2UgKi8KKwkJdW5zaWduZWQgaW50IHM7CQkvKiBzdHJpZGUgKi8KKwkJY29uc3QgY2hhciAqYzEsICpjMjsJLyogbmV4dCB0b2tlbnMgYWZ0ZXIgJy0nIG9yICcsJyAqLworCQljaGFyIG5leHRjOwkJLyogY2hhciBhZnRlciBzc2NhbmYgJXUgbWF0Y2ggKi8KKwkJaW50IHNyZXQ7CQkvKiBzc2NhbmYgcmV0dXJuIChudW1iZXIgb2YgbWF0Y2hlcykgKi8KKworCQlzcmV0ID0gc3NjYW5mKHAsICIldSVjIiwgJmEsICZuZXh0Yyk7CisJCWlmICghc2Nhbl93YXNfb2soc3JldCwgbmV4dGMsICIsLSIpKQorCQkJZ290byBlcnI7CisJCWIgPSBhOworCQlzID0gMTsKKwkJYzEgPSBuZXh0dG9rZW4ocCwgJy0nKTsKKwkJYzIgPSBuZXh0dG9rZW4ocCwgJywnKTsKKwkJaWYgKGMxICE9IE5VTEwgJiYgKGMyID09IE5VTEwgfHwgYzEgPCBjMikpIHsKKwkJCXNyZXQgPSBzc2NhbmYoYzEsICIldSVjIiwgJmIsICZuZXh0Yyk7CisJCQlpZiAoIXNjYW5fd2FzX29rKHNyZXQsIG5leHRjLCAiLDoiKSkKKwkJCQlnb3RvIGVycjsKKwkJCWMxID0gbmV4dHRva2VuKGMxLCAnOicpOworCQkJaWYgKGMxICE9IE5VTEwgJiYgKGMyID09IE5VTEwgfHwgYzEgPCBjMikpIHsKKwkJCQlzcmV0ID0gc3NjYW5mKGMxLCAiJXUlYyIsICZzLCAmbmV4dGMpOworCQkJCWlmICghc2Nhbl93YXNfb2soc3JldCwgbmV4dGMsICIsIikpCisJCQkJCWdvdG8gZXJyOworCQkJfQorCQl9CisJCWlmICghKGEgPD0gYikpCisJCQlnb3RvIGVycjsKKwkJaWYgKGIgPj0gYm1wLT5zaXplKQorCQkJZ290byBlcnI7CisJCXdoaWxlIChhIDw9IGIpIHsKKwkJCV9zZXRiaXQoYm1wLCBhLCAxKTsKKwkJCWEgKz0gczsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK2VycjoKKwliaXRtYXNrX2NsZWFyYWxsKGJtcCk7CisJcmV0dXJuIC0xOworfQorCisvKgorICogZW1pdChidWYsIGJ1ZmxlbiwgcmJvdCwgcnRvcCwgbGVuKQorICoKKyAqIEhlbHBlciByb3V0aW5lIGZvciBiaXRtYXNrX2Rpc3BsYXlsaXN0KCkuICBXcml0ZSBkZWNpbWFsIG51bWJlcgorICogb3IgcmFuZ2UgdG8gYnVmK2xlbiwgc3VwcHJlc3Npbmcgb3V0cHV0IHBhc3QgYnVmK2J1Zmxlbiwgd2l0aCBvcHRpb25hbAorICogY29tbWEtcHJlZml4LiAgUmV0dXJuIGxlbiBvZiB3aGF0IHdvdWxkIGJlIHdyaXR0ZW4gdG8gYnVmLCBpZiBpdAorICogYWxsIGZpdC4KKyAqLworCitzdGF0aWMgaW5saW5lIGludCBlbWl0KGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbiwgaW50IHJib3QsIGludCBydG9wLCBpbnQgbGVuKQoreworCWlmIChsZW4gPiAwKQorCQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBtYXgoYnVmbGVuIC0gbGVuLCAwKSwgIiwiKTsKKwlpZiAocmJvdCA9PSBydG9wKQorCQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBtYXgoYnVmbGVuIC0gbGVuLCAwKSwgIiVkIiwgcmJvdCk7CisJZWxzZQorCQlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBtYXgoYnVmbGVuIC0gbGVuLCAwKSwgIiVkLSVkIiwKKwkJCQlyYm90LCBydG9wKTsKKwlyZXR1cm4gbGVuOworfQorCisvKgorICogV3JpdGUgZGVjaW1hbCBsaXN0IHJlcHJlc2VudGF0aW9uIG9mIGJtcCB0byBidWYuCisgKgorICogT3V0cHV0IGZvcm1hdCBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGRlY2ltYWwgbnVtYmVycyBhbmQKKyAqIHJhbmdlcy4gIENvbnNlY3V0aXZlbHkgc2V0IGJpdHMgYXJlIHNob3duIGFzIHR3byBoeXBoZW4tc2VwYXJhdGVkCisgKiBkZWNpbWFsIG51bWJlcnMsIHRoZSBzbWFsbGVzdCBhbmQgbGFyZ2VzdCBiaXQgbnVtYmVycyBzZXQgaW4KKyAqIHRoZSByYW5nZS4gIE91dHB1dCBmb3JtYXQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBmb3JtYXQKKyAqIGFjY2VwdGVkIGFzIGlucHV0IGJ5IGJpdG1hcF9wYXJzZWxpc3QoKS4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3aGljaCB3b3VsZCBiZQorICogZ2VuZXJhdGVkIGZvciB0aGUgZ2l2ZW4gaW5wdXQsIGV4Y2x1ZGluZyB0aGUgdHJhaWxpbmcgJ1wwJywgYXMKKyAqIHBlciBJU08gQzk5LgorICovCisKK2ludCBiaXRtYXNrX2Rpc3BsYXlsaXN0KGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbiwgY29uc3Qgc3RydWN0IGJpdG1hc2sgKmJtcCkKK3sKKwlpbnQgbGVuID0gMDsKKwkvKiBjdXJyZW50IGJpdCBpcyAnY3VyJywgbW9zdCByZWNlbnRseSBzZWVuIHJhbmdlIGlzIFtyYm90LCBydG9wXSAqLworCXVuc2lnbmVkIGludCBjdXIsIHJib3QsIHJ0b3A7CisKKwlpZiAoYnVmbGVuID4gMCkKKwkJKmJ1ZiA9IDA7CisJcmJvdCA9IGN1ciA9IGJpdG1hc2tfZmlyc3QoYm1wKTsKKwl3aGlsZSAoY3VyIDwgYm1wLT5zaXplKSB7CisJCXJ0b3AgPSBjdXI7CisJCWN1ciA9IGJpdG1hc2tfbmV4dChibXAsIGN1cisxKTsKKwkJaWYgKGN1ciA+PSBibXAtPnNpemUgfHwgY3VyID4gcnRvcCArIDEpIHsKKwkJCWxlbiA9IGVtaXQoYnVmLCBidWZsZW4sIHJib3QsIHJ0b3AsIGxlbik7CisJCQlyYm90ID0gY3VyOworCQl9CisJfQorCXJldHVybiBsZW47Cit9CmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9oZWxwZXJzL2JpdG1hc2suaCBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2hlbHBlcnMvYml0bWFzay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMjg5ZGYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9oZWxwZXJzL2JpdG1hc2suaApAQCAtMCwwICsxLDMzIEBACisjaWZuZGVmIF9fQ1BVUE9XRVJfQklUTUFTS19fCisjZGVmaW5lIF9fQ1BVUE9XRVJfQklUTUFTS19fCisKKy8qIFRha2VuIG92ZXIgZnJvbSBsaWJiaXRtYXNrLCBhIHByb2plY3QgaW5pdGlhdGVkIGZyb20gc2dpOgorICogVXJsOiAgICAgICAgICAgIGh0dHA6Ly9vc3Muc2dpLmNvbS9wcm9qZWN0cy9jcHVzZXRzLworICogVW5mb3J0dW5hdGVseSBpdCdzIG5vdCB2ZXJ5IHdpZGVzcHJlYWQsIHRoZXJlZm9yZSByZWxldmFudCBwYXJ0cyBhcmUKKyAqIHBhc3RlZCBoZXJlLgorICovCisKK3N0cnVjdCBiaXRtYXNrIHsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwl1bnNpZ25lZCBsb25nICptYXNrcDsKK307CisKK3N0cnVjdCBiaXRtYXNrICpiaXRtYXNrX2FsbG9jKHVuc2lnbmVkIGludCBuKTsKK3ZvaWQgYml0bWFza19mcmVlKHN0cnVjdCBiaXRtYXNrICpibXApOworCitzdHJ1Y3QgYml0bWFzayAqYml0bWFza19zZXRiaXQoc3RydWN0IGJpdG1hc2sgKmJtcCwgdW5zaWduZWQgaW50IGkpOworc3RydWN0IGJpdG1hc2sgKmJpdG1hc2tfc2V0YWxsKHN0cnVjdCBiaXRtYXNrICpibXApOworc3RydWN0IGJpdG1hc2sgKmJpdG1hc2tfY2xlYXJhbGwoc3RydWN0IGJpdG1hc2sgKmJtcCk7CisKK3Vuc2lnbmVkIGludCBiaXRtYXNrX2ZpcnN0KGNvbnN0IHN0cnVjdCBiaXRtYXNrICpibXApOwordW5zaWduZWQgaW50IGJpdG1hc2tfbmV4dChjb25zdCBzdHJ1Y3QgYml0bWFzayAqYm1wLCB1bnNpZ25lZCBpbnQgaSk7Cit1bnNpZ25lZCBpbnQgYml0bWFza19sYXN0KGNvbnN0IHN0cnVjdCBiaXRtYXNrICpibXApOworaW50IGJpdG1hc2tfaXNhbGxjbGVhcihjb25zdCBzdHJ1Y3QgYml0bWFzayAqYm1wKTsKK2ludCBiaXRtYXNrX2lzYml0c2V0KGNvbnN0IHN0cnVjdCBiaXRtYXNrICpibXAsIHVuc2lnbmVkIGludCBpKTsKKworaW50IGJpdG1hc2tfcGFyc2VsaXN0KGNvbnN0IGNoYXIgKmJ1Ziwgc3RydWN0IGJpdG1hc2sgKmJtcCk7CitpbnQgYml0bWFza19kaXNwbGF5bGlzdChjaGFyICpidWYsIGludCBsZW4sIGNvbnN0IHN0cnVjdCBiaXRtYXNrICpibXApOworCisKKworI2VuZGlmIC8qX19DUFVQT1dFUl9CSVRNQVNLX18gKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2hlbHBlcnMvY3B1aWQuYyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2hlbHBlcnMvY3B1aWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDY4OTVkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaGVscGVycy9jcHVpZC5jCkBAIC0wLDAgKzEsMTc2IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAiaGVscGVycy9oZWxwZXJzLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICpjcHVfdmVuZG9yX3RhYmxlW1g4Nl9WRU5ET1JfTUFYXSA9IHsKKwkiVW5rbm93biIsICJHZW51aW5lSW50ZWwiLCAiQXV0aGVudGljQU1EIiwKK307CisKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisKKy8qIGZyb20gZ2NjICovCisjaW5jbHVkZSA8Y3B1aWQuaD4KKworLyoKKyAqIENQVUlEIGZ1bmN0aW9ucyByZXR1cm5pbmcgYSBzaW5nbGUgZGF0dW0KKyAqCisgKiBEZWZpbmUgdW5zaWduZWQgaW50IGNwdWlkX2VbYWJjZF14KHVuc2lnbmVkIGludCBvcCkKKyAqLworI2RlZmluZSBjcHVpZF9mdW5jKHJlZykJCQkJCVwKKwl1bnNpZ25lZCBpbnQgY3B1aWRfIyNyZWcodW5zaWduZWQgaW50IG9wKQlcCisJewkJCQkJCVwKKwl1bnNpZ25lZCBpbnQgZWF4LCBlYngsIGVjeCwgZWR4OwkJXAorCV9fY3B1aWQob3AsIGVheCwgZWJ4LCBlY3gsIGVkeCk7CQlcCisJcmV0dXJuIHJlZzsJCQkJCVwKKwl9CitjcHVpZF9mdW5jKGVheCk7CitjcHVpZF9mdW5jKGVieCk7CitjcHVpZF9mdW5jKGVjeCk7CitjcHVpZF9mdW5jKGVkeCk7CisKKyNlbmRpZiAvKiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pICovCisKKy8qIGdldF9jcHVfaW5mbworICoKKyAqIEV4dHJhY3QgQ1BVIHZlbmRvciwgZmFtaWx5LCBtb2RlbCwgc3RlcHBpbmcgaW5mbyBmcm9tIC9wcm9jL2NwdWluZm8KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXYgZXJyb3IgY29kZQorICoKKyAqIFRCRDogU2hvdWxkIHRoZXJlIGJlIGEgY3B1aWQgYWx0ZXJuYXRpdmUgZm9yIHRoaXMgaWYgL3Byb2MgaXMgbm90IG1vdW50ZWQ/CisgKi8KK2ludCBnZXRfY3B1X2luZm8odW5zaWduZWQgaW50IGNwdSwgc3RydWN0IGNwdXBvd2VyX2NwdV9pbmZvICpjcHVfaW5mbykKK3sKKwlGSUxFICpmcDsKKwljaGFyIHZhbHVlWzY0XTsKKwl1bnNpZ25lZCBpbnQgcHJvYywgeDsKKwl1bnNpZ25lZCBpbnQgdW5rbm93biA9IDB4ZmZmZmZmOworCXVuc2lnbmVkIGludCBjcHVpZF9sZXZlbCwgZXh0X2NwdWlkX2xldmVsOworCisJaW50IHJldCA9IC1FSU5WQUw7CisKKwljcHVfaW5mby0+dmVuZG9yCQk9IFg4Nl9WRU5ET1JfVU5LTk9XTjsKKwljcHVfaW5mby0+ZmFtaWx5CQk9IHVua25vd247CisJY3B1X2luZm8tPm1vZGVsCQkJPSB1bmtub3duOworCWNwdV9pbmZvLT5zdGVwcGluZwkJPSB1bmtub3duOworCWNwdV9pbmZvLT5jYXBzCQkJPSAwOworCisJZnAgPSBmb3BlbigiL3Byb2MvY3B1aW5mbyIsICJyIik7CisJaWYgKCFmcCkKKwkJcmV0dXJuIC1FSU87CisKKwl3aGlsZSAoIWZlb2YoZnApKSB7CisJCWlmICghZmdldHModmFsdWUsIDY0LCBmcCkpCisJCQljb250aW51ZTsKKwkJdmFsdWVbNjMgLSAxXSA9ICdcMCc7CisKKwkJaWYgKCFzdHJuY21wKHZhbHVlLCAicHJvY2Vzc29yXHQ6ICIsIDEyKSkKKwkJCXNzY2FuZih2YWx1ZSwgInByb2Nlc3Nvclx0OiAldSIsICZwcm9jKTsKKworCQlpZiAocHJvYyAhPSBjcHUpCisJCQljb250aW51ZTsKKworCQkvKiBHZXQgQ1BVIHZlbmRvciAqLworCQlpZiAoIXN0cm5jbXAodmFsdWUsICJ2ZW5kb3JfaWQiLCA5KSkgeworCQkJZm9yICh4ID0gMTsgeCA8IFg4Nl9WRU5ET1JfTUFYOyB4KyspIHsKKwkJCQlpZiAoc3Ryc3RyKHZhbHVlLCBjcHVfdmVuZG9yX3RhYmxlW3hdKSkKKwkJCQkJY3B1X2luZm8tPnZlbmRvciA9IHg7CisJCQl9CisJCS8qIEdldCBDUFUgZmFtaWx5LCBldGMuICovCisJCX0gZWxzZSBpZiAoIXN0cm5jbXAodmFsdWUsICJjcHUgZmFtaWx5XHQ6ICIsIDEzKSkgeworCQkJc3NjYW5mKHZhbHVlLCAiY3B1IGZhbWlseVx0OiAldSIsCisJCQkgICAgICAgJmNwdV9pbmZvLT5mYW1pbHkpOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKHZhbHVlLCAibW9kZWxcdFx0OiAiLCA5KSkgeworCQkJc3NjYW5mKHZhbHVlLCAibW9kZWxcdFx0OiAldSIsCisJCQkgICAgICAgJmNwdV9pbmZvLT5tb2RlbCk7CisJCX0gZWxzZSBpZiAoIXN0cm5jbXAodmFsdWUsICJzdGVwcGluZ1x0OiAiLCAxMCkpIHsKKwkJCXNzY2FuZih2YWx1ZSwgInN0ZXBwaW5nXHQ6ICV1IiwKKwkJCSAgICAgICAmY3B1X2luZm8tPnN0ZXBwaW5nKTsKKworCQkJLyogRXhpdCAtPiBhbGwgdmFsdWVzIG11c3QgaGF2ZSBiZWVuIHNldCAqLworCQkJaWYgKGNwdV9pbmZvLT52ZW5kb3IgPT0gWDg2X1ZFTkRPUl9VTktOT1dOIHx8CisJCQkgICAgY3B1X2luZm8tPmZhbWlseSA9PSB1bmtub3duIHx8CisJCQkgICAgY3B1X2luZm8tPm1vZGVsID09IHVua25vd24gfHwKKwkJCSAgICBjcHVfaW5mby0+c3RlcHBpbmcgPT0gdW5rbm93bikgeworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCXJldCA9IDA7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwlyZXQgPSAtRU5PREVWOworb3V0OgorCWZjbG9zZShmcCk7CisJLyogR2V0IHNvbWUgdXNlZnVsIENQVSBjYXBhYmlsaXRpZXMgZnJvbSBjcHVpZCAqLworCWlmIChjcHVfaW5mby0+dmVuZG9yICE9IFg4Nl9WRU5ET1JfQU1EICYmCisJICAgIGNwdV9pbmZvLT52ZW5kb3IgIT0gWDg2X1ZFTkRPUl9JTlRFTCkKKwkJcmV0dXJuIHJldDsKKworCWNwdWlkX2xldmVsCT0gY3B1aWRfZWF4KDApOworCWV4dF9jcHVpZF9sZXZlbAk9IGNwdWlkX2VheCgweDgwMDAwMDAwKTsKKworCS8qIEludmFyaWFudCBUU0MgKi8KKwlpZiAoZXh0X2NwdWlkX2xldmVsID49IDB4ODAwMDAwMDcgJiYKKwkgICAgKGNwdWlkX2VkeCgweDgwMDAwMDA3KSAmICgxIDw8IDgpKSkKKwkJY3B1X2luZm8tPmNhcHMgfD0gQ1BVUE9XRVJfQ0FQX0lOVl9UU0M7CisKKwkvKiBBcGVyZi9NcGVyZiByZWdpc3RlcnMgc3VwcG9ydCAqLworCWlmIChjcHVpZF9sZXZlbCA+PSA2ICYmIChjcHVpZF9lY3goNikgJiAweDEpKQorCQljcHVfaW5mby0+Y2FwcyB8PSBDUFVQT1dFUl9DQVBfQVBFUkY7CisKKwkvKiBBTUQgQm9vc3Qgc3RhdGUgZW5hYmxlL2Rpc2FibGUgcmVnaXN0ZXIgKi8KKwlpZiAoY3B1X2luZm8tPnZlbmRvciA9PSBYODZfVkVORE9SX0FNRCkgeworCQlpZiAoZXh0X2NwdWlkX2xldmVsID49IDB4ODAwMDAwMDcgJiYKKwkJICAgIChjcHVpZF9lZHgoMHg4MDAwMDAwNykgJiAoMSA8PCA5KSkpCisJCQljcHVfaW5mby0+Y2FwcyB8PSBDUFVQT1dFUl9DQVBfQU1EX0NCUDsKKwl9CisKKwlpZiAoY3B1X2luZm8tPnZlbmRvciA9PSBYODZfVkVORE9SX0lOVEVMKSB7CisJCWlmIChjcHVpZF9sZXZlbCA+PSA2ICYmCisJCSAgICAoY3B1aWRfZWF4KDYpICYgKDEgPDwgMSkpKQorCQkJY3B1X2luZm8tPmNhcHMgfD0gQ1BVUE9XRVJfQ0FQX0lOVEVMX0lEQTsKKwl9CisKKwlpZiAoY3B1X2luZm8tPnZlbmRvciA9PSBYODZfVkVORE9SX0lOVEVMKSB7CisJCS8qIEludGVsJ3MgcGVyZi1iaWFzIE1TUiBzdXBwb3J0ICovCisJCWlmIChjcHVpZF9sZXZlbCA+PSA2ICYmIChjcHVpZF9lY3goNikgJiAoMSA8PCAzKSkpCisJCQljcHVfaW5mby0+Y2FwcyB8PSBDUFVQT1dFUl9DQVBfUEVSRl9CSUFTOworCisJCS8qIEludGVsJ3MgVHVyYm8gUmF0aW8gTGltaXQgc3VwcG9ydCAqLworCQlpZiAoY3B1X2luZm8tPmZhbWlseSA9PSA2KSB7CisJCQlzd2l0Y2ggKGNwdV9pbmZvLT5tb2RlbCkgeworCQkJY2FzZSAweDFBOgkvKiBDb3JlIGk3LCBYZW9uIDU1MDAgc2VyaWVzCisJCQkJCSAqIEJsb29tZmllbGQsIEdhaW5zdG93biBOSE0tRVAKKwkJCQkJICovCisJCQljYXNlIDB4MUU6CS8qIENvcmUgaTcgYW5kIGk1IFByb2Nlc3NvcgorCQkJCQkgKiBDbGFya3NmaWVsZCwgTHlubmZpZWxkLCBKYXNwZXIgRm9yZXN0CisJCQkJCSAqLworCQkJY2FzZSAweDFGOgkvKiBDb3JlIGk3IGFuZCBpNSBQcm9jZXNzb3IgLSBOZWhhbGVtICovCisJCQljYXNlIDB4MjU6CS8qIFdlc3RtZXJlIENsaWVudAorCQkJCQkgKiBDbGFya2RhbGUsIEFycmFuZGFsZQorCQkJCQkgKi8KKwkJCWNhc2UgMHgyQzoJLyogV2VzdG1lcmUgRVAgLSBHdWxmdG93biAqLworCQkJCWNwdV9pbmZvLT5jYXBzIHw9IENQVVBPV0VSX0NBUF9IQVNfVFVSQk9fUkFUSU87CisJCQljYXNlIDB4MkE6CS8qIFNOQiAqLworCQkJY2FzZSAweDJEOgkvKiBTTkIgWGVvbiAqLworCQkJCWNwdV9pbmZvLT5jYXBzIHw9IENQVVBPV0VSX0NBUF9IQVNfVFVSQk9fUkFUSU87CisJCQkJY3B1X2luZm8tPmNhcHMgfD0gQ1BVUE9XRVJfQ0FQX0lTX1NOQjsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgyRToJLyogTmVoYWxlbS1FWCBYZW9uIC0gQmVja3RvbiAqLworCQkJY2FzZSAweDJGOgkvKiBXZXN0bWVyZS1FWCBYZW9uIC0gRWFnbGV0b24gKi8KKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKglwcmludGYoIklEOiAldSAtIEV4dGlkOiAweCV4IC0gQ2FwczogMHglbGx4XG4iLAorCQljcHVpZF9sZXZlbCwgZXh0X2NwdWlkX2xldmVsLCBjcHVfaW5mby0+Y2Fwcyk7CisJKi8KKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaGVscGVycy9oZWxwZXJzLmggYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9oZWxwZXJzL2hlbHBlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTJlZTM2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaGVscGVycy9oZWxwZXJzLmgKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiAgKEMpIDIwMTAsMjAxMSAgICAgICBUaG9tYXMgUmVubmluZ2VyIDx0cmVubkBzdXNlLmRlPiwgTm92ZWxsIEluYy4KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqIE1pc2NlbGxhbmVvdXMgaGVscGVycyB3aGljaCBkbyBub3QgZml0IG9yIGFyZSB3b3J0aAorICogdG8gcHV0IGludG8gc2VwYXJhdGUgaGVhZGVycworICovCisKKyNpZm5kZWYgX19DUFVQT1dFUlVUSUxTX0hFTFBFUlNfXworI2RlZmluZSBfX0NQVVBPV0VSVVRJTFNfSEVMUEVSU19fCisKKyNpbmNsdWRlIDxsaWJpbnRsLmg+CisjaW5jbHVkZSA8bG9jYWxlLmg+CisKKyNpbmNsdWRlICJoZWxwZXJzL2JpdG1hc2suaCIKKworLyogSW50ZXJuYXRpb25hbGl6YXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgXyhTdHJpbmcpIGdldHRleHQoU3RyaW5nKQorI2lmbmRlZiBnZXR0ZXh0X25vb3AKKyNkZWZpbmUgZ2V0dGV4dF9ub29wKFN0cmluZykgU3RyaW5nCisjZW5kaWYKKyNkZWZpbmUgTl8oU3RyaW5nKSBnZXR0ZXh0X25vb3AoU3RyaW5nKQorLyogSW50ZXJuYXRpb25hbGl6YXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZXh0ZXJuIGludCBydW5fYXNfcm9vdDsKK2V4dGVybiBzdHJ1Y3QgYml0bWFzayAqY3B1c19jaG9zZW47CisKKy8qIEdsb2JhbCB2ZXJib3NlICgtZCkgc3R1ZmYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIGRlZmluZSBERUJVRyB2aWEgZ2xvYmFsIE1ha2VmaWxlIHZhcmlhYmxlCisgKiBEZWJ1ZyBvdXRwdXQgaXMgc2VudCB0byBzdGRlcnIsIGRvOgorICogY3B1cG93ZXIgbW9uaXRvciAyPi90bXAvZGVidWcKKyAqIHRvIHNwbGl0IGRlYnVnIG91dHB1dCBhd2F5IGZyb20gbm9ybWFsIG91dHB1dAorKi8KKyNpZmRlZiBERUJVRworZXh0ZXJuIGludCBiZV92ZXJib3NlOworCisjZGVmaW5lIGRwcmludChmbXQsIC4uLikgewkJCQkJXAorCQlpZiAoYmVfdmVyYm9zZSkgewkJCQlcCisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiAiIGZtdCwJCVwKKwkJCQlfX2Z1bmNfXywgIyNfX1ZBX0FSR1NfXyk7CVwKKwkJfQkJCQkJCVwKKwl9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGRwcmludChjb25zdCBjaGFyICpmbXQsIC4uLikgeyB9CisjZW5kaWYKK2V4dGVybiBpbnQgYmVfdmVyYm9zZTsKKy8qIEdsb2JhbCB2ZXJib3NlICgtdikgc3R1ZmYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBjcHVpZCBhbmQgY3B1aW5mbyBoZWxwZXJzICAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2VudW0gY3B1cG93ZXJfY3B1X3ZlbmRvciB7WDg2X1ZFTkRPUl9VTktOT1dOID0gMCwgWDg2X1ZFTkRPUl9JTlRFTCwKKwkJCSAgWDg2X1ZFTkRPUl9BTUQsIFg4Nl9WRU5ET1JfTUFYfTsKKworI2RlZmluZSBDUFVQT1dFUl9DQVBfSU5WX1RTQwkJMHgwMDAwMDAwMQorI2RlZmluZSBDUFVQT1dFUl9DQVBfQVBFUkYJCTB4MDAwMDAwMDIKKyNkZWZpbmUgQ1BVUE9XRVJfQ0FQX0FNRF9DQlAJCTB4MDAwMDAwMDQKKyNkZWZpbmUgQ1BVUE9XRVJfQ0FQX1BFUkZfQklBUwkJMHgwMDAwMDAwOAorI2RlZmluZSBDUFVQT1dFUl9DQVBfSEFTX1RVUkJPX1JBVElPCTB4MDAwMDAwMTAKKyNkZWZpbmUgQ1BVUE9XRVJfQ0FQX0lTX1NOQgkJMHgwMDAwMDAxMQorI2RlZmluZSBDUFVQT1dFUl9DQVBfSU5URUxfSURBCQkweDAwMDAwMDEyCisKKyNkZWZpbmUgTUFYX0hXX1BTVEFURVMgMTAKKworc3RydWN0IGNwdXBvd2VyX2NwdV9pbmZvIHsKKwllbnVtIGNwdXBvd2VyX2NwdV92ZW5kb3IgdmVuZG9yOworCXVuc2lnbmVkIGludCBmYW1pbHk7CisJdW5zaWduZWQgaW50IG1vZGVsOworCXVuc2lnbmVkIGludCBzdGVwcGluZzsKKwkvKiBDUFUgY2FwYWJpbGl0aWVzIHJlYWQgb3V0IGZyb20gY3B1aWQgKi8KKwl1bnNpZ25lZCBsb25nIGxvbmcgY2FwczsKK307CisKKy8qIGdldF9jcHVfaW5mbworICoKKyAqIEV4dHJhY3QgQ1BVIHZlbmRvciwgZmFtaWx5LCBtb2RlbCwgc3RlcHBpbmcgaW5mbyBmcm9tIC9wcm9jL2NwdWluZm8KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciBhIG5lZ2F0aXYgZXJyb3IgY29kZQorICogT25seSB1c2VkIG9uIHg4NiwgYmVsb3cgZ2xvYmFsJ3Mgc3RydWN0IHZhbHVlcyBhcmUgemVyby91bmtub3duIG9uCisgKiBvdGhlciBhcmNocworICovCitleHRlcm4gaW50IGdldF9jcHVfaW5mbyh1bnNpZ25lZCBpbnQgY3B1LCBzdHJ1Y3QgY3B1cG93ZXJfY3B1X2luZm8gKmNwdV9pbmZvKTsKK2V4dGVybiBzdHJ1Y3QgY3B1cG93ZXJfY3B1X2luZm8gY3B1cG93ZXJfY3B1X2luZm87CisvKiBjcHVpZCBhbmQgY3B1aW5mbyBoZWxwZXJzICAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKiBDUFUgdG9wb2xvZ3kvaGllcmFyY2h5IHBhcnNpbmcgKioqKioqKioqKioqKioqKioqLworc3RydWN0IGNwdXBvd2VyX3RvcG9sb2d5IHsKKwkvKiBBbW91bnQgb2YgQ1BVIGNvcmVzLCBwYWNrYWdlcyBhbmQgdGhyZWFkcyBwZXIgY29yZSBpbiB0aGUgc3lzdGVtICovCisJdW5zaWduZWQgaW50IGNvcmVzOworCXVuc2lnbmVkIGludCBwa2dzOworCXVuc2lnbmVkIGludCB0aHJlYWRzOyAvKiBwZXIgY29yZSAqLworCisJLyogQXJyYXkgZ2V0cyBtYWxsb2NhdGVkIHdpdGggY29yZXMgZW50cmllcywgaG9sZGluZyBwZXIgY29yZSBpbmZvICovCisJc3RydWN0IHsKKwkJaW50IHBrZzsKKwkJaW50IGNvcmU7CisJCWludCBjcHU7CisJfSAqY29yZV9pbmZvOworfTsKKworZXh0ZXJuIGludCBnZXRfY3B1X3RvcG9sb2d5KHN0cnVjdCBjcHVwb3dlcl90b3BvbG9neSAqY3B1X3RvcCk7CitleHRlcm4gdm9pZCBjcHVfdG9wb2xvZ3lfcmVsZWFzZShzdHJ1Y3QgY3B1cG93ZXJfdG9wb2xvZ3kgY3B1X3RvcCk7CisvKiBDUFUgdG9wb2xvZ3kvaGllcmFyY2h5IHBhcnNpbmcgKioqKioqKioqKioqKioqKioqLworCisvKiBYODYgT05MWSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKKworI2luY2x1ZGUgPHBjaS9wY2kuaD4KKworLyogUmVhZC9Xcml0ZSBtc3IgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiBpbnQgcmVhZF9tc3IoaW50IGNwdSwgdW5zaWduZWQgaW50IGlkeCwgdW5zaWduZWQgbG9uZyBsb25nICp2YWwpOworZXh0ZXJuIGludCB3cml0ZV9tc3IoaW50IGNwdSwgdW5zaWduZWQgaW50IGlkeCwgdW5zaWduZWQgbG9uZyBsb25nIHZhbCk7CisKK2V4dGVybiBpbnQgbXNyX2ludGVsX3NldF9wZXJmX2JpYXModW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgaW50IHZhbCk7CitleHRlcm4gaW50IG1zcl9pbnRlbF9nZXRfcGVyZl9iaWFzKHVuc2lnbmVkIGludCBjcHUpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyBtc3JfaW50ZWxfZ2V0X3R1cmJvX3JhdGlvKHVuc2lnbmVkIGludCBjcHUpOworCisvKiBSZWFkL1dyaXRlIG1zciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBQQ0kgc3R1ZmYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiBpbnQgYW1kX3BjaV9nZXRfbnVtX2Jvb3N0X3N0YXRlcyhpbnQgKmFjdGl2ZSwgaW50ICpzdGF0ZXMpOworZXh0ZXJuIHN0cnVjdCBwY2lfZGV2ICpwY2lfYWNjX2luaXQoc3RydWN0IHBjaV9hY2Nlc3MgKipwYWNjLCBpbnQgdmVuZG9yX2lkLAorCQkJCSAgICBpbnQgKmRldl9pZHMpOworCisvKiBQQ0kgc3R1ZmYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQU1EIEhXIHBzdGF0ZSBkZWNvZGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworZXh0ZXJuIGludCBkZWNvZGVfcHN0YXRlcyh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBpbnQgY3B1X2ZhbWlseSwKKwkJCSAgaW50IGJvb3N0X3N0YXRlcywgdW5zaWduZWQgbG9uZyAqcHN0YXRlcywgaW50ICpubyk7CisKKy8qIEFNRCBIVyBwc3RhdGUgZGVjb2RpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2V4dGVybiBpbnQgY3B1ZnJlcV9oYXNfYm9vc3Rfc3VwcG9ydCh1bnNpZ25lZCBpbnQgY3B1LCBpbnQgKnN1cHBvcnQsCisJCQkJICAgICBpbnQgKmFjdGl2ZSwgaW50ICogc3RhdGVzKTsKKy8qCisgKiBDUFVJRCBmdW5jdGlvbnMgcmV0dXJuaW5nIGEgc2luZ2xlIGRhdHVtCisgKi8KK3Vuc2lnbmVkIGludCBjcHVpZF9lYXgodW5zaWduZWQgaW50IG9wKTsKK3Vuc2lnbmVkIGludCBjcHVpZF9lYngodW5zaWduZWQgaW50IG9wKTsKK3Vuc2lnbmVkIGludCBjcHVpZF9lY3godW5zaWduZWQgaW50IG9wKTsKK3Vuc2lnbmVkIGludCBjcHVpZF9lZHgodW5zaWduZWQgaW50IG9wKTsKKworLyogY3B1aWQgYW5kIGNwdWluZm8gaGVscGVycyAgKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBYODYgT05MWSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBkZWNvZGVfcHN0YXRlcyh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBpbnQgY3B1X2ZhbWlseSwKKwkJCQkgaW50IGJvb3N0X3N0YXRlcywgdW5zaWduZWQgbG9uZyAqcHN0YXRlcywKKwkJCQkgaW50ICpubykKK3sgcmV0dXJuIC0xOyB9OworCitzdGF0aWMgaW5saW5lIGludCByZWFkX21zcihpbnQgY3B1LCB1bnNpZ25lZCBpbnQgaWR4LCB1bnNpZ25lZCBsb25nIGxvbmcgKnZhbCkKK3sgcmV0dXJuIC0xOyB9Oworc3RhdGljIGlubGluZSBpbnQgd3JpdGVfbXNyKGludCBjcHUsIHVuc2lnbmVkIGludCBpZHgsIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWwpCit7IHJldHVybiAtMTsgfTsKK3N0YXRpYyBpbmxpbmUgaW50IG1zcl9pbnRlbF9zZXRfcGVyZl9iaWFzKHVuc2lnbmVkIGludCBjcHUsIHVuc2lnbmVkIGludCB2YWwpCit7IHJldHVybiAtMTsgfTsKK3N0YXRpYyBpbmxpbmUgaW50IG1zcl9pbnRlbF9nZXRfcGVyZl9iaWFzKHVuc2lnbmVkIGludCBjcHUpCit7IHJldHVybiAtMTsgfTsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIG1zcl9pbnRlbF9nZXRfdHVyYm9fcmF0aW8odW5zaWduZWQgaW50IGNwdSkKK3sgcmV0dXJuIDA7IH07CisKKy8qIFJlYWQvV3JpdGUgbXNyICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbmxpbmUgaW50IGNwdWZyZXFfaGFzX2Jvb3N0X3N1cHBvcnQodW5zaWduZWQgaW50IGNwdSwgaW50ICpzdXBwb3J0LAorCQkJCQkgICAgaW50ICphY3RpdmUsIGludCAqIHN0YXRlcykKK3sgcmV0dXJuIC0xOyB9CisKKy8qIGNwdWlkIGFuZCBjcHVpbmZvIGhlbHBlcnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcHVpZF9lYXgodW5zaWduZWQgaW50IG9wKSB7IHJldHVybiAwOyB9Oworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3B1aWRfZWJ4KHVuc2lnbmVkIGludCBvcCkgeyByZXR1cm4gMDsgfTsKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNwdWlkX2VjeCh1bnNpZ25lZCBpbnQgb3ApIHsgcmV0dXJuIDA7IH07CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcHVpZF9lZHgodW5zaWduZWQgaW50IG9wKSB7IHJldHVybiAwOyB9OworI2VuZGlmIC8qIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykgKi8KKworI2VuZGlmIC8qIF9fQ1BVUE9XRVJVVElMU19IRUxQRVJTX18gKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2hlbHBlcnMvbWlzYy5jIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaGVscGVycy9taXNjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYwOTI0MwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2hlbHBlcnMvbWlzYy5jCkBAIC0wLDAgKzEsMjcgQEAKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisKKyNpbmNsdWRlICJoZWxwZXJzL2hlbHBlcnMuaCIKKworaW50IGNwdWZyZXFfaGFzX2Jvb3N0X3N1cHBvcnQodW5zaWduZWQgaW50IGNwdSwgaW50ICpzdXBwb3J0LCBpbnQgKmFjdGl2ZSwKKwkJCWludCAqc3RhdGVzKQoreworCXN0cnVjdCBjcHVwb3dlcl9jcHVfaW5mbyBjcHVfaW5mbzsKKwlpbnQgcmV0OworCisJKnN1cHBvcnQgPSAqYWN0aXZlID0gKnN0YXRlcyA9IDA7CisKKwlyZXQgPSBnZXRfY3B1X2luZm8oMCwgJmNwdV9pbmZvKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKGNwdXBvd2VyX2NwdV9pbmZvLmNhcHMgJiBDUFVQT1dFUl9DQVBfQU1EX0NCUCkgeworCQkqc3VwcG9ydCA9IDE7CisJCWFtZF9wY2lfZ2V0X251bV9ib29zdF9zdGF0ZXMoYWN0aXZlLCBzdGF0ZXMpOworCQlpZiAocmV0IDw9IDApCisJCQlyZXR1cm4gcmV0OworCQkqc3VwcG9ydCA9IDE7CisJfSBlbHNlIGlmIChjcHVwb3dlcl9jcHVfaW5mby5jYXBzICYgQ1BVUE9XRVJfQ0FQX0lOVEVMX0lEQSkKKwkJKnN1cHBvcnQgPSAqYWN0aXZlID0gMTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiAjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaGVscGVycy9tc3IuYyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2hlbHBlcnMvbXNyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFhNGIyNAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2hlbHBlcnMvbXNyLmMKQEAgLTAsMCArMSwxMTUgQEAKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisKKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJoZWxwZXJzL2hlbHBlcnMuaCIKKworLyogSW50ZWwgc3BlY2lmaWMgTVNScyAqLworI2RlZmluZSBNU1JfSUEzMl9QRVJGX1NUQVRVUwkJMHgxOTgKKyNkZWZpbmUgTVNSX0lBMzJfTUlTQ19FTkFCTEVTCQkweDFhMAorI2RlZmluZSBNU1JfSUEzMl9FTkVSR1lfUEVSRl9CSUFTCTB4MWIwCisjZGVmaW5lIE1TUl9ORUhBTEVNX1RVUkJPX1JBVElPX0xJTUlUCTB4MWFkCisKKy8qCisgKiByZWFkX21zcgorICoKKyAqIFdpbGwgcmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLTEgb24gZmFpbHVyZS4KKyAqIFBvc3NpYmxlIGVycm5vIHZhbHVlcyBjb3VsZCBiZToKKyAqIEVGQVVMVCAtSWYgdGhlIHJlYWQvd3JpdGUgZGlkIG5vdCBmdWxseSBjb21wbGV0ZQorICogRUlPICAgIC1JZiB0aGUgQ1BVIGRvZXMgbm90IHN1cHBvcnQgTVNScworICogRU5YSU8gIC1JZiB0aGUgQ1BVIGRvZXMgbm90IGV4aXN0CisgKi8KKworaW50IHJlYWRfbXNyKGludCBjcHUsIHVuc2lnbmVkIGludCBpZHgsIHVuc2lnbmVkIGxvbmcgbG9uZyAqdmFsKQoreworCWludCBmZDsKKwljaGFyIG1zcl9maWxlX25hbWVbNjRdOworCisJc3ByaW50Zihtc3JfZmlsZV9uYW1lLCAiL2Rldi9jcHUvJWQvbXNyIiwgY3B1KTsKKwlmZCA9IG9wZW4obXNyX2ZpbGVfbmFtZSwgT19SRE9OTFkpOworCWlmIChmZCA8IDApCisJCXJldHVybiAtMTsKKwlpZiAobHNlZWsoZmQsIGlkeCwgU0VFS19DVVIpID09IC0xKQorCQlnb3RvIGVycjsKKwlpZiAocmVhZChmZCwgdmFsLCBzaXplb2YgKnZhbCkgIT0gc2l6ZW9mICp2YWwpCisJCWdvdG8gZXJyOworCWNsb3NlKGZkKTsKKwlyZXR1cm4gMDsKKyBlcnI6CisJY2xvc2UoZmQpOworCXJldHVybiAtMTsKK30KKworLyoKKyAqIHdyaXRlX21zcgorICoKKyAqIFdpbGwgcmV0dXJuIDAgb24gc3VjY2VzcyBhbmQgLTEgb24gZmFpbHVyZS4KKyAqIFBvc3NpYmxlIGVycm5vIHZhbHVlcyBjb3VsZCBiZToKKyAqIEVGQVVMVCAtSWYgdGhlIHJlYWQvd3JpdGUgZGlkIG5vdCBmdWxseSBjb21wbGV0ZQorICogRUlPICAgIC1JZiB0aGUgQ1BVIGRvZXMgbm90IHN1cHBvcnQgTVNScworICogRU5YSU8gIC1JZiB0aGUgQ1BVIGRvZXMgbm90IGV4aXN0CisgKi8KK2ludCB3cml0ZV9tc3IoaW50IGNwdSwgdW5zaWduZWQgaW50IGlkeCwgdW5zaWduZWQgbG9uZyBsb25nIHZhbCkKK3sKKwlpbnQgZmQ7CisJY2hhciBtc3JfZmlsZV9uYW1lWzY0XTsKKworCXNwcmludGYobXNyX2ZpbGVfbmFtZSwgIi9kZXYvY3B1LyVkL21zciIsIGNwdSk7CisJZmQgPSBvcGVuKG1zcl9maWxlX25hbWUsIE9fV1JPTkxZKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gLTE7CisJaWYgKGxzZWVrKGZkLCBpZHgsIFNFRUtfQ1VSKSA9PSAtMSkKKwkJZ290byBlcnI7CisJaWYgKHdyaXRlKGZkLCAmdmFsLCBzaXplb2YgdmFsKSAhPSBzaXplb2YgdmFsKQorCQlnb3RvIGVycjsKKwljbG9zZShmZCk7CisJcmV0dXJuIDA7CisgZXJyOgorCWNsb3NlKGZkKTsKKwlyZXR1cm4gLTE7Cit9CisKK2ludCBtc3JfaW50ZWxfZ2V0X3BlcmZfYmlhcyh1bnNpZ25lZCBpbnQgY3B1KQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyB2YWw7CisJaW50IHJldDsKKworCWlmICghKGNwdXBvd2VyX2NwdV9pbmZvLmNhcHMgJiBDUFVQT1dFUl9DQVBfUEVSRl9CSUFTKSkKKwkJcmV0dXJuIC0xOworCisJcmV0ID0gcmVhZF9tc3IoY3B1LCBNU1JfSUEzMl9FTkVSR1lfUEVSRl9CSUFTLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCXJldHVybiB2YWw7Cit9CisKK2ludCBtc3JfaW50ZWxfc2V0X3BlcmZfYmlhcyh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBpbnQgdmFsKQoreworCWludCByZXQ7CisKKwlpZiAoIShjcHVwb3dlcl9jcHVfaW5mby5jYXBzICYgQ1BVUE9XRVJfQ0FQX1BFUkZfQklBUykpCisJCXJldHVybiAtMTsKKworCXJldCA9IHdyaXRlX21zcihjcHUsIE1TUl9JQTMyX0VORVJHWV9QRVJGX0JJQVMsIHZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKK30KKwordW5zaWduZWQgbG9uZyBsb25nIG1zcl9pbnRlbF9nZXRfdHVyYm9fcmF0aW8odW5zaWduZWQgaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgdmFsOworCWludCByZXQ7CisKKwlpZiAoIShjcHVwb3dlcl9jcHVfaW5mby5jYXBzICYgQ1BVUE9XRVJfQ0FQX0hBU19UVVJCT19SQVRJTykpCisJCXJldHVybiAtMTsKKworCXJldCA9IHJlYWRfbXNyKGNwdSwgTVNSX05FSEFMRU1fVFVSQk9fUkFUSU9fTElNSVQsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcmV0dXJuIHZhbDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaGVscGVycy9wY2kuYyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2hlbHBlcnMvcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2QyZWI2ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2hlbHBlcnMvcGNpLmMKQEAgLTAsMCArMSw0NCBAQAorI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKKworI2luY2x1ZGUgPGhlbHBlcnMvaGVscGVycy5oPgorCisvKgorICogcGNpX2FjY19pbml0CisgKgorICogUENJIGFjY2VzcyBoZWxwZXIgZnVuY3Rpb24gZGVwZW5kaW5nIG9uIGxpYnBjaQorICoKKyAqICoqcGFjYyA6IGlmIGEgdmFsaWQgcGNpX2RldiBpcyByZXR1cm5lZAorICogICAgICAgICAqcGFjYyBtdXN0IGJlIHBhc3NlZCB0byBwY2lfYWNjX2NsZWFudXAgdG8gZnJlZSBpdAorICoKKyAqIHZlbmRvcl9pZCA6IHRoZSBwY2kgdmVuZG9yIGlkIG1hdGNoaW5nIHRoZSBwY2kgZGV2aWNlIHRvIGFjY2VzcworICogZGV2X2lkcyA6ICAgZGV2aWNlIGlkcyBtYXRjaGluZyB0aGUgcGNpIGRldmljZSB0byBhY2Nlc3MKKyAqCisgKiBSZXR1cm5zIDoKKyAqIHN0cnVjdCBwY2lfZGV2IHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggcGNpX3tyZWFkLHdyaXRlfV8qIGZ1bmN0aW9ucworICogICAgICAgICAgICAgICAgdG8gYWNjZXNzIHRoZSBQQ0kgY29uZmlnIHNwYWNlIG9mIG1hdGNoaW5nIHBjaSBkZXZpY2VzCisgKi8KK3N0cnVjdCBwY2lfZGV2ICpwY2lfYWNjX2luaXQoc3RydWN0IHBjaV9hY2Nlc3MgKipwYWNjLCBpbnQgdmVuZG9yX2lkLAorCQkJCSAgICBpbnQgKmRldl9pZHMpCit7CisJc3RydWN0IHBjaV9maWx0ZXIgZmlsdGVyX25iX2xpbmsgPSB7IC0xLCAtMSwgLTEsIC0xLCB2ZW5kb3JfaWQsIDB9OworCXN0cnVjdCBwY2lfZGV2ICpkZXZpY2U7CisJdW5zaWduZWQgaW50IGk7CisKKwkqcGFjYyA9IHBjaV9hbGxvYygpOworCWlmICgqcGFjYyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXBjaV9pbml0KCpwYWNjKTsKKwlwY2lfc2Nhbl9idXMoKnBhY2MpOworCisJZm9yIChpID0gMDsgZGV2X2lkc1tpXSAhPSAwOyBpKyspIHsKKwkJZmlsdGVyX25iX2xpbmsuZGV2aWNlID0gZGV2X2lkc1tpXTsKKwkJZm9yIChkZXZpY2UgPSAoKnBhY2MpLT5kZXZpY2VzOyBkZXZpY2U7IGRldmljZSA9IGRldmljZS0+bmV4dCkgeworCQkJaWYgKHBjaV9maWx0ZXJfbWF0Y2goJmZpbHRlcl9uYl9saW5rLCBkZXZpY2UpKQorCQkJCXJldHVybiBkZXZpY2U7CisJCX0KKwl9CisJcGNpX2NsZWFudXAoKnBhY2MpOworCXJldHVybiBOVUxMOworfQorI2VuZGlmIC8qIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykgKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2hlbHBlcnMvc3lzZnMuYyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2hlbHBlcnMvc3lzZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWUyNDY2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaGVscGVycy9zeXNmcy5jCkBAIC0wLDAgKzEsMzU4IEBACisvKgorICogIChDKSAyMDA0LTIwMDkgIERvbWluaWsgQnJvZG93c2tpIDxsaW51eEBkb21pbmlrYnJvZG93c2tpLmRlPgorICogIChDKSAyMDExICAgICAgIFRob21hcyBSZW5uaW5nZXIgPHRyZW5uQG5vdmVsbC5jb20+IE5vdmVsbCBJbmMuCisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMi4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgImhlbHBlcnMvc3lzZnMuaCIKKwordW5zaWduZWQgaW50IHN5c2ZzX3JlYWRfZmlsZShjb25zdCBjaGFyICpwYXRoLCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pCit7CisJaW50IGZkOworCXNzaXplX3QgbnVtcmVhZDsKKworCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisJaWYgKGZkID09IC0xKQorCQlyZXR1cm4gMDsKKworCW51bXJlYWQgPSByZWFkKGZkLCBidWYsIGJ1ZmxlbiAtIDEpOworCWlmIChudW1yZWFkIDwgMSkgeworCQljbG9zZShmZCk7CisJCXJldHVybiAwOworCX0KKworCWJ1ZltudW1yZWFkXSA9ICdcMCc7CisJY2xvc2UoZmQpOworCisJcmV0dXJuICh1bnNpZ25lZCBpbnQpIG51bXJlYWQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3lzZnNfd3JpdGVfZmlsZShjb25zdCBjaGFyICpwYXRoLAorCQkJCSAgICAgY29uc3QgY2hhciAqdmFsdWUsIHNpemVfdCBsZW4pCit7CisJaW50IGZkOworCXNzaXplX3QgbnVtd3JpdGU7CisKKwlmZCA9IG9wZW4ocGF0aCwgT19XUk9OTFkpOworCWlmIChmZCA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwludW13cml0ZSA9IHdyaXRlKGZkLCB2YWx1ZSwgbGVuKTsKKwlpZiAobnVtd3JpdGUgPCAxKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIDA7CisJfQorCWNsb3NlKGZkKTsKKwlyZXR1cm4gKHVuc2lnbmVkIGludCkgbnVtd3JpdGU7Cit9CisKKy8qIENQVWlkbGUgaWRsZXN0YXRlIHNwZWNpZmljIC9zeXMvZGV2aWNlcy9zeXN0ZW0vY3B1L2NwdVgvY3B1aWRsZS8gYWNjZXNzICovCisKKy8qCisgKiBoZWxwZXIgZnVuY3Rpb24gdG8gcmVhZCBmaWxlIGZyb20gL3N5cyBpbnRvIGdpdmVuIGJ1ZmZlcgorICogZm5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIHVuZGVyICJjcHVYL2NwdWlkbGUvc3RhdGVYLyIgZGlyCisgKiBjc3RhdGVzIHN0YXJ0aW5nIHdpdGggMCwgQzAgaXMgbm90IGNvdW50ZWQgYXMgY3N0YXRlLgorICogVGhpcyBtZWFucyBpZiB5b3Ugd2FudCBDMSBpbmZvLCBwYXNzIDAgYXMgaWRsZXN0YXRlIHBhcmFtCisgKi8KK3Vuc2lnbmVkIGludCBzeXNmc19pZGxlc3RhdGVfcmVhZF9maWxlKHVuc2lnbmVkIGludCBjcHUsIHVuc2lnbmVkIGludCBpZGxlc3RhdGUsCisJCQkgICAgIGNvbnN0IGNoYXIgKmZuYW1lLCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pCit7CisJY2hhciBwYXRoW1NZU0ZTX1BBVEhfTUFYXTsKKwlpbnQgZmQ7CisJc3NpemVfdCBudW1yZWFkOworCisJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCBQQVRIX1RPX0NQVSAiY3B1JXUvY3B1aWRsZS9zdGF0ZSV1LyVzIiwKKwkJIGNwdSwgaWRsZXN0YXRlLCBmbmFtZSk7CisKKwlmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkpOworCWlmIChmZCA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwludW1yZWFkID0gcmVhZChmZCwgYnVmLCBidWZsZW4gLSAxKTsKKwlpZiAobnVtcmVhZCA8IDEpIHsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlidWZbbnVtcmVhZF0gPSAnXDAnOworCWNsb3NlKGZkKTsKKworCXJldHVybiAodW5zaWduZWQgaW50KSBudW1yZWFkOworfQorCisvKiByZWFkIGFjY2VzcyB0byBmaWxlcyB3aGljaCBjb250YWluIG9uZSBudW1lcmljIHZhbHVlICovCisKK2VudW0gaWRsZXN0YXRlX3ZhbHVlIHsKKwlJRExFU1RBVEVfVVNBR0UsCisJSURMRVNUQVRFX1BPV0VSLAorCUlETEVTVEFURV9MQVRFTkNZLAorCUlETEVTVEFURV9USU1FLAorCU1BWF9JRExFU1RBVEVfVkFMVUVfRklMRVMKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICppZGxlc3RhdGVfdmFsdWVfZmlsZXNbTUFYX0lETEVTVEFURV9WQUxVRV9GSUxFU10gPSB7CisJW0lETEVTVEFURV9VU0FHRV0gPSAidXNhZ2UiLAorCVtJRExFU1RBVEVfUE9XRVJdID0gInBvd2VyIiwKKwlbSURMRVNUQVRFX0xBVEVOQ1ldID0gImxhdGVuY3kiLAorCVtJRExFU1RBVEVfVElNRV0gID0gInRpbWUiLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBzeXNmc19pZGxlc3RhdGVfZ2V0X29uZV92YWx1ZSh1bnNpZ25lZCBpbnQgY3B1LAorCQkJCQkJICAgICB1bnNpZ25lZCBpbnQgaWRsZXN0YXRlLAorCQkJCQkJICAgICBlbnVtIGlkbGVzdGF0ZV92YWx1ZSB3aGljaCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWU7CisJdW5zaWduZWQgaW50IGxlbjsKKwljaGFyIGxpbmVidWZbTUFYX0xJTkVfTEVOXTsKKwljaGFyICplbmRwOworCisJaWYgKHdoaWNoID49IE1BWF9JRExFU1RBVEVfVkFMVUVfRklMRVMpCisJCXJldHVybiAwOworCisJbGVuID0gc3lzZnNfaWRsZXN0YXRlX3JlYWRfZmlsZShjcHUsIGlkbGVzdGF0ZSwKKwkJCQkJaWRsZXN0YXRlX3ZhbHVlX2ZpbGVzW3doaWNoXSwKKwkJCQkJbGluZWJ1Ziwgc2l6ZW9mKGxpbmVidWYpKTsKKwlpZiAobGVuID09IDApCisJCXJldHVybiAwOworCisJdmFsdWUgPSBzdHJ0b3VsbChsaW5lYnVmLCAmZW5kcCwgMCk7CisKKwlpZiAoZW5kcCA9PSBsaW5lYnVmIHx8IGVycm5vID09IEVSQU5HRSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gdmFsdWU7Cit9CisKKy8qIHJlYWQgYWNjZXNzIHRvIGZpbGVzIHdoaWNoIGNvbnRhaW4gb25lIHN0cmluZyAqLworCitlbnVtIGlkbGVzdGF0ZV9zdHJpbmcgeworCUlETEVTVEFURV9ERVNDLAorCUlETEVTVEFURV9OQU1FLAorCU1BWF9JRExFU1RBVEVfU1RSSU5HX0ZJTEVTCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqaWRsZXN0YXRlX3N0cmluZ19maWxlc1tNQVhfSURMRVNUQVRFX1NUUklOR19GSUxFU10gPSB7CisJW0lETEVTVEFURV9ERVNDXSA9ICJkZXNjIiwKKwlbSURMRVNUQVRFX05BTUVdID0gIm5hbWUiLAorfTsKKworCitzdGF0aWMgY2hhciAqc3lzZnNfaWRsZXN0YXRlX2dldF9vbmVfc3RyaW5nKHVuc2lnbmVkIGludCBjcHUsCisJCQkJCXVuc2lnbmVkIGludCBpZGxlc3RhdGUsCisJCQkJCWVudW0gaWRsZXN0YXRlX3N0cmluZyB3aGljaCkKK3sKKwljaGFyIGxpbmVidWZbTUFYX0xJTkVfTEVOXTsKKwljaGFyICpyZXN1bHQ7CisJdW5zaWduZWQgaW50IGxlbjsKKworCWlmICh3aGljaCA+PSBNQVhfSURMRVNUQVRFX1NUUklOR19GSUxFUykKKwkJcmV0dXJuIE5VTEw7CisKKwlsZW4gPSBzeXNmc19pZGxlc3RhdGVfcmVhZF9maWxlKGNwdSwgaWRsZXN0YXRlLAorCQkJCQlpZGxlc3RhdGVfc3RyaW5nX2ZpbGVzW3doaWNoXSwKKwkJCQkJbGluZWJ1Ziwgc2l6ZW9mKGxpbmVidWYpKTsKKwlpZiAobGVuID09IDApCisJCXJldHVybiBOVUxMOworCisJcmVzdWx0ID0gc3RyZHVwKGxpbmVidWYpOworCWlmIChyZXN1bHQgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAocmVzdWx0W3N0cmxlbihyZXN1bHQpIC0gMV0gPT0gJ1xuJykKKwkJcmVzdWx0W3N0cmxlbihyZXN1bHQpIC0gMV0gPSAnXDAnOworCisJcmV0dXJuIHJlc3VsdDsKK30KKwordW5zaWduZWQgbG9uZyBzeXNmc19nZXRfaWRsZXN0YXRlX2xhdGVuY3kodW5zaWduZWQgaW50IGNwdSwKKwkJCQkJdW5zaWduZWQgaW50IGlkbGVzdGF0ZSkKK3sKKwlyZXR1cm4gc3lzZnNfaWRsZXN0YXRlX2dldF9vbmVfdmFsdWUoY3B1LCBpZGxlc3RhdGUsIElETEVTVEFURV9MQVRFTkNZKTsKK30KKwordW5zaWduZWQgbG9uZyBzeXNmc19nZXRfaWRsZXN0YXRlX3VzYWdlKHVuc2lnbmVkIGludCBjcHUsCisJCQkJCXVuc2lnbmVkIGludCBpZGxlc3RhdGUpCit7CisJcmV0dXJuIHN5c2ZzX2lkbGVzdGF0ZV9nZXRfb25lX3ZhbHVlKGNwdSwgaWRsZXN0YXRlLCBJRExFU1RBVEVfVVNBR0UpOworfQorCit1bnNpZ25lZCBsb25nIGxvbmcgc3lzZnNfZ2V0X2lkbGVzdGF0ZV90aW1lKHVuc2lnbmVkIGludCBjcHUsCisJCQkJCXVuc2lnbmVkIGludCBpZGxlc3RhdGUpCit7CisJcmV0dXJuIHN5c2ZzX2lkbGVzdGF0ZV9nZXRfb25lX3ZhbHVlKGNwdSwgaWRsZXN0YXRlLCBJRExFU1RBVEVfVElNRSk7Cit9CisKK2NoYXIgKnN5c2ZzX2dldF9pZGxlc3RhdGVfbmFtZSh1bnNpZ25lZCBpbnQgY3B1LCB1bnNpZ25lZCBpbnQgaWRsZXN0YXRlKQoreworCXJldHVybiBzeXNmc19pZGxlc3RhdGVfZ2V0X29uZV9zdHJpbmcoY3B1LCBpZGxlc3RhdGUsIElETEVTVEFURV9OQU1FKTsKK30KKworY2hhciAqc3lzZnNfZ2V0X2lkbGVzdGF0ZV9kZXNjKHVuc2lnbmVkIGludCBjcHUsIHVuc2lnbmVkIGludCBpZGxlc3RhdGUpCit7CisJcmV0dXJuIHN5c2ZzX2lkbGVzdGF0ZV9nZXRfb25lX3N0cmluZyhjcHUsIGlkbGVzdGF0ZSwgSURMRVNUQVRFX0RFU0MpOworfQorCisvKgorICogUmV0dXJucyBudW1iZXIgb2Ygc3VwcG9ydGVkIEMtc3RhdGVzIG9mIENQVSBjb3JlIGNwdQorICogTmVnYXRpdiBpbiBlcnJvciBjYXNlCisgKiBaZXJvIGlmIGNwdWlkbGUgZG9lcyBub3QgZXhwb3J0IGFueSBDLXN0YXRlcworICovCitpbnQgc3lzZnNfZ2V0X2lkbGVzdGF0ZV9jb3VudCh1bnNpZ25lZCBpbnQgY3B1KQoreworCWNoYXIgZmlsZVtTWVNGU19QQVRIX01BWF07CisJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKwlpbnQgaWRsZXN0YXRlcyA9IDE7CisKKworCXNucHJpbnRmKGZpbGUsIFNZU0ZTX1BBVEhfTUFYLCBQQVRIX1RPX0NQVSAiY3B1aWRsZSIpOworCWlmIChzdGF0KGZpbGUsICZzdGF0YnVmKSAhPSAwIHx8ICFTX0lTRElSKHN0YXRidWYuc3RfbW9kZSkpCisJCXJldHVybiAtRU5PREVWOworCisJc25wcmludGYoZmlsZSwgU1lTRlNfUEFUSF9NQVgsIFBBVEhfVE9fQ1BVICJjcHUldS9jcHVpZGxlL3N0YXRlMCIsIGNwdSk7CisJaWYgKHN0YXQoZmlsZSwgJnN0YXRidWYpICE9IDAgfHwgIVNfSVNESVIoc3RhdGJ1Zi5zdF9tb2RlKSkKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoc3RhdChmaWxlLCAmc3RhdGJ1ZikgPT0gMCAmJiBTX0lTRElSKHN0YXRidWYuc3RfbW9kZSkpIHsKKwkJc25wcmludGYoZmlsZSwgU1lTRlNfUEFUSF9NQVgsIFBBVEhfVE9fQ1BVCisJCQkgImNwdSV1L2NwdWlkbGUvc3RhdGUlZCIsIGNwdSwgaWRsZXN0YXRlcyk7CisJCWlkbGVzdGF0ZXMrKzsKKwl9CisJaWRsZXN0YXRlcy0tOworCXJldHVybiBpZGxlc3RhdGVzOworfQorCisvKiBDUFVpZGxlIGdlbmVyYWwgL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1aWRsZS8gc3lzZnMgYWNjZXNzICoqKioqKioqLworCisvKgorICogaGVscGVyIGZ1bmN0aW9uIHRvIHJlYWQgZmlsZSBmcm9tIC9zeXMgaW50byBnaXZlbiBidWZmZXIKKyAqIGZuYW1lIGlzIGEgcmVsYXRpdmUgcGF0aCB1bmRlciAiY3B1L2NwdWlkbGUvIiBkaXIKKyAqLworc3RhdGljIHVuc2lnbmVkIGludCBzeXNmc19jcHVpZGxlX3JlYWRfZmlsZShjb25zdCBjaGFyICpmbmFtZSwgY2hhciAqYnVmLAorCQkJCQkgICAgc2l6ZV90IGJ1ZmxlbikKK3sKKwljaGFyIHBhdGhbU1lTRlNfUEFUSF9NQVhdOworCisJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCBQQVRIX1RPX0NQVSAiY3B1aWRsZS8lcyIsIGZuYW1lKTsKKworCXJldHVybiBzeXNmc19yZWFkX2ZpbGUocGF0aCwgYnVmLCBidWZsZW4pOworfQorCisKKworLyogcmVhZCBhY2Nlc3MgdG8gZmlsZXMgd2hpY2ggY29udGFpbiBvbmUgc3RyaW5nICovCisKK2VudW0gY3B1aWRsZV9zdHJpbmcgeworCUNQVUlETEVfR09WRVJOT1IsCisJQ1BVSURMRV9HT1ZFUk5PUl9STywKKwlDUFVJRExFX0RSSVZFUiwKKwlNQVhfQ1BVSURMRV9TVFJJTkdfRklMRVMKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpjcHVpZGxlX3N0cmluZ19maWxlc1tNQVhfQ1BVSURMRV9TVFJJTkdfRklMRVNdID0geworCVtDUFVJRExFX0dPVkVSTk9SXQk9ICJjdXJyZW50X2dvdmVybm9yIiwKKwlbQ1BVSURMRV9HT1ZFUk5PUl9ST10JPSAiY3VycmVudF9nb3Zlcm5vcl9ybyIsCisJW0NQVUlETEVfRFJJVkVSXQk9ICJjdXJyZW50X2RyaXZlciIsCit9OworCisKK3N0YXRpYyBjaGFyICpzeXNmc19jcHVpZGxlX2dldF9vbmVfc3RyaW5nKGVudW0gY3B1aWRsZV9zdHJpbmcgd2hpY2gpCit7CisJY2hhciBsaW5lYnVmW01BWF9MSU5FX0xFTl07CisJY2hhciAqcmVzdWx0OworCXVuc2lnbmVkIGludCBsZW47CisKKwlpZiAod2hpY2ggPj0gTUFYX0NQVUlETEVfU1RSSU5HX0ZJTEVTKQorCQlyZXR1cm4gTlVMTDsKKworCWxlbiA9IHN5c2ZzX2NwdWlkbGVfcmVhZF9maWxlKGNwdWlkbGVfc3RyaW5nX2ZpbGVzW3doaWNoXSwKKwkJCQlsaW5lYnVmLCBzaXplb2YobGluZWJ1ZikpOworCWlmIChsZW4gPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXN1bHQgPSBzdHJkdXAobGluZWJ1Zik7CisJaWYgKHJlc3VsdCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChyZXN1bHRbc3RybGVuKHJlc3VsdCkgLSAxXSA9PSAnXG4nKQorCQlyZXN1bHRbc3RybGVuKHJlc3VsdCkgLSAxXSA9ICdcMCc7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitjaGFyICpzeXNmc19nZXRfY3B1aWRsZV9nb3Zlcm5vcih2b2lkKQoreworCWNoYXIgKnRtcCA9IHN5c2ZzX2NwdWlkbGVfZ2V0X29uZV9zdHJpbmcoQ1BVSURMRV9HT1ZFUk5PUl9STyk7CisJaWYgKCF0bXApCisJCXJldHVybiBzeXNmc19jcHVpZGxlX2dldF9vbmVfc3RyaW5nKENQVUlETEVfR09WRVJOT1IpOworCWVsc2UKKwkJcmV0dXJuIHRtcDsKK30KKworY2hhciAqc3lzZnNfZ2V0X2NwdWlkbGVfZHJpdmVyKHZvaWQpCit7CisJcmV0dXJuIHN5c2ZzX2NwdWlkbGVfZ2V0X29uZV9zdHJpbmcoQ1BVSURMRV9EUklWRVIpOworfQorLyogQ1BVaWRsZSBpZGxlc3RhdGUgc3BlY2lmaWMgL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1WC9jcHVpZGxlLyBhY2Nlc3MgKi8KKworLyoKKyAqIEdldCBzY2hlZF9tYyBvciBzY2hlZF9zbXQgc2V0dGluZ3MKKyAqIFBhc3MgIm1jIiBvciAic210IiBhcyBhcmd1bWVudAorICoKKyAqIFJldHVybnMgbmVnYXRpdmUgdmFsdWUgb24gZmFpbHVyZQorICovCitpbnQgc3lzZnNfZ2V0X3NjaGVkKGNvbnN0IGNoYXIgKnNtdF9tYykKK3sKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCWNoYXIgbGluZWJ1ZltNQVhfTElORV9MRU5dOworCWNoYXIgKmVuZHA7CisJY2hhciBwYXRoW1NZU0ZTX1BBVEhfTUFYXTsKKworCWlmIChzdHJjbXAoIm1jIiwgc210X21jKSAmJiBzdHJjbXAoInNtdCIsIHNtdF9tYykpCisJCXJldHVybiAtRUlOVkFMOworCisJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLAorCQlQQVRIX1RPX0NQVSAic2NoZWRfJXNfcG93ZXJfc2F2aW5ncyIsIHNtdF9tYyk7CisJaWYgKHN5c2ZzX3JlYWRfZmlsZShwYXRoLCBsaW5lYnVmLCBNQVhfTElORV9MRU4pID09IDApCisJCXJldHVybiAtMTsKKwl2YWx1ZSA9IHN0cnRvdWwobGluZWJ1ZiwgJmVuZHAsIDApOworCWlmIChlbmRwID09IGxpbmVidWYgfHwgZXJybm8gPT0gRVJBTkdFKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIHZhbHVlOworfQorCisvKgorICogR2V0IHNjaGVkX21jIG9yIHNjaGVkX3NtdCBzZXR0aW5ncworICogUGFzcyAibWMiIG9yICJzbXQiIGFzIGFyZ3VtZW50CisgKgorICogUmV0dXJucyBuZWdhdGl2ZSB2YWx1ZSBvbiBmYWlsdXJlCisgKi8KK2ludCBzeXNmc19zZXRfc2NoZWQoY29uc3QgY2hhciAqc210X21jLCBpbnQgdmFsKQoreworCWNoYXIgbGluZWJ1ZltNQVhfTElORV9MRU5dOworCWNoYXIgcGF0aFtTWVNGU19QQVRIX01BWF07CisJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKworCWlmIChzdHJjbXAoIm1jIiwgc210X21jKSAmJiBzdHJjbXAoInNtdCIsIHNtdF9tYykpCisJCXJldHVybiAtRUlOVkFMOworCisJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLAorCQlQQVRIX1RPX0NQVSAic2NoZWRfJXNfcG93ZXJfc2F2aW5ncyIsIHNtdF9tYyk7CisJc3ByaW50ZihsaW5lYnVmLCAiJWQiLCB2YWwpOworCisJaWYgKHN0YXQocGF0aCwgJnN0YXRidWYpICE9IDApCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHN5c2ZzX3dyaXRlX2ZpbGUocGF0aCwgbGluZWJ1ZiwgTUFYX0xJTkVfTEVOKSA9PSAwKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9oZWxwZXJzL3N5c2ZzLmggYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9oZWxwZXJzL3N5c2ZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkzNzNlMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2hlbHBlcnMvc3lzZnMuaApAQCAtMCwwICsxLDI4IEBACisjaWZuZGVmIF9fQ1BVUE9XRVJfSEVMUEVSU19TWVNGU19IX18KKyNkZWZpbmUgX19DUFVQT1dFUl9IRUxQRVJTX1NZU0ZTX0hfXworCisjZGVmaW5lIFBBVEhfVE9fQ1BVICIvc3lzL2RldmljZXMvc3lzdGVtL2NwdS8iCisjZGVmaW5lIE1BWF9MSU5FX0xFTiAyNTUKKyNkZWZpbmUgU1lTRlNfUEFUSF9NQVggMjU1CisKK2V4dGVybiB1bnNpZ25lZCBpbnQgc3lzZnNfcmVhZF9maWxlKGNvbnN0IGNoYXIgKnBhdGgsIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zmxlbik7CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIHN5c2ZzX2dldF9pZGxlc3RhdGVfbGF0ZW5jeSh1bnNpZ25lZCBpbnQgY3B1LAorCQkJCQkJdW5zaWduZWQgaW50IGlkbGVzdGF0ZSk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBzeXNmc19nZXRfaWRsZXN0YXRlX3VzYWdlKHVuc2lnbmVkIGludCBjcHUsCisJCQkJCXVuc2lnbmVkIGludCBpZGxlc3RhdGUpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyBzeXNmc19nZXRfaWRsZXN0YXRlX3RpbWUodW5zaWduZWQgaW50IGNwdSwKKwkJCQkJCXVuc2lnbmVkIGludCBpZGxlc3RhdGUpOworZXh0ZXJuIGNoYXIgKnN5c2ZzX2dldF9pZGxlc3RhdGVfbmFtZSh1bnNpZ25lZCBpbnQgY3B1LAorCQkJCXVuc2lnbmVkIGludCBpZGxlc3RhdGUpOworZXh0ZXJuIGNoYXIgKnN5c2ZzX2dldF9pZGxlc3RhdGVfZGVzYyh1bnNpZ25lZCBpbnQgY3B1LAorCQkJCXVuc2lnbmVkIGludCBpZGxlc3RhdGUpOworZXh0ZXJuIGludCBzeXNmc19nZXRfaWRsZXN0YXRlX2NvdW50KHVuc2lnbmVkIGludCBjcHUpOworCitleHRlcm4gY2hhciAqc3lzZnNfZ2V0X2NwdWlkbGVfZ292ZXJub3Iodm9pZCk7CitleHRlcm4gY2hhciAqc3lzZnNfZ2V0X2NwdWlkbGVfZHJpdmVyKHZvaWQpOworCitleHRlcm4gaW50IHN5c2ZzX2dldF9zY2hlZChjb25zdCBjaGFyICpzbXRfbWMpOworZXh0ZXJuIGludCBzeXNmc19zZXRfc2NoZWQoY29uc3QgY2hhciAqc210X21jLCBpbnQgdmFsKTsKKworI2VuZGlmIC8qIF9fQ1BVUE9XRVJfSEVMUEVSU19TWVNGU19IX18gKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2hlbHBlcnMvdG9wb2xvZ3kuYyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2hlbHBlcnMvdG9wb2xvZ3kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODVlZTVjCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaGVscGVycy90b3BvbG9neS5jCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogIChDKSAyMDEwLDIwMTEgICAgICAgVGhvbWFzIFJlbm5pbmdlciA8dHJlbm5Ac3VzZS5kZT4sIE5vdmVsbCBJbmMuCisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMi4KKyAqCisgKiBUb0RvOiBOZWVkcyB0byBiZSBkb25lIG1vcmUgcHJvcGVybHkgZm9yIEFNRC9JbnRlbCBzcGVjaWZpY3MKKyAqLworCisvKiBIZWxwZXIgc3RydWN0IGZvciBxc29ydCwgbXVzdCBiZSBpbiBzeW5jIHdpdGggY3B1cG93ZXJfdG9wb2xvZ3kuY3B1X2luZm8gKi8KKy8qIEJlIGNhcmVmdWw6IE5lZWQgdG8gcGFzcyB1bnNpZ25lZCB0byB0aGUgc29ydCwgc28gdGhhdCBvZmZsaW5lZCBjb3JlcyBhcmUKKyAgIGluIHRoZSBlbmQsIGJ1dCBkb3VibGUgY2hlY2sgZm9yIC0xIGZvciBvZmZsaW5lZCBjcHVzIGF0IG90aGVyIHBsYWNlcyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlIDxoZWxwZXJzL2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxoZWxwZXJzL3N5c2ZzLmg+CisKKy8qIHJldHVybnMgLTEgb24gZmFpbHVyZSwgMCBvbiBzdWNjZXNzICovCitpbnQgc3lzZnNfdG9wb2xvZ3lfcmVhZF9maWxlKHVuc2lnbmVkIGludCBjcHUsIGNvbnN0IGNoYXIgKmZuYW1lKQoreworCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisJY2hhciBsaW5lYnVmW01BWF9MSU5FX0xFTl07CisJY2hhciAqZW5kcDsKKwljaGFyIHBhdGhbU1lTRlNfUEFUSF9NQVhdOworCisJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCBQQVRIX1RPX0NQVSAiY3B1JXUvdG9wb2xvZ3kvJXMiLAorCQkJIGNwdSwgZm5hbWUpOworCWlmIChzeXNmc19yZWFkX2ZpbGUocGF0aCwgbGluZWJ1ZiwgTUFYX0xJTkVfTEVOKSA9PSAwKQorCQlyZXR1cm4gLTE7CisJdmFsdWUgPSBzdHJ0b3VsKGxpbmVidWYsICZlbmRwLCAwKTsKKwlpZiAoZW5kcCA9PSBsaW5lYnVmIHx8IGVycm5vID09IEVSQU5HRSkKKwkJcmV0dXJuIC0xOworCXJldHVybiB2YWx1ZTsKK30KKworc3RydWN0IGNwdWlkX2NvcmVfaW5mbyB7CisJdW5zaWduZWQgaW50IHBrZzsKKwl1bnNpZ25lZCBpbnQgdGhyZWFkOworCXVuc2lnbmVkIGludCBjcHU7Cit9OworCitzdGF0aWMgaW50IF9fY29tcGFyZShjb25zdCB2b2lkICp0MSwgY29uc3Qgdm9pZCAqdDIpCit7CisJc3RydWN0IGNwdWlkX2NvcmVfaW5mbyAqdG9wMSA9IChzdHJ1Y3QgY3B1aWRfY29yZV9pbmZvICopdDE7CisJc3RydWN0IGNwdWlkX2NvcmVfaW5mbyAqdG9wMiA9IChzdHJ1Y3QgY3B1aWRfY29yZV9pbmZvICopdDI7CisJaWYgKHRvcDEtPnBrZyA8IHRvcDItPnBrZykKKwkJcmV0dXJuIC0xOworCWVsc2UgaWYgKHRvcDEtPnBrZyA+IHRvcDItPnBrZykKKwkJcmV0dXJuIDE7CisJZWxzZSBpZiAodG9wMS0+dGhyZWFkIDwgdG9wMi0+dGhyZWFkKQorCQlyZXR1cm4gLTE7CisJZWxzZSBpZiAodG9wMS0+dGhyZWFkID4gdG9wMi0+dGhyZWFkKQorCQlyZXR1cm4gMTsKKwllbHNlIGlmICh0b3AxLT5jcHUgPCB0b3AyLT5jcHUpCisJCXJldHVybiAtMTsKKwllbHNlIGlmICh0b3AxLT5jcHUgPiB0b3AyLT5jcHUpCisJCXJldHVybiAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXR1cm5zIGFtb3VudCBvZiBjcHVzLCBuZWdhdGl2ZSBvbiBlcnJvciwgY3B1X3RvcCBtdXN0IGJlCisgKiBwYXNzZWQgdG8gY3B1X3RvcG9sb2d5X3JlbGVhc2UgdG8gZnJlZSByZXNvdXJjZXMKKyAqCisgKiBBcnJheSBpcyBzb3J0ZWQgYWZ0ZXIgLT5wa2csIC0+Y29yZSwgdGhlbiAtPmNwdQorICovCitpbnQgZ2V0X2NwdV90b3BvbG9neShzdHJ1Y3QgY3B1cG93ZXJfdG9wb2xvZ3kgKmNwdV90b3ApCit7CisJaW50IGNwdSwgY3B1cyA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX0NPTkYpOworCisJY3B1X3RvcC0+Y29yZV9pbmZvID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgY3B1cG93ZXJfdG9wb2xvZ3kpICogY3B1cyk7CisJaWYgKGNwdV90b3AtPmNvcmVfaW5mbyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwljcHVfdG9wLT5wa2dzID0gY3B1X3RvcC0+Y29yZXMgPSAwOworCWZvciAoY3B1ID0gMDsgY3B1IDwgY3B1czsgY3B1KyspIHsKKwkJY3B1X3RvcC0+Y29yZV9pbmZvW2NwdV0ucGtnID0KKwkJCXN5c2ZzX3RvcG9sb2d5X3JlYWRfZmlsZShjcHUsICJwaHlzaWNhbF9wYWNrYWdlX2lkIik7CisJCWlmICgoaW50KWNwdV90b3AtPmNvcmVfaW5mb1tjcHVdLnBrZyAhPSAtMSAmJgorCQkgICAgY3B1X3RvcC0+Y29yZV9pbmZvW2NwdV0ucGtnID4gY3B1X3RvcC0+cGtncykKKwkJCWNwdV90b3AtPnBrZ3MgPSBjcHVfdG9wLT5jb3JlX2luZm9bY3B1XS5wa2c7CisJCWNwdV90b3AtPmNvcmVfaW5mb1tjcHVdLmNvcmUgPQorCQkJc3lzZnNfdG9wb2xvZ3lfcmVhZF9maWxlKGNwdSwgImNvcmVfaWQiKTsKKwkJY3B1X3RvcC0+Y29yZV9pbmZvW2NwdV0uY3B1ID0gY3B1OworCX0KKwljcHVfdG9wLT5wa2dzKys7CisKKwlxc29ydChjcHVfdG9wLT5jb3JlX2luZm8sIGNwdXMsIHNpemVvZihzdHJ1Y3QgY3B1aWRfY29yZV9pbmZvKSwKKwkgICAgICBfX2NvbXBhcmUpOworCisJLyogSW50ZWwncyBjb3JlcyBjb3VudCBpcyBub3QgY29uc2VjdXRpdmVseSBudW1iZXJlZCwgdGhlcmUgbWF5CisJICogYmUgYSBjb3JlX2lkIG9mIDMsIGJ1dCBub25lIG9mIDIuIEFzc3VtZSB0aGVyZSBhbHdheXMgaXMgMAorCSAqIEdldCBhbW91bnQgb2YgY29yZXMgYnkgY291bnRpbmcgZHVwbGljYXRlcyBpbiBhIHBhY2thZ2UKKwlmb3IgKGNwdSA9IDA7IGNwdV90b3AtPmNvcmVfaW5mb1tjcHVdLnBrZyA9IDAgJiYgY3B1IDwgY3B1czsgY3B1KyspIHsKKwkJaWYgKGNwdV90b3AtPmNvcmVfaW5mb1tjcHVdLmNvcmUgPT0gMCkKKwljcHVfdG9wLT5jb3JlcysrOworCSovCisJcmV0dXJuIGNwdXM7Cit9CisKK3ZvaWQgY3B1X3RvcG9sb2d5X3JlbGVhc2Uoc3RydWN0IGNwdXBvd2VyX3RvcG9sb2d5IGNwdV90b3ApCit7CisJZnJlZShjcHVfdG9wLmNvcmVfaW5mbyk7Cit9CmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9pZGxlX21vbml0b3IvYW1kX2ZhbTE0aF9pZGxlLmMgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9pZGxlX21vbml0b3IvYW1kX2ZhbTE0aF9pZGxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAyZTU1NQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2lkbGVfbW9uaXRvci9hbWRfZmFtMTRoX2lkbGUuYwpAQCAtMCwwICsxLDMzOCBAQAorLyoKKyAqICAoQykgMjAxMCwyMDExICAgICAgVGhvbWFzIFJlbm5pbmdlciA8dHJlbm5Ac3VzZS5kZT4sIE5vdmVsbCBJbmMuCisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMi4KKyAqCisgKiAgUENJIGluaXRpYWxpemF0aW9uIGJhc2VkIG9uIGV4YW1wbGUgY29kZSBmcm9tOgorICogIEFuZHJlYXMgSGVycm1hbm4gPGFuZHJlYXMuaGVycm1hbm4zQGFtZC5jb20+CisgKi8KKworI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8cGNpL3BjaS5oPgorCisjaW5jbHVkZSAiaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuaCIKKyNpbmNsdWRlICJoZWxwZXJzL2hlbHBlcnMuaCIKKworLyoqKioqKioqIFBDSSBwYXJ0cyBjb3VsZCBnbyBpbnRvIG93biBmaWxlIGFuZCBnZXQgc2hhcmVkICoqKioqKioqKioqKioqKi8KKworI2RlZmluZSBQQ0lfTk9OX1BDMF9PRkZTRVQJMHhiMAorI2RlZmluZSBQQ0lfUEMxX09GRlNFVAkJMHhiNAorI2RlZmluZSBQQ0lfUEM2X09GRlNFVAkJMHhiOAorCisjZGVmaW5lIFBDSV9NT05JVE9SX0VOQUJMRV9SRUcgIDB4ZTAKKworI2RlZmluZSBQQ0lfTk9OX1BDMF9FTkFCTEVfQklUCTAKKyNkZWZpbmUgUENJX1BDMV9FTkFCTEVfQklUCTEKKyNkZWZpbmUgUENJX1BDNl9FTkFCTEVfQklUCTIKKworI2RlZmluZSBQQ0lfTkJQMV9TVEFUX09GRlNFVAkweDk4CisjZGVmaW5lIFBDSV9OQlAxX0FDVElWRV9CSVQJMgorI2RlZmluZSBQQ0lfTkJQMV9FTlRFUkVEX0JJVAkxCisKKyNkZWZpbmUgUENJX05CUDFfQ0FQX09GRlNFVAkweDkwCisjZGVmaW5lIFBDSV9OQlAxX0NBUEFCTEVfQklUICAgIDMxCisKKyNkZWZpbmUgT1ZFUkZMT1dfTVMJCTM0MzU5NyAvKiAzMiBiaXQgcmVnaXN0ZXIgZmlsbGVkIGF0IDEyNTAwIEhaCisJCQkJCSAgKDEgdGljayBwZXIgODBucykgKi8KKworZW51bSBhbWRfZmFtMTRoX3N0YXRlcyB7Tk9OX1BDMCA9IDAsIFBDMSwgUEM2LCBOQlAxLAorCQkJQU1EX0ZBTTE0SF9TVEFURV9OVU19OworCitzdGF0aWMgaW50IGZhbTE0aF9nZXRfY291bnRfcGVyY2VudCh1bnNpZ25lZCBpbnQgc2VsZl9pZCwgZG91YmxlICpwZXJjZW50LAorCQkJCSAgICB1bnNpZ25lZCBpbnQgY3B1KTsKK3N0YXRpYyBpbnQgZmFtMTRoX25icDFfY291bnQodW5zaWduZWQgaW50IGlkLCB1bnNpZ25lZCBsb25nIGxvbmcgKmNvdW50LAorCQkJICAgICB1bnNpZ25lZCBpbnQgY3B1KTsKKworc3RhdGljIGNzdGF0ZV90IGFtZF9mYW0xNGhfY3N0YXRlc1tBTURfRkFNMTRIX1NUQVRFX05VTV0gPSB7CisJeworCQkubmFtZQkJCT0gIiFQQzAiLAorCQkuZGVzYwkJCT0gTl8oIlBhY2thZ2UgaW4gc2xlZXAgc3RhdGUgKFBDMSBvciBkZWVwZXIpIiksCisJCS5pZAkJCT0gTk9OX1BDMCwKKwkJLnJhbmdlCQkJPSBSQU5HRV9QQUNLQUdFLAorCQkuZ2V0X2NvdW50X3BlcmNlbnQJPSBmYW0xNGhfZ2V0X2NvdW50X3BlcmNlbnQsCisJfSwKKwl7CisJCS5uYW1lCQkJPSAiUEMxIiwKKwkJLmRlc2MJCQk9IE5fKCJQcm9jZXNzb3IgUGFja2FnZSBDMSIpLAorCQkuaWQJCQk9IFBDMSwKKwkJLnJhbmdlCQkJPSBSQU5HRV9QQUNLQUdFLAorCQkuZ2V0X2NvdW50X3BlcmNlbnQJPSBmYW0xNGhfZ2V0X2NvdW50X3BlcmNlbnQsCisJfSwKKwl7CisJCS5uYW1lCQkJPSAiUEM2IiwKKwkJLmRlc2MJCQk9IE5fKCJQcm9jZXNzb3IgUGFja2FnZSBDNiIpLAorCQkuaWQJCQk9IFBDNiwKKwkJLnJhbmdlCQkJPSBSQU5HRV9QQUNLQUdFLAorCQkuZ2V0X2NvdW50X3BlcmNlbnQJPSBmYW0xNGhfZ2V0X2NvdW50X3BlcmNlbnQsCisJfSwKKwl7CisJCS5uYW1lCQkJPSAiTkJQMSIsCisJCS5kZXNjCQkJPSBOXygiTm9ydGggQnJpZGdlIFAxIGJvb2xlYW4gY291bnRlciAocmV0dXJucyAwIG9yIDEpIiksCisJCS5pZAkJCT0gTkJQMSwKKwkJLnJhbmdlCQkJPSBSQU5HRV9QQUNLQUdFLAorCQkuZ2V0X2NvdW50CQk9IGZhbTE0aF9uYnAxX2NvdW50LAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9hY2Nlc3MgKnBjaV9hY2M7CitzdGF0aWMgaW50IHBjaV92ZW5kb3JfaWQgPSAweDEwMjI7CitzdGF0aWMgaW50IHBjaV9kZXZfaWRzWzJdID0gezB4MTcxNiwgMH07CitzdGF0aWMgc3RydWN0IHBjaV9kZXYgKmFtZF9mYW0xNGhfcGNpX2RldjsKKworc3RhdGljIGludCBuYnAxX2VudGVyZWQ7CisKK3N0cnVjdCB0aW1lc3BlYyBzdGFydF90aW1lOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lZGlmZjsKKworI2lmZGVmIERFQlVHCitzdHJ1Y3QgdGltZXNwZWMgZGJnX3RpbWU7Citsb25nIGRiZ190aW1lZGlmZjsKKyNlbmRpZgorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nICpwcmV2aW91c19jb3VudFtBTURfRkFNMTRIX1NUQVRFX05VTV07CitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nICpjdXJyZW50X2NvdW50W0FNRF9GQU0xNEhfU1RBVEVfTlVNXTsKKworc3RhdGljIGludCBhbWRfZmFtMTRoX2dldF9wY2lfaW5mbyhzdHJ1Y3QgY3N0YXRlICpzdGF0ZSwKKwkJCQkgICB1bnNpZ25lZCBpbnQgKnBjaV9vZmZzZXQsCisJCQkJICAgdW5zaWduZWQgaW50ICplbmFibGVfYml0LAorCQkJCSAgIHVuc2lnbmVkIGludCBjcHUpCit7CisJc3dpdGNoIChzdGF0ZS0+aWQpIHsKKwljYXNlIE5PTl9QQzA6CisJCSplbmFibGVfYml0ID0gUENJX05PTl9QQzBfRU5BQkxFX0JJVDsKKwkJKnBjaV9vZmZzZXQgPSBQQ0lfTk9OX1BDMF9PRkZTRVQ7CisJCWJyZWFrOworCWNhc2UgUEMxOgorCQkqZW5hYmxlX2JpdCA9IFBDSV9QQzFfRU5BQkxFX0JJVDsKKwkJKnBjaV9vZmZzZXQgPSBQQ0lfUEMxX09GRlNFVDsKKwkJYnJlYWs7CisJY2FzZSBQQzY6CisJCSplbmFibGVfYml0ID0gUENJX1BDNl9FTkFCTEVfQklUOworCQkqcGNpX29mZnNldCA9IFBDSV9QQzZfT0ZGU0VUOworCQlicmVhazsKKwljYXNlIE5CUDE6CisJCSplbmFibGVfYml0ID0gUENJX05CUDFfRU5URVJFRF9CSVQ7CisJCSpwY2lfb2Zmc2V0ID0gUENJX05CUDFfU1RBVF9PRkZTRVQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtMTsKKwl9OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtZF9mYW0xNGhfaW5pdChjc3RhdGVfdCAqc3RhdGUsIHVuc2lnbmVkIGludCBjcHUpCit7CisJaW50IGVuYWJsZV9iaXQsIHBjaV9vZmZzZXQsIHJldDsKKwl1aW50MzJfdCB2YWw7CisKKwlyZXQgPSBhbWRfZmFtMTRoX2dldF9wY2lfaW5mbyhzdGF0ZSwgJnBjaV9vZmZzZXQsICZlbmFibGVfYml0LCBjcHUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBOQlAxIG5lZWRzIGV4dHJhIHRyZWF0aW5nIC0+IHdyaXRlIDEgdG8gRDE4RjZ4OTggYml0IDEgZm9yIGluaXQgKi8KKwlpZiAoc3RhdGUtPmlkID09IE5CUDEpIHsKKwkJdmFsID0gcGNpX3JlYWRfbG9uZyhhbWRfZmFtMTRoX3BjaV9kZXYsIHBjaV9vZmZzZXQpOworCQl2YWwgfD0gMSA8PCBlbmFibGVfYml0OworCQl2YWwgPSBwY2lfd3JpdGVfbG9uZyhhbWRfZmFtMTRoX3BjaV9kZXYsIHBjaV9vZmZzZXQsIHZhbCk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogRW5hYmxlIG1vbml0b3IgKi8KKwl2YWwgPSBwY2lfcmVhZF9sb25nKGFtZF9mYW0xNGhfcGNpX2RldiwgUENJX01PTklUT1JfRU5BQkxFX1JFRyk7CisJZHByaW50KCJJbml0ICVzOiByZWFkIGF0IG9mZnNldDogMHgleCB2YWw6ICV1XG4iLCBzdGF0ZS0+bmFtZSwKKwkgICAgICAgUENJX01PTklUT1JfRU5BQkxFX1JFRywgKHVuc2lnbmVkIGludCkgdmFsKTsKKwl2YWwgfD0gMSA8PCBlbmFibGVfYml0OworCXBjaV93cml0ZV9sb25nKGFtZF9mYW0xNGhfcGNpX2RldiwgUENJX01PTklUT1JfRU5BQkxFX1JFRywgdmFsKTsKKworCWRwcmludCgiSW5pdCAlczogb2Zmc2V0OiAweCV4IGVuYWJsZV9iaXQ6ICVkIC0gdmFsOiAldSAoJXUpXG4iLAorCSAgICAgICBzdGF0ZS0+bmFtZSwgUENJX01PTklUT1JfRU5BQkxFX1JFRywgZW5hYmxlX2JpdCwKKwkgICAgICAgKHVuc2lnbmVkIGludCkgdmFsLCBjcHUpOworCisJLyogU2V0IGNvdW50ZXIgdG8gemVybyAqLworCXBjaV93cml0ZV9sb25nKGFtZF9mYW0xNGhfcGNpX2RldiwgcGNpX29mZnNldCwgMCk7CisJcHJldmlvdXNfY291bnRbc3RhdGUtPmlkXVtjcHVdID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtZF9mYW0xNGhfZGlzYWJsZShjc3RhdGVfdCAqc3RhdGUsIHVuc2lnbmVkIGludCBjcHUpCit7CisJaW50IGVuYWJsZV9iaXQsIHBjaV9vZmZzZXQsIHJldDsKKwl1aW50MzJfdCB2YWw7CisKKwlyZXQgPSBhbWRfZmFtMTRoX2dldF9wY2lfaW5mbyhzdGF0ZSwgJnBjaV9vZmZzZXQsICZlbmFibGVfYml0LCBjcHUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwl2YWwgPSBwY2lfcmVhZF9sb25nKGFtZF9mYW0xNGhfcGNpX2RldiwgcGNpX29mZnNldCk7CisJZHByaW50KCIlczogb2Zmc2V0OiAweCV4ICV1XG4iLCBzdGF0ZS0+bmFtZSwgcGNpX29mZnNldCwgdmFsKTsKKwlpZiAoc3RhdGUtPmlkID09IE5CUDEpIHsKKwkJLyogd2FzIHRoZSBiaXQgd2hldGhlciBOQlAxIGdvdCBlbnRlcmVkIHNldD8gKi8KKwkJbmJwMV9lbnRlcmVkID0gKHZhbCAmICgxIDw8IFBDSV9OQlAxX0FDVElWRV9CSVQpKSB8CisJCQkodmFsICYgKDEgPDwgUENJX05CUDFfRU5URVJFRF9CSVQpKTsKKworCQlkcHJpbnQoIk5CUDEgd2FzICVzZW50ZXJlZCAtIDB4JXggLSBlbmFibGVfYml0OiAiCisJCSAgICAgICAiJWQgLSBwY2lfb2Zmc2V0OiAweCV4XG4iLAorCQkgICAgICAgbmJwMV9lbnRlcmVkID8gIiIgOiAibm90ICIsCisJCSAgICAgICB2YWwsIGVuYWJsZV9iaXQsIHBjaV9vZmZzZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwljdXJyZW50X2NvdW50W3N0YXRlLT5pZF1bY3B1XSA9IHZhbDsKKworCWRwcmludCgiJXM6IEN1cnJlbnQgLSAgJWxsdSAoJXUpXG4iLCBzdGF0ZS0+bmFtZSwKKwkgICAgICAgY3VycmVudF9jb3VudFtzdGF0ZS0+aWRdW2NwdV0sIGNwdSk7CisJZHByaW50KCIlczogUHJldmlvdXMgLSAlbGx1ICgldSlcbiIsIHN0YXRlLT5uYW1lLAorCSAgICAgICBwcmV2aW91c19jb3VudFtzdGF0ZS0+aWRdW2NwdV0sIGNwdSk7CisKKwl2YWwgPSBwY2lfcmVhZF9sb25nKGFtZF9mYW0xNGhfcGNpX2RldiwgUENJX01PTklUT1JfRU5BQkxFX1JFRyk7CisJdmFsICY9IH4oMSA8PCBlbmFibGVfYml0KTsKKwlwY2lfd3JpdGVfbG9uZyhhbWRfZmFtMTRoX3BjaV9kZXYsIFBDSV9NT05JVE9SX0VOQUJMRV9SRUcsIHZhbCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmYW0xNGhfbmJwMV9jb3VudCh1bnNpZ25lZCBpbnQgaWQsIHVuc2lnbmVkIGxvbmcgbG9uZyAqY291bnQsCisJCQkgICAgIHVuc2lnbmVkIGludCBjcHUpCit7CisJaWYgKGlkID09IE5CUDEpIHsKKwkJaWYgKG5icDFfZW50ZXJlZCkKKwkJCSpjb3VudCA9IDE7CisJCWVsc2UKKwkJCSpjb3VudCA9IDA7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLTE7Cit9CitzdGF0aWMgaW50IGZhbTE0aF9nZXRfY291bnRfcGVyY2VudCh1bnNpZ25lZCBpbnQgaWQsIGRvdWJsZSAqcGVyY2VudCwKKwkJCQkgICAgdW5zaWduZWQgaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIGRpZmY7CisKKwlpZiAoaWQgPj0gQU1EX0ZBTTE0SF9TVEFURV9OVU0pCisJCXJldHVybiAtMTsKKwkvKiByZXNpZGVuY3kgY291bnQgaW4gODBucyAtPiBkaXZpZGUgdGhyb3VnaCAxMi41IHRvIGdldCB1cyByZXNpZGVuY3kgKi8KKwlkaWZmID0gY3VycmVudF9jb3VudFtpZF1bY3B1XSAtIHByZXZpb3VzX2NvdW50W2lkXVtjcHVdOworCisJaWYgKHRpbWVkaWZmID09IDApCisJCSpwZXJjZW50ID0gMC4wOworCWVsc2UKKwkJKnBlcmNlbnQgPSAxMDAuMCAqIGRpZmYgLyB0aW1lZGlmZiAvIDEyLjU7CisKKwlkcHJpbnQoIlRpbWVkaWZmOiAlbGx1IC0gcmVzfjogJWx1IHVzIC0gcGVyY2VudDogJS4yZiAlJVxuIiwKKwkgICAgICAgdGltZWRpZmYsIGRpZmYgKiAxMCAvIDEyNSwgKnBlcmNlbnQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1kX2ZhbTE0aF9zdGFydCh2b2lkKQoreworCWludCBudW0sIGNwdTsKKwljbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmc3RhcnRfdGltZSk7CisJZm9yIChudW0gPSAwOyBudW0gPCBBTURfRkFNMTRIX1NUQVRFX05VTTsgbnVtKyspIHsKKwkJZm9yIChjcHUgPSAwOyBjcHUgPCBjcHVfY291bnQ7IGNwdSsrKQorCQkJYW1kX2ZhbTE0aF9pbml0KCZhbWRfZmFtMTRoX2NzdGF0ZXNbbnVtXSwgY3B1KTsKKwl9CisjaWZkZWYgREVCVUcKKwljbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmZGJnX3RpbWUpOworCWRiZ190aW1lZGlmZiA9IHRpbWVzcGVjX2RpZmZfdXMoc3RhcnRfdGltZSwgZGJnX3RpbWUpOworCWRwcmludCgiRW5hYmxpbmcgY291bnRlcnMgdG9vazogJWx1IHVzXG4iLAorCSAgICAgICBkYmdfdGltZWRpZmYpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1kX2ZhbTE0aF9zdG9wKHZvaWQpCit7CisJaW50IG51bSwgY3B1OworCXN0cnVjdCB0aW1lc3BlYyBlbmRfdGltZTsKKworCWNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZlbmRfdGltZSk7CisKKwlmb3IgKG51bSA9IDA7IG51bSA8IEFNRF9GQU0xNEhfU1RBVEVfTlVNOyBudW0rKykgeworCQlmb3IgKGNwdSA9IDA7IGNwdSA8IGNwdV9jb3VudDsgY3B1KyspCisJCQlhbWRfZmFtMTRoX2Rpc2FibGUoJmFtZF9mYW0xNGhfY3N0YXRlc1tudW1dLCBjcHUpOworCX0KKyNpZmRlZiBERUJVRworCWNsb2NrX2dldHRpbWUoQ0xPQ0tfUkVBTFRJTUUsICZkYmdfdGltZSk7CisJZGJnX3RpbWVkaWZmID0gdGltZXNwZWNfZGlmZl91cyhlbmRfdGltZSwgZGJnX3RpbWUpOworCWRwcmludCgiRGlzYWJsaW5nIGNvdW50ZXJzIHRvb2s6ICVsdSBuc1xuIiwgZGJnX3RpbWVkaWZmKTsKKyNlbmRpZgorCXRpbWVkaWZmID0gdGltZXNwZWNfZGlmZl91cyhzdGFydF90aW1lLCBlbmRfdGltZSk7CisJaWYgKHRpbWVkaWZmIC8gMTAwMCA+IE9WRVJGTE9XX01TKQorCQlwcmludF9vdmVyZmxvd19lcnIoKHVuc2lnbmVkIGludCl0aW1lZGlmZiAvIDEwMDAwMDAsCisJCQkJICAgT1ZFUkZMT1dfTVMgLyAxMDAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlzX25icDFfY2FwYWJsZSh2b2lkKQoreworCXVpbnQzMl90IHZhbDsKKwl2YWwgPSBwY2lfcmVhZF9sb25nKGFtZF9mYW0xNGhfcGNpX2RldiwgUENJX05CUDFfQ0FQX09GRlNFVCk7CisJcmV0dXJuIHZhbCAmICgxIDw8IDMxKTsKK30KKworc3RydWN0IGNwdWlkbGVfbW9uaXRvciAqYW1kX2ZhbTE0aF9yZWdpc3Rlcih2b2lkKQoreworCWludCBudW07CisKKwlpZiAoY3B1cG93ZXJfY3B1X2luZm8udmVuZG9yICE9IFg4Nl9WRU5ET1JfQU1EKQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChjcHVwb3dlcl9jcHVfaW5mby5mYW1pbHkgPT0gMHgxNCkgeworCQlpZiAoY3B1X2NvdW50IDw9IDAgfHwgY3B1X2NvdW50ID4gMikgeworCQkJZnByaW50ZihzdGRlcnIsICJBTUQgZmFtMTRoOiBJbnZhbGlkIGNwdSBjb3VudDogJWRcbiIsCisJCQkJY3B1X2NvdW50KTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfSBlbHNlCisJCXJldHVybiBOVUxMOworCisJLyogV2UgZG8gbm90IGFsbG9jIGZvciBuYnAxIG1hY2hpbmUgd2lkZSBjb3VudGVyICovCisJZm9yIChudW0gPSAwOyBudW0gPCBBTURfRkFNMTRIX1NUQVRFX05VTSAtIDE7IG51bSsrKSB7CisJCXByZXZpb3VzX2NvdW50W251bV0gPSBjYWxsb2MoY3B1X2NvdW50LAorCQkJCQkgICAgICBzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSk7CisJCWN1cnJlbnRfY291bnRbbnVtXSAgPSBjYWxsb2MoY3B1X2NvdW50LAorCQkJCQkgICAgICBzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSk7CisJfQorCisJYW1kX2ZhbTE0aF9wY2lfZGV2ID0gcGNpX2FjY19pbml0KCZwY2lfYWNjLCBwY2lfdmVuZG9yX2lkLCBwY2lfZGV2X2lkcyk7CisJaWYgKGFtZF9mYW0xNGhfcGNpX2RldiA9PSBOVUxMIHx8IHBjaV9hY2MgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIWlzX25icDFfY2FwYWJsZSgpKQorCQlhbWRfZmFtMTRoX21vbml0b3IuaHdfc3RhdGVzX251bSA9IEFNRF9GQU0xNEhfU1RBVEVfTlVNIC0gMTsKKworCWFtZF9mYW0xNGhfbW9uaXRvci5uYW1lX2xlbiA9IHN0cmxlbihhbWRfZmFtMTRoX21vbml0b3IubmFtZSk7CisJcmV0dXJuICZhbWRfZmFtMTRoX21vbml0b3I7Cit9CisKK3N0YXRpYyB2b2lkIGFtZF9mYW0xNGhfdW5yZWdpc3Rlcih2b2lkKQoreworCWludCBudW07CisJZm9yIChudW0gPSAwOyBudW0gPCBBTURfRkFNMTRIX1NUQVRFX05VTSAtIDE7IG51bSsrKSB7CisJCWZyZWUocHJldmlvdXNfY291bnRbbnVtXSk7CisJCWZyZWUoY3VycmVudF9jb3VudFtudW1dKTsKKwl9CisJcGNpX2NsZWFudXAocGNpX2FjYyk7Cit9CisKK3N0cnVjdCBjcHVpZGxlX21vbml0b3IgYW1kX2ZhbTE0aF9tb25pdG9yID0geworCS5uYW1lCQkJPSAiT250YXJpbyIsCisJLmh3X3N0YXRlcwkJPSBhbWRfZmFtMTRoX2NzdGF0ZXMsCisJLmh3X3N0YXRlc19udW0JCT0gQU1EX0ZBTTE0SF9TVEFURV9OVU0sCisJLnN0YXJ0CQkJPSBhbWRfZmFtMTRoX3N0YXJ0LAorCS5zdG9wCQkJPSBhbWRfZmFtMTRoX3N0b3AsCisJLmRvX3JlZ2lzdGVyCQk9IGFtZF9mYW0xNGhfcmVnaXN0ZXIsCisJLnVucmVnaXN0ZXIJCT0gYW1kX2ZhbTE0aF91bnJlZ2lzdGVyLAorCS5uZWVkc19yb290CQk9IDEsCisJLm92ZXJmbG93X3MJCT0gT1ZFUkZMT1dfTVMgLyAxMDAwLAorfTsKKyNlbmRpZiAvKiAjaWYgZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaWRsZV9tb25pdG9yL2NwdWlkbGVfc3lzZnMuYyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2lkbGVfbW9uaXRvci9jcHVpZGxlX3N5c2ZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA0OGI5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2lkbGVfbW9uaXRvci9jcHVpZGxlX3N5c2ZzLmMKQEAgLTAsMCArMSwxOTYgQEAKKy8qCisgKiAgKEMpIDIwMTAsMjAxMSAgICAgICBUaG9tYXMgUmVubmluZ2VyIDx0cmVubkBzdXNlLmRlPiwgTm92ZWxsIEluYworICoKKyAqICBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgTGljZW5zZSB2ZXJzaW9uIDIuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSAiaGVscGVycy9zeXNmcy5oIgorI2luY2x1ZGUgImhlbHBlcnMvaGVscGVycy5oIgorI2luY2x1ZGUgImlkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmgiCisKKyNkZWZpbmUgQ1BVSURMRV9TVEFURVNfTUFYIDEwCitzdGF0aWMgY3N0YXRlX3QgY3B1aWRsZV9jc3RhdGVzW0NQVUlETEVfU1RBVEVTX01BWF07CitzdHJ1Y3QgY3B1aWRsZV9tb25pdG9yIGNwdWlkbGVfc3lzZnNfbW9uaXRvcjsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyAqKnByZXZpb3VzX2NvdW50Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyAqKmN1cnJlbnRfY291bnQ7CitzdHJ1Y3QgdGltZXNwZWMgc3RhcnRfdGltZTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgdGltZWRpZmY7CisKK3N0YXRpYyBpbnQgY3B1aWRsZV9nZXRfY291bnRfcGVyY2VudCh1bnNpZ25lZCBpbnQgaWQsIGRvdWJsZSAqcGVyY2VudCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBjcHUpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHN0YXRlZGlmZiA9IGN1cnJlbnRfY291bnRbY3B1XVtpZF0KKwkJLSBwcmV2aW91c19jb3VudFtjcHVdW2lkXTsKKwlkcHJpbnQoIiVzOiAtIGRpZmY6ICVsbHUgLSBwZXJjZW50OiAlZiAoJXUpXG4iLAorCSAgICAgICBjcHVpZGxlX2NzdGF0ZXNbaWRdLm5hbWUsIHRpbWVkaWZmLCAqcGVyY2VudCwgY3B1KTsKKworCWlmICh0aW1lZGlmZiA9PSAwKQorCQkqcGVyY2VudCA9IDAuMDsKKwllbHNlCisJCSpwZXJjZW50ID0gKCgxMDAuMCAqIHN0YXRlZGlmZikgLyB0aW1lZGlmZik7CisKKwlkcHJpbnQoIiVzOiAtIHRpbWVkaWZmOiAlbGx1IC0gc3RhdGVkaWZmOiAlbGx1IC0gcGVyY2VudDogJWYgKCV1KVxuIiwKKwkgICAgICAgY3B1aWRsZV9jc3RhdGVzW2lkXS5uYW1lLCB0aW1lZGlmZiwgc3RhdGVkaWZmLCAqcGVyY2VudCwgY3B1KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNwdWlkbGVfc3RhcnQodm9pZCkKK3sKKwlpbnQgY3B1LCBzdGF0ZTsKKwljbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmc3RhcnRfdGltZSk7CisJZm9yIChjcHUgPSAwOyBjcHUgPCBjcHVfY291bnQ7IGNwdSsrKSB7CisJCWZvciAoc3RhdGUgPSAwOyBzdGF0ZSA8IGNwdWlkbGVfc3lzZnNfbW9uaXRvci5od19zdGF0ZXNfbnVtOworCQkgICAgIHN0YXRlKyspIHsKKwkJCXByZXZpb3VzX2NvdW50W2NwdV1bc3RhdGVdID0KKwkJCQlzeXNmc19nZXRfaWRsZXN0YXRlX3RpbWUoY3B1LCBzdGF0ZSk7CisJCQlkcHJpbnQoIkNQVSAlZCAtIFN0YXRlOiAlZCAtIFZhbDogJWxsdVxuIiwKKwkJCSAgICAgICBjcHUsIHN0YXRlLCBwcmV2aW91c19jb3VudFtjcHVdW3N0YXRlXSk7CisJCX0KKwl9OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNwdWlkbGVfc3RvcCh2b2lkKQoreworCWludCBjcHUsIHN0YXRlOworCXN0cnVjdCB0aW1lc3BlYyBlbmRfdGltZTsKKwljbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmZW5kX3RpbWUpOworCXRpbWVkaWZmID0gdGltZXNwZWNfZGlmZl91cyhzdGFydF90aW1lLCBlbmRfdGltZSk7CisKKwlmb3IgKGNwdSA9IDA7IGNwdSA8IGNwdV9jb3VudDsgY3B1KyspIHsKKwkJZm9yIChzdGF0ZSA9IDA7IHN0YXRlIDwgY3B1aWRsZV9zeXNmc19tb25pdG9yLmh3X3N0YXRlc19udW07CisJCSAgICAgc3RhdGUrKykgeworCQkJY3VycmVudF9jb3VudFtjcHVdW3N0YXRlXSA9CisJCQkJc3lzZnNfZ2V0X2lkbGVzdGF0ZV90aW1lKGNwdSwgc3RhdGUpOworCQkJZHByaW50KCJDUFUgJWQgLSBTdGF0ZTogJWQgLSBWYWw6ICVsbHVcbiIsCisJCQkgICAgICAgY3B1LCBzdGF0ZSwgcHJldmlvdXNfY291bnRbY3B1XVtzdGF0ZV0pOworCQl9CisJfTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBmaXhfdXBfaW50ZWxfaWRsZV9kcml2ZXJfbmFtZShjaGFyICp0bXAsIGludCBudW0pCit7CisJLyogZml4IHVwIGNwdWlkbGUgbmFtZSBmb3IgaW50ZWwgaWRsZSBkcml2ZXIgKi8KKwlpZiAoIXN0cm5jbXAodG1wLCAiTkhNLSIsIDQpKSB7CisJCXN3aXRjaCAobnVtKSB7CisJCWNhc2UgMToKKwkJCXN0cmNweSh0bXAsICJDMSIpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXN0cmNweSh0bXAsICJDMyIpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCXN0cmNweSh0bXAsICJDNiIpOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgaWYgKCFzdHJuY21wKHRtcCwgIlNOQi0iLCA0KSkgeworCQlzd2l0Y2ggKG51bSkgeworCQljYXNlIDE6CisJCQlzdHJjcHkodG1wLCAiQzEiKTsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlzdHJjcHkodG1wLCAiQzMiKTsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlzdHJjcHkodG1wLCAiQzYiKTsKKwkJCWJyZWFrOworCQljYXNlIDQ6CisJCQlzdHJjcHkodG1wLCAiQzciKTsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIGlmICghc3RybmNtcCh0bXAsICJBVE0tIiwgNCkpIHsKKwkJc3dpdGNoIChudW0pIHsKKwkJY2FzZSAxOgorCQkJc3RyY3B5KHRtcCwgIkMxIik7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJc3RyY3B5KHRtcCwgIkMyIik7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJc3RyY3B5KHRtcCwgIkM0Iik7CisJCQlicmVhazsKKwkJY2FzZSA0OgorCQkJc3RyY3B5KHRtcCwgIkM2Iik7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHN0cnVjdCBjcHVpZGxlX21vbml0b3IgKmNwdWlkbGVfcmVnaXN0ZXIodm9pZCkKK3sKKwlpbnQgbnVtOworCWNoYXIgKnRtcDsKKworCS8qIEFzc3VtZSBpZGxlIHN0YXRlIGNvdW50IGlzIHRoZSBzYW1lIGZvciBhbGwgQ1BVcyAqLworCWNwdWlkbGVfc3lzZnNfbW9uaXRvci5od19zdGF0ZXNfbnVtID0gc3lzZnNfZ2V0X2lkbGVzdGF0ZV9jb3VudCgwKTsKKworCWlmIChjcHVpZGxlX3N5c2ZzX21vbml0b3IuaHdfc3RhdGVzX251bSA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAobnVtID0gMDsgbnVtIDwgY3B1aWRsZV9zeXNmc19tb25pdG9yLmh3X3N0YXRlc19udW07IG51bSsrKSB7CisJCXRtcCA9IHN5c2ZzX2dldF9pZGxlc3RhdGVfbmFtZSgwLCBudW0pOworCQlpZiAodG1wID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlmaXhfdXBfaW50ZWxfaWRsZV9kcml2ZXJfbmFtZSh0bXAsIG51bSk7CisJCXN0cm5jcHkoY3B1aWRsZV9jc3RhdGVzW251bV0ubmFtZSwgdG1wLCBDU1RBVEVfTkFNRV9MRU4gLSAxKTsKKwkJZnJlZSh0bXApOworCisJCXRtcCA9IHN5c2ZzX2dldF9pZGxlc3RhdGVfZGVzYygwLCBudW0pOworCQlpZiAodG1wID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJc3RybmNweShjcHVpZGxlX2NzdGF0ZXNbbnVtXS5kZXNjLCB0bXAsCUNTVEFURV9ERVNDX0xFTiAtIDEpOworCQlmcmVlKHRtcCk7CisKKwkJY3B1aWRsZV9jc3RhdGVzW251bV0ucmFuZ2UgPSBSQU5HRV9USFJFQUQ7CisJCWNwdWlkbGVfY3N0YXRlc1tudW1dLmlkID0gbnVtOworCQljcHVpZGxlX2NzdGF0ZXNbbnVtXS5nZXRfY291bnRfcGVyY2VudCA9CisJCQljcHVpZGxlX2dldF9jb3VudF9wZXJjZW50OworCX07CisKKwkvKiBGcmVlIHRoaXMgYXQgcHJvZ3JhbSB0ZXJtaW5hdGlvbiAqLworCXByZXZpb3VzX2NvdW50ID0gbWFsbG9jKHNpemVvZihsb25nIGxvbmcgKikgKiBjcHVfY291bnQpOworCWN1cnJlbnRfY291bnQgPSBtYWxsb2Moc2l6ZW9mKGxvbmcgbG9uZyAqKSAqIGNwdV9jb3VudCk7CisJZm9yIChudW0gPSAwOyBudW0gPCBjcHVfY291bnQ7IG51bSsrKSB7CisJCXByZXZpb3VzX2NvdW50W251bV0gPSBtYWxsb2Moc2l6ZW9mKGxvbmcgbG9uZykgKgorCQkJCQljcHVpZGxlX3N5c2ZzX21vbml0b3IuaHdfc3RhdGVzX251bSk7CisJCWN1cnJlbnRfY291bnRbbnVtXSA9IG1hbGxvYyhzaXplb2YobG9uZyBsb25nKSAqCisJCQkJCWNwdWlkbGVfc3lzZnNfbW9uaXRvci5od19zdGF0ZXNfbnVtKTsKKwl9CisKKwljcHVpZGxlX3N5c2ZzX21vbml0b3IubmFtZV9sZW4gPSBzdHJsZW4oY3B1aWRsZV9zeXNmc19tb25pdG9yLm5hbWUpOworCXJldHVybiAmY3B1aWRsZV9zeXNmc19tb25pdG9yOworfQorCit2b2lkIGNwdWlkbGVfdW5yZWdpc3Rlcih2b2lkKQoreworCWludCBudW07CisKKwlmb3IgKG51bSA9IDA7IG51bSA8IGNwdV9jb3VudDsgbnVtKyspIHsKKwkJZnJlZShwcmV2aW91c19jb3VudFtudW1dKTsKKwkJZnJlZShjdXJyZW50X2NvdW50W251bV0pOworCX0KKwlmcmVlKHByZXZpb3VzX2NvdW50KTsKKwlmcmVlKGN1cnJlbnRfY291bnQpOworfQorCitzdHJ1Y3QgY3B1aWRsZV9tb25pdG9yIGNwdWlkbGVfc3lzZnNfbW9uaXRvciA9IHsKKwkubmFtZQkJCT0gIklkbGVfU3RhdHMiLAorCS5od19zdGF0ZXMJCT0gY3B1aWRsZV9jc3RhdGVzLAorCS5zdGFydAkJCT0gY3B1aWRsZV9zdGFydCwKKwkuc3RvcAkJCT0gY3B1aWRsZV9zdG9wLAorCS5kb19yZWdpc3RlcgkJPSBjcHVpZGxlX3JlZ2lzdGVyLAorCS51bnJlZ2lzdGVyCQk9IGNwdWlkbGVfdW5yZWdpc3RlciwKKwkubmVlZHNfcm9vdAkJPSAwLAorCS5vdmVyZmxvd19zCQk9IFVJTlRfTUFYLAorfTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmMgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNGJmMDYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5jCkBAIC0wLDAgKzEsNDQ4IEBACisvKgorICogIChDKSAyMDEwLDIwMTEgICAgICAgVGhvbWFzIFJlbm5pbmdlciA8dHJlbm5Ac3VzZS5kZT4sIE5vdmVsbCBJbmMuCisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMi4KKyAqCisgKiAgT3V0cHV0IGZvcm1hdCBpbnNwaXJlZCBieSBMZW4gQnJvd24ncyA8bGVuYkBrZXJuZWwub3JnPiB0dXJib3N0YXQgdG9vbC4KKyAqCisgKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDxsaWJnZW4uaD4KKworI2luY2x1ZGUgImlkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmgiCisjaW5jbHVkZSAiaWRsZV9tb25pdG9yL2lkbGVfbW9uaXRvcnMuaCIKKyNpbmNsdWRlICJoZWxwZXJzL2hlbHBlcnMuaCIKKworLyogRGVmaW5lIHBvaW50ZXJzIHRvIGFsbCBtb25pdG9ycy4gICovCisjZGVmaW5lIERFRih4KSAmIHggIyMgX21vbml0b3IgLAorc3RydWN0IGNwdWlkbGVfbW9uaXRvciAqYWxsX21vbml0b3JzW10gPSB7CisjaW5jbHVkZSAiaWRsZV9tb25pdG9ycy5kZWYiCiswCit9OworCitzdGF0aWMgc3RydWN0IGNwdWlkbGVfbW9uaXRvciAqbW9uaXRvcnNbTU9OSVRPUlNfTUFYXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYXZhaWxfbW9uaXRvcnM7CisKK3N0YXRpYyBjaGFyICpwcm9nbmFtZTsKKworZW51bSBvcGVyYXRpb25fbW9kZV9lIHsgbGlzdCA9IDEsIHNob3csIHNob3dfYWxsIH07CitzdGF0aWMgaW50IG1vZGU7CitzdGF0aWMgaW50IGludGVydmFsID0gMTsKK3N0YXRpYyBjaGFyICpzaG93X21vbml0b3JzX3BhcmFtOworc3RhdGljIHN0cnVjdCBjcHVwb3dlcl90b3BvbG9neSBjcHVfdG9wOworCisvKiBUb0RvOiBEb2N1bWVudCB0aGlzIGluIHRoZSBtYW5wYWdlICovCitzdGF0aWMgY2hhciByYW5nZV9hYmJyW1JBTkdFX01BWF0gPSB7ICdUJywgJ0MnLCAnUCcsICdNJywgfTsKKworbG9uZyBsb25nIHRpbWVzcGVjX2RpZmZfdXMoc3RydWN0IHRpbWVzcGVjIHN0YXJ0LCBzdHJ1Y3QgdGltZXNwZWMgZW5kKQoreworCXN0cnVjdCB0aW1lc3BlYyB0ZW1wOworCWlmICgoZW5kLnR2X25zZWMgLSBzdGFydC50dl9uc2VjKSA8IDApIHsKKwkJdGVtcC50dl9zZWMgPSBlbmQudHZfc2VjIC0gc3RhcnQudHZfc2VjIC0gMTsKKwkJdGVtcC50dl9uc2VjID0gMTAwMDAwMDAwMCArIGVuZC50dl9uc2VjIC0gc3RhcnQudHZfbnNlYzsKKwl9IGVsc2UgeworCQl0ZW1wLnR2X3NlYyA9IGVuZC50dl9zZWMgLSBzdGFydC50dl9zZWM7CisJCXRlbXAudHZfbnNlYyA9IGVuZC50dl9uc2VjIC0gc3RhcnQudHZfbnNlYzsKKwl9CisJcmV0dXJuICh0ZW1wLnR2X3NlYyAqIDEwMDAwMDApICsgKHRlbXAudHZfbnNlYyAvIDEwMDApOworfQorCit2b2lkIG1vbml0b3JfaGVscCh2b2lkKQoreworCXByaW50ZihfKCJjcHVwb3dlciBtb25pdG9yOiBbLW0gPG1vbjE+LFs8bW9uMj5dLC4uIF0gY29tbWFuZFxuIikpOworCXByaW50ZihfKCJjcHVwb3dlciBtb25pdG9yOiBbLW0gPG1vbjE+LFs8bW9uMj5dLC4uIF0gWyAtaSBpbnRlcnZhbF9zZWMgXVxuIikpOworCXByaW50ZihfKCJjcHVwb3dlciBtb25pdG9yOiAtbFxuIikpOworCXByaW50ZihfKCJcdCBjb21tYW5kOiBwYXNzIGFuIGFyYml0cmFyeSBjb21tYW5kIHRvIG1lYXN1cmUgc3BlY2lmaWMgd29ya2xvYWRcbiIpKTsKKwlwcmludGYoXygiXHQgLWk6IHRpbWUgaW50ZXJ2YWxsIHRvIG1lYXN1cmUgZm9yIGluIHNlY29uZHMgKGRlZmF1bHQgMSlcbiIpKTsKKwlwcmludGYoXygiXHQgLWw6IGxpc3QgYXZhaWxhYmxlIENQVSBzbGVlcCBtb25pdG9ycyAoZm9yIHVzZSB3aXRoIC1tKVxuIikpOworCXByaW50ZihfKCJcdCAtbTogc2hvdyBzcGVjaWZpYyBDUFUgc2xlZXAgbW9uaXRvcnMgb25seSAoaW4gc2FtZSBvcmRlcilcbiIpKTsKKwlwcmludGYoXygiXHQgLWg6IHByaW50IHRoaXMgaGVscFxuIikpOworCXByaW50ZigiXG4iKTsKKwlwcmludGYoXygib25seSBvbmUgb2Y6IC1sLCAtbSBhcmUgYWxsb3dlZFxuSWYgbm9uZSBvZiB0aGVtIGlzIHBhc3NlZCwiKSk7CisJcHJpbnRmKF8oIiBhbGwgc3VwcG9ydGVkIG1vbml0b3JzIGFyZSBzaG93blxuIikpOworfQorCit2b2lkIHByaW50X25fc3BhY2VzKGludCBuKQoreworCWludCB4OworCWZvciAoeCA9IDA7IHggPCBuOyB4KyspCisJCXByaW50ZigiICIpOworfQorCisvKiBzaXplIG9mIHMgbXVzdCBiZSBhdCBsZWFzdCBuICsgMSAqLworaW50IGZpbGxfc3RyaW5nX3dpdGhfc3BhY2VzKGNoYXIgKnMsIGludCBuKQoreworCWludCBsZW4gPSBzdHJsZW4ocyk7CisJaWYgKGxlbiA+IG4pCisJCXJldHVybiAtMTsKKwlmb3IgKDsgbGVuIDwgbjsgbGVuKyspCisJCXNbbGVuXSA9ICcgJzsKKwlzW2xlbl0gPSAnXDAnOworCXJldHVybiAwOworfQorCit2b2lkIHByaW50X2hlYWRlcihpbnQgdG9wb2xvZ3lfZGVwdGgpCit7CisJaW50IHVuc2lnbmVkIG1vbjsKKwlpbnQgc3RhdGUsIG5lZWRfbGVuLCBwcl9tb25fbGVuOworCWNzdGF0ZV90IHM7CisJY2hhciBidWZbMTI4XSA9ICIiOworCWludCBwZXJjZW50X3dpZHRoID0gNDsKKworCWZpbGxfc3RyaW5nX3dpdGhfc3BhY2VzKGJ1ZiwgdG9wb2xvZ3lfZGVwdGggKiA1IC0gMSk7CisJcHJpbnRmKCIlc3wiLCBidWYpOworCisJZm9yIChtb24gPSAwOyBtb24gPCBhdmFpbF9tb25pdG9yczsgbW9uKyspIHsKKwkJcHJfbW9uX2xlbiA9IDA7CisJCW5lZWRfbGVuID0gbW9uaXRvcnNbbW9uXS0+aHdfc3RhdGVzX251bSAqIChwZXJjZW50X3dpZHRoICsgMykKKwkJCS0gMTsKKwkJaWYgKG1vbiAhPSAwKSB7CisJCQlwcmludGYoInx8ICIpOworCQkJbmVlZF9sZW4tLTsKKwkJfQorCQlzcHJpbnRmKGJ1ZiwgIiVzIiwgbW9uaXRvcnNbbW9uXS0+bmFtZSk7CisJCWZpbGxfc3RyaW5nX3dpdGhfc3BhY2VzKGJ1ZiwgbmVlZF9sZW4pOworCQlwcmludGYoIiVzIiwgYnVmKTsKKwl9CisJcHJpbnRmKCJcbiIpOworCisJaWYgKHRvcG9sb2d5X2RlcHRoID4gMikKKwkJcHJpbnRmKCJQS0cgfCIpOworCWlmICh0b3BvbG9neV9kZXB0aCA+IDEpCisJCXByaW50ZigiQ09SRXwiKTsKKwlpZiAodG9wb2xvZ3lfZGVwdGggPiAwKQorCQlwcmludGYoIkNQVSB8Iik7CisKKwlmb3IgKG1vbiA9IDA7IG1vbiA8IGF2YWlsX21vbml0b3JzOyBtb24rKykgeworCQlpZiAobW9uICE9IDApCisJCQlwcmludGYoInx8ICIpOworCQllbHNlCisJCQlwcmludGYoIiAiKTsKKwkJZm9yIChzdGF0ZSA9IDA7IHN0YXRlIDwgbW9uaXRvcnNbbW9uXS0+aHdfc3RhdGVzX251bTsgc3RhdGUrKykgeworCQkJaWYgKHN0YXRlICE9IDApCisJCQkJcHJpbnRmKCIgfCAiKTsKKwkJCXMgPSBtb25pdG9yc1ttb25dLT5od19zdGF0ZXNbc3RhdGVdOworCQkJc3ByaW50ZihidWYsICIlcyIsIHMubmFtZSk7CisJCQlmaWxsX3N0cmluZ193aXRoX3NwYWNlcyhidWYsIHBlcmNlbnRfd2lkdGgpOworCQkJcHJpbnRmKCIlcyIsIGJ1Zik7CisJCX0KKwkJcHJpbnRmKCIgIik7CisJfQorCXByaW50ZigiXG4iKTsKK30KKworCit2b2lkIHByaW50X3Jlc3VsdHMoaW50IHRvcG9sb2d5X2RlcHRoLCBpbnQgY3B1KQoreworCXVuc2lnbmVkIGludCBtb247CisJaW50IHN0YXRlLCByZXQ7CisJZG91YmxlIHBlcmNlbnQ7CisJdW5zaWduZWQgbG9uZyBsb25nIHJlc3VsdDsKKwljc3RhdGVfdCBzOworCisJaWYgKHRvcG9sb2d5X2RlcHRoID4gMikKKwkJcHJpbnRmKCIlNGR8IiwgY3B1X3RvcC5jb3JlX2luZm9bY3B1XS5wa2cpOworCWlmICh0b3BvbG9neV9kZXB0aCA+IDEpCisJCXByaW50ZigiJTRkfCIsIGNwdV90b3AuY29yZV9pbmZvW2NwdV0uY29yZSk7CisJaWYgKHRvcG9sb2d5X2RlcHRoID4gMCkKKwkJcHJpbnRmKCIlNGR8IiwgY3B1X3RvcC5jb3JlX2luZm9bY3B1XS5jcHUpOworCisJZm9yIChtb24gPSAwOyBtb24gPCBhdmFpbF9tb25pdG9yczsgbW9uKyspIHsKKwkJaWYgKG1vbiAhPSAwKQorCQkJcHJpbnRmKCJ8fCIpOworCisJCWZvciAoc3RhdGUgPSAwOyBzdGF0ZSA8IG1vbml0b3JzW21vbl0tPmh3X3N0YXRlc19udW07IHN0YXRlKyspIHsKKwkJCWlmIChzdGF0ZSAhPSAwKQorCQkJCXByaW50ZigifCIpOworCisJCQlzID0gbW9uaXRvcnNbbW9uXS0+aHdfc3RhdGVzW3N0YXRlXTsKKworCQkJaWYgKHMuZ2V0X2NvdW50X3BlcmNlbnQpIHsKKwkJCQlyZXQgPSBzLmdldF9jb3VudF9wZXJjZW50KHMuaWQsICZwZXJjZW50LAorCQkJCQkJICBjcHVfdG9wLmNvcmVfaW5mb1tjcHVdLmNwdSk7CisJCQkJaWYgKHJldCkKKwkJCQkJcHJpbnRmKCIqKioqKioiKTsKKwkJCQllbHNlIGlmIChwZXJjZW50ID49IDEwMC4wKQorCQkJCQlwcmludGYoIiU2LjFmIiwgcGVyY2VudCk7CisJCQkJZWxzZQorCQkJCQlwcmludGYoIiU2LjJmIiwgcGVyY2VudCk7CisJCQl9IGVsc2UgaWYgKHMuZ2V0X2NvdW50KSB7CisJCQkJcmV0ID0gcy5nZXRfY291bnQocy5pZCwgJnJlc3VsdCwKKwkJCQkJCSAgY3B1X3RvcC5jb3JlX2luZm9bY3B1XS5jcHUpOworCQkJCWlmIChyZXQpCisJCQkJCXByaW50ZigiKioqKioqIik7CisJCQkJZWxzZQorCQkJCQlwcmludGYoIiU2bGx1IiwgcmVzdWx0KTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRmKF8oIk1vbml0b3IgJXMsIENvdW50ZXIgJXMgaGFzIG5vIGNvdW50ICIKKwkJCQkJICJmdW5jdGlvbi4gSW1wbGVtZW50YXRpb24gZXJyb3JcbiIpLAorCQkJCSAgICAgICBtb25pdG9yc1ttb25dLT5uYW1lLCBzLm5hbWUpOworCQkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwkJCX0KKwkJfQorCX0KKwkvKiBjcHUgb2ZmbGluZSAqLworCWlmIChjcHVfdG9wLmNvcmVfaW5mb1tjcHVdLnBrZyA9PSAtMSB8fAorCSAgICBjcHVfdG9wLmNvcmVfaW5mb1tjcHVdLmNvcmUgPT0gLTEpIHsKKwkJcHJpbnRmKF8oIiAqaXMgb2ZmbGluZVxuIikpOworCQlyZXR1cm47CisJfSBlbHNlCisJCXByaW50ZigiXG4iKTsKK30KKworCisvKiBwYXJhbTogc3RyaW5nIHBhc3NlZCBieSAtbSBwYXJhbSAoVGhlIGxpc3Qgb2YgbW9uaXRvcnMgdG8gc2hvdykKKyAqCisgKiBNb25pdG9ycyBtdXN0IGhhdmUgYmVlbiByZWdpc3RlcmVkIGFscmVhZHksIG1hdGNoaW5nIG1vbml0b3JzCisgKiBhcmUgcGlja2VkIG91dCBhbmQgYXZhaWxhYmxlIG1vbml0b3JzIGFycmF5IGlzIG92ZXJyaWRkZW4KKyAqIHdpdGggbWF0Y2hpbmcgb25lcworICoKKyAqIE1vbml0b3JzIGdldCBzb3J0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgdGhlIHVzZXIgcGFzc2VzIHRoZW0KKyovCisKK3N0YXRpYyB2b2lkIHBhcnNlX21vbml0b3JfcGFyYW0oY2hhciAqcGFyYW0pCit7CisJdW5zaWduZWQgaW50IG51bTsKKwlpbnQgbW9uLCBoaXRzID0gMDsKKwljaGFyICp0bXAgPSBwYXJhbSwgKnRva2VuOworCXN0cnVjdCBjcHVpZGxlX21vbml0b3IgKnRtcF9tb25zW01PTklUT1JTX01BWF07CisKKworCWZvciAobW9uID0gMDsgbW9uIDwgTU9OSVRPUlNfTUFYOyBtb24rKywgdG1wID0gTlVMTCkgeworCQl0b2tlbiA9IHN0cnRvayh0bXAsICIsIik7CisJCWlmICh0b2tlbiA9PSBOVUxMKQorCQkJYnJlYWs7CisJCWlmIChzdHJsZW4odG9rZW4pID49IE1PTklUT1JfTkFNRV9MRU4pIHsKKwkJCXByaW50ZihfKCIlczogbWF4IG1vbml0b3IgbmFtZSBsZW5ndGgiCisJCQkJICIgKCVkKSBleGNlZWRlZFxuIiksIHRva2VuLCBNT05JVE9SX05BTUVfTEVOKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZm9yIChudW0gPSAwOyBudW0gPCBhdmFpbF9tb25pdG9yczsgbnVtKyspIHsKKwkJCWlmICghc3RyY21wKG1vbml0b3JzW251bV0tPm5hbWUsIHRva2VuKSkgeworCQkJCWRwcmludCgiRm91bmQgcmVxdWVzdGVkIG1vbml0b3I6ICVzXG4iLCB0b2tlbik7CisJCQkJdG1wX21vbnNbaGl0c10gPSBtb25pdG9yc1tudW1dOworCQkJCWhpdHMrKzsKKwkJCX0KKwkJfQorCX0KKwlpZiAoaGl0cyA9PSAwKSB7CisJCXByaW50ZihfKCJObyBtYXRjaGluZyBtb25pdG9yIGZvdW5kIGluICVzLCAiCisJCQkgInRyeSAtbCBvcHRpb25cbiIpLCBwYXJhbSk7CisJCW1vbml0b3JfaGVscCgpOworCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCS8qIE92ZXJyaWRlIGRldGVjdGVkL3JlZ2lzdGVyZCBtb25pdG9ycyBhcnJheSB3aXRoIHJlcXVlc3RlZCBvbmUgKi8KKwltZW1jcHkobW9uaXRvcnMsIHRtcF9tb25zLAorCQlzaXplb2Yoc3RydWN0IGNwdWlkbGVfbW9uaXRvciAqKSAqIE1PTklUT1JTX01BWCk7CisJYXZhaWxfbW9uaXRvcnMgPSBoaXRzOworfQorCit2b2lkIGxpc3RfbW9uaXRvcnModm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgbW9uOworCWludCBzdGF0ZTsKKwljc3RhdGVfdCBzOworCisJZm9yIChtb24gPSAwOyBtb24gPCBhdmFpbF9tb25pdG9yczsgbW9uKyspIHsKKwkJcHJpbnRmKF8oIk1vbml0b3IgXCIlc1wiICglZCBzdGF0ZXMpIC0gTWlnaHQgb3ZlcmZsb3cgYWZ0ZXIgJXUgIgorCQkJICJzXG4iKSwKKwkJCW1vbml0b3JzW21vbl0tPm5hbWUsIG1vbml0b3JzW21vbl0tPmh3X3N0YXRlc19udW0sCisJCQltb25pdG9yc1ttb25dLT5vdmVyZmxvd19zKTsKKworCQlmb3IgKHN0YXRlID0gMDsgc3RhdGUgPCBtb25pdG9yc1ttb25dLT5od19zdGF0ZXNfbnVtOyBzdGF0ZSsrKSB7CisJCQlzID0gbW9uaXRvcnNbbW9uXS0+aHdfc3RhdGVzW3N0YXRlXTsKKwkJCS8qCisJCQkgKiBUb0RvIHNob3cgbW9yZSBzdGF0ZSBjYXBhYmlsaXRpZXM6CisJCQkgKiBwZXJjZW50LCB0aW1lIChncmFubGFyaXR5KQorCQkJICovCisJCQlwcmludGYoIiVzXHRbJWNdIC0+ICVzXG4iLCBzLm5hbWUsIHJhbmdlX2FiYnJbcy5yYW5nZV0sCisJCQkgICAgICAgZ2V0dGV4dChzLmRlc2MpKTsKKwkJfQorCX0KK30KKworaW50IGZvcmtfaXQoY2hhciAqKmFyZ3YpCit7CisJaW50IHN0YXR1czsKKwl1bnNpZ25lZCBpbnQgbnVtOworCXVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lZGlmZjsKKwlwaWRfdCBjaGlsZF9waWQ7CisJc3RydWN0IHRpbWVzcGVjIHN0YXJ0LCBlbmQ7CisKKwljaGlsZF9waWQgPSBmb3JrKCk7CisJY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJnN0YXJ0KTsKKworCWZvciAobnVtID0gMDsgbnVtIDwgYXZhaWxfbW9uaXRvcnM7IG51bSsrKQorCQltb25pdG9yc1tudW1dLT5zdGFydCgpOworCisJaWYgKCFjaGlsZF9waWQpIHsKKwkJLyogY2hpbGQgKi8KKwkJZXhlY3ZwKGFyZ3ZbMF0sIGFyZ3YpOworCX0gZWxzZSB7CisJCS8qIHBhcmVudCAqLworCQlpZiAoY2hpbGRfcGlkID09IC0xKSB7CisJCQlwZXJyb3IoImZvcmsiKTsKKwkJCWV4aXQoMSk7CisJCX0KKworCQlzaWduYWwoU0lHSU5ULCBTSUdfSUdOKTsKKwkJc2lnbmFsKFNJR1FVSVQsIFNJR19JR04pOworCQlpZiAod2FpdHBpZChjaGlsZF9waWQsICZzdGF0dXMsIDApID09IC0xKSB7CisJCQlwZXJyb3IoIndhaXQiKTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9CisJY2xvY2tfZ2V0dGltZShDTE9DS19SRUFMVElNRSwgJmVuZCk7CisJZm9yIChudW0gPSAwOyBudW0gPCBhdmFpbF9tb25pdG9yczsgbnVtKyspCisJCW1vbml0b3JzW251bV0tPnN0b3AoKTsKKworCXRpbWVkaWZmID0gdGltZXNwZWNfZGlmZl91cyhzdGFydCwgZW5kKTsKKwlpZiAoV0lGRVhJVEVEKHN0YXR1cykpCisJCXByaW50ZihfKCIlcyB0b29rICUuNWYgc2Vjb25kcyBhbmQgZXhpdGVkIHdpdGggc3RhdHVzICVkXG4iKSwKKwkJCWFyZ3ZbMF0sIHRpbWVkaWZmIC8gKDEwMDAuMCAqIDEwMDApLAorCQkJV0VYSVRTVEFUVVMoc3RhdHVzKSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkb19pbnRlcnZhbF9tZWFzdXJlKGludCBpKQoreworCXVuc2lnbmVkIGludCBudW07CisKKwlmb3IgKG51bSA9IDA7IG51bSA8IGF2YWlsX21vbml0b3JzOyBudW0rKykgeworCQlkcHJpbnQoIkhXIEMtc3RhdGUgcmVzaWRlbmN5IG1vbml0b3I6ICVzIC0gU3RhdGVzOiAlZFxuIiwKKwkJICAgICAgIG1vbml0b3JzW251bV0tPm5hbWUsIG1vbml0b3JzW251bV0tPmh3X3N0YXRlc19udW0pOworCQltb25pdG9yc1tudW1dLT5zdGFydCgpOworCX0KKwlzbGVlcChpKTsKKwlmb3IgKG51bSA9IDA7IG51bSA8IGF2YWlsX21vbml0b3JzOyBudW0rKykKKwkJbW9uaXRvcnNbbnVtXS0+c3RvcCgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNtZGxpbmUoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpbnQgb3B0OworCXByb2duYW1lID0gYmFzZW5hbWUoYXJndlswXSk7CisKKwl3aGlsZSAoKG9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiK2hsaTptOiIpKSAhPSAtMSkgeworCQlzd2l0Y2ggKG9wdCkgeworCQljYXNlICdoJzoKKwkJCW1vbml0b3JfaGVscCgpOworCQkJZXhpdChFWElUX1NVQ0NFU1MpOworCQljYXNlICdsJzoKKwkJCWlmIChtb2RlKSB7CisJCQkJbW9uaXRvcl9oZWxwKCk7CisJCQkJZXhpdChFWElUX0ZBSUxVUkUpOworCQkJfQorCQkJbW9kZSA9IGxpc3Q7CisJCQlicmVhazsKKwkJY2FzZSAnaSc6CisJCQkvKiBvbmx5IGFsbG93IC1pIHdpdGggLW0gb3Igbm8gb3B0aW9uICovCisJCQlpZiAobW9kZSAmJiBtb2RlICE9IHNob3cpIHsKKwkJCQltb25pdG9yX2hlbHAoKTsKKwkJCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJCQl9CisJCQlpbnRlcnZhbCA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdtJzoKKwkJCWlmIChtb2RlKSB7CisJCQkJbW9uaXRvcl9oZWxwKCk7CisJCQkJZXhpdChFWElUX0ZBSUxVUkUpOworCQkJfQorCQkJbW9kZSA9IHNob3c7CisJCQlzaG93X21vbml0b3JzX3BhcmFtID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQltb25pdG9yX2hlbHAoKTsKKwkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwkJfQorCX0KKwlpZiAoIW1vZGUpCisJCW1vZGUgPSBzaG93X2FsbDsKK30KKworaW50IGNtZF9tb25pdG9yKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBpbnQgbnVtOworCXN0cnVjdCBjcHVpZGxlX21vbml0b3IgKnRlc3RfbW9uOworCWludCBjcHU7CisKKwljbWRsaW5lKGFyZ2MsIGFyZ3YpOworCWNwdV9jb3VudCA9IGdldF9jcHVfdG9wb2xvZ3koJmNwdV90b3ApOworCWlmIChjcHVfY291bnQgPCAwKSB7CisJCXByaW50ZihfKCJDYW5ub3QgcmVhZCBudW1iZXIgb2YgYXZhaWxhYmxlIHByb2Nlc3NvcnNcbiIpKTsKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwl9CisKKwlkcHJpbnQoIlN5c3RlbSBoYXMgdXAgdG8gJWQgQ1BVIGNvcmVzXG4iLCBjcHVfY291bnQpOworCisJZm9yIChudW0gPSAwOyBhbGxfbW9uaXRvcnNbbnVtXTsgbnVtKyspIHsKKwkJZHByaW50KCJUcnkgdG8gcmVnaXN0ZXI6ICVzXG4iLCBhbGxfbW9uaXRvcnNbbnVtXS0+bmFtZSk7CisJCXRlc3RfbW9uID0gYWxsX21vbml0b3JzW251bV0tPmRvX3JlZ2lzdGVyKCk7CisJCWlmICh0ZXN0X21vbikgeworCQkJaWYgKHRlc3RfbW9uLT5uZWVkc19yb290ICYmICFydW5fYXNfcm9vdCkgeworCQkJCWZwcmludGYoc3RkZXJyLCBfKCJBdmFpbGFibGUgbW9uaXRvciAlcyBuZWVkcyAiCisJCQkJCSAgInJvb3QgYWNjZXNzXG4iKSwgdGVzdF9tb24tPm5hbWUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJbW9uaXRvcnNbYXZhaWxfbW9uaXRvcnNdID0gdGVzdF9tb247CisJCQlkcHJpbnQoIiVzIHJlZ2lzdGVyZWRcbiIsIGFsbF9tb25pdG9yc1tudW1dLT5uYW1lKTsKKwkJCWF2YWlsX21vbml0b3JzKys7CisJCX0KKwl9CisKKwlpZiAoYXZhaWxfbW9uaXRvcnMgPT0gMCkgeworCQlwcmludGYoXygiTm8gSFcgQ3N0YXRlIG1vbml0b3JzIGZvdW5kXG4iKSk7CisJCXJldHVybiAxOworCX0KKworCWlmIChtb2RlID09IGxpc3QpIHsKKwkJbGlzdF9tb25pdG9ycygpOworCQlleGl0KEVYSVRfU1VDQ0VTUyk7CisJfQorCisJaWYgKG1vZGUgPT0gc2hvdykKKwkJcGFyc2VfbW9uaXRvcl9wYXJhbShzaG93X21vbml0b3JzX3BhcmFtKTsKKworCWRwcmludCgiUGFja2FnZXM6ICVkIC0gQ29yZXM6ICVkIC0gQ1BVczogJWRcbiIsCisJICAgICAgIGNwdV90b3AucGtncywgY3B1X3RvcC5jb3JlcywgY3B1X2NvdW50KTsKKworCS8qCisJICogaWYgYW55IHBhcmFtcyBsZWZ0LCBpdCBtdXN0IGJlIGEgY29tbWFuZCB0byBmb3JrCisJICovCisJaWYgKGFyZ2MgLSBvcHRpbmQpCisJCWZvcmtfaXQoYXJndiArIG9wdGluZCk7CisJZWxzZQorCQlkb19pbnRlcnZhbF9tZWFzdXJlKGludGVydmFsKTsKKworCS8qIFRvRG86IFRvcG9sb2d5IHBhcnNpbmcgbmVlZHMgZml4aW5nIGZpcnN0IHRvIGRvCisJICAgdGhpcyBtb3JlIGdlbmVyaWNhbGx5ICovCisJaWYgKGNwdV90b3AucGtncyA+IDEpCisJCXByaW50X2hlYWRlcigzKTsKKwllbHNlCisJCXByaW50X2hlYWRlcigxKTsKKworCWZvciAoY3B1ID0gMDsgY3B1IDwgY3B1X2NvdW50OyBjcHUrKykgeworCQlpZiAoY3B1X3RvcC5wa2dzID4gMSkKKwkJCXByaW50X3Jlc3VsdHMoMywgY3B1KTsKKwkJZWxzZQorCQkJcHJpbnRfcmVzdWx0cygxLCBjcHUpOworCX0KKworCWZvciAobnVtID0gMDsgbnVtIDwgYXZhaWxfbW9uaXRvcnM7IG51bSsrKQorCQltb25pdG9yc1tudW1dLT51bnJlZ2lzdGVyKCk7CisKKwljcHVfdG9wb2xvZ3lfcmVsZWFzZShjcHVfdG9wKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2lkbGVfbW9uaXRvci9jcHVwb3dlci1tb25pdG9yLmggYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMTJlZTEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9pZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiAgKEMpIDIwMTAsMjAxMSAgICAgICBUaG9tYXMgUmVubmluZ2VyIDx0cmVubkBzdXNlLmRlPiwgTm92ZWxsIEluYy4KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqLworCisjaWZuZGVmIF9fQ1BVSURMRV9JTkZPX0hXX18KKyNkZWZpbmUgX19DUFVJRExFX0lORk9fSFdfXworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSAiaWRsZV9tb25pdG9yL2lkbGVfbW9uaXRvcnMuaCIKKworI2RlZmluZSBNT05JVE9SU19NQVggMjAKKyNkZWZpbmUgTU9OSVRPUl9OQU1FX0xFTiAyMAorI2RlZmluZSBDU1RBVEVfTkFNRV9MRU4gNQorI2RlZmluZSBDU1RBVEVfREVTQ19MRU4gNjAKKworaW50IGNwdV9jb3VudDsKKworLyogSGFyZCB0byBkZWZpbmUgdGhlIHJpZ2h0IG5hbWVzIC4uLjogKi8KK2VudW0gcG93ZXJfcmFuZ2VfZSB7CisJUkFOR0VfVEhSRUFELAkvKiBMb3dlc3QgaW4gdG9wb2xvZ3kgaGllcmFyY3ksIEFNRDogY29yZSwgSW50ZWw6IHRocmVhZAorCQkJICAga2VybmVsIHN5c2ZzOiBjcHUgKi8KKwlSQU5HRV9DT1JFLAkvKiBBTUQ6IHVuaXQsIEludGVsOiBjb3JlLCBrZXJuZWxfc3lzZnM6IGNvcmVfaWQgKi8KKwlSQU5HRV9QQUNLQUdFLAkvKiBQYWNrYWdlLCBwcm9jZXNzb3Igc29ja2V0ICovCisJUkFOR0VfTUFDSElORSwJLyogTWFjaGluZSwgcGxhdGZvcm0gd2lkZSAqLworCVJBTkdFX01BWCB9OworCit0eXBlZGVmIHN0cnVjdCBjc3RhdGUgeworCWludCAgaWQ7CisJZW51bSBwb3dlcl9yYW5nZV9lIHJhbmdlOworCWNoYXIgbmFtZVtDU1RBVEVfTkFNRV9MRU5dOworCWNoYXIgZGVzY1tDU1RBVEVfREVTQ19MRU5dOworCisJLyogZWl0aGVyIHByb3ZpZGUgYSBwZXJjZW50YWdlIG9yIGEgZ2VuZXJhbCBjb3VudCAqLworCWludCAoKmdldF9jb3VudF9wZXJjZW50KSh1bnNpZ25lZCBpbnQgc2VsZl9pZCwgZG91YmxlICpwZXJjZW50LAorCQkJCSB1bnNpZ25lZCBpbnQgY3B1KTsKKwlpbnQgKCpnZXRfY291bnQpKHVuc2lnbmVkIGludCBzZWxmX2lkLCB1bnNpZ25lZCBsb25nIGxvbmcgKmNvdW50LAorCQkJIHVuc2lnbmVkIGludCBjcHUpOworfSBjc3RhdGVfdDsKKworc3RydWN0IGNwdWlkbGVfbW9uaXRvciB7CisJLyogTmFtZSBtdXN0IG5vdCBjb250YWluIHdoaXRlc3BhY2VzICovCisJY2hhciBuYW1lW01PTklUT1JfTkFNRV9MRU5dOworCWludCBuYW1lX2xlbjsKKwlpbnQgaHdfc3RhdGVzX251bTsKKwljc3RhdGVfdCAqaHdfc3RhdGVzOworCWludCAoKnN0YXJ0KSAodm9pZCk7CisJaW50ICgqc3RvcCkgKHZvaWQpOworCXN0cnVjdCBjcHVpZGxlX21vbml0b3IqICgqZG9fcmVnaXN0ZXIpICh2b2lkKTsKKwl2b2lkICgqdW5yZWdpc3Rlcikodm9pZCk7CisJdW5zaWduZWQgaW50IG92ZXJmbG93X3M7CisJaW50IG5lZWRzX3Jvb3Q7Cit9OworCitleHRlcm4gbG9uZyBsb25nIHRpbWVzcGVjX2RpZmZfdXMoc3RydWN0IHRpbWVzcGVjIHN0YXJ0LCBzdHJ1Y3QgdGltZXNwZWMgZW5kKTsKKworI2RlZmluZSBwcmludF9vdmVyZmxvd19lcnIobWVzLCBvdikJCQkJCQlcCit7CQkJCQkJCQkJCVwKKwlmcHJpbnRmKHN0ZGVyciwgZ2V0dGV4dCgiTWVhc3VyZSB0b29rICV1IHNlY29uZHMsIGJ1dCByZWdpc3RlcnMgY291bGQgIglcCisJCQkJIm92ZXJmbG93IGF0ICV1IHNlY29uZHMsIHJlc3VsdHMgIgkJXAorCQkJCSJjb3VsZCBiZSBpbmFjY3VyYXRlXG4iKSwgbWVzLCBvdik7CQlcCit9CisKKyNlbmRpZiAvKiBfX0NQVUlETEVfSU5GT19IV19fICovCmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9pZGxlX21vbml0b3IvaWRsZV9tb25pdG9ycy5kZWYgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9pZGxlX21vbml0b3IvaWRsZV9tb25pdG9ycy5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNmOGQ5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2lkbGVfbW9uaXRvci9pZGxlX21vbml0b3JzLmRlZgpAQCAtMCwwICsxLDcgQEAKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCitERUYoYW1kX2ZhbTE0aCkKK0RFRihpbnRlbF9uaG0pCitERUYoaW50ZWxfc25iKQorREVGKG1wZXJmKQorI2VuZGlmCitERUYoY3B1aWRsZV9zeXNmcykKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2lkbGVfbW9uaXRvci9pZGxlX21vbml0b3JzLmggYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9pZGxlX21vbml0b3IvaWRsZV9tb25pdG9ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmY2RlYjEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9pZGxlX21vbml0b3IvaWRsZV9tb25pdG9ycy5oCkBAIC0wLDAgKzEsMTggQEAKKy8qCisgKiAgKEMpIDIwMTAsMjAxMSAgICAgICBUaG9tYXMgUmVubmluZ2VyIDx0cmVubkBzdXNlLmRlPiwgTm92ZWxsIEluYy4KKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqICBCYXNlZCBvbiB0aGUgaWRlYSBmcm9tIE1pY2hhZWwgTWF0eiA8bWF0ekBzdXNlLmRlPgorICoKKyAqLworCisjaWZuZGVmIF9DUFVJRExFX0lETEVfTU9OSVRPUlNfSF8KKyNkZWZpbmUgX0NQVUlETEVfSURMRV9NT05JVE9SU19IXworCisjZGVmaW5lIERFRih4KSBleHRlcm4gc3RydWN0IGNwdWlkbGVfbW9uaXRvciB4ICMjX21vbml0b3I7CisjaW5jbHVkZSAiaWRsZV9tb25pdG9ycy5kZWYiCisjdW5kZWYgREVGCitleHRlcm4gc3RydWN0IGNwdWlkbGVfbW9uaXRvciAqYWxsX21vbml0b3JzW107CisKKyNlbmRpZiAvKiBfQ1BVSURMRV9JRExFX01PTklUT1JTX0hfICovCmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9pZGxlX21vbml0b3IvbXBlcmZfbW9uaXRvci5jIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaWRsZV9tb25pdG9yL21wZXJmX21vbml0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2NhODdhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaWRsZV9tb25pdG9yL21wZXJmX21vbml0b3IuYwpAQCAtMCwwICsxLDI1NSBAQAorLyoKKyAqICAoQykgMjAxMCwyMDExICAgICAgIFRob21hcyBSZW5uaW5nZXIgPHRyZW5uQHN1c2UuZGU+LCBOb3ZlbGwgSW5jLgorICoKKyAqICBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgTGljZW5zZSB2ZXJzaW9uIDIuCisgKi8KKworI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisKKyNpbmNsdWRlIDxjcHVmcmVxLmg+CisKKyNpbmNsdWRlICJoZWxwZXJzL2hlbHBlcnMuaCIKKyNpbmNsdWRlICJpZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5oIgorCisjZGVmaW5lIE1TUl9BUEVSRgkweEU4CisjZGVmaW5lIE1TUl9NUEVSRgkweEU3CisKKyNkZWZpbmUgTVNSX1RTQwkweDEwCisKK2VudW0gbXBlcmZfaWQgeyBDMCA9IDAsIEN4LCBBVkdfRlJFUSwgTVBFUkZfQ1NUQVRFX0NPVU5UIH07CisKK3N0YXRpYyBpbnQgbXBlcmZfZ2V0X2NvdW50X3BlcmNlbnQodW5zaWduZWQgaW50IHNlbGZfaWQsIGRvdWJsZSAqcGVyY2VudCwKKwkJCQkgICB1bnNpZ25lZCBpbnQgY3B1KTsKK3N0YXRpYyBpbnQgbXBlcmZfZ2V0X2NvdW50X2ZyZXEodW5zaWduZWQgaW50IGlkLCB1bnNpZ25lZCBsb25nIGxvbmcgKmNvdW50LAorCQkJCXVuc2lnbmVkIGludCBjcHUpOworCitzdGF0aWMgY3N0YXRlX3QgbXBlcmZfY3N0YXRlc1tNUEVSRl9DU1RBVEVfQ09VTlRdID0geworCXsKKwkJLm5hbWUJCQk9ICJDMCIsCisJCS5kZXNjCQkJPSBOXygiUHJvY2Vzc29yIENvcmUgbm90IGlkbGUiKSwKKwkJLmlkCQkJPSBDMCwKKwkJLnJhbmdlCQkJPSBSQU5HRV9USFJFQUQsCisJCS5nZXRfY291bnRfcGVyY2VudAk9IG1wZXJmX2dldF9jb3VudF9wZXJjZW50LAorCX0sCisJeworCQkubmFtZQkJCT0gIkN4IiwKKwkJLmRlc2MJCQk9IE5fKCJQcm9jZXNzb3IgQ29yZSBpbiBhbiBpZGxlIHN0YXRlIiksCisJCS5pZAkJCT0gQ3gsCisJCS5yYW5nZQkJCT0gUkFOR0VfVEhSRUFELAorCQkuZ2V0X2NvdW50X3BlcmNlbnQJPSBtcGVyZl9nZXRfY291bnRfcGVyY2VudCwKKwl9LAorCisJeworCQkubmFtZQkJCT0gIkZyZXEiLAorCQkuZGVzYwkJCT0gTl8oIkF2ZXJhZ2UgRnJlcXVlbmN5IChpbmNsdWRpbmcgYm9vc3QpIGluIE1IeiIpLAorCQkuaWQJCQk9IEFWR19GUkVRLAorCQkucmFuZ2UJCQk9IFJBTkdFX1RIUkVBRCwKKwkJLmdldF9jb3VudAkJPSBtcGVyZl9nZXRfY291bnRfZnJlcSwKKwl9LAorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyB0c2NfYXRfbWVhc3VyZV9zdGFydDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgdHNjX2F0X21lYXN1cmVfZW5kOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbWF4X2ZyZXF1ZW5jeTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgKm1wZXJmX3ByZXZpb3VzX2NvdW50Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyAqYXBlcmZfcHJldmlvdXNfY291bnQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nICptcGVyZl9jdXJyZW50X2NvdW50Oworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyAqYXBlcmZfY3VycmVudF9jb3VudDsKKy8qIHZhbGlkIGZsYWcgZm9yIGFsbCBDUFVzLiBJZiBhIE1TUiByZWFkIGZhaWxlZCBpdCB3aWxsIGJlIHplcm8gKi8KK3N0YXRpYyBpbnQgKmlzX3ZhbGlkOworCitzdGF0aWMgaW50IG1wZXJmX2dldF90c2ModW5zaWduZWQgbG9uZyBsb25nICp0c2MpCit7CisJcmV0dXJuIHJlYWRfbXNyKDAsIE1TUl9UU0MsIHRzYyk7Cit9CisKK3N0YXRpYyBpbnQgbXBlcmZfaW5pdF9zdGF0cyh1bnNpZ25lZCBpbnQgY3B1KQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyB2YWw7CisJaW50IHJldDsKKworCXJldCA9IHJlYWRfbXNyKGNwdSwgTVNSX0FQRVJGLCAmdmFsKTsKKwlhcGVyZl9wcmV2aW91c19jb3VudFtjcHVdID0gdmFsOworCXJldCB8PSByZWFkX21zcihjcHUsIE1TUl9NUEVSRiwgJnZhbCk7CisJbXBlcmZfcHJldmlvdXNfY291bnRbY3B1XSA9IHZhbDsKKwlpc192YWxpZFtjcHVdID0gIXJldDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1wZXJmX21lYXN1cmVfc3RhdHModW5zaWduZWQgaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgdmFsOworCWludCByZXQ7CisKKwlyZXQgPSByZWFkX21zcihjcHUsIE1TUl9BUEVSRiwgJnZhbCk7CisJYXBlcmZfY3VycmVudF9jb3VudFtjcHVdID0gdmFsOworCXJldCB8PSByZWFkX21zcihjcHUsIE1TUl9NUEVSRiwgJnZhbCk7CisJbXBlcmZfY3VycmVudF9jb3VudFtjcHVdID0gdmFsOworCWlzX3ZhbGlkW2NwdV0gPSAhcmV0OworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBnZXRfYXZlcmFnZV9wZXJmKCkKKyAqCisgKiBSZXR1cm5zIHRoZSBhdmVyYWdlIHBlcmZvcm1hbmNlIChhbHNvIGNvbnNpZGVycyBib29zdGVkIGZyZXF1ZW5jaWVzKQorICoKKyAqIElucHV0OgorICogICBhcGVyZl9kaWZmOiBEaWZmZXJlbmNlIG9mIHRoZSBhcGVyZiByZWdpc3RlciBvdmVyIGEgdGltZSBwZXJpb2QKKyAqICAgbXBlcmZfZGlmZjogRGlmZmVyZW5jZSBvZiB0aGUgbXBlcmYgcmVnaXN0ZXIgb3ZlciB0aGUgc2FtZSB0aW1lIHBlcmlvZAorICogICBtYXhfZnJlcTogICBNYXhpbXVtIGZyZXF1ZW5jeSAoUDApCisgKgorICogUmV0dXJuczoKKyAqICAgQXZlcmFnZSBwZXJmb3JtYW5jZSBvdmVyIHRoZSB0aW1lIHBlcmlvZAorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfYXZlcmFnZV9wZXJmKHVuc2lnbmVkIGxvbmcgbG9uZyBhcGVyZl9kaWZmLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBtcGVyZl9kaWZmKQoreworCXVuc2lnbmVkIGludCBwZXJmX3BlcmNlbnQgPSAwOworCWlmICgoKHVuc2lnbmVkIGxvbmcpKC0xKSAvIDEwMCkgPCBhcGVyZl9kaWZmKSB7CisJCWludCBzaGlmdF9jb3VudCA9IDc7CisJCWFwZXJmX2RpZmYgPj49IHNoaWZ0X2NvdW50OworCQltcGVyZl9kaWZmID4+PSBzaGlmdF9jb3VudDsKKwl9CisJcGVyZl9wZXJjZW50ID0gKGFwZXJmX2RpZmYgKiAxMDApIC8gbXBlcmZfZGlmZjsKKwlyZXR1cm4gKG1heF9mcmVxdWVuY3kgKiBwZXJmX3BlcmNlbnQpIC8gMTAwOworfQorCitzdGF0aWMgaW50IG1wZXJmX2dldF9jb3VudF9wZXJjZW50KHVuc2lnbmVkIGludCBpZCwgZG91YmxlICpwZXJjZW50LAorCQkJCSAgIHVuc2lnbmVkIGludCBjcHUpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGFwZXJmX2RpZmYsIG1wZXJmX2RpZmYsIHRzY19kaWZmOworCisJaWYgKCFpc192YWxpZFtjcHVdKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoaWQgIT0gQzAgJiYgaWQgIT0gQ3gpCisJCXJldHVybiAtMTsKKworCW1wZXJmX2RpZmYgPSBtcGVyZl9jdXJyZW50X2NvdW50W2NwdV0gLSBtcGVyZl9wcmV2aW91c19jb3VudFtjcHVdOworCWFwZXJmX2RpZmYgPSBhcGVyZl9jdXJyZW50X2NvdW50W2NwdV0gLSBhcGVyZl9wcmV2aW91c19jb3VudFtjcHVdOworCXRzY19kaWZmID0gdHNjX2F0X21lYXN1cmVfZW5kIC0gdHNjX2F0X21lYXN1cmVfc3RhcnQ7CisKKwkqcGVyY2VudCA9IDEwMC4wICogbXBlcmZfZGlmZiAvIHRzY19kaWZmOworCWRwcmludCgiJXM6IG1wZXJmX2RpZmY6ICVsbHUsIHRzY19kaWZmOiAlbGx1XG4iLAorCSAgICAgICBtcGVyZl9jc3RhdGVzW2lkXS5uYW1lLCBtcGVyZl9kaWZmLCB0c2NfZGlmZik7CisKKwlpZiAoaWQgPT0gQ3gpCisJCSpwZXJjZW50ID0gMTAwLjAgLSAqcGVyY2VudDsKKworCWRwcmludCgiJXM6IHByZXZpb3VzOiAlbGx1IC0gY3VycmVudDogJWxsdSAtICgldSlcbiIsCisJCW1wZXJmX2NzdGF0ZXNbaWRdLm5hbWUsIG1wZXJmX2RpZmYsIGFwZXJmX2RpZmYsIGNwdSk7CisJZHByaW50KCIlczogJWZcbiIsIG1wZXJmX2NzdGF0ZXNbaWRdLm5hbWUsICpwZXJjZW50KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtcGVyZl9nZXRfY291bnRfZnJlcSh1bnNpZ25lZCBpbnQgaWQsIHVuc2lnbmVkIGxvbmcgbG9uZyAqY291bnQsCisJCQkJdW5zaWduZWQgaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgYXBlcmZfZGlmZiwgbXBlcmZfZGlmZjsKKworCWlmIChpZCAhPSBBVkdfRlJFUSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoIWlzX3ZhbGlkW2NwdV0pCisJCXJldHVybiAtMTsKKworCW1wZXJmX2RpZmYgPSBtcGVyZl9jdXJyZW50X2NvdW50W2NwdV0gLSBtcGVyZl9wcmV2aW91c19jb3VudFtjcHVdOworCWFwZXJmX2RpZmYgPSBhcGVyZl9jdXJyZW50X2NvdW50W2NwdV0gLSBhcGVyZl9wcmV2aW91c19jb3VudFtjcHVdOworCisJLyogUmV0dXJuIE1IeiBmb3Igbm93LCBtaWdodCB3YW50IHRvIHJldHVybiBLSHogaWYgY29sdW1uIHdpZHRoIGlzIG1vcmUKKwkgICBnZW5lcmljICovCisJKmNvdW50ID0gZ2V0X2F2ZXJhZ2VfcGVyZihhcGVyZl9kaWZmLCBtcGVyZl9kaWZmKSAvIDEwMDA7CisJZHByaW50KCIlczogJWxsdVxuIiwgbXBlcmZfY3N0YXRlc1tpZF0ubmFtZSwgKmNvdW50KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1wZXJmX3N0YXJ0KHZvaWQpCit7CisJaW50IGNwdTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZGJnOworCisJbXBlcmZfZ2V0X3RzYygmdHNjX2F0X21lYXN1cmVfc3RhcnQpOworCisJZm9yIChjcHUgPSAwOyBjcHUgPCBjcHVfY291bnQ7IGNwdSsrKQorCQltcGVyZl9pbml0X3N0YXRzKGNwdSk7CisKKwltcGVyZl9nZXRfdHNjKCZkYmcpOworCWRwcmludCgiVFNDIGRpZmY6ICVsbHVcbiIsIGRiZyAtIHRzY19hdF9tZWFzdXJlX3N0YXJ0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtcGVyZl9zdG9wKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGRiZzsKKwlpbnQgY3B1OworCisJbXBlcmZfZ2V0X3RzYygmdHNjX2F0X21lYXN1cmVfZW5kKTsKKworCWZvciAoY3B1ID0gMDsgY3B1IDwgY3B1X2NvdW50OyBjcHUrKykKKwkJbXBlcmZfbWVhc3VyZV9zdGF0cyhjcHUpOworCisJbXBlcmZfZ2V0X3RzYygmZGJnKTsKKwlkcHJpbnQoIlRTQyBkaWZmOiAlbGx1XG4iLCBkYmcgLSB0c2NfYXRfbWVhc3VyZV9lbmQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBjcHVpZGxlX21vbml0b3IgbXBlcmZfbW9uaXRvcjsKKworc3RydWN0IGNwdWlkbGVfbW9uaXRvciAqbXBlcmZfcmVnaXN0ZXIodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIG1pbjsKKworCWlmICghKGNwdXBvd2VyX2NwdV9pbmZvLmNhcHMgJiBDUFVQT1dFUl9DQVBfQVBFUkYpKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIEFzc3VtZSBtaW4vbWF4IGFsbCB0aGUgc2FtZSBvbiBhbGwgY29yZXMgKi8KKwlpZiAoY3B1ZnJlcV9nZXRfaGFyZHdhcmVfbGltaXRzKDAsICZtaW4sICZtYXhfZnJlcXVlbmN5KSkgeworCQlkcHJpbnQoIkNhbm5vdCByZXRyaWV2ZSBtYXggZnJlcSBmcm9tIGNwdWZyZXEga2VybmVsICIKKwkJICAgICAgICJzdWJzeXN0ZW1cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBGcmVlIHRoaXMgYXQgcHJvZ3JhbSB0ZXJtaW5hdGlvbiAqLworCWlzX3ZhbGlkID0gY2FsbG9jKGNwdV9jb3VudCwgc2l6ZW9mKGludCkpOworCW1wZXJmX3ByZXZpb3VzX2NvdW50ID0gY2FsbG9jKGNwdV9jb3VudCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZykpOworCWFwZXJmX3ByZXZpb3VzX2NvdW50ID0gY2FsbG9jKGNwdV9jb3VudCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZykpOworCW1wZXJmX2N1cnJlbnRfY291bnQgPSBjYWxsb2MoY3B1X2NvdW50LCBzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSk7CisJYXBlcmZfY3VycmVudF9jb3VudCA9IGNhbGxvYyhjcHVfY291bnQsIHNpemVvZih1bnNpZ25lZCBsb25nIGxvbmcpKTsKKworCW1wZXJmX21vbml0b3IubmFtZV9sZW4gPSBzdHJsZW4obXBlcmZfbW9uaXRvci5uYW1lKTsKKwlyZXR1cm4gJm1wZXJmX21vbml0b3I7Cit9CisKK3ZvaWQgbXBlcmZfdW5yZWdpc3Rlcih2b2lkKQoreworCWZyZWUobXBlcmZfcHJldmlvdXNfY291bnQpOworCWZyZWUoYXBlcmZfcHJldmlvdXNfY291bnQpOworCWZyZWUobXBlcmZfY3VycmVudF9jb3VudCk7CisJZnJlZShhcGVyZl9jdXJyZW50X2NvdW50KTsKKwlmcmVlKGlzX3ZhbGlkKTsKK30KKworc3RydWN0IGNwdWlkbGVfbW9uaXRvciBtcGVyZl9tb25pdG9yID0geworCS5uYW1lCQkJPSAiTXBlcmYiLAorCS5od19zdGF0ZXNfbnVtCQk9IE1QRVJGX0NTVEFURV9DT1VOVCwKKwkuaHdfc3RhdGVzCQk9IG1wZXJmX2NzdGF0ZXMsCisJLnN0YXJ0CQkJPSBtcGVyZl9zdGFydCwKKwkuc3RvcAkJCT0gbXBlcmZfc3RvcCwKKwkuZG9fcmVnaXN0ZXIJCT0gbXBlcmZfcmVnaXN0ZXIsCisJLnVucmVnaXN0ZXIJCT0gbXBlcmZfdW5yZWdpc3RlciwKKwkubmVlZHNfcm9vdAkJPSAxLAorCS5vdmVyZmxvd19zCQk9IDkyMjAwMDAwMCAvKiA5MjIzMzcyMDMgc2Vjb25kcyBUU0Mgb3ZlcmZsb3cKKwkJCQkJICAgICAgIGF0IDIwR0h6ICovCit9OworI2VuZGlmIC8qICNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pICovCmRpZmYgLS1naXQgYS90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9pZGxlX21vbml0b3IvbmhtX2lkbGUuYyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2lkbGVfbW9uaXRvci9uaG1faWRsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYTkxZGQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9pZGxlX21vbml0b3IvbmhtX2lkbGUuYwpAQCAtMCwwICsxLDIxNiBAQAorLyoKKyAqICAoQykgMjAxMCwyMDExICAgICAgIFRob21hcyBSZW5uaW5nZXIgPHRyZW5uQHN1c2UuZGU+LCBOb3ZlbGwgSW5jLgorICoKKyAqICBMaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgTGljZW5zZSB2ZXJzaW9uIDIuCisgKgorICogIEJhc2VkIG9uIExlbiBCcm93bidzIDxsZW5iQGtlcm5lbC5vcmc+IHR1cmJvc3RhdCB0b29sLgorICovCisKKyNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiaGVscGVycy9oZWxwZXJzLmgiCisjaW5jbHVkZSAiaWRsZV9tb25pdG9yL2NwdXBvd2VyLW1vbml0b3IuaCIKKworI2RlZmluZSBNU1JfUEtHX0MzX1JFU0lERU5DWQkweDNGOAorI2RlZmluZSBNU1JfUEtHX0M2X1JFU0lERU5DWQkweDNGOQorI2RlZmluZSBNU1JfQ09SRV9DM19SRVNJREVOQ1kJMHgzRkMKKyNkZWZpbmUgTVNSX0NPUkVfQzZfUkVTSURFTkNZCTB4M0ZECisKKyNkZWZpbmUgTVNSX1RTQwkweDEwCisKKyNkZWZpbmUgTkhNX0NTVEFURV9DT1VOVCA0CisKK2VudW0gaW50ZWxfbmhtX2lkIHsgQzMgPSAwLCBDNiwgUEMzLCBQQzYsIFRTQyA9IDB4RkZGRiB9OworCitzdGF0aWMgaW50IG5obV9nZXRfY291bnRfcGVyY2VudCh1bnNpZ25lZCBpbnQgc2VsZl9pZCwgZG91YmxlICpwZXJjZW50LAorCQkJCSB1bnNpZ25lZCBpbnQgY3B1KTsKKworc3RhdGljIGNzdGF0ZV90IG5obV9jc3RhdGVzW05ITV9DU1RBVEVfQ09VTlRdID0geworCXsKKwkJLm5hbWUJCQk9ICJDMyIsCisJCS5kZXNjCQkJPSBOXygiUHJvY2Vzc29yIENvcmUgQzMiKSwKKwkJLmlkCQkJPSBDMywKKwkJLnJhbmdlCQkJPSBSQU5HRV9DT1JFLAorCQkuZ2V0X2NvdW50X3BlcmNlbnQJPSBuaG1fZ2V0X2NvdW50X3BlcmNlbnQsCisJfSwKKwl7CisJCS5uYW1lCQkJPSAiQzYiLAorCQkuZGVzYwkJCT0gTl8oIlByb2Nlc3NvciBDb3JlIEM2IiksCisJCS5pZAkJCT0gQzYsCisJCS5yYW5nZQkJCT0gUkFOR0VfQ09SRSwKKwkJLmdldF9jb3VudF9wZXJjZW50CT0gbmhtX2dldF9jb3VudF9wZXJjZW50LAorCX0sCisKKwl7CisJCS5uYW1lCQkJPSAiUEMzIiwKKwkJLmRlc2MJCQk9IE5fKCJQcm9jZXNzb3IgUGFja2FnZSBDMyIpLAorCQkuaWQJCQk9IFBDMywKKwkJLnJhbmdlCQkJPSBSQU5HRV9QQUNLQUdFLAorCQkuZ2V0X2NvdW50X3BlcmNlbnQJPSBuaG1fZ2V0X2NvdW50X3BlcmNlbnQsCisJfSwKKwl7CisJCS5uYW1lCQkJPSAiUEM2IiwKKwkJLmRlc2MJCQk9IE5fKCJQcm9jZXNzb3IgUGFja2FnZSBDNiIpLAorCQkuaWQJCQk9IFBDNiwKKwkJLnJhbmdlCQkJPSBSQU5HRV9QQUNLQUdFLAorCQkuZ2V0X2NvdW50X3BlcmNlbnQJPSBuaG1fZ2V0X2NvdW50X3BlcmNlbnQsCisJfSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgdHNjX2F0X21lYXN1cmVfc3RhcnQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIHRzY19hdF9tZWFzdXJlX2VuZDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgKnByZXZpb3VzX2NvdW50W05ITV9DU1RBVEVfQ09VTlRdOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyAqY3VycmVudF9jb3VudFtOSE1fQ1NUQVRFX0NPVU5UXTsKKy8qIHZhbGlkIGZsYWcgZm9yIGFsbCBDUFVzLiBJZiBhIE1TUiByZWFkIGZhaWxlZCBpdCB3aWxsIGJlIHplcm8gKi8KK3N0YXRpYyBpbnQgKmlzX3ZhbGlkOworCitzdGF0aWMgaW50IG5obV9nZXRfY291bnQoZW51bSBpbnRlbF9uaG1faWQgaWQsIHVuc2lnbmVkIGxvbmcgbG9uZyAqdmFsLAorCQkJdW5zaWduZWQgaW50IGNwdSkKK3sKKwlpbnQgbXNyOworCisJc3dpdGNoIChpZCkgeworCWNhc2UgQzM6CisJCW1zciA9IE1TUl9DT1JFX0MzX1JFU0lERU5DWTsKKwkJYnJlYWs7CisJY2FzZSBDNjoKKwkJbXNyID0gTVNSX0NPUkVfQzZfUkVTSURFTkNZOworCQlicmVhazsKKwljYXNlIFBDMzoKKwkJbXNyID0gTVNSX1BLR19DM19SRVNJREVOQ1k7CisJCWJyZWFrOworCWNhc2UgUEM2OgorCQltc3IgPSBNU1JfUEtHX0M2X1JFU0lERU5DWTsKKwkJYnJlYWs7CisJY2FzZSBUU0M6CisJCW1zciA9IE1TUl9UU0M7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtMTsKKwl9OworCWlmIChyZWFkX21zcihjcHUsIG1zciwgdmFsKSkKKwkJcmV0dXJuIC0xOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmhtX2dldF9jb3VudF9wZXJjZW50KHVuc2lnbmVkIGludCBpZCwgZG91YmxlICpwZXJjZW50LAorCQkJCSB1bnNpZ25lZCBpbnQgY3B1KQoreworCSpwZXJjZW50ID0gMC4wOworCisJaWYgKCFpc192YWxpZFtjcHVdKQorCQlyZXR1cm4gLTE7CisKKwkqcGVyY2VudCA9ICgxMDAuMCAqCisJCShjdXJyZW50X2NvdW50W2lkXVtjcHVdIC0gcHJldmlvdXNfY291bnRbaWRdW2NwdV0pKSAvCisJCSh0c2NfYXRfbWVhc3VyZV9lbmQgLSB0c2NfYXRfbWVhc3VyZV9zdGFydCk7CisKKwlkcHJpbnQoIiVzOiBwcmV2aW91czogJWxsdSAtIGN1cnJlbnQ6ICVsbHUgLSAoJXUpXG4iLAorCQluaG1fY3N0YXRlc1tpZF0ubmFtZSwgcHJldmlvdXNfY291bnRbaWRdW2NwdV0sCisJCWN1cnJlbnRfY291bnRbaWRdW2NwdV0sIGNwdSk7CisKKwlkcHJpbnQoIiVzOiB0c2NfZGlmZjogJWxsdSAtIGNvdW50X2RpZmY6ICVsbHUgLSBwZXJjZW50OiAlMi5mICgldSlcbiIsCisJICAgICAgIG5obV9jc3RhdGVzW2lkXS5uYW1lLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSB0c2NfYXRfbWVhc3VyZV9lbmQgLSB0c2NfYXRfbWVhc3VyZV9zdGFydCwKKwkgICAgICAgY3VycmVudF9jb3VudFtpZF1bY3B1XSAtIHByZXZpb3VzX2NvdW50W2lkXVtjcHVdLAorCSAgICAgICAqcGVyY2VudCwgY3B1KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG5obV9zdGFydCh2b2lkKQoreworCWludCBudW0sIGNwdTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZGJnLCB2YWw7CisKKwluaG1fZ2V0X2NvdW50KFRTQywgJnRzY19hdF9tZWFzdXJlX3N0YXJ0LCAwKTsKKworCWZvciAobnVtID0gMDsgbnVtIDwgTkhNX0NTVEFURV9DT1VOVDsgbnVtKyspIHsKKwkJZm9yIChjcHUgPSAwOyBjcHUgPCBjcHVfY291bnQ7IGNwdSsrKSB7CisJCQlpc192YWxpZFtjcHVdID0gIW5obV9nZXRfY291bnQobnVtLCAmdmFsLCBjcHUpOworCQkJcHJldmlvdXNfY291bnRbbnVtXVtjcHVdID0gdmFsOworCQl9CisJfQorCW5obV9nZXRfY291bnQoVFNDLCAmZGJnLCAwKTsKKwlkcHJpbnQoIlRTQyBkaWZmOiAlbGx1XG4iLCBkYmcgLSB0c2NfYXRfbWVhc3VyZV9zdGFydCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbmhtX3N0b3Aodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgdmFsOworCXVuc2lnbmVkIGxvbmcgbG9uZyBkYmc7CisJaW50IG51bSwgY3B1OworCisJbmhtX2dldF9jb3VudChUU0MsICZ0c2NfYXRfbWVhc3VyZV9lbmQsIDApOworCisJZm9yIChudW0gPSAwOyBudW0gPCBOSE1fQ1NUQVRFX0NPVU5UOyBudW0rKykgeworCQlmb3IgKGNwdSA9IDA7IGNwdSA8IGNwdV9jb3VudDsgY3B1KyspIHsKKwkJCWlzX3ZhbGlkW2NwdV0gPSAhbmhtX2dldF9jb3VudChudW0sICZ2YWwsIGNwdSk7CisJCQljdXJyZW50X2NvdW50W251bV1bY3B1XSA9IHZhbDsKKwkJfQorCX0KKwluaG1fZ2V0X2NvdW50KFRTQywgJmRiZywgMCk7CisJZHByaW50KCJUU0MgZGlmZjogJWxsdVxuIiwgZGJnIC0gdHNjX2F0X21lYXN1cmVfZW5kKTsKKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgY3B1aWRsZV9tb25pdG9yIGludGVsX25obV9tb25pdG9yOworCitzdHJ1Y3QgY3B1aWRsZV9tb25pdG9yICppbnRlbF9uaG1fcmVnaXN0ZXIodm9pZCkKK3sKKwlpbnQgbnVtOworCisJaWYgKGNwdXBvd2VyX2NwdV9pbmZvLnZlbmRvciAhPSBYODZfVkVORE9SX0lOVEVMKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghKGNwdXBvd2VyX2NwdV9pbmZvLmNhcHMgJiBDUFVQT1dFUl9DQVBfSU5WX1RTQykpCisJCXJldHVybiBOVUxMOworCisJaWYgKCEoY3B1cG93ZXJfY3B1X2luZm8uY2FwcyAmIENQVVBPV0VSX0NBUF9BUEVSRikpCisJCXJldHVybiBOVUxMOworCisJLyogRnJlZSB0aGlzIGF0IHByb2dyYW0gdGVybWluYXRpb24gKi8KKwlpc192YWxpZCA9IGNhbGxvYyhjcHVfY291bnQsIHNpemVvZihpbnQpKTsKKwlmb3IgKG51bSA9IDA7IG51bSA8IE5ITV9DU1RBVEVfQ09VTlQ7IG51bSsrKSB7CisJCXByZXZpb3VzX2NvdW50W251bV0gPSBjYWxsb2MoY3B1X2NvdW50LAorCQkJCQlzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSk7CisJCWN1cnJlbnRfY291bnRbbnVtXSAgPSBjYWxsb2MoY3B1X2NvdW50LAorCQkJCQlzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSk7CisJfQorCisJaW50ZWxfbmhtX21vbml0b3IubmFtZV9sZW4gPSBzdHJsZW4oaW50ZWxfbmhtX21vbml0b3IubmFtZSk7CisJcmV0dXJuICZpbnRlbF9uaG1fbW9uaXRvcjsKK30KKwordm9pZCBpbnRlbF9uaG1fdW5yZWdpc3Rlcih2b2lkKQoreworCWludCBudW07CisKKwlmb3IgKG51bSA9IDA7IG51bSA8IE5ITV9DU1RBVEVfQ09VTlQ7IG51bSsrKSB7CisJCWZyZWUocHJldmlvdXNfY291bnRbbnVtXSk7CisJCWZyZWUoY3VycmVudF9jb3VudFtudW1dKTsKKwl9CisJZnJlZShpc192YWxpZCk7Cit9CisKK3N0cnVjdCBjcHVpZGxlX21vbml0b3IgaW50ZWxfbmhtX21vbml0b3IgPSB7CisJLm5hbWUJCQk9ICJOZWhhbGVtIiwKKwkuaHdfc3RhdGVzX251bQkJPSBOSE1fQ1NUQVRFX0NPVU5ULAorCS5od19zdGF0ZXMJCT0gbmhtX2NzdGF0ZXMsCisJLnN0YXJ0CQkJPSBuaG1fc3RhcnQsCisJLnN0b3AJCQk9IG5obV9zdG9wLAorCS5kb19yZWdpc3RlcgkJPSBpbnRlbF9uaG1fcmVnaXN0ZXIsCisJLnVucmVnaXN0ZXIJCT0gaW50ZWxfbmhtX3VucmVnaXN0ZXIsCisJLm5lZWRzX3Jvb3QJCT0gMSwKKwkub3ZlcmZsb3dfcwkJPSA5MjIwMDAwMDAgLyogOTIyMzM3MjAzIHNlY29uZHMgVFNDIG92ZXJmbG93CisJCQkJCSAgICAgICBhdCAyMEdIeiAqLworfTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvaWRsZV9tb25pdG9yL3NuYl9pZGxlLmMgYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy9pZGxlX21vbml0b3Ivc25iX2lkbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWJjMDdjZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Bvd2VyL2NwdXBvd2VyL3V0aWxzL2lkbGVfbW9uaXRvci9zbmJfaWRsZS5jCkBAIC0wLDAgKzEsMTkwIEBACisvKgorICogIChDKSAyMDEwLDIwMTEgICAgICAgVGhvbWFzIFJlbm5pbmdlciA8dHJlbm5Ac3VzZS5kZT4sIE5vdmVsbCBJbmMuCisgKgorICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCBMaWNlbnNlIHZlcnNpb24gMi4KKyAqCisgKiAgQmFzZWQgb24gTGVuIEJyb3duJ3MgPGxlbmJAa2VybmVsLm9yZz4gdHVyYm9zdGF0IHRvb2wuCisgKi8KKworI2lmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJoZWxwZXJzL2hlbHBlcnMuaCIKKyNpbmNsdWRlICJpZGxlX21vbml0b3IvY3B1cG93ZXItbW9uaXRvci5oIgorCisjZGVmaW5lIE1TUl9QS0dfQzJfUkVTSURFTkNZCTB4NjBECisjZGVmaW5lIE1TUl9QS0dfQzdfUkVTSURFTkNZCTB4M0ZBCisjZGVmaW5lIE1TUl9DT1JFX0M3X1JFU0lERU5DWQkweDNGRQorCisjZGVmaW5lIE1TUl9UU0MJMHgxMAorCitlbnVtIGludGVsX3NuYl9pZCB7IEM3ID0gMCwgUEMyLCBQQzcsIFNOQl9DU1RBVEVfQ09VTlQsIFRTQyA9IDB4RkZGRiB9OworCitzdGF0aWMgaW50IHNuYl9nZXRfY291bnRfcGVyY2VudCh1bnNpZ25lZCBpbnQgc2VsZl9pZCwgZG91YmxlICpwZXJjZW50LAorCQkJCSB1bnNpZ25lZCBpbnQgY3B1KTsKKworc3RhdGljIGNzdGF0ZV90IHNuYl9jc3RhdGVzW1NOQl9DU1RBVEVfQ09VTlRdID0geworCXsKKwkJLm5hbWUJCQk9ICJDNyIsCisJCS5kZXNjCQkJPSBOXygiUHJvY2Vzc29yIENvcmUgQzciKSwKKwkJLmlkCQkJPSBDNywKKwkJLnJhbmdlCQkJPSBSQU5HRV9DT1JFLAorCQkuZ2V0X2NvdW50X3BlcmNlbnQJPSBzbmJfZ2V0X2NvdW50X3BlcmNlbnQsCisJfSwKKwl7CisJCS5uYW1lCQkJPSAiUEMyIiwKKwkJLmRlc2MJCQk9IE5fKCJQcm9jZXNzb3IgUGFja2FnZSBDMiIpLAorCQkuaWQJCQk9IFBDMiwKKwkJLnJhbmdlCQkJPSBSQU5HRV9QQUNLQUdFLAorCQkuZ2V0X2NvdW50X3BlcmNlbnQJPSBzbmJfZ2V0X2NvdW50X3BlcmNlbnQsCisJfSwKKwl7CisJCS5uYW1lCQkJPSAiUEM3IiwKKwkJLmRlc2MJCQk9IE5fKCJQcm9jZXNzb3IgUGFja2FnZSBDNyIpLAorCQkuaWQJCQk9IFBDNywKKwkJLnJhbmdlCQkJPSBSQU5HRV9QQUNLQUdFLAorCQkuZ2V0X2NvdW50X3BlcmNlbnQJPSBzbmJfZ2V0X2NvdW50X3BlcmNlbnQsCisJfSwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgdHNjX2F0X21lYXN1cmVfc3RhcnQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIHRzY19hdF9tZWFzdXJlX2VuZDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgKnByZXZpb3VzX2NvdW50W1NOQl9DU1RBVEVfQ09VTlRdOworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyAqY3VycmVudF9jb3VudFtTTkJfQ1NUQVRFX0NPVU5UXTsKKy8qIHZhbGlkIGZsYWcgZm9yIGFsbCBDUFVzLiBJZiBhIE1TUiByZWFkIGZhaWxlZCBpdCB3aWxsIGJlIHplcm8gKi8KK3N0YXRpYyBpbnQgKmlzX3ZhbGlkOworCitzdGF0aWMgaW50IHNuYl9nZXRfY291bnQoZW51bSBpbnRlbF9zbmJfaWQgaWQsIHVuc2lnbmVkIGxvbmcgbG9uZyAqdmFsLAorCQkJdW5zaWduZWQgaW50IGNwdSkKK3sKKwlpbnQgbXNyOworCisJc3dpdGNoIChpZCkgeworCWNhc2UgQzc6CisJCW1zciA9IE1TUl9DT1JFX0M3X1JFU0lERU5DWTsKKwkJYnJlYWs7CisJY2FzZSBQQzI6CisJCW1zciA9IE1TUl9QS0dfQzJfUkVTSURFTkNZOworCQlicmVhazsKKwljYXNlIFBDNzoKKwkJbXNyID0gTVNSX1BLR19DN19SRVNJREVOQ1k7CisJCWJyZWFrOworCWNhc2UgVFNDOgorCQltc3IgPSBNU1JfVFNDOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJfTsKKwlpZiAocmVhZF9tc3IoY3B1LCBtc3IsIHZhbCkpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzbmJfZ2V0X2NvdW50X3BlcmNlbnQodW5zaWduZWQgaW50IGlkLCBkb3VibGUgKnBlcmNlbnQsCisJCQkJIHVuc2lnbmVkIGludCBjcHUpCit7CisJKnBlcmNlbnQgPSAwLjA7CisKKwlpZiAoIWlzX3ZhbGlkW2NwdV0pCisJCXJldHVybiAtMTsKKworCSpwZXJjZW50ID0gKDEwMC4wICoKKwkJKGN1cnJlbnRfY291bnRbaWRdW2NwdV0gLSBwcmV2aW91c19jb3VudFtpZF1bY3B1XSkpIC8KKwkJKHRzY19hdF9tZWFzdXJlX2VuZCAtIHRzY19hdF9tZWFzdXJlX3N0YXJ0KTsKKworCWRwcmludCgiJXM6IHByZXZpb3VzOiAlbGx1IC0gY3VycmVudDogJWxsdSAtICgldSlcbiIsCisJCXNuYl9jc3RhdGVzW2lkXS5uYW1lLCBwcmV2aW91c19jb3VudFtpZF1bY3B1XSwKKwkJY3VycmVudF9jb3VudFtpZF1bY3B1XSwgY3B1KTsKKworCWRwcmludCgiJXM6IHRzY19kaWZmOiAlbGx1IC0gY291bnRfZGlmZjogJWxsdSAtIHBlcmNlbnQ6ICUyLmYgKCV1KVxuIiwKKwkgICAgICAgc25iX2NzdGF0ZXNbaWRdLm5hbWUsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHRzY19hdF9tZWFzdXJlX2VuZCAtIHRzY19hdF9tZWFzdXJlX3N0YXJ0LAorCSAgICAgICBjdXJyZW50X2NvdW50W2lkXVtjcHVdIC0gcHJldmlvdXNfY291bnRbaWRdW2NwdV0sCisJICAgICAgICpwZXJjZW50LCBjcHUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25iX3N0YXJ0KHZvaWQpCit7CisJaW50IG51bSwgY3B1OworCXVuc2lnbmVkIGxvbmcgbG9uZyB2YWw7CisKKwlmb3IgKG51bSA9IDA7IG51bSA8IFNOQl9DU1RBVEVfQ09VTlQ7IG51bSsrKSB7CisJCWZvciAoY3B1ID0gMDsgY3B1IDwgY3B1X2NvdW50OyBjcHUrKykgeworCQkJc25iX2dldF9jb3VudChudW0sICZ2YWwsIGNwdSk7CisJCQlwcmV2aW91c19jb3VudFtudW1dW2NwdV0gPSB2YWw7CisJCX0KKwl9CisJc25iX2dldF9jb3VudChUU0MsICZ0c2NfYXRfbWVhc3VyZV9zdGFydCwgMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc25iX3N0b3Aodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgdmFsOworCWludCBudW0sIGNwdTsKKworCXNuYl9nZXRfY291bnQoVFNDLCAmdHNjX2F0X21lYXN1cmVfZW5kLCAwKTsKKworCWZvciAobnVtID0gMDsgbnVtIDwgU05CX0NTVEFURV9DT1VOVDsgbnVtKyspIHsKKwkJZm9yIChjcHUgPSAwOyBjcHUgPCBjcHVfY291bnQ7IGNwdSsrKSB7CisJCQlpc192YWxpZFtjcHVdID0gIXNuYl9nZXRfY291bnQobnVtLCAmdmFsLCBjcHUpOworCQkJY3VycmVudF9jb3VudFtudW1dW2NwdV0gPSB2YWw7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBjcHVpZGxlX21vbml0b3IgaW50ZWxfc25iX21vbml0b3I7CisKK3N0YXRpYyBzdHJ1Y3QgY3B1aWRsZV9tb25pdG9yICpzbmJfcmVnaXN0ZXIodm9pZCkKK3sKKwlpbnQgbnVtOworCisJaWYgKGNwdXBvd2VyX2NwdV9pbmZvLnZlbmRvciAhPSBYODZfVkVORE9SX0lOVEVMCisJICAgIHx8IGNwdXBvd2VyX2NwdV9pbmZvLmZhbWlseSAhPSA2KQorCQlyZXR1cm4gTlVMTDsKKworCWlmIChjcHVwb3dlcl9jcHVfaW5mby5tb2RlbCAhPSAweDJBCisJICAgICYmIGNwdXBvd2VyX2NwdV9pbmZvLm1vZGVsICE9IDB4MkQpCisJCXJldHVybiBOVUxMOworCisJaXNfdmFsaWQgPSBjYWxsb2MoY3B1X2NvdW50LCBzaXplb2YoaW50KSk7CisJZm9yIChudW0gPSAwOyBudW0gPCBTTkJfQ1NUQVRFX0NPVU5UOyBudW0rKykgeworCQlwcmV2aW91c19jb3VudFtudW1dID0gY2FsbG9jKGNwdV9jb3VudCwKKwkJCQkJc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZykpOworCQljdXJyZW50X2NvdW50W251bV0gID0gY2FsbG9jKGNwdV9jb3VudCwKKwkJCQkJc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZykpOworCX0KKwlpbnRlbF9zbmJfbW9uaXRvci5uYW1lX2xlbiA9IHN0cmxlbihpbnRlbF9zbmJfbW9uaXRvci5uYW1lKTsKKwlyZXR1cm4gJmludGVsX3NuYl9tb25pdG9yOworfQorCit2b2lkIHNuYl91bnJlZ2lzdGVyKHZvaWQpCit7CisJaW50IG51bTsKKwlmcmVlKGlzX3ZhbGlkKTsKKwlmb3IgKG51bSA9IDA7IG51bSA8IFNOQl9DU1RBVEVfQ09VTlQ7IG51bSsrKSB7CisJCWZyZWUocHJldmlvdXNfY291bnRbbnVtXSk7CisJCWZyZWUoY3VycmVudF9jb3VudFtudW1dKTsKKwl9Cit9CisKK3N0cnVjdCBjcHVpZGxlX21vbml0b3IgaW50ZWxfc25iX21vbml0b3IgPSB7CisJLm5hbWUJCQk9ICJTYW5keUJyaWRnZSIsCisJLmh3X3N0YXRlcwkJPSBzbmJfY3N0YXRlcywKKwkuaHdfc3RhdGVzX251bQkJPSBTTkJfQ1NUQVRFX0NPVU5ULAorCS5zdGFydAkJCT0gc25iX3N0YXJ0LAorCS5zdG9wCQkJPSBzbmJfc3RvcCwKKwkuZG9fcmVnaXN0ZXIJCT0gc25iX3JlZ2lzdGVyLAorCS51bnJlZ2lzdGVyCQk9IHNuYl91bnJlZ2lzdGVyLAorCS5uZWVkc19yb290CQk9IDEsCisJLm92ZXJmbG93X3MJCT0gOTIyMDAwMDAwIC8qIDkyMjMzNzIwMyBzZWNvbmRzIFRTQyBvdmVyZmxvdworCQkJCQkgICAgICAgYXQgMjBHSHogKi8KK307CisjZW5kaWYgLyogZGVmaW5lZChfX2kzODZfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvdmVyc2lvbi1nZW4uc2ggYi90b29scy9wb3dlci9jcHVwb3dlci91dGlscy92ZXJzaW9uLWdlbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZWM0MWM1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcG93ZXIvY3B1cG93ZXIvdXRpbHMvdmVyc2lvbi1nZW4uc2gKQEAgLTAsMCArMSwzNSBAQAorIyEvYmluL3NoCisjCisjIFNjcmlwdCB3aGljaCBwcmludHMgb3V0IHRoZSB2ZXJzaW9uIHRvIHVzZSBmb3IgYnVpbGRpbmcgY3B1cG93ZXJ1dGlscy4KKyMgTXVzdCBiZSBjYWxsZWQgZnJvbSB0b29scy9wb3dlci9jcHVwb3dlci8KKyMgCisjIEhlYXZpbHkgYmFzZWQgb24gdG9vbHMvcGVyZi91dGlsL1BFUkYtVkVSU0lPTi1HRU4gLgorCitMRj0nCisnCisKKyMgRmlyc3QgY2hlY2sgaWYgdGhlcmUgaXMgYSAuZ2l0IHRvIGdldCB0aGUgdmVyc2lvbiBmcm9tIGdpdCBkZXNjcmliZQorIyBvdGhlcndpc2UgdHJ5IHRvIGdldCB0aGUgdmVyc2lvbiBmcm9tIHRoZSBrZXJuZWwgbWFrZWZpbGUKK2lmIHRlc3QgLWQgLi4vLi4vLi4vLmdpdCAtbyAtZiAuLi8uLi8uLi8uZ2l0ICYmCisJVk49JChnaXQgZGVzY3JpYmUgLS1hYmJyZXY9NCBIRUFEIDI+L2Rldi9udWxsKSAmJgorCWNhc2UgIiRWTiIgaW4KKwkqJExGKikgKGV4aXQgMSkgOzsKKwl2WzAtOV0qKQorCQlnaXQgdXBkYXRlLWluZGV4IC1xIC0tcmVmcmVzaAorCQl0ZXN0IC16ICIkKGdpdCBkaWZmLWluZGV4IC0tbmFtZS1vbmx5IEhFQUQgLS0pIiB8fAorCQlWTj0iJFZOLWRpcnR5IiA7OworCWVzYWMKK3RoZW4KKwlWTj0kKGVjaG8gIiRWTiIgfCBzZWQgLWUgJ3MvLS8uL2cnKTsKK2Vsc2UKKwlldmFsICQoZ3JlcCAnXlZFUlNJT05bWzpzcGFjZTpdXSo9JyAuLi8uLi8uLi9NYWtlZmlsZXx0ciAtZCAnICcpCisJZXZhbCAkKGdyZXAgJ15QQVRDSExFVkVMW1s6c3BhY2U6XV0qPScgLi4vLi4vLi4vTWFrZWZpbGV8dHIgLWQgJyAnKQorCWV2YWwgJChncmVwICdeU1VCTEVWRUxbWzpzcGFjZTpdXSo9JyAuLi8uLi8uLi9NYWtlZmlsZXx0ciAtZCAnICcpCisJZXZhbCAkKGdyZXAgJ15FWFRSQVZFUlNJT05bWzpzcGFjZTpdXSo9JyAuLi8uLi8uLi9NYWtlZmlsZXx0ciAtZCAnICcpCisKKwlWTj0iJHtWRVJTSU9OfS4ke1BBVENITEVWRUx9LiR7U1VCTEVWRUx9JHtFWFRSQVZFUlNJT059IgorZmkKKworVk49JChleHByICIkVk4iIDogdionXCguKlwpJykKKworZWNobyAkVk4KZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL3g4Ni90dXJib3N0YXQvdHVyYm9zdGF0LmMgYi90b29scy9wb3dlci94ODYvdHVyYm9zdGF0L3R1cmJvc3RhdC5jCmluZGV4IDZkOGVmNGEuLjhiMmQzN2IgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Bvd2VyL3g4Ni90dXJib3N0YXQvdHVyYm9zdGF0LmMKKysrIGIvdG9vbHMvcG93ZXIveDg2L3R1cmJvc3RhdC90dXJib3N0YXQuYwpAQCAtMTI4LDM0ICsxMjgsMzQgQEAKIHZvaWQgcHJpbnRfaGVhZGVyKHZvaWQpCiB7CiAJaWYgKHNob3dfcGtnKQotCQlmcHJpbnRmKHN0ZGVyciwgInBrZyAiKTsKKwkJZnByaW50ZihzdGRlcnIsICJwayIpOwogCWlmIChzaG93X2NvcmUpCi0JCWZwcmludGYoc3RkZXJyLCAiY29yZSIpOworCQlmcHJpbnRmKHN0ZGVyciwgIiBjciIpOwogCWlmIChzaG93X2NwdSkKIAkJZnByaW50ZihzdGRlcnIsICIgQ1BVIik7CiAJaWYgKGRvX25obV9jc3RhdGVzKQotCQlmcHJpbnRmKHN0ZGVyciwgIiAgICUlYzAgIik7CisJCWZwcmludGYoc3RkZXJyLCAiICAgICUlYzAgIik7CiAJaWYgKGhhc19hcGVyZikKLQkJZnByaW50ZihzdGRlcnIsICIgIEdIeiIpOworCQlmcHJpbnRmKHN0ZGVyciwgIiBHSHoiKTsKIAlmcHJpbnRmKHN0ZGVyciwgIiAgVFNDIik7CiAJaWYgKGRvX25obV9jc3RhdGVzKQotCQlmcHJpbnRmKHN0ZGVyciwgIiAgICUlYzEgIik7CisJCWZwcmludGYoc3RkZXJyLCAiICAgICUlYzEiKTsKIAlpZiAoZG9fbmhtX2NzdGF0ZXMpCi0JCWZwcmludGYoc3RkZXJyLCAiICAgJSVjMyAiKTsKKwkJZnByaW50ZihzdGRlcnIsICIgICAgJSVjMyIpOwogCWlmIChkb19uaG1fY3N0YXRlcykKLQkJZnByaW50ZihzdGRlcnIsICIgICAlJWM2ICIpOworCQlmcHJpbnRmKHN0ZGVyciwgIiAgICAlJWM2Iik7CiAJaWYgKGRvX3NuYl9jc3RhdGVzKQotCQlmcHJpbnRmKHN0ZGVyciwgIiAgICUlYzcgIik7CisJCWZwcmludGYoc3RkZXJyLCAiICAgICUlYzciKTsKIAlpZiAoZG9fc25iX2NzdGF0ZXMpCi0JCWZwcmludGYoc3RkZXJyLCAiICAlJXBjMiAiKTsKKwkJZnByaW50ZihzdGRlcnIsICIgICUlcGMyIik7CiAJaWYgKGRvX25obV9jc3RhdGVzKQotCQlmcHJpbnRmKHN0ZGVyciwgIiAgJSVwYzMgIik7CisJCWZwcmludGYoc3RkZXJyLCAiICAlJXBjMyIpOwogCWlmIChkb19uaG1fY3N0YXRlcykKLQkJZnByaW50ZihzdGRlcnIsICIgICUlcGM2ICIpOworCQlmcHJpbnRmKHN0ZGVyciwgIiAgJSVwYzYiKTsKIAlpZiAoZG9fc25iX2NzdGF0ZXMpCi0JCWZwcmludGYoc3RkZXJyLCAiICAlJXBjNyAiKTsKKwkJZnByaW50ZihzdGRlcnIsICIgICUlcGM3Iik7CiAJaWYgKGV4dHJhX21zcl9vZmZzZXQpCi0JCWZwcmludGYoc3RkZXJyLCAiICAgICAgIE1TUiAweCV4ICIsIGV4dHJhX21zcl9vZmZzZXQpOworCQlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgTVNSIDB4JXggIiwgZXh0cmFfbXNyX29mZnNldCk7CiAKIAlwdXRjKCdcbicsIHN0ZGVycik7CiB9CkBAIC0xOTQsMTQgKzE5NCwxNCBAQAogCS8qIHRvcG9sb2d5IGNvbHVtbnMsIHByaW50IGJsYW5rcyBvbiAxc3QgKGF2ZXJhZ2UpIGxpbmUgKi8KIAlpZiAocCA9PSBjbnRfYXZlcmFnZSkgewogCQlpZiAoc2hvd19wa2cpCi0JCQlmcHJpbnRmKHN0ZGVyciwgIiAgICAiKTsKKwkJCWZwcmludGYoc3RkZXJyLCAiICIpOwogCQlpZiAoc2hvd19jb3JlKQogCQkJZnByaW50ZihzdGRlcnIsICIgICAgIik7CiAJCWlmIChzaG93X2NwdSkKIAkJCWZwcmludGYoc3RkZXJyLCAiICAgICIpOwogCX0gZWxzZSB7CiAJCWlmIChzaG93X3BrZykKLQkJCWZwcmludGYoc3RkZXJyLCAiJTRkIiwgcC0+cGtnKTsKKwkJCWZwcmludGYoc3RkZXJyLCAiJWQiLCBwLT5wa2cpOwogCQlpZiAoc2hvd19jb3JlKQogCQkJZnByaW50ZihzdGRlcnIsICIlNGQiLCBwLT5jb3JlKTsKIAkJaWYgKHNob3dfY3B1KQpAQCAtMjQxLDIyICsyNDEsMjIgQEAKIAkJaWYgKCFza2lwX2MxKQogCQkJZnByaW50ZihzdGRlcnIsICIlNy4yZiIsIDEwMC4wICogcC0+YzEvcC0+dHNjKTsKIAkJZWxzZQotCQkJZnByaW50ZihzdGRlcnIsICIgICAqKioqIik7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiAgKioqKiIpOwogCX0KIAlpZiAoZG9fbmhtX2NzdGF0ZXMpCi0JCWZwcmludGYoc3RkZXJyLCAiJTcuMmYiLCAxMDAuMCAqIHAtPmMzL3AtPnRzYyk7CisJCWZwcmludGYoc3RkZXJyLCAiICU2LjJmIiwgMTAwLjAgKiBwLT5jMy9wLT50c2MpOwogCWlmIChkb19uaG1fY3N0YXRlcykKLQkJZnByaW50ZihzdGRlcnIsICIlNy4yZiIsIDEwMC4wICogcC0+YzYvcC0+dHNjKTsKKwkJZnByaW50ZihzdGRlcnIsICIgJTYuMmYiLCAxMDAuMCAqIHAtPmM2L3AtPnRzYyk7CiAJaWYgKGRvX3NuYl9jc3RhdGVzKQotCQlmcHJpbnRmKHN0ZGVyciwgIiU3LjJmIiwgMTAwLjAgKiBwLT5jNy9wLT50c2MpOworCQlmcHJpbnRmKHN0ZGVyciwgIiAlNi4yZiIsIDEwMC4wICogcC0+YzcvcC0+dHNjKTsKIAlpZiAoZG9fc25iX2NzdGF0ZXMpCi0JCWZwcmludGYoc3RkZXJyLCAiJTcuMmYiLCAxMDAuMCAqIHAtPnBjMi9wLT50c2MpOworCQlmcHJpbnRmKHN0ZGVyciwgIiAlNS4yZiIsIDEwMC4wICogcC0+cGMyL3AtPnRzYyk7CiAJaWYgKGRvX25obV9jc3RhdGVzKQotCQlmcHJpbnRmKHN0ZGVyciwgIiU3LjJmIiwgMTAwLjAgKiBwLT5wYzMvcC0+dHNjKTsKKwkJZnByaW50ZihzdGRlcnIsICIgJTUuMmYiLCAxMDAuMCAqIHAtPnBjMy9wLT50c2MpOwogCWlmIChkb19uaG1fY3N0YXRlcykKLQkJZnByaW50ZihzdGRlcnIsICIlNy4yZiIsIDEwMC4wICogcC0+cGM2L3AtPnRzYyk7CisJCWZwcmludGYoc3RkZXJyLCAiICU1LjJmIiwgMTAwLjAgKiBwLT5wYzYvcC0+dHNjKTsKIAlpZiAoZG9fc25iX2NzdGF0ZXMpCi0JCWZwcmludGYoc3RkZXJyLCAiJTcuMmYiLCAxMDAuMCAqIHAtPnBjNy9wLT50c2MpOworCQlmcHJpbnRmKHN0ZGVyciwgIiAlNS4yZiIsIDEwMC4wICogcC0+cGM3L3AtPnRzYyk7CiAJaWYgKGV4dHJhX21zcl9vZmZzZXQpCiAJCWZwcmludGYoc3RkZXJyLCAiICAweCUwMTZsbHgiLCBwLT5leHRyYV9tc3IpOwogCXB1dGMoJ1xuJywgc3RkZXJyKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Bvd2VyL3g4Ni94ODZfZW5lcmd5X3BlcmZfcG9saWN5L3g4Nl9lbmVyZ3lfcGVyZl9wb2xpY3kuYyBiL3Rvb2xzL3Bvd2VyL3g4Ni94ODZfZW5lcmd5X3BlcmZfcG9saWN5L3g4Nl9lbmVyZ3lfcGVyZl9wb2xpY3kuYwppbmRleCAyNjE4ZWYyLi4zM2M1YzdlIDEwMDY0NAotLS0gYS90b29scy9wb3dlci94ODYveDg2X2VuZXJneV9wZXJmX3BvbGljeS94ODZfZW5lcmd5X3BlcmZfcG9saWN5LmMKKysrIGIvdG9vbHMvcG93ZXIveDg2L3g4Nl9lbmVyZ3lfcGVyZl9wb2xpY3kveDg2X2VuZXJneV9wZXJmX3BvbGljeS5jCkBAIC0xMzcsNyArMTM3LDYgQEAKIHZvaWQgdmFsaWRhdGVfY3B1aWQodm9pZCkKIHsKIAl1bnNpZ25lZCBpbnQgZWF4LCBlYngsIGVjeCwgZWR4LCBtYXhfbGV2ZWw7Ci0JY2hhciBicmFuZFsxNl07CiAJdW5zaWduZWQgaW50IGZtcywgZmFtaWx5LCBtb2RlbCwgc3RlcHBpbmc7CiAKIAllYXggPSBlYnggPSBlY3ggPSBlZHggPSAwOwpAQCAtMTYwLDggKzE1OSw4IEBACiAJCW1vZGVsICs9ICgoZm1zID4+IDE2KSAmIDB4ZikgPDwgNDsKIAogCWlmICh2ZXJib3NlID4gMSkKLQkJcHJpbnRmKCJDUFVJRCAlcyAlZCBsZXZlbHMgZmFtaWx5Om1vZGVsOnN0ZXBwaW5nICIKLQkJCSIweCV4OiV4OiV4ICglZDolZDolZClcbiIsIGJyYW5kLCBtYXhfbGV2ZWwsCisJCXByaW50ZigiQ1BVSUQgJWQgbGV2ZWxzIGZhbWlseTptb2RlbDpzdGVwcGluZyAiCisJCQkiMHgleDoleDoleCAoJWQ6JWQ6JWQpXG4iLCBtYXhfbGV2ZWwsCiAJCQlmYW1pbHksIG1vZGVsLCBzdGVwcGluZywgZmFtaWx5LCBtb2RlbCwgc3RlcHBpbmcpOwogCiAJaWYgKCEoZWR4ICYgKDEgPDwgNSkpKSB7CmRpZmYgLS1naXQgYS90b29scy9zbHViL3NsYWJpbmZvLmMgYi90b29scy9zbHViL3NsYWJpbmZvLmMKaW5kZXggNTE2NTUxYy4uODY4Y2M5MyAxMDA2NDQKLS0tIGEvdG9vbHMvc2x1Yi9zbGFiaW5mby5jCisrKyBiL3Rvb2xzL3NsdWIvc2xhYmluZm8uYwpAQCAtMiw4ICsyLDkgQEAKICAqIFNsYWJpbmZvOiBUb29sIHRvIGdldCByZXBvcnRzIGFib3V0IHNsYWJzCiAgKgogICogKEMpIDIwMDcgc2dpLCBDaHJpc3RvcGggTGFtZXRlcgorICogKEMpIDIwMTEgTGludXggRm91bmRhdGlvbiwgQ2hyaXN0b3BoIExhbWV0ZXIKICAqCi0gKiBDb21waWxlIGJ5OgorICogQ29tcGlsZSB3aXRoOgogICoKICAqIGdjYyAtbyBzbGFiaW5mbyBzbGFiaW5mby5jCiAgKi8KQEAgLTM5LDYgKzQwLDggQEAKIAl1bnNpZ25lZCBsb25nIGNwdXNsYWJfZmx1c2gsIGRlYWN0aXZhdGVfZnVsbCwgZGVhY3RpdmF0ZV9lbXB0eTsKIAl1bnNpZ25lZCBsb25nIGRlYWN0aXZhdGVfdG9faGVhZCwgZGVhY3RpdmF0ZV90b190YWlsOwogCXVuc2lnbmVkIGxvbmcgZGVhY3RpdmF0ZV9yZW1vdGVfZnJlZXMsIG9yZGVyX2ZhbGxiYWNrOworCXVuc2lnbmVkIGxvbmcgY21weGNoZ19kb3VibGVfY3B1X2ZhaWwsIGNtcHhjaGdfZG91YmxlX2ZhaWw7CisJdW5zaWduZWQgbG9uZyBhbGxvY19ub2RlX21pc21hdGNoLCBkZWFjdGl2YXRlX2J5cGFzczsKIAlpbnQgbnVtYVtNQVhfTk9ERVNdOwogCWludCBudW1hX3BhcnRpYWxbTUFYX05PREVTXTsKIH0gc2xhYmluZm9bTUFYX1NMQUJTXTsKQEAgLTk5LDcgKzEwMiw3IEBACiAKIHN0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCiB7Ci0JcHJpbnRmKCJzbGFiaW5mbyA1LzcvMjAwNy4gKGMpIDIwMDcgc2dpLlxuXG4iCisJcHJpbnRmKCJzbGFiaW5mbyA0LzE1LzIwMTEuIChjKSAyMDA3IHNnaS8oYykgMjAxMSBMaW51eCBGb3VuZGF0aW9uLlxuXG4iCiAJCSJzbGFiaW5mbyBbLWFobnB2dHN6XSBbLWQgZGVidWdvcHRzXSBbc2xhYi1yZWdleHBdXG4iCiAJCSItYXwtLWFsaWFzZXMgICAgICAgICAgIFNob3cgYWxpYXNlc1xuIgogCQkiLUF8LS1hY3Rpdml0eSAgICAgICAgICBNb3N0IGFjdGl2ZSBzbGFicyBmaXJzdFxuIgpAQCAtMjkzLDcgKzI5Niw3IEBACiBzdGF0aWMgdm9pZCBmaXJzdF9saW5lKHZvaWQpCiB7CiAJaWYgKHNob3dfYWN0aXZpdHkpCi0JCXByaW50ZigiTmFtZSAgICAgICAgICAgICAgICAgICBPYmplY3RzICAgICAgQWxsb2MgICAgICAgRnJlZSAgICUlRmFzdCBGYWxsYiBPXG4iKTsKKwkJcHJpbnRmKCJOYW1lICAgICAgICAgICAgICAgICAgIE9iamVjdHMgICAgICBBbGxvYyAgICAgICBGcmVlICAgJSVGYXN0IEZhbGxiIE8gQ21wWCAgIFVMXG4iKTsKIAllbHNlCiAJCXByaW50ZigiTmFtZSAgICAgICAgICAgICAgICAgICBPYmplY3RzIE9ianNpemUgICAgU3BhY2UgIgogCQkJIlNsYWJzL1BhcnQvQ3B1ICBPL1MgTyAlJUZyICUlRWYgRmxnXG4iKTsKQEAgLTM3OSwxNCArMzgyLDE0IEBACiAJcHJpbnRmKCJcbiVzOiBLZXJuZWwgb2JqZWN0IGFsbG9jYXRpb25cbiIsIHMtPm5hbWUpOwogCXByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogCWlmIChyZWFkX3NsYWJfb2JqKHMsICJhbGxvY19jYWxscyIpKQotCQlwcmludGYoYnVmZmVyKTsKKwkJcHJpbnRmKCIlcyIsIGJ1ZmZlcik7CiAJZWxzZQogCQlwcmludGYoIk5vIERhdGFcbiIpOwogCiAJcHJpbnRmKCJcbiVzOiBLZXJuZWwgb2JqZWN0IGZyZWVpbmdcbiIsIHMtPm5hbWUpOwogCXByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAlpZiAocmVhZF9zbGFiX29iaihzLCAiZnJlZV9jYWxscyIpKQotCQlwcmludGYoYnVmZmVyKTsKKwkJcHJpbnRmKCIlcyIsIGJ1ZmZlcik7CiAJZWxzZQogCQlwcmludGYoIk5vIERhdGFcbiIpOwogCkBAIC00MDAsNyArNDAzLDcgQEAKIAlpZiAocmVhZF9zbGFiX29iaihzLCAib3BzIikpIHsKIAkJcHJpbnRmKCJcbiVzOiBrbWVtX2NhY2hlIG9wZXJhdGlvbnNcbiIsIHMtPm5hbWUpOwogCQlwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLQkJcHJpbnRmKGJ1ZmZlcik7CisJCXByaW50ZigiJXMiLCBidWZmZXIpOwogCX0gZWxzZQogCQlwcmludGYoIlxuJXMgaGFzIG5vIGttZW1fY2FjaGUgb3BlcmF0aW9uc1xuIiwgcy0+bmFtZSk7CiB9CkBAIC00NjIsMTkgKzQ2NSwzMiBAQAogCWlmIChzLT5jcHVzbGFiX2ZsdXNoKQogCQlwcmludGYoIkZsdXNoZXMgJThsdVxuIiwgcy0+Y3B1c2xhYl9mbHVzaCk7CiAKLQlpZiAocy0+YWxsb2NfcmVmaWxsKQotCQlwcmludGYoIlJlZmlsbCAlOGx1XG4iLCBzLT5hbGxvY19yZWZpbGwpOwotCiAJdG90YWwgPSBzLT5kZWFjdGl2YXRlX2Z1bGwgKyBzLT5kZWFjdGl2YXRlX2VtcHR5ICsKLQkJCXMtPmRlYWN0aXZhdGVfdG9faGVhZCArIHMtPmRlYWN0aXZhdGVfdG9fdGFpbDsKKwkJCXMtPmRlYWN0aXZhdGVfdG9faGVhZCArIHMtPmRlYWN0aXZhdGVfdG9fdGFpbCArIHMtPmRlYWN0aXZhdGVfYnlwYXNzOwogCi0JaWYgKHRvdGFsKQotCQlwcmludGYoIkRlYWN0aXZhdGUgRnVsbD0lbHUoJWx1JSUpIEVtcHR5PSVsdSglbHUlJSkgIgotCQkJIlRvSGVhZD0lbHUoJWx1JSUpIFRvVGFpbD0lbHUoJWx1JSUpXG4iLAotCQkJcy0+ZGVhY3RpdmF0ZV9mdWxsLCAocy0+ZGVhY3RpdmF0ZV9mdWxsICogMTAwKSAvIHRvdGFsLAotCQkJcy0+ZGVhY3RpdmF0ZV9lbXB0eSwgKHMtPmRlYWN0aXZhdGVfZW1wdHkgKiAxMDApIC8gdG90YWwsCi0JCQlzLT5kZWFjdGl2YXRlX3RvX2hlYWQsIChzLT5kZWFjdGl2YXRlX3RvX2hlYWQgKiAxMDApIC8gdG90YWwsCisJaWYgKHRvdGFsKSB7CisJCXByaW50ZigiXG5TbGFiIERlYWN0aXZhdGlvbiAgICAgICAgICAgICBPY3VycmVuY2VzICAlJVxuIik7CisJCXByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJCXByaW50ZigiU2xhYiBmdWxsICAgICAgICAgICAgICAgICAgICAgJTdsdSAgJTNsdSUlXG4iLAorCQkJcy0+ZGVhY3RpdmF0ZV9mdWxsLCAocy0+ZGVhY3RpdmF0ZV9mdWxsICogMTAwKSAvIHRvdGFsKTsKKwkJcHJpbnRmKCJTbGFiIGVtcHR5ICAgICAgICAgICAgICAgICAgICAlN2x1ICAlM2x1JSVcbiIsCisJCQlzLT5kZWFjdGl2YXRlX2VtcHR5LCAocy0+ZGVhY3RpdmF0ZV9lbXB0eSAqIDEwMCkgLyB0b3RhbCk7CisJCXByaW50ZigiTW92ZWQgdG8gaGVhZCBvZiBwYXJ0aWFsIGxpc3QgJTdsdSAgJTNsdSUlXG4iLAorCQkJcy0+ZGVhY3RpdmF0ZV90b19oZWFkLCAocy0+ZGVhY3RpdmF0ZV90b19oZWFkICogMTAwKSAvIHRvdGFsKTsKKwkJcHJpbnRmKCJNb3ZlZCB0byB0YWlsIG9mIHBhcnRpYWwgbGlzdCAlN2x1ICAlM2x1JSVcbiIsCiAJCQlzLT5kZWFjdGl2YXRlX3RvX3RhaWwsIChzLT5kZWFjdGl2YXRlX3RvX3RhaWwgKiAxMDApIC8gdG90YWwpOworCQlwcmludGYoIkRlYWN0aXZhdGlvbiBieXBhc3MgICAgICAgICAgICU3bHUgICUzbHUlJVxuIiwKKwkJCXMtPmRlYWN0aXZhdGVfYnlwYXNzLCAocy0+ZGVhY3RpdmF0ZV9ieXBhc3MgKiAxMDApIC8gdG90YWwpOworCQlwcmludGYoIlJlZmlsbGVkIGZyb20gZm9yZWlnbiBmcmVlcyAgICU3bHUgICUzbHUlJVxuIiwKKwkJCXMtPmFsbG9jX3JlZmlsbCwgKHMtPmFsbG9jX3JlZmlsbCAqIDEwMCkgLyB0b3RhbCk7CisJCXByaW50ZigiTm9kZSBtaXNtYXRjaCAgICAgICAgICAgICAgICAgJTdsdSAgJTNsdSUlXG4iLAorCQkJcy0+YWxsb2Nfbm9kZV9taXNtYXRjaCwgKHMtPmFsbG9jX25vZGVfbWlzbWF0Y2ggKiAxMDApIC8gdG90YWwpOworCX0KKworCWlmIChzLT5jbXB4Y2hnX2RvdWJsZV9mYWlsIHx8IHMtPmNtcHhjaGdfZG91YmxlX2NwdV9mYWlsKQorCQlwcmludGYoIlxuQ21weGNoZ19kb3VibGUgTG9vcGluZ1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwkJcHJpbnRmKCJMb2NrZWQgQ21weGNoZyBEb3VibGUgcmVkb3MgICAlbHVcblVubG9ja2VkIENtcHhjaGcgRG91YmxlIHJlZG9zICVsdVxuIiwKKwkJCXMtPmNtcHhjaGdfZG91YmxlX2ZhaWwsIHMtPmNtcHhjaGdfZG91YmxlX2NwdV9mYWlsKTsKIH0KIAogc3RhdGljIHZvaWQgcmVwb3J0KHN0cnVjdCBzbGFiaW5mbyAqcykKQEAgLTU3MywxMiArNTg5LDEzIEBACiAJCXRvdGFsX2FsbG9jID0gcy0+YWxsb2NfZmFzdHBhdGggKyBzLT5hbGxvY19zbG93cGF0aDsKIAkJdG90YWxfZnJlZSA9IHMtPmZyZWVfZmFzdHBhdGggKyBzLT5mcmVlX3Nsb3dwYXRoOwogCi0JCXByaW50ZigiJS0yMXMgJThsZCAlMTBsZCAlMTBsZCAlM2xkICUzbGQgJTVsZCAlMWRcbiIsCisJCXByaW50ZigiJS0yMXMgJThsZCAlMTBsZCAlMTBsZCAlM2xkICUzbGQgJTVsZCAlMWQgJTRsZCAlNGxkXG4iLAogCQkJcy0+bmFtZSwgcy0+b2JqZWN0cywKIAkJCXRvdGFsX2FsbG9jLCB0b3RhbF9mcmVlLAogCQkJdG90YWxfYWxsb2MgPyAocy0+YWxsb2NfZmFzdHBhdGggKiAxMDAgLyB0b3RhbF9hbGxvYykgOiAwLAogCQkJdG90YWxfZnJlZSA/IChzLT5mcmVlX2Zhc3RwYXRoICogMTAwIC8gdG90YWxfZnJlZSkgOiAwLAotCQkJcy0+b3JkZXJfZmFsbGJhY2ssIHMtPm9yZGVyKTsKKwkJCXMtPm9yZGVyX2ZhbGxiYWNrLCBzLT5vcmRlciwgcy0+Y21weGNoZ19kb3VibGVfZmFpbCwKKwkJCXMtPmNtcHhjaGdfZG91YmxlX2NwdV9mYWlsKTsKIAl9CiAJZWxzZQogCQlwcmludGYoIiUtMjFzICU4bGQgJTdkICU4cyAlMTRzICU0ZCAlMWQgJTNsZCAlM2xkICVzXG4iLApAQCAtMTE5MCw2ICsxMjA3LDEwIEBACiAJCQlzbGFiLT5kZWFjdGl2YXRlX3RvX3RhaWwgPSBnZXRfb2JqKCJkZWFjdGl2YXRlX3RvX3RhaWwiKTsKIAkJCXNsYWItPmRlYWN0aXZhdGVfcmVtb3RlX2ZyZWVzID0gZ2V0X29iaigiZGVhY3RpdmF0ZV9yZW1vdGVfZnJlZXMiKTsKIAkJCXNsYWItPm9yZGVyX2ZhbGxiYWNrID0gZ2V0X29iaigib3JkZXJfZmFsbGJhY2siKTsKKwkJCXNsYWItPmNtcHhjaGdfZG91YmxlX2NwdV9mYWlsID0gZ2V0X29iaigiY21weGNoZ19kb3VibGVfY3B1X2ZhaWwiKTsKKwkJCXNsYWItPmNtcHhjaGdfZG91YmxlX2ZhaWwgPSBnZXRfb2JqKCJjbXB4Y2hnX2RvdWJsZV9mYWlsIik7CisJCQlzbGFiLT5hbGxvY19ub2RlX21pc21hdGNoID0gZ2V0X29iaigiYWxsb2Nfbm9kZV9taXNtYXRjaCIpOworCQkJc2xhYi0+ZGVhY3RpdmF0ZV9ieXBhc3MgPSBnZXRfb2JqKCJkZWFjdGl2YXRlX2J5cGFzcyIpOwogCQkJY2hkaXIoIi4uIik7CiAJCQlpZiAoc2xhYi0+bmFtZVswXSA9PSAnOicpCiAJCQkJYWxpYXNfdGFyZ2V0cysrOwo=